Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch pi4-gpio-clean Excluding Merge-Ins
This is equivalent to a diff from bd10d4dde2 to 41daa2863b
2021-11-16
| ||
02:34 | Merged udevadm fix in Closed-Leaf check-in: 41daa2863b user: tangent tags: pi4-gpio-clean | |
02:34 | Calling udevadm from the "make install-system" target via a relative path since the upstream OSes keep moving it about. It's been found in /sbin, /bin and /usr/bin! check-in: 870c65f831 user: tangent tags: trunk | |
2021-07-12
| ||
12:35 | Merged trunk changes in check-in: a9eb4a4733 user: tangent tags: pi4-gpio-clean | |
2019-08-17
| ||
23:15 | Merged the use of libbcm_host from trunk with Oscar's new GPIO pull up/down setup code to get the best of both worlds. This requires a version of libbcm_host that was only just released: https://github.com/raspberrypi/firmware/issues/1161 check-in: 1eee471981 user: tangent tags: pi4-gpio-clean | |
2019-08-15
| ||
00:22 | Added support for Pi 4 GPIO, based on code the Raspberry Pi Foundation published: https://github.com/RPi-Distro/raspi-gpio/commit/80fa7d04eafb3ea34fc6f2d32de5f1873b5fb369 This check-in is based on a version of gpio-common.c.in posted to the PiDP-8 Google Group by Oscar Vermeulen, which is why we're giving him credit for this check-in, even though I (tangent) have done quite a lot of changes to that code, mainly to match the existing code style. This is a branch because it conflicts with the current tip-of-trunk and because it's not yet tested on a Pi 4. It is unknown whether this branch will end up overriding the method we're using on trunk for Pi 0-3 or if we will instead wait for the Foundation to publish a new libbcm_host that obviates some of what this check-in does. Closed-Leaf check-in: bd10d4dde2 user: vermeulen.oscar tags: pi4-gpio-hack | |
2019-08-14
| ||
23:43 | Create new branch named "pi4-gpio-hack" check-in: 9a444fb597 user: tangent tags: pi4-gpio-hack | |
|
| < < |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | *.mk bin/*.pt bin/*.rk05 bin/*.save bin/*.tu56 bin/cc8 bin/d8tape bin/os8-cp bin/os8-run bin/os8pkg bin/palbart bin/pdp8 bin/pidp8i bin/pidp8i-sim bin/pidp8i-test bin/ptp2txt bin/teco-pi-demo bin/txt2ptp boot/?.script boot/ac-mq-blinker.script boot/add.script boot/asr33-rim-loader.script boot/bit-rotate.script boot/common.script boot/hello.script boot/hs-rim-loader.script boot/pep001.script boot/run-v3f.script boot/run.script boot/tss8.script config.log etc/*.service etc/sudoers lib/*.py lib/*__pycache__/*.pyc libexec/scanswitch logfile.txt Makefile */Makefile media/os8/3finit.tx media/os8/init.tx media/os8/ock-init.tx obj/* src/config.h src/os8/v3f/logfile.txt src/pidp8i/gpio-common.c src/pidp8i/main.c tools/simh-update |
1 2 3 4 5 6 7 | examples/*.fc src/*.[ch] src/*.in src/cc8/*/*.[ch] src/cc8/include/* | > > > > > > > > | | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | examples/*.fc hardware/pidp8i/*.cmp hardware/pidp8i/*.dsn hardware/pidp8i/*.kicad_pcb hardware/pidp8i/*.lib hardware/pidp8i/*.mod hardware/pidp8i/*.pro hardware/pidp8i/*.sch src/*.[ch] src/*.in src/cc8/*/*.[ch] src/cc8/include/* src/cc8/os8/*.[ch] src/cc8/os8/*.bi src/cc8/os8/*.sb src/PDP8/pdp8_*.[ch] src/PDP8/pidp8i.c.in |
1 2 | doc/simh/*.pdf test/* | > | 1 2 3 | autosetup/Makefile doc/simh/*.pdf test/* |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | name: ci on: [push, pull_request] jobs: build: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macos-latest] steps: - uses: actions/checkout@v2 - name: Dependency packages (ubuntu) run: sudo apt-get -y install build-essential python3-pexpect python3-yaml libncurses-dev if: ${{ matrix.os == 'ubuntu-latest' }} - name: Dependency packages (macos) run: | brew install coreutils ncurses pip3 install pexpect pyyaml if: ${{ matrix.os == 'macos-latest' }} - name: configure run: ./configure - name: make run: ./tools/mmake - name: make install-target run: make install-target DESTDIR=${GITHUB_WORKSPACE}/destdir - name: Build artifact tarball run: | mkdir -p ${GITHUB_WORKSPACE}/artifacts tar zcvf ${GITHUB_WORKSPACE}/artifacts/${{ github.job }}-${{ github.run_id }}.${{ github.run_number }}-${{ matrix.os }}.tar.gz -C ${GITHUB_WORKSPACE}/destdir . - name: Upload artifacts uses: actions/upload-artifact@v2 with: name: ci-${{ github.job }}-${{ github.run_id }}.${{ github.run_number }}-${{ matrix.os }} path: artifacts/*.tar.gz |
|
| | > | 1 2 | inst test |
︙ | ︙ | |||
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | and primary developer of the system that builds the OS/8 media images from source tapes. He first greatly extended the `mkos8` script then replaced it entirely as `os8-run`. He curated the tape collections we ship as `media/.../*.tu56`, created some of those tapes, and more. He has also contributed to other areas of the software project. His contributions are made to the project [as `poetnerd`][pncomm]. * **[Warren Young](mailto:tangentsoft@gmail.com)** Did everything listed in [the change log][cl] that is not attributed to anyone else. His contributions are made to the project [as `tangent`][wycomm], though keep in mind that some of those are commits of external contributions made by people who do not have commit rights on our software repository. The changelog provides proper attribution for these where the checkin comments do not. [advent]: http://www.rickmurphy.net/advent/ [cl]: https://tangentsoft.com/pidp8i/doc/trunk/ChangeLog.md [pncomm]: https://tangentsoft.com/pidp8i/timeline?u=poetnerd [thcomm]: https://tangentsoft.com/pidp8i/timeline?u=tony [vtedit]: https://tangentsoft.com/pidp8i/wiki?name=Using+VTEDIT [wycomm]: https://tangentsoft.com/pidp8i/timeline?u=tangent | > > > > > | 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | and primary developer of the system that builds the OS/8 media images from source tapes. He first greatly extended the `mkos8` script then replaced it entirely as `os8-run`. He curated the tape collections we ship as `media/.../*.tu56`, created some of those tapes, and more. He has also contributed to other areas of the software project. His contributions are made to the project [as `poetnerd`][pncomm]. * **[Bill Silver](mailto:bsilver@tidewater.net)** created E8, an Emacs-like editor for the PDP-8. See [its `AUTHORS.md` file][e8au] for more info. * **[Warren Young](mailto:tangentsoft@gmail.com)** Did everything listed in [the change log][cl] that is not attributed to anyone else. His contributions are made to the project [as `tangent`][wycomm], though keep in mind that some of those are commits of external contributions made by people who do not have commit rights on our software repository. The changelog provides proper attribution for these where the checkin comments do not. [advent]: http://www.rickmurphy.net/advent/ [cl]: https://tangentsoft.com/pidp8i/doc/trunk/ChangeLog.md [e8au]: ./src/e8/AUTHORS.md [pncomm]: https://tangentsoft.com/pidp8i/timeline?u=poetnerd [thcomm]: https://tangentsoft.com/pidp8i/timeline?u=tony [vtedit]: https://tangentsoft.com/pidp8i/wiki?name=Using+VTEDIT [wycomm]: https://tangentsoft.com/pidp8i/timeline?u=tangent |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 | # Contributing to the PiDP-8/I Project If you wish to make any changes to [the project’s files][home], here are some rules and hints to keep in mind while you work. [home]: https://tangentsoft.com/pidp8i/ ## <a id="gs-fossil"></a> Getting Started with Fossil The PiDP-8/I software project is hosted using the Fossil [distributed version control system][dvcs], which provides most of the features of GitHub without [the complexities of Git][fvg]. Those new to Fossil should at least read its [Quick Start Guide][fqsg]. If you want to go deeper, [the Schimpf book][fbook] is somewhat outdated, but it is still the best single coherent tutorial on Fossil. Those coming from Git will benefit from the approach taken by the “[Git to Fossil Translation Guide][gitusr].” [The official Fossil docs][fdoc] are much more up to date, but they take a piecemeal approach to topics, rather than the linear tutorial approach of a book, so it is not my first recommendation for learning Fossil. Those docs are better for polishing your skills and for reference after you know Fossil reasonably well. If you have questions about Fossil, ask on [the Fossil forum][ffor] where I, your humble project maintainer, am active. I also work on the Fossil docs quite a bit, so if your question really isn’t answered somewhere in the above material, I might just solve it by extending the Fossil docs. Fossil is pre-installed on our [binary OS images][bosi] since April 2017. When starting from Debian-based OSes released in June 2019 or newer, this will work: $ sudo apt install fossil Older Debian-based OSes will give you Fossil 1.*x*, which won’t work with our repository, which requires Fossil 2.1 or higher. If you can’t upgrade your host OS, you’ll have to [build Fossil from source][bffs]. Fossil is also available for all common desktop platforms. If your OS package repository doesn’t include Fossil 2.1 or higher already, one of the [precompiled binaries][fbin] may work on your system. [bffs]: https://fossil-scm.org/home/doc/trunk/www/build.wiki [bosi]: https://tangentsoft.com/pidp8i#bosi [fbin]: https://fossil-scm.org/index.html/uv/download.html [fvg]: https://fossil-scm.org/home/doc/trunk/www/fossil-v-git.wiki [dvcs]: https://en.wikipedia.org/wiki/Distributed_revision_control [fbook]: https://www.fossil-scm.org/schimpf-book/home [fdoc]: https://fossil-scm.org/home/doc/trunk/www/permutedindex.html [ffor]: https://fossil-scm.org/forum/ [fqsg]: https://fossil-scm.org/home/doc/trunk/www/quickstart.wiki [gitusr]: https://fossil-scm.org/home/doc/trunk/www/gitusers.md ## <a id="fossil-anon" name="anon"></a> Fossil Anonymous Access There are three ways to clone the repository anonymously using Fossil. Each of these methods gets you a file called `pidp8i.fossil` containing the full history of the PiDP-8/I software project from the upstream 2015.12.15 release onward. You only need to take one of these options, once per machine. Thereafter, you will just be working with the cloned repository. ### One-Step Clone-and-Open <a id="one-step-open"></a> The easiest way requires Fossil 2.14 or higher: $ fossil clone https://tangentsoft.com/pidp8i $ cd pidp8i That gets you a clone of the `pidp8i.fossil` repository plus a check-out of the current trunk in a `pidp8i/` directory alongside it. We recommend that you do this in a directory like `~/src` so you don’t commingle these files with other things in your current working directory. ### Open from URI <a id="open-uri"></a> If you have Fossil 2.12 or 2.13, the next-easiest method is: $ mkdir -p ~/src/pidp8i $ cd ~/src/pidp8i $ fossil open https://tangentsoft.com/pidp8i This opens the repository referenced by that URI into the current directory as `pidp8i.fossil`, then opens that repo into that same subdirectory. You have to create the destination directory first with this method because Fossil will refuse to spam a non-empty directory with the check-out contents when opening the repo into a directory containing other files unless you give it the `--force` flag. Notice that the repo file ends up *inside* the check-out tree with this method. This is because of a purposeful semantic difference in Fossil between “open” and “clone.” It may seem strange to someone coming from Git, but while we don’t want to get into the whys and wherefores here, realize there is logic behind this choice. ### Separate Clone and Open <a id="sep-clone-open"></a> The complicated method works with all versions of Fossil back to 2.1, and it is the one we recommend to people who want to get involved with the project, because it has [numerous advantages][cowf] over the easy methods. We’ll explain those benefits in the context of the PiDP-8/I project later, but for now, the method is: $ mkdir -p ~/museum ~/src/pidp8i/trunk $ fossil clone https://tangentsoft.com/pidp8i ~/museum/pidp8i.fossil $ cd ~/src/pidp8i/trunk $ fossil open ~/museum/pidp8i.fossil [cowf]: https://fossil-scm.org/home/doc/trunk/www/ckout-workflows.md ## <a id="login"></a> Fossil Developer Access If you have a developer account on the `tangentsoft.com/pidp8i` Fossil instance, just add your username to the URL like so: $ fossil clone https://USERNAME@tangentsoft.com/pidp8i pidp8i.fossil If you’ve already cloned anonymously, simply tell Fossil about the new sync URL instead: $ cd ~/src/pidp8i/trunk $ fossil sync https://USERNAME@tangentsoft.com/pidp8i Either way, Fossil will ask you for the password for `USERNAME` on the remote Fossil instance, and it will offer to remember it for you. If you let it remember the password, operation from then on is scarcely different from working with an anonymous clone, except that on checkin, your changes will be sync’d back to the repository on tangentsoft.com if you’re online at the time, and you’ll get credit under your developer account name for the checkin. If you’re working offline, Fossil will still do the checkin locally, and it will sync up with the central repository after you get back online. It is best to work on a branch when unable to use Fossil’s autosync feature, as you are less likely to have a sync conflict when attempting to send a new branch to the central server than in attempting to merge your changes to the tip of trunk into the current upstream trunk, which may well have changed since you went offline. You can purposely work offline by disabling autosync mode: $ fossil set autosync 0 Until you re-enable it (`autosync 1`) Fossil will stop trying to sync your local changes back to the central repo. In this mode, Fossil works more like Git’s default mode, buying you many of the same problems that go along with that working style. I recommend disabling autosync mode only when you are truly going to be offline and don’t want Fossil attempting to sync when you know it will fail. ## <a id="gda"></a> Getting Developer Access We’re pretty open about giving developer access to someone who’s provided at least one good, substantial [patch](#patches) to the software. If we’ve accepted one of your patches, just ask for a developer account [on the forum][pfor]. ## <a id="tags" name="branches"></a> Working with Existing Tags and Branches The directory structure shown in the [separate clone and open](#sep-clone-open) sequence above is more complicated than strictly necessary, but it has a number of nice properties. First, it collects software projects under a common top-level directory. I’ve used `~/src` for this example, but you are free to use any scheme you like. Second, the level underneath the project directory (`~/src/pidp8i`) stores multiple separate checkouts, one for each version the developer is actively working with at the moment, so to add a few other checkouts, you could say: $ cd ~/src/pidp8i $ mkdir -p release # another branch $ mkdir -p v20151215 # a tag this time, not a branch $ mkdir -p 2019-04-01 # the software as of a particular date ...etc... $ cd release $ fossil open ~/museum/pidp8i.fossil release $ cd ../v20151215 $ fossil open ~/museum/pidp8i.fossil v20151215 $ cd ../2019-04-01 $ fossil open ~/museum/pidp8i.fossil 2019-04-01 ...etc... This gives you multiple independent checkouts, which allows you to quickly switch between versions with “`cd`” commands. The alternative (favored by Git and some other version control systems) is to use a single working directory and switch among versions by updating that single working directory in place. The problem is that this invalidates all of the build artifacts tied to changed files, so you have a longer rebuild time than simply switching among check-out directories. Since disk space is cheap these days — even on a small Raspberry Pi SD card – it’s better to have multiple working states and just “`cd`” among them. When you say `fossil update` in a check-out directory, you get the “tip” state of that version’s branch. This means that if you created your “`release`” check-out while version 2017.01.23 was current and you say “`fossil update`” today, you’ll get the release version 2019.04.25 or later. But, since the `v20151215` tag was made on trunk, saying “`fossil update`” in that check-out directory will fast-forward you to the tip of trunk; you won’t remain pinned to that old version. This is one of the essential differences between tags and branches in Fossil, which are at bottom otherwise nearly identical. The PiDP-8/I project uses tags for [each released version][tags], and it has [many working branches][brlist]. You can use any of those names in “`fossil open`” and “`fossil update`” commands, and you can also use any of [Fossil’s special check-in names][fscn]. [brlist]: https://tangentsoft.com/pidp8i/brlist [fscn]: https://fossil-scm.org/home/doc/trunk/www/checkin_names.wiki [fvg]: https://fossil-scm.org/home/doc/trunk/www/fossil-v-git.wiki [gitwt]: https://git-scm.com/docs/git-worktree [tags]: https://tangentsoft.com/pidp8i/taglist ## <a id="branching"></a> Creating Branches Creating a branch in Fossil is scary-simple, to the point that those coming from other version control systems may ask, “Is that really all there is to it?” Yes, really, this is it: $ fossil ci --branch new-branch-name That is to say, you make your changes as you normally would; then when you go to check them in, you give the `--branch` option to the `ci/checkin` command to put the changes on a new branch, rather than add them to the same branch the changes were made against. While developers with login rights to the PiDP-8/I Fossil instance are allowed to check in on the trunk at any time, we recommend using branches whenever you’re working on something experimental, or where you can’t make the necessary changes in a single coherent checkin. One of this project’s core principles is that `trunk` should always build without error, and it should always function correctly. That’s an ideal we have not always achieved, but we do always *try* to achieve it. Contrast branches, which PiDP-8/I developers may use to isolate work until it is ready to merge into the trunk. It is okay to check work in on a branch that doesn’t work, or doesn’t even *build*, so long as the goal is to get it to a point that it does build and work properly before merging it into trunk. Here again we have a difference with Git: because Fossil normally syncs your work back to the central repository, this means we get to see the branches you are still working on. This is a *good thing*. Do not fear committing broken or otherwise bad code to a branch. [You are not your code.][daff] We are software developers, too: we understand that software development is an iterative process, that not all ideas spring forth perfect and production-ready from the fingers of its developers. These public branches let your collaborators see what you’re up to; they may be able to lend advice, to help with the work, or to at least be unsurprised when your change finally lands in trunk. Fossil fosters close cooperation, whereas Git fosters wild tangents that never come back home. Jim McCarthy (author of [Dynamics of Software Development][dosd]) has a presentation on YouTube that touches on this topic at a couple of points: * [Don’t go dark](https://www.youtube.com/watch?v=9OJ9hplU8XA) * [Beware of a guy in a room](https://www.youtube.com/watch?v=oY6BCHqEbyc) Fossil’s sync-by-default behavior fights these negative tendencies. PiDP-8/I project developers are welcome to create branches at will. The main rule is to follow the branch naming scheme: all lowercase with hyphens separating words. See the [available branch list][brlist] for examples to emulate. If you have checkin rights on the repository, it is generally fine to check things in on someone else’s feature branch, as long as you do so in a way that cooperates with the purpose of that branch. The same is true of `trunk`: you should not check something in directly on the trunk that changes the nature of the software in a major way without discussing the idea first. This is yet another use for branches: to make a possibly-controversial change so that it can be discussed before being merged into the trunk. [daff]: http://www.hanselman.com/blog/YouAreNotYourCode.aspx [dosd]: http://amzn.to/2iEVoBL ## <a id="special"></a> Special Branches Most of the branches in the PiDP-8/I project are feature branches of the sort described in the previous section: an isolated line of development by one or more of the project’s developers to work towards some new feature, with the goal of merging that feature into the `trunk` branch. There are a few branches in the project that are special, which are subject to different rules than other branches: * **<code>release</code>** — One of the steps in the [release process][relpr] is to merge the stabilized `trunk` into the `release` branch, from which the release tarballs and binary OS images are created. Only the project’s release manager — currently Warren Young — should make changes to this branch. * **<code>bogus</code>** or **<code>BOGUS</code>** — Because a branch is basically just a label for a specific checkin, Fossil allows the tip of one branch to be “moved” to another branch by applying a branch label to that checkin. We use this label when someone makes a checkin on the tip of a branch that should be “forgotten.” Fossil makes destroying project history very difficult, on purpose, so things moved to the “bogus” branch are not actually destroyed; instead, they are merely moved out of the way so that they do not interfere with that branch’s normal purpose. If you find yourself needing to prune the tip of a branch this way, the simplest way is to do it via the web UI, using the checkin description page’s “edit” link. You can instead do it from the command line with the `fossil amend` command. [relpr]: https://tangentsoft.com/pidp8i/doc/trunk/doc/RELEASE-PROCESS.md ## <a id="forum"></a> Developer Discussion Forum The “[Forum][pfor]” link at the top of the Fossil web interface is for discussing the development of the PiDP-8/I software only. All other traffic should go to [the end-user focused mailing list][ggml] instead. We’re not trying to split the community by providing a second discussion forum; we just think many development-related discussions are too low-level to be of any interest to most of the people on the mailing list. You can sign up for the forums without having a developer login, and you can even post anonymously. If you have a login, you can [sign up for email alerts][alert] if you like. Keep in mind that posts to the Fossil forum are treated much the same way as ticket submissions and wiki articles. They are permanently archived with the project. The “edit” feature of Fossil forums just creates a replacement record for a post, but the old post is still available in the repository. Don’t post anything you wouldn’t want made part of the permanent record of the project! [ggml]: https://groups.google.com/forum/#!forum/pidp-8 [pfor]: https://tangentsoft.com/pidp8i/forum [alert]: https://tangentsoft.com/pidp8i/alerts ## <a id="debug"></a> Debug Builds By default, the build system creates a release build, but you can force it to produce a binary without as much optimization and with debug symbols included: $ ./configure --debug-mode $ make clean $ tools/mmake ## <a id="build-system"></a> Manipulating the Build System Source Files The [autosetup build system][asbs] is composed of these files and directories: auto.def autosetup/* configure Makefile.in Unlike with GNU Autoconf, which you may be familiar with, the `configure` script is not output from some other tool. It is just a driver for the generic Tcl and C code under the `autosetup` directory, which in turn runs the project-specific `auto.def` Tcl script to configure the software. Some knowledge of [Tcl syntax][tcldoc] will therefore be helpful in modifying `auto.def`. If you have to modify any of the files in `autosetup/` to get some needed effect, you should try to get that change into the upstream [Autosetup][asbs] project, then merge that change down into the local copy when it lands upstream. If you do not have Tcl installed on your system, `configure` builds a minimal Tcl interpreter called `jimsh0`, based on the [Jim Tcl][jim] project. Developers working on the build system are encouraged to use this stripped-down version of Tcl rather than “real” Tcl because Jim Tcl is a mostly-pure subset of Tcl, and `jimsh0` is a subset of the complete Jim Tcl distribution, so any changes you make that work with the `jimsh0` interpreter should also work with “real” Tcl, but not vice versa. If you have Tcl installed and don’t really need it, consider uninstalling it to force Autosetup to build and use `jimsh0` to ensure that your changes to `auto.def` work on both interpreters. The `Makefile.in` file is largely a standard [GNU `make`][gmake] file excepting only that it has variables substituted into it by Autosetup using its `@VARIABLE@` syntax. At this time, we do not attempt to achieve compatibility with other `make` programs, though in the future we may need it to work with [BSD `make`][bmake] as well, so if you are adding features, you might want to stick to the common subset of features implemented by both the GNU and BSD flavors of `make`. We do not anticipate any need to support any other `make` flavors. This, by the way, is why we’re not using some heavy-weight build system such as the GNU Autotools, CMake, etc. The primary advantage of GNU Autotools is that you can generate standalone source packages that will configure and build on weird and ancient flavors of Unix. We don’t need that. Cross-platform build systems such as CMake ease building the same software on multiple disparate platforms, but the PiDP-8/I software is built primarily on and for a single operating system, Raspberry Pi OS, né Raspbian. It also happens to build and run on [several other OSes][oscomp], for which we also do not need the full power of something like CMake. Autosetup and GNU `make` suffice for our purposes here. [asbs]: http://msteveb.github.io/autosetup/ [bmake]: https://www.freebsd.org/doc/en/books/developers-handbook/tools-make.html [gmake]: https://www.gnu.org/software/make/ [jim]: http://jim.tcl.tk/ [oscomp]: https://tangentsoft.com/pidp8i/wiki?name=OS+Compatibility [tcldoc]: http://wiki.tcl.tk/11485 ## <a id="dirs"></a> Directory Structure The directory structure of the PiDP-8/I project is as follows: * <b>`.`</b> — Top level, occupied only by the few files the end user of the source code needs immediately at hand on first unpacking the project: the top level build system files, key documentation, and licensing information. If a given file *can* be buried deeper, it *should* be buried to reduce clutter at this most precious level of the hierarchy. * <b>`.fossil-settings`</b> — Versioned settings for the Fossil build system which Fossil applies as defaults everywhere you check out a Fossil version. Settings made here are intended to be correct for all users of the system; think of these not as expressing defaults but as expressing *policy*. It is possible to override these settings, but we do not make settings here if we expect that some users may quibble with our choices here. Any setting whose value may vary between users of the Fossil repository should be done locally with a [`fossil setting` command][fscmd] rather than by creating or editing files in this subdirectory. See [the Fossil settings documentation][fset] for more on this. * <b>`autosetup`</b> — The bulk of the [Autosetup build system][asbs]. These are generic files, not modified by the project itself. We occasionally run `tools/autosetup-update` to merge in upstream changes. * <b>`bin`</b> — Programs installed to `$prefix/bin`, which may also be run during development, if only to test changes to those programs. Some scripts stored here are written in place by the project’s developers, while other files in this directory are outputs of the build system. A subset of this directory’s content is copied to `$prefix/bin` at installation time, which is added to the user’s `PATH` by the `make install` script. We don’t copy the whole thing as-is because the build system places some files here that get installed to other locations or which don’t get installed at all. * <b>`boot`</b> — SIMH initialization scripts. The `*.script.in` files are written by the project developers but have local configuration values substituted in by the `configure` script to produce a `*.script` version. Scripts which need no config-time values substituted in are checked in directly as `*.script`. The `*.script` files in this directory which do not fall into either of those categories are outputs of `tools/mkbootscript`, which produces them from `palbart` assembly listings. All of these `*.script` files are copied to `$prefix/share/boot` by `make mediainstall` which runs automatically from `make install` when we detect that the binary media and SIMH boot scripts have never been installed at this site before. On subsequent installs, the user chooses whether to run `make mediainstall` by hand to overwrite all of this. * <b>`doc`</b> — Documentation files that can wait for new users to discover them, which do not need to be available immediately to the user on inspecting the tree for the first time. Fossil’s [embedded documentation][edoc] feature allows us to present the contents of `doc` to web site users all but indistinguishably from a wiki page. You may then ask, “Why are there two different ways to achieve the same end — embedded docs and the wiki — and how do we decide which mechanism to use?” Let us explore the differences before we answer the question. Fossil’s wiki feature behaves much like Wikipedia: it keeps change history for wiki documents, but it always presents the most recent version unless you go out of your way to manually dig up a historical version. This is true even if you’ve run `fossil ui` from a check-out directory where you’ve rolled back to a historical version. This doesn’t roll back the wiki to the same point in time; it continues showing the most recent version of each article. Embedded documentation — being files like any other committed to the repository — *are* rolled back to historical versions when you say something like `fossil update 2018-04-01` to see the software as of April Fool’s Day 2018. You see the embedded docs as of that date as well, unlike with the wiki. That leads us to the razor we use to decide where a given document lives. Use the wiki for evergreen content: material likely to remain correct for future versions of the software as well as the version contemporaneous with the initial version of the document. Also use the wiki for documention of conditions that change independently of the software’s version history, a good example being [our OS Compatibility wiki article][oscomp]. In either case, there is no tie between the software’s internal version history and changes out in the wider world, so the wiki’s always-current nature matches our needs well. The best case for using embedded documentation is when changes to the software are likely to require changes to the corresponding documentation, so that the commit changes both docs and code, keeping them in lock-step. When in doubt, use embedded documentation. The `doc/graphics` subdirectory holds JPEGs and SVGs displayed inline within wiki articles. * <b>`etc`</b> — Files which get copied to `/etc` or one of its subdirectories at installation time. There is an exception: `pidp8i.service.in` does not get installed to `/etc` at install time, but only because systemd’s [unit file load path scheme][uflp] is screwy: *some* unit files go in `/etc`, while others do not. The systemd docs claim we can put user units in `/etc/systemd/user` but this does not appear to work on a Raspberry Pi running Raspbian Stretch at least. We’ve fallen back to another directory that *does* work, which feels more right to us anyway, but which happens not to be in `/etc`. If systemd were designed sanely, we’d install such files to `$HOME/etc/systemd` but noooo… Since none of the above actually argues for creating another top-level repository directory to hold this one file, we’ve chosen to store it in `etc`. * <b>`examples`</b> — Example programs for the end user’s edification. Many of these are referenced by documentation files and therefore should not be renamed or moved, since there may be public web links referring to these examples. * <b>`hardware`</b> — Schematics and such for the PiDP-8/I board or associated hardware. * <b>`labels`</b> — Graphics intended to be printed out and used as labels for removable media. * <b>`lib`</b> — Library routines used by other programs, installed to `$prefix/lib`. * <b>`libexec`</b> — A logical extension of `lib`, these are standalone programs that nevertheless are intended to be run primarily by other programs. Whereas a file in `lib` might have its interface described by a programmer’s reference manual, the interface of a program in `libexec` is described by its usage message. Currently, there is only one such program, `scanswitch`, which si run primarily by `etc/pidp8i`. It is only run by hand when someone is trying to debug something, as in development. Programs in `libexec` are installed to `$prefix/libexec`, which is *not* put into the user’s `PATH`, on purpose. If a program should end up in the user’s `PATH`, it belongs in `bin`. Alternately, a wrapper may be put in `bin` which calls a `libexec` program as a helper. * <b>`media`</b> — Binary media images used either by SIMH directly or inputs consumed by tools like `os8-run` to *produce* media used by SIMH. The contents of this tree are installed to `$prefix/share/media`. * <b>`obj`</b> — Intermediate output directory used by the build system. It is safe to remove this directory at any time, as its contents may be recreated by `make`. No file checked into Fossil should be placed here. (Contrast `bin` which does have some files checked into Fossil; all of the *other* files that end up in `bin` can be recreated by `make`, but not these few hand-written programs.) * <b>`scripts`</b> — Scripts driving `os8-run`, most of which are invoked by the build system, though some are meant to be run by hand, such as the content of `scripts/test`. * <b>`src`</b> — Source code for the project’s programs, especially those that cannot be used until they are built. The great majority of these programs are written in C. The build system’s output directories are `bin`, `boot`, `libexec`, and `obj`. Programs that can be used without being “built,” example programs, and single-file scripts are placed elsewhere: `bin`, `examples`, `libexec`, `tools`, etc. Basically, we place such files where the build system *would* place them if they were built from something under `src`. This directory also contains PDP-8 source files of various sorts, mainly those used for building the SIMH media and the `os8pkg` packages. These are all “built” into other forms that then appear when running the simulator, rather than being used directly in this source code form. There are no program sources in the top level of `src`. The file `src/config.h` may appear to be an exception to that restriction, but it is *generated output* of the `configure` script, not “source code” *per se*. Multi-module programs each have their own subdirectory of `src`, each named after the program contained within. Single module programs live in `src/misc` or `src/asm`, depending on whether they are host-side C programs or PAL8 assembly programs. * <b>`test`</b> — Output directory used by `tools/test-*`. * <b>`tools`</b> — Programs run only during development and not installed. If a program is initially created here but we later decide that it should be installed for use by end users of the PiDP-8/I system, we move it to either `bin` or `libexec`, depending on whether it is run directly at the command line or run from some other program that is also installed, respectively. [edoc]: https://fossil-scm.org/home/doc/trunk/www/embeddeddoc.wiki [fset]: https://fossil-scm.org/home/doc/trunk/www/settings.wiki [fscmd]: https://fossil-scm.org/home/help?cmd=setting [uflp]: https://freedesktop.org/software/systemd/man/systemd.unit.html#id-1.9 ## <a id="patches"></a> Submitting Patches If you do not have a developer login on the project repository, you can still send changes to the project. The simplest way is to say this after developing your change against trunk: $ fossil diff > my-changes.patch Then paste that into a [forum post][pfor] using a [fenced code block][fcb]. We will also accept trivial patches not needing discussion as text or attachments on [a Fossil ticket][tkt]. If you're making a patch against a PiDP-8/I distribution tarball, you can generate a patch this way: $ diff -ruN pidp8i-olddir pidp8i-newdir > mychange.patch The `diff` command is part of every Unix and Linux system, and should be installed by default. If you're on a Windows machine, GNU diff is part of [Cygwin](http://cygwin.com/) and [WSL]. Fossil is also available for all of these systems. There are no excuses for not being able to make unified diffs. :) [fcb]: https://www.markdownguide.org/extended-syntax#fenced-code-blocks [tkt]: https://tangentsoft.com/pidp8i/tktnew [WSL]: https://docs.microsoft.com/en-us/windows/wsl/install-win10 #### Bundles Instead of Patches If your change is more than a small patch, `fossil diff` might not incorporate all of the changes you have made. The old unified `diff` format can’t encode branch names, file renamings, file deletions, tags, checkin comments, and other Fossil-specific information. For such changes, it is better to send a [Fossil bundle][fb]: $ fossil set autosync 0 # disable autosync $ fossil checkin --branch my-changes ...followed by more checkins on that branch... $ fossil bundle export --branch my-changes my-changes.bundle After that first `fossil checkin --branch ...` command, any subsequent `fossil ci` commands will check your changes in on that branch without needing a `--branch` option until you explicitly switch that checkout directory to some other branch. This lets you build up a larger change on a private branch until you’re ready to submit the whole thing as a bundle. Because you are working on a branch on your private copy of the project’s Fossil repository, you are free to make as many checkins as you like on the new branch before giving the `bundle export` command. Once you are done with the bundle, upload it somewhere public and point to it from a forum post or ticket. [fb]: https://fossil-scm.org/home/help?cmd=bundle #### Contribution Licensing Submissions should include a declaration of the license you wish to contribute your changes under. We suggest using the [SIMH license][simhl], but any [non-viral][viral] [OSI-approved license][osil] should suffice. We’re willing to tolerate viral licenses for standalone products; for example, CC8 is under the GPL, but it’s fine because it isn’t statically linked into any other part of the PiDP-8/I software system. [osil]: https://opensource.org/licenses [simhl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md [viral]: https://en.wikipedia.org/wiki/Viral_license #### <a id="ghm"></a> Can I Use GitHub Instead? Although the PiDP-8/I project does have a [GitHub mirror][ghm], it is intended as a read-only mirror for those heavily tied into Git-based tooling. You’re welcome to send us a PR anyway, but realize that what’s going to happen on the back end is that we’ll generate a patch, apply it to the Fossil repo by hand, test it, and then commit it to the repository under one of our existing Fossil developer accounts. Only then do we update the mirror so that the change appears on GitHub; thus, you don’t get GitHub credit for the PR. You avoid these problems by simply asking for a developer account on the Fossil repo, so you can commit there instead. This is not simply because setting up bidirectional mirroring is difficult, it is actually [impossible to achieve 100% fidelity][ghlim] due to limitations of Git and/or GitHub. If you want a faithful clone of the project repo, or if you wish to contribute to the project’s development with full credit for your contributions, it’s best done via Fossil, not via GitHub. [ghlim]: https://fossil-scm.org/home/doc/trunk/www/mirrorlimitations.md [ghm]: https://github.com/tangentsoft/pidp8i/ ## <a id="code-style"></a> The PiDP-8/I Software Project Code Style Rules Every code base should have a common code style. Love it or hate it, here are PiDP-8/I’s current code style rules: **C Source Code** File types: `*.c`, `*.h`, `*.c.in` We follow the SIMH project’s pre-existing code style when modifying one of its source files: * Spaces for indents, size 4; tabs are rendered size 8 in HTML output, since that’s how a PDP-8 terminal would likely interpret it! * DOS line endings. (Yes, even though this is a Linux-based project! All decent Linux text editors can cope with this.) * Function, structure, type, and variable names are all lowercase, with underscores separating words * Macro names are in `ALL_UPPERCASE_WITH_UNDERSCORES` * Whitespace in the SIMH C files is of a style I have never seen anywhere else in my decades of software development. This example shows the important features: ```C int some_function (char some_parameter) { int some_variable = 0; if (some_parameter != '\0') { int nbytes = sizeof (some_parameter); char *buffer = malloc (4 * nbytes); switch (some_parameter) { case 'a': do_something_with_buffer ((char *)buffer); default: do_something_else (); } } else { some_other_function (with_a_large, "number of parameters", wraps_with_a_single, "indent level"); printf (stderr, "Failed to allocate buffer.\n"); } } ``` It is vaguely like K&R C style except that: * The top level of statements in a function are not indented * The closing curly brace is indented to the same level as the statement(s) it contains * There is a space before all opening parentheses, not just those used in `if`, `while`, and similar flow control statements. Nested open parentheses do not have extra spaces, however. Only the outer opening parenthesis has a space separating it from what went before. * Multiple variables declared together don’t have their types and variable names aligned in columns. I find that this style is mostly sensible, but with two serious problems: I find the indented closing curly braces confusing, and I find that the loss of the first indent level for the statements inside a function makes functions all visually run together in a screenful of code. Therefore, when we have the luxury to be working on a file separate from SIMH, we use a variant of its style with these two changes, which you can produce with the `tools/restyle` command. See its internal comments for details. That gives the following, when applied to the above example: ```C int some_function (char some_parameter) { int some_variable = 0; if (some_parameter != '\0') { int nbytes = sizeof (some_parameter); char *buffer = malloc (4 * nbytes); switch (some_parameter) { case 'a': do_something_with_buffer ((char *)buffer); default: do_something_else (); } } else { some_other_function (with_a_large, "number of parameters", wraps_with_a_single, "indent level"); printf (stderr, "Failed to allocate buffer.\n"); } } ``` If that looks greatly different, realize that it is just two indenting level differences: add one indent at function level, except for the closing braces, which we leave at their previous position. SIMH occasionally exceeds 100-column lines. I recommend breaking long lines at 72 columns. Call me an 80-column traditionalist. When in doubt, mimic what you see in the current code. When still in doubt, ask on the [project forum][pfor]. [indent]: http://linux.die.net/man/1/indent **Plain Text Files** File types: `*.md`, `*.txt` * Spaces for indents, size 4. * Unix line endings. The only common text editor I’m aware of that has a problem with this is Notepad, and people looking at these files anywhere other than unpacked on a Raspberry Pi box are probably looking at them through the Fossil web interface on tangentsoft.com. * Markdown files must follow the syntax flavor understood by [Fossil’s Markdown interpreter][fmd]. [fmd]: https://tangentsoft.com/pidp8i/md_rules ## <a id="tickets"></a> Ticket Workflow Normal end users of the Fossil ticket system are not expected to understand it properly or to fill out tickets properly. Without certain permissions, it is in fact not possible to completely fill out a ticket properly. Project developers typically must triage, augment, and correct submissions from the start. Here’s the basic workflow for a “code defect” ticket, colloquially called a bug report: ``` pikchr toggle indent fill = bisque linerad = 15px define diamond { \ box wid 150% invis line from last.w to last.n to last.e to last.s close rad 0 $1 } oval "SUBMIT TICKET" width 150% down arrow 50% NEW: file "New bug ticket" "marked \"Open\"" fit arrow same box "Triage," "augment &" "correct" fit arrow same DC: box "Developer comments" fit arrow same FR: box "Filer responds" fit arrow 100% REJ: diamond("Reject?") right arrow 100% "Yes" above box "Mark ticket" "\"Rejected\" &" "\"Resolved\"" fit with .w at previous.e arrow right 50% REJF: file "Rejected" "ticket" fit arrow right 50% REOP: diamond("Reopen?") down REJA: arrow 75% from REJ.s " No; fix it" ljust CHNG: box "Developer changes code" with .n at last arrow.s fit arrow 50% FIXD: diamond("Fixed?") right FNO: arrow "No" above RES: box "Optional:" "Update ticket resolution:" "\"Partial Fix\", etc." fit down arrow 75% " Yes" ljust from FIXD.s box "Mark ticket" "\"Fixed\" & \"Closed\"" fit arrow 50% RESF: file "Resolved ticket" fit arrow same oval "END" line from 0.3<FR.ne,FR.se> right even with 0.25 right of DC.e then \ up even with DC.e then to DC.e -> line from NEW.w left 0.5 then down even with REJ.w then to REJ.w -> line invis from 2nd vertex of last line to 3rd vertex of last line \ "fast reject path" above aligned line from RES.e right 0.3 then up even with CHNG.e then to CHNG.e -> line from REOP.s "No" aligned above down 0.4 line from previous.s down to (previous.s, RESF.e) then to RESF.e -> line from REOP.n "Yes" aligned below up 0.3 line from previous.n up even with 0.6<FR.ne,FR.se> then to 0.6<FR.ne,FR.se> -> ``` On noticing a new-filed ticket — such as because you are subscribed to email notifications on ticket changes — someone with sufficient privilege triages it, sets values for the fields not exposed to the ticket’s filer, and fixes up any incorrect values given in the initial submission. The Status of a ticket initially starts out as Open; the filer cannot change that default value, short-circuiting the process. If the person triaging a ticket takes the time to check that the bug actually occurs as the ticket filer claims, the Status should change to Verified. If a developer implements a fix in response to a ticket, he has two choices: change the ticket’s Status to “Review” if he wants someone to check out the change before closing it, or go straight to Closed status. Closing a ticket hides it from the [Wishes] and [Bugs] ticket reports. The process for software feature request and documentation improvement request tickets is essentially the same, differing mainly in terminology rather than process flow: instead of verifying the existence of a bug, the one triaging the ticket verifies that the feature does in fact not exist yet, and so on. A common requrement in larger teams is that all ticket changes to go through Review status before getting to Closed, but the PiDP-8/I project is too small to require such ceremony: if we’ve given you a developer account on the repository, you’re expected to resolve and close tickets in the same step, most of the time. If you cannot confidently close a ticket when resolving it, you should probably not be assigning a resolution yet anyway. Do whatever you have to with tests and such to *become* certain before you resolve a ticket. There is a process interlock between the Resolution and Status settings for a ticket: while Status is not Closed, Resolution should be Open. When Resolution changes from Open, Status should change to either Review or, preferentially, Closed. A resolution is an end state, not an expression of changeable intent: no more ceremony than setting a ticket’s Resolution state *away* from Open and its Status *to* Closed is required. If you do not intend to close a ticket but wish to advocate for a particular resolution, just add a comment to the ticket and let someone else choose whether to close the ticket or not. Don’t change the Resolution value until the issue has been *resolved* for good. For example, the resolution “Works as Designed” does not merely mean, “Yes, we know it works that way,” it also implies “…and we have no intention to change that behavior, ever.” If there is a chance that the behavior described in the ticket could change, you should not assign any resolution. Just leave it open until someone decides to do something final with the ticket. This is not to say that a ticket can never be re-opened once it’s had a resolution assigned and been closed, but that this is a rare occurrence. When a developer makes a decision about a ticket, it should be difficult to re-open the issue. A rejected ticket probably shouldn’t be re-opened with anything short of a working patch, for example: > User A: I want feature X. > Dev B: No, we’re not going to do that. Ticket closed and rejected. > User C: Here’s a patch to implement feature X. > Dev B: Well, that’s different, then. Thanks for the patch! Ticket > marked Implemented, but still Closed. [Bugs]: https://tangentsoft.com/pidp8i/bugs [Wishes]: https://tangentsoft.com/pidp8i/wishes ## License Copyright © 2016-2020 by Warren Young. This document is licensed under the terms of [the SIMH license][sl]. [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md |
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Licenses The PiDP-8/I software distribution is an agglomeration of software from multiple sources. Several different licenses apply to its parts. This file guides you to those individual licenses. ## <a id="simh"></a>SIMH License Most of the files in this software distribution are released under the terms of the SIMH license, a copy of which typically appears at the top of each file it applies to. This includes not only SIMH proper but also several files written by PiDP-8/I software project contributors who | | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # Licenses The PiDP-8/I software distribution is an agglomeration of software from multiple sources. Several different licenses apply to its parts. This file guides you to those individual licenses. ## <a id="simh"></a>SIMH License Most of the files in this software distribution are released under the terms of the SIMH license, a copy of which typically appears at the top of each file it applies to. This includes not only SIMH proper but also several files written by PiDP-8/I software project contributors who chose to license their contributions under the same license, including E8. For a few files, textual inclusion of the license inside the file itself was impractical, so this license is applied by reference to [a file included with the distribution][sl]. [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md |
︙ | ︙ | |||
79 80 81 82 83 84 85 | There is [another PDP-8 C compiler project][smsc] based on Small-C by Vincent Slyngstad, which uses an entirely different approach for code generation. Ian Schofield took some of the library routines from this implementation. [ddj]: https://en.wikipedia.org/wiki/Dr._Dobb%27s_Journal | | | | < < < < < < < < < < | 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | There is [another PDP-8 C compiler project][smsc] based on Small-C by Vincent Slyngstad, which uses an entirely different approach for code generation. Ian Schofield took some of the library routines from this implementation. [ddj]: https://en.wikipedia.org/wiki/Dr._Dobb%27s_Journal [gpl3]: https://tangentsoft.com/pidp8i/doc/trunk/src/cc8/GPL3.txt [smc]: https://en.wikipedia.org/wiki/Small-C [smsc]: http://so-much-stuff.com/pdp8/C/C.php ## <a id="os8"></a>OS/8 License The OS/8 media images included with this software distribution are released under the Digital License Agreement presented in [`media/os8/LICENSE.md`][dla]. [dla]: https://tangentsoft.com/pidp8i/doc/trunk/media/os8/LICENSE.md ## <a id="dec"></a>Other DEC Software The other files in the [`media`][md] and [`examples`][ed] directories that originate from Digital Equipment Corporation are believed to fall under the [blanket public domain license][decpd] DEC released all their PDP-8 software under after it stopped being economically viable. Documented releases for specific software (e.g. TSS/8) may be difficult to come by, however. [md]: https://tangentsoft.com/pidp8i/dir?ci=trunk&name=media [ed]: https://tangentsoft.com/pidp8i/dir?ci=trunk&name=examples [decpd]: http://mailman.trailing-edge.com/pipermail/simh/2017-January/016164.html |
1 2 3 | # PiDP-8/I Changes <a id="20190425"></a> | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 | # PiDP-8/I Changes <a id="20210214"></a> ## Version 2021.02.14 — The Quarantine Release * Raspberry Pi 4 support. * Increased SD card requirement from 2 GB to 8 GB. See [the OS images doc](doc/OS-images.md) for details. * Integrated Bill Silver’s E8 Emacs-like text editor for the PDP-8. * Updated Ian Schofield’s CC8 C compiler to V2.0: * The OS/8 (“native”) compiler now has support for every K&R C 1978 construct except for `struct`, `float`, and function pointers. There are numerous compliance problems, but we’ve tried to document all of them in [`doc/cc8-manual.md`][cc8m]. Most notably, this release adds support for `switch` and all of the remaining 2-character operators: `!=`, `>=`, `<=` and `?:` * Added several more examples, including a Forth interpreter. * The software build now creates a [bootable RK05 disk image][OCK] of the [OS/8 Combined Kit (OCK)][kit] which is effectively the last official release of OS/8, with all patches. You can elect to use this for the IF=0 boot option instead of OS/8 V3D by configuring the software with the `--use-ock` flag. Bill Cattey did almost all of the work for this. Contrast the OS/8 V3F release, which wasn’t a formal release from DEC, but was rather V3D plus the Device Extensions Kit to support newer hardware that came out after V3D. * Added the [`os8pkg` package manager][os8pkg], allowing installation and uninstallation of packages on the installed RK05 OS/8 boot media, whether OCK or V3D. This is the new mechanism behind the existing `--with-os8-*` options, allowing you to get different feature sets on existing media without rebuilding it from scratch. Bill Cattey did almost all of the work on this. * Many packages previously copied in as binary blobs have been shifted to the source tree to be built from source, or at the very least as individual binary files copied in from the source tree under code management. This not only permits “clean” builds, it allows adding and removing packages from OS/8 media after installation, where previously you had to rebuild the entire medium after reconfiguring the source tree using `--enable-os8-*` type flags. Bill Cattey did this integration. The packages newly managed in this way are: * [`advent`][adventrm]: The game of Adventure, built from [source][advsrc]. * [`basic-games`][gamesrm]: The collection of BASIC games and demos. Although this is a [collection of ASCII text files][bgsrc], and OS/8 BASIC is an interpreter of those text program files, not a compiler, we still build this package of PDP-8 ASCII text files from POSIX ASCII text files. This not only permits later package add and remove options, it also allows fun things like editing the sources on the Pi side, rebuilding the package, and reinstalling, rather than editing the sources directly under OS/8. Or, skip the middleman and use [`os8-cp`][os8cp] to copy the edited version to the boot media. * [`cc8`][cc8m]: Ian Schofield's C compiler was always built from [source][cc8src], but now it’s built to an intermediate package rather than copied straight to the OS/8 boot media. * [`chekmo`][chekmorm]: The Chekmo II chess playing program, built from [source][ckmsrc]. * [`dcp`][dcprm]: The OS/8 PDP-8 dissassembler, built from binary executables, since source has apparently been lost. * [`e8`][e8man]: Bill Silver's E8 editor, built from [source][e8src]. * [`focal69`][focalrm]: The first DEC FOCAL interpreter, built from [source][f69src]. * [`kermit`][kermitrm]: The communication and text encode/decode suite, built from [source][krmsrc]. * [`lcmod`][lcsrc]: The batch scripts `UCSYS.BI`, `LCSYS.BI`, `UCBAS.BI` and `LCBAS.BI` are now under source control. Being patches to OS/8, the sources are scattered within our [OS/8 source subtree][os8src]. * [`music`][musicrm]: The PDP-8 Music compiler is now built from [source][mussrc] with the scores under source control. Note that we still can't actually hear the output owing to lack of connection between the sound generation and SIMH. * [`uwfocal`][uwfocalrm]: The U/W FOCAL interpreter. The main module is built from [source][uwfsrc], but other components are considered legacy and treated as binary blobs for now. This is documented in the `uwfocal.pspec` file. * [`vtedit`][vteditdoc]: The VT screen editor extensions to TECO are now packaged separately, built from [source][vtesrc]. * Added [`os8-progtest`][progtest] tool for testing software under OS/8. Tests in `pyyaml` format create state machines for starting programs engaging in run dialogs, and confirming success. Test harnesses exist for advent, cc8, chekmo, uwfocal, and basic-games. Bill Cattey did almost all the work on this. * The distribution now follows a [documented testing protocol][testing]. * [Configurable screen manager][rmsm], allowing either tmux or "none" as an alternative to GNU screen. Initial work on this feature done by Ryan Finnie. * Updated the PiDP-8/I KiCad hardware files to Oscar Vermeulen’s 2019 kit version. * Integrated the octal comparison tool `ocomp` into the lower level `dist-v3d.rk05` and `dist-ocomp.rk05` images. Used for validation of packages installed by `os8pkg`. Integration by Bill Cattey. * Added udev rules to allow mounting media from disks on USB floppy drives. (Thanks to Ryan Finnie for this feature.) * Updated SIMH to 2021-02-03 version, GitHub commit 2f66e74c50. The primary user-visible changes from the perspective of a PiDP-8/I user are: * The paper tape punch and LPT output devices now default to append mode for existing files, rather than overwriting them on `ATTACH`. This not only follows the principle of least surprise for modern users, it also replicates the way actual hardware operated: reopening such devices and sending more data to them just advanced the tape thru the punch or the paper thru the teletypewriter. * RF08: Fixed a bug that could cause loss of photo cell unit events. * The simulator now does a precalibration pass to achieve a good initial guess at the host's IPS rate rather than drop sharply into a calibrated level some seconds past the simulator startup time, as in the prior release. * Improvements to SCP, the command shell / script interpreter: * Add the `RENAME/MOVE/MV`, `MKDIR`, and `RMDIR` commands. * The `SAVE` command can now overwrite existing files. * The unimplemented `DUMP` command now gives a helpful diagnostic message recommending use of `EXAMINE`. * Several improvements to power-of-2 unit handling in command output and parameter input. * Regular expressions in SIMH `EXPECT` commands now use PCRE syntax if available instead of the POSIX regex library. * Many improvements to magnetic tape device handling. (Nothing PDP-8 specific, just generic SIMH improvements.) * Fixed a bug in the `SING_STEP` + `IF` feature for switching between boot scripts (e.g. IF=2 for running TSS/8) that could cause the simulator to crash rather than execute the new script. In typical use, this may not even be noticed by the user because systemd will restart a crashed simulator, which will then choose its boot script based on the same `IF` switch setting. Likely the only people to notice this fix are those running the simulator attached to a terminal, such as in development. * The build system now detects the availability of Python 3 and prefers it if available. All documentation now assumes that you’re using Python 3. These changes mean we’re no longer testing regularly with Python 2, so there may be breakages going forward. These should be inadvertent, but we don’t rule out the possibility of a hard cut-over in the future that permanently breaks compatibility with Python 2. We believe we retain that compatibility in this release, but this may be the last such release of the PiDP-8/I software. * Considerable updates to the Python library classes we’ve built our tooling atop to support all of the above. Some library behaviors and interfaces may have changed in ways that affect outside users. * Updated Autosetup to v0.7.0+, allowing builds under Tcl 8.7. * The previous release shipped with a broken version of the UCSYS.BI script on the v3d.rk05 boot image. The script is supposed to turn off forcing lower case characters to upper case in the OS/8 keyboard monitor, and re-enable the linefeed key's command to re-echo the command line. (Cleaning up messy character echoing.) Instead linefeed would hang the keyboard monitor. This is because the script for the v3f keyboard monitor was installed on the v3d packs. * Fixed a bug with the MB display in Sing Inst mode when poking around with Load Add and Exam. This only affects some configurations, not all, but the fix appears benign on the non-affected ones. * The `os8script.py` class has been [documented][os8script] to explain the design and assist others in writing programs that can drive operation under OS/8 in SIMH using Python expect and all the layers developed above it. * Portability and documentation improvements. [adventrm]: https://tangentsoft.com/pidp8i/doc/release/src/advent/README.md [advsrc]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/advent [bgsrc]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/basic-games [cc8src]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/cc8/os8 [chekmorm]: https://tangentsoft.com/pidp8i/doc/release/src/chekmo/README.md [ckmsrc]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/chekmo [dcprm]: https://tangentsoft.com/pidp8i/doc/release/src/dcp/README.md [e8man]: https://tangentsoft.com/pidp8i/doc/release/doc/e8-manual.md [e8src]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/e8 [f69src]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/focal69 [focalrm]: https://tangentsoft.com/pidp8i/doc/release/src/focal69/README.md [gamesrm]: https://tangentsoft.com/pidp8i/doc/release/src/basic-games/README.md [kermitrm]: https://tangentsoft.com/pidp8i/doc/release/src/kermit-12/README.md [kit]: https://tangentsoft.com/pidp8i/doc/release/doc/os8-combined-kit.md [krmsrc]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/kermit-12 [lcsrc]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/os8/ock/SYSTEM [musicrm]: https://tangentsoft.com/pidp8i/doc/release/src/music/README.md [mussrc]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/music [OCK]: https://tangentsoft.com/pidp8i/doc/release/src/os8/ock/README.md [ocomprm]: https://tangentsoft.com/pidp8i/doc/release/src/os8/tools/ocomp/README.md [os8cp]: https://tangentsoft.com/pidp8i/doc/release/doc/os8-cp.md [os8pkg]: https://tangentsoft.com/pidp8i/doc/release/doc/os8pkg.md [os8src]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/os8 [progtest]: https://tangentsoft.com/pidp8i/doc/release/doc/os8-progtest.md [rmsm]: https://tangentsoft.com/pidp8i/doc/release/README.md#rc-screen-manager [testing]: https://tangentsoft.com/pidp8i/doc/release/doc/testing.md [uwfocalrm]: https://tangentsoft.com/pidp8i/doc/release/src/uwfocal/README.md [uwfsrc]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/uwfocal [vtesrc]: https://tangentsoft.com/pidp8i/dir?ci=release&name=src/vtedit [os8script]: https://tangentsoft.com/pidp8i/doc/release/doc/class-os8script.md <a id="20190425"></a> ## Version 2019.04.25 — The "OS/8 V3F and os8-run" Release * The banner feature in this release is that Bill Cattey transformed our `mkos8` tool into the `os8-run` script interpreter, giving us many new features and capabilities: * The OS/8 V3D RK05 media build steps previously hard-coded in Python within `mkos8` are now in a series of scripts in the |
︙ | ︙ | |||
262 263 264 265 266 267 268 269 270 271 272 273 274 275 | `examples/routines/prints.pal`.</p> Between these weaknesses and the `mkbootscript` bug fixed above, this example was entirely broken since being shipped. Our thanks for the tests and diagnosis of these problems go to Greg Christie and Bill Cattey. * Improved `examples/pep001.pal`: * This program no longer gets stuck in the TSF loop on startup if you run it with the terminal unready for output. The terminal would typically be ready when launching this program from within OS/8, but it could get stuck in other conditions, such as when running it under a freshly started simulator: | > > > > > > > | 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 | `examples/routines/prints.pal`.</p> Between these weaknesses and the `mkbootscript` bug fixed above, this example was entirely broken since being shipped. Our thanks for the tests and diagnosis of these problems go to Greg Christie and Bill Cattey. * The `SING_STEP` + `IF` switch combo to restart the simulator with a new boot script (e.g. IF=2 for TSS/8) now does a full restart of the simulator rather than simply executing the script’s commands in the context of the current simulator instance. This can make the relaunch more reliable by starting with the simulator with known register values, device states, etc. * Improved `examples/pep001.pal`: * This program no longer gets stuck in the TSF loop on startup if you run it with the terminal unready for output. The terminal would typically be ready when launching this program from within OS/8, but it could get stuck in other conditions, such as when running it under a freshly started simulator: |
︙ | ︙ | |||
301 302 303 304 305 306 307 | allow building on other BSDs, but that is untested. * `scanswitch` now returns 127 on “no GPIO” rather than 255. * 16 months of maintenance and polishing: better documentation, build system improvements, etc. | | | | | | 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 | allow building on other BSDs, but that is untested. * `scanswitch` now returns 127 on “no GPIO” rather than 255. * 16 months of maintenance and polishing: better documentation, build system improvements, etc. [cc8m]: https://tangentsoft.com/pidp8i/doc/release/doc/cc8-manual.md [esco]: https://tangentsoft.com/pidp8i/doc/release/README.md#savestate [pv]: https://tangentsoft.com/pidp8i/doc/release/README.md#systemd [sc85]: https://github.com/ncb85/SmallC-85 [tctd]: https://tangentsoft.com/pidp8i/wiki?name=TD8E+vs+TC08 [v3df]: https://tangentsoft.com/pidp8i/wiki?name=OS/8+V3D+vs+V3F <a id="20171222"></a> ## Version 2017.12.22 — The "Languages and Custom OS/8 Disk Packs" Release * All prior versions of the PiDP-8/I software distribution included `os8.rk05`, a "Field Service Diagnostic" OS/8 disk pack image with uncertain provenance, configuration, and modification history. We have replaced that canned disk image with a script which is run at build time which programmatically assembles a set of clean OS/8 RK05 disk images from curated, pristine, tested sources based on the |
︙ | ︙ | |||
686 687 688 689 690 691 692 | * The binary OS images produced with this version automatically expand the root partition to fill your SD card. (Prior versions required that you manually do this with `raspi-config`.) * Assorted portability, build system, and documentation improvements. [apt]: https://linux.die.net/man/8/apt | | | | | | | | 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 | * The binary OS images produced with this version automatically expand the root partition to fill your SD card. (Prior versions required that you manually do this with `raspi-config`.) * Assorted portability, build system, and documentation improvements. [apt]: https://linux.die.net/man/8/apt [cc8rm]: https://tangentsoft.com/pidp8i/doc/release/doc/cc8-manual.md [csd]: https://tangentsoft.com/pidp8i/doc/release/doc/class-simh.md [dibas]: https://tangentsoft.com/pidp8i/wiki?name=Demos+in+BASIC [dt2vk]: https://github.com/VentureKing/Deeper-Thought-2 [gh508]: https://github.com/simh/simh/issues/508 [mbua]: https://serverfault.com/a/767079 [os8ct]: https://tangentsoft.com/pidp8i/wiki?name=OS/8+Console+TTY+Setup [os8lc]: https://tangentsoft.com/pidp8i/wiki?name=OS/8+LCSYS.BI+Disassembled [os8p]: https://tangentsoft.com/pidp8i/doc/release/doc/os8-patching.md [os8rm]: https://tangentsoft.com/pidp8i/doc/release/media/os8/README.md [pe1c]: https://tangentsoft.com/pidp8i/wiki?name=PEP001.C [pe1f2]: https://tangentsoft.com/pidp8i/wiki?name=PEP001.FT#fortran-ii [pe1f4]: https://tangentsoft.com/pidp8i/wiki?name=PEP001.FT#fortran-iv [pe1u]: https://tangentsoft.com/pidp8i/wiki?name=PEP001.FC [uwfm]: https://tangentsoft.com/pidp8i/doc/release/doc/uwfocal-manual.md [uwfs]: https://tangentsoft.com/pidp8i/doc/release/doc/uwfocal-manual-supp.md <a id="20170404"></a> ## Version 2017.04.04 * Removed the PDP-8 CPU idle detection feature. Oscar Vermeulen reports that it also interfered with NLS LED driving mode in his |
︙ | ︙ | |||
729 730 731 732 733 734 735 | rate to "50%" which not only achieves an even higher throttle rate than in earlier releases, it's reliable in the face of varying background CPU usage. See the single-core section of `README-throttle.md` for details. <a id="20170401"></a> | | | 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 | rate to "50%" which not only achieves an even higher throttle rate than in earlier releases, it's reliable in the face of varying background CPU usage. See the single-core section of `README-throttle.md` for details. <a id="20170401"></a> ## Version 2017.04.01 — The "I May Be a Fool, but I am *Your* Fool" Release * Added the `configure --alt-serial-mod` option to change the GPIO code to work with [James L-W's alternative serial mod][sm2]. * Increased the stock CPU throttle from 0.67 MIPS to 0.85 MIPS on most Pi 1 class devices, except for the Pi Zero which is a bit faster and so is able to run at 1.25 MIPS. |
︙ | ︙ | |||
1211 1212 1213 1214 1215 1216 1217 | This release and prior ones do have important changes to some of these files, so if you do not wish to overwrite your local changes with a `make mediainstall` command, you might want to diff the two versions and decide which changes to copy over or merge into your local files. [hltbug]: https://tangentsoft.com/pidp8i/info/f961906a5c24f5de | | | | 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 | This release and prior ones do have important changes to some of these files, so if you do not wish to overwrite your local changes with a `make mediainstall` command, you might want to diff the two versions and decide which changes to copy over or merge into your local files. [hltbug]: https://tangentsoft.com/pidp8i/info/f961906a5c24f5de [copying]: https://tangentsoft.com/pidp8i/doc/release/COPYING.md [rmth]: https://tangentsoft.com/pidp8i/doc/release/README-throttle.md <a id="20170105"></a> ## Version 2017.01.05 * Automated the process for merging in new SIMH updates. From within the PiDP-8/I software build directory, simply say `make simh-update` |
︙ | ︙ | |||
1244 1245 1246 1247 1248 1249 1250 | in its version string, so that if you report bugs upstream to the SIMH project, you can give them a version number that will be meaningful to them. (They don't care about our vYYYYMMDD release numbers or our Fossil checkin IDs.) <a id="20161226"></a> | | | 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 | in its version string, so that if you report bugs upstream to the SIMH project, you can give them a version number that will be meaningful to them. (They don't care about our vYYYYMMDD release numbers or our Fossil checkin IDs.) <a id="20161226"></a> ## Version 2016.12.26 — The Boxing Day Release * Tony Hill updated SIMH to the latest upstream version. This change represents about 15 months worth of work in the [upstream project][simh] — plus a fair bit of work by Tony to merge it all — so I will only summarize the improvements affecting the PDP-8 simulator here: |
︙ | ︙ | |||
1524 1525 1526 1527 1528 1529 1530 | In particular, the software now builds under Mac OS X, though it does not yet run properly. (The modified SimH PDP-8 simulator currently misbehaves if the PiDP-8/I panel is not present. Fixing this is on the radar.) * Fixed a bunch of bugs! | | | | 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 | In particular, the software now builds under Mac OS X, though it does not yet run properly. (The modified SimH PDP-8 simulator currently misbehaves if the PiDP-8/I panel is not present. Fixing this is on the radar.) * Fixed a bunch of bugs! [tlrm]: https://tangentsoft.com/pidp8i/doc/release/README.md [dupatch]: https://groups.google.com/forum/#!topic/pidp-8/fmjt7AD1gIA [dudis]: https://tangentsoft.com/pidp8i/tktview?name=e06f8ae936 [wiki]: https://tangentsoft.com/pidp8i/wcontent [ex]: https://tangentsoft.com/pidp8i/doc/release/examples/README.md [art]: https://tangentsoft.com/pidp8i/dir?c=trunk&name=labels [tix]: https://tangentsoft.com/pidp8i/tickets <a id="20151215"></a> ## Version 2015.12.15 * The last release of the software made by Oscar Vermeulen, the creator of the PiDP-8/I project. This version of the software derives from it, but differs in many ways. (See above.) Since May of 2017, this version of the software is now considered the current stable version. |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
1 2 3 4 5 6 7 8 9 | ######################################################################## # Makefile.in - Processed by autosetup's configure script to generate # the GNU make(1) file for building the PiDP-8/I software. # # If you are seeing this at the top of a file called Makefile and you # intend to make edits, do that in Makefile.in. Saying "make" will then # re-build Makefile from that modified Makefile.in before proceeding to # do the "make" operation. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ######################################################################## # Makefile.in - Processed by autosetup's configure script to generate # the GNU make(1) file for building the PiDP-8/I software. # # If you are seeing this at the top of a file called Makefile and you # intend to make edits, do that in Makefile.in. Saying "make" will then # re-build Makefile from that modified Makefile.in before proceeding to # do the "make" operation. # # Copyright © 2015 by Oscar Vermeulen, © 2016-2021 by Warren Young # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to |
︙ | ︙ | |||
32 33 34 35 36 37 38 | # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## # Git commit ID and time of the latest version of the SIMH 4 project on # GitHub that has been merged into this source base. | | | | | > > > > > > > > | 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## # Git commit ID and time of the latest version of the SIMH 4 project on # GitHub that has been merged into this source base. SGCID=ab48f31317f63943cf36995d2e29feb16d122b36 SGCTM=2021-04-20T18:37:32+02:00 # C build flags for the PDP-8 simulator and its PiDP-8/I extensions. SIM_CFLAGS := @CFLAGS@ @PI_CFLAGS@ @BUILDMODE@ \ -Wno-unused-result -Wno-parentheses \ -DUSE_READER_THREAD -DHAVE_DLOPEN=$(subst .,,@SH_SOEXT@) -DPIDP8I \ -DSIM_ASYNCH_IO -DHAVE_GLOB \ -DSIM_GIT_COMMIT_ID=$(SGCID) -DSIM_GIT_COMMIT_TIME=$(SGCTM) \ -DSIM_BUILD_TOOL='autosetup+gmake' \ -D_GNU_SOURCE \ -U__STRICT_ANSI__ \ -I @srcdir@/src/SIMH -I @srcdir@/src/pidp8i -I src -I src/SIMH -I src/pidp8i ifneq "@HAVE_PCRE_H@" "0" SIM_CFLAGS += -DHAVE_PCRE_H SIM_LFLAGS := -lpcre endif ifneq "@HAVE_PCREPOSIX_H@" "0" SIM_CFLAGS += -DHAVE_PCREPOSIX_H endif PIDP8I_CFLAGS = $(SIM_CFLAGS) SIMH_CFLAGS = $(SIM_CFLAGS) SIMH_PDP8_CFLAGS = $(SIM_CFLAGS) # Greatly stripped-down build options for the cc8 cross-compiler # primarily because it's K&R C. Building under SIM_CFLAGS spews # pages of warnings. The only thing we share is whether to build |
︙ | ︙ | |||
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | BINS = $(PIDP8I_SIM) @CC8_CROSS@ \ bin/d8tape \ bin/palbart \ bin/pidp8i-test \ bin/ptp2txt \ libexec/scanswitch BIN_SCRIPTS = \ bin/pidp8i \ bin/usb-mount \ @srcdir@/bin/teco-pi-demo # Some *.py files are generated by Autosetup, so they need different # handling than the other libraries for the out-of-tree build case. PIDP8I_DIRS := lib/pidp8i/dirs.py PIDP8I_DIN := @srcdir@/$(PIDP8I_DIRS).in GENNED_PY := \ lib/pidp8i/__init__.py \ lib/pidp8i/ips.py \ lib/pidp8i/os8opts.py \ $(PIDP8I_DIRS) SIMH_PY := lib/simh.py SIMH_PY_SRC := @srcdir@/$(SIMH_PY) OS8RUN = bin/os8-run OS8SCRIPT := lib/os8script.py OS8RUN_PY_ALL := $(GENNED_PY) $(OS8SCRIPT) $(SIMH_PY_SRC) OS8RUN_SRCS := $(OS8RUN) $(OS8RUN_PY_ALL) $(PIDP8I_DIN) # If you edit this directory list, you should probably also edit # the argument list to the mkadrules call in auto.def! BUILDDIRS := \ bin \ libexec \ obj/cc8/cross \ obj/cc8/os8 \ obj/d8tape \ obj/misc \ obj/palbart \ obj/pidp8i \ obj/SIMH \ obj/SIMH/PDP8 INSTDIRS := bin etc lib/pidp8i libexec \ share/boot share/include share/man/man1 share/media/os8 share/save | > > > > > > > | 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | BINS = $(PIDP8I_SIM) @CC8_CROSS@ \ bin/d8tape \ bin/palbart \ bin/pidp8i-test \ bin/ptp2txt \ libexec/scanswitch BIN_SCRIPTS = \ bin/os8pkg \ bin/pidp8i \ bin/usb-mount \ @srcdir@/bin/teco-pi-demo # Some *.py files are generated by Autosetup, so they need different # handling than the other libraries for the out-of-tree build case. PIDP8I_DIRS := lib/pidp8i/dirs.py PIDP8I_DIN := @srcdir@/$(PIDP8I_DIRS).in GENNED_PY := \ lib/pidp8i/__init__.py \ lib/pidp8i/ips.py \ lib/pidp8i/os8opts.py \ $(PIDP8I_DIRS) SIMH_PY := lib/simh.py SIMH_PY_SRC := @srcdir@/$(SIMH_PY) # Any use of $(OS8RUN) must implicitly depend on $(OS8_TOOLTIME) disk image. OS8RUN = bin/os8-run # Any use of $(OS8CP) must implicitly depend on $(OS8_TOOLTIME) disk image. OS8CP = bin/os8-cp OS8SCRIPT := lib/os8script.py OS8RUN_PY_ALL := $(GENNED_PY) $(OS8SCRIPT) $(SIMH_PY_SRC) OS8RUN_SRCS := $(OS8RUN) $(OS8RUN_PY_ALL) $(PIDP8I_DIN) # If you edit this directory list, you should probably also edit # the argument list to the mkadrules call in auto.def! BUILDDIRS := \ bin \ libexec \ obj/cc8/cross \ obj/cc8/os8 \ obj/d8tape \ obj/misc \ obj/palbart \ obj/os8pkg \ obj/pidp8i \ obj/SIMH \ obj/SIMH/PDP8 INSTDIRS := bin etc lib/pidp8i libexec \ share/boot share/include share/man/man1 share/media/os8 share/save |
︙ | ︙ | |||
165 166 167 168 169 170 171 | obj/cc8/cross/main.o \ obj/cc8/cross/preproc.o \ obj/cc8/cross/primary.o \ obj/cc8/cross/stmt.o \ obj/cc8/cross/struct.o \ obj/cc8/cross/sym.o \ obj/cc8/cross/while.o | < < < < < < < < < < < < < < < | 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | obj/cc8/cross/main.o \ obj/cc8/cross/preproc.o \ obj/cc8/cross/primary.o \ obj/cc8/cross/stmt.o \ obj/cc8/cross/struct.o \ obj/cc8/cross/sym.o \ obj/cc8/cross/while.o D8TAPE_OBJS := \ obj/d8tape/dasm.o \ obj/d8tape/flow.o \ obj/d8tape/main.o \ obj/d8tape/version.o |
︙ | ︙ | |||
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 | # # The rest have no special treatment. OS8RUN_INFILES = \ @srcdir@/lib/pidp8i/__init__.py.in \ @srcdir@/lib/pidp8i/ips.py.in \ @srcdir@/media/os8/init.tx.in \ @srcdir@/media/os8/3finit.tx.in \ @srcdir@/src/pidp8i/main.c.in \ $(PIDP8I_DIN) PRECIOUS_INFILES = \ @srcdir@/Makefile.in \ @srcdir@/examples/Makefile.in \ @srcdir@/src/Makefile.in \ @srcdir@/src/cc8/Makefile.in \ @srcdir@/src/SIMH/Makefile.in \ @srcdir@/src/SIMH/PDP8/Makefile.in INFILES = \ @srcdir@/bin/os8-cp.in \ @srcdir@/bin/pidp8i.in \ @srcdir@/boot/0.script.in \ @srcdir@/boot/2.script.in \ @srcdir@/boot/3.script.in \ @srcdir@/boot/4.script.in \ @srcdir@/boot/6.script.in \ @srcdir@/boot/7.script.in \ @srcdir@/boot/run.script.in \ @srcdir@/boot/run-v3f.script.in \ @srcdir@/boot/tss8.script.in \ @srcdir@/etc/pidp8i.service.in \ @srcdir@/etc/sudoers.in \ @srcdir@/etc/usb-mount@.service.in \ @srcdir@/src/pidp8i/gpio-common.c.in \ @srcdir@/tools/simh-update.in \ $(OS8RUN_INFILES) OS8RUN_OUTFILES := $(subst @srcdir@/,,$(OS8RUN_INFILES)) OS8RUN_OUTFILES := $(subst .in,,$(OS8RUN_OUTFILES)) PRECIOUS_OUTFILES := $(subst @srcdir@/,,$(PRECIOUS_INFILES)) PRECIOUS_OUTFILES := $(subst .in,,$(PRECIOUS_OUTFILES)) OUTFILES := $(subst @srcdir@/,,$(INFILES)) OUTFILES := $(subst .in,,$(OUTFILES)) | > > > > > > > > > < | > > > > > > > | > > > > > > > > > > | | | > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > < < | | | > > | | | | | | < | | < < < < < < < | | | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | > > > | | | | < < < < < < < < < < < < < < < < < < < < < < < < < < < | < | | | | | | | > | 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 | # # The rest have no special treatment. OS8RUN_INFILES = \ @srcdir@/lib/pidp8i/__init__.py.in \ @srcdir@/lib/pidp8i/ips.py.in \ @srcdir@/media/os8/init.tx.in \ @srcdir@/media/os8/3finit.tx.in \ @srcdir@/media/os8/ock-init.tx.in \ @srcdir@/src/pidp8i/main.c.in \ $(PIDP8I_DIN) PRECIOUS_INFILES = \ @srcdir@/Makefile.in \ @srcdir@/examples/Makefile.in \ @srcdir@/src/Makefile.in \ @srcdir@/src/cc8/Makefile.in \ @srcdir@/src/SIMH/Makefile.in \ @srcdir@/src/SIMH/PDP8/Makefile.in INFILES = \ @srcdir@/tools/os8-progtest.in \ @srcdir@/bin/os8pkg.in \ @srcdir@/bin/os8-cp.in \ @srcdir@/tools/os8-cmp.in \ @srcdir@/bin/os8-run.in \ @srcdir@/bin/teco-pi-demo.in \ @srcdir@/bin/pidp8i.in \ @srcdir@/boot/0.script.in \ @srcdir@/boot/2.script.in \ @srcdir@/boot/3.script.in \ @srcdir@/boot/4.script.in \ @srcdir@/boot/6.script.in \ @srcdir@/boot/7.script.in \ @srcdir@/boot/run.script.in \ @srcdir@/boot/run-v3f.script.in \ @srcdir@/boot/tss8.script.in \ @srcdir@/etc/pidp8i.service.in \ @srcdir@/etc/sudoers.in \ @srcdir@/etc/usb-mount@.service.in \ @srcdir@/lib/os8script.py.in \ @srcdir@/lib/simh.py.in \ @srcdir@/src/pidp8i/gpio-common.c.in \ @srcdir@/tools/simh-bisect.in \ @srcdir@/tools/simh-update.in \ $(OS8RUN_INFILES) OS8RUN_OUTFILES := $(subst @srcdir@/,,$(OS8RUN_INFILES)) OS8RUN_OUTFILES := $(subst .in,,$(OS8RUN_OUTFILES)) PRECIOUS_OUTFILES := $(subst @srcdir@/,,$(PRECIOUS_INFILES)) PRECIOUS_OUTFILES := $(subst .in,,$(PRECIOUS_OUTFILES)) OUTFILES := $(subst @srcdir@/,,$(INFILES)) OUTFILES := $(subst .in,,$(OUTFILES)) OS8_SRC_RK05 = @OS8_SRC_RK05@ OS8_BASELINE = bin/@OS8_BASELINE@ OS8_TOOLTIME = bin/@OS8_TOOLTIME@ # auto.defs will select as OS8_RUNTIME either V3D_RUNTIME or OCK_RUNTIME disk image. V3D_RUNTIME = bin/v3d.rk05 OCK_RUNTIME = bin/ock.rk05 OS8_RUNTIME = bin/@OS8_RUNTIME@ OS8_RK05S = \ $(OS8_BASELINE) \ $(V3D_RUNTIME) \ $(OS8_SRC_RK05) \ $(OS8_OCK_DIST_RK05) \ $(OS8_OCK_PATCHED_RK05) \ $(OCK_RUNTIME) INC_SCRIPTS_DIR = @srcdir@/scripts/include MISC_SCRIPTS_DIR = @srcdir@/scripts/misc OS8_SCRIPTS_DIR = @srcdir@/scripts/os8 V3D_DIST_SCRIPT = $(OS8_SCRIPTS_DIR)/v3d/dist-rk05.os8 V3D_SRC_SCRIPT = $(OS8_SCRIPTS_DIR)/v3d/src-rk05.os8 V3D_PATCH_SCRIPT = $(OS8_SCRIPTS_DIR)/v3d/patch-rk05.os8 V3D_RK05_SCRIPT = $(OS8_SCRIPTS_DIR)/v3d/boot-rk05.os8 V3F_SRCDIR = @srcdir@/src/os8/v3f V3F_BUILD_RK05 = obj/v3f-build.rk05 V3F_MANIFEST = actions.txt V3F_MADE_RK05 = bin/v3f-made.rk05 V3F_MAKER = $(OS8_SCRIPTS_DIR)/v3f/control.os8 # OS/8 Combined Kit. Build from Source. # We build each object rk05 image in one large script # Because otherwise mmake would have terrible race conditions. # We cut the tree up into chunks to fit them on rk05 images: # SYS: The System Head and device Handlers and key system CUSPS. # CUSPS: The remaining Commonly Used System Programs (CUSPS) # BF2: BASIC and FORTRAN II # FIV: FORTRAN IV OS8_OCK_SRCDIR = @srcdir@/src/os8/ock OS8_OCK_SYS_SRC_RK05 = obj/ock-sys-src.rk05 OS8_OCK_SYS_OBJ_RK05 = bin/ock-sys-obj.rk05 OS8_OCK_SYS_MAKER = $(OS8_SCRIPTS_DIR)/ock/sys-build.os8 OS8_OCK_CUSPS_SRC_RK05 = obj/ock-cusps-src.rk05 OS8_OCK_CUSPS_OBJ_RK05 = bin/ock-cusps-obj.rk05 OS8_OCK_CUSPS_MAKER = $(OS8_SCRIPTS_DIR)/ock/cusps-build.os8 OS8_OCK_BF2_SRC_RK05 = obj/ock-bf2-src.rk05 OS8_OCK_BF2_OBJ_RK05 = bin/ock-bf2-obj.rk05 OS8_OCK_BF2_MAKER = $(OS8_SCRIPTS_DIR)/ock/bf2-build.os8 OS8_OCK_FIV_SRC_RK05 = obj/ock-fiv-src.rk05 OS8_OCK_FIV_OBJ_RK05 = bin/ock-fiv-obj.rk05 OS8_OCK_FIV_MAKER = $(OS8_SCRIPTS_DIR)/ock/fiv-build.os8 OS8_OCK_DIST_RK05 = bin/ock-dist.rk05 OS8_OCK_DIST_MAKER = $(OS8_SCRIPTS_DIR)/ock/dist-rk05.os8 OS8_OCK_PATCHED_RK05 = bin/ock-patched.rk05 OS8_OCK_PATCHED_MAKER = $(OS8_SCRIPTS_DIR)/ock/patch-rk05.os8 OS8_OCK_BOOT_MAKER = $(OS8_SCRIPTS_DIR)/ock/boot-rk05.os8 ALL_TU56_SCRIPT = $(OS8_SCRIPTS_DIR)/all-tu56.os8 CUSP_COPYIN_SCRIPT = $(INC_SCRIPTS_DIR)/cusp-copyin.os8 OS8_BOOT_TAPE = bin/@OS8_BOOT_TAPE@ V3D_TC08_TU56 = bin/v3d-tc08.tu56 V3D_TD12K_TU56 = bin/v3d-td12k.tu56 V3F_TC08_TU56 = bin/v3f-tc08.tu56 V3F_TD12K_TU56 = bin/v3f-td12k.tu56 V3F_BOOT_TAPE= bin/v3f-@OS8_TAPE_DEVICE@.tu56 # Absolute version of --prefix passed to configure. PREFIX = @ABSPREFIX@ # Normally unset. Prepended to PREFIX to install files to a # different tree than / (e.g. for distribution build/CI scripts). # https://www.gnu.org/prep/standards/html_node/DESTDIR.html DESTDIR = RCFILE := $(PREFIX)/etc/pidp8i.rc CLTXT = /boot/cmdline.txt ADF := adrules.mk OS8_PKGS_SELECTED = @OS8_PKGS_SELECTED@ OS8_PKGS_SELECTED_NAMES = @OS8_PKGS_SELECTED_NAMES@ PKGS_INCLUDE = obj/os8pkg/pkgs.os8 #### TARGETS ########################################################### .PHONY: all tags .PRECIOUS: $(PRECIOUS_OUTFILES) all: \ $(OUTFILES) $(PRECIOUS_OUTFILES) \ $(BUILDDIRS) $(BINS) $(BOOTSCRIPTS) $(LISTINGS) \ $(ASM_PTS) $(FC_EX_PTS) $(PAL_EX_PTS) \ $(OS8_TOOLTIME) pkg_all \ $(OS8_RK05S) $(V3F_MADE_RK05) $(V3D_TC08_TU56) \ $(V3D_TD12K_TU56) $(V3F_TC08_TU56) $(V3F_TD12K_TU56) clean: @rm -f $(BINS) $(BOOTSCRIPTS) $(ASM_PTS) $(PAL_EX_PTS) $(LISTINGS) \ $(OUTFILES) $(ADF) \ config.log cscope.out tags \ bin/*.pt bin/*.rk05 bin/*.save bin/*.tu56 bin/txt2ptp \ lib/*.pyc lib/*/*.pyc lib/pidp8i/dirs.py lib/pidp8i/ips.py \ obj/*.log obj/*.pt obj/os8.opts obj/os8pkg/* \ src/config.h src/e8/e8defs.pa \ @srcdir@/examples/*.err @find obj \( -name \*.o -o -name \*.d \) -delete @-rmdir -p $(BUILDDIRS) 2> /dev/null || true distclean: clean @rm -f \ $(PRECIOUS_OUTFILES) \ config.log \ autosetup/jimsh0 \ src/config.h ctags tags: ctags -R @srcdir@/src @srcdir@/lib ifeq (@HAVE_PROG_CSCOPE@, 1) cscope -bR -s@srcdir@ endif install: install-target install-system install-target: all instdirs @echo Installing to $(PREFIX)... @# Install most bin/* stuff and set their perms @for f in $(BINS) ; do \ dest=$(PREFIX)/$$f ; \ echo "Installing binary $$dest..." ; \ @INSTALL@ -m 755 -D -s $$f $(DESTDIR)$$dest ; \ done @for f in $(BIN_SCRIPTS) ; do \ dest=$(PREFIX)/bin/$$(basename $$f) ; \ echo "Installing script $$dest..." ; \ @INSTALL@ -m 755 -D $$f $(DESTDIR)$$dest ; \ done @echo "Installing txt2ptp symlink..." @ln -f $(DESTDIR)$(PREFIX)/bin/ptp2txt $(DESTDIR)$(PREFIX)/bin/txt2ptp @( test -e $(DESTDIR)@MEDIADIR@/os8/os8.rk05 || \ test -e $(DESTDIR)@MEDIADIR@/os8/os8v3d-bin.rk05 || \ test -e $(DESTDIR)@MEDIADIR@/os8/v3d.rk05) && \ echo "Skipping media image and SIMH boot script reinstall." || \ $(MAKE) mediainstall @ln -f $(DESTDIR)$(PREFIX)/bin/pidp8i-sim $(DESTDIR)$(PREFIX)/bin/pdp8 # run w/o PiDP-8/I extensions @# Install CC8 stuff if built @test -n "@CC8_CROSS@" && \ echo "Installing cc8 cross-compiler..." ; \ @INSTALL@ -m 755 bin/cc8 $(DESTDIR)$(PREFIX)/bin && \ @INSTALL@ -m 644 @srcdir@/src/cc8/include/* $(DESTDIR)$(PREFIX)/share/include @# Install palbart stuff @@INSTALL@ -m 755 bin/palbart $(DESTDIR)$(PREFIX)/bin @@INSTALL@ -m 644 @srcdir@/src/palbart/palbart.1 $(DESTDIR)$(PREFIX)/share/man/man1 @# Install os8-run and its dependencies @echo "Installing os8-run..." @@INSTALL@ -m 775 -g @INSTGRP@ $(OS8RUN) $(DESTDIR)$(PREFIX)/bin @( for src in $(OS8RUN_PY_ALL) ; do \ test -e $$src || src=@srcdir@/$$src ; \ dest=$(PREFIX)/$$(echo $$src | sed -e 's_^@srcdir@/__') ; \ echo "Installing $$src to $$dest..." ; \ @INSTALL@ -m 644 -g @INSTGRP@ -D $${src} $(DESTDIR)$${dest} ; \ done \ ) @sed -e 's#^build =.*#build = "$(PREFIX)"#' \ -e 's#^media =.*#media = os.path.join (build, "share/media/")#' \ -e 's#^os8mo =.*#os8mo = os8mi#' \ < $(PIDP8I_DIRS) > $(DESTDIR)$(PREFIX)/$(PIDP8I_DIRS) @chgrp @INSTGRP@ $(DESTDIR)$(PREFIX)/$(PIDP8I_DIRS) @# We need a directory for PIDs and such in some cases @@INSTALL@ -d -m 755 $(DESTDIR)$(PREFIX)/run install-system: install-target @echo Installing system files and programs... @(test -x /sbin/setcap && \ for f in $(PREFIX)/bin/pidp8i-* ; do \ echo "Setting real-time priority capabilities on $$(basename $$f)..." ; \ /sbin/setcap 'cap_sys_nice=eip' $(DESTDIR)$$f ; \ done \ ) || true @# If this is a Debian-type system, install needed helper programs @test -x /usr/bin/apt-get -a ! -x /usr/bin/screen && apt-get -y install screen || true @# Remove usbmount: we've replaced that with bin/usb-mount and friends. @(test -x /usr/bin/apt-get -a -d /etc/usbmount && \ apt-get -y remove usbmount > /dev/null 2>&1 \ ) || true ifeq (@USB_AUTOMOUNT@, 1) @# Install the usb-mount systemd unit file and udev rules @( test -d /etc/systemd && \ @INSTALL@ -m 644 etc/usb-mount@.service /etc/systemd/system && \ @INSTALL@ -m 644 @srcdir@/etc/udev.rules /etc/udev/rules.d/68-usb-mount.rules && \ sed -i -e 's/MountFlags=slave/MountFlags=shared/' \ /lib/systemd/system/systemd-udevd.service && \ /bin/systemctl daemon-reload && \ udevadm control --reload-rules && \ udevadm trigger \ ) || true endif @# Disable competing services if this is a Raspberry Pi @(test -x /bin/systemctl && /bin/systemctl disable deeper pidp8 2> /dev/null || true) @# Get rid of the old SysV init file if upgrading an older system. @(test -e /etc/init.d/pidp8i -a -e /etc/rc5.d/S*pidp8i && \ /bin/systemctl disable pidp8i && \ rm -f /etc/init.d/pidp8i \ ) || true @# Install the systemd unit file if this system is systemd based. @(test -x /bin/systemctl && \ sudo -i -u @INSTUSR@ $(DESTDIR)$(PREFIX)/bin/pidp8i install && \ /bin/loginctl enable-linger @INSTUSR@ \ ) || true @# Give the install user permission to use GPIO if done on a Pi @grep -q '^gpio:' /etc/group && usermod -a -G gpio @INSTUSR@ || true @# Give the install user permission to shut down and reboot the Pi @# if this is a systemd/sudo based system. @( test -d /etc/sudoers.d -a -w /etc/sudoers.d -a -x /bin/systemctl && \ @INSTALL@ -m 440 -o root -g root @srcdir@/etc/sudoers \ /etc/sudoers.d/099_pidp8i \ ) || true @# Install runtime config file if there isn't one there already. @test -f $(DESTDIR)$(RCFILE) || @INSTALL@ -m 644 -o @INSTUSR@ @srcdir@/etc/pidp8i.rc $(DESTDIR)$(RCFILE) @# Add installation bin dir to the non-root user's PATH unless it's @# already in there or we aren't running under sudo. @(for p in .profile .bash_profile ; do \ test -n "$$SUDO_USER" -a -w "/home/$$SUDO_USER/$$p" && \ ! grep -qF "$(PREFIX)/bin" "/home/$$SUDO_USER/$$p" && \ echo "export PATH=\$$PATH:$(PREFIX)/bin" >> "/home/$$SUDO_USER/$$p" ; \ done) || true @# Ditto for MANPATH @(for p in .profile .bash_profile ; do \ test -n "$$SUDO_USER" -a -w "/home/$$SUDO_USER/$$p" && \ ! grep -qF "$(PREFIX)/share/man" "/home/$$SUDO_USER/$$p" && \ echo "export MANPATH=\$$MANPATH:$(PREFIX)/share/man" >> "/home/$$SUDO_USER/$$p" ; \ done \ ) || true @# If serial mod is disabled, turn off serial console and kgdb stuff @# in case they were enabled previously, else they will fight with @# our use of GPIO. @( test -z "@PCB_SERIAL_MOD_ANY@" -a -r $(CLTXT) && ! -w $(CLTXT) && \ cp -p $(CLTXT) "$(CLTXT)"_orig && \ sed -e 's/console\=[a-zA-Z0-9]+,[0-9]+ //' \ -e 's/kgdboc\=[a-zA-Z0-9]+,[0-9]+ //' -i $(CLTXT) \ ) || true instdirs: @echo "Creating installation directory tree..." @for d in $(INSTDIRS) ; do @INSTALL@ -m 755 -o @INSTUSR@ -g @INSTGRP@ -d $(DESTDIR)$(PREFIX)/$$d ; done mediainstall: instdirs @echo "[Re]installing OS and program media..." @cd @srcdir@ ; \ find media \( \ -name \*.bin -o \ -name \*.dsk -o \ -name \*.rk05 -o \ -name \*.tu56 \ \) -exec @INSTALL@ -D -m 664 -o @INSTUSR@ -g @INSTGRP@ {} $(DESTDIR)$(PREFIX)/share/{} \; @@INSTALL@ -m 644 -o @INSTUSR@ -g @INSTGRP@ bin/*.rk05 $(DESTDIR)$(PREFIX)/share/media/os8 @@INSTALL@ -m 644 -o @INSTUSR@ -g @INSTGRP@ bin/*.tu56 $(DESTDIR)$(PREFIX)/share/media/os8 for f in boot/*.script ; do \ sed -e 's#%HOME%/\.pidp8i-#@SHAREDIR@/save/#' < $$f > $(DESTDIR)@SHAREDIR@/$$f ; \ chown @INSTUSR@:@INSTGRP@ $(DESTDIR)@SHAREDIR@/$$f ; \ chmod 664 $(DESTDIR)@SHAREDIR@/$$f ; \ done # Called by test-os8-run # Minimizes dependencies to provoke minimal rebuilds. # Builds cc8.tu56, copying in rather than rebuilding source and demo files. os8-sys: test-tmp-tools $(OS8RUN)@OS8_OPTS@ $(V3D_DIST_SCRIPT) $(OS8RUN)@OS8_OPTS@ $(V3D_PATCH_SCRIPT) $(OS8RUN)@OS8_OPTS@ $(V3D_RK05_SCRIPT) reconfig: find . -name \*.d -delete @AUTOREMAKE@ release: all @srcdir@/tools/mkrel run: $(PIDP8I_SIM) @-libexec/scanswitch > /dev/null ; \ |
︙ | ︙ | |||
539 540 541 542 543 544 545 546 547 548 549 550 551 552 | test-tmp-tools: @echo "Installing os8-run dependencies..." @( for src in $(OS8RUN_PY_ALL) ; do \ test -e $$src || src=@srcdir@/$$src ; \ dest=./$$(echo $$src | sed -e 's_^@srcdir@/__') ; \ echo "Installing $$src to $$dest..." ; \ @INSTALL@ -m 644 -g @INSTGRP@ -D $${src} $${dest} ; \ @INSTALL@ -m 644 -g @INSTGRP@ -D $${src}c $${dest}c ; \ done \ ) @( for src in $(TEST_TMP_BINS) ; do \ test -e $$src || src=@srcdir@/$$src ; \ dest=./$$(echo $$src | sed -e 's_^@srcdir@/__') ; \ echo "Installing $$src to $$dest..." ; \ | > | 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 | test-tmp-tools: @echo "Installing os8-run dependencies..." @( for src in $(OS8RUN_PY_ALL) ; do \ test -e $$src || src=@srcdir@/$$src ; \ dest=./$$(echo $$src | sed -e 's_^@srcdir@/__') ; \ echo "Installing $$src to $$dest..." ; \ @INSTALL@ -m 644 -g @INSTGRP@ -D $${src} $${dest} ; \ ! test -e $${src}c || \ @INSTALL@ -m 644 -g @INSTGRP@ -D $${src}c $${dest}c ; \ done \ ) @( for src in $(TEST_TMP_BINS) ; do \ test -e $$src || src=@srcdir@/$$src ; \ dest=./$$(echo $$src | sed -e 's_^@srcdir@/__') ; \ echo "Installing $$src to $$dest..." ; \ |
︙ | ︙ | |||
579 580 581 582 583 584 585 586 587 588 589 590 | # the updated init.tx file, not before. We needn't even make it an # order-only prereq because configure and the INFILES rules above ensure # that it always exists. V3D_DIST_SRCS := \ $(OS8RUN) $(PIDP8I_DIN) \ lib/pidp8i/dirs.py \ $(V3D_DIST_SCRIPT) \ @srcdir@/media/os8/al-*-ba-*.tu56 \ @srcdir@/media/os8/subsys/*.tu56 # Temporary: We depend on ALL the patches, but really we've picked them over. V3D_PATCHES := \ | > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | > > > > > > > > > > > > > > > > > > > > > > > > > > | | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | < < < < | 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 | # the updated init.tx file, not before. We needn't even make it an # order-only prereq because configure and the INFILES rules above ensure # that it always exists. V3D_DIST_SRCS := \ $(OS8RUN) $(PIDP8I_DIN) \ lib/pidp8i/dirs.py \ $(V3D_DIST_SCRIPT) \ @srcdir@/src/os8/v3d/SYSTEM/LCSYS.BI \ @srcdir@/src/os8/v3d/SYSTEM/UCSYS.BI \ @srcdir@/src/os8/v3d/BASIC/LCBAS.BI \ @srcdir@/src/os8/v3d/BASIC/UCBAS.BI \ @srcdir@/media/os8/al-*-ba-*.tu56 \ @srcdir@/media/os8/subsys/*.tu56 # Temporary: We depend on ALL the patches, but really we've picked them over. V3D_PATCHES := \ @srcdir@/patches/os8/v3d/*.patch8 # Dependency on the contents of the v3f source directory. V3F_SOURCES := \ @srcdir@/src/os8/v3f/*.PA \ @srcdir@/src/os8/v3f/*.MA \ @srcdir@/src/os8/v3f/*.BI # Dependency on the contents of the ock source directory. OS8_OCK_SYS_SOURCES := \ @srcdir@/src/os8/ock/SYSTEM/*.PA \ @srcdir@/src/os8/ock/SYSTEM/*.MA \ @srcdir@/src/os8/ock/SYSTEM/*.BI \ @srcdir@/src/os8/ock/HANDLERS/*.PA \ @srcdir@/src/os8/ock/CUSPS/*.MA \ @srcdir@/src/os8/ock/CUSPS/*.BI \ @srcdir@/src/os8/ock/CUSPS/*.HL OS8_OCK_CUSPS_SOURCES :=\ @srcdir@/src/os8/ock/CUSPS/*.PA OS8_OCK_BF2_SOURCES := \ @srcdir@/src/os8/ock/LANGUAGE/BASIC/*.PA \ @srcdir@/src/os8/ock/LANGUAGE/BASIC/*.BA \ @srcdir@/src/os8/ock/LANGUAGE/BASIC/*.BI \ @srcdir@/src/os8/ock/LANGUAGE/FORTRAN2/*.PA \ @srcdir@/src/os8/ock/LANGUAGE/FORTRAN2/*.CO \ @srcdir@/src/os8/ock/LANGUAGE/FORTRAN2/LIBRARY/*.SB OS8_OCK_FIV_SOURCES := \ @srcdir@/src/os8/ock/LANGUAGE/FORTRAN4/*.PA \ @srcdir@/src/os8/ock/LANGUAGE/FORTRAN4/*.BI \ @srcdir@/src/os8/ock/LANGUAGE/FORTRAN4/LIBRARY/*.RA # We could make FIV conditional here. OS8_OCK_DIST_SRCS := \ $(OS8RUN) $(PIDP8I_DIN) \ lib/pidp8i/dirs.py \ $(OS8_OCK_DIST_MAKER) \ @srcdir@/media/os8/al-*-ba-*.tu56 \ @srcdir@/media/os8/subsys/*.tu56 \ $(OS8_OCK_SYS_OBJ_RK05) $(OS8_OCK_CUSPS_OBJ_RK05) \ $(OS8_OCK_BF2_OBJ_RK05) $(OS8_OCK_FIV_OBJ_RK05) OCK_PATCHES := \ @srcdir@/patches/os8/ock/*.patch8 $(OS8_BASELINE): $(V3D_DIST_SRCS) | $(PIDP8I_SIM) $(OS8RUN_OUTFILES) $(OS8RUN)@OS8_OPTS@ $(V3D_DIST_SCRIPT) $(OS8_TOOLTIME): $(V3D_PATCH_SCRIPT) $(OS8_BASELINE) $(V3D_PATCHES) | $(PIDP8I_SIM) $(OS8RUN_OUTFILES) $(OS8RUN)@OS8_OPTS@ $(V3D_PATCH_SCRIPT) -include obj/os8pkg/*.mk # Extension of "all" rule to build all packages now that we've included # the rules for doing so. If you move the autosetup variable below into # the "all" target dependency list, it won't work because it references # undefined variables. pkg_all:@OS8_PKGS_ALL@ test: all tools/os8-progtest -x @OS8_PKGS_TESTING@ $(V3D_RUNTIME): $(V3D_RK05_SCRIPT) $(OS8_TOOLTIME) $(PKGS_INCLUDE) $(OS8_PKGS_SELECTED) | $(PIDP8I_SIM) $(OS8RUN_OUTFILES) $(OS8RUN) @OS8_OPTS@ $(V3D_RK05_SCRIPT) $(OS8_OCK_PATCHED_RK05): $(OS8_OCK_PATCHED_MAKER) $(OS8_OCK_DIST_RK05) $(OCK_PATCHES) | $(PIDP8I_SIM) $(OS8RUN_OUTFILES) $(OS8RUN)@OS8_OPTS@ $(OS8_OCK_PATCHED_MAKER) $(OCK_RUNTIME): $(OS8_OCK_BOOT_MAKER) $(OS8_OCK_PATCHED_RK05) $(PKGS_INCLUDE) $(OS8_PKGS_SELECTED) | $(PIDP8I_SIM) $(OS8RUN_OUTFILES) $(OS8RUN)@OS8_OPTS@ $(OS8_OCK_BOOT_MAKER) # To build the magic includer, we should depend on all the created packages. # Then a newly created one that we care about will drive creation of the include script. $(PKGS_INCLUDE): $(OS8_PKGS_SELECTED) bin/os8pkg include $(OS8_PKGS_SELECTED_NAMES) # Also build an OS/8 source disk, as a convenience to avoid the # need to mount up the 7 source tapes in succession. # # Using an order-only dependency for the simulator and the bin disk: we # only need *a* version of each, they don't have to be recent! OS8_SRC_SRCS = \ $(OS8RUN) $(PIDP8I_DIN) \ lib/pidp8i/dirs.py \ $(V3D_SRC_SCRIPT) \ @srcdir@/media/os8/al-*-sa-*.tu56 $(OS8_SRC_RK05): $(OS8_BASELINE) $(OS8_SRC_SRCS) | $(PIDP8I_SIM) $(OS8_TOOLTIME) $(OS8RUN)@OS8_OPTS@ $(V3D_SRC_SCRIPT) # Build the source disk for OS/8 V3F $(V3F_BUILD_RK05): $(V3F_SRCDIR)/$(V3F_MANIFEST) $(V3F_SOURCES) | $(OS8_TOOLTIME) rm -f $(V3F_BUILD_RK05) cd $(V3F_SRCDIR); @builddir@/$(OS8CP) -v --action-file $(V3F_MANIFEST) # Make a disk with binaries assembled from the V3F source disk $(V3F_MADE_RK05): $(V3F_BUILD_RK05) $(V3F_MAKER) $(OS8RUN) $(V3F_MAKER) # Build the source disk for OS/8 OCK SYS Component. $(OS8_OCK_SYS_SRC_RK05): $(OS8_OCK_SYS_SOURCES) | $(OS8_TOOLTIME) @builddir@/$(OS8CP) -v -rk1 $(OS8_OCK_SYS_SRC_RK05) -z -a $(OS8_OCK_SYS_SOURCES) RKA1: # Make a disk with binaries assembled from the OS8_OCK SYS source disk $(OS8_OCK_SYS_OBJ_RK05): $(OS8_OCK_SYS_SRC_RK05) $(OS8_OCK_SYS_MAKER) $(OS8RUN) $(OS8_OCK_SYS_MAKER) # Build the source disk for OS/8 OCK CUSPS Component. $(OS8_OCK_CUSPS_SRC_RK05): $(OS8_OCK_CUSPS_SOURCES) | $(OS8_TOOLTIME) @builddir@/$(OS8CP) -v -rk1 $(OS8_OCK_CUSPS_SRC_RK05) -z -a $(OS8_OCK_CUSPS_SOURCES) RKA1: # Make a disk with binaries assembled from the OS8_OCK SYS source disk $(OS8_OCK_CUSPS_OBJ_RK05): $(OS8_OCK_CUSPS_SRC_RK05) $(OS8_OCK_CUSPS_MAKER) $(OS8RUN) $(OS8_OCK_CUSPS_MAKER) # Build the source disk for OS/8 OCK BASIC and FORTRAN II Component. $(OS8_OCK_BF2_SRC_RK05): $(OS8_OCK_BF2_SOURCES) | $(OS8_TOOLTIME) @builddir@/$(OS8CP) -v -rk1 $(OS8_OCK_BF2_SRC_RK05) -z -a $(OS8_OCK_BF2_SOURCES) RKA1: # Make a disk with binaries assembled from the OS8_OCK FIRTRAN II source disk $(OS8_OCK_BF2_OBJ_RK05): $(OS8_OCK_BF2_SRC_RK05) $(OS8_OCK_BF2_MAKER) $(OS8RUN) $(OS8_OCK_BF2_MAKER) # Build the source disk for OS/8 OCK FORTRAN IV Component. $(OS8_OCK_FIV_SRC_RK05): $(OS8_OCK_FIV_SOURCES) | $(OS8_TOOLTIME) @builddir@/$(OS8CP) -v -rk1 $(OS8_OCK_FIV_SRC_RK05) -z -a $(OS8_OCK_FIV_SOURCES) RKA1: # Make a disk with binaries assembled from the OS8_OCK FORTRAN IV source disk $(OS8_OCK_FIV_OBJ_RK05): $(OS8_OCK_FIV_SRC_RK05) $(OS8_OCK_FIV_MAKER) $(OS8RUN) $(OS8_OCK_FIV_MAKER) $(OS8_OCK_DIST_RK05): $(OS8_OCK_DIST_SRCS) | $(PIDP8I_SIM) $(OS8RUN_OUTFILES) $(OS8RUN)@OS8_OPTS@ $(OS8_OCK_DIST_MAKER) # Make a bootable OS/8 v3f TCO8 DECtape image $(V3F_TC08_TU56): $(V3F_MADE_RK05) $(ALL_TU56_SCRIPT) $(CUSP_COPYIN_SCRIPT) $(OS8RUN)@OS8_OPTS@ $(ALL_TU56_SCRIPT) --enable v3f # Make a bootable OS/8 v3f TD8E 12K DECtape image $(V3F_TD12K_TU56): $(V3F_MADE_RK05) $(ALL_TU56_SCRIPT) $(CUSP_COPYIN_SCRIPT) $(OS8RUN)@OS8_OPTS@ $(ALL_TU56_SCRIPT) --enable v3f --enable td12k # Make a bootable OS/8 v3d TCO8 DECtape image $(V3D_TC08_TU56): $(ALL_TU56_SCRIPT) $(CUSP_COPYIN_SCRIPT) | $(OS8_TOOLTIME) $(OS8RUN)@OS8_OPTS@ $(ALL_TU56_SCRIPT) # Make a bootable OS/8 v3d TD8E 12K DECtape image $(V3D_TD12K_TU56): $(ALL_TU56_SCRIPT) $(CUSP_COPYIN_SCRIPT) | $(OS8_TOOLTIME) $(OS8RUN)@OS8_OPTS@ $(ALL_TU56_SCRIPT) --enable td12k # Rule for building PAL assembly language programs in src/asm/*.pal. obj/%.lst bin/%-pal.pt: @srcdir@/src/asm/%.pal bin/palbart bin/palbart -lr $< || cat obj/$*.err mv @srcdir@/src/asm/$*.lst obj mv @srcdir@/src/asm/$*.rim bin/$*-pal.pt # Ditto for those in examples/*.pal. |
︙ | ︙ | |||
686 687 688 689 690 691 692 | obj/cc8/os8/%.c: @srcdir@/src/cc8/examples/%.c sed '/^#include/d' $< > $@ $(BUILDDIRS): mkdir -p $@ $(PIDP8I_SIM): $(SIM_OBJS) obj/pidp8i/gpio-@LED_DRIVER_MODULE@ls.o | | | | | | | > > > | | 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 | obj/cc8/os8/%.c: @srcdir@/src/cc8/examples/%.c sed '/^#include/d' $< > $@ $(BUILDDIRS): mkdir -p $@ $(PIDP8I_SIM): $(SIM_OBJS) obj/pidp8i/gpio-@LED_DRIVER_MODULE@ls.o $(CC) -o $@ @PI_LFLAGS@ $^ $(LIBS) $(SIM_LFLAGS) @PI_LIBS@ ln -f bin/pidp8i-sim bin/pdp8 bin/cc8: $(CC8_OBJS) $(CC) $(CC8_CROSS_CFLAGS) -o $@ $^ $(LIBS) bin/d8tape: $(D8TAPE_OBJS) $(CC) $(D8TAPE_CFLAGS) -o $@ $^ bin/palbart: $(PALBART_OBJS) $(CC) $(PALBART_CFLAGS) -o $@ $^ bin/pidp8i-test: obj/misc/test.o obj/pidp8i/gpio-nls.o obj/pidp8i/gpio-common.o $(CC) -o $@ $(CFLAGS) @PI_CFLAGS@ @PI_LFLAGS@ $^ $(LIBS) @PI_LIBS@ -lncurses bin/ptp2txt: obj/misc/ptp2txt.o $(CC) -o $@ $^ ln -f bin/ptp2txt bin/txt2ptp bin/txt2ptp: bin/ptp2txt ln -f bin/ptp2txt bin/txt2ptp bin/deeper: obj/misc/deeper.o obj/pidp8i/gpio-@LED_DRIVER_MODULE@ls.o obj/pidp8i/gpio-common.o $(CC) -o $@ $(CFLAGS) @PI_CFLAGS@ @PI_LFLAGS@ $^ $(LIBS) @PI_LIBS@ doc/e8-manual.pdf: doc/e8-manual.md tools/mkmanpdf doc/e8-manual libexec/scanswitch: obj/misc/scanswitch.o obj/pidp8i/gpio-nls.o obj/pidp8i/gpio-common.o $(CC) -o $@ $(CFLAGS) @PI_CFLAGS@ @PI_LFLAGS@ $^ $(LIBS) @PI_LIBS@ # Reconfigure whenever one of the *.in or autosetup files changes unless # this is "make clean". # # We purposely list only one of the OUTFILES on the left hand side # because to list them all is to invite Make to run N copies of the # configure script in parallel up to the limit of -j or the number of |
︙ | ︙ | |||
745 746 747 748 749 750 751 | -include \ $(SIM_OBJS:.o=.d) \ $(CC8_OBJS:.o=.d) \ $(D8TAPE_OBJS:.o=.d) \ $(MISC_OBJS:.o=.d) \ $(PALBART_OBJS:.o=.d) -include $(ADF) | > | 928 929 930 931 932 933 934 935 | -include \ $(SIM_OBJS:.o=.d) \ $(CC8_OBJS:.o=.d) \ $(D8TAPE_OBJS:.o=.d) \ $(MISC_OBJS:.o=.d) \ $(PALBART_OBJS:.o=.d) -include $(ADF) |
1 2 3 4 | # Getting Started with the PiDP-8/I Software ## Orientation | | | < | < | | < | > > > > | < < | > | > > | < | < | | > | | > | | | | > > > > > > > > | > > > > < | > | | < > > > > > > > > | > | | > > > | > < | < | | | | | | > | | < < | < > | < | < < | | < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | < > | < | | | < > | < > > > > | > > | > > > | > | > > > > > > | > | > > > > > > > > > > > > > > > > > > > | > > > > > | > | | > | > > > > | > > > | > > > > > > > > > > > > | | < | < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 | # Getting Started with the PiDP-8/I Software ## Orientation You will be reading this either: * …[online][tlrm], within [the Fossil project repository][home]; or * …as a text file within the [source packages][src]; or * …in the read-only [GitHub mirror][ghm]. The latter two are secondary outputs from the first, being the PiDP-8/I software development project’s home. This is open source software: you are welcome to [contribute to the project][ctrb]. [ctrb]: https://tangentsoft.com/pidp8i/doc/trunk/CONTRIBUTING.md [ghm]: https://github.com/tangentsoft/pidp8i [home]: https://tangentsoft.com/pidp8i/ [src]: https://tangentsoft.com/pidp8i/#src [tlrm]: https://tangentsoft.com/pidp8i/doc/trunk/README.md ## Prerequisites * A Raspberry Pi with the 40-pin GPIO connector. * An SD card imaged with Raspberry Pi OS, either [stock][rpios] or [modified by us][bosi]. * This software distribution, unpacked somewhere convenient within the filesystem on the Raspberry Pi. That’s already done on [our modified OS images][bosi], in `~/pidp8i`. When adding it to the stock OS, we recommend that you unpack it in your `HOME` directory or somewhere else your user has read/write access. * While those with no Linux and Raspberry Pi knowledge may be able to follow our instructions blindly, we recommend that such persons look at [the official Raspberry Pi documentation][rpfd], particularly their [Linux][rpfl] and [Raspberry Pi OS][rpfr] guides. The book "[Linux for Makers][lfm]" by Aaron Newcomb is also well-reviewed. * Building the software requires several tools and libraries, some of which you may not already have. On Raspberry Pi OS, say: $ sudo apt update $ sudo apt install build-essential libraspberrypi-dev \ libncurses-dev perl python3-pexpect python3-yaml Under Homebrew, such as on macOS, say instead: $ brew install make perl python $ pip3 install --user pexpect pyyaml On [other compatible OSes][othos], you may need different commands. [bosi]: https://tangentsoft.com/pidp8i/#bosi [lfm]: https://www.makershed.com/products/make-linux-for-makers [othos]: https://tangentsoft.com/pidp8i/wiki?name=OS+Compatibility [rpfd]: https://www.raspberrypi.org/documentation/ [rpfl]: https://www.raspberrypi.org/documentation/linux/ [rpfr]: https://www.raspberrypi.org/documentation/raspbian [rpios]: https://www.raspberrypi.org/software/ ## Enabling the SSH Server <a id="sshd"></a> [That topic is covered elsewhere](./doc/OS-images.md#sshd). ## Preparing Your Pi <a id="preparing"></a> If you’ve just barely unpacked Raspberry Pi OS onto an SD card and are now trying to get the PiDP-8/I software distribution working on it, stop and go through the [Rasbperry Pi documentation][rpd] first. At the absolute minimum, run `raspi-config` and make sure the Localization settings are correct. The defaults are for the United Kingdom, home of the Raspberry Pi Foundation, so unless you live there, the defaults are probably incorrect for *your* location. [rpd]: https://www.raspberrypi.org/documentation/ ## Getting the Software onto Your Pi <a id="unpacking"></a> This section is for those reading this on [our project home site][home] or via [its GitHub mirror][ghm]. If you are instead reading this as the `README.md` file within an unpacked distribution of the PiDP-8/I software, [skip to the next section](#configuring). ### Transferring the Source Tarball to the Pi <a id="transferring"></a> There are many ways to get the `*.tar.gz` file onto your Pi: 1. **Copy the file to the SD card** you're using to boot the Pi. When inserted into a Mac or Windows PC, typically only the `/boot` partition mounts as a drive your OS can see. (There's a much larger partition on the SD card, but most PCs cannot see it.) There should be enough free space left in this small partition to copy the tarball over. When you boot the Pi up with that SD card, you will find it in `/boot`. 2. **Pull the file down to the Pi** over the web, directly to the Pi: $ wget -O pidp8i.tar.gz https://goo.gl/JowPoC That will get you a file called `pidp8i.tar.gz` in the current working directory containing the latest *stable release.* To get the bleeding edge tip-of-trunk version instead, say: $ wget -O pidp8i.tar.gz https://tangentsoft.com/pidp8i/tarball 3. **SCP the file over** to a running Pi from another machine. If your Pi has [OpenSSH installed and running](#sshd), you can use [WinSCP][wscp], [Cyberduck][cd], [FileZilla][fz] or another SCP or SFTP-compatible file transfer program to copy the file to the Pi over the network. [cd]: https://cyberduck.io/ [fz]: https://filezilla-project.org/ [wscp]: https://winscp.net/eng/ 4. **Clone the Fossil repository** using the instructions in the [`CONTRIBUTING.md` file][ctrb]. (Best for experts or those who wish to become experts.) Alternatively, switch to [the binary OS installation images][bosi], which are a copy of Raspberry Pi OS as of our latest stable release, with the PiDP-8/I software already downloaded, configured, and installed for you. ### Unpacking the Software on Your Pi <a id="unpacking"></a> Having transferred the distribution file onto your Pi, unpack it with: $ tar xf pidp8i.tar.gz ## Configuring, Building and Installing <a id="configuring"></a> For a stock build, say: $ cd ~/pidp8i $ ./configure && tools/mmake && sudo make install You may want to add options to the `configure` step, described [below](#options). Subsequent software updates and rebuilds should not require that you re-run the `configure` step manually, but if automatic re-configuration fails, you can force it: $ make reconfig The “`mmake`” step above will take quite a while to run, especially on the slower Pi boards. The longest single step is building the OS/8 disk packs from source media. Be patient; the build process almost certainly isn’t frozen. Only the `make install` step needs to be done via “`sudo`”. No other step requires root privileges. After running “`sudo make install`” the first time, you will have to log out and back in to get the installation’s “bin” directory into your `PATH`. ## Using the Software <a id="using"></a> For the most part, this software distribution works like the [old stable 2015.12.15 distribution][osd]. Its [documentation][oprj] therefore describes this software too, though there are [significant differences][mdif]. Quick start: 1. To start the simulator running in the background: $ pidp8i start This will happen automatically on reboot unless you disable the service, such as in order to run one of the various [forks of Deeper Thought][dt2]. 2. To attach your terminal to the running simulator, run the same script without an argument: $ pidp8i 3. To detach from the simulator's terminal interface while leaving the PiDP-8/I simulator running, type <kbd>Ctrl-A d</kbd>. You can re-attach to it later with a `pidp8i` command. 4. To shut the simulator down while attached to its terminal interface, type <kbd>Ctrl-E</kbd> to pause the simulator, then at the `simh>` prompt type `quit`. Type `help` at that prompt to get some idea of what else you can do with the simulator command language, or read the [SIMH Users' Guide][sdoc]. 5. To shut the simulator down from the command line: $ pidp8i stop That then lets you run something like [Incandescent Thought][ith] without conflict. You might also find our [Learning More](/#learning) links helpful. [ith]: https://tangentsoft.com/pidp8i/wiki?name=Incandescent+Thought ## The Background Simulator Service <a id="systemd" name="unit"></a> The PiDP-8/I software distribution uses [systemd] to run the background PDP-8 simulator as user-level service, so you needn’t give `sudo` on any command to interact with that service, as you did in older versions of the software. Although you can give verbose `systemctl` commands like this: $ systemctl --user start pidp8i …we’ve provided a wrapper for such commands: $ pidp8i start $ pidp8i stop $ pidp8i restart $ pidp8i status -l *All* arguments are passed to `systemctl`, not just the first, so you can pass any flags that `systemctl` accepts, as in the last example. [systemd]: https://www.freedesktop.org/wiki/Software/systemd/ ## Configure Script Options <a id="options"></a> You can change many things about the way the software is built and installed by giving options to the `configure` script: ### --prefix <a id="prefix"></a> Perhaps the most widely useful `configure` script option is `--prefix`, which lets you override the default installation directory, `/opt/pidp8i`. There are many good reasons to change where the software gets installed, but the default is also a good one, so unless you know for a fact that you want to change this default, leave it alone. For example, you might prefer that the installer put the built software under your home directory. This will do that: $ ./configure --prefix=$HOME/pidp8i && sudo make install You might think that installing to a directory your user has complete control over would remove the need for installing via `sudo`, but that is not the case, since the installation script needs root privileges to mark a few of the executables as having permission to run at high priority levels, which improves the quality of the display, particularly with the [incandescent lamp simulator][ils] feature enabled. ### --lowercase <a id="lowercase"></a> The American Standards Association (predecessor to ANSI) delivered the second major version of the ASCII character encoding standard the same year the first PDP-8 came out, 1965. The big new addition? Lowercase. That bit of history means that when the PDP-8 was new, lowercase was a fancy new feature in the computing industry. That, plus the memory |
︙ | ︙ | |||
244 245 246 247 248 249 250 251 252 253 254 255 | right thing." The simulator is configured to send lowercase input to the PDP-8 software running on it. Where we have the skill, will, need, and time for it, we have [patched][tty] some of the software we distribute that otherwise would not do the right thing with lowercase input to make it do so. This is *not* the option you want if you are a purist. * **upper** — This option tells the PDP-8 simulator to turn lowercase input into upper case. This is the behavior we used for all versions of the PiDP-8/I software up through v2017.04.04. Essentially, it tells the software that you want it to behave as through you've got | > > > > > > > > | > > | | | | < < < < < < < < < | | | > | < | < | | < | < | | | | 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 | right thing." The simulator is configured to send lowercase input to the PDP-8 software running on it. Where we have the skill, will, need, and time for it, we have [patched][tty] some of the software we distribute that otherwise would not do the right thing with lowercase input to make it do so. This is *not* the option you want if you are a purist. * **pass** — This passes keyboard input through to the simulator unchanged, and no patches are applied to the PDP-8 software we distribute. This is the option for historical purists. If you run into trouble getting the software to work as you expect when built in this mode, try enabling CAPS LOCK. * **upper** — This option tells the PDP-8 simulator to turn lowercase input into upper case. This is the behavior we used for all versions of the PiDP-8/I software up through v2017.04.04. Essentially, it tells the software that you want it to behave as through you've got it connected to an uppercase-only terminal like the Teletype Model 33 ASR. The advantage of this mode is that you will have no problems running PDP-8 software that does not understand lowercase ASCII text. The disadvantage is obvious: you won't be able to input lowercase ASCII text. The SIMH option we enable in this mode is bidirectional, so that if you run a program that does emit lowercase ASCII text — such as Rick Murphy's version of Adventure — it will be uppercased, just like an ASR-33 would do. Another trap here is that the C programming language requires lowercase text, so you will get a warning if you leave the default option **--enable-os8-cc8** set. Pass **--disable-os8-cc8** when enabling **upper** mode. [sa]: http://homepage.cs.uiowa.edu/~jones/pdp8/faqs/#charsets [tty]: https://tangentsoft.com/pidp8i/wiki?name=OS/8+Console+TTY+Setup ### --no-lamp-simulator <a id="nls"></a> If you build the software on a multi-core host, the PDP-8/I simulator is normally built with the [incandescent lamp simulator][ils] feature, which drives the LEDs in a way that mimics the incandescent lamps used in the original PDP-8/I. (We call this the ILS for short.) This feature takes too much CPU power to run on anything but a multi-core Raspberry Pi, being the Pi 2 and newer full-sized boards, excluding the Zero series. If you configure the software on a single-core Pi — models A+, B+, and Zero — the simulator uses the original low-CPU-usage LED driving method instead. (a.k.a. NLS for short, named after this configuration option.) Those on a multi-core host who want this low-CPU-usage LED driving method can give the `--no-lamp-simulator` option to `configure`. This method not only uses less CPU, which may be helpful if you're trying to run a lot of background tasks on your Pi 2 or Pi 3, it can also be helpful when the CPU is [heavily throttled][thro]. ### --serial-mod <a id="serial-mod"></a> If you have done [Oscar's serial mod][sm1] to your PiDP-8/I PCB and the Raspberry Pi you have connected to it, add `--serial-mod` to the `configure` command above. If you do not give this flag at `configure` time with these hardware modifications in place, the front panel will not work correctly, and trying to run the software may even crash the Pi. If you give this flag and your PCBs are *not* modified, most of the hardware will work correctly, but several lights and switches will not work correctly. ### --alt-serial-mod <a id="alt-serial-mod"></a> This flag is for an [alternative serial mod by James L-W][sm2]. It doesn't require mods to the Pi, and the mods to the PiDP-8/I board are different from Oscar's. This flag changes the GPIO code to work with these modifications to the PiDP-8/I circuit design. See the linked mailing list thread for details. As with `--serial-mod`, you should only enable this flag if you have actually done the mods as specified by James L-W. This option is a pure alternative to [`--serial-mod`](#serial-mod): you can leave both off, but you cannot pass both. ### --throttle <a id="throttle"</a> See [`README-throttle.md`][thro] for the values this option takes. If you don't give this option, the simulator runs as fast as possible. ### --enable-savestate <a id="savestate"></a> By default, the PiDP-8/I starts up with the core state undefined and runs the boot script you’ve selected either with the IF switches or by passing it on the command line to `pidp8i-sim` or `pdp8`. This brings the simulator up in a known state, with no persistence between restarts other than what was written to the simulated storage devices before the last shutdown. On a real PDP-8 with core memory, however, the values in memory will persist for weeks without power; core memory on a PDP-8 is not zeroed on power-up, unlike RAM on a modern computer. Since the CPU doesn’t start executing anything on power-up in a stock PDP-8 configuration, this means the user can toggle in a program/OS restart address with the switch register (SR), load it into the program counter (PC) with the Load Addr switch, then START the CPU to restart their program without having to reload it from tape or disk. There were also several power fail and restart options designed and made available for the PDP-8 series throughout its lifetime. One of these — the KP8-I for the PDP-8/I — would detect a power fail condition, then in the brief time window while the power supply’s reservoir capacitors kept the computer running, this option card would raise an interrupt, giving a user-written routine up to 1 millisecond to save important registers to core so they would persist through the power outage. Then on power-up, it would start executing at core location 00000, where another user routine would load those registers back from core to restart the system where it left off before the power failed. Giving this option gives roughtly the same effect for all generated boot scripts: any time the simulator is shut down gracefully, it saves all key simulator state — registers, core, device assignments, etc. — to a disk file. Then on restart, that script will reload that saved state if it finds the saved state file. This is not identical to a KP8-I in that it doesn’t require any user-written PDP-8 code to run, which is why it’s optional: it’s ahistoric with respect to the way the included OSes normally ran. In absence of a hardware option like the KP8-I, a more accurate simulation would only save the core memory state to a host-side disk file and reload it on simulator re-start. You can get that behavior atop the current mechanism by adding commands like the following to each |
︙ | ︙ | |||
396 397 398 399 400 401 402 | DEP MQ 0 DEP PC 0 That zeroes the key registers and prevents the CPU from running as it normally would after giving the `RESTORE` command to SIMH. | | | | > | > > > > > > > > > > > > > > | | | < < < < < < | > > > | > > > > | > | < | 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 | DEP MQ 0 DEP PC 0 That zeroes the key registers and prevents the CPU from running as it normally would after giving the `RESTORE` command to SIMH. ### --disable-usb-automount <a id="dub"></a> When you install the software on a [systemd]-based Linux system, we normally configure the OS to automatically mount USB drives when they are initially plugged in, which allows the `SING_STEP` + `DF` media image auto-attach feature to work smoothly. That is, if you plug in a USB memory stick holding a `*.pt` file containing a paper tape image, you want the simulator to be able to find it if you have the DF switches set to 1, telling the PiDP-8/I front panel code to look for something to attach to the simulator's paper tape reader. This feature may interfere with other uses of USB, such as when booting your Pi from an external USB hard disk drive. Give this option to disable the feature. (Alternately, you could modify our `etc/udev.rules` and/or `bin/usb-mount` scripts so that they work cooperatively with your local USB setup rather than conflicting with it.) ### --disable-cc8-cross <a id="dcc8"></a> Give this option if you do not want to build Ian Schofield's `cc8` C cross-compiler on the host. Because the cross-compiler is needed to build the CC8 native OS/8 compiler, disabling the cross-compiler also causes the native compiler to be left off the bootable OS/8 RK05 disk image, as if you’d passed the `--disable-os8-cc8` configuration option. ### --use-ock <a id="ock"></a> By default, the boot media used for the IF=0 and IF=7 cases is an extended version of OS/8 V3D, as distributed by DEC, plus some patches and third-party software additions, per the following sections. For the late 2020 release, we have another more ambituous option, being [the OS/8 Combined Kit][ock], which is the last complete release of OS/8 released by DEC. (See that link for details.) Pass this option to boot OCK rather than OS/8 V3D. [ock]: https://tangentsoft.com/pidp8i/dir?ci=tip&name=src/os8/ock ### --disable-os8-\* <a id="disable-os8"></a> Several default components of the [OS/8 RK05 disk image](#os8di) used by boot options IF=0 and IF=7 can be left out to save space and build time: * **--disable-os8-advent** — Leave out the [Adventure][advent] game. * **--disable-os8-basic-games** - Leave out the BASIC games and demos which primarily come from DEC's book "101 BASIC Computer Games." * **--disable-os8-cc8** - Leave out Ian Schofield's native OS/8 CC8 compiler and all of its ancillary files. * **--disable-os8-chekmo** — Leave out John Comeau's [CHECKMO-II chess implementation][chess]. * **--disable-os8-crt** — Suppress the [console rubout behavior][tty] enabled while building the OS/8 binary RK05 disk image. You probably only want to do this if you have attached a real teletype to your PiDP-8/I, and thus do not want video terminal style rubout processing. * **--disable-os8-dcp** — Leave out the DCP disassembler. * **--disable-os8-e8** — Leave out [Bill Silver’s E8][e8], an Emacs-like screen editor. * **--disable-os8-focal** - Do not install any version of FOCAL on the OS/8 system disk. This option sets `--disable-os8-uwfocal` and overrides `--enable-os8-focal69`, both discussed below. * **--disable-os8-fortran-ii** - Leaves out the FORTRAN II compiler, SABR, the linking loader (`LOADER`), the `LIBSET` tool, and the `*.RL` library files. This option is ignored unless you also give `--disable-os8-cc8` because the OS/8 version of CC8 is built atop this subsystem. * **--disable-os8-fortran-iv** - Leave the FORTRAN IV compiler out. * **--disable-os8-init** - Do not install `RKB0:INIT.TX` or its “show on boot” script, `INIT.CM`. Rather than disable the default on-boot init message, you may want to edit `media/os8/init.tx.in` to taste and rebuild. * **--disable-os8-kermit-12** - Leave out the Kermit-12 implementation normally installed to `RKA0:` * **--disable-os8-macrel** - Leave the MACREL v2 assembler and its associated FUTIL V8B tool out. * **--disable-os8-src** - Do not build the `v3d-src.rk05` disk image from the OS/8 source tapes. This is not controlled by `--os8-minimal` because that only affects the bootable disk images. * **--disable-os8-uwfocal** - Leave out the U/W FOCAL V4E programming environment normally installed to `RKA0:`. Note that the default installation only installs `UWF16K.SV`, not the rest of the files on `media/os8/subsys/uwfocal*.tu56`. There is much more to explore here, but we cannot include it in the default installation set because that would overrun OS/8's limitation on the number of files on a volume. You can later remove each of these after installation using [our package manager][os8pkg]. [advent]: http://www.rickmurphy.net/advent [chess]: https://chessprogramming.wikispaces.com/CHEKMO-II [e8]: https://tangentsoft.com/e8/ [os8pat]: https://tangentsoft.com/pidp8i/doc/trunk/doc/os8-patching.md [os8pkg]: https://tangentsoft.com/pidp8i/doc/trunk/doc/os8pkg.md ### --enable-os8-\* <a id="enable-os8"></a> There are a few file sets not normally installed to the [OS/8 RK05 disk image](#os8di) used by boot options IF=0 and IF=7. You can install them with the following options: * **--enable-os8-music** — The `*.MU` music scores and Rich Wilson's associated compiler (`MUSIC.PA`) and player overlay (`PLAYOV.PA`) |
︙ | ︙ | |||
531 532 533 534 535 536 537 | much older and had a much more wide-reaching impact in history, so we choose to provide unvarnished TECO by default. That having been said, people don't go to a ren fair and expect to experience the historical ubiquity of typhoid fever, so do not feel guilty if you choose to try this option. | < < | | | | | | | | | > > > > > | | | > > | | | | | < < < | | < | | < | > | | > | | | | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | > | > | < < | | | | | | | | | | > | | > | > | > | | < > | > < < > | 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 | much older and had a much more wide-reaching impact in history, so we choose to provide unvarnished TECO by default. That having been said, people don't go to a ren fair and expect to experience the historical ubiquity of typhoid fever, so do not feel guilty if you choose to try this option. * **--enable-os8-focal69** — Because the default installation includes U/W FOCAL, we have chosen to leave [FOCAL,1969][f69] out by default to save space on the O/S 8 system disk. You can give this option to install this implementation alongside U/W FOCAL, or you can couple this option with `--disable-os8-uwfocal` to reverse our choice of which FOCAL implementation to install by default. You should know that the reason we made this choice is that the version of FOCAL,1969 we are currently shipping is fairly minimal: we believe we are shipping the original DEC version of FOCAL,1969 plus a few carefully-selected overlays. There are many more overlays and patches available on the Internet for FOCAL,1969, but we have not had time to sort through these and make choices of which ones to ship or how to manage which ones get installed. Thus our choice: we want to provide the most functional version of FOCAL by default, and within the limitations of the time we have chosen to spend on this, that is U/W FOCAL today. (See our [U/W FOCAL manual supplement][suppd] for a list of differences between these versions of FOCAL, which implicitly explains why we chose it.) It is possible that we will eventually add enough patches and overlays to FOCAL,1969 that it will become more powerful than U/W FOCAL, so we might then choose to switch the defaults, but that is just speculation at the time of this writing. You can later add each of these after installation using [our package manager][os8pkg]. [f69]: https://tangentsoft.com/pidp8i/wiki?name=Running+FOCAL%2C1969 [suppd]: https://tangentsoft.com/pidp8i/doc/trunk/doc/uwfocal-manual-supp.md#diffs [uvte]: https://tangentsoft.com/pidp8i/wiki?name=Using+VTEDIT ### --os8-minimal <a id="os8-minimal"></a> This sets all `--enable-os8-*` flags to false and all `--disable-os8-*` flags to true. This mode overrides any `--enable-os8-*` flag, so if you want a minimal install plus just one or two features, it’s simplest to give this flag and then use [our package manager][os8pkg] to add in the elements you want rather than pass a bunch of `--disable-os8-*` options. This option may not do some things you think it should: 1. This flag's name is aspirational, not a promise of an ideal: our current "minimal" installation could be stripped down further. For example, we currently have no way to leave out OS/8's BASIC interpreter, even though no core OS services depend on it. 2. This option does not affect [the `--lowercase` option](#lowercase) because that affects only OS/8's command interpreter and OS/8's BASIC implementation, so we deem it to be orthogonal to the purpose of the `--os8-minimal` flag, which only affects the optional post-`BUILD` features. You may therefore wish to give `--lowercase=none` along with `--os8-minimal`. 3. This option does not affect `--disable-os8-src`, because it only suppresses optional features in the primary bootable OS/8 media. If you want minimal OS/8 boot media without a separate source code data disk, give this option as well. 4. Although this option disables *display* of the `INIT.TX` file on boot, the file is still generated, on purpose. First, it acts as build documentation, recording what was built and when. Second, you may wish to enable this welcome message later, and it’s rather painful to go back through the build process to generate it after the fact. ### --help Run `./configure --help` for more information on your options here. ## Runtime Configuration <a id="runtime"></a> The `pidp8i` command sources a Bourne shell script called `pidp8i.rc` — normally installed in `/opt/pidp8i/etc` — which you may edit to override certain details of the way that script runs. The intended purpose is to give you a place to define local overrides for default variables: ### `SCREEN_MANAGER=screen` <a id="rc-screen-manager"></a> By default, the PiDP-8/I software distribution installs and uses [GNU `screen(1)`][gscr] to allow the simulator to run in the background yet be reattached from a later terminal session, then possibly later to be backgrounded once again. Without the intermediation of something like `screen`, the simulator would either forever be in the background — so we’d have to export the console [another way][scons] — or we’d have to give up on background startup, requiring that users fire the simulator up interactively any time they wanted to use it. Using a screen manager lets us have it both ways. The `SCREEN_MANAGER` setting is for use by those that want to use one of the alternatives to GNU `screen`: * **screen**: The default, per above. * [**tmux**][tmux]: A popular alternative to `screen`, especially on on BSD platforms. Note that the "attention" character for `tmux` is <kbd>Ctrl-B</kbd> by default, not <kbd>Ctrl-A</kbd> as with `screen`. * **none**: This mode is for interactive use, allowing you to run the installed simulator with the installed media without any screen manager at all. In this mode, the `pidp8i` and `pidp8i start` commands do the same thing: run the simulator directly attached to your current interactive terminal. The `pidp8i stop` command becomes a no-op, since stopping the simulator is then done in the standard SIMH way: <kbd>Ctrl-E, quit</kbd>. Note that the alternative screen managers are not installed by default. If you set `SCREEN_MANAGER=tmux`, you must then ensure that `tmux` is in fact installed before the `pidp8i` script goes to try and use it. From the Pi’s command line: $ sudo apt install tmux Switching between configured screen managers must be done while the simulator is stopped. [gscr]: https://www.gnu.org/software/screen/ [scons]: /wiki?name=Serial+or+Telnet+PDP-8+Console [tmux]: https://tmux.github.io/ ## Simplifying Boot and Login <a id="auto-login"></a> The setup and installation instructions above assume you will be using base the Raspberry Pi OS as a network server, offering SSH if nothing else. Thus, we do not try to bypass any Linux security mechanisms, not wanting to create an insecure island on your network. However, if you want to run your system more as an appliance, you can cast away some of this security to get auto-login and other convenient behaviors: * [Serial or Telnet PDP-8 Console](https://tangentsoft.com/pidp8i/wiki?name=Serial+or+Telnet+PDP-8+Console) * [How to Run a Naked PiDP-8/i](https://tangentsoft.com/pidp8i/wiki?name=How+to+Run+a+Naked+PiDP-8/I) * [VNC for Remote GUI Access](https://www.raspberrypi.org/documentation/remote-access/vnc/) ## The OS/8 Disk Images <a id="os8di"></a> For the first several years of the PiDP-8/I project, the OS/8 RK05 disk image included with the PiDP-8/I software (called `os8.rk05`) was based on an image of a real RK05 disk pack that someone allegedly found in a salvaged PDP-8 system. Parts of the image were corrupt, and not all of the pieces of software worked properly with the other parts. It was also a reflection of the time it was created and used out in the world, which was not always what we would wish to use today. Starting in late 2017, [several of us][aut] built a series of tools to generate OS/8 media images from pristine source files in a repeatable, [testable][pkgtst] way, culminating in [Bill Cattey’s `os8-run`][ori], which backs other features like [the `--disable-os8-*` configuration options](#disable-os8). The resulting set of media images entirely replace the old ones and go well beyond each besides. All prior features are still available, though some features present on the old images are disabled by default, requiring either [`--enable-os8-*` configure options](#enable-os8) or [package manager commands][os8pkg] to add features back in. Mostly, though, the new media images are more functional than the old ones. If you wish to know the full details of how these media images are created, see the documentation for [`os8-run`][ori] and that for [`class simh`][cs]. The remainder of this section describes some aspects of these media images which are not clear from the descriptions of the `--*-os8-*` configuration options above. [aut]: https://tangentsoft.com/pidp8i/doc/trunk/AUTHORS.md [ori]: https://tangentsoft.com/pidp8i/doc/trunk/doc/os8-run.md [pkgtst]: https://tangentsoft.com/pidp8i/doc/trunk/doc/testing.md ### Baseline The baseline for the bootable OS/8 media images comes from a set of DECtapes distributed by Digital Equipment Corporation which are now included with the PiDP-8/I software; see the [`media/os8/*.tu56` files][os8mf]. From these files and your configuration options, the `os8-run` script creates the baseline bootable `v3d-dist.rk05` and `ock-dist.rk05` disk images. The default build creates a complete OS/8 V3D system including `BUILD` support, FORTRAN IV, MACREL v2, and more, but you can switch to an [OCK build at compile time](#ock) if you prefer. ### Subtractions It's pretty easy to run out of space on an OS/8 RK05 disk, not just because of its [2 × 0.8 MWord limit][rk05td], but also because of an OS/8 limitation in the number of files on an OS/8 filesystem. We leave the archive of device drivers and the TD8E subsystem off the system packs to avoid hitting this second limit. You can add them later from [OS/8 Binary Distribution DECtape #2][bdt2], such as to create media for a TD8E based PDP-8/e. [rk05td]: https://en.wikipedia.org/wiki/RK05#Technical_details ### Default Additions The OS/8 RK05 disk image build process normally installs many software and data file sets to the disk image. See the option descriptions above: the ["disable" option set](#disable-os8) effectively lists those |
︙ | ︙ | |||
694 695 696 697 698 699 700 | read-only master. A copy is made called `v3d.rk05`. This is the default OS/8 rk05 image assigned to the IF=0 and IF=7 boot options. In keeping with the standards of good systm management this image incorporates all mandatory patches, as well as optional patches appropriate to proper operation of the system. For details on the available patches, the selection criteria, | | | | 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 | read-only master. A copy is made called `v3d.rk05`. This is the default OS/8 rk05 image assigned to the IF=0 and IF=7 boot options. In keeping with the standards of good systm management this image incorporates all mandatory patches, as well as optional patches appropriate to proper operation of the system. For details on the available patches, the selection criteria, and information about other optional patches see the [OS/8 system patches][os8pat] document. [bdt2]: https://tangentsoft.com/pidp8i/file/media/os8/al-4712c-ba-os8-v3d-2.1978.tu56 [cl]: https://tangentsoft.com/pidp8i/doc/trunk/ChangeLog.md [cs]: https://tangentsoft.com/pidp8i/doc/trunk/doc/class-simh.md [os8mf]: https://tangentsoft.com/pidp8i/file/media/os8 [tlrm]: https://tangentsoft.com/pidp8i/doc/trunk/README.md ## The OS/8 TU56 Tape Image <a id="os8ti"></a> As with the [OS/8 disk image](#os8di), this distribution’s build system can create custom TU56 tape images from pristine source media. This replaces the old `os8.tu56` binary image previously distributed with this software. The build system actually creates four such tape images according to a |
︙ | ︙ | |||
729 730 731 732 733 734 735 | TD12K][os8td] for the reason you’re given a choice here. [os8td]: https://tangentsoft.com/pidp8i/wiki?name=TD8E+vs+TC08 [os8ver]: https://tangentsoft.com/pidp8i/wiki?name=OS/8+V3D+vs+V3F | < | | 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 | TD12K][os8td] for the reason you’re given a choice here. [os8td]: https://tangentsoft.com/pidp8i/wiki?name=TD8E+vs+TC08 [os8ver]: https://tangentsoft.com/pidp8i/wiki?name=OS/8+V3D+vs+V3F ## Overwriting the Local Simulator Setup <a id="overwrite-setup"></a> When you run `sudo make install` step on a system that already has an existing installation, it purposely does not overwrite two classes of files: 1. **The binary PDP-8 media files**, such as the RK05 disk image that holds the OS/8 image the simulator boots from by default. These media |
︙ | ︙ | |||
776 777 778 779 780 781 782 | aren't precious, you can just copy the generated `boot/*.script` files from the build directory into the installation directory, `$prefix/share/boot`. (See the `--prefix` option above for the meaning of `$prefix`.) 4. If neither your previously installed simulator configuration files nor the binary media images are precious, you can force the | | | < | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | > > | | | | | | | | | | | | | 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 | aren't precious, you can just copy the generated `boot/*.script` files from the build directory into the installation directory, `$prefix/share/boot`. (See the `--prefix` option above for the meaning of `$prefix`.) 4. If neither your previously installed simulator configuration files nor the binary media images are precious, you can force the installation script to overwrite them both with a `sudo make mediainstall` command after `sudo make install`. Beware that this is potentially destructive! If you've made changes to your PDP-8 operating systems or have saved files to your OS system disks, this option will overwrite those changes! ## Testing Your PiDP-8/I Hardware <a id="testing"></a> You can test your PiDP-8/I LED and switch functions with these commands: $ pidp8i stop $ pidp8i-test You may have to log out and back in before the second command will work, since the installation script modifies your normal user's `PATH` the first time you install onto a given system. It is important to stop the PiDP-8/I simulator before running the test program, since both programs need exclusive access to the LEDs and switches on the front panel. After you are done testing, you can start the PiDP-8/I simulator back up with: $ pidp8i start See [its documentation][pitest] for more details. ## License Copyright © 2016-2020 by Warren Young. This document is licensed under the terms of [the SIMH license][sl]. <div id="this-space-intentionally-left-blank" style="min-height:50em"></div> [cprj]: https://tangentsoft.com/pidp8i/ [sm1]: https://obsolescence.wixsite.com/obsolescence/pidp-8-details#i7g9qvpr [sm2]: https://groups.google.com/d/msg/pidp-8/-leCRMKqI1Q/Dy5RiELIFAAJ [osd]: http://obsolescence.wixsite.com/obsolescence/pidp-8-details [dt2]: https://github.com/VentureKing/Deeper-Thought-2 [sdoc]: https://tangentsoft.com/pidp8i/uv/doc/simh/main.pdf [oprj]: http://obsolescence.wixsite.com/obsolescence/pidp-8 [pitest]: https://tangentsoft.com/pidp8i/doc/trunk/doc/pidp8i-test.md [thro]: https://tangentsoft.com/pidp8i/doc/trunk/README-throttle.md [mdif]: https://tangentsoft.com/pidp8i/wiki?name=Major+Differences [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md [ils]: https://tangentsoft.com/pidp8i/wiki?name=Incandescent+Lamp+Simulator |
|
| | | 1 2 3 4 5 6 7 8 | Copyright © 2015-2020 by various authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to |
︙ | ︙ |
1 2 3 4 | ######################################################################## # auto.def - Configure file for the PiDP-8/I software build system, # based on autosetup. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 | ######################################################################## # auto.def - Configure file for the PiDP-8/I software build system, # based on autosetup. # # Copyright © 2016-2020 Warren Young # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to |
︙ | ︙ | |||
32 33 34 35 36 37 38 | options-defaults {prefix /opt/pidp8i} use cc use cc-lib use cc-shared # Canonicalize some paths which may be relative and generate others from them | | > > | | > | | | | | | | > > | | | | | | | | | > | 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | options-defaults {prefix /opt/pidp8i} use cc use cc-lib use cc-shared # Canonicalize some paths which may be relative and generate others from them set abspfx [file-normalize [get-define prefix]] set abssrcdir [file-normalize [get-define srcdir]] define ABSPREFIX $abspfx define ABSSRCDIR $abssrcdir define SHAREDIR "$abspfx/share" define BOOTDIR "$abspfx/share/boot" define MEDIADIR "$abspfx/share/media" # Define options the configure script shares with os8-run. We insert a # variant of each into the autosetup option list and also write a # version to a Python library file that os8-run can read. This avoids # the need to define the options by hand in both places. # # Some of the --*-os8-* options are defined only for the configure # script because they are either meta-options, affecting the definition # of some of those we do define here, or they aren't passed as-is to the # os8-run script, but instead must be translated. (e.g. --disable-os8-src # suppresses creation of the OS/8 src rk05 by the Makefile.) set os8opts { advent 1 "Adventure" basic-games 1 "BASIC games and demos" cc8 1 "the native OS/8 CC8 compiler" chekmo 1 "the CHECKMO-II game of chess" crt 1 "CRT-style rubout processing" dcp 1 "the DCP disassembler" e8 1 "Emacs-like Editor" focal69 0 "FOCAL,1969" fortran-ii 1 "FORTRAN II" fortran-iv 1 "FORTRAN IV" init 1 "the OS/8 INIT message" kermit-12 1 "12-bit Kermit" macrel 1 "the MACREL assembler" music 0 "*.MU files" uwfocal 1 "U/W FOCAL (only)" vtedit 0 "the TECO VTEDIT setup" } set alloptions {} foreach {opt def desc} $os8opts { if {$def} { set prefix "disable" } else { set prefix "enable" } append alloptions [list os8-$opt=$def => "$prefix $desc in the built OS/8 RK05 image"] \n } # Now define those command line options that belong only to us. append alloptions { alt-serial-mod => "use GPIO drive scheme suitable for James L-W's serial mod method" boot-tape-config: => "boot tape configuration: tc08, or td12k" boot-tape-version: => "OS/8 version for boot tape, either v3d or v3f" cc8-cross=1 => "do not build the cc8 cross-compiler on the host" debug-mode => "create a debug build (default is release)" e8-screen-width:=80 => "set E8 terminal width" e8-screen-height:=24 => "set E8 terminal height" lowercase: => "select how lowercase input is to be handled" no-lamp-simulator => "use simple LED driver instead of incandescent lamp simulator" os8-focal=1 => "leave FOCAL,1969 and U/W FOCAL off the built OS/8 RK05 image" os8-minimal => "set all --disable-os8-* options, giving minimal OS/8 bin disk" os8-src=1 => "do not build v3d-src.rk05 from OS/8 source tapes" savestate => "save simulator state (regs, core, devices) on exit; restore on restart" serial-mod => "use GPIO drive scheme suitable for Oscar Vermeulen's serial mod method" throttle: => "override the throttle values in the boot scripts" usb-automount=1 => "do not automatically mount USB drives for SING_STEP + DF" use-ock => "boot the OS/8 Combined Kit built from source instead of binary v3d." } options $alloptions # use btc and btv to set defaults because I can't get the documented # syntax of <name>:=<value> to work. |
︙ | ︙ | |||
116 117 118 119 120 121 122 | # Make our own array of os8 options so we can apply the meta options foreach {opt def desc} $os8opts { set os8bool($opt) [opt-bool os8-$opt] } set os8bool(src) [opt-bool os8-src] | | < > > > > > > > > > > > > > > > > | 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | # Make our own array of os8 options so we can apply the meta options foreach {opt def desc} $os8opts { set os8bool($opt) [opt-bool os8-$opt] } set os8bool(src) [opt-bool os8-src] # Handle OS/8 meta-options set os8min [opt-bool os8-minimal] set os8src [opt-bool os8-src] if {![opt-bool os8-focal]} { set os8bool(focal69) "0" set os8bool(uwfocal) "0" } # -- do not use opt-bool os8-* below this point # -- use the os8bool() array # Handle E8 related options if {$os8bool(e8)} { define E8_TU56 bin/e8.tu56 set w [opt-val e8-screen-width 80] set h [opt-val e8-screen-height 24] # Have to use Unix line endings for write-if-changed to work # properly. We convert them to OS/8 CRLFs in the os8-run step. set defs "DECIMAL\n" append defs "SCRWD=$w\n" append defs "SCRHT=$h\n" append defs "OCTAL" ;# trailing \n added write-if-changed "src/e8/e8defs.pa" $defs } # Handle interdependent options if {$os8bool(cc8) && !$os8bool(fortran-ii)} { set $os8bool(fortran-ii) 1 msg-result "WARNING: Re-enabling OS/8 FORTRAN II: OS/8 CC8 requires it." } define CC8_TU56 {} |
︙ | ︙ | |||
191 192 193 194 195 196 197 | if {$os8src} { msg-result "Building v3d-src.rk05 from OS/8 source tapes." define OS8_SRC_RK05 bin/v3d-src.rk05 } else { msg-result "Will not build v3d-src.rk05 from OS/8 source tapes." define OS8_SRC_RK05 {} } | | > > > | > > > > > > > > > > > > > > > | 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | if {$os8src} { msg-result "Building v3d-src.rk05 from OS/8 source tapes." define OS8_SRC_RK05 bin/v3d-src.rk05 } else { msg-result "Will not build v3d-src.rk05 from OS/8 source tapes." define OS8_SRC_RK05 {} } # Define boot image used in various places. # OS8_BASELINE is used at the lowest levels of building. define OS8_BASELINE "v3d-dist.rk05" # OS8_TOOLTIME is used by tools, it is the patched version of OS8_BASELINE. # This enables tools and higher levels of building to work with the # most up-to-date revisions of system and utilities. define OS8_TOOLTIME "v3d-patched.rk05" # OS8_RUNTIME is what the end user boots. It contains the patched OS and utilies. # It also contains all configured third party components. # This boot disk is a choice between v3d, and ock. # The ock image is built from source using OS8_BASELINE and OS8_TOOLTIME. if {[opt-bool use-ock]} { define OS8_RUNTIME "ock.rk05" } else { define OS8_RUNTIME "v3d.rk05" } # Compose our boot tape image name from boot-tape-config and boot-tape-version # Pull defaults from $btc for boot-tape-config, and $btv for boot-tape-version. set btn "$btv-$btc.tu56" msg-result "Boot tape name: $btn" |
︙ | ︙ | |||
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 | define LED_DRIVER_MODULE i define ILS_MODE 1 } # Check for headers, functions, etc. whose absence we can work around cc-check-decls __progname cc-check-includes time.h cc-check-function-in-lib clock_gettime rt cc-check-functions clock_nanosleep nanosleep usleep cc-check-functions sched_yield cc-with {-includes signal.h} { cc-check-types sighandler_t sig_t } # Ensure we have the libncurses development files installed here, else # pidp8i-test won't build. if {![cc-check-includes curses.h]} { user-error "Could not find curses.h. Try installing libncurses-dev." } elseif {![cc-check-function-in-lib initscr ncurses]} { user-error "Could not find initscr() in libncurses." | > > > > > > > > > > > > > > > > > > > > > > > | 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 | define LED_DRIVER_MODULE i define ILS_MODE 1 } # Check for headers, functions, etc. whose absence we can work around cc-check-decls __progname cc-check-includes time.h cc-check-includes pcre.h pcreposix.h cc-check-function-in-lib clock_gettime rt cc-check-functions clock_nanosleep nanosleep usleep cc-check-functions sched_yield cc-with {-includes signal.h} { cc-check-types sighandler_t sig_t } # Check for libraspberrypi-dev stuff set old_LIBS [get-define LIBS] ;# don't want LIBS modded directly if {![file isdirectory "/opt/vc"]} { msg-result "WARNING: Not building on a Pi or libraspberrypi-dev not installed!" define PI_CFLAGS "" define PI_LFLAGS "" define PI_LIBS "" } elseif {![cc-with {-cflags "-L/opt/vc/lib"} { cc-check-function-in-lib bcm_host_get_peripheral_address bcm_host }]} { user-error "Found /opt/vc but cannot link to -lbcm_host!" } elseif {![cc-with {-cflags "-I/opt/vc/include"} { cc-check-includes bcm_host.h }]} { user-error "Found /opt/vc but cannot #include bcm_host.h!" } else { define PI_CFLAGS "-I/opt/vc/include" define PI_LFLAGS "-L/opt/vc/lib" define PI_LIBS "-lbcm_host" } define LIBS $old_LIBS # Ensure we have the libncurses development files installed here, else # pidp8i-test won't build. if {![cc-check-includes curses.h]} { user-error "Could not find curses.h. Try installing libncurses-dev." } elseif {![cc-check-function-in-lib initscr ncurses]} { user-error "Could not find initscr() in libncurses." |
︙ | ︙ | |||
443 444 445 446 447 448 449 | # Get host, user, and date info for use by media/os8/init.tx. catch {exec hostname} host set user $::env(USER) define BUILDUSER "$user@$host" define BUILDTS [clock format [clock seconds] -format "%Y.%m.%d at %T %Z"] | | | | | > | | > > > > | | < | < > | < > > > | < | > > | > > > > | | | | | < | | | | | > > > > > | 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 | # Get host, user, and date info for use by media/os8/init.tx. catch {exec hostname} host set user $::env(USER) define BUILDUSER "$user@$host" define BUILDTS [clock format [clock seconds] -format "%Y.%m.%d at %T %Z"] # The os8-run script requires Python 2 or 3 and some non-core modules. set status [catch {exec python3 -c exit} result] if {$status == 0} { set pyver 3 set pycmd "python3" } else { set status [catch {exec python2 -c exit} result] if {$status == 0} { set pyver 2 set pycmd "python2" } else { set status [catch {exec python -c exit} result] if {$status == 0} { set status [catch {exec python --version | grep -q 'Version 2'} result] set pyver [expr $status == 0 ? 2 : 3] set pycmd "python" } } } if {$pyver == ""} { user-error "Python does not appear to be installed here. It is required." } define PYCMD $pycmd define PYVER $pyver msg-result "Python $pyver is installed here as '$pycmd'." foreach mfull {pexpect pkg_resources pyyaml} { set mshort [regsub "py" $mfull ""] set mapt [regsub "_" $mshort "-"] set test "import $mshort" set status [catch {exec $pycmd -c $test 2> /dev/null} result] if {$status != 0} { set msg "The Python $mfull module is not installed here. Fix with\n\n" append msg " sudo apt install $pycmd-pip$pyver\n" append msg " pip$pyver install --user $mfull\n" append msg "\nOR on Debian type systems:\n\n" append msg " sudo apt install $pycmd-$mapt\n" user-error $msg } msg-result "Found Python module $mfull." } # Check for Perl and that it can run the test corpus builder. Not fatal # if it can't, since only developers and deep testers need it. # # We generate os8-run early here because test-os8-run requires it. We # have a chicken-and-egg on initial configure in a clean tree otherwise. make-template bin/os8-run.in set status [catch {exec perl -e exit} result] if {$status == 0} { set status [catch {exec perl -c "[get-define srcdir]/tools/test-os8-run" 2> /dev/null} result] if {$status == 0} { set status [catch {exec lz4 -h 2> /dev/null} result] if {$status == 0} { msg-result "All test-os8-run prereqs available here." |
︙ | ︙ | |||
525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 | } result] if {$status == 0} { msg-result $result } else { user-error "Failed to generate autodependency rules: $result!" } # Write outputs. # # NOTE: If you change the list of files here, change INFILES in # Makefile.in, too. # # We're listing the top-level Makefile.in last because the templates # ahead of it may have @include directives which modify the @AUTODEPS@ # value substituted into the top-level Makefile.in's autoreconf target. # # The boot/common.script must precede the rest of boot/*, because they # @include the output version. make-config-header src/config.h \ -auto {ENABLE_* HAVE_* PACKAGE_* SIZEOF_*} \ -bare {ILS_MODE PCB_*} make-template bin/pidp8i.in make-template bin/os8-cp.in make-template boot/common.script.in make-template boot/0.script.in make-template boot/2.script.in make-template boot/3.script.in make-template boot/4.script.in make-template boot/6.script.in make-template boot/7.script.in make-template boot/run.script.in make-template boot/run-v3f.script.in make-template boot/tss8.script.in make-template etc/pidp8i.service.in make-template etc/sudoers.in make-template etc/usb-mount@.service.in make-template examples/Makefile.in make-template lib/pidp8i/__init__.py.in make-template lib/pidp8i/dirs.py.in make-template lib/pidp8i/ips.py.in make-template media/os8/init.tx.in make-template media/os8/3finit.tx.in make-template src/Makefile.in make-template src/cc8/Makefile.in make-template src/cc8/os8/Makefile.in make-template src/pidp8i/gpio-common.c.in make-template src/pidp8i/main.c.in make-template src/SIMH/Makefile.in make-template src/SIMH/PDP8/Makefile.in make-template tools/simh-update.in make-template Makefile.in | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < | 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 | } result] if {$status == 0} { msg-result $result } else { user-error "Failed to generate autodependency rules: $result!" } # Create file symlinks. Fossil can store these for us, but its # allow-symlinks setting is off by default for belt-and-suspenders # security reasons, so if we make use of it, we complicate the # process for making checkouts on new machines and on existing one # where this hasn't been set to "1" globally. It's simpler to just # re-create them at configure time, leaving Fossil to manage only the # actual files. proc mklink {subdir name} { set olddir [pwd] cd $subdir if {![file exists $name]} { set target "../include/$name" msg-result "Symlinking $name -> $target in $subdir..." exec ln -s $target $name } cd $olddir } set base "[get-define srcdir]/src/cc8" mklink "$base/examples" "libc.h" mklink "$base/examples" "init.h" mklink "$base/os8" "libc.h" mklink "$base/os8" "init.h" # Write outputs. # # NOTE: If you change the list of files here, change INFILES in # Makefile.in, too. # # We're listing the top-level Makefile.in last because the templates # ahead of it may have @include directives which modify the @AUTODEPS@ # value substituted into the top-level Makefile.in's autoreconf target. # # The boot/common.script must precede the rest of boot/*, because they # @include the output version. make-config-header src/config.h \ -auto {ENABLE_* HAVE_* PACKAGE_* SIZEOF_*} \ -bare {ILS_MODE PCB_*} make-template bin/pidp8i.in make-template bin/os8-cp.in make-template tools/os8-cmp.in make-template bin/teco-pi-demo.in make-template boot/common.script.in make-template boot/0.script.in make-template boot/2.script.in make-template boot/3.script.in make-template boot/4.script.in make-template boot/6.script.in make-template boot/7.script.in make-template boot/run.script.in make-template boot/run-v3f.script.in make-template boot/tss8.script.in make-template etc/pidp8i.service.in make-template etc/sudoers.in make-template etc/usb-mount@.service.in make-template examples/Makefile.in make-template lib/os8script.py.in make-template lib/pidp8i/__init__.py.in make-template lib/pidp8i/dirs.py.in make-template lib/pidp8i/ips.py.in make-template lib/simh.py.in make-template bin/os8pkg.in make-template tools/os8-progtest.in make-template media/os8/init.tx.in make-template media/os8/3finit.tx.in make-template media/os8/ock-init.tx.in make-template src/Makefile.in make-template src/cc8/Makefile.in make-template src/cc8/os8/Makefile.in make-template src/pidp8i/gpio-common.c.in make-template src/pidp8i/main.c.in make-template src/SIMH/Makefile.in make-template src/SIMH/PDP8/Makefile.in make-template tools/simh-bisect.in make-template tools/simh-update.in foreach f [concat [glob "$builddir/bin/*"] [glob "$builddir/tools/*"]] { exec chmod +x $f } # Generate the dependencies for packages to build, the install scripts, and # the list of packages selected to install. # We need os8pkg and its prereqs first. So this code appears after those make-template lines. # However, since we build Makefile.in from what is done here, THAT make-template must be later. if {![file exists "obj/os8pkg"]} { file mkdir "obj/os8pkg" } set os8pkgs_all "" set os8pkgs_selected "" set os8pkgs_selected_names "" set os8pkgs_testing "" foreach pspec [glob "$srcdir/pspec/*.pspec"] { set pkg_name [file rootname [file tail $pspec]] set obj_base "obj/os8pkg/$pkg_name" set dep_path "$obj_base.mk" set test_path "$srcdir/scripts/os8-progtest/${pkg_name}.yml" set script_path "$obj_base.os8" set uc_pkg_name [string toupper $pkg_name] set pkg_bin_var "\$(${uc_pkg_name}_PKG_BIN)" if { ![file exists $dep_path] || \ [file mtime $pspec] > [file mtime $dep_path] || \ [file mtime bin/os8pkg] > [file mtime $dep_path] } { exec bin/os8pkg deps $pspec } append os8pkgs_all " $pkg_bin_var" if {$os8bool($pkg_name)} { append os8pkgs_selected_names " $pkg_name" append os8pkgs_selected " $pkg_bin_var" } if {[file exists $test_path]} { append os8pkgs_testing " $pkg_name" } } msg-result "Packages selected for OS/8 RUNTIME packs: $os8pkgs_selected_names" define OS8_PKGS_SELECTED_NAMES $os8pkgs_selected_names define OS8_PKGS_SELECTED $os8pkgs_selected define OS8_PKGS_ALL $os8pkgs_all define OS8_PKGS_TESTING $os8pkgs_testing msg-result "We can test: $os8pkgs_testing" # Must be the last thing we do. make-template Makefile.in |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| | | 1 2 3 4 5 6 7 8 | README.autosetup created by autosetup v0.7.0+ This is the autosetup directory for a local install of autosetup. It contains autosetup, support files and loadable modules. *.tcl files in this directory are optional modules which can be loaded with the 'use' directive. |
︙ | ︙ |
|
| < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
1 2 3 4 5 6 7 | #!/bin/sh # Copyright (c) 2006-2011 WorkWare Systems http://www.workware.net.au/ # All rights reserved # vim:se syntax=tcl: # \ dir=`dirname "$0"`; exec "`$dir/autosetup-find-tclsh`" "$0" "$@" | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/sh # Copyright (c) 2006-2011 WorkWare Systems http://www.workware.net.au/ # All rights reserved # vim:se syntax=tcl: # \ dir=`dirname "$0"`; exec "`$dir/autosetup-find-tclsh`" "$0" "$@" # Note that the version has a trailing + on unreleased versions set autosetup(version) 0.7.0+ # Can be set to 1 to debug early-init problems set autosetup(debug) [expr {"--debug" in $argv}] ################################################################## # # Main flow of control, option handling |
︙ | ︙ | |||
88 89 90 91 92 93 94 | # At the is point we don't know what is a valid option # We simply parse anything that looks like an option set autosetup(getopt) [getopt argv] #"=Core Options:" options-add { | | | | | | 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | # At the is point we don't know what is a valid option # We simply parse anything that looks like an option set autosetup(getopt) [getopt argv] #"=Core Options:" options-add { help:=all => "display help and options. Optional: module name, such as --help=system" licence license => "display the autosetup license" version => "display the version of autosetup" ref:=text manual:=text reference:=text => "display the autosetup command reference. 'text', 'wiki', 'asciidoc' or 'markdown'" debug => "display debugging output as autosetup runs" install:=. => "install autosetup to the current or given directory" } if {$autosetup(installed)} { # hidden options so we can produce a nice error options-add { sysinstall:path } } else { |
︙ | ︙ | |||
199 200 201 202 203 204 205 | } else { user-error "Unexpected parameter: $arg" } } autosetup_add_dep $autosetup(autodef) | | > | > > > | > > > | | | 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 | } else { user-error "Unexpected parameter: $arg" } } autosetup_add_dep $autosetup(autodef) # Add $argv to CONFIGURE_OPTS, but ignore duplicates and quote if needed set configure_opts {} foreach arg $autosetup(argv) { set quoted [quote-if-needed $arg] # O(n^2), but n will be small if {$quoted ni $configure_opts} { lappend configure_opts $quoted } } define CONFIGURE_OPTS [join $configure_opts] define AUTOREMAKE [file-normalize $autosetup(exe)] define-append AUTOREMAKE [get-define CONFIGURE_OPTS] # Log how we were invoked configlog "Invoked as: [getenv WRAPPER $::argv0] [quote-argv $autosetup(argv)]" configlog "Tclsh: [info nameofexecutable]" # Load auto.def as module "auto.def" autosetup_load_module auto.def source $autosetup(autodef) # Could warn here if options {} was not specified show-notices if {$autosetup(debug)} { msg-result "Writing all defines to config.log" |
︙ | ︙ | |||
336 337 338 339 340 341 342 | set result [lindex [dict get $::autosetup(optset) $opt] end] } } if {![info exists result]} { # No user-specified value. Has options-defaults been set? foreach opt $names { | | | | 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 | set result [lindex [dict get $::autosetup(optset) $opt] end] } } if {![info exists result]} { # No user-specified value. Has options-defaults been set? foreach opt $names { if {[dict exists $::autosetup(optdefault) $opt]} { set result [dict get $autosetup(optdefault) $opt] } } } if {[info exists result]} { set value $result if {$retopt} { |
︙ | ︙ | |||
369 370 371 372 373 374 375 | } } } # Parse the option definition in $opts and update # ::autosetup(setoptions) and ::autosetup(optionhelp) appropriately # | | | < | 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 | } } } # Parse the option definition in $opts and update # ::autosetup(setoptions) and ::autosetup(optionhelp) appropriately # proc options-add {opts} { global autosetup # First weed out comment lines set realopts {} foreach line [split $opts \n] { if {![string match "#*" [string trimleft $line]]} { append realopts $line \n } } set opts $realopts for {set i 0} {$i < [llength $opts]} {incr i} { set opt [lindex $opts $i] if {[string match =* $opt]} { # This is a special heading lappend autosetup(optionhelp) [list $opt $autosetup(module)] continue } unset -nocomplain defaultvalue equal value #puts "i=$i, opt=$opt" regexp {^([^:=]*)(:)?(=)?(.*)$} $opt -> name colon equal value if {$name in $autosetup(options)} { |
︙ | ︙ | |||
447 448 449 450 451 452 453 | dict set autosetup(optset) $name $setvalue #puts "Found boolean option --$name=$setvalue" } } else { # String option. lappend autosetup(options) $name | | | | | | | 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 | dict set autosetup(optset) $name $setvalue #puts "Found boolean option --$name=$setvalue" } } else { # String option. lappend autosetup(options) $name if {$equal ne "="} { # Was the option given as "name:value=default"? # If so, set $value to the display name and $defaultvalue to the default # (This is the preferred way to set a default value for a string option) if {[regexp {^([^=]+)=(.*)$} $value -> value defaultvalue]} { dict set autosetup(optdefault) $name $defaultvalue } } # Maybe override the default value if {[dict exists $autosetup(options-defaults) $name]} { # A default was specified with options-defaults, so use it set defaultvalue [dict get $autosetup(options-defaults) $name] dict set autosetup(optdefault) $name $defaultvalue } elseif {![info exists defaultvalue]} { # No default value was given by value=default or options-defaults # so use the value as the default when the plain option with no # value is given (.e.g. just --opt instead of --opt=value) set defaultvalue $value } if {$equal eq "="} { # String option with optional value set opthelp "--$name?=$value?" } else { |
︙ | ︙ | |||
503 504 505 506 507 508 509 | # Now create the help for this option if appropriate if {[lindex $opts $i+1] eq "=>"} { set desc [lindex $opts $i+2] if {[info exists defaultvalue]} { set desc [string map [list @default@ $defaultvalue] $desc] } | < < < < < | | < < < < | < < < < < < < < | 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 | # Now create the help for this option if appropriate if {[lindex $opts $i+1] eq "=>"} { set desc [lindex $opts $i+2] if {[info exists defaultvalue]} { set desc [string map [list @default@ $defaultvalue] $desc] } # A multi-line description lappend autosetup(optionhelp) [list $opthelp $autosetup(module) $desc] incr i 2 } } } # @module-options optionlist # # Deprecated. Simply use 'options' from within a module. proc module-options {opts} { options $opts } proc max {a b} { expr {$a > $b ? $a : $b} } proc options-wrap-desc {text length firstprefix nextprefix initial} { |
︙ | ︙ | |||
560 561 562 563 564 565 566 | set space " " } if {$len} { puts "" } } | > > | > | > > > > | > > > > > > > > > > | 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 | set space " " } if {$len} { puts "" } } # Display options (from $autosetup(optionhelp)) for modules that match # glob pattern $what proc options-show {what} { set local 0 # Determine the max option width set max 0 foreach help $::autosetup(optionhelp) { lassign $help opt module desc if {![string match $what $module]} { continue } if {[string match =* $opt] || [string match \n* $desc]} { continue } set max [max $max [string length $opt]] } set indent [string repeat " " [expr $max+4]] set cols [getenv COLUMNS 80] catch { lassign [exec stty size] rows cols } incr cols -1 # Now output foreach help $::autosetup(optionhelp) { lassign $help opt module desc if {![string match $what $module]} { continue } if {$local == 0 && $module eq "auto.def"} { puts "Local Options:" incr local } if {[string match =* $opt]} { # Output a special heading line" puts [string range $opt 1 end] continue } puts -nonewline " [format %-${max}s $opt]" if {[string match \n* $desc]} { # Output a pre-formatted help description as-is puts $desc } else { options-wrap-desc [string trim $desc] $cols " " $indent [expr $max + 2] } } } |
︙ | ︙ | |||
604 605 606 607 608 609 610 | # ## name[=0|1] => "Description of this boolean option" # # The default is 'name=0', meaning that the option is disabled by default. # If 'name=1' is used to make the option enabled by default, the description should reflect # that with text like "Disable support for ...". # | | | > > > > | > | | | < | > > | | | | | > | 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 | # ## name[=0|1] => "Description of this boolean option" # # The default is 'name=0', meaning that the option is disabled by default. # If 'name=1' is used to make the option enabled by default, the description should reflect # that with text like "Disable support for ...". # # An argument option (one which takes a parameter) is of one of the following forms: # ## name:value => "Description of this option" ## name:value=default => "Description of this option with a default value" ## name:=value => "Description of this option with an optional value" # # If the 'name:value' form is used, the value must be provided with the option (as '--name=myvalue'). # If the 'name:value=default' form is used, the option has the given default value even if not # specified by the user. # If the 'name:=value' form is used, the value is optional and the given value is used # if it is not provided. # # The description may contain '@default@', in which case it will be replaced with the default # value for the option (taking into account defaults specified with 'options-defaults'. # # Undocumented options are also supported by omitting the '=> description'. # These options are not displayed with '--help' and can be useful for internal options or as aliases. # # For example, '--disable-lfs' is an alias for '--disable=largefile': # ## lfs=1 largefile=1 => "Disable large file support" # proc options {optlist} { global autosetup options-add $optlist if {$autosetup(showhelp)} { # If --help, stop now to show help return -code break } if {$autosetup(module) eq "auto.def"} { # Check for invalid options if {[opt-bool option-checking]} { foreach o [dict keys $::autosetup(getopt)] { if {$o ni $::autosetup(options)} { user-error "Unknown option --$o" } } } } } # @options-defaults dictionary # |
︙ | ︙ | |||
1167 1168 1169 1170 1171 1172 1173 1174 | lappend dirs $autosetup(srcdir)/autosetup } foreach m $args { if {[info exists libmodule($m)]} { continue } set libmodule($m) 1 if {[info exists modsource(${m}.tcl)]} { | > | | | | > > > > | > > | 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 | lappend dirs $autosetup(srcdir)/autosetup } foreach m $args { if {[info exists libmodule($m)]} { continue } set libmodule($m) 1 if {[info exists modsource(${m}.tcl)]} { autosetup_load_module $m eval $modsource(${m}.tcl) } else { set locs [list ${m}.tcl ${m}/init.tcl] set found 0 foreach dir $dirs { foreach loc $locs { set source $dir/$loc if {[file exists $source]} { incr found break } } if {$found} { break } } if {$found} { # For the convenience of the "use" source, point to the directory # it is being loaded from set ::usedir [file dirname $source] autosetup_load_module $m source $source autosetup_add_dep $source } else { autosetup-error "use: No such module: $m" } } } } proc autosetup_load_auto_modules {} { global autosetup modsource # First load any embedded auto modules foreach mod [array names modsource *.auto] { autosetup_load_module $mod eval $modsource($mod) } # Now any external auto modules foreach file [glob -nocomplain $autosetup(libdir)/*.auto $autosetup(libdir)/*/*.auto] { autosetup_load_module [file tail $file] source $file } } # Load module source in the global scope by executing the given command proc autosetup_load_module {module args} { global autosetup set prev $autosetup(module) set autosetup(module) $module if {[catch [list uplevel #0 $args] msg opts] ni {0 2 3}} { autosetup-full-error [error-dump $msg $opts $::autosetup(debug)] } set autosetup(module) $prev } # Initial settings set autosetup(exe) $::argv0 set autosetup(istcl) 1 set autosetup(start) [clock millis] set autosetup(installed) 0 set autosetup(sysinstall) 0 set autosetup(msg-checking) 0 set autosetup(msg-quiet) 0 set autosetup(inittypes) {} set autosetup(module) autosetup # Embedded modules are inserted below here set autosetup(installed) 1 set autosetup(sysinstall) 0 # ----- @module asciidoc-formatting.tcl ----- set modsource(asciidoc-formatting.tcl) { |
︙ | ︙ | |||
1430 1431 1432 1433 1434 1435 1436 | proc autosetup_help {what} { use_pager puts "Usage: [file tail $::autosetup(exe)] \[options\] \[settings\]\n" puts "This is [autosetup_version], a build environment \"autoconfigurator\"" puts "See the documentation online at http://msteveb.github.com/autosetup/\n" | | > | < | > > > < > < | < < | | < > | 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 | proc autosetup_help {what} { use_pager puts "Usage: [file tail $::autosetup(exe)] \[options\] \[settings\]\n" puts "This is [autosetup_version], a build environment \"autoconfigurator\"" puts "See the documentation online at http://msteveb.github.com/autosetup/\n" if {$what in {all local}} { # Need to load auto.def now if {[file exists $::autosetup(autodef)]} { # Load auto.def as module "auto.def" autosetup_load_module auto.def source $::autosetup(autodef) } if {$what eq "all"} { set what * } else { set what auto.def } } else { use $what puts "Options for module $what:" } options-show $what exit 0 } proc autosetup_show_license {} { global modsource autosetup use_pager |
︙ | ︙ |
1 2 | #!/bin/sh # Looks for a suitable tclsh or jimsh in the PATH | | | | < < | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/sh # Looks for a suitable tclsh or jimsh in the PATH # If not found, builds a bootstrap jimsh in current dir from source # Prefer $autosetup_tclsh if is set in the environment (unless ./jimsh0 works) d="`dirname "$0"`" for tclsh in ./jimsh0 $autosetup_tclsh jimsh tclsh tclsh8.5 tclsh8.6 tclsh8.7; do { $tclsh "$d/autosetup-test-tclsh"; } 2>/dev/null && exit 0 done echo 1>&2 "No installed jimsh or tclsh, building local bootstrap jimsh0" for cc in ${CC_FOR_BUILD:-cc} gcc; do { $cc -o jimsh0 "$d/jimsh0.c"; } 2>/dev/null || continue ./jimsh0 "$d/autosetup-test-tclsh" && exit 0 done echo 1>&2 "No working C compiler found. Tried ${CC_FOR_BUILD:-cc} and gcc." echo false |
1 2 3 4 5 6 7 8 9 10 | # Copyright (c) 2011 WorkWare Systems http://www.workware.net.au/ # All rights reserved # @synopsis: # # The 'cc-db' module provides a knowledge-base of system idiosyncrasies. # In general, this module can always be included. use cc | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # Copyright (c) 2011 WorkWare Systems http://www.workware.net.au/ # All rights reserved # @synopsis: # # The 'cc-db' module provides a knowledge-base of system idiosyncrasies. # In general, this module can always be included. use cc options {} # openbsd needs sys/types.h to detect some system headers cc-include-needs sys/socket.h sys/types.h cc-include-needs netinet/in.h sys/types.h |
1 2 3 4 5 6 7 8 9 | # Copyright (c) 2011 WorkWare Systems http://www.workware.net.au/ # All rights reserved # @synopsis: # # Provides a library of common tests on top of the 'cc' module. use cc | < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # Copyright (c) 2011 WorkWare Systems http://www.workware.net.au/ # All rights reserved # @synopsis: # # Provides a library of common tests on top of the 'cc' module. use cc # @cc-check-lfs # # The equivalent of the 'AC_SYS_LARGEFILE' macro. # # defines 'HAVE_LFS' if LFS is available, # and defines '_FILE_OFFSET_BITS=64' if necessary # |
︙ | ︙ |
︙ | ︙ | |||
16 17 18 19 20 21 22 | ## SHOBJ_LDFLAGS Flags to use linking a shared object, undefined symbols allowed ## SHOBJ_LDFLAGS_R - as above, but all symbols must be resolved ## SH_LINKRPATH Format for setting the rpath when linking an executable, %s = path ## SH_LINKFLAGS Flags to use linking an executable which will load shared objects ## LD_LIBRARY_PATH Environment variable which specifies path to shared libraries ## STRIPLIBFLAGS Arguments to strip a dynamic library | | | 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | ## SHOBJ_LDFLAGS Flags to use linking a shared object, undefined symbols allowed ## SHOBJ_LDFLAGS_R - as above, but all symbols must be resolved ## SH_LINKRPATH Format for setting the rpath when linking an executable, %s = path ## SH_LINKFLAGS Flags to use linking an executable which will load shared objects ## LD_LIBRARY_PATH Environment variable which specifies path to shared libraries ## STRIPLIBFLAGS Arguments to strip a dynamic library options {} # Defaults: gcc on unix define SHOBJ_CFLAGS -fPIC define SHOBJ_LDFLAGS -shared define SH_CFLAGS -fPIC define SH_LDFLAGS -shared define SH_LINKFLAGS -rdynamic |
︙ | ︙ |
︙ | ︙ | |||
25 26 27 28 29 30 31 | ## CPPFLAGS ## LINKFLAGS ## CC_FOR_BUILD ## LD use system | | | 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | ## CPPFLAGS ## LINKFLAGS ## CC_FOR_BUILD ## LD use system options {} # Checks for the existence of the given function by linking # proc cctest_function {function} { cctest -link 1 -declare "extern void $function\(void);" -code "$function\();" } |
︙ | ︙ | |||
676 677 678 679 680 681 682 | if {[get-define CC] eq ""} { user-error "Could not find a C compiler. Tried: [join $try ", "]" } define CPP [get-env CPP "[get-define CC] -E"] # XXX: Could avoid looking for a C++ compiler until requested | | | | 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 | if {[get-define CC] eq ""} { user-error "Could not find a C compiler. Tried: [join $try ", "]" } define CPP [get-env CPP "[get-define CC] -E"] # XXX: Could avoid looking for a C++ compiler until requested # If CXX isn't found, it is set to the empty string. if {[env-is-set CXX]} { define CXX [find-an-executable -required [get-env CXX ""]] } else { define CXX [find-an-executable [get-define cross]c++ [get-define cross]g++] } # CXXFLAGS default to CFLAGS if not specified define CXXFLAGS [get-env CXXFLAGS [get-define CFLAGS]] # May need a CC_FOR_BUILD, so look for one define CC_FOR_BUILD [find-an-executable [get-env CC_FOR_BUILD ""] cc gcc false] |
︙ | ︙ |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
︙ | ︙ | |||
55 56 57 58 59 60 61 | #define HAVE_MKSTEMP #define HAVE_LINK #define HAVE_SYS_TIME_H #define HAVE_DIRENT_H #define HAVE_UNISTD_H #define HAVE_UMASK #endif | | | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #define HAVE_MKSTEMP #define HAVE_LINK #define HAVE_SYS_TIME_H #define HAVE_DIRENT_H #define HAVE_UNISTD_H #define HAVE_UMASK #endif #define JIM_VERSION 78 #ifndef JIM_WIN32COMPAT_H #define JIM_WIN32COMPAT_H #ifdef __cplusplus extern "C" { |
︙ | ︙ | |||
125 126 127 128 129 130 131 | char *name; } DIR; DIR *opendir(const char *name); int closedir(DIR *dir); struct dirent *readdir(DIR *dir); | < < < < < | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | char *name; } DIR; DIR *opendir(const char *name); int closedir(DIR *dir); struct dirent *readdir(DIR *dir); #endif #endif #ifdef __cplusplus } #endif |
︙ | ︙ | |||
371 372 373 374 375 376 377 378 379 380 381 382 383 384 | void *ptr; struct { void *ptr1; void *ptr2; } twoPtrValue; struct { struct Jim_Var *varPtr; unsigned long callFrameId; int global; } varValue; struct { | > > > > > > | 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 | void *ptr; struct { void *ptr1; void *ptr2; } twoPtrValue; struct { void *ptr; int int1; int int2; } ptrIntValue; struct { struct Jim_Var *varPtr; unsigned long callFrameId; int global; } varValue; struct { |
︙ | ︙ | |||
408 409 410 411 412 413 414 | int lineNumber; } sourceValue; struct { struct Jim_Obj *varNameObjPtr; struct Jim_Obj *indexObjPtr; } dictSubstValue; | < < < < < | 409 410 411 412 413 414 415 416 417 418 419 420 421 422 | int lineNumber; } sourceValue; struct { struct Jim_Obj *varNameObjPtr; struct Jim_Obj *indexObjPtr; } dictSubstValue; struct { int line; int argc; } scriptLineValue; } internalRep; struct Jim_Obj *prevObjPtr; struct Jim_Obj *nextObjPtr; |
︙ | ︙ | |||
570 571 572 573 574 575 576 | Jim_Obj *nullScriptObj; Jim_Obj *emptyObj; Jim_Obj *trueObj; Jim_Obj *falseObj; unsigned long referenceNextId; struct Jim_HashTable references; unsigned long lastCollectId; /* reference max Id of the last GC | | | 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 | Jim_Obj *nullScriptObj; Jim_Obj *emptyObj; Jim_Obj *trueObj; Jim_Obj *falseObj; unsigned long referenceNextId; struct Jim_HashTable references; unsigned long lastCollectId; /* reference max Id of the last GC execution. It's set to ~0 while the collection is running as sentinel to avoid to recursive calls via the [collect] command inside finalizers. */ time_t lastCollectTime; Jim_Obj *stackTrace; Jim_Obj *errorProc; Jim_Obj *unknown; |
︙ | ︙ | |||
635 636 637 638 639 640 641 | JIM_EXPORT void Jim_Free (void *ptr); JIM_EXPORT char * Jim_StrDup (const char *s); JIM_EXPORT char *Jim_StrDupLen(const char *s, int l); JIM_EXPORT char **Jim_GetEnviron(void); JIM_EXPORT void Jim_SetEnviron(char **env); | | | 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 | JIM_EXPORT void Jim_Free (void *ptr); JIM_EXPORT char * Jim_StrDup (const char *s); JIM_EXPORT char *Jim_StrDupLen(const char *s, int l); JIM_EXPORT char **Jim_GetEnviron(void); JIM_EXPORT void Jim_SetEnviron(char **env); JIM_EXPORT int Jim_MakeTempFile(Jim_Interp *interp, const char *filename_template, int unlink_file); JIM_EXPORT int Jim_Eval(Jim_Interp *interp, const char *script); JIM_EXPORT int Jim_EvalSource(Jim_Interp *interp, const char *filename, int lineno, const char *script); |
︙ | ︙ | |||
843 844 845 846 847 848 849 | JIM_EXPORT int Jim_GetReturnCode (Jim_Interp *interp, Jim_Obj *objPtr, int *intPtr); JIM_EXPORT int Jim_EvalExpression (Jim_Interp *interp, | | | 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 | JIM_EXPORT int Jim_GetReturnCode (Jim_Interp *interp, Jim_Obj *objPtr, int *intPtr); JIM_EXPORT int Jim_EvalExpression (Jim_Interp *interp, Jim_Obj *exprObjPtr); JIM_EXPORT int Jim_GetBoolFromExpr (Jim_Interp *interp, Jim_Obj *exprObjPtr, int *boolPtr); JIM_EXPORT int Jim_GetBoolean(Jim_Interp *interp, Jim_Obj *objPtr, int *booleanPtr); |
︙ | ︙ | |||
900 901 902 903 904 905 906 | JIM_EXPORT void Jim_MakeErrorMessage (Jim_Interp *interp); JIM_EXPORT int Jim_InteractivePrompt (Jim_Interp *interp); JIM_EXPORT void Jim_HistoryLoad(const char *filename); JIM_EXPORT void Jim_HistorySave(const char *filename); | | > | 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 | JIM_EXPORT void Jim_MakeErrorMessage (Jim_Interp *interp); JIM_EXPORT int Jim_InteractivePrompt (Jim_Interp *interp); JIM_EXPORT void Jim_HistoryLoad(const char *filename); JIM_EXPORT void Jim_HistorySave(const char *filename); JIM_EXPORT char *Jim_HistoryGetline(Jim_Interp *interp, const char *prompt); JIM_EXPORT void Jim_HistorySetCompletion(Jim_Interp *interp, Jim_Obj *commandObj); JIM_EXPORT void Jim_HistoryAdd(const char *line); JIM_EXPORT void Jim_HistoryShow(void); JIM_EXPORT int Jim_InitStaticExtensions(Jim_Interp *interp); JIM_EXPORT int Jim_StringToWide(const char *str, jim_wide *widePtr, int base); JIM_EXPORT int Jim_IsBigEndian(void); |
︙ | ︙ | |||
1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 | size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size); void regfree(regex_t *preg); #ifdef __cplusplus } #endif #endif int Jim_bootstrapInit(Jim_Interp *interp) { if (Jim_PackageProvide(interp, "bootstrap", "1.0", JIM_ERRMSG)) return JIM_ERR; return Jim_EvalSource(interp, "bootstrap.tcl", 1, "\n" "\n" | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > | | | 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 | size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size); void regfree(regex_t *preg); #ifdef __cplusplus } #endif #endif #ifndef JIM_SIGNAL_H #define JIM_SIGNAL_H #ifdef __cplusplus extern "C" { #endif const char *Jim_SignalId(int sig); #ifdef __cplusplus } #endif #endif #ifndef JIMIOCOMPAT_H #define JIMIOCOMPAT_H #include <stdio.h> #include <errno.h> void Jim_SetResultErrno(Jim_Interp *interp, const char *msg); int Jim_OpenForWrite(const char *filename, int append); int Jim_OpenForRead(const char *filename); #if defined(__MINGW32__) #ifndef STRICT #define STRICT #endif #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <fcntl.h> #include <io.h> #include <process.h> typedef HANDLE pidtype; #define JIM_BAD_PID INVALID_HANDLE_VALUE #define JIM_NO_PID INVALID_HANDLE_VALUE #define WIFEXITED(STATUS) (((STATUS) & 0xff00) == 0) #define WEXITSTATUS(STATUS) ((STATUS) & 0x00ff) #define WIFSIGNALED(STATUS) (((STATUS) & 0xff00) != 0) #define WTERMSIG(STATUS) (((STATUS) >> 8) & 0xff) #define WNOHANG 1 int Jim_Errno(void); pidtype waitpid(pidtype pid, int *status, int nohang); #define HAVE_PIPE #define pipe(P) _pipe((P), 0, O_NOINHERIT) #elif defined(HAVE_UNISTD_H) #include <unistd.h> #include <fcntl.h> #include <sys/wait.h> #include <sys/stat.h> typedef int pidtype; #define Jim_Errno() errno #define JIM_BAD_PID -1 #define JIM_NO_PID 0 #ifndef HAVE_EXECVPE #define execvpe(ARG0, ARGV, ENV) execvp(ARG0, ARGV) #endif #endif #endif int Jim_bootstrapInit(Jim_Interp *interp) { if (Jim_PackageProvide(interp, "bootstrap", "1.0", JIM_ERRMSG)) return JIM_ERR; return Jim_EvalSource(interp, "bootstrap.tcl", 1, "\n" "\n" "proc package {cmd pkg args} {\n" " if {$cmd eq \"require\"} {\n" " foreach path $::auto_path {\n" " set pkgpath $path/$pkg.tcl\n" " if {$path eq \".\"} {\n" " set pkgpath $pkg.tcl\n" " }\n" " if {[file exists $pkgpath]} {\n" " uplevel #0 [list source $pkgpath]\n" " return\n" " }\n" " }\n" " }\n" "}\n" ); } |
︙ | ︙ | |||
1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 | { if (Jim_PackageProvide(interp, "stdlib", "1.0", JIM_ERRMSG)) return JIM_ERR; return Jim_EvalSource(interp, "stdlib.tcl", 1, "\n" "\n" "\n" "proc lambda {arglist args} {\n" " tailcall proc [ref {} function lambda.finalizer] $arglist {*}$args\n" "}\n" "\n" "proc lambda.finalizer {name val} {\n" " rename $name {}\n" | > > > > > > > | 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 | { if (Jim_PackageProvide(interp, "stdlib", "1.0", JIM_ERRMSG)) return JIM_ERR; return Jim_EvalSource(interp, "stdlib.tcl", 1, "\n" "\n" "if {![exists -command ref]} {\n" "\n" " proc ref {args} {{count 0}} {\n" " format %08x [incr count]\n" " }\n" "}\n" "\n" "\n" "proc lambda {arglist args} {\n" " tailcall proc [ref {} function lambda.finalizer] $arglist {*}$args\n" "}\n" "\n" "proc lambda.finalizer {name val} {\n" " rename $name {}\n" |
︙ | ︙ | |||
1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 | " if {$line ne \"\"} {\n" " lappend lines $line\n" " }\n" " }\n" " join $lines \\n\n" "}\n" "\n" "\n" "\n" "proc errorInfo {msg {stacktrace \"\"}} {\n" " if {$stacktrace eq \"\"} {\n" "\n" " set stacktrace [info stacktrace]\n" "\n" | > > > > > > > | 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 | " if {$line ne \"\"} {\n" " lappend lines $line\n" " }\n" " }\n" " join $lines \\n\n" "}\n" "\n" "\n" "\n" "proc defer {script} {\n" " upvar jim::defer v\n" " lappend v $script\n" "}\n" "\n" "\n" "\n" "proc errorInfo {msg {stacktrace \"\"}} {\n" " if {$stacktrace eq \"\"} {\n" "\n" " set stacktrace [info stacktrace]\n" "\n" |
︙ | ︙ | |||
1662 1663 1664 1665 1666 1667 1668 | " catch {$in close}\n" " }\n" "}\n" "\n" "\n" "\n" "proc popen {cmd {mode r}} {\n" | | > > > > | > > > > > > > > > > > | | 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 | " catch {$in close}\n" " }\n" "}\n" "\n" "\n" "\n" "proc popen {cmd {mode r}} {\n" " lassign [pipe] r w\n" " try {\n" " if {[string match \"w*\" $mode]} {\n" " lappend cmd <@$r &\n" " set pids [exec {*}$cmd]\n" " $r close\n" " set f $w\n" " } else {\n" " lappend cmd >@$w &\n" " set pids [exec {*}$cmd]\n" " $w close\n" " set f $r\n" " }\n" " lambda {cmd args} {f pids} {\n" " if {$cmd eq \"pid\"} {\n" " return $pids\n" " }\n" " if {$cmd eq \"getfd\"} {\n" " $f getfd\n" " }\n" " if {$cmd eq \"close\"} {\n" " $f close\n" "\n" " set retopts {}\n" " foreach p $pids {\n" " lassign [wait $p] status - rc\n" " if {$status eq \"CHILDSTATUS\"} {\n" " if {$rc == 0} {\n" " continue\n" " }\n" " set msg \"child process exited abnormally\"\n" " } else {\n" " set msg \"child killed: received signal\"\n" " }\n" " set retopts [list -code error -errorcode [list $status $p $rc] $msg]\n" " }\n" " return {*}$retopts\n" " }\n" " tailcall $f $cmd {*}$args\n" " }\n" " } on error {error opts} {\n" " $r close\n" " $w close\n" " error $error\n" |
︙ | ︙ | |||
1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 | " return -code error \"can not find channel named \\\"$channelId\\\"\"\n" " }\n" " if {[catch {$channelId pid} pids]} {\n" " return \"\"\n" " }\n" " return $pids\n" "}\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" | > | 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 | " return -code error \"can not find channel named \\\"$channelId\\\"\"\n" " }\n" " if {[catch {$channelId pid} pids]} {\n" " return \"\"\n" " }\n" " return $pids\n" "}\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" |
︙ | ︙ | |||
1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 | #include <sys/stat.h> #endif #if defined(HAVE_SYS_SOCKET_H) && defined(HAVE_SELECT) && defined(HAVE_NETINET_IN_H) && defined(HAVE_NETDB_H) && defined(HAVE_ARPA_INET_H) #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #ifdef HAVE_SYS_UN_H #include <sys/un.h> #endif #else #define JIM_ANSIC #endif #if defined(JIM_SSL) #include <openssl/ssl.h> #include <openssl/err.h> | > > > > | 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 | #include <sys/stat.h> #endif #if defined(HAVE_SYS_SOCKET_H) && defined(HAVE_SELECT) && defined(HAVE_NETINET_IN_H) && defined(HAVE_NETDB_H) && defined(HAVE_ARPA_INET_H) #include <sys/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <arpa/inet.h> #include <netdb.h> #ifdef HAVE_SYS_UN_H #include <sys/un.h> #endif #define HAVE_SOCKETS #elif defined (__MINGW32__) #else #define JIM_ANSIC #endif #if defined(JIM_SSL) #include <openssl/ssl.h> #include <openssl/err.h> |
︙ | ︙ | |||
1845 1846 1847 1848 1849 1850 1851 | #else #define IPV6 0 #ifndef PF_INET6 #define PF_INET6 0 #endif #endif | > | > > > | 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 | #else #define IPV6 0 #ifndef PF_INET6 #define PF_INET6 0 #endif #endif #ifdef JIM_ANSIC #undef HAVE_PIPE #undef HAVE_SOCKETPAIR #endif struct AioFile; typedef struct { int (*writer)(struct AioFile *af, const char *buf, int len); int (*reader)(struct AioFile *af, char *buf, int len); |
︙ | ︙ | |||
1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 | if (name) { Jim_SetResultFormatted(interp, "%#s: %s", name, JimAioErrorString(af)); } else { Jim_SetResultString(interp, JimAioErrorString(af), -1); } } static void JimAioDelProc(Jim_Interp *interp, void *privData) { AioFile *af = privData; JIM_NOTUSED(interp); | > > > > > > > > > | 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 | if (name) { Jim_SetResultFormatted(interp, "%#s: %s", name, JimAioErrorString(af)); } else { Jim_SetResultString(interp, JimAioErrorString(af), -1); } } static int JimCheckStreamError(Jim_Interp *interp, AioFile *af) { int ret = af->fops->error(af); if (ret) { JimAioSetError(interp, af->filename); } return ret; } static void JimAioDelProc(Jim_Interp *interp, void *privData) { AioFile *af = privData; JIM_NOTUSED(interp); |
︙ | ︙ | |||
2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 | af = Jim_AioFile(interp, command); if (af == NULL) { return NULL; } return af->fp; } static int aio_cmd_copy(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { AioFile *af = Jim_CmdPrivData(interp); jim_wide count = 0; jim_wide maxlen = JIM_WIDE_MAX; AioFile *outf = Jim_AioFile(interp, argv[0]); | > > > > > > > > > > | 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 | af = Jim_AioFile(interp, command); if (af == NULL) { return NULL; } return af->fp; } static int aio_cmd_getfd(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { AioFile *af = Jim_CmdPrivData(interp); fflush(af->fp); Jim_SetResultInt(interp, fileno(af->fp)); return JIM_OK; } static int aio_cmd_copy(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { AioFile *af = Jim_CmdPrivData(interp); jim_wide count = 0; jim_wide maxlen = JIM_WIDE_MAX; AioFile *outf = Jim_AioFile(interp, argv[0]); |
︙ | ︙ | |||
2222 2223 2224 2225 2226 2227 2228 | Jim_SetResultInt(interp, feof(af->fp)); return JIM_OK; } static int aio_cmd_close(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc == 3) { | | | 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 | Jim_SetResultInt(interp, feof(af->fp)); return JIM_OK; } static int aio_cmd_close(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc == 3) { #if defined(HAVE_SOCKETS) && defined(HAVE_SHUTDOWN) static const char * const options[] = { "r", "w", NULL }; enum { OPT_R, OPT_W, }; int option; AioFile *af = Jim_CmdPrivData(interp); if (Jim_GetEnum(interp, argv[2], options, &option, NULL, JIM_ERRMSG) != JIM_OK) { return JIM_ERR; |
︙ | ︙ | |||
2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 | } (void)fcntl(af->fd, F_SETFL, fmode); } Jim_SetResultInt(interp, (fmode & O_NONBLOCK) ? 1 : 0); return JIM_OK; } #endif #ifdef HAVE_FSYNC static int aio_cmd_sync(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { AioFile *af = Jim_CmdPrivData(interp); fflush(af->fp); | > | 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 | } (void)fcntl(af->fd, F_SETFL, fmode); } Jim_SetResultInt(interp, (fmode & O_NONBLOCK) ? 1 : 0); return JIM_OK; } #endif #ifdef HAVE_FSYNC static int aio_cmd_sync(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { AioFile *af = Jim_CmdPrivData(interp); fflush(af->fp); |
︙ | ︙ | |||
2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 | }, { "copyto", "handle ?size?", aio_cmd_copy, 1, 2, }, { "gets", "?var?", aio_cmd_gets, 0, 1, | > > > > > > > | 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 | }, { "copyto", "handle ?size?", aio_cmd_copy, 1, 2, }, { "getfd", NULL, aio_cmd_getfd, 0, 0, }, { "gets", "?var?", aio_cmd_gets, 0, 1, |
︙ | ︙ | |||
2620 2621 2622 2623 2624 2625 2626 | if (!filename) { filename = Jim_NewStringObj(interp, buf, -1); } Jim_IncrRefCount(filename); if (fh == NULL) { | < > > < | < > > > | < | | < | < < | < < < < | < | | < < < | < | < < < < | < | < | < < < > | | > > > | 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 | if (!filename) { filename = Jim_NewStringObj(interp, buf, -1); } Jim_IncrRefCount(filename); if (fh == NULL) { if (fd >= 0) { #ifndef JIM_ANSIC fh = fdopen(fd, mode); #endif } else fh = fopen(Jim_String(filename), mode); if (fh == NULL) { JimAioSetError(interp, filename); #ifndef JIM_ANSIC if (fd >= 0) { close(fd); } #endif Jim_DecrRefCount(interp, filename); return NULL; } } af = Jim_Alloc(sizeof(*af)); memset(af, 0, sizeof(*af)); af->fp = fh; af->filename = filename; af->openFlags = openFlags; #ifndef JIM_ANSIC af->fd = fileno(fh); #ifdef FD_CLOEXEC if ((openFlags & AIO_KEEPOPEN) == 0) { (void)fcntl(af->fd, F_SETFD, FD_CLOEXEC); } #endif #endif af->addr_family = family; af->fops = &stdio_fops; af->ssl = NULL; Jim_CreateCommand(interp, buf, JimAioSubCmdProc, af, JimAioDelProc); Jim_SetResult(interp, Jim_MakeGlobalNamespaceName(interp, Jim_NewStringObj(interp, buf, -1))); return af; } #if defined(HAVE_PIPE) || (defined(HAVE_SOCKETPAIR) && defined(HAVE_SYS_UN_H)) static int JimMakeChannelPair(Jim_Interp *interp, int p[2], Jim_Obj *filename, const char *hdlfmt, int family, const char *mode[2]) { if (JimMakeChannel(interp, NULL, p[0], filename, hdlfmt, family, mode[0])) { Jim_Obj *objPtr = Jim_NewListObj(interp, NULL, 0); Jim_ListAppendElement(interp, objPtr, Jim_GetResult(interp)); if (JimMakeChannel(interp, NULL, p[1], filename, hdlfmt, family, mode[1])) { Jim_ListAppendElement(interp, objPtr, Jim_GetResult(interp)); Jim_SetResult(interp, objPtr); return JIM_OK; } } close(p[0]); close(p[1]); JimAioSetError(interp, NULL); return JIM_ERR; } #endif #ifdef HAVE_PIPE static int JimAioPipeCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int p[2]; static const char *mode[2] = { "r", "w" }; if (argc != 1) { Jim_WrongNumArgs(interp, 1, argv, ""); return JIM_ERR; } if (pipe(p) != 0) { JimAioSetError(interp, NULL); return JIM_ERR; } return JimMakeChannelPair(interp, p, argv[0], "aio.pipe%ld", 0, mode); } #endif int Jim_aioInit(Jim_Interp *interp) { if (Jim_PackageProvide(interp, "aio", "1.0", JIM_ERRMSG)) return JIM_ERR; #if defined(JIM_SSL) Jim_CreateCommand(interp, "load_ssl_certs", JimAioLoadSSLCertsCommand, NULL, NULL); #endif Jim_CreateCommand(interp, "open", JimAioOpenCommand, NULL, NULL); #ifdef HAVE_SOCKETS Jim_CreateCommand(interp, "socket", JimAioSockCommand, NULL, NULL); #endif #ifdef HAVE_PIPE Jim_CreateCommand(interp, "pipe", JimAioPipeCommand, NULL, NULL); #endif JimMakeChannel(interp, stdin, -1, NULL, "stdin", 0, "r"); JimMakeChannel(interp, stdout, -1, NULL, "stdout", 0, "w"); JimMakeChannel(interp, stderr, -1, NULL, "stderr", 0, "w"); return JIM_OK; |
︙ | ︙ | |||
2824 2825 2826 2827 2828 2829 2830 | #if defined(JIM_REGEXP) #else #include <regex.h> #endif static void FreeRegexpInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { | | | | | | 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 | #if defined(JIM_REGEXP) #else #include <regex.h> #endif static void FreeRegexpInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { regfree(objPtr->internalRep.ptrIntValue.ptr); Jim_Free(objPtr->internalRep.ptrIntValue.ptr); } static const Jim_ObjType regexpObjType = { "regexp", FreeRegexpInternalRep, NULL, NULL, JIM_TYPE_NONE }; static regex_t *SetRegexpFromAny(Jim_Interp *interp, Jim_Obj *objPtr, unsigned flags) { regex_t *compre; const char *pattern; int ret; if (objPtr->typePtr == ®expObjType && objPtr->internalRep.ptrIntValue.ptr && objPtr->internalRep.ptrIntValue.int1 == flags) { return objPtr->internalRep.ptrIntValue.ptr; } pattern = Jim_String(objPtr); compre = Jim_Alloc(sizeof(regex_t)); |
︙ | ︙ | |||
2868 2869 2870 2871 2872 2873 2874 | Jim_Free(compre); return NULL; } Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = ®expObjType; | | | | 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 | Jim_Free(compre); return NULL; } Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = ®expObjType; objPtr->internalRep.ptrIntValue.int1 = flags; objPtr->internalRep.ptrIntValue.ptr = compre; return compre; } int Jim_RegexpCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int opt_indices = 0; |
︙ | ︙ | |||
3331 3332 3333 3334 3335 3336 3337 | #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif # ifndef MAXPATHLEN # define MAXPATHLEN JIM_PATH_LEN # endif | | > > > > > > > | 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 | #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif # ifndef MAXPATHLEN # define MAXPATHLEN JIM_PATH_LEN # endif #if defined(__MINGW32__) || defined(__MSYS__) || defined(_MSC_VER) #define ISWINDOWS 1 #else #define ISWINDOWS 0 #endif #if defined(HAVE_STRUCT_STAT_ST_MTIMESPEC) #define STAT_MTIME_US(STAT) ((STAT).st_mtimespec.tv_sec * 1000000ll + (STAT).st_mtimespec.tv_nsec / 1000) #elif defined(HAVE_STRUCT_STAT_ST_MTIM) #define STAT_MTIME_US(STAT) ((STAT).st_mtim.tv_sec * 1000000ll + (STAT).st_mtim.tv_nsec / 1000) #endif static const char *JimGetFileType(int mode) { if (S_ISREG(mode)) { return "file"; } else if (S_ISDIR(mode)) { |
︙ | ︙ | |||
3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 | AppendStatElement(interp, listObj, "nlink", sb->st_nlink); AppendStatElement(interp, listObj, "uid", sb->st_uid); AppendStatElement(interp, listObj, "gid", sb->st_gid); AppendStatElement(interp, listObj, "size", sb->st_size); AppendStatElement(interp, listObj, "atime", sb->st_atime); AppendStatElement(interp, listObj, "mtime", sb->st_mtime); AppendStatElement(interp, listObj, "ctime", sb->st_ctime); Jim_ListAppendElement(interp, listObj, Jim_NewStringObj(interp, "type", -1)); Jim_ListAppendElement(interp, listObj, Jim_NewStringObj(interp, JimGetFileType((int)sb->st_mode), -1)); if (varName) { Jim_Obj *objPtr; objPtr = Jim_GetVariable(interp, varName, JIM_NONE); | > > > | 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 | AppendStatElement(interp, listObj, "nlink", sb->st_nlink); AppendStatElement(interp, listObj, "uid", sb->st_uid); AppendStatElement(interp, listObj, "gid", sb->st_gid); AppendStatElement(interp, listObj, "size", sb->st_size); AppendStatElement(interp, listObj, "atime", sb->st_atime); AppendStatElement(interp, listObj, "mtime", sb->st_mtime); AppendStatElement(interp, listObj, "ctime", sb->st_ctime); #ifdef STAT_MTIME_US AppendStatElement(interp, listObj, "mtimeus", STAT_MTIME_US(*sb)); #endif Jim_ListAppendElement(interp, listObj, Jim_NewStringObj(interp, "type", -1)); Jim_ListAppendElement(interp, listObj, Jim_NewStringObj(interp, JimGetFileType((int)sb->st_mode), -1)); if (varName) { Jim_Obj *objPtr; objPtr = Jim_GetVariable(interp, varName, JIM_NONE); |
︙ | ︙ | |||
3711 3712 3713 3714 3715 3716 3717 | argv++; } return JIM_OK; } static int file_cmd_tempfile(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { | | | 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 | argv++; } return JIM_OK; } static int file_cmd_tempfile(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int fd = Jim_MakeTempFile(interp, (argc >= 1) ? Jim_String(argv[0]) : NULL, 0); if (fd < 0) { return JIM_ERR; } close(fd); return JIM_OK; |
︙ | ︙ | |||
3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 | if (file_stat(interp, argv[0], &sb) != JIM_OK) { return JIM_ERR; } Jim_SetResultInt(interp, sb.st_atime); return JIM_OK; } static int file_cmd_mtime(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { struct stat sb; if (argc == 2) { | > > > > > > > > > > > > > > > > > > > < | < < | < < < < | < < < < < < < > > > > > > > > > > > > > > > > > > > > | 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 | if (file_stat(interp, argv[0], &sb) != JIM_OK) { return JIM_ERR; } Jim_SetResultInt(interp, sb.st_atime); return JIM_OK; } static int JimSetFileTimes(Jim_Interp *interp, const char *filename, jim_wide us) { #ifdef HAVE_UTIMES struct timeval times[2]; times[1].tv_sec = times[0].tv_sec = us / 1000000; times[1].tv_usec = times[0].tv_usec = us % 1000000; if (utimes(filename, times) != 0) { Jim_SetResultFormatted(interp, "can't set time on \"%s\": %s", filename, strerror(errno)); return JIM_ERR; } return JIM_OK; #else Jim_SetResultString(interp, "Not implemented", -1); return JIM_ERR; #endif } static int file_cmd_mtime(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { struct stat sb; if (argc == 2) { jim_wide secs; if (Jim_GetWide(interp, argv[1], &secs) != JIM_OK) { return JIM_ERR; } return JimSetFileTimes(interp, Jim_String(argv[0]), secs * 1000000); } if (file_stat(interp, argv[0], &sb) != JIM_OK) { return JIM_ERR; } Jim_SetResultInt(interp, sb.st_mtime); return JIM_OK; } #ifdef STAT_MTIME_US static int file_cmd_mtimeus(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { struct stat sb; if (argc == 2) { jim_wide us; if (Jim_GetWide(interp, argv[1], &us) != JIM_OK) { return JIM_ERR; } return JimSetFileTimes(interp, Jim_String(argv[0]), us); } if (file_stat(interp, argv[0], &sb) != JIM_OK) { return JIM_ERR; } Jim_SetResultInt(interp, STAT_MTIME_US(sb)); return JIM_OK; } #endif static int file_cmd_copy(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { return Jim_EvalPrefix(interp, "file copy", argc, argv); } static int file_cmd_size(Jim_Interp *interp, int argc, Jim_Obj *const *argv) |
︙ | ︙ | |||
3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 | { "mtime", "name ?time?", file_cmd_mtime, 1, 2, }, { "copy", "?-force? source dest", file_cmd_copy, 2, 3, }, | > > > > > > > > > | 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 | { "mtime", "name ?time?", file_cmd_mtime, 1, 2, }, #ifdef STAT_MTIME_US { "mtimeus", "name ?time?", file_cmd_mtimeus, 1, 2, }, #endif { "copy", "?-force? source dest", file_cmd_copy, 2, 3, }, |
︙ | ︙ | |||
4282 4283 4284 4285 4286 4287 4288 | return JIM_OK; } #else #include <errno.h> #include <signal.h> | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < | < < < < < | | | < < > | < < < | < < < < | | | 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 | return JIM_OK; } #else #include <errno.h> #include <signal.h> #include <sys/stat.h> struct WaitInfoTable; static char **JimOriginalEnviron(void); static char **JimSaveEnv(char **env); static void JimRestoreEnv(char **env); static int JimCreatePipeline(Jim_Interp *interp, int argc, Jim_Obj *const *argv, pidtype **pidArrayPtr, int *inPipePtr, int *outPipePtr, int *errFilePtr); static void JimDetachPids(struct WaitInfoTable *table, int numPids, const pidtype *pidPtr); static int JimCleanupChildren(Jim_Interp *interp, int numPids, pidtype *pidPtr, Jim_Obj *errStrObj); static int Jim_WaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv); #if defined(__MINGW32__) static pidtype JimStartWinProcess(Jim_Interp *interp, char **argv, char **env, int inputId, int outputId, int errorId); #endif static void Jim_RemoveTrailingNewline(Jim_Obj *objPtr) { int len; const char *s = Jim_GetString(objPtr, &len); if (len > 0 && s[len - 1] == '\n') { objPtr->length--; objPtr->bytes[objPtr->length] = '\0'; } } static int JimAppendStreamToString(Jim_Interp *interp, int fd, Jim_Obj *strObj) { char buf[256]; FILE *fh = fdopen(fd, "r"); int ret = 0; if (fh == NULL) { return -1; } while (1) { |
︙ | ︙ | |||
4450 4451 4452 4453 4454 4455 4456 | static void JimFreeEnv(char **env, char **original_environ) { if (env != original_environ) { Jim_Free(env); } } | < < < < < < < < < < < < < < < | | < | < > > | | | > > > | > > > | > > > > | > > > | | > > > > > > > > > > > > > > > > > > > | | > | | | | | 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 | static void JimFreeEnv(char **env, char **original_environ) { if (env != original_environ) { Jim_Free(env); } } static Jim_Obj *JimMakeErrorCode(Jim_Interp *interp, pidtype pid, int waitStatus, Jim_Obj *errStrObj) { Jim_Obj *errorCode = Jim_NewListObj(interp, NULL, 0); if (pid == JIM_BAD_PID || pid == JIM_NO_PID) { Jim_ListAppendElement(interp, errorCode, Jim_NewStringObj(interp, "NONE", -1)); Jim_ListAppendElement(interp, errorCode, Jim_NewIntObj(interp, (long)pid)); Jim_ListAppendElement(interp, errorCode, Jim_NewIntObj(interp, -1)); } else if (WIFEXITED(waitStatus)) { Jim_ListAppendElement(interp, errorCode, Jim_NewStringObj(interp, "CHILDSTATUS", -1)); Jim_ListAppendElement(interp, errorCode, Jim_NewIntObj(interp, (long)pid)); Jim_ListAppendElement(interp, errorCode, Jim_NewIntObj(interp, WEXITSTATUS(waitStatus))); } else { const char *type; const char *action; const char *signame; if (WIFSIGNALED(waitStatus)) { type = "CHILDKILLED"; action = "killed"; signame = Jim_SignalId(WTERMSIG(waitStatus)); } else { type = "CHILDSUSP"; action = "suspended"; signame = "none"; } Jim_ListAppendElement(interp, errorCode, Jim_NewStringObj(interp, type, -1)); if (errStrObj) { Jim_AppendStrings(interp, errStrObj, "child ", action, " by signal ", Jim_SignalId(WTERMSIG(waitStatus)), "\n", NULL); } Jim_ListAppendElement(interp, errorCode, Jim_NewIntObj(interp, (long)pid)); Jim_ListAppendElement(interp, errorCode, Jim_NewStringObj(interp, signame, -1)); } return errorCode; } static int JimCheckWaitStatus(Jim_Interp *interp, pidtype pid, int waitStatus, Jim_Obj *errStrObj) { if (WIFEXITED(waitStatus) && WEXITSTATUS(waitStatus) == 0) { return JIM_OK; } Jim_SetGlobalVariableStr(interp, "errorCode", JimMakeErrorCode(interp, pid, waitStatus, errStrObj)); return JIM_ERR; } struct WaitInfo { pidtype pid; int status; int flags; }; struct WaitInfoTable { struct WaitInfo *info; int size; int used; int refcount; }; #define WI_DETACHED 2 #define WAIT_TABLE_GROW_BY 4 static void JimFreeWaitInfoTable(struct Jim_Interp *interp, void *privData) { struct WaitInfoTable *table = privData; if (--table->refcount == 0) { Jim_Free(table->info); Jim_Free(table); } } static struct WaitInfoTable *JimAllocWaitInfoTable(void) { struct WaitInfoTable *table = Jim_Alloc(sizeof(*table)); table->info = NULL; table->size = table->used = 0; table->refcount = 1; return table; } static int JimWaitRemove(struct WaitInfoTable *table, pidtype pid) { int i; for (i = 0; i < table->used; i++) { if (pid == table->info[i].pid) { if (i != table->used - 1) { table->info[i] = table->info[table->used - 1]; } table->used--; return 0; } } return -1; } static int Jim_ExecCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int outputId; int errorId; pidtype *pidPtr; int numPids, result; int child_siginfo = 1; Jim_Obj *childErrObj; Jim_Obj *errStrObj; struct WaitInfoTable *table = Jim_CmdPrivData(interp); if (argc > 1 && Jim_CompareStringImmediate(interp, argv[argc - 1], "&")) { Jim_Obj *listObj; int i; argc--; numPids = JimCreatePipeline(interp, argc - 1, argv + 1, &pidPtr, NULL, NULL, NULL); if (numPids < 0) { return JIM_ERR; } listObj = Jim_NewListObj(interp, NULL, 0); for (i = 0; i < numPids; i++) { Jim_ListAppendElement(interp, listObj, Jim_NewIntObj(interp, (long)pidPtr[i])); } Jim_SetResult(interp, listObj); JimDetachPids(table, numPids, pidPtr); Jim_Free(pidPtr); return JIM_OK; } numPids = JimCreatePipeline(interp, argc - 1, argv + 1, &pidPtr, NULL, &outputId, &errorId); if (numPids < 0) { return JIM_ERR; } result = JIM_OK; errStrObj = Jim_NewStringObj(interp, "", 0); if (outputId != -1) { if (JimAppendStreamToString(interp, outputId, errStrObj) < 0) { result = JIM_ERR; Jim_SetResultErrno(interp, "error reading from output pipe"); } } childErrObj = Jim_NewStringObj(interp, "", 0); Jim_IncrRefCount(childErrObj); if (JimCleanupChildren(interp, numPids, pidPtr, childErrObj) != JIM_OK) { result = JIM_ERR; } if (errorId != -1) { int ret; lseek(errorId, 0, SEEK_SET); ret = JimAppendStreamToString(interp, errorId, errStrObj); if (ret < 0) { Jim_SetResultErrno(interp, "error reading from error pipe"); result = JIM_ERR; } else if (ret > 0) { |
︙ | ︙ | |||
4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 | Jim_RemoveTrailingNewline(errStrObj); Jim_SetResult(interp, errStrObj); return result; } static void JimReapDetachedPids(struct WaitInfoTable *table) { struct WaitInfo *waitPtr; int count; int dest; if (!table) { return; } waitPtr = table->info; dest = 0; for (count = table->used; count > 0; waitPtr++, count--) { if (waitPtr->flags & WI_DETACHED) { int status; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < < < | | < < < < < < < < < < < < < < < < < < < < < > > > > > < < < | | | | | > > > > > | > > | | > | > | > | > | | > > | < > > > | > | > > | | | 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 | Jim_RemoveTrailingNewline(errStrObj); Jim_SetResult(interp, errStrObj); return result; } static pidtype JimWaitForProcess(struct WaitInfoTable *table, pidtype pid, int *statusPtr) { if (JimWaitRemove(table, pid) == 0) { waitpid(pid, statusPtr, 0); return pid; } return JIM_BAD_PID; } static void JimDetachPids(struct WaitInfoTable *table, int numPids, const pidtype *pidPtr) { int j; for (j = 0; j < numPids; j++) { int i; for (i = 0; i < table->used; i++) { if (pidPtr[j] == table->info[i].pid) { table->info[i].flags |= WI_DETACHED; break; } } } } static int JimGetChannelFd(Jim_Interp *interp, const char *name) { Jim_Obj *objv[2]; objv[0] = Jim_NewStringObj(interp, name, -1); objv[1] = Jim_NewStringObj(interp, "getfd", -1); if (Jim_EvalObjVector(interp, 2, objv) == JIM_OK) { jim_wide fd; if (Jim_GetWide(interp, Jim_GetResult(interp), &fd) == JIM_OK) { return fd; } } return -1; } static void JimReapDetachedPids(struct WaitInfoTable *table) { struct WaitInfo *waitPtr; int count; int dest; if (!table) { return; } waitPtr = table->info; dest = 0; for (count = table->used; count > 0; waitPtr++, count--) { if (waitPtr->flags & WI_DETACHED) { int status; pidtype pid = waitpid(waitPtr->pid, &status, WNOHANG); if (pid == waitPtr->pid) { table->used--; continue; } } if (waitPtr != &table->info[dest]) { table->info[dest] = *waitPtr; } dest++; } } static int Jim_WaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { struct WaitInfoTable *table = Jim_CmdPrivData(interp); int nohang = 0; pidtype pid; long pidarg; int status; Jim_Obj *errCodeObj; if (argc == 1) { JimReapDetachedPids(table); return JIM_OK; } if (argc > 1 && Jim_CompareStringImmediate(interp, argv[1], "-nohang")) { nohang = 1; } if (argc != nohang + 2) { Jim_WrongNumArgs(interp, 1, argv, "?-nohang? ?pid?"); return JIM_ERR; } if (Jim_GetLong(interp, argv[nohang + 1], &pidarg) != JIM_OK) { return JIM_ERR; } pid = waitpid((pidtype)pidarg, &status, nohang ? WNOHANG : 0); errCodeObj = JimMakeErrorCode(interp, pid, status, NULL); if (pid != JIM_BAD_PID && (WIFEXITED(status) || WIFSIGNALED(status))) { JimWaitRemove(table, pid); } Jim_SetResult(interp, errCodeObj); return JIM_OK; } static int Jim_PidCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc != 1) { Jim_WrongNumArgs(interp, 1, argv, ""); return JIM_ERR; } Jim_SetResultInt(interp, (jim_wide)getpid()); return JIM_OK; } static int JimCreatePipeline(Jim_Interp *interp, int argc, Jim_Obj *const *argv, pidtype **pidArrayPtr, int *inPipePtr, int *outPipePtr, int *errFilePtr) { pidtype *pidPtr = NULL; /* Points to malloc-ed array holding all * the pids of child processes. */ int numPids = 0; /* Actual number of processes that exist * at *pidPtr right now. */ int cmdCount; /* Count of number of distinct commands * found in argc/argv. */ |
︙ | ︙ | |||
4750 4751 4752 4753 4754 4755 4756 | * 2 means error is filehandle name. * All this is ignored if error is NULL */ const char *output = NULL; /* Holds name of output file to pipe to, * or NULL if output goes to stdout/pipe. */ const char *error = NULL; /* Holds name of stderr file to pipe to, * or NULL if stderr goes to stderr/pipe. */ | | | | | | > > > < < | | | | | 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 | * 2 means error is filehandle name. * All this is ignored if error is NULL */ const char *output = NULL; /* Holds name of output file to pipe to, * or NULL if output goes to stdout/pipe. */ const char *error = NULL; /* Holds name of stderr file to pipe to, * or NULL if stderr goes to stderr/pipe. */ int inputId = -1; int outputId = -1; int errorId = -1; int lastOutputId = -1; int pipeIds[2]; int firstArg, lastArg; /* Indexes of first and last arguments in * current command. */ int lastBar; int i; pidtype pid; char **save_environ; #ifndef __MINGW32__ char **child_environ; #endif struct WaitInfoTable *table = Jim_CmdPrivData(interp); char **arg_array = Jim_Alloc(sizeof(*arg_array) * (argc + 1)); int arg_count = 0; if (inPipePtr != NULL) { *inPipePtr = -1; } if (outPipePtr != NULL) { *outPipePtr = -1; } if (errFilePtr != NULL) { *errFilePtr = -1; } pipeIds[0] = pipeIds[1] = -1; cmdCount = 1; lastBar = -1; for (i = 0; i < argc; i++) { const char *arg = Jim_String(argv[i]); if (arg[0] == '<') { |
︙ | ︙ | |||
4877 4878 4879 4880 4881 4882 4883 | } save_environ = JimSaveEnv(JimBuildEnv(interp)); if (input != NULL) { if (inputFile == FILE_TEXT) { | | | > > > > | | | > | | | | | | | | | | < | | | | | | | | | | | < | | | | | | | | | > > | | < > > > > > > > | > > > | > > > | > > > > > | > > | | > > > > > > > | > > > | > > > < > | 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 | } save_environ = JimSaveEnv(JimBuildEnv(interp)); if (input != NULL) { if (inputFile == FILE_TEXT) { inputId = Jim_MakeTempFile(interp, NULL, 1); if (inputId == -1) { goto error; } if (write(inputId, input, input_len) != input_len) { Jim_SetResultErrno(interp, "couldn't write temp file"); close(inputId); goto error; } lseek(inputId, 0L, SEEK_SET); } else if (inputFile == FILE_HANDLE) { int fd = JimGetChannelFd(interp, input); if (fd < 0) { goto error; } inputId = dup(fd); } else { inputId = Jim_OpenForRead(input); if (inputId == -1) { Jim_SetResultFormatted(interp, "couldn't read file \"%s\": %s", input, strerror(Jim_Errno())); goto error; } } } else if (inPipePtr != NULL) { if (pipe(pipeIds) != 0) { Jim_SetResultErrno(interp, "couldn't create input pipe for command"); goto error; } inputId = pipeIds[0]; *inPipePtr = pipeIds[1]; pipeIds[0] = pipeIds[1] = -1; } if (output != NULL) { if (outputFile == FILE_HANDLE) { int fd = JimGetChannelFd(interp, output); if (fd < 0) { goto error; } lastOutputId = dup(fd); } else { lastOutputId = Jim_OpenForWrite(output, outputFile == FILE_APPEND); if (lastOutputId == -1) { Jim_SetResultFormatted(interp, "couldn't write file \"%s\": %s", output, strerror(Jim_Errno())); goto error; } } } else if (outPipePtr != NULL) { if (pipe(pipeIds) != 0) { Jim_SetResultErrno(interp, "couldn't create output pipe"); goto error; } lastOutputId = pipeIds[1]; *outPipePtr = pipeIds[0]; pipeIds[0] = pipeIds[1] = -1; } if (error != NULL) { if (errorFile == FILE_HANDLE) { if (strcmp(error, "1") == 0) { if (lastOutputId != -1) { errorId = dup(lastOutputId); } else { error = "stdout"; } } if (errorId == -1) { int fd = JimGetChannelFd(interp, error); if (fd < 0) { goto error; } errorId = dup(fd); } } else { errorId = Jim_OpenForWrite(error, errorFile == FILE_APPEND); if (errorId == -1) { Jim_SetResultFormatted(interp, "couldn't write file \"%s\": %s", error, strerror(Jim_Errno())); goto error; } } } else if (errFilePtr != NULL) { errorId = Jim_MakeTempFile(interp, NULL, 1); if (errorId == -1) { goto error; } *errFilePtr = dup(errorId); } pidPtr = Jim_Alloc(cmdCount * sizeof(*pidPtr)); for (i = 0; i < numPids; i++) { pidPtr[i] = JIM_BAD_PID; } for (firstArg = 0; firstArg < arg_count; numPids++, firstArg = lastArg + 1) { int pipe_dup_err = 0; int origErrorId = errorId; for (lastArg = firstArg; lastArg < arg_count; lastArg++) { if (strcmp(arg_array[lastArg], "|") == 0) { break; } if (strcmp(arg_array[lastArg], "|&") == 0) { pipe_dup_err = 1; break; } } if (lastArg == firstArg) { Jim_SetResultString(interp, "missing command to exec", -1); goto error; } arg_array[lastArg] = NULL; if (lastArg == arg_count) { outputId = lastOutputId; lastOutputId = -1; } else { if (pipe(pipeIds) != 0) { Jim_SetResultErrno(interp, "couldn't create pipe"); goto error; } outputId = pipeIds[1]; } if (pipe_dup_err) { errorId = outputId; } #ifdef __MINGW32__ pid = JimStartWinProcess(interp, &arg_array[firstArg], save_environ, inputId, outputId, errorId); if (pid == JIM_BAD_PID) { Jim_SetResultFormatted(interp, "couldn't exec \"%s\"", arg_array[firstArg]); goto error; } #else i = strlen(arg_array[firstArg]); child_environ = Jim_GetEnviron(); pid = vfork(); if (pid < 0) { Jim_SetResultErrno(interp, "couldn't fork child process"); goto error; } if (pid == 0) { if (inputId != -1) { dup2(inputId, fileno(stdin)); close(inputId); } if (outputId != -1) { dup2(outputId, fileno(stdout)); if (outputId != errorId) { close(outputId); } } if (errorId != -1) { dup2(errorId, fileno(stderr)); close(errorId); } if (outPipePtr) { close(*outPipePtr); } if (errFilePtr) { close(*errFilePtr); } if (pipeIds[0] != -1) { close(pipeIds[0]); } if (lastOutputId != -1) { close(lastOutputId); } (void)signal(SIGPIPE, SIG_DFL); execvpe(arg_array[firstArg], &arg_array[firstArg], child_environ); if (write(fileno(stderr), "couldn't exec \"", 15) && write(fileno(stderr), arg_array[firstArg], i) && write(fileno(stderr), "\"\n", 2)) { } #ifdef JIM_MAINTAINER { static char *const false_argv[2] = {"false", NULL}; execvp(false_argv[0],false_argv); } #endif |
︙ | ︙ | |||
5068 5069 5070 5071 5072 5073 5074 | pidPtr[numPids] = pid; errorId = origErrorId; | | | | | < | | | | | | | | | | | | | | | | | | | | | | 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 | pidPtr[numPids] = pid; errorId = origErrorId; if (inputId != -1) { close(inputId); } if (outputId != -1) { close(outputId); } inputId = pipeIds[0]; pipeIds[0] = pipeIds[1] = -1; } *pidArrayPtr = pidPtr; cleanup: if (inputId != -1) { close(inputId); } if (lastOutputId != -1) { close(lastOutputId); } if (errorId != -1) { close(errorId); } Jim_Free(arg_array); JimRestoreEnv(save_environ); return numPids; error: if ((inPipePtr != NULL) && (*inPipePtr != -1)) { close(*inPipePtr); *inPipePtr = -1; } if ((outPipePtr != NULL) && (*outPipePtr != -1)) { close(*outPipePtr); *outPipePtr = -1; } if ((errFilePtr != NULL) && (*errFilePtr != -1)) { close(*errFilePtr); *errFilePtr = -1; } if (pipeIds[0] != -1) { close(pipeIds[0]); } if (pipeIds[1] != -1) { close(pipeIds[1]); } if (pidPtr != NULL) { for (i = 0; i < numPids; i++) { if (pidPtr[i] != JIM_BAD_PID) { JimDetachPids(table, 1, &pidPtr[i]); } } Jim_Free(pidPtr); } numPids = -1; goto cleanup; } |
︙ | ︙ | |||
5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 | Jim_Free(pidPtr); return result; } int Jim_execInit(Jim_Interp *interp) { if (Jim_PackageProvide(interp, "exec", "1.0", JIM_ERRMSG)) return JIM_ERR; #ifdef SIGPIPE (void)signal(SIGPIPE, SIG_IGN); #endif | > > | > > > > < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 | Jim_Free(pidPtr); return result; } int Jim_execInit(Jim_Interp *interp) { struct WaitInfoTable *waitinfo; if (Jim_PackageProvide(interp, "exec", "1.0", JIM_ERRMSG)) return JIM_ERR; #ifdef SIGPIPE (void)signal(SIGPIPE, SIG_IGN); #endif waitinfo = JimAllocWaitInfoTable(); Jim_CreateCommand(interp, "exec", Jim_ExecCmd, waitinfo, JimFreeWaitInfoTable); waitinfo->refcount++; Jim_CreateCommand(interp, "wait", Jim_WaitCommand, waitinfo, JimFreeWaitInfoTable); Jim_CreateCommand(interp, "pid", Jim_PidCommand, 0, 0); return JIM_OK; } #if defined(__MINGW32__) static int JimWinFindExecutable(const char *originalName, char fullPath[MAX_PATH]) { int i; static char extensions[][5] = {".exe", "", ".bat"}; for (i = 0; i < (int) (sizeof(extensions) / sizeof(extensions[0])); i++) { |
︙ | ︙ | |||
5489 5490 5491 5492 5493 5494 5495 | Jim_AppendString(interp, strObj, "\"", 1); } } return strObj; } static pidtype | | | | 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 | Jim_AppendString(interp, strObj, "\"", 1); } } return strObj; } static pidtype JimStartWinProcess(Jim_Interp *interp, char **argv, char **env, int inputId, int outputId, int errorId) { STARTUPINFO startInfo; PROCESS_INFORMATION procInfo; HANDLE hProcess; char execPath[MAX_PATH]; pidtype pid = JIM_BAD_PID; Jim_Obj *cmdLineObj; char *winenv; if (JimWinFindExecutable(argv[0], execPath) < 0) { return JIM_BAD_PID; |
︙ | ︙ | |||
5515 5516 5517 5518 5519 5520 5521 | ZeroMemory(&startInfo, sizeof(startInfo)); startInfo.cb = sizeof(startInfo); startInfo.dwFlags = STARTF_USESTDHANDLES; startInfo.hStdInput = INVALID_HANDLE_VALUE; startInfo.hStdOutput= INVALID_HANDLE_VALUE; startInfo.hStdError = INVALID_HANDLE_VALUE; | | < | | < | | < | | | < < > | | < | > | > | < < < | | < | | 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 | ZeroMemory(&startInfo, sizeof(startInfo)); startInfo.cb = sizeof(startInfo); startInfo.dwFlags = STARTF_USESTDHANDLES; startInfo.hStdInput = INVALID_HANDLE_VALUE; startInfo.hStdOutput= INVALID_HANDLE_VALUE; startInfo.hStdError = INVALID_HANDLE_VALUE; if (inputId == -1) { inputId = _fileno(stdin); } DuplicateHandle(hProcess, (HANDLE)_get_osfhandle(inputId), hProcess, &startInfo.hStdInput, 0, TRUE, DUPLICATE_SAME_ACCESS); if (startInfo.hStdInput == INVALID_HANDLE_VALUE) { goto end; } if (outputId == -1) { outputId = _fileno(stdout); } DuplicateHandle(hProcess, (HANDLE)_get_osfhandle(outputId), hProcess, &startInfo.hStdOutput, 0, TRUE, DUPLICATE_SAME_ACCESS); if (startInfo.hStdOutput == INVALID_HANDLE_VALUE) { goto end; } if (errorId == -1) { errorId = _fileno(stderr); } DuplicateHandle(hProcess, (HANDLE)_get_osfhandle(errorId), hProcess, &startInfo.hStdError, 0, TRUE, DUPLICATE_SAME_ACCESS); if (startInfo.hStdError == INVALID_HANDLE_VALUE) { goto end; } if (env == NULL) { winenv = NULL; } |
︙ | ︙ | |||
5574 5575 5576 5577 5578 5579 5580 | WaitForInputIdle(procInfo.hProcess, 5000); CloseHandle(procInfo.hThread); pid = procInfo.hProcess; end: Jim_FreeNewObj(interp, cmdLineObj); | | | | < < < < < | < | < < < < < < < < < < < < < < < < < < < < < | 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 | WaitForInputIdle(procInfo.hProcess, 5000); CloseHandle(procInfo.hThread); pid = procInfo.hProcess; end: Jim_FreeNewObj(interp, cmdLineObj); if (startInfo.hStdInput != INVALID_HANDLE_VALUE) { CloseHandle(startInfo.hStdInput); } if (startInfo.hStdOutput != INVALID_HANDLE_VALUE) { CloseHandle(startInfo.hStdOutput); } if (startInfo.hStdError != INVALID_HANDLE_VALUE) { CloseHandle(startInfo.hStdError); } return pid; } #else static char **JimOriginalEnviron(void) { return Jim_GetEnviron(); } static char **JimSaveEnv(char **env) { |
︙ | ︙ | |||
5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 | JimFreeEnv(Jim_GetEnviron(), env); Jim_SetEnviron(env); } #endif #endif #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 500 #endif #include <stdlib.h> #include <string.h> #include <stdio.h> #include <time.h> #ifdef HAVE_SYS_TIME_H #include <sys/time.h> #endif static int clock_cmd_format(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { char buf[100]; time_t t; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < | > | | < | < > | < > > | | > > > > > > > > > > > > > > | > | > > > > > > > | | | 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 | JimFreeEnv(Jim_GetEnviron(), env); Jim_SetEnviron(env); } #endif #endif #ifdef STRPTIME_NEEDS_XOPEN_SOURCE #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 500 #endif #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include <stdlib.h> #include <string.h> #include <stdio.h> #include <time.h> #ifdef HAVE_SYS_TIME_H #include <sys/time.h> #endif struct clock_options { int gmt; const char *format; }; static int parse_clock_options(Jim_Interp *interp, int argc, Jim_Obj *const *argv, struct clock_options *opts) { static const char * const options[] = { "-gmt", "-format", NULL }; enum { OPT_GMT, OPT_FORMAT, }; int i; for (i = 0; i < argc; i += 2) { int option; if (Jim_GetEnum(interp, argv[i], options, &option, NULL, JIM_ERRMSG | JIM_ENUM_ABBREV) != JIM_OK) { return JIM_ERR; } switch (option) { case OPT_GMT: if (Jim_GetBoolean(interp, argv[i + 1], &opts->gmt) != JIM_OK) { return JIM_ERR; } break; case OPT_FORMAT: opts->format = Jim_String(argv[i + 1]); break; } } return JIM_OK; } static int clock_cmd_format(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { char buf[100]; time_t t; jim_wide seconds; struct clock_options options = { 0, "%a %b %d %H:%M:%S %Z %Y" }; struct tm *tm; if (Jim_GetWide(interp, argv[0], &seconds) != JIM_OK) { return JIM_ERR; } if (argc % 2 == 0) { return -1; } if (parse_clock_options(interp, argc - 1, argv + 1, &options) == JIM_ERR) { return JIM_ERR; } t = seconds; tm = options.gmt ? gmtime(&t) : localtime(&t); if (tm == NULL || strftime(buf, sizeof(buf), options.format, tm) == 0) { Jim_SetResultString(interp, "format string too long or invalid time", -1); return JIM_ERR; } Jim_SetResultString(interp, buf, -1); return JIM_OK; } #ifdef HAVE_STRPTIME static time_t jim_timegm(const struct tm *tm) { int m = tm->tm_mon + 1; int y = 1900 + tm->tm_year - (m <= 2); int era = (y >= 0 ? y : y - 399) / 400; unsigned yoe = (unsigned)(y - era * 400); unsigned doy = (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + tm->tm_mday - 1; unsigned doe = yoe * 365 + yoe / 4 - yoe / 100 + doy; long days = (era * 146097 + (int)doe - 719468); int secs = tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec; return days * 24 * 60 * 60 + secs; } static int clock_cmd_scan(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { char *pt; struct tm tm; time_t now = time(NULL); struct clock_options options = { 0, NULL }; if (argc % 2 == 0) { return -1; } if (parse_clock_options(interp, argc - 1, argv + 1, &options) == JIM_ERR) { return JIM_ERR; } if (options.format == NULL) { return -1; } localtime_r(&now, &tm); pt = strptime(Jim_String(argv[0]), options.format, &tm); if (pt == 0 || *pt != 0) { Jim_SetResultString(interp, "Failed to parse time according to format", -1); return JIM_ERR; } Jim_SetResultInt(interp, options.gmt ? jim_timegm(&tm) : mktime(&tm)); return JIM_OK; } #endif static int clock_cmd_seconds(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { |
︙ | ︙ | |||
5739 5740 5741 5742 5743 5744 5745 | Jim_SetResultInt(interp, (jim_wide) tv.tv_sec * 1000 + tv.tv_usec / 1000); return JIM_OK; } static const jim_subcmd_type clock_command_table[] = { | < < < < < < < > > > > > > > < < < < < < < | < > > > > > > > > | 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 | Jim_SetResultInt(interp, (jim_wide) tv.tv_sec * 1000 + tv.tv_usec / 1000); return JIM_OK; } static const jim_subcmd_type clock_command_table[] = { { "clicks", NULL, clock_cmd_micros, 0, 0, }, { "format", "seconds ?-format string? ?-gmt boolean?", clock_cmd_format, 1, 5, }, { "microseconds", NULL, clock_cmd_micros, 0, 0, }, { "milliseconds", NULL, clock_cmd_millis, 0, 0, }, #ifdef HAVE_STRPTIME { "scan", "str -format format ?-gmt boolean?", clock_cmd_scan, 3, 5, }, #endif { "seconds", NULL, clock_cmd_seconds, 0, 0, }, { NULL } }; int Jim_clockInit(Jim_Interp *interp) { if (Jim_PackageProvide(interp, "clock", "1.0", JIM_ERRMSG)) return JIM_ERR; |
︙ | ︙ | |||
6196 6197 6198 6199 6200 6201 6202 | int start; int end; pattern += utf8_tounicode_case(pattern, &start, nocase); if (pattern[0] == '-' && pattern[1]) { | | | 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 | int start; int end; pattern += utf8_tounicode_case(pattern, &start, nocase); if (pattern[0] == '-' && pattern[1]) { pattern++; pattern += utf8_tounicode_case(pattern, &end, nocase); if ((c >= start && c <= end) || (c >= end && c <= start)) { match = 1; } continue; |
︙ | ︙ | |||
7791 7792 7793 7794 7795 7796 7797 | { const char *start, *end; char *token; int len; start = pc->tstart; end = pc->tend; | > | < < < < | | | | | | | < | 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 | { const char *start, *end; char *token; int len; start = pc->tstart; end = pc->tend; len = (end - start) + 1; if (len < 0) { len = 0; } token = Jim_Alloc(len + 1); if (pc->tt != JIM_TT_ESC) { memcpy(token, start, len); token[len] = '\0'; } else { len = JimEscape(token, start, len); } return Jim_NewStringObjNoAlloc(interp, token, len); } static int JimParseListSep(struct JimParserCtx *pc); static int JimParseListStr(struct JimParserCtx *pc); |
︙ | ︙ | |||
8006 8007 8008 8009 8010 8011 8012 | dupPtr = Jim_NewObj(interp); if (objPtr->bytes == NULL) { dupPtr->bytes = NULL; } else if (objPtr->length == 0) { | < | 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 | dupPtr = Jim_NewObj(interp); if (objPtr->bytes == NULL) { dupPtr->bytes = NULL; } else if (objPtr->length == 0) { dupPtr->bytes = JimEmptyStringRep; dupPtr->length = 0; dupPtr->typePtr = NULL; return dupPtr; } else { dupPtr->bytes = Jim_Alloc(objPtr->length + 1); |
︙ | ︙ | |||
8050 8051 8052 8053 8054 8055 8056 | } int Jim_Length(Jim_Obj *objPtr) { if (objPtr->bytes == NULL) { | < | < < | > > > > > > > > > > > | > | | | < | < > | 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 | } int Jim_Length(Jim_Obj *objPtr) { if (objPtr->bytes == NULL) { Jim_GetString(objPtr, NULL); } return objPtr->length; } const char *Jim_String(Jim_Obj *objPtr) { if (objPtr->bytes == NULL) { Jim_GetString(objPtr, NULL); } return objPtr->bytes; } static void JimSetStringBytes(Jim_Obj *objPtr, const char *str) { objPtr->bytes = Jim_StrDup(str); objPtr->length = strlen(str); } static void FreeDictSubstInternalRep(Jim_Interp *interp, Jim_Obj *objPtr); static void DupDictSubstInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr); static const Jim_ObjType dictSubstObjType = { "dict-substitution", FreeDictSubstInternalRep, DupDictSubstInternalRep, NULL, JIM_TYPE_NONE, }; static void FreeInterpolatedInternalRep(Jim_Interp *interp, Jim_Obj *objPtr); static void DupInterpolatedInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr); static const Jim_ObjType interpolatedObjType = { "interpolated", FreeInterpolatedInternalRep, DupInterpolatedInternalRep, NULL, JIM_TYPE_NONE, }; static void FreeInterpolatedInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { Jim_DecrRefCount(interp, objPtr->internalRep.dictSubstValue.indexObjPtr); } static void DupInterpolatedInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr) { dupPtr->internalRep = srcPtr->internalRep; Jim_IncrRefCount(dupPtr->internalRep.dictSubstValue.indexObjPtr); } static void DupStringInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr); static int SetStringFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr); static const Jim_ObjType stringObjType = { "string", NULL, |
︙ | ︙ | |||
8164 8165 8166 8167 8168 8169 8170 | if (len == -1) len = strlen(s); if (len == 0) { objPtr->bytes = JimEmptyStringRep; } else { | | < < | 8186 8187 8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 | if (len == -1) len = strlen(s); if (len == 0) { objPtr->bytes = JimEmptyStringRep; } else { objPtr->bytes = Jim_StrDupLen(s, len); } objPtr->length = len; objPtr->typePtr = NULL; return objPtr; } |
︙ | ︙ | |||
8454 8455 8456 8457 8458 8459 8460 | static Jim_Obj *JimStringToLower(Jim_Interp *interp, Jim_Obj *strObjPtr) { char *buf; int len; const char *str; | < < < < < < < < | | 8474 8475 8476 8477 8478 8479 8480 8481 8482 8483 8484 8485 8486 8487 8488 8489 8490 8491 8492 8493 8494 8495 8496 8497 8498 8499 8500 8501 8502 8503 8504 8505 8506 8507 8508 8509 8510 8511 8512 8513 8514 8515 8516 8517 8518 8519 8520 8521 8522 | static Jim_Obj *JimStringToLower(Jim_Interp *interp, Jim_Obj *strObjPtr) { char *buf; int len; const char *str; str = Jim_GetString(strObjPtr, &len); #ifdef JIM_UTF8 len *= 2; #endif buf = Jim_Alloc(len + 1); JimStrCopyUpperLower(buf, str, 0); return Jim_NewStringObjNoAlloc(interp, buf, -1); } static Jim_Obj *JimStringToUpper(Jim_Interp *interp, Jim_Obj *strObjPtr) { char *buf; const char *str; int len; str = Jim_GetString(strObjPtr, &len); #ifdef JIM_UTF8 len *= 2; #endif buf = Jim_Alloc(len + 1); JimStrCopyUpperLower(buf, str, 1); return Jim_NewStringObjNoAlloc(interp, buf, -1); } static Jim_Obj *JimStringToTitle(Jim_Interp *interp, Jim_Obj *strObjPtr) { char *buf, *p; int len; int c; const char *str; str = Jim_GetString(strObjPtr, &len); #ifdef JIM_UTF8 len *= 2; #endif buf = p = Jim_Alloc(len + 1); str += utf8_tounicode(str, &c); p += utf8_getchars(p, utf8_title(c)); |
︙ | ︙ | |||
8746 8747 8748 8749 8750 8751 8752 | int Jim_CompareStringImmediate(Jim_Interp *interp, Jim_Obj *objPtr, const char *str) { if (objPtr->typePtr == &comparedStringObjType && objPtr->internalRep.ptr == str) { return 1; } else { | < < | | 8758 8759 8760 8761 8762 8763 8764 8765 8766 8767 8768 8769 8770 8771 8772 | int Jim_CompareStringImmediate(Jim_Interp *interp, Jim_Obj *objPtr, const char *str) { if (objPtr->typePtr == &comparedStringObjType && objPtr->internalRep.ptr == str) { return 1; } else { if (strcmp(str, Jim_String(objPtr)) != 0) return 0; if (objPtr->typePtr != &comparedStringObjType) { Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &comparedStringObjType; } objPtr->internalRep.ptr = (char *)str; |
︙ | ︙ | |||
8944 8945 8946 8947 8948 8949 8950 | t = &tokenlist->list[tokenlist->count++]; t->token = token; t->len = len; t->type = type; t->line = line; } | | > > > > > > > | 8954 8955 8956 8957 8958 8959 8960 8961 8962 8963 8964 8965 8966 8967 8968 8969 8970 8971 8972 8973 8974 8975 8976 8977 8978 8979 8980 8981 8982 8983 8984 8985 | t = &tokenlist->list[tokenlist->count++]; t->token = token; t->len = len; t->type = type; t->line = line; } static int JimCountWordTokens(struct ScriptObj *script, ParseToken *t) { int expand = 1; int count = 0; if (t->type == JIM_TT_STR && !TOKEN_IS_SEP(t[1].type)) { if ((t->len == 1 && *t->token == '*') || (t->len == 6 && strncmp(t->token, "expand", 6) == 0)) { expand = -1; t++; } else { if (script->missing == ' ') { script->missing = '}'; script->linenr = t[1].line; } } } while (!TOKEN_IS_SEP(t->type)) { t++; count++; |
︙ | ︙ | |||
9027 9028 9029 9030 9031 9032 9033 | int wordtokens; while (tokenlist->list[i].type == JIM_TT_SEP) { i++; } | | | 9044 9045 9046 9047 9048 9049 9050 9051 9052 9053 9054 9055 9056 9057 9058 | int wordtokens; while (tokenlist->list[i].type == JIM_TT_SEP) { i++; } wordtokens = JimCountWordTokens(script, tokenlist->list + i); if (wordtokens == 0) { if (lineargs) { linefirst->type = JIM_TT_LINE; linefirst->objPtr = JimNewScriptLineObj(interp, lineargs, linenr); Jim_IncrRefCount(linefirst->objPtr); |
︙ | ︙ | |||
9100 9101 9102 9103 9104 9105 9106 | int Jim_ScriptIsComplete(Jim_Interp *interp, Jim_Obj *scriptObj, char *stateCharPtr) { ScriptObj *script = JimGetScript(interp, scriptObj); if (stateCharPtr) { *stateCharPtr = script->missing; } | | > > > | 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129 9130 9131 9132 9133 9134 9135 9136 9137 9138 9139 9140 9141 9142 9143 9144 9145 9146 9147 9148 9149 9150 9151 | int Jim_ScriptIsComplete(Jim_Interp *interp, Jim_Obj *scriptObj, char *stateCharPtr) { ScriptObj *script = JimGetScript(interp, scriptObj); if (stateCharPtr) { *stateCharPtr = script->missing; } return script->missing == ' ' || script->missing == '}'; } static int JimParseCheckMissing(Jim_Interp *interp, int ch) { const char *msg; switch (ch) { case '\\': case ' ': return JIM_OK; case '[': msg = "unmatched \"[\""; break; case '{': msg = "missing close-brace"; break; case '}': msg = "extra characters after close-brace"; break; case '"': default: msg = "missing quote"; break; } Jim_SetResultString(interp, msg, -1); |
︙ | ︙ | |||
9257 9258 9259 9260 9261 9262 9263 | if (cmdPtr->prevCmd) { JimDecrCmdRefCount(interp, cmdPtr->prevCmd); } Jim_Free(cmdPtr); } } | < | 9277 9278 9279 9280 9281 9282 9283 9284 9285 9286 9287 9288 9289 9290 | if (cmdPtr->prevCmd) { JimDecrCmdRefCount(interp, cmdPtr->prevCmd); } Jim_Free(cmdPtr); } } static void JimVariablesHTValDestructor(void *interp, void *val) { Jim_DecrRefCount(interp, ((Jim_Var *)val)->objPtr); Jim_Free(val); } |
︙ | ︙ | |||
9912 9913 9914 9915 9916 9917 9918 | result = Jim_SetVariableStr(interp, name, objPtr); interp->framePtr = savedFramePtr; return result; } int Jim_SetVariableStrWithStr(Jim_Interp *interp, const char *name, const char *val) { | | < < | < | 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 | result = Jim_SetVariableStr(interp, name, objPtr); interp->framePtr = savedFramePtr; return result; } int Jim_SetVariableStrWithStr(Jim_Interp *interp, const char *name, const char *val) { Jim_Obj *valObjPtr; int result; valObjPtr = Jim_NewStringObj(interp, val, -1); Jim_IncrRefCount(valObjPtr); result = Jim_SetVariableStr(interp, name, valObjPtr); Jim_DecrRefCount(interp, valObjPtr); return result; } int Jim_SetVariableLink(Jim_Interp *interp, Jim_Obj *nameObjPtr, Jim_Obj *targetNameObjPtr, Jim_CallFrame *targetCallFrame) { |
︙ | ︙ | |||
10233 10234 10235 10236 10237 10238 10239 | void FreeDictSubstInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { Jim_DecrRefCount(interp, objPtr->internalRep.dictSubstValue.varNameObjPtr); Jim_DecrRefCount(interp, objPtr->internalRep.dictSubstValue.indexObjPtr); } | | < | > | | < | 10249 10250 10251 10252 10253 10254 10255 10256 10257 10258 10259 10260 10261 10262 10263 10264 10265 10266 10267 10268 10269 | void FreeDictSubstInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { Jim_DecrRefCount(interp, objPtr->internalRep.dictSubstValue.varNameObjPtr); Jim_DecrRefCount(interp, objPtr->internalRep.dictSubstValue.indexObjPtr); } static void DupDictSubstInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr) { dupPtr->internalRep = srcPtr->internalRep; Jim_IncrRefCount(dupPtr->internalRep.dictSubstValue.varNameObjPtr); Jim_IncrRefCount(dupPtr->internalRep.dictSubstValue.indexObjPtr); } static void SetDictSubstFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { if (objPtr->typePtr != &dictSubstObjType) { Jim_Obj *varObjPtr, *keyObjPtr; |
︙ | ︙ | |||
10292 10293 10294 10295 10296 10297 10298 | Jim_DecrRefCount(interp, substKeyObjPtr); return resObjPtr; } static Jim_Obj *JimExpandExprSugar(Jim_Interp *interp, Jim_Obj *objPtr) { | < < | | < < | 10307 10308 10309 10310 10311 10312 10313 10314 10315 10316 10317 10318 10319 10320 10321 10322 | Jim_DecrRefCount(interp, substKeyObjPtr); return resObjPtr; } static Jim_Obj *JimExpandExprSugar(Jim_Interp *interp, Jim_Obj *objPtr) { if (Jim_EvalExpression(interp, objPtr) == JIM_OK) { return Jim_GetResult(interp); } return NULL; } static Jim_CallFrame *JimCreateCallFrame(Jim_Interp *interp, Jim_CallFrame *parent, Jim_Obj *nsObj) { |
︙ | ︙ | |||
10378 10379 10380 10381 10382 10383 10384 10385 10386 10387 10388 10389 10390 10391 | } Jim_FreeStack(localCommands); Jim_Free(localCommands); } return JIM_OK; } #define JIM_FCF_FULL 0 #define JIM_FCF_REUSE 1 static void JimFreeCallFrame(Jim_Interp *interp, Jim_CallFrame *cf, int action) { JimDeleteLocalProcs(interp, cf->localCommands); | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 10389 10390 10391 10392 10393 10394 10395 10396 10397 10398 10399 10400 10401 10402 10403 10404 10405 10406 10407 10408 10409 10410 10411 10412 10413 10414 10415 10416 10417 10418 10419 10420 10421 10422 10423 10424 10425 10426 10427 10428 10429 10430 10431 10432 10433 10434 10435 10436 10437 10438 10439 10440 10441 10442 10443 10444 10445 10446 10447 10448 | } Jim_FreeStack(localCommands); Jim_Free(localCommands); } return JIM_OK; } static int JimInvokeDefer(Jim_Interp *interp, int retcode) { Jim_Obj *objPtr; if (Jim_FindHashEntry(&interp->framePtr->vars, "jim::defer") == NULL) { return retcode; } objPtr = Jim_GetVariableStr(interp, "jim::defer", JIM_NONE); if (objPtr) { int ret = JIM_OK; int i; int listLen = Jim_ListLength(interp, objPtr); Jim_Obj *resultObjPtr; Jim_IncrRefCount(objPtr); resultObjPtr = Jim_GetResult(interp); Jim_IncrRefCount(resultObjPtr); Jim_SetEmptyResult(interp); for (i = listLen; i > 0; i--) { Jim_Obj *scriptObjPtr = Jim_ListGetIndex(interp, objPtr, i - 1); ret = Jim_EvalObj(interp, scriptObjPtr); if (ret != JIM_OK) { break; } } if (ret == JIM_OK || retcode == JIM_ERR) { Jim_SetResult(interp, resultObjPtr); } else { retcode = ret; } Jim_DecrRefCount(interp, resultObjPtr); Jim_DecrRefCount(interp, objPtr); } return retcode; } #define JIM_FCF_FULL 0 #define JIM_FCF_REUSE 1 static void JimFreeCallFrame(Jim_Interp *interp, Jim_CallFrame *cf, int action) { JimDeleteLocalProcs(interp, cf->localCommands); |
︙ | ︙ | |||
10491 10492 10493 10494 10495 10496 10497 10498 10499 10500 10501 10502 10503 10504 | { Jim_CallFrame *cf, *cfx; Jim_Obj *objPtr, *nextObjPtr; for (cf = i->framePtr; cf; cf = cfx) { cfx = cf->parent; JimFreeCallFrame(i, cf, JIM_FCF_FULL); } Jim_DecrRefCount(i, i->emptyObj); Jim_DecrRefCount(i, i->trueObj); Jim_DecrRefCount(i, i->falseObj); | > > | 10548 10549 10550 10551 10552 10553 10554 10555 10556 10557 10558 10559 10560 10561 10562 10563 | { Jim_CallFrame *cf, *cfx; Jim_Obj *objPtr, *nextObjPtr; for (cf = i->framePtr; cf; cf = cfx) { JimInvokeDefer(i, JIM_OK); cfx = cf->parent; JimFreeCallFrame(i, cf, JIM_FCF_FULL); } Jim_DecrRefCount(i, i->emptyObj); Jim_DecrRefCount(i, i->trueObj); Jim_DecrRefCount(i, i->falseObj); |
︙ | ︙ | |||
10521 10522 10523 10524 10525 10526 10527 10528 10529 10530 10531 10532 10533 10534 | if (i->liveList != NULL) { objPtr = i->liveList; printf("\n-------------------------------------\n"); printf("Objects still in the free list:\n"); while (objPtr) { const char *type = objPtr->typePtr ? objPtr->typePtr->name : "string"; if (objPtr->bytes && strlen(objPtr->bytes) > 20) { printf("%p (%d) %-10s: '%.20s...'\n", (void *)objPtr, objPtr->refCount, type, objPtr->bytes); } else { printf("%p (%d) %-10s: '%s'\n", | > | 10580 10581 10582 10583 10584 10585 10586 10587 10588 10589 10590 10591 10592 10593 10594 | if (i->liveList != NULL) { objPtr = i->liveList; printf("\n-------------------------------------\n"); printf("Objects still in the free list:\n"); while (objPtr) { const char *type = objPtr->typePtr ? objPtr->typePtr->name : "string"; Jim_String(objPtr); if (objPtr->bytes && strlen(objPtr->bytes) > 20) { printf("%p (%d) %-10s: '%.20s...'\n", (void *)objPtr, objPtr->refCount, type, objPtr->bytes); } else { printf("%p (%d) %-10s: '%s'\n", |
︙ | ︙ | |||
10941 10942 10943 10944 10945 10946 10947 | static int SetDoubleFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { double doubleValue; jim_wide wideValue; const char *str; | < < < > > | 11001 11002 11003 11004 11005 11006 11007 11008 11009 11010 11011 11012 11013 11014 11015 11016 11017 11018 11019 11020 11021 11022 11023 11024 11025 11026 11027 11028 11029 11030 | static int SetDoubleFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { double doubleValue; jim_wide wideValue; const char *str; #ifdef HAVE_LONG_LONG #define MIN_INT_IN_DOUBLE -(1LL << 53) #define MAX_INT_IN_DOUBLE -(MIN_INT_IN_DOUBLE + 1) if (objPtr->typePtr == &intObjType && JimWideValue(objPtr) >= MIN_INT_IN_DOUBLE && JimWideValue(objPtr) <= MAX_INT_IN_DOUBLE) { objPtr->typePtr = &coercedDoubleObjType; return JIM_OK; } #endif str = Jim_String(objPtr); if (Jim_StringToWide(str, &wideValue, 10) == JIM_OK) { Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &coercedDoubleObjType; objPtr->internalRep.wideValue = wideValue; return JIM_OK; } |
︙ | ︙ | |||
11550 11551 11552 11553 11554 11555 11556 | else { dst++; } ele[dst] = ele[src]; } | > > > | > | 11609 11610 11611 11612 11613 11614 11615 11616 11617 11618 11619 11620 11621 11622 11623 11624 11625 11626 11627 | else { dst++; } ele[dst] = ele[src]; } dst++; if (dst < listObjPtr->internalRep.listValue.len) { ele[dst] = ele[src]; } listObjPtr->internalRep.listValue.len = dst; } static int ListSortElements(Jim_Interp *interp, Jim_Obj *listObjPtr, struct lsort_info *info) |
︙ | ︙ | |||
12327 12328 12329 12330 12331 12332 12333 | "continue", "signal", "exit", "eval", NULL }; | | | 12390 12391 12392 12393 12394 12395 12396 12397 12398 12399 12400 12401 12402 12403 12404 | "continue", "signal", "exit", "eval", NULL }; #define jimReturnCodesSize (sizeof(jimReturnCodes)/sizeof(*jimReturnCodes) - 1) static const Jim_ObjType returnCodeObjType = { "return-code", NULL, NULL, NULL, JIM_TYPE_NONE, |
︙ | ︙ | |||
12380 12381 12382 12383 12384 12385 12386 | static int JimParseExprOperator(struct JimParserCtx *pc); static int JimParseExprNumber(struct JimParserCtx *pc); static int JimParseExprIrrational(struct JimParserCtx *pc); static int JimParseExprBoolean(struct JimParserCtx *pc); | | | < | < < < < < < < < < < < < < < < < < < | < | 12443 12444 12445 12446 12447 12448 12449 12450 12451 12452 12453 12454 12455 12456 12457 12458 12459 12460 12461 12462 12463 12464 12465 12466 12467 12468 12469 12470 12471 12472 12473 12474 12475 12476 12477 12478 12479 12480 12481 12482 12483 12484 12485 12486 12487 12488 12489 12490 12491 12492 12493 12494 12495 12496 12497 12498 12499 | static int JimParseExprOperator(struct JimParserCtx *pc); static int JimParseExprNumber(struct JimParserCtx *pc); static int JimParseExprIrrational(struct JimParserCtx *pc); static int JimParseExprBoolean(struct JimParserCtx *pc); enum { JIM_EXPROP_MUL = JIM_TT_EXPR_OP, JIM_EXPROP_DIV, JIM_EXPROP_MOD, JIM_EXPROP_SUB, JIM_EXPROP_ADD, JIM_EXPROP_LSHIFT, JIM_EXPROP_RSHIFT, JIM_EXPROP_ROTL, JIM_EXPROP_ROTR, JIM_EXPROP_LT, JIM_EXPROP_GT, JIM_EXPROP_LTE, JIM_EXPROP_GTE, JIM_EXPROP_NUMEQ, JIM_EXPROP_NUMNE, JIM_EXPROP_BITAND, JIM_EXPROP_BITXOR, JIM_EXPROP_BITOR, JIM_EXPROP_LOGICAND, JIM_EXPROP_LOGICOR, JIM_EXPROP_TERNARY, JIM_EXPROP_COLON, JIM_EXPROP_POW, JIM_EXPROP_STREQ, JIM_EXPROP_STRNE, JIM_EXPROP_STRIN, JIM_EXPROP_STRNI, JIM_EXPROP_NOT, JIM_EXPROP_BITNOT, JIM_EXPROP_UNARYMINUS, JIM_EXPROP_UNARYPLUS, JIM_EXPROP_FUNC_INT, JIM_EXPROP_FUNC_WIDE, JIM_EXPROP_FUNC_ABS, JIM_EXPROP_FUNC_DOUBLE, JIM_EXPROP_FUNC_ROUND, JIM_EXPROP_FUNC_RAND, JIM_EXPROP_FUNC_SRAND, |
︙ | ︙ | |||
12472 12473 12474 12475 12476 12477 12478 | JIM_EXPROP_FUNC_LOG10, JIM_EXPROP_FUNC_SQRT, JIM_EXPROP_FUNC_POW, JIM_EXPROP_FUNC_HYPOT, JIM_EXPROP_FUNC_FMOD, }; | | > > | | < | | | | | < < < < | | | < < < | | < > > > > > | | 12515 12516 12517 12518 12519 12520 12521 12522 12523 12524 12525 12526 12527 12528 12529 12530 12531 12532 12533 12534 12535 12536 12537 12538 12539 12540 12541 12542 12543 12544 12545 12546 12547 12548 12549 12550 12551 12552 12553 12554 12555 12556 12557 12558 12559 12560 12561 12562 12563 12564 12565 12566 | JIM_EXPROP_FUNC_LOG10, JIM_EXPROP_FUNC_SQRT, JIM_EXPROP_FUNC_POW, JIM_EXPROP_FUNC_HYPOT, JIM_EXPROP_FUNC_FMOD, }; struct JimExprNode { int type; struct Jim_Obj *objPtr; struct JimExprNode *left; struct JimExprNode *right; struct JimExprNode *ternary; }; typedef struct Jim_ExprOperator { const char *name; int (*funcop) (Jim_Interp *interp, struct JimExprNode *opnode); unsigned char precedence; unsigned char arity; unsigned char attr; unsigned char namelen; } Jim_ExprOperator; static int JimExprGetTerm(Jim_Interp *interp, struct JimExprNode *node, Jim_Obj **objPtrPtr); static int JimExprGetTermBoolean(Jim_Interp *interp, struct JimExprNode *node); static int JimExprEvalTermNode(Jim_Interp *interp, struct JimExprNode *node); static int JimExprOpNumUnary(Jim_Interp *interp, struct JimExprNode *node) { int intresult = 1; int rc; double dA, dC = 0; jim_wide wA, wC = 0; Jim_Obj *A; if ((rc = JimExprGetTerm(interp, node->left, &A)) != JIM_OK) { return rc; } if ((A->typePtr != &doubleObjType || A->bytes) && JimGetWideNoErr(interp, A, &wA) == JIM_OK) { switch (node->type) { case JIM_EXPROP_FUNC_INT: case JIM_EXPROP_FUNC_WIDE: case JIM_EXPROP_FUNC_ROUND: case JIM_EXPROP_UNARYPLUS: wC = wA; break; case JIM_EXPROP_FUNC_DOUBLE: |
︙ | ︙ | |||
12536 12537 12538 12539 12540 12541 12542 | wC = !wA; break; default: abort(); } } else if ((rc = Jim_GetDouble(interp, A, &dA)) == JIM_OK) { | | | 12577 12578 12579 12580 12581 12582 12583 12584 12585 12586 12587 12588 12589 12590 12591 | wC = !wA; break; default: abort(); } } else if ((rc = Jim_GetDouble(interp, A, &dA)) == JIM_OK) { switch (node->type) { case JIM_EXPROP_FUNC_INT: case JIM_EXPROP_FUNC_WIDE: wC = dA; break; case JIM_EXPROP_FUNC_ROUND: wC = dA < 0 ? (dA - 0.5) : (dA + 0.5); break; |
︙ | ︙ | |||
12571 12572 12573 12574 12575 12576 12577 | default: abort(); } } if (rc == JIM_OK) { if (intresult) { | | | | > | > | > > | > | | | | | | | | > | | > > > | | 12612 12613 12614 12615 12616 12617 12618 12619 12620 12621 12622 12623 12624 12625 12626 12627 12628 12629 12630 12631 12632 12633 12634 12635 12636 12637 12638 12639 12640 12641 12642 12643 12644 12645 12646 12647 12648 12649 12650 12651 12652 12653 12654 12655 12656 12657 12658 12659 12660 12661 12662 12663 12664 12665 12666 12667 12668 12669 12670 12671 12672 12673 12674 12675 12676 12677 12678 12679 12680 12681 12682 12683 12684 12685 12686 12687 12688 12689 12690 12691 12692 12693 12694 12695 12696 12697 12698 | default: abort(); } } if (rc == JIM_OK) { if (intresult) { Jim_SetResultInt(interp, wC); } else { Jim_SetResult(interp, Jim_NewDoubleObj(interp, dC)); } } Jim_DecrRefCount(interp, A); return rc; } static double JimRandDouble(Jim_Interp *interp) { unsigned long x; JimRandomBytes(interp, &x, sizeof(x)); return (double)x / (unsigned long)~0; } static int JimExprOpIntUnary(Jim_Interp *interp, struct JimExprNode *node) { jim_wide wA; Jim_Obj *A; int rc; if ((rc = JimExprGetTerm(interp, node->left, &A)) != JIM_OK) { return rc; } rc = Jim_GetWide(interp, A, &wA); if (rc == JIM_OK) { switch (node->type) { case JIM_EXPROP_BITNOT: Jim_SetResultInt(interp, ~wA); break; case JIM_EXPROP_FUNC_SRAND: JimPrngSeed(interp, (unsigned char *)&wA, sizeof(wA)); Jim_SetResult(interp, Jim_NewDoubleObj(interp, JimRandDouble(interp))); break; default: abort(); } } Jim_DecrRefCount(interp, A); return rc; } static int JimExprOpNone(Jim_Interp *interp, struct JimExprNode *node) { JimPanic((node->type != JIM_EXPROP_FUNC_RAND, "JimExprOpNone only support rand()")); Jim_SetResult(interp, Jim_NewDoubleObj(interp, JimRandDouble(interp))); return JIM_OK; } #ifdef JIM_MATH_FUNCTIONS static int JimExprOpDoubleUnary(Jim_Interp *interp, struct JimExprNode *node) { int rc; double dA, dC; Jim_Obj *A; if ((rc = JimExprGetTerm(interp, node->left, &A)) != JIM_OK) { return rc; } rc = Jim_GetDouble(interp, A, &dA); if (rc == JIM_OK) { switch (node->type) { case JIM_EXPROP_FUNC_SIN: dC = sin(dA); break; case JIM_EXPROP_FUNC_COS: dC = cos(dA); break; case JIM_EXPROP_FUNC_TAN: |
︙ | ︙ | |||
12683 12684 12685 12686 12687 12688 12689 | break; case JIM_EXPROP_FUNC_SQRT: dC = sqrt(dA); break; default: abort(); } | | | > > | | > > > > > > > | | | | 12733 12734 12735 12736 12737 12738 12739 12740 12741 12742 12743 12744 12745 12746 12747 12748 12749 12750 12751 12752 12753 12754 12755 12756 12757 12758 12759 12760 12761 12762 12763 12764 12765 12766 12767 12768 12769 12770 12771 12772 12773 12774 12775 12776 12777 12778 | break; case JIM_EXPROP_FUNC_SQRT: dC = sqrt(dA); break; default: abort(); } Jim_SetResult(interp, Jim_NewDoubleObj(interp, dC)); } Jim_DecrRefCount(interp, A); return rc; } #endif static int JimExprOpIntBin(Jim_Interp *interp, struct JimExprNode *node) { jim_wide wA, wB; int rc; Jim_Obj *A, *B; if ((rc = JimExprGetTerm(interp, node->left, &A)) != JIM_OK) { return rc; } if ((rc = JimExprGetTerm(interp, node->right, &B)) != JIM_OK) { Jim_DecrRefCount(interp, A); return rc; } rc = JIM_ERR; if (Jim_GetWide(interp, A, &wA) == JIM_OK && Jim_GetWide(interp, B, &wB) == JIM_OK) { jim_wide wC; rc = JIM_OK; switch (node->type) { case JIM_EXPROP_LSHIFT: wC = wA << wB; break; case JIM_EXPROP_RSHIFT: wC = wA >> wB; break; case JIM_EXPROP_BITAND: |
︙ | ︙ | |||
12754 12755 12756 12757 12758 12759 12760 | unsigned long uA = (unsigned long)wA; unsigned long uB = (unsigned long)wB; const unsigned int S = sizeof(unsigned long) * 8; uB %= S; | | | < | > > > > > | < > > | | 12813 12814 12815 12816 12817 12818 12819 12820 12821 12822 12823 12824 12825 12826 12827 12828 12829 12830 12831 12832 12833 12834 12835 12836 12837 12838 12839 12840 12841 12842 12843 12844 12845 12846 12847 12848 12849 12850 12851 12852 12853 12854 12855 12856 12857 12858 12859 12860 12861 12862 12863 12864 12865 12866 12867 12868 | unsigned long uA = (unsigned long)wA; unsigned long uB = (unsigned long)wB; const unsigned int S = sizeof(unsigned long) * 8; uB %= S; if (node->type == JIM_EXPROP_ROTR) { uB = S - uB; } wC = (unsigned long)(uA << uB) | (uA >> (S - uB)); break; } default: abort(); } Jim_SetResultInt(interp, wC); } Jim_DecrRefCount(interp, A); Jim_DecrRefCount(interp, B); return rc; } static int JimExprOpBin(Jim_Interp *interp, struct JimExprNode *node) { int rc = JIM_OK; double dA, dB, dC = 0; jim_wide wA, wB, wC = 0; Jim_Obj *A, *B; if ((rc = JimExprGetTerm(interp, node->left, &A)) != JIM_OK) { return rc; } if ((rc = JimExprGetTerm(interp, node->right, &B)) != JIM_OK) { Jim_DecrRefCount(interp, A); return rc; } if ((A->typePtr != &doubleObjType || A->bytes) && (B->typePtr != &doubleObjType || B->bytes) && JimGetWideNoErr(interp, A, &wA) == JIM_OK && JimGetWideNoErr(interp, B, &wB) == JIM_OK) { switch (node->type) { case JIM_EXPROP_POW: case JIM_EXPROP_FUNC_POW: if (wA == 0 && wB < 0) { Jim_SetResultString(interp, "exponentiation of zero by negative power", -1); rc = JIM_ERR; goto done; } |
︙ | ︙ | |||
12847 12848 12849 12850 12851 12852 12853 | goto intresult; case JIM_EXPROP_NUMNE: wC = wA != wB; goto intresult; } } if (Jim_GetDouble(interp, A, &dA) == JIM_OK && Jim_GetDouble(interp, B, &dB) == JIM_OK) { | | | 12911 12912 12913 12914 12915 12916 12917 12918 12919 12920 12921 12922 12923 12924 12925 | goto intresult; case JIM_EXPROP_NUMNE: wC = wA != wB; goto intresult; } } if (Jim_GetDouble(interp, A, &dA) == JIM_OK && Jim_GetDouble(interp, B, &dB) == JIM_OK) { switch (node->type) { #ifndef JIM_MATH_FUNCTIONS case JIM_EXPROP_POW: case JIM_EXPROP_FUNC_POW: case JIM_EXPROP_FUNC_ATAN2: case JIM_EXPROP_FUNC_HYPOT: case JIM_EXPROP_FUNC_FMOD: Jim_SetResultString(interp, "unsupported", -1); |
︙ | ︙ | |||
12919 12920 12921 12922 12923 12924 12925 | } else { int i = Jim_StringCompareObj(interp, A, B, 0); | | | 12983 12984 12985 12986 12987 12988 12989 12990 12991 12992 12993 12994 12995 12996 12997 | } else { int i = Jim_StringCompareObj(interp, A, B, 0); switch (node->type) { case JIM_EXPROP_LT: wC = i < 0; goto intresult; case JIM_EXPROP_GT: wC = i > 0; goto intresult; case JIM_EXPROP_LTE: |
︙ | ︙ | |||
12947 12948 12949 12950 12951 12952 12953 | rc = JIM_ERR; done: Jim_DecrRefCount(interp, A); Jim_DecrRefCount(interp, B); return rc; intresult: | | | > > | | > > | > > | > | > | > | | | | > > > > | | | | | < | | < < < < < | < < | < < < < | < | < < < < < < < < | | < | < < < | < < < | < | < < < | < < | < | < < | | < < < < < < < < | < < | < < | | | > | | | < < < < | | < < < < < < < < < < < < < | < | < < | < < | < | | < | < < < | | < | < < < < < < < | | < < | < | < < | | | 13011 13012 13013 13014 13015 13016 13017 13018 13019 13020 13021 13022 13023 13024 13025 13026 13027 13028 13029 13030 13031 13032 13033 13034 13035 13036 13037 13038 13039 13040 13041 13042 13043 13044 13045 13046 13047 13048 13049 13050 13051 13052 13053 13054 13055 13056 13057 13058 13059 13060 13061 13062 13063 13064 13065 13066 13067 13068 13069 13070 13071 13072 13073 13074 13075 13076 13077 13078 13079 13080 13081 13082 13083 13084 13085 13086 13087 13088 13089 13090 13091 13092 13093 13094 13095 13096 13097 13098 13099 13100 13101 13102 13103 13104 13105 13106 13107 13108 13109 13110 13111 13112 13113 13114 13115 13116 13117 13118 13119 13120 13121 13122 13123 13124 13125 13126 13127 13128 13129 13130 13131 13132 13133 13134 13135 13136 13137 13138 13139 13140 13141 13142 13143 13144 13145 13146 13147 13148 13149 13150 13151 13152 13153 13154 13155 13156 13157 13158 13159 13160 13161 13162 13163 13164 13165 13166 13167 | rc = JIM_ERR; done: Jim_DecrRefCount(interp, A); Jim_DecrRefCount(interp, B); return rc; intresult: Jim_SetResultInt(interp, wC); goto done; doubleresult: Jim_SetResult(interp, Jim_NewDoubleObj(interp, dC)); goto done; } static int JimSearchList(Jim_Interp *interp, Jim_Obj *listObjPtr, Jim_Obj *valObj) { int listlen; int i; listlen = Jim_ListLength(interp, listObjPtr); for (i = 0; i < listlen; i++) { if (Jim_StringEqObj(Jim_ListGetIndex(interp, listObjPtr, i), valObj)) { return 1; } } return 0; } static int JimExprOpStrBin(Jim_Interp *interp, struct JimExprNode *node) { Jim_Obj *A, *B; jim_wide wC; int rc; if ((rc = JimExprGetTerm(interp, node->left, &A)) != JIM_OK) { return rc; } if ((rc = JimExprGetTerm(interp, node->right, &B)) != JIM_OK) { Jim_DecrRefCount(interp, A); return rc; } switch (node->type) { case JIM_EXPROP_STREQ: case JIM_EXPROP_STRNE: wC = Jim_StringEqObj(A, B); if (node->type == JIM_EXPROP_STRNE) { wC = !wC; } break; case JIM_EXPROP_STRIN: wC = JimSearchList(interp, B, A); break; case JIM_EXPROP_STRNI: wC = !JimSearchList(interp, B, A); break; default: abort(); } Jim_SetResultInt(interp, wC); Jim_DecrRefCount(interp, A); Jim_DecrRefCount(interp, B); return rc; } static int ExprBool(Jim_Interp *interp, Jim_Obj *obj) { long l; double d; int b; int ret = -1; Jim_IncrRefCount(obj); if (Jim_GetLong(interp, obj, &l) == JIM_OK) { ret = (l != 0); } else if (Jim_GetDouble(interp, obj, &d) == JIM_OK) { ret = (d != 0); } else if (Jim_GetBoolean(interp, obj, &b) == JIM_OK) { ret = (b != 0); } Jim_DecrRefCount(interp, obj); return ret; } static int JimExprOpAnd(Jim_Interp *interp, struct JimExprNode *node) { int result = JimExprGetTermBoolean(interp, node->left); if (result == 1) { result = JimExprGetTermBoolean(interp, node->right); } if (result == -1) { return JIM_ERR; } Jim_SetResultInt(interp, result); return JIM_OK; } static int JimExprOpOr(Jim_Interp *interp, struct JimExprNode *node) { int result = JimExprGetTermBoolean(interp, node->left); if (result == 0) { result = JimExprGetTermBoolean(interp, node->right); } if (result == -1) { return JIM_ERR; } Jim_SetResultInt(interp, result); return JIM_OK; } static int JimExprOpTernary(Jim_Interp *interp, struct JimExprNode *node) { int result = JimExprGetTermBoolean(interp, node->left); if (result == 1) { return JimExprEvalTermNode(interp, node->right); } else if (result == 0) { return JimExprEvalTermNode(interp, node->ternary); } return JIM_ERR; } enum { OP_FUNC = 0x0001, OP_RIGHT_ASSOC = 0x0002, }; #define OPRINIT_ATTR(N, P, ARITY, F, ATTR) {N, F, P, ARITY, ATTR, sizeof(N) - 1} #define OPRINIT(N, P, ARITY, F) OPRINIT_ATTR(N, P, ARITY, F, 0) static const struct Jim_ExprOperator Jim_ExprOperators[] = { OPRINIT("*", 110, 2, JimExprOpBin), OPRINIT("/", 110, 2, JimExprOpBin), OPRINIT("%", 110, 2, JimExprOpIntBin), OPRINIT("-", 100, 2, JimExprOpBin), |
︙ | ︙ | |||
13192 13193 13194 13195 13196 13197 13198 | OPRINIT("==", 70, 2, JimExprOpBin), OPRINIT("!=", 70, 2, JimExprOpBin), OPRINIT("&", 50, 2, JimExprOpIntBin), OPRINIT("^", 49, 2, JimExprOpIntBin), OPRINIT("|", 48, 2, JimExprOpIntBin), | < | < < < | < < | < < < | < < | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 13181 13182 13183 13184 13185 13186 13187 13188 13189 13190 13191 13192 13193 13194 13195 13196 13197 13198 13199 13200 13201 13202 13203 13204 13205 13206 13207 13208 13209 13210 13211 13212 13213 13214 13215 13216 13217 13218 13219 13220 13221 13222 13223 13224 13225 13226 13227 13228 13229 13230 13231 13232 13233 13234 13235 13236 13237 13238 13239 13240 13241 13242 13243 13244 13245 13246 13247 | OPRINIT("==", 70, 2, JimExprOpBin), OPRINIT("!=", 70, 2, JimExprOpBin), OPRINIT("&", 50, 2, JimExprOpIntBin), OPRINIT("^", 49, 2, JimExprOpIntBin), OPRINIT("|", 48, 2, JimExprOpIntBin), OPRINIT("&&", 10, 2, JimExprOpAnd), OPRINIT("||", 9, 2, JimExprOpOr), OPRINIT_ATTR("?", 5, 3, JimExprOpTernary, OP_RIGHT_ASSOC), OPRINIT_ATTR(":", 5, 3, NULL, OP_RIGHT_ASSOC), OPRINIT_ATTR("**", 120, 2, JimExprOpBin, OP_RIGHT_ASSOC), OPRINIT("eq", 60, 2, JimExprOpStrBin), OPRINIT("ne", 60, 2, JimExprOpStrBin), OPRINIT("in", 55, 2, JimExprOpStrBin), OPRINIT("ni", 55, 2, JimExprOpStrBin), OPRINIT_ATTR("!", 150, 1, JimExprOpNumUnary, OP_RIGHT_ASSOC), OPRINIT_ATTR("~", 150, 1, JimExprOpIntUnary, OP_RIGHT_ASSOC), OPRINIT_ATTR(" -", 150, 1, JimExprOpNumUnary, OP_RIGHT_ASSOC), OPRINIT_ATTR(" +", 150, 1, JimExprOpNumUnary, OP_RIGHT_ASSOC), OPRINIT_ATTR("int", 200, 1, JimExprOpNumUnary, OP_FUNC), OPRINIT_ATTR("wide", 200, 1, JimExprOpNumUnary, OP_FUNC), OPRINIT_ATTR("abs", 200, 1, JimExprOpNumUnary, OP_FUNC), OPRINIT_ATTR("double", 200, 1, JimExprOpNumUnary, OP_FUNC), OPRINIT_ATTR("round", 200, 1, JimExprOpNumUnary, OP_FUNC), OPRINIT_ATTR("rand", 200, 0, JimExprOpNone, OP_FUNC), OPRINIT_ATTR("srand", 200, 1, JimExprOpIntUnary, OP_FUNC), #ifdef JIM_MATH_FUNCTIONS OPRINIT_ATTR("sin", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("cos", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("tan", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("asin", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("acos", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("atan", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("atan2", 200, 2, JimExprOpBin, OP_FUNC), OPRINIT_ATTR("sinh", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("cosh", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("tanh", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("ceil", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("floor", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("exp", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("log", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("log10", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("sqrt", 200, 1, JimExprOpDoubleUnary, OP_FUNC), OPRINIT_ATTR("pow", 200, 2, JimExprOpBin, OP_FUNC), OPRINIT_ATTR("hypot", 200, 2, JimExprOpBin, OP_FUNC), OPRINIT_ATTR("fmod", 200, 2, JimExprOpBin, OP_FUNC), #endif }; #undef OPRINIT #undef OPRINIT_ATTR #define JIM_EXPR_OPERATORS_NUM \ (sizeof(Jim_ExprOperators)/sizeof(struct Jim_ExprOperator)) static int JimParseExpression(struct JimParserCtx *pc) { |
︙ | ︙ | |||
13410 13411 13412 13413 13414 13415 13416 13417 13418 13419 13420 | pc->tend = pc->p - 1; pc->tt = JIM_TT_EXPR_BOOLEAN; return JIM_OK; } } return JIM_ERR; } static int JimParseExprOperator(struct JimParserCtx *pc) { int i; | > > > > > > > > > > | < | | | | | | | | < < < < < < < < < | 13388 13389 13390 13391 13392 13393 13394 13395 13396 13397 13398 13399 13400 13401 13402 13403 13404 13405 13406 13407 13408 13409 13410 13411 13412 13413 13414 13415 13416 13417 13418 13419 13420 13421 13422 13423 13424 13425 13426 13427 13428 13429 13430 13431 13432 13433 13434 13435 13436 13437 13438 13439 13440 13441 13442 13443 13444 13445 13446 13447 13448 13449 13450 13451 13452 13453 13454 13455 | pc->tend = pc->p - 1; pc->tt = JIM_TT_EXPR_BOOLEAN; return JIM_OK; } } return JIM_ERR; } static const struct Jim_ExprOperator *JimExprOperatorInfoByOpcode(int opcode) { static Jim_ExprOperator dummy_op; if (opcode < JIM_TT_EXPR_OP) { return &dummy_op; } return &Jim_ExprOperators[opcode - JIM_TT_EXPR_OP]; } static int JimParseExprOperator(struct JimParserCtx *pc) { int i; const struct Jim_ExprOperator *bestOp = NULL; int bestLen = 0; for (i = 0; i < (signed)JIM_EXPR_OPERATORS_NUM; i++) { const struct Jim_ExprOperator *op = &Jim_ExprOperators[i]; if (op->name[0] != pc->p[0]) { continue; } if (op->namelen > bestLen && strncmp(op->name, pc->p, op->namelen) == 0) { bestOp = op; bestLen = op->namelen; } } if (bestOp == NULL) { return JIM_ERR; } if (bestOp->attr & OP_FUNC) { const char *p = pc->p + bestLen; int len = pc->len - bestLen; while (len && isspace(UCHAR(*p))) { len--; p++; } if (*p != '(') { return JIM_ERR; } } pc->tend = pc->p + bestLen - 1; pc->p += bestLen; pc->len -= bestLen; pc->tt = (bestOp - Jim_ExprOperators) + JIM_TT_EXPR_OP; return JIM_OK; } const char *jim_tt_name(int type) { static const char * const tt_names[JIM_TT_EXPR_OP] = { "NIL", "STR", "ESC", "VAR", "ARY", "CMD", "SEP", "EOL", "EOF", "LIN", "WRD", "(((", ")))", ",,,", "INT", "DBL", "BOO", "$()" }; if (type < JIM_TT_EXPR_OP) { return tt_names[type]; |
︙ | ︙ | |||
13503 13504 13505 13506 13507 13508 13509 | FreeExprInternalRep, DupExprInternalRep, NULL, JIM_TYPE_REFERENCES, }; | | | > | | < | > | | > | > > > > > | | < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < | | < < < < < < < < < < < < < < < < < < < < < < < < | > > > > | > > > > | > > > > > > > > > | > | | < > > | > > | > > > | > > > | > | > > > | | > | > | > > | > > > | > > > > > | > > > > > | > > > > | | > > | > > | > | > > > > | > > > | > > > > | < > > > | | | | | > > | > > > | > > | > > > > > > > > | < < > > < | | | | > > > | > | > > | < | | | > | | < < > | > | < > | | < > | | > > | | > > > | > | > > | < < | > | > > | < < | > > > > > > | | | < < | > < | | < | < | < < | | | | > > > | > | | | > > > | > > | > > | > > | > > > > | > > | > | | > > > > | | | > > > > > | > > > > < | | > > | > > | < | | < | > | | > > > > > | > | > | | | 13481 13482 13483 13484 13485 13486 13487 13488 13489 13490 13491 13492 13493 13494 13495 13496 13497 13498 13499 13500 13501 13502 13503 13504 13505 13506 13507 13508 13509 13510 13511 13512 13513 13514 13515 13516 13517 13518 13519 13520 13521 13522 13523 13524 13525 13526 13527 13528 13529 13530 13531 13532 13533 13534 13535 13536 13537 13538 13539 13540 13541 13542 13543 13544 13545 13546 13547 13548 13549 13550 13551 13552 13553 13554 13555 13556 13557 13558 13559 13560 13561 13562 13563 13564 13565 13566 13567 13568 13569 13570 13571 13572 13573 13574 13575 13576 13577 13578 13579 13580 13581 13582 13583 13584 13585 13586 13587 13588 13589 13590 13591 13592 13593 13594 13595 13596 13597 13598 13599 13600 13601 13602 13603 13604 13605 13606 13607 13608 13609 13610 13611 13612 13613 13614 13615 13616 13617 13618 13619 13620 13621 13622 13623 13624 13625 13626 13627 13628 13629 13630 13631 13632 13633 13634 13635 13636 13637 13638 13639 13640 13641 13642 13643 13644 13645 13646 13647 13648 13649 13650 13651 13652 13653 13654 13655 13656 13657 13658 13659 13660 13661 13662 13663 13664 13665 13666 13667 13668 13669 13670 13671 13672 13673 13674 13675 13676 13677 13678 13679 13680 13681 13682 13683 13684 13685 13686 13687 13688 13689 13690 13691 13692 13693 13694 13695 13696 13697 13698 13699 13700 13701 13702 13703 13704 13705 13706 13707 13708 13709 13710 13711 13712 13713 13714 13715 13716 13717 13718 13719 13720 13721 13722 13723 13724 13725 13726 13727 13728 13729 13730 13731 13732 13733 13734 13735 13736 13737 13738 13739 13740 13741 13742 13743 13744 13745 13746 13747 13748 13749 13750 13751 13752 13753 13754 13755 13756 13757 13758 13759 13760 13761 13762 13763 13764 13765 13766 13767 13768 13769 13770 13771 13772 13773 13774 13775 13776 13777 13778 13779 13780 13781 13782 13783 13784 13785 13786 13787 13788 13789 13790 13791 13792 13793 13794 13795 13796 13797 13798 13799 13800 13801 13802 13803 13804 13805 13806 13807 13808 13809 13810 13811 13812 13813 13814 13815 13816 13817 13818 13819 13820 13821 13822 13823 13824 13825 13826 13827 13828 13829 13830 13831 13832 13833 13834 13835 13836 13837 13838 13839 13840 13841 13842 13843 13844 13845 13846 13847 13848 13849 13850 13851 13852 13853 13854 13855 13856 13857 13858 13859 13860 13861 13862 13863 13864 13865 13866 13867 13868 13869 13870 13871 13872 13873 13874 13875 13876 13877 13878 | FreeExprInternalRep, DupExprInternalRep, NULL, JIM_TYPE_REFERENCES, }; struct ExprTree { struct JimExprNode *expr; struct JimExprNode *nodes; int len; int inUse; }; static void ExprTreeFreeNodes(Jim_Interp *interp, struct JimExprNode *nodes, int num) { int i; for (i = 0; i < num; i++) { if (nodes[i].objPtr) { Jim_DecrRefCount(interp, nodes[i].objPtr); } } Jim_Free(nodes); } static void ExprTreeFree(Jim_Interp *interp, struct ExprTree *expr) { ExprTreeFreeNodes(interp, expr->nodes, expr->len); Jim_Free(expr); } static void FreeExprInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { struct ExprTree *expr = (void *)objPtr->internalRep.ptr; if (expr) { if (--expr->inUse != 0) { return; } ExprTreeFree(interp, expr); } } static void DupExprInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr) { JIM_NOTUSED(interp); JIM_NOTUSED(srcPtr); dupPtr->typePtr = NULL; } struct ExprBuilder { int parencount; int level; ParseToken *token; ParseToken *first_token; Jim_Stack stack; Jim_Obj *exprObjPtr; Jim_Obj *fileNameObj; struct JimExprNode *nodes; struct JimExprNode *next; }; #ifdef DEBUG_SHOW_EXPR static void JimShowExprNode(struct JimExprNode *node, int level) { int i; for (i = 0; i < level; i++) { printf(" "); } if (TOKEN_IS_EXPR_OP(node->type)) { printf("%s\n", jim_tt_name(node->type)); if (node->left) { JimShowExprNode(node->left, level + 1); } if (node->right) { JimShowExprNode(node->right, level + 1); } if (node->ternary) { JimShowExprNode(node->ternary, level + 1); } } else { printf("[%s] %s\n", jim_tt_name(node->type), Jim_String(node->objPtr)); } } #endif #define EXPR_UNTIL_CLOSE 0x0001 #define EXPR_FUNC_ARGS 0x0002 #define EXPR_TERNARY 0x0004 static int ExprTreeBuildTree(Jim_Interp *interp, struct ExprBuilder *builder, int precedence, int flags, int exp_numterms) { int rc; struct JimExprNode *node; int exp_stacklen = builder->stack.len + exp_numterms; if (builder->level++ > 200) { Jim_SetResultString(interp, "Expression too complex", -1); return JIM_ERR; } while (builder->token->type != JIM_TT_EOL) { ParseToken *t = builder->token++; int prevtt; if (t == builder->first_token) { prevtt = JIM_TT_NONE; } else { prevtt = t[-1].type; } if (t->type == JIM_TT_SUBEXPR_START) { if (builder->stack.len == exp_stacklen) { Jim_SetResultFormatted(interp, "unexpected open parenthesis in expression: \"%#s\"", builder->exprObjPtr); return JIM_ERR; } builder->parencount++; rc = ExprTreeBuildTree(interp, builder, 0, EXPR_UNTIL_CLOSE, 1); if (rc != JIM_OK) { return rc; } } else if (t->type == JIM_TT_SUBEXPR_END) { if (!(flags & EXPR_UNTIL_CLOSE)) { if (builder->stack.len == exp_stacklen && builder->level > 1) { builder->token--; builder->level--; return JIM_OK; } Jim_SetResultFormatted(interp, "unexpected closing parenthesis in expression: \"%#s\"", builder->exprObjPtr); return JIM_ERR; } builder->parencount--; if (builder->stack.len == exp_stacklen) { break; } } else if (t->type == JIM_TT_SUBEXPR_COMMA) { if (!(flags & EXPR_FUNC_ARGS)) { if (builder->stack.len == exp_stacklen) { builder->token--; builder->level--; return JIM_OK; } Jim_SetResultFormatted(interp, "unexpected comma in expression: \"%#s\"", builder->exprObjPtr); return JIM_ERR; } else { if (builder->stack.len > exp_stacklen) { Jim_SetResultFormatted(interp, "too many arguments to math function"); return JIM_ERR; } } } else if (t->type == JIM_EXPROP_COLON) { if (!(flags & EXPR_TERNARY)) { if (builder->level != 1) { builder->token--; builder->level--; return JIM_OK; } Jim_SetResultFormatted(interp, ": without ? in expression: \"%#s\"", builder->exprObjPtr); return JIM_ERR; } if (builder->stack.len == exp_stacklen) { builder->token--; builder->level--; return JIM_OK; } } else if (TOKEN_IS_EXPR_OP(t->type)) { const struct Jim_ExprOperator *op; if (TOKEN_IS_EXPR_OP(prevtt) || TOKEN_IS_EXPR_START(prevtt)) { if (t->type == JIM_EXPROP_SUB) { t->type = JIM_EXPROP_UNARYMINUS; } else if (t->type == JIM_EXPROP_ADD) { t->type = JIM_EXPROP_UNARYPLUS; } } op = JimExprOperatorInfoByOpcode(t->type); if (op->precedence < precedence || (!(op->attr & OP_RIGHT_ASSOC) && op->precedence == precedence)) { builder->token--; break; } if (op->attr & OP_FUNC) { if (builder->token->type != JIM_TT_SUBEXPR_START) { Jim_SetResultString(interp, "missing arguments for math function", -1); return JIM_ERR; } builder->token++; if (op->arity == 0) { if (builder->token->type != JIM_TT_SUBEXPR_END) { Jim_SetResultString(interp, "too many arguments for math function", -1); return JIM_ERR; } builder->token++; goto noargs; } builder->parencount++; rc = ExprTreeBuildTree(interp, builder, 0, EXPR_FUNC_ARGS | EXPR_UNTIL_CLOSE, op->arity); } else if (t->type == JIM_EXPROP_TERNARY) { rc = ExprTreeBuildTree(interp, builder, op->precedence, EXPR_TERNARY, 2); } else { rc = ExprTreeBuildTree(interp, builder, op->precedence, 0, 1); } if (rc != JIM_OK) { return rc; } noargs: node = builder->next++; node->type = t->type; if (op->arity >= 3) { node->ternary = Jim_StackPop(&builder->stack); if (node->ternary == NULL) { goto missingoperand; } } if (op->arity >= 2) { node->right = Jim_StackPop(&builder->stack); if (node->right == NULL) { goto missingoperand; } } if (op->arity >= 1) { node->left = Jim_StackPop(&builder->stack); if (node->left == NULL) { missingoperand: Jim_SetResultFormatted(interp, "missing operand to %s in expression: \"%#s\"", op->name, builder->exprObjPtr); builder->next--; return JIM_ERR; } } Jim_StackPush(&builder->stack, node); } else { Jim_Obj *objPtr = NULL; if (!TOKEN_IS_EXPR_START(prevtt) && !TOKEN_IS_EXPR_OP(prevtt)) { Jim_SetResultFormatted(interp, "missing operator in expression: \"%#s\"", builder->exprObjPtr); return JIM_ERR; } if (t->type == JIM_TT_EXPR_INT || t->type == JIM_TT_EXPR_DOUBLE) { char *endptr; if (t->type == JIM_TT_EXPR_INT) { objPtr = Jim_NewIntObj(interp, jim_strtoull(t->token, &endptr)); } else { objPtr = Jim_NewDoubleObj(interp, strtod(t->token, &endptr)); } if (endptr != t->token + t->len) { Jim_FreeNewObj(interp, objPtr); objPtr = NULL; } } if (!objPtr) { objPtr = Jim_NewStringObj(interp, t->token, t->len); if (t->type == JIM_TT_CMD) { JimSetSourceInfo(interp, objPtr, builder->fileNameObj, t->line); } } node = builder->next++; node->objPtr = objPtr; Jim_IncrRefCount(node->objPtr); node->type = t->type; Jim_StackPush(&builder->stack, node); } } if (builder->stack.len == exp_stacklen) { builder->level--; return JIM_OK; } if ((flags & EXPR_FUNC_ARGS)) { Jim_SetResultFormatted(interp, "too %s arguments for math function", (builder->stack.len < exp_stacklen) ? "few" : "many"); } else { if (builder->stack.len < exp_stacklen) { if (builder->level == 0) { Jim_SetResultFormatted(interp, "empty expression"); } else { Jim_SetResultFormatted(interp, "syntax error in expression \"%#s\": premature end of expression", builder->exprObjPtr); } } else { Jim_SetResultFormatted(interp, "extra terms after expression"); } } return JIM_ERR; } static struct ExprTree *ExprTreeCreateTree(Jim_Interp *interp, const ParseTokenList *tokenlist, Jim_Obj *exprObjPtr, Jim_Obj *fileNameObj) { struct ExprTree *expr; struct ExprBuilder builder; int rc; struct JimExprNode *top = NULL; builder.parencount = 0; builder.level = 0; builder.token = builder.first_token = tokenlist->list; builder.exprObjPtr = exprObjPtr; builder.fileNameObj = fileNameObj; builder.nodes = malloc(sizeof(struct JimExprNode) * (tokenlist->count - 1)); memset(builder.nodes, 0, sizeof(struct JimExprNode) * (tokenlist->count - 1)); builder.next = builder.nodes; Jim_InitStack(&builder.stack); rc = ExprTreeBuildTree(interp, &builder, 0, 0, 1); if (rc == JIM_OK) { top = Jim_StackPop(&builder.stack); if (builder.parencount) { Jim_SetResultString(interp, "missing close parenthesis", -1); rc = JIM_ERR; } } Jim_FreeStack(&builder.stack); if (rc != JIM_OK) { ExprTreeFreeNodes(interp, builder.nodes, builder.next - builder.nodes); return NULL; } expr = Jim_Alloc(sizeof(*expr)); expr->inUse = 1; expr->expr = top; expr->nodes = builder.nodes; expr->len = builder.next - builder.nodes; assert(expr->len <= tokenlist->count - 1); return expr; } static int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) { int exprTextLen; const char *exprText; struct JimParserCtx parser; struct ExprTree *expr; ParseTokenList tokenlist; int line; Jim_Obj *fileNameObj; int rc = JIM_ERR; if (objPtr->typePtr == &sourceObjType) { |
︙ | ︙ | |||
13995 13996 13997 13998 13999 14000 14001 | if (JimParseCheckMissing(interp, parser.missing.ch) == JIM_ERR) { ScriptTokenListFree(&tokenlist); Jim_DecrRefCount(interp, fileNameObj); return JIM_ERR; } | | < < < | < < | < < < < < < < < < < < | | | | | | | | | | > | > > > > > > | | > > > > > > > | > > > > > > > | > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < | | < | | | < | | | | 13917 13918 13919 13920 13921 13922 13923 13924 13925 13926 13927 13928 13929 13930 13931 13932 13933 13934 13935 13936 13937 13938 13939 13940 13941 13942 13943 13944 13945 13946 13947 13948 13949 13950 13951 13952 13953 13954 13955 13956 13957 13958 13959 13960 13961 13962 13963 13964 13965 13966 13967 13968 13969 13970 13971 13972 13973 13974 13975 13976 13977 13978 13979 13980 13981 13982 13983 13984 13985 13986 13987 13988 13989 13990 13991 13992 13993 13994 13995 13996 13997 13998 13999 14000 14001 14002 14003 14004 14005 14006 14007 14008 14009 14010 14011 14012 14013 14014 14015 14016 14017 14018 14019 14020 14021 14022 14023 14024 14025 14026 14027 14028 14029 14030 14031 14032 14033 14034 14035 14036 14037 14038 14039 14040 14041 14042 14043 14044 14045 14046 14047 14048 14049 14050 14051 14052 14053 14054 14055 14056 14057 14058 14059 14060 14061 14062 14063 14064 14065 14066 14067 14068 14069 14070 14071 14072 14073 14074 14075 14076 14077 14078 14079 14080 14081 14082 14083 14084 14085 14086 14087 14088 14089 14090 14091 14092 14093 | if (JimParseCheckMissing(interp, parser.missing.ch) == JIM_ERR) { ScriptTokenListFree(&tokenlist); Jim_DecrRefCount(interp, fileNameObj); return JIM_ERR; } expr = ExprTreeCreateTree(interp, &tokenlist, objPtr, fileNameObj); ScriptTokenListFree(&tokenlist); if (!expr) { goto err; } #ifdef DEBUG_SHOW_EXPR printf("==== Expr ====\n"); JimShowExprNode(expr->expr, 0); #endif rc = JIM_OK; err: Jim_DecrRefCount(interp, fileNameObj); Jim_FreeIntRep(interp, objPtr); Jim_SetIntRepPtr(objPtr, expr); objPtr->typePtr = &exprObjType; return rc; } static struct ExprTree *JimGetExpression(Jim_Interp *interp, Jim_Obj *objPtr) { if (objPtr->typePtr != &exprObjType) { if (SetExprFromAny(interp, objPtr) != JIM_OK) { return NULL; } } return (struct ExprTree *) Jim_GetIntRepPtr(objPtr); } #ifdef JIM_OPTIMIZATION static Jim_Obj *JimExprIntValOrVar(Jim_Interp *interp, struct JimExprNode *node) { if (node->type == JIM_TT_EXPR_INT) return node->objPtr; else if (node->type == JIM_TT_VAR) return Jim_GetVariable(interp, node->objPtr, JIM_NONE); else if (node->type == JIM_TT_DICTSUGAR) return JimExpandDictSugar(interp, node->objPtr); else return NULL; } #endif static int JimExprEvalTermNode(Jim_Interp *interp, struct JimExprNode *node) { if (TOKEN_IS_EXPR_OP(node->type)) { const struct Jim_ExprOperator *op = JimExprOperatorInfoByOpcode(node->type); return op->funcop(interp, node); } else { Jim_Obj *objPtr; switch (node->type) { case JIM_TT_EXPR_INT: case JIM_TT_EXPR_DOUBLE: case JIM_TT_EXPR_BOOLEAN: case JIM_TT_STR: Jim_SetResult(interp, node->objPtr); return JIM_OK; case JIM_TT_VAR: objPtr = Jim_GetVariable(interp, node->objPtr, JIM_ERRMSG); if (objPtr) { Jim_SetResult(interp, objPtr); return JIM_OK; } return JIM_ERR; case JIM_TT_DICTSUGAR: objPtr = JimExpandDictSugar(interp, node->objPtr); if (objPtr) { Jim_SetResult(interp, objPtr); return JIM_OK; } return JIM_ERR; case JIM_TT_ESC: if (Jim_SubstObj(interp, node->objPtr, &objPtr, JIM_NONE) == JIM_OK) { Jim_SetResult(interp, objPtr); return JIM_OK; } return JIM_ERR; case JIM_TT_CMD: return Jim_EvalObj(interp, node->objPtr); default: return JIM_ERR; } } } static int JimExprGetTerm(Jim_Interp *interp, struct JimExprNode *node, Jim_Obj **objPtrPtr) { int rc = JimExprEvalTermNode(interp, node); if (rc == JIM_OK) { *objPtrPtr = Jim_GetResult(interp); Jim_IncrRefCount(*objPtrPtr); } return rc; } static int JimExprGetTermBoolean(Jim_Interp *interp, struct JimExprNode *node) { if (JimExprEvalTermNode(interp, node) == JIM_OK) { return ExprBool(interp, Jim_GetResult(interp)); } return -1; } int Jim_EvalExpression(Jim_Interp *interp, Jim_Obj *exprObjPtr) { struct ExprTree *expr; int retcode = JIM_OK; expr = JimGetExpression(interp, exprObjPtr); if (!expr) { return JIM_ERR; } #ifdef JIM_OPTIMIZATION { Jim_Obj *objPtr; switch (expr->len) { case 1: objPtr = JimExprIntValOrVar(interp, expr->expr); if (objPtr) { Jim_SetResult(interp, objPtr); return JIM_OK; } break; case 2: if (expr->expr->type == JIM_EXPROP_NOT) { objPtr = JimExprIntValOrVar(interp, expr->expr->left); if (objPtr && JimIsWide(objPtr)) { Jim_SetResult(interp, JimWideValue(objPtr) ? interp->falseObj : interp->trueObj); return JIM_OK; } } break; case 3: objPtr = JimExprIntValOrVar(interp, expr->expr->left); if (objPtr && JimIsWide(objPtr)) { Jim_Obj *objPtr2 = JimExprIntValOrVar(interp, expr->expr->right); if (objPtr2 && JimIsWide(objPtr2)) { jim_wide wideValueA = JimWideValue(objPtr); jim_wide wideValueB = JimWideValue(objPtr2); int cmpRes; switch (expr->expr->type) { case JIM_EXPROP_LT: cmpRes = wideValueA < wideValueB; break; case JIM_EXPROP_LTE: cmpRes = wideValueA <= wideValueB; break; case JIM_EXPROP_GT: |
︙ | ︙ | |||
14132 14133 14134 14135 14136 14137 14138 | break; case JIM_EXPROP_NUMNE: cmpRes = wideValueA != wideValueB; break; default: goto noopt; } | | < < < < < < < < < < < < < < < < < < < < < < < < < < < | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < | < | < < < < < | < | | | < | < | | | > > > | < | < | | | | 14101 14102 14103 14104 14105 14106 14107 14108 14109 14110 14111 14112 14113 14114 14115 14116 14117 14118 14119 14120 14121 14122 14123 14124 14125 14126 14127 14128 14129 14130 14131 14132 14133 14134 14135 14136 14137 14138 14139 14140 14141 14142 14143 14144 14145 14146 14147 14148 14149 14150 14151 14152 14153 14154 14155 14156 14157 14158 14159 14160 14161 14162 14163 | break; case JIM_EXPROP_NUMNE: cmpRes = wideValueA != wideValueB; break; default: goto noopt; } Jim_SetResult(interp, cmpRes ? interp->trueObj : interp->falseObj); return JIM_OK; } } break; } } noopt: #endif expr->inUse++; retcode = JimExprEvalTermNode(interp, expr->expr); expr->inUse--; return retcode; } int Jim_GetBoolFromExpr(Jim_Interp *interp, Jim_Obj *exprObjPtr, int *boolPtr) { int retcode = Jim_EvalExpression(interp, exprObjPtr); if (retcode == JIM_OK) { switch (ExprBool(interp, Jim_GetResult(interp))) { case 0: *boolPtr = 0; break; case 1: *boolPtr = 1; break; case -1: retcode = JIM_ERR; break; } } return retcode; } typedef struct ScanFmtPartDescr { const char *arg; const char *prefix; size_t width; int pos; char type; char modifier; } ScanFmtPartDescr; |
︙ | ︙ | |||
14332 14333 14334 14335 14336 14337 14338 | static int SetScanFmtFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { ScanFmtStringObj *fmtObj; char *buffer; int maxCount, i, approxSize, lastPos = -1; | | | | 14211 14212 14213 14214 14215 14216 14217 14218 14219 14220 14221 14222 14223 14224 14225 14226 | static int SetScanFmtFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { ScanFmtStringObj *fmtObj; char *buffer; int maxCount, i, approxSize, lastPos = -1; const char *fmt = Jim_String(objPtr); int maxFmtLen = Jim_Length(objPtr); const char *fmtEnd = fmt + maxFmtLen; int curr; Jim_FreeIntRep(interp, objPtr); for (i = 0, maxCount = 0; i < maxFmtLen; ++i) if (fmt[i] == '%') |
︙ | ︙ | |||
14418 14419 14420 14421 14422 14423 14424 14425 14426 14427 14428 14429 14430 14431 | continue; if (fmtObj->descr[prev].pos == descr->pos) { fmtObj->error = "variable is assigned by multiple \"%n$\" conversion specifiers"; return JIM_ERR; } } if (sscanf(fmt, "%d%n", &width, &skip) == 1) { descr->width = width; fmt += skip; } if (descr->pos > 0 && (size_t) descr->pos > fmtObj->maxPos) fmtObj->maxPos = descr->pos; | > > > > > | 14297 14298 14299 14300 14301 14302 14303 14304 14305 14306 14307 14308 14309 14310 14311 14312 14313 14314 14315 | continue; if (fmtObj->descr[prev].pos == descr->pos) { fmtObj->error = "variable is assigned by multiple \"%n$\" conversion specifiers"; return JIM_ERR; } } if (descr->pos < 0) { fmtObj->error = "\"%n$\" conversion specifier is negative"; return JIM_ERR; } if (sscanf(fmt, "%d%n", &width, &skip) == 1) { descr->width = width; fmt += skip; } if (descr->pos > 0 && (size_t) descr->pos > fmtObj->maxPos) fmtObj->maxPos = descr->pos; |
︙ | ︙ | |||
14469 14470 14471 14472 14473 14474 14475 | swapped = 1; } } } } else { | | > > > > > | 14353 14354 14355 14356 14357 14358 14359 14360 14361 14362 14363 14364 14365 14366 14367 14368 14369 14370 14371 14372 14373 | swapped = 1; } } } } else { if (fmt < fmtEnd && strchr("hlL", *fmt)) descr->modifier = tolower((int)*fmt++); if (fmt >= fmtEnd) { fmtObj->error = "missing scan conversion character"; return JIM_ERR; } descr->type = *fmt; if (strchr("efgcsndoxui", *fmt) == 0) { fmtObj->error = "bad scan conversion character"; return JIM_ERR; } else if (*fmt == 'c' && descr->width != 0) { |
︙ | ︙ | |||
14878 14879 14880 14881 14882 14883 14884 14885 14886 14887 14888 14889 14890 14891 | return retcode; } static int JimInvokeCommand(Jim_Interp *interp, int objc, Jim_Obj *const *objv) { int retcode; Jim_Cmd *cmdPtr; #if 0 printf("invoke"); int j; for (j = 0; j < objc; j++) { printf(" '%s'", Jim_String(objv[j])); } | > | 14767 14768 14769 14770 14771 14772 14773 14774 14775 14776 14777 14778 14779 14780 14781 | return retcode; } static int JimInvokeCommand(Jim_Interp *interp, int objc, Jim_Obj *const *objv) { int retcode; Jim_Cmd *cmdPtr; void *prevPrivData; #if 0 printf("invoke"); int j; for (j = 0; j < objc; j++) { printf(" '%s'", Jim_String(objv[j])); } |
︙ | ︙ | |||
14907 14908 14909 14910 14911 14912 14913 14914 14915 14916 14917 14918 14919 14920 14921 14922 14923 14924 14925 14926 14927 14928 14929 14930 | if (interp->evalDepth == interp->maxEvalDepth) { Jim_SetResultString(interp, "Infinite eval recursion", -1); retcode = JIM_ERR; goto out; } interp->evalDepth++; Jim_SetEmptyResult(interp); if (cmdPtr->isproc) { retcode = JimCallProcedure(interp, cmdPtr, objc, objv); } else { interp->cmdPrivData = cmdPtr->u.native.privData; retcode = cmdPtr->u.native.cmdProc(interp, objc, objv); } interp->evalDepth--; out: JimDecrCmdRefCount(interp, cmdPtr); return retcode; } | > > | 14797 14798 14799 14800 14801 14802 14803 14804 14805 14806 14807 14808 14809 14810 14811 14812 14813 14814 14815 14816 14817 14818 14819 14820 14821 14822 | if (interp->evalDepth == interp->maxEvalDepth) { Jim_SetResultString(interp, "Infinite eval recursion", -1); retcode = JIM_ERR; goto out; } interp->evalDepth++; prevPrivData = interp->cmdPrivData; Jim_SetEmptyResult(interp); if (cmdPtr->isproc) { retcode = JimCallProcedure(interp, cmdPtr, objc, objv); } else { interp->cmdPrivData = cmdPtr->u.native.privData; retcode = cmdPtr->u.native.cmdProc(interp, objc, objv); } interp->cmdPrivData = prevPrivData; interp->evalDepth--; out: JimDecrCmdRefCount(interp, cmdPtr); return retcode; } |
︙ | ︙ | |||
15081 15082 15083 15084 15085 15086 15087 | Jim_IncrRefCount(intv[i]); Jim_String(intv[i]); totlen += intv[i]->length; } if (tokens == 1 && intv[0] && intv == sintv) { | | > | 14973 14974 14975 14976 14977 14978 14979 14980 14981 14982 14983 14984 14985 14986 14987 14988 | Jim_IncrRefCount(intv[i]); Jim_String(intv[i]); totlen += intv[i]->length; } if (tokens == 1 && intv[0] && intv == sintv) { intv[0]->refCount--; return intv[0]; } objPtr = Jim_NewStringObjNoAlloc(interp, NULL, 0); if (tokens == 4 && token[0].type == JIM_TT_ESC && token[1].type == JIM_TT_ESC && token[2].type == JIM_TT_VAR) { |
︙ | ︙ | |||
15536 15537 15538 15539 15540 15541 15542 15543 15544 15545 15546 15547 15548 15549 | retcode = Jim_EvalObj(interp, cmd->u.proc.bodyObjPtr); badargset: interp->framePtr = interp->framePtr->parent; JimFreeCallFrame(interp, callFramePtr, JIM_FCF_REUSE); if (interp->framePtr->tailcallObj) { do { Jim_Obj *tailcallObj = interp->framePtr->tailcallObj; | > | 15429 15430 15431 15432 15433 15434 15435 15436 15437 15438 15439 15440 15441 15442 15443 | retcode = Jim_EvalObj(interp, cmd->u.proc.bodyObjPtr); badargset: retcode = JimInvokeDefer(interp, retcode); interp->framePtr = interp->framePtr->parent; JimFreeCallFrame(interp, callFramePtr, JIM_FCF_REUSE); if (interp->framePtr->tailcallObj) { do { Jim_Obj *tailcallObj = interp->framePtr->tailcallObj; |
︙ | ︙ | |||
15824 15825 15826 15827 15828 15829 15830 | Jim_Obj *objPtr; Jim_Obj *listObjPtr; JimPanic((argc == 0, "Jim_WrongNumArgs() called with argc=0")); listObjPtr = Jim_NewListObj(interp, argv, argc); | | | 15718 15719 15720 15721 15722 15723 15724 15725 15726 15727 15728 15729 15730 15731 15732 | Jim_Obj *objPtr; Jim_Obj *listObjPtr; JimPanic((argc == 0, "Jim_WrongNumArgs() called with argc=0")); listObjPtr = Jim_NewListObj(interp, argv, argc); if (msg && *msg) { Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, msg, -1)); } Jim_IncrRefCount(listObjPtr); objPtr = Jim_ListJoin(interp, listObjPtr, " ", 1); Jim_DecrRefCount(interp, listObjPtr); Jim_SetResultFormatted(interp, "wrong # args: should be \"%#s\"", objPtr); |
︙ | ︙ | |||
16064 16065 16066 16067 16068 16069 16070 | for (i = 2; i < argc; i++) { if (Jim_GetWide(interp, argv[i], &wideValue) != JIM_OK) { doubleRes = (double)res; goto trydouble; } if (op == JIM_EXPROP_SUB) res -= wideValue; | | > > > > > | 15958 15959 15960 15961 15962 15963 15964 15965 15966 15967 15968 15969 15970 15971 15972 15973 15974 15975 15976 15977 15978 | for (i = 2; i < argc; i++) { if (Jim_GetWide(interp, argv[i], &wideValue) != JIM_OK) { doubleRes = (double)res; goto trydouble; } if (op == JIM_EXPROP_SUB) res -= wideValue; else { if (wideValue == 0) { Jim_SetResultString(interp, "Division by zero", -1); return JIM_ERR; } res /= wideValue; } } Jim_SetResultInt(interp, res); return JIM_OK; trydouble: for (; i < argc; i++) { if (Jim_GetDouble(interp, argv[i], &doubleValue) != JIM_OK) return JIM_ERR; |
︙ | ︙ | |||
16217 16218 16219 16220 16221 16222 16223 | retval = Jim_GetBoolFromExpr(interp, argv[2], &boolean); #ifdef JIM_OPTIMIZATION if (retval == JIM_OK && boolean) { ScriptObj *incrScript; | | | < < | | > > > > > > > > | | | | | | 16116 16117 16118 16119 16120 16121 16122 16123 16124 16125 16126 16127 16128 16129 16130 16131 16132 16133 16134 16135 16136 16137 16138 16139 16140 16141 16142 16143 16144 16145 16146 16147 16148 16149 16150 16151 16152 16153 16154 16155 16156 16157 16158 16159 16160 16161 16162 16163 16164 16165 16166 16167 16168 16169 16170 16171 16172 16173 16174 16175 16176 16177 16178 16179 16180 16181 16182 16183 16184 16185 16186 16187 16188 16189 16190 | retval = Jim_GetBoolFromExpr(interp, argv[2], &boolean); #ifdef JIM_OPTIMIZATION if (retval == JIM_OK && boolean) { ScriptObj *incrScript; struct ExprTree *expr; jim_wide stop, currentVal; Jim_Obj *objPtr; int cmpOffset; expr = JimGetExpression(interp, argv[2]); incrScript = JimGetScript(interp, argv[3]); if (incrScript == NULL || incrScript->len != 3 || !expr || expr->len != 3) { goto evalstart; } if (incrScript->token[1].type != JIM_TT_ESC) { goto evalstart; } if (expr->expr->type == JIM_EXPROP_LT) { cmpOffset = 0; } else if (expr->expr->type == JIM_EXPROP_LTE) { cmpOffset = 1; } else { goto evalstart; } if (expr->expr->left->type != JIM_TT_VAR) { goto evalstart; } if (expr->expr->right->type != JIM_TT_VAR && expr->expr->right->type != JIM_TT_EXPR_INT) { goto evalstart; } if (!Jim_CompareStringImmediate(interp, incrScript->token[1].objPtr, "incr")) { goto evalstart; } if (!Jim_StringEqObj(incrScript->token[2].objPtr, expr->expr->left->objPtr)) { goto evalstart; } if (expr->expr->right->type == JIM_TT_EXPR_INT) { if (Jim_GetWide(interp, expr->expr->right->objPtr, &stop) == JIM_ERR) { goto evalstart; } } else { stopVarNamePtr = expr->expr->right->objPtr; Jim_IncrRefCount(stopVarNamePtr); stop = 0; } varNamePtr = expr->expr->left->objPtr; Jim_IncrRefCount(varNamePtr); objPtr = Jim_GetVariable(interp, varNamePtr, JIM_NONE); if (objPtr == NULL || Jim_GetWide(interp, objPtr, ¤tVal) != JIM_OK) { goto testcond; } |
︙ | ︙ | |||
16478 16479 16480 16481 16482 16483 16484 | JimListIterInit(&iters[i], argv[i + 1]); if (i % 2 == 0 && JimListIterDone(interp, &iters[i])) { result = JIM_ERR; } } if (result != JIM_OK) { Jim_SetResultString(interp, "foreach varlist is empty", -1); | | | 16383 16384 16385 16386 16387 16388 16389 16390 16391 16392 16393 16394 16395 16396 16397 | JimListIterInit(&iters[i], argv[i + 1]); if (i % 2 == 0 && JimListIterDone(interp, &iters[i])) { result = JIM_ERR; } } if (result != JIM_OK) { Jim_SetResultString(interp, "foreach varlist is empty", -1); goto empty_varlist; } if (doMap) { resultObj = Jim_NewListObj(interp, NULL, 0); } else { resultObj = interp->emptyObj; |
︙ | ︙ | |||
16541 16542 16543 16544 16545 16546 16547 16548 16549 16550 16551 16552 16553 16554 | } } out: result = JIM_OK; Jim_SetResult(interp, resultObj); err: Jim_DecrRefCount(interp, resultObj); if (numargs > 2) { Jim_Free(iters); } return result; } | > | 16446 16447 16448 16449 16450 16451 16452 16453 16454 16455 16456 16457 16458 16459 16460 | } } out: result = JIM_OK; Jim_SetResult(interp, resultObj); err: Jim_DecrRefCount(interp, resultObj); empty_varlist: if (numargs > 2) { Jim_Free(iters); } return result; } |
︙ | ︙ | |||
16667 16668 16669 16670 16671 16672 16673 | if (rc != JIM_OK || Jim_GetLong(interp, Jim_GetResult(interp), &eq) != JIM_OK) { eq = -rc; } return eq; } | < < < > | | | 16573 16574 16575 16576 16577 16578 16579 16580 16581 16582 16583 16584 16585 16586 16587 16588 16589 16590 16591 16592 16593 | if (rc != JIM_OK || Jim_GetLong(interp, Jim_GetResult(interp), &eq) != JIM_OK) { eq = -rc; } return eq; } static int Jim_SwitchCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { enum { SWITCH_EXACT, SWITCH_GLOB, SWITCH_RE, SWITCH_CMD }; int matchOpt = SWITCH_EXACT, opt = 1, patCount, i; Jim_Obj *command = NULL, *scriptObj = NULL, *strObj; Jim_Obj **caseList; if (argc < 3) { wrongnumargs: Jim_WrongNumArgs(interp, 1, argv, "?options? string " "pattern body ... ?default body? or " "{pattern body ?pattern body ...?}"); return JIM_ERR; } |
︙ | ︙ | |||
16716 16717 16718 16719 16720 16721 16722 | } if ((argc - opt) < 2) goto wrongnumargs; } strObj = argv[opt++]; patCount = argc - opt; if (patCount == 1) { | < < | < | | | | < < | < | | | | | | | | 16620 16621 16622 16623 16624 16625 16626 16627 16628 16629 16630 16631 16632 16633 16634 16635 16636 16637 16638 16639 16640 16641 16642 16643 16644 16645 16646 16647 16648 16649 16650 16651 16652 16653 16654 16655 16656 16657 16658 16659 16660 16661 16662 16663 16664 16665 16666 16667 16668 16669 16670 16671 16672 16673 16674 16675 16676 16677 16678 16679 16680 16681 16682 16683 16684 16685 | } if ((argc - opt) < 2) goto wrongnumargs; } strObj = argv[opt++]; patCount = argc - opt; if (patCount == 1) { JimListGetElements(interp, argv[opt], &patCount, &caseList); } else caseList = (Jim_Obj **)&argv[opt]; if (patCount == 0 || patCount % 2 != 0) goto wrongnumargs; for (i = 0; scriptObj == NULL && i < patCount; i += 2) { Jim_Obj *patObj = caseList[i]; if (!Jim_CompareStringImmediate(interp, patObj, "default") || i < (patCount - 2)) { switch (matchOpt) { case SWITCH_EXACT: if (Jim_StringEqObj(strObj, patObj)) scriptObj = caseList[i + 1]; break; case SWITCH_GLOB: if (Jim_StringMatchObj(interp, patObj, strObj, 0)) scriptObj = caseList[i + 1]; break; case SWITCH_RE: command = Jim_NewStringObj(interp, "regexp", -1); case SWITCH_CMD:{ int rc = Jim_CommandMatchObj(interp, command, patObj, strObj, 0); if (argc - opt == 1) { JimListGetElements(interp, argv[opt], &patCount, &caseList); } if (rc < 0) { return -rc; } if (rc) scriptObj = caseList[i + 1]; break; } } } else { scriptObj = caseList[i + 1]; } } for (; i < patCount && Jim_CompareStringImmediate(interp, scriptObj, "-"); i += 2) scriptObj = caseList[i + 1]; if (scriptObj && Jim_CompareStringImmediate(interp, scriptObj, "-")) { Jim_SetResultFormatted(interp, "no body specified for pattern \"%#s\"", caseList[i - 2]); return JIM_ERR; } Jim_SetEmptyResult(interp); if (scriptObj) { return Jim_EvalObj(interp, scriptObj); } return JIM_OK; } static int Jim_ListCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { |
︙ | ︙ | |||
17072 17073 17074 17075 17076 17077 17078 | len = Jim_ListLength(interp, listObj); first = JimRelToAbsIndex(len, first); last = JimRelToAbsIndex(len, last); JimRelToAbsRange(len, &first, &last, &rangeLen); | < | < < < < | < < < < < | 16970 16971 16972 16973 16974 16975 16976 16977 16978 16979 16980 16981 16982 16983 16984 16985 | len = Jim_ListLength(interp, listObj); first = JimRelToAbsIndex(len, first); last = JimRelToAbsIndex(len, last); JimRelToAbsRange(len, &first, &last, &rangeLen); if (first > len) { first = len; } newListObj = Jim_NewListObj(interp, listObj->internalRep.listValue.ele, first); ListInsertElements(newListObj, -1, argc - 4, argv + 4); |
︙ | ︙ | |||
17127 17128 17129 17130 17131 17132 17133 17134 17135 17136 17137 17138 17139 17140 | "-ascii", "-nocase", "-increasing", "-decreasing", "-command", "-integer", "-real", "-index", "-unique", NULL }; enum { OPT_ASCII, OPT_NOCASE, OPT_INCREASING, OPT_DECREASING, OPT_COMMAND, OPT_INTEGER, OPT_REAL, OPT_INDEX, OPT_UNIQUE }; Jim_Obj *resObj; int i; int retCode; struct lsort_info info; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "?options? list"); return JIM_ERR; } | > | 17015 17016 17017 17018 17019 17020 17021 17022 17023 17024 17025 17026 17027 17028 17029 | "-ascii", "-nocase", "-increasing", "-decreasing", "-command", "-integer", "-real", "-index", "-unique", NULL }; enum { OPT_ASCII, OPT_NOCASE, OPT_INCREASING, OPT_DECREASING, OPT_COMMAND, OPT_INTEGER, OPT_REAL, OPT_INDEX, OPT_UNIQUE }; Jim_Obj *resObj; int i; int retCode; int shared; struct lsort_info info; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "?options? list"); return JIM_ERR; } |
︙ | ︙ | |||
17192 17193 17194 17195 17196 17197 17198 | return JIM_ERR; } info.indexed = 1; i++; break; } } | > > | | | 17081 17082 17083 17084 17085 17086 17087 17088 17089 17090 17091 17092 17093 17094 17095 17096 17097 17098 17099 17100 17101 17102 | return JIM_ERR; } info.indexed = 1; i++; break; } } resObj = argv[argc - 1]; if ((shared = Jim_IsShared(resObj))) resObj = Jim_DuplicateObj(interp, resObj); retCode = ListSortElements(interp, resObj, &info); if (retCode == JIM_OK) { Jim_SetResult(interp, resObj); } else if (shared) { Jim_FreeNewObj(interp, resObj); } return retCode; } static int Jim_AppendCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) |
︙ | ︙ | |||
17243 17244 17245 17246 17247 17248 17249 17250 17251 17252 17253 17254 17255 17256 | } return JIM_ERR; } } Jim_SetResult(interp, stringObjPtr); return JIM_OK; } static int Jim_DebugCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { #if !defined(JIM_DEBUG_COMMAND) Jim_SetResultString(interp, "unsupported", -1); return JIM_ERR; | > | 17134 17135 17136 17137 17138 17139 17140 17141 17142 17143 17144 17145 17146 17147 17148 | } return JIM_ERR; } } Jim_SetResult(interp, stringObjPtr); return JIM_OK; } static int Jim_DebugCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { #if !defined(JIM_DEBUG_COMMAND) Jim_SetResultString(interp, "unsupported", -1); return JIM_ERR; |
︙ | ︙ | |||
17325 17326 17327 17328 17329 17330 17331 | return JIM_ERR; } } static int Jim_ExprCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { | < | | < < | 17217 17218 17219 17220 17221 17222 17223 17224 17225 17226 17227 17228 17229 17230 17231 17232 17233 17234 17235 17236 17237 17238 17239 17240 17241 17242 17243 17244 17245 17246 17247 17248 17249 | return JIM_ERR; } } static int Jim_ExprCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int retcode; if (argc == 2) { retcode = Jim_EvalExpression(interp, argv[1]); } else if (argc > 2) { Jim_Obj *objPtr; objPtr = Jim_ConcatObj(interp, argc - 1, argv + 1); Jim_IncrRefCount(objPtr); retcode = Jim_EvalExpression(interp, objPtr); Jim_DecrRefCount(interp, objPtr); } else { Jim_WrongNumArgs(interp, 1, argv, "expression ?...?"); return JIM_ERR; } if (retcode != JIM_OK) return retcode; return JIM_OK; } static int Jim_BreakCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc != 1) { |
︙ | ︙ | |||
19650 19651 19652 19653 19654 19655 19656 19657 19658 19659 19660 19661 19662 19663 19664 19665 | Jim_ListAppendElement(interp, Jim_GetResult(interp), Jim_NewStringObj(interp, tablePtrSorted[i], -1)); } Jim_Free(tablePtrSorted); return JIM_OK; } return JIM_ERR; } int Jim_GetEnum(Jim_Interp *interp, Jim_Obj *objPtr, const char *const *tablePtr, int *indexPtr, const char *name, int flags) { const char *bad = "bad "; const char *const *entryPtr = NULL; int i; int match = -1; int arglen; | > > > > > > > > > > > > > > > > > | | | > > > > > > > > | 19539 19540 19541 19542 19543 19544 19545 19546 19547 19548 19549 19550 19551 19552 19553 19554 19555 19556 19557 19558 19559 19560 19561 19562 19563 19564 19565 19566 19567 19568 19569 19570 19571 19572 19573 19574 19575 19576 19577 19578 19579 19580 19581 19582 19583 19584 19585 19586 19587 19588 19589 19590 19591 19592 19593 19594 19595 19596 19597 19598 19599 19600 19601 19602 19603 19604 19605 19606 19607 19608 19609 19610 19611 19612 | Jim_ListAppendElement(interp, Jim_GetResult(interp), Jim_NewStringObj(interp, tablePtrSorted[i], -1)); } Jim_Free(tablePtrSorted); return JIM_OK; } return JIM_ERR; } static const Jim_ObjType getEnumObjType = { "get-enum", NULL, NULL, NULL, JIM_TYPE_REFERENCES }; int Jim_GetEnum(Jim_Interp *interp, Jim_Obj *objPtr, const char *const *tablePtr, int *indexPtr, const char *name, int flags) { const char *bad = "bad "; const char *const *entryPtr = NULL; int i; int match = -1; int arglen; const char *arg; if (objPtr->typePtr == &getEnumObjType) { if (objPtr->internalRep.ptrIntValue.ptr == tablePtr && objPtr->internalRep.ptrIntValue.int1 == flags) { *indexPtr = objPtr->internalRep.ptrIntValue.int2; return JIM_OK; } } arg = Jim_GetString(objPtr, &arglen); *indexPtr = -1; for (entryPtr = tablePtr, i = 0; *entryPtr != NULL; entryPtr++, i++) { if (Jim_CompareStringImmediate(interp, objPtr, *entryPtr)) { match = i; goto found; } if (flags & JIM_ENUM_ABBREV) { if (strncmp(arg, *entryPtr, arglen) == 0) { if (*arg == '-' && arglen == 1) { break; } if (match >= 0) { bad = "ambiguous "; goto ambiguous; } match = i; } } } if (match >= 0) { found: Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &getEnumObjType; objPtr->internalRep.ptrIntValue.ptr = (void *)tablePtr; objPtr->internalRep.ptrIntValue.int1 = flags; objPtr->internalRep.ptrIntValue.int2 = match; *indexPtr = match; return JIM_OK; } ambiguous: if (flags & JIM_ERRMSG) { JimSetFailedEnumResult(interp, arg, bad, "", tablePtr, name); |
︙ | ︙ | |||
19816 19817 19818 19819 19820 19821 19822 | } } } static void bad_subcmd(Jim_Interp *interp, const jim_subcmd_type * command_table, const char *type, Jim_Obj *cmd, Jim_Obj *subcmd) { | < < | < < | > > > > > > > > < < < < | < | > > > > > > > > | 19730 19731 19732 19733 19734 19735 19736 19737 19738 19739 19740 19741 19742 19743 19744 19745 19746 19747 19748 19749 19750 19751 19752 19753 19754 19755 19756 19757 19758 19759 19760 19761 19762 19763 19764 19765 19766 19767 19768 19769 19770 19771 19772 19773 19774 19775 19776 19777 19778 19779 19780 19781 19782 19783 19784 19785 19786 19787 19788 19789 19790 19791 19792 19793 19794 19795 19796 19797 19798 19799 19800 19801 19802 19803 19804 19805 19806 | } } } static void bad_subcmd(Jim_Interp *interp, const jim_subcmd_type * command_table, const char *type, Jim_Obj *cmd, Jim_Obj *subcmd) { Jim_SetResultFormatted(interp, "%#s, %s command \"%#s\": should be ", cmd, type, subcmd); add_commands(interp, command_table, ", "); } static void show_cmd_usage(Jim_Interp *interp, const jim_subcmd_type * command_table, int argc, Jim_Obj *const *argv) { Jim_SetResultFormatted(interp, "Usage: \"%#s command ... \", where command is one of: ", argv[0]); add_commands(interp, command_table, ", "); } static void add_cmd_usage(Jim_Interp *interp, const jim_subcmd_type * ct, Jim_Obj *cmd) { if (cmd) { Jim_AppendStrings(interp, Jim_GetResult(interp), Jim_String(cmd), " ", NULL); } Jim_AppendStrings(interp, Jim_GetResult(interp), ct->cmd, NULL); if (ct->args && *ct->args) { Jim_AppendStrings(interp, Jim_GetResult(interp), " ", ct->args, NULL); } } static void set_wrong_args(Jim_Interp *interp, const jim_subcmd_type * command_table, Jim_Obj *subcmd) { Jim_SetResultString(interp, "wrong # args: should be \"", -1); add_cmd_usage(interp, command_table, subcmd); Jim_AppendStrings(interp, Jim_GetResult(interp), "\"", NULL); } static const Jim_ObjType subcmdLookupObjType = { "subcmd-lookup", NULL, NULL, NULL, JIM_TYPE_REFERENCES }; const jim_subcmd_type *Jim_ParseSubCmd(Jim_Interp *interp, const jim_subcmd_type * command_table, int argc, Jim_Obj *const *argv) { const jim_subcmd_type *ct; const jim_subcmd_type *partial = 0; int cmdlen; Jim_Obj *cmd; const char *cmdstr; int help = 0; if (argc < 2) { Jim_SetResultFormatted(interp, "wrong # args: should be \"%#s command ...\"\n" "Use \"%#s -help ?command?\" for help", argv[0], argv[0]); return 0; } cmd = argv[1]; if (cmd->typePtr == &subcmdLookupObjType) { if (cmd->internalRep.ptrIntValue.ptr == command_table) { ct = command_table + cmd->internalRep.ptrIntValue.int1; goto found; } } if (Jim_CompareStringImmediate(interp, cmd, "-help")) { if (argc == 2) { show_cmd_usage(interp, command_table, argc, argv); return &dummy_subcmd; } |
︙ | ︙ | |||
19939 19940 19941 19942 19943 19944 19945 19946 19947 19948 19949 19950 19951 19952 | if (help) { Jim_SetResultString(interp, "Usage: ", -1); add_cmd_usage(interp, ct, argv[0]); return &dummy_subcmd; } if (argc - 2 < ct->minargs || (ct->maxargs >= 0 && argc - 2 > ct->maxargs)) { Jim_SetResultString(interp, "wrong # args: should be \"", -1); add_cmd_usage(interp, ct, argv[0]); Jim_AppendStrings(interp, Jim_GetResult(interp), "\"", NULL); | > > > > > > > | 19860 19861 19862 19863 19864 19865 19866 19867 19868 19869 19870 19871 19872 19873 19874 19875 19876 19877 19878 19879 19880 | if (help) { Jim_SetResultString(interp, "Usage: ", -1); add_cmd_usage(interp, ct, argv[0]); return &dummy_subcmd; } Jim_FreeIntRep(interp, cmd); cmd->typePtr = &subcmdLookupObjType; cmd->internalRep.ptrIntValue.ptr = (void *)command_table; cmd->internalRep.ptrIntValue.int1 = ct - command_table; found: if (argc - 2 < ct->minargs || (ct->maxargs >= 0 && argc - 2 > ct->maxargs)) { Jim_SetResultString(interp, "wrong # args: should be \"", -1); add_cmd_usage(interp, ct, argv[0]); Jim_AppendStrings(interp, Jim_GetResult(interp), "\"", NULL); |
︙ | ︙ | |||
20131 20132 20133 20134 20135 20136 20137 | default: sawFlag = 0; continue; } *p++ = ch; format += step; step = utf8_tounicode(format, &ch); | > | | 20059 20060 20061 20062 20063 20064 20065 20066 20067 20068 20069 20070 20071 20072 20073 20074 | default: sawFlag = 0; continue; } *p++ = ch; format += step; step = utf8_tounicode(format, &ch); } while (sawFlag && (p - spec <= 5)); width = 0; if (isdigit(ch)) { width = strtoul(format, &end, 10); format = end; step = utf8_tounicode(format, &ch); |
︙ | ︙ | |||
20328 20329 20330 20331 20332 20333 20334 20335 20336 20337 20338 20339 20340 20341 | *p++ = 'l'; } #endif } *p++ = (char) ch; *p = '\0'; if (width > length) { length = width; } if (gotPrecision) { length += precision; | > > > > > > > | 20257 20258 20259 20260 20261 20262 20263 20264 20265 20266 20267 20268 20269 20270 20271 20272 20273 20274 20275 20276 20277 | *p++ = 'l'; } #endif } *p++ = (char) ch; *p = '\0'; if (width > 10000 || length > 10000 || precision > 10000) { Jim_SetResultString(interp, "format too long", -1); goto error; } if (width > length) { length = width; } if (gotPrecision) { length += precision; |
︙ | ︙ | |||
20702 20703 20704 20705 20706 20707 20708 20709 20710 20711 20712 20713 20714 20715 | if (end == preg->regparse + 1) { preg->err = REG_ERR_BAD_COUNT; return 0; } if (*end == '}') { max = min; } else { preg->regparse = end; max = strtoul(preg->regparse + 1, &end, 10); if (*end != '}') { preg->err = REG_ERR_UNMATCHED_BRACES; return 0; } | > > > > | 20638 20639 20640 20641 20642 20643 20644 20645 20646 20647 20648 20649 20650 20651 20652 20653 20654 20655 | if (end == preg->regparse + 1) { preg->err = REG_ERR_BAD_COUNT; return 0; } if (*end == '}') { max = min; } else if (*end == '\0') { preg->err = REG_ERR_UNMATCHED_BRACES; return 0; } else { preg->regparse = end; max = strtoul(preg->regparse + 1, &end, 10); if (*end != '}') { preg->err = REG_ERR_UNMATCHED_BRACES; return 0; } |
︙ | ︙ | |||
20906 20907 20908 20909 20910 20911 20912 20913 20914 20915 20916 20917 20918 20919 20920 20921 | } while (*pattern && *pattern != ']') { int start; int end; pattern += reg_utf8_tounicode_case(pattern, &start, nocase); if (start == '\\') { pattern += reg_decode_escape(pattern, &start); if (start == 0) { preg->err = REG_ERR_NULL_CHAR; return 0; } } if (pattern[0] == '-' && pattern[1] && pattern[1] != ']') { | > > > > > > > > > > > > > > > > > > > > > > > | 20846 20847 20848 20849 20850 20851 20852 20853 20854 20855 20856 20857 20858 20859 20860 20861 20862 20863 20864 20865 20866 20867 20868 20869 20870 20871 20872 20873 20874 20875 20876 20877 20878 20879 20880 20881 20882 20883 20884 | } while (*pattern && *pattern != ']') { int start; int end; enum { CC_ALPHA, CC_ALNUM, CC_SPACE, CC_BLANK, CC_UPPER, CC_LOWER, CC_DIGIT, CC_XDIGIT, CC_CNTRL, CC_GRAPH, CC_PRINT, CC_PUNCT, CC_NUM }; int cc; pattern += reg_utf8_tounicode_case(pattern, &start, nocase); if (start == '\\') { switch (*pattern) { case 's': pattern++; cc = CC_SPACE; goto cc_switch; case 'd': pattern++; cc = CC_DIGIT; goto cc_switch; case 'w': pattern++; reg_addrange(preg, '_', '_'); cc = CC_ALNUM; goto cc_switch; } pattern += reg_decode_escape(pattern, &start); if (start == 0) { preg->err = REG_ERR_NULL_CHAR; return 0; } } if (pattern[0] == '-' && pattern[1] && pattern[1] != ']') { |
︙ | ︙ | |||
20934 20935 20936 20937 20938 20939 20940 | continue; } if (start == '[' && pattern[0] == ':') { static const char *character_class[] = { ":alpha:", ":alnum:", ":space:", ":blank:", ":upper:", ":lower:", ":digit:", ":xdigit:", ":cntrl:", ":graph:", ":print:", ":punct:", }; | < < < < < < | | | | > | | 20897 20898 20899 20900 20901 20902 20903 20904 20905 20906 20907 20908 20909 20910 20911 20912 20913 20914 20915 20916 20917 20918 20919 20920 20921 20922 | continue; } if (start == '[' && pattern[0] == ':') { static const char *character_class[] = { ":alpha:", ":alnum:", ":space:", ":blank:", ":upper:", ":lower:", ":digit:", ":xdigit:", ":cntrl:", ":graph:", ":print:", ":punct:", }; for (cc = 0; cc < CC_NUM; cc++) { n = strlen(character_class[cc]); if (strncmp(pattern, character_class[cc], n) == 0) { pattern += n + 1; break; } } if (cc != CC_NUM) { cc_switch: switch (cc) { case CC_ALNUM: reg_addrange(preg, '0', '9'); case CC_ALPHA: if ((preg->cflags & REG_ICASE) == 0) { reg_addrange(preg, 'a', 'z'); } |
︙ | ︙ | |||
21805 21806 21807 21808 21809 21810 21811 21812 21813 21814 21815 21816 21817 21818 | void regfree(regex_t *preg) { free(preg->program); } #endif #if defined(_WIN32) || defined(WIN32) #ifndef STRICT #define STRICT #endif #define WIN32_LEAN_AND_MEAN #include <windows.h> | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 21763 21764 21765 21766 21767 21768 21769 21770 21771 21772 21773 21774 21775 21776 21777 21778 21779 21780 21781 21782 21783 21784 21785 21786 21787 21788 21789 21790 21791 21792 21793 21794 21795 21796 21797 21798 21799 21800 21801 21802 21803 21804 21805 21806 21807 21808 21809 21810 21811 21812 21813 21814 21815 21816 21817 21818 21819 21820 21821 21822 21823 21824 21825 21826 21827 21828 21829 21830 21831 21832 21833 21834 21835 21836 21837 21838 21839 21840 21841 21842 21843 21844 21845 21846 21847 21848 21849 21850 21851 21852 21853 21854 21855 21856 21857 21858 21859 21860 21861 21862 21863 21864 21865 21866 21867 21868 21869 21870 21871 21872 21873 21874 21875 21876 21877 21878 21879 21880 21881 21882 21883 21884 21885 21886 21887 21888 21889 21890 21891 21892 21893 21894 21895 21896 21897 21898 21899 21900 21901 21902 21903 21904 21905 21906 21907 21908 21909 21910 21911 21912 21913 21914 21915 21916 21917 21918 21919 21920 21921 21922 21923 21924 21925 21926 21927 21928 21929 21930 21931 21932 21933 21934 21935 21936 21937 21938 21939 21940 21941 21942 21943 21944 21945 21946 21947 21948 21949 21950 21951 21952 21953 21954 21955 21956 21957 21958 21959 21960 21961 21962 21963 21964 21965 21966 21967 21968 21969 21970 21971 21972 21973 21974 21975 21976 21977 21978 21979 21980 21981 21982 21983 21984 21985 21986 21987 21988 21989 | void regfree(regex_t *preg) { free(preg->program); } #endif #include <string.h> void Jim_SetResultErrno(Jim_Interp *interp, const char *msg) { Jim_SetResultFormatted(interp, "%s: %s", msg, strerror(Jim_Errno())); } #if defined(__MINGW32__) #include <sys/stat.h> int Jim_Errno(void) { switch (GetLastError()) { case ERROR_FILE_NOT_FOUND: return ENOENT; case ERROR_PATH_NOT_FOUND: return ENOENT; case ERROR_TOO_MANY_OPEN_FILES: return EMFILE; case ERROR_ACCESS_DENIED: return EACCES; case ERROR_INVALID_HANDLE: return EBADF; case ERROR_BAD_ENVIRONMENT: return E2BIG; case ERROR_BAD_FORMAT: return ENOEXEC; case ERROR_INVALID_ACCESS: return EACCES; case ERROR_INVALID_DRIVE: return ENOENT; case ERROR_CURRENT_DIRECTORY: return EACCES; case ERROR_NOT_SAME_DEVICE: return EXDEV; case ERROR_NO_MORE_FILES: return ENOENT; case ERROR_WRITE_PROTECT: return EROFS; case ERROR_BAD_UNIT: return ENXIO; case ERROR_NOT_READY: return EBUSY; case ERROR_BAD_COMMAND: return EIO; case ERROR_CRC: return EIO; case ERROR_BAD_LENGTH: return EIO; case ERROR_SEEK: return EIO; case ERROR_WRITE_FAULT: return EIO; case ERROR_READ_FAULT: return EIO; case ERROR_GEN_FAILURE: return EIO; case ERROR_SHARING_VIOLATION: return EACCES; case ERROR_LOCK_VIOLATION: return EACCES; case ERROR_SHARING_BUFFER_EXCEEDED: return ENFILE; case ERROR_HANDLE_DISK_FULL: return ENOSPC; case ERROR_NOT_SUPPORTED: return ENODEV; case ERROR_REM_NOT_LIST: return EBUSY; case ERROR_DUP_NAME: return EEXIST; case ERROR_BAD_NETPATH: return ENOENT; case ERROR_NETWORK_BUSY: return EBUSY; case ERROR_DEV_NOT_EXIST: return ENODEV; case ERROR_TOO_MANY_CMDS: return EAGAIN; case ERROR_ADAP_HDW_ERR: return EIO; case ERROR_BAD_NET_RESP: return EIO; case ERROR_UNEXP_NET_ERR: return EIO; case ERROR_NETNAME_DELETED: return ENOENT; case ERROR_NETWORK_ACCESS_DENIED: return EACCES; case ERROR_BAD_DEV_TYPE: return ENODEV; case ERROR_BAD_NET_NAME: return ENOENT; case ERROR_TOO_MANY_NAMES: return ENFILE; case ERROR_TOO_MANY_SESS: return EIO; case ERROR_SHARING_PAUSED: return EAGAIN; case ERROR_REDIR_PAUSED: return EAGAIN; case ERROR_FILE_EXISTS: return EEXIST; case ERROR_CANNOT_MAKE: return ENOSPC; case ERROR_OUT_OF_STRUCTURES: return ENFILE; case ERROR_ALREADY_ASSIGNED: return EEXIST; case ERROR_INVALID_PASSWORD: return EPERM; case ERROR_NET_WRITE_FAULT: return EIO; case ERROR_NO_PROC_SLOTS: return EAGAIN; case ERROR_DISK_CHANGE: return EXDEV; case ERROR_BROKEN_PIPE: return EPIPE; case ERROR_OPEN_FAILED: return ENOENT; case ERROR_DISK_FULL: return ENOSPC; case ERROR_NO_MORE_SEARCH_HANDLES: return EMFILE; case ERROR_INVALID_TARGET_HANDLE: return EBADF; case ERROR_INVALID_NAME: return ENOENT; case ERROR_PROC_NOT_FOUND: return ESRCH; case ERROR_WAIT_NO_CHILDREN: return ECHILD; case ERROR_CHILD_NOT_COMPLETE: return ECHILD; case ERROR_DIRECT_ACCESS_HANDLE: return EBADF; case ERROR_SEEK_ON_DEVICE: return ESPIPE; case ERROR_BUSY_DRIVE: return EAGAIN; case ERROR_DIR_NOT_EMPTY: return EEXIST; case ERROR_NOT_LOCKED: return EACCES; case ERROR_BAD_PATHNAME: return ENOENT; case ERROR_LOCK_FAILED: return EACCES; case ERROR_ALREADY_EXISTS: return EEXIST; case ERROR_FILENAME_EXCED_RANGE: return ENAMETOOLONG; case ERROR_BAD_PIPE: return EPIPE; case ERROR_PIPE_BUSY: return EAGAIN; case ERROR_PIPE_NOT_CONNECTED: return EPIPE; case ERROR_DIRECTORY: return ENOTDIR; } return EINVAL; } pidtype waitpid(pidtype pid, int *status, int nohang) { DWORD ret = WaitForSingleObject(pid, nohang ? 0 : INFINITE); if (ret == WAIT_TIMEOUT || ret == WAIT_FAILED) { return JIM_BAD_PID; } GetExitCodeProcess(pid, &ret); *status = ret; CloseHandle(pid); return pid; } int Jim_MakeTempFile(Jim_Interp *interp, const char *filename_template, int unlink_file) { char name[MAX_PATH]; HANDLE handle; if (!GetTempPath(MAX_PATH, name) || !GetTempFileName(name, filename_template ? filename_template : "JIM", 0, name)) { return -1; } handle = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY | (unlink_file ? FILE_FLAG_DELETE_ON_CLOSE : 0), NULL); if (handle == INVALID_HANDLE_VALUE) { goto error; } Jim_SetResultString(interp, name, -1); return _open_osfhandle((int)handle, _O_RDWR | _O_TEXT); error: Jim_SetResultErrno(interp, name); DeleteFile(name); return -1; } int Jim_OpenForWrite(const char *filename, int append) { if (strcmp(filename, "/dev/null") == 0) { filename = "nul:"; } int fd = _open(filename, _O_WRONLY | _O_CREAT | _O_TEXT | (append ? _O_APPEND : _O_TRUNC), _S_IREAD | _S_IWRITE); if (fd >= 0 && append) { _lseek(fd, 0L, SEEK_END); } return fd; } int Jim_OpenForRead(const char *filename) { if (strcmp(filename, "/dev/null") == 0) { filename = "nul:"; } return _open(filename, _O_RDONLY | _O_TEXT, 0); } #elif defined(HAVE_UNISTD_H) int Jim_MakeTempFile(Jim_Interp *interp, const char *filename_template, int unlink_file) { int fd; mode_t mask; Jim_Obj *filenameObj; if (filename_template == NULL) { const char *tmpdir = getenv("TMPDIR"); if (tmpdir == NULL || *tmpdir == '\0' || access(tmpdir, W_OK) != 0) { tmpdir = "/tmp/"; } filenameObj = Jim_NewStringObj(interp, tmpdir, -1); if (tmpdir[0] && tmpdir[strlen(tmpdir) - 1] != '/') { Jim_AppendString(interp, filenameObj, "/", 1); } Jim_AppendString(interp, filenameObj, "tcl.tmp.XXXXXX", -1); } else { filenameObj = Jim_NewStringObj(interp, filename_template, -1); } mask = umask(S_IXUSR | S_IRWXG | S_IRWXO); #ifdef HAVE_MKSTEMP fd = mkstemp(filenameObj->bytes); #else if (mktemp(filenameObj->bytes) == NULL) { fd = -1; } else { fd = open(filenameObj->bytes, O_RDWR | O_CREAT | O_TRUNC); } #endif umask(mask); if (fd < 0) { Jim_SetResultErrno(interp, Jim_String(filenameObj)); Jim_FreeNewObj(interp, filenameObj); return -1; } if (unlink_file) { remove(Jim_String(filenameObj)); } Jim_SetResult(interp, filenameObj); return fd; } int Jim_OpenForWrite(const char *filename, int append) { return open(filename, O_WRONLY | O_CREAT | (append ? O_APPEND : O_TRUNC), 0666); } int Jim_OpenForRead(const char *filename) { return open(filename, O_RDONLY, 0); } #endif #if defined(_WIN32) || defined(WIN32) #ifndef STRICT #define STRICT #endif #define WIN32_LEAN_AND_MEAN #include <windows.h> |
︙ | ︙ | |||
21923 21924 21925 21926 21927 21928 21929 21930 21931 21932 21933 21934 21935 21936 21937 21938 21939 21940 21941 21942 21943 21944 21945 21946 | else { errno = EBADF; } return result; } #endif #endif #ifndef JIM_BOOTSTRAP_LIB_ONLY #include <errno.h> #include <string.h> #ifdef USE_LINENOISE #ifdef HAVE_UNISTD_H #include <unistd.h> #endif #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> #endif #include "linenoise.h" #else #define MAX_LINE_LEN 512 #endif | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > | > > > | 22094 22095 22096 22097 22098 22099 22100 22101 22102 22103 22104 22105 22106 22107 22108 22109 22110 22111 22112 22113 22114 22115 22116 22117 22118 22119 22120 22121 22122 22123 22124 22125 22126 22127 22128 22129 22130 22131 22132 22133 22134 22135 22136 22137 22138 22139 22140 22141 22142 22143 22144 22145 22146 22147 22148 22149 22150 22151 22152 22153 22154 22155 22156 22157 22158 22159 22160 22161 22162 22163 22164 22165 22166 22167 22168 22169 22170 22171 22172 22173 22174 | else { errno = EBADF; } return result; } #endif #endif #include <stdio.h> #include <signal.h> #ifndef SIGPIPE #define SIGPIPE 13 #endif #ifndef SIGINT #define SIGINT 2 #endif const char *Jim_SignalId(int sig) { static char buf[10]; switch (sig) { case SIGINT: return "SIGINT"; case SIGPIPE: return "SIGPIPE"; } snprintf(buf, sizeof(buf), "%d", sig); return buf; } #ifndef JIM_BOOTSTRAP_LIB_ONLY #include <errno.h> #include <string.h> #ifdef USE_LINENOISE #ifdef HAVE_UNISTD_H #include <unistd.h> #endif #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> #endif #include "linenoise.h" #else #define MAX_LINE_LEN 512 #endif #ifdef USE_LINENOISE static void JimCompletionCallback(const char *prefix, linenoiseCompletions *comp, void *userdata); static const char completion_callback_assoc_key[] = "interactive-completion"; #endif char *Jim_HistoryGetline(Jim_Interp *interp, const char *prompt) { #ifdef USE_LINENOISE struct JimCompletionInfo *compinfo = Jim_GetAssocData(interp, completion_callback_assoc_key); char *result; Jim_Obj *objPtr; long mlmode = 0; if (compinfo) { linenoiseSetCompletionCallback(JimCompletionCallback, compinfo); } objPtr = Jim_GetVariableStr(interp, "history::multiline", JIM_NONE); if (objPtr && Jim_GetLong(interp, objPtr, &mlmode) == JIM_NONE) { linenoiseSetMultiLine(mlmode); } result = linenoise(prompt); linenoiseSetCompletionCallback(NULL, NULL); return result; #else int len; char *line = malloc(MAX_LINE_LEN); fputs(prompt, stdout); fflush(stdout); |
︙ | ︙ | |||
21987 21988 21989 21990 21991 21992 21993 | #ifdef HAVE_UMASK mode_t mask; mask = umask(S_IXUSR | S_IRWXG | S_IRWXO); #endif linenoiseHistorySave(filename); #ifdef HAVE_UMASK | | | 22204 22205 22206 22207 22208 22209 22210 22211 22212 22213 22214 22215 22216 22217 22218 | #ifdef HAVE_UMASK mode_t mask; mask = umask(S_IXUSR | S_IRWXG | S_IRWXO); #endif linenoiseHistorySave(filename); #ifdef HAVE_UMASK umask(mask); #endif #endif } void Jim_HistoryShow(void) { #ifdef USE_LINENOISE |
︙ | ︙ | |||
22011 22012 22013 22014 22015 22016 22017 | #ifdef USE_LINENOISE struct JimCompletionInfo { Jim_Interp *interp; Jim_Obj *command; }; | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < | < < < < | 22228 22229 22230 22231 22232 22233 22234 22235 22236 22237 22238 22239 22240 22241 22242 22243 22244 22245 22246 22247 22248 22249 22250 22251 22252 22253 22254 22255 22256 22257 22258 22259 22260 22261 22262 22263 22264 22265 22266 22267 22268 22269 22270 22271 22272 22273 22274 22275 22276 22277 22278 22279 22280 22281 22282 22283 22284 22285 22286 22287 22288 22289 22290 22291 22292 22293 22294 22295 22296 22297 22298 22299 22300 22301 22302 22303 22304 22305 22306 22307 22308 22309 | #ifdef USE_LINENOISE struct JimCompletionInfo { Jim_Interp *interp; Jim_Obj *command; }; static void JimCompletionCallback(const char *prefix, linenoiseCompletions *comp, void *userdata) { struct JimCompletionInfo *info = (struct JimCompletionInfo *)userdata; Jim_Obj *objv[2]; int ret; objv[0] = info->command; objv[1] = Jim_NewStringObj(info->interp, prefix, -1); ret = Jim_EvalObjVector(info->interp, 2, objv); if (ret == JIM_OK) { int i; Jim_Obj *listObj = Jim_GetResult(info->interp); int len = Jim_ListLength(info->interp, listObj); for (i = 0; i < len; i++) { linenoiseAddCompletion(comp, Jim_String(Jim_ListGetIndex(info->interp, listObj, i))); } } } static void JimHistoryFreeCompletion(Jim_Interp *interp, void *data) { struct JimCompletionInfo *compinfo = data; Jim_DecrRefCount(interp, compinfo->command); Jim_Free(compinfo); } #endif void Jim_HistorySetCompletion(Jim_Interp *interp, Jim_Obj *commandObj) { #ifdef USE_LINENOISE if (commandObj) { Jim_IncrRefCount(commandObj); } Jim_DeleteAssocData(interp, completion_callback_assoc_key); if (commandObj) { struct JimCompletionInfo *compinfo = Jim_Alloc(sizeof(*compinfo)); compinfo->interp = interp; compinfo->command = commandObj; Jim_SetAssocData(interp, completion_callback_assoc_key, JimHistoryFreeCompletion, compinfo); } #endif } int Jim_InteractivePrompt(Jim_Interp *interp) { int retcode = JIM_OK; char *history_file = NULL; #ifdef USE_LINENOISE const char *home; home = getenv("HOME"); if (home && isatty(STDIN_FILENO)) { int history_len = strlen(home) + sizeof("/.jim_history"); history_file = Jim_Alloc(history_len); snprintf(history_file, history_len, "%s/.jim_history", home); Jim_HistoryLoad(history_file); } Jim_HistorySetCompletion(interp, Jim_NewStringObj(interp, "tcl::autocomplete", -1)); #endif printf("Welcome to Jim version %d.%d\n", JIM_VERSION / 100, JIM_VERSION % 100); Jim_SetVariableStrWithStr(interp, JIM_INTERACTIVE, "1"); while (1) { |
︙ | ︙ | |||
22088 22089 22090 22091 22092 22093 22094 | scriptObjPtr = Jim_NewStringObj(interp, "", 0); Jim_IncrRefCount(scriptObjPtr); while (1) { char state; char *line; | | | 22328 22329 22330 22331 22332 22333 22334 22335 22336 22337 22338 22339 22340 22341 22342 | scriptObjPtr = Jim_NewStringObj(interp, "", 0); Jim_IncrRefCount(scriptObjPtr); while (1) { char state; char *line; line = Jim_HistoryGetline(interp, prompt); if (line == NULL) { if (errno == EINTR) { continue; } Jim_DecrRefCount(interp, scriptObjPtr); retcode = JIM_OK; goto out; |
︙ | ︙ | |||
22138 22139 22140 22141 22142 22143 22144 | if (reslen) { printf("%s\n", result); } } out: Jim_Free(history_file); | < < < < < | 22378 22379 22380 22381 22382 22383 22384 22385 22386 22387 22388 22389 22390 22391 | if (reslen) { printf("%s\n", result); } } out: Jim_Free(history_file); return retcode; } #include <stdio.h> #include <stdlib.h> #include <string.h> |
︙ | ︙ |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
︙ | ︙ | |||
11 12 13 14 15 16 17 | # If the C compiler doesn't support '-print-sysroot', the path can be supplied # by the '--sysroot' option or by defining 'SYSROOT'. # # 'PKG_CONFIG' may be set to use an alternative to 'pkg-config'. use cc | | | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # If the C compiler doesn't support '-print-sysroot', the path can be supplied # by the '--sysroot' option or by defining 'SYSROOT'. # # 'PKG_CONFIG' may be set to use an alternative to 'pkg-config'. use cc options { sysroot:dir => "Override compiler sysroot for pkg-config search path" } # @pkg-config-init ?required? # # Initialises the 'pkg-config' system. Unless '$required' is set to 0, # it is a fatal error if a usable 'pkg-config' is not found . |
︙ | ︙ | |||
49 50 51 52 53 54 55 | set found 1 if {[opt-str sysroot o]} { define SYSROOT [file-normalize $o] msg-result "Using specified sysroot [get-define SYSROOT]" } elseif {[get-define build] ne [get-define host]} { | | > > > > | 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | set found 1 if {[opt-str sysroot o]} { define SYSROOT [file-normalize $o] msg-result "Using specified sysroot [get-define SYSROOT]" } elseif {[get-define build] ne [get-define host]} { if {[catch {exec-with-stderr {*}[get-define CC] -print-sysroot} result errinfo] == 0} { # Use the compiler sysroot, if there is one define SYSROOT $result msg-result "Found compiler sysroot $result" } else { configlog "[get-define CC] -print-sysroot: $result" set msg "pkg-config: Cross compiling, but no compiler sysroot and no --sysroot supplied" if {$required} { user-error $msg } else { msg-result $msg } set found 0 } } if {[is-defined SYSROOT]} { set sysroot [get-define SYSROOT] # XXX: It's possible that these should be set only when invoking pkg-config global env set env(PKG_CONFIG_DIR) "" # Supposedly setting PKG_CONFIG_LIBDIR means that PKG_CONFIG_PATH is ignored, # but it doesn't seem to work that way in practice set env(PKG_CONFIG_PATH) "" # Do we need to try /usr/local as well or instead? set env(PKG_CONFIG_LIBDIR) $sysroot/usr/lib/pkgconfig:$sysroot/usr/share/pkgconfig set env(PKG_CONFIG_SYSROOT_DIR) $sysroot } } define HAVE_PKG_CONFIG $found return $found |
︙ | ︙ | |||
104 105 106 107 108 109 110 | msg-checking "Checking for $module $args..." if {!$ok} { msg-result "no pkg-config" return 0 } | > > | > > > > > > > > > > | | | | > > > > > > > > > > > > > > > > > | 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | msg-checking "Checking for $module $args..." if {!$ok} { msg-result "no pkg-config" return 0 } set pkgconfig [get-define PKG_CONFIG] set ret [catch {exec $pkgconfig --modversion "$module $args"} version] configlog "$pkgconfig --modversion $module $args: $version" if {$ret} { msg-result "not found" return 0 } # Sometimes --modversion succeeds but because of dependencies it isn't usable # This seems to show up with --cflags set ret [catch {exec $pkgconfig --cflags $module} cflags] if {$ret} { msg-result "unusable ($version - see config.log)" configlog "$pkgconfig --cflags $module" configlog $cflags return 0 } msg-result $version set prefix [feature-define-name $module PKG_] define HAVE_${prefix} define ${prefix}_VERSION $version define ${prefix}_CFLAGS $cflags define ${prefix}_LIBS [exec $pkgconfig --libs-only-l $module] define ${prefix}_LDFLAGS [exec $pkgconfig --libs-only-L $module] return 1 } # @pkg-config-get module setting # # Convenience access to the results of 'pkg-config'. # # For example, '[pkg-config-get pango CFLAGS]' returns # the value of 'PKG_PANGO_CFLAGS', or '""' if not defined. proc pkg-config-get {module name} { set prefix [feature-define-name $module PKG_] get-define ${prefix}_${name} "" } # @pkg-config-get-var module variable # # Return the value of the given variable from the given pkg-config module. # The module must already have been successfully detected with pkg-config. # e.g. # ## if {[pkg-config harfbuzz >= 2.5]} { ## define harfbuzz_libdir [pkg-config-get-var harfbuzz libdir] ## } # # Returns the empty string if the variable isn't defined. proc pkg-config-get-var {module variable} { set pkgconfig [get-define PKG_CONFIG] set prefix [feature-define-name $module HAVE_PKG_] exec $pkgconfig $module --variable $variable } |
|
| < < < < < < < < < < |
︙ | ︙ | |||
23 24 25 26 27 28 29 | # including the 'system' module. if {[is-defined defaultprefix]} { user-notice "Note: defaultprefix is deprecated. Use options-defaults to set default options" options-defaults [list prefix [get-define defaultprefix]] } | | | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | # including the 'system' module. if {[is-defined defaultprefix]} { user-notice "Note: defaultprefix is deprecated. Use options-defaults to set default options" options-defaults [list prefix [get-define defaultprefix]] } options { host:host-alias => {a complete or partial cpu-vendor-opsys for the system where the application will run (defaults to the same value as --build)} build:build-alias => {a complete or partial cpu-vendor-opsys for the system where the application will be built (defaults to the result of running config.guess)} prefix:dir=/usr/local => {the target directory for the build (default: '@default@')} |
︙ | ︙ | |||
48 49 50 51 52 53 54 | sysconfdir: sharedstatedir: localstatedir: runstatedir: maintainer-mode=0 dependency-tracking=0 silent-rules=0 | < > | 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | sysconfdir: sharedstatedir: localstatedir: runstatedir: maintainer-mode=0 dependency-tracking=0 silent-rules=0 } # @check-feature name { script } # # defines feature '$name' to the return value of '$script', # which should be 1 if found or 0 if not found. # # e.g. the following will define 'HAVE_CONST' to 0 or 1. |
︙ | ︙ | |||
141 142 143 144 145 146 147 | # is the fully-expanded template. # # The mapping parameter is how we expand @varname@ within the template. # We do that inline within this step only for @include directives which # can have variables in the filename arg. A separate substitution pass # happens when this recursive function returns, expanding the rest of # the variables. | | | 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | # is the fully-expanded template. # # The mapping parameter is how we expand @varname@ within the template. # We do that inline within this step only for @include directives which # can have variables in the filename arg. A separate substitution pass # happens when this recursive function returns, expanding the rest of # the variables. # proc include-file {infile mapping} { # A stack of true/false conditions, one for each nested conditional # starting with "true" set condstack {1} set result {} set linenum 0 foreach line [split [readfile $infile] \n] { |
︙ | ︙ | |||
179 180 181 182 183 184 185 | autosetup-error "$infile:$linenum: Invalid expression: $line" } dputs "@$condtype: $condexpr => $condval" } if {$condtype ne "if"} { if {[llength $condstack] <= 1} { autosetup-error "$infile:$linenum: Error: @$condtype missing @if" | | | 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | autosetup-error "$infile:$linenum: Invalid expression: $line" } dputs "@$condtype: $condexpr => $condval" } if {$condtype ne "if"} { if {[llength $condstack] <= 1} { autosetup-error "$infile:$linenum: Error: @$condtype missing @if" } elseif {[string length $condargs] && [string index $condargs 0] ne "#"} { autosetup-error "$infile:$linenum: Error: Extra arguments after @$condtype" } } switch -exact $condtype { if { # push condval lappend condstack $condval |
︙ | ︙ |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Copyright (c) 2011 WorkWare Systems http://www.workware.net.au/ # All rights reserved # @synopsis: # # The 'tmake' module makes it easy to support the tmake build system. # # The following variables are set: # ## CONFIGURED - to indicate that the project is configured use system | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # Copyright (c) 2011 WorkWare Systems http://www.workware.net.au/ # All rights reserved # @synopsis: # # The 'tmake' module makes it easy to support the tmake build system. # # The following variables are set: # ## CONFIGURED - to indicate that the project is configured use system options {} define CONFIGURED # @make-tmake-settings outfile patterns ... # # Examines all defined variables which match the given patterns (defaults to '*') # and writes a tmake-compatible .conf file defining those variables. |
︙ | ︙ |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < |
|
| | > | 1 2 | *.pt *.rk05 |
|
| | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/env @PYCMD@ # -*- coding: utf-8 -*- ######################################################################## # Generalized facility to manipulate os8 device images from the POSIX # (host) side using OS/8 system programs under SIMH. # # See USAGE message below for details. # # Copyright © 2018-2019 by Bill Cattey and Warren Young # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to |
︙ | ︙ | |||
55 56 57 58 59 60 61 | progmsg = True DEBUG = False VERBOSE = False QUIET = False # Default RK05 system image to attach if no sys specified. | | | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | progmsg = True DEBUG = False VERBOSE = False QUIET = False # Default RK05 system image to attach if no sys specified. _default_sys_image = "@OS8_TOOLTIME@" _default_sys_path = dirs.os8mo + _default_sys_image _default_att_spec = ["rk", "0", _default_sys_path] # Regex for parsing an argument string into a sys device _dev_arg_regex_str = "-(rk|td|dt|rx)(\d?)(s)?" _dev_arg_re = re.compile(_dev_arg_regex_str) |
︙ | ︙ | |||
108 109 110 111 112 113 114 | _expandable_re = re.compile ("^\$([^/\s]+)/(\S*)$") #### abort_prog ######################################################## # Print err_string and exit with -1 return status. def abort_prog (err_str): | | | | 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | _expandable_re = re.compile ("^\$([^/\s]+)/(\S*)$") #### abort_prog ######################################################## # Print err_string and exit with -1 return status. def abort_prog (err_str): print("Abort: " + err_str) sys.exit(-1) #### parse_attach ###################################################### # Parser for OS/8 attach spec. def parse_attach (action_plan, match, imagename): if match.group(2) == None or match.group(2) == "": abort_prog ("Need unit number for: " + match.group(1) + ".") image_spec = [match.group(1), match.group(2), imagename] if match.group(3) == 's': if action_plan ["sys"] != None: print("Already specified system device. Ignoring sys mount of: " + imagename) else: action_plan["sys"] = image_spec else: action_plan["mount"].append(image_spec) #### path_expand ####################################################### |
︙ | ︙ | |||
192 193 194 195 196 197 198 | # A dollar sign appearing in a POSIX pathname is expanded with substitutions # from dirs.py. def parse_action_file(fname): try: manifest = open(fname, "r") except IOError: | | | | | | > | | | | 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | # A dollar sign appearing in a POSIX pathname is expanded with substitutions # from dirs.py. def parse_action_file(fname): try: manifest = open(fname, "r") except IOError: print(fname + " not found. Skipping.") return None ioline_re = re.compile("(\S+)\s+(\S+)\s+(\S+)") action_plan = {} action_plan["sys"] = None action_plan["mount"] = [] action_plan["copy"] = [] for line in manifest: ioline = line.strip() if DEBUG: print("parse_action_file: ioline: " + ioline) if ioline == "": continue if ioline[0] == '#': continue # Allow comments m=re.match(ioline_re, ioline) if m== None: print("Ignoring line: " + ioline) continue option = m.group(1) source = m.group(2) destination = m.group(3) if option == "att": m = re.match(_dev_actfile_re, source) if m == None: abort_prog ("Could not parse attach spec: " + source) parse_attach (action_plan, m, path_expand(destination)) else: if len(option) != 1: print("Format options are only 1 letter in size. " + \ "Ignoring line: " + ioline) elif option[0] not in _valid_pip_options: print("Unrecognize option in line: " + ioline) elif source == None: print("Null value of source. Ignoring line: " + ioline) elif destination == None: print("Null value of destination. Ignoring line: " + ioline) else: append_copy(action_plan, option, source, destination) return action_plan #### is_directory ###################################################### |
︙ | ︙ | |||
252 253 254 255 256 257 258 | # device name, lacking a file name part after it. Otherwise, we use the # local OS's "is a directory" path check. def is_directory(path): if DEBUG: "is_directory (" + path + ")" m = re.match(_os8_file_re, path) if m != None: | | | | 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 | # device name, lacking a file name part after it. Otherwise, we use the # local OS's "is a directory" path check. def is_directory(path): if DEBUG: "is_directory (" + path + ")" m = re.match(_os8_file_re, path) if m != None: if DEBUG: print("OS/8 Match: DEV: " + m.group(1) + ", File: " + str(m.group(2))) if m.group(2) == None or m.group(2) == "": return True # Just a device so yes it's a directory. else: return False if has_os8_wildcards(path): if DEBUG: print("Has wildcards.") return False return os.path.isdir(path) #### has_os8_wildcards ################################################# # Returns True if the passed file name has OS/8 style wildcards. |
︙ | ︙ | |||
284 285 286 287 288 289 290 | file_list = [] lines = before.split("\r") for line in lines[1:]: # First line is our command. Skip it. line = line.strip() if line == "": continue m = re.match("(\S+)\s*\.(\S+)", line) if m == None: continue | | | 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 | file_list = [] lines = before.split("\r") for line in lines[1:]: # First line is our command. Skip it. line = line.strip() if line == "": continue m = re.match("(\S+)\s*\.(\S+)", line) if m == None: continue # if DEBUG: print("file_list_from_expect: group 1: " + m.group(1) + ", group 2: " + m.group(2)) fname = m.group(1) + "." + m.group(2) file_list.append(fname) return file_list #### append_copy ####################################################### # Append a copy control array to the action_plan |
︙ | ︙ | |||
308 309 310 311 312 313 314 | if ":" in destination: if copy_type == "from": copy_type = "within" else: copy_type = "into" if "/" in destination: | | > | 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 | if ":" in destination: if copy_type == "from": copy_type = "within" else: copy_type = "into" if "/" in destination: print("append_copy, into: Illegal OS/8 file spec containing " + \ "a slash:" + destination) sys.exit(-1) destination = destination.upper() if copy_type == "": abort_prog ("append_copy: No OS/8 file spec found with source: " + source + ", destination: " + destination) else: destination = path_expand(destination) |
︙ | ︙ | |||
511 512 513 514 515 516 517 | arg = sys.argv[idx] # First the simple bit set options if arg == "-d": DEBUG = True elif arg == "-h": if VERBOSE: | | | | | | 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 | arg = sys.argv[idx] # First the simple bit set options if arg == "-d": DEBUG = True elif arg == "-h": if VERBOSE: print(VERBOSE_USAGE) else: print(USAGE) sys.exit(0) elif arg == "-q": QUIET = True elif arg == "-v": VERBOSE = 1 # look for option args. elif arg in _arg_to_option: new_opt = _arg_to_option[arg] if mode_opt == new_opt: print("Warning redundant reset of mode option to " + \ _pip_option_info[new_opt]) mode_opt = new_opt # Not a simple bit set option. elif arg == "--action-file": if idx + 1 == numargs: # Need filename, but no args left. abort_prog ("No action file name.") |
︙ | ︙ | |||
551 552 553 554 555 556 557 | abort_prog ("No image file name.") idx +=1 parse_attach (action_plan, m, sys.argv[idx]) # Do file parser if we didn't get an OS/8 attach spec. else: | | | > | > | > > | > > | > | | | 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 | abort_prog ("No image file name.") idx +=1 parse_attach (action_plan, m, sys.argv[idx]) # Do file parser if we didn't get an OS/8 attach spec. else: if DEBUG: print("File parsing of: " + arg) # Need to know if arg is Linux. If so, we need to do globbing. # If you want OS/8 globbing, specify a device to prevent globbing # from being run. m = re.match(_os8_file_re, arg) if m == None: # Yup, it's POSIX. Glob it. if DEBUG: print(arg + " is POSIX.") more_files = glob.glob(arg) if more_files == []: if DEBUG: print("No more files in POSIX Glob. Our file is: " + arg) more_files.append(arg) # If file not found may be an OS/8 internal xfer. for new_file in more_files: if filespec_seen == 0: source = new_file first_mode = mode_opt if DEBUG: print("Globber: Setting initial source: " + source + \ " and mode: " + first_mode) elif filespec_seen == 1: if DEBUG: print("Globber: Setting initial destination: " + \ destination) destination = new_file else: if DEBUG: "Globber: Appending destination to list. New file is: " + new_file file_and_mode_list.append([mode_opt,destination]) destination = new_file filespec_seen += 1 else: if filespec_seen == 0: source = arg first_mode = mode_opt if DEBUG: print("Setting initial source: " + source + \ " and mode: " + first_mode) elif filespec_seen == 1: destination = arg if DEBUG: print("Setting initial destination: " + destination) else: file_and_mode_list.append([mode_opt, destination]) destination = arg if DEBUG: "Appending destination to list. New file is: " + new_file filespec_seen += 1 idx +=1 # Bottom of the while loop. Increment. if filespec_seen == 0: abort_prog ("No file specs seen. Nothing to do.") elif filespec_seen == 1: abort_prog ("Only 1 file spec found. Nothing to do.") # Now it gets a little complicated... # If neither source nor destination is OS/8, pretend they both were OS/8 "DSK:" # If source is OS/8, and has OS/8 wild cards, the destination must be a directory. else: # If more than 2 files, the destination must be either an OS/8 device or a Linux directory. if DEBUG: print("Destination: " + destination) if filespec_seen > 2 and is_directory(destination) == False: abort_prog ("Destination must be a Linux directory or OS/8 device for multiple source files.") m1 = re.match(_os8_file_re, source) m2 = re.match(_os8_file_re, destination) # If source is OS/8 and it has wild cards, but destination is a file, not a device, |
︙ | ︙ | |||
636 637 638 639 640 641 642 | #### main ############################################################## def main (): action_plan = parse_args() if action_plan == None: abort_prog ("No action plan was parsed.") | | | | | | | > | > | | | | > | > > | > | > | > | > | > | | > | | | | > > > | | | | | | | | | | | | | | | | 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 | #### main ############################################################## def main (): action_plan = parse_args() if action_plan == None: abort_prog ("No action plan was parsed.") if DEBUG: print(str(action_plan)) # Create the SIMH child instance and tell it where to send log output try: s = simh (dirs.build, True) except (RuntimeError) as e: print("Could not start simulator: " + e.message + '!') exit (1) # s.set_logfile (os.fdopen (sys.stdout.fileno (), 'wb', 0)) s.set_logfile (open ("logfile.txt", 'wb')) if VERBOSE: s.verbose = True # Perform sys attach att_spec = action_plan["sys"] if att_spec == None: att_spec = _default_att_spec simh_boot_dev = att_spec[0] + att_spec[1] # Compose simh dev from name and unit. imagename = att_spec[2] if not os.path.exists (imagename): abort_prog ("Requested boot image file: " + imagename + " not found.") if VERBOSE or DEBUG: print("Attaching " + simh_boot_dev + " to " + imagename) s.simh_cmd ("att " + simh_boot_dev + " " + imagename, debug=DEBUG) images_to_zero = [] # Attach other mounts for att_spec in action_plan["mount"]: simh_dev = att_spec[0] + att_spec[1] # Compose simh dev from name and unit. imagename = att_spec[2] if os.path.exists (imagename): if VERBOSE or DEBUG: print("Modifying existing " + simh_dev + " image " + imagename) else: if VERBOSE or DEBUG: print("Will create a new image file named: " + imagename) # Save this att_spec so we can zero it later. images_to_zero.append (att_spec) if VERBOSE or DEBUG: print("Attaching " + simh_dev + " to " + imagename) s.simh_cmd ("att " + simh_dev + " " + imagename, debug=DEBUG) if VERBOSE or DEBUG: print("Booting " + simh_boot_dev + "...") # Confirm successful boot into OS/8. Note we call simh_cmd with _os8_replies! reply = s.simh_cmd ("boot " + simh_boot_dev, s._os8_replies_rex, debug=DEBUG) s.os8_test_result (reply, "Monitor Prompt", "os8-cp") for att_spec in images_to_zero: os8dev = _os8_from_simh_dev[att_spec[0]] if os8dev in _os8_partitions: for partition in _os8_partitions[os8dev]: os8name = os8dev + partition + att_spec[1] + ":" if VERBOSE or DEBUG: print("Initializing directory of " + os8name + " in " + \ imagename) s.os8_cmd ("ZERO " + os8name, debug=DEBUG) else: os8name = os8dev + att_spec[1] + ":" if VERBOSE or DEBUG: print("Initializing directory of " + os8name + " in " + \ imagename) s.os8_cmd ("ZERO " + os8name, debug=DEBUG) # Perform copy operations for do_copy in action_plan["copy"]: mode_opt = do_copy[0] source = do_copy[1] destination = do_copy[2] copy_type = do_copy[3] if mode_opt in _option_to_pip: pip_option = _option_to_pip[mode_opt] else: abort_prog ("Unrecognized mode option: " + mode_opt) if DEBUG: print("Source: " + source + ", Destination: " + destination + \ ", Mode: " + mode_opt + ".") # Is this "from" OS/8 to POSIX, "into" OS/8 from POSIX or "within" OS/8? # "into" -- Attach source to simh ptr # If we are operating "from" and source has wild cards, # Use DIRECT to create list of files. # "from" -- Attach destination to ptp. We've already done POSIX globing. # "within" -- Use COPY. if copy_type == "into": s.os8_pip_to(source, destination, pip_option, debug=DEBUG) elif copy_type == "from": if has_os8_wildcards(source): # Split off device from source: os8dev = source[0:source.index(":")+1] if DEBUG: print("Wild card dev: " + os8dev) # Use OS/8 Direct to enumerate our input files. if DEBUG: print("Calling OS/8 DIRECT on wild card filespec: " + source) s.os8_cmd ("DIR " + source + "/F=1", "\d+\s+FREE BLOCKS", debug=DEBUG) # Now harvest direct output. One file per line. Ignore blank lines. # Maybe parse the FREE BLOCKS Output. # Done when we see a dot. # s._child.expect("\d+\s+FREE BLOCKS") files = file_list_from_expect(s._child.before.decode()) # Confirm return to monitor after call to DIR command. s.os8_cfm_monitor ("os8_cp") for filename in files: if VERBOSE or DEBUG: print("Wildcard call os8_pip_from: copy from: " + \ "{" + os8dev + "}{" + filename + "}" + \ " to: " + destination + ", mode: " + pip_option) s.os8_pip_from(os8dev + filename, destination, pip_option, debug=DEBUG) else: if VERBOSE or DEBUG: print("Call os8_pip_from: copy from: " + source + " to " + \ destination + ", mode: " + pip_option) s.os8_pip_from(source, destination, pip_option, debug=DEBUG) elif copy_type == "within": if VERBOSE or DEBUG: print("Call COPY of: " + source + " to " + destination) s.os8_cmd ("COPY " + destination + "< " + source) else: abort_prog ("Unrecognized copy type: " + copy_type) # Should never happen. # Detach all mounts and then sys. s.esc_to_simh() for att_spec in action_plan["mount"]: simh_dev = att_spec[0] + att_spec[1] # Compose simh dev from name and unit. if VERBOSE or DEBUG: print("Detaching " + simh_dev) s.simh_cmd ("det " + simh_dev, debug=DEBUG) if VERBOSE or DEBUG: print("Detaching " + simh_boot_dev) s.simh_cmd ("det " + simh_boot_dev, debug=DEBUG) # And shut down the simulator. if VERBOSE or DEBUG: print("Quitting simh.") s._child.sendline("quit") if __name__ == "__main__": main() |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | #!/usr/bin/env @PYCMD@ # -*- coding: utf-8 -*- ######################################################################## # Script runner for OS/8 under SIMH. # The library module os8script.py does the heavy lifting. # # See USAGE message below for details. # # Copyright © 2018-2019 by Bill Cattey and Warren Young # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS LISTED ABOVE BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT # OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the names of the authors above # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## # Bring in just the basics so we can bring in our local modules import os import sys sys.path.insert (0, os.path.dirname (__file__) + '/../lib') sys.path.insert (0, os.getcwd () + '/lib') # Remaining Python core modules import subprocess import string import re import shutil import argparse from itertools import chain # Our local modules from pidp8i import * from simh import * from os8script import * #### GLOBALS AND CONSTANTS ############################################# DEBUG = False VERBOSE = False VERY_VERBOSE = False QUIET = False SCRIPT_FILE = "" USAGE = "usage: " + os.path.basename (__file__) + \ " [-h] [-d] [-v] [-vv] [--enable enable_option] ... \n\t[--disable disable_option] ... " + \ "\n \tscript [script] ... " _en_dis_arg_re = re.compile("^(enable|disable)_(\S+)$") def opt_set(en_dis, option, options_enabled, options_disabled): if option == None or en_dis == None: return # print(en_dis + " " + option) if en_dis == "enable": if option not in options_enabled: options_enabled.append(option) if option in options_disabled: options_disabled.remove(option) elif en_dis == "disable": if option not in options_disabled: options_disabled.append(option) if option in options_enabled: options_enabled.remove(option) else: return def add_bool (self, *args, **kwargs): kwargs['action'] = 'store_true' kwargs['default'] = False self.add_argument (*args, **kwargs) #### parse_args ######################################################## def parse_args (script_files, options_enabled, options_disabled): global DEBUG global VERBOSE global VERY_VERBOSE global USAGE enable_usage = "" disable_usage = "" idx = 1 numargs = len(sys.argv) if numargs < 2: print(USAGE) sys.exit(-1) # Add arguments corresponding to --*-os8-* configure script options max_obn_len = 0 for obn, vals in os8opts.opts.items(): max_obn_len = max(max_obn_len, len(obn)) for obn, vals in os8opts.opts.items(): if vals[0]: # Enable option pad_str = (max_obn_len - len (obn)) * " " new_usage = " " + obn + ": " + pad_str + vals[1] + "\n" disable_usage += new_usage else: # Disable option pad_str = (max_obn_len - len (obn)) * " " new_usage = " " + obn + ": " + pad_str + vals[1] + "\n" enable_usage += new_usage if enable_usage != "": USAGE += "\n Known enable options: \n" USAGE += enable_usage if disable_usage != "": USAGE += "\n Known disable options: \n" USAGE += disable_usage while idx < numargs: arg = sys.argv[idx] # print("idx: " + str(idx) + ", arg: " + arg) # print("Files: " + str(script_files)) # print("Options: " + str(options_enabled)) if arg == "-d" or arg == "--debug": DEBUG = True elif arg == "-h" or arg == "--help": print(USAGE) sys.exit(0) elif arg == "-v" or arg == "--verbose": VERBOSE = 1 elif arg == "-vv" or arg == "--very-verbose": VERY_VERBOSE = 1 elif arg == "--enable": idx +=1 if idx == numargs: print("expecting an option but got none.") else: option = sys.argv[idx] # Only add the option once if option not in options_enabled: options_enabled.append(option) elif arg == "--disable": idx +=1 if idx == numargs: print("expecting an option but got none.") else: option = sys.argv[idx] # Only add the option once if option not in options_disabled: options_disabled.append(option) else: script_files.append(arg) idx += 1 #### main ############################################################## # Program entry point. Parses the command line and drives the above. def main (): script_files = [] options_enabled = [] options_disabled = [] parse_args (script_files, options_enabled, options_disabled) if len(script_files) == 0: print("Need a script file to run.") sys.exit(-1) if VERBOSE: print("script_files: " + str(script_files)) if DEBUG: print("options_enabled" + str(options_enabled)) print("options_disabled" + str(options_disabled)) # Append SIMH and OS/8 output to a file by default. # # We append because we're run twice in each test directory via the # os8-sys Makefile target called by test-os8-run, once for the "dist" # media and once for the actual RK05 bootable media. So, the second # run must append its logs to the first run's log file. # # Send the log info to the console instead of the progress messages if # -v was given. See https://stackoverflow.com/questions/21239338 s = simh (dirs.build, True) if VERBOSE: s.verbose = True s.set_logfile (open (dirs.log + 'os8-run' + '.log', 'ab') \ if not VERY_VERBOSE else os.fdopen (sys.stdout.fileno (), 'wb', 0)) os8 = os8script (s, options_enabled, options_disabled, verbose=VERBOSE, debug=DEBUG) for script_file in script_files: if VERBOSE: print(os.path.basename (__file__) + " -- Language Version: " + os8.lang_version) print("Running script file: " + script_file) os8.run_script_file (script_file) # After all scripts are done, we remove any scratch files, # detach any mounted devices, and shut down simh gracefully. for filename in os8.scratch_list: if os8.verbose: print("Deleting scratch_copy: " + filename) os.remove(filename) s.simh_cmd ("detach all") s._child.sendline("quit") if VERBOSE: print("Done!") if __name__ == "__main__": main() |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 | #!/usr/bin/env @PYCMD@ # -*- coding: utf-8 -*- ######################################################################## # Packaging software for consumption by OS/8 # Uses os8-cp as a foundation. # # See USAGE message below for details. # # Copyright © 2020 by Bill Cattey and Warren Young # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS LISTED ABOVE BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT # OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the names of the authors above # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## # Bring in just the basics so we can bring in our local modules import os import sys sys.path.insert (0, os.path.dirname (__file__) + '/../lib') sys.path.insert (0, os.getcwd () + '/lib') # Our local modules from pidp8i import * from simh import * from os8script import * # Other global Python modules import glob import subprocess import string import re import argparse import io #### GLOBALS AND CONSTANTS ############################################# progmsg = True DEBUG = False VERBOSE = False QUIET = False # Sections found in a pspec file: _pspec_sections = ["format:", "inputs:", "outputs:", "build:", "cleanups:"] # Supported file formats: _pspec_formats = ["tu56", "rk05"] # Default RK05 system image to attach if no sys specified. _default_sys_image = "@OS8_TOOLTIME@" _default_sys_path = dirs.os8mo + _default_sys_image _default_att_spec = ["rk", "0", _default_sys_path] _pkg_obj_dir = os.path.join (dirs.obj, "os8pkg/") _pkg_pspec_dir = os.path.join (dirs.src, "pspec/") _pkg_builder_dir = os.path.join (dirs.src, "scripts/misc") _target_dir = dirs.os8mo # Regex for parsing an argument string into a sys device _dev_arg_regex_str = "-(rk|td|dt|rx)(\d?)(s)?" _dev_arg_re = re.compile(_dev_arg_regex_str) # Map of SIMH device names to OS/8 device name prefixes. _os8_from_simh_dev = {"rk" : "RK", "td" : "DTA", "dt" : "DTA", "rx" : "RX"} _os8_partitions = {"RK": ["A", "B"]} # OS/8 file name matching regex _os8_file_re = re.compile("(\S+):(\S+)?") # Constrained spec for an outputs: line. # Group 1 containas the output device: SYS: or DSK: # Group 2 confirns '<' # Group 3 contains the input device: DTA1: or RKA1: or RKB1: # Group 4 contains the input file spec # Group 5 contains the filename before the dot extension. # Group 6 contains the dot extension. _output_spec_re = re.compile("^(SYS:|DSK:)(<)(DTA1:|RKA1:|RKB1:)(([A-Z0-9?]{0,6})(\.[A-Z0-9?]{0,2})?)$") # Matches if the string begins with a dollar sign, and has at least # one slash, returning the string between the dollar sign and the # first slash in group 1 and the rest in group 2. # No whitespace in the string. _expandable_re = re.compile ("^((?:[^/]*/)*)(([^\.]*)(\.pspec)?)$") _pspec_strip_re = re.compile("^(\S*)\.pspec$") # Commands and their help strings. _command_set = [["deps", "Create .mk format dependency file from inputs"], ["include", "Create an include script from selected scripts"], ["install", "Install pspec outputs on the target image file"], ["build", "Run package builder"], ["all", "Perform all of the above."], ["uninstall", "Delete pspec outputs and cleanups from the target image file"], ["conflicts", "Report outputs that exist in multiple pspec files"], ["format", "Display the output format for given package names"], ["verify", "Verify the fidelity of packages installed on the target image file"], ] #### abort_prog ######################################################## # Print err_string and exit with -1 return status. def abort_prog (err_str): print("Abort: " + err_str) sys.exit(-1) #### path_expand ####################################################### # Originally developed in os8script.py, but useful here too. # # Simple minded variable substitution in a path. # A path beginning with a dollar sign parses the characters between # the dollar sign and the first slash seen becomes a name to # expand with a couple local names: $home and the anchor directories # defined in lib/pidp8i/dirs.py. # We abort if the path expansion fails. def path_expand (path): m = re.match(_expandable_re, path) if m == None: return path var = m.group(1) val = getattr (dirs, var, None) if val != None: return os.path.join(val,m.group(2)) else: abort_prog ("{$" + var + "} is not a valid path expansion in " + path) #### dest_expand ######################################################## # Return a full path based either on the --destdir option or # the default _pkg_obj_dir def dest_expand (args, fname, default): if args.destdir: return os.path.join(args.destdir, fname) else: return os.path.join(default, fname) #### parse_pspec ######################################################## # Parse the pspec file named by pkg def parse_pspec (pkg_inpath): try: pspec_file = open (pkg_inpath, "r") except IOError: print(pkg_inpath + " not found. Skipping.") return None pspec = {} for section in _pspec_sections: pspec [section] = [] pspec["format:"].append("tu56") # Default to tu56 format. location = "" for ioline in pspec_file: line = ioline.strip() if line == "": continue elif line[0] == "#": continue elif line in _pspec_sections: location = line else: if location == "": print ("Don't know where to put: {" + line + "}.") elif location == "format:": if line in _pspec_formats: pspec[location][0] = line # Last format we see wins. else: print ("Unsupported format: " + line) else: pspec[location].append(line) return pspec #### make_mk ########################################################### # Make the .mk output file def make_deps (pkg_name, pspec): if len(pspec["inputs:"]) == 0: print ("Nothing to make") return None outstr = "" pkg_fmt = pspec["format:"][0] pkg_ucfmt = pkg_fmt.upper() pkg_srcs = pkg_name.upper() + "_SRCS" pkg_script = pkg_name.upper() + "_" + pkg_ucfmt + "_SCRIPT" pkg_bin = pkg_name.upper() + "_PKG_BIN" outstr += (pkg_srcs + ":= ") for src in pspec["inputs:"]: outstr += ("\\\n\t@srcdir@/" + src) outstr += ("\n\n" + pkg_bin + " = bin/" + pkg_name + "." + pkg_fmt + "\n") # If the build section is empty use a default build: # An os8-run on a script in MISC_SCRIPTS_DIR named like the package and format. if len(pspec["build:"]) > 0: outstr += ("\n\n$(" + pkg_bin + ") : $(" + \ pkg_srcs + ") | $(OS8_TOOLTIME)\n") for build_line in pspec["build:"]: outstr += ("\t" + build_line + "\n") outstr += "\n" else: outstr += ("\n" + pkg_script + " = $(MISC_SCRIPTS_DIR)/" + pkg_name + \ "-" + pkg_fmt + ".os8\n") outstr += ("\n$(" + pkg_bin + ") : $(" + \ pkg_srcs + ") $(" + pkg_script + ") | $(OS8_TOOLTIME)\n") outstr += ("\t$(OS8RUN) $(" + pkg_script + ")\n") return outstr #### run_builder ##################################################### # Start a sub-process that executes the build: lines from the pspec file, # or if there aren't any, call os8-run on the builder script. def run_builder (pkg_name, pspec, args): if len(pspec["build:"]) > 0: # Build lines to execute # We probably need a chdir here because of assumptions about where the pspec is. for build_line in pspec["build:"]: if args.dry_run: print (build_line) else: subprocess.call (build_line, shell = True) else: script_name = pkg_name + "-" + pspec["format:"][0] + ".os8" script_path = find_script (script_name, args) if script_path == None: print ("Could not find script: " + script_name) return tool = os.path.join (dirs.build, 'bin', "os8-run") if args.dry_run: print (tool + " " + script_path) else: subprocess.call (tool + " " + script_path, shell = True) #### script_install ################################################### # Call os8script commands to eiter perform install of pspec outputs # or create a file containing the install commands suitable for submission # to os8-run. # If inc_file is None, we perform the install. # If there is an inc_file we do NOT perform install. # We append to the file. We ignore dry_run. # The dry_run option under these conditions set stdout to inc_file. # We do it this way so that only 1 routine is responsible for defining # the install commands whether the be directly executed or saved in a script. def script_install (os8, pspec, pkg_name, args, inc_file): if len(pspec["outputs:"]) == 0: print ("Nothing to install from package " + pkg_name) return if inc_file != None: inc_file.write ("# Install of " + pkg_name + "\n") pkg_fmt = pspec["format:"][0] if pkg_fmt == "tu56": dev = "dt1" else: dev = "rk1" mount_str = dev + " $os8mo/" + pkg_name + "." + pkg_fmt + " ro required\n" if inc_file != None: inc_file.write ("mount " + mount_str) else: if args.dry_run: print ("install of " + pkg_name + ":\nmount " + mount_str) else: os8.mount_command (mount_str, None) for dest in pspec["outputs:"]: m = re.match (_output_spec_re, dest) if m == None: print ("Mal-formed output: spec: " + dest + ". Ignored.") inst_str = "COPY " + dest if args.debug > 0 or args.verbose: print ("output: " + inst_str) if inc_file != None: inc_file.write ("os8 " + inst_str + "\n") else: if args.dry_run: print (inst_str) else: os8.os8_command (inst_str, None) if inc_file != None: inc_file.write ("umount " + dev + "\n\n") else: if args.dry_run and inc_file == None: print ("umount " + dev) else: os8.umount_command (dev, None) #### script_delete ################################################### # Call os8script commands to perform delete of pspect outputs and cleanups def script_delete (os8, pspec, pkg_name, args): if len(pspec["outputs:"]) == 0: print ("Nothing to delete from package " + pkg_name) return if args.dry_run: print ("uninstall of " + pkg_name) for dest in pspec["outputs:"]: m = re.match (_output_spec_re, dest) if m == None: print ("Mal-formed output: spec: " + dest + ". Ignored.") del_str = "DEL " + m.group(1) + m.group(4) if args.debug > 0 or args.verbose: print ("output: " + del_str) if args.dry_run: print (del_str) else: os8.os8_command (del_str, None) for dest in pspec["cleanups:"]: del_str = "DEL " + dest if args.debug > 0 or args.verbose: print ("cleanup: " + del_str) if args.dry_run: print (del_str) else: os8.os8_command (del_str, None) #### find_pkg ######################################################### # Use a search heuristic to find the package given its name. def find_pkg (pkg_name, pkg_base, pkg_dir, args): if args.debug > 5: print ("find_pkg: Name: " + pkg_name + ", Base: " + pkg_base + ", Dir: " + pkg_dir) pkg_path = os.path.join(pkg_dir, pkg_name + ".pspec") if args.debug > 9: print ("Trying: " + pkg_path) if os.path.exists (pkg_path): if args.debug > 4: print ("Initial pkg spec succeeded.") return pkg_path if args.destdir: pkg_path = os.path.join (args.destdir, pkg_name) if args.debug > 9: print ("Trying: " + pkg_path) if os.path.exists (pkg_path): if args.debug > 4: print ("Found in " + args.destdir + " as " + pkg_ame) return pkg_path pkg_path = os.path.join (args.destdir, pkg_name + ".pspec") if args.debug > 9: print ("Trying: " + pkg_path) if os.path.exists (pkg_path): if args.debug > 4: print ("Found in " + args.destdir + " as " + pkg_name + ".pspec") return pkg_path pkg_path = os.path.join(_pkg_pspec_dir, pkg_name + ".pspec") if args.debug > 9: print ("Trying: " + pkg_path) if os.path.exists (pkg_path): if args.debug > 4: print ("Found in " + _pkg_pspec_dir) return pkg_path return None #### find_script ###################################################### # Use a search heuristic to find the builder script given a package name. def find_script (script_name, args): if args.debug > 5: print ("find_script: Name: " + script_name) if args.destdir: script_path = os.path.join (args.destdir, script_name) if args.debug > 9: print ("Trying: " + script_path) if os.path.exists (script_path): if args.debug > 4: print ("Found " + script_path) return script_path script_path = os.path.join (args.destdir, _pkg_obj_dir + script_name) if args.debug > 9: print ("Trying: " + script_path) if os.path.exists (script_path): if args.debug > 4: print ("Found " + script_path) return script_path script_path = os.path.join(_pkg_builder_dir, script_name) if args.debug > 9: print ("Trying: " + script_path) if os.path.exists (script_path): if args.debug > 4: print ("Found " + script_path) return script_path return None #### start_os8 ######################################################### # Create and start up an os8 script runner # Find the default boot image and boot it. # Return the running os8 object handle. # If we can't start os8, it's a fatal error. Quit here! def start_os8(targ_path, args): try: s = simh (dirs.build, True) except (RuntimeError) as e: print("Could not start simulator: " + e.message + '!') sys.exit (1) if VERBOSE: s.verbose = True s.set_logfile (os.fdopen (sys.stdout.fileno (), 'wb', 0)) os8 = os8script (s, [], [], verbose=VERBOSE, debug=args.debug>0) if args.debug >0 or args.dry_run: print ("Perform " + args.command + " on " + targ_path) os8.mount_command ("rk0 " + targ_path + " required", None) os8.boot_command ("rk0", None) return os8 #### conflicts ########################################################## # Report any members of this pspec's output: that have been seen before. # A seen item contains lots of information: # pkg_name, dev, name def conflicts (seen, pspec, pkg_name, args): if len(pspec["outputs:"]) == 0: print ("No outputs in package " + pkg_name) return for dest in pspec["outputs:"]: found = False m = re.match (_output_spec_re, dest) if m == None: print ("Mal-formed output: spec: " + dest + ". Ignored.") output_name = m.group(4) # Save device and file name as a seen item. for this in seen: if this["name"] == output_name: found = True print ("Warning: " + output_name + " gets installed on " + this ["dev"] + \ " by package " + this ["pkg_name"]) if found == False: item = {"pkg_name": pkg_name, "dev": m.group(1), "name": output_name} if args.debug > 9: print ("Adding item: " + str(item)) seen.append(item) #### verify ############################################################ # Use the OCOMP program in the target to verify that the output: items # are present and match what is in the package target file. def verify (os8, pspec, pkg_name, args): if len(pspec["outputs:"]) == 0: print ("No outputs in package " + pkg_name) return pkg_fmt = pspec["format:"][0] if pkg_fmt == "tu56": dev = "dt1" else: dev = "rk1" mount_str = dev + " $os8mo/" + pkg_name + "." + pkg_fmt + " ro required\n" if args.debug > 0: print ("Mount: " + mount_str) os8.mount_command (mount_str, None) os8.resume_command ("", None) for dest in pspec["outputs:"]: m = re.match (_output_spec_re, dest) if m == None: print ("Mal-formed output: spec: " + dest + ". Ignored.") input_name = m.group(3) + m.group(4) output_name = m.group(1) + m.group(4) if args.debug > 9: print ("\tChecking: " + output_name) ocomp_str = "TTY:<" + input_name + "," + output_name result = os8.ocomp_command (ocomp_str, None) if result == "fail": print ("Failed verify of " + output_name) else: if args.verbose: print ("Successful verify of " + output_name) #### main ############################################################## def main (): parser = argparse.ArgumentParser( description = """ Package manager for use under PDP-8 OS/8.""", usage = "%(prog)s [options] [command] [package ...]") parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true") parser.add_argument("-d", dest="debug", metavar="DEBUG", type=int, help="set debug level", default=0) parser.add_argument("--destdir", help="Destination directory for output files") parser.add_argument ("--target", help="target image file", default="v3d.rk05") parser.add_argument ("--dry-run", "-n", action="store_true", help="Dry Run. Print output. Generate no files.") subparsers = parser.add_subparsers(title="commands") for pair in _command_set: name = pair[0] the_help = pair[1] the_sub = subparsers.add_parser (name, help=the_help) the_sub.add_argument ('packages', nargs=argparse.REMAINDER, metavar="one or more package files") the_sub.set_defaults (command=name) args = parser.parse_args() if hasattr(args, 'command') == False: print (parser.print_help()) sys.exit(-1) do_all = args.command == "all" inst_cmd = args.command in ["install", "uninstall", "verify"] if args.command == "include" or do_all: # We're going to assemble obj/os8pkg/pkgs.os8 from the proffered list of packages. outpath = dest_expand (args, "pkgs.os8", _pkg_obj_dir) if args.debug >0 or args.dry_run: print (outpath) if len(args.packages) == 0: first_line = "# No packages to include" else: first_line = "# Packages to include" if args.dry_run: print (first_line) else: incfile = open (outpath, "w") incfile.write(first_line + "\n") else: # All other commands require one package. if len(args.packages) == 0: abort_prog ("Need at least one package to work.") # If we need an os8script object, put it here. os8 = None seen = [] # The pkg_spec from command line may be a package name, or a file path. # We need the name, and may or may not get the ".pspec" at the end. for pkg_spec in args.packages: pkg_dir = os.path.dirname(pkg_spec) pkg_base = os.path.basename(pkg_spec) m = re.match(_pspec_strip_re, pkg_base) if m == None: pkg_name = pkg_base else: pkg_name = m.group(1) if args.debug >0: print ("Package name: " + pkg_name) pkg_inpath = find_pkg (pkg_name, pkg_base, pkg_dir, args) if pkg_inpath == None: print ("Could not find package: " + pkg_spec) continue if args.debug >0: print ("Package path: " + pkg_inpath) # We assume all command will require parsing the pspec. pspec = parse_pspec(pkg_inpath) if pspec == None: continue pkg_fmt = pspec["format:"][0] if args.command == "format": if len(args.packages) > 1: line = pkg_name + ": " else: line = '' line += pkg_fmt print (line) if args.debug >0: print ("Format: " + pkg_fmt) if args.command == "deps" or do_all: print ("Generating deps for " + pkg_name + "...") outname = (pkg_name + ".mk") outpath = dest_expand (args, outname, _pkg_obj_dir) if args.debug >0 or args.dry_run: print (outpath) outstr = make_deps(pkg_name, pspec) if args.dry_run: print (outstr) else: depfile = open (outpath, "w") for line in outstr: depfile.write(line) depfile.close() if args.command == "include": # Use the list of pkgnames to generate an os8-run script that performs # the relevant installs. print ("Generating include script for " + pkg_name + "...") if args.dry_run: print ("Include: " + pkg_name) script_install (None, pspec, pkg_name, args, sys.stdout) else: incfile.write ("# Install: " + pkg_name + "\n") script_install (None, pspec, pkg_name, args, incfile) if args.command == "build" or do_all: run_builder(pkg_name, pspec, args) # This calls start_os8 once if we need it. if inst_cmd and os8 == None: targ_path = dest_expand (args, args.target, _target_dir) os8 = start_os8(targ_path, args) if args.command == "install" or do_all: print ("Installing " + pkg_name + " to " + targ_path + "...") script_install (os8, pspec, pkg_name, args, None) if args.command == "uninstall": print ("Removing " + pkg_name + " from " + targ_path + "...") script_delete (os8, pspec, pkg_name, args) if args.command == "conflicts": print ("Checking for conflicts with package " + pkg_name) conflicts (seen, pspec, pkg_name, args) if args.command == "verify": print ("Verifying package " + pkg_name + " on " + targ_path) verify (os8, pspec, pkg_name, args) if args.command == "include" and args.dry_run == False: incfile.close() # It is vitally important that we exit gracefully. Otherwise # The install actions may not be successfully be committed to media. if inst_cmd and os8 != None: os8.simh.simh_cmd ("detach all") os8.simh._child.sendline("quit") if __name__ == "__main__": main() |
1 2 3 | #!/bin/bash ######################################################################## # pidp8i.in - Collection of scriptlets for dealing with the pidp8i | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/bin/bash ######################################################################## # pidp8i.in - Collection of scriptlets for dealing with the pidp8i # systemd user service and its associated screen manager session. # # Copyright © 2015-2020 Oscar Vermeulen and Warren Young # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to |
︙ | ︙ | |||
32 33 34 35 36 37 38 39 40 | bootdir="@BOOTDIR@" prefix="@ABSPREFIX@" sim="$prefix/bin/pidp8i-sim" scanswitch="$prefix/libexec/scanswitch" systemctl=$(uname -r | grep -qw Microsoft && echo /bin/nothing || echo /bin/systemctl) ggrep=$(which ggrep grep 2> /dev/null | head -1) is_running() { | > > > > > > > > > > > > > > > > > > | | > > > > > > > > | > | > > > | > > > > | > | | 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | bootdir="@BOOTDIR@" prefix="@ABSPREFIX@" sim="$prefix/bin/pidp8i-sim" scanswitch="$prefix/libexec/scanswitch" systemctl=$(uname -r | grep -qw Microsoft && echo /bin/nothing || echo /bin/systemctl) ggrep=$(which ggrep grep 2> /dev/null | head -1) if [ -e "$prefix/etc/pidp8i.rc" ] then . "$prefix/etc/pidp8i.rc" fi [ -n "$SCREEN_MANAGER" ] || SCREEN_MANAGER=screen if [ ! -t 1 ] && [ "$SCREEN_MANAGER" = "none" ] then echo "The 'none' screen manager mode is meant for interactive use only!" exit 1 fi is_running() { if [ "$SCREEN_MANAGER" = "none" ] then return 1 elif [ "$SCREEN_MANAGER" = "tmux" ] then tmux has-session -t pidp8i 2>/dev/null else procs=`screen -list pidp8i | $ggrep -Pc '\d\.pidp8i'` test -n "$procs" && test $procs -gt 0 && return 0 || return 1 fi } sim_child_pid() { if [ "$SCREEN_MANAGER" = "none" ] then echo "" elif [ "$SCREEN_MANAGER" = "tmux" ] then tmux list-sessions -F '#{session_name} #{pid}' | awk '/^pidp8i / {print $2}' else screen -ls pidp8i | grep -Eo '[[:digit:]]+\.pidp8i' | grep -Eo '^[[:digit:]]+' fi } # Were we given a command line argument? if [ -z "$1" ] then # No, so try to run or attach to the running simulator if [ "$SCREEN_MANAGER" = "none" ] then exec $0 start elif is_running then echo Joining simulator session already in progress... if [ "$SCREEN_MANAGER" = "tmux" ] then exec tmux attach-session -d -t pidp8i else exec screen -r -S pidp8i fi else cat <<ERROR Either the simulator isn't running, or it isn't running under a ${SCREEN_MANAGER} session owned by @INSTUSR@. Did you start the simulator via systemd? ERROR exit 1 fi fi |
︙ | ︙ | |||
120 121 122 123 124 125 126 | fi # We want SIMH to have a sensible working directory: somewhere the # user can write files and which makes sense when giving SIMH # commands involving file paths. This default is chosen because it # satisfies both criteria. # If you change the default here, change that script as well. | > | > > > > > > > > > | > | > > > > > > | > | | | | > > > > > > > | > | 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | fi # We want SIMH to have a sensible working directory: somewhere the # user can write files and which makes sense when giving SIMH # commands involving file paths. This default is chosen because it # satisfies both criteria. # If you change the default here, change that script as well. set -e cd "$prefix/share/media" # Start the simulator if [ "$SCREEN_MANAGER" = "none" ] then exec "$sim" "$bscript" elif [ "$SCREEN_MANAGER" = "tmux" ] then tmux new-session -s pidp8i -d "$sim" "$bscript" else screen -dm -S pidp8i "$sim" "$bscript" fi # Tell systemd where to find the backgrounded simulator so it can # stop it via systemctl. Skipped on non-systemd systems and where # SCREEN_MANAGER=none. scpid=$(sim_child_pid) if [ -x $systemctl ] && [ -n "$scpid" ] && [ $scpid -gt 0 ] then systemd-notify --ready --pid=$scpid fi exit 0 elif [ "$verb" = "stop" ] then # Someone (maybe the user via "pidp8i stop", maybe systemd via # "systemctl pidp8i stop") is telling us to stop the background # simulator. # # First figure out what the simulator is called and send it the # signal that shuts it down gracefully. for sim in pdp8 pidp8i-sim do if pkill -0 $sim then # Give it the signal to start shutting down gracefully: stop # GPIO thread, save simulator state if savestate enabled... # Give it time to complete, then kill it hard in case it # doesn't die on its own. echo -n "Stopping $sim simulator..." for sig in TERM KILL ; do pkill -$sig $sim ; sleep 1 ; done # The screen manager might still be running despite its # only child dying. Nuke it hard if so. if ! is_running || [ "$SCREEN_MANAGER" = "none" ] then echo "The PiDP-8/I simulator is stopped." elif [ "$SCREEN_MANAGER" = "tmux" ] then tmux kill-session -t pidp8i else screen -S pidp8i -X quit fi exit 0 fi done exit 1 fi |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | #!/usr/bin/env @PYCMD@ # -*- coding: utf-8 -*- ######################################################################## # teco-pi-demo - Starts the simulator with the OS/8, sends one of the # famous TECO "calculate pi" program to it, and starts it running at # a very slow rate of speed to act as a blinkenlights demo. # # Copyright © 2017-2020 by Warren Young. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS LISTED ABOVE BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT # OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the names of the authors above # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## # Bring in just the basics so we can bring in our local modules import os import sys sys.path.insert (0, os.path.dirname (__file__) + '/../lib') sys.path.insert (0, os.getcwd () + '/lib') # Other core modules we need from datetime import datetime import time # Our local modules from pidp8i import * from simh import * #### main ############################################################## def main (): # Check for command line flags benchmark = False throttle = True if len (sys.argv) > 1: if sys.argv[1] == '-b': benchmark = True elif sys.argv[1] == '-f': throttle = False # Create the SIMH child instance and tell it where to send log output try: s = simh (dirs.build) except (RuntimeError) as e: print("Could not start simulator: " + e.message + '!') exit (1) s.set_logfile (os.fdopen (sys.stdout.fileno (), 'wb', 0)) # Find and boot the built OS/8 bin disk rk = os.path.join (dirs.os8mo, 'v3d.rk05') if not os.path.isfile (rk): print("Could not find " + rk + "; OS/8 media not yet built?") exit (1) print("Booting " + rk + "...") reply = s.simh_cmd ("att rk0 " + rk) s.simh_test_result (reply, "Prompt", "main 1") reply = s.simh_cmd ("boot rk0", s._os8_replies_rex) s.os8_test_result (reply, "Monitor Prompt", "main 2") # Start TECO8 in the simulator under OS/8 # Confirm it is running when you receive the Command Decoder Prompt. reply = s.os8_cmd ("R TECO") s.os8_test_result (reply, "Command Decoder Prompt", "main 2") # The macro comes from http://www.iwriteiam.nl/HaPi_TECO_macro.html # and it was created by Stanley Rabinowitz. # # The 248 preceding "UN" in the first line of the macro is the number # of digits of pi to calculate. That value was reached by experiment # as the largest value that runs without crashing TECO with a # # ?MEM STORAGE CAPACITY EXCEEDED # # error. You can see that by increasing the value below, commenting # out the throttle setting below, and running the demo. On a Pi 3, it # should take a bit over an hour to complete, if it doesn't error out. # # With the simulator throttled, generating 248 digits takes 17 years! # # That is based on generating 1 digit every ~16 seconds on a Pi 3 when # running unthrottled, roughly 8 MIPS. When throttled to 59 IPS — or # 17ms per instruction, as below — you multiply the seconds by the # factor 8 MIPS / 59 IPS = ~136000, giving about 2.2 million seconds # per digit. Multiplying that by 248 gives ~17 years. macro = [ 'GZ0J\\UNQN"E 248UN \' BUH BUV HK', 'QN< J BUQ QN*10/3UI', 'QI< \+2*10+(QQ*QI)UA B L K QI*2-1UJ QA/QJUQ', 'QA-(QQ*QJ)-2\ 10@I// -1%I >', 'QQ/10UT QH+QT+48UW QW-58"E 48UW %V \' QV"N QV^T \' QWUV QQ-(QT*10)UH >', 'QV^T @^A/', '/HKEX', ] # First and last lines are handled specially, so slice them off. first = macro.pop (0) last = macro.pop () # Send the first line of the macro; implicitly awaits 1st TECO prompt s.os8_send_line (first) # Blindly send core lines of the macro; TECO gives no prompts for 'em. for line in macro: s.os8_send_line (line) # Send last line of macro sans CR, followed by two Esc characters to # start it running. s.os8_send_str (last) # not os8_send_line! s.os8_send_ctrl ('[') s.os8_send_ctrl ('[') if benchmark: # Run demo long enough to get a good sense of the simulator's # execution rate while unthrottled on this host hardware. If # you don't run it long enough, the IPS value is untrustworthy. try: s.spin (10) except pexpect.TIMEOUT: # Ask the simulator what IPS rate we ran that benchmark at. # It knows how to shift context appropriately. s.simh_send_line ('show clocks') line = s.read_tail ('Execution Rate:').decode() curr_ips = int (line.strip().replace(',', '').split(' ')[0]) pf = open ('lib/pidp8i/ips.py', 'a') pf.write ('current = ' + str (curr_ips) + ' # ' + \ str (datetime.today ()) + '\n') pf.close () s.quit() pdp_ratio = float (curr_ips) / ips.pdp8i rpi_ratio = float (curr_ips) / ips.raspberry_pi_b_plus print("\nYour system is " + format (rpi_ratio, '.1f') + \ " times faster than a Raspberry Pi Model B+") print("or " + format (pdp_ratio, '.1f') + \ " times faster than a PDP-8/I.\n") elif throttle: # Normal mode. Tell SIMH and throttle down to a rate suitable for a # blinkenlights demo. 1/17 means SIMH runs one instruction then # waits for 17ms, yielding ~59 IPS. s.simh_cmd ('set throttle 1/17') # You can't hit Ctrl-E while running this script in the foreground # since pexpect takes over stdio. Therefore, if you want to be able # to send commands to the simulator while the demo is running, # uncomment the line below, which will let you send commands to the # simulator via telnet. From another terminal or SSH session: # # $ telnet localhost 3141 # # or from a remote machine: # # $ telnet 192.168.1.2 3141 # # It's disabled by default because SIMH can't be made to listen only # on localhost, so doing this may be a security risk. SIMH disables # obviously-unsafe commands like ! on the remote console, but it is # possible some mischief may be possible via this path anyway. It # could be used to exfiltrate a sensitive file via ATTACH, for one # thing. For another, it's a potential DoS vector. #s.send_cmd ('set remote telnet=3141') # Let it run. Never exits. s.send_line ('cont') s.spin () else: s.spin () if __name__ == "__main__": main() |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
︙ | ︙ | |||
18 19 20 21 22 23 24 | ; and back off, which restarts the simulator with 7.script, which in ; turn loads this one. This somewhat clumsy arrangement is required ; because toggling Sing_Step with IF = 0 must not be made to restart ; the simulator, else there would be no way to use Sing_Step for any ; of its other functions. See the PiDP-8/I instructions for details. ; echo Loading OS/8 from the RK05 cartridge disk... | | | | | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | ; and back off, which restarts the simulator with 7.script, which in ; turn loads this one. This somewhat clumsy arrangement is required ; because toggling Sing_Step with IF = 0 must not be made to restart ; the simulator, else there would be no way to use Sing_Step for any ; of its other functions. See the PiDP-8/I instructions for details. ; echo Loading OS/8 from the RK05 cartridge disk... @include boot/common.script @define SHORTNAME 0 @include @ABSSRCDIR@/boot/savestate.script att rk0 @MEDIADIR@/os8/@OS8_RUNTIME@ boot rk0 :end |
1 2 3 4 5 | ; This script initializes a populated TSS/8 environment on an ; RS08 fixed-head hard disk drive (384 kB!) controlled by the ; RF08 disk controller. ; echo Loading TSS/8 from the RS08 fixed-head disk... | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ; This script initializes a populated TSS/8 environment on an ; RS08 fixed-head hard disk drive (384 kB!) controlled by the ; RF08 disk controller. ; echo Loading TSS/8 from the RS08 fixed-head disk... @include boot/common.script set rf enabled @define SHORTNAME 2 @include @ABSSRCDIR@/boot/savestate.script load @MEDIADIR@/tss8/tss8_init.bin attach rf @MEDIADIR@/tss8/tss8_rf.dsk attach ttix 4000 run 24200 :end |
1 2 3 4 | ; Loads OS/8 from DECtape, as opposed to the RK05 based environment ; in 0.script. ; echo Loading OS/8 from DECtape type @OS8_TAPE_DEVICE@... | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ; Loads OS/8 from DECtape, as opposed to the RK05 based environment ; in 0.script. ; echo Loading OS/8 from DECtape type @OS8_TAPE_DEVICE@... @include boot/common.script @if SIMH_TAPE_DEVICE eq "td" set dt disabled set td enabled ; else, default is correct, per p.4 in SIMH's pdp8_doc.doc. @endif @define SHORTNAME 3 @include @ABSSRCDIR@/boot/savestate.script attach @SIMH_TAPE_DEVICE@0 @MEDIADIR@/os8/@OS8_BOOT_TAPE@ boot @SIMH_TAPE_DEVICE@0 :end |
︙ | ︙ | |||
13 14 15 16 17 18 19 | echo echo Press both rotate keys simulatenously to warp into hyperspace. echo echo Press Ctrl-E to pause the simulator and return to the SimH echo command prompt, where you can say "quit", "help" and other echo things. See the SimH manual for details. echo | | | | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | echo echo Press both rotate keys simulatenously to warp into hyperspace. echo echo Press Ctrl-E to pause the simulator and return to the SimH echo command prompt, where you can say "quit", "help" and other echo things. See the SimH manual for details. echo @include boot/common.script at ttix 2222 set ttox0 8b @define SHORTNAME 4 @include @ABSSRCDIR@/boot/savestate.script load @MEDIADIR@/spacewar/spacewar.bin g 200 :end |
1 2 3 | ; This script loads ETOS V5B from the RK05 cartridge disk drive. ; echo Loading ETOS from the RK05 cartridge disk drive... | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ; This script loads ETOS V5B from the RK05 cartridge disk drive. ; echo Loading ETOS from the RK05 cartridge disk drive... @include boot/common.script set tsc enabled attach ttix 4000 @define SHORTNAME 6 @include @ABSSRCDIR@/boot/savestate.script att rk0 @MEDIADIR@/etos/etosv5b-demo.rk05 boot -d rk0 :end |
1 2 3 4 5 6 7 8 | ; Loads OS/8 V3F from DECtape, as opposed to the RK05 based environment ; in 0.script. Based on 3.script.in, which differs by being conditional ; based on whether the user chooses at configure time whether to boot ; OS/8 V3F or V3D. This script also runs the tape image from the build ; directory, rather than from the installation directory, since it's ; normally run as "make run-v3f". ; echo Loading OS/8 from DECtape type @OS8_TAPE_DEVICE@... | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ; Loads OS/8 V3F from DECtape, as opposed to the RK05 based environment ; in 0.script. Based on 3.script.in, which differs by being conditional ; based on whether the user chooses at configure time whether to boot ; OS/8 V3F or V3D. This script also runs the tape image from the build ; directory, rather than from the installation directory, since it's ; normally run as "make run-v3f". ; echo Loading OS/8 from DECtape type @OS8_TAPE_DEVICE@... @include boot/common.script @if SIMH_TAPE_DEVICE eq "td" set dt disabled set td enabled ; else, default is correct, per p.4 in SIMH's pdp8_doc.doc. @endif @define SHORTNAME run-v3f @include @ABSSRCDIR@/boot/savestate.script attach @SIMH_TAPE_DEVICE@0 bin/v3f-@OS8_TAPE_DEVICE@.tu56 boot @SIMH_TAPE_DEVICE@0 :end |
1 2 3 4 5 | ; Same as 0.script, only with RK0 attached to the *.rk05 file in the ; build directory, not the one in the installation directory. Used ; by "make run" so you don't have to "make mediainstall" first. ; echo Loading OS/8 from the RK05 cartridge disk in the build directory... | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ; Same as 0.script, only with RK0 attached to the *.rk05 file in the ; build directory, not the one in the installation directory. Used ; by "make run" so you don't have to "make mediainstall" first. ; echo Loading OS/8 from the RK05 cartridge disk in the build directory... @include boot/common.script @define SHORTNAME run @include @ABSSRCDIR@/boot/savestate.script att rk0 bin/@OS8_RUNTIME@ boot rk0 :end |
1 2 3 4 5 6 7 8 | ; Same as 2.script, except that the binary disk image and core init ; image files are copied into the build tree's bin/ directory and run ; from there rather than being run from the installation tree. ; ; This is used by "make run-tss8" so you don't have to say ; "make mediainstall" then manually start the simulator with 2.script. ; echo Loading TSS/8 from the RS08 fixed-head disk... | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ; Same as 2.script, except that the binary disk image and core init ; image files are copied into the build tree's bin/ directory and run ; from there rather than being run from the installation tree. ; ; This is used by "make run-tss8" so you don't have to say ; "make mediainstall" then manually start the simulator with 2.script. ; echo Loading TSS/8 from the RS08 fixed-head disk... @include boot/common.script set rf enabled !cp -n media/tss8/tss8_rf.dsk bin @define SHORTNAME tss8 @include @ABSSRCDIR@/boot/savestate.script !cp media/tss8/tss8_init.bin bin load bin/tss8_init.bin attach rf bin/tss8_rf.dsk attach ttix 4000 run 24200 |
︙ | ︙ |
|
| > > > > | | | > > > > > > | > > > | | | | > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # Using Our Binary OS Images ## Imaging the SD Card The Raspberry Pi OS OS images you can download from [the PiDP-8/I development site][1] are based on the [official Raspberry Pi OS images][2], so the Raspberry Pi Foundation’s [installation guide][3] applies just as well to our PiDP-8/I software images. I particularly like using the [Etcher][7] method, even on a POSIX system, since it can write the SD card directly from the Zip file, without requiring that you unpack the `*.img` file within first. As of the 2021.02.14 release, you will need to use a 8 GB or larger SD card. Prior releases allowed use of 2 GB cards, but you can't even do an "`apt upgrade`" on such a card after flashing it with a fresh copy of the current "Lite" OS image. We jumped from 2 GB to 8 not only because we don't happen to have any 4 GB cards laying around, but because the Raspberry Pi Foundation docs recommend 8 GB for this release. The contents of the Zip file are: | File Name | Description |-------------------------------- | `README.md` | this file | `pidp8i-*.img` | the OS image, based on Raspberry Pi OS Stretch Lite | `MANIFEST.txt` | SHA-256 hash and file size for the OS image file ## Logging In Aside from having the PiDP-8/I software installed and running, the primary difference between our OS images those provided by the Raspberry Pi Foundation is the default user name and password: * **username:** `pidp8i` * **password:** `edsonDeCastro1968` You will be made to change that password on first login. Remember, [the S in IoT stands for Security.][5] If we want security, we have to see to it ourselves! If you do not want your PiDP-8/I to be secure, see our "[How to Run a Naked PiDP-8/I][6]" guide. ## <a id="sshd"></a>Enabling the SSH Server The OpenSSH server is enabled and running by default on our OS images, but for security reasons, our build process wipes out the generated SSH host keys, else they’d be the same on everyone's PiDP-8/I, which would be a massive security hole. Unfortunately, the `sshd` service on Raspberry Pi OS is not smart enough to regenerate these keys if they are missing on boot, so you need to do this once by hand: $ sudo dpkg-reconfigure openssh-server You should be able to log in via SSH immediately after that command completes. We can’t do this for you automatically because our software doesn’t run as root, so our startup script cannot make system-wide changes. This is properly one of the tasks for you, the system’s administrator. <div id="this-space-intentionally-left-blank" style="min-height:50em"></div> [1]: https://tangentsoft.com/pidp8i/ [2]: https://raspberrypi.org/downloads/raspbian/ [3]: https://raspberrypi.org/documentation/installation/installing-images/ [4]: https://en.wikipedia.org/wiki/Internet_of_things [5]: http://www.testandverification.com/iot/s-iot-stands-security/ |
︙ | ︙ |
︙ | ︙ | |||
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | ## Update SIMH If `tools/simh-update` hasn't been run recently, you might want to do that and re-test before publishing a new version. ## Publish OS/8 RK05s Re-configure the software with default settings, remove `bin/*.rk05`, rebuild, and run `tools/publish-os8` to send the "final" OS/8 disk images for this version of the software up to tangentsoft.com as unversioned assets. Update the date stamp in the "OS/8 RK05 Media" section of the project home page. ## Update ChangeLog.md Trawl the Fossil timeline for user-visible changes since the last release, and write them up in user-focused form into [the `ChangeLog.md` file][cl]. If a regular user of the software cannot see a given change, it shouldn't go in the `ChangeLog.md`; let it be documented via the timeline only. | > > > > > > > > > > > > > > > > | | | < < < < < > | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | ## Update SIMH If `tools/simh-update` hasn't been run recently, you might want to do that and re-test before publishing a new version. ## Test 1. Build the software on the version of Raspberry Pi OS we’ll [use for BOSI, below](#bosi). Fix any problems. 2. Run `make test` on the BOSI host. Fix any problems. 3. Repeat above on [all other platforms previously known to work][oscomp]. Update the article to list caveats and such, or fix the problems. (See “[How the PiDP-8/i Software Is Tested](./testing.md)” for details on the philosophy and methods behind this process.) [oscomp]: https://tangentsoft.com/pidp8i/wiki?name=OS+Compatibility ## Publish OS/8 RK05s Re-configure the software with default settings, remove `bin/*.rk05`, rebuild, and run `tools/publish-os8` to send the "final" OS/8 disk images for this version of the software up to tangentsoft.com as unversioned assets. Update the date stamp in the "OS/8 RK05 Media" section of the project home page. ## Update ChangeLog.md Trawl the Fossil timeline for user-visible changes since the last release, and write them up in user-focused form into [the `ChangeLog.md` file][cl]. If a regular user of the software cannot see a given change, it shouldn't go in the `ChangeLog.md`; let it be documented via the timeline only. Immediately prior to release, `/doc`, `/dir`, `/file` and similar links should point to trunk, but immediately prior to release, re-point them to the `release` branch, since this document describes prior releases. [cl]: https://tangentsoft.com/pidp8i/doc/trunk/ChangeLog.md ## Update the Release Branch Run `make release` to check the `ChangeLog.md` file changes in, merge trunk to the `release` branch, and apply a tag of the form vYYYYMMDD to that marge checkin. |
︙ | ︙ | |||
83 84 85 86 87 88 89 | after tagging the release, since they point at the "release" tag applied by the previous step, so they begin shipping the new release immediately after tagging it. ## <a id="bosi"></a>Produce the Normal Binary OS Image | | | > > > | > > > | | > > > > | > > | < < | < < < | < | < | | | | | 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | after tagging the release, since they point at the "release" tag applied by the previous step, so they begin shipping the new release immediately after tagging it. ## <a id="bosi"></a>Produce the Normal Binary OS Image Start with the latest version of [Raspberry Pi OS Lite][os] on a multi-core Raspberry Pi. 1. If the version of the base OS has changed since the last binary OS image was created, download the new one. Be sure to update the “`$os`” variable at the top of `tools/bosi` to match if the major version has changed. While the OS is downloading, zero the SD card you're going to use for this, so the prior contents don't affect this process. Blast the base OS image onto the cleaned SD card. 2. Boot it up on a multi-core Pi. Log in as user `pi`, password `raspberry`, then retreive and initialize BOSI: $ wget https://tangentsoft.com/bosi $ chmod +x bosi $ exec sudo ./bosi init The `exec` bit is required so that the `bosi` invocation is run as root without any processes running as `pi` in case the `init` step sees that user `pi` hasn't been changed to `pidp8i` here: the `usermod` command we give to make that change will refuse to do what we ask if there are any running processes owned by user `pi`. It will either reboot the system after completing its tasks successfully or exit early, giving the reason it failed. 3. Log in as user `pidp8i` since the prior step changed it from `pi`. The password remains unchanged at this point. Clone the software repo and build the software: $ ./bosi build [nls] Adding the “nls” parameter lets the slow single-core Pi build share the multicore ILS build’s OS/8 images, saving a tremendous amount of build time. On reboot, say `top -H` to make sure the software is running and that the CPU percentages are reasonable for the platform: if the CPU is mostly idle, the simulator isn’t running, and you need to figure out why before proceeding. You may also want to check that it is running properly with a `pidp8i` command. Is the configuration line printed by the simulator correct? Does OS/8 run? Are there any complaints from SIMH, such as about insufficient CPU power? 4. Do the final inside-the-image steps: $ ./bosi prepare 5. After the Pi shuts down, move the SD card to a micro SD card reader plugged into the Mac¹ and say: $ bosi image [nls] Give "ils" as a parameter or leave it blank for the ILS image. 6. The prior step rewrote the SD card with the image file it created. Boot it up and make sure it still works. If you're happy with it, give this command *on the Mac*. $ bosi finish [nls] As above, the parameter can be "ils" or left off for the ILS images. [os]: https://www.raspberrypi.org/software/operating-systems/ ## Produce the "No Lamp Simulator" Binary OS Image Do the same series of steps above on a single-core Raspberry Pi, except that you give "nls" parameters to the `build`, `image`, and `finish` steps. ## Publicizing While the NLS image uploads — the ILS image was already sent in step 7 in the first pass through the list above — compose the announcement message, and modify the front page to point to the new images. You |
︙ | ︙ | |||
183 184 185 186 187 188 189 | point in having alternatives for other desktop OSes above. Should someone else take over maintainership, they can translate the above commands for their own desktop PC. ### License | | | 200 201 202 203 204 205 206 207 208 209 210 | point in having alternatives for other desktop OSes above. Should someone else take over maintainership, they can translate the above commands for their own desktop PC. ### License Copyright © 2016-2021 by Warren Young. This document is licensed under the terms of [the SIMH license][sl]. [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md |
︙ | ︙ | |||
28 29 30 31 32 33 34 | system utilities that otherwise would have been written in assembly. A C language compiler first appeared publicly in Version 2 Unix, released later in 1972. Much of PDP-11 Unix remained written in assembly until its developers decided to rewrite the operating system in C, for Version 4 Unix, released in 1973. That decision allowed Unix to be relatively easily ported to a wholly different platform — the Interdata 8/32 — in 1978 by writing a new code generator for the C compiler, then | | | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | system utilities that otherwise would have been written in assembly. A C language compiler first appeared publicly in Version 2 Unix, released later in 1972. Much of PDP-11 Unix remained written in assembly until its developers decided to rewrite the operating system in C, for Version 4 Unix, released in 1973. That decision allowed Unix to be relatively easily ported to a wholly different platform — the Interdata 8/32 — in 1978 by writing a new code generator for the C compiler, then cross-compiling everything. That success in porting Unix led to C’s own success first as a systems programming language, and then later as a general-purpose programming language. Although we are not likely to use CC8 to write a portable operating system for the PDP-8, it is powerful enough to fill C’s original niche in writing system utilities for a preexisting OS written in assembly. |
︙ | ︙ | |||
79 80 81 82 83 84 85 | [sms]: http://so-much-stuff.com/pdp8/C/C.php ## Requirements The CC8 system generally assumes the availability of: | | | 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | [sms]: http://so-much-stuff.com/pdp8/C/C.php ## Requirements The CC8 system generally assumes the availability of: * [At least 16 kWords of core](#memory) at run time for programs compiled with CC8. The [native OS/8 CC8 compiler passes](#ncpass) require 20 kWords to compile programs. CC8 provides no built-in way to use more memory than this, so you will probably have to resort to [inline assembly](#asm) or FORTRAN II library linkage to get access to more than 16 kWords of core. |
︙ | ︙ | |||
326 327 328 329 330 331 332 | ... } 1. **Recursion:** See [`FIB.C`][fib] for an example of this. 1. **Simple arithmetic operators:** `+`, `-`, `*`, `/`, etc. | | | > > > > > | | > > | | | | > | | | | > > | < < | > | 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 | ... } 1. **Recursion:** See [`FIB.C`][fib] for an example of this. 1. **Simple arithmetic operators:** `+`, `-`, `*`, `/`, etc. 1. **Bitwise operators:** `&`, `|`, `~` and `!` 1. **Simple comparison operators:** False expressions evaluate as 0 and true as -1 in two’s complement form, meaning all 1's in binary form. See the list of limitations below for the operators excluded by our "simple" qualifier. 1. **2-character operators:** `++`, `--`, `==`, `!=`,`>=`, `<=`, `&&`, and `||`. Note that `++` and `--` are postfix only, and that `&&` and `||` are [implemented as `&` and `|`](#2cbo). 1. **Ternary operator:** The `?:` operator works as of May 2020; it may be nested. 1. **Limited library:** See [below](#libc) for a list of library functions provided, including their known limitations relative to Standard C. There are many limitations in this library relative to Standard C or even K&R C, which are documented below. 1. **Limited structuring constructs:** `if`, `while`, `for`, etc. are supported. There is a nesting limit of 10 which is rarely exceeded in most applications. In addition, `switch` statements are now supported via a code re-write in the C pre-processor (cc.sv). See [`FORTH.C`][forth] for an example. [fib]: /doc/trunk/src/os8/examples/fib.c [forth]: /doc/trunk/src/os8/examples/forth.c <a id="nlim" name="limitations"></a> ### Known Limitations of the OS/8 CC8 Compiler The OS/8 version of CC8 supports a subset of the C dialect understood by [the cross-compiler](#cross), and thus of K&R C: 1. <a id="typeless"></a>The language is typeless in that everything is a 12 bit integer, and any variable/array can interpreted as `int`, `char` or pointer. All variables and arrays must be declared as `int`. As with K&R C, the return type may be left off of a function's definition; it is implicitly `int` in all cases. It is not necessary to give argument types when declaring function arguments, but you must declare a return type with the OS/8 CC8 compiler: int myfn(n) { /* do something with n */ } This declares a function taking an `int` called `n` and returning an `int`. Contrast the CC8 cross-compiler, which requires function argument types to be declared but not the return type, per K&R C rules: int myfn(n) int n; { /* do something with n, then _maybe_ return something */ } The type int is mandatory for all functions. The cross-compiler supports `void` as an extension to K&R C. This type is converted to `int` in the pre-processor. Similarly, the type `char` is converted. These type may be used for readability purposes. 2. There must be an `int main()`, and it must be the last function in the single input C file. Since OS/8 has no way to pass command line arguments to a program — at least, not in a way that is compatible with the Unix style command lines expected by C — the `main()` function is never |
︙ | ︙ | |||
420 421 422 423 424 425 426 | (The native compiler emits startup code automatically, and it hard-codes the LIBC call table in the [final compiler pass](#ncpass), implemented in `p8.c`, so it doesn’t need `#include` to make these things work.) * No conditional compilation: `#if`, `#ifdef`, `#else`, etc. | | > | | | | | | | | | 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 | (The native compiler emits startup code automatically, and it hard-codes the LIBC call table in the [final compiler pass](#ncpass), implemented in `p8.c`, so it doesn’t need `#include` to make these things work.) * No conditional compilation: `#if`, `#ifdef`, `#else`, etc. * [Inline assmembly](#asm) via `#asm` / `#endasm`. See [`FIB.C`][fib] for an example 5. Variables are implicitly `static`, even when local. 6. Arrays may only be single indexed. See `PS.C` for an example. 7. The compiler does not yet understand how to assign a variable's initial value as part of its declaration. This: int i = 5; must instead be: int i; i = 5; 8. <a name="2cbo"></a>`&&` and `||` work, but because they are internally converted to `&` and `|`, their precedence has changed, and they do not short-circuit as in a conforming C compiler. You can work around such differences with clever coding. For example, this code for a conforming C compiler: if (i != 0 || j == 5) should be rewritten for CC8 to avoid the precedence changes as: if (!(i == 0) || (j == 5)) because a true result in each subexpression yields -1 per the previous point, which when bitwise OR'd together means you get -1 if either subexpression is true, which means the whole expression evaluates to true if either subexpression is true. If the code you were going to write was instead: |
︙ | ︙ | |||
488 489 490 491 492 493 494 | Regular `while` loops work, as does `break`, so one workaround for a lack of `do/while` is: while (1) { /* do something useful */; if (cond) break; } We have no intention to fix this. | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > | 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 | Regular `while` loops work, as does `break`, so one workaround for a lack of `do/while` is: while (1) { /* do something useful */; if (cond) break; } We have no intention to fix this. 12. As of May 2020, `switch` is implemented via re-write to cascading `if`/`then` statements. There are a number of limitations to this approach that a CC8 user should be aware of. The primary one to keep in mind is that that if you use a memory-mutating expression in the `switch` clause with a conforming C compiler, it is evaluated just once at the start of the block, but in CC8, it is evaluated once for each generated `if` sub-expression that the code visits. That is, you should not say things like this in code meant to be compiled with the CC8 native compiler: switch (*p++) {...} Say instead: int temp = *p++; switch (temp) {....} Also, there **must** be a `default` case, and cases (including the default case) must be terminated with a `break`. CC8 does not allow for cases that fall through to the following case. The following code has at least three syntax errors: switch (x) { case 1: foo(); case 2: bar(); default: qux(); } 13. `sizeof()` is not implemented. <a id="warning"></a> #### GOVERNMENT HEALTH WARNING **You are hereby warned**: The native OS/8 compiler does not contain any error checking whatsoever. If the source files contain an error or you |
︙ | ︙ | |||
656 657 658 659 660 661 662 | The bulk of the Standard C Library is not provided, including some functions you’d think would go along nicely with those we do provide, such as `feof()` or `fseek()`. Keep in mind that the library is currently restricted to [a single 4 kWord field](#memory), and we don’t want to lift that restriction. Since the current implementation nearly fills that space, it is unlikely that we’ll add much more | | > | | | 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 | The bulk of the Standard C Library is not provided, including some functions you’d think would go along nicely with those we do provide, such as `feof()` or `fseek()`. Keep in mind that the library is currently restricted to [a single 4 kWord field](#memory), and we don’t want to lift that restriction. Since the current implementation nearly fills that space, it is unlikely that we’ll add much more functionality beyond the currently provided 33 LIBC functions plus [the 9 additional functions](#addfn). If we ever fix any of the limitations we’ve identified below, consider it “gravy” rather than any kind of obligation fulfilled. Some of these missing functions are less useful in the CC8 world than in more modern C environments. The low-memory nature of this world encourages writing loops over [word strings](#wordstr) in terms of pointer arithmetic and implicit zero testing (e.g. `while (*p++) { /* use p */ }`) rather than make expensive calls to `strlen()`, so that function isn’t provided. |
︙ | ︙ | |||
708 709 710 711 712 713 714 | [cppr]: https://en.cppreference.com/w/c [iot]: /wiki?name=IOT+Device+Assignments [libch]: /doc/trunk/src/cc8/include/libc.h [libcsrc]: /doc/trunk/src/cc8/os8/libc.c | | | | | > > > > > > > > > < < | 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 | [cppr]: https://en.cppreference.com/w/c [iot]: /wiki?name=IOT+Device+Assignments [libch]: /doc/trunk/src/cc8/include/libc.h [libcsrc]: /doc/trunk/src/cc8/os8/libc.c ### <a id="atoi"></a>`int atoi(s, *result)` Takes a null-terminated ASCII character string pointer `s` and tries to interpret it as a 12-bit PDP-8 two’s complement signed integer, storing the value in `*result` and returning the number of bytes in `s` consumed. **Standard Violations:** * Instead of returning the converted integer, this function stores that value in `*result`. * Whereas `atoi()` in Standard C returns the converted value, in this function, `s[retval]` is the first invalid — non-sign, non-digit, non-space — character in the string, where `retval` is the return value. * Skips leading ASCII 32 (space) characters only, not those matched by [`isspace()`](#isspace), as the Standard requires. ### <a id="cupper"></a>`cupper(p)` Implements this loop more efficiently: char* tmp = p; while (*tmp) { |
︙ | ︙ | |||
896 897 898 899 900 901 902 | * There appears to be a bug in the current implementation that requires you to open the input file before opening an output file when you need both. It may not be possible to fix this within the current limitations on the library, but if you come up with something, [we accept patches][hakp]. | | | 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 | * There appears to be a bug in the current implementation that requires you to open the input file before opening an output file when you need both. It may not be possible to fix this within the current limitations on the library, but if you come up with something, [we accept patches][hakp]. [hakp]: /doc/trunk/CONTRIBUTING.md#patches ### <a id="fprintf"></a>`fprintf(fmt, args...)` Writes its arguments (`args`...) to the currently-opened output file according to format string `fmt`. |
︙ | ︙ | |||
1234 1235 1236 1237 1238 1239 1240 | of characters written so far, not a negative value as the Standard requires. In the case of `sprintf()`, this means the trailing NUL character will not be written! * There is no `snprintf()`, `vprintf()`, etc. | | < | < | < | | < | 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 | of characters written so far, not a negative value as the Standard requires. In the case of `sprintf()`, this means the trailing NUL character will not be written! * There is no `snprintf()`, `vprintf()`, etc. ### <a id="scanf" name="fscanf"></a>`fscanf`, `scanf`, `sscanf` Parse strings according to a `printf`-like format specification. `scanf` gets the string from the interactive terminal, `fscanf` gets it from a file opened with [`fopen()`](#fopen), and `sscanf` gets it from a NUL-terminated C string already in core. **DOCUMENTATION INCOMPLETE** ### <a id="strcat"></a>`strcat(dst, src)` Concatenates one [0-terminated word string](#wordstr) to the end of |
︙ | ︙ | |||
1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 | ### <a id="xinit"></a>`xinit()` Prints the CC8 compiler’s banner message. This is in LIBC only because it’s called from several places within CC8 itself. **Nonstandard.** <a id="examples"></a> ## Trying the Examples The standard PiDP-8/I OS/8 RK05 boot disk contains several example C programs that the OS/8 version of CC8 is able to compile. | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 | ### <a id="xinit"></a>`xinit()` Prints the CC8 compiler’s banner message. This is in LIBC only because it’s called from several places within CC8 itself. **Nonstandard.** ## <a id="addfn"></a>Additional Utility Routines The functions that CC8 uses to manipulate the software stack are also available to be called by end-user programs: `PUSH`, `POP`, `PUTSTK`, `POPRET`, and `PCALL`. The page zero pointers for this stack are initialized by code in `header.sb`, which is injected into your program’s startup sequence during compilation. In addition, there are a set of functions that may be used to provide temporary storage in field 4, acting like a temporary binary file: `void iinit(int address)`: Reset the file pointer to an arbitrary address range 0-4095. `void stri(int value)`: Store ‘value’ at the current address, and increment the address pointer. `int strl()`: Read the word at the current address, and do not increment the address. `int strd()`: Read the word at the current address, and increment the address. As field 4 is not used by OS/8, your program may use the entire field. This library code does not check for overflow: going beyond address 4095 will simply wrap to address 0. <a id="examples"></a> ## Trying the Examples The standard PiDP-8/I OS/8 RK05 boot disk contains several example C programs that the OS/8 version of CC8 is able to compile. |
︙ | ︙ | |||
1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 | This example is particularly interesting. It generates Pascal’s triangle without using factorials, which are a bit out of range for 12 bits! The other examples preinstalled are: * **<code>calc.c</code>** - A simple 4-function calculator program. * **<code>fib.c</code>** - Calculates the first 10 Fibonacci numbers. This implicitly demonstrates CC8's ability to handle recursive function calls. | > > > > > > > > | | | | > | > > > > | > | 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 | This example is particularly interesting. It generates Pascal’s triangle without using factorials, which are a bit out of range for 12 bits! The other examples preinstalled are: * **<code>calc.c</code>** - A simple 4-function calculator program. * **<code>pd.c</code>** - Shows methods for doing double-precision (i.e. 24-bit) integer calculations. * **<code>hlb.c</code>** - Generates [Hilbert curves][hc] on a Tek4010 series display using raw terminal codes. Therefore, you must be running a Tek4010 emulator when running this program, else you will get garbage on the display! * **<code>fib.c</code>** - Calculates the first 10 Fibonacci numbers. This implicitly demonstrates CC8's ability to handle recursive function calls. * **<code>basic.c</code>** - A simple Basic interpreter used to test a simple recursive expression processor. * **<code>forth.c</code>** - A simple Forth interpreter used to test switch statemments etc. The two interpeters are quite complex, particularly the Forth interpreter, which contains 300 lines of code and implements a number of basic Forth functions. This example is intended to show what can be crammed into 4k of core. Another set of examples not preinstalled on the OS/8 disk are `examples/pep001-*.c`, which are described [elsewhere][pce]. [hc]: https://en.wikipedia.org/wiki/Hilbert_curve [pce]: /wiki?name=PEP001.C ## <a id="exes"></a>Making Executables Executing `CCR.BI` loads, links, and runs your C program without producing an executable file on disk. You need only a small variation |
︙ | ︙ | |||
1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 | **Field 1:** The user data field (UDF): globals, literals, and stack **Field 2:** The program's executable code **Field 3:** The LIBC library code ### <a id="os8res"></a>OS/8 Reservations The uppermost page of fields 0 thru 2 hold the [resident portion of OS/8][os8res] and therefore must not be touched by a program built with CC8 while running under OS/8. For example, the [OS/8 keyboard monitor][os8kbd] re-entry point is at 07600₈, [the output | > | 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 | **Field 1:** The user data field (UDF): globals, literals, and stack **Field 2:** The program's executable code **Field 3:** The LIBC library code **Field 4:** (Optional) see the binary utilities above (stri...). ### <a id="os8res"></a>OS/8 Reservations The uppermost page of fields 0 thru 2 hold the [resident portion of OS/8][os8res] and therefore must not be touched by a program built with CC8 while running under OS/8. For example, the [OS/8 keyboard monitor][os8kbd] re-entry point is at 07600₈, [the output |
︙ | ︙ | |||
1580 1581 1582 1583 1584 1585 1586 | [sbrk]: https://pubs.opengroup.org/onlinepubs/7908799/xsh/brk.html [v6ux]: https://en.wikipedia.org/wiki/Version_6_Unix [v7ux]: https://en.wikipedia.org/wiki/Version_7_Unix ### <a id="vonn"></a>There Are No Storage Type Distinctions | < | > > < | | | | | < < | 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 | [sbrk]: https://pubs.opengroup.org/onlinepubs/7908799/xsh/brk.html [v6ux]: https://en.wikipedia.org/wiki/Version_6_Unix [v7ux]: https://en.wikipedia.org/wiki/Version_7_Unix ### <a id="vonn"></a>There Are No Storage Type Distinctions Literals are placed in the same field as globals and the call stack, rather that inline within the generated executable code. This may cause surprise size limitations of the user programs. CC8 does it this way because the FORTRAN II / SABR system does allow any initialisation of COMMON storage in field 1, so the literals have to be stored in the user program page and then be copied into field 1 at program initialization time. Various pointers to these regions are mainatined by the compiler. ### <a id="sover"></a>Stack Overflow Since CC8 places the call stack immediately after the last literal stored in core, a program with many globals and/or literals will have less usable stack space than a program with fewer of each. Neither version of CC8 generates code to detect stack overflow. If you try to push too much onto the stack, it will simply begin overwriting the page OS/8 is using at the top of field 1. If you manage to blow the stack by more than a page without crashing the program or the computer first, the [stack pointer will wrap around](#ptrwrap) and the stack will begin overwriting the first page of field 1. ### <a id="flayout"></a>Field Layout, Concrete Example The field layout given [at the start of this section](#memory) is not fixed. The linking loader is free to use any layout it likes, consistent with any constraints in the input binaries. You can use the `/M` option with `LOADER.SV` to get a core memory map for a given output. Let’s work |
︙ | ︙ | |||
1921 1922 1923 1924 1925 1926 1927 | |`DCAI` |3400 |same as `DCA I` in PAL8| |`JMSI` |4400 |same as `JMS I` in PAL8| |`JMPI` |5400 |same as `JMP I` in PAL8| |`MQL` |7421 |load MQ from AC, clear AC| |`ACL` |7701 |load AC from MQ (use `CLA SWP` to give inverse of `MQL`)| |`MQA` |7501 |OR MQ with AC, result in MQ| |`SWP` |7521 |swap AC and MQ| | | | 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 | |`DCAI` |3400 |same as `DCA I` in PAL8| |`JMSI` |4400 |same as `JMS I` in PAL8| |`JMPI` |5400 |same as `JMP I` in PAL8| |`MQL` |7421 |load MQ from AC, clear AC| |`ACL` |7701 |load AC from MQ (use `CLA SWP` to give inverse of `MQL`)| |`MQA` |7501 |OR MQ with AC, result in MQ| |`SWP` |7521 |swap AC and MQ| |`DILX` |6053 |set VC8E X coordinate (used by [`dispxy()`](#dispxy))| |`DILY` |6054 |set VC8E Y coordinate| |`DIXY` |6054 |pulse VC8E at (X,Y) set by `DIXY`,`DILY`| |`CDF0` |6201 |change DF to field 0| |`CDF1` |6211 |change DF to field 1| |`CAF0` |6203 |change both IF and DF to field 0| |`RIF` |6224 |read instruction field: OR IF with bits 6-8 of AC| |`BSW` |7002 |exchange the high and low 6 bits of AC| |
︙ | ︙ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 | # class os8script: A high-level interface to OS/8 under SIMH ## Introduction This class is a higher level abstraction above the class simh. An understanding of that class as documented in [doc/class-simh.md][class-simh-doc] is a helpful to working with this class. Development of this class was driven by the desire to create a scripting language to engage in complex dialogs programs running under OS/8. The first use cases were embodied in the [`os8-run`][os8-run-doc] scripting system: * Use `BUILD` to perform elaborate system configuration in a repeatable way. * Drive commands calling the OS/8 Command decoder to operate on specified files under OS/8. * Apply patches, first using `ODT` and then using `FUTIL`. * Assemble programs using `PAL8`. * Reconfigure the SIMH devices, for example switching between having TC08 or TD8E DECtape devices. (Only one is allowed at a time, and the OS/8 system areas are incompatible.) The latest use case, embodied in the [`os8-progtest`][progtest-doc] utility, is to allow creation of arbitrary state machines that engage in complex program dialogs so as to permit programmed, run-time testing of functionality under OS/8. This document describes the class os8script API with an eye to assisting the development of stand-alone programs that use it. A complete demo program implementing a complex dialog is provided. ## Housekeeping Before we describe methods to create the environment and run commands, it is important to learn the rules of housekeeping in the `class os8script` environment: ### Important caveat about parallelism: The pidp8i software package does a lot of complex building both under POSIX and in a scripted way under OS/8. The `tools/mmake` POSIX command runs multiple independent instances of `make` in parallel. OS/8 comes from a single threaded, single computer design paradigm. The boot device assumes **NOTHING** else is touching its contents. This means if there is more than one instance of SIMH booting OS/8 from the same image file (for example in two terminal windows on the same POSIX host) the result is **completely unpredictable**. This was the primary driver for the creation of the `scratch` option to the `mount` command and the development of the `copy` command. Care **must** be exercised to do run in a `scratch` boot environment, so as to manage dependencies and concurrencies. ### Gracefully unmount virtual files POSIX buffers output. If you `mount` an image file, modify it, and quit the program, the buffered modifications may be lost. In order to guarantee all buffers are properly flushed, you **must** call `umount` on image files you've modified. ### Quit SIMH. This is not a requirement, but is good practice. ### <a id="cleanups"></a>Remove scratch images. The management of scratch images is rudimentary. The `mount` command creates them, and appends them to a global list `scratch_list`. This list must be used before exiting your program to sweep through and delete the scratch imagtes. At this time the API keeps no other association with mounts, and makes no other inferences about when the scratch file might or might not be needed. Note that the [`exit_command`](#exit_command) will do all this cleanup for you. So be sure to call it on every normal or abnormal exit from your program. With the housekeeping rules covered, we are ready to learn how to set up the environment. ## Setup: The following will include the libraries you need: import os import sys sys.path.insert (0, os.path.dirname (__file__) + '/../lib') sys.path.insert (0, os.getcwd () + '/lib') from pidp8i import * from simh import * from os8script import * The setup steps: 1. Using the argparse library is recommended to create an args structure containing the parsed command line arguments. 2. Create the simh object that will do the work. 3. Create the os8script object that calls to the simh object. The creation method, `os8script` takes up to 5 arguments: * `simh`: The `simh`: object that will host SIMH. See [class-simh.md][simh-class-doc]. * `enabled_options`: List of initial options enabled for interpreting script commands. * `disabled_options`: List of initial options disabled for interpreting script commands. * `verbose`: Optional argument enabling verbose output. Default value of `False`. * `debug`: Optional argument enabling debug output. Default value of `True`. The two options lists were put into the creation call initially because for the first use of the API, it was easy to pass the arrays returned by `argparse`. Conceptually, an initial set of options is passed in at create time, and thereafter the add/remove calls are used to change the active options one at a time. 4. Find the system image you want to boot to do the work. In the example below we default to using the `os8mo` element from the `dirs` library. That is the default media output directory where the build process installs the bootable images. The bootable image defaults to the `v3d.rk05` image or can be specified by a `--target` option. 5. Mount and boot the image. Using `scratch` is **highly** recommended. ## Doing the Work: There are two script-based calls if you have a file on the POSIX host, or can assemble a string into a file handle, and express your work as an `os8-run` style script: `run_script_file` was the first use case. A filename is passed in, and the library is responsible for opening the file and acting on its contents. There are helper routines for enabling the script to find the image file to boot. `run_script_handle` is called by `run_script_file` once the filename has been successfully opened. This method allows creation of in-memory file handles using the `io` library. For example: import io _test_script = """ enable transcript os8 DIR """ script_file = io.StringIO(_test_script) os8.run_script_handle(script_file) Otherwise you do direct calls into the API ### Environment check and command startup The single most important idea to learn in producing a reliable program using class os8script is the notion of **The Current Context and State of the os8script Environment**. The `os8script` class is careful to validate that OS/8 is booted and active before submitting strings that it expects will be interpreted by the OS/8 Keyboard Monitor. It is careful to escape out to SIMH when sending strings it expects will be interpreted as SIMH commands. The instantiated `os8script` can be thought of as a set of layered state machines: * SIMH starts off at its command level, * then OS/8 is booted. * When a program is started under OS/8 it creates a new layered state machine, the dialog with the program, * until the program finishes and returns to the OS/8 keyboard monitor. To issue more SIMH commands after that you have to escape out of OS/8, but then return to OS/8 and continue running the program When you run a complex command with `os8script` class, you will be writing a state machine that will need to return to OS/8 when it is finished. The `os8script` class provides `check_and_run` as a high level startup method that confirms all is well to run your desired OS/8 command from the Keyboard Monitor. It will: * make sure we're booted, * make sure we're in the OS/8 context, * run the command, * return the reply status of the initial command or -1 if any of the previous steps fail. It acts like a bridge between the higher level paradigm of script running and the lower level paradigm of sending OS/8 command lines. Conceptually, the boot check is a once-only check at the start up of a more complex dialog. `check-and-run` takes three mandatory arguments: * `os8_comm`: The OS/8 command line to run. * `caller`: A name assigned by the calling program to help make it clear which higher level program is calling this common start-up routine. * `script_file`: For API compatibility with the other commands. More fully explained below. Often this argument is simply the empty string. It takes one optional argument, an array of match regular expressions, as managed by the [`intern_replies`](#intern_replies) method of class simh. If this argument is not provided, the default replies array for OS/8 is used. For example: os8.check_and_run ("myprog_main", "DIR", "") Using this method is not required, but is an easy way to start up an OS/8 command. After startup you use the interface methods to Python expect in the `simh` class to engage in the command dialog: Send a string and look for results: * `os8_cmd` Send a string and leave it to another call to look for results: * `os8_send_str` * `os8_send_ctrl` Look for results: * `_child_expect` ### Using expect The Python `pexpect` library for expect allows passing in an array of responses, and returns the array index of what was matched. The class `simh` library contains a table of all the normal and error replies that the OS/8 Keyboard Monitor and Command Decoder are known to emit in `_os8_replies` and pre-compiled regular expressions for each one in `_os8_replies_rex`. <a id="intern_replies"></a>Class `os8script` has a method `intern_replies` that allows management of additional tables by name, allowing, for example the `build_command` state machine to create a table with replies from the `BUILD` command **in addition to** all the OS/8 replies. `intern_replies` takes 3 arguments: * `name`: The name of the new reply table. If a table of that name already exists return `False`. * `replies`: An array of 3 element arrays with the replies. Described below. * `with_os8`: A boolean flag. True if the array of replies is in addition to the OS/8 replies. False if the array of replies is instead of OS/8 replies. This allows fine control of the dialog. Sometimes you want to test for just the program output. Sometimes you want to also detect OS/8 responses. #### The `replies` array The three elemments for each member of the replies array are: 1. The common name of the match string. This is used by match test routines. 2. The regular expression python expect will use to try and match the string. 3. True if receiving this is a fatal error that returns to the OS/8 Keyboard Monitor. Knowing this state change is helpful in establishing correct expectation about the state of the enviromnent. Each regular expression is compiled, and interned in the `os8script` object in the `replies_rex` dictionary, keyed to the `name` of the `replies` array. The `replies_rex` dictionary is used to make sense of commands executed by calling either the [`check_and_run`](#check_and_run) method or the os8_cmd method in the simh chass. The array itself is interned in the `os8script` object in the `replies` dictionary keyed to the `name` of the `replies` array. The common name is used in match tests: The `simh` object instantiated within the `os8script` object has a `test_result` method that takes four arguments: * `reply`: integer index into the array of replies. * `name`: the common name of the result we are expecting to match. * `replies`: the array of replies that we are testing against. * `caller`: is used to reduce error reporting common code as describe below. If the common name supplied to `test_result` is found at the `replies` array at index `reply`, `True` is returned. Otherwise `False` is returned. If `caller` is not empty, and the match is False, an error is printed prefaced by the caller string. However the most common use case is to leave the `caller` string empty, and perform several `test_result` actions in succession as shown in the example program. After the command is executed, driven by the `replies_rex` array, the results can be tested with the `replies` array. For example if we wanted to test a start up of `MYPROG` into the command decoder we could do this: reply = os8.check_and_run ("myprog_main", "R MYPROG", "") os8.simh.os8_test_result (reply, "Command Decoder Prompt", "start_myprog") (Notice we left the script file blank, and defaulted to the OS/8 replies arrays.) If we didn't get the Command Decoder prompt, because MYPROG wasn't found we'd get something like this: start_myprog: failure Expected "Command Decoder Prompt". Instead got "File not found". ## A Complete Example The [documentation for the simh class][class-simh-doc] makes reference to programs in the source tree as examples. However those were written primarily to get a job done, rather than as a tutorial. The file [`examples/host/class-os8script-demo.py`][demo-script] was written specifically as a tutorial. The demo program shows how to create a state machine that engages in a complex dialog under OS/8: * It starts up OS/8 BASIC. * When OS/8 BASIC asks "OLD OR NEW" the program says "NEW". * When prompted, it supplies the filename, "MYPROG.BA". * A two-line `1 + 2 = 3` program is input. * The program is run, and the answer is validated. Each step of the housekeeping, setup, and work is described and performed. Here is a non-verbose sample run: wdc-home-3:trunk wdc$ examples/host/class-os8script-demo.py Got Expected Result! Here is a verbose sample run: wdc-home-3:trunk wdc$ examples/host/class-os8script-demo.py -v Line 0: mount: att rk0 /Users/wdc/src/pidp8i/trunk/bin/v3d-temp-_2mqkf24.rk05 att rk0 /Users/wdc/src/pidp8i/trunk/bin/v3d-temp-_2mqkf24.rk05 att rk0 /Users/wdc/src/pidp8i/trunk/bin/v3d-temp-_2mqkf24.rk05 sim> show rk0 att rk0 /Users/wdc/src/pidp8i/trunk/bin/v3d-temp-_2mqkf24.rk05 sim> show rk0 RK0 1662KW, attached to /Users/wdc/src/pidp8i/trunk/bin/v3d-temp-_2mqkf24.rk05, write enabled Line 0: boot rk0 boot rk0 sim> boot rk0 boot rk0 PIDP-8/I TRUNK:ID[0A1D0ED404] - OS/8 V3D - KBM V3Q - CCL V1F CONFIGURED BY WDC@WDC-HOME-3.LAN ON 2020.12.08 AT 00:01:16 EST RESTART ADDRESS = 07600 TYPE: .DIR - TO GET A LIST OF FILES ON DSK: .DIR SYS: - TO GET A LIST OF FILES ON SYS: .R PROGNAME - TO RUN A SYSTEM PROGRAM .HELP FILENAME - TO TYPE A HELP FILE .Line: 0: demo_command: R BASIC R BASIC NEW OR OLD--Got reply: NEW OR OLD NEW FILE NAME--Got reply: FILENAME MYPROG.BA READY Got reply: READY 10 PRINT 1 + 2 20 END RUN MYPROG BA 5A 3 READY Got reply: 3 READY Got Expected Result! Sending ^C .Deleting scratch_copy: /Users/wdc/src/pidp8i/trunk/bin/v3d-temp-_2mqkf24.rk05 Simulation stopped, PC: 01210 (JMP 1207) sim> detach all detach all sim> quit Calling sys.exit (0) at line: 0. ## API reference This is an alphabetical reference of the public methods of the `os8script` class. There are setup, housekeeping and helper methods. The methods that implement the [os8-run][os8-run-doc] commands can be called directly. Those method names all end with `_command`. They all take two arguments: * `line`: The rest of the line in the script file after the command was parsed. This makes the script file look like a series of command lines. The parser sees the command keyword and passes the rest of the line as `line`. * `script_file`: A handle on the script file. This gets passed around from command to command to deal with multi-line files. We rely on this handle keeping track of where we are in the file over time. If you call a command that doesn't deal with multiple lines, you can pass `None` as the `script_file` handle. If the command needs more lines, and it sees `None` python will kill the program and give you a backtrace. They all return a string, "success" on successful operation, "fail" on a failed operation, "die" when the error is so bad that the program really should not proceed. ### `basic_line_parse` This helper method takes the same two arguments as all `_command` APIs. It is rarely called from outside of commands, but is critical to the implementation of commands. As each line is parsed, this method: * strips out leading and trailing whitespace. * filters out comments. * parses `begin` statements to enter a new begin/end level. * enforces `enabled` / `disabled` parsing and does the work to skip over disabled blocks. * parses `end` statements to pop a begin/end level. * returns `None` if the line in hand is empty and the caller should just exit without doing anything more. ### `begin_command` Although appearing early alphabetically, it's probably one of the last commands one would use in a program. `begin_command` runs a complex but constrained state machine for the OS/8 `BUILD` command or commands that use the OS/8 Command Decoder. When `begin` is parsed from a line, it opens a new block. That block is either an `enable` / `disable` block for conditional execution or one of two sub-commands, `build_subcomm` and `cdprog_subcomm`. These embody complex state machines to step through command dialogs and detect error conditions. `build_subcomm` is for creating dialogs with the OS/8 `BUILD` command. `cdprog_subcomm` is for starting any OS/8 program that uses the OS/8 Command Decoder. It is a simple dialog: * specify one or more files in Command Decoder Syntax. * repeat if the program runs and gives back the command decoder asterisk `*` prompt. * detect return to OS/8 by getting a OS/8 keyboard monitor dot `.` prompt. * detect and report OS/8 errors encountered. * recognize whether an error is fatal or non-fatal, and act to keep the state machine in a known state, generally by sending `^C` on non-fatal errors. ### `boot_command` Check to see if the device to be booted has something attached. If not, return "die". If so, boot it, and set our booted state to `True`. You need to issue this command before running any OS/8 commands because OS/8 must be booted up to run them. ### `configure_command` An interface to a constrained subset of high level PDP-8 specific device configuration changes under SIMH. `line` is parsed into two arguments: The first arg is the device to configure. The second arg is the setting. The following devices and settings are configurable with this command: * `tape`: `dt` to enable the TC08 DECtape, `td` to enable the TD8E DECtape instead. * `rx`: `rx01` to enable the single density RX01 floppy, `rx02` to ehable the double density RX02 drive instead. * `tti`: `KSR` set upper case only operation, and force all lower chase to upper case before forwarding them to OS/8. `7b` to enable SIMH 7bit mode. All characters are passed to OS/8 without case conversion. ### `copy_command` Allows scripts to say, "Make me a copy of this POSIX file," which is generally an image file that serves as the basis of a modified file. This is how we are able to run scripts in parallel: we create the destination image. If we don't create a destination image via copy and boot it, then the `scratch` option to `mount` is needed, as explained above. ### `cpfrom_command` The way to get files out to the POSIX host from the OS/8 environment. Relies on the OS/8 `PIP` command. Contains a state machine for working through dialogs. Handles coding conversion between POSIX ASCII (7 bit space parity, \n newline delimiter) and OS/8 ASCII (8 bit mark parity, \r newline delimiter.) ### `cpto_command` The way to get files into OS/8 from the POSIX host. Relies on the OS/8 `PIP` command. Contains a state machine for working through dialogs. Also handles coding conversion between OS/8 ASCII and POSIX ASCII. ### `disable_option_command` Parses the `line` argument as the key to enable. The end of the key is delimited by the end of the line or the first whitespace character. If the key is on the `options_enabled` array, remove it, **and** add the key to the `options_disabled` array if it is not already present. Subtle point about `disable` vs. `enable` (as copied from the [`os8-run` Documentation][os8-run-doc]): Two lists are required because default behavior is different for enablement versus disablement. The `begin enabled` block is only executed if the `enabled` list contains the keyword. If no such keyword is found, the block is ignored. The `begin default` block is executed by default unless the `disabled` list contains the keyword. If such a keyword is found, the block is ignored. The `default` construct allows creation of scripts with conditional execution without worrying about informing the build system about new enablement keywords. ### `enable_option_command` Parses the `line` argument as the key to enable. The end of the key is delimited by the end of the line or the first whitespace character. If the key is on the `options_disabled` array, remove it, **and** add the key to the `options_enabled` array if it is not already present. There is a special enable option `transcript`. Within an `enable transcript` block, all OS/8 output is printed on the standard output of your program. ### `end_command` Ends the `begin` / `end` block. ### <a id="exit_command"></a>`exit_command` Make a graceful exit: 1. Remove scratch files. 2. Detach all devices from running image. 3. Quit SIMH. 4. Parse an exit status value from `line`. Default to 0. 5. Call POSIX exit to exit the running program, ### `include_command` Allows running a script within a script to arbitrary depths. `line` is the name of a script file. Uses the [`path_expand`](#path_expand) method to expand variables appearing in the path specification. ### `mount_command` Does complex parsiing of `line` to get all the parameters needed to attach an image file to the appropriate SIMH device. Has additional parameters that are documented in the [os8-run Documentation][os8-run-doc]. ### `ocomp_command` Simple state machine to pass `line` as command arguments to the OS/8 `OCOMP` utility and return `success` if two files are identical. This little machine is used in `os8pkg` in the `verify` command. ### `os8_command` Allows no dialog. Just pass `line` to the OS/8 Keyboard monitor to run. Manage the environment state to make sure we eventually get back to the keyboard monitor: * detect return to OS/8 by getting a OS/8 keyboard monitor dot `.` prompt. * detect and report OS/8 errors encountered. * recognize whether an error is fatal or non-fatal, and act to keep the state machine in a known state, generally by sending `^C` on non-fatal errors. ### `pal8_command` Runs the OS/8 PAL8 assembler. Contains a state machine to gather up error output nicely. ### `patch_command` The `patch` command contains a pretty complex state machine. It knows how interprest patch description files as commands in either `ODT` or `FUTIL` to modify files under OS/8 and then save them. ### <a id="path_expand"></a>`path_expand` Helper method -- a simple minded variable substitution in a path. A path beginning with a dollar sign parses the characters between the dollar sign and the first slash seen becomes a name to expand with a couple local names: $home and the anchor directories defined in lib/pidp8i/dirs.py. Returns None if the expansion fails. That signals the caller to fail. Takes one argument, a string, `path` that is parsed. `path_expand` knows the build-time and run-time destination directories and expands the following constructs using the `dirs` library (as copied from the [`os8-run` Documentation][os8-run-doc]): | $build/ | The absolute path to the root of the build. | $src/ | The absolute path to the root of the source. | $bin/ | The directory where executables and runable image files are installed at build time | $media/ | The absolute path to OS/8 media files | $os8mi/ | The absolute path to OS/8 media files used as input at build time | $os8mo/ | The absolute path to OS/8 media files produced as output at build time ### `print_expand` Helper method -- close kin to path_expand. Takes a string that may name a path substitution or the magic $version value and performs the appropriate value substitution. Takes one argument, a string, `path` that is parsed. ### `print_command` Lets scripts send messages. Needed from inside `os8-run` scripts. Your program can just use the python `print` command. ### `restart_command` Call os8_restart in simh to resume OS/8. Returns "die" if we've not booted. ### `resume_command` Call os8_resume in simh to resume OS/8. Returns "die" if we've not booted. ### `simh_command` Lets you send arbitrary commands to simh. Recognizes the boot and continue commands as setting OS/8 context. Knows how to suspend OS/8 and escape to SIMH so you don't have to worry about managing that housekeeping. ### `umount_command` Cleans out a mount command, except for scratch files. Remember you have to remove scratch files. Call the [`exit_command`](#exit_command) method to do so. [class-simh-doc]: https://tangentsoft.com/pidp8i/doc/trunk/doc/class-simh.md [os8-run-doc]: https://tangentsoft.com/pidp8i/doc/trunk/doc/os8-run.md [progtest-doc]: https://tangentsoft.com/pidp8i/doc/trunk/doc/os8-progtest.md [demo-script]: https://tangentsoft.com/pidp8i/doc/trunk/examples/host/class-os8script-demo.py ## <a id="license" name="credits"></a>Credits and License Written by and copyright © 2017-2020 by Warren Young and William Cattey. Licensed under the terms of [the SIMH license][sl]. [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md |
︙ | ︙ | |||
10 11 12 13 14 15 16 17 18 19 20 21 22 23 | When someone on the mailing list asked for a way to automatically drive a demo script he'd found online, it was natural to generalize the core functionality of `mkos8` as a reusable Python class, then write a script to make use of it. The result is `class simh`, currently used by six different scripts in the PiDP-8/I software distribution including `os8-run` and the `teco-pi-demo` demo script. This document describes how `teco-pi-demo` works, and through it, how `class simh` works, with an eye toward teaching you how to reuse this functionality for your own ends. [ori]: https://tangentsoft.com/pidp8i/doc/trunk/doc/os8-run.md [py]: https://www.python.org/ | > > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | When someone on the mailing list asked for a way to automatically drive a demo script he'd found online, it was natural to generalize the core functionality of `mkos8` as a reusable Python class, then write a script to make use of it. The result is `class simh`, currently used by six different scripts in the PiDP-8/I software distribution including `os8-run` and the `teco-pi-demo` demo script. The basis for this work is `pexpect` the Python Expect library. This document describes how `teco-pi-demo` works, and through it, how `class simh` works, with an eye toward teaching you how to reuse this functionality for your own ends. [ori]: https://tangentsoft.com/pidp8i/doc/trunk/doc/os8-run.md [py]: https://www.python.org/ |
︙ | ︙ | |||
82 83 84 85 86 87 88 | ## Logging The next step is to tell the `s` object where to send its logging output: | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | | < < < | | | < < < < | < < < < < | | < > | | > > > | | | | < < | < | | < < < < < < | < < | < > | > > > > > > > > | | > | > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | > | > > | > > > | > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < < < < < < > > > < > | < | < < | < > > | | | | | > > > > | > | > > > > | > > | > > > > > > > > | | > > | > > > > > | | > > > > | > > > > > > > > > > > > > > > > > > > > > > > > | < < | > > > > > > | > > > > | | > | | | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 | ## Logging The next step is to tell the `s` object where to send its logging output: s.set_logfile (os.fdopen (sys.stdout.fileno (), 'wb', 0)) Contrast the corresponding line in `os8-run` which chooses whether to send logging output to the console or to a log file: s.set_logfile (open (dirs.log + 'os8-run' + '.log', 'ab') \ if not VERY_VERBOSE else os.fdopen (sys.stdout.fileno (), 'wb', 0)) Note that this more complicated scheme appends to the log file instead of overwriting it because there are cases where `os8-run` gets run more than once with different script inputs, so we want to preserve the prior script outputs, not keep only the latest. ## Driving SIMH and OS/8 The basic control flow is: 1. Send to SIMH text to act upon. 2. Harvest results. 3. Check results. 4. Goto 1 or quit. ## Checking results There are a number of helper methods and data structures to help in checking results. Although `pexpect` can search replies for a regular expression string, or a list of such strings, the helper methods use an array of compiled regular expressions. The simh class contains two arrays, `_simh_replies` and `_os8_replies` with corresponding arrays of compiled regular expressions, `_simh_replies_rex`, and `_os8_replies_rex`. You can use the simh Class replies or define some for yourself. Example: ``` my_replies = [ ["Sample Reply", "Sample Reply\s+.*\n$", "False"], ["Fatal Error", "Fatal error was\s+.*\n$", "True"] ] my_replies_rex = [] for item in my_replies: my_replies_rex.append(re.compile(item[1].encode())) ``` Often you want your replies in addition to the errors you might want from OS/8. In that case you'd do something like: ``` my_replies.extend(s._os8_replies) ``` Of course the extend would appear before the computation of `my_replies_rex`. ## Running SIMH or OS/8 commands High level calls to run commands in SIMH can be made from `simh_cmd` for SIMH commands and `os8_cmd` for OS/8 commands. These two methods default to searching results for replies in the relevant arrays. They return an index into the array that says which reply was received. The `test_result` method takes a reply number, an expected reply name, an array replies and a string for helping identify the caller of the test. (There's also an optional debug flag. These scripts can be difficult to debug.) To see if the reply from running a command that would reply with `my_replies` the code would be: ``` s.test_result(reply, "Fatal Error", my_replies, "myfunc") ``` The reply item at the index given by `reply` is examined. And the desired reply is matched against the first element of that item. If it matches, `True` is returned, otherwise `False` is returned. If the caller string is present, (in this case, `"myfunc"`, a message is printed if the reply doesn't match the expected reply. If the caller string is the empty string, no message is printed. This makes it easy to add error diagnostics without a lot of extra work. Sometimes you want to try a couple different expected values, and don't want to print anything if there isn't a match. That's why we special case an empty caller string. For SIMH and OS/8 command testing, there are convenience wrappers, `simh_test_result` and `os8_test_result` that use the relevant array so you don't have to keep typing it. So the following two are equivalent: ``` s.test_result(reply, "Prompt", s._simh_replies, "myfunc", debug=True) s.simh_test_result(reply, "Prompt", "myfunc", debug=True) ``` Armed with an understanding of how we make calls into SIMH and OS/8, and how we test results, we're ready to continue our exploration. ## Finding and Booting the OS/8 Media If your program will use our OS/8 boot disk, you can find it programmatically by using the `dirs.os8mo` constant, which means "OS/8 media output directory", where "output" refers to the worldview of `os8-run`. Contrast `dirs.os8mi`, which points to the directory holding the input media for `os8-run`. This snippet shows how to use it: rk = os.path.join (dirs.os8mo, 'v3d.rk05') if not os.path.isfile (rk): print "Could not find " + rk + "; OS/8 media not yet built?" exit (1) Now we attach the RK05 disk image to the PiDP-8/I simulator found by the `simh` object and boot from it: print "Booting " + rk + "..." s.simh_cmd ("att rk0 " + rk) s.simh_test_result (reply, "Prompt", "main 1") reply = s.simh_cmd ("boot rk0", s._os8_replies_rex) s.os8_test_result (reply, "Monitor Prompt", "main 2") A couple subtle points: We issued a command to SIMH to attach the rk0 device. If we didn't get the SIMH prompt back, `simh_test_result` would have said, main 1: Expecting Prompt. Instead got: Fatal Error Then we issued the SIMH command to boot that device. We used the `os8_test_result` method instead of the `simh_test_result` method because we expected the panoply of replies would more likely be from the OS/8 list. After the simulator starts up, and we've confirmed we've got our OS/8 monitor prompt as a result, we send the first OS/8 command to start our demo. s.os8_cmd ("R TECO") s.os8_test_result (reply, "Command Decoder Prompt", "main 2") The bulk of `teco-pi-demo` consists of more calls to `simh.os8_cmd` and `simh.cmd`. Read the script if you want more examples. **IMPORTANT:** When you specify the [regular expression][re] strings for result matching, and want literal matches for characters that are special to regular expressions such as dot `.`, asterisk `*`, etc., you need to be preface the characterpair of backslashes. Example: To match a literal dollar sign you would say `\\$`. [re]: https://en.wikipedia.org/wiki/Regular_expression ## Contexts The operation of OS/8 under SIMH requires awareness of who is getting the commands: SIMH, the OS/8 Keyboard Monitor, the OS/8 Command Decoder, or some read/eval/print loop in a program being run. Your use of the simh class needs to be mindful of this. Throughout this document every attempt has been made to be clear on which methods keep track of context switches for you and which do not. ### Context Within a program under OS/8 If you've forgotten to exit a sub-program, that program will still be getting your subsequent commands instead of OS/8. You may have a program that keeps running and asking for more input, for example OS/8 `PIP` returns to the command decoder after each action. There is a subtle issue with program interrupts: You **need** to check for the string that gets echoed when you do an interrupt. Otherwise pexpect can get confused. Two methods that abstract this for you are provided: `os8_ctrl_c` and `os8_escape` which send those interrupt characters, ask pexpect to listen for their echo back (`$` comes back from escape), and confirms a return to the OS/8 monitor. Here is the implementation of `os8_ctrl_c` as an example if you need to run a sub-program with a different interrupt character: ``` #### os8_ctrl_c ################################################## # Return to OS/8 monitor using the ^C given escape character. # We need to listen for the ^C echo or else cfm_monitor gets confused. # Confirm we got our monitor prompt. # Optional caller argument enables a message if escape failed. # Note: OS/8 will respond to this escape IMMEDIATELY, # even if it has pending output. # You will need to make sure all pending output is in # a known state and the running program is quiescent # before calling this method. Otherwise pexpect may get lost. def os8_ctrl_c (self, caller = "", debug=False): self.os8_send_ctrl ("c") self._child.expect("\\^C") return self.os8_cfm_monitor (caller) ``` ### Sending Control Characters Several OS/8 programs expect an <kbd>Escape</kbd> (a.k.a. `ALTMODE`) keystroke to do things. Examples are `TECO` and `FRTS`. (Yes, <kbd>Escape</kbd> is <kbd>Ctrl-\[</kbd>. Now you can be the life of the party with that bit of trivia up your sleeve. Or maybe you go to better parties than I do.) The `os8_send_ctrl` method enables you to send arbitrary control characters but it does not keep track of whether you're in the OS/8 or SIMH context. Note also that the `e` control character escapes to SIMH. So avoid writing programs that need that control character as input. ### Context Between SIMH and OS/8 It is important to make sure that commands intended for SIMH go there, and not to OS/8 or any programs running under SIMH. The `os8_cmd` amd `simh_cmd` methods keep track of context. If you call the `simh_cmd` method but aren't actually escaped out to SIMH, an escape will be made for you, and the context change will be recorded. If you issue `os8_cmd` when OS/8 is not running, it will complain and refuse to send the command. The cleanest way to explicitly escape from OS/8 to SIMH is to call `esc_to_simh`. It manages the context switch, and tests to see that you got the SIMH prompt. Example: esc_to_simh() Subtle points: Calling `simh_cmd` will leave you in SIMH. You will need to resume OS/8 explicitly. There are a variety of ways to do this. ## Getting Back to OS/8 from SIMH There are several ways to get back to the simulated OS/8 environment from SIMH context, each with different tradeoffs. *FIXME* We used to have a lot of trouble with continue commands. We think they're all fixed now, so we can fully flesh out this section. ### Rebooting You saw the first one above: send a `boot rk0` command to SIMH. This restarts OS/8 entirely. This is good if you need a clean environment. If you need to save state between one run of OS/8 and the next, save it to the RK05 disk pack or other SIMH media, then re-load it when OS/8 reboots. It's important to check that you got your OS/8 prompt so the recommended code looks like this: ``` reply = s.simh_cmd ("boot rk0", my_replies_rex) s.os8_test_result (reply, "Monitor Prompt", "myprog") ``` ### Continuing The way `teco-pi-demo` does it is to send a `cont` command to SIMH: ``` s.send_line ('cont') ``` A previous version of the simh class would sometime hang the simulator unless a small delay were inserted before escaping to the SIMH context. We believe this is no longer necessary. However the problems with `cont` made implementors gun shy using it. Most code you will see does a restart with an explicit confirmation we are at the OS/8 command level. ### Re-starting OS/8 If your use of OS/8 is such that all required state is saved to disk before re-entering OS/8, you can call the `simh_restart_os8` method to avoid the need for a delay *or* a reboot. It sends the simh command `go 7600` which is the traditional "restart at the OS/8 entrypoint" commonly used from the PDP-8 front panel. It then uses `os8_test_result` to confirm that it got a monitor prompt. `simh_restart_os8` has an optional `caller` argument to make it quick and easy to print an error if returning to the monitor failed. s.simh_restart_os8 (caller = "myprog") `os8-run` uses this option extensively. ## Sending without testing results. At some point you always need to test your results and make sure you are where you think you are. Otherwise some corner case will trip up your use of the simh class, and the error message you will get is a 60 second pause, and a big backtrace. But often you need to send and receive data in a much less structured way than that used by `os8_cmd` and `simh_cmd`. Here is what you need: | Method | Description | |---------------- |---------------------------------------------------------------- | `send_line` | Send the given line blind without before or after checks. | `simh_send_line` | Like `send_line` above, but mindful of context. Will escape to SIMH if necessary.| | `os8_kbd_delay` | Wait an amount of time proportional to what OS/8 should be able to handle on the hosting platform without overflowing the input buffer and dying. | | `os8_send_ctrl` | Send a control character to OS/8. Use `os8_kbd_delay` to prevent overflowin the input buffer and killing OS/8.| | `os8_send_str` | Send a string of characters to OS/8, and wait for os8_kbd_delay afterwards. | | `os8_send_line` | Add a carriage return to the given string and call `os8_send_str` to send it to OS/8.| ## Other Operations ### Quitting the simulator It is recommended that you use the `quit` method to exit the simulator. It will make sure it selects the simh context before trying to quit. Indeed it's further recommended that you send a command to simh to detach all devices to make sure any buffered output is flushed. You need to test for the SIMH prompt to make sure you've succeeded. ``` s.simh_cmd ("detach all") s.simh_test_result(reply, "Prompt", my_replies_rex, "myprog") s._child.sendline("quit") ``` ### Zero Core SIMH's PDP-8 simulator doesn't start with core zeroed, on purpose, because the actual hardware did not do that. SIMH does not attempt to simulate the persistence of core memory by saving it to disk between runs, but the SIMH developers are right to refuse to do this by default: you cannot trust the prior state of a PDP-8's core memory before initializing it yourself. ### Zero OS/8 Core Sometimes we want to zero out core, but leave OS/8 in tact. The `os8_zero_core` method zeros all of core excepting: * 0. page zero - many apps put temporary data here * 1. the top pages of fields 1 & 2 - OS/8 is resident here * 2. the top page of field 2 - OS/8's TD8E driver (if any) lives here We then restart OS/8, which means we absolutely need to do #1 and may need to do #2. We could probably get away with zeroing page 0. ## But There's More! The above introduced you to most of the functionality of `class simh` used by `teco-pi-demo`. It is a useful exercise to read through [the simh class's source code][ssc]. There are many useful and interesting methods in the simh class that are documented there not here. Although it started off as a simple class amenable to quick study, some heavy duty drivers for configuration of OS/8 devices under SIMH were added. The source file is organized places the lower level methods first and proceeds through progressively higher level ones, first for simh direct interaction and the OS/8 interaction. The `os8-run` script has a whole [higher level library][os8script] built on top of the simh class that includes state machines for executing complex commands like BUILD and applying patches with ODT and FUTIL. Another useful module is [`pidp8i.dirs`][dsc] which contains paths to many directories in the PiDP-8/I system, which you can reuse to avoid having to hard-code their locations. This not only makes your script independent of the installation location, which is configurable at build time via `./configure --prefix=/some/path`, but also allows it to run correctly from the PiDP-8/I software's build directory, which has a somewhat different directory structure from the installation tree. [ssc]: https://tangentsoft.com/pidp8i/file/lib/simh.py.in [dsc]: https://tangentsoft.com/pidp8i/file/lib/pidp8i/dirs.py.in [os8script]: https://tangentsoft.com/pidp8i/file/lib/os8script.py.in ## <a id="license" name="credits"></a>Credits and License Written by and copyright © 2017-2020 by Warren Young and William Cattey. Licensed under the terms of [the SIMH license][sl]. [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 | # DCP Disassembler for PDP-8 This document is based on the file DCP.WU found with DCP binaries. | Author | A.E. Brouwer, Math. Center, Amsterdam | | Date | 73-10-03 | | Version Number | DCP AB-V21 | | Last Update | 74-11-12 | | Environment | OS/8 operating system | | Memory Requirements | 16K, Optional 24K mode | ## DCP (Preliminary Description) DCP (sometimes called `deass`) is a program to deassemble (or disassemble) a PAL program given in binary or in core image format as 1st input file. Information about the program and meaningful tags can be given in a second input file. A well readable listing with meaningful tags but without comment can be obtained in a few passes (typically four). The first time no information is supplied; while reading the output one recognizes certain parts as messages ("NO ROOM FOR OUTPUT") or numeric tables (6030,7634,7766,7777) or simple subroutines (TTYOUT, PUSH, PRINT). Putting these things in an information file and then running dcp again gives you a much nicer output the second time. Now you may embark on the program itself and obtain after a small number of passes (depending on the complexity of the program and your laziness.) A source that might have been the original one except for its lack of comment. At this moment you could profitably use the CTRL/E feature of MCEDIT to provide the whole source of comment. (For example, we obtained a source of a fortran compiler in three days after five passes.) Below we will describe the OS/8 version of the program ## Assembly Instructions (Alas, we do not yet have source.) .R PAL8 *102,DCP_SBIN,DCPZ/L$ .SAVE SYS DCP ## Operating Instructions .R DCP *OUTPUT<INPUT,INFO(OPTIONS) ## Command Line Interpretation 1. If no input and no output specified then delete <kbd>DSK:DCPLS.TM<kbd> If command closed with altmode then exit to OS/8 monitor else call command decoder again. 2. If no output given but an output file is required because chaining to CREF.SV is requested then DSK:DCPLS.TM is used. 3. If no input given then use output filename with extensions .SV and .SM (if present.) E.G. *DEASS< is equivalent to *DEASS<DEASS.V if DEASS.SM does not exist, and to *DEASS<DEASS.SV,DEASS.SM otherwise. In this case a previous version of the output file is deleted first (if necessary). 4. If the output file has no explicit extension then add .DC if a source is produced, and .LS otherwise (One would expect .PA instead of .DC but that proved dangerous.) ## Options Affecting Interpretation of Command Line | /B | Expect .BN rather than .SV format in first inputfile | | | This changes the default extension into .BN if no | | | input is specified. | | /L | Produce .LS rather than .DC output | | /X | Chain to CREF.SV | | | (1st output becomes input and 2nd output becomes output) | | | This option implies the options /L and /T | e.g. .R DCP *DEASS,TTY:</X/B is equivalent to .R PIP *DEASS.LS</D$ .R DCP *DEASS.LS<DEASS.BN,DEASS.SM/L/T/B .R CREF *TTY:<DEASS.LS also DCP * *DEAS.SV,SPECS1,SPECS2,SPECS3/S means .R PIP *DEASS.TM</D$ .R DCP *DCPLS.TM<DEASS.SV,SPECS1,SPECS2,SPECS3/L/T .R CREF *DCPLS.TM ## Options | /A | Do not generate a 'START' label. | | (By default a label 'START' is generated when decoding | | core image file. This is possible since the core control | | contains the starting address.) | /B | Expect .BN instead of .SV input. | /C | The info file after the output | /D | 'JMP .-3', 'JMP I .+1' instructions | | for each reference a tag is generated) | /H | Do not generate literals. | /K | allow modification of literals. | | (Normally an instruction like 1377 will be translated as | | 'TAD (1234' but 2377 as 'ISZ A177' since no decent programmer | | ever writes 'ISZ (1234'. It was found however that several | | DEC programs contain such constructs.) | /L | Produce output in .LS format. | /N | Do not generate table of undefined symbols. | /S | Generate table of all symbols. | /T | Convert tabs into spaces. | /W | Do not interpret 6141 as the PDP12 'LINC' instruction. | /X | Chain to CREF.SV. | /(F) | (Where F designates a digit between 0 and 7.) | | Translate field F of the program (default: /0) | =NNNNMMMM | The = OPTION can be used to specify a part of the program to be decoded. NNN gives begin and MMMM end+1 of the range. (Note that if begin>3777 the command has to be closed with altmode instead of return.) ## Translation Is Done One Field at A Time Therefore, binaries that load into extended memory must be disassembled with /(F) for all memory fields used. This causes some flaws in the output: CIF 10 JMS I (200 is translated as: CIF 10 JMS I (START If LOC 200 in the current field is labeled START. Note that assembling the produced source gives the correct binary.) ## Input Format Each input section starts with $X (where X is a letter indicating the type of the section) and ends with $ . $\<CR\> indicates the end of all input (when not within a secion). Between the sections comment not containing $ may be inserted. ### Section Types | $A | Translate as 6bit ASCII (TEXT "STRING") | $D | Dont translate | $I | Translate as instruction (overriding other specs) | $L | Translate as identifier rather than as instruction | $N | Translate octal | $S | Subroutine with args | $T | Symbol definitions | $Z | Special coding | $ | End of input ### Content of Section 1. Sections $X where X is A,D,I,L or N. Contents: Lines of the form: MMMM-NNNN or NNNN Where NNNN and MMMM are octal addresses. e.g. the section: $N 1717-1730 1750 $ specifies that the locations 1717-1730 and 1750 are to be translated as octal numbers. 2. Sections $S. Contents: Lines of the form: SSSS:XXXXX Where SSSS is a subroutine address and XXXXX specifies the kind of arguments the subroutine has. e.g. the section: $S 1000:NL $ indicates that each call to the subroutine at LOC 1000 has two arguments of type octal and label respectively. 3. Sections $T. Contents: Lines of the form: TAG=NNNN or TAG Meaning: If no octal value of a tag is specified then its value is taken as one more than the value of the previous tag. 4. Section $Z. This is an ad hoc construct to enable the translation of symbol tables like those of PAL8 and CREF. e.g. $Z=52;0=240;1=301;40=260 NNNN-MMMM:(UUUL) $ indicates that the range NNNN-MMMM is a table of four-word entries three words in a special format and one label. The special format is as follows: The value is divided by 52 giving a quotient and a remainder. Both are converted into a character as follows: 0 gives a space, 1-37 give letters A-_, and 40-51 give digits 0-9. The coding here is not foolproof yet: A strange command might give strange output instead of an error message. In later versions this command will be generalized, so we don't describe it in full here. ## Error Messages These are very poor (because of lack of space): HLTNNNN, where NNNN indicates the address of the routine in DCP that detected the error. Errors are almost always violations of the input format. A complete list will appear in the final report. | Name | DCP (ERROR TABLE) | Author | A.E. Brouwer | Date | 75-02-13 As noted: The error messages of DCP look like 'HLT....' where .... stands for the octal address of the routine that detected the error. (Of course giving intelligible messages is highly desirable but lack of space prevented this. Some future version of DCP will chain to a file `DECPERR.SV` containing the messages.) Below the error numbers are given for DCP AB-V21. [Note: These numbers may change slightly each time that DCP is assembled anew.] ### DCP16 Error Table | Number | ERROR | ------ | -------------------------------------------------------------| | 0000 | PREMATURE END OF .BN INPUT | | 0230 | CLOSE ERROR | | 0301 | LOOKUP FOR SYS:CREV.SV FAILED | | 1414 | OUTPUT ERROR OR NO ROOM FOR OUTPUT | | 1451 | INPUT ERROR (INFO FILE) | | 1522 | NO CARRIAGE RETURN WHERE EXPECTED IN THE INFO FILE | | 1755 | UPPER BOUND IN BOUND PAIR LESS THAN LOWER BOUND | | 2031 | ASCII STRING CONTAINED A SIXBIT ZERO, BUT NOT AT THE END | | | (I.E. A WORD 00XX). (THIS MIGHT HAVE BEEN AN @, | | | BUT IS USUALLY AN ERROR.) | | 2046 | ASCII STRING WITHOUT TRAILING ZERO | | 2061 | DCP COULD NOT FIND A SUITABLE DELIMITER FOR THE ASCII STRING | | | IN THE RANGE "" TO "? | | 2125 | IMPOSSIBLE | | 2214 | TEXT BUFFER OVERFLOW (TOO MANY OR TOO LONG IDENTIFIERS). | | 2234 | NO IDENTIFIER WHERE EXPECTED (IN A $T SECTION). | | 2666 | ZERO SUBROUTINE ADDRESS SPECIFIED IN A $S SECTION | | 2705 | S-BUFFER OVERFLOW (TOO MANY SUBROUTINES WITH ARGS.) | | 2761 | UNKNOWN TYPE LETTER IN SPECIFICATION OF SUBROUTINE ARGS | | 3006 | $Z NO FOLLOWED BY = | | 3011 | $Z= NOT FOLLOWED BY A NONZERO NUMBER | | 3022 | NO CARRIAGE RETURN OR SEMICOLON WHERE EXPECTED IN $Z HEADER | | 3030 | NO = WHERE EXPECTED IN $Z HEADER LINE | | 3041 | ZERO LOWER BOUND IN BOUND PAIR IN $Z SECTION | | 3064 | Z-BUFFER OVERFLOW | | 3117 | PREMATURELY EXHAUSTED Z-FORMAT | | 3135 | UNKNOWN Z-FORMAT SYMBOL | | 3470 | T-BUFFER OVERFLOW | | 3723 | NO VALUE ASSIGNED TO FIRST TAG IN $T SECTION | | 4213 | NO INPUT AND NO OUTPUT AND NO DSK:DCPLS.TM TO DELETE | | 4245 | HANDLER FETCH ERROR | | 4341 | LOOKUP FOR INPUTFILE FAILED | | 4442 | OUTPUT OPEN ERROR | | 4456 | NO 16K MEMORY AVAILABLE | | 4470 | CHECKSUM OR FORMAT ERROR IN BINARY INPUT FILE | | 4613 | FORMAT ERROR IN CORE CONTROL BLOCK OF .SV INPUT FILE | | 4647 | ERROR READING CORE CONTROL BLOCK OF .SV INPUT | | 4723 | ERROR READING .SV INPUT FILE | ## DCP24 DCP Version 24 is a 24K version of DCP. | Name | DCP-AB-WW-V24 | Author | W.F. Wakker, Math. Center, Amsterdam | Date | 76-03-25 ### The Following Extensions Are Made - DCP24 Translates EAE instructions in both A and B mode (For mode switching, see below.) Example: 1200 DAD;1234 is translated as if the info-file contains the following info: $I 1200 $ $L 1201 $ $N 1234+ $ - In the info-file one can give : NNNN+ which has the same effect as NNNN-MMMM where MMMM=NNNN+1. - Several buffers have been enlarged. - The output is paginated and has a heading on each page. (The page number is in octal ....) - Error messages are unfortunately as poor as before (See DCP24 error table). - New sections, now possible in the info-file are: | $B | TRANSLATE AS 8-BIT ASCII | | $C | GIVE COMMENT | | $E | FORCE EAE MODE A | | $F | FORCE EAE MODE B | | $M | TRANSLATE NEGATIVE | - Section $B $B NNNN-MMMM $ Causes the location NNNN-MMMM to be translated as 8-bit ASCII, E.G. 0301 is translated as "A. Values less then 241 are translated as octal numbers. - Sections $E and $F When DCP encounters EAE instructions, some slight heuristics are done to determine the mode. The mode is initially A; SWAB, DAD, and DST cause the mode to change to mode B etc. When these heuristics are too poor, you can use the $E section to force mode A and the $F section to force mode B. - Section $M This section has the same effect as section $N, only all octals are given negative, E.G. 7770 becomes -10. It is also possible to give $B and $M to the same LOC. Example: 7477 is now translated as -"A. - Section $C Now you can give comment!! | Format | NNNN:THIS IS COMMENT | Effect | NNNN ........ /THIS IS COMMENT | Attention | The $C section must be the last one in the info-file: When $C is seen in the info-file, a setup is made to give the comment and no more input will be read ( E.G. The program acts like $$ on the end is seen). The comments are added to the listing in the last pass of the program. __YOU MUST SORT THE ADDRESSES.__ 300:COMM1 200:COMM2 Has as effect that from adress 300 on, no more comment will be given, since address 200 is not found any more. __DO NOT GIVE COMMENT ON ADDRESSES WHICH DO NOT BELONG TO THE PROGRAM__ - Extension of $S section As arguments in the $S section you can give N, L, A, I, B, M, (with the obvious meaning, see above ) and also U. U should only be used for the addresses 200 and 7700. It marks the entrypoint of the user service routine and gives a nice translation of each USR call. - Extension of $Z section New possible arguments: M, B. ### DCP-V24 (ERROR TABLE) | Number | ERROR | ------ | -------------------------------------------------------------| | 0000 | PREMATURE END OF .BN INPUT | | 0237 | CLOSE ERROR | | 0305 | LOOKUP FOR SYS:CREF.SV FAILED | | 1414 | OUTPUT ERROR OR NO ROOM FOR OUTPUT | | 1511 | NO CARRIAGE RETURN WHERE EXPECTED IN THE INFO FILE | | 1707 | NO : AS SEPARATOR IN $C SECTION | | 2145 | UPPER BOUND IN BOUND PAIR LESS THAN LOWER BOUND | | 2235 | NO : AS SEPARATOR IN FIRST LINE OF $C SECTION | | 2331 | INPUT ERROR (INFO FILE) | | 2431 | ASCII STRING CONTAINED A SIXBIT ZERO, BUT NO AT THE END | | | (I.E. A WORD 00XX). (THIS MIGHT HAVE BEEN AN @, | | | BUT IS USUALLY AN ERROR.) | | 2446 | ASCII STRING WITHOUT TRAILING ZERO | | 2461 | DCP COULD NOT FIND A SUITABLE DELIMITER FOR THE ASCII STRING | | | IN THE RANGE "" TO "? | | 2525 | IMPOSSIBLE | | 2614 | TEXT BUFFER OVERFLOW (TOO MANY OR TOO LONG IDENTIFIERS) | | 2634 | NO IDENTIFIER WHERE EXPECTED (IN A $T SECTION) | | 3266 | ZERO SUBROUTINE ADDRESS SPECIFIED IN A $S SECTION | | 3305 | S-BUFFER OVERFLOW (TOO MANY SUBROUTINES WITH ARGS) | | 3367 | UNKNOWN TYPE LETTER IN SPECIFICATION OF SUBROUTINE ARGS | | 3406 | $Z NOT FOLLOWED BY = | | 3411 | $Z= NOT FOLLOWED BY A NONZERO NUMBER | | 3422 | NO CARRIAGE RETURN OR SEMICOLON WHERE EXPECTED IN $Z HEADER | | 3430 | NO = WHERE EXPECTED IN $Z HEADER LINE | | 3441 | ZERO LOWER BOUND IN BOUND PAIR IN $Z SECTION | | 3463 | Z-BUFFER OVERFLOW | | 3517 | PREMATURELY EXHAUSTED Z-FORMAT | | 3541 | UNKNOWN Z-FORMAT SYMBOL | | 4070 | T-BUFFER OVERFLOW | | 4324 | NO VALUE ASSIGNED TO FIRST TAG IN $T SECTION | |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
> > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 | h1, h2, h3, th { font-family: sans-serif; page-break-after: avoid; } th { border-bottom: 0.5pt solid black; text-align: left; } pre, table { margin-left: 2em; } |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 | # E8 Manual E8 is an Emacs-like text editor for PDP-8 family computers. It runs under OS/8 and communicates with the user via character I/O on the console terminal. The console is expected to be, or behave like, a simple fixed-size character-oriented display terminal, able to process a few basic ANSI escape sequences. This document assumes some familiarity with the PDP-8, OS/8, and Emacs. ## Copyright and License The source code described here is copyright © 2020 by Bill Silver and is distributed under the terms of [the SIMH license][slic], which grants you certain rights to copy, modify, and redistribute. There is no express or implied warranty, including merchantability or fitness for a particular purpose. You assume full liability for the use of this code. [slic]: https://tangentsoft.com/e8/doc/trunk/COPYING.md ## Cautions I’ve been using E8 to further its own development with no trouble, but it has not yet been tested extensively. Save often and make backups. Note that OS/8 provides almost no protection for its file system from errant application code. E8 has some fail-safes to prevent bugs from overwriting other files, and there are no known bugs, but still, this is software. Until community use is further along, I recommend editing files on some removable media that doesn’t contain stuff you can’t afford to lose. ## “Hardware” Requirements E8 runs on any PDP-8 family computer with at least three fields of memory (12K). The maximum file size (characters) that can be edited is simply the number of words of memory minus fields 0 and 1. So if you have all eight fields, you get a max size of 24K characters. E8 can display, but not properly edit, larger files. ## Terminal Requirements and Processing ### Display The terminal must be able to process the following ANSI escape sequences: | Sequence | Action | To change, search for | |-----------------------------|----------------------|-----------------------| | `ESC` `[` *row*`;`*col* `H` | set cursor position | `SETCUR,` | | `ESC` `[` `2` `J` | clear screen | `CLRSC,` | | `ESC` `[` `K` | clear to end of line | `CLREOL,` | E8 sends the BELL code (007<sub>8</sub>) if you try to do something that can’t be done, like entering an unimplemented command character, moving the cursor past the ends of the buffer, or entering a bad filename character. If your terminal doesn’t beep or flash the screen, you’ll miss these. The Linux console (e.g. <kbd>CTRL-ALT-F1</kbd>) and MobaXterm are fine. ### Keyboard Many E8 commands are intended for use with the <kbd>ALT</kbd> key. E8 recognizes the sequence ESC char to mean <kbd>ALT-char</kbd>. Many terminals and terminal emulators that have an <kbd>ALT</kbd> key will send that sequence when the <kbd>ALT</kbd> key is pressed. If yours doesn’t, just type the <kbd>ESC</kbd>. Some control characters that Emacs has traditionally used may be captured by a screen manager (e.g. <kbd>^A</kbd> for GNU `screen` or <kbd>^B</kbd> for `tmux`) or SimH (<kbd>^E</kbd>) and not sent along to the terminal. The serial flow control characters <kbd>^Q</kbd> and <kbd>^S</kbd> may also be captured, but if you are not using serial communication you can stop that with the command `stty -ixon` (SSH and VNC are not serial and don’t need flow control). <kbd>ALT</kbd> alternatives are provided in each case, but it takes a little getting used to if you have Emacs muscle memory. There is some ambiguity about whether the modern <kbd>Backspace</kbd> key should send the backspace code (^H, 010<sub>8</sub>) or the delete code (177<sub>8</sub>). E8 considers them the same and converts 177 to 010. E8 responds to escape sequences that are sent by certain special keys on modern keyboards: | Sequence | Key | Action | |-------------------|-----------|------------------------------| | `ESC` `[` `A` | ↑ | beginning of previous line | | `ESC` `[` `B` | ↓ | beginning of next line | | `ESC` `[` `C` | → | forward one character | | `ESC` `[` `D` | ← | back one character | | `ESC` `[` `1` `~` | HOME | beginning of line | | `ESC` `[` `3` `~` | DEL | delete forward one character | | `ESC` `[` `4` `~` | END | end of line | | `ESC` `[` `5` `~` | PAGE UP | back one screen | | `ESC` `[` `6` `~` | PAGE DOWN | forward one screen | ## Installation ### Source Files There are three equivalent configurations of source files, depending on whether you use PIP, or something that can handle larger files, to transfer to OS/8, and depending on whether you want files smaller than 24K characters so E8 can edit them (assuming 8 fields of memory). | Use PIP | E8 can edit | Files | |---------|-------------|------------------------------------------------------------------------| | yes | yes | `E8.PA`, `EA.PA`, `EB.PA`, `EC.PA`, `ED.PA`, `EE.PA`, `EF.PA`, `EG.PA` | | no | yes | `E8BASE.PA`, `E8FILE.PA`, `E8SRCH.PA` | | no | no | `E8ALL.PA` | ### Setting Screen and Memory Size The default screen size is 42 lines of 80 characters, and the default number of fields is 8. If your setup is different, make a Pal8 source file (e.g. E8DEFS.PA) to define your values. For example: DECIMAL SCRWD=120 SCRHT=24 MEMSIZ=6 OCTAL The symbols SCRWD and SCRHT define your screen size. Make them whatever you like, as long as SCRWD * (SCRHT + 1) <= 3968 The symbol `MEMSIZ` specifies the number of fields installed. 3 ≤ `MEMSIZ` ≤ 8 ### Lines Longer than the Screen Width There is no limit on the size of lines that can be in files and edited, but you can only see the first SCRWD-1 characters of each line. What you can’t see is there and not lost. If the length of any line is >= SCRWD, E8 will display a <kbd>></kbd> in the last column to let you know that there are more characters that you can't see. Likewise, you can place the edit cursor (where you insert and delete characters) anywhere in the file, even at invisible positions. If the edit cursor is at an invisible position the screen cursor is placed on the <kbd>></kbd> to let you know. If you want to see the invisible text, put the cursor just before the <kbd>></kbd> and insert a newline (<kbd>CR</kbd>) to break the line in two. You can always delete the <kbd>CR</kbd> when you're done looking. ### Getting the Code Onto OS/8 Choose an OS/8 device to hold the E8 source and the files you want to edit, and assign it to DSK: .AS <physical device> DSK My method is to copy/paste the source code into a MobaXterm session connected to OS/8, while PIP on the OS/8 receives it, like this: .R PIP *E8.PA<TTY: After each file is copied this way, type ^Z to PIP to signify end of file, and then you’re back at the PIP command prompt ready to do the next file. I have found that PIP can’t handle files longer than 549 lines, so use the eight small files. Often my MobaXterm stops sending characters for a few seconds and then resumes, so make sure to wait until the last line is sent. This also can happen during an E8 screen update, so beware. [This link][gti] has other and probably better ways to do it. If your method can handle arbitrarily large files, you can use the other source configurations. [gti]: https://tangentsoft.com/pidp8i/wiki?name=Getting+Text+In ### Build and Run .R PAL8 *E8<E8DEFS,E8,EA,EB,EC,ED,EE,EF,EG/L ⇠ either this... *E8<E8DEFS,E8BASE,E8FILE,E8SRCH/L ⇠ or this... *E8<E8DEFS,E8ALL/L ⇠ or this, not all 3. *^C .SA SYS E8;200=1000 .R E8 If you are using the default setup, omit `E8DEFS`. The screen will start cleared expect for the mode lines showing an empty text buffer. ## Files * E8 can display and edit OS/8 text files, which contain 7-bit ASCII codes that include lowercase. * The character parity bit is cleared on input. If your file has the parity bits set, E8 will clear them. Usually this is not a problem, but it could be fixed if it is. * On input the <kbd>CR</kbd> code (<kbd>^M</kbd>, 015<sub>8</sub>) is considered new line, and the <kbd>LF</kbd> code (<kbd>^J</kbd>, 012<sub>8</sub>) is discarded. On output, <kbd>CR</kbd> is written as <kbd>CR</kbd>, <kbd>LF</kbd>. * I/O to files is one OS/8 block per transfer, sequential over the file, and therefore may be inefficient on real DECtape, if anyone still has such a thing. ## Internal Errors Certain internal errors will print `ASSERT: xxxx` and exit to OS/8. Edits since the last save are lost. Report the address to me. I have never seen this happen, but just in case. ## Mode Lines The E8 mode lines look like this: -**- EFBASE.PA 5123 SEARCH: TOP, The `-**-` on the first line means the buffer has been changed. Following this (`E8BASE.PA` in this example) is the current file name, if any. The number after that is the count of characters in the buffer (decimal). The line below shows occasional status or state displays, and accepts your input for certain commands. In the example shown, the incremental search command prompts with `SEARCH:` and you enter a search string, here `TOP,`. ## Entering Filenames In a single edit session you can create new files and view or edit as many files as you like. When prompted for a filename: * Names must be alphanumeric, no more than six characters, with an optional extension of up to two characters. * Lowercase letters are made uppercase. * Any character that would not result in a legal filename will be rejected. * The <kbd>CR</kbd> code (<kbd>Enter</kbd> on modern keyboards) terminates and accepts the entry. * <kbd>Backspace</kbd> clears the filename so you can start over. * <kbd>^G</kbd> aborts the operation. * You cannot enter an OS/8 device name. E8 can currently only access files on `DSK:`. ## Incremental Search (^S) Enter the search string at the mode-line prompt. After each character the cursor will advance to matching text if any, or ring the console bell and reject the character if not. You may enter: | Key | Action | |-------------|--------------------------------------------------| | `CR` | terminate search with mark set to starting point | | `^S` or `^F`| find the next occurrence of the search string | | `BS` | erase last search character and back up | | `^N` | match `CR` (newline) in search text | ## Query-Replace (ALT-%) When entering strings at the `REPLACE` and `WITH` prompts: | Key | Meaning | |------|-------------------------------| | `CR` | Accept string | | `BS` | Delete last character entered | | `^G` | Abort query-replace | | `^N` | Put CR (newline) in string | If `REPLACE` is null you’ll be asked again. `WITH` can be null. You will be shown successive instances of the replace string, and you can: | Key | Meaning | |------------|----------------------------| | `SP` | Replace and continue | | `n` or `N` | Don’t replace and continue | | `.` | Replace and quit | | `CR` | Quit | | `!` | Replace all without asking | ## Change Protection If there are unsaved changes in the buffer and you try to exit E8, create a new file, or read in an existing file, you will be offered the opportunity to save the changes. The responses are <kbd>Y</kbd> (yes), <kbd>N</kbd> (no), or <kbd>^G</kbd> (abort). If you select <kbd>Y</kbd> and there is no filename, you will be asked for one. Only uppercase <kbd>Y</kbd> and <kbd>N</kbd> are accepted. ## Editing Like Emacs, E8 is a character editor. All characters are traversed and edited the same way, including <kbd>TAB</kbd> and <kbd>CR</kbd>. The other control characters are displayed with the customary `^` prefix, but remember that they are just one character in the buffer. ## Limited Undo If you accidentally delete characters with any sequence of character-deleting commands, you can recover them if you act right away. The deleted characters are lost if you insert any characters or move the cursor. See <kbd>ALT-R</kbd>. ## Commands Most commands are equivalent or nearly so to Emacs, but some are not, so beware. The <kbd>ALT</kbd> commands are case-insensitive. The <kbd>^X</kbd> commands consider control, uppercase, and lowercase letters to be all the same. For example, <kbd>^X</kbd> <kbd>^S</kbd>, <kbd>^X</kbd> <kbd>S</kbd>, and <kbd>^X</kbd> <kbd>s</kbd> are all the same. | Key/Sequence | Meaning | |-----------------------|--------------------------------------------------------| | `^@` or `^SP` | Set the mark to the current position (cursor) | | `^A` or `ALT-A` | Beginning of line | | `^B` | Back one character | | `^D` | Delete forward one character | | `^E` or `ALT-E` | End of line | | `^F` | Forward one character | | `^H` (BS) | Delete backward one character | | `^I` (TAB) | Insert TAB | | `^J` (LF) | Insert CR, TAB | | `^K` | Kill (delete) to end of line; if at end, delete CR | | `^L` | Erase and redraw screen with cursor at the middle line | | `^M` (CR) | Insert CR | | `^N` | Next line at same column or nearby | | `^O` | Open new line (CR, ^B) | | `^P` | Previous line at same column or nearby | | `^Q` | Insert next typed char as is | | `^S` or `ALT-S` | Incremental search (case sensitive) | | `^V` | Forward one screen | | `^W` | Write region (text between cursor and mark) to the file `CLIP.E8` and delete the text in the region. | | `^Y` | Insert the file `CLIP.E8` at the cursor | | `^Z` | Exit to OS/8 | | `^\` | Scroll up one line, keeping cursor in same position on screen | | `ALT-%` | Query-replace (case sensitive) | | `ALT-<` | Beginning of buffer | | `ALT->` | End of buffer | | `ALT-B` | Back one word | | `ALT-D` | Delete forward one word | | `ALT-F` | Forward one word | | `ALT-H` (BS) | Delete backward one word | | `ALT-N` | Search for the last search or replace string | | `ALT-Q` | Insert next typed character as a control character, e.g. `ALT-Q` `A` inserts `^A`. | | `ALT-R` | Recover deleted characters if possible | | `ALT-V` | Back one screen | | `ALT-W` | Write region to the file `CLIP.E8`; do not delete the region. | | `ALT-\` | Scroll down one line, keeping cursor in same position on screen | | `^X` `^F` or `^X` `F` | Open existing file or create new one | | `^X` `^I` or `^X` `I` | Insert file at cursor | | `^X` `^R` or `^X` `R` | If the previous file read filled the buffer before the end of the file, clear the buffer and read more text from the file starting at some point up to 384 characters before the last one read. | | `^X` `^S` or `^X` `S` | Save buffer to current file, prompt for filename if none | | `^X` `^W` or `^X` `W` | Write buffer to new filename. | | `^X` `^X` or `^X` `X` | Exchange cursor and mark. | ## Scrolling By default the scrolling commands `^\` and `ALT-\` operate by redrawing the entire screen. With a fast simulator, high-speed communications, and a modern graphics engine the redraw is fast enough to not be noticeable. For slower systems, there is an assembly-time option for using VT-100 scrolling commands so that only one line need be redrawn. It is an option because it may not interact properly with every terminal, and it’s usually not needed. It also has to set a terminal scrolling window, which it has to undo by resetting the terminal on exit. So there are opportunities for trouble. It’s been tested and works with MobaXterm. If you're using SimH you can see the difference by throttling the simulator down to 300K or so. To enable VT-100 scrolling, put `FSCROL=0` in an `E8DEFS.PA` file. The terminal must implement the following escape sequences: | Sequence | Action | |-----------------------------|------------------------------------------------| | `ESC` `[` *top*`;`*bot* `r` | set scrolling window | | `ESC` `D` | if cursor is at window bottom scroll window up | | `ESC` `M` | if cursor is at window top scroll window down | | `ESC` `c` | reset terminal | ## Theory of Operation ### Storing and Editing Text Text is conceptually just a list of character codes. For editing purposes, there are no special characters: newline (CR), TAB, and other control characters are treated like any other (they are displayed differently, of course). Inserting and deleting occurs at a place in the text called the point. The point is conceptually between two characters, before the first one, or after the last one. The screen cursor is on the character just ahead of the point. All editing operations are built from three fundamentals: * insert characters at the point; * delete characters in front of or behind the point; and * move the point somewhere. Characters are stored in a text buffer comprising one or more complete fields starting at field 2, one character per word of memory. The fields are considered contiguous—there is no significance to field boundaries. Every word in the buffer can hold a character—there are no special codes, link pointers, or the like. Inserting and deleting are fast, O(1) operations (independent of the number of characters in the buffer). Moving the point is O(n), where n is the distance to be moved. On a real 8/I, moving forward takes 20 cycles (30 μs) per character and backward 29 cycles (43.5 μs) per character (plus some small constant overhead). Typical operations move the point small distances (one character, line, or screen) and are fast. The worst case is moving from the end of a full buffer (24K characters) to the beginning, which takes slightly over 1 second. Text buffer memory looks like this:  Almost all actions operate on text that is exclusively either ahead of or behind the point, the characters of which are always contiguous in memory. Only rare actions cross the gap (e.g. writing the text to a file). The gap structure makes everything simple and fast. ### Display Display is completely separate from and independent of editing. The editing commands know nothing about the display and contribute no information to it. The display code does not know what editing commands have been issued since the last display. Its job is to make the display match the current contents of the text buffer, with few unnecessary characters transmitted to the console terminal. This complete separation simplifies the code and avoids all manner of potential bugs that would arise from editing and display miscommunication—no communication, no communication bugs. A complete copy of the screen is kept in field 1. The first step in a screen update is to determine what character in the text buffer should be top of screen (TOS), so that the point is visible. TOS is always either at the beginning of the buffer, or just after a newline. If the point is visible with the current TOS, it is kept. Otherwise it is chosen to place the point somewhere on the screen’s middle line if possible. Once TOS is established, text lines are processed one at a time and independently. Each line is first rendered to a one-line buffer in field 1, whose size is the width of the screen (`SCRWD`). Rendering converts tabs to spaces, adds the `^` prefix to control characters, and enforces the `SCRWD-1` limit on visible text. The rendered characters are terminated with one of two codes, both negative, indicating that the line does or does not extend beyond the limit. Rendering is the most time-consuming part of screen update, so the inner loop is carefully crafted for speed. Each rendered line is then compared to the appropriate line of the screen copy. If a mismatch is found at some position, the screen cursor is set to that position and the rest of the characters from the render buffer are sent to TTY and replace the screen copy. After all those characters have been sent and copied, if the screen copy shows that the rest of the screen line is not blank, an escape sequence is sent to clear to end of line. Each line of the screen copy also has two negative termination codes, different from the render codes, that indicate whether a <kbd>></kbd> does or does not appear in the last column. The render and screen termination codes tell whether <kbd>></kbd> needs to be added, removed, or left alone. The inner loop is optimized for characters comparing equal and is only nine memory cycles on an 8/I. The use of distinct termination codes avoids having to also test for end of render or screen line in the inner loop. After the text buffer has been processed, the two mode lines at the bottom of the screen are rendered and updated in the same way. Finally, the screen cursor is set to the point position. Screen update can be aborted safely after each line. If a character is received on the console terminal during an update, it is aborted. The screen will settle on the correct display as soon as update catches up with character input. Every character written to the screen goes through this update process. Nowhere is a character written directly. The only direct write to TTY other than screen update is the BELL code. ### Code Organization All executable code is in field 0. The last page of fields 0 and 1 holds core-resident OS/8. The two pages just below that in field 0 hold the `DSK:` device handler. The screen copy and render buffer can use the entire rest of field 1 (31 pages, 3968 words). Every subroutine that implements an editor command skip-returns if successful, even if failure is impossible (e.g. move to end of buffer can’t fail). Many other utility subroutines also skip-return on success. This allows what in modern high-level languages would be a catch-throw mechanism—failures can unwind up to whatever code can deal with them, and unwinding all the way to top level just rings the console bell. If a subroutine that logically can’t fail takes the non-skip return, a fatal assertion failure is reported. 15-bit addresses and 24-bit integers are always stored little-endian. The high-order word of a 15-bit address is a `CDF` instruction. ### File Output Size OS/8 does not protect the file system from an application writing beyond the end of the allocated blocks for an output file. When writing a file, E8 calculates the number of OS/8 blocks needed and asks for one more than that number. Bugs may cause the calculation to be inconsistent with the number actually needed. E8 counts written blocks and aborts the file write if there is an attempt to write more than OS/8 allocated (which should be the number asked for). After a write the calculated and actual values are displayed in the mode line. They should always be equal. The one extra asked for allows some overwrite to be tolerated without harm, and the calculated/actual values will be off by one to show what happened. I have never seen any errors in calculating file size, but be aware and report inconsistencies. ---- ## License This document is © 2020 by Bill Silver and Warren Young. It is licensed under [the SIMH licnese][slic]. ## PDF Version This document is also available in [PDF format][pdf], ~151 kiB. [pdf]: https://tangentsoft.com/e8/uv/doc/manual.pdf |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | <?xml version="1.0" encoding="UTF-8"?> <svg width="280" height="286" overflow="hidden" inkscape:version="1.0 (4035a4f, 2020-05-01)" sodipodi:docname="e8-buffer.svg" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"> <style>text { font-family: sans-serif; font-size: 14px; line-height: 0%; } g.small text { font-size: 12px; } g#arrow-labels { text-anchor: end; } g#box-labels text { text-anchor: middle; } </style> <metadata> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> <dc:title/> </cc:Work> </rdf:RDF> </metadata> <sodipodi:namedview bordercolor="#666666" borderopacity="1" gridtolerance="10" guidetolerance="10" inkscape:current-layer="g3301" inkscape:cx="73.881121" inkscape:cy="119.46224" inkscape:document-rotation="0" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="1395" inkscape:window-maximized="1" inkscape:window-width="2560" inkscape:window-x="0" inkscape:window-y="23" inkscape:zoom="3.109776" objecttolerance="10" pagecolor="#ffffff" showgrid="false"/> <defs> <pattern id="Wavy" width="30.066020" height="5.1805778" inkscape:collect="always" inkscape:stockid="Wavy" patternUnits="userSpaceOnUse"> <path d="m7.597 0.061c-2.518-0.248-4.941 0.241-7.607 1.727v1.273c2.783-1.63 5.183-2.009 7.482-1.781 2.298 0.228 4.497 1.081 6.781 1.938 4.567 1.713 9.551 3.458 15.813-0.157l-4e-3 -1.273c-6.44 3.709-10.816 1.982-15.371 0.273-2.278-0.854-4.576-1.75-7.094-2z"/> </pattern> </defs> <g inkscape:groupmode="layer" inkscape:label="Background" opacity=".4"> <g transform="translate(-500,-217)" clip-path="url(#clip0)" fill="#fff"> <rect x="501" y="218" width="278" height="284"/> <rect x="578" y="409" width="76" height="29"/> <rect x="578" y="341" width="76" height="30"/> <rect x="501" y="226" width="153" height="30"/> <rect x="501" y="466" width="153" height="30"/> </g> </g> <g stroke="#000" stroke-miterlimit="8" stroke-width="1.3333" inkscape:groupmode="layer" inkscape:label="Chart" opacity=".8"> <rect x="183.5" y="24.5" width="77" height="240" fill="#fff"/> <rect transform="translate(-500,-217)" x="683.5" y="352.5" width="77" height="68" fill="url(#Wavy)"/> </g> <g inkscape:groupmode="layer" inkscape:label="Arrows"> <path d="m154.5 135.41h15.733v0.666h-15.733zm14.4-3.667 8 4-8 4z" inkscape:connector-curvature="0"/> <path d="m154.5 205.17h15.733v0.666h-15.733zm14.4-3.667 8 4-8 4z" inkscape:connector-curvature="0"/> <path transform="translate(-500,-217)" d="m654.5 481.17h15.733v0.666h-15.733zm14.4-3.667 8 4-8 4z" inkscape:connector-curvature="0"/> <path d="m154.5 25.539h15.733v0.666h-15.733zm14.4-3.667 8 4-8 4z" inkscape:connector-curvature="0"/> </g> <g inkscape:groupmode="layer" inkscape:label="Text"> <g id="box-labels" transform="translate(220 80)"> <g class="small"> <text><tspan x="0" y="0" sodipodi:role="line">text before</tspan></text> <text><tspan x="0" y="12" sodipodi:role="line">point</tspan></text> <text><tspan x="0" y="150" sodipodi:role="line">text after</tspan></text> <text><tspan x="0" y="162" sodipodi:role="line">point</tspan></text> </g> </g> <g id="arrow-labels" transform="translate(28)"> <text x="124" y="209.96471">point</text> <text x="124" y="140.34303">gap</text> <text x="124" y="29.964699">beginning of buffer</text> <text x="124" y="267.5318">end of buffer</text> </g> </g> </svg> |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 | # OS/8 Combined Kit ## Introduction To create the richest OS/8 environment, one had to purchase add-ons: * OS/8 V3D Extension Kit which contained `BASIC`, `TECO`, and the new `FUTIL` file utility. * OS/8 V3D FORTRAN IV * OS/8 V3D Device Extensions which contained device drivers for more modern devices like the RL02 cartridge disk drive, the RX02 dual density floppy, and the KT8A memory subsystem that enlarged the PDP-8 maximum memory from 32K to 128K words. (The two similarly named "Extensions" kits are a continuing source of confusion.) In March of 1979, the baseline OS/8 distribution and these three add-ons were put together as a single product, the "OS/8 V3D Combined Kit." ## Sources ## Media ## Patches The OS/8 Combined Kit Information Guide says, "In addition, the kit's modules have been updated with the binary patches described in the OS/8 Device Extensions User's Guide and in the issues of the Digital Software News (through June 1979)." Testing and review has determined that this is not always true. ### Earlier recommendations re-affirmed: ### Verified Patches: OS/8 V3D Patches: `EDIT 21.17.1M` Applied in source form. `EDIT 21.17.2M` Applied in source form. `EDIT 21.17.3M` Applied in source form. `EDIT 21.17.4M` Still bad. Not applied. `FOTP 21.19.1M` Applied in source form. `MCPIP 21.21.1M` Applied in source form. `PAL8 21.22.1 M` Irrelevant. We have PAL8 V13A `PAL8 21.22.2 M` Irrelevant. We have PAL8 V13A `PAL8 21.22.3 M` Irrelevant. We have PAL8 V13A `PAL8 21.22.4 M` Irrelevant. We have PAL8 V13A. Does not fit in that source either. `PIP 21.23-1M` Applied in source form. `PIP10 21.24.1M` Applied in source form. `SET 21.26.1M`, `2M`, and `3M` All irrelevant. Set V2A now. OS/8 Extension Kit V3D Patches: `BATCH 31.23.1 M` Irrelevant. We have `BATCH` version 10. `BRTS 31.11.1M` Applied in source form. `BRTS 31.11.2 O` was supposedly an optional patch. In the Combined Kit, the patch is labeled mandatory, and applied in source form. `BRTS 31.11.5 M` is available if you use `BASIC.UF` The patch is expected to match and work. `FUTIL 31.21.1 M` Not relevant. We have v8 `FUTIL 31.21.2 M` Not relevant. We have v8 `MSBAT 31.22.1 M` Applied in source form. OS/8 FORTRAN IV Patches: `F4/PASS3 21.1.2 M` Applied in source form. (Thank you, Lee Nichols!) `F4 51.3.1 M` Applied in source form. (Thank you, Lee Nichols!) `FORLIB 51.10.1 M` ha been applied in source form. `FRTS 51.3.3 O` Has been applied in source form. OS/8 V3D Device Extensions December 1978 Patches: `ABSLDR 35.18.1 M` Applied in source form. (Thank you, Lee Nichols!) `FUTIL 35.13.1 M` Applied in source form. `MONITOR 35.2.1 M` Applied in source form. (Thank you, Lee Nichols!) `FRTS 35.1.3 M` Is a note on how to avoid breaking `FRTS.SV` if `ABSLDR.SV` lacking patch `35.18.1 M` is used to load `FRTS.SV` before applying `FPAT.BN`. We build from source, and have the patch so this is not an issue. ### Applied Patches: The Combined Kit sources were obtained from Lee Nichols who built them and verified that the built binaries matched a Combined Kit binary distribution he had. When the patches applied to the V3D distribution were reviewed, some patches dated later than the documented "through June 1979" application date were discovered **not** to have been applied. Interpreting this state of affairs has been guided by pragmatism: 1. How could the documented release date of March 1979 include patches appearing in the June/July 1979 PDP-8 Digital Software News? Probably impossible. 2. Was the software development team 100% accurate in their application of patches? Probably not. 3. Is the statement "matches the binary distribution" from Lee credible? Probably yes. 4. Is it worth the extra work to hand-integrate patches into source as meticulously as Lee did with the patches he did integrate, when we have proven binary patches and a pre-existing automated patch application infrastructure? Probably not. Therefore, the following patches are applied using the same mechanism used for the V3D distribution: OS/8 V3D patches: `CREF 21.15.1 M` Apr/May 1978. Required update to apply to `CREF V5B`. `CREF 21.15.2 M` Feb/Mar 1980. `ABSLDR 21.29.1 M` Dec 1979/Jan 1980 -- Determined necessary after much research. See below. OS/8 Extension Kit V3D patches: 11 need work. `SABR 21.91.1M` needed (Oct '79) `BLOAD 31.10.1M` needed (Feb/Mar 80) `BRTS 31.11.3 O` is an optional patch that enables 132 column output. It is recommended because it is expected that wide column output is desirable. `TECO 31.20.5 M` Needs to be applied. Apr/May 1978. Should have been in source. `TECO 31.20.6 M` Needs to be applied. Apr/May 1978. Should have been in source. `TECO 31.20.7 M` Needs to be applied. Apr/May 1978. Should have been in source. `TECO 31.20.8 M` Needs to be applied. Apr/May 1978. Should have been in source. `TECO 31.20.10 M` Needs to be applied. Apr/May 1978. Should have been in source. `TECO 31.20.11 M` Needs to be applied. Apr/May 1978. Should have been in source. `TECO 31.20.12 M` Needs to be applied. Apr/May 1978. Should have been in source. `TECO 31.20.13 M` Needs to be applied. Oct/Nov 1978. Should have been in source. OS/8 FORTRAN IV patches 1 needs work: `F4 51.3.2 M` Has not been applied. Looks like it might be needed. Jun/Jul 1978. Should have been in source. OS/8 V3D Device Extensions December 1978 Patches: 2 need work. `PAL8 35.14.1 M` Needs to be applied. (April/May '79) `BLOAD 35.51.1 M` Needed but same as `BLOAD-31.10.1 M` for Baseline. Review and consider applying the available `MACREL v2` patches. 10 items ### Missing / Updated Patches: `BASIC.UF-31.5.1 M`, a mandatory patch, was expected to have been integrated into the source. The sources that "built binaries that matched the Combined Kit Binary Floppies did not contain it. `BASIC.UF` can't work without this patch because page zero literals in `BRTS` are adjusted to match. This patch has been incorporated into the `UF.PA` source. The source of `CREF` was labeled version `5B` but contained no changes other than the version string when compared against the OS/8 V3D source. The original `CREF 21.15.1 M` patch would not apply because the version number, 0302, did not match what it was expecting. To for the Combined Kit, the patch is modified to not care what version number is set. ### TODO: Fix 3 patches: Applying patch CREF-21.15.1M-v5B.patch8... Old value: 0302 does not match 0301. Aborting patch. Confirm application and correct operation. ### Patch research details: `ABSLDR 21.29.1 M` is supposedly a mandatory patch that enables `ABSLDR` to work with `SAVE` image files. Normally `ABSLDR` only loads `BIN` format files. The patch sequence number, `21.29` identifies the patch as being for the OS/8 V3D version of `ABSLDR`. But the patch changes locations that are not used by `ABSLDR.SV`. Furthermore, the patch says it upgrades `ABSLDR` from version 6B to version 6C. Version 6 of `ABSLDR` was part of the OS/8 V3D Device Extensions kit. See [our documention on the OS/8 V3D Device Extensions][os8ext]. Verification of this now seems within reach, with the expectation that it is mis-labeled, and is properly applied to the version with the Extensions kit. Until it is verified, applying this patch is *not* recommended. Reviewing the 6A source we have for the Combined Kit, this patch appears mis-labeled, and necessary for ABSLDR V6B. This patch was not re-numbered as of the latest issue to be found of PDP-8 Digital Software News [October/November 1980 (Order Number AA-K629A-BA)][dsn-1980-10]. `PAL8-21.22.4 M` Is broken and doubly mis-labeled. Mis-label #1: It is an optional, not mandatory patch. Mis-label #2: It is for product sequence `35.14`, the `V13` codeline of `PAL-8` that, like `ABSLDR V6`, is in the Device Extensions kit. The breakage: Source listing quits working. *Do not apply this patch!* I've looked at the V13 PAL8 source, and this patch doesn't match up to it either. ## Documentation and Historical Notes Re-creating this whole kit, along with all the supporting operational and historical documentation has been a challenge. But at last we have it. The creation date for the kit is known from the announcement of the removal of support (Effective 28 April 1980) for the individual components that appeared on page 3 of the 1980 April/May [PDP-8 Digital Software News][dsn-1980-04] (Order Number AA-J871A-BA.) The detailed description of the kit can be found in the Digital Software Product Description SPD 4.4.1 dated September 1979, which appears on page 71 of the [1979 October/November PDP-8 Digital Software News][dsn-1979-10] (Order Number AA-J235A-BA) An overview of the kit can be found in the [OS/8 Combined Kit Information Guide][os8cktig] (Order number AA-J016B-TA.) It enumerates other relevant documents, almost all of which are available on the Net: * OS/8 DEVICE EXTENSION RELEASE NOTES - AA-H565A-TA * [OS/8 DEVICE EXTENSIONS USER'S GUIDE - AA-D319A-TA][dev-ext-u-g] * [OS/8 ERROR MESSAGES - AA-H610A-TA][os8-err-msgs] * [OS/8 FORTRAN IV SOFTWARE SUPPORT MANUAL - DEC-S8-LFSSA-A-D][fiv-support] * [OS/8 LANGUAGE REFERENCE MANUAL - AA-H609A-TA][os8-lang-ref] * [OS/8 MARK SENSE BATCH USER'S MANUAL - DEC-S8-OBUGA-A-D][os8-msb] * [OS/8 SOFTWARE SUPPORT MANUAL - DEC-S8-OSSMB-A-D][os8-soft-supt] * [OS/8 SYSTEM GENERATION NOTES - AA-H606A-TA][os8-sysgen] * [OS/8 SYSTEM REFERENCE MANUAL - AA-H607A-TA][os8-sys-ref] * [OS/8 TECO REFERENCE MANUAL - AA-H608A-TA][os8-teco-ref] * [OS/8 V3D SYSTEM RELEASE NOTES - DEC-S8-OSRNA-B-D][v3d-rel-notes] * [TECO POCKET GUIDE - AV-D530A-TK][teco-pocket] The components and version numbers are listed starting on page 15 of the OS/8 Combined Kit Information Guide. This information also appears starting at page 7 of the [1979 December/1980 January PDP-8 Digital Software News][dsn-1979-12] (Order Number AA-J442A-BA). ### <a id="license"></a>License Copyright © 2017 by Bill Cattey. Licensed under the terms of [the SIMH license][sl]. [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md [dsn-1980-04]:https://archive.org/details/bitsavers_decpdp8sofswNewsAAJ871ABA_952366 [dsn-1979-10]:https://archive.org/details/bitsavers_decpdp8sofswNewsAAJ235ABA_2298034 [os8cktig]:ftp://ftp.dbit.com/pub/pdp8/doc/os8cktig.doc [dsn-1979-12]:https://archive.org/details/bitsavers_decpdp8sofswNewsAAJ442ABA_2496461 [dev-ext-u-g]:https://poetnerd.com/pdp8-alive/pdp8-alive/artifact/694f464f6aee76e7 [os8-err-msgs]:https://archive.org/details/bitsavers_decpdp8os8ar79_1411130 [fiv-support]:https://archive.org/details/bitsavers_decpdp8os8p_4653670 [os8-lang-ref]:https://archive.org/details/bitsavers_decpdp8os879_21565181 [os8-msb]:http://www.pdp8.net/pdp8cgi/query_docs/tifftopdf.pl/pdp8docs/dec-s8-obuga-a-d.pdf [os8-soft-supt]:https://archive.org/details/bitsavers_decpdp8os8up_5566495 [os8-sysgen]:https://archive.org/details/bitsavers_decpdp8os8otes_1404154 [os8-sys-ref]:https://archive.org/details/bitsavers_decpdp8os8an_11163494 [os8-teco-ref]:https://archive.org/details/bitsavers_decpdp8os879_5310047 [v3d-rel-notes]:https://archive.org/details/bitsavers_decpdp8os8elN_488624 [teco-pocket]:https://archive.org/details/bitsavers_dectecoAVDde1978_3836960 [dsn-1980-10]:https://archive.org/details/bitsavers_decpdp8sofswNewsAAK629ABA_1652391 |
︙ | ︙ | |||
47 48 49 50 51 52 53 | [dsn]: http://bitsavers.org/pdf/dec/pdp8/softwarenews/ [dsn8010]: http://bitsavers.org/pdf/dec/pdp8/softwarenews/198010_PDP8swNews_AA-K629A-BA.pdf [pl]: https://tangentsoft.com/pidp8i/doc/trunk/media/os8/patches/patch-list.txt ## Review of Recommendations | | | | | | | | | 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | [dsn]: http://bitsavers.org/pdf/dec/pdp8/softwarenews/ [dsn8010]: http://bitsavers.org/pdf/dec/pdp8/softwarenews/198010_PDP8swNews_AA-K629A-BA.pdf [pl]: https://tangentsoft.com/pidp8i/doc/trunk/media/os8/patches/patch-list.txt ## Review of Recommendations `BRTS 31.11.2 O` is an optional patch which disables 8th bit parity. It is recommended because sometimes we may want to allow output that does not force the 8th bit. `BRTS 31.11.3 O` is an optional patch that enables 132 column output. It is recommended because it is expected that wide column output is desirable. `TECO 31.20.1 O` is an optional patch that permanently forces no case flagging. It is not recommended because we want to allow the option of case flagging. `TECO 31.20.2 O` is an optional patch that turns off verbose errors. It was for slow terminals and experienced users who didn't want to wait to see the long error messages they already knew. It is not recommended because we expect a majority of users to be on high speed terminals needing the verbose errors. `TECO 31.20.3 O` turns off a warning that you are using the `YANK` command to completely overwrite a buffer full of text. Issuing the command a second time succeeds. It was again to avoid experienced users. It is not recommended because we expect fewer advanced users who would be annoyed by the protection. `TECO 31.20.4 O` implements rubout support specifically and uniquely for the `VT05` terminal in a way that breaks it for all other video terminals. It is not recommended because there are VERY few `VT05` deployments that would use it. It is at this point that I began to notice that in later years, patches became less carefully produced, and more prone to errors. Some are not correctable, even today. `BASIC.UF-31.5.1 M` shows: 4044/4514 4556 changing location `4044` from `4514` to `4556`. Such a change would be consistent with the stated purpose of the patch, to correct references to page zero literals that moved with the `V3D` version of `BRTS`. The source around location '4044' looks like this: |
︙ | ︙ | |||
121 122 123 124 125 126 127 | Version 6 of `ABSLDR` was part of the OS/8 V3D Device Extensions kit. See [our documention on the OS/8 V3D Device Extensions][os8ext]. Verification of this now seems within reach, with the expectation that it is mis-labeled, and is properly applied to the version with the Extensions kit. Until it is verified, applying this patch is *not* recommended. | | | 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | Version 6 of `ABSLDR` was part of the OS/8 V3D Device Extensions kit. See [our documention on the OS/8 V3D Device Extensions][os8ext]. Verification of this now seems within reach, with the expectation that it is mis-labeled, and is properly applied to the version with the Extensions kit. Until it is verified, applying this patch is *not* recommended. `PAL8-21.22.4 M` is broken and doubly mis-labeled. Mis-label #1: It is an optional, not mandatory patch. Mis-label #2: It is for product sequence `35.14`, the `V13` codeline of `PAL-8` that, like `ABSLDR V6`, is in the Device Extensions kit. The breakage: Source listing quits working. *Do not apply this patch!* Patch `FRTS-51.3.3-O.patch8` is to enable 2-page system drivers like `RL01`. Except that the `RL01` driver is only available in the |
︙ | ︙ | |||
226 227 228 229 230 231 232 | See the `FUTIL` section above with regards to patch `35.13.1M`. `FORLIB 51.10.1 M` is a one line source change to `DLOG.RA`. The patch file provides that line. It also provides instructions on how to use `RALF` to assemble the source and on how to to use `LIBRA` to replace the old version of `DLOG` with the new one in `FORLIB.RL`. I followed the instructions to hand-tool a patched `FORLIB.RL` which I then put | | | | 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | See the `FUTIL` section above with regards to patch `35.13.1M`. `FORLIB 51.10.1 M` is a one line source change to `DLOG.RA`. The patch file provides that line. It also provides instructions on how to use `RALF` to assemble the source and on how to to use `LIBRA` to replace the old version of `DLOG` with the new one in `FORLIB.RL`. I followed the instructions to hand-tool a patched `FORLIB.RL` which I then put in the source tree at `.../src/os8/v3d/LANGUAGE/FORTRAN4/FORLIB.RL SYS:FORLIB.RL` The `patch-rk05.os8` script has conditional code to replace `FORLIB.RL` on `SYS:` if installation of FORTRAN IV is enabled. ## Unfinished Business There remain the following patches that are still under development, because they are not simple binary overlays on executables that could |
︙ | ︙ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 | # os8-progtest: Perform Tests on a Program Under OS/8 This program uses Python expect to work through tests of a program under OS/8. The test cases and expected output are expressed in YAML format utilizing the [pyyaml library][pyyaml]. It is found in the `tools` directory of the source tree. ## Usage os8-progtest [options] <prog_spec> The `prog_spec` is the program to test optionally followed by a subset of tests. For example: $ tools/os8-progtest cc8 …runs all CC8 tests, while: $ tools/os8-progtest cc8:ps,fib …runs just the two CC8 tests on `ps.c` and `fib.c`. More than one `prog_spec` can appear on the command line to test more than one program at a time. Because this test system is based on the [pexpect] library, success is determined by seeing a sequence of expected outputs come from the test program. If one or more of these fail to occur, the test will appear to hang until pexpect times out while waiting. [pexpect]: https://pexpect.readthedocs.io/en/stable/ ### Options | Argument | Meaning | -------------------- | ---------------------------------------------- | `--help, -h` | show this help message and exit | `--verbose`, `-v` | increase output verbosity | `-d DEBUG` | set debug level; 0-14 | `--destdir DESTDIR` | destination directory for output files | `--srcdir SRCDIR` | source directory for test `.yml` files | `--target TARGET` | target image file | `--dry-run`, `-n` | dry run: only print what would happen | `--exitfirst`, `-x` | exit on first failure When `--srcdir` is not given, `os8-progtest` looks for YAML files in `scripts/os8-progtest` relative to the PiDP-8/I source tree root. The default debug level of 0 suppresses all debug output, while 14 makes it quite noisy. The `--exitfirst` option is used when we want a non zero status exit from the run of `os8-progtest` on the very first failure, rather than the usual behavior of a successful run being performance all tests and reporting failures along the way. ## The Test Definition File The `.yml` files defines a series of tests, each one of which consists of a state machine. The state machine consists of a state name, the test text string to send, and an array of possible responses and the state to go to if the response is received. In the abstract, each test name begins starts at the beginning of a line, and all the associated states are indented one tab stop. Each state consists of a name followed by an array specification, where the first element is the test text string to send, and the second element is an array of 1 or more `[response, newstate]` pairs. Every state machine must have a “`start`” state. Every state machine should have at least one state that names “`success`” or “`failure`” as termination states. The `-n`, `--dry-run` option should be used at development time to confirm that the test state machine will terminate with success if all tests come back successful. The easiest way to understand how to define the state machine is to study an example: 'ps': 'start': ["EXE CCR\r", [["PROGRAMME\\s+>", 'progname']]] 'progname': ["ps.c\r", [ [ ".*924.*COMPLETED\r\n\r\n#END BATCH\r\n\r\n.$", 'success' ] ] ] 'fib': 'start': ["EXE CCR\r", [["PROGRAMME\\s+>", 'progname']]] 'progname': ["fib.c\r", [ [ "OVERFLOW AT #18 = 2584\r\n\r\n#END BATCH\r\n\r\n.$", 'success' ] ] ] This file defines two tests for the `cc8` package, `ps` and `fib`, which follow a very similar structure: * Both have the requisite `start` state and terminating `success` condition. * Both run the OS/8 command `EXE CCR` which runs `DSK:CCR.BI`, part of the CC8 package. * Both react to the program name input prompt by linking to the `progname` state. * Each test answers the `progname` state by sending the name of a C program installed with CC8, after which the test was named. * Each test looks for expected output from the test program followed by the common `#END BATCH` after a completed `CCI.BI` run. If found, sends the test state machine to the `success` condition. Because the second element of each test is an array of pairs, you can have the test check for multiple expected possible answers, sending the state machine to potentially different conditions depending on which one comes back. This gives the system a simple sort of conditional logic: 'advent': ["ADVENT\e", [ [ "LOCATION OF TEXT DATABASE\\s+\\(\\S+\\).*", 'database' ], [ "WELCOME TO ADVENTURE!!", 'instructions' ] ] ] You can see the rest of the test [here][ayml], but this shows the essential elements: two possible responses, sending the test to one of two states, `database` or `instructions` depending on whether Adventure has been run on the boot media used by the test before. Without this logic, we’d have to either rebuild the test media each time we ran the test or roll back all state changes made to it. Notice the use of `\e` to start `ADVENT`, terminating the OS/8 Command Decoder input with an ASCII escape character. [ayml]: /file/scripts/os8-progtest/advent.yml ### Additional Syntax Information A line beginning with a `#` is ignored as a comment. ## Crafting New State Machines 1. The YAML quoting conventions are carefully chosen! * Surround state names with single quotes. Otherwise state names like `yes` get evaluated and turned into something else. (`yes` becomes `True`.) * Surround send and reply strings with double quotes. The YAML evaluation of quoted strings is the simplest to understand as it gets translated into Python pexpect regular expressions. 2. OS/8 commands end with a carriage return denoted by `\r` or escape denoted by `\e`. 3. For programs needing <kbd>Ctrl-C</kbd> to get out of some loop, use the YAML hex code `\x03`. 4. `pexpect` translates all TTY output you see from running the simulator to upper case, so take anything you see and translate it to upper case in the reply string. 5. It is important to escape characters that normally have regex meaning: `.` `+` `*` `$` `(` `)` and `\`. To do this in YAML, preface each occurrence with two backslashes. So for example, to pass in a literal question mark, replace `?` with `\\?`. 6. To pass in regex escapes that have a backslash — for example `\s` for whitespace — double the backslash, so `\s` becomes `\\s`. 7. Use of regex’s end-of-string match (`$`) can often improve reliability, because it ensures the state machine doesn’t proceed before OS/8 or the program running under it is ready. Keep in mind that `os8-progtest` runs in your host machine’s context, and while the program under test is running unthrottled on the PDP-8 simulator, it’s still likely a program from the 1960s or 1970s expecting to run on a machine capable of only a few hundred thousand instructions per second, being fed interactive input by a 110 bps teletype. Some programs can get spammed if you don’t wait out the full reply line before sending the next bit of input. 8. Sometimes guessing the exact whitespace is difficult. The `\\s+` construct to match on one or more whitespace characters is often helpful. 9. Helpful match strings: String | Meaning ---------- | ----------------- `"\n\.$"` | OS/8 Monitor prompt. Always look for this at the end. `"\n\*$"` | OS/8 Command decoder prompt. Often the first step in running programs. ### Problems matching against long strings of output characters. Python expect has been observed to misbehave on long strings of output, for example when trying out BASIC games that print typewritter art. The match times out and fails, and the `before` match string is only a partial read of the whole output. Neither enlarging the pexpect `maxread` option for the spawned sub-process, nor setting a sleep between tests helped. However, there is a work around: Perform another write/expect cycle. Doing this is challenging, because ideally you want to send input that won't mess up the output. Under BASIC, an attempt was made to send `XOFF` ('\0x011') but sometimes, instead of sending `XOFF` that would be ignored, OS/8 would echo "X011". The work-around that actually worked was to: 1. Detect stalled output with careful crafting of additional state matches. And adding a new state. 2. Prevent false positive tests of stalled output, by putting the longest, definitive match first in the list. 3. Send a newline. 4. Retest. 5. If necessary loop a couple times. 6. Make sure tests after the kick handle the additional newlines gracefully. Example: The playboy bunny typewriter art kept hanging at random points. The old version: 'bunny': 'start': ["R BASIC\r", [["NEW OR OLD--$", 'old']]] 'old': ["OLD\r", [["FILE NAME--$", 'name']]] 'name': ["BUNNY.BA\r", [["READY\r\n$", 'run']]] 'run': ["RUN\r", [[".*BUNNY.*\r\nREADY\r\n$", 'success']]] 'quit': ["\x03", [["\n\\.$", 'success']]] becomes: 'bunny': 'start': ["R BASIC\r", [["NEW OR OLD--$", 'old']]] 'old': ["OLD\r", [["FILE NAME--$", 'name']]] 'name': ["BUNNY.BA\r", [["READY\r\n$", 'run']]] 'run': ["RUN\r", [ [".*BUNNY.*\r\nREADY\r\n$", 'quit'], ["^RUN.*", 'kick'] ] ] 'kick': ["\r", [ [".*\r\nREADY\r\n", 'quit'], [".*BUNNY.*", 'kick'] ] ] 'quit': ["\x03", [["\n\\.$", 'success']]] A few subtle aspects: * The `kick` state can loop until it gets the "READY" signifying the end of the run. * The test for "READY\r\n" in the `run` state contains the detection of end of string ('$') but the test in the `kick` state does not, because there will be extra newlines. * The work-around here relies on the hope that there'll be a string with the whole word "BUNNY" in it with the partial read. * Note that the wild card matches ('.*') are non-greedy, and match on the smallest success. That's why the longest match for the successful run is the first test to apply. [pyyaml]: https://pyyaml.org/wiki/PyYAMLDocumentation ### <a id="license"></a>License Copyright © 2020 by Bill Cattey. Licensed under the terms of [the SIMH license][sl]. [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md |
︙ | ︙ | |||
75 76 77 78 79 80 81 | * Protect image by attaching it read-only. * Recognize the use case of working with a pre-existing image, and abort the script if the image is not found, rather than creating a new, blank image. * Protect a master boot image that will not boot read-only by creating a scratch copy and booting the copy instead. * Recognize the use case of creating a new, blank image, but preserving any pre-existing image files of the same name. * boot OS/8 on an arbitrary attached device image. * create a duplicate of an existing file. This is the use case of building new image files from an existing baseline while preserving the baseline image file. * copy files from the running OS/8 environment into the POSIX environment | < > | < | 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | * Protect image by attaching it read-only. * Recognize the use case of working with a pre-existing image, and abort the script if the image is not found, rather than creating a new, blank image. * Protect a master boot image that will not boot read-only by creating a scratch copy and booting the copy instead. * Recognize the use case of creating a new, blank image, but preserving any pre-existing image files of the same name. * boot OS/8 on an arbitrary attached device image. * create a duplicate of an existing file. This is the use case of building new image files from an existing baseline while preserving the baseline image file. * copy files from the running OS/8 environment into the POSIX environment running SIMH. * copy files to the running OS/8 from the POSIX environment running SIMH. * run any OS/8 command as long as it returns immediately to the OS/8 Keyboard Monitor. This includes BATCH scripts. * run `ABSLDR` and `FOTP`, cycling an arbitrary number of times through the OS/8 Command Decoder. * run `PAL8` and report any errors encountered. * run `BUILD` with arbitrarily complex configuration scripts, including the `BUILD` of a system head that inputs `OS8.BN` and `CD.BN`. * configure the `tti`, `rx`, `td`, and `dt` devices at run time to allow shifting between otherwise incompatible configurations of SIMH and OS/8 device drivers. * run included script files so that common code blocks can be written once in an external included script. |
︙ | ︙ | |||
210 211 212 213 214 215 216 | Example 1: Begin work on a new RK05 image that gets an updated version of the OS/8 `BUILD` utility from POSIX source. (Perhaps it was found on the net.) mount rk0 $bin/v3d.rk05 required mount rk1 $bin/os8-v3f-build.rk05 preserve | | | 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 | Example 1: Begin work on a new RK05 image that gets an updated version of the OS/8 `BUILD` utility from POSIX source. (Perhaps it was found on the net.) mount rk0 $bin/v3d.rk05 required mount rk1 $bin/os8-v3f-build.rk05 preserve cpto $src/os8/v3f/BUILD.PA RKA1:BUILD.PA /A boot rk0 pal8 RKB1:BUILD.BN<RKA1:BUILD.PA begin cdprog SYS:ABSLDR.SV RKB1:BUILD.BN |
︙ | ︙ | |||
371 372 373 374 375 376 377 378 379 380 381 382 383 384 | | [`cpto`](#copy-to-comm) | Copy POSIX file *to* OS/8 environment. | | [`disable`](#en-dis-comm) | Set disablement of a feature by keyword. | | [`enable`](#en-dis-comm) | Set enablement of a feature by keyword. | | [`end`](#begin-end-comm) | End complex conditional or sub-command block. | | [`exit`](#exit-comm) | Exit os8-run and send status | | [`include`](#include-comm) | Execute a subordinate script file. | | [`mount`](#mount-comm) | Mount an image file as a SIMH attached device. | | [`os8`](#os8-comm) | Run arbitrary OS/8 command. | | [`pal8`](#pal8-comm) | Run OS/8 `PAL8` assembler. | | [`patch`](#patch-comm) | Run a patch file. | | [`print`](#print-comm) | Print information from running script. | | [`resume`](#resume-comm) | Resume OS/8 at Keyboard Monitor command level. | | [`restart`](#restart-comm) | Restart OS/8. | | [`umount`](#umount-comm) | Unmount a SIMH attached device image. | | > | 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 | | [`cpto`](#copy-to-comm) | Copy POSIX file *to* OS/8 environment. | | [`disable`](#en-dis-comm) | Set disablement of a feature by keyword. | | [`enable`](#en-dis-comm) | Set enablement of a feature by keyword. | | [`end`](#begin-end-comm) | End complex conditional or sub-command block. | | [`exit`](#exit-comm) | Exit os8-run and send status | | [`include`](#include-comm) | Execute a subordinate script file. | | [`mount`](#mount-comm) | Mount an image file as a SIMH attached device. | | [`ocomp`](#ocomp-com | Run the OS/8 Octal Compare Utility. | | [`os8`](#os8-comm) | Run arbitrary OS/8 command. | | [`pal8`](#pal8-comm) | Run OS/8 `PAL8` assembler. | | [`patch`](#patch-comm) | Run a patch file. | | [`print`](#print-comm) | Print information from running script. | | [`resume`](#resume-comm) | Resume OS/8 at Keyboard Monitor command level. | | [`restart`](#restart-comm) | Restart OS/8. | | [`umount`](#umount-comm) | Unmount a SIMH attached device image. | |
︙ | ︙ | |||
553 554 555 556 557 558 559 | hangs for a while and then gives a timeout backtrace. ### <a id="resume-comm"></a>`resume` — Resume OS/8 at Keyboard Monitor command level. `resume` | | | | > < < | | < < < < | > | | | 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 | hangs for a while and then gives a timeout backtrace. ### <a id="resume-comm"></a>`resume` — Resume OS/8 at Keyboard Monitor command level. `resume` The least disruptive way to resume operations under SIMH is to issue the `continue` command. Although it took a while, we finally got this command working reliably. There were timing and workflow issues that had to be resolved. The `resume` command checks to see if OS/8 has been booted and refuses to act if it has not. ### <a id="restart-comm"></a>`restart` — Restart OS/8. `restart` Equivalent to the SIMH command line of \"`go 7600`\", but which confirms we got our Monitor prompt. Before `resume` was developed, the next less disruptive way to get an OS/8 Keyboard Monitor prompt was to restart SIMH at address 07600. This is considered a soft-restart of OS/8. It is less disruptive than a `boot` command, because the `boot` command loads OS/8 into main memory from the boot device, whereas restarting at location 07600 is just a resart without a reload. The `restart` command checks to see if OS/8 has been booted and refuses to act if it has not. ### <a id="copy-comm"></a>`copy` — Make a copy of a POSIX file. `copy` _source-path_ _destination-path_ The most common activity for `os8-run` is to modify a system image. |
︙ | ︙ | |||
618 619 620 621 622 623 624 625 626 627 628 629 630 631 | The option is either empty or exactly one of | `/A` | OS/8 `PIP` ASCII format. POSIX newlines are converted to OS/8 newlines. | `/B` | OS/8 `PIP` `BIN` format. Paper tape leader/trailer may be added. | `/I` | OS/8 `PIP` image format. Bit for Bit copy. If no option is specified, `/A` is assumed. In the first form of the command, the OS/8 file specification is left out, and one is synthesized from the file component of the _posix-path_. This is how you get files *to* OS/8 from the outside world. For example, this enables source code management using modern tools. The builder script would check out the latest source and use an `os8-run` | > > > > | 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 | The option is either empty or exactly one of | `/A` | OS/8 `PIP` ASCII format. POSIX newlines are converted to OS/8 newlines. | `/B` | OS/8 `PIP` `BIN` format. Paper tape leader/trailer may be added. | `/I` | OS/8 `PIP` image format. Bit for Bit copy. If no option is specified, `/A` is assumed. **IMPORTANT:** Because we are parsing both OS/8 and POSIX file specifications, we can't just parse out the slash in the options. Options must be preceded with whitespace. Otherwise it would be mis-parsed as part of a file spec. In the first form of the command, the OS/8 file specification is left out, and one is synthesized from the file component of the _posix-path_. This is how you get files *to* OS/8 from the outside world. For example, this enables source code management using modern tools. The builder script would check out the latest source and use an `os8-run` |
︙ | ︙ | |||
646 647 648 649 650 651 652 653 654 655 656 657 658 659 | The option is either empty or exactly one of | `/A` | OS/8 `PIP` ASCII format. POSIX newlines are converted to OS/8 newlines. | `/B` | OS/8 `PIP` `BIN` format. Paper tape leader/trailer may be added. | `/I` | OS/8 `PIP` image format. Bit for Bit copy. If no option is specified, `/A` is assumed. Unlike `cpto` there is only one form of the command. Both the _os8-filespec_ and the _posix-path_ must be specified. The options are the same for both `cpfrom` and `cpto`. Copy files from the running OS/8 environment to the POSIX environment running SIMH. | > > > > | 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 | The option is either empty or exactly one of | `/A` | OS/8 `PIP` ASCII format. POSIX newlines are converted to OS/8 newlines. | `/B` | OS/8 `PIP` `BIN` format. Paper tape leader/trailer may be added. | `/I` | OS/8 `PIP` image format. Bit for Bit copy. If no option is specified, `/A` is assumed. **IMPORTANT:** Because we are parsing both OS/8 and POSIX file specifications, we can't just parse out the slash in the options. Options must be preceded with whitespace. Otherwise it would be mis-parsed as part of a file spec. Unlike `cpto` there is only one form of the command. Both the _os8-filespec_ and the _posix-path_ must be specified. The options are the same for both `cpfrom` and `cpto`. Copy files from the running OS/8 environment to the POSIX environment running SIMH. |
︙ | ︙ | |||
674 675 676 677 678 679 680 681 682 683 | the command will return to the monitor command level and the command prompt, "`.`" will be produced. This command should be used ONLY for OS/8 commands that return immediately to command level. `BATCH` scripts do this, and they can be run from here. ### <a id="pal8-comm"></a>`pal8` — Run OS/8 `PAL8` assembler. | > > > > > > > > > > > > > > > > > < < < | < < < < | < < < < < < < < < < < < < < < < < < < < < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 | the command will return to the monitor command level and the command prompt, "`.`" will be produced. This command should be used ONLY for OS/8 commands that return immediately to command level. `BATCH` scripts do this, and they can be run from here. The `os8` command is aware of a special enablement keyword: `transcript`. (See the [`enable` \ `disable`](#en-dis-comm) section below.) If `transcript` is enabled, the output from running the OS/8 command line is printed. For example, if you wanted to display the contents of a DECtape image you are constructing but no other command lines fed to the `os8` command you would do this: ``` enable transcript os8 DIR DTA0: disable transcript ``` This transcript capability provides a fine grained debugging aid. ### <a id="pal8-comm"></a>`pal8` — Run OS/8 `PAL8` assembler. Actually, the `PAL8` assembler can be called just fine by using the `os8` command, for example: os8 PAL8 RKB1:RL0.BN<RKA1:RL0.PA However, an separate pal8 command was created to enable richer display of errors. Examples: Create a binary `OS8.BN` on partition B of rk05 drive 1 from `OS8.PA` source file found on partition A of rk05 drive 1. pal8 RKB1:OS8.BN<RKA1:OS8.PA Create a binary `OS8.BN` on partition B of rk05 drive 1 and a listing file `OS8.LS` on the default device `DSK:` from `OS8.PA` source file found on partition A of rk05 drive 1. pal8 RKB1:OS8.BN,OS8.LS<RKA1:OS8.PA ### <a id="ocomp-comm"></a>`ocomp` — Run OS/8 `OCOMP` Octal Compare and Dump Utility. This command was added to allow file verification. It wraps a call to the OS/8 `OCOMP` utility with some expect parsing to recognize when two files are identical, or when one is missing. A typical command line would look like this: ocomp TTY:<DTA1:E8.SV,SYS:E8.SV To confirm that the `E8` executable on `SYS:` matches the one found on the image mounted on `DTA1:` Note that, although one can use the full power of the `OCOMP` utility, the setup here in `os8-run` considers anything other than the "NOTHING OUTPUT" indicating identical files to be a "failure". However, the `transcript` option is available so that octal dumps can be produced. For example, the script: mount rk0 $bin/v3d.rk05 required scratch boot rk0 enable transcript ocomp TTY:<PS.C produces the following output $ bin/os8-run scripts/test/ocomp.os8 Running script file: scripts/test/ocomp.os8 TTY:<PS.C 0000 ( ABSOLUTE BLOCK 2302 ) 0000 5257 0252 7320 4762 5356 0364 7720 1741 7343 6341 5247 0363 0014 7364 4762 7341 3756 5354 0345 4252 6657 5212 5257 7240 7311 0030 7366 5757 7745 3640 7351 4364 6240 2656 5330 0305 6703 1303 0044 7240 7341 7344 2640 7356 2764 7762 2240 7750 1751 7240 4746 0060 7354 7345 5355 0345 4252 6657 4212 5215 5215 1612 7344 3345 0074 7351 2756 6240 7703 6725 2316 5640 2261 4215 6612 7212 4611 0110 5356 0364 6741 5762 6662 6660 5254 6351 4352 6673 4212 5215 0124 7751 2356 7240 0755 5351 4356 4251 5215 4373 5215 7211 7746 0140 5362 4240 5751 0675 5673 6351 6703 2717 5716 5724 5351 5653 0154 7651 5640 4215 4612 7611 1341 6733 6751 5675 5661 4215 4612 0170 7211 7746 5362 4240 7352 4675 5655 5661 5752 0676 5273 6752 0204 4255 6651 4212 4611 7611 1341 6733 6752 7675 1341 5333 6752 0220 5261 5735 6741 5762 5752 5735 4215 4612 7211 7746 5362 4240 0234 5752 0275 5673 6352 5262 4252 6703 2717 5316 6724 5751 0655 0250 7251 5273 5253 4653 4215 4612 7611 0211 7365 1764 5250 0247 0264 5647 5651 4215 4612 7211 7746 5362 4240 5752 0675 5673 6352 0300 5751 0653 5273 5752 4253 6651 4212 4611 7611 1360 7751 2356 0314 5346 1250 7245 2264 7242 0654 7362 5333 5735 5651 4215 4612 0330 7611 1360 7751 2356 5346 1250 6734 6362 5356 4642 4273 5215 0344 4211 6775 7612 0211 7362 7351 5364 4346 7242 7703 7355 6360 0360 7345 2764 7744 1334 5334 1356 4251 6673 4212 6775 0212 0232 0374 0000 0000 0000 0000 Non-fatal error encountered in scripts/test/ocomp.os8 at line 5: ocomp TTY:<PS.C Note how `os8-run` complains about a non-fatal error. Again, this is because the use-case is for detecting two identical files, and calling everything else a failure. ### <a id="begin-end-comm"></a>`begin` / `end` — Complex conditionals and sub-command blocks. `begin` _keyword_ _argument_ `end` _keyword_ |
︙ | ︙ | |||
1014 1015 1016 1017 1018 1019 1020 | default, switch to TD8e to run `BUILD` and create .tu55 tape images suitable for deployment on commonly found hardware out in the real world. ## TODOs | < | 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 | default, switch to TD8e to run `BUILD` and create .tu55 tape images suitable for deployment on commonly found hardware out in the real world. ## TODOs * Add sanity check parse of sub-commands to confirm command. **OR** Change the begin command to treat _argument_ not as a full command, but merely a device from which to fetch the command. Maybe make _argument_ optional. ## Notes |
︙ | ︙ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | # os8pkg: A package manager for OS/8 ## Motivation The [os8-run][os8run] language/execution environment allows scripting under OS/8 that interfaces to the SIMH simulator and to the host POSIX environment. The scripts can build subsystems, but managing dependencies, and integrating the subsystems into bootable media is a missing piece. `os8pkg` supplies the missing piece. It is integrated into the automake and Makefile to re-run the builder scripts when necessary. It manages the information needed to take the built package and install it onto bootable media. ## Commands * `deps` -- Emits a `.mk` Makefile include for dependencies of each of the packages specified on the command line. * `include` -- Emits `pkgs.os8` that is a master include file used by the .os8 script that wants to install all selected packages. **All** desired packages must appear in a single run of `os8pkg include`. * `install` -- Parses the .pspec file. Finds the installable package. Performs the relevant os8 COPY commands to install the package on bootable image specified by --target. $os8mo/v3d.rk05 if no --target. * `uninstall` -- On a specifiec target image file, parse the pspec file to identify output files to remove. Remove them from the bootable image specified by --target. $os8mo/v3d.rk05 if no --target specified. Additionally remove files listed in the cleanups section. * `build` -- Run the builder, whether it be the lines from the `build:` section or the default build script. **NOTE:** Use care when building with `build:` lines in the `.pspec` file. The assumption is that your current working directory is the top level of the build environment. * `all` -- Perform `deps`, then `build` then `install` on the named packages. * `conflicts` -- Given a list of packages, reports on any files appearing in more than one package. The case of the same file landing on two different destination devices is covered by reporting the package, the destination device, and the filename, even if only the filename matches. * `verify` -- Given a list of packages and a target image file, verify for each package that the files named in `outputs:` are present in the target image, and are the same as what is on the built package image file. The `auto.defs` scans `$srcdir/pspec` and runs the deps command on every `.pspec` file found there. This sets the stage to build every known package. `auto.defs` also evaluates the configuration and determines what subset of those packages are selected for install on system boot images. It defines the Makefile variable `@OS8_PKGS_INSTALLED@` with that subset. `Makefile.in` uses `@OS8_PKGS_INSTALLED@` to call `os8pkg include` to construct `.../obj/os8pkgs/pkgs.os8` which is used in boot image build script to install all configured packages. ## The `.pspec` File The required dependency and integration information is stored in a file named for the package being managed with a '.spec` extension. This file enables creation of the makefile dependencies and the installer `os8-run` script. ### Searching for .pspec files By default, all `.pspec` files live in a source top-level `pspec/` directory. However, `os8pkg` can manipulate target bootable images in arbitrary locations to install and uninstall packages by name using `.pspec` files in arbitrary locations. `os8pkg` searches for `.pspec` files in the following order: 1. The path found by treating naming the package with a POSIX path. For example: os8pkg install ~/dev/mypackage.pkg 2. A path provided with the `--destdir` option. (Which also specifies where to look the bootable image. For example: bin/os8pkg -d 10 --destdir /opt/pidp8i/share/media/os8 install mypackage 3. The path found by `$src/pspec/` (the build system default expectation.) for example: bin/os8pkg install mypackage ### Syntax Blank lines are allowed. They're ignored. A line beginning with \"#\" is ignored as a comment. Leading whitespace on a line is ignored to allow human-readability-improving indentation. ### Sections Different sections of the `.pspec` file recored different required infomation. The parser is very simple minded. Every section is parsed into the list of lines found associated with that keyword. A section begins with a line consisting solely of the keyword. Every line seen until a new keyword line is appended to the associated line list. If the parser sees a line before ever having seen a keyword line, it complains that it doesn't know what to do. There can be multiple occurrances of a section in the `.pspec` file. The parser happily just adds more lines to that sections list of lines. * `format:` The format of the package created. It needs to be a valid OS/8 device image file. Currently tu56 and rk05 are supported. It is expected that addtional formats such as rl02 and rx02 will be supported in the future. If multiple lines or instances of the `format:` section appear, the last one wins. * `inputs:` Files that are needed to build the subsystem. This is the list of dependencies passed to make. POSIX wild carding is allowed. * `outputs:` A specification of what outputs are integrated into the target media from the package file. This looks like an OS/8 command decoder file copy specification. However, no wild-carding is allowed because outputs is also used for uninstall. Wild cards on uninstall would wreck havoc. * `cleanups:` A list of files that should also be cleaned up when uninstalling a package. * `build:` A default build runs an os8-run script found in `.../scripts/misc` with a name composed from the package name, and the package format with a `.os8` extension. It includes dependencies on `.../bin/os8pkg`, the files in `inputs:`, the os8-run script, and on the OS8_TOOLTIME run image. For example: the `e8` package with the tu56 format would have a default build that would depend upon, and run `.../scripts/misc/e8-tu56.os8`. When the build: section is filled in, this default is not used. Instead a Makefile rule is created that passes in the lines found in the build: section. ### Crafting `outputs:` The challenge is to create package files that are usable in the creation of a wide variety of bootable media, and to have flexibility in the package format. To make sense of the challenge consider the questions: * How do we create a simple tu56 format image that can be used in creation of tu56 bootable images? * How do we create a rich, large sized rk05 image that can be use in creation of both tu56 and rk05 bootable images? We want to be able to have a system device mounted and the package image mounted at the same time. For this reason we synthesize the os8-run mount and copy commands presuming there will be a system device mounted on either rk0 or dt0 under SIMH, and that the package image gets mounted on either rk1 or dt1. So each `outputs:` line consists of a constrained destination device, a less than sign (pronounced "comes from" in OS/8 parlance), and constrained input specification that is aware of what `format:` we are using, and constrains the device specification. os8pkg Flags an error if the line in `outputs:` fails to meet the constraints. ### Examples #### verify Without the verbose option set, the output names the package and the target image. If successful, there is no other output. $ bin/os8pkg verify e8 Verifying package e8 on /Users/wdc/src/pidp8i/trunk/bin/v3d.rk05 With the verbose option set, the individual files are reported on: $ bin/os8pkg -v verify e8 Verifying package e8 on /Users/wdc/src/pidp8i/trunk/bin/v3d.rk05 Successful verify of SYS:E8.SV Successful verify of DSK:E8CMDS.TX Successful verify of DSK:E8SRCH.TX [os8run]: https://tangentsoft.com/pidp8i/doc/trunk/os8-run.md ### <a id="license"></a>License Copyright © 2020 by Bill Cattey. Licensed under the terms of [the SIMH license][sl]. [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | # How the PiDP-8/i Software Is Tested How do we gain confidence that what we will release is working with minimal regressions? The buld process operates in layers starting with SIMH and the OS/8 distribution DECtape image files as the lowest level. The layering goes like this: 1. Boot the OS/8 V3D Distribution DECtape image, `.../media/os8/v3d/al-4711c-ba-os8-v3d-1.1978.tu56`. This creates `v3d-dist.rk05` which is booted to continue the build process. 2. Boot `v3d-dist.rk05` to apply patches to create a useful image with the latest bug fixes, `v3d-patched.rk05`. Strictly speaking, this is the optimal, but minimum platform for continuing to build, and to operate utilities. 3. Boot `v3d-patched.rk05` to build `e8`, `cc8`, and anything else that needs OS/8. This is the platform that should be used to build V3F from source, and the OS/8 Combined Kit (OCK) from source. Creating the images used to assemble V3F and OCK from source requires `os8-cp`. 4. Install packages built with OS/8 onto runable packs. This is where `v3d-patched.rk05` becomes `v3d.rk05`. At the present moment, the component RK05 images that will be gathered into `ock-dist.rk05` have been built using `v3d-patched.rk05`. They could have been built using `v3d.rk05`. The choice is made in the build scripts. The `ock-dist.rk05` image is constructed similarly to layer 1. The `al-4711c-ba-os8-v3d-1.1978.tu56` image is booted, and used to create an RK05 image, which is then populated with the other components built in layer 3. At this point we have bootable TU56 images for V3D and V3F built from `v3d.rk05`. We also have `ock-dist.rk05` built from source. 5. Boot `ock-dist.rk05` and apply patches to create `ock-patched.rk05`. 6. Install packages such as `cc8` and `e8` on `ock-patched.rk05` to create `ock.rk05`. This completes all building. Layer 1 shows that SIMH basically works. Each subsequent layer is proof that the basic operation of the previous layer works. So a successful build of everything has provided a fair bit of coverage. The next challenge is functional tests for leaf node packages like `cc8` and `advent`. The `os8-progtest` tool tests these. The leaf node package management files live in the `pspec` subdirectory of the source tree. Tests for the packages live in `scripts/os8-progtest`. `auto.def` knows how to discover new packages and new tests and incorporate them into the `Makefile`. `Makefile` contains a `make test` target that runs `os8-progtest` on all discovered tests. |
︙ | ︙ | |||
51 52 53 54 55 56 57 | ### <a id="ls-pasting"></a>Pasting Text in from a Terminal Emulator #### The Naïve Way If you are SSHing into your PiDP-8/I, you might think to write your FOCAL programs in your favorite text editor on your client PC then copy | | | | > > | | | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | ### <a id="ls-pasting"></a>Pasting Text in from a Terminal Emulator #### The Naïve Way If you are SSHing into your PiDP-8/I, you might think to write your FOCAL programs in your favorite text editor on your client PC then copy and paste that text into U/W FOCAL over SSH. That won't work. We believe it is because of the way U/W FOCAL handles terminal I/O and interrupts, being written with the assumption that such input is coming from a 110 bps Teletype or at most a 300 bps “high-speed” paper tape reader. If you try this over a modern gigabit class SSH connection, the input ends up trashed in FOCAL. #### <a id="ls-pip"></a>The Way That Works "But I really really want to write my FOCAL programs in [my favorite text editor][mfte] and paste them into my PiDP-8/I," I hear you say. Dispair not. There is a path. Follow. The problem affecting U/W FOCAL which prevents it from handling input at modern paste-through-SSH speeds doesn't affect OS/8 itself, so we'll use it as an intermediary: .R PIP *HELLO.DA<TTY: ⇠ use default extension for O I |
︙ | ︙ | |||
877 878 879 880 881 882 883 | worthless OCR output; we *really* did not want to retype the whole thing! Additionally, we think the Manual is a better tutorial than the DECUS submission, though the DECUS submission is perhaps a better reference text. [df8]: http://www.ibiblio.org/pub/academic/computer-science/history/pdp-8/FOCL69%20Files/DEC-08-AJAD-D.pdf [f71]: http://svn.so-much-stuff.com/svn/trunk/pdp8/src/decus/focal8-177/ | | | | 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 | worthless OCR output; we *really* did not want to retype the whole thing! Additionally, we think the Manual is a better tutorial than the DECUS submission, though the DECUS submission is perhaps a better reference text. [df8]: http://www.ibiblio.org/pub/academic/computer-science/history/pdp-8/FOCL69%20Files/DEC-08-AJAD-D.pdf [f71]: http://svn.so-much-stuff.com/svn/trunk/pdp8/src/decus/focal8-177/ [hack]: https://tangentsoft.com/pidp8i/doc/trunk/CONTRIBUTING.md#patches [uwfd]: http://www.pdp8.net/pdp8cgi/query_docs/view.pl?id=191 [uwfm]: https://tangentsoft.com/pidp8i/doc/trunk/doc/uwfocal-manual.md [uwfr]: https://tangentsoft.com/pidp8i/doc/trunk/doc/uwfocal-refcards.md ### <a id="license"></a>License Copyright © 2017, 2021 by Warren Young and Bill Cattey. Licensed under the terms of [the SIMH license][sl]. [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md |
︙ | ︙ | |||
2714 2715 2716 2717 2718 2719 2720 | ## Appendix Ⅰ ### <a id="character-codes" name="ascii-table"></a>Decimal Values for All Character Codes | Code | Character | Name | Code | Char | Code | Char | Code | Char | | ---- | --------- | ---- | ---- | ------- | ---- | ---- | ---- | ----------- | | | | 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 | ## Appendix Ⅰ ### <a id="character-codes" name="ascii-table"></a>Decimal Values for All Character Codes | Code | Character | Name | Code | Char | Code | Char | Code | Char | | ---- | --------- | ---- | ---- | ------- | ---- | ---- | ---- | ----------- | | 128 | `Ctrl/@` | NULL | 160 | `SPACE` | 192 | `@` | 224 | <code>`</code> | | 129 | `Ctrl/A` | SOH | 161 | `!` | 193 | `A` | 225 | `a` | | 130 | `Ctrl/B` | STX | 162 | `"` | 194 | `B` | 226 | `b` | | 131 | `Ctrl/C` | ETX | 163 | `#` | 195 | `C` | 227 | `c` | | 132 | `Ctrl/D` | EOT | 164 | `$` | 196 | `D` | 228 | `d` | | 133 | `Ctrl/E` | ENQ | 165 | `%` | 197 | `E` | 229 | `e` | | 134 | `Ctrl/F` | ACK | 166 | `&` | 198 | `F` | 230 | `f` | | 135 | `Ctrl/G` | BELL | 167 | `'` | 199 | `G` | 231 | `g` | |
︙ | ︙ | |||
3035 3036 3037 3038 3039 3040 3041 | This in turn means that in some places I've added the `*` FOCAL prompt to make it clearer which line(s) are input and which are output. I've also added `!` operators where necessary to avoid questions about why you get `*` prompts at the end of program ouput. — [Warren Young][wy], September & October 2017, Aztec, NM, USA | | | 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 | This in turn means that in some places I've added the `*` FOCAL prompt to make it clearer which line(s) are input and which are output. I've also added `!` operators where necessary to avoid questions about why you get `*` prompts at the end of program ouput. — [Warren Young][wy], September & October 2017, Aztec, NM, USA [hack]: https://tangentsoft.com/pidp8i/doc/trunk/CONTRIBUTING.md [ocr]: https://archive.org/stream/bitsavers_decpdp8focct78_4144912/UW_FOCAL_Manual_V4E_Oct78_djvu.txt [scan]: https://archive.org/details/bitsavers_decpdp8focct78_4144912 [tkt]: https://tangentsoft.com/pidp8i/tktnew [videf]: https://en.wiktionary.org/wiki/vide_infra#Latin) [wy]: https://tangentsoft.com/ --------------------------- |
︙ | ︙ |
> > > > > | 1 2 3 4 5 | # PiDP-8/I runtime configuration file. See it README.md file or # https://tangentsoft.com/pidp8i/doc/trunk/README.md#runtime # Alternatives: none, tmux SCREEN_MANAGER=screen |
1 2 | KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service" KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service" | > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ### USB hard drives / thumb drives KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service" KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service" ### USB floppy drives # Detect a USB add with floppy disk already inserted, or a floppy disk # insertion on an existing USB drive KERNEL=="sd[a-z]", SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="08", ATTRS{bInterfaceSubClass}=="04", \ ACTION=="add|change", ENV{ID_FS_USAGE}=="filesystem" RUN+="/bin/systemctl start usb-mount@%k.service" # Detect a floppy disk ejection KERNEL=="sd[a-z]", SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="08", ATTRS{bInterfaceSubClass}=="04", \ ACTION=="change", ENV{ID_FS_USAGE}=="", RUN+="/bin/systemctl stop usb-mount@%k.service" # Detect a USB removal (floppy disk may or may not be inserted, but the # service is idempotent) KERNEL=="sd[a-z]", SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="08", ATTRS{bInterfaceSubClass}=="04", \ ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service" |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | #!/usr/bin/env python3 # Demo program for using class-os8script. # # Starts SIMH, boots the default v3d.rk05 system image. # Starts OS/8 BASIC # Engages in dialog to tell BASIC this will be a new program # called MYPROG.BA # A two line program is fed in: # 10 PRINT 1 + 2 # 20 END # and run. # The result, 3 is detected. # ^C is sent to quit out of BASIC. # Program exits cleanly. # Imports import os import sys sys.path.insert (0, os.path.dirname (__file__) + '/../lib') sys.path.insert (0, os.getcwd () + '/lib') from pidp8i import * from simh import * from os8script import * # Our replies array with the regular expressions we # expect to see. # Subtle point: We contrive the test result of "3" # with an awareness that line numbers 10, and 20 would # trigger on a test for 0, 1, or 2. _basic_replies = [ ["READY", "\r\nREADY\r\n", False], ["NEW OR OLD", "NEW OR OLD--$", False], ["FILENAME", "FILE NAME--$", False], ["BAD FILE", "BAD FILE$", False], ["ME", "ME", False], ["3 READY", "\s+3\s+READY\r\n", False], ] import argparse def main (): # Use argparse to create the args array and parse the command line. parser = argparse.ArgumentParser( description = """ Demo: BASIC program dialog under PDP-8 OS/8.""", usage = "%(prog)s [options]") parser.add_argument ("--target", help="target image file", default="v3d.rk05") parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true") args = parser.parse_args() # Path to our system image using library utilities. image_path = os.path.join(dirs.os8mo, args.target) # This should always succeed, but it's good form to catch # any failure to start SIMH. try: s = simh (dirs.build, True) except (RuntimeError) as e: print("Could not start simulator: " + e.message + '!') sys.exit (1) # If the verbose argument was set, send log output from SIMH # to the standard output. if args.verbose: s.set_logfile (os.fdopen (sys.stdout.fileno (), 'wb', 0)) # Create our os8script object, that contains our SIMH object. # Passing in the verbose flag from args, empty enable and disable arrays, # and set debug false. os8 = os8script (s, [], [], verbose=args.verbose, debug=False) # Intern our replies array called "basic" in the replies nand replies_rex # arrays within the os8 object. os8.intern_replies ("basic", _basic_replies, True) # Mount our system image # required means we quit if the image isn't found. # scratch is the concurrency protection, we make a copy of v3d.rk05 # and run inside the copy. os8.mount_command ("rk0 " + image_path + " required scratch", None) # Boot it. os8.boot_command ("rk0", None) # Perform once-only boot success check and run BASIC. # Use our replies_rex array, "basic" # Quit cleanly with status 1 if running BASIC fails. reply = os8.check_and_run ("demo", "R BASIC", "", os8.replies_rex["basic"]) if reply == -1: print ("OS/8 isn't running! Fatal error!") os8.exit_command("1", "") # To make code cleaner, we have a quit_now flag. quit_now = False # State machine to submit, run and revise a BASIC program. # We keep looping until we see the OS/8 monitor prompt. # We expect the initial run of basic is successful and we don't # get the monitor prompt, but we set our test value initially here. mon = os8.simh.test_result(reply, "Monitor Prompt", os8.replies["basic"], "") while not mon: # A verbose debugging aid: Show what we got. if args.verbose: print ("Got reply: " + os8.replies["basic"][reply][0]) if os8.simh.test_result(reply, "NEW OR OLD", os8.replies["basic"], ""): send_str = "NEW" elif os8.simh.test_result(reply, "FILENAME", os8.replies["basic"], ""): send_str = "MYPROG.BA" elif os8.simh.test_result(reply, "READY", os8.replies["basic"], ""): send_str = "10 PRINT 1 + 2\r20 END\rRUN\r" elif os8.simh.test_result(reply, "3 READY", os8.replies["basic"], ""): print ("Got Expected Result!") quit_now = True # Having a default that says oops and gets out is important # to keep evolving replies arrays from turning into infinite loops. else: print ("Unexpected result:" + os8.replies["basic"][reply][0]) quit_now = True # We carefully send ^C and look for a monitor prompt # To put the state machine in a known good state. # By taking that care, you can compose multiple state machines reliably. if quit_now: if args.verbose: print ("Sending ^C") os8.simh.os8_send_ctrl ('c') reply = os8.simh._child.expect(os8.replies_rex["basic"]) else: reply = os8.simh.os8_cmd (send_str, os8.replies_rex["basic"]) # Eventually we get our monitor prompt and exit the loop. mon = os8.simh.test_result(reply, "Monitor Prompt", os8.replies["basic"], "") # Clean up temporaries and exit with success status 0. os8.exit_command("0", "") if __name__ == "__main__": main() |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | EESchema-LIBRARY Version 2.3 Date: 12/22/2018 8:34:02 PM #encoding utf-8 # # +3.3V # DEF +3.3V #PWR 0 0 Y Y 1 F P F0 "#PWR" 0 -40 30 H I C CNN F1 "+3.3V" 0 110 30 H V C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN ALIAS +3,3V DRAW X +3.3V 1 0 0 0 U 30 30 0 0 W N C 0 60 20 0 1 0 N P 3 0 1 0 0 0 0 40 0 40 N ENDDRAW ENDDEF # # +5V # DEF +5V #PWR 0 40 Y Y 1 F P F0 "#PWR" 0 90 20 H I C CNN F1 "+5V" 0 90 30 H V C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN DRAW X +5V 1 0 0 0 U 20 20 0 0 W N C 0 50 20 0 1 0 N P 4 0 1 0 0 0 0 30 0 30 0 30 N ENDDRAW ENDDEF # # CONN_1 # DEF ~CONN_1 P 0 30 N N 1 F N F0 "P" 80 0 40 H V L CNN F1 "CONN_1" 0 55 30 H I C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN DRAW C 0 0 31 0 1 0 N P 2 0 1 0 -30 0 -50 0 N X 1 1 -150 0 100 R 60 60 1 1 P ENDDRAW ENDDEF # # CONN_4 # DEF CONN_4 P 0 40 Y N 1 F N F0 "P" -50 0 50 V V C CNN F1 "CONN_4" 50 0 50 V V C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN DRAW S -100 200 100 -200 0 1 0 N X P1 1 -350 150 250 R 50 50 1 1 P I X P2 2 -350 50 250 R 50 50 1 1 P I X P3 3 -350 -50 250 R 50 50 1 1 P I X P4 4 -350 -150 250 R 50 50 1 1 P I ENDDRAW ENDDEF # # DIODE # DEF DIODE D 0 40 N N 1 F N F0 "D" 0 100 40 H V C CNN F1 "DIODE" 0 -100 40 H V C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN $FPLIST D? S* $ENDFPLIST DRAW P 2 0 1 6 50 50 50 -50 N P 3 0 1 0 -50 50 50 0 -50 -50 F X A 1 -200 0 150 R 40 40 1 1 P X K 2 200 0 150 L 40 40 1 1 P ENDDRAW ENDDEF # # GND # DEF ~GND #PWR 0 0 Y Y 1 F P F0 "#PWR" 0 0 30 H I C CNN F1 "GND" 0 -70 30 H I C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN DRAW P 4 0 1 0 -50 0 0 -50 50 0 -50 0 N X GND 1 0 0 0 U 30 30 1 1 W N ENDDRAW ENDDEF # # LED # DEF LED D 0 40 Y N 1 F N F0 "D" 0 100 50 H V C CNN F1 "LED" 0 -100 50 H V C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN $FPLIST LED-3MM LED-5MM LED-10MM LED-0603 LED-0805 LED-1206 LEDV $ENDFPLIST DRAW P 2 0 1 0 50 50 50 -50 N P 3 0 1 0 -50 50 50 0 -50 -50 F P 3 0 1 0 65 -40 110 -80 105 -55 N P 3 0 1 0 80 -25 125 -65 120 -40 N X A 1 -200 0 150 R 40 40 1 1 P X K 2 200 0 150 L 40 40 1 1 P ENDDRAW ENDDEF # # R # DEF R R 0 0 N Y 1 F N F0 "R" 80 0 40 V V C CNN F1 "R" 7 1 40 V V C CNN F2 "~" -70 0 30 V V C CNN F3 "~" 0 0 30 H V C CNN $FPLIST R? SM0603 SM0805 R?-* SM1206 $ENDFPLIST DRAW S -40 150 40 -150 0 1 12 N X ~ 1 0 250 100 D 60 60 1 1 P X ~ 2 0 -250 100 U 60 60 1 1 P ENDDRAW ENDDEF # # RASPI_MODEL_B_PLUS_GPIO # DEF RASPI_MODEL_B_PLUS_GPIO P 0 10 Y Y 1 F N F0 "P" 0 1050 60 H V C CNN F1 "RASPI_MODEL_B_PLUS_GPIO" 0 0 20 V V C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN DRAW S -100 1000 100 -1000 0 1 0 N X 3.3v 1 -400 950 300 R 60 30 1 1 w I X 5v 2 400 950 300 L 60 30 1 1 w I X g2 3 -400 850 300 R 60 30 1 1 P I X 5v 4 400 850 300 L 60 30 1 1 P I X g3 5 -400 750 300 R 60 30 1 1 P I X GND 6 400 750 300 L 60 30 1 1 w I X g4 7 -400 650 300 R 60 30 1 1 P I X g14 8 400 650 300 L 60 30 1 1 P I X GND 9 -400 550 300 R 60 30 1 1 P I X g15 10 400 550 300 L 60 30 1 1 P I X GND 20 400 50 300 L 60 30 1 1 P I X GND 30 400 -450 300 L 60 30 1 1 P I X g21 40 400 -950 300 L 60 30 1 1 P I X g17 11 -400 450 300 R 60 30 1 1 P I X g9 21 -400 -50 300 R 60 30 1 1 P I X g6 31 -400 -550 300 R 60 30 1 1 P I X g18 12 400 450 300 L 60 30 1 1 P I X g25 22 400 -50 300 L 60 30 1 1 P I X g12 32 400 -550 300 L 60 30 1 1 P I X g27 13 -400 350 300 R 60 30 1 1 P I X g11 23 -400 -150 300 R 60 30 1 1 P I X g13 33 -400 -650 300 R 60 30 1 1 P I X GND 14 400 350 300 L 60 30 1 1 P I X g8 24 400 -150 300 L 60 30 1 1 P I X GND 34 400 -650 300 L 60 30 1 1 P I X g22 15 -400 250 300 R 60 30 1 1 P I X GND 25 -400 -250 300 R 60 30 1 1 P I X g19 35 -400 -750 300 R 60 30 1 1 P I X g23 16 400 250 300 L 60 30 1 1 P I X g7 26 400 -250 300 L 60 30 1 1 P I X g16 36 400 -750 300 L 60 30 1 1 P I X 3.3v 17 -400 150 300 R 60 30 1 1 P I X n/c 27 -400 -350 300 R 60 30 1 1 P I X g26 37 -400 -850 300 R 60 30 1 1 P I X g24 18 400 150 300 L 60 30 1 1 P I X n/c 28 400 -350 300 L 60 30 1 1 P I X g20 38 400 -850 300 L 60 30 1 1 P I X g10 19 -400 50 300 R 60 30 1 1 P I X g5 29 -400 -450 300 R 60 30 1 1 P I X GND 39 -400 -950 300 R 60 30 1 1 P I ENDDRAW ENDDEF # # SWITCH_INV # DEF SWITCH_INV SW 0 0 N Y 1 F N F0 "SW" -200 150 50 H V C CNN F1 "SWITCH_INV" -150 -150 50 H V C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN DRAW C -150 0 50 0 0 0 N C 150 -100 50 0 0 0 N C 150 100 50 0 1 0 N P 2 0 1 0 -100 0 150 50 N X 1 1 500 100 300 L 60 60 1 1 P X 2 2 -500 0 300 R 60 60 1 1 P X 3 3 500 -100 300 L 60 60 1 1 P ENDDRAW ENDDEF # # UDN2981A # DEF UDN2981A P 0 40 Y Y 1 F N F0 "P" 0 550 30 H V C CNN F1 "UDN2981A" 0 -550 30 H V C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN DRAW S -150 500 150 -500 0 1 0 N X IN1 1 -350 400 200 R 40 20 1 1 I I X IN2 2 -350 300 200 R 40 20 1 1 I I X IN3 3 -350 200 200 R 40 20 1 1 I I X IN4 4 -350 100 200 R 40 20 1 1 I I X IN5 5 -350 0 200 R 40 20 1 1 I I X IN6 6 -350 -100 200 R 40 20 1 1 I I X IN7 7 -350 -200 200 R 40 20 1 1 I I X IN8 8 -350 -300 200 R 40 20 1 1 I I X Vs 9 -350 -400 200 R 40 20 1 1 P I X GND 10 350 -400 200 L 40 20 1 1 P I X OUT8 11 350 -300 200 L 40 20 1 1 O I X OUT7 12 350 -200 200 L 40 20 1 1 O I X OUT6 13 350 -100 200 L 40 20 1 1 O I X OUT5 14 350 0 200 L 40 20 1 1 O I X OUT4 15 350 100 200 L 40 20 1 1 O I X OUT3 16 350 200 200 L 40 20 1 1 O I X OUT2 17 350 300 200 L 40 20 1 1 O I X OUT1 18 350 400 200 L 40 20 1 1 O I ENDDRAW ENDDEF # #End Library |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | EESchema-LIBRARY Version 2.4 #encoding utf-8 # # +3.3V # DEF +3.3V #PWR 0 0 Y Y 1 F P F0 "#PWR" 0 -40 30 H I C CNN F1 "+3.3V" 0 110 30 H V C CNN F2 "" 0 0 60 H V C CNN F3 "" 0 0 60 H V C CNN DRAW C 0 60 20 0 1 0 N P 3 0 1 0 0 0 0 40 0 40 N X +3.3V 1 0 0 0 U 30 30 0 0 W N ENDDRAW ENDDEF # # +5V # DEF +5V #PWR 0 40 Y Y 1 F P F0 "#PWR" 0 90 20 H I C CNN F1 "+5V" 0 90 30 H V C CNN F2 "" 0 0 60 H V C CNN F3 "" 0 0 60 H V C CNN DRAW C 0 50 20 0 1 0 N P 4 0 1 0 0 0 0 30 0 30 0 30 N X +5V 1 0 0 0 U 20 20 0 0 W N ENDDRAW ENDDEF # # CONN_1 # DEF CONN_1 P 0 30 N N 1 F N F0 "P" 80 0 40 H V L CNN F1 "CONN_1" 0 55 30 H I C CNN F2 "" 0 0 60 H V C CNN F3 "" 0 0 60 H V C CNN DRAW C 0 0 31 0 1 0 N P 2 0 1 0 -30 0 -50 0 N X 1 1 -150 0 100 R 60 60 1 1 P ENDDRAW ENDDEF # # CONN_4 # DEF CONN_4 P 0 40 Y N 1 F N F0 "P" -50 0 50 V V C CNN F1 "CONN_4" 50 0 50 V V C CNN F2 "" 0 0 60 H V C CNN F3 "" 0 0 60 H V C CNN DRAW S -100 200 100 -200 0 1 0 N X P1 1 -350 150 250 R 50 50 1 1 P I X P2 2 -350 50 250 R 50 50 1 1 P I X P3 3 -350 -50 250 R 50 50 1 1 P I X P4 4 -350 -150 250 R 50 50 1 1 P I ENDDRAW ENDDEF # # DIODE # DEF DIODE D 0 40 N N 1 F N F0 "D" 0 100 40 H V C CNN F1 "DIODE" 0 -100 40 H V C CNN F2 "" 0 0 60 H V C CNN F3 "" 0 0 60 H V C CNN $FPLIST D? S* $ENDFPLIST DRAW P 2 0 1 6 50 50 50 -50 N P 3 0 1 0 -50 50 50 0 -50 -50 F X A 1 -200 0 150 R 40 40 1 1 P X K 2 200 0 150 L 40 40 1 1 P ENDDRAW ENDDEF # # GND # DEF GND #PWR 0 0 Y Y 1 F P F0 "#PWR" 0 0 30 H I C CNN F1 "GND" 0 -70 30 H I C CNN F2 "" 0 0 60 H V C CNN F3 "" 0 0 60 H V C CNN DRAW P 4 0 1 0 -50 0 0 -50 50 0 -50 0 N X GND 1 0 0 0 U 30 30 1 1 W N ENDDRAW ENDDEF # # LED # DEF LED D 0 40 Y N 1 F N F0 "D" 0 100 50 H V C CNN F1 "LED" 0 -100 50 H V C CNN F2 "" 0 0 60 H V C CNN F3 "" 0 0 60 H V C CNN $FPLIST LED-3MM LED-5MM LED-10MM LED-0603 LED-0805 LED-1206 LEDV $ENDFPLIST DRAW P 2 0 1 0 50 50 50 -50 N P 3 0 1 0 -50 50 50 0 -50 -50 F P 3 0 1 0 65 -40 110 -80 105 -55 N P 3 0 1 0 80 -25 125 -65 120 -40 N X A 1 -200 0 150 R 40 40 1 1 P X K 2 200 0 150 L 40 40 1 1 P ENDDRAW ENDDEF # # R # DEF R R 0 0 N Y 1 F N F0 "R" 80 0 40 V V C CNN F1 "R" 7 1 40 V V C CNN F2 "" -70 0 30 V V C CNN F3 "" 0 0 30 H V C CNN $FPLIST R? SM0603 SM0805 R?-* SM1206 $ENDFPLIST DRAW S -40 150 40 -150 0 1 12 N X ~ 1 0 250 100 D 60 60 1 1 P X ~ 2 0 -250 100 U 60 60 1 1 P ENDDRAW ENDDEF # # SWITCH_INV # DEF SWITCH_INV SW 0 0 N Y 1 F N F0 "SW" -200 150 50 H V C CNN F1 "SWITCH_INV" -150 -150 50 H V C CNN F2 "" 0 0 60 H V C CNN F3 "" 0 0 60 H V C CNN DRAW C -150 0 50 0 0 0 N C 150 -100 50 0 0 0 N C 150 100 50 0 1 0 N P 2 0 1 0 -100 0 150 50 N X 1 1 500 100 300 L 60 60 1 1 P X 2 2 -500 0 300 R 60 60 1 1 P X 3 3 500 -100 300 L 60 60 1 1 P ENDDRAW ENDDEF # #End Library |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 | Cmp-Mod V01 Created by CvPcb (2013-07-07 BZR 4022)-stable date = 12/22/2018 8:34:06 PM BeginCmp TimeStamp = /54904DF0; Reference = D1; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /5490504C; Reference = D2; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /54905056; Reference = D3; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /5490505E; Reference = D4; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /54905068; Reference = D5; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /5490506E; Reference = D6; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /549055F9; Reference = D7; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /549055FF; Reference = D8; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /54905605; Reference = D9; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /5490560B; Reference = D10; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /54905611; Reference = D11; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /54905640; Reference = D12; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /54905646; Reference = D13; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /5490564C; Reference = D14; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /54905652; Reference = D15; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /54905658; Reference = D16; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /5490565E; Reference = D17; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /54905664; Reference = D18; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /549070C3; Reference = D19; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /549070C9; Reference = D20; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /549070CF; Reference = D21; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /549070D5; Reference = D22; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /549070DB; Reference = D23; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /549070E1; Reference = D24; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /549070E7; Reference = D25; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /549070ED; Reference = D26; ValeurCmp = 1N4148; IdModule = D2; EndCmp BeginCmp TimeStamp = /548EF5CC; Reference = DAC1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5E5; Reference = DAC2; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5EB; Reference = DAC3; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5F1; Reference = DAC4; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5F7; Reference = DAC5; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5FD; Reference = DAC6; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF603; Reference = DAC7; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF609; Reference = DAC8; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF60F; Reference = DAC9; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF615; Reference = DAC10; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF61B; Reference = DAC11; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF621; Reference = DAC12; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF728; Reference = DAND1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF7E9; Reference = DBREAK1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF7E3; Reference = DCURAD1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF741; Reference = DDCA1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF7D7; Reference = DDEFER1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF6DA; Reference = DDF1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF6F3; Reference = DDF2; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF6F9; Reference = DDF3; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF7D1; Reference = DEXEC1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF7CB; Reference = DFETCH1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF701; Reference = DIF1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF71A; Reference = DIF2; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF720; Reference = DIF3; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF837; Reference = DION1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF783; Reference = DIOT1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF73B; Reference = DISZ1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF77D; Reference = DJMP1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF777; Reference = DJMS1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF686; Reference = DLINK1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF463; Reference = DMA1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF47C; Reference = DMA2; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF482; Reference = DMA3; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF488; Reference = DMA4; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF48E; Reference = DMA5; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF494; Reference = DMA6; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF49A; Reference = DMA7; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF4A0; Reference = DMA8; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF4A6; Reference = DMA9; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF4AC; Reference = DMA10; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF4B2; Reference = DMA11; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF4B8; Reference = DMA12; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF56F; Reference = DMB1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF588; Reference = DMB2; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF58E; Reference = DMB3; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF594; Reference = DMB4; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF59A; Reference = DMB5; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5A0; Reference = DMB6; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5A6; Reference = DMB7; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5AC; Reference = DMB8; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5B2; Reference = DMB9; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5B8; Reference = DMB10; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5BE; Reference = DMB11; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF5C4; Reference = DMB12; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF629; Reference = DMQ1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF642; Reference = DMQ2; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF648; Reference = DMQ3; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF64E; Reference = DMQ4; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF654; Reference = DMQ5; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF65A; Reference = DMQ6; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF660; Reference = DMQ7; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF666; Reference = DMQ8; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF66C; Reference = DMQ9; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF672; Reference = DMQ10; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF678; Reference = DMQ11; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF67E; Reference = DMQ12; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF789; Reference = DOPR1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF83D; Reference = DPAUSE1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /554E5897; Reference = DPAUSE2; ValeurCmp = LED; IdModule = LED-3-StrEight; EndCmp BeginCmp TimeStamp = /548EF34A; Reference = DPC1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF399; Reference = DPC2; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF3AC; Reference = DPC3; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF3B2; Reference = DPC4; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF3B8; Reference = DPC5; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF3BE; Reference = DPC6; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF3C4; Reference = DPC7; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF3CA; Reference = DPC8; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF3D0; Reference = DPC9; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF3D6; Reference = DPC10; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF3DC; Reference = DPC11; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF3E2; Reference = DPC12; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF843; Reference = DRUN1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /554E589D; Reference = DRUN2; ValeurCmp = LED; IdModule = LED-3-StrEight; EndCmp BeginCmp TimeStamp = /548EF6A1; Reference = DSC1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF6BA; Reference = DSC2; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF6C0; Reference = DSC3; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF6C6; Reference = DSC4; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF6CC; Reference = DSC5; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF735; Reference = DTAD1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /548EF7DD; Reference = DWRDCT1; ValeurCmp = LED; IdModule = LED-3-PDP; EndCmp BeginCmp TimeStamp = /54BD85A3; Reference = DZ1; ValeurCmp = ZENER; IdModule = D2; EndCmp BeginCmp TimeStamp = /54B1CC4A; Reference = M1; ValeurCmp = M; IdModule = 1pin; EndCmp BeginCmp TimeStamp = /54B1CC76; Reference = M2; ValeurCmp = M; IdModule = 1pin; EndCmp BeginCmp TimeStamp = /54B1CC7C; Reference = M3; ValeurCmp = M; IdModule = 1pin; EndCmp BeginCmp TimeStamp = /54B1CC82; Reference = M4; ValeurCmp = M; IdModule = 1pin; EndCmp BeginCmp TimeStamp = /54BD36C6; Reference = M5; ValeurCmp = M; IdModule = 1pin; EndCmp BeginCmp TimeStamp = /54BD36CC; Reference = M6; ValeurCmp = M; IdModule = 1pin; EndCmp BeginCmp TimeStamp = /54BD36D2; Reference = M7; ValeurCmp = M; IdModule = 1pin; EndCmp BeginCmp TimeStamp = /548F13F7; Reference = P1; ValeurCmp = RASPI_MODEL_B_PLUS_GPIO; IdModule = RASPI_BPLUS_MIRRORED; EndCmp BeginCmp TimeStamp = /54B17386; Reference = P2; ValeurCmp = UDN2981A; IdModule = DIP-18__300; EndCmp BeginCmp TimeStamp = /5C1DA337; Reference = P3; ValeurCmp = CONN_4; IdModule = PIN_ARRAY_4x1; EndCmp BeginCmp TimeStamp = /5490833D; Reference = R1; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /5490834A; Reference = R2; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /54908350; Reference = R3; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /54908356; Reference = R4; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /5490835C; Reference = R5; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /54908362; Reference = R6; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /54908368; Reference = R7; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /5490836E; Reference = R8; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /54908374; Reference = R9; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /5490837A; Reference = R10; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /54908380; Reference = R11; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /54908386; Reference = R12; ValeurCmp = 390; IdModule = R3; EndCmp BeginCmp TimeStamp = /5490838C; Reference = R_ROW1; ValeurCmp = 1K; IdModule = R3; EndCmp BeginCmp TimeStamp = /5490839E; Reference = R_ROW2; ValeurCmp = 1K; IdModule = R3; EndCmp BeginCmp TimeStamp = /549083A4; Reference = R_ROW3; ValeurCmp = 1K; IdModule = R3; EndCmp BeginCmp TimeStamp = /548EFBFD; Reference = SW1; ValeurCmp = DF1; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFC03; Reference = SW2; ValeurCmp = DF2; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFC09; Reference = SW3; ValeurCmp = DF3; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFC0F; Reference = SW4; ValeurCmp = IF1; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFC15; Reference = SW5; ValeurCmp = IF2; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFC1B; Reference = SW6; ValeurCmp = IF3; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFAF8; Reference = SW7; ValeurCmp = SR1; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFB27; Reference = SW8; ValeurCmp = SR2; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFB2D; Reference = SW9; ValeurCmp = SR3; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFB33; Reference = SW10; ValeurCmp = SR4; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFB42; Reference = SW11; ValeurCmp = SR5; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFB48; Reference = SW12; ValeurCmp = SR6; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFB4E; Reference = SW13; ValeurCmp = SR7; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFB54; Reference = SW14; ValeurCmp = SR8; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFB5A; Reference = SW15; ValeurCmp = SR9; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFB60; Reference = SW16; ValeurCmp = SR10; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFB66; Reference = SW17; ValeurCmp = SR11; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EFB6C; Reference = SW18; ValeurCmp = SR12; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EF86F; Reference = SW19; ValeurCmp = START; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EF87C; Reference = SW20; ValeurCmp = LOAD_ADD; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EF882; Reference = SW21; ValeurCmp = DEP; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EF888; Reference = SW22; ValeurCmp = EXAM; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EF88E; Reference = SW23; ValeurCmp = CONT; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EF894; Reference = SW24; ValeurCmp = STOP; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EF89A; Reference = SW25; ValeurCmp = SING_STEP; IdModule = SW_PIDP2019; EndCmp BeginCmp TimeStamp = /548EF8A0; Reference = SW26; ValeurCmp = SING_INST; IdModule = SW_PIDP2019; EndCmp EndListe |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 | (pcb C:\temp49\pidp8\PDP8KICAD2019\PDP8_2019.dsn (parser (string_quote ") (space_in_quoted_tokens on) (host_cad "KiCad's Pcbnew") (host_version "(2013-07-07 BZR 4022)-stable") ) (resolution um 10) (unit um) (structure (layer F.Cu (type signal) (property (index 0) ) ) (layer B.Cu (type signal) (property (index 1) ) ) (boundary (path pcb 0 9500 -174500 9500 -65800 290000 -65800 290000 -174500 9500 -174500) ) (keepout "" (polygon B.Cu 0 288000 -140000 284000 -140000 284000 -156000 288000 -156000)) (keepout "" (polygon F.Cu 0 288000 -140000 284000 -140000 284000 -156000 288000 -156000)) (keepout "" (polygon B.Cu 0 24000 -162000 16000 -162000 16000 -156200 9800 -156200 9800 -141400 13000 -141400 13000 -137800 20600 -137800 24000 -141200)) (keepout "" (polygon F.Cu 0 24000 -162000 16000 -162000 16000 -156200 9800 -156200 9800 -141400 13000 -141400 13000 -137800 20600 -137800 24000 -141200)) (via "Via[0-1]_889:635_um" "Via[0-1]_889:0_um") (rule (width 508) (clearance 254.1) (clearance 254.1 (type default_smd)) (clearance 63.5 (type smd_smd)) ) ) (placement (component R3 (place R9 174100 -121725 back 0 (PN 390)) (place R1 94050 -121975 back 0 (PN 390)) (place R2 104100 -121975 back 0 (PN 390)) (place R3 114100 -121975 back 180 (PN 390)) (place R4 124100 -121925 back 180 (PN 390)) (place R5 134050 -121925 back 180 (PN 390)) (place R6 144150 -121875 back 180 (PN 390)) (place R7 154100 -121875 back 0 (PN 390)) (place R8 164050 -121825 back 0 (PN 390)) (place R10 184000 -121675 back 0 (PN 390)) (place R11 194050 -121625 back 0 (PN 390)) (place R12 204050 -121625 back 0 (PN 390)) (place R_ROW1 189250 -148450 back 0 (PN 1K)) (place R_ROW2 79000 -148500 front 180 (PN 1K)) (place R_ROW3 229000 -148450 back 180 (PN 1K)) ) (component "DIP-18__300" (place P2 266800 -139800 front 0 (PN UDN2981A)) ) (component 1pin (place M1 13500 -70000 front 0 (PN M)) (place M2 13500 -159000 front 0 (PN M)) (place M3 286000 -70000 front 0 (PN M)) (place M4 286000 -159000 front 0 (PN M)) (place M5 207100 -82600 front 0 (PN M)) ) (component D2 (place D23 249080 -172150 front 0 (PN 1N4148)) (place D24 259080 -172150 front 0 (PN 1N4148)) (place D22 239080 -172150 front 0 (PN 1N4148)) (place D25 269080 -172150 front 0 (PN 1N4148)) (place D26 279080 -172150 front 0 (PN 1N4148)) (place D12 139080 -172150 front 0 (PN 1N4148)) (place D2 39080 -172150 front 0 (PN 1N4148)) (place D3 49080 -172150 front 0 (PN 1N4148)) (place D4 59080 -172150 front 0 (PN 1N4148)) (place D5 69080 -172150 front 0 (PN 1N4148)) (place D6 79080 -172150 front 0 (PN 1N4148)) (place D7 89080 -172150 front 0 (PN 1N4148)) (place D8 99080 -172150 front 0 (PN 1N4148)) (place D9 109080 -172150 front 0 (PN 1N4148)) (place D10 119080 -172150 front 0 (PN 1N4148)) (place D11 129080 -172150 front 0 (PN 1N4148)) (place D1 29080 -172150 front 0 (PN 1N4148)) (place D13 149080 -172150 front 0 (PN 1N4148)) (place D14 159080 -172150 front 0 (PN 1N4148)) (place D15 169080 -172150 front 0 (PN 1N4148)) (place D16 179080 -172150 front 0 (PN 1N4148)) (place D17 189080 -172150 front 0 (PN 1N4148)) (place D18 199080 -172150 front 0 (PN 1N4148)) (place D19 209080 -172150 front 0 (PN 1N4148)) (place D20 219080 -172150 front 0 (PN 1N4148)) (place D21 229080 -172150 front 0 (PN 1N4148)) (place DZ1 244250 -143900 back 180 (PN ZENER)) ) (component "LED-3-PDP" (place DMB9 169000 -99800 front 0 (PN LED)) (place DMB10 179000 -99800 front 0 (PN LED)) (place DMB11 189000 -99800 front 0 (PN LED)) (place DMB12 199000 -99800 front 0 (PN LED)) (place DAC1 89000 -114400 front 0 (PN LED)) (place DAC2 99000 -114400 front 0 (PN LED)) (place DAC3 109000 -114400 front 0 (PN LED)) (place DAC4 119000 -114400 front 0 (PN LED)) (place DAC5 129000 -114400 front 0 (PN LED)) (place DAC6 139000 -114400 front 0 (PN LED)) (place DAC7 149000 -114400 front 0 (PN LED)) (place DAC8 159000 -114400 front 0 (PN LED)) (place DAC9 169000 -114400 front 0 (PN LED)) (place DAC10 179000 -114400 front 0 (PN LED)) (place DPC1 89000 -70600 front 0 (PN LED)) (place DAC12 199000 -114400 front 0 (PN LED)) (place DMQ1 89000 -129000 front 0 (PN LED)) (place DMQ2 99000 -129000 front 0 (PN LED)) (place DMQ3 109000 -129000 front 0 (PN LED)) (place DMQ4 119000 -129000 front 0 (PN LED)) (place DMQ5 129000 -129000 front 0 (PN LED)) (place DMQ6 139000 -129000 front 0 (PN LED)) (place DMQ7 149000 -129000 front 0 (PN LED)) (place DMQ8 159000 -129000 front 0 (PN LED)) (place DMQ9 169000 -129000 front 0 (PN LED)) (place DMQ10 179000 -129000 front 0 (PN LED)) (place DMQ11 189000 -129000 front 0 (PN LED)) (place DMQ12 199000 -129000 front 0 (PN LED)) (place DLINK1 79000 -114400 front 0 (PN LED)) (place DSC1 29000 -129000 front 0 (PN LED)) (place DAC11 189000 -114400 front 0 (PN LED)) (place DPC2 99000 -70600 front 0 (PN LED)) (place DPC3 109000 -70600 front 0 (PN LED)) (place DPC4 119000 -70600 front 0 (PN LED)) (place DPC5 129000 -70600 front 0 (PN LED)) (place DPC6 139000 -70600 front 0 (PN LED)) (place DPC7 149000 -70600 front 0 (PN LED)) (place DPC8 159000 -70600 front 0 (PN LED)) (place DPC9 169000 -70600 front 0 (PN LED)) (place DPC10 179000 -70600 front 0 (PN LED)) (place DPC11 189000 -70600 front 0 (PN LED)) (place DPC12 199000 -70600 front 0 (PN LED)) (place DMA1 89000 -85200 front 0 (PN LED)) (place DMA2 99000 -85200 front 0 (PN LED)) (place DMA3 109000 -85200 front 0 (PN LED)) (place DMB8 159000 -99800 front 0 (PN LED)) (place DMA5 129000 -85200 front 0 (PN LED)) (place DMA6 139000 -85200 front 0 (PN LED)) (place DMA7 149000 -85200 front 0 (PN LED)) (place DMA8 159000 -85200 front 0 (PN LED)) (place DMA9 169000 -85200 front 0 (PN LED)) (place DMA10 179000 -85200 front 0 (PN LED)) (place DMA11 189000 -85200 front 0 (PN LED)) (place DMA12 199000 -85200 front 0 (PN LED)) (place DMB1 89000 -99800 front 0 (PN LED)) (place DMB2 99000 -99800 front 0 (PN LED)) (place DMB3 109000 -99800 front 0 (PN LED)) (place DMB4 119000 -99800 front 0 (PN LED)) (place DMB5 129000 -99800 front 0 (PN LED)) (place DMB6 139000 -99800 front 0 (PN LED)) (place DMB7 149000 -99800 front 0 (PN LED)) (place DMA4 119000 -85200 front 0 (PN LED)) (place DRUN1 279000 -85200 front 0 (PN LED)) (place DPAUSE1 279000 -77900 front 0 (PN LED)) (place DION1 279000 -70600 front 0 (PN LED)) (place DBREAK1 259000 -107100 front 0 (PN LED)) (place DCURAD1 259000 -99800 front 0 (PN LED)) (place DWRDCT1 259000 -92500 front 0 (PN LED)) (place DDEFER1 259000 -85200 front 0 (PN LED)) (place DEXEC1 259000 -77900 front 0 (PN LED)) (place DFETCH1 259000 -70600 front 0 (PN LED)) (place DOPR1 239000 -121400 front 0 (PN LED)) (place DIOT1 239000 -114200 front 0 (PN LED)) (place DJMP1 239000 -107000 front 0 (PN LED)) (place DJMS1 239000 -99800 front 0 (PN LED)) (place DDCA1 239000 -92500 front 0 (PN LED)) (place DSC2 39000 -129000 front 0 (PN LED)) (place DSC4 59000 -129000 front 0 (PN LED)) (place DSC5 69000 -129000 front 0 (PN LED)) (place DDF1 29000 -70600 front 0 (PN LED)) (place DDF2 39000 -70600 front 0 (PN LED)) (place DDF3 49000 -70600 front 0 (PN LED)) (place DSC3 49000 -129000 front 0 (PN LED)) (place DTAD1 239000 -77900 front 0 (PN LED)) (place DAND1 239000 -70600 front 0 (PN LED)) (place DISZ1 239000 -85200 front 0 (PN LED)) (place DIF2 69000 -70600 front 0 (PN LED)) (place DIF3 79000 -70600 front 0 (PN LED)) (place DIF1 59000 -70600 front 0 (PN LED)) ) (component "LED-3-StrEight" (place DPAUSE2 259000 -114400 front 0 (PN LED)) (place DRUN2 259000 -121700 front 0 (PN LED)) ) (component RASPI_BPLUS_MIRRORED (place P1 216300 -140000 back 0 (PN RASPI_MODEL_B_PLUS_GPIO)) ) (component PIN_ARRAY_4x1 (place P3 236626 -135230 back 0 (PN CONN_4)) ) (component SW_PIDP2019 (place SW6 79000 -159900 front 0 (PN IF3)) (place SW5 69000 -159900 front 0 (PN IF2)) (place SW4 59000 -159900 front 0 (PN IF1)) (place SW3 49000 -159900 front 0 (PN DF3)) (place SW2 39000 -159900 front 0 (PN DF2)) (place SW1 29000 -159900 front 0 (PN DF1)) (place SW18 199000 -159900 front 0 (PN SR12)) (place SW17 189000 -159900 front 0 (PN SR11)) (place SW15 169000 -159900 front 0 (PN SR9)) (place SW14 159000 -159900 front 0 (PN SR8)) (place SW13 149000 -159900 front 0 (PN SR7)) (place SW12 139000 -159900 front 0 (PN SR6)) (place SW19 209000 -159900 front 0 (PN START)) (place SW20 219000 -159900 front 0 (PN LOAD_ADD)) (place SW16 179000 -159900 front 0 (PN SR10)) (place SW22 239000 -159900 front 0 (PN EXAM)) (place SW23 249000 -159900 front 0 (PN CONT)) (place SW24 259000 -159900 front 0 (PN STOP)) (place SW25 269000 -159900 front 0 (PN SING_STEP)) (place SW26 279000 -159900 front 0 (PN SING_INST)) (place SW7 89000 -159900 front 0 (PN SR1)) (place SW8 99000 -159900 front 0 (PN SR2)) (place SW9 109000 -159900 front 0 (PN SR3)) (place SW10 119000 -159900 front 0 (PN SR4)) (place SW11 129000 -159900 front 0 (PN SR5)) (place SW21 229000 -159900 front 0 (PN DEP)) ) ) (library (image R3 (outline (path signal 203.2 -3810 0 -3302 0)) (outline (path signal 203.2 3810 0 3302 0)) (outline (path signal 203.2 3302 0 3302 1016)) (outline (path signal 203.2 3302 1016 -3302 1016)) (outline (path signal 203.2 -3302 1016 -3302 -1016)) (outline (path signal 203.2 -3302 -1016 3302 -1016)) (outline (path signal 203.2 3302 -1016 3302 0)) (outline (path signal 203.2 -3302 508 -2794 1016)) (pin Round[A]Pad_1397_um 1 -3810 0) (pin Round[A]Pad_1397_um 2 3810 0) ) (image "DIP-18__300" (outline (path signal 381 -12700 1270 -11430 1270)) (outline (path signal 381 -11430 1270 -11430 -1270)) (outline (path signal 381 -11430 -1270 -12700 -1270)) (outline (path signal 381 -12700 2540 12700 2540)) (outline (path signal 381 12700 2540 12700 -2540)) (outline (path signal 381 12700 -2540 -12700 -2540)) (outline (path signal 381 -12700 -2540 -12700 2540)) (pin Rect[A]Pad_1397x1397_um 1 -10160 -3810) (pin Round[A]Pad_1397_um 2 -7620 -3810) (pin Round[A]Pad_1397_um 3 -5080 -3810) (pin Round[A]Pad_1397_um 4 -2540 -3810) (pin Round[A]Pad_1397_um 5 0 -3810) (pin Round[A]Pad_1397_um 6 2540 -3810) (pin Round[A]Pad_1397_um 7 5080 -3810) (pin Round[A]Pad_1397_um 8 7620 -3810) (pin Round[A]Pad_1397_um 9 10160 -3810) (pin Round[A]Pad_1397_um 10 10160 3810) (pin Round[A]Pad_1397_um 11 7620 3810) (pin Round[A]Pad_1397_um 12 5080 3810) (pin Round[A]Pad_1397_um 13 2540 3810) (pin Round[A]Pad_1397_um 14 0 3810) (pin Round[A]Pad_1397_um 15 -2540 3810) (pin Round[A]Pad_1397_um 16 -5080 3810) (pin Round[A]Pad_1397_um 17 -7620 3810) (pin Round[A]Pad_1397_um 18 -10160 3810) ) (image 1pin (outline (path signal 381 2286 0 2174.11 -706.412 1849.41 -1343.68 1343.68 -1849.41 706.412 -2174.11 0 -2286 -706.412 -2174.11 -1343.68 -1849.41 -1849.41 -1343.68 -2174.11 -706.412 -2286 0 -2174.11 706.412 -1849.41 1343.68 -1343.68 1849.41 -706.412 2174.11 0 2286 706.412 2174.11 1343.68 1849.41 1849.41 1343.68 2174.11 706.412)) (pin Round[A]Pad_4064_um 1 0 0) ) (image D2 (outline (path signal 304.8 -2032 -1016 2032 -1016)) (outline (path signal 304.8 -2032 1016 2032 1016)) (outline (path signal 304.8 2794 0 2032 0)) (outline (path signal 304.8 2032 0 2032 1016)) (outline (path signal 304.8 -2032 1016 -2032 0)) (outline (path signal 304.8 -2032 0 -2794 0)) (outline (path signal 304.8 -2032 0 -2032 -1016)) (outline (path signal 304.8 2032 -1016 2032 0)) (outline (path signal 304.8 1524 1016 1524 -1016)) (outline (path signal 304.8 1270 -1016 1270 1016)) (pin Rect[A]Pad_1397x1397_um 2 3556 0) (pin Round[A]Pad_1397_um 1 -3810 0) ) (image "LED-3-PDP" (outline (path signal 150 -2400 -1500 -2400 1500)) (outline (path signal 150 1500 -2400 -1500 -2400)) (outline (path signal 150 2400 1500 2400 -1500)) (outline (path signal 150 -1500 2400 1500 2400)) (pin Round[A]Pad_1676.4_um 1 -1270 0) (pin Round[A]Pad_1676.4_um 2 1270 0) ) (image "LED-3-StrEight" (pin Round[A]Pad_1676.4_um 1 -1270 0) (pin Round[A]Pad_1676.4_um 2 1270 0) ) (image RASPI_BPLUS_MIRRORED (outline (path signal 150 48768 49022 53594 49022)) (outline (path signal 150 53594 49022 53594 38354)) (outline (path signal 150 53594 38354 49784 38354)) (outline (path signal 150 -22000 49008 -22000 52508)) (outline (path signal 150 -16000 49008 -16000 52508)) (outline (path signal 150 -7000 48500 -7000 52500)) (outline (path signal 150 6000 48500 6000 52500)) (outline (path signal 150 49500 11032 54000 11032)) (outline (path signal 150 54000 11032 54000 32)) (outline (path signal 150 54000 32 50000 32)) (outline (path signal 150 49500 28032 54000 28032)) (outline (path signal 150 54000 28032 54000 16532)) (outline (path signal 150 54000 16532 49500 16532)) (outline (path signal 150 -32500 -3500 52500 -3500)) (outline (path signal 150 52500 52500 52500 -3500)) (outline (path signal 150 52500 52500 32000 52500)) (outline (path signal 150 -32500 52500 -32500 -3500)) (outline (path signal 150 -32500 52500 32500 52500)) (outline (path signal 304.8 25400 -2540 -25400 -2540)) (outline (path signal 304.8 25400 2540 -25400 2540)) (outline (path signal 304.8 25400 2540 25400 -2540)) (outline (path signal 304.8 -25400 2540 -25400 -2540)) (pin Rect[A]Pad_1524x1524_um 1 -24130 1270) (pin Round[A]Pad_1524_um 2 -24130 -1270) (pin Round[A]Pad_1524_um 11 -11430 1270) (pin Round[A]Pad_1524_um 4 -21590 -1270) (pin Round[A]Pad_1524_um 13 -8890 1270) (pin Round[A]Pad_1524_um 6 -19050 -1270) (pin Round[A]Pad_1524_um 15 -6350 1270) (pin Round[A]Pad_1524_um 8 -16510 -1270) (pin Round[A]Pad_1524_um 17 -3810 1270) (pin Round[A]Pad_1524_um 10 -13970 -1270) (pin Round[A]Pad_1524_um 19 -1270 1270) (pin Round[A]Pad_1524_um 12 -11430 -1270) (pin Round[A]Pad_1524_um 21 1270 1270) (pin Round[A]Pad_1524_um 14 -8890 -1270) (pin Round[A]Pad_1524_um 23 3810 1270) (pin Round[A]Pad_1524_um 16 -6350 -1270) (pin Round[A]Pad_1524_um 25 6350 1270) (pin Round[A]Pad_1524_um 18 -3810 -1270) (pin Round[A]Pad_1524_um 27 8890 1270) (pin Round[A]Pad_1524_um 20 -1270 -1270) (pin Round[A]Pad_1524_um 29 11430 1270) (pin Round[A]Pad_1524_um 22 1270 -1270) (pin Round[A]Pad_1524_um 31 13970 1270) (pin Round[A]Pad_1524_um 24 3810 -1270) (pin Round[A]Pad_1524_um 26 6350 -1270) (pin Round[A]Pad_1524_um 33 16510 1270) (pin Round[A]Pad_1524_um 28 8890 -1270) (pin Round[A]Pad_1524_um 32 13970 -1270) (pin Round[A]Pad_1524_um 34 16510 -1270) (pin Round[A]Pad_1524_um 36 19050 -1270) (pin Round[A]Pad_1524_um 38 21590 -1270) (pin Round[A]Pad_1524_um 35 19050 1270) (pin Round[A]Pad_1524_um 37 21590 1270) (pin Round[A]Pad_1524_um 3 -21590 1270) (pin Round[A]Pad_1524_um 5 -19050 1270) (pin Round[A]Pad_1524_um 7 -16510 1270) (pin Round[A]Pad_1524_um 9 -13970 1270) (pin Round[A]Pad_1524_um 39 24130 1270) (pin Round[A]Pad_1524_um 40 24130 -1270) (pin Round[A]Pad_1524_um 30 11430 -1270) (pin Round[A]Pad_2850_um H2 -29000 0) (pin Round[A]Pad_2850_um H3 29000 0) (pin Round[A]Pad_2850_um H4 29000 49000) (pin Round[A]Pad_2850_um H1 -29000 49000) ) (image PIN_ARRAY_4x1 (outline (path signal 254 5080 -1270 -5080 -1270)) (outline (path signal 254 5080 1270 -5080 1270)) (outline (path signal 254 -5080 1270 -5080 -1270)) (outline (path signal 254 5080 -1270 5080 1270)) (pin Rect[A]Pad_1524x1524_um 1 -3810 0) (pin Round[A]Pad_1524_um 2 -1270 0) (pin Round[A]Pad_1524_um 3 1270 0) (pin Round[A]Pad_1524_um 4 3810 0) ) (image SW_PIDP2019 (outline (path signal 150 -4700 10000 4700 10000)) (outline (path signal 150 4750 -5750 4750 -2000)) (outline (path signal 150 -4750 -5750 -4750 -2000)) (outline (path signal 150 -4750 -5750 4750 -5750)) (outline (path signal 150 -4750 -1950 -4750 10350)) (outline (path signal 150 4750 10300 4750 -1950)) (pin Round[A]Pad_2500_um 1 0 0) (pin Round[A]Pad_2500_um 2 0 4700) (pin Round[A]Pad_2500_um @1 1600 7875) (pin Round[A]Pad_2500_um @2 0 -4700) (pin Round[A]Pad_2500_um @3 -1600 -7875) (pin Round[A]Pad_2500_um @4 -1600 7875) (pin Round[A]Pad_2500_um @5 1600 -7875) ) (padstack Round[A]Pad_1397_um (shape (circle F.Cu 1397)) (shape (circle B.Cu 1397)) (attach off) ) (padstack Round[A]Pad_1524_um (shape (circle F.Cu 1524)) (shape (circle B.Cu 1524)) (attach off) ) (padstack Round[A]Pad_1676.4_um (shape (circle F.Cu 1676.4)) (shape (circle B.Cu 1676.4)) (attach off) ) (padstack Round[A]Pad_2500_um (shape (circle F.Cu 2500)) (shape (circle B.Cu 2500)) (attach off) ) (padstack Round[A]Pad_2850_um (shape (circle F.Cu 2850)) (shape (circle B.Cu 2850)) (attach off) ) (padstack Round[A]Pad_4064_um (shape (circle F.Cu 4064)) (shape (circle B.Cu 4064)) (attach off) ) (padstack Rect[A]Pad_1397x1397_um (shape (rect F.Cu -698.5 -698.5 698.5 698.5)) (shape (rect B.Cu -698.5 -698.5 698.5 698.5)) (attach off) ) (padstack Rect[A]Pad_1524x1524_um (shape (rect F.Cu -762 -762 762 762)) (shape (rect B.Cu -762 -762 762 762)) (attach off) ) (padstack "Via[0-1]_889:635_um" (shape (circle F.Cu 889)) (shape (circle B.Cu 889)) (attach off) ) (padstack "Via[0-1]_889:0_um" (shape (circle F.Cu 889)) (shape (circle B.Cu 889)) (attach off) ) ) (network (net +3.3V (pins P1-1 P3-1) ) (net +5V (pins P1-2 P1-4 DZ1-1) ) (net GND (pins P2-10 P1-6 P1-20) ) (net "N-00000101" (pins D12-2 SW12-2) ) (net "N-00000104" (pins D18-2 SW18-2) ) (net "N-00000105" (pins D17-2 SW17-2) ) (net "N-00000106" (pins D16-2 SW16-2) ) (net "N-00000107" (pins D15-2 SW15-2) ) (net "N-00000108" (pins D14-2 SW14-2) ) (net "N-00000109" (pins D13-2 SW13-2) ) (net "N-00000110" (pins D11-2 SW11-2) ) (net "N-00000111" (pins D10-2 SW10-2) ) (net "N-00000112" (pins D9-2 SW9-2) ) (net "N-00000113" (pins D8-2 SW8-2) ) (net "N-00000114" (pins D7-2 SW7-2) ) (net "N-00000119" (pins D26-2 SW26-2) ) (net "N-00000120" (pins D25-2 SW25-2) ) (net "N-0000060" (pins P2-9 DZ1-2) ) (net "N-0000064" (pins D1-2 SW1-2) ) (net "N-0000065" (pins D6-2 SW6-2) ) (net "N-0000066" (pins D5-2 SW5-2) ) (net "N-0000067" (pins D4-2 SW4-2) ) (net "N-0000068" (pins D3-2 SW3-2) ) (net "N-0000069" (pins D2-2 SW2-2) ) (net "N-0000070" (pins R3-2 P1-7) ) (net "N-0000071" (pins R_ROW2-1 P1-11) ) (net "N-0000072" (pins R9-1 P1-19) ) (net "N-0000073" (pins R8-1 P1-21) ) (net "N-0000074" (pins R4-2 P1-29) ) (net "N-0000075" (pins R5-2 P1-31) ) (net "N-0000076" (pins R12-1 P1-33) ) (net "N-0000077" (pins R_ROW3-1 P1-12) ) (net "N-0000078" (pins R7-1 P1-24) ) (net "N-0000079" (pins R11-1 P1-32) ) (net "N-0000080" (pins R_ROW1-1 P1-36) ) (net "N-0000081" (pins D23-2 SW23-2) ) (net "N-0000082" (pins D22-2 SW22-2) ) (net "N-0000083" (pins D21-2 SW21-2) ) (net "N-0000084" (pins D20-2 SW20-2) ) (net "N-0000085" (pins D19-2 SW19-2) ) (net "N-0000087" (pins R1-1 P1-8) ) (net "N-0000088" (pins R2-1 P1-10) ) (net "N-0000095" (pins R10-1 P1-23) ) (net "N-0000096" (pins R6-2 P1-26) ) (net "N-0000097" (pins D24-2 SW24-2) ) (net col1 (pins R1-2 D7-1 D1-1 D19-1 DAC1-2 DPC1-2 DMQ1-2 DMA1-2 DMB1-2 DCURAD1-2 DDF1-2 DAND1-2) ) (net col10 (pins R10-2 D16-1 DMB10-2 DAC10-2 DMQ10-2 DPC10-2 DMA10-2 DEXEC1-2 DSC5-2) ) (net col11 (pins R11-2 D17-1 DMB11-2 DMQ11-2 DAC11-2 DPC11-2 DMA11-2 DDEFER1-2) ) (net col12 (pins R12-2 D18-1 DMB12-2 DAC12-2 DMQ12-2 DPC12-2 DMA12-2 DWRDCT1-2) ) (net col2 (pins R2-2 D2-1 D8-1 D20-1 DAC2-2 DMQ2-2 DPC2-2 DMA2-2 DMB2-2 DBREAK1-2 DDF2-2 DTAD1-2) ) (net col3 (pins R3-1 D3-1 D9-1 D21-1 DAC3-2 DMQ3-2 DPC3-2 DMA3-2 DMB3-2 DION1-2 DDF3-2 DISZ1-2) ) (net col4 (pins R4-1 D22-1 D4-1 D10-1 DAC4-2 DMQ4-2 DPC4-2 DMB4-2 DMA4-2 DPAUSE1-2 DDCA1-2 DIF1-2 DPAUSE2-2) ) (net col5 (pins R5-1 D23-1 D5-1 D11-1 DAC5-2 DMQ5-2 DPC5-2 DMA5-2 DMB5-2 DRUN1-2 DJMS1-2 DIF2-2 DRUN2-2) ) (net col6 (pins R6-1 D24-1 D12-1 D6-1 DAC6-2 DMQ6-2 DSC1-2 DPC6-2 DMA6-2 DMB6-2 DJMP1-2 DIF3-2) ) (net col7 (pins R7-2 D25-1 D13-1 DAC7-2 DMQ7-2 DLINK1-2 DPC7-2 DMA7-2 DMB7-2 DIOT1-2 DSC2-2) ) (net col8 (pins R8-2 D26-1 D14-1 DAC8-2 DMQ8-2 DPC8-2 DMB8-2 DMA8-2 DOPR1-2 DSC3-2) ) (net col9 (pins R9-2 D15-1 DMB9-2 DAC9-2 DMQ9-2 DPC9-2 DMA9-2 DFETCH1-2 DSC4-2) ) (net i2cgnd (pins P1-9 P3-4) ) (net led1 (pins P2-18 DPC1-1 DPC2-1 DPC3-1 DPC4-1 DPC5-1 DPC6-1 DPC7-1 DPC8-1 DPC9-1 DPC10-1 DPC11-1 DPC12-1) ) (net led2 (pins P2-17 DMA1-1 DMA2-1 DMA3-1 DMA5-1 DMA6-1 DMA7-1 DMA8-1 DMA9-1 DMA10-1 DMA11-1 DMA12-1 DMA4-1) ) (net led3 (pins P2-16 DMB9-1 DMB10-1 DMB11-1 DMB12-1 DMB8-1 DMB1-1 DMB2-1 DMB3-1 DMB4-1 DMB5-1 DMB6-1 DMB7-1) ) (net led4 (pins P2-15 DAC1-1 DAC2-1 DAC3-1 DAC4-1 DAC5-1 DAC6-1 DAC7-1 DAC8-1 DAC9-1 DAC10-1 DAC12-1 DAC11-1) ) (net led5 (pins P2-14 DMQ1-1 DMQ2-1 DMQ3-1 DMQ4-1 DMQ5-1 DMQ6-1 DMQ7-1 DMQ8-1 DMQ9-1 DMQ10-1 DMQ11-1 DMQ12-1) ) (net led6 (pins P2-13 DWRDCT1-1 DDEFER1-1 DEXEC1-1 DFETCH1-1 DOPR1-1 DIOT1-1 DJMP1-1 DJMS1-1 DDCA1-1 DTAD1-1 DAND1-1 DISZ1-1) ) (net led7 (pins P2-12 DSC1-1 DRUN1-1 DPAUSE1-1 DION1-1 DBREAK1-1 DCURAD1-1 DSC2-1 DSC4-1 DSC5-1 DSC3-1 DPAUSE2-1 DRUN2-1) ) (net led8 (pins P2-11 DLINK1-1 DDF1-1 DDF2-1 DDF3-1 DIF2-1 DIF3-1 DIF1-1) ) (net row1 (pins R_ROW1-2 SW18-1 SW17-1 SW15-1 SW14-1 SW13-1 SW12-1 SW16-1 SW7-1 SW8-1 SW9-1 SW10-1 SW11-1) ) (net row2 (pins R_ROW2-2 SW6-1 SW5-1 SW4-1 SW3-1 SW2-1 SW1-1) ) (net row3 (pins R_ROW3-2 SW19-1 SW20-1 SW22-1 SW23-1 SW24-1 SW25-1 SW26-1 SW21-1) ) (net scl (pins P1-5 P3-3) ) (net sda (pins P1-3 P3-2) ) (net xled1 (pins P2-1 P1-38) ) (net xled2 (pins P2-2 P1-40) ) (net xled3 (pins P2-3 P1-15) ) (net xled4 (pins P2-4 P1-16) ) (net xled5 (pins P2-5 P1-18) ) (net xled6 (pins P2-6 P1-22) ) (net xled7 (pins P2-7 P1-37) ) (net xled8 (pins P2-8 P1-13) ) (class kicad_default "" "N-00000101" "N-00000104" "N-00000105" "N-00000106" "N-00000107" "N-00000108" "N-00000109" "N-00000110" "N-00000111" "N-00000112" "N-00000113" "N-00000114" "N-00000119" "N-00000120" "N-0000060" "N-0000064" "N-0000065" "N-0000066" "N-0000067" "N-0000068" "N-0000069" "N-0000070" "N-0000071" "N-0000072" "N-0000073" "N-0000074" "N-0000075" "N-0000076" "N-0000077" "N-0000078" "N-0000079" "N-0000080" "N-0000081" "N-0000082" "N-0000083" "N-0000084" "N-0000085" "N-0000087" "N-0000088" "N-0000095" "N-0000096" "N-0000097" col1 col10 col11 col12 col2 col3 col4 col5 col6 col7 col8 col9 i2cgnd led1 led2 led3 led4 led5 led6 led7 led8 scl sda xled1 xled2 xled3 xled4 xled5 xled6 xled7 xled8 (circuit (use_via Via[0-1]_889:635_um) ) (rule (width 508) (clearance 254.1) ) ) (class Strong +3.3V +5V GND row1 row2 row3 (circuit (use_via Via[0-1]_889:635_um) ) (rule (width 508) (clearance 381.1) ) ) ) (wiring (wire (path B.Cu 508 89000 -155200 89200 -155200)(net "N-00000114")(type protect)) (wire (path B.Cu 508 92636 -158636 92636 -172150)(net "N-00000114")(type protect)) (wire (path B.Cu 508 89200 -155200 92636 -158636)(net "N-00000114")(type protect)) (wire (path B.Cu 508 25270 -172150 25270 -114930)(net col1)(type protect)) (wire (path B.Cu 508 30270 -109930 30270 -70600)(net col1)(type protect)) (wire (path B.Cu 508 25270 -114930 30270 -109930)(net col1)(type protect)) (wire (path B.Cu 508 90270 -129000 90270 -143730)(net col1)(type protect)) (wire (path B.Cu 508 85270 -148730 85270 -172150)(net col1)(type protect)) (wire (path B.Cu 508 90270 -143730 85270 -148730)(net col1)(type protect)) (wire (path B.Cu 508 90270 -114400 90270 -125120 90240 -125150 90240 -128970 90270 -129000)(net col1)(type protect)) (wire (path B.Cu 508 90270 -99800 90270 -114400)(net col1)(type protect)) (wire (path B.Cu 508 90270 -85200 90270 -99800)(net col1)(type protect)) (wire (path B.Cu 508 90270 -70600 90270 -85200)(net col1)(type protect)) (wire (path B.Cu 508 180270 -70600 180270 -85200 180270 -99800 180270 -114400 180190 -114480 180190 -128920 180270 -129000)(net col10)(type protect)) (wire (path B.Cu 508 190270 -129000 190270 -124830 190270 -114400 190270 -99800 190270 -85200 190270 -70600)(net col11)(type protect)) (wire (path B.Cu 508 200270 -70600 200270 -85200 200270 -99800 200270 -114400 200240 -114430 200240 -128970 200270 -129000)(net col12)(type protect)) (wire (path B.Cu 508 35270 -172150 35270 -115430)(net col2)(type protect)) (wire (path B.Cu 508 40270 -110430 40270 -70600)(net col2)(type protect)) (wire (path B.Cu 508 35270 -115430 40270 -110430)(net col2)(type protect)) (wire (path B.Cu 508 100270 -129000 100270 -142935)(net col2)(type protect)) (wire (path B.Cu 508 95270 -147935 95270 -172150)(net col2)(type protect)) (wire (path B.Cu 508 100270 -142935 95270 -147935)(net col2)(type protect)) (wire (path B.Cu 508 100270 -70600 100270 -85200 100270 -99800 100270 -114400 100290 -114420 100290 -128980 100270 -129000)(net col2)(type protect)) (wire (path B.Cu 508 50270 -70600 50270 -111070)(net col3)(type protect)) (wire (path B.Cu 508 45270 -116070 45270 -172150)(net col3)(type protect)) (wire (path B.Cu 508 50270 -111070 45270 -116070)(net col3)(type protect)) (wire (path B.Cu 508 105270 -172150 105270 -148095)(net col3)(type protect)) (wire (path B.Cu 508 110270 -143095 110270 -129000)(net col3)(type protect)) (wire (path B.Cu 508 105270 -148095 110270 -143095)(net col3)(type protect)) (wire (path B.Cu 508 110270 -70600 110270 -85200 110270 -99800 110270 -114400 110290 -114420 110290 -128980 110270 -129000)(net col3)(type protect)) (wire (path B.Cu 508 55270 -172150 55270 -171670)(net col4)(type protect)) (wire (path B.Cu 508 60270 -112330 60270 -70600)(net col4)(type protect)) (wire (path B.Cu 508 55100 -117500 60270 -112330)(net col4)(type protect)) (wire (path B.Cu 508 55100 -171500 55100 -117500)(net col4)(type protect)) (wire (path B.Cu 508 55270 -171670 55100 -171500)(net col4)(type protect)) (wire (path B.Cu 508 120270 -129000 120270 -125120 120270 -114400 120300 -114370 120300 -85230 120270 -85200 120270 -70600)(net col4)(type protect)) (wire (path B.Cu 508 65270 -172150 65270 -117630)(net col5)(type protect)) (wire (path B.Cu 508 70270 -112630 70270 -70600)(net col5)(type protect)) (wire (path B.Cu 508 65270 -117630 70270 -112630)(net col5)(type protect)) (wire (path B.Cu 508 130270 -70600 130270 -85200 130270 -99800 130270 -114400 130240 -114430 130240 -128970 130270 -129000)(net col5)(type protect)) (wire (path B.Cu 508 75270 -172150 75270 -150630)(net col6)(type protect)) (wire (path B.Cu 508 80270 -105030 80270 -70600)(net col6)(type protect)) (wire (path B.Cu 508 74200 -111100 80270 -105030)(net col6)(type protect)) (wire (path B.Cu 508 74200 -117200 74200 -111100)(net col6)(type protect)) (wire (path B.Cu 508 77000 -120000 74200 -117200)(net col6)(type protect)) (wire (path B.Cu 508 77000 -148900 77000 -120000)(net col6)(type protect)) (wire (path B.Cu 508 75270 -150630 77000 -148900)(net col6)(type protect)) (wire (path B.Cu 508 140270 -70600 140270 -85200 140270 -99800 140270 -114400 140340 -114470 140340 -128930 140270 -129000)(net col6)(type protect)) (wire (path B.Cu 508 150270 -70600 150270 -85200 150270 -99800 150270 -114400 150290 -114420 150290 -128980 150270 -129000)(net col7)(type protect)) (wire (path B.Cu 508 160270 -70600 160270 -85200 160270 -99800 160270 -114400 160240 -114430 160240 -128970 160270 -129000)(net col8)(type protect)) (wire (path B.Cu 508 170290 -128980 170270 -129000)(net col9)(type protect)) (wire (path B.Cu 508 170290 -114420 170290 -128980)(net col9)(type protect)) (wire (path B.Cu 508 170270 -114400 170290 -114420)(net col9)(type protect)) (wire (path B.Cu 508 170270 -99800 170270 -114400)(net col9)(type protect)) (wire (path B.Cu 508 170270 -85200 170270 -99800)(net col9)(type protect)) (wire (path B.Cu 508 170270 -70600 170270 -85200)(net col9)(type protect)) (wire (path F.Cu 508 97730 -70600 97730 -74930 97790 -74930)(net led1)(type protect)) (wire (path F.Cu 508 107730 -70600 107730 -74930 107950 -74930)(net led1)(type protect)) (wire (path F.Cu 508 117730 -70600 117730 -74930 117475 -74930)(net led1)(type protect)) (wire (path F.Cu 508 127730 -70600 127730 -74930 128270 -74930)(net led1)(type protect)) (wire (path F.Cu 508 137730 -70600 137730 -74930 137795 -74930)(net led1)(type protect)) (wire (path F.Cu 508 147730 -70600 147730 -74930 147955 -74930)(net led1)(type protect)) (wire (path F.Cu 508 157730 -70600 157730 -74930 158115 -74930)(net led1)(type protect)) (wire (path F.Cu 508 167730 -70600 167730 -74930 167640 -74930)(net led1)(type protect)) (wire (path F.Cu 508 177730 -70600 177730 -74930 177800 -74930)(net led1)(type protect)) (wire (path F.Cu 508 187730 -70600 187730 -74930 187960 -74930)(net led1)(type protect)) (wire (path F.Cu 508 87730 -70600 87730 -74830)(net led1)(type protect)) (wire (path F.Cu 508 193400 -74930 197730 -70600)(net led1)(type protect)) (wire (path F.Cu 508 87830 -74930 97790 -74930 107950 -74930 117475 -74930 128270 -74930 137795 -74930 147955 -74930 158115 -74930 167640 -74930 177800 -74930 187960 -74930 193400 -74930)(net led1)(type protect)) (wire (path F.Cu 508 87730 -74830 87830 -74930)(net led1)(type protect)) (wire (path F.Cu 508 88900 -88900 87630 -88900)(net led2)(type protect)) (wire (path F.Cu 508 97790 -88900 89535 -88900)(net led2)(type protect)) (wire (path F.Cu 508 88900 -88900 89535 -88900)(net led2)(type protect)) (wire (path F.Cu 508 87730 -88800 87730 -85200)(net led2)(type protect)) (wire (path F.Cu 508 87630 -88900 87730 -88800)(net led2)(type protect)) (wire (path F.Cu 508 97730 -85200 97730 -88900 97790 -88900)(net led2)(type protect)) (wire (path F.Cu 508 107730 -85200 107730 -88900 107950 -88900)(net led2)(type protect)) (wire (path F.Cu 508 117730 -85200 117730 -88900 117475 -88900)(net led2)(type protect)) (wire (path F.Cu 508 127730 -85200 127730 -88900 127635 -88900)(net led2)(type protect)) (wire (path F.Cu 508 137730 -85200 137730 -88900 137795 -88900)(net led2)(type protect)) (wire (path F.Cu 508 147730 -85200 147730 -88900 147320 -88900)(net led2)(type protect)) (wire (path F.Cu 508 157730 -85200 157730 -88900 158115 -88900)(net led2)(type protect)) (wire (path F.Cu 508 167730 -85200 167730 -88900 167640 -88900)(net led2)(type protect)) (wire (path F.Cu 508 177730 -85200 177730 -88900 177165 -88900)(net led2)(type protect)) (wire (path F.Cu 508 187730 -85200 187730 -88900 187325 -88900)(net led2)(type protect)) (wire (path F.Cu 508 194030 -88900 197730 -85200)(net led2)(type protect)) (wire (path F.Cu 508 97790 -88900 107950 -88900 117475 -88900 127635 -88900 137795 -88900 147320 -88900 158115 -88900 167640 -88900 177165 -88900 187325 -88900 194030 -88900)(net led2)(type protect)) (wire (path F.Cu 508 97730 -99800 97730 -104775 97790 -104775)(net led3)(type protect)) (wire (path F.Cu 508 107730 -99800 107730 -104775 107950 -104775)(net led3)(type protect)) (wire (path F.Cu 508 117730 -99800 117730 -104775 117475 -104775)(net led3)(type protect)) (wire (path F.Cu 508 127730 -99800 127730 -104775 127635 -104775)(net led3)(type protect)) (wire (path F.Cu 508 137730 -99800 137730 -104775 137795 -104775)(net led3)(type protect)) (wire (path F.Cu 508 147730 -99800 147730 -104775 147320 -104775)(net led3)(type protect)) (wire (path F.Cu 508 157730 -99800 157730 -104775 157480 -104775)(net led3)(type protect)) (wire (path F.Cu 508 167730 -99800 167730 -104775 167640 -104775)(net led3)(type protect)) (wire (path F.Cu 508 177730 -99800 177730 -104775 177800 -104775)(net led3)(type protect)) (wire (path F.Cu 508 187730 -99800 187730 -104775 187960 -104775)(net led3)(type protect)) (wire (path F.Cu 508 87730 -99800 87730 -104675)(net led3)(type protect)) (wire (path F.Cu 508 192755 -104775 197730 -99800)(net led3)(type protect)) (wire (path F.Cu 508 87830 -104775 97790 -104775 107950 -104775 117475 -104775 127635 -104775 137795 -104775 147320 -104775 157480 -104775 167640 -104775 177800 -104775 187960 -104775 192755 -104775)(net led3)(type protect)) (wire (path F.Cu 508 87730 -104675 87830 -104775)(net led3)(type protect)) (wire (path F.Cu 508 97730 -114400 97730 -118745 97790 -118745)(net led4)(type protect)) (wire (path F.Cu 508 107730 -114400 107730 -118745 107315 -118745)(net led4)(type protect)) (wire (path F.Cu 508 117730 -114400 117730 -118745 117475 -118745)(net led4)(type protect)) (wire (path F.Cu 508 127730 -114400 127730 -118745 127635 -118745)(net led4)(type protect)) (wire (path F.Cu 508 137730 -114400 137730 -118745 137795 -118745)(net led4)(type protect)) (wire (path F.Cu 508 147730 -114400 147730 -118745 147955 -118745)(net led4)(type protect)) (wire (path F.Cu 508 157730 -114400 157730 -118745 158115 -118745)(net led4)(type protect)) (wire (path F.Cu 508 167730 -114400 167730 -118745 167640 -118745)(net led4)(type protect)) (wire (path F.Cu 508 177730 -114400 177730 -118745 177800 -118745)(net led4)(type protect)) (wire (path F.Cu 508 187730 -114400 187730 -118745 187325 -118745)(net led4)(type protect)) (wire (path F.Cu 508 87730 -114400 87730 -118645)(net led4)(type protect)) (wire (path F.Cu 508 193385 -118745 197730 -114400)(net led4)(type protect)) (wire (path F.Cu 508 87830 -118745 97790 -118745 107315 -118745 117475 -118745 127635 -118745 137795 -118745 147955 -118745 158115 -118745 167640 -118745 177800 -118745 187325 -118745 193385 -118745)(net led4)(type protect)) (wire (path F.Cu 508 87730 -118645 87830 -118745)(net led4)(type protect)) (wire (path F.Cu 508 97730 -129000 97730 -125095 97790 -125095)(net led5)(type protect)) (wire (path F.Cu 508 107730 -129000 107730 -125095 107950 -125095)(net led5)(type protect)) (wire (path F.Cu 508 117730 -129000 117730 -125095 117475 -125095)(net led5)(type protect)) (wire (path F.Cu 508 127730 -129000 127730 -125095 127635 -125095)(net led5)(type protect)) (wire (path F.Cu 508 137730 -129000 137730 -125095 137795 -125095)(net led5)(type protect)) (wire (path F.Cu 508 147730 -129000 147730 -125095 147955 -125095)(net led5)(type protect)) (wire (path F.Cu 508 157730 -129000 157730 -125095 157480 -125095)(net led5)(type protect)) (wire (path F.Cu 508 167730 -129000 167730 -125095 167640 -125095)(net led5)(type protect)) (wire (path F.Cu 508 177730 -129000 177730 -125095 177800 -125095)(net led5)(type protect)) (wire (path F.Cu 508 187730 -129000 187730 -125095 187960 -125095)(net led5)(type protect)) (wire (path F.Cu 508 87730 -129000 87730 -125195)(net led5)(type protect)) (wire (path F.Cu 508 193825 -125095 197730 -129000)(net led5)(type protect)) (wire (path F.Cu 508 87830 -125095 97790 -125095 107950 -125095 117475 -125095 127635 -125095 137795 -125095 147955 -125095 157480 -125095 167640 -125095 177800 -125095 187960 -125095 193825 -125095)(net led5)(type protect)) (wire (path F.Cu 508 87730 -125195 87830 -125095)(net led5)(type protect)) (wire (path B.Cu 508 257730 -92500 257730 -85200 257730 -77900 257730 -70600)(net led6)(type protect)) (wire (path B.Cu 508 237730 -70600 237730 -77900 237730 -85200 237730 -92500 237730 -99800 237730 -107000 237730 -121400)(net led6)(type protect)) (wire (path B.Cu 508 277730 -70600 277730 -75800 277730 -85200)(net led7)(type protect)) (wire (path B.Cu 508 257730 -99800 257730 -107100 257730 -114400 257730 -121700)(net led7)(type protect)) (wire (path F.Cu 508 37730 -129000 37730 -125095 38100 -125095)(net led7)(type protect)) (wire (path F.Cu 508 47730 -129000 47730 -125095 47625 -125095)(net led7)(type protect)) (wire (path F.Cu 508 57730 -129000 57730 -125095 57785 -125095)(net led7)(type protect)) (wire (path F.Cu 508 27730 -129000 27730 -125305)(net led7)(type protect)) (wire (path F.Cu 508 63825 -125095 67730 -129000)(net led7)(type protect)) (wire (path F.Cu 508 27940 -125095 38100 -125095 47625 -125095 57785 -125095 63825 -125095)(net led7)(type protect)) (wire (path F.Cu 508 27730 -125305 27940 -125095)(net led7)(type protect)) (wire (path F.Cu 508 73400 -74930 77730 -70600)(net led8)(type protect)) (wire (path F.Cu 508 73400 -74930 67945 -74930)(net led8)(type protect)) (wire (path F.Cu 508 67730 -70600 67730 -74930 67945 -74930)(net led8)(type protect)) (wire (path F.Cu 508 57730 -70600 57730 -74930 57785 -74930)(net led8)(type protect)) (wire (path F.Cu 508 47730 -70600 47730 -74930 47625 -74930)(net led8)(type protect)) (wire (path F.Cu 508 37730 -70600 37730 -74930 38100 -74930)(net led8)(type protect)) (wire (path F.Cu 508 27730 -70600 27730 -74720)(net led8)(type protect)) (wire (path F.Cu 508 27940 -74930 38100 -74930 47625 -74930 57785 -74930 67945 -74930)(net led8)(type protect)) (wire (path F.Cu 508 27730 -74720 27940 -74930)(net led8)(type protect)) (wire (path F.Cu 508 185440 -148450 185440 -148570)(net row1)(type protect)) (wire (path F.Cu 508 184150 -149860 184150 -159900)(net row1)(type protect)) (wire (path F.Cu 508 185440 -148570 184150 -149860)(net row1)(type protect)) (wire (path F.Cu 508 89000 -159900 99000 -159900 109000 -159900 119000 -159900 129000 -159900 139000 -159900 149000 -159900 159000 -159900 169000 -159900 179000 -159900 184150 -159900 189000 -159900 199000 -159900)(net row1)(type protect)) (wire (path F.Cu 508 75190 -148500 75190 -148810)(net row2)(type protect)) (wire (path F.Cu 508 74000 -150000 74000 -159900)(net row2)(type protect)) (wire (path F.Cu 508 75190 -148810 74000 -150000)(net row2)(type protect)) (wire (path F.Cu 508 29000 -159900 39000 -159900 49000 -159900 59000 -159900 69000 -159900 74000 -159900 79000 -159900)(net row2)(type protect)) (wire (path F.Cu 508 232810 -148450 232810 -148610)(net row3)(type protect)) (wire (path F.Cu 508 234100 -149900 234100 -159900)(net row3)(type protect)) (wire (path F.Cu 508 232810 -148610 234100 -149900)(net row3)(type protect)) (wire (path F.Cu 508 209000 -159900 219000 -159900 229000 -159900 234100 -159900 239000 -159900 249000 -159900 259000 -159900 269000 -159900 279000 -159900)(net row3)(type protect)) ) ) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 | (kicad_pcb (version 3) (host pcbnew "(2013-07-07 BZR 4022)-stable") (general (links 292) (no_connects 0) (area 9.149999 64.3193 291.050001 174.850001) (thickness 1.6) (drawings 65) (tracks 987) (zones 0) (modules 169) (nets 80) ) (page A4) (layers (15 F.Cu signal) (0 B.Cu signal) (16 B.Adhes user) (17 F.Adhes user) (18 B.Paste user) (19 F.Paste user) (20 B.SilkS user) (21 F.SilkS user) (22 B.Mask user) (23 F.Mask user) (24 Dwgs.User user) (25 Cmts.User user) (26 Eco1.User user) (27 Eco2.User user) (28 Edge.Cuts user) ) (setup (last_trace_width 0.508) (trace_clearance 0.254) (zone_clearance 0.508) (zone_45_only no) (trace_min 0.254) (segment_width 0.1) (edge_width 0.1) (via_size 0.889) (via_drill 0.635) (via_min_size 0.889) (via_min_drill 0.508) (uvia_size 0.508) (uvia_drill 0.127) (uvias_allowed no) (uvia_min_size 0.508) (uvia_min_drill 0.127) (pcb_text_width 0.3) (pcb_text_size 1.5 1.5) (mod_edge_width 0.01) (mod_text_size 1 1) (mod_text_width 0.15) (pad_size 3.9 2.1) (pad_drill 2.9) (pad_to_mask_clearance 0) (aux_axis_origin 0 0) (visible_elements 7FFFFF3F) (pcbplotparams (layerselection 284196865) (usegerberextensions true) (excludeedgelayer false) (linewidth 0.150000) (plotframeref false) (viasonmask false) (mode 1) (useauxorigin false) (hpglpennumber 1) (hpglpenspeed 20) (hpglpendiameter 15) (hpglpenoverlay 2) (psnegative false) (psa4output false) (plotreference true) (plotvalue true) (plotothertext true) (plotinvisibletext false) (padsonsilk false) (subtractmaskfromsilk true) (outputformat 1) (mirror false) (drillshape 0) (scaleselection 1) (outputdirectory gerber20190414/)) ) (net 0 "") (net 1 +3.3V) (net 2 +5V) (net 3 GND) (net 4 N-00000101) (net 5 N-00000104) (net 6 N-00000105) (net 7 N-00000106) (net 8 N-00000107) (net 9 N-00000108) (net 10 N-00000109) (net 11 N-00000110) (net 12 N-00000111) (net 13 N-00000112) (net 14 N-00000113) (net 15 N-00000114) (net 16 N-00000119) (net 17 N-00000120) (net 18 N-0000060) (net 19 N-0000064) (net 20 N-0000065) (net 21 N-0000066) (net 22 N-0000067) (net 23 N-0000068) (net 24 N-0000069) (net 25 N-0000070) (net 26 N-0000071) (net 27 N-0000072) (net 28 N-0000073) (net 29 N-0000074) (net 30 N-0000075) (net 31 N-0000076) (net 32 N-0000077) (net 33 N-0000078) (net 34 N-0000079) (net 35 N-0000080) (net 36 N-0000081) (net 37 N-0000082) (net 38 N-0000083) (net 39 N-0000084) (net 40 N-0000085) (net 41 N-0000087) (net 42 N-0000088) (net 43 N-0000095) (net 44 N-0000096) (net 45 N-0000097) (net 46 col1) (net 47 col10) (net 48 col11) (net 49 col12) (net 50 col2) (net 51 col3) (net 52 col4) (net 53 col5) (net 54 col6) (net 55 col7) (net 56 col8) (net 57 col9) (net 58 i2cgnd) (net 59 led1) (net 60 led2) (net 61 led3) (net 62 led4) (net 63 led5) (net 64 led6) (net 65 led7) (net 66 led8) (net 67 row1) (net 68 row2) (net 69 row3) (net 70 scl) (net 71 sda) (net 72 xled1) (net 73 xled2) (net 74 xled3) (net 75 xled4) (net 76 xled5) (net 77 xled6) (net 78 xled7) (net 79 xled8) (net_class Default "This is the default net class." (clearance 0.254) (trace_width 0.508) (via_dia 0.889) (via_drill 0.635) (uvia_dia 0.508) (uvia_drill 0.127) (add_net "") (add_net N-00000101) (add_net N-00000104) (add_net N-00000105) (add_net N-00000106) (add_net N-00000107) (add_net N-00000108) (add_net N-00000109) (add_net N-00000110) (add_net N-00000111) (add_net N-00000112) (add_net N-00000113) (add_net N-00000114) (add_net N-00000119) (add_net N-00000120) (add_net N-0000060) (add_net N-0000064) (add_net N-0000065) (add_net N-0000066) (add_net N-0000067) (add_net N-0000068) (add_net N-0000069) (add_net N-0000070) (add_net N-0000071) (add_net N-0000072) (add_net N-0000073) (add_net N-0000074) (add_net N-0000075) (add_net N-0000076) (add_net N-0000077) (add_net N-0000078) (add_net N-0000079) (add_net N-0000080) (add_net N-0000081) (add_net N-0000082) (add_net N-0000083) (add_net N-0000084) (add_net N-0000085) (add_net N-0000087) (add_net N-0000088) (add_net N-0000095) (add_net N-0000096) (add_net N-0000097) (add_net col1) (add_net col10) (add_net col11) (add_net col12) (add_net col2) (add_net col3) (add_net col4) (add_net col5) (add_net col6) (add_net col7) (add_net col8) (add_net col9) (add_net i2cgnd) (add_net led1) (add_net led2) (add_net led3) (add_net led4) (add_net led5) (add_net led6) (add_net led7) (add_net led8) (add_net scl) (add_net sda) (add_net xled1) (add_net xled2) (add_net xled3) (add_net xled4) (add_net xled5) (add_net xled6) (add_net xled7) (add_net xled8) ) (net_class Strong "" (clearance 0.381) (trace_width 0.508) (via_dia 0.889) (via_drill 0.635) (uvia_dia 0.508) (uvia_drill 0.127) (add_net +3.3V) (add_net +5V) (add_net GND) (add_net row1) (add_net row2) (add_net row3) ) (module 1pin (layer F.Cu) (tedit 5CB3500A) (tstamp 5C1FB991) (at 207.1 82.6) (descr "module 1 pin (ou trou mecanique de percage)") (tags DEV) (path /54BD36C6) (fp_text reference M5 (at 0 -3.048) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_text value M (at 0 2.794) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (pad 1 thru_hole circle (at 0 0) (size 3.5 3.5) (drill 3.048) (layers *.Cu *.Mask F.SilkS) ) ) (module 1pin (layer F.Cu) (tedit 5CB34FDB) (tstamp 5CB4A5C6) (at 124 141) (descr "module 1 pin (ou trou mecanique de percage)") (tags DEV) (path 1pin) (fp_text reference 1PIN (at 0 -3.048) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_text value P*** (at 0 2.794) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (pad 1 thru_hole circle (at 0 0) (size 3.5 3.5) (drill 3.048) (layers *.Cu *.Mask F.SilkS) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 54B17F96) (at 174.1 121.725 180) (descr "Resitance 3 pas") (tags R) (path /54908374) (autoplace_cost180 10) (fp_text reference R9 (at 0 0.127 180) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127 180) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 27 N-0000072) ) (pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 57 col9) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 5C1E87DC) (at 94.05 121.975 180) (descr "Resitance 3 pas") (tags R) (path /5490833D) (autoplace_cost180 10) (fp_text reference R1 (at 0 0.127 180) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127 180) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 41 N-0000087) ) (pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 54B17F67) (at 104.1 121.975 180) (descr "Resitance 3 pas") (tags R) (path /5490834A) (autoplace_cost180 10) (fp_text reference R2 (at 0 0.127 180) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127 180) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 42 N-0000088) ) (pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 5C1E8A26) (at 114.1 121.975) (descr "Resitance 3 pas") (tags R) (path /54908350) (autoplace_cost180 10) (fp_text reference R3 (at 0 0.127) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (pad 2 thru_hole circle (at 3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 25 N-0000070) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 54B17C54) (at 124.1 121.925) (descr "Resitance 3 pas") (tags R) (path /54908356) (autoplace_cost180 10) (fp_text reference R4 (at 0 0.127) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (pad 2 thru_hole circle (at 3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 29 N-0000074) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 54B17C62) (at 134.05 121.925) (descr "Resitance 3 pas") (tags R) (path /5490835C) (autoplace_cost180 10) (fp_text reference R5 (at 0 0.127) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (pad 2 thru_hole circle (at 3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 30 N-0000075) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 54B17C70) (at 144.15 121.875) (descr "Resitance 3 pas") (tags R) (path /54908362) (autoplace_cost180 10) (fp_text reference R6 (at 0 0.127) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (pad 2 thru_hole circle (at 3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 44 N-0000096) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 54B17C7E) (at 154.1 121.875 180) (descr "Resitance 3 pas") (tags R) (path /54908368) (autoplace_cost180 10) (fp_text reference R7 (at 0 0.127 180) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127 180) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 33 N-0000078) ) (pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 55 col7) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 54B17C8C) (at 164.05 121.825 180) (descr "Resitance 3 pas") (tags R) (path /5490836E) (autoplace_cost180 10) (fp_text reference R8 (at 0 0.127 180) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127 180) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 28 N-0000073) ) (pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 56 col8) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 54B1C0BD) (at 184 121.675 180) (descr "Resitance 3 pas") (tags R) (path /5490837A) (autoplace_cost180 10) (fp_text reference R10 (at 0 0.127 180) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127 180) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 43 N-0000095) ) (pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 47 col10) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 54B17CA8) (at 194.05 121.625 180) (descr "Resitance 3 pas") (tags R) (path /54908380) (autoplace_cost180 10) (fp_text reference R11 (at 0 0.127 180) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127 180) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 34 N-0000079) ) (pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 48 col11) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 54B17CB6) (at 204.05 121.625 180) (descr "Resitance 3 pas") (tags R) (path /54908386) (autoplace_cost180 10) (fp_text reference R12 (at 0 0.127 180) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 390 (at 0 0.127 180) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 31 N-0000076) ) (pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 49 col12) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 5CB38C8F) (at 189.25 148.45 180) (descr "Resitance 3 pas") (tags R) (path /5490838C) (autoplace_cost180 10) (fp_text reference R_ROW1 (at 0 0.127 180) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 1K (at 0 0.127 180) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 35 N-0000080) ) (pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 67 row1) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 54B17CD2) (at 79 148.5 180) (descr "Resitance 3 pas") (tags R) (path /5490839E) (autoplace_cost180 10) (fp_text reference R_ROW2 (at 0 0.127 180) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 1K (at 0 0.127 180) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 26 N-0000071) ) (pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 68 row2) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module R3 (layer F.Cu) (tedit 4E4C0E65) (tstamp 5CB38C80) (at 229 148.45) (descr "Resitance 3 pas") (tags R) (path /549083A4) (autoplace_cost180 10) (fp_text reference R_ROW3 (at 0 0.127) (layer F.SilkS) hide (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_text value 1K (at 0 0.127) (layer F.SilkS) (effects (font (size 1.397 1.27) (thickness 0.2032))) ) (fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.2032)) (fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.2032)) (fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.2032)) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 32 N-0000077) ) (pad 2 thru_hole circle (at 3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 69 row3) ) (model discret/resistor.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module DIP-18__300 (layer F.Cu) (tedit 200000) (tstamp 54B17CFD) (at 266.8 139.8) (descr "8 pins DIL package, round pads") (path /54B17386) (fp_text reference P2 (at -7.62 -1.27) (layer F.SilkS) (effects (font (size 1.778 1.143) (thickness 0.3048))) ) (fp_text value UDN2981A (at 5.08 1.27) (layer F.SilkS) (effects (font (size 1.778 1.143) (thickness 0.3048))) ) (fp_line (start -12.7 -1.27) (end -11.43 -1.27) (layer F.SilkS) (width 0.381)) (fp_line (start -11.43 -1.27) (end -11.43 1.27) (layer F.SilkS) (width 0.381)) (fp_line (start -11.43 1.27) (end -12.7 1.27) (layer F.SilkS) (width 0.381)) (fp_line (start -12.7 -2.54) (end 12.7 -2.54) (layer F.SilkS) (width 0.381)) (fp_line (start 12.7 -2.54) (end 12.7 2.54) (layer F.SilkS) (width 0.381)) (fp_line (start 12.7 2.54) (end -12.7 2.54) (layer F.SilkS) (width 0.381)) (fp_line (start -12.7 2.54) (end -12.7 -2.54) (layer F.SilkS) (width 0.381)) (pad 1 thru_hole rect (at -10.16 3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 72 xled1) ) (pad 2 thru_hole circle (at -7.62 3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 73 xled2) ) (pad 3 thru_hole circle (at -5.08 3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 74 xled3) ) (pad 4 thru_hole circle (at -2.54 3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 75 xled4) ) (pad 5 thru_hole circle (at 0 3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 76 xled5) ) (pad 6 thru_hole circle (at 2.54 3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 77 xled6) ) (pad 7 thru_hole circle (at 5.08 3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 78 xled7) ) (pad 8 thru_hole circle (at 7.62 3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 79 xled8) ) (pad 9 thru_hole circle (at 10.16 3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 18 N-0000060) ) (pad 10 thru_hole circle (at 10.16 -3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 3 GND) ) (pad 11 thru_hole circle (at 7.62 -3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 66 led8) ) (pad 12 thru_hole circle (at 5.08 -3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 13 thru_hole circle (at 2.54 -3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 14 thru_hole circle (at 0 -3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 15 thru_hole circle (at -2.54 -3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 16 thru_hole circle (at -5.08 -3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 17 thru_hole circle (at -7.62 -3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 18 thru_hole circle (at -10.16 -3.81) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (model dil/dil_18.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module 1pin (layer F.Cu) (tedit 200000) (tstamp 54B1C854) (at 14 70) (descr "module 1 pin (ou trou mecanique de percage)") (tags DEV) (path /54B1CC4A) (fp_text reference M1 (at 0 -3.048) (layer F.SilkS) (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_text value M (at 0 2.794) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_circle (center 0 0) (end 0 -2.286) (layer F.SilkS) (width 0.381)) (pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048) (layers *.Cu *.Mask F.SilkS) ) ) (module 1pin (layer F.Cu) (tedit 200000) (tstamp 5C2B7A95) (at 14 165.4) (descr "module 1 pin (ou trou mecanique de percage)") (tags DEV) (path /54B1CC76) (fp_text reference M2 (at 0 -3.048) (layer F.SilkS) (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_text value M (at 0 2.794) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_circle (center 0 0) (end 0 -2.286) (layer F.SilkS) (width 0.381)) (pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048) (layers *.Cu *.Mask F.SilkS) ) ) (module 1pin (layer F.Cu) (tedit 200000) (tstamp 54B1C860) (at 286 70) (descr "module 1 pin (ou trou mecanique de percage)") (tags DEV) (path /54B1CC7C) (fp_text reference M3 (at 0 -3.048) (layer F.SilkS) (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_text value M (at 0 2.794) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_circle (center 0 0) (end 0 -2.286) (layer F.SilkS) (width 0.381)) (pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048) (layers *.Cu *.Mask F.SilkS) ) ) (module 1pin (layer F.Cu) (tedit 200000) (tstamp 5C1FB93D) (at 286 165.4) (descr "module 1 pin (ou trou mecanique de percage)") (tags DEV) (path /54B1CC82) (fp_text reference M4 (at 0 -3.048) (layer F.SilkS) (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_text value M (at 0 2.794) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_circle (center 0 0) (end 0 -2.286) (layer F.SilkS) (width 0.381)) (pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048) (layers *.Cu *.Mask F.SilkS) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 5CB4A6CD) (at 249.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /549070DB) (fp_text reference D23 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 36 N-0000081) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 5CB4A6DE) (at 259.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /549070E1) (fp_text reference D24 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 45 N-0000097) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 5CB4A6BC) (at 239.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /549070D5) (fp_text reference D22 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 37 N-0000082) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 5CB4A6EF) (at 269.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /549070E7) (fp_text reference D25 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 17 N-00000120) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 55 col7) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 5CB4A733) (at 279.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /549070ED) (fp_text reference D26 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 16 N-00000119) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 56 col8) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17D5D) (at 139.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /54905640) (fp_text reference D12 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 4 N-00000101) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17D6D) (at 39.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /5490504C) (fp_text reference D2 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 24 N-0000069) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17D7D) (at 49.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /54905056) (fp_text reference D3 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 23 N-0000068) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17D8D) (at 59.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /5490505E) (fp_text reference D4 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 22 N-0000067) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17D9D) (at 69.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /54905068) (fp_text reference D5 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 21 N-0000066) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17DAD) (at 79.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /5490506E) (fp_text reference D6 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 20 N-0000065) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17DBD) (at 89.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /549055F9) (fp_text reference D7 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 15 N-00000114) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17DCD) (at 99.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /549055FF) (fp_text reference D8 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 14 N-00000113) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17DDD) (at 109.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /54905605) (fp_text reference D9 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 13 N-00000112) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17DED) (at 119.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /5490560B) (fp_text reference D10 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 12 N-00000111) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17DFD) (at 129.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /54905611) (fp_text reference D11 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 11 N-00000110) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17E0D) (at 29.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /54904DF0) (fp_text reference D1 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 19 N-0000064) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17E1D) (at 149.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /54905646) (fp_text reference D13 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 10 N-00000109) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 55 col7) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17E2D) (at 159.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /5490564C) (fp_text reference D14 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 9 N-00000108) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 56 col8) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17E3D) (at 169.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /54905652) (fp_text reference D15 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 8 N-00000107) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 57 col9) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17E4D) (at 179.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /54905658) (fp_text reference D16 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 7 N-00000106) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 47 col10) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17E5D) (at 189.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /5490565E) (fp_text reference D17 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 6 N-00000105) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 48 col11) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54B17E6D) (at 199.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /54905664) (fp_text reference D18 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 5 N-00000104) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 49 col12) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 5CB4A689) (at 209.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /549070C3) (fp_text reference D19 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 40 N-0000085) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 5CB4A69A) (at 219.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /549070C9) (fp_text reference D20 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 39 N-0000084) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 5CB4A6AB) (at 229.08 171.55) (descr "Diode 3 pas") (tags "DIODE DEV") (path /549070CF) (fp_text reference D21 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value 1N4148 (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 38 N-0000083) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F22E4) (at 169 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5B2) (fp_text reference DMB9 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 57 col9) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F22CB) (at 179 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5B8) (fp_text reference DMB10 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 47 col10) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F22B2) (at 189 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5BE) (fp_text reference DMB11 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 48 col11) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F2299) (at 199 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5C4) (fp_text reference DMB12 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 49 col12) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F2280) (at 89 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5CC) (fp_text reference DAC1 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F2267) (at 99 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5E5) (fp_text reference DAC2 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F224E) (at 109 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5EB) (fp_text reference DAC3 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F2235) (at 119 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5F1) (fp_text reference DAC4 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F221C) (at 129 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5F7) (fp_text reference DAC5 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F2203) (at 139 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5FD) (fp_text reference DAC6 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F21EA) (at 149 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF603) (fp_text reference DAC7 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 55 col7) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F21D1) (at 159 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF609) (fp_text reference DAC8 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 56 col8) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F21B8) (at 169 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF60F) (fp_text reference DAC9 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 57 col9) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F219F) (at 179 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF615) (fp_text reference DAC10 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 47 col10) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3ADF) (tstamp 548F2186) (at 89 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF34A) (fp_text reference DPC1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F216D) (at 199 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF621) (fp_text reference DAC12 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 49 col12) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F2154) (at 89 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF629) (fp_text reference DMQ1 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F213B) (at 99 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF642) (fp_text reference DMQ2 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F2122) (at 109 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF648) (fp_text reference DMQ3 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F2109) (at 119 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF64E) (fp_text reference DMQ4 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F20F0) (at 129 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF654) (fp_text reference DMQ5 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F20D7) (at 139 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF65A) (fp_text reference DMQ6 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F20BE) (at 149 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF660) (fp_text reference DMQ7 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 55 col7) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F20A5) (at 159 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF666) (fp_text reference DMQ8 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 56 col8) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F208C) (at 169 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF66C) (fp_text reference DMQ9 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 57 col9) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F2073) (at 179 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF672) (fp_text reference DMQ10 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 47 col10) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F205A) (at 189 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF678) (fp_text reference DMQ11 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 48 col11) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F2041) (at 199 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF67E) (fp_text reference DMQ12 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 63 led5) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 49 col12) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F2028) (at 79 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF686) (fp_text reference DLINK1 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 66 led8) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 55 col7) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F200F) (at 29 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6A1) (fp_text reference DSC1 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1FF6) (at 189 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF61B) (fp_text reference DAC11 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 62 led4) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 48 col11) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AD6) (tstamp 548F1FDD) (at 99 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF399) (fp_text reference DPC2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AD0) (tstamp 548F1FC4) (at 109 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3AC) (fp_text reference DPC3 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3ACA) (tstamp 548F1FAB) (at 119 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3B2) (fp_text reference DPC4 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AC4) (tstamp 548F1F92) (at 129 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3B8) (fp_text reference DPC5 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AB9) (tstamp 548F1F79) (at 139 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3BE) (fp_text reference DPC6 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AB3) (tstamp 548F1F60) (at 149 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3C4) (fp_text reference DPC7 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 55 col7) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AAE) (tstamp 548F1F47) (at 159 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3CA) (fp_text reference DPC8 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 56 col8) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AA8) (tstamp 548F1F2E) (at 169 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3D0) (fp_text reference DPC9 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 57 col9) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3A9F) (tstamp 548F1F15) (at 179 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3D6) (fp_text reference DPC10 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 47 col10) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3A99) (tstamp 548F1EFC) (at 189 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3DC) (fp_text reference DPC11 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 48 col11) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3A92) (tstamp 548F1EE3) (at 199 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3E2) (fp_text reference DPC12 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 59 led1) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 49 col12) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1ECA) (at 89 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF463) (fp_text reference DMA1 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1EB1) (at 99 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF47C) (fp_text reference DMA2 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1E98) (at 109 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF482) (fp_text reference DMA3 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1E7F) (at 159 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5AC) (fp_text reference DMB8 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 56 col8) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1E66) (at 129 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF48E) (fp_text reference DMA5 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1E4D) (at 139 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF494) (fp_text reference DMA6 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1E34) (at 149 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF49A) (fp_text reference DMA7 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 55 col7) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1E1B) (at 159 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF4A0) (fp_text reference DMA8 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 56 col8) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1E02) (at 169 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF4A6) (fp_text reference DMA9 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 57 col9) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1DE9) (at 179 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF4AC) (fp_text reference DMA10 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 47 col10) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1DD0) (at 189 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF4B2) (fp_text reference DMA11 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 48 col11) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1DB7) (at 199 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF4B8) (fp_text reference DMA12 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 49 col12) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1D9E) (at 89 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF56F) (fp_text reference DMB1 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1D85) (at 99 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF588) (fp_text reference DMB2 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1D6C) (at 109 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF58E) (fp_text reference DMB3 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1D53) (at 119 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF594) (fp_text reference DMB4 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1D3A) (at 129 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF59A) (fp_text reference DMB5 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1D21) (at 139 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5A0) (fp_text reference DMB6 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1D08) (at 149 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5A6) (fp_text reference DMB7 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 61 led3) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 55 col7) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1CEF) (at 119 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF488) (fp_text reference DMA4 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 60 led2) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD77AA) (tstamp 548F1CD6) (at 279 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF843) (fp_text reference DRUN1 (at -9 -1.7) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD77A3) (tstamp 548F1CBD) (at 279 77.9) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF83D) (fp_text reference DPAUSE1 (at -8.5 -1.9) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD77A5) (tstamp 548F1CA4) (at 279 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF837) (fp_text reference DION1 (at -9.5 -2.1) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD778C) (tstamp 548F1C8B) (at 259 107.1) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7E9) (fp_text reference DBREAK1 (at -8.5 -1.6) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7784) (tstamp 548F1C72) (at 259 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7E3) (fp_text reference DCURAD1 (at -8.5 -1.8) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD777C) (tstamp 548F1C59) (at 259 92.5) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7DD) (fp_text reference DWRDCT1 (at -8.5 -2) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 49 col12) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7779) (tstamp 548F1C40) (at 259 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7D7) (fp_text reference DDEFER1 (at -8.5 -1.7) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 48 col11) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7795) (tstamp 548F1C27) (at 259 77.9) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7D1) (fp_text reference DEXEC1 (at -9 -1.9) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 47 col10) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7797) (tstamp 548F1C0E) (at 259 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7CB) (fp_text reference DFETCH1 (at -9 -2.1) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 57 col9) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD774F) (tstamp 548F1BF5) (at 239 121.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF789) (fp_text reference DOPR1 (at -7.5 -1.7) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 56 col8) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD773D) (tstamp 548F1BDC) (at 239 114.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF783) (fp_text reference DIOT1 (at -7.5 -1.9) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 55 col7) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7737) (tstamp 548F1BC3) (at 239 107) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF77D) (fp_text reference DJMP1 (at -7.5 -1.6) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD772E) (tstamp 548F1BAA) (at 239 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF777) (fp_text reference DJMS1 (at -8 -1.8) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7708) (tstamp 548F1B91) (at 239 92.5) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF741) (fp_text reference DDCA1 (at -8 -1.5) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1B78) (at 39 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6BA) (fp_text reference DSC2 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 55 col7) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1B5F) (at 59 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6C6) (fp_text reference DSC4 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 57 col9) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1B46) (at 69 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6CC) (fp_text reference DSC5 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 47 col10) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3B04) (tstamp 548F1B14) (at 29 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6DA) (fp_text reference DDF1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 66 led8) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AFF) (tstamp 548F1AFB) (at 39 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6F3) (fp_text reference DDF2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 66 led8) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AF9) (tstamp 548F1AE2) (at 49 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6F9) (fp_text reference DDF3 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 66 led8) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7621) (tstamp 548F1AC9) (at 49 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6C0) (fp_text reference DSC3 (at 0 -5.5372) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 56 col8) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7714) (tstamp 548F1AB0) (at 239 77.9) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF735) (fp_text reference DTAD1 (at -8 -1.9) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 50 col2) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD7712) (tstamp 548F1A97) (at 239 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF728) (fp_text reference DAND1 (at -8 -2.1) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 46 col1) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 54BD771B) (tstamp 548F1A7E) (at 239 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF73B) (fp_text reference DISZ1 (at -8 -1.7) (layer F.SilkS) (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 64 led6) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 51 col3) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AEA) (tstamp 548F1A65) (at 69 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF71A) (fp_text reference DIF2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 66 led8) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AE4) (tstamp 548F1A4C) (at 79 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF720) (fp_text reference DIF3 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 66 led8) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 54 col6) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-PDP (layer F.Cu) (tedit 562A3AF4) (tstamp 548F1A33) (at 59 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF701) (fp_text reference DIF1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (fp_line (start -2.4 1.5) (end -2.4 -1.5) (layer F.SilkS) (width 0.15)) (fp_line (start 1.5 2.4) (end -1.5 2.4) (layer F.SilkS) (width 0.15)) (fp_line (start 2.4 -1.5) (end 2.4 1.5) (layer F.SilkS) (width 0.15)) (fp_line (start -1.5 -2.4) (end 1.5 -2.4) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 1.5) (end -1.5 2.4) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 1.5) (end 2.4 1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start -1.5 -1.5) (end -2.4 -1.5) (angle 90) (layer F.SilkS) (width 0.15)) (fp_arc (start 1.5 -1.5) (end 1.5 -2.4) (angle 90) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 66 led8) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-StrEight (layer F.Cu) (tedit 554E561D) (tstamp 554E5741) (at 259 114.4) (descr LED) (tags LED) (path /554E5897) (fp_text reference DPAUSE2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 52 col4) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LED-3-StrEight (layer F.Cu) (tedit 554E561D) (tstamp 554E5747) (at 259 121.7) (descr LED) (tags LED) (path /554E589D) (fp_text reference DRUN2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad 1 thru_hole circle (at -1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 65 led7) ) (pad 2 thru_hole circle (at 1.27 0) (size 1.6764 1.6764) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 53 col5) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module RASPI_BPLUS_MIRRORED (layer B.Cu) (tedit 5C1EE4DD) (tstamp 5C1E52A8) (at 216.3 140 180) (descr "Double rangee de contacts 2 x 12 pins") (tags CONN) (path /548F13F7) (fp_text reference P1 (at 0 3.81 180) (layer B.SilkS) (effects (font (size 1.016 1.016) (thickness 0.27432)) (justify mirror)) ) (fp_text value RASPI_MODEL_B_PLUS_GPIO (at 0 -3.81 180) (layer B.SilkS) (effects (font (size 1.016 1.016) (thickness 0.2032)) (justify mirror)) ) (fp_text user ETH (at 49.53 43.18 450) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 48.768 49.022) (end 53.594 49.022) (layer B.SilkS) (width 0.15)) (fp_line (start 53.594 49.022) (end 53.594 38.354) (layer B.SilkS) (width 0.15)) (fp_line (start 53.594 38.354) (end 49.784 38.354) (layer B.SilkS) (width 0.15)) (fp_text user "GPIO and mount holes exact, port placement approx." (at 8.274 14.778 180) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_text user "RASPI B PLUS (MIRROR IMAGE)" (at 0 24.5 180) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_text user microUSB (at -19 47 180) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -22 49.008) (end -22 52.508) (layer B.SilkS) (width 0.15)) (fp_line (start -16 49.008) (end -16 52.508) (layer B.SilkS) (width 0.15)) (fp_text user HDMI (at 0 47 180) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -7 48.5) (end -7 52.5) (layer B.SilkS) (width 0.15)) (fp_line (start 6 48.5) (end 6 52.5) (layer B.SilkS) (width 0.15)) (fp_text user USB (at 49.5 3.5 450) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_text user USB (at 49.5 20.5 450) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 49.5 11.032) (end 54 11.032) (layer B.SilkS) (width 0.15)) (fp_line (start 54 11.032) (end 54 0.032) (layer B.SilkS) (width 0.15)) (fp_line (start 54 0.032) (end 50 0.032) (layer B.SilkS) (width 0.15)) (fp_line (start 49.5 28.032) (end 54 28.032) (layer B.SilkS) (width 0.15)) (fp_line (start 54 28.032) (end 54 16.532) (layer B.SilkS) (width 0.15)) (fp_line (start 54 16.532) (end 49.5 16.532) (layer B.SilkS) (width 0.15)) (fp_line (start -32.5 -3.5) (end 52.5 -3.5) (layer B.SilkS) (width 0.15)) (fp_line (start 52.5 52.5) (end 52.5 -3.5) (layer B.SilkS) (width 0.15)) (fp_line (start 52.5 52.5) (end 32 52.5) (layer B.SilkS) (width 0.15)) (fp_line (start -32.5 52.5) (end -32.5 -3.5) (layer B.SilkS) (width 0.15)) (fp_line (start -32.5 52.5) (end 32.5 52.5) (layer B.SilkS) (width 0.15)) (fp_line (start 25.4 -2.54) (end -25.4 -2.54) (layer B.SilkS) (width 0.3048)) (fp_line (start 25.4 2.54) (end -25.4 2.54) (layer B.SilkS) (width 0.3048)) (fp_line (start 25.4 2.54) (end 25.4 -2.54) (layer B.SilkS) (width 0.3048)) (fp_line (start -25.4 2.54) (end -25.4 -2.54) (layer B.SilkS) (width 0.3048)) (pad 1 thru_hole rect (at -24.13 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 1 +3.3V) ) (pad 2 thru_hole circle (at -24.13 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 2 +5V) ) (pad 11 thru_hole circle (at -11.43 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 26 N-0000071) ) (pad 4 thru_hole circle (at -21.59 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 2 +5V) ) (pad 13 thru_hole circle (at -8.89 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 79 xled8) ) (pad 6 thru_hole circle (at -19.05 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 3 GND) ) (pad 15 thru_hole circle (at -6.35 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 74 xled3) ) (pad 8 thru_hole circle (at -16.51 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 41 N-0000087) ) (pad 17 thru_hole circle (at -3.81 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) ) (pad 10 thru_hole circle (at -13.97 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 42 N-0000088) ) (pad 19 thru_hole circle (at -1.27 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 27 N-0000072) ) (pad 12 thru_hole circle (at -11.43 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 32 N-0000077) ) (pad 21 thru_hole circle (at 1.27 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 28 N-0000073) ) (pad 14 thru_hole circle (at -8.89 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) ) (pad 23 thru_hole circle (at 3.81 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 43 N-0000095) ) (pad 16 thru_hole circle (at -6.35 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 75 xled4) ) (pad 25 thru_hole circle (at 6.35 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) ) (pad 18 thru_hole circle (at -3.81 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 76 xled5) ) (pad 27 thru_hole circle (at 8.89 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) ) (pad 20 thru_hole circle (at -1.27 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 3 GND) ) (pad 29 thru_hole circle (at 11.43 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 29 N-0000074) ) (pad 22 thru_hole circle (at 1.27 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 77 xled6) ) (pad 31 thru_hole circle (at 13.97 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 30 N-0000075) ) (pad 24 thru_hole circle (at 3.81 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 33 N-0000078) ) (pad 26 thru_hole circle (at 6.35 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 44 N-0000096) ) (pad 33 thru_hole circle (at 16.51 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 31 N-0000076) ) (pad 28 thru_hole circle (at 8.89 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) ) (pad 32 thru_hole circle (at 13.97 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 34 N-0000079) ) (pad 34 thru_hole circle (at 16.51 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) ) (pad 36 thru_hole circle (at 19.05 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 35 N-0000080) ) (pad 38 thru_hole circle (at 21.59 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 72 xled1) ) (pad 35 thru_hole circle (at 19.05 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) ) (pad 37 thru_hole circle (at 21.59 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 78 xled7) ) (pad 3 thru_hole circle (at -21.59 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 71 sda) ) (pad 5 thru_hole circle (at -19.05 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 70 scl) ) (pad 7 thru_hole circle (at -16.51 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 25 N-0000070) ) (pad 9 thru_hole circle (at -13.97 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 58 i2cgnd) ) (pad 39 thru_hole circle (at 24.13 1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) ) (pad 40 thru_hole circle (at 24.13 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 73 xled2) ) (pad 30 thru_hole circle (at 11.43 -1.27 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) ) (pad H2 thru_hole circle (at -29 0 180) (size 2.85 2.85) (drill 2.75) (layers *.Cu *.Mask B.SilkS) ) (pad H3 thru_hole circle (at 29 0 180) (size 2.85 2.85) (drill 2.75) (layers *.Cu *.Mask B.SilkS) ) (pad H4 thru_hole circle (at 29 49 180) (size 2.85 2.85) (drill 2.75) (layers *.Cu *.Mask B.SilkS) ) (pad H1 thru_hole circle (at -29 49 180) (size 2.85 2.85) (drill 2.75) (layers *.Cu *.Mask B.SilkS) ) (model pin_array/pins_array_20x2.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module D2 (layer F.Cu) (tedit 54B29F05) (tstamp 54BD7076) (at 244.25 143.9) (descr "Diode 3 pas") (tags "DIODE DEV") (path /54BD85A3) (fp_text reference DZ1 (at 0 -0.508) (layer F.SilkS) (effects (font (size 0.25 0.25) (thickness 0.05))) ) (fp_text value ZENER (at -0.508 0.508) (layer F.SilkS) hide (effects (font (size 0.381 0.381) (thickness 0.0762))) ) (fp_line (start -2.032 1.016) (end 2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.794 0) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 0) (end 2.032 -1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 -1.016) (end -2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.794 0) (layer F.SilkS) (width 0.3048)) (fp_line (start -2.032 0) (end -2.032 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 2.032 1.016) (end 2.032 0) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.524 -1.016) (end 1.524 1.016) (layer F.SilkS) (width 0.3048)) (fp_line (start 1.27 1.016) (end 1.27 -1.016) (layer F.SilkS) (width 0.3048)) (pad 2 thru_hole rect (at 3.556 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 18 N-0000060) ) (pad 1 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) (net 2 +5V) ) (model discret/diode.wrl (at (xyz 0 0 0)) (scale (xyz 0.3 0.3 0.3)) (rotate (xyz 0 0 0)) ) ) (module PIN_ARRAY_4x1 (layer B.Cu) (tedit 5C2B7968) (tstamp 5C1E83FF) (at 236.626 135.23 180) (descr "Double rangee de contacts 2 x 5 pins") (tags CONN) (path /5C1DA337) (fp_text reference "I2C (ANGLED HEADER, OPTIONAL)" (at 0 2.54 180) (layer B.SilkS) (effects (font (size 0.7 0.7) (thickness 0.175)) (justify mirror)) ) (fp_text value CONN_4 (at 0 -2.54 180) (layer B.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.2032)) (justify mirror)) ) (fp_line (start 5.08 -1.27) (end -5.08 -1.27) (layer B.SilkS) (width 0.254)) (fp_line (start 5.08 1.27) (end -5.08 1.27) (layer B.SilkS) (width 0.254)) (fp_line (start -5.08 1.27) (end -5.08 -1.27) (layer B.SilkS) (width 0.254)) (fp_line (start 5.08 -1.27) (end 5.08 1.27) (layer B.SilkS) (width 0.254)) (pad 1 thru_hole rect (at -3.81 0 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 1 +3.3V) ) (pad 2 thru_hole circle (at -1.27 0 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 71 sda) ) (pad 3 thru_hole circle (at 1.27 0 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 70 scl) ) (pad 4 thru_hole circle (at 3.81 0 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask B.SilkS) (net 58 i2cgnd) ) (model pin_array\pins_array_4x1.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module LOGO (layer F.Cu) (tedit 0) (tstamp 5C1EEB2B) (at 40 100) (fp_text reference G*** (at 0 3.89382) (layer F.SilkS) hide (effects (font (size 1.524 1.524) (thickness 0.3048))) ) (fp_text value LOGO (at 0 -3.89382) (layer F.SilkS) hide (effects (font (size 1.524 1.524) (thickness 0.3048))) ) (fp_poly (pts (xy 21.16582 3.13182) (xy 20.87118 3.13182) (xy 20.87118 2.83718) (xy 20.87118 0) (xy 20.87118 -2.83718) (xy 0 -2.83718) (xy -20.87118 -2.83718) (xy -20.89404 -0.08636) (xy -20.89658 0.5842) (xy -20.89912 1.20142) (xy -20.89658 1.74498) (xy -20.89404 2.19456) (xy -20.88896 2.5273) (xy -20.88134 2.72796) (xy -20.87372 2.77114) (xy -20.8407 2.78384) (xy -20.74672 2.794) (xy -20.5867 2.80416) (xy -20.35302 2.81432) (xy -20.04568 2.82194) (xy -19.65198 2.82956) (xy -19.17192 2.83464) (xy -18.60042 2.84226) (xy -17.92732 2.84734) (xy -17.15262 2.84988) (xy -16.26616 2.85496) (xy -15.2654 2.8575) (xy -14.14526 2.86004) (xy -12.89812 2.86258) (xy -11.52144 2.86258) (xy -10.0076 2.86258) (xy -8.35152 2.86258) (xy -6.54812 2.86258) (xy -4.59232 2.86004) (xy -2.47904 2.86004) (xy -0.2032 2.8575) (xy 0.01778 2.8575) (xy 20.87118 2.83718) (xy 20.87118 3.13182) (xy 0 3.13182) (xy -21.16582 3.13182) (xy -21.16582 0) (xy -21.16582 -3.13182) (xy 0 -3.13182) (xy 21.16582 -3.13182) (xy 21.16582 0) (xy 21.16582 3.13182) (xy 21.16582 3.13182)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy -18.37182 2.20218) (xy -18.542 2.20218) (xy -18.542 1.19126) (xy -18.542 0.04572) (xy -18.542 -1.09982) (xy -18.75282 -1.09982) (xy -18.8849 -1.08458) (xy -18.94586 -1.00838) (xy -18.96364 -0.82296) (xy -18.96618 -0.71882) (xy -18.96618 -0.33528) (xy -19.17446 -0.4699) (xy -19.42338 -0.5588) (xy -19.65198 -0.50292) (xy -19.84502 -0.33528) (xy -19.98726 -0.08382) (xy -20.066 0.22352) (xy -20.05838 0.56134) (xy -19.95678 0.89662) (xy -19.94154 0.9271) (xy -19.79168 1.14808) (xy -19.6088 1.23444) (xy -19.34718 1.22174) (xy -19.06524 1.1938) (xy -18.81632 1.18618) (xy -18.542 1.19126) (xy -18.542 2.20218) (xy -19.24812 2.20218) (xy -19.61642 2.19456) (xy -19.92122 2.18186) (xy -20.12188 2.16154) (xy -20.1803 2.14376) (xy -20.19554 2.04724) (xy -20.20824 1.80594) (xy -20.22094 1.44018) (xy -20.22856 0.9779) (xy -20.23364 0.43942) (xy -20.23618 -0.01524) (xy -20.23618 -2.11582) (xy -19.304 -2.11582) (xy -18.37182 -2.11582) (xy -18.37182 0.04318) (xy -18.37182 2.20218) (xy -18.37182 2.20218)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy -16.16964 -2.11582) (xy -16.1925 0.02032) (xy -16.21282 2.159) (xy -16.93418 2.17678) (xy -16.93418 0.54102) (xy -16.93418 0.33782) (xy -16.93418 -0.04572) (xy -16.93418 -0.8509) (xy -16.93418 -0.889) (xy -16.96974 -1.05156) (xy -17.1069 -1.09982) (xy -17.145 -1.09982) (xy -17.30756 -1.0668) (xy -17.35582 -0.92964) (xy -17.35582 -0.889) (xy -17.3228 -0.72898) (xy -17.18564 -0.67818) (xy -17.145 -0.67818) (xy -16.98498 -0.71374) (xy -16.93418 -0.8509) (xy -16.93418 -0.04572) (xy -16.94434 -0.2921) (xy -16.96974 -0.42926) (xy -17.01546 -0.49276) (xy -17.0942 -0.508) (xy -17.145 -0.508) (xy -17.24152 -0.50292) (xy -17.30248 -0.46736) (xy -17.33804 -0.3683) (xy -17.35328 -0.1778) (xy -17.35582 0.13462) (xy -17.35582 0.33782) (xy -17.35582 0.72136) (xy -17.34566 0.96774) (xy -17.3228 1.10744) (xy -17.27454 1.1684) (xy -17.1958 1.18364) (xy -17.145 1.18618) (xy -17.04848 1.17856) (xy -16.98752 1.143) (xy -16.9545 1.04648) (xy -16.93672 0.85598) (xy -16.93418 0.54102) (xy -16.93418 2.17678) (xy -17.12468 2.18186) (xy -18.034 2.20726) (xy -18.034 0.04572) (xy -18.034 -2.11582) (xy -17.10182 -2.11582) (xy -16.16964 -2.11582) (xy -16.16964 -2.11582)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy -14.05382 2.20218) (xy -14.2113 2.20218) (xy -14.2113 -0.508) (xy -14.42974 -0.508) (xy -14.5923 -0.48006) (xy -14.64818 -0.42164) (xy -14.7066 -0.40132) (xy -14.84884 -0.46736) (xy -14.85646 -0.4699) (xy -15.1003 -0.55626) (xy -15.3289 -0.50038) (xy -15.52194 -0.33528) (xy -15.66926 -0.09144) (xy -15.75054 0.20066) (xy -15.75562 0.51308) (xy -15.66672 0.8128) (xy -15.57274 0.96266) (xy -15.36446 1.12268) (xy -15.10284 1.18872) (xy -14.859 1.1557) (xy -14.74978 1.08458) (xy -14.66596 1.03886) (xy -14.64818 1.1176) (xy -14.69644 1.27762) (xy -14.73454 1.3589) (xy -14.86916 1.47828) (xy -15.0622 1.524) (xy -15.23238 1.48844) (xy -15.28318 1.44018) (xy -15.38224 1.38176) (xy -15.5448 1.35636) (xy -15.69212 1.36144) (xy -15.748 1.40208) (xy -15.6845 1.5748) (xy -15.53718 1.75768) (xy -15.38224 1.86436) (xy -15.0876 1.9177) (xy -14.76248 1.8669) (xy -14.48816 1.73482) (xy -14.4399 1.69418) (xy -14.36624 1.6002) (xy -14.3129 1.4732) (xy -14.27734 1.2827) (xy -14.25702 0.99314) (xy -14.23924 0.5715) (xy -14.23924 0.50546) (xy -14.2113 -0.508) (xy -14.2113 2.20218) (xy -14.986 2.20218) (xy -15.91818 2.20218) (xy -15.91818 0.04318) (xy -15.91818 -2.11582) (xy -14.986 -2.11582) (xy -14.05382 -2.11582) (xy -14.05382 0.04318) (xy -14.05382 2.20218) (xy -14.05382 2.20218)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy -11.85164 -2.11582) (xy -11.8745 0.02032) (xy -11.89482 2.159) (xy -12.61618 2.17678) (xy -12.61618 0.54102) (xy -12.61618 0.33782) (xy -12.61618 -0.04572) (xy -12.61618 -0.8509) (xy -12.61618 -0.889) (xy -12.65174 -1.05156) (xy -12.7889 -1.09982) (xy -12.827 -1.09982) (xy -12.98956 -1.0668) (xy -13.03782 -0.92964) (xy -13.03782 -0.889) (xy -13.0048 -0.72898) (xy -12.86764 -0.67818) (xy -12.827 -0.67818) (xy -12.66698 -0.71374) (xy -12.61618 -0.8509) (xy -12.61618 -0.04572) (xy -12.62634 -0.2921) (xy -12.65174 -0.42926) (xy -12.69746 -0.49276) (xy -12.7762 -0.508) (xy -12.827 -0.508) (xy -12.92352 -0.50292) (xy -12.98448 -0.46736) (xy -13.02004 -0.3683) (xy -13.03528 -0.1778) (xy -13.03782 0.13462) (xy -13.03782 0.33782) (xy -13.03782 0.72136) (xy -13.02766 0.96774) (xy -13.0048 1.10744) (xy -12.95654 1.1684) (xy -12.8778 1.18364) (xy -12.827 1.18618) (xy -12.73048 1.17856) (xy -12.66952 1.143) (xy -12.6365 1.04648) (xy -12.61872 0.85598) (xy -12.61618 0.54102) (xy -12.61618 2.17678) (xy -12.80668 2.18186) (xy -13.716 2.20726) (xy -13.716 0.04572) (xy -13.716 -2.11582) (xy -12.78382 -2.11582) (xy -11.85164 -2.11582) (xy -11.85164 -2.11582)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy -9.73582 2.20218) (xy -10.24382 2.20218) (xy -10.24382 -0.33782) (xy -10.29716 -0.47752) (xy -10.37082 -0.508) (xy -10.47242 -0.58166) (xy -10.49782 -0.76708) (xy -10.51814 -0.94996) (xy -10.59942 -1.00584) (xy -10.68832 -1.00076) (xy -10.84834 -0.91948) (xy -10.90676 -0.74168) (xy -10.94994 -0.5715) (xy -11.01344 -0.508) (xy -11.07694 -0.43688) (xy -11.09218 -0.33782) (xy -11.05662 -0.20066) (xy -11.00582 -0.17018) (xy -10.96264 -0.09144) (xy -10.9347 0.11684) (xy -10.922 0.41656) (xy -10.9093 0.78232) (xy -10.86104 1.016) (xy -10.78484 1.14046) (xy -10.59434 1.24714) (xy -10.40638 1.2319) (xy -10.27938 1.10744) (xy -10.2616 1.03632) (xy -10.28192 0.87884) (xy -10.36574 0.84582) (xy -10.44194 0.8128) (xy -10.48258 0.6858) (xy -10.49782 0.43434) (xy -10.49782 0.33782) (xy -10.4902 0.04318) (xy -10.45464 -0.1143) (xy -10.3886 -0.16764) (xy -10.37082 -0.17018) (xy -10.26922 -0.2413) (xy -10.24382 -0.33782) (xy -10.24382 2.20218) (xy -10.668 2.20218) (xy -11.60018 2.20218) (xy -11.60018 0.04318) (xy -11.60018 -2.11582) (xy -10.668 -2.11582) (xy -9.73582 -2.11582) (xy -9.73582 0.04318) (xy -9.73582 2.20218) (xy -9.73582 2.20218)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy -7.62 2.20218) (xy -7.83082 2.20218) (xy -7.83082 1.18618) (xy -7.8613 0.4445) (xy -7.88162 0.09906) (xy -7.91718 -0.18796) (xy -7.95782 -0.3683) (xy -7.9756 -0.39878) (xy -8.17626 -0.5334) (xy -8.43788 -0.5715) (xy -8.71474 -0.52578) (xy -8.95604 -0.41148) (xy -9.11098 -0.23876) (xy -9.144 -0.10668) (xy -9.07796 -0.0254) (xy -8.93572 -0.00254) (xy -8.79856 -0.04826) (xy -8.763 -0.08382) (xy -8.64616 -0.14986) (xy -8.49884 -0.17018) (xy -8.3312 -0.13462) (xy -8.2931 -0.04572) (xy -8.37184 0.05842) (xy -8.5471 0.14732) (xy -8.67156 0.1778) (xy -8.99414 0.2921) (xy -9.17956 0.50292) (xy -9.22782 0.7493) (xy -9.16178 1.02108) (xy -8.98398 1.1938) (xy -8.72998 1.23698) (xy -8.68172 1.22936) (xy -8.4074 1.19126) (xy -8.128 1.1811) (xy -7.83082 1.18618) (xy -7.83082 2.20218) (xy -8.509 2.20218) (xy -9.398 2.20218) (xy -9.398 0.04318) (xy -9.398 -2.11582) (xy -8.509 -2.11582) (xy -7.62 -2.11582) (xy -7.62 0.04318) (xy -7.62 2.20218) (xy -7.62 2.20218)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy -5.41782 2.20218) (xy -6.17982 2.20218) (xy -6.17982 1.18618) (xy -6.17982 0.04318) (xy -6.17982 -1.09982) (xy -6.39318 -1.09982) (xy -6.604 -1.09982) (xy -6.604 0.04318) (xy -6.604 1.18618) (xy -6.39318 1.18618) (xy -6.17982 1.18618) (xy -6.17982 2.20218) (xy -6.35 2.20218) (xy -7.28218 2.20218) (xy -7.28218 0.04318) (xy -7.28218 -2.11582) (xy -6.35 -2.11582) (xy -5.41782 -2.11582) (xy -5.41782 0.04318) (xy -5.41782 2.20218) (xy -5.41782 2.20218)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy 0.40894 -0.6223) (xy 0.37846 -0.27178) (xy 0.27178 0.03556) (xy 0.09398 0.24892) (xy 0.05334 0.27178) (xy -0.06096 0.29972) (xy -0.06096 -0.59182) (xy -0.06858 -0.80772) (xy -0.10668 -0.96266) (xy -0.19558 -1.0668) (xy -0.36322 -1.13284) (xy -0.62992 -1.1684) (xy -1.02108 -1.18364) (xy -1.53416 -1.18618) (xy -2.794 -1.18618) (xy -2.794 -0.59182) (xy -2.794 0) (xy -1.53416 0) (xy -1.02616 -0.00254) (xy -0.66294 -0.01524) (xy -0.41656 -0.03556) (xy -0.26416 -0.06858) (xy -0.18034 -0.11684) (xy -0.16764 -0.12954) (xy -0.09906 -0.29464) (xy -0.0635 -0.53848) (xy -0.06096 -0.59182) (xy -0.06096 0.29972) (xy -0.10414 0.31242) (xy -0.40386 0.35052) (xy -0.82296 0.381) (xy -1.3335 0.40386) (xy -1.4605 0.4064) (xy -2.794 0.44196) (xy -2.794 1.02616) (xy -2.79654 1.33096) (xy -2.81686 1.50622) (xy -2.86512 1.58496) (xy -2.95402 1.60782) (xy -3.00482 1.60782) (xy -3.21818 1.60782) (xy -3.21818 -0.0127) (xy -3.21818 -1.63322) (xy -1.6637 -1.5875) (xy -1.15062 -1.56972) (xy -0.69342 -1.54178) (xy -0.31496 -1.5113) (xy -0.05334 -1.47828) (xy 0.0635 -1.45034) (xy 0.254 -1.26238) (xy 0.3683 -0.97028) (xy 0.40894 -0.6223) (xy 0.40894 -0.6223)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy 4.89712 -0.19304) (xy 4.89458 0.36576) (xy 4.84378 0.7874) (xy 4.73202 1.09474) (xy 4.55676 1.31826) (xy 4.47294 1.37922) (xy 4.47294 -0.19558) (xy 4.46278 -0.32258) (xy 4.43484 -0.61468) (xy 4.38658 -0.83312) (xy 4.2926 -0.98806) (xy 4.13512 -1.08966) (xy 3.88874 -1.14808) (xy 3.53314 -1.17602) (xy 3.04292 -1.18618) (xy 2.70002 -1.18618) (xy 1.35382 -1.18618) (xy 1.35382 0) (xy 1.35382 1.18618) (xy 2.71018 1.18618) (xy 3.22326 1.18364) (xy 3.5941 1.17602) (xy 3.85318 1.16078) (xy 4.02336 1.13538) (xy 4.13258 1.0922) (xy 4.21386 1.03378) (xy 4.2291 1.02108) (xy 4.38912 0.75438) (xy 4.4704 0.35052) (xy 4.47294 -0.19558) (xy 4.47294 1.37922) (xy 4.44246 1.40462) (xy 4.33832 1.4605) (xy 4.191 1.50114) (xy 3.98018 1.53162) (xy 3.68046 1.55448) (xy 3.2639 1.5748) (xy 2.71018 1.59004) (xy 2.57556 1.59258) (xy 1.9939 1.60274) (xy 1.5621 1.60782) (xy 1.25476 1.6002) (xy 1.05664 1.58496) (xy 0.94234 1.55702) (xy 0.89154 1.51892) (xy 0.889 1.5113) (xy 0.87376 1.38938) (xy 0.86614 1.1303) (xy 0.86106 0.762) (xy 0.86106 0.31242) (xy 0.86614 -0.0889) (xy 0.889 -1.56718) (xy 1.73482 -1.59512) (xy 2.22504 -1.6002) (xy 2.7813 -1.59258) (xy 3.31216 -1.57226) (xy 3.45694 -1.56464) (xy 3.8608 -1.53416) (xy 4.13766 -1.50114) (xy 4.32562 -1.45034) (xy 4.46786 -1.37668) (xy 4.59994 -1.27) (xy 4.7244 -1.15316) (xy 4.80314 -1.0414) (xy 4.84886 -0.89154) (xy 4.8768 -0.66548) (xy 4.89204 -0.32512) (xy 4.89712 -0.19304) (xy 4.89712 -0.19304)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy 9.144 -0.5969) (xy 9.12622 -0.2794) (xy 9.06018 -0.03556) (xy 8.9281 0.14478) (xy 8.71982 0.26416) (xy 8.71982 -0.59182) (xy 8.70458 -0.86868) (xy 8.64362 -1.02616) (xy 8.55726 -1.09728) (xy 8.41502 -1.1303) (xy 8.13562 -1.1557) (xy 7.75716 -1.17602) (xy 7.31012 -1.18618) (xy 7.16026 -1.18618) (xy 5.92582 -1.18618) (xy 5.92582 -0.59182) (xy 5.92582 0) (xy 7.16026 0) (xy 7.62 -0.00508) (xy 8.02386 -0.02286) (xy 8.33882 -0.04572) (xy 8.52678 -0.0762) (xy 8.55726 -0.0889) (xy 8.6614 -0.18542) (xy 8.70966 -0.36576) (xy 8.71982 -0.59182) (xy 8.71982 0.26416) (xy 8.70966 0.27178) (xy 8.38708 0.3556) (xy 7.94004 0.40132) (xy 7.3533 0.4191) (xy 7.0485 0.42164) (xy 5.92582 0.42418) (xy 5.92582 1.016) (xy 5.92074 1.32588) (xy 5.90042 1.50622) (xy 5.8547 1.5875) (xy 5.77088 1.60782) (xy 5.7531 1.60782) (xy 5.59562 1.5621) (xy 5.53974 1.4986) (xy 5.52704 1.38176) (xy 5.51942 1.12522) (xy 5.51688 0.75946) (xy 5.51688 0.31496) (xy 5.52196 -0.0889) (xy 5.54482 -1.56718) (xy 7.15264 -1.55448) (xy 8.75792 -1.53924) (xy 8.95096 -1.31572) (xy 9.07034 -1.13538) (xy 9.12876 -0.91186) (xy 9.144 -0.5969) (xy 9.144 -0.5969)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy 16.002 0.70612) (xy 15.96644 1.03886) (xy 15.84452 1.27) (xy 15.61084 1.41732) (xy 15.57274 1.42494) (xy 15.57274 0.60706) (xy 15.5321 0.37338) (xy 15.48892 0.30734) (xy 15.48892 -0.76962) (xy 15.4432 -0.99314) (xy 15.37716 -1.0922) (xy 15.23238 -1.13792) (xy 14.93266 -1.16332) (xy 14.47292 -1.17094) (xy 14.09192 -1.16586) (xy 12.92606 -1.143) (xy 12.84478 -0.9017) (xy 12.81684 -0.58674) (xy 12.85748 -0.4572) (xy 12.90066 -0.37592) (xy 12.95908 -0.32004) (xy 13.06576 -0.28448) (xy 13.2461 -0.26416) (xy 13.52804 -0.25654) (xy 13.94206 -0.254) (xy 14.11986 -0.254) (xy 14.67866 -0.26162) (xy 15.07236 -0.28194) (xy 15.31112 -0.32004) (xy 15.3924 -0.3556) (xy 15.47114 -0.53086) (xy 15.48892 -0.76962) (xy 15.48892 0.30734) (xy 15.45336 0.25654) (xy 15.30858 0.20574) (xy 15.0368 0.17018) (xy 14.67612 0.14732) (xy 14.26718 0.13462) (xy 13.85316 0.13716) (xy 13.46962 0.1524) (xy 13.1572 0.18288) (xy 12.95908 0.22352) (xy 12.92352 0.24384) (xy 12.827 0.41402) (xy 12.78636 0.66548) (xy 12.80668 0.91694) (xy 12.88542 1.08458) (xy 13.01496 1.1303) (xy 13.2969 1.16332) (xy 13.73632 1.1811) (xy 14.15034 1.18618) (xy 14.63802 1.1811) (xy 14.98346 1.1684) (xy 15.21714 1.14554) (xy 15.36192 1.10744) (xy 15.44574 1.05156) (xy 15.5448 0.86106) (xy 15.57274 0.60706) (xy 15.57274 1.42494) (xy 15.24 1.5113) (xy 15.15618 1.52654) (xy 14.74216 1.56718) (xy 14.26464 1.59004) (xy 13.78966 1.59258) (xy 13.37818 1.57226) (xy 13.208 1.55194) (xy 12.81938 1.4732) (xy 12.56792 1.36906) (xy 12.42822 1.2065) (xy 12.3698 0.96012) (xy 12.36218 0.71882) (xy 12.40028 0.35052) (xy 12.51458 0.10414) (xy 12.69492 0) (xy 12.72794 -0.00254) (xy 12.7381 -0.04572) (xy 12.6365 -0.14986) (xy 12.61618 -0.16764) (xy 12.48156 -0.29972) (xy 12.4206 -0.47244) (xy 12.40282 -0.74676) (xy 12.40282 -0.75438) (xy 12.43838 -1.11252) (xy 12.54506 -1.32334) (xy 12.77112 -1.4478) (xy 13.15466 -1.5367) (xy 13.6906 -1.5875) (xy 14.224 -1.6002) (xy 14.85646 -1.57988) (xy 15.33906 -1.51892) (xy 15.66164 -1.41732) (xy 15.80642 -1.30556) (xy 15.89278 -1.08712) (xy 15.92072 -0.8001) (xy 15.89278 -0.50546) (xy 15.81404 -0.27178) (xy 15.7607 -0.2032) (xy 15.66164 -0.10414) (xy 15.66926 -0.01778) (xy 15.79118 0.11938) (xy 15.80134 0.13208) (xy 15.94612 0.33782) (xy 15.99946 0.6096) (xy 16.002 0.70612) (xy 16.002 0.70612)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy 18.28292 -1.50368) (xy 18.25244 -1.39446) (xy 18.17116 -1.15316) (xy 18.0467 -0.80772) (xy 17.88922 -0.38608) (xy 17.71142 0.08382) (xy 17.51076 0.60198) (xy 17.35836 0.98552) (xy 17.24406 1.25222) (xy 17.15262 1.42494) (xy 17.07388 1.524) (xy 16.99768 1.57226) (xy 16.91132 1.59258) (xy 16.89862 1.59258) (xy 16.73352 1.59766) (xy 16.69542 1.5367) (xy 16.71574 1.46558) (xy 16.76654 1.34112) (xy 16.86306 1.08458) (xy 17.00022 0.72644) (xy 17.16532 0.29464) (xy 17.33296 -0.14732) (xy 17.53108 -0.66548) (xy 17.68348 -1.04648) (xy 17.79778 -1.3081) (xy 17.88922 -1.47574) (xy 17.96542 -1.56718) (xy 18.03654 -1.60274) (xy 18.08734 -1.60782) (xy 18.23974 -1.57226) (xy 18.28292 -1.50368) (xy 18.28292 -1.50368)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy 19.939 0.54864) (xy 19.93392 0.9525) (xy 19.9263 1.23444) (xy 19.90852 1.41478) (xy 19.88058 1.51892) (xy 19.8374 1.56972) (xy 19.77898 1.5875) (xy 19.7485 1.59258) (xy 19.58086 1.56972) (xy 19.51228 1.50622) (xy 19.49958 1.38684) (xy 19.49196 1.12776) (xy 19.48688 0.75946) (xy 19.48688 0.31242) (xy 19.49196 -0.0889) (xy 19.51482 -1.56718) (xy 19.72818 -1.56718) (xy 19.939 -1.56718) (xy 19.939 0) (xy 19.939 0.54864) (xy 19.939 0.54864)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy 11.684 0.42418) (xy 10.795 0.42418) (xy 9.906 0.42418) (xy 9.906 0.21082) (xy 9.906 0) (xy 10.795 0) (xy 11.684 0) (xy 11.684 0.21082) (xy 11.684 0.42418) (xy 11.684 0.42418)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy -18.98142 0.21082) (xy -18.98396 0.45212) (xy -19.07032 0.67056) (xy -19.23542 0.81026) (xy -19.3167 0.83058) (xy -19.5199 0.8001) (xy -19.59102 0.71628) (xy -19.64944 0.42926) (xy -19.61896 0.1651) (xy -19.51736 -0.0381) (xy -19.36242 -0.1397) (xy -19.23542 -0.13208) (xy -19.0627 -0.00254) (xy -18.98142 0.21082) (xy -18.98142 0.21082)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy -14.6812 0.49276) (xy -14.76502 0.70866) (xy -14.9098 0.83312) (xy -15.0876 0.83566) (xy -15.22222 0.74422) (xy -15.30096 0.57404) (xy -15.32128 0.32766) (xy -15.28826 0.08382) (xy -15.20444 -0.07874) (xy -15.2019 -0.08128) (xy -15.01394 -0.1524) (xy -14.83614 -0.07874) (xy -14.70914 0.11684) (xy -14.68628 0.20828) (xy -14.6812 0.49276) (xy -14.6812 0.49276)) (layer F.SilkS) (width 0.00254)) (fp_poly (pts (xy -8.29818 0.57658) (xy -8.35152 0.76708) (xy -8.47852 0.89154) (xy -8.63092 0.92202) (xy -8.75538 0.8382) (xy -8.78078 0.79248) (xy -8.76046 0.62738) (xy -8.67664 0.53848) (xy -8.47344 0.43434) (xy -8.33882 0.4572) (xy -8.29818 0.57658) (xy -8.29818 0.57658)) (layer F.SilkS) (width 0.00254)) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F1841) (at 229 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EF882) (fp_text reference SW21 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value DEP (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 69 row3) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 38 N-0000083) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F1852) (at 129 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFB42) (fp_text reference SW11 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SR5 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 11 N-00000110) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F1863) (at 119 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFB33) (fp_text reference SW10 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SR4 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 12 N-00000111) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F1874) (at 109 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFB2D) (fp_text reference SW9 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SR3 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 13 N-00000112) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F1885) (at 99 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFB27) (fp_text reference SW8 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SR2 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 14 N-00000113) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F1896) (at 89 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFAF8) (fp_text reference SW7 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SR1 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 15 N-00000114) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 56C3AA12) (at 279 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EF8A0) (fp_text reference SW26 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SING_INST (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 69 row3) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 16 N-00000119) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F18B8) (at 269 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EF89A) (fp_text reference SW25 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SING_STEP (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 69 row3) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 17 N-00000120) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F18C9) (at 259 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EF894) (fp_text reference SW24 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value STOP (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 69 row3) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 45 N-0000097) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F18DA) (at 249 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EF88E) (fp_text reference SW23 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value CONT (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 69 row3) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 36 N-0000081) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F18EB) (at 239 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EF888) (fp_text reference SW22 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value EXAM (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 69 row3) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 37 N-0000082) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F18FC) (at 179 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFB60) (fp_text reference SW16 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SR10 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 7 N-00000106) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F190D) (at 219 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EF87C) (fp_text reference SW20 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value LOAD_ADD (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 69 row3) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 39 N-0000084) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F191E) (at 209 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EF86F) (fp_text reference SW19 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value START (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 69 row3) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 40 N-0000085) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F192F) (at 139 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFB48) (fp_text reference SW12 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SR6 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 4 N-00000101) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F1940) (at 149 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFB4E) (fp_text reference SW13 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SR7 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 10 N-00000109) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F1951) (at 159 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFB54) (fp_text reference SW14 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SR8 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 9 N-00000108) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F1962) (at 169 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFB5A) (fp_text reference SW15 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SR9 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 8 N-00000107) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F1973) (at 189 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFB66) (fp_text reference SW17 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value SR11 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 6 N-00000105) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F1984) (at 199 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFB6C) (fp_text reference SW18 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value "SR 12" (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 67 row1) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 5 N-00000104) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 5668A41C) (at 29 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFBFD) (fp_text reference SW1 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value DF1 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 68 row2) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 19 N-0000064) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F19A6) (at 39 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFC03) (fp_text reference SW2 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value DF2 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 68 row2) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 24 N-0000069) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F19B7) (at 49 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFC09) (fp_text reference SW3 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value DF3 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 68 row2) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 23 N-0000068) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F19C8) (at 59 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFC0F) (fp_text reference SW4 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value IF1 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 68 row2) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 22 N-0000067) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F19D9) (at 69 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFC15) (fp_text reference SW5 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value IF2 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 68 row2) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 21 N-0000066) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (module SW_PIDP2019 (layer F.Cu) (tedit 5CB38C3F) (tstamp 548F19EA) (at 79 159.9) (descr "Switch inverseur") (tags "SWITCH DEV") (path /548EFC1B) (fp_text reference SW6 (at 3.429 -3.683 90) (layer F.SilkS) hide (effects (font (size 0.3 0.3) (thickness 0.05))) ) (fp_text value IF3 (at 0 -13.3) (layer F.SilkS) (effects (font (size 1.2 1.2) (thickness 0.2032))) ) (fp_line (start -4.7 -10) (end 4.7 -10) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 5.75) (end 4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end -4.75 2) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 5.75) (end 4.75 5.75) (layer F.SilkS) (width 0.15)) (fp_line (start -4.75 1.95) (end -4.75 -10.35) (layer F.SilkS) (width 0.15)) (fp_line (start 4.75 -10.3) (end 4.75 1.95) (layer F.SilkS) (width 0.15)) (pad 1 thru_hole oval (at 0 0) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 68 row2) (clearance 0.8) ) (pad 2 thru_hole oval (at 0 -4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (net 20 N-0000065) (clearance 0.65) ) (pad "" thru_hole circle (at 1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole oval (at 0 4.7) (size 3.9 2.1) (drill oval 2.9 1.1) (layers *.Cu *.Mask F.SilkS) (clearance 0.65) ) (pad "" thru_hole circle (at -1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at -1.6 -7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) (pad "" thru_hole circle (at 1.6 7.875) (size 2.5 2.5) (drill 1.6) (layers *.Cu *.Mask F.SilkS) ) ) (gr_text "B T" (at 279.1 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "B T" (at 269.1 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W M" (at 259 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W M" (at 249 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W M" (at 238.9 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W M" (at 229 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W M" (at 219.1 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "B M" (at 209.3 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "B T" (at 149.1 157.4) (layer F.SilkS) (tstamp 5CD9A8B1) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "B T" (at 159.3 157.4) (layer F.SilkS) (tstamp 5CD9A8B0) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "B T" (at 169.4 157.4) (layer F.SilkS) (tstamp 5CD9A8AF) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W T" (at 178.9 157.4) (layer F.SilkS) (tstamp 5CD9A8AE) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W T" (at 189 157.4) (layer F.SilkS) (tstamp 5CD9A8AD) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W T" (at 199 157.4) (layer F.SilkS) (tstamp 5CD9A8AC) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "B T" (at 89 157.4) (layer F.SilkS) (tstamp 5CD9A873) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "B T" (at 99.2 157.4) (layer F.SilkS) (tstamp 5CD9A872) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "B T" (at 109.3 157.4) (layer F.SilkS) (tstamp 5CD9A871) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W T" (at 118.8 157.4) (layer F.SilkS) (tstamp 5CD9A870) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W T" (at 128.9 157.4) (layer F.SilkS) (tstamp 5CD9A86F) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W T" (at 138.9 157.4) (layer F.SilkS) (tstamp 5CD9A86E) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W T" (at 78.8 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W T" (at 68.8 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "W T" (at 58.7 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "B T" (at 49.2 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "B T" (at 39.1 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_text "B T" (at 28.9 157.4) (layer F.SilkS) (effects (font (size 1.7 1.5) (thickness 0.3))) ) (gr_line (start 10 173.75) (end 10 65.5) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 11.5 173.75) (end 10 173.75) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 291 173.75) (end 291 65.5) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 289.75 173.75) (end 291 173.75) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 289.75 173.75) (end 11.5 173.75) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 291 65.5) (end 10 65.5) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 212.9 112.8) (end 212.9 113.3) (angle 90) (layer F.SilkS) (width 0.1)) (gr_line (start 213.3 112.4) (end 212.9 112.8) (angle 90) (layer F.SilkS) (width 0.1)) (gr_line (start 214.3 112.4) (end 213.3 112.4) (angle 90) (layer F.SilkS) (width 0.1)) (gr_line (start 214.7 112.8) (end 214.3 112.4) (angle 90) (layer F.SilkS) (width 0.1)) (gr_line (start 214.7 113.2) (end 214.7 112.8) (angle 90) (layer F.SilkS) (width 0.1)) (gr_text "ALL\nLEDs" (at 213.8 112.9) (layer F.SilkS) (effects (font (size 0.5 0.5) (thickness 0.125))) ) (gr_line (start 213.3 112.8) (end 213.4 112.7) (angle 90) (layer F.SilkS) (width 0.1)) (gr_line (start 212.9 114.1) (end 212.9 113.2) (angle 90) (layer F.SilkS) (width 0.1)) (gr_line (start 214.7 114.1) (end 214.7 113.2) (angle 90) (layer F.SilkS) (width 0.1)) (gr_line (start 212.9 114.1) (end 214.7 114.1) (angle 90) (layer F.SilkS) (width 0.1)) (gr_line (start 214.5 115.5) (end 214.5 114.1) (angle 90) (layer F.SilkS) (width 0.1)) (gr_line (start 213.2 116.6) (end 213.2 114.1) (angle 90) (layer F.SilkS) (width 0.1)) (gr_line (start 290 65.8) (end 290.4 65.8) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 290 65.4) (end 290 65.8) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 290 174.5) (end 290.3 174.5) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 290 174.8) (end 290 174.5) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 9.5 174.5) (end 9.2 174.5) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 9.5 174.8) (end 9.5 174.5) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 9.5 65.8) (end 9.2 65.8) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 9.5 65.5) (end 9.5 65.8) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 9.5 166.5) (end 10.25 166.5) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 9.5 165.75) (end 9.5 167.2) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 290 166.5) (end 289.55 166.5) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 290 166.05) (end 290 166.9) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 24.25 166.15) (end 24.25 165.4) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 24.25 166.15) (end 25.55 166.15) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 24.25 165.25) (end 25.5 165.25) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 24.25 163.45) (end 24.25 165.25) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_text "Rev 3b 2019-05-13" (at 283.6 95.25 90) (layer B.SilkS) (effects (font (size 1.1 1.1) (thickness 0.1875)) (justify left mirror)) ) (gr_text "2 optional LEDs for \nStraight Eight only" (at 262.5598 118.4148 90) (layer F.SilkS) (effects (font (size 0.6 0.6) (thickness 0.1))) ) (gr_line (start 259.0038 121.7168) (end 258.953 121.7168) (angle 90) (layer B.SilkS) (width 0.2)) (gr_line (start 261.5946 114.4524) (end 261.5946 121.793) (angle 90) (layer F.SilkS) (width 0.2)) (gr_text "PiDP-8/I\nFront Panel" (at 275 95 90) (layer B.SilkS) (effects (font (size 3 3) (thickness 0.6)) (justify left mirror)) ) (segment (start 240.43 136.6333) (end 240.43 138.73) (width 0.508) (layer B.Cu) (net 1)) (segment (start 240.436 136.6273) (end 240.43 136.6333) (width 0.508) (layer B.Cu) (net 1)) (segment (start 240.436 135.23) (end 240.436 136.6273) (width 0.508) (layer B.Cu) (net 1)) (segment (start 237.89 141.27) (end 240.43 141.27) (width 0.508) (layer F.Cu) (net 2)) (segment (start 240.43 143.89) (end 240.44 143.9) (width 0.508) (layer F.Cu) (net 2)) (segment (start 240.43 141.27) (end 240.43 143.89) (width 0.508) (layer F.Cu) (net 2)) (via (at 250.3474 138.8443) (size 0.889) (layers F.Cu B.Cu) (net 3)) (via (at 226.0723 142.6747) (size 0.889) (layers F.Cu B.Cu) (net 3)) (segment (start 243.9552 145.2365) (end 250.3474 138.8443) (width 0.508) (layer B.Cu) (net 3)) (segment (start 239.3165 145.2365) (end 243.9552 145.2365) (width 0.508) (layer B.Cu) (net 3)) (segment (start 235.35 141.27) (end 239.3165 145.2365) (width 0.508) (layer B.Cu) (net 3)) (segment (start 274.1057 138.8443) (end 250.3474 138.8443) (width 0.508) (layer F.Cu) (net 3)) (segment (start 276.96 135.99) (end 274.1057 138.8443) (width 0.508) (layer F.Cu) (net 3)) (segment (start 218.9747 142.6747) (end 226.0723 142.6747) (width 0.508) (layer B.Cu) (net 3)) (segment (start 217.57 141.27) (end 218.9747 142.6747) (width 0.508) (layer B.Cu) (net 3)) (segment (start 233.9453 142.6747) (end 226.0723 142.6747) (width 0.508) (layer F.Cu) (net 3)) (segment (start 235.35 141.27) (end 233.9453 142.6747) (width 0.508) (layer F.Cu) (net 3)) (segment (start 142.636 171.55) (end 142.636 158.836) (width 0.508) (layer B.Cu) (net 4)) (segment (start 142.636 158.836) (end 139 155.2) (width 0.508) (layer B.Cu) (net 4)) (segment (start 202.636 171.55) (end 202.636 158.836) (width 0.508) (layer B.Cu) (net 5)) (segment (start 202.636 158.836) (end 199 155.2) (width 0.508) (layer B.Cu) (net 5)) (segment (start 192.636 171.55) (end 192.636 158.836) (width 0.508) (layer B.Cu) (net 6)) (segment (start 192.636 158.836) (end 189 155.2) (width 0.508) (layer B.Cu) (net 6)) (segment (start 182.636 171.55) (end 182.636 158.836) (width 0.508) (layer B.Cu) (net 7)) (segment (start 182.636 158.836) (end 179 155.2) (width 0.508) (layer B.Cu) (net 7)) (segment (start 172.636 171.55) (end 172.636 158.836) (width 0.508) (layer B.Cu) (net 8)) (segment (start 172.636 158.836) (end 169 155.2) (width 0.508) (layer B.Cu) (net 8)) (segment (start 162.636 171.55) (end 162.636 158.836) (width 0.508) (layer B.Cu) (net 9)) (segment (start 162.636 158.836) (end 159 155.2) (width 0.508) (layer B.Cu) (net 9)) (segment (start 152.636 171.55) (end 152.636 158.836) (width 0.508) (layer B.Cu) (net 10)) (segment (start 152.636 158.836) (end 149 155.2) (width 0.508) (layer B.Cu) (net 10)) (segment (start 132.636 171.55) (end 132.636 158.836) (width 0.508) (layer B.Cu) (net 11)) (segment (start 132.636 158.836) (end 129 155.2) (width 0.508) (layer B.Cu) (net 11)) (segment (start 122.636 171.55) (end 122.636 158.836) (width 0.508) (layer B.Cu) (net 12)) (segment (start 122.636 158.836) (end 119 155.2) (width 0.508) (layer B.Cu) (net 12)) (segment (start 112.636 171.55) (end 112.636 158.836) (width 0.508) (layer B.Cu) (net 13)) (segment (start 112.636 158.836) (end 109 155.2) (width 0.508) (layer B.Cu) (net 13)) (segment (start 102.636 171.55) (end 102.636 158.836) (width 0.508) (layer B.Cu) (net 14)) (segment (start 102.636 158.836) (end 99 155.2) (width 0.508) (layer B.Cu) (net 14)) (segment (start 92.636 171.55) (end 92.636 158.636) (width 0.508) (layer B.Cu) (net 15)) (segment (start 89.2 155.2) (end 89 155.2) (width 0.508) (layer B.Cu) (net 15)) (segment (start 89.2 155.2) (end 92.636 158.636) (width 0.508) (layer B.Cu) (net 15)) (segment (start 282.636 171.55) (end 282.636 158.836) (width 0.508) (layer B.Cu) (net 16)) (segment (start 282.636 158.836) (end 279 155.2) (width 0.508) (layer B.Cu) (net 16)) (segment (start 272.636 171.55) (end 272.636 158.836) (width 0.508) (layer B.Cu) (net 17)) (segment (start 272.636 158.836) (end 269 155.2) (width 0.508) (layer B.Cu) (net 17)) (segment (start 274.496 141.146) (end 276.96 143.61) (width 0.508) (layer F.Cu) (net 18)) (segment (start 251.7668 141.146) (end 274.496 141.146) (width 0.508) (layer F.Cu) (net 18)) (segment (start 249.0128 143.9) (end 251.7668 141.146) (width 0.508) (layer F.Cu) (net 18)) (segment (start 247.806 143.9) (end 249.0128 143.9) (width 0.508) (layer F.Cu) (net 18)) (segment (start 32.636 171.55) (end 32.636 158.836) (width 0.508) (layer B.Cu) (net 19)) (segment (start 32.636 158.836) (end 29 155.2) (width 0.508) (layer B.Cu) (net 19)) (segment (start 82.636 171.55) (end 82.636 158.836) (width 0.508) (layer B.Cu) (net 20)) (segment (start 82.636 158.836) (end 79 155.2) (width 0.508) (layer B.Cu) (net 20)) (segment (start 72.636 171.55) (end 72.636 158.836) (width 0.508) (layer B.Cu) (net 21)) (segment (start 72.636 158.836) (end 69 155.2) (width 0.508) (layer B.Cu) (net 21)) (segment (start 62.636 171.55) (end 62.636 158.836) (width 0.508) (layer B.Cu) (net 22)) (segment (start 62.636 158.836) (end 59 155.2) (width 0.508) (layer B.Cu) (net 22)) (segment (start 52.636 171.55) (end 52.636 158.836) (width 0.508) (layer B.Cu) (net 23)) (segment (start 52.636 158.836) (end 49 155.2) (width 0.508) (layer B.Cu) (net 23)) (segment (start 42.636 171.55) (end 42.636 158.836) (width 0.508) (layer B.Cu) (net 24)) (segment (start 42.636 158.836) (end 39 155.2) (width 0.508) (layer B.Cu) (net 24)) (via (at 119.6837 133.344) (size 0.889) (layers F.Cu B.Cu) (net 25)) (segment (start 116.3827 123.5023) (end 117.91 121.975) (width 0.508) (layer B.Cu) (net 25)) (segment (start 116.3827 130.043) (end 116.3827 123.5023) (width 0.508) (layer B.Cu) (net 25)) (segment (start 119.6837 133.344) (end 116.3827 130.043) (width 0.508) (layer B.Cu) (net 25)) (segment (start 229.744 135.664) (end 232.81 138.73) (width 0.508) (layer F.Cu) (net 25)) (segment (start 201.824 135.664) (end 229.744 135.664) (width 0.508) (layer F.Cu) (net 25)) (segment (start 199.504 133.344) (end 201.824 135.664) (width 0.508) (layer F.Cu) (net 25)) (segment (start 119.6837 133.344) (end 199.504 133.344) (width 0.508) (layer F.Cu) (net 25)) (segment (start 225.5533 136.5533) (end 227.73 138.73) (width 0.508) (layer F.Cu) (net 26)) (segment (start 201.6353 136.5533) (end 225.5533 136.5533) (width 0.508) (layer F.Cu) (net 26)) (segment (start 200.4132 135.3312) (end 201.6353 136.5533) (width 0.508) (layer F.Cu) (net 26)) (segment (start 95.9788 135.3312) (end 200.4132 135.3312) (width 0.508) (layer F.Cu) (net 26)) (segment (start 82.81 148.5) (end 95.9788 135.3312) (width 0.508) (layer F.Cu) (net 26)) (via (at 215.6143 130.234) (size 0.889) (layers F.Cu B.Cu) (net 27)) (segment (start 215.6143 136.7743) (end 215.6143 130.234) (width 0.508) (layer B.Cu) (net 27)) (segment (start 217.57 138.73) (end 215.6143 136.7743) (width 0.508) (layer B.Cu) (net 27)) (segment (start 215.6143 127.6307) (end 215.6143 130.234) (width 0.508) (layer F.Cu) (net 27)) (segment (start 206.9826 118.999) (end 215.6143 127.6307) (width 0.508) (layer F.Cu) (net 27)) (segment (start 185.3789 118.999) (end 206.9826 118.999) (width 0.508) (layer F.Cu) (net 27)) (segment (start 181.4887 122.8892) (end 185.3789 118.999) (width 0.508) (layer F.Cu) (net 27)) (segment (start 179.0742 122.8892) (end 181.4887 122.8892) (width 0.508) (layer F.Cu) (net 27)) (segment (start 177.91 121.725) (end 179.0742 122.8892) (width 0.508) (layer F.Cu) (net 27)) (via (at 206.4671 130.2172) (size 0.889) (layers F.Cu B.Cu) (net 28)) (segment (start 214.9799 138.73) (end 206.4671 130.2172) (width 0.508) (layer B.Cu) (net 28)) (segment (start 215.03 138.73) (end 214.9799 138.73) (width 0.508) (layer B.Cu) (net 28)) (segment (start 169.7075 123.6725) (end 167.86 121.825) (width 0.508) (layer F.Cu) (net 28)) (segment (start 184.1025 123.6725) (end 169.7075 123.6725) (width 0.508) (layer F.Cu) (net 28)) (segment (start 187.76 120.015) (end 184.1025 123.6725) (width 0.508) (layer F.Cu) (net 28)) (segment (start 200.4173 120.015) (end 187.76 120.015) (width 0.508) (layer F.Cu) (net 28)) (segment (start 206.4671 126.0648) (end 200.4173 120.015) (width 0.508) (layer F.Cu) (net 28)) (segment (start 206.4671 130.2172) (end 206.4671 126.0648) (width 0.508) (layer F.Cu) (net 28)) (via (at 130.909 136.5692) (size 0.889) (layers F.Cu B.Cu) (net 29)) (segment (start 126.3827 132.0429) (end 130.909 136.5692) (width 0.508) (layer B.Cu) (net 29)) (segment (start 126.3827 123.4523) (end 126.3827 132.0429) (width 0.508) (layer B.Cu) (net 29)) (segment (start 127.91 121.925) (end 126.3827 123.4523) (width 0.508) (layer B.Cu) (net 29)) (segment (start 203.5679 137.4279) (end 204.87 138.73) (width 0.508) (layer F.Cu) (net 29)) (segment (start 201.4319 137.4279) (end 203.5679 137.4279) (width 0.508) (layer F.Cu) (net 29)) (segment (start 200.3541 136.3501) (end 201.4319 137.4279) (width 0.508) (layer F.Cu) (net 29)) (segment (start 131.1281 136.3501) (end 200.3541 136.3501) (width 0.508) (layer F.Cu) (net 29)) (segment (start 130.909 136.5692) (end 131.1281 136.3501) (width 0.508) (layer F.Cu) (net 29)) (via (at 139.2972 137.3125) (size 0.889) (layers F.Cu B.Cu) (net 30)) (segment (start 136.3522 134.3675) (end 139.2972 137.3125) (width 0.508) (layer B.Cu) (net 30)) (segment (start 136.3522 123.4328) (end 136.3522 134.3675) (width 0.508) (layer B.Cu) (net 30)) (segment (start 137.86 121.925) (end 136.3522 123.4328) (width 0.508) (layer B.Cu) (net 30)) (segment (start 201.656 138.73) (end 202.33 138.73) (width 0.508) (layer F.Cu) (net 30)) (segment (start 200.2385 137.3125) (end 201.656 138.73) (width 0.508) (layer F.Cu) (net 30)) (segment (start 139.2972 137.3125) (end 200.2385 137.3125) (width 0.508) (layer F.Cu) (net 30)) (via (at 205.0389 132.9169) (size 0.889) (layers F.Cu B.Cu) (net 31)) (segment (start 205.0389 133.4811) (end 205.0389 132.9169) (width 0.508) (layer B.Cu) (net 31)) (segment (start 199.79 138.73) (end 205.0389 133.4811) (width 0.508) (layer B.Cu) (net 31)) (segment (start 207.86 130.1718) (end 207.86 121.625) (width 0.508) (layer F.Cu) (net 31)) (segment (start 205.1149 132.9169) (end 207.86 130.1718) (width 0.508) (layer F.Cu) (net 31)) (segment (start 205.0389 132.9169) (end 205.1149 132.9169) (width 0.508) (layer F.Cu) (net 31)) (segment (start 227.73 145.91) (end 225.19 148.45) (width 0.508) (layer B.Cu) (net 32)) (segment (start 227.73 141.27) (end 227.73 145.91) (width 0.508) (layer B.Cu) (net 32)) (via (at 161.6319 139.2741) (size 0.889) (layers F.Cu B.Cu) (net 33)) (segment (start 156.3689 123.4161) (end 157.91 121.875) (width 0.508) (layer B.Cu) (net 33)) (segment (start 156.3689 134.0111) (end 156.3689 123.4161) (width 0.508) (layer B.Cu) (net 33)) (segment (start 161.6319 139.2741) (end 156.3689 134.0111) (width 0.508) (layer B.Cu) (net 33)) (segment (start 209.4375 144.3225) (end 212.49 141.27) (width 0.508) (layer F.Cu) (net 33)) (segment (start 166.6803 144.3225) (end 209.4375 144.3225) (width 0.508) (layer F.Cu) (net 33)) (segment (start 161.6319 139.2741) (end 166.6803 144.3225) (width 0.508) (layer F.Cu) (net 33)) (via (at 185.6706 138.3838) (size 0.889) (layers F.Cu B.Cu) (net 34)) (via (at 189.1604 124.08) (size 0.889) (layers F.Cu B.Cu) (net 34)) (segment (start 184.6979 139.3565) (end 185.6706 138.3838) (width 0.508) (layer F.Cu) (net 34)) (segment (start 184.6979 140.8829) (end 184.6979 139.3565) (width 0.508) (layer F.Cu) (net 34)) (segment (start 186.4841 142.6691) (end 184.6979 140.8829) (width 0.508) (layer F.Cu) (net 34)) (segment (start 200.9309 142.6691) (end 186.4841 142.6691) (width 0.508) (layer F.Cu) (net 34)) (segment (start 202.33 141.27) (end 200.9309 142.6691) (width 0.508) (layer F.Cu) (net 34)) (segment (start 185.6706 127.5698) (end 189.1604 124.08) (width 0.508) (layer B.Cu) (net 34)) (segment (start 185.6706 138.3838) (end 185.6706 127.5698) (width 0.508) (layer B.Cu) (net 34)) (segment (start 195.405 124.08) (end 197.86 121.625) (width 0.508) (layer F.Cu) (net 34)) (segment (start 189.1604 124.08) (end 195.405 124.08) (width 0.508) (layer F.Cu) (net 34)) (via (at 201.1696 146.9135) (size 0.889) (layers F.Cu B.Cu) (net 35)) (segment (start 201.1696 145.1896) (end 201.1696 146.9135) (width 0.508) (layer B.Cu) (net 35)) (segment (start 197.25 141.27) (end 201.1696 145.1896) (width 0.508) (layer B.Cu) (net 35)) (segment (start 194.5965 146.9135) (end 193.06 148.45) (width 0.508) (layer F.Cu) (net 35)) (segment (start 201.1696 146.9135) (end 194.5965 146.9135) (width 0.508) (layer F.Cu) (net 35)) (segment (start 252.636 171.55) (end 252.636 158.836) (width 0.508) (layer B.Cu) (net 36)) (segment (start 252.636 158.836) (end 249 155.2) (width 0.508) (layer B.Cu) (net 36)) (segment (start 242.636 171.55) (end 242.636 158.836) (width 0.508) (layer B.Cu) (net 37)) (segment (start 242.636 158.836) (end 239 155.2) (width 0.508) (layer B.Cu) (net 37)) (segment (start 232.636 171.55) (end 232.636 158.836) (width 0.508) (layer B.Cu) (net 38)) (segment (start 232.636 158.836) (end 229 155.2) (width 0.508) (layer B.Cu) (net 38)) (segment (start 222.636 171.55) (end 222.636 158.836) (width 0.508) (layer B.Cu) (net 39)) (segment (start 222.636 158.836) (end 219 155.2) (width 0.508) (layer B.Cu) (net 39)) (segment (start 212.636 171.55) (end 212.636 158.836) (width 0.508) (layer B.Cu) (net 40)) (segment (start 212.636 158.836) (end 209 155.2) (width 0.508) (layer B.Cu) (net 40)) (via (at 230.3619 146.305) (size 0.889) (layers F.Cu B.Cu) (net 41)) (via (at 98.568 137.7346) (size 0.889) (layers F.Cu B.Cu) (net 41)) (segment (start 96.3522 123.4828) (end 97.86 121.975) (width 0.508) (layer B.Cu) (net 41)) (segment (start 96.3522 135.5188) (end 96.3522 123.4828) (width 0.508) (layer B.Cu) (net 41)) (segment (start 98.568 137.7346) (end 96.3522 135.5188) (width 0.508) (layer B.Cu) (net 41)) (segment (start 206.4734 146.305) (end 230.3619 146.305) (width 0.508) (layer F.Cu) (net 41)) (segment (start 205.3668 145.1984) (end 206.4734 146.305) (width 0.508) (layer F.Cu) (net 41)) (segment (start 116.4148 145.1984) (end 205.3668 145.1984) (width 0.508) (layer F.Cu) (net 41)) (segment (start 108.951 137.7346) (end 116.4148 145.1984) (width 0.508) (layer F.Cu) (net 41)) (segment (start 98.568 137.7346) (end 108.951 137.7346) (width 0.508) (layer F.Cu) (net 41)) (segment (start 232.81 143.8569) (end 230.3619 146.305) (width 0.508) (layer B.Cu) (net 41)) (segment (start 232.81 141.27) (end 232.81 143.8569) (width 0.508) (layer B.Cu) (net 41)) (via (at 227.45 147.5993) (size 0.889) (layers F.Cu B.Cu) (net 42)) (via (at 109.2972 139.4931) (size 0.889) (layers F.Cu B.Cu) (net 42)) (segment (start 106.3827 136.5786) (end 109.2972 139.4931) (width 0.508) (layer B.Cu) (net 42)) (segment (start 106.3827 123.5023) (end 106.3827 136.5786) (width 0.508) (layer B.Cu) (net 42)) (segment (start 107.91 121.975) (end 106.3827 123.5023) (width 0.508) (layer B.Cu) (net 42)) (segment (start 230.27 144.7793) (end 227.45 147.5993) (width 0.508) (layer B.Cu) (net 42)) (segment (start 230.27 141.27) (end 230.27 144.7793) (width 0.508) (layer B.Cu) (net 42)) (segment (start 227.0938 147.2431) (end 227.45 147.5993) (width 0.508) (layer F.Cu) (net 42)) (segment (start 202.8467 147.2431) (end 227.0938 147.2431) (width 0.508) (layer F.Cu) (net 42)) (segment (start 201.5643 145.9607) (end 202.8467 147.2431) (width 0.508) (layer F.Cu) (net 42)) (segment (start 115.7648 145.9607) (end 201.5643 145.9607) (width 0.508) (layer F.Cu) (net 42)) (segment (start 109.2972 139.4931) (end 115.7648 145.9607) (width 0.508) (layer F.Cu) (net 42)) (via (at 193.2987 123.077) (size 0.889) (layers F.Cu B.Cu) (net 43)) (segment (start 193.2987 129.6987) (end 193.2987 123.077) (width 0.508) (layer B.Cu) (net 43)) (segment (start 195.5269 131.9269) (end 193.2987 129.6987) (width 0.508) (layer B.Cu) (net 43)) (segment (start 205.6869 131.9269) (end 195.5269 131.9269) (width 0.508) (layer B.Cu) (net 43)) (segment (start 212.49 138.73) (end 205.6869 131.9269) (width 0.508) (layer B.Cu) (net 43)) (segment (start 189.212 123.077) (end 187.81 121.675) (width 0.508) (layer F.Cu) (net 43)) (segment (start 193.2987 123.077) (end 189.212 123.077) (width 0.508) (layer F.Cu) (net 43)) (via (at 143.392 138.3213) (size 0.889) (layers F.Cu B.Cu) (net 44)) (segment (start 143.392 126.443) (end 143.392 138.3213) (width 0.508) (layer B.Cu) (net 44)) (segment (start 147.96 121.875) (end 143.392 126.443) (width 0.508) (layer B.Cu) (net 44)) (segment (start 207.6598 143.5602) (end 209.95 141.27) (width 0.508) (layer F.Cu) (net 44)) (segment (start 167.2655 143.5602) (end 207.6598 143.5602) (width 0.508) (layer F.Cu) (net 44)) (segment (start 162.0266 138.3213) (end 167.2655 143.5602) (width 0.508) (layer F.Cu) (net 44)) (segment (start 143.392 138.3213) (end 162.0266 138.3213) (width 0.508) (layer F.Cu) (net 44)) (segment (start 262.636 171.55) (end 262.636 158.836) (width 0.508) (layer B.Cu) (net 45)) (segment (start 262.636 158.836) (end 259 155.2) (width 0.508) (layer B.Cu) (net 45)) (segment (start 27.1511 169.9514) (end 26.8686 169.9514) (width 0.508) (layer F.Cu) (net 46)) (segment (start 85.27 171.55) (end 83.6714 169.9514) (width 0.508) (layer F.Cu) (net 46) (tstamp 5CB4AA74)) (segment (start 27.1511 169.9514) (end 83.5159 169.9514) (width 0.508) (layer F.Cu) (net 46)) (segment (start 83.5159 169.9514) (end 83.6714 169.9514) (width 0.508) (layer F.Cu) (net 46)) (segment (start 26.8686 169.9514) (end 25.27 171.55) (width 0.508) (layer F.Cu) (net 46) (tstamp 5CB4AA7E)) (segment (start 205.27 171.55) (end 205.27 153.835) (width 0.508) (layer B.Cu) (net 46)) (segment (start 194.1059 120.9224) (end 194.1059 107.9259) (width 0.508) (layer B.Cu) (net 46)) (segment (start 194.1059 120.9224) (end 192.3459 122.6824) (width 0.508) (layer B.Cu) (net 46)) (segment (start 192.3459 122.6824) (end 192.3459 123.8756) (width 0.508) (layer B.Cu) (net 46)) (segment (start 192.3459 123.8756) (end 192.4423 123.972) (width 0.508) (layer B.Cu) (net 46)) (segment (start 192.4423 123.972) (end 192.4423 130.5703) (width 0.508) (layer B.Cu) (net 46)) (segment (start 192.4423 130.5703) (end 190.8989 132.1137) (width 0.508) (layer B.Cu) (net 46)) (segment (start 190.8989 132.1137) (end 190.8989 142.1309) (width 0.508) (layer B.Cu) (net 46)) (segment (start 190.8989 142.1309) (end 198.501 149.733) (width 0.508) (layer B.Cu) (net 46)) (segment (start 198.501 149.733) (end 201.168 149.733) (width 0.508) (layer B.Cu) (net 46)) (segment (start 201.168 149.733) (end 205.27 153.835) (width 0.508) (layer B.Cu) (net 46)) (via (at 194.1059 107.9259) (size 0.889) (layers F.Cu B.Cu) (net 46)) (segment (start 85.27 171.55) (end 85.27 148.73) (width 0.508) (layer B.Cu) (net 46)) (segment (start 90.27 143.73) (end 90.27 129) (width 0.508) (layer B.Cu) (net 46)) (segment (start 90.27 143.73) (end 85.27 148.73) (width 0.508) (layer B.Cu) (net 46)) (segment (start 25.27 171.55) (end 25.27 114.93) (width 0.508) (layer B.Cu) (net 46)) (segment (start 30.27 109.93) (end 30.27 70.6) (width 0.508) (layer B.Cu) (net 46)) (segment (start 25.27 114.93) (end 30.27 109.93) (width 0.508) (layer B.Cu) (net 46)) (via (at 236.2584 98.6632) (size 0.889) (layers F.Cu B.Cu) (net 46)) (segment (start 90.27 99.8) (end 90.27 114.4) (width 0.508) (layer B.Cu) (net 46)) (segment (start 90.27 85.2) (end 90.27 99.8) (width 0.508) (layer B.Cu) (net 46)) (segment (start 90.27 70.6) (end 90.27 85.2) (width 0.508) (layer B.Cu) (net 46)) (segment (start 90.27 114.4) (end 90.27 120.2426) (width 0.508) (layer B.Cu) (net 46)) (segment (start 90.24 128.97) (end 90.27 129) (width 0.508) (layer B.Cu) (net 46)) (segment (start 90.24 125.15) (end 90.24 128.97) (width 0.508) (layer B.Cu) (net 46)) (segment (start 90.27 125.12) (end 90.24 125.15) (width 0.508) (layer B.Cu) (net 46)) (segment (start 90.27 120.2426) (end 90.27 125.12) (width 0.508) (layer B.Cu) (net 46)) (segment (start 90.24 120.2726) (end 90.24 121.975) (width 0.508) (layer B.Cu) (net 46)) (segment (start 90.27 120.2426) (end 90.24 120.2726) (width 0.508) (layer B.Cu) (net 46)) (segment (start 236.2584 69.6641) (end 236.2584 98.6632) (width 0.508) (layer B.Cu) (net 46)) (segment (start 237.1041 68.8184) (end 236.2584 69.6641) (width 0.508) (layer B.Cu) (net 46)) (segment (start 238.4884 68.8184) (end 237.1041 68.8184) (width 0.508) (layer B.Cu) (net 46)) (segment (start 240.27 70.6) (end 238.4884 68.8184) (width 0.508) (layer B.Cu) (net 46)) (segment (start 236.8014 98.1202) (end 236.2584 98.6632) (width 0.508) (layer F.Cu) (net 46)) (segment (start 253.7146 98.1202) (end 236.8014 98.1202) (width 0.508) (layer F.Cu) (net 46)) (segment (start 257.3117 101.7173) (end 253.7146 98.1202) (width 0.508) (layer F.Cu) (net 46)) (segment (start 258.3527 101.7173) (end 257.3117 101.7173) (width 0.508) (layer F.Cu) (net 46)) (segment (start 260.27 99.8) (end 258.3527 101.7173) (width 0.508) (layer F.Cu) (net 46)) (segment (start 96.7441 107.9259) (end 194.1059 107.9259) (width 0.508) (layer F.Cu) (net 46)) (segment (start 90.27 114.4) (end 96.7441 107.9259) (width 0.508) (layer F.Cu) (net 46)) (segment (start 226.9957 107.9259) (end 236.2584 98.6632) (width 0.508) (layer F.Cu) (net 46)) (segment (start 194.1059 107.9259) (end 226.9957 107.9259) (width 0.508) (layer F.Cu) (net 46)) (segment (start 175.27 171.55) (end 175.27 133.92) (width 0.508) (layer B.Cu) (net 47)) (segment (start 175.27 133.92) (end 180.23 128.96) (width 0.508) (layer B.Cu) (net 47)) (segment (start 180.27 70.6) (end 180.27 85.2) (width 0.508) (layer B.Cu) (net 47)) (segment (start 180.19 114.48) (end 180.19 121.675) (width 0.508) (layer B.Cu) (net 47)) (segment (start 180.27 114.4) (end 180.19 114.48) (width 0.508) (layer B.Cu) (net 47)) (segment (start 180.27 85.2) (end 180.27 99.8) (width 0.508) (layer B.Cu) (net 47)) (segment (start 180.27 99.8) (end 180.27 114.4) (width 0.508) (layer B.Cu) (net 47)) (segment (start 180.19 128.92) (end 180.23 128.96) (width 0.508) (layer B.Cu) (net 47)) (segment (start 180.19 121.675) (end 180.19 128.92) (width 0.508) (layer B.Cu) (net 47)) (segment (start 180.23 128.96) (end 180.27 129) (width 0.508) (layer B.Cu) (net 47)) (segment (start 257.8134 75.4434) (end 260.27 77.9) (width 0.508) (layer F.Cu) (net 47)) (segment (start 239.7177 75.4434) (end 257.8134 75.4434) (width 0.508) (layer F.Cu) (net 47)) (segment (start 232.8289 68.5546) (end 239.7177 75.4434) (width 0.508) (layer F.Cu) (net 47)) (segment (start 182.3154 68.5546) (end 232.8289 68.5546) (width 0.508) (layer F.Cu) (net 47)) (segment (start 180.27 70.6) (end 182.3154 68.5546) (width 0.508) (layer F.Cu) (net 47)) (segment (start 80.271 118.999) (end 70.27 129) (width 0.508) (layer F.Cu) (net 47)) (segment (start 177.514 118.999) (end 80.271 118.999) (width 0.508) (layer F.Cu) (net 47)) (segment (start 180.19 121.675) (end 177.514 118.999) (width 0.508) (layer F.Cu) (net 47)) (segment (start 185.27 171.55) (end 185.27 150.7767) (width 0.508) (layer B.Cu) (net 48)) (segment (start 185.27 150.7767) (end 189.3516 146.6951) (width 0.508) (layer B.Cu) (net 48)) (segment (start 189.3516 146.6951) (end 189.3516 129.9184) (width 0.508) (layer B.Cu) (net 48)) (segment (start 189.3516 129.9184) (end 190.27 129) (width 0.508) (layer B.Cu) (net 48)) (segment (start 190.27 85.2) (end 190.27 70.6) (width 0.508) (layer B.Cu) (net 48)) (segment (start 190.27 114.4) (end 190.27 99.8) (width 0.508) (layer B.Cu) (net 48)) (segment (start 190.27 99.8) (end 190.27 85.2) (width 0.508) (layer B.Cu) (net 48)) (segment (start 190.27 121.7) (end 190.27 114.4) (width 0.508) (layer B.Cu) (net 48)) (segment (start 190.24 121.67) (end 190.24 121.625) (width 0.508) (layer B.Cu) (net 48)) (segment (start 190.27 121.7) (end 190.24 121.67) (width 0.508) (layer B.Cu) (net 48)) (segment (start 192.2088 83.2612) (end 190.27 85.2) (width 0.508) (layer F.Cu) (net 48)) (segment (start 200.49 83.2612) (end 192.2088 83.2612) (width 0.508) (layer F.Cu) (net 48)) (segment (start 202.9538 85.725) (end 200.49 83.2612) (width 0.508) (layer F.Cu) (net 48)) (segment (start 208.4511 85.725) (end 202.9538 85.725) (width 0.508) (layer F.Cu) (net 48)) (segment (start 210.9149 83.2612) (end 208.4511 85.725) (width 0.508) (layer F.Cu) (net 48)) (segment (start 258.3312 83.2612) (end 210.9149 83.2612) (width 0.508) (layer F.Cu) (net 48)) (segment (start 260.27 85.2) (end 258.3312 83.2612) (width 0.508) (layer F.Cu) (net 48)) (segment (start 190.27 129) (end 190.27 121.7) (width 0.508) (layer B.Cu) (net 48)) (segment (start 195.27 171.55) (end 195.27 153.184) (width 0.508) (layer B.Cu) (net 49)) (segment (start 191.9691 86.2009) (end 200.27 77.9) (width 0.508) (layer B.Cu) (net 49)) (segment (start 191.9691 86.2009) (end 191.9691 121.8) (width 0.508) (layer B.Cu) (net 49)) (segment (start 191.9691 121.8) (end 191.3 122.4691) (width 0.508) (layer B.Cu) (net 49)) (segment (start 191.3 122.4691) (end 191.3 124.3) (width 0.508) (layer B.Cu) (net 49)) (segment (start 191.3 124.3) (end 191.68 124.68) (width 0.508) (layer B.Cu) (net 49)) (segment (start 191.68 124.68) (end 191.68 129.8733) (width 0.508) (layer B.Cu) (net 49)) (segment (start 191.68 129.8733) (end 190.1141 131.4392) (width 0.508) (layer B.Cu) (net 49)) (segment (start 190.1141 131.4392) (end 190.1141 148.0281) (width 0.508) (layer B.Cu) (net 49)) (segment (start 190.1141 148.0281) (end 195.27 153.184) (width 0.508) (layer B.Cu) (net 49)) (segment (start 200.24 114.43) (end 200.24 121.625) (width 0.508) (layer B.Cu) (net 49)) (segment (start 200.27 114.4) (end 200.24 114.43) (width 0.508) (layer B.Cu) (net 49)) (segment (start 200.24 128.97) (end 200.27 129) (width 0.508) (layer B.Cu) (net 49)) (segment (start 200.24 121.625) (end 200.24 128.97) (width 0.508) (layer B.Cu) (net 49)) (segment (start 200.27 85.2) (end 200.27 99.8) (width 0.508) (layer B.Cu) (net 49)) (segment (start 200.27 99.8) (end 200.27 114.4) (width 0.508) (layer B.Cu) (net 49)) (segment (start 204.6657 95.4043) (end 200.27 99.8) (width 0.508) (layer F.Cu) (net 49)) (segment (start 257.3657 95.4043) (end 204.6657 95.4043) (width 0.508) (layer F.Cu) (net 49)) (segment (start 260.27 92.5) (end 257.3657 95.4043) (width 0.508) (layer F.Cu) (net 49)) (segment (start 200.27 70.6) (end 200.27 77.9) (width 0.508) (layer B.Cu) (net 49)) (segment (start 200.27 77.9) (end 200.27 85.2) (width 0.508) (layer B.Cu) (net 49)) (segment (start 97.1003 170.0022) (end 96.8178 170.0022) (width 0.508) (layer F.Cu) (net 50)) (segment (start 215.1145 171.55) (end 213.5667 170.0022) (width 0.508) (layer F.Cu) (net 50) (tstamp 5CB4AA0D)) (segment (start 213.5667 170.0022) (end 97.1003 170.0022) (width 0.508) (layer F.Cu) (net 50)) (segment (start 215.27 171.55) (end 215.1145 171.55) (width 0.508) (layer F.Cu) (net 50)) (segment (start 96.8178 170.0022) (end 95.27 171.55) (width 0.508) (layer F.Cu) (net 50) (tstamp 5CB4AA70)) (segment (start 95.27 171.55) (end 95.27 147.935) (width 0.508) (layer B.Cu) (net 50)) (segment (start 100.27 142.935) (end 100.27 129) (width 0.508) (layer B.Cu) (net 50)) (segment (start 100.27 142.935) (end 95.27 147.935) (width 0.508) (layer B.Cu) (net 50)) (segment (start 35.27 171.55) (end 35.27 115.43) (width 0.508) (layer B.Cu) (net 50)) (segment (start 35.27 115.43) (end 40.27 110.43) (width 0.508) (layer B.Cu) (net 50)) (segment (start 40.27 110.43) (end 40.27 70.6) (width 0.508) (layer B.Cu) (net 50)) (via (at 254.051 99.8041) (size 0.889) (layers F.Cu B.Cu) (net 50)) (segment (start 100.27 99.8) (end 100.27 114.4) (width 0.508) (layer B.Cu) (net 50)) (segment (start 100.27 70.6) (end 100.27 85.2) (width 0.508) (layer B.Cu) (net 50)) (segment (start 100.27 85.2) (end 100.27 99.8) (width 0.508) (layer B.Cu) (net 50)) (segment (start 100.29 114.42) (end 100.29 121.975) (width 0.508) (layer B.Cu) (net 50)) (segment (start 100.27 114.4) (end 100.29 114.42) (width 0.508) (layer B.Cu) (net 50)) (segment (start 100.29 128.98) (end 100.27 129) (width 0.508) (layer B.Cu) (net 50)) (segment (start 100.29 121.975) (end 100.29 128.98) (width 0.508) (layer B.Cu) (net 50)) (segment (start 42.417 68.453) (end 40.27 70.6) (width 0.508) (layer F.Cu) (net 50)) (segment (start 98.123 68.453) (end 42.417 68.453) (width 0.508) (layer F.Cu) (net 50)) (segment (start 100.27 70.6) (end 98.123 68.453) (width 0.508) (layer F.Cu) (net 50)) (segment (start 254.051 91.681) (end 254.051 99.8041) (width 0.508) (layer B.Cu) (net 50)) (segment (start 240.27 77.9) (end 254.051 91.681) (width 0.508) (layer B.Cu) (net 50)) (segment (start 254.051 100.881) (end 260.27 107.1) (width 0.508) (layer F.Cu) (net 50)) (segment (start 254.051 99.8041) (end 254.051 100.881) (width 0.508) (layer F.Cu) (net 50)) (segment (start 238.482 79.688) (end 240.27 77.9) (width 0.508) (layer F.Cu) (net 50)) (segment (start 105.782 79.688) (end 238.482 79.688) (width 0.508) (layer F.Cu) (net 50)) (segment (start 100.27 85.2) (end 105.782 79.688) (width 0.508) (layer F.Cu) (net 50)) (segment (start 45.27 171.55) (end 45.27 171.896) (width 0.508) (layer F.Cu) (net 51)) (segment (start 105.27 171.769) (end 103.9721 173.0669) (width 0.508) (layer F.Cu) (net 51) (tstamp 5CB4AA6B)) (segment (start 103.9721 173.0669) (end 46.4409 173.0669) (width 0.508) (layer F.Cu) (net 51)) (segment (start 105.27 171.769) (end 105.27 171.55) (width 0.508) (layer F.Cu) (net 51)) (segment (start 45.27 171.896) (end 46.4409 173.0669) (width 0.508) (layer F.Cu) (net 51) (tstamp 5CB4AA79)) (segment (start 105.27 171.55) (end 105.27 171.7055) (width 0.508) (layer F.Cu) (net 51)) (segment (start 105.27 171.7055) (end 106.5679 173.0034) (width 0.508) (layer F.Cu) (net 51) (tstamp 5CB4AA67)) (segment (start 224.171037 173.0034) (end 225.27 172.15) (width 0.508) (layer F.Cu) (net 51)) (segment (start 106.5679 173.0034) (end 224.171037 173.0034) (width 0.508) (layer F.Cu) (net 51)) (segment (start 105.27 171.55) (end 105.27 148.095) (width 0.508) (layer B.Cu) (net 51)) (segment (start 105.27 148.095) (end 110.27 143.095) (width 0.508) (layer B.Cu) (net 51)) (segment (start 110.27 143.095) (end 110.27 129) (width 0.508) (layer B.Cu) (net 51)) (segment (start 45.27 171.55) (end 45.27 116.07) (width 0.508) (layer B.Cu) (net 51)) (segment (start 50.27 111.07) (end 50.27 70.6) (width 0.508) (layer B.Cu) (net 51)) (segment (start 50.27 111.07) (end 45.27 116.07) (width 0.508) (layer B.Cu) (net 51)) (segment (start 110.27 99.8) (end 110.27 114.4) (width 0.508) (layer B.Cu) (net 51)) (segment (start 110.27 70.6) (end 110.27 85.2) (width 0.508) (layer B.Cu) (net 51)) (segment (start 110.27 85.2) (end 110.27 99.8) (width 0.508) (layer B.Cu) (net 51)) (segment (start 110.29 114.42) (end 110.29 121.975) (width 0.508) (layer B.Cu) (net 51)) (segment (start 110.27 114.4) (end 110.29 114.42) (width 0.508) (layer B.Cu) (net 51)) (segment (start 110.29 128.98) (end 110.27 129) (width 0.508) (layer B.Cu) (net 51)) (segment (start 110.29 121.975) (end 110.29 128.98) (width 0.508) (layer B.Cu) (net 51)) (segment (start 241.6213 86.5513) (end 240.27 85.2) (width 0.508) (layer F.Cu) (net 51)) (segment (start 264.3187 86.5513) (end 241.6213 86.5513) (width 0.508) (layer F.Cu) (net 51)) (segment (start 280.27 70.6) (end 264.3187 86.5513) (width 0.508) (layer F.Cu) (net 51)) (segment (start 232.0383 93.4317) (end 240.27 85.2) (width 0.508) (layer F.Cu) (net 51)) (segment (start 116.6383 93.4317) (end 232.0383 93.4317) (width 0.508) (layer F.Cu) (net 51)) (segment (start 110.27 99.8) (end 116.6383 93.4317) (width 0.508) (layer F.Cu) (net 51)) (segment (start 115.27 171.55) (end 115.27 139.1052) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.6365 133.7387) (end 115.27 139.1052) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.6365 129.3665) (end 120.6365 133.7387) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.6365 129.3665) (end 120.27 129) (width 0.508) (layer B.Cu) (net 52)) (segment (start 115.27 171.55) (end 115.27 171.8325) (width 0.508) (layer B.Cu) (net 52)) (segment (start 114.0718 173.0307) (end 56.584699 173.0307) (width 0.508) (layer B.Cu) (net 52)) (segment (start 55.27 171.769) (end 56.584699 173.0307) (width 0.508) (layer B.Cu) (net 52) (tstamp 5CB4A9A9)) (segment (start 55.27 171.769) (end 55.27 171.55) (width 0.508) (layer B.Cu) (net 52)) (segment (start 115.27 171.8325) (end 114.0718 173.0307) (width 0.508) (layer B.Cu) (net 52) (tstamp 5CB4AA60)) (segment (start 237.4588 169.9612) (end 236.8267 169.9612) (width 0.508) (layer F.Cu) (net 52)) (segment (start 280.543 134.673) (end 280.543 148.463) (width 0.508) (layer F.Cu) (net 52)) (segment (start 260.27 114.4) (end 280.543 134.673) (width 0.508) (layer F.Cu) (net 52)) (segment (start 283.0322 150.9522) (end 283.0322 168.656) (width 0.508) (layer F.Cu) (net 52) (tstamp 5C1EC5C7)) (segment (start 283.0322 168.656) (end 281.981 169.9612) (width 0.508) (layer F.Cu) (net 52) (tstamp 5C1EC01F)) (segment (start 281.981 169.9612) (end 261.3731 169.9612) (width 0.508) (layer F.Cu) (net 52) (tstamp 5C1EC022)) (segment (start 280.543 148.463) (end 283.0322 150.9522) (width 0.508) (layer F.Cu) (net 52) (tstamp 5C1EC5F4)) (segment (start 261.3731 169.9612) (end 237.4588 169.9612) (width 0.508) (layer F.Cu) (net 52)) (segment (start 235.27 171.5179) (end 235.27 171.55) (width 0.508) (layer F.Cu) (net 52) (tstamp 5CB4AA1B)) (segment (start 236.8267 169.9612) (end 235.27 171.5179) (width 0.508) (layer F.Cu) (net 52) (tstamp 5CB4AA1A)) (segment (start 55.27 171.55) (end 55.27 117.33) (width 0.508) (layer B.Cu) (net 52)) (segment (start 60.27 112.33) (end 60.27 70.6) (width 0.508) (layer B.Cu) (net 52)) (segment (start 55.27 117.33) (end 60.27 112.33) (width 0.508) (layer B.Cu) (net 52) (tstamp 5CB4A9B3)) (segment (start 260.27 114.4) (end 260.27 114.1768) (width 0.508) (layer F.Cu) (net 52)) (segment (start 266.7 107.7468) (end 266.7 89.0667) (width 0.508) (layer F.Cu) (net 52) (tstamp 5C1EC1B3)) (segment (start 260.27 114.1768) (end 266.7 107.7468) (width 0.508) (layer F.Cu) (net 52) (tstamp 5C1EC1AD)) (segment (start 120.27 85.2) (end 120.27 70.6) (width 0.508) (layer B.Cu) (net 52)) (segment (start 55.27 171.67) (end 55.1 171.5) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.27 99.8) (end 120.3 99.8) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.3 114.37) (end 120.3 99.8) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.27 114.4) (end 120.3 114.37) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.3 85.23) (end 120.27 85.2) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.3 99.8) (end 120.3 85.23) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.27 129) (end 120.27 121.7) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.27 121.7) (end 120.27 114.4) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.29 121.72) (end 120.29 121.925) (width 0.508) (layer B.Cu) (net 52)) (segment (start 120.27 121.7) (end 120.29 121.72) (width 0.508) (layer B.Cu) (net 52)) (segment (start 243.7033 89.0667) (end 262.4168 89.0667) (width 0.508) (layer F.Cu) (net 52)) (segment (start 262.4168 89.0667) (end 266.7 89.0667) (width 0.508) (layer F.Cu) (net 52)) (segment (start 240.27 92.5) (end 243.7033 89.0667) (width 0.508) (layer F.Cu) (net 52)) (segment (start 269.1033 89.0667) (end 280.27 77.9) (width 0.508) (layer F.Cu) (net 52)) (segment (start 266.7 89.0667) (end 269.1033 89.0667) (width 0.508) (layer F.Cu) (net 52) (tstamp 5C1EC1BA)) (segment (start 238.2807 94.4893) (end 240.27 92.5) (width 0.508) (layer F.Cu) (net 52)) (segment (start 125.5807 94.4893) (end 238.2807 94.4893) (width 0.508) (layer F.Cu) (net 52)) (segment (start 120.27 99.8) (end 125.5807 94.4893) (width 0.508) (layer F.Cu) (net 52)) (segment (start 245.27 171.55) (end 245.27 150.9555) (width 0.508) (layer B.Cu) (net 53)) (segment (start 245.27 150.9555) (end 249.0011 147.2244) (width 0.508) (layer B.Cu) (net 53)) (segment (start 249.0011 147.2244) (end 272.8413 147.2244) (width 0.508) (layer B.Cu) (net 53)) (segment (start 272.8413 147.2244) (end 275.6343 144.4314) (width 0.508) (layer B.Cu) (net 53)) (segment (start 275.6343 144.4314) (end 275.6343 142.8373) (width 0.508) (layer B.Cu) (net 53)) (segment (start 275.6343 142.8373) (end 275.0521 142.2551) (width 0.508) (layer B.Cu) (net 53)) (segment (start 275.0521 142.2551) (end 261.5195 142.2551) (width 0.508) (layer B.Cu) (net 53)) (segment (start 261.5195 142.2551) (end 256.4613 137.1969) (width 0.508) (layer B.Cu) (net 53)) (segment (start 256.4613 137.1969) (end 255.7665 137.1969) (width 0.508) (layer B.Cu) (net 53)) (segment (start 255.7665 137.1969) (end 255.2083 136.6387) (width 0.508) (layer B.Cu) (net 53)) (segment (start 255.2083 136.6387) (end 255.2083 133.1974) (width 0.508) (layer B.Cu) (net 53)) (segment (start 260.27 128.1357) (end 260.27 121.7) (width 0.508) (layer F.Cu) (net 53)) (segment (start 260.27 128.1357) (end 255.2083 133.1974) (width 0.508) (layer F.Cu) (net 53)) (via (at 255.2083 133.1974) (size 0.889) (layers F.Cu B.Cu) (net 53)) (segment (start 125.27 171.55) (end 125.27 148.37) (width 0.508) (layer B.Cu) (net 53)) (segment (start 131.8818 130.6118) (end 130.27 129) (width 0.508) (layer B.Cu) (net 53)) (segment (start 131.8818 130.6118) (end 131.8818 141.7582) (width 0.508) (layer B.Cu) (net 53)) (segment (start 131.8818 141.7582) (end 125.27 148.37) (width 0.508) (layer B.Cu) (net 53)) (segment (start 65.27 171.55) (end 65.27 117.63) (width 0.508) (layer B.Cu) (net 53)) (segment (start 65.27 117.63) (end 70.27 112.63) (width 0.508) (layer B.Cu) (net 53)) (segment (start 70.27 112.63) (end 70.27 70.6) (width 0.508) (layer B.Cu) (net 53)) (segment (start 130.27 99.8) (end 130.27 114.4) (width 0.508) (layer B.Cu) (net 53)) (segment (start 130.27 85.2) (end 130.27 99.8) (width 0.508) (layer B.Cu) (net 53)) (segment (start 130.24 114.43) (end 130.24 121.925) (width 0.508) (layer B.Cu) (net 53)) (segment (start 130.27 114.4) (end 130.24 114.43) (width 0.508) (layer B.Cu) (net 53)) (segment (start 231.1824 108.8876) (end 240.27 99.8) (width 0.508) (layer F.Cu) (net 53)) (segment (start 135.7824 108.8876) (end 231.1824 108.8876) (width 0.508) (layer F.Cu) (net 53)) (segment (start 130.27 114.4) (end 135.7824 108.8876) (width 0.508) (layer F.Cu) (net 53)) (segment (start 130.27 70.6) (end 130.27 85.2) (width 0.508) (layer B.Cu) (net 53)) (segment (start 72.4863 68.3837) (end 70.27 70.6) (width 0.508) (layer B.Cu) (net 53)) (segment (start 128.0537 68.3837) (end 72.4863 68.3837) (width 0.508) (layer B.Cu) (net 53)) (segment (start 130.27 70.6) (end 128.0537 68.3837) (width 0.508) (layer B.Cu) (net 53)) (segment (start 244.4526 103.9826) (end 251.5996 103.9826) (width 0.508) (layer B.Cu) (net 53)) (segment (start 240.27 99.8) (end 244.4526 103.9826) (width 0.508) (layer B.Cu) (net 53)) (segment (start 251.5996 117.9598) (end 251.5996 103.9826) (width 0.508) (layer B.Cu) (net 53)) (segment (start 256.8954 123.2556) (end 251.5996 117.9598) (width 0.508) (layer B.Cu) (net 53)) (segment (start 258.7144 123.2556) (end 256.8954 123.2556) (width 0.508) (layer B.Cu) (net 53)) (segment (start 260.27 121.7) (end 258.7144 123.2556) (width 0.508) (layer B.Cu) (net 53)) (segment (start 278.5951 86.8749) (end 280.27 85.2) (width 0.508) (layer B.Cu) (net 53)) (segment (start 268.7073 86.8749) (end 278.5951 86.8749) (width 0.508) (layer B.Cu) (net 53)) (segment (start 251.5996 103.9826) (end 268.7073 86.8749) (width 0.508) (layer B.Cu) (net 53)) (segment (start 130.24 128.97) (end 130.27 129) (width 0.508) (layer B.Cu) (net 53)) (segment (start 130.24 121.925) (end 130.24 128.97) (width 0.508) (layer B.Cu) (net 53)) (segment (start 253.6821 172.9799) (end 253.8401 172.9799) (width 0.508) (layer B.Cu) (net 54)) (segment (start 135.27 171.642) (end 136.6079 172.9799) (width 0.508) (layer B.Cu) (net 54) (tstamp 5CB4AA54)) (segment (start 136.6079 172.9799) (end 253.6821 172.9799) (width 0.508) (layer B.Cu) (net 54)) (segment (start 135.27 171.55) (end 135.27 171.642) (width 0.508) (layer B.Cu) (net 54)) (segment (start 253.8401 172.9799) (end 255.27 171.55) (width 0.508) (layer B.Cu) (net 54) (tstamp 5CB4AAA8)) (segment (start 135.27 171.55) (end 135.27 148.1217) (width 0.508) (layer B.Cu) (net 54)) (segment (start 140.27 143.1217) (end 135.27 148.1217) (width 0.508) (layer B.Cu) (net 54)) (segment (start 140.27 143.1217) (end 140.27 129) (width 0.508) (layer B.Cu) (net 54)) (segment (start 255.27 171.704) (end 255.27 171.55) (width 0.508) (layer B.Cu) (net 54) (tstamp 5CB4AA2A)) (segment (start 75.27 171.55) (end 75.27 150.63) (width 0.508) (layer B.Cu) (net 54)) (segment (start 77.383 148.517) (end 77 148.9) (width 0.508) (layer B.Cu) (net 54) (tstamp 5C2B779E)) (segment (start 75.27 150.63) (end 77 148.9) (width 0.508) (layer B.Cu) (net 54)) (segment (start 77.383 148.517) (end 77.383 138.3) (width 0.508) (layer B.Cu) (net 54)) (segment (start 77.383 133.218) (end 77.383 120.383) (width 0.508) (layer B.Cu) (net 54)) (segment (start 77 120) (end 74.2 117.2) (width 0.508) (layer B.Cu) (net 54)) (segment (start 74.2 117.2) (end 74.2 111.1) (width 0.508) (layer B.Cu) (net 54)) (segment (start 74.2 111.1) (end 80.27 105.03) (width 0.508) (layer B.Cu) (net 54)) (segment (start 80.27 105.03) (end 80.27 70.6) (width 0.508) (layer B.Cu) (net 54)) (segment (start 77.383 120.383) (end 77 120) (width 0.508) (layer B.Cu) (net 54) (tstamp 5C2B7797)) (via (at 77.383 133.218) (size 0.889) (layers F.Cu B.Cu) (net 54)) (segment (start 140.27 99.8) (end 140.27 114.4) (width 0.508) (layer B.Cu) (net 54)) (segment (start 140.27 70.6) (end 140.27 85.2) (width 0.508) (layer B.Cu) (net 54)) (segment (start 140.27 85.2) (end 140.27 99.8) (width 0.508) (layer B.Cu) (net 54)) (segment (start 140.34 114.47) (end 140.34 121.875) (width 0.508) (layer B.Cu) (net 54)) (segment (start 140.27 114.4) (end 140.34 114.47) (width 0.508) (layer B.Cu) (net 54)) (segment (start 77.383 138.3733) (end 77.383 138.3) (width 0.508) (layer B.Cu) (net 54)) (segment (start 77.383 138.3) (end 77.383 133.218) (width 0.508) (layer B.Cu) (net 54) (tstamp 5C2B779C)) (segment (start 34.488 133.218) (end 77.383 133.218) (width 0.508) (layer F.Cu) (net 54)) (segment (start 30.27 129) (end 34.488 133.218) (width 0.508) (layer F.Cu) (net 54)) (segment (start 140.34 128.93) (end 140.27 129) (width 0.508) (layer B.Cu) (net 54)) (segment (start 140.34 121.875) (end 140.34 128.93) (width 0.508) (layer B.Cu) (net 54)) (segment (start 237.3382 109.9318) (end 240.27 107) (width 0.508) (layer F.Cu) (net 54)) (segment (start 144.7382 109.9318) (end 237.3382 109.9318) (width 0.508) (layer F.Cu) (net 54)) (segment (start 140.27 114.4) (end 144.7382 109.9318) (width 0.508) (layer F.Cu) (net 54)) (segment (start 78.2098 132.3912) (end 77.383 133.218) (width 0.508) (layer F.Cu) (net 54)) (segment (start 136.8788 132.3912) (end 78.2098 132.3912) (width 0.508) (layer F.Cu) (net 54)) (segment (start 140.27 129) (end 136.8788 132.3912) (width 0.508) (layer F.Cu) (net 54)) (segment (start 265.27 171.55) (end 265.27 150.7788) (width 0.508) (layer B.Cu) (net 55)) (segment (start 250.3843 124.3143) (end 240.27 114.2) (width 0.508) (layer B.Cu) (net 55)) (segment (start 250.3843 124.3143) (end 259.8143 124.3143) (width 0.508) (layer B.Cu) (net 55)) (segment (start 259.8143 124.3143) (end 270.61 135.11) (width 0.508) (layer B.Cu) (net 55)) (segment (start 270.61 135.11) (end 270.61 136.61) (width 0.508) (layer B.Cu) (net 55)) (segment (start 270.61 136.61) (end 275.6391 141.6391) (width 0.508) (layer B.Cu) (net 55)) (segment (start 275.6391 141.6391) (end 276.7798 141.6391) (width 0.508) (layer B.Cu) (net 55)) (segment (start 276.7798 141.6391) (end 278.4475 143.3068) (width 0.508) (layer B.Cu) (net 55)) (segment (start 278.4475 143.3068) (end 278.4475 144.4739) (width 0.508) (layer B.Cu) (net 55)) (segment (start 278.4475 144.4739) (end 272.9639 149.9575) (width 0.508) (layer B.Cu) (net 55)) (segment (start 272.9639 149.9575) (end 266.0913 149.9575) (width 0.508) (layer B.Cu) (net 55)) (segment (start 266.0913 149.9575) (end 265.27 150.7788) (width 0.508) (layer B.Cu) (net 55)) (segment (start 145.27 171.55) (end 145.27 134) (width 0.508) (layer B.Cu) (net 55)) (segment (start 145.27 134) (end 150.27 129) (width 0.508) (layer B.Cu) (net 55)) (via (at 42.295 123.5845) (size 0.889) (layers F.Cu B.Cu) (net 55)) (via (at 88.8716 123.0016) (size 0.889) (layers F.Cu B.Cu) (net 55)) (segment (start 150.27 99.8) (end 150.27 114.4) (width 0.508) (layer B.Cu) (net 55)) (segment (start 150.27 70.6) (end 150.27 85.2) (width 0.508) (layer B.Cu) (net 55)) (segment (start 150.27 85.2) (end 150.27 99.8) (width 0.508) (layer B.Cu) (net 55)) (segment (start 150.29 114.42) (end 150.29 121.875) (width 0.508) (layer B.Cu) (net 55)) (segment (start 150.27 114.4) (end 150.29 114.42) (width 0.508) (layer B.Cu) (net 55)) (segment (start 42.295 126.975) (end 42.295 123.5845) (width 0.508) (layer B.Cu) (net 55)) (segment (start 40.27 129) (end 42.295 126.975) (width 0.508) (layer B.Cu) (net 55)) (segment (start 71.0855 123.5845) (end 80.27 114.4) (width 0.508) (layer F.Cu) (net 55)) (segment (start 42.295 123.5845) (end 71.0855 123.5845) (width 0.508) (layer F.Cu) (net 55)) (segment (start 150.29 128.98) (end 150.27 129) (width 0.508) (layer B.Cu) (net 55)) (segment (start 150.29 121.875) (end 150.29 128.98) (width 0.508) (layer B.Cu) (net 55)) (segment (start 237.1188 111.0488) (end 240.27 114.2) (width 0.508) (layer F.Cu) (net 55)) (segment (start 153.6212 111.0488) (end 237.1188 111.0488) (width 0.508) (layer F.Cu) (net 55)) (segment (start 150.27 114.4) (end 153.6212 111.0488) (width 0.508) (layer F.Cu) (net 55)) (segment (start 80.27 114.4) (end 88.8716 123.0016) (width 0.508) (layer B.Cu) (net 55)) (segment (start 89.314 123.444) (end 88.8716 123.0016) (width 0.508) (layer F.Cu) (net 55)) (segment (start 148.721 123.444) (end 89.314 123.444) (width 0.508) (layer F.Cu) (net 55)) (segment (start 150.29 121.875) (end 148.721 123.444) (width 0.508) (layer F.Cu) (net 55)) (segment (start 275.27 171.55) (end 275.27 149.6022) (width 0.508) (layer B.Cu) (net 56)) (segment (start 253.0202 134.1502) (end 240.27 121.4) (width 0.508) (layer F.Cu) (net 56)) (segment (start 253.0202 134.1502) (end 255.603 134.1502) (width 0.508) (layer F.Cu) (net 56)) (segment (start 255.603 134.1502) (end 255.8035 133.9497) (width 0.508) (layer F.Cu) (net 56)) (segment (start 255.8035 133.9497) (end 269.0299 133.9497) (width 0.508) (layer F.Cu) (net 56)) (segment (start 269.0299 133.9497) (end 270.61 135.5298) (width 0.508) (layer F.Cu) (net 56)) (segment (start 270.61 135.5298) (end 270.61 136.4676) (width 0.508) (layer F.Cu) (net 56)) (segment (start 270.61 136.4676) (end 271.6351 137.4927) (width 0.508) (layer F.Cu) (net 56)) (segment (start 271.6351 137.4927) (end 273.8276 137.4927) (width 0.508) (layer F.Cu) (net 56)) (segment (start 273.8276 137.4927) (end 279.6 143.2651) (width 0.508) (layer B.Cu) (net 56)) (segment (start 279.6 143.2651) (end 279.6 145.2722) (width 0.508) (layer B.Cu) (net 56)) (segment (start 279.6 145.2722) (end 275.27 149.6022) (width 0.508) (layer B.Cu) (net 56)) (via (at 273.8276 137.4927) (size 0.889) (layers F.Cu B.Cu) (net 56)) (segment (start 155.27 171.55) (end 155.27 146.9835) (width 0.508) (layer B.Cu) (net 56)) (segment (start 155.27 146.9835) (end 162.5847 139.6688) (width 0.508) (layer B.Cu) (net 56)) (segment (start 162.5847 139.6688) (end 162.5847 131.3147) (width 0.508) (layer B.Cu) (net 56)) (segment (start 162.5847 131.3147) (end 160.27 129) (width 0.508) (layer B.Cu) (net 56)) (segment (start 160.27 70.6) (end 160.27 85.2) (width 0.508) (layer B.Cu) (net 56)) (segment (start 160.27 85.2) (end 160.27 99.8) (width 0.508) (layer B.Cu) (net 56)) (segment (start 160.27 99.8) (end 160.27 114.4) (width 0.508) (layer B.Cu) (net 56)) (segment (start 160.24 114.43) (end 160.24 121.825) (width 0.508) (layer B.Cu) (net 56)) (segment (start 160.27 114.4) (end 160.24 114.43) (width 0.508) (layer B.Cu) (net 56)) (segment (start 157.605 124.46) (end 160.24 121.825) (width 0.508) (layer F.Cu) (net 56)) (segment (start 83.0834 124.46) (end 157.605 124.46) (width 0.508) (layer F.Cu) (net 56)) (segment (start 75.438 132.1054) (end 83.0834 124.46) (width 0.508) (layer F.Cu) (net 56)) (segment (start 53.3754 132.1054) (end 75.438 132.1054) (width 0.508) (layer F.Cu) (net 56)) (segment (start 50.27 129) (end 53.3754 132.1054) (width 0.508) (layer F.Cu) (net 56)) (segment (start 160.24 128.97) (end 160.27 129) (width 0.508) (layer B.Cu) (net 56)) (segment (start 160.24 121.825) (end 160.24 128.97) (width 0.508) (layer B.Cu) (net 56)) (segment (start 231.1126 112.2426) (end 240.27 121.4) (width 0.508) (layer F.Cu) (net 56)) (segment (start 162.4274 112.2426) (end 231.1126 112.2426) (width 0.508) (layer F.Cu) (net 56)) (segment (start 160.27 114.4) (end 162.4274 112.2426) (width 0.508) (layer F.Cu) (net 56)) (segment (start 165.27 171.55) (end 165.27 134) (width 0.508) (layer B.Cu) (net 57)) (segment (start 165.27 134) (end 170.27 129) (width 0.508) (layer B.Cu) (net 57)) (segment (start 170.27 99.8) (end 170.27 114.4) (width 0.508) (layer B.Cu) (net 57)) (segment (start 170.27 85.2) (end 170.27 99.8) (width 0.508) (layer B.Cu) (net 57)) (segment (start 170.27 70.6) (end 170.27 85.2) (width 0.508) (layer B.Cu) (net 57)) (segment (start 170.29 114.42) (end 170.29 121.725) (width 0.508) (layer B.Cu) (net 57)) (segment (start 170.27 114.4) (end 170.29 114.42) (width 0.508) (layer B.Cu) (net 57)) (segment (start 170.29 128.98) (end 170.27 129) (width 0.508) (layer B.Cu) (net 57)) (segment (start 170.29 121.725) (end 170.29 128.98) (width 0.508) (layer B.Cu) (net 57)) (segment (start 257.107 67.437) (end 260.27 70.6) (width 0.508) (layer F.Cu) (net 57)) (segment (start 173.433 67.437) (end 257.107 67.437) (width 0.508) (layer F.Cu) (net 57)) (segment (start 170.27 70.6) (end 173.433 67.437) (width 0.508) (layer F.Cu) (net 57)) (segment (start 168.58 120.015) (end 170.29 121.725) (width 0.508) (layer F.Cu) (net 57)) (segment (start 85.5235 120.015) (end 168.58 120.015) (width 0.508) (layer F.Cu) (net 57)) (segment (start 74.7793 130.7592) (end 85.5235 120.015) (width 0.508) (layer F.Cu) (net 57)) (segment (start 62.0292 130.7592) (end 74.7793 130.7592) (width 0.508) (layer F.Cu) (net 57)) (segment (start 60.27 129) (end 62.0292 130.7592) (width 0.508) (layer F.Cu) (net 57)) (segment (start 230.27 137.776) (end 230.27 138.73) (width 0.508) (layer B.Cu) (net 58)) (segment (start 232.816 135.23) (end 230.27 137.776) (width 0.508) (layer B.Cu) (net 58)) (segment (start 187.73 70.6) (end 187.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 187.73 74.93) (end 187.96 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 177.73 70.6) (end 177.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 177.73 74.93) (end 177.8 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 167.73 70.6) (end 167.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 167.73 74.93) (end 167.64 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 167.73 74.93) (end 177.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 167.64 74.93) (end 167.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 157.73 70.6) (end 157.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 157.73 74.93) (end 158.115 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 147.73 70.6) (end 147.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 147.73 74.93) (end 147.955 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 137.73 70.6) (end 137.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 137.73 74.93) (end 137.795 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 127.73 70.6) (end 127.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 127.73 74.93) (end 128.27 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 117.73 70.6) (end 117.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 117.73 74.93) (end 117.475 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 117.73 74.93) (end 127.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 117.475 74.93) (end 117.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 107.73 70.6) (end 107.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 107.73 74.93) (end 107.95 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 97.73 70.6) (end 97.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 97.73 74.93) (end 97.79 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 87.83 74.93) (end 97.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 87.73 74.83) (end 87.83 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 87.73 70.6) (end 87.73 74.83) (width 0.508) (layer F.Cu) (net 59)) (segment (start 97.73 74.93) (end 97.79 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 97.79 74.93) (end 107.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 107.73 74.93) (end 107.95 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 107.95 74.93) (end 117.475 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 127.73 74.93) (end 128.27 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 128.27 74.93) (end 137.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 137.73 74.93) (end 137.795 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 137.795 74.93) (end 147.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 147.73 74.93) (end 147.955 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 147.955 74.93) (end 157.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 157.73 74.93) (end 158.115 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 158.115 74.93) (end 167.64 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 177.73 74.93) (end 177.8 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 177.8 74.93) (end 187.73 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 187.73 74.93) (end 187.96 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 193.4 74.93) (end 197.73 70.6) (width 0.508) (layer F.Cu) (net 59)) (segment (start 187.96 74.93) (end 193.4 74.93) (width 0.508) (layer F.Cu) (net 59)) (segment (start 258.15 137.5) (end 256.64 135.99) (width 0.508) (layer B.Cu) (net 59)) (segment (start 262.1833 137.5) (end 258.15 137.5) (width 0.508) (layer B.Cu) (net 59)) (segment (start 262.9311 136.7522) (end 262.1833 137.5) (width 0.508) (layer B.Cu) (net 59)) (segment (start 262.9311 135.1311) (end 262.9311 136.7522) (width 0.508) (layer B.Cu) (net 59)) (segment (start 255.4604 127.6604) (end 262.9311 135.1311) (width 0.508) (layer B.Cu) (net 59)) (segment (start 242.0246 127.6604) (end 255.4604 127.6604) (width 0.508) (layer B.Cu) (net 59)) (segment (start 229.8744 115.5102) (end 242.0246 127.6604) (width 0.508) (layer B.Cu) (net 59)) (segment (start 229.8744 98.2886) (end 229.8744 115.5102) (width 0.508) (layer B.Cu) (net 59)) (segment (start 200.8236 69.2378) (end 229.8744 98.2886) (width 0.508) (layer B.Cu) (net 59)) (segment (start 199.0922 69.2378) (end 200.8236 69.2378) (width 0.508) (layer B.Cu) (net 59)) (segment (start 197.73 70.6) (end 199.0922 69.2378) (width 0.508) (layer B.Cu) (net 59)) (segment (start 87.73 88.8) (end 87.73 85.2) (width 0.508) (layer F.Cu) (net 60)) (segment (start 87.63 88.9) (end 87.73 88.8) (width 0.508) (layer F.Cu) (net 60)) (segment (start 97.73 88.9) (end 87.63 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 187.73 85.2) (end 187.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 187.73 88.9) (end 187.325 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 194.03 88.9) (end 197.73 85.2) (width 0.508) (layer F.Cu) (net 60)) (segment (start 187.73 88.9) (end 194.03 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 187.325 88.9) (end 187.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 177.73 85.2) (end 177.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 177.73 88.9) (end 177.165 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 177.73 88.9) (end 187.325 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 177.165 88.9) (end 177.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 167.73 85.2) (end 167.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 167.73 88.9) (end 167.64 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 167.73 88.9) (end 177.165 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 167.64 88.9) (end 167.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 157.73 85.2) (end 157.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 157.73 88.9) (end 158.115 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 147.73 85.2) (end 147.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 147.73 88.9) (end 147.32 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 147.73 88.9) (end 157.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 147.32 88.9) (end 147.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 137.73 85.2) (end 137.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 137.73 88.9) (end 137.795 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 127.73 85.2) (end 127.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 127.73 88.9) (end 127.635 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 127.73 88.9) (end 137.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 127.635 88.9) (end 127.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 117.73 85.2) (end 117.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 117.73 88.9) (end 117.475 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 117.73 88.9) (end 127.635 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 117.475 88.9) (end 117.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 107.73 85.2) (end 107.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 107.73 88.9) (end 107.95 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 97.79 88.9) (end 107.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 107.73 88.9) (end 107.95 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 107.95 88.9) (end 117.475 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 137.73 88.9) (end 137.795 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 137.795 88.9) (end 147.32 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 157.73 88.9) (end 158.115 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 158.115 88.9) (end 167.64 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 97.79 88.9) (end 97.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 97.73 85.2) (end 97.73 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 97.73 88.9) (end 97.79 88.9) (width 0.508) (layer F.Cu) (net 60)) (segment (start 195.2871 87.6429) (end 197.73 85.2) (width 0.508) (layer B.Cu) (net 60)) (segment (start 195.2871 130.3871) (end 195.2871 87.6429) (width 0.508) (layer B.Cu) (net 60)) (segment (start 196.0095 131.1095) (end 195.2871 130.3871) (width 0.508) (layer B.Cu) (net 60)) (segment (start 202.4637 131.1095) (end 196.0095 131.1095) (width 0.508) (layer B.Cu) (net 60)) (segment (start 204.3088 129.2644) (end 202.4637 131.1095) (width 0.508) (layer B.Cu) (net 60)) (segment (start 252.6283 129.2644) (end 204.3088 129.2644) (width 0.508) (layer B.Cu) (net 60)) (segment (start 259.18 135.8161) (end 252.6283 129.2644) (width 0.508) (layer B.Cu) (net 60)) (segment (start 259.18 135.99) (end 259.18 135.8161) (width 0.508) (layer B.Cu) (net 60)) (segment (start 187.73 99.8) (end 187.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 187.73 104.775) (end 187.96 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 177.73 99.8) (end 177.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 177.73 104.775) (end 177.8 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 167.73 99.8) (end 167.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 167.73 104.775) (end 167.64 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 167.73 104.775) (end 177.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 167.64 104.775) (end 167.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 157.73 99.8) (end 157.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 157.73 104.775) (end 157.48 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 157.73 104.775) (end 167.64 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 157.48 104.775) (end 157.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 147.73 99.8) (end 147.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 147.73 104.775) (end 147.32 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 147.73 104.775) (end 157.48 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 147.32 104.775) (end 147.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 137.73 99.8) (end 137.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 137.73 104.775) (end 137.795 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 127.73 99.8) (end 127.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 127.73 104.775) (end 127.635 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 127.73 104.775) (end 137.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 127.635 104.775) (end 127.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 117.73 99.8) (end 117.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 117.73 104.775) (end 117.475 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 117.73 104.775) (end 127.635 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 117.475 104.775) (end 117.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 107.73 99.8) (end 107.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 107.73 104.775) (end 107.95 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 97.73 99.8) (end 97.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 97.73 104.775) (end 97.79 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 87.83 104.775) (end 97.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 87.73 104.675) (end 87.83 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 87.73 99.8) (end 87.73 104.675) (width 0.508) (layer F.Cu) (net 61)) (segment (start 97.73 104.775) (end 97.79 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 97.79 104.775) (end 107.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 107.73 104.775) (end 107.95 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 107.95 104.775) (end 117.475 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 137.73 104.775) (end 137.795 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 137.795 104.775) (end 147.32 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 177.73 104.775) (end 177.8 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 177.8 104.775) (end 187.73 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 187.73 104.775) (end 187.96 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 192.755 104.775) (end 197.73 99.8) (width 0.508) (layer F.Cu) (net 61)) (segment (start 187.96 104.775) (end 192.755 104.775) (width 0.508) (layer F.Cu) (net 61)) (segment (start 196.0825 101.4475) (end 197.73 99.8) (width 0.508) (layer B.Cu) (net 61)) (segment (start 196.0825 129.6825) (end 196.0825 101.4475) (width 0.508) (layer B.Cu) (net 61)) (segment (start 196.7471 130.3471) (end 196.0825 129.6825) (width 0.508) (layer B.Cu) (net 61)) (segment (start 201.7672 130.3471) (end 196.7471 130.3471) (width 0.508) (layer B.Cu) (net 61)) (segment (start 203.6122 128.5021) (end 201.7672 130.3471) (width 0.508) (layer B.Cu) (net 61)) (segment (start 254.2321 128.5021) (end 203.6122 128.5021) (width 0.508) (layer B.Cu) (net 61)) (segment (start 261.72 135.99) (end 254.2321 128.5021) (width 0.508) (layer B.Cu) (net 61)) (segment (start 197.73 114.4) (end 197.73 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 197.73 117.983) (end 197.739 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC77E)) (segment (start 187.73 114.4) (end 187.73 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 187.73 117.983) (end 187.706 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC777)) (segment (start 177.73 114.4) (end 177.73 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 177.73 117.983) (end 177.673 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC770)) (segment (start 167.73 114.4) (end 167.73 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 167.73 117.983) (end 167.767 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC768)) (segment (start 157.73 114.4) (end 157.73 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 157.73 117.983) (end 157.607 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC75F)) (segment (start 147.73 114.4) (end 147.73 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 137.73 114.4) (end 137.73 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 127.73 114.4) (end 127.73 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 117.73 114.4) (end 117.73 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 117.73 117.983) (end 117.729 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC743)) (segment (start 107.73 114.4) (end 107.73 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 97.73 114.4) (end 97.73 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 97.73 117.983) (end 97.79 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC738)) (segment (start 197.612 117.983) (end 197.739 117.983) (width 0.508) (layer F.Cu) (net 62)) (segment (start 197.739 117.983) (end 187.706 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC784)) (segment (start 187.706 117.983) (end 177.673 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC77B)) (segment (start 177.673 117.983) (end 167.767 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC775)) (segment (start 167.767 117.983) (end 157.607 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC76D)) (segment (start 157.607 117.983) (end 147.73 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC764)) (segment (start 147.73 117.983) (end 137.73 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC75D)) (segment (start 137.73 117.983) (end 127.73 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC756)) (segment (start 127.73 117.983) (end 117.729 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC751)) (segment (start 117.729 117.983) (end 107.73 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC749)) (segment (start 107.73 117.983) (end 97.79 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC741)) (segment (start 97.79 117.983) (end 89.027 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC73D)) (segment (start 87.73 116.686) (end 87.73 114.4) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC734)) (segment (start 89.027 117.983) (end 87.73 116.686) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC72E)) (segment (start 263.029 134.759) (end 264.26 135.99) (width 0.508) (layer F.Cu) (net 62)) (segment (start 256.0722 134.759) (end 263.029 134.759) (width 0.508) (layer F.Cu) (net 62)) (segment (start 255.9187 134.9125) (end 256.0722 134.759) (width 0.508) (layer F.Cu) (net 62)) (segment (start 249.125 134.9125) (end 255.9187 134.9125) (width 0.508) (layer F.Cu) (net 62)) (segment (start 232.1955 117.983) (end 249.125 134.9125) (width 0.508) (layer F.Cu) (net 62)) (segment (start 197.603 117.983) (end 197.612 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC6D7)) (segment (start 197.612 117.983) (end 232.1955 117.983) (width 0.508) (layer F.Cu) (net 62) (tstamp 5C1EC72C)) (segment (start 187.73 129) (end 187.73 125.5915) (width 0.508) (layer F.Cu) (net 63)) (segment (start 177.73 129) (end 177.73 125.5915) (width 0.508) (layer F.Cu) (net 63)) (segment (start 167.73 129) (end 167.73 125.5915) (width 0.508) (layer F.Cu) (net 63)) (segment (start 157.73 129) (end 157.73 125.5915) (width 0.508) (layer F.Cu) (net 63)) (segment (start 147.73 129) (end 147.73 125.5915) (width 0.508) (layer F.Cu) (net 63)) (segment (start 137.73 129) (end 137.73 125.5915) (width 0.508) (layer F.Cu) (net 63)) (segment (start 127.73 129) (end 127.73 125.5915) (width 0.508) (layer F.Cu) (net 63)) (segment (start 117.73 129) (end 117.73 125.5915) (width 0.508) (layer F.Cu) (net 63)) (segment (start 107.73 129) (end 107.73 125.5915) (width 0.508) (layer F.Cu) (net 63)) (segment (start 97.73 129) (end 97.73 125.5915) (width 0.508) (layer F.Cu) (net 63)) (segment (start 194.3215 125.5915) (end 187.73 125.5915) (width 0.508) (layer F.Cu) (net 63)) (segment (start 187.73 125.5915) (end 177.73 125.5915) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC8A1)) (segment (start 177.73 125.5915) (end 167.73 125.5915) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC89A)) (segment (start 167.73 125.5915) (end 157.73 125.5915) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC895)) (segment (start 157.73 125.5915) (end 147.73 125.5915) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC88B)) (segment (start 147.73 125.5915) (end 137.73 125.5915) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC884)) (segment (start 137.73 125.5915) (end 127.73 125.5915) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC87E)) (segment (start 127.73 125.5915) (end 117.73 125.5915) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC878)) (segment (start 117.73 125.5915) (end 107.73 125.5915) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC871)) (segment (start 107.73 125.5915) (end 97.73 125.5915) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC86A)) (segment (start 97.73 125.5915) (end 88.1495 125.5915) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC862)) (segment (start 197.73 129) (end 194.3215 125.5915) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC821)) (segment (start 87.73 126.011) (end 87.73 129) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC851)) (segment (start 88.1495 125.5915) (end 87.73 126.011) (width 0.508) (layer F.Cu) (net 63) (tstamp 5C1EC845)) (segment (start 265.5464 137.2436) (end 266.8 135.99) (width 0.508) (layer F.Cu) (net 63)) (segment (start 245.5245 137.2436) (end 265.5464 137.2436) (width 0.508) (layer F.Cu) (net 63)) (segment (start 241.1348 132.8539) (end 245.5245 137.2436) (width 0.508) (layer F.Cu) (net 63)) (segment (start 217.2658 132.8539) (end 241.1348 132.8539) (width 0.508) (layer F.Cu) (net 63)) (segment (start 216.1863 133.9334) (end 217.2658 132.8539) (width 0.508) (layer F.Cu) (net 63)) (segment (start 202.7953 133.9334) (end 216.1863 133.9334) (width 0.508) (layer F.Cu) (net 63)) (segment (start 197.8619 129) (end 202.7953 133.9334) (width 0.508) (layer F.Cu) (net 63)) (segment (start 197.73 129) (end 197.8619 129) (width 0.508) (layer F.Cu) (net 63)) (segment (start 257.73 92.5) (end 257.73 85.2) (width 0.508) (layer B.Cu) (net 64)) (segment (start 257.73 85.2) (end 257.73 77.9) (width 0.508) (layer B.Cu) (net 64)) (segment (start 237.73 85.2) (end 237.73 92.5) (width 0.508) (layer B.Cu) (net 64)) (segment (start 237.73 77.9) (end 237.73 85.2) (width 0.508) (layer B.Cu) (net 64)) (segment (start 237.73 92.5) (end 237.73 99.8) (width 0.508) (layer B.Cu) (net 64)) (segment (start 237.73 99.8) (end 237.73 107) (width 0.508) (layer B.Cu) (net 64)) (segment (start 237.73 107) (end 237.73 114.2) (width 0.508) (layer B.Cu) (net 64)) (segment (start 237.73 70.6) (end 237.73 74.25) (width 0.508) (layer B.Cu) (net 64)) (segment (start 237.73 74.25) (end 237.73 77.9) (width 0.508) (layer B.Cu) (net 64)) (segment (start 237.73 74.25) (end 257.73 74.25) (width 0.508) (layer B.Cu) (net 64)) (segment (start 257.73 77.9) (end 257.73 74.25) (width 0.508) (layer B.Cu) (net 64)) (segment (start 257.73 74.25) (end 257.73 70.6) (width 0.508) (layer B.Cu) (net 64)) (segment (start 237.73 114.2) (end 237.73 121.1586) (width 0.508) (layer B.Cu) (net 64)) (segment (start 237.73 121.1586) (end 237.73 121.4) (width 0.508) (layer B.Cu) (net 64)) (segment (start 258.5537 125.2037) (end 269.34 135.99) (width 0.508) (layer B.Cu) (net 64)) (segment (start 241.7751 125.2037) (end 258.5537 125.2037) (width 0.508) (layer B.Cu) (net 64)) (segment (start 237.73 121.1586) (end 241.7751 125.2037) (width 0.508) (layer B.Cu) (net 64)) (segment (start 259.969 98.1486) (end 259.3814 98.1486) (width 0.508) (layer B.Cu) (net 65)) (segment (start 259.3814 98.1486) (end 257.73 99.8) (width 0.508) (layer B.Cu) (net 65) (tstamp 5C1EC39C)) (segment (start 57.73 129) (end 57.73 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 57.73 125.095) (end 57.785 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 47.73 129) (end 47.73 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 47.73 125.095) (end 47.625 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 47.73 125.095) (end 57.73 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 47.625 125.095) (end 47.73 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 37.73 129) (end 37.73 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 37.73 125.095) (end 38.1 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 27.94 125.095) (end 37.73 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 27.73 125.305) (end 27.94 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 27.73 129) (end 27.73 125.305) (width 0.508) (layer F.Cu) (net 65)) (segment (start 37.73 125.095) (end 38.1 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 38.1 125.095) (end 47.625 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 57.73 125.095) (end 57.785 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 277.73 70.6) (end 277.73 77.9) (width 0.508) (layer B.Cu) (net 65)) (segment (start 257.73 107.1) (end 257.73 114.4) (width 0.508) (layer B.Cu) (net 65)) (segment (start 63.825 125.095) (end 67.73 129) (width 0.508) (layer F.Cu) (net 65)) (segment (start 57.785 125.095) (end 63.825 125.095) (width 0.508) (layer F.Cu) (net 65)) (segment (start 257.73 99.8) (end 257.73 100.3875) (width 0.508) (layer B.Cu) (net 65)) (segment (start 257.73 100.3875) (end 257.73 107.1) (width 0.508) (layer B.Cu) (net 65)) (segment (start 277.9538 83.8389) (end 277.73 84.0627) (width 0.508) (layer B.Cu) (net 65)) (segment (start 281.3404 83.8389) (end 277.9538 83.8389) (width 0.508) (layer B.Cu) (net 65)) (segment (start 281.9492 84.4477) (end 281.3404 83.8389) (width 0.508) (layer B.Cu) (net 65)) (segment (start 281.9492 86.1209) (end 281.9492 84.4477) (width 0.508) (layer B.Cu) (net 65)) (segment (start 269.9215 98.1486) (end 281.9492 86.1209) (width 0.508) (layer B.Cu) (net 65)) (segment (start 259.9689 98.1486) (end 259.969 98.1486) (width 0.508) (layer B.Cu) (net 65)) (segment (start 259.969 98.1486) (end 269.9215 98.1486) (width 0.508) (layer B.Cu) (net 65) (tstamp 5C1EC39A)) (segment (start 277.73 77.9) (end 277.73 84.0627) (width 0.508) (layer B.Cu) (net 65)) (segment (start 277.73 84.0627) (end 277.73 85.2) (width 0.508) (layer B.Cu) (net 65)) (segment (start 89.8206 106.9094) (end 67.73 129) (width 0.508) (layer F.Cu) (net 65)) (segment (start 257.73 99.8) (end 255.1104 97.1804) (width 0.508) (layer F.Cu) (net 65)) (segment (start 255.1104 97.1804) (end 236.1653 97.1804) (width 0.508) (layer F.Cu) (net 65)) (segment (start 236.1653 97.1804) (end 226.4363 106.9094) (width 0.508) (layer F.Cu) (net 65)) (segment (start 226.4363 106.9094) (end 89.8206 106.9094) (width 0.508) (layer F.Cu) (net 65)) (segment (start 257.73 114.4) (end 257.73 119.7474) (width 0.508) (layer B.Cu) (net 65)) (segment (start 257.73 119.7474) (end 257.73 121.7) (width 0.508) (layer B.Cu) (net 65)) (segment (start 271.88 131.3499) (end 271.88 135.99) (width 0.508) (layer B.Cu) (net 65)) (segment (start 260.2775 119.7474) (end 271.88 131.3499) (width 0.508) (layer B.Cu) (net 65)) (segment (start 257.73 119.7474) (end 260.2775 119.7474) (width 0.508) (layer B.Cu) (net 65)) (segment (start 77.73 105.8418) (end 222.7095 105.8418) (width 0.508) (layer F.Cu) (net 66)) (segment (start 256.0574 114.6808) (end 274.42 133.0434) (width 0.508) (layer F.Cu) (net 66)) (segment (start 256.0574 113.7666) (end 256.0574 114.6808) (width 0.508) (layer F.Cu) (net 66)) (segment (start 262.3058 107.5182) (end 256.0574 113.7666) (width 0.508) (layer F.Cu) (net 66)) (segment (start 262.3058 98.9584) (end 262.3058 107.5182) (width 0.508) (layer F.Cu) (net 66)) (segment (start 259.6896 96.3422) (end 262.3058 98.9584) (width 0.508) (layer F.Cu) (net 66)) (segment (start 232.2091 96.3422) (end 259.6896 96.3422) (width 0.508) (layer F.Cu) (net 66)) (segment (start 223.0139 105.5374) (end 223.4692 105.0821) (width 0.508) (layer F.Cu) (net 66)) (segment (start 223.4692 105.0821) (end 232.2091 96.3422) (width 0.508) (layer F.Cu) (net 66) (tstamp 5C1EC12D)) (segment (start 274.42 133.0434) (end 274.42 135.99) (width 0.508) (layer F.Cu) (net 66)) (segment (start 222.7095 105.8418) (end 223.0139 105.5374) (width 0.508) (layer F.Cu) (net 66) (tstamp 5C1EC17B)) (segment (start 37.73 70.6) (end 37.73 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 37.73 74.93) (end 38.1 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 27.94 74.93) (end 37.73 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 27.73 74.72) (end 27.94 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 27.73 70.6) (end 27.73 74.72) (width 0.508) (layer F.Cu) (net 66)) (segment (start 37.73 74.93) (end 38.1 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 47.73 70.6) (end 47.73 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 47.73 74.93) (end 47.625 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 38.1 74.93) (end 47.625 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 47.625 74.93) (end 47.73 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 57.73 70.6) (end 57.73 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 57.73 74.93) (end 57.785 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 47.73 74.93) (end 57.73 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 57.73 74.93) (end 57.785 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 67.73 70.6) (end 67.73 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 67.73 74.93) (end 67.945 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 57.785 74.93) (end 67.73 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 67.73 74.93) (end 67.945 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 77.73 70.6) (end 75.0824 73.2476) (width 0.508) (layer F.Cu) (net 66)) (segment (start 73.4 74.93) (end 67.945 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 75.0824 73.2476) (end 73.4 74.93) (width 0.508) (layer F.Cu) (net 66)) (segment (start 77.73 75.8952) (end 77.73 105.5374) (width 0.508) (layer F.Cu) (net 66)) (segment (start 75.0824 73.2476) (end 77.73 75.8952) (width 0.508) (layer F.Cu) (net 66)) (segment (start 77.73 105.5374) (end 77.73 105.8418) (width 0.508) (layer F.Cu) (net 66)) (segment (start 77.73 105.8418) (end 77.73 114.4) (width 0.508) (layer F.Cu) (net 66) (tstamp 5C1EC179)) (segment (start 184.15 149.86) (end 184.15 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 185.44 148.57) (end 184.15 149.86) (width 0.508) (layer F.Cu) (net 67)) (segment (start 185.44 148.45) (end 185.44 148.57) (width 0.508) (layer F.Cu) (net 67)) (segment (start 184.15 159.9) (end 189 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 189 159.9) (end 199 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 179 159.9) (end 184.15 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 119 159.9) (end 129 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 109 159.9) (end 119 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 129 159.9) (end 139 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 139 159.9) (end 149 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 89 159.9) (end 99 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 99 159.9) (end 109 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 149 159.9) (end 159 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 159 159.9) (end 169 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 169 159.9) (end 179 159.9) (width 0.508) (layer F.Cu) (net 67)) (segment (start 74 150) (end 74 159.9) (width 0.508) (layer F.Cu) (net 68)) (segment (start 75.19 148.81) (end 74 150) (width 0.508) (layer F.Cu) (net 68)) (segment (start 75.19 148.5) (end 75.19 148.81) (width 0.508) (layer F.Cu) (net 68)) (segment (start 74 159.9) (end 79 159.9) (width 0.508) (layer F.Cu) (net 68)) (segment (start 29 159.9) (end 39 159.9) (width 0.508) (layer F.Cu) (net 68)) (segment (start 39 159.9) (end 49 159.9) (width 0.508) (layer F.Cu) (net 68)) (segment (start 49 159.9) (end 59 159.9) (width 0.508) (layer F.Cu) (net 68)) (segment (start 59 159.9) (end 69 159.9) (width 0.508) (layer F.Cu) (net 68)) (segment (start 69 159.9) (end 74 159.9) (width 0.508) (layer F.Cu) (net 68)) (segment (start 234.1 149.9) (end 234.1 159.9) (width 0.508) (layer F.Cu) (net 69)) (segment (start 232.81 148.61) (end 234.1 149.9) (width 0.508) (layer F.Cu) (net 69)) (segment (start 232.81 148.45) (end 232.81 148.61) (width 0.508) (layer F.Cu) (net 69)) (segment (start 229 159.9) (end 234.1 159.9) (width 0.508) (layer F.Cu) (net 69)) (segment (start 269 159.9) (end 279 159.9) (width 0.508) (layer F.Cu) (net 69)) (segment (start 259 159.9) (end 269 159.9) (width 0.508) (layer F.Cu) (net 69)) (segment (start 209 159.9) (end 219 159.9) (width 0.508) (layer F.Cu) (net 69)) (segment (start 219 159.9) (end 229 159.9) (width 0.508) (layer F.Cu) (net 69)) (segment (start 249 159.9) (end 259 159.9) (width 0.508) (layer F.Cu) (net 69)) (segment (start 234.1 159.9) (end 239 159.9) (width 0.508) (layer F.Cu) (net 69)) (segment (start 239 159.9) (end 249 159.9) (width 0.508) (layer F.Cu) (net 69)) (segment (start 235.35 135.236) (end 235.35 138.73) (width 0.508) (layer B.Cu) (net 70)) (segment (start 235.356 135.23) (end 235.35 135.236) (width 0.508) (layer B.Cu) (net 70)) (segment (start 237.89 135.236) (end 237.89 138.73) (width 0.508) (layer B.Cu) (net 71)) (segment (start 237.896 135.23) (end 237.89 135.236) (width 0.508) (layer B.Cu) (net 71)) (segment (start 256.64 143.61) (end 255.4332 143.61) (width 0.508) (layer B.Cu) (net 72)) (segment (start 194.71 141.8013) (end 194.71 141.27) (width 0.508) (layer B.Cu) (net 72)) (segment (start 202.5815 149.6728) (end 194.71 141.8013) (width 0.508) (layer B.Cu) (net 72)) (segment (start 228.3418 149.6728) (end 202.5815 149.6728) (width 0.508) (layer B.Cu) (net 72)) (segment (start 231.8219 146.1927) (end 228.3418 149.6728) (width 0.508) (layer B.Cu) (net 72)) (segment (start 247.0768 146.1927) (end 231.8219 146.1927) (width 0.508) (layer B.Cu) (net 72)) (segment (start 247.8391 145.4304) (end 247.0768 146.1927) (width 0.508) (layer B.Cu) (net 72)) (segment (start 252.5348 145.4304) (end 247.8391 145.4304) (width 0.508) (layer B.Cu) (net 72)) (segment (start 254.3552 143.61) (end 252.5348 145.4304) (width 0.508) (layer B.Cu) (net 72)) (segment (start 255.4332 143.61) (end 254.3552 143.61) (width 0.508) (layer B.Cu) (net 72)) (via (at 254.3781 145.4496) (size 0.889) (layers F.Cu B.Cu) (net 73)) (via (at 230.9695 149.7011) (size 0.889) (layers F.Cu B.Cu) (net 73)) (via (at 199.7977 148.4318) (size 0.889) (layers F.Cu B.Cu) (net 73)) (segment (start 257.3404 145.4496) (end 254.3781 145.4496) (width 0.508) (layer F.Cu) (net 73)) (segment (start 259.18 143.61) (end 257.3404 145.4496) (width 0.508) (layer F.Cu) (net 73)) (segment (start 192.6359 141.27) (end 199.7977 148.4318) (width 0.508) (layer B.Cu) (net 73)) (segment (start 192.17 141.27) (end 192.6359 141.27) (width 0.508) (layer B.Cu) (net 73)) (segment (start 230.9695 148.3925) (end 230.9695 149.7011) (width 0.508) (layer B.Cu) (net 73)) (segment (start 232.407 146.955) (end 230.9695 148.3925) (width 0.508) (layer B.Cu) (net 73)) (segment (start 247.7738 146.955) (end 232.407 146.955) (width 0.508) (layer B.Cu) (net 73)) (segment (start 248.5361 146.1927) (end 247.7738 146.955) (width 0.508) (layer B.Cu) (net 73)) (segment (start 253.635 146.1927) (end 248.5361 146.1927) (width 0.508) (layer B.Cu) (net 73)) (segment (start 254.3781 145.4496) (end 253.635 146.1927) (width 0.508) (layer B.Cu) (net 73)) (segment (start 201.067 149.7011) (end 230.9695 149.7011) (width 0.508) (layer F.Cu) (net 73)) (segment (start 199.7977 148.4318) (end 201.067 149.7011) (width 0.508) (layer F.Cu) (net 73)) (segment (start 256.105 137.995) (end 261.72 143.61) (width 0.508) (layer B.Cu) (net 74)) (segment (start 255.027 137.995) (end 256.105 137.995) (width 0.508) (layer B.Cu) (net 74)) (segment (start 249.4926 132.4606) (end 255.027 137.995) (width 0.508) (layer B.Cu) (net 74)) (segment (start 228.9194 132.4606) (end 249.4926 132.4606) (width 0.508) (layer B.Cu) (net 74)) (segment (start 222.65 138.73) (end 228.9194 132.4606) (width 0.508) (layer B.Cu) (net 74)) (segment (start 261.4651 146.4049) (end 264.26 143.61) (width 0.508) (layer F.Cu) (net 75)) (segment (start 238.3931 146.4049) (end 261.4651 146.4049) (width 0.508) (layer F.Cu) (net 75)) (segment (start 235.7427 143.7545) (end 238.3931 146.4049) (width 0.508) (layer F.Cu) (net 75)) (segment (start 225.1345 143.7545) (end 235.7427 143.7545) (width 0.508) (layer F.Cu) (net 75)) (segment (start 222.65 141.27) (end 225.1345 143.7545) (width 0.508) (layer F.Cu) (net 75)) (segment (start 263.209 147.201) (end 266.8 143.61) (width 0.508) (layer F.Cu) (net 76)) (segment (start 235.8623 147.201) (end 263.209 147.201) (width 0.508) (layer F.Cu) (net 76)) (segment (start 233.2512 144.5899) (end 235.8623 147.201) (width 0.508) (layer F.Cu) (net 76)) (segment (start 223.4299 144.5899) (end 233.2512 144.5899) (width 0.508) (layer F.Cu) (net 76)) (segment (start 220.11 141.27) (end 223.4299 144.5899) (width 0.508) (layer F.Cu) (net 76)) (segment (start 264.9623 147.9877) (end 269.34 143.61) (width 0.508) (layer F.Cu) (net 77)) (segment (start 235.1898 147.9877) (end 264.9623 147.9877) (width 0.508) (layer F.Cu) (net 77)) (segment (start 232.5543 145.3522) (end 235.1898 147.9877) (width 0.508) (layer F.Cu) (net 77)) (segment (start 219.1122 145.3522) (end 232.5543 145.3522) (width 0.508) (layer F.Cu) (net 77)) (segment (start 215.03 141.27) (end 219.1122 145.3522) (width 0.508) (layer F.Cu) (net 77)) (via (at 202.2186 134.7112) (size 0.889) (layers F.Cu B.Cu) (net 78)) (segment (start 198.7288 134.7112) (end 202.2186 134.7112) (width 0.508) (layer B.Cu) (net 78)) (segment (start 194.71 138.73) (end 198.7288 134.7112) (width 0.508) (layer B.Cu) (net 78)) (segment (start 270.3876 142.1176) (end 271.88 143.61) (width 0.508) (layer F.Cu) (net 78)) (segment (start 253.5264 142.1176) (end 270.3876 142.1176) (width 0.508) (layer F.Cu) (net 78)) (segment (start 250.3885 145.2555) (end 253.5264 142.1176) (width 0.508) (layer F.Cu) (net 78)) (segment (start 246.4094 145.2555) (end 250.3885 145.2555) (width 0.508) (layer F.Cu) (net 78)) (segment (start 242.783 141.6291) (end 246.4094 145.2555) (width 0.508) (layer F.Cu) (net 78)) (segment (start 242.783 137.763) (end 242.783 141.6291) (width 0.508) (layer F.Cu) (net 78)) (segment (start 242.0914 137.0714) (end 242.783 137.763) (width 0.508) (layer F.Cu) (net 78)) (segment (start 232.2296 137.0714) (end 242.0914 137.0714) (width 0.508) (layer F.Cu) (net 78)) (segment (start 229.8694 134.7112) (end 232.2296 137.0714) (width 0.508) (layer F.Cu) (net 78)) (segment (start 202.2186 134.7112) (end 229.8694 134.7112) (width 0.508) (layer F.Cu) (net 78)) (segment (start 230.5954 133.3246) (end 225.19 138.73) (width 0.508) (layer B.Cu) (net 79)) (segment (start 248.9927 133.3246) (end 230.5954 133.3246) (width 0.508) (layer B.Cu) (net 79)) (segment (start 257.8469 142.1788) (end 248.9927 133.3246) (width 0.508) (layer B.Cu) (net 79)) (segment (start 257.8469 144.5262) (end 257.8469 142.1788) (width 0.508) (layer B.Cu) (net 79)) (segment (start 258.5273 145.2066) (end 257.8469 144.5262) (width 0.508) (layer B.Cu) (net 79)) (segment (start 272.8234 145.2066) (end 258.5273 145.2066) (width 0.508) (layer B.Cu) (net 79)) (segment (start 274.42 143.61) (end 272.8234 145.2066) (width 0.508) (layer B.Cu) (net 79)) (zone (net 0) (net_name "") (layer B.Cu) (tstamp 554E4CD1) (hatch edge 0.508) (connect_pads (clearance 0.508)) (min_thickness 0.254) (keepout (tracks not_allowed) (vias not_allowed) (copperpour allowed)) (fill (arc_segments 16) (thermal_gap 0.508) (thermal_bridge_width 0.508)) (polygon (pts (xy 288 140) (xy 284 140) (xy 284 156) (xy 288 156) ) ) ) (zone (net 0) (net_name "") (layer F.Cu) (tstamp 554E4CD1) (hatch edge 0.508) (connect_pads (clearance 0.508)) (min_thickness 0.254) (keepout (tracks not_allowed) (vias not_allowed) (copperpour allowed)) (fill (arc_segments 16) (thermal_gap 0.508) (thermal_bridge_width 0.508)) (polygon (pts (xy 288 140) (xy 284 140) (xy 284 156) (xy 288 156) ) ) ) (zone (net 0) (net_name "") (layer B.Cu) (tstamp 56C9DD58) (hatch edge 0.508) (connect_pads (clearance 0.508)) (min_thickness 0.254) (keepout (tracks not_allowed) (vias not_allowed) (copperpour allowed)) (fill (arc_segments 16) (thermal_gap 0.508) (thermal_bridge_width 0.508)) (polygon (pts (xy 24 162) (xy 16 162) (xy 16 156.2) (xy 9.8 156.2) (xy 9.8 141.4) (xy 13 141.4) (xy 13 137.8) (xy 20.6 137.8) (xy 24 141.2) ) ) ) (zone (net 0) (net_name "") (layer F.Cu) (tstamp 56C9DD58) (hatch edge 0.508) (connect_pads (clearance 0.508)) (min_thickness 0.254) (keepout (tracks not_allowed) (vias not_allowed) (copperpour allowed)) (fill (arc_segments 16) (thermal_gap 0.508) (thermal_bridge_width 0.508)) (polygon (pts (xy 24 162) (xy 16 162) (xy 16 156.2) (xy 9.8 156.2) (xy 9.8 141.4) (xy 13 141.4) (xy 13 137.8) (xy 20.6 137.8) (xy 24 141.2) ) ) ) ) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | update=Thu 18 Jun 2020 23:48:03 CEST version=1 last_client=kicad [cvpcb] version=1 NetIExt=net [cvpcb/libraries] EquName1=devcms [general] version=1 [pcbnew] version=1 LastNetListRead= UseCmpFile=1 PadDrill=1.700000000000 PadDrillOvalY=1.700000000000 PadSizeH=2.500000000000 PadSizeV=2.500000000000 PcbTextSizeV=1.500000000000 PcbTextSizeH=1.500000000000 PcbTextThickness=0.300000000000 ModuleTextSizeV=1.000000000000 ModuleTextSizeH=1.000000000000 ModuleTextSizeThickness=0.150000000000 SolderMaskClearance=0.000000000000 SolderMaskMinWidth=0.000000000000 DrawSegmentWidth=0.100000000000 BoardOutlineThickness=0.100000000000 ModuleOutlineThickness=0.010000000000 [pcbnew/libraries] LibDir=customlibraries LibName1=sockets LibName2=connect LibName3=discret LibName4=pin_array LibName5=divers LibName6=smd_capacitors LibName7=smd_resistors LibName8=smd_crystal&oscillator LibName9=smd_dil LibName10=smd_transistors LibName11=libcms LibName12=display LibName13=pdp8footprintlib2 LibName14=led LibName15=dip_sockets LibName16=pga_sockets LibName17=valves LibName18=pdp8logo3 [eeschema] version=1 LibDir= [schematic_editor] version=1 PageLayoutDescrFile= PlotDirectoryName= SubpartIdSeparator=0 SubpartFirstId=65 NetFmtName= SpiceAjustPassiveValues=0 LabSize=50 ERC_TestSimilarLabels=1 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | (rules PCB PDP8 (snap_angle fortyfive_degree ) (autoroute_settings (fanout off) (autoroute on) (postroute on) (vias on) (via_costs 50) (plane_via_costs 5) (start_ripup_costs 100) (start_pass_no 19938) (layer_rule F.Cu (active on) (preferred_direction horizontal) (preferred_direction_trace_costs 1.0) (against_preferred_direction_trace_costs 3.9) ) (layer_rule B.Cu (active on) (preferred_direction vertical) (preferred_direction_trace_costs 1.0) (against_preferred_direction_trace_costs 1.3) ) ) (rule (width 254.0) (clear 254.2) (clear 127.0 (type smd_to_turn_gap)) (clear 63.6 (type smd_smd)) ) (padstack "Via[0-1]_889:635_um" (shape (circle F.Cu 889.0 0.0 0.0) ) (shape (circle B.Cu 889.0 0.0 0.0) ) (attach off) ) (padstack "Via[0-1]_889:0_um" (shape (circle F.Cu 889.0 0.0 0.0) ) (shape (circle B.Cu 889.0 0.0 0.0) ) (attach off) ) (via "Via[0-1]_889:635_um" "Via[0-1]_889:635_um" default ) (via "Via[0-1]_889:0_um" "Via[0-1]_889:0_um" default ) (via "Via[0-1]_889:635_um-kicad_default" "Via[0-1]_889:635_um" "kicad_default" ) (via "Via[0-1]_889:0_um-kicad_default" "Via[0-1]_889:0_um" "kicad_default" ) (via_rule default "Via[0-1]_889:635_um" ) (via_rule "kicad_default" "Via[0-1]_889:635_um-kicad_default" ) (class default (clearance_class default) (via_rule default) (rule (width 254.0) ) (circuit (use_layer F.Cu B.Cu) ) ) (class "kicad_default" "N-0000023" "N-0000028" "N-0000029" "N-0000035" "N-0000039" "N-0000040" "N-0000041" "N-0000042" "N-0000043" "N-0000046" "N-0000048" "N-0000049" "N-0000050" "N-0000053" "N-0000054" "N-0000055" "N-0000056" "N-0000057" "N-0000059" "N-0000060" "N-0000061" "N-0000062" "N-0000063" "N-0000065" "N-0000066" "N-0000067" "N-0000068" "N-0000069" "N-0000070" "N-0000071" "N-0000072" "N-0000073" "N-0000074" "N-0000079" "N-0000085" "N-0000086" "N-0000087" "N-0000088" "N-0000089" "N-0000090" "N-0000091" "N-0000092" "N-0000093" RX "SPARE_IO" TX col1 col10 col11 col12 col1a col2 col2a col3 col4 col5 col6 col7 col8 col9 led1 led2 led3 led4 led5 led6 led7 led8 xled1 xled2 xled3 xled4 xled5 xled6 xled7 xled8 (clearance_class "kicad_default") (via_rule kicad_default) (rule (width 254.0) ) (circuit (use_layer F.Cu B.Cu) ) ) (class fat +3.3V +5V GND row1 row2 row3 (clearance_class default) (via_rule default) (rule (width 381.0) ) (circuit (use_layer F.Cu B.Cu) ) ) ) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 | EESchema Schematic File Version 2 LIBS:power LIBS:device LIBS:transistors LIBS:conn LIBS:linear LIBS:regul LIBS:74xx LIBS:cmos4000 LIBS:adc-dac LIBS:memory LIBS:xilinx LIBS:special LIBS:microcontrollers LIBS:dsp LIBS:microchip LIBS:analog_switches LIBS:motorola LIBS:texas LIBS:intel LIBS:audio LIBS:interface LIBS:digital-audio LIBS:philips LIBS:display LIBS:cypress LIBS:siliconi LIBS:opto LIBS:atmel LIBS:contrib LIBS:valves LIBS:pdp8_library LIBS:PDP8_2019-cache EELAYER 27 0 EELAYER END $Descr A4 11693 8268 encoding utf-8 Sheet 1 1 Title "" Date "22 dec 2018" Rev "" Comp "" Comment1 "" Comment2 "" Comment3 "" Comment4 "" $EndDescr $Comp L LED DPC1 U 1 1 548EF34A P 5500 900 F 0 "DPC1" H 5500 1000 50 0000 C CNN F 1 "LED" H 5500 800 50 0000 C CNN F 2 "~" H 5500 900 60 0000 C CNN F 3 "~" H 5500 900 60 0000 C CNN 1 5500 900 0 1 1 0 $EndComp $Comp L LED DPC2 U 1 1 548EF399 P 5800 900 F 0 "DPC2" H 5800 1000 50 0000 C CNN F 1 "LED" H 5800 800 50 0000 C CNN F 2 "~" H 5800 900 60 0000 C CNN F 3 "~" H 5800 900 60 0000 C CNN 1 5800 900 0 1 1 0 $EndComp $Comp L LED DPC3 U 1 1 548EF3AC P 6100 900 F 0 "DPC3" H 6100 1000 50 0000 C CNN F 1 "LED" H 6100 800 50 0000 C CNN F 2 "~" H 6100 900 60 0000 C CNN F 3 "~" H 6100 900 60 0000 C CNN 1 6100 900 0 1 1 0 $EndComp $Comp L LED DPC4 U 1 1 548EF3B2 P 6400 900 F 0 "DPC4" H 6400 1000 50 0000 C CNN F 1 "LED" H 6400 800 50 0000 C CNN F 2 "~" H 6400 900 60 0000 C CNN F 3 "~" H 6400 900 60 0000 C CNN 1 6400 900 0 1 1 0 $EndComp $Comp L LED DPC5 U 1 1 548EF3B8 P 6700 900 F 0 "DPC5" H 6700 1000 50 0000 C CNN F 1 "LED" H 6700 800 50 0000 C CNN F 2 "~" H 6700 900 60 0000 C CNN F 3 "~" H 6700 900 60 0000 C CNN 1 6700 900 0 1 1 0 $EndComp $Comp L LED DPC6 U 1 1 548EF3BE P 7000 900 F 0 "DPC6" H 7000 1000 50 0000 C CNN F 1 "LED" H 7000 800 50 0000 C CNN F 2 "~" H 7000 900 60 0000 C CNN F 3 "~" H 7000 900 60 0000 C CNN 1 7000 900 0 1 1 0 $EndComp $Comp L LED DPC7 U 1 1 548EF3C4 P 7300 900 F 0 "DPC7" H 7300 1000 50 0000 C CNN F 1 "LED" H 7300 800 50 0000 C CNN F 2 "~" H 7300 900 60 0000 C CNN F 3 "~" H 7300 900 60 0000 C CNN 1 7300 900 0 1 1 0 $EndComp $Comp L LED DPC8 U 1 1 548EF3CA P 7600 900 F 0 "DPC8" H 7600 1000 50 0000 C CNN F 1 "LED" H 7600 800 50 0000 C CNN F 2 "~" H 7600 900 60 0000 C CNN F 3 "~" H 7600 900 60 0000 C CNN 1 7600 900 0 1 1 0 $EndComp $Comp L LED DPC9 U 1 1 548EF3D0 P 7900 900 F 0 "DPC9" H 7900 1000 50 0000 C CNN F 1 "LED" H 7900 800 50 0000 C CNN F 2 "~" H 7900 900 60 0000 C CNN F 3 "~" H 7900 900 60 0000 C CNN 1 7900 900 0 1 1 0 $EndComp $Comp L LED DPC10 U 1 1 548EF3D6 P 8200 900 F 0 "DPC10" H 8200 1000 50 0000 C CNN F 1 "LED" H 8200 800 50 0000 C CNN F 2 "~" H 8200 900 60 0000 C CNN F 3 "~" H 8200 900 60 0000 C CNN 1 8200 900 0 1 1 0 $EndComp $Comp L LED DPC11 U 1 1 548EF3DC P 8500 900 F 0 "DPC11" H 8500 1000 50 0000 C CNN F 1 "LED" H 8500 800 50 0000 C CNN F 2 "~" H 8500 900 60 0000 C CNN F 3 "~" H 8500 900 60 0000 C CNN 1 8500 900 0 1 1 0 $EndComp $Comp L LED DPC12 U 1 1 548EF3E2 P 8800 900 F 0 "DPC12" H 8800 1000 50 0000 C CNN F 1 "LED" H 8800 800 50 0000 C CNN F 2 "~" H 8800 900 60 0000 C CNN F 3 "~" H 8800 900 60 0000 C CNN 1 8800 900 0 1 1 0 $EndComp $Comp L LED DMA1 U 1 1 548EF463 P 5500 1550 F 0 "DMA1" H 5500 1650 50 0000 C CNN F 1 "LED" H 5500 1450 50 0000 C CNN F 2 "~" H 5500 1550 60 0000 C CNN F 3 "~" H 5500 1550 60 0000 C CNN 1 5500 1550 0 -1 -1 0 $EndComp $Comp L LED DMA2 U 1 1 548EF47C P 5800 1550 F 0 "DMA2" H 5800 1650 50 0000 C CNN F 1 "LED" H 5800 1450 50 0000 C CNN F 2 "~" H 5800 1550 60 0000 C CNN F 3 "~" H 5800 1550 60 0000 C CNN 1 5800 1550 0 -1 -1 0 $EndComp $Comp L LED DMA3 U 1 1 548EF482 P 6100 1550 F 0 "DMA3" H 6100 1650 50 0000 C CNN F 1 "LED" H 6100 1450 50 0000 C CNN F 2 "~" H 6100 1550 60 0000 C CNN F 3 "~" H 6100 1550 60 0000 C CNN 1 6100 1550 0 -1 -1 0 $EndComp $Comp L LED DMA4 U 1 1 548EF488 P 6400 1550 F 0 "DMA4" H 6400 1650 50 0000 C CNN F 1 "LED" H 6400 1450 50 0000 C CNN F 2 "~" H 6400 1550 60 0000 C CNN F 3 "~" H 6400 1550 60 0000 C CNN 1 6400 1550 0 -1 -1 0 $EndComp $Comp L LED DMA5 U 1 1 548EF48E P 6700 1550 F 0 "DMA5" H 6700 1650 50 0000 C CNN F 1 "LED" H 6700 1450 50 0000 C CNN F 2 "~" H 6700 1550 60 0000 C CNN F 3 "~" H 6700 1550 60 0000 C CNN 1 6700 1550 0 -1 -1 0 $EndComp $Comp L LED DMA6 U 1 1 548EF494 P 7000 1550 F 0 "DMA6" H 7000 1650 50 0000 C CNN F 1 "LED" H 7000 1450 50 0000 C CNN F 2 "~" H 7000 1550 60 0000 C CNN F 3 "~" H 7000 1550 60 0000 C CNN 1 7000 1550 0 -1 -1 0 $EndComp $Comp L LED DMA7 U 1 1 548EF49A P 7300 1550 F 0 "DMA7" H 7300 1650 50 0000 C CNN F 1 "LED" H 7300 1450 50 0000 C CNN F 2 "~" H 7300 1550 60 0000 C CNN F 3 "~" H 7300 1550 60 0000 C CNN 1 7300 1550 0 -1 -1 0 $EndComp $Comp L LED DMA8 U 1 1 548EF4A0 P 7600 1550 F 0 "DMA8" H 7600 1650 50 0000 C CNN F 1 "LED" H 7600 1450 50 0000 C CNN F 2 "~" H 7600 1550 60 0000 C CNN F 3 "~" H 7600 1550 60 0000 C CNN 1 7600 1550 0 -1 -1 0 $EndComp $Comp L LED DMA9 U 1 1 548EF4A6 P 7900 1550 F 0 "DMA9" H 7900 1650 50 0000 C CNN F 1 "LED" H 7900 1450 50 0000 C CNN F 2 "~" H 7900 1550 60 0000 C CNN F 3 "~" H 7900 1550 60 0000 C CNN 1 7900 1550 0 -1 -1 0 $EndComp $Comp L LED DMA10 U 1 1 548EF4AC P 8200 1550 F 0 "DMA10" H 8200 1650 50 0000 C CNN F 1 "LED" H 8200 1450 50 0000 C CNN F 2 "~" H 8200 1550 60 0000 C CNN F 3 "~" H 8200 1550 60 0000 C CNN 1 8200 1550 0 -1 -1 0 $EndComp $Comp L LED DMA11 U 1 1 548EF4B2 P 8500 1550 F 0 "DMA11" H 8500 1650 50 0000 C CNN F 1 "LED" H 8500 1450 50 0000 C CNN F 2 "~" H 8500 1550 60 0000 C CNN F 3 "~" H 8500 1550 60 0000 C CNN 1 8500 1550 0 -1 -1 0 $EndComp $Comp L LED DMA12 U 1 1 548EF4B8 P 8800 1550 F 0 "DMA12" H 8800 1650 50 0000 C CNN F 1 "LED" H 8800 1450 50 0000 C CNN F 2 "~" H 8800 1550 60 0000 C CNN F 3 "~" H 8800 1550 60 0000 C CNN 1 8800 1550 0 -1 -1 0 $EndComp $Comp L LED DMB1 U 1 1 548EF56F P 5500 2200 F 0 "DMB1" H 5500 2300 50 0000 C CNN F 1 "LED" H 5500 2100 50 0000 C CNN F 2 "~" H 5500 2200 60 0000 C CNN F 3 "~" H 5500 2200 60 0000 C CNN 1 5500 2200 0 1 1 0 $EndComp $Comp L LED DMB2 U 1 1 548EF588 P 5800 2200 F 0 "DMB2" H 5800 2300 50 0000 C CNN F 1 "LED" H 5800 2100 50 0000 C CNN F 2 "~" H 5800 2200 60 0000 C CNN F 3 "~" H 5800 2200 60 0000 C CNN 1 5800 2200 0 1 1 0 $EndComp $Comp L LED DMB3 U 1 1 548EF58E P 6100 2200 F 0 "DMB3" H 6100 2300 50 0000 C CNN F 1 "LED" H 6100 2100 50 0000 C CNN F 2 "~" H 6100 2200 60 0000 C CNN F 3 "~" H 6100 2200 60 0000 C CNN 1 6100 2200 0 1 1 0 $EndComp $Comp L LED DMB4 U 1 1 548EF594 P 6400 2200 F 0 "DMB4" H 6400 2300 50 0000 C CNN F 1 "LED" H 6400 2100 50 0000 C CNN F 2 "~" H 6400 2200 60 0000 C CNN F 3 "~" H 6400 2200 60 0000 C CNN 1 6400 2200 0 1 1 0 $EndComp $Comp L LED DMB5 U 1 1 548EF59A P 6700 2200 F 0 "DMB5" H 6700 2300 50 0000 C CNN F 1 "LED" H 6700 2100 50 0000 C CNN F 2 "~" H 6700 2200 60 0000 C CNN F 3 "~" H 6700 2200 60 0000 C CNN 1 6700 2200 0 1 1 0 $EndComp $Comp L LED DMB6 U 1 1 548EF5A0 P 7000 2200 F 0 "DMB6" H 7000 2300 50 0000 C CNN F 1 "LED" H 7000 2100 50 0000 C CNN F 2 "~" H 7000 2200 60 0000 C CNN F 3 "~" H 7000 2200 60 0000 C CNN 1 7000 2200 0 1 1 0 $EndComp $Comp L LED DMB7 U 1 1 548EF5A6 P 7300 2200 F 0 "DMB7" H 7300 2300 50 0000 C CNN F 1 "LED" H 7300 2100 50 0000 C CNN F 2 "~" H 7300 2200 60 0000 C CNN F 3 "~" H 7300 2200 60 0000 C CNN 1 7300 2200 0 1 1 0 $EndComp $Comp L LED DMB8 U 1 1 548EF5AC P 7600 2200 F 0 "DMB8" H 7600 2300 50 0000 C CNN F 1 "LED" H 7600 2100 50 0000 C CNN F 2 "~" H 7600 2200 60 0000 C CNN F 3 "~" H 7600 2200 60 0000 C CNN 1 7600 2200 0 1 1 0 $EndComp $Comp L LED DMB9 U 1 1 548EF5B2 P 7900 2200 F 0 "DMB9" H 7900 2300 50 0000 C CNN F 1 "LED" H 7900 2100 50 0000 C CNN F 2 "~" H 7900 2200 60 0000 C CNN F 3 "~" H 7900 2200 60 0000 C CNN 1 7900 2200 0 1 1 0 $EndComp $Comp L LED DMB10 U 1 1 548EF5B8 P 8200 2200 F 0 "DMB10" H 8200 2300 50 0000 C CNN F 1 "LED" H 8200 2100 50 0000 C CNN F 2 "~" H 8200 2200 60 0000 C CNN F 3 "~" H 8200 2200 60 0000 C CNN 1 8200 2200 0 1 1 0 $EndComp $Comp L LED DMB11 U 1 1 548EF5BE P 8500 2200 F 0 "DMB11" H 8500 2300 50 0000 C CNN F 1 "LED" H 8500 2100 50 0000 C CNN F 2 "~" H 8500 2200 60 0000 C CNN F 3 "~" H 8500 2200 60 0000 C CNN 1 8500 2200 0 1 1 0 $EndComp $Comp L LED DMB12 U 1 1 548EF5C4 P 8800 2200 F 0 "DMB12" H 8800 2300 50 0000 C CNN F 1 "LED" H 8800 2100 50 0000 C CNN F 2 "~" H 8800 2200 60 0000 C CNN F 3 "~" H 8800 2200 60 0000 C CNN 1 8800 2200 0 1 1 0 $EndComp $Comp L LED DAC1 U 1 1 548EF5CC P 5500 2850 F 0 "DAC1" H 5500 2950 50 0000 C CNN F 1 "LED" H 5500 2750 50 0000 C CNN F 2 "~" H 5500 2850 60 0000 C CNN F 3 "~" H 5500 2850 60 0000 C CNN 1 5500 2850 0 -1 -1 0 $EndComp $Comp L LED DAC2 U 1 1 548EF5E5 P 5800 2850 F 0 "DAC2" H 5800 2950 50 0000 C CNN F 1 "LED" H 5800 2750 50 0000 C CNN F 2 "~" H 5800 2850 60 0000 C CNN F 3 "~" H 5800 2850 60 0000 C CNN 1 5800 2850 0 -1 -1 0 $EndComp $Comp L LED DAC3 U 1 1 548EF5EB P 6100 2850 F 0 "DAC3" H 6100 2950 50 0000 C CNN F 1 "LED" H 6100 2750 50 0000 C CNN F 2 "~" H 6100 2850 60 0000 C CNN F 3 "~" H 6100 2850 60 0000 C CNN 1 6100 2850 0 -1 -1 0 $EndComp $Comp L LED DAC4 U 1 1 548EF5F1 P 6400 2850 F 0 "DAC4" H 6400 2950 50 0000 C CNN F 1 "LED" H 6400 2750 50 0000 C CNN F 2 "~" H 6400 2850 60 0000 C CNN F 3 "~" H 6400 2850 60 0000 C CNN 1 6400 2850 0 -1 -1 0 $EndComp $Comp L LED DAC5 U 1 1 548EF5F7 P 6700 2850 F 0 "DAC5" H 6700 2950 50 0000 C CNN F 1 "LED" H 6700 2750 50 0000 C CNN F 2 "~" H 6700 2850 60 0000 C CNN F 3 "~" H 6700 2850 60 0000 C CNN 1 6700 2850 0 -1 -1 0 $EndComp $Comp L LED DAC6 U 1 1 548EF5FD P 7000 2850 F 0 "DAC6" H 7000 2950 50 0000 C CNN F 1 "LED" H 7000 2750 50 0000 C CNN F 2 "~" H 7000 2850 60 0000 C CNN F 3 "~" H 7000 2850 60 0000 C CNN 1 7000 2850 0 -1 -1 0 $EndComp $Comp L LED DAC7 U 1 1 548EF603 P 7300 2850 F 0 "DAC7" H 7300 2950 50 0000 C CNN F 1 "LED" H 7300 2750 50 0000 C CNN F 2 "~" H 7300 2850 60 0000 C CNN F 3 "~" H 7300 2850 60 0000 C CNN 1 7300 2850 0 -1 -1 0 $EndComp $Comp L LED DAC8 U 1 1 548EF609 P 7600 2850 F 0 "DAC8" H 7600 2950 50 0000 C CNN F 1 "LED" H 7600 2750 50 0000 C CNN F 2 "~" H 7600 2850 60 0000 C CNN F 3 "~" H 7600 2850 60 0000 C CNN 1 7600 2850 0 -1 -1 0 $EndComp $Comp L LED DAC9 U 1 1 548EF60F P 7900 2850 F 0 "DAC9" H 7900 2950 50 0000 C CNN F 1 "LED" H 7900 2750 50 0000 C CNN F 2 "~" H 7900 2850 60 0000 C CNN F 3 "~" H 7900 2850 60 0000 C CNN 1 7900 2850 0 -1 -1 0 $EndComp $Comp L LED DAC10 U 1 1 548EF615 P 8200 2850 F 0 "DAC10" H 8200 2950 50 0000 C CNN F 1 "LED" H 8200 2750 50 0000 C CNN F 2 "~" H 8200 2850 60 0000 C CNN F 3 "~" H 8200 2850 60 0000 C CNN 1 8200 2850 0 -1 -1 0 $EndComp $Comp L LED DAC11 U 1 1 548EF61B P 8500 2850 F 0 "DAC11" H 8500 2950 50 0000 C CNN F 1 "LED" H 8500 2750 50 0000 C CNN F 2 "~" H 8500 2850 60 0000 C CNN F 3 "~" H 8500 2850 60 0000 C CNN 1 8500 2850 0 -1 -1 0 $EndComp $Comp L LED DAC12 U 1 1 548EF621 P 8800 2850 F 0 "DAC12" H 8800 2950 50 0000 C CNN F 1 "LED" H 8800 2750 50 0000 C CNN F 2 "~" H 8800 2850 60 0000 C CNN F 3 "~" H 8800 2850 60 0000 C CNN 1 8800 2850 0 -1 -1 0 $EndComp $Comp L LED DMQ1 U 1 1 548EF629 P 5500 3600 F 0 "DMQ1" H 5500 3700 50 0000 C CNN F 1 "LED" H 5500 3500 50 0000 C CNN F 2 "~" H 5500 3600 60 0000 C CNN F 3 "~" H 5500 3600 60 0000 C CNN 1 5500 3600 0 1 1 0 $EndComp $Comp L LED DMQ2 U 1 1 548EF642 P 5800 3600 F 0 "DMQ2" H 5800 3700 50 0000 C CNN F 1 "LED" H 5800 3500 50 0000 C CNN F 2 "~" H 5800 3600 60 0000 C CNN F 3 "~" H 5800 3600 60 0000 C CNN 1 5800 3600 0 1 1 0 $EndComp $Comp L LED DMQ3 U 1 1 548EF648 P 6100 3600 F 0 "DMQ3" H 6100 3700 50 0000 C CNN F 1 "LED" H 6100 3500 50 0000 C CNN F 2 "~" H 6100 3600 60 0000 C CNN F 3 "~" H 6100 3600 60 0000 C CNN 1 6100 3600 0 1 1 0 $EndComp $Comp L LED DMQ4 U 1 1 548EF64E P 6400 3600 F 0 "DMQ4" H 6400 3700 50 0000 C CNN F 1 "LED" H 6400 3500 50 0000 C CNN F 2 "~" H 6400 3600 60 0000 C CNN F 3 "~" H 6400 3600 60 0000 C CNN 1 6400 3600 0 1 1 0 $EndComp $Comp L LED DMQ5 U 1 1 548EF654 P 6700 3600 F 0 "DMQ5" H 6700 3700 50 0000 C CNN F 1 "LED" H 6700 3500 50 0000 C CNN F 2 "~" H 6700 3600 60 0000 C CNN F 3 "~" H 6700 3600 60 0000 C CNN 1 6700 3600 0 1 1 0 $EndComp $Comp L LED DMQ6 U 1 1 548EF65A P 7000 3600 F 0 "DMQ6" H 7000 3700 50 0000 C CNN F 1 "LED" H 7000 3500 50 0000 C CNN F 2 "~" H 7000 3600 60 0000 C CNN F 3 "~" H 7000 3600 60 0000 C CNN 1 7000 3600 0 1 1 0 $EndComp $Comp L LED DMQ7 U 1 1 548EF660 P 7300 3600 F 0 "DMQ7" H 7300 3700 50 0000 C CNN F 1 "LED" H 7300 3500 50 0000 C CNN F 2 "~" H 7300 3600 60 0000 C CNN F 3 "~" H 7300 3600 60 0000 C CNN 1 7300 3600 0 1 1 0 $EndComp $Comp L LED DMQ8 U 1 1 548EF666 P 7600 3600 F 0 "DMQ8" H 7600 3700 50 0000 C CNN F 1 "LED" H 7600 3500 50 0000 C CNN F 2 "~" H 7600 3600 60 0000 C CNN F 3 "~" H 7600 3600 60 0000 C CNN 1 7600 3600 0 1 1 0 $EndComp $Comp L LED DMQ9 U 1 1 548EF66C P 7900 3600 F 0 "DMQ9" H 7900 3700 50 0000 C CNN F 1 "LED" H 7900 3500 50 0000 C CNN F 2 "~" H 7900 3600 60 0000 C CNN F 3 "~" H 7900 3600 60 0000 C CNN 1 7900 3600 0 1 1 0 $EndComp $Comp L LED DMQ10 U 1 1 548EF672 P 8200 3600 F 0 "DMQ10" H 8200 3700 50 0000 C CNN F 1 "LED" H 8200 3500 50 0000 C CNN F 2 "~" H 8200 3600 60 0000 C CNN F 3 "~" H 8200 3600 60 0000 C CNN 1 8200 3600 0 1 1 0 $EndComp $Comp L LED DMQ11 U 1 1 548EF678 P 8500 3600 F 0 "DMQ11" H 8500 3700 50 0000 C CNN F 1 "LED" H 8500 3500 50 0000 C CNN F 2 "~" H 8500 3600 60 0000 C CNN F 3 "~" H 8500 3600 60 0000 C CNN 1 8500 3600 0 1 1 0 $EndComp $Comp L LED DMQ12 U 1 1 548EF67E P 8800 3600 F 0 "DMQ12" H 8800 3700 50 0000 C CNN F 1 "LED" H 8800 3500 50 0000 C CNN F 2 "~" H 8800 3600 60 0000 C CNN F 3 "~" H 8800 3600 60 0000 C CNN 1 8800 3600 0 1 1 0 $EndComp $Comp L LED DLINK1 U 1 1 548EF686 P 5200 2850 F 0 "DLINK1" H 5200 2950 50 0000 C CNN F 1 "LED" H 5200 2750 50 0000 C CNN F 2 "~" H 5200 2850 60 0000 C CNN F 3 "~" H 5200 2850 60 0000 C CNN 1 5200 2850 0 1 1 0 $EndComp $Comp L LED DSC1 U 1 1 548EF6A1 P 3350 3600 F 0 "DSC1" H 3350 3700 50 0000 C CNN F 1 "LED" H 3350 3500 50 0000 C CNN F 2 "~" H 3350 3600 60 0000 C CNN F 3 "~" H 3350 3600 60 0000 C CNN 1 3350 3600 0 1 1 0 $EndComp $Comp L LED DSC2 U 1 1 548EF6BA P 3650 3600 F 0 "DSC2" H 3650 3700 50 0000 C CNN F 1 "LED" H 3650 3500 50 0000 C CNN F 2 "~" H 3650 3600 60 0000 C CNN F 3 "~" H 3650 3600 60 0000 C CNN 1 3650 3600 0 1 1 0 $EndComp $Comp L LED DSC3 U 1 1 548EF6C0 P 3950 3600 F 0 "DSC3" H 3950 3700 50 0000 C CNN F 1 "LED" H 3950 3500 50 0000 C CNN F 2 "~" H 3950 3600 60 0000 C CNN F 3 "~" H 3950 3600 60 0000 C CNN 1 3950 3600 0 1 1 0 $EndComp $Comp L LED DSC4 U 1 1 548EF6C6 P 4250 3600 F 0 "DSC4" H 4250 3700 50 0000 C CNN F 1 "LED" H 4250 3500 50 0000 C CNN F 2 "~" H 4250 3600 60 0000 C CNN F 3 "~" H 4250 3600 60 0000 C CNN 1 4250 3600 0 1 1 0 $EndComp $Comp L LED DSC5 U 1 1 548EF6CC P 4550 3600 F 0 "DSC5" H 4550 3700 50 0000 C CNN F 1 "LED" H 4550 3500 50 0000 C CNN F 2 "~" H 4550 3600 60 0000 C CNN F 3 "~" H 4550 3600 60 0000 C CNN 1 4550 3600 0 1 1 0 $EndComp $Comp L LED DDF1 U 1 1 548EF6DA P 3350 900 F 0 "DDF1" H 3350 1000 50 0000 C CNN F 1 "LED" H 3350 800 50 0000 C CNN F 2 "~" H 3350 900 60 0000 C CNN F 3 "~" H 3350 900 60 0000 C CNN 1 3350 900 0 1 1 0 $EndComp $Comp L LED DDF2 U 1 1 548EF6F3 P 3650 900 F 0 "DDF2" H 3650 1000 50 0000 C CNN F 1 "LED" H 3650 800 50 0000 C CNN F 2 "~" H 3650 900 60 0000 C CNN F 3 "~" H 3650 900 60 0000 C CNN 1 3650 900 0 1 1 0 $EndComp $Comp L LED DDF3 U 1 1 548EF6F9 P 3950 900 F 0 "DDF3" H 3950 1000 50 0000 C CNN F 1 "LED" H 3950 800 50 0000 C CNN F 2 "~" H 3950 900 60 0000 C CNN F 3 "~" H 3950 900 60 0000 C CNN 1 3950 900 0 1 1 0 $EndComp $Comp L LED DIF1 U 1 1 548EF701 P 4250 900 F 0 "DIF1" V 4250 1000 50 0000 C CNN F 1 "LED" H 4250 800 50 0000 C CNN F 2 "~" H 4250 900 60 0000 C CNN F 3 "~" H 4250 900 60 0000 C CNN 1 4250 900 0 1 1 0 $EndComp $Comp L LED DIF2 U 1 1 548EF71A P 4550 900 F 0 "DIF2" H 4550 1000 50 0000 C CNN F 1 "LED" H 4550 800 50 0000 C CNN F 2 "~" H 4550 900 60 0000 C CNN F 3 "~" H 4550 900 60 0000 C CNN 1 4550 900 0 1 1 0 $EndComp $Comp L LED DIF3 U 1 1 548EF720 P 4850 900 F 0 "DIF3" H 4850 1000 50 0000 C CNN F 1 "LED" H 4850 800 50 0000 C CNN F 2 "~" H 4850 900 60 0000 C CNN F 3 "~" H 4850 900 60 0000 C CNN 1 4850 900 0 1 1 0 $EndComp $Comp L LED DAND1 U 1 1 548EF728 P 9500 1150 F 0 "DAND1" H 9500 1250 50 0000 C CNN F 1 "LED" H 9500 1050 50 0000 C CNN F 2 "~" H 9500 1150 60 0000 C CNN F 3 "~" H 9500 1150 60 0000 C CNN 1 9500 1150 1 0 0 -1 $EndComp $Comp L LED DTAD1 U 1 1 548EF735 P 9500 1500 F 0 "DTAD1" H 9500 1600 50 0000 C CNN F 1 "LED" H 9500 1400 50 0000 C CNN F 2 "~" H 9500 1500 60 0000 C CNN F 3 "~" H 9500 1500 60 0000 C CNN 1 9500 1500 1 0 0 -1 $EndComp $Comp L LED DISZ1 U 1 1 548EF73B P 9500 1850 F 0 "DISZ1" H 9500 1950 50 0000 C CNN F 1 "LED" H 9500 1750 50 0000 C CNN F 2 "~" H 9500 1850 60 0000 C CNN F 3 "~" H 9500 1850 60 0000 C CNN 1 9500 1850 1 0 0 -1 $EndComp $Comp L LED DDCA1 U 1 1 548EF741 P 9500 2200 F 0 "DDCA1" H 9500 2300 50 0000 C CNN F 1 "LED" H 9500 2100 50 0000 C CNN F 2 "~" H 9500 2200 60 0000 C CNN F 3 "~" H 9500 2200 60 0000 C CNN 1 9500 2200 1 0 0 -1 $EndComp $Comp L LED DJMS1 U 1 1 548EF777 P 9500 2550 F 0 "DJMS1" H 9500 2650 50 0000 C CNN F 1 "LED" H 9500 2450 50 0000 C CNN F 2 "~" H 9500 2550 60 0000 C CNN F 3 "~" H 9500 2550 60 0000 C CNN 1 9500 2550 1 0 0 -1 $EndComp $Comp L LED DJMP1 U 1 1 548EF77D P 9500 2900 F 0 "DJMP1" H 9500 3000 50 0000 C CNN F 1 "LED" H 9500 2800 50 0000 C CNN F 2 "~" H 9500 2900 60 0000 C CNN F 3 "~" H 9500 2900 60 0000 C CNN 1 9500 2900 1 0 0 -1 $EndComp $Comp L LED DIOT1 U 1 1 548EF783 P 9500 3250 F 0 "DIOT1" H 9500 3350 50 0000 C CNN F 1 "LED" H 9500 3150 50 0000 C CNN F 2 "~" H 9500 3250 60 0000 C CNN F 3 "~" H 9500 3250 60 0000 C CNN 1 9500 3250 1 0 0 -1 $EndComp $Comp L LED DOPR1 U 1 1 548EF789 P 9500 3600 F 0 "DOPR1" H 9500 3700 50 0000 C CNN F 1 "LED" H 9500 3500 50 0000 C CNN F 2 "~" H 9500 3600 60 0000 C CNN F 3 "~" H 9500 3600 60 0000 C CNN 1 9500 3600 1 0 0 -1 $EndComp $Comp L LED DFETCH1 U 1 1 548EF7CB P 10150 1150 F 0 "DFETCH1" H 10150 1250 50 0000 C CNN F 1 "LED" H 10150 1050 50 0000 C CNN F 2 "~" H 10150 1150 60 0000 C CNN F 3 "~" H 10150 1150 60 0000 C CNN 1 10150 1150 1 0 0 -1 $EndComp $Comp L LED DEXEC1 U 1 1 548EF7D1 P 10150 1500 F 0 "DEXEC1" H 10150 1600 50 0000 C CNN F 1 "LED" H 10150 1400 50 0000 C CNN F 2 "~" H 10150 1500 60 0000 C CNN F 3 "~" H 10150 1500 60 0000 C CNN 1 10150 1500 1 0 0 -1 $EndComp $Comp L LED DDEFER1 U 1 1 548EF7D7 P 10150 1850 F 0 "DDEFER1" H 10150 1950 50 0000 C CNN F 1 "LED" H 10150 1750 50 0000 C CNN F 2 "~" H 10150 1850 60 0000 C CNN F 3 "~" H 10150 1850 60 0000 C CNN 1 10150 1850 1 0 0 -1 $EndComp $Comp L LED DWRDCT1 U 1 1 548EF7DD P 10150 2200 F 0 "DWRDCT1" H 10150 2300 50 0000 C CNN F 1 "LED" H 10150 2100 50 0000 C CNN F 2 "~" H 10150 2200 60 0000 C CNN F 3 "~" H 10150 2200 60 0000 C CNN 1 10150 2200 1 0 0 -1 $EndComp $Comp L LED DCURAD1 U 1 1 548EF7E3 P 10150 2900 F 0 "DCURAD1" H 10150 3000 50 0000 C CNN F 1 "LED" H 10150 2800 50 0000 C CNN F 2 "~" H 10150 2900 60 0000 C CNN F 3 "~" H 10150 2900 60 0000 C CNN 1 10150 2900 1 0 0 -1 $EndComp $Comp L LED DBREAK1 U 1 1 548EF7E9 P 10150 3250 F 0 "DBREAK1" H 10150 3350 50 0000 C CNN F 1 "LED" H 10150 3150 50 0000 C CNN F 2 "~" H 10150 3250 60 0000 C CNN F 3 "~" H 10150 3250 60 0000 C CNN 1 10150 3250 1 0 0 -1 $EndComp $Comp L LED DION1 U 1 1 548EF837 P 10800 1150 F 0 "DION1" H 10800 1250 50 0000 C CNN F 1 "LED" H 10800 1050 50 0000 C CNN F 2 "~" H 10800 1150 60 0000 C CNN F 3 "~" H 10800 1150 60 0000 C CNN 1 10800 1150 1 0 0 -1 $EndComp $Comp L LED DPAUSE1 U 1 1 548EF83D P 10800 1500 F 0 "DPAUSE1" H 10800 1600 50 0000 C CNN F 1 "LED" H 10800 1400 50 0000 C CNN F 2 "~" H 10800 1500 60 0000 C CNN F 3 "~" H 10800 1500 60 0000 C CNN 1 10800 1500 1 0 0 -1 $EndComp $Comp L LED DRUN1 U 1 1 548EF843 P 10800 1850 F 0 "DRUN1" H 10800 1950 50 0000 C CNN F 1 "LED" H 10800 1750 50 0000 C CNN F 2 "~" H 10800 1850 60 0000 C CNN F 3 "~" H 10800 1850 60 0000 C CNN 1 10800 1850 1 0 0 -1 $EndComp $Comp L SWITCH_INV SW19 U 1 1 548EF86F P 7400 4800 F 0 "SW19" H 7200 4950 50 0000 C CNN F 1 "START" H 7250 4650 50 0000 C CNN F 2 "~" H 7400 4800 60 0000 C CNN F 3 "~" H 7400 4800 60 0000 C CNN 1 7400 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW20 U 1 1 548EF87C P 7900 4800 F 0 "SW20" H 7700 4950 50 0000 C CNN F 1 "LOAD_ADD" H 7750 4650 50 0000 C CNN F 2 "~" H 7900 4800 60 0000 C CNN F 3 "~" H 7900 4800 60 0000 C CNN 1 7900 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW21 U 1 1 548EF882 P 8400 4800 F 0 "SW21" H 8200 4950 50 0000 C CNN F 1 "DEP" H 8250 4650 50 0000 C CNN F 2 "~" H 8400 4800 60 0000 C CNN F 3 "~" H 8400 4800 60 0000 C CNN 1 8400 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW22 U 1 1 548EF888 P 8900 4800 F 0 "SW22" H 8700 4950 50 0000 C CNN F 1 "EXAM" H 8750 4650 50 0000 C CNN F 2 "~" H 8900 4800 60 0000 C CNN F 3 "~" H 8900 4800 60 0000 C CNN 1 8900 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW23 U 1 1 548EF88E P 9400 4800 F 0 "SW23" H 9200 4950 50 0000 C CNN F 1 "CONT" H 9250 4650 50 0000 C CNN F 2 "~" H 9400 4800 60 0000 C CNN F 3 "~" H 9400 4800 60 0000 C CNN 1 9400 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW24 U 1 1 548EF894 P 9900 4800 F 0 "SW24" H 9700 4950 50 0000 C CNN F 1 "STOP" H 9750 4650 50 0000 C CNN F 2 "~" H 9900 4800 60 0000 C CNN F 3 "~" H 9900 4800 60 0000 C CNN 1 9900 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW25 U 1 1 548EF89A P 10400 4800 F 0 "SW25" H 10200 4950 50 0000 C CNN F 1 "SING_STEP" H 10250 4650 50 0000 C CNN F 2 "~" H 10400 4800 60 0000 C CNN F 3 "~" H 10400 4800 60 0000 C CNN 1 10400 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW26 U 1 1 548EF8A0 P 10900 4800 F 0 "SW26" H 10700 4950 50 0000 C CNN F 1 "SING_INST" H 10750 4650 50 0000 C CNN F 2 "~" H 10900 4800 60 0000 C CNN F 3 "~" H 10900 4800 60 0000 C CNN 1 10900 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW7 U 1 1 548EFAF8 P 5050 6300 F 0 "SW7" H 4850 6450 50 0000 C CNN F 1 "SR1" H 4900 6150 50 0000 C CNN F 2 "~" H 5050 6300 60 0000 C CNN F 3 "~" H 5050 6300 60 0000 C CNN 1 5050 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW8 U 1 1 548EFB27 P 5500 6300 F 0 "SW8" H 5300 6450 50 0000 C CNN F 1 "SR2" H 5350 6150 50 0000 C CNN F 2 "~" H 5500 6300 60 0000 C CNN F 3 "~" H 5500 6300 60 0000 C CNN 1 5500 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW9 U 1 1 548EFB2D P 5950 6300 F 0 "SW9" H 5750 6450 50 0000 C CNN F 1 "SR3" H 5800 6150 50 0000 C CNN F 2 "~" H 5950 6300 60 0000 C CNN F 3 "~" H 5950 6300 60 0000 C CNN 1 5950 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW10 U 1 1 548EFB33 P 6400 6300 F 0 "SW10" H 6200 6450 50 0000 C CNN F 1 "SR4" H 6250 6150 50 0000 C CNN F 2 "~" H 6400 6300 60 0000 C CNN F 3 "~" H 6400 6300 60 0000 C CNN 1 6400 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW11 U 1 1 548EFB42 P 6900 6300 F 0 "SW11" H 6700 6450 50 0000 C CNN F 1 "SR5" H 6750 6150 50 0000 C CNN F 2 "~" H 6900 6300 60 0000 C CNN F 3 "~" H 6900 6300 60 0000 C CNN 1 6900 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW12 U 1 1 548EFB48 P 7350 6300 F 0 "SW12" H 7150 6450 50 0000 C CNN F 1 "SR6" H 7200 6150 50 0000 C CNN F 2 "~" H 7350 6300 60 0000 C CNN F 3 "~" H 7350 6300 60 0000 C CNN 1 7350 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW13 U 1 1 548EFB4E P 7800 6300 F 0 "SW13" H 7600 6450 50 0000 C CNN F 1 "SR7" H 7650 6150 50 0000 C CNN F 2 "~" H 7800 6300 60 0000 C CNN F 3 "~" H 7800 6300 60 0000 C CNN 1 7800 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW14 U 1 1 548EFB54 P 8250 6300 F 0 "SW14" H 8050 6450 50 0000 C CNN F 1 "SR8" H 8100 6150 50 0000 C CNN F 2 "~" H 8250 6300 60 0000 C CNN F 3 "~" H 8250 6300 60 0000 C CNN 1 8250 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW15 U 1 1 548EFB5A P 8750 6300 F 0 "SW15" H 8550 6450 50 0000 C CNN F 1 "SR9" H 8600 6150 50 0000 C CNN F 2 "~" H 8750 6300 60 0000 C CNN F 3 "~" H 8750 6300 60 0000 C CNN 1 8750 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW16 U 1 1 548EFB60 P 9200 6300 F 0 "SW16" H 9000 6450 50 0000 C CNN F 1 "SR10" H 9050 6150 50 0000 C CNN F 2 "~" H 9200 6300 60 0000 C CNN F 3 "~" H 9200 6300 60 0000 C CNN 1 9200 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW17 U 1 1 548EFB66 P 9650 6300 F 0 "SW17" H 9450 6450 50 0000 C CNN F 1 "SR11" H 9500 6150 50 0000 C CNN F 2 "~" H 9650 6300 60 0000 C CNN F 3 "~" H 9650 6300 60 0000 C CNN 1 9650 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW18 U 1 1 548EFB6C P 10100 6300 F 0 "SW18" H 9900 6450 50 0000 C CNN F 1 "SR12" H 9950 6150 50 0000 C CNN F 2 "~" H 10100 6300 60 0000 C CNN F 3 "~" H 10100 6300 60 0000 C CNN 1 10100 6300 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW1 U 1 1 548EFBFD P 3900 4800 F 0 "SW1" H 3700 4950 50 0000 C CNN F 1 "DF1" H 3750 4650 50 0000 C CNN F 2 "~" H 3900 4800 60 0000 C CNN F 3 "~" H 3900 4800 60 0000 C CNN 1 3900 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW2 U 1 1 548EFC03 P 4350 4800 F 0 "SW2" H 4150 4950 50 0000 C CNN F 1 "DF2" H 4200 4650 50 0000 C CNN F 2 "~" H 4350 4800 60 0000 C CNN F 3 "~" H 4350 4800 60 0000 C CNN 1 4350 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW3 U 1 1 548EFC09 P 4800 4800 F 0 "SW3" H 4600 4950 50 0000 C CNN F 1 "DF3" H 4650 4650 50 0000 C CNN F 2 "~" H 4800 4800 60 0000 C CNN F 3 "~" H 4800 4800 60 0000 C CNN 1 4800 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW4 U 1 1 548EFC0F P 5250 4800 F 0 "SW4" H 5050 4950 50 0000 C CNN F 1 "IF1" H 5100 4650 50 0000 C CNN F 2 "~" H 5250 4800 60 0000 C CNN F 3 "~" H 5250 4800 60 0000 C CNN 1 5250 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW5 U 1 1 548EFC15 P 5750 4800 F 0 "SW5" H 5550 4950 50 0000 C CNN F 1 "IF2" H 5600 4650 50 0000 C CNN F 2 "~" H 5750 4800 60 0000 C CNN F 3 "~" H 5750 4800 60 0000 C CNN 1 5750 4800 0 -1 -1 0 $EndComp $Comp L SWITCH_INV SW6 U 1 1 548EFC1B P 6200 4800 F 0 "SW6" H 6000 4950 50 0000 C CNN F 1 "IF3" H 6050 4650 50 0000 C CNN F 2 "~" H 6200 4800 60 0000 C CNN F 3 "~" H 6200 4800 60 0000 C CNN 1 6200 4800 0 -1 -1 0 $EndComp $Comp L RASPI_MODEL_B_PLUS_GPIO P1 U 1 1 548F13F7 P 1850 2150 F 0 "P1" H 1850 3200 60 0000 C CNN F 1 "RASPI_MODEL_B_PLUS_GPIO" V 1850 2150 20 0000 C CNN F 2 "~" H 1850 2150 60 0000 C CNN F 3 "~" H 1850 2150 60 0000 C CNN 1 1850 2150 1 0 0 -1 $EndComp Text GLabel 4700 1600 2 60 Input ~ 0 led1 Text GLabel 4700 1700 2 60 Input ~ 0 led2 Text GLabel 4700 1800 2 60 Input ~ 0 led3 Text GLabel 4700 1900 2 60 Input ~ 0 led4 Text GLabel 4700 2000 2 60 Input ~ 0 led5 Text GLabel 4700 2100 2 60 Input ~ 0 led6 Text GLabel 4700 2200 2 60 Input ~ 0 led7 Text GLabel 4700 2300 2 60 Input ~ 0 led8 Text GLabel 800 1300 0 60 Input ~ 0 sda Text GLabel 800 1400 0 60 Input ~ 0 scl Text GLabel 800 1500 0 60 Input ~ 0 col3 Text GLabel 800 2600 0 60 Input ~ 0 col4 Text GLabel 800 2700 0 60 Input ~ 0 col5 Text GLabel 2900 2400 2 60 Input ~ 0 col6 Text GLabel 2900 2300 2 60 Input ~ 0 col7 Text GLabel 800 2200 0 60 Input ~ 0 col8 Text GLabel 800 2100 0 60 Input ~ 0 col9 Text GLabel 800 2300 0 60 Input ~ 0 col10 Text GLabel 2900 2700 2 60 Input ~ 0 col11 Text GLabel 800 2800 0 60 Input ~ 0 col12 Text GLabel 2900 2900 2 60 Input ~ 0 row1 Text GLabel 800 1700 0 60 Input ~ 0 row2 Text GLabel 2900 1700 2 60 Input ~ 0 row3 Text Notes 650 800 0 31 ~ 0 Driving LEDs: a matrix of LED8 X COL12\nSensing switches: a matrix of ROW3 X COL12 Text GLabel 8900 700 2 60 Input ~ 0 led1 Text GLabel 8900 1750 2 60 Input ~ 0 led2 Text GLabel 8900 2000 2 60 Input ~ 0 led3 Text GLabel 8900 3050 2 60 Input ~ 0 led4 Text GLabel 8900 3400 2 60 Input ~ 0 led5 Text GLabel 3300 1150 0 60 Input ~ 0 col1 Text GLabel 3600 1300 0 60 Input ~ 0 col2 Text GLabel 3900 1150 0 60 Input ~ 0 col3 Text GLabel 4200 1300 0 60 Input ~ 0 col4 Text GLabel 4500 1150 0 60 Input ~ 0 col5 Text GLabel 4800 1300 0 60 Input ~ 0 col6 Text GLabel 7250 1150 0 60 Input ~ 0 col7 Text GLabel 7550 1300 0 60 Input ~ 0 col8 Text GLabel 7850 1150 0 60 Input ~ 0 col9 Text GLabel 8150 1300 0 60 Input ~ 0 col10 Text GLabel 8450 1150 0 60 Input ~ 0 col11 Text GLabel 8750 1300 0 60 Input ~ 0 col12 Text GLabel 5450 3850 0 60 Input ~ 0 col1 Text GLabel 5750 4000 0 60 Input ~ 0 col2 Text GLabel 6050 3850 0 60 Input ~ 0 col3 Text GLabel 6350 4000 0 60 Input ~ 0 col4 Text GLabel 6650 3850 0 60 Input ~ 0 col5 Text GLabel 3300 4000 0 60 Input ~ 0 col6 Text GLabel 3600 3850 0 60 Input ~ 0 col7 Text GLabel 3900 4000 0 60 Input ~ 0 col8 Text GLabel 4200 3850 0 60 Input ~ 0 col9 Text GLabel 4500 4000 0 60 Input ~ 0 col10 Text GLabel 8450 3850 0 60 Input ~ 0 col11 Text GLabel 8750 4000 0 60 Input ~ 0 col12 Text GLabel 9300 1050 1 60 Input ~ 0 led6 Text GLabel 9750 1150 1 60 Input ~ 0 col1 Text GLabel 9750 1500 1 60 Input ~ 0 col2 Text GLabel 9750 1850 1 60 Input ~ 0 col3 Text GLabel 9750 2200 1 60 Input ~ 0 col4 Text GLabel 9750 2550 1 60 Input ~ 0 col5 Text GLabel 9750 2900 1 60 Input ~ 0 col6 Text GLabel 9750 3250 1 60 Input ~ 0 col7 Text GLabel 9750 3600 1 60 Input ~ 0 col8 Text GLabel 9950 1050 1 60 Input ~ 0 led6 Text GLabel 10400 1150 1 60 Input ~ 0 col9 Text GLabel 10400 1500 1 60 Input ~ 0 col10 Text GLabel 10400 1850 1 60 Input ~ 0 col11 Text GLabel 10400 2200 1 60 Input ~ 0 col12 Text GLabel 9950 2750 1 60 Input ~ 0 led7 Text GLabel 10400 2900 1 60 Input ~ 0 col1 Text GLabel 10400 3250 1 60 Input ~ 0 col2 Text GLabel 10600 1050 1 60 Input ~ 0 led7 Text GLabel 11050 1150 1 60 Input ~ 0 col3 Text GLabel 11050 1500 1 60 Input ~ 0 col4 Text GLabel 11050 1850 1 60 Input ~ 0 col5 Text GLabel 4600 3400 2 60 Input ~ 0 led7 Text GLabel 3300 700 0 60 Input ~ 0 led8 Text GLabel 5150 2650 0 60 Input ~ 0 led8 Text GLabel 5150 3050 0 60 Input ~ 0 col7 Text GLabel 5450 1150 0 60 Input ~ 0 col1 Text GLabel 5750 1300 0 60 Input ~ 0 col2 Text GLabel 6050 1150 0 60 Input ~ 0 col3 Text GLabel 6350 1300 0 60 Input ~ 0 col4 Text GLabel 6650 1150 0 60 Input ~ 0 col5 Text GLabel 6950 1300 0 60 Input ~ 0 col6 Text GLabel 7250 2450 0 60 Input ~ 0 col7 Text GLabel 7550 2600 0 60 Input ~ 0 col8 Text GLabel 7850 2450 0 60 Input ~ 0 col9 Text GLabel 8150 2600 0 60 Input ~ 0 col10 Text GLabel 8450 2450 0 60 Input ~ 0 col11 Text GLabel 8750 2600 0 60 Input ~ 0 col12 Text GLabel 6950 2600 0 60 Input ~ 0 col6 Text GLabel 5450 2450 0 60 Input ~ 0 col1 Text GLabel 5750 2600 0 60 Input ~ 0 col2 Text GLabel 6050 2450 0 60 Input ~ 0 col3 Text GLabel 6350 2600 0 60 Input ~ 0 col4 Text GLabel 6650 2450 0 60 Input ~ 0 col5 Text GLabel 7250 3850 0 60 Input ~ 0 col7 Text GLabel 7550 4000 0 60 Input ~ 0 col8 Text GLabel 7850 3850 0 60 Input ~ 0 col9 Text GLabel 8150 4000 0 60 Input ~ 0 col10 Text GLabel 6950 4000 0 60 Input ~ 0 col6 Text GLabel 4900 5750 0 60 Input ~ 0 row1 Text GLabel 4650 7050 2 60 Input ~ 0 col1 Text GLabel 5100 7050 2 60 Input ~ 0 col2 Text GLabel 5550 7050 2 60 Input ~ 0 col3 Text GLabel 6000 7050 2 60 Input ~ 0 col4 Text GLabel 6500 7050 2 60 Input ~ 0 col5 Text GLabel 9250 7050 2 60 Input ~ 0 col11 Text GLabel 9700 7050 2 60 Input ~ 0 col12 Text GLabel 7400 7050 2 60 Input ~ 0 col7 Text GLabel 7850 7050 2 60 Input ~ 0 col8 Text GLabel 8350 7050 2 60 Input ~ 0 col9 Text GLabel 8800 7050 2 60 Input ~ 0 col10 Text GLabel 6950 7050 2 60 Input ~ 0 col6 Text GLabel 3500 5550 2 60 Input ~ 0 col1 Text GLabel 3950 5550 2 60 Input ~ 0 col2 Text GLabel 4400 5550 2 60 Input ~ 0 col3 Text GLabel 4850 5550 2 60 Input ~ 0 col4 Text GLabel 5350 5550 2 60 Input ~ 0 col5 Text GLabel 5800 5550 2 60 Input ~ 0 col6 Text GLabel 3750 4250 0 60 Input ~ 0 row2 Text GLabel 7250 4250 0 60 Input ~ 0 row3 Text GLabel 7000 5550 2 60 Input ~ 0 col1 Text GLabel 7500 5550 2 60 Input ~ 0 col2 Text GLabel 8000 5550 2 60 Input ~ 0 col3 Text GLabel 8500 5550 2 60 Input ~ 0 col4 Text GLabel 9000 5550 2 60 Input ~ 0 col5 Text GLabel 9500 5550 2 60 Input ~ 0 col6 Text GLabel 10000 5550 2 60 Input ~ 0 col7 Text GLabel 10500 5550 2 60 Input ~ 0 col8 $Comp L DIODE D1 U 1 1 54904DF0 P 3700 5350 F 0 "D1" H 3700 5450 40 0000 C CNN F 1 "1N4148" H 3700 5250 40 0000 C CNN F 2 "~" H 3700 5350 60 0000 C CNN F 3 "~" H 3700 5350 60 0000 C CNN 1 3700 5350 1 0 0 -1 $EndComp $Comp L DIODE D2 U 1 1 5490504C P 4150 5350 F 0 "D2" H 4150 5450 40 0000 C CNN F 1 "1N4148" H 4150 5250 40 0000 C CNN F 2 "~" H 4150 5350 60 0000 C CNN F 3 "~" H 4150 5350 60 0000 C CNN 1 4150 5350 1 0 0 -1 $EndComp $Comp L DIODE D3 U 1 1 54905056 P 4600 5350 F 0 "D3" H 4600 5450 40 0000 C CNN F 1 "1N4148" H 4600 5250 40 0000 C CNN F 2 "~" H 4600 5350 60 0000 C CNN F 3 "~" H 4600 5350 60 0000 C CNN 1 4600 5350 1 0 0 -1 $EndComp $Comp L DIODE D4 U 1 1 5490505E P 5050 5350 F 0 "D4" H 5050 5450 40 0000 C CNN F 1 "1N4148" H 5050 5250 40 0000 C CNN F 2 "~" H 5050 5350 60 0000 C CNN F 3 "~" H 5050 5350 60 0000 C CNN 1 5050 5350 1 0 0 -1 $EndComp $Comp L DIODE D5 U 1 1 54905068 P 5550 5350 F 0 "D5" H 5550 5450 40 0000 C CNN F 1 "1N4148" H 5550 5250 40 0000 C CNN F 2 "~" H 5550 5350 60 0000 C CNN F 3 "~" H 5550 5350 60 0000 C CNN 1 5550 5350 1 0 0 -1 $EndComp $Comp L DIODE D6 U 1 1 5490506E P 6000 5350 F 0 "D6" H 6000 5450 40 0000 C CNN F 1 "1N4148" H 6000 5250 40 0000 C CNN F 2 "~" H 6000 5350 60 0000 C CNN F 3 "~" H 6000 5350 60 0000 C CNN 1 6000 5350 1 0 0 -1 $EndComp $Comp L DIODE D7 U 1 1 549055F9 P 4850 6850 F 0 "D7" H 4850 6950 40 0000 C CNN F 1 "1N4148" H 4850 6750 40 0000 C CNN F 2 "~" H 4850 6850 60 0000 C CNN F 3 "~" H 4850 6850 60 0000 C CNN 1 4850 6850 1 0 0 -1 $EndComp $Comp L DIODE D8 U 1 1 549055FF P 5300 6850 F 0 "D8" H 5300 6950 40 0000 C CNN F 1 "1N4148" H 5300 6750 40 0000 C CNN F 2 "~" H 5300 6850 60 0000 C CNN F 3 "~" H 5300 6850 60 0000 C CNN 1 5300 6850 1 0 0 -1 $EndComp $Comp L DIODE D9 U 1 1 54905605 P 5750 6850 F 0 "D9" H 5750 6950 40 0000 C CNN F 1 "1N4148" H 5750 6750 40 0000 C CNN F 2 "~" H 5750 6850 60 0000 C CNN F 3 "~" H 5750 6850 60 0000 C CNN 1 5750 6850 1 0 0 -1 $EndComp $Comp L DIODE D10 U 1 1 5490560B P 6200 6850 F 0 "D10" H 6200 6950 40 0000 C CNN F 1 "1N4148" H 6200 6750 40 0000 C CNN F 2 "~" H 6200 6850 60 0000 C CNN F 3 "~" H 6200 6850 60 0000 C CNN 1 6200 6850 1 0 0 -1 $EndComp $Comp L DIODE D11 U 1 1 54905611 P 6700 6850 F 0 "D11" H 6700 6950 40 0000 C CNN F 1 "1N4148" H 6700 6750 40 0000 C CNN F 2 "~" H 6700 6850 60 0000 C CNN F 3 "~" H 6700 6850 60 0000 C CNN 1 6700 6850 1 0 0 -1 $EndComp $Comp L DIODE D12 U 1 1 54905640 P 7150 6850 F 0 "D12" H 7150 6950 40 0000 C CNN F 1 "1N4148" H 7150 6750 40 0000 C CNN F 2 "~" H 7150 6850 60 0000 C CNN F 3 "~" H 7150 6850 60 0000 C CNN 1 7150 6850 1 0 0 -1 $EndComp $Comp L DIODE D13 U 1 1 54905646 P 7600 6850 F 0 "D13" H 7600 6950 40 0000 C CNN F 1 "1N4148" H 7600 6750 40 0000 C CNN F 2 "~" H 7600 6850 60 0000 C CNN F 3 "~" H 7600 6850 60 0000 C CNN 1 7600 6850 1 0 0 -1 $EndComp $Comp L DIODE D14 U 1 1 5490564C P 8050 6850 F 0 "D14" H 8050 6950 40 0000 C CNN F 1 "1N4148" H 8050 6750 40 0000 C CNN F 2 "~" H 8050 6850 60 0000 C CNN F 3 "~" H 8050 6850 60 0000 C CNN 1 8050 6850 1 0 0 -1 $EndComp $Comp L DIODE D15 U 1 1 54905652 P 8550 6850 F 0 "D15" H 8550 6950 40 0000 C CNN F 1 "1N4148" H 8550 6750 40 0000 C CNN F 2 "~" H 8550 6850 60 0000 C CNN F 3 "~" H 8550 6850 60 0000 C CNN 1 8550 6850 1 0 0 -1 $EndComp $Comp L DIODE D16 U 1 1 54905658 P 9000 6850 F 0 "D16" H 9000 6950 40 0000 C CNN F 1 "1N4148" H 9000 6750 40 0000 C CNN F 2 "~" H 9000 6850 60 0000 C CNN F 3 "~" H 9000 6850 60 0000 C CNN 1 9000 6850 1 0 0 -1 $EndComp $Comp L DIODE D17 U 1 1 5490565E P 9450 6850 F 0 "D17" H 9450 6950 40 0000 C CNN F 1 "1N4148" H 9450 6750 40 0000 C CNN F 2 "~" H 9450 6850 60 0000 C CNN F 3 "~" H 9450 6850 60 0000 C CNN 1 9450 6850 1 0 0 -1 $EndComp $Comp L DIODE D18 U 1 1 54905664 P 9900 6850 F 0 "D18" H 9900 6950 40 0000 C CNN F 1 "1N4148" H 9900 6750 40 0000 C CNN F 2 "~" H 9900 6850 60 0000 C CNN F 3 "~" H 9900 6850 60 0000 C CNN 1 9900 6850 1 0 0 -1 $EndComp $Comp L DIODE D19 U 1 1 549070C3 P 7200 5350 F 0 "D19" H 7200 5450 40 0000 C CNN F 1 "1N4148" H 7200 5250 40 0000 C CNN F 2 "~" H 7200 5350 60 0000 C CNN F 3 "~" H 7200 5350 60 0000 C CNN 1 7200 5350 1 0 0 -1 $EndComp $Comp L DIODE D20 U 1 1 549070C9 P 7700 5350 F 0 "D20" H 7700 5450 40 0000 C CNN F 1 "1N4148" H 7700 5250 40 0000 C CNN F 2 "~" H 7700 5350 60 0000 C CNN F 3 "~" H 7700 5350 60 0000 C CNN 1 7700 5350 1 0 0 -1 $EndComp $Comp L DIODE D21 U 1 1 549070CF P 8200 5350 F 0 "D21" H 8200 5450 40 0000 C CNN F 1 "1N4148" H 8200 5250 40 0000 C CNN F 2 "~" H 8200 5350 60 0000 C CNN F 3 "~" H 8200 5350 60 0000 C CNN 1 8200 5350 1 0 0 -1 $EndComp $Comp L DIODE D22 U 1 1 549070D5 P 8700 5350 F 0 "D22" H 8700 5450 40 0000 C CNN F 1 "1N4148" H 8700 5250 40 0000 C CNN F 2 "~" H 8700 5350 60 0000 C CNN F 3 "~" H 8700 5350 60 0000 C CNN 1 8700 5350 1 0 0 -1 $EndComp $Comp L DIODE D23 U 1 1 549070DB P 9200 5350 F 0 "D23" H 9200 5450 40 0000 C CNN F 1 "1N4148" H 9200 5250 40 0000 C CNN F 2 "~" H 9200 5350 60 0000 C CNN F 3 "~" H 9200 5350 60 0000 C CNN 1 9200 5350 1 0 0 -1 $EndComp $Comp L DIODE D24 U 1 1 549070E1 P 9700 5350 F 0 "D24" H 9700 5450 40 0000 C CNN F 1 "1N4148" H 9700 5250 40 0000 C CNN F 2 "~" H 9700 5350 60 0000 C CNN F 3 "~" H 9700 5350 60 0000 C CNN 1 9700 5350 1 0 0 -1 $EndComp $Comp L DIODE D25 U 1 1 549070E7 P 10200 5350 F 0 "D25" H 10200 5450 40 0000 C CNN F 1 "1N4148" H 10200 5250 40 0000 C CNN F 2 "~" H 10200 5350 60 0000 C CNN F 3 "~" H 10200 5350 60 0000 C CNN 1 10200 5350 1 0 0 -1 $EndComp $Comp L DIODE D26 U 1 1 549070ED P 10700 5350 F 0 "D26" H 10700 5450 40 0000 C CNN F 1 "1N4148" H 10700 5250 40 0000 C CNN F 2 "~" H 10700 5350 60 0000 C CNN F 3 "~" H 10700 5350 60 0000 C CNN 1 10700 5350 1 0 0 -1 $EndComp $Comp L R R1 U 1 1 5490833D P 2600 1500 F 0 "R1" V 2680 1500 40 0000 C CNN F 1 "390" V 2607 1501 40 0000 C CNN F 2 "~" V 2530 1500 30 0000 C CNN F 3 "~" H 2600 1500 30 0000 C CNN 1 2600 1500 0 -1 -1 0 $EndComp $Comp L R R2 U 1 1 5490834A P 2600 1600 F 0 "R2" V 2680 1600 40 0000 C CNN F 1 "390" V 2607 1601 40 0000 C CNN F 2 "~" V 2530 1600 30 0000 C CNN F 3 "~" H 2600 1600 30 0000 C CNN 1 2600 1600 0 -1 -1 0 $EndComp $Comp L R R3 U 1 1 54908350 P 1100 1500 F 0 "R3" V 1180 1500 40 0000 C CNN F 1 "390" V 1107 1501 40 0000 C CNN F 2 "~" V 1030 1500 30 0000 C CNN F 3 "~" H 1100 1500 30 0000 C CNN 1 1100 1500 0 -1 -1 0 $EndComp $Comp L R R4 U 1 1 54908356 P 1100 2600 F 0 "R4" V 1180 2600 40 0000 C CNN F 1 "390" V 1107 2601 40 0000 C CNN F 2 "~" V 1030 2600 30 0000 C CNN F 3 "~" H 1100 2600 30 0000 C CNN 1 1100 2600 0 -1 -1 0 $EndComp $Comp L R R5 U 1 1 5490835C P 1100 2700 F 0 "R5" V 1180 2700 40 0000 C CNN F 1 "390" V 1107 2701 40 0000 C CNN F 2 "~" V 1030 2700 30 0000 C CNN F 3 "~" H 1100 2700 30 0000 C CNN 1 1100 2700 0 -1 -1 0 $EndComp $Comp L R R6 U 1 1 54908362 P 2600 2400 F 0 "R6" V 2680 2400 40 0000 C CNN F 1 "390" V 2607 2401 40 0000 C CNN F 2 "~" V 2530 2400 30 0000 C CNN F 3 "~" H 2600 2400 30 0000 C CNN 1 2600 2400 0 1 1 0 $EndComp $Comp L R R7 U 1 1 54908368 P 2600 2300 F 0 "R7" V 2680 2300 40 0000 C CNN F 1 "390" V 2607 2301 40 0000 C CNN F 2 "~" V 2530 2300 30 0000 C CNN F 3 "~" H 2600 2300 30 0000 C CNN 1 2600 2300 0 -1 -1 0 $EndComp $Comp L R R8 U 1 1 5490836E P 1100 2200 F 0 "R8" V 1180 2200 40 0000 C CNN F 1 "390" V 1107 2201 40 0000 C CNN F 2 "~" V 1030 2200 30 0000 C CNN F 3 "~" H 1100 2200 30 0000 C CNN 1 1100 2200 0 1 1 0 $EndComp $Comp L R R9 U 1 1 54908374 P 1100 2100 F 0 "R9" V 1180 2100 40 0000 C CNN F 1 "390" V 1107 2101 40 0000 C CNN F 2 "~" V 1030 2100 30 0000 C CNN F 3 "~" H 1100 2100 30 0000 C CNN 1 1100 2100 0 1 1 0 $EndComp $Comp L R R10 U 1 1 5490837A P 1100 2300 F 0 "R10" V 1180 2300 40 0000 C CNN F 1 "390" V 1107 2301 40 0000 C CNN F 2 "~" V 1030 2300 30 0000 C CNN F 3 "~" H 1100 2300 30 0000 C CNN 1 1100 2300 0 1 1 0 $EndComp $Comp L R R11 U 1 1 54908380 P 2600 2700 F 0 "R11" V 2680 2700 40 0000 C CNN F 1 "390" V 2607 2701 40 0000 C CNN F 2 "~" V 2530 2700 30 0000 C CNN F 3 "~" H 2600 2700 30 0000 C CNN 1 2600 2700 0 -1 -1 0 $EndComp $Comp L R R12 U 1 1 54908386 P 1100 2800 F 0 "R12" V 1180 2800 40 0000 C CNN F 1 "390" V 1107 2801 40 0000 C CNN F 2 "~" V 1030 2800 30 0000 C CNN F 3 "~" H 1100 2800 30 0000 C CNN 1 1100 2800 0 1 1 0 $EndComp $Comp L R R_ROW1 U 1 1 5490838C P 2600 2900 F 0 "R_ROW1" V 2680 2900 40 0000 C CNN F 1 "1K" V 2607 2901 40 0000 C CNN F 2 "~" V 2530 2900 30 0000 C CNN F 3 "~" H 2600 2900 30 0000 C CNN 1 2600 2900 0 -1 -1 0 $EndComp $Comp L R R_ROW2 U 1 1 5490839E P 1100 1700 F 0 "R_ROW2" V 1180 1700 40 0000 C CNN F 1 "1K" V 1107 1701 40 0000 C CNN F 2 "~" V 1030 1700 30 0000 C CNN F 3 "~" H 1100 1700 30 0000 C CNN 1 1100 1700 0 1 1 0 $EndComp $Comp L R R_ROW3 U 1 1 549083A4 P 2600 1700 F 0 "R_ROW3" V 2680 1700 40 0000 C CNN F 1 "1K" V 2607 1701 40 0000 C CNN F 2 "~" V 2530 1700 30 0000 C CNN F 3 "~" H 2600 1700 30 0000 C CNN 1 2600 1700 0 -1 -1 0 $EndComp $Comp L UDN2981A P2 U 1 1 54B17386 P 4250 2000 F 0 "P2" H 4250 2550 30 0000 C CNN F 1 "UDN2981A" H 4250 1450 30 0000 C CNN F 2 "~" H 4250 2000 60 0000 C CNN F 3 "~" H 4250 2000 60 0000 C CNN 1 4250 2000 1 0 0 -1 $EndComp Text GLabel 3800 1600 0 60 Input ~ 0 xled1 Text GLabel 3800 1700 0 60 Input ~ 0 xled2 Text GLabel 3800 1800 0 60 Input ~ 0 xled3 Text GLabel 3800 1900 0 60 Input ~ 0 xled4 Text GLabel 3800 2000 0 60 Input ~ 0 xled5 Text GLabel 3800 2100 0 60 Input ~ 0 xled6 Text GLabel 3800 2200 0 60 Input ~ 0 xled7 Text GLabel 3800 2300 0 60 Input ~ 0 xled8 Text GLabel 2900 3000 2 60 Input ~ 0 xled1 Text GLabel 2900 3100 2 60 Input ~ 0 xled2 Text GLabel 800 1900 0 60 Input ~ 0 xled3 Text GLabel 2900 1900 2 60 Input ~ 0 xled4 Text GLabel 2900 2000 2 60 Input ~ 0 xled5 Text GLabel 2900 2200 2 60 Input ~ 0 xled6 Text GLabel 800 3000 0 60 Input ~ 0 xled7 Text GLabel 800 1800 0 60 Input ~ 0 xled8 NoConn ~ 2250 2500 NoConn ~ 1450 2500 $Comp L GND #PWR01 U 1 1 54B1913E P 2300 2100 F 0 "#PWR01" H 2300 2100 30 0001 C CNN F 1 "GND" H 2300 2030 30 0001 C CNN F 2 "" H 2300 2100 60 0000 C CNN F 3 "" H 2300 2100 60 0000 C CNN 1 2300 2100 0 -1 -1 0 $EndComp $Comp L GND #PWR02 U 1 1 54B19156 P 2300 1400 F 0 "#PWR02" H 2300 1400 30 0001 C CNN F 1 "GND" H 2300 1330 30 0001 C CNN F 2 "" H 2300 1400 60 0000 C CNN F 3 "" H 2300 1400 60 0000 C CNN 1 2300 1400 0 -1 -1 0 $EndComp NoConn ~ 2250 2800 $Comp L +3.3V #PWR03 U 1 1 54B1C371 P 1350 1100 F 0 "#PWR03" H 1350 1060 30 0001 C CNN F 1 "+3.3V" H 1350 1210 30 0000 C CNN F 2 "" H 1350 1100 60 0000 C CNN F 3 "" H 1350 1100 60 0000 C CNN 1 1350 1100 1 0 0 -1 $EndComp $Comp L GND #PWR04 U 1 1 54B1C4F8 P 4750 2550 F 0 "#PWR04" H 4750 2550 30 0001 C CNN F 1 "GND" H 4750 2480 30 0001 C CNN F 2 "" H 4750 2550 60 0000 C CNN F 3 "" H 4750 2550 60 0000 C CNN 1 4750 2550 0 -1 -1 0 $EndComp NoConn ~ 4000 4300 NoConn ~ 4450 4300 NoConn ~ 4900 4300 NoConn ~ 5350 4300 NoConn ~ 5850 4300 NoConn ~ 6300 4300 NoConn ~ 7500 4300 NoConn ~ 8000 4300 NoConn ~ 8500 4300 NoConn ~ 9000 4300 NoConn ~ 9500 4300 NoConn ~ 10000 4300 NoConn ~ 10500 4300 NoConn ~ 11000 4300 NoConn ~ 10200 5800 NoConn ~ 9750 5800 NoConn ~ 9300 5800 NoConn ~ 8850 5800 NoConn ~ 8350 5800 NoConn ~ 7900 5800 NoConn ~ 7450 5800 NoConn ~ 7000 5800 NoConn ~ 6500 5800 NoConn ~ 5150 5800 NoConn ~ 5600 5800 NoConn ~ 6050 5800 $Comp L CONN_1 M1 U 1 1 54B1CC4A P 6150 7400 F 0 "M1" H 6230 7400 40 0000 L CNN F 1 "M" H 6150 7455 30 0001 C CNN F 2 "" H 6150 7400 60 0000 C CNN F 3 "" H 6150 7400 60 0000 C CNN 1 6150 7400 0 -1 -1 0 $EndComp $Comp L CONN_1 M2 U 1 1 54B1CC76 P 6250 7400 F 0 "M2" H 6330 7400 40 0000 L CNN F 1 "M" H 6250 7455 30 0001 C CNN F 2 "" H 6250 7400 60 0000 C CNN F 3 "" H 6250 7400 60 0000 C CNN 1 6250 7400 0 -1 -1 0 $EndComp $Comp L CONN_1 M3 U 1 1 54B1CC7C P 6350 7400 F 0 "M3" H 6430 7400 40 0000 L CNN F 1 "M" H 6350 7455 30 0001 C CNN F 2 "" H 6350 7400 60 0000 C CNN F 3 "" H 6350 7400 60 0000 C CNN 1 6350 7400 0 -1 -1 0 $EndComp $Comp L CONN_1 M4 U 1 1 54B1CC82 P 6450 7400 F 0 "M4" H 6530 7400 40 0000 L CNN F 1 "M" H 6450 7455 30 0001 C CNN F 2 "" H 6450 7400 60 0000 C CNN F 3 "" H 6450 7400 60 0000 C CNN 1 6450 7400 0 -1 -1 0 $EndComp NoConn ~ 6150 7550 NoConn ~ 6250 7550 NoConn ~ 6350 7550 NoConn ~ 6450 7550 $Comp L +5V #PWR05 U 1 1 54BCFC39 P 2400 1100 F 0 "#PWR05" H 2400 1190 20 0001 C CNN F 1 "+5V" H 2400 1190 30 0000 C CNN F 2 "" H 2400 1100 60 0000 C CNN F 3 "" H 2400 1100 60 0000 C CNN 1 2400 1100 1 0 0 -1 $EndComp Text GLabel 2900 1500 2 60 Input ~ 0 col1 Text GLabel 2900 1600 2 60 Input ~ 0 col2 NoConn ~ 1450 2400 NoConn ~ 2250 1800 $Comp L CONN_1 M5 U 1 1 54BD36C6 P 6550 7400 F 0 "M5" H 6630 7400 40 0000 L CNN F 1 "M" H 6550 7455 30 0001 C CNN F 2 "" H 6550 7400 60 0000 C CNN F 3 "" H 6550 7400 60 0000 C CNN 1 6550 7400 0 -1 -1 0 $EndComp $Comp L CONN_1 M6 U 1 1 54BD36CC P 6650 7400 F 0 "M6" H 6730 7400 40 0000 L CNN F 1 "M" H 6650 7455 30 0001 C CNN F 2 "" H 6650 7400 60 0000 C CNN F 3 "" H 6650 7400 60 0000 C CNN 1 6650 7400 0 -1 -1 0 $EndComp NoConn ~ 6550 7550 NoConn ~ 6650 7550 $Comp L CONN_1 M7 U 1 1 54BD36D2 P 6750 7400 F 0 "M7" H 6830 7400 40 0000 L CNN F 1 "M" H 6750 7455 30 0001 C CNN F 2 "" H 6750 7400 60 0000 C CNN F 3 "" H 6750 7400 60 0000 C CNN 1 6750 7400 0 -1 -1 0 $EndComp NoConn ~ 6750 7550 $Comp L +5V #PWR06 U 1 1 54BD75EA P 3400 2500 F 0 "#PWR06" H 3400 2590 20 0001 C CNN F 1 "+5V" H 3400 2590 30 0000 C CNN F 2 "" H 3400 2500 60 0000 C CNN F 3 "" H 3400 2500 60 0000 C CNN 1 3400 2500 -1 0 0 1 $EndComp $Comp L DIODE DZ1 U 1 1 54BD85A3 P 3600 2400 F 0 "DZ1" H 3600 2500 40 0000 C CNN F 1 "ZENER" H 3600 2300 40 0000 C CNN F 2 "~" H 3600 2400 60 0000 C CNN F 3 "~" H 3600 2400 60 0000 C CNN 1 3600 2400 1 0 0 -1 $EndComp $Comp L LED DPAUSE2 U 1 1 554E5897 P 10800 2750 F 0 "DPAUSE2" H 10800 2850 50 0000 C CNN F 1 "LED" H 10800 2650 50 0000 C CNN F 2 "~" H 10800 2750 60 0000 C CNN F 3 "~" H 10800 2750 60 0000 C CNN 1 10800 2750 1 0 0 -1 $EndComp $Comp L LED DRUN2 U 1 1 554E589D P 10800 3100 F 0 "DRUN2" H 10800 3200 50 0000 C CNN F 1 "LED" H 10800 3000 50 0000 C CNN F 2 "~" H 10800 3100 60 0000 C CNN F 3 "~" H 10800 3100 60 0000 C CNN 1 10800 3100 1 0 0 -1 $EndComp Text GLabel 10600 2600 1 60 Input ~ 0 led7 Text GLabel 11050 2750 1 60 Input ~ 0 col4 Text GLabel 11050 3100 1 60 Input ~ 0 col5 Text Notes 10550 2250 0 60 ~ 0 LEDs ONLY for\nStraight Eight: Wire Wire Line 9300 1050 9300 3600 Connection ~ 9300 1150 Connection ~ 9300 1500 Connection ~ 9300 1850 Connection ~ 9300 2200 Connection ~ 9300 2550 Connection ~ 9300 2900 Connection ~ 9300 3250 Wire Wire Line 9950 1050 9950 2200 Connection ~ 9950 1150 Connection ~ 9950 1500 Connection ~ 9950 1850 Wire Wire Line 9950 2750 9950 3250 Connection ~ 9950 2900 Wire Wire Line 10600 1050 10600 1850 Connection ~ 10600 1150 Connection ~ 10600 1500 Wire Wire Line 11000 1150 11050 1150 Wire Wire Line 11000 1500 11050 1500 Wire Wire Line 11000 1850 11050 1850 Wire Wire Line 10350 1150 10400 1150 Wire Wire Line 10350 1500 10400 1500 Wire Wire Line 10350 1850 10400 1850 Wire Wire Line 10350 2200 10400 2200 Wire Wire Line 9700 1150 9750 1150 Wire Wire Line 9700 1500 9750 1500 Wire Wire Line 9700 1850 9750 1850 Wire Wire Line 9700 2200 9750 2200 Wire Wire Line 9700 2550 9750 2550 Wire Wire Line 9700 2900 9750 2900 Wire Wire Line 9700 3250 9750 3250 Wire Wire Line 9700 3600 9750 3600 Wire Wire Line 5500 3050 8900 3050 Connection ~ 8800 3050 Connection ~ 8500 3050 Connection ~ 8200 3050 Connection ~ 7900 3050 Connection ~ 7600 3050 Connection ~ 7300 3050 Connection ~ 7000 3050 Connection ~ 6700 3050 Connection ~ 6400 3050 Connection ~ 6100 3050 Connection ~ 5800 3050 Wire Wire Line 5500 2000 8900 2000 Connection ~ 5800 2000 Connection ~ 6100 2000 Connection ~ 6400 2000 Connection ~ 6700 2000 Connection ~ 7000 2000 Connection ~ 7300 2000 Connection ~ 7600 2000 Connection ~ 7900 2000 Connection ~ 8200 2000 Connection ~ 8500 2000 Connection ~ 8800 2000 Wire Wire Line 5500 1750 8900 1750 Connection ~ 8800 1750 Connection ~ 8500 1750 Connection ~ 8200 1750 Connection ~ 7900 1750 Connection ~ 7600 1750 Connection ~ 7300 1750 Connection ~ 7000 1750 Connection ~ 6700 1750 Connection ~ 6400 1750 Connection ~ 6100 1750 Connection ~ 5800 1750 Wire Wire Line 5500 700 8900 700 Connection ~ 5800 700 Connection ~ 6100 700 Connection ~ 6400 700 Connection ~ 6700 700 Connection ~ 7000 700 Connection ~ 7300 700 Connection ~ 7600 700 Connection ~ 7900 700 Connection ~ 8200 700 Connection ~ 8500 700 Connection ~ 8800 700 Wire Wire Line 5500 3400 8900 3400 Connection ~ 8800 3400 Connection ~ 8500 3400 Connection ~ 8200 3400 Connection ~ 7900 3400 Connection ~ 7600 3400 Connection ~ 7300 3400 Connection ~ 7000 3400 Connection ~ 6700 3400 Connection ~ 6400 3400 Connection ~ 6100 3400 Connection ~ 5800 3400 Wire Wire Line 6950 1300 7000 1300 Wire Wire Line 7000 1100 7000 1350 Wire Wire Line 7250 1150 7300 1150 Wire Wire Line 7300 1100 7300 1350 Wire Wire Line 7550 1300 7600 1300 Wire Wire Line 7600 1100 7600 1350 Wire Wire Line 7850 1150 7900 1150 Wire Wire Line 7900 1100 7900 1350 Wire Wire Line 8150 1300 8200 1300 Wire Wire Line 8200 1100 8200 1350 Wire Wire Line 8450 1150 8500 1150 Wire Wire Line 8500 1100 8500 1350 Wire Wire Line 8750 1300 8800 1300 Wire Wire Line 8800 1100 8800 1350 Wire Wire Line 10350 2900 10400 2900 Wire Wire Line 10350 3250 10400 3250 Wire Wire Line 5450 3850 5500 3850 Wire Wire Line 5500 3850 5500 3800 Wire Wire Line 5750 4000 5800 4000 Wire Wire Line 5800 4000 5800 3800 Wire Wire Line 6050 3850 6100 3850 Wire Wire Line 6100 3850 6100 3800 Wire Wire Line 6350 4000 6400 4000 Wire Wire Line 6400 4000 6400 3800 Wire Wire Line 6650 3850 6700 3850 Wire Wire Line 6700 3850 6700 3800 Wire Wire Line 8150 4000 8200 4000 Wire Wire Line 8200 4000 8200 3800 Wire Wire Line 8450 3850 8500 3850 Wire Wire Line 8500 3850 8500 3800 Wire Wire Line 8750 4000 8800 4000 Wire Wire Line 8800 4000 8800 3800 Wire Wire Line 3300 4000 3350 4000 Wire Wire Line 3350 4000 3350 3800 Wire Wire Line 3600 3850 3650 3850 Wire Wire Line 3650 3850 3650 3800 Wire Wire Line 3900 4000 3950 4000 Wire Wire Line 3950 4000 3950 3800 Wire Wire Line 4200 3850 4250 3850 Wire Wire Line 4250 3850 4250 3800 Wire Wire Line 4500 4000 4550 4000 Wire Wire Line 4550 4000 4550 3800 Wire Wire Line 3350 3400 4600 3400 Connection ~ 4550 3400 Connection ~ 4250 3400 Connection ~ 3950 3400 Connection ~ 3650 3400 Wire Wire Line 3300 700 4850 700 Connection ~ 3350 700 Connection ~ 3650 700 Connection ~ 3950 700 Connection ~ 4250 700 Connection ~ 4550 700 Wire Wire Line 3300 1150 3350 1150 Wire Wire Line 3350 1150 3350 1100 Wire Wire Line 3600 1300 3650 1300 Wire Wire Line 3650 1300 3650 1100 Wire Wire Line 3900 1150 3950 1150 Wire Wire Line 3950 1150 3950 1100 Wire Wire Line 4200 1300 4250 1300 Wire Wire Line 4250 1300 4250 1100 Wire Wire Line 4500 1150 4550 1150 Wire Wire Line 4550 1150 4550 1100 Wire Wire Line 4800 1300 4850 1300 Wire Wire Line 4850 1300 4850 1100 Wire Wire Line 5150 2650 5200 2650 Wire Wire Line 5150 3050 5200 3050 Wire Wire Line 5450 1150 5500 1150 Wire Wire Line 5500 1100 5500 1350 Wire Wire Line 5750 1300 5800 1300 Wire Wire Line 5800 1100 5800 1350 Wire Wire Line 6050 1150 6100 1150 Wire Wire Line 6100 1100 6100 1350 Wire Wire Line 6350 1300 6400 1300 Wire Wire Line 6400 1100 6400 1350 Wire Wire Line 6650 1150 6700 1150 Wire Wire Line 6700 1100 6700 1350 Wire Wire Line 5450 2450 5500 2450 Wire Wire Line 5500 2400 5500 2650 Wire Wire Line 5750 2600 5800 2600 Wire Wire Line 5800 2400 5800 2650 Wire Wire Line 6050 2450 6100 2450 Wire Wire Line 6100 2400 6100 2650 Wire Wire Line 6350 2600 6400 2600 Wire Wire Line 6400 2400 6400 2650 Wire Wire Line 6650 2450 6700 2450 Wire Wire Line 6700 2400 6700 2650 Wire Wire Line 6950 2600 7000 2600 Wire Wire Line 7000 2400 7000 2650 Wire Wire Line 7250 2450 7300 2450 Wire Wire Line 7300 2400 7300 2650 Wire Wire Line 7550 2600 7600 2600 Wire Wire Line 7600 2400 7600 2650 Wire Wire Line 7850 2450 7900 2450 Wire Wire Line 7900 2400 7900 2650 Wire Wire Line 8150 2600 8200 2600 Wire Wire Line 8200 2400 8200 2650 Wire Wire Line 8450 2450 8500 2450 Wire Wire Line 8500 2400 8500 2650 Wire Wire Line 8750 2600 8800 2600 Wire Wire Line 8800 2400 8800 2650 Wire Wire Line 6950 4000 7000 4000 Wire Wire Line 7000 4000 7000 3800 Wire Wire Line 7250 3850 7300 3850 Wire Wire Line 7300 3850 7300 3800 Wire Wire Line 7550 4000 7600 4000 Wire Wire Line 7600 4000 7600 3800 Wire Wire Line 7850 3850 7900 3850 Wire Wire Line 7900 3850 7900 3800 Wire Wire Line 3750 4250 6100 4250 Wire Wire Line 3800 4250 3800 4300 Wire Wire Line 4250 4250 4250 4300 Connection ~ 3800 4250 Wire Wire Line 4700 4250 4700 4300 Connection ~ 4250 4250 Wire Wire Line 5150 4250 5150 4300 Connection ~ 4700 4250 Wire Wire Line 5650 4250 5650 4300 Connection ~ 5150 4250 Wire Wire Line 6100 4250 6100 4300 Connection ~ 5650 4250 Wire Wire Line 7250 4250 10800 4250 Wire Wire Line 7300 4250 7300 4300 Wire Wire Line 7800 4250 7800 4300 Connection ~ 7300 4250 Wire Wire Line 8300 4250 8300 4300 Connection ~ 7800 4250 Wire Wire Line 8800 4250 8800 4300 Connection ~ 8300 4250 Wire Wire Line 9300 4250 9300 4300 Connection ~ 8800 4250 Wire Wire Line 9800 4250 9800 4300 Connection ~ 9300 4250 Wire Wire Line 10300 4250 10300 4300 Connection ~ 9800 4250 Wire Wire Line 10800 4250 10800 4300 Connection ~ 10300 4250 Wire Wire Line 4900 5750 10000 5750 Wire Wire Line 4950 5750 4950 5800 Wire Wire Line 5400 5750 5400 5800 Connection ~ 4950 5750 Wire Wire Line 5850 5750 5850 5800 Connection ~ 5400 5750 Wire Wire Line 6300 5750 6300 5800 Connection ~ 5850 5750 Wire Wire Line 6800 5750 6800 5800 Connection ~ 6300 5750 Wire Wire Line 7250 5750 7250 5800 Connection ~ 6800 5750 Wire Wire Line 7700 5750 7700 5800 Connection ~ 7250 5750 Wire Wire Line 8150 5750 8150 5800 Connection ~ 7700 5750 Wire Wire Line 8650 5750 8650 5800 Connection ~ 8150 5750 Wire Wire Line 9100 5750 9100 5800 Connection ~ 8650 5750 Wire Wire Line 9550 5750 9550 5800 Connection ~ 9100 5750 Wire Wire Line 10000 5750 10000 5800 Connection ~ 9550 5750 Wire Wire Line 3500 5550 3500 5350 Wire Wire Line 3950 5350 3950 5550 Wire Wire Line 4400 5350 4400 5550 Wire Wire Line 4850 5350 4850 5550 Wire Wire Line 5350 5350 5350 5550 Wire Wire Line 5800 5350 5800 5550 Wire Wire Line 4650 7050 4650 6850 Wire Wire Line 5100 7050 5100 6850 Wire Wire Line 5550 7050 5550 6850 Wire Wire Line 6000 7050 6000 6850 Wire Wire Line 6500 7050 6500 6850 Wire Wire Line 6950 7050 6950 6850 Wire Wire Line 7400 7050 7400 6850 Wire Wire Line 7850 7050 7850 6850 Wire Wire Line 8350 7050 8350 6850 Wire Wire Line 8800 7050 8800 6850 Wire Wire Line 9250 7050 9250 6850 Wire Wire Line 9700 7050 9700 6850 Wire Wire Line 10100 6850 10100 6800 Wire Wire Line 9650 6850 9650 6800 Wire Wire Line 9200 6850 9200 6800 Wire Wire Line 8750 6850 8750 6800 Wire Wire Line 8250 6850 8250 6800 Wire Wire Line 7800 6850 7800 6800 Wire Wire Line 7350 6850 7350 6800 Wire Wire Line 6900 6850 6900 6800 Wire Wire Line 6400 6850 6400 6800 Wire Wire Line 5950 6850 5950 6800 Wire Wire Line 5500 6850 5500 6800 Wire Wire Line 5050 6850 5050 6800 Wire Wire Line 7000 5350 7000 5550 Wire Wire Line 7500 5350 7500 5550 Wire Wire Line 8000 5350 8000 5550 Wire Wire Line 8500 5350 8500 5550 Wire Wire Line 9000 5350 9000 5550 Wire Wire Line 9500 5350 9500 5550 Wire Wire Line 10000 5350 10000 5550 Wire Wire Line 10500 5350 10500 5550 Wire Wire Line 10900 5350 10900 5300 Wire Wire Line 10400 5350 10400 5300 Wire Wire Line 9900 5350 9900 5300 Wire Wire Line 9400 5350 9400 5300 Wire Wire Line 8900 5350 8900 5300 Wire Wire Line 8400 5350 8400 5300 Wire Wire Line 7900 5350 7900 5300 Wire Wire Line 7400 5350 7400 5300 Wire Wire Line 4600 1600 4700 1600 Wire Wire Line 4600 1700 4700 1700 Wire Wire Line 4600 1800 4700 1800 Wire Wire Line 4600 1900 4700 1900 Wire Wire Line 4600 2000 4700 2000 Wire Wire Line 4600 2100 4700 2100 Wire Wire Line 4600 2200 4700 2200 Wire Wire Line 4600 2300 4700 2300 Wire Wire Line 3800 1600 3900 1600 Wire Wire Line 3800 1700 3900 1700 Wire Wire Line 3800 1800 3900 1800 Wire Wire Line 3800 1900 3900 1900 Wire Wire Line 3800 2000 3900 2000 Wire Wire Line 3800 2100 3900 2100 Wire Wire Line 3800 2200 3900 2200 Wire Wire Line 3800 2300 3900 2300 Wire Wire Line 2250 1400 2300 1400 Wire Wire Line 2250 2100 2300 2100 Wire Wire Line 2850 2300 2900 2300 Wire Wire Line 850 2200 800 2200 Wire Wire Line 850 2100 800 2100 Wire Wire Line 850 2300 800 2300 Wire Wire Line 2850 2700 2900 2700 Wire Wire Line 850 2800 800 2800 Wire Wire Line 2850 2900 2900 2900 Wire Wire Line 850 1700 800 1700 Wire Wire Line 2850 1700 2900 1700 Wire Wire Line 800 1500 850 1500 Wire Wire Line 800 2600 850 2600 Wire Wire Line 800 2700 850 2700 Wire Wire Line 2900 2400 2850 2400 Wire Wire Line 1350 1100 1350 1200 Wire Wire Line 4750 2550 4600 2550 Wire Wire Line 4600 2550 4600 2400 Wire Wire Line 3900 5300 3900 5350 Wire Wire Line 4350 5300 4350 5350 Wire Wire Line 4800 5300 4800 5350 Wire Wire Line 5250 5300 5250 5350 Wire Wire Line 5750 5300 5750 5350 Wire Wire Line 6200 5300 6200 5350 Wire Wire Line 2250 1200 2400 1200 Wire Wire Line 2400 1200 2400 1100 Wire Wire Line 800 1900 1450 1900 Wire Wire Line 800 1800 1450 1800 Wire Wire Line 1350 1500 1450 1500 Wire Wire Line 1350 1700 1450 1700 Wire Wire Line 1350 2100 1450 2100 Wire Wire Line 1350 2200 1450 2200 Wire Wire Line 1350 2600 1450 2600 Wire Wire Line 1350 2700 1450 2700 Wire Wire Line 1350 2800 1450 2800 Wire Wire Line 800 3000 1450 3000 Wire Wire Line 2250 1700 2350 1700 Wire Wire Line 2250 2200 2900 2200 Wire Wire Line 2250 1900 2900 1900 Wire Wire Line 2250 2000 2900 2000 Wire Wire Line 2250 2300 2350 2300 Wire Wire Line 2250 2700 2350 2700 Wire Wire Line 2250 2900 2350 2900 Wire Wire Line 2250 3000 2900 3000 Wire Wire Line 2250 3100 2900 3100 Wire Wire Line 1350 2300 1450 2300 Wire Wire Line 2250 2400 2350 2400 Connection ~ 1350 1200 Connection ~ 2250 1200 Wire Wire Line 2250 1200 2250 1300 Wire Wire Line 3800 2400 3900 2400 Wire Wire Line 3400 2500 3400 2400 Connection ~ 5500 1150 Connection ~ 5800 1300 Connection ~ 6100 1150 Connection ~ 6400 1300 Connection ~ 6700 1150 Connection ~ 7000 1300 Connection ~ 7300 1150 Connection ~ 7600 1300 Connection ~ 5500 2450 Connection ~ 6100 2450 Connection ~ 6700 2450 Connection ~ 7300 2450 Connection ~ 5800 2600 Connection ~ 6400 2600 Connection ~ 7000 2600 Connection ~ 7600 2600 Connection ~ 7900 2450 Connection ~ 8200 2600 Connection ~ 8500 2450 Connection ~ 8800 2600 Connection ~ 7900 1150 Connection ~ 8200 1300 Connection ~ 8500 1150 Connection ~ 8800 1300 Wire Wire Line 800 1400 1450 1400 Wire Wire Line 11000 2750 11050 2750 Wire Wire Line 11000 3100 11050 3100 Wire Wire Line 10600 2600 10600 3100 Connection ~ 10600 2750 Wire Notes Line 11200 2100 10500 2100 Wire Notes Line 10500 2100 10500 3300 Wire Notes Line 10500 3300 11200 3300 Wire Notes Line 11200 3300 11200 2100 Wire Wire Line 1450 1300 800 1300 Wire Wire Line 1350 1200 1450 1200 NoConn ~ 1450 2000 Wire Wire Line 3400 2400 3500 2400 Wire Wire Line 2250 1500 2350 1500 Wire Wire Line 2250 1600 2350 1600 Wire Wire Line 2850 1500 2900 1500 Wire Wire Line 2850 1600 2900 1600 $Comp L CONN_4 P3 U 1 1 5C1DA337 P 1800 4450 F 0 "P3" V 1750 4450 50 0000 C CNN F 1 "CONN_4" V 1850 4450 50 0000 C CNN F 2 "" H 1800 4450 60 0000 C CNN F 3 "" H 1800 4450 60 0000 C CNN 1 1800 4450 1 0 0 -1 $EndComp $Comp L +3.3V #PWR07 U 1 1 5C1DA3CA P 1350 4300 F 0 "#PWR07" H 1350 4260 30 0001 C CNN F 1 "+3.3V" H 1350 4410 30 0000 C CNN F 2 "" H 1350 4300 60 0000 C CNN F 3 "" H 1350 4300 60 0000 C CNN 1 1350 4300 0 -1 -1 0 $EndComp Text GLabel 1350 4400 0 60 Input ~ 0 sda Text GLabel 1350 4500 0 60 Input ~ 0 scl Wire Wire Line 1350 4300 1450 4300 Wire Wire Line 1350 4400 1450 4400 Wire Wire Line 1350 4500 1450 4500 NoConn ~ 1450 3100 NoConn ~ 2250 2600 Text GLabel 800 1600 0 60 Input ~ 0 i2cgnd Text GLabel 1350 4600 0 60 Input ~ 0 i2cgnd Wire Wire Line 1450 4600 1350 4600 Wire Wire Line 800 1600 1450 1600 NoConn ~ 1450 2900 $EndSCHEMATC |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 | (session PDP8_2019.ses (base_design PDP8_2019.dsn) (placement (resolution um 10) (component R3 (place R9 1741000 -1217250 back 0) (place R1 940500 -1219750 back 0) (place R2 1041000 -1219750 back 0) (place R3 1141000 -1219750 back 180) (place R4 1241000 -1219250 back 180) (place R5 1340500 -1219250 back 180) (place R6 1441500 -1218750 back 180) (place R7 1541000 -1218750 back 0) (place R8 1640500 -1218250 back 0) (place R10 1840000 -1216750 back 0) (place R11 1940500 -1216250 back 0) (place R12 2040500 -1216250 back 0) (place R_ROW1 1892500 -1484500 back 0) (place R_ROW2 790000 -1485000 front 180) (place R_ROW3 2290000 -1484500 back 180) ) (component "DIP-18__300" (place P2 2668000 -1398000 front 0) ) (component 1pin (place M1 135000 -700000 front 0) (place M2 135000 -1590000 front 0) (place M3 2860000 -700000 front 0) (place M4 2860000 -1590000 front 0) (place M5 2071000 -826000 front 0) ) (component D2 (place D23 2490800 -1721500 front 0) (place D24 2590800 -1721500 front 0) (place D22 2390800 -1721500 front 0) (place D25 2690800 -1721500 front 0) (place D26 2790800 -1721500 front 0) (place D12 1390800 -1721500 front 0) (place D2 390800 -1721500 front 0) (place D3 490800 -1721500 front 0) (place D4 590800 -1721500 front 0) (place D5 690800 -1721500 front 0) (place D6 790800 -1721500 front 0) (place D7 890800 -1721500 front 0) (place D8 990800 -1721500 front 0) (place D9 1090800 -1721500 front 0) (place D10 1190800 -1721500 front 0) (place D11 1290800 -1721500 front 0) (place D1 290800 -1721500 front 0) (place D13 1490800 -1721500 front 0) (place D14 1590800 -1721500 front 0) (place D15 1690800 -1721500 front 0) (place D16 1790800 -1721500 front 0) (place D17 1890800 -1721500 front 0) (place D18 1990800 -1721500 front 0) (place D19 2090800 -1721500 front 0) (place D20 2190800 -1721500 front 0) (place D21 2290800 -1721500 front 0) (place DZ1 2442500 -1439000 back 180) ) (component "LED-3-PDP" (place DMB9 1690000 -998000 front 0) (place DMB10 1790000 -998000 front 0) (place DMB11 1890000 -998000 front 0) (place DMB12 1990000 -998000 front 0) (place DAC1 890000 -1144000 front 0) (place DAC2 990000 -1144000 front 0) (place DAC3 1090000 -1144000 front 0) (place DAC4 1190000 -1144000 front 0) (place DAC5 1290000 -1144000 front 0) (place DAC6 1390000 -1144000 front 0) (place DAC7 1490000 -1144000 front 0) (place DAC8 1590000 -1144000 front 0) (place DAC9 1690000 -1144000 front 0) (place DAC10 1790000 -1144000 front 0) (place DPC1 890000 -706000 front 0) (place DAC12 1990000 -1144000 front 0) (place DMQ1 890000 -1290000 front 0) (place DMQ2 990000 -1290000 front 0) (place DMQ3 1090000 -1290000 front 0) (place DMQ4 1190000 -1290000 front 0) (place DMQ5 1290000 -1290000 front 0) (place DMQ6 1390000 -1290000 front 0) (place DMQ7 1490000 -1290000 front 0) (place DMQ8 1590000 -1290000 front 0) (place DMQ9 1690000 -1290000 front 0) (place DMQ10 1790000 -1290000 front 0) (place DMQ11 1890000 -1290000 front 0) (place DMQ12 1990000 -1290000 front 0) (place DLINK1 790000 -1144000 front 0) (place DSC1 290000 -1290000 front 0) (place DAC11 1890000 -1144000 front 0) (place DPC2 990000 -706000 front 0) (place DPC3 1090000 -706000 front 0) (place DPC4 1190000 -706000 front 0) (place DPC5 1290000 -706000 front 0) (place DPC6 1390000 -706000 front 0) (place DPC7 1490000 -706000 front 0) (place DPC8 1590000 -706000 front 0) (place DPC9 1690000 -706000 front 0) (place DPC10 1790000 -706000 front 0) (place DPC11 1890000 -706000 front 0) (place DPC12 1990000 -706000 front 0) (place DMA1 890000 -852000 front 0) (place DMA2 990000 -852000 front 0) (place DMA3 1090000 -852000 front 0) (place DMB8 1590000 -998000 front 0) (place DMA5 1290000 -852000 front 0) (place DMA6 1390000 -852000 front 0) (place DMA7 1490000 -852000 front 0) (place DMA8 1590000 -852000 front 0) (place DMA9 1690000 -852000 front 0) (place DMA10 1790000 -852000 front 0) (place DMA11 1890000 -852000 front 0) (place DMA12 1990000 -852000 front 0) (place DMB1 890000 -998000 front 0) (place DMB2 990000 -998000 front 0) (place DMB3 1090000 -998000 front 0) (place DMB4 1190000 -998000 front 0) (place DMB5 1290000 -998000 front 0) (place DMB6 1390000 -998000 front 0) (place DMB7 1490000 -998000 front 0) (place DMA4 1190000 -852000 front 0) (place DRUN1 2790000 -852000 front 0) (place DPAUSE1 2790000 -779000 front 0) (place DION1 2790000 -706000 front 0) (place DBREAK1 2590000 -1071000 front 0) (place DCURAD1 2590000 -998000 front 0) (place DWRDCT1 2590000 -925000 front 0) (place DDEFER1 2590000 -852000 front 0) (place DEXEC1 2590000 -779000 front 0) (place DFETCH1 2590000 -706000 front 0) (place DOPR1 2390000 -1214000 front 0) (place DIOT1 2390000 -1142000 front 0) (place DJMP1 2390000 -1070000 front 0) (place DJMS1 2390000 -998000 front 0) (place DDCA1 2390000 -925000 front 0) (place DSC2 390000 -1290000 front 0) (place DSC4 590000 -1290000 front 0) (place DSC5 690000 -1290000 front 0) (place DDF1 290000 -706000 front 0) (place DDF2 390000 -706000 front 0) (place DDF3 490000 -706000 front 0) (place DSC3 490000 -1290000 front 0) (place DTAD1 2390000 -779000 front 0) (place DAND1 2390000 -706000 front 0) (place DISZ1 2390000 -852000 front 0) (place DIF2 690000 -706000 front 0) (place DIF3 790000 -706000 front 0) (place DIF1 590000 -706000 front 0) ) (component "LED-3-StrEight" (place DPAUSE2 2590000 -1144000 front 0) (place DRUN2 2590000 -1217000 front 0) ) (component RASPI_BPLUS_MIRRORED (place P1 2163000 -1400000 back 0) ) (component PIN_ARRAY_4x1 (place P3 2366260 -1352300 back 0) ) (component SW_PIDP2019 (place SW6 790000 -1599000 front 0) (place SW5 690000 -1599000 front 0) (place SW4 590000 -1599000 front 0) (place SW3 490000 -1599000 front 0) (place SW2 390000 -1599000 front 0) (place SW1 290000 -1599000 front 0) (place SW18 1990000 -1599000 front 0) (place SW17 1890000 -1599000 front 0) (place SW15 1690000 -1599000 front 0) (place SW14 1590000 -1599000 front 0) (place SW13 1490000 -1599000 front 0) (place SW12 1390000 -1599000 front 0) (place SW19 2090000 -1599000 front 0) (place SW20 2190000 -1599000 front 0) (place SW16 1790000 -1599000 front 0) (place SW22 2390000 -1599000 front 0) (place SW23 2490000 -1599000 front 0) (place SW24 2590000 -1599000 front 0) (place SW25 2690000 -1599000 front 0) (place SW26 2790000 -1599000 front 0) (place SW7 890000 -1599000 front 0) (place SW8 990000 -1599000 front 0) (place SW9 1090000 -1599000 front 0) (place SW10 1190000 -1599000 front 0) (place SW11 1290000 -1599000 front 0) (place SW21 2290000 -1599000 front 0) ) ) (was_is ) (routes (resolution um 10) (parser (host_cad "KiCad's Pcbnew") (host_version "(2013-07-07 BZR 4022)-stable") ) (library_out (padstack "Via[0-1]_889:635_um" (shape (circle F.Cu 8890 0 0) ) (shape (circle B.Cu 8890 0 0) ) (attach off) ) (padstack "Via[0-1]_889:0_um" (shape (circle F.Cu 8890 0 0) ) (shape (circle B.Cu 8890 0 0) ) (attach off) ) ) (network_out (net +3.3V (wire (path B.Cu 5080 2404360 -1352300 2404360 -1366273 ) ) (wire (path B.Cu 5080 2404360 -1366273 2404300 -1366333 2404300 -1387300 ) ) ) (net +5V (wire (path F.Cu 5080 2404300 -1412700 2404300 -1438900 2404400 -1439000 ) ) (wire (path F.Cu 5080 2378900 -1412700 2404300 -1412700 ) ) ) (net GND (wire (path F.Cu 5080 2353500 -1412700 2339453 -1426747 2260723 -1426747 ) ) (wire (path B.Cu 5080 2175700 -1412700 2189747 -1426747 2260723 -1426747 ) ) (via "Via[0-1]_889:635_um" 2260723 -1426747 ) (wire (path F.Cu 5080 2769600 -1359900 2741057 -1388443 2503474 -1388443 ) ) (wire (path B.Cu 5080 2353500 -1412700 2393165 -1452365 2439552 -1452365 2503474 -1388443 ) ) (via "Via[0-1]_889:635_um" 2503474 -1388443 ) ) (net "N-00000101" (wire (path B.Cu 5080 1390000 -1552000 1426360 -1588360 1426360 -1721500 ) ) ) (net "N-00000104" (wire (path B.Cu 5080 1990000 -1552000 2026360 -1588360 2026360 -1721500 ) ) ) (net "N-00000105" (wire (path B.Cu 5080 1890000 -1552000 1926360 -1588360 1926360 -1721500 ) ) ) (net "N-00000106" (wire (path B.Cu 5080 1790000 -1552000 1826360 -1588360 1826360 -1721500 ) ) ) (net "N-00000107" (wire (path B.Cu 5080 1690000 -1552000 1726360 -1588360 1726360 -1721500 ) ) ) (net "N-00000108" (wire (path B.Cu 5080 1590000 -1552000 1626360 -1588360 1626360 -1721500 ) ) ) (net "N-00000109" (wire (path B.Cu 5080 1490000 -1552000 1526360 -1588360 1526360 -1721500 ) ) ) (net "N-00000110" (wire (path B.Cu 5080 1290000 -1552000 1326360 -1588360 1326360 -1721500 ) ) ) (net "N-00000111" (wire (path B.Cu 5080 1190000 -1552000 1226360 -1588360 1226360 -1721500 ) ) ) (net "N-00000112" (wire (path B.Cu 5080 1090000 -1552000 1126360 -1588360 1126360 -1721500 ) ) ) (net "N-00000113" (wire (path B.Cu 5080 990000 -1552000 1026360 -1588360 1026360 -1721500 ) ) ) (net "N-00000114" (wire (path B.Cu 5080 890000 -1552000 892000 -1552000 926360 -1586360 926360 -1721500 ) (type protect) ) ) (net "N-00000119" (wire (path B.Cu 5080 2790000 -1552000 2826360 -1588360 2826360 -1721500 ) ) ) (net "N-00000120" (wire (path B.Cu 5080 2690000 -1552000 2726360 -1588360 2726360 -1721500 ) ) ) (net "N-0000060" (wire (path F.Cu 5080 2478060 -1439000 2490128 -1439000 ) ) (wire (path F.Cu 5080 2490128 -1439000 2512842 -1416286 2749786 -1416286 2769600 -1436100 ) ) ) (net "N-0000064" (wire (path B.Cu 5080 290000 -1552000 326360 -1588360 326360 -1721500 ) ) ) (net "N-0000065" (wire (path B.Cu 5080 790000 -1552000 826360 -1588360 826360 -1721500 ) ) ) (net "N-0000066" (wire (path B.Cu 5080 690000 -1552000 726360 -1588360 726360 -1721500 ) ) ) (net "N-0000067" (wire (path B.Cu 5080 590000 -1552000 626360 -1588360 626360 -1721500 ) ) ) (net "N-0000068" (wire (path B.Cu 5080 490000 -1552000 526360 -1588360 526360 -1721500 ) ) ) (net "N-0000069" (wire (path B.Cu 5080 390000 -1552000 426360 -1588360 426360 -1721500 ) ) ) (net "N-0000070" (wire (path F.Cu 5080 1196837 -1333440 1995040 -1333440 2018240 -1356640 2297440 -1356640 2328100 -1387300 ) ) (wire (path B.Cu 5080 1196837 -1333440 1163827 -1300430 1163827 -1235023 1179100 -1219750 ) ) (via "Via[0-1]_889:635_um" 1196837 -1333440 ) ) (net "N-0000071" (wire (path F.Cu 5080 828100 -1485000 957330 -1355770 2006590 -1355770 2015083 -1364263 2254263 -1364263 2277300 -1387300 ) ) ) (net "N-0000072" (wire (path F.Cu 5080 1779100 -1217250 1790742 -1228892 1814887 -1228892 1847657 -1196122 2075958 -1196122 2156143 -1276307 2156143 -1302340 ) ) (wire (path B.Cu 5080 2175700 -1387300 2156143 -1367743 2156143 -1302340 ) ) (via "Via[0-1]_889:635_um" 2156143 -1302340 ) ) (net "N-0000073" (wire (path F.Cu 5080 2064671 -1302172 2064671 -1260648 2007769 -1203746 1874004 -1203746 1841025 -1236725 1697075 -1236725 1678600 -1218250 ) ) (via "Via[0-1]_889:635_um" 2064671 -1302172 ) (wire (path B.Cu 5080 2150300 -1387300 2149799 -1387300 2064671 -1302172 ) ) ) (net "N-0000074" (wire (path F.Cu 5080 1309090 -1365692 1311281 -1363501 2003541 -1363501 2014319 -1374279 2035679 -1374279 2048700 -1387300 ) ) (wire (path B.Cu 5080 1279100 -1219250 1263827 -1234523 1263827 -1320429 1309090 -1365692 ) ) (via "Via[0-1]_889:635_um" 1309090 -1365692 ) ) (net "N-0000075" (wire (path F.Cu 5080 1392972 -1373125 2002385 -1373125 2016560 -1387300 2023300 -1387300 ) ) (wire (path B.Cu 5080 1378600 -1219250 1363522 -1234328 1363522 -1343675 1392972 -1373125 ) ) (via "Via[0-1]_889:635_um" 1392972 -1373125 ) ) (net "N-0000076" (wire (path F.Cu 5080 2050389 -1329169 2051149 -1329169 2078600 -1301718 2078600 -1216250 ) ) (wire (path B.Cu 5080 1997900 -1387300 2050389 -1334811 2050389 -1329169 ) ) (via "Via[0-1]_889:635_um" 2050389 -1329169 ) ) (net "N-0000077" (wire (path B.Cu 5080 2277300 -1412700 2277300 -1459100 2251900 -1484500 ) ) ) (net "N-0000078" (wire (path F.Cu 5080 1616319 -1392741 1664263 -1440685 2096915 -1440685 2124900 -1412700 ) ) (wire (path B.Cu 5080 1616319 -1392741 1563689 -1340111 1563689 -1234161 1579100 -1218750 ) ) (via "Via[0-1]_889:635_um" 1616319 -1392741 ) ) (net "N-0000079" (wire (path F.Cu 5080 1891604 -1240800 1954050 -1240800 1978600 -1216250 ) ) (via "Via[0-1]_889:635_um" 1891604 -1240800 ) (wire (path B.Cu 5080 1856706 -1383838 1856706 -1275698 1891604 -1240800 ) ) (via "Via[0-1]_889:635_um" 1856706 -1383838 ) (wire (path F.Cu 5080 2023300 -1412700 2010579 -1425421 1870719 -1425421 1853666 -1408368 1853666 -1386878 1856706 -1383838 ) ) ) (net "N-0000080" (wire (path F.Cu 5080 2011696 -1469135 1945965 -1469135 1930600 -1484500 ) ) (via "Via[0-1]_889:635_um" 2011696 -1469135 ) (wire (path B.Cu 5080 1972500 -1412700 2011696 -1451896 2011696 -1469135 ) ) ) (net "N-0000081" (wire (path B.Cu 5080 2490000 -1552000 2526360 -1588360 2526360 -1721500 ) ) ) (net "N-0000082" (wire (path B.Cu 5080 2390000 -1552000 2426360 -1588360 2426360 -1721500 ) ) ) (net "N-0000083" (wire (path B.Cu 5080 2290000 -1552000 2326360 -1588360 2326360 -1721500 ) ) ) (net "N-0000084" (wire (path B.Cu 5080 2190000 -1552000 2226360 -1588360 2226360 -1721500 ) ) ) (net "N-0000085" (wire (path B.Cu 5080 2090000 -1552000 2126360 -1588360 2126360 -1721500 ) ) ) (net "N-0000087" (wire (path B.Cu 5080 2328100 -1412700 2328100 -1438569 2303619 -1463050 ) ) (wire (path F.Cu 5080 985680 -1377346 1089510 -1377346 1164148 -1451984 2053668 -1451984 2064734 -1463050 2303619 -1463050 ) ) (wire (path B.Cu 5080 985680 -1377346 963522 -1355188 963522 -1234828 978600 -1219750 ) ) (via "Via[0-1]_889:635_um" 985680 -1377346 ) (via "Via[0-1]_889:635_um" 2303619 -1463050 ) ) (net "N-0000088" (wire (path F.Cu 5080 1092972 -1394931 1157648 -1459607 2015643 -1459607 2028467 -1472431 2270938 -1472431 2274500 -1475993 ) ) (wire (path B.Cu 5080 2302700 -1412700 2302700 -1447793 2274500 -1475993 ) ) (wire (path B.Cu 5080 1079100 -1219750 1063827 -1235023 1063827 -1365786 1092972 -1394931 ) ) (via "Via[0-1]_889:635_um" 1092972 -1394931 ) (via "Via[0-1]_889:635_um" 2274500 -1475993 ) ) (net "N-0000095" (wire (path F.Cu 5080 1932987 -1230770 1892120 -1230770 1878100 -1216750 ) ) (via "Via[0-1]_889:635_um" 1932987 -1230770 ) (wire (path B.Cu 5080 2124900 -1387300 2056869 -1319269 1964152 -1319269 1932987 -1288104 1932987 -1230770 ) ) ) (net "N-0000096" (wire (path F.Cu 5080 1433920 -1383213 1620266 -1383213 1670115 -1433062 2079138 -1433062 2099500 -1412700 ) ) (wire (path B.Cu 5080 1479600 -1218750 1433920 -1264430 1433920 -1383213 ) ) (via "Via[0-1]_889:635_um" 1433920 -1383213 ) ) (net "N-0000097" (wire (path B.Cu 5080 2626360 -1721500 2626360 -1709432 ) ) (wire (path B.Cu 5080 2590000 -1552000 2626360 -1588360 2626360 -1709432 ) ) ) (net col1 (wire (path B.Cu 5080 1941059 -1079259 1941059 -1209224 1923459 -1226824 1923459 -1234716 1924423 -1235680 1924423 -1305703 1908989 -1321137 1908989 -1418377 1984658 -1494046 2004889 -1494046 2052700 -1541857 2052700 -1721500 ) ) (wire (path F.Cu 5080 1941059 -1079259 2269957 -1079259 2362584 -986632 ) ) (wire (path F.Cu 5080 902700 -1144000 967441 -1079259 1941059 -1079259 ) ) (wire (path F.Cu 5080 2602700 -998000 2589093 -1011607 2567551 -1011607 2540479 -984535 2364681 -984535 2362584 -986632 ) ) (wire (path B.Cu 5080 2402700 -706000 2388694 -691994 2371803 -691994 2362584 -701213 2362584 -986632 ) ) (via "Via[0-1]_889:635_um" 2362584 -986632 ) (via "Via[0-1]_889:635_um" 1941059 -1079259 ) (wire (path F.Cu 5080 252700 -1721500 264769 -1709431 840631 -1709431 852700 -1721500 ) ) (wire (path B.Cu 5080 252700 -1721500 252700 -1149300 302700 -1099300 302700 -706000 ) (type protect) ) (wire (path B.Cu 5080 902700 -1202426 902400 -1202726 902400 -1219750 ) ) (wire (path B.Cu 5080 902700 -1202426 902700 -1251200 902400 -1251500 902400 -1289700 902700 -1290000 ) (type protect) ) (wire (path B.Cu 5080 902700 -1144000 902700 -1202426 ) (type protect) ) (wire (path B.Cu 5080 902700 -706000 902700 -852000 ) (type protect) ) (wire (path B.Cu 5080 902700 -852000 902700 -998000 ) (type protect) ) (wire (path B.Cu 5080 902700 -998000 902700 -1144000 ) (type protect) ) (wire (path B.Cu 5080 902700 -1290000 902700 -1437300 852700 -1487300 852700 -1721500 ) (type protect) ) ) (net col10 (wire (path F.Cu 5080 1801900 -1216750 1783599 -1198449 794251 -1198449 702700 -1290000 ) ) (wire (path F.Cu 5080 1802700 -706000 1816306 -692394 2335137 -692394 2397177 -754434 2578134 -754434 2602700 -779000 ) ) (wire (path B.Cu 5080 1802300 -1289600 1752700 -1339200 1752700 -1721500 ) ) (wire (path B.Cu 5080 1802300 -1289600 1802700 -1290000 ) (type protect) ) (wire (path B.Cu 5080 1801900 -1216750 1801900 -1289200 1802300 -1289600 ) (type protect) ) (wire (path B.Cu 5080 1802700 -998000 1802700 -1144000 ) (type protect) ) (wire (path B.Cu 5080 1802700 -852000 1802700 -998000 ) (type protect) ) (wire (path B.Cu 5080 1802700 -1144000 1801900 -1144800 1801900 -1216750 ) (type protect) ) (wire (path B.Cu 5080 1802700 -706000 1802700 -852000 ) (type protect) ) ) (net col11 (wire (path B.Cu 5080 1852700 -1721500 1852700 -1507767 1893516 -1466951 1893516 -1299184 1902700 -1290000 ) ) (wire (path B.Cu 5080 1902700 -1290000 1902700 -1217000 ) (type protect) ) (wire (path F.Cu 5080 2602700 -852000 2589142 -838442 2103319 -838442 2090178 -851583 2023871 -851583 2010334 -838046 1916654 -838046 1902700 -852000 ) ) (wire (path B.Cu 5080 1902700 -1217000 1902400 -1216700 1902400 -1216250 ) ) (wire (path B.Cu 5080 1902700 -1217000 1902700 -1144000 ) (type protect) ) (wire (path B.Cu 5080 1902700 -998000 1902700 -852000 ) (type protect) ) (wire (path B.Cu 5080 1902700 -1144000 1902700 -998000 ) (type protect) ) (wire (path B.Cu 5080 1902700 -852000 1902700 -706000 ) (type protect) ) ) (net col12 (wire (path B.Cu 5080 2002700 -779000 1919691 -862009 1919691 -1219812 1915836 -1223667 1915836 -1237873 1916800 -1238837 1916800 -1298733 1901141 -1314392 1901141 -1480281 1952700 -1531840 1952700 -1721500 ) ) (wire (path B.Cu 5080 2002700 -779000 2002700 -852000 ) (type protect) ) (wire (path B.Cu 5080 2002700 -706000 2002700 -779000 ) (type protect) ) (wire (path F.Cu 5080 2602700 -925000 2573657 -954043 2046657 -954043 2002700 -998000 ) ) (wire (path B.Cu 5080 2002700 -998000 2002700 -1144000 ) (type protect) ) (wire (path B.Cu 5080 2002700 -852000 2002700 -998000 ) (type protect) ) (wire (path B.Cu 5080 2002400 -1216250 2002400 -1289700 2002700 -1290000 ) (type protect) ) (wire (path B.Cu 5080 2002700 -1144000 2002400 -1144300 2002400 -1216250 ) (type protect) ) ) (net col2 (wire (path F.Cu 5080 1002700 -852000 1057820 -796880 2384820 -796880 2402700 -779000 ) ) (wire (path F.Cu 5080 2540510 -998041 2540510 -1008810 2602700 -1071000 ) ) (via "Via[0-1]_889:635_um" 2540510 -998041 ) (wire (path B.Cu 5080 2402700 -779000 2540510 -916810 2540510 -998041 ) ) (wire (path F.Cu 5080 1002700 -706000 988461 -691761 416939 -691761 402700 -706000 ) ) (wire (path F.Cu 5080 2152700 -1721500 2140632 -1709432 964768 -1709432 952700 -1721500 ) ) (wire (path B.Cu 5080 1002900 -1219750 1002900 -1289800 1002700 -1290000 ) (type protect) ) (wire (path B.Cu 5080 1002700 -1144000 1002900 -1144200 1002900 -1219750 ) (type protect) ) (wire (path B.Cu 5080 1002700 -852000 1002700 -998000 ) (type protect) ) (wire (path B.Cu 5080 1002700 -706000 1002700 -852000 ) (type protect) ) (wire (path B.Cu 5080 1002700 -998000 1002700 -1144000 ) (type protect) ) (wire (path B.Cu 5080 1002700 -1290000 1002700 -1429350 952700 -1479350 952700 -1721500 ) (type protect) ) (wire (path B.Cu 5080 352700 -1721500 352700 -1154300 402700 -1104300 402700 -706000 ) (type protect) ) ) (net col3 (wire (path F.Cu 5080 1102700 -998000 1166383 -934317 2320383 -934317 2402700 -852000 ) ) (wire (path F.Cu 5080 2802700 -706000 2643187 -865513 2416213 -865513 2402700 -852000 ) ) (wire (path F.Cu 5080 1052700 -1721500 1064769 -1733569 2240631 -1733569 2252700 -1721500 ) ) (wire (path F.Cu 5080 1052700 -1721500 1040631 -1733569 464769 -1733569 452700 -1721500 ) ) (wire (path B.Cu 5080 1102900 -1219750 1102900 -1289800 1102700 -1290000 ) (type protect) ) (wire (path B.Cu 5080 1102700 -1144000 1102900 -1144200 1102900 -1219750 ) (type protect) ) (wire (path B.Cu 5080 1102700 -852000 1102700 -998000 ) (type protect) ) (wire (path B.Cu 5080 1102700 -706000 1102700 -852000 ) (type protect) ) (wire (path B.Cu 5080 1102700 -998000 1102700 -1144000 ) (type protect) ) (wire (path B.Cu 5080 1052700 -1721500 1052700 -1480950 1102700 -1430950 1102700 -1290000 ) (type protect) ) (wire (path B.Cu 5080 502700 -706000 502700 -1110700 452700 -1160700 452700 -1721500 ) (type protect) ) ) (net col4 (wire (path F.Cu 5080 1202700 -998000 1255807 -944893 2382807 -944893 2402700 -925000 ) ) (wire (path B.Cu 5080 1152700 -1721500 1140631 -1733569 564769 -1733569 552700 -1721500 ) ) (wire (path B.Cu 5080 1202700 -1290000 1206365 -1293665 1206365 -1337387 1152700 -1391052 1152700 -1721500 ) ) (wire (path F.Cu 5080 2602700 -1144000 2824025 -1365325 2824025 -1591663 2797834 -1617854 2692949 -1617854 2609221 -1701582 2372618 -1701582 2352700 -1721500 ) ) (wire (path F.Cu 5080 2602700 -1144000 2624168 -1122532 2624168 -890667 ) ) (wire (path F.Cu 5080 2624168 -890667 2691033 -890667 2802700 -779000 ) ) (wire (path F.Cu 5080 2402700 -925000 2437033 -890667 2624168 -890667 ) ) (wire (path B.Cu 5080 1202700 -1217000 1202900 -1217200 1202900 -1219250 ) ) (wire (path B.Cu 5080 1202700 -1217000 1202700 -1144000 ) (type protect) ) (wire (path B.Cu 5080 1202700 -1290000 1202700 -1217000 ) (type protect) ) (wire (path B.Cu 5080 1203000 -998000 1203000 -852300 1202700 -852000 ) (type protect) ) (wire (path B.Cu 5080 1202700 -1144000 1203000 -1143700 1203000 -998000 ) (type protect) ) (wire (path B.Cu 5080 1202700 -998000 1203000 -998000 ) ) (wire (path B.Cu 5080 552700 -1721500 552700 -1716700 551000 -1715000 551000 -1175000 602700 -1123300 602700 -706000 ) (type protect) ) (wire (path B.Cu 5080 1202700 -852000 1202700 -706000 ) (type protect) ) ) (net col5 (wire (path B.Cu 5080 1302700 -1290000 1318818 -1306118 1318818 -1417582 1252700 -1483700 1252700 -1721500 ) ) (wire (path B.Cu 5080 1302400 -1219250 1302400 -1289700 1302700 -1290000 ) (type protect) ) (wire (path B.Cu 5080 2452700 -1721500 2452700 -1515905 2496361 -1472244 2725873 -1472244 2756343 -1441774 2756343 -1430913 2747981 -1422551 2614433 -1422551 2563851 -1371969 2561221 -1371969 2552083 -1362831 2552083 -1331974 ) ) (wire (path B.Cu 5080 2515996 -1039826 2687073 -868749 2785951 -868749 2802700 -852000 ) ) (wire (path B.Cu 5080 2602700 -1217000 2589176 -1230524 2571494 -1230524 2515996 -1175026 2515996 -1039826 ) ) (wire (path B.Cu 5080 2402700 -998000 2444526 -1039826 2515996 -1039826 ) ) (wire (path F.Cu 5080 2602700 -1217000 2602700 -1281357 2552083 -1331974 ) ) (via "Via[0-1]_889:635_um" 2552083 -1331974 ) (wire (path B.Cu 5080 1302700 -706000 1288919 -692219 716481 -692219 702700 -706000 ) ) (wire (path B.Cu 5080 1302700 -706000 1302700 -852000 ) (type protect) ) (wire (path F.Cu 5080 1302700 -1144000 1357824 -1088876 2311824 -1088876 2402700 -998000 ) ) (wire (path B.Cu 5080 1302700 -1144000 1302400 -1144300 1302400 -1219250 ) (type protect) ) (wire (path B.Cu 5080 1302700 -852000 1302700 -998000 ) (type protect) ) (wire (path B.Cu 5080 1302700 -998000 1302700 -1144000 ) (type protect) ) (wire (path B.Cu 5080 652700 -1721500 652700 -1176300 702700 -1126300 702700 -706000 ) (type protect) ) ) (net col6 (wire (path F.Cu 5080 1402700 -1290000 1368788 -1323912 782098 -1323912 773830 -1332180 ) ) (wire (path B.Cu 5080 1352700 -1721500 1364769 -1733569 2540631 -1733569 2552700 -1721500 ) ) (wire (path B.Cu 5080 1402700 -1290000 1402700 -1431217 1352700 -1481217 1352700 -1721500 ) ) (wire (path F.Cu 5080 1402700 -1144000 1447382 -1099318 2373382 -1099318 2402700 -1070000 ) ) (wire (path B.Cu 5080 1403400 -1218750 1403400 -1289300 1402700 -1290000 ) (type protect) ) (wire (path F.Cu 5080 302700 -1290000 344880 -1332180 773830 -1332180 ) ) (via "Via[0-1]_889:635_um" 773830 -1332180 ) (wire (path B.Cu 5080 770000 -1387563 773830 -1383733 773830 -1332180 ) ) (wire (path B.Cu 5080 770000 -1387563 770000 -1200000 742000 -1172000 742000 -1111000 802700 -1050300 802700 -706000 ) (type protect) ) (wire (path B.Cu 5080 752700 -1721500 752700 -1506300 770000 -1489000 770000 -1387563 ) (type protect) ) (wire (path B.Cu 5080 1402700 -1144000 1403400 -1144700 1403400 -1218750 ) (type protect) ) (wire (path B.Cu 5080 1402700 -852000 1402700 -998000 ) (type protect) ) (wire (path B.Cu 5080 1402700 -706000 1402700 -852000 ) (type protect) ) (wire (path B.Cu 5080 1402700 -998000 1402700 -1144000 ) (type protect) ) ) (net col7 (wire (path F.Cu 5080 1502900 -1218750 1489662 -1231988 890688 -1231988 888716 -1230016 ) ) (wire (path B.Cu 5080 802700 -1144000 888716 -1230016 ) ) (via "Via[0-1]_889:635_um" 888716 -1230016 ) (wire (path F.Cu 5080 1502700 -1144000 1524113 -1122587 2383287 -1122587 2402700 -1142000 ) ) (wire (path B.Cu 5080 2402700 -1142000 2501303 -1240603 2591504 -1240603 2706100 -1355199 2706100 -1364574 2757917 -1416391 2767798 -1416391 2781935 -1430528 2781935 -1440929 2723289 -1499575 2669803 -1499575 2652700 -1516678 2652700 -1721500 ) ) (wire (path B.Cu 5080 1502700 -1290000 1452700 -1340000 1452700 -1721500 ) ) (wire (path B.Cu 5080 1502900 -1218750 1502900 -1289800 1502700 -1290000 ) (type protect) ) (wire (path F.Cu 5080 422950 -1235845 710855 -1235845 802700 -1144000 ) ) (via "Via[0-1]_889:635_um" 422950 -1235845 ) (wire (path B.Cu 5080 402700 -1290000 422950 -1269750 422950 -1235845 ) ) (wire (path B.Cu 5080 1502700 -1144000 1502900 -1144200 1502900 -1218750 ) (type protect) ) (wire (path B.Cu 5080 1502700 -852000 1502700 -998000 ) (type protect) ) (wire (path B.Cu 5080 1502700 -706000 1502700 -852000 ) (type protect) ) (wire (path B.Cu 5080 1502700 -998000 1502700 -1144000 ) (type protect) ) ) (net col8 (wire (path F.Cu 5080 2402700 -1214000 2530202 -1341502 2556030 -1341502 2558035 -1339497 2690299 -1339497 2706100 -1355298 2706100 -1364676 2716351 -1374927 2738276 -1374927 ) ) (wire (path F.Cu 5080 1602700 -1144000 1616346 -1130354 2319054 -1130354 2402700 -1214000 ) ) (wire (path B.Cu 5080 2738276 -1374927 2789614 -1426265 2789614 -1459108 2752700 -1496022 2752700 -1721500 ) ) (via "Via[0-1]_889:635_um" 2738276 -1374927 ) (wire (path B.Cu 5080 1552700 -1721500 1552700 -1469835 1625847 -1396688 1625847 -1313147 1602700 -1290000 ) ) (wire (path B.Cu 5080 1602400 -1218250 1602400 -1289700 1602700 -1290000 ) (type protect) ) (wire (path F.Cu 5080 502700 -1290000 524330 -1311630 799625 -1311630 871473 -1239782 1580868 -1239782 1602400 -1218250 ) ) (wire (path B.Cu 5080 1602700 -1144000 1602400 -1144300 1602400 -1218250 ) (type protect) ) (wire (path B.Cu 5080 1602700 -998000 1602700 -1144000 ) (type protect) ) (wire (path B.Cu 5080 1602700 -852000 1602700 -998000 ) (type protect) ) (wire (path B.Cu 5080 1602700 -706000 1602700 -852000 ) (type protect) ) ) (net col9 (wire (path F.Cu 5080 602700 -1290000 616706 -1304006 751379 -1304006 849312 -1206073 1691723 -1206073 1702900 -1217250 ) ) (wire (path F.Cu 5080 1702700 -706000 1724285 -684415 2581115 -684415 2602700 -706000 ) ) (wire (path B.Cu 5080 1702700 -1290000 1652700 -1340000 1652700 -1721500 ) ) (wire (path B.Cu 5080 1702900 -1217250 1702900 -1289800 1702700 -1290000 ) (type protect) ) (wire (path B.Cu 5080 1702700 -1144000 1702900 -1144200 1702900 -1217250 ) (type protect) ) (wire (path B.Cu 5080 1702700 -706000 1702700 -852000 ) (type protect) ) (wire (path B.Cu 5080 1702700 -852000 1702700 -998000 ) (type protect) ) (wire (path B.Cu 5080 1702700 -998000 1702700 -1144000 ) (type protect) ) ) (net i2cgnd (wire (path B.Cu 5080 2328160 -1352300 2302700 -1377760 2302700 -1387300 ) ) ) (net led1 (wire (path B.Cu 5080 1977300 -706000 1990922 -692378 2008236 -692378 2298744 -982886 2298744 -1155102 2420246 -1276604 2551369 -1276604 2629311 -1354546 2629311 -1364982 2621903 -1372390 2578890 -1372390 2566400 -1359900 ) ) (wire (path F.Cu 5080 1879600 -749300 1934000 -749300 1977300 -706000 ) (type protect) ) (wire (path F.Cu 5080 1877300 -749300 1879600 -749300 ) (type protect) ) (wire (path F.Cu 5080 1778000 -749300 1877300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1777300 -749300 1778000 -749300 ) (type protect) ) (wire (path F.Cu 5080 1581150 -749300 1676400 -749300 ) (type protect) ) (wire (path F.Cu 5080 1577300 -749300 1581150 -749300 ) (type protect) ) (wire (path F.Cu 5080 1479550 -749300 1577300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1477300 -749300 1479550 -749300 ) (type protect) ) (wire (path F.Cu 5080 1377950 -749300 1477300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1377300 -749300 1377950 -749300 ) (type protect) ) (wire (path F.Cu 5080 1282700 -749300 1377300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1277300 -749300 1282700 -749300 ) (type protect) ) (wire (path F.Cu 5080 1079500 -749300 1174750 -749300 ) (type protect) ) (wire (path F.Cu 5080 1077300 -749300 1079500 -749300 ) (type protect) ) (wire (path F.Cu 5080 977900 -749300 1077300 -749300 ) (type protect) ) (wire (path F.Cu 5080 977300 -749300 977900 -749300 ) (type protect) ) (wire (path F.Cu 5080 877300 -706000 877300 -748300 878300 -749300 977300 -749300 ) (type protect) ) (wire (path F.Cu 5080 977300 -749300 977900 -749300 ) (type protect) ) (wire (path F.Cu 5080 977300 -706000 977300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1077300 -749300 1079500 -749300 ) (type protect) ) (wire (path F.Cu 5080 1077300 -706000 1077300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1174750 -749300 1177300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1177300 -749300 1277300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1177300 -749300 1174750 -749300 ) (type protect) ) (wire (path F.Cu 5080 1177300 -706000 1177300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1277300 -749300 1282700 -749300 ) (type protect) ) (wire (path F.Cu 5080 1277300 -706000 1277300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1377300 -749300 1377950 -749300 ) (type protect) ) (wire (path F.Cu 5080 1377300 -706000 1377300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1477300 -749300 1479550 -749300 ) (type protect) ) (wire (path F.Cu 5080 1477300 -706000 1477300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1577300 -749300 1581150 -749300 ) (type protect) ) (wire (path F.Cu 5080 1577300 -706000 1577300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1676400 -749300 1677300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1677300 -749300 1777300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1677300 -749300 1676400 -749300 ) (type protect) ) (wire (path F.Cu 5080 1677300 -706000 1677300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1777300 -749300 1778000 -749300 ) (type protect) ) (wire (path F.Cu 5080 1777300 -706000 1777300 -749300 ) (type protect) ) (wire (path F.Cu 5080 1877300 -749300 1879600 -749300 ) (type protect) ) (wire (path F.Cu 5080 1877300 -706000 1877300 -749300 ) (type protect) ) ) (net led2 (wire (path B.Cu 5080 2591800 -1359900 2591800 -1358161 2526283 -1292644 2043088 -1292644 2024637 -1311095 1967529 -1311095 1955411 -1298977 1955411 -873889 1977300 -852000 ) ) (wire (path F.Cu 5080 977300 -889000 977900 -889000 ) (type protect) ) (wire (path F.Cu 5080 977300 -852000 977300 -889000 ) (type protect) ) (wire (path F.Cu 5080 977900 -889000 977300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1581150 -889000 1676400 -889000 ) (type protect) ) (wire (path F.Cu 5080 1577300 -889000 1581150 -889000 ) (type protect) ) (wire (path F.Cu 5080 1377950 -889000 1473200 -889000 ) (type protect) ) (wire (path F.Cu 5080 1377300 -889000 1377950 -889000 ) (type protect) ) (wire (path F.Cu 5080 1079500 -889000 1174750 -889000 ) (type protect) ) (wire (path F.Cu 5080 1077300 -889000 1079500 -889000 ) (type protect) ) (wire (path F.Cu 5080 977900 -889000 1077300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1077300 -889000 1079500 -889000 ) (type protect) ) (wire (path F.Cu 5080 1077300 -852000 1077300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1174750 -889000 1177300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1177300 -889000 1276350 -889000 ) (type protect) ) (wire (path F.Cu 5080 1177300 -889000 1174750 -889000 ) (type protect) ) (wire (path F.Cu 5080 1177300 -852000 1177300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1276350 -889000 1277300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1277300 -889000 1377300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1277300 -889000 1276350 -889000 ) (type protect) ) (wire (path F.Cu 5080 1277300 -852000 1277300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1377300 -889000 1377950 -889000 ) (type protect) ) (wire (path F.Cu 5080 1377300 -852000 1377300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1473200 -889000 1477300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1477300 -889000 1577300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1477300 -889000 1473200 -889000 ) (type protect) ) (wire (path F.Cu 5080 1477300 -852000 1477300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1577300 -889000 1581150 -889000 ) (type protect) ) (wire (path F.Cu 5080 1577300 -852000 1577300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1676400 -889000 1677300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1677300 -889000 1771650 -889000 ) (type protect) ) (wire (path F.Cu 5080 1677300 -889000 1676400 -889000 ) (type protect) ) (wire (path F.Cu 5080 1677300 -852000 1677300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1771650 -889000 1777300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1777300 -889000 1873250 -889000 ) (type protect) ) (wire (path F.Cu 5080 1777300 -889000 1771650 -889000 ) (type protect) ) (wire (path F.Cu 5080 1777300 -852000 1777300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1873250 -889000 1877300 -889000 ) (type protect) ) (wire (path F.Cu 5080 1877300 -889000 1940300 -889000 1977300 -852000 ) (type protect) ) (wire (path F.Cu 5080 1877300 -889000 1873250 -889000 ) (type protect) ) (wire (path F.Cu 5080 1877300 -852000 1877300 -889000 ) (type protect) ) (wire (path F.Cu 5080 977300 -889000 876300 -889000 877300 -888000 877300 -852000 ) (type protect) ) ) (net led3 (wire (path B.Cu 5080 2617200 -1359900 2542321 -1285021 2036122 -1285021 2017672 -1303471 1971192 -1303471 1963365 -1295644 1963365 -1011935 1977300 -998000 ) ) (wire (path F.Cu 5080 1879600 -1047750 1927550 -1047750 1977300 -998000 ) (type protect) ) (wire (path F.Cu 5080 1877300 -1047750 1879600 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1778000 -1047750 1877300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1777300 -1047750 1778000 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1377950 -1047750 1473200 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1377300 -1047750 1377950 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1079500 -1047750 1174750 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1077300 -1047750 1079500 -1047750 ) (type protect) ) (wire (path F.Cu 5080 977900 -1047750 1077300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 977300 -1047750 977900 -1047750 ) (type protect) ) (wire (path F.Cu 5080 877300 -998000 877300 -1046750 878300 -1047750 977300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 977300 -1047750 977900 -1047750 ) (type protect) ) (wire (path F.Cu 5080 977300 -998000 977300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1077300 -1047750 1079500 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1077300 -998000 1077300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1174750 -1047750 1177300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1177300 -1047750 1276350 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1177300 -1047750 1174750 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1177300 -998000 1177300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1276350 -1047750 1277300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1277300 -1047750 1377300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1277300 -1047750 1276350 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1277300 -998000 1277300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1377300 -1047750 1377950 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1377300 -998000 1377300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1473200 -1047750 1477300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1477300 -1047750 1574800 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1477300 -1047750 1473200 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1477300 -998000 1477300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1574800 -1047750 1577300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1577300 -1047750 1676400 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1577300 -1047750 1574800 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1577300 -998000 1577300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1676400 -1047750 1677300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1677300 -1047750 1777300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1677300 -1047750 1676400 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1677300 -998000 1677300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1777300 -1047750 1778000 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1777300 -998000 1777300 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1877300 -1047750 1879600 -1047750 ) (type protect) ) (wire (path F.Cu 5080 1877300 -998000 1877300 -1047750 ) (type protect) ) ) (net led4 (wire (path F.Cu 5080 1956084 -1165216 2307341 -1165216 2491250 -1349125 2559187 -1349125 2560722 -1347590 2630290 -1347590 2642600 -1359900 ) ) (wire (path F.Cu 5080 1956084 -1165216 1977300 -1144000 ) (type protect) ) (wire (path F.Cu 5080 1877300 -1187450 1933850 -1187450 1956084 -1165216 ) (type protect) ) (wire (path F.Cu 5080 1778000 -1187450 1873250 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1777300 -1187450 1778000 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1581150 -1187450 1676400 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1577300 -1187450 1581150 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1479550 -1187450 1577300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1477300 -1187450 1479550 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1377950 -1187450 1477300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1377300 -1187450 1377950 -1187450 ) (type protect) ) (wire (path F.Cu 5080 977900 -1187450 1073150 -1187450 ) (type protect) ) (wire (path F.Cu 5080 977300 -1187450 977900 -1187450 ) (type protect) ) (wire (path F.Cu 5080 877300 -1144000 877300 -1186450 878300 -1187450 977300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 977300 -1187450 977900 -1187450 ) (type protect) ) (wire (path F.Cu 5080 977300 -1144000 977300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1073150 -1187450 1077300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1077300 -1187450 1174750 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1077300 -1187450 1073150 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1077300 -1144000 1077300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1174750 -1187450 1177300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1177300 -1187450 1276350 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1177300 -1187450 1174750 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1177300 -1144000 1177300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1276350 -1187450 1277300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1277300 -1187450 1377300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1277300 -1187450 1276350 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1277300 -1144000 1277300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1377300 -1187450 1377950 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1377300 -1144000 1377300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1477300 -1187450 1479550 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1477300 -1144000 1477300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1577300 -1187450 1581150 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1577300 -1144000 1577300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1676400 -1187450 1677300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1677300 -1187450 1777300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1677300 -1187450 1676400 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1677300 -1144000 1677300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1777300 -1187450 1778000 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1777300 -1144000 1777300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1873250 -1187450 1877300 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1877300 -1187450 1873250 -1187450 ) (type protect) ) (wire (path F.Cu 5080 1877300 -1144000 1877300 -1187450 ) (type protect) ) ) (net led5 (wire (path F.Cu 5080 1977300 -1290000 1978619 -1290000 2027953 -1339334 2161863 -1339334 2163768 -1337429 2420238 -1337429 2455245 -1372436 2655464 -1372436 2668000 -1359900 ) ) (wire (path F.Cu 5080 1879600 -1250950 1938250 -1250950 1977300 -1290000 ) (type protect) ) (wire (path F.Cu 5080 1877300 -1250950 1879600 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1778000 -1250950 1877300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1777300 -1250950 1778000 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1479550 -1250950 1574800 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1477300 -1250950 1479550 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1377950 -1250950 1477300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1377300 -1250950 1377950 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1079500 -1250950 1174750 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1077300 -1250950 1079500 -1250950 ) (type protect) ) (wire (path F.Cu 5080 977900 -1250950 1077300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 977300 -1250950 977900 -1250950 ) (type protect) ) (wire (path F.Cu 5080 877300 -1290000 877300 -1251950 878300 -1250950 977300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 977300 -1250950 977900 -1250950 ) (type protect) ) (wire (path F.Cu 5080 977300 -1290000 977300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1077300 -1250950 1079500 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1077300 -1290000 1077300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1174750 -1250950 1177300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1177300 -1250950 1276350 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1177300 -1250950 1174750 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1177300 -1290000 1177300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1276350 -1250950 1277300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1277300 -1250950 1377300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1277300 -1250950 1276350 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1277300 -1290000 1277300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1377300 -1250950 1377950 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1377300 -1290000 1377300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1477300 -1250950 1479550 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1477300 -1290000 1477300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1574800 -1250950 1577300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1577300 -1250950 1676400 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1577300 -1250950 1574800 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1577300 -1290000 1577300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1676400 -1250950 1677300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1677300 -1250950 1777300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1677300 -1250950 1676400 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1677300 -1290000 1677300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1777300 -1250950 1778000 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1777300 -1290000 1777300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1877300 -1250950 1879600 -1250950 ) (type protect) ) (wire (path F.Cu 5080 1877300 -1290000 1877300 -1250950 ) (type protect) ) ) (net led6 (wire (path B.Cu 5080 2377300 -1211586 2413941 -1248227 2581727 -1248227 2693400 -1359900 ) ) (wire (path B.Cu 5080 2377300 -1211586 2377300 -1214000 ) (type protect) ) (wire (path B.Cu 5080 2377300 -1142000 2377300 -1211586 ) (type protect) ) (wire (path B.Cu 5080 2577300 -742500 2577300 -706000 ) (type protect) ) (wire (path B.Cu 5080 2577300 -779000 2577300 -742500 ) (type protect) ) (wire (path B.Cu 5080 2377300 -742500 2577300 -742500 ) ) (wire (path B.Cu 5080 2377300 -742500 2377300 -779000 ) (type protect) ) (wire (path B.Cu 5080 2377300 -706000 2377300 -742500 ) (type protect) ) (wire (path B.Cu 5080 2377300 -1070000 2377300 -1142000 ) (type protect) ) (wire (path B.Cu 5080 2377300 -998000 2377300 -1070000 ) (type protect) ) (wire (path B.Cu 5080 2377300 -925000 2377300 -998000 ) (type protect) ) (wire (path B.Cu 5080 2377300 -779000 2377300 -852000 ) (type protect) ) (wire (path B.Cu 5080 2377300 -852000 2377300 -925000 ) (type protect) ) (wire (path B.Cu 5080 2577300 -852000 2577300 -779000 ) (type protect) ) (wire (path B.Cu 5080 2577300 -925000 2577300 -852000 ) (type protect) ) ) (net led7 (wire (path B.Cu 5080 2577300 -1197474 2602775 -1197474 2718800 -1313499 2718800 -1359900 ) ) (wire (path B.Cu 5080 2577300 -1197474 2577300 -1217000 ) (type protect) ) (wire (path B.Cu 5080 2577300 -1144000 2577300 -1197474 ) (type protect) ) (wire (path F.Cu 5080 2577300 -998000 2556212 -976912 2356545 -976912 2270459 -1062998 904302 -1062998 677300 -1290000 ) ) (wire (path B.Cu 5080 2777300 -840627 2777300 -852000 ) (type protect) ) (wire (path B.Cu 5080 2777300 -779000 2777300 -840627 ) (type protect) ) (wire (path B.Cu 5080 2577300 -1003875 2596641 -984534 2689309 -984534 2816190 -857653 2816190 -845747 2808832 -838389 2779538 -838389 2777300 -840627 ) ) (wire (path B.Cu 5080 2577300 -1003875 2577300 -1071000 ) (type protect) ) (wire (path B.Cu 5080 2577300 -998000 2577300 -1003875 ) (type protect) ) (wire (path F.Cu 5080 577850 -1250950 638250 -1250950 677300 -1290000 ) (type protect) ) (wire (path B.Cu 5080 2577300 -1071000 2577300 -1144000 ) (type protect) ) (wire (path B.Cu 5080 2777300 -706000 2777300 -779000 ) (type protect) ) (wire (path F.Cu 5080 577300 -1250950 577850 -1250950 ) (type protect) ) (wire (path F.Cu 5080 381000 -1250950 476250 -1250950 ) (type protect) ) (wire (path F.Cu 5080 377300 -1250950 381000 -1250950 ) (type protect) ) (wire (path F.Cu 5080 277300 -1290000 277300 -1253050 279400 -1250950 377300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 377300 -1250950 381000 -1250950 ) (type protect) ) (wire (path F.Cu 5080 377300 -1290000 377300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 476250 -1250950 477300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 477300 -1250950 577300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 477300 -1250950 476250 -1250950 ) (type protect) ) (wire (path F.Cu 5080 477300 -1290000 477300 -1250950 ) (type protect) ) (wire (path F.Cu 5080 577300 -1250950 577850 -1250950 ) (type protect) ) (wire (path F.Cu 5080 577300 -1290000 577300 -1250950 ) (type protect) ) ) (net led8 (wire (path F.Cu 5080 777300 -1055374 2230139 -1055374 2316734 -968779 2592605 -968779 2616544 -992718 2616544 -1077113 2563834 -1129823 2563834 -1150068 2744200 -1330434 2744200 -1359900 ) ) (wire (path F.Cu 5080 777300 -1055374 777300 -1144000 ) ) (wire (path F.Cu 5080 750824 -732476 777300 -758952 777300 -1055374 ) ) (wire (path F.Cu 5080 750824 -732476 734000 -749300 679450 -749300 ) (type protect) ) (wire (path F.Cu 5080 777300 -706000 750824 -732476 ) (type protect) ) (wire (path F.Cu 5080 677300 -749300 679450 -749300 ) (type protect) ) (wire (path F.Cu 5080 577850 -749300 677300 -749300 ) (type protect) ) (wire (path F.Cu 5080 677300 -749300 679450 -749300 ) (type protect) ) (wire (path F.Cu 5080 677300 -706000 677300 -749300 ) (type protect) ) (wire (path F.Cu 5080 577300 -749300 577850 -749300 ) (type protect) ) (wire (path F.Cu 5080 477300 -749300 577300 -749300 ) (type protect) ) (wire (path F.Cu 5080 577300 -749300 577850 -749300 ) (type protect) ) (wire (path F.Cu 5080 577300 -706000 577300 -749300 ) (type protect) ) (wire (path F.Cu 5080 476250 -749300 477300 -749300 ) (type protect) ) (wire (path F.Cu 5080 381000 -749300 476250 -749300 ) (type protect) ) (wire (path F.Cu 5080 477300 -749300 476250 -749300 ) (type protect) ) (wire (path F.Cu 5080 477300 -706000 477300 -749300 ) (type protect) ) (wire (path F.Cu 5080 377300 -749300 381000 -749300 ) (type protect) ) (wire (path F.Cu 5080 277300 -706000 277300 -747200 279400 -749300 377300 -749300 ) (type protect) ) (wire (path F.Cu 5080 377300 -749300 381000 -749300 ) (type protect) ) (wire (path F.Cu 5080 377300 -706000 377300 -749300 ) (type protect) ) ) (net row1 (wire (path F.Cu 5080 1690000 -1599000 1790000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 1590000 -1599000 1690000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 1490000 -1599000 1590000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 990000 -1599000 1090000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 890000 -1599000 990000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 1390000 -1599000 1490000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 1290000 -1599000 1390000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 1090000 -1599000 1190000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 1190000 -1599000 1290000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 1790000 -1599000 1841500 -1599000 ) (type protect) ) (wire (path F.Cu 5080 1890000 -1599000 1990000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 1841500 -1599000 1890000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 1854400 -1484500 1854400 -1485700 1841500 -1498600 1841500 -1599000 ) (type protect) ) ) (net row2 (wire (path F.Cu 5080 690000 -1599000 740000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 590000 -1599000 690000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 490000 -1599000 590000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 390000 -1599000 490000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 290000 -1599000 390000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 740000 -1599000 790000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 751900 -1485000 751900 -1488100 740000 -1500000 740000 -1599000 ) (type protect) ) ) (net row3 (wire (path F.Cu 5080 2390000 -1599000 2490000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 2341000 -1599000 2390000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 2490000 -1599000 2590000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 2190000 -1599000 2290000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 2090000 -1599000 2190000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 2590000 -1599000 2690000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 2690000 -1599000 2790000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 2290000 -1599000 2341000 -1599000 ) (type protect) ) (wire (path F.Cu 5080 2328100 -1484500 2328100 -1486100 2341000 -1499000 2341000 -1599000 ) (type protect) ) ) (net scl (wire (path B.Cu 5080 2353560 -1352300 2353500 -1352360 2353500 -1387300 ) ) ) (net sda (wire (path B.Cu 5080 2378960 -1352300 2378900 -1352360 2378900 -1387300 ) ) ) (net xled1 (wire (path B.Cu 5080 2554332 -1436100 2543552 -1436100 2525348 -1454304 2478391 -1454304 2470768 -1461927 2318219 -1461927 2283418 -1496728 2025815 -1496728 1947100 -1418013 1947100 -1412700 ) ) (wire (path B.Cu 5080 2566400 -1436100 2554332 -1436100 ) ) ) (net xled2 (wire (path F.Cu 5080 1997977 -1484318 2010670 -1497011 2309695 -1497011 ) ) (wire (path B.Cu 5080 2543781 -1454496 2536350 -1461927 2485361 -1461927 2477738 -1469550 2324070 -1469550 2309695 -1483925 2309695 -1497011 ) ) (wire (path B.Cu 5080 1921700 -1412700 1926359 -1412700 1997977 -1484318 ) ) (via "Via[0-1]_889:635_um" 1997977 -1484318 ) (via "Via[0-1]_889:635_um" 2309695 -1497011 ) (via "Via[0-1]_889:635_um" 2543781 -1454496 ) (wire (path F.Cu 5080 2591800 -1436100 2573404 -1454496 2543781 -1454496 ) ) ) (net xled3 (wire (path B.Cu 5080 2226500 -1387300 2283098 -1330702 2501022 -1330702 2550270 -1379950 2561050 -1379950 2617200 -1436100 ) ) ) (net xled4 (wire (path F.Cu 5080 2226500 -1412700 2251345 -1437545 2357427 -1437545 2383931 -1464049 2614651 -1464049 2642600 -1436100 ) ) ) (net xled5 (wire (path F.Cu 5080 2201100 -1412700 2234299 -1445899 2328702 -1445899 2354813 -1472010 2632090 -1472010 2668000 -1436100 ) ) ) (net xled6 (wire (path F.Cu 5080 2150300 -1412700 2191122 -1453522 2325543 -1453522 2351898 -1479877 2649623 -1479877 2693400 -1436100 ) ) ) (net xled7 (wire (path F.Cu 5080 2022186 -1347112 2298694 -1347112 2322296 -1370714 2412024 -1370714 2431640 -1390330 2431640 -1413751 2469174 -1451285 2505155 -1451285 2532470 -1423970 2706670 -1423970 2718800 -1436100 ) ) (via "Via[0-1]_889:635_um" 2022186 -1347112 ) (wire (path B.Cu 5080 1947100 -1387300 1987288 -1347112 2022186 -1347112 ) ) ) (net xled8 (wire (path B.Cu 5080 2744200 -1436100 2732044 -1448256 2586543 -1448256 2578469 -1440182 2578469 -1426868 2489927 -1338326 2300874 -1338326 2251900 -1387300 ) ) ) ) ) ) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 | (kicad_pcb (version 3) (host pcbnew "(2013-07-07 BZR 4022)-stable") (general (links 0) (no_connects 0) (area 8.849999 64.049999 290.550001 175.050001) (thickness 1.6) (drawings 21) (tracks 0) (zones 0) (modules 91) (nets 1) ) (page A4) (layers (15 F.Cu signal) (0 B.Cu signal) (16 B.Adhes user) (17 F.Adhes user) (18 B.Paste user) (19 F.Paste user) (20 B.SilkS user) (21 F.SilkS user) (22 B.Mask user) (23 F.Mask user) (24 Dwgs.User user) (25 Cmts.User user) (26 Eco1.User user) (27 Eco2.User user) (28 Edge.Cuts user) ) (setup (last_trace_width 0.508) (trace_clearance 0.254) (zone_clearance 0.508) (zone_45_only no) (trace_min 0.254) (segment_width 0.1) (edge_width 0.1) (via_size 0.889) (via_drill 0.635) (via_min_size 0.889) (via_min_drill 0.508) (uvia_size 0.508) (uvia_drill 0.127) (uvias_allowed no) (uvia_min_size 0.508) (uvia_min_drill 0.127) (pcb_text_width 0.3) (pcb_text_size 1.5 1.5) (mod_edge_width 0.01) (mod_text_size 1 1) (mod_text_width 0.15) (pad_size 2.032 1.032) (pad_drill 0) (pad_to_mask_clearance 0) (aux_axis_origin 0 0) (visible_elements 7FFFFB3F) (pcbplotparams (layerselection 278953984) (usegerberextensions true) (excludeedgelayer false) (linewidth 0.150000) (plotframeref false) (viasonmask false) (mode 1) (useauxorigin false) (hpglpennumber 1) (hpglpenspeed 20) (hpglpendiameter 15) (hpglpenoverlay 2) (psnegative false) (psa4output false) (plotreference true) (plotvalue true) (plotothertext true) (plotinvisibletext false) (padsonsilk false) (subtractmaskfromsilk true) (outputformat 1) (mirror false) (drillshape 0) (scaleselection 1) (outputdirectory gerber20190414/cover8/)) ) (net 0 "") (net_class Default "This is the default net class." (clearance 0.254) (trace_width 0.508) (via_dia 0.889) (via_drill 0.635) (uvia_dia 0.508) (uvia_drill 0.127) (add_net "") ) (net_class Strong "" (clearance 0.381) (trace_width 0.508) (via_dia 0.889) (via_drill 0.635) (uvia_dia 0.508) (uvia_drill 0.127) ) (module 1PIN_SMD (layer F.Cu) (tedit 5CD9B0D5) (tstamp 5CDA6C90) (at 286.5 128.5) (descr "module 1 pin (ou trou mecanique de percage)") (tags DEV) (path 1pin) (fp_text reference 1PIN_SMD (at 0 -3.50012) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_text value P*** (at 0.24892 3.74904) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (pad 1 smd rect (at 0 0) (size 2.032 1.032) (layers F.Cu F.Paste F.SilkS F.Mask) ) ) (module 1PIN_SMD (layer F.Cu) (tedit 5CD9B061) (tstamp 5CDA6C02) (at 283.5 128.5) (descr "module 1 pin (ou trou mecanique de percage)") (tags DEV) (path 1pin) (fp_text reference 1PIN_SMD (at 0 -3.50012) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (fp_text value P*** (at 0.24892 3.74904) (layer F.SilkS) hide (effects (font (size 1.016 1.016) (thickness 0.254))) ) (pad 1 smd rect (at 0 0) (size 2.032 1.032) (layers F.Cu F.Paste F.SilkS F.Mask) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F22E4) (at 169 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5B2) (fp_text reference DMB9 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F22CB) (at 179 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5B8) (fp_text reference DMB10 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F22B2) (at 189 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5BE) (fp_text reference DMB11 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2299) (at 199 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5C4) (fp_text reference DMB12 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2280) (at 89 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5CC) (fp_text reference DAC1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2267) (at 99 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5E5) (fp_text reference DAC2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F224E) (at 109 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5EB) (fp_text reference DAC3 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2235) (at 119 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5F1) (fp_text reference DAC4 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F221C) (at 129 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5F7) (fp_text reference DAC5 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2203) (at 139 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5FD) (fp_text reference DAC6 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F21EA) (at 149 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF603) (fp_text reference DAC7 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F21D1) (at 159 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF609) (fp_text reference DAC8 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F21B8) (at 169 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF60F) (fp_text reference DAC9 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F219F) (at 179 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF615) (fp_text reference DAC10 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2186) (at 89 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF34A) (fp_text reference DPC1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F216D) (at 199 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF621) (fp_text reference DAC12 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2154) (at 89 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF629) (fp_text reference DMQ1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F213B) (at 99 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF642) (fp_text reference DMQ2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2122) (at 109 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF648) (fp_text reference DMQ3 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2109) (at 119 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF64E) (fp_text reference DMQ4 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F20F0) (at 129 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF654) (fp_text reference DMQ5 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F20D7) (at 139 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF65A) (fp_text reference DMQ6 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F20BE) (at 149 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF660) (fp_text reference DMQ7 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F20A5) (at 159 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF666) (fp_text reference DMQ8 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F208C) (at 169 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF66C) (fp_text reference DMQ9 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2073) (at 179 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF672) (fp_text reference DMQ10 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F205A) (at 189 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF678) (fp_text reference DMQ11 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2041) (at 199 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF67E) (fp_text reference DMQ12 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F2028) (at 79 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF686) (fp_text reference DLINK1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F200F) (at 29 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6A1) (fp_text reference DSC1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1FF6) (at 189 114.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF61B) (fp_text reference DAC11 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1FDD) (at 99 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF399) (fp_text reference DPC2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1FC4) (at 109 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3AC) (fp_text reference DPC3 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1FAB) (at 119 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3B2) (fp_text reference DPC4 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1F92) (at 129 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3B8) (fp_text reference DPC5 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1F79) (at 139 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3BE) (fp_text reference DPC6 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1F60) (at 149 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3C4) (fp_text reference DPC7 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1F47) (at 159 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3CA) (fp_text reference DPC8 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1F2E) (at 169 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3D0) (fp_text reference DPC9 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1F15) (at 179 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3D6) (fp_text reference DPC10 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1EFC) (at 189 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3DC) (fp_text reference DPC11 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1EE3) (at 199 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF3E2) (fp_text reference DPC12 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1ECA) (at 89 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF463) (fp_text reference DMA1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1EB1) (at 99 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF47C) (fp_text reference DMA2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1E98) (at 109 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF482) (fp_text reference DMA3 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1E7F) (at 159 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5AC) (fp_text reference DMB8 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1E66) (at 129 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF48E) (fp_text reference DMA5 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1E4D) (at 139 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF494) (fp_text reference DMA6 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1E34) (at 149 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF49A) (fp_text reference DMA7 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1E1B) (at 159 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF4A0) (fp_text reference DMA8 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1E02) (at 169 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF4A6) (fp_text reference DMA9 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1DE9) (at 179 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF4AC) (fp_text reference DMA10 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1DD0) (at 189 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF4B2) (fp_text reference DMA11 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1DB7) (at 199 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF4B8) (fp_text reference DMA12 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1D9E) (at 89 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF56F) (fp_text reference DMB1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1D85) (at 99 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF588) (fp_text reference DMB2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1D6C) (at 109 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF58E) (fp_text reference DMB3 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1D53) (at 119 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF594) (fp_text reference DMB4 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1D3A) (at 129 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF59A) (fp_text reference DMB5 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1D21) (at 139 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5A0) (fp_text reference DMB6 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1D08) (at 149 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF5A6) (fp_text reference DMB7 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1CEF) (at 119 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF488) (fp_text reference DMA4 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1CD6) (at 279 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF843) (fp_text reference DRUN1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1CBD) (at 279 77.9) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF83D) (fp_text reference DPAUSE1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1CA4) (at 279 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF837) (fp_text reference DION1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1C8B) (at 259 107.1) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7E9) (fp_text reference DBREAK1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1C72) (at 259 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7E3) (fp_text reference DCURAD1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1C59) (at 259 92.5) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7DD) (fp_text reference DWRDCT1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1C40) (at 259 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7D7) (fp_text reference DDEFER1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1C27) (at 259 77.9) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7D1) (fp_text reference DEXEC1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1C0E) (at 259 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF7CB) (fp_text reference DFETCH1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1BF5) (at 239 121.4) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF789) (fp_text reference DOPR1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1BDC) (at 239 114.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF783) (fp_text reference DIOT1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1BC3) (at 239 107) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF77D) (fp_text reference DJMP1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1BAA) (at 239 99.8) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF777) (fp_text reference DJMS1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1B91) (at 239 92.5) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF741) (fp_text reference DDCA1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1B78) (at 39 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6BA) (fp_text reference DSC2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1B5F) (at 59 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6C6) (fp_text reference DSC4 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1B46) (at 69 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6CC) (fp_text reference DSC5 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1B14) (at 29 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6DA) (fp_text reference DDF1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1AFB) (at 39 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6F3) (fp_text reference DDF2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1AE2) (at 49 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6F9) (fp_text reference DDF3 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1AC9) (at 49 129) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF6C0) (fp_text reference DSC3 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1AB0) (at 239 77.9) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF735) (fp_text reference DTAD1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1A97) (at 239 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF728) (fp_text reference DAND1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1A7E) (at 239 85.2) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF73B) (fp_text reference DISZ1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1A65) (at 69 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF71A) (fp_text reference DIF2 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1A4C) (at 79 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF720) (fp_text reference DIF3 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (module PIDP8-LED-COVER (layer F.Cu) (tedit 5C1F8BDD) (tstamp 548F1A33) (at 59 70.6) (descr "LED 3mm - Lead pitch 100mil (2,54mm)") (tags "LED led 3mm 3MM 100mil 2,54mm") (path /548EF701) (fp_text reference DIF1 (at 0 -5.5372) (layer F.SilkS) hide (effects (font (size 0.7 0.7) (thickness 0.025))) ) (fp_text value LED (at 0 2.54) (layer F.SilkS) hide (effects (font (size 0.762 0.762) (thickness 0.0889))) ) (pad "" np_thru_hole circle (at 0 0) (size 5.03 5.03) (drill 4.85) (layers *.Cu F.Mask) ) (model discret/leds/led3_vertical_verde.wrl (at (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)) ) ) (gr_text PiDP-8 (at 285 127) (layer F.SilkS) (effects (font (size 0.8 0.9) (thickness 0.2))) ) (gr_line (start 290 64.1) (end 290 65.3) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 19.6 64.1) (end 290 64.1) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 19.6 65.3) (end 19.6 64.1) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 19.6 121.5) (end 71.5 121.5) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 290 135.8) (end 290 65.8) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 19.6 135.8) (end 290 135.8) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 19.6 121.5) (end 19.6 135.8) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 19.6 78) (end 71.5 78) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 290 65.3) (end 290 65.8) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 19.6 65.8) (end 19.6 65.3) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 19.6 78) (end 19.6 65.8) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 71.5 78) (end 71.5 121.5) (angle 90) (layer Edge.Cuts) (width 0.1)) (gr_line (start 9.5 65.8) (end 8.9 65.8) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 9.5 65.2) (end 9.5 65.8) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 9.5 174.5) (end 9.5 174.9) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 9.1 174.5) (end 9.5 174.5) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 290 174.5) (end 290 175) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 290.5 174.5) (end 290 174.5) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 290 65.8) (end 290.4 65.8) (angle 90) (layer Dwgs.User) (width 0.1)) (gr_line (start 290 65.4) (end 290 65.8) (angle 90) (layer Dwgs.User) (width 0.1)) ) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | update=12/23/2018 2:18:31 PM last_client=pcbnew [pcbnew] version=1 LastNetListRead= UseCmpFile=1 PadDrill=1.700000000000 PadDrillOvalY=1.700000000000 PadSizeH=2.500000000000 PadSizeV=2.500000000000 PcbTextSizeV=1.500000000000 PcbTextSizeH=1.500000000000 PcbTextThickness=0.300000000000 ModuleTextSizeV=1.000000000000 ModuleTextSizeH=1.000000000000 ModuleTextSizeThickness=0.150000000000 SolderMaskClearance=0.000000000000 SolderMaskMinWidth=0.000000000000 DrawSegmentWidth=0.100000000000 BoardOutlineThickness=0.100000000000 ModuleOutlineThickness=0.010000000000 [pcbnew/libraries] LibDir= LibName1=sockets LibName2=connect LibName3=discret LibName4=pin_array LibName5=divers LibName6=smd_capacitors LibName7=smd_resistors LibName8=smd_crystal&oscillator LibName9=smd_dil LibName10=smd_transistors LibName11=libcms LibName12=display LibName13=led LibName14=dip_sockets LibName15=pga_sockets LibName16=valves LibName17=customlibraries/pdp8footprintlib2 |
> > > > > > > | 1 2 3 4 5 6 7 | EESchema-DOCLIB Version 2.0 Date: 19/01/2015 21:56:03 # $CMP UDN2981A D UDN2981A $ENDCMP # #End Doc Library |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | EESchema-LIBRARY Version 2.3 Date: 19/01/2015 21:56:03 #encoding utf-8 # # CONN_20X2 # DEF CONN_20X2 P 0 10 Y N 1 F N F0 "P" 0 1050 60 H V C CNN F1 "CONN_20X2" 0 0 50 V V C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN DRAW S -100 1000 100 -1000 0 1 0 N X P1 1 -400 950 300 R 60 30 1 1 P I X P2 2 400 950 300 L 60 30 1 1 P I X P3 3 -400 850 300 R 60 30 1 1 P I X P4 4 400 850 300 L 60 30 1 1 P I X P5 5 -400 750 300 R 60 30 1 1 P I X P6 6 400 750 300 L 60 30 1 1 P I X P7 7 -400 650 300 R 60 30 1 1 P I X P8 8 400 650 300 L 60 30 1 1 P I X P9 9 -400 550 300 R 60 30 1 1 P I X P10 10 400 550 300 L 60 30 1 1 P I X P20 20 400 50 300 L 60 30 1 1 P I X P30 30 400 -450 300 L 60 30 1 1 P I X P40 40 400 -950 300 L 60 30 1 1 P I X P11 11 -400 450 300 R 60 30 1 1 P I X P21 21 -400 -50 300 R 60 30 1 1 P I X P31 31 -400 -550 300 R 60 30 1 1 P I X P12 12 400 450 300 L 60 30 1 1 P I X P22 22 400 -50 300 L 60 30 1 1 P I X P32 32 400 -550 300 L 60 30 1 1 P I X P13 13 -400 350 300 R 60 30 1 1 P I X P23 23 -400 -150 300 R 60 30 1 1 P I X P33 33 -400 -650 300 R 60 30 1 1 P I X P14 14 400 350 300 L 60 30 1 1 P I X P24 24 400 -150 300 L 60 30 1 1 P I X P34 34 400 -650 300 L 60 30 1 1 P I X P15 15 -400 250 300 R 60 30 1 1 P I X ~ 25 -400 -250 300 R 60 30 1 1 P I X P35 35 -400 -750 300 R 60 30 1 1 P I X P16 16 400 250 300 L 60 30 1 1 P I X P26 26 400 -250 300 L 60 30 1 1 P I X P36 36 400 -750 300 L 60 30 1 1 P I X P17 17 -400 150 300 R 60 30 1 1 P I X P27 27 -400 -350 300 R 60 30 1 1 P I X P37 37 -400 -850 300 R 60 30 1 1 P I X P18 18 400 150 300 L 60 30 1 1 P I X P28 28 400 -350 300 L 60 30 1 1 P I X P38 38 400 -850 300 L 60 30 1 1 P I X P19 19 -400 50 300 R 60 30 1 1 P I X P29 29 -400 -450 300 R 60 30 1 1 P I X P39 39 -400 -950 300 R 60 30 1 1 P I ENDDRAW ENDDEF # # RASPI_MODEL_B_PLUS_GPIO # DEF RASPI_MODEL_B_PLUS_GPIO P 0 10 Y Y 1 F N F0 "P" 0 1050 60 H V C CNN F1 "RASPI_MODEL_B_PLUS_GPIO" 0 0 20 V V C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN DRAW S -100 1000 100 -1000 0 1 0 N X 3.3v 1 -400 950 300 R 60 30 1 1 w I X 5v 2 400 950 300 L 60 30 1 1 w I X g2 3 -400 850 300 R 60 30 1 1 P I X 5v 4 400 850 300 L 60 30 1 1 P I X g3 5 -400 750 300 R 60 30 1 1 P I X GND 6 400 750 300 L 60 30 1 1 w I X g4 7 -400 650 300 R 60 30 1 1 P I X g14 8 400 650 300 L 60 30 1 1 P I X GND 9 -400 550 300 R 60 30 1 1 P I X g15 10 400 550 300 L 60 30 1 1 P I X GND 20 400 50 300 L 60 30 1 1 P I X GND 30 400 -450 300 L 60 30 1 1 P I X g21 40 400 -950 300 L 60 30 1 1 P I X g17 11 -400 450 300 R 60 30 1 1 P I X g9 21 -400 -50 300 R 60 30 1 1 P I X g6 31 -400 -550 300 R 60 30 1 1 P I X g18 12 400 450 300 L 60 30 1 1 P I X g25 22 400 -50 300 L 60 30 1 1 P I X g12 32 400 -550 300 L 60 30 1 1 P I X g27 13 -400 350 300 R 60 30 1 1 P I X g11 23 -400 -150 300 R 60 30 1 1 P I X g13 33 -400 -650 300 R 60 30 1 1 P I X GND 14 400 350 300 L 60 30 1 1 P I X g8 24 400 -150 300 L 60 30 1 1 P I X GND 34 400 -650 300 L 60 30 1 1 P I X g22 15 -400 250 300 R 60 30 1 1 P I X GND 25 -400 -250 300 R 60 30 1 1 P I X g19 35 -400 -750 300 R 60 30 1 1 P I X g23 16 400 250 300 L 60 30 1 1 P I X g7 26 400 -250 300 L 60 30 1 1 P I X g16 36 400 -750 300 L 60 30 1 1 P I X 3.3v 17 -400 150 300 R 60 30 1 1 P I X n/c 27 -400 -350 300 R 60 30 1 1 P I X g26 37 -400 -850 300 R 60 30 1 1 P I X g24 18 400 150 300 L 60 30 1 1 P I X n/c 28 400 -350 300 L 60 30 1 1 P I X g20 38 400 -850 300 L 60 30 1 1 P I X g10 19 -400 50 300 R 60 30 1 1 P I X g5 29 -400 -450 300 R 60 30 1 1 P I X GND 39 -400 -950 300 R 60 30 1 1 P I ENDDRAW ENDDEF # # UDN2981A # DEF UDN2981A P 0 40 Y Y 1 F N F0 "P" 0 550 30 H V C CNN F1 "UDN2981A" 0 -550 30 H V C CNN F2 "~" 0 0 60 H V C CNN F3 "~" 0 0 60 H V C CNN DRAW S -150 500 150 -500 0 1 0 N X IN1 1 -350 400 200 R 40 20 1 1 I I X IN2 2 -350 300 200 R 40 20 1 1 I I X IN3 3 -350 200 200 R 40 20 1 1 I I X IN4 4 -350 100 200 R 40 20 1 1 I I X IN5 5 -350 0 200 R 40 20 1 1 I I X IN6 6 -350 -100 200 R 40 20 1 1 I I X IN7 7 -350 -200 200 R 40 20 1 1 I I X IN8 8 -350 -300 200 R 40 20 1 1 I I X Vs 9 -350 -400 200 R 40 20 1 1 P I X GND 10 350 -400 200 L 40 20 1 1 P I X OUT8 11 350 -300 200 L 40 20 1 1 O I X OUT7 12 350 -200 200 L 40 20 1 1 O I X OUT6 13 350 -100 200 L 40 20 1 1 O I X OUT5 14 350 0 200 L 40 20 1 1 O I X OUT4 15 350 100 200 L 40 20 1 1 O I X OUT3 16 350 200 200 L 40 20 1 1 O I X OUT2 17 350 300 200 L 40 20 1 1 O I X OUT1 18 350 400 200 L 40 20 1 1 O I ENDDRAW ENDDEF # #End Library |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | PCBNEW-LibModule-V1 15/12/2014 18:10:47 # encoding utf-8 Units mm $INDEX SW_SPDT $EndINDEX $MODULE SW_SPDT Po 0 0 0 15 548F15A7 00000000 ~~ Li SW_SPDT Cd Switch inverseur Kw SWITCH DEV Sc 0 AR Op 0 0 0 T0 3.5 7.9 1.016 1.016 900 0.2032 N V 21 N "SW_KND2_1x2" T1 -0.05 -20.3 1.016 1.016 0 0.2032 N V 21 N "SW*" DS -4.75 -18.9 -4.75 18.9 0.15 21 DS -4.75 18.9 4.75 18.9 0.15 21 DS 4.75 18.9 4.75 -18.9 0.15 21 DS 4.75 -18.9 -4.75 -18.9 0.15 21 DS -4.75 -10.3 -4.75 10.3 0.15 21 DS -4.75 10.3 4.75 10.3 0.15 21 DS 4.75 10.3 4.75 -10.3 0.15 21 DS 4.75 -10.3 -4.75 -10.3 0.15 21 $PAD Sh "2" O 3.81 2.54 0 0 0 Dr 2.5 0 0 O 2.5 0.8 At STD N 00E0FFFF Ne 0 "" Po 0 0 $EndPAD $PAD Sh "1" O 3.81 2.54 0 0 0 Dr 2.5 0 0 O 2.5 0.8 At STD N 00E0FFFF Ne 0 "" Po 0 -5.58 $EndPAD $PAD Sh "3" O 3.81 2.54 0 0 0 Dr 2.5 0 0 O 2.5 0.8 At STD N 00E0FFFF Ne 0 "" Po 0 5.58 $EndPAD $PAD Sh "H1" C 4 4 0 0 0 Dr 3 0 0 At STD N 00E0FFFF Ne 0 "" Po 0 -15 $EndPAD $PAD Sh "H2" C 4 4 0 0 0 Dr 3 0 0 At STD N 00E0FFFF Ne 0 "" Po 0 15 $EndPAD $EndMODULE SW_SPDT $EndLIBRARY |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 | PCBNEW-LibModule-V1 4/14/2019 9:38:47 PM # encoding utf-8 Units mm $INDEX D2 LED-3-PDP LED-3-StrEight M3_WIDE PIDP8-LED-COVER RASPI_BPLUS RASPI_BPLUS_MIRRORED SIL-3PDP SIL-5PDP SW_KND2 SW_KND2_PDP SW_KND2_PDP2 SW_PIDP2019 SW_RLS_MOUNT SW_RLS_PIDP $EndINDEX $MODULE D2 Po 0 0 0 15 54B29F05 00000000 ~~ Li D2 Cd Diode 3 pas Kw DIODE DEV Sc 0 AR Op 0 0 0 T0 0 -0.508 0.25 0.25 0 0.05 N V 21 N "D2" T1 -0.508 0.508 0.381 0.381 0 0.0762 N I 21 N "D***" DS -2.032 1.016 2.032 1.016 0.3048 21 DS -2.032 -1.016 2.032 -1.016 0.3048 21 DS 2.794 0 2.032 0 0.3048 21 DS 2.032 0 2.032 -1.016 0.3048 21 DS -2.032 -1.016 -2.032 0 0.3048 21 DS -2.032 0 -2.794 0 0.3048 21 DS -2.032 0 -2.032 1.016 0.3048 21 DS 2.032 1.016 2.032 0 0.3048 21 DS 1.524 -1.016 1.524 1.016 0.3048 21 DS 1.27 1.016 1.27 -1.016 0.3048 21 $PAD Sh "2" R 1.397 1.397 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 0 "" Po 3.556 0 $EndPAD $PAD Sh "1" C 1.397 1.397 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 0 "" Po -3.81 0 $EndPAD $SHAPE3D Na "discret/diode.wrl" Sc 0.3 0.3 0.3 Of 0 0 0 Ro 0 0 0 $EndSHAPE3D $EndMODULE D2 $MODULE LED-3-PDP Po 0 0 0 15 54BD7621 00000000 ~~ Li LED-3-PDP Cd LED 3mm - Lead pitch 100mil (2,54mm) Kw LED led 3mm 3MM 100mil 2,54mm Sc 0 AR /548EF4B8 Op 0 0 0 T0 0 -5.5372 0.7 0.7 0 0.025 N V 21 N "DMA12" T1 0 2.54 0.762 0.762 0 0.0889 N I 21 N "LED" DS -2.4 1.5 -2.4 -1.5 0.15 21 DS 1.5 2.4 -1.5 2.4 0.15 21 DS 2.4 -1.5 2.4 1.5 0.15 21 DS -1.5 -2.4 1.5 -2.4 0.15 21 DA -1.5 1.5 -1.5 2.4 900 0.15 21 DA 1.5 1.5 2.4 1.5 900 0.15 21 DA -1.5 -1.5 -2.4 -1.5 900 0.15 21 DA 1.5 -1.5 1.5 -2.4 900 0.15 21 $PAD Sh "1" C 1.6764 1.6764 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 2 "led2" Po -1.27 0 $EndPAD $PAD Sh "2" C 1.6764 1.6764 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 1 "N-000004" Po 1.27 0 $EndPAD $SHAPE3D Na "discret/leds/led3_vertical_verde.wrl" Sc 1 1 1 Of 0 0 0 Ro 0 0 0 $EndSHAPE3D $EndMODULE LED-3-PDP $MODULE LED-3-StrEight Po 0 0 0 15 554E561D 00000000 ~~ Li LED-3-StrEight Cd LED Kw LED Sc 0 AR /548EF4B8 Op 0 0 0 T0 0 -5.5372 0.7 0.7 0 0.025 N I 21 N "Str8" T1 0 2.54 0.762 0.762 0 0.0889 N I 21 N "LED" $PAD Sh "1" C 1.6764 1.6764 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 2 "led2" Po -1.27 0 $EndPAD $PAD Sh "2" C 1.6764 1.6764 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 1 "N-000004" Po 1.27 0 $EndPAD $SHAPE3D Na "discret/leds/led3_vertical_verde.wrl" Sc 1 1 1 Of 0 0 0 Ro 0 0 0 $EndSHAPE3D $EndMODULE LED-3-StrEight $MODULE M3_WIDE Po 0 0 0 15 568BEC97 00000000 ~~ Li M3_WIDE Cd Wide M3 Kw DEV Sc 0 AR 1pin Op 0 0 0 T0 0 -3.048 1.016 1.016 0 0.254 N I 21 N "1PIN" T1 0 2.794 1.016 1.016 0 0.254 N I 21 N "P***" $PAD Sh "" C 4.064 4.064 0 0 0 Dr 3.15 0 0 At STD N 00E0FFFF Ne 0 "" Po 0 0 $EndPAD $EndMODULE M3_WIDE $MODULE PIDP8-LED-COVER Po 0 0 0 15 5C1F8BDD 00000000 ~~ Li PIDP8-LED-COVER Cd LED 3mm - Lead pitch 100mil (2,54mm) Kw LED led 3mm 3MM 100mil 2,54mm Sc 0 AR /548EF4B8 Op 0 0 0 T0 0 -5.5372 0.7 0.7 0 0.025 N I 21 N "DMA12" T1 0 2.54 0.762 0.762 0 0.0889 N I 21 N "LED" $PAD Sh "" C 5.03 5.03 0 0 0 Dr 4.85 0 0 At HOLE N 0080FFFF Ne 0 "" Po 0 0 $EndPAD $SHAPE3D Na "discret/leds/led3_vertical_verde.wrl" Sc 1 1 1 Of 0 0 0 Ro 0 0 0 $EndSHAPE3D $EndMODULE PIDP8-LED-COVER $MODULE RASPI_BPLUS Po 0 0 0 15 54B191EE 00000000 ~~ Li RASPI_BPLUS Cd Double rangee de contacts 2 x 12 pins Kw CONN Sc 0 AR Op 0 0 0 T0 0 -3.81 1.016 1.016 0 0.27432 N V 21 N "REF*" T1 0 3.81 1.016 1.016 0 0.2032 N V 21 N "PIN_ARRAY_20X2" T2 8 26.5 1 1 0 0.15 N V 21 N "GPIO and mount holes exact, port placement approx." T2 6 20.5 1 1 0 0.15 N V 21 N "COMPONENT SIDE (TOP)" T2 -19 48 1 1 0 0.15 N V 21 N "microUSB" DS -22 52.5 -22 49 0.15 21 DS -22 49 -16 52.5 0.15 21 DS -16 52.5 -16 49 0.15 21 DS -16 49 -22 52.5 0.15 21 T2 0 49 1 1 0 0.15 N V 21 N "HDMI" DS -7 52.5 -7 48.5 0.15 21 DS -7 48.5 6 52.5 0.15 21 DS 6 52.5 6 48.5 0.15 21 DS 6 48.5 -7 52.5 0.15 21 T2 50.5 24 1 1 900 0.15 N V 21 N "USB" T2 50.5 7 1 1 900 0.15 N V 21 N "USB" DS 50.5 18.5 55 18.5 0.15 21 DS 55 18.5 55 29.5 0.15 21 DS 55 29.5 51 29.5 0.15 21 DS 50.5 1.5 55 1.5 0.15 21 DS 55 1.5 55 13 0.15 21 DS 55 13 50.5 13 0.15 21 DS -32.5 -3.5 52.5 -3.5 0.15 21 DS 52.5 -3.5 52.5 52.5 0.15 21 DS 52.5 52.5 32 52.5 0.15 21 DS -32.5 -3.5 -32.5 52.5 0.15 21 DS -32.5 52.5 32.5 52.5 0.15 21 DS 25.4 2.54 -25.4 2.54 0.3048 21 DS 25.4 -2.54 -25.4 -2.54 0.3048 21 DS 25.4 -2.54 25.4 2.54 0.3048 21 DS -25.4 -2.54 -25.4 2.54 0.3048 21 $PAD Sh "1" R 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po -24.13 1.27 $EndPAD $PAD Sh "2" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 1 "GND" Po -24.13 -1.27 $EndPAD $PAD Sh "11" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 18 "PA8_1" Po -11.43 1.27 $EndPAD $PAD Sh "4" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 11 "PA1_1" Po -21.59 -1.27 $EndPAD $PAD Sh "13" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 5 "PA10_1" Po -8.89 1.27 $EndPAD $PAD Sh "6" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 13 "PA3_1" Po -19.05 -1.27 $EndPAD $PAD Sh "15" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 7 "PA12_1" Po -6.35 1.27 $EndPAD $PAD Sh "8" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 15 "PA5_1" Po -16.51 -1.27 $EndPAD $PAD Sh "17" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 9 "PA14_1" Po -3.81 1.27 $EndPAD $PAD Sh "10" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 17 "PA7_1" Po -13.97 -1.27 $EndPAD $PAD Sh "19" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po -1.27 1.27 $EndPAD $PAD Sh "12" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 19 "PA9_1" Po -11.43 -1.27 $EndPAD $PAD Sh "21" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 1.27 1.27 $EndPAD $PAD Sh "14" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 6 "PA11_1" Po -8.89 -1.27 $EndPAD $PAD Sh "23" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 2 "INT1_1" Po 3.81 1.27 $EndPAD $PAD Sh "16" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 8 "PA13_1" Po -6.35 -1.27 $EndPAD $PAD Sh "25" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 6.35 1.27 $EndPAD $PAD Sh "18" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 10 "PA15_1" Po -3.81 -1.27 $EndPAD $PAD Sh "27" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 8.89 1.27 $EndPAD $PAD Sh "20" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po -1.27 -1.27 $EndPAD $PAD Sh "29" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 22 "VCC" Po 11.43 1.27 $EndPAD $PAD Sh "22" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 1.27 -1.27 $EndPAD $PAD Sh "31" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 22 "VCC" Po 13.97 1.27 $EndPAD $PAD Sh "24" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 3 "INT2_1" Po 3.81 -1.27 $EndPAD $PAD Sh "26" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 6.35 -1.27 $EndPAD $PAD Sh "33" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 21 "Tin1_cold_1" Po 16.51 1.27 $EndPAD $PAD Sh "28" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 10 "PA15_1" Po 8.89 -1.27 $EndPAD $PAD Sh "32" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 1 "GND" Po 13.97 -1.27 $EndPAD $PAD Sh "34" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 16.51 -1.27 $EndPAD $PAD Sh "36" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 19.05 -1.27 $EndPAD $PAD Sh "38" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 21.59 -1.27 $EndPAD $PAD Sh "35" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 19.05 1.27 $EndPAD $PAD Sh "37" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 20 "PB4_1" Po 21.59 1.27 $EndPAD $PAD Sh "3" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 4 "PA0_1" Po -21.59 1.27 $EndPAD $PAD Sh "5" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 12 "PA2_1" Po -19.05 1.27 $EndPAD $PAD Sh "7" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 14 "PA4_1" Po -16.51 1.27 $EndPAD $PAD Sh "9" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 16 "PA6_1" Po -13.97 1.27 $EndPAD $PAD Sh "39" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 24.13 1.27 $EndPAD $PAD Sh "40" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 24.13 -1.27 $EndPAD $PAD Sh "30" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 1 "GND" Po 11.43 -1.27 $EndPAD $PAD Sh "2" C 6.2 6.2 0 0 0 Dr 2.75 0 0 At STD N 00E0FFFF Ne 0 "" Po -29 0 $EndPAD $PAD Sh "3" C 6.2 6.2 0 0 0 Dr 2.75 0 0 At STD N 00E0FFFF Ne 0 "" Po 29 0 $EndPAD $PAD Sh "4" C 6.2 6.2 0 0 0 Dr 2.75 0 0 At STD N 00E0FFFF Ne 0 "" Po -29 49 $EndPAD $PAD Sh "5" C 6.2 6.2 0 0 0 Dr 2.75 0 0 At STD N 00E0FFFF Ne 0 "" Po 29 49 $EndPAD $SHAPE3D Na "pin_array/pins_array_20x2.wrl" Sc 1 1 1 Of 0 0 0 Ro 0 0 0 $EndSHAPE3D $EndMODULE RASPI_BPLUS $MODULE RASPI_BPLUS_MIRRORED Po 0 0 0 15 5C1E43CC 00000000 ~~ Li RASPI_BPLUS_MIRRORED Cd Double rangee de contacts 2 x 12 pins Kw CONN Sc 0 AR /548F13F7 Op 0 0 0 T0 0 -3.81 1.016 1.016 0 0.27432 N V 21 N "P1" T1 0 3.81 1.016 1.016 0 0.2032 N V 21 N "RASPI_MODEL_B_PLUS_GPIO" T2 49.53 -43.18 1 1 900 0.15 N V 21 N "ETH" DS 48.768 -49.022 53.594 -49.022 0.15 21 DS 53.594 -49.022 53.594 -38.354 0.15 21 DS 53.594 -38.354 49.784 -38.354 0.15 21 T2 7.5 -18 1 1 0 0.15 N V 21 N "GPIO and mount holes exact, port placement approx." T2 0 -24.5 1 1 0 0.15 N V 21 N "RASPI B PLUS (MIRROR IMAGE)" T2 -19 -47 1 1 0 0.15 N V 21 N "microUSB" DS -22 -49.008 -22 -52.508 0.15 21 DS -16 -49.008 -16 -52.508 0.15 21 T2 0 -47 1 1 0 0.15 N V 21 N "HDMI" DS -7 -48.5 -7 -52.5 0.15 21 DS 6 -48.5 6 -52.5 0.15 21 T2 49.5 -3.5 1 1 900 0.15 N V 21 N "USB" T2 49.5 -20.5 1 1 900 0.15 N V 21 N "USB" DS 49.5 -11.032 54 -11.032 0.15 21 DS 54 -11.032 54 -0.032 0.15 21 DS 54 -0.032 50 -0.032 0.15 21 DS 49.5 -28.032 54 -28.032 0.15 21 DS 54 -28.032 54 -16.532 0.15 21 DS 54 -16.532 49.5 -16.532 0.15 21 DS -32.5 3.5 52.5 3.5 0.15 21 DS 52.5 -52.5 52.5 3.5 0.15 21 DS 52.5 -52.5 32 -52.5 0.15 21 DS -32.5 -52.5 -32.5 3.5 0.15 21 DS -32.5 -52.5 32.5 -52.5 0.15 21 DS 25.4 2.54 -25.4 2.54 0.3048 21 DS 25.4 -2.54 -25.4 -2.54 0.3048 21 DS 25.4 -2.54 25.4 2.54 0.3048 21 DS -25.4 -2.54 -25.4 2.54 0.3048 21 $PAD Sh "1" R 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 1 "+3.3V" Po -24.13 -1.27 $EndPAD $PAD Sh "2" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po -24.13 1.27 $EndPAD $PAD Sh "11" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 21 "xled4" Po -11.43 -1.27 $EndPAD $PAD Sh "4" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po -21.59 1.27 $EndPAD $PAD Sh "13" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 22 "xled5" Po -8.89 -1.27 $EndPAD $PAD Sh "6" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 2 "GND" Po -19.05 1.27 $EndPAD $PAD Sh "15" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 23 "xled6" Po -6.35 -1.27 $EndPAD $PAD Sh "8" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 7 "N-0000031" Po -16.51 1.27 $EndPAD $PAD Sh "17" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po -3.81 -1.27 $EndPAD $PAD Sh "10" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 8 "N-0000032" Po -13.97 1.27 $EndPAD $PAD Sh "19" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 24 "xled7" Po -1.27 -1.27 $EndPAD $PAD Sh "12" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 9 "N-0000033" Po -11.43 1.27 $EndPAD $PAD Sh "21" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 25 "xled8" Po 1.27 -1.27 $EndPAD $PAD Sh "14" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 2 "GND" Po -8.89 1.27 $EndPAD $PAD Sh "23" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 17 "N-0000092" Po 3.81 -1.27 $EndPAD $PAD Sh "16" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 10 "N-0000034" Po -6.35 1.27 $EndPAD $PAD Sh "25" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 2 "GND" Po 6.35 -1.27 $EndPAD $PAD Sh "18" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 3 "N-0000027" Po -3.81 1.27 $EndPAD $PAD Sh "27" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 8.89 -1.27 $EndPAD $PAD Sh "20" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 2 "GND" Po -1.27 1.27 $EndPAD $PAD Sh "29" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 15 "N-0000090" Po 11.43 -1.27 $EndPAD $PAD Sh "22" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 11 "N-0000035" Po 1.27 1.27 $EndPAD $PAD Sh "31" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 16 "N-0000091" Po 13.97 -1.27 $EndPAD $PAD Sh "24" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 12 "N-0000036" Po 3.81 1.27 $EndPAD $PAD Sh "26" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 13 "N-0000037" Po 6.35 1.27 $EndPAD $PAD Sh "33" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 4 "N-0000028" Po 16.51 -1.27 $EndPAD $PAD Sh "28" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 8.89 1.27 $EndPAD $PAD Sh "32" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 14 "N-0000038" Po 13.97 1.27 $EndPAD $PAD Sh "34" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 16.51 1.27 $EndPAD $PAD Sh "36" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 19.05 1.27 $EndPAD $PAD Sh "38" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 21.59 1.27 $EndPAD $PAD Sh "35" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 5 "N-0000029" Po 19.05 -1.27 $EndPAD $PAD Sh "37" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 6 "N-0000030" Po 21.59 -1.27 $EndPAD $PAD Sh "3" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 18 "xled1" Po -21.59 -1.27 $EndPAD $PAD Sh "5" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 19 "xled2" Po -19.05 -1.27 $EndPAD $PAD Sh "7" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 20 "xled3" Po -16.51 -1.27 $EndPAD $PAD Sh "9" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 2 "GND" Po -13.97 -1.27 $EndPAD $PAD Sh "39" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 2 "GND" Po 24.13 -1.27 $EndPAD $PAD Sh "40" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 0 "" Po 24.13 1.27 $EndPAD $PAD Sh "30" C 1.524 1.524 0 0 0 Dr 1.016 0 0 At STD N 00E0FFFF Ne 2 "GND" Po 11.43 1.27 $EndPAD $PAD Sh "H2" C 2.85 2.85 0 0 0 Dr 2.75 0 0 At STD N 00E0FFFF Ne 0 "" Po -29 0 $EndPAD $PAD Sh "H3" C 2.85 2.85 0 0 0 Dr 2.75 0 0 At STD N 00E0FFFF Ne 0 "" Po 29 0 $EndPAD $PAD Sh "H4" C 2.85 2.85 0 0 0 Dr 2.75 0 0 At STD N 00E0FFFF Ne 0 "" Po 29 -49 $EndPAD $PAD Sh "H1" C 2.85 2.85 0 0 0 Dr 2.75 0 0 At STD N 00E0FFFF Ne 0 "" Po -29 -49 $EndPAD $SHAPE3D Na "pin_array/pins_array_20x2.wrl" Sc 1 1 1 Of 0 0 0 Ro 0 0 0 $EndSHAPE3D $EndMODULE RASPI_BPLUS_MIRRORED $MODULE SIL-3PDP Po 0 0 0 15 54BD2D6F 00000000 ~~ Li SIL-3PDP Cd Connecteur 3 pins Kw CONN DEV Sc 0 AR /54BD28E4 Op 0 0 0 T0 3.175 -2.54 0.5 0.5 0 0.125 N V 21 N "P3" T1 -2.286 -2.54 0.5 0.5 0 0.125 N I 21 N "SERIAL3V" T2 2.54 -1.778 0.5 0.5 0 0.1 N V 21 N "TX" T2 0 -1.778 0.5 0.5 0 0.1 N V 21 N "RX" T2 -2.54 -1.778 0.5 0.5 0 0.1 N V 21 N "GND" DS -3.81 1.27 -3.81 -1.27 0.3048 21 DS -3.81 -1.27 3.81 -1.27 0.3048 21 DS 3.81 -1.27 3.81 1.27 0.3048 21 DS 3.81 1.27 -3.81 1.27 0.3048 21 DS -1.27 -1.27 -1.27 1.27 0.3048 21 $PAD Sh "1" R 1.397 1.397 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 1 "GND" Po -2.54 0 $EndPAD $PAD Sh "2" C 1.397 1.397 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 2 "RX" Po 0 0 $EndPAD $PAD Sh "3" C 1.397 1.397 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 3 "TX" Po 2.54 0 $EndPAD $EndMODULE SIL-3PDP $MODULE SIL-5PDP Po 0 0 0 15 54BD2E53 00000000 ~~ Li SIL-5PDP Cd Connecteur 5 pins Kw CONN DEV Sc 0 AR /54BD2904 Op 0 0 0 T0 4.699 -2.54 0.5 0.5 0 0.125 N V 21 N "P4" T1 -5.715 -2.54 0.5 0.5 0 0.125 N I 21 N "EXPANSION" T2 3.81 -1.778 0.5 0.5 0 0.1 N V 21 N "GPIO" T2 1.27 -1.778 0.5 0.5 0 0.1 N V 21 N "GND" T2 -1.27 -1.778 0.5 0.5 0 0.1 N V 21 N "5V" T2 -3.81 -1.778 0.5 0.5 0 0.1 N V 21 N "N/C" T2 -6.223 -1.778 0.5 0.5 0 0.1 N V 21 N "3.3V" DS -7.62 1.27 -7.62 -1.27 0.3048 21 DS -7.62 -1.27 5.08 -1.27 0.3048 21 DS 5.08 -1.27 5.08 1.27 0.3048 21 DS 5.08 1.27 -7.62 1.27 0.3048 21 DS -5.08 1.27 -5.08 -1.27 0.3048 21 $PAD Sh "1" R 1.397 1.397 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 1 "+3.3V" Po -6.35 0 $EndPAD $PAD Sh "2" C 1.397 1.397 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 0 "" Po -3.81 0 $EndPAD $PAD Sh "3" C 1.397 1.397 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 2 "+5V" Po -1.27 0 $EndPAD $PAD Sh "4" C 1.397 1.397 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 3 "GND" Po 1.27 0 $EndPAD $PAD Sh "5" C 1.397 1.397 0 0 0 Dr 0.8128 0 0 At STD N 00E0FFFF Ne 4 "SPARE_IO" Po 3.81 0 $EndPAD $EndMODULE SIL-5PDP $MODULE SW_KND2 Po 0 0 0 15 548F15A7 00000000 ~~ Li SW_KND2 Cd Switch inverseur Kw SWITCH DEV Sc 0 AR Op 0 0 0 T0 3.5 7.9 1.016 1.016 900 0.2032 N V 21 N "SW_KND2_1x2" T1 -0.05 -20.3 1.016 1.016 0 0.2032 N V 21 N "SW*" DS -4.75 -18.9 -4.75 18.9 0.15 21 DS -4.75 18.9 4.75 18.9 0.15 21 DS 4.75 18.9 4.75 -18.9 0.15 21 DS 4.75 -18.9 -4.75 -18.9 0.15 21 DS -4.75 -10.3 -4.75 10.3 0.15 21 DS -4.75 10.3 4.75 10.3 0.15 21 DS 4.75 10.3 4.75 -10.3 0.15 21 DS 4.75 -10.3 -4.75 -10.3 0.15 21 $PAD Sh "2" O 3.81 2.54 0 0 0 Dr 2.5 0 0 O 2.5 0.8 At STD N 00E0FFFF Ne 0 "" Po 0 0 $EndPAD $PAD Sh "1" O 3.81 2.54 0 0 0 Dr 2.5 0 0 O 2.5 0.8 At STD N 00E0FFFF Ne 0 "" Po 0 -5.58 $EndPAD $PAD Sh "3" O 3.81 2.54 0 0 0 Dr 2.5 0 0 O 2.5 0.8 At STD N 00E0FFFF Ne 0 "" Po 0 5.58 $EndPAD $PAD Sh "H1" C 4 4 0 0 0 Dr 3 0 0 At STD N 00E0FFFF Ne 0 "" Po 0 -15 $EndPAD $PAD Sh "H2" C 4 4 0 0 0 Dr 3 0 0 At STD N 00E0FFFF Ne 0 "" Po 0 15 $EndPAD $EndMODULE SW_KND2 $MODULE SW_KND2_PDP Po 0 0 0 15 54B2AA91 00000000 ~~ Li SW_KND2_PDP Cd Switch inverseur Kw SWITCH DEV Sc 0 AR Op 0 0 0 T0 4 0 0.3 0.3 900 0.05 N I 21 N "SW_KND2_1x2_PDP" T1 -0.05 -20.3 1.2 1.2 0 0.2032 N V 21 N "SW*" DS -4.75 7.8 -4.75 -10.3 0.15 21 DS -4.75 7.8 4.75 7.8 0.15 21 DS 4.75 7.8 4.75 -10.3 0.15 21 DS -4.75 -10.3 -4.75 -18.9 0.15 21 DS 4.75 -10.3 4.75 -18.9 0.15 21 DS 4.75 -18.9 -4.75 -18.9 0.15 21 DS 4.75 -10.3 -4.75 -10.3 0.15 21 $PAD Sh "1" O 3.81 2.54 0 0 0 Dr 2.5 0 0 O 2.5 0.8 At STD N 00E0FFFF Ne 0 "" Po 0 0 $EndPAD $PAD Sh "2" O 3.81 2.54 0 0 0 Dr 2.5 0 0 O 2.5 0.8 At STD N 00E0FFFF Ne 0 "" Po 0 -5.58 $EndPAD $PAD Sh "3" O 3.81 2.54 0 0 0 Dr 2.5 0 0 O 2.5 0.8 At STD N 00E0FFFF Ne 0 "" Po 0 5.58 $EndPAD $PAD Sh "H1" C 4 4 0 0 0 Dr 3 0 0 At STD N 00E0FFFF Ne 0 "" Po 0 -15 $EndPAD $EndMODULE SW_KND2_PDP $MODULE SW_KND2_PDP2 Po 0 0 0 15 554E2AD7 00000000 ~~ Li SW_KND2_PDP2 Cd Switch inverseur Kw SWITCH DEV Sc 0 AR Op 0 0 0 T0 3.429 -3.683 0.3 0.3 900 0.05 N I 21 N "SW_KND2_1x2_PDP" T1 -0.05 -20.3 1.2 1.2 0 0.2032 N V 21 N "SW*" DS -4.75 1.95 -4.75 -10.35 0.15 21 DS 4.75 -10.3 4.75 1.95 0.15 21 DS -4.75 1.958 4.75 1.958 0.15 21 DS -4.75 -10.3 -4.75 -18.9 0.15 21 DS 4.75 -10.3 4.75 -18.9 0.15 21 DS 4.75 -18.9 -4.75 -18.9 0.15 21 DS 4.75 -10.3 -4.75 -10.3 0.15 21 $PAD Sh "1" O 5.08 2.54 0 0 0 Dr 3.45 0 0 O 3.45 1.18 At STD N 00E0FFFF Ne 0 "" Po 0 0 $EndPAD $PAD Sh "2" O 5.08 2.54 0 0 0 Dr 3.45 0 0 O 3.45 1.15 At STD N 00E0FFFF Ne 0 "" Po 0 -5.58 $EndPAD $PAD Sh "3" C 4 4 0 0 0 Dr 3 0 0 At STD N 00E0FFFF Ne 0 "" Po 0 -15 $EndPAD $EndMODULE SW_KND2_PDP2 $MODULE SW_PIDP2019 Po 0 0 0 15 5CB38C3F 00000000 ~~ Li SW_PIDP2019 Cd Switch inverseur Kw SWITCH DEV Sc 0 AR /548EF8A0 Op 0 0 0 T0 3.429 -3.683 0.3 0.3 900 0.05 N I 21 N "RLS" T1 0 -13.3 1.2 1.2 0 0.2032 N V 21 N "SW*" DS -4.7 -10 4.7 -10 0.15 21 DS 4.75 5.75 4.75 2 0.15 21 DS -4.75 5.75 -4.75 2 0.15 21 DS -4.75 5.75 4.75 5.75 0.15 21 DS -4.75 1.95 -4.75 -10.35 0.15 21 DS 4.75 -10.3 4.75 1.95 0.15 21 $PAD Sh "1" O 3.9 2.1 0 0 0 Dr 2.9 0 0 O 2.9 1.1 At STD N 00E0FFFF Ne 2 "row3" Po 0 0 .LocalClearance 0.8 $EndPAD $PAD Sh "2" O 3.9 2.1 0 0 0 Dr 2.9 0 0 O 2.9 1.1 At STD N 00E0FFFF Ne 1 "N-0000068" Po 0 -4.7 .LocalClearance 0.65 $EndPAD $PAD Sh "" C 2.5 2.5 0 0 0 Dr 1.6 0 0 At STD N 00E0FFFF Ne 0 "" Po 1.6 -7.875 $EndPAD $PAD Sh "" O 3.9 2.1 0 0 0 Dr 2.9 0 0 O 2.9 1.1 At STD N 00E0FFFF Ne 0 "" Po 0 4.7 .LocalClearance 0.65 $EndPAD $PAD Sh "" C 2.5 2.5 0 0 0 Dr 1.6 0 0 At STD N 00E0FFFF Ne 0 "" Po -1.6 7.875 $EndPAD $PAD Sh "" C 2.5 2.5 0 0 0 Dr 1.6 0 0 At STD N 00E0FFFF Ne 0 "" Po -1.6 -7.875 $EndPAD $PAD Sh "" C 2.5 2.5 0 0 0 Dr 1.6 0 0 At STD N 00E0FFFF Ne 0 "" Po 1.6 7.875 $EndPAD $EndMODULE SW_PIDP2019 $MODULE SW_RLS_MOUNT Po 0 0 0 15 5668A1A7 00000000 ~~ Li SW_RLS_MOUNT Cd Switch inverseur Kw SWITCH DEV Sc 0 AR /548EF8A0 Op 0 0 0 T0 3.429 -3.683 0.3 0.3 900 0.05 N I 21 N "RLS" T1 -0.05 -20.3 1.2 1.2 0 0.2032 N V 21 N "SW*" DS 4.75 5.75 4.75 2 0.15 21 DS -4.75 5.75 -4.75 2 0.15 21 DS -4.75 5.75 4.75 5.75 0.15 21 DS -4.75 1.95 -4.75 -10.35 0.15 21 DS 4.75 -10.3 4.75 1.95 0.15 21 DS -4.75 1.958 4.75 1.958 0.15 21 DS -4.75 -10.3 -4.75 -18.9 0.15 21 DS 4.75 -10.3 4.75 -18.9 0.15 21 DS 4.75 -18.9 -4.75 -18.9 0.15 21 DS 4.75 -10.3 -4.75 -10.3 0.15 21 $PAD Sh "1" O 5.08 2.54 0 0 0 Dr 2.85 0 0 O 2.85 1 At STD N 00E0FFFF Ne 2 "row3" Po 0 0 $EndPAD $PAD Sh "2" O 5.08 2.54 0 0 0 Dr 2.85 0 0 O 2.85 1 At STD N 00E0FFFF Ne 1 "N-0000068" Po 0 -4.5 $EndPAD $PAD Sh "" C 4 4 0 0 0 Dr 3 0 0 At STD N 00E0FFFF Ne 0 "" Po 0 -15 $EndPAD $PAD Sh "" O 5.08 1.6 0 0 0 Dr 2.85 0 0 O 2.85 1 At STD N 00E0FFFF Ne 0 "" Po 0 4.5 $EndPAD $EndMODULE SW_RLS_MOUNT $MODULE SW_RLS_PIDP Po 0 0 0 15 5668A1A7 00000000 ~~ Li SW_RLS_PIDP Cd Switch inverseur Kw SWITCH DEV Sc 0 AR /548EF8A0 Op 0 0 0 T0 3.429 -3.683 0.3 0.3 900 0.05 N I 21 N "RLS" T1 -0.05 -20.3 1.2 1.2 0 0.2032 N V 21 N "SW*" DS 4.75 5.75 4.75 2 0.15 21 DS -4.75 5.75 -4.75 2 0.15 21 DS -4.75 5.75 4.75 5.75 0.15 21 DS -4.75 1.95 -4.75 -10.35 0.15 21 DS 4.75 -10.3 4.75 1.95 0.15 21 DS -4.75 1.958 4.75 1.958 0.15 21 DS -4.75 -10.3 -4.75 -18.9 0.15 21 DS 4.75 -10.3 4.75 -18.9 0.15 21 DS 4.75 -18.9 -4.75 -18.9 0.15 21 DS 4.75 -10.3 -4.75 -10.3 0.15 21 $PAD Sh "1" O 5.08 2.54 0 0 0 Dr 2.85 0 0 O 2.85 1 At STD N 00E0FFFF Ne 2 "row3" Po 0 0 $EndPAD $PAD Sh "2" O 5.08 2.54 0 0 0 Dr 2.85 0 0 O 2.85 1 At STD N 00E0FFFF Ne 1 "N-0000068" Po 0 -4.5 $EndPAD $PAD Sh "" C 4 4 0 0 0 Dr 3 0 0 At STD N 00E0FFFF Ne 0 "" Po 0 -15 $EndPAD $PAD Sh "" O 5.08 1.6 0 0 0 Dr 2.85 0 0 O 2.85 1 At STD N 00E0FFFF Ne 0 "" Po 0 4.5 $EndPAD $EndMODULE SW_RLS_PIDP $EndLIBRARY |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | EESchema-LIBRARY Version 2.3 # # LOGO # pixmap size w = 650, h = 97 # DEF LOGO G 0 40 Y Y 1 F N F0 "#G" 0 -130 60 H I C CNN F1 "LOGO" 0 130 60 H I C CNN DRAW P 21 0 0 1 1083 160 1067 160 1067 144 1067 -1 1067 -146 0 -146 -1067 -146 -1067 -1 -1067 144 0 144 1067 144 1067 160 0 160 -1083 160 -1083 -1 -1083 -163 0 -163 1083 -163 1083 -1 1083 160 1083 160 F P 40 0 0 1 -940 110 -950 110 -950 57 -950 -3 -950 -63 -960 -63 -967 -62 -970 -59 -972 -58 -978 -61 -979 -62 -990 -65 -1001 -65 -1010 -62 -1019 -53 -1025 -40 -1027 -22 -1027 -14 -1025 -3 -1024 5 -1022 9 -1013 20 -1002 26 -990 27 -978 22 -970 17 -970 37 -970 57 -960 57 -950 57 -950 110 -987 110 -1033 110 -1033 -1 -1033 -113 -987 -113 -940 -113 -940 -1 -940 110 -940 110 F P 35 0 0 1 -830 110 -867 110 -867 53 -867 45 -867 38 -867 27 -867 -18 -867 -63 -877 -63 -887 -63 -887 -18 -887 27 -877 27 -867 27 -867 38 -870 34 -877 34 -883 34 -886 38 -887 45 -886 53 -884 57 -877 57 -870 57 -867 53 -867 110 -877 110 -923 110 -923 -1 -923 -113 -877 -113 -830 -113 -830 -1 -830 110 -830 110 F P 63 0 0 1 -720 110 -730 110 -730 27 -731 -28 -731 -40 -731 -57 -732 -69 -733 -78 -734 -83 -736 -87 -739 -90 -744 -93 -756 -98 -770 -99 -783 -98 -794 -93 -801 -86 -804 -80 -804 -79 -805 -75 -802 -73 -793 -73 -790 -73 -783 -74 -780 -76 -776 -80 -769 -81 -761 -79 -756 -75 -752 -68 -751 -59 -753 -56 -758 -59 -762 -61 -771 -63 -781 -62 -790 -59 -792 -59 -800 -50 -805 -36 -807 -19 -805 -4 -800 10 -792 20 -781 26 -770 27 -758 22 -754 19 -751 19 -750 22 -748 26 -740 27 -730 27 -730 110 -767 110 -813 110 -813 -1 -813 -113 -767 -113 -720 -113 -720 -1 -720 110 -720 110 F P 35 0 0 1 -610 110 -647 110 -647 53 -647 45 -647 38 -647 27 -647 -18 -647 -63 -657 -63 -667 -63 -667 -18 -667 27 -657 27 -647 27 -647 38 -650 34 -657 34 -663 34 -666 38 -667 45 -666 53 -664 57 -657 57 -650 57 -647 53 -647 110 -657 110 -703 110 -703 -1 -703 -113 -657 -113 -610 -113 -610 -1 -610 110 -610 110 F P 61 0 0 1 -497 -113 -498 -2 -498 109 -523 109 -523 15 -525 9 -530 7 -532 7 -535 6 -536 2 -537 -6 -537 -20 -537 -27 -536 -37 -535 -43 -533 -46 -530 -46 -526 -48 -523 -54 -524 -60 -529 -64 -539 -66 -551 -63 -552 -61 -555 -58 -556 -52 -557 -42 -557 -26 -557 -24 -557 -10 -557 -1 -559 5 -560 7 -563 7 -568 9 -570 15 -569 20 -563 25 -561 26 -558 30 -557 39 -556 47 -553 50 -547 50 -545 50 -539 50 -537 46 -537 37 -536 29 -535 25 -530 24 -525 22 -523 15 -523 109 -545 109 -592 109 -593 -2 -594 -113 -545 -113 -497 -113 -497 -113 F P 60 0 0 1 -390 110 -398 110 -398 -61 -401 -62 -408 -63 -409 -63 -417 -62 -422 -59 -425 -58 -431 -61 -442 -66 -454 -65 -465 -58 -466 -57 -472 -47 -473 -35 -469 -24 -460 -16 -448 -11 -437 -9 -429 -7 -425 -4 -423 -1 -424 1 -428 6 -435 8 -442 7 -448 2 -449 1 -454 -2 -461 -3 -467 -2 -470 0 -468 8 -462 17 -455 23 -452 24 -439 27 -426 26 -414 22 -406 16 -405 14 -405 7 -404 -5 -404 -19 -403 -26 -403 -39 -402 -50 -400 -56 -398 -61 -398 110 -437 110 -483 110 -483 -1 -483 -113 -437 -113 -390 -113 -390 -1 -390 110 -390 110 F P 21 0 0 1 -277 -113 -278 -2 -278 109 -313 109 -313 -63 -325 -63 -337 -63 -337 -3 -337 58 -326 57 -315 55 -314 -4 -313 -63 -313 109 -325 109 -372 109 -373 -2 -374 -113 -325 -113 -277 -113 -277 -113 F P 58 0 0 1 19 36 17 54 12 66 2 75 1 75 -4 77 -4 46 -4 38 -4 27 -5 17 -6 9 -9 5 -13 1 -15 1 -24 -1 -37 -2 -57 -3 -83 -3 -143 -3 -143 29 -143 60 -81 60 -72 60 -49 60 -32 60 -20 58 -12 56 -7 52 -4 46 -4 77 -6 77 -17 78 -34 79 -57 79 -86 80 -167 81 -167 -1 -167 -83 -155 -83 -143 -83 -143 -53 -143 -23 -99 -23 -81 -22 -61 -22 -42 -21 -28 -20 -25 -20 -12 -18 -3 -16 3 -13 9 -9 14 -3 17 3 18 12 19 25 19 36 19 36 F P 63 0 0 1 251 14 250 33 248 47 243 57 236 65 228 71 228 21 228 1 228 -17 226 -33 223 -45 217 -53 210 -59 206 -60 196 -61 181 -62 161 -63 134 -63 67 -63 67 -1 67 60 133 60 135 60 156 60 175 60 191 59 202 58 208 57 216 53 222 46 226 36 228 21 228 71 226 72 223 74 218 76 212 77 204 78 193 79 177 79 157 80 131 80 47 81 47 -1 47 -83 131 -82 136 -82 164 -82 186 -81 203 -80 215 -78 225 -76 231 -72 236 -67 240 -61 244 -53 247 -48 249 -39 250 -29 251 -16 251 2 251 14 251 14 F P 57 0 0 1 470 34 467 50 462 64 454 73 452 74 448 75 446 76 446 39 446 29 446 18 444 10 440 5 432 1 429 0 418 -1 404 -2 385 -3 365 -3 307 -3 307 29 307 61 372 60 378 60 401 59 418 59 430 57 438 55 443 51 445 46 446 39 446 76 443 77 435 78 425 79 410 79 390 80 364 80 283 81 283 -1 283 -83 295 -83 307 -83 307 -53 307 -24 375 -22 400 -21 420 -20 435 -19 445 -17 453 -14 458 -10 462 -5 465 2 465 3 469 18 470 34 470 34 F P 125 0 0 1 819 -33 817 -20 812 -9 805 -2 797 1 797 -39 795 -50 791 -57 787 -58 779 -60 767 -61 750 -62 726 -62 707 -63 691 -63 679 -63 671 -62 666 -61 663 -59 660 -56 656 -49 653 -38 654 -26 659 -17 660 -16 668 -12 681 -10 698 -8 716 -7 736 -7 754 -8 770 -9 783 -12 791 -15 793 -19 796 -28 797 -39 797 1 806 9 812 19 816 32 815 47 811 60 810 62 805 69 800 73 793 77 793 44 793 35 793 29 791 21 786 16 785 15 780 13 773 12 762 11 746 11 725 10 718 11 697 11 681 12 670 13 663 16 659 21 657 27 657 35 657 40 657 47 660 53 665 56 673 59 685 60 703 60 726 61 739 60 758 60 773 59 782 58 788 55 792 50 793 44 793 77 791 77 780 79 765 80 744 80 718 80 709 80 687 79 671 78 659 76 651 74 645 70 641 65 638 59 636 54 633 38 635 23 643 11 652 1 644 -3 643 -4 636 -12 632 -25 631 -40 633 -57 634 -59 639 -69 649 -75 663 -80 669 -81 682 -82 699 -82 719 -82 739 -82 757 -82 773 -81 784 -79 786 -79 800 -74 809 -68 815 -60 819 -47 819 -33 819 -33 F P 24 0 0 1 935 79 933 80 930 81 926 80 915 80 890 15 889 11 881 -10 874 -29 867 -46 862 -59 859 -67 853 -83 865 -82 877 -81 905 -8 914 14 922 35 928 51 932 63 934 71 935 76 935 79 935 79 F P 10 0 0 1 1020 80 1010 80 1000 80 1000 -1 1000 -83 1010 -83 1020 -83 1020 -1 1020 80 1020 80 F P 10 0 0 1 597 -3 552 -3 507 -3 507 -13 507 -23 552 -23 597 -23 597 -13 597 -3 597 -3 F P 19 0 0 1 -971 -20 -973 -8 -978 1 -986 6 -990 7 -998 4 -1003 -5 -1005 -19 -1005 -24 -1003 -34 -1001 -41 -1000 -41 -993 -45 -984 -46 -978 -42 -977 -42 -972 -32 -971 -20 -971 -20 F P 17 0 0 1 -752 -12 -755 0 -762 6 -771 6 -778 1 -783 -7 -785 -19 -783 -30 -778 -40 -773 -44 -767 -46 -758 -41 -755 -38 -753 -31 -752 -20 -752 -12 -752 -12 F P 17 0 0 1 -423 -30 -424 -25 -427 -24 -434 -25 -435 -25 -443 -27 -448 -28 -449 -29 -450 -35 -450 -42 -448 -47 -446 -49 -439 -49 -432 -45 -426 -39 -423 -30 -423 -30 F ENDDRAW ENDDEF |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 | PCBNEW-LibModule-V1 $INDEX LOGO $EndINDEX # # LOGO # pixmap w = 650, h = 97 # $MODULE LOGO Po 0 0 0 15 00000000 00000000 ~~ Li LOGO T0 0 1900 600 600 0 120 N I 21 "G***" T1 0 -1900 600 600 0 120 N I 21 "LOGO" DP 0 0 0 0 21 1 21 Dl 10833 1633 Dl 10667 1633 Dl 10667 1466 Dl 10667 16 Dl 10667 -1434 Dl 0 -1434 Dl -10667 -1434 Dl -10667 16 Dl -10667 1466 Dl 0 1466 Dl 10667 1466 Dl 10667 1633 Dl 0 1633 Dl -10833 1633 Dl -10833 16 Dl -10833 -1600 Dl 0 -1600 Dl 10833 -1600 Dl 10833 16 Dl 10833 1633 Dl 10833 1633 DP 0 0 0 0 41 1 21 Dl -9400 1133 Dl -9500 1133 Dl -9500 633 Dl -9500 33 Dl -9500 -567 Dl -9600 -567 Dl -9700 -567 Dl -9700 -365 Dl -9700 -163 Dl -9774 -215 Dl -9894 -263 Dl -10019 -254 Dl -10132 -192 Dl -10218 -85 Dl -10236 -45 Dl -10253 34 Dl -10264 149 Dl -10267 228 Dl -10248 403 Dl -10187 536 Dl -10102 623 Dl -10011 659 Dl -9897 659 Dl -9791 625 Dl -9774 614 Dl -9721 587 Dl -9700 598 Dl -9671 622 Dl -9601 633 Dl -9600 633 Dl -9500 633 Dl -9500 1133 Dl -9867 1133 Dl -10333 1133 Dl -10333 16 Dl -10333 -1100 Dl -9867 -1100 Dl -9400 -1100 Dl -9400 16 Dl -9400 1133 Dl -9400 1133 DP 0 0 0 0 35 1 21 Dl -8300 1133 Dl -8667 1133 Dl -8667 633 Dl -8667 183 Dl -8667 -267 Dl -8667 -450 Dl -8672 -529 Dl -8701 -561 Dl -8767 -567 Dl -8834 -561 Dl -8862 -528 Dl -8867 -450 Dl -8861 -372 Dl -8833 -340 Dl -8767 -334 Dl -8700 -340 Dl -8672 -373 Dl -8667 -450 Dl -8667 -267 Dl -8767 -267 Dl -8867 -267 Dl -8867 183 Dl -8867 633 Dl -8767 633 Dl -8667 633 Dl -8667 1133 Dl -8767 1133 Dl -9233 1133 Dl -9233 16 Dl -9233 -1100 Dl -8767 -1100 Dl -8300 -1100 Dl -8300 16 Dl -8300 1133 Dl -8300 1133 DP 0 0 0 0 66 1 21 Dl -7200 1133 Dl -7296 1133 Dl -7296 -267 Dl -7398 -267 Dl -7477 -254 Dl -7500 -215 Dl -7506 -182 Dl -7536 -190 Dl -7574 -215 Dl -7695 -267 Dl -7812 -260 Dl -7915 -200 Dl -7998 -95 Dl -8051 49 Dl -8067 199 Dl -8048 366 Dl -7996 501 Dl -7917 590 Dl -7902 599 Dl -7813 625 Dl -7707 631 Dl -7615 616 Dl -7574 593 Dl -7529 568 Dl -7510 599 Dl -7519 680 Dl -7519 682 Dl -7560 758 Dl -7612 797 Dl -7691 811 Dl -7762 800 Dl -7799 769 Dl -7800 762 Dl -7830 744 Dl -7903 733 Dl -7930 733 Dl -8014 737 Dl -8046 756 Dl -8043 799 Dl -8043 800 Dl -8005 868 Dl -7938 936 Dl -7938 937 Dl -7833 984 Dl -7697 999 Dl -7556 983 Dl -7436 939 Dl -7391 905 Dl -7363 873 Dl -7343 836 Dl -7329 780 Dl -7320 696 Dl -7313 574 Dl -7309 401 Dl -7306 282 Dl -7296 -267 Dl -7296 1133 Dl -7667 1133 Dl -8133 1133 Dl -8133 16 Dl -8133 -1100 Dl -7667 -1100 Dl -7200 -1100 Dl -7200 16 Dl -7200 1133 Dl -7200 1133 DP 0 0 0 0 35 1 21 Dl -6100 1133 Dl -6467 1133 Dl -6467 633 Dl -6467 183 Dl -6467 -267 Dl -6467 -450 Dl -6472 -529 Dl -6501 -561 Dl -6567 -567 Dl -6634 -561 Dl -6662 -528 Dl -6667 -450 Dl -6661 -372 Dl -6633 -340 Dl -6567 -334 Dl -6500 -340 Dl -6472 -373 Dl -6467 -450 Dl -6467 -267 Dl -6567 -267 Dl -6667 -267 Dl -6667 183 Dl -6667 633 Dl -6567 633 Dl -6467 633 Dl -6467 1133 Dl -6567 1133 Dl -7033 1133 Dl -7033 16 Dl -7033 -1100 Dl -6567 -1100 Dl -6100 -1100 Dl -6100 16 Dl -6100 1133 Dl -6100 1133 DP 0 0 0 0 62 1 21 Dl -4966 1133 Dl -5233 1133 Dl -5233 540 Dl -5256 485 Dl -5300 466 Dl -5333 461 Dl -5353 435 Dl -5363 376 Dl -5367 270 Dl -5367 200 Dl -5365 67 Dl -5359 -13 Dl -5344 -53 Dl -5318 -66 Dl -5300 -67 Dl -5248 -87 Dl -5233 -150 Dl -5249 -216 Dl -5300 -234 Dl -5344 -245 Dl -5363 -290 Dl -5367 -367 Dl -5371 -453 Dl -5392 -491 Dl -5445 -500 Dl -5467 -500 Dl -5533 -494 Dl -5561 -462 Dl -5567 -384 Dl -5567 -381 Dl -5577 -293 Dl -5613 -251 Dl -5633 -243 Dl -5690 -199 Dl -5700 -147 Dl -5683 -83 Dl -5633 -67 Dl -5603 -63 Dl -5584 -41 Dl -5573 10 Dl -5568 103 Dl -5567 249 Dl -5567 265 Dl -5565 421 Dl -5559 523 Dl -5546 585 Dl -5523 619 Dl -5508 630 Dl -5387 664 Dl -5286 646 Dl -5242 603 Dl -5233 540 Dl -5233 1133 Dl -5450 1133 Dl -5934 1133 Dl -5926 25 Dl -5917 -1084 Dl -5450 -1084 Dl -4983 -1084 Dl -4975 25 Dl -4966 1133 Dl -4966 1133 DP 0 0 0 0 60 1 21 Dl -3900 1133 Dl -3983 1133 Dl -3983 610 Dl -3999 568 Dl -4014 507 Dl -4026 399 Dl -4033 262 Dl -4034 193 Dl -4037 53 Dl -4044 -63 Dl -4053 -137 Dl -4059 -154 Dl -4138 -219 Dl -4257 -257 Dl -4392 -265 Dl -4522 -240 Dl -4545 -230 Dl -4621 -169 Dl -4680 -77 Dl -4700 1 Dl -4673 26 Dl -4610 32 Dl -4538 22 Dl -4484 -3 Dl -4477 -12 Dl -4419 -62 Dl -4344 -76 Dl -4275 -55 Dl -4236 -4 Dl -4233 15 Dl -4244 48 Dl -4284 73 Dl -4366 95 Dl -4474 114 Dl -4599 163 Dl -4685 248 Dl -4727 357 Dl -4720 472 Dl -4657 579 Dl -4652 584 Dl -4542 652 Dl -4418 661 Dl -4310 616 Dl -4245 587 Dl -4217 599 Dl -4173 622 Dl -4092 633 Dl -4080 633 Dl -4005 629 Dl -3983 610 Dl -3983 1133 Dl -4367 1133 Dl -4833 1133 Dl -4833 16 Dl -4833 -1100 Dl -4367 -1100 Dl -3900 -1100 Dl -3900 16 Dl -3900 1133 Dl -3900 1133 DP 0 0 0 0 21 1 21 Dl -2766 1133 Dl -3132 1133 Dl -3132 633 Dl -3141 41 Dl -3150 -550 Dl -3258 -561 Dl -3367 -571 Dl -3367 31 Dl -3367 633 Dl -3249 633 Dl -3132 633 Dl -3132 1133 Dl -3250 1133 Dl -3734 1133 Dl -3726 25 Dl -3717 -1084 Dl -3250 -1084 Dl -2783 -1084 Dl -2775 25 Dl -2766 1133 Dl -2766 1133 DP 0 0 0 0 58 1 21 Dl 196 -358 Dl 194 -246 Dl 184 -112 Dl 167 -25 Dl 137 38 Dl 91 91 Dl 36 138 Dl -27 168 Dl -37 170 Dl -37 -373 Dl -43 -454 Dl -67 -513 Dl -116 -553 Dl -197 -579 Dl -320 -593 Dl -492 -599 Dl -720 -600 Dl -804 -600 Dl -1433 -600 Dl -1433 -284 Dl -1433 33 Dl -825 32 Dl -567 30 Dl -371 24 Dl -234 12 Dl -151 -3 Dl -133 -10 Dl -87 -41 Dl -61 -86 Dl -47 -164 Dl -40 -268 Dl -37 -373 Dl -37 170 Dl -116 188 Dl -251 203 Dl -275 205 Dl -420 214 Dl -607 222 Dl -810 228 Dl -992 230 Dl -1433 233 Dl -1433 533 Dl -1433 833 Dl -1550 833 Dl -1667 833 Dl -1667 13 Dl -1667 -807 Dl -858 -795 Dl -569 -789 Dl -342 -782 Dl -173 -773 Dl -56 -761 Dl 12 -747 Dl 24 -741 Dl 118 -658 Dl 174 -533 Dl 196 -358 Dl 196 -358 DP 0 0 0 0 63 1 21 Dl 2516 -17 Dl 2514 166 Dl 2506 298 Dl 2492 397 Dl 2468 480 Dl 2444 539 Dl 2406 617 Dl 2366 678 Dl 2316 726 Dl 2283 742 Dl 2283 -2 Dl 2277 -206 Dl 2257 -354 Dl 2219 -457 Dl 2159 -526 Dl 2079 -569 Dl 2021 -578 Dl 1908 -587 Dl 1751 -594 Dl 1563 -599 Dl 1356 -600 Dl 1331 -600 Dl 667 -600 Dl 667 16 Dl 667 633 Dl 1342 632 Dl 1608 630 Dl 1812 625 Dl 1960 616 Dl 2057 603 Dl 2100 590 Dl 2176 535 Dl 2229 455 Dl 2262 339 Dl 2279 175 Dl 2283 -2 Dl 2283 742 Dl 2248 761 Dl 2155 786 Dl 2028 804 Dl 1859 815 Dl 1641 821 Dl 1366 826 Dl 1308 827 Dl 467 839 Dl 467 16 Dl 467 -806 Dl 1308 -795 Dl 1569 -791 Dl 1773 -787 Dl 1927 -782 Dl 2041 -775 Dl 2123 -765 Dl 2183 -752 Dl 2228 -736 Dl 2265 -716 Dl 2363 -648 Dl 2432 -567 Dl 2478 -463 Dl 2504 -323 Dl 2515 -136 Dl 2516 -17 Dl 2516 -17 DP 0 0 0 0 57 1 21 Dl 4699 -340 Dl 4693 -175 Dl 4654 -22 Dl 4653 -19 Dl 4621 50 Dl 4583 102 Dl 4531 142 Dl 4466 166 Dl 4466 -286 Dl 4465 -382 Dl 4456 -454 Dl 4431 -507 Dl 4382 -544 Dl 4300 -567 Dl 4178 -581 Dl 4007 -589 Dl 3780 -593 Dl 3719 -594 Dl 3067 -604 Dl 3067 -286 Dl 3067 33 Dl 3648 33 Dl 3854 31 Dl 4037 25 Dl 4185 16 Dl 4287 5 Dl 4322 -3 Dl 4400 -41 Dl 4443 -93 Dl 4462 -178 Dl 4466 -286 Dl 4466 166 Dl 4456 170 Dl 4350 191 Dl 4202 204 Dl 4006 214 Dl 3753 223 Dl 3067 243 Dl 3067 538 Dl 3067 833 Dl 2950 833 Dl 2833 833 Dl 2833 13 Dl 2833 -807 Dl 3642 -795 Dl 3898 -791 Dl 4097 -787 Dl 4247 -781 Dl 4355 -773 Dl 4432 -763 Dl 4486 -750 Dl 4525 -732 Dl 4541 -722 Dl 4620 -632 Dl 4673 -499 Dl 4699 -340 Dl 4699 -340 DP 0 0 0 0 126 1 21 Dl 8194 339 Dl 8187 479 Dl 8150 605 Dl 8095 686 Dl 7999 748 Dl 7968 758 Dl 7968 397 Dl 7962 284 Dl 7933 191 Dl 7933 -350 Dl 7931 -435 Dl 7917 -498 Dl 7885 -542 Dl 7824 -572 Dl 7727 -589 Dl 7585 -598 Dl 7390 -600 Dl 7258 -601 Dl 7027 -599 Dl 6854 -594 Dl 6730 -581 Dl 6649 -558 Dl 6600 -521 Dl 6575 -467 Dl 6567 -394 Dl 6567 -347 Dl 6571 -264 Dl 6589 -202 Dl 6630 -158 Dl 6701 -129 Dl 6812 -111 Dl 6970 -103 Dl 7185 -101 Dl 7250 -100 Dl 7462 -102 Dl 7618 -106 Dl 7728 -114 Dl 7801 -127 Dl 7849 -146 Dl 7859 -152 Dl 7910 -206 Dl 7931 -289 Dl 7933 -350 Dl 7933 191 Dl 7908 158 Dl 7833 123 Dl 7706 97 Dl 7544 80 Dl 7359 73 Dl 7166 74 Dl 6980 83 Dl 6814 102 Dl 6684 128 Dl 6603 164 Dl 6596 170 Dl 6545 262 Dl 6532 381 Dl 6557 497 Dl 6602 569 Dl 6631 594 Dl 6665 611 Dl 6716 623 Dl 6793 630 Dl 6907 632 Dl 7068 630 Dl 7264 627 Dl 7498 621 Dl 7673 613 Dl 7795 602 Dl 7872 588 Dl 7911 570 Dl 7951 501 Dl 7968 397 Dl 7968 758 Dl 7861 794 Dl 7837 799 Dl 7729 812 Dl 7573 821 Dl 7387 827 Dl 7188 828 Dl 6993 826 Dl 6821 820 Dl 6687 810 Dl 6633 802 Dl 6489 759 Dl 6396 695 Dl 6342 598 Dl 6335 574 Dl 6307 406 Dl 6317 251 Dl 6360 125 Dl 6434 42 Dl 6445 36 Dl 6522 -6 Dl 6428 -101 Dl 6353 -221 Dl 6332 -371 Dl 6364 -540 Dl 6380 -582 Dl 6412 -647 Dl 6452 -697 Dl 6509 -733 Dl 6592 -758 Dl 6711 -774 Dl 6874 -785 Dl 7092 -792 Dl 7183 -794 Dl 7444 -797 Dl 7647 -794 Dl 7802 -783 Dl 7915 -761 Dl 7997 -728 Dl 8056 -681 Dl 8100 -619 Dl 8110 -600 Dl 8154 -463 Dl 8159 -315 Dl 8126 -181 Dl 8058 -82 Dl 8057 -82 Dl 7972 -9 Dl 8049 27 Dl 8124 94 Dl 8172 204 Dl 8194 339 Dl 8194 339 DP 0 0 0 0 24 1 21 Dl 9352 -759 Dl 9344 -707 Dl 9320 -625 Dl 9278 -507 Dl 9218 -345 Dl 9137 -133 Dl 9055 83 Dl 8776 816 Dl 8654 827 Dl 8533 837 Dl 8595 677 Dl 8626 596 Dl 8675 466 Dl 8739 298 Dl 8811 104 Dl 8889 -103 Dl 8903 -142 Dl 9149 -800 Dl 9261 -800 Dl 9300 -801 Dl 9329 -799 Dl 9347 -787 Dl 9352 -759 Dl 9352 -759 DP 0 0 0 0 10 1 21 Dl 10200 833 Dl 10100 833 Dl 10000 833 Dl 10000 16 Dl 10000 -800 Dl 10100 -800 Dl 10200 -800 Dl 10200 16 Dl 10200 833 Dl 10200 833 DP 0 0 0 0 10 1 21 Dl 5967 233 Dl 5517 233 Dl 5067 233 Dl 5067 133 Dl 5067 33 Dl 5517 33 Dl 5967 33 Dl 5967 133 Dl 5967 233 Dl 5967 233 DP 0 0 0 0 19 1 21 Dl -9711 203 Dl -9723 320 Dl -9770 420 Dl -9774 424 Dl -9842 461 Dl -9929 457 Dl -10002 414 Dl -10004 411 Dl -10032 346 Dl -10048 245 Dl -10050 196 Dl -10033 55 Dl -9983 -32 Dl -9903 -61 Dl -9856 -55 Dl -9781 -5 Dl -9732 87 Dl -9711 203 Dl -9711 203 DP 0 0 0 0 17 1 21 Dl -7517 203 Dl -7524 319 Dl -7551 389 Dl -7582 419 Dl -7665 462 Dl -7732 446 Dl -7774 408 Dl -7829 307 Dl -7848 191 Dl -7831 78 Dl -7783 -10 Dl -7713 -55 Dl -7617 -53 Dl -7553 7 Dl -7521 125 Dl -7517 203 Dl -7517 203 DP 0 0 0 0 17 1 21 Dl -4233 308 Dl -4257 392 Dl -4314 459 Dl -4387 497 Dl -4456 493 Dl -4478 477 Dl -4496 427 Dl -4498 355 Dl -4484 298 Dl -4475 289 Dl -4428 272 Dl -4347 252 Dl -4342 251 Dl -4268 240 Dl -4239 258 Dl -4233 308 Dl -4233 308 $EndMODULE LOGO $EndLIBRARY |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 | PCBNEW-LibModule-V1 $INDEX LOGO $EndINDEX # # LOGO # pixmap w = 500, h = 74 # $MODULE LOGO Po 0 0 0 15 00000000 00000000 ~~ Li LOGO T0 0 1533 600 600 0 120 N I 21 "G***" T1 0 -1533 600 600 0 120 N I 21 "LOGO" DP 0 0 0 0 48 1 21 Dl 8333 1233 Dl 8217 1233 Dl 8217 1117 Dl 8217 0 Dl 8217 -1117 Dl 0 -1117 Dl -8217 -1117 Dl -8226 -34 Dl -8227 230 Dl -8228 473 Dl -8227 687 Dl -8226 864 Dl -8224 995 Dl -8221 1074 Dl -8218 1091 Dl -8205 1096 Dl -8168 1100 Dl -8105 1104 Dl -8013 1108 Dl -7892 1111 Dl -7737 1114 Dl -7548 1116 Dl -7323 1119 Dl -7058 1121 Dl -6753 1122 Dl -6404 1124 Dl -6010 1125 Dl -5569 1126 Dl -5078 1127 Dl -4536 1127 Dl -3940 1127 Dl -3288 1127 Dl -2578 1127 Dl -1808 1126 Dl -976 1126 Dl -80 1125 Dl 7 1125 Dl 8217 1117 Dl 8217 1233 Dl 0 1233 Dl -8333 1233 Dl -8333 0 Dl -8333 -1233 Dl 0 -1233 Dl 8333 -1233 Dl 8333 0 Dl 8333 1233 Dl 8333 1233 DP 0 0 0 0 44 1 21 Dl -7233 867 Dl -7300 867 Dl -7300 469 Dl -7300 18 Dl -7300 -433 Dl -7383 -433 Dl -7435 -427 Dl -7459 -397 Dl -7466 -324 Dl -7467 -283 Dl -7467 -132 Dl -7549 -185 Dl -7647 -220 Dl -7737 -198 Dl -7813 -132 Dl -7869 -33 Dl -7900 88 Dl -7897 221 Dl -7857 353 Dl -7851 365 Dl -7792 452 Dl -7720 486 Dl -7617 481 Dl -7506 470 Dl -7408 467 Dl -7300 469 Dl -7300 867 Dl -7578 867 Dl -7723 864 Dl -7843 859 Dl -7922 851 Dl -7945 844 Dl -7951 806 Dl -7956 711 Dl -7961 567 Dl -7964 385 Dl -7966 173 Dl -7967 -6 Dl -7967 -833 Dl -7600 -833 Dl -7233 -833 Dl -7233 17 Dl -7233 867 Dl -7233 867 DP 0 0 0 0 51 1 21 Dl -6366 -833 Dl -6375 8 Dl -6383 850 Dl -6667 857 Dl -6667 213 Dl -6667 133 Dl -6667 -18 Dl -6667 -335 Dl -6667 -350 Dl -6681 -414 Dl -6735 -433 Dl -6750 -433 Dl -6814 -420 Dl -6833 -366 Dl -6833 -350 Dl -6820 -287 Dl -6766 -267 Dl -6750 -267 Dl -6687 -281 Dl -6667 -335 Dl -6667 -18 Dl -6671 -115 Dl -6681 -169 Dl -6699 -194 Dl -6730 -200 Dl -6750 -200 Dl -6788 -198 Dl -6812 -184 Dl -6826 -145 Dl -6832 -70 Dl -6833 53 Dl -6833 133 Dl -6833 284 Dl -6829 381 Dl -6820 436 Dl -6801 460 Dl -6770 466 Dl -6750 467 Dl -6712 464 Dl -6688 450 Dl -6675 412 Dl -6668 337 Dl -6667 213 Dl -6667 857 Dl -6742 859 Dl -7100 869 Dl -7100 18 Dl -7100 -833 Dl -6733 -833 Dl -6366 -833 Dl -6366 -833 DP 0 0 0 0 57 1 21 Dl -5533 867 Dl -5595 867 Dl -5595 -200 Dl -5681 -200 Dl -5745 -189 Dl -5767 -166 Dl -5790 -158 Dl -5846 -184 Dl -5849 -185 Dl -5945 -219 Dl -6035 -197 Dl -6111 -132 Dl -6169 -36 Dl -6201 79 Dl -6203 202 Dl -6168 320 Dl -6131 379 Dl -6049 442 Dl -5946 468 Dl -5850 455 Dl -5807 427 Dl -5774 409 Dl -5767 440 Dl -5786 503 Dl -5801 535 Dl -5854 582 Dl -5930 600 Dl -5997 586 Dl -6017 567 Dl -6056 544 Dl -6120 534 Dl -6178 536 Dl -6200 552 Dl -6175 620 Dl -6117 692 Dl -6056 734 Dl -5940 755 Dl -5812 735 Dl -5704 683 Dl -5685 667 Dl -5656 630 Dl -5635 580 Dl -5621 505 Dl -5613 391 Dl -5606 225 Dl -5606 199 Dl -5595 -200 Dl -5595 867 Dl -5900 867 Dl -6267 867 Dl -6267 17 Dl -6267 -833 Dl -5900 -833 Dl -5533 -833 Dl -5533 17 Dl -5533 867 Dl -5533 867 DP 0 0 0 0 51 1 21 Dl -4666 -833 Dl -4675 8 Dl -4683 850 Dl -4967 857 Dl -4967 213 Dl -4967 133 Dl -4967 -18 Dl -4967 -335 Dl -4967 -350 Dl -4981 -414 Dl -5035 -433 Dl -5050 -433 Dl -5114 -420 Dl -5133 -366 Dl -5133 -350 Dl -5120 -287 Dl -5066 -267 Dl -5050 -267 Dl -4987 -281 Dl -4967 -335 Dl -4967 -18 Dl -4971 -115 Dl -4981 -169 Dl -4999 -194 Dl -5030 -200 Dl -5050 -200 Dl -5088 -198 Dl -5112 -184 Dl -5126 -145 Dl -5132 -70 Dl -5133 53 Dl -5133 133 Dl -5133 284 Dl -5129 381 Dl -5120 436 Dl -5101 460 Dl -5070 466 Dl -5050 467 Dl -5012 464 Dl -4988 450 Dl -4975 412 Dl -4968 337 Dl -4967 213 Dl -4967 857 Dl -5042 859 Dl -5400 869 Dl -5400 18 Dl -5400 -833 Dl -5033 -833 Dl -4666 -833 Dl -4666 -833 DP 0 0 0 0 50 1 21 Dl -3833 867 Dl -4033 867 Dl -4033 -133 Dl -4054 -188 Dl -4083 -200 Dl -4123 -229 Dl -4133 -302 Dl -4141 -374 Dl -4173 -396 Dl -4208 -394 Dl -4271 -362 Dl -4294 -292 Dl -4311 -225 Dl -4336 -200 Dl -4361 -172 Dl -4367 -133 Dl -4353 -79 Dl -4333 -67 Dl -4316 -36 Dl -4305 46 Dl -4300 164 Dl -4295 308 Dl -4276 400 Dl -4246 449 Dl -4171 491 Dl -4097 485 Dl -4047 436 Dl -4040 408 Dl -4048 346 Dl -4081 333 Dl -4111 320 Dl -4127 270 Dl -4133 171 Dl -4133 133 Dl -4130 17 Dl -4116 -45 Dl -4090 -66 Dl -4083 -67 Dl -4043 -95 Dl -4033 -133 Dl -4033 867 Dl -4200 867 Dl -4567 867 Dl -4567 17 Dl -4567 -833 Dl -4200 -833 Dl -3833 -833 Dl -3833 17 Dl -3833 867 Dl -3833 867 DP 0 0 0 0 45 1 21 Dl -3000 867 Dl -3083 867 Dl -3083 467 Dl -3095 175 Dl -3103 39 Dl -3117 -74 Dl -3133 -145 Dl -3140 -157 Dl -3219 -210 Dl -3322 -225 Dl -3431 -207 Dl -3526 -162 Dl -3587 -94 Dl -3600 -42 Dl -3574 -10 Dl -3518 -1 Dl -3464 -19 Dl -3450 -33 Dl -3404 -59 Dl -3346 -67 Dl -3280 -53 Dl -3265 -18 Dl -3296 23 Dl -3365 58 Dl -3414 70 Dl -3541 115 Dl -3614 198 Dl -3633 295 Dl -3607 402 Dl -3537 470 Dl -3437 487 Dl -3418 484 Dl -3310 469 Dl -3200 465 Dl -3083 467 Dl -3083 867 Dl -3350 867 Dl -3700 867 Dl -3700 17 Dl -3700 -833 Dl -3350 -833 Dl -3000 -833 Dl -3000 17 Dl -3000 867 Dl -3000 867 DP 0 0 0 0 21 1 21 Dl -2133 867 Dl -2433 867 Dl -2433 467 Dl -2433 17 Dl -2433 -433 Dl -2517 -433 Dl -2600 -433 Dl -2600 17 Dl -2600 467 Dl -2517 467 Dl -2433 467 Dl -2433 867 Dl -2500 867 Dl -2867 867 Dl -2867 17 Dl -2867 -833 Dl -2500 -833 Dl -2133 -833 Dl -2133 17 Dl -2133 867 Dl -2133 867 DP 0 0 0 0 53 1 21 Dl 161 -245 Dl 149 -107 Dl 107 14 Dl 37 98 Dl 21 107 Dl -24 118 Dl -24 -233 Dl -27 -318 Dl -42 -379 Dl -77 -420 Dl -143 -446 Dl -248 -460 Dl -402 -466 Dl -604 -467 Dl -1100 -467 Dl -1100 -233 Dl -1100 0 Dl -604 0 Dl -404 -1 Dl -261 -6 Dl -164 -14 Dl -104 -27 Dl -71 -46 Dl -66 -51 Dl -39 -116 Dl -25 -212 Dl -24 -233 Dl -24 118 Dl -41 123 Dl -159 138 Dl -324 150 Dl -525 159 Dl -575 160 Dl -1100 174 Dl -1100 404 Dl -1101 524 Dl -1109 593 Dl -1128 624 Dl -1163 633 Dl -1183 633 Dl -1267 633 Dl -1267 -5 Dl -1267 -643 Dl -655 -625 Dl -453 -618 Dl -273 -607 Dl -124 -595 Dl -21 -582 Dl 25 -571 Dl 100 -497 Dl 145 -382 Dl 161 -245 Dl 161 -245 DP 0 0 0 0 69 1 21 Dl 1928 -76 Dl 1927 144 Dl 1907 310 Dl 1863 431 Dl 1794 519 Dl 1761 543 Dl 1761 -77 Dl 1757 -127 Dl 1746 -242 Dl 1727 -328 Dl 1690 -389 Dl 1628 -429 Dl 1531 -452 Dl 1391 -463 Dl 1198 -467 Dl 1063 -467 Dl 533 -467 Dl 533 0 Dl 533 467 Dl 1067 467 Dl 1269 466 Dl 1415 463 Dl 1517 457 Dl 1584 447 Dl 1627 430 Dl 1659 407 Dl 1665 402 Dl 1728 297 Dl 1760 138 Dl 1761 -77 Dl 1761 543 Dl 1749 553 Dl 1708 575 Dl 1650 591 Dl 1567 603 Dl 1449 612 Dl 1285 620 Dl 1067 626 Dl 1014 627 Dl 785 631 Dl 615 633 Dl 494 630 Dl 416 624 Dl 371 613 Dl 351 598 Dl 350 595 Dl 344 547 Dl 341 445 Dl 339 300 Dl 339 123 Dl 341 -35 Dl 350 -617 Dl 683 -628 Dl 876 -630 Dl 1095 -627 Dl 1304 -619 Dl 1361 -616 Dl 1520 -604 Dl 1629 -591 Dl 1703 -571 Dl 1759 -542 Dl 1811 -500 Dl 1860 -454 Dl 1891 -410 Dl 1909 -351 Dl 1920 -262 Dl 1926 -128 Dl 1928 -76 Dl 1928 -76 DP 0 0 0 0 54 1 21 Dl 3600 -235 Dl 3593 -110 Dl 3567 -14 Dl 3515 57 Dl 3433 104 Dl 3433 -233 Dl 3427 -342 Dl 3403 -404 Dl 3369 -432 Dl 3313 -445 Dl 3203 -455 Dl 3054 -463 Dl 2878 -467 Dl 2819 -467 Dl 2333 -467 Dl 2333 -233 Dl 2333 0 Dl 2819 0 Dl 3000 -2 Dl 3159 -9 Dl 3283 -18 Dl 3357 -30 Dl 3369 -35 Dl 3410 -73 Dl 3429 -144 Dl 3433 -233 Dl 3433 104 Dl 3429 107 Dl 3302 140 Dl 3126 158 Dl 2895 165 Dl 2775 166 Dl 2333 167 Dl 2333 400 Dl 2331 522 Dl 2323 593 Dl 2305 625 Dl 2272 633 Dl 2265 633 Dl 2203 615 Dl 2181 590 Dl 2176 544 Dl 2173 443 Dl 2172 299 Dl 2172 124 Dl 2174 -35 Dl 2183 -617 Dl 2816 -612 Dl 3448 -606 Dl 3524 -518 Dl 3571 -447 Dl 3594 -359 Dl 3600 -235 Dl 3600 -235 DP 0 0 0 0 105 1 21 Dl 6300 278 Dl 6286 409 Dl 6238 500 Dl 6146 558 Dl 6131 561 Dl 6131 239 Dl 6115 147 Dl 6098 121 Dl 6098 -303 Dl 6080 -391 Dl 6054 -430 Dl 5997 -448 Dl 5879 -458 Dl 5698 -461 Dl 5548 -459 Dl 5089 -450 Dl 5057 -355 Dl 5046 -231 Dl 5062 -180 Dl 5079 -148 Dl 5102 -126 Dl 5144 -112 Dl 5215 -104 Dl 5326 -101 Dl 5489 -100 Dl 5559 -100 Dl 5779 -103 Dl 5934 -111 Dl 6028 -126 Dl 6060 -140 Dl 6091 -209 Dl 6098 -303 Dl 6098 121 Dl 6084 101 Dl 6027 81 Dl 5920 67 Dl 5778 58 Dl 5617 53 Dl 5454 54 Dl 5303 60 Dl 5180 72 Dl 5102 88 Dl 5088 96 Dl 5050 163 Dl 5034 262 Dl 5042 361 Dl 5073 427 Dl 5124 445 Dl 5235 458 Dl 5408 465 Dl 5571 467 Dl 5763 465 Dl 5899 460 Dl 5991 451 Dl 6048 436 Dl 6081 414 Dl 6120 339 Dl 6131 239 Dl 6131 561 Dl 6000 595 Dl 5967 601 Dl 5804 617 Dl 5616 626 Dl 5429 627 Dl 5267 619 Dl 5200 611 Dl 5047 580 Dl 4948 539 Dl 4893 475 Dl 4870 378 Dl 4867 283 Dl 4882 138 Dl 4927 41 Dl 4998 0 Dl 5011 -1 Dl 5015 -18 Dl 4975 -59 Dl 4967 -66 Dl 4914 -118 Dl 4890 -186 Dl 4883 -294 Dl 4883 -297 Dl 4897 -438 Dl 4939 -521 Dl 5028 -570 Dl 5179 -605 Dl 5390 -625 Dl 5600 -630 Dl 5849 -622 Dl 6039 -598 Dl 6166 -558 Dl 6223 -514 Dl 6257 -428 Dl 6268 -315 Dl 6257 -199 Dl 6226 -107 Dl 6205 -80 Dl 6166 -41 Dl 6169 -7 Dl 6217 47 Dl 6221 52 Dl 6278 133 Dl 6299 240 Dl 6300 278 Dl 6300 278 DP 0 0 0 0 32 1 21 Dl 7198 -592 Dl 7186 -549 Dl 7154 -454 Dl 7105 -318 Dl 7043 -152 Dl 6973 33 Dl 6894 237 Dl 6834 388 Dl 6789 493 Dl 6753 561 Dl 6722 600 Dl 6692 619 Dl 6658 627 Dl 6653 627 Dl 6588 629 Dl 6573 605 Dl 6581 577 Dl 6601 528 Dl 6639 427 Dl 6693 286 Dl 6758 116 Dl 6824 -58 Dl 6902 -262 Dl 6962 -412 Dl 7007 -515 Dl 7043 -581 Dl 7073 -617 Dl 7101 -631 Dl 7121 -633 Dl 7181 -619 Dl 7198 -592 Dl 7198 -592 DP 0 0 0 0 21 1 21 Dl 7850 216 Dl 7848 375 Dl 7845 486 Dl 7838 557 Dl 7827 598 Dl 7810 618 Dl 7787 625 Dl 7775 627 Dl 7709 618 Dl 7682 593 Dl 7677 546 Dl 7674 444 Dl 7672 299 Dl 7672 123 Dl 7674 -35 Dl 7683 -617 Dl 7767 -617 Dl 7850 -617 Dl 7850 0 Dl 7850 216 Dl 7850 216 DP 0 0 0 0 10 1 21 Dl 4600 167 Dl 4250 167 Dl 3900 167 Dl 3900 83 Dl 3900 0 Dl 4250 0 Dl 4600 0 Dl 4600 83 Dl 4600 167 Dl 4600 167 DP 0 0 0 0 15 1 21 Dl -7473 83 Dl -7474 178 Dl -7508 264 Dl -7573 319 Dl -7605 327 Dl -7685 315 Dl -7713 282 Dl -7736 169 Dl -7724 65 Dl -7684 -15 Dl -7623 -55 Dl -7573 -52 Dl -7505 -1 Dl -7473 83 Dl -7473 83 DP 0 0 0 0 16 1 21 Dl -5780 194 Dl -5813 279 Dl -5870 328 Dl -5940 329 Dl -5993 293 Dl -6024 226 Dl -6032 129 Dl -6019 33 Dl -5986 -31 Dl -5985 -32 Dl -5911 -60 Dl -5841 -31 Dl -5791 46 Dl -5782 82 Dl -5780 194 Dl -5780 194 DP 0 0 0 0 12 1 21 Dl -3267 227 Dl -3288 302 Dl -3338 351 Dl -3398 363 Dl -3447 330 Dl -3457 312 Dl -3449 247 Dl -3416 212 Dl -3336 171 Dl -3283 180 Dl -3267 227 Dl -3267 227 $EndMODULE LOGO $EndLIBRARY |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="1240.1575" height="708.66138" id="svg3354" version="1.1" inkscape:version="0.91 r13725" sodipodi:docname="logo.svg" inkscape:export-filename="C:\temp29\PDP8other\FP repro\pics\PDP8 color test 2.png" inkscape:export-xdpi="149.95352" inkscape:export-ydpi="149.95352"> <defs id="defs3"> <marker style="overflow:visible" id="DistanceEnd" refX="0.0" refY="0.0" orient="auto" inkscape:stockid="DistanceEnd"> <g id="g2301"> <path style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square" d="M 0,0 L -2,0" id="path2316" /> <path style="fill:#000000;fill-rule:evenodd;stroke:none" d="M 0,0 L -13,4 L -9,0 -13,-4 L 0,0 z " id="path2312" /> <path style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square" d="M 0,-4 L 0,40" id="path2314" /> </g> </marker> <marker style="overflow:visible" id="DistanceStart" refX="0.0" refY="0.0" orient="auto" inkscape:stockid="DistanceStart"> <g id="g2300"> <path style="fill:none;stroke:#ffffff;stroke-width:1.15;stroke-linecap:square" d="M 0,0 L 2,0" id="path2306" /> <path style="fill:#000000;fill-rule:evenodd;stroke:none" d="M 0,0 L 13,4 L 9,0 13,-4 L 0,0 z " id="path2302" /> <path style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square" d="M 0,-4 L 0,40" id="path2304" /> </g> </marker> <linearGradient id="linearGradient14215"> <stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop14217" /> <stop style="stop-color:#090909;stop-opacity:1;" offset="1" id="stop14219" /> </linearGradient> <linearGradient id="linearGradient12986"> <stop id="stop12988" offset="0" style="stop-color:#684512;stop-opacity:1;" /> <stop style="stop-color:#8e6217;stop-opacity:1;" offset="1" id="stop12994" /> </linearGradient> <linearGradient id="linearGradient12800"> <stop style="stop-color:#dec287;stop-opacity:1;" offset="0" id="stop12802" /> <stop style="stop-color:#e9e5a6;stop-opacity:1;" offset="1" id="stop12804" /> </linearGradient> <linearGradient id="linearGradient5562" osb:paint="solid"> <stop style="stop-color:#e9e5a6;stop-opacity:1;" offset="0" id="stop5564" /> </linearGradient> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12916" cx="1132.0865" cy="882.81488" fx="1132.0865" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12918" cx="1096.6534" cy="882.81488" fx="1096.6534" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12920" cx="1061.2205" cy="882.81488" fx="1061.2205" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12922" cx="1025.7874" cy="882.81488" fx="1025.7874" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12924" cx="990.35425" cy="882.81488" fx="990.35425" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12926" cx="954.92114" cy="882.81488" fx="954.92114" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12928" cx="919.48816" cy="882.81488" fx="919.48816" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12930" cx="884.05511" cy="882.81488" fx="884.05511" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12932" cx="848.62201" cy="882.81488" fx="848.62201" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12934" cx="813.18896" cy="882.81488" fx="813.18896" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12936" cx="777.75586" cy="882.81488" fx="777.75586" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12938" cx="742.32281" cy="882.81488" fx="742.32281" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12940" cx="706.88977" cy="882.81488" fx="706.88977" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12942" cx="671.45667" cy="882.81488" fx="671.45667" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12944" cx="636.02356" cy="882.81488" fx="636.02356" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12946" cx="600.59052" cy="882.81488" fx="600.59052" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12948" cx="565.15741" cy="882.81488" fx="565.15741" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12950" cx="529.7243" cy="882.81488" fx="529.7243" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12952" cx="494.29135" cy="882.81488" fx="494.29135" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12954" cx="458.85828" cy="882.81488" fx="458.85828" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12956" cx="423.4252" cy="882.81488" fx="423.4252" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12958" cx="387.99216" cy="882.81488" fx="387.99216" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient12960" cx="352.55905" cy="882.81488" fx="352.55905" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12962" cx="317.12598" cy="882.81488" fx="317.12598" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12964" cx="281.69293" cy="882.81488" fx="281.69293" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient12966" cx="246.25984" cy="882.81488" fx="246.25984" fy="882.81488" r="12.933071" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5725" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1132.0865" cy="882.81488" fx="1132.0865" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5728" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1096.6534" cy="882.81488" fx="1096.6534" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5731" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1061.2205" cy="882.81488" fx="1061.2205" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5734" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1025.7874" cy="882.81488" fx="1025.7874" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5737" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="990.35425" cy="882.81488" fx="990.35425" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5740" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="954.92114" cy="882.81488" fx="954.92114" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5743" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="919.48816" cy="882.81488" fx="919.48816" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5746" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="884.05511" cy="882.81488" fx="884.05511" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5749" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="848.62201" cy="882.81488" fx="848.62201" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5752" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="813.18896" cy="882.81488" fx="813.18896" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5755" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="777.75586" cy="882.81488" fx="777.75586" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5758" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="742.32281" cy="882.81488" fx="742.32281" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5761" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="706.88977" cy="882.81488" fx="706.88977" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5764" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="671.45667" cy="882.81488" fx="671.45667" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5767" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="636.02356" cy="882.81488" fx="636.02356" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5770" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="600.59052" cy="882.81488" fx="600.59052" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5773" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="565.15741" cy="882.81488" fx="565.15741" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5776" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="529.7243" cy="882.81488" fx="529.7243" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5779" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="494.29135" cy="882.81488" fx="494.29135" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5782" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="458.85828" cy="882.81488" fx="458.85828" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5785" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="423.4252" cy="882.81488" fx="423.4252" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5788" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="387.99216" cy="882.81488" fx="387.99216" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient5791" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="352.55905" cy="882.81488" fx="352.55905" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5794" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="317.12598" cy="882.81488" fx="317.12598" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5797" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="281.69293" cy="882.81488" fx="281.69293" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient5800" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="246.25984" cy="882.81488" fx="246.25984" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17727" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1132.0865" cy="882.81488" fx="1132.0865" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17730" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1096.6534" cy="882.81488" fx="1096.6534" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17733" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1061.2205" cy="882.81488" fx="1061.2205" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17736" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1025.7874" cy="882.81488" fx="1025.7874" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17739" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="990.35425" cy="882.81488" fx="990.35425" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17742" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="954.92114" cy="882.81488" fx="954.92114" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17745" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="919.48816" cy="882.81488" fx="919.48816" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17748" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="884.05511" cy="882.81488" fx="884.05511" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17751" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="848.62201" cy="882.81488" fx="848.62201" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17754" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="813.18896" cy="882.81488" fx="813.18896" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17757" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="777.75586" cy="882.81488" fx="777.75586" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17760" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="742.32281" cy="882.81488" fx="742.32281" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17763" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="706.88977" cy="882.81488" fx="706.88977" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17766" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="671.45667" cy="882.81488" fx="671.45667" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17769" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="636.02356" cy="882.81488" fx="636.02356" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17772" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="600.59052" cy="882.81488" fx="600.59052" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17775" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="565.15741" cy="882.81488" fx="565.15741" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17778" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="529.7243" cy="882.81488" fx="529.7243" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17781" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="494.29135" cy="882.81488" fx="494.29135" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17784" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="458.85828" cy="882.81488" fx="458.85828" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17787" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="423.4252" cy="882.81488" fx="423.4252" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17790" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="387.99216" cy="882.81488" fx="387.99216" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient17793" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="352.55905" cy="882.81488" fx="352.55905" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17796" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="317.12598" cy="882.81488" fx="317.12598" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17799" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="281.69293" cy="882.81488" fx="281.69293" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient17802" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="246.25984" cy="882.81488" fx="246.25984" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18251" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1132.0865" cy="882.81488" fx="1132.0865" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18254" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1096.6534" cy="882.81488" fx="1096.6534" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18257" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1061.2205" cy="882.81488" fx="1061.2205" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18260" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="1025.7874" cy="882.81488" fx="1025.7874" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18263" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="990.35425" cy="882.81488" fx="990.35425" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18266" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="954.92114" cy="882.81488" fx="954.92114" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18269" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="919.48816" cy="882.81488" fx="919.48816" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18272" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="884.05511" cy="882.81488" fx="884.05511" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18275" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="848.62201" cy="882.81488" fx="848.62201" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18278" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="813.18896" cy="882.81488" fx="813.18896" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18281" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="777.75586" cy="882.81488" fx="777.75586" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18284" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="742.32281" cy="882.81488" fx="742.32281" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18287" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="706.88977" cy="882.81488" fx="706.88977" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18290" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="671.45667" cy="882.81488" fx="671.45667" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18293" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="636.02356" cy="882.81488" fx="636.02356" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18296" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="600.59052" cy="882.81488" fx="600.59052" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18299" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="565.15741" cy="882.81488" fx="565.15741" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18302" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="529.7243" cy="882.81488" fx="529.7243" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18305" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="494.29135" cy="882.81488" fx="494.29135" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18308" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="458.85828" cy="882.81488" fx="458.85828" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18311" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="423.4252" cy="882.81488" fx="423.4252" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18314" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="387.99216" cy="882.81488" fx="387.99216" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12800" id="radialGradient18317" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="352.55905" cy="882.81488" fx="352.55905" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18320" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="317.12598" cy="882.81488" fx="317.12598" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18323" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="281.69293" cy="882.81488" fx="281.69293" fy="882.81488" r="12.933071" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient12986" id="radialGradient18326" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,2.8219176,-1e-7,-1608.416)" cx="246.25984" cy="882.81488" fx="246.25984" fy="882.81488" r="12.933071" /> </defs> <sodipodi:namedview inkscape:document-units="mm" id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="2.0000001" inkscape:cx="242.3608" inkscape:cy="647.5798" inkscape:current-layer="layer1" showgrid="true" units="mm" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:window-width="1366" inkscape:window-height="713" inkscape:window-x="-4" inkscape:window-y="-4" inkscape:window-maximized="1" inkscape:snap-global="true" inkscape:snap-to-guides="false" objecttolerance="20" inkscape:snap-grids="true"> <inkscape:grid type="xygrid" id="grid3820" empspacing="4" visible="true" enabled="true" snapvisiblegridlinesonly="true" units="mm" spacingx="0.25mm" spacingy="0.25mm" /> </sodipodi:namedview> <metadata id="metadata4"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title /> </cc:Work> </rdf:RDF> </metadata> <g inkscape:label="Layer 1 - colours" inkscape:groupmode="layer" id="layer1" transform="translate(0,-343.70078)" style="display:inline"> <rect style="display:inline;fill:#000000;fill-opacity:1;stroke:#f2eedf;stroke-width:2.24368739;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="rect3002-3-6-6" width="319.35474" height="45.559261" x="72.992584" y="424.90192" ry="0" rx="0" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:none" inkscape:connector-curvature="0" d="m 79.192582,431.23027 112.189428,0 0,0.0974 c -4.66617,0.009 -9.33334,-0.0175 -13.99852,0.0127 -0.0296,11.00242 -0.004,22.00581 -0.0128,33.0092 l -2.36811,0 c 0,-9.90364 0,-19.8063 0,-29.70993 -0.0109,-1.09976 0.0207,-2.20049 -0.0128,-3.29927 -2.06717,-0.0312 -4.13533,-0.003 -6.20348,-0.0127 -2.59407,0.009 -5.18914,-0.0175 -7.78222,0.0127 -0.0296,11.00242 -0.004,22.00581 -0.0128,33.0092 l -2.26945,0 c 0,-10.5855 0,-21.17003 0,-31.75554 -0.003,-0.41788 0.0168,-0.83674 -0.0128,-1.25366 -2.69175,-0.0302 -5.38548,-0.004 -8.07823,-0.0127 -1.96948,0.01 -3.93896,-0.0185 -5.90746,0.0127 -0.0296,11.00242 -0.004,22.00581 -0.0128,33.0092 l -2.36811,0 c 0,-10.48809 0,-20.97619 0,-31.46331 -0.007,-0.51529 0.0207,-1.03156 -0.0128,-1.54589 -1.80372,-0.0321 -3.60941,-0.003 -5.41509,-0.0127 -2.85654,0.009 -5.71506,-0.0175 -8.57061,0.0127 -0.0296,11.00242 -0.004,22.00581 -0.0128,33.0092 l -2.36812,0 c -0.009,-11.00339 0.0168,-22.00678 -0.0128,-33.0092 -3.51467,-0.0302 -7.03034,-0.004 -10.54501,-0.0127 -1.14657,0.0107 -2.2951,-0.0205 -3.44068,0.0127 -0.0296,11.00242 -0.004,22.00581 -0.0128,33.0092 l -2.36811,0 c 0,-10.55238 0,-21.10574 0,-31.65813 -0.004,-0.45003 0.0188,-0.90103 -0.0128,-1.35107 -3.51469,-0.0302 -7.03034,-0.004 -10.545022,-0.0127 -1.14655,0.0107 -2.29509,-0.0205 -3.44067,0.0127 -0.0296,11.00242 -0.004,22.00581 -0.0128,33.0092 l -2.368117,0 c 0,-10.5855 0,-21.17003 0,-31.75554 -0.002,-0.41788 0.0168,-0.83674 -0.0128,-1.25366 -4.665184,-0.0292 -9.332347,-0.004 -13.998519,-0.0127 l 0,-0.0974 z" id="path6934-6" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#f2eedf;fill-opacity:1" inkscape:connector-curvature="0" d="m 79.192582,431.32768 c 4.666172,0.009 9.333335,-0.0166 13.998519,0.0127 0.0296,0.41692 0.0109,0.83578 0.0128,1.25366 0,10.58551 0,21.17004 0,31.75554 l -14.011349,0 0,-33.02186 z" id="path6936-0" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#f2eedf;fill-opacity:1" inkscape:connector-curvature="0" d="m 95.584868,431.34034 c 1.14558,-0.0331 2.29412,-0.002 3.44067,-0.0127 3.514682,0.009 7.030332,-0.0175 10.545022,0.0127 0.0316,0.45004 0.009,0.90104 0.0128,1.35107 0,10.55239 0,21.10575 0,31.65813 l -14.011332,0 c 0.009,-11.00339 -0.0168,-22.00678 0.0128,-33.0092 z" id="path6938-2" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#f2eedf;fill-opacity:1" inkscape:connector-curvature="0" d="m 111.96432,431.34034 c 1.14558,-0.0331 2.29411,-0.002 3.44068,-0.0127 3.51467,0.009 7.03034,-0.0175 10.54501,0.0127 0.0296,11.00242 0.004,22.00581 0.0128,33.0092 l -14.01135,0 c 0.009,-11.00339 -0.0168,-22.00678 0.0128,-33.0092 z" id="path6940-4" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#f2eedf;fill-opacity:1" inkscape:connector-curvature="0" d="m 128.34378,431.34034 c 2.85555,-0.0302 5.71407,-0.004 8.57061,-0.0127 1.80568,0.01 3.61137,-0.0195 5.41509,0.0127 0.0335,0.51433 0.006,1.0306 0.0128,1.54589 0,10.48712 0,20.97522 0,31.46331 l -14.01134,0 c 0.009,-11.00339 -0.0168,-22.00678 0.0128,-33.0092 z" id="path6942-8" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#f2eedf;fill-opacity:1" inkscape:connector-curvature="0" d="m 144.72324,431.34034 c 1.9685,-0.0312 3.93798,-0.003 5.90746,-0.0127 2.69275,0.009 5.38648,-0.0175 8.07823,0.0127 0.0296,0.41692 0.01,0.83578 0.0128,1.25366 0,10.58551 0,21.17004 0,31.75554 l -14.01135,0 c 0.009,-11.00339 -0.0168,-22.00678 0.0128,-33.0092 z" id="path6944-6" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#f2eedf;fill-opacity:1" inkscape:connector-curvature="0" d="m 161.00403,431.34034 c 2.59308,-0.0302 5.18815,-0.004 7.78222,-0.0127 2.06815,0.01 4.13631,-0.0185 6.20348,0.0127 0.0335,1.09878 0.002,2.19951 0.0128,3.29927 0,9.90363 0,19.80629 0,29.70993 l -14.01134,0 c 0.009,-11.00339 -0.0168,-22.00678 0.0128,-33.0092 z" id="path6946-5" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#f2eedf;fill-opacity:1" inkscape:connector-curvature="0" d="m 177.38349,431.34034 c 4.66518,-0.0302 9.33235,-0.004 13.99852,-0.0127 l 0,33.02186 -14.01135,0 c 0.009,-11.00339 -0.0168,-22.00678 0.0128,-33.0092 z" id="path6948-0" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#000000;fill-opacity:1" inkscape:connector-curvature="0" d="m 88.486447,439.13409 c 1.067619,-0.0195 2.139197,-0.0331 3.205844,0.008 9.9e-4,5.92737 0,11.85572 0,17.7831 -1.016327,0.0448 -2.036586,0.0185 -3.054874,0.0146 -0.0582,-0.54452 -0.0178,-1.09293 -0.01,-1.6394 -0.416399,0.53867 -0.802199,1.128 -1.403108,1.48744 -0.872258,0.5942 -1.983297,0.60979 -2.997635,0.51238 -1.028159,-0.18508 -1.942847,-0.80363 -2.586186,-1.60337 -0.896919,-1.07345 -1.379428,-2.43913 -1.526448,-3.81163 -0.14307,-1.72805 -0.0622,-3.52039 0.575259,-5.15395 0.50322,-1.26243 1.394228,-2.46154 2.694716,-2.99827 0.781479,-0.35457 1.662618,-0.37405 2.504276,-0.29807 0.693669,0.0857 1.326148,0.44029 1.835297,0.90201 0.2822,0.2523 0.48053,0.57862 0.742009,0.85234 0.0444,-2.01833 -9.9e-4,-4.03763 0.0207,-6.05498 z" id="path6950-9" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#000000;fill-opacity:1" inkscape:connector-curvature="0" d="m 100.9082,439.12922 c 1.05578,-0.0156 2.11255,-0.0156 3.16734,0 0.0385,1.06371 0.0385,2.13327 0,3.19698 -1.05479,0.0156 -2.11156,0.0156 -3.16734,0 -0.0148,-1.06469 -0.0148,-2.1323 0,-3.19698 z" id="path6952-0" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#000000;fill-opacity:1" inkscape:connector-curvature="0" d="m 133.66711,439.12824 c 1.05578,-0.0146 2.11157,-0.0146 3.16736,9.8e-4 0.0385,1.06371 0.0385,2.13327 0,3.19698 -1.0548,0.0156 -2.11158,0.0156 -3.16638,9.7e-4 -0.0158,-1.06566 -0.0158,-2.13327 -9.8e-4,-3.19893 z" id="path6954-0" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#000000;fill-opacity:1" inkscape:connector-curvature="0" d="m 182.81732,439.13409 c 1.04198,-0.0263 2.08592,-0.0175 3.12888,-0.006 0.0148,5.93614 0.0148,11.87423 9.9e-4,17.8094 -1.04296,0.0127 -2.08789,0.0214 -3.12987,-0.005 -0.007,-5.93224 -0.008,-11.86644 0,-17.79868 z" id="path6956-6" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#000000;fill-opacity:1" inkscape:connector-curvature="0" d="m 149.84922,440.19975 c 1.03901,-0.007 2.08,-0.0302 3.11802,0.0136 0.0178,1.22346 -0.0316,2.44887 0.0207,3.67039 0.62459,0.0331 1.25116,-0.0146 1.87772,0.0185 0.0158,0.81434 0.0148,1.62966 0,2.444 -0.61373,0.0584 -1.23043,-9.7e-4 -1.84516,0.0205 -0.0592,0.14124 -0.0543,0.29613 -0.0572,0.44614 0.0109,2.24139 -9.9e-4,4.48181 0.006,6.72321 0.01,0.28054 0.0178,0.66531 0.35028,0.76272 0.50618,0.12176 1.03112,0.0409 1.5452,0.0292 0.005,0.85623 0.0395,1.71538 -0.0188,2.56966 -0.743,0.10228 -1.47613,0.36042 -2.23491,0.26496 -0.78148,-0.0399 -1.63499,-0.20066 -2.19643,-0.78317 -0.47165,-0.49679 -0.594,-1.21178 -0.57426,-1.86832 0.003,-2.37095 0,-4.74093 9.9e-4,-7.1109 -0.002,-0.34581 0.0158,-0.69259 -0.0257,-1.03644 -0.54368,-0.0185 -1.09032,0.0487 -1.63104,-0.0243 -0.0118,-0.81045 -0.01,-1.62187 -0.002,-2.43232 0.5496,-0.0419 1.10018,0.0107 1.64979,-0.0224 0.0296,-1.22736 -0.0118,-2.45667 0.0168,-3.685 z" id="path6958-1" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#000000;fill-opacity:1" inkscape:connector-curvature="0" d="m 114.40743,445.05367 c 0.77062,-1.03547 2.05335,-1.7037 3.36568,-1.65109 0.77062,-0.0399 1.57677,0.0916 2.21024,0.55133 0.57131,0.36724 0.94626,0.93903 1.3074,1.49329 0.008,-0.58056 -0.0385,-1.16209 0.0168,-1.74071 1.01829,-0.0117 2.03856,-0.0204 3.05783,0.006 0.006,4.31427 0.007,8.62952 -9.9e-4,12.94379 -0.0434,1.34425 -0.21511,2.78981 -1.07749,3.88567 -0.90383,1.14554 -2.40956,1.63453 -3.82747,1.74558 -1.01829,0.0205 -2.06321,0.0906 -3.0519,-0.20261 -1.03901,-0.27957 -2.04744,-0.85526 -2.6365,-1.76896 -0.3789,-0.63122 -0.63348,-1.35497 -0.63249,-2.09528 1.1367,-0.003 2.27734,-0.037 3.41206,0.0175 0.13321,0.33314 0.22695,0.72083 0.54566,0.93416 0.5348,0.38477 1.22845,0.36723 1.85896,0.3497 0.62065,-0.0136 1.26596,-0.25619 1.66064,-0.74616 0.27431,-0.33606 0.41541,-0.75687 0.48843,-1.17768 0.12433,-0.77343 0.17761,-1.55953 0.1184,-2.34173 -0.28713,0.31464 -0.48645,0.7033 -0.82193,0.97507 -0.70155,0.64291 -1.69123,0.86792 -2.62664,0.8163 -1.31627,0.0507 -2.60886,-0.58544 -3.42093,-1.5985 -1.15545,-1.39782 -1.52645,-3.26419 -1.49981,-5.02925 -0.0444,-1.88196 0.39863,-3.83794 1.55408,-5.3663 z" id="path6960-3" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#000000;fill-opacity:1" inkscape:connector-curvature="0" d="m 163.99772,444.81404 c 0.76767,-0.8835 1.95468,-1.29262 3.10224,-1.39198 0.98474,-0.0302 1.99217,-0.0701 2.94928,0.20943 0.8318,0.23963 1.70702,0.57277 2.25761,1.26925 0.54072,0.71206 0.70352,1.62576 0.70451,2.49758 0.007,2.46738 0,4.93574 0.003,7.4041 0.007,0.38088 0.0296,0.76759 0.13419,1.13677 0.0947,0.38185 0.66406,0.5455 0.49632,0.99845 -1.12288,0.0117 -2.24872,0.0234 -3.37161,-0.006 -0.21115,-0.45101 -0.2299,-0.95559 -0.31081,-1.43777 -0.91073,0.98968 -2.12242,1.89267 -3.54428,1.84494 -1.01335,0.0789 -2.06125,-0.24158 -2.79635,-0.94487 -0.6384,-0.57472 -0.9798,-1.4066 -1.0834,-2.24042 -0.10755,-0.97507 -0.0414,-1.99593 0.38974,-2.89404 0.38087,-0.81532 1.10808,-1.44848 1.95074,-1.77383 1.05578,-0.43055 2.20432,-0.52212 3.32227,-0.69064 0.48053,-0.0925 1.02025,-0.14806 1.38139,-0.51042 0.42626,-0.40328 0.36509,-1.09294 0.076,-1.55466 -0.31476,-0.40912 -0.87817,-0.51627 -1.36857,-0.5416 -0.59301,-0.0204 -1.26398,-0.0409 -1.74155,0.36626 -0.41837,0.3536 -0.54368,0.90104 -0.65321,1.40757 -1.00349,0.0438 -2.01191,0.0273 -3.01639,0.008 0.0493,-1.12216 0.36509,-2.28815 1.11894,-3.15607 z" id="path6962-8" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#000000;fill-opacity:1" inkscape:connector-curvature="0" d="m 100.90918,443.70649 c 1.0548,-0.0146 2.11157,-0.0146 3.16636,9.8e-4 0.0128,0.12663 0.0207,0.25326 0.0247,0.38087 -0.005,3.86424 -9.8e-4,7.7275 -0.002,11.59174 -0.004,0.41887 0.0227,0.83968 -0.0227,1.25854 -1.05479,0.0136 -2.11156,0.0146 -3.16734,0 -0.0138,-4.41071 -0.0138,-8.82239 9.8e-4,-13.23213 z" id="path6964-9" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#000000;fill-opacity:1" inkscape:connector-curvature="0" d="m 133.66711,443.70649 c 1.05578,-0.0146 2.11256,-0.0146 3.16834,9.8e-4 0.0523,1.42413 0.006,2.85118 0.0217,4.27725 9.9e-4,2.85703 -0.003,5.71503 0.002,8.57205 -0.004,0.12761 -0.0118,0.25424 -0.0247,0.38087 -1.05579,0.0156 -2.11158,0.0156 -3.16736,9.8e-4 -0.0138,-4.41071 -0.0138,-8.82239 0,-13.23213 z" id="path6966-3" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#f2eedf;fill-opacity:1" inkscape:connector-curvature="0" d="m 85.241142,446.54209 c 0.643339,-0.13832 1.374488,-0.10228 1.923107,0.29418 0.694649,0.48022 1.073549,1.28288 1.244248,2.08261 0.2447,1.32185 0.24766,2.73429 -0.276279,3.9938 -0.29108,0.70622 -0.865349,1.35594 -1.652748,1.50498 -0.602889,0.0877 -1.275828,0.0906 -1.798787,-0.26204 -0.628529,-0.40035 -0.954148,-1.11534 -1.143598,-1.80402 -0.34239,-1.40075 -0.3266,-2.9145 0.18452,-4.27434 0.256539,-0.68868 0.771608,-1.3423 1.519537,-1.53517 z" id="path6968-4" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#f2eedf;fill-opacity:1" inkscape:connector-curvature="0" d="m 118.00005,446.54209 c 0.71241,-0.15683 1.53237,-0.0877 2.09875,0.41009 0.77161,0.63122 1.03703,1.64623 1.13768,2.59012 0.0592,1.02865 0.0533,2.09821 -0.34042,3.06841 -0.28417,0.71304 -0.89396,1.32574 -1.65867,1.51374 -0.62163,0.10618 -1.31529,0.0643 -1.8412,-0.31366 -0.61275,-0.43249 -0.92258,-1.15527 -1.10414,-1.85273 -0.26049,-1.13287 -0.22694,-2.32224 0.0454,-3.4483 0.21511,-0.85038 0.75385,-1.72804 1.66261,-1.96767 z" id="path6970-4" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="fill:#f2eedf;fill-opacity:1" inkscape:connector-curvature="0" d="m 168.72409,451.03267 c 0.40159,-0.0925 0.76864,-0.28151 1.14853,-0.43445 0.0335,0.84357 0.0493,1.71247 -0.20919,2.52584 -0.37692,1.2108 -1.82936,1.84883 -3.03118,1.57316 -0.42823,-0.12468 -0.79332,-0.46464 -0.891,-0.90104 -0.2378,-0.72375 -0.0829,-1.64817 0.60189,-2.08456 0.71439,-0.44029 1.5827,-0.47926 2.38095,-0.67895 z" id="path6972-6" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path inkscape:connector-curvature="0" id="path7761" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:36.72209167px;line-height:125%;font-family:MicrogrammaDMedExt;-inkscape-font-specification:MicrogrammaDMedExt;letter-spacing:1.20229423px;word-spacing:0px;fill:#f2eedf;fill-opacity:1;stroke:none" d="m 208.03935,459.70842 0,-24.04361 15.77037,0 c 4.13727,0.0822 6.6318,0.17617 7.48363,0.28183 0.79092,0.10571 1.51799,0.37873 2.18119,0.81907 0.66316,0.44038 1.15903,0.98936 1.48761,1.64694 0.53538,1.05688 0.80309,2.61869 0.80312,4.68543 -3e-5,1.62053 -0.14302,2.89757 -0.42894,3.83112 -0.286,0.93357 -0.75753,1.67044 -1.41459,2.2106 -0.6693,0.55193 -1.36594,0.92476 -2.08994,1.11851 -0.72404,0.19377 -1.84659,0.31414 -3.36762,0.36109 -0.54762,0.0118 -2.0991,0.0235 -4.65446,0.0353 l -12.44837,0 0,9.05379 z m 3.322,-11.87208 12.44837,0 c 3.04211,-0.0117 4.9343,-0.0588 5.67661,-0.14092 0.74224,-0.0822 1.36892,-0.32291 1.88003,-0.72219 0.37719,-0.3053 0.63882,-0.73098 0.78487,-1.27704 0.14599,-0.54603 0.219,-1.37684 0.21903,-2.49243 -3e-5,-1.23299 -0.0639,-2.11076 -0.19166,-2.63335 -0.1278,-0.52253 -0.38029,-0.92473 -0.75749,-1.20658 -0.48676,-0.35226 -1.09822,-0.57245 -1.8344,-0.66054 -0.73621,-0.088 -2.66187,-0.16145 -5.77699,-0.22018 l -12.44837,0 z" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path inkscape:connector-curvature="0" id="path7763" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:36.72209167px;line-height:125%;font-family:MicrogrammaDMedExt;-inkscape-font-specification:MicrogrammaDMedExt;letter-spacing:1.20229423px;word-spacing:0px;fill:#f2eedf;fill-opacity:1;stroke:none" d="m 239.34375,459.70842 0,-24.04361 17.19408,0 c 3.80872,2e-5 6.48579,0.15268 8.03121,0.45798 1.86175,0.36405 3.27938,1.32109 4.25289,2.87113 0.49887,0.7868 0.85176,1.84073 1.05866,3.16179 0.20683,1.32109 0.31026,3.16179 0.31029,5.52209 -3e-5,2.94749 -0.27382,5.28432 -0.82137,7.01053 -0.85183,2.65389 -2.66493,4.20983 -5.43931,4.6678 -1.43591,0.23486 -3.81485,0.35229 -7.13683,0.35229 z m 3.322,-2.81831 13.98161,0 c 2.39716,1e-5 3.88477,-0.0146 4.46278,-0.044 0.57799,-0.0294 1.21379,-0.12623 1.90742,-0.29064 1.35067,-0.30531 2.31807,-1.15667 2.90219,-2.55407 0.58405,-1.39741 0.87609,-3.55223 0.87613,-6.46448 -4e-5,-3.7812 -0.50502,-6.2707 -1.51498,-7.46848 -0.37725,-0.45796 -0.87616,-0.80144 -1.49673,-1.03045 -0.62062,-0.22896 -1.46632,-0.39042 -2.53713,-0.48439 -0.63279,-0.047 -2.22077,-0.0704 -4.76396,-0.0704 l -13.81733,0 z" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path inkscape:connector-curvature="0" id="path7765" style="font-style:normal;font-weight:normal;font-size:14.36951351px;line-height:125%;font-family:Sans;letter-spacing:6.15248108px;word-spacing:0px;fill:#f2eedf;fill-opacity:1;stroke:none" d="m 274.66376,459.70842 0,-24.04361 15.77036,0 c 4.13727,0.0822 6.63181,0.17617 7.48362,0.28183 0.79094,0.10571 1.51801,0.37873 2.18121,0.81907 0.66316,0.44038 1.15902,0.98936 1.4876,1.64694 0.53539,1.05688 0.80309,2.61869 0.80312,4.68543 -3e-5,1.62053 -0.14301,2.89757 -0.42894,3.83112 -0.28599,0.93357 -0.75752,1.67044 -1.41458,2.2106 -0.6693,0.55193 -1.36594,0.92476 -2.08995,1.11851 -0.72405,0.19377 -1.84659,0.31414 -3.36763,0.36109 -0.5476,0.0118 -2.09908,0.0235 -4.65445,0.0353 l -12.44836,0 0,9.05379 z m 3.322,-11.87208 12.44836,0 c 3.04211,-0.0117 4.93431,-0.0588 5.6766,-0.14092 0.74226,-0.0822 1.36893,-0.32291 1.88004,-0.72219 0.3772,-0.3053 0.63882,-0.73098 0.78487,-1.27704 0.14599,-0.54603 0.219,-1.37684 0.21903,-2.49243 -3e-5,-1.23299 -0.0639,-2.11076 -0.19166,-2.63335 -0.12779,-0.52253 -0.38029,-0.92473 -0.75748,-1.20658 -0.48677,-0.35226 -1.09824,-0.57245 -1.83441,-0.66054 -0.73621,-0.088 -2.66187,-0.16145 -5.77699,-0.22018 l -12.44836,0 z" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path inkscape:connector-curvature="0" id="path7767" style="font-style:normal;font-weight:normal;font-size:14.36951351px;line-height:125%;font-family:Sans;letter-spacing:1.5733726px;word-spacing:0px;fill:#f2eedf;fill-opacity:1;stroke:none" d="m 350.43546,447.20222 c 1.19248,0.31707 2.03819,0.69284 2.53713,1.12732 0.88827,0.78678 1.33241,2.33685 1.33245,4.65019 -4e-5,1.64401 -0.21603,2.90931 -0.64798,3.79589 -0.43201,0.8866 -1.15299,1.54126 -2.16295,1.96401 -1.6671,0.69282 -5.48192,1.03924 -11.44446,1.03924 -3.60189,0 -6.30329,-0.10862 -8.10422,-0.32586 -1.80095,-0.21724 -3.06038,-0.59009 -3.77831,-1.11852 -0.66928,-0.46971 -1.14384,-1.09502 -1.42372,-1.87593 -0.27988,-0.78089 -0.41982,-1.86418 -0.41982,-3.24984 0,-2.00804 0.27684,-3.42893 0.83051,-4.26268 0.55366,-0.83373 1.60319,-1.41501 3.1486,-1.74382 -1.31421,-0.25833 -2.24205,-0.76328 -2.78354,-1.51484 -0.54151,-0.75153 -0.81225,-1.9082 -0.81225,-3.47003 0,-2.99442 0.82137,-4.89089 2.46411,-5.68944 1.27769,-0.63409 4.64227,-0.95114 10.09377,-0.95116 5.12292,2e-5 8.3719,0.0822 9.74696,0.2466 1.6914,0.21139 2.92345,0.81027 3.69618,1.79666 0.77267,0.98642 1.15902,2.44842 1.15905,4.38597 -3e-5,2.13722 -0.48677,3.58748 -1.46022,4.35075 -0.35291,0.2701 -1.01002,0.55193 -1.97129,0.84549 z m -11.20719,-8.80718 c -2.73792,2e-5 -4.65446,0.0412 -5.74961,0.1233 -1.09517,0.0822 -1.83745,0.23488 -2.22683,0.45797 -0.8153,0.48148 -1.22294,1.58532 -1.22293,3.31151 -1e-5,0.9277 0.0852,1.6264 0.25553,2.0961 0.17036,0.46974 0.4624,0.81028 0.87613,1.02163 0.48674,0.24662 1.22597,0.41396 2.21771,0.50202 0.99172,0.0881 2.68618,0.13211 5.08339,0.1321 3.48017,10e-6 5.83781,-0.0205 7.07293,-0.0617 1.23508,-0.0411 2.21161,-0.12622 2.92957,-0.25541 0.75443,-0.15264 1.28983,-0.49612 1.60624,-1.03043 0.31636,-0.53429 0.47455,-1.37097 0.47457,-2.51005 -2e-5,-1.76142 -0.43809,-2.84764 -1.3142,-3.25866 -0.40158,-0.1996 -1.02217,-0.32291 -1.86178,-0.3699 -0.83964,-0.0469 -3.55321,-0.0998 -8.14072,-0.15853 z m 1.16818,10.21633 c -2.89612,10e-6 -5.05906,0.0529 -6.48885,0.15853 -1.42981,0.10569 -2.38808,0.28771 -2.8748,0.54604 -0.49893,0.2701 -0.85484,0.67816 -1.06779,1.2242 -0.21296,0.54605 -0.31943,1.34163 -0.31943,2.38674 0,1.12734 0.11256,1.94346 0.33768,2.4484 0.22511,0.50495 0.62363,0.85137 1.19555,1.03925 1.09517,0.36404 4.18596,0.54605 9.27239,0.54605 5.36629,0 8.50576,-0.29358 9.41842,-0.88072 0.42588,-0.28183 0.71792,-0.65467 0.87613,-1.11852 0.15817,-0.46384 0.23727,-1.18896 0.23729,-2.17537 -2e-5,-1.10382 -0.11563,-1.91114 -0.3468,-2.42197 -0.23123,-0.5108 -0.65105,-0.89539 -1.25944,-1.15375 -0.937,-0.39924 -3.93045,-0.59887 -8.98035,-0.59888 z" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path inkscape:connector-curvature="0" id="path7769" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:36.72209167px;line-height:125%;font-family:MicrogrammaDMedExt;-inkscape-font-specification:MicrogrammaDMedExt;letter-spacing:1.20229423px;word-spacing:0px;fill:#f2eedf;fill-opacity:1;stroke:none" d="m 380.90926,435.66481 3.322,0 0,24.04361 -3.322,0 z" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="display:inline;fill:#f2eedf;fill-opacity:1;stroke:none" d="m 368.54523,435.46822 3.51278,0 -9.15636,24.21593 -3.51278,0 z" id="rect6880-6" inkscape:connector-curvature="0" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> <path style="display:inline;fill:#f2eedf;fill-opacity:1;stroke:none" d="m 307.69653,447.87384 13.67285,0 0,2.87101 -13.67285,0 z" id="rect6882-3" inkscape:connector-curvature="0" inkscape:export-xdpi="139.92999" inkscape:export-ydpi="139.92999" /> </g> </svg> |
cannot compute difference between binary files
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 | #!/usr/bin/env @PYCMD@ # -*- coding: utf-8 -*- ######################################################################## # simh-os8-script.py Library for scripting OS/8 under SIMH # Contains validators and callers for os8 and simh commands to make # it easier to create scripts. # # Copyright © 2017-2019 by Jonathan Trites, William Cattey, and # Warren Young. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS LISTED ABOVE BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT # OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the names of the authors above # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## # Bring in just the basics so we can bring in our local modules import os import sys import tempfile import time sys.path.insert (0, os.path.dirname (__file__) + '/../lib') sys.path.insert (0, os.getcwd () + '/lib') # Python core modules we use import re from string import Template import shutil import subprocess # Our local modules from pidp8i import * from simh import * # Script Language Version # Update this version number as the language evolves. # Version 1.0 is the first public version. LANG_VERSION = "1.0" # Error Class Definitions ############################################## # Enables us to use exceptions from within this module. class Error(Exception): """Base Class for exceptions in this module.""" pass class InputError(Error): """Exception raised for errors in the input. Attributes: expr -- input expression in which the error occurred msg -- explanation of the error """ def __init__(self, msg): self.msg = msg def __str__(self): return self.msg # Private globals ###################################################### # Visible within this file, but not to the outside. # Identify a begin enabled/not_disabled command. group(1) contains either the enabled or # disabled flag. Put the rest of the line in group(2) _begin_en_dis_comm_re = re.compile ("^begin\s+(enabled|default|version)\s+(.+)$") # Identify an end enabled/not_disabled command. group(1) contains either the enabled or # disabled flag. Put the rest of the line in group(2) _end_en_dis_comm_re = re.compile ("^end\s+(enabled|default|version)\s+(.+)$") # Identify an end comm and put the rest of the line in group(1) _end_comm_re = re.compile ("^end\s+(.+)?$") # Identify an end option command and put the rest of the line in group(1) _end_option_comm_re = re.compile ("^end\s+option\s+(.+)$") # A valid version spec _version_parse_re = re.compile ("^((\d+\.)*)?(\d+)?$") # Name of the DECtape image file we create _new_sys_tape_prefix = "system" # Parser regexps used in patcher _com_os8_parse_str = "^\.([a-zA-Z]+)\s*(.*)$" _com_os8_parse = re.compile(_com_os8_parse_str) _com_split_str = "^([a-zA-Z]+)\s*(.*)$" _com_split_parse = re.compile(_com_split_str) _odt_parse_str = "^([0-7]+)\s*/\s*(\S+)\s+([0-7;]+)" _odt_parse = re.compile(_odt_parse_str) # Put command keyword in group(1) and the rest is in group(3) _comm_re_str = "^(\S+)(\s+(.+))?$" _comm_re = re.compile(_comm_re_str) # Identify an end comm and put the rest of the line in group(1) _end_comm_re = re.compile ("^end\s+(.+)?$") # Identify an end option command and put the rest of the line in group(1) _end_option_comm_re = re.compile ("^end\s+option\s+(.+)$") # Identify a begin command and put the rest of the line in group(1) _begin_option_comm_re = re.compile ("^begin\s+option\s+(.+)$") # Parse an argument string into a sys device with # device name in group(1), unit number in group(2) # We put all bootable devices into this string so that when # we add more devices, for example rl for RL01, we change one # string not many. _simh_boot_dev_str = "(rk|td|dt|rx)(\d*)" _simh_boot_re = re.compile("^" + _simh_boot_dev_str + "$") # Parse an argument string for mount into SIMH device # device name in group(1), unit number in group(2) # And the rest in group (3) _mount_regex_str = "^" + _simh_boot_dev_str + "\s+(.+)$" _mount_re = re.compile(_mount_regex_str) # Map of SIMH device names to OS/8 device name prefixes. _os8_from_simh_dev = {"rk" : "RK", "td" : "DTA", "dt" : "DTA", "rx" : "RX"} _os8_partitions = {"RK": ["A", "B"]} # OS/8 file name matching regex _os8_file_re = re.compile("(\S+):(\S+)?") # Regular expression for syntax checking inside FOTP # Destination is in group(1), Source is in group(3) _fotp_re = re.compile ("^((\S+:)?\S+)<((\S+:)?\S+)$") # Regular expression for detecting the 2 arg and 3 arg forms # of the "pal8" script command. # OS/8 name regex template: # Optional device spec, i.e. DTA0: # File spec with a specific extension or no extension. _os8_fspec = Template ("((\S+:)?([A-Z0-9]{1,6}|[A-Z0-9]{1,6}\.$ext))") _os8_BN_fspec = _os8_fspec.substitute(ext="BN") _os8_PA_fspec = _os8_fspec.substitute(ext="PA") _os8_LS_fspec = _os8_fspec.substitute(ext="LS") # Regex to parse a valid OS/8 option string either with slash or parens. _opt_str = "((/[A-Z0-9])+|\([A-Z0-9]+\))?" # Regular expression for syntax checking inside ABSLDR # FIXME: Use (and test) _opt_str for full OS/8 Option spec compatibility # One or more OS/8 binary files and optional args beginning with a slash. _absldr_re = re.compile ("^" + _os8_BN_fspec + "(," + _os8_BN_fspec + ")*(/\S)*$") # Regular expressions for syntax checking for cpto and cpfrom. # May be <source> where destination and default option /A is implied. # Or <source> <option> where destination is implied and option is set. # Or <source> <destination> where option /A is implied. # Or <source> <destination> <option> are explicit. # Valid options are "/A", "/I", and "/B" # Use two regex's in order: # <source> in group 1, <dest> in group 2. # Option is one of /I /B /A in group 4. # source in group 1, option in group 3. _from_to_re_1 = re.compile ("^(\S+)(\s+(/[AIB]))?$") # source in group 1, destination in group 2, option in group 4. _from_to_re_2 = re.compile ("^(\S+)\s+(\S+)(\s+(/[AIB]))?$") # Array of regular expressions for syntax checking inside BUILD _build_comm_regs = {"LOAD" : re.compile("^(\S+:)?\S+(.BN)?$"), "UNLOAD": re.compile("^\S+(,\S+)?$"), "INSERT": re.compile("^\S+,\S+(,\S+)?$"), "DELETE": re.compile("^\S+(,\S+)?$"), "SYSTEM": re.compile("^\S+$"), "DSK" : re.compile("^(\S+:)?\S+$"), "BUILD" : re.compile("^(\S+(.BN)?)\s+(\S+(.BN)?)$"), "PRINT" : None, "BOOT" : None, "end" : None} # Parse two whitspace separated arguments into group(1) and group(2) _two_args_re = re.compile("^(\S+)\s+(\S+)$") _rx_settings = ["rx01", "rx02", "RX8E", "RX28"] _tape_settings = ["td", "dt"] _tti_settings = ["KSR", "7b"] _configurables = {"rx": _rx_settings, "tape": _tape_settings, "tti": _tti_settings} # Matches if the string begins with a dollar sign, and has at least # one slash, returning the string between the dollar sign and the # first slash in group 1 and the rest in group 2. # No whitespace in the string. _expandable_re = re.compile ("^\$([^/\s]+)/(\S*)$") # Parse an exit arg for an integer or an integer in parentheses _exit_arg_re = re.compile ("^(\s*[+-]?\s*\d+)|\s*\(\s*([+-]?\s*\d+)\s*\)\s*$") # Options enabled/not_disabled for conditional execution in scripts. # # Earlier code allowed --enable and --disable. We interface to it. # We maintain two arrays: options_enable and options_disabled for those # two argument constructs. # # Argument parsing of repeated enable and disable arguments is as follows: # --enable looks on options_disabled and if present removes it, then adds # to options_enabled. # --disable looks on options_enabled and if present removes it, then adds # to options_enabled. # # Last seen enable/disable command line or executed command for a # particular option wins. # # Scripts have enable/disable commands that are run-time # changers of the contents of options_enabled and options_disabled. # # When we run a script we have begin/end blocks for enabled/not_disabled options: # "begin enabled <option name>" ... "end enabled <option name> # "begin not_disabled <option name>" ... "end not_disabled <option name> # # The enabled block looks for an explicit enablement on the options_enabled # list. If none is found we default to ignoring the contents of the block. # # The not_disabled block looks for an explicit disablement on the # options_disabled lis. If found, the block is ignored. Otherwise # the block defaults to being executed. # # begin/end blocks can be nested. We track the nesting with options_stack. # Testing for options happens when the begin command is evaluated. # So changing an enable/disable option inside a begin/end block # takes effect at the next begin statement. # You can write a script as follows: # enable foo # begin enabled foo # # Commands to executed # disable foo # # Commands still being executed. # begin enabled foo # # Commands to ignore # end enabled foo # end enabled foo # Local routine to perform a save of a pre-existing file # because we do this in a couple places def save_if_needed(path): if os.path.isfile(path): save_path = path + ".save" print("Pre-existing " + path + " found. Saving as " + path + ".save") if os.path.isfile(save_path): print("Overwriting old " + path + ".save") os.remove(save_path) os.rename(path, save_path) def version_to_array (version): vers_array = [] this_str = "" for c in version: if c != ".": this_str += c else: vers_array.append(this_str) this_str = "" if this_str != "": vers_array.append(this_str) return vers_array class os8script: # Contains a simh object, other global state and methods # for running OS/8 scripts under simh. #### globals and constants ########################################### # Replies that pal8 adds. _pal8_rep_adds = [ # Prompts come from the existing _os8_replies # Status: ["ERRORS DETECTED", "ERRORS DETECTED: ", False], ["LINKS GENERATED", "LINKS GENERATED: ", False], # Errors: ["Buffer Exceeded", "BE\s+\S+.*\r", True], ["Cref not Found", "CF\s+\S+.*\r", False], ["Device Error", "DE\s+\S+.*\r", True], ["Device Full", "DF\r", True], ["Illegal Character", "IC\s+\S+.*\r", False], ["Illegal re-Definition", "ID\s+\S+.*\r", False], ["Illegal Equals", "IE\s+\S+.*\r", False], ["Illegal Indirect", "II\s+\S+.*\r", False], ["Illegal PseudoOp", "IP\s+\S+.*\r", False], ["Illegal page Zero reference", "IZ\s+\S+.*\r", False], ["Loader not founD", "LD\s+\S+.*\r", False], ["Link Generated", "LG\s+\S+.*\r", False], ["current Page Exceeded", "PE\s+\S+.*\r", False], ["PHase Error", "PH\s+\S+.*\r", False], ["Re Definition", "RD\s+\S+.*\r", False], ["Symbol table Exceeded", "SE\s+\S+.*\r", False], ["Undefined Origin", "UO\s+\S+.*\r", False], ["Undefined Symbol", "US\s+\S.*\r", False], ["page Zero Exceeded", "ZE\s+\S+.*\r", False], ["NOT FOUND", "\S+ NOT FOUND", False], ] _build_rep_adds = [ # Prompts: # Add the BUILD prompt # Subtle point: Dollar sign appears in all kinds of output # so we try to minimize where we look for it so as to avoid # confusing pexpect. ["BUILD Prompt", "\n\\$$", True], # Status: ["SYS BUILT", "SYS BUILT", False], ["WRITE ZERO DIRECT?", "WRITE ZERO DIRECT\\?", False], ["LOAD OS8", "LOAD OS/8: ", False], ["LOAD CD", "LOAD CD: ", False], # Errors: ["BAD ARG", "\\?BAD ARG", False], ["BAD INPUT", "\\?BAD INPUT", False], ["BAD LOAD", "\\?BAD LOAD", False], ["BAD ORIGIN", "\\?BAD ORIGIN", False], ["CORE", "\\?CORE", False], ["DSK", "\\?DSK", False], ["HANDLERS", "\\?HANDLERS", False], ["I/O ERR", "I/O ERR", False], ["NAME", "\\?NAME", False], ["NO ROOM", "NO ROOM", False], ["SYS NOT FOUND", "SYS NOT FOUND", False], ["PLAT", "\\?PLAT", False], ["SYNTAX", "\\?SYNTAX", False], ["SYS", "\\?SYS", False], ["SYS ERR", "SYS ERR", False], ["File NOT FOUND", "\S+ NOT FOUND", False] ] _ocomp_rep_adds = [ ["NOTHING OUTPUT", "NOTHING OUTPUT", False], ["RELATIVE BLOCK", "RELATIVE BLOCK", False], ["USER ERROR", "USER ERROR", False], ] #### intern_replies ############################################################## # Teach the os8script object about another set of replies. # Return True if successful, False if the replies of that name are already in place # If with_os8 is True, append the simh _os8_replies array. def intern_replies (self, name, replies, with_os8): if name in self.replies: return False self.replies[name] = replies if with_os8: self.replies[name].extend(self.simh._os8_replies) # Create the pre-compiled regex array too. self.replies_rex[name] = [] for item in self.replies[name]: self.replies_rex[name].append(re.compile(item[1].encode())) return True def __init__ (self, simh, enabled_options, disabled_options, verbose=False, debug=True): self.lang_version = LANG_VERSION self.verbose = verbose self.debug = debug self.simh = simh self.options_enabled = enabled_options self.options_disabled = disabled_options # Do we need separate stacks for enabled/disabled options? self.options_stack = [] # List of scratch files to delete when we are done with all script runs. self.scratch_list = [] self.booted = False # Initial line count stack has a single element, value 0 # In this way we get graceful operation when the API # is called directly without having opened a script file. self.line_ct_stack = [0] # Create the table of reply tables. # Enable access to the simh and os8 tables through this interface. self.replies = {"simh": self.simh._simh_replies, "os8": self.simh._os8_replies} self.replies_rex = {"simh": self.simh._simh_replies_rex, "os8": self.simh._os8_replies_rex} # Perform intern_replies on all known sub-commands. self.intern_replies("build", self._build_rep_adds, True) self.intern_replies("pal8", self._pal8_rep_adds, True) self.intern_replies("ocomp", self._ocomp_rep_adds, True) #### path_expand ####################################################### # Simple minded variable substitution in a path. # A path beginning with a dollar sign parses the characters between # the dollar sign and the first slash seen becomes a name to # expand with a couple local names: $home and the anchor directories # defined in lib/pidp8i/dirs.py. # Returns None if the expansion fails. That signals the caller to fail. def path_expand (self, path): m = re.match(_expandable_re, path) if m == None: return path var = m.group(1) val = getattr (dirs, var, None) if val != None: return os.path.join(val,m.group(2)) else: print("At line " + str(self.line_ct_stack[0]) + \ ": {$" + var + "} is not a valid path expansion in " + path) return None #### print_expand ###################################################### # Close kin to path_expand. Takes a string that may name a path # substitution or the magic $version value and performs the appropriate # value substitution. def print_expand (self,str): end = str.find("$") if end == -1: return str m = re.findall("\$\S+",str) if m == None: return str outstr = "" start = 0 for name in m: end = str.index(name, start) outstr += str[start:end] sub = getattr (dirs, name[1:], None) if sub == None: if name == "$version": sub = self.lang_version else: sub = name outstr += sub start = end + len(name) return outstr #### version_test ###################################################### # Compare each component of the version test agains the actual version # Return true if actual version is greater than or equal to the test # version. # Caller validates test with _version_parse_re so we only # need to return True or False, not error. def version_test (self, test): test_array = version_to_array(test) version_array = version_to_array(self.lang_version) idx = 0 endpoint = len(test_array) while idx < endpoint: # If version has more digits than test, the greater than test succeeds. if idx >= len(version_array): vers_item = "0" else: vers_item = version_array[idx] test_item = test_array[idx] if self.debug: print("version_test: vers_item: " + vers_item + \ ", test_item: " + test_item) vers_num = int(vers_item) test_num = int(test_item) # First time version componet greater than test -> success. if vers_num > test_num: if self.debug: print("version_test: Success: version greater than test.") return True # First time version component less than test -> failure. elif test_num > vers_num: if self.debug: print("version_test: Fails on sub compare.") return False #Otherwise is equal. Keep going. idx += 1 # Made it all the way through. Test succeeds. if self.debug: print("version_test: Success. Made it thru test string.") return True #### basic_line_parse ################################################ # Returns stripped line and any other cleanup we want. # Returns None if we should just 'continue' on to the next line. # Filters out comments. # Processes the option begin/end blocks. def basic_line_parse (self, line, script_file): self.line_ct_stack[0] += 1 retval = line.strip() if retval == "": return None elif retval[0] == "#": return None # First test if we are in a begin option block m = re.match (_begin_en_dis_comm_re, retval) if m != None: en_dis = m.group(1) rest = m.group(2) if self.verbose: print("Line " + str(self.line_ct_stack[0]) + \ ": doing_begin_option: " + en_dis + " " + rest) if self.debug: print("options_enabled: " + str (self.options_enabled)) print("options_disabled: " + str (self.options_disabled)) print("options_stack: " + str(self.options_stack)) vers_match = False if en_dis == "version": # Check for mal-formed version match first if re.match (_version_parse_re, rest) == None: print("Mal-formed version match string {" + rest + "} at line " + \ str(self.line_ct_stack[0]) + ". Ignoring this block.") self.ignore_to_subcomm_end (retval, script_file, en_dis + " " + rest) return None vers_match = self.version_test (rest) if vers_match: # Block is active. We push it onto the stack if self.debug: print("Pushing version enabled block " + rest + \ " onto options_stack") self.options_stack.insert(0, rest) if self.debug: print(" new options_stack: " + \ str(self.options_stack)) else: # Option is inactive. Ignore all subseqent lines # until we get to an end command that matches our option. self.ignore_to_subcomm_end (retval, script_file, en_dis + " " + rest) return None elif en_dis == "enabled": if rest in self.options_enabled: # Block is active. We push it onto the stack if self.debug: print("Pushing enabled block " + rest + " onto options_stack") self.options_stack.insert(0, rest) if self.debug: print("new options_stack: " + str(self.options_stack)) else: # Option is inactive. Ignore all subseqent lines # until we get to an end command that matches our option. self.ignore_to_subcomm_end (retval, script_file, en_dis + " " + rest) return None # only other choice is disabled because of our regex. else: if rest not in self.options_disabled: # Block defaults to active. We push it onto the stack if self.debug: print("Pushing not_disabled block " + rest + \ " onto options_stack") self.options_stack.insert(0, rest) if self.debug: print("new options_stack: " + str(self.options_stack)) else: # Block is inactive. Ignore all subseqent lines # until we get to an end command that matches our option. self.ignore_to_subcomm_end (retval, script_file, en_dis + " " + rest) return None m = re.match(_end_en_dis_comm_re, retval) if m != None: rest = m.group(2) if self.verbose: print("Line " + str(self.line_ct_stack[0]) + ": end rest = " + rest) if (rest == None or rest == ""): print("Warning! option end statement at line " + \ str(self.line_ct_stack[0]) + " encountered with no argument.") return None if len(self.options_stack) == 0: print("Warning! option end statement at line " + \ str(self.line_ct_stack[0]) + \ " found with no matching begin for option: " + rest) return None if rest != self.options_stack[0]: print("Warning! Mismatched option begin/end group at line " + \ str(self.line_ct_stack[0]) + ". Currently inside option: " + \ self.options_stack[0] + " not " + rest) return None else: if self.debug: print("Popping " + self.options_stack[0]) self.options_stack.pop(0) if self.debug: print("new options_stack: " + str(self.options_stack)) return None return retval #### ignore_to_subcomm_end ########################################### def ignore_to_subcomm_end (self, old_line, script_file, end_str): if self.debug: print("ignore to: " + end_str) for line in script_file: self.line_ct_stack[0] += 1 line = line.strip() if self.verbose: print("Ignore line " + str(self.line_ct_stack[0]) + ": " + line) m = re.match(_end_comm_re, line) if m == None: continue rest = m.group(1) if rest == None: rest = "" if rest == end_str: return #### include_command ################################################# # Call run_script_file recursively on the file path provided. def include_command (self, line, script_file): path = self.path_expand(line) if path == None: print("Ignoring: \n\tinclude " + line) return "fail" if not os.path.isfile(path): print("Line " + str(self.line_ct_stack[0]) + \ ": Could not find include file: " + path) return "fail" if self.verbose: print("line: " + str(self.line_ct_stack[0]) + ": include " + path) return self.run_script_file (path) #### enable_option_command ########################################### # Deletes an option from the list of active options. # Parses the first argument after "enable" as the key to enable. # The end of the key is the end of the line or the first whitespace # character. def enable_option_command (self, line, script_file): if line == "": print("Empty option to enable at line: " + \ str(self.line_ct_stack[0]) + ".") return "fail" m = re.match(_comm_re, line) if m == None: print("Could not parse enable command at line " + \ str(self.line_ct_stack[0]) + ".") return "fail" option = m.group(1) if option == None: print("Empty option to enable command at line: " + \ str(self.line_ct_stack[0]) + ".") return "fail" if self.verbose: print("Line " + str(self.line_ct_stack[0]) + \ ": enable option: " + option) # Remove it from other set if present if option in self.options_disabled: self.options_disabled.remove(option) # Add it if not already present. if option not in self.options_enabled: self.options_enabled.append(option) return "success" #### disable_option_command ########################################### # Deletes an option from the list of active options. # Parses the first argument after "disable" as the key to enable. # The end of the key is the end of the line or the first whitespace # character. def disable_option_command (self, line, script_file): if line == "": print("Empty option to disable at line: " + \ str(self.line_ct_stack[0]) + ".") return "fail" m = re.match(_comm_re, line) if m == None: print("Could not parse disable option command at line " + \ str(self.line_ct_stack[0]) + ".") return "fail" option = m.group(1) if option == None: print("Empty option to disable command at line " + \ str(self.line_ct_stack[0]) + ".") return "fail" if self.verbose: print("line: " + str(self.line_ct_stack[0]) + \ ": disable option: " + option) # Remove it from other set if present if option in self.options_enabled: self.options_enabled.remove(option) # Add it if not already present. if option not in self.options_disabled: self.options_disabled.append(option) return "success" #### configure_command ############################################### # First arg is the item to configure. # Second arg is the setting. # This enables adding option setting inside a script file. def configure_command (self, line, script_file): m = re.match(_two_args_re, line) if m == None or m.group(1) == None or m.group(2) == None: print("Could not parse configure command arguments at line " + \ str(self.line_ct_stack[0]) + ": {" + line + "}") return "fail" item = m.group(1) setting = m.group(2) if item not in _configurables: print("Ignoring invalid configuration item at line " + \ str(self.line_ct_stack[0]) + ": " + item) return "fail" if setting not in _configurables[item]: print("At line " + str(self.line_ct_stack[0]) + \ ": Cannot set " + item + " to " + setting + ".") return "fail" if item == "tape": self.simh.set_tape_config(setting) elif item == "rx": self.simh.set_rx_config (setting) elif item == "tti": self.simh.set_tti_config (setting) return "success" #### cpto_command ########################################### # Calls os8_pip_to with the command line arguments. def cpto_command (self, line, script_file): if not self.booted: print("Cannot run cpto command at line " + \ str(self.line_ct_stack[0]) + ". OS/8 has not been booted.") return "die" # Is 2nd and final arg the option? m = re.match(_from_to_re_1, line) if m != None: # Yes. Expand Source first. path = self.path_expand(m.group(1)) if path == None: print("Ignoring: \n\tcpto " + line) return "fail" self.simh.os8_pip_to (path, "DSK:", m.group(2)) else: # Is this normal case of source, dest, with possibly empty option? m = re.match(_from_to_re_2, line) if m == None: print("Could not parse cpto command at line " + \ str(self.line_ct_stack[0]) + ".") return "fail" path = self.path_expand(m.group(1)) if path == None: print("Ignoring: \n\tcpto " + line) return "fail" self.simh.os8_pip_to (path, m.group(2), m.group(4), self.debug) return "success" #### cpfrom_command ######################################### # Calls os8_pip_from with the command line arguments. def cpfrom_command (self, line, script_file): if not self.booted: print("Cannot run cpfrom command at line " + \ str(self.line_ct_stack[0]) + ". OS/8 has not been booted.") return "die" m = re.match(_from_to_re_2, line) if m == None: print("Could not parse cpfrom command at line " + \ str(self.line_ct_stack[0]) + ".") return "fail" path = self.path_expand(m.group(2)) if path == None: print("Ignoring: \n\tcpfrom " + line) return "fail" self.simh.os8_pip_from (m.group(1), path, m.group(4)) return "success" #### copy_command ############################################### # Simple script interface to create a copy of a file. def copy_command (self, line, script_file): m = re.match(_two_args_re, line) if m == None or m.group(1) == None or m.group(2) == None: print("Could not copy command: " + line) return "fail" from_path = self.path_expand(m.group(1)) to_path = self.path_expand(m.group(2)) if from_path == None or to_path == None: print("Ignoring: \n\t copy " + line) return "fail" print("copy command: \n\tfrom: " + from_path + ", \n\tto: " + to_path) if (not os.path.isfile(from_path)): print("At line " + str(self.line_ct_stack[0]) + \ ": Required copy input file: " + from_path + " not found.") return "fail" save_if_needed(to_path) try: shutil.copyfile(from_path, to_path) except shutil.Error as e: print("copy command failed with error: " + str(e)) return "fail" except IOError as e: print("copy command failed with IOError: " + str(e)) return "fail" return "success" #### resume_command ############################################# # Call the os8_resume in simh to resume OS/8. def resume_command (self, line, script_file): if not self.booted: print("Cannot run resume command at line " + \ str(self.line_ct_stack[0]) + ". OS/8 has not been booted.") return "die" if self.verbose: print("Resuming OS/8 at line " + str(self.line_ct_stack[0]) + ".") self.simh.simh_resume_os8() return "success" #### restart_command ############################################# # Call the os8_restart in simh to resume OS/8. def restart_command (self, line, script_file): if not self.booted: print("Cannot run restart command at line " + \ str(self.line_ct_stack[0]) + ". OS/8 has not been booted.") return "die" if self.verbose: print("Restarting OS/8 at line " + str(self.line_ct_stack[0]) + ".") self.simh.simh_restart_os8() return "success" #### patch_command ############################################## # Read the named patch file and perform its actions. def patch_command (self, line, script_file): if not self.booted: print("Cannot run patch command at line " + \ str(self.line_ct_stack[0]) + ". OS/8 has not been booted.") return "die" path = self.path_expand(line) if path == None: print("Ignoring: \n\t" + "patch " + line) return "fail" if not os.path.isfile(path): print("At line " + str(self.line_ct_stack[0]) + \ ": Patch file: " + path + " not found.") return "fail" self.run_patch_file (path, line, script_file) return "success" #### exit_command ############################################### # Make a graceful exit: # Remove scratch files. # Detach all devices from running image. # Quit SIMH. # Parse an exit status value from line. Default to 0. # Call POSIX exit to exit the running program, def exit_command (self, line, script_file): m = re.match (_exit_arg_re, line) if m != None: if m.group(1) != None: status = int(m.group(1)) elif m.group(2) != None: status = int(m.group(2)) else: status = 0 for filename in self.scratch_list: if self.verbose: print("Deleting scratch_copy: " + filename) os.remove(filename) self.simh.simh_cmd ("detach all") self.simh._child.sendline("quit") if self.verbose: print("Calling sys.exit (" + str(status) + ") at line: " + \ str(self.line_ct_stack[0]) + ".") sys.exit(status) #### print_command ############################################### # Print text from the running script # If verbose is set, say what line in the script containing # the print command. def print_command (self, line, script_file): if self.verbose: print("Line: " + str(self.line_ct_stack[0]) + ": " + line) else: print(self.print_expand(line)) return "success" #### _command ########################################### # def _command (self, line, script_file): return "success" #### run_script_file ############################################ # Run os8 command script file # Call parsers as needed for supported sub commands. # # Commands: # mount <simh-dev> <image-file> [<option> ...] # option: required | preserve | readonly | ro | scratch # umount <simh-dev> # boot <simh-dev> # os8 <command-line> # the rest of the line is passed verbatim to OS/8 # pal8 <pal-command line> # include <script-file> # configure <device> <parameter> # device: tti | tape | rx # tt parameter: KSR | 7b # tape parameter: td | dt # rx parameter: rx8e | rx28 | rx01 | rx02 # enable <parameter> # disable <parameter> # cpto <posix-file> [<os8-file>] [<format>] # cpfrom <os8-file> <posix-file> [<format>] # format: /A | /I | /B # copy <from-file> <to-file> # patch <patch-file> # resume # restart # begin <sub-command> <os8-path> # end <sub-command> # print <output text> # exit <status> # Sub-commands: # build, fotp, absldr # # Commands return, "success", "fail", or "die". def run_script_file (self, script_path): try: script_file = open(script_path, "r") except IOError: print(script_path + " not found.") return "fail" return self.run_script_handle(script_file, script_path) def run_script_handle (self, script_file, script_path): # Strings, regexps, and command arrays used by run_system commands = {"mount": self.mount_command, "boot": self.boot_command, "os8": self.os8_command, "ocomp": self.ocomp_command, "pal8": self.pal8_command, "include": self.include_command, "begin": self.begin_command, "end": self.end_command, "exit": self.exit_command, "print": self.print_command, "umount": self.umount_command, "simh": self.simh_command, "configure": self.configure_command, "enable": self.enable_option_command, "disable": self.disable_option_command, "cpto": self.cpto_command, "cpfrom": self.cpfrom_command, "copy": self.copy_command, "resume": self.resume_command, "restart": self.restart_command, "patch": self.patch_command} # Every time we start a new script # We append a new line number count of 0 # onto our line_ct_stack self.line_ct_stack.insert(0, 0) if self.debug: print("New line_ct_stack: " + str(self.line_ct_stack)) for line in script_file: line = self.basic_line_parse (line, script_file) if line == None: continue m = re.match(_comm_re, line) if m == None: print("Ignoring command line at line " + \ str(self.line_ct_stack[0]) + ": " + line) continue if m.group(1) not in commands: print("Unrecognized script command at line " + \ str(self.line_ct_stack[0]) + ": " + m.group(1)) continue # print("arg: " + m.group(3)) if m.group(3) == None: rest = "" else: rest = m.group(3) retval = commands[m.group(1)](rest, script_file) if retval == "die": print("\nFatal error encountered in " + script_path + \ " at line " + str(self.line_ct_stack[0]) + ":") print("\t" + line) sys.exit(-1) elif retval == "fail": print("Non-fatal error encountered in " + script_path + \ " at line " + str(self.line_ct_stack[0]) + ":") print("\t" + line + "\n") # Done. Pop the line count off our line_ct_stack self.line_ct_stack.pop(0) if self.debug: print("popped line_ct_stack: " + str(self.line_ct_stack)) return "success" #### end_command ##################################################### def end_command (self, line, script_file): print("Unexpectedly encountered end command at line " + \ str(self.line_ct_stack[0]) + ": " + line) return "fail" #### parse_odt ####################################################### def parse_odt (self, line): if self.debug: print(line) if line == "\\c": return "break" match = _odt_parse.match(line) if match == None: print("Aborting because of bad ODT line: " + line) self.simh.os8_ctrl_c (caller="parse_odt") return "err" loc = match.group(1) old_val = match.group(2) new_val = match.group(3) expect_val_str = "\s*[0-7]{4} " if self.debug: print("Loc: " + loc + ", old_val: " + old_val + ", new_val: " + \ new_val) self.simh.os8_send_str (loc + "/") self.simh._child.expect(expect_val_str) if old_val.isdigit(): # We need to check old value found_val = self.simh.child_after().strip() if found_val != old_val: print("\tOld value: " + found_val + " does not match " + old_val + ". Aborting patch.") # Abort out of ODT back to the OS/8 Monitor self.simh.os8_ctrl_c ("parse_odt 2") return "err" self.simh.os8_send_line (new_val) return "cont" #### futil_exit ######################################################## def futil_exit (self, line): self.simh.os8_send_line(line) return "break" #### futil_file ######################################################## def futil_file (self, line): # Redundant re-parse of line but nobody else wants args right now. match = _com_split_parse.match(line) if match == None: print("Aborting because of mal-formed FUTIL FILE command: " + line) self.simh.os8_ctrl_c (caller="futil_file") return "err" fname = match.group(2) expect_futil_file_str = "\n" + fname + "\s+(?!" + fname + ")?(\S+)(.*)$" self.simh.os8_send_line (line) self.simh._child.expect(expect_futil_file_str) result = self.simh.child_after().strip() match = _com_split_parse.match(result) if match == None: print("Aborting because unexpected return status: " + result + \ " from: " + line) self.simh.os8_ctrl_c (caller="futil_file 2") return "err" if match.group(2).strip() == "LOOKUP FAILED": print("Aborting because of FUTIL lookup failure on: " + fname) self.simh.os8_ctrl_c (caller="futil_file 3") return "err" else: return "cont" #### parse_futil ##################################################### # # Very simple minded: # If first char on line is an alpha, run the command. # If the first char on line is number, do the substitute command. # # Substitute command acts like ODT. # Future version should support the IF construct. # # When we encounter the EXIT command, we return success. def parse_futil (self, line): futil_specials = { "EXIT": self.futil_exit, "FILE": self.futil_file } if line[0].isdigit(): # Treat the line as ODT return self.parse_odt(line) else: match = _com_split_parse.match(line) if match == None: print("Ignoring failed FUTIL command parse of: " + line) return "cont" fcom = match.group(1) rest = match.group(2) if fcom not in futil_specials: # Blind faith and no error checking. self.simh.os8_send_line(line) return "cont" else: return futil_specials[fcom](line) #### run_patch_file ################################################## def run_patch_file (self, pathname, line, script_file): sys.stdout.write ("Applying patch " + os.path.basename (pathname) + "...") sys.stdout.flush () try: patch_file = open(pathname, "r") except IOError: print(pathname + " not found. Skipping.") return "fail" # Supported parsers. # Note tht FUTIL has not been tested since we flipped the expect order. parsers = { "ODT": self.parse_odt, "FUTIL": self.parse_futil } # What prompt do we want when we run an allowed command? # If there is none, we don't wait. But if we want one, # We BETTER wait for it. A race condition has been observed # where, if we don't wait for SAVE, it might not happen. allowed_commands = ["ODT", "R", "GET", "GE", "SAVE", "SA"] inside_a_command = False the_command = "" the_command_parser = None # Any os8-run command may be called after a simh command that left us # in simh context. Check to see if we need to restart OS/8. # We resume OS/8. It should be non-disruptive and work well. if self.simh._context == "simh": self.resume_command(line, script_file) for line in patch_file: line = line.rstrip() if line == "": continue elif line[0] == '#': continue # Ignore Comments elif inside_a_command: retval = the_command_parser (line) if retval == "break": inside_a_command = False self.simh.os8_ctrl_c (caller="run_patch_file") elif retval == "err": patch_file.close() return "fail" elif line[0] == '.': # New OS/8 Command match = _com_os8_parse.match(line) if match == None: print("Aborting patch on failed OS/8 command parse of: " + line) return "fail" com = match.group(1) rest = match.group(2) if com not in allowed_commands: print ("Command " + com + " not allowed in patch. Ignoring.") continue # Fall through to start up our command. # Maybe command is ".ODT", maybe it's "R FUTIL" if com == "R": # Check to see if we can run this. if rest not in parsers: print ("Not allowed to run " + rest + " in a patch file. Aborting.") return "fail" com = rest # Now fall through an set the_command the_command = com # Noisy debug output. Our line. if self.verbose and self.debug: print(line) # Are we going to be inside a command after we do the run? if com in parsers: the_command_parser = parsers[com] inside_a_command = True # Run the line blind, skipping over the dot at the beginning. # We won't get a prompt. self.simh.os8_send_line (line[1:]) # It's an OS/8 command else: # We must test for monitor prompt to signify success. # Otherwise a race condition has been shown to prevent save of # patched binary because our exit of SIMH happens too quickly! reply = self.simh.os8_cmd (line[1:]) # Skip over Prompt in line. # We need to confirm we succeeded. # If we fail, we just complain and keep going. self.simh.os8_test_result (reply, "Monitor Prompt", "run_patch_file command " \ + line[1:]) # Done with all patch file lines. patch_file.close() print("Success.") return "success" #### skip_patch ###################################################### # Returns true if the given filename matches one of the regex string # keys of the given skips dict and the flag value for that key is set. # See skips definition in make_patch, which calls this. def skip_patch (fn, skips): for p in skips: if re.search (p, fn) and skips[p]: return True return False #### simh_command #################################################### # I tried to avoid including this command but sometimes you just # have to reconfigure subtle bits of device drivers. # We assume we can call a simh command at any time, but # doing so puts us in the simh context that persists until we # issue a boot or go command. def simh_command (self, line, script_file): print("simh command is disabled. Line " + \ str(self.line_ct_stack[0]) + " ignored.") return "fail" if self.verbose: print(line) reply = self.simh.simh_cmd(line) self.simh.simh_test_result(reply, "Prompt", "simh_command") return "success" #### umount_command ################################################## def umount_command (self, line, script_file): detach_comm = "det " + line if self.verbose: print("line: " + \ str(self.line_ct_stack[0]) + ": " + detach_comm) reply = self.simh.simh_cmd(detach_comm, debug=self.debug) self.simh.simh_test_result(reply, "Prompt", "umount_command") return "success" #### make_scratch #################################################### # Create a copy of the contents of image file using the python # method to create a secure, named temp filename. # The caller has split the image file name into a base path, # and an extension which we use. # After copying the source image, the file is closed and the name # of the scratch file is returned. def make_scratch (self, base_imagename, extension): try: src_image = open(base_imagename+extension, "rb") except IOError: print("Open of imagefile " + base_imagename + extension + " failed.") return None dest_image = tempfile.NamedTemporaryFile(mode='w+b', \ prefix=base_imagename+'-temp-', \ suffix=extension, \ delete=False) destname = dest_image.name if self.debug: print("Temp file name is: " + destname) try: shutil.copyfileobj(src_image, dest_image) except shutil.Error as e: print("Copy of imagefile " + base_imagename + extension + \ " to scratch failed with error: " + str(e)) return None except IOError as e: print("Copy of imagefile " + base_imagename + extension + \ ", failed with IOError: " + str(e)) return None src_image.close() dest_image.close() self.scratch_list.append(destname) return destname #### mount_command ################################################### # mount <simh-device> <image-file> [option ...] # # Interface to SIMH attach command with options that do a bit more. # # Options: # required: <image-file> is required to exist, otherwise abort the script. # preserve if <image-file> already exists, create a copy with a # version number suffix. This is useful when you want to prevent # overwrites of a good image file with changes that might not work. # os8-run preserves all versions seen and creates a new # version that doesn't overwrite any of the previous ones. # readonly: Passes the `-r` option to SIMH attach to mount the # device in read only mode. # ro: abbreviation for readonly. # scratch: Create a writeable scratch copy of the named image # file and mount it. This is helpful when you are booting a # distribution DECtape. Booted DECtape images must be writeable. # To protect a distribution DECtape, use this option. # When all script runs are done, the scratch version is deleted. # new: If there is an existing file, move it aside as a .save because # we want to create a new empty image file. # # If the mount command fails for any reason, we presume # it is a fatal error and abort the script. def mount_command (self, line, script_file): m = re.match(_mount_re, line) if m == None: print("At line " + str(self.line_ct_stack[0]) + \ ", could not parse mount. Ignoring: {" + line + "}.") return "die" simh_dev = m.group(1) unit = m.group(2) rest = m.group(3) parts = rest.split() if len(parts) == 0: print("At line " + str(self.line_ct_stack[0]) + \ ": No image name specified in: {" + line + "}") return "die" ro_arg = "" imagename = self.path_expand(parts[0]) if imagename == None: return "die" dot = imagename.rindex(".") base_imagename = imagename[:dot] extension = imagename[dot:] copy_imagename = "" # Case of additional arguments. if len (parts) > 1: # Perform must_exist before scratch if "new" in parts[1:]: save_if_needed(imagename) if "must_exist" in parts[1:] or "required" in parts[1:]: if not os.path.exists(imagename): print("At line " + str(self.line_ct_stack[0]) + ", " + \ imagename + " must exist but was not found. Not mounting.") return "die" if "scratch" in parts[1:]: copy_imagename = self.make_scratch(base_imagename, extension) if copy_imagename == None: return "die" imagename = copy_imagename if "readonly" in parts[1:] or "ro" in parts[1:]: if copy_imagename != "": print("At line " + str(self.line_ct_stack[0]) + \ ": You don't really need to set readonly on a scratch copy.") ro_arg = "-r " if "no_overwrite" in parts[1:] or "preserve" in parts[1:]: if copy_imagename != "": print("Ignoring preserve option at line " + \ str(self.line_ct_stack[0]) + \ " because scratch option is present.") else: next_tape = 0 while os.path.isfile(imagename): print("Found: " + imagename) next_tape += 1 imagename = base_imagename + "-" + str(next_tape) + extension if unit == None or unit == "": print("Need unit number for: " + line) return "die" if simh_dev not in _os8_from_simh_dev: print("At line " + str(self.line_ct_stack[0]) + \ ": Unrecognized simh dev: " + simh_dev) return "die" os8dev = _os8_from_simh_dev[simh_dev] attach_comm = "att " + ro_arg + simh_dev + unit + " " + imagename if self.verbose: print("Line " + str(self.line_ct_stack[0]) + ": mount: " + \ attach_comm) reply = self.simh.simh_cmd(attach_comm) self.simh.simh_test_result(reply, "Prompt", "mount_command") return "success" #### boot_command #################################################### # # Check to see if the device to be booted has something attached. # If not die. # If so, boot it, and set our booted state to True. def boot_command (self, line, script_file): # First confirm something is attached to boot from. ucname = line.upper() boot_replies = [ucname + "\s+(.+)\r", "Non-existent device"] self.simh.simh_send_line("show " + line) retval = self.simh._child.expect(boot_replies) if retval == 1: print("Attempt to boot non-existent device: " + line) return "die" reply_str = self.simh.child_after() m = re.match("^(\S+)\s+(\S+),\s+(attached to |not attached)(\S+)?,\s+(.+)\r", reply_str) if m == None: print("Could not determine if device " + line + " is attached; " + "got '" + reply_str + "'") return "die" # Caution match group we want ends with a space. if m.group(3) != "attached to ": print("Attempt to boot on non-attached device: " + line) return "die" boot_comm = "boot " + line if self.verbose: print("Line " + str(self.line_ct_stack[0]) + ": " + boot_comm) reply = self.simh.simh_cmd(boot_comm, self.simh._os8_replies_rex) # We're in OS/8 now use that tester. self.simh.os8_test_result (reply, "Monitor Prompt", "boot_command") self.booted = True return "success" #### check_and_run ################################################## # Common routine to check that we are bootable, in the right context # are able to run a command under OS/8, and that we successfully run it. # caller is the name we give out as our caller. # Return -1 if we are not booted and the command needs to die. # otherwise return the reply to the command. # We generically support reporting out if transcript is enabled. def check_and_run (self, caller, os8_comm, script_file, replies=None): if not self.booted: print("Cannot run " + caller + " command at line " + \ str(self.line_ct_stack[0]) + ". OS/8 has not been booted.") return -1 if self.verbose: print("Line: " + \ str(self.line_ct_stack[0]) + ": " + caller + "_command: " + os8_comm) # Any os8-run command may be called after a simh command that left us # in simh context. Check to see if we need to restart OS/8. # We could resume, but restart is safer. if self.simh._context == "simh": self.restart_command(os8_comm, script_file) reply = self.simh.os8_cmd (os8_comm, replies, debug=self.debug) if "transcript" in self.options_enabled: print (self.simh._child.before.decode().strip()) return reply #### os8_command ##################################################### def os8_command (self, line, script_file): reply = self.check_and_run("os8", line, script_file) if reply == -1: return "die" # We expect that the command will exit to the OS/8 monitor when done. # What if it doesn't? # We want to print errors mon = self.simh.os8_test_result (reply, "Monitor Prompt", "") if mon: return "success" cd = self.simh.os8_test_result (reply, "Command Decoder Prompt", "") retval = "fail" if cd: # OS/8 command returned to command decoder. We escape. mon = self.simh.os8_escape ("") if mon == false: print ("os8_command: Escape from command decoder failed. Trying ^C.") mon = self.simh.os8_ctrl_c ("") if mon == false: print ("^C failed to return to monitor. Killing script.") return "die" print ("os8_command Error: \n\t" + line) print ("\t" + self.simh.child_after().strip()) # If this was not a fatal error, we need to ^C to get back to Monitor. # But sometimes OS/8 is not yet ready for ^C, so we wait half a second. if self.simh._os8_replies[reply][2] == False: time.sleep (.5) print ("Sending ^C to return to monitor.") escape = self.simh.os8_ctrl_c ("", debug=self.debug) if escape: return "fail" else: print ("^C failed to return to monitor. Killing script.") return "die" else: # Got fatal error. Expect monitor prompt so state machine is in the right place. mon = self.simh.os8_cfm_monitor("") if mon: return "fail" else: print ("os8_command: Failed to return to monitor after fatal error. Killin script.") return "die" #### pal8_command #################################################### # The "pal8" script command comes in two forms: # The two argument form where the PAL8 status is printed on the fly # and the 3 argument form where all status goes into the listing file. # We do the 3 argument form with a simple "os8" script command. def pal8_command (self, line, script_file): if self.verbose: print("Running PAL8 on: " + line) reply = self.check_and_run("pal8", "R PAL8", script_file) if reply == -1: return "die" if self.simh.os8_test_result (reply, "Command Decoder Prompt", "call_pal8") == False: print("PAL8 failed to start at line " + str(self.line_ct_stack[0])) return "fail" if self.verbose: print("Line: " + \ str(self.line_ct_stack[0]) + ": pal8_command: " + line) # Send our command line args and harvest results. reply = self.simh.os8_cmd (line, self.replies_rex["pal8"]) err_count = 0 executed_line = self.simh._child.before.decode().strip() mon = self.simh.test_result(reply, "Monitor Prompt", self.replies["pal8"], "") err_string = "" ret_val = "success" expect_loop = 1 # We're going to print all the errors we see # and keep looking till we get either a monitor or command decoder prompt. while not mon: if self.debug: print ("Got reply [" + str(expect_loop) +"] " + str(reply) + " -> " + \ self.replies["pal8"] [reply][0]) ed = self.simh.test_result(reply, "ERRORS DETECTED", self.replies["pal8"], "") cd = self.simh.test_result(reply, "Command Decoder Prompt", self.replies["pal8"], "") lg = self.simh.test_result(reply, "LINKS GENERATED", self.replies["pal8"], "") if ed: # Got Errors Detected. Count them. self.simh._child.expect("\d+") err_count = int(self.simh.child_after().strip()) elif lg: self.simh._child.expect("\d+") link_count = int(self.simh.child_after().strip()) elif cd: # Got Command Decoder. Exit with failure. if self.debug: print ("call_pal8: Non-fatal error: Sending ^C") # Exit pal8. We'll confirm we got back to OS/8 monitor below. self.simh.os8_send_ctrl ('c') else: err_string += ("\t" + self.simh.child_after().strip() + "\n") expect_loop += 1 reply = self.simh._child.expect(self.replies_rex["pal8"]) mon = self.simh.test_result(reply, "Monitor Prompt", self.replies["pal8"], "") if err_count > 0 or err_string != "": print ("PAL8 Error: \n\t" + executed_line) print (err_string) return "fail" return "success" #### ocomp_command ################################################### # This command will be used to compare files in 2 places and # Return success if they are the same, and return failure if # one or the other is missing, or if they are different. # This requires making an interpretation of the output that is # different from the expected "octal dump of differences" use case. # "NOTHING OUTPUT" means success. # Any "USER ERROR" output means failure. def ocomp_command (self, line, script_file): if self.verbose: print("Running OCOMP on: " + line) reply = self.check_and_run("ocomp", "R OCOMP", script_file) if reply == -1: return "die" if self.simh.os8_test_result (reply, "Command Decoder Prompt", "call_ocomp") == False: print("OCOMP failed to start at line " + str(self.line_ct_stack[0])) return "fail" if self.verbose: print("Line: " + \ str(self.line_ct_stack[0]) + ": ocomp_command: " + line) # Send our command and harvest results. reply = self.simh.os8_cmd (line, self.replies_rex["ocomp"]) if "transcript" in self.options_enabled: print (self.simh._child.before.decode().strip()) ret_val = "fail" expect_loop = 1 mon = self.simh.test_result(reply, "Monitor Prompt", self.replies["ocomp"], "") # We get return status and then clean up the state machine. while not mon: if self.debug: print ("ocomp gave reply: [" + str(expect_loop) +"] " + str(reply) + " -> " + \ self.replies["ocomp"][reply][0]) ok = self.simh.test_result(reply, "NOTHING OUTPUT", self.replies["ocomp"], "") cd = self.simh.test_result(reply, "Command Decoder Prompt", self.replies["ocomp"], "") nf = self.simh.test_result(reply, "File not found", self.replies["ocomp"], "") ue = self.simh.test_result(reply, "USER ERROR", self.replies["ocomp"], "") if ok: if self.debug: print ("Success") ret_val = "success" elif nf or ue: print ("OCOMP:" + self.simh.child_after().strip() + "\n") elif cd: # Got Command Decoder. Exit with failure. if self.debug: print ("call_ocomp: Non-fatal error: Sending ^C") # Exit OCOMP. We'll confirm we got back to OS/8 monitor below. self.simh.os8_send_ctrl ('c') reply = self.simh._child.expect(self.replies_rex["ocomp"]) if "transcript" in self.options_enabled: print (self.simh._child.before.decode().strip()) expect_loop += 1 mon = self.simh.test_result(reply, "Monitor Prompt", self.replies["ocomp"], "") return ret_val #### begin_command ################################################### def begin_command (self, line, script_file): if not self.booted: print("Cannot execute begin subcommand block at line " + \ str(self.line_ct_stack[0]) + ". OS/8 has not been booted.") return "die" sub_commands = {"build": self.build_subcomm, "cdprog": self.cdprog_subcomm} m = re.match(_comm_re, line) if m == None: print("Could not parse sub-command at line " + \ str(self.line_ct_stack[0]) + ": " + line) if m.group(1) not in sub_commands: print("Ignoring unrecognized sub-command at line " + \ str(self.line_ct_stack[0]) + ": " + m.group(1)) print("Ignoring everything to next end.") self.ignore_to_subcomm_end(line, script_file, "") return "fail" else: # Any os8-run command may be called after a simh command that left us # in simh context. Check to see if we need to restart OS/8. # We could resume, but restart is safer. if self.simh._context == "simh": self.restart_command(line, script_file) return sub_commands[m.group(1)](m.group(3), script_file) #### build_subcomm ################################################### # Run system BUILD command. # Use RU not R because we will save it. # Allow specifying WHICH version of build on the command line. def build_subcomm (self, old_line, script_file): os8_comm = "RU " + old_line if self.verbose: print("Line " + str(self.line_ct_stack[0]) + ": " + os8_comm) # Run BUILD and confirm it has started successfully. reply = self.simh.os8_cmd (os8_comm, self.replies_rex["build"], debug=self.debug) if self.simh.test_result (reply, "BUILD Prompt", self.replies["build"], \ "build_subcomm startup " + os8_comm, debug=self.debug) == False: print ("Line " + str(self.line_ct_stack[0]) + ": " + os8_comm + " failed.") print ("Ignoring the rest of this block.") self.ignore_to_subcomm_end(os8_comm, script_file, "build") # Confirm we're back to monitor command level. self.simh.os8_cfm_monitor ("build_subcomm 1") return "fail" # Submit the lines from script file to BUILD sub-command. for line in script_file: line = self.basic_line_parse(line, script_file) if line == None: continue m = re.match(_comm_re, line) if m == None: print("Ignoring mal-formed build sub-command at line " + \ str(self.line_ct_stack[0]) + ": " + line) continue build_sub = m.group(1) rest = m.group(3) if rest == None: rest = "" if self.debug: print ("build_sub: " + build_sub) if build_sub not in _build_comm_regs: print("Unrecognized BUILD command at line " + \ str(self.line_ct_stack[0]) + ": " + build_sub) continue # Handle the exit from BUILD when we hit an "end" statement. if build_sub == "end": if rest == "": print("Warning! end statement encountered inside build with no argument at line " + \ str(self.line_ct_stack[0]) + ".\nExiting build.") # Exit BUILD. Note! Unlike many commands build does NOT echo "^C!" self.simh.os8_ctrl_c ("build_subcomm end with no argument") return "fail" elif rest != "build": print("Warning! Mismatched begin/end blocks in BUILD at line " + \ str(self.line_ct_stack[0]) + ".\nEncountered end: {" + \ rest + "}. Exiting BUILD.") # Exit BUILD. Note! Unlike many commands build does NOT echo "^C!" self.simh.os8_ctrl_c ("build_subcomm mismatched begin/end") return "fail" # We're done. Print any desired verbose or debug status # then ^C to exit and confirm we're at monitor level. if self.verbose: print("Line " + str(self.line_ct_stack[0]) + ": end BUILD") if self.debug: print("before: " + self.simh._child.before.decode().strip()) print("after: " + self.simh.child_after().strip()) # Return to monitor. # Note! Unlike many commands build does NOT echo "^C!" self.simh.os8_ctrl_c ("build_subcomm end with no argument.") return "success" # Now perform sub-commands within BUILD. They have a discernable format. build_re = _build_comm_regs[build_sub] if build_re != None: m2 = re.match(build_re, rest) if m2 == None: print("Ignoring mal-formed BUILD at line " + \ str(self.line_ct_stack[0]) + ": " + build_sub + \ " command: " + rest) continue if build_sub == "BUILD": if m2.group(1) == None or m2.group(1) == "": print("Missing source of OS8.BN. Ignoring BUILD command at line " + \ str(self.line_ct_stack[0]) + ".") continue else: kbm_arg = m2.group(1) if m2.group(3) == None or m2.group(3) == "": print("Missing sorce of CD.BN. Ignoring BUILD command at line " + \ str(self.line_ct_stack[0]) + ".") continue else: cd_arg = m2.group(3) if self.verbose: print("Line " + str(self.line_ct_stack[0]) + \ ": BUILD KBM: " + kbm_arg + ", CD: " + cd_arg) # Confirm prompted for OS8 binary. reply = self.simh.os8_cmd ("BUILD", self.replies_rex["build"], debug=self.debug) if self.simh.test_result(reply, "LOAD OS8", self.replies["build"], "build_subcomm 5") == False: print("No prompt for LOAD OS/8 in BUILD command within BUILD at line " + \ str(self.line_ct_stack[0]) + ".") print("Fatal error. Aborting script.") return "die" # Send it and confirm prompted for CD binary. reply = self.simh.os8_cmd (kbm_arg, self.replies_rex["build"], debug=self.debug) if self.simh.test_result(reply, "LOAD CD", self.replies["build"], "build_subcomm 6") == False: print("No prompt for LOAD CD in BUILD command within BUILD at line " + \ str(self.line_ct_stack[0]) + ".") print("Fatal error. Aborting script.") return "die" # Send it and confirm we're back in BUILD command mode. reply = self.simh.os8_cmd (cd_arg, self.replies_rex["build"], debug=self.debug) if self.simh.test_result(reply, "BUILD Prompt", self.replies["build"], "build_subcomm 7") == False: print ("BUILD command within build failed. Aborting script.") return "die" if self.debug: print("Resume BUILD.SV command loop.") continue # Normal case: commands within BUILD. comm = build_sub + " " + rest if self.verbose: print("Line " + str(self.line_ct_stack[0]) + ": BUILD-> " + comm) reply = self.simh.os8_cmd (comm, self.replies_rex["build"], debug=self.debug) # Special case "BOOT" sub-command: May ask, "WRITE ZERO DIRECT?" # Will give a monitor prompt when done. if build_sub == "BOOT": if self.simh.test_result(reply, "WRITE ZERO DIRECT?", self.replies["build"], \ "", debug=self.debug): if self.debug: print("Got, \"WRITE ZERO DIRECT?\". Sending \"Y\".") reply = self.simh.os8_cmd("Y", self.replies_rex["build"], debug=self.debug) if self.simh.test_result(reply, "SYS BUILT", self.replies["build"], "", debug=self.debug): # Successful boot. We're now at monitor level. # Simplest to ignore anything else in the script up to "end build" # Return success or failure based on finding that monitor prompt. self.ignore_to_subcomm_end(os8_comm, script_file, "build") if self.simh.os8_cfm_monitor ("build_subcomm 8"): return "success" else: return "fail" # At this point we either have a BUILD prompt or an error message. # If it's not the BUILD prompt, we print an error. # If the error is fatal, ignore rest of build block, # exit back to OS/8 if necessary and return fail. # If it's not fatal, continue running BUILD. if self.simh.test_result(reply, "BUILD Prompt", self.replies["build"], \ "build_subcomm 9", debug=self.debug) == False: print("BUILD error at line " + str(self.line_ct_stack[0]) + \ " with command " + self.simh._child.before.decode().strip()) if self.replies["build"][reply][2] == True: print ("Fatal error. Ignoring rest of this block.") self.ignore_to_subcomm_end(os8_comm, script_file, "build") # Confirm we're back at the monitor as expected. self.simh.os8_cfm_monitor ("build_subcomm 10") return "fail" # To continue, we need to ask pexpect to get that BUILD prompt before # resuming after an error. Ignore everything until we get it. self.simh._child.expect("\n\\$$") print("Warning end of file encountered with no end of BUILD command block at line " + \ str(self.line_ct_stack[0]) + ".") return "fail" #### cdprog_subcomm ################################################## # Cycle through OS/8 command decoder with the command specified # in the argument. def cdprog_subcomm (self, old_line, script_file): os8_comm = "RU " + old_line end_str = "cdprog " + old_line if self.verbose: print("Line: " + str(self.line_ct_stack[0]) + ": " + os8_comm) reply = self.simh.os8_cmd (os8_comm, debug=self.debug) if self.simh.os8_test_result (reply, "Command Decoder Prompt", "cdprog: " + \ os8_comm, debug=self.debug) == False: print (" failed at Line " + str(self.line_ct_stack[0])) print ("Ignoring the rest of this block.") self.ignore_to_subcomm_end(os8_comm, script_file, end_str) # Confirm we're back to monitor command level. self.simh.os8_cfm_monitor ("cdprog OS/8 restart after failed RU command") return "fail" # Submit the lines from script file to the running command. # Track whether we return to the Comnand Decoder for more or exit. # Track whether we need to exit and ignore the rest of the block. for line in script_file: line = self.basic_line_parse(line, script_file) if line == None: continue # Test for special case, "end" and act on it if present. m = re.match(_comm_re, line) if m != None and m.group(1) != None and m.group(1) != "" and m.group(1) == "end": rest = m.group(3) retval = "fail" # Return fail unless proven successful. if rest == None or rest == "": print("Warning! end statement encountered inside cdprog " + \ "with no argument at line " + \ str(self.line_ct_stack[0]) + ".") print("Expecting: {" + end_str + "}.") elif rest != end_str: print("Warning! Mismatched begin/end blocks in cdprog at line " + \ str(self.line_ct_stack[0]) + ".\n") print("Expecting: {" + end_str + "}. Got: {" + rest + "}.\n") else: retval = "success" if self.verbose: print("Line " + str(self.line_ct_stack[0]) + ": end " + end_str) if retval == "fail": print("Exiting cdprog, possibly earlier than expected at line " + \ str(self.line_ct_stack[0]) + ".") # Return to Monitor reply = self.simh.os8_escape (caller="Sending escape failed. Trying ^c") self.simh.os8_ctrl_c ("cdprog: ^c failed. State machine will be confused.") return retval # We could do some basic OS/8 command decoder synax checking here. if self.verbose: print("Line: " + str(self.line_ct_stack[0]) + ": * " + line) print("Sending...") reply = self.simh.os8_cmd (line) if self.debug: print ("cdprog sent line. Got reply: " + str(reply) + " -> " + \ self.simh._os8_replies [reply][0]) # Transcribe our output if desired. if "transcript" in self.options_enabled: print (self.simh._child.before.decode().strip()) mon = self.simh.os8_test_result(reply, "Monitor Prompt", "") cd = self.simh.os8_test_result(reply, "Command Decoder Prompt", "") if mon: # Case of command running to completion and returning to OS/8 # Clean up the parse to the end of the block and return success. self.ignore_to_subcomm_end(os8_comm, script_file, end_str) return "success" elif not cd: # We didn't return to command decoder. That means we have an error. # Test the fatal bit in the error structure. # IF True: we returned to OS/8. Say we're ignoring the block and return failure. # Otherwise we should continue. if self.simh._os8_replies[reply][2] == True: print ("Fatal error. Ignoring rest of this block.") self.ignore_to_subcomm_end(os8_comm, script_file, end_str) # Print error message. self.simh.os8_test_result(reply, "Command Decoder Prompt", "cdprog failure") # Confirm we're back at Monitor self.simh.os8_cfm_monitor ("cdprog error handler return to monitor fail") return "fail" else: print ("Non-fatal error encountered with: " + line) print ("\t" + self.simh._os8_replies[reply][0]) # To continue, we need to ask pexpect to get that Command Decoder # prompt before resuming after an error. Ignore everything until we get it. self.simh._child.expect("\n\\*$") print("Warning end of file encountered at line " + \ str(self.line_ct_stack[0]) + \ " with no end of cdprog command block.") # Exit command back to OS/8 monitor. mon = self.simh.os8_escape ("") if mon: return "fail" else: print ("cdprog: Escape from Command Decoder failed. Sending ^c") mon = self.simh.os8_ctrl_c ("") if mon: return "fail" else: print ("Failed to get to monitor with ^c. Killing script.") return "die" #### check_exists #################################################### # Check existence of all files needed def check_exists (s, image_copyins): for copyin in image_copyins: image = copyin[1] image_path = dirs.os8mi + image if (not os.path.isfile(image_path)): print("Required file: " + image_path + " not found.") mkos8_abort(s) # else: print("Found " + image_path) |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 | #!/usr/bin/env @PYCMD@ # -*- coding: utf-8 -*- ######################################################################## # simh/__init__.py - A wrapper class around pexpect for communicating # with an instance of the PiDP-8/I SIMH simulator running OS/8. # # See ../doc/class-simh.md for a usage tutorial. # # Copyright © 2017 by Jonathan Trites, © 2017-2020 by William Cattey # and Warren Young. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS LISTED ABOVE BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT # OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the names of the authors above # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## import os import pexpect import pkg_resources import subprocess import tempfile import time import re import sys import pidp8i #### simh ############################################################# # Object to manage a running SIMH process programmatically with pexpect. # Functions in this file are organized from lower level to higher # level where possible. #### Private functions ################################################ ####################################################################### # simh class class simh: #### constants ###################################################### # pexpect object instance, set by ctor _child = None # Constant used by os8_kbd_delay, assembled in stages: # # 1. PDP-8 RS-232 bits per character: 7-bit ASCII plus necessary # start, stop, and parity bits. # # 2. The ratio of the instructions per second ratios of a PDP-8/I to # that of the host hardware running the simulator. The former is # an approximate value; see lib/pidp8i/ips.py.in for the value and # its defense. The latter is either the IPS rate for: # # a) a Raspberry Pi Model B+, that being the slowest host system # we run this simulator on; or # # b) the IPS rate of the actual host hardware if you have run the # "bin/teco-pi-demo -b" benchmark on it. # # 2. The fact that real PDP-8s ran OS/8 reliably at 300 bps, and have # been claimed to get flaky as early as 600 bps by some. (Others # claim to have run them up to 9,600 bps.) # # 3. The "safe BPS" value is the fastest bit per second speed actual # PDP-8 hardware was known to run OS/8 terminal I/O at. In this # case, it is the high-speed tape reader. # # TODO: We may be able to increase this. # # We have one report that OS/8 was tested with terminals up to # about ~600 bps before becoming unreliable. # # We have another report that OS/8 could run under ETOS with # 9,600 bps terminals, but we don't know if that tells us anything # about OS/8 running without the ETOS multitasking hardware. # # 4. Given above, calculate safe characters per second for host HW. # # 5. Invert to get seconds per character, that being the delay value. _bpc = 7 + 1 + 1 + 1 # [1] _ips_ratio = float (pidp8i.ips.current) / pidp8i.ips.pdp8i # [2] _pdp8i_safe_bps = 300 # [3] _host_safe_cps = _pdp8i_safe_bps * _ips_ratio / _bpc # [4] _os8_kbd_delay = 1 / _host_safe_cps # [5] #### _simh_replies ################################################# # Array of items that describe replies one might get from SIMH. # Each item is a 2 element array consisting of: # [0] A help string that describes the reply. # Match against this string when testing error values. # This value may not be unique. When not unique # the multiple values should represent the same error. # # [1] A regular expression for pexpect to use to match on it. # It is a good idea to terminate status messages with "\r" # in order to confirm we've got the whole line, # and prompts with "$" to terminate the search. # # For speed and efficiency an array of compiled # regular expressions, indexed to _simh_replies # is created by __init__: simh_replies_rex _simh_replies = [ # Prompts: ["Prompt", "sim> $"], # Guard against case we used the simh table when we meant the OS/8 table. ["Monitor Prompt", "\n\\.$"], ["Non-existent device", "Non-existent device"], ] ####_os8_replies ################################################## # Simiar to _simh_replies, but describing replies from OS/8 # when it is running under SIMH. # Each item is a 3 element array consisting of: # [0] A help string that describes the reply. # Match against this string when testing error values. # This value may not be unique. When not unique # the multiple values should represent the same error. # # [1] A regular expression for pexpect to use to match on it. # It is a good idea to terminate status messages with "\r" # in order to confirm we've got the whole line, # and prompts with "$" to terminate the search. # # For speed and efficiency an array of compiled # regular expressions, indexed to _simh_replies # is created by __init__: os8_replies_rex # # [2] A True/False indicator if the command returned to the # keyboard monitor, rather than continuing in the program. _os8_replies = [ # Prompts: ["Monitor Prompt", "\n\\.$", True], ["Command Decoder Prompt", "\n\\*$", False], ["PIP Continue", "\\^$", True], # Newline NOT always present! # OS/8 Handbook 1974 page 1-43/81 Keyboard Monitor Error Messages: ["Directory I/O Error", "MONITOR ERROR 2 AT \d+ \\(DIRECTORY I/O ERROR\\)", True], ["I/O Error on SYS", "MONITOR ERROR 5 AT \d+ \\(I/O ERROR ON SYS\\)", True], ["Directory I/O Error", "MONITOR ERROR 6 AT \d+ \\(DIRECTORY I/O ERROR\\)\r", True], ["Device not available", "(\S+) NOT AVAILABLE", False], ["File not found", "(\S+) NOT FOUND", False], # OS/8 Handbook 1974 page 1-51/89 Command Decoder Error Messages ["Illegal Syntax", "ILLEGAL SYNTAX", False], ["File does not exist", "(\S+) DOES NOT EXIST", False], # ["(\S+) NOT FOUND", False], # See above ["Too many files", "TOO MANY FILES", False], # OS/8 Handbook 1974 page 1-75/113 CCL Error Messages ["Bad Device", "BAD DEVICE", False], ["Bad Extension", "BAD EXTENSION", False], #"", OS/8 Handbook 1974 page 1-106/144 PIP Error Messages ["ARE YOU SURE?", "ARE YOU SURE\\?", False], ["BAD DIRECTORY ON DEVICE", "BAD DIRECTORY ON DEVICE #\s?\d+", False], ["BAD SYSTEM HEAD", "BAD SYSTEM HEAD", False], ["CAN'T OPEN OUTPUT FILE", "CAN'T OPEN OUTPUT FILE", False], ["DEVICE NOT A DIRECTORY DEVICE", "DEVICE #\d+ NOT A DIRECTORY DEVICE", False], ["DIRECTORY ERROR", "DIRECTORY ERROR", False], ["ERROR DELETING FILE", "ERROR DELETING FILE", False], ["ILLEGIAL BINARY INPUT, FILE", "ILLEGIAL BINARY INPUT, FILE #\d+", False], ["INPUT ERROR", "INPUT ERROR, FILE #\s?\d+", False], ["IO ERROR--CONTINUING", "IO ERROR IN \\(file name\\) --CONTINUING", False], ["NO ROOM FOR OUTPUT FILE", "NO ROOM FOR OUTPUT FILE", False], ["NO ROOM--CONTINUING", "NO ROOM IN \\(file name\\) --CONTINUING", False], ["OUTPUT ERROR", "OUTPUT ERROR", False], ["PREMATURE END OF FILE", "PREMATURE END OF FILE, FILE #\s?\d+", False], ["ZERO SYS?", "ZERO SYS?", False], #"", OS/8 Handbook 1974 page 2-81/244: DIRECT Error Messages ["BAD INPUT DIRECTORY", "BAD INPUT DIRECTORY", False], ["DEVICE DOES NOT HAVE A DIRECTORY", "DEVICE DOES NOT HAVE A DIRECTORY", False], ["ERROR CLOSING FILE", "ERROR CLOSING FILE", False], ["ERROR CLOSING FILE", "ERROR CLOSING FILE", False], ["ERROR READING INPUT DIRECTORY", "ERROR READING INPUT DIRECTORY", False], ["ILLEGAL *", "ILLEGAL \\*", False], #"", OS/8 Handbook 1974 page: 2-109/272: FOTP Error Messages ["ERROR ON INPUT DEVICE, SKIPPING", "ERROR ON INPUT DEVICE, SKIPPING \\((\S+)\\)", False], ["ERROR ON OUTPUT DEVICE, SKIPPING", "ERROR ON OUTPUT DEVICE, SKIPPING \\((\S+)\\)", False], ["ERROR READING INPUT DIRECTORY", "ERROR READING INPUT DIRECTORY", False], ["ERROR READING OUTPUT DIRECTORY", "ERROR READING OUTPUT DIRECTORY", False], ["ILLEGAL ?", "ILLEGAL \\?", False], ["NO FILES OF THE FORM", "NO FILES OF THE FORM: (\S+)", False], ["NO ROOM, SKIPPING", "NO ROOM, SKIPPING \\((\S+)\\)", False], ["SYSTEM ERROR-CLOSING FILE", "SYSTEM ERROR-CLOSING FILE", False], ["USE PIP FOR NON-FILE STRUCTURED DEVICE", "USE PIP FOR NON-FILE STRUCTURED DEVICE", False], ["LINE TOO LONG IN FILE", "LINE TOO LONG IN FILE#\d+", False], ] # Pattern to match a SIMH command. The command verb ends up in # match().group(1), and anything after the verb in group(3). _simh_comm_re = re.compile ("^\s*(\S+)(\s+(.*))?$") # Significant prefixes of SIMH command verbs that transition from SIMH # command context back into the simulation: BOOT, CONTINUE, and GO. # We need only the first letter in all cases, since these particular # commands are not ambiguous. They're uppercase because the code that # uses this always uppercases the command before searching this list. _enters_os8_context = ["B", "C", "G"] #### ctor ############################################################ # basedir is the parent of bin/{pdp8,pidp8i-sim}. # # Setting the skip_gpio flag to True causes us to use bin/pdp8 instead # of bin/pidp8i-sim, which runs the simulator with the PiDP-8/I GPIO # thread disabled. You might do this because you don't need any front # panel interaction or because you know you're not running on an RPi # in the first place. def __init__ (self, basedir, skip_gpio = False): # Start the simulator instance sim = 'pdp8' if skip_gpio else 'pidp8i-sim'; self._child = pexpect.spawn (os.path.join (basedir, 'bin', sim)) self._valid_pip_options = ["/A", "/B", "/I"] self._os8_file_re = re.compile("(\S+):(\S+)?") self._os8_error_match_strings = [] self._os8_fatal_check = [] self.verbose = False # We keep track of the command context and transition automatically. self._context = "simh" # Pre-compile our os8_replies regexps. self._os8_replies_rex = [] for item in self._os8_replies: self._os8_replies_rex.append(re.compile(item[1].encode())) # Pre-compile our simh_replies regexps. self._simh_replies_rex = [] for item in self._simh_replies: self._simh_replies_rex.append(re.compile(item[1].encode())) # Turn off pexpect's default inter-send() delay. We add our own as # necessary. The conditional tracks an API change between 3 and 4. pev4 = (pkg_resources.get_distribution("pexpect").parsed_version > pkg_resources.parse_version("4.0")) self._child.delaybeforesend = None if pev4 else 0 # Wait for the simulator's startup message. if not self.try_wait ('PDP-8 simulator V.*git commit id: [0-9a-f]', 10): raise RuntimeError ('Simulator failed to start') #################### simh pexpect Abstraction layer ################## # Ideally these should be the public interface to pexpect # used with the simh object #### set_logfile ##################################################### def set_logfile (self, lf): self._child.logfile = lf #### send_line ####################################################### # Sends the given line "blind", without before or after checks def send_line (self, line): self._child.sendline (line) #### read_tail ####################################################### # Watch for a literal string, then get what follows on that line. def read_tail (self, head, timeout = -1): self._child.expect_exact ([head], timeout) return self._child.readline () #### spin ############################################################ # Let child run without asking anything more from it, with an optional # timeout value. If no value is given, lets child run indefinitely. def spin (self, timeout = None): self._child.expect (pexpect.EOF, timeout = timeout) #### child_expect ################################################### # Higher level accessor to _child.expect that catches the timeout. def child_expect(self, replies, timeout=10): try: reply = self._child.expect(replies, timeout=timeout) except pexpect.exceptions.TIMEOUT: print ("pexpect timeout") print("\tmatch before: {" + self._child.before.decode() + "}") return -1 return reply #### child_after ##################################################### # Abstract accessor for the pexpect object's after contents. # Copes with the possibility that we timed out or hit end of file. def child_after (self): obj = self._child.after if obj == pexpect.TIMEOUT: return "TIMEOUT" elif obj == pexpect.EOF: return "End Of File" return self._child.after.decode() #### try_wait ######################################################## # A wrapper around self._child.expect which catches exceptions and # returns false on pexpect timeout. If you pass a list instead of a # string, it also returns true if the match wasn't for the first # element, so you can pass [success, failure1, failure2, etc.] to # check for a known-success case and one or more failure cases. def try_wait (self, matches, timeout = -1): try: return self._child.expect (matches, timeout = timeout) == 0 except pexpect.exceptions.TIMEOUT: sys.stderr.write ("Exceeded " + str(timeout) + " sec timeout " + "waiting for " + str(matches) + "\n") return False except: sys.stderr.write ("Failed to match " + str(matches) + ": unknown exception.\n") return False ######################## Utility Functions ############################# #### test_result ###################################################### # Given a result number, an expected result, and an array of result elements, # return True if the result matched expected value. # If caller is not the empty string, print a message about it. # # This routine does the repetitive work of testing results returned # from running a command, and optionally printing status. def test_result (self, reply, expected, results, caller, debug=False): # Cover case of utter failure. if reply == -1: if debug or caller != "": print (caller + ": failure.") return False reply_ID = results[reply][0] if debug: print ("test_result: Got reply: " + str(reply) + " -> " + reply_ID) print("\tmatch before: {" + self._child.before.decode() + "}") print("\tmatch after: {" + self.child_after() + "}") if reply_ID.lower() == expected.lower(): return True else: if caller != "": print (caller + ": Expected: \"" + expected + "\". Instead got: \"" + reply_ID + "\".") return False ##################### Basic SIMH Interaction ########################### # Use these to work with simh under pexpect #### esc_to_simh ###################################################### # Unconditionally go to SIMH def esc_to_simh (self, debug=False): self._child.sendcontrol ('e') reply = self.child_expect (self._simh_replies_rex) # Wait to get simh prompt self.simh_test_result(reply, "Prompt", "esc_to_simh") self._context = "simh" if debug: print("esc_to_simh: reply: " + str(reply) + " -> " + self._simh_replies[reply][0]) print("\tmatch before: {" + self._child.before.decode() + "}") print("\tmatch after: {" + self.child_after() + "}") return reply #### simh_test_result ################################################# # Convenience wrapper for test_result that uses SIMH replies. def simh_test_result (self, reply, expected, caller, debug=False): return self.test_result (reply, expected, self._simh_replies, caller) #### simh_send_line ######################################################## # Send a line to simh while managing context. # If we are not in the simh context call esc_to_simh which will # send ^e, and set the context to simh. # If we issue a command that enters os8 context, set context "os8". # It is up to the caller to then do an expect to confirm success. def simh_send_line (self, cmd, debug=False): if debug: print ("Context: " + self._context) if self._context != "simh": self.esc_to_simh() if debug: print ("simh_send_line: Sending: " + cmd) self._child.sendline (cmd) m = re.match (self._simh_comm_re, cmd) if m != None and m.group(1)[:1].upper() in self._enters_os8_context: self._context = "os8" #### simh_cmd ######################################################## # If we are not in the simh context call esc_to_simh which will # send ^e, and set the context to simh. # If we issue a command that enters os8 context, set context "os8". # Wait for a reply for error checking. # replies is an optional argument that defaults to _simh_replies_rex def simh_cmd (self, cmd, replies=None, debug=False): if replies == None: replies = self._simh_replies_rex self.simh_send_line (cmd, debug=debug) reply = self.child_expect(replies) if reply == -1: print ("simh_cmd: was sending:" + cmd) if debug: print("\tGot reply: " + str(reply) + " -> " + self._simh_replies[reply][0]) print("\tmatch before: {" + self._child.before.decode() + "}") print("\tmatch after: {" + self.child_after() + "}") return reply #### quit ############################################################ # Quits the simulator and waits for it to exit # By calling simh_send_line, we are careful to look to our context # and escape to SIMH if necessary. def quit (self): self.simh_send_line("quit") #### zero_core ####################################################### # From SIMH context, zero the entire contents of core, which is # assumed to be 32 kWords. # # SIMH's PDP-8 simulator doesn't start with core zeroed, on purpose, # because the actual hardware did not do that. SIMH does not attempt # to simulate the persistence of core memory by saving it to disk # between runs, but the SIMH developers are right to refuse to do this # by default: you cannot trust the prior state of a PDP-8's core # memory before initializing it yourself. # # See os8_zero_core () for a less heavy-handed alternative for use # when running under OS/8. def zero_core (self): reply = self.simh_cmd ('de all 0') self.simh_test_result(reply, "Prompt", "simh_zero_core") ################# PDP-8 SIMH Interaction ############################# # High level interfaces to learn about and change device configurations # for the PDP-8 under SIMH. #### describe_dev_config ############################################# # We provide an interface to alter SIMH device configurations for # specific parameters and specific devices # # dev configs supported: rx, tti, tape # # rx: RX8E, RX28 RX8E is the simh name for RX01 support. # RX28 is the simh name for RX02 support. # tti: KSR, 7b 7b is full keyboard support. # KSR forces upcase of lower case keys on input. # tape: td, dt td is the TD8E DECtape device # dt is the TC08 DECtape device def describe_dev_config (self, name): if name == "tape": lines = self.do_simh_show("dt") dev_status = self.parse_show_tape_dev(lines) if dev_status == "dt": return "dt" else: lines = self.do_simh_show("td") return self.parse_show_tape_dev(lines) elif name == "rx": lines = self.do_simh_show("rx") return self.parse_show_rx_dev(lines) elif name == "tti": lines = self.do_simh_show("tti") return self.parse_show_tti(lines) else: return None #### do_simh_show ################################################### # Calls show on the device name. # Returns array of lines from output. # This is focused on OS/8 devices. def do_simh_show (self, name): supported_shows = ["dt", "td", "tti", "rx"] if name not in supported_shows: return None ucname = name.upper() self.simh_send_line("show " + name) if self.child_expect(ucname + "\s+(.+)\r") == -1: return [] lines = self.child_after().split ("\r") return lines #### parse_show_tape_dev ############################################ # Returns current state of DECtape support. # One of: disabled, td, dt, or None if parse fails. def parse_show_tape_dev (self, lines): if lines == None: return None is_enabled_re = re.compile("^(TD|DT)\s+(disabled|(devno=\S+,\s(\d)\s+units))$") m = re.match(is_enabled_re, lines[0]) if m == None or m.group(1) == None or m.group(2) == None: return None if m.group(2) == "disabled": return "disabled" elif m.group(1) == "TD": return "td" elif m.group(1) == "DT": return "dt" else: return None #### parse_show_tape_attached ######################################## # Returns an ordered list of files attached or None if disabled. def parse_show_tape_attached (self, lines): if lines == None: return None if len(lines) < 2: return None attached = {} attachment_re = re.compile("^\s+(((DT|TD)(\d)(.+),\s+(not\s+attached|attached\s+to\s+(\S+)),(.+))|12b)$") for line in lines[1:]: m = re.match(attachment_re, line) if m == None or m.group(1) == None or m.group(1) == "12b": continue filename = m.group(7) if filename == None: filename = "" attached[m.group(4)] = filename return attached #### do_print_lines ################################################### # Debugging aid. Prints what we parsed out of child_after. def do_print_lines (self, lines): for line in lines: print(line) #### simh_configure routines ######################################### # These routines affect the state of device configuration in SIMH. # They are intended as robust ways to toggle between incompatible # configurations of SIMH: # Choice of TD8E or TC08 DECtape (SIMH td and dt devices). # Choice of RX01 or RX02 Floppy emulation. # The SIMH rx device sets RX8E for RX01, and RX28 for RX02. # Choice of KSR or 7bit console configuration. # # When re-configuring dt, dt, and rx devices, any attached # images are detached before reconfiguration is attempted. # (SIMH errors out if you don't detach them.) # # The check to see if the change is unnecessary. # For now they return None if no change necessary. # # After re-configuring the device, the SIMH show command is used # to confirm the re-configuration was successful. # # In future, we should add exception handling for no change necessary. # For now, return True if the change was successful and False if not. def set_tape_config (self, to_tape): if to_tape == "dt": from_tape = "td" elif to_tape == "td": from_tape = "dt" else: print("Cannot set_tape_config for " + to_tape) return False if self.verbose: print("Disable: " + from_tape + ", and enable: " + to_tape) lines = self.do_simh_show(from_tape) from_status = self.parse_show_tape_dev(lines) if from_status == None: print("do_tape_change: Trouble parsing \'show " + from_tape + \ "\' output from simh. Giving up on:") self.do_print_lines (lines) return False if from_status == "disabled": print(from_tape + " already is disabled.") else: attached_from = self.parse_show_tape_attached(lines) if attached_from == None: print("do_tape_change: Trouble parsing \'show " + from_tape + \ "\' output from simh. Giving up on:") self.do_print_lines (lines) return False else: for unit in attached_from.keys(): if attached_from[unit] != "": det_comm = "det " + from_tape + unit if self.verbose: print(det_comm + "(Had: " + attached_from[unit] + ")") reply = self.simh_cmd(det_comm) self.simh_test_result(reply, "Prompt", "set_tape_config: " + det_com) reply = self.simh_cmd("set " + from_tape + " disabled") self.simh_test_result(reply, "Prompt", "set_tape_config disable " + from_tape) lines = self.do_simh_show(to_tape) to_status = self.parse_show_tape_dev(lines) if to_status == None: print("do_tape_change: Trouble parsing \'show " + to_tape + \ "\' output from simh. Giving up on:") self.do_print_lines (lines) return False elif to_status != "disabled": print(to_tape + " already is enabled.") else: reply = self.simh_cmd("set " + to_tape + " enabled") self.simh_test_result(reply, "Prompt", "set_tape_config enable " + to_tape) # Test to confirm to_tape is now enabled. lines = self.do_simh_show(to_tape) to_status = self.parse_show_tape_dev(lines) if to_status == None: print("Failed enable of " + to_tape + \ ". Parse fail on \'show " + to_tape + "\'. Got:") self.do_print_lines (lines) return False elif to_status == "disabled": print("Failed enable of " + to_tape + ". Device still disabled.") return False else: return True #### parse_show_rx_dev ############################################### # Show the rx device configuration. def parse_show_rx_dev (self, lines): if lines == None: return None is_enabled_re = re.compile("^\s*(RX)\s+(disabled|((RX8E|RX28),\s+devno=\S+,\s+(\d)\s+units))$") m = re.match(is_enabled_re, lines[0]) if m == None or m.group(2) == None: return None if m.group(2) == "disabled": return "disabled" return m.group(4) #### parse_show_rx_attached ########################################## # Returns an ordered list of files attached or None if disabled. def parse_show_rx_attached (self, lines): if len(lines) < 2: return None attached = {} attachment_re = re.compile("^\s+(((RX)(\d)(.+),\s+(not\s+attached|attached\s+to\s+(\S+)),(.+))|autosize)$") for line in lines[1:]: m = re.match(attachment_re, line) if m == None or m.group(1) == None or m.group(1) == "autosize": continue filename = m.group(7) if filename == None: filename = "" attached[m.group(4)] = filename return attached #### set_rx_config #################################################### def set_rx_config (self, to_rx): to_rx = to_rx.lower() if to_rx == "rx8e": from_rx = "rx28" elif to_rx == "rx01": to_rx = "rx8e" from_rx = "rx28" elif to_rx == "rx28": from_rx = "rx8e" elif to_rx == "rx02": to_rx = "rx28" from_rx = "rx8e" else: print("Cannot set_rx_config for " + to_rx) return False if self.verbose: print("Switch rx driver: " + from_rx + ", to: " + to_rx) lines = self.do_simh_show("rx") rx_type = self.parse_show_rx_dev (lines) if rx_type == None: print("do_rx_change: Trouble parsing \'show rx\' output from simh. Giving up on:") self.do_print_lines(lines) return False elif rx_type == "disabled": if self.verbose: print("rx is disabled. Enabling...") reply = self.simh_cmd("set rx enabled") self.simh_test_result(reply, "Prompt", "set_rx_config enable rx") # Retry getting rx info lines = self.do_simh_show("rx") rx_type = self.parse_show_rx_dev (lines) if rx_type == None: print("do_rx_change after re-enable: Trouble parsing \`show rx\` output from simh. Giving up on:") self.do_print_lines(lines) return False elif rx_type == "disabled": print("do_rx_change re-enable of rx failed. Giving up.") return False if rx_type.lower() == to_rx: print("rx device is already set to " + to_rx) return None attached_rx= self.parse_show_rx_attached(lines) if attached_rx == None: print("do_rx_change: Trouble parsing /'show rx\' from simh to find rx attachments. Got:") self.do_print_lines(lines) else: for unit in attached_rx.keys(): if attached_rx[unit] != "": det_comm = "det rx" + unit if self.verbose: print(det_comm + "(Had: " + attached_rx[unit] + ")") reply = self.simh_cmd(det_comm) self.simh_test_result(reply, "Prompt", "set_rx_config detach: " + det_comm) reply = self.simh_cmd("set rx " + to_rx) self.simh_test_result(reply, "Prompt", "set_rx_config set rx " + to_rx) # Test to confirm new setting of RX lines = self.do_simh_show("rx") rx_type = self.parse_show_rx_dev (lines) if rx_type == None: print("Failed change of rx to " + to_rx + \ ". Parse fail on \'show rx\'.") return False elif rx_type.lower() != to_rx: print("Failed change of rx to " + to_rx + ". Instead got: " + \ rx_type) return False return True #### get_tti ################################################## # Returns an ordered list of files attached or None if disabled. def parse_show_tti (self, lines): if lines == None: return None is_enabled_re = re.compile("^(KSR|7b)$") if len(lines) < 2: return None # That second line of output contains embedded newlines. m = re.match(is_enabled_re, lines[1].strip()) if m == None or m.group(1) == None: return None return m.group(1) #### do_tti_change ################################################### def set_tti_config (self, to_tti): if to_tti == "KSR": from_tti = "7b" elif to_tti == "7b": from_tti = "KSR" else: print("Cannot set_tti_config to " + to_tti) return if self.verbose: print("Switch tti driver from: " + from_tti + ", to: " + to_tti) lines = self.do_simh_show("tti") tti_type = self.parse_show_tti (lines) if tti_type == None: print("do_tti_change: Trouble parsing \'show tti\' output from simh. Giving up on:") self.do_print_lines(lines) return False elif tti_type == to_tti: print("tti device is already set to " + to_tti) return None reply = self.simh_cmd("set tti " + to_tti) self.simh_test_result(reply, "Prompt", "set_tti_config setting tti " + to_tti) # Test to confirm new setting of tti lines = self.do_simh_show("tti") tti_type = self.parse_show_tti (lines) if tti_type == None: print("Failed change of tti to " + to_tti + \ ". Parse fail on \'show tti\'.") return False elif tti_type != to_tti: print("Failed change of tti to " + to_tti + ". Instead got: " + \ tti_type) return False else: return True ############### Basic OS/8 Interaction ############################### # Intereact with OS/8 under SIMH. #### os8_kbd_delay ################################################### # Artificially delay the media generation process to account for the # fact that OS/8 lacks a modern multi-character keyboard input buffer. # It is unsafe to send text faster than a contemporary terminal could, # though we can scale it based on how much faster this host is than a # real PDP-8. See the constants above for the calculation. def os8_kbd_delay (self): time.sleep (self._os8_kbd_delay) #### os8_send_str ######################################################## # Core of os8_send_line. Also used by code that needs to send text # "blind" to OS/8, without expecting a prompt and without a CR, as # when driving TECO. def os8_send_str (self, str): for i in range (0, len (str)): self.os8_kbd_delay () self._child.send (str[i]) #### os8_send_ctrl ################################################### # Send a control character to OS/8 corresponding to the ASCII letter # given. We precede it with the OS/8 keyboard delay, since we're # probably following a call to os8_send_line or os8_cmd. def os8_send_ctrl (self, char): cc = char[0].lower () self.os8_kbd_delay () self._child.sendcontrol (cc) if cc == 'e': self._context = 'simh' #### os8_send_line ################################################### # Core of os8_cmd. Also used by code that needs to send text # "blind" to OS/8, without expecting a prompt, as when driving EDIT. def os8_send_line (self, line): self.os8_send_str (line) self._child.send ("\r") #### os8_test_result ################################################## # Convenience wrapper for test_result that uses OS/8 replies. def os8_test_result (self, reply, expected, caller, debug=False): return self.test_result (reply, expected, self._os8_replies, caller, debug) #### mk_os8_name # ################################################### # Create an OS/8 filename: of the form XXXXXX.YY # From a POSIX path. def mk_os8_name(self, dev, path): bns = os.path.basename (path) bns = re.sub("-|:|\(|\)|!", "", bns) bns = bns.upper() if "." not in bns: return dev + bns[:min(6, len(bns))] else: dot = bns.index('.') return dev + bns[:min(6, dot, len(bns))] + "." + bns[dot+1: dot+3] #### os8_cmd_ ################################################### # Send the given command to OS/8. # replies is an array of possible replies that command will get. # Returns the index into the replies array that pexpect got, # or -1 if the command could not be run. # replies is an optional argument which defaults to _os8_replies_rex def os8_cmd (self, cmd, replies=None, debug=False, timeout=60): if replies == None: replies = self._os8_replies_rex if self._context != 'os8': print("OS/8 is not running. Cannot execute: " + cmd) return -1 self.os8_send_line (cmd) reply = self.child_expect (replies, timeout = timeout) return reply #### os8_cfm_monitor ################################################## # Confirm return to OS/8 monitor. # This function is necessary so that we know our command has returned to OS/8. # Without this test, the next child_expect hits a monitor prompt instead of # what it will be looking for. # If caller is not empty, it will emit an error string if the prompt wasn't seen. # Returns True if we are where we expect. def os8_cfm_monitor (self, caller, debug=False): reply = self.child_expect(self._os8_replies_rex) return self.os8_test_result(reply, "Monitor Prompt", caller, debug=debug) #### os8_ctrl_c ################################################## # Return to OS/8 monitor using the ^C given escape character. # We will probably, but not always get an echo of ^C. # For example BUILD is known NOT to. # Our testing makes it optional. # We listen for an uparow and assume the C follows, and listen again # for the monitor prompt. # Optional caller argument enables a message if the ^C escape failed. # Note: OS/8 will respond to this escape IMMEDIATELY, # even if it has pending output. # You will need to make sure all pending output is in # a known state and the running program is quiescent # before calling this method. Otherwise pexpect may get lost. def os8_ctrl_c (self, caller = "", debug=False): self.os8_send_ctrl ("c") reply = self.child_expect(self._os8_replies_rex) uparrow = self.os8_test_result(reply, "PIP Continue", "") if uparrow: reply = self.child_expect(self._os8_replies_rex) return self.os8_test_result(reply, "Monitor Prompt", caller) #### os8_escape ################################################## # Return to OS/8 monitor using the escape (^]) character. # We need to listen for the $ echo or else cfm_monitor gets confused. # Confirm we got our monitor prompt. # Optional caller argument enables a message if escape failed. # Note: OS/8 will respond to this escape IMMEDIATELY, # even if it has pending output. # You will need to make sure all pending output is in # a known state and the running program is quiescent # before calling this method. Otherwise pexpect may get lost. def os8_escape (self, caller = "", debug=False): self.os8_send_ctrl ('[') self.child_expect("\\$") return self.os8_cfm_monitor (caller) #### simh_restart_os8 ####################################################### # Abstraction on returning to OS/8 monitor from within SIMH. # It is common practice to "load address 7600; start" at the console. def simh_restart_os8 (self, caller = "", debug=False): # Note we're calling simh with os8 replies because we will # be switching contexts. # simh_cmd manages the context, and checks for success # by expecting a command prompt. reply = self.simh_cmd ('go 7600', self._os8_replies_rex, debug=debug) # We test our reply with os8_test result because we're in OS/8 now. self.os8_test_result(reply, "Monitor Prompt", caller) #### simh_resume_os8 ########################################################## # Continue execution of OS/8. # This has been extremely tricky to get right. # What we must do is give OS/8 a chance to wake up. # We do this by asking pexpect to show us our "cont\n" echo and then # we do an os8_kbd_delay() # We carefully use simh_send_line to send the command so that we # know to set the os8 context. # WARNING! Using simh_resume_os8 without having booted OS/8 # has undefined reslts. def simh_resume_os8 (self): self.simh_send_line ("cont") # Give OS/8 a chance to wake up. self.child_expect("cont\r") self.os8_kbd_delay() #### os8_zero_core ################################################### # Starting from OS/8 context, bounce out to SIMH context and zero all # of core excepting: # # 0. zero page - many apps put temporary data here # 1. the top pages of fields 1 & 2 - OS/8 is resident here # 2. the top page of field 2 - OS/8's TD8E driver (if any) lives here # # We then restart OS/8, which means we absolutely need to do #1 and # may need to do #2. We could probably get away with zeroing page 0. # # All of the above explains why we have this special OS/8 alternative # to the zero_core() method. def os8_zero_core (self): reply = self.simh_cmd ('de 00200-07577 0') self.simh_test_result(reply, "Prompt", "os8_zero_core 00200-07577") reply = self.simh_cmd ('de 10000-17577 0') self.simh_test_result(reply, "Prompt", "os8_zero_core de 10000-17577 0") reply = self.simh_cmd ('de 20000-27577 0') self.simh_test_result(reply, "Prompt", "os8_zero_core de 20000-27577 0") reply = self.simh_cmd ('de 30000-77777 0') self.simh_test_result(reply, "Prompt", "os8_zero_core de 30000-37577 0") self.simh_restart_os8 () #### os8_squish ######################################################## # Wraps the OS/8 SQUISH command for a given device. def os8_squish (self, device, caller = ""): reply = self.os8_cmd ("SQUISH " + device + ":") self.os8_test_result (reply, "ARE YOU SURE?", caller) reply = self.os8_cmd ("Y") self.os8_test_result (reply, "Monitor Prompt", caller) #### os8_pip_to ################################################### # Send a copy of a local file to OS/8 using PIP. # # The file is sent via the SIMH paper tape device through PIP # specifying a transfer option. If no option is specified, # ASCII is assumed. # # In ASCII mode, we pre-process with txt2ptp which translates # POSIX ASCII conventions to OS/8 conventions. In all other # modes, we do not do any translation. # # However, we should supply a sacrificial NULL as an additional character # because the OS/8 PTR driver throws the last character away. (NOT DONE YET) # # Entry context should be inside OS/8. Exit context is inside OS/8. # def os8_pip_to (self, path, os8name, option = None, debug=False): if option == None: option = "" # If os8name is just a device, synthesize an upcased name from # the POSIX file basename. if not os.path.exists(path): print(path + " not found. Skipping.") return m = re.match(self._os8_file_re, os8name) if m != None and (m.group(2) == None or m.group(2) == ""): dest = self.mk_os8_name(os8name, path) else: dest = os8name # Gross hack: # The command decoder prompt that comes when we continue a PTR/PTP # does not have a newline. But everything else that matches on # a command decoder prompt NEEDS that newline. Otherwise we match # on asterisks in file specs. # Remember to decrement replies on this rex list if we use # _os8_replies pip_rex = [re.compile("\\*$".encode())] pip_rex.extend(self._os8_replies_rex) did_conversion = False if option == "" or option == "/A": # Convert text file to SIMH paper tape format in current dir of path. if self.verbose: print("Format converting " + path) bdir = pidp8i.dirs.build # Create uniquified temp path name. pt = path + "-" + str(os.getpid()) + ".pt_temp" tool = os.path.join (bdir, 'bin', 'txt2ptp') subprocess.call (tool + ' < ' + path + ' > ' + pt, shell = True) did_conversion = True elif option not in self._valid_pip_options: print("Invalid PIP option: " + option + ". Ignoring: " + path + \ " to OS/8.") return else: pt = path # TODO: Sacrificial extra character code goes here. # Paper tape created, so attach it read-only and copy it in. We're # relying on txt2ptp to insert the Ctrl-Z EOF marker at the end of # the file. reply = self.simh_cmd ('attach -r ptr ' + pt, debug=debug) self.simh_test_result(reply, "Prompt", "os8_pip_to attaching ptr") # Enter OS/8. self.simh_restart_os8 (caller="os8_pip_to") reply = self.os8_cmd ('R PIP', debug=debug) # Has PIP Startup been successful? if self.os8_test_result (reply, "Command Decoder Prompt", "os8_pip_to 0", \ debug=debug) == False: return # Give file and test for ready to send. if debug: print ("os8_pip_to: Sending: " + dest + '<PTR:' + option) reply = self.os8_cmd (dest + '<PTR:' + option, debug=debug) if self.os8_test_result (reply, "PIP Continue", "os8_pip_to 1", debug=debug) == False: # If we got "PIP Continue" we keep going. Otherwise return. # Send escape if reply indicates we didn't go back to the monitor. if self._os8_replies[reply][2] == False: self.os8_send_ctrl ('[') return # Finish transfer # The test for success is implicit. self.os8_send_ctrl ('[') reply = self.child_expect (pip_rex) if reply != 0: self.os8_test_result (reply - 1, "Command Decoder Prompt", "os8_pip_to 2", debug=debug) # If we did not return to monitor hit escape to exit PIP. if self._os8_replies[reply - 1][2] == False: self.os8_send_ctrl ('[') # Success or Non-fatal error. # Must exit PIP and wait for monitor prompt. Complain if we don't get it! reply = self.child_expect (self._os8_replies_rex) self.os8_test_result (reply, "Monitor Prompt", "os8_pip_to 3") # detach ptr # self.esc_to_simh () # self.simh_cmd ('detach ptr ') # self.os8_restart () # Remove the temp file if we created one. if did_conversion: os.remove (pt) #### os8_pip_from ################################################### # Fetch a file from OS/8 to a local path using PIP. # # The OS/8 source filename is synthesized from the basename of the path, # upcasing if necessary. # # The file is sent via the SIMH paper tape device through PIP # specifying a transfer option. If no option is specified, # ASCII is assumed. # # In ASCII mode, we post-process with ptp2txt which translates # POSIX ASCII conventions to OS/8 conventions. In all other # modes, we do not do any translation. # # Entry context should be inside OS/8. Exit context is inside OS/8. def os8_pip_from (self, os8name, path, option = None, debug=False): if option == None: option = "" # If path is not a file, use the name portion of os8name. if os.path.isdir(path): colon = os8name.find(':') if colon == -1: # No dev, just a name. path = path + "/" + os8name else: path = path + "/" + os8name[colon+1:] if option != "" and option not in self._valid_pip_options: print("Invalid PIP option: " + option + \ ". Ignoring os8_pip_from on: " + path) return reply = self.simh_cmd ('attach ptp ' + path, debug=debug) self.simh_test_result(reply, "Prompt", "os8_pip_from attachng ptp") # Enter OS/8. self.simh_restart_os8 (caller="os8_pip_from 0") reply = self.os8_cmd ('R PIP', debug=debug) # Has PIP Startup been successful? if self.os8_test_result (reply, "Command Decoder Prompt", "os8_pip_from 0") == False: return # Issue file transfer spec. reply = self.os8_cmd ('PTP:<' + os8name + option, debug=debug) # Test for Success if self.os8_test_result (reply, "Command Decoder Prompt", "os8_pip_from 1") == False: # There is an empty PTP file we need to remove. os.remove(path) # Was this a fatal error? if self._os8_replies[reply][2] == False: self.os8_send_ctrl ('[') # Non-fatal error. Must exit PIP return self.os8_send_ctrl ('[') # exit PIP # Must wait for monitor prompt. Complain if we don't get it! reply = self.child_expect (self._os8_replies_rex) self.os8_test_result (reply, "Monitor Prompt", "os8_pip_from 2") reply = self.simh_cmd ('detach ptp', debug=debug) # Clean flush of buffers. self.simh_test_result(reply, "Prompt", "os8_pip_from detaching ptp") # Enter OS/8. self.simh_restart_os8(caller="os8_pip_from 3") if option == "" or option == "/A": if self.verbose: print("Format converting " + path) # Convert text file to SIMH paper tape format bdir = pidp8i.dirs.build # Create uniquified temp path name. pf = path + "-" + str(os.getpid()) + ".pf_temp" os.rename(path, pf) tool = os.path.join (bdir, 'bin', 'ptp2txt') subprocess.call (tool + ' < ' + pf + ' > ' + path, shell = True) os.remove(pf) |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < |
|
| | > > | 1 2 3 | *.tu56 *.rk05 *.rk05.save |
> > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 | /PALTST.PA / / Trivial PAL8 program to provoke some errors when compiled. / *200 START, CLA CLL TAD UNDEF DCA UNDEF2 $ |
︙ | ︙ | |||
80 81 82 83 84 85 86 | ## Subdirectories | Directory Name | Content Description | ----------------|------------------------------------------------------------ | patches | Contains the OS/8 patch files | scripts | Contains scripts fed to os8-run to automate various actions. | | < | 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | ## Subdirectories | Directory Name | Content Description | ----------------|------------------------------------------------------------ | patches | Contains the OS/8 patch files | scripts | Contains scripts fed to os8-run to automate various actions. | subsys | Images containing OS/8 subsystems such as U/W Focal, Fortran IV, etc. ## Other Files | File Name | Content Description | ---------------------------------------------------------------------------- | `LICENSE.md` | License provided by DEC that makes our use of OS/8 legal | `init.cm` | Command to type out the contents of INIT.TX. Used at startup by | | various boot images. | `init.tx.in` | Baseline text typed out by init.cm. Configuration in auto.def | | establishes parameters that are substituted to create `init.tx`. [dga]: http://www.pdp8online.com/images/images/misc_dectapes.shtml [tlrm]: /doc/trunk/README.md [vdms]: http://vandermark.ch/pdp8/index.php?n=OS8.OS8-V3D [vdma]: http://vandermark.ch/pdp8/index.php |
cannot compute difference between binary files
> > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 | PiDP-8/I @VERSION@ - OS/8 V3D Combined Kit - KBM V3T - CCL V3A Built from source by @BUILDUSER@ on @BUILDTS@ Restart address = 07600 Type: .DIR - to get a list of files on DSK: .DIR SYS: - to get a list of files on SYS: .R PROGNAME - to run a system program .HELP FILENAME - to type a help file |
|
| < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
︙ | ︙ | |||
13 14 15 16 17 18 19 | OS/8. Some of the data on these tapes could potentially be used with other PDP-8 operating systems, but at minimum, it would require translating the data from OS/8 tape format. | DECtape Image File Name | Content Description | ---------------------------------------------------------------------------- | < < < < | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | OS/8. Some of the data on these tapes could potentially be used with other PDP-8 operating systems, but at minimum, it would require translating the data from OS/8 tape format. | DECtape Image File Name | Content Description | ---------------------------------------------------------------------------- | `music.tu56` | [RFI-based][rfi] music playback programs ## Controlling the Build Process Most of these files are merged into the OS/8 binary disk image by default, but can be excluded by giving a `--disable-os8-NAME` flag to |
︙ | ︙ | |||
47 48 49 50 51 52 53 | still exclude these programs by default since not all PiDP-8/I machines will have these modifications. See the [top-level `README.md` file][tlrm] for further information about the `--enable-os8-*` and `--disable-os8-*` configuration options. | < < < | 43 44 45 46 47 48 49 50 51 52 | still exclude these programs by default since not all PiDP-8/I machines will have these modifications. See the [top-level `README.md` file][tlrm] for further information about the `--enable-os8-*` and `--disable-os8-*` configuration options. [k12]: http://www.columbia.edu/kermit/pdp8.html [rfi]: https://en.wikipedia.org/wiki/Electromagnetic_interference [tlrm]: /doc/trunk/README.md |
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # OS/8 Combined Kit patches to apply # The patches have been extensively reviewed and documented # in doc/os8-combined-kit.md patch $src/patches/os8/v3d/CREF-21.15.1M-v5B.patch8 patch $src/patches/os8/v3d/CREF-21.15.2M-v5C.patch8 patch $src/patches/os8/v3d/BRTS-31.11.2-O.patch8 patch $src/patches/os8/v3d/SABR-21.91.1M-v18B.patch8 patch $src/patches/os8/v3d/F4-51.3.2M-v4x.patch8 # patch $src/patches/os8/v3d/TECO 31.20.1 Unconditional no case flagging. Not recommended # patch $src/patches/os8/v3d/TECO-31.20.01O.patch8 # patch $src/patches/os8/v3d/TECO 31.20.2 Turns off verbose errors. Not recommended. # patch $src/patches/os8/v3d/TECO-31.20.02O.patch8 # patch $src/patches/os8/v3d/TECO 31.20.3 Turns off Yank overwrite warning. Not recommended. # patch $src/patches/os8/v3d/TECO-31.20.03O.patch8 # patch $src/patches/os8/v3d/TECO 31.20.4 Special support for VT05. Not recommended. # patch $src/patches/os8/v3d/TECO-31.20.04O.patch8 patch $src/patches/os8/v3d/TECO-31.20.05M-v5A.patch8 patch $src/patches/os8/v3d/TECO-31.20.06M-v5B.patch8 patch $src/patches/os8/v3d/TECO-31.20.07M.v5C.patch8 patch $src/patches/os8/v3d/TECO-31.20.08M-v5.04.patch8 patch $src/patches/os8/v3d/TECO-31.20.10M-v5.05.patch8 patch $src/patches/os8/v3d/TECO-31.20.11M-v5.06.patch8 patch $src/patches/os8/v3d/TECO-31.20.12M-v5.07.patch8 patch $src/patches/os8/v3d/TECO-31.20.13M-v5.08.patch8 patch $src/patches/os8/ock/ABSLDR-21.29.1M-v6C.patch8 patch $src/patches/os8/ock/PAL8-21.22.4M.patch8 patch $src/patches/os8/ock/PAL8-35.14.1M.patch8 patch $src/patches/os8/ock/BLOAD-35.51.1M-v5B.patch8 |
> > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # Supersedes article dated June/July 1980 # # LOADER PROBLEM WITH SAVE IMAGE FILES (BS) # # There is a problem in that Loader does not work with Save Image files. # The following patch, applied via FUTIL, will correct this problem. .R FUTIL SET DEV SYS SET MODE SAVE FILE ABSLDR.SV 14105/1757 7000 14106/7004 7000 14107/7110 7000 14110/3757 7000 12200/6602 6603 WRITE EXIT # Note that the above patch upgrades ABSLDR from Version 6B to Version 6C, |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # BLOAD WILL NOT BUILD CCB PROPERLY (JR) # On some very large programs, BLOAD will not build the CCB properly when the # /K option is used. The following patch corrects this: .GET SYS BLOAD .ODT 2155/xxxx 0000 2156/xxxx 6203 2157/xxxx 7000 2160/xxxx 1000 2775/2520 2154 3027/6502 6503 \c .SAVE SYS BLOAD # This Patch Upgrades BLOAD to V5C. |
> > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # LINE SIZE ON OUTPUT OF BASIC (JR.) # There seems to be great interest in extending basic output to 133 # characters. The following patch will extend the output line width to # 132 chars (9 columns of number data). Basic console input will remain # at 72 chars max - that is not easily patched since the buffer ? other # code + data. This restriction does not apply to file I/O - only the # tty. .GET SYS BRTS .ODT 2570/7774 7767 2573/7660 7574 3375/7660 7574 \c .SA SYS BRTS |
> > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 | # Problem: CREF dies on source files containing a FIXTAB directive. # Diagnosis: Patch V4B incorrectly installed into CREF V5A. # Solution: Apply the following patch: .GET SYS:CREF .ODT 6063/2022 5270 6070/2025 2022;5314 6114/xxxx 1363;1025;3025;3425;2025;5252 2576/xxxx 0302 \c .SAVE SYS:CREF |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # INPUT AND OUTPUT FILE SPECIFICATIONS (RY) # # The following patch allows you to specify two non-system handlers, where previously # only one non-system handler and one system handler were required. .GET SYS CREF .ODT 0264/1773 1327 0327/xxxx 0000 4234/3352 3752 4352/0000 0327 2576/0302 0303 \c .SAVE SYS CREF.SV # This patch upgrades CREF.SV from V5B to V5C. |
> > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # F4 V4A # FORTRAN COMPILER NOT RECOGNIZING SYNTAX ERROR (JB) # F4 compiler does not recognize syntax error in type declaration # statement. # The following patch will resolve this situation. .GET SYS F4.SV .ODT 2520/4557 5326 2521/2200 7000 2522/5600 7000 2541/5320 5326 \c .SAVE SYS F4.SV |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # EXPUNGE PATCH TO PAL8 (DBB) # Problem: A symbol definition following an EXPUNGE directive causes a # symbol table exceeded (SE) error in some cases. # # Diagnosis: The EXPUNGE directive code in PAL8 improperly counts the # number of symbols that it deletes from the symbol table. # # Solution: Install the following patch which upgrades PAL8 to V13B. .GET SYS PAL8 .ODT 1471/4573 5373;7106;7650;5307 1573/xxxx 4573;1020;5272 1533/0301 0302 \c .SAVE SYS PAL8 |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # SABR V18A Seq 21.91.1 M # LINE BUFFER PROBLEM IN SABR (DBB) # Problem: When a SABR input line generates code across a page boundary, # SABR puts out an altered version of the line next to the code # at the beginning of the next page in the listing file. # Diagnosis: The routine to enable the buffer to be placed in the listing # file is in error. # Solution: Install the following patch. .GET SYS SABR .ODT 14755/6201 1362;5757;5375;3362;5754 15375/0000 6201;5777;6173; 16173/0000 3777;6211;5776;4760;1646 17033/7001 7002 \c .SAVE SYS SABR # The underlined text is computer generated. This patch # corrects the problem and upgrades SABR to Version 18B. |
> > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # In OS/8 TECO VS, the default value for the EU flag is 0 # (unless .SET TTY SCOPE has been specified to the KBM # in which case the default value is -1). # # Users who wish to permanently change the default value to be -1 # (no case flagging) may install the following patch: .GET SYS TECO .ODT 4576/ 0000 7777 2245/ 7650 7200 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # CHANGING THE DEFAULT EH VALUE for one-line error printouts. # # In OS/8 TECO V5, as on the PDP-10 and PDP-11, the default value of the # EH flag is 0, which is the same as 2. This value causes the one-line # form of an error message to print upon encountering an error. # This could be annoying to experienced users with slow terminals. # Naturally, you can change this at run-time by executing the # 1EH command which causes only the 3-character error message cod # to print thereafter. # # Users who wish to cause the default value of the EH flag # to be permanently set to 1, can install the following patch: .GET SYS TECO .ODT 4572/0000 1 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # REMOVING YANK PROTECTION (SR) # # Probably the most common way to lose data in TECO is to accidentally # type 'Y' when you meant to type 'T'. OS/8 TECO VS has included # what is known as Yank protection. Yank protection causes the error message # # ?YCA Y Command Aborted # # to be produced any time that the following 3 conditions are met: # (a) The current command is Y or # (b) There is text in the text buffer # (c) There is an output file open. # # If all these conditions are met, it is presumed that you are about # to lose some important data, and so the command is rejected. # Note that the Yank is always legal if the text buffer is empty # or if no output file is open. If you really want to do the Yank, # you can always type HKY, a command which will always succeed. # # Users who do not wish to have Yank protection can patch it out of TECO # by installiing the following patch: .GET SYS TECO .ODT 2032/ 7640 7610 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # SCOPE SUPPORT FOR VT05 USERS # # Version 5 of TECO supports scope terminals (such as VT50, VT52, VT78, etc.) # by sending appropriate escape sequences to the terminal. # For example, when typing the immediate mode command ^U during a multi-line # command string, TECO will physically erase the current line from the screen. # This support will not work properly on terminals which do not support these # escape sequences. # # For our users with VT05's, we offer the following patch which will # permit TECO to work properly on a VT05 terminal: .GET SYS TECO .ODT 2771/ 4552 7200 1446/ 0101 0032 1437/ 0113 0036 5405/ 0113 0036 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # PROBLEM WITH AY COMMAND (SR) # # Problem: On rare occasions, the Y command will fail, giving the error message # # ?NAY Numeric Argument with Y # # even though no numeric argument was specified. # For example, the AY command (Append then Yank) consistently fails in this manner. # The test for a numeric argument is incorrect. # The following patch corrects this problem and upgrades TECO to 5A: .GET SYS TECO .ODT 2022/ 1024 2024;7610 4573/ 0005 0765 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # CONDITIONALS INSIDE ITERATIONS # # Problem: TECO does not properly handle unsatisfied conditionals # if other conditionals are encountered within an inner iteration # while scanning for the terminating single quote. # # While scanning for the matching single quote, TECO keeps an iteration count # for each level of nested iterations which it finds. # TECO then ignores any single quotes which occur at a 'nest' level greater than 0. # (All conditionals must end at the same macro level that they begin.) # The problem is that TECO incorrectly bumps the conditional count # whenever it sees a double quote. # This should not be done for double quotes occurring at a non-zero level. # # The following patch fixes this problem by causing TECO to # ignore double quotes within iterations while scanning for # a terminating single quote. This ?atch upgrades TECO to VSB: .GET SYS TECO .ODT 6077/ 7240 5356 6156/ xxxx 7200;1763;7650;7240;5300;3331 4573/ 0765 0766 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # ECHOING OF WARNING BELLS (SR) # # Problem: When typing in command characters to TECO, # if you come within 10 characters of running out of memory, TECO warns you by # ringing the terminal bell after each character input. # (This gives you a small margin in which to clean up your command, # e.g. by typing two altmodes.) # Should you persist in typing after the ten warnings, # upon typing the 11th character, TECO prints the error message # # ?QMO Q-Register Memory Overflow. # # This mechanism works correctly except that the ringing of the bell # is accompanied by the printing of the (unwanted) two-character sequence "^G". # TECO is ringing the bell by calling TYPTCV instead of TPUT. # # The following patch corrects this problem, by causing # only a warning bell to ring. This patch upgrades TECO to V5C. .GET SYS TECO .ODT 0365/ 4521 4552 4573/ 0766 0767 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | # CTRL/U SOMETIMES FAILS AFTER * (SR) # PROBLEMS: # (I) If a command line contains the character '*', then a subsequent # use of the immediate mode command, ^U, will reprint the entire # command string as well as erasing the current line. (This will # not hurt you - but it is annoying.) # (II) If on a scope terminal, a command line contains the character # '*', then rubbing out a tab, line feed, vertical tab, or form # feed will cause the entire command string to be reprinted. # (III) The bell-space and bell-star (^G<space> and ^G* ) commands were # not documented because they did not work properly. # The immediate mode command, ^G<space> causes the current line of # the commmand string to be retyped. # The immediate mode command, ^G* causes the entire command string # to be retyped. # Note that the ^G (bell) character cannot be entered in up-arrow # mode. # (IV) The ^G* command incorrectly prints out the contents of all your # Q-Pegisters. # (V) When in scope mode, if you rub-out back to the first line of the # command string, and if there is text in some Q-register, the '*' # representing TECO's last prompt vanishes from the screen. # (VI) The ^G<space> command works improperly on 12K machines when # there are more than 2900 characters stored away in Q-registers. # ANALYSIS: # Poltergeists in TECO. # DISPOSITION: # The following patch fixes all these bugs in TECO. It also makes # the ^G<space> and ^G* commands work properly. This patch # upgrades TECO to version 5.04. .GET SYS:TECO .ODT 1341/1435 1464;1464 1431/5235 5264 1435/4265 7510;5313;1072;5304 1500/7240 1072;7040;1050;5235 1463/4265 5266;1175;3331 1524/1175 6032;5775;1175;5253 4570/1454 1526 0255/5772 5004 0004/xxxx 1577;4540;5407;1464 4573/0767 0770 \c .SAVE SYS:TECO |
> > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # TECO computes the product n*0 incorrectly. # Complementing a 13-bit 0 sets the link. # TECO fails to account for this. # The following patch to TECO V5.04 fixes this bug by # zeroing the link before starting the multiply. # This patch upgrades TECO to V5.05 # Just as in V3C TECO (Version 4), multiplication by # negative numbers is not supported and unpredictable # results will occur if a multiplicand is less than 0 .GET SYS:TECO .ODT 1311/7010 7110 4573/0770 0771 \c .SAVE SYS:TECO |
> > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Q-REGISTERS DON'T WORK IN 8K (SR) # TECO doesn't work properly on 8K machines. # The code which changes the handling of Q-register # storage in the 8K case is faulty. # This patch upgrades TECO to Version 5.06. .GET SYS:TECO .ODT 5762/0122 7777 5771/xxxx 122;127;102;107;7777 5710/3362 3371;24 # Correction: Original patch had version change wrong. 4573/0771 772 \c .SAVE SYS:TECO |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # CAN'T SKIP OVER A "W" (SR) # PROBLEM: # If the letter w (as in PW) occurs inside a piece of # TECO code which is being skipped (say because it is # part of an unsatisfied conditional), TECO V5.06 # will blow up. # DIAGNOSIS: # The appropriate skip table does not end with the # required negative number. This table flows into # the skip table for skipping the second letter of an # E command (R, w, B, or G). The corresponding # entries in the dispatch table are all harmless # (positive) except for 'W' which causes SORT to # branch to 'death'. # SOLUTION: # The following patch inserts a -1 indicator to # properly terminate the table: # This patch upgrades TECO to V5.07. .GET SYS:TECO .ODT 5264/7240 1360 5461/7346 7344 6250/7346 7344 # Correction: original patch had version wrong. 4573/0772 0773 5227/1760 1642 5242/6201 7777 5360/7777 7776 5331/5266 5264 \c .SAVE SYS:TECO |
> > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # UNSPECIFIED ITERATIONS AFTER INSERTS (SR) # Problem: # If an iteration has no iteration count specified, and the # previous command was "on insert, then the iteration is # skipped. For example, the command IA$<L> will not work # properly. # Diagnosis: # The insert code destructively tests the number flag (NFLG) # and if it was 0, sets it to a 1. It is never reset to 0. # The iteration code sees a 1 and thinks a number is # present. Looking for one, it finds 0 and thinks the # iteration count is 0 meaning skip this iteration. # Cure: # The insert code should reset (zero) the number flag. This # was not a problem in TECO V4 because 0<> was the same as # <> then. Apply the following patch (which upgrades TECO # to version 5.08): .GET SYS:TECO .ODT 2616/6032 5776;3167 2674/5565 5617 4573/0773 0774 \c .SAVE SYS:TECO |
> > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # Supersedes article dated June/July 1980 # # LOADER PROBLEM WITH SAVE IMAGE FILES (BS) # # There is a problem in that Loader does not work with Save Image files. # The following patch, applied via FUTIL, will correct this problem. .R FUTIL SET DEV SYS SET MODE SAVE FILE ABSLDR.SV 14105/1757 7000 14106/7004 7000 14107/7110 7000 14110/3757 7000 12200/6602 6603 WRITE EXIT # Note that the above patch upgrades ABSLDR from Version 6B to Version 6C, |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | # BASIC. UF V5A # BASIC. UF INCOMPATIBLE FROM OS/8 V3C (SPR 8-2537 JG) # BASIC. UF is incompatible with OS/8 V3D BASIC due to PAGE ZERO references # that were not updated. # The following binary patch or source change can be made to fix this # problem. # This patch upgrades BASIC.UF to V5B. .GET SYS:BASIC.UF .ODT 3447/1073 1177 3467/4514 4556 3474/4514 4556 3523/4514 4556 3525/1074 1171 3531/1074 1171 3561/1073 1177 3607/4535 4526 3624/4514 4556 3636/4514 4556 3716/1073 1177 3752/4536 4524 4012/4514 4556 4021/1074 1171 # The next line appears in the patch but no such subroutine # Call is present. Reviewing the source code of the patch: # This location contains 1273 TAD NSAM # The patch says change it to 4556 JMS I FIXP # I think this location should be left unchanged. # 4044/4514 4556 4060/1073 1177 4067/1077 1172 4160/3064 3056 4162/4534 4557 4163/0307 0311 4207/4535 4526 4216/4514 4556 4225/4514 4556 4275/4514 4556 4312/4514 4556 4403/4514 4556 4433/4514 4556 4444/4514 4556 4451/1073 1177 4476/4556 4573 4504/4514 4556 4507/4514 4556 4513/4514 4556 4532/1073 1177 \c .SAVE SYS:BASIC.UF |
> > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # OS/8 EXTENSION KIT V3D Seq 31. 23. 1 M # BATCH V7A # MANUAL INTERVENTION REQUIRED ERRONEOUSLY (SR) # Problem: The message MANUAL HELP NEEDED is sometimes printed even # though no use is made of a terminal, paper tape reader or # card reader in the BATCH stream. (The message does not # hurt, the system continues to function properly.) # Diagnosis: This problem was fixed in BATCH V5D and V6A for KBM # commands that called the CD in special mode. This fix was # incorporated in BATCH V7A. However, a similar problem # exists if a CCL command does a special mode decode. The # problem is that routine CDSCN at location 7200 (in the # field of BATCH) is being called with a 5200 in the AC (the # special mode indicator), but CDSCN thinks 0 means special # mode. The solution is to allow either 0 or 5200 to mean # special mode. # Cure: Install the following patch which upgrades BATCH to V7B: .GET SYS:BATCH .ODT 7201/3340 5344 7344/xxxx 1351;7440;1352;3340;5202;2600;5200 7326/4752 7000 1701/0137 0237 \c .SAVE SYS:BATCH |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # BLOAD WILL NOT BUILD CCB PROPERLY (JR) # On some very large programs, BLOAD will not build the CCB properly when the # /K option is used. The following patch corrects this: .GET SYS BLOAD .ODT 2155/xxxx 0000 2156/xxxx 6203 2157/xxxx 7000 2160/xxxx 1000 2775/2534 2154 3027/6501 6502 \c .SAVE SYS BLOAD # This patch upgrades BLOAD to V5B. |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # IOTABLE OVERFLOW (SPR 8-2431 JR) # Problem: The size of the IOTABLE is 15 (Octal). # This was misread as 15 (Decimal) making entry #4 overflow into the handler. # # The following patch will fix the problem and upgrades BRTS.SV to V5B. .GET SYS BRTS .ODT 2010/ 7106 7104\n 2011/ 7006 1065\n 2012/ 7041 7006\n 2013/ 1065 1065\n 2014/ 7041 7000 1116/ 0301 0302 \c .SAVE SYS BRTS |
> > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # BRTS.SV V5B Supersedes article dated Mar 78 # BASIC PNT FUNCTION (JR) # Presently the OS/8 BASIC PNT function forces the parity bit on. # Therefore, it is impossible to output octal codes 000-077. # The following patch removes this limitation. .GET SYS BRTS .ODT 1761/0162 7000 1762/1172 0174 \c .SAVE SYS BRTS # This is an optional patch. Optional patches do not change the version # levels. |
> > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # LINE SIZE ON OUTPUT OF BASIC (JR.) # There seems to be great interest in extending basic output to 133 # characters. The following patch will extend the output line width to # 132 chars (9 columns of number data). Basic console input will remain # at 72 chars max - that is not easily patched since the buffer ? other # code + data. This restriction does not apply to file I/O - only the # tty. .GET SYS BRTS .ODT 2570/7774 7767 2573/7660 7574 3375/7660 7574 \c .SA SYS BRTS |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # BRTS.SV V5B Seq. 31.11.5 M # PATCH TO BRTS FOR ADDRESSING LAB 8/B FUNCTIONS (JR) # The correct patch to BRTS.SV for proper addressing of LAB 8/E functions for # 0S/8 BASIC is as follows: # 1. Make the patch to BASIC/UF as described in the # August-September 1978 DSN. Note that, location 4044 contains # 1273 and not 4514 before being changed to 4556. # 2. Patch BRTS.SV. This patch replaces the patch described in # the OS/8 Language »«ftr»B1!i Hanuiil (A A-H609A-TA) , BASIC # chapter, page 5-2. .GET SYS BRTS .ODT 00001/xxxx 5402 FUNCTION 00002/xxxx 4456 01560/xxxx 3400 INI 01561/xxxx 3454 PLY 01562/xxxx 3473 DLY 01563/xxxx 3600 DIS 01564/xxxx 4000 SAM 01565/xxxx 4077 CLK 01566/xxxx 3542 CLH 01567/xxxx 3522 ADC 01570/xxxx 4400 GET 01571/xxxx 4432 PUT 01572/xxxx 4267 DRI 01573/xxxx 4311 DR0 \c .SA SYS BRTS |
> > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 | # Problem: CREF dies on source files containing a FIXTAB directive. # Diagnosis: Patch V4B incorrectly installed into CREF V5A. # Solution: Apply the following patch: .GET SYS:CREF .ODT 6063/2022 5270 6070/2025 2022;5314 6114/xxxx 1363;1025;3025;3425;2025;5252 2576/0301 0302 \c .SAVE SYS:CREF |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # INPUT AND OUTPUT FILE SPECIFICATIONS (RY) # # The following patch allows you to specify two non-system handlers, where previously # only one non-system handler and one system handler were required. .GET SYS CREF .ODT 0264/1773 1327 0327/xxxx 0000 4234/3352 3752 4352/0000 0327 2576/0302 0303 \c .SAVE SYS CREF.SV # This patch upgrades CREF.SV from V5B to V5C. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | / / / D L O G / - - - - / / VERSION 5A 4-27-77 PT / /LOGE(X) / /X=2^N*F / /LOGE(X) /= N*LOGE(2)+LOGE(F) / / SECT DLOG JA #DALOG DPCHK / /IF X<=0 - IT IS AN ERROR EXTERN #ARGER DALERR, TRAP4 #ARGER / TEXT +DLOG + DALXR, SETX XRDAL SETB BPDAL BPDAL, F 0.0 XRDAL, F 0.0 F 0.0 ORG 10*3+BPDAL FNOP JA DALXR 0 DALRTN, JA . N, F 0.0 F 0.0 F, F 0.0 F 0.0 DAL1, F 1.0 F 0.0 / DT7, 7776 /1/7 2222 2222 2222 2222 2221 DT6, 7776 /-1/6 5252 5252 5252 5252 5252 DT5, 7776 /1/5 3146 3146 3146 3146 3146 DT4, 7776 /-1/4 4000 0 0 0 0 DT3, 7777 /1/3 2525 2525 2525 2525 2524 DT2, 7777 /-1/2 4000 0 0 0 0 / A0, F 1.84375 F 0.0 A1, F 1.65625 F 0.0 A2, F 1.500 F 0.0 A3, F 1.375 F 0.0 A4, F 1.250 F 0.0 A5, F 1.1875 F 0.0 A6, F 1.09375 F 0.0 A7, F 1.03125 F 0.0 LA0, 0 /.6118015411059928976 2344 7603 2325 4250 3144 LA1, 0 /.5045560107523952859 2011 2512 4551 3503 7657 LA2, 7777 /.4054651081081643810 3174 6217 5457 7141 1370 LA3, 7777 /.3184537311185346147 2430 3057 0207 0573 0232 LA4, 7776 /.2231435513142097553 3443 7737 0746 5150 4146 LA5, 7776 /.1718502569266592214 2577 6301 6051 7117 2356 LA6, 7775 /.08961215868968712374 2674 1512 1271 2655 1272 LA7, 7773 /.030771658666753687 3740 5154 1636 0313 7764 D16, F 16.0 F 0.0 D8, F 8.0 F 0.0 CUM, F 0.0 F 0.0 DLOGE2, 0 2613 4413 7676 4347 5715 / /PICK UP X BASE 0 #DALOG, STARTD FLDA 10*3 FSTA DALRTN FLDA 0 SETX XRDAL SETB BPDAL BASE BPDAL LDX 1,1 FSTA BPDAL FLDA% BPDAL,1 /ADDRESS FSTA BPDAL STARTE FLDA% BPDAL /AND X JLE DALERR /X <= 0 IS ERROR FSUB DAL1 /SUB 1.0 JNE DALA FCLA /LOG(1)=0 JA DALRTN / DALA, FLDA% BPDAL /GET ARGUMENT BACK FSTA XRDAL /STORE AT X /EXPONENT STORED IN XR0 /MANTISSA STORED IN XR1-5 /PICK UP EXP + MULTIPLY BY LOGE(2) / XTA 0 FMUL DLOGE2 FSTA N /N*LOGE(2) /XRDAL IS NOW FRACTION IN RANGE .5<=F<1.0 /COMPUTE LOG(F) BY /LOG(F)=LOG(A(K1)*A(K2)...(F))-(LOG(A(K1))+ / LOG(A(K2))...) /FIT F IN A 1/16 RANGE /I.E. 1/2-9/16,9/16-10/16,ETC. /MULTIPLY F BY APPROPRIATE A(K) MULTIPLIER /KEEP RUNNING SUM OF LOG(A(K)) /CONTINUE UNTIL F>1 / LDX 0,0 FLDA XRDAL FSTA F FCLA FSTA CUM DALB, FLDA F FMUL D16 /16 REAL PARTS FSUB D8 /NEED JUST 8 ATX 1 FLDA A0,1 /GET MULTIPLIER FMULM F FLDA LA0,1 /ADD LOG(A(K)) TO SUM FADDM CUM FLDA F FSUB DAL1 JLT DALB /NOW F>1. USE TAYLOR SERIES /LOG(T)=Z-(Z^2)/2+(Z^3)/3+... WHERE Z=T-1 FLDA F FSUB DAL1 /F-1.0 FSTA F FMUL DT7 FADD DT6 FMUL F FADD DT5 FMUL F FADD DT4 FMUL F FADD DT3 FMUL F FADD DT2 FMUL F FADD DAL1 FMUL F FSUB CUM FADD N JA DALRTN |
> > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 | # Problem: EDIT sometimes loses its TAB characters in multi-page files # if file is exited on other than the last page. # # Solution: Make the following patch to OS/8 V3D of EDIT.SV. # This raises the patch level to V12B .GET SYS:EDIT.SV .ODT 2014/1301 1357 2372/0301 0302 \c .SAVE SYS:EDIT.SV |
> > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # EDIT V12B 21.17.2 M # EDIT Q COMMAND AFTER L COMMAND (RY) # # Problem: When a "Q" command is issued after an "L" command, the output # is sent to the terminal instead of the file. # # Diagnosis: The "Q" command has bypassed the code that resets the # variable 'OUTDEV in its attempt to clear the variable # 'TABIND' # # Solution: Install the following patch, that upgrades EDIT to Version # 12C. .GET SYS:EDIT .ODT 2372/0302 0303 2014/nnnn 2774 2774/nnnn 3112;5776;1301 \c .SAVE SYS:EDIT |
> > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # EDIT V12C Seq 21.17.3 M # EDIT Q COMMAND PATCH (RY) # # Problem: The "Q" command does not output the first page of a file. # # Solution: Install the following patch and EDIT is upgraded to Version # 12D. .GET SYS:EDIT .ODT 1360/5304 5301 2372/0303 0304 \c .SAVE SYS:EDIT |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # EDIT.SV "V" OPTION WILL NOT WORK WITH LPT (RY) # # The "V" option of EDIT.SV will not work when the LPT interface is the # parallel port of the DKC8-AA I/O option board. Install the following patch # and EDIT will be upgraded from V12B to V12C. # Correction: This is the 4th patch in the sequence, and upgrades EDIT # from V12D to V12E .GET SYS EDIT .ODT 2713/6666 5374 2774/xxxx 7040;6574;5314 2714/6661 6570 2372/0304 0305 \c .SAVE SYS EDIT.SV |
> > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # Updated in Dec/Jan 1978 SEQ 21.1.2 N to correct referencee to F4 not FRTS. # F4.SV V4A Seq 2 M # EQUIVALENCE STATEMENT (MH) # The EQUIVALENCE statement does not always work correctly in OS/8 FORTRAN IV V3D. # Install the following patch to correct the problem. .GET SYS F4.SV .ODT 2067/1471 1367 2070/1071 5363 2163/**** 2071 2164/**** 7000 2165/**** 1071 2166/**** 5271 2167/**** 2 1130/6401 6402 \c .SAVE SYS F4.SV .GET SYS PASS3.SV .ODT 712/6401 6402 \c .SAVE SYS PASS3.SV # This patch upgrades F4.SV to V4B. |
> > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Supersedes article dated Mar 78 # FORTRAN COMPILER FAILS TO RECOGNIZE " AS AN ERROR (SPR 8-2428 JB) # Problem: The F4 compiler fails to recognize the double quotes (") as # an incorrect character in a subroutine call argument. # Instead, it generates an argueless call. # Solution: The following patch corrects this problem and should be # installed: .GET SYS F4 .ODT 3343/ 7440 7640 1130/ 6402 6403 \c .SAVE SYS F4 # This patch corrects this problem and upgrades the F4.SV to V4C. |
> > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # F4 V4A # FORTRAN COMPILER NOT RECOGNIZING SYNTAX ERROR (JB) # F4 compiler does not recognize syntax error in type declaration # statement. # The following patch will resolve this situation. .GET SYS F4.SV .ODT 2520/4557 5326 2521/2200 7000 2522/5600 7000 2541/5320 5326 \c .SAVE SYS F4.SV |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # FORTRAN IV DLOG PATCH (JR) # # There is a problem with DLOG where it could not handle numbers smaller than # 1.E-018 correctly. The following patch fixes this problem. # # Make a source change to DLOG.RA using either EDIT or TECO. Replace # this line: # # Published patch has a typo. There is no "EADD" function. It is "FADD". # DALA, EADD DAL1 /ADD BACK # with : # DALA, FLDA% BPDAL /GET ARGUMENT BACK # .R RALF # *DLOG.RL<DLOG.RA # .R LIBRA # *FORLIB.RL<FORLIB.RL,DLOG.RL/Z/R |
> > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # FOTP V9A Seq 21. 19. 1 M # INCORRECT DIRECTORY VALIDATION (SR) # Problem: # If a device contains many files and the directory contains no # additional information words (i.e., no dates) then FOTP may # think the directory is invalid. # Diagnosis: # FOTP checks the validity of a directory by several means. One # method is a range check on the number of file entries in the # first directory segment. If the directory had been built with # 0 additional information words (/Z=100), then the segment can # contain more entries than FOTP believes is possible. # Solution: # Modify FOTP so that it permits a directory segment with as many # as 71 entries. To do this, install the following patch: .GET SYS:FOTP .ODT 12375/7700 7671 14346/7700 7671 15036/7101 7102 \c .SAVE SYS:FOTP # This patch upgrades FOTP to Version 9B. # Most users are not affected by this patch. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # OS/8 FORTRAN IV KIT V3D Seq 51.3.3 0 # FRTS. SV V5 # FORTRAN RUNTIME SYSTEM 2 PAGE HANDLER (JM) # The FORTRAN Run-Time System has worked wih the TD8E 2 page system handler. # To add it to work with other 2 page system handlers and, in particular the # RL01, the following patch must be installed. .GET SYS:FRTS .ODT 12675/7001 0342 12742/XXXX 7770 17526/0000 0000 17527/3763 3307 17530/1763 1333 17531/3762 3363 17532/1763 5346 17533/7001 7635 17534/3761 1570 17535/5726 7710 17546/XXXX 1763 17547/XXXX 1334 17550/XXXX 7100 17551/XXXX 1335 17552/XXXX 7630 17553/XXXX 5360 17554/XXXX 1763 17555/XXXX 0341 17556/XXXX 1307 17557/XXXX 3763 17560/XXXX 2363 17561/7642 5346 17562/7727 5726 17563/7721 0 17566/0212 6220 \c .SAVE SYS:FRTS This patch is optional and does not change the patch level. |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # The patch given below upgrades FUTIL V7A to V7B. It corrects the # following problems: # 1. Typing CTRL/U crashes FUTIL if the current partiall-typed # line contains a semicolon. # 2. Overlay mapping (in SAVE mode) is not done correctly. .GET SYS FUTIL .ODT 0310/3523 3536 0333/1523 1536 3342/3357 3362 3343/1357 1362 3351/1361 1357 3354/2357 2362 12520/0100 0200 \c .SAVE SYS FUTIL |
> > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # OS/8 EXTENSION KIT V3D # FUTIL V7B Seq 31.21.2 M # PATCH TO FIX 'SHOW CCB' AND MAPPING OF 'CD' MODULES (SPR 8-2550) # The following contains the corrections to both of these problems. .GET SYS FUTIL .ODT 12024/3242 5345 12025/1642 7650 12026/7450 5236 12027/5236 1642 12145/XXXX 3242 12146/XXXX 1242 12147/XXXX 1351 12150/XXXX 5225 12151/XXXX 1175 12075/7040 7000 12520/0200 0400 \c .SAVE SYS:FUTIL # This patch upgrades FUTIL to V7D. |
> > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # -237 PATCH (SR) # The XS format in FUTIL is useful for dumping data stored in excess 240 # packed six bit. This is the format of PAL12 six bit strings. # Users who would prefer the XS format to dump data stored in excess 237 # packed six bit may install the following optional patch: .GET SYS:FUTIL .ODT 5355/4532 4770 5360/4532 4770 5370/xxxx 5761 5762/xxxx 1365;4532;5761;7777 \c .SAVE SYS FUTIL # Excess 237 packed six bit is the format used by COS data files. # Optional patches do not change FUTIL's version number. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | # THIS PATCH FIXES THE FOLLOWING BUGS: # 1. THE WRONG 2 WORD PAIR IN THE MEMORY CONTROL BLOCK FOR A FULL 4K # MEMORY IMAGE. # 2. ACCESSING THE WRONG GST SYMBOL WHEN USING LOADER CODE 11 (POP AND # STORE INTO GST). # 3. LINK MEMORY ALLOCATION BUG WHEN DEALING WITH RESTRICTED PROGRAM # SECTIONS. # THIS PATCH UPGRADES LINK TO VlD .R EPIC *LINK.SV</1<esc> R,1\r O,111\r 0340/ 440\r W\r R,3\r O,352 \r 5356/ 5364\r O,355\r 1443/ 6211\n 5747/ 5363\r O,363\r 0000/ 1443 \n 0000/ 5747\r W\r R,24\r O,222\r 2441/ 7000\r W\r R,25\r O,305\r 3162/ 3055\r O,336\r 1562/ 1455 \n 3562/ 3455\r W\r R,46\r O,254\r 7001/ 5271\r O,271\r 0000/ 7450 \n 0000/ 1370\n 0000/ 7001\n 0000/ 5255\r W\r \c |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | # THIS PATCH FIXES THE FOLLOWING BUGS: # 1. ERROR IN COMPUTING JOB STATUS WORD FOR MEMORY IMAGE # 2. EAD TECHNIQUE IN COMBINING MULTIPLE NULL PAGES # 3. BAD FIELD NUMBER IN OVERLAY DATA TABLE FOR OVRDRV # 4. BAD OVERLAY/LEVEL LENGTH IN OVERLAY DATA TABLE FOR OVRDRV # # THIS PATCH UPGRADES LINK TO VIE .R EPIC *LINK.SV</1<esc> R,1\r O,111\r 0440/ 0540\r W\r R,24\r O,31\r 1227/ 1775\n 3776/ 7450\n 1775/ 5257\n 7450/ 7041\n 5257/ 3244\n 7041/ 7344\n 3244/ 3137\n 7344/ 1227\n 3137/ 3776\n O,56\r 5242/ 5240\r O,314\r 1035/ 5715\n 3035/ 5065\r W\r R,25\r O,57\r 7450/ 1043\n 5265/ 7450\n 1043/ 5271\r O,64\r 7100/ 5246\r O,70\r 7630/ 400 \n 5305/ 7100\n 1341/ 1043\n 1371/ 1270\n 7041/ 3043\n 3043/ 7430\n 7100/ 5337\r O,100\r 7041/ 7161\r O,102\r 7620/ 7670\r O,111\r 5332/ 5246\r O,117\r 7100/ 1341\n 1341/ 7041\n 1044/ 7100\n 7620/ 5273\r W\r R,31\r O,2\r 7041/ 376\n 1063/ 7041\n 0376/ 1063\r O,65 \r 0000/ 3275\n 0000/ 1275\n 0000/ 7040\n 0000/ 35\n 0000/ 1275\n 0000/ 3035\n 0000/ 5674\n 0000/ 2716\r W\r R,42\r O,50\r 1042/ 1542\n 7041/ 7001\n 1542/ 5360\n 7710/ 7700\r O,160\r 0000/ 7110\n 0000/ 7041\n 0000/ 1042\n 0000/ 5253\r W\r R,46\r O,111\r 7112/ 7000\n 7010/ 7000\r O,125\r 7001/ 7000\n 7110/ 7000\r O,264 \r 1041/ 1042\r O,273\r 7001/ 3042\n 5255/ 1042\n 0000/ 7001\n 0000/ 5255\r W\r R,50\r O,214\r 1411/ 5243\r O,243\r 0000/ 1411\n 0000/ 7001\n 0000/ 7110\n 0000/ 5215\r W\r ? # (Question mark, if output by EPIC here, may be ignored) \c |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | # THIS PATCH FIXES THE FOLLOWING BUGS: # 1. LOSS OF DATA IN THE .SV IMAGE # 2. BUG IN COMPUTATION OF RSECTS ON THE SAME PAGE AS ANOTHER PROGRAM # 3. BAD MEMORY CONTROL BLOCKS WHEN USING /M OPTION # 4. NEW SYSTEM ERROR (2760) FOR BAD SYMBOL TYPE # THIS PATCH UPGRADES LINK TO VlF .R EPIC *LINK.SV</1<esc> R,1\r O,111\r 0540/ 640\r W\r R,24\r O,357\r 0000/4514\n 0000/5357\r W\r R,25\r O,147(CP) 1101/2757\n 1101/2757\n W\r R,26\r O,74\r 5235/5250\r O,301\r 7041/7161\r O,303\r 7740/7660\r W\r R,46\r O,35 \r 0374/7200\r W\r R,47\r O,326 \r 7041/5342\n 7100/7141\r O,340\r 1411/5741\n 7041/5524\n 7100/7440\n 1410/5327\n 7640/5765\n 7420/7670\r 0,365 \r 0000/5537(DR) 0,367 \r 1401/1201\r W\r R,50\r O,124\r 0000/7320\n 0000/1411\n 0000/7440\n 0000/7041\n 0000/3013\n 0000/1410\n 0000/7450\n 0000/7020\n 0000/1013\n 0000/5736\n 0000/5345\n 0000/2010\n 0000/2010\n 0000/5742\n 0000/5355\n W\r ? # (Question mark, if output by EPIC here, may be ignored) \c |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # Supersedes article dated March 1978 # # LQP01 HANDLER FAILS TO RECOGNIZE TABS (SPR 8-2441 JM) # # The LQP.BN handler as distributed does not recognize the TABS character. Any # listing or text that uses TABS will not be printed correctly. # # The method to patch this problem is through the BUILD procedure. This will # fix this problem and maintain the correct version in the saved copy of BUILD. # This is done as follows: .R BUILD LOAD DSK:LQP.BN # (OR DEVICE THAT DISTRIBUTED LQP.BN IS ON) $ALTER LQP,324=7640 $BOOT .SAVE SYS BUILD # This patch corrects this problem and upgrades the LQP.BN to VB. |
> > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # IN MACREL V1C, SECT LENGTHS ARE WRONG FOR SECTS WHICH CONTAIN RELOC # STATEMENTS AND CURRENT PAGE LITERALS. THE FOLLOWING PATCH CORRECTS # THIS PROBLEM AND UPGRADES MACREL TO VlD. .GET SYS:MACREL .ODT 305/3303 5325 320/4772 5772 372/5546 5547 322/3036 1044;1106;5721 356/1044 4321 363/1044 4321 5455/0000 303 5546/0000 364 5552/5746 5356 5555/1044 5762;1655;3036;1655;5746;363 325/0000 1106;3303;5306 13136/0303 304 \c .SAVE SYS:MACREL |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | # PATCH VIE TO MACREL (SR) # THIS PATCH FIXES THE FOLLOWING BUGS: # 1. THE 'DEVICE' DIRECTIVE SOMETIMES PRODUCES RELOCATABLE TEXT. THE # TEXT PRODUCED SHOULD ALWAYS BE ABSOLUTE. # 2. AN UNKNOWN KEYWORD AFTER A .LIST DIRECTIVE FAILS TO PRODUCE THE # ERROR MESSAGE: "UNKNOWN LIST CONDITION". # 3. > AT THE END OF A DECLARATION CAUSES AN ERRONEOUS ERROR MESSAGE TO # BE PRINTED. # 4. CERTAIN DIRECTIVES DO NOT PRINT IN THE LISTING WHEN THEY CONTAIN A # SYNTACTIC ERROR. # 5. DATES LATER THAN DECEMBER 31, 1977 DO NOT PRINT CORRECTLY IN THE # HEADER LINE. # 6. THE THIRD CHARACTER IN OS/8 TEXT PACKING IS COMING OUT AS THE FIRST # CHARACTER OF THE TRIPLE. # 7. EVERY THIRD CHARACTER IN OS/8 TEXT PACKING IS IGNORING THE # 7BIT/8BIT ENABLE CONDITION. # THIS PATCH UPGRADES MACREL TO VIE. # .GET SYS:MACOVR .ODT 11531/1033 5345 11545/xxxx 3030;1033;5332 12541/xxxx 1026;1347;7650;5763;1026;5740;7702 12637/1026 4763 12763/xxxx 2140 10763/1302 1333 10553/7775 7774 10751/7006 0173;4767 10767/5762 2156 10557/1137 7440;1764;7006;7006;5756;2332 \c .SAVE SYS:MACOVR .GET SYS:MACREL .ODT 13136/0304 305 0242/5566 5301 7220/0177 4621;2112 2113/xxxx 0177;3725;1726;7012;7012;0327;1725;3725;2312;5712;7342;7777;30 \c .SAVE SYS:MACREL .GET SYS:MACERR .ODT 21335/5544 5542 \c .SAVE SYS:MACERR |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # Problem: New files created by MCPIP on a magtape or cassette after # January 1, 1978 will be entered with the wrong creation date. # (New files created on other devices will have their dates correct.) # MCPIP fails to look at the date extension bits when writing a magtape # or cassette header record. # # The following patch fixes this problem and upgrades MCPIP to V6B: .GET SYS MCPIP .ODT 14031/ 6601 6602 07464/ 1360 5342 07542/ xxxx 3302;4747;1302;1360;5265;6137 06140/ xxxx 1745;7012;7012;0346;5737;7777;0030 \c .SAVE SYS MCPIP |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # MSBAT V3A SEQ. 31.22.1 M # DIM STATEMENT NOT WORKING IN MSBAT (SR) # PROBLEM: # MSBAT V3A is converting a 'DIM' punch in a mark sense # card into a dimension statement. This statement is not # recognized by BASIC. # DIAGNOSOS: # The punch should be translated to 'DIM', not # 'DIMENSION'. # SOLUTION: # Apply the following patch: .GET SYS:MSBAT .ODT 4015/1505 1500 3671/6301 6302 \c .SAVE SYS:MSBAT # This patch upgrades MSBAT to V3B. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | PATCH V1B TO OVRDRV.MA (ES) THE FOLLOWING IS A SOURCE COMPARE OF THE DISTRIBUTED OVERLAY-DRIVER (OVRDRV.MA) VERSES THE CHANGES NECESSARY TO MAKE IT COMPATIBLE WITH THE BUG FIXES CORRECTED IN PATCH IE OF LINK.SV. THE CHANGES TO OVRDRV.MA ONLY HAVE TO BE MADE IF YOU ARE USING THE LINK OVERLAY STRUCTURE. SRCCOM V4A 1) /OVRDRV - OVERLAY DRIVER 2) /OVRDRV - OVERLAY DRIVER 1)001 /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION 1) / **** 2)001 /COPYRIGHT (C) 1977,1978 BY DIGITAL EQUIPMENT CORPORATION 2) / ******** 1)002 /VIA 1) /THIS SECT IS TWO LOCATIONS AND CONTAINS THE TRANSFER VECTOR TO SWAPER **** 2)002 /V1B 2) /THIS SECT IS TWO LOCATIONS AND CONTAINS THE TRANSFER VECTOR TO SWAPER ******** 1)002 SWAP, 6101 /VERSION NUMBER 1) DCA AC /SAVE CALLING AC **** 2*002 SWAP, 6102 /VERSION NUMBER 2) DCA AC /SAVE CALLING AC ******** 1)003 ISZ TEMP /TIMES (THE NUMBER OF THE OVERLAY) 1) JMP .-2 1) LOAD2, TAD I RELBLK /PLUS (RELATIVE BLOCK OF LEVEL) **** 2)003 JMP I .+1 /TIMES (THE NUMBER OF THE OVERLAY) 2) PATCH 2) LOAD2, TAD I RELBLK /PLUS (RELATIVE BLOCK OF LEVEL) ******** 1)003 RTR /POSITION 1)004 TAD I LENGTH /GET LENGTH 1) RTR 1) RTR 1) RTR 1) DCA REDCNT /FORM CONTROL WORD **** 2)003 RAR /POSITION 2)004 TAD I LENGTH /GET LENGTH 2) RTL 2) RTL 2) RTL 2) DCA REDCNT /FORM CONTROL WORD ******** 1)006 /THIS AREA CONTAINS OVERLAY DATA FOR MAIN AND THE 7 LEVELS **** 2)006 /PATCH TO FIX BLOCK POSITION CALCULATION 2) PATCH, IAC /CONVERT PAGES TO BLOCKS 2) CLL RAF 2) DCA PTEMP 2) TAD PTEMP /MULTIPLY BLOCK LENGTH 2) ISZ I PPNT /BY OVEFLAY NUMBER 2) JMP .-2 2) JMP I .+1 2) LOAD 2 2) PPNT, TEMP 2) PTEMP, 0 2) /THIS AREA CONTAINS OVERLAY DATA FOR MAIN AND THE 7 LEVELS ******** |
> > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # PAL8 V10A Seq 21. 22. 1 M # INCORRECT CORE SIZE ROUTINE (SR) # Problem: PALS's core size routine fails on certain machines such as # an 8K PDP-8L. # Diagnosis: There was no room in PAL8 for the standard size routine. # The routine used by PAL8 includes a typo. # TAD I (FLD4 should read TAD I FLD4 and, # DCA I (FLD4 should read DCA I FLD4. # Solution: Apply the following patch: .GET SYS:PAL8 .ODT 5675/3755 3715 5677/1755 1715 1533/0301 302 \c .SAVE SYS:PAL8 # This patch upgrades PAL8 to V10B. |
> > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # PAL8 V10B Seq 21. 22. 2 M # ERRONEOUS LINK GENERATION NOTED ON PAGE DIRECTIVE (SR) # Problem: # An apostrophe (') is sometimes printed to the right of # the binary column on the listing line for a PAGE # directive (pseudo-op). Such a symbol is meaningless # in this case. # Diagnosis: # This occurs if the previous line had a link generated # in it. The PAGE directive code fails to reset the # links generated flag (LININD). # Cure: # Install the following patch which upgrades PAL8 to V10C: .GET SYS:PAL8 .ODT 0463/5550 5367 0567/xxxx 3070;5550 1533/0302 0303 \c .SAVE SYS PAL8 |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # EXPUNGE PATCH TO PAL8 (DBB) # # Problem: A symbol definition following an EXPUNGE directive causes a # symbol table exceeded (SE) error in some cases. # # Diagnosis: The EXPUNGE directive code in PAL8 improperly counts the # number of symbols that it deletes from the symbol table. # # Solution: Install the following patch which upgrades PAL8 to V10D. .GET SYS PAL8 .ODT 1471/4572 5373;7106;7650;5307 1573/xxxx 4572;1020;5272 1533/0303 0304 \c .SAVE SYS PAL8 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # Supersedes article dated June/July 1980 # TABS ARE TRANSLATED INCORRECTLY (KW) # # Problem: Tabs following a label (PAL8) that are 6 characters long # are translated into spaces incorrectly. # # Diagnosis: This problem is evident only when CREF listings are # requested during a PAL8 assembly. # # Solution: The following optional patch will correct this problem, # improving the appearance of CREF output listings. Since # this patch is optional, no change has been made to the # version number of PAL8.SV. .R FUTIL SET DEV SYS SET MODE SAVE FILE PAL8.SV 1363/7440 5764 1364/4527 4321 4321/XXXX 7200 4322/XXXX 1363 4323/XXXX 4762 4324/XXXX 7200 4325/XXXX 4761 4326/XXXX 5760 4360/XXXX 1372 4361/XXXX 0735 4362/XXXX 1000 4363/XXXX 0211 WRITE EXIT |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # PIP /Y OPTION DOES NOT WORK PROPERLY WHEN TRANSFERRING A SYSTEM HEAD FROM A # DEVICE WHICH IS NOT CO-RESIDENT WITH SYS. (ES) # Problem: PIP /Y option always reads absolute block 7 of the input devices # even if the input is from a file. # The following patch: # 1) Fixes /Y problems in PIP # 2) Adds RL01 Disk to PIP device tables # 3) Upgrades patch level to V12B (from V11A - an incorrect revision code) .GET SYS PIP .ODT 13626/0000 17 13631/0000 4027 16012/1373 7001 16051/4764 7410 16112/3400 1600 16134/3243 7200 16151/7400 5600 16152/0016 0007 16153/7774 7770 16167/6254 6210 16210/1377 3032 16211/3020 1766 16212/1376 3024 16213/3344 5763 16622/6161 6162 16623/0100 0200 \c .SAVE SYS PIP |
> > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | PIP10 V3A Seq 21.24.1 M Supersedes article dated Dec 78/Jan 79 DATE '78 PATCH TO PIP10 (RY) Problem: When PIP10 creates a new file on a PDP-10 DECtape, the file gets the wrong date. Diagnois: PIP10 does not understand about the new OS/8 extended date bits for today's date. Cure: Install the following patch which fixes this problem until 1984. .GET SYS:PIP10 .ODT 2612/1023 4760;1116 2760/nnnn 1554 1555/nnnn 1765;0176;7112;7012;3116;1023;0156;5754;7777 4320/6301 6302 \c .SAVE SYS:PIP10 # This patch corrects the above problem and upgrades PIP10 to # V3B. # This article replaces and supercedes the same sequence number # published in the Dec 78-Jan 79 DSN. |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # SABR V18A Seq 21.91.1 M # LINE BUFFER PROBLEM IN SABR (DBB) # Problem: When a SABR input line generates code across a page boundary, # SABR puts out an altered version of the line next to the code # at the beginning of the next page in the listing file. # Diagnosis: The routine to enable the buffer to be placed in the listing # file is in error. # Solution: Install the following patch. .GET SYS SABR .ODT 14755/6201 1362;5757;5375;3362;5754 15375/0000 6201;5777;6173; 16173/0000 3777;6211;5776;4760;1646 17033/7001 7002 \c .SAVE SYS SABR # The underlined text is computer generated. This patch # corrects the problem and upgrades SABR to Version 18B. |
> > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # The commands SET TTY SCOPE and SET SYS INIT # ruin systems which use a 2-page system # handler. # SET modifies block 0 of the system device to # handle these commands. However, in the case # of two-page system handlers, the correct # image is stored in block 66 instead. # Install the following patch which creates # once-only code in SET VlB to check for a # 2-page system handler and modify itself # accordingly. .GET SYS:SET .ODT 0507/6102 6103 0240/5632 5357 0357/xxxx 1765;1366;7650;4767;3362;5632;7612;7775;4400 4401/0000 1207;3460;2202;2210;5201;5600;0066;7774 0060/xxxx 0713;0725;3444;3453 \c .SAVE SYS:SET |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # If SET is run directly ( .R SET) and TTY SCOPE # had previously been SET, then rubouts to a SET # command fail to properly erase characters from # the screen. # The scope rubout code is failing to send the # initial backspace character to the display # terminal. # Install the following patch to SET VIC: # This patch upgrades SET to VlD. .GET SYS:SET .ODT 0507/6103 6104 2337/5274 5370 2370/xxxx 1056;7650;5274;5271 \c .SAVE SYS:SET |
> > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # SET VlD # Seq 21. 26. 3 M # 1 of 1 # PARSING OF - IN TTY WIDTH OPTION (SR) # Problem: The valid command SET TTY WIDTH=80 results in a syntax error # Diagnosis: The code that checks for an optional equals sign is failing to # advance the character scan pointer. # Solution: Install the following patch: .GET SYS:SET .ODT 5763/5754 4564;7200;5754 0507/6104 6105 \c .SAVE SYS:SET # This patch upgrades SET to Version VIE. In both the commands # SET TTY WIDTH=n # and # SET CDR CODE=02x # the equals sign is optional, and may be replaced by one or more spaces. # If the equals sign is specified, it may also be optionally preceded or # followed by spaces. |
> > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # In OS/8 TECO VS, the default value for the EU flag is 0 # (unless .SET TTY SCOPE has been specified to the KBM # in which case the default value is -1). # # Users who wish to permanently change the default value to be -1 # (no case flagging) may install the following patch: .GET SYS TECO .ODT 4576/ 0000 7777 2245/ 7650 7200 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # CHANGING THE DEFAULT EH VALUE for one-line error printouts. # # In OS/8 TECO V5, as on the PDP-10 and PDP-11, the default value of the # EH flag is 0, which is the same as 2. This value causes the one-line # form of an error message to print upon encountering an error. # This could be annoying to experienced users with slow terminals. # Naturally, you can change this at run-time by executing the # 1EH command which causes only the 3-character error message cod # to print thereafter. # # Users who wish to cause the default value of the EH flag # to be permanently set to 1, can install the following patch: .GET SYS TECO .ODT 4572/0000 1 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # REMOVING YANK PROTECTION (SR) # # Probably the most common way to lose data in TECO is to accidentally # type 'Y' when you meant to type 'T'. OS/8 TECO VS has included # what is known as Yank protection. Yank protection causes the error message # # ?YCA Y Command Aborted # # to be produced any time that the following 3 conditions are met: # (a) The current command is Y or # (b) There is text in the text buffer # (c) There is an output file open. # # If all these conditions are met, it is presumed that you are about # to lose some important data, and so the command is rejected. # Note that the Yank is always legal if the text buffer is empty # or if no output file is open. If you really want to do the Yank, # you can always type HKY, a command which will always succeed. # # Users who do not wish to have Yank protection can patch it out of TECO # by installiing the following patch: .GET SYS TECO .ODT 2032/ 7640 7610 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # SCOPE SUPPORT FOR VT05 USERS # # Version 5 of TECO supports scope terminals (such as VT50, VT52, VT78, etc.) # by sending appropriate escape sequences to the terminal. # For example, when typing the immediate mode command ^U during a multi-line # command string, TECO will physically erase the current line from the screen. # This support will not work properly on terminals which do not support these # escape sequences. # # For our users with VT05's, we offer the following patch which will # permit TECO to work properly on a VT05 terminal: .GET SYS TECO .ODT 2771/ 4552 7200 1446/ 0101 0032 1437/ 0113 0036 5405/ 0113 0036 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # PROBLEM WITH AY COMMAND (SR) # # Problem: On rare occasions, the Y command will fail, giving the error message # # ?NAY Numeric Argument with Y # # even though no numeric argument was specified. # For example, the AY command (Append then Yank) consistently fails in this manner. # The test for a numeric argument is incorrect. # The following patch corrects this problem and upgrades TECO to 5A: .GET SYS TECO .ODT 2022/ 1024 2024;7610 4573/ 0005 0765 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # CONDITIONALS INSIDE ITERATIONS # # Problem: TECO does not properly handle unsatisfied conditionals # if other conditionals are encountered within an inner iteration # while scanning for the terminating single quote. # # While scanning for the matching single quote, TECO keeps an iteration count # for each level of nested iterations which it finds. # TECO then ignores any single quotes which occur at a 'nest' level greater than 0. # (All conditionals must end at the same macro level that they begin.) # The problem is that TECO incorrectly bumps the conditional count # whenever it sees a double quote. # This should not be done for double quotes occurring at a non-zero level. # # The following patch fixes this problem by causing TECO to # ignore double quotes within iterations while scanning for # a terminating single quote. This ?atch upgrades TECO to VSB: .GET SYS TECO .ODT 6077/ 7240 5356 6156/ xxxx 7200;1763;7650;7240;5300;3331 4573/ 0765 0766 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # ECHOING OF WARNING BELLS (SR) # # Problem: When typing in command characters to TECO, # if you come within 10 characters of running out of memory, TECO warns you by # ringing the terminal bell after each character input. # (This gives you a small margin in which to clean up your command, # e.g. by typing two altmodes.) # Should you persist in typing after the ten warnings, # upon typing the 11th character, TECO prints the error message # # ?QMO Q-Register Memory Overflow. # # This mechanism works correctly except that the ringing of the bell # is accompanied by the printing of the (unwanted) two-character sequence "^G". # TECO is ringing the bell by calling TYPTCV instead of TPUT. # # The following patch corrects this problem, by causing # only a warning bell to ring. This patch upgrades TECO to V5C. .GET SYS TECO .ODT 0365/ 4521 4552 4573/ 0766 0767 \c .SAVE SYS TECO |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | # CTRL/U SOMETIMES FAILS AFTER * (SR) # PROBLEMS: # (I) If a command line contains the character '*', then a subsequent # use of the immediate mode command, ^U, will reprint the entire # command string as well as erasing the current line. (This will # not hurt you - but it is annoying.) # (II) If on a scope terminal, a command line contains the character # '*', then rubbing out a tab, line feed, vertical tab, or form # feed will cause the entire command string to be reprinted. # (III) The bell-space and bell-star (^G<space> and ^G* ) commands were # not documented because they did not work properly. # The immediate mode command, ^G<space> causes the current line of # the commmand string to be retyped. # The immediate mode command, ^G* causes the entire command string # to be retyped. # Note that the ^G (bell) character cannot be entered in up-arrow # mode. # (IV) The ^G* command incorrectly prints out the contents of all your # Q-Pegisters. # (V) When in scope mode, if you rub-out back to the first line of the # command string, and if there is text in some Q-register, the '*' # representing TECO's last prompt vanishes from the screen. # (VI) The ^G<space> command works improperly on 12K machines when # there are more than 2900 characters stored away in Q-registers. # ANALYSIS: # Poltergeists in TECO. # DISPOSITION: # The following patch fixes all these bugs in TECO. It also makes # the ^G<space> and ^G* commands work properly. This patch # upgrades TECO to version 5.04. .GET SYS:TECO .ODT 1341/1435 1464;1464 1431/5235 5264 1435/4265 7510;5313;1072;5304 1500/7240 1072;7040;1050;5235 1463/4265 5266;1175;3331 1524/1175 6032;5775;1175;5253 4570/1454 1526 0255/5772 5004 0004/xxxx 1577;4540;5407;1464 4573/0767 0770 \c .SAVE SYS:TECO |
> > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # TECO computes the product n*0 incorrectly. # Complementing a 13-bit 0 sets the link. # TECO fails to account for this. # The following patch to TECO V5.04 fixes this bug by # zeroing the link before starting the multiply. # This patch upgrades TECO to V5.05 # Just as in V3C TECO (Version 4), multiplication by # negative numbers is not supported and unpredictable # results will occur if a multiplicand is less than 0 .GET SYS:TECO .ODT 1311/7010 7110 4573/0770 0771 \c .SAVE SYS:TECO |
> > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Q-REGISTERS DON'T WORK IN 8K (SR) # TECO doesn't work properly on 8K machines. # The code which changes the handling of Q-register # storage in the 8K case is faulty. # This patch upgrades TECO to Version 5.06. .GET SYS:TECO .ODT 5762/0122 7777 5771/xxxx 122;127;102;107;7777 5710/3362 3371;24 # Correction: Original patch had version change wrong. 4573/0771 772 \c .SAVE SYS:TECO |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # CAN'T SKIP OVER A "W" (SR) # PROBLEM: # If the letter w (as in PW) occurs inside a piece of # TECO code which is being skipped (say because it is # part of an unsatisfied conditional), TECO V5.06 # will blow up. # DIAGNOSIS: # The appropriate skip table does not end with the # required negative number. This table flows into # the skip table for skipping the second letter of an # E command (R, w, B, or G). The corresponding # entries in the dispatch table are all harmless # (positive) except for 'W' which causes SORT to # branch to 'death'. # SOLUTION: # The following patch inserts a -1 indicator to # properly terminate the table: # This patch upgrades TECO to V5.07. .GET SYS:TECO .ODT 5264/7240 1360 5461/7346 7344 6250/7346 7344 # Correction: original patch had version wrong. 4573/0772 0773 5227/1760 1642 5242/6201 7777 5360/7777 7776 5331/5266 5264 \c .SAVE SYS:TECO |
> > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # UNSPECIFIED ITERATIONS AFTER INSERTS (SR) # Problem: # If an iteration has no iteration count specified, and the # previous command was "on insert, then the iteration is # skipped. For example, the command IA$<L> will not work # properly. # Diagnosis: # The insert code destructively tests the number flag (NFLG) # and if it was 0, sets it to a 1. It is never reset to 0. # The iteration code sees a 1 and thinks a number is # present. Looking for one, it finds 0 and thinks the # iteration count is 0 meaning skip this iteration. # Cure: # The insert code should reset (zero) the number flag. This # was not a problem in TECO V4 because 0<> was the same as # <> then. Apply the following patch (which upgrades TECO # to version 5.08): .GET SYS:TECO .ODT 2616/6032 5776;3167 2674/5565 5617 4573/0773 0774 \c .SAVE SYS:TECO |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | # Most of these patches have been verified # by reading the source code. # The patches that remain commented out are not recommended # and the reason why appears in the line above it. # # ABSLDR-21.29.1M is against v6A but we have v4A. # v6A came with OS/8 Devices Extension kit QF026 # Binary DECtape: AL-H525A-BA, Source not on DECtape # DO NOT APPLY THIS PATCH. ## ABSLDR-21.29.1M-v6C.patch8 BASIC.UF-31.5.1M-V5B.patch8 BATCH-31.23.1M-v7B.patch8 BLOAD-31.10.1M-v5B.patch8 BRTS-31.11.1M-v5B.patch8 # BRTS 31.11.2O disables 8th bit parity. Recommended. BRTS-31.11.2-O.patch8 # BRTS 31.11.3O enables 132 column output. Recommended. BRTS-31.11.3-O.patch8 BRTS-31.11.5-x.patch8 CREF-21.15.1M-v5B.patch8 CREF-21.15.2M-v5C.patch8 EDIT-21.17.1M-v12B.patch8 EDIT-21.17.2M-v12C.patch8 EDIT-21.17.3M-v12D.patch8 # EDIT 21.17.4 overwrites patch in 21.17.2. DO NOT APPLY THIS PATCH # EDIT-21.17.4M-V12C.patch8 F4-21.1.2M-v4B.patch8 F4-51.3.1M-v4C.patch8 F4-51.3.2M-v4x.patch8 # FORLIB 51.10.1M is hard-coded into mkos8 to copy a new # FORLIB.RL made with instructions from the patch. # So the patch will not apply but is listed here for completeness. ## FORLIB-51.10.1M.patch8 FOTP-21.19.1M-V9B.patch8 # FRTS-51.3.3-O is to enable FRTS to work with 2-page system # handlers. I've read the code but do not fully understand it. # It is plausable that it generalizes on the code that makes # the 2-page TD8E handler work. But it could also be a # patch tha tONLY works with the OS/8 Devices Extension kit QF026. # We are enabling the patch for not. If further testing shows # that it breaks TD8E support, we will turn it off. FRTS-51.3.3-O.patch8 # The two FUTIL patches only get applied to FUTIL V7 which comes with # OS/8 V3D to bring it up to V7D. MACREL V2 comes with FUTIL V8B, so # these patches are skipped by mkos8 using an RE match on the file name # when the user does not pass --disable-os8-macrel to configure. FUTIL-31.21.1M-v7B.patch8 FUTIL-31.21.2M-v7D.patch8 # FUTIL 31.21.3O switches XS format. Recommend to leave it out. # FUTIL-31.21.3O.patch8 # LQP 21.49.1 consists of commands run in BUILD. # The auto-apply system won't apply it. # It has not been validated. It uses hardware we don't have. ## LQP-21.49.1M-vB.patch8 MCPIP-21.21M-v6B.patch8 MSBAT-31.22.1M-v3B.patch8 PAL8-21.22.1M-v10B.patch8 PAL8-21.22.2M-v10C.patch8 PAL8-21.22.3M-v10D.patch8 # PAL8 21.22.4M is for V12 PAL8. It BREAKS LS output in V10! # DO NOT APPLY THIS PATCH! # PAL8-21.22.4M.patch8 PIP-21.23.1M-v12B.patch8 PIP10-21.24.1M-v3B.patch8 SABR-21.91.1M-v18B.patch8 SET-21.26.1M-v1C.patch8 SET-21.26.2M-v1D.patch8 SET-21.26.3M-v1E.patch8 # TECO 31.20.1 Unconditional no case flagging. Not recommended # TECO-31.20.01O.patch8 # TECO 31.20.2 Turns off verbose errors. Not recommended. # TECO-31.20.02O.patch8 # TECO 31.20.3 Turns off Yank overwrite warning. Not recommended. # TECO-31.20.03O.patch8 # TECO 31.20.4 Special support for VT05. Not recommended. # TECO-31.20.04O.patch8 TECO-31.20.05M-v5A.patch8 TECO-31.20.06M-v5B.patch8 TECO-31.20.07M.v5C.patch8 TECO-31.20.08M-v5.04.patch8 TECO-31.20.10M-v5.05.patch8 TECO-31.20.11M-v5.06.patch8 TECO-31.20.12M-v5.07.patch8 TECO-31.20.13M-v5.08.patch8 # # MACREL, LINK, and OVDRV patches have not been validated. # The Version numbers don't all match. Some won't apply. # More work is needed before they are deemed safe. # NOT Recommended. ## MACREL-40.5.1M-v1D.patch8 ## MACREL-40.5.2M-v1E.patch8 ## LINK-40.2.1M-v1D.patch8 ## LINK-40.2.2M-v1E.patch8 ## LINK-40.2.3M-v1F.patch8 # OVRDRV 40.6.1 is a source level patch ## OVRDRV-40.6.1M-v1B-8srccom |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | format: tu56 inputs: src/advent/advent.ft src/advent/bug.ft src/advent/dumpdb.ft src/advent/getin.ft src/advent/initad.ft src/advent/io.ft src/advent/rnd.ft src/advent/rstrgm.ft src/advent/savegm.ft src/advent/yes.ft src/advent/a5toa1.ra src/advent/amain.ra src/advent/bitset.ra src/advent/carry.ra src/advent/drop.ra src/advent/dstroy.ra src/advent/getwrd.ra src/advent/juggle.ra src/advent/move.ra src/advent/pct.ra src/advent/pspeak.ra src/advent/put.ra src/advent/rspeak.ra src/advent/seed.ra src/advent/speak.ra src/advent/usr.ra src/advent/vocab.ra src/advent/advent.dc src/advent/advent.tx src/advent/compil.bi src/advent/load.bi outputs: DSK:<DTA1:ADVENT.DC DSK:<DTA1:ADVENT.TX DSK:<DTA1:ADVENT.LD # DSK:<DTA1:RUNAD.BI cleanups: DSK:ADVENT.IN DSK:ADVENT.DA DSK:AINDX.DA DSK:ATEXT.DA DSK:ASAVE.DA |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | format: tu56 inputs: src/basic-games/BINGO.BA src/basic-games/BLKJAC.BA src/basic-games/BLKJAK.BA src/basic-games/BUNNY.BA src/basic-games/CALNDR.BA src/basic-games/CHECKR.BA src/basic-games/CRAPS.BA src/basic-games/DICE.BA src/basic-games/FOOTBL.BA src/basic-games/FOTBAL.BA src/basic-games/GOLF.BA src/basic-games/HELLO.BA src/basic-games/HOCKEY.BA src/basic-games/KING.BA src/basic-games/LIFE.BA src/basic-games/LIFE2.BA src/basic-games/MONPLY.B1 src/basic-games/MONPLY.BA src/basic-games/POKER.BA src/basic-games/ROCKET.BA src/basic-games/ROCKT1.BA src/basic-games/ROULET.BA src/basic-games/SIGNS.BA src/basic-games/SNOOPY.BA src/basic-games/SPACWR.BA src/basic-games/TICTAC.BA src/basic-games/WAR.BA src/basic-games/WAR2.BA src/basic-games/WEKDAY.BA src/basic-games/WUMPUS.BA src/basic-games/YAHTZE.BA src/basic-games/YAHTZE.IN outputs: DSK:<DTA1:BINGO.BA DSK:<DTA1:BLKJAC.BA DSK:<DTA1:BLKJAK.BA DSK:<DTA1:BUNNY.BA DSK:<DTA1:CALNDR.BA DSK:<DTA1:CHECKR.BA DSK:<DTA1:CRAPS.BA DSK:<DTA1:DICE.BA DSK:<DTA1:FOOTBL.BA DSK:<DTA1:FOTBAL.BA DSK:<DTA1:GOLF.BA DSK:<DTA1:HELLO.BA DSK:<DTA1:HOCKEY.BA DSK:<DTA1:KING.BA DSK:<DTA1:LIFE.BA DSK:<DTA1:LIFE2.BA DSK:<DTA1:MONPLY.B1 DSK:<DTA1:MONPLY.BA DSK:<DTA1:POKER.BA DSK:<DTA1:ROCKET.BA DSK:<DTA1:ROCKT1.BA DSK:<DTA1:ROULET.BA DSK:<DTA1:SIGNS.BA DSK:<DTA1:SNOOPY.BA DSK:<DTA1:SPACWR.BA DSK:<DTA1:TICTAC.BA DSK:<DTA1:WAR.BA DSK:<DTA1:WAR2.BA DSK:<DTA1:WEKDAY.BA DSK:<DTA1:WUMPUS.BA DSK:<DTA1:YAHTZE.BA DSK:<DTA1:YAHTZE.IN build: # Force creation of a new .tu56 image every time. rm -f bin/basic-games.tu56 bin/os8-cp -v -dt1 bin/basic-games.tu56 -a src/basic-games/*.BA DTA1: bin/os8-cp -dt1 bin/basic-games.tu56 -a src/basic-games/MONPLY.B1 DTA1: bin/os8-cp -dt1 bin/basic-games.tu56 -a src/basic-games/YAHTZE.IN DTA1: |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | format: tu56 inputs: obj/cc8/os8/libc.sb obj/cc8/os8/c8.sb obj/cc8/os8/n8.sb obj/cc8/os8/p8.sb src/cc8/os8/header.sb src/cc8/os8/ctbl.tx obj/cc8/os8/calc.c obj/cc8/os8/fib.c obj/cc8/os8/forth.c obj/cc8/os8/hlb.c obj/cc8/os8/pd.c obj/cc8/os8/ps.c outputs: SYS:<DTA1:CC.SV SYS:<DTA1:CC1.SV SYS:<DTA1:CC2.SV DSK:<DTA1:HEADER.SB DSK:<DTA1:CTBL.TX DSK:<DTA1:CCR.BI DSK:<DTA1:LIBC.RL DSK:<DTA1:CALC.C DSK:<DTA1:FIB.C DSK:<DTA1:FORTH.C DSK:<DTA1:HLB.C DSK:<DTA1:PD.C DSK:<DTA1:PS.C |
> > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 | format: tu56 inputs: src/chekmo/CHEKMO.PA src/chekmo/CHEKMO.TX outputs: SYS:<DTA1:CHEKMO.SV DSK:<DTA1:CHEKMO.TX |
> > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 | format: tu56 inputs: src/dcp/DCP.WU src/dcp/DCP16.BN src/dcp/DCP24.BN outputs: DSK:<DTA1:DCP.WU SYS:<DTA1:DCP16.SV SYS:<DTA1:DCP24.SV |
> > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | format: tu56 inputs: src/e8/AUTHORS.md doc/e8-manual.md doc/e8-manual-pdf.css doc/graphics/e8-buffer.svg src/e8/README.TX src/e8/e8cmds.tx src/e8/e8srch.tx src/e8/e8defs.pa src/e8/e8base.pa src/e8/e8file.pa outputs: SYS:<DTA1:E8.SV DSK:<DTA1:E8CMDS.TX DSK:<DTA1:E8SRCH.TX # build: # bin/os8-run scripts/misc/e8-tu56.os8 |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | format: tu56 inputs: src/focal69/FLOAT.ZZM src/focal69/FOCAL.ZZM src/focal69/overlays/4KVT.PA src/focal69/overlays/4WORD.BN src/focal69/overlays/8KVT.PA src/focal69/overlays/VTRUB.PA outputs: DSK:<DTA1:FOCAL.BN DSK:<DTA1:8KNOVT.BN DSK:<DTA1:8KVT.BN DSK:<DTA1:4KVT.BN DSK:<DTA1:4WORD.BN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | # Kermit-12 Package File format: rk05 inputs: src/kermit-12/k12clr.pal src/kermit-12/k12crf.boo src/kermit-12/k12crf.enc src/kermit-12/k12deb.pal src/kermit-12/k12dec.pal src/kermit-12/k12enb.pal src/kermit-12/k12enc.doc src/kermit-12/k12enc.pal src/kermit-12/k12fl0.ipl src/kermit-12/k12fl1.ipl src/kermit-12/k12glb.boo src/kermit-12/k12glb.enc src/kermit-12/k12ip0.odt src/kermit-12/k12ip1.odt src/kermit-12/k12ipg.pal src/kermit-12/k12ipl.doc src/kermit-12/k12ipl.pal src/kermit-12/k12mit.ann src/kermit-12/k12mit.boo src/kermit-12/k12mit.bwr src/kermit-12/k12mit.doc src/kermit-12/k12mit.dsk src/kermit-12/k12mit.enc src/kermit-12/k12mit.lst src/kermit-12/k12mit.not src/kermit-12/k12mit.pal src/kermit-12/k12mit.upd src/kermit-12/k12pch.pal src/kermit-12/k12pl8.boo src/kermit-12/k12pl8.enc src/kermit-12/k12prm.pal outputs: SYS:<RKA1:K12MIT.SV SYS:<RKA1:ENBOO.SV SYS:<RKA1:DEBOO.SV SYS:<RKA1:ENCODE.SV SYS:<RKA1:DECODE.SV DSK:<RKA1:K12CLR.BN DSK:<RKA1:IPLGEN.BN DSK:<RKA1:PARAM.PA DSK:<RKA1:IPL.PA DSK:<RKA1:K12PCH.PA |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | format: tu56 inputs: src/music/1TNSLD.MU src/music/BABYEL.MU src/music/ENTER.MU src/music/FIFTH1.MU src/music/FIFTH3.MU src/music/FUGUE.MU src/music/GMINOR.MU src/music/INV201.MU src/music/INV204.MU src/music/INV208.MU src/music/INV210.MU src/music/INV212.MU src/music/INV213.MU src/music/INV214.MU src/music/INV315.MU src/music/JCOOK1.MU src/music/JCOOK2.MU src/music/LUVWIL.MU src/music/MAPLE.MU src/music/MINUET.MU src/music/MINUTE.MU src/music/MUSIC.PA src/music/MUSIC1.MU src/music/MUSIC2.MU src/music/MUSIC3.MU src/music/MUSIC4.MU src/music/MUSIC5.MU src/music/MUSIC6.MU src/music/PLAYOV.PA src/music/USA.MU src/music/YANKEE.MU outputs: DSK:<DTA1:1TNSLD.MU DSK:<DTA1:BABYEL.MU DSK:<DTA1:ENTER.MU DSK:<DTA1:FIFTH1.MU DSK:<DTA1:FIFTH3.MU DSK:<DTA1:FUGUE.MU DSK:<DTA1:GMINOR.MU DSK:<DTA1:INV201.MU DSK:<DTA1:INV204.MU DSK:<DTA1:INV208.MU DSK:<DTA1:INV210.MU DSK:<DTA1:INV212.MU DSK:<DTA1:INV213.MU DSK:<DTA1:INV214.MU DSK:<DTA1:INV315.MU DSK:<DTA1:JCOOK1.MU DSK:<DTA1:JCOOK2.MU DSK:<DTA1:LUVWIL.MU DSK:<DTA1:MAPLE.MU DSK:<DTA1:MINUET.MU DSK:<DTA1:MINUTE.MU DSK:<DTA1:MUSIC.PA DSK:<DTA1:MUSIC1.MU DSK:<DTA1:MUSIC2.MU DSK:<DTA1:MUSIC3.MU DSK:<DTA1:MUSIC4.MU DSK:<DTA1:MUSIC5.MU DSK:<DTA1:MUSIC6.MU DSK:<DTA1:PLAYOV.PA DSK:<DTA1:USA.MU DSK:<DTA1:YANKEE.MU SYS:<DTA1:MUSIC.SV |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | # The complete UW Focal source, listing and binaries don't # fit in a tu56 image. So we use an rk05 image instead. format: rk05 inputs: # PAL Sources src/uwfocal/12KFNS.PA src/uwfocal/16KCPR.PA src/uwfocal/16KLIB.PA src/uwfocal/16KXII.PA src/uwfocal/16MPLT.PA src/uwfocal/32KXII.PA src/uwfocal/8XFIO.PA src/uwfocal/8XFPP.PA src/uwfocal/BSLASH.PA src/uwfocal/FCOM45.PA src/uwfocal/FCOM47.PA src/uwfocal/LPT8I.PA # Documentation src/uwfocal/CARD1.DA src/uwfocal/CARD2.DA src/uwfocal/CARD3.DA src/uwfocal/CARD4.DA src/uwfocal/ERRORS.FD src/uwfocal/NOTE1.TX src/uwfocal/NOTE2.TX src/uwfocal/HEADER.HL # Focal Compiled binary blobs. src/uwfocal/12DEMO.FC src/uwfocal/2NDEMO.FC src/uwfocal/AXIS.FC src/uwfocal/AXISET.FC src/uwfocal/CONVRT.FC src/uwfocal/CRSHAR.FC src/uwfocal/DATE.FC src/uwfocal/EIGVAL.FC src/uwfocal/EIGVEC.FC src/uwfocal/EVDEMO.FC src/uwfocal/FILNAM.FC src/uwfocal/HEADER.FC src/uwfocal/LOWPAS.FC src/uwfocal/LSTSQR.FC src/uwfocal/PLCARD.FC src/uwfocal/PLDEMO.FC src/uwfocal/PLOTER.FC src/uwfocal/SKETCH.FC src/uwfocal/SMSORT.FC src/uwfocal/UWFOCL.FC src/uwfocal/VUDEMO.FC src/uwfocal/XYAXIS.FC # Binary Blobs we don't yet build. # When we build them we delete them from here. src/uwfocal/16KXII.BN src/uwfocal/16MPLT.BN src/uwfocal/32KXII.BN src/uwfocal/BSLASH.BN src/uwfocal/F32K4E.SV src/uwfocal/FCOM45.BN src/uwfocal/FCOM47.BN src/uwfocal/LPT8I.BN src/uwfocal/SCROLL.SV # Patch src/uwfocal/eae-modeb-clear.patch8 outputs: DSK:<RKA1:CARD1.DA DSK:<RKA1:CARD2.DA DSK:<RKA1:CARD3.DA DSK:<RKA1:CARD4.DA DSK:<RKA1:ERRORS.FD # DSK:<RKA1:NOTE1.TX # DSK:<RKA1:NOTE2.TX DSK:<RKA1:HEADER.HL DSK:<RKA1:16KXII.BN DSK:<RKA1:16MPLT.BN DSK:<RKA1:32KXII.BN DSK:<RKA1:BSLASH.BN DSK:<RKA1:FCOM45.BN DSK:<RKA1:FCOM47.BN DSK:<RKA1:LPT8I.BN DSK:<RKA1:UWF16K.BN # SYS:<RKA1:F32K4E.SV # SYS:<RKA1:SCROLL.SV SYS:<RKA1:UWF16K.SV |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | format: tu56 inputs: src/vtedit/TECO.IN src/vtedit/VTEDIT.DC src/vtedit/VTEDIT.TE outputs: DSK:<DTA1:TECO.IN DSK:<DTA1:VTEDIT.DC DSK:<DTA1:VTEDIT.TE build: # Force creation of a new .tu56 image every time. rm -f bin/vtedit.tu56 bin/os8-cp -dt1 bin/vtedit.tu56 -a src/vtedit/VTEDIT.* DTA1: bin/os8-cp -dt1 bin/vtedit.tu56 -a src/vtedit/TECO.IN DTA1: |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | # os8-run Scripts This directory contains scripts to be run by the `os8-run` tool, which provides a rich language to automate actions of OS/8 under SIMH. See also the [os8-run documentation][os8-run-doc]. ## OS/8 Scripts The majority of these scripts are for building different distributions of OS/8 proper. | Name | Distribution |-------|----------- | `v3d` | OS/8 V3D | `v3f` | an unofficial V3D follow-on, never formally released as such by DEC | `ock` | the [OS/8 Combined Kit][ockdoc] (OCK), the last formal DEC release of OS/8 Some of these scripts’ outputs are based purely on the input source file contents, but some outputs vary based on [`configure --enable-os8-*` parameters][os8cfg]. The OS/8 build scripts are stored in subdirectories of `os8` by distribution name. The scripts are also classifiable into logical groupings: [os8cfg]: /doc/trunk/README.md#disable-os8 [ockdoc]: /doc/trunk/src/os8/ock/README.md ### Installed Image Creation These scripts create the primary OS/8 boot media, which are installed to `$prefix/share/media/os8`: | Script Name | Build Product | Function |-------------------|-----------------|---------------------------- | `all-tu56` | `v3[df]-*.tu56` | bootable OS/8 TU56 images | `v3d/dist-rk05` | `v3d-dist.rk05` | bootable OS/8 V3D on RK05 | `v3d/rk05` | `v3d.rk05` | `v3d-dist.rk05` with patches; default IF=0 boot option | `v3d/src-rk05` | `v3d-src.rk05` | combined OS/8 V3D source tape contents | `ock/dist-rk05` | `ock-dist.rk05` | OCK analogue to `v3d-dist.rk05` | `ock/rk05` | `ock.rk05` | OCK analogue to `v3d.rk05` It should be noted that the `-dist` images are also used as internal stable platforms to build other things atop, so their purpose blurs a bit with the images in the next section. ### Intermediate Image Creation Some of the above images are created in stages. The following scripts generally assemble OS/8 source files to produce intermediate images that are not installed: | Script Name | Build Product | Function |-------------------|------------------|------------------------ | `ock/cusps-build` | `ock-cusps.rk05` | Commonly Used System ProgramS (CUSPS) | `ock/bf2-build` | `ock-bf2.rk05` | BASIC and FORTRAN II | `ock/fiv-build` | `ock-fiv.rk05` | FORTRAN IV | `ock/sys-build` | `ock-sys.rk05` | SYSTEM | `v3f/control` | `v3f-made.rk05` | OS/8 V3F; input to `all-tu56` for `v3f-*.tu56` ### Utilities | Script Name | Function |-----------------|------------------------------------------- | v3d-reset-tc08 | Re-configure the IF=0 boot image to use TC08 DECtape instead of TD8E drivers | cusp-copyin | Included by `all-tu56` to copy CUSPS onto the TU56 image under construction ## Miscellaneous Scripts There are a few one-off scripts for building individual components of the software system in the `misc` subdirectory. Their purpose is meant to be obvious from their file name. ## Test Scripts There are a number of scripts meant for testing `os8-run` itself. These are in the `test` subdirectory: | Script Name | Function |-------------|------------------------------------------- | version | Test the `begin enabled version` functionality in `os8-run` | copy | Test the `cpto` and `cpfrom` os8-run commands. | err | Used to provoke errors in os8-run and test behavior. | restart | Test the `restart` os8-run command. | patch | Test the `patch` os8-run command. [os8-run-doc]: /doc/trunk/doc/os8-run.md ## License Copyright © 2016-2020 by Bill Cattey. This document is licensed under the terms of [the SIMH license][sl]. [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | # Common files to copy on any system DECtape we make # May contain version-specific blocks # Control: We default to v3d unless externally overridden to enable v3f enable v3d begin enabled v3f disable v3d end enabled v3f # First copy in the unconditional files. begin cdprog RKA0:FOTP.SV DTA0:<RKA0:FOTP.SV DTA0:<RKA0:DIRECT.SV DTA0:<RKA0:BOOT.SV DTA0:<RKA0:EDIT.SV DTA0:<RKA0:EPIC.SV DTA0:<RKA0:PIP.SV DTA0:<RKA0:SET.SV DTA0:<RKA0:FUTIL.SV DTA0:<RKA0:PAL8.SV DTA0:<RKA0:BITMAP.SV DTA0:<RKA0:CREF.SV DTA0:<RKA0:SRCCOM.SV DTA0:<RKA0:HELP.SV DTA0:<RKA0:HELP.HL DTA0:<RKA0:RXCOPY.SV DTA0:<RKA0:TECO.SV end cdprog RKA0:FOTP.SV # Judgment call: # Leaving out MCPIP.SV, PIP10.SV, CAMP.SV, RKLFMT.SV # Tape Specific: DTCOPY.SV, DTFRMT.SV, TDCOPY.SV, TDFRMT.SV # Never used: RKLFMT.SV # v3d copies in from SYS: a.k.a. RKA0: begin enabled v3d begin cdprog RKA0:FOTP.SV DTA0:<RKA0:ABSLDR.SV DTA0:<RKA0:CCL.SV DTA0:<RKA0:RESORC.SV DTA0:<RKA0:BATCH.SV DTA0:<RKA0:?CSYS.BI begin default basic DTA0:<RKA0:?CBAS.BI end default basic end cdprog RKA0:FOTP.SV end enabled v3d # v3f copies in from what's on the RKB1: built area. begin enabled v3f begin cdprog RKA0:FOTP.SV # We don't copy in ABSLDR, because the BUILD with new OS8 and CD # installs it. DTA0:<RKB1:CCL.SV DTA0:<RKB1:RESORC.SV DTA0:<RKB1:BATCH.SV DTA0:<RKA1:?CSYS.BI begin default basic DTA0:<RKA0:?CBAS.BI end default basic end cdprog RKA0:FOTP.SV end enabled v3f # Optional components # We will install FORTRAN II unless told not to. begin default fortran-ii begin cdprog RKA0:FOTP.SV DTA0:<RKA0:LOADER.SV DTA0:<RKA0:SABR.SV DTA0:<RKA0:FORT.SV DTA0:<RKA0:LIBSET.SV DTA0:<RKA0:LIB8.RL DTA0:<RKA0:IOH.RL DTA0:<RKA0:FLOAT.RL DTA0:<RKA0:UTILTY.RL DTA0:<RKA0:POWERS.RL DTA0:<RKA0:INTEGR.RL DTA0:<RKA0:IPOWRS.RL DTA0:<RKA0:SQRT.RL DTA0:<RKA0:TRIG.RL DTA0:<RKA0:ATAN.RL DTA0:<RKA0:RWTAPE.RL DTA0:<RKA0:IOPEN.RL end cdprog RKA0:FOTP.SV end default fortran-ii # We will install OS/8 BASIC unless told not to. begin default basic begin cdprog RKA0:FOTP.SV DTA0:<RKA0:BASIC.SV DTA0:<RKA0:BCOMP.SV DTA0:<RKA0:BLOAD.SV DTA0:<RKA0:BRTS.SV DTA0:<RKA0:BASIC.AF DTA0:<RKA0:BASIC.SF DTA0:<RKA0:BASIC.FF DTA0:<RKA0:BASIC.UF end cdprog RKA0:FOTP.SV end default basic |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | # Script to create the advent.tu56 image that hosts the # OS/8 Adventure, Version 2.4 packaged up by Rick Murphy. # See: http://www.rickmurphy.net/advent/ # Upstream is curated at: https://poetnerd.com/pdp8-alive/advent # We build with the OS8_TOOLTIME packs: v3d-patched.rk05 # If you want a debugging bulld rk05 left in place, comment out # the "enable production" line, and un-comment "enable debug". enable production # enable debug begin enabled production mount rk0 $os8mo/v3d-patched.rk05 required scratch end enabled production begin enabled debug copy $os8mo/v3d-patched.rk05 $os8mo/build_advent.rk05 mount rk0 $os8mo/build_advent.rk05 required end enabled debug mount dt0 $os8mo/advent.tu56 new boot rk0 os8 ZERO DTA0: # There is insufficient room on a tu56 image. # We will copy source into DSK: on the scratch OS8_TOOLTIME pack # that was just booted. # We build there, and copy the binaries out to advent.tu56 cpto $src/src/advent/a5toa1.ra DSK: cpto $src/src/advent/advent.ft DSK: cpto $src/src/advent/amain.ra DSK: cpto $src/src/advent/bitset.ra DSK: cpto $src/src/advent/bug.ft DSK: cpto $src/src/advent/carry.ra DSK: cpto $src/src/advent/drop.ra DSK: cpto $src/src/advent/dstroy.ra DSK: cpto $src/src/advent/getin.ft DSK: cpto $src/src/advent/getwrd.ra DSK: cpto $src/src/advent/initad.ft DSK: cpto $src/src/advent/io.ft DSK: cpto $src/src/advent/juggle.ra DSK: cpto $src/src/advent/move.ra DSK: cpto $src/src/advent/pct.ra DSK: cpto $src/src/advent/pspeak.ra DSK: cpto $src/src/advent/put.ra DSK: cpto $src/src/advent/rnd.ft DSK: cpto $src/src/advent/rspeak.ra DSK: cpto $src/src/advent/rstrgm.ft DSK: cpto $src/src/advent/savegm.ft DSK: cpto $src/src/advent/seed.ra DSK: cpto $src/src/advent/speak.ra DSK: cpto $src/src/advent/vocab.ra DSK: cpto $src/src/advent/usr.ra DSK: cpto $src/src/advent/yes.ft DSK: cpto $src/src/advent/advent.dc DSK: cpto $src/src/advent/advent.tx DSK: cpto $src/src/advent/compil.bi DSK: cpto $src/src/advent/load.bi DSK: cpto $src/src/advent/runad.bi DSK: os8 submit COMPIL os8 submit LOAD os8 COPY DTA0:<DSK:ADVENT.LD os8 COPY DTA0:<DSK:ADVENT.TX os8 COPY DTA0:<DSK:ADVENT.DC os8 COPY DTA0:<DSK:RUNAD.BI |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | # Script to create the cc8.tu56 image that hosts the # OS/8 Native C compiler. # We build with the OS8_TOOLTIME packs: v3d-patched.rk05 mount rk0 $os8mo/v3d-patched.rk05 required scratch mount dt0 $os8mo/cc8.tu56 new boot rk0 os8 ZERO DTA0: # Header .SB Assembler file used by compilations: # HEADER.SB # Modules : C source cross-compiled to .SB Assembler by cc8: # libc, c8, n8, p8 # Example Programs: # src/cc8/os8/*.c # Copy source files into DSK for use. cpto $src/src/cc8/os8/header.sb DSK: # Although ctbl is ASCII, it's one long line # PIP /A doesn't like that. But /I works. cpto $src/src/cc8/os8/ctbl.tx DSK: /I cpto $src/src/cc8/os8/ccr.bi DSK: cpto $obj/cc8/os8/libc.sb DSK: cpto $obj/cc8/os8/c8.sb DSK: cpto $obj/cc8/os8/n8.sb DSK: cpto $obj/cc8/os8/p8.sb DSK: # Assembly/Save phase taken from bldcc8.bi os8 COPY DTA0:<DSK:HEADER.SB os8 COPY DTA0:<DSK:CTBL.TX os8 COPY DTA0:<DSK:CCR.BI os8 COMP LIBC.SB # IMPORTANT! The starting block of where LIBC.RL is stored # Affects the contents of the resulting .SV files. # (I guess it's a file pointer that ends up in the .SV) # The location of the other input does not seem to matter. # (Perhaps it's the pointers to the LAST file linked.) # For this reason we copy LIBC.RL to our output tu56 image and # use it from there. os8 COPY DTA0:<LIBC.RL # Deleting it from DSK: is optional. This is a scratch image. # os8 DEL DSK:LIBC.RL # os8 SQUISH DSK:/O os8 COMP C8.SB begin cdprog SYS:LOADER C8,DTA0:LIBC/I/O end cdprog SYS:LOADER os8 SAVE DTA0 CC os8 COMP N8.SB begin cdprog SYS:LOADER N8,DTA0:LIBC/I/O end cdprog SYS:LOADER os8 SAVE DTA0 CC1 os8 COMP P8.SB begin cdprog SYS:LOADER P8,DTA0:LIBC/I/O end cdprog SYS:LOADER os8 SAVE DTA0 CC2 cpto $obj/cc8/os8/calc.c DTA0: cpto $obj/cc8/os8/fib.c DTA0: cpto $obj/cc8/os8/forth.c DTA0: cpto $obj/cc8/os8/hlb.c DTA0: cpto $obj/cc8/os8/pd.c DTA0: cpto $obj/cc8/os8/ps.c DTA0: |
> > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # Script to create the e8.tu56 image that hosts the # CHEKMO Chess playing program. # We build with the OS8_TOOLTIME packs: v3d-patched.rk05 mount rk0 $os8mo/v3d-patched.rk05 required scratch mount dt0 $os8mo/chekmo.tu56 new boot rk0 os8 ZERO DTA0: # Copy source and doc files into the tape image. cpto $src/src/chekmo/CHEKMO.TX DTA0:CHEKMO.TX cpto $src/src/chekmo/CHEKMO.PA DTA0:CHEKMO.PA pal8 CHEKMO.BN<DTA0:CHEKMO.PA os8 COPY DTA0:<CHEKMO.BN os8 LOAD CHEKMO.BN os8 SAVE DTA0:CHEKMO.SV;200 |
> > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # Script to create the dcp.tu56 image that hosts the # DCP Disassembler # We build with the OS8_TOOLTIME packs: v3d-patched.rk05 mount rk0 $os8mo/v3d-patched.rk05 required scratch mount dt0 $os8mo/dcp.tu56 new boot rk0 os8 ZERO DTA0: # Copy source and doc files into the tape image. cpto $src/src/dcp/DCP.WU DTA0: cpto $src/src/dcp/DCP16.BN DTA0: /I cpto $src/src/dcp/DCP24.BN DTA0: /I os8 LOAD DTA0:DCP16.BN os8 SAVE DTA0:DCP16.SV os8 LOAD DTA0:DCP24.BN os8 SAVE DTA0:DCP24.SV |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # Script to create the e8.tu56 image that hosts the # Emacs-like editor e8 by Bill Silver. # We build with the OS8_TOOLTIME packs: v3d-patched.rk05 mount rk0 $os8mo/v3d-patched.rk05 required scratch mount dt0 $os8mo/e8.tu56 new boot rk0 os8 ZERO DTA0: # Copy source and doc files into the tape image. cpto $src/src/e8/AUTHORS.md DTA0:AUTHOR.MD cpto $src/doc/e8-manual.md DTA0:E8MANU.MD /I cpto $src/doc/graphics/e8-buffer.svg DTA0:BUFSVG.XX /I cpto $src/src/e8/README.TX DTA0: cpto $src/src/e8/e8cmds.tx DTA0: cpto $src/src/e8/e8srch.tx DTA0: cpto $src/src/e8/e8defs.pa DTA0: cpto $src/src/e8/e8base.pa DTA0: cpto $src/src/e8/e8file.pa DTA0: cpto $src/src/e8/e8srch.pa DTA0: pal8 E8.BN,E8.LS<DTA0:E8DEFS.PA,DTA0:E8BASE.PA,DTA0:E8FILE.PA,DTA0:E8SRCH.PA os8 COPY DTA0:<DSK:E8.BN,E8.LS begin cdprog SYS:ABSLDR.SV DSK:E8.BN end cdprog SYS:ABSLDR.SV os8 SAVE DTA0:E8.SV;200=1000 |
> > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # Script to create the e8.tu56 image that hosts the # FOCAL69 the original FORmula CALculator. # We build with the OS8_TOOLTIME packs: v3d-patched.rk05 mount rk0 $os8mo/v3d-patched.rk05 required scratch mount dt0 $os8mo/focal69.tu56 new boot rk0 os8 ZERO DTA0: # Copy source and doc files into the tape image. cpto $src/src/focal69/FOCAL.ZZM DTA0:FOCAL.ZM cpto $src/src/focal69/FLOAT.ZZM DTA0:FLOAT.ZM cpto $src/src/focal69/overlays/4KVT.PA DTA0: cpto $src/src/focal69/overlays/4WORD.BN DTA0: cpto $src/src/focal69/overlays/8KVT.PA DTA0: cpto $src/src/focal69/overlays/VTRUB.PA DTA0: cpto $src/src/focal69/overlays/4WORD.BN DTA0: /I pal8 FOCAL.BN<DTA0:FOCAL.ZM,DTA0:FLOAT.ZM pal8 8KNOVT.BN<DTA0:8KVT.PA pal8 8KVT.BN<DTA0:VTRUB.PA,DTA0:8KVT.PA pal8 4KVT.BN<DTA0:4KVT.PA os8 COPY DTA0:<FOCAL.BN,8KNOVT.BN,8KVT.BN,4KVT.BN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | # Script to build Kermit-12 from source to create # kermit-12.tu56 install image. # We build with the OS8_TOOLTIME packs: v3d-patched.rk05 mount rk0 $os8mo/v3d-patched.rk05 required scratch mount rk1 $os8mo/kermit-12.rk05 new boot rk0 os8 ZERO RKA1: os8 ZERO RKB1: # Copy source files onto the tape image. cpto $src/src/kermit-12/k12mit.pal RKA1:K12MIT.PA cpto $src/src/kermit-12/k12clr.pal RKA1:K12CLR.PA cpto $src/src/kermit-12/k12deb.pal RKA1:DEBOO.PA cpto $src/src/kermit-12/k12dec.pal RKA1:DECODE.PA cpto $src/src/kermit-12/k12enb.pal RKA1:ENBOO.PA cpto $src/src/kermit-12/k12enc.pal RKA1:ENCODE.PA cpto $src/src/kermit-12/k12ipg.pal RKA1:IPLGEN.PA cpto $src/src/kermit-12/k12ipl.pal RKA1:IPL.PA cpto $src/src/kermit-12/k12prm.pal RKA1:PARAM.PA cpto $src/src/kermit-12/k12pch.pal RKA1:K12PCH.PA pal8 RKA1:K12MIT.BN<RKA1:PARAM.PA,RKA1:K12MIT.PA (EFMW) pal8 RKA1:K12CLR.BN<RKA1:K12CLR.PA pal8 RKA1:IPLGEN.BN<RKA1:IPLGEN.PA os8 LOAD RKA1:K12CLR.BN,RKA1:K12MIT.BN os8 SAVE RKA1:K12MIT.SV=1 pal8 RKA1:ENBOO.BN<RKA1:ENBOO.PA /E/F os8 SAVE RKA1:ENBOO.SV=2001 pal8 RKA1:DEBOO.BN<RKA1:DEBOO.PA /E/F os8 SAVE RKA1:DEBOO.SV=0 pal8 RKA1:ENCODE.BN<RKA1:ENCODE.PA /E/F os8 SAVE RKA1:ENCODE.SV=2001 pal8 RKA1:DECODE.BN<RKA1:DECODE.PA os8 SAVE RKA1:DECODE.SV=0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | # Script to create the music.tu56 image that hosts the # PDP-8 Music Compiler and a variety of scores. # We build with the OS8_TOOLTIME packs: v3d-patched.rk05 # Note that SIMH has nothing to emulate anything helpful # to getting this program to emit music. # However, perhaps the tu56 image will be of use to those # with actual hardware. # The build is currently a default setup: # CPU=1 FOR PDP-8/E (ALSO 8/F, 8/M) # OS8=10 TO RUN UNDER OS/8 # CORE=400 FOR 12K OR LARGER SYSTEM # NOISE=CAF mount rk0 $os8mo/v3d-patched.rk05 required scratch mount dt0 $os8mo/music.tu56 new boot rk0 os8 ZERO DTA0: # Copy source and score files into the tape image. cpto $src/src/music/1TNSLD.MU DTA0: cpto $src/src/music/BABYEL.MU DTA0: cpto $src/src/music/ENTER.MU DTA0: cpto $src/src/music/FIFTH1.MU DTA0: cpto $src/src/music/FIFTH3.MU DTA0: cpto $src/src/music/FUGUE.MU DTA0: cpto $src/src/music/GMINOR.MU DTA0: cpto $src/src/music/INV201.MU DTA0: cpto $src/src/music/INV204.MU DTA0: cpto $src/src/music/INV208.MU DTA0: cpto $src/src/music/INV210.MU DTA0: cpto $src/src/music/INV212.MU DTA0: cpto $src/src/music/INV213.MU DTA0: cpto $src/src/music/INV214.MU DTA0: cpto $src/src/music/INV315.MU DTA0: cpto $src/src/music/JCOOK1.MU DTA0: cpto $src/src/music/JCOOK2.MU DTA0: cpto $src/src/music/LUVWIL.MU DTA0: cpto $src/src/music/MAPLE.MU DTA0: cpto $src/src/music/MINUET.MU DTA0: cpto $src/src/music/MINUTE.MU DTA0: cpto $src/src/music/MUSIC.PA DTA0: cpto $src/src/music/MUSIC1.MU DTA0: cpto $src/src/music/MUSIC2.MU DTA0: cpto $src/src/music/MUSIC3.MU DTA0: cpto $src/src/music/MUSIC4.MU DTA0: cpto $src/src/music/MUSIC5.MU DTA0: cpto $src/src/music/MUSIC6.MU DTA0: cpto $src/src/music/PLAYOV.PA DTA0: cpto $src/src/music/USA.MU DTA0: cpto $src/src/music/YANKEE.MU DTA0: pal8 MUSIC.BN<DTA0:MUSIC.PA os8 LOAD MUSIC.BN os8 SAVE DTA0:MUSIC.SV os8 COPY DTA0:<MUSIC.BN,MUSIC.SV |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | # Script to build U/W FOCAL from source to create # uwfocal.rk05 install image. # We build with the OS8_TOOLTIME packs: v3d-patched.rk05 mount rk0 $os8mo/v3d-patched.rk05 required scratch mount rk1 $os8mo/uwfocal.rk05 boot rk0 os8 ZERO RKA1: os8 ZERO RKB1: # Copy source files onto the tape image. # PAL Sources cpto $src/src/uwfocal/12KFNS.PA RKA1: cpto $src/src/uwfocal/16KCPR.PA RKA1: cpto $src/src/uwfocal/16KLIB.PA RKA1: cpto $src/src/uwfocal/16KXII.PA RKA1: cpto $src/src/uwfocal/16MPLT.PA RKA1: cpto $src/src/uwfocal/32KXII.PA RKA1: cpto $src/src/uwfocal/8XFIO.PA RKA1: cpto $src/src/uwfocal/8XFPP.PA RKA1: cpto $src/src/uwfocal/BSLASH.PA RKA1: cpto $src/src/uwfocal/FCOM45.PA RKA1: cpto $src/src/uwfocal/FCOM47.PA RKA1: cpto $src/src/uwfocal/LPT8I.PA RKA1: # Documentation cpto $src/src/uwfocal/CARD1.DA RKA1: cpto $src/src/uwfocal/CARD2.DA RKA1: cpto $src/src/uwfocal/CARD3.DA RKA1: cpto $src/src/uwfocal/CARD4.DA RKA1: cpto $src/src/uwfocal/ERRORS.FD RKA1: cpto $src/src/uwfocal/NOTE1.TX RKA1: cpto $src/src/uwfocal/NOTE2.TX RKA1: cpto $src/src/uwfocal/HEADER.HL RKA1: # Focal Compiled binary blobs. cpto $src/src/uwfocal/12DEMO.FC RKA1: /I cpto $src/src/uwfocal/2NDEMO.FC RKA1: /I cpto $src/src/uwfocal/AXIS.FC RKA1: /I cpto $src/src/uwfocal/AXISET.FC RKA1: /I cpto $src/src/uwfocal/CONVRT.FC RKA1: /I cpto $src/src/uwfocal/CRSHAR.FC RKA1: /I cpto $src/src/uwfocal/DATE.FC RKA1: /I cpto $src/src/uwfocal/EIGVAL.FC RKA1: /I cpto $src/src/uwfocal/EIGVEC.FC RKA1: /I cpto $src/src/uwfocal/EVDEMO.FC RKA1: /I cpto $src/src/uwfocal/FILNAM.FC RKA1: /I cpto $src/src/uwfocal/HEADER.FC RKA1: /I cpto $src/src/uwfocal/LOWPAS.FC RKA1: /I cpto $src/src/uwfocal/LSTSQR.FC RKA1: /I cpto $src/src/uwfocal/PLCARD.FC RKA1: /I cpto $src/src/uwfocal/PLDEMO.FC RKA1: /I cpto $src/src/uwfocal/PLOTER.FC RKA1: /I cpto $src/src/uwfocal/SKETCH.FC RKA1: /I cpto $src/src/uwfocal/SMSORT.FC RKA1: /I cpto $src/src/uwfocal/UWFOCL.FC RKA1: /I cpto $src/src/uwfocal/VUDEMO.FC RKA1: /I cpto $src/src/uwfocal/XYAXIS.FC RKA1: /I # Binary blobs we don't yet build # When the build system evolves # to reliably build them, remove this block. cpto $src/src/uwfocal/16KXII.BN RKA1: /I cpto $src/src/uwfocal/16MPLT.BN RKA1: /I cpto $src/src/uwfocal/32KXII.BN RKA1: /I cpto $src/src/uwfocal/BSLASH.BN RKA1: /I cpto $src/src/uwfocal/F32K4E.SV RKA1: /I cpto $src/src/uwfocal/FCOM45.BN RKA1: /I cpto $src/src/uwfocal/FCOM47.BN RKA1: /I cpto $src/src/uwfocal/LPT8I.BN RKA1: /I cpto $src/src/uwfocal/SCROLL.SV RKA1: /I pal8 RKA1:UWF16K.BN<RKA1:16KCPR.PA,12KFNS.PA,8XFIO.PA,8XFPP.PA,16KLIB.PA /K os8 LOAD RKA1:UWF16K.BN os8 SAVE RKA1:UWF16K.SV;100 patch $src/src/uwfocal/eae-modeb-clear.patch8 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 'startup': 'start': ["R FRTS\r", [["\n\\*", 'advent']]] 'advent': ["ADVENT\e", [ [ "LOCATION OF TEXT DATABASE\\s+\\(\\S+\\).*", 'database' ], [ "WELCOME TO ADVENTURE!!", 'instructions' ] ] ] 'database': ["\r", [ ["LOCATION OF TEXT INDEX\\s+\\(\\S+\\).*", 'index'] ] ] 'index': ["\r", [ ["LOCATION OF SAVED GAMES\\s+\\(\\S+\\).*", 'saved'] ] ] 'saved': ["\r", [ ["LOCATION OF TEXT INPUT\\s+\\(\\S+\\).*", 'input'] ] ] 'input': ["\r", [ ["WOULD YOU LIKE INSTRUCTIONS\\?.*", 'instructions'] ] ] 'instructions': ["n\r", [["\r\n> $", quit]]] 'quit': ["quit\r", [ ["DO YOU REALLY WANT TO QUIT NOW\\?\r\n\r\n> ", 'yes'] ] ] 'yes': ["yes\r", [["\n\\.$", 'success']]] |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | # Tests that generate a lot of output without interaction are flaky. # In BASIC, we can kick the output with a newline, as long as we # are careful to attempt a match on the longest successful result first, # and permit additional newlines at the end. # Earlier attempts at sending the XOFF character '\0x011' simply failed. # Sometimes OS/8 would echo the string "X011" instead of getting XOFF. 'snoopy': 'start': ["R BASIC\r", [["NEW OR OLD--$", 'old']]] 'old': ["OLD\r", [["FILE NAME--$", 'name']]] 'name': ["SNOOPY.BA\r", [["READY\r\n$", 'run']]] 'run': ["RUN\r", [["WHICH ONE\\?$", 'kbd']]] 'kbd': ["1\r", [ ["^1$", 'kick'], [".*CURSE YOU RED BARON.*\r\nREADY\r\n$", 'quit'] ] ] 'kick': ["\r", [[".*CURSE YOU RED BARON.*\r\nREADY\r\n", 'quit']]] 'quit': ["\x03", [["\n\\.$", 'success']]] 'hello': 'start': ["R BASIC\r", [["NEW OR OLD--$", 'old']]] 'old': ["OLD\r", [["FILE NAME--$", 'name']]] 'name': ["HELLO.BA\r", [["READY\r\n$", 'run']]] 'run': ["RUN\r", [["WHAT\\'S YOUR NAME \\?$", 'basic']]] 'basic': ["\x03", [["READY\r\n$", 'quit']]] 'quit': ["\x03", [["\n\\.$", 'success']]] 'bunny': 'start': ["R BASIC\r", [["NEW OR OLD--$", 'old']]] 'old': ["OLD\r", [["FILE NAME--$", 'name']]] 'name': ["BUNNY.BA\r", [["READY\r\n$", 'run']]] 'run': ["RUN\r", [ [".*BUNNY.*\r\nREADY\r\n$", 'quit'], ["^RUN.*", 'kick'] ] ] 'kick': ["\r", [ [".*\r\nREADY\r\n", 'quit'], [".*BUNNY.*", 'kick'] ] ] 'quit': ["\x03", [["\n\\.$", 'success']]] |
> > > > > > | 1 2 3 4 5 6 | 'ps': 'start': ["EXE CCR\r", [["PROGRAMME\\s+>", 'progname']]] 'progname': ["ps.c\r", [[".*924.*COMPLETED\r\n\r\n#END BATCH\r\n\r\n.$", 'success']]] 'fib': 'start': ["EXE CCR\r", [["PROGRAMME\\s+>", 'progname']]] 'progname': ["fib.c\r", [["OVERFLOW AT #18 = 2584\r\n\r\n#END BATCH\r\n\r\n.$", 'success']]] |
> > > > | 1 2 3 4 | 'startup': 'start': ["R CHEKMO\r", [["W. YOUR MOVE\\? ", 'move']]] 'move': ["\x03", [["\n\\.$", 'success']]] |
> > > > > > > | 1 2 3 4 5 6 7 | config: [slow] 'simple': 'start': ["R UWF16K\r", [["\r\n\\*$", 'set']]] 'set': ["S I=3.5\r", [["\r\n\\*$", 'type']]] 'type': ["T I\r", [[" 3\\.500000000E\\+00\\*$", 'pi']]] 'pi': ["T PI\r", [[" 3\\.141592654E\\+00\\*$", 'quit']]] 'quit': ["\x03", [["\n\\.$", 'success']]] |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 | # Builds a bootable dectape image for either v3d or v3f. # Pieces come from, as needed: # v3d-patched.rk05, the os8v3d device driver distribution DECtape, # and the os8v3f-build rk05. # Keep this file in sync with v3d-dist.os8 which determines # which device drivers are available by default when running # BUILD.SV from SYS: in the v3d enabled sections below. # Control: We default to v3d unless externally overridden to enable v3f enable v3d begin enabled v3f disable v3d end enabled v3f begin enabled v3f print Building v3f end enabled v3f begin enabled v3d print Building OS/8 v3d tu56 image end enabled v3d begin enabled v3f mount rk1 $bin/v3f-made.rk05 required end enabled v3f # Control: We default to tc08 unless externally overridden to enable # Either td12k or tdrom which will enable td8e and disable tc08 enable tc08 begin enabled td12k print for td12k configuration of TD8E. enable td8e end enabled td12k begin enabled tdrom print for dtrom configuration of TD8E. enable td8e end enabled tdrom begin enabled td8e disable tc08 end enabled td8e # This script can be run from a parallel make # So we create a scratch version of the system rk05 to prevent conflicts. # We have to do this anyway for TD8E since we change the DECtape configuration. mount rk0 $bin/v3d-patched.rk05 required scratch boot rk0 # Our built image inherits whether or not INIT is set. # A blank tape will complain "NO CCL!" on first boot. # So first thing SET SYS NO INIT os8 SET SYS NO INIT begin enabled td8e # For TD8E we run BUILD twice # First from SYS to change switch from TC08 to TD8E # Then to build the TD8E head from either RKB1 for v3f or from SYS for v3d. begin build SYS:BUILD DELETE DTA0,DTA1 INSERT TD8A,DTA0,DTA1 BOOT end build configure tape td # Now that the system is configured for TD8E build the .tu56 # Mount the destination image, either v3d or v3f on drive 0. begin enabled v3d mount td0 $os8mo/v3d-td12k.tu56 new end enabled v3d begin enabled v3f mount td0 $os8mo/v3f-td12k.tu56 new end enabled v3f mount td1 $os8mi/al-4712c-ba-os8-v3d-2.1978.tu56 readonly required end enabled td8e # This is the TC08 path. # Mount the destination image, either v3d or v3f on drive 0. begin enabled tc08 print with TC08 support. begin enabled v3d mount dt0 $os8mo/v3d-tc08.tu56 new end enabled v3d begin enabled v3f mount dt0 $os8mo/v3f-tc08.tu56 new # v3f needs device drivers from a V3d Distribution DECtape mount dt1 $os8mi/al-4712c-ba-os8-v3d-2.1978.tu56 readonly required end enabled v3f end enabled tc08 # Now build the system head. # v3f is more complicated because it installs a new KBM and CD. # Additionally that version of BUILD.SV contained NO drivers. # Be careful with the v3d build. We are using the BUILD.SV # from the rk05 SYS:. Be careful not to trash it! # TODO: Change BUILD.SV on our rk05 system packs already to # have the TD8E Drivers loaded. boot rk0 begin enabled v3d begin build SYS:BUILD # Necessary! Otherwise we mung the RK05 image! DELETE SYS DELETE RKA0 DELETE RKB0 INSERT RK05,RKA0,RKB0 # Unconditionally delete DTA0 because we shift it # from non-system to system. DELETE DTA0 # TD8E also changes non-system DTA1 from TC to TD. begin enabled td8e DELETE DTA1 end enabled td8e # Configure system for TC08 begin enabled tc08 SYSTEM TC08 INSERT TC08,DTA0 DSK TC08:DTA0 end enabled tc08 # Configure system for td12k begin enabled td12k SYSTEM TD8E INSERT TD8E,DTA0 INSERT TD8E,DTA1 DSK TD8E:DTA0 end enabled td12k # Or configure system for tdrom begin enabled tdrom SYSTEM ROM INSERT ROM,DTA0 INSERT ROM,DTA1 DSK ROM:DTA0 end enabled tdrom # That should do it. PRINT BOOT end build end enabled v3d begin enabled v3f os8 COPY DSK:<RKB1:OS8.BN,CD.BN begin build RKB1:BUILD LOAD DTA1:RK8ESY.BN LOAD DTA1:RK8ENS.BN LOAD DTA1:PT8E.BN # TD8E non-system handler. LOAD DTA1:TD8EA.BN begin enabled tc08 LOAD DTA1:TC08SY.BN LOAD DTA1:TC08NS.BN end enabled tc08 # TD8E systems with 12K uncomment next line. begin enabled td12k LOAD DTA1:TD8ESY.BN end enabled td12k # TD8E systems with ROM uncomment next line. begin enabled tdrom LOAD DTA1:ROMMSY.BN end enabled tdrom begin enabled td8e # Additional TD8E non-system devices not on sys by default. # But there might not be space. Leave them out for now. # Units 2 and 3. # LOAD DTA1:TD8EB.BN # Units 4 and 5. # LOAD DTA1:TD8EC.BN # Units 6 and 7. # LOAD DTA1:TD8ED.BN end enabled td8e # I think we actually want the RKB1 version of KL8E.BN LOAD DTA1:KL8E.BN LOAD DTA1:LPSV.BN LOAD RKB1:RXSY2.BN LOAD RKB1:RXNS.BN INSERT PT8E,PTR INSERT PT8E,PTP INSERT KL8E,TTY INSERT LPSV,LPT begin enabled tc08 SYSTEM TC08 INSERT TC08,DTA0 INSERT TC,DTA1 DSK TC08:DTA0 end enabled tc08 # Un-comment next 4 lines for TD8E 12K System begin enabled td12k SYSTEM TD8E INSERT TD8E,DTA0 INSERT TD8E,DTA1 DSK TD8E:DTA0 end enabled td12k # Un-comment next 4 lines for TD8E ROM System begin enabled tdrom SYSTEM ROM INSERT ROM,DTA0 INSERT ROM,DTA1 DSK ROM:DTA0 end enabled tdrom INSERT RX02,RXA0 INSERT RK05,RKA0,RKB0 INSERT RK05,RKA1,RKB1 INSERT RK05,RKA2,RKB2 BUILD DSK:OS8.BN DSK:CD.BN BOOT end build # Explicit unmount to avoid possible race condition. # Unmount the right device begin enabled td8e umount td1 end enabled td8e begin enabled tc08 umount dt1 end enabled tc08 end enabled v3f os8 SAVE DTA0 BUILD.SV # cusp-copyin.os8 uses the value of v3d or v3f enablement # already present in the environment. include $src/scripts/include/cusp-copyin.os8 # Lastly copy in the appropriate DECtape utilities. begin cdprog RKA0:FOTP.SV begin enabled tc08 DTA0:<RKA0:DTCOPY.SV DTA0:<RKA0:DTFRMT.SV end enabled tc08 begin enabled td8e DTA0:<RKA0:TDCOPY.SV DTA0:<RKA0:TDFRMT.SV end enabled td8e end cdprog RKA0:FOTP.SV # The last thing we do is run CCL on the system tu56 we just made. begin enabled td8e boot td0 end enabled td8e begin enabled tc08 boot dt0 end enabled tc08 os8 R CCL # Further system initialization os8 SET TTY COL 3 begin default crt os8 SET TTY SCOPE end default crt begin default lcmod os8 SUBMIT SYS:LCSYS.BI # os8 SUBMIT SYS:LCBAS.BI end default lcmod # INIT message setting stuff goes here # Implement the config option to enable/disable INIT # By default we enable it. # We may be building from distribution media with INIT enabled. # So always SET SYS NO INIT # and undo it by default, to be overridden if --disable-os8-init is set. # Only copy init.cm and init.tx if init is enabled. os8 SET SYS NO INIT begin default init begin enabled v3f cpto $os8mi/3finit.tx DSK:INIT.TX end enabled v3f begin enabled v3d cpto $os8mi/init.tx end enabled v3d cpto $os8mi/init.cm os8 SET SYS INIT end default init |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | # Build OS/8 BASIC and FORTRAN II from source mount rk0 $os8mo/v3d-patched.rk05 required scratch copy $obj/ock-bf2-src.rk05 $os8mo/ock-bf2-obj.rk05 mount rk1 $os8mo/ock-bf2-obj.rk05 required boot rk0 print Building BASIC.SV pal8 RKB1:BASIC.BN<RKA1:BASIC.PA begin cdprog SYS:ABSLDR.SV RKB1:BASIC.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:BASIC.SV;3211 os8 DEL RKB1:BASIC.BN print Building BCOMP.SV pal8 RKB1:BCOMP.BN<RKA1:BCOMP.PA begin cdprog SYS:ABSLDR.SV RKB1:BCOMP.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:BCOMP.SV;7000 os8 DEL RKB1:BCOMP.BN print Building BLOAD.SV pal8 RKB1:BLOAD.BN<RKA1:BLOAD.PA begin cdprog SYS:ABSLDR.SV RKB1:BLOAD.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:BLOAD.SV;7605 os8 DEL RKB1:BLOAD.BN print Building BRTS.SV, BASIC.AF, BASIC.SF, BASIC.FF from BRTS.PA pal8 RKB1:BRTS.BN<RKA1:BRTS.PA/W begin cdprog SYS:ABSLDR.SV RKB1:BRTS.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:BRTS.SV 0-6777;7605 os8 SAVE RKB1:BASIC.AF 3400-4577;7605 os8 SAVE RKB1:BASIC.SF 12000-13177;7605 os8 SAVE RKB1:BASIC.FF 13400-14577;7605 os8 DEL RKB1:BRTS.BN print Building BASIC.UF which includes patch 31.5.1 M in source form. pal8 RKB1:UF.BN<RKA1:UF.PA begin cdprog SYS:ABSLDR.SV RKB1:UF.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:BASIC.UF 3400-4577;7605 os8 DEL RKB1:UF.BN print Building EABRTS.BN from EAEDEF.PA and BRTS.PA pal8 RKB1:EABRTS.BN<RKA1:EAEDEF.PA,RKA1:BRTS.PA/W print Building SABR.SV from SABR.PA and SPATCH.PA pal8 RKB1:SABR.BN<RKA1:SABR.PA pal8 RKB1:SPATCH.BN<RKA1:SPATCH.PA begin cdprog SYS:ABSLDR.SV RKB1:SABR.BN RKB1:SPATCH.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:SABR.SV os8 DEL RKB1:SABR.BN,RKB1:SPATCH.BN print Building LOADER.SV pal8 RKB1:LOADER.BN<RKA1:LOADER.PA begin cdprog SYS:ABSLDR.SV RKB1:LOADER.BN/9 end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:LOADER.SV os8 DEL RKB1:LOADER.BN print Building FORT.SV from FORT.PA and FPATCH.PA pal8 RKB1:FORT.BN<RKA1:FORT.PA pal8 RKB1:FPATCH.BN<RKA1:FPATCH.PA begin cdprog SYS:ABSLDR.SV RKB1:FORT.BN RKB1:FPATCH.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:FORT.SV os8 DEL RKB1:FORT.BN,FPATCH.BN print Building LIBSET.SV pal8 RKB1:LIBSET.BN<RKA1:LIBSET.PA begin cdprog SYS:ABSLDR.SV RKB1:LIBSET.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:LIBSET.SV;12600=6000 os8 DEL RKB1:LIBSET.BN print Assemble Library Modules print ATAN begin cdprog RKB1:SABR.SV RKB1:ATAN.RL<RKA1:ATAN.SB end cdprog RKB1:SABR.SV print FLOAT begin cdprog RKB1:SABR.SV RKB1:FLOAT.RL<RKA1:FLOAT.SB end cdprog RKB1:SABR.SV print GENIOX begin cdprog RKB1:SABR.SV RKB1:GENIOX.RL<RKA1:GENIOX.SB end cdprog RKB1:SABR.SV print INTEGR begin cdprog RKB1:SABR.SV RKB1:INTEGR.RL<RKA1:INTEGR.SB end cdprog RKB1:SABR.SV print IOH begin cdprog RKB1:SABR.SV RKB1:IOH.RL<RKA1:IOH.SB end cdprog RKB1:SABR.SV print IOPEN begin cdprog RKB1:SABR.SV RKB1:IOPEN.RL<RKA1:IOPEN.SB end cdprog RKB1:SABR.SV print IPOWRS begin cdprog RKB1:SABR.SV RKB1:IPOWRS.RL<RKA1:IPOWRS.SB end cdprog RKB1:SABR.SV print POWERS begin cdprog RKB1:SABR.SV RKB1:POWERS.RL<RKA1:POWERS.SB end cdprog RKB1:SABR.SV print RWTAPE begin cdprog RKB1:SABR.SV RKB1:RWTAPE.RL<RKA1:RWTAPE.SB end cdprog RKB1:SABR.SV print SQRT begin cdprog RKB1:SABR.SV RKB1:SQRT.RL<RKA1:SQRT.SB end cdprog RKB1:SABR.SV print TRIG begin cdprog RKB1:SABR.SV RKB1:TRIG.RL<RKA1:TRIG.SB end cdprog RKB1:SABR.SV print UTILTY begin cdprog RKB1:SABR.SV RKB1:UTILTY.RL<RKA1:UTILTY.SB end cdprog RKB1:SABR.SV print Use our newly built LIBSET to create LIB8.RL from our library RL files. begin cdprog RKB1:LIBSET.SV RKB1:LIB8.RL<RKB1:ATAN.RL,RKB1:FLOAT.RL,RKB1:GENIOX.RL,RKB1:INTEGR.RL RKB1:IOH.RL,RKB1:IOPEN.RL,RKB1:IPOWRS.RL,RKB1:POWERS.RL,RKB1:RWTAPE.RL RKB1:SQRT.RL,RKB1:TRIG.RL,RKB1:UTILTY.RL end cdprog RKB1:LIBSET.SV |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # Takes an OS8 V3D binary rk05 image and applies patches. # Bootstrapping issue: we use XXX-dist.rk05 to build the C compiler. # So we install it in this phase. copy $os8mo/ock-patched.rk05 $os8mo/ock.rk05 mount rk0 $os8mo/ock.rk05 required boot rk0 # Include our dynamically specified packages. include $build/obj/os8pkg/pkgs.os8 # Squish our device as our last step! os8 SQUISH DSK:/O os8 SQUISH SYS:/O |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 | # Comments begin with an octothorpe # Blank lines are ignored. # OS/8 Writes on the system device (architectural flaw). # Since this might be run from a parallel make, we mount the system # with the scratch option to make a unique copy. mount rk0 $os8mo/v3d-patched.rk05 required scratch copy $obj/ock-cusps-src.rk05 $os8mo/ock-cusps-obj.rk05 mount rk1 $os8mo/ock-cusps-obj.rk05 required boot rk0 print Building DIRECT.SV pal8 RKB1:DIRECT.BN<RKA1:DIRECT.PA begin cdprog SYS:ABSLDR.SV RKB1:DIRECT.BN(89P)=14600 end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:DIRECT.SV;14600=6403 os8 DEL RKB1:DIRECT.BN print Building FOTP.SV pal8 RKB1:FOTP.BN<RKA1:FOTP.PA begin cdprog SYS:ABSLDR.SV RKB1:FOTP.BN(89P)=14600 end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:FOTP.SV;14600=6403 os8 DEL RKB1:FOTP.BN print Building PIP.SV pal8 RKB1:PIP.BN<RKA1:PIP.PA begin cdprog SYS:ABSLDR.SV RKB1:PIP.BN(89P)=13000 end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:PIP.SV;13000=6403 os8 DEL RKB1:PIP.BN print Building HELP.SV pal8 RKB1:HELP.BN<RKA1:HELP.PA begin cdprog SYS:ABSLDR.SV RKB1:HELP.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:HELP.SV=3401 os8 DEL RKB1:HELP.BN print Building BOOT.SV pal8 RKB1:BOOT.BN<RKA1:BOOT.PA begin cdprog SYS:ABSLDR.SV RKB1:BOOT.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:BOOT.SV os8 DEL RKB1:BOOT.BN print Building EPIC.SV pal8 RKB1:EPIC.BN<RKA1:EPIC.PA begin cdprog SYS:ABSLDR.SV RKB1:EPIC.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:EPIC.SV os8 DEL RKB1:EPIC.BN print Building FUTIL.SV pal8 RKB1:FUTIL.BN<RKA1:FUTIL.PA begin cdprog SYS:ABSLDR.SV RKB1:FUTIL.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:FUTIL.SV;6400=0400 os8 DEL RKB1:FUTIL.BN print Building SET.SV pal8 RKB1:SET.BN<RKA1:SET.PA begin cdprog SYS:ABSLDR.SV RKB1:SET.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:SET.SV os8 DEL RKB1:SET.BN print Building EDIT.SV pal8 RKB1:EDIT.BN<RKA1:EDIT.PA begin cdprog SYS:ABSLDR.SV RKB1:EDIT.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:EDIT.SV os8 DEL RKB1:EDIT.BN print Building PAL8.SV pal8 RKB1:PAL8.BN<RKA1:PAL8.PA begin cdprog SYS:ABSLDR.SV RKB1:PAL8.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:PAL8.SV os8 DEL RKB1:PAL8.BN print Building CREF.SV pal8 RKB1:CREF.BN<RKA1:CREF.PA begin cdprog SYS:ABSLDR.SV RKB1:CREF.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:CREF.SV os8 DEL RKB1:CREF.BN print Building BITMAP.SV pal8 RKB1:BITMAP.BN<RKA1:BITMAP.PA begin cdprog SYS:ABSLDR.SV RKB1:BITMAP.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:BITMAP.SV;12000=6001 os8 DEL RKB1:BITMAP.BN print Building SRCCOM.SV pal8 RKB1:SRCCOM.BN<RKA1:SRCCOM.PA begin cdprog SYS:ABSLDR.SV RKB1:SRCCOM.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:SRCCOM.SV os8 DEL RKB1:SRCCOM.BN print Building TECO.SV pal8 RKB1:TECO.BN<RKA1:TECO.PA/W begin cdprog SYS:ABSLDR.SV RKB1:TECO.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:TECO.SV=2000 os8 DEL RKB1:TECO.BN print Building RXCOPY.SV pal8 RKB1:RXCOPY.BN<RKA1:RXCOPY.PA begin cdprog SYS:ABSLDR.SV RKB1:RXCOPY.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:RXCOPY.SV;16000=7403 os8 DEL RKB1:RXCOPY.BN print Building RKLFMT.SV pal8 RKB1:RKLFMT.BN<RKA1:RKLFMT.PA begin cdprog SYS:ABSLDR.SV RKB1:RKLFMT.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:RKLFMT.SV=0000 os8 DEL RKB1:RKLFMT.BN print Building MCPIP.SV pal8 RKB1:MCPIP.BN<RKA1:MCPIP.PA begin cdprog SYS:ABSLDR.SV RKB1:MCPIP.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:MCPIP.SV;12000=6403 os8 DEL RKB1:MCPIP.BN print Building MSBAT.SV pal8 RKB1:MSBAT.BN<RKA1:MSBAT.PA begin cdprog SYS:ABSLDR.SV RKB1:MSBAT.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:MSBAT.SV=0000 os8 DEL RKB1:MSBAT.BN print Building PIP10.SV pal8 RKB1:PIP10.BN<RKA1:PIP10.PA begin cdprog SYS:ABSLDR.SV RKB1:PIP10.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:PIP10.SV=2000 os8 DEL RKB1:PIP10.BN print Building CAMP.SV pal8 RKB1:CAMP.BN<RKA1:CAMP.PA begin cdprog SYS:ABSLDR.SV RKB1:CAMP.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:CAMP.SV=2000 os8 DEL RKB1:CAMP.BN print Building DTCOPY.SV pal8 RKB1:DTCOPY.BN<RKA1:DTCOPY.PA begin cdprog SYS:ABSLDR.SV RKB1:DTCOPY.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:DTCOPY.SV=2000 os8 DEL RKB1:DTCOPY.BN print Building DTFRMT.SV pal8 RKB1:DTFRMT.BN<RKA1:DTFRMT.PA begin cdprog SYS:ABSLDR.SV RKB1:DTFRMT.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:DTFRMT.SV;1000=2000 os8 DEL RKB1:DTFRMT.BN print Building TDCOPY.SV pal8 RKB1:TDCOPY.BN<RKA1:TDCOPY.PA begin cdprog SYS:ABSLDR.SV RKB1:TDCOPY.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:TDCOPY.SV=2000 os8 DEL RKB1:TDCOPY.BN print Building TDFRMT.SV pal8 RKB1:TDFRMT.BN<RKA1:TDFRMT.PA begin cdprog SYS:ABSLDR.SV RKB1:TDFRMT.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:TDFRMT.SV;1000=2000 os8 DEL RKB1:TDFRMT.BN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | # Creates an OS/8 Combined Kit binary rk05 image from compiled # Object rk05 images. # Based on v3d-dist-rk05.os8, and the v3f stuff in all-tu56.os8 # I'm not sure if we can build an RK05 system from scratch # when booted from RK05, so we'll bootstrap using the OS/8 # distribution DECtape mount dt0 $os8mi/al-4711c-ba-os8-v3d-1.1978.tu56 required scratch # rk0 holds the media we build mount rk0 $os8mo/ock-dist.rk05 new # rk1 holds the system object image. mount rk1 $os8mo/ock-sys-obj.rk05 # rk2 holds the CUSPS object image mount rk2 $os8mo/ock-cusps-obj.rk05 boot dt0 # Our built image inherits whether or not INIT is set. # A blank tape will complain "NO CCL!" on first boot. # So first thing SET SYS NO INIT os8 SET SYS NO INIT print BUILD the system head # BUILD requires our OS8.BN and CD.BN to be on DSK: os8 COPY DSK:<RKB1:OS8.BN,CD.BN begin build RKB1:BUILD # But our build has no handlers LOAD RKB1:RK8ESY.BN LOAD RKB1:RK8ENS.BN LOAD RKB1:RXNS.BN LOAD RKB1:KL8E.BN LOAD RKB1:LPSV.BN LOAD RKB1:TC08SY.BN LOAD RKB1:TC08NS.BN LOAD RKB1:PT8E.BN LOAD RKB1:TD8ESY.BN LOAD RKB1:ROMMSY.BN LOAD RKB1:TD8EA.BN # We could load more TD8E non-system drivers # But there is limited space, so we elect not to. # LOAD RKB1:TD8EB.BN # LOAD RKB1:TD8EC.BN # LOAD RKB1:TD8ED.BN SYSTEM RK8E INSERT KL8E,TTY INSERT LPSV,LPT INSERT PT8E,PTR INSERT PT8E,PTP INSERT RK8E,RKA0,RKB0 INSERT RK05,RKA1,RKB1 INSERT RK05,RKA2,RKB2 INSERT TC,DTA0,DTA1 DSK RK8E:RKB0 PRINT BUILD DSK:OS8.BN DSK:CD.BN BOOT end build os8 SAVE SYS BUILD.SV # There is stuff we have to do to get a batch-literate BUILD here. print copying in CUSPS. begin cdprog RKB2:FOTP.SV RKA0:<RKB1:CCL.SV RKA0:<RKB1:RESORC.SV RKA0:<RKB1:BATCH.SV RKA0:<RKB2:FOTP.SV RKA0:<RKB2:DIRECT.SV RKA0:<RKB2:BOOT.SV RKA0:<RKB2:EDIT.SV RKA0:<RKB2:EPIC.SV RKA0:<RKB2:PIP.SV RKA0:<RKB2:SET.SV RKA0:<RKB2:FUTIL.SV RKA0:<RKB2:PAL8.SV RKA0:<RKB2:BITMAP.SV RKA0:<RKB2:CREF.SV RKA0:<RKB2:SRCCOM.SV RKA0:<RKB2:HELP.SV RKA0:<RKB2:RXCOPY.SV RKA0:<RKA1:HELP.HL RKA0:<RKB2:TECO.SV RKA0:<RKB2:CAMP.SV RKA0:<RKB2:DTCOPY.SV RKA0:<RKB2:DTFRMT.SV RKA0:<RKB2:MCPIP.SV RKA0:<RKB2:MSBAT.SV RKA0:<RKB2:PIP10.SV RKA0:<RKB2:RKLFMT.SV RKA0:<RKB2:TDCOPY.SV RKA0:<RKB2:TDFRMT.SV RKA0:<RKA1:??SYS.BI end cdprog RKB2:FOTP.SV os8 R CCL # Initialize RKB0: os8 ZERO DSK: os8 SET TTY COL 3 begin default crt os8 SET TTY SCOPE end default crt umount rk1 umount rk2 # rk1 holds the BASIC/FORTRAN II object image. mount rk1 $os8mo/ock-bf2-obj.rk05 # We install SABR and LOADER even if F2 disabled because # we use them for the C compiler. print copying in BASIC and SABR and LOADER begin cdprog SYS:FOTP.SV RKA0:<RKB1:BLOAD.SV RKA0:<RKB1:BRTS.SV RKA0:<RKB1:EABRTS.BN RKA0:<RKB1:BCOMP.SV RKA0:<RKB1:BASIC.* RKA0:<RKB1:SABR.SV RKA0:<RKB1:LOADER.SV RKA0:<RKA1:RESEQ.BA RKA0:<RKA1:?CBAS.BI # Copy in the BASIC UF.PA source. Maybe make it later # Note it's starting address on the v3d dist is 7605. RKB0:<RKA1:UF.PA end cdprog SYS:FOTP.SV print Bringing in optional packages build from Combined Kit source begin default fortran-ii begin cdprog SYS:FOTP.SV RKA0:<RKB1:FORT.SV RKA0:<RKB1:LIBSET.SV RKA0:<RKB1:*.RL RKA0:<RKA1:GENIOX.SB end cdprog SYS:FOTP.SV end default fortran-ii # We're done with BASIC and FORTRAN II object rk05. # Build from source the OCOMP Octal Compare/Dump utility. # And install it. print Build and install OCOMP cpto $src/src/os8/tools/ocomp/ocomp.pa RKB0:OCOMP.HL cpto $src/src/os8/tools/ocomp/ocomp.pa RKB0:OCOMP.PA pal8 RKB0:OCOMP.BN<RKB0:OCOMP.PA /8/9 os8 LOAD RKB0:OCOMP.BN os8 SAVE RKA0:OCOMP.SV;12000 os8 DEL RKB0:OCOMP.PA,OCOMP.BN # FORTRAN IV begin default fortran-iv # rk1 holds the FORTRAN IV object image mount rk1 $os8mo/ock-fiv-obj.rk05 os8 COPY RKA0:<RKB1:*.* umount rk1 end default fortran-iv # MACREL V2 # In future we will build this from source begin default macrel mount dt1 $os8mi/al-5642c-ba-macrel-v2-futil-v8b-by-hand.tu56 ro required os8 COPY RKA0:<DTA1:MACREL.SV,LINK.SV,KREF.SV,OVRDRV.MA umount dt1 end default macrel # Further system initialization begin default lcmod os8 SUBMIT SYS:LCSYS.BI begin default basic os8 SUBMIT SYS:LCBAS.BI end default basic end default lcmod # INIT message setting stuff goes here # Implement the config option to enable/disable INIT # By default we enable it. # We may be building from distribution media with INIT enabled. # So always SET SYS NO INIT # and undo it by default, to be overridden if --disable-os8-init is set. # Only copy init.cm and init.tx if init is enabled. os8 SET SYS NO INIT begin default init cpto $os8mi/init.cm # Location of init.tx is funky so that test-os8-run will be able to # sanitize it. cpto $build/media/os8/ock-init.tx DSK:INIT.TX os8 SET SYS INIT end default init # Squish of SYS and DSK goes here os8 SQUISH DSK:/O os8 SQUISH SYS:/O |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | # Build OS/8 FORTRAN IV from source # BASED on FORGEN.BI mount rk0 $os8mo/v3d-patched.rk05 required scratch copy $obj/ock-fiv-src.rk05 $os8mo/ock-fiv-obj.rk05 mount rk1 $os8mo/ock-fiv-obj.rk05 required boot rk0 print Assemble FORTRAN IV # Uses CCL "LOAD" command instead of running ABSLDR. pal8 RKB1:F4.BN<RKA1:F4.PA os8 LOAD RKB1:F4.BN os8 SAVE RKB1 F4.SV;12200=100 os8 DEL RKB1:F4.BN pal8 RKB1:PASS2.BN<RKA1:PASS2.PA os8 LOAD RKB1:PASS2.BN os8 SAVE RKB1 PASS2.SV;5000=100 os8 DEL RKB1:PASS2.BN pal8 RKB1:PASS2O.BN<RKA1:PASS2O,PASS2.PA os8 LOAD RKB1:PASS2O.BN os8 SAVE RKB1 PASS2O.SV;7605=100 os8 DEL RKB1:PASS2O.BN pal8 RKB1:PASS3.BN<RKA1:PASS3.PA os8 LOAD RKB1:PASS3.BN os8 SAVE RKB1 PASS3.SV;400=100 os8 DEL RKB1:PASS3.BN pal8 RKB1:LOAD.BN<RKA1:LOAD.PA os8 LOAD RKB1:LOAD.BN os8 SAVE RKB1 LOAD.SV;200=100 os8 DEL RKB1:LOAD.BN pal8 RKB1:FRTS.BN<RKA1:RTS.PA,RKA1:RTL.PA/W/K os8 LOAD RKB1:FRTS.BN os8 SAVE RKB1 FRTS.SV;200=100 os8 DEL RKB1:FRTS.BN pal8 RKB1:RALF.BN<RKA1:RALF.PA/W os8 LOAD RKB1:RALF.BN os8 SAVE RKB1 RALF.SV;200=100 os8 DEL RKB1:RALF.BN pal8 RKB1:LIBRA.BN<RKA1:LIBRA.PA os8 LOAD RKB1:LIBRA.BN os8 SAVE RKB1 LIBRA.SV;200=100 os8 DEL RKB1:LIBRA.BN os8 COPY DSK:<RKA1:FORLIB.BI os8 ASSIGN RKA1 SRCE os8 ASSIGN RKB1 TARG os8 SUBMIT FORLIB.BI |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | # Apply all appropriate patches to the OS/8 Combined Kit # rk05 image that has been built from source. # The patches have been extensively reviewed and documented # in doc/os8-combined-kit.md copy $os8mo/ock-dist.rk05 $os8mo/ock-patched.rk05 mount rk0 $os8mo/ock-patched.rk05 required boot rk0 print Applying patches inherited from v3d: patch $src/patches/os8/ock/CREF-21.15.1M-v5B.patch8 patch $src/patches/os8/ock/CREF-21.15.2M-v5C.patch8 patch $src/patches/os8/ock/BRTS-31.11.3-O.patch8 # We need SABR for C compiler. Patch it unconditionally. # begin default fortran-ii patch $src/patches/os8/ock/SABR-21.91.1M-v18B.patch8 # end default fortran-ii begin default fortran-iv patch $src/patches/os8/ock/F4-51.3.2M-v4x.patch8 end default fortran-iv # patch $src/patches/os8/ock/TECO 31.20.1 Unconditional no case flagging. Not recommended # patch $src/patches/os8/ock/TECO-31.20.01O.patch8 # patch $src/patches/os8/ock/TECO 31.20.2 Turns off verbose errors. Not recommended. # patch $src/patches/os8/ock/TECO-31.20.02O.patch8 # patch $src/patches/os8/ock/TECO 31.20.3 Turns off Yank overwrite warning. Not recommended. # patch $src/patches/os8/ock/TECO-31.20.03O.patch8 # patch $src/patches/os8/ock/TECO 31.20.4 Special support for VT05. Not recommended. # patch $src/patches/os8/ock/TECO-31.20.04O.patch8 patch $src/patches/os8/ock/TECO-31.20.05M-v5A.patch8 patch $src/patches/os8/ock/TECO-31.20.06M-v5B.patch8 patch $src/patches/os8/ock/TECO-31.20.07M.v5C.patch8 patch $src/patches/os8/ock/TECO-31.20.08M-v5.04.patch8 patch $src/patches/os8/ock/TECO-31.20.10M-v5.05.patch8 patch $src/patches/os8/ock/TECO-31.20.11M-v5.06.patch8 patch $src/patches/os8/ock/TECO-31.20.12M-v5.07.patch8 patch $src/patches/os8/ock/TECO-31.20.13M-v5.08.patch8 print Applying patches unique to the Combined Kit: patch $src/patches/os8/ock/ABSLDR-21.29.1M-v6C.patch8 patch $src/patches/os8/ock/PAL8-35.14.1M-V13B.patch8 patch $src/patches/os8/ock/BLOAD-35.51.1M-v5C.patch8 # Squish our device as our last step! os8 SQUISH DSK:/O os8 SQUISH SYS:/O |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | # Comments begin with an octothorpe # Blank lines are ignored. # OS/8 Writes on the system device (architectural flaw). # Since this might be run from a parallel make, we mount the system # with the scratch option to make a unique copy. mount rk0 $os8mo/v3d-patched.rk05 required scratch copy $obj/ock-sys-src.rk05 $os8mo/ock-sys-obj.rk05 mount rk1 $os8mo/ock-sys-obj.rk05 required boot rk0 print Building BUILD.SV pal8 RKB1:BUILD.BN<RKA1:BUILD.PA begin cdprog SYS:ABSLDR.SV RKB1:BUILD.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:BUILD.SV print Assembling OS8.BN and CD.BN pal8 RKB1:OS8.BN<RKA1:OS8.PA pal8 RKB1:CD.BN<RKA1:CD.PA print Assembling handlers print Character oriented handlers pal8 RKB1:ASR33.BN<RKA1:ASR33.PA pal8 RKB1:BAT.BN<RKA1:BAT.PA pal8 RKB1:CR8E.BN<RKA1:CR8E.PA pal8 RKB1:VR12.BN<RKA1:VR12.PA pal8 RKB1:VT50.BN<RKA1:VT50.PA pal8 RKB1:KL8E.BN<RKA1:KL8E.PA pal8 RKB1:L645.BN<RKA1:L645.PA pal8 RKB1:LPSV.BN<RKA1:LPSV.PA pal8 RKB1:LQP.BN<RKA1:LQP.PA pal8 RKB1:LSPT.BN<RKA1:LSPT.PA pal8 RKB1:PT8E.BN<RKA1:PT8E.PA print Tape handlers pal8 RKB1:CS.BN<RKA1:CS.PA pal8 RKB1:LINCNS.BN<RKA1:LINCNS.PA pal8 RKB1:LINCSY.BN<RKA1:LINCSY.PA pal8 RKB1:TC08NS.BN<RKA1:TC08NS.PA pal8 RKB1:TC08SY.BN<RKA1:TC08SY.PA pal8 RKB1:TD8EA.BN<RKA1:TD8EA.PA pal8 RKB1:TD8EB.BN<RKA1:TD8EB.PA pal8 RKB1:TD8EC.BN<RKA1:TD8EC.PA pal8 RKB1:TD8ED.BN<RKA1:TD8ED.PA pal8 RKB1:TD8ESY.BN<RKA1:TD8ESY.PA pal8 RKB1:TM8E.BN<RKA1:TM8E.PA print Disk handlers pal8 RKB1:DF32NS.BN<RKA1:DF32NS.PA pal8 RKB1:DF32SY.BN<RKA1:DF32SY.PA pal8 RKB1:RF08NS.BN<RKA1:RF08NS.PA pal8 RKB1:RF08SY.BN<RKA1:RF08SY.PA pal8 RKB1:RK08NS.BN<RKA1:RK08NS.PA pal8 RKB1:RK08SY.BN<RKA1:RK08SY.PA pal8 RKB1:RK8ENS.BN<RKA1:RK8ENS.PA pal8 RKB1:RK8ESY.BN<RKA1:RK8ESY.PA pal8 RKB1:RL0.BN<RKA1:RL0.PA pal8 RKB1:RL1.BN<RKA1:RL1.PA pal8 RKB1:RL2.BN<RKA1:RL2.PA pal8 RKB1:RL3.BN<RKA1:RL3.PA pal8 RKB1:RLC.BN<RKA1:RLC.PA pal8 RKB1:RLSY.BN<RKA1:RLSY.PA pal8 RKB1:ROMMSY.BN<RKA1:ROMMSY.PA pal8 RKB1:RX78C.BN<RKA1:RX78C.PA pal8 RKB1:RXNS.BN<RKA1:RXNS.PA pal8 RKB1:RXSY1.BN<RKA1:RXSY1.PA pal8 RKB1:RXSY2.BN<RKA1:RXSY2.PA print Other handlers pal8 RKB1:DUMP.BN<RKA1:DUMP.PA pal8 RKB1:VXNS.BN<RKA1:VXNS.PA pal8 RKB1:VXSY.BN<RKA1:VXSY.PA print Building BATCH.SV pal8 RKB1:BATCH.BN<RKA1:BATCH.PA begin cdprog SYS:ABSLDR.SV RKB1:BATCH.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:BATCH.SV print Running BATCH job to build CCL.SV and RESORC.SV os8 ASSIGN RKA1 IN os8 ASSIGN RKB1 OUT os8 COPY DSK:<RKA1:RESORC.BI os8 COPY DSK:<RKA1:CCL.BI os8 SUBMIT CCL.BI |
> > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 | # If a script setting TD8E in the default system packs blows out # Run this script to fix it. # We presume it happened to the OS8_TOOLTIME packs: v3d-patched.rk05 mount rk0 $bin/v3d-patched.rk05 required # The saved BUILD will just work. boot rk0 begin build SYS:BUILD.SV BOOT end build os8 SET SYS INIT |
> > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # Install the final packages to our patched rk05 image # to create the boot image we normally use. copy $os8mo/v3d-patched.rk05 $os8mo/v3d.rk05 mount rk0 $os8mo/v3d.rk05 required boot rk0 # Include our dynamically specified packages. include $build/obj/os8pkg/pkgs.os8 # Squish our device as our last step! os8 SQUISH DSK:/O os8 SQUISH SYS:/O |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | # Creates an OS/8 v3d binary rk05 image from distribution DECtapes. # Caution: the boot tape must be writeable. mount dt0 $os8mi/al-4711c-ba-os8-v3d-1.1978.tu56 required scratch mount dt1 $os8mi/al-4712c-ba-os8-v3d-2.1978.tu56 ro required mount rk0 $os8mo/v3d-dist.rk05 new boot dt0 begin build SYS:BUILD LOAD DTA1:RK8ESY.BN LOAD DTA1:PT8E.BN LOAD DTA1:TD8ESY.BN LOAD DTA1:ROMMSY.BN LOAD DTA1:TD8EA.BN # We could load more TD8E non-system drivers # But there is limited space, so we elect not to. # LOAD DTA1:TD8EB.BN # LOAD DTA1:TD8EC.BN # LOAD DTA1:TD8ED.BN DELETE SYS SYSTEM RK8E DELETE RXA1 INSERT PT8E,PTR INSERT PT8E,PTP DELETE RKA0 DELETE RKB0 INSERT RK8E,RKA0,RKB0 INSERT RK05,RKA2,RKB2 DELETE DTA0 INSERT TC,DTA0 DSK RK8E:RKB0 PRINT BOOT end build # Note: # If we save BUILD to RKA0 it gets overwritten with our DTA0: copyin. # If we save BUILD to DTA0: that does not happen but then we modify # our tape. (It is supposed to be a scratch tape.) os8 SAVE DTA0 BUILD.SV boot dt0 # System tape 1 of 2 os8 COPY RKA0:<DTA0:*.* # Help files from tape 2 of 2. # Not enough room for everything on tape 2. # We just copy the help files. os8 COPY RKA0:<DTA1:*.HL # We can't express disabled yet. # Besides we need SABR for cc8 # begin disabled fortran-ii # os8 DELETE RKA0:FORT.SV,LIBSET.SV,SABR.SV # end disabled fortran-ii begin default fortran-ii os8 COPY RKA0:<DTA1:*.RL end default fortran-ii umount dt0 umount dt1 boot rk0 os8 ZERO RKB0: # Do copyins here. # OS/8 V3D extensions mount dt0 $os8mi/al-4761c-ba-os8-v3d-ext.1978.tu56 ro required os8 COPY RKA0:<DTA0:*.* umount dt0 # Build from source the OCOMP Octal Compare/Dump utility. # And install it. print Build and install OCOMP cpto $src/src/os8/tools/ocomp/ocomp.pa RKB0:OCOMP.HL cpto $src/src/os8/tools/ocomp/ocomp.pa RKB0:OCOMP.PA pal8 RKB0:OCOMP.BN<RKB0:OCOMP.PA /8/9 os8 LOAD RKB0:OCOMP.BN os8 SAVE RKA0:OCOMP.SV;12000 os8 DEL RKB0:OCOMP.PA,OCOMP.BN # FORTRAN IV begin default fortran-iv mount dt1 $os8mi/subsys/al-4549d-ba-fr4-v3d-1.1978.tu56 ro required os8 COPY RKA0:<DTA1:*.* umount dt1 end default fortran-iv # MACREL V2 and new FUTIL V8B begin default macrel mount dt1 $os8mi/al-5642c-ba-macrel-v2-futil-v8b-by-hand.tu56 ro required os8 COPY RKA0:<DTA1:MACREL.SV,LINK.SV,KREF.SV,OVRDRV.MA,FUTIL.SV umount dt1 end default macrel # Upper Case / Lower Case batch script patches # Copy in from source tree. cpto $src/src/os8/v3d/SYSTEM/UCSYS.BI RKA0: cpto $src/src/os8/v3d/SYSTEM/LCSYS.BI RKA0: cpto $src/src/os8/v3d/BASIC/UCBAS.BI RKA0: cpto $src/src/os8/v3d/BASIC/LCBAS.BI RKA0: # Further system initialization os8 SET TTY COL 3 begin default crt os8 SET TTY SCOPE end default crt begin default lcmod os8 SUBMIT SYS:LCSYS.BI begin default basic os8 SUBMIT SYS:LCBAS.BI end default basic end default lcmod # INIT message setting stuff goes here # Implement the config option to enable/disable INIT # By default we enable it. # We may be building from distribution media with INIT enabled. # So always SET SYS NO INIT # and undo it by default, to be overridden if --disable-os8-init is set. # Only copy init.cm and init.tx if init is enabled. os8 SET SYS NO INIT begin default init cpto $os8mi/init.cm # Location of init.tx is funky so that test-os8-run will be able to # sanitize it. cpto $build/media/os8/init.tx os8 SET SYS INIT end default init # Squish of SYS and DSK goes here umount dt0 umount dt1 os8 SQUISH DSK:/O os8 SQUISH SYS:/O |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | # Apply all appropriate patches to the V3D Distribution rk05 image # to create a new image that is the basis for our boot image. copy $os8mo/v3d-dist.rk05 $os8mo/v3d-patched.rk05 mount rk0 $os8mo/v3d-patched.rk05 required boot rk0 # Most of these patches have been verified # by reading the source code. # The patches that remain commented out are not recommended # and the reason why appears in the line above it. # # ABSLDR-21.29.1M is against v6A but we have v4A. # v6A came with OS/8 Devices Extension kit QF026 # Binary DECtape: AL-H525A-BA, Source not on DECtape # DO NOT APPLY THIS PATCH. ## ABSLDR-21.29.1M-v6C.patch8 patch $src/patches/os8/v3d/BASIC.UF-31.5.1M-V5B.patch8 patch $src/patches/os8/v3d/BATCH-31.23.1M-v7B.patch8 patch $src/patches/os8/v3d/BLOAD-31.10.1M-v5B.patch8 patch $src/patches/os8/v3d/BRTS-31.11.1M-v5B.patch8 # patch $src/patches/os8/v3d/BRTS 31.11.2O disables 8th bit parity. Recommended. patch $src/patches/os8/v3d/BRTS-31.11.2-O.patch8 # patch $src/patches/os8/v3d/BRTS 31.11.3O enables 132 column output. Recommended. patch $src/patches/os8/v3d/BRTS-31.11.3-O.patch8 patch $src/patches/os8/v3d/BRTS-31.11.5-x.patch8 patch $src/patches/os8/v3d/CREF-21.15.1M-v5B.patch8 patch $src/patches/os8/v3d/CREF-21.15.2M-v5C.patch8 patch $src/patches/os8/v3d/EDIT-21.17.1M-v12B.patch8 patch $src/patches/os8/v3d/EDIT-21.17.2M-v12C.patch8 patch $src/patches/os8/v3d/EDIT-21.17.3M-v12D.patch8 # patch $src/patches/os8/v3d/EDIT 21.17.4 overwrites patch in 21.17.2. DO NOT APPLY THIS PATCH # patch $src/patches/os8/v3d/EDIT-21.17.4M-V12C.patch8 begin default fortran-iv patch $src/patches/os8/v3d/F4-21.1.2M-v4B.patch8 patch $src/patches/os8/v3d/F4-51.3.1M-v4C.patch8 patch $src/patches/os8/v3d/F4-51.3.2M-v4x.patch8 # FRTS-51.3.3-O is to enable FRTS to work with 2-page system # handlers. I've read the code but do not fully understand it. # It is plausable that it generalizes on the code that makes # the 2-page TD8E handler work. But it could also be a # patch tha tONLY works with the OS/8 Devices Extension kit QF026. # We are enabling the patch for not. If further testing shows # that it breaks TD8E support, we will turn it off. patch $src/patches/os8/v3d/FRTS-51.3.3-O.patch8 # FORLIB.RL is also patched. # FORLIB 51.10.1M creates a new FORLIB.RL with a patch # applied to DLOG.RA. # The source tree contains a FORLIB.RL made with instructions from the patch. # So the patch will not apply but is listed here for completeness. # We could build a forlib-patch.tu56 image from source now if we chose # For now we'll just copy in the hand-built binary. ## FORLIB-51.10.1M.patch8 os8 DEL SYS:FORLIB.RL cpto $src/src/os8/v3d/LANGUAGE/FORTRAN4/FORLIB.RL SYS:FORLIB.RL /I end default fortran-iv patch $src/patches/os8/v3d/FOTP-21.19.1M-V9B.patch8 # MACREL is enabled by default with no settings. # We need to avoid patching FUTIL in that default case # So we have to set a disablement of that action # Conditional on macrel default as well. begin default macrel disable futil_patch end default macrel begin default futil_patch # The two FUTIL patches only get applied to FUTIL V7 which comes with # OS/8 V3D to bring it up to V7D. # MACREL V2 comes with FUTIL V8B, so these patches are skipped # unless the user passes --disable-os8-macrel to configure. patch $src/patches/os8/v3d/FUTIL-31.21.1M-v7B.patch8 patch $src/patches/os8/v3d/FUTIL-31.21.2M-v7D.patch8 # patch $src/patches/os8/v3d/FUTIL 31.21.3O switches XS format. Recommend to leave it out. # patch $src/patches/os8/v3d/FUTIL-31.21.3O.patch8 end default futil_patch # LQP 21.49.1 consists of commands run in BUILD. # The auto-apply system won't apply it. # It has not been validated. It uses hardware we don't have. ## patch $src/patches/os8/v3d/LQP-21.49.1M-vB.patch8 patch $src/patches/os8/v3d/MCPIP-21.21M-v6B.patch8 patch $src/patches/os8/v3d/MSBAT-31.22.1M-v3B.patch8 patch $src/patches/os8/v3d/PAL8-21.22.1M-v10B.patch8 patch $src/patches/os8/v3d/PAL8-21.22.2M-v10C.patch8 patch $src/patches/os8/v3d/PAL8-21.22.3M-v10D.patch8 # PAL8 21.22.4M is for V12 PAL8. It BREAKS LS output in V10! # DO NOT APPLY THIS PATCH! # patch $src/patches/os8/v3d/PAL8-21.22.4M.patch8 patch $src/patches/os8/v3d/PIP-21.23.1M-v12B.patch8 patch $src/patches/os8/v3d/PIP10-21.24.1M-v3B.patch8 # We need SABR for C compiler. Patch it unconditionally. # begin default fortran-ii patch $src/patches/os8/v3d/SABR-21.91.1M-v18B.patch8 # end default fortran-ii patch $src/patches/os8/v3d/SET-21.26.1M-v1C.patch8 patch $src/patches/os8/v3d/SET-21.26.2M-v1D.patch8 patch $src/patches/os8/v3d/SET-21.26.3M-v1E.patch8 # patch $src/patches/os8/v3d/TECO 31.20.1 Unconditional no case flagging. Not recommended # patch $src/patches/os8/v3d/TECO-31.20.01O.patch8 # patch $src/patches/os8/v3d/TECO 31.20.2 Turns off verbose errors. Not recommended. # patch $src/patches/os8/v3d/TECO-31.20.02O.patch8 # patch $src/patches/os8/v3d/TECO 31.20.3 Turns off Yank overwrite warning. Not recommended. # patch $src/patches/os8/v3d/TECO-31.20.03O.patch8 # patch $src/patches/os8/v3d/TECO 31.20.4 Special support for VT05. Not recommended. # patch $src/patches/os8/v3d/TECO-31.20.04O.patch8 patch $src/patches/os8/v3d/TECO-31.20.05M-v5A.patch8 patch $src/patches/os8/v3d/TECO-31.20.06M-v5B.patch8 patch $src/patches/os8/v3d/TECO-31.20.07M.v5C.patch8 patch $src/patches/os8/v3d/TECO-31.20.08M-v5.04.patch8 patch $src/patches/os8/v3d/TECO-31.20.10M-v5.05.patch8 patch $src/patches/os8/v3d/TECO-31.20.11M-v5.06.patch8 patch $src/patches/os8/v3d/TECO-31.20.12M-v5.07.patch8 patch $src/patches/os8/v3d/TECO-31.20.13M-v5.08.patch8 # # MACREL, LINK, and OVDRV patches have not been validated. # The Version numbers don't all match. Some won't apply. # More work is needed before they are deemed safe. # NOT Recommended. ## MACREL-40.5.1M-v1D.patch8 ## MACREL-40.5.2M-v1E.patch8 ## LINK-40.2.1M-v1D.patch8 ## LINK-40.2.2M-v1E.patch8 ## LINK-40.2.3M-v1F.patch8 # OVRDRV 40.6.1 is a source level patch ## OVRDRV-40.6.1M-v1B-8srccom # Squish our device as our last step! os8 SQUISH DSK:/O os8 SQUISH SYS:/O |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | # Creates an OS/8 v3d source rk05 image from distribution dectapes # OS/8 Writes on the system device (architectural flaw). # Since this might be run from a parallel make, we mount the system # with the scratch option to make a unique copy. # We build with the OS8_TOOLTIME packs: v3d-patched.rk05 mount rk0 $os8mo/v3d-patched.rk05 required scratch mount rk1 $os8mo/v3d-src.rk05 new mount dt0 $os8mi/al-4691c-sa-os8-v3d-1.1978.tu56 mount dt1 $os8mi/al-4692c-sa-os8-v3d-2.1978.tu56 boot rk0 os8 ZERO RKA1: os8 ZERO RKB1: os8 COPY RKA1:<DTA0:*.* os8 COPY RKA1:<DTA1:*.* mount dt0 $os8mi/al-4693d-sa-os8-v3d-3.1978.tu56 mount dt1 $os8mi/al-4694c-sa-os8-v3d-4.1978.tu56 os8 COPY RKA1:<DTA0:*.* os8 COPY RKA1:<DTA1:*.* mount dt0 $os8mi/al-4695c-sa-os8-v3d-5.1978.tu56 mount dt1 $os8mi/al-4696c-sa-os8-v3d-6.1978.tu56 os8 COPY RKB1:<DTA0:*.* os8 COPY RKB1:<DTA1:*.* mount dt0 $os8mi/al-4697c-sa-os8-v3d-7.1978.tu56 mount dt1 $os8mi/al-4759c-sa-os8-ext-1.1978.tu56 os8 COPY RKB1:<DTA0:*.* os8 COPY RKB1:<DTA1:*.* mount dt0 $os8mi/al-4760c-sa-os8-ext-2.1978.tu56 mount dt1 $os8mi/al-5586c-sa-os8-ext-3.1978.tu56 os8 COPY RKB1:<DTA0:*.* os8 COPY RKA1:<DTA1:*.* |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | # Comments begin with an octothorpe # Blank lines are ignored. # OS/8 Writes on the system device (architectural flaw). # Since this might be run from a parallel make, we mount the system # with the scratch option to make a unique copy. # We build with the OS8_TOOLTIME packs: v3d-patched.rk05 mount rk0 $os8mo/v3d-patched.rk05 required scratch copy $obj/v3f-build.rk05 $os8mo/v3f-made.rk05 mount rk1 $os8mo/v3f-made.rk05 required boot rk0 pal8 RKB1:BUILD.BN<RKA1:BUILD.PA begin cdprog SYS:ABSLDR.SV RKB1:BUILD.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:BUILD.SV pal8 RKB1:OS8.BN<RKA1:OS8.PA pal8 RKB1:CD.BN<RKA1:CD.PA pal8 RKB1:RL0.BN<RKA1:RL0.PA pal8 RKB1:RL1.BN<RKA1:RL1.PA pal8 RKB1:RL2.BN<RKA1:RL2.PA pal8 RKB1:RL3.BN<RKA1:RL3.PA pal8 RKB1:RLC.BN<RKA1:RLC.PA pal8 RKB1:RXSY1.BN<RKA1:RXSY1.PA pal8 RKB1:RXSY2.BN<RKA1:RXSY1.PA pal8 RKB1:RXNS.BN<RKA1:RXNS.PA pal8 RKB1:BATCH.BN<RKA1:BATCH.PA begin cdprog SYS:ABSLDR.SV RKB1:BATCH.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:BATCH.SV os8 ASSIGN RKA1 IN os8 ASSIGN RKB1 OUT os8 COPY DSK:<RKA1:RESORC.BI os8 COPY DSK:<RKA1:CCL.BI os8 SUBMIT CCL.BI |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | mount rk0 $bin/v3d-patched.rk05 required scratch mount dt1 $os8mi/al-4712c-ba-os8-v3d-2.1978.tu56 ro required boot rk0 print Confirm testing for failure to start build: begin build SYS:FOO.SV end build print Now test for malformed begin end: empty name: begin build SYS:BUILD.SV end print Now test for malformed begin end: wrong name: begin build SYS:BUILD.SV end foo print Now do a simple couple BUILD commands: begin build SYS:BUILD.SV LOAD DTA1:RK8ESY.BN PRINT BOOT end build print try saving boot os8 SAVE DSK BUILD.SV print now confirm malformed FOTP command is reported begin cdprog FOTP DTA0:<NOTME.PA end cdprog FOTP print now confirm FOTP File not found errors are reported. begin cdprog SYS FOTP TTY:<NOTME.PA end cdprog SYS FOTP |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | # Tests 1 build for CUSPS mount rk0 $os8mo/v3d-patched.rk05 required scratch mount rk1 $os8mo/uni-bf2-obj.rk05 required print Build tester boot rk0 print Building LIBSET.SV pal8 RKB1:LIBSET.BN<RKA1:LIBSET.PA begin cdprog SYS:ABSLDR.SV RKB1:LIBSET.BN end cdprog SYS:ABSLDR.SV os8 SAVE RKB1:LIBSET.SV;12600=6000 os8 DEL RKB1:LIBSET.BN print Assemble Library Modules print ATAN begin cdprog RKB1:SABR.SV RKB1:ATAN.RL<RKA1:ATAN.SB end cdprog RKB1:SABR.SV print What happens if we give too many args? print SQRT / TRIG Bad. begin cdprog RKB1:SABR.SV RKB1:SQRT.RL<RKA1:SQRT.SB RKB1:TRIG.RL<RKA1:TRIG.SB end cdprog RKB1:SABR.SV enable transcript os8 DIR RKA1: disable transcript # print Use our newly build LIBSET to create LIB8.RL from our library RL files. # begin cdprog RKB1:LIBSET.SV # RKB1:LIB8.RL<*.RL # end cdprog RKB1:LIBSET.SV |
> > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 | mount rk0 $bin/v3d-patched.rk05 required mount dt0 $os8mo/copy-test.tu56 new boot rk0 os8 ZERO DTA0: cpto $os8mi/init.tx DTA0: cpto $os8mi/readme.md DTA0: cpto $src/src/os8/v3f/PIP.PA cpfrom DTA0:README.MD $build/obj/ |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # Test case for possible bug in following umount with a cpto. mount rk0 $os8mo/v3d-dist.rk05 scratch boot rk0 # U/W FOCAL begin default uwfocal mount dt1 $os8mi/subsys/uwfocal-v4e-2.tu56 ro required # resume os8 COPY RKA0:<DTA1:UWF16K.SV umount dt1 end default uwfocal # Upper Case / Lower Case batch script patches # Copy in from source tree. cpto $src/src/os8/v3d/SYSTEM/UCSYS.BI RKA0: |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | # Provokes errors mount rk0 $bin/v3d-patched.rk05 required mount dt0 $bin/scratch.tu56 boot rk0 begin enabled testing begin build SYS:BUILD DELETE SYS BOOT end build begin build SYS:BUILD INSERT FOOFY end build begin build SYS:BUILD LOAD FOOFY end build begin build SYS:BUILD PRINT DELETE SYS PRINT SYSTEM TC08 INSERT TC08,DTA0 INSERT TC,DTA1 DSK TC08:DTA0 BOOT end build end enabled testing begin build SYS:BUILD DELETE SYS,RKA0,RKB0 DELETE RXA0 INSERT RK05,RKA0,RKB0 SYSTEM TC08 INSERT TC08,DTA0 INSERT TC,DTA1 DSK TC08:DTA0 PRINT BOOT end build os8 SAVE DTA0 BUILD.SV begin cdprog RKA0:FOTP.SV DTA0:<RKA0:FOTP.SV DTA0:<RKA0:DIRECT.SV DTA0:<RKA0:CCL.SV DTA0:<RKA0:RESORC.SV # DTA0:<RKA0:PIP.SV end cdprog RKA0:FOTP.SV boot dt0 os8 DIR |
> > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # Script to create the ocomp.tu56 image that hosts the # OCOMP Octal Compare and Dump utility. # This is a low-level tool # We build with v3d-dist.rk05 because we intend to store it there. mount rk0 $os8mo/scratch.rk05 required #mount rk0 $os8mo/v3d-dist.rk05 required scratch mount dt0 $os8mo/ocomp.tu56 new boot rk0 os8 ZERO DTA0: # Copy source and doc files into the tape image. cpto $src/src/os8/tools/ocomp/ocomp.pa DTA0:OCOMP.HL cpto $src/src/os8/tools/ocomp/ocomp.pa DTA0:OCOMP.PA pal8 DTA0:OCOMP.BN<DTA0:OCOMP.PA /8/9 os8 LOAD DTA0:OCOMP.BN os8 SAVE DTA0:OCOMP.SV;12000 |
> > > > > > > > | 1 2 3 4 5 6 7 8 | mount rk0 $bin/v3d.rk05 required scratch boot rk0 print Test for file not found ocomp TTY:<NOT1.PA enable transcript ocomp TTY:<PS.C |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | mount rk0 $bin/v3d-patched.rk05 required scratch mount dt0 $os8mo/pal-test.tu56 new mount rk1 $bin/v3d-src.rk05 required boot rk0 print Create test tape os8 ZERO DTA0: cpto $os8mi/PALTST.PA DTA0: os8 COPY DTA0:<RKB1:BOOT.PA print Enable output from OS/8 commands enable transcript print Confirm right things happen when source not found. pal8 FOO.BN<FOO.PA print Same command using 'os8' os8 PAL8 FOO.BN<FOO.PA print Confirm a good build is successful: pal8 DTA0:BOOT.BN<DTA0:BOOT.PA print Same command using 'os8' os8 PAL8 DTA0:BOOT.BN<DTA0:BOOT.PA print Confirm we display errors: pal8 FOO.BN<DTA0:PALTST.PA print Same command using 'os8' os8 pal8 FOO.BN<DTA0:PALTST.PA print Test 3-arg Pal8 command. pal8 FOO.BN,FOO.LS<DTA0:BOOT.PA print Same command using 'os8' os8 PAL8 FOO.BN,FOO.LS<DTA0:BOOT.PA print Test 3-arg PAL8 command with errors. pal8 FOO.BN,FOO.LS<DTA0:PALTST print Try the same 3-arg PAL8 command via os8 with transcript os8 PAL8 FOO.BN,FOO.LS<DTA0:PALTST |
> > > > > > > > > | 1 2 3 4 5 6 7 8 9 | # Test the patch command. # copy ./v3d-dist.rk05 ./v3d-patched.rk05 mount rk0 ./v3d-patched.rk05 required boot rk0 patch ../media/os8/patches/FOTP-21.19.1M-V9B.patch8 patch ../media/os8/patches/PAL8-21.22.4M.patch8 |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | mount rk0 $bin/v3d-patched.rk05 required enable transcript boot rk0 mount dt0 $os8mi/local.tu56 restart os8 DIR DTA0: umount dt0 mount dt0 $os8mo/v3d-tc08.tu56 resume os8 DIR DTA0: |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | mount rk0 $bin/v3d-patched.rk05 required scratch boot rk0 mount dt0 $os8mo/v3d-tc08.tu56 required resume enable transcript os8 DIR DTA0: disable transcript os8 DIR RKB0: |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | # Test operation of version detection. begin version 1 print Hello Version 1 end version 1 begin version 1.0 print Hello version 1.0 end version 1.0 begin version 1.0.0 print Hello version 1.0.0 end version 1.0.0 begin version 1.0.1 print Hello version 1.0.1 end version 1.0.1 begin version 1.1 print Hello version 1.1 end version 1.1 begin version 1.1.1 print Hello version 1.1.1 end version 1.1.1 begin version 2 print Hello version 2 end version 2 begin version 2.0 print Hello version 2.0 end version 2.0 begin version 2.0.0 print Hello version 2.0.0 end version 2.0.0 begin version 2.0.1 print Hello version 2.0.1 end version 2.0.1 begin version 3 print Hello version 3 end version 3 begin version 3.2 print hello version 3.2 end version 3.2 |
︙ | ︙ | |||
1569 1570 1571 1572 1573 1574 1575 | // speed hit in my testing! (GCC 4.9.2, Raspbian Jessie on Pi 3B.) if (pidp8i_gpio && (++skip_count >= (max_skips - dither))) { // Save skips to inst counter and reset inst_count += skip_count; skip_count = 0; | | | > | | | | 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 | // speed hit in my testing! (GCC 4.9.2, Raspbian Jessie on Pi 3B.) if (pidp8i_gpio && (++skip_count >= (max_skips - dither))) { // Save skips to inst counter and reset inst_count += skip_count; skip_count = 0; // We need to update the LED data again. Unlike above, circa // line 444, we pass the final MB value, not a copy of IR, as // MB is settled by this point. set_pidp8i_leds (PC, SteadyMA, MB, IR, LAC, MQ, IF, DF, SC, int_req, Pause); // Has it been ~1s since we updated our max_skips value? time_t now; if (time(&now) > last_update) { // Yep; simulator IPS may have changed, so freshen it. last_update = now; max_skips = inst_count / pidp8i_updates_per_sec; //printf("Inst./repaint: %zu - %zu; %.2f MIPS\r\n", |
︙ | ︙ | |||
1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 | saved_DF = DF & 070000; saved_LAC = LAC & 017777; saved_MQ = MQ & 07777; pcq_r->qptr = pcq_p; /* update pc q ptr */ return reason; } /* end sim_instr */ /* Reset routine */ t_stat cpu_reset (DEVICE *dptr) { saved_LAC = 0; int_req = (int_req & ~INT_ION) | INT_NO_CIF_PENDING; saved_DF = IB = saved_PC & 070000; UF = UB = gtf = emode = 0; pcq_r = find_reg ("PCQ", NULL, dptr); if (pcq_r) pcq_r->qptr = 0; | > > > > > > > > > > > > > > > > | > > | 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 | saved_DF = DF & 070000; saved_LAC = LAC & 017777; saved_MQ = MQ & 07777; pcq_r->qptr = pcq_p; /* update pc q ptr */ return reason; } /* end sim_instr */ /* * This sequence of instructions is a mix that hopefully * represents a resonable instruction set that is a close * estimate to the normal calibrated result. */ static const char *pdp8_clock_precalibrate_commands[] = { "106 100" "-m 100 MQL MQA" "-m 101 ISZ 112", "-m 102 JMP I 106", "-m 103 JMP I 106", "PC 100", NULL}; /* Reset routine */ t_stat cpu_reset (DEVICE *dptr) { saved_LAC = 0; int_req = (int_req & ~INT_ION) | INT_NO_CIF_PENDING; saved_DF = IB = saved_PC & 070000; UF = UB = gtf = emode = 0; pcq_r = find_reg ("PCQ", NULL, dptr); if (pcq_r) pcq_r->qptr = 0; else return SCPE_IERR; sim_clock_precalibrate_commands = pdp8_clock_precalibrate_commands; sim_vm_initial_ips = 10 * SIM_INITIAL_IPS; sim_brk_types = SWMASK ('E') | SWMASK('I'); sim_brk_dflt = SWMASK ('E'); return SCPE_OK; } /* Set PC for boot (PC<14:12> will typically be 0) */ |
︙ | ︙ |
︙ | ︙ | |||
206 207 208 209 210 211 212 | { URDATAD (POS, ct_unit[0].pos, 10, T_ADDR_W, 0, CT_NUMDR, PV_LEFT | REG_RO, "position, units 0-1") }, { FLDATA (DEVNUM, ct_dib.dev, 6), REG_HRO }, { NULL } }; MTAB ct_mod[] = { | | > | > | 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 | { URDATAD (POS, ct_unit[0].pos, 10, T_ADDR_W, 0, CT_NUMDR, PV_LEFT | REG_RO, "position, units 0-1") }, { FLDATA (DEVNUM, ct_dib.dev, 6), REG_HRO }, { NULL } }; MTAB ct_mod[] = { { MTAB_XTD|MTAB_VUN, 0, "write enabled", "WRITEENABLED", &set_writelock, &show_writelock, NULL, "Write enable cassette tape" }, { MTAB_XTD|MTAB_VUN, 1, NULL, "LOCKED", &set_writelock, NULL, NULL, "Write lock cassette tape" }, // { MTAB_XTD|MTAB_VUN, 0, "FORMAT", "FORMAT", // &sim_tape_set_fmt, &sim_tape_show_fmt, NULL }, { MTAB_XTD|MTAB_VUN, 0, "CAPACITY", NULL, NULL, &sim_tape_show_capac, NULL }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", "DEVNO", &set_dev, &show_dev, NULL }, { 0 } |
︙ | ︙ | |||
325 326 327 328 329 330 331 | else old_ust = 0; /* defang next */ } if ((old_ust ^ uptr->UST) == (UST_REV|UST_GAP)) { /* rev in gap? */ if (DEBUG_PRS (ct_dev)) fprintf (sim_deb, ">>CT skip gap: op=%o, old_sta = %o, pos=%d\n", fnc, uptr->UST, uptr->pos); if (uptr->UST) /* skip file gap */ | | > | | 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 | else old_ust = 0; /* defang next */ } if ((old_ust ^ uptr->UST) == (UST_REV|UST_GAP)) { /* rev in gap? */ if (DEBUG_PRS (ct_dev)) fprintf (sim_deb, ">>CT skip gap: op=%o, old_sta = %o, pos=%d\n", fnc, uptr->UST, uptr->pos); if (uptr->UST) /* skip file gap */ (void)sim_tape_rdrecr (uptr, ct_xb, &t, CT_MAXFR); else (void)sim_tape_rdrecf (uptr, ct_xb, &t, CT_MAXFR); } } else uptr->UST = 0; ct_bptr = 0; /* init buffer */ ct_blnt = 0; uptr->FNC = fnc; /* save function */ sim_activate (uptr, ct_stime); /* schedule op */ |
︙ | ︙ |
1 2 | /* pdp8_dt.c: PDP-8 DECtape simulator | | | 1 2 3 4 5 6 7 8 9 10 | /* pdp8_dt.c: PDP-8 DECtape simulator Copyright (c) 1993-2020, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: |
︙ | ︙ | |||
21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Except as contained in this notice, the name of Robert M Supnik shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. dt TC08/TU56 DECtape 15-Mar-17 RMS Fixed dt_seterr to clear successor states 17-Sep-13 RMS Changed to use central set_bootpc routine 23-Jun-06 RMS Fixed switch conflict in ATTACH 07-Jan-06 RMS Fixed unaligned register access bug (Doug Carman) 16-Aug-05 RMS Fixed C++ declaration and cast problems 25-Jan-04 RMS Revised for device debug support 09-Jan-04 RMS Changed sim_fsize calling sequence, added STOP_OFFR | > | 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | Except as contained in this notice, the name of Robert M Supnik shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. dt TC08/TU56 DECtape 01-Jul-20 RMS Fixed comments in bootstrap (Bernhard Baehr) 15-Mar-17 RMS Fixed dt_seterr to clear successor states 17-Sep-13 RMS Changed to use central set_bootpc routine 23-Jun-06 RMS Fixed switch conflict in ATTACH 07-Jan-06 RMS Fixed unaligned register access bug (Doug Carman) 16-Aug-05 RMS Fixed C++ declaration and cast problems 25-Jan-04 RMS Revised for device debug support 09-Jan-04 RMS Changed sim_fsize calling sequence, added STOP_OFFR |
︙ | ︙ | |||
94 95 96 97 98 99 100 | Write all writes only the data words and dumps the non-data words in the bit bucket. */ #include "pdp8_defs.h" #define DT_NUMDR 8 /* #drives */ | < | | < < | 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | Write all writes only the data words and dumps the non-data words in the bit bucket. */ #include "pdp8_defs.h" #define DT_NUMDR 8 /* #drives */ #define UNIT_V_8FMT (UNIT_V_UF + 0) /* 12b format */ #define UNIT_V_11FMT (UNIT_V_UF + 1) /* 16b format */ #define UNIT_8FMT (1 << UNIT_V_8FMT) #define UNIT_11FMT (1 << UNIT_V_11FMT) #define STATE u3 /* unit state */ #define LASTT u4 /* last time update */ #define WRITTEN u5 /* device buffer is dirty and needs flushing */ #define DT_WC 07754 /* word count */ #define DT_CA 07755 /* current addr */ /* System independent DECtape constants */ #define DT_LPERMC 6 /* lines per mark track */ #define DT_BLKWD 1 /* blk no word in h/t */ #define DT_CSMWD 4 /* checksum word in h/t */ #define DT_HTWRD 5 /* header/trailer words */ |
︙ | ︙ | |||
346 347 348 349 350 351 352 | DT_NUMDR, REG_HRO) }, { FLDATAD (STOP_OFFR, dt_stopoffr, 0, "stop on off-reel error") }, { ORDATA (DEVNUM, dt_dib.dev, 6), REG_HRO }, { NULL } }; MTAB dt_mod[] = { | | > | > | 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 | DT_NUMDR, REG_HRO) }, { FLDATAD (STOP_OFFR, dt_stopoffr, 0, "stop on off-reel error") }, { ORDATA (DEVNUM, dt_dib.dev, 6), REG_HRO }, { NULL } }; MTAB dt_mod[] = { { MTAB_XTD|MTAB_VUN, 0, "write enabled", "WRITEENABLED", &set_writelock, &show_writelock, NULL, "Write enable drive" }, { MTAB_XTD|MTAB_VUN, 1, NULL, "LOCKED", &set_writelock, NULL, NULL, "Write lock drive" }, { UNIT_8FMT + UNIT_11FMT, 0, "18b", NULL, NULL }, { UNIT_8FMT + UNIT_11FMT, UNIT_8FMT, "12b", NULL, NULL }, { UNIT_8FMT + UNIT_11FMT, UNIT_11FMT, "16b", NULL, NULL }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", "DEVNO", &set_dev, &show_dev, NULL }, { 0 } }; |
︙ | ︙ | |||
974 975 976 977 978 979 980 | } /* ignore hdr */ sim_activate (uptr, DT_WSIZE * dt_ltime); if (M[DT_WC] == 0) dt_substate = DTO_WCO; if (((dtsa & DTA_MODE) == 0) || (M[DT_WC] == 0)) dtsb = dtsb | DTB_DTF; /* set DTF */ | | | 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 | } /* ignore hdr */ sim_activate (uptr, DT_WSIZE * dt_ltime); if (M[DT_WC] == 0) dt_substate = DTO_WCO; if (((dtsa & DTA_MODE) == 0) || (M[DT_WC] == 0)) dtsb = dtsb | DTB_DTF; /* set DTF */ break; case DTO_WCO: case DTO_WCO | DTO_SOB: /* all done */ dt_schedez (uptr, dir); /* sched end zone */ break; } /* end case substate */ break; |
︙ | ︙ | |||
1161 1162 1163 1164 1165 1166 1167 | doesn't work with the disk monitor. */ #define BOOT_START 0200 #define BOOT_LEN (sizeof (boot_rom) / sizeof (int16)) static const uint16 boot_rom[] = { | | | | 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 | doesn't work with the disk monitor. */ #define BOOT_START 0200 #define BOOT_LEN (sizeof (boot_rom) / sizeof (int16)) static const uint16 boot_rom[] = { 07600, /* 200, CLA ; group 2 */ 01216, /* TAD MVB ; move back */ 04210, /* JMS DO ; action */ 01217, /* TAD K7577 ; addr */ 03620, /* DCA I CA */ 01222, /* TAD RDF ; read fwd */ 04210, /* JMS DO ; action */ 05600, /* JMP I 200 ; enter boot */ 00000, /* DO, 0 */ 06766, /* DTCA!DTXA ; start tape */ 03621, /* DCA I WC ; clear wc */ 06771, /* DTSF ; wait */ 05213, /* JMP .-1 */ 05610, /* JMP I DO */ 00600, /* MVB, 0600 */ 07577, /* K7577, 7577 */ 07755, /* CA, 7755 */ 07754, /* WC, 7754 */ 00220 /* RF, 0220 */ }; t_stat dt_boot (int32 unitno, DEVICE *dptr) { |
︙ | ︙ | |||
1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 | { uint32 pdp18b[D18_NBSIZE]; uint16 pdp11b[D18_NBSIZE], *fbuf; int32 i, k; uint32 ba; if (uptr->WRITTEN && uptr->hwmark && ((uptr->flags & UNIT_RO)== 0)) { /* any data? */ rewind (uptr->fileref); /* start of file */ fbuf = (uint16 *) uptr->filebuf; /* file buffer */ if (uptr->flags & UNIT_8FMT) /* PDP8? */ fxwrite (uptr->filebuf, sizeof (uint16), /* write file */ uptr->hwmark, uptr->fileref); else { /* 16b/18b */ for (ba = 0; ba < uptr->hwmark; ) { /* loop thru buf */ | > | 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 | { uint32 pdp18b[D18_NBSIZE]; uint16 pdp11b[D18_NBSIZE], *fbuf; int32 i, k; uint32 ba; if (uptr->WRITTEN && uptr->hwmark && ((uptr->flags & UNIT_RO)== 0)) { /* any data? */ sim_printf ("%s: writing buffer to file: %s\n", sim_uname (uptr), uptr->filename); rewind (uptr->fileref); /* start of file */ fbuf = (uint16 *) uptr->filebuf; /* file buffer */ if (uptr->flags & UNIT_8FMT) /* PDP8? */ fxwrite (uptr->filebuf, sizeof (uint16), /* write file */ uptr->hwmark, uptr->fileref); else { /* 16b/18b */ for (ba = 0; ba < uptr->hwmark; ) { /* loop thru buf */ |
︙ | ︙ | |||
1334 1335 1336 1337 1338 1339 1340 | sim_cancel (uptr); if ((u == DTA_GETUNIT (dtsa)) && (dtsa & DTA_STSTP)) { dtsb = dtsb | DTB_ERF | DTB_SEL | DTB_DTF; DT_UPDINT; } uptr->STATE = uptr->pos = 0; } | | < | < | 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 | sim_cancel (uptr); if ((u == DTA_GETUNIT (dtsa)) && (dtsa & DTA_STSTP)) { dtsb = dtsb | DTB_ERF | DTB_SEL | DTB_DTF; DT_UPDINT; } uptr->STATE = uptr->pos = 0; } if (uptr->hwmark && ((uptr->flags & UNIT_RO)== 0)) /* any data? */ dt_flush (uptr); /* end if hwmark */ free (uptr->filebuf); /* release buf */ uptr->flags = uptr->flags & ~UNIT_BUF; /* clear buf flag */ uptr->filebuf = NULL; /* clear buf ptr */ uptr->flags = (uptr->flags | UNIT_8FMT) & ~UNIT_11FMT; /* default fmt */ uptr->capac = DT_CAPAC; /* default size */ return detach_unit (uptr); } const char *dt_description (DEVICE *dptr) { return "TC08/TU56 DECtape"; } |
︙ | ︙ | |||
173 174 175 176 177 178 179 180 181 182 183 184 185 186 | /* Attach routine */ t_stat lpt_attach (UNIT *uptr, CONST char *cptr) { t_stat reason; reason = attach_unit (uptr, cptr); lpt_err = (lpt_unit.flags & UNIT_ATT) == 0; return reason; } /* Detach routine */ | > | 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | /* Attach routine */ t_stat lpt_attach (UNIT *uptr, CONST char *cptr) { t_stat reason; sim_switches |= SWMASK ('A'); /* Default to Append to existing file */ reason = attach_unit (uptr, cptr); lpt_err = (lpt_unit.flags & UNIT_ATT) == 0; return reason; } /* Detach routine */ |
︙ | ︙ |
︙ | ︙ | |||
197 198 199 200 201 202 203 | { URDATAD (POS, mt_unit[0].pos, 10, T_ADDR_W, 0, MT_NUMDR, PV_LEFT | REG_RO, "position, units 0 to 7") }, { FLDATA (DEVNUM, mt_dib.dev, 6), REG_HRO }, { NULL } }; MTAB mt_mod[] = { | | > | > | 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 | { URDATAD (POS, mt_unit[0].pos, 10, T_ADDR_W, 0, MT_NUMDR, PV_LEFT | REG_RO, "position, units 0 to 7") }, { FLDATA (DEVNUM, mt_dib.dev, 6), REG_HRO }, { NULL } }; MTAB mt_mod[] = { { MTAB_XTD|MTAB_VUN, 0, "write enabled", "WRITEENABLED", &set_writelock, &show_writelock, NULL, "Write ring in place" }, { MTAB_XTD|MTAB_VUN, 1, NULL, "LOCKED", &set_writelock, NULL, NULL, "no Write ring in place" }, { MTAB_XTD|MTAB_VUN, 0, "FORMAT", "FORMAT", &sim_tape_set_fmt, &sim_tape_show_fmt, NULL }, { MTAB_XTD|MTAB_VUN, 0, "CAPACITY", "CAPACITY", &sim_tape_set_capac, &sim_tape_show_capac, NULL }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", "DEVNO", &set_dev, &show_dev, NULL }, { 0 } |
︙ | ︙ | |||
271 272 273 274 275 276 277 | mt_sta = mt_sta | STA_ILL | STA_ERR; /* illegal op error */ mt_set_done (); /* set done */ mt_updcsta (uptr); /* update status */ return 0; } uptr->USTAT = uptr->USTAT & STA_WLK; /* clear status */ if (f == FN_UNLOAD) { /* unload? */ | | | 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 | mt_sta = mt_sta | STA_ILL | STA_ERR; /* illegal op error */ mt_set_done (); /* set done */ mt_updcsta (uptr); /* update status */ return 0; } uptr->USTAT = uptr->USTAT & STA_WLK; /* clear status */ if (f == FN_UNLOAD) { /* unload? */ sim_tape_detach (uptr); /* set offline */ uptr->USTAT = STA_REW | STA_REM; /* rewinding, off */ mt_set_done (); /* set done */ } else if (f == FN_REWIND) { /* rewind */ uptr->USTAT = uptr->USTAT | STA_REW; /* rewinding */ mt_set_done (); /* set done */ } |
︙ | ︙ |
︙ | ︙ | |||
42 43 44 45 46 47 48 49 50 51 52 53 54 55 | int32 ptr (int32 IR, int32 AC); int32 ptp (int32 IR, int32 AC); t_stat ptr_svc (UNIT *uptr); t_stat ptp_svc (UNIT *uptr); t_stat ptr_reset (DEVICE *dptr); t_stat ptp_reset (DEVICE *dptr); t_stat ptr_boot (int32 unitno, DEVICE *dptr); const char *ptr_description (DEVICE *dptr); const char *ptp_description (DEVICE *dptr); /* PTR data structures ptr_dev PTR device descriptor | > | 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | int32 ptr (int32 IR, int32 AC); int32 ptp (int32 IR, int32 AC); t_stat ptr_svc (UNIT *uptr); t_stat ptp_svc (UNIT *uptr); t_stat ptr_reset (DEVICE *dptr); t_stat ptp_reset (DEVICE *dptr); t_stat ptp_attach (UNIT *uptr, CONST char *cptr); t_stat ptr_boot (int32 unitno, DEVICE *dptr); const char *ptr_description (DEVICE *dptr); const char *ptp_description (DEVICE *dptr); /* PTR data structures ptr_dev PTR device descriptor |
︙ | ︙ | |||
119 120 121 122 123 124 125 | { 0 } }; DEVICE ptp_dev = { "PTP", &ptp_unit, ptp_reg, ptp_mod, 1, 10, 31, 1, 8, 8, NULL, NULL, &ptp_reset, | | | 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | { 0 } }; DEVICE ptp_dev = { "PTP", &ptp_unit, ptp_reg, ptp_mod, 1, 10, 31, 1, 8, 8, NULL, NULL, &ptp_reset, NULL, &ptp_attach, NULL, &ptp_dib, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, &ptp_description }; /* Paper tape reader: IOT routine */ |
︙ | ︙ | |||
255 256 257 258 259 260 261 262 263 264 265 266 267 268 | ptp_unit.buf = 0; dev_done = dev_done & ~INT_PTP; /* clear done, int */ int_req = int_req & ~INT_PTP; int_enable = int_enable | INT_PTP; /* set enable */ sim_cancel (&ptp_unit); /* deactivate unit */ return SCPE_OK; } /* Bootstrap routine */ #define BOOT_START 07756 #define BOOT_LEN (sizeof (boot_rom) / sizeof (int16)) static const uint16 boot_rom[] = { | > > > > > > > > | 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 | ptp_unit.buf = 0; dev_done = dev_done & ~INT_PTP; /* clear done, int */ int_req = int_req & ~INT_PTP; int_enable = int_enable | INT_PTP; /* set enable */ sim_cancel (&ptp_unit); /* deactivate unit */ return SCPE_OK; } /* Attach routine */ t_stat ptp_attach (UNIT *uptr, CONST char *cptr) { sim_switches |= SWMASK ('A'); /* Default to Append to existing file */ return attach_unit (uptr, cptr); } /* Bootstrap routine */ #define BOOT_START 07756 #define BOOT_LEN (sizeof (boot_rom) / sizeof (int16)) static const uint16 boot_rom[] = { |
︙ | ︙ |
︙ | ︙ | |||
129 130 131 132 133 134 135 | t_stat rf_set_size (UNIT *uptr, int32 val, CONST char *cptr, void *desc); const char *rf_description (DEVICE *dptr); /* RF08 data structures rf_dev RF device descriptor rf_unit RF unit descriptor | | | | | > | | | 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | t_stat rf_set_size (UNIT *uptr, int32 val, CONST char *cptr, void *desc); const char *rf_description (DEVICE *dptr); /* RF08 data structures rf_dev RF device descriptor rf_unit RF unit descriptor pcell_unit photocell timing unit rf_reg RF register list */ DIB rf_dib = { DEV_RF, 5, { &rf60, &rf61, &rf62, NULL, &rf64 } }; UNIT rf_units[] = { { UDATA (&rf_svc, UNIT_FIX+UNIT_ATTABLE+ UNIT_BUFABLE+UNIT_MUSTBUF, RF_DKSIZE) }, { UDATA (&pcell_svc, UNIT_DIS, 0) } }; #define rf_unit rf_units[0] #define pcell_unit rf_units[1] REG rf_reg[] = { { ORDATAD (STA, rf_sta, 12, "status") }, { ORDATAD (DA, rf_da, 20, "low order disk address") }, { ORDATAD (WC, M[RF_WC], 12, "word count (in memory)"), REG_FIT }, { ORDATAD (MA, M[RF_MA], 12, "memory address (in memory)"), REG_FIT }, { FLDATAD (DONE, rf_done, 0, "device done flag") }, |
︙ | ︙ | |||
170 171 172 173 174 175 176 | { UNIT_AUTO, UNIT_AUTO, "autosize", "AUTOSIZE", NULL }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", "DEVNO", &set_dev, &show_dev, NULL }, { 0 } }; DEVICE rf_dev = { | | | | 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | { UNIT_AUTO, UNIT_AUTO, "autosize", "AUTOSIZE", NULL }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", "DEVNO", &set_dev, &show_dev, NULL }, { 0 } }; DEVICE rf_dev = { "RF", rf_units, rf_reg, rf_mod, 2, 8, 20, 1, 8, 12, NULL, NULL, &rf_reset, &rf_boot, &rf_attach, NULL, &rf_dib, DEV_DISABLE | DEV_DIS, 0, NULL, NULL, NULL, NULL, NULL, NULL, &rf_description }; |
︙ | ︙ |
︙ | ︙ | |||
47 48 49 50 51 52 53 | #define RK_SIZE (RK_NUMCY * RK_NUMSF * RK_NUMSC * RK_NUMWD) /* words/drive */ #define RK_NUMDR 4 /* drives/controller */ #define RK_M_NUMDR 03 /* Flags in the unit flags word */ | | < | < | 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #define RK_SIZE (RK_NUMCY * RK_NUMSF * RK_NUMSC * RK_NUMWD) /* words/drive */ #define RK_NUMDR 4 /* drives/controller */ #define RK_M_NUMDR 03 /* Flags in the unit flags word */ #define UNIT_V_SWLK (UNIT_V_UF + 0) /* swre write lock */ #define UNIT_HWLK UNIT_WPRT #define UNIT_SWLK (1 << UNIT_V_SWLK) /* Parameters in the unit descriptor */ #define CYL u3 /* current cylinder */ #define FUNC u4 /* function */ /* Status register */ |
︙ | ︙ | |||
177 178 179 180 181 182 183 | { DRDATAD (RTIME, rk_rwait, 24, "rotational delay"), PV_LEFT }, { FLDATAD (STOP_IOE, rk_stopioe, 0, "stop on I/O error") }, { ORDATA (DEVNUM, rk_dib.dev, 6), REG_HRO }, { NULL } }; MTAB rk_mod[] = { | | > | > | 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | { DRDATAD (RTIME, rk_rwait, 24, "rotational delay"), PV_LEFT }, { FLDATAD (STOP_IOE, rk_stopioe, 0, "stop on I/O error") }, { ORDATA (DEVNUM, rk_dib.dev, 6), REG_HRO }, { NULL } }; MTAB rk_mod[] = { { MTAB_XTD|MTAB_VUN, 0, "write enabled", "WRITEENABLED", &set_writelock, &show_writelock, NULL, "Write enable drive" }, { MTAB_XTD|MTAB_VUN, 1, NULL, "LOCKED", &set_writelock, NULL, NULL, "Write lock drive" }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", "DEVNO", &set_dev, &show_dev, NULL }, { 0 } }; DEVICE rk_dev = { "RK", rk_unit, rk_reg, rk_mod, |
︙ | ︙ | |||
302 303 304 305 306 307 308 | rk_sta = rk_sta | RKS_DONE | RKS_NRDY | RKS_STAT; return; } if (sim_is_active (uptr) || (cyl >= RK_NUMCY)) { /* busy or bad cyl? */ rk_sta = rk_sta | RKS_DONE | RKS_STAT; return; } | | | 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 | rk_sta = rk_sta | RKS_DONE | RKS_NRDY | RKS_STAT; return; } if (sim_is_active (uptr) || (cyl >= RK_NUMCY)) { /* busy or bad cyl? */ rk_sta = rk_sta | RKS_DONE | RKS_STAT; return; } if ((func == RKC_WRITE) && (uptr->flags & (UNIT_HWLK|UNIT_SWLK))) { rk_sta = rk_sta | RKS_DONE | RKS_WLK; /* write and locked? */ return; } if (func == RKC_WLK) { /* write lock? */ uptr->flags = uptr->flags | UNIT_SWLK; rk_sta = rk_sta | RKS_DONE; return; |
︙ | ︙ | |||
358 359 360 361 362 363 364 | if ((uptr->flags & UNIT_ATT) == 0) { /* not att? abort */ rk_sta = rk_sta | RKS_DONE | RKS_NRDY | RKS_STAT; rk_busy = 0; RK_INT_UPDATE; return IORETURN (rk_stopioe, SCPE_UNATT); } | | | 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 | if ((uptr->flags & UNIT_ATT) == 0) { /* not att? abort */ rk_sta = rk_sta | RKS_DONE | RKS_NRDY | RKS_STAT; rk_busy = 0; RK_INT_UPDATE; return IORETURN (rk_stopioe, SCPE_UNATT); } if ((uptr->FUNC == RKC_WRITE) && (uptr->flags & (UNIT_HWLK|UNIT_SWLK))) { rk_sta = rk_sta | RKS_DONE | RKS_WLK; /* write and locked? */ rk_busy = 0; RK_INT_UPDATE; return SCPE_OK; } pa = GET_MEX (rk_cmd) | rk_ma; /* phys address */ |
︙ | ︙ |
︙ | ︙ | |||
60 61 62 63 64 65 66 | #define RL01_SIZE (RL_NUMCY*RL_NUMSF*RL_NUMSC*RL_NUMBY) /* words/drive */ #define RL02_SIZE (RL01_SIZE * 2) /* words/drive */ #define RL_BBMAP 014 /* sector for bblk map */ #define RL_BBID 0123 /* ID for bblk map */ /* Flags in the unit flags word */ | < | | | < < | 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #define RL01_SIZE (RL_NUMCY*RL_NUMSF*RL_NUMSC*RL_NUMBY) /* words/drive */ #define RL02_SIZE (RL01_SIZE * 2) /* words/drive */ #define RL_BBMAP 014 /* sector for bblk map */ #define RL_BBID 0123 /* ID for bblk map */ /* Flags in the unit flags word */ #define UNIT_V_RL02 (UNIT_V_UF + 0) /* RL01 vs RL02 */ #define UNIT_V_AUTO (UNIT_V_UF + 1) /* autosize enable */ #define UNIT_V_DUMMY (UNIT_V_UF + 2) /* dummy flag */ #define UNIT_DUMMY (1u << UNIT_V_DUMMY) #define UNIT_RL02 (1u << UNIT_V_RL02) #define UNIT_AUTO (1u << UNIT_V_AUTO) /* Parameters in the unit descriptor */ #define TRK u3 /* current cylinder */ #define STAT u4 /* status */ /* RLDS, NI = not implemented, * = kept in STAT, ^ = kept in TRK */ |
︙ | ︙ | |||
227 228 229 230 231 232 233 | RL_NUMDR, PV_LEFT + REG_HRO) }, { FLDATAD (STOP_IOE, rl_stopioe, 0, "stop on I/O error") }, { ORDATA (DEVNUM, rl_dib.dev, 6), REG_HRO }, { NULL } }; MTAB rl_mod[] = { | | > | > | 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | RL_NUMDR, PV_LEFT + REG_HRO) }, { FLDATAD (STOP_IOE, rl_stopioe, 0, "stop on I/O error") }, { ORDATA (DEVNUM, rl_dib.dev, 6), REG_HRO }, { NULL } }; MTAB rl_mod[] = { { MTAB_XTD|MTAB_VUN, 0, "write enabled", "WRITEENABLED", &set_writelock, &show_writelock, NULL, "Write enable drive" }, { MTAB_XTD|MTAB_VUN, 1, NULL, "LOCKED", &set_writelock, NULL, NULL, "Write lock drive" }, { UNIT_DUMMY, 0, NULL, "BADBLOCK", &rl_set_bad }, { (UNIT_RL02+UNIT_ATT), UNIT_ATT, "RL01", NULL, NULL }, { (UNIT_RL02+UNIT_ATT), (UNIT_RL02+UNIT_ATT), "RL02", NULL, NULL }, { (UNIT_AUTO+UNIT_RL02+UNIT_ATT), 0, "RL01", NULL, NULL }, { (UNIT_AUTO+UNIT_RL02+UNIT_ATT), UNIT_RL02, "RL02", NULL, NULL }, { (UNIT_AUTO+UNIT_ATT), UNIT_AUTO, "autosize", NULL, NULL }, { UNIT_AUTO, UNIT_AUTO, NULL, "AUTOSIZE", NULL }, |
︙ | ︙ |
︙ | ︙ | |||
66 67 68 69 70 71 72 | #define RX2_NUMBY 256 #define RX_NUMWD (RX_NUMBY / 2) /* words/sector */ #define RX2_NUMWD (RX2_NUMBY / 2) #define RX_SIZE (RX_NUMTR * RX_NUMSC * RX_NUMBY) /* bytes/disk */ #define RX2_SIZE (RX_NUMTR * RX_NUMSC * RX2_NUMBY) #define RX_NUMDR 2 /* drives/controller */ #define RX_M_NUMDR 01 | < | | < < | 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #define RX2_NUMBY 256 #define RX_NUMWD (RX_NUMBY / 2) /* words/sector */ #define RX2_NUMWD (RX2_NUMBY / 2) #define RX_SIZE (RX_NUMTR * RX_NUMSC * RX_NUMBY) /* bytes/disk */ #define RX2_SIZE (RX_NUMTR * RX_NUMSC * RX2_NUMBY) #define RX_NUMDR 2 /* drives/controller */ #define RX_M_NUMDR 01 #define UNIT_V_DEN (UNIT_V_UF + 0) /* double density */ #define UNIT_V_AUTO (UNIT_V_UF + 1) /* autosize */ #define UNIT_DEN (1u << UNIT_V_DEN) #define UNIT_AUTO (1u << UNIT_V_AUTO) #define IDLE 0 /* idle state */ #define CMD8 1 /* 8b cmd, ho next */ #define RWDS 2 /* rw, sect next */ #define RWDT 3 /* rw, track next */ #define RWXFR 4 /* rw, transfer */ #define FILL 5 /* fill buffer */ |
︙ | ︙ | |||
189 190 191 192 193 194 195 | { URDATA (CAPAC, rx_unit[0].capac, 10, T_ADDR_W, 0, RX_NUMDR, REG_HRO | PV_LEFT) }, { ORDATA (DEVNUM, rx_dib.dev, 6), REG_HRO }, { NULL } }; MTAB rx_mod[] = { | | > | > | 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 | { URDATA (CAPAC, rx_unit[0].capac, 10, T_ADDR_W, 0, RX_NUMDR, REG_HRO | PV_LEFT) }, { ORDATA (DEVNUM, rx_dib.dev, 6), REG_HRO }, { NULL } }; MTAB rx_mod[] = { { MTAB_XTD|MTAB_VUN, 0, "write enabled", "WRITEENABLED", &set_writelock, &show_writelock, NULL, "Write enable floppy drive" }, { MTAB_XTD|MTAB_VUN, 1, NULL, "LOCKED", &set_writelock, NULL, NULL, "Write lock floppy drive" }, { MTAB_XTD | MTAB_VDV, 1, NULL, "RX28", &rx_settype, NULL, NULL }, { MTAB_XTD | MTAB_VDV, 0, NULL, "RX8E", &rx_settype, NULL, NULL }, { MTAB_XTD | MTAB_VDV, 0, "TYPE", NULL, NULL, &rx_showtype, NULL }, { (UNIT_DEN+UNIT_ATT), UNIT_ATT, "single density", NULL, NULL }, { (UNIT_DEN+UNIT_ATT), (UNIT_DEN+UNIT_ATT), "double density", NULL, NULL }, { (UNIT_AUTO+UNIT_DEN+UNIT_ATT), 0, "single density", NULL, NULL }, { (UNIT_AUTO+UNIT_DEN+UNIT_ATT), UNIT_DEN, "double density", NULL, NULL }, |
︙ | ︙ |
︙ | ︙ | |||
111 112 113 114 115 116 117 | &dt_dev, &td_dev, &mt_dev, &ct_dev, NULL }; | | | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | &dt_dev, &td_dev, &mt_dev, &ct_dev, NULL }; const char *sim_stop_messages[SCPE_BASE] = { "Unknown error", "Unimplemented instruction", "HALT instruction", "Breakpoint", "Opcode Breakpoint", "Non-standard device number", "DECtape off reel", |
︙ | ︙ | |||
173 174 175 176 177 178 179 | int32 sim_bin_getc (FILE *fi, uint32 *newf) { int32 c, rubout; rubout = 0; /* clear toggle */ while ((c = getc (fi)) != EOF) { /* read char */ | > | | > > > | > | | > | | | | | | | < | | > | > > > > > | > | > > > > > | > > > | | > > > > > > > > > > > > > > > > > > | > | > > > > | | 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 | int32 sim_bin_getc (FILE *fi, uint32 *newf) { int32 c, rubout; rubout = 0; /* clear toggle */ while ((c = getc (fi)) != EOF) { /* read char */ if (rubout) { /* skipping chars */ if (c == 0377) /* ending rubout? */ rubout = 0; /* clr, skip */ else continue; /* skip charactder */ } if (c == 0377) /* rubout? */ rubout = 1; /* set, skip */ else if (c > 0200) /* channel 8 set? */ *newf = (c & 070) << 9; /* change field */ else return c; /* otherwise ok */ } return EOF; } t_stat sim_load_bin (FILE *fi, t_bool do_load) { int32 hi, lo, wd, csum, t; uint32 field, newf, origin, words; int32 sections_read = 0; for (;;) { csum = origin = field = newf = words = 0; /* init */ do { /* skip leader */ if ((hi = sim_bin_getc (fi, &newf)) == EOF) { if (sections_read != 0) return sim_messagef (SCPE_OK, "%d section%s sucessfully read\n", sections_read, (sections_read != 1) ? "s" : ""); else return (!do_load) ? SCPE_ARG : sim_messagef (SCPE_FMT, "unexpected binary loader data format\n"); } } while ((hi == 0) || (hi >= 0200)); for (;;) { /* data blocks */ if ((lo = sim_bin_getc (fi, &newf)) == EOF) { /* low char */ if (sections_read != 0) sim_messagef (SCPE_OK, "%d section%s sucessfully read\n", sections_read, (sections_read != 1) ? "s" : ""); if (words != 0) sim_messagef (SCPE_OK, "%d %swords stored\n", words, (sections_read != 0) ? "additional " : ""); return (!do_load) ? SCPE_FMT : sim_messagef (SCPE_FMT, "unexpected binary loader data format\n"); } wd = (hi << 6) | lo; /* form word */ t = hi; /* save for csum */ if ((hi = sim_bin_getc (fi, &newf)) == EOF) { /* next char */ if (sections_read != 0) sim_messagef (SCPE_OK, "%d section%s sucessfully read\n", sections_read, (sections_read != 1) ? "s" : ""); if (words != 0) sim_messagef (SCPE_OK, "%d %swords stored\n", words, (sections_read != 0) ? "additional " : ""); return (!do_load) ? SCPE_FMT : sim_messagef (SCPE_FMT, "unexpected binary loader data format\n"); } if (hi == 0200) { /* end of tape? */ if ((csum - wd) & 07777) { /* valid csum? */ if (sections_read != 0) sim_messagef (SCPE_OK, "%d section%s sucessfully read\n", sections_read, (sections_read != 1) ? "s" : ""); if (words != 0) sim_messagef (SCPE_OK, "%d %swords stored\n", words, (sections_read != 0) ? "additional " : ""); return (!do_load) ? SCPE_CSUM : sim_messagef (SCPE_CSUM, "unexpected binary loader checksum\n"); } if (!(sim_switches & SWMASK ('A'))) { /* Don't Load all sections? */ if (do_load) { /* Loaded initial section? */ int32 saved_switches = sim_switches; t_stat extra; sim_switches |= SWMASK ('Q'); extra = sim_load_bin (fi, FALSE); /* Check for more sections */ sim_switches = saved_switches; if (extra == SCPE_OK) { sim_messagef (SCPE_OK, "initial section loaded - more sections are available\n"); sim_messagef (SCPE_OK, "use LOAD -A <filename> to load all sections\n");; } else if (extra != SCPE_ARG) sim_messagef (SCPE_OK, "initial section loaded - badly formatted additional binary data exists\n"); } return SCPE_OK; } sections_read++; break; } csum = csum + t + lo; /* add to csum */ if (wd > 07777) /* chan 7 set? */ origin = wd & 07777; /* new origin */ else { /* no, data */ if ((field | origin) >= MEMSIZE) return SCPE_NXM; if (do_load) M[field | origin] = wd; origin = (origin + 1) & 07777; } ++words; field = newf; /* update field */ } } return SCPE_IERR; } /* Binary loader Two loader formats are supported: RIM loader (-r) and BIN (-b) loader. */ t_stat sim_load (FILE *fileref, CONST char *cptr, CONST char *fnam, int flag) { if (*cptr != 0) return SCPE_ARG; if (flag != 0) return sim_messagef (SCPE_UNK, "DUMP command not implemented in this simulator\n" "You can capture memory contents into a file via:\n" "EXAMINE @outputfile.txt 0-7777\n"); if ((sim_switches & SWMASK ('R')) || /* RIM format? */ (match_ext (fnam, "RIM") && !(sim_switches & SWMASK ('B')))) return sim_load_rim (fileref); else return sim_load_bin (fileref, TRUE); /* no, BIN */ } /* Symbol tables */ #define I_V_FL 18 /* flag start */ #define I_M_FL 07 /* flag mask */ #define I_V_NPN 0 /* no operand */ |
︙ | ︙ |
︙ | ︙ | |||
78 79 80 81 82 83 84 | Write modifies only the data words and dumps the non-data words in the bit bucket. */ #include "pdp8_defs.h" #define DT_NUMDR 2 /* #drives */ | < | | < < | 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | Write modifies only the data words and dumps the non-data words in the bit bucket. */ #include "pdp8_defs.h" #define DT_NUMDR 2 /* #drives */ #define UNIT_V_8FMT (UNIT_V_UF + 0) /* 12b format */ #define UNIT_V_11FMT (UNIT_V_UF + 1) /* 16b format */ #define UNIT_8FMT (1 << UNIT_V_8FMT) #define UNIT_11FMT (1 << UNIT_V_11FMT) #define STATE u3 /* unit state */ #define LASTT u4 /* last time update */ #define WRITTEN u5 /* device buffer is dirty and needs flushing */ /* System independent DECtape constants */ #define DT_LPERMC 6 /* lines per mark track */ #define DT_EZLIN (8192 * DT_LPERMC) /* end zone length */ #define DT_BFLIN (200 * DT_LPERMC) /* end zone buffer */ #define DT_HTLIN (5 * DT_LPERMC) /* lines per hdr/trlr */ |
︙ | ︙ | |||
248 249 250 251 252 253 254 | DT_NUMDR, REG_HRO) }, { FLDATAD (STOP_OFFR, td_stopoffr, 0, "stop on off-reel error") }, { ORDATA (DEVNUM, td_dib.dev, 6), REG_HRO }, { NULL } }; MTAB td_mod[] = { | | > | > | 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 | DT_NUMDR, REG_HRO) }, { FLDATAD (STOP_OFFR, td_stopoffr, 0, "stop on off-reel error") }, { ORDATA (DEVNUM, td_dib.dev, 6), REG_HRO }, { NULL } }; MTAB td_mod[] = { { MTAB_XTD|MTAB_VUN, 0, "write enabled", "WRITEENABLED", &set_writelock, &show_writelock, NULL, "Write enable drive" }, { MTAB_XTD|MTAB_VUN, 1, NULL, "LOCKED", &set_writelock, NULL, NULL, "Write lock drive" }, { UNIT_8FMT + UNIT_11FMT, 0, "18b", NULL, NULL }, { UNIT_8FMT + UNIT_11FMT, UNIT_8FMT, "12b", NULL, NULL }, { UNIT_8FMT + UNIT_11FMT, UNIT_11FMT, "16b", NULL, NULL }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", "DEVNO", &set_dev, &show_dev, NULL }, { MTAB_XTD|MTAB_VUN|MTAB_NMO, 0, "POSITION", NULL, NULL, &td_show_pos }, { 0 } |
︙ | ︙ | |||
408 409 410 411 412 413 414 | This routine uses the relative (integer) time, rather than the absolute (floating point) time, to allow save and restore of the start times. */ t_bool td_setpos (UNIT *uptr) { uint32 new_time, ut, ulin, udelt; | | | 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 | This routine uses the relative (integer) time, rather than the absolute (floating point) time, to allow save and restore of the start times. */ t_bool td_setpos (UNIT *uptr) { uint32 new_time, ut, ulin, udelt; int32 delta = 0; new_time = sim_grtime (); /* current time */ ut = new_time - uptr->LASTT; /* elapsed time */ if (ut == 0) /* no time gone? exit */ return FALSE; uptr->LASTT = new_time; /* update last time */ switch (uptr->STATE & ~STA_DIR) { /* case on motion */ |
︙ | ︙ | |||
866 867 868 869 870 871 872 873 874 875 876 877 878 879 | { uint32 pdp18b[D18_NBSIZE]; uint16 pdp11b[D18_NBSIZE], *fbuf; int32 i, k; uint32 ba; if (uptr->WRITTEN && uptr->hwmark && ((uptr->flags & UNIT_RO)== 0)) { /* any data? */ rewind (uptr->fileref); /* start of file */ fbuf = (uint16 *) uptr->filebuf; /* file buffer */ if (uptr->flags & UNIT_8FMT) /* PDP8? */ fxwrite (uptr->filebuf, sizeof (uint16), /* write file */ uptr->hwmark, uptr->fileref); else { /* 16b/18b */ for (ba = 0; ba < uptr->hwmark; ) { /* loop thru buf */ | > | 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 | { uint32 pdp18b[D18_NBSIZE]; uint16 pdp11b[D18_NBSIZE], *fbuf; int32 i, k; uint32 ba; if (uptr->WRITTEN && uptr->hwmark && ((uptr->flags & UNIT_RO)== 0)) { /* any data? */ sim_printf ("%s: writing buffer to file: %s\n", sim_uname (uptr), uptr->filename); rewind (uptr->fileref); /* start of file */ fbuf = (uint16 *) uptr->filebuf; /* file buffer */ if (uptr->flags & UNIT_8FMT) /* PDP8? */ fxwrite (uptr->filebuf, sizeof (uint16), /* write file */ uptr->hwmark, uptr->fileref); else { /* 16b/18b */ for (ba = 0; ba < uptr->hwmark; ) { /* loop thru buf */ |
︙ | ︙ | |||
902 903 904 905 906 907 908 | t_stat td_detach (UNIT* uptr) { int u = (int)(uptr - td_dev.units); if (!(uptr->flags & UNIT_ATT)) return SCPE_OK; | | < < | 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 | t_stat td_detach (UNIT* uptr) { int u = (int)(uptr - td_dev.units); if (!(uptr->flags & UNIT_ATT)) return SCPE_OK; if (uptr->hwmark && ((uptr->flags & UNIT_RO)== 0)) /* any data? */ td_flush (uptr); free (uptr->filebuf); /* release buf */ uptr->flags = uptr->flags & ~UNIT_BUF; /* clear buf flag */ uptr->filebuf = NULL; /* clear buf ptr */ uptr->flags = (uptr->flags | UNIT_8FMT) & ~UNIT_11FMT; /* default fmt */ uptr->capac = DT_CAPAC; /* default size */ uptr->pos = uptr->STATE = 0; sim_cancel (uptr); /* no more pulses */ |
︙ | ︙ |
︙ | ︙ | |||
19 20 21 22 23 24 25 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Robert M Supnik shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. | | | < | < < < < < < < < < < < < < < < < < | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of Robert M Supnik shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. This module is based on Bernhard Baehr's description of the TSC8-75's operation. Many thanks to Bernhard for figuring out the behavior of this undocumented device. tsc TSC8-75 option board */ #include "pdp8_defs.h" extern int32 int_req; |
︙ | ︙ |
︙ | ︙ | |||
51 52 53 54 55 56 57 58 59 60 61 62 63 64 | int32 tti (int32 IR, int32 AC); int32 tto (int32 IR, int32 AC); t_stat tti_svc (UNIT *uptr); t_stat tto_svc (UNIT *uptr); t_stat tti_reset (DEVICE *dptr); t_stat tto_reset (DEVICE *dptr); t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc); const char *tti_description (DEVICE *dptr); const char *tto_description (DEVICE *dptr); /* TTI data structures tti_dev TTI device descriptor tti_unit TTI unit descriptor | > | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | int32 tti (int32 IR, int32 AC); int32 tto (int32 IR, int32 AC); t_stat tti_svc (UNIT *uptr); t_stat tto_svc (UNIT *uptr); t_stat tti_reset (DEVICE *dptr); t_stat tto_reset (DEVICE *dptr); t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat tty_set_parity (UNIT *uptr, int32 val, CONST char *cptr, void *desc); const char *tti_description (DEVICE *dptr); const char *tto_description (DEVICE *dptr); /* TTI data structures tti_dev TTI device descriptor tti_unit TTI unit descriptor |
︙ | ︙ | |||
77 78 79 80 81 82 83 | { FLDATAD (INT, int_req, INT_V_TTI, "interrupt pending flag") }, { DRDATAD (POS, tti_unit.pos, T_ADDR_W, "number of characters input"), PV_LEFT }, { DRDATAD (TIME, tti_unit.wait, 24, "input polling interval (if 0, the keyboard is polled synchronously with the clock)"), PV_LEFT+REG_NZ }, { NULL } }; MTAB tti_mod[] = { | | | | | > > > > > | 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | { FLDATAD (INT, int_req, INT_V_TTI, "interrupt pending flag") }, { DRDATAD (POS, tti_unit.pos, T_ADDR_W, "number of characters input"), PV_LEFT }, { DRDATAD (TIME, tti_unit.wait, 24, "input polling interval (if 0, the keyboard is polled synchronously with the clock)"), PV_LEFT+REG_NZ }, { NULL } }; MTAB tti_mod[] = { { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "KSR teletype mode" }, { MTAB_XTD|MTAB_VDV, TT_MODE_7B, NULL, "7B", &tty_set_mode, NULL, NULL, "7 bit mode" }, { MTAB_XTD|MTAB_VDV, TT_MODE_8B, NULL, "8B", &tty_set_mode, NULL, NULL, "8 bit mode" }, { MTAB_XTD|MTAB_VDV, TT_MODE_7P, NULL, "7P", &tty_set_mode, NULL, NULL, "7 bit mode - non printing suppressed" }, { MTAB_XTD|MTAB_VDV, TT_PAR_SPACE, NULL, "SPACE", &tty_set_parity, NULL, NULL, "Space Parity" }, { MTAB_XTD|MTAB_VDV, TT_PAR_MARK, NULL, "MARK", &tty_set_parity, NULL, NULL, "Mark Parity" }, { MTAB_XTD|MTAB_VDV, TT_PAR_EVEN, NULL, "EVEN", &tty_set_parity, NULL, NULL, "Even Parity" }, { MTAB_XTD|MTAB_VDV, TT_PAR_ODD, NULL, "ODD", &tty_set_parity, NULL, NULL, "Odd Parity" }, { MTAB_XTD|MTAB_VDV, 0, "MODE", NULL, NULL, &sim_tt_show_modepar, NULL, "Mode and Parity" }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", NULL, NULL, &show_dev, NULL }, { 0 } }; DEVICE tti_dev = { "TTI", &tti_unit, tti_reg, tti_mod, 1, 10, 31, 1, 8, 8, |
︙ | ︙ | |||
119 120 121 122 123 124 125 | { FLDATAD (INT, int_req, INT_V_TTO, "interrupt pending flag") }, { DRDATAD (POS, tto_unit.pos, T_ADDR_W, "number of characters output"), PV_LEFT }, { DRDATAD (TIME, tto_unit.wait, 24, "time form I/O initiation to interrupt"), PV_LEFT }, { NULL } }; MTAB tto_mod[] = { | | | | | > > > > > | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | { FLDATAD (INT, int_req, INT_V_TTO, "interrupt pending flag") }, { DRDATAD (POS, tto_unit.pos, T_ADDR_W, "number of characters output"), PV_LEFT }, { DRDATAD (TIME, tto_unit.wait, 24, "time form I/O initiation to interrupt"), PV_LEFT }, { NULL } }; MTAB tto_mod[] = { { MTAB_XTD|MTAB_VDV, TT_MODE_KSR, NULL, "KSR", &tty_set_mode, NULL, NULL, "KSR teletype mode" }, { MTAB_XTD|MTAB_VDV, TT_MODE_7B, NULL, "7B", &tty_set_mode, NULL, NULL, "7 bit mode" }, { MTAB_XTD|MTAB_VDV, TT_MODE_8B, NULL, "8B", &tty_set_mode, NULL, NULL, "8 bit mode" }, { MTAB_XTD|MTAB_VDV, TT_MODE_7P, NULL, "7P", &tty_set_mode, NULL, NULL, "7 bit mode - non printing suppressed" }, { MTAB_XTD|MTAB_VDV, TT_PAR_SPACE, NULL, "SPACE", &tty_set_parity, NULL, NULL, "Space Parity" }, { MTAB_XTD|MTAB_VDV, TT_PAR_MARK, NULL, "MARK", &tty_set_parity, NULL, NULL, "Mark Parity" }, { MTAB_XTD|MTAB_VDV, TT_PAR_EVEN, NULL, "EVEN", &tty_set_parity, NULL, NULL, "Even Parity" }, { MTAB_XTD|MTAB_VDV, TT_PAR_ODD, NULL, "ODD", &tty_set_parity, NULL, NULL, "Odd Parity" }, { MTAB_XTD|MTAB_VDV, 0, "MODE", NULL, NULL, &sim_tt_show_modepar, NULL, "Mode and Parity" }, { MTAB_XTD|MTAB_VDV, 0, "DEVNO", NULL, NULL, &show_dev }, { 0 } }; DEVICE tto_dev = { "TTO", &tto_unit, tto_reg, tto_mod, 1, 10, 31, 1, 8, 8, |
︙ | ︙ | |||
281 282 283 284 285 286 287 | int_enable = int_enable | INT_TTO; /* set enable */ sim_cancel (&tto_unit); /* deactivate unit */ return SCPE_OK; } t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { | > > > > > > > > > | | | 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 | int_enable = int_enable | INT_TTO; /* set enable */ sim_cancel (&tto_unit); /* deactivate unit */ return SCPE_OK; } t_stat tty_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { sim_tt_set_mode (&tti_unit, val, cptr, desc); sim_tt_set_mode (&tto_unit, val, cptr, desc); return SCPE_OK; } t_stat tty_set_parity (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { sim_tt_set_parity (&tti_unit, val, cptr, desc); sim_tt_set_parity (&tto_unit, val, cptr, desc); tti_unit.flags = (tti_unit.flags & ~TT_PAR) | val; tto_unit.flags = (tto_unit.flags & ~TT_PAR) | val; return SCPE_OK; } const char *tti_description (DEVICE *dptr) { return "console terminal input"; } const char *tto_description (DEVICE *dptr) { return "console terminal output"; } |
︙ | ︙ | |||
258 259 260 261 262 263 264 | #include "sim_sock.h" #include "sim_frontpanel.h" #include <signal.h> #include <ctype.h> #include <time.h> #include <math.h> #if defined(_WIN32) | < < < < | 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 | #include "sim_sock.h" #include "sim_frontpanel.h" #include <signal.h> #include <ctype.h> #include <time.h> #include <math.h> #if defined(_WIN32) #include <io.h> #include <fcntl.h> #endif #include <setjmp.h> #if defined(HAVE_DLOPEN) /* Dynamic Readline support */ #include <dlfcn.h> #endif #ifdef PIDP8I |
︙ | ︙ | |||
297 298 299 300 301 302 303 | #define SCH_G 2 #define SCH_L 3 #define SCH_EE 4 #define SCH_NE 5 #define SCH_GE 6 #define SCH_LE 7 | | | | 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 | #define SCH_G 2 #define SCH_L 3 #define SCH_EE 4 #define SCH_NE 5 #define SCH_GE 6 #define SCH_LE 7 #define MAX_DO_NEST_LVL 20 /* DO cmd nesting level limit */ #define SRBSIZ 1024 /* save/restore buffer */ #define SIM_BRK_INILNT 4096 /* bpt tbl length */ #define SIM_BRK_ALLTYP 0xFFFFFFFB #define UPDATE_SIM_TIME \ if (1) { \ int32 _x; \ AIO_LOCK; \ if (sim_clock_queue == QUEUE_LIST_END) \ _x = noqueue_time; \ else \ _x = sim_clock_queue->time; \ sim_time = sim_time + (_x - sim_interval); \ sim_rtime = sim_rtime + ((uint32) (_x - sim_interval)); \ if (sim_clock_queue == QUEUE_LIST_END) \ noqueue_time = sim_interval; \ else \ sim_clock_queue->time = sim_interval; \ AIO_UNLOCK; \ } \ else \ (void)0 #define SZ_D(dp) (size_map[((dp)->dwidth + CHAR_BIT - 1) / CHAR_BIT]) #define SZ_R(rp) \ (size_map[((rp)->width + (rp)->offset + CHAR_BIT - 1) / CHAR_BIT]) #if defined (USE_INT64) #define SZ_LOAD(sz,v,mb,j) \ if (sz == sizeof (uint8)) v = *(((uint8 *) mb) + ((uint32) j)); \ |
︙ | ︙ | |||
344 345 346 347 348 349 350 | else if (sz == sizeof (uint16)) v = *(((uint16 *) mb) + ((uint32) j)); \ else v = *(((uint32 *) mb) + ((uint32) j)); #define SZ_STORE(sz,v,mb,j) \ if (sz == sizeof (uint8)) *(((uint8 *) mb) + ((uint32) j)) = (uint8) v; \ else if (sz == sizeof (uint16)) *(((uint16 *) mb) + ((uint32) j)) = (uint16) v; \ else *(((uint32 *) mb) + ((uint32) j)) = v; #endif | < < < < < < < < > | | | | | | | > > > > > | | | | | 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 | else if (sz == sizeof (uint16)) v = *(((uint16 *) mb) + ((uint32) j)); \ else v = *(((uint32 *) mb) + ((uint32) j)); #define SZ_STORE(sz,v,mb,j) \ if (sz == sizeof (uint8)) *(((uint8 *) mb) + ((uint32) j)) = (uint8) v; \ else if (sz == sizeof (uint16)) *(((uint16 *) mb) + ((uint32) j)) = (uint16) v; \ else *(((uint32 *) mb) + ((uint32) j)) = v; #endif #define SIM_DBG_EVENT_NEG 0x80000000 /* negative event dispatch activities */ #define SIM_DBG_EVENT 0x40000000 /* event dispatch activities */ #define SIM_DBG_ACTIVATE 0x20000000 /* queue insertion activities */ #define SIM_DBG_AIO_QUEUE 0x10000000 /* asynch event queue activities */ #define SIM_DBG_EXP_STACK 0x08000000 /* expression stack activities */ #define SIM_DBG_EXP_EVAL 0x04000000 /* expression evaluation activities */ #define SIM_DBG_BRK_ACTION 0x02000000 /* action activities */ #define SIM_DBG_DO 0x01000000 /* do activities */ #define SIM_DBG_SAVE 0x00800000 /* save activities */ #define SIM_DBG_RESTORE 0x00400000 /* restore activities */ static DEBTAB scp_debug[] = { {"EVENT", SIM_DBG_EVENT, "Event Dispatch Activities"}, {"NEGATIVE", SIM_DBG_EVENT_NEG, "Negative Event Dispatch Activities"}, {"ACTIVATE", SIM_DBG_ACTIVATE, "Event Queue Insertion Activities"}, {"QUEUE", SIM_DBG_AIO_QUEUE, "Asynch Event Queue Activities"}, {"EXPSTACK", SIM_DBG_EXP_STACK, "Expression Stack Activities"}, {"EXPEVAL", SIM_DBG_EXP_EVAL, "Expression Evaluation Activities"}, {"ACTION", SIM_DBG_BRK_ACTION, "If/Breakpoint/Expect Action Activities"}, {"DO", SIM_DBG_DO, "Do Command/Expansion Activities"}, {"SAVE", SIM_DBG_SAVE, "Save Activities"}, {"RESTORE", SIM_DBG_RESTORE, "Restore Activities"}, {0} }; static const char *sim_scp_description (DEVICE *dptr) { return "SCP Event and Internal Command Processing and Testing"; } static UNIT scp_test_units[4]; DEVICE sim_scp_dev = { "SCP-PROCESS", scp_test_units, NULL, NULL, 4, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, DEV_NOSAVE|DEV_DEBUG, 0, scp_debug, NULL, NULL, NULL, NULL, NULL, sim_scp_description}; /* Asynch I/O support */ #if defined (SIM_ASYNCH_IO) |
︙ | ︙ | |||
416 417 418 419 420 421 422 | if (AIO_QUEUE_VAL != QUEUE_LIST_END) { /* List !Empty */ UNIT *q, *uptr; int32 a_event_time; do { /* Grab current queue */ q = AIO_QUEUE_VAL; } while (q != AIO_QUEUE_SET(QUEUE_LIST_END, q)); while (q != QUEUE_LIST_END) { /* List !Empty */ | | | 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 | if (AIO_QUEUE_VAL != QUEUE_LIST_END) { /* List !Empty */ UNIT *q, *uptr; int32 a_event_time; do { /* Grab current queue */ q = AIO_QUEUE_VAL; } while (q != AIO_QUEUE_SET(QUEUE_LIST_END, q)); while (q != QUEUE_LIST_END) { /* List !Empty */ sim_debug (SIM_DBG_AIO_QUEUE, &sim_scp_dev, "Migrating Asynch event for %s after %d %s\n", sim_uname(q), q->a_event_time, sim_vm_interval_units); ++migrated; uptr = q; q = q->a_next; uptr->a_next = NULL; /* hygiene */ if (uptr->a_activate_call != &sim_activate_notbefore) { a_event_time = uptr->a_event_time-((sim_asynch_inst_latency+1)/2); if (a_event_time < 0) |
︙ | ︙ | |||
444 445 446 447 448 449 450 | AIO_IUNLOCK; return migrated; } void sim_aio_activate (ACTIVATE_API caller, UNIT *uptr, int32 event_time) { AIO_ILOCK; | | | | > > > > > > > > > > > > > > > | 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 | AIO_IUNLOCK; return migrated; } void sim_aio_activate (ACTIVATE_API caller, UNIT *uptr, int32 event_time) { AIO_ILOCK; sim_debug (SIM_DBG_AIO_QUEUE, &sim_scp_dev, "Queueing Asynch event for %s after %d %s\n", sim_uname(uptr), event_time, sim_vm_interval_units); if (uptr->a_next) { uptr->a_activate_call = sim_activate_abs; } else { UNIT *q; uptr->a_event_time = event_time; uptr->a_activate_call = caller; do { q = AIO_QUEUE_VAL; uptr->a_next = q; /* Mark as on list */ } while (q != AIO_QUEUE_SET(uptr, q)); } AIO_IUNLOCK; sim_asynch_check = 0; /* try to force check */ if (sim_idle_wait) { sim_debug (TIMER_DBG_IDLE, &sim_timer_dev, "waking due to event on %s after %d %s\n", sim_uname(uptr), event_time, sim_vm_interval_units); pthread_cond_signal (&sim_asynch_wake); } } #else t_bool sim_asynch_enabled = FALSE; #endif /* The per-simulator init routine is a weak global that defaults to NULL The other per-simulator pointers can be overrriden by the init routine WEAK void (*sim_vm_init) (void); This routine is no longer invoked this way since it doesn't work reliably on all simh supported compile environments. A simulator that needs these initializations can perform them in the CPU device reset routine which will always be called before anything else can be processed. */ char* (*sim_vm_read) (char *ptr, int32 size, FILE *stream) = NULL; void (*sim_vm_post) (t_bool from_scp) = NULL; CTAB *sim_vm_cmd = NULL; void (*sim_vm_sprint_addr) (char *buf, DEVICE *dptr, t_addr addr) = NULL; void (*sim_vm_fprint_addr) (FILE *st, DEVICE *dptr, t_addr addr) = NULL; t_addr (*sim_vm_parse_addr) (DEVICE *dptr, CONST char *cptr, CONST char **tptr) = NULL; t_value (*sim_vm_pc_value) (void) = NULL; t_bool (*sim_vm_is_subroutine_call) (t_addr **ret_addrs) = NULL; void (*sim_vm_reg_update) (REG *rptr, uint32 idx, t_value prev_val, t_value new_val) = NULL; t_bool (*sim_vm_fprint_stopped) (FILE *st, t_stat reason) = NULL; const char *sim_vm_release = NULL; const char *sim_vm_release_message = NULL; const char **sim_clock_precalibrate_commands = NULL; /* Prototypes */ /* Set and show command processors */ t_stat set_dev_radix (DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat set_dev_enbdis (DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat set_dev_debug (DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat set_unit_enbdis (DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat set_unit_append (DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat ssh_break (FILE *st, const char *cptr, int32 flg); t_stat show_cmd_fi (FILE *ofile, int32 flag, CONST char *cptr); t_stat show_config (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_queue (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_time (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_mod_names (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_show_commands (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_log_names (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_dev_radix (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_dev_debug (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_dev_logicals (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_dev_modifiers (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_dev_show_commands (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_version (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_default (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_break (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_on (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_do (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_runlimit (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat sim_show_send (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat sim_show_expect (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_device (FILE *st, DEVICE *dptr, int32 flag); t_stat show_unit (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag); t_stat show_all_mods (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flg, int32 *toks); t_stat show_one_mod (FILE *st, DEVICE *dptr, UNIT *uptr, MTAB *mptr, CONST char *cptr, int32 flag); t_stat sim_save (FILE *sfile); |
︙ | ︙ | |||
542 543 544 545 546 547 548 549 550 551 552 553 554 555 | static const char *get_glyph_gen (const char *iptr, char *optr, char mchar, t_bool uc, t_bool quote, char escape_char); typedef enum { SW_ERROR, /* Parse Error */ SW_BITMASK, /* Bitmask Value or Not a switch */ SW_NUMBER /* Numeric Value */ } SWITCH_PARSE; SWITCH_PARSE get_switches (const char *cptr, int32 *sw_val, int32 *sw_number); void put_rval (REG *rptr, uint32 idx, t_value val); void fprint_help (FILE *st); void fprint_stopped (FILE *st, t_stat r); void fprint_capac (FILE *st, DEVICE *dptr, UNIT *uptr); void fprint_sep (FILE *st, int32 *tokens); REG *find_reg_glob (CONST char *ptr, CONST char **optr, DEVICE **gdptr); REG *find_reg_glob_reason (CONST char *cptr, CONST char **optr, DEVICE **gdptr, t_stat *stat); | > | 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 | static const char *get_glyph_gen (const char *iptr, char *optr, char mchar, t_bool uc, t_bool quote, char escape_char); typedef enum { SW_ERROR, /* Parse Error */ SW_BITMASK, /* Bitmask Value or Not a switch */ SW_NUMBER /* Numeric Value */ } SWITCH_PARSE; SWITCH_PARSE get_switches (const char *cptr, int32 *sw_val, int32 *sw_number); void put_rval_pcchk (REG *rptr, uint32 idx, t_value val, t_bool pc_chk); void put_rval (REG *rptr, uint32 idx, t_value val); void fprint_help (FILE *st); void fprint_stopped (FILE *st, t_stat r); void fprint_capac (FILE *st, DEVICE *dptr, UNIT *uptr); void fprint_sep (FILE *st, int32 *tokens); REG *find_reg_glob (CONST char *ptr, CONST char **optr, DEVICE **gdptr); REG *find_reg_glob_reason (CONST char *cptr, CONST char **optr, DEVICE **gdptr, t_stat *stat); |
︙ | ︙ | |||
572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 | t_stat exdep_addr_loop (FILE *ofile, SCHTAB *schptr, int32 flag, const char *cptr, t_addr low, t_addr high, DEVICE *dptr, UNIT *uptr); t_stat ex_addr (FILE *ofile, int32 flag, t_addr addr, DEVICE *dptr, UNIT *uptr); t_stat dep_addr (int32 flag, const char *cptr, t_addr addr, DEVICE *dptr, UNIT *uptr, int32 dfltinc); void fprint_fields (FILE *stream, t_value before, t_value after, BITFIELD* bitdefs); t_stat step_svc (UNIT *ptr); t_stat expect_svc (UNIT *ptr); t_stat flush_svc (UNIT *ptr); t_stat shift_args (char *do_arg[], size_t arg_count); t_stat set_on (int32 flag, CONST char *cptr); t_stat set_verify (int32 flag, CONST char *cptr); t_stat set_message (int32 flag, CONST char *cptr); t_stat set_quiet (int32 flag, CONST char *cptr); t_stat set_asynch (int32 flag, CONST char *cptr); t_stat sim_show_asynch (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat do_cmd_label (int32 flag, CONST char *cptr, CONST char *label); void int_handler (int signal); t_stat set_prompt (int32 flag, CONST char *cptr); t_stat sim_set_asynch (int32 flag, CONST char *cptr); static const char *_get_dbg_verb (uint32 dbits, DEVICE* dptr, UNIT *uptr); | > > | > > > > | > > > > > > > | 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 | t_stat exdep_addr_loop (FILE *ofile, SCHTAB *schptr, int32 flag, const char *cptr, t_addr low, t_addr high, DEVICE *dptr, UNIT *uptr); t_stat ex_addr (FILE *ofile, int32 flag, t_addr addr, DEVICE *dptr, UNIT *uptr); t_stat dep_addr (int32 flag, const char *cptr, t_addr addr, DEVICE *dptr, UNIT *uptr, int32 dfltinc); void fprint_fields (FILE *stream, t_value before, t_value after, BITFIELD* bitdefs); t_stat step_svc (UNIT *ptr); t_stat runlimit_svc (UNIT *ptr); t_stat expect_svc (UNIT *ptr); t_stat flush_svc (UNIT *ptr); t_stat shift_args (char *do_arg[], size_t arg_count); t_stat set_on (int32 flag, CONST char *cptr); t_stat set_verify (int32 flag, CONST char *cptr); t_stat set_message (int32 flag, CONST char *cptr); t_stat set_quiet (int32 flag, CONST char *cptr); t_stat set_asynch (int32 flag, CONST char *cptr); t_stat sim_show_asynch (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat do_cmd_label (int32 flag, CONST char *cptr, CONST char *label); void int_handler (int signal); t_stat set_prompt (int32 flag, CONST char *cptr); t_stat set_runlimit (int32 flag, CONST char *cptr); t_stat sim_set_asynch (int32 flag, CONST char *cptr); static const char *_get_dbg_verb (uint32 dbits, DEVICE* dptr, UNIT *uptr); static t_stat sim_sanity_check_register_declarations (void); static void fix_writelock_mtab (DEVICE *dptr); static t_stat _sim_debug_flush (void); /* Global data */ const char *sim_prog_name = NULL; /* pointer to the executable name */ DEVICE *sim_dflt_dev = NULL; UNIT *sim_clock_queue = QUEUE_LIST_END; int32 sim_interval = 0; const char *sim_vm_interval_units = "instructions"; /* Simulator can change to "cycles" as needed */ const char *sim_vm_step_unit = "instruction"; /* Simulator can change */ int32 sim_switches = 0; int32 sim_switch_number = 0; FILE *sim_ofile = NULL; TMLN *sim_oline = NULL; MEMFILE *sim_mfile = NULL; SCHTAB *sim_schrptr = FALSE; SCHTAB *sim_schaptr = FALSE; DEVICE *sim_dfdev = NULL; UNIT *sim_dfunit = NULL; DEVICE **sim_internal_devices = NULL; uint32 sim_internal_device_count = 0; int32 sim_opt_out = 0; volatile t_bool sim_is_running = FALSE; t_bool sim_processing_event = FALSE; uint32 sim_brk_summ = 0; uint32 sim_brk_types = 0; BRKTYPTAB *sim_brk_type_desc = NULL; /* type descriptions */ uint32 sim_brk_dflt = 0; uint32 sim_brk_match_type; t_addr sim_brk_match_addr; char *sim_brk_act[MAX_DO_NEST_LVL]; char *sim_brk_act_buf[MAX_DO_NEST_LVL]; BRKTAB **sim_brk_tab = NULL; int32 sim_brk_ent = 0; int32 sim_brk_lnt = 0; int32 sim_brk_ins = 0; int32 sim_quiet = 0; int32 sim_show_message = 1; /* the message display status of the currently open do file */ int32 sim_step = 0; int32 sim_runlimit = 0; int32 sim_runlimit_initial = 0; double sim_runlimit_d = 0.0; double sim_runlimit_d_initial = 0.0; int32 sim_runlimit_switches = 0; t_bool sim_runlimit_enabled = FALSE; char *sim_sub_instr = NULL; /* Copy of pre-substitution buffer contents */ char *sim_sub_instr_buf = NULL; /* Buffer address that substitutions were saved in */ size_t sim_sub_instr_size = 0; /* substitution buffer size */ size_t *sim_sub_instr_off = NULL; /* offsets in substitution buffer where original data started */ static double sim_time; static uint32 sim_rtime; static int32 noqueue_time; |
︙ | ︙ | |||
651 652 653 654 655 656 657 | size_t sim_debug_buffer_offset = 0; /* debug memory buffer insertion offset */ size_t sim_debug_buffer_inuse = 0; /* debug memory buffer inuse count */ struct timespec sim_deb_basetime; /* debug timestamp relative base time */ char *sim_prompt = NULL; /* prompt string */ static FILE *sim_gotofile; /* the currently open do file */ static int32 sim_goto_line[MAX_DO_NEST_LVL+1]; /* the current line number in the currently open do file */ static int32 sim_do_echo = 0; /* the echo status of the currently open do file */ | < > > > > > > > > > > > > > > > > > > > > > > > > > > < | > > > > > > | | 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 | size_t sim_debug_buffer_offset = 0; /* debug memory buffer insertion offset */ size_t sim_debug_buffer_inuse = 0; /* debug memory buffer inuse count */ struct timespec sim_deb_basetime; /* debug timestamp relative base time */ char *sim_prompt = NULL; /* prompt string */ static FILE *sim_gotofile; /* the currently open do file */ static int32 sim_goto_line[MAX_DO_NEST_LVL+1]; /* the current line number in the currently open do file */ static int32 sim_do_echo = 0; /* the echo status of the currently open do file */ static int32 sim_on_inherit = 0; /* the inherit status of on state and conditions when executing do files */ static int32 sim_do_depth = 0; static t_bool sim_cmd_echoed = FALSE; /* Command was emitted already prior to message output */ static char **sim_exp_argv = NULL; static int32 sim_on_check[MAX_DO_NEST_LVL+1]; static char *sim_on_actions[MAX_DO_NEST_LVL+1][SCPE_MAX_ERR+2]; #define ON_SIGINT_ACTION (SCPE_MAX_ERR+1) static char sim_do_filename[MAX_DO_NEST_LVL+1][CBUFSIZE]; static const char *sim_do_ocptr[MAX_DO_NEST_LVL+1]; static const char *sim_do_label[MAX_DO_NEST_LVL+1]; static t_bool sim_if_cmd[MAX_DO_NEST_LVL+1]; static t_bool sim_if_cmd_last[MAX_DO_NEST_LVL+1]; static t_bool sim_if_result[MAX_DO_NEST_LVL+1]; static t_bool sim_if_result_last[MAX_DO_NEST_LVL+1]; static t_bool sim_cptr_is_action[MAX_DO_NEST_LVL+1]; static DEVICE *sim_failed_reset_dptr = NULL; t_stat sim_last_cmd_stat; /* Command Status */ struct timespec cmd_time; /* */ static SCHTAB sim_stabr; /* Register search specifier */ static SCHTAB sim_staba; /* Memory search specifier */ static const char *sim_int_step_description (DEVICE *dptr) { return "Step/Next facility"; } static UNIT sim_step_unit = { UDATA (&step_svc, UNIT_IDLE, 0) }; DEVICE sim_step_dev = { "INT-STEP", &sim_step_unit, NULL, NULL, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, DEV_NOSAVE, 0, NULL, NULL, NULL, NULL, NULL, NULL, sim_int_step_description}; static const char *sim_int_runlimit_description (DEVICE *dptr) { return "Run time limit facility"; } static t_stat sim_int_runlimit_reset (DEVICE *dptr) { if (sim_runlimit_enabled) { if (sim_runlimit_switches & SWMASK ('T')) return sim_activate_after_d (dptr->units, sim_runlimit_d); else return sim_activate (dptr->units, sim_runlimit); } return SCPE_OK; } static UNIT sim_runlimit_unit = { UDATA (&runlimit_svc, UNIT_IDLE, 0) }; DEVICE sim_runlimit_dev = { "INT-RUNLIMIT", &sim_runlimit_unit, NULL, NULL, 1, 0, 0, 0, 0, 0, NULL, NULL, &sim_int_runlimit_reset, NULL, NULL, NULL, NULL, DEV_NOSAVE, 0, NULL, NULL, NULL, NULL, NULL, NULL, sim_int_runlimit_description}; static const char *sim_int_expect_description (DEVICE *dptr) { return "Expect facility"; } static UNIT sim_expect_unit = { UDATA (&expect_svc, 0, 0) }; DEVICE sim_expect_dev = { "INT-EXPECT", &sim_expect_unit, NULL, NULL, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, DEV_NOSAVE, 0, NULL, NULL, NULL, NULL, NULL, NULL, sim_int_expect_description}; static const char *sim_int_flush_description (DEVICE *dptr) { return "Open File Flush facility"; } static uint32 sim_flush_interval = 30; /* Flush I/O buffers every 30 seconds */ static REG sim_flush_reg[] = { { DRDATAD(FLUSH_INTERVAL, sim_flush_interval, 32, "Periodic Buffer Flush Interval (seconds)") }, { NULL} }; static UNIT sim_flush_unit = { UDATA (&flush_svc, UNIT_IDLE, 0) }; DEVICE sim_flush_dev = { "INT-FLUSH", &sim_flush_unit, sim_flush_reg, NULL, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, DEV_NOSAVE, 0, NULL, NULL, NULL, NULL, NULL, NULL, sim_int_flush_description}; #if defined USE_INT64 |
︙ | ︙ | |||
740 741 742 743 744 745 746 | const char save_ver35[] = "V3.5"; const char save_ver32[] = "V3.2"; const char save_ver30[] = "V3.0"; const struct scp_error { const char *code; const char *message; } scp_errors[1+SCPE_MAX_ERR-SCPE_BASE] = | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > | 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 | const char save_ver35[] = "V3.5"; const char save_ver32[] = "V3.2"; const char save_ver30[] = "V3.0"; const struct scp_error { const char *code; const char *message; } scp_errors[1+SCPE_MAX_ERR-SCPE_BASE] = {{"NXM", "Address space exceeded"}, {"UNATT", "Unit not attached"}, {"IOERR", "I/O error"}, {"CSUM", "Checksum error"}, {"FMT", "Format error"}, {"NOATT", "Unit not attachable"}, {"OPENERR", "File open error"}, {"MEM", "Memory exhausted"}, {"ARG", "Invalid argument"}, {"STEP", "Step expired"}, {"UNK", "Unknown command"}, {"RO", "Read only argument"}, {"INCOMP", "Command not completed"}, {"STOP", "Simulation stopped"}, {"EXIT", "Goodbye"}, {"TTIERR", "Console input I/O error"}, {"TTOERR", "Console output I/O error"}, {"EOF", "End of file"}, {"REL", "Relocation error"}, {"NOPARAM", "No settable parameters"}, {"ALATT", "Unit already attached"}, {"TIMER", "Hardware timer error"}, {"SIGERR", "Signal handler setup error"}, {"TTYERR", "Console terminal setup error"}, {"SUB", "Subscript out of range"}, {"NOFNC", "Command not allowed"}, {"UDIS", "Unit disabled"}, {"NORO", "Read only operation not allowed"}, {"INVSW", "Invalid switch"}, {"MISVAL", "Missing value"}, {"2FARG", "Too few arguments"}, {"2MARG", "Too many arguments"}, {"NXDEV", "Non-existent device"}, {"NXUN", "Non-existent unit"}, {"NXREG", "Non-existent register"}, {"NXPAR", "Non-existent parameter"}, {"NEST", "Nested DO command limit exceeded"}, {"IERR", "Internal error"}, {"MTRLNT", "Invalid magtape record length"}, {"LOST", "Console Telnet connection lost"}, {"TTMO", "Console Telnet connection timed out"}, {"STALL", "Console Telnet output stall"}, {"AFAIL", "Assertion failed"}, {"INVREM", "Invalid remote console command"}, {"EXPECT", "Expect matched"}, {"AMBREG", "Ambiguous register name"}, {"REMOTE", "remote console command"}, {"INVEXPR", "invalid expression"}, {"SIGTERM", "SIGTERM received"}, {"FSSIZE", "File System size larger than disk size"}, {"RUNTIME", "Run time limit exhausted"}, {"INCOMPDSK", "Incompatible Disk Container"}, }; const size_t size_map[] = { sizeof (int8), sizeof (int8), sizeof (int16), sizeof (int32), sizeof (int32) #if defined (USE_INT64) , sizeof (t_int64), sizeof (t_int64), sizeof (t_int64), sizeof (t_int64) #endif |
︙ | ︙ | |||
821 822 823 824 825 826 827 | 0x1FFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF #endif }; | > > | | 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 | 0x1FFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF #endif }; static char *simh_help = NULL; /* First invocation of HELP command appends the help pieces */ static const char simh_help1[] = /***************** 80 character line width template *************************/ "1Commands\n" #define HLP_RESET "*Commands Resetting Devices" /***************** 80 character line width template *************************/ "2Resetting Devices\n" " The RESET command (abbreviation RE) resets a device or the entire simulator\n" " to a predefined condition. If switch -p is specified, the device is reset\n" |
︙ | ︙ | |||
881 882 883 884 885 886 887 | " same type are specified, later modifiers override earlier modifiers. Note\n" " that if the device/unit name comes after the search specifier, the search\n" " values will interpreted in the radix of the CPU, rather than of the\n" " device/unit.\n\n" " The \"object list\" consists of one or more of the following, separated by\n" " commas:\n\n" /***************** 80 character line width template *************************/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 | " same type are specified, later modifiers override earlier modifiers. Note\n" " that if the device/unit name comes after the search specifier, the search\n" " values will interpreted in the radix of the CPU, rather than of the\n" " device/unit.\n\n" " The \"object list\" consists of one or more of the following, separated by\n" " commas:\n\n" /***************** 80 character line width template *************************/ "++register the specified register\n" "++register[sub1-sub2] the specified register array locations,\n" "++++++++ starting at location sub1 up to and\n" "++++++++ including location sub2\n" "++register[sub1/length] the specified register array locations,\n" "++++++++ starting at location sub1 up to but\n" "++++++++ not including sub1+length\n" "++register[ALL] all locations in the specified register\n" "++++++++ array\n" "++register1-register2 all the registers starting at register1\n" "++++++++ up to and including register2\n" "++address the specified location\n" "++address1-address2 all locations starting at address1 up to\n" "++++++++ and including address2\n" "++address/length all location starting at address up to\n" "++++++++ but not including address+length\n" "++STATE all registers in the device\n" "++ALL all locations in the unit\n" "++$ the last value displayed by an EXAMINE\n" "++++++++ command interpreted as an address\n" "3Switches\n" " Switches can be used to control the format of display information:\n\n" /***************** 80 character line width template *************************/ "++-a display as ASCII\n" "++-c display as character string\n" "++-m display as instruction mnemonics\n" "++-o or -8 display as octal\n" "++-d or -10 display as decimal\n" "++-h or -16 display as hexadecimal\n" "++-2 display as binary\n\n" " The simulators typically accept symbolic input (see documentation with each\n" " simulator).\n\n" "3Examples\n" " Examples:\n\n" "++ex 1000-1100 examine 1000 to 1100\n" "++de PC 1040 set PC to 1040\n" "++ie 40-50 interactively examine 40:50\n" "++ie >1000 40-50 interactively examine the subset\n" "+++++++++ of locations 40:50 that are >1000\n" "++ex rx0 50060 examine 50060, RX unit 0\n" "++ex rx sbuf[3-6] examine SBUF[3] to SBUF[6] in RX\n" "++de all 0 set main memory to 0\n" "++de &77>0 0 set all addresses whose low order\n" "+++++++++ bits are non-zero to 0\n" "++ex -m @memdump.txt 0-7777 dump memory to file\n\n" " Note: to terminate an interactive command, simply type a bad value\n" " (eg, XYZ) when input is requested.\n" #define HLP_EVALUATE "*Commands Evaluating_Instructions" /***************** 80 character line width template *************************/ "2Evaluating Instructions\n" " The EVAL command evaluates a symbolic instruction and returns the equivalent\n" " numeric value. This is useful for obtaining numeric arguments for a search\n" |
︙ | ︙ | |||
1019 1020 1021 1022 1023 1024 1025 | #define HLP_CONTINUE "*Commands Running_A_Simulated_Program CONTINUE" "3CONTINUE\n" " The CONT command (abbreviated CO) does not reset devices and resumes\n" " execution at the current PC.\n" #define HLP_STEP "*Commands Running_A_Simulated_Program STEP" "3STEP\n" " The STEP command (abbreviated S) resumes execution at the current PC for\n" | | | | | 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 | #define HLP_CONTINUE "*Commands Running_A_Simulated_Program CONTINUE" "3CONTINUE\n" " The CONT command (abbreviated CO) does not reset devices and resumes\n" " execution at the current PC.\n" #define HLP_STEP "*Commands Running_A_Simulated_Program STEP" "3STEP\n" " The STEP command (abbreviated S) resumes execution at the current PC for\n" " the number of %Is given by its argument. If no argument is\n" " supplied, one %I is executed.\n" "4Switches\n" " If the STEP command is invoked with the -T switch, the step command will\n" " cause execution to run for microseconds rather than %I.\n" #define HLP_NEXT "*Commands Running_A_Simulated_Program NEXT" "3NEXT\n" " The NEXT command (abbreviated N) resumes execution at the current PC for\n" " one instruction, attempting to execute through a subroutine calls.\n" " If the next instruction to be executed is not a subroutine call,\n" " one instruction is executed.\n" #define HLP_BOOT "*Commands Running_A_Simulated_Program BOOT" |
︙ | ︙ | |||
1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 | #define HLP_DEBUG "*Commands Stopping_The_Simulator User_Specified_Stop_Conditions DEBUG" #define HLP_NODEBUG "*Commands Stopping_The_Simulator User_Specified_Stop_Conditions DEBUG" "4Debug\n" " The DEBUG snd NODEBUG commands are aliases for the \"SET DEBUG\" and\n" " \"SET NODEBUG\" commands. Additionally, support is provided that is\n" " equivalent to the \"SET <dev> DEBUG=opt1{;opt2}\" and\n" " \"SET <dev> NODEBUG=opt1{;opt2}\" commands.\n\n" /***************** 80 character line width template *************************/ "2Connecting and Disconnecting Devices\n" " Except for main memory and network devices, units are simulated as\n" " unstructured binary disk files in the host file system. Before using a\n" " simulated unit, the user must specify the file to be accessed by that unit.\n" #define HLP_ATTACH "*Commands Connecting_and_Disconnecting_Devices ATTACH" "3ATTACH\n" | > > > > > > > > > > > > > > > > > > > | 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 | #define HLP_DEBUG "*Commands Stopping_The_Simulator User_Specified_Stop_Conditions DEBUG" #define HLP_NODEBUG "*Commands Stopping_The_Simulator User_Specified_Stop_Conditions DEBUG" "4Debug\n" " The DEBUG snd NODEBUG commands are aliases for the \"SET DEBUG\" and\n" " \"SET NODEBUG\" commands. Additionally, support is provided that is\n" " equivalent to the \"SET <dev> DEBUG=opt1{;opt2}\" and\n" " \"SET <dev> NODEBUG=opt1{;opt2}\" commands.\n\n" #define HLP_RUNLIMIT "*Commands Stopping_The_Simulator User_Specified_Stop_Conditions RUNLIMIT" "4RUNLIMIT\n" " A simulator user may want to limit the maximum execution time that a\n" " simulator may run for. This might be appropriate to limit a runaway\n" " diagnostic which didn't achieve explicit success or failure within\n" " some user specified time. The RUNLIMIT command provides ways to\n" " limit execution.\n\n" "++RUNLIMIT n {%C|MICROSECONDS|SECONDS|MINUTES|HOURS}\n" "++NORUNLIMIT\n\n" " Equivalently:\n\n" "++SET RUNLIMIT n {%C|MICROSECONDS|SECONDS|MINUTES|HOURS}\n" "++SET NORUNLIMIT\n\n" " The run limit state can be examined with:\n\n" "++SHOW RUNLIMIT\n\n" " If the units of the run limit are not specified, the default units are\n" " %C. Once an execution run limit has been reached, any subsequent\n" " GO, RUN, CONTINUE, STEP or BOOT commands will cause the simulator to\n" " exit. A previously defined RUNLIMIT can be cleared with the NORUNLIMIT\n" " command or the establishment of a new run limit.\n" /***************** 80 character line width template *************************/ "2Connecting and Disconnecting Devices\n" " Except for main memory and network devices, units are simulated as\n" " unstructured binary disk files in the host file system. Before using a\n" " simulated unit, the user must specify the file to be accessed by that unit.\n" #define HLP_ATTACH "*Commands Connecting_and_Disconnecting_Devices ATTACH" "3ATTACH\n" |
︙ | ︙ | |||
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 | "5-r\n" " If the -r switch is specified, or the file is write protected, ATTACH tries\n" " to open the file read only. If the file does not exist, or the unit does\n" " not support read only operation, an error occurs. Input-only devices, such\n" " as paper-tape readers, and devices with write lock switches, such as disks\n" " and tapes, support read only operation; other devices do not. If a file is\n" " attached read only, its contents can be examined but not modified.\n" "5-q\n" " If the -q switch is specified when creating a new file (-n) or opening one\n" " read only (-r), any messages announcing these facts will be suppressed.\n" "5-f\n" " For simulated magnetic tapes, the ATTACH command can specify the format of\n" " the attached tape image file:\n\n" "++ATTACH -f <tape_unit> <format> <filename>\n\n" | > > > > > > | 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 | "5-r\n" " If the -r switch is specified, or the file is write protected, ATTACH tries\n" " to open the file read only. If the file does not exist, or the unit does\n" " not support read only operation, an error occurs. Input-only devices, such\n" " as paper-tape readers, and devices with write lock switches, such as disks\n" " and tapes, support read only operation; other devices do not. If a file is\n" " attached read only, its contents can be examined but not modified.\n" "5-a\n" " If the -a switch is specified, and the device being attached is a\n" " sequential output only device (like a line printer, paper tape punch,\n" " etc.), the file being attached will be opened for write and positioned\n" " at the end of the file's current contents, thus adding to any existing\n" " file data beyond what may have already been there.\n" "5-q\n" " If the -q switch is specified when creating a new file (-n) or opening one\n" " read only (-r), any messages announcing these facts will be suppressed.\n" "5-f\n" " For simulated magnetic tapes, the ATTACH command can specify the format of\n" " the attached tape image file:\n\n" "++ATTACH -f <tape_unit> <format> <filename>\n\n" |
︙ | ︙ | |||
1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 | #define HLP_LS "*Commands Listing_Files LS" "3LS\n" "++LS {path} list directory files\n" "2Displaying Files\n" #define HLP_TYPE "*Commands Displaying_Files TYPE" "3TYPE\n" "++TYPE file display a file contents\n" #define HLP_CAT "*Commands Displaying_Files CAT" "3CAT\n" "++CAT file display a file contents\n" "2Removing Files\n" #define HLP_DELETE "*Commands Removing_Files DEL" "3DELETE\n" "++DEL{ete} file deletes a file\n" #define HLP_RM "*Commands Removing_Files RM" "3RM\n" "++RM file deletes a file\n" "2Copying Files\n" #define HLP_COPY "*Commands Copying_Files COPY" "3COPY\n" "++COPY sfile dfile copies a file\n" #define HLP_CP "*Commands Copying_Files CP" "3CP\n" "++CP sfile dfile copies a file\n" #define HLP_SET "*Commands SET" "2SET\n" /***************** 80 character line width template *************************/ #define HLP_SET_CONSOLE "*Commands SET CONSOLE" "3Console\n" "+SET CONSOLE arg{,arg...} set console options\n" "+SET CONSOLE WRU=value specify console drop to simh character\n" | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 | #define HLP_LS "*Commands Listing_Files LS" "3LS\n" "++LS {path} list directory files\n" "2Displaying Files\n" #define HLP_TYPE "*Commands Displaying_Files TYPE" "3TYPE\n" "++TYPE file display a file contents\n" "4Switches\n" " The -O switch start displaying file contents at the specified\n" " file offset.\n\n" " The -N switch will display up to a specified number of lines\n" " from the file.\n\n" "++TYPE -{O}{N} {offset} {lines} file\n\n" #define HLP_CAT "*Commands Displaying_Files CAT" "3CAT\n" "++CAT file display a file contents\n" "4Switches\n" " The -O switch start displaying file contents at the specified\n" " file offset.\n\n" " The -N switch will display up to a specified number of lines\n" " from the file.\n\n" "++TYPE -{O}{N} {offset} {lines} file\n\n" "2Removing Files\n" #define HLP_DELETE "*Commands Removing_Files DEL" "3DELETE\n" "++DEL{ete} file deletes a file\n" "4Switches\n" " The -Q switch will suppress file not found warning messages\n\n" #define HLP_RM "*Commands Removing_Files RM" "3RM\n" "++RM file deletes a file\n" "4Switches\n" " The -Q switch will suppress file not found warning messages\n\n" "2Copying Files\n" #define HLP_COPY "*Commands Copying_Files COPY" "3COPY\n" "++COPY sfile dfile copies a file\n" #define HLP_CP "*Commands Copying_Files CP" "3CP\n" "++CP sfile dfile copies a file\n" "2Renaming Files\n" #define HLP_RENAME "*Commands Renaming_Files RENAME" "3RENAME\n" "++RENAME origname newname renames a file\n" #define HLP_MOVE "*Commands Renaming_Files MOVE" "3MOVE\n" "++MOVE origname newname renames a file\n" "+or\n" "++MV origname newname renames a file\n" "2Creating Directories\n" #define HLP_MKDIR "*Commands Creating_Directories MKDIR" "3MKDIR\n" "++MKDIR path creates a directory\n" "2Deleting Directories\n" #define HLP_RMDIR "*Commands Deleting_Directories RMDIR" "3RMDIR\n" "++RMDIR path deleting a directory\n" #define HLP_SET "*Commands SET" "2SET\n" /***************** 80 character line width template *************************/ #define HLP_SET_CONSOLE "*Commands SET CONSOLE" "3Console\n" "+SET CONSOLE arg{,arg...} set console options\n" "+SET CONSOLE WRU=value specify console drop to simh character\n" |
︙ | ︙ | |||
1268 1269 1270 1271 1272 1273 1274 | " Interactions with the simulator session (at the \"sim>\" prompt\n" " can be recorded to a log file\n\n" "+SET LOG log_file specify the log destination\n" "++++++++ (STDOUT,DEBUG or filename)\n" "+SET NOLOG disables any currently active logging\n" "4Switches\n" " By default, log output is written at the end of the specified log file.\n" | | > > | | 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 | " Interactions with the simulator session (at the \"sim>\" prompt\n" " can be recorded to a log file\n\n" "+SET LOG log_file specify the log destination\n" "++++++++ (STDOUT,DEBUG or filename)\n" "+SET NOLOG disables any currently active logging\n" "4Switches\n" " By default, log output is written at the end of the specified log file.\n" " A new log file can created if the -N switch is used on the command line.\n\n" " By default, log output is written in text mode. The log file can be\n" " opened for binary mode writing if the -B switch is used on the command line.\n" #define HLP_SET_DEBUG "*Commands SET Debug" /***************** 80 character line width template *************************/ "3Debug\n" "+SET DEBUG debug_file specify the debug destination\n" "++++++++ (STDOUT,STDERR,LOG or filename)\n" "+SET NODEBUG disables any currently active debug output\n" "4Switches\n" " Debug message output contains a timestamp which indicates the number of\n" " simulated %C which have been executed prior to the debug event.\n\n" " Debug message output can be enhanced to contain additional, potentially\n" " useful information.\n" "5-T\n" " The -T switch causes debug output to contain a time of day displayed\n" " as hh:mm:ss.msec.\n" "5-A\n" " The -A switch causes debug output to contain a time of day displayed\n" |
︙ | ︙ | |||
1321 1322 1323 1324 1325 1326 1327 | "+SET BREAK <list> set breakpoints\n" "+SET NOBREAK <list> clear breakpoints\n" /***************** 80 character line width template *************************/ #define HLP_SET_THROTTLE "*Commands SET Throttle" "3Throttle\n" " Simulator instruction execution rate can be controlled by specifying\n" " one of the following throttle commands:\n\n" | | | | | | 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 | "+SET BREAK <list> set breakpoints\n" "+SET NOBREAK <list> clear breakpoints\n" /***************** 80 character line width template *************************/ #define HLP_SET_THROTTLE "*Commands SET Throttle" "3Throttle\n" " Simulator instruction execution rate can be controlled by specifying\n" " one of the following throttle commands:\n\n" "+SET THROTTLE xM execute x million %C per second\n" "+SET THROTTLE xK execute x thousand %C per second\n" "+SET THROTTLE x%% occupy x percent of the host capacity\n" "++++++++executing instructions\n" "+SET THROTTLE x/t sleep for t milliseconds after executing x\n" "++++++++%C\n\n" "+SET NOTHROTTLE set simulation rate to maximum\n\n" " Throttling is only available on host systems that implement a precision\n" " real-time delay function.\n\n" " xM, xK and x%% modes require the simulator to execute sufficient\n" " %C to actually calibrate the desired execution rate relative\n" " to wall clock time. Very short running programs may complete before\n" " calibration completes and therefore before the simulated execution rate\n" " can match the desired rate.\n\n" " The SET NOTHROTTLE command turns off throttling. The SHOW THROTTLE\n" " command shows the current settings for throttling and the calibration\n" " results\n\n" " Some simulators implement a different form of host CPU resource management\n" |
︙ | ︙ | |||
1353 1354 1355 1356 1357 1358 1359 | "+SET CLOCK asynch enable asynchronous clocks\n" "+SET CLOCK noasynch disable asynchronous clocks\n" #endif "+SET CLOCK nocatchup disable catchup clock ticks\n" "+SET CLOCK catchup enable catchup clock ticks\n" "+SET CLOCK calib=n%% specify idle calibration skip %%\n" "+SET CLOCK calib=ALWAYS specify calibration independent of idle\n" | | | 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 | "+SET CLOCK asynch enable asynchronous clocks\n" "+SET CLOCK noasynch disable asynchronous clocks\n" #endif "+SET CLOCK nocatchup disable catchup clock ticks\n" "+SET CLOCK catchup enable catchup clock ticks\n" "+SET CLOCK calib=n%% specify idle calibration skip %%\n" "+SET CLOCK calib=ALWAYS specify calibration independent of idle\n" "+SET CLOCK stop=n stop execution after n %C\n\n" " The SET CLOCK STOP command allows execution to have a bound when\n" " execution starts with a BOOT, NEXT or CONTINUE command.\n" #define HLP_SET_ASYNCH "*Commands SET Asynch" "3Asynch\n" "+SET ASYNCH enable asynchronous I/O\n" "+SET NOASYNCH disable asynchronous I/O\n" #define HLP_SET_ENVIRON "*Commands SET Environment" |
︙ | ︙ | |||
1453 1454 1455 1456 1457 1458 1459 | "+SET <dev> DEBUG{=arg} set device debug flags\n" "+SET <dev> NODEBUG={arg} clear device debug flags\n" "+SET <dev> arg{,arg...} set device parameters (see show modifiers)\n" "+SET <unit> ENABLED enable unit\n" "+SET <unit> DISABLED disable unit\n" "+SET <unit> arg{,arg...} set unit parameters (see show modifiers)\n" "+HELP <dev> SET displays the device specific set commands\n" | | > | | < < > > | 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 | "+SET <dev> DEBUG{=arg} set device debug flags\n" "+SET <dev> NODEBUG={arg} clear device debug flags\n" "+SET <dev> arg{,arg...} set device parameters (see show modifiers)\n" "+SET <unit> ENABLED enable unit\n" "+SET <unit> DISABLED disable unit\n" "+SET <unit> arg{,arg...} set unit parameters (see show modifiers)\n" "+HELP <dev> SET displays the device specific set commands\n" "++++++++ available\n"; static const char simh_help2[] = /***************** 80 character line width template *************************/ #define HLP_SHOW "*Commands SHOW" "2SHOW\n" "+sh{ow} {-c} br{eak} <list> show breakpoints\n" "+sh{ow} con{figuration} show configuration\n" "+sh{ow} cons{ole} {arg} show console options\n" "+sh{ow} {-ei} dev{ices} show devices\n" "+sh{ow} fea{tures} show system devices with descriptions\n" "+sh{ow} m{odifiers} show modifiers for all devices\n" "+sh{ow} s{how} show SHOW commands for all devices\n" "+sh{ow} n{ames} show logical names\n" "+sh{ow} q{ueue} show event queue\n" "+sh{ow} ti{me} show simulated time\n" "+sh{ow} th{rottle} show simulation rate\n" "+sh{ow} a{synch} show asynchronous I/O state\n" "+sh{ow} ve{rsion} show simulator version\n" "+sh{ow} def{ault} show current directory\n" "+sh{ow} re{mote} show remote console configuration\n" "+sh{ow} <dev> RADIX show device display radix\n" "+sh{ow} <dev> DEBUG show device debug flags\n" "+sh{ow} <dev> MODIFIERS show device modifiers\n" "+sh{ow} <dev> NAMES show device logical name\n" "+sh{ow} <dev> SHOW show device SHOW commands\n" "+sh{ow} <dev> {arg,...} show device parameters\n" "+sh{ow} <unit> {arg,...} show unit parameters\n" "+sh{ow} ethernet show ethernet devices\n" "+sh{ow} serial show serial devices\n" "+sh{ow} multiplexer {dev} show open multiplexer device info\n" "+sh{ow} video show video capabilities\n" "+sh{ow} clocks show calibrated timer information\n" "+sh{ow} throttle show throttle info\n" "+sh{ow} on show on condition actions\n" "+sh{ow} do show do nesting state\n" "+sh{ow} runlimit show execution limit states\n" "+h{elp} <dev> show displays the device specific show commands\n" "++++++++ available\n" #define HLP_SHOW_CONFIG "*Commands SHOW" #define HLP_SHOW_DEVICES "*Commands SHOW" #define HLP_SHOW_FEATURES "*Commands SHOW" #define HLP_SHOW_QUEUE "*Commands SHOW" #define HLP_SHOW_TIME "*Commands SHOW" |
︙ | ︙ | |||
1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 | #define HLP_SHOW_ASYNCH "*Commands SHOW" #define HLP_SHOW_ETHERNET "*Commands SHOW" #define HLP_SHOW_SERIAL "*Commands SHOW" #define HLP_SHOW_MULTIPLEXER "*Commands SHOW" #define HLP_SHOW_VIDEO "*Commands SHOW" #define HLP_SHOW_CLOCKS "*Commands SHOW" #define HLP_SHOW_ON "*Commands SHOW" #define HLP_SHOW_SEND "*Commands SHOW" #define HLP_SHOW_EXPECT "*Commands SHOW" #define HLP_HELP "*Commands HELP" /***************** 80 character line width template *************************/ "2HELP\n" "+h{elp} type this message\n" "+h{elp} <command> type help for command\n" | > > | 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 | #define HLP_SHOW_ASYNCH "*Commands SHOW" #define HLP_SHOW_ETHERNET "*Commands SHOW" #define HLP_SHOW_SERIAL "*Commands SHOW" #define HLP_SHOW_MULTIPLEXER "*Commands SHOW" #define HLP_SHOW_VIDEO "*Commands SHOW" #define HLP_SHOW_CLOCKS "*Commands SHOW" #define HLP_SHOW_ON "*Commands SHOW" #define HLP_SHOW_DO "*Commands SHOW" #define HLP_SHOW_RUNLIMIT "*Commands SHOW" #define HLP_SHOW_SEND "*Commands SHOW" #define HLP_SHOW_EXPECT "*Commands SHOW" #define HLP_HELP "*Commands HELP" /***************** 80 character line width template *************************/ "2HELP\n" "+h{elp} type this message\n" "+h{elp} <command> type help for command\n" |
︙ | ︙ | |||
1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 | " and have their values be expanded to full paths and/or into pieces.\n" " Parsing and expansion of file names.\n\n" "++%%~I%% - expands the value of %%I%% removing any surrounding quotes (\")\n" "++%%~fI%% - expands the value of %%I%% to a fully qualified path name\n" "++%%~pI%% - expands the value of %%I%% to a path only\n" "++%%~nI%% - expands the value of %%I%% to a file name only\n" "++%%~xI%% - expands the value of %%I%% to a file extension only\n\n" " The modifiers can be combined to get compound results:\n\n" "++%%~pnI%% - expands the value of %%I%% to a path and name only\n" "++%%~nxI%% - expands the value of %%I%% to a file name and extension only\n\n" " In the above example above %%I%% can be replaced by other\n" " environment variables or numeric parameters to a DO command\n" " invokation.\n" " Examples:\n\n" | > > | 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 | " and have their values be expanded to full paths and/or into pieces.\n" " Parsing and expansion of file names.\n\n" "++%%~I%% - expands the value of %%I%% removing any surrounding quotes (\")\n" "++%%~fI%% - expands the value of %%I%% to a fully qualified path name\n" "++%%~pI%% - expands the value of %%I%% to a path only\n" "++%%~nI%% - expands the value of %%I%% to a file name only\n" "++%%~xI%% - expands the value of %%I%% to a file extension only\n\n" "++%%~tI%% - expands the value of %%I%% to date/time of file\n\n" "++%%~zI%% - expands the value of %%I%% to size of file\n\n" " The modifiers can be combined to get compound results:\n\n" "++%%~pnI%% - expands the value of %%I%% to a path and name only\n" "++%%~nxI%% - expands the value of %%I%% to a file name and extension only\n\n" " In the above example above %%I%% can be replaced by other\n" " environment variables or numeric parameters to a DO command\n" " invokation.\n" " Examples:\n\n" |
︙ | ︙ | |||
1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 | " GOTO command:\n\n" "++GOTO <label>\n\n" " Labels are lines in a command file which the first non whitespace\n" " character is a \":\". The target of a goto is the first matching label\n" " in the current do command file which is encountered. Since labels\n" " don't do anything else besides being the targets of goto's, they could\n" " also be used to provide comments in do command files.\n\n" "4Examples\n\n" "++:: This is a comment\n" "++echo Some Message to Output\n" "++:Target\n" "++:: This is a comment\n" "++GOTO Target\n\n" #define HLP_RETURN "*Commands Executing_Command_Files RETURN" | > > > > | 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 | " GOTO command:\n\n" "++GOTO <label>\n\n" " Labels are lines in a command file which the first non whitespace\n" " character is a \":\". The target of a goto is the first matching label\n" " in the current do command file which is encountered. Since labels\n" " don't do anything else besides being the targets of goto's, they could\n" " also be used to provide comments in do command files.\n\n" "++GOTO :EOF\n\n" " The target label of :EOF is explicitly defined to mean the end of the\n" " DO command file. This will cause the execution to return from the current\n" " command file.\n\n" "4Examples\n\n" "++:: This is a comment\n" "++echo Some Message to Output\n" "++:Target\n" "++:: This is a comment\n" "++GOTO Target\n\n" #define HLP_RETURN "*Commands Executing_Command_Files RETURN" |
︙ | ︙ | |||
1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 | " Console Telnet output stall\n" "5 AFAIL\n" " Assertion failed\n" "5 INVREM\n" " Invalid remote console command\n" "5 AMBREG\n" " Ambiguous register\n" #define HLP_SHIFT "*Commands Executing_Command_Files SHIFT" "3SHIFT\n" "++shift shift the command file's positional parameters\n" #define HLP_CALL "*Commands Executing_Command_Files CALL" "3CALL\n" "++call transfer control to a labeled subroutine\n" " a command file.\n" | > > | 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 | " Console Telnet output stall\n" "5 AFAIL\n" " Assertion failed\n" "5 INVREM\n" " Invalid remote console command\n" "5 AMBREG\n" " Ambiguous register\n" "5 RUNTIME\n" " Run time limit exhausted\n" #define HLP_SHIFT "*Commands Executing_Command_Files SHIFT" "3SHIFT\n" "++shift shift the command file's positional parameters\n" #define HLP_CALL "*Commands Executing_Command_Files CALL" "3CALL\n" "++call transfer control to a labeled subroutine\n" " a command file.\n" |
︙ | ︙ | |||
1978 1979 1980 1981 1982 1983 1984 1985 1986 | " between characters being sent. The delay parameter can be set by\n" " itself with:\n\n" "++SEND DELAY=n\n\n" " which will set the default delay value for subsequent SEND commands\n" " which don't specify an explicit DELAY parameter along with a string\n" " If a SEND command is processed and no DELAY value has been specified,\n" " the default value of the delay parameter is 1000.\n" /***************** 80 character line width template *************************/ "4After\n" | > > | > > | 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 | " between characters being sent. The delay parameter can be set by\n" " itself with:\n\n" "++SEND DELAY=n\n\n" " which will set the default delay value for subsequent SEND commands\n" " which don't specify an explicit DELAY parameter along with a string\n" " If a SEND command is processed and no DELAY value has been specified,\n" " the default value of the delay parameter is 1000.\n" " The value n can be specified with a suffix of k or m which indicates\n" " a multiplier of 1000 or 1000000 respectively\n" /***************** 80 character line width template *************************/ "4After\n" " Specifies an integer (>=0) representing a minimal number of %C\n" " which must execute before the first character in the string is sent.\n" " The after parameter value can be set by itself with:\n\n" "++SEND AFTER=n\n\n" " which will set the default after value for subsequent SEND commands\n" " which don't specify an explicit AFTER parameter along with a string\n" " If a SEND command is processed and no AFTER value has been specified,\n" " the default value of the delay parameter is the DELAY parameter value.\n" " The value n can be specified with a suffix of k or m which indicates\n" " a multiplier of 1000 or 1000000 respectively\n" "4Escaping String Data\n" " The following character escapes are explicitly supported:\n" "++\\r Sends the ASCII Carriage Return character (Decimal value 13)\n" "++\\n Sends the ASCII Linefeed character (Decimal value 10)\n" "++\\f Sends the ASCII Formfeed character (Decimal value 12)\n" "++\\t Sends the ASCII Horizontal Tab character (Decimal value 9)\n" "++\\v Sends the ASCII Vertical Tab character (Decimal value 11)\n" |
︙ | ︙ | |||
2009 2010 2011 2012 2013 2014 2015 | "++\\n{n{n}} where each n is an octal digit (0-7)\n" " and hext character values of the form:\n" "++\\xh{h} where each h is a hex digit (0-9A-Fa-f)\n" "4Switches\n" " Switches can be used to influence the behavior of SEND commands\n\n" "5-t\n" " The -t switch indicates that the Delay and After values are in\n" | | | 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 | "++\\n{n{n}} where each n is an octal digit (0-7)\n" " and hext character values of the form:\n" "++\\xh{h} where each h is a hex digit (0-9A-Fa-f)\n" "4Switches\n" " Switches can be used to influence the behavior of SEND commands\n\n" "5-t\n" " The -t switch indicates that the Delay and After values are in\n" " units of microseconds rather than %C.\n" /***************** 80 character line width template *************************/ #define HLP_EXPECT "*Commands Executing_Command_Files Reacting_To_Console_Output" /***************** 80 character line width template *************************/ "3Reacting To Console Output\n" " The EXPECT command provides a way to stop execution and take actions\n" " when specific output has been generated by the simulated system.\n\n" "++EXPECT {dev:line} {[count]} {HALTAFTER=n,}\"<string>\" {actioncommand {; actioncommand}...}\n\n" |
︙ | ︙ | |||
2037 2038 2039 2040 2041 2042 2043 | " then rules should be defined which contain the simulated system's line\n" " ending character sequence (i.e. \"\\r\\n\").\n" " Once data has matched any expect rule, that data is no longer eligible\n" " to match other expect rules which may already be defined.\n" " Data which is output prior to the definition of an expect rule is not\n" " eligible to be matched against.\n\n" " The NOEXPECT command removes a previously defined EXPECT command for the\n" | | > > | < < < < | | 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 | " then rules should be defined which contain the simulated system's line\n" " ending character sequence (i.e. \"\\r\\n\").\n" " Once data has matched any expect rule, that data is no longer eligible\n" " to match other expect rules which may already be defined.\n" " Data which is output prior to the definition of an expect rule is not\n" " eligible to be matched against.\n\n" " The NOEXPECT command removes a previously defined EXPECT command for the\n" " console or a specific multiplexer line. A NOEXPECT command, without a\n" " specific mention of a particular EXPECT match string, will remove all\n" " currently defined EXPECT match rules.\n\n" " The SHOW EXPECT command displays all of the pending EXPECT state for\n" " the console or a specific multiplexer line.\n" /***************** 80 character line width template *************************/ "4Switches\n" " Switches can be used to influence the behavior of EXPECT rules\n\n" "5-p\n" " EXPECT rules default to be one shot activities. That is a rule is\n" " automatically removed when it matches unless it is designated as a\n" " persistent rule by using a -p switch when the rule is defined.\n" "5-c\n" " If an expect rule is defined with the -c switch, it will cause all\n" " pending expect rules on the current device to be cleared when the rule\n" " matches data in the device output stream.\n" "5-r\n" " If an expect rule is defined with the -r switch, the string is interpreted\n" " as a regular expression applied to the output data stream. This regular\n" " expression may contain parentheses delimited sub-groups.\n\n" /***************** 80 character line width template *************************/ #if defined (HAVE_PCRE_H) " The syntax of the regular expressions available are those supported by\n" " the Perl Compatible Regular Expression package (aka PCRE). As the name\n" " implies, the syntax is generally the same as Perl regular expressions.\n" " See http://perldoc.perl.org/perlre.html for more details\n" #else " Regular expression support is not currently available on your environment.\n" " This simulator could use regular expression support provided by the\n" " Perl Compatible Regular Expression (PCRE) package if it was available\n" " when you simulator was compiled.\n" #endif "5-i\n" " If a regular expression expect rule is defined with the -i switch,\n" " character matching for that expression will be case independent.\n" " The -i switch is only valid for regular expression expect rules.\n" "5-t\n" " The -t switch indicates that the value specified by the HaltAfter\n" " parameter are in units of microseconds rather than %C.\n" "4Determining Which Output Matched\n" " When an expect rule matches data in the output stream, the rule which\n" " matched is recorded in the environment variable _EXPECT_MATCH_PATTERN.\n" " If the expect rule was a regular expression rule, then the environment\n" " variable _EXPECT_MATCH_GROUP_0 is set to the whole string which matched\n" " and if the match pattern had any parentheses delimited sub-groups, the\n" " environment variables _EXPECT_MATCH_GROUP_1 thru _EXPECT_MATCH_GROUP_n\n" |
︙ | ︙ | |||
2107 2108 2109 2110 2111 2112 2113 | "++\\? Expect the ASCII Question Mark character (Decimal value 63)\n" "++\\e Expect the ASCII Escape character (Decimal value 27)\n" " as well as octal character values of the form:\n" "++\\n{n{n}} where each n is an octal digit (0-7)\n" " and hext character values of the form:\n" "++\\xh{h} where each h is a hex digit (0-9A-Fa-f)\n" "4HaltAfter\n" | | > > | 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 | "++\\? Expect the ASCII Question Mark character (Decimal value 63)\n" "++\\e Expect the ASCII Escape character (Decimal value 27)\n" " as well as octal character values of the form:\n" "++\\n{n{n}} where each n is an octal digit (0-7)\n" " and hext character values of the form:\n" "++\\xh{h} where each h is a hex digit (0-9A-Fa-f)\n" "4HaltAfter\n" " Specifies the number of %C which should be executed before\n" " simulator instruction execution should stop. The default is to stop\n" " executing instructions immediately (i.e. HALTAFTER=0).\n" " The default HaltAfter delay, once set, persists for all expect behaviors\n" " for that device.\n" " The default HaltAfter parameter value can be set by itself with:\n\n" "++EXPECT HALTAFTER=n\n\n" " A unique HaltAfter value can be specified with each expect matching rule\n" " which if it is not specified then the default value will be used.\n" " To avoid potentially unpredictable system hehavior that will happen\n" " if multiple expect rules are in effect and a haltafter value is large\n" " enough for more than one expect rule to match before an earlier haltafter\n" " delay has expired, only a single EXPECT rule can be defined if a non-zero\n" " HaltAfter parameter has been set.\n" " The value n can be specified with a suffix of k or m which indicates\n" " a multiplier of 1000 or 1000000 respectively\n" /***************** 80 character line width template *************************/ #define HLP_SLEEP "*Commands Executing_Command_Files Pausing_Command_Execution" "3Pausing Command Execution\n" " A simulator command file may wait for a specific period of time with the\n\n" "++SLEEP NUMBER[SUFFIX]...\n\n" " Pause for NUMBER seconds. SUFFIX may be 's' for seconds (the default),\n" " 'm' for minutes, 'h' for hours or 'd' for days. NUMBER may be an\n" |
︙ | ︙ | |||
2201 2202 2203 2204 2205 2206 2207 | " will be displayed and the command file will be aborted with an \"Assertion\n" " failed\" message. Otherwise, the command file will continue to bring up\n" " the operating system.\n" "4Conditional Expressions\n" " The IF and ASSERT commands evaluate five different forms of conditional\n" " expressions.:\n\n" "5C Style Simulator State Expressions\n" | < | 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 | " will be displayed and the command file will be aborted with an \"Assertion\n" " failed\" message. Otherwise, the command file will continue to bring up\n" " the operating system.\n" "4Conditional Expressions\n" " The IF and ASSERT commands evaluate five different forms of conditional\n" " expressions.:\n\n" "5C Style Simulator State Expressions\n" " Comparisons can optionally be done with complete C style computational\n" " expressions which leverage the C operations in the below table and can\n" " optionally reference any combination of values that are constants or\n" " contained in environment variables or simulator registers. C style\n" " expression evaluation is initiated by enclosing the expression in\n" " parenthesis.\n\n" " Expression can contain any of these C language operators:\n\n" |
︙ | ︙ | |||
2252 2253 2254 2255 2256 2257 2258 | " If the <logical-op> and <value> are specified, the target register value\n" " is first altered as indicated. The result is then compared to the\n" " <value> via the <conditional-op>. If the result is true, the additional\n" " command(s) are executed before proceeding to the next line in the command\n" " file. Otherwise, the next command in the command file is processed.\n\n" "5String Comparison Expressions\n" " String Values can be compared with:\n" | | > > > | 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 | " If the <logical-op> and <value> are specified, the target register value\n" " is first altered as indicated. The result is then compared to the\n" " <value> via the <conditional-op>. If the result is true, the additional\n" " command(s) are executed before proceeding to the next line in the command\n" " file. Otherwise, the next command in the command file is processed.\n\n" "5String Comparison Expressions\n" " String Values can be compared with:\n" "++{-i}{-w} {NOT} \"<string1>\"|EnVarName1 <compare-op> \"<string2>|EnvVarName2\"\n\n" " The -i switch, if present, causes comparisons to be case insensitive.\n" " The -w switch, if present, causes comparisons to allow arbitrary runs of\n" " whitespace to be equivalent to a single space.\n" " The -i and -w switches may be combined.\n" " <string1> and <string2> are quoted string values which may have\n" " environment variables substituted as desired.\n" " Either quoted string may alternatively be an environment variable name.\n" " <compare-op> may be one of:\n\n" "++== - equal\n" "++EQU - equal\n" "++!= - not equal\n" |
︙ | ︙ | |||
2281 2282 2283 2284 2285 2286 2287 | "5File Existence Expressions\n" " File existence can be determined with:\n\n" "++{NOT} EXIST \"<filespec>\"\n\n" "++{NOT} EXIST <filespec>\n\n" " Specifies a true (false {NOT}) condition if the file exists.\n" "5File Comparison Expressions\n" " Files can have their contents compared with:\n\n" | | | > > > > > > > > > > > > > > > > > > | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 | "5File Existence Expressions\n" " File existence can be determined with:\n\n" "++{NOT} EXIST \"<filespec>\"\n\n" "++{NOT} EXIST <filespec>\n\n" " Specifies a true (false {NOT}) condition if the file exists.\n" "5File Comparison Expressions\n" " Files can have their contents compared with:\n\n" "++-F{W} {NOT} \"<filespec1>\" == \"<filespec2>\" \n\n" " Specifies a true (false {NOT}) condition if the indicated files\n" " have the same contents. If the -W switch is present, allows\n" " arbitrary runs of whitespace to be considered a single space\n" " during file content comparison.\n\n" " When a file comparison determines that files are different, the environment\n" " variable _FILE_COMPARE_DIFF_OFFSET is set to the file offset where the first\n" " difference in the files was observed\n\n" "5Debugging Expression Evaluation\n" " Debug output can be produced which will walk through the details\n" " involved during expression evaluation. This output can, for example,\n" " be enabled as follows:\n\n" "++sim> SET DEBUG STDOUT\n" "++sim> SET SCP-PROCESS DEBUG=EXPSTACK - Expression Stack Activities\n" "++sim> SET SCP-PROCESS DEBUG=EXPEVAL - Expression Evaluation Activities\n" "3Debugging Do File Processing\n" " Debug output can be produced which will walk through the details\n" " involved during DO file proccessing. This output can, for example,\n" " be enabled as follows:\n\n" "++sim> SET DEBUG STDOUT\n" "++sim> SET SCP-PROCESS DEBUG=DO - Debug Output DO processing\n" /***************** 80 character line width template *************************/ #define HLP_EXIT "*Commands Exiting_The_Simulator" "2Exiting The Simulator\n" " EXIT (synonyms QUIT and BYE) returns control to the operating system.\n" "3 Exit Status\n" " An optional numeric exit status may be provided on the EXIT command line\n" " that an operating system script may act on.\n\n" "++EXIT {status} exit with optional status\n\n" /***************** 80 character line width template *************************/ #define HLP_SCREENSHOT "*Commands Screenshot_Video_Window" "2Screenshot Video Window\n" " Simulators with Video devices display the simulated video in a window(s)\n" " on the local system. The contents of that display can be saved in a\n" " file with the SCREENSHOT command:\n\n" "++SCREENSHOT screenshotfile\n\n" #if defined(HAVE_LIBPNG) " which will create a screen shot file called screenshotfile.png\n" #else " which will create a screen shot file called screenshotfile.bmp\n" #endif #define HLP_SPAWN "*Commands Executing_System_Commands" "2Executing System Commands\n" " The simulator can execute operating system commands with the ! (spawn)\n" " command:\n\n" "++! execute local command interpreter\n" "++! <command> execute local host command\n" " If no operating system command is provided, the simulator attempts to\n" " launch the host operating system's command shell.\n" " The exit status from the command which was executed is set as the command\n" " completion status for the ! command. This may influence any enabled ON\n" " condition traps\n" #define HLP_TESTLIB "*Commands Testing_Device_Libraries" "2Testing Device Libraries\n" " A simulator developer may need to invoke the simh internal device library\n" " test routines that exercise the various libraries used by different devices.\n\n" " There are library test routines for devices which use:\n\n" "++sim_disk - Disk devices\n" "++sim_tape - Tape devices\n" "++sim_ether - Ethernet devices\n" "++sim_card - Card Reader/Punch Devices\n" "++sim_tmxr - Terminal Multiplexor Devices\n\n" " The TESTLIB command by itself will invoke library tests for all devices in the\n" " current simulator.\n\n" " The library tests for a specific device can be invoked by specifying the device\n" " name as an argument to the TESTLIB command:\n\n" "++TESTLIB {device} test a specific or all devices\n\n" /***************** 80 character line width template *************************/ "3Switches\n" " Switches can be used to influence the behavior of the TESTLIB command\n\n" "4-d\n" " Many tests are capable of producing various amounts of debug output\n" " during their execution. The -d switch enables that output\n" "2File Tools\n" " Tools to manipulate file containers and to tranfer files/data into or\n" " out of a simulated environment are provided.\n\n" " In general, these are tools natively found on the host operating system.\n" " They are explicitly supported directly from SCP to allow for platform\n" " neutral scripts that either test or build running environments for simh\n" " users.\n\n" #define HLP_TAR "*Commands File_Tools Tar_Tool" "3Tar Tool\n" " tar is an archiving utility\n\n" " The quick and dirty help for the TAR command can be viewed with:\n\n" "++sim> tar --help\n\n" #define HLP_CURL "*Commands File_Tools Curl_Tool" "3Curl Tool\n" " curl is a utility to transfer a URL\n\n" " The quick and dirty help for the CURL command can be viewed with:\n\n" "++sim> curl --help\n\n" #define HLP_DISKINFO "*Commands Disk_Container_Information" "2Disk Container Information\n" " Information about a Disk Container can be displayed with the DISKINFO command:\n\n" "++DISKINFO container-spec show information about a disk container\n\n"; static CTAB cmd_table[] = { { "RESET", &reset_cmd, 0, HLP_RESET, NULL, NULL }, { "EXAMINE", &exdep_cmd, EX_E, HLP_EXAMINE, NULL, NULL }, { "IEXAMINE", &exdep_cmd, EX_E+EX_I, HLP_IEXAMINE, NULL, NULL }, { "DEPOSIT", &exdep_cmd, EX_D, HLP_DEPOSIT, NULL, NULL }, |
︙ | ︙ | |||
2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 | { "LS", &dir_cmd, 0, HLP_LS, NULL, NULL }, { "TYPE", &type_cmd, 0, HLP_TYPE, NULL, NULL }, { "CAT", &type_cmd, 0, HLP_CAT, NULL, NULL }, { "DELETE", &delete_cmd, 0, HLP_DELETE, NULL, NULL }, { "RM", &delete_cmd, 0, HLP_RM, NULL, NULL }, { "COPY", ©_cmd, 0, HLP_COPY, NULL, NULL }, { "CP", ©_cmd, 0, HLP_CP, NULL, NULL }, { "SET", &set_cmd, 0, HLP_SET, NULL, NULL }, { "SHOW", &show_cmd, 0, HLP_SHOW, NULL, NULL }, { "DO", &do_cmd, 1, HLP_DO, NULL, NULL }, { "GOTO", &goto_cmd, 1, HLP_GOTO, NULL, NULL }, { "RETURN", &return_cmd, 0, HLP_RETURN, NULL, NULL }, { "SHIFT", &shift_cmd, 0, HLP_SHIFT, NULL, NULL }, { "CALL", &call_cmd, 0, HLP_CALL, NULL, NULL }, | > > > > > | 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 | { "LS", &dir_cmd, 0, HLP_LS, NULL, NULL }, { "TYPE", &type_cmd, 0, HLP_TYPE, NULL, NULL }, { "CAT", &type_cmd, 0, HLP_CAT, NULL, NULL }, { "DELETE", &delete_cmd, 0, HLP_DELETE, NULL, NULL }, { "RM", &delete_cmd, 0, HLP_RM, NULL, NULL }, { "COPY", ©_cmd, 0, HLP_COPY, NULL, NULL }, { "CP", ©_cmd, 0, HLP_CP, NULL, NULL }, { "RENAME", &rename_cmd, 0, HLP_RENAME, NULL, NULL }, { "MOVE", &rename_cmd, 0, HLP_MOVE, NULL, NULL }, { "MV", &rename_cmd, 0, HLP_MOVE, NULL, NULL }, { "MKDIR", &mkdir_cmd, 0, HLP_MKDIR, NULL, NULL }, { "RMDIR", &rmdir_cmd, 0, HLP_RMDIR, NULL, NULL }, { "SET", &set_cmd, 0, HLP_SET, NULL, NULL }, { "SHOW", &show_cmd, 0, HLP_SHOW, NULL, NULL }, { "DO", &do_cmd, 1, HLP_DO, NULL, NULL }, { "GOTO", &goto_cmd, 1, HLP_GOTO, NULL, NULL }, { "RETURN", &return_cmd, 0, HLP_RETURN, NULL, NULL }, { "SHIFT", &shift_cmd, 0, HLP_SHIFT, NULL, NULL }, { "CALL", &call_cmd, 0, HLP_CALL, NULL, NULL }, |
︙ | ︙ | |||
2378 2379 2380 2381 2382 2383 2384 | { "SEND", &send_cmd, 1, HLP_SEND, NULL, NULL }, { "NOSEND", &send_cmd, 0, HLP_SEND, NULL, NULL }, { "EXPECT", &expect_cmd, 1, HLP_EXPECT, NULL, NULL }, { "NOEXPECT", &expect_cmd, 0, HLP_EXPECT, NULL, NULL }, { "SLEEP", &sleep_cmd, 0, HLP_SLEEP, NULL, NULL }, { "!", &spawn_cmd, 0, HLP_SPAWN, NULL, NULL }, { "HELP", &help_cmd, 0, HLP_HELP, NULL, NULL }, | < > | > > > > > | 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 | { "SEND", &send_cmd, 1, HLP_SEND, NULL, NULL }, { "NOSEND", &send_cmd, 0, HLP_SEND, NULL, NULL }, { "EXPECT", &expect_cmd, 1, HLP_EXPECT, NULL, NULL }, { "NOEXPECT", &expect_cmd, 0, HLP_EXPECT, NULL, NULL }, { "SLEEP", &sleep_cmd, 0, HLP_SLEEP, NULL, NULL }, { "!", &spawn_cmd, 0, HLP_SPAWN, NULL, NULL }, { "HELP", &help_cmd, 0, HLP_HELP, NULL, NULL }, { "SCREENSHOT", &screenshot_cmd,0, HLP_SCREENSHOT, NULL, NULL }, { "TAR", &tar_cmd, 0, HLP_TAR, NULL, NULL }, { "CURL", &curl_cmd, 0, HLP_CURL, NULL, NULL }, { "RUNLIMIT", &runlimit_cmd, 1, HLP_RUNLIMIT, NULL, NULL }, { "NORUNLIMIT", &runlimit_cmd, 0, HLP_RUNLIMIT, NULL, NULL }, { "TESTLIB", &test_lib_cmd, 0, HLP_TESTLIB, NULL, NULL }, { "DISKINFO", &sim_disk_info_cmd, 0, HLP_DISKINFO, NULL, NULL }, { "ZAPTYPE", &sim_disk_info_cmd, 1, NULL, NULL, NULL }, { NULL, NULL, 0, NULL, NULL, NULL } }; static CTAB set_glob_tab[] = { { "CONSOLE", &sim_set_console, 0, HLP_SET_CONSOLE }, { "REMOTE", &sim_set_remote_console, 0, HLP_SET_REMOTE }, { "BREAK", &brk_cmd, SSH_ST, HLP_SET_BREAK }, |
︙ | ︙ | |||
2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 | { "NOVERIFY", &set_verify, 0, HLP_SET_VERIFY }, { "NOVERBOSE", &set_verify, 0, HLP_SET_VERIFY }, { "MESSAGE", &set_message, 1, HLP_SET_MESSAGE }, { "NOMESSAGE", &set_message, 0, HLP_SET_MESSAGE }, { "QUIET", &set_quiet, 1, HLP_SET_QUIET }, { "NOQUIET", &set_quiet, 0, HLP_SET_QUIET }, { "PROMPT", &set_prompt, 0, HLP_SET_PROMPT }, { NULL, NULL, 0 } }; static C1TAB set_dev_tab[] = { { "OCTAL", &set_dev_radix, 8 }, { "DECIMAL", &set_dev_radix, 10 }, { "HEX", &set_dev_radix, 16 }, { "BINARY", &set_dev_radix, 2 }, { "ENABLED", &set_dev_enbdis, 1 }, { "DISABLED", &set_dev_enbdis, 0 }, { "DEBUG", &set_dev_debug, 1 }, { "NODEBUG", &set_dev_debug, 0 }, { NULL, NULL, 0 } }; static C1TAB set_unit_tab[] = { { "ENABLED", &set_unit_enbdis, 1 }, { "DISABLED", &set_unit_enbdis, 0 }, { "DEBUG", &set_dev_debug, 2+1 }, { "NODEBUG", &set_dev_debug, 2+0 }, { NULL, NULL, 0 } }; static SHTAB show_glob_tab[] = { { "CONFIGURATION", &show_config, 0, HLP_SHOW_CONFIG }, { "DEVICES", &show_config, 1, HLP_SHOW_DEVICES }, { "FEATURES", &show_config, 2, HLP_SHOW_FEATURES }, | > > > > > > | 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 | { "NOVERIFY", &set_verify, 0, HLP_SET_VERIFY }, { "NOVERBOSE", &set_verify, 0, HLP_SET_VERIFY }, { "MESSAGE", &set_message, 1, HLP_SET_MESSAGE }, { "NOMESSAGE", &set_message, 0, HLP_SET_MESSAGE }, { "QUIET", &set_quiet, 1, HLP_SET_QUIET }, { "NOQUIET", &set_quiet, 0, HLP_SET_QUIET }, { "PROMPT", &set_prompt, 0, HLP_SET_PROMPT }, { "RUNLIMIT", &set_runlimit, 1, HLP_RUNLIMIT }, { "NORUNLIMIT", &set_runlimit, 0, HLP_RUNLIMIT }, { NULL, NULL, 0 } }; static C1TAB set_dev_tab[] = { { "OCTAL", &set_dev_radix, 8 }, { "DECIMAL", &set_dev_radix, 10 }, { "HEX", &set_dev_radix, 16 }, { "BINARY", &set_dev_radix, 2 }, { "ENABLED", &set_dev_enbdis, 1 }, { "DISABLED", &set_dev_enbdis, 0 }, { "DEBUG", &set_dev_debug, 1 }, { "NODEBUG", &set_dev_debug, 0 }, { "APPEND", &set_unit_append, 0 }, { "EOF", &set_unit_append, 0 }, { NULL, NULL, 0 } }; static C1TAB set_unit_tab[] = { { "ENABLED", &set_unit_enbdis, 1 }, { "DISABLED", &set_unit_enbdis, 0 }, { "DEBUG", &set_dev_debug, 2+1 }, { "NODEBUG", &set_dev_debug, 2+0 }, { "APPEND", &set_unit_append, 0 }, { "EOF", &set_unit_append, 0 }, { NULL, NULL, 0 } }; static SHTAB show_glob_tab[] = { { "CONFIGURATION", &show_config, 0, HLP_SHOW_CONFIG }, { "DEVICES", &show_config, 1, HLP_SHOW_DEVICES }, { "FEATURES", &show_config, 2, HLP_SHOW_FEATURES }, |
︙ | ︙ | |||
2459 2460 2461 2462 2463 2464 2465 | { "DEBUG", &sim_show_debug, 0, HLP_SHOW_DEBUG }, { "THROTTLE", &sim_show_throt, 0, HLP_SHOW_THROTTLE }, { "ASYNCH", &sim_show_asynch, 0, HLP_SHOW_ASYNCH }, { "ETHERNET", ð_show_devices, 0, HLP_SHOW_ETHERNET }, { "SERIAL", &sim_show_serial, 0, HLP_SHOW_SERIAL }, { "MULTIPLEXER", &tmxr_show_open_devices, 0, HLP_SHOW_MULTIPLEXER }, { "MUX", &tmxr_show_open_devices, 0, HLP_SHOW_MULTIPLEXER }, | < < | > > | 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 | { "DEBUG", &sim_show_debug, 0, HLP_SHOW_DEBUG }, { "THROTTLE", &sim_show_throt, 0, HLP_SHOW_THROTTLE }, { "ASYNCH", &sim_show_asynch, 0, HLP_SHOW_ASYNCH }, { "ETHERNET", ð_show_devices, 0, HLP_SHOW_ETHERNET }, { "SERIAL", &sim_show_serial, 0, HLP_SHOW_SERIAL }, { "MULTIPLEXER", &tmxr_show_open_devices, 0, HLP_SHOW_MULTIPLEXER }, { "MUX", &tmxr_show_open_devices, 0, HLP_SHOW_MULTIPLEXER }, { "VIDEO", &vid_show, 0, HLP_SHOW_VIDEO }, { "CLOCKS", &sim_show_timers, 0, HLP_SHOW_CLOCKS }, { "SEND", &sim_show_send, 0, HLP_SHOW_SEND }, { "EXPECT", &sim_show_expect, 0, HLP_SHOW_EXPECT }, { "ON", &show_on, -1, HLP_SHOW_ON }, { "DO", &show_do, 0, HLP_SHOW_DO }, { "RUNLIMIT", &show_runlimit, 0, HLP_SHOW_RUNLIMIT }, { NULL, NULL, 0 } }; static SHTAB show_dev_tab[] = { { "RADIX", &show_dev_radix, 0 }, { "DEBUG", &show_dev_debug, 0 }, { "MODIFIERS", &show_dev_modifiers, 0 }, |
︙ | ︙ | |||
2509 2510 2511 2512 2513 2514 2515 | int unsetenv(const char *envname) { setenv(envname, "", 1); return 0; } #endif | | > > > > > > > > > > > | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 | int unsetenv(const char *envname) { setenv(envname, "", 1); return 0; } #endif t_stat process_stdin_commands (t_stat stat, char *argv[], t_bool do_called); /* Main command loop */ int main (int argc, char *argv[]) { char cbuf[4*CBUFSIZE], *cptr, *cptr2; char nbuf[PATH_MAX + 7]; char **targv = NULL; int32 i, sw; t_bool lookswitch; t_bool register_check = FALSE; t_stat stat = SCPE_OK; #if defined (__MWERKS__) && defined (macintosh) argc = ccommand (&argv); #endif /* Make sure that argv has at least 10 elements and that it ends in a NULL pointer */ targv = (char **)calloc (1+MAX(10, argc), sizeof(*targv)); for (i=0; i<argc; i++) targv[i] = argv[i]; argv = targv; set_prompt (0, "sim>"); /* start with set standard prompt */ *cbuf = 0; /* init arg buffer */ sim_switches = 0; /* init switches */ lookswitch = TRUE; stdnul = fopen(NULL_DEVICE,"wb"); sim_prog_name = argv [0]; /* save a pointer to the program name */ if (argc > 1) { /* Check for special argument to invoke register test */ if (sim_strcasecmp (argv[1], "RegisterSanityCheck") == 0) { register_check = TRUE; --argc; /* Remove special argument to avoid confusion later */ for (i = 1; i < argc; i++) argv[i] = argv[i+1]; argv[i+1] = NULL; } } for (i = 1; i < argc; i++) { /* loop thru args */ if (argv[i] == NULL) /* paranoia */ continue; if ((*argv[i] == '-') && lookswitch) { /* switch? */ if (get_switches (argv[i], &sw, NULL) == SW_ERROR) { fprintf (stderr, "Invalid switch %s\n", argv[i]); free (targv); return EXIT_FAILURE; } sim_switches = sim_switches | sw; } else { if ((strlen (argv[i]) + strlen (cbuf) + 3) >= sizeof(cbuf)) { fprintf (stderr, "Argument string too long\n"); free (targv); return EXIT_FAILURE; } if (*cbuf) /* concat args */ strlcat (cbuf, " ", sizeof (cbuf)); sprintf(&cbuf[strlen(cbuf)], "%s%s%s", strchr(argv[i], ' ') ? "\"" : "", argv[i], strchr(argv[i], ' ') ? "\"" : ""); lookswitch = FALSE; /* no more switches */ } } /* end for */ if (*argv[0]) { /* sim name arg? */ char *np; /* "path.ini" */ strlcpy (nbuf, argv[0], PATH_MAX + 2); /* copy sim name */ if ((np = (char *)match_ext (nbuf, "EXE"))) /* remove .exe */ *np = 0; np = strrchr (nbuf, '/'); /* stript path and try again in cwd */ if (np == NULL) np = strrchr (nbuf, '\\'); /* windows path separator */ if (np == NULL) np = strrchr (nbuf, ']'); /* VMS path separator */ if (np != NULL) setenv ("SIM_BIN_NAME", np+1, 1); /* Publish simulator binary name */ setenv ("SIM_BIN_PATH", argv[0], 1); #ifdef PIDP8I if (strstr (argv[0], "pidp8i-sim") == 0) use_pidp8i_extensions = 0; else if (start_pidp8i_gpio_thread (0) != 0) exit (EXIT_FAILURE); #endif } sim_quiet = sim_switches & SWMASK ('Q'); /* -q means quiet */ sim_on_inherit = sim_switches & SWMASK ('O'); /* -o means inherit on state */ sim_init_sock (); /* init socket capabilities */ AIO_INIT; /* init Asynch I/O */ sim_finit (); /* init fio package */ setenv ("SIM_NAME", sim_name, 1); /* Publish simulator name */ stop_cpu = FALSE; sim_interval = 0; sim_time = sim_rtime = 0; noqueue_time = 0; sim_clock_queue = QUEUE_LIST_END; sim_is_running = FALSE; sim_log = NULL; if (sim_emax <= 0) sim_emax = 1; if (sim_timer_init ()) { fprintf (stderr, "Fatal timer initialization error\n"); if (sim_ttisatty()) read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); free (targv); return EXIT_FAILURE; } sim_register_internal_device (&sim_scp_dev); sim_register_internal_device (&sim_expect_dev); sim_register_internal_device (&sim_step_dev); sim_register_internal_device (&sim_flush_dev); sim_register_internal_device (&sim_runlimit_dev); if ((stat = sim_ttinit ()) != SCPE_OK) { fprintf (stderr, "Fatal terminal initialization error\n%s\n", sim_error_text (stat)); if (sim_ttisatty()) read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); sim_exit_status = EXIT_FAILURE; goto cleanup_and_exit; } if ((sim_eval = (t_value *) calloc (sim_emax, sizeof (t_value))) == NULL) { fprintf (stderr, "Unable to allocate examine buffer\n"); if (sim_ttisatty()) read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); sim_exit_status = EXIT_FAILURE; goto cleanup_and_exit; }; if (sim_dflt_dev == NULL) /* if no default */ sim_dflt_dev = sim_devices[0]; if ((stat = reset_all_p (0)) != SCPE_OK) { fprintf (stderr, "Fatal simulator initialization error\nDevice %s initial reset call returned: %s\n", sim_failed_reset_dptr->name, sim_error_text (stat)); if (sim_ttisatty()) read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); sim_exit_status = EXIT_FAILURE; goto cleanup_and_exit; } if (register_check) { /* This test is explicitly run after the above reset_all_p() so that any devices which dynamically manipulate their register lists have already done that. */ sim_printf (" Running internal register sanity checks on %s simulator.\n", sim_name); if ((stat = sim_sanity_check_register_declarations ()) != SCPE_OK) { sim_printf ("Simulator device register sanity check error\n"); if (sim_ttisatty()) read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); sim_exit_status = EXIT_FAILURE; goto cleanup_and_exit; } sim_printf ("*** Good Registers in %s simulator.\n", sim_name); if (argc < 2) { /* No remaining command arguments? */ sim_exit_status = EXIT_SUCCESS; /* then we're done */ goto cleanup_and_exit; } } if ((stat = sim_brk_init ()) != SCPE_OK) { fprintf (stderr, "Fatal breakpoint table initialization error\n%s\n", sim_error_text (stat)); if (sim_ttisatty()) read_line_p ("Hit Return to exit: ", cbuf, sizeof (cbuf) - 1, stdin); sim_exit_status = EXIT_FAILURE; goto cleanup_and_exit; } /* always check for register definition problems */ sim_sanity_check_register_declarations (); signal (SIGINT, int_handler); if (!sim_quiet) { printf ("\n"); show_version (stdout, NULL, NULL, 0, NULL); } sim_timer_precalibrate_execution_rate (); show_version (stdnul, NULL, NULL, 1, NULL); /* Quietly set SIM_OSTYPE */ #if defined (HAVE_PCRE_H) setenv ("SIM_REGEX_TYPE", "PCRE", 1); /* Publish regex type */ #endif sim_argv = argv; if (sim_switches & SWMASK ('T')) /* Command Line -T switch */ stat = test_lib_cmd (0, "ALL"); /* run library unit tests */ cptr = getenv("HOME"); if (cptr == NULL) { cptr = getenv("HOMEPATH"); cptr2 = getenv("HOMEDRIVE"); } else cptr2 = NULL; if (cptr && (sizeof (nbuf) > strlen (cptr) + strlen ("/simh.ini") + 3)) { snprintf(nbuf, sizeof (nbuf), "\"%s%s%ssimh.ini\"", cptr2 ? cptr2 : "", cptr, strchr (cptr, '/') ? "/" : "\\"); stat = do_cmd (-1, nbuf) & ~SCPE_NOMESSAGE; /* simh.ini proc cmd file */ } if (SCPE_BARE_STATUS(stat) == SCPE_OPENERR) stat = do_cmd (-1, "simh.ini"); /* simh.ini proc cmd file */ if (*cbuf) /* cmd file arg? */ stat = do_cmd (0, cbuf); /* proc cmd file */ else if (*argv[0]) { /* sim name arg? */ |
︙ | ︙ | |||
2683 2684 2685 2686 2687 2688 2689 | stat = do_cmd (-1, np) & ~SCPE_NOMESSAGE; /* proc default cmd file */ } } } if (SCPE_BARE_STATUS(stat) == SCPE_OPENERR) /* didn't exist/can't open? */ stat = SCPE_OK; | < < < | > > | | | | | | > > > > < < | > > > > > > > > > > > > > > > > > > | 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 | stat = do_cmd (-1, np) & ~SCPE_NOMESSAGE; /* proc default cmd file */ } } } if (SCPE_BARE_STATUS(stat) == SCPE_OPENERR) /* didn't exist/can't open? */ stat = SCPE_OK; if (SCPE_BARE_STATUS(stat) != SCPE_EXIT) process_stdin_commands (SCPE_BARE_STATUS(stat), argv, FALSE); cleanup_and_exit: detach_all (0, TRUE); /* close files */ sim_set_deboff (0, NULL); /* close debug */ sim_set_logoff (0, NULL); /* close log */ sim_set_notelnet (0, NULL); /* close Telnet */ vid_close_all (); /* close video */ sim_ttclose (); /* close console */ AIO_CLEANUP; /* Asynch I/O */ sim_cleanup_sock (); /* cleanup sockets */ fclose (stdnul); /* close bit bucket file handle */ free (targv); /* release any argv copy that was made */ #ifdef PIDP8I if (use_pidp8i_extensions) stop_pidp8i_gpio_thread (); #endif return sim_exit_status; } t_stat process_stdin_commands (t_stat stat, char *argv[], t_bool do_called) { char cbuf[4*CBUFSIZE], gbuf[CBUFSIZE]; CONST char *cptr = NULL; t_stat stat_nomessage; CTAB *cmdp = NULL; stat = SCPE_BARE_STATUS(stat); /* remove possible flag */ while (stat != SCPE_EXIT) { /* in case exit */ if (stop_cpu) { /* SIGINT happened? */ stop_cpu = FALSE; if ((!sim_ttisatty()) || sigterm_received) { stat = SCPE_EXIT; break; } if (sim_on_actions[sim_do_depth][ON_SIGINT_ACTION]) sim_brk_setact (sim_on_actions[sim_do_depth][ON_SIGINT_ACTION]); } #ifdef PIDP8I if (sim_do_ocptr[sim_do_depth] = cptr = build_pidp8i_scp_cmd (cbuf, sizeof (cbuf))) printf ("Running '%s'...\n", cptr); else #endif sim_do_ocptr[sim_do_depth] = cptr = sim_brk_getact (cbuf, sizeof(cbuf)); /* get bkpt action */ if (sim_do_ocptr[sim_do_depth]) { /* pending action? */ if (sim_do_echo) printf ("%s+ %s\n", sim_prompt, cptr); /* echo */ sim_cptr_is_action[sim_do_depth] = TRUE; } else { if (sim_vm_read != NULL) { /* sim routine? */ printf ("%s", sim_prompt); /* prompt */ cptr = (*sim_vm_read) (cbuf, sizeof(cbuf), stdin); } else cptr = read_line_p (sim_prompt, cbuf, sizeof(cbuf), stdin);/* read with prompt*/ sim_do_ocptr[sim_do_depth] = cptr; sim_cptr_is_action[sim_do_depth] = FALSE; } if (cptr == NULL) { /* EOF? or SIGINT? */ if (sim_ttisatty()) { printf ("\n"); continue; /* ignore tty EOF */ } else break; /* otherwise exit */ } if (*cptr == 0) /* ignore blank */ continue; sim_cmd_echoed = TRUE; sim_sub_args (cbuf, sizeof(cbuf), argv); if (sim_log) /* log cmd */ fprintf (sim_log, "%s%s\n", sim_prompt, cptr); if (sim_deb && (sim_deb != sim_log) && (sim_deb != stdout)) fprintf (sim_deb, "%s%s\n", sim_prompt, cptr); cptr = get_glyph_cmd (cptr, gbuf); /* get command glyph */ sim_switches = 0; /* init switches */ if (!sim_cptr_is_action[sim_do_depth]) { sim_if_cmd_last[sim_do_depth] = sim_if_cmd[sim_do_depth]; sim_if_result_last[sim_do_depth] = sim_if_result[sim_do_depth]; sim_if_result[sim_do_depth] = sim_if_cmd[sim_do_depth] = FALSE; } if ((cmdp = find_cmd (gbuf))) { /* lookup command */ if (do_called && (cmdp->action == &return_cmd)) /* RETURN command? */ break; stat = cmdp->action (cmdp->arg, cptr); /* if found, exec */ } else stat = SCPE_UNK; stat_nomessage = stat & SCPE_NOMESSAGE; /* extract possible message supression flag */ stat_nomessage = stat_nomessage || (!sim_show_message);/* Apply global suppression */ stat = SCPE_BARE_STATUS(stat); /* remove possible flag */ sim_last_cmd_stat = stat; /* save command error status */ if (!stat_nomessage) { /* displaying message status? */ if (cmdp && (cmdp->message)) /* special message handler? */ cmdp->message (NULL, stat); /* let it deal with display */ else if (stat >= SCPE_BASE) /* error? */ sim_printf ("%s\n", sim_error_text (stat)); } if ((sim_on_check[sim_do_depth]) && (stat != SCPE_OK)) { if ((stat <= SCPE_MAX_ERR) && sim_on_actions[sim_do_depth][stat]) sim_brk_setact (sim_on_actions[sim_do_depth][stat]); else sim_brk_setact (sim_on_actions[sim_do_depth][0]); } if (sim_vm_post != NULL) (*sim_vm_post) (TRUE); } /* end while */ if (do_called && cmdp && (cmdp->action == &return_cmd) && (0 != *cptr)) { /* return command with argument? */ sim_string_to_stat (cptr, &stat); sim_last_cmd_stat = stat; /* save explicit status as command error status */ if (sim_switches & SWMASK ('Q')) stat |= SCPE_NOMESSAGE; /* suppress error message display (in caller) if requested */ return stat; /* return with explicit return status */ } return stat; } /* Set prompt routine */ t_stat set_prompt (int32 flag, CONST char *cptr) { |
︙ | ︙ | |||
2888 2889 2890 2891 2892 2893 2894 | } fprintf (st, "Help is available for devices\n\n"); fprintf (st, " HELP dev\n"); fprintf (st, " HELP dev SET\n"); fprintf (st, " HELP dev SHOW\n"); fprintf (st, " HELP dev REGISTERS\n\n"); fprintf (st, "Help is available for the following commands:\n\n "); | > | | 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 | } fprintf (st, "Help is available for devices\n\n"); fprintf (st, " HELP dev\n"); fprintf (st, " HELP dev SET\n"); fprintf (st, " HELP dev SHOW\n"); fprintf (st, " HELP dev REGISTERS\n\n"); fprintf (st, "Help is available for the following commands:\n\n "); if (hlp_cmdp) qsort (hlp_cmdp, cmd_cnt, sizeof(*hlp_cmdp), _cmd_name_compare); line_offset = 4; for (i=0; i<cmd_cnt; ++i) { fputs (hlp_cmdp[i]->name, st); line_offset += 5 + max_cmdname_size; if (line_offset + max_cmdname_size > 79) { line_offset = 4; fprintf (st, "\n "); |
︙ | ︙ | |||
2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 | t_bool found = FALSE; t_bool all_unique = TRUE; size_t max_namelen = 0; DEVICE *tdptr; CONST char *tptr; char *namebuf; char rangebuf[32]; if (dptr->registers) for (rptr = dptr->registers; rptr->name != NULL; rptr++) { if (rptr->flags & REG_HIDDEN) continue; if (rptr->depth > 1) sprintf (rangebuf, "[%d:%d]", 0, rptr->depth-1); else strcpy (rangebuf, ""); if (max_namelen < (strlen(rptr->name) + strlen (rangebuf))) max_namelen = strlen(rptr->name) + strlen (rangebuf); found = TRUE; trptr = find_reg_glob (rptr->name, &tptr, &tdptr); if ((trptr == NULL) || (tdptr != dptr)) all_unique = FALSE; } if (!found) { if (!silent) fprintf (st, "No register help is available for the %s device\n", dptr->name); } else { namebuf = (char *)calloc (max_namelen + 1, sizeof (*namebuf)); fprintf (st, "\nThe %s device implements these registers:\n\n", dptr->name); for (rptr = dptr->registers; rptr->name != NULL; rptr++) { if (rptr->flags & REG_HIDDEN) continue; if (rptr->depth <= 1) sprintf (namebuf, "%*s", -((int)max_namelen), rptr->name); else { sprintf (rangebuf, "[%d:%d]", 0, rptr->depth-1); sprintf (namebuf, "%s%*s", rptr->name, (int)(strlen(rptr->name))-((int)max_namelen), rangebuf); } if (all_unique) { | > > > > > | | | > > > > > > | 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 | t_bool found = FALSE; t_bool all_unique = TRUE; size_t max_namelen = 0; DEVICE *tdptr; CONST char *tptr; char *namebuf; char rangebuf[32]; int side_effects = 0; if (dptr->registers) for (rptr = dptr->registers; rptr->name != NULL; rptr++) { if (rptr->flags & REG_HIDDEN) continue; side_effects += ((rptr->flags & REG_DEPOSIT) != 0); if (rptr->depth > 1) sprintf (rangebuf, "[%d:%d]", 0, rptr->depth-1); else strcpy (rangebuf, ""); if (max_namelen < (strlen(rptr->name) + strlen (rangebuf))) max_namelen = strlen(rptr->name) + strlen (rangebuf); found = TRUE; trptr = find_reg_glob (rptr->name, &tptr, &tdptr); if ((trptr == NULL) || (tdptr != dptr)) all_unique = FALSE; } if (!found) { if (!silent) fprintf (st, "No register help is available for the %s device\n", dptr->name); } else { namebuf = (char *)calloc (max_namelen + 1, sizeof (*namebuf)); fprintf (st, "\nThe %s device implements these registers:\n\n", dptr->name); for (rptr = dptr->registers; rptr->name != NULL; rptr++) { char note[2]; if (rptr->flags & REG_HIDDEN) continue; strlcpy (note, (side_effects != 0) ? ((rptr->flags & REG_DEPOSIT) ? "+" : " ") : "", sizeof (note)); if (rptr->depth <= 1) sprintf (namebuf, "%*s", -((int)max_namelen), rptr->name); else { sprintf (rangebuf, "[%d:%d]", 0, rptr->depth-1); sprintf (namebuf, "%s%*s", rptr->name, (int)(strlen(rptr->name))-((int)max_namelen), rangebuf); } if (all_unique) { fprintf (st, " %s %4d %s %s\n", namebuf, rptr->width, note, rptr->desc ? rptr->desc : ""); continue; } trptr = find_reg_glob (rptr->name, &tptr, &tdptr); if ((trptr == NULL) || (tdptr != dptr)) fprintf (st, " %s %s %4d %s %s\n", dptr->name, namebuf, rptr->width, note, rptr->desc ? rptr->desc : ""); else fprintf (st, " %*s %s %4d %s %s\n", (int)strlen(dptr->name), "", namebuf, rptr->width, note, rptr->desc ? rptr->desc : ""); } free (namebuf); if (side_effects) fprintf (st, "\n + Deposits to %s register%s will have some additional\n" " side effects which can be suppressed if the deposit is\n" " done with the -Z switch specified\n", (side_effects == 1) ? "this" : "these", (side_effects == 1) ? "" : "s"); } } void fprint_reg_help (FILE *st, DEVICE *dptr) { fprint_reg_help_ex (st, dptr, TRUE); } |
︙ | ︙ | |||
3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 | void fprint_set_help_ex (FILE *st, DEVICE *dptr, t_bool silent) { MTAB *mptr; DEBTAB *dep; t_bool found = FALSE; t_bool deb_desc_available = FALSE; char buf[CBUFSIZE], header[CBUFSIZE]; sprintf (header, "\n%s device SET commands:\n\n", dptr->name); if (dptr->modifiers) { for (mptr = dptr->modifiers; mptr->mask != 0; mptr++) { if (!MODMASK(mptr,MTAB_VDV) && MODMASK(mptr,MTAB_VUN) && (dptr->numunits != 1)) continue; /* skip unit only extended modifiers */ | > > > > > > > > > > > > > > > > | | 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 | void fprint_set_help_ex (FILE *st, DEVICE *dptr, t_bool silent) { MTAB *mptr; DEBTAB *dep; t_bool found = FALSE; t_bool deb_desc_available = FALSE; char buf[CBUFSIZE], header[CBUFSIZE]; uint32 enabled_units = dptr->numunits; char unit_spec[50]; uint32 unit, found_unit = 0; sprintf (header, "\n%s device SET commands:\n\n", dptr->name); for (unit=0; unit < dptr->numunits; unit++) if (dptr->units[unit].flags & UNIT_DIS) --enabled_units; else found_unit = unit; if (enabled_units == 1) { if (found_unit == 0) snprintf (unit_spec, sizeof (unit_spec), "%s", sim_dname (dptr)); else snprintf (unit_spec, sizeof (unit_spec), "%s%u", sim_dname (dptr), found_unit); } else snprintf (unit_spec, sizeof (unit_spec), "%sn", sim_dname (dptr)); if (dptr->modifiers) { for (mptr = dptr->modifiers; mptr->mask != 0; mptr++) { if (!MODMASK(mptr,MTAB_VDV) && MODMASK(mptr,MTAB_VUN) && (dptr->numunits != 1)) continue; /* skip unit only extended modifiers */ if ((enabled_units != 1) && !(mptr->mask & MTAB_XTD)) continue; /* skip unit only simple modifiers */ if (mptr->mstring) { fprint_header (st, &found, header); sprintf (buf, "set %s %s%s", sim_dname (dptr), mptr->mstring, (strchr(mptr->mstring, '=')) ? "" : (MODMASK(mptr,MTAB_VALR) ? "=val" : (MODMASK(mptr,MTAB_VALO) ? "{=val}" : ""))); if ((strlen (buf) < 30) || (!mptr->help)) fprintf (st, "%-30s\t%s\n", buf, mptr->help ? mptr->help : ""); else |
︙ | ︙ | |||
3067 3068 3069 3070 3071 3072 3073 | fprintf (st, "set %s NODEBUG=", sim_dname (dptr)); for (dep = dptr->debflags; dep->name != NULL; dep++) fprintf (st, "%s%s", ((dep == dptr->debflags) ? "" : ";"), dep->name); fprintf (st, "\n"); fprintf (st, "%-30s\tDisables specific debugging for device %s\n", buf, sim_dname (dptr)); } } | | | | | | | | | | | | | | < > > | > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > | | | 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 | fprintf (st, "set %s NODEBUG=", sim_dname (dptr)); for (dep = dptr->debflags; dep->name != NULL; dep++) fprintf (st, "%s%s", ((dep == dptr->debflags) ? "" : ";"), dep->name); fprintf (st, "\n"); fprintf (st, "%-30s\tDisables specific debugging for device %s\n", buf, sim_dname (dptr)); } } if ((dptr->modifiers) && (dptr->units)) { /* handle unit specific modifiers */ if (dptr->units->flags & UNIT_DISABLE) { fprint_header (st, &found, header); sprintf (buf, "set %s ENABLE", unit_spec); fprintf (st, "%-30s\tEnables unit %s\n", buf, unit_spec); sprintf (buf, "set %s DISABLE", unit_spec); fprintf (st, "%-30s\tDisables unit %sn\n", buf, unit_spec); } if (((dptr->flags & DEV_DEBUG) || (dptr->debflags)) && ((DEV_TYPE(dptr) == DEV_DISK) || (DEV_TYPE(dptr) == DEV_TAPE))) { sprintf (buf, "set %s DEBUG", unit_spec); fprintf (st, "%-30s\tEnables debugging for device unit %s\n", buf, unit_spec); sprintf (buf, "set %s NODEBUG", unit_spec); fprintf (st, "%-30s\tDisables debugging for device unit %s\n", buf, unit_spec); if (dptr->debflags) { strcpy (buf, ""); fprintf (st, "set %s DEBUG=", unit_spec); for (dep = dptr->debflags; dep->name != NULL; dep++) fprintf (st, "%s%s", ((dep == dptr->debflags) ? "" : ";"), dep->name); fprintf (st, "\n"); fprintf (st, "%-30s\tEnables specific debugging for device unit %s\n", buf, unit_spec); fprintf (st, "set %s NODEBUG=", unit_spec); for (dep = dptr->debflags; dep->name != NULL; dep++) fprintf (st, "%s%s", ((dep == dptr->debflags) ? "" : ";"), dep->name); fprintf (st, "\n"); fprintf (st, "%-30s\tDisables specific debugging for device unit %s\n", buf, unit_spec); } } for (mptr = dptr->modifiers; mptr->mask != 0; mptr++) { if ((!MODMASK(mptr,MTAB_VUN)) && MODMASK(mptr,MTAB_XTD)) continue; /* skip device only modifiers */ if ((!mptr->valid) && MODMASK(mptr,MTAB_XTD)) continue; /* skip show only modifiers */ if ((enabled_units == 1) && (found_unit == 0)) continue; if (mptr->mstring) { fprint_header (st, &found, header); sprintf (buf, "set %s %s%s", unit_spec, mptr->mstring, (strchr(mptr->mstring, '=')) ? "" : (MODMASK(mptr,MTAB_VALR) ? "=val" : (MODMASK(mptr,MTAB_VALO) ? "{=val}": ""))); fprintf (st, "%-30s\t%s\n", buf, (strchr (mptr->mstring, '=')) ? ((strlen (buf) > 30) ? "" : mptr->help) : (mptr->help ? mptr->help : "")); if ((strchr (mptr->mstring, '=')) && (strlen (buf) > 30)) fprintf (st, "%-30s\t%s\n", "", mptr->help); } } } if (enabled_units) { for (unit=0; unit < dptr->numunits; unit++) if ((!(dptr->units[unit].flags & UNIT_DIS)) && (dptr->units[unit].flags & UNIT_SEQ) && (!(dptr->units[unit].flags & UNIT_MUSTBUF))) { sprintf (buf, "set %s%s APPEND", sim_uname (&dptr->units[unit]), (enabled_units > 1) ? "n" : ""); fprintf (st, "%-30s\tSets %s%s position to EOF\n", buf, sim_uname (&dptr->units[unit]), (enabled_units > 1) ? "n" : ""); break; } } if (deb_desc_available) { fprintf (st, "\n*%s device DEBUG settings:\n", sim_dname (dptr)); for (dep = dptr->debflags; dep->name != NULL; dep++) fprintf (st, "%4s%-12s%s\n", "", dep->name, dep->desc ? dep->desc : ""); } if (!found && !silent) fprintf (st, "No SET help is available for the %s device\n", dptr->name); } void fprint_set_help (FILE *st, DEVICE *dptr) { fprint_set_help_ex (st, dptr, TRUE); } void fprint_show_help_ex (FILE *st, DEVICE *dptr, t_bool silent) { MTAB *mptr; t_bool found = FALSE; char buf[CBUFSIZE], header[CBUFSIZE]; uint32 enabled_units = dptr->numunits; char unit_spec[50]; uint32 unit, found_unit = 0; sprintf (header, "\n%s device SHOW commands:\n\n", dptr->name); for (unit=0; unit < dptr->numunits; unit++) if (dptr->units[unit].flags & UNIT_DIS) --enabled_units; else found_unit = unit; if (enabled_units == 1) snprintf (unit_spec, sizeof (unit_spec), "%s%u", sim_dname (dptr), found_unit); else snprintf (unit_spec, sizeof (unit_spec), "%sn", sim_dname (dptr)); snprintf (unit_spec, sizeof (unit_spec), "%s%s", sim_dname (dptr), ((enabled_units == 1) && ((dptr->units[0].flags & UNIT_DIS) == 0)) ? "0" : "n"); if (dptr->modifiers) { for (mptr = dptr->modifiers; mptr->mask != 0; mptr++) { if (!MODMASK(mptr,MTAB_VDV) && MODMASK(mptr,MTAB_VUN) && (dptr->numunits != 1)) continue; /* skip unit only extended modifiers */ if ((enabled_units != 1) && !(mptr->mask & MTAB_XTD)) continue; /* skip unit only simple modifiers */ if ((!mptr->disp) || (!mptr->pstring) || !(*mptr->pstring)) continue; fprint_header (st, &found, header); sprintf (buf, "show %s %s%s", sim_dname (dptr), mptr->pstring, MODMASK(mptr,MTAB_SHP) ? "{=arg}" : ""); fprintf (st, "%-30s\t%s\n", buf, mptr->help ? mptr->help : ""); } } if ((dptr->flags & DEV_DEBUG) || (dptr->debflags)) { fprint_header (st, &found, header); sprintf (buf, "show %s DEBUG", sim_dname (dptr)); fprintf (st, "%-30s\tDisplays debugging status for device %s\n", buf, sim_dname (dptr)); } if (((dptr->flags & DEV_DEBUG) || (dptr->debflags)) && ((DEV_TYPE(dptr) == DEV_DISK) || (DEV_TYPE(dptr) == DEV_TAPE))) { sprintf (buf, "show %s DEBUG", unit_spec); fprintf (st, "%-30s\tDisplays debugging status for device unit %s\n", buf, unit_spec); } if ((dptr->modifiers) && (dptr->units)) { /* handle unit specific modifiers */ for (mptr = dptr->modifiers; mptr->mask != 0; mptr++) { if ((!MODMASK(mptr,MTAB_VUN)) && MODMASK(mptr,MTAB_XTD)) continue; /* skip device only modifiers */ if ((!mptr->disp) || (!mptr->pstring)) continue; fprint_header (st, &found, header); sprintf (buf, "show %s %s%s", unit_spec, mptr->pstring, MODMASK(mptr,MTAB_SHP) ? "=arg" : ""); fprintf (st, "%-30s\t%s\n", buf, mptr->help ? mptr->help : ""); } } if (!found && !silent) fprintf (st, "No SHOW help is available for the %s device\n", dptr->name); } |
︙ | ︙ | |||
3270 3271 3272 3273 3274 3275 3276 | } t_stat help_cmd_output (int32 flag, const char *help, const char *help_base) { switch (help[0]) { case '*': scp_help (stdout, NULL, NULL, flag, help_base ? help_base : simh_help, help+1); | | | > > > > > > > | 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 | } t_stat help_cmd_output (int32 flag, const char *help, const char *help_base) { switch (help[0]) { case '*': scp_help (stdout, NULL, NULL, flag, help_base ? help_base : simh_help, help+1); if (sim_log && (!sim_oline)) scp_help (sim_log, NULL, NULL, flag | SCP_HELP_FLAT, help_base ? help_base : simh_help, help+1); break; default: fputs (help, stdout); if (sim_log && (!sim_oline)) fputs (help, sim_log); break; } return SCPE_OK; } t_stat help_cmd (int32 flag, CONST char *cptr) { char gbuf[CBUFSIZE], gbuf2[CBUFSIZE]; CTAB *cmdp; DEVICE *dptr; UNIT *uptr; t_stat r; static t_bool help_initialized = FALSE; t_bool explicit_device = FALSE; if (!help_initialized) { simh_help = (char *)malloc (1 + strlen (simh_help1) + strlen (simh_help2)); strcpy (simh_help, simh_help1); strcat (simh_help, simh_help2); help_initialized = TRUE; } GET_SWITCHES (cptr); /* get switches */ if (sim_switches & SWMASK ('F')) flag = flag | SCP_HELP_FLAT; if (*cptr) { cptr = get_glyph (cptr, gbuf, 0); if (0 == strcmp (gbuf, "DEVICE")) { |
︙ | ︙ | |||
3319 3320 3321 3322 3323 3324 3325 | cptr = get_glyph (cptr, gbuf, 0); dptr = find_unit (gbuf, &uptr); if (dptr == NULL) dptr = find_dev (gbuf); if (dptr != NULL) { r = help_dev_help (stdout, dptr, uptr, flag, (cmdp->action == &set_cmd) ? "SET" : "SHOW"); | | | 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 | cptr = get_glyph (cptr, gbuf, 0); dptr = find_unit (gbuf, &uptr); if (dptr == NULL) dptr = find_dev (gbuf); if (dptr != NULL) { r = help_dev_help (stdout, dptr, uptr, flag, (cmdp->action == &set_cmd) ? "SET" : "SHOW"); if (sim_log && (!sim_oline)) help_dev_help (sim_log, dptr, uptr, flag | SCP_HELP_FLAT, (cmdp->action == &set_cmd) ? "SET" : "SHOW"); return r; } if (cmdp->action == &set_cmd) { /* HELP SET xxx (not device or unit) */ if ((cmdp = find_ctab (set_glob_tab, gbuf)) && (cmdp->help)) return help_cmd_output (flag, cmdp->help, cmdp->help_base); |
︙ | ︙ | |||
3372 3373 3374 3375 3376 3377 3378 | } } } else { if (((cmdp->action == &exdep_cmd) || (0 == strcmp(cmdp->name, "BOOT"))) && sim_dflt_dev->help) { sim_dflt_dev->help (stdout, sim_dflt_dev, sim_dflt_dev->units, 0, cmdp->name); | | | 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 | } } } else { if (((cmdp->action == &exdep_cmd) || (0 == strcmp(cmdp->name, "BOOT"))) && sim_dflt_dev->help) { sim_dflt_dev->help (stdout, sim_dflt_dev, sim_dflt_dev->units, 0, cmdp->name); if (sim_log && (!sim_oline)) sim_dflt_dev->help (sim_log, sim_dflt_dev, sim_dflt_dev->units, 0, cmdp->name); } } strlcpy (gbuf2, cmdp->help, sizeof (gbuf2)); if (*cptr) { strlcat (gbuf2, " ", sizeof (gbuf2)); strlcat (gbuf2, cptr, sizeof (gbuf2)); |
︙ | ︙ | |||
3396 3397 3398 3399 3400 3401 3402 | cmdp->name, cmdpa->name, cmdpa->help); break; } if (cmdpa->name == NULL) /* not found? */ sim_printf ("No help available for the %s command\n", cmdp->name); } } | > > | > | | | > | 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 | cmdp->name, cmdpa->name, cmdpa->help); break; } if (cmdpa->name == NULL) /* not found? */ sim_printf ("No help available for the %s command\n", cmdp->name); } } else { sim_printf ("No such command or device %s\n", gbuf); } } else { if (dptr->flags & DEV_DIS) sim_printf ("Device %s is currently disabled\n", dptr->name); r = help_dev_help (stdout, dptr, uptr, flag, cptr); if (sim_log && (!sim_oline)) help_dev_help (sim_log, dptr, uptr, flag | SCP_HELP_FLAT, cptr); return r; } } else { fprint_help (stdout); if (sim_log && (!sim_oline)) fprint_help (sim_log); } return SCPE_OK; } /* Spawn command */ t_stat spawn_cmd (int32 flag, CONST char *cptr) { t_stat status; if ((cptr == NULL) || (strlen (cptr) == 0)) cptr = getenv("SHELL"); if ((cptr == NULL) || (strlen (cptr) == 0)) cptr = getenv("ComSpec"); #if defined (VMS) if ((cptr == NULL) || (strlen (cptr) == 0)) cptr = "SPAWN/INPUT=SYS$COMMAND:"; |
︙ | ︙ | |||
3445 3446 3447 3448 3449 3450 3451 | } /* Screenshot command */ t_stat screenshot_cmd (int32 flag, CONST char *cptr) { if ((cptr == NULL) || (strlen (cptr) == 0)) | | < < < < < | 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 | } /* Screenshot command */ t_stat screenshot_cmd (int32 flag, CONST char *cptr) { if ((cptr == NULL) || (strlen (cptr) == 0)) return sim_messagef (SCPE_ARG, "Missing screen shot filename\n"); return vid_screenshot (cptr); } /* Echo command */ t_stat echo_cmd (int32 flag, CONST char *cptr) { sim_printf ("%s\n", cptr); |
︙ | ︙ | |||
3492 3493 3494 3495 3496 3497 3498 | return SCPE_2MARG; /* No more arguments */ if (SCPE_OK != sim_decode_quoted_string (gbuf, dbuf, &dsize)) return sim_messagef (SCPE_ARG, "Invalid String\n"); dbuf[dsize] = 0; cptr = (char *)dbuf; } if (lp) { | | | | 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 | return SCPE_2MARG; /* No more arguments */ if (SCPE_OK != sim_decode_quoted_string (gbuf, dbuf, &dsize)) return sim_messagef (SCPE_ARG, "Invalid String\n"); dbuf[dsize] = 0; cptr = (char *)dbuf; } if (lp) { tmxr_linemsgf (lp, "%s%s", cptr, (sim_switches & SWMASK ('N')) ? "" : "\r\n"); tmxr_send_buffered_data (lp); } else sim_printf ("%s%s", cptr, (sim_switches & SWMASK ('N')) ? "" : "\n"); return SCPE_OK; } /* Do command Syntax: DO {-E} {-V} <filename> {<arguments>...} |
︙ | ︙ | |||
3533 3534 3535 3536 3537 3538 3539 | t_stat do_cmd (int32 flag, CONST char *fcptr) { return do_cmd_label (flag, fcptr, NULL); } static char *do_position(void) { | | | | | 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 | t_stat do_cmd (int32 flag, CONST char *fcptr) { return do_cmd_label (flag, fcptr, NULL); } static char *do_position(void) { static char cbuf[4*CBUFSIZE]; snprintf (cbuf, sizeof (cbuf), "%s%s%s-%d", sim_do_filename[sim_do_depth], sim_do_label[sim_do_depth] ? "::" : "", sim_do_label[sim_do_depth] ? sim_do_label[sim_do_depth] : "", sim_goto_line[sim_do_depth]); return cbuf; } t_stat do_cmd_label (int32 flag, CONST char *fcptr, CONST char *label) { char cbuf[4*CBUFSIZE], gbuf[CBUFSIZE], abuf[4*CBUFSIZE], quote, *c, *do_arg[11]; CONST char *cptr; FILE *fpin = NULL; CTAB *cmdp = NULL; int32 echo, nargs, errabort, i; int32 saved_sim_do_echo = sim_do_echo, saved_sim_show_message = sim_show_message, saved_sim_on_inherit = sim_on_inherit, saved_sim_quiet = sim_quiet; t_bool staying; |
︙ | ︙ | |||
3586 3587 3588 3589 3590 3591 3592 | if (*c) /* term at quote/spc */ *c++ = 0; } } /* end for */ if (do_arg [0] == NULL) /* need at least 1 */ return SCPE_2FARG; | > | | | 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 | if (*c) /* term at quote/spc */ *c++ = 0; } } /* end for */ if (do_arg [0] == NULL) /* need at least 1 */ return SCPE_2FARG; if ((strcasecmp (do_arg[0], "<stdin>") != 0) && ((fpin = sim_fopen (do_arg[0], "r")) == NULL)) { /* file failed to open? */ strlcpy (cbuf, do_arg[0], sizeof (cbuf)); /* try again with .sim extension */ strlcat (cbuf, ".sim", sizeof (cbuf)); if ((fpin = sim_fopen (cbuf, "r")) == NULL) { /* failed a second time? */ if (flag == 0) /* cmd line file? */ fprintf (stderr, "Can't open file %s\n", do_arg[0]); return SCPE_OPENERR; /* return failure */ } } else strlcpy (cbuf, do_arg[0], sizeof (cbuf)); /* store name of successfully opened file */ |
︙ | ︙ | |||
3626 3627 3628 3629 3630 3631 3632 | } sim_debug (SIM_DBG_DO, &sim_scp_dev, "do_cmd_label(%d, flag=%d, '%s', '%s')\n", sim_do_depth, flag, fcptr, label ? label : ""); if (NULL == (c = sim_filepath_parts (cbuf, "f"))) { stat = SCPE_MEM; goto Cleanup_Return; } | | > > > > > | 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 | } sim_debug (SIM_DBG_DO, &sim_scp_dev, "do_cmd_label(%d, flag=%d, '%s', '%s')\n", sim_do_depth, flag, fcptr, label ? label : ""); if (NULL == (c = sim_filepath_parts (cbuf, "f"))) { stat = SCPE_MEM; goto Cleanup_Return; } strlcpy( sim_do_filename[sim_do_depth], strcasecmp (cbuf, "<stdin>") ? c : cbuf, sizeof (sim_do_filename[sim_do_depth])); /* stash away full path of do file name for possible use by 'call' command */ free (c); sim_do_label[sim_do_depth] = label; /* stash away do label for possible use in messages */ sim_goto_line[sim_do_depth] = 0; if (label) { sim_gotofile = fpin; sim_do_echo = echo; stat = goto_cmd (0, label); if (stat != SCPE_OK) { strcpy(cbuf, "RETURN SCPE_ARG"); cptr = get_glyph (cbuf, gbuf, 0); /* get command glyph */ cmdp = find_cmd (gbuf); /* return the errorStage things to the stat will be returned */ goto Cleanup_Return; } } if (errabort) /* -e flag? */ set_on (1, NULL); /* equivalent to ON ERROR RETURN */ if (strcasecmp (do_arg[0], "<stdin>") == 0) { stat = process_stdin_commands (SCPE_OK, do_arg, TRUE); goto Cleanup_Return; } do { if (stop_cpu) { /* SIGINT? */ if (sim_on_actions[sim_do_depth][ON_SIGINT_ACTION]) { stop_cpu = FALSE; sim_brk_setact (sim_on_actions[sim_do_depth][ON_SIGINT_ACTION]);/* Use specified action */ } |
︙ | ︙ | |||
3748 3749 3750 3751 3752 3753 3754 | if (stat >= SCPE_BASE) /* report error if not suppressed */ sim_printf ("%s\n", sim_error_text (stat)); } if (stat == SCPE_EXPECT) /* EXPECT status is non actionable */ stat = SCPE_OK; /* so adjust it to SCPE_OK */ if (staying && (sim_on_check[sim_do_depth]) && | | < > | | 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 | if (stat >= SCPE_BASE) /* report error if not suppressed */ sim_printf ("%s\n", sim_error_text (stat)); } if (stat == SCPE_EXPECT) /* EXPECT status is non actionable */ stat = SCPE_OK; /* so adjust it to SCPE_OK */ if (staying && (sim_on_check[sim_do_depth]) && (stat != SCPE_OK)) { if ((stat <= SCPE_MAX_ERR) && sim_on_actions[sim_do_depth][stat]) sim_brk_setact (sim_on_actions[sim_do_depth][stat]); else sim_brk_setact (sim_on_actions[sim_do_depth][0]); } if (sim_vm_post != NULL) (*sim_vm_post) (TRUE); } while (staying); Cleanup_Return: if (fpin) fclose (fpin); /* close file */ sim_gotofile = NULL; if (flag >= 0) { sim_do_echo = saved_sim_do_echo; /* restore echo state we entered with */ sim_show_message = saved_sim_show_message; /* restore message display state we entered with */ sim_on_inherit = saved_sim_on_inherit; /* restore ON inheritance state we entered with */ sim_quiet = saved_sim_quiet; /* restore quiet mode we entered with */ } |
︙ | ︙ | |||
4169 4170 4171 4172 4173 4174 4175 | void sim_sub_args (char *instr, size_t instr_size, char *do_arg[]) { char gbuf[CBUFSIZE]; char *ip = instr, *op, *oend, *istart, *tmpbuf; const char *ap; char rbuf[CBUFSIZE]; int i; | < | | 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 | void sim_sub_args (char *instr, size_t instr_size, char *do_arg[]) { char gbuf[CBUFSIZE]; char *ip = instr, *op, *oend, *istart, *tmpbuf; const char *ap; char rbuf[CBUFSIZE]; int i; size_t outstr_off = 0; sim_exp_argv = do_arg; sim_rtcn_get_time (&cmd_time, 0); tmpbuf = (char *)malloc(instr_size); op = tmpbuf; oend = tmpbuf + instr_size - 2; if (instr_size > sim_sub_instr_size) { sim_sub_instr = (char *)realloc (sim_sub_instr, instr_size*sizeof(*sim_sub_instr)); sim_sub_instr_off = (size_t *)realloc (sim_sub_instr_off, instr_size*sizeof(*sim_sub_instr_off)); sim_sub_instr_size = instr_size; |
︙ | ︙ | |||
4225 4226 4227 4228 4229 4230 4231 | if (*ip == '%') { ap = NULL; ++ip; if (*ip == '~') { expand_it = TRUE; ++ip; | | | 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 | if (*ip == '%') { ap = NULL; ++ip; if (*ip == '~') { expand_it = TRUE; ++ip; for (i=0; (i < (sizeof (parts) - 1)) && (strchr ("fpnxtz", *ip)); i++, ip++) { parts[i] = *ip; parts[i + 1] = '\0'; } } if ((*ip >= '0') && (*ip <= ('9'))) { /* %n = sub */ ap = do_arg[*ip - '0']; for (i=0; i<*ip - '0'; ++i) /* make sure we're not past the list end */ |
︙ | ︙ | |||
4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 | { long int v1, v2; char *ep1, *ep2; if (sim_switches & SWMASK ('F')) { /* File Compare? */ FILE *f1, *f2; int c1, c2; char *filename1, *filename2; filename1 = (char *)malloc (strlen (s1)); strcpy (filename1, s1 + 1); filename1[strlen (filename1) - 1] = '\0'; filename2 = (char *)malloc (strlen (s2)); strcpy (filename2, s2 + 1); filename2[strlen (filename2) - 1] = '\0'; | > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > > | 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 | { long int v1, v2; char *ep1, *ep2; if (sim_switches & SWMASK ('F')) { /* File Compare? */ FILE *f1, *f2; int c1, c2; size_t diff_offset = 0; char *filename1, *filename2; filename1 = (char *)malloc (strlen (s1)); strcpy (filename1, s1 + 1); filename1[strlen (filename1) - 1] = '\0'; filename2 = (char *)malloc (strlen (s2)); strcpy (filename2, s2 + 1); filename2[strlen (filename2) - 1] = '\0'; setenv ("_FILE_COMPARE_DIFF_OFFSET", "", 1); /* Remove previous environment variable */ f1 = sim_fopen (filename1, "rb"); f2 = sim_fopen (filename2, "rb"); free (filename1); free (filename2); if ((f1 == NULL) && (f2 == NULL)) /* Both can't open? */ return 0; /* Call that equal */ if (f1 == NULL) { fclose (f2); return -1; } if (f2 == NULL) { fclose (f1); return 1; } if (sim_switches & SWMASK ('W')) { /* whitespace runs equivalent? */ c1 = c2 = 0; while ((c1 == c2) && (c1 != EOF)) { if (c1 == ' ') { /* last character was space? */ while (c1 == ' ') { /* read until not a space */ c1 = fgetc (f1); ++diff_offset; if (sim_isspace (c1)) c1 = ' '; /* all whitespace is a space */ } } else { /* get new character */ c1 = fgetc (f1); ++diff_offset; if (sim_isspace (c1)) c1 = ' '; /* all whitespace is a space */ } if (c2 == ' ') { /* last character was space? */ while (c2 == ' ') { /* read until not a space */ c2 = fgetc (f2); if (sim_isspace (c2)) c2 = ' '; /* all whitespace is a space */ } } else { /* get new character */ c2 = fgetc (f2); if (sim_isspace (c2)) c2 = ' '; /* all whitespace is a space */ } }; } else { /* Binary File Compare */ while (((c1 = fgetc (f1)) == (c2 = fgetc (f2))) && (c1 != EOF)) ++diff_offset; } fclose (f1); fclose (f2); if (c1 != c2) { char offset_buf[32]; snprintf (offset_buf, sizeof (offset_buf), "%u", (uint32)diff_offset); setenv ("_FILE_COMPARE_DIFF_OFFSET", offset_buf, 1); } return c1 - c2; } v1 = strtol(s1+1, &ep1, 0); v2 = strtol(s2+1, &ep2, 0); if ((ep1 != s1 + strlen (s1) - 1) || (ep2 != s2 + strlen (s2) - 1)) return (strlen (s1) == strlen (s2)) ? strncmp (s1 + 1, s2 + 1, strlen (s1) - 2) |
︙ | ︙ | |||
4436 4437 4438 4439 4440 4441 4442 | } t_stat assert_cmd (int32 flag, CONST char *cptr) { char gbuf[CBUFSIZE], gbuf2[CBUFSIZE]; CONST char *tptr, *gptr; REG *rptr; | | | | 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 | } t_stat assert_cmd (int32 flag, CONST char *cptr) { char gbuf[CBUFSIZE], gbuf2[CBUFSIZE]; CONST char *tptr, *gptr; REG *rptr; uint32 idx = 0; t_stat r; t_bool Not = FALSE; t_bool Exist = FALSE; t_bool result; t_addr addr = 0; t_stat reason; cptr = (CONST char *)get_sim_opt (CMD_OPT_SW|CMD_OPT_DFT, (CONST char *)cptr, &r); /* get sw, default */ sim_stabr.boolop = sim_staba.boolop = -1; /* no relational op dflt */ if (*cptr == 0) /* must be more */ return SCPE_2FARG; |
︙ | ︙ | |||
4527 4528 4529 4530 4531 4532 4533 | } result = sim_cmp_string (gbuf, gbuf2); result = ((result == optr->aval) || (result == optr->bval)); if (optr->invert) result = !result; } else { | | | | 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 | } result = sim_cmp_string (gbuf, gbuf2); result = ((result == optr->aval) || (result == optr->bval)); if (optr->invert) result = !result; } else { FILE *f = sim_fopen (gbuf, "r"); if (!f) { if (((gbuf[0] == '"') || (gbuf[0] == '\'')) && /* quoted? */ (gbuf[0] == gbuf[strlen (gbuf) - 1])) { char *without_quotes = sim_filepath_parts (gbuf, "f"); if (without_quotes) { f = sim_fopen (without_quotes, "r"); free (without_quotes); } } } if (f) fclose (f); result = (f != NULL); |
︙ | ︙ | |||
4568 4569 4570 4571 4572 4573 4574 | if (rptr->depth <= 1) /* array register? */ return SCPE_ARG; idx = (uint32) strtotv (++gptr, &tptr, 10); /* convert index */ if ((gptr == tptr) || (*tptr++ != ']')) return SCPE_ARG; gptr = tptr; /* update */ } | > | | 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 | if (rptr->depth <= 1) /* array register? */ return SCPE_ARG; idx = (uint32) strtotv (++gptr, &tptr, 10); /* convert index */ if ((gptr == tptr) || (*tptr++ != ']')) return SCPE_ARG; gptr = tptr; /* update */ } else idx = 0; /* not array */ if (idx >= rptr->depth) /* validate subscript */ return SCPE_SUB; } else { /* not reg, check for memory */ if (sim_dfdev && sim_vm_parse_addr) /* get addr */ addr = sim_vm_parse_addr (sim_dfdev, gbuf, &gptr); else |
︙ | ︙ | |||
4737 4738 4739 4740 4741 4742 4743 | dev_name = tmxr_send_line_name (snd); if (!flag) return sim_send_clear (snd); delay = get_default_env_parameter (dev_name, "SIM_SEND_DELAY", SEND_DEFAULT_DELAY); after = get_default_env_parameter (dev_name, "SIM_SEND_AFTER", delay); while (*cptr) { if ((!strncmp(gbuf, "DELAY=", 6)) && (gbuf[6])) { | | | | | | 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 | dev_name = tmxr_send_line_name (snd); if (!flag) return sim_send_clear (snd); delay = get_default_env_parameter (dev_name, "SIM_SEND_DELAY", SEND_DEFAULT_DELAY); after = get_default_env_parameter (dev_name, "SIM_SEND_AFTER", delay); while (*cptr) { if ((!strncmp(gbuf, "DELAY=", 6)) && (gbuf[6])) { delay = (uint32)get_uint (&gbuf[6], 10, 2000000000, &r); if (r != SCPE_OK) return sim_messagef (SCPE_ARG, "Invalid Delay Value: %s\n", &gbuf[6]); cptr = tptr; tptr = get_glyph (cptr, gbuf, ','); delay_set = TRUE; if (!after_set) after = delay; continue; } if ((!strncmp(gbuf, "AFTER=", 6)) && (gbuf[6])) { after = (uint32)get_uint (&gbuf[6], 10, 2000000000, &r); if (r != SCPE_OK) return sim_messagef (SCPE_ARG, "Invalid After Value: %s\n", &gbuf[6]); cptr = tptr; tptr = get_glyph (cptr, gbuf, ','); after_set = TRUE; continue; } if ((*cptr == '"') || (*cptr == '\'')) break; |
︙ | ︙ | |||
4906 4907 4908 4909 4910 4911 4912 | { char cbuf[CBUFSIZE], gbuf[CBUFSIZE], gbuf1[CBUFSIZE]; const char *cptr; long fpos; int32 saved_do_echo = sim_do_echo; int32 saved_goto_line = sim_goto_line[sim_do_depth]; | > > | > > > > > > > > | 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 | { char cbuf[CBUFSIZE], gbuf[CBUFSIZE], gbuf1[CBUFSIZE]; const char *cptr; long fpos; int32 saved_do_echo = sim_do_echo; int32 saved_goto_line = sim_goto_line[sim_do_depth]; if ((NULL == sim_gotofile) || (0 == strcasecmp (sim_do_filename[sim_do_depth], "<stdin>"))) return SCPE_UNK; /* only valid inside of do_cmd */ get_glyph (fcptr, gbuf1, 0); if ('\0' == gbuf1[0]) /* unspecified goto target */ return sim_messagef (SCPE_ARG, "Missing goto target\n"); fpos = ftell(sim_gotofile); /* Save start position */ if (fpos < 0) return sim_messagef (SCPE_IERR, "goto ftell error: %s\n", strerror (errno)); if (strcasecmp(":EOF", gbuf1) == 0) { if (fseek (sim_gotofile, 0, SEEK_END)) return sim_messagef (SCPE_IERR, "goto seek error: %s\n", strerror (errno)); sim_brk_clract (); /* goto defangs current actions */ sim_do_echo = saved_do_echo; /* restore echo mode */ return SCPE_OK; } rewind(sim_gotofile); /* start search for label */ sim_goto_line[sim_do_depth] = 0; /* reset line number */ sim_do_echo = 0; /* Don't echo while searching for label */ while (1) { cptr = read_line (cbuf, sizeof(cbuf), sim_gotofile);/* get cmd line */ if (cptr == NULL) break; /* exit on eof */ sim_goto_line[sim_do_depth] += 1; /* record line number */ |
︙ | ︙ | |||
4948 4949 4950 4951 4952 4953 4954 | /* The return command is invalid unless encountered in a do_cmd context, */ /* and in that context, it is handled as a special case inside of do_cmd() */ /* and not dispatched here, so if we get here a return has been issued from */ /* interactive input */ t_stat return_cmd (int32 flag, CONST char *fcptr) { | | | 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 | /* The return command is invalid unless encountered in a do_cmd context, */ /* and in that context, it is handled as a special case inside of do_cmd() */ /* and not dispatched here, so if we get here a return has been issued from */ /* interactive input */ t_stat return_cmd (int32 flag, CONST char *fcptr) { return sim_messagef (SCPE_UNK, "Invalid Command\n"); /* only valid inside of do_cmd */ } /* Shift command */ /* The shift command is invalid unless encountered in a do_cmd context, */ /* and in that context, it is handled as a special case inside of do_cmd() */ /* and not dispatched here, so if we get here a shift has been issued from */ /* interactive input (it is not valid interactively since it would have to */ |
︙ | ︙ | |||
4971 4972 4973 4974 4975 4976 4977 | /* The call command is invalid unless encountered in a do_cmd context, */ /* and in that context, it is handled as a special case inside of do_cmd() */ /* and not dispatched here, so if we get here a call has been issued from */ /* interactive input */ t_stat call_cmd (int32 flag, CONST char *fcptr) { | | > | > > | 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 | /* The call command is invalid unless encountered in a do_cmd context, */ /* and in that context, it is handled as a special case inside of do_cmd() */ /* and not dispatched here, so if we get here a call has been issued from */ /* interactive input */ t_stat call_cmd (int32 flag, CONST char *fcptr) { char cbuf[2*CBUFSIZE], gbuf[CBUFSIZE]; const char *cptr; if (NULL == sim_gotofile) return SCPE_UNK; /* only valid inside of do_cmd */ cptr = get_glyph (fcptr, gbuf, 0); if ('\0' == gbuf[0]) return SCPE_ARG; /* unspecified goto target */ snprintf (cbuf, sizeof (cbuf), "%s%s%s %s", (NULL != strchr (sim_do_filename[sim_do_depth], ' ')) ? "\"" : "", sim_do_filename[sim_do_depth], (NULL != strchr (sim_do_filename[sim_do_depth], ' ')) ? "\"" : "", cptr); sim_switches |= SWMASK ('O'); /* inherit ON state and actions */ return do_cmd_label (flag, cbuf, gbuf); } /* On command */ t_stat on_cmd (int32 flag, CONST char *cptr) |
︙ | ︙ | |||
5308 5309 5310 5311 5312 5313 5314 | if (mptr->mask & MTAB_XTD) { /* extended? */ if (((lvl & mptr->mask) & ~MTAB_XTD) == 0) return SCPE_ARG; if ((lvl == MTAB_VUN) && (uptr->flags & UNIT_DIS)) return SCPE_UDIS; /* unit disabled? */ if (mptr->valid) { /* validation rtn? */ if (cvptr && MODMASK(mptr,MTAB_QUOTE)) { | | | > > < < < < < | 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 | if (mptr->mask & MTAB_XTD) { /* extended? */ if (((lvl & mptr->mask) & ~MTAB_XTD) == 0) return SCPE_ARG; if ((lvl == MTAB_VUN) && (uptr->flags & UNIT_DIS)) return SCPE_UDIS; /* unit disabled? */ if (mptr->valid) { /* validation rtn? */ if (cvptr && MODMASK(mptr,MTAB_QUOTE)) { svptr = get_glyph_quoted (svptr, gbuf, ','); if ((cvptr = strchr (gbuf, '='))) { *cvptr++ = 0; cptr = svptr; } } else { if (cvptr && MODMASK(mptr,MTAB_NC)) { get_glyph_nc (svptr, gbuf, ','); if ((cvptr = strchr (gbuf, '='))) *cvptr++ = 0; } } r = mptr->valid (uptr, mptr->match, cvptr, mptr->desc); if (r != SCPE_OK) return r; } else if (!mptr->desc) /* value desc? */ break; else if (cvptr) /* = value? */ return SCPE_ARG; else *((int32 *) mptr->desc) = mptr->match; } /* end if xtd */ else { /* old style */ if (cvptr) /* = value? */ return SCPE_ARG; |
︙ | ︙ | |||
5418 5419 5420 5421 5422 5423 5424 | } else { if (dptr->flags & DEV_DIS) /* already dsb? ok */ return SCPE_OK; for (i = 0; i < dptr->numunits; i++) { /* check units */ up = (dptr->units) + i; /* att or active? */ if ((up->flags & UNIT_ATT) || sim_is_active (up)) | | | 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 | } else { if (dptr->flags & DEV_DIS) /* already dsb? ok */ return SCPE_OK; for (i = 0; i < dptr->numunits; i++) { /* check units */ up = (dptr->units) + i; /* att or active? */ if ((up->flags & UNIT_ATT) || sim_is_active (up)) return sim_messagef (SCPE_NOFNC, "%s has attached or busy units\n", sim_dname (dptr)); /* can't do it */ } dptr->flags = dptr->flags | DEV_DIS; /* disable */ } if (dptr->reset) /* reset device */ return dptr->reset (dptr); else return SCPE_OK; } |
︙ | ︙ | |||
5440 5441 5442 5443 5444 5445 5446 | if (!(uptr->flags & UNIT_DISABLE)) /* allowed? */ return SCPE_NOFNC; if (flag) /* enb? enable */ uptr->flags = uptr->flags & ~UNIT_DIS; else { if ((uptr->flags & UNIT_ATT) || /* dsb */ sim_is_active (uptr)) /* more tests */ | | | 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 | if (!(uptr->flags & UNIT_DISABLE)) /* allowed? */ return SCPE_NOFNC; if (flag) /* enb? enable */ uptr->flags = uptr->flags & ~UNIT_DIS; else { if ((uptr->flags & UNIT_ATT) || /* dsb */ sim_is_active (uptr)) /* more tests */ return sim_messagef (SCPE_NOFNC, "%s is attached or busy\n", sim_uname (uptr)); uptr->flags = uptr->flags | UNIT_DIS; /* disable */ } return SCPE_OK; } /* Set device/unit debug enabled/disabled routine */ |
︙ | ︙ | |||
5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 | } } /* end for */ if (dep->mask == 0) /* no match? */ r = sim_messagef (SCPE_ARG, "Invalid DEBUG option '%s' for %s device\n", gbuf, dptr->name); } /* end while */ return r; } /* Show command */ t_stat show_cmd (int32 flag, CONST char *cptr) { t_stat r; | > > > > > > > > > > > > > > > > > > > | 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 | } } /* end for */ if (dep->mask == 0) /* no match? */ r = sim_messagef (SCPE_ARG, "Invalid DEBUG option '%s' for %s device\n", gbuf, dptr->name); } /* end while */ return r; } /* Set sequential unit position to EOF */ t_stat set_unit_append (DEVICE *dptr, UNIT *uptr, int32 flags, CONST char *cptr) { if (!(uptr->flags & UNIT_SEQ)) return sim_messagef (SCPE_NOFNC, "%s is not a sequential device.\n", sim_uname (uptr)); if (uptr->flags & UNIT_BUF) return sim_messagef (SCPE_NOFNC, "Can't append to a buffered device %s.\n", sim_uname (uptr)); if (!(uptr->flags & UNIT_ATT)) return SCPE_UNATT; if (0 == sim_fseek (uptr->fileref, 0, SEEK_END)) { uptr->pos = (t_addr)sim_ftell (uptr->fileref); /* Position at end of file */ return SCPE_OK; } return sim_messagef (SCPE_IERR, "%s Can't seek to end of file: %s - %s\n", sim_uname (uptr), uptr->filename, strerror (errno)); } /* Show command */ t_stat show_cmd (int32 flag, CONST char *cptr) { t_stat r; |
︙ | ︙ | |||
5544 5545 5546 5547 5548 5549 5550 | uptr = dptr->units; /* first unit */ shtb = show_dev_tab; /* global table */ lvl = MTAB_VDV; /* device match */ GET_SWITCHES (cptr); /* get more switches */ } else if ((dptr = find_unit (gbuf, &uptr))) { /* unit match? */ if (uptr == NULL) /* invalid unit */ | | | | | < < < < | | > | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | > | | > | > | | 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 | uptr = dptr->units; /* first unit */ shtb = show_dev_tab; /* global table */ lvl = MTAB_VDV; /* device match */ GET_SWITCHES (cptr); /* get more switches */ } else if ((dptr = find_unit (gbuf, &uptr))) { /* unit match? */ if (uptr == NULL) /* invalid unit */ return sim_messagef (SCPE_NXUN, "Non-existent unit: %s\n", gbuf); if (uptr->flags & UNIT_DIS) /* disabled? */ return sim_messagef (SCPE_UDIS, "Unit disabled: %s\n", gbuf); shtb = show_unit_tab; /* global table */ lvl = MTAB_VUN; /* unit match */ GET_SWITCHES (cptr); /* get more switches */ } else if ((shptr = find_shtab (show_glob_tab, gbuf))) { /* global? */ GET_SWITCHES (cptr); /* get more switches */ return shptr->action (ofile, NULL, NULL, shptr->arg, cptr); } else { if (sim_dflt_dev->modifiers) { if ((cvptr = strchr (gbuf, '='))) /* = value? */ *cvptr++ = 0; for (mptr = sim_dflt_dev->modifiers; mptr && (mptr->mask != 0); mptr++) { if ((((mptr->mask & MTAB_VDV) == MTAB_VDV) && (mptr->pstring && (MATCH_CMD (gbuf, mptr->pstring) == 0))) || (!(mptr->mask & MTAB_VDV) && (mptr->mstring && (MATCH_CMD (gbuf, mptr->mstring) == 0)))) { dptr = sim_dflt_dev; lvl = MTAB_VDV; /* device match */ cptr = svptr; while (sim_isspace(*cptr)) ++cptr; break; } } } if (!dptr) { if ((shptr = find_shtab (show_dev_tab, gbuf))) /* global match? */ return shptr->action (ofile, sim_dflt_dev, uptr, shptr->arg, cptr); else return sim_messagef (SCPE_NXDEV, "Non-existent device: %s\n", gbuf);/* no match */ } } if (*cptr == 0) { /* now eol? */ return (lvl == MTAB_VDV)? show_device (ofile, dptr, 0): show_unit (ofile, dptr, uptr, -1); } GET_SWITCHES (cptr); /* get more switches */ while (*cptr != 0) { /* do all mods */ cptr = get_glyph (cptr, gbuf, ','); /* get modifier */ if ((cvptr = strchr (gbuf, '='))) /* = value? */ *cvptr++ = 0; for (mptr = dptr->modifiers; mptr && (mptr->mask != 0); mptr++) { if (((mptr->mask & MTAB_XTD)? /* right level? */ ((mptr->mask & lvl) == lvl): (MTAB_VUN & lvl)) && ((mptr->disp && mptr->pstring && /* named disp? */ (MATCH_CMD (gbuf, mptr->pstring) == 0)) )) { if (cvptr && !MODMASK(mptr,MTAB_SHP)) return sim_messagef (SCPE_ARG, "Invalid Argument: %s=%s\n", gbuf, cvptr); show_one_mod (ofile, dptr, uptr, mptr, cvptr, 1); break; } /* end if */ } /* end for */ if (!mptr || (mptr->mask == 0)) { /* no match? */ if (shtb && (shptr = find_shtab (shtb, gbuf))) {/* global match? */ t_stat r; r = shptr->action (ofile, dptr, uptr, shptr->arg, cptr); if (r != SCPE_OK) return r; } else { if (!dptr->modifiers) /* no modifiers? */ return sim_messagef (SCPE_NOPARAM, "%s device has no parameters\n", dptr->name); else return sim_messagef (SCPE_NXPAR, "Non-existent parameter: %s\n", gbuf); } } /* end if */ } /* end while */ return SCPE_OK; } SHTAB *find_shtab (SHTAB *tab, const char *gbuf) { if (!tab) return NULL; for (; tab->name != NULL; tab++) { if (MATCH_CMD (gbuf, tab->name) == 0) return tab; } return NULL; } /* Show device and unit */ static size_t dev_name_len; const char *_sim_name_prefix (const char *name, const char *prefix) { static char nambuf[CBUFSIZE]; size_t prefix_len = prefix ? strlen (prefix) : 0; size_t name_len = name ? strlen (name) : 0; size_t string_len = prefix_len + name_len; snprintf (nambuf, sizeof (nambuf), "%s%*s", prefix ? prefix : "", ((string_len <= 6) && (dev_name_len <= 6)) ? -((int)(8 - prefix_len)) : -((int)(dev_name_len + 2)), name ? name : ""); return nambuf; } const char *_sim_dname_prefix (DEVICE *dptr, const char *prefix) { return _sim_name_prefix (sim_dname (dptr), prefix); } const char *_sim_uname_prefix (UNIT *uptr, const char *prefix) { return _sim_name_prefix (sim_uname (uptr), prefix); } const char *_sim_dname (DEVICE *dptr) { return _sim_dname_prefix (dptr, ""); } const char *_sim_uname (UNIT *uptr) { return _sim_uname_prefix (uptr, ""); } const char *_sim_dname_space () { return _sim_dname_prefix (NULL, ""); } t_stat show_device (FILE *st, DEVICE *dptr, int32 flag) { uint32 j, udbl, ucnt; UNIT *uptr; int32 toks = -1; fprintf (st, "%s", _sim_dname (dptr)); /* print dev name */ if ((flag == 2) && dptr->description) { fprintf (st, "%s\n", dptr->description(dptr)); fprintf (st, "%s", _sim_dname_space ()); } else { if ((sim_switches & SWMASK ('D')) && dptr->description) { fprintf (st, "%s\n", dptr->description(dptr)); fprintf (st, "%s", _sim_dname_space ()); } } if (qdisable (dptr)) { /* disabled? */ fprintf (st, "%s\n", "disabled"); return SCPE_OK; } for (j = ucnt = udbl = 0; j < dptr->numunits; j++) { /* count units */ uptr = dptr->units + j; if (!(uptr->flags & UNIT_DIS)) /* count enabled units */ ucnt++; else if (uptr->flags & UNIT_DISABLE) |
︙ | ︙ | |||
5693 5694 5695 5696 5697 5698 5699 | show_unit (st, dptr, uptr, ucnt + udbl); } return SCPE_OK; } void fprint_sep (FILE *st, int32 *tokens) { | | > > < | | > | | > > | 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 | show_unit (st, dptr, uptr, ucnt + udbl); } return SCPE_OK; } void fprint_sep (FILE *st, int32 *tokens) { fprintf (st, "%s", (*tokens > 0) ? ", " : ((*tokens < 0) ? "" : _sim_dname_space ())); *tokens += 1; if (*tokens == 0) *tokens = 1; } t_stat show_unit (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag) { int32 toks = -1; if (flag > 1) fprintf (st, "%s", _sim_uname_prefix (uptr, " ")); else if (flag < 0) fprintf (st, "%s", _sim_uname (uptr)); else toks = 0; if (uptr->flags & UNIT_FIX) { fprint_sep (st, &toks); fprint_capac (st, dptr, uptr); } if (uptr->flags & UNIT_ATT) { fprint_sep (st, &toks); fprintf (st, "attached to %s", uptr->filename); |
︙ | ︙ | |||
5730 5731 5732 5733 5734 5735 5736 | if (toks || (flag < 0) || (flag > 1)) fprintf (st, "\n"); return SCPE_OK; } const char *sprint_capac (DEVICE *dptr, UNIT *uptr) { | | > | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 | if (toks || (flag < 0) || (flag > 1)) fprintf (st, "\n"); return SCPE_OK; } const char *sprint_capac (DEVICE *dptr, UNIT *uptr) { static char capac_buf[((CHAR_BIT * sizeof (t_value) * 4 + 3)/3) + 12]; t_addr kval = (uptr->flags & UNIT_BINK)? 1024: 1000; t_addr mval; double remfrac; t_addr psize = uptr->capac; const char *scale, *width; if (sim_switches & SWMASK ('B')) kval = 1024; mval = kval * kval; if (dptr->flags & DEV_SECTORS) psize = psize * 512; if ((dptr->dwidth / dptr->aincr) > 8) width = "W"; else width = "B"; if ((psize < (kval * 10)) && (0 != (psize % kval))) { remfrac = 0.0; scale = ""; } else if ((psize < (mval * 10)) && (0 != (psize % mval))){ scale = "K"; remfrac = ((double)(psize % kval))/kval; psize = psize / kval; } else { scale = "M"; remfrac = ((double)(psize % mval))/mval; psize = psize / mval; } sprint_val (capac_buf, (t_value) psize, 10, T_ADDR_W, PV_LEFT); if ((remfrac != 0.0) && (sim_switches & SWMASK ('R'))) { char *plast_char = &capac_buf[strlen (capac_buf) - 1]; char save_char = *plast_char; sprintf (plast_char, "%0.3f", remfrac); *plast_char = save_char; } sprintf (&capac_buf[strlen (capac_buf)], "%s%s", scale, width); return capac_buf; } void fprint_capac (FILE *st, DEVICE *dptr, UNIT *uptr) { fprintf (st, "%s", sprint_capac (dptr, uptr)); } static const char *_get_tool_version (const char *tool) { char findcmd[PATH_MAX+1]; char toolpath[PATH_MAX+1]; char versioncmd[PATH_MAX+1]; static char toolversion[PATH_MAX+1]; FILE *f; #if defined(_WIN32) #define FIND_CMD "where" #define popen _popen #define pclose _pclose #else #define FIND_CMD "which" #endif toolversion[0] = '\0'; snprintf (findcmd, sizeof (findcmd), "%s %s", FIND_CMD, tool); if ((f = popen (findcmd, "r"))) { memset (toolpath, 0, sizeof(toolpath)); do { if (NULL == fgets (toolpath, sizeof(toolpath)-1, f)) break; sim_trim_endspc (toolpath); } while (toolpath[0] == '\0'); pclose (f); if (toolpath[0]) { snprintf (versioncmd, sizeof (versioncmd), "%s --version", tool); if ((f = popen (versioncmd, "r"))) { memset (toolversion, 0, sizeof(toolversion)); do { if (NULL == fgets (toolversion, sizeof(toolversion)-1, f)) break; sim_trim_endspc (toolversion); } while (toolversion[0] == '\0'); pclose (f); } } } return toolversion; } /* Show <global name> processors */ t_stat show_version (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr) { int32 vmaj = SIM_MAJOR, vmin = SIM_MINOR, vpat = SIM_PATCH, vdelt = SIM_DELTA; char vmaj_s[12], vmin_s[12], vpat_s[12], vdelt_s[12]; const char *cpp = ""; const char *build = ""; const char *arch = ""; if (cptr && (*cptr != 0)) return SCPE_2MARG; sprintf (vmaj_s, "%d", vmaj); setenv ("SIM_MAJOR", vmaj_s, 1); sprintf (vmin_s, "%d", vmin); setenv ("SIM_MINOR", vmin_s, 1); sprintf (vpat_s, "%d", vpat); setenv ("SIM_PATCH", vpat_s, 1); fprintf (st, "%s simulator V%d.%d-%d", sim_name, vmaj, vmin, vpat); if (sim_vm_release != NULL) { /* if a release string is defined */ setenv ("SIM_VM_RELEASE", sim_vm_release, 1); fprintf (st, " Release %s", sim_vm_release); /* then display it */ } if (vdelt) { sprintf (vdelt_s, "%d", vdelt); setenv ("SIM_DELTA", vdelt_s, 1); fprintf (st, " delta %d", vdelt); } #if defined (SIM_VERSION_MODE) fprintf (st, " %s", SIM_VERSION_MODE); |
︙ | ︙ | |||
5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 | #define S_xstr(a) S_str(a) #define S_str(a) #a fprintf (st, "\n Simulator Compiled as %s%s%s on %s at %s %s", cpp, arch, build, __DATE__, __TIME__, S_xstr(SIM_BUILD_OS)); #undef S_str #undef S_xstr #endif #endif fprintf (st, "\n Memory Access: %s Endian", sim_end ? "Little" : "Big"); fprintf (st, "\n Memory Pointer Size: %d bits", (int)sizeof(dptr)*8); fprintf (st, "\n %s", sim_toffset_64 ? "Large File (>2GB) support" : "No Large File support"); fprintf (st, "\n SDL Video support: %s", vid_version()); | > > > > > > > > > | < < > > | 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 | #define S_xstr(a) S_str(a) #define S_str(a) #a fprintf (st, "\n Simulator Compiled as %s%s%s on %s at %s %s", cpp, arch, build, __DATE__, __TIME__, S_xstr(SIM_BUILD_OS)); #undef S_str #undef S_xstr #endif #endif #if defined (SIM_BUILD_TOOL) #define S_xstr(a) S_str(a) #define S_str(a) #a fprintf (st, "\n Build Tool: %s", S_xstr(SIM_BUILD_TOOL)); #undef S_str #undef S_xstr #else fprintf (st, "\n Build Tool: undefined (probably cmake)"); #endif fprintf (st, "\n Memory Access: %s Endian", sim_end ? "Little" : "Big"); fprintf (st, "\n Memory Pointer Size: %d bits", (int)sizeof(dptr)*8); fprintf (st, "\n %s", sim_toffset_64 ? "Large File (>2GB) support" : "No Large File support"); fprintf (st, "\n SDL Video support: %s", vid_version()); #if defined (HAVE_PCRE_H) fprintf (st, "\n PCRE RegEx (Version %s) support for EXPECT commands", pcre_version()); #else fprintf (st, "\n No RegEx support for EXPECT commands"); #endif fprintf (st, "\n OS clock resolution: %dms", os_tick_size); fprintf (st, "\n Time taken by msleep(1): %dms", os_ms_sleep_1); if (eth_version ()) fprintf (st, "\n Ethernet packet info: %s", eth_version()); #if defined(__VMS) if (1) { char *arch = #if defined(__ia64) "I64"; #elif defined(__ALPHA) "Alpha"; |
︙ | ︙ | |||
5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 | char *proc_id = getenv ("PROCESSOR_IDENTIFIER"); char *arch = getenv ("PROCESSOR_ARCHITECTURE"); char *procs = getenv ("NUMBER_OF_PROCESSORS"); char *proc_level = getenv ("PROCESSOR_LEVEL"); char *proc_rev = getenv ("PROCESSOR_REVISION"); char *proc_arch3264 = getenv ("PROCESSOR_ARCHITEW6432"); char osversion[PATH_MAX+1] = ""; FILE *f; if ((f = _popen ("ver", "r"))) { memset (osversion, 0, sizeof(osversion)); do { if (NULL == fgets (osversion, sizeof(osversion)-1, f)) break; sim_trim_endspc (osversion); } while (osversion[0] == '\0'); _pclose (f); } fprintf (st, "\n OS: %s", osversion); fprintf (st, "\n Architecture: %s%s%s, Processors: %s", arch, proc_arch3264 ? " on " : "", proc_arch3264 ? proc_arch3264 : "", procs); fprintf (st, "\n Processor Id: %s, Level: %s, Revision: %s", proc_id ? proc_id : "", proc_level ? proc_level : "", proc_rev ? proc_rev : ""); strlcpy (os_type, "Windows", sizeof (os_type)); } #else if (1) { char osversion[2*PATH_MAX+1] = ""; FILE *f; if ((f = popen ("uname -a", "r"))) { memset (osversion, 0, sizeof (osversion)); do { if (NULL == fgets (osversion, sizeof (osversion)-1, f)) break; | > > > > > > > > > > | 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 | char *proc_id = getenv ("PROCESSOR_IDENTIFIER"); char *arch = getenv ("PROCESSOR_ARCHITECTURE"); char *procs = getenv ("NUMBER_OF_PROCESSORS"); char *proc_level = getenv ("PROCESSOR_LEVEL"); char *proc_rev = getenv ("PROCESSOR_REVISION"); char *proc_arch3264 = getenv ("PROCESSOR_ARCHITEW6432"); char osversion[PATH_MAX+1] = ""; char tarversion[PATH_MAX+1] = ""; char curlversion[PATH_MAX+1] = ""; FILE *f; if ((f = _popen ("ver", "r"))) { memset (osversion, 0, sizeof(osversion)); do { if (NULL == fgets (osversion, sizeof(osversion)-1, f)) break; sim_trim_endspc (osversion); } while (osversion[0] == '\0'); _pclose (f); } fprintf (st, "\n OS: %s", osversion); fprintf (st, "\n Architecture: %s%s%s, Processors: %s", arch, proc_arch3264 ? " on " : "", proc_arch3264 ? proc_arch3264 : "", procs); fprintf (st, "\n Processor Id: %s, Level: %s, Revision: %s", proc_id ? proc_id : "", proc_level ? proc_level : "", proc_rev ? proc_rev : ""); strlcpy (os_type, "Windows", sizeof (os_type)); strlcpy (tarversion, _get_tool_version ("tar"), sizeof (tarversion)); if (tarversion[0]) fprintf (st, "\n tar tool: %s", tarversion); strlcpy (curlversion, _get_tool_version ("curl"), sizeof (curlversion)); if (curlversion[0]) fprintf (st, "\n curl tool: %s", curlversion); } #else if (1) { char osversion[2*PATH_MAX+1] = ""; char tarversion[PATH_MAX+1] = ""; char curlversion[PATH_MAX+1] = ""; FILE *f; if ((f = popen ("uname -a", "r"))) { memset (osversion, 0, sizeof (osversion)); do { if (NULL == fgets (osversion, sizeof (osversion)-1, f)) break; |
︙ | ︙ | |||
5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 | do { if (NULL == fgets (os_type, sizeof (os_type)-1, f)) break; sim_trim_endspc (os_type); } while (os_type[0] == '\0'); pclose (f); } } #endif if ((!strcmp (os_type, "Unknown")) && (getenv ("OSTYPE"))) strlcpy (os_type, getenv ("OSTYPE"), sizeof (os_type)); setenv ("SIM_OSTYPE", os_type, 1); } #if defined(SIM_GIT_COMMIT_ID) #define S_xstr(a) S_str(a) #define S_str(a) #a | > > > > > > > > > | | > > > > > > > > > > > > | 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 | do { if (NULL == fgets (os_type, sizeof (os_type)-1, f)) break; sim_trim_endspc (os_type); } while (os_type[0] == '\0'); pclose (f); } strlcpy (tarversion, _get_tool_version ("tar"), sizeof (tarversion)); if (tarversion[0]) fprintf (st, "\n tar tool: %s", tarversion); strlcpy (curlversion, _get_tool_version ("curl"), sizeof (curlversion)); if (curlversion[0]) fprintf (st, "\n curl tool: %s", curlversion); } #endif if ((!strcmp (os_type, "Unknown")) && (getenv ("OSTYPE"))) strlcpy (os_type, getenv ("OSTYPE"), sizeof (os_type)); setenv ("SIM_OSTYPE", os_type, 1); } #if defined(SIM_GIT_COMMIT_ID) #define S_xstr(a) S_str(a) #define S_str(a) #a if (1) { const char *extras = strchr (S_xstr(SIM_GIT_COMMIT_ID), '+'); fprintf (st, "%sgit commit id: %8.8s%s", flag ? "\n " : " ", S_xstr(SIM_GIT_COMMIT_ID), extras ? extras : ""); setenv ("SIM_GIT_COMMIT_ID", S_xstr(SIM_GIT_COMMIT_ID), 1); } #if defined(SIM_GIT_COMMIT_TIME) setenv ("SIM_GIT_COMMIT_TIME", S_xstr(SIM_GIT_COMMIT_TIME), 1); if (flag) fprintf (st, "%sgit commit time: %s", "\n ", S_xstr(SIM_GIT_COMMIT_TIME)); #endif #undef S_str #undef S_xstr #endif #if defined(SIM_BUILD) #define S_xstr(a) S_str(a) #define S_str(a) #a fprintf (st, "%sBuild: %s", flag ? "\n " : " ", S_xstr(SIM_BUILD)); #undef S_str #undef S_xstr #endif fprintf (st, "\n"); if (sim_vm_release_message != NULL) /* if a release message string is defined */ fprintf (st, "\n%s", sim_vm_release_message); /* then display it */ return SCPE_OK; } t_stat show_config (FILE *st, DEVICE *dnotused, UNIT *unotused, int32 flag, CONST char *cptr) { int32 i; DEVICE *dptr; t_bool only_enabled = (sim_switches & SWMASK ('E')); if (cptr && (*cptr != 0)) return SCPE_2MARG; fprintf (st, "%s simulator configuration%s\n\n", sim_name, only_enabled ? " (enabled devices)" : ""); for (i = dev_name_len = 0; (dptr = sim_devices[i]) != NULL; i++) if (!only_enabled || !qdisable (dptr)) if (dev_name_len < strlen (dptr->name)) dev_name_len = strlen (dptr->name); for (i = 0; (dptr = sim_devices[i]) != NULL; i++) if (!only_enabled || !qdisable (dptr)) show_device (st, dptr, flag); if (sim_switches & SWMASK ('I')) { for (i = dev_name_len = 0; sim_internal_device_count && (dptr = sim_internal_devices[i]); ++i) if (!only_enabled || !qdisable (dptr)) if (dev_name_len < strlen (dptr->name)) dev_name_len = strlen (dptr->name); fprintf (st, "\nInternal Devices%s\n\n", only_enabled ? " (enabled devices)" : ""); for (i = 0; sim_internal_device_count && (dptr = sim_internal_devices[i]); ++i) if (!only_enabled || !qdisable (dptr)) show_device (st, dptr, flag); } dev_name_len = 0; return SCPE_OK; } t_stat show_log_names (FILE *st, DEVICE *dnotused, UNIT *unotused, int32 flag, CONST char *cptr) { int32 i; DEVICE *dptr; |
︙ | ︙ | |||
6027 6028 6029 6030 6031 6032 6033 | return SCPE_OK; } t_stat show_queue (FILE *st, DEVICE *dnotused, UNIT *unotused, int32 flag, CONST char *cptr) { DEVICE *dptr; UNIT *uptr; | < | | | | < | | | < | 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 | return SCPE_OK; } t_stat show_queue (FILE *st, DEVICE *dnotused, UNIT *unotused, int32 flag, CONST char *cptr) { DEVICE *dptr; UNIT *uptr; MEMFILE buf; memset (&buf, 0, sizeof (buf)); if (cptr && (*cptr != 0)) return SCPE_2MARG; if (sim_clock_queue == QUEUE_LIST_END) fprintf (st, "%s event queue empty, time = %.0f, executing %s %s/sec\n", sim_name, sim_time, sim_fmt_numeric (sim_timer_inst_per_sec ()), sim_vm_interval_units); else { const char *tim = ""; double inst_per_sec = sim_timer_inst_per_sec (); fprintf (st, "%s event queue status, time = %.0f, executing %s %s/sec\n", sim_name, sim_time, sim_fmt_numeric (inst_per_sec), sim_vm_interval_units); for (uptr = sim_clock_queue; uptr != QUEUE_LIST_END; uptr = uptr->next) { if (uptr == &sim_step_unit) fprintf (st, " Step timer"); else if (uptr == &sim_expect_unit) fprintf (st, " Expect fired"); else if ((dptr = find_dev_from_unit (uptr)) != NULL) { fprintf (st, " %s", sim_dname (dptr)); if (dptr->numunits > 1) fprintf (st, " unit %d", (int32) (uptr - dptr->units)); } else fprintf (st, " Unknown"); if (inst_per_sec != 0.0) tim = sim_fmt_secs(((_sim_activate_queue_time (uptr) - 1) / sim_timer_inst_per_sec ()) + (uptr->usecs_remaining / 1000000.0)); if (uptr->usecs_remaining) fprintf (st, " at %d plus %.0f usecs%s%s%s%s\n", _sim_activate_queue_time (uptr) - 1, uptr->usecs_remaining, (*tim) ? " (" : "", tim, (*tim) ? " total)" : "", (uptr->flags & UNIT_IDLE) ? " (Idle capable)" : ""); else fprintf (st, " at %d%s%s%s%s\n", _sim_activate_queue_time (uptr) - 1, (*tim) ? " (" : "", tim, (*tim) ? ")" : "", (uptr->flags & UNIT_IDLE) ? " (Idle capable)" : ""); } } sim_show_clock_queues (st, dnotused, unotused, flag, cptr); #if defined (SIM_ASYNCH_IO) pthread_mutex_lock (&sim_asynch_lock); sim_mfile = &buf; fprintf (st, "asynchronous pending event queue\n"); |
︙ | ︙ | |||
6089 6090 6091 6092 6093 6094 6095 | (int32) (uptr - dptr->units)); } else fprintf (st, " Unknown"); fprintf (st, " event delay %d\n", uptr->a_event_time); } } fprintf (st, "asynch latency: %d nanoseconds\n", sim_asynch_latency); | | | 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 | (int32) (uptr - dptr->units)); } else fprintf (st, " Unknown"); fprintf (st, " event delay %d\n", uptr->a_event_time); } } fprintf (st, "asynch latency: %d nanoseconds\n", sim_asynch_latency); fprintf (st, "asynch instruction latency: %d %s\n", sim_asynch_inst_latency, sim_vm_interval_units); pthread_mutex_unlock (&sim_asynch_lock); sim_mfile = NULL; fprintf (st, "%*.*s", (int)buf.pos, (int)buf.pos, buf.buf); free (buf.buf); #endif /* SIM_ASYNCH_IO */ return SCPE_OK; } |
︙ | ︙ | |||
6182 6183 6184 6185 6186 6187 6188 | for (unit = 0; unit < dptr->numunits; unit++) show_dev_debug (st, dptr, &dptr->units[unit], 1, NULL); return SCPE_OK; } else return SCPE_NOFNC; } | | > | > > > > > > > > > | | | | | | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 | for (unit = 0; unit < dptr->numunits; unit++) show_dev_debug (st, dptr, &dptr->units[unit], 1, NULL); return SCPE_OK; } else return SCPE_NOFNC; } /* Show On actions for one level (default current level) */ t_stat show_on (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr) { int32 lvl, i; if (cptr && (*cptr != 0)) return SCPE_2MARG; /* now eol? */ if (flag < 0) lvl = sim_do_depth; else if (flag > sim_do_depth) return SCPE_ARG; else lvl = flag; if (flag == -1) { if (lvl > 0) fprintf(st, "On Processing at Do Nest Level: %d", lvl); else fprintf(st, "On Processing for input commands"); } else fprintf(st, "On Processing"); fprintf(st, " is %s\n", (sim_on_check[lvl]) ? "enabled" : "disabled"); for (i=1; i<SCPE_BASE; ++i) { if (sim_on_actions[lvl][i]) fprintf(st, " on %6d %s\n", i, sim_on_actions[lvl][i]); } for (i=SCPE_BASE; i<=SCPE_MAX_ERR; ++i) { if (sim_on_actions[lvl][i]) fprintf(st, " on %-6s %s\n", scp_errors[i-SCPE_BASE].code, sim_on_actions[lvl][i]); } if (sim_on_actions[lvl][0]) fprintf(st, " on ERROR %s\n", sim_on_actions[lvl][0]); if (sim_on_actions[lvl][ON_SIGINT_ACTION]) { fprintf(st, "CONTROL+C/SIGINT Handling:\n"); fprintf(st, " on CONTROL_C %s\n", sim_on_actions[lvl][ON_SIGINT_ACTION]); } fprintf(st, "\n"); if ((flag < 0) && sim_on_inherit) fprintf(st, "on state and actions are inherited by nested do commands and subroutines\n"); return SCPE_OK; } t_stat show_do (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr) { int32 lvl; if (cptr && (*cptr != 0)) return SCPE_2MARG; /* now eol? */ for (lvl=sim_do_depth; lvl >= 0; --lvl) { if (lvl > 0) fprintf(st, "Do Nest Level: %d\n", lvl); else { if (sim_do_filename[lvl][0]) fprintf(st, "Initial Input "); else fprintf(st, "Console Input commands\n"); } if (sim_do_filename[lvl][0]) { fprintf (st, "File: %s\n", sim_do_filename[lvl]); if (strcasecmp (sim_do_filename[lvl], "<stdin>")) fprintf (st, "Line: %d\n", sim_goto_line[lvl]); } if (sim_if_cmd[lvl]) fprintf (st, "Processing IF command\n"); if (sim_if_cmd_last[lvl]) fprintf (st, "IF command last\n"); if (sim_if_result[lvl]) fprintf (st, "IF result\n"); if (sim_if_result_last[lvl]) fprintf (st, "IF result last\n"); if (sim_cptr_is_action[lvl]) fprintf (st, "Command is Action\n"); fprintf (st, "Command is: %s\n", sim_do_ocptr[lvl]); show_on (st, dptr, uptr, lvl, cptr); } if (sim_on_inherit) fprintf(st, "on state and actions are inherited by nested do commands and subroutines\n"); return SCPE_OK; } /* Show modifiers */ |
︙ | ︙ | |||
6264 6265 6266 6267 6268 6269 6270 | return SCPE_OK; } t_stat show_one_mod (FILE *st, DEVICE *dptr, UNIT *uptr, MTAB *mptr, CONST char *cptr, int32 flag) { t_stat r = SCPE_OK; | < | < < < < < < | | 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 | return SCPE_OK; } t_stat show_one_mod (FILE *st, DEVICE *dptr, UNIT *uptr, MTAB *mptr, CONST char *cptr, int32 flag) { t_stat r = SCPE_OK; if (mptr->disp) r = mptr->disp (st, uptr, mptr->match, (CONST void *)(cptr? cptr: mptr->desc)); else fputs (mptr->pstring, st); if ((r == SCPE_OK) && (flag && !((mptr->mask & MTAB_XTD) && MODMASK(mptr,MTAB_NMO)))) fputc ('\n', st); return r; } /* Show show commands */ |
︙ | ︙ | |||
6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 | { char gbuf[4*CBUFSIZE]; if (sim_is_running) return SCPE_INVREM; if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; gbuf[sizeof(gbuf)-1] = '\0'; strlcpy (gbuf, cptr, sizeof(gbuf)); sim_trim_endspc(gbuf); | > | | 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 | { char gbuf[4*CBUFSIZE]; if (sim_is_running) return SCPE_INVREM; if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; GET_SWITCHES (cptr); /* get switches */ gbuf[sizeof(gbuf)-1] = '\0'; strlcpy (gbuf, cptr, sizeof(gbuf)); sim_trim_endspc(gbuf); if (sim_chdir(gbuf) != 0) return sim_messagef(SCPE_IOERR, "Unable to directory change to: %s\n", gbuf); return SCPE_OK; } t_stat pwd_cmd (int32 flg, CONST char *cptr) { return show_cmd (0, "DEFAULT"); |
︙ | ︙ | |||
6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 | t_stat dir_cmd (int32 flg, CONST char *cptr) { DIR_CTX dir_state; t_stat r; char WildName[PATH_MAX + 1]; struct stat filestat; memset (&dir_state, 0, sizeof (dir_state)); strlcpy (WildName, cptr, sizeof(WildName)); cptr = WildName; sim_trim_endspc (WildName); if (*cptr == '\0') strlcpy (WildName, ".", sizeof (WildName)); else { if ((WildName[strlen (WildName) - 1] == '/') || (WildName[strlen (WildName) - 1] == '\\')) | > | | > > < > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 | t_stat dir_cmd (int32 flg, CONST char *cptr) { DIR_CTX dir_state; t_stat r; char WildName[PATH_MAX + 1]; struct stat filestat; GET_SWITCHES (cptr); /* get switches */ memset (&dir_state, 0, sizeof (dir_state)); strlcpy (WildName, cptr, sizeof(WildName)); cptr = WildName; sim_trim_endspc (WildName); if (*cptr == '\0') strlcpy (WildName, ".", sizeof (WildName)); else { if ((WildName[strlen (WildName) - 1] == '/') || (WildName[strlen (WildName) - 1] == '\\')) strlcat (WildName, ".", sizeof (WildName)); } if ((!sim_stat (WildName, &filestat)) && (filestat.st_mode & S_IFDIR)) strlcat (WildName, "/*", sizeof (WildName)); r = sim_dir_scan (cptr, sim_dir_entry, &dir_state); sim_dir_entry (NULL, NULL, 0, NULL, &dir_state); /* output summary */ if (r != SCPE_OK) { char *cp = sim_filepath_parts (WildName, "p"); sim_printf ("\n Directory of %s\n\n", cp); sim_printf ("File Not Found\n\n"); free (cp); return SCPE_OK; } return r; } static long sim_type_file_offset; static long sim_type_line_count; typedef struct { t_stat stat; } TYPE_CTX; static void sim_type_entry (const char *directory, const char *filename, t_offset FileSize, const struct stat *filestat, void *context) { char FullPath[PATH_MAX + 1]; FILE *file; long lines = 0; char lbuf[4*CBUFSIZE]; sprintf (FullPath, "%s%s", directory, filename); file = sim_fopen (FullPath, "r"); if (file == NULL) /* open failed? */ return; sim_printf ("\n%s\n\n", FullPath); lbuf[sizeof(lbuf)-1] = '\0'; if (sim_type_file_offset) (void)fseek (file, sim_type_file_offset, SEEK_SET); while ((NULL != fgets (lbuf, sizeof(lbuf)-1, file)) && (lines++ < sim_type_line_count)) sim_printf ("%s", lbuf); fclose (file); } t_stat type_cmd (int32 flg, CONST char *cptr) { FILE *file; long lines = 0; char lbuf[4*CBUFSIZE]; sim_type_file_offset = 0; /* beginning of file */ sim_type_line_count = 0X7FFFFFFF; /* output many lines */ GET_SWITCHES (cptr); /* get switches */ if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; if (sim_switches & SWMASK ('O')) { /* Specify Offset in file */ char gbuf[CBUFSIZE]; char *eptr; cptr = get_glyph (cptr, gbuf, 0); if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; sim_type_file_offset = strtol (gbuf, &eptr, 0); if ((*eptr) || (sim_type_file_offset < 0)) return sim_messagef (SCPE_ARG, "Invalid file offset: %s\n", gbuf); } if (sim_switches & SWMASK ('N')) { /* Specify Line Count to display */ char gbuf[CBUFSIZE]; char *eptr; cptr = get_glyph (cptr, gbuf, 0); if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; sim_type_line_count = strtol (gbuf, &eptr, 0); if ((*eptr) || (sim_type_line_count < 0)) return sim_messagef (SCPE_ARG, "Invalid file line count: %s\n", gbuf); } lbuf[sizeof(lbuf)-1] = '\0'; strlcpy (lbuf, cptr, sizeof(lbuf)); sim_trim_endspc(lbuf); file = sim_fopen (lbuf, "r"); if (file == NULL) { /* open failed? */ TYPE_CTX type_state; t_stat stat; memset (&type_state, 0, sizeof (type_state)); stat = sim_dir_scan (cptr, sim_type_entry, &type_state); if (stat == SCPE_OK) return SCPE_OK; return sim_messagef (SCPE_OPENERR, "The system cannot find the file specified.\n"); } lbuf[sizeof(lbuf)-1] = '\0'; if (sim_type_file_offset) (void)fseek (file, sim_type_file_offset, SEEK_SET); while ((NULL != fgets (lbuf, sizeof(lbuf)-1, file)) && (lines++ < sim_type_line_count)) sim_printf ("%s", lbuf); fclose (file); return SCPE_OK; } typedef struct { t_stat stat; |
︙ | ︙ | |||
6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 | t_stat delete_cmd (int32 flg, CONST char *cptr) { DEL_CTX del_state; t_stat stat; if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; memset (&del_state, 0, sizeof (del_state)); stat = sim_dir_scan (cptr, sim_delete_entry, &del_state); if (stat == SCPE_OK) return del_state.stat; | > | | 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 | t_stat delete_cmd (int32 flg, CONST char *cptr) { DEL_CTX del_state; t_stat stat; if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; GET_SWITCHES (cptr); /* get switches */ memset (&del_state, 0, sizeof (del_state)); stat = sim_dir_scan (cptr, sim_delete_entry, &del_state); if (stat == SCPE_OK) return del_state.stat; return sim_messagef (SCPE_OK, "No such file or directory: %s\n", cptr); } typedef struct { t_stat stat; int count; char destname[CBUFSIZE]; } COPY_CTX; |
︙ | ︙ | |||
6548 6549 6550 6551 6552 6553 6554 | strlcpy (dname, ctx->destname, sizeof (dname)); sprintf (FullPath, "%s%s", directory, filename); if ((dname[strlen (dname) - 1] == '/') || (dname[strlen (dname) - 1] == '\\')) dname[strlen (dname) - 1] = '\0'; | | | 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 | strlcpy (dname, ctx->destname, sizeof (dname)); sprintf (FullPath, "%s%s", directory, filename); if ((dname[strlen (dname) - 1] == '/') || (dname[strlen (dname) - 1] == '\\')) dname[strlen (dname) - 1] = '\0'; if ((!sim_stat (dname, &deststat)) && (deststat.st_mode & S_IFDIR)) { const char *dslash = (strrchr (dname, '/') ? "/" : (strrchr (dname, '\\') ? "\\" : "/")); dname[sizeof (dname) - 1] = '\0'; snprintf (&dname[strlen (dname)], sizeof (dname) - strlen (dname), "%s%s", dslash, filename); } st = sim_copyfile (FullPath, dname, TRUE); if (SCPE_OK == st) |
︙ | ︙ | |||
6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 | char sname[CBUFSIZE]; COPY_CTX copy_state; t_stat stat; memset (©_state, 0, sizeof (copy_state)); if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; cptr = get_glyph_quoted (cptr, sname, 0); if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; cptr = get_glyph_quoted (cptr, copy_state.destname, 0); stat = sim_dir_scan (sname, sim_copy_entry, ©_state); if ((stat == SCPE_OK) && (copy_state.count)) return sim_messagef (SCPE_OK, " %3d file(s) copied\n", copy_state.count); return copy_state.stat; } /* Debug command */ t_stat debug_cmd (int32 flg, CONST char *cptr) { char gbuf[CBUFSIZE]; CONST char *svptr; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 | char sname[CBUFSIZE]; COPY_CTX copy_state; t_stat stat; memset (©_state, 0, sizeof (copy_state)); if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; GET_SWITCHES (cptr); /* get switches */ cptr = get_glyph_quoted (cptr, sname, 0); if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; cptr = get_glyph_quoted (cptr, copy_state.destname, 0); stat = sim_dir_scan (sname, sim_copy_entry, ©_state); if ((stat == SCPE_OK) && (copy_state.count)) return sim_messagef (SCPE_OK, " %3d file(s) copied\n", copy_state.count); return copy_state.stat; } t_stat rename_cmd (int32 flg, CONST char *cptr) { char sname[CBUFSIZE], dname[CBUFSIZE]; if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; GET_SWITCHES (cptr); /* get switches */ cptr = get_glyph_quoted (cptr, sname, 0); if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; cptr = get_glyph_quoted (cptr, dname, 0); if (0 == rename (sname, dname)) return SCPE_OK; return sim_messagef (SCPE_ARG, "Can't rename '%s' to '%s': %s\n\n", sname, dname, strerror (errno)); } t_stat mkdir_cmd (int32 flg, CONST char *cptr) { char path[CBUFSIZE]; char *c; struct stat filestat; GET_SWITCHES (cptr); /* get switches */ if ((!cptr) || (*cptr == '\0')) return sim_messagef (SCPE_2FARG, "Must specify a directory path\n"); strlcpy (path, cptr, sizeof (path)); while ((c = strchr (path, '\\'))) *c = '/'; if (path[strlen (path) - 1] == '/') /* trim any trailing / from the path */ path[strlen (path) - 1] = '\0'; while ((c = strstr (path, "//"))) memmove (c, c + 1, strlen (c + 1) + 1); /* clean out any empty directories // */ if ((!sim_stat (path, &filestat)) && (filestat.st_mode & S_IFDIR)) return sim_messagef (SCPE_OK, "directory %s already exists\n", path); c = path; while ((c = strchr (c, '/'))) { *c = '\0'; if (!sim_stat (path, &filestat)) { if (filestat.st_mode & S_IFDIR) { *c = '/'; /* restore / */ ++c; continue; } return sim_messagef (SCPE_ARG, "%s is not a directory\n", path); } if (sim_mkdir (path)) return sim_messagef (SCPE_ARG, "Can't create directory: %s - %s\n", path, strerror (errno)); *c = '/'; /* restore / */ ++c; } if (sim_mkdir (path)) return sim_messagef (SCPE_ARG, "Can't create directory: %s - %s\n", path, strerror (errno)); return SCPE_OK; } t_stat rmdir_cmd (int32 flg, CONST char *cptr) { GET_SWITCHES (cptr); /* get switches */ if ((!cptr) || (*cptr == '\0')) return sim_messagef (SCPE_2FARG, "Must specify a directory\n"); if (sim_rmdir (cptr)) return sim_messagef (SCPE_ARG, "Can't remove directory: %s - %s\n", cptr, strerror (errno)); return SCPE_OK; } /* Debug command */ t_stat debug_cmd (int32 flg, CONST char *cptr) { char gbuf[CBUFSIZE]; CONST char *svptr; |
︙ | ︙ | |||
6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 | dptr = find_dev (gbuf); /* locate device */ if (dptr == NULL) /* found it? */ return SCPE_NXDEV; if (dptr->reset != NULL) return dptr->reset (dptr); else return SCPE_OK; } /* Reset devices start..end Inputs: start = number of starting device Outputs: status = error status */ t_stat reset_all (uint32 start) { DEVICE *dptr; uint32 i; t_stat reason; for (i = 0; i < start; i++) { if (sim_devices[i] == NULL) return SCPE_IERR; } for (i = start; (dptr = sim_devices[i]) != NULL; i++) { | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | > > > | 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 | dptr = find_dev (gbuf); /* locate device */ if (dptr == NULL) /* found it? */ return SCPE_NXDEV; if (dptr->reset != NULL) return dptr->reset (dptr); else return SCPE_OK; } t_stat runlimit_cmd (int32 flag, CONST char *cptr) { char gbuf[CBUFSIZE]; int32 num; t_stat r; double usec_factor = 1.0; const char *units = ""; char runlimit[32]; GET_SWITCHES (cptr); /* get switches */ if (0 == flag) { if (*cptr) return sim_messagef (SCPE_ARG, "NORUNLIMIT expects no arguments: %s\n", cptr); sim_runlimit = 0; sim_runlimit_switches = 0; sim_runlimit_enabled = FALSE; sim_cancel (&sim_runlimit_unit); unsetenv ("SIM_RUNLIMIT"); unsetenv ("SIM_RUNLIMIT_UNITS"); return SCPE_OK; } cptr = get_glyph (cptr, gbuf, 0); /* get next glyph */ num = (int32) get_uint (gbuf, 10, INT_MAX, &r); if ((r != SCPE_OK) || (num == 0)) /* error? */ return sim_messagef (SCPE_ARG, "Invalid argument: %s\n", gbuf); cptr = get_glyph (cptr, gbuf, 0); /* get next glyph */ if ((gbuf[0] == '\0') || (MATCH_CMD (gbuf, sim_vm_interval_units) == 0)) { sim_switches &= ~SWMASK ('T'); units = sim_vm_interval_units; } else { int i; struct { const char *name; double usec_factor; } time_units[] = { {"MICROSECONDS", 1.0}, {"USECONDS", 1.0}, {"SECONDS", 1000000.0}, {"MINUTES", 60*1000000.0}, {"HOURS", 60*60*1000000.0}, {NULL, 0.0}}; for (i=0; time_units[i].name; i++) { if (MATCH_CMD (gbuf, time_units[i].name) == 0) { sim_switches |= SWMASK ('T'); usec_factor = time_units[i].usec_factor; units = time_units[i].name; break; } } if (time_units[i].name == NULL) return sim_messagef (SCPE_2MARG, "Too many arguments: %s %s\n", gbuf, cptr); } if (*cptr) return sim_messagef (SCPE_2MARG, "Too many arguments: %s\n", cptr); sim_runlimit_enabled = TRUE; sim_cancel (&sim_runlimit_unit); sim_runlimit_switches = sim_switches; if (sim_runlimit_switches & SWMASK ('T')) { sim_runlimit_d_initial = sim_runlimit_d = num * usec_factor * sim_host_speed_factor (); if (sim_host_speed_factor () > 1.0) sim_messagef (SCPE_OK, "Slow host - adjusting RUNLIMIT from %d %s to %.1f %s\n", num, units, num * sim_host_speed_factor (), units); snprintf (runlimit, sizeof (runlimit), "%.f", num * sim_host_speed_factor ()); setenv ("SIM_RUNLIMIT", runlimit, 1); setenv ("SIM_RUNLIMIT_UNITS", units, 1); return sim_activate_after_d (&sim_runlimit_unit, sim_runlimit_d); } else { sim_runlimit_initial = sim_runlimit = num; snprintf (runlimit, sizeof (runlimit), "%d", num); setenv ("SIM_RUNLIMIT", runlimit, 1); setenv ("SIM_RUNLIMIT_UNITS", units, 1); return sim_activate (&sim_runlimit_unit, sim_runlimit); } } t_stat set_runlimit (int32 flag, CONST char *cptr) { return runlimit_cmd (flag, cptr); } t_stat show_runlimit (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr) { if (sim_runlimit_enabled) { if (sim_runlimit_switches & SWMASK ('T')) { if (sim_runlimit_d_initial != sim_runlimit_d) { fprintf (st, "%s initially, ", sim_fmt_secs (sim_runlimit_d_initial / 1000000.0)); if (sim_is_active (&sim_runlimit_unit)) fprintf (st, "and %s remaining\n", sim_fmt_secs (sim_runlimit_d / 1000000.0)); else fprintf (st, "expired now\n"); } else fprintf (st, "%s\n", sim_fmt_secs (sim_runlimit_d_initial / 1000000.0)); } else { if (sim_runlimit_initial != sim_runlimit) { fprintf (st, "%d %s initially, ", sim_runlimit_initial, sim_vm_interval_units); if (sim_is_active (&sim_runlimit_unit)) fprintf (st, "and %d %s remaining\n", sim_activate_time (&sim_runlimit_unit), sim_vm_interval_units); else fprintf (st, "expired now\n"); } else fprintf (st, "%d %s\n", sim_runlimit_initial, sim_vm_interval_units); } } else fprintf (st, "Run Limit Disabled\n"); return SCPE_OK; } /* Reset devices start..end Inputs: start = number of starting device Outputs: status = error status */ t_stat reset_all (uint32 start) { DEVICE *dptr; uint32 i; t_stat reason; int32 saved_sim_switches = sim_switches; for (i = 0; i < start; i++) { if (sim_devices[i] == NULL) return SCPE_IERR; } for (i = start; (dptr = sim_devices[i]) != NULL; i++) { sim_switches = saved_sim_switches; /* restore initial switches */ if (sim_switches & SWMASK ('P')) { tmxr_add_debug (dptr); /* Add TMXR debug to MUX devices */ sim_tape_add_debug (dptr); /* Add TAPE debug to TAPE devices */ fix_writelock_mtab (dptr); } if (dptr->reset != NULL) { reason = dptr->reset (dptr); if (reason != SCPE_OK) { sim_failed_reset_dptr = dptr; return reason; } } } for (i = 0; sim_internal_device_count && (dptr = sim_internal_devices[i]); ++i) { sim_switches = saved_sim_switches; /* restore initial switches */ if (dptr->reset != NULL) { reason = dptr->reset (dptr); if (reason != SCPE_OK) return reason; } } return SCPE_OK; |
︙ | ︙ | |||
6827 6828 6829 6830 6831 6832 6833 | { t_stat r; int32 old_sw = sim_switches; sim_switches = SWMASK ('P'); r = reset_all (start); sim_switches = old_sw; | > > | > | > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > | 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 | { t_stat r; int32 old_sw = sim_switches; sim_switches = SWMASK ('P'); r = reset_all (start); sim_switches = old_sw; return r; } /* Set Hardware Write Lock */ t_stat set_writelock (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { if (((uptr->flags & UNIT_WPRT) != 0) == val) /* Already set as desired? */ return SCPE_OK; /* Do nothing */ if (val) /* Lock? */ uptr->flags |= UNIT_WLK; /* Do it. */ else /* Unlock */ if (((uptr->flags & UNIT_ATT) != 0) && /* Transition from Locked to Unlock while attached read-only? */ ((uptr->flags & UNIT_RO) != 0)) return sim_messagef (SCPE_ALATT, "%s: Can't enable write when attached read only\n", sim_uname (uptr)); else uptr->flags &= ~UNIT_WLK; return SCPE_OK; } /* Show Write Lock */ t_stat show_writelock (FILE *st, UNIT *uptr, int32 val, CONST void *desc) { fprintf (st, "write %s", (uptr->flags & UNIT_WPRT) ? "locked" : "enabled"); return SCPE_OK; } static void fix_writelock_mtab (DEVICE *dptr) { MTAB *mtab; for (mtab = dptr->modifiers; (mtab != NULL) && (mtab->mstring != NULL); ++mtab) { if (mtab->disp == &show_writelock) mtab->pstring = "WRITEENABLED"; } } /* Load and dump commands lo[ad] filename {arg} load specified file du[mp] filename {arg} dump to specified file */ |
︙ | ︙ | |||
6967 6968 6969 6970 6971 6972 6973 | if (((uptr->flags & UNIT_ROABLE) == 0) && /* allowed? */ ((uptr->flags & UNIT_RO) == 0)) return attach_err (uptr, SCPE_NORO); /* no, error */ uptr->fileref = sim_fopen (cptr, "rb"); /* open rd only */ if (uptr->fileref == NULL) /* open fail? */ return attach_err (uptr, SCPE_OPENERR); /* yes, error */ if (!(uptr->flags & UNIT_RO)) | | | | | | | 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 | if (((uptr->flags & UNIT_ROABLE) == 0) && /* allowed? */ ((uptr->flags & UNIT_RO) == 0)) return attach_err (uptr, SCPE_NORO); /* no, error */ uptr->fileref = sim_fopen (cptr, "rb"); /* open rd only */ if (uptr->fileref == NULL) /* open fail? */ return attach_err (uptr, SCPE_OPENERR); /* yes, error */ if (!(uptr->flags & UNIT_RO)) sim_messagef (SCPE_OK, "%s: unit is read only\n", sim_uname (uptr)); uptr->flags = uptr->flags | UNIT_RO; /* set rd only */ } else { if (sim_switches & SWMASK ('N')) { /* new file only? */ uptr->fileref = sim_fopen (cptr, "wb+"); /* open new file */ if (uptr->fileref == NULL) /* open fail? */ return attach_err (uptr, SCPE_OPENERR); /* yes, error */ sim_messagef (SCPE_OK, "%s: creating new file: %s\n", sim_uname (uptr), cptr); } else { /* normal */ uptr->fileref = sim_fopen (cptr, "rb+"); /* open r/w */ if (uptr->fileref == NULL) { /* open fail? */ #if defined(EPERM) if ((errno == EROFS) || (errno == EACCES) || (errno == EPERM)) {/* read only? */ #else if ((errno == EROFS) || (errno == EACCES)) {/* read only? */ #endif if ((uptr->flags & UNIT_ROABLE) == 0) /* allowed? */ return attach_err (uptr, SCPE_NORO);/* no error */ uptr->fileref = sim_fopen (cptr, "rb"); /* open rd only */ if (uptr->fileref == NULL) /* open fail? */ return attach_err (uptr, SCPE_OPENERR); /* yes, error */ uptr->flags = uptr->flags | UNIT_RO; /* set rd only */ sim_messagef (SCPE_OK, "%s: unit is read only\n", sim_uname (uptr)); } else { /* doesn't exist */ if (sim_switches & SWMASK ('E')) /* must exist? */ return attach_err (uptr, SCPE_OPENERR); /* yes, error */ uptr->fileref = sim_fopen (cptr, "wb+");/* open new file */ if (uptr->fileref == NULL) /* open fail? */ return attach_err (uptr, SCPE_OPENERR); /* yes, error */ sim_messagef (SCPE_OK, "%s: creating new file\n", sim_uname (uptr)); } } /* end if null */ else open_rw = TRUE; } /* end else */ } if (uptr->flags & UNIT_BUFABLE) { /* buffer? */ uint32 cap = ((uint32) uptr->capac) / dptr->aincr; /* effective size */ if (uptr->flags & UNIT_MUSTBUF) /* dyn alloc? */ uptr->filebuf = calloc (cap, SZ_D (dptr)); /* allocate */ if (uptr->filebuf == NULL) /* no buffer? */ return attach_err (uptr, SCPE_MEM); /* error */ sim_messagef (SCPE_OK, "%s: buffering file in memory\n", sim_uname (uptr)); uptr->hwmark = (uint32)sim_fread (uptr->filebuf, /* read file */ SZ_D (dptr), cap, uptr->fileref); uptr->flags = uptr->flags | UNIT_BUF; /* set buffered */ } uptr->flags = uptr->flags | UNIT_ATT; uptr->pos = 0; if (open_rw && /* open for write in append mode? */ |
︙ | ︙ | |||
7134 7135 7136 7137 7138 7139 7140 | return SCPE_UNATT; /* complain */ } if ((dptr = find_dev_from_unit (uptr)) == NULL) return SCPE_OK; if ((uptr->flags & UNIT_BUF) && (uptr->filebuf)) { uint32 cap = (uptr->hwmark + dptr->aincr - 1) / dptr->aincr; if (uptr->hwmark && ((uptr->flags & UNIT_RO) == 0)) { | | | | 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 8004 8005 | return SCPE_UNATT; /* complain */ } if ((dptr = find_dev_from_unit (uptr)) == NULL) return SCPE_OK; if ((uptr->flags & UNIT_BUF) && (uptr->filebuf)) { uint32 cap = (uptr->hwmark + dptr->aincr - 1) / dptr->aincr; if (uptr->hwmark && ((uptr->flags & UNIT_RO) == 0)) { sim_messagef (SCPE_OK, "%s: writing buffer to file: %s\n", sim_uname (uptr), uptr->filename); rewind (uptr->fileref); sim_fwrite (uptr->filebuf, SZ_D (dptr), cap, uptr->fileref); if (ferror (uptr->fileref)) sim_printf ("%s: I/O error - %s", sim_uname (uptr), strerror (errno)); } if (uptr->flags & UNIT_MUSTBUF) { /* dyn alloc? */ free (uptr->filebuf); /* free buf */ uptr->filebuf = NULL; } uptr->flags = uptr->flags & ~UNIT_BUF; } |
︙ | ︙ | |||
7278 7279 7280 7281 7282 7283 7284 | GET_SWITCHES (cptr); /* get switches */ if (*cptr == 0) /* must be more */ return SCPE_2FARG; gbuf[sizeof(gbuf)-1] = '\0'; strlcpy (gbuf, cptr, sizeof(gbuf)); sim_trim_endspc (gbuf); | > | | > > > | 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 | GET_SWITCHES (cptr); /* get switches */ if (*cptr == 0) /* must be more */ return SCPE_2FARG; gbuf[sizeof(gbuf)-1] = '\0'; strlcpy (gbuf, cptr, sizeof(gbuf)); sim_trim_endspc (gbuf); if ((sfile = sim_fopen (gbuf, "r+b")) == NULL) { /* try existing file */ if ((sfile = sim_fopen (gbuf, "wb")) == NULL) /* create new empty file */ return SCPE_OPENERR; } r = sim_save (sfile); fclose (sfile); return r; } t_stat sim_save (FILE *sfile) { void *mbuf; int32 l, t; uint32 i, j, device_count; t_addr k, high; t_value val; t_stat r; t_bool zeroflg; size_t sz; DEVICE *dptr; UNIT *uptr; REG *rptr; #define WRITE_I(xx) sim_fwrite (&(xx), sizeof (xx), 1, sfile) sim_debug(SIM_DBG_SAVE, &sim_scp_dev, "sim_save ()\n"); /* Don't make changes below without also changing save_vercur above */ fprintf (sfile, "%s\n%s\n%s\n%s\n%s\n%.0f\n", save_vercur, /* [V2.5] save format */ sim_savename, /* sim name */ sim_si64, sim_sa64, eth_capabilities(), /* [V3.5] options */ |
︙ | ︙ | |||
7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 | for (i = 0; i < (device_count + sim_internal_device_count); i++) {/* loop thru devices */ if (i < device_count) dptr = sim_devices[i]; else dptr = sim_internal_devices[i - device_count]; if (dptr->flags & DEV_NOSAVE) continue; fputs (dptr->name, sfile); /* device name */ fputc ('\n', sfile); if (dptr->lname) /* [V3.0] logical name */ fputs (dptr->lname, sfile); fputc ('\n', sfile); WRITE_I (dptr->flags); /* [V2.10] flags */ for (j = 0; j < dptr->numunits; j++) { | > | 8184 8185 8186 8187 8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 | for (i = 0; i < (device_count + sim_internal_device_count); i++) {/* loop thru devices */ if (i < device_count) dptr = sim_devices[i]; else dptr = sim_internal_devices[i - device_count]; if (dptr->flags & DEV_NOSAVE) continue; sim_debug (SIM_DBG_SAVE, &sim_scp_dev, "Saving %s\n", dptr->name); fputs (dptr->name, sfile); /* device name */ fputc ('\n', sfile); if (dptr->lname) /* [V3.0] logical name */ fputs (dptr->lname, sfile); fputc ('\n', sfile); WRITE_I (dptr->flags); /* [V2.10] flags */ for (j = 0; j < dptr->numunits; j++) { |
︙ | ︙ | |||
7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 | val = get_rval (rptr, j); /* get value */ WRITE_I (val); /* store */ } } fputc ('\n', sfile); /* end registers */ } fputc ('\n', sfile); /* end devices */ return (ferror (sfile))? SCPE_IOERR: SCPE_OK; /* error during save? */ } /* Restore command re[store] filename restore state from specified file */ | > > > > > > > | 8274 8275 8276 8277 8278 8279 8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 | val = get_rval (rptr, j); /* get value */ WRITE_I (val); /* store */ } } fputc ('\n', sfile); /* end registers */ } fputc ('\n', sfile); /* end devices */ if (!ferror (sfile)) { t_offset pos = sim_ftell (sfile); /* get current position */ if (pos < 0) /* error? */ return SCPE_IOERR; /* done! */ sim_set_fsize (sfile, (t_addr)pos); /* truncate the save file */ } return (ferror (sfile))? SCPE_IOERR: SCPE_OK; /* error during save? */ } /* Restore command re[store] filename restore state from specified file */ |
︙ | ︙ | |||
7450 7451 7452 7453 7454 7455 7456 | t_stat sim_rest (FILE *rfile) { char buf[CBUFSIZE]; char **attnames = NULL; UNIT **attunits = NULL; int32 *attswitches = NULL; int32 attcnt = 0; | | > > > | 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 8372 8373 8374 8375 8376 8377 8378 8379 | t_stat sim_rest (FILE *rfile) { char buf[CBUFSIZE]; char **attnames = NULL; UNIT **attunits = NULL; int32 *attswitches = NULL; int32 attcnt = 0; void *mbuf = NULL; int32 j, blkcnt, limit, unitno, time, flg; uint32 us, depth; t_addr k, high, old_capac; t_value val, mask; t_stat r; size_t sz; t_bool v40, v35, v32; DEVICE *dptr; UNIT *uptr; REG *rptr; struct stat rstat; t_bool force_restore = ((sim_switches & SWMASK ('F')) != 0); t_bool dont_detach_attach = ((sim_switches & SWMASK ('D')) != 0); t_bool suppress_warning = ((sim_switches & SWMASK ('Q')) != 0); t_bool warned = FALSE; sim_debug (SIM_DBG_RESTORE, &sim_scp_dev, "sim_rest (force=%d, dont_detach=%d, nowarnings=%d)\n", force_restore, dont_detach_attach, suppress_warning); sim_switches &= ~(SWMASK ('F') | SWMASK ('D') | SWMASK ('Q')); /* remove digested switches */ #define READ_S(xx) if (read_line ((xx), sizeof(xx), rfile) == NULL) { \ r = SCPE_IOERR; \ goto Cleanup_Return; \ } #define READ_I(xx) if (sim_fread (&xx, sizeof (xx), 1, rfile) == 0) { \ r = SCPE_IOERR; \ goto Cleanup_Return; \ } if (fstat (fileno (rfile), &rstat)) { r = SCPE_IOERR; goto Cleanup_Return; } READ_S (buf); /* [V2.5+] read version */ sim_debug (SIM_DBG_RESTORE, &sim_scp_dev, "version=%s\n", buf); v40 = v35 = v32 = FALSE; if (strcmp (buf, save_ver40) == 0) /* version 4.0? */ v40 = v35 = v32 = TRUE; else if (strcmp (buf, save_ver35) == 0) /* version 3.5? */ v35 = v32 = TRUE; else if (strcmp (buf, save_ver32) == 0) /* version 3.2? */ v32 = TRUE; else if (strcmp (buf, save_ver30) != 0) { /* version 3.0? */ sim_printf ("Invalid file version: %s\n", buf); return SCPE_INCOMP; } if ((strcmp (buf, save_ver40) != 0) && (!sim_quiet) && (!suppress_warning)) { sim_printf ("warning - attempting to restore a saved simulator image in %s image format.\n", buf); warned = TRUE; } READ_S (buf); /* read sim name */ sim_debug (SIM_DBG_RESTORE, &sim_scp_dev, "sim_name=%s\n", buf); if (strcmp (buf, sim_savename)) { /* name match? */ sim_printf ("Wrong system type: %s\n", buf); return SCPE_INCOMP; } if (v35) { /* [V3.5+] options */ READ_S (buf); /* integer size */ if (strcmp (buf, sim_si64) != 0) { |
︙ | ︙ | |||
7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 | } } } for ( ;; ) { /* device loop */ READ_S (buf); /* read device name */ if (buf[0] == 0) /* last? */ break; if ((dptr = find_dev (buf)) == NULL) { /* locate device */ sim_printf ("Invalid device name: %s\n", buf); r = SCPE_INCOMP; goto Cleanup_Return; } READ_S (buf); /* [V3.0+] logical name */ deassign_device (dptr); /* delete old name */ if ((buf[0] != 0) && ((r = assign_device (dptr, buf)) != SCPE_OK)) { r = SCPE_INCOMP; goto Cleanup_Return; } READ_I (flg); /* [V2.10+] ctlr flags */ if (!v32) flg = ((flg & DEV_UFMASK_31) << (DEV_V_UF - DEV_V_UF_31)) | (flg & ~DEV_UFMASK_31); /* [V3.2+] flags moved */ dptr->flags = (dptr->flags & ~DEV_RFLAGS) | /* restore ctlr flags */ (flg & DEV_RFLAGS); for ( ;; ) { /* unit loop */ sim_switches = SIM_SW_REST; /* flag rstr, clr RO */ | > > > > | 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433 8434 8435 8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 | } } } for ( ;; ) { /* device loop */ READ_S (buf); /* read device name */ if (buf[0] == 0) /* last? */ break; sim_debug (SIM_DBG_RESTORE, &sim_scp_dev, "DEVICE=%s\n", buf); if ((dptr = find_dev (buf)) == NULL) { /* locate device */ sim_printf ("Invalid device name: %s\n", buf); r = SCPE_INCOMP; goto Cleanup_Return; } READ_S (buf); /* [V3.0+] logical name */ if (buf[0] != '\0') sim_debug (SIM_DBG_RESTORE, &sim_scp_dev, "logical name=%s\n", buf); deassign_device (dptr); /* delete old name */ if ((buf[0] != 0) && ((r = assign_device (dptr, buf)) != SCPE_OK)) { r = SCPE_INCOMP; goto Cleanup_Return; } READ_I (flg); /* [V2.10+] ctlr flags */ sim_debug (SIM_DBG_RESTORE, &sim_scp_dev, "DEVICE.flags=%0X\n", flg); if (!v32) flg = ((flg & DEV_UFMASK_31) << (DEV_V_UF - DEV_V_UF_31)) | (flg & ~DEV_UFMASK_31); /* [V3.2+] flags moved */ dptr->flags = (dptr->flags & ~DEV_RFLAGS) | /* restore ctlr flags */ (flg & DEV_RFLAGS); for ( ;; ) { /* unit loop */ sim_switches = SIM_SW_REST; /* flag rstr, clr RO */ |
︙ | ︙ | |||
7667 7668 7669 7670 7671 7672 7673 | sim_printf ("Memory size changed: %s%d = ", sim_dname (dptr), unitno); fprint_capac (stdout, dptr, uptr); if (sim_log) fprint_capac (sim_log, dptr, uptr); sim_printf ("\n"); } sz = SZ_D (dptr); /* allocate buffer */ | | < > | < > | < < > > | | > > | 8539 8540 8541 8542 8543 8544 8545 8546 8547 8548 8549 8550 8551 8552 8553 8554 8555 8556 8557 8558 8559 8560 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574 8575 8576 8577 8578 8579 8580 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592 8593 8594 8595 8596 8597 8598 8599 8600 8601 8602 8603 8604 8605 8606 8607 8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 8618 8619 8620 8621 8622 8623 | sim_printf ("Memory size changed: %s%d = ", sim_dname (dptr), unitno); fprint_capac (stdout, dptr, uptr); if (sim_log) fprint_capac (sim_log, dptr, uptr); sim_printf ("\n"); } sz = SZ_D (dptr); /* allocate buffer */ if ((mbuf = realloc (mbuf, SRBSIZ * sz)) == NULL) { r = SCPE_MEM; goto Cleanup_Return; } for (k = 0; k < high; ) { /* loop thru mem */ if (sim_fread (&blkcnt, sizeof (blkcnt), 1, rfile) == 0) {/* block count */ r = SCPE_IOERR; goto Cleanup_Return; } if (blkcnt < 0) /* compressed? */ limit = -blkcnt; else limit = (int32)sim_fread (mbuf, sz, blkcnt, rfile); if (limit <= 0) { /* invalid or err? */ r = SCPE_IOERR; goto Cleanup_Return; } for (j = 0; j < limit; j++, k = k + (dptr->aincr)) { if (blkcnt < 0) /* compressed? */ val = 0; else SZ_LOAD (sz, val, mbuf, j); /* saved value */ r = dptr->deposit (val, k, uptr, SIM_SW_REST); if (r != SCPE_OK) { goto Cleanup_Return; } } /* end for j */ } /* end for k */ } /* end if high */ } /* end unit loop */ for ( ;; ) { /* register loop */ READ_S (buf); /* read reg name */ if (buf[0] == 0) /* last? */ break; READ_I (depth); /* [V2.10+] depth */ sim_debug (SIM_DBG_RESTORE, &sim_scp_dev, "REGISTER=%s, depth=%u\n", buf, depth); if ((rptr = find_reg (buf, NULL, dptr)) == NULL) { sim_printf ("Invalid register name: %s %s\n", sim_dname (dptr), buf); for (us = 0; us < depth; us++) { /* skip values */ READ_I (val); } continue; } if (depth != rptr->depth) { /* [V2.10+] mismatch? */ sim_printf ("Register depth mismatch: %s %s, file = %d, sim = %d\n", sim_dname (dptr), buf, depth, rptr->depth); if (depth > rptr->depth) depth = rptr->depth; } mask = width_mask[rptr->width]; /* get mask */ for (us = 0; us < depth; us++) { /* loop thru values */ READ_I (val); /* read value */ if (val > mask) { /* value ok? */ sim_printf ("Invalid register value: %s %s\n", sim_dname (dptr), buf); } else { if (us < rptr->depth) /* in range? */ put_rval(rptr, us, val); } } } /* end register loop */ } /* end device loop */ /* Now that all of the register state has been imported, we can attach units which were originally attached. Some of these attach operations may depend on the state of the device (in registers) to work correctly */ for (j=0, r = SCPE_OK; j<attcnt; j++) { if ((r == SCPE_OK) && (!dont_detach_attach)) { struct stat fstat; t_addr saved_pos; sim_debug (SIM_DBG_RESTORE, &sim_scp_dev, "ATTACHING=%s to %s\n", sim_uname (attunits[j]), attnames[j]); dptr = find_dev_from_unit (attunits[j]); if ((!force_restore) && (!stat(attnames[j], &fstat))) if (fstat.st_mtime > rstat.st_mtime + 30) { r = SCPE_INCOMP; sim_printf ("Error Attaching %s to %s - the restore state is %d seconds older than the attach file\n", sim_dname (dptr), attnames[j], (int)(fstat.st_mtime - rstat.st_mtime)); sim_printf ("restore with the -F switch to override this sanity check\n"); |
︙ | ︙ | |||
7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 | } } } free (attnames[j]); attnames[j] = NULL; } Cleanup_Return: for (j=0; j < attcnt; j++) free (attnames[j]); free (attnames); free (attunits); free (attswitches); if (warned) sim_printf ("restore with the -Q switch to suppress warning messages\n"); | > | 8643 8644 8645 8646 8647 8648 8649 8650 8651 8652 8653 8654 8655 8656 8657 | } } } free (attnames[j]); attnames[j] = NULL; } Cleanup_Return: free (mbuf); for (j=0; j < attcnt; j++) free (attnames[j]); free (attnames); free (attunits); free (attswitches); if (warned) sim_printf ("restore with the -Q switch to suppress warning messages\n"); |
︙ | ︙ | |||
7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 | !(uptr->dynflags & UNIT_NO_FIO) && /* is FILE *, */ !(uptr->flags & UNIT_RO)) /* not read only? */ fflush (uptr->fileref); } } } } } t_stat flush_svc (UNIT *uptr) { | > | | 8683 8684 8685 8686 8687 8688 8689 8690 8691 8692 8693 8694 8695 8696 8697 8698 8699 8700 8701 8702 8703 | !(uptr->dynflags & UNIT_NO_FIO) && /* is FILE *, */ !(uptr->flags & UNIT_RO)) /* not read only? */ fflush (uptr->fileref); } } } } tmxr_flush_log_files (); } t_stat flush_svc (UNIT *uptr) { sim_activate_after (uptr, sim_flush_interval * 1000000); sim_flush_buffered_files (); return SCPE_OK; } /* Run, go, boot, cont, step, next commands |
︙ | ︙ | |||
7842 7843 7844 7845 7846 7847 7848 | t_stat run_cmd (int32 flag, CONST char *cptr) { char gbuf[CBUFSIZE] = ""; CONST char *tptr; uint32 i, j; int32 sim_next = 0; int32 unitno; | | > > > > > > > | | > | | < > > | | 8718 8719 8720 8721 8722 8723 8724 8725 8726 8727 8728 8729 8730 8731 8732 8733 8734 8735 8736 8737 8738 8739 8740 8741 8742 8743 8744 8745 8746 8747 8748 8749 8750 8751 8752 8753 8754 8755 8756 8757 8758 8759 8760 8761 8762 8763 8764 | t_stat run_cmd (int32 flag, CONST char *cptr) { char gbuf[CBUFSIZE] = ""; CONST char *tptr; uint32 i, j; int32 sim_next = 0; int32 unitno; t_value new_pcv, orig_pcv; t_stat r; DEVICE *dptr; UNIT *uptr; if (sim_runlimit_enabled && /* If the run limit has been hit? */ (!sim_is_active (&sim_runlimit_unit))) { sim_messagef (SCPE_RUNTIME, "Execution limit exceeded, can't proceed. Exiting...\n"); exit (SCPE_RUNTIME); /* Execution can't proceed */ } GET_SWITCHES (cptr); /* get switches */ sim_step = 0; if ((flag == RU_RUN) || (flag == RU_GO)) { /* run or go */ t_bool new_pc = FALSE; new_pcv = orig_pcv = get_rval (sim_PC, 0); /* get current PC value */ if (*cptr != 0) { /* argument? */ cptr = get_glyph (cptr, gbuf, 0); /* get next glyph */ if (MATCH_CMD (gbuf, "UNTIL") != 0) { if (sim_vm_parse_addr) /* address parser? */ new_pcv = sim_vm_parse_addr (sim_dflt_dev, gbuf, &tptr); else new_pcv = strtotv (gbuf, &tptr, sim_PC->radix);/* parse PC */ if ((tptr == gbuf) || (*tptr != 0) || /* error? */ (new_pcv > width_mask[sim_PC->width])) return SCPE_ARG; new_pc = TRUE; } } put_rval_pcchk (sim_PC, 0, new_pcv, new_pc); /* Save in PC in case reset references PC */ if ((flag == RU_RUN) && /* run? */ ((r = sim_run_boot_prep (flag)) != SCPE_OK)) { /* reset sim */ put_rval_pcchk (sim_PC, 0, orig_pcv, FALSE); /* restore original PC */ return r; } if ((*cptr) || (MATCH_CMD (gbuf, "UNTIL") == 0)) { /* should be end */ int32 saved_switches = sim_switches; if (MATCH_CMD (gbuf, "UNTIL") != 0) cptr = get_glyph (cptr, gbuf, 0); /* get next glyph */ |
︙ | ︙ | |||
7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 | sim_brk_types |= BRK_TYP_TEMP; r = ssh_break (NULL, cptr, SSH_ST); if (r != SCPE_OK) return sim_messagef (r, "Unable to establish breakpoint at: %s\n", cptr); } sim_switches = saved_switches; } } else if ((flag == RU_STEP) || ((flag == RU_NEXT) && !sim_vm_is_subroutine_call)) { /* step */ static t_bool not_implemented_message = FALSE; if ((!not_implemented_message) && (flag == RU_NEXT)) { | > | 8780 8781 8782 8783 8784 8785 8786 8787 8788 8789 8790 8791 8792 8793 8794 | sim_brk_types |= BRK_TYP_TEMP; r = ssh_break (NULL, cptr, SSH_ST); if (r != SCPE_OK) return sim_messagef (r, "Unable to establish breakpoint at: %s\n", cptr); } sim_switches = saved_switches; } put_rval_pcchk (sim_PC, 0, new_pcv, new_pc); /* Save in PC again in case reset changed it */ } else if ((flag == RU_STEP) || ((flag == RU_NEXT) && !sim_vm_is_subroutine_call)) { /* step */ static t_bool not_implemented_message = FALSE; if ((!not_implemented_message) && (flag == RU_NEXT)) { |
︙ | ︙ | |||
7977 7978 7979 7980 7981 7982 7983 | if (sim_switches & SIM_SW_HIDE) /* Setup only for Remote Console Mode */ return SCPE_OK; for (i = 1; (dptr = sim_devices[i]) != NULL; i++) { /* reposition all */ for (j = 0; j < dptr->numunits; j++) { /* seq devices */ uptr = dptr->units + j; if ((uptr->flags & (UNIT_ATT + UNIT_SEQ)) == (UNIT_ATT + UNIT_SEQ)) | > | | 8863 8864 8865 8866 8867 8868 8869 8870 8871 8872 8873 8874 8875 8876 8877 8878 | if (sim_switches & SIM_SW_HIDE) /* Setup only for Remote Console Mode */ return SCPE_OK; for (i = 1; (dptr = sim_devices[i]) != NULL; i++) { /* reposition all */ for (j = 0; j < dptr->numunits; j++) { /* seq devices */ uptr = dptr->units + j; if ((uptr->flags & (UNIT_ATT + UNIT_SEQ)) == (UNIT_ATT + UNIT_SEQ)) if (sim_can_seek (uptr->fileref) && (0 != sim_fseek (uptr->fileref, uptr->pos, SEEK_SET))) return sim_messagef (SCPE_IERR, "Can't seek to %u in %s for %s\n", (unsigned)uptr->pos, uptr->filename, sim_uname (uptr)); } } if ((r = sim_ttrun ()) != SCPE_OK) { /* set console mode */ r = sim_messagef (SCPE_TTYERR, "sim_ttrun() returned: %s - errno: %d - %s\n", sim_error_text (r), errno, strerror (errno)); sim_ttcmd (); return r; |
︙ | ︙ | |||
8003 8004 8005 8006 8007 8008 8009 | } #endif if (signal (SIGTERM, int_handler) == SIG_ERR) { /* set WRU */ r = sim_messagef (SCPE_SIGERR, "Can't establish SIGTERM: errno: %d - %s", errno, strerror (errno)); sim_ttcmd (); return r; } | | < < < | < | | 8890 8891 8892 8893 8894 8895 8896 8897 8898 8899 8900 8901 8902 8903 8904 8905 8906 | } #endif if (signal (SIGTERM, int_handler) == SIG_ERR) { /* set WRU */ r = sim_messagef (SCPE_SIGERR, "Can't establish SIGTERM: errno: %d - %s", errno, strerror (errno)); sim_ttcmd (); return r; } if (sim_step) /* set step timer */ sim_sched_step (); sim_activate_after (&sim_flush_unit, sim_flush_interval * 1000000);/* Enable periodic buffer flushing */ stop_cpu = FALSE; sim_is_running = TRUE; /* flag running */ fflush(stdout); /* flush stdout */ if (sim_log) /* flush log if enabled */ fflush (sim_log); sim_throt_sched (); /* set throttle */ sim_start_timer_services (); /* enable wall clock timing */ |
︙ | ︙ | |||
8058 8059 8060 8061 8062 8063 8064 | sim_brk_types |= BRK_TYP_DYN_STEPOVER; for (i=0; addrs[i]; i++) sim_brk_set (addrs[i], BRK_TYP_DYN_STEPOVER, 0, NULL); } else sim_step = 1; if (sim_step) /* set step timer */ | | > > > > > > > | | | | 8941 8942 8943 8944 8945 8946 8947 8948 8949 8950 8951 8952 8953 8954 8955 8956 8957 8958 8959 8960 8961 8962 8963 8964 8965 8966 8967 8968 8969 8970 8971 8972 8973 8974 8975 8976 8977 8978 8979 8980 8981 8982 8983 | sim_brk_types |= BRK_TYP_DYN_STEPOVER; for (i=0; addrs[i]; i++) sim_brk_set (addrs[i], BRK_TYP_DYN_STEPOVER, 0, NULL); } else sim_step = 1; if (sim_step) /* set step timer */ sim_sched_step (); } while (1); if ((SCPE_BARE_STATUS(r) == SCPE_STOP) && sigterm_received) r = SCPE_SIGTERM; if (sim_runlimit_enabled) { if (sim_runlimit_switches & SWMASK ('T')) sim_runlimit_d = sim_activate_time_usecs (&sim_runlimit_unit); else sim_runlimit = sim_activate_time (&sim_runlimit_unit) - 1; } if ((SCPE_BARE_STATUS(r) == SCPE_STOP) && /* WRU exit from sim_instr() */ (sim_on_actions[sim_do_depth][SCPE_STOP] == NULL) &&/* without a handler for a STOP condition */ (sim_on_actions[sim_do_depth][0] == NULL)) sim_os_ms_sleep (sim_stop_sleep_ms); /* wait a bit for SIGINT */ sim_is_running = FALSE; /* flag idle */ sim_stop_timer_services (); /* disable wall clock timing */ sim_ttcmd (); /* restore console */ sim_brk_clrall (BRK_TYP_DYN_STEPOVER); /* cancel any step/over subroutine breakpoints */ #ifdef SIGHUP signal (SIGHUP, sigterm_received ? SIG_IGN : SIG_DFL); /* cancel WRU */ #endif signal (SIGTERM, sigterm_received ? SIG_IGN : SIG_DFL); /* cancel WRU */ sim_flush_buffered_files(); sim_cancel (&sim_flush_unit); /* cancel flush timer */ sim_cancel_step (); /* cancel step timer */ sim_throt_cancel (); /* cancel throttle */ AIO_UPDATE_QUEUE; UPDATE_SIM_TIME; /* update sim time */ return r | ((sim_switches & SWMASK ('Q')) ? SCPE_NOMESSAGE : 0); } /* run command message handler */ |
︙ | ︙ | |||
8114 8115 8116 8117 8118 8119 8120 | /* Common setup for RUN or BOOT */ t_stat sim_run_boot_prep (int32 flag) { t_stat r; | | < < > | 9004 9005 9006 9007 9008 9009 9010 9011 9012 9013 9014 9015 9016 9017 9018 9019 9020 9021 | /* Common setup for RUN or BOOT */ t_stat sim_run_boot_prep (int32 flag) { t_stat r; /* reset queue */ while (sim_clock_queue != QUEUE_LIST_END) sim_cancel (sim_clock_queue); sim_time = sim_rtime = 0; noqueue_time = sim_interval = 0; r = reset_all (0); if ((r == SCPE_OK) && (flag == RU_RUN)) { if ((run_cmd_did_reset) && (0 == (sim_switches & SWMASK ('Q')))) { sim_printf ("Resetting all devices... This may not have been your intention.\n"); sim_printf ("The GO and CONTINUE commands do not reset devices.\n"); } |
︙ | ︙ | |||
8175 8176 8177 8178 8179 8180 8181 | sim_eval[i] = 0; for (i = 0, k = (t_addr) pcval; i < sim_emax; i++, k = k + dptr->aincr) { if ((r = dptr->examine (&sim_eval[i], k, dptr->units, SWMASK ('V')|SIM_SW_STOP)) != SCPE_OK) break; } if ((r == SCPE_OK) || (i > 0)) { fprintf (st, " ("); | | > > > > > > > > > > > > > > > > > > > | 9064 9065 9066 9067 9068 9069 9070 9071 9072 9073 9074 9075 9076 9077 9078 9079 9080 9081 9082 9083 9084 9085 9086 9087 9088 9089 9090 9091 9092 9093 9094 9095 9096 9097 9098 9099 9100 9101 9102 9103 9104 9105 9106 9107 9108 9109 9110 9111 9112 9113 9114 9115 9116 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129 9130 9131 9132 9133 9134 9135 9136 9137 9138 9139 | sim_eval[i] = 0; for (i = 0, k = (t_addr) pcval; i < sim_emax; i++, k = k + dptr->aincr) { if ((r = dptr->examine (&sim_eval[i], k, dptr->units, SWMASK ('V')|SIM_SW_STOP)) != SCPE_OK) break; } if ((r == SCPE_OK) || (i > 0)) { fprintf (st, " ("); if (fprint_sym (st, (t_addr) pcval, sim_eval, NULL, SWMASK ('M') | SIM_SW_STOP) > 0) fprint_val (st, sim_eval[0], dptr->dradix, dptr->dwidth, PV_RZRO); fprintf (st, ")"); } } fprintf (st, "\n"); } void fprint_stopped (FILE *st, t_stat v) { fprint_stopped_gen (st, v, sim_PC, sim_dflt_dev); } /* Unit service for step timeout, originally scheduled by STEP n command Return step timeout SCP code, will cause simulation to stop */ t_stat step_svc (UNIT *uptr) { return SCPE_STEP; } /* Unit service for run for timeout, originally scheduled by RUNFOR n command Return runlimit timeout SCP code, will cause simulation to stop */ t_stat runlimit_svc (UNIT *uptr) { return SCPE_RUNTIME; } /* Unit service to facilitate expect matching to stop simulation. Return expect SCP code, will cause simulation to stop */ t_stat expect_svc (UNIT *uptr) { return SCPE_EXPECT | (sim_do_echo ? 0 : SCPE_NOMESSAGE); } /* Cancel scheduled step service */ t_stat sim_cancel_step (void) { return sim_cancel (&sim_step_unit); } /* schedule step service */ t_stat sim_sched_step (void) { if (sim_switches & SWMASK ('T')) /* stepping for elapsed time? */ return sim_activate_after_abs (&sim_step_unit, (uint32)sim_step);/* wall clock based step */ else return sim_activate_abs (&sim_step_unit, sim_step); /* instruction based step */ } /* Signal handler for ^C signal - set stop simulation flag */ void int_handler (int sig) { stop_cpu = TRUE; if (sig == SIGTERM) sigterm_received = TRUE; sim_interval = 0; /* Minimize when stop_cpu gets noticed */ } /* Examine/deposit commands ex[amine] [modifiers] list examine de[posit] [modifiers] list val deposit ie[xamine] [modifiers] list interactive examine |
︙ | ︙ | |||
8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 8280 8281 | return reason; if (*cptr == 0) /* must be more */ return SCPE_2FARG; if (sim_dfunit == NULL) /* got a unit? */ return SCPE_NXUN; cptr = get_glyph (cptr, gbuf, 0); /* get list */ if ((flag == EX_D) && (*cptr == 0)) /* deposit needs more */ return SCPE_2FARG; ofile = sim_ofile? sim_ofile: stdout; /* no ofile? use stdout */ for (gptr = gbuf, reason = SCPE_OK; (*gptr != 0) && (reason == SCPE_OK); gptr = tptr) { tdptr = sim_dfdev; /* working dptr */ if (strncmp (gptr, "STATE", strlen ("STATE")) == 0) { | > | 9176 9177 9178 9179 9180 9181 9182 9183 9184 9185 9186 9187 9188 9189 9190 | return reason; if (*cptr == 0) /* must be more */ return SCPE_2FARG; if (sim_dfunit == NULL) /* got a unit? */ return SCPE_NXUN; cptr = get_glyph (cptr, gbuf, 0); /* get list */ if ((flag == EX_D) && (*cptr == 0)) /* deposit needs more */ return SCPE_2FARG; ofile = sim_ofile? sim_ofile: stdout; /* no ofile? use stdout */ for (gptr = gbuf, reason = SCPE_OK; (*gptr != 0) && (reason == SCPE_OK); gptr = tptr) { tdptr = sim_dfdev; /* working dptr */ if (strncmp (gptr, "STATE", strlen ("STATE")) == 0) { |
︙ | ︙ | |||
8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 | continue; } if ((ap = getenv (gptr))) { strlcpy (gbuf, ap, sizeof (gbuf)); gptr = gbuf; } tptr = get_range (sim_dfdev, gptr, &low, &high, sim_dfdev->aradix, (((sim_dfunit->capac == 0) || (flag == EX_E))? 0: sim_dfunit->capac - sim_dfdev->aincr), 0); if (tptr == NULL) return (tstat ? tstat : SCPE_ARG); if (*tptr && (*tptr++ != ',')) return SCPE_ARG; | > > > | 9233 9234 9235 9236 9237 9238 9239 9240 9241 9242 9243 9244 9245 9246 9247 9248 9249 | continue; } if ((ap = getenv (gptr))) { strlcpy (gbuf, ap, sizeof (gbuf)); gptr = gbuf; } /* Special handling of EXAMINE to cover the case of ALL (detected in get_range) so that all of memory isn't output at once without any ability to interrupt that output */ tptr = get_range (sim_dfdev, gptr, &low, &high, sim_dfdev->aradix, (((sim_dfunit->capac == 0) || (flag == EX_E))? 0: sim_dfunit->capac - sim_dfdev->aincr), 0); if (tptr == NULL) return (tstat ? tstat : SCPE_ARG); if (*tptr && (*tptr++ != ',')) return SCPE_ARG; |
︙ | ︙ | |||
8630 8631 8632 8633 8634 8635 8636 | idx = index val = new value mask = mask Outputs: none */ | | > > > > > | | 9542 9543 9544 9545 9546 9547 9548 9549 9550 9551 9552 9553 9554 9555 9556 9557 9558 9559 9560 9561 9562 9563 9564 9565 9566 9567 9568 9569 9570 9571 9572 | idx = index val = new value mask = mask Outputs: none */ void put_rval_pcchk (REG *rptr, uint32 idx, t_value val, t_bool pc_chk) { size_t sz; t_value mask; uint32 *ptr; t_value prev_val; if ((!(sim_switches & SWMASK ('Z'))) && (rptr->flags & REG_DEPOSIT) && sim_vm_reg_update) prev_val = get_rval (rptr, idx); #define PUT_RVAL(sz,rp,id,v,m) \ *(((sz *) rp->loc) + id) = \ (sz)((*(((sz *) rp->loc) + id) & \ ~((m) << (rp)->offset)) | ((v) << (rp)->offset)) if (pc_chk && (rptr == sim_PC)) sim_brk_npc (0); sz = SZ_R (rptr); mask = width_mask[rptr->width]; if ((rptr->depth > 1) && (rptr->flags & REG_CIRC)) { idx = idx + rptr->qptr; if (idx >= rptr->depth) idx = idx - rptr->depth; |
︙ | ︙ | |||
8666 8667 8668 8669 8670 8671 8672 | #else *ptr = (*ptr & ~(((uint32) mask) << rptr->offset)) | (((uint32) val) << rptr->offset); #endif } else if ((rptr->depth > 1) && (rptr->flags & REG_STRUCT)) { | | | 9583 9584 9585 9586 9587 9588 9589 9590 9591 9592 9593 9594 9595 9596 9597 | #else *ptr = (*ptr & ~(((uint32) mask) << rptr->offset)) | (((uint32) val) << rptr->offset); #endif } else if ((rptr->depth > 1) && (rptr->flags & REG_STRUCT)) { ptr = (uint32 *)(((size_t)rptr->loc) + (idx * rptr->str_size)); #if defined (USE_INT64) if (sz <= sizeof (uint32)) *((uint32 *) ptr) = (*((uint32 *) ptr) & ~(((uint32) mask) << rptr->offset)) | (((uint32) val) << rptr->offset); else *((t_uint64 *) ptr) = (*((t_uint64 *) ptr) & ~(mask << rptr->offset)) | (val << rptr->offset); |
︙ | ︙ | |||
8693 8694 8695 8696 8697 8698 8699 8700 8701 8702 8703 8704 8705 8706 8707 | #if defined (USE_INT64) else if (sz <= sizeof (uint32)) PUT_RVAL (uint32, rptr, idx, (int32) val, (uint32) mask); else PUT_RVAL (t_uint64, rptr, idx, val, mask); #else else PUT_RVAL (uint32, rptr, idx, val, mask); #endif } /* Examine address routine Inputs: (sim_eval is an implicit argument) ofile = output stream flag = type of ex/mod command (ex, iex, idep) addr = address to examine | > > > > > > > > > | 9610 9611 9612 9613 9614 9615 9616 9617 9618 9619 9620 9621 9622 9623 9624 9625 9626 9627 9628 9629 9630 9631 9632 9633 | #if defined (USE_INT64) else if (sz <= sizeof (uint32)) PUT_RVAL (uint32, rptr, idx, (int32) val, (uint32) mask); else PUT_RVAL (t_uint64, rptr, idx, val, mask); #else else PUT_RVAL (uint32, rptr, idx, val, mask); #endif if ((!(sim_switches & SWMASK ('Z'))) && (rptr->flags & REG_DEPOSIT) && sim_vm_reg_update) sim_vm_reg_update (rptr, idx, prev_val, val); } void put_rval (REG *rptr, uint32 idx, t_value val) { put_rval_pcchk (rptr, idx, val, TRUE); } /* Examine address routine Inputs: (sim_eval is an implicit argument) ofile = output stream flag = type of ex/mod command (ex, iex, idep) addr = address to examine |
︙ | ︙ | |||
8839 8840 8841 8842 8843 8844 8845 | fprintf (sim_log, "%s\n", cptr? cptr: ""); if (cptr == NULL) /* force exit */ return 1; if (*cptr == 0) /* success */ return dfltinc; } if (uptr->flags & UNIT_RO) /* read only? */ | | > > > | 9765 9766 9767 9768 9769 9770 9771 9772 9773 9774 9775 9776 9777 9778 9779 9780 9781 9782 | fprintf (sim_log, "%s\n", cptr? cptr: ""); if (cptr == NULL) /* force exit */ return 1; if (*cptr == 0) /* success */ return dfltinc; } if (uptr->flags & UNIT_RO) /* read only? */ return sim_messagef (SCPE_RO, "%s is read only.\n" "%sse a writable device to change %s\n", sim_uname (uptr), (uptr->flags & UNIT_ROABLE) ? "Attach Read/Write or u" : "U", uptr->filename ? uptr->filename : "it"); mask = width_mask[dptr->dwidth]; GET_RADIX (rdx, dptr->dradix); if ((reason = parse_sym ((CONST char *)cptr, addr, uptr, sim_eval, sim_switches)) > 0) { sim_eval[0] = get_uint (cptr, rdx, mask, &reason); if (reason != SCPE_OK) return reason; |
︙ | ︙ | |||
8912 8913 8914 8915 8916 8917 8918 | return sim_messagef (r, "%s\nCan't be parsed as an instruction or data\n", cptr); } lim = 1 - r; for (i = a = 0; a < lim; ) { sim_printf ("%d:\t", a); if ((r = fprint_sym (stdout, a, &sim_eval[i], dptr->units, sim_switches)) > 0) r = fprint_val (stdout, sim_eval[i], rdx, dptr->dwidth, PV_RZRO); | | | 9841 9842 9843 9844 9845 9846 9847 9848 9849 9850 9851 9852 9853 9854 9855 | return sim_messagef (r, "%s\nCan't be parsed as an instruction or data\n", cptr); } lim = 1 - r; for (i = a = 0; a < lim; ) { sim_printf ("%d:\t", a); if ((r = fprint_sym (stdout, a, &sim_eval[i], dptr->units, sim_switches)) > 0) r = fprint_val (stdout, sim_eval[i], rdx, dptr->dwidth, PV_RZRO); if (sim_log && (!sim_oline)) { if ((r = fprint_sym (sim_log, a, &sim_eval[i], dptr->units, sim_switches)) > 0) r = fprint_val (sim_log, sim_eval[i], rdx, dptr->dwidth, PV_RZRO); } sim_printf ("\n"); if (r < 0) a = a + 1 - r; else a = a + dptr->aincr; |
︙ | ︙ | |||
8997 8998 8999 9000 9001 9002 9003 9004 9005 9006 9007 9008 | else { strlcpy (cptr, tmpc, size); /* copy result */ free (tmpc) ; /* free temp */ } } else { printf ("%s", prompt); /* display prompt */ cptr = fgets (cptr, size, stream); /* get cmd line */ } } else cptr = fgets (cptr, size, stream); /* get cmd line */ #else | > | > > | 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 | else { strlcpy (cptr, tmpc, size); /* copy result */ free (tmpc) ; /* free temp */ } } else { printf ("%s", prompt); /* display prompt */ fflush (stdout); cptr = fgets (cptr, size, stream); /* get cmd line */ } } else cptr = fgets (cptr, size, stream); /* get cmd line */ #else if (prompt) { /* interactive? */ printf ("%s", prompt); /* display prompt */ fflush (stdout); } cptr = fgets (cptr, size, stream); /* get cmd line */ #endif if (cptr == NULL) { clearerr (stream); /* clear error */ return NULL; /* ignore EOF */ } |
︙ | ︙ | |||
9090 9091 9092 9093 9094 9095 9096 | } } if (sim_islower (*iptr) && uc) *optr = (char)sim_toupper (*iptr); else *optr = *iptr; iptr++; optr++; } | < | > | | 10022 10023 10024 10025 10026 10027 10028 10029 10030 10031 10032 10033 10034 10035 10036 10037 10038 10039 | } } if (sim_islower (*iptr) && uc) *optr = (char)sim_toupper (*iptr); else *optr = *iptr; iptr++; optr++; } if (mchar && (*iptr == mchar)) /* skip input terminator */ iptr++; *optr = 0; /* terminate result string */ while (sim_isspace (*iptr)) /* absorb additional input spaces */ iptr++; return iptr; } CONST char *get_glyph (const char *iptr, char *optr, char mchar) { return (CONST char *)get_glyph_gen (iptr, optr, mchar, TRUE, FALSE, 0); |
︙ | ︙ | |||
9123 9124 9125 9126 9127 9128 9129 | if ((iptr[0] == '!') && (!sim_isspace(iptr[1]))) { strcpy (optr, "!"); /* return ! as command glyph */ return (CONST char *)(iptr + 1); /* and skip over the leading ! */ } return (CONST char *)get_glyph_gen (iptr, optr, 0, TRUE, FALSE, 0); } | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 10055 10056 10057 10058 10059 10060 10061 10062 10063 10064 10065 10066 10067 10068 | if ((iptr[0] == '!') && (!sim_isspace(iptr[1]))) { strcpy (optr, "!"); /* return ! as command glyph */ return (CONST char *)(iptr + 1); /* and skip over the leading ! */ } return (CONST char *)get_glyph_gen (iptr, optr, 0, TRUE, FALSE, 0); } /* get_yn yes/no question Inputs: ques = pointer to question deflt = default answer Outputs: result = true if yes, false if no |
︙ | ︙ | |||
9352 9353 9354 9355 9356 9357 9358 | *status = SCPE_OK; val = strtotv ((CONST char *)cptr, &tptr, radix); if ((cptr == tptr) || (val > max)) *status = SCPE_ARG; else { while (sim_isspace (*tptr)) tptr++; | > > > > > > > > > > | | 10105 10106 10107 10108 10109 10110 10111 10112 10113 10114 10115 10116 10117 10118 10119 10120 10121 10122 10123 10124 10125 10126 10127 10128 10129 | *status = SCPE_OK; val = strtotv ((CONST char *)cptr, &tptr, radix); if ((cptr == tptr) || (val > max)) *status = SCPE_ARG; else { while (sim_isspace (*tptr)) tptr++; if (sim_toupper (*tptr) == 'K') { val *= 1000; ++tptr; } else { if (sim_toupper (*tptr) == 'M') { val *= 1000000; ++tptr; } } if ((*tptr != 0) || (val > max)) *status = SCPE_ARG; } return val; } /* get_range range specification |
︙ | ︙ | |||
10195 10196 10197 10198 10199 10200 10201 | schptr if valid search specification */ SCHTAB *get_asearch (CONST char *cptr, int32 radix, SCHTAB *schptr) { int32 c, logop, cmpop; t_value *logval, *cmpval; | | | 10958 10959 10960 10961 10962 10963 10964 10965 10966 10967 10968 10969 10970 10971 10972 | schptr if valid search specification */ SCHTAB *get_asearch (CONST char *cptr, int32 radix, SCHTAB *schptr) { int32 c, logop, cmpop; t_value *logval, *cmpval; t_stat reason = SCPE_OK; CONST char *ocptr = cptr; const char *sptr; char gbuf[CBUFSIZE]; const char logstr[] = "|&^", cmpstr[] = "=!><"; if (*cptr == 0) /* check for clause */ return NULL; |
︙ | ︙ | |||
10318 10319 10320 10321 10322 10323 10324 | case SCH_E: case SCH_EE: if (val[i] != schptr->comp[i]) ret = 0; break; case SCH_N: case SCH_NE: | | | 11081 11082 11083 11084 11085 11086 11087 11088 11089 11090 11091 11092 11093 11094 11095 | case SCH_E: case SCH_EE: if (val[i] != schptr->comp[i]) ret = 0; break; case SCH_N: case SCH_NE: if (val[i] == schptr->comp[i]) ret = 0; break; case SCH_G: if (val[i] <= schptr->comp[i]) ret = 0; break; |
︙ | ︙ | |||
10744 10745 10746 10747 10748 10749 10750 10751 10752 10753 10754 10755 10756 10757 | or 0 (SCPE_OK) if no exceptions */ t_stat sim_process_event (void) { UNIT *uptr; t_stat reason, bare_reason; if (stop_cpu) { /* stop CPU? */ stop_cpu = 0; return SCPE_STOP; } AIO_UPDATE_QUEUE; UPDATE_SIM_TIME; /* update sim time */ | > > > > | > > > > > > > > > > > > > > > > > > > | > > | > > > > > > > > | | | | | | | > | | 11507 11508 11509 11510 11511 11512 11513 11514 11515 11516 11517 11518 11519 11520 11521 11522 11523 11524 11525 11526 11527 11528 11529 11530 11531 11532 11533 11534 11535 11536 11537 11538 11539 11540 11541 11542 11543 11544 11545 11546 11547 11548 11549 11550 11551 11552 11553 11554 11555 11556 11557 11558 11559 11560 11561 11562 11563 11564 11565 11566 11567 11568 11569 11570 11571 11572 11573 11574 11575 11576 11577 11578 11579 11580 11581 11582 11583 11584 11585 11586 11587 11588 11589 11590 11591 11592 11593 11594 11595 11596 11597 11598 11599 11600 11601 11602 | or 0 (SCPE_OK) if no exceptions */ t_stat sim_process_event (void) { UNIT *uptr; t_stat reason, bare_reason; int32 sim_interval_catchup; if (stop_cpu) { /* stop CPU? */ stop_cpu = 0; return SCPE_STOP; } AIO_UPDATE_QUEUE; UPDATE_SIM_TIME; /* update sim time */ if (sim_interval > 0) { sim_debug (SIM_DBG_EVENT, &sim_scp_dev, "Interval not yet expired: %d\n", sim_interval); return SCPE_OK; } if (sim_clock_queue == QUEUE_LIST_END) { /* queue empty? */ sim_interval = noqueue_time = NOQUEUE_WAIT; /* flag queue empty */ sim_debug (SIM_DBG_EVENT, &sim_scp_dev, "Queue Empty New Interval = %d\n", sim_interval); return SCPE_OK; } sim_processing_event = TRUE; /* If sim_interval is negative, we've missed the opportunity to */ /* dispatch one or more events when they were scheduled to fire. */ /* To accomodate this, we backup time to when the first event */ /* was supposed to fire and advance it from there until things */ /* have caught up. */ if (sim_interval < 0) { sim_interval_catchup = sim_interval; sim_interval = 0; UPDATE_SIM_TIME; /* update sim time */ sim_debug (SIM_DBG_EVENT_NEG, &sim_scp_dev, "Processing event for %s with sim_interval = %d, event time = %.0f\n", sim_uname (sim_clock_queue), sim_interval_catchup, sim_gtime ()); if (sim_clock_queue->next != QUEUE_LIST_END) sim_debug (SIM_DBG_EVENT_NEG, &sim_scp_dev, "- Next event for %s after = %d\n", sim_uname (sim_clock_queue->next), sim_clock_queue->next->time); sim_time -= sim_clock_queue->time; sim_rtime -= sim_clock_queue->time; } else sim_interval_catchup = 0; do { uptr = sim_clock_queue; /* get first */ sim_clock_queue = uptr->next; /* remove first */ uptr->next = NULL; /* hygiene */ uptr->time = 0; if (sim_clock_queue != QUEUE_LIST_END) { if (sim_interval_catchup < 0) sim_interval = -sim_interval_catchup; sim_interval += sim_interval_catchup + sim_clock_queue->time; } else sim_interval = noqueue_time = NOQUEUE_WAIT; AIO_EVENT_BEGIN(uptr); if (uptr->usecs_remaining) { sim_debug (SIM_DBG_EVENT, &sim_scp_dev, "Requeueing %s after %.0f usecs\n", sim_uname (uptr), uptr->usecs_remaining); reason = sim_timer_activate_after (uptr, uptr->usecs_remaining); } else { sim_debug (SIM_DBG_EVENT, &sim_scp_dev, "Processing Event for %s\n", sim_uname (uptr)); if (uptr->action != NULL) reason = uptr->action (uptr); else reason = SCPE_OK; } AIO_EVENT_COMPLETE(uptr, reason); if (sim_interval_catchup < -1) { sim_interval_catchup += sim_clock_queue->time; sim_time += sim_clock_queue->time; sim_rtime += sim_clock_queue->time; } else sim_interval_catchup = 0; bare_reason = SCPE_BARE_STATUS (reason); if ((bare_reason != SCPE_OK) && /* Provide context for unexpected errors */ (bare_reason >= SCPE_BASE) && (bare_reason != SCPE_EXPECT) && (bare_reason != SCPE_REMOTE) && (bare_reason != SCPE_MTRLNT) && (bare_reason != SCPE_STOP) && (bare_reason != SCPE_STEP) && (bare_reason != SCPE_RUNTIME) && (bare_reason != SCPE_EXIT)) sim_messagef (reason, "\nUnexpected internal error while processing event for %s which returned %d - %s\n", sim_uname (uptr), reason, sim_error_text (reason)); } while ((reason == SCPE_OK) && ((sim_interval + sim_interval_catchup) <= 0) && (sim_clock_queue != QUEUE_LIST_END) && (!stop_cpu)); if (sim_clock_queue == QUEUE_LIST_END) { /* queue empty? */ sim_interval = noqueue_time = NOQUEUE_WAIT; /* flag queue empty */ sim_debug (SIM_DBG_EVENT, &sim_scp_dev, "Processing Queue Complete New Interval = %d\n", sim_interval); } |
︙ | ︙ | |||
10967 10968 10969 10970 10971 10972 10973 | return SCPE_OK; if (uptr->dynflags & UNIT_TMR_UNIT) sim_timer_cancel (uptr); AIO_CANCEL(uptr); AIO_UPDATE_QUEUE; if (sim_clock_queue == QUEUE_LIST_END) return SCPE_OK; | < > | 11764 11765 11766 11767 11768 11769 11770 11771 11772 11773 11774 11775 11776 11777 11778 11779 11780 | return SCPE_OK; if (uptr->dynflags & UNIT_TMR_UNIT) sim_timer_cancel (uptr); AIO_CANCEL(uptr); AIO_UPDATE_QUEUE; if (sim_clock_queue == QUEUE_LIST_END) return SCPE_OK; if (!sim_is_active (uptr)) return SCPE_OK; UPDATE_SIM_TIME; /* update sim time */ sim_debug (SIM_DBG_EVENT, &sim_scp_dev, "Canceling Event for %s\n", sim_uname(uptr)); nptr = QUEUE_LIST_END; if (sim_clock_queue == uptr) { nptr = sim_clock_queue = uptr->next; uptr->next = NULL; /* hygiene */ } |
︙ | ︙ | |||
10993 10994 10995 10996 10997 10998 10999 | if (nptr != QUEUE_LIST_END) nptr->time += (uptr->next) ? 0 : uptr->time; if (!uptr->next) uptr->time = 0; uptr->usecs_remaining = 0; if (sim_clock_queue != QUEUE_LIST_END) sim_interval = sim_clock_queue->time; | > | | 11790 11791 11792 11793 11794 11795 11796 11797 11798 11799 11800 11801 11802 11803 11804 11805 | if (nptr != QUEUE_LIST_END) nptr->time += (uptr->next) ? 0 : uptr->time; if (!uptr->next) uptr->time = 0; uptr->usecs_remaining = 0; if (sim_clock_queue != QUEUE_LIST_END) sim_interval = sim_clock_queue->time; else sim_interval = noqueue_time = NOQUEUE_WAIT; if (uptr->next) { sim_printf ("Cancel failed for %s\n", sim_uname(uptr)); if (sim_deb) fclose(sim_deb); abort (); } return SCPE_OK; |
︙ | ︙ | |||
11026 11027 11028 11029 11030 11031 11032 | Inputs: uptr = pointer to unit Outputs: result = absolute activation time + 1, 0 if inactive */ | | | > > > > > > > > > | 11824 11825 11826 11827 11828 11829 11830 11831 11832 11833 11834 11835 11836 11837 11838 11839 11840 11841 11842 11843 11844 11845 11846 11847 11848 11849 11850 11851 11852 11853 11854 11855 11856 11857 11858 11859 11860 11861 11862 11863 11864 | Inputs: uptr = pointer to unit Outputs: result = absolute activation time + 1, 0 if inactive */ int32 _sim_activate_queue_time (UNIT *uptr) { UNIT *cptr; int32 accum; accum = 0; for (cptr = sim_clock_queue; cptr != QUEUE_LIST_END; cptr = cptr->next) { if (cptr == sim_clock_queue) { if (sim_interval > 0) accum = accum + sim_interval; } else accum = accum + cptr->time; if (cptr == uptr) return accum + 1; } return 0; } int32 _sim_activate_time (UNIT *uptr) { int32 accum = _sim_activate_queue_time (uptr); if (accum) return accum + (int32)((uptr->usecs_remaining * sim_timer_inst_per_sec ()) / 1000000.0); return 0; } int32 sim_activate_time (UNIT *uptr) { int32 accum; AIO_VALIDATE(uptr); accum = _sim_timer_activate_time (uptr); |
︙ | ︙ | |||
11496 11497 11498 11499 11500 11501 11502 | BRKTAB *bp; uint32 spc = (btyp >> SIM_BKPT_V_SPC) & (SIM_BKPT_N_SPC - 1); if (sim_brk_summ & BRK_TYP_DYN_ALL) btyp |= BRK_TYP_DYN_ALL; if ((bp = sim_brk_fnd_ex (loc, btyp, TRUE, spc))) { /* in table, and type match? */ | > > | | | | 12303 12304 12305 12306 12307 12308 12309 12310 12311 12312 12313 12314 12315 12316 12317 12318 12319 12320 12321 12322 12323 12324 12325 12326 | BRKTAB *bp; uint32 spc = (btyp >> SIM_BKPT_V_SPC) & (SIM_BKPT_N_SPC - 1); if (sim_brk_summ & BRK_TYP_DYN_ALL) btyp |= BRK_TYP_DYN_ALL; if ((bp = sim_brk_fnd_ex (loc, btyp, TRUE, spc))) { /* in table, and type match? */ double s_gtime = sim_gtime (); /* get time now */ if (bp->time_fired[spc] == s_gtime) /* already taken? */ return 0; bp->time_fired[spc] = s_gtime; /* remember match time */ if (--bp->cnt > 0) /* count > 0? */ return 0; bp->cnt = 0; /* reset count */ sim_brk_setact (bp->act); /* set up actions */ sim_brk_match_type = btyp & bp->typ; /* set return value */ if (bp->typ & BRK_TYP_TEMP) sim_brk_clr (loc, bp->typ); /* delete one-shot breakpoint */ sim_brk_match_addr = loc; return sim_brk_match_type; } return 0; } |
︙ | ︙ | |||
11732 11733 11734 11735 11736 11737 11738 | cnt -= 1; cptr = c1ptr + 1; while (sim_isspace(*cptr)) ++cptr; } tptr = get_glyph (cptr, gbuf, ','); if ((!strncmp(gbuf, "HALTAFTER=", 10)) && (gbuf[10])) { | | | | 12541 12542 12543 12544 12545 12546 12547 12548 12549 12550 12551 12552 12553 12554 12555 12556 12557 | cnt -= 1; cptr = c1ptr + 1; while (sim_isspace(*cptr)) ++cptr; } tptr = get_glyph (cptr, gbuf, ','); if ((!strncmp(gbuf, "HALTAFTER=", 10)) && (gbuf[10])) { after = (uint32)get_uint (&gbuf[10], 10, 2000000000, &r); if (r != SCPE_OK) return sim_messagef (SCPE_ARG, "Invalid Halt After Value: %s\n", &gbuf[10]); cptr = tptr; after_set = TRUE; } if ((*cptr != '\0') && (*cptr != '"') && (*cptr != '\'')) return sim_messagef (SCPE_ARG, "String must be quote delimited\n"); cptr = get_glyph_quoted (cptr, gbuf, 0); |
︙ | ︙ | |||
11794 11795 11796 11797 11798 11799 11800 | if (!ep) /* not there? ok */ return SCPE_OK; free (ep->match); /* deallocate match string */ free (ep->match_pattern); /* deallocate the display format match string */ free (ep->act); /* deallocate action */ #if defined(USE_REGEX) if (ep->switches & EXP_TYP_REGEX) | | | 12603 12604 12605 12606 12607 12608 12609 12610 12611 12612 12613 12614 12615 12616 12617 | if (!ep) /* not there? ok */ return SCPE_OK; free (ep->match); /* deallocate match string */ free (ep->match_pattern); /* deallocate the display format match string */ free (ep->act); /* deallocate action */ #if defined(USE_REGEX) if (ep->switches & EXP_TYP_REGEX) pcre_free (ep->regex); /* release compiled regex */ #endif exp->size -= 1; /* decrement count */ for (i=ep-exp->rules; i<exp->size; i++) /* shuffle up remaining rules */ exp->rules[i] = exp->rules[i+1]; if (exp->size == 0) { /* No rules left? */ free (exp->rules); exp->rules = NULL; |
︙ | ︙ | |||
11829 11830 11831 11832 11833 11834 11835 | for (i=0; i<exp->size; i++) { free (exp->rules[i].match); /* deallocate match string */ free (exp->rules[i].match_pattern); /* deallocate display format match string */ free (exp->rules[i].act); /* deallocate action */ #if defined(USE_REGEX) if (exp->rules[i].switches & EXP_TYP_REGEX) | | | 12638 12639 12640 12641 12642 12643 12644 12645 12646 12647 12648 12649 12650 12651 12652 | for (i=0; i<exp->size; i++) { free (exp->rules[i].match); /* deallocate match string */ free (exp->rules[i].match_pattern); /* deallocate display format match string */ free (exp->rules[i].act); /* deallocate action */ #if defined(USE_REGEX) if (exp->rules[i].switches & EXP_TYP_REGEX) pcre_free (exp->rules[i].regex); /* release compiled regex */ #endif } free (exp->rules); exp->rules = NULL; exp->size = 0; free (exp->buf); exp->buf = NULL; |
︙ | ︙ | |||
11861 11862 11863 11864 11865 11866 11867 | return SCPE_MEM; if (switches & EXP_TYP_REGEX) { #if !defined (USE_REGEX) free (match_buf); return sim_messagef (SCPE_ARG, "RegEx support not available\n"); } #else /* USE_REGEX */ | | | > < | | < < < < | < > | | | 12670 12671 12672 12673 12674 12675 12676 12677 12678 12679 12680 12681 12682 12683 12684 12685 12686 12687 12688 12689 12690 12691 12692 12693 12694 12695 12696 12697 12698 | return SCPE_MEM; if (switches & EXP_TYP_REGEX) { #if !defined (USE_REGEX) free (match_buf); return sim_messagef (SCPE_ARG, "RegEx support not available\n"); } #else /* USE_REGEX */ pcre *re; const char *errmsg; int erroffset, re_nsub; memcpy (match_buf, match+1, strlen(match)-2); /* extract string without surrounding quotes */ match_buf[strlen(match)-2] = '\0'; re = pcre_compile ((char *)match_buf, (switches & EXP_TYP_REGEX_I) ? PCRE_CASELESS : 0, &errmsg, &erroffset, NULL); if (re == NULL) { sim_messagef (SCPE_ARG, "Regular Expression Error: %s\n", errmsg); free (match_buf); return SCPE_ARG|SCPE_NOMESSAGE; } (void)pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, &re_nsub); sim_debug (exp->dbit, exp->dptr, "Expect Regular Expression: \"%s\" has %d sub expressions\n", match_buf, re_nsub); pcre_free (re); } #endif else { if (switches & EXP_TYP_REGEX_I) { free (match_buf); return sim_messagef (SCPE_ARG, "Case independed matching is only valid for RegEx expect rules\n"); } |
︙ | ︙ | |||
11919 11920 11921 11922 11923 11924 11925 11926 11927 | if ((match_buf == NULL) || (ep->match_pattern == NULL)) { sim_exp_clr_tab (exp, ep); /* clear it */ free (match_buf); return SCPE_MEM; } if (switches & EXP_TYP_REGEX) { #if defined(USE_REGEX) memcpy (match_buf, match+1, strlen(match)-2); /* extract string without surrounding quotes */ match_buf[strlen(match)-2] = '\0'; | > > > | > | 12724 12725 12726 12727 12728 12729 12730 12731 12732 12733 12734 12735 12736 12737 12738 12739 12740 12741 12742 12743 12744 | if ((match_buf == NULL) || (ep->match_pattern == NULL)) { sim_exp_clr_tab (exp, ep); /* clear it */ free (match_buf); return SCPE_MEM; } if (switches & EXP_TYP_REGEX) { #if defined(USE_REGEX) const char *errmsg; int erroffset; memcpy (match_buf, match+1, strlen(match)-2); /* extract string without surrounding quotes */ match_buf[strlen(match)-2] = '\0'; ep->regex = pcre_compile ((char *)match_buf, (switches & EXP_TYP_REGEX_I) ? PCRE_CASELESS : 0, &errmsg, &erroffset, NULL); (void)pcre_fullinfo(ep->regex, NULL, PCRE_INFO_CAPTURECOUNT, &ep->re_nsub); #endif free (match_buf); match_buf = NULL; } else { sim_data_trace(exp->dptr, exp->dptr->units, (const uint8 *)match, "", strlen(match)+1, "Expect Match String", exp->dbit); /* quoted string was validated above, this decode operation will always succeed */ |
︙ | ︙ | |||
12005 12006 12007 12008 12009 12010 12011 | if (exp->buf_size) { char *bstr = sim_encode_quoted_string (exp->buf, exp->buf_ins); fprintf (st, " Match Buffer Size: %d\n", exp->buf_size); fprintf (st, " Buffer Insert Offset: %d\n", exp->buf_ins); fprintf (st, " Buffer Contents: %s\n", bstr); if (default_haltafter) | | | 12814 12815 12816 12817 12818 12819 12820 12821 12822 12823 12824 12825 12826 12827 12828 | if (exp->buf_size) { char *bstr = sim_encode_quoted_string (exp->buf, exp->buf_ins); fprintf (st, " Match Buffer Size: %d\n", exp->buf_size); fprintf (st, " Buffer Insert Offset: %d\n", exp->buf_ins); fprintf (st, " Buffer Contents: %s\n", bstr); if (default_haltafter) fprintf (st, " Default HaltAfter: %u %s\n", (unsigned)default_haltafter, sim_vm_interval_units); free (bstr); } if (exp->dptr && (exp->dbit & exp->dptr->dctrl)) fprintf (st, " Expect Debugging via: SET %s DEBUG%s%s\n", sim_dname(exp->dptr), exp->dptr->debflags ? "=" : "", exp->dptr->debflags ? _get_dbg_verb (exp->dbit, exp->dptr, NULL) : ""); fprintf (st, " Match Rules:\n"); if (!*match) return sim_exp_showall (st, exp); |
︙ | ︙ | |||
12040 12041 12042 12043 12044 12045 12046 | } /* Test for expect match */ t_stat sim_exp_check (EXPECT *exp, uint8 data) { int32 i; | | | > | | > | | | | | > | | 12849 12850 12851 12852 12853 12854 12855 12856 12857 12858 12859 12860 12861 12862 12863 12864 12865 12866 12867 12868 12869 12870 12871 12872 12873 12874 12875 12876 12877 12878 12879 12880 12881 12882 12883 12884 12885 12886 12887 12888 12889 12890 12891 12892 12893 12894 12895 12896 12897 12898 12899 12900 12901 12902 12903 12904 12905 12906 12907 12908 12909 12910 12911 12912 12913 12914 12915 12916 12917 12918 12919 12920 12921 12922 12923 12924 12925 12926 12927 12928 12929 12930 12931 | } /* Test for expect match */ t_stat sim_exp_check (EXPECT *exp, uint8 data) { int32 i; EXPTAB *ep = NULL; int regex_checks = 0; char *tstr = NULL; if ((!exp) || (!exp->rules)) /* Anying to check? */ return SCPE_OK; exp->buf[exp->buf_ins++] = data; /* Save new data */ exp->buf[exp->buf_ins] = '\0'; /* Nul terminate for RegEx match */ if (exp->buf_data < exp->buf_size) ++exp->buf_data; /* Record amount of data in buffer */ for (i=0; i < exp->size; i++) { ep = &exp->rules[i]; if (ep->switches & EXP_TYP_REGEX) { #if defined (USE_REGEX) int *ovector = NULL; int rc; char *cbuf = (char *)exp->buf; static size_t sim_exp_match_sub_count = 0; if (tstr) cbuf = tstr; else { if (strlen ((char *)exp->buf) != exp->buf_ins) { /* Nul characters in buffer? */ size_t off; tstr = (char *)malloc (exp->buf_ins + 1); tstr[0] = '\0'; for (off=0; off < exp->buf_ins; off += 1 + strlen ((char *)&exp->buf[off])) strcpy (&tstr[strlen (tstr)], (char *)&exp->buf[off]); cbuf = tstr; } } ++regex_checks; ovector = (int *)malloc (3 * (ep->re_nsub + 1) * sizeof (*ovector)); if (sim_deb && exp->dptr && (exp->dptr->dctrl & exp->dbit)) { char *estr = sim_encode_quoted_string (exp->buf, exp->buf_ins); sim_debug (exp->dbit, exp->dptr, "Checking String: %s\n", estr); sim_debug (exp->dbit, exp->dptr, "Against RegEx Match Rule: %s\n", ep->match_pattern); free (estr); } rc = pcre_exec (ep->regex, NULL, cbuf, exp->buf_ins, 0, PCRE_NOTBOL, ovector, 3 * (ep->re_nsub + 1)); if (rc >= 0) { size_t j; char *buf = (char *)malloc (1 + exp->buf_ins); for (j=0; j < (size_t)rc; j++) { char env_name[32]; sprintf (env_name, "_EXPECT_MATCH_GROUP_%d", (int)j); memcpy (buf, &cbuf[ovector[2 * j]], ovector[2 * j + 1] - ovector[2 * j]); buf[ovector[2 * j + 1] - ovector[2 * j]] = '\0'; setenv (env_name, buf, 1); /* Make the match and substrings available as environment variables */ sim_debug (exp->dbit, exp->dptr, "%s=%s\n", env_name, buf); } for (; j<sim_exp_match_sub_count; j++) { char env_name[32]; sprintf (env_name, "_EXPECT_MATCH_GROUP_%d", (int)j); setenv (env_name, "", 1); /* Remove previous extra environment variables */ } sim_exp_match_sub_count = ep->re_nsub; free (ovector); ovector = NULL; free (buf); break; } free (ovector); #endif } else { if (exp->buf_data < ep->size) /* Too little data to match yet? */ continue; /* Yes, Try next one. */ if (exp->buf_ins < ep->size) { /* Match might stradle end of buffer */ /* |
︙ | ︙ | |||
12230 12231 12232 12233 12234 12235 12236 12237 12238 12239 12240 12241 12242 12243 | snd->bufsize = snd->insoff+size; snd->buffer = (uint8 *)realloc(snd->buffer, snd->bufsize); } memcpy(snd->buffer+snd->insoff, data, size); snd->insoff += size; snd->delay = (sim_switches & SWMASK ('T')) ? (uint32)((sim_timer_inst_per_sec()*delay)/1000000.0) : delay; snd->after = (sim_switches & SWMASK ('T')) ? (uint32)((sim_timer_inst_per_sec()*after)/1000000.0) : after; snd->next_time = sim_gtime() + snd->after; return SCPE_OK; } /* Cancel Queued input data */ t_stat sim_send_clear (SEND *snd) { | > > > > > > | 13042 13043 13044 13045 13046 13047 13048 13049 13050 13051 13052 13053 13054 13055 13056 13057 13058 13059 13060 13061 | snd->bufsize = snd->insoff+size; snd->buffer = (uint8 *)realloc(snd->buffer, snd->bufsize); } memcpy(snd->buffer+snd->insoff, data, size); snd->insoff += size; snd->delay = (sim_switches & SWMASK ('T')) ? (uint32)((sim_timer_inst_per_sec()*delay)/1000000.0) : delay; snd->after = (sim_switches & SWMASK ('T')) ? (uint32)((sim_timer_inst_per_sec()*after)/1000000.0) : after; if (sim_switches & SWMASK ('T')) sim_debug (snd->dbit, snd->dptr, "%d bytes queued for input. Delay %d usecs = %d insts, After %d usecs = %d insts\n", (int)size, (int)delay, (int)snd->delay, (int)after, (int)snd->after); else sim_debug (snd->dbit, snd->dptr, "%d bytes queued for input. Delay=%d, After=%d\n", (int)size, (int)delay, (int)after); snd->next_time = sim_gtime() + snd->after; return SCPE_OK; } /* Cancel Queued input data */ t_stat sim_send_clear (SEND *snd) { |
︙ | ︙ | |||
12260 12261 12262 12263 12264 12265 12266 | fprint_buffer_string (st, snd->buffer+snd->extoff, snd->insoff-snd->extoff); fprintf (st, "\n"); } else fprintf (st, " No Pending Input Data\n"); if ((snd->next_time - sim_gtime()) > 0) { if (((snd->next_time - sim_gtime()) > (sim_timer_inst_per_sec()/1000000.0)) && ((sim_timer_inst_per_sec()/1000000.0) > 0.0)) | | | | | | | | 13078 13079 13080 13081 13082 13083 13084 13085 13086 13087 13088 13089 13090 13091 13092 13093 13094 13095 13096 13097 13098 13099 13100 13101 13102 13103 13104 | fprint_buffer_string (st, snd->buffer+snd->extoff, snd->insoff-snd->extoff); fprintf (st, "\n"); } else fprintf (st, " No Pending Input Data\n"); if ((snd->next_time - sim_gtime()) > 0) { if (((snd->next_time - sim_gtime()) > (sim_timer_inst_per_sec()/1000000.0)) && ((sim_timer_inst_per_sec()/1000000.0) > 0.0)) fprintf (st, " Minimum of %d %s (%d microseconds) before sending first character\n", (int)(snd->next_time - sim_gtime()), sim_vm_interval_units, (int)((snd->next_time - sim_gtime())/(sim_timer_inst_per_sec()/1000000.0))); else fprintf (st, " Minimum of %d %s before sending first character\n", (int)(snd->next_time - sim_gtime()), sim_vm_interval_units); } if ((snd->delay > (sim_timer_inst_per_sec()/1000000.0)) && ((sim_timer_inst_per_sec()/1000000.0) > 0.0)) fprintf (st, " Minimum of %d %s (%d microseconds) between characters\n", (int)snd->delay, sim_vm_interval_units, (int)(snd->delay/(sim_timer_inst_per_sec()/1000000.0))); else fprintf (st, " Minimum of %d %s between characters\n", (int)snd->delay, sim_vm_interval_units); if (after) fprintf (st, " Default delay before first character input is %u %s\n", after, sim_vm_interval_units); if (delay) fprintf (st, " Default delay between character input is %u %s\n", after, sim_vm_interval_units); if (snd->dptr && (snd->dbit & snd->dptr->dctrl)) fprintf (st, " Send Debugging via: SET %s DEBUG%s%s\n", sim_dname(snd->dptr), snd->dptr->debflags ? "=" : "", snd->dptr->debflags ? _get_dbg_verb (snd->dbit, snd->dptr, NULL) : ""); return SCPE_OK; } /* Poll for Queued input data */ |
︙ | ︙ | |||
12355 12356 12357 12358 12359 12360 12361 12362 12363 12364 12365 12366 12367 | char *debug_line_buf_last = NULL; size_t debug_line_buf_last_endprefix_offset = 0; AIO_TLS char debug_line_last_prefix[256]; char *debug_line_buf = NULL; size_t debug_line_bufsize = 0; size_t debug_line_offset = 0; size_t debug_line_count = 0; static void _debug_fwrite (const char *buf, size_t len) { size_t move_size; if (sim_deb_buffer == NULL) { | > > > > > > > > > > > > > > | | | 13173 13174 13175 13176 13177 13178 13179 13180 13181 13182 13183 13184 13185 13186 13187 13188 13189 13190 13191 13192 13193 13194 13195 13196 13197 13198 13199 13200 13201 13202 13203 13204 13205 13206 13207 13208 13209 13210 13211 | char *debug_line_buf_last = NULL; size_t debug_line_buf_last_endprefix_offset = 0; AIO_TLS char debug_line_last_prefix[256]; char *debug_line_buf = NULL; size_t debug_line_bufsize = 0; size_t debug_line_offset = 0; size_t debug_line_count = 0; static void _debug_fwrite_all (const char *buf, size_t len, FILE *f) { size_t len_written; while (len > 0) { len_written = fwrite (buf, 1, len, f); len -= len_written; buf += len_written; if (errno == EAGAIN) /* Non blocking file descriptor buffer full? */ sim_os_ms_sleep(10);/* wait a bit to retry */ errno = 0; } } static void _debug_fwrite (const char *buf, size_t len) { size_t move_size; if (sim_deb_buffer == NULL) { _debug_fwrite_all (buf, len, sim_deb); /* output now. */ return; } if ((sim_deb == stdout) && (!sim_is_running)) _debug_fwrite_all (buf, len, stdout); /* output now. */ while (len > 0) { if (sim_debug_buffer_offset + len <= sim_deb_buffer_size) move_size = len; else move_size = sim_deb_buffer_size - sim_debug_buffer_offset; memcpy (sim_deb_buffer + sim_debug_buffer_offset, buf, move_size); sim_debug_buffer_offset += move_size; |
︙ | ︙ | |||
12412 12413 12414 12415 12416 12417 12418 | char *endprefix = strstr (debug_line_buf, ")> "); size_t linesize = (eol - debug_line_buf) + 1; if ((0 != memcmp ("DBG(", debug_line_buf, 4)) || (endprefix == NULL)) { if (debug_line_count > 0) _debug_fwrite (debug_line_buf_last, strlen (debug_line_buf_last)); if (debug_line_count > 1) { | | | 13244 13245 13246 13247 13248 13249 13250 13251 13252 13253 13254 13255 13256 13257 13258 | char *endprefix = strstr (debug_line_buf, ")> "); size_t linesize = (eol - debug_line_buf) + 1; if ((0 != memcmp ("DBG(", debug_line_buf, 4)) || (endprefix == NULL)) { if (debug_line_count > 0) _debug_fwrite (debug_line_buf_last, strlen (debug_line_buf_last)); if (debug_line_count > 1) { char countstr[40]; sprintf (countstr, "same as above (%d time%s)\r\n", (int)(debug_line_count - 1), ((debug_line_count - 1) != 1) ? "s" : ""); _debug_fwrite (debug_line_last_prefix, strlen (debug_line_last_prefix)); _debug_fwrite (countstr, strlen (countstr)); } if (flush) { linesize = debug_line_offset; |
︙ | ︙ | |||
12445 12446 12447 12448 12449 12450 12451 | ++debug_line_count; memcpy (debug_line_last_prefix, debug_line_buf, (endprefix - debug_line_buf) + 3); debug_line_last_prefix[(endprefix - debug_line_buf) + 3] = '\0'; } else { _debug_fwrite (debug_line_buf_last, strlen (debug_line_buf_last)); if (debug_line_count > 1) { | | | 13277 13278 13279 13280 13281 13282 13283 13284 13285 13286 13287 13288 13289 13290 13291 | ++debug_line_count; memcpy (debug_line_last_prefix, debug_line_buf, (endprefix - debug_line_buf) + 3); debug_line_last_prefix[(endprefix - debug_line_buf) + 3] = '\0'; } else { _debug_fwrite (debug_line_buf_last, strlen (debug_line_buf_last)); if (debug_line_count > 1) { char countstr[40]; sprintf (countstr, "same as above (%d time%s)\r\n", (int)(debug_line_count - 1), ((debug_line_count - 1) != 1) ? "s" : ""); _debug_fwrite (debug_line_last_prefix, strlen (debug_line_last_prefix)); _debug_fwrite (countstr, strlen (countstr)); } debug_line_buf_last_endprefix_offset = endprefix - debug_line_buf; memcpy (debug_line_buf_last, debug_line_buf, linesize); |
︙ | ︙ | |||
12541 12542 12543 12544 12545 12546 12547 | const char* debug_type = _get_dbg_verb (dbits, dptr, uptr); char tim_t[32] = ""; char tim_a[32] = ""; char pc_s[64] = ""; struct timespec time_now; if (sim_deb_switches & (SWMASK ('T') | SWMASK ('R') | SWMASK ('A'))) { | | | 13373 13374 13375 13376 13377 13378 13379 13380 13381 13382 13383 13384 13385 13386 13387 | const char* debug_type = _get_dbg_verb (dbits, dptr, uptr); char tim_t[32] = ""; char tim_a[32] = ""; char pc_s[64] = ""; struct timespec time_now; if (sim_deb_switches & (SWMASK ('T') | SWMASK ('R') | SWMASK ('A'))) { sim_rtcn_get_time(&time_now, 0); if (sim_deb_switches & SWMASK ('R')) sim_timespec_diff (&time_now, &time_now, &sim_deb_basetime); if (sim_deb_switches & SWMASK ('T')) { time_t tnow = (time_t)time_now.tv_sec; struct tm *now = localtime(&tnow); sprintf(tim_t, "%02d:%02d:%02d.%03d ", now->tm_hour, now->tm_min, now->tm_sec, (int)(time_now.tv_nsec/1000000)); |
︙ | ︙ | |||
12854 12855 12856 12857 12858 12859 12860 12861 12862 12863 12864 12865 12866 12867 | _sim_debug_write (&buf[j], i-j); _sim_debug_write ("\r\n", 2); } debug_unterm = 0; } j = i + 1; } } if (i > j) { if (!debug_unterm) /* print prefix when required */ _sim_debug_write (debug_prefix, strlen (debug_prefix)); _sim_debug_write (&buf[j], i-j); } | > > > > > > > > | 13686 13687 13688 13689 13690 13691 13692 13693 13694 13695 13696 13697 13698 13699 13700 13701 13702 13703 13704 13705 13706 13707 | _sim_debug_write (&buf[j], i-j); _sim_debug_write ("\r\n", 2); } debug_unterm = 0; } j = i + 1; } else { if (buf[i] == 0) { /* Imbedded \0 character in formatted result? */ fprintf (stderr, "sim_debug() formatted result: '%s'\r\n" " has an imbedded \\0 character.\r\n" "DON'T DO THAT!\r\n", buf); abort(); } } } if (i > j) { if (!debug_unterm) /* print prefix when required */ _sim_debug_write (debug_prefix, strlen (debug_prefix)); _sim_debug_write (&buf[j], i-j); } |
︙ | ︙ | |||
13005 13006 13007 13008 13009 13010 13011 | } int Fprintf (FILE *f, const char* fmt, ...) { int ret = 0; va_list args; | | | 13845 13846 13847 13848 13849 13850 13851 13852 13853 13854 13855 13856 13857 13858 13859 | } int Fprintf (FILE *f, const char* fmt, ...) { int ret = 0; va_list args; if (sim_mfile || (sim_deb && (f == sim_deb))) { char stackbuf[STACKBUFSIZE]; int32 bufsize = sizeof(stackbuf); char *buf = stackbuf; va_list arglist; int32 len; buf[bufsize-1] = '\0'; |
︙ | ︙ | |||
13062 13063 13064 13065 13066 13067 13068 | } if (buf != stackbuf) free (buf); } else { va_start (args, fmt); | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 13902 13903 13904 13905 13906 13907 13908 13909 13910 13911 13912 13913 13914 13915 13916 13917 13918 13919 13920 13921 13922 13923 13924 13925 13926 13927 13928 13929 13930 13931 13932 13933 13934 13935 13936 13937 13938 13939 13940 13941 13942 13943 13944 13945 13946 13947 13948 13949 13950 13951 13952 | } if (buf != stackbuf) free (buf); } else { va_start (args, fmt); if (sim_oline) /* output to tmxr socket if it is defined */ tmxr_linemsgvf (sim_oline, fmt, args); else /* otherwise, output to provided file stream */ ret = vfprintf (f, fmt, args); va_end (args); } return ret; } /* Command interfaces to external tools * tar * curl */ static t_stat _process_cmd (const char *cmd, CONST char *cptr) { char gbuf[CBUFSIZE*2]; if (_get_tool_version (cmd)[0]) { snprintf (gbuf, sizeof (gbuf), "%s %s", cmd, cptr); return spawn_cmd (0, gbuf); } else return SCPE_NOFNC; } t_stat tar_cmd (int32 flag, CONST char *cptr) { return _process_cmd ("tar", cptr); } t_stat curl_cmd (int32 flag, CONST char *cptr) { return _process_cmd ("curl", cptr); } /* Hierarchical help presentation * * Device help can be presented hierarchically by calling * * t_stat scp_help (FILE *st, DEVICE *dptr, * UNIT *uptr, int flag, const char *help, char *cptr) |
︙ | ︙ | |||
13228 13229 13230 13231 13232 13233 13234 13235 13236 13237 13238 13239 13240 13241 | case 'D': if (dptr) appendText (topic, dptr->name, strlen (dptr->name)); break; case 'S': appendText (topic, sim_name, strlen (sim_name)); break; case '%': appendText (topic, "%", 1); break; case '+': appendText (topic, "+", 1); break; default: /* Check for vararg # */ | > > > > > > | 14097 14098 14099 14100 14101 14102 14103 14104 14105 14106 14107 14108 14109 14110 14111 14112 14113 14114 14115 14116 | case 'D': if (dptr) appendText (topic, dptr->name, strlen (dptr->name)); break; case 'S': appendText (topic, sim_name, strlen (sim_name)); break; case 'C': appendText (topic, sim_vm_interval_units, strlen (sim_vm_interval_units)); break; case 'I': appendText (topic, sim_vm_step_unit, strlen (sim_vm_step_unit)); break; case '%': appendText (topic, "%", 1); break; case '+': appendText (topic, "+", 1); break; default: /* Check for vararg # */ |
︙ | ︙ | |||
13492 13493 13494 13495 13496 13497 13498 | } } rewind (tmp); /* Discard leading blank lines/redundant titles */ for (i =0; i < skiplines; i++) | | | 14367 14368 14369 14370 14371 14372 14373 14374 14375 14376 14377 14378 14379 14380 14381 | } } rewind (tmp); /* Discard leading blank lines/redundant titles */ for (i =0; i < skiplines; i++) if (fgets (tbuf, sizeof (tbuf), tmp)) {}; while (fgets (tbuf, sizeof (tbuf), tmp)) { if (tbuf[0] != '\n') fputs (" ", st); fputs (tbuf, st); } fclose (tmp); |
︙ | ︙ | |||
13537 13538 13539 13540 13541 13542 13543 | return SCPE_OK; } #define HLP_MATCH_AMBIGUOUS (~0u) #define HLP_MATCH_WILDCARD (~1U) #define HLP_MATCH_NONE 0 | | | | > | 14412 14413 14414 14415 14416 14417 14418 14419 14420 14421 14422 14423 14424 14425 14426 14427 14428 14429 14430 14431 14432 14433 14434 14435 14436 14437 14438 | return SCPE_OK; } #define HLP_MATCH_AMBIGUOUS (~0u) #define HLP_MATCH_WILDCARD (~1U) #define HLP_MATCH_NONE 0 static size_t matchHelpTopicName (TOPIC *topic, const char *token) { size_t i, match; char cbuf[CBUFSIZE], *cptr; if (!strcmp (token, "*")) return HLP_MATCH_WILDCARD; match = 0; for (i = 0; i < topic->kids; i++) { strlcpy (cbuf,topic->children[i]->title + ((topic->children[i]->flags & HLP_MAGIC_TOPIC)? 1 : 0), sizeof (cbuf)); cptr = cbuf; while (*cptr) { if (blankch (*cptr)) { *cptr++ = '_'; } else { *cptr = (char)sim_toupper (*cptr); |
︙ | ︙ | |||
13639 13640 13641 13642 13643 13644 13645 | top.label = (char *) malloc (sizeof ("1")); strcpy (top.label, "1"); flat_help = flat_help || !sim_ttisatty() || (flag & SCP_HELP_FLAT); if (flat_help) { flag |= SCP_HELP_FLAT; | | | 14515 14516 14517 14518 14519 14520 14521 14522 14523 14524 14525 14526 14527 14528 14529 | top.label = (char *) malloc (sizeof ("1")); strcpy (top.label, "1"); flat_help = flat_help || !sim_ttisatty() || (flag & SCP_HELP_FLAT); if (flat_help) { flag |= SCP_HELP_FLAT; if (sim_ttisatty() && (!sim_oline)) fprintf (st, "%s help.\nThis help is also available in hierarchical form.\n", top.title); else fprintf (st, "%s help.\n", top.title); } else fprintf (st, ((flag & SCP_HELP_ONECMD)? onecmd_help: brief_help), top.title); |
︙ | ︙ | |||
13715 13716 13717 13718 13719 13720 13721 | if (topic->kids) { size_t w = 0; char *p; char tbuf[CBUFSIZE]; fprintf (st, "\n Additional information available:\n\n"); for (i = 0; i < topic->kids; i++) { | | | > | 14591 14592 14593 14594 14595 14596 14597 14598 14599 14600 14601 14602 14603 14604 14605 14606 14607 | if (topic->kids) { size_t w = 0; char *p; char tbuf[CBUFSIZE]; fprintf (st, "\n Additional information available:\n\n"); for (i = 0; i < topic->kids; i++) { strlcpy (tbuf, topic->children[i]->title + ((topic->children[i]->flags & HLP_MAGIC_TOPIC)? 1 : 0), sizeof (tbuf)); for (p = tbuf; *p; p++) { if (blankch (*p)) *p = '_'; } w += 4 + topic->kidwid; if (w > 80) { w = 4 + topic->kidwid; |
︙ | ︙ | |||
14204 14205 14206 14207 14208 14209 14210 | static t_svalue _op_gt (t_svalue data1, t_svalue data2) { return data2 > data1; } static int _i_strcmp (const char *s1, const char *s2) { | > > | | 15081 15082 15083 15084 15085 15086 15087 15088 15089 15090 15091 15092 15093 15094 15095 15096 15097 | static t_svalue _op_gt (t_svalue data1, t_svalue data2) { return data2 > data1; } static int _i_strcmp (const char *s1, const char *s2) { if (sim_switches & SWMASK ('W')) /* Whitespace compress? */ return sim_strwhitecasecmp (s1, s2, sim_switches & SWMASK ('I')); return ((sim_switches & SWMASK ('I')) ? strcasecmp (s2, s1) : strcmp (s2, s1)); } static t_svalue _op_str_eq (const char *str1, const char *str2) { return (0 == _i_strcmp (str2, str1)); } |
︙ | ︙ | |||
14316 14317 14318 14319 14320 14321 14322 | else { if (*cptr == '0') { /* Octal Number */ while (*cptr && strchr (OctalDigits, *cptr)) *buf++ = *cptr++; *buf = '\0'; } else { /* Decimal Number */ | > > > > > > > > > > > > > > > > > > > > > > > | > | > > | 15195 15196 15197 15198 15199 15200 15201 15202 15203 15204 15205 15206 15207 15208 15209 15210 15211 15212 15213 15214 15215 15216 15217 15218 15219 15220 15221 15222 15223 15224 15225 15226 15227 15228 15229 15230 15231 15232 15233 15234 15235 15236 | else { if (*cptr == '0') { /* Octal Number */ while (*cptr && strchr (OctalDigits, *cptr)) *buf++ = *cptr++; *buf = '\0'; } else { /* Decimal Number */ int digits = 0; int commas = 0; const char *cp = cptr; /* Ignore commas in decimal numbers */ while (isdigit (*cp) || (*cp == ',')) { if (*cp == ',') ++commas; else ++digits; ++cp; } if ((commas > 0) && (commas != (digits - 1)/3)) { *stat = SCPE_INVEXPR; return cptr; } while (commas--) { cp -= 4; if (*cp != ',') { *stat = SCPE_INVEXPR; return cptr; } } while (isdigit (*cptr) || (*cptr == ',')) { if (*cptr != ',') *buf++ = *cptr; ++cptr; } *buf = '\0'; } } } if (sim_isalpha (*cptr)) { /* Numbers can't be followed by alpha character */ *stat = SCPE_INVEXPR; return cptr; |
︙ | ︙ | |||
14373 14374 14375 14376 14377 14378 14379 | /* * Translate a string containing an infix ordered expression * into a stack containing that expression in postfix order */ static const char *sim_into_postfix (Stack *stack1, const char *cptr, t_stat *stat, t_bool parens_required) { | < | 15278 15279 15280 15281 15282 15283 15284 15285 15286 15287 15288 15289 15290 15291 | /* * Translate a string containing an infix ordered expression * into a stack containing that expression in postfix order */ static const char *sim_into_postfix (Stack *stack1, const char *cptr, t_stat *stat, t_bool parens_required) { const char *last_cptr; int parens = 0; Operator *op = NULL, *last_op; Stack *stack2 = new_Stack(); /* operator stack */ char gbuf[CBUFSIZE]; while (sim_isspace(*cptr)) /* skip leading whitespace */ |
︙ | ︙ | |||
14478 14479 14480 14481 14482 14483 14484 | devnam[dot - data] = '\0'; if (find_dev (devnam)) { dptr = find_dev (devnam); data = dot + 1; rptr = find_reg (data, &gptr, dptr); } } | | > > > > > > > > > > | 15382 15383 15384 15385 15386 15387 15388 15389 15390 15391 15392 15393 15394 15395 15396 15397 15398 15399 15400 15401 15402 15403 15404 15405 15406 15407 15408 15409 15410 15411 15412 15413 15414 15415 15416 15417 15418 15419 15420 15421 15422 15423 15424 15425 15426 15427 15428 15429 15430 15431 | devnam[dot - data] = '\0'; if (find_dev (devnam)) { dptr = find_dev (devnam); data = dot + 1; rptr = find_reg (data, &gptr, dptr); } } else { rptr = find_reg_glob (data, &gptr, &dptr); if (!rptr) { /* Register not found? */ char tbuf[CBUFSIZE]; get_glyph (data, tbuf, 0); /* try using the upcased name */ if (strcmp (data, tbuf)) /* upcase different? */ rptr = find_reg_glob (tbuf, &gptr, &dptr);/* lookup the upcase name */ } } if (rptr) { *svalue = (t_svalue)get_rval (rptr, 0); sprint_val (string, *svalue, 10, string_size - 1, PV_LEFTSIGN); sim_debug (SIM_DBG_EXP_EVAL, &sim_scp_dev, "[Value: %s=%s]\n", data, string); return TRUE; } gptr = _sim_get_env_special (data, string, string_size - 1); if (gptr) { *svalue = strtotsv(string, &gptr, 0); sprint_val (string, *svalue, 10, string_size - 1, PV_LEFTSIGN); sim_debug (SIM_DBG_EXP_EVAL, &sim_scp_dev, "[Value: %s=%s]\n", data, string); return ((*gptr == '\0') && (*string)); } else { data = ""; data_size = 0; } } string[0] = '\0'; if ((data[0] == '\'') && (data_size > 1) && (data[data_size - 1] == '\'')) snprintf (string, string_size - 1, "\"%*.*s\"", (int)(data_size - 2), (int)(data_size - 2), data + 1); if ((data[0] == '"') && (data_size > 1) && (data[data_size - 1] == '"')) strlcpy (string, data, string_size); if (string[0] == '\0') { *svalue = strtotsv(data, &gptr, 0); strlcpy (string, data, string_size); sim_debug (SIM_DBG_EXP_EVAL, &sim_scp_dev, "[Value: %s=%s]\n", data, string); return ((*gptr == '\0') && (*data)); } sim_sub_args (string, string_size, sim_exp_argv); *svalue = strtotsv(string, &gptr, 0); sim_debug (SIM_DBG_EXP_EVAL, &sim_scp_dev, "[Value: %s=%s]\n", data, string); return ((*gptr == '\0') && (*string)); |
︙ | ︙ | |||
14638 14639 14640 14641 14642 14643 14644 14645 14646 14647 14648 14649 | lo = sim_rand_seed % q; sim_rand_seed = a * lo - r * hi; if (sim_rand_seed < 0) sim_rand_seed += RAND_MAX + 1; return (sim_rand_seed - 1); } /* * Compiled in unit tests for the various device oriented library * modules: sim_card, sim_disk, sim_tape, sim_ether, sim_tmxr, etc. */ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | > > > | | | > > > > > | > > > > > > > > | 15552 15553 15554 15555 15556 15557 15558 15559 15560 15561 15562 15563 15564 15565 15566 15567 15568 15569 15570 15571 15572 15573 15574 15575 15576 15577 15578 15579 15580 15581 15582 15583 15584 15585 15586 15587 15588 15589 15590 15591 15592 15593 15594 15595 15596 15597 15598 15599 15600 15601 15602 15603 15604 15605 15606 15607 15608 15609 15610 15611 15612 15613 15614 15615 15616 15617 15618 15619 15620 15621 15622 15623 15624 15625 15626 15627 15628 15629 15630 15631 15632 15633 15634 15635 15636 15637 15638 15639 15640 15641 15642 15643 15644 15645 15646 15647 15648 15649 15650 15651 15652 15653 15654 15655 15656 15657 15658 15659 15660 15661 15662 15663 15664 15665 15666 15667 15668 15669 15670 15671 15672 15673 15674 15675 15676 15677 15678 15679 15680 15681 15682 15683 15684 15685 15686 15687 15688 15689 15690 15691 15692 15693 15694 15695 15696 15697 15698 15699 15700 15701 15702 15703 15704 15705 15706 15707 15708 15709 15710 15711 15712 15713 15714 15715 15716 15717 15718 15719 15720 15721 15722 15723 15724 15725 15726 15727 15728 15729 15730 15731 15732 15733 15734 15735 15736 15737 15738 15739 15740 15741 15742 15743 15744 15745 15746 15747 15748 15749 15750 15751 15752 15753 15754 15755 15756 15757 15758 15759 15760 15761 15762 15763 15764 15765 15766 15767 15768 15769 15770 15771 15772 15773 15774 15775 15776 15777 15778 15779 15780 15781 15782 15783 15784 15785 15786 15787 15788 15789 15790 15791 15792 15793 15794 15795 15796 15797 15798 15799 15800 15801 15802 15803 15804 15805 15806 15807 15808 15809 15810 15811 15812 15813 15814 15815 15816 15817 15818 15819 15820 15821 15822 15823 15824 15825 15826 15827 15828 15829 15830 15831 15832 15833 15834 15835 15836 15837 15838 15839 15840 15841 15842 15843 15844 15845 15846 15847 15848 15849 15850 15851 15852 15853 15854 15855 15856 15857 15858 15859 15860 15861 15862 15863 15864 15865 15866 15867 15868 15869 15870 15871 15872 15873 15874 15875 15876 15877 15878 15879 15880 15881 15882 15883 15884 15885 15886 15887 15888 15889 15890 15891 15892 15893 15894 15895 15896 15897 15898 15899 15900 15901 15902 15903 15904 15905 15906 15907 15908 15909 15910 15911 15912 15913 15914 15915 15916 15917 15918 15919 15920 15921 15922 15923 15924 15925 15926 15927 15928 15929 15930 15931 15932 15933 15934 15935 15936 15937 15938 15939 15940 15941 15942 15943 15944 15945 15946 15947 15948 15949 15950 15951 15952 15953 15954 15955 15956 15957 15958 15959 15960 15961 15962 15963 15964 15965 15966 15967 15968 15969 15970 15971 15972 15973 15974 15975 15976 15977 15978 15979 15980 15981 15982 15983 15984 15985 15986 15987 15988 15989 15990 15991 15992 15993 15994 15995 15996 15997 15998 15999 16000 16001 16002 16003 16004 16005 16006 16007 16008 16009 16010 16011 16012 16013 16014 16015 16016 16017 16018 16019 16020 16021 16022 16023 16024 16025 16026 16027 16028 16029 16030 16031 16032 16033 16034 16035 16036 16037 16038 16039 16040 16041 16042 16043 16044 16045 16046 16047 16048 16049 16050 16051 16052 16053 16054 16055 16056 16057 16058 16059 16060 16061 16062 | lo = sim_rand_seed % q; sim_rand_seed = a * lo - r * hi; if (sim_rand_seed < 0) sim_rand_seed += RAND_MAX + 1; return (sim_rand_seed - 1); } typedef struct MFILE { char *buf; size_t pos; size_t size; } MFILE; static int Mprintf (MFILE *f, const char* fmt, ...) { va_list arglist; int len; while (f) { size_t buf_space = (f->size - f->pos); va_start (arglist, fmt); #if defined(NO_vsnprintf) len = vsprintf (f->buf + f->pos, fmt, arglist); #else /* !defined(NO_vsnprintf) */ len = vsnprintf (f->buf + f->pos, buf_space, fmt, arglist); #endif /* NO_vsnprintf */ va_end (arglist); if ((len < 0) || (len >= (int)buf_space)) { f->size *= 2; buf_space = (f->size - f->pos); if ((int)buf_space < len + 2) f->size += len + 2; f->buf = (char *)realloc (f->buf, f->size + 1); if (f->buf == NULL) /* out of memory */ return -1; f->buf[f->size-1] = '\0'; continue; } f->pos += len; break; } return 0; } static MFILE * MOpen () { return (MFILE *)calloc (1, sizeof (MFILE)); } void MFlush (MFILE *f) { f->pos = 0; } static int FMwrite (FILE *fout, MFILE *fdata) { int ret = fwrite (fdata->buf, 1, fdata->pos, fout); MFlush (fdata); return ret; } static void MClose (MFILE *f) { free (f->buf); free (f); } /* * This sanity check walks through the all of simulator's device registers * to verify that each contains a reasonable description of a method to * access the devices simulator data and that description stays within the * device state variables it is supposed to reference. */ static t_stat sim_sanity_check_register_declarations (void) { t_stat stat = SCPE_OK; int i; DEVICE *dptr; MFILE *f = MOpen (); for (i = 0; (dptr = sim_devices[i]) != NULL; i++) { REG *rptr; for (rptr = dptr->registers; (rptr != NULL) && (rptr->name != NULL); rptr++) { uint32 bytes = 1; uint32 rsz = SZ_R(rptr); uint32 memsize = ((rptr->flags & REG_FIT) || (rptr->depth > 1)) ? rptr->depth * rsz : 4; DEVICE *udptr = NULL; t_bool Bad; while ((bytes << 3) < rptr->offset + rptr->width) bytes <<= 1; if (rptr->depth > 1) bytes = rptr->ele_size; if (rptr->flags & REG_UNIT) { DEVICE **d; for (d = sim_devices; *d != NULL; d++) { if (((UNIT *)rptr->loc >= (*d)->units) && ((UNIT *)rptr->loc < (*d)->units + (*d)->numunits)) { udptr = *d; break; } } } if (((rptr->width + rptr->offset + CHAR_BIT - 1) / CHAR_BIT) >= sizeof(size_map) / sizeof(size_map[0])) { Bad = TRUE; rsz = 0; } else { Bad = FALSE; rsz = SZ_R(rptr); } if (sim_switches & SWMASK ('R')) /* Debug output */ sim_printf ("%5s:%-9.9s %s(rdx=%u, wd=%u, off=%u, dep=%u, strsz=%u, objsz=%u, elesz=%u, rsz=%u, %s %s%s%s membytes=%u)\n", dptr->name, rptr->name, rptr->macro, rptr->radix, rptr->width, rptr->offset, rptr->depth, (uint32)rptr->str_size, (uint32)rptr->obj_size, (uint32)rptr->ele_size, rsz, rptr->desc ? rptr->desc : "", (rptr->flags & REG_FIT) ? "REG_FIT" : "", (rptr->flags & REG_VMIO) ? " REG_VMIO" : "", (rptr->flags & REG_STRUCT) ? " REG_STRUCT" : "", memsize); MFlush (f); if (rptr->depth == 1) { if (rptr->offset) Mprintf (f, "%s %s:%s used the %s macro to describe a %u bit%s wide field at offset %u\n", sim_name, dptr->name, rptr->name, rptr->macro, rptr->width, (rptr->width == 1) ? "" : "s", rptr->offset); else Mprintf (f, "%s %s:%s used the %s macro to describe a %u bit wide field\n", sim_name, dptr->name, rptr->name, rptr->macro, rptr->width); } else Mprintf (f, "%s %s:%s used the %s macro to describe a %u bit%s wide and %u elements deep array\n", sim_name, dptr->name, rptr->name, rptr->macro, rptr->width, (rptr->width == 1) ? "" : "s", rptr->depth); if (rsz > sizeof (t_value)) { Bad = TRUE; Mprintf (f, "%u bits at offset %u is wider than the maximum allowed width of %u bits\n", rptr->width, rptr->offset, (uint32)(8 * sizeof(t_value))); } if (rptr->width == 0) { Bad = TRUE; Mprintf (f, "a 0 bit wide register is meaningless\n"); } if ((rptr->obj_size != 0) && (rptr->ele_size != 0) && (rptr->depth != 0) && (rptr->macro != NULL)) { if (rptr->flags & REG_UNIT) { if (udptr == NULL) { Bad = TRUE; Mprintf (f, "\tthe indicated UNIT can't be found for this %u depth array\n", rptr->depth); } else { if (rptr->depth > udptr->numunits) { Bad = TRUE; Mprintf (f, "\tthe depth of the UNIT array exceeds the number of units on the %s device which is %u\n", dptr->name, udptr->numunits); } if (rptr->obj_size > sizeof (t_value)) { Bad = TRUE; Mprintf (f, "\t%u is larger than the size of the t_value type (%u)\n", (uint32)rptr->obj_size, (uint32)sizeof (t_value)); } } } else { bytes *= rptr->depth; if (!Bad) if ((rsz * rptr->depth == rptr->obj_size) || ((rptr->flags & REG_STRUCT) && (rsz <= rptr->obj_size)) || ((rptr->depth == 1) && ((rptr->obj_size == sizeof (t_value)) || (rsz < rptr->obj_size))) || ((rptr->depth != 1) && (bytes == rptr->obj_size)) || ((rptr->depth != 1) && (rptr->offset == 0) && (rptr->width == 8) && ((rptr->depth == rptr->obj_size) || (rptr->depth == rptr->obj_size - 1))) || ((rptr->depth != 1) && (rptr->offset == 0) && (rptr->obj_size == rptr->ele_size))) continue; Bad = TRUE; Mprintf (f, "\ttherefore SAVE/RESTORE operations will affect %u byte%s of memory\n", bytes, (bytes != 1) ? "s" : ""); Mprintf (f, "\twhile the variable lives in %u bytes of memory\n", (uint32)rptr->obj_size); } } else Mprintf (f, "\tthis register entry is not properly initialized\n"); if (Bad) { FMwrite (stdout, f); stat = SCPE_IERR; } } } MClose (f); return stat; } typedef const char *(*parse_function)(const char *input, char *output, char end_char); struct function_test_data { char end_char; const char *expected_result; const char *expected_remainder; }; static struct parse_function_test { const char *function_name; parse_function function; const char *input; struct function_test_data test_data[10]; } parse_function_tests[] = { {"get_glyph", get_glyph, "AbcDe", { {0, "ABCDE", ""} } }, {"get_glyph", get_glyph, "AbcDe", { {'c', "AB", "De"}, {'c', "DE", ""} } }, {"get_glyph", get_glyph, "Ab cde", { {0, "AB", "cde"}, {0, "CDE", ""} } }, {"get_glyph_nc", get_glyph_nc, "AbcDe", { {0, "AbcDe", ""} } }, {"get_glyph_nc", get_glyph_nc, "AbcDe", { {'c', "Ab", "De"}, {'c', "De", ""} } }, {"get_glyph_nc", get_glyph_nc, "Ab cde", { {0, "Ab", "cde"}, {0, "cde", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "AbcDe", { {0, "AbcDe", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "AbcDe", { {'c', "Ab", "De"}, {'c', "De", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "Abc De", { {0, "Abc", "De"}, {0, "De", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "\'AbcDe\'",{ {0, "\'AbcDe\'", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "\'AbcDe\'",{ {'c', "\'AbcDe\'", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "\'Abc De\'",{ {0, "\'Abc De\'", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "\"AbcDe\"",{ {0, "\"AbcDe\"", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "\"AbcDe\"",{ {'c', "\"AbcDe\"", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "\"Abc De\"",{ {0, "\"Abc De\"", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "\"Abc\" De",{ {0, "\"Abc\"", "De"}, {0, "De", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "\'Abc\' De",{ {'c', "\'Abc\'", "De"}, {'c', "De", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "\'Abc\' \"De\"",{ {0, "\'Abc\'", "\"De\""}, {'c', "\"De\"", ""} } }, {"get_glyph_quoted", get_glyph_quoted, "\'Ab\\c\' \"D\\e\"",{ {0, "\'Ab\\c\'", "\"D\\e\""}, {'c', "\"D\\e\"", ""} } }, {NULL} }; static t_stat test_scp_parsing (void) { struct parse_function_test *t = parse_function_tests; t_stat result = SCPE_OK; if (sim_switches & SWMASK ('T')) sim_messagef (SCPE_OK, "test_scp_parsing - starting\n"); while (t->function_name) { struct function_test_data *d = t->test_data; char gbuf[CBUFSIZE + 1]; const char *input = t->input; const char *remainder; memset (gbuf, 0xFF, sizeof (gbuf)); gbuf[sizeof (gbuf) - 1] = '\0'; remainder = t->function ("", gbuf, 0); if (*remainder != '\0') return sim_messagef (SCPE_IERR, "function: %s (\"\", gbuf, 0); returned a non empty string: \"%s\"\n", t->function_name, remainder); while ((input != NULL) && (*input != '\0')) { char end_char_string[32]; if (sim_isprint (d->end_char)) sprintf (end_char_string, "\'%c\'", d->end_char); else if (d->end_char == '\0') strcpy (end_char_string, "0"); else sprintf (end_char_string, "'\\%d'", d->end_char); memset (gbuf, 0xFF, sizeof (gbuf)); gbuf[sizeof (gbuf) - 1] = '\0'; remainder = t->function (input, gbuf, d->end_char); if (sim_switches & SWMASK ('T')) sim_messagef (SCPE_OK, "%s (\"%s\", gbuf, %s);\n", t->function_name, input, end_char_string); if ((0 != strcmp (gbuf, d->expected_result)) || (remainder == NULL) || (0 != strcmp (remainder, d->expected_remainder))) { if (0 != strcmp (gbuf, d->expected_result)) result = sim_messagef (SCPE_IERR, "function: %s (\"%s\", gbuf, %s); returned an unexpected result string: \"%s\" instead of \"%s\"\n", t->function_name, input, end_char_string, gbuf, d->expected_result); if (remainder == NULL) result = sim_messagef (SCPE_IERR, "function: %s (\"%s\", gbuf, %s); returned a NULL pointer for a remnant instead of \"%s\"\n", t->function_name, input, end_char_string, d->expected_result); else { if (0 != strcmp (remainder, d->expected_remainder)) result = sim_messagef (SCPE_IERR, "function: %s (\"%s\", gbuf, %s); returned a remnant of \"%s\" instead of \"%s\"\n", t->function_name, input, end_char_string, remainder, d->expected_result); } remainder = d->expected_result; } input = remainder; ++d; if ((*input != '\0') && (d->expected_result == NULL)) return sim_messagef (SCPE_IERR, "Invalid test configuration detected\n"); } ++t; } if (sim_switches & SWMASK ('T')) sim_messagef (SCPE_OK, "test_scp_parsing - done\n"); return result; } static t_stat sim_scp_svc (UNIT *uptr) { sim_printf ("Unit %s fired at %.0f\n", sim_uname (uptr), sim_gtime ()); return SCPE_OK; } static t_stat test_scp_event_sequencing () { DEVICE *dptr = &sim_scp_dev; uint32 i; int active; t_stat r = SCPE_OK; int32 start_deb_switches = sim_set_deb_switches (0); sim_set_deb_switches (SWMASK ('F')); sim_scp_dev.dctrl = 0xFFFFFFFF; /* reset queue */ while (sim_clock_queue != QUEUE_LIST_END) sim_cancel (sim_clock_queue); sim_time = sim_rtime = 0; noqueue_time = sim_interval = 0; /* queue test unit events */ for (i = 0; i < dptr->numunits; i++) { dptr->units[i].action = sim_scp_svc; /* connect the action routine to the unit */ r = sim_activate (&dptr->units[i], i); if (SCPE_OK != r) return sim_messagef (SCPE_IERR, "sim_activate() unexpected result: %s\n", sim_error_text (r)); } /* check test unit events */ for (i = 0; i < dptr->numunits; i++) { int32 t = sim_activate_time (&dptr->units[i]); if (t != i + 1) return sim_messagef (SCPE_IERR, "sim_activate_time() unexpected result for unit %d: %d\n", i, t); } sim_printf ("sim_interval = %d, sim_gtime = %.0f\n", sim_interval, sim_gtime ()); /* check test unit events with negative sim_interval */ sim_interval = -((int32)dptr->numunits); sim_printf ("sim_interval = %d, sim_gtime = %.0f\n", sim_interval, sim_gtime ()); for (i = 0; i < dptr->numunits; i++) { int32 t = sim_activate_time (&dptr->units[i]); if (t != i + 1) return sim_messagef (SCPE_IERR, "sim_activate_time() unexpected result for unit %d: %d\n", i, t); } r = sim_process_event (); if (r != SCPE_OK) return sim_messagef (SCPE_IERR, "sim_process_event() unexpected result: %s\n", sim_error_text (r)); sim_printf ("after sim_process_event() sim_interval = %d, sim_gtime = %.0f\n", sim_interval, sim_gtime ()); /* check to make sure that all units have fired */ for (i = 0; i < dptr->numunits; i++) { int32 t = sim_activate_time (&dptr->units[i]); if (t != 0) return sim_messagef (SCPE_IERR, "sim_activate_time() unexpected result for unit %d: %d\n", i, t); } /* queue test unit events again with an offset of 1 */ for (i = 0; i < dptr->numunits; i++) { r = sim_activate (&dptr->units[i], i + 1); if (SCPE_OK != r) return sim_messagef (SCPE_IERR, "sim_activate() unexpected result: %s\n", sim_error_text (r)); } /* try to process events without advancing sim_interval */ r = sim_process_event (); if (r != SCPE_OK) return sim_messagef (SCPE_IERR, "sim_process_event() unexpected result: %s\n", sim_error_text (r)); for (i = 0, active = 0; i < dptr->numunits; i++) { if (sim_is_active (&dptr->units[i])) ++active; } if (active != dptr->numunits) return sim_messagef (SCPE_IERR, "unexpected count %d of active/queued units - expected %d\n", active, (int)dptr->numunits); /* advance sim_interval by an amount that should leave one event queued next time */ sim_interval = -((int32)dptr->numunits - 1); r = sim_process_event (); if (r != SCPE_OK) return sim_messagef (SCPE_IERR, "sim_process_event() unexpected result: %s\n", sim_error_text (r)); for (i = 0, active = 0; i < dptr->numunits; i++) { if (sim_is_active (&dptr->units[i])) ++active; } if (active != 1) return sim_messagef (SCPE_IERR, "unexpected count %d of active/queued units - expected %d\n", active, 1); r = sim_activate_after (dptr->units, 10); if (r != SCPE_OK) return sim_messagef (SCPE_IERR, "sim_activate_after() unexpected result: %s\n", sim_error_text (r)); sim_interval = -1; /* This should cover the remaining event on the last unit from above and leave the timer based one */ r = sim_process_event (); if (r != SCPE_OK) return sim_messagef (SCPE_IERR, "sim_process_event() unexpected result: %s\n", sim_error_text (r)); for (i = 0, active = 0; i < dptr->numunits; i++) { if (sim_is_active (&dptr->units[i])) ++active; } if (active != 1) return sim_messagef (SCPE_IERR, "unexpected count %d of active/queued units - expected %d\n", active, 1); sim_set_deb_switches (start_deb_switches); return r; } /* * Compiled in unit tests for the various device oriented library * modules: sim_card, sim_disk, sim_tape, sim_ether, sim_tmxr, etc. */ t_stat test_lib_cmd (int32 flag, CONST char *cptr) { int i; DEVICE *dptr; int32 saved_switches = sim_switches & ~SWMASK ('T'); t_stat stat = SCPE_OK; char gbuf[CBUFSIZE]; GET_SWITCHES (cptr); /* get switches */ saved_switches |= sim_switches; if (sim_time != 0.0) return sim_messagef (SCPE_UNK, "Library tests can not be performed after instructions have been executed.\n"); sim_switches = 0; detach_all (0, 0); /* Assure that all units are unattached */ sim_switches = saved_switches; cptr = get_glyph (cptr, gbuf, 0); if (gbuf[0] == '\0') strcpy (gbuf, "ALL"); if ((strcmp (gbuf, "ALL") != 0) && (strcmp (gbuf, "SCP") != 0)) { if (!find_dev (gbuf)) return sim_messagef (SCPE_ARG, "No such device: %s\n", gbuf); } GET_SWITCHES (cptr); /* get extra switches after a device specifier */ saved_switches |= sim_switches; if (sim_switches & SWMASK ('D')) { sim_switches &= ~(SWMASK ('D') | SWMASK ('R') | SWMASK ('F') | SWMASK ('T')); sim_set_debon (0, "STDOUT"); sim_switches = saved_switches; } if ((strcmp (gbuf, "ALL") == 0) || (strcmp (gbuf, "SCP") == 0)) { if (test_scp_parsing () != SCPE_OK) return sim_messagef (SCPE_IERR, "SCP parsing test failed\n"); if (test_scp_event_sequencing () != SCPE_OK) return sim_messagef (SCPE_IERR, "SCP event sequencing test failed\n"); } for (i = 0; (dptr = sim_devices[i]) != NULL; i++) { t_stat tstat = SCPE_OK; t_bool was_disabled = ((dptr->flags & DEV_DIS) != 0); if ((strcmp (gbuf, "ALL") != 0) && (strcmp (gbuf, dptr->name) != 0)) continue; if (DEV_TYPE(dptr) == 0) { sim_printf ("Skipping %s - non library device type\n", dptr->name); continue; /* skip unspecified devices */ } sim_switches = saved_switches; if (was_disabled) tstat = set_dev_enbdis (dptr, NULL, 1, NULL); if (tstat == SCPE_OK) { switch (DEV_TYPE(dptr)) { #if defined(USE_SIM_CARD) case DEV_CARD: tstat = sim_card_test (dptr); break; #endif case DEV_DISK: tstat = sim_disk_test (dptr); break; case DEV_ETHER: tstat = sim_ether_test (dptr); break; case DEV_TAPE: tstat = sim_tape_test (dptr); break; case DEV_MUX: tstat = tmxr_sock_test (dptr); break; default: break; } if (was_disabled) set_dev_enbdis (dptr, NULL, 0, NULL); } else tstat = SCPE_OK; /* can't enable, just skip device */ if (tstat != SCPE_OK) { stat = tstat; sim_printf ("%s device tests returned: %d - %s\n", dptr->name, SCPE_BARE_STATUS (tstat), sim_error_text (tstat)); if (sim_ttisatty()) { if (get_yn ("Continue with additional tests? [N] ", SCPE_STOP) == SCPE_STOP) break; } else break; } } return stat; } |
︙ | ︙ | |||
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | t_stat show_cmd (int32 flag, CONST char *ptr); t_stat set_default_cmd (int32 flg, CONST char *cptr); t_stat pwd_cmd (int32 flg, CONST char *cptr); t_stat dir_cmd (int32 flg, CONST char *cptr); t_stat type_cmd (int32 flg, CONST char *cptr); t_stat delete_cmd (int32 flg, CONST char *cptr); t_stat copy_cmd (int32 flg, CONST char *cptr); t_stat brk_cmd (int32 flag, CONST char *ptr); t_stat do_cmd (int32 flag, CONST char *ptr); t_stat goto_cmd (int32 flag, CONST char *ptr); t_stat return_cmd (int32 flag, CONST char *ptr); t_stat shift_cmd (int32 flag, CONST char *ptr); t_stat call_cmd (int32 flag, CONST char *ptr); t_stat on_cmd (int32 flag, CONST char *ptr); t_stat noop_cmd (int32 flag, CONST char *ptr); t_stat assert_cmd (int32 flag, CONST char *ptr); t_stat send_cmd (int32 flag, CONST char *ptr); t_stat expect_cmd (int32 flag, CONST char *ptr); t_stat sleep_cmd (int32 flag, CONST char *ptr); t_stat help_cmd (int32 flag, CONST char *ptr); t_stat screenshot_cmd (int32 flag, CONST char *ptr); t_stat spawn_cmd (int32 flag, CONST char *ptr); t_stat echo_cmd (int32 flag, CONST char *ptr); t_stat echof_cmd (int32 flag, CONST char *ptr); t_stat debug_cmd (int32 flag, CONST char *ptr); /* Allow compiler to help validate printf style format arguments */ #if !defined __GNUC__ #define GCC_FMT_ATTR(n, m) #endif #if !defined(GCC_FMT_ATTR) #define GCC_FMT_ATTR(n, m) __attribute__ ((format (__printf__, n, m))) | > > > > > > > | 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | t_stat show_cmd (int32 flag, CONST char *ptr); t_stat set_default_cmd (int32 flg, CONST char *cptr); t_stat pwd_cmd (int32 flg, CONST char *cptr); t_stat dir_cmd (int32 flg, CONST char *cptr); t_stat type_cmd (int32 flg, CONST char *cptr); t_stat delete_cmd (int32 flg, CONST char *cptr); t_stat copy_cmd (int32 flg, CONST char *cptr); t_stat rename_cmd (int32 flg, CONST char *cptr); t_stat mkdir_cmd (int32 flg, CONST char *cptr); t_stat rmdir_cmd (int32 flg, CONST char *cptr); t_stat brk_cmd (int32 flag, CONST char *ptr); t_stat do_cmd (int32 flag, CONST char *ptr); t_stat goto_cmd (int32 flag, CONST char *ptr); t_stat return_cmd (int32 flag, CONST char *ptr); t_stat shift_cmd (int32 flag, CONST char *ptr); t_stat call_cmd (int32 flag, CONST char *ptr); t_stat on_cmd (int32 flag, CONST char *ptr); t_stat noop_cmd (int32 flag, CONST char *ptr); t_stat assert_cmd (int32 flag, CONST char *ptr); t_stat send_cmd (int32 flag, CONST char *ptr); t_stat expect_cmd (int32 flag, CONST char *ptr); t_stat sleep_cmd (int32 flag, CONST char *ptr); t_stat help_cmd (int32 flag, CONST char *ptr); t_stat screenshot_cmd (int32 flag, CONST char *ptr); t_stat spawn_cmd (int32 flag, CONST char *ptr); t_stat echo_cmd (int32 flag, CONST char *ptr); t_stat echof_cmd (int32 flag, CONST char *ptr); t_stat debug_cmd (int32 flag, CONST char *ptr); t_stat runlimit_cmd (int32 flag, CONST char *ptr); t_stat tar_cmd (int32 flag, CONST char *ptr); t_stat curl_cmd (int32 flag, CONST char *ptr); t_stat test_lib_cmd (int32 flag, CONST char *ptr); /* Allow compiler to help validate printf style format arguments */ #if !defined __GNUC__ #define GCC_FMT_ATTR(n, m) #endif #if !defined(GCC_FMT_ATTR) #define GCC_FMT_ATTR(n, m) __attribute__ ((format (__printf__, n, m))) |
︙ | ︙ | |||
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | t_stat _sim_activate_after (UNIT *uptr, double usecs_walltime); t_stat sim_activate_after_abs (UNIT *uptr, uint32 usecs_walltime); t_stat sim_activate_after_abs_d (UNIT *uptr, double usecs_walltime); t_stat _sim_activate_after_abs (UNIT *uptr, double usecs_walltime); t_stat sim_cancel (UNIT *uptr); t_bool sim_is_active (UNIT *uptr); int32 sim_activate_time (UNIT *uptr); int32 _sim_activate_time (UNIT *uptr); double sim_activate_time_usecs (UNIT *uptr); t_stat sim_run_boot_prep (int32 flag); double sim_gtime (void); uint32 sim_grtime (void); int32 sim_qcount (void); t_stat attach_unit (UNIT *uptr, CONST char *cptr); t_stat detach_unit (UNIT *uptr); t_stat assign_device (DEVICE *dptr, const char *cptr); t_stat deassign_device (DEVICE *dptr); t_stat reset_all (uint32 start_device); t_stat reset_all_p (uint32 start_device); const char *sim_dname (DEVICE *dptr); const char *sim_uname (UNIT *dptr); const char *sim_set_uname (UNIT *uptr, const char *uname); t_stat get_yn (const char *ques, t_stat deflt); | > > > < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | t_stat _sim_activate_after (UNIT *uptr, double usecs_walltime); t_stat sim_activate_after_abs (UNIT *uptr, uint32 usecs_walltime); t_stat sim_activate_after_abs_d (UNIT *uptr, double usecs_walltime); t_stat _sim_activate_after_abs (UNIT *uptr, double usecs_walltime); t_stat sim_cancel (UNIT *uptr); t_bool sim_is_active (UNIT *uptr); int32 sim_activate_time (UNIT *uptr); int32 _sim_activate_queue_time (UNIT *uptr); int32 _sim_activate_time (UNIT *uptr); double sim_activate_time_usecs (UNIT *uptr); t_stat sim_run_boot_prep (int32 flag); double sim_gtime (void); uint32 sim_grtime (void); int32 sim_qcount (void); t_stat attach_unit (UNIT *uptr, CONST char *cptr); t_stat detach_unit (UNIT *uptr); t_stat assign_device (DEVICE *dptr, const char *cptr); t_stat deassign_device (DEVICE *dptr); t_stat reset_all (uint32 start_device); t_stat reset_all_p (uint32 start_device); t_stat set_writelock (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat show_writelock (FILE *st, UNIT *uptr, int32 val, CONST void *desc); const char *sim_dname (DEVICE *dptr); const char *sim_uname (UNIT *dptr); const char *sim_set_uname (UNIT *uptr, const char *uname); t_stat get_yn (const char *ques, t_stat deflt); void sim_srand (unsigned int seed); int sim_rand (void); #ifdef RAND_MAX #undef RAND_MAX #endif #define RAND_MAX 2147483646 #define rand sim_rand |
︙ | ︙ | |||
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 | int sim_cmp_string (const char *s1, const char *s2); t_stat show_version (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat set_dev_debug (DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_dev_debug (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat sim_add_debug_flags (DEVICE *dptr, DEBTAB *debflags); const char *sim_error_text (t_stat stat); t_stat sim_string_to_stat (const char *cptr, t_stat *cond); t_stat sim_cancel_step (void); void sim_printf (const char *fmt, ...) GCC_FMT_ATTR(1, 2); void sim_perror (const char *msg); t_stat sim_messagef (t_stat stat, const char *fmt, ...) GCC_FMT_ATTR(2, 3); void sim_data_trace(DEVICE *dptr, UNIT *uptr, const uint8 *data, const char *position, size_t len, const char *txt, uint32 reason); void sim_debug_bits_hdr (uint32 dbits, DEVICE* dptr, const char *header, BITFIELD* bitdefs, uint32 before, uint32 after, int terminate); void sim_debug_bits (uint32 dbits, DEVICE* dptr, BITFIELD* bitdefs, uint32 before, uint32 after, int terminate); #if defined (__DECC) && defined (__VMS) && (defined (__VAX) || (__DECC_VER < 60590001)) #define CANT_USE_MACRO_VA_ARGS 1 #endif #ifdef CANT_USE_MACRO_VA_ARGS #define _sim_debug_device sim_debug void sim_debug (uint32 dbits, DEVICE* dptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4); #define _sim_debug_unit sim_debug_unit | > | | | | 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 | int sim_cmp_string (const char *s1, const char *s2); t_stat show_version (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat set_dev_debug (DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat show_dev_debug (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_stat sim_add_debug_flags (DEVICE *dptr, DEBTAB *debflags); const char *sim_error_text (t_stat stat); t_stat sim_string_to_stat (const char *cptr, t_stat *cond); t_stat sim_sched_step (void); t_stat sim_cancel_step (void); void sim_printf (const char *fmt, ...) GCC_FMT_ATTR(1, 2); void sim_perror (const char *msg); t_stat sim_messagef (t_stat stat, const char *fmt, ...) GCC_FMT_ATTR(2, 3); void sim_data_trace(DEVICE *dptr, UNIT *uptr, const uint8 *data, const char *position, size_t len, const char *txt, uint32 reason); void sim_debug_bits_hdr (uint32 dbits, DEVICE* dptr, const char *header, BITFIELD* bitdefs, uint32 before, uint32 after, int terminate); void sim_debug_bits (uint32 dbits, DEVICE* dptr, BITFIELD* bitdefs, uint32 before, uint32 after, int terminate); #if defined (__DECC) && defined (__VMS) && (defined (__VAX) || (__DECC_VER < 60590001)) #define CANT_USE_MACRO_VA_ARGS 1 #endif #ifdef CANT_USE_MACRO_VA_ARGS #define _sim_debug_device sim_debug void sim_debug (uint32 dbits, DEVICE* dptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4); #define _sim_debug_unit sim_debug_unit void sim_debug_unit (uint32 dbits, UNIT* uptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4); #else void _sim_debug_unit (uint32 dbits, UNIT *uptr, const char* fmt, ...) GCC_FMT_ATTR(3, 4); void _sim_debug_device (uint32 dbits, DEVICE* dptr, const char* fmt, ...) GCC_FMT_ATTR(3, 4); #define sim_debug(dbits, dptr, ...) do { if ((sim_deb != NULL) && ((dptr) != NULL) && ((dptr)->dctrl & (dbits))) _sim_debug_device (dbits, dptr, __VA_ARGS__);} while (0) #define sim_debug_unit(dbits, uptr, ...) do { if ((sim_deb != NULL) && ((uptr) != NULL) && (uptr->dptr != NULL) && (((uptr)->dctrl | (uptr)->dptr->dctrl) & (dbits))) _sim_debug_unit (dbits, uptr, __VA_ARGS__);} while (0) #endif void sim_flush_buffered_files (void); void fprint_stopped_gen (FILE *st, t_stat v, REG *pc, DEVICE *dptr); #define SCP_HELP_FLAT (1u << 31) /* Force flat help when prompting is not possible */ #define SCP_HELP_ONECMD (1u << 30) /* Display one topic, do not prompt */ #define SCP_HELP_ATTACH (1u << 29) /* Top level topic is ATTACH help */ |
︙ | ︙ | |||
354 355 356 357 358 359 360 361 362 363 364 365 366 367 | extern DEVICE *sim_dflt_dev; extern DEVICE *sim_dfdev; extern UNIT *sim_dfunit; extern int32 sim_interval; extern int32 sim_switches; extern int32 sim_switch_number; extern int32 sim_quiet; extern int32 sim_step; extern t_stat sim_last_cmd_stat; /* Command Status */ extern FILE *sim_log; /* log file */ extern FILEREF *sim_log_ref; /* log file file reference */ extern FILE *sim_deb; /* debug file */ extern FILEREF *sim_deb_ref; /* debug file file reference */ | > > > > > > > > > | 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 | extern DEVICE *sim_dflt_dev; extern DEVICE *sim_dfdev; extern UNIT *sim_dfunit; extern int32 sim_interval; extern int32 sim_switches; extern int32 sim_switch_number; #define GET_SWITCHES(cp) \ if ((cp = get_sim_sw (cp)) == NULL) return SCPE_INVSW #define GET_RADIX(val,dft) \ if (sim_switches & SWMASK ('O')) val = 8; \ else if (sim_switches & SWMASK ('D')) val = 10; \ else if (sim_switches & SWMASK ('H')) val = 16; \ else if ((sim_switch_number >= 2) && (sim_switch_number <= 36)) val = sim_switch_number; \ else val = dft; extern int32 sim_show_message; extern int32 sim_quiet; extern int32 sim_step; extern t_stat sim_last_cmd_stat; /* Command Status */ extern FILE *sim_log; /* log file */ extern FILEREF *sim_log_ref; /* log file file reference */ extern FILE *sim_deb; /* debug file */ extern FILEREF *sim_deb_ref; /* debug file file reference */ |
︙ | ︙ | |||
381 382 383 384 385 386 387 | extern t_value *sim_eval; extern volatile t_bool stop_cpu; extern uint32 sim_brk_types; /* breakpoint info */ extern uint32 sim_brk_dflt; extern uint32 sim_brk_summ; extern uint32 sim_brk_match_type; extern t_addr sim_brk_match_addr; | | > > > | | > > > > > > > > > > > > > | | > | < | 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 | extern t_value *sim_eval; extern volatile t_bool stop_cpu; extern uint32 sim_brk_types; /* breakpoint info */ extern uint32 sim_brk_dflt; extern uint32 sim_brk_summ; extern uint32 sim_brk_match_type; extern t_addr sim_brk_match_addr; extern BRKTYPTAB *sim_brk_type_desc; /* type descriptions */ extern const char *sim_prog_name; /* executable program name */ extern FILE *stdnul; extern t_bool sim_asynch_enabled; #if defined(SIM_ASYNCH_IO) int sim_aio_update_queue (void); void sim_aio_activate (ACTIVATE_API caller, UNIT *uptr, int32 event_time); #endif /* VM interface */ extern char sim_name[64]; extern const char *sim_vm_release; extern const char *sim_vm_release_message; extern DEVICE *sim_devices[]; extern REG *sim_PC; extern const char *sim_stop_messages[SCPE_BASE]; extern t_stat sim_instr (void); extern t_stat sim_load (FILE *ptr, CONST char *cptr, CONST char *fnam, int flag); extern int32 sim_emax; extern t_stat fprint_sym (FILE *ofile, t_addr addr, t_value *val, UNIT *uptr, int32 sw); extern t_stat parse_sym (CONST char *cptr, t_addr addr, UNIT *uptr, t_value *val, int32 sw); /* The per-simulator init routine is a weak global that defaults to NULL The other per-simulator pointers can be overrriden by the init routine extern void (*sim_vm_init) (void); This routine is no longer invoked this way since it doesn't work reliably on all simh supported compile environments. A simulator that needs these initializations can perform them in the CPU device reset routine which will always be called before anything else can be processed. */ extern char *(*sim_vm_read) (char *ptr, int32 size, FILE *stream); extern void (*sim_vm_post) (t_bool from_scp); extern CTAB *sim_vm_cmd; extern void (*sim_vm_sprint_addr) (char *buf, DEVICE *dptr, t_addr addr); extern void (*sim_vm_fprint_addr) (FILE *st, DEVICE *dptr, t_addr addr); extern t_addr (*sim_vm_parse_addr) (DEVICE *dptr, CONST char *cptr, CONST char **tptr); extern t_bool (*sim_vm_fprint_stopped) (FILE *st, t_stat reason); extern t_value (*sim_vm_pc_value) (void); extern t_bool (*sim_vm_is_subroutine_call) (t_addr **ret_addrs); extern void (*sim_vm_reg_update) (REG *rptr, uint32 idx, t_value prev_val, t_value new_val); extern const char **sim_clock_precalibrate_commands; extern int32 sim_vm_initial_ips; /* base estimate of simulated instructions per second */ extern const char *sim_vm_interval_units; /* Simulator can change this - default "instructions" */ extern const char *sim_vm_step_unit; /* Simulator can change this - default "instruction" */ /* Core SCP libraries can potentially have unit test routines. These defines help implement consistent unit test functionality */ #define SIM_TEST_INIT \ volatile int test_stat; \ const char *volatile sim_test; \ jmp_buf sim_test_env; \ if ((test_stat = setjmp (sim_test_env))) { \ sim_printf ("Error: %d - '%s' processing: %s\n", \ SCPE_BARE_STATUS(test_stat), \ sim_error_text(test_stat), sim_test); \ return test_stat; \ } #define SIM_TEST(_stat) \ do { \ if (SCPE_OK != (test_stat = (_stat))) { \ sim_test = #_stat; \ longjmp (sim_test_env, test_stat); \ |
︙ | ︙ |
︙ | ︙ | |||
48 49 50 51 52 53 54 55 56 57 58 59 60 61 | First char has bit 7 set. Rest set to 0. Bit 6 is odd parity. Bit 5-0 of first character are top 6 bits of card. Bit 5-0 of second character are lower 6 bits of card. For autodetection of card format, there can be no parity errors. All undeterminate formats are treated as ASCII. Auto output format is ASCII if card has only printable characters or card format binary. The card module uses up7 to hold a buffer for the card being translated | > > > > > > > > > > > > > | 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | First char has bit 7 set. Rest set to 0. Bit 6 is odd parity. Bit 5-0 of first character are top 6 bits of card. Bit 5-0 of second character are lower 6 bits of card. ASCII mode recognizes some additional forms of input which allows the intermixing of binary cards with text cards. Lines beginning with ~raw are taken as a number of 4 digit octal values with represent each column of the card from 12 row down to 9 row. If there is not enough octal numbers to span a full card the remainder of the card will not be punched. Also ~eor, will generate a 7/8/9 punch card. An ~eof will gernerate a 6/7/9 punch card, and a ~eoi will generate a 6/7/8/9 punch. A single line of ~ will set the EOF flag when that card is read. For autodetection of card format, there can be no parity errors. All undeterminate formats are treated as ASCII. Auto output format is ASCII if card has only printable characters or card format binary. The card module uses up7 to hold a buffer for the card being translated |
︙ | ︙ | |||
136 137 138 139 140 141 142 | /* ` a b c d e f g */ 0x212, 0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04, /* 140 - 177 */ /* h i j k l m n o */ 0xA02, 0xA01, 0xD00, 0xC80, 0xC40, 0xC20, 0xC10, 0xC08, /* p q r s t u v w */ 0xC04, 0xC02, 0xC01, 0x680, 0x640, 0x620, 0x610, 0x608, /* x y z { | } ~ del */ | | | | 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | /* ` a b c d e f g */ 0x212, 0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04, /* 140 - 177 */ /* h i j k l m n o */ 0xA02, 0xA01, 0xD00, 0xC80, 0xC40, 0xC20, 0xC10, 0xC08, /* p q r s t u v w */ 0xC04, 0xC02, 0xC01, 0x680, 0x640, 0x620, 0x610, 0x608, /* x y z { | } ~ del */ /* T79 X78 Y79 79 */ 0x604, 0x602, 0x601, 0x406, 0x806, 0x805, 0x005, 0xf000 }; /* Set for Burrough codes */ static const uint16 ascii_to_hol_029[128] = { /* Control */ 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, /*0-37*/ /*Control*/ |
︙ | ︙ | |||
160 161 162 163 164 165 166 | /* ( ) * + , - . / */ /* X58 Y58 Y48 X68 T38 Y X38 T1 */ 0x812, 0x412, 0x422, 0x80A, 0x242, 0x400, 0x842, 0x300, /* 0 1 2 3 4 5 6 7 */ /* T 1 2 3 4 5 6 7 */ 0x200, 0x100, 0x080, 0x040, 0x020, 0x010, 0x008, 0x004, /* 8 9 : ; < = > ? */ | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | > | 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 | /* ( ) * + , - . / */ /* X58 Y58 Y48 X68 T38 Y X38 T1 */ 0x812, 0x412, 0x422, 0x80A, 0x242, 0x400, 0x842, 0x300, /* 0 1 2 3 4 5 6 7 */ /* T 1 2 3 4 5 6 7 */ 0x200, 0x100, 0x080, 0x040, 0x020, 0x010, 0x008, 0x004, /* 8 9 : ; < = > ? */ /* 8 9 28 Y68 X48 68 T68 T78 */ 0x002, 0x001, 0x082, 0x40A, 0x822, 0x00A, 0x20A, 0x206, /* @ A B C D E F G */ /* 48 X1 X2 X3 X4 X5 X6 X7 */ 0x022, 0x900, 0x880, 0x840, 0x820, 0x810, 0x808, 0x804, /* 100 - 137 */ /* H I J K L M N O */ /* X8 X9 Y1 Y2 Y3 Y4 Y5 Y6 */ 0x802, 0x801, 0x500, 0x480, 0x440, 0x420, 0x410, 0x408, /* P Q R S T U V W */ /* Y7 Y8 Y9 T2 T3 T4 T5 T6 */ 0x404, 0x402, 0x401, 0x280, 0x240, 0x220, 0x210, 0x208, /* X Y Z [ \ ] ^ _ */ /* T7 T8 T9 TY028 T28 TY038 Y78 T58 */ 0x204, 0x202, 0x201, 0xE82, 0x282, 0xE42, 0x406, 0x212, /* ` a b c d e f g */ 0x102 ,0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04, /* 140 - 177 */ /* h i j k l m n o */ 0xA02, 0xA01, 0xD00, 0xC80, 0xC40, 0xC20, 0xC10, 0xC08, /* p q r s t u v w */ 0xC04, 0xC02, 0xC01, 0x680, 0x640, 0x620, 0x610, 0x608, /* x y z { | } ~ del */ /* Y78 X78 X79 XTY18 */ 0x604, 0x602, 0x601, 0x406, 0x806, 0x805, 0xF02,0xf000 }; /* Set for DEC 029 codes */ static const uint16 ascii_to_dec_029[128] = { /* Control */ 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, /*0-37*/ /*Control*/ 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, /*Control*/ 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, /*Control*/ 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, /* sp ! " # $ % & ' */ /* none Y28 78 38 Y38 T48 X 58 */ 0x000, 0x482, 0x006, 0x042, 0x442, 0x222, 0x800, 0x012, /* 40 - 77 */ /* ( ) * + , - . / */ /* X58 Y58 Y48 X68 T38 Y X38 T1 */ 0x812, 0x412, 0x422, 0x80A, 0x242, 0x400, 0x842, 0x300, /* 0 1 2 3 4 5 6 7 */ /* T 1 2 3 4 5 6 7 */ 0x200, 0x100, 0x080, 0x040, 0x020, 0x010, 0x008, 0x004, /* 8 9 : ; < = > ? */ /* 8 9 28 Y68 X48 68 T68 T78 */ 0x002, 0x001, 0x082, 0x40A, 0x822, 0x00A, 0x20A, 0x206, /* @ A B C D E F G */ /* 48 X1 X2 X3 X4 X5 X6 X7 */ 0x022, 0x900, 0x880, 0x840, 0x820, 0x810, 0x808, 0x804, /* 100 - 137 */ /* H I J K L M N O */ /* X8 X9 Y1 Y2 Y3 Y4 Y5 Y6 */ 0x802, 0x801, 0x500, 0x480, 0x440, 0x420, 0x410, 0x408, /* P Q R S T U V W */ /* Y7 Y8 Y9 T2 T3 T4 T5 T6 */ 0x404, 0x402, 0x401, 0x280, 0x240, 0x220, 0x210, 0x208, /* X Y Z [ \ ] ^ _ */ /* T7 T8 T9 X28 Y78 T28 X78 T58 */ 0x204, 0x202, 0x201, 0x882, 0x406, 0x282, 0x806, 0x212, /* ` a b c d e f g */ 0x102 ,0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04, /* 140 - 177 */ /* h i j k l m n o */ 0xA02, 0xA01, 0xD00, 0xC80, 0xC40, 0xC20, 0xC10, 0xC08, /* p q r s t u v w */ 0xC04, 0xC02, 0xC01, 0x680, 0x640, 0x620, 0x610, 0x608, /* x y z { | } ~ del */ /* XT XY YT YT1 */ 0x604, 0x602, 0x601, 0xA00, 0xC00, 0x600, 0x700,0xf000 }; static const uint16 ascii_to_hol_ebcdic[128] = { /* Control */ 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, /*0-37*/ /*Control*/ 0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000,0xf000, /*Control*/ |
︙ | ︙ | |||
216 217 218 219 220 221 222 | /* H I J K L M N O */ /* X8 X9 Y1 Y2 Y3 Y4 Y5 Y6 */ 0x802, 0x801, 0x500, 0x480, 0x440, 0x420, 0x410, 0x408, /* P Q R S T U V W */ /* Y7 Y8 Y9 T2 T3 T4 T5 T6 */ 0x404, 0x402, 0x401, 0x280, 0x240, 0x220, 0x210, 0x208, /* X Y Z [ \ ] ^ _ */ | | | | | | 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 | /* H I J K L M N O */ /* X8 X9 Y1 Y2 Y3 Y4 Y5 Y6 */ 0x802, 0x801, 0x500, 0x480, 0x440, 0x420, 0x410, 0x408, /* P Q R S T U V W */ /* Y7 Y8 Y9 T2 T3 T4 T5 T6 */ 0x404, 0x402, 0x401, 0x280, 0x240, 0x220, 0x210, 0x208, /* X Y Z [ \ ] ^ _ */ /* T7 T8 T9 X28 X68 Y28 Y78 X58 */ 0x204, 0x202, 0x201, 0x882, 0x20A, 0x482, 0x406, 0x212, /* ` a b c d e f g */ 0x102, 0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04, /* 140 - 177 */ /* h i j k l m n o */ 0xA02, 0xA01, 0xD00, 0xC80, 0xC40, 0xC20, 0xC10, 0xC08, /* p q r s t u v w */ 0xC04, 0xC02, 0xC01, 0x680, 0x640, 0x620, 0x610, 0x608, /* x y z { | } ~ del */ /* X18 X78 Y18 XYT18 */ 0x604, 0x602, 0x601, 0x902, 0x806, 0x502, 0xF02,0xf000 }; const char sim_ascii_to_six[128] = { /* Control */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0 - 37 */ /* Control */ -1, -1, -1, -1, -1, -1, -1, -1, |
︙ | ︙ | |||
265 266 267 268 269 270 271 | /* p q r s t u v w */ 047, 050, 051, 022, 023, 024, 025, 026, /* x y z { | } ~ del*/ 027, 030, 031, 057, 077, 017, -1, -1 }; static uint16 ebcdic_to_hol[256] = { | | | | | | | | 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 | /* p q r s t u v w */ 047, 050, 051, 022, 023, 024, 025, 026, /* x y z { | } ~ del*/ 027, 030, 031, 057, 077, 017, -1, -1 }; static uint16 ebcdic_to_hol[256] = { /* T918 T91 T92 T93 T94 T95 T96 T97 0x0x */ 0xB03, 0x901, 0x881, 0x841, 0x821, 0x811, 0x809, 0x805, /* T98, T189 , T289, T389, T489, T589, T689, T789 */ 0x803, 0x903, 0x883, 0x843, 0x823, 0x813, 0x80B, 0x807, /* TE189 E91 E92 E93 E94 E95 E96 E97 0x1x */ 0xD03, 0x501, 0x481, 0x441, 0x421, 0x411, 0x409, 0x405, /* E98 E918 E928 E938 E948 E958 E968 E978 */ 0x403, 0x503, 0x483, 0x443, 0x423, 0x413, 0x40B, 0x407, /* E0918 091 092 093 094 095 096 097 0x2x */ 0x703, 0x301, 0x281, 0x241, 0x221, 0x211, 0x209, 0x205, /* 098 0918 0928 0938 0948 0958 0968 0978 */ 0x203, 0x303, 0x283, 0x243, 0x223, 0x213, 0x20B, 0x207, /* TE0918 91 92 93 94 95 96 97 0x3x */ 0xF03, 0x101, 0x081, 0x041, 0x021, 0x011, 0x009, 0x005, /* 98 189 289 389 489 589 689 789 */ 0x003, 0x103, 0x083, 0x043, 0x023, 0x013, 0x00B, 0x007, /* T091 T092 T093 T094 T095 T096 T097 0x4x */ 0x000, 0xB01, 0xA81, 0xA41, 0xA21, 0xA11, 0xA09, 0xA05, /* T098 T18 T28 T38 T48 T58 T68 T78 */ 0xA03, 0x902, 0x882, 0x842, 0x822, 0x812, 0x80A, 0x806, /* T TE91 TE92 TE93 TE94 TE95 TE96 TE97 0x5x */ 0x800, 0xD01, 0xC81, 0xC41, 0xC21, 0xC11, 0xC09, 0xC05, /* TE98 E18 E28 E38 E48 E58 E68 E78 */ 0xC03, 0x502, 0x482, 0x442, 0x422, 0x412, 0x40A, 0x406, /* E 01 E092 E093 E094 E095 E096 E097 0x6x */ 0x400, 0x300, 0x681, 0x641, 0x621, 0x611, 0x609, 0x605, /* E098 018 TE 038 048 68 068 078 */ 0x603, 0x302, 0xC00, 0x242, 0x222, 0x212, 0x20A, 0x206, /* TE0 TE091 TE092 TE093 TE094 TE095 TE096 TE097 0x7x */ 0xE00, 0xF01, 0xE81, 0xE41, 0xE21, 0xE11, 0xE09, 0xE05, |
︙ | ︙ | |||
313 314 315 316 317 318 319 | 0x702, 0x700, 0x680, 0x640, 0x620, 0x610, 0x608, 0x604, /* E08 E09 E028 E038 E048 E058 E068 E078 */ 0x602, 0x601, 0x682, 0x642, 0x622, 0x612, 0x60A, 0x606, /* TE018 TE01 TE02 TE03 TE04 TE05 TE06 TE07 0xbx */ 0xF02, 0xF00, 0xE80, 0xE40, 0xE20, 0xE10, 0xE08, 0xE04, /* TE08 TE09 TE028 TE038 TE048 TE058 TE068 TE078 */ 0xE02, 0xE01, 0xE82, 0xE42, 0xE22, 0xE12, 0xE0A, 0xE06, | | | | 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 | 0x702, 0x700, 0x680, 0x640, 0x620, 0x610, 0x608, 0x604, /* E08 E09 E028 E038 E048 E058 E068 E078 */ 0x602, 0x601, 0x682, 0x642, 0x622, 0x612, 0x60A, 0x606, /* TE018 TE01 TE02 TE03 TE04 TE05 TE06 TE07 0xbx */ 0xF02, 0xF00, 0xE80, 0xE40, 0xE20, 0xE10, 0xE08, 0xE04, /* TE08 TE09 TE028 TE038 TE048 TE058 TE068 TE078 */ 0xE02, 0xE01, 0xE82, 0xE42, 0xE22, 0xE12, 0xE0A, 0xE06, /* T0 T1 T2 T3 T4 T5 T6 T7 0xcx */ 0xA00, 0x900, 0x880, 0x840, 0x820, 0x810, 0x808, 0x804, /* T8 T9 T0928 T0938 T0948 T0958 T0968 T0978 */ 0x802, 0x801, 0xA83, 0xA43, 0xA23, 0xA13, 0xA0B, 0xA07, /* E0 E1 E2 E3 E4 E5 E6 E7 0xdx */ 0x600, 0x500, 0x480, 0x440, 0x420, 0x410, 0x408, 0x404, /* E8 E9 TE928 TE938 TE948 TE958 TE968 TE978 */ 0x402, 0x401, 0xC83, 0xC43, 0xC23, 0xC13, 0xC0B, 0xC07, /* 028 E091 02 03 04 05 06 07 0xex */ 0x282, 0x701, 0x280, 0x240, 0x220, 0x210, 0x208, 0x204, /* 08 09 E0928 E0938 E0948 E0958 E0968 E0978 */ 0x202, 0x201, 0x683, 0x643, 0x623, 0x613, 0x60B, 0x607, /* 0 1 2 3 4 5 6 7 0xfx */ 0x200, 0x100, 0x080, 0x040, 0x020, 0x010, 0x008, 0x004, /* 8 9 TE0928 TE0938 TE0948 TE0958 TE0968 TE0978 */ 0x002, 0x001, 0xE83, 0xE43, 0xE23, 0xE13, 0xE0B, 0xE07 }; |
︙ | ︙ | |||
595 596 597 598 599 600 601 | return 1; return 0; } struct _card_buffer { | | | | | | 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 | return 1; return 0; } struct _card_buffer { uint8 buffer[8192+500]; /* Buffer data */ int len; /* Amount of data in buffer */ int size; /* Size of last card read */ }; static int _cmpcard(const uint8 *p, const char *s) { int i; if (p[0] != '~') return 0; for(i = 0; i < 3; i++) { if (tolower(p[i+1]) != s[i]) return 0; } return 1; } t_stat _sim_parse_card(UNIT *uptr, DEVICE *dptr, struct _card_buffer *buf, uint16 (*image)[80]) { unsigned int mode; uint16 temp; int i; char c; int col; sim_debug(DEBUG_CARD, dptr, "Read card "); if ((uptr->flags & UNIT_CARD_MODE) == MODE_AUTO) { mode = MODE_TEXT; /* Default is text */ /* Check buffer to see if binary card in it. */ for (i = 0, temp = 0; i < 160 && i <buf->len; i+=2) temp |= (uint16)(buf->buffer[i] & 0xFF); /* Check if every other char < 16 & full buffer */ if ((temp & 0x0f) == 0 && i == 160) mode = MODE_BIN; /* Probably binary */ /* Check if maybe BCD or CBN */ if (buf->buffer[0] & 0x80) { int odd = 0; int even = 0; |
︙ | ︙ | |||
752 753 754 755 756 757 758 | default: case MODE_026: temp = ascii_to_hol_026[(int)c]; break; case MODE_029: temp = ascii_to_hol_029[(int)c]; break; | | | | 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 | default: case MODE_026: temp = ascii_to_hol_026[(int)c]; break; case MODE_029: temp = ascii_to_hol_029[(int)c]; break; case MODE_DEC29: temp = ascii_to_dec_029[(int)c]; break; } if (temp & 0xf000) (*image)[0] |= CARD_ERR; (*image)[col++] = temp & 0xfff; } } |
︙ | ︙ | |||
785 786 787 788 789 790 791 | sim_debug(DEBUG_CARD, dptr, "bin\n"); if (buf->len < 160) { (*image)[0] = CARD_ERR; return SCPE_OPENERR; } /* Move data to buffer */ for (col = i = 0; i < 160;) { | | | | | | 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 | sim_debug(DEBUG_CARD, dptr, "bin\n"); if (buf->len < 160) { (*image)[0] = CARD_ERR; return SCPE_OPENERR; } /* Move data to buffer */ for (col = i = 0; i < 160;) { temp |= (uint16)(buf->buffer[i] & 0xff); (*image)[col] = (buf->buffer[i++] >> 4) & 0xF; (*image)[col++] |= ((uint16)buf->buffer[i++] & 0xff) << 4; } /* Check if format error */ if (temp & 0xF) (*image)[0] |= CARD_ERR; break; case MODE_CBN: sim_debug(DEBUG_CARD, dptr, "cbn\n"); /* Check if first character is a tape mark */ if (buf->buffer[0] == 0217 && (buf->len == 1 || (buf->buffer[1] & 0200) != 0)) { i = 1; (*image)[0] |= CARD_EOF; break; } /* Clear record mark */ buf->buffer[0] &= 0x7f; |
︙ | ︙ | |||
840 841 842 843 844 845 846 | i++; } break; case MODE_BCD: sim_debug(DEBUG_CARD, dptr, "bcd ["); /* Check if first character is a tape mark */ | | | 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 | i++; } break; case MODE_BCD: sim_debug(DEBUG_CARD, dptr, "bcd ["); /* Check if first character is a tape mark */ if (buf->buffer[0] == 0217 && (buf->buffer[1] & 0200) != 0) { i = 1; (*image)[0] |= CARD_EOF; break; } /* Clear record mark */ buf->buffer[0] &= 0x7f; |
︙ | ︙ | |||
881 882 883 884 885 886 887 | case MODE_EBCDIC: sim_debug(DEBUG_CARD, dptr, "ebcdic\n"); if (buf->len < 80) (*image)[0] |= CARD_ERR; /* Move data to buffer */ for (i = 0; i < 80 && i < buf->len; i++) { | | | 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 | case MODE_EBCDIC: sim_debug(DEBUG_CARD, dptr, "ebcdic\n"); if (buf->len < 80) (*image)[0] |= CARD_ERR; /* Move data to buffer */ for (i = 0; i < 80 && i < buf->len; i++) { temp = (uint16)(buf->buffer[i]) & 0xFF; (*image)[i] = ebcdic_to_hol[temp]; } break; } buf->size = i; return SCPE_OK; |
︙ | ︙ | |||
927 928 929 930 931 932 933 | buf.len += l; } /* Allocate space for some more cards if needed */ if (data->hopper_cards >= data->hopper_size) { data->hopper_size += DECK_SIZE; data->images = (uint16 (*)[1][80])realloc(data->images, | | | | 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 | buf.len += l; } /* Allocate space for some more cards if needed */ if (data->hopper_cards >= data->hopper_size) { data->hopper_size += DECK_SIZE; data->images = (uint16 (*)[1][80])realloc(data->images, (size_t)data->hopper_size * sizeof(*(data->images))); memset(&data->images[data->hopper_cards], 0, (size_t)(data->hopper_size - data->hopper_cards) * sizeof(*(data->images))); } /* Process one card */ cards++; if (_sim_parse_card(uptr, dptr, &buf, &(*data->images)[data->hopper_cards]) != SCPE_OK) { |
︙ | ︙ | |||
957 958 959 960 961 962 963 | /* If there is an error, free just read deck */ if (r == SCPE_OK) { if (eof) { /* Allocate space for some more cards if needed */ if (data->hopper_cards >= data->hopper_size) { data->hopper_size += DECK_SIZE; data->images = (uint16 (*)[1][80])realloc(data->images, | | | | 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 | /* If there is an error, free just read deck */ if (r == SCPE_OK) { if (eof) { /* Allocate space for some more cards if needed */ if (data->hopper_cards >= data->hopper_size) { data->hopper_size += DECK_SIZE; data->images = (uint16 (*)[1][80])realloc(data->images, (size_t)data->hopper_size * sizeof(*(data->images))); memset(&data->images[data->hopper_cards], 0, (size_t)(data->hopper_size - data->hopper_cards) * sizeof(*(data->images))); } /* Create empty card */ (*data->images)[data->hopper_cards][0] = CARD_EOF; data->hopper_cards++; } |
︙ | ︙ | |||
1175 1176 1177 1178 1179 1180 1181 | t_stat sim_card_attach(UNIT * uptr, CONST char *cptr) { t_stat r = SCPE_OK; int eof = 0; struct card_context *data; char gbuf[30]; | | | | | | 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 | t_stat sim_card_attach(UNIT * uptr, CONST char *cptr) { t_stat r = SCPE_OK; int eof = 0; struct card_context *data; char gbuf[30]; unsigned int i; char *saved_filename; t_bool was_attached = (uptr->flags & UNIT_ATT); t_addr saved_pos; static int ebcdic_init = 0; if ((uptr->flags & UNIT_RO) && /* Attaching a Reader */ strchr (cptr, ',')) { /* Restoring Attach list of files? */ char tbuf[10*CBUFSIZE]; char *tptr = tbuf; int32 saved_switches = sim_switches; |
︙ | ︙ | |||
1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 | case 0: case MODE_026: temp = ascii_to_hol_026[i]; break; case MODE_029: temp = ascii_to_hol_029[i]; break; } if ((temp & 0xf000) == 0) { data->hol_to_ascii[temp] = i; } } if (uptr->flags & UNIT_RO) { /* Card Reader? */ | > > > | 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 | case 0: case MODE_026: temp = ascii_to_hol_026[i]; break; case MODE_029: temp = ascii_to_hol_029[i]; break; case MODE_DEC29: temp = ascii_to_dec_029[i]; break; } if ((temp & 0xf000) == 0) { data->hol_to_ascii[temp] = i; } } if (uptr->flags & UNIT_RO) { /* Card Reader? */ |
︙ | ︙ | |||
1295 1296 1297 1298 1299 1300 1301 | detach_unit(uptr); if (was_attached) { uptr->flags |= UNIT_ATT; uptr->filename = saved_filename; } if (r == SCPE_OK) { const char *fmt = "AUTO"; | | | | 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 | detach_unit(uptr); if (was_attached) { uptr->flags |= UNIT_ATT; uptr->filename = saved_filename; } if (r == SCPE_OK) { const char *fmt = "AUTO"; unsigned int mode = uptr->flags & UNIT_CARD_MODE; for (i = 0; fmts[i].name != 0; i++) { if (fmts[i].mode == mode) { fmt = fmts[i].name; break; } } uptr->flags |= UNIT_ATT; uptr->dynflags |= UNIT_ATTMULT; if (saved_filename) { uptr->filename = (char *)malloc (32 + strlen (cptr) + strlen (saved_filename)); sprintf (uptr->filename, "%s, %s-F %s %s", saved_filename, (eof)? "-E ": "", fmt, cptr); free(saved_filename); } else { uptr->filename = (char *)malloc (32 + strlen (cptr)); sprintf (uptr->filename, "%s-F %s %s", (eof)?"-E ": "", fmt, cptr); } r = sim_messagef(SCPE_OK, "%s: %d card Deck Loaded from %s\n", sim_uname(uptr), (int)(data->hopper_cards - previous_cards), cptr); } else { if (uptr->dynflags & UNIT_ATTMULT) uptr->flags |= UNIT_ATT; detach_unit(uptr); return r; } } |
︙ | ︙ | |||
1349 1350 1351 1352 1353 1354 1355 | return SCPE_OK; /* Already detached */ } return detach_unit(uptr); } t_stat sim_card_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { | > > > > > > > > > | > | > | | | | < > > | 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 | return SCPE_OK; /* Already detached */ } return detach_unit(uptr); } t_stat sim_card_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { uint32 i, readers = 0, punches = 0; for (i=0; i < dptr->numunits; ++i) if (dptr->units[i].flags & UNIT_ATTABLE) { readers += ((dptr->units[i].flags & UNIT_RO) != 0); punches += ((dptr->units[i].flags & UNIT_RO) == 0); } if (uptr == NULL) uptr = dptr->units; fprintf (st, "%s Card %s%s%sAttach Help\n\n", dptr->name, readers ? "Reader " : "", readers & punches ? "& " : "", punches ? "Punch ": ""); if (0 == (uptr-dptr->units)) { if (dptr->numunits > 1) { uint32 i; for (i=0; i < dptr->numunits; ++i) if (dptr->units[i].flags & UNIT_ATTABLE) fprintf (st, " sim> ATTACH {switches} %s carddeck%s\n", sim_uname (&dptr->units[i]), ((dptr->units[i].flags & UNIT_RO) != 0) ? "{,extra-cards,...}" : ""); fprintf (st, "\n"); } else fprintf (st, " sim> ATTACH {switches} %s carddeck%s\n\n", sim_uname (uptr), ((dptr->units[0].flags & UNIT_RO) != 0) ? "{,extra-cards,...}" : ""); } else fprintf (st, " sim> ATTACH {switches} %s carddeck%s\n\n", sim_uname (uptr), (readers > 0) ? "{,extra-cards,...}" : ""); fprintf (st, "Attach command switches\n"); fprintf (st, " -F Open the indicated card deck in a specific format (default\n"); fprintf (st, " is AUTO, alternatives are BIN, TEXT, BCD, CBN and EBCDIC)\n"); if (punches != 0) { fprintf (st, " -N Create a new punch output file (default is to append to\n"); fprintf (st, " an existing file if it exists)\n"); } if (readers != 0) { fprintf (st, " -E Return EOF after deck read\n"); fprintf (st, " -S Append deck to cards currently waiting to be read\n"); } return SCPE_OK; } static t_stat create_card_file (const char *filename, int cards) |
︙ | ︙ | |||
1395 1396 1397 1398 1399 1400 1401 | } #include <setjmp.h> t_stat sim_card_test (DEVICE *dptr) { t_stat stat = SCPE_OK; | | | 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 | } #include <setjmp.h> t_stat sim_card_test (DEVICE *dptr) { t_stat stat = SCPE_OK; #if defined(USE_SIM_CARD) && defined(SIM_CARD_API) && (SIM_MAJOR > 3) char cmd[CBUFSIZE]; char saved_filename[4*CBUFSIZE]; uint16 card_image[80]; SIM_TEST_INIT; if ((dptr->units->flags & UNIT_RO) == 0) /* Punch device? */ return SCPE_OK; |
︙ | ︙ | |||
1426 1427 1428 1429 1430 1431 1432 | SIM_TEST(attach_cmd (0, cmd)); sprintf (cmd, "%s -S File30.deck", dptr->name); SIM_TEST(attach_cmd (0, cmd)); sprintf (cmd, "%s -S -E File40.deck", dptr->name); SIM_TEST(attach_cmd (0, cmd)); sprintf (saved_filename, "%s %s", dptr->name, dptr->units->filename); show_cmd (0, dptr->name); | | | | | | | | | | 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 | SIM_TEST(attach_cmd (0, cmd)); sprintf (cmd, "%s -S File30.deck", dptr->name); SIM_TEST(attach_cmd (0, cmd)); sprintf (cmd, "%s -S -E File40.deck", dptr->name); SIM_TEST(attach_cmd (0, cmd)); sprintf (saved_filename, "%s %s", dptr->name, dptr->units->filename); show_cmd (0, dptr->name); sim_printf ("Input Hopper Count: %d\n", (int)sim_card_input_hopper_count(dptr->units)); sim_printf ("Output Hopper Count: %d\n", (int)sim_card_output_hopper_count(dptr->units)); while (!sim_card_eof (dptr->units)) SIM_TEST(sim_read_card (dptr->units, card_image)); sim_printf ("Input Hopper Count: %d\n", (int)sim_card_input_hopper_count(dptr->units)); sim_printf ("Output Hopper Count: %d\n", (int)sim_card_output_hopper_count(dptr->units)); sim_printf ("Detaching %s\n", dptr->name); SIM_TEST(detach_cmd (0, dptr->name)); show_cmd (0, dptr->name); sim_printf ("Input Hopper Count: %d\n", (int)sim_card_input_hopper_count(dptr->units)); sim_printf ("Output Hopper Count: %d\n", (int)sim_card_output_hopper_count(dptr->units)); sim_printf ("Attaching Saved Filenames: %s\n", saved_filename + strlen(dptr->name)); SIM_TEST(attach_cmd (0, saved_filename)); show_cmd (0, dptr->name); sim_printf ("Input Hopper Count: %d\n", (int)sim_card_input_hopper_count(dptr->units)); sim_printf ("Output Hopper Count: %d\n", (int)sim_card_output_hopper_count(dptr->units)); SIM_TEST(detach_cmd (0, dptr->name)); (void)remove ("file10.deck"); (void)remove ("file20.deck"); (void)remove ("file30.deck"); (void)remove ("file40.deck"); #endif /* defined(USE_SIM_CARD) && defined(SIM_CARD_API) */ return stat; |
︙ | ︙ |
︙ | ︙ | |||
50 51 52 53 54 55 56 57 58 59 60 61 62 63 | Bit 5-0 of first character are top 6 bits of card. Bit 5-0 of second character are lower 6 bits of card. For autodetection of BCD card format, there can be no parity errors. All undeterminate formats are treated as ASCII. Auto output format is ASCII if card has only printable characters or card format binary. */ #ifndef SIM_CARD_H_ #define SIM_CARD_H_ 0 | > > > > > > > > > > > > > | 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | Bit 5-0 of first character are top 6 bits of card. Bit 5-0 of second character are lower 6 bits of card. For autodetection of BCD card format, there can be no parity errors. All undeterminate formats are treated as ASCII. ASCII mode recognizes some additional forms of input which allows the intermixing of binary cards with text cards. Lines beginning with ~raw are taken as a number of 4 digit octal values with represent each column of the card from 12 row down to 9 row. If there is not enough octal numbers to span a full card the remainder of the card will not be punched. Also ~eor, will generate a 7/8/9 punch card. An ~eof will gernerate a 6/7/9 punch card, and a ~eoi will generate a 6/7/8/9 punch. A single line of ~ will set the EOF flag when that card is read. Auto output format is ASCII if card has only printable characters or card format binary. */ #ifndef SIM_CARD_H_ #define SIM_CARD_H_ 0 |
︙ | ︙ | |||
80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #define MODE_CBN (4 << UNIT_V_CARD_MODE) #define MODE_EBCDIC (5 << UNIT_V_CARD_MODE) #define MODE_OCTAL (6 << UNIT_V_CARD_MODE) /* Allow lower case letters */ #define MODE_LOWER (8 << UNIT_V_CARD_MODE) #define MODE_026 (0x10 << UNIT_V_CARD_MODE) #define MODE_029 (0x20 << UNIT_V_CARD_MODE) #define MODE_CHAR (0x70 << UNIT_V_CARD_MODE) /* Card Reader Return Status code */ typedef int t_cdstat; #define CDSE_OK 0 /* Good */ #define CDSE_EOF 1 /* End of File */ | > | 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #define MODE_CBN (4 << UNIT_V_CARD_MODE) #define MODE_EBCDIC (5 << UNIT_V_CARD_MODE) #define MODE_OCTAL (6 << UNIT_V_CARD_MODE) /* Allow lower case letters */ #define MODE_LOWER (8 << UNIT_V_CARD_MODE) #define MODE_026 (0x10 << UNIT_V_CARD_MODE) #define MODE_029 (0x20 << UNIT_V_CARD_MODE) #define MODE_DEC29 (0x30 << UNIT_V_CARD_MODE) #define MODE_CHAR (0x70 << UNIT_V_CARD_MODE) /* Card Reader Return Status code */ typedef int t_cdstat; #define CDSE_OK 0 /* Good */ #define CDSE_EOF 1 /* End of File */ |
︙ | ︙ | |||
122 123 124 125 126 127 128 | t_stat sim_card_set_fmt (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat sim_card_show_fmt (FILE *st, UNIT *uptr, int32 val, CONST void *desc); /* Help information */ t_stat sim_card_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); /* Translation tables */ | | | | | 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | t_stat sim_card_set_fmt (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat sim_card_show_fmt (FILE *st, UNIT *uptr, int32 val, CONST void *desc); /* Help information */ t_stat sim_card_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); /* Translation tables */ extern const char sim_six_to_ascii[64]; /* Map BCD to ASCII */ extern const char sim_ascii_to_six[128]; /* Map 7 bit ASCII to BCD */ extern const uint8 sim_parity_table[64]; /* 64 entry odd parity table */ /* Unit test routine */ extern t_stat sim_card_test (DEVICE *dptr); #ifdef __cplusplus } #endif #endif |
︙ | ︙ | |||
147 148 149 150 151 152 153 | static t_stat sim_os_poll_kbd (void); static t_bool sim_os_poll_kbd_ready (int ms_timeout); static t_stat sim_os_putchar (int32 out); static t_stat sim_os_ttinit (void); static t_stat sim_os_ttrun (void); static t_stat sim_os_ttcmd (void); static t_stat sim_os_ttclose (void); | | | 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | static t_stat sim_os_poll_kbd (void); static t_bool sim_os_poll_kbd_ready (int ms_timeout); static t_stat sim_os_putchar (int32 out); static t_stat sim_os_ttinit (void); static t_stat sim_os_ttrun (void); static t_stat sim_os_ttcmd (void); static t_stat sim_os_ttclose (void); static t_bool sim_os_fd_isatty (int fd); static t_stat sim_set_rem_telnet (int32 flag, CONST char *cptr); static t_stat sim_set_rem_bufsize (int32 flag, CONST char *cptr); static t_stat sim_set_rem_connections (int32 flag, CONST char *cptr); static t_stat sim_set_rem_timeout (int32 flag, CONST char *cptr); static t_stat sim_set_rem_master (int32 flag, CONST char *cptr); |
︙ | ︙ | |||
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | int32 sim_brk_char = 000; /* break character */ int32 sim_tt_pchar = 0x00002780; #if defined (_WIN32) || defined (__OS2__) || (defined (__MWERKS__) && defined (macintosh)) int32 sim_del_char = '\b'; /* delete character */ #else int32 sim_del_char = 0177; #endif extern TMLN *sim_oline; /* global output socket */ static t_stat sim_con_poll_svc (UNIT *uptr); /* console connection poll routine */ static t_stat sim_con_reset (DEVICE *dptr); /* console reset routine */ static t_stat sim_con_attach (UNIT *uptr, CONST char *ptr); /* console attach routine (save,restore) */ static t_stat sim_con_detach (UNIT *uptr); /* console detach routine (save,restore) */ UNIT sim_con_units[2] = {{ UDATA (&sim_con_poll_svc, UNIT_ATTABLE, 0)}}; /* console connection unit */ | > > > > > > > > | 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | int32 sim_brk_char = 000; /* break character */ int32 sim_tt_pchar = 0x00002780; #if defined (_WIN32) || defined (__OS2__) || (defined (__MWERKS__) && defined (macintosh)) int32 sim_del_char = '\b'; /* delete character */ #else int32 sim_del_char = 0177; #endif t_bool sim_signaled_int_char /* WRU character detected by signal while running */ #if defined (_WIN32) || defined (_VMS) || defined (__CYGWIN__) || (defined(USE_SIM_VIDEO) && defined(HAVE_LIBSDL)) = FALSE; #else = TRUE; #endif uint32 sim_last_poll_kbd_time; /* time when sim_poll_kbd was called */ extern TMLN *sim_oline; /* global output socket */ static uint32 sim_con_pos; /* console character output count */ static t_stat sim_con_poll_svc (UNIT *uptr); /* console connection poll routine */ static t_stat sim_con_reset (DEVICE *dptr); /* console reset routine */ static t_stat sim_con_attach (UNIT *uptr, CONST char *ptr); /* console attach routine (save,restore) */ static t_stat sim_con_detach (UNIT *uptr); /* console detach routine (save,restore) */ UNIT sim_con_units[2] = {{ UDATA (&sim_con_poll_svc, UNIT_ATTABLE, 0)}}; /* console connection unit */ |
︙ | ︙ | |||
211 212 213 214 215 216 217 | {"CON", DBG_CON, "connection activity"}, {"EXP", DBG_EXP, "Expect match activity"}, {"SND", DBG_SND, "Send (Inject) data activity"}, {0} }; static REG sim_con_reg[] = { | | | | | > | 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 | {"CON", DBG_CON, "connection activity"}, {"EXP", DBG_EXP, "Expect match activity"}, {"SND", DBG_SND, "Send (Inject) data activity"}, {0} }; static REG sim_con_reg[] = { { ORDATAD (WRU, sim_int_char, 8, "interrupt character") }, { ORDATAD (BRK, sim_brk_char, 8, "break character") }, { ORDATAD (DEL, sim_del_char, 8, "delete character ") }, { ORDATAD (PCHAR, sim_tt_pchar, 32, "printable character mask") }, { DRDATAD (CONSOLE_POS, sim_con_pos, 32, "character output count") }, { 0 }, }; static MTAB sim_con_mod[] = { { 0 }, }; |
︙ | ︙ | |||
426 427 428 429 430 431 432 | if (show_con_tab[i].arg != -1) show_con_tab[i].action (st, dptr, uptr, show_con_tab[i].arg, cptr); return SCPE_OK; } while (*cptr != 0) { cptr = get_glyph (cptr, gbuf, ','); /* get modifier */ if ((shptr = find_shtab (show_con_tab, gbuf))) | | | 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 | if (show_con_tab[i].arg != -1) show_con_tab[i].action (st, dptr, uptr, show_con_tab[i].arg, cptr); return SCPE_OK; } while (*cptr != 0) { cptr = get_glyph (cptr, gbuf, ','); /* get modifier */ if ((shptr = find_shtab (show_con_tab, gbuf))) shptr->action (st, dptr, uptr, shptr->arg, NULL); else return SCPE_NOPARAM; } return SCPE_OK; } #define MAX_REMOTE_SESSIONS 40 /* Arbitrary Session Limit */ |
︙ | ︙ | |||
628 629 630 631 632 633 634 | fprintf (st, " is repeated every %s\n", sim_fmt_secs (rem->repeat_interval / 1000000.0)); } if (rem->smp_reg_count) { uint32 reg; DEVICE *dptr = NULL; if (rem->smp_sample_dither_pct) | | | | 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 | fprintf (st, " is repeated every %s\n", sim_fmt_secs (rem->repeat_interval / 1000000.0)); } if (rem->smp_reg_count) { uint32 reg; DEVICE *dptr = NULL; if (rem->smp_sample_dither_pct) fprintf (st, "Register Bit Sampling is occurring every %d %s (dithered %d percent)\n", rem->smp_sample_interval, sim_vm_interval_units, rem->smp_sample_dither_pct); else fprintf (st, "Register Bit Sampling is occurring every %d %s\n", rem->smp_sample_interval, sim_vm_interval_units); fprintf (st, " Registers being sampled are: "); for (reg = 0; reg < rem->smp_reg_count; reg++) { if (rem->smp_regs[reg].indirect) fprintf (st, " indirect "); if (dptr != rem->smp_regs[reg].dptr) fprintf (st, "%s ", rem->smp_regs[reg].dptr->name); if (rem->smp_regs[reg].reg->depth > 1) |
︙ | ︙ | |||
739 740 741 742 743 744 745 | { "DETACH", &detach_cmd, 0 }, { "ASSIGN", &assign_cmd, 0 }, { "DEASSIGN", &deassign_cmd, 0 }, { "CONTINUE", &x_continue_cmd, 0 }, { "REPEAT", &x_repeat_cmd, 0 }, { "COLLECT", &x_collect_cmd, 0 }, { "SAMPLEOUT",&x_sampleout_cmd, 0 }, | < | 748 749 750 751 752 753 754 755 756 757 758 759 760 761 | { "DETACH", &detach_cmd, 0 }, { "ASSIGN", &assign_cmd, 0 }, { "DEASSIGN", &deassign_cmd, 0 }, { "CONTINUE", &x_continue_cmd, 0 }, { "REPEAT", &x_repeat_cmd, 0 }, { "COLLECT", &x_collect_cmd, 0 }, { "SAMPLEOUT",&x_sampleout_cmd, 0 }, { "PWD", &pwd_cmd, 0 }, { "SAVE", &save_cmd, 0 }, { "DIR", &dir_cmd, 0 }, { "LS", &dir_cmd, 0 }, { "ECHO", &echo_cmd, 0 }, { "ECHOF", &echof_cmd, 0 }, { "SET", &set_cmd, 0 }, |
︙ | ︙ | |||
761 762 763 764 765 766 767 768 769 770 771 | { "DEPOSIT", &exdep_cmd, EX_D }, { "EVALUATE", &eval_cmd, 0 }, { "ATTACH", &attach_cmd, 0 }, { "DETACH", &detach_cmd, 0 }, { "ASSIGN", &assign_cmd, 0 }, { "DEASSIGN", &deassign_cmd, 0 }, { "CONTINUE", &x_continue_cmd, 0 }, { "REPEAT", &x_repeat_cmd, 0 }, { "COLLECT", &x_collect_cmd, 0 }, { "SAMPLEOUT",&x_sampleout_cmd, 0 }, { "EXECUTE", &x_execute_cmd, 0 }, | > < | 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 | { "DEPOSIT", &exdep_cmd, EX_D }, { "EVALUATE", &eval_cmd, 0 }, { "ATTACH", &attach_cmd, 0 }, { "DETACH", &detach_cmd, 0 }, { "ASSIGN", &assign_cmd, 0 }, { "DEASSIGN", &deassign_cmd, 0 }, { "CONTINUE", &x_continue_cmd, 0 }, { "STEP", &x_step_cmd, 0 }, { "REPEAT", &x_repeat_cmd, 0 }, { "COLLECT", &x_collect_cmd, 0 }, { "SAMPLEOUT",&x_sampleout_cmd, 0 }, { "EXECUTE", &x_execute_cmd, 0 }, { "PWD", &pwd_cmd, 0 }, { "SAVE", &save_cmd, 0 }, { "CD", &set_default_cmd, 0 }, { "DIR", &dir_cmd, 0 }, { "LS", &dir_cmd, 0 }, { "ECHO", &echo_cmd, 0 }, { "ECHOF", &echof_cmd, 0 }, |
︙ | ︙ | |||
865 866 867 868 869 870 871 | return stat; } static void _sim_rem_log_out (TMLN *lp) { char cbuf[4*CBUFSIZE]; REMOTE *rem = &sim_rem_consoles[(int)(lp - sim_rem_con_tmxr.ldsc)]; | < | 873 874 875 876 877 878 879 880 881 882 883 884 885 886 | return stat; } static void _sim_rem_log_out (TMLN *lp) { char cbuf[4*CBUFSIZE]; REMOTE *rem = &sim_rem_consoles[(int)(lp - sim_rem_con_tmxr.ldsc)]; if ((!sim_oline) && (sim_log)) { fflush (sim_log); (void)sim_fseeko (sim_log, sim_rem_cmd_log_start, SEEK_SET); cbuf[sizeof(cbuf)-1] = '\0'; while (fgets (cbuf, sizeof(cbuf)-1, sim_log)) tmxr_linemsgf (lp, "%s", cbuf); |
︙ | ︙ | |||
1396 1397 1398 1399 1400 1401 1402 | if ((was_active_command) || (master_session && !rem->single_mode)) { sim_debug (DBG_MOD, &sim_remote_console, "Session: %d %s %s\n", i, was_active_command ? "Was Active" : "", (master_session && !rem->single_mode) ? "master_session && !single_mode" : ""); if (was_active_command) { sim_rem_cmd_active_line = -1; /* Done with active command */ if (!sim_rem_active_command) { /* STEP command? */ stat = SCPE_STEP; | > | | 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 | if ((was_active_command) || (master_session && !rem->single_mode)) { sim_debug (DBG_MOD, &sim_remote_console, "Session: %d %s %s\n", i, was_active_command ? "Was Active" : "", (master_session && !rem->single_mode) ? "master_session && !single_mode" : ""); if (was_active_command) { sim_rem_cmd_active_line = -1; /* Done with active command */ if (!sim_rem_active_command) { /* STEP command? */ stat = SCPE_STEP; if (sim_con_stable_registers || !sim_rem_master_mode) _sim_rem_message ("STEP", stat);/* produce a STEP complete message */ } _sim_rem_log_out (lp); sim_rem_active_command = NULL; /* Restart loop to process available input */ was_active_command = FALSE; i = -1; continue; } |
︙ | ︙ | |||
1742 1743 1744 1745 1746 1747 1748 | } else { if (cmdp->action == &x_collect_cmd) { sim_debug (DBG_CMD, &sim_remote_console, "collect_cmd executing\n"); stat = sim_rem_collect_cmd_setup (i, &cptr); } else { | | | > > > > | | 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 | } else { if (cmdp->action == &x_collect_cmd) { sim_debug (DBG_CMD, &sim_remote_console, "collect_cmd executing\n"); stat = sim_rem_collect_cmd_setup (i, &cptr); } else { if ((sim_con_stable_registers && /* can we process command now? */ sim_rem_master_mode) || (cmdp->action == &x_help_cmd)) { sim_debug (DBG_CMD, &sim_remote_console, "Processing Command directly\n"); sim_oline = lp; /* specify output socket */ if (cmdp->action == &x_help_cmd) x_help_cmd (0, cptr); else sim_remote_process_command (); stat = SCPE_OK; /* any message has already been emitted */ } else { sim_debug (DBG_CMD, &sim_remote_console, "Processing Command via SCPE_REMOTE\n"); stat = SCPE_REMOTE; /* force processing outside of sim_instr() */ } } |
︙ | ︙ | |||
1831 1832 1833 1834 1835 1836 1837 | rem->single_mode = FALSE; } } if (sim_rem_master_was_connected && /* Master mode ever connected? */ !sim_rem_con_tmxr.ldsc[0].sock) /* Master Connection lost? */ return sim_messagef (SCPE_EXIT, "Master Session Disconnect");/* simulator has been 'unplugged' */ if (sim_rem_cmd_active_line != -1) { | | > > > > > | > | 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 | rem->single_mode = FALSE; } } if (sim_rem_master_was_connected && /* Master mode ever connected? */ !sim_rem_con_tmxr.ldsc[0].sock) /* Master Connection lost? */ return sim_messagef (SCPE_EXIT, "Master Session Disconnect");/* simulator has been 'unplugged' */ if (sim_rem_cmd_active_line != -1) { if (steps) { if (!sim_con_stable_registers && sim_rem_master_mode) { sim_step = steps; sim_sched_step (); } else sim_activate(uptr, steps); /* check again after 'steps' instructions */ } else return SCPE_REMOTE; /* force sim_instr() to exit to process command */ } else sim_activate_after(uptr, 100000); /* check again in 100 milliaeconds */ if (sim_rem_master_was_enabled && !sim_rem_master_mode) { /* Transitioning out of master mode? */ lp = &sim_rem_con_tmxr.ldsc[0]; |
︙ | ︙ | |||
1865 1866 1867 1868 1869 1870 1871 | continue; sim_debug (DBG_REP, &sim_remote_console, "sim_rem_con_reset(line=%d, usecs=%d)\n", i, rem->repeat_interval); if (rem->repeat_interval) sim_activate_after (&rem_con_repeat_units[rem->line], rem->repeat_interval); /* schedule */ if (rem->smp_reg_count) sim_activate (&rem_con_smp_smpl_units[rem->line], rem->smp_sample_interval); /* schedule */ } | < | | | 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 | continue; sim_debug (DBG_REP, &sim_remote_console, "sim_rem_con_reset(line=%d, usecs=%d)\n", i, rem->repeat_interval); if (rem->repeat_interval) sim_activate_after (&rem_con_repeat_units[rem->line], rem->repeat_interval); /* schedule */ if (rem->smp_reg_count) sim_activate (&rem_con_smp_smpl_units[rem->line], rem->smp_sample_interval); /* schedule */ } sim_activate_after (rem_con_data_unit, 100000); /* continue polling for open sessions */ return sim_rem_con_poll_svc (rem_con_poll_unit); /* establish polling for new sessions */ } return SCPE_OK; } static t_stat sim_set_rem_telnet (int32 flag, CONST char *cptr) { t_stat r; if (flag) { r = sim_parse_addr (cptr, NULL, 0, NULL, NULL, 0, NULL, NULL); if (r == SCPE_OK) { if (sim_rem_con_tmxr.master) /* already open? */ sim_set_rem_telnet (0, NULL); /* close first */ if (sim_rem_con_tmxr.lines == 0) /* if no connection limit set */ sim_set_rem_connections (0, "1"); /* use 1 */ sim_rem_con_tmxr.buffered = 8192; /* Use big enough buffers */ sim_register_internal_device (&sim_remote_console); r = tmxr_attach (&sim_rem_con_tmxr, rem_con_poll_unit, cptr);/* open master socket */ if (r == SCPE_OK) sim_activate_after(rem_con_poll_unit, 1000000);/* check for connection in 1 second */ return r; |
︙ | ︙ | |||
1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 | if (r != SCPE_OK) return r; if (bufsize < 1400) return sim_messagef (SCPE_ARG, "%d is too small. Minimum size is 1400\n", bufsize); sprintf(cmdbuf, "BUFFERED=%d", bufsize); return tmxr_open_master (&sim_rem_con_tmxr, cmdbuf); /* open master socket */ } /* Enable or disable Remote Console master mode */ /* In master mode, commands are subsequently processed from the primary/initial (master mode) remote console session. Commands are processed from that source until that source disables master mode or the simulator exits | > > > > > > > | 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 | if (r != SCPE_OK) return r; if (bufsize < 1400) return sim_messagef (SCPE_ARG, "%d is too small. Minimum size is 1400\n", bufsize); sprintf(cmdbuf, "BUFFERED=%d", bufsize); return tmxr_open_master (&sim_rem_con_tmxr, cmdbuf); /* open master socket */ } t_bool sim_is_remote_console_master_line (void *lp) { return sim_rem_master_mode && /* master mode */ (((TMLN *)lp) >= sim_rem_con_tmxr.ldsc) && /* And it is one of the Remote Console Lines */ (((TMLN *)lp) < sim_rem_con_tmxr.ldsc + sim_rem_con_tmxr.lines); } /* Enable or disable Remote Console master mode */ /* In master mode, commands are subsequently processed from the primary/initial (master mode) remote console session. Commands are processed from that source until that source disables master mode or the simulator exits |
︙ | ︙ | |||
2022 2023 2024 2025 2026 2027 2028 | if (sim_rem_con_tmxr.master || (!flag)) /* Remote Console Enabled? */ sim_rem_master_mode = flag; else return sim_messagef (SCPE_INVREM, "Can't enable Remote Console Master mode with Remote Console disabled\n"); if (sim_rem_master_mode) { | | | 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 | if (sim_rem_con_tmxr.master || (!flag)) /* Remote Console Enabled? */ sim_rem_master_mode = flag; else return sim_messagef (SCPE_INVREM, "Can't enable Remote Console Master mode with Remote Console disabled\n"); if (sim_rem_master_mode) { t_stat stat_nomessage = 0; sim_messagef (SCPE_OK, "Command input starting on Master Remote Console Session\n"); stat = sim_run_boot_prep (0); sim_rem_master_was_enabled = TRUE; sim_last_cmd_stat = SCPE_OK; while (sim_rem_master_mode) { char *brk_action; |
︙ | ︙ | |||
2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 | sim_rem_master_mode = FALSE; if (brk_action) { free (sim_rem_consoles[0].act); sim_rem_consoles[0].act = brk_action; } sim_rem_cmd_active_line = 0; /* Make it look like */ sim_rem_consoles[0].single_mode = FALSE; if (stat != SCPE_STEP) sim_rem_active_command = &allowed_single_remote_cmds[0];/* Dummy */ sim_last_cmd_stat = SCPE_BARE_STATUS(stat); /* make exit status available to remote console */ } sim_rem_master_was_enabled = FALSE; sim_rem_master_was_connected = FALSE; if (sim_log_temp) { /* If we setup a temporary log, clean it now */ int32 save_quiet = sim_quiet; | > > > | 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 | sim_rem_master_mode = FALSE; if (brk_action) { free (sim_rem_consoles[0].act); sim_rem_consoles[0].act = brk_action; } sim_rem_cmd_active_line = 0; /* Make it look like */ sim_rem_consoles[0].single_mode = FALSE; sim_cancel_step (); if (stat != SCPE_STEP) sim_rem_active_command = &allowed_single_remote_cmds[0];/* Dummy */ else sim_activate_abs (rem_con_data_unit, 0); /* force step completion processing */ sim_last_cmd_stat = SCPE_BARE_STATUS(stat); /* make exit status available to remote console */ } sim_rem_master_was_enabled = FALSE; sim_rem_master_was_connected = FALSE; if (sim_log_temp) { /* If we setup a temporary log, clean it now */ int32 save_quiet = sim_quiet; |
︙ | ︙ | |||
2195 2196 2197 2198 2199 2200 2201 | if ((cptr == NULL) || (*cptr == 0)) /* need arg */ return SCPE_2FARG; cptr = get_glyph_nc (cptr, gbuf, 0); /* get file name */ if (*cptr != 0) /* now eol? */ return SCPE_2MARG; sim_set_logoff (0, NULL); /* close cur log */ | > | | > | | | 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 | if ((cptr == NULL) || (*cptr == 0)) /* need arg */ return SCPE_2FARG; cptr = get_glyph_nc (cptr, gbuf, 0); /* get file name */ if (*cptr != 0) /* now eol? */ return SCPE_2MARG; sim_set_logoff (0, NULL); /* close cur log */ r = sim_open_logfile (gbuf, (sim_switches & SWMASK ('B')) == SWMASK ('B'), &sim_log, &sim_log_ref); /* open log */ if (r != SCPE_OK) /* error? */ return r; if ((!sim_quiet) && (!(sim_switches & SWMASK ('Q')))) fprintf (stdout, "Logging to file \"%s\"\n", sim_logfile_name (sim_log, sim_log_ref)); fprintf (sim_log, "Logging to file \"%s\"\n", sim_logfile_name (sim_log, sim_log_ref)); /* start of log */ time(&now); if ((!sim_quiet) && (!(sim_switches & SWMASK ('Q')))) fprintf (sim_log, "Logging to file \"%s\" at %s", sim_logfile_name (sim_log, sim_log_ref), ctime(&now)); return SCPE_OK; } /* Set nolog routine */ t_stat sim_set_logoff (int32 flag, CONST char *cptr) { if (cptr && (*cptr != 0)) /* now eol? */ return SCPE_2MARG; if (sim_log == NULL) /* no log? */ return SCPE_OK; if ((!sim_quiet) && (!(sim_switches & SWMASK ('Q')))) fprintf (stdout, "Log file closed\n"); fprintf (sim_log, "Log file closed\n"); sim_close_logfile (&sim_log_ref); /* close log */ sim_log = NULL; return SCPE_OK; } |
︙ | ︙ | |||
2260 2261 2262 2263 2264 2265 2266 | /* Set debug routine */ t_stat sim_set_debon (int32 flag, CONST char *cptr) { char gbuf[CBUFSIZE]; t_stat r; time_t now; | | | 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 | /* Set debug routine */ t_stat sim_set_debon (int32 flag, CONST char *cptr) { char gbuf[CBUFSIZE]; t_stat r; time_t now; size_t buffer_size = 0; if ((cptr == NULL) || (*cptr == 0)) /* need arg */ return SCPE_2FARG; if (sim_switches & SWMASK ('B')) { cptr = get_glyph_nc (cptr, gbuf, 0); /* buffer size */ buffer_size = (size_t)strtoul (gbuf, NULL, 10); if ((buffer_size == 0) || (buffer_size > 1024)) |
︙ | ︙ | |||
2284 2285 2286 2287 2288 2289 2290 | sim_set_deb_switches (sim_switches); if (sim_deb_switches & SWMASK ('R')) { struct tm loc_tm, gmt_tm; time_t time_t_now; | | | 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 | sim_set_deb_switches (sim_switches); if (sim_deb_switches & SWMASK ('R')) { struct tm loc_tm, gmt_tm; time_t time_t_now; sim_rtcn_get_time(&sim_deb_basetime, 0); time_t_now = (time_t)sim_deb_basetime.tv_sec; /* Adjust the relative timebase to reflect the localtime GMT offset */ loc_tm = *localtime (&time_t_now); gmt_tm = *gmtime (&time_t_now); sim_deb_basetime.tv_sec -= mktime (&gmt_tm) - mktime (&loc_tm); if (!(sim_deb_switches & (SWMASK ('A') | SWMASK ('T')))) sim_deb_switches |= SWMASK ('T'); |
︙ | ︙ | |||
2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 | /* Poll for character */ t_stat sim_poll_kbd (void) { t_stat c; if (sim_send_poll_data (&sim_con_send, &c)) /* injected input characters available? */ return c; if (!sim_rem_master_mode) { if ((sim_con_ldsc.rxbps) && /* rate limiting && */ (sim_gtime () < sim_con_ldsc.rxnexttime)) /* too soon? */ return SCPE_OK; /* not yet */ if (sim_ttisatty ()) | > | 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 | /* Poll for character */ t_stat sim_poll_kbd (void) { t_stat c; sim_last_poll_kbd_time = sim_os_msec (); /* record when this poll happened */ if (sim_send_poll_data (&sim_con_send, &c)) /* injected input characters available? */ return c; if (!sim_rem_master_mode) { if ((sim_con_ldsc.rxbps) && /* rate limiting && */ (sim_gtime () < sim_con_ldsc.rxnexttime)) /* too soon? */ return SCPE_OK; /* not yet */ if (sim_ttisatty ()) |
︙ | ︙ | |||
2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 | /* Output character */ t_stat sim_putchar (int32 c) { sim_exp_check (&sim_con_expect, c); if ((sim_con_tmxr.master == 0) && /* not Telnet? */ (sim_con_ldsc.serport == 0)) { /* and not serial port */ if (sim_log) /* log file? */ fputc (c, sim_log); sim_debug (DBG_XMT, &sim_con_telnet, "sim_putchar('%c' (0x%02X)\n", sim_isprint (c) ? c : '.', c); return sim_os_putchar (c); /* in-window version */ } if (!sim_con_ldsc.conn) { /* no Telnet or serial connection? */ if (!sim_con_ldsc.txbfd) /* unbuffered? */ return SCPE_LOST; /* connection lost */ if (tmxr_poll_conn (&sim_con_tmxr) >= 0) /* poll connect */ sim_con_ldsc.rcve = 1; /* rcv enabled */ } tmxr_putc_ln (&sim_con_ldsc, c); /* output char */ tmxr_poll_tx (&sim_con_tmxr); /* poll xmt */ return SCPE_OK; } t_stat sim_putchar_s (int32 c) { t_stat r; sim_exp_check (&sim_con_expect, c); if ((sim_con_tmxr.master == 0) && /* not Telnet? */ (sim_con_ldsc.serport == 0)) { /* and not serial port */ if (sim_log) /* log file? */ fputc (c, sim_log); sim_debug (DBG_XMT, &sim_con_telnet, "sim_putchar('%c' (0x%02X)\n", sim_isprint (c) ? c : '.', c); return sim_os_putchar (c); /* in-window version */ } if (!sim_con_ldsc.conn) { /* no Telnet or serial connection? */ if (!sim_con_ldsc.txbfd) /* non-buffered Telnet connection? */ return SCPE_LOST; /* lost */ if (tmxr_poll_conn (&sim_con_tmxr) >= 0) /* poll connect */ sim_con_ldsc.rcve = 1; /* rcv enabled */ } r = tmxr_putc_ln (&sim_con_ldsc, c); /* Telnet output */ tmxr_poll_tx (&sim_con_tmxr); /* poll xmt */ return r; /* return status */ } /* Input character processing */ int32 sim_tt_inpcvt (int32 c, uint32 mode) { uint32 md = mode & TTUF_M_MODE; if (md != TTUF_MODE_8B) { uint32 par_mode = (mode >> TTUF_W_MODE) & TTUF_M_PAR; | > > > > > | | > | | 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 | /* Output character */ t_stat sim_putchar (int32 c) { sim_exp_check (&sim_con_expect, c); if ((sim_con_tmxr.master == 0) && /* not Telnet? */ (sim_con_ldsc.serport == 0)) { /* and not serial port */ ++sim_con_pos; /* bookkeeping */ if (sim_log) /* log file? */ fputc (c, sim_log); sim_debug (DBG_XMT, &sim_con_telnet, "sim_putchar('%c' (0x%02X)\n", sim_isprint (c) ? c : '.', c); return sim_os_putchar (c); /* in-window version */ } if (!sim_con_ldsc.conn) { /* no Telnet or serial connection? */ if (!sim_con_ldsc.txbfd) /* unbuffered? */ return SCPE_LOST; /* connection lost */ if (tmxr_poll_conn (&sim_con_tmxr) >= 0) /* poll connect */ sim_con_ldsc.rcve = 1; /* rcv enabled */ } tmxr_putc_ln (&sim_con_ldsc, c); /* output char */ ++sim_con_pos; /* bookkeeping */ tmxr_poll_tx (&sim_con_tmxr); /* poll xmt */ return SCPE_OK; } t_stat sim_putchar_s (int32 c) { t_stat r; sim_exp_check (&sim_con_expect, c); if ((sim_con_tmxr.master == 0) && /* not Telnet? */ (sim_con_ldsc.serport == 0)) { /* and not serial port */ ++sim_con_pos; /* bookkeeping */ if (sim_log) /* log file? */ fputc (c, sim_log); sim_debug (DBG_XMT, &sim_con_telnet, "sim_putchar('%c' (0x%02X)\n", sim_isprint (c) ? c : '.', c); return sim_os_putchar (c); /* in-window version */ } if (!sim_con_ldsc.conn) { /* no Telnet or serial connection? */ if (!sim_con_ldsc.txbfd) /* non-buffered Telnet connection? */ return SCPE_LOST; /* lost */ if (tmxr_poll_conn (&sim_con_tmxr) >= 0) /* poll connect */ sim_con_ldsc.rcve = 1; /* rcv enabled */ } r = tmxr_putc_ln (&sim_con_ldsc, c); /* Telnet output */ if (r == SCPE_OK) ++sim_con_pos; /* bookkeeping */ tmxr_poll_tx (&sim_con_tmxr); /* poll xmt */ return r; /* return status */ } /* Input character processing */ int32 sim_tt_inpcvt (int32 c, uint32 mode) { uint32 md = mode & TTUF_M_MODE; if (md != TTUF_MODE_8B) { uint32 par_mode = (mode >> TTUF_W_MODE) & TTUF_M_PAR; static int32 nibble_even_parity = 0x699600; /* bit array indicating the even parity for each index (offset by 8) */ c = c & 0177; if (md == TTUF_MODE_UC) { if (islower (c)) c = toupper (c); if (mode & TTUF_KSR) c = c | 0200; /* Force MARK parity */ } switch (par_mode) { case TTUF_PAR_EVEN: c |= (((nibble_even_parity >> ((c & 0xF) + 1)) ^ (nibble_even_parity >> (((c >> 4) & 0xF) + 1))) & 0x80); break; case TTUF_PAR_ODD: c |= ((~((nibble_even_parity >> ((c & 0xF) + 1)) ^ (nibble_even_parity >> (((c >> 4) & 0xF) + 1)))) & 0x80); break; case TTUF_PAR_MARK: c = c | 0x80; break; } } else c = c & 0377; return c; } /* Output character processing */ int32 sim_tt_outcvt (int32 c, uint32 mode) { |
︙ | ︙ | |||
3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 | fprintf (st, (any? ";%d": "%d"), i + 1); any = 1; } } fprintf (st, (any? "\n": "no tabs set\n")); return SCPE_OK; } #if defined(SIM_ASYNCH_IO) && defined(SIM_ASYNCH_MUX) extern pthread_mutex_t sim_tmxr_poll_lock; extern pthread_cond_t sim_tmxr_poll_cond; extern int32 sim_tmxr_poll_count; extern t_bool sim_tmxr_poll_running; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 | fprintf (st, (any? ";%d": "%d"), i + 1); any = 1; } } fprintf (st, (any? "\n": "no tabs set\n")); return SCPE_OK; } t_stat sim_tt_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { uint32 par_mode = (TT_GET_MODE (uptr->flags) >> TTUF_W_MODE) & TTUF_M_PAR; uptr->flags = uptr->flags & ~((TTUF_M_MODE << TTUF_V_MODE) | (TTUF_M_PAR << TTUF_V_PAR) | TTUF_KSR); uptr->flags |= val; if (val != TT_MODE_8B) uptr->flags |= (par_mode << TTUF_V_PAR); return SCPE_OK; } t_stat sim_tt_set_parity (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { uptr->flags = uptr->flags & ~(TTUF_M_MODE | TTUF_M_PAR); uptr->flags |= TT_MODE_7B | val; return SCPE_OK; } t_stat sim_tt_show_modepar (FILE *st, UNIT *uptr, int32 val, CONST void *desc) { uint32 md = (TT_GET_MODE (uptr->flags) & TTUF_M_MODE); static const char *modes[] = {"7b", "8b", "UC", "7p"}; uint32 par_mode = (TT_GET_MODE (uptr->flags) >> TTUF_W_MODE) & TTUF_M_PAR; static const char *parity[] = {"SPACE", "MARK", "EVEN", "ODD"}; if ((md == TTUF_MODE_UC) && (par_mode == TTUF_PAR_MARK)) fprintf (st, "KSR (UC, MARK parity)"); else fprintf (st, "%s", modes[md]); if ((md != TTUF_MODE_8B) && ((md != TTUF_MODE_UC) || (par_mode != TTUF_PAR_MARK))) { if (par_mode != 0) fprintf (st, ", %s parity", parity[par_mode]); } return SCPE_OK; } #if defined(SIM_ASYNCH_IO) && defined(SIM_ASYNCH_MUX) extern pthread_mutex_t sim_tmxr_poll_lock; extern pthread_cond_t sim_tmxr_poll_cond; extern int32 sim_tmxr_poll_count; extern t_bool sim_tmxr_poll_running; |
︙ | ︙ | |||
3178 3179 3180 3181 3182 3183 3184 | } t_bool sim_ttisatty (void) { static int answer = -1; if (answer == -1) | | > > > > | 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 | } t_bool sim_ttisatty (void) { static int answer = -1; if (answer == -1) answer = sim_os_fd_isatty (0); return (t_bool)answer; } t_bool sim_fd_isatty (int fd) { return sim_os_fd_isatty (fd); } /* Platform specific routine definitions */ /* VMS routines, from Ben Thomas, with fixes from Robert Alan Byer */ #if defined (VMS) |
︙ | ︙ | |||
3278 3279 3280 3281 3282 3283 3284 | static t_stat sim_os_ttclose (void) { sim_ttcmd (); sys$dassgn (tty_chan); return SCPE_OK; } | | | | 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 | static t_stat sim_os_ttclose (void) { sim_ttcmd (); sys$dassgn (tty_chan); return SCPE_OK; } static t_bool sim_os_fd_isatty (int fd) { return isatty (fd); } static t_stat sim_os_poll_kbd_data (void) { unsigned int status, term[2]; unsigned char buf[4]; IOSB iosb; |
︙ | ︙ | |||
3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 | #elif defined (_WIN32) #include <fcntl.h> #include <io.h> #define RAW_MODE 0 static HANDLE std_input; static HANDLE std_output; static DWORD saved_input_mode; static DWORD saved_output_mode; #ifndef ENABLE_VIRTUAL_TERMINAL_INPUT #define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 #endif #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 #endif | > > | 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 | #elif defined (_WIN32) #include <fcntl.h> #include <io.h> #define RAW_MODE 0 static HANDLE std_input; static HANDLE std_output; static HANDLE std_error; static DWORD saved_input_mode; static DWORD saved_output_mode; static DWORD saved_error_mode; #ifndef ENABLE_VIRTUAL_TERMINAL_INPUT #define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 #endif #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 #endif |
︙ | ︙ | |||
3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 | static t_stat sim_os_ttinit (void) { sim_debug (DBG_TRC, &sim_con_telnet, "sim_os_ttinit()\n"); SetConsoleCtrlHandler( ControlHandler, TRUE ); std_input = GetStdHandle (STD_INPUT_HANDLE); std_output = GetStdHandle (STD_OUTPUT_HANDLE); if ((std_input) && /* Not Background process? */ (std_input != INVALID_HANDLE_VALUE)) GetConsoleMode (std_input, &saved_input_mode); /* Save Input Mode */ if ((std_output) && /* Not Background process? */ (std_output != INVALID_HANDLE_VALUE)) GetConsoleMode (std_output, &saved_output_mode); /* Save Output Mode */ return SCPE_OK; } static t_stat sim_os_ttrun (void) { sim_debug (DBG_TRC, &sim_con_telnet, "sim_os_ttrun()\n"); if ((sim_ttisatty ()) && (std_input) && /* If Not Background process? */ (std_input != INVALID_HANDLE_VALUE)) { if (!GetConsoleMode(std_input, &saved_input_mode)) return sim_messagef (SCPE_TTYERR, "GetConsoleMode() error: 0x%X\n", (unsigned int)GetLastError ()); if ((!SetConsoleMode(std_input, ENABLE_VIRTUAL_TERMINAL_INPUT)) && (!SetConsoleMode(std_input, RAW_MODE))) return sim_messagef (SCPE_TTYERR, "SetConsoleMode() error: 0x%X\n", (unsigned int)GetLastError ()); } if ((std_output) && /* If Not Background process? */ (std_output != INVALID_HANDLE_VALUE)) { if (GetConsoleMode(std_output, &saved_output_mode)) | > > > > | | | 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 | static t_stat sim_os_ttinit (void) { sim_debug (DBG_TRC, &sim_con_telnet, "sim_os_ttinit()\n"); SetConsoleCtrlHandler( ControlHandler, TRUE ); std_input = GetStdHandle (STD_INPUT_HANDLE); std_output = GetStdHandle (STD_OUTPUT_HANDLE); std_error = GetStdHandle (STD_ERROR_HANDLE); if ((std_input) && /* Not Background process? */ (std_input != INVALID_HANDLE_VALUE)) GetConsoleMode (std_input, &saved_input_mode); /* Save Input Mode */ if ((std_output) && /* Not Background process? */ (std_output != INVALID_HANDLE_VALUE)) GetConsoleMode (std_output, &saved_output_mode); /* Save Output Mode */ if ((std_error) && /* Not Background process? */ (std_error != INVALID_HANDLE_VALUE)) GetConsoleMode (std_error, &saved_error_mode); /* Save Output Mode */ return SCPE_OK; } static t_stat sim_os_ttrun (void) { sim_debug (DBG_TRC, &sim_con_telnet, "sim_os_ttrun()\n"); if ((sim_ttisatty ()) && (std_input) && /* If Not Background process? */ (std_input != INVALID_HANDLE_VALUE)) { if (!GetConsoleMode(std_input, &saved_input_mode)) return sim_messagef (SCPE_TTYERR, "GetConsoleMode() error: 0x%X\n", (unsigned int)GetLastError ()); if ((!SetConsoleMode(std_input, ENABLE_VIRTUAL_TERMINAL_INPUT)) && (!SetConsoleMode(std_input, RAW_MODE))) return sim_messagef (SCPE_TTYERR, "SetConsoleMode() error: 0x%X\n", (unsigned int)GetLastError ()); } if ((std_output) && /* If Not Background process? */ (std_output != INVALID_HANDLE_VALUE)) { if (GetConsoleMode(std_output, &saved_output_mode)) if (!SetConsoleMode(std_output, ENABLE_VIRTUAL_TERMINAL_PROCESSING|ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT)) SetConsoleMode(std_output, ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT); } if (sim_log) { fflush (sim_log); _setmode (_fileno (sim_log), _O_BINARY); } sim_os_set_thread_priority (PRIORITY_BELOW_NORMAL); return SCPE_OK; |
︙ | ︙ | |||
3479 3480 3481 3482 3483 3484 3485 | } static t_stat sim_os_ttclose (void) { return SCPE_OK; } | | > > > > > > > > > > > > > > > | | 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 | } static t_stat sim_os_ttclose (void) { return SCPE_OK; } static t_bool sim_os_fd_isatty (int fd) { DWORD Mode; HANDLE handle; switch (fd) { case 0: handle = std_input; break; case 1: handle = std_output; break; case 2: handle = std_error; break; default: handle = NULL; } return (handle) && (handle != INVALID_HANDLE_VALUE) && GetConsoleMode (handle, &Mode); } static t_stat sim_os_poll_kbd (void) { int c = -1; DWORD nkbevents, nkbevent; INPUT_RECORD rec; |
︙ | ︙ | |||
3634 3635 3636 3637 3638 3639 3640 | } static t_stat sim_os_ttclose (void) { return SCPE_OK; } | | | 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 | } static t_stat sim_os_ttclose (void) { return SCPE_OK; } static t_bool sim_os_fd_isatty (int fd) { return 1; } static t_stat sim_os_poll_kbd (void) { int c; |
︙ | ︙ | |||
3846 3847 3848 3849 3850 3851 3852 | } static t_stat sim_os_ttclose (void) { return SCPE_OK; } | | | 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 | } static t_stat sim_os_ttclose (void) { return SCPE_OK; } static t_bool sim_os_fd_isatty (int fd) { return 1; } static t_stat sim_os_poll_kbd (void) { int c; |
︙ | ︙ | |||
3989 3990 3991 3992 3993 3994 3995 | } static t_stat sim_os_ttclose (void) { return sim_ttcmd (); } | | | | 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 | } static t_stat sim_os_ttclose (void) { return sim_ttcmd (); } static t_bool sim_os_fd_isatty (int fd) { return isatty (fd); } static t_stat sim_os_poll_kbd (void) { int status; unsigned char buf[1]; |
︙ | ︙ | |||
4163 4164 4165 4166 4167 4168 4169 | } static t_stat sim_os_ttclose (void) { return sim_ttcmd (); } | | | | 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 | } static t_stat sim_os_ttclose (void) { return sim_ttcmd (); } static t_bool sim_os_fd_isatty (int fd) { return isatty (fd); } static t_stat sim_os_poll_kbd (void) { int status; unsigned char buf[1]; |
︙ | ︙ | |||
4206 4207 4208 4209 4210 4211 4212 | } static t_stat sim_os_putchar (int32 out) { char c; c = out; | | | 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 | } static t_stat sim_os_putchar (int32 out) { char c; c = out; if (write (1, &c, 1)) {}; return SCPE_OK; } #endif /* Decode a string. |
︙ | ︙ |
︙ | ︙ | |||
56 57 58 59 60 61 62 | #define TTUF_KSR (1u << (TTUF_W_MODE + TTUF_W_PAR)) #define TTUF_V_UF (TTUF_V_MODE + TTUF_W_MODE + TTUF_W_PAR) #define TT_MODE (TTUF_M_MODE << TTUF_V_MODE) #define TT_MODE_7B (TTUF_MODE_7B << TTUF_V_MODE) #define TT_MODE_8B (TTUF_MODE_8B << TTUF_V_MODE) #define TT_MODE_UC (TTUF_MODE_UC << TTUF_V_MODE) #define TT_MODE_7P (TTUF_MODE_7P << TTUF_V_MODE) | | | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #define TTUF_KSR (1u << (TTUF_W_MODE + TTUF_W_PAR)) #define TTUF_V_UF (TTUF_V_MODE + TTUF_W_MODE + TTUF_W_PAR) #define TT_MODE (TTUF_M_MODE << TTUF_V_MODE) #define TT_MODE_7B (TTUF_MODE_7B << TTUF_V_MODE) #define TT_MODE_8B (TTUF_MODE_8B << TTUF_V_MODE) #define TT_MODE_UC (TTUF_MODE_UC << TTUF_V_MODE) #define TT_MODE_7P (TTUF_MODE_7P << TTUF_V_MODE) #define TT_MODE_KSR (TT_MODE_UC|TT_PAR_MARK) /* 7 bit modes allow for an 8th bit parity mode */ #define TT_PAR (TTUF_M_PAR << TTUF_V_PAR) #define TT_PAR_SPACE (TTUF_PAR_SPACE << TTUF_V_PAR) #define TT_PAR_MARK (TTUF_PAR_MARK << TTUF_V_PAR) #define TT_PAR_EVEN (TTUF_PAR_EVEN << TTUF_V_PAR) #define TT_PAR_ODD (TTUF_PAR_ODD << TTUF_V_PAR) /* TT_GET_MODE returns both the TT_MODE and TT_PAR fields |
︙ | ︙ | |||
118 119 120 121 122 123 124 125 126 127 128 129 | t_stat sim_putchar (int32 c); t_stat sim_putchar_s (int32 c); t_stat sim_ttinit (void); t_stat sim_ttrun (void); t_stat sim_ttcmd (void); t_stat sim_ttclose (void); t_bool sim_ttisatty (void); int32 sim_tt_inpcvt (int32 c, uint32 mode); int32 sim_tt_outcvt (int32 c, uint32 mode); t_stat sim_tt_settabs (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat sim_tt_showtabs (FILE *st, UNIT *uptr, int32 val, CONST void *desc); | > > > > > | | | | | > > | 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | t_stat sim_putchar (int32 c); t_stat sim_putchar_s (int32 c); t_stat sim_ttinit (void); t_stat sim_ttrun (void); t_stat sim_ttcmd (void); t_stat sim_ttclose (void); t_bool sim_ttisatty (void); t_bool sim_fd_isatty (int fd); int32 sim_tt_inpcvt (int32 c, uint32 mode); int32 sim_tt_outcvt (int32 c, uint32 mode); t_stat sim_tt_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat sim_tt_set_parity (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat sim_tt_show_modepar (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat sim_tt_settabs (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat sim_tt_showtabs (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_bool sim_is_remote_console_master_line (void *lp); extern int32 sim_rem_cmd_active_line; /* command in progress on line # */ extern int32 sim_int_char; /* interrupt character */ extern int32 sim_brk_char; /* break character */ extern int32 sim_tt_pchar; /* printable character mask */ extern int32 sim_del_char; /* delete character */ extern t_bool sim_signaled_int_char; /* WRU character detected by signal while running */ extern uint32 sim_last_poll_kbd_time; /* time when sim_poll_kbd was called */ #ifdef __cplusplus } #endif #endif |
︙ | ︙ | |||
89 90 91 92 93 94 95 | The interface between the simulator control package (SCP) and the simulator consists of the following routines and data structures sim_name simulator name string sim_devices[] array of pointers to simulated devices sim_PC pointer to saved PC register descriptor sim_interval simulator interval to next event | > | | 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | The interface between the simulator control package (SCP) and the simulator consists of the following routines and data structures sim_name simulator name string sim_devices[] array of pointers to simulated devices sim_PC pointer to saved PC register descriptor sim_interval simulator interval to next event sim_stop_messages[SCPE_BASE] array of pointers to stop messages sim_instr() instruction execution routine sim_load() binary loader routine sim_emax maximum number of words in an instruction In addition, the simulator must supply routines to print and parse architecture specific formats |
︙ | ︙ | |||
142 143 144 145 146 147 148 | #undef MEM_MAPPED /* avoid macro name collision */ #include <process.h> #endif #ifdef USE_REGEX #undef USE_REGEX #endif | | < | | > | | 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | #undef MEM_MAPPED /* avoid macro name collision */ #include <process.h> #endif #ifdef USE_REGEX #undef USE_REGEX #endif #if defined(HAVE_PCRE_H) #include <pcre.h> #define USE_REGEX 1 #endif #if (defined (__MWERKS__) && defined (macintosh)) || defined(__DECC) #define __FUNCTION__ __FILE__ #endif #ifdef __cplusplus extern "C" { #endif /* avoid macro names collisions */ |
︙ | ︙ | |||
315 316 317 318 319 320 321 | #define SIM_INLINE inline #define SIM_NOINLINE __attribute__ ((noinline)) #else #define SIM_INLINE #define SIM_NOINLINE #endif | | > > > > | | | < < | < < > | 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 | #define SIM_INLINE inline #define SIM_NOINLINE __attribute__ ((noinline)) #else #define SIM_INLINE #define SIM_NOINLINE #endif /* Packed structure support */ #ifdef _MSC_VER # define PACKED_BEGIN __pragma( pack(push, 1) ) # define PACKED_END __pragma( pack(pop) ) #else # define PACKED_BEGIN #if defined(_WIN32) # define PACKED_END __attribute__((gcc_struct, packed)) #else # define PACKED_END __attribute__((packed)) #endif #endif /* System independent definitions */ #define FLIP_SIZE (1 << 16) /* flip buf size */ #if !defined (PATH_MAX) /* usually in limits */ #define PATH_MAX 512 #endif |
︙ | ︙ | |||
412 413 414 415 416 417 418 419 | #define SCPE_AFAIL (SCPE_BASE + 42) /* assert failed */ #define SCPE_INVREM (SCPE_BASE + 43) /* invalid remote console command */ #define SCPE_EXPECT (SCPE_BASE + 44) /* expect matched */ #define SCPE_AMBREG (SCPE_BASE + 45) /* ambiguous register */ #define SCPE_REMOTE (SCPE_BASE + 46) /* remote console command */ #define SCPE_INVEXPR (SCPE_BASE + 47) /* invalid expression */ #define SCPE_SIGTERM (SCPE_BASE + 48) /* SIGTERM has been received */ | > > > | | 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 | #define SCPE_AFAIL (SCPE_BASE + 42) /* assert failed */ #define SCPE_INVREM (SCPE_BASE + 43) /* invalid remote console command */ #define SCPE_EXPECT (SCPE_BASE + 44) /* expect matched */ #define SCPE_AMBREG (SCPE_BASE + 45) /* ambiguous register */ #define SCPE_REMOTE (SCPE_BASE + 46) /* remote console command */ #define SCPE_INVEXPR (SCPE_BASE + 47) /* invalid expression */ #define SCPE_SIGTERM (SCPE_BASE + 48) /* SIGTERM has been received */ #define SCPE_FSSIZE (SCPE_BASE + 49) /* File System size larger than disk size */ #define SCPE_RUNTIME (SCPE_BASE + 50) /* Run Time Limit Exhausted */ #define SCPE_INCOMPDSK (SCPE_BASE + 51) /* Incompatible Disk Container */ #define SCPE_MAX_ERR (SCPE_BASE + 51) /* Maximum SCPE Error Value */ #define SCPE_KFLAG 0x10000000 /* tti data flag */ #define SCPE_BREAK 0x20000000 /* tti break flag */ #define SCPE_NOMESSAGE 0x40000000 /* message display supression flag */ #define SCPE_BARE_STATUS(stat) ((stat) & ~(SCPE_NOMESSAGE|SCPE_KFLAG|SCPE_BREAK)) /* Print value format codes */ |
︙ | ︙ | |||
587 588 589 590 591 592 593 594 595 596 597 598 599 600 | int32 u4; /* device specific */ int32 u5; /* device specific */ int32 u6; /* device specific */ void *up7; /* device specific */ void *up8; /* device specific */ uint16 us9; /* device specific */ uint16 us10; /* device specific */ void *tmxr; /* TMXR linkage */ uint32 recsize; /* Tape specific info */ t_addr tape_eom; /* Tape specific info */ t_bool (*cancel)(UNIT *); double usecs_remaining; /* time balance for long delays */ char *uname; /* Unit name */ DEVICE *dptr; /* DEVICE linkage (backpointer) */ | > | 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 | int32 u4; /* device specific */ int32 u5; /* device specific */ int32 u6; /* device specific */ void *up7; /* device specific */ void *up8; /* device specific */ uint16 us9; /* device specific */ uint16 us10; /* device specific */ uint32 disk_type; /* Disk specific info */ void *tmxr; /* TMXR linkage */ uint32 recsize; /* Tape specific info */ t_addr tape_eom; /* Tape specific info */ t_bool (*cancel)(UNIT *); double usecs_remaining; /* time balance for long delays */ char *uname; /* Unit name */ DEVICE *dptr; /* DEVICE linkage (backpointer) */ |
︙ | ︙ | |||
632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 | #define UNIT_BUFABLE 0000100 /* bufferable */ #define UNIT_MUSTBUF 0000200 /* must buffer */ #define UNIT_BUF 0000400 /* buffered */ #define UNIT_ROABLE 0001000 /* read only ok */ #define UNIT_DISABLE 0002000 /* disable-able */ #define UNIT_DIS 0004000 /* disabled */ #define UNIT_IDLE 0040000 /* idle eligible */ /* Unused/meaningless flags */ #define UNIT_TEXT 0000000 /* text mode - no effect */ #define UNIT_UFMASK_31 (((1u << UNIT_V_RSV) - 1) & ~((1u << UNIT_V_UF_31) - 1)) #define UNIT_UFMASK (((1u << UNIT_V_RSV) - 1) & ~((1u << UNIT_V_UF) - 1)) #define UNIT_RFLAGS (UNIT_UFMASK|UNIT_DIS) /* restored flags */ /* Unit dynamic flags (dynflags) */ /* These flags are only set dynamically */ | > > | | | | | | > | | > > > > > > | 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 | #define UNIT_BUFABLE 0000100 /* bufferable */ #define UNIT_MUSTBUF 0000200 /* must buffer */ #define UNIT_BUF 0000400 /* buffered */ #define UNIT_ROABLE 0001000 /* read only ok */ #define UNIT_DISABLE 0002000 /* disable-able */ #define UNIT_DIS 0004000 /* disabled */ #define UNIT_IDLE 0040000 /* idle eligible */ #define UNIT_WLK 0100000 /* hardware write lock */ #define UNIT_WPRT (UNIT_WLK|UNIT_RO)/* write protect */ /* Unused/meaningless flags */ #define UNIT_TEXT 0000000 /* text mode - no effect */ #define UNIT_UFMASK_31 (((1u << UNIT_V_RSV) - 1) & ~((1u << UNIT_V_UF_31) - 1)) #define UNIT_UFMASK (((1u << UNIT_V_RSV) - 1) & ~((1u << UNIT_V_UF) - 1)) #define UNIT_RFLAGS (UNIT_UFMASK|UNIT_DIS) /* restored flags */ /* Unit dynamic flags (dynflags) */ /* These flags are only set dynamically */ #define UNIT_ATTMULT 0000001 /* Allow multiple attach commands */ #define UNIT_TM_POLL 0000002 /* TMXR Polling unit */ #define UNIT_NO_FIO 0000004 /* fileref is NOT a FILE * */ #define UNIT_DISK_CHK 0000010 /* disk data debug checking (sim_disk) */ #define UNIT_TMR_UNIT 0000200 /* Unit registered as a calibrated timer */ #define UNIT_TAPE_MRK 0000400 /* Tape Unit Tapemark */ #define UNIT_TAPE_PNU 0001000 /* Tape Unit Position Not Updated */ #define UNIT_V_DF_TAPE 10 /* Bit offset for Tape Density reservation */ #define UNIT_S_DF_TAPE 3 /* Bits Reserved for Tape Density */ #define UNIT_V_TAPE_FMT 13 /* Bit offset for Tape Format */ #define UNIT_S_TAPE_FMT 4 /* Bits Reserved for Tape Format */ #define UNIT_M_TAPE_FMT (((1 << UNIT_S_TAPE_FMT) - 1) << UNIT_V_TAPE_FMT) #define UNIT_V_TAPE_ANSI 17 /* Bit offset for ANSI Tape Type */ #define UNIT_S_TAPE_ANSI 4 /* Bits Reserved for ANSI Tape Type */ #define UNIT_M_TAPE_ANSI (((1 << UNIT_S_TAPE_ANSI) - 1) << UNIT_V_TAPE_ANSI) struct BITFIELD { const char *name; /* field name */ uint32 offset; /* starting bit */ uint32 width; /* width */ const char **valuenames; /* map of values to strings */ const char *format; /* value format string */ |
︙ | ︙ | |||
674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 | uint32 width; /* width */ uint32 offset; /* starting bit */ uint32 depth; /* save depth */ const char *desc; /* description */ BITFIELD *fields; /* bit fields */ uint32 qptr; /* circ q ptr */ size_t str_size; /* structure size */ /* NOTE: Flags MUST always be last since it is initialized outside of macro definitions */ uint32 flags; /* flags */ }; /* Register flags */ #define REG_FMT 00003 /* see PV_x */ #define REG_RO 00004 /* read only */ #define REG_HIDDEN 00010 /* hidden */ #define REG_NZ 00020 /* must be non-zero */ #define REG_UNIT 00040 /* in unit struct */ #define REG_STRUCT 00100 /* in structure array */ #define REG_CIRC 00200 /* circular array */ #define REG_VMIO 00400 /* use VM data print/parse */ #define REG_VMAD 01000 /* use VM addr print/parse */ #define REG_FIT 02000 /* fit access to size */ #define REG_HRO (REG_RO | REG_HIDDEN) /* hidden, read only */ #define REG_V_UF 16 /* device specific */ #define REG_UFMASK (~((1u << REG_V_UF) - 1)) /* user flags mask */ #define REG_VMFLAGS (REG_VMIO | REG_UFMASK) /* call VM routine if any of these are set */ /* Command tables, base and alternate formats */ | > > > > | 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 | uint32 width; /* width */ uint32 offset; /* starting bit */ uint32 depth; /* save depth */ const char *desc; /* description */ BITFIELD *fields; /* bit fields */ uint32 qptr; /* circ q ptr */ size_t str_size; /* structure size */ size_t obj_size; /* sizeof(*loc) */ size_t ele_size; /* sizeof(**loc) or sizeof(*loc) if depth == 1 */ const char *macro; /* Initializer Macro Name */ /* NOTE: Flags MUST always be last since it is initialized outside of macro definitions */ uint32 flags; /* flags */ }; /* Register flags */ #define REG_FMT 00003 /* see PV_x */ #define REG_RO 00004 /* read only */ #define REG_HIDDEN 00010 /* hidden */ #define REG_NZ 00020 /* must be non-zero */ #define REG_UNIT 00040 /* in unit struct */ #define REG_STRUCT 00100 /* in structure array */ #define REG_CIRC 00200 /* circular array */ #define REG_VMIO 00400 /* use VM data print/parse */ #define REG_VMAD 01000 /* use VM addr print/parse */ #define REG_FIT 02000 /* fit access to size */ #define REG_DEPOSIT 04000 /* call VM routine after update */ #define REG_HRO (REG_RO | REG_HIDDEN) /* hidden, read only */ #define REG_V_UF 16 /* device specific */ #define REG_UFMASK (~((1u << REG_V_UF) - 1)) /* user flags mask */ #define REG_VMFLAGS (REG_VMIO | REG_UFMASK) /* call VM routine if any of these are set */ /* Command tables, base and alternate formats */ |
︙ | ︙ | |||
737 738 739 740 741 742 743 | const char *pstring; /* print string */ const char *mstring; /* match string */ t_stat (*valid)(UNIT *up, int32 v, CONST char *cp, void *dp); /* validation routine */ t_stat (*disp)(FILE *st, UNIT *up, int32 v, CONST void *dp); /* display routine */ void *desc; /* value descriptor */ | | | | 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 | const char *pstring; /* print string */ const char *mstring; /* match string */ t_stat (*valid)(UNIT *up, int32 v, CONST char *cp, void *dp); /* validation routine */ t_stat (*disp)(FILE *st, UNIT *up, int32 v, CONST void *dp); /* display routine */ void *desc; /* value descriptor */ /* pointer to something needed by */ /* the validation and/or display routines */ const char *help; /* help string */ }; /* mtab mask flag bits */ /* NOTE: MTAB_VALR and MTAB_VALO are only used to display help */ #define MTAB_XTD (1u << UNIT_V_RSV) /* ext entry flag */ |
︙ | ︙ | |||
806 807 808 809 810 811 812 | int32 switches; /* flags */ #define EXP_TYP_PERSIST (SWMASK ('P')) /* rule persists after match, default is once a rule matches, it is removed */ #define EXP_TYP_CLEARALL (SWMASK ('C')) /* clear all rules after matching this rule, default is to once a rule matches, it is removed */ #define EXP_TYP_REGEX (SWMASK ('R')) /* rule pattern is a regular expression */ #define EXP_TYP_REGEX_I (SWMASK ('I')) /* regular expression pattern matching should be case independent */ #define EXP_TYP_TIME (SWMASK ('T')) /* halt delay is in microseconds instead of instructions */ #if defined(USE_REGEX) | | > | 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 | int32 switches; /* flags */ #define EXP_TYP_PERSIST (SWMASK ('P')) /* rule persists after match, default is once a rule matches, it is removed */ #define EXP_TYP_CLEARALL (SWMASK ('C')) /* clear all rules after matching this rule, default is to once a rule matches, it is removed */ #define EXP_TYP_REGEX (SWMASK ('R')) /* rule pattern is a regular expression */ #define EXP_TYP_REGEX_I (SWMASK ('I')) /* regular expression pattern matching should be case independent */ #define EXP_TYP_TIME (SWMASK ('T')) /* halt delay is in microseconds instead of instructions */ #if defined(USE_REGEX) pcre *regex; /* compiled regular expression */ int re_nsub; /* regular expression sub expression count */ #endif char *act; /* action string */ }; /* Expect Context */ struct EXPECT { |
︙ | ︙ | |||
877 878 879 880 881 882 883 | of the structures they exist to populate. */ #define UDATA(act,fl,cap) NULL,act,NULL,NULL,NULL,0,0,(fl),0,(cap),0,NULL,0,0 /* Internal use ONLY (see below) Generic Register declaration for all fields */ | | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | | > > > | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > | | | | | | > > > | 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 | of the structures they exist to populate. */ #define UDATA(act,fl,cap) NULL,act,NULL,NULL,NULL,0,0,(fl),0,(cap),0,NULL,0,0 /* Internal use ONLY (see below) Generic Register declaration for all fields */ #define _REGDATANF(nm,loc,rdx,wd,off,dep,desc,flds,qptr,siz,elesiz,macro) \ nm, (loc), (rdx), (wd), (off), (dep), (desc), (flds), (qptr), (siz), sizeof(*(loc)), (elesiz), #macro #if defined (__STDC__) || defined (_WIN32) /* Variants which depend on how macro arguments are convered to strings */ /* Generic Register declaration for all fields. If the register structure is extended, this macro will be retained and a new internal macro will be provided that populates the new register structure */ #define REGDATA(nm,loc,rdx,wd,off,dep,desc,flds,fl,qptr,siz) \ _REGDATANF(#nm,&(loc),rdx,wd,off,dep,desc,flds,qptr,siz,sizeof((loc)),REGDATA),(fl) #define REGDATAC(nm,loc,rdx,wd,off,dep,desc,flds,fl,qptr,siz) \ _REGDATANF(#nm,&(loc),rdx,wd,off,dep,desc,flds,qptr,siz,sizeof((loc)),REGDATAC),(fl) /* Right Justified Octal Register Data */ #define ORDATA(nm,loc,wd) \ _REGDATANF(#nm,&(loc),8,wd,0,1,NULL,NULL,0,0,sizeof((loc)),ORDATA) #define ORDATAD(nm,loc,wd,desc) \ _REGDATANF(#nm,&(loc),8,wd,0,1,desc,NULL,0,0,sizeof((loc)),ORDATAD) #define ORDATADF(nm,loc,wd,desc,flds) \ _REGDATANF(#nm,&(loc),8,wd,0,1,desc,flds,0,0,sizeof((loc)),ORDATADF) /* Right Justified Decimal Register Data */ #define DRDATA(nm,loc,wd) \ _REGDATANF(#nm,&(loc),10,wd,0,1,NULL,NULL,0,0,sizeof((loc)),DRDATA) #define DRDATAD(nm,loc,wd,desc) \ _REGDATANF(#nm,&(loc),10,wd,0,1,desc,NULL,0,0,sizeof((loc)),DRDATAD) #define DRDATADF(nm,loc,wd,desc,flds) \ _REGDATANF(#nm,&(loc),10,wd,0,1,desc,flds,0,0,sizeof((loc)),DRDATADF) /* Right Justified Hexadecimal Register Data */ #define HRDATA(nm,loc,wd) \ _REGDATANF(#nm,&(loc),16,wd,0,1,NULL,NULL,0,0,sizeof((loc)),HRDATA) #define HRDATAD(nm,loc,wd,desc) \ _REGDATANF(#nm,&(loc),16,wd,0,1,desc,NULL,0,0,sizeof((loc)),HRDATAD) #define HRDATADF(nm,loc,wd,desc,flds) \ _REGDATANF(#nm,&(loc),16,wd,0,1,desc,flds,0,0,sizeof((loc)),HRDATADF) /* Right Justified Binary Register Data */ #define BINRDATA(nm,loc,wd) \ _REGDATANF(#nm,&(loc),2,wd,0,1,NULL,NULL,0,0,sizeof((loc)),BINRDATA) #define BINRDATAD(nm,loc,wd,desc) \ _REGDATANF(#nm,&(loc),2,wd,0,1,desc,NULL,0,0,sizeof((loc)),BINRDATAD) #define BINRDATADF(nm,loc,wd,desc,flds) \ _REGDATANF(#nm,&(loc),2,wd,0,1,desc,flds,0,0,sizeof((loc)),BINRDATADF) /* One-bit binary flag at an arbitrary offset in a 32-bit word Register */ #define FLDATA(nm,loc,pos) \ _REGDATANF(#nm,&(loc),2,1,pos,1,NULL,NULL,0,0,sizeof((loc)),FLDATA) #define FLDATAD(nm,loc,pos,desc) \ _REGDATANF(#nm,&(loc),2,1,pos,1,desc,NULL,0,0,sizeof((loc)),FLDATAD) #define FLDATADF(nm,loc,pos,desc,flds) \ _REGDATANF(#nm,&(loc),2,1,pos,1,desc,flds,0,0,sizeof((loc)),FLDATADF) /* Arbitrary location and Radix Register */ #define GRDATA(nm,loc,rdx,wd,pos) \ _REGDATANF(#nm,&(loc),rdx,wd,pos,1,NULL,NULL,0,0,sizeof((loc)),GRDATA) #define GRDATAD(nm,loc,rdx,wd,pos,desc) \ _REGDATANF(#nm,&(loc),rdx,wd,pos,1,desc,NULL,0,0,sizeof((loc)),GRDATAD) #define GRDATADF(nm,loc,rdx,wd,pos,desc,flds) \ _REGDATANF(#nm,&(loc),rdx,wd,pos,1,desc,flds,0,0,sizeof((loc)),GRDATADF) /* Arrayed register whose data is kept in a standard C array Register */ #define BRDATA(nm,loc,rdx,wd,dep) \ _REGDATANF(#nm,&(loc),rdx,wd,0,dep,NULL,NULL,0,0,sizeof(*(loc)),BRDATA) #define BRDATAD(nm,loc,rdx,wd,dep,desc) \ _REGDATANF(#nm,&(loc),rdx,wd,0,dep,desc,NULL,0,0,sizeof(*(loc)),BRDATAD) #define BRDATADF(nm,loc,rdx,wd,dep,desc,flds) \ _REGDATANF(#nm,&(loc),rdx,wd,0,dep,desc,flds,0,0,sizeof(*(loc)),BRDATADF) /* Range of memory whose data is successive scalar values accessed like an array Register */ #define VBRDATA(nm,loc,rdx,wd,dep) \ _REGDATANF(#nm,&(loc),rdx,wd,0,dep,NULL,NULL,0,0,sizeof(loc),VBRDATA) #define VBRDATAD(nm,loc,rdx,wd,dep,desc) \ _REGDATANF(#nm,&(loc),rdx,wd,0,dep,desc,NULL,0,0,sizeof(loc),VBRDATAD) #define VBRDATADF(nm,loc,rdx,wd,dep,desc,flds) \ _REGDATANF(#nm,&(loc),rdx,wd,0,dep,desc,flds,0,0,sizeof(loc),VBRDATADF) /* Arrayed register whose data is part of the UNIT structure */ #define URDATA(nm,loc,rdx,wd,off,dep,fl) \ _REGDATANF(#nm,&(loc),rdx,wd,off,dep,NULL,NULL,0,0,sizeof((loc)),URDATA),((fl) | REG_UNIT) #define URDATAD(nm,loc,rdx,wd,off,dep,fl,desc) \ _REGDATANF(#nm,&(loc),rdx,wd,off,dep,desc,NULL,0,0,sizeof((loc)),URDATAD),((fl) | REG_UNIT) #define URDATADF(nm,loc,rdx,wd,off,dep,fl,desc,flds) \ _REGDATANF(#nm,&(loc),rdx,wd,off,dep,desc,flds,0,0,sizeof((loc)),URDATADF),((fl) | REG_UNIT) /* Arrayed register whose data is part of an arbitrary structure */ #define STRDATA(nm,loc,rdx,wd,off,dep,siz,fl) \ _REGDATANF(#nm,&(loc),rdx,wd,off,dep,NULL,NULL,0,siz,sizeof((loc)),STRDATA),((fl) | REG_STRUCT) #define STRDATAD(nm,loc,rdx,wd,off,dep,siz,fl,desc) \ _REGDATANF(#nm,&(loc),rdx,wd,off,dep,desc,NULL,0,siz,sizeof((loc)),STRDATAD),((fl) | REG_STRUCT) #define STRDATADF(nm,loc,rdx,wd,off,dep,siz,fl,desc,flds) \ _REGDATANF(#nm,&(loc),rdx,wd,off,dep,desc,flds,0,siz,sizeof((loc)),STRDATADF),((fl) | REG_STRUCT) /* Hidden Blob of Data - Only used for SAVE/RESTORE */ #define SAVEDATA(nm,loc) \ _REGDATANF(#nm,&(loc),0,8,0,1,NULL,NULL,0,sizeof(loc),sizeof(loc),SAVEDATA),(REG_HRO) #define BIT(nm) {#nm, 0xffffffff, 1, NULL, NULL} /* Single Bit definition */ #define BITNC {"", 0xffffffff, 1, NULL, NULL} /* Don't care Bit definition */ #define BITF(nm,sz) {#nm, 0xffffffff, sz, NULL, NULL} /* Bit Field definition */ #define BITNCF(sz) {"", 0xffffffff, sz, NULL, NULL} /* Don't care Bit Field definition */ #define BITFFMT(nm,sz,fmt) {#nm, 0xffffffff, sz, NULL, #fmt} /* Bit Field definition with Output format */ #define BITFNAM(nm,sz,names) {#nm, 0xffffffff, sz, names,NULL} /* Bit Field definition with value->name map */ #else /* For non-STD-C compiler which can't stringify macro arguments with # */ /* Generic Register declaration for all fields. If the register structure is extended, this macro will be retained and a new macro will be provided that populates the new register structure */ #define REGDATA(nm,loc,rdx,wd,off,dep,desc,flds,fl,qptr,siz) \ _REGDATANF("nm",&(loc),rdx,wd,off,dep,desc,flds,qptr,siz,sizeof((loc)),REGDATA),(fl) #define REGDATAC(nm,loc,rdx,wd,off,dep,desc,flds,fl,qptr,siz) \ _REGDATANF("nm",&(loc),rdx,wd,off,dep,desc,flds,qptr,siz,sizeof((loc)),REGDATAC),(fl) /* Right Justified Octal Register Data */ #define ORDATA(nm,loc,wd) \ _REGDATANF("nm",&(loc),8,wd,0,1,NULL,NULL,0,0,sizeof((loc)),ORDATA) #define ORDATAD(nm,loc,wd,desc) \ _REGDATANF("nm",&(loc),8,wd,0,1,desc,NULL,0,0,sizeof((loc)),ORDATAD) #define ORDATADF(nm,loc,wd,desc,flds) \ _REGDATANF("nm",&(loc),8,wd,0,1,desc,flds,0,0,sizeof((loc)),ORDATADF) /* Right Justified Decimal Register Data */ #define DRDATA(nm,loc,wd) \ _REGDATANF("nm",&(loc),10,wd,0,1,NULL,NULL,0,0,sizeof((loc)),DRDATA) #define DRDATAD(nm,loc,wd,desc) \ _REGDATANF("nm",&(loc),10,wd,0,1,desc,NULL,0,0,sizeof((loc)),DRDATAD) #define DRDATADF(nm,loc,wd,desc,flds) \ _REGDATANF("nm",&(loc),10,wd,0,1,desc,flds,0,0,sizeof((loc)),DRDATADF) /* Right Justified Hexadecimal Register Data */ #define HRDATA(nm,loc,wd) \ _REGDATANF("nm",&(loc),16,wd,0,1,NULL,NULL,0,0,sizeof((loc)),HRDATA) #define HRDATAD(nm,loc,wd,desc) \ _REGDATANF("nm",&(loc),16,wd,0,1,desc,NULL,0,0,sizeof((loc)),HRDATAD) #define HRDATADF(nm,loc,wd,desc,flds) \ _REGDATANF("nm",&(loc),16,wd,0,1,desc,flds,0,0,sizeof((loc)),HRDATADF) /* Right Justified Binary Register Data */ #define BINRDATA(nm,loc,wd) \ _REGDATANF("nm",&(loc),2,wd,0,1,NULL,NULL,0,0,sizeof((loc)),BINRDATA) #define BINRDATAD(nm,loc,wd,desc) \ _REGDATANF("nm",&(loc),2,wd,0,1,desc,NULL,0,0,sizeof((loc)),BINRDATAD) #define BINRDATADF(nm,loc,wd,desc,flds) \ _REGDATANF("nm",&(loc),2,wd,0,1,desc,flds,0,0,sizeof((loc)),BINRDATADF) /* One-bit binary flag at an arbitrary offset in a 32-bit word Register */ #define FLDATA(nm,loc,pos) \ _REGDATANF("nm",&(loc),2,1,pos,1,NULL,NULL,0,0,sizeof((loc)),FLDATA) #define FLDATAD(nm,loc,pos,desc) \ _REGDATANF("nm",&(loc),2,1,pos,1,desc,NULL,0,0,sizeof((loc)),FLDATAD) #define FLDATADF(nm,loc,pos,desc,flds) \ _REGDATANF("nm",&(loc),2,1,pos,1,desc,flds,0,0,sizeof((loc)),FLDATADF) /* Arbitrary location and Radix Register */ #define GRDATA(nm,loc,rdx,wd,pos) \ _REGDATANF("nm",&(loc),rdx,wd,pos,1,NULL,NULL,0,0,sizeof((loc)),GRDATA) #define GRDATAD(nm,loc,rdx,wd,pos,desc) \ _REGDATANF("nm",&(loc),rdx,wd,pos,1,desc,NULL,0,0,sizeof((loc)),GRDATAD) #define GRDATADF(nm,loc,rdx,wd,pos,desc,flds) \ _REGDATANF("nm",&(loc),rdx,wd,pos,1,desc,flds,0,0,sizeof((loc)),GRDATADF) /* Arrayed register whose data is kept in a standard C array Register */ #define BRDATA(nm,loc,rdx,wd,dep) \ _REGDATANF("nm",&(loc),rdx,wd,0,dep,NULL,NULL,0,0,sizeof(*(loc)),BRDATA) #define BRDATAD(nm,loc,rdx,wd,dep,desc) \ _REGDATANF("nm",&(loc),rdx,wd,0,dep,desc,NULL,0,0,sizeof(*(loc)),BRDATAD) #define BRDATADF(nm,loc,rdx,wd,dep,desc,flds) \ _REGDATANF("nm",&(loc),rdx,wd,0,dep,desc,flds,0,0,sizeof(*(loc)),BRDATADF) /* Range of memory whose data is successive scalar values accessed like an array Register */ #define VBRDATA(nm,loc,rdx,wd,dep) \ _REGDATANF("nm",&(loc),rdx,wd,0,dep,NULL,NULL,0,0,sizeof(loc),VBRDATA) #define VBRDATAD(nm,loc,rdx,wd,dep,desc) \ _REGDATANF("nm",&(loc),rdx,wd,0,dep,desc,NULL,0,0,sizeof(loc),VBRDATAD) #define VBRDATADF(nm,loc,rdx,wd,dep,desc,flds) \ _REGDATANF("nm",&(loc),rdx,wd,0,dep,desc,flds,0,0,sizeof(loc),VBRDATADF) /* Arrayed register whose data is part of the UNIT structure */ #define URDATA(nm,loc,rdx,wd,off,dep,fl) \ _REGDATANF("nm",&(loc),rdx,wd,off,dep,NULL,NULL,0,0,sizeof((loc)),URDATA),((fl) | REG_UNIT) #define URDATAD(nm,loc,rdx,wd,off,dep,fl,desc) \ _REGDATANF("nm",&(loc),rdx,wd,off,dep,desc,NULL,0,0,sizeof((loc)),URDATAD),((fl) | REG_UNIT) #define URDATADF(nm,loc,rdx,wd,off,dep,fl,desc,flds) \ _REGDATANF("nm",&(loc),rdx,wd,off,dep,desc,flds,0,0,sizeof((loc)),URDATADF),((fl) | REG_UNIT) /* Arrayed register whose data is part of an arbitrary structure */ #define STRDATA(nm,loc,rdx,wd,off,dep,siz,fl) \ _REGDATANF("nm",&(loc),rdx,wd,off,dep,NULL,NULL,0,siz,sizeof((loc)),STRDATA),((fl) | REG_STRUCT) #define STRDATAD(nm,loc,rdx,wd,off,dep,siz,fl,desc) \ _REGDATANF("nm",&(loc),rdx,wd,off,dep,desc,NULL,0,siz,sizeof((loc)),STRDATAD),((fl) | REG_STRUCT) #define STRDATADF(nm,loc,rdx,wd,off,dep,siz,fl,desc,flds) \ _REGDATANF("nm",&(loc),rdx,wd,off,dep,desc,flds,0,siz,sizeof((loc)),STRDATADF),((fl) | REG_STRUCT) /* Hidden Blob of Data - Only used for SAVE/RESTORE */ #define SAVEDATA(nm,loc) \ _REGDATANF("nm",&(loc),0,8,0,1,NULL,NULL,0,sizeof(loc),sizeof(loc)),SAVEDATA),(REG_HRO) #define BIT(nm) {"nm", 0xffffffff, 1, NULL, NULL} /* Single Bit definition */ #define BITNC {"", 0xffffffff, 1, NULL, NULL} /* Don't care Bit definition */ #define BITF(nm,sz) {"nm", 0xffffffff, sz, NULL, NULL} /* Bit Field definition */ #define BITNCF(sz) {"", 0xffffffff, sz, NULL, NULL} /* Don't care Bit Field definition */ #define BITFFMT(nm,sz,fmt) {"nm", 0xffffffff, sz, NULL, "fmt"}/* Bit Field definition with Output format */ #define BITFNAM(nm,sz,names) {"nm", 0xffffffff, sz, names,NULL} /* Bit Field definition with value->name map */ #endif |
︙ | ︙ | |||
1076 1077 1078 1079 1080 1081 1082 | extern UNIT * volatile sim_asynch_queue; extern volatile t_bool sim_idle_wait; extern int32 sim_asynch_check; extern int32 sim_asynch_latency; extern int32 sim_asynch_inst_latency; /* Thread local storage */ | > > > > | | 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 | extern UNIT * volatile sim_asynch_queue; extern volatile t_bool sim_idle_wait; extern int32 sim_asynch_check; extern int32 sim_asynch_latency; extern int32 sim_asynch_inst_latency; /* Thread local storage */ #if defined(thread_local) #define AIO_TLS thread_local #elif (__STDC_VERSION__ >= 201112) && !(defined(__STDC_NO_THREADS__)) #define AIO_TLS _Thread_local #elif defined(__GNUC__) && !defined(__APPLE__) && !defined(__hpux) && !defined(__OpenBSD__) && !defined(_AIX) #define AIO_TLS __thread #elif defined(_MSC_VER) #define AIO_TLS __declspec(thread) #else /* Other compiler environment, then don't worry about thread local storage. */ /* It is primarily used only used in debugging messages */ #define AIO_TLS |
︙ | ︙ | |||
1162 1163 1164 1165 1166 1167 1168 | #ifdef USE_AIO_INTRINSICS /* This approach uses intrinsics to manage access to the link list head */ /* sim_asynch_queue. This implementation is a completely lock free design */ /* which avoids the potential ABA issues. */ #define AIO_QUEUE_MODE "Lock free asynchronous event queue" #define AIO_INIT \ do { \ | < < < | 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 | #ifdef USE_AIO_INTRINSICS /* This approach uses intrinsics to manage access to the link list head */ /* sim_asynch_queue. This implementation is a completely lock free design */ /* which avoids the potential ABA issues. */ #define AIO_QUEUE_MODE "Lock free asynchronous event queue" #define AIO_INIT \ do { \ sim_asynch_main_threadid = pthread_self(); \ /* Empty list/list end uses the point value (void *)1. \ This allows NULL in an entry's a_next pointer to \ indicate that the entry is not currently in any list */ \ sim_asynch_queue = QUEUE_LIST_END; \ } while (0) #define AIO_CLEANUP \ do { \ pthread_mutex_destroy(&sim_asynch_lock); \ pthread_cond_destroy(&sim_asynch_wake); \ pthread_mutex_destroy(&sim_timer_lock); \ pthread_cond_destroy(&sim_timer_wake); \ |
︙ | ︙ | |||
1205 1206 1207 1208 1209 1210 1211 | #else /* !USE_AIO_INTRINSICS */ /* This approach uses a pthread mutex to manage access to the link list */ /* head sim_asynch_queue. It will always work, but may be slower than the */ /* lock free approach when using USE_AIO_INTRINSICS */ #define AIO_QUEUE_MODE "Lock based asynchronous event queue" #define AIO_INIT \ do { \ | < < < | 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 | #else /* !USE_AIO_INTRINSICS */ /* This approach uses a pthread mutex to manage access to the link list */ /* head sim_asynch_queue. It will always work, but may be slower than the */ /* lock free approach when using USE_AIO_INTRINSICS */ #define AIO_QUEUE_MODE "Lock based asynchronous event queue" #define AIO_INIT \ do { \ pthread_mutexattr_t attr; \ \ pthread_mutexattr_init (&attr); \ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); \ pthread_mutex_init (&sim_asynch_lock, &attr); \ pthread_mutexattr_destroy (&attr); \ sim_asynch_main_threadid = pthread_self(); \ /* Empty list/list end uses the point value (void *)1. \ This allows NULL in an entry's a_next pointer to \ indicate that the entry is not currently in any list */ \ sim_asynch_queue = QUEUE_LIST_END; \ } while (0) #define AIO_CLEANUP \ do { \ pthread_mutex_destroy(&sim_asynch_lock); \ pthread_cond_destroy(&sim_asynch_wake); \ pthread_mutex_destroy(&sim_timer_lock); \ pthread_cond_destroy(&sim_timer_wake); \ |
︙ | ︙ | |||
1247 1248 1249 1250 1251 1252 1253 | } else { \ uptr->a_next = sim_asynch_queue; \ uptr->a_event_time = event_time; \ uptr->a_activate_call = (ACTIVATE_API)&caller; \ sim_asynch_queue = uptr; \ } \ if (sim_idle_wait) { \ | > > | > > | 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 | } else { \ uptr->a_next = sim_asynch_queue; \ uptr->a_event_time = event_time; \ uptr->a_activate_call = (ACTIVATE_API)&caller; \ sim_asynch_queue = uptr; \ } \ if (sim_idle_wait) { \ if (sim_deb) { /* only while debug do lock/unlock overhead */ \ AIO_UNLOCK; \ sim_debug (TIMER_DBG_IDLE, &sim_timer_dev, "waking due to event on %s after %d instructions\n", sim_uname(uptr), event_time);\ AIO_LOCK; \ } \ pthread_cond_signal (&sim_asynch_wake); \ } \ AIO_UNLOCK; \ sim_asynch_check = 0; \ return SCPE_OK; \ } else (void)0 #endif /* USE_AIO_INTRINSICS */ |
︙ | ︙ |
︙ | ︙ | |||
29 30 31 32 33 34 35 36 37 38 39 40 41 42 | as well as OS-specific direct hardware access. 25-Jan-11 MP Initial Implemementation Public routines: sim_disk_attach attach disk unit sim_disk_detach detach disk unit sim_disk_attach_help help routine for attaching disks sim_disk_rdsect read disk sectors sim_disk_rdsect_a read disk sectors asynchronously sim_disk_wrsect write disk sectors sim_disk_wrsect_a write disk sectors asynchronously sim_disk_unload unload or detach a disk as needed | > | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | as well as OS-specific direct hardware access. 25-Jan-11 MP Initial Implemementation Public routines: sim_disk_attach attach disk unit sim_disk_attach_ex attach disk unit extended parameters sim_disk_detach detach disk unit sim_disk_attach_help help routine for attaching disks sim_disk_rdsect read disk sectors sim_disk_rdsect_a read disk sectors asynchronously sim_disk_wrsect write disk sectors sim_disk_wrsect_a write disk sectors asynchronously sim_disk_unload unload or detach a disk as needed |
︙ | ︙ | |||
80 81 82 83 84 85 86 87 88 89 90 91 | #include "sim_ether.h" #include <ctype.h> #include <sys/stat.h> #if defined SIM_ASYNCH_IO #include <pthread.h> #endif struct disk_context { DEVICE *dptr; /* Device for unit (access to debug flags) */ uint32 dbit; /* debugging bit */ uint32 sector_size; /* Disk Sector Size (of the pseudo disk) */ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > | 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | #include "sim_ether.h" #include <ctype.h> #include <sys/stat.h> #if defined SIM_ASYNCH_IO #include <pthread.h> #endif /* Newly created SIMH (and possibly RAW) disk containers */ /* will have this data as the last 512 bytes of the container */ /* It will not be considered part of the data in the container */ /* Previously existing containers will have this appended to */ /* the end of the container if they are opened for write */ struct simh_disk_footer { uint8 Signature[4]; /* must be 'simh' */ uint8 CreatingSimulator[64]; /* name of simulator */ uint8 DriveType[16]; uint32 SectorSize; uint32 SectorCount; uint32 TransferElementSize; uint8 CreationTime[28]; /* Result of ctime() */ uint8 FooterVersion; /* Initially 0 */ uint8 AccessFormat; /* 1 - SIMH, 2 - RAW */ uint8 Reserved[382]; /* Currently unused */ uint32 Checksum; /* CRC32 of the prior 508 bytes */ }; /* OS Independent Disk Virtual Disk (VHD) I/O support */ #if (defined (VMS) && !(defined (__ALPHA) || defined (__ia64))) #define DONT_DO_VHD_SUPPORT /* VAX/VMS compilers don't have 64 bit integers */ #endif #if defined(_WIN32) || defined (__ALPHA) || defined (__ia64) || defined (VMS) #ifndef __BYTE_ORDER__ #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ #endif #endif #ifndef __BYTE_ORDER__ #define __BYTE_ORDER__ UNKNOWN #endif #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ static uint32 NtoHl(uint32 value) { uint8 *l = (uint8 *)&value; return (uint32)l[3] | ((uint32)l[2]<<8) | ((uint32)l[1]<<16) | ((uint32)l[0]<<24); } #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ static uint32 NtoHl(uint32 value) { return value; } #else static uint32 NtoHl(uint32 value) { uint8 *l = (uint8 *)&value; if (sim_end) return l[3] | (l[2]<<8) | (l[1]<<16) | (l[0]<<24); return value; } #endif struct disk_context { t_offset container_size; /* Size of the data portion (of the pseudo disk) */ DEVICE *dptr; /* Device for unit (access to debug flags) */ uint32 dbit; /* debugging bit */ uint32 sector_size; /* Disk Sector Size (of the pseudo disk) */ uint32 capac_factor; /* Units of Capacity (8 = quadword, 2 = word, 1 = byte) */ uint32 xfer_element_size; /* Disk Bus Transfer size (1 - byte, 2 - word, 4 - longword) */ uint32 storage_sector_size;/* Sector size of the containing storage */ uint32 removable; /* Removable device flag */ uint32 is_cdrom; /* Host system CDROM Device */ uint32 media_removed; /* Media not available flag */ uint32 auto_format; /* Format determined dynamically */ struct simh_disk_footer *footer; #if defined _WIN32 HANDLE disk_handle; /* OS specific Raw device handle */ #endif #if defined SIM_ASYNCH_IO int asynch_io; /* Asynchronous Interrupt scheduling enabled */ int asynch_io_latency; /* instructions to delay pending interrupt */ pthread_mutex_t lock; |
︙ | ︙ | |||
131 132 133 134 135 136 137 | struct disk_context *ctx = \ (struct disk_context *)uptr->disk_ctx; \ \ pthread_mutex_lock (&ctx->io_lock); \ \ sim_debug_unit (ctx->dbit, uptr, \ "sim_disk AIO_CALL(op=%d, unit=%d, lba=0x%X, sects=%d)\n",\ | | | 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | struct disk_context *ctx = \ (struct disk_context *)uptr->disk_ctx; \ \ pthread_mutex_lock (&ctx->io_lock); \ \ sim_debug_unit (ctx->dbit, uptr, \ "sim_disk AIO_CALL(op=%d, unit=%d, lba=0x%X, sects=%d)\n",\ op, (int)(uptr - ctx->dptr->units), _lba, _sects);\ \ if (ctx->callback) \ abort(); /* horrible mistake, stop */ \ ctx->io_dop = op; \ ctx->lba = _lba; \ ctx->buf = _buf; \ ctx->sects = _sects; \ |
︙ | ︙ | |||
165 166 167 168 169 170 171 | struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; /* Boost Priority for this I/O thread vs the CPU instruction execution thread which in general won't be readily yielding the processor when this thread needs to run */ sim_os_set_thread_priority (PRIORITY_ABOVE_NORMAL); | | | 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; /* Boost Priority for this I/O thread vs the CPU instruction execution thread which in general won't be readily yielding the processor when this thread needs to run */ sim_os_set_thread_priority (PRIORITY_ABOVE_NORMAL); sim_debug_unit (ctx->dbit, uptr, "_disk_io(unit=%d) starting\n", (int)(uptr - ctx->dptr->units)); pthread_mutex_lock (&ctx->io_lock); pthread_cond_signal (&ctx->startup_cond); /* Signal we're ready to go */ while (ctx->asynch_io) { pthread_cond_wait (&ctx->io_cond, &ctx->io_lock); if (ctx->io_dop == DOP_DONE) break; |
︙ | ︙ | |||
192 193 194 195 196 197 198 | pthread_mutex_lock (&ctx->io_lock); ctx->io_dop = DOP_DONE; pthread_cond_signal (&ctx->io_done); sim_activate (uptr, ctx->asynch_io_latency); } pthread_mutex_unlock (&ctx->io_lock); | | | | | | 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 | pthread_mutex_lock (&ctx->io_lock); ctx->io_dop = DOP_DONE; pthread_cond_signal (&ctx->io_done); sim_activate (uptr, ctx->asynch_io_latency); } pthread_mutex_unlock (&ctx->io_lock); sim_debug_unit (ctx->dbit, uptr, "_disk_io(unit=%d) exiting\n", (int)(uptr - ctx->dptr->units)); return NULL; } /* This routine is called in the context of the main simulator thread before processing events for any unit. It is only called when an asynchronous thread has called sim_activate() to activate a unit. The job of this routine is to put the unit in proper condition to digest what may have occurred in the asynchrconous thread. Since disk processing only handles a single I/O at a time to a particular disk device (due to using stdio for the SimH Disk format and stdio doesn't have an atomic seek+(read|write) operation), we have the opportunity to possibly detect improper attempts to issue multiple concurrent I/O requests. */ static void _disk_completion_dispatch (UNIT *uptr) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; DISK_PCALLBACK callback = ctx->callback; sim_debug_unit (ctx->dbit, uptr, "_disk_completion_dispatch(unit=%d, dop=%d, callback=%p)\n", (int)(uptr - ctx->dptr->units), ctx->io_dop, (void *)(ctx->callback)); if (ctx->io_dop != DOP_DONE) abort(); /* horribly wrong, stop */ if (ctx->callback && ctx->io_dop == DOP_DONE) { ctx->callback = NULL; callback (uptr, ctx->io_status); } } static t_bool _disk_is_active (UNIT *uptr) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; if (ctx) { sim_debug_unit (ctx->dbit, uptr, "_disk_is_active(unit=%d, dop=%d)\n", (int)(uptr - ctx->dptr->units), ctx->io_dop); return (ctx->io_dop != DOP_DONE); } return FALSE; } static t_bool _disk_cancel (UNIT *uptr) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; if (ctx) { sim_debug_unit (ctx->dbit, uptr, "_disk_cancel(unit=%d, dop=%d)\n", (int)(uptr - ctx->dptr->units), ctx->io_dop); if (ctx->asynch_io) { pthread_mutex_lock (&ctx->io_lock); while (ctx->io_dop != DOP_DONE) pthread_cond_wait (&ctx->io_done, &ctx->io_lock); pthread_mutex_unlock (&ctx->io_lock); } } |
︙ | ︙ | |||
270 271 272 273 274 275 276 | static FILE *sim_vhd_disk_merge (const char *szVHDPath, char **ParentVHD); static int sim_vhd_disk_close (FILE *f); static void sim_vhd_disk_flush (FILE *f); static t_offset sim_vhd_disk_size (FILE *f); static t_stat sim_vhd_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects); static t_stat sim_vhd_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects); static t_stat sim_vhd_disk_clearerr (UNIT *uptr); | | | > > | | | | | | | | | > | | > > > | | 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 | static FILE *sim_vhd_disk_merge (const char *szVHDPath, char **ParentVHD); static int sim_vhd_disk_close (FILE *f); static void sim_vhd_disk_flush (FILE *f); static t_offset sim_vhd_disk_size (FILE *f); static t_stat sim_vhd_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects); static t_stat sim_vhd_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects); static t_stat sim_vhd_disk_clearerr (UNIT *uptr); static t_stat sim_vhd_disk_set_dtype (FILE *f, const char *dtype, uint32 SectorSize, uint32 xfer_element_size); static const char *sim_vhd_disk_get_dtype (FILE *f, uint32 *SectorSize, uint32 *xfer_element_size, char sim_name[64], time_t *creation_time); static t_stat sim_os_disk_implemented_raw (void); static FILE *sim_os_disk_open_raw (const char *rawdevicename, const char *openmode); static int sim_os_disk_close_raw (FILE *f); static void sim_os_disk_flush_raw (FILE *f); static t_offset sim_os_disk_size_raw (FILE *f); static t_stat sim_os_disk_unload_raw (FILE *f); static t_bool sim_os_disk_isavailable_raw (FILE *f); static t_stat sim_os_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects); static t_stat sim_os_disk_read (UNIT *uptr, t_offset addr, uint8 *buf, uint32 *bytesread, uint32 bytes); static t_stat sim_os_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects); static t_stat sim_os_disk_write (UNIT *uptr, t_offset addr, uint8 *buf, uint32 *byteswritten, uint32 bytes); static t_stat sim_os_disk_info_raw (FILE *f, uint32 *sector_size, uint32 *removable, uint32 *is_cdrom); static char *HostPathToVhdPath (const char *szHostPath, char *szVhdPath, size_t VhdPathSize); static char *VhdPathToHostPath (const char *szVhdPath, char *szHostPath, size_t HostPathSize); static t_offset get_filesystem_size (UNIT *uptr); struct sim_disk_fmt { const char *name; /* name */ int32 uflags; /* unit flags */ int32 fmtval; /* Format type value */ t_stat (*impl_fnc)(void); /* Implemented Test Function */ }; static struct sim_disk_fmt fmts[] = { { "AUTO detect", 0, DKUF_F_AUTO, NULL}, { "SIMH", 0, DKUF_F_STD, NULL}, { "RAW", 0, DKUF_F_RAW, sim_os_disk_implemented_raw}, { "VHD", 0, DKUF_F_VHD, sim_vhd_disk_implemented}, { NULL, 0, 0, NULL} }; /* Set disk format */ t_stat sim_disk_set_fmt (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { uint32 f; if (uptr == NULL) return SCPE_IERR; if ((cptr == NULL) || (*cptr == '\0')) return SCPE_ARG; for (f = 0; fmts[f].name; f++) { if (fmts[f].name && (MATCH_CMD (cptr, fmts[f].name) == 0)) { if ((fmts[f].impl_fnc) && (fmts[f].impl_fnc() != SCPE_OK)) return SCPE_NOFNC; uptr->flags = (uptr->flags & ~DKUF_FMT) | (fmts[f].fmtval << DKUF_V_FMT) | fmts[f].uflags; return SCPE_OK; } } return sim_messagef (SCPE_ARG, "Unknown disk format: %s\n", cptr); } /* Show disk format */ static const char *sim_disk_fmt (UNIT *uptr) { int32 f = DK_GET_FMT (uptr); size_t i; for (i = 0; fmts[i].name; i++) if (fmts[i].fmtval == f) { return fmts[i].name; } return "invalid"; } t_stat sim_disk_show_fmt (FILE *st, UNIT *uptr, int32 val, CONST void *desc) { fprintf (st, "%s format", sim_disk_fmt (uptr)); return SCPE_OK; } /* Set disk capacity */ t_stat sim_disk_set_capac (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { |
︙ | ︙ | |||
422 423 424 425 426 427 428 | ctx->media_removed = 1; is_available = !ctx->media_removed; break; default: is_available = FALSE; break; } | | | 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 | ctx->media_removed = 1; is_available = !ctx->media_removed; break; default: is_available = FALSE; break; } sim_debug_unit (ctx->dbit, uptr, "sim_disk_isavailable(unit=%d)=%s\n", (int)(uptr - ctx->dptr->units), is_available ? "true" : "false"); return is_available; } t_bool sim_disk_isavailable_a (UNIT *uptr, DISK_PCALLBACK callback) { t_bool r = FALSE; AIO_CALLSETUP |
︙ | ︙ | |||
446 447 448 449 450 451 452 453 454 455 | return (uptr->flags & DKUF_WRP)? TRUE: FALSE; } /* Get Disk size */ t_offset sim_disk_size (UNIT *uptr) { t_offset physical_size, filesystem_size; t_bool saved_quiet = sim_quiet; | > < < | < < < < < < < < | < > | 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 | return (uptr->flags & DKUF_WRP)? TRUE: FALSE; } /* Get Disk size */ t_offset sim_disk_size (UNIT *uptr) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; t_offset physical_size, filesystem_size; t_bool saved_quiet = sim_quiet; if ((uptr->flags & UNIT_ATT) == 0) return (t_offset)-1; physical_size = ctx->container_size; sim_quiet = TRUE; filesystem_size = get_filesystem_size (uptr); sim_quiet = saved_quiet; if ((filesystem_size == (t_offset)-1) || (filesystem_size < physical_size)) return physical_size; return filesystem_size; |
︙ | ︙ | |||
483 484 485 486 487 488 489 | char *msg = "Disk: can't operate asynchronously\r\n"; sim_printf ("%s", msg); return SCPE_NOFNC; #else struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; pthread_attr_t attr; | | | 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 | char *msg = "Disk: can't operate asynchronously\r\n"; sim_printf ("%s", msg); return SCPE_NOFNC; #else struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; pthread_attr_t attr; sim_debug_unit (ctx->dbit, uptr, "sim_disk_set_async(unit=%d)\n", (int)(uptr - ctx->dptr->units)); ctx->asynch_io = sim_asynch_enabled; ctx->asynch_io_latency = latency; if (ctx->asynch_io) { pthread_mutex_init (&ctx->io_lock, NULL); pthread_cond_init (&ctx->io_cond, NULL); pthread_cond_init (&ctx->io_done, NULL); |
︙ | ︙ | |||
520 521 522 523 524 525 526 | return SCPE_NOFNC; #else struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; /* make sure device exists */ if (!ctx) return SCPE_UNATT; | | | 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 | return SCPE_NOFNC; #else struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; /* make sure device exists */ if (!ctx) return SCPE_UNATT; sim_debug_unit (ctx->dbit, uptr, "sim_disk_clr_async(unit=%d)\n", (int)(uptr - ctx->dptr->units)); if (ctx->asynch_io) { pthread_mutex_lock (&ctx->io_lock); ctx->asynch_io = 0; pthread_cond_signal (&ctx->io_cond); pthread_mutex_unlock (&ctx->io_lock); pthread_join (ctx->io_thread, NULL); |
︙ | ︙ | |||
545 546 547 548 549 550 551 | static t_stat _sim_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { t_offset da; uint32 err, tbc; size_t i; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; | | > > > | | > | | | > > > > > | < > > > > > > | > | | | > | | > < < | > | | < | > < < < < < < < < < < < | < | < < < < < < | | | | | < | 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 | static t_stat _sim_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { t_offset da; uint32 err, tbc; size_t i; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; sim_debug_unit (ctx->dbit, uptr, "_sim_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr - ctx->dptr->units), lba, sects); da = ((t_offset)lba) * ctx->sector_size; tbc = sects * ctx->sector_size; if (sectsread) *sectsread = 0; while (tbc) { size_t sectbytes; err = sim_fseeko (uptr->fileref, da, SEEK_SET); /* set pos */ if (err) return SCPE_IOERR; i = sim_fread (buf, 1, tbc, uptr->fileref); if (i < tbc) /* fill */ memset (&buf[i], 0, tbc-i); sectbytes = (i / ctx->sector_size) * ctx->sector_size; if (i > sectbytes) sectbytes += ctx->sector_size; if (sectsread) *sectsread += sectbytes / ctx->sector_size; err = ferror (uptr->fileref); if (err) return SCPE_IOERR; tbc -= sectbytes; if ((tbc == 0) || (i == 0)) return SCPE_OK; da += sectbytes; buf += sectbytes; } return SCPE_OK; } t_stat sim_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { t_stat r; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; uint32 f = DK_GET_FMT (uptr); t_seccnt sread = 0; sim_debug_unit (ctx->dbit, uptr, "sim_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr - ctx->dptr->units), lba, sects); if ((sects == 1) && /* Single sector reads */ (lba >= (uptr->capac*ctx->capac_factor)/(ctx->sector_size/((ctx->dptr->flags & DEV_SECTORS) ? ctx->sector_size : 1)))) {/* beyond the end of the disk */ memset (buf, '\0', ctx->sector_size); /* are bad block management efforts - zero buffer */ if (sectsread) *sectsread = 1; return SCPE_OK; /* return success */ } if ((0 == (ctx->sector_size & (ctx->storage_sector_size - 1))) || /* Sector Aligned & whole sector transfers */ ((0 == ((lba*ctx->sector_size) & (ctx->storage_sector_size - 1))) && (0 == ((sects*ctx->sector_size) & (ctx->storage_sector_size - 1)))) || (f == DKUF_F_STD) || (f == DKUF_F_VHD)) { /* or SIMH or VHD formats */ switch (f) { /* case on format */ case DKUF_F_STD: /* SIMH format */ r = _sim_disk_rdsect (uptr, lba, buf, &sread, sects); break; case DKUF_F_VHD: /* VHD format */ r = sim_vhd_disk_rdsect (uptr, lba, buf, &sread, sects); break; case DKUF_F_RAW: /* Raw Physical Disk Access */ r = sim_os_disk_rdsect (uptr, lba, buf, &sread, sects); break; default: return SCPE_NOFNC; } if (sectsread) *sectsread = sread; sim_buf_swap_data (buf, ctx->xfer_element_size, (sread * ctx->sector_size) / ctx->xfer_element_size); return r; } else { /* Unaligned and/or partial sector transfers in RAW mode */ size_t tbufsize = sects * ctx->sector_size + 2 * ctx->storage_sector_size; uint8 *tbuf = (uint8*) malloc (tbufsize); t_offset ssaddr = (lba * (t_offset)ctx->sector_size) & ~(t_offset)(ctx->storage_sector_size -1); uint32 soffset = (uint32)((lba * (t_offset)ctx->sector_size) - ssaddr); uint32 bytesread; if (sectsread) *sectsread = 0; if (tbuf == NULL) return SCPE_MEM; r = sim_os_disk_read (uptr, ssaddr, tbuf, &bytesread, tbufsize & ~(ctx->storage_sector_size - 1)); sim_buf_swap_data (tbuf + soffset, ctx->xfer_element_size, (bytesread - soffset) / ctx->xfer_element_size); memcpy (buf, tbuf + soffset, sects * ctx->sector_size); if (sectsread) { *sectsread = (bytesread - soffset) / ctx->sector_size; if (*sectsread > sects) *sectsread = sects; } free (tbuf); return r; } } t_stat sim_disk_rdsect_a (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects, DISK_PCALLBACK callback) |
︙ | ︙ | |||
661 662 663 664 665 666 667 | static t_stat _sim_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) { t_offset da; uint32 err, tbc; size_t i; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; | | | > | > > | | < < > | | | | > | | > > > > > > > > > > > > > > > > | < < < < < < < < < | | | | > | | < < < < | < < < < | < | > > | < < > > | < | < < < < < < | < < < < < < < < < < < < < < | < < < < < < < | < < < < < | < < < < < | | | 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 | static t_stat _sim_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) { t_offset da; uint32 err, tbc; size_t i; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; sim_debug_unit (ctx->dbit, uptr, "_sim_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr - ctx->dptr->units), lba, sects); da = ((t_offset)lba) * ctx->sector_size; tbc = sects * ctx->sector_size; if (sectswritten) *sectswritten = 0; err = sim_fseeko (uptr->fileref, da, SEEK_SET); /* set pos */ if (err) return SCPE_IOERR; i = sim_fwrite (buf, ctx->xfer_element_size, tbc/ctx->xfer_element_size, uptr->fileref); if (sectswritten) *sectswritten += (t_seccnt)((i * ctx->xfer_element_size + ctx->sector_size - 1)/ctx->sector_size); err = ferror (uptr->fileref); if (err) return SCPE_IOERR; return SCPE_OK; } t_stat sim_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; uint32 f = DK_GET_FMT (uptr); t_stat r; uint8 *tbuf = NULL; sim_debug_unit (ctx->dbit, uptr, "sim_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr - ctx->dptr->units), lba, sects); if (uptr->dynflags & UNIT_DISK_CHK) { DEVICE *dptr = find_dev_from_unit (uptr); uint32 capac_factor = ((dptr->dwidth / dptr->aincr) >= 32) ? 8 : ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (quadword: 8, word: 2, byte: 1) */ t_lba total_sectors = (t_lba)((uptr->capac*capac_factor)/(ctx->sector_size/((dptr->flags & DEV_SECTORS) ? 512 : 1))); t_lba sect; for (sect = 0; sect < sects; sect++) { t_lba offset; t_bool sect_error = FALSE; for (offset = 0; offset < ctx->sector_size; offset += sizeof(uint32)) { if (*((uint32 *)&buf[sect*ctx->sector_size + offset]) != (uint32)(lba + sect)) { sect_error = TRUE; break; } } if (sect_error) { uint32 save_dctrl = dptr->dctrl; FILE *save_sim_deb = sim_deb; sim_printf ("\n%s: Write Address Verification Error on lbn %d(0x%X) of %d(0x%X).\n", sim_uname (uptr), (int)(lba+sect), (int)(lba+sect), (int)total_sectors, (int)total_sectors); dptr->dctrl = 0xFFFFFFFF; sim_deb = save_sim_deb ? save_sim_deb : stdout; sim_disk_data_trace (uptr, buf+sect*ctx->sector_size, lba+sect, ctx->sector_size, "Found", TRUE, 1); dptr->dctrl = save_dctrl; sim_deb = save_sim_deb; } } } switch (f) { /* case on format */ case DKUF_F_STD: /* SIMH format */ return _sim_disk_wrsect (uptr, lba, buf, sectswritten, sects); case DKUF_F_VHD: /* VHD format */ if (!sim_end && (ctx->xfer_element_size != sizeof (char))) { tbuf = (uint8*) malloc (sects * ctx->sector_size); if (NULL == tbuf) return SCPE_MEM; sim_buf_copy_swapped (tbuf, buf, ctx->xfer_element_size, (sects * ctx->sector_size) / ctx->xfer_element_size); buf = tbuf; } r = sim_vhd_disk_wrsect (uptr, lba, buf, sectswritten, sects); free (tbuf); return r; case DKUF_F_RAW: /* Raw Physical Disk Access */ break; /* handle below */ default: return SCPE_NOFNC; } if ((0 == (ctx->sector_size & (ctx->storage_sector_size - 1))) || /* Sector Aligned & whole sector transfers */ ((0 == ((lba*ctx->sector_size) & (ctx->storage_sector_size - 1))) && (0 == ((sects*ctx->sector_size) & (ctx->storage_sector_size - 1))))) { if (!sim_end && (ctx->xfer_element_size != sizeof (char))) { tbuf = (uint8*) malloc (sects * ctx->sector_size); if (NULL == tbuf) return SCPE_MEM; sim_buf_copy_swapped (tbuf, buf, ctx->xfer_element_size, (sects * ctx->sector_size) / ctx->xfer_element_size); buf = tbuf; } r = sim_os_disk_wrsect (uptr, lba, buf, sectswritten, sects); } else { /* Unaligned and/or partial sector transfers in RAW mode */ size_t tbufsize = sects * ctx->sector_size + 2 * ctx->storage_sector_size; t_offset ssaddr = (lba * (t_offset)ctx->sector_size) & ~(t_offset)(ctx->storage_sector_size -1); t_offset sladdr = ((lba + sects) * (t_offset)ctx->sector_size) & ~(t_offset)(ctx->storage_sector_size -1); uint32 soffset = (uint32)((lba * (t_offset)ctx->sector_size) - ssaddr); uint32 byteswritten; tbuf = (uint8*) malloc (tbufsize); if (sectswritten) *sectswritten = 0; if (tbuf == NULL) return SCPE_MEM; /* Partial Sector writes require a read-modify-write sequence for the partial sectors */ if (soffset) sim_os_disk_read (uptr, ssaddr, tbuf, NULL, ctx->storage_sector_size); sim_os_disk_read (uptr, sladdr, tbuf + (size_t)(sladdr - ssaddr), NULL, ctx->storage_sector_size); sim_buf_copy_swapped (tbuf + soffset, buf, ctx->xfer_element_size, (sects * ctx->sector_size) / ctx->xfer_element_size); r = sim_os_disk_write (uptr, ssaddr, tbuf, &byteswritten, (soffset + (sects * ctx->sector_size) + ctx->storage_sector_size - 1) & ~(ctx->storage_sector_size - 1)); if (sectswritten) { *sectswritten = byteswritten / ctx->sector_size; if (*sectswritten > sects) *sectswritten = sects; } } free (tbuf); return r; } |
︙ | ︙ | |||
876 877 878 879 880 881 882 883 884 885 886 887 888 889 | { free (uptr->filename); uptr->filename = NULL; free (uptr->disk_ctx); uptr->disk_ctx = NULL; return stat; } #pragma pack(push,1) typedef struct _ODS1_HomeBlock { uint16 hm1_w_ibmapsize; uint32 hm1_l_ibmaplbn; uint16 hm1_w_maxfiles; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 | { free (uptr->filename); uptr->filename = NULL; free (uptr->disk_ctx); uptr->disk_ctx = NULL; return stat; } static t_stat _sim_disk_rdsect_interleave (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects, uint16 sectpertrack, uint16 interleave, uint16 skew, uint16 offset) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; t_lba sectno = lba, psa; t_stat status; if (sectsread) *sectsread = 0; do { uint16 i, track, sector; /* * Map an LBA address into a physical sector address */ track = sectno / sectpertrack; i = (sectno % sectpertrack) * interleave; if (i >= sectpertrack) i++; sector = (i + (track * skew)) % sectpertrack; psa = sector + (track * sectpertrack) + offset; status = sim_disk_rdsect(uptr, psa, buf, NULL, 1); sects--; buf += ctx->sector_size; sectno++; if (sectsread) *sectsread += 1; } while ((sects != 0) && (status == SCPE_OK)); return status; } /* * Version of sim_disk_rdsect() specifically for filesystem detection of DEC * file systems. The routine handles regular DEC disks (physsectsz == 0) and * RX01/RX02 disks (physsectsz == 128 or == 256) which ignore track 0, * interleave physical sectors 2:1 for the remaining tracks and have a skew * 6 sectors at the end of a track. */ #define RX0xNSECT 26 /* 26 sectors/track */ #define RX0xINTER 2 /* 2 sector interleave */ #define RX0xISKEW 6 /* 6 sectors interleave per track */ static t_stat _DEC_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects, uint32 physsectsz) { if (physsectsz == 0) /* Use device natural sector size */ return sim_disk_rdsect(uptr, lba, buf, sectsread, sects); return _sim_disk_rdsect_interleave(uptr, lba, buf, sectsread, sects, RX0xNSECT, RX0xINTER, RX0xISKEW, RX0xNSECT); } #pragma pack(push,1) typedef struct _ODS1_HomeBlock { uint16 hm1_w_ibmapsize; uint32 hm1_l_ibmaplbn; uint16 hm1_w_maxfiles; |
︙ | ︙ | |||
1101 1102 1103 1104 1105 1106 1107 | for (i=0; i<WordCount; i++) CheckSum += Buf[i]; return CheckSum; } | | | < > < | | > | > | | 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 | for (i=0; i<WordCount; i++) CheckSum += Buf[i]; return CheckSum; } static t_offset get_ods2_filesystem_size (UNIT *uptr, uint32 physsectsz) { DEVICE *dptr; t_addr saved_capac; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; t_offset temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */ ODS2_HomeBlock Home; ODS2_FileHeader Header; ODS2_Retreval *Retr; ODS2_SCB Scb; uint16 CheckSum1, CheckSum2; uint32 ScbLbn = 0; t_offset ret_val = (t_offset)-1; t_seccnt sects_read; if ((dptr = find_dev_from_unit (uptr)) == NULL) return ret_val; saved_capac = uptr->capac; uptr->capac = (t_addr)temp_capac; if ((_DEC_rdsect (uptr, 512 / ctx->sector_size, (uint8 *)&Home, §s_read, sizeof (Home) / ctx->sector_size, physsectsz)) || (sects_read != (sizeof (Home) / ctx->sector_size))) goto Return_Cleanup; CheckSum1 = ODSChecksum (&Home, (uint16)((((char *)&Home.hm2_w_checksum1)-((char *)&Home.hm2_l_homelbn))/2)); CheckSum2 = ODSChecksum (&Home, (uint16)((((char *)&Home.hm2_w_checksum2)-((char *)&Home.hm2_l_homelbn))/2)); if ((Home.hm2_l_homelbn == 0) || (Home.hm2_l_alhomelbn == 0) || (Home.hm2_l_altidxlbn == 0) || ((Home.hm2_b_struclev != 2) && (Home.hm2_b_struclev != 5)) || (Home.hm2_b_strucver == 0) || (Home.hm2_w_cluster == 0) || (Home.hm2_w_homevbn == 0) || (Home.hm2_w_alhomevbn == 0) || (Home.hm2_w_ibmapvbn == 0) || (Home.hm2_l_ibmaplbn == 0) || (Home.hm2_w_resfiles >= Home.hm2_l_maxfiles) || (Home.hm2_w_ibmapsize == 0) || (Home.hm2_w_resfiles < 5) || (Home.hm2_w_checksum1 != CheckSum1) || (Home.hm2_w_checksum2 != CheckSum2)) goto Return_Cleanup; if ((_DEC_rdsect (uptr, (Home.hm2_l_ibmaplbn+Home.hm2_w_ibmapsize+1) * (512 / ctx->sector_size), (uint8 *)&Header, §s_read, sizeof (Header) / ctx->sector_size, physsectsz)) || (sects_read != (sizeof (Header) / ctx->sector_size))) goto Return_Cleanup; CheckSum1 = ODSChecksum (&Header, 255); if (CheckSum1 != *(((uint16 *)&Header)+255)) /* Verify Checksum on BITMAP.SYS file header */ goto Return_Cleanup; Retr = (ODS2_Retreval *)(((uint16*)(&Header))+Header.fh2_b_mpoffset); /* The BitMap File has a single extent, which may be preceeded by a placement descriptor */ if (Retr->fm2_r_word0_bits.fm2_v_format == 0) |
︙ | ︙ | |||
1164 1165 1166 1167 1168 1169 1170 | ScbLbn = (Retr->fm2_r_map_bits2.fm2_l_highlbn2<<16)+Retr->fm2_r_map_bits2.fm2_r_map2_long0.fm2_l_lowlbn2; break; case 3: ScbLbn = Retr->fm2_r_map_bits3.fm2_l_lbn3; break; } Retr = (ODS2_Retreval *)(((uint16 *)Retr)+Retr->fm2_r_word0_bits.fm2_v_format+1); | | > | | | | < > < | | > | > | | > < | | | | < | | < > < | | > < | | < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > | | | > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > < > > > > > > > > > | 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 | ScbLbn = (Retr->fm2_r_map_bits2.fm2_l_highlbn2<<16)+Retr->fm2_r_map_bits2.fm2_r_map2_long0.fm2_l_lowlbn2; break; case 3: ScbLbn = Retr->fm2_r_map_bits3.fm2_l_lbn3; break; } Retr = (ODS2_Retreval *)(((uint16 *)Retr)+Retr->fm2_r_word0_bits.fm2_v_format+1); if ((_DEC_rdsect (uptr, ScbLbn * (512 / ctx->sector_size), (uint8 *)&Scb, §s_read, sizeof (Scb) / ctx->sector_size, physsectsz)) || (sects_read != (sizeof (Scb) / ctx->sector_size))) goto Return_Cleanup; CheckSum1 = ODSChecksum (&Scb, 255); if (CheckSum1 != *(((uint16 *)&Scb)+255)) /* Verify Checksum on Storage Control Block */ goto Return_Cleanup; if ((Scb.scb_w_cluster != Home.hm2_w_cluster) || (Scb.scb_b_strucver != Home.hm2_b_strucver) || (Scb.scb_b_struclev != Home.hm2_b_struclev)) goto Return_Cleanup; sim_messagef (SCPE_OK, "%s: '%s' Contains ODS%d File system\n", sim_uname (uptr), uptr->filename, Home.hm2_b_struclev); sim_messagef (SCPE_OK, "%s: Volume Name: %12.12s ", sim_uname (uptr), Home.hm2_t_volname); sim_messagef (SCPE_OK, "Format: %12.12s ", Home.hm2_t_format); sim_messagef (SCPE_OK, "Sectors In Volume: %u\n", Scb.scb_l_volsize); ret_val = ((t_offset)Scb.scb_l_volsize) * 512; Return_Cleanup: uptr->capac = saved_capac; return ret_val; } static t_offset get_ods1_filesystem_size (UNIT *uptr, uint32 physsectsz) { DEVICE *dptr; t_addr saved_capac; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */ ODS1_HomeBlock Home; ODS1_FileHeader Header; ODS1_Retreval *Retr; uint8 scb_buf[512]; ODS1_SCB *Scb = (ODS1_SCB *)scb_buf; uint16 CheckSum1, CheckSum2; uint32 ScbLbn; t_offset ret_val = (t_offset)-1; t_seccnt sects_read; if ((dptr = find_dev_from_unit (uptr)) == NULL) return ret_val; saved_capac = uptr->capac; uptr->capac = temp_capac; if ((_DEC_rdsect (uptr, 512 / ctx->sector_size, (uint8 *)&Home, §s_read, sizeof (Home) / ctx->sector_size, physsectsz)) || (sects_read != (sizeof (Home) / ctx->sector_size))) goto Return_Cleanup; CheckSum1 = ODSChecksum (&Home, (uint16)((((char *)&Home.hm1_w_checksum1)-((char *)&Home.hm1_w_ibmapsize))/2)); CheckSum2 = ODSChecksum (&Home, (uint16)((((char *)&Home.hm1_w_checksum2)-((char *)&Home.hm1_w_ibmapsize))/2)); if ((Home.hm1_w_ibmapsize == 0) || (Home.hm1_l_ibmaplbn == 0) || (Home.hm1_w_maxfiles == 0) || (Home.hm1_w_cluster != 1) || ((Home.hm1_w_structlev != HM1_C_LEVEL1) && (Home.hm1_w_structlev != HM1_C_LEVEL2)) || (Home.hm1_l_ibmaplbn == 0) || (Home.hm1_w_checksum1 != CheckSum1) || (Home.hm1_w_checksum2 != CheckSum2)) goto Return_Cleanup; if ((_DEC_rdsect (uptr, (((Home.hm1_l_ibmaplbn << 16) + ((Home.hm1_l_ibmaplbn >> 16) & 0xFFFF)) + Home.hm1_w_ibmapsize + 1) * (512 / ctx->sector_size), (uint8 *)&Header, §s_read, sizeof (Header) / ctx->sector_size, physsectsz)) || (sects_read != (sizeof (Header) / ctx->sector_size))) goto Return_Cleanup; CheckSum1 = ODSChecksum (&Header, 255); if (CheckSum1 != *(((uint16 *)&Header)+255)) /* Verify Checksum on BITMAP.SYS file header */ goto Return_Cleanup; Retr = (ODS1_Retreval *)(((uint16*)(&Header))+Header.fh1_b_mpoffset); ScbLbn = (Retr->fm1_pointers[0].fm1_s_fm1def1.fm1_b_highlbn<<16)+Retr->fm1_pointers[0].fm1_s_fm1def1.fm1_w_lowlbn; if ((_DEC_rdsect (uptr, ScbLbn * (512 / ctx->sector_size), (uint8 *)Scb, §s_read, 512 / ctx->sector_size, physsectsz)) || (sects_read != (512 / ctx->sector_size))) goto Return_Cleanup; if (Scb->scb_b_bitmapblks < 127) ret_val = (((t_offset)Scb->scb_r_blocks[Scb->scb_b_bitmapblks].scb_w_freeblks << 16) + Scb->scb_r_blocks[Scb->scb_b_bitmapblks].scb_w_freeptr) * 512; else ret_val = (((t_offset)Scb->scb_r_blocks[0].scb_w_freeblks << 16) + Scb->scb_r_blocks[0].scb_w_freeptr) * 512; sim_messagef (SCPE_OK, "%s: '%s' Contains an ODS1 File system\n", sim_uname (uptr), uptr->filename); sim_messagef (SCPE_OK, "%s: Volume Name: %12.12s ", sim_uname (uptr), Home.hm1_t_volname); sim_messagef (SCPE_OK, "Format: %12.12s ", Home.hm1_t_format); sim_messagef (SCPE_OK, "Sectors In Volume: %u\n", (uint32)(ret_val / 512)); Return_Cleanup: uptr->capac = saved_capac; return ret_val; } typedef struct ultrix_disklabel { uint32 pt_magic; /* magic no. indicating part. info exits */ uint32 pt_valid; /* set by driver if pt is current */ struct pt_info { uint32 pi_nblocks; /* no. of sectors */ uint32 pi_blkoff; /* block offset for start */ } pt_part[8]; } ultrix_disklabel; #define PT_MAGIC 0x032957 /* Partition magic number */ #define PT_VALID 1 /* Indicates if struct is valid */ static t_offset get_ultrix_filesystem_size (UNIT *uptr, uint32 physsectsz) { DEVICE *dptr; t_addr saved_capac; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */ uint8 sector_buf[512]; ultrix_disklabel *Label = (ultrix_disklabel *)(sector_buf + sizeof (sector_buf) - sizeof (ultrix_disklabel)); t_offset ret_val = (t_offset)-1; int i; uint32 max_lbn = 0, max_lbn_partnum = 0; t_seccnt sects_read; if ((dptr = find_dev_from_unit (uptr)) == NULL) return ret_val; saved_capac = uptr->capac; uptr->capac = temp_capac; if ((_DEC_rdsect (uptr, 31 * (512 / ctx->sector_size), sector_buf, §s_read, 512 / ctx->sector_size, physsectsz)) || (sects_read != (512 / ctx->sector_size))) goto Return_Cleanup; if ((Label->pt_magic != PT_MAGIC) || (Label->pt_valid != PT_VALID)) goto Return_Cleanup; for (i = 0; i < 8; i++) { uint32 end_lbn = Label->pt_part[i].pi_blkoff + Label->pt_part[i].pi_nblocks; if (end_lbn > max_lbn) { max_lbn = end_lbn; max_lbn_partnum = i; } } sim_messagef (SCPE_OK, "%s: '%s' Contains Ultrix partitions\n", sim_uname (uptr), uptr->filename); sim_messagef (SCPE_OK, "Partition with highest sector: %c, Sectors On Disk: %u\n", 'a' + max_lbn_partnum, max_lbn); ret_val = ((t_offset)max_lbn) * 512; Return_Cleanup: uptr->capac = saved_capac; return ret_val; } #pragma pack(push,1) /* * The first logical block of device cluster 1 is either: * 1. MFD label entry (RSTS versions through 7.x) * 2. Disk Pack label (RSTS version 8.0 and later) */ typedef struct _RSTS_MFDLABEL { uint16 ml_ulnk; uint16 ml_mbm1; uint16 ml_reserved1; uint16 ml_reserved2; uint16 ml_pcs; uint16 ml_pstat; uint16 ml_packid[2]; } RSTS_MFDLABEL; typedef struct _RSTS_PACKLABEL { uint16 pk_mb01; uint16 pk_mbm1; uint16 pk_mdcn; uint16 pk_plvl; #define PK_LVL0 0000 #define PK_LVL11 0401 #define PK_LVL12 0402 uint16 pk_ppcs; uint16 pk_pstat; #define PK_UC_NEW 0020000 uint16 pk_packid[2]; uint16 pk_tapgvn[2]; uint16 pk_bckdat; uint16 pk_bcktim; } RSTS_PACKLABEL; typedef union _RSTS_ROOT { RSTS_MFDLABEL rt_mfd; RSTS_PACKLABEL rt_pack; uint8 rt_block[512]; } RSTS_ROOT; typedef struct _RSTS_MFDBLOCKETTE { uint16 mb_ulnk; uint16 mb_mbm1; uint16 mb_reserved1; uint16 mb_reserved2; uint16 mb_reserved3; uint16 mb_malnk; uint16 mb_lppn; uint16 mb_lid; #define MB_ID 0051064 } RSTS_MFDBLOCKETTE; #define IS_VALID_RSTS_MFD(b) \ ((((b)->mb_ulnk == 0) || ((b)->mb_ulnk == 1)) && \ ((b)->mb_mbm1 == 0177777) && \ ((b)->mb_reserved1 == 0) && \ ((b)->mb_reserved2 == 0) && \ ((b)->mb_reserved3 == 0) && \ ((b)->mb_lppn == 0177777) && \ ((b)->mb_lid == MB_ID)) typedef struct _RSTS_GFDBLOCKETTE { uint16 gb_ulnk; uint16 gb_mbm1; uint16 gb_reserved1; uint16 gb_reserved2; uint16 gb_reserved3; uint16 gb_reserved4; uint16 gb_lppn; uint16 gb_lid; #define GB_ID 0026264 } RSTS_GFDBLOCKETTE; #define IS_VALID_RSTS_GFD(b, g) \ ((((b)->gb_ulnk == 0) || ((b)->gb_ulnk == 1)) && \ ((b)->gb_mbm1 == 0177777) && \ ((b)->gb_reserved1 == 0) && \ ((b)->gb_reserved2 == 0) && \ ((b)->gb_reserved3 == 0) && \ ((b)->gb_reserved4 == 0) && \ ((b)->gb_lppn == (((g) << 8) | 0377)) && \ ((b)->gb_lid == GB_ID)) typedef struct _RSTS_UFDBLOCKETTE { uint16 ub_ulnk; uint16 ub_mbm1; uint16 ub_reserved1; uint16 ub_reserved2; uint16 ub_reserved3; uint16 ub_reserved4; uint16 ub_lppn; uint16 ub_lid; #define UB_ID 0102064 } RSTS_UFDBLOCKETTE; #define IS_VALID_RSTS_UFD(b, g, u) \ (((b)->ub_mbm1 == 0177777) && \ ((b)->ub_reserved1 == 0) && \ ((b)->ub_reserved2 == 0) && \ ((b)->ub_reserved3 == 0) && \ ((b)->ub_reserved4 == 0) && \ ((b)->ub_lppn == (((g) << 8) | (u))) && \ ((b)->ub_lid == UB_ID)) typedef struct _RSTS_UNAME { uint16 un_ulnk; uint16 un_unam; uint16 un_reserved1; uint16 un_reserved2; uint16 un_ustat; uint16 un_uacnt; uint16 un_uaa; uint16 un_uar; } RSTS_UNAME; typedef struct _RSTS_FNAME { uint16 fn_ulnk; uint16 fn_unam[3]; uint16 fn_ustat; uint16 fn_uacnt; uint16 fn_uaa; uint16 fn_uar; } RSTS_FNAME; typedef struct _RSTS_ACNT { uint16 ac_ulnk; uint16 ac_udla; uint16 ac_usiz; uint16 ac_udc; uint16 ac_utc; uint16 ac_urts[2]; uint16 ac_uclus; } RSTS_ACNT; typedef struct _RSTS_RETR { uint16 rt_ulnk; uint16 rt_uent[7]; #define RT_ENTRIES 7 } RSTS_RETR; typedef struct _RSTS_DCMAP { uint16 dc_clus; #define DC_MASK 0077777 uint16 dc_map[7]; } RSTS_DCMAP; /* * Directory link definitions */ #define DL_USE 0000001 #define DL_BAD 0000002 #define DL_CHE 0000004 #define DL_CLN 0000010 #define DL_ENO 0000760 #define DL_CLO 0007000 #define DL_BLO 0170000 #define DLSH_ENO 4 #define DLSH_CLO 9 #define DLSH_BLO 12 #define BLOCKETTE_SZ (8 * sizeof(uint16)) #define MAP_OFFSET (31 * BLOCKETTE_SZ) #define SATT0 0073374 #define SATT1 0076400 #define SATT2 0075273 #pragma pack(pop) typedef struct _rstsContext { UNIT *uptr; int dcshift; int pcs; char packid[8]; t_seccnt sects; RSTS_DCMAP map; } rstsContext; static char rad50[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ$.%0123456789"; static void r50Asc(uint16 val, char *buf) { buf[2] = rad50[val % 050]; val /= 050; buf[1] = rad50[val % 050]; buf[0] = rad50[val / 050]; } static t_stat rstsValidateClusterSize(uint16 size, uint16 minSize) { int i; /* * Check that the cluster size is a power of 2 and greater than or equal * to some location dependent value. */ if (size >= minSize) for (i = 0; i < 16; i++) if (size == (1 << i)) return SCPE_OK; return SCPE_IOERR; } static t_stat rstsReadBlock(rstsContext *context, uint16 cluster, uint16 block, void *buf) { t_lba blk = (cluster << context->dcshift) + block; t_seccnt sects_read; if ((sim_disk_rdsect(context->uptr, blk * context->sects, (uint8 *)buf, §s_read, context->sects) == SCPE_OK) && (sects_read == context->sects)) return SCPE_OK; return SCPE_IOERR; } static t_stat rstsReadBlockette(rstsContext *context, uint16 link, void *buf) { uint16 block = (link & DL_BLO) >> DLSH_BLO; uint16 dcn = (link & DL_CLO) >> DLSH_CLO; uint16 blockette = (link & DL_ENO) >> DLSH_ENO; uint8 temp[512]; if ((dcn != 7) && (blockette != 31) && (block <= (context->map.dc_clus & DC_MASK))) { if (rstsReadBlock(context, context->map.dc_map[dcn], block, temp) == SCPE_OK) { memcpy(buf, &temp[blockette * BLOCKETTE_SZ], BLOCKETTE_SZ); return SCPE_OK; } } return SCPE_IOERR; } static t_stat rstsFind01UFD(rstsContext *context, uint16 *ufd, uint16 *level) { uint16 dcs = 1 << context->dcshift; RSTS_ROOT root; uint16 buf[256]; if (rstsReadBlock(context, 1, 0, &root) == SCPE_OK) { /* * First validate fields which are common to both the MFD label and * Pack label - we'll use Pack label offsets here. */ if ((root.rt_pack.pk_mbm1 == 0177777) && (rstsValidateClusterSize(root.rt_pack.pk_ppcs, dcs) == SCPE_OK)) { char ch, *tmp = &context->packid[1]; uint16 mfd, gfd; context->pcs = root.rt_pack.pk_ppcs; r50Asc(root.rt_pack.pk_packid[0], &context->packid[0]); r50Asc(root.rt_pack.pk_packid[1], &context->packid[3]); context->packid[6] = '\0'; /* * The Pack ID must consist of 1 - 6 alphanumeric characters * padded at the end with spaces. */ if (!isalnum(context->packid[0])) return SCPE_IOERR; while ((ch = *tmp++) != 0) { if (!isalnum(ch)) { if (ch != ' ') return SCPE_IOERR; while (*tmp) if (*tmp++ != ' ') return SCPE_IOERR; break; } } /* * Determine the pack revision level and, therefore, the path to * [0,1]satt.sys which will allow us to determine the size of the * pack used by RSTS. */ if ((root.rt_pack.pk_pstat & PK_UC_NEW) == 0) { uint16 link = root.rt_mfd.ml_ulnk; RSTS_UNAME uname; /* * Old format used by RSTS up through V07.x */ if (dcs > 16) return SCPE_IOERR; *level = PK_LVL0; memcpy(&context->map, &root.rt_block[MAP_OFFSET], BLOCKETTE_SZ); /* * Scan the MFD name entries looking for [0,1]. Note there will * always be at least 1 entry. */ do { if (rstsReadBlockette(context, link, &uname) != SCPE_OK) break; if (uname.un_unam == ((0 << 8) | 1)) { *ufd = uname.un_uar; return SCPE_OK; } } while ((link = uname.un_ulnk) != 0); } else { /* * New format used by RSTS V08 and later */ switch (root.rt_pack.pk_plvl) { case PK_LVL11: if (dcs > 16) return SCPE_IOERR; break; case PK_LVL12: if (dcs > 64) return SCPE_IOERR; break; default: return SCPE_IOERR; } *level = root.rt_pack.pk_plvl; mfd = root.rt_pack.pk_mdcn; if (rstsReadBlock(context, mfd, 0, buf) == SCPE_OK) { if (IS_VALID_RSTS_MFD((RSTS_MFDBLOCKETTE *)buf)) { if (rstsReadBlock(context, mfd, 1, buf) == SCPE_OK) if ((gfd = buf[0]) != 0) if (rstsReadBlock(context, gfd, 0, buf) == SCPE_OK) if (IS_VALID_RSTS_GFD((RSTS_GFDBLOCKETTE *)buf, 0)) { if (rstsReadBlock(context, gfd, 1, buf) == SCPE_OK) if ((*ufd = buf[1]) != 0) return SCPE_OK; } } } } } } return SCPE_IOERR; } static t_stat rstsLoadAndScanSATT(rstsContext *context, uint16 uaa, uint16 uar, t_offset *result) { uint8 bitmap[8192]; int i, j; RSTS_ACNT acnt; RSTS_RETR retr; if (uar != 0) { if (rstsReadBlockette(context, uaa, &acnt) == SCPE_OK) { uint16 blocks = acnt.ac_usiz; uint16 offset = 0; if ((rstsValidateClusterSize(acnt.ac_uclus, context->pcs) != SCPE_OK) || (blocks > 16)) return SCPE_IOERR; memset(bitmap, 0xFF, sizeof(bitmap)); if (blocks != 0) { do { int i, j; uint16 fcl; if (rstsReadBlockette(context, uar, &retr) != SCPE_OK) return SCPE_IOERR; for (i = 0; i < RT_ENTRIES; i++) { if ((fcl = retr.rt_uent[i]) == 0) goto scanBitmap; for (j = 0; j < acnt.ac_uclus; j++) { if ((blocks == 0) || (offset >= sizeof(bitmap))) goto scanBitmap; if (rstsReadBlock(context, fcl, j, &bitmap[offset]) != SCPE_OK) return SCPE_IOERR; offset += 512; blocks--; } } } while ((uar = retr.rt_ulnk) != 0); scanBitmap: for (i = sizeof(bitmap) - 1; i != 0; i--) if (bitmap[i] != 0xFF) { blocks = i * 8; for (j = 7; j >= 0; j--) if ((bitmap[i] & (1 << j)) == 0) { blocks += j + 1; goto scanDone; } } scanDone: *result = (t_offset)(blocks + 1) * context->pcs; return SCPE_OK; } } } return SCPE_IOERR; } static t_offset get_rsts_filesystem_size (UNIT *uptr, uint32 physsectsz) { DEVICE *dptr; t_addr saved_capac; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */ uint8 buf[512]; t_offset ret_val = (t_offset)-1; rstsContext context; if ((dptr = find_dev_from_unit (uptr)) == NULL) return ret_val; saved_capac = uptr->capac; uptr->capac = temp_capac; context.uptr = uptr; context.sects = 512 / ctx->sector_size; /* * Check all possible device cluster sizes */ for (context.dcshift = 0; context.dcshift < 8; context.dcshift++) { uint16 ufd, level; /* * We need to find [0,1]SATT.SYS to compute the actual size of the disk. * First find the DCN of the [0,1] UFD. */ if (rstsFind01UFD(&context, &ufd, &level) == SCPE_OK) { if (rstsReadBlock(&context, ufd, 0, buf) == SCPE_OK) { if (IS_VALID_RSTS_UFD((RSTS_UFDBLOCKETTE *)buf, 0, 1)) { uint16 link = ((RSTS_UFDBLOCKETTE *)buf)->ub_ulnk; RSTS_FNAME fname; memcpy(&context.map, &buf[MAP_OFFSET], BLOCKETTE_SZ); /* * Scan the UFD looking for SATT.SYS - the allocation bitmap */ do { if (rstsReadBlockette(&context, link, &fname) != SCPE_OK) break; if ((fname.fn_unam[0] == SATT0) && (fname.fn_unam[1] == SATT1) && (fname.fn_unam[2] == SATT2)) { if (rstsLoadAndScanSATT(&context, fname.fn_uaa, fname.fn_uar, &ret_val) == SCPE_OK) { const char *fmt = "???"; ret_val *= 512; switch (level) { case PK_LVL0: fmt = "0.0"; break; case PK_LVL11: fmt = "1.1"; break; case PK_LVL12: fmt = "1.2"; break; } sim_messagef(SCPE_OK, "%s: '%s' Contains a RSTS File system\n", sim_uname (uptr), uptr->filename); sim_messagef(SCPE_OK, "%s: Pack ID: %6.6s ", sim_uname (uptr), context.packid); sim_messagef(SCPE_OK, "Revision Level: %3s ", fmt); sim_messagef(SCPE_OK, "Pack Clustersize: %d\n", context.pcs); sim_messagef(SCPE_OK, "%s: Last Unallocated Sector In File System: %u\n", sim_uname (uptr), (uint32)(ret_val / 512)); goto cleanup_done; } } } while ((link = fname.fn_ulnk) != 0); } } } } cleanup_done: uptr->capac = saved_capac; return ret_val; } #pragma pack(push,1) typedef struct _RT11_HomeBlock { uint8 hb_b_bbtable[130]; uint8 hb_b_unused1[2]; uint8 hb_b_initrestore[38]; uint8 hb_b_bup[18]; uint8 hb_b_unused2[260]; uint16 hb_w_reserved1; uint16 hb_w_reserved2; uint8 hb_b_unused3[14]; uint16 hb_w_clustersize; uint16 hb_w_firstdir; uint16 hb_w_sysver; #define HB_C_SYSVER_V3A 36521 #define HB_C_SYSVER_V04 36434 #define HB_C_SYSVER_V05 36435 uint8 hb_b_volid[12]; uint8 hb_b_owner[12]; uint8 hb_b_sysid[12]; #define HB_C_SYSID "DECRT11A " #define HB_C_VMSSYSID "DECVMSEXCHNG" uint8 hb_b_unused4[2]; uint16 hb_w_checksum; } RT11_HomeBlock; typedef struct _RT11_DirHeader { uint16 dh_w_count; uint16 dh_w_next; uint16 dh_w_highest; #define DH_C_MAXSEG 31 uint16 dh_w_extra; uint16 dh_w_start; } RT11_DirHeader; typedef struct _RT11_DirEntry { uint16 de_w_status; #define DE_C_PRE 0000020 #define DE_C_TENT 0000400 #define DE_C_EMPTY 0001000 #define DE_C_PERM 0002000 #define DE_C_EOS 0004000 #define DE_C_READ 0040000 #define DE_C_PROT 0100000 uint16 de_w_fname1; uint16 de_w_fname2; uint16 de_w_ftype; uint16 de_w_length; uint16 de_w_jobchannel; uint16 de_w_creationdate; } RT11_DirEntry; #pragma pack(pop) #define RT11_MAXPARTITIONS 256 /* Max partitions supported */ #define RT11_HOME 1 /* Home block # */ #define RT11_NOPART 0 #define RT11_SINGLEPART 1 #define RT11_MULTIPART 2 static int rt11_get_partition_type(RT11_HomeBlock *home, int part) { if (strncmp((char *)&home->hb_b_sysid, HB_C_SYSID, strlen(HB_C_SYSID)) == 0) { uint16 type = home->hb_w_sysver; if (part == 0) { if ((type == HB_C_SYSVER_V3A) || (type == HB_C_SYSVER_V04)) return RT11_SINGLEPART; } if (type == HB_C_SYSVER_V05) return RT11_MULTIPART; } if (strncmp((char *)&home->hb_b_sysid, HB_C_VMSSYSID, strlen(HB_C_VMSSYSID)) == 0) return RT11_SINGLEPART; return RT11_NOPART; } static t_offset get_rt11_filesystem_size (UNIT *uptr, uint32 physsectsz) { DEVICE *dptr; t_addr saved_capac; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; t_addr temp_capac = (sim_toffset_64 ? (t_addr)0xFFFFFFFFu : (t_addr)0x7FFFFFFFu); /* Make sure we can access the largest sector */ uint8 sector_buf[1024]; RT11_HomeBlock Home; t_seccnt sects_read; RT11_DirHeader *dir_hdr = (RT11_DirHeader *)sector_buf; int partitions = 0; int part; uint32 base; uint32 dir_sec; uint16 dir_seg; uint16 version = 0; t_offset ret_val = (t_offset)-1; if ((dptr = find_dev_from_unit (uptr)) == NULL) return ret_val; saved_capac = uptr->capac; uptr->capac = temp_capac; for (part = 0; part < RT11_MAXPARTITIONS; part++) { uint16 seg_highest = 0; int type; /* * RX01/RX02 media can only have a single partition */ if ((part != 0) && (physsectsz != 0)) break; base = part << 16; if (_DEC_rdsect(uptr, (base + RT11_HOME) * (512 / ctx->sector_size), (uint8 *)&Home, §s_read, 512 / ctx->sector_size, physsectsz) || (sects_read != (512 / ctx->sector_size))) goto Return_Cleanup; type = rt11_get_partition_type(&Home, part); if (type != RT11_NOPART) { uint16 highest = 0; uint8 seg_seen[DH_C_MAXSEG + 1]; memset(seg_seen, 0, sizeof(seg_seen)); partitions++; dir_seg = 1; do { int offset = sizeof(RT11_DirHeader); int dir_size = sizeof(RT11_DirEntry); uint16 cur_blk; if (seg_seen[dir_seg]++ != 0) goto Next_Partition; dir_sec = Home.hb_w_firstdir + ((dir_seg - 1) * 2); if ((_DEC_rdsect(uptr, (base + dir_sec) * (512 / ctx->sector_size), sector_buf, §s_read, 1024 / ctx->sector_size, physsectsz)) || (sects_read != (1024 / ctx->sector_size))) goto Return_Cleanup; if (dir_seg == 1) { seg_highest = dir_hdr->dh_w_highest; if (seg_highest > DH_C_MAXSEG) goto Next_Partition; } dir_size += dir_hdr->dh_w_extra; cur_blk = dir_hdr->dh_w_start; while ((1024 - offset) >= dir_size) { RT11_DirEntry *dir_entry = (RT11_DirEntry *)§or_buf[offset]; if (dir_entry->de_w_status & DE_C_EOS) break; /* * Within each directory segment the bas address should never * decrease. */ if (((cur_blk + dir_entry->de_w_length) & 0xFFFF) < cur_blk) goto Next_Partition; cur_blk += dir_entry->de_w_length; offset += dir_size; } if (cur_blk > highest) highest = cur_blk; dir_seg = dir_hdr->dh_w_next; if (dir_seg > seg_highest) goto Next_Partition; } while (dir_seg != 0); ret_val = (t_offset)((base + highest) * (t_offset)512); version = Home.hb_w_sysver; if (type == RT11_SINGLEPART) break; } Next_Partition: ; } Return_Cleanup: if (partitions) { const char *parttype; switch (version) { case HB_C_SYSVER_V3A: parttype = "V3A"; break; case HB_C_SYSVER_V04: parttype = "V04"; break; case HB_C_SYSVER_V05: parttype = "V05"; break; default: parttype = "???"; break; } sim_messagef (SCPE_OK, "%s: '%s' Contains RT11 partitions\n", sim_uname (uptr), uptr->filename); sim_messagef (SCPE_OK, "%d valid partition%s, Type: %s, Sectors On Disk: %u\n", partitions, partitions == 1 ? "" : "s", parttype, (uint32)(ret_val / 512)); } uptr->capac = saved_capac; return ret_val; } typedef t_offset (*FILESYSTEM_CHECK)(UNIT *uptr, uint32); static t_offset get_filesystem_size (UNIT *uptr) { static FILESYSTEM_CHECK checks[] = { &get_ods2_filesystem_size, &get_ods1_filesystem_size, &get_ultrix_filesystem_size, &get_rsts_filesystem_size, &get_rt11_filesystem_size, /* This should be the last entry in the table to reduce the possibility of matching an RT-11 container file stored in another filesystem */ NULL }; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; uint32 saved_sector_size = ctx->sector_size; t_offset ret_val = (t_offset)-1; int i; for (i = 0; checks[i] != NULL; i++) if ((ret_val = checks[i] (uptr, 0)) != (t_offset)-1) return ret_val; /* * The only known interleaved disk devices have either 256 byte * or 128 byte sector sizes. If additional interleaved file * system scenarios with different sector sizes come up they * should be added here. */ for (i = 0; checks[i] != NULL; i++) { ctx->sector_size = 256; if ((ret_val = checks[i] (uptr, ctx->sector_size)) != (t_offset)-1) break; ctx->sector_size = 128; if ((ret_val = checks[i] (uptr, ctx->sector_size)) != (t_offset)-1) break; } if ((ret_val != (t_offset)-1) && (ctx->sector_size != saved_sector_size )) sim_messagef (SCPE_OK, "%s: with an unexpected sector size of %u bytes instead of %u bytes\n", sim_uname (uptr), ctx->sector_size, saved_sector_size); ctx->sector_size = saved_sector_size; return ret_val; } static t_stat store_disk_footer (UNIT *uptr, const char *dtype); static t_stat get_disk_footer (UNIT *uptr) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; struct simh_disk_footer *f = (struct simh_disk_footer *)calloc (1, sizeof (*f)); t_offset container_size; t_offset sim_fsize_ex (FILE *fptr); uint32 bytesread; if (f == NULL) return SCPE_MEM; sim_debug_unit (ctx->dbit, uptr, "get_disk_footer(%s)\n", sim_uname (uptr)); switch (DK_GET_FMT (uptr)) { /* case on format */ case DKUF_F_STD: /* SIMH format */ container_size = sim_fsize_ex (uptr->fileref); if ((container_size != (t_offset)-1) && (container_size > sizeof (*f)) && (sim_fseeko (uptr->fileref, container_size - sizeof (*f), SEEK_SET) == 0) && (sizeof (*f) == sim_fread (f, 1, sizeof (*f), uptr->fileref))) break; free (f); f = NULL; break; case DKUF_F_RAW: /* RAW format */ container_size = sim_os_disk_size_raw (uptr->fileref); if ((container_size != (t_offset)-1) && (container_size > sizeof (*f)) && (sim_os_disk_read (uptr, container_size - sizeof (*f), (uint8 *)f, &bytesread, sizeof (*f)) == SCPE_OK) && (bytesread == sizeof (*f))) break; free (f); f = NULL; break; case DKUF_F_VHD: /* VHD format */ if (1) { time_t creation_time; /* Construct a pseudo simh disk footer*/ memcpy (f->Signature, "simh", 4); memset (f->DriveType, 0, sizeof (f->DriveType)); strlcpy ((char *)f->DriveType, sim_vhd_disk_get_dtype (uptr->fileref, &f->SectorSize, &f->TransferElementSize, (char *)f->CreatingSimulator, &creation_time), sizeof (f->DriveType)); f->SectorSize = NtoHl (f->SectorSize); f->TransferElementSize = NtoHl (f->TransferElementSize); if ((f->SectorSize == 0) || (NtoHl (f->SectorSize) == 0x00020000)) { /* Old or mangled format VHD footer */ sim_vhd_disk_set_dtype (uptr->fileref, (char *)f->DriveType, ctx->sector_size, ctx->xfer_element_size); sim_vhd_disk_get_dtype (uptr->fileref, &f->SectorSize, &f->TransferElementSize, (char *)f->CreatingSimulator, NULL); f->SectorSize = NtoHl (f->SectorSize); f->TransferElementSize = NtoHl (f->TransferElementSize); } memset (f->CreationTime, 0, sizeof (f->CreationTime)); strlcpy ((char*)f->CreationTime, ctime (&creation_time), sizeof (f->CreationTime)); container_size = sim_vhd_disk_size (uptr->fileref); f->SectorCount = NtoHl ((uint32)(container_size / NtoHl (f->SectorSize))); container_size += sizeof (*f); /* Adjust since it is removed below */ f->AccessFormat = DKUF_F_VHD; f->Checksum = NtoHl (eth_crc32 (0, f, sizeof (*f) - sizeof (f->Checksum))); } break; default: free (f); return SCPE_IERR; } if (f) { if (f->Checksum != NtoHl (eth_crc32 (0, f, sizeof (*f) - sizeof (f->Checksum)))) { sim_debug_unit (ctx->dbit, uptr, "No footer found on %s format container: %s\n", sim_disk_fmt (uptr), uptr->filename); free (f); f = NULL; } else { /* We've got a valid footer, but it may need to be corrected */ if ((NtoHl (f->TransferElementSize) == 1) && (0 == memcmp (f->DriveType, "RZ", 2))) { f->TransferElementSize = NtoHl (2); f->Checksum = NtoHl (eth_crc32 (0, f, sizeof (*f) - sizeof (f->Checksum))); store_disk_footer (uptr, (char *)f->DriveType); } free (ctx->footer); ctx->footer = f; container_size -= sizeof (*f); sim_debug_unit (ctx->dbit, uptr, "Footer: %s - %s\n" " Simulator: %s\n" " DriveType: %s\n" " SectorSize: %u\n" " SectorCount: %u\n" " TransferElementSize: %u\n" " FooterVersion: %u\n" " AccessFormat: %u\n" " CreationTime: %s", sim_uname (uptr), uptr->filename, f->CreatingSimulator, f->DriveType, NtoHl(f->SectorSize), NtoHl (f->SectorCount), NtoHl (f->TransferElementSize), f->FooterVersion, f->AccessFormat, f->CreationTime); } } sim_debug_unit (ctx->dbit, uptr, "Container Size: %u sectors %u bytes each\n", (uint32)(container_size/ctx->sector_size), ctx->sector_size); ctx->container_size = container_size; return SCPE_OK; } static t_stat store_disk_footer (UNIT *uptr, const char *dtype) { DEVICE *dptr; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; struct simh_disk_footer *f; time_t now = time (NULL); t_offset total_sectors; if ((dptr = find_dev_from_unit (uptr)) == NULL) return SCPE_NOATT; if (uptr->flags & UNIT_RO) return SCPE_RO; f = (struct simh_disk_footer *)calloc (1, sizeof (*f)); f->AccessFormat = DK_GET_FMT (uptr); total_sectors = (((t_offset)uptr->capac) * ctx->capac_factor * ((dptr->flags & DEV_SECTORS) ? 512 : 1)) / ctx->sector_size; memcpy (f->Signature, "simh", 4); memset (f->CreatingSimulator, 0, sizeof (f->CreatingSimulator)); strlcpy ((char *)f->CreatingSimulator, sim_name, sizeof (f->CreatingSimulator)); memset (f->DriveType, 0, sizeof (f->DriveType)); strlcpy ((char *)f->DriveType, dtype, sizeof (f->DriveType)); f->SectorSize = NtoHl (ctx->sector_size); f->SectorCount = NtoHl ((uint32)total_sectors); f->TransferElementSize = NtoHl (ctx->xfer_element_size); memset (f->CreationTime, 0, sizeof (f->CreationTime)); strlcpy ((char*)f->CreationTime, ctime (&now), sizeof (f->CreationTime)); f->Checksum = NtoHl (eth_crc32 (0, f, sizeof (*f) - sizeof (f->Checksum))); free (ctx->footer); ctx->footer = f; switch (f->AccessFormat) { case DKUF_F_STD: /* SIMH format */ if (sim_fseeko ((FILE *)uptr->fileref, total_sectors * ctx->sector_size, SEEK_SET) == 0) { sim_fwrite (f, sizeof (*f), 1, (FILE *)uptr->fileref); fflush ((FILE *)uptr->fileref); } break; case DKUF_F_VHD: /* VHD format */ break; case DKUF_F_RAW: /* Raw Physical Disk Access */ sim_os_disk_write (uptr, total_sectors * ctx->sector_size, (uint8 *)f, NULL, sizeof (*f)); break; default: break; } return SCPE_OK; } t_stat sim_disk_attach (UNIT *uptr, const char *cptr, size_t sector_size, size_t xfer_element_size, t_bool dontchangecapac, uint32 dbit, const char *dtype, uint32 pdp11tracksize, int completion_delay) { return sim_disk_attach_ex (uptr, cptr, sector_size, xfer_element_size, dontchangecapac, dbit, dtype, pdp11tracksize, completion_delay, NULL); } t_stat sim_disk_attach_ex (UNIT *uptr, const char *cptr, size_t sector_size, size_t xfer_element_size, t_bool dontchangecapac, uint32 dbit, const char *dtype, uint32 pdp11tracksize, int completion_delay, const char **drivetypes) { struct disk_context *ctx; DEVICE *dptr; char tbuf[4*CBUFSIZE]; FILE *(*open_function)(const char *filename, const char *mode) = sim_fopen; FILE *(*create_function)(const char *filename, t_offset desiredsize) = NULL; t_stat (*storage_function)(FILE *file, uint32 *sector_size, uint32 *removable, uint32 *is_cdrom) = NULL; t_bool created = FALSE, copied = FALSE; t_bool auto_format = FALSE; t_offset container_size, filesystem_size, current_unit_size; size_t tmp_size = 1; if (uptr->flags & UNIT_DIS) /* disabled? */ return SCPE_UDIS; if (!(uptr->flags & UNIT_ATTABLE)) /* not attachable? */ return SCPE_NOATT; if ((dptr = find_dev_from_unit (uptr)) == NULL) return SCPE_NOATT; switch (xfer_element_size) { default: return sim_messagef (SCPE_ARG, "Unsupported transfer element size: %u\n", (uint32)xfer_element_size); case 1: case 2: case 4: case 8: break; } if ((sector_size % xfer_element_size) != 0) return sim_messagef (SCPE_ARG, "Invalid sector size: %u - must be a multiple of the transfer element size %u\n", (uint32)sector_size, (uint32)xfer_element_size); if (sim_switches & SWMASK ('F')) { /* format spec? */ char gbuf[CBUFSIZE]; cptr = get_glyph (cptr, gbuf, 0); /* get spec */ if (*cptr == 0) /* must be more */ return SCPE_2FARG; if ((sim_disk_set_fmt (uptr, 0, gbuf, NULL) != SCPE_OK) || (DK_GET_FMT (uptr) == DKUF_F_AUTO)) |
︙ | ︙ | |||
1363 1364 1365 1366 1367 1368 1369 | sim_switches = sim_switches & ~(SWMASK ('D')); cptr = get_glyph_nc (cptr, gbuf, 0); /* get spec */ if (*cptr == 0) /* must be more */ return SCPE_2FARG; vhd = sim_vhd_disk_create_diff (gbuf, cptr); if (vhd) { sim_vhd_disk_close (vhd); | | | > | | | | | > | > > | > | > > | > > > > | < | | > | | | > > > | | > > | > > > | | | | | | > | > > | | | > | > > | | | < > > > | | | | < | | | > < > > > > | > > > | | > > > > | > > > | | | | | | | | > | > > > | > > > > > > | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > | | > | | > | | | | 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 | sim_switches = sim_switches & ~(SWMASK ('D')); cptr = get_glyph_nc (cptr, gbuf, 0); /* get spec */ if (*cptr == 0) /* must be more */ return SCPE_2FARG; vhd = sim_vhd_disk_create_diff (gbuf, cptr); if (vhd) { sim_vhd_disk_close (vhd); return sim_disk_attach (uptr, gbuf, sector_size, xfer_element_size, dontchangecapac, dbit, dtype, pdp11tracksize, completion_delay); } return sim_messagef (SCPE_ARG, "Unable to create differencing VHD: %s\n", gbuf); } if (sim_switches & SWMASK ('C')) { /* create new disk container & copy contents? */ char gbuf[CBUFSIZE]; const char *dest_fmt = ((DK_GET_FMT (uptr) == DKUF_F_AUTO) || (DK_GET_FMT (uptr) == DKUF_F_VHD)) ? "VHD" : "SIMH"; FILE *dest; int saved_sim_switches = sim_switches; int32 saved_sim_quiet = sim_quiet; uint32 capac_factor; t_stat r; sim_switches = sim_switches & ~(SWMASK ('C')); cptr = get_glyph_nc (cptr, gbuf, 0); /* get spec */ if (*cptr == 0) /* must be more */ return SCPE_2FARG; sim_switches |= SWMASK ('R') | SWMASK ('E'); sim_quiet = TRUE; /* First open the source of the copy operation */ r = sim_disk_attach_ex (uptr, cptr, sector_size, xfer_element_size, dontchangecapac, dbit, dtype, pdp11tracksize, completion_delay, NULL); sim_quiet = saved_sim_quiet; if (r != SCPE_OK) { sim_switches = saved_sim_switches; return sim_messagef (r, "%s: Can't open copy source: %s - %s\n", sim_uname (uptr), cptr, sim_error_text (r)); } sim_messagef (SCPE_OK, "%s: creating new %s '%s' disk container copied from '%s'\n", sim_uname (uptr), dest_fmt, gbuf, cptr); capac_factor = ((dptr->dwidth / dptr->aincr) >= 32) ? 8 : ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (quadword: 8, word: 2, byte: 1) */ if (strcmp ("VHD", dest_fmt) == 0) dest = sim_vhd_disk_create (gbuf, ((t_offset)uptr->capac)*capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1)); else dest = sim_fopen (gbuf, "wb+"); if (!dest) { sim_disk_detach (uptr); return sim_messagef (r, "%s: can't create %s disk container '%s'\n", sim_uname (uptr), dest_fmt, gbuf); } else { uint8 *copy_buf = (uint8*) malloc (1024*1024); t_lba lba; t_seccnt sectors_per_buffer = (t_seccnt)((1024*1024)/sector_size); t_lba total_sectors = (t_lba)((uptr->capac*capac_factor)/(sector_size/((dptr->flags & DEV_SECTORS) ? 512 : 1))); t_seccnt sects = sectors_per_buffer; t_seccnt sects_read; if (!copy_buf) { if (strcmp ("VHD", dest_fmt) == 0) sim_vhd_disk_close (dest); else fclose (dest); (void)remove (gbuf); sim_disk_detach (uptr); return SCPE_MEM; } sim_messagef (SCPE_OK, "Copying %u sectors each %u bytes in size\n", (uint32)total_sectors, (uint32)sector_size); for (lba = 0; (lba < total_sectors) && (r == SCPE_OK); lba += sects_read) { sects = sectors_per_buffer; if (lba + sects > total_sectors) sects = total_sectors - lba; r = sim_disk_rdsect (uptr, lba, copy_buf, §s_read, sects); if ((r == SCPE_OK) && (sects_read > 0)) { uint32 saved_unit_flags = uptr->flags; FILE *save_unit_fileref = uptr->fileref; t_seccnt sects_written; sim_disk_set_fmt (uptr, 0, dest_fmt, NULL); uptr->fileref = dest; r = sim_disk_wrsect (uptr, lba, copy_buf, §s_written, sects_read); uptr->fileref = save_unit_fileref; uptr->flags = saved_unit_flags; if (sects_read != sects_written) r = SCPE_IOERR; sim_messagef (SCPE_OK, "%s: Copied %u/%u sectors. %d%% complete.\r", sim_uname (uptr), (uint32)(lba + sects_read), (uint32)total_sectors, (int)((((float)lba)*100)/total_sectors)); } } if (r == SCPE_OK) sim_messagef (SCPE_OK, "\n%s: Copied %u sectors. Done.\n", sim_uname (uptr), (uint32)total_sectors); else sim_messagef (r, "\n%s: Error copying: %s.\n", sim_uname (uptr), sim_error_text (r)); if ((r == SCPE_OK) && (sim_switches & SWMASK ('V'))) { uint8 *verify_buf = (uint8*) malloc (1024*1024); t_seccnt sects_read, verify_read; if (!verify_buf) { if (strcmp ("VHD", dest_fmt) == 0) sim_vhd_disk_close (dest); else fclose (dest); (void)remove (gbuf); free (copy_buf); sim_disk_detach (uptr); return SCPE_MEM; } for (lba = 0; (lba < total_sectors) && (r == SCPE_OK); lba += sects_read) { sim_messagef (SCPE_OK, "%s: Verified %u/%u sectors. %d%% complete.\r", sim_uname (uptr), (uint32)lba, (uint32)total_sectors, (int)((((float)lba)*100)/total_sectors)); sects = sectors_per_buffer; if (lba + sects > total_sectors) sects = total_sectors - lba; r = sim_disk_rdsect (uptr, lba, copy_buf, §s_read, sects); if (r == SCPE_OK) { uint32 saved_unit_flags = uptr->flags; FILE *save_unit_fileref = uptr->fileref; sim_disk_set_fmt (uptr, 0, dest_fmt, NULL); uptr->fileref = dest; r = sim_disk_rdsect (uptr, lba, verify_buf, &verify_read, sects_read); uptr->fileref = save_unit_fileref; uptr->flags = saved_unit_flags; if (r == SCPE_OK) { if ((sects_read != verify_read) || (0 != memcmp (copy_buf, verify_buf, verify_read*sector_size))) r = SCPE_IOERR; } } if (r != SCPE_OK) break; } if (!sim_quiet) { if (r == SCPE_OK) sim_messagef (r, "\n%s: Verified %u sectors. Done.\n", sim_uname (uptr), (uint32)total_sectors); else { t_lba i; uint32 save_dctrl = dptr->dctrl; FILE *save_sim_deb = sim_deb; for (i = 0; i < sects_read; ++i) if (0 != memcmp (copy_buf+i*sector_size, verify_buf+i*sector_size, sector_size)) break; sim_printf ("\n%s: Verification Error on lbn %d.\n", sim_uname (uptr), lba+i); dptr->dctrl = 0xFFFFFFFF; sim_deb = stdout; sim_disk_data_trace (uptr, copy_buf+i*sector_size, lba+i, sector_size, "Expected", TRUE, 1); sim_disk_data_trace (uptr, verify_buf+i*sector_size, lba+i, sector_size, "Found", TRUE, 1); dptr->dctrl = save_dctrl; sim_deb = save_sim_deb; } } free (verify_buf); } free (copy_buf); if (strcmp ("VHD", dest_fmt) == 0) sim_vhd_disk_close (dest); else fclose (dest); sim_disk_detach (uptr); if (r == SCPE_OK) { created = TRUE; copied = TRUE; strlcpy (tbuf, gbuf, sizeof(tbuf)-1); cptr = tbuf; sim_disk_set_fmt (uptr, 0, dest_fmt, NULL); sim_switches = saved_sim_switches; } else return r; /* fall through and open/return the newly created & copied disk container */ } } else if (sim_switches & SWMASK ('M')) { /* merge difference disk? */ char gbuf[CBUFSIZE], *Parent = NULL; FILE *vhd; sim_switches = sim_switches & ~(SWMASK ('M')); get_glyph_nc (cptr, gbuf, 0); /* get spec */ vhd = sim_vhd_disk_merge (gbuf, &Parent); if (vhd) { t_stat r; sim_vhd_disk_close (vhd); r = sim_disk_attach (uptr, Parent, sector_size, xfer_element_size, dontchangecapac, dbit, dtype, pdp11tracksize, completion_delay); free (Parent); return r; } return SCPE_ARG; } switch (DK_GET_FMT (uptr)) { /* case on format */ case DKUF_F_AUTO: /* SIMH format */ auto_format = TRUE; if (NULL != (uptr->fileref = sim_vhd_disk_open (cptr, "rb"))) { /* Try VHD */ sim_disk_set_fmt (uptr, 0, "VHD", NULL); /* set file format to VHD */ sim_vhd_disk_close (uptr->fileref); /* close vhd file*/ uptr->fileref = NULL; open_function = sim_vhd_disk_open; break; } while (tmp_size < sector_size) tmp_size <<= 1; if (tmp_size == sector_size) { /* Power of 2 sector size can do RAW */ if (NULL != (uptr->fileref = sim_os_disk_open_raw (cptr, "rb"))) { sim_disk_set_fmt (uptr, 0, "RAW", NULL); /* set file format to RAW */ sim_os_disk_close_raw (uptr->fileref); /* close raw file*/ open_function = sim_os_disk_open_raw; storage_function = sim_os_disk_info_raw; uptr->fileref = NULL; break; } } sim_disk_set_fmt (uptr, 0, "SIMH", NULL); /* set file format to SIMH */ open_function = sim_fopen; break; case DKUF_F_STD: /* SIMH format */ if (NULL != (uptr->fileref = sim_vhd_disk_open (cptr, "rb"))) { /* Try VHD first */ sim_disk_set_fmt (uptr, 0, "VHD", NULL); /* set file format to VHD */ sim_vhd_disk_close (uptr->fileref); /* close vhd file*/ uptr->fileref = NULL; open_function = sim_vhd_disk_open; auto_format = TRUE; break; } open_function = sim_fopen; break; case DKUF_F_VHD: /* VHD format */ open_function = sim_vhd_disk_open; create_function = sim_vhd_disk_create; storage_function = sim_os_disk_info_raw; break; case DKUF_F_RAW: /* Raw Physical Disk Access */ if (NULL != (uptr->fileref = sim_vhd_disk_open (cptr, "rb"))) { /* Try VHD first */ sim_disk_set_fmt (uptr, 0, "VHD", NULL); /* set file format to VHD */ sim_vhd_disk_close (uptr->fileref); /* close vhd file*/ uptr->fileref = NULL; open_function = sim_vhd_disk_open; auto_format = TRUE; break; } open_function = sim_os_disk_open_raw; storage_function = sim_os_disk_info_raw; break; default: return SCPE_IERR; } uptr->filename = (char *) calloc (CBUFSIZE, sizeof (char));/* alloc name buf */ uptr->disk_ctx = ctx = (struct disk_context *)calloc(1, sizeof(struct disk_context)); if ((uptr->filename == NULL) || (uptr->disk_ctx == NULL)) return _err_return (uptr, SCPE_MEM); strlcpy (uptr->filename, cptr, CBUFSIZE); /* save name */ ctx->sector_size = (uint32)sector_size; /* save sector_size */ ctx->capac_factor = ((dptr->dwidth / dptr->aincr) >= 32) ? 8 : ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* save capacity units (quadword: 8, word: 2, byte: 1) */ ctx->xfer_element_size = (uint32)xfer_element_size; /* save xfer_element_size */ ctx->dptr = dptr; /* save DEVICE pointer */ ctx->dbit = dbit; /* save debug bit */ ctx->media_removed = 0; /* default present */ sim_debug_unit (ctx->dbit, uptr, "sim_disk_attach(unit=%d,filename='%s')\n", (int)(uptr - ctx->dptr->units), uptr->filename); ctx->auto_format = auto_format; /* save that we auto selected format */ ctx->storage_sector_size = (uint32)sector_size; /* Default */ if ((sim_switches & SWMASK ('R')) || /* read only? */ ((uptr->flags & UNIT_RO) != 0)) { if (((uptr->flags & UNIT_ROABLE) == 0) && /* allowed? */ ((uptr->flags & UNIT_RO) == 0)) return _err_return (uptr, SCPE_NORO); /* no, error */ uptr->fileref = open_function (cptr, "rb"); /* open rd only */ if (uptr->fileref == NULL) /* open fail? */ return _err_return (uptr, SCPE_OPENERR); /* yes, error */ uptr->flags = uptr->flags | UNIT_RO; /* set rd only */ sim_messagef (SCPE_OK, "%s: unit is read only\n", sim_uname (uptr)); } else { /* normal */ uptr->fileref = open_function (cptr, "rb+"); /* open r/w */ if (uptr->fileref == NULL) { /* open fail? */ if ((errno == EROFS) || (errno == EACCES)) { /* read only? */ if ((uptr->flags & UNIT_ROABLE) == 0) /* allowed? */ return _err_return (uptr, SCPE_NORO); /* no error */ uptr->fileref = open_function (cptr, "rb"); /* open rd only */ if (uptr->fileref == NULL) /* open fail? */ return _err_return (uptr, SCPE_OPENERR);/* yes, error */ uptr->flags = uptr->flags | UNIT_RO; /* set rd only */ sim_messagef (SCPE_OK, "%s: unit is read only\n", sim_uname (uptr)); } else { /* doesn't exist */ if (sim_switches & SWMASK ('E')) /* must exist? */ return sim_messagef (_err_return (uptr, SCPE_OPENERR), "%s: File not found: %s\n", sim_uname (uptr), cptr); if (create_function) uptr->fileref = create_function (cptr, ((t_offset)uptr->capac)*ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1));/* create new file */ else uptr->fileref = open_function (cptr, "wb+");/* open new file */ if (uptr->fileref == NULL) /* open fail? */ return sim_messagef (_err_return (uptr, SCPE_OPENERR), "%s: Can't create file: %s\n", sim_uname (uptr), cptr); sim_messagef (SCPE_OK, "%s: creating new file: %s\n", sim_uname (uptr), cptr); created = TRUE; } } /* end if null */ } /* end else */ (void)get_disk_footer (uptr); if ((DK_GET_FMT (uptr) == DKUF_F_VHD) || (ctx->footer)) { uint32 sector_size, xfer_element_size; char created_name[64]; const char *container_dtype = ctx->footer ? (char *)ctx->footer->DriveType : sim_vhd_disk_get_dtype (uptr->fileref, §or_size, &xfer_element_size, created_name, NULL); if (ctx->footer) { sector_size = NtoHl (ctx->footer->SectorSize); xfer_element_size = NtoHl (ctx->footer->TransferElementSize); strlcpy (created_name, (char *)ctx->footer->CreatingSimulator, sizeof (created_name)); } if ((DK_GET_FMT (uptr) == DKUF_F_VHD) && created && dtype) { sim_vhd_disk_set_dtype (uptr->fileref, dtype, ctx->sector_size, ctx->xfer_element_size); (void)get_disk_footer (uptr); container_dtype = (char *)ctx->footer->DriveType; } if (dtype) { char cmd[32]; t_stat r = SCPE_OK; if (((sector_size == 0) || (sector_size == ctx->sector_size)) && ((xfer_element_size == 0) || (xfer_element_size == ctx->xfer_element_size))) { if (strcmp (container_dtype, dtype) != 0) { if (drivetypes == NULL) /* No Autosize */ r = sim_messagef (SCPE_OPENERR, "%s: Can't attach %s container to %s unit - Autosizing disk disabled\n", sim_uname (uptr), container_dtype, dtype); else { cmd[sizeof (cmd) - 1] = '\0'; snprintf (cmd, sizeof (cmd) - 1, "%s %s", sim_uname (uptr), container_dtype); r = set_cmd (0, cmd); if (r != SCPE_OK) { r = sim_messagef (r, "%s: Can't set to drive type %s\n", sim_uname (uptr), container_dtype); if ((uptr->flags & UNIT_RO) != 0) /* Not Opening read only? */ r = sim_messagef (SCPE_OK, "%s: Read Only access to inconsistent drive type allowed\n", sim_uname (uptr)); else sim_messagef (SCPE_OK, "'%s' can only be attached Read Only to %s\n", cptr, sim_uname (uptr)); } } } } else r = sim_messagef (SCPE_INCOMPDSK, "%s container created by the %s simulator is incompatible with the %s device on the %s simulator\n", container_dtype, created_name, uptr->dptr->name, sim_name); if (r != SCPE_OK) { uptr->flags |= UNIT_ATT; sim_disk_detach (uptr); /* report error now */ sprintf (cmd, "%s%d %s", dptr->name, (int)(uptr-dptr->units), dtype);/* restore original dtype */ set_cmd (0, cmd); return r; } } } uptr->flags |= UNIT_ATT; uptr->pos = 0; /* Get Device attributes if they are available */ if (storage_function) storage_function (uptr->fileref, &ctx->storage_sector_size, &ctx->removable, &ctx->is_cdrom); if ((created) && (!copied)) { t_stat r = SCPE_OK; uint8 *secbuf = (uint8 *)calloc (128, ctx->sector_size); /* alloc temp sector buf */ /* On a newly created disk, we write zeros to the whole disk. This serves 3 purposes: 1) it avoids strange allocation delays writing newly allocated storage at the end of the disk during simulator operation 2) it allocates storage for the whole disk at creation time to avoid strange failures which may happen during simulator execution if the containing disk is full 3) it leaves a Simh Format disk at the intended size so it may subsequently be autosized with the correct size. |
︙ | ︙ | |||
1657 1658 1659 1660 1661 1662 1663 | free (secbuf); if (r != SCPE_OK) { sim_disk_detach (uptr); /* report error now */ (void)remove (cptr); /* remove the created file */ return SCPE_OPENERR; } if (sim_switches & SWMASK ('I')) { /* Initialize To Sector Address */ | > | | | > > > | | | > | | < | > | | > > > | | | | > > > > | | > > > > > > > > > > > > > > > > > | < | | | | | | | | | | > > > > > > | | > > > > > | > > | > > > | 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 | free (secbuf); if (r != SCPE_OK) { sim_disk_detach (uptr); /* report error now */ (void)remove (cptr); /* remove the created file */ return SCPE_OPENERR; } if (sim_switches & SWMASK ('I')) { /* Initialize To Sector Address */ size_t init_buf_size = 1024*1024; uint8 *init_buf = (uint8*) malloc (init_buf_size); t_lba lba, sect; uint32 capac_factor = ((dptr->dwidth / dptr->aincr) >= 32) ? 8 : ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (quadword: 8, word: 2, byte: 1) */ t_seccnt sectors_per_buffer = (t_seccnt)((init_buf_size)/sector_size); t_lba total_sectors = (t_lba)((uptr->capac*capac_factor)/(sector_size/((dptr->flags & DEV_SECTORS) ? 512 : 1))); t_seccnt sects = sectors_per_buffer; if (!init_buf) { sim_disk_detach (uptr); /* report error now */ (void)remove (cptr); return SCPE_MEM; } sim_messagef (SCPE_OK, "Initializing %u sectors each %u bytes in size with the sector address\n", (uint32)total_sectors, (uint32)sector_size); for (lba = 0; (lba < total_sectors) && (r == SCPE_OK); lba += sects) { t_seccnt sects_written; sects = sectors_per_buffer; if (lba + sects > total_sectors) sects = total_sectors - lba; for (sect = 0; sect < sects; sect++) { t_lba offset; for (offset = 0; offset < sector_size; offset += sizeof(uint32)) *((uint32 *)&init_buf[sect*sector_size + offset]) = (uint32)(lba + sect); } r = sim_disk_wrsect (uptr, lba, init_buf, §s_written, sects); if ((r != SCPE_OK) || (sects != sects_written)) { free (init_buf); sim_disk_detach (uptr); /* report error now */ (void)remove (cptr); /* remove the created file */ return sim_messagef (SCPE_OPENERR, "Error initializing each sector with its address: %s\n", (r == SCPE_OK) ? sim_error_text (r) : "sectors written not what was requested"); } sim_messagef (SCPE_OK, "%s: Initialized To Sector Address %u/%u sectors. %d%% complete.\r", sim_uname (uptr), (uint32)(lba + sects_written), (uint32)total_sectors, (int)((((float)lba)*100)/total_sectors)); } sim_messagef (SCPE_OK, "%s: Initialized To Sector Address %u sectors. 100%% complete. \n", sim_uname (uptr), (uint32)total_sectors); free (init_buf); } if (pdp11tracksize) sim_disk_pdp11_bad_block (uptr, pdp11tracksize, sector_size/sizeof(uint16)); } if (sim_switches & SWMASK ('K')) { t_stat r = SCPE_OK; t_lba lba, sect; uint32 capac_factor = ((dptr->dwidth / dptr->aincr) >= 32) ? 8 : ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (word: 2, byte: 1) */ t_seccnt sectors_per_buffer = (t_seccnt)((1024*1024)/sector_size); t_lba total_sectors = (t_lba)((uptr->capac*capac_factor)/(sector_size/((dptr->flags & DEV_SECTORS) ? 512 : 1))); t_seccnt sects = sectors_per_buffer; t_seccnt sects_verify; uint8 *verify_buf = (uint8*) malloc (1024*1024); if (!verify_buf) { sim_disk_detach (uptr); /* report error now */ return SCPE_MEM; } for (lba = 0; (lba < total_sectors) && (r == SCPE_OK); lba += sects_verify) { sects = sectors_per_buffer; if (lba + sects > total_sectors) sects = total_sectors - lba; r = sim_disk_rdsect (uptr, lba, verify_buf, §s_verify, sects); if (r == SCPE_OK) { if (sects != sects_verify) sim_printf ("\n%s: Verification Error when reading lbn %d(0x%X) of %d(0x%X) Requested %u sectors, read %u sectors.\n", sim_uname (uptr), (int)lba, (int)lba, (int)total_sectors, (int)total_sectors, sects, sects_verify); for (sect = 0; sect < sects_verify; sect++) { t_lba offset; t_bool sect_error = FALSE; for (offset = 0; offset < sector_size; offset += sizeof(uint32)) { if (*((uint32 *)&verify_buf[sect*sector_size + offset]) != (uint32)(lba + sect)) { sect_error = TRUE; break; } } if (sect_error) { uint32 save_dctrl = dptr->dctrl; FILE *save_sim_deb = sim_deb; sim_printf ("\n%s: Verification Error on lbn %d(0x%X) of %d(0x%X).\n", sim_uname (uptr), (int)(lba+sect), (int)(lba+sect), (int)total_sectors, (int)total_sectors); dptr->dctrl = 0xFFFFFFFF; sim_deb = stdout; sim_disk_data_trace (uptr, verify_buf+sect*sector_size, lba+sect, sector_size, "Found", TRUE, 1); dptr->dctrl = save_dctrl; sim_deb = save_sim_deb; } } } sim_messagef (SCPE_OK, "%s: Verified containing Sector Address %u/%u sectors. %d%% complete.\r", sim_uname (uptr), (uint32)lba, (uint32)total_sectors, (int)((((float)lba)*100)/total_sectors)); } sim_messagef (SCPE_OK, "%s: Verified containing Sector Address %u sectors. 100%% complete. \n", sim_uname (uptr), (uint32)lba); free (verify_buf); uptr->dynflags |= UNIT_DISK_CHK; } if (get_disk_footer (uptr) != SCPE_OK) { sim_disk_detach (uptr); return SCPE_OPENERR; } filesystem_size = get_filesystem_size (uptr); container_size = sim_disk_size (uptr); current_unit_size = ((t_offset)uptr->capac)*ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1); if (container_size && (container_size != (t_offset)-1)) { if (dontchangecapac) { t_addr saved_capac = uptr->capac; if (drivetypes != NULL) { if (filesystem_size != (t_offset)-1) { /* File System found? */ /* Walk through all potential drive types until we find one the right size */ while (*drivetypes != NULL) { char cmd[CBUFSIZE]; t_stat st; uptr->flags &= ~UNIT_ATT; /* temporarily mark as un-attached */ sprintf (cmd, "%s %s", sim_uname (uptr), *drivetypes); st = set_cmd (0, cmd); uptr->flags |= UNIT_ATT; /* restore attached indicator */ if (st == SCPE_OK) current_unit_size = ((t_offset)uptr->capac)*ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1); if (current_unit_size >= filesystem_size) break; ++drivetypes; } if (filesystem_size > current_unit_size) { if (!sim_quiet) { uptr->capac = (t_addr)(filesystem_size/(ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1))); sim_printf ("%s: The file system on the disk %s is larger than simulated device (%s > ", sim_uname (uptr), cptr, sprint_capac (dptr, uptr)); uptr->capac = saved_capac; sim_printf ("%s)\n", sprint_capac (dptr, uptr)); } sim_disk_detach (uptr); return SCPE_FSSIZE; } } else { if (!created) sim_messagef (SCPE_OK, "%s: No File System found on '%s', skipping autosizing\n", sim_uname (uptr), cptr); } } if ((container_size != current_unit_size) && ((DKUF_F_VHD == DK_GET_FMT (uptr)) || (0 != (uptr->flags & UNIT_RO)) || (ctx->footer))) { if (!sim_quiet) { int32 saved_switches = sim_switches; const char *container_dtype = ctx->footer ? (const char *)ctx->footer->DriveType : ""; sim_switches = SWMASK ('R'); uptr->capac = (t_addr)(container_size/(ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1))); sim_printf ("%s: non expandable %s disk container '%s' is %s than simulated device (%s %s ", sim_uname (uptr), container_dtype, cptr, (container_size < current_unit_size) ? "smaller" : "larger", sprint_capac (dptr, uptr), (container_size < current_unit_size) ? "<" : ">"); uptr->capac = saved_capac; sim_printf ("%s)\n", sprint_capac (dptr, uptr)); sim_switches = saved_switches; } sim_disk_detach (uptr); return SCPE_OPENERR; } } else { /* Autosize by changing capacity */ if (filesystem_size != (t_offset)-1) { /* Known file system data size AND */ if (filesystem_size > container_size) /* Data size greater than container size? */ container_size = filesystem_size + /* Use file system data size */ (pdp11tracksize * sector_size);/* plus any bad block data beyond the file system */ } else { /* Unrecognized file system */ if (container_size < current_unit_size) /* Use MAX of container or current device size */ if ((DKUF_F_VHD != DK_GET_FMT (uptr)) && /* when size can be expanded */ (0 == (uptr->flags & UNIT_RO))) container_size = current_unit_size; /* Use MAX of container or current device size */ } uptr->capac = (t_addr)(container_size/(ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1))); /* update current size */ } } if (dtype && (created || (ctx->footer == NULL))) store_disk_footer (uptr, dtype); #if defined (SIM_ASYNCH_IO) sim_disk_set_async (uptr, completion_delay); #endif uptr->io_flush = _sim_disk_io_flush; return SCPE_OK; |
︙ | ︙ | |||
1812 1813 1814 1815 1816 1817 1818 | return SCPE_IERR; if (!(uptr->flags & UNIT_ATT)) return SCPE_UNATT; ctx = (struct disk_context *)uptr->disk_ctx; fileref = uptr->fileref; | | | 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 | return SCPE_IERR; if (!(uptr->flags & UNIT_ATT)) return SCPE_UNATT; ctx = (struct disk_context *)uptr->disk_ctx; fileref = uptr->fileref; sim_debug_unit (ctx->dbit, uptr, "sim_disk_detach(unit=%d,filename='%s')\n", (int)(uptr - ctx->dptr->units), uptr->filename); switch (DK_GET_FMT (uptr)) { /* case on format */ case DKUF_F_STD: /* Simh */ close_function = fclose; break; case DKUF_F_VHD: /* Virtual Disk */ close_function = sim_vhd_disk_close; |
︙ | ︙ | |||
1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 | sim_disk_clr_async (uptr); uptr->flags &= ~(UNIT_ATT | UNIT_RO); uptr->dynflags &= ~(UNIT_NO_FIO | UNIT_DISK_CHK); free (uptr->filename); uptr->filename = NULL; uptr->fileref = NULL; free (uptr->disk_ctx); uptr->disk_ctx = NULL; uptr->io_flush = NULL; if (auto_format) sim_disk_set_fmt (uptr, 0, "AUTO", NULL); /* restore file format */ if (close_function (fileref) == EOF) return SCPE_IOERR; return SCPE_OK; } t_stat sim_disk_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { fprintf (st, "%s Disk Attach Help\n\n", dptr->name); | > > > > > > > > > > > > > > > > > > > > > > > > > > | > | | | | | | | > > > > > > > > > > > | < | | | | > > > > > | > | > > > > > > > > > > > | < > | > | | | > > > | > | | > | | | | | | > | | | > | | | | | | | < | > | > | | | | | | | < < | | | | | | | | | | | > | | | | | | | | 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 | sim_disk_clr_async (uptr); uptr->flags &= ~(UNIT_ATT | UNIT_RO); uptr->dynflags &= ~(UNIT_NO_FIO | UNIT_DISK_CHK); free (uptr->filename); uptr->filename = NULL; uptr->fileref = NULL; free (ctx->footer); free (uptr->disk_ctx); uptr->disk_ctx = NULL; uptr->io_flush = NULL; if (auto_format) sim_disk_set_fmt (uptr, 0, "AUTO", NULL); /* restore file format */ if (close_function (fileref) == EOF) return SCPE_IOERR; return SCPE_OK; } t_stat sim_disk_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { static struct example_fields { const char *dname; const char *dtype; const char *dsize; const char *dtype2; const char *dsize2; const char *dtype3; const char *dsize3; const char *dtype4; const char *dsize4; } ex_data[] = { {"RQ", "RD54", "159MB", "RX50", "409KB", "RA81", "456MB", "RA92", "1505MB"}, {"RP", "RM03", "33MW", "RM03", "33MW", "RP07", "258MW", "RM03", "15MW"}, {"RP", "RM03", "39MW", "RM03", "39MW", "RP07", "110MW", "RM03", "15MW"}, }; struct example_fields *ex = &ex_data[0]; if (strcmp (dptr->name, "RP") == 0) ex = &ex_data[1]; if (strstr (sim_name, "-10")) { ex = &ex_data[2]; if (strstr (sim_name, "PDP") == NULL) ex->dname = "RPA"; } fprintf (st, "%s Disk Attach Help\n\n", dptr->name); fprintf (st, "Disk container files can be one of several different types:\n\n"); if (strstr (sim_name, "-10") == NULL) { fprintf (st, " SIMH A disk is an unstructured binary file of the size appropriate\n"); fprintf (st, " for the disk drive being simulated accessed by C runtime APIs\n"); fprintf (st, " VHD Virtual Disk format which is described in the \"Microsoft\n"); fprintf (st, " Virtual Hard Disk (VHD) Image Format Specification\". The\n"); fprintf (st, " VHD implementation includes support for 1) Fixed (Preallocated)\n"); fprintf (st, " disks, 2) Dynamically Expanding disks, and 3) Differencing disks.\n"); fprintf (st, " RAW platform specific access to physical disk or CDROM drives\n\n"); } else { fprintf (st, " SIMH A disk is an unstructured binary file of 64bit integers\n" " access by C runtime APIs\n"); fprintf (st, " VHD A disk is an unstructured binary file of 64bit integers\n" " contained in a VHD container\n"); fprintf (st, " RAW A disk is an unstructured binary file of 64bit integers\n" " accessed by direct read/write APIs\n"); fprintf (st, " DBD9 Compatible with KLH10 is a packed big endian word\n"); fprintf (st, " DLD9 Compatible with KLH10 is a packed little endian word\n\n"); } fprintf (st, "Virtual (VHD) Disk support conforms to the \"Virtual Hard Disk Image Format\n"); fprintf (st, "Specification\", Version 1.0 October 11, 2006.\n"); fprintf (st, "Dynamically expanding disks never change their \"Virtual Size\", but they don't\n"); fprintf (st, "consume disk space on the containing storage until the virtual sectors in the\n"); fprintf (st, "disk are actually written to (i.e. a 2GB Dynamic disk container file with only\n"); fprintf (st, "30MB of data will initially be about 30MB in size and this size will grow up to\n"); fprintf (st, "2GB as different sectors are written to. The VHD format contains metadata\n"); fprintf (st, "which describes the drive size and the simh device type in use when the VHD\n"); fprintf (st, "was created. This metadata is therefore available whenever that VHD is\n"); fprintf (st, "attached to an emulated disk device in the future so the device type and\n"); fprintf (st, "size can be automatically be configured.\n\n"); if (dptr->numunits > 1) { uint32 i, attachable_count = 0, out_count = 0, skip_count; for (i=0; i < dptr->numunits; ++i) if ((dptr->units[i].flags & UNIT_ATTABLE) && !(dptr->units[i].flags & UNIT_DIS)) ++attachable_count; for (i=0; (i < dptr->numunits) && (out_count < 2); ++i) if ((dptr->units[i].flags & UNIT_ATTABLE) && !(dptr->units[i].flags & UNIT_DIS)) { fprintf (st, " sim> ATTACH {switches} %s%d diskfile\n", dptr->name, i); ++out_count; } if (attachable_count > 4) { fprintf (st, " .\n"); fprintf (st, " .\n"); fprintf (st, " .\n"); } skip_count = attachable_count - 2; for (i=0; i < dptr->numunits; ++i) if ((dptr->units[i].flags & UNIT_ATTABLE) && !(dptr->units[i].flags & UNIT_DIS)) { if (skip_count == 0) fprintf (st, " sim> ATTACH {switches} %s%d diskfile\n", dptr->name, i); else --skip_count; } } else fprintf (st, " sim> ATTACH {switches} %s diskfile\n", dptr->name); fprintf (st, "\n%s attach command switches\n", dptr->name); fprintf (st, " -R Attach Read Only.\n"); fprintf (st, " -E Must Exist (if not specified an attempt to create the indicated\n"); fprintf (st, " disk container will be attempted).\n"); fprintf (st, " -F Open the indicated disk container in a specific format (default\n"); fprintf (st, " is to autodetect VHD defaulting to RAW if the indicated\n"); fprintf (st, " container is not a VHD).\n"); fprintf (st, " -I Initialize newly created disk so that each sector contains its\n"); fprintf (st, " sector address\n"); fprintf (st, " -K Verify that the disk contents contain the sector address in each\n"); fprintf (st, " sector. Whole disk checked at attach time and each sector is\n"); fprintf (st, " checked when written.\n"); fprintf (st, " -C Create a disk container and copy its contents from another disk\n"); fprintf (st, " (simh, VHD, or RAW format). The current (or specified with -F)\n"); fprintf (st, " container format will be the format of the created container.\n"); fprintf (st, " AUTO or VHD will create a VHD container, SIMH will create a.\n"); fprintf (st, " SIMH container. Add a -V switch to verify a copy operation.\n"); fprintf (st, " -V Perform a verification pass to confirm successful data copy\n"); fprintf (st, " operation.\n"); fprintf (st, " -X When creating a VHD, create a fixed sized VHD (vs a Dynamically\n"); fprintf (st, " expanding one).\n"); fprintf (st, " -D Create a Differencing VHD (relative to an already existing VHD\n"); fprintf (st, " disk)\n"); fprintf (st, " -M Merge a Differencing VHD into its parent VHD disk\n"); fprintf (st, " -O Override consistency checks when attaching differencing disks\n"); fprintf (st, " which have unexpected parent disk GUID or timestamps\n\n"); fprintf (st, " -U Fix inconsistencies which are overridden by the -O switch\n"); if (strstr (sim_name, "-10") == NULL) { fprintf (st, " -Y Answer Yes to prompt to overwrite last track (on disk create)\n"); fprintf (st, " -N Answer No to prompt to overwrite last track (on disk create)\n"); } fprintf (st, "Examples:\n"); fprintf (st, " sim> show %s\n", ex->dname); fprintf (st, " %s, address=20001468-2000146B*, no vector, 4 units\n", ex->dname); fprintf (st, " %s0, %s, not attached, write enabled, %s, autosize, AUTO detect format\n", ex->dname, ex->dsize, ex->dtype); fprintf (st, " %s1, %s, not attached, write enabled, %s, autosize, AUTO detect format\n", ex->dname, ex->dsize, ex->dtype); fprintf (st, " %s2, %s, not attached, write enabled, %s, autosize, AUTO detect format\n", ex->dname, ex->dsize, ex->dtype); fprintf (st, " %s3, %s, not attached, write enabled, %s, autosize, AUTO detect format\n", ex->dname, ex->dsize2, ex->dtype2); fprintf (st, " sim> # attach an existing VHD and determine its size and type automatically\n"); fprintf (st, " sim> attach %s0 %s.vhd\n", ex->dname, ex->dtype3); fprintf (st, " sim> show %s0\n", ex->dname); fprintf (st, " %s0, %s, attached to %s.vhd, write enabled, %s, autosize, VHD format\n", ex->dname, ex->dsize3, ex->dtype3, ex->dtype3); fprintf (st, " sim> # create a new %s drive type VHD\n", ex->dtype4); fprintf (st, " sim> set %s2 %s\n", ex->dname, ex->dtype4); fprintf (st, " sim> attach %s2 -f vhd %s.vhd\n", ex->dname, ex->dtype4); fprintf (st, " %s2: creating new file\n", ex->dname); fprintf (st, " sim> show %s2\n", ex->dname); fprintf (st, " %s2, %s, attached to %s.vhd, write enabled, %s, autosize, VHD format\n", ex->dname, ex->dsize4, ex->dtype4, ex->dtype4); fprintf (st, " sim> # examine the size consumed by the %s VHD file\n", ex->dsize4); fprintf (st, " sim> dir %s.vhd\n", ex->dtype4); fprintf (st, " Directory of H:\\Data\n\n"); fprintf (st, " 04/14/2011 12:57 PM 5,120 %s.vhd\n", ex->dtype4); fprintf (st, " 1 File(s) 5,120 bytes\n"); fprintf (st, " sim> # create a differencing vhd (%s-1-Diff.vhd) with %s.vhd as parent\n", ex->dtype4, ex->dtype4); fprintf (st, " sim> attach %s3 -d %s-1-Diff.vhd %s.vhd\n", ex->dname, ex->dtype4, ex->dtype4); fprintf (st, " sim> # create a VHD (%s-1.vhd) which is a copy of an existing disk\n", ex->dtype4); fprintf (st, " sim> attach %s3 -c %s-1.vhd %s.vhd\n", ex->dname, ex->dtype4, ex->dtype4); fprintf (st, " %s3: creating new virtual disk '%s-1.vhd'\n", ex->dname, ex->dtype4); fprintf (st, " %s3: Copied %s. 99%% complete.\n", ex->dname, ex->dsize4); fprintf (st, " %s3: Copied %s. Done.\n", ex->dname, ex->dsize4); fprintf (st, " sim> show %s3\n", ex->dname); fprintf (st, " %s3, %s, attached to %s-1.vhd, write enabled, %s, autosize, VHD format\n", ex->dname, ex->dsize4, ex->dtype4, ex->dtype4); fprintf (st, " sim> dir %s*\n", ex->dtype4); fprintf (st, " Directory of H:\\Data\n\n"); fprintf (st, " 04/14/2011 01:12 PM 5,120 %s-1.vhd\n", ex->dtype4); fprintf (st, " 04/14/2011 12:58 PM 5,120 %s.vhd\n", ex->dtype4); fprintf (st, " 2 File(s) 10,240 bytes\n"); fprintf (st, " sim> show %s2\n", ex->dname); fprintf (st, " %s2, %s, not attached, write enabled, %s, autosize, VHD format\n", ex->dname, ex->dsize4, ex->dtype4); fprintf (st, " sim> set %s2 %s\n", ex->dname, ex->dtype3); fprintf (st, " sim> set %s2 noauto\n", ex->dname); fprintf (st, " sim> show %s2\n", ex->dname); fprintf (st, " %s2, %s, not attached, write enabled, %s, noautosize, VHD format\n", ex->dname, ex->dsize3, ex->dtype3); fprintf (st, " sim> set %s2 format=simh\n", ex->dname); fprintf (st, " sim> show %s2\n", ex->dname); fprintf (st, " %s2, %s, not attached, write enabled, %s, noautosize, SIMH format\n", ex->dname, ex->dsize3, ex->dtype3); fprintf (st, " sim> # create a VHD from an existing SIMH format disk\n"); fprintf (st, " sim> attach %s2 -c %s-Copy.vhd XYZZY.dsk\n", ex->dname, ex->dtype3); fprintf (st, " %s2: creating new virtual disk '%s-Copy.vhd'\n", ex->dname, ex->dtype3); fprintf (st, " %s2: Copied %s. 99%% complete.\n", ex->dname, ex->dsize3); fprintf (st, " %s2: Copied %s. Done.\n", ex->dname, ex->dsize3); fprintf (st, " sim> show %s2\n", ex->dname); fprintf (st, " %s2, %s, attached to %s-Copy.vhd, write enabled, %s, noautosize, VHD format\n", ex->dname, ex->dsize3, ex->dtype3, ex->dtype3); return SCPE_OK; } t_bool sim_disk_vhd_support (void) { return SCPE_OK == sim_vhd_disk_implemented (); } t_bool sim_disk_raw_support (void) { return SCPE_OK == sim_os_disk_implemented_raw (); } t_stat sim_disk_reset (UNIT *uptr) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; if (!(uptr->flags & UNIT_ATT)) /* attached? */ return SCPE_OK; sim_debug_unit (ctx->dbit, uptr, "sim_disk_reset(unit=%d)\n", (int)(uptr - ctx->dptr->units)); _sim_disk_io_flush(uptr); AIO_VALIDATE(uptr); AIO_UPDATE_QUEUE; return SCPE_OK; } |
︙ | ︙ | |||
2113 2114 2115 2116 2117 2118 2119 | return stat; } void sim_disk_data_trace(UNIT *uptr, const uint8 *data, size_t lba, size_t len, const char* txt, int detail, uint32 reason) { DEVICE *dptr = find_dev_from_unit (uptr); | | < | 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 | return stat; } void sim_disk_data_trace(UNIT *uptr, const uint8 *data, size_t lba, size_t len, const char* txt, int detail, uint32 reason) { DEVICE *dptr = find_dev_from_unit (uptr); if (sim_deb && ((uptr->dctrl | dptr->dctrl) & reason)) { char pos[32]; sprintf (pos, "lbn: %08X ", (unsigned int)lba); sim_data_trace(dptr, uptr, (detail ? data : NULL), pos, len, txt, reason); } } /* OS Specific RAW Disk I/O support */ #if defined _WIN32 static void _set_errno_from_status (DWORD dwStatus) { |
︙ | ︙ | |||
2566 2567 2568 2569 2570 2571 2572 | return SCPE_OK; } static t_stat sim_os_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { OVERLAPPED pos; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; | | > | > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > | > > > | | > > | > > > > > | | | > > > | > > > > > > > | | > > > > > > > > > > > > > | | 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 | return SCPE_OK; } static t_stat sim_os_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { OVERLAPPED pos; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; long long addr = ((long long)lba) * ctx->sector_size; DWORD bytestoread = sects * ctx->sector_size; sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr - ctx->dptr->units), lba, sects); if (sectsread) *sectsread = 0; memset (&pos, 0, sizeof (pos)); while (bytestoread) { DWORD bytesread; DWORD sectorbytes; pos.Offset = (DWORD)addr; pos.OffsetHigh = (DWORD)(addr >> 32); if (!ReadFile ((HANDLE)(uptr->fileref), buf, bytestoread, &bytesread, &pos)) { if (ERROR_HANDLE_EOF == GetLastError ()) { /* Return 0's for reads past EOF */ memset (buf, 0, bytestoread); if (sectsread) *sectsread += bytestoread / ctx->sector_size; return SCPE_OK; } _set_errno_from_status (GetLastError ()); return SCPE_IOERR; } sectorbytes = (bytesread / ctx->sector_size) * ctx->sector_size; if (bytesread > sectorbytes) { memset (buf + bytesread, 0, bytestoread - bytesread); sectorbytes += ctx->sector_size; } if (sectsread) *sectsread += sectorbytes / ctx->sector_size; bytestoread -= sectorbytes; if (bytestoread == 0) break; buf += sectorbytes; addr += sectorbytes; } return SCPE_OK; } static t_stat sim_os_disk_read (UNIT *uptr, t_offset addr, uint8 *buf, uint32 *bytesread, uint32 bytes) { OVERLAPPED pos; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_read(unit=%d, addr=0x%X, bytes=%u)\n", (int)(uptr - ctx->dptr->units), (uint32)addr, bytes); memset (&pos, 0, sizeof (pos)); pos.Offset = (DWORD)addr; pos.OffsetHigh = (DWORD)(addr >> 32); if (ReadFile ((HANDLE)(uptr->fileref), buf, (DWORD)bytes, (LPDWORD)bytesread, &pos)) return SCPE_OK; if (ERROR_HANDLE_EOF == GetLastError ()) { /* Return 0's for reads past EOF */ memset (buf, 0, bytes); if (bytesread) *bytesread = bytes; return SCPE_OK; } _set_errno_from_status (GetLastError ()); return SCPE_IOERR; } static t_stat sim_os_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) { OVERLAPPED pos; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; long long addr; DWORD byteswritten; DWORD bytestowrite = sects * ctx->sector_size; sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr - ctx->dptr->units), lba, sects); if (sectswritten) *sectswritten = 0; addr = ((long long)lba) * ctx->sector_size; memset (&pos, 0, sizeof (pos)); while (bytestowrite) { DWORD sectorbytes; pos.Offset = (DWORD)addr; pos.OffsetHigh = (DWORD)(addr >> 32); if (!WriteFile ((HANDLE)(uptr->fileref), buf, bytestowrite, &byteswritten, &pos)) { _set_errno_from_status (GetLastError ()); return SCPE_IOERR; } if (sectswritten) *sectswritten += byteswritten / ctx->sector_size; sectorbytes = (byteswritten / ctx->sector_size) * ctx->sector_size; bytestowrite -= sectorbytes; if (bytestowrite == 0) break; buf += sectorbytes; addr += sectorbytes; } return SCPE_OK; } static t_stat sim_os_disk_write (UNIT *uptr, t_offset addr, uint8 *buf, uint32 *byteswritten, uint32 bytes) { OVERLAPPED pos; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_write(unit=%d, lba=0x%X, bytes=%u)\n", (int)(uptr - ctx->dptr->units), (uint32)addr, bytes); memset (&pos, 0, sizeof (pos)); pos.Offset = (DWORD)addr; pos.OffsetHigh = (DWORD)(addr >> 32); if (WriteFile ((HANDLE)(uptr->fileref), buf, bytes, (LPDWORD)byteswritten, &pos)) return SCPE_OK; _set_errno_from_status (GetLastError ()); return SCPE_IOERR; } #elif defined (__linux) || defined (__linux__) || defined (__APPLE__)|| defined (__sun) || defined (__sun__) || defined (__hpux) || defined (_AIX) #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #if defined(HAVE_SYS_IOCTL) #include <sys/ioctl.h> |
︙ | ︙ | |||
2700 2701 2702 2703 2704 2705 2706 | #endif return TRUE; } static t_stat sim_os_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; | | > | > > > > | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | > | > > > > | | | > > | > > > > > > > | | > > > > > > > > | > > > > > | | 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 | #endif return TRUE; } static t_stat sim_os_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; off_t addr = ((off_t)lba) * ctx->sector_size; ssize_t bytesread; size_t bytestoread = sects * ctx->sector_size; sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr - ctx->dptr->units), lba, sects); if (sectsread) *sectsread = 0; while (bytestoread) { size_t sectorbytes; bytesread = pread((int)((long)uptr->fileref), buf, bytestoread, addr); if (bytesread < 0) { return SCPE_IOERR; } if (bytesread < bytestoread) { /* read zeros at/past EOF */ memset (buf + bytesread, 0, bytestoread - bytesread); bytesread = bytestoread; } sectorbytes = (bytesread / ctx->sector_size) * ctx->sector_size; if (bytesread > sectorbytes) sectorbytes += ctx->sector_size; if (sectsread) *sectsread += sectorbytes / ctx->sector_size; bytestoread -= sectorbytes; if ((bytestoread == 0) || (bytesread == 0)) break; buf += sectorbytes; addr += sectorbytes; } return SCPE_OK; } static t_stat sim_os_disk_read (UNIT *uptr, t_offset addr, uint8 *buf, uint32 *rbytesread, uint32 bytes) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; ssize_t bytesread; sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_read(unit=%d, addr=0x%X, bytes=%u)\n", (int)(uptr - ctx->dptr->units), (uint32)addr, bytes); bytesread = pread((int)((long)uptr->fileref), buf, bytes, (off_t)addr); if (bytesread < 0) { if (rbytesread) *rbytesread = 0; return SCPE_IOERR; } if (rbytesread) *rbytesread = bytesread; return SCPE_OK; } static t_stat sim_os_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; off_t addr = ((off_t)lba) * ctx->sector_size; ssize_t byteswritten; size_t bytestowrite = sects * ctx->sector_size; sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr - ctx->dptr->units), lba, sects); if (sectswritten) *sectswritten = 0; while (bytestowrite) { size_t sectorbytes; byteswritten = pwrite((int)((long)uptr->fileref), buf, bytestowrite, addr); if (byteswritten < 0) { return SCPE_IOERR; } if (sectswritten) *sectswritten += byteswritten / ctx->sector_size; sectorbytes = (byteswritten / ctx->sector_size) * ctx->sector_size; bytestowrite -= sectorbytes; if (bytestowrite == 0) break; buf += sectorbytes; addr += sectorbytes; } return SCPE_OK; } static t_stat sim_os_disk_write (UNIT *uptr, t_offset addr, uint8 *buf, uint32 *rbyteswritten, uint32 bytes) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; ssize_t byteswritten; sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_write(unit=%d, addr=0x%X, bytes=%u)\n", (int)(uptr - ctx->dptr->units), (uint32)addr, bytes); if (rbyteswritten) *rbyteswritten = 0; byteswritten = pwrite((int)((long)uptr->fileref), buf, bytes, (off_t)addr); if (byteswritten < 0) return SCPE_IOERR; if (rbyteswritten) *rbyteswritten = byteswritten; return SCPE_OK; } static t_stat sim_os_disk_info_raw (FILE *f, uint32 *sector_size, uint32 *removable, uint32 *is_cdrom) { if (sector_size) { #if defined(BLKSSZGET) |
︙ | ︙ | |||
2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 | static t_bool sim_os_disk_isavailable_raw (FILE *Disk) { return FALSE; } static t_stat sim_os_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { return SCPE_NOFNC; } static t_stat sim_os_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) { return SCPE_NOFNC; } static t_stat sim_os_disk_info_raw (FILE *f, uint32 *sector_size, uint32 *removable, uint32 *is_cdrom) { return SCPE_NOFNC; } #endif /* OS Independent Disk Virtual Disk (VHD) I/O support */ | > > > > > > > > > > > > > > > | 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 | static t_bool sim_os_disk_isavailable_raw (FILE *Disk) { return FALSE; } static t_stat sim_os_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { *sectsread = 0; return SCPE_NOFNC; } static t_stat sim_os_disk_read (UNIT *uptr, t_offset addr, uint8 *buf, uint32 *bytesread, uint32 bytes) { *bytesread = 0; return SCPE_NOFNC; } static t_stat sim_os_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) { *sectswritten = 0; return SCPE_NOFNC; } static t_stat sim_os_disk_write (UNIT *uptr, t_offset addr, uint8 *buf, uint32 *byteswritten, uint32 bytes) { *byteswritten = 0; return SCPE_NOFNC; } static t_stat sim_os_disk_info_raw (FILE *f, uint32 *sector_size, uint32 *removable, uint32 *is_cdrom) { *sector_size = *removable = *is_cdrom = 0; return SCPE_NOFNC; } #endif /* OS Independent Disk Virtual Disk (VHD) I/O support */ |
︙ | ︙ | |||
2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 | static t_offset sim_vhd_disk_size (FILE *f) { return (t_offset)-1; } static t_stat sim_vhd_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { return SCPE_IOERR; } static t_stat sim_vhd_disk_clearerr (UNIT *uptr) { return SCPE_IOERR; } static t_stat sim_vhd_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) { return SCPE_IOERR; } static t_stat sim_vhd_disk_set_dtype (FILE *f, const char *dtype) { return SCPE_NOFNC; } | > > | > | 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 | static t_offset sim_vhd_disk_size (FILE *f) { return (t_offset)-1; } static t_stat sim_vhd_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { *sectsread = 0; return SCPE_IOERR; } static t_stat sim_vhd_disk_clearerr (UNIT *uptr) { return SCPE_IOERR; } static t_stat sim_vhd_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) { *sectswritten = 0; return SCPE_IOERR; } static t_stat sim_vhd_disk_set_dtype (FILE *f, const char *dtype) { return SCPE_NOFNC; } static const char *sim_vhd_disk_get_dtype (FILE *f, uint32 *SectorSize, uint32 *xfer_element_size, char sim_name[64], time_t *creation_time) { *SectorSize = *xfer_element_size = 0; return NULL; } #else /*++ This code follows the details specified in the "Virtual Hard Disk Image |
︙ | ︙ | |||
3066 3067 3068 3069 3070 3071 3072 3073 | */ uint8 Reserved1[11]; /* This field is an extension to the VHD spec and includes a simh drive type name as a nul terminated string. */ uint8 DriveType[16]; /* | > > > | | | 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 | */ uint8 Reserved1[11]; /* This field is an extension to the VHD spec and includes a simh drive type name as a nul terminated string. */ uint8 DriveType[16]; uint32 DriveSectorSize; uint32 DriveTransferElementSize; uint8 CreatingSimulator[64]; /* This field contains zeroes. It is 328 bytes in size. */ uint8 Reserved[328]; } VHD_Footer; /* For dynamic and differencing disk images, the "Data Offset" field within the image footer points to a secondary structure that provides additional information about the disk image. The dynamic disk header should appear on a sector (512-byte) boundary. |
︙ | ︙ | |||
3205 3206 3207 3208 3209 3210 3211 | #define VHD_BAT_FREE_ENTRY (0xFFFFFFFF) #define VHD_DATA_BLOCK_ALIGNMENT ((uint64)4096) /* Optimum when underlying storage has 4k sectors */ #define VHD_DT_Fixed 2 /* Fixed hard disk */ #define VHD_DT_Dynamic 3 /* Dynamic hard disk */ #define VHD_DT_Differencing 4 /* Differencing hard disk */ | < | < | < | | > | < | | > | 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 | #define VHD_BAT_FREE_ENTRY (0xFFFFFFFF) #define VHD_DATA_BLOCK_ALIGNMENT ((uint64)4096) /* Optimum when underlying storage has 4k sectors */ #define VHD_DT_Fixed 2 /* Fixed hard disk */ #define VHD_DT_Dynamic 3 /* Dynamic hard disk */ #define VHD_DT_Differencing 4 /* Differencing hard disk */ #define VHD_Internal_SectorSize 512 typedef struct VHD_IOData *VHDHANDLE; static t_stat ReadFilePosition(FILE *File, void *buf, size_t bufsize, uint32 *bytesread, uint64 position) { uint32 err = sim_fseeko (File, (t_offset)position, SEEK_SET); size_t i; if (bytesread) *bytesread = 0; if (!err) { i = fread (buf, 1, bufsize, File); if (bytesread) *bytesread = (uint32)i; err = ferror (File); } return (err ? SCPE_IOERR : SCPE_OK); } static t_stat WriteFilePosition(FILE *File, void *buf, size_t bufsize, uint32 *byteswritten, uint64 position) { uint32 err = sim_fseeko (File, (t_offset)position, SEEK_SET); size_t i; if (byteswritten) *byteswritten = 0; if (!err) { i = fwrite (buf, 1, bufsize, File); if (byteswritten) *byteswritten = (uint32)i; err = ferror (File); } return (err ? SCPE_IOERR : SCPE_OK); } static uint32 CalculateVhdFooterChecksum(void *data, size_t size) |
︙ | ︙ | |||
3264 3265 3266 3267 3268 3269 3270 | #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ #endif #endif #ifndef __BYTE_ORDER__ #define __BYTE_ORDER__ UNKNOWN #endif #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ | < < < < < < < < < < < < < | 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 | #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ #endif #endif #ifndef __BYTE_ORDER__ #define __BYTE_ORDER__ UNKNOWN #endif #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ static uint64 NtoHll(uint64 value) { uint8 *l = (uint8 *)&value; uint64 highresult = (uint64)l[3] | ((uint64)l[2]<<8) | ((uint64)l[1]<<16) | ((uint64)l[0]<<24); uint32 lowresult = (uint64)l[7] | ((uint64)l[6]<<8) | ((uint64)l[5]<<16) | ((uint64)l[4]<<24); return (highresult << 32) | lowresult; } #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ static uint64 NtoHll(uint64 value) { return value; } #else static uint32 |
︙ | ︙ | |||
3413 3414 3415 3416 3417 3418 3419 | sum = CalculateVhdFooterChecksum (sDynamic, sizeof(*sDynamic)); sDynamic->Checksum = NtoHl (saved_sum); if ((sum != saved_sum) || (memcmp ("cxsparse", sDynamic->Cookie, sizeof (sDynamic->Cookie)))) { Return = errno; goto Return_Cleanup; } if (aBAT) { | | | | 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 | sum = CalculateVhdFooterChecksum (sDynamic, sizeof(*sDynamic)); sDynamic->Checksum = NtoHl (saved_sum); if ((sum != saved_sum) || (memcmp ("cxsparse", sDynamic->Cookie, sizeof (sDynamic->Cookie)))) { Return = errno; goto Return_Cleanup; } if (aBAT) { *aBAT = (uint32*) calloc(1, VHD_Internal_SectorSize * ((sizeof(**aBAT) * NtoHl(sDynamic->MaxTableEntries) + VHD_Internal_SectorSize - 1) / VHD_Internal_SectorSize)); if (ReadFilePosition(File, *aBAT, sizeof (**aBAT) * NtoHl(sDynamic->MaxTableEntries), NULL, NtoHll (sDynamic->TableOffset))) { Return = EINVAL; /* File Corrupt */ goto Return_Cleanup; } } if (szParentVHDPath && ParentVHDPathSize) { |
︙ | ︙ | |||
3539 3540 3541 3542 3543 3544 3545 | }; static t_stat sim_vhd_disk_implemented (void) { return SCPE_OK; } | | > > > > > | 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 | }; static t_stat sim_vhd_disk_implemented (void) { return SCPE_OK; } static t_stat sim_vhd_disk_set_dtype (FILE *f, const char *dtype, uint32 SectorSize, uint32 xfer_element_size) { VHDHANDLE hVHD = (VHDHANDLE)f; int Status = 0; memset (hVHD->Footer.DriveType, '\0', sizeof hVHD->Footer.DriveType); memcpy (hVHD->Footer.DriveType, dtype, ((1+strlen (dtype)) < sizeof (hVHD->Footer.DriveType)) ? (1+strlen (dtype)) : sizeof (hVHD->Footer.DriveType)); hVHD->Footer.DriveSectorSize = NtoHl (SectorSize); hVHD->Footer.DriveTransferElementSize = NtoHl (xfer_element_size); hVHD->Footer.CreatingSimulator[sizeof (hVHD->Footer.CreatingSimulator) - 1] = '\0'; /* Force NUL termination */ memset (hVHD->Footer.CreatingSimulator, 0, sizeof (hVHD->Footer.CreatingSimulator)); strlcpy ((char *)hVHD->Footer.CreatingSimulator, sim_name, sizeof (hVHD->Footer.CreatingSimulator)); hVHD->Footer.Checksum = 0; hVHD->Footer.Checksum = NtoHl (CalculateVhdFooterChecksum (&hVHD->Footer, sizeof(hVHD->Footer))); if (NtoHl (hVHD->Footer.DiskType) == VHD_DT_Fixed) { if (WriteFilePosition(hVHD->File, &hVHD->Footer, sizeof(hVHD->Footer), |
︙ | ︙ | |||
3591 3592 3593 3594 3595 3596 3597 | } Cleanup_Return: if (Status) return SCPE_IOERR; return SCPE_OK; } | | > > > > > > > > | 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 | } Cleanup_Return: if (Status) return SCPE_IOERR; return SCPE_OK; } static const char *sim_vhd_disk_get_dtype (FILE *f, uint32 *SectorSize, uint32 *xfer_element_size, char sim_name[64], time_t *creation_time) { VHDHANDLE hVHD = (VHDHANDLE)f; if (SectorSize) *SectorSize = NtoHl (hVHD->Footer.DriveSectorSize); if (xfer_element_size) *xfer_element_size = NtoHl (hVHD->Footer.DriveTransferElementSize); if (sim_name) memcpy (sim_name, hVHD->Footer.CreatingSimulator, 64); if (creation_time) *creation_time = (time_t)NtoHl (hVHD->Footer.TimeStamp) + 946684800; return (char *)(&hVHD->Footer.DriveType[0]); } static FILE *sim_vhd_disk_open (const char *szVHDPath, const char *DesiredAccess) { VHDHANDLE hVHD = (VHDHANDLE) calloc (1, sizeof(*hVHD)); int NeedUpdate = FALSE; |
︙ | ︙ | |||
3697 3698 3699 3700 3701 3702 3703 | static FILE *sim_vhd_disk_merge (const char *szVHDPath, char **ParentVHD) { VHDHANDLE hVHD = (VHDHANDLE) calloc (1, sizeof(*hVHD)); VHDHANDLE Parent = NULL; int Status; uint32 SectorSize, SectorsPerBlock, BlockSize, BlockNumber, BitMapBytes, BitMapSectors, BlocksToMerge, NeededBlock; uint64 BlockOffset; | | | 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 | static FILE *sim_vhd_disk_merge (const char *szVHDPath, char **ParentVHD) { VHDHANDLE hVHD = (VHDHANDLE) calloc (1, sizeof(*hVHD)); VHDHANDLE Parent = NULL; int Status; uint32 SectorSize, SectorsPerBlock, BlockSize, BlockNumber, BitMapBytes, BitMapSectors, BlocksToMerge, NeededBlock; uint64 BlockOffset; uint32 BytesRead; t_seccnt SectorsWritten; void *BlockData = NULL; if (!hVHD) return (FILE *)hVHD; if (0 != (Status = GetVHDFooter (szVHDPath, &hVHD->Footer, |
︙ | ︙ | |||
3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 | static t_offset sim_vhd_disk_size (FILE *f) { VHDHANDLE hVHD = (VHDHANDLE)f; return (t_offset)(NtoHll (hVHD->Footer.CurrentSize)); } #include <stdlib.h> #include <time.h> static void _rand_uuid_gen (void *uuidaddr) { int i; | > | 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 | static t_offset sim_vhd_disk_size (FILE *f) { VHDHANDLE hVHD = (VHDHANDLE)f; return (t_offset)(NtoHll (hVHD->Footer.CurrentSize)); } #include <stdlib.h> #include <time.h> static void _rand_uuid_gen (void *uuidaddr) { int i; |
︙ | ︙ | |||
3911 3912 3913 3914 3915 3916 3917 | VHD_DynamicDiskHeader Dynamic; uint32 *BAT = NULL; time_t now; uint32 i; FILE *File = NULL; uint32 Status = 0; uint32 BytesPerSector = 512; | | | | 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 | VHD_DynamicDiskHeader Dynamic; uint32 *BAT = NULL; time_t now; uint32 i; FILE *File = NULL; uint32 Status = 0; uint32 BytesPerSector = 512; uint64 SizeInBytes = ((uint64)SizeInSectors) * BytesPerSector; uint64 TableOffset; uint32 MaxTableEntries; VHDHANDLE hVHD = NULL; if (SizeInBytes > ((uint64)(1024 * 1024 * 1024)) * 2040) { Status = EFBIG; goto Cleanup_Return; } File = sim_fopen (szVHDPath, "rb"); if (File) { fclose (File); File = NULL; |
︙ | ︙ | |||
3939 3940 3941 3942 3943 3944 3945 | memset (&Footer, 0, sizeof(Footer)); memcpy (Footer.Cookie, "conectix", 8); Footer.Features = NtoHl (0x00000002);; Footer.FileFormatVersion = NtoHl (0x00010000);; Footer.DataOffset = NtoHll (bFixedVHD ? ((long long)-1) : (long long)(sizeof(Footer))); time (&now); | | | 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 | memset (&Footer, 0, sizeof(Footer)); memcpy (Footer.Cookie, "conectix", 8); Footer.Features = NtoHl (0x00000002);; Footer.FileFormatVersion = NtoHl (0x00010000);; Footer.DataOffset = NtoHll (bFixedVHD ? ((long long)-1) : (long long)(sizeof(Footer))); time (&now); Footer.TimeStamp = NtoHl ((uint32)(now - 946684800)); memcpy (Footer.CreatorApplication, "simh", 4); Footer.CreatorVersion = NtoHl (0x00040000); memcpy (Footer.CreatorHostOS, "Wi2k", 4); Footer.OriginalSize = NtoHll (SizeInBytes); Footer.CurrentSize = NtoHll (SizeInBytes); uuid_gen (Footer.UniqueID); Footer.DiskType = NtoHl (bFixedVHD ? VHD_DT_Fixed : VHD_DT_Dynamic); |
︙ | ︙ | |||
4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 | } hVHD->Dynamic.TableOffset = NtoHll (((LocatorPosition+LocatorsWritten*BytesPerSector + VHD_DATA_BLOCK_ALIGNMENT - 1)/VHD_DATA_BLOCK_ALIGNMENT)*VHD_DATA_BLOCK_ALIGNMENT); hVHD->Dynamic.Checksum = 0; hVHD->Dynamic.Checksum = NtoHl (CalculateVhdFooterChecksum (&hVHD->Dynamic, sizeof(hVHD->Dynamic))); hVHD->Footer.Checksum = 0; hVHD->Footer.DiskType = NtoHl (VHD_DT_Differencing); memcpy (hVHD->Footer.DriveType, ParentFooter.DriveType, sizeof (hVHD->Footer.DriveType)); hVHD->Footer.Checksum = NtoHl (CalculateVhdFooterChecksum (&hVHD->Footer, sizeof(hVHD->Footer))); if (WriteFilePosition (hVHD->File, &hVHD->Footer, sizeof (hVHD->Footer), NULL, 0)) { | > > | 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 | } hVHD->Dynamic.TableOffset = NtoHll (((LocatorPosition+LocatorsWritten*BytesPerSector + VHD_DATA_BLOCK_ALIGNMENT - 1)/VHD_DATA_BLOCK_ALIGNMENT)*VHD_DATA_BLOCK_ALIGNMENT); hVHD->Dynamic.Checksum = 0; hVHD->Dynamic.Checksum = NtoHl (CalculateVhdFooterChecksum (&hVHD->Dynamic, sizeof(hVHD->Dynamic))); hVHD->Footer.Checksum = 0; hVHD->Footer.DiskType = NtoHl (VHD_DT_Differencing); memcpy (hVHD->Footer.DriveType, ParentFooter.DriveType, sizeof (hVHD->Footer.DriveType)); hVHD->Footer.DriveSectorSize = ParentFooter.DriveSectorSize; hVHD->Footer.DriveTransferElementSize = ParentFooter.DriveTransferElementSize; hVHD->Footer.Checksum = NtoHl (CalculateVhdFooterChecksum (&hVHD->Footer, sizeof(hVHD->Footer))); if (WriteFilePosition (hVHD->File, &hVHD->Footer, sizeof (hVHD->Footer), NULL, 0)) { |
︙ | ︙ | |||
4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 | return (FILE *)CreateVirtualDisk (szVHDPath, (uint32)(desiredsize/512), 0, (sim_switches & SWMASK ('X'))); } static FILE *sim_vhd_disk_create_diff (const char *szVHDPath, const char *szParentVHDPath) { return (FILE *)CreateDifferencingVirtualDisk (szVHDPath, szParentVHDPath); } static t_stat ReadVirtualDiskSectors(VHDHANDLE hVHD, uint8 *buf, t_seccnt sects, t_seccnt *sectsread, uint32 SectorSize, t_lba lba) { | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < < | | < < < < < < < < < < | | | < < < < < < < < < < < < < < < < < < < < < < < < < < < | < | | < < < < < < < < < < < < < < < < < < < < < < < | | 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 | return (FILE *)CreateVirtualDisk (szVHDPath, (uint32)(desiredsize/512), 0, (sim_switches & SWMASK ('X'))); } static FILE *sim_vhd_disk_create_diff (const char *szVHDPath, const char *szParentVHDPath) { return (FILE *)CreateDifferencingVirtualDisk (szVHDPath, szParentVHDPath); } static t_stat ReadVirtualDisk(VHDHANDLE hVHD, uint8 *buf, uint32 BytesToRead, uint32 *BytesRead, uint64 Offset) { uint32 TotalBytesRead = 0; uint32 BitMapBytes; uint32 BitMapSectors; t_stat r = SCPE_OK; if (BytesRead) *BytesRead = 0; if (!hVHD || (hVHD->File == NULL)) { errno = EBADF; return SCPE_IOERR; } if (BytesToRead == 0) return SCPE_OK; if (Offset >= (uint64)NtoHll (hVHD->Footer.CurrentSize)) { errno = ERANGE; return SCPE_IOERR; } if (NtoHl (hVHD->Footer.DiskType) == VHD_DT_Fixed) { if (ReadFilePosition(hVHD->File, buf, BytesToRead, BytesRead, Offset)) r = SCPE_IOERR; return r; } /* We are now dealing with a Dynamically expanding or differencing disk */ BitMapBytes = (7+(NtoHl (hVHD->Dynamic.BlockSize)/VHD_Internal_SectorSize))/8; BitMapSectors = (BitMapBytes+VHD_Internal_SectorSize-1)/VHD_Internal_SectorSize; while (BytesToRead && (r == SCPE_OK)) { uint32 BlockNumber = (uint32)(Offset / NtoHl (hVHD->Dynamic.BlockSize)); uint32 BytesInRead = BytesToRead; uint32 BytesThisRead = 0; if (BlockNumber != (Offset + BytesToRead) / NtoHl (hVHD->Dynamic.BlockSize)) BytesInRead = (uint32)(((BlockNumber + 1) * NtoHl (hVHD->Dynamic.BlockSize)) - Offset); if (hVHD->BAT[BlockNumber] == VHD_BAT_FREE_ENTRY) { if (!hVHD->Parent) { memset (buf, 0, BytesInRead); BytesThisRead = BytesInRead; } else { if (ReadVirtualDisk(hVHD->Parent, buf, BytesInRead, &BytesThisRead, Offset)) r = SCPE_IOERR; } } else { uint64 BlockOffset = VHD_Internal_SectorSize * ((uint64)(NtoHl (hVHD->BAT[BlockNumber]) + BitMapSectors)) + (Offset % NtoHl (hVHD->Dynamic.BlockSize)); if (ReadFilePosition(hVHD->File, buf, BytesInRead, &BytesThisRead, BlockOffset)) r = SCPE_IOERR; } BytesToRead -= BytesThisRead; buf = (uint8 *)(((char *)buf) + BytesThisRead); Offset += BytesThisRead; TotalBytesRead += BytesThisRead; } if (BytesRead) *BytesRead = TotalBytesRead; return SCPE_OK; } static t_stat ReadVirtualDiskSectors(VHDHANDLE hVHD, uint8 *buf, t_seccnt sects, t_seccnt *sectsread, uint32 SectorSize, t_lba lba) { uint32 BytesRead; t_stat r = ReadVirtualDisk(hVHD, buf, sects * SectorSize, &BytesRead, SectorSize * (uint64)lba); if (sectsread) *sectsread = BytesRead / SectorSize; return r; } static t_stat sim_vhd_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) { VHDHANDLE hVHD = (VHDHANDLE)uptr->fileref; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; |
︙ | ︙ | |||
4457 4458 4459 4460 4461 4462 4463 | for (i=0; i<BufferSize; ++i) if (c[i]) return FALSE; return TRUE; } static t_stat | | | | | | < < | | > | > > > > | | | | < < | < < < | < | | > | > | < < > | > | > > | | | | | | | | | | | | | | | | 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 | for (i=0; i<BufferSize; ++i) if (c[i]) return FALSE; return TRUE; } static t_stat WriteVirtualDisk(VHDHANDLE hVHD, uint8 *buf, uint32 BytesToWrite, uint32 *BytesWritten, uint64 Offset) { uint32 TotalBytesWritten = 0; uint32 BitMapBytes; uint32 BitMapSectors; t_stat r = SCPE_OK; if (BytesWritten) *BytesWritten = 0; if (!hVHD || !hVHD->File) { errno = EBADF; return SCPE_IOERR; } if (BytesToWrite == 0) return SCPE_OK; if (Offset >= (uint64)NtoHll(hVHD->Footer.CurrentSize)) { errno = ERANGE; return SCPE_IOERR; } if (NtoHl(hVHD->Footer.DiskType) == VHD_DT_Fixed) { if (WriteFilePosition(hVHD->File, buf, BytesToWrite, BytesWritten, Offset)) r = SCPE_IOERR; return r; } /* We are now dealing with a Dynamically expanding or differencing disk */ BitMapBytes = (7 + (NtoHl(hVHD->Dynamic.BlockSize) / VHD_Internal_SectorSize)) / 8; BitMapSectors = (BitMapBytes + VHD_Internal_SectorSize - 1) / VHD_Internal_SectorSize; while (BytesToWrite && (r == SCPE_OK)) { uint32 BlockNumber = (uint32)(Offset / NtoHl(hVHD->Dynamic.BlockSize)); uint32 BytesInWrite = BytesToWrite; uint32 BytesThisWrite = 0; if (BlockNumber >= NtoHl(hVHD->Dynamic.MaxTableEntries)) { return SCPE_EOF; } if (BlockNumber != (Offset + BytesToWrite) / NtoHl (hVHD->Dynamic.BlockSize)) BytesInWrite = (uint32)(((BlockNumber + 1) * NtoHl(hVHD->Dynamic.BlockSize)) - Offset); if (hVHD->BAT[BlockNumber] == VHD_BAT_FREE_ENTRY) { uint8 *BitMap = NULL; uint32 BitMapBufferSize = VHD_DATA_BLOCK_ALIGNMENT; uint8 *BitMapBuffer = NULL; void *BlockData = NULL; uint8 *BATUpdateBufferAddress; uint32 BATUpdateBufferSize; uint64 BATUpdateStorageAddress; uint64 BlockOffset; if (!hVHD->Parent && BufferIsZeros(buf, BytesInWrite)) { BytesThisWrite = BytesInWrite; goto IO_Done; } /* Need to allocate a new Data Block. */ BlockOffset = sim_fsize_ex (hVHD->File); if (((int64)BlockOffset) == -1) return SCPE_IOERR; if ((BitMapSectors * VHD_Internal_SectorSize) > BitMapBufferSize) BitMapBufferSize = BitMapSectors * VHD_Internal_SectorSize; BitMapBuffer = (uint8 *)calloc(1, BitMapBufferSize + NtoHl(hVHD->Dynamic.BlockSize)); if (BitMapBufferSize > BitMapSectors * VHD_Internal_SectorSize) BitMap = BitMapBuffer + BitMapBufferSize - BitMapBytes; else BitMap = BitMapBuffer; memset(BitMap, 0xFF, BitMapBytes); BlockOffset -= sizeof(hVHD->Footer); if (0 == (BlockOffset & (VHD_DATA_BLOCK_ALIGNMENT-1))) { // Already aligned, so use padded BitMapBuffer if (WriteFilePosition(hVHD->File, BitMapBuffer, BitMapBufferSize + NtoHl(hVHD->Dynamic.BlockSize), NULL, BlockOffset)) { free (BitMapBuffer); return SCPE_IOERR; } BlockOffset += BitMapBufferSize; } else { // align the data portion of the block to the desired alignment // compute the address of the data portion of the block BlockOffset += BitMapSectors * VHD_Internal_SectorSize; // round up this address to the desired alignment BlockOffset += VHD_DATA_BLOCK_ALIGNMENT-1; BlockOffset &= ~(VHD_DATA_BLOCK_ALIGNMENT - 1); BlockOffset -= BitMapSectors * VHD_Internal_SectorSize; if (WriteFilePosition(hVHD->File, BitMap, (BitMapSectors * VHD_Internal_SectorSize) + NtoHl(hVHD->Dynamic.BlockSize), NULL, BlockOffset)) { free (BitMapBuffer); return SCPE_IOERR; } BlockOffset += BitMapSectors * VHD_Internal_SectorSize; } free(BitMapBuffer); BitMapBuffer = BitMap = NULL; /* the BAT block address is the beginning of the block bitmap */ BlockOffset -= BitMapSectors * VHD_Internal_SectorSize; hVHD->BAT[BlockNumber] = NtoHl((uint32)(BlockOffset / VHD_Internal_SectorSize)); BlockOffset += (BitMapSectors * VHD_Internal_SectorSize) + NtoHl(hVHD->Dynamic.BlockSize); if (WriteFilePosition(hVHD->File, &hVHD->Footer, sizeof(hVHD->Footer), NULL, BlockOffset)) goto Fatal_IO_Error; /* Since a large VHD can have a pretty large BAT, and we've only changed one longword bat entry |
︙ | ︙ | |||
4588 4589 4590 4591 4592 4593 4594 | BATUpdateStorageAddress = NtoHll(hVHD->Dynamic.TableOffset); } else { BATUpdateBufferSize = VHD_DATA_BLOCK_ALIGNMENT; BATUpdateStorageAddress = NtoHll(hVHD->Dynamic.TableOffset) + BATUpdateBufferAddress - ((uint8 *)hVHD->BAT); } /* If the total BAT is smaller than one VHD_DATA_BLOCK_ALIGNMENT, then be sure to only write out the BAT data */ | | | < < | < < | | | | < < > | | | | < < > < < | | | < < | < > | > > > > > > > > | | | | | > > | | > | > > > > > | | > | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 | BATUpdateStorageAddress = NtoHll(hVHD->Dynamic.TableOffset); } else { BATUpdateBufferSize = VHD_DATA_BLOCK_ALIGNMENT; BATUpdateStorageAddress = NtoHll(hVHD->Dynamic.TableOffset) + BATUpdateBufferAddress - ((uint8 *)hVHD->BAT); } /* If the total BAT is smaller than one VHD_DATA_BLOCK_ALIGNMENT, then be sure to only write out the BAT data */ if ((size_t)(BATUpdateBufferAddress - (uint8 *)hVHD->BAT + BATUpdateBufferSize) > VHD_Internal_SectorSize * ((sizeof(*hVHD->BAT)*NtoHl(hVHD->Dynamic.MaxTableEntries) + VHD_Internal_SectorSize - 1)/VHD_Internal_SectorSize)) BATUpdateBufferSize = (uint32)(VHD_Internal_SectorSize * ((sizeof(*hVHD->BAT) * NtoHl(hVHD->Dynamic.MaxTableEntries) + VHD_Internal_SectorSize - 1)/VHD_Internal_SectorSize) - (BATUpdateBufferAddress - ((uint8 *)hVHD->BAT))); if (WriteFilePosition(hVHD->File, BATUpdateBufferAddress, BATUpdateBufferSize, NULL, BATUpdateStorageAddress)) goto Fatal_IO_Error; if (hVHD->Parent) { /* Need to populate data block contents from parent VHD */ BlockData = malloc (NtoHl (hVHD->Dynamic.BlockSize)); if (ReadVirtualDisk(hVHD->Parent, (uint8*) BlockData, NtoHl (hVHD->Dynamic.BlockSize), NULL, (Offset / NtoHl (hVHD->Dynamic.BlockSize)) * NtoHl (hVHD->Dynamic.BlockSize))) goto Fatal_IO_Error; if (WriteVirtualDisk(hVHD, (uint8*) BlockData, NtoHl (hVHD->Dynamic.BlockSize), NULL, (Offset / NtoHl (hVHD->Dynamic.BlockSize)) * NtoHl (hVHD->Dynamic.BlockSize))) goto Fatal_IO_Error; free(BlockData); } continue; Fatal_IO_Error: free (BitMap); free (BlockData); r = SCPE_IOERR; } else { uint64 BlockOffset = VHD_Internal_SectorSize * ((uint64)(NtoHl(hVHD->BAT[BlockNumber]) + BitMapSectors)) + (Offset % NtoHl(hVHD->Dynamic.BlockSize)); if (WriteFilePosition(hVHD->File, buf, BytesInWrite, &BytesThisWrite, BlockOffset)) r = SCPE_IOERR; } IO_Done: BytesToWrite -= BytesThisWrite; buf = (uint8 *)(((char *)buf) + BytesThisWrite); Offset += BytesThisWrite; TotalBytesWritten += BytesThisWrite; } if (BytesWritten) *BytesWritten = TotalBytesWritten; return r; } static t_stat WriteVirtualDiskSectors(VHDHANDLE hVHD, uint8 *buf, t_seccnt sects, t_seccnt *sectswritten, uint32 SectorSize, t_lba lba) { uint32 BytesWritten; t_stat r = WriteVirtualDisk(hVHD, buf, sects * SectorSize, &BytesWritten, SectorSize * (uint64)lba); if (sectswritten) *sectswritten = BytesWritten / SectorSize; return r; } static t_stat sim_vhd_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) { VHDHANDLE hVHD = (VHDHANDLE)uptr->fileref; struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; return WriteVirtualDiskSectors(hVHD, buf, sects, sectswritten, ctx->sector_size, lba); } #endif /* * Zap Type command to remove incorrectly autosize information that * may have been recorded at the end of a disk container file */ typedef struct { t_stat stat; int32 flag; } DISK_INFO_CTX; static void sim_disk_info_entry (const char *directory, const char *filename, t_offset FileSize, const struct stat *filestat, void *context) { DISK_INFO_CTX *info = (DISK_INFO_CTX *)context; char FullPath[PATH_MAX + 1]; struct simh_disk_footer footer; struct simh_disk_footer *f = &footer; FILE *container; t_offset container_size; sprintf (FullPath, "%s%s", directory, filename); if (info->flag) { /* zap type */ container = sim_vhd_disk_open (FullPath, "r"); if (container != NULL) { sim_vhd_disk_close (container); info->stat = sim_messagef (SCPE_OPENERR, "Can't change the disk type of a VHD container file\n"); return; } container = sim_fopen (FullPath, "r+"); if (container == NULL) { info->stat = sim_messagef (SCPE_OPENERR, "Can't open container file '%s' - %s\n", FullPath, strerror (errno)); return; } container_size = sim_fsize_ex (container); if ((container_size != (t_offset)-1) && (container_size > sizeof (*f)) && (sim_fseeko (container, container_size - sizeof (*f), SEEK_SET) == 0) && (sizeof (*f) == sim_fread (f, 1, sizeof (*f), container))) { if ((memcmp (f->Signature, "simh", 4) == 0) && (f->Checksum == NtoHl (eth_crc32 (0, f, sizeof (*f) - sizeof (f->Checksum))))) { (void)sim_set_fsize (container, (t_addr)(container_size - sizeof (*f))); fclose (container); info->stat = sim_messagef (SCPE_OK, "Disk Type Removed from container '%s'\n", FullPath); return; } } fclose (container); info->stat = sim_messagef (SCPE_ARG, "No footer found on disk container '%s'.\n", FullPath); return; } if (info->flag == 0) { UNIT unit, *uptr = &unit; struct disk_context disk_ctx; struct disk_context *ctx = &disk_ctx; t_offset (*size_function)(FILE *file); int (*close_function)(FILE *f); FILE *container; t_offset container_size; memset (&unit, 0, sizeof (unit)); memset (&disk_ctx, 0, sizeof (disk_ctx)); sim_switches |= SWMASK ('E') | SWMASK ('R'); /* Must exist, Read Only */ uptr->flags |= UNIT_ATTABLE; uptr->disk_ctx = &disk_ctx; sim_disk_set_fmt (uptr, 0, "VHD", NULL); container = sim_vhd_disk_open (FullPath, "r"); if (container == NULL) { sim_disk_set_fmt (uptr, 0, "SIMH", NULL); container = sim_fopen (FullPath, "r+"); close_function = fclose; size_function = sim_fsize_ex; } else { close_function = sim_vhd_disk_close; size_function = sim_vhd_disk_size; } if (container) { container_size = size_function (container); uptr->filename = strdup (FullPath); uptr->fileref = container; uptr->flags |= UNIT_ATT; get_disk_footer (uptr); f = ctx->footer; if (f) { sim_printf ("Container: %s\n" " Simulator: %s\n" " DriveType: %s\n" " SectorSize: %u\n" " SectorCount: %u\n" " TransferElementSize: %u\n" " AccessFormat: %s\n" " CreationTime: %s", uptr->filename, f->CreatingSimulator, f->DriveType, NtoHl(f->SectorSize), NtoHl (f->SectorCount), NtoHl (f->TransferElementSize), fmts[f->AccessFormat].name, f->CreationTime); sim_printf ("Container Size: %s bytes\n", sim_fmt_numeric ((double)ctx->container_size)); } else { sim_printf ("Container Info for '%s' unavailable\n", uptr->filename); sim_printf ("Container Size: %s bytes\n", sim_fmt_numeric ((double)container_size)); } free (f); free (uptr->filename); close_function (container); info->stat = SCPE_OK; return; } else { info->stat = sim_messagef (SCPE_OPENERR, "Can't open container file '%s' - %s\n", FullPath, strerror (errno)); return; } } } t_stat sim_disk_info_cmd (int32 flag, CONST char *cptr) { DISK_INFO_CTX disk_info_state; t_stat stat; if ((!cptr) || (*cptr == 0)) return SCPE_2FARG; GET_SWITCHES (cptr); /* get switches */ memset (&disk_info_state, 0, sizeof (disk_info_state)); disk_info_state.flag = flag; stat = sim_dir_scan (cptr, sim_disk_info_entry, &disk_info_state); if (stat == SCPE_OK) return disk_info_state.stat; return sim_messagef (SCPE_OK, "No such file or directory: %s\n", cptr); } /* disk testing */ #include <setjmp.h> struct disk_test_coverage { t_lba total_sectors; uint32 max_xfer_size; t_seccnt max_xfer_sectors; uint32 wsetbits; uint32 *wbitmap; uint32 *data; }; static t_stat sim_disk_test_exercise (UNIT *uptr) { struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; struct disk_test_coverage *c = (struct disk_test_coverage *)calloc (1, sizeof (*c)); t_stat r = SCPE_OK; uint32 uint32s_per_sector = (ctx->sector_size / sizeof (*c->data)); DEVICE *dptr = find_dev_from_unit (uptr); uint32 capac_factor = ((dptr->dwidth / dptr->aincr) >= 32) ? 8 : ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (quadword: 8, word: 2, byte: 1) */ uint32 tries = 0; t_bool unexpected_data = FALSE; c->max_xfer_size = 1024*1024; c->max_xfer_sectors = c->max_xfer_size / ctx->sector_size; c->total_sectors = (t_lba)((uptr->capac*capac_factor)/(ctx->sector_size/((dptr->flags & DEV_SECTORS) ? ((ctx->sector_size >= 512) ? 512 : ctx->sector_size): 1))); c->data = (uint32 *)malloc (c->max_xfer_size); c->wbitmap = (uint32 *)calloc ((c->total_sectors + 32)/32, sizeof (*c->wbitmap)); #define BITMAP_IS_SET(n) (c->wbitmap[(n) >> 5] & (1 << ((n) & 0x1f))) #define SET_BITMAP(n) c->wbitmap[(n) >> 5] |= (1 << ((n) & 0x1f)) /* Randomly populate the whole drive container with known data (sector # in each sector) */ srand (0); while (c->wsetbits < c->total_sectors) { t_lba start_lba = (rand () % c->total_sectors); t_lba end_lba = start_lba + 1 + (rand () % (c->max_xfer_sectors - 1)); t_lba lba; t_seccnt i, sectors_to_write, sectors_written; if (end_lba > c->total_sectors) end_lba = c->total_sectors; if (BITMAP_IS_SET(start_lba)) { ++tries; if (tries < 30) continue; while (BITMAP_IS_SET(start_lba)) start_lba = (1 + start_lba) % c->total_sectors; end_lba = start_lba + 1; } tries = 0; for (lba = start_lba; lba < end_lba; lba++) { if (BITMAP_IS_SET(lba)) { end_lba = lba; break; } SET_BITMAP(lba); ++c->wsetbits; } sectors_to_write = end_lba - start_lba; for (i=0; i < sectors_to_write * uint32s_per_sector; i++) c->data[i] = start_lba + i / uint32s_per_sector; r = sim_disk_wrsect (uptr, start_lba, (uint8 *)c->data, §ors_written, sectors_to_write); if (r != SCPE_OK) { sim_printf ("Error writing sectors %u thru %u: %s\n", start_lba, end_lba - 1, sim_error_text (r)); break; } else { if (sectors_to_write != sectors_written) { sim_printf ("Unexpectedly wrote %u sectors instead of %u sectors starting at lba %u\n", sectors_written, sectors_to_write, start_lba); break; } } } if (r == SCPE_OK) { t_seccnt sectors_read, sectors_to_read, sector_to_check; t_lba lba; sim_printf("Writing OK\n"); for (lba = 0; (lba < c->total_sectors) && (r == SCPE_OK); lba += sectors_read) { sectors_to_read = 1 + (rand () % (c->max_xfer_sectors - 1)); if (lba + sectors_to_read > c->total_sectors) sectors_to_read = c->total_sectors - lba; r = sim_disk_rdsect (uptr, lba, (uint8 *)c->data, §ors_read, sectors_to_read); if (r == SCPE_OK) { if (sectors_read != sectors_to_read) { sim_printf ("Only returned %u sectors when reading %u sectors from lba %u\n", sectors_read, sectors_to_read, lba); r = SCPE_INCOMP; } } else sim_printf ("Error reading %u sectors at lba %u, %u read - %s\n", sectors_to_read, lba, sectors_read, sim_error_text (r)); for (sector_to_check = 0; sector_to_check < sectors_read; ++sector_to_check) { uint32 i; for (i = 0; i < uint32s_per_sector; i++) if (c->data[i + sector_to_check * uint32s_per_sector] != (lba + sector_to_check)) { sim_printf ("Sector %u(0x%X) has unexpected data at offset 0x%X: 0x%08X\n", lba + sector_to_check, lba + sector_to_check, i, c->data[i + sector_to_check * uint32s_per_sector]); unexpected_data = TRUE; break; } } } if ((r == SCPE_OK) && !unexpected_data) sim_printf("Reading OK\n"); else { sim_printf("Reading BAD\n"); r = SCPE_IERR; } } free (c->data); free (c->wbitmap); free (c); if (r == SCPE_OK) { char *filename = strdup (uptr->filename); sim_disk_detach (uptr); (void)remove (filename); free (filename); } return r; } t_stat sim_disk_test (DEVICE *dptr) { const char *fmt[] = {"RAW", "VHD", "VHD", "SIMH", NULL}; uint32 sect_size[] = {576, 4096, 1024, 512, 256, 128, 64, 0}; uint32 xfr_size[] = {1, 2, 4, 8, 0}; int x, s, f; UNIT *uptr = &dptr->units[0]; char filename[256]; t_stat r; int32 saved_switches = sim_switches & ~SWMASK('T'); SIM_TEST_INIT; for (x = 0; xfr_size[x] != 0; x++) { for (f = 0; fmt[f] != 0; f++) { for (s = 0; sect_size[s] != 0; s++) { snprintf (filename, sizeof (filename) - 1, "Test-%u-%u.%s", sect_size[s], xfr_size[x], fmt[f]); if ((f > 0) && (strcmp (fmt[f], "VHD") == 0) && (strcmp (fmt[f - 1], "VHD") == 0)) { /* Second VHD is Fixed */ sim_switches |= SWMASK('X'); snprintf (filename, sizeof (filename) - 1, "Test-%u-%u-Fixed.%s", sect_size[s], xfr_size[x], fmt[f]); } else sim_switches = saved_switches; (void)remove (filename); /* Remove any prior remnants */ r = sim_disk_set_fmt (uptr, 0, fmt[f], NULL); if (r != SCPE_OK) break; sim_printf ("Testing %s (%s) using %s\n", sim_uname (uptr), sprint_capac (dptr, uptr), filename); if (strcmp (fmt[f], "RAW") == 0) { /* There is no innate creation of RAW containers, so create the empty container using SIMH format */ sim_disk_set_fmt (uptr, 0, "SIMH", NULL); sim_disk_attach_ex (uptr, filename, sect_size[s], xfr_size[x], TRUE, 0, NULL, 0, 0, NULL); sim_disk_detach (uptr); sim_disk_set_fmt (uptr, 0, fmt[f], NULL); } r = sim_disk_attach_ex (uptr, filename, sect_size[s], xfr_size[x], TRUE, 0, NULL, 0, 0, NULL); if (r != SCPE_OK) break; SIM_TEST(sim_disk_test_exercise (uptr)); } } } return SCPE_OK; } |
︙ | ︙ | |||
37 38 39 40 41 42 43 | /* SIMH/Disk format */ typedef uint32 t_seccnt; /* disk sector count */ typedef uint32 t_lba; /* disk logical block address */ /* Unit flags */ | < | | | > > > | > > > > > > > > > > > > > > | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | /* SIMH/Disk format */ typedef uint32 t_seccnt; /* disk sector count */ typedef uint32 t_lba; /* disk logical block address */ /* Unit flags */ #define DKUF_V_FMT (UNIT_V_UF + 0) /* disk file format */ #define DKUF_W_FMT 2 /* 2b of formats */ #define DKUF_M_FMT ((1u << DKUF_W_FMT) - 1) #define DKUF_F_AUTO 0 /* Auto detect format format */ #define DKUF_F_STD 1 /* SIMH format */ #define DKUF_F_RAW 2 /* Raw Physical Disk Access */ #define DKUF_F_VHD 3 /* VHD format */ #define DKUF_V_UF (DKUF_V_FMT + DKUF_W_FMT) #define DKUF_WLK UNIT_WLK #define DKUF_FMT (DKUF_M_FMT << DKUF_V_FMT) #define DKUF_WRP (DKUF_WLK | UNIT_RO) #define DK_F_STD (DKUF_F_STD << DKUF_V_FMT) #define DK_F_RAW (DKUF_F_RAW << DKUF_V_FMT) #define DK_F_VHD (DKUF_F_VHD << DKUF_V_FMT) #define DK_GET_FMT(u) (((u)->flags >> DKUF_V_FMT) & DKUF_M_FMT) /* Return status codes */ #define DKSE_OK 0 /* no error */ typedef void (*DISK_PCALLBACK)(UNIT *unit, t_stat status); /* Prototypes */ t_stat sim_disk_attach (UNIT *uptr, const char *cptr, size_t sector_size, size_t xfer_element_size, t_bool dontchangecapac, uint32 debugbit, const char *drivetype, uint32 pdp11_tracksize, int completion_delay); t_stat sim_disk_attach_ex (UNIT *uptr, const char *cptr, size_t sector_size, size_t xfer_element_size, t_bool dontchangecapac, /* if false just change uptr->capac as needed */ uint32 dbit, /* debug bit */ const char *dtype, /* drive type */ uint32 pdp11tracksize, /* BAD144 track */ int completion_delay, /* Minimum Delay for asynch I/O completion */ const char **drivetypes); /* list of drive types (from smallest to largest) */ /* to try and fit the container/file system into */ t_stat sim_disk_detach (UNIT *uptr); t_stat sim_disk_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); t_stat sim_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects); t_stat sim_disk_rdsect_a (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects, DISK_PCALLBACK callback); t_stat sim_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects); t_stat sim_disk_wrsect_a (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects, DISK_PCALLBACK callback); t_stat sim_disk_unload (UNIT *uptr); |
︙ | ︙ | |||
90 91 92 93 94 95 96 97 98 99 100 101 102 103 | t_bool sim_disk_isavailable_a (UNIT *uptr, DISK_PCALLBACK callback); t_bool sim_disk_wrp (UNIT *uptr); t_stat sim_disk_pdp11_bad_block (UNIT *uptr, int32 sec, int32 wds); t_offset sim_disk_size (UNIT *uptr); t_bool sim_disk_vhd_support (void); t_bool sim_disk_raw_support (void); void sim_disk_data_trace (UNIT *uptr, const uint8 *data, size_t lba, size_t len, const char* txt, int detail, uint32 reason); t_stat sim_disk_test (DEVICE *dptr); #ifdef __cplusplus } #endif #endif | > | 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | t_bool sim_disk_isavailable_a (UNIT *uptr, DISK_PCALLBACK callback); t_bool sim_disk_wrp (UNIT *uptr); t_stat sim_disk_pdp11_bad_block (UNIT *uptr, int32 sec, int32 wds); t_offset sim_disk_size (UNIT *uptr); t_bool sim_disk_vhd_support (void); t_bool sim_disk_raw_support (void); void sim_disk_data_trace (UNIT *uptr, const uint8 *data, size_t lba, size_t len, const char* txt, int detail, uint32 reason); t_stat sim_disk_info_cmd (int32 flag, CONST char *ptr); t_stat sim_disk_test (DEVICE *dptr); #ifdef __cplusplus } #endif #endif |
︙ | ︙ | |||
52 53 54 55 56 57 58 | USE_NETWORK - Create statically linked network code USE_SHARED - Create dynamically linked network code ------------------------------------------------------------------------------ Supported/Tested Platforms: | | | > > > | | > | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | USE_NETWORK - Create statically linked network code USE_SHARED - Create dynamically linked network code ------------------------------------------------------------------------------ Supported/Tested Platforms: Windows(NT,2K,XP,2K3,Vista,Win7) WinPcap-4.1.3 Npcap-V0.9994 Linux libpcap at least 0.9 OpenBSD,FreeBSD,NetBSD libpcap at least 0.9 MAC OS/X libpcap at least 0.9 Solaris Sparc libpcap at least 0.9 Solaris Intel libpcap at least 0.9 AIX ?? HP/UX ?? Compaq Tru64 Unix ?? VMS Alpha/Itanium VMS only, needs VMS libpcap WinPcap is no longer developed or supported by was available from: http://winpcap.polito.it/ Npcap is a complete replacement for systems running Windows7 and later and is available from: https://nmap.org/npcap libpcap for VMS is available from: http://simh.trailing-edge.com/sources/vms-pcap.zip libpcap for other Unix platforms is available at: NOTE: As of the release of this version of sim_ether.c ALL current *nix platforms ship with a sufficiently new version of libpcap, and ALL provide a libpcap-dev package for developing libpcap based applications. The OS vendor supplied version of libpcap AND the libpcap-dev components are preferred for proper operation of both simh AND other applications on the host system which use libpcap. Current Version: http://www.tcpdump.org/daily/libpcap-current.tar.gz Released Version: http://www.tcpdump.org/release/ When absolutely necessary (see NOTE above about vendor supplied libpcap), we've gotten the tarball, unpacked, built and installed it with: gzip -dc libpcap-current.tar.gz | tar xvf - cd libpcap-directory-name ./configure make make install Note: The "make install" step generally will have to be done as root. This will install libpcap in /usr/local/lib and /usr/local/include |
︙ | ︙ | |||
267 268 269 270 271 272 273 | 17-May-07 DTH Fixed non-ethernet device removal loop (from Naoki Hamada) 15-May-07 DTH Added dynamic loading of wpcap.dll; Corrected exceed max index bug in ethX lookup 04-May-07 DTH Corrected failure to look up ethernet device names in the registry on Windows XP x64 10-Jul-06 RMS Fixed linux conditionalization (from Chaskiel Grundman) 02-Jun-06 JDB Fixed compiler warning for incompatible sscanf parameter | | | 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 | 17-May-07 DTH Fixed non-ethernet device removal loop (from Naoki Hamada) 15-May-07 DTH Added dynamic loading of wpcap.dll; Corrected exceed max index bug in ethX lookup 04-May-07 DTH Corrected failure to look up ethernet device names in the registry on Windows XP x64 10-Jul-06 RMS Fixed linux conditionalization (from Chaskiel Grundman) 02-Jun-06 JDB Fixed compiler warning for incompatible sscanf parameter 15-Dec-05 DTH Patched eth_host_pcap_devices [remove non-ethernet devices] (from Mark Pizzolato and Galen Tackett, 08-Jun-05) Patched eth_open [tun fix](from Antal Ritter, 06-Oct-05) 30-Nov-05 DTH Added option to regenerate CRC on received packets; some ethernet devices need to pass it on to the simulation, and by the time libpcap/winpcap gets the packet, the host OS network layer has already stripped CRC out of the packet 01-Dec-04 DTH Added Windows user-defined adapter names (from Timothe Litt) |
︙ | ︙ | |||
373 374 375 376 377 378 379 | #include <direct.h> #else #include <unistd.h> #endif #define MAX(a,b) (((a) > (b)) ? (a) : (b)) | | | 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 | #include <direct.h> #else #include <unistd.h> #endif #define MAX(a,b) (((a) > (b)) ? (a) : (b)) /* Internal routine - forward declaration */ static int _eth_get_system_id (char *buf, size_t buf_size); /*============================================================================*/ /* OS-independant ethernet routines */ /*============================================================================*/ t_stat eth_mac_scan (ETH_MAC* mac, const char* strmac) |
︙ | ︙ | |||
413 414 415 416 417 418 419 | /* Allow generated MAC address */ /* XX:XX:XX:XX:XX:XX{/bits{>file}} */ /* bits (if specified) must be from 16 thru 48 */ memset (&state, 0, sizeof(state)); _eth_get_system_id (state.system_id, sizeof(state.system_id)); strlcpy (state.sim, sim_name, sizeof(state.sim)); | | | | 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 | /* Allow generated MAC address */ /* XX:XX:XX:XX:XX:XX{/bits{>file}} */ /* bits (if specified) must be from 16 thru 48 */ memset (&state, 0, sizeof(state)); _eth_get_system_id (state.system_id, sizeof(state.system_id)); strlcpy (state.sim, sim_name, sizeof(state.sim)); if (getcwd (state.cwd, sizeof(state.cwd))) {}; if (uptr) strlcpy (state.uname, sim_uname (uptr), sizeof(state.uname)); cptr = strchr (strmac, '>'); if (cptr) { state.file[sizeof(state.file)-1] = '\0'; strlcpy (state.file, cptr + 1, sizeof(state.file)); if ((f = fopen (state.file, "r"))) { filebuf[sizeof(filebuf)-1] = '\0'; if (fgets (filebuf, sizeof(filebuf)-1, f)) {}; strmac = filebuf; fclose (f); strcpy (state.file, ""); /* avoid saving */ } } cptr = strchr (strmac, '/'); if (cptr) { |
︙ | ︙ | |||
653 654 655 656 657 658 659 | } void eth_packet_trace_detail(ETH_DEV* dev, const uint8 *msg, int len, const char* txt) { eth_packet_trace_ex(dev, msg, len, txt, 1 , dev->dbit); } | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 | } void eth_packet_trace_detail(ETH_DEV* dev, const uint8 *msg, int len, const char* txt) { eth_packet_trace_ex(dev, msg, len, txt, 1 , dev->dbit); } void eth_zero(ETH_DEV* dev) { /* set all members to NULL OR 0 */ memset(dev, 0, sizeof(ETH_DEV)); dev->reflections = -1; /* not established yet */ } t_stat ethq_init(ETH_QUE* que, int max) { /* create dynamic queue if it does not exist */ if (!que->item) { que->item = (struct eth_item *) calloc(max, sizeof(struct eth_item)); if (!que->item) { /* failed to allocate memory */ |
︙ | ︙ | |||
922 923 924 925 926 927 928 929 930 931 932 933 934 935 | } void ethq_insert(ETH_QUE* que, int32 type, ETH_PACK* pack, int32 status) { ethq_insert_data(que, type, pack->oversize ? pack->oversize : pack->msg, pack->used, pack->len, pack->crc_len, NULL, status); } /*============================================================================*/ /* Non-implemented versions */ /*============================================================================*/ #if !defined (USE_NETWORK) && !defined (USE_SHARED) const char *eth_capabilities(void) {return "no Ethernet";} | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 | } void ethq_insert(ETH_QUE* que, int32 type, ETH_PACK* pack, int32 status) { ethq_insert_data(que, type, pack->oversize ? pack->oversize : pack->msg, pack->used, pack->len, pack->crc_len, NULL, status); } t_stat eth_show_devices (FILE* st, DEVICE *dptr, UNIT* uptr, int32 val, CONST char *desc) { return eth_show (st, uptr, val, NULL); } #if defined (USE_NETWORK) || defined (USE_SHARED) /* Internal routine - forward declaration */ static int _eth_devices (int max, ETH_LIST* dev); /* get ethernet devices on host */ static const char* _eth_getname(int number, char* name, char *desc) { ETH_LIST list[ETH_MAX_DEVICE]; int count = _eth_devices(ETH_MAX_DEVICE, list); if ((number < 0) || (count <= number)) return NULL; if (list[number].eth_api != ETH_API_PCAP) { sim_printf ("Eth: Pcap capable device not found. You may need to run as root\n"); return NULL; } strcpy(name, list[number].name); strcpy(desc, list[number].desc); return name; } const char* eth_getname_bydesc(const char* desc, char* name, char *ndesc) { ETH_LIST list[ETH_MAX_DEVICE]; int count = _eth_devices(ETH_MAX_DEVICE, list); int i; size_t j=strlen(desc); for (i=0; i<count; i++) { int found = 1; size_t k = strlen(list[i].desc); if (j != k) continue; for (k=0; k<j; k++) if (tolower(list[i].desc[k]) != tolower(desc[k])) found = 0; if (found == 0) continue; /* found a case-insensitive description match */ strcpy(name, list[i].name); strcpy(ndesc, list[i].desc); return name; } /* not found */ return NULL; } char* eth_getname_byname(const char* name, char* temp, char *desc) { ETH_LIST list[ETH_MAX_DEVICE]; int count = _eth_devices(ETH_MAX_DEVICE, list); size_t n; int i, found; found = 0; n = strlen(name); for (i=0; i<count && !found; i++) { if ((n == strlen(list[i].name)) && (strncasecmp(name, list[i].name, n) == 0)) { found = 1; strcpy(temp, list[i].name); /* only case might be different */ strcpy(desc, list[i].desc); } } return (found ? temp : NULL); } char* eth_getdesc_byname(char* name, char* temp) { ETH_LIST list[ETH_MAX_DEVICE]; int count = _eth_devices(ETH_MAX_DEVICE, list); size_t n; int i, found; found = 0; n = strlen(name); for (i=0; i<count && !found; i++) { if ((n == strlen(list[i].name)) && (strncasecmp(name, list[i].name, n) == 0)) { found = 1; strcpy(temp, list[i].desc); } } return (found ? temp : NULL); } static ETH_DEV **eth_open_devices = NULL; static int eth_open_device_count = 0; static char* (*p_pcap_lib_version) (void); static void _eth_add_to_open_list (ETH_DEV* dev) { eth_open_devices = (ETH_DEV**)realloc(eth_open_devices, (eth_open_device_count+1)*sizeof(*eth_open_devices)); eth_open_devices[eth_open_device_count++] = dev; } static void _eth_remove_from_open_list (ETH_DEV* dev) { int i, j; for (i=0; i<eth_open_device_count; ++i) if (eth_open_devices[i] == dev) { for (j=i+1; j<eth_open_device_count; ++j) eth_open_devices[j-1] = eth_open_devices[j]; --eth_open_device_count; break; } } t_stat eth_show (FILE* st, UNIT* uptr, int32 val, CONST void* desc) { ETH_LIST list[ETH_MAX_DEVICE]; int number; number = _eth_devices(ETH_MAX_DEVICE, list); fprintf(st, "ETH devices:\n"); if (number == -1) fprintf(st, " network support not available in simulator\n"); else if (number == 0) fprintf(st, " no network devices are available\n"); else { size_t min, len; int i; for (i=0, min=0; i<number; i++) if ((len = strlen(list[i].name)) > min) min = len; for (i=0; i<number; i++) fprintf(st," eth%d\t%-*s (%s)\n", i, (int)min, list[i].name, list[i].desc); } if (eth_open_device_count) { int i; char desc[ETH_DEV_DESC_MAX], *d; fprintf(st,"Open ETH Devices:\n"); for (i=0; i<eth_open_device_count; i++) { d = eth_getdesc_byname(eth_open_devices[i]->name, desc); if (d) fprintf(st, " %-7s%s (%s)\n", eth_open_devices[i]->dptr->name, eth_open_devices[i]->dptr->units[0].filename, d); else fprintf(st, " %-7s%s\n", eth_open_devices[i]->dptr->name, eth_open_devices[i]->dptr->units[0].filename); eth_show_dev (st, eth_open_devices[i]); } } return SCPE_OK; } #endif /*============================================================================*/ /* Non-implemented versions */ /*============================================================================*/ #if !defined (USE_NETWORK) && !defined (USE_SHARED) const char *eth_capabilities(void) {return "no Ethernet";} |
︙ | ︙ | |||
958 959 960 961 962 963 964 | {return SCPE_NOFNC;} t_stat eth_filter (ETH_DEV* dev, int addr_count, ETH_MAC* const addresses, ETH_BOOL all_multicast, ETH_BOOL promiscuous) {return SCPE_NOFNC;} t_stat eth_filter_hash (ETH_DEV* dev, int addr_count, ETH_MAC* const addresses, ETH_BOOL all_multicast, ETH_BOOL promiscuous, ETH_MULTIHASH* const hash) {return SCPE_NOFNC;} | | | > > > > > > | 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 | {return SCPE_NOFNC;} t_stat eth_filter (ETH_DEV* dev, int addr_count, ETH_MAC* const addresses, ETH_BOOL all_multicast, ETH_BOOL promiscuous) {return SCPE_NOFNC;} t_stat eth_filter_hash (ETH_DEV* dev, int addr_count, ETH_MAC* const addresses, ETH_BOOL all_multicast, ETH_BOOL promiscuous, ETH_MULTIHASH* const hash) {return SCPE_NOFNC;} const char *eth_version (void) {return NULL;} void eth_show_dev (FILE* st, ETH_DEV* dev) {} t_stat eth_show (FILE* st, UNIT* uptr, int32 val, CONST void* desc) { fprintf(st, "ETH devices:\n"); fprintf(st, " network support not available in simulator\n"); return SCPE_OK; } static int _eth_get_system_id (char *buf, size_t buf_size) {memset (buf, 0, buf_size); return 0;} t_stat sim_ether_test (DEVICE *dptr) {return SCPE_OK;} #else /* endif unimplemented */ const char *eth_capabilities(void) |
︙ | ︙ | |||
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 | uint32 caplen; /* length of portion present */ uint32 len; /* length this packet (off wire) */ }; #define PCAP_ERRBUF_SIZE 256 typedef void * pcap_t; /* Pseudo Type to avoid compiler errors */ #define DLT_EN10MB 1 /* Dummy Value to avoid compiler errors */ #endif /* HAVE_PCAP_NETWORK */ #ifdef HAVE_TAP_NETWORK #if defined(__linux) || defined(__linux__) #include <sys/ioctl.h> #include <net/if.h> #include <linux/if_tun.h> #elif defined(HAVE_BSDTUNTAP) | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 | uint32 caplen; /* length of portion present */ uint32 len; /* length this packet (off wire) */ }; #define PCAP_ERRBUF_SIZE 256 typedef void * pcap_t; /* Pseudo Type to avoid compiler errors */ #define DLT_EN10MB 1 /* Dummy Value to avoid compiler errors */ #endif /* HAVE_PCAP_NETWORK */ /* The libpcap provided API pcap_findalldevs() on most platforms, will leverage the getifaddrs() API if it is available in preference to alternate platform specific methods of determining the interface list. A limitation of getifaddrs() is that it returns only interfaces which have associated addresses. This may not include all of the interesting interfaces that we are interested in since a host may have dedicated interfaces for a simulator, which is otherwise unused by the host. One could hand craft the the build of libpcap to specifically use alternate methods to implement pcap_findalldevs(). However, this can get tricky, and would then result in a sort of deviant libpcap. This routine exists to allow platform specific code to validate and/or extend the set of available interfaces to include any that are not returned by pcap_findalldevs. */ static int eth_host_pcap_devices(int used, int max, ETH_LIST* list) { pcap_t* conn = NULL; int i, j, datalink = 0; for (i=0; i<used; ++i) { /* Cull any non-ethernet interface types */ #if defined(HAVE_PCAP_NETWORK) char errbuf[PCAP_ERRBUF_SIZE]; conn = pcap_open_live(list[i].name, ETH_MAX_PACKET, ETH_PROMISC, PCAP_READ_TIMEOUT, errbuf); if (NULL != conn) datalink = pcap_datalink(conn), pcap_close(conn); list[i].eth_api = ETH_API_PCAP; if ((NULL == conn) || (datalink != DLT_EN10MB)) { for (j=i; j<used-1; ++j) list[j] = list[j+1]; --used; --i; } #endif } /* for */ #if defined(_WIN32) /* replace device description with user-defined adapter name (if defined) */ for (i=0; i<used; i++) { char regkey[2048]; unsigned char regval[2048]; LONG status; DWORD reglen, regtype; HKEY reghnd; /* These registry keys don't seem to exist for all devices, so we simply ignore errors. */ /* Windows XP x64 registry uses wide characters by default, so we force use of narrow characters by using the 'A'(ANSI) version of RegOpenKeyEx. This could cause some problems later, if this code is internationalized. Ideally, the pcap lookup will return wide characters, and we should use them to build a wide registry key, rather than hardcoding the string as we do here. */ if (list[i].name[strlen( "\\Device\\NPF_" )] == '{') { sprintf( regkey, "SYSTEM\\CurrentControlSet\\Control\\Network\\" "{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", list[i].name+ strlen( "\\Device\\NPF_" ) ); if ((status = RegOpenKeyExA (HKEY_LOCAL_MACHINE, regkey, 0, KEY_QUERY_VALUE, ®hnd)) != ERROR_SUCCESS) continue; reglen = sizeof(regval); /* look for user-defined adapter name, bail if not found */ /* same comment about Windows XP x64 (above) using RegQueryValueEx */ if ((status = RegQueryValueExA (reghnd, "Name", NULL, ®type, regval, ®len)) != ERROR_SUCCESS) { RegCloseKey (reghnd); continue; } /* make sure value is the right type, bail if not acceptable */ if ((regtype != REG_SZ) || (reglen > sizeof(regval))) { RegCloseKey (reghnd); continue; } /* registry value seems OK, finish up and replace description */ RegCloseKey (reghnd ); sprintf (list[i].desc, "%s", regval); } } /* for */ #endif return used; } static int _eth_devices(int max, ETH_LIST* list) { int used = 0; char errbuf[PCAP_ERRBUF_SIZE] = ""; #ifndef DONT_USE_PCAP_FINDALLDEVS pcap_if_t* alldevs; pcap_if_t* dev; memset(list, 0, max*sizeof(*list)); errbuf[0] = '\0'; /* retrieve the device list */ if (pcap_findalldevs(&alldevs, errbuf) == -1) { if (errbuf[0]) sim_printf ("Eth: %s\n", errbuf); } else { /* copy device list into the passed structure */ for (used=0, dev=alldevs; dev && (used < max); dev=dev->next, ++used) { if ((dev->flags & PCAP_IF_LOOPBACK) || (!strcmp("any", dev->name))) continue; strlcpy(list[used].name, dev->name, sizeof(list[used].name)); if (dev->description) strlcpy(list[used].desc, dev->description, sizeof(list[used].desc)); else strlcpy(list[used].desc, "No description available", sizeof(list[used].desc)); } /* free device list */ pcap_freealldevs(alldevs); } #endif /* Add any host specific devices and/or validate those already found */ used = eth_host_pcap_devices(used, max, list); /* If no devices were found and an error message was left in the buffer, display it */ if ((used == 0) && (errbuf[0])) { sim_printf ("Eth: pcap_findalldevs warning: %s\n", errbuf); } #ifdef HAVE_TAP_NETWORK if (used < max) { #if defined(__OpenBSD__) sprintf(list[used].name, "%s", "tap:tunN"); #else sprintf(list[used].name, "%s", "tap:tapN"); #endif sprintf(list[used].desc, "%s", "Integrated Tun/Tap support"); list[used].eth_api = ETH_API_TAP; ++used; } #endif #ifdef HAVE_VDE_NETWORK if (used < max) { sprintf(list[used].name, "%s", "vde:device{:switch-port-number}"); sprintf(list[used].desc, "%s", "Integrated VDE support"); list[used].eth_api = ETH_API_VDE; ++used; } #endif #ifdef HAVE_SLIRP_NETWORK if (used < max) { sprintf(list[used].name, "%s", "nat:{optional-nat-parameters}"); sprintf(list[used].desc, "%s", "Integrated NAT (SLiRP) support"); list[used].eth_api = ETH_API_NAT; ++used; } #endif if (used < max) { sprintf(list[used].name, "%s", "udp:sourceport:remotehost:remoteport"); sprintf(list[used].desc, "%s", "Integrated UDP bridge support"); list[used].eth_api = ETH_API_UDP; ++used; } /* return device count */ return used; } #ifdef HAVE_TAP_NETWORK #if defined(__linux) || defined(__linux__) #include <sys/ioctl.h> #include <net/if.h> #include <linux/if_tun.h> #elif defined(HAVE_BSDTUNTAP) |
︙ | ︙ | |||
1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 | /* Dynamic DLL load variables */ #ifdef _WIN32 static HINSTANCE hLib = NULL; /* handle to DLL */ #else static void *hLib = 0; /* handle to Library */ #endif static int lib_loaded = 0; /* 0=not loaded, 1=loaded, 2=library load failed, 3=Func load failed */ static const char* lib_name = #if defined(_WIN32) || defined(__CYGWIN__) "wpcap.dll"; #elif defined(__APPLE__) "/usr/lib/libpcap.A.dylib"; #else | > > > < < | > | > > | > > | 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 | /* Dynamic DLL load variables */ #ifdef _WIN32 static HINSTANCE hLib = NULL; /* handle to DLL */ #else static void *hLib = 0; /* handle to Library */ #endif static int lib_loaded = 0; /* 0=not loaded, 1=loaded, 2=library load failed, 3=Func load failed */ #define __STR_QUOTE(tok) #tok #define __STR(tok) __STR_QUOTE(tok) static const char* lib_name = #if defined(_WIN32) || defined(__CYGWIN__) "wpcap.dll"; #elif defined(__APPLE__) "/usr/lib/libpcap.A.dylib"; #else "libpcap." __STR(HAVE_DLOPEN); #endif static char no_pcap[PCAP_ERRBUF_SIZE] = #if defined(_WIN32) || defined(__CYGWIN__) "wpcap.dll failed to load, install Npcap or WinPcap 4.1.3 to use pcap networking"; #elif defined(__APPLE__) "/usr/lib/libpcap.A.dylib failed to load, install libpcap to use pcap networking"; #else "libpcap." __STR(HAVE_DLOPEN) " failed to load, install libpcap to use pcap networking"; #endif #undef __STR #undef __STR_QUOTE /* define pointers to pcap functions needed */ static void (*p_pcap_close) (pcap_t *); static int (*p_pcap_compile) (pcap_t *, struct bpf_program *, const char *, int, bpf_u_int32); static int (*p_pcap_datalink) (pcap_t *); static int (*p_pcap_dispatch) (pcap_t *, int, pcap_handler, u_char *); static int (*p_pcap_findalldevs) (pcap_if_t **, char *); |
︙ | ︙ | |||
1147 1148 1149 1150 1151 1152 1153 | hLib = LoadLibraryA(lib_name); } #else hLib = dlopen(lib_name, RTLD_NOW); #endif if (hLib == 0) { /* failed to load DLL */ | < < < < < < | 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 | hLib = LoadLibraryA(lib_name); } #else hLib = dlopen(lib_name, RTLD_NOW); #endif if (hLib == 0) { /* failed to load DLL */ lib_loaded = 2; break; } else { /* library loaded OK */ lib_loaded = 1; } |
︙ | ︙ | |||
1184 1185 1186 1187 1188 1189 1190 | #endif load_function("pcap_fileno", (_func *) &p_pcap_fileno); #endif load_function("pcap_sendpacket", (_func *) &p_pcap_sendpacket); load_function("pcap_setfilter", (_func *) &p_pcap_setfilter); load_function("pcap_setnonblock", (_func *) &p_pcap_setnonblock); load_function("pcap_lib_version", (_func *) &p_pcap_lib_version); | < < < < < | | > > > > > > > > > > > > > > > > > | | | > | | | | 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 | #endif load_function("pcap_fileno", (_func *) &p_pcap_fileno); #endif load_function("pcap_sendpacket", (_func *) &p_pcap_sendpacket); load_function("pcap_setfilter", (_func *) &p_pcap_setfilter); load_function("pcap_setnonblock", (_func *) &p_pcap_setnonblock); load_function("pcap_lib_version", (_func *) &p_pcap_lib_version); break; default: /* loaded or failed */ break; } return (lib_loaded == 1) ? 1 : 0; } /* define functions with dynamic revectoring */ void pcap_close(pcap_t* a) { if (load_pcap() != 0) { p_pcap_close(a); } } /* Some platforms's pcap.h have an ancient declaration of pcap_compile which doesn't have a const in the bpf string argument */ #if !defined (BPF_CONST_STRING) int pcap_compile(pcap_t* a, struct bpf_program* b, char* c, int d, bpf_u_int32 e) { #else int pcap_compile(pcap_t* a, struct bpf_program* b, const char* c, int d, bpf_u_int32 e) { #endif if (load_pcap() != 0) { return p_pcap_compile(a, b, c, d, e); } else { return 0; } } const char *pcap_lib_version(void) { static char buf[256]; if ((load_pcap() != 0) && (p_pcap_lib_version != NULL)) { return p_pcap_lib_version(); } else { sprintf (buf, "%s not installed", #if defined(_WIN32) "npcap or winpcap" #else "libpcap" #endif ); return buf; } } int pcap_datalink(pcap_t* a) { if (load_pcap() != 0) { return p_pcap_datalink(a); } else { return 0; } } int pcap_dispatch(pcap_t* a, int b, pcap_handler c, u_char* d) { if (load_pcap() != 0) { return p_pcap_dispatch(a, b, c, d); } else { return 0; } } int pcap_findalldevs(pcap_if_t** a, char* b) { if (load_pcap() != 0) { return p_pcap_findalldevs(a, b); } else { *a = 0; strcpy(b, no_pcap); no_pcap[0] = '\0'; return -1; } } void pcap_freealldevs(pcap_if_t* a) { if (load_pcap() != 0) { p_pcap_freealldevs(a); } } void pcap_freecode(struct bpf_program* a) { if (load_pcap() != 0) { p_pcap_freecode(a); } } char* pcap_geterr(pcap_t* a) { if (load_pcap() != 0) { return p_pcap_geterr(a); } else { return (char*) ""; } } int pcap_lookupnet(const char* a, bpf_u_int32* b, bpf_u_int32* c, char* d) { |
︙ | ︙ | |||
1280 1281 1282 1283 1284 1285 1286 | } else { return (pcap_t*) 0; } } #ifdef _WIN32 int pcap_setmintocopy(pcap_t* a, int b) { | | | | | | | | | 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 | } else { return (pcap_t*) 0; } } #ifdef _WIN32 int pcap_setmintocopy(pcap_t* a, int b) { if (load_pcap() != 0) { return p_pcap_setmintocopy(a, b); } else { return -1; } } HANDLE pcap_getevent(pcap_t* a) { if (load_pcap() != 0) { return p_pcap_getevent(a); } else { return (HANDLE) 0; } } #else #ifdef MUST_DO_SELECT int pcap_get_selectable_fd(pcap_t* a) { if (load_pcap() != 0) { return p_pcap_get_selectable_fd(a); } else { return 0; } } #endif int pcap_fileno(pcap_t * a) { if (load_pcap() != 0) { return p_pcap_fileno(a); } else { return 0; } } #endif int pcap_sendpacket(pcap_t* a, const u_char* b, int c) { if (load_pcap() != 0) { return p_pcap_sendpacket(a, b, c); } else { return 0; } } int pcap_setfilter(pcap_t* a, struct bpf_program* b) { if (load_pcap() != 0) { return p_pcap_setfilter(a, b); } else { return 0; } } int pcap_setnonblock(pcap_t* a, int nonblock, char *errbuf) { if (load_pcap() != 0) { return p_pcap_setnonblock(a, nonblock, errbuf); } else { return 0; } } #endif /* defined(USE_SHARED) && (defined(_WIN32) || defined(HAVE_DLOPEN)) */ |
︙ | ︙ | |||
1375 1376 1377 1378 1379 1380 1381 | ///< for a complete list of valid codes. uint32 Length; ///< Length of the data field uint8 Data[1]; ///< variable-lenght field that contains the information passed to or received ///< from the adapter. }; typedef struct _PACKET_OID_DATA PACKET_OID_DATA, *PPACKET_OID_DATA; typedef void **LPADAPTER; | | | 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 | ///< for a complete list of valid codes. uint32 Length; ///< Length of the data field uint8 Data[1]; ///< variable-lenght field that contains the information passed to or received ///< from the adapter. }; typedef struct _PACKET_OID_DATA PACKET_OID_DATA, *PPACKET_OID_DATA; typedef void **LPADAPTER; #define OID_802_3_CURRENT_ADDRESS 0x01010102 /* Extracted from ntddndis.h */ static int pcap_mac_if_win32(const char *AdapterName, unsigned char MACAddress[6]) { LPADAPTER lpAdapter; PPACKET_OID_DATA OidData; int Status; int ReturnValue; |
︙ | ︙ | |||
1563 1564 1565 1566 1567 1568 1569 | dev->have_host_nic_phy_addr = 1; #elif !defined(__CYGWIN__) && !defined(__VMS) if (1) { char command[1024]; FILE *f; int i; const char *patterns[] = { | > > | | > > | | | < | | 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 | dev->have_host_nic_phy_addr = 1; #elif !defined(__CYGWIN__) && !defined(__VMS) if (1) { char command[1024]; FILE *f; int i; const char *patterns[] = { "ip link show %.*s | grep [0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]", "ip link show %.*s | egrep [0-9a-fA-F]?[0-9a-fA-F]:[0-9a-fA-F]?[0-9a-fA-F]:[0-9a-fA-F]?[0-9a-fA-F]:[0-9a-fA-F]?[0-9a-fA-F]:[0-9a-fA-F]?[0-9a-fA-F]:[0-9a-fA-F]?[0-9a-fA-F]", "ifconfig %.*s | grep [0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]", "ifconfig %.*s | egrep [0-9a-fA-F]?[0-9a-fA-F]:[0-9a-fA-F]?[0-9a-fA-F]:[0-9a-fA-F]?[0-9a-fA-F]:[0-9a-fA-F]?[0-9a-fA-F]:[0-9a-fA-F]?[0-9a-fA-F]:[0-9a-fA-F]?[0-9a-fA-F]", NULL}; memset(command, 0, sizeof(command)); /* try to force an otherwise unused interface to be turned on */ snprintf(command, sizeof(command)-1, "ip link set dev %.*s up", (int)(sizeof(command) - 21), devname); if (system(command)) {}; snprintf(command, sizeof(command)-1, "ifconfig %.*s up", (int)(sizeof(command) - 14), devname); if (system(command)) {}; for (i=0; patterns[i] && (0 == dev->have_host_nic_phy_addr); ++i) { snprintf(command, sizeof(command)-1, patterns[i], (int)(sizeof(command) - (2 + strlen(patterns[i]))), devname); if (NULL != (f = popen(command, "r"))) { while (0 == dev->have_host_nic_phy_addr) { if (fgets(command, sizeof(command)-1, f)) { char *p1, *p2; p1 = strchr(command, ':'); while (p1) { p2 = strchr(p1+1, ':'); |
︙ | ︙ | |||
1601 1602 1603 1604 1605 1606 1607 | } p1 = p2; } } else break; } | | < | 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 | } p1 = p2; } } else break; } pclose(f); } } } #endif } #if defined(__APPLE__) |
︙ | ︙ | |||
1639 1640 1641 1642 1643 1644 1645 | memset (buf, 0, buf_size); #ifndef KEY_WOW64_64KEY #define KEY_WOW64_64KEY (0x0100) #endif if ((status = RegOpenKeyExA (HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_QUERY_VALUE|KEY_WOW64_64KEY, ®hnd)) != ERROR_SUCCESS) return -1; | > > | | > > > | < | > | > | | > > < > > | 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 | memset (buf, 0, buf_size); #ifndef KEY_WOW64_64KEY #define KEY_WOW64_64KEY (0x0100) #endif if ((status = RegOpenKeyExA (HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_QUERY_VALUE|KEY_WOW64_64KEY, ®hnd)) != ERROR_SUCCESS) return -1; if (buf_size < 37) return -1; reglen = buf_size - 1; if ((status = RegQueryValueExA (reghnd, "MachineGuid", NULL, ®type, (LPBYTE)buf, ®len)) != ERROR_SUCCESS) { RegCloseKey (reghnd); return -1; } RegCloseKey (reghnd ); /* make sure value is the right type, bail if not acceptable */ if ((regtype != REG_SZ) || (reglen > buf_size)) return -1; /* registry value seems OK */ return 0; } #else static int _eth_get_system_id (char *buf, size_t buf_size) { FILE *f; t_bool popened = FALSE; memset (buf, 0, buf_size); if (buf_size < 37) return -1; if ((f = fopen ("/etc/machine-id", "r")) == NULL) { f = popen ("hostname", "r"); popened = TRUE; } if (f) { size_t read_size; read_size = fread (buf, 1, buf_size - 1, f); buf[read_size] = '\0'; if (popened) pclose (f); else fclose (f); } while ((strlen (buf) > 0) && sim_isspace(buf[strlen (buf) - 1])) buf[strlen (buf) - 1] = '\0'; return 0; } #endif |
︙ | ︙ | |||
1887 1888 1889 1890 1891 1892 1893 | return NULL; } static void * _eth_writer(void *arg) { ETH_DEV* volatile dev = (ETH_DEV*)arg; | | > > > > > > > > > | > | 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 | return NULL; } static void * _eth_writer(void *arg) { ETH_DEV* volatile dev = (ETH_DEV*)arg; ETH_WRITE_REQUEST *request = NULL; /* Boost Priority for this I/O thread vs the CPU instruction execution thread which in general won't be readily yielding the processor when this thread needs to run */ sim_os_set_thread_priority (PRIORITY_ABOVE_NORMAL); sim_debug(dev->dbit, dev->dptr, "Writer Thread Starting\n"); pthread_mutex_lock (&dev->writer_lock); while (dev->handle) { pthread_cond_wait (&dev->writer_cond, &dev->writer_lock); while (NULL != (request = dev->write_requests)) { if (dev->handle == NULL) /* Shutting down? */ break; /* Pull buffer off request list */ dev->write_requests = request->next; pthread_mutex_unlock (&dev->writer_lock); if (dev->throttle_delay != ETH_THROT_DISABLED_DELAY) { uint32 packet_delta_time = sim_os_msec() - dev->throttle_packet_time; dev->throttle_events <<= 1; dev->throttle_events += (packet_delta_time < dev->throttle_time) ? 1 : 0; if ((dev->throttle_events & dev->throttle_mask) == dev->throttle_mask) { sim_os_ms_sleep (dev->throttle_delay); ++dev->throttle_count; } dev->throttle_packet_time = sim_os_msec(); } dev->write_status = _eth_write(dev, &request->packet, NULL); pthread_mutex_lock (&dev->writer_lock); /* Put buffer on free buffer list */ request->next = dev->write_buffers; dev->write_buffers = request; request = NULL; } } /* If we exited these loops with a request allocated, */ /* avoid buffer leaking by putting it on free buffer list */ if (request) { request->next = dev->write_buffers; dev->write_buffers = request; } pthread_mutex_unlock (&dev->writer_lock); sim_debug(dev->dbit, dev->dptr, "Writer Thread Exiting\n"); return NULL; } #endif t_stat eth_set_async (ETH_DEV *dev, int latency) { #if !defined(USE_READER_THREAD) || !defined(SIM_ASYNCH_IO) char *msg = "Eth: Can't operate asynchronously, must poll.\n" " *** Build with USE_READER_THREAD defined and link with pthreads for asynchronous operation. ***\n"; return sim_messagef (SCPE_NOFNC, "%s", msg); #else int wakeup_needed; dev->asynch_io = 1; dev->asynch_io_latency = latency; pthread_mutex_lock (&dev->lock); |
︙ | ︙ | |||
2004 2005 2006 2007 2008 2009 2010 | #endif #if (defined(__linux) || defined(__linux__)) && defined(HAVE_TAP_NETWORK) if ((tun = open("/dev/net/tun", O_RDWR)) >= 0) { struct ifreq ifr; /* Interface Requests */ memset(&ifr, 0, sizeof(ifr)); /* Set up interface flags */ | | > | > > > > > | | | > > > > > | > | 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 | #endif #if (defined(__linux) || defined(__linux__)) && defined(HAVE_TAP_NETWORK) if ((tun = open("/dev/net/tun", O_RDWR)) >= 0) { struct ifreq ifr; /* Interface Requests */ memset(&ifr, 0, sizeof(ifr)); /* Set up interface flags */ strlcpy(ifr.ifr_name, devname, sizeof(ifr.ifr_name)); ifr.ifr_flags = IFF_TAP|IFF_NO_PI; /* Send interface requests to TUN/TAP driver. */ if (ioctl(tun, TUNSETIFF, &ifr) >= 0) { if (ioctl(tun, FIONBIO, &on)) { strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE); close(tun); tun = -1; } else { *fd_handle = (SOCKET)tun; strcpy(savname, ifr.ifr_name); } } else strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE); } else strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE); if ((tun >= 0) && (errbuf[0] != 0)) { close(tun); tun = -1; } #elif defined(HAVE_BSDTUNTAP) && defined(HAVE_TAP_NETWORK) if (1) { char dev_name[64] = ""; snprintf(dev_name, sizeof(dev_name)-1, "/dev/%s", devname); dev_name[sizeof(dev_name)-1] = '\0'; if ((tun = open(dev_name, O_RDWR)) >= 0) { if (ioctl(tun, FIONBIO, &on)) { strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE); close(tun); tun = -1; } else { *fd_handle = (SOCKET)tun; memmove(savname, devname, strlen(devname) + 1); } #if defined (__APPLE__) if (tun >= 0) { /* Good so far? */ struct ifreq ifr; int s; /* Now make sure the interface is up */ memset (&ifr, 0, sizeof(ifr)); ifr.ifr_addr.sa_family = AF_INET; strlcpy(ifr.ifr_name, savname, sizeof(ifr.ifr_name)); if ((s = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) { if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) >= 0) { ifr.ifr_flags |= IFF_UP; if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr)) { strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE); close(tun); tun = -1; } } close(s); } } #endif } else strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE); if ((tun >= 0) && (errbuf[0] != 0)) { close(tun); tun = -1; } } #else strlcpy(errbuf, "No support for tap: devices", PCAP_ERRBUF_SIZE); #endif /* !defined(__linux) && !defined(HAVE_BSDTUNTAP) */ if (0 == errbuf[0]) { *eth_api = ETH_API_TAP; *handle = (void *)1; /* Flag used to indicated open */ } |
︙ | ︙ | |||
2100 2101 2102 2103 2104 2105 2106 | return sim_messagef (SCPE_OPENERR, "Eth: Invalid vde port number: %s in %s\n", vdeport_s, savname); } if (!(*handle = (void*) vde_open((char *)vdeswitch_s, (char *)"simh", &voa))) strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE); else { *eth_api = ETH_API_VDE; | | | | 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 | return sim_messagef (SCPE_OPENERR, "Eth: Invalid vde port number: %s in %s\n", vdeport_s, savname); } if (!(*handle = (void*) vde_open((char *)vdeswitch_s, (char *)"simh", &voa))) strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE); else { *eth_api = ETH_API_VDE; *fd_handle = (SOCKET)vde_datafd((VDECONN*)(*handle)); } #else strlcpy(errbuf, "No support for vde: network devices", PCAP_ERRBUF_SIZE); #endif /* defined(HAVE_VDE_NETWORK) */ } else { /* !vde: */ if (0 == strncmp("nat:", savname, 4)) { #if defined(HAVE_SLIRP_NETWORK) const char *devname = savname + 4; while (isspace(*devname)) ++devname; if (!(*handle = (void*) sim_slirp_open(devname, opaque, &_slirp_callback, dptr, dbit, errbuf, PCAP_ERRBUF_SIZE))) strlcpy(errbuf, strerror(errno), PCAP_ERRBUF_SIZE); else { *eth_api = ETH_API_NAT; *fd_handle = 0; } #else strlcpy(errbuf, "No support for nat: network devices", PCAP_ERRBUF_SIZE); |
︙ | ︙ | |||
2160 2161 2162 2163 2164 2165 2166 | if (!*handle) { /* can't open device */ if (strstr (errbuf, "That device is not up")) { char command[1024]; /* try to force an otherwise unused interface to be turned on */ memset(command, 0, sizeof(command)); snprintf(command, sizeof(command)-1, "ifconfig %s up", savname); | | | 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 | if (!*handle) { /* can't open device */ if (strstr (errbuf, "That device is not up")) { char command[1024]; /* try to force an otherwise unused interface to be turned on */ memset(command, 0, sizeof(command)); snprintf(command, sizeof(command)-1, "ifconfig %s up", savname); if (system(command)) {}; errbuf[0] = '\0'; *handle = (void*) pcap_open_live(savname, bufsz, ETH_PROMISC, PCAP_READ_TIMEOUT, errbuf); } } #endif if (!*handle) /* can't open device */ return sim_messagef (SCPE_OPENERR, "Eth: pcap_open_live error - %s\n", errbuf); |
︙ | ︙ | |||
2273 2274 2275 2276 2277 2278 2279 | if ((strlen(name) == 4) && (tolower(name[0]) == 'e') && (tolower(name[1]) == 't') && (tolower(name[2]) == 'h') && isdigit(name[3]) ) { num = atoi(&name[3]); | | | 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 | if ((strlen(name) == 4) && (tolower(name[0]) == 'e') && (tolower(name[1]) == 't') && (tolower(name[2]) == 'h') && isdigit(name[3]) ) { num = atoi(&name[3]); savname = _eth_getname(num, temp, desc); if (savname == NULL) /* didn't translate */ return SCPE_OPENERR; } else { /* are they trying to use device description? */ savname = eth_getname_bydesc(name, temp, desc); if (savname == NULL) { /* didn't translate */ |
︙ | ︙ | |||
2347 2348 2349 2350 2351 2352 2353 | #endif /* defined(__hpux) */ pthread_create (&dev->reader_thread, &attr, _eth_reader, (void *)dev); pthread_create (&dev->writer_thread, &attr, _eth_writer, (void *)dev); pthread_attr_destroy(&attr); } #endif /* defined (USE_READER_THREAD */ _eth_add_to_open_list (dev); | > > > > > | | 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 | #endif /* defined(__hpux) */ pthread_create (&dev->reader_thread, &attr, _eth_reader, (void *)dev); pthread_create (&dev->writer_thread, &attr, _eth_writer, (void *)dev); pthread_attr_destroy(&attr); } #endif /* defined (USE_READER_THREAD */ _eth_add_to_open_list (dev); /* * install a total filter on a newly opened interface and let the device * simulator install an appropriate filter that reflects the device's * configuration. */ return eth_filter_hash (dev, 0, NULL, FALSE, FALSE, NULL); } static t_stat _eth_close_port(int eth_api, pcap_t *pcap, SOCKET pcap_fd) { switch (eth_api) { #ifdef HAVE_PCAP_NETWORK case ETH_API_PCAP: |
︙ | ︙ | |||
2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 | /* clean up the mess */ free(dev->name); free(dev->bpf_filter); eth_zero(dev); _eth_remove_from_open_list (dev); return SCPE_OK; } t_stat eth_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { fprintf (st, "%s attach help\n\n", dptr->name); fprintf (st, " sim> SHOW ETHERNET\n"); fprintf (st, " libpcap version 1.0.0\n"); fprintf (st, " ETH devices:\n"); | > > > > > > > > > > > > > > > > > > > > > > > > | 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 | /* clean up the mess */ free(dev->name); free(dev->bpf_filter); eth_zero(dev); _eth_remove_from_open_list (dev); return SCPE_OK; } const char *eth_version (void) { #if defined(HAVE_PCAP_NETWORK) static char version[300]; if (!version[0]) { strlcpy(version, pcap_lib_version(), sizeof(version)); if (memcmp(pcap_lib_version(), "Npcap", 5) == 0) { char maj_min[CBUFSIZE]; char *c = version; while (*c && !isdigit (*c)) ++c; get_glyph (c, maj_min, ','); if (strcmp ("0.9990", maj_min) < 0) snprintf(version, sizeof(version), "Unsupported - %s", pcap_lib_version()); } } return version; #else return NULL; #endif } t_stat eth_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { fprintf (st, "%s attach help\n\n", dptr->name); fprintf (st, " sim> SHOW ETHERNET\n"); fprintf (st, " libpcap version 1.0.0\n"); fprintf (st, " ETH devices:\n"); |
︙ | ︙ | |||
3035 3036 3037 3038 3039 3040 3041 3042 3043 | /* Do a little shuffling */ cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >> 16); /* Return the bitwise complement of the resulting mishmash */ return (uint16)(~cksum); } static uint16 | > > > > | > > | > | 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 | /* Do a little shuffling */ cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >> 16); /* Return the bitwise complement of the resulting mishmash */ return (uint16)(~cksum); } /* * src_addr and dest_addr are presented in network byte order */ static uint16 pseudo_checksum(uint16 len, uint16 proto, void *nsrc_addr, void *ndest_addr, uint8 *buff) { uint32 sum; uint16 *src_addr = (uint16 *)nsrc_addr; uint16 *dest_addr = (uint16 *)ndest_addr; /* Sum the data first */ sum = 0xffff&(~ip_checksum((uint16 *)buff, len)); /* add the pseudo header which contains the IP source and destination addresses already in network byte order */ sum += src_addr[0]; sum += src_addr[1]; sum += dest_addr[0]; sum += dest_addr[1]; /* and the protocol number and the length of the UDP packet */ sum = sum + htons(proto) + htons(len); |
︙ | ︙ | |||
3105 3106 3107 3108 3109 3110 3111 | ++dev->jumbo_dropped; /* Bogus UDP packet length (packet contained length exceeds packet size) frames are dropped */ return; } if (UDP->checksum == 0) break; /* UDP Checksums are disabled */ orig_checksum = UDP->checksum; UDP->checksum = 0; | | | 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 | ++dev->jumbo_dropped; /* Bogus UDP packet length (packet contained length exceeds packet size) frames are dropped */ return; } if (UDP->checksum == 0) break; /* UDP Checksums are disabled */ orig_checksum = UDP->checksum; UDP->checksum = 0; UDP->checksum = pseudo_checksum(ntohs(UDP->length), IPPROTO_UDP, &IP->source_ip, &IP->dest_ip, (uint8 *)UDP); if (orig_checksum != UDP->checksum) eth_packet_trace (dev, msg, len, "reading jumbo UDP header Checksum Fixed"); break; case IPPROTO_ICMP: ICMP = (struct ICMPHeader *)(((char *)IP)+IP_HLEN(IP)); orig_checksum = ICMP->checksum; ICMP->checksum = 0; |
︙ | ︙ | |||
3214 3215 3216 3217 3218 3219 3220 | else { TCP->data_offset_and_flags = htons(orig_tcp_flags); IP->total_len = htons(payload_len + IP_HLEN(IP) + TCP_DATA_OFFSET(TCP)); } IP->checksum = 0; IP->checksum = ip_checksum((uint16 *)IP, IP_HLEN(IP)); TCP->checksum = 0; | | | 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 | else { TCP->data_offset_and_flags = htons(orig_tcp_flags); IP->total_len = htons(payload_len + IP_HLEN(IP) + TCP_DATA_OFFSET(TCP)); } IP->checksum = 0; IP->checksum = ip_checksum((uint16 *)IP, IP_HLEN(IP)); TCP->checksum = 0; TCP->checksum = pseudo_checksum(ntohs(IP->total_len)-IP_HLEN(IP), IPPROTO_TCP, &IP->source_ip, &IP->dest_ip, (uint8 *)TCP); header.caplen = header.len = 14 + ntohs(IP->total_len); eth_packet_trace_ex (dev, ((u_char *)IP)-14, header.len, "reading TCP segment", 1, dev->dbit); #if ETH_MIN_JUMBO_FRAME < ETH_MAX_PACKET if (1) { /* Debugging is easier if we read packets directly with pcap (i.e. we can use Wireshark to verify packet contents) we don't want to do this all the time for 2 reasons: |
︙ | ︙ | |||
3286 3287 3288 3289 3290 3291 3292 | UDP = (struct UDPHeader *)(((char *)IP)+IP_HLEN(IP)); if (ntohs(UDP->length) > (len-IP_HLEN(IP))) return; /* packet contained length exceeds packet size */ if (UDP->checksum == 0) return; /* UDP Checksums are disabled */ orig_checksum = UDP->checksum; UDP->checksum = 0; | | | | 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 | UDP = (struct UDPHeader *)(((char *)IP)+IP_HLEN(IP)); if (ntohs(UDP->length) > (len-IP_HLEN(IP))) return; /* packet contained length exceeds packet size */ if (UDP->checksum == 0) return; /* UDP Checksums are disabled */ orig_checksum = UDP->checksum; UDP->checksum = 0; UDP->checksum = pseudo_checksum(ntohs(UDP->length), IPPROTO_UDP, &IP->source_ip, &IP->dest_ip, (uint8 *)UDP); if (orig_checksum != UDP->checksum) eth_packet_trace (dev, msg, len, "reading UDP header Checksum Fixed"); break; case IPPROTO_TCP: TCP = (struct TCPHeader *)(((char *)IP)+IP_HLEN(IP)); orig_checksum = TCP->checksum; TCP->checksum = 0; TCP->checksum = pseudo_checksum(ntohs(IP->total_len)-IP_HLEN(IP), IPPROTO_TCP, &IP->source_ip, &IP->dest_ip, (uint8 *)TCP); if (orig_checksum != TCP->checksum) eth_packet_trace (dev, msg, len, "reading TCP header Checksum Fixed"); break; case IPPROTO_ICMP: ICMP = (struct ICMPHeader *)(((char *)IP)+IP_HLEN(IP)); orig_checksum = ICMP->checksum; ICMP->checksum = 0; |
︙ | ︙ | |||
3361 3362 3363 3364 3365 3366 3367 | offset += 8 - 16; /* Account for the Ethernet Header and Offset value in this number */ response.msg[14] = offset & 0xFF; response.msg[15] = (offset >> 8) & 0xFF; /* send response packet */ eth_write(dev, &response, NULL); | | | 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 | offset += 8 - 16; /* Account for the Ethernet Header and Offset value in this number */ response.msg[14] = offset & 0xFF; response.msg[15] = (offset >> 8) & 0xFF; /* send response packet */ eth_write(dev, &response, NULL); eth_packet_trace(dev, response.msg, response.len, "loopbackforward"); ++dev->loopback_packets_processed; return 1; } static void |
︙ | ︙ | |||
3767 3768 3769 3770 3771 3772 3773 | /* make sure device exists */ if (!dev) return SCPE_UNATT; /* filter count OK? */ if ((addr_count < 0) || (addr_count > ETH_FILTER_MAX)) return SCPE_ARG; else | > | | | 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 | /* make sure device exists */ if (!dev) return SCPE_UNATT; /* filter count OK? */ if ((addr_count < 0) || (addr_count > ETH_FILTER_MAX)) return SCPE_ARG; else if (!addresses && (addr_count != 0)) return SCPE_ARG; /* test reflections. This is done early in this routine since eth_reflect */ /* calls eth_filter recursively and thus changes the state of the device. */ if (dev->reflections == -1) status = eth_reflect(dev); /* set new filter addresses */ for (i = 0; i < addr_count; i++) memcpy(dev->filter_address[i], addresses[i], sizeof(ETH_MAC)); dev->addr_count = addr_count; /* store other flags */ |
︙ | ︙ | |||
3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 | if (dev->all_multicast) { sim_debug(dev->dbit, dev->dptr, "All Multicast\n"); } if (dev->promiscuous) { sim_debug(dev->dbit, dev->dptr, "Promiscuous\n"); } } /* Set the desired physical address */ memset(dev->physical_addr, 0, sizeof(ETH_MAC)); dev->loopback_self_sent = 0; /* Find desired physical address in filters */ for (i = 0; i < addr_count; i++) { if (dev->filter_address[i][0]&1) continue; /* skip all multicast addresses */ eth_mac_fmt(&dev->filter_address[i], mac); if (strcmp(mac, "00:00:00:00:00:00") != 0) { memcpy(dev->physical_addr, &dev->filter_address[i], sizeof(ETH_MAC)); break; } } /* setup BPF filters and other fields to minimize packet delivery */ eth_bpf_filter (dev, dev->addr_count, dev->filter_address, dev->all_multicast, dev->promiscuous, dev->reflections, &dev->physical_addr, dev->have_host_nic_phy_addr ? &dev->host_nic_phy_hw_addr: NULL, | > > > > > > | | 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 | if (dev->all_multicast) { sim_debug(dev->dbit, dev->dptr, "All Multicast\n"); } if (dev->promiscuous) { sim_debug(dev->dbit, dev->dptr, "Promiscuous\n"); } } #ifdef USE_READER_THREAD pthread_mutex_lock (&dev->self_lock); #endif /* Set the desired physical address */ memset(dev->physical_addr, 0, sizeof(ETH_MAC)); dev->loopback_self_sent = 0; /* Find desired physical address in filters */ for (i = 0; i < addr_count; i++) { if (dev->filter_address[i][0]&1) continue; /* skip all multicast addresses */ eth_mac_fmt(&dev->filter_address[i], mac); if (strcmp(mac, "00:00:00:00:00:00") != 0) { memcpy(dev->physical_addr, &dev->filter_address[i], sizeof(ETH_MAC)); break; } } #ifdef USE_READER_THREAD pthread_mutex_unlock (&dev->self_lock); #endif /* setup BPF filters and other fields to minimize packet delivery */ eth_bpf_filter (dev, dev->addr_count, dev->filter_address, dev->all_multicast, dev->promiscuous, dev->reflections, &dev->physical_addr, dev->have_host_nic_phy_addr ? &dev->host_nic_phy_hw_addr: NULL, (dev->hash_filter ? &dev->hash : NULL), buf); /* get netmask, which is a required argument for compiling. The value, in our case isn't actually interesting since the filters we generate aren't referencing IP fields, networks or values */ #ifdef USE_BPF if (dev->eth_api == ETH_API_PCAP) { |
︙ | ︙ | |||
3895 3896 3897 3898 3899 3900 3901 | #endif } #endif /* USE_BPF */ return SCPE_OK; } | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 | #endif } #endif /* USE_BPF */ return SCPE_OK; } void eth_show_dev (FILE *st, ETH_DEV* dev) { fprintf(st, "Ethernet Device:\n"); if (!dev) { fprintf(st, "-- Not Attached\n"); return; } |
︙ | ︙ | |||
4185 4186 4187 4188 4189 4190 4191 | char mac[20]; ETH_MAC filter_address[3] = { {0x04, 0x05, 0x06, 0x07, 0x08, 0x09}, {0x09, 0x00, 0x2B, 0x02, 0x01, 0x07}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, }; int addr_count; | < | 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 | char mac[20]; ETH_MAC filter_address[3] = { {0x04, 0x05, 0x06, 0x07, 0x08, 0x09}, {0x09, 0x00, 0x2B, 0x02, 0x01, 0x07}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, }; int addr_count; ETH_MAC host_nic_phy_hw_addr = {0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; ETH_MAC *host_phy_addr_list[2] = {&host_nic_phy_hw_addr, NULL}; int host_phy_addr_listindex; ETH_MULTIHASH hash = {0x01, 0x40, 0x00, 0x00, 0x48, 0x88, 0x40, 0x00}; ETH_MULTIHASH *hash_list[2] = {&hash, NULL}; int hash_listindex; int bpf_count = 0; |
︙ | ︙ | |||
4221 4222 4223 4224 4225 4226 4227 | eth_mac_fmt(host_phy_addr_list[host_phy_addr_listindex], mac);\ sim_printf ("Eth: host_nic_phy_hw_addr: %s\n", mac); \ } \ } memset (ð_tst, 0, sizeof(eth_tst)); | | | 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 | eth_mac_fmt(host_phy_addr_list[host_phy_addr_listindex], mac);\ sim_printf ("Eth: host_nic_phy_hw_addr: %s\n", mac); \ } \ } memset (ð_tst, 0, sizeof(eth_tst)); eth_device_count = _eth_devices(ETH_MAX_DEVICE, eth_list); eth_opened = 0; for (eth_num=0; eth_num<eth_device_count; eth_num++) { char eth_name[32]; if ((0 == memcmp (eth_list[eth_num].name, "nat:", 4)) || (0 == memcmp (eth_list[eth_num].name, "tap:", 4)) || (0 == memcmp (eth_list[eth_num].name, "vde:", 4)) || |
︙ | ︙ |
︙ | ︙ | |||
345 346 347 348 349 350 351 | t_stat eth_filter_hash (ETH_DEV* dev, int addr_count, /* set filter on incoming packets with AUTODIN II based hash */ ETH_MAC* const addresses, ETH_BOOL all_multicast, ETH_BOOL promiscuous, ETH_MULTIHASH* const hash); t_stat eth_check_address_conflict (ETH_DEV* dev, ETH_MAC* const address); | | | 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 | t_stat eth_filter_hash (ETH_DEV* dev, int addr_count, /* set filter on incoming packets with AUTODIN II based hash */ ETH_MAC* const addresses, ETH_BOOL all_multicast, ETH_BOOL promiscuous, ETH_MULTIHASH* const hash); t_stat eth_check_address_conflict (ETH_DEV* dev, ETH_MAC* const address); const char *eth_version (void); /* Version of dynamically loaded library (pcap) */ void eth_setcrc (ETH_DEV* dev, int need_crc); /* enable/disable CRC mode */ t_stat eth_set_async (ETH_DEV* dev, int latency); /* set read behavior to be async */ t_stat eth_clr_async (ETH_DEV* dev); /* set read behavior to be not async */ t_stat eth_set_throttle (ETH_DEV* dev, uint32 time, uint32 burst, uint32 delay); /* set transmit throttle parameters */ uint32 eth_crc32(uint32 crc, const void* vbuf, size_t len); /* Compute Ethernet Autodin II CRC for buffer */ void eth_packet_trace (ETH_DEV* dev, const uint8 *msg, int len, const char* txt); /* trace ethernet packet header+crc */ |
︙ | ︙ | |||
376 377 378 379 380 381 382 383 384 385 386 387 388 | ETH_PACK* packet, int32 status); void ethq_insert_data(ETH_QUE* que, int32 type, /* insert item into FIFO queue */ const uint8 *data, int used, size_t len, size_t crc_len, const uint8 *crc_data, int32 status); t_stat ethq_destroy(ETH_QUE* que); /* release FIFO queue */ const char *eth_capabilities(void); t_stat sim_ether_test (DEVICE *dptr); /* unit test routine */ #ifdef __cplusplus } #endif #endif /* _SIM_ETHER_H */ | > > > > > | 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 | ETH_PACK* packet, int32 status); void ethq_insert_data(ETH_QUE* que, int32 type, /* insert item into FIFO queue */ const uint8 *data, int used, size_t len, size_t crc_len, const uint8 *crc_data, int32 status); t_stat ethq_destroy(ETH_QUE* que); /* release FIFO queue */ const char *eth_capabilities(void); t_stat sim_ether_test (DEVICE *dptr); /* unit test routine */ #if !defined(SIM_TEST_INIT) /* Need stubs for test APIs */ #define SIM_TEST_INIT #define SIM_TEST(xxx) #endif #ifdef __cplusplus } #endif #endif /* _SIM_ETHER_H */ |
︙ | ︙ | |||
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | sim_finit - initialize package sim_fopen - open file sim_fread - endian independent read (formerly fxread) sim_fwrite - endian independent write (formerly fxwrite) sim_fseek - conditionally extended (>32b) seek ( sim_fseeko - extended seek (>32b if available) sim_fsize - get file size sim_fsize_name - get file size of named file sim_fsize_ex - get file size as a t_offset sim_fsize_name_ex - get file size as a t_offset of named file sim_buf_copy_swapped - copy data swapping elements along the way sim_buf_swap_data - swap data elements inplace in buffer sim_shmem_open create or attach to a shared memory region sim_shmem_close close a shared memory region sim_fopen and sim_fseek are OS-dependent. The other routines are not. sim_fsize is always a 32b routine (it is used only with small capacity random access devices like fixed head disks and DECtapes). */ #include "sim_defs.h" t_bool sim_end; /* TRUE = little endian, FALSE = big endian */ t_bool sim_taddr_64; /* t_addr is > 32b and Large File Support available */ t_bool sim_toffset_64; /* Large File (>2GB) file I/O Support available */ | > > > | 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | sim_finit - initialize package sim_fopen - open file sim_fread - endian independent read (formerly fxread) sim_fwrite - endian independent write (formerly fxwrite) sim_fseek - conditionally extended (>32b) seek ( sim_fseeko - extended seek (>32b if available) sim_can_seek - test for seekable (regular file) sim_fsize - get file size sim_fsize_name - get file size of named file sim_fsize_ex - get file size as a t_offset sim_fsize_name_ex - get file size as a t_offset of named file sim_buf_copy_swapped - copy data swapping elements along the way sim_buf_swap_data - swap data elements inplace in buffer sim_shmem_open create or attach to a shared memory region sim_shmem_close close a shared memory region sim_fopen and sim_fseek are OS-dependent. The other routines are not. sim_fsize is always a 32b routine (it is used only with small capacity random access devices like fixed head disks and DECtapes). */ #define IN_SIM_FIO_C 1 /* Include from sim_fio.c */ #include "sim_defs.h" t_bool sim_end; /* TRUE = little endian, FALSE = big endian */ t_bool sim_taddr_64; /* t_addr is > 32b and Large File Support available */ t_bool sim_toffset_64; /* Large File (>2GB) file I/O Support available */ |
︙ | ︙ | |||
230 231 232 233 234 235 236 237 238 239 240 | return (uint32)(sim_fsize_name_ex (fname)); } uint32 sim_fsize (FILE *fp) { return (uint32)(sim_fsize_ex (fp)); } /* OS-dependent routines */ /* Optimized file open */ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > | > > > > > > > > > > > > > | | | | > > | 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 | return (uint32)(sim_fsize_name_ex (fname)); } uint32 sim_fsize (FILE *fp) { return (uint32)(sim_fsize_ex (fp)); } t_bool sim_can_seek (FILE *fp) { struct stat statb; if ((0 != fstat (fileno (fp), &statb)) || (0 == (statb.st_mode & S_IFREG))) return FALSE; return TRUE; } static void _sim_expand_homedir (const char *file, char *dest, size_t dest_size) { if (memcmp (file, "~/", 2) != 0) strlcpy (dest, file, dest_size); else { char *cptr = getenv("HOME"); char *cptr2; if (cptr == NULL) { cptr = getenv("HOMEPATH"); cptr2 = getenv("HOMEDRIVE"); } else cptr2 = NULL; if (cptr && (dest_size > strlen (cptr) + strlen (file) + 3)) snprintf(dest, dest_size, "%s%s%s%s", cptr2 ? cptr2 : "", cptr, strchr (cptr, '/') ? "/" : "\\", file + 2); else strlcpy (dest, file, dest_size); while ((strchr (dest, '\\') != NULL) && ((cptr = strchr (dest, '/')) != NULL)) *cptr = '\\'; } } #if defined(_WIN32) #include <direct.h> #include <io.h> #include <fcntl.h> #else #include <unistd.h> #endif int sim_stat (const char *fname, struct stat *stat_str) { char namebuf[PATH_MAX + 1]; _sim_expand_homedir (fname, namebuf, sizeof (namebuf)); return stat (namebuf, stat_str); } int sim_chdir(const char *path) { char pathbuf[PATH_MAX + 1]; _sim_expand_homedir (path, pathbuf, sizeof (pathbuf)); return chdir (pathbuf); } int sim_mkdir(const char *path) { char pathbuf[PATH_MAX + 1]; _sim_expand_homedir (path, pathbuf, sizeof (pathbuf)); #if defined(_WIN32) return mkdir (pathbuf); #else return mkdir (pathbuf, 0777); #endif } int sim_rmdir(const char *path) { char pathbuf[PATH_MAX + 1]; _sim_expand_homedir (path, pathbuf, sizeof (pathbuf)); return rmdir (pathbuf); } /* OS-dependent routines */ /* Optimized file open */ FILE* sim_fopen (const char *file, const char *mode) { FILE *f; char namebuf[PATH_MAX + 1]; uint8 *without_quotes = NULL; uint32 dsize = 0; if (((*file == '"') && (file[strlen (file) - 1] == '"')) || ((*file == '\'') && (file[strlen (file) - 1] == '\''))) { without_quotes = (uint8*)malloc (strlen (file) + 1); if (without_quotes == NULL) return NULL; if (SCPE_OK != sim_decode_quoted_string (file, without_quotes, &dsize)) { free (without_quotes); errno = EINVAL; return NULL; } file = (const char*)without_quotes; } _sim_expand_homedir (file, namebuf, sizeof (namebuf)); #if defined (VMS) f = fopen (namebuf, mode, "ALQ=32", "DEQ=4096", "MBF=6", "MBC=127", "FOP=cbt,tef", "ROP=rah,wbh", "CTX=stm"); #elif (defined (__linux) || defined (__linux__) || defined (__hpux) || defined (_AIX)) && !defined (DONT_DO_LARGEFILE) f = fopen64 (namebuf, mode); #else f = fopen (namebuf, mode); #endif free (without_quotes); return f; } #if !defined (DONT_DO_LARGEFILE) /* 64b VMS */ #if ((defined (__ALPHA) || defined (__ia64)) && defined (VMS) && (__DECC_VER >= 60590001)) || \ ((defined(__sun) || defined(__sun__)) && defined(_LARGEFILE_SOURCE)) |
︙ | ︙ | |||
375 376 377 378 379 380 381 | while (sim_isspace (szMsgBuffer[strlen (szMsgBuffer)-1])) szMsgBuffer[strlen (szMsgBuffer) - 1] = '\0'; return szMsgBuffer; } t_stat sim_copyfile (const char *source_file, const char *dest_file, t_bool overwrite_existing) { | > > > > | | 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 | while (sim_isspace (szMsgBuffer[strlen (szMsgBuffer)-1])) szMsgBuffer[strlen (szMsgBuffer) - 1] = '\0'; return szMsgBuffer; } t_stat sim_copyfile (const char *source_file, const char *dest_file, t_bool overwrite_existing) { char sourcename[PATH_MAX + 1], destname[PATH_MAX + 1]; _sim_expand_homedir (source_file, sourcename, sizeof (sourcename)); _sim_expand_homedir (dest_file, destname, sizeof (destname)); if (CopyFileA (sourcename, destname, !overwrite_existing)) return SCPE_OK; return sim_messagef (SCPE_ARG, "Error Copying '%s' to '%s': %s\n", source_file, dest_file, sim_get_os_error_text (GetLastError ())); } #include <io.h> #include <direct.h> int sim_set_fsize (FILE *fptr, t_addr size) |
︙ | ︙ | |||
523 524 525 526 527 528 529 | fclose (fIn); if (fOut) fclose (fOut); #if defined(HAVE_UTIME) if (st == SCPE_OK) { struct stat statb; | | | 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 | fclose (fIn); if (fOut) fclose (fOut); #if defined(HAVE_UTIME) if (st == SCPE_OK) { struct stat statb; if (!sim_stat (source_file, &statb)) { struct utimbuf utim; utim.actime = statb.st_atime; utim.modtime = statb.st_mtime; if (utime (dest_file, &utim)) st = SCPE_IOERR; } |
︙ | ︙ | |||
553 554 555 556 557 558 559 | int flags = fcntl(fileno(fptr), F_GETFL, 0); return fcntl(fileno(fptr), F_SETFL, flags | O_NONBLOCK); } #endif return -1; } | | | | 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 | int flags = fcntl(fileno(fptr), F_GETFL, 0); return fcntl(fileno(fptr), F_SETFL, flags | O_NONBLOCK); } #endif return -1; } #if defined (__linux__) || defined (__APPLE__) || defined (__CYGWIN__) || defined (__FreeBSD__) #include <sys/mman.h> struct SHMEM { int shm_fd; size_t shm_size; void *shm_base; char *shm_name; }; t_stat sim_shmem_open (const char *name, size_t size, SHMEM **shmem, void **addr) { #if defined (HAVE_SHM_OPEN) && defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) *shmem = (SHMEM *)calloc (1, sizeof(**shmem)); mode_t orig_mask; *addr = NULL; if (*shmem == NULL) return SCPE_MEM; (*shmem)->shm_name = (char *)calloc (1, 1 + strlen (name) + ((*name != '/') ? 1 : 0)); |
︙ | ︙ | |||
622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 | sim_shmem_close (*shmem); *shmem = NULL; return sim_messagef (SCPE_OPENERR, "Shared Memory '%s' mmap() failed. errno=%d - %s\n", name, last_errno, strerror (last_errno)); } *addr = (*shmem)->shm_base; return SCPE_OK; #else return SCPE_NOFNC; #endif } void sim_shmem_close (SHMEM *shmem) { if (shmem == NULL) return; if (shmem->shm_base != MAP_FAILED) munmap (shmem->shm_base, shmem->shm_size); | > > | > > > | | | | 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 | sim_shmem_close (*shmem); *shmem = NULL; return sim_messagef (SCPE_OPENERR, "Shared Memory '%s' mmap() failed. errno=%d - %s\n", name, last_errno, strerror (last_errno)); } *addr = (*shmem)->shm_base; return SCPE_OK; #else *shmem = NULL; return SCPE_NOFNC; #endif } void sim_shmem_close (SHMEM *shmem) { #if defined (HAVE_SHM_OPEN) if (shmem == NULL) return; if (shmem->shm_base != MAP_FAILED) munmap (shmem->shm_base, shmem->shm_size); if (shmem->shm_fd != -1) { shm_unlink (shmem->shm_name); close (shmem->shm_fd); } free (shmem->shm_name); free (shmem); #endif } int32 sim_shmem_atomic_add (int32 *p, int32 v) { #if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) return __sync_add_and_fetch ((int *) p, v); #else return *p + v; #endif } t_bool sim_shmem_atomic_cas (int32 *ptr, int32 oldv, int32 newv) { #if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) return __sync_bool_compare_and_swap (ptr, oldv, newv); #else if (*ptr == oldv) { *ptr = newv; return 1; } else |
︙ | ︙ | |||
738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 | { size_t tot_len = 0, tot_size = 0; char *tempfilepath = NULL; char *fullpath = NULL, *result = NULL; char *c, *name, *ext; char chr; const char *p; if (((*filepath == '\'') || (*filepath == '"')) && (filepath[strlen (filepath) - 1] == *filepath)) { size_t temp_size = 1 + strlen (filepath); tempfilepath = (char *)malloc (temp_size); if (tempfilepath == NULL) return NULL; strlcpy (tempfilepath, 1 + filepath, temp_size); tempfilepath[strlen (tempfilepath) - 1] = '\0'; filepath = tempfilepath; } if ((filepath[1] == ':') || (filepath[0] == '/') || (filepath[0] == '\\')){ tot_len = 1 + strlen (filepath); fullpath = (char *)malloc (tot_len); if (fullpath == NULL) { free (tempfilepath); return NULL; } strcpy (fullpath, filepath); } | > > > > > > > > > > | > > | | 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 | { size_t tot_len = 0, tot_size = 0; char *tempfilepath = NULL; char *fullpath = NULL, *result = NULL; char *c, *name, *ext; char chr; const char *p; char filesizebuf[32] = ""; char filedatetimebuf[32] = ""; char namebuf[PATH_MAX + 1]; /* Remove quotes if they're present */ if (((*filepath == '\'') || (*filepath == '"')) && (filepath[strlen (filepath) - 1] == *filepath)) { size_t temp_size = 1 + strlen (filepath); tempfilepath = (char *)malloc (temp_size); if (tempfilepath == NULL) return NULL; strlcpy (tempfilepath, 1 + filepath, temp_size); tempfilepath[strlen (tempfilepath) - 1] = '\0'; filepath = tempfilepath; } /* Expand ~/ home directory */ _sim_expand_homedir (filepath, namebuf, sizeof (namebuf)); filepath = namebuf; /* Check for full or current directory relative path */ if ((filepath[1] == ':') || (filepath[0] == '/') || (filepath[0] == '\\')){ tot_len = 1 + strlen (filepath); fullpath = (char *)malloc (tot_len); if (fullpath == NULL) { free (tempfilepath); return NULL; } strcpy (fullpath, filepath); } else { /* Need to prepend current directory */ char dir[PATH_MAX+1] = ""; char *wd = sim_getcwd(dir, sizeof (dir)); if (wd == NULL) { free (tempfilepath); return NULL; } tot_len = 1 + strlen (filepath) + 1 + strlen (dir); fullpath = (char *)malloc (tot_len); if (fullpath == NULL) { free (tempfilepath); return NULL; } strlcpy (fullpath, dir, tot_len); if ((dir[strlen (dir) - 1] != '/') && /* if missing a trailing directory separator? */ (dir[strlen (dir) - 1] != '\\')) strlcat (fullpath, "/", tot_len); /* then add one */ strlcat (fullpath, filepath, tot_len); } while ((c = strchr (fullpath, '\\'))) /* standardize on / directory separator */ *c = '/'; if ((fullpath[1] == ':') && islower (fullpath[0])) fullpath[0] = toupper (fullpath[0]); while ((c = strstr (fullpath + 1, "//"))) /* strip out redundant / characters (leaving the option for a leading //) */ |
︙ | ︙ | |||
801 802 803 804 805 806 807 | memmove (c, c + 3, 1 + strlen (c + 3)); /* and removing intervening elements */ else if (*cl == '/') memmove (cl, c + 3, 1 + strlen (c + 3));/* and removing intervening elements */ else break; } | > > > | > > > > > > > > > > > > > > > > > > > > > | 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 | memmove (c, c + 3, 1 + strlen (c + 3)); /* and removing intervening elements */ else if (*cl == '/') memmove (cl, c + 3, 1 + strlen (c + 3));/* and removing intervening elements */ else break; } if (!strrchr (fullpath, '/')) name = fullpath + strlen (fullpath); else name = 1 + strrchr (fullpath, '/'); ext = strrchr (name, '.'); if (ext == NULL) ext = name + strlen (name); tot_size = 0; if (*parts == '\0') /* empty part specifier means strip only quotes */ tot_size = strlen (tempfilepath); if (strchr (parts, 't') || /* modification time or */ strchr (parts, 'z')) { /* or size requested? */ struct stat filestat; struct tm *tm; memset (&filestat, 0, sizeof (filestat)); (void)stat (fullpath, &filestat); if (sizeof (filestat.st_size) == 4) sprintf (filesizebuf, "%ld ", (long)filestat.st_size); else sprintf (filesizebuf, "%" LL_FMT "d ", (LL_TYPE)filestat.st_size); tm = localtime (&filestat.st_mtime); sprintf (filedatetimebuf, "%02d/%02d/%04d %02d:%02d %cM ", 1 + tm->tm_mon, tm->tm_mday, 1900 + tm->tm_year, tm->tm_hour % 12, tm->tm_min, (0 == (tm->tm_hour % 12)) ? 'A' : 'P'); } for (p = parts; *p; p++) { switch (*p) { case 'f': tot_size += strlen (fullpath); break; case 'p': tot_size += name - fullpath; break; case 'n': tot_size += ext - name; break; case 'x': tot_size += strlen (ext); break; case 't': tot_size += strlen (filedatetimebuf); break; case 'z': tot_size += strlen (filesizebuf); break; } } result = (char *)malloc (1 + tot_size); *result = '\0'; if (*parts == '\0') /* empty part specifier means strip only quotes */ strlcat (result, filepath, 1 + tot_size); for (p = parts; *p; p++) { |
︙ | ︙ | |||
848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 | *ext = '\0'; strlcat (result, name, 1 + tot_size); *ext = chr; break; case 'x': strlcat (result, ext, 1 + tot_size); break; } } free (fullpath); free (tempfilepath); return result; } #if defined (_WIN32) t_stat sim_dir_scan (const char *cptr, DIR_ENTRY_CALLBACK entry, void *context) { HANDLE hFind; WIN32_FIND_DATAA File; struct stat filestat; char WildName[PATH_MAX + 1]; | > > > > > > | | > | 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 | *ext = '\0'; strlcat (result, name, 1 + tot_size); *ext = chr; break; case 'x': strlcat (result, ext, 1 + tot_size); break; case 't': strlcat (result, filedatetimebuf, 1 + tot_size); break; case 'z': strlcat (result, filesizebuf, 1 + tot_size); break; } } free (fullpath); free (tempfilepath); return result; } #if defined (_WIN32) t_stat sim_dir_scan (const char *cptr, DIR_ENTRY_CALLBACK entry, void *context) { HANDLE hFind; WIN32_FIND_DATAA File; struct stat filestat; char WildName[PATH_MAX + 1]; _sim_expand_homedir (cptr, WildName, sizeof (WildName)); cptr = WildName; sim_trim_endspc (WildName); if ((hFind = FindFirstFileA (cptr, &File)) != INVALID_HANDLE_VALUE) { t_int64 FileSize; char DirName[PATH_MAX + 1], FileName[PATH_MAX + 1]; char *c; const char *backslash = strchr (cptr, '\\'); const char *slash = strchr (cptr, '/'); const char *pathsep = (backslash && slash) ? MIN (backslash, slash) : (backslash ? backslash : slash); GetFullPathNameA(cptr, sizeof(DirName), DirName, (char **)&c); c = strrchr (DirName, '\\'); *c = '\0'; /* Truncate to just directory path */ if (!pathsep || /* Separator wasn't mentioned? */ (slash && (0 == strcmp (slash, "/*")))) pathsep = "\\"; /* Default to Windows backslash */ if (*pathsep == '/') { /* If slash separator? */ while ((c = strchr (DirName, '\\'))) *c = '/'; /* Convert backslash to slash */ } sprintf (&DirName[strlen (DirName)], "%c", *pathsep); do { |
︙ | ︙ | |||
918 919 920 921 922 923 924 925 926 | t_stat sim_dir_scan (const char *cptr, DIR_ENTRY_CALLBACK entry, void *context) { #if defined (HAVE_GLOB) glob_t paths; #else DIR *dir; #endif struct stat filestat; char *c; | > | > | > > > | < | < > | | | > | | > | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 | t_stat sim_dir_scan (const char *cptr, DIR_ENTRY_CALLBACK entry, void *context) { #if defined (HAVE_GLOB) glob_t paths; #else DIR *dir; #endif int found_count = 0; struct stat filestat; char *c; char DirName[PATH_MAX + 1], WholeName[PATH_MAX + 1], WildName[PATH_MAX + 1], MatchName[PATH_MAX + 1]; memset (DirName, 0, sizeof(DirName)); memset (WholeName, 0, sizeof(WholeName)); memset (MatchName, 0, sizeof(MatchName)); _sim_expand_homedir (cptr, WildName, sizeof (WildName)); cptr = WildName; sim_trim_endspc (WildName); c = sim_filepath_parts (cptr, "f"); strlcpy (WholeName, c, sizeof (WholeName)); free (c); c = sim_filepath_parts (cptr, "nx"); strlcpy (MatchName, c, sizeof (MatchName)); free (c); c = strrchr (WholeName, '/'); if (c) { memmove (DirName, WholeName, 1+c-WholeName); DirName[1+c-WholeName] = '\0'; } else DirName[0] = '\0'; cptr = WholeName; #if defined (HAVE_GLOB) memset (&paths, 0, sizeof (paths)); if (0 == glob (cptr, 0, NULL, &paths)) { #else dir = opendir(DirName[0] ? DirName : "/."); if (dir) { struct dirent *ent; #endif t_offset FileSize; char *FileName; char *p_name; #if defined (HAVE_GLOB) size_t i; #endif #if defined (HAVE_GLOB) for (i=0; i<paths.gl_pathc; i++) { FileName = (char *)malloc (1 + strlen (paths.gl_pathv[i])); sprintf (FileName, "%s", paths.gl_pathv[i]); #else /* !defined (HAVE_GLOB) */ while ((ent = readdir (dir))) { #if defined (HAVE_FNMATCH) if (fnmatch(MatchName, ent->d_name, 0)) continue; #else /* !defined (HAVE_FNMATCH) */ /* only match all names or exact name without fnmatch support */ if ((strcmp(MatchName, "*") != 0) && (strcmp(MatchName, ent->d_name) != 0)) continue; #endif /* defined (HAVE_FNMATCH) */ FileName = (char *)malloc (1 + strlen (DirName) + strlen (ent->d_name)); sprintf (FileName, "%s%s", DirName, ent->d_name); #endif /* defined (HAVE_GLOB) */ p_name = FileName + strlen (DirName); memset (&filestat, 0, sizeof (filestat)); (void)stat (FileName, &filestat); FileSize = (t_offset)((filestat.st_mode & S_IFDIR) ? 0 : sim_fsize_name_ex (FileName)); entry (DirName, p_name, FileSize, &filestat, context); free (FileName); ++found_count; } #if defined (HAVE_GLOB) globfree (&paths); #else closedir (dir); #endif } else return SCPE_ARG; if (found_count) return SCPE_OK; else return SCPE_ARG; } #endif /* !defined(_WIN32) */ /* Trim trailing spaces from a string Inputs: cptr = pointer to string Outputs: cptr = pointer to string */ char *sim_trim_endspc (char *cptr) { char *tptr; tptr = cptr + strlen (cptr); while ((--tptr >= cptr) && sim_isspace (*tptr)) *tptr = 0; return cptr; } int sim_isspace (int c) { return ((c < 0) || (c >= 128)) ? 0 : isspace (c); } int sim_islower (int c) { return (c >= 'a') && (c <= 'z'); } int sim_isupper (int c) { return (c >= 'A') && (c <= 'Z'); } int sim_toupper (int c) { return ((c >= 'a') && (c <= 'z')) ? ((c - 'a') + 'A') : c; } int sim_tolower (int c) { return ((c >= 'A') && (c <= 'Z')) ? ((c - 'A') + 'a') : c; } int sim_isalpha (int c) { return ((c < 0) || (c >= 128)) ? 0 : isalpha (c); } int sim_isprint (int c) { return ((c < 0) || (c >= 128)) ? 0 : isprint (c); } int sim_isdigit (int c) { return ((c >= '0') && (c <= '9')); } int sim_isgraph (int c) { return ((c < 0) || (c >= 128)) ? 0 : isgraph (c); } int sim_isalnum (int c) { return ((c < 0) || (c >= 128)) ? 0 : isalnum (c); } /* strncasecmp() is not available on all platforms */ int sim_strncasecmp (const char* string1, const char* string2, size_t len) { size_t i; unsigned char s1, s2; for (i=0; i<len; i++) { s1 = (unsigned char)string1[i]; s2 = (unsigned char)string2[i]; s1 = (unsigned char)sim_toupper (s1); s2 = (unsigned char)sim_toupper (s2); if (s1 < s2) return -1; if (s1 > s2) return 1; if (s1 == 0) return 0; } return 0; } /* strcasecmp() is not available on all platforms */ int sim_strcasecmp (const char *string1, const char *string2) { size_t i = 0; unsigned char s1, s2; while (1) { s1 = (unsigned char)string1[i]; s2 = (unsigned char)string2[i]; s1 = (unsigned char)sim_toupper (s1); s2 = (unsigned char)sim_toupper (s2); if (s1 == s2) { if (s1 == 0) return 0; i++; continue; } if (s1 < s2) return -1; if (s1 > s2) return 1; } return 0; } int sim_strwhitecasecmp (const char *string1, const char *string2, t_bool casecmp) { unsigned char s1 = 1, s2 = 1; /* start with equal, but not space */ while ((s1 == s2) && (s1 != '\0')) { if (s1 == ' ') { /* last character was space? */ while (s1 == ' ') { /* read until not a space */ s1 = *string1++; if (sim_isspace (s1)) s1 = ' '; /* all whitespace is a space */ else { if (casecmp) s1 = (unsigned char)sim_toupper (s1); } } } else { /* get new character */ s1 = *string1++; if (sim_isspace (s1)) s1 = ' '; /* all whitespace is a space */ else { if (casecmp) s1 = (unsigned char)sim_toupper (s1); } } if (s2 == ' ') { /* last character was space? */ while (s2 == ' ') { /* read until not a space */ s2 = *string2++; if (sim_isspace (s2)) s2 = ' '; /* all whitespace is a space */ else { if (casecmp) s2 = (unsigned char)sim_toupper (s2); } } } else { /* get new character */ s2 = *string2++; if (sim_isspace (s2)) s2 = ' '; /* all whitespace is a space */ else { if (casecmp) s2 = (unsigned char)sim_toupper (s2); } } if (s1 == s2) { if (s1 == 0) return 0; continue; } if (s1 < s2) return -1; if (s1 > s2) return 1; } return 0; } /* strlcat() and strlcpy() are not available on all platforms */ /* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> */ /* * Appends src to string dst of size siz (unlike strncat, siz is the * full size of dst, not space left). At most siz-1 characters * will be copied. Always NUL terminates (unless siz <= strlen(dst)). * Returns strlen(src) + MIN(siz, strlen(initial dst)). * If retval >= siz, truncation occurred. */ size_t sim_strlcat(char *dst, const char *src, size_t size) { char *d = dst; const char *s = src; size_t n = size; size_t dlen; /* Find the end of dst and adjust bytes left but don't go past end */ while (n-- != 0 && *d != '\0') d++; dlen = d - dst; n = size - dlen; if (n == 0) return (dlen + strlen(s)); while (*s != '\0') { if (n != 1) { *d++ = *s; n--; } s++; } *d = '\0'; return (dlen + (s - src)); /* count does not include NUL */ } /* * Copy src to string dst of size siz. At most siz-1 characters * will be copied. Always NUL terminates (unless siz == 0). * Returns strlen(src); if retval >= siz, truncation occurred. */ size_t sim_strlcpy (char *dst, const char *src, size_t size) { char *d = dst; const char *s = src; size_t n = size; /* Copy as many bytes as will fit */ if (n != 0) { while (--n != 0) { if ((*d++ = *s++) == '\0') break; } } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (size != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return (s - src - 1); /* count does not include NUL */ } |
︙ | ︙ | |||
32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #ifndef SIM_FIO_H_ #define SIM_FIO_H_ 0 #ifdef __cplusplus extern "C" { #endif #define FLIP_SIZE (1 << 16) /* flip buf size */ #define fxread(a,b,c,d) sim_fread (a, b, c, d) #define fxwrite(a,b,c,d) sim_fwrite (a, b, c, d) #if ((defined (__linux) || defined (__linux__)) && (defined (__ANDROID_API__) && (__ANDROID_API__ < 24))) #define DONT_DO_LARGEFILE 1 | > > | 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #ifndef SIM_FIO_H_ #define SIM_FIO_H_ 0 #ifdef __cplusplus extern "C" { #endif #include <sys/stat.h> #define FLIP_SIZE (1 << 16) /* flip buf size */ #define fxread(a,b,c,d) sim_fread (a, b, c, d) #define fxwrite(a,b,c,d) sim_fwrite (a, b, c, d) #if ((defined (__linux) || defined (__linux__)) && (defined (__ANDROID_API__) && (__ANDROID_API__ < 24))) #define DONT_DO_LARGEFILE 1 |
︙ | ︙ | |||
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #if !defined (DONT_DO_LARGEFILE) #define DONT_DO_LARGEFILE 1 #endif #endif FILE *sim_fopen (const char *file, const char *mode); int sim_fseek (FILE *st, t_addr offset, int whence); int sim_fseeko (FILE *st, t_offset offset, int whence); int sim_set_fsize (FILE *fptr, t_addr size); int sim_set_fifo_nonblock (FILE *fptr); size_t sim_fread (void *bptr, size_t size, size_t count, FILE *fptr); size_t sim_fwrite (const void *bptr, size_t size, size_t count, FILE *fptr); uint32 sim_fsize (FILE *fptr); uint32 sim_fsize_name (const char *fname); t_offset sim_ftell (FILE *st); t_offset sim_fsize_ex (FILE *fptr); t_offset sim_fsize_name_ex (const char *fname); t_stat sim_copyfile (const char *source_file, const char *dest_file, t_bool overwrite_existing); char *sim_filepath_parts (const char *pathname, const char *parts); char *sim_getcwd (char *buf, size_t buf_size); #include <sys/stat.h> typedef void (*DIR_ENTRY_CALLBACK)(const char *directory, const char *filename, t_offset FileSize, | > > > > > | 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #if !defined (DONT_DO_LARGEFILE) #define DONT_DO_LARGEFILE 1 #endif #endif FILE *sim_fopen (const char *file, const char *mode); int sim_fseek (FILE *st, t_addr offset, int whence); int sim_fseeko (FILE *st, t_offset offset, int whence); t_bool sim_can_seek (FILE *st); int sim_set_fsize (FILE *fptr, t_addr size); int sim_set_fifo_nonblock (FILE *fptr); size_t sim_fread (void *bptr, size_t size, size_t count, FILE *fptr); size_t sim_fwrite (const void *bptr, size_t size, size_t count, FILE *fptr); uint32 sim_fsize (FILE *fptr); uint32 sim_fsize_name (const char *fname); t_offset sim_ftell (FILE *st); t_offset sim_fsize_ex (FILE *fptr); t_offset sim_fsize_name_ex (const char *fname); int sim_stat (const char *fname, struct stat *stat_str); int sim_chdir(const char *path); int sim_mkdir(const char *path); int sim_rmdir(const char *path); t_stat sim_copyfile (const char *source_file, const char *dest_file, t_bool overwrite_existing); char *sim_filepath_parts (const char *pathname, const char *parts); char *sim_getcwd (char *buf, size_t buf_size); #include <sys/stat.h> typedef void (*DIR_ENTRY_CALLBACK)(const char *directory, const char *filename, t_offset FileSize, |
︙ | ︙ | |||
88 89 90 91 92 93 94 95 96 97 98 99 100 | void sim_shmem_close (SHMEM *shmem); int32 sim_shmem_atomic_add (int32 *ptr, int32 val); t_bool sim_shmem_atomic_cas (int32 *ptr, int32 oldv, int32 newv); extern t_bool sim_taddr_64; /* t_addr is > 32b and Large File Support available */ extern t_bool sim_toffset_64; /* Large File (>2GB) file I/O support */ extern t_bool sim_end; /* TRUE = little endian, FALSE = big endian */ #ifdef __cplusplus } #endif #endif | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | void sim_shmem_close (SHMEM *shmem); int32 sim_shmem_atomic_add (int32 *ptr, int32 val); t_bool sim_shmem_atomic_cas (int32 *ptr, int32 oldv, int32 newv); extern t_bool sim_taddr_64; /* t_addr is > 32b and Large File Support available */ extern t_bool sim_toffset_64; /* Large File (>2GB) file I/O support */ extern t_bool sim_end; /* TRUE = little endian, FALSE = big endian */ char *sim_trim_endspc (char *cptr); int sim_isspace (int c); #ifdef isspace #undef isspace #endif #ifndef IN_SIM_FIO_C #define isspace(chr) sim_isspace (chr) #endif int sim_islower (int c); #ifdef islower #undef islower #endif #define islower(chr) sim_islower (chr) int sim_isupper (int c); #ifdef isupper #undef isupper #endif #define isupper(chr) sim_isupper (chr) int sim_isalpha (int c); #ifdef isalpha #undef isalpha #endif #ifndef IN_SIM_FIO_C #define isalpha(chr) sim_isalpha (chr) #endif int sim_isprint (int c); #ifdef isprint #undef isprint #endif #ifndef IN_SIM_FIO_C #define isprint(chr) sim_isprint (chr) #endif int sim_isdigit (int c); #ifdef isdigit #undef isdigit #endif #define isdigit(chr) sim_isdigit (chr) int sim_isgraph (int c); #ifdef isgraph #undef isgraph #endif #ifndef IN_SIM_FIO_C #define isgraph(chr) sim_isgraph (chr) #endif int sim_isalnum (int c); #ifdef isalnum #undef isalnum #endif #ifndef IN_SIM_FIO_C #define isalnum(chr) sim_isalnum (chr) #endif int sim_toupper (int c); int sim_tolower (int c); #ifdef toupper #undef toupper #endif #define toupper(chr) sim_toupper(chr) #ifdef tolower #undef tolower #endif #define tolower(chr) sim_tolower(chr) int sim_strncasecmp (const char *string1, const char *string2, size_t len); int sim_strcasecmp (const char *string1, const char *string2); size_t sim_strlcat (char *dst, const char *src, size_t size); size_t sim_strlcpy (char *dst, const char *src, size_t size); #ifndef strlcpy #define strlcpy(dst, src, size) sim_strlcpy((dst), (src), (size)) #endif #ifndef strlcat #define strlcat(dst, src, size) sim_strlcat((dst), (src), (size)) #endif #ifndef strncasecmp #define strncasecmp(str1, str2, len) sim_strncasecmp((str1), (str2), (len)) #endif #ifndef strcasecmp #define strcasecmp(str1, str2) sim_strcasecmp ((str1), (str2)) #endif int sim_strwhitecasecmp (const char *string1, const char *string2, t_bool casecmp); #ifdef __cplusplus } #endif #endif |
︙ | ︙ | |||
44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #define SIM_VERSION_MODE "Current" #endif #if defined(SIM_NEED_GIT_COMMIT_ID) #include ".git-commit-id.h" #endif #if !defined(SIM_GIT_COMMIT_ID) #define SIM_GIT_COMMIT_ID $Format:%H$ #define SIM_GIT_COMMIT_TIME $Format:%aI$ #endif /* The comment section below reflects the manual editing process which was in place | > > > > > > > > | 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #define SIM_VERSION_MODE "Current" #endif #if defined(SIM_NEED_GIT_COMMIT_ID) #include ".git-commit-id.h" #endif /* Simh's git commit id would be undefined when working with an extracted archive (zip file or tar ball). To address this problem and record the commit id that the archive was created from, the archive creation process populates the below information as a consequence of the "sim_rev.h export-subst" line in the .gitattributes file. */ #if !defined(SIM_GIT_COMMIT_ID) #define SIM_GIT_COMMIT_ID $Format:%H$ #define SIM_GIT_COMMIT_TIME $Format:%aI$ #endif /* The comment section below reflects the manual editing process which was in place |
︙ | ︙ |
︙ | ︙ | |||
358 359 360 361 362 363 364 | int i; char desc[SER_DEV_DESC_MAX], *d; fprintf(st,"Open Serial Devices:\n"); for (i=0; i<serial_open_device_count; i++) { d = sim_serial_getdesc_byname(serial_open_devices[i].name, desc); fprintf(st, " %s\tLn%02d %s%s%s%s\tConfig: %s\n", serial_open_devices[i].line->mp->dptr->name, (int)(serial_open_devices[i].line->mp->ldsc-serial_open_devices[i].line), | | | 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 | int i; char desc[SER_DEV_DESC_MAX], *d; fprintf(st,"Open Serial Devices:\n"); for (i=0; i<serial_open_device_count; i++) { d = sim_serial_getdesc_byname(serial_open_devices[i].name, desc); fprintf(st, " %s\tLn%02d %s%s%s%s\tConfig: %s\n", serial_open_devices[i].line->mp->dptr->name, (int)(serial_open_devices[i].line->mp->ldsc-serial_open_devices[i].line), serial_open_devices[i].line->destination, ((d != NULL) && (*d != '\0')) ? " (" : "", ((d != NULL) && (*d != '\0')) ? d : "", ((d != NULL) && (*d != '\0')) ? ")" : "", serial_open_devices[i].line->serconfig); } } return SCPE_OK; } SERHANDLE sim_open_serial (char *name, TMLN *lp, t_stat *stat) { |
︙ | ︙ | |||
444 445 446 447 448 449 450 | _serial_add_to_open_list (port, lp, savname, config); return port; } void sim_close_serial (SERHANDLE port) { | < > | 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 | _serial_add_to_open_list (port, lp, savname, config); return port; } void sim_close_serial (SERHANDLE port) { _serial_remove_from_open_list (port); sim_close_os_serial (port); } t_stat sim_config_serial (SERHANDLE port, CONST char *sconfig) { CONST char *pptr; CONST char *sptr, *tptr; SERCONFIG config = { 0 }; |
︙ | ︙ |
︙ | ︙ | |||
258 259 260 261 262 263 264 265 266 267 268 269 270 271 | memset(&dhints, 0, sizeof(dhints)); dhints.ai_family = PF_UNSPEC; } if (service) { char *c; port = strtoul(service, &c, 10); if ((port == 0) || (*c != '\0')) { switch (hints->ai_socktype) { case SOCK_DGRAM: se = getservbyname(service, "udp"); break; case SOCK_STREAM: | > | 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 | memset(&dhints, 0, sizeof(dhints)); dhints.ai_family = PF_UNSPEC; } if (service) { char *c; port = strtoul(service, &c, 10); port = htons((unsigned short)port); if ((port == 0) || (*c != '\0')) { switch (hints->ai_socktype) { case SOCK_DGRAM: se = getservbyname(service, "udp"); break; case SOCK_STREAM: |
︙ | ︙ | |||
280 281 282 283 284 285 286 | } if (hostname) { if ((0xffffffff != (ipaddr.s_addr = inet_addr(hostname))) || (0 == strcmp("255.255.255.255", hostname))) { fixed[0] = &ipaddr; fixed[1] = NULL; | < < < < < < | | | | | | | | | | | | | | | | | | | | | | | | | | | | < | 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 | } if (hostname) { if ((0xffffffff != (ipaddr.s_addr = inet_addr(hostname))) || (0 == strcmp("255.255.255.255", hostname))) { fixed[0] = &ipaddr; fixed[1] = NULL; if ((hints->ai_flags & AI_CANONNAME) && !(hints->ai_flags & AI_NUMERICHOST)) { he = gethostbyaddr((char *)&ipaddr, 4, AF_INET); if (NULL != he) cname = he->h_name; else cname = hostname; } ips = fixed; } else { if (hints->ai_flags & AI_NUMERICHOST) return EAI_NONAME; he = gethostbyname(hostname); if (he) { ips = (struct in_addr **)he->h_addr_list; if (hints->ai_flags & AI_CANONNAME) cname = he->h_name; } else { switch (h_errno) { case HOST_NOT_FOUND: case NO_DATA: return EAI_NONAME; case TRY_AGAIN: return EAI_AGAIN; default: return EAI_FAIL; } } } } else { if (hints->ai_flags & AI_PASSIVE) ipaddr.s_addr = htonl(INADDR_ANY); |
︙ | ︙ | |||
433 434 435 436 437 438 439 440 441 442 443 444 445 446 | return 0; } #if defined(_WIN32) || defined(__CYGWIN__) #if !defined(IPV6_V6ONLY) /* Older XP environments may not define IPV6_V6ONLY */ #define IPV6_V6ONLY 27 /* Treat wildcard bind as AF_INET6-only. */ #endif /* Dynamic DLL load variables */ #ifdef _WIN32 static HINSTANCE hLib = 0; /* handle to DLL */ #else static void *hLib = NULL; /* handle to Library */ #endif | > > > > | 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 | return 0; } #if defined(_WIN32) || defined(__CYGWIN__) #if !defined(IPV6_V6ONLY) /* Older XP environments may not define IPV6_V6ONLY */ #define IPV6_V6ONLY 27 /* Treat wildcard bind as AF_INET6-only. */ #endif #if defined(TEST_INFO_STUBS) #undef IPV6_V6ONLY #undef AF_INET6 #endif /* Dynamic DLL load variables */ #ifdef _WIN32 static HINSTANCE hLib = 0; /* handle to DLL */ #else static void *hLib = NULL; /* handle to Library */ #endif |
︙ | ︙ | |||
686 687 688 689 690 691 692 | port_len = length of port buffer Outputs: host = pointer to buffer for IP address (may be NULL), 0 = none port = pointer to buffer for IP port (may be NULL), 0 = none localport = pointer to buffer for local IP port (may be NULL), 0 = none | | | 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 | port_len = length of port buffer Outputs: host = pointer to buffer for IP address (may be NULL), 0 = none port = pointer to buffer for IP port (may be NULL), 0 = none localport = pointer to buffer for local IP port (may be NULL), 0 = none result = status (0 on complete success or -1 if parsing can't happen due to bad syntax, a value is out of range, a result can't fit into a result buffer, a service name doesn't exist, or a validation name doesn't match the parsed host) */ int sim_parse_addr_ex (const char *cptr, char *host, size_t hostlen, const char *default_host, char *port, size_t port_len, char *localport, size_t localport_len, const char *default_port) { |
︙ | ︙ | |||
741 742 743 744 745 746 747 748 749 750 751 752 753 754 | p_getnameinfo = (getnameinfo_func)s_getnameinfo; p_freeaddrinfo = (freeaddrinfo_func)s_freeaddrinfo; #endif /* endif AF_INET6 */ #endif /* endif _WIN32 */ #if defined (SIGPIPE) signal (SIGPIPE, SIG_IGN); /* no pipe signals */ #endif } void sim_cleanup_sock (void) { #if defined (_WIN32) WSACleanup (); #endif | > > > > > > | 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 | p_getnameinfo = (getnameinfo_func)s_getnameinfo; p_freeaddrinfo = (freeaddrinfo_func)s_freeaddrinfo; #endif /* endif AF_INET6 */ #endif /* endif _WIN32 */ #if defined (SIGPIPE) signal (SIGPIPE, SIG_IGN); /* no pipe signals */ #endif #if defined(TEST_INFO_STUBS) /* force use of stubs */ p_getaddrinfo = (getaddrinfo_func)s_getaddrinfo; p_getnameinfo = (getnameinfo_func)s_getnameinfo; p_freeaddrinfo = (freeaddrinfo_func)s_freeaddrinfo; #endif } void sim_cleanup_sock (void) { #if defined (_WIN32) WSACleanup (); #endif |
︙ | ︙ | |||
920 921 922 923 924 925 926 | sta = bind (newsock, preferred->ai_addr, preferred->ai_addrlen); p_freeaddrinfo(result); if (sta == SOCKET_ERROR) /* bind error? */ return sim_err_sock (newsock, "bind"); if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) { sta = sim_setnonblock (newsock); /* set nonblocking */ if (sta == SOCKET_ERROR) /* fcntl error? */ | | | 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 | sta = bind (newsock, preferred->ai_addr, preferred->ai_addrlen); p_freeaddrinfo(result); if (sta == SOCKET_ERROR) /* bind error? */ return sim_err_sock (newsock, "bind"); if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) { sta = sim_setnonblock (newsock); /* set nonblocking */ if (sta == SOCKET_ERROR) /* fcntl error? */ return sim_err_sock (newsock, "setnonblock"); } sta = listen (newsock, 1); /* listen on socket */ if (sta == SOCKET_ERROR) /* listen error? */ return sim_err_sock (newsock, "listen"); return newsock; /* got it! */ } |
︙ | ︙ | |||
992 993 994 995 996 997 998 | } } if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) { sta = sim_setnonblock (newsock); /* set nonblocking */ if (sta == SOCKET_ERROR) { /* fcntl error? */ p_freeaddrinfo (result); | | | 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 | } } if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) { sta = sim_setnonblock (newsock); /* set nonblocking */ if (sta == SOCKET_ERROR) { /* fcntl error? */ p_freeaddrinfo (result); return sim_err_sock (newsock, "setnonblock"); } } if ((!(opt_flags & SIM_SOCK_OPT_DATAGRAM)) && (opt_flags & SIM_SOCK_OPT_NODELAY)) { sta = sim_setnodelay (newsock); /* set nodelay */ if (sta == SOCKET_ERROR) { /* setsock error? */ p_freeaddrinfo (result); return sim_err_sock (newsock, "setnodelay"); |
︙ | ︙ | |||
1041 1042 1043 1044 1045 1046 1047 | { int sta = 0, err; int keepalive = 1; #if defined (macintosh) || defined (__linux) || defined (__linux__) || \ defined (__APPLE__) || defined (__OpenBSD__) || \ defined(__NetBSD__) || defined(__FreeBSD__) || \ (defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED)) || \ | | | 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 | { int sta = 0, err; int keepalive = 1; #if defined (macintosh) || defined (__linux) || defined (__linux__) || \ defined (__APPLE__) || defined (__OpenBSD__) || \ defined(__NetBSD__) || defined(__FreeBSD__) || \ (defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED)) || \ defined (__HAIKU__) || defined(__CYGWIN__) socklen_t size; #elif defined (_WIN32) || defined (__EMX__) || \ (defined (__ALPHA) && defined (__unix__)) || \ defined (__hpux) int size; #else size_t size; |
︙ | ︙ | |||
1066 1067 1068 1069 1070 1071 1072 | err = WSAGetLastError (); if (err != WSAEWOULDBLOCK) sim_err_sock(newsock, "accept"); return INVALID_SOCKET; } if (connectaddr != NULL) { *connectaddr = (char *)calloc(1, NI_MAXHOST+1); | < < < < | | 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 | err = WSAGetLastError (); if (err != WSAEWOULDBLOCK) sim_err_sock(newsock, "accept"); return INVALID_SOCKET; } if (connectaddr != NULL) { *connectaddr = (char *)calloc(1, NI_MAXHOST+1); p_getnameinfo((struct sockaddr *)&clientname, size, *connectaddr, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (0 == memcmp("::ffff:", *connectaddr, 7)) /* is this a IPv4-mapped IPv6 address? */ memmove(*connectaddr, 7+*connectaddr, /* prefer bare IPv4 address */ strlen(*connectaddr) - 7 + 1); /* length to include terminating \0 */ } if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) { sta = sim_setnonblock (newsock); /* set nonblocking */ if (sta == SOCKET_ERROR) /* fcntl error? */ return sim_err_sock (newsock, "setnonblock"); } if ((opt_flags & SIM_SOCK_OPT_NODELAY)) { sta = sim_setnodelay (newsock); /* set nonblocking */ if (sta == SOCKET_ERROR) /* setsockopt error? */ return sim_err_sock (newsock, "setnodelay"); } |
︙ | ︙ | |||
1107 1108 1109 1110 1111 1112 1113 | fd_set *er_p = &er_set; struct timeval zero; struct sockaddr_storage peername; #if defined (macintosh) || defined (__linux) || defined (__linux__) || \ defined (__APPLE__) || defined (__OpenBSD__) || \ defined(__NetBSD__) || defined(__FreeBSD__) || \ (defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED)) || \ | | | 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 | fd_set *er_p = &er_set; struct timeval zero; struct sockaddr_storage peername; #if defined (macintosh) || defined (__linux) || defined (__linux__) || \ defined (__APPLE__) || defined (__OpenBSD__) || \ defined(__NetBSD__) || defined(__FreeBSD__) || \ (defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED)) || \ defined (__HAIKU__) || defined(__CYGWIN__) socklen_t peernamesize = (socklen_t)sizeof(peername); #elif defined (_WIN32) || defined (__EMX__) || \ (defined (__ALPHA) && defined (__unix__)) || \ defined (__hpux) int peernamesize = (int)sizeof(peername); #else size_t peernamesize = sizeof(peername); |
︙ | ︙ | |||
1143 1144 1145 1146 1147 1148 1149 | static int _sim_getaddrname (struct sockaddr *addr, size_t addrsize, char *hostnamebuf, char *portnamebuf) { #if defined (macintosh) || defined (__linux) || defined (__linux__) || \ defined (__APPLE__) || defined (__OpenBSD__) || \ defined(__NetBSD__) || defined(__FreeBSD__) || \ (defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED)) || \ | | < < < < < | | 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 | static int _sim_getaddrname (struct sockaddr *addr, size_t addrsize, char *hostnamebuf, char *portnamebuf) { #if defined (macintosh) || defined (__linux) || defined (__linux__) || \ defined (__APPLE__) || defined (__OpenBSD__) || \ defined(__NetBSD__) || defined(__FreeBSD__) || \ (defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED)) || \ defined (__HAIKU__) || defined(__CYGWIN__) socklen_t size = (socklen_t)addrsize; #elif defined (_WIN32) || defined (__EMX__) || \ (defined (__ALPHA) && defined (__unix__)) || \ defined (__hpux) int size = (int)addrsize; #else size_t size = addrsize; #endif int ret = 0; *hostnamebuf = '\0'; *portnamebuf = '\0'; ret = p_getnameinfo(addr, size, hostnamebuf, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (0 == memcmp("::ffff:", hostnamebuf, 7)) /* is this a IPv4-mapped IPv6 address? */ memmove(hostnamebuf, 7+hostnamebuf, /* prefer bare IPv4 address */ strlen(hostnamebuf) + 7 - 1); /* length to include terminating \0 */ if (!ret) ret = p_getnameinfo(addr, size, NULL, 0, portnamebuf, NI_MAXSERV, NI_NUMERICSERV); return ret; } int sim_getnames_sock (SOCKET sock, char **socknamebuf, char **peernamebuf) { struct sockaddr_storage sockname, peername; #if defined (macintosh) || defined (__linux) || defined (__linux__) || \ defined (__APPLE__) || defined (__OpenBSD__) || \ defined(__NetBSD__) || defined(__FreeBSD__) || \ (defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED)) || \ defined (__HAIKU__) || defined(__CYGWIN__) socklen_t socknamesize = (socklen_t)sizeof(sockname); socklen_t peernamesize = (socklen_t)sizeof(peername); #elif defined (_WIN32) || defined (__EMX__) || \ (defined (__ALPHA) && defined (__unix__)) || \ defined (__hpux) int socknamesize = (int)sizeof(sockname); int peernamesize = (int)sizeof(peername); |
︙ | ︙ |
︙ | ︙ | |||
116 117 118 119 120 121 122 | #define SIM_SOCK_OPT_REUSEADDR 0x0001 #define SIM_SOCK_OPT_DATAGRAM 0x0002 #define SIM_SOCK_OPT_NODELAY 0x0004 #define SIM_SOCK_OPT_BLOCKING 0x0008 SOCKET sim_master_sock_ex (const char *hostport, int *parse_status, int opt_flags); #define sim_master_sock(hostport, parse_status) sim_master_sock_ex(hostport, parse_status, ((sim_switches & SWMASK ('U')) ? SIM_SOCK_OPT_REUSEADDR : 0)) SOCKET sim_connect_sock_ex (const char *sourcehostport, const char *hostport, const char *default_host, const char *default_port, int opt_flags); | | | 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | #define SIM_SOCK_OPT_REUSEADDR 0x0001 #define SIM_SOCK_OPT_DATAGRAM 0x0002 #define SIM_SOCK_OPT_NODELAY 0x0004 #define SIM_SOCK_OPT_BLOCKING 0x0008 SOCKET sim_master_sock_ex (const char *hostport, int *parse_status, int opt_flags); #define sim_master_sock(hostport, parse_status) sim_master_sock_ex(hostport, parse_status, ((sim_switches & SWMASK ('U')) ? SIM_SOCK_OPT_REUSEADDR : 0)) SOCKET sim_connect_sock_ex (const char *sourcehostport, const char *hostport, const char *default_host, const char *default_port, int opt_flags); #define sim_connect_sock(hostport, default_host, default_port) sim_connect_sock_ex(NULL, hostport, default_host, default_port, SIM_SOCK_OPT_BLOCKING) SOCKET sim_accept_conn_ex (SOCKET master, char **connectaddr, int opt_flags); #define sim_accept_conn(master, connectaddr) sim_accept_conn_ex(master, connectaddr, 0) int sim_check_conn (SOCKET sock, int rd); int sim_read_sock (SOCKET sock, char *buf, int nbytes); int sim_write_sock (SOCKET sock, const char *msg, int nbytes); void sim_close_sock (SOCKET sock); const char *sim_get_err_sock (const char *emsg); |
︙ | ︙ |
︙ | ︙ | |||
96 97 98 99 100 101 102 | #include "sim_tape.h" #include <ctype.h> #if defined SIM_ASYNCH_IO #include <pthread.h> #endif | | | < | < | | | | | | > > > | | 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | #include "sim_tape.h" #include <ctype.h> #if defined SIM_ASYNCH_IO #include <pthread.h> #endif static struct sim_tape_fmt { const char *name; /* name */ int32 uflags; /* unit flags */ t_addr bot; /* bot test */ t_addr eom_remnant; /* potentially unprocessed data */ } fmts[] = { { "SIMH", 0, sizeof (t_mtrlnt) - 1, sizeof (t_mtrlnt) }, { "E11", 0, sizeof (t_mtrlnt) - 1, sizeof (t_mtrlnt) }, { "TPC", UNIT_RO, sizeof (t_tpclnt) - 1, sizeof (t_tpclnt) }, { "P7B", 0, 0, 0 }, { "AWS", 0, 0, 0 }, { "TAR", UNIT_RO, 0, 0 }, { "ANSI", UNIT_RO, 0, 0 }, { "FIXED", UNIT_RO, 0, 0 }, { "DOS11", UNIT_RO, 0, 0 }, { NULL, 0, 0, 0 } }; static const uint32 bpi [] = { /* tape density table, indexed by MT_DENS constants */ 0, /* 0 = MT_DENS_NONE -- density not set */ 200, /* 1 = MT_DENS_200 -- 200 bpi NRZI */ 556, /* 2 = MT_DENS_556 -- 556 bpi NRZI */ 800, /* 3 = MT_DENS_800 -- 800 bpi NRZI */ |
︙ | ︙ | |||
139 140 141 142 143 144 145 | static t_stat tape_erase_rev (UNIT *uptr, t_mtrlnt gap_size); struct tape_context { DEVICE *dptr; /* Device for unit (access to debug flags) */ uint32 dbit; /* debugging bit for trace */ uint32 auto_format; /* Format determined dynamically */ #if defined SIM_ASYNCH_IO | | | 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | static t_stat tape_erase_rev (UNIT *uptr, t_mtrlnt gap_size); struct tape_context { DEVICE *dptr; /* Device for unit (access to debug flags) */ uint32 dbit; /* debugging bit for trace */ uint32 auto_format; /* Format determined dynamically */ #if defined SIM_ASYNCH_IO t_bool asynch_io; /* Asynchronous Interrupt scheduling enabled */ int asynch_io_latency; /* instructions to delay pending interrupt */ pthread_mutex_t lock; pthread_t io_thread; /* I/O Thread Id */ pthread_mutex_t io_lock; pthread_cond_t io_cond; pthread_cond_t io_done; pthread_cond_t startup_cond; |
︙ | ︙ | |||
168 169 170 171 172 173 174 | #if defined SIM_ASYNCH_IO #define AIO_CALLSETUP \ struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; \ \ if (ctx == NULL) \ return sim_messagef (SCPE_IERR, "Bad Attach\n"); \ | | | 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | #if defined SIM_ASYNCH_IO #define AIO_CALLSETUP \ struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; \ \ if (ctx == NULL) \ return sim_messagef (SCPE_IERR, "Bad Attach\n"); \ if ((callback == NULL) || !(ctx->asynch_io)) #define AIO_CALL(op, _buf, _bc, _fc, _max, _vbc, _gaplen, _bpi, _obj, _callback)\ if (ctx->asynch_io) { \ struct tape_context *ctx = \ (struct tape_context *)uptr->tape_ctx; \ \ pthread_mutex_lock (&ctx->io_lock); \ |
︙ | ︙ | |||
371 372 373 374 375 376 377 378 379 380 381 382 383 384 | if (uptr->tape_ctx == NULL) \ return sim_messagef (SCPE_IERR, "Bad Attach\n"); #define AIO_CALL(op, _buf, _fc, _bc, _max, _vbc, _gaplen, _bpi, _obj, _callback) \ if (_callback) \ (_callback) (uptr, r); #endif /* Enable asynchronous operation */ t_stat sim_tape_set_async (UNIT *uptr, int latency) { #if !defined(SIM_ASYNCH_IO) return sim_messagef (SCPE_NOFNC, "Tape: can't operate asynchronously\r\n"); | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 | if (uptr->tape_ctx == NULL) \ return sim_messagef (SCPE_IERR, "Bad Attach\n"); #define AIO_CALL(op, _buf, _fc, _bc, _max, _vbc, _gaplen, _bpi, _obj, _callback) \ if (_callback) \ (_callback) (uptr, r); #endif #define MIN_RECORD_SIZE 14 /* Mag tape records <14 bytes are considered noise */ #define MAX_RECORD_SIZE 65535 /* DEC tape controllers have a 16-bit byte count reg */ typedef struct VOL1 { char type[3]; /* VOL */ char num; /* 1 */ char ident[6]; /* <ansi <a> characters blank padded > */ char accessibity; /* blank */ char reserved1[13]; /* */ char implement[13]; /* */ char owner[14]; /* */ char reserved2[28]; /* */ char standard; /* 1,3 or 4 */ } VOL1; typedef struct HDR1 { /* Also EOF1, EOV1 */ char type[3]; /* HDR|EOF|EOV */ char num; /* 1 */ char file_ident[17]; /* filename */ char file_set[6]; /* label ident */ char file_section[4]; /* 0001 */ char file_sequence[4]; /* 0001 */ char generation_number[4]; /* 0001 */ char version_number[2]; /* 00 */ char creation_date[6]; /* cyyddd */ char expiration_date[6]; char accessibility; /* space */ char block_count[6]; /* 000000 */ char system_code[13]; /* */ char reserved[7]; /* blank */ } HDR1; typedef struct HDR2 { /* Also EOF2, EOV2 */ char type[3]; /* HDR */ char num; /* 2 */ char record_format; /* F(fixed)|D(variable)|S(spanned) */ char block_length[5]; /* label ident */ char record_length[5]; /* */ char reserved_os1[21]; /* */ char carriage_control; /* A - Fortran CC, M - Record contained CC, space - CR/LF to be added */ char reserved_os2[13]; /* */ char buffer_offset[2]; /* */ char reserved_std[28]; /* */ } HDR2; typedef struct HDR3 { /* Also EOF3, EOV3 */ char type[3]; /* HDR */ char num; /* 3 */ char rms_attributes[64]; /* 32 bytes of RMS attributes, converted to hex */ char reserved[12]; /* */ } HDR3; typedef struct HDR4 { /* Also EOF4, EOV4 */ char type[3]; /* HDR */ char num; /* 4 */ char blank; /* blank */ char extra_name[62]; /* */ char extra_name_used[2]; /* 99 */ char unused[11]; } HDR4; typedef struct TAPE_RECORD { uint32 size; uint8 data[1]; } TAPE_RECORD; typedef struct MEMORY_TAPE { uint32 ansi_type; /* ANSI-VMS, ANSI-RT11, ANSI-RSTS, ANSI-RSX11, etc. */ uint32 file_count; /* number of labeled files */ uint32 record_count; /* number of entries in the record array */ uint32 array_size; /* allocated size of records array */ uint32 block_size; /* tape block size */ TAPE_RECORD **records; VOL1 vol1; } MEMORY_TAPE; const char HDR3_RMS_STREAM[] = "HDR3020002040000" "0000000100000000" "0000000002000000" "0000000000000000" "0000 "; const char HDR3_RMS_STMLF[] = "HDR3020002050000" "0000000100000000" "0000000002000000" "0000000000000000" "0000 "; const char HDR3_RMS_FIXED[] = "HDR3020000010000" "0000000100000000" "0000000002000000" "0000000000000000" "0000 "; const char HDR3_RMS_VARRSX[] = "HDR300000A020000" "0000000100000000" "0000000000000000" "0000000000000000" "0000 "; const char HDR3_RMS_FIXRSX[] = "HDR3020008010000" "0000000100000000" "0000000000000000" "0000000000000000" "0000 "; static struct ansi_tape_parameters { const char *name; /* operating system */ const char *system_code; /* */ t_bool nohdr2; /* no HDR2 records */ t_bool nohdr3; /* no HDR2 records */ t_bool fixed_text; /* */ char vol1_standard; /* 3 or 4 */ const char *hdr3_fixed; /* HDR3 template for Fixed format files */ const char *hdr3_lf_line_endings; /* HDR3 template for text with LF line ending files */ const char *hdr3_crlf_line_endings;/* HDR3 template for text with CRLF line ending files */ int skip_lf_line_endings; int skip_crlf_line_endings; t_bool y2k_date_bug; t_bool zero_record_length; char record_format; char carriage_control; } ansi_args[] = { /* code nohdr2 nohdr3 fixed_text lvl hdr3 for fixed hdr3 for lf hdr3 for crlf skLF CRLF Y2KDT 0RecLnt RFM CC*/ {"ANSI-VMS" , "DECFILE11A", FALSE, FALSE, FALSE, '3', HDR3_RMS_FIXED, HDR3_RMS_STMLF, HDR3_RMS_STREAM, 0, 0, FALSE, FALSE, 0, 0}, {"ANSI-RSX11" , "DECFILE11A", FALSE, FALSE, FALSE, '4', HDR3_RMS_FIXRSX, HDR3_RMS_VARRSX, HDR3_RMS_VARRSX, 1, 2, FALSE, FALSE, 0, 0}, {"ANSI-RT11" , "DECRT11A", TRUE, TRUE, TRUE, '3', NULL, NULL, NULL, 0, 0, FALSE, FALSE, 0, 0}, {"ANSI-RSTS" , "DECRSTS/E", FALSE, TRUE, TRUE, '3', NULL, NULL, NULL, 0, 0, TRUE, TRUE, 'U', 'M'}, {"ANSI-VAR" , "DECRSTS/E", FALSE, TRUE, FALSE, '3', NULL, NULL, NULL, 1, 2, TRUE, FALSE, 'D', ' '}, {NULL} }; static MEMORY_TAPE *ansi_create_tape (const char *label, uint32 block_size, uint32 ansi_type); static MEMORY_TAPE *memory_create_tape (void); static void memory_free_tape (void *vtape); static void sim_tape_add_ansi_entry (const char *directory, const char *filename, t_offset FileSize, const struct stat *filestat, void *context); static t_bool memory_tape_add_block (MEMORY_TAPE *tape, uint8 *block, uint32 size); typedef struct DOS11_HDR { uint16 fname[2]; /* File name (RAD50 - 6 characters) */ uint16 ext; /* Extension (RAD50 - 3 characters) */ uint8 prog; /* Programmer # */ uint8 proj; /* Project # */ uint16 prot; /* Protection */ uint16 date; /* (year - 1970) * 1000 + day of year */ uint16 fname3; /* File name (RAD50 - 3 characters) */ } DOS11_HDR; #define DOS11_PROT 0233 static void sim_tape_add_dos11_entry (const char *directory, const char *filename, t_offset FileSize, const struct stat *filestat, void *context); static t_stat sim_export_tape (UNIT *uptr, const char *export_file); static FILE *tape_open_and_check_file(const char *filename); static int tape_classify_file_contents (FILE *f, size_t *max_record_size, t_bool *lf_line_endings, t_bool *crlf_line_endings); /* Enable asynchronous operation */ t_stat sim_tape_set_async (UNIT *uptr, int latency) { #if !defined(SIM_ASYNCH_IO) return sim_messagef (SCPE_NOFNC, "Tape: can't operate asynchronously\r\n"); |
︙ | ︙ | |||
419 420 421 422 423 424 425 | struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; /* make sure device exists */ if (!ctx) return SCPE_UNATT; if (ctx->asynch_io) { pthread_mutex_lock (&ctx->io_lock); | | | 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 | struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; /* make sure device exists */ if (!ctx) return SCPE_UNATT; if (ctx->asynch_io) { pthread_mutex_lock (&ctx->io_lock); ctx->asynch_io = FALSE; pthread_cond_signal (&ctx->io_cond); pthread_mutex_unlock (&ctx->io_lock); pthread_join (ctx->io_thread, NULL); pthread_mutex_destroy (&ctx->io_lock); pthread_cond_destroy (&ctx->io_cond); pthread_cond_destroy (&ctx->io_done); } |
︙ | ︙ | |||
444 445 446 447 448 449 450 | #if defined (SIM_ASYNCH_IO) struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; sim_tape_clr_async (uptr); if (sim_asynch_enabled) sim_tape_set_async (uptr, ctx->asynch_io_latency); #endif | > | > > > > > > > > > > | > > | < | < < | | | > > > > > > > > > | | > | | > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > | > > | > > | > > > > > > > > > > > | > | 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 | #if defined (SIM_ASYNCH_IO) struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; sim_tape_clr_async (uptr); if (sim_asynch_enabled) sim_tape_set_async (uptr, ctx->asynch_io_latency); #endif if (MT_GET_FMT (uptr) < MTUF_F_ANSI) fflush (uptr->fileref); } static const char *_sim_tape_format_name (UNIT *uptr) { int32 f = MT_GET_FMT (uptr); if (f == MTUF_F_ANSI) return ansi_args[MT_GET_ANSI_TYP (uptr)].name; else return fmts[f].name; } /* Attach tape unit */ t_stat sim_tape_attach (UNIT *uptr, CONST char *cptr) { DEVICE *dptr; if ((dptr = find_dev_from_unit (uptr)) == NULL) return SCPE_NOATT; return sim_tape_attach_ex (uptr, cptr, ((dptr->flags & DEV_DEBUG) || (dptr->debflags != NULL)) ? MTSE_DBG_API : 0, 0); } t_stat sim_tape_attach_ex (UNIT *uptr, const char *cptr, uint32 dbit, int completion_delay) { struct tape_context *ctx; uint32 objc; DEVICE *dptr; char gbuf[CBUFSIZE]; char export_file[CBUFSIZE] = ""; t_stat r; t_bool auto_format = FALSE; t_bool had_debug = (sim_deb != NULL); uint32 starting_dctrl = uptr->dctrl; int32 saved_switches = sim_switches; MEMORY_TAPE *tape = NULL; if ((dptr = find_dev_from_unit (uptr)) == NULL) return SCPE_NOATT; if (sim_switches & SWMASK ('F')) { /* format spec? */ cptr = get_glyph (cptr, gbuf, 0); /* get spec */ if (*cptr == 0) /* must be more */ return sim_messagef (SCPE_2FARG, "Missing Format specifier and/or filename to attach\n"); if (sim_tape_set_fmt (uptr, 0, gbuf, NULL) != SCPE_OK) return sim_messagef (SCPE_ARG, "Invalid Tape Format: %s\n", gbuf); sim_switches = sim_switches & ~(SWMASK ('F')); /* Record Format specifier already processed */ auto_format = TRUE; } if (sim_switches & SWMASK ('B')) { /* Record Size (blocking factor)? */ cptr = get_glyph (cptr, gbuf, 0); /* get spec */ if (*cptr == 0) /* must be more */ return sim_messagef (SCPE_2FARG, "Missing Record Size and/or filename to attach\n"); if ((MT_GET_FMT (uptr) != MTUF_F_TAR) && /* -B is honored for TAR, */ (MT_GET_FMT (uptr) != MTUF_F_FIXED) && /* FIXED, */ ((MT_GET_FMT (uptr) == MTUF_F_ANSI) && ((MT_GET_ANSI_TYP (uptr) != MTAT_F_VMS) && /* ANSI-VMS, */ (MT_GET_ANSI_TYP (uptr) != MTAT_F_RSX11) && /* ANSI-RSX11, */ (MT_GET_ANSI_TYP (uptr) != MTAT_F_VAR)))) { /* and ANSI-VAR only */ sim_messagef (SCPE_ARG, "The -B option is ignored for %s format\n", _sim_tape_format_name (uptr)); } else { uint32 recsize = (uint32) get_uint (gbuf, 10, MAX_RECORD_SIZE, &r); if ((r != SCPE_OK) || (recsize < MIN_RECORD_SIZE)) return sim_messagef (SCPE_ARG, "Invalid Tape Record Size: %s\n", gbuf); uptr->recsize = recsize; } sim_switches = sim_switches & ~(SWMASK ('B')); /* Record Blocking Factor */ } if (sim_switches & SWMASK ('E')) /* On-disk tape image file must exist? */ if (MT_GET_FMT (uptr) >= MTUF_F_ANSI) /* Does not apply to MEMORY_TAPE images */ sim_messagef (SCPE_ARG, "The -E option is ignored for %s format\n", _sim_tape_format_name (uptr)); if (fmts[MT_GET_FMT (uptr)].uflags & UNIT_RO) /* Force ReadOnly attach for TPC, */ sim_switches |= SWMASK ('R'); /* TAR, ANSI, FIXED and DOS11 */ if (sim_switches & SWMASK ('X')) /* Export as SIMH? */ cptr = get_glyph_nc (cptr, export_file, 0); /* get export file spec */ switch (MT_GET_FMT (uptr)) { case MTUF_F_ANSI: { const char *ocptr = cptr; char label[CBUFSIZE] = "simh"; int file_errors = 0; if ((MT_GET_ANSI_TYP (uptr) == MTAT_F_RT11) || (MT_GET_ANSI_TYP (uptr) == MTAT_F_RSX11) || (MT_GET_ANSI_TYP (uptr) == MTAT_F_RSTS)) uptr->recsize = 512; if (uptr->recsize == 0) uptr->recsize = 2048; else { if ((uptr->recsize < 512) || (uptr->recsize % 512)) return sim_messagef (SCPE_ARG, "Block size of %u is below or not a multiple of the required minimum ANSI size of 512.\n", uptr->recsize); } tape = ansi_create_tape (label, uptr->recsize, MT_GET_ANSI_TYP (uptr)); uptr->fileref = (FILE *)tape; if (uptr->fileref == NULL) return SCPE_MEM; while (*cptr != 0) { /* do all mods */ uint32 initial_file_count = tape->file_count; cptr = get_glyph_nc (cptr, gbuf, ','); /* get filename */ r = sim_dir_scan (gbuf, sim_tape_add_ansi_entry, tape); if (r != SCPE_OK) sim_messagef (SCPE_ARG, "file not found: %s\n", gbuf); if (tape->file_count == initial_file_count) ++file_errors; } if ((tape->file_count > 0) && (file_errors == 0)) { r = SCPE_OK; memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ /* RT-11 and RSTS write three tape marks at the end of an ANSI volume */ /* RSX-11 and VMS do not, but there is no harm in the extra tape mark */ memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ uptr->flags |= UNIT_ATT; uptr->filename = (char *)malloc (strlen (ocptr) + 1); strcpy (uptr->filename, ocptr); uptr->tape_eom = tape->record_count; } else { r = SCPE_ARG; memory_free_tape (uptr->fileref); uptr->fileref = NULL; cptr = ocptr; } } break; case MTUF_F_FIXED: { FILE *f; struct stat statb; size_t max_record_size; t_bool lf_line_endings; t_bool crlf_line_endings; uint8 *block = NULL; int error = FALSE; static const uint8 ascii2ebcdic[128] = { 0000,0001,0002,0003,0067,0055,0056,0057, 0026,0005,0045,0013,0014,0015,0016,0017, 0020,0021,0022,0023,0074,0075,0062,0046, 0030,0031,0077,0047,0034,0035,0036,0037, 0100,0117,0177,0173,0133,0154,0120,0175, 0115,0135,0134,0116,0153,0140,0113,0141, 0360,0361,0362,0363,0364,0365,0366,0367, 0370,0371,0172,0136,0114,0176,0156,0157, 0174,0301,0302,0303,0304,0305,0306,0307, 0310,0311,0321,0322,0323,0324,0325,0326, 0327,0330,0331,0342,0343,0344,0345,0346, 0347,0350,0351,0112,0340,0132,0137,0155, 0171,0201,0202,0203,0204,0205,0206,0207, 0210,0211,0221,0222,0223,0224,0225,0226, 0227,0230,0231,0242,0243,0244,0245,0246, 0247,0250,0251,0300,0152,0320,0241,0007}; memset (&statb, 0, sizeof (statb)); tape = memory_create_tape (); uptr->fileref = (FILE *)tape; if (uptr->fileref == NULL) return SCPE_MEM; f = fopen (cptr, "rb"); if (f == NULL) { r = sim_messagef (SCPE_OPENERR, "Can't open: %s - %s\n", cptr, strerror (errno)); break; } if (fstat (fileno (f), &statb) != 0) { r = sim_messagef (SCPE_OPENERR, "Can't stat: %s - %s\n", cptr, strerror (errno)); fclose (f); break; } r = SCPE_OK; tape_classify_file_contents (f, &max_record_size, &lf_line_endings, &crlf_line_endings); if (!lf_line_endings && !crlf_line_endings) { /* binary file? */ if (uptr->recsize == 0) { r = sim_messagef (SCPE_ARG, "Binary file %s must specify a record size with -B\n", cptr); fclose (f); break; } if ((statb.st_size % uptr->recsize) != 0) { r = sim_messagef (SCPE_ARG, "Binary file data is not a multiple of the specifyed record size (%d)\n", (int)uptr->recsize); fclose (f); break; } tape->block_size = uptr->recsize; block = (uint8 *)malloc (tape->block_size); while (!feof (f) && !error) { size_t data_read = fread (block, 1, tape->block_size, f); if (data_read == tape->block_size) error = memory_tape_add_block (tape, block, tape->block_size); else { if (data_read != 0) { r = sim_messagef (SCPE_ARG, "Read %u bytes of data when expecting %u bytes\n", (uint32)data_read, (uint32)tape->block_size); error = TRUE; } } if (data_read > 0) error = memory_tape_add_block (tape, block, tape->block_size); } } else { /* text file */ if (uptr->recsize == 0) uptr->recsize = max_record_size; if (uptr->recsize < max_record_size) { r = sim_messagef (SCPE_ARG, "Text file: %s has lines longer than %d. Max Line Size: %d\n", cptr, (int)uptr->recsize, (int)max_record_size); fclose (f); break; } tape->block_size = uptr->recsize; block = (uint8 *)calloc (1, tape->block_size + 3); while (!feof (f) && !error) { if (fgets ((char *)block, tape->block_size + 3, f)) { size_t len = strlen ((char *)block); while ((len > 0) && ((block[len - 1] == '\r') || (block[len - 1] == '\n'))) --len; memset (block + len, ' ', tape->block_size - len); if (sim_switches & SWMASK ('C')) { uint32 i; for (i = 0; i < tape->block_size; i++) block[i] = ascii2ebcdic[block[i]]; } error = memory_tape_add_block (tape, block, tape->block_size); } else error = ferror (f); } } free (block); fclose (f); if (error) r = sim_messagef (SCPE_IERR, "Error processing input file %s\n", cptr); else { memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ uptr->flags |= UNIT_ATT; uptr->filename = (char *)malloc (strlen (cptr) + 1); strcpy (uptr->filename, cptr); uptr->tape_eom = tape->record_count; } } break; case MTUF_F_DOS11: { const char *ocptr = cptr; int file_errors = 0; uptr->recsize = 512; tape = memory_create_tape(); tape->block_size = uptr->recsize; uptr->fileref = (FILE *)tape; if (uptr->fileref == NULL) return SCPE_MEM; while (*cptr != 0) { uint32 initial_file_count = tape->file_count; cptr = get_glyph_nc (cptr, gbuf, ','); /* Get filename */ r = sim_dir_scan (gbuf, sim_tape_add_dos11_entry, tape); if (r != SCPE_OK) sim_messagef (SCPE_ARG, "file not found: %s\n", gbuf); if (tape->file_count == initial_file_count) ++file_errors; } if ((tape->file_count > 0) && (file_errors == 0)) { r = SCPE_OK; memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ /* RSX-11 and RSTS write three tape marks at the end of a DOS volume */ /* VMS does not, but there is no harm in the extra tape mark */ memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ uptr->flags |= UNIT_ATT; uptr->filename = (char *)malloc (strlen (ocptr) + 1); strcpy (uptr->filename, ocptr); uptr->tape_eom = tape->record_count; } else { r = SCPE_ARG; cptr = ocptr; } } break; case MTUF_F_TAR: if (uptr->recsize == 0) uptr->recsize = TAR_DFLT_RECSIZE; /* Apply default block size */ if ((uptr->recsize % 512) != 0) return sim_messagef (SCPE_ARG, "TAR format block size of %u is not a multiple of 512\n", uptr->recsize); sim_switches |= SWMASK ('E'); /* The TAR file must exist */ /* fall through */ default: r = attach_unit (uptr, (CONST char *)cptr); /* attach unit */ break; } if (r != SCPE_OK) { /* error? */ if (MT_GET_FMT (uptr) >= MTUF_F_ANSI) { r = sim_messagef (r, "Error opening %s format internal tape image generated from: '%s'\n", _sim_tape_format_name (uptr), cptr); memory_free_tape (uptr->fileref); uptr->fileref = NULL; } else r = sim_messagef (r, "Error opening %s format tape image: '%s' - %s\n", _sim_tape_format_name (uptr), cptr, strerror(errno)); if (auto_format) /* format was specified at attach time? */ sim_tape_set_fmt (uptr, 0, "SIMH", NULL); /* restore default format */ uptr->recsize = 0; uptr->tape_eom = 0; return r; } if ((sim_switches & SWMASK ('D')) && !had_debug) { sim_switches |= SWMASK ('E'); sim_switches &= ~(SWMASK ('D') | SWMASK ('R') | SWMASK ('F')); sim_set_debon (0, "STDOUT"); sim_switches = saved_switches; } |
︙ | ︙ | |||
559 560 561 562 563 564 565 566 567 568 569 570 571 572 | uptr->io_flush = _sim_tape_io_flush; } if ((sim_switches & SWMASK ('D')) && !had_debug) sim_set_deboff (0, ""); if (sim_switches & SWMASK ('D')) uptr->dctrl = starting_dctrl; return r; } /* Detach tape unit */ t_stat sim_tape_detach (UNIT *uptr) { | > > | 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 | uptr->io_flush = _sim_tape_io_flush; } if ((sim_switches & SWMASK ('D')) && !had_debug) sim_set_deboff (0, ""); if (sim_switches & SWMASK ('D')) uptr->dctrl = starting_dctrl; if ((r == SCPE_OK) && (sim_switches & SWMASK ('X'))) r = sim_export_tape (uptr, export_file); return r; } /* Detach tape unit */ t_stat sim_tape_detach (UNIT *uptr) { |
︙ | ︙ | |||
586 587 588 589 590 591 592 | if (uptr->io_flush) uptr->io_flush (uptr); /* flush buffered data */ if (ctx) auto_format = ctx->auto_format; sim_tape_clr_async (uptr); | | > > > > > > > | | | > | | | | | > > | | | > > > | < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 | if (uptr->io_flush) uptr->io_flush (uptr); /* flush buffered data */ if (ctx) auto_format = ctx->auto_format; sim_tape_clr_async (uptr); MT_CLR_INMRK (uptr); /* Not within a TAR tapemark */ if (MT_GET_FMT (uptr) >= MTUF_F_ANSI) { memory_free_tape ((void *)uptr->fileref); uptr->fileref = NULL; uptr->flags &= ~UNIT_ATT; r = SCPE_OK; } else r = detach_unit (uptr); /* detach unit */ if (r != SCPE_OK) return r; switch (f) { /* case on format */ case MTUF_F_TPC: /* TPC */ if (uptr->filebuf) /* free map */ free (uptr->filebuf); uptr->filebuf = NULL; break; default: break; } uptr->hwmark = 0; uptr->recsize = 0; uptr->tape_eom = 0; uptr->pos = 0; MT_CLR_PNU (uptr); MT_CLR_INMRK (uptr); /* Not within a TAR tapemark */ free (uptr->tape_ctx); uptr->tape_ctx = NULL; uptr->io_flush = NULL; if (auto_format) /* format was determined or specified at attach time? */ sim_tape_set_fmt (uptr, 0, "SIMH", NULL); /* restore default format */ return SCPE_OK; } t_stat sim_tape_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { fprintf (st, "%s Tape Attach Help\n\n", dptr->name); if (0 == (uptr - dptr->units)) { if (dptr->numunits > 1) { uint32 i; for (i = 0; i < dptr->numunits; ++i) if (dptr->units[i].flags & UNIT_ATTABLE) fprintf (st, " sim> ATTACH {switches} %s%d tapefile\n\n", dptr->name, i); } else fprintf (st, " sim> ATTACH {switches} %s tapefile\n\n", dptr->name); } else fprintf (st, " sim> ATTACH {switches} %s tapefile\n\n", dptr->name); fprintf (st, "Attach command switches\n"); fprintf (st, " -R Attach Read Only.\n"); fprintf (st, " -E Must Exist (if not specified, the default behavior is to\n"); fprintf (st, " attempt to create the indicated virtual tape file).\n"); fprintf (st, " -F Open the indicated tape container in a specific format\n"); fprintf (st, " (default is SIMH, alternatives are E11, TPC, P7B, AWS, TAR,\n"); fprintf (st, " ANSI-VMS, ANSI-RT11, ANSI-RSX11, ANSI-RSTS, ANSI-VAR, FIXED,\n"); fprintf (st, " DOS11)\n"); fprintf (st, " -B For TAR format tapes, the record size for data read from the\n"); fprintf (st, " specified file. This record size will be used for all but \n"); fprintf (st, " possibly the last record which will be what remains unread.\n"); fprintf (st, " The default TAR record size is 10240. For FIXED format tapes\n"); fprintf (st, " -B specifies the record size for binary data or the maximum \n"); fprintf (st, " record size for text data\n"); fprintf (st, " -V Display some summary information about the record structure\n"); fprintf (st, " observed in the tape image observed during the attach\n"); fprintf (st, " validation pass\n"); fprintf (st, " -L Display detailed record size counts observed during attach\n"); fprintf (st, " validation pass\n"); fprintf (st, " -D Causes the internal tape structure information to be displayed\n"); fprintf (st, " while the tape image is scanned.\n"); fprintf (st, " -C Causes FIXED format tape data sets derived from text files to\n"); fprintf (st, " be converted from ASCII to EBCDIC.\n"); fprintf (st, " -X Extract a copy of the attached tape and convert it to a SIMH\n"); fprintf (st, " format tape image.\n\n"); fprintf (st, "Notes: ANSI-VMS, ANSI-RT11, ANSI-RSTS, ANSI-RSX11, ANSI-VAR formats allows\n"); fprintf (st, " one or several files to be presented to as a read only ANSI Level 3\n"); fprintf (st, " labeled tape with file labels that make each individual file\n"); fprintf (st, " accessible directly as files on the tape.\n\n"); fprintf (st, " FIXED format will present the contents of a file (text or binary) as\n"); fprintf (st, " fixed sized records/blocks with ascii text data optionally converted\n"); fprintf (st, " to EBCDIC.\n\n"); fprintf (st, " DOS11 format will present the contents of a file preceeded by a DOS11\n"); fprintf (st, " 14-byte header. All files will be owned by [1,1], have a default\n"); fprintf (st, " protection of <233> and a date in the range 1972 - 1999 with the\n"); fprintf (st, " month/day layout as the current year. The file name on the tape\n"); fprintf (st, " will be sanitized to contain only alphanumeric characters from the\n"); fprintf (st, " original source file name. Characters 7 - 9 of the file name will be\n"); fprintf (st, " placed in an otherwise unused word in the header which some DEC\n"); fprintf (st, " operating systems will be able to process. If the resulting\n"); fprintf (st, " filename is NULL, a filename in the range 000000 - 999999 will be\n"); fprintf (st, " generated based of the file position on the tape.\n\n"); fprintf (st, "Examples:\n\n"); fprintf (st, " sim> ATTACH %s -F ANSI-VMS Hobbyist-USE-ONLY-VA.TXT\n", dptr->name); fprintf (st, " sim> ATTACH %s -F ANSI-RSX11 *.TXT,*.ini,*.exe\n", dptr->name); fprintf (st, " sim> ATTACH %s -FX ANSI-RSTS RSTS.tap *.TXT,*.SAV\n", dptr->name); fprintf (st, " sim> ATTACH %s -F ANSI-RT11 *.TXT,*.TSK\n", dptr->name); fprintf (st, " sim> ATTACH %s -FB FIXED 80 SOMEFILE.TXT\n", dptr->name); fprintf (st, " sim> ATTACH %s -F DOS11 *.LDA,*.TXT\n\n", dptr->name); return SCPE_OK; } static void sim_tape_data_trace(UNIT *uptr, const uint8 *data, size_t len, const char* txt, int detail, uint32 reason) { struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; if (ctx == NULL) return; if (sim_deb && ((uptr->dctrl | ctx->dptr->dctrl) & reason)) sim_data_trace(ctx->dptr, uptr, (detail ? data : NULL), "", len, txt, reason); } static int sim_tape_seek (UNIT *uptr, t_addr pos) { if (MT_GET_FMT (uptr) < MTUF_F_ANSI) return sim_fseek (uptr->fileref, pos, SEEK_SET); return 0; } static t_offset sim_tape_size (UNIT *uptr) { if (MT_GET_FMT (uptr) < MTUF_F_ANSI) return sim_fsize_ex (uptr->fileref); /* True on-disk tape images: file size */ return uptr->tape_eom; /* Virtual tape images: record/TM count */ } /* Read record length forward (internal routine). Inputs: uptr = pointer to tape unit bc = pointer to returned record length |
︙ | ︙ | |||
761 762 763 764 765 766 767 | t_bool all_eof; uint32 f = MT_GET_FMT (uptr); t_mtrlnt sbc; t_tpclnt tpcbc; t_awshdr awshdr; size_t rdcnt; t_mtrlnt buffer [256]; /* local tape buffer */ | | | | | 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 | t_bool all_eof; uint32 f = MT_GET_FMT (uptr); t_mtrlnt sbc; t_tpclnt tpcbc; t_awshdr awshdr; size_t rdcnt; t_mtrlnt buffer [256]; /* local tape buffer */ t_addr saved_pos = uptr->pos; uint32 bufcntr, bufcap; /* buffer counter and capacity */ int32 runaway_counter, sizeof_gap; /* bytes remaining before runaway and bytes per gap */ t_stat status = MTSE_OK; MT_CLR_PNU (uptr); /* clear the position-not-updated flag */ *bc = 0; if ((uptr->flags & UNIT_ATT) == 0) /* if the unit is not attached */ return MTSE_UNATT; /* then quit with an error */ if ((uptr->tape_eom > 0) && (uptr->pos >= uptr->tape_eom)) { MT_SET_PNU (uptr); /* then set position not updated */ return MTSE_EOM; /* and quit with I/O error status */ } if (sim_tape_seek (uptr, uptr->pos)) { /* set the initial tape position; if it fails */ MT_SET_PNU (uptr); /* then set position not updated */ return sim_tape_ioerr (uptr); /* and quit with I/O error status */ } switch (f) { /* otherwise the read method depends on the tape format */ case MTUF_F_STD: |
︙ | ︙ | |||
871 872 873 874 875 876 877 | status = MTSE_TMK; /* then quit with tape mark status */ break; } else if (*bc == MTR_GAP) /* otherwise if the value is a full gap */ runaway_counter -= sizeof_gap; /* then decrement the gap counter */ | | | | | | | | | | | | | | | | | 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 | status = MTSE_TMK; /* then quit with tape mark status */ break; } else if (*bc == MTR_GAP) /* otherwise if the value is a full gap */ runaway_counter -= sizeof_gap; /* then decrement the gap counter */ else if (*bc == MTR_FHGAP) { /* otherwise if the value if a half gap */ uptr->pos -= sizeof (t_mtrlnt) / 2; /* then back up and resync */ if (sim_tape_seek (uptr, uptr->pos)) { /* set the tape position; if it fails */ status = sim_tape_ioerr (uptr); /* then quit with I/O error status */ break; } bufcntr = bufcap; /* mark the buffer as invalid to force a read */ *bc = (t_mtrlnt)MTR_GAP; /* reset the marker */ runaway_counter -= sizeof_gap / 2; /* and decrement the gap counter */ } else { /* otherwise it's a record marker */ saved_pos = uptr->pos; /* Save data position */ sbc = MTR_L (*bc); /* extract the record length */ uptr->pos = uptr->pos + sizeof (t_mtrlnt) /* position to the start */ + (f == MTUF_F_STD ? (sbc + 1) & ~1 : sbc); /* of the record */ } } while (*bc == MTR_GAP && runaway_counter > 0); /* continue until data or runaway occurs */ if (runaway_counter <= 0) /* if a tape runaway occurred */ status = MTSE_RUNAWAY; /* then report it */ if (status == MTSE_OK) { /* Validate the reverse record size for data records */ t_mtrlnt rev_lnt; if (sim_tape_seek (uptr, uptr->pos - sizeof (t_mtrlnt))) { /* then seek to the end of record size; if it fails */ status = sim_tape_ioerr (uptr); /* then quit with I/O error status */ break; } (void)sim_fread (&rev_lnt, /* get the reverse length */ sizeof (t_mtrlnt), 1, uptr->fileref); if (ferror (uptr->fileref)) { /* if a file I/O error occurred */ status = sim_tape_ioerr (uptr); /* report the error and quit */ break; } if (rev_lnt != *bc) { /* size mismatch? */ status = MTSE_INVRL; uptr->pos -= (sizeof (t_mtrlnt) + *bc + sizeof (t_mtrlnt)); MT_SET_PNU (uptr); /* pos not upd */ break; } if (sim_tape_seek (uptr, saved_pos)) /* then seek back to the beginning of the data; if it fails */ status = sim_tape_ioerr (uptr); /* then quit with I/O error status */ } break; /* otherwise the operation succeeded */ case MTUF_F_TPC: (void)sim_fread (&tpcbc, sizeof (t_tpclnt), 1, uptr->fileref); *bc = (t_mtrlnt)tpcbc; /* save rec lnt */ if (ferror (uptr->fileref)) { /* error? */ MT_SET_PNU (uptr); /* pos not upd */ status = sim_tape_ioerr (uptr); } else { if ((feof (uptr->fileref)) || /* eof? */ ((tpcbc == TPC_EOM) && (sim_fsize (uptr->fileref) == (uint32)sim_ftell (uptr->fileref)))) { MT_SET_PNU (uptr); /* pos not upd */ status = MTSE_EOM; } else { uptr->pos += sizeof (t_tpclnt); /* spc over reclnt */ if (tpcbc == TPC_TMK) /* tape mark? */ status = MTSE_TMK; else uptr->pos += (tpcbc + 1) & ~1; /* spc over record */ } } break; case MTUF_F_P7B: for (sbc = 0, all_eof = 1; ; sbc++) { /* loop thru record */ (void)sim_fread (&c, sizeof (uint8), 1, uptr->fileref); |
︙ | ︙ | |||
972 973 974 975 976 977 978 | break; else if ((c & P7B_DPAR) != P7B_EOF) all_eof = 0; } if (status == MTSE_OK) { *bc = sbc; /* save rec lnt */ | | | < | | | > | | | < < | | | > > | < > | > | | | | | | | < | | > | < | | | < | > > > > > > > > > > > > > > > > > > | 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 | break; else if ((c & P7B_DPAR) != P7B_EOF) all_eof = 0; } if (status == MTSE_OK) { *bc = sbc; /* save rec lnt */ (void)sim_tape_seek (uptr, uptr->pos); /* for read */ uptr->pos = uptr->pos + sbc; /* spc over record */ if (all_eof) { /* tape mark? */ status = MTSE_TMK; *bc = 0; } } break; case MTUF_F_AWS: saved_pos = (t_addr)sim_ftell (uptr->fileref); memset (&awshdr, 0, sizeof (awshdr)); rdcnt = sim_fread (&awshdr, sizeof (t_awslnt), 3, uptr->fileref); if (ferror (uptr->fileref)) { /* error? */ MT_SET_PNU (uptr); /* pos not upd */ status = sim_tape_ioerr (uptr); break; } if ((feof (uptr->fileref)) || /* eof? */ (rdcnt < 3)) { uptr->tape_eom = uptr->pos; MT_SET_PNU (uptr); /* pos not upd */ status = MTSE_EOM; break; } uptr->pos += sizeof (t_awshdr); /* spc over AWS header */ if (awshdr.rectyp == AWS_TMK) /* tape mark? */ status = MTSE_TMK; else { if (awshdr.rectyp != AWS_REC) { /* Unknown record type */ MT_SET_PNU (uptr); /* pos not upd */ uptr->tape_eom = uptr->pos; status = MTSE_INVRL; break; } else status = MTSE_OK; } /* tape data record (or tapemark) */ *bc = (t_mtrlnt)awshdr.nxtlen; /* save rec lnt */ uptr->pos += awshdr.nxtlen; /* spc over record */ memset (&awshdr, 0, sizeof (t_awslnt)); saved_pos = (t_addr)sim_ftell (uptr->fileref);/* save record data address */ (void)sim_tape_seek (uptr, uptr->pos); /* for read */ rdcnt = sim_fread (&awshdr, sizeof (t_awslnt), 3, uptr->fileref); if ((rdcnt == 3) && ((awshdr.prelen != *bc) || ((awshdr.rectyp != AWS_REC) && (awshdr.rectyp != AWS_TMK)))) { status = MTSE_INVRL; uptr->tape_eom = uptr->pos; uptr->pos = saved_pos - sizeof (t_awslnt); } else (void)sim_tape_seek (uptr, saved_pos); /* Move back to the data */ break; case MTUF_F_TAR: if (uptr->pos < uptr->hwmark) { if ((uptr->hwmark - uptr->pos) >= uptr->recsize) *bc = (t_mtrlnt)uptr->recsize; /* TAR record size */ else *bc = (t_mtrlnt)(uptr->hwmark - uptr->pos); /* TAR remnant last record */ (void)sim_tape_seek (uptr, uptr->pos); uptr->pos += *bc; MT_CLR_INMRK (uptr); } else { if (MT_TST_INMRK (uptr)) status = MTSE_EOM; else { status = MTSE_TMK; MT_SET_INMRK (uptr); } } break; case MTUF_F_ANSI: case MTUF_F_FIXED: case MTUF_F_DOS11: if (1) { MEMORY_TAPE *tape = (MEMORY_TAPE *)uptr->fileref; if (uptr->pos >= tape->record_count) status = MTSE_EOM; else { if (tape->records[uptr->pos]->size == 0) status = MTSE_TMK; else *bc = tape->records[uptr->pos]->size; ++uptr->pos; } } break; default: status = MTSE_FMT; } return status; } |
︙ | ︙ | |||
1130 1131 1132 1133 1134 1135 1136 | MT_CLR_PNU (uptr); /* clear the position-not-updated flag */ *bc = 0; if ((uptr->flags & UNIT_ATT) == 0) /* if the unit is not attached */ return MTSE_UNATT; /* then quit with an error */ if (sim_tape_bot (uptr)) /* if the unit is positioned at the BOT */ | | | | 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 | MT_CLR_PNU (uptr); /* clear the position-not-updated flag */ *bc = 0; if ((uptr->flags & UNIT_ATT) == 0) /* if the unit is not attached */ return MTSE_UNATT; /* then quit with an error */ if (sim_tape_bot (uptr)) /* if the unit is positioned at the BOT */ return MTSE_BOT; /* then reading backward is not possible */ switch (f) { /* otherwise the read method depends on the tape format */ case MTUF_F_STD: case MTUF_F_E11: runaway_counter = 25 * 12 * bpi [MT_DENS (uptr->dynflags)]; /* set the largest legal gap size in bytes */ if (runaway_counter == 0) { /* if tape density has not been not set */ sizeof_gap = 0; /* then disable runaway detection */ |
︙ | ︙ | |||
1167 1168 1169 1170 1171 1172 1173 | bufcap = (uint32) uptr->pos /* then reduce the capacity accordingly */ / sizeof (t_mtrlnt); else /* otherwise reset the capacity */ bufcap = sizeof (buffer) /* to the full size of the buffer */ / sizeof (buffer [0]); | | | | | | 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 | bufcap = (uint32) uptr->pos /* then reduce the capacity accordingly */ / sizeof (t_mtrlnt); else /* otherwise reset the capacity */ bufcap = sizeof (buffer) /* to the full size of the buffer */ / sizeof (buffer [0]); if (sim_tape_seek (uptr, /* seek back to the location */ uptr->pos - bufcap * sizeof (t_mtrlnt))) { /* corresponding to the start */ /* of the buffer; if it fails */ status = sim_tape_ioerr (uptr); /* and fail with I/O error status */ break; } bufcntr = sim_fread (buffer, sizeof (t_mtrlnt), /* fill the buffer */ bufcap, uptr->fileref); /* with tape metadata */ if (ferror (uptr->fileref)) { /* if a file I/O error occurred */ |
︙ | ︙ | |||
1195 1196 1197 1198 1199 1200 1201 | status = MTSE_TMK; /* then quit with tape mark status */ break; } else if (*bc == MTR_GAP) /* otherwise if the marker is a full gap */ runaway_counter -= sizeof_gap; /* then decrement the gap counter */ | | | | | | | | | | | | | < | | | | < | | > < > | | | | | | | | > > | | | < | < < | | > | < | | | < > | | < < < < < | > | < < | > | | | | < > | < < > | | < > > > > > > > > > > | > > > > > | > > > > > > | 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 | status = MTSE_TMK; /* then quit with tape mark status */ break; } else if (*bc == MTR_GAP) /* otherwise if the marker is a full gap */ runaway_counter -= sizeof_gap; /* then decrement the gap counter */ else if ((*bc & MTR_M_RHGAP) == MTR_RHGAP /* otherwise if the marker */ || *bc == MTR_RRGAP) { /* is a half gap */ uptr->pos = uptr->pos + sizeof (t_mtrlnt) / 2;/* then position forward to resync */ bufcntr = 0; /* mark the buffer as invalid to force a read */ *bc = (t_mtrlnt)MTR_GAP; /* reset the marker */ runaway_counter -= sizeof_gap / 2; /* and decrement the gap counter */ } else { /* otherwise it's a record marker */ sbc = MTR_L (*bc); /* extract the record length */ uptr->pos = uptr->pos - sizeof (t_mtrlnt)/* position to the start */ - (f == MTUF_F_STD ? (sbc + 1) & ~1 : sbc);/* of the record */ if (sim_tape_seek (uptr, /* seek to the start of the data area; if it fails */ uptr->pos + sizeof (t_mtrlnt))) {/* then return with I/O error status */ status = sim_tape_ioerr (uptr); break; } } } while (*bc == MTR_GAP && runaway_counter > 0); /* continue until data or runaway occurs */ if (runaway_counter <= 0) /* if a tape runaway occurred */ status = MTSE_RUNAWAY; /* then report it */ break; /* otherwise the operation succeeded */ case MTUF_F_TPC: ppos = sim_tape_tpc_fnd (uptr, (t_addr *) uptr->filebuf); /* find prev rec */ (void)sim_tape_seek (uptr, ppos); /* position */ (void)sim_fread (&tpcbc, sizeof (t_tpclnt), 1, uptr->fileref); *bc = (t_mtrlnt)tpcbc; /* save rec lnt */ if (ferror (uptr->fileref)) /* error? */ status = sim_tape_ioerr (uptr); else if (feof (uptr->fileref)) /* eof? */ status = MTSE_EOM; else { uptr->pos = ppos; /* spc over record */ if (*bc == MTR_TMK) /* tape mark? */ status = MTSE_TMK; else (void)sim_tape_seek (uptr, uptr->pos + sizeof (t_tpclnt)); } break; case MTUF_F_P7B: if (1) { #define BUF_SZ 512 uint8 buf[BUF_SZ]; t_addr buf_offset = uptr->pos; size_t bytes_in_buf = 0; size_t read_size; for (sbc = 1, all_eof = 1; (t_addr) sbc <= uptr->pos ; sbc++) { if (bytes_in_buf == 0) { /* Need to Fill Buffer */ if (buf_offset < BUF_SZ) { read_size = (size_t)buf_offset; buf_offset = 0; } else { read_size = BUF_SZ; buf_offset -= BUF_SZ; } (void)sim_tape_seek (uptr, buf_offset); bytes_in_buf = sim_fread (buf, sizeof (uint8), read_size, uptr->fileref); if (ferror (uptr->fileref)) { /* error? */ status = sim_tape_ioerr (uptr); break; } if (feof (uptr->fileref)) { /* eof? */ status = MTSE_EOM; break; } } c = buf[--bytes_in_buf]; if ((c & P7B_DPAR) != P7B_EOF) all_eof = 0; if (c & P7B_SOR) /* start of record? */ break; } if (status == MTSE_OK) { uptr->pos = uptr->pos - sbc; /* update position */ *bc = sbc; /* save rec lnt */ (void)sim_tape_seek (uptr, uptr->pos); /* for next read */ if (all_eof) /* tape mark? */ status = MTSE_TMK; } break; } case MTUF_F_AWS: *bc = 0; status = MTSE_OK; (void)sim_tape_seek (uptr, uptr->pos); /* position */ while (1) { if (sim_tape_bot (uptr)) { /* if we start at BOT */ status = MTSE_BOT; /* then we're done */ break; } memset (&awshdr, 0, sizeof (awshdr)); rdcnt = sim_fread (&awshdr, sizeof (t_awslnt), 3, uptr->fileref); if (ferror (uptr->fileref)) { /* error? */ status = sim_tape_ioerr (uptr); break; } if (feof (uptr->fileref)) { /* eof? */ if ((uptr->pos > sizeof (t_awshdr)) && (uptr->pos >= sim_fsize (uptr->fileref))) { uptr->tape_eom = uptr->pos; (void)sim_tape_seek (uptr, uptr->pos - sizeof (t_awshdr));/* position */ continue; } status = MTSE_EOM; break; } if ((rdcnt != 3) || ((awshdr.rectyp != AWS_REC) && (awshdr.rectyp != AWS_TMK))) { status = MTSE_INVRL; } break; } if (status != MTSE_OK) break; if (awshdr.prelen == 0) status = MTSE_TMK; else { if ((uptr->tape_eom > 0) && (uptr->pos >= uptr->tape_eom) && (awshdr.rectyp == AWS_TMK)) { status = MTSE_TMK; *bc = 0; /* save rec lnt */ } else { status = MTSE_OK; *bc = (t_mtrlnt)awshdr.prelen; /* save rec lnt */ } } uptr->pos -= sizeof (t_awshdr); /* position to the start of the record */ uptr->pos -= *bc; /* Including the data length */ if (sim_tape_seek (uptr, /* seek to the start of the data area; if it fails */ uptr->pos + sizeof (t_awshdr))) { status = sim_tape_ioerr (uptr); /* then return with I/O error status */ break; } break; case MTUF_F_TAR: if (uptr->pos == uptr->hwmark) { if (MT_TST_INMRK (uptr)) { status = MTSE_TMK; MT_CLR_INMRK (uptr); } else { if (uptr->hwmark % uptr->recsize) *bc = (t_mtrlnt)(uptr->hwmark % uptr->recsize); else *bc = (t_mtrlnt)uptr->recsize; } } else *bc = (t_mtrlnt)uptr->recsize; if (*bc) { uptr->pos -= *bc; (void)sim_tape_seek (uptr, uptr->pos); } break; case MTUF_F_ANSI: case MTUF_F_FIXED: case MTUF_F_DOS11: if (1) { MEMORY_TAPE *tape = (MEMORY_TAPE *)uptr->fileref; --uptr->pos; if (tape->records[uptr->pos]->size == 0) status = MTSE_TMK; else *bc = tape->records[uptr->pos]->size; } break; default: status = MTSE_FMT; } return status; } |
︙ | ︙ | |||
1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 | { struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; uint32 f = MT_GET_FMT (uptr); t_mtrlnt i, tbc, rbc; t_addr opos; t_stat st; if (ctx == NULL) /* if not properly attached? */ return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug_unit (ctx->dbit, uptr, "sim_tape_rdrecf(unit=%d, buf=%p, max=%d)\n", (int)(uptr-ctx->dptr->units), buf, max); opos = uptr->pos; /* old position */ st = sim_tape_rdrlfwd (uptr, &tbc); /* read rec lnt */ if (st != MTSE_OK) { *bc = 0; return st; } *bc = rbc = MTR_L (tbc); /* strip error flag */ if (rbc > max) { /* rec out of range? */ MT_SET_PNU (uptr); uptr->pos = opos; return MTSE_INVRL; } | > > | | | | | > > > > > > > | 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 | { struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; uint32 f = MT_GET_FMT (uptr); t_mtrlnt i, tbc, rbc; t_addr opos; t_stat st; *bc = 0; if (ctx == NULL) /* if not properly attached? */ return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug_unit (ctx->dbit, uptr, "sim_tape_rdrecf(unit=%d, buf=%p, max=%d)\n", (int)(uptr-ctx->dptr->units), buf, max); opos = uptr->pos; /* old position */ st = sim_tape_rdrlfwd (uptr, &tbc); /* read rec lnt */ if (st != MTSE_OK) { *bc = 0; return st; } *bc = rbc = MTR_L (tbc); /* strip error flag */ if (rbc > max) { /* rec out of range? */ MT_SET_PNU (uptr); uptr->pos = opos; return MTSE_INVRL; } if (f < MTUF_F_ANSI) { i = (t_mtrlnt) sim_fread (buf, sizeof (uint8), rbc, uptr->fileref); /* read record */ if (ferror (uptr->fileref)) { /* error? */ MT_SET_PNU (uptr); uptr->pos = opos; return sim_tape_ioerr (uptr); } } else { MEMORY_TAPE *tape = (MEMORY_TAPE *)uptr->fileref; memcpy (buf, tape->records[uptr->pos - 1]->data, rbc); i = rbc; } for ( ; i < rbc; i++) /* fill with 0's */ buf[i] = 0; if (f == MTUF_F_P7B) /* p7b? strip SOR */ buf[0] = buf[0] & P7B_DPAR; sim_tape_data_trace(uptr, buf, rbc, "Record Read", (uptr->dctrl | ctx->dptr->dctrl) & MTSE_DBG_DAT, MTSE_DBG_STR); return (MTR_F (tbc)? MTSE_RECE: MTSE_OK); |
︙ | ︙ | |||
1500 1501 1502 1503 1504 1505 1506 | if (st != MTSE_OK) { *bc = 0; return st; } *bc = rbc = MTR_L (tbc); /* strip error flag */ if (rbc > max) /* rec out of range? */ return MTSE_INVRL; | > | | | > > > > > > > | 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 | if (st != MTSE_OK) { *bc = 0; return st; } *bc = rbc = MTR_L (tbc); /* strip error flag */ if (rbc > max) /* rec out of range? */ return MTSE_INVRL; if (f < MTUF_F_ANSI) { i = (t_mtrlnt) sim_fread (buf, sizeof (uint8), rbc, uptr->fileref); /* read record */ if (ferror (uptr->fileref)) /* error? */ return sim_tape_ioerr (uptr); } else { MEMORY_TAPE *tape = (MEMORY_TAPE *)uptr->fileref; memcpy (buf, tape->records[uptr->pos]->data, rbc); i = rbc; } for ( ; i < rbc; i++) /* fill with 0's */ buf[i] = 0; if (f == MTUF_F_P7B) /* p7b? strip SOR */ buf[0] = buf[0] & P7B_DPAR; sim_tape_data_trace(uptr, buf, rbc, "Record Read Reverse", (uptr->dctrl | ctx->dptr->dctrl) & MTSE_DBG_DAT, MTSE_DBG_STR); return (MTR_F (tbc)? MTSE_RECE: MTSE_OK); } |
︙ | ︙ | |||
1557 1558 1559 1560 1561 1562 1563 | sbc = MTR_L (bc); if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */ return MTSE_UNATT; if (sim_tape_wrp (uptr)) /* write prot? */ return MTSE_WRP; if (sbc == 0) /* nothing to do? */ return MTSE_OK; | | | 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 | sbc = MTR_L (bc); if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */ return MTSE_UNATT; if (sim_tape_wrp (uptr)) /* write prot? */ return MTSE_WRP; if (sbc == 0) /* nothing to do? */ return MTSE_OK; if (sim_tape_seek (uptr, uptr->pos)) /* set pos */ return MTSE_IOERR; switch (f) { /* case on format */ case MTUF_F_STD: /* standard */ sbc = MTR_L ((bc + 1) & ~1); /* pad odd length */ /* fall through into the E11 handler */ case MTUF_F_E11: /* E11 */ |
︙ | ︙ | |||
1615 1616 1617 1618 1619 1620 1621 | static t_stat sim_tape_aws_wrdata (UNIT *uptr, uint8 *buf, t_mtrlnt bc) { t_awshdr awshdr; size_t rdcnt; t_bool replacing_record; memset (&awshdr, 0, sizeof (t_awshdr)); | | | | 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 | static t_stat sim_tape_aws_wrdata (UNIT *uptr, uint8 *buf, t_mtrlnt bc) { t_awshdr awshdr; size_t rdcnt; t_bool replacing_record; memset (&awshdr, 0, sizeof (t_awshdr)); if (sim_tape_seek (uptr, uptr->pos)) /* set pos */ return MTSE_IOERR; rdcnt = sim_fread (&awshdr, sizeof (t_awslnt), 3, uptr->fileref); if (ferror (uptr->fileref)) { /* error? */ MT_SET_PNU (uptr); /* pos not upd */ return sim_tape_ioerr (uptr); } if ((!sim_tape_bot (uptr)) && (((feof (uptr->fileref)) && (rdcnt < 3)) || /* eof? */ ((awshdr.rectyp != AWS_REC) && (awshdr.rectyp != AWS_TMK)))) { MT_SET_PNU (uptr); /* pos not upd */ return MTSE_INVRL; } if (sim_tape_seek (uptr, uptr->pos)) /* set pos */ return MTSE_IOERR; replacing_record = (awshdr.nxtlen == (t_awslnt)bc) && (awshdr.rectyp == (bc ? AWS_REC : AWS_TMK)); awshdr.nxtlen = (t_awslnt)bc; awshdr.rectyp = (bc) ? AWS_REC : AWS_TMK; (void)sim_fwrite (&awshdr, sizeof (t_awslnt), 3, uptr->fileref); if (bc) (void)sim_fwrite (buf, sizeof (uint8), bc, uptr->fileref); |
︙ | ︙ | |||
1663 1664 1665 1666 1667 1668 1669 | MT_CLR_PNU (uptr); if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */ return MTSE_UNATT; if (ctx == NULL) /* if not properly attached? */ return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ if (sim_tape_wrp (uptr)) /* write prot? */ return MTSE_WRP; | | | 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 | MT_CLR_PNU (uptr); if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */ return MTSE_UNATT; if (ctx == NULL) /* if not properly attached? */ return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ if (sim_tape_wrp (uptr)) /* write prot? */ return MTSE_WRP; (void)sim_tape_seek (uptr, uptr->pos); /* set pos */ (void)sim_fwrite (&dat, sizeof (t_mtrlnt), 1, uptr->fileref); if (ferror (uptr->fileref)) { /* error? */ MT_SET_PNU (uptr); return sim_tape_ioerr (uptr); } sim_debug_unit (MTSE_DBG_STR, uptr, "wr_lnt: lnt: %d, pos: %" T_ADDR_FMT "u\n", dat, uptr->pos); uptr->pos = uptr->pos + sizeof (t_mtrlnt); /* move tape */ |
︙ | ︙ | |||
1723 1724 1725 1726 1727 1728 1729 | return MTSE_FMT; if (MT_GET_FMT (uptr) == MTUF_F_AWS) { sim_set_fsize (uptr->fileref, uptr->pos); result = MTSE_OK; } else { result = sim_tape_wrdata (uptr, MTR_EOM); /* write the EOM marker */ | | | 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 | return MTSE_FMT; if (MT_GET_FMT (uptr) == MTUF_F_AWS) { sim_set_fsize (uptr->fileref, uptr->pos); result = MTSE_OK; } else { result = sim_tape_wrdata (uptr, MTR_EOM); /* write the EOM marker */ uptr->pos = uptr->pos - sizeof (t_mtrlnt); /* restore original tape position */ } MT_SET_PNU (uptr); /* indicate that position was not updated */ return result; } t_stat sim_tape_wreom_a (UNIT *uptr, TAPE_PCALLBACK callback) |
︙ | ︙ | |||
1885 1886 1887 1888 1889 1890 1891 | return MTSE_WRP; /* then we cannot write */ else if (gap_size == 0 || format != MTUF_F_STD) /* otherwise if zero length or gaps aren't supported */ return MTSE_OK; /* then take no action */ file_size = sim_fsize (uptr->fileref); /* get the file size */ | | | 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 | return MTSE_WRP; /* then we cannot write */ else if (gap_size == 0 || format != MTUF_F_STD) /* otherwise if zero length or gaps aren't supported */ return MTSE_OK; /* then take no action */ file_size = sim_fsize (uptr->fileref); /* get the file size */ if (sim_tape_seek (uptr, uptr->pos)) { /* position the tape; if it fails */ MT_SET_PNU (uptr); /* then set position not updated */ return sim_tape_ioerr (uptr); /* and quit with I/O error status */ } /* Read tape records and allocate them to the gap until the amount required is consumed. |
︙ | ︙ | |||
1939 1940 1941 1942 1943 1944 1945 | MT_SET_PNU (uptr); /* set the position-not-updated flag */ return MTSE_INVRL; /* and return an invalid record length error */ } else if (meta == MTR_FHGAP) { /* half gap? */ uptr->pos = uptr->pos - meta_size / 2; /* backup to resync */ | | | | 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 | MT_SET_PNU (uptr); /* set the position-not-updated flag */ return MTSE_INVRL; /* and return an invalid record length error */ } else if (meta == MTR_FHGAP) { /* half gap? */ uptr->pos = uptr->pos - meta_size / 2; /* backup to resync */ if (sim_tape_seek (uptr, uptr->pos)) /* position the tape; if it fails */ return sim_tape_ioerr (uptr); /* then quit with I/O error status */ gap_alloc = gap_alloc + meta_size / 2; /* allocate marker space */ gap_needed = gap_needed - meta_size / 2; /* reduce requirement */ } else if (uptr->pos + MTR_L (meta) + meta_size > file_size) { /* rec len out of range? */ gap_alloc = gap_alloc + gap_needed; /* presume overwritten tape */ |
︙ | ︙ | |||
1965 1966 1967 1968 1969 1970 1971 | else { /* data record */ sbc = MTR_L (meta); /* get record data length */ rec_size = ((sbc + 1) & ~1) + meta_size * 2; /* overall size in bytes */ if (rec_size < gap_needed + min_rec_size) { /* rec too small? */ uptr->pos = uptr->pos - meta_size + rec_size; /* position past record */ | | | | 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 | else { /* data record */ sbc = MTR_L (meta); /* get record data length */ rec_size = ((sbc + 1) & ~1) + meta_size * 2; /* overall size in bytes */ if (rec_size < gap_needed + min_rec_size) { /* rec too small? */ uptr->pos = uptr->pos - meta_size + rec_size; /* position past record */ if (sim_tape_seek (uptr, uptr->pos)) /* position the tape; if it fails */ return sim_tape_ioerr (uptr); /* then quit with I/O error status */ gap_alloc = gap_alloc + rec_size; /* allocate record */ gap_needed = gap_needed - rec_size; /* reduce requirement */ } else { /* record size OK */ uptr->pos = uptr->pos - meta_size + gap_needed; /* position to end of gap */ |
︙ | ︙ | |||
2080 2081 2082 2083 2084 2085 2086 | if ((uptr->flags & UNIT_ATT) == 0) /* if the unit is not attached */ return MTSE_UNATT; /* then we cannot proceed */ else if (sim_tape_wrp (uptr)) /* otherwise if the unit is write protected */ return MTSE_WRP; /* then we cannot write */ | | | | | | | | 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 | if ((uptr->flags & UNIT_ATT) == 0) /* if the unit is not attached */ return MTSE_UNATT; /* then we cannot proceed */ else if (sim_tape_wrp (uptr)) /* otherwise if the unit is write protected */ return MTSE_WRP; /* then we cannot write */ else if ((gap_size == 0) || (format != MTUF_F_STD)) /* otherwise if the gap length is zero or unsupported */ return MTSE_OK; /* then take no action */ gap_pos = uptr->pos; /* save the starting position */ if (gap_size == meta_size) { /* if the request is for a single metadatum */ if (sim_tape_bot (uptr)) /* then if the unit is positioned at the BOT */ return MTSE_BOT; /* then erasing backward is not possible */ else /* otherwise */ uptr->pos -= meta_size; /* back up the file pointer */ if (sim_tape_seek (uptr, uptr->pos)) /* position the tape; if it fails */ return sim_tape_ioerr (uptr); /* then quit with I/O error status */ (void)sim_fread (&metadatum, meta_size, 1, uptr->fileref);/* read a metadatum */ if (ferror (uptr->fileref)) /* if a file I/O error occurred */ return sim_tape_ioerr (uptr); /* then report the error and quit */ else if (metadatum == MTR_TMK) /* otherwise if a tape mark is present */ if (sim_tape_seek (uptr, uptr->pos)) /* then reposition the tape; if it fails */ return sim_tape_ioerr (uptr); /* then quit with I/O error status */ else { /* otherwise */ metadatum = MTR_GAP; /* replace it with an erase gap marker */ xfer = sim_fwrite (&metadatum, meta_size, /* write the gap marker */ 1, uptr->fileref); if (ferror (uptr->fileref) || (xfer == 0)) /* if a file I/O error occurred */ return sim_tape_ioerr (uptr); /* report the error and quit */ else /* otherwise the write succeeded */ status = MTSE_OK; /* so return success */ } else if (metadatum == MTR_GAP) /* otherwise if a gap already exists */ status = MTSE_OK; /* then take no additional action */ else { /* otherwise a data record is present */ uptr->pos = gap_pos; /* so restore the starting position */ return MTSE_INVRL; /* and fail with invalid record length status */ } } else { /* otherwise it's an erase record request */ status = sim_tape_rdlntr (uptr, &rec_size); /* so get the length of the preceding record */ if ((status == MTSE_OK) && /* if the read succeeded */ (gap_size == rec_size + 2 * meta_size)) { /* and the gap will exactly overlay the record */ gap_pos = uptr->pos; /* then save the gap start position */ status = tape_erase_fwd (uptr, gap_size); /* erase the record */ if (status == MTSE_OK) /* if the gap write succeeded */ uptr->pos = gap_pos; /* the reposition back to the start of the gap */ } |
︙ | ︙ | |||
2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 | t_stat sim_tape_sprecsr (UNIT *uptr, uint32 count, uint32 *skipped) { struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; t_stat st; t_mtrlnt tbc; if (ctx == NULL) /* if not properly attached? */ return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug_unit (ctx->dbit, uptr, "sim_tape_sprecsr(unit=%d, count=%d)\n", (int)(uptr-ctx->dptr->units), count); | > < | 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 | t_stat sim_tape_sprecsr (UNIT *uptr, uint32 count, uint32 *skipped) { struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; t_stat st; t_mtrlnt tbc; *skipped = 0; if (ctx == NULL) /* if not properly attached? */ return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug_unit (ctx->dbit, uptr, "sim_tape_sprecsr(unit=%d, count=%d)\n", (int)(uptr-ctx->dptr->units), count); while (*skipped < count) { /* loopo */ st = sim_tape_sprecr (uptr, &tbc); /* spc rec rev */ if (st != MTSE_OK) return st; *skipped = *skipped + 1; /* # recs skipped */ } return MTSE_OK; |
︙ | ︙ | |||
2661 2662 2663 2664 2665 2666 2667 | if (uptr->flags & UNIT_ATT) { if (ctx == NULL) /* if not properly attached? */ return sim_messagef (SCPE_IERR, "Bad Attach\n");/* that's a problem */ sim_debug_unit (ctx->dbit, uptr, "sim_tape_rewind(unit=%d)\n", (int)(uptr-ctx->dptr->units)); } uptr->pos = 0; | | | > | | 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 | if (uptr->flags & UNIT_ATT) { if (ctx == NULL) /* if not properly attached? */ return sim_messagef (SCPE_IERR, "Bad Attach\n");/* that's a problem */ sim_debug_unit (ctx->dbit, uptr, "sim_tape_rewind(unit=%d)\n", (int)(uptr-ctx->dptr->units)); } uptr->pos = 0; if (uptr->flags & UNIT_ATT) { (void)sim_tape_seek (uptr, uptr->pos); } MT_CLR_PNU (uptr); MT_CLR_INMRK (uptr); /* Not within a TAR tapemark */ return MTSE_OK; } t_stat sim_tape_rewind_a (UNIT *uptr, TAPE_PCALLBACK callback) { t_stat r = MTSE_OK; AIO_CALLSETUP |
︙ | ︙ | |||
2766 2767 2768 2769 2770 2771 2772 | /* Test for BOT */ t_bool sim_tape_bot (UNIT *uptr) { uint32 f = MT_GET_FMT (uptr); | | | 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 | /* Test for BOT */ t_bool sim_tape_bot (UNIT *uptr) { uint32 f = MT_GET_FMT (uptr); return ((uptr->pos <= fmts[f].bot) && (!MT_TST_INMRK (uptr))) ? TRUE: FALSE; } /* Test for end of tape */ t_bool sim_tape_eot (UNIT *uptr) { return (uptr->capac && (uptr->pos >= uptr->capac))? TRUE: FALSE; |
︙ | ︙ | |||
2804 2805 2806 2807 2808 2809 2810 | if (uptr == NULL) return SCPE_IERR; if (uptr->flags & UNIT_ATT) return SCPE_ALATT; if (cptr == NULL) return SCPE_ARG; | | > > | > > > > > > > | | > > > > | < < < | < | | | > > | 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 | if (uptr == NULL) return SCPE_IERR; if (uptr->flags & UNIT_ATT) return SCPE_ALATT; if (cptr == NULL) return SCPE_ARG; for (f = 0; fmts[f].name; f++) { if (MATCH_CMD(fmts[f].name, cptr) == 0) { uint32 a = 0; if (f == MTUF_F_ANSI) { for (a = 0; ansi_args[a].name; a++) if (MATCH_CMD(ansi_args[a].name, cptr) == 0) break; if (ansi_args[a].name == NULL) return sim_messagef (SCPE_ARG, "Unknown ANSI tape format: %s\n", cptr); } uptr->flags &= ~UNIT_RO; uptr->flags |= fmts[f].uflags; uptr->dynflags &= ~UNIT_M_TAPE_FMT; uptr->dynflags |= (f << UNIT_V_TAPE_FMT); uptr->dynflags &= ~UNIT_M_TAPE_ANSI; uptr->dynflags |= (a << UNIT_V_TAPE_ANSI); return SCPE_OK; } } return sim_messagef (SCPE_ARG, "Unknown tape format: %s\n", cptr); } /* Show tape format */ t_stat sim_tape_show_fmt (FILE *st, UNIT *uptr, int32 val, CONST void *desc) { fprintf (st, "%s format", _sim_tape_format_name (uptr)); return SCPE_OK; } /* Map a TPC format tape image */ static uint32 sim_tape_tpc_map (UNIT *uptr, t_addr *map, uint32 mapsize) { t_addr tpos, leot = 0; t_addr tape_size; t_tpclnt bc, last_bc = TPC_EOM; uint32 had_double_tape_mark = 0; size_t i; uint32 objc, sizec; uint32 *countmap = NULL; uint8 *recbuf = NULL; DEVICE *dptr = find_dev_from_unit (uptr); if ((uptr == NULL) || (uptr->fileref == NULL)) return 0; countmap = (uint32 *)calloc (65536, sizeof(*countmap)); recbuf = (uint8 *)malloc (65536); tape_size = (t_addr)sim_fsize (uptr->fileref); sim_debug_unit (MTSE_DBG_STR, uptr, "tpc_map: tape_size: %" T_ADDR_FMT "u\n", tape_size); for (objc = 0, sizec = 0, tpos = 0;; ) { (void)sim_tape_seek (uptr, tpos); i = sim_fread (&bc, sizeof (bc), 1, uptr->fileref); if (i == 0) /* past or at eof? */ break; if (bc > 65535) /* Range check length value to satisfy Coverity */ break; if (countmap[bc] == 0) sizec++; ++countmap[bc]; if (map && (objc < mapsize)) map[objc] = tpos; if (bc) { |
︙ | ︙ | |||
2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 | static char msgbuf[64]; if (stat <= MTSE_MAX_ERR) return mtse_errors[stat]; sprintf(msgbuf, "Error %d", stat); return msgbuf; } static t_stat sim_tape_validate_tape (UNIT *uptr) { t_addr saved_pos = uptr->pos; | > > > > < > > > > > | > > > > > > | > > > > > | > | | > > > > > > > > | > > > > | < > | < < > | < < < | | | | | | | | > > | | | | | > | < | | | > | > | | > | > | 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 | static char msgbuf[64]; if (stat <= MTSE_MAX_ERR) return mtse_errors[stat]; sprintf(msgbuf, "Error %d", stat); return msgbuf; } #ifndef MAX #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #endif static t_stat sim_tape_validate_tape (UNIT *uptr) { t_addr saved_pos = uptr->pos; uint32 data_total = 0; uint32 tapemark_total = 0; uint32 record_total = 0; uint32 unique_record_sizes = 0; uint32 remaining_data = 0; uint32 gaps = 0; uint32 gap_bytes = 0; uint32 *rec_sizes = NULL; t_stat r = SCPE_OK; t_stat r_f; t_stat r_r; t_stat r_s; uint8 *buf_f = NULL; uint8 *buf_r = NULL; t_mtrlnt bc_f; t_mtrlnt bc_r; t_mtrlnt bc_s; t_mtrlnt bc; t_addr pos_f; t_addr pos_r; t_addr pos_fa; t_addr pos_sa; t_mtrlnt max = MTR_MAXLEN; if (!(uptr->flags & UNIT_ATT)) return SCPE_UNATT; buf_f = (uint8 *)calloc (1, max); if (buf_f == NULL) return SCPE_MEM; buf_r = (uint8 *)calloc (1, max); if (buf_r == NULL) { free (buf_f); return SCPE_MEM; } rec_sizes = (uint32 *)calloc (max + 1, sizeof (*rec_sizes)); if (rec_sizes == NULL) { free (buf_f); free (buf_r); return SCPE_MEM; } r = sim_tape_rewind (uptr); while (r == SCPE_OK) { if (stop_cpu) { /* SIGINT? */ stop_cpu = FALSE; break; } pos_f = uptr->pos; r_f = sim_tape_rdrecf (uptr, buf_f, &bc_f, max); pos_fa = uptr->pos; switch (r_f) { case MTSE_OK: /* no error */ case MTSE_TMK: /* tape mark */ if (r_f == MTSE_OK) ++record_total; else ++tapemark_total; data_total += bc_f; if (bc_f != 0) { if (rec_sizes[bc_f] == 0) ++unique_record_sizes; ++rec_sizes[bc_f]; } r_r = sim_tape_rdrecr (uptr, buf_r, &bc_r, max); pos_r = uptr->pos; if (r_r != r_f) { sim_printf ("Forward Record Read returned: %s, Reverse read returned: %s\n", sim_tape_error_text (r_f), sim_tape_error_text (r_r)); r = MAX(r_f, r_r); break; } if (bc_f != bc_r) { sim_printf ("Forward Record Read record length: %d, Reverse read record length: %d\n", bc_f, bc_r); r = MTSE_RECE; break; } if (0 != memcmp (buf_f, buf_r, bc_f)) { sim_printf ("%d byte record contents differ when read forward amd backwards start from position %" T_ADDR_FMT "u\n", bc_f, pos_f); r = MTSE_RECE; break; } memset (buf_f, 0, bc_f); memset (buf_r, 0, bc_r); if (pos_f != pos_r) { if (MT_GET_FMT (uptr) == MTUF_F_STD) { ++gaps; gap_bytes += (uint32)(pos_r - pos_f); } else { sim_printf ("Unexpected tape file position between forward and reverse record read: (%" T_ADDR_FMT "u, %" T_ADDR_FMT "u)\n", pos_f, pos_r); r = MTSE_RECE; break; } } r_s = sim_tape_sprecf (uptr, &bc_s); pos_sa = uptr->pos; if (r_s != r_f) { sim_printf ("Unexpected Space Record Status: %s vs %s\n", sim_tape_error_text (r_s), sim_tape_error_text (r_f)); r = MAX(r_s, r_f); break; } if (bc_s != bc_f) { sim_printf ("Unexpected Space Record Length: %d vs %d\n", bc_s, bc_f); r = MTSE_RECE; break; } if (pos_fa != pos_sa) { sim_printf ("Unexpected tape file position after forward and skip record: (%" T_ADDR_FMT "u, %" T_ADDR_FMT "u)\n", pos_fa, pos_sa); break; } r = SCPE_OK; break; case MTSE_INVRL: /* invalid rec lnt */ case MTSE_FMT: /* invalid format */ case MTSE_BOT: /* beginning of tape */ case MTSE_RECE: /* error in record */ case MTSE_WRP: /* write protected */ case MTSE_LEOT: /* Logical End Of Tape */ case MTSE_RUNAWAY: /* tape runaway */ default: r = r_f; break; case MTSE_EOM: /* end of medium */ r = r_f; break; } } uptr->tape_eom = uptr->pos; if (!stop_cpu) { /* if SIGINT didn't interrupt the scan */ sim_messagef (SCPE_OK, "%s: Tape Image %s'%s' scanned as %s format\n", sim_uname (uptr), ((MT_GET_FMT (uptr) >= MTUF_F_ANSI) ? "made from " : ""), uptr->filename, _sim_tape_format_name (uptr)); remaining_data = (uint32)(sim_tape_size (uptr) - (t_offset)uptr->tape_eom); if ((r != MTSE_EOM) || (sim_switches & SWMASK ('V')) || (sim_switches & SWMASK ('L')) || (remaining_data > 0) || (unique_record_sizes > 2 * tapemark_total)) { sim_messagef (SCPE_OK, "%s %u bytes of tape data (%u record%s, %u tapemark%s)\n", (r != MTSE_EOM) ? "After processing" : "contains", data_total, record_total, (record_total == 1) ? "" : "s", tapemark_total, (tapemark_total == 1) ? "" : "s"); if ((record_total > 0) && (sim_switches & SWMASK ('L'))) { sim_messagef (SCPE_OK, "Comprising %d different sized records (in record size order):\n", unique_record_sizes); for (bc = 0; bc <= max; bc++) { if (rec_sizes[bc]) sim_messagef (SCPE_OK, "%8u %u byte record%s\n", rec_sizes[bc], (uint32)bc, (rec_sizes[bc] != 1) ? "s" : ""); } if (gaps) sim_messagef (SCPE_OK, "%8u gap%s totalling %u bytes %s seen\n", gaps, (gaps != 1) ? "s" : "", gap_bytes, (gaps != 1) ? "were" : "was"); } if (r != MTSE_EOM) sim_messagef (SCPE_OK, "Read Tape Record Returned Unexpected Status: %s\n", sim_tape_error_text (r)); if (remaining_data > fmts[MT_GET_FMT (uptr)].eom_remnant) sim_messagef (SCPE_OK, "%u %s of unexamined data remain in the tape image file\n", remaining_data, (MT_GET_FMT (uptr) < MTUF_F_ANSI) ? "bytes" : "records"); } if (unique_record_sizes > 2 * tapemark_total) { sim_messagef (SCPE_OK, "A potentially unreasonable number of record sizes(%u) vs tape marks (%u) have been found\n", unique_record_sizes, tapemark_total); sim_messagef (SCPE_OK, "The tape format (%s) might not be correct for the '%s' tape image\n", _sim_tape_format_name (uptr), uptr->filename); } } free (buf_f); free (buf_r); free (rec_sizes); uptr->pos = saved_pos; (void)sim_tape_seek (uptr, uptr->pos); return SCPE_OK; } /* Find the preceding record in a TPC file */ static t_addr sim_tape_tpc_fnd (UNIT *uptr, t_addr *map) { uint32 lo, hi, p; if (map == NULL) return 0; lo = 0; hi = uptr->hwmark - 1; do { p = (lo + hi) >> 1; if (uptr->pos == map[p]) return ((p == 0)? map[p]: map[p - 1]); else { if (uptr->pos < map[p]) hi = p - 1; else lo = p + 1; } } while (lo <= hi); return ((p == 0)? map[p]: map[p - 1]); } /* Set tape capacity */ |
︙ | ︙ | |||
3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 | static t_stat sim_tape_test_create_tape_files (UNIT *uptr, const char *filename, int files, int records, int max_size) { FILE *fSIMH = NULL; FILE *fE11 = NULL; FILE *fTPC = NULL; FILE *fP7B = NULL; FILE *fAWS = NULL; FILE *fTAR = NULL; FILE *fTAR2 = NULL; int i, j, k; t_tpclnt tpclnt; t_mtrlnt mtrlnt; t_awslnt awslnt; t_awslnt awslnt_last = 0; t_awslnt awsrec_typ = AWS_REC; char name[256]; t_stat stat = SCPE_OPENERR; uint8 *buf = NULL; | > > | | | 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 | static t_stat sim_tape_test_create_tape_files (UNIT *uptr, const char *filename, int files, int records, int max_size) { FILE *fSIMH = NULL; FILE *fE11 = NULL; FILE *fTPC = NULL; FILE *fP7B = NULL; FILE *fAWS = NULL; FILE *fAWS2 = NULL; FILE *fAWS3 = NULL; FILE *fTAR = NULL; FILE *fTAR2 = NULL; int i, j, k; t_tpclnt tpclnt; t_mtrlnt mtrlnt; t_awslnt awslnt; t_awslnt awslnt_last = 0; t_awslnt awsrec_typ = AWS_REC; char name[256]; t_stat stat = SCPE_OPENERR; uint8 *buf = NULL; t_stat aws_stat = MTSE_UNATT; int32 saved_switches = sim_switches; srand (0); /* All devices use the same random sequence for file data */ if (max_size == 0) max_size = MAX_RECORD_SIZE; if (!p7b_parity_inited) { for (i=0; i < 64; i++) { int bit_count = 0; for (j=0; j<6; j++) { if (i & (1 << j)) ++bit_count; |
︙ | ︙ | |||
3344 3345 3346 3347 3348 3349 3350 3351 3352 | sprintf (name, "%s.2.tar", filename); fTAR2 = fopen (name, "wb"); if (fTAR2 == NULL) goto Done_Files; sprintf (name, "%s.aws", filename); fAWS = fopen (name, "wb"); if (fAWS == NULL) goto Done_Files; sprintf (name, "aws %s.aws.tape", filename); | > > > > > > > > < > > > > > > > > > > > | 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 | sprintf (name, "%s.2.tar", filename); fTAR2 = fopen (name, "wb"); if (fTAR2 == NULL) goto Done_Files; sprintf (name, "%s.aws", filename); fAWS = fopen (name, "wb"); if (fAWS == NULL) goto Done_Files; sprintf (name, "%s.2.aws", filename); fAWS2 = fopen (name, "wb"); if (fAWS2 == NULL) goto Done_Files; sprintf (name, "%s.3.aws", filename); fAWS3 = fopen (name, "wb"); if (fAWS3 == NULL) goto Done_Files; sprintf (name, "aws %s.aws.tape", filename); sim_switches = SWMASK ('F') | (sim_switches & SWMASK ('D')) | SWMASK ('N'); if (sim_switches & SWMASK ('D')) uptr->dctrl = MTSE_DBG_STR | MTSE_DBG_DAT; aws_stat = sim_tape_attach_ex (uptr, name, (saved_switches & SWMASK ('D')) ? MTSE_DBG_STR | MTSE_DBG_DAT: 0, 0); if (aws_stat != MTSE_OK) { stat = aws_stat; goto Done_Files; } sim_switches = saved_switches; stat = SCPE_OK; for (i=0; i<files; i++) { int rec_size = 1 + (rand () % max_size); awslnt = mtrlnt = tpclnt = rec_size; for (j=0; j<records; j++) { awsrec_typ = AWS_REC; if (sim_switches & SWMASK ('V')) sim_printf ("Writing %d byte record\n", rec_size); for (k=0; k<rec_size; k++) buf[k] = rand () & 0xFF; (void)sim_fwrite (&mtrlnt, sizeof (mtrlnt), 1, fSIMH); (void)sim_fwrite (&mtrlnt, sizeof (mtrlnt), 1, fE11); (void)sim_fwrite (&tpclnt, sizeof (tpclnt), 1, fTPC); (void)sim_fwrite (&awslnt, sizeof (awslnt), 1, fAWS); (void)sim_fwrite (&awslnt_last, sizeof (awslnt_last), 1, fAWS); (void)sim_fwrite (&awsrec_typ, sizeof (awsrec_typ), 1, fAWS); if (i == 0) { (void)sim_fwrite (&awslnt, sizeof (awslnt), 1, fAWS3); (void)sim_fwrite (&awslnt_last, sizeof (awslnt_last), 1, fAWS3); (void)sim_fwrite (&awsrec_typ, sizeof (awsrec_typ), 1, fAWS3); } awslnt_last = awslnt; (void)sim_fwrite (buf, 1, rec_size, fSIMH); (void)sim_fwrite (buf, 1, rec_size, fE11); (void)sim_fwrite (buf, 1, rec_size, fTPC); (void)sim_fwrite (buf, 1, rec_size, fAWS); if (i == 0) (void)sim_fwrite (buf, 1, rec_size, fAWS3); stat = sim_tape_wrrecf (uptr, buf, rec_size); if (MTSE_OK != stat) goto Done_Files; if (rec_size & 1) { (void)sim_fwrite (&tpclnt, 1, 1, fSIMH); (void)sim_fwrite (&tpclnt, 1, 1, fTPC); } |
︙ | ︙ | |||
3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 | (void)sim_fwrite (&mtrlnt, sizeof (mtrlnt), 1, fE11); (void)sim_fwrite (&tpclnt, sizeof (tpclnt), 1, fTPC); buf[0] = P7B_SOR | P7B_EOF; (void)sim_fwrite (buf, 1, 1, fP7B); (void)sim_fwrite (&awslnt, sizeof (awslnt), 1, fAWS); (void)sim_fwrite (&awslnt_last, sizeof (awslnt_last), 1, fAWS); (void)sim_fwrite (&awsrec_typ, sizeof (awsrec_typ), 1, fAWS); awslnt_last = 0; stat = sim_tape_wrtmk (uptr); if (MTSE_OK != stat) goto Done_Files; } mtrlnt = tpclnt = 0; (void)sim_fwrite (&mtrlnt, sizeof (mtrlnt), 1, fSIMH); (void)sim_fwrite (&mtrlnt, sizeof (mtrlnt), 1, fE11); (void)sim_fwrite (&tpclnt, sizeof (tpclnt), 1, fTPC); awslnt_last = awslnt; awsrec_typ = AWS_TMK; | > > > > > > > > > > > | 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 | (void)sim_fwrite (&mtrlnt, sizeof (mtrlnt), 1, fE11); (void)sim_fwrite (&tpclnt, sizeof (tpclnt), 1, fTPC); buf[0] = P7B_SOR | P7B_EOF; (void)sim_fwrite (buf, 1, 1, fP7B); (void)sim_fwrite (&awslnt, sizeof (awslnt), 1, fAWS); (void)sim_fwrite (&awslnt_last, sizeof (awslnt_last), 1, fAWS); (void)sim_fwrite (&awsrec_typ, sizeof (awsrec_typ), 1, fAWS); if (i == 0) { (void)sim_fwrite (&awslnt, sizeof (awslnt), 1, fAWS3); (void)sim_fwrite (&awslnt_last, sizeof (awslnt_last), 1, fAWS3); (void)sim_fwrite (&awsrec_typ, sizeof (awsrec_typ), 1, fAWS3); } awslnt_last = 0; stat = sim_tape_wrtmk (uptr); if (MTSE_OK != stat) goto Done_Files; if (i == 0) { mtrlnt = MTR_GAP; for (j=0; j<rec_size; j++) (void)sim_fwrite (&mtrlnt, sizeof (mtrlnt), 1, fSIMH); mtrlnt = 0; } } mtrlnt = tpclnt = 0; (void)sim_fwrite (&mtrlnt, sizeof (mtrlnt), 1, fSIMH); (void)sim_fwrite (&mtrlnt, sizeof (mtrlnt), 1, fE11); (void)sim_fwrite (&tpclnt, sizeof (tpclnt), 1, fTPC); awslnt_last = awslnt; awsrec_typ = AWS_TMK; |
︙ | ︙ | |||
3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 | for (j=0; j<records; j++) { memset (buf, j, 10240); (void)sim_fwrite (buf, 1, 10240, fTAR); (void)sim_fwrite (buf, 1, 10240, fTAR2); } memset (buf, j, 10240); (void)sim_fwrite (buf, 1, 5120, fTAR2); Done_Files: if (fSIMH) fclose (fSIMH); if (fE11) fclose (fE11); if (fTPC) fclose (fTPC); if (fP7B) fclose (fP7B); if (fAWS) fclose (fAWS); if (fTAR) fclose (fTAR); if (fTAR2) fclose (fTAR2); free (buf); | > > > > > > > > > > > > | | > > > > > > > > | > > > > > > > > > > > > > > > > | 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 | for (j=0; j<records; j++) { memset (buf, j, 10240); (void)sim_fwrite (buf, 1, 10240, fTAR); (void)sim_fwrite (buf, 1, 10240, fTAR2); } memset (buf, j, 10240); (void)sim_fwrite (buf, 1, 5120, fTAR2); for (j=0; j<3; j++) { awslnt_last = awslnt = 0; awsrec_typ = AWS_TMK; (void)sim_fwrite (&awslnt, sizeof (awslnt), 1, fAWS2); (void)sim_fwrite (&awslnt_last, sizeof (awslnt_last), 1, fAWS2); (void)sim_fwrite (&awsrec_typ, sizeof (awsrec_typ), 1, fAWS2); } Done_Files: if (fSIMH) fclose (fSIMH); if (fE11) fclose (fE11); if (fTPC) fclose (fTPC); if (fP7B) fclose (fP7B); if (fAWS) fclose (fAWS); if (fAWS2) fclose (fAWS2); if (fAWS3) fclose (fAWS3); if (fTAR) fclose (fTAR); if (fTAR2) fclose (fTAR2); free (buf); if (aws_stat == MTSE_OK) sim_tape_detach (uptr); if (stat == SCPE_OK) { char name1[CBUFSIZE], name2[CBUFSIZE]; sprintf (name1, "\"%s.aws\"", filename); sprintf (name2, "\"%s.aws.tape\"", filename); sim_switches = SWMASK ('F'); if (sim_cmp_string (name1, name2)) stat = 1; } sim_switches = saved_switches; return stat; } static t_stat sim_tape_test_process_tape_file (UNIT *uptr, const char *filename, const char *format, t_awslnt recsize) { char args[256]; char str_recsize[16] = ""; t_stat stat; if (recsize) { sim_switches |= SWMASK ('B'); sprintf (str_recsize, " %d", (int)recsize); } if (NULL == strchr (filename, '*')) sprintf (args, "%s%s %s.%s", format, str_recsize, filename, format); else sprintf (args, "%s%s %s", format, str_recsize, filename); sim_tape_detach (uptr); sim_switches |= SWMASK ('F') | SWMASK ('L'); /* specific-format and detailed record report */ stat = sim_tape_attach_ex (uptr, args, 0, 0); if (stat != SCPE_OK) return stat; sim_tape_detach (uptr); sim_switches = 0; return SCPE_OK; } static t_stat sim_tape_test_remove_tape_files (UNIT *uptr, const char *filename) { char name[256]; sprintf (name, "%s.simh", filename); (void)remove (name); sprintf (name, "%s.2.simh", filename); (void)remove (name); sprintf (name, "%s.e11", filename); (void)remove (name); sprintf (name, "%s.2.e11", filename); (void)remove (name); sprintf (name, "%s.tpc", filename); (void)remove (name); sprintf (name, "%s.2.tpc", filename); (void)remove (name); sprintf (name, "%s.p7b", filename); (void)remove (name); sprintf (name, "%s.2.p7b", filename); (void)remove (name); sprintf (name, "%s.aws", filename); (void)remove (name); sprintf (name, "%s.2.aws", filename); (void)remove (name); sprintf (name, "%s.3.aws", filename); (void)remove (name); sprintf (name, "%s.tar", filename); (void)remove (name); sprintf (name, "%s.2.tar", filename); (void)remove (name); sprintf (name, "%s.3.tar", filename); (void)remove (name); sprintf (name, "%s.aws.tape", filename); (void)remove (name); return SCPE_OK; } static t_stat sim_tape_test_density_string (void) { char buf[128]; int32 valid_bits = 0; |
︙ | ︙ | |||
3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 | return sim_messagef (SCPE_ARG, "stat was: %s, got string: %s\n", sim_error_text (stat), buf); valid_bits = MT_NONE_VALID | MT_800_VALID | MT_1600_VALID | MT_6250_VALID; if ((SCPE_OK != (stat = sim_tape_density_supported (buf, sizeof (buf), valid_bits))) || (strcmp (buf, "{0|800|1600|6250}"))) return sim_messagef (SCPE_ARG, "stat was: %s, got string: %s\n", sim_error_text (stat), buf); return SCPE_OK; } #include <setjmp.h> t_stat sim_tape_test (DEVICE *dptr) { int32 saved_switches = sim_switches; SIM_TEST_INIT; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > | > | > | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | > > > > > | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > | > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 | return sim_messagef (SCPE_ARG, "stat was: %s, got string: %s\n", sim_error_text (stat), buf); valid_bits = MT_NONE_VALID | MT_800_VALID | MT_1600_VALID | MT_6250_VALID; if ((SCPE_OK != (stat = sim_tape_density_supported (buf, sizeof (buf), valid_bits))) || (strcmp (buf, "{0|800|1600|6250}"))) return sim_messagef (SCPE_ARG, "stat was: %s, got string: %s\n", sim_error_text (stat), buf); return SCPE_OK; } static struct classify_test { const char *testname; const char *testdata; size_t expected_mrs; t_bool expected_lf_lines; t_bool expected_crlf_lines; const char *success_attach_args; const char *fail_attach_args; } classify_tests[] = { {"TapeTest-Classify-80.txt", "Now is the time for all good men to come to the aid of their country.~~~~~~~~~~~\r\n", 80, FALSE, TRUE, "-fb FIXED 80"}, {"TapeTest-Classify-80-lf.txt", "Now is the time for all good men to come to the aid of their country.~~~~~~~~~~~\n", 80, TRUE, FALSE, "-fb FIXED 80"}, {"TapeTest-Classify-508.txt", "A really long line of text (512 - 4 = 508 characters) 64646464641281281281281281" "28128128128128128128128128128128128128128128128125625625625625625625625625625625" "62562562562562562562562562562562256256256256256256256256256256256256256256256256" "25625625625625625125125125125125125125125125125125125125125125125125125125125125" "51251251251251251251251251251251251251251251251251251251251251255125125125125125" "12512512512512512512512512512512512512512512512551251251251251251251251251251251" "2512512512512512512512512512\r\n", 508, FALSE, TRUE, "-fb FIXED 512"}, {"TapeTest-Classify-512.txt", "A really long line of text (516 - 4 = 512 characters) 64646464641281281281281281" "28128128128128128128128128128128128128128128128125625625625625625625625625625625" "62562562562562562562562562562562256256256256256256256256256256256256256256256256" "25625625625625625125125125125125125125125125125125125125125125125125125125125125" "51251251251251251251251251251251251251251251251251251251251251255125125125125125" "12512512512512512512512512512512512512512512512551251251251251251251251251251251" "2512512512512512512512512512~~~~\r\n", 512, FALSE, TRUE, "-fb FIXED 516", "-fb ANSI-VMS 512"}, {"TapeTest-Classify-82.bin", "Now is the time for all good men to come to the aid of their country.\001\002~~~~~~~~~\r\n" "Now is the time for all good men to come to the aid of their country.\001\002~~~~~~~~~\r\n", 512, FALSE, FALSE, "-fb FIXED 82"}, {NULL} }; static t_stat sim_tape_test_classify_file_contents (UNIT *uptr) { struct classify_test *t; FILE *f; size_t mrs; t_bool lf_lines; t_bool crlf_lines; for (t = classify_tests; t->testname != NULL; t++) { (void)remove (t->testname); f = fopen (t->testname, "wb+"); if (f == NULL) return sim_messagef (SCPE_ARG, "Error creating test file '%s' - %s\n", t->testname, strerror (errno)); fprintf (f, "%s", t->testdata); tape_classify_file_contents (f, &mrs, &lf_lines, &crlf_lines); fclose (f); if ((mrs != t->expected_mrs) || (lf_lines != t->expected_lf_lines) || (crlf_lines != t->expected_crlf_lines)) return sim_messagef (SCPE_ARG, "%s was unexpectedly reported to having MRS=%d, lf_lines=%s, crlf_lines=%s\n", t->testname, (int)mrs, lf_lines ? "true" : "false", crlf_lines ? "true" : "false"); if (t->success_attach_args) { char args[CBUFSIZE*2]; t_stat r; snprintf (args, sizeof (args), "%s %s %s", sim_uname (uptr), t->success_attach_args, t->testname); r = attach_cmd (0, args); if (r != SCPE_OK) return sim_messagef (r, "ATTACH %s failed\n", args); detach_unit (uptr); } if (t->fail_attach_args) { char args[CBUFSIZE*2]; t_stat r; snprintf (args, sizeof (args), "%s %s %s", sim_uname (uptr), t->fail_attach_args, t->testname); r = attach_cmd (0, args); if (r == SCPE_OK) { detach_unit (uptr); return sim_messagef (r, "** UNEXPECTED ATTACH SUCCESS ** %s\n", args); } } (void)remove (t->testname); } return SCPE_OK; } #include <setjmp.h> t_stat sim_tape_test (DEVICE *dptr) { int32 saved_switches = sim_switches; SIM_TEST_INIT; if (dptr->units->flags & UNIT_ATT) return sim_messagef (SCPE_ALATT, "The %s device must be detached to run the sim_tape library API tests.\n", sim_uname(dptr->units)); sim_printf ("\nTesting %s device sim_tape library APIs\n", sim_uname(dptr->units)); SIM_TEST(sim_tape_test_density_string ()); SIM_TEST(sim_tape_test_classify_file_contents (dptr->units)); SIM_TEST(sim_tape_test_remove_tape_files (dptr->units, "TapeTestFile1")); SIM_TEST(sim_tape_test_create_tape_files (dptr->units, "TapeTestFile1", 2, 5, 4096)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1.*", "ansi-vms", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1.*", "ansi-rsx11", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1.*", "ansi-rt11", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1.*", "ansi-rsts", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1.*", "ansi-var", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "tar", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "aws", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1.3", "aws", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1.2", "aws", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1.2", "tar", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "aws", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "p7b", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "tpc", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "e11", 0)); sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "simh", 0)); sim_switches = saved_switches; if ((sim_switches & SWMASK ('D')) == 0) SIM_TEST(sim_tape_test_remove_tape_files (dptr->units, "TapeTestFile1")); return SCPE_OK; } static void ansi_date (time_t datetime, char date[6], t_bool y2k_date_bug) { struct tm *lt; char buf[20]; lt = localtime (&datetime); if (y2k_date_bug) sprintf (buf, " %c%c%03d", '0' + (lt->tm_year / 10), '0' + (lt->tm_year % 10), lt->tm_yday + 1); else sprintf (buf, "%c%02d%03d", (lt->tm_year < 100) ? ' ' : '0' + (lt->tm_year/100 - 1), lt->tm_year % 100, lt->tm_yday + 1); memcpy (date, buf, 6); } /* * This isn't quite ANSI 'a' since several ANSI allowed characters * are either illegal file names on many DEC systems or are confusing * to OS file name parsers. */ static void to_ansi_a (char *out, const char *in, size_t size) { memset (out, ' ', size); while (size--) { if (isupper (*in) || isdigit (*in)) *(out++) = *in++; else { if (*in == '\0') break; if (islower (*in)) { *(out++) = toupper (*in); ++in; } else { if (strchr ("-.$_/", *in)) *(out++) = *in++; else ++in; } } } } static void ansi_make_VOL1 (VOL1 *vol, const char *ident, uint32 ansi_type) { memset (vol, ' ', sizeof (*vol)); memcpy (vol->type, "VOL", 3); vol->num = '1'; to_ansi_a (vol->ident, ident, sizeof (vol->ident)); vol->standard = ansi_args[ansi_type].vol1_standard; } static void ansi_make_HDR1 (HDR1 *hdr1, VOL1 *vol, HDR4 *hdr4, const char *filename, uint32 ansi_type) { const char *fn; struct stat statb; char extra_name_used[3] = "00"; char *fn_cpy, *c, *ext; memset (&statb, 0, sizeof (statb)); (void)stat (filename, &statb); if (!(fn = strrchr (filename, '/')) && !(fn = strrchr (filename, '\\'))) fn = filename; else ++fn; /* skip over slash or backslash */ fn_cpy = (char *)malloc (strlen (fn) + 1); strcpy (fn_cpy, fn); fn = fn_cpy; ext = strrchr (fn_cpy, '.'); if (ext) { while (((c = strchr (fn_cpy, '.')) != NULL) && (c != ext)) *c = '_'; /* translate extra .'s to _ */ } memset (hdr1, ' ', sizeof (*hdr1)); memcpy (hdr1->type, "HDR", 3); hdr1->num = '1'; memset (hdr4, ' ', sizeof (*hdr1)); memcpy (hdr4->type, "HDR", 3); hdr4->num = '4'; to_ansi_a (hdr1->file_ident, fn, sizeof (hdr1->file_ident)); if (strlen (fn) > 17) { to_ansi_a (hdr4->extra_name, fn + 17, sizeof (hdr4->extra_name)); sprintf (extra_name_used, "%02d", (int)(strlen (fn) - 17)); } memcpy (hdr4->extra_name_used, extra_name_used, 2); memcpy (hdr1->file_set, vol->ident, sizeof (hdr1->file_set)); memcpy (hdr1->file_section, "0001", 4); memcpy (hdr1->file_sequence, "0001", 4); memcpy (hdr1->generation_number, "0001", 4); /* generation_number and version_number */ memcpy (hdr1->version_number, "00", 2); /* combine to produce VMS version # ;1 here */ ansi_date (statb.st_mtime, hdr1->creation_date, ansi_args[ansi_type].y2k_date_bug); memcpy (hdr1->expiration_date, " 00000", 6); memcpy (hdr1->block_count, "000000", 6); to_ansi_a (hdr1->system_code, ansi_args[ansi_type].system_code, sizeof (hdr1->system_code)); free (fn_cpy); } static void ansi_make_HDR2 (HDR2 *hdr, t_bool fixed_record, size_t block_size, size_t record_size, uint32 ansi_type) { char size[12]; struct ansi_tape_parameters *ansi = &ansi_args[ansi_type]; memset (hdr, ' ', sizeof (*hdr)); memcpy (hdr->type, "HDR", 3); hdr->num = '2'; hdr->record_format = ansi->record_format ? ansi->record_format : (fixed_record ? 'F' : 'D'); sprintf (size, "%05d", (int)block_size); memcpy (hdr->block_length, size, sizeof (hdr->block_length)); sprintf (size, "%05d", (ansi->zero_record_length) ? 0 : (int)record_size); memcpy (hdr->record_length, size, sizeof (hdr->record_length)); hdr->carriage_control = ansi->carriage_control ? ansi->carriage_control : (fixed_record ? 'M' : ' '); memcpy (hdr->buffer_offset, "00", 2); } static void ansi_fill_text_buffer (FILE *f, char *buf, size_t buf_size, size_t record_skip_ending, t_bool fixed_text) { long start; char *tmp = (char *)calloc (2 + buf_size, sizeof (*buf)); size_t offset = 0; while (1) { size_t rec_size; char rec_size_str[16]; start = ftell (f); if (start < 0) break; if (!fgets (tmp, buf_size, f)) break; rec_size = strlen (tmp); if (!fixed_text) { if (rec_size >= record_skip_ending) rec_size -= record_skip_ending; if ((rec_size + 4) > (int)(buf_size - offset)) { /* room for record? */ (void)fseek (f, start, SEEK_SET); break; } sprintf (rec_size_str, "%04u", (int)(rec_size + 4)); memcpy (buf + offset, rec_size_str, 4); memcpy (buf + offset + 4, tmp, rec_size); offset += 4 + rec_size; } else { size_t move_size; if ((tmp[rec_size - 2] != '\r') && (tmp[rec_size - 1] == '\n')) { memcpy (&tmp[rec_size - 1], "\r\n", 3); rec_size += 1; } if (offset + rec_size < buf_size) move_size = rec_size; else move_size = buf_size - offset; /* We've got a line that stradles a block boundary */ memcpy (buf + offset, tmp, move_size); offset += move_size; if (offset == buf_size) { (void)fseek (f, start + move_size, SEEK_SET); break; } } } if (buf_size > offset) { if (fixed_text) memset (buf + offset, 0, buf_size - offset); else memset (buf + offset, '^', buf_size - offset); } free (tmp); } static t_bool memory_tape_add_block (MEMORY_TAPE *tape, uint8 *block, uint32 size) { TAPE_RECORD *rec; ASSURE((size == 0) == (block == NULL)); if (tape->array_size <= tape->record_count) { TAPE_RECORD **new_records; new_records = (TAPE_RECORD **)realloc (tape->records, (tape->array_size + 1000) * sizeof (*tape->records)); if (new_records == NULL) return TRUE; /* no memory error */ tape->records = new_records; memset (tape->records + tape->array_size, 0, 1000 * sizeof (*tape->records)); tape->array_size += 1000; } rec = (TAPE_RECORD *)malloc (sizeof (*rec) + size); if (rec == NULL) return TRUE; /* no memory error */ rec->size = size; memcpy (rec->data, block, size); tape->records[tape->record_count++] = rec; return FALSE; } static void memory_free_tape (void *vtape) { uint32 i; MEMORY_TAPE *tape = (MEMORY_TAPE *)vtape; if (tape == NULL) return; for (i = 0; i < tape->record_count; i++) { free (tape->records[i]); tape->records[i] = NULL; } free (tape->records); free (tape); } MEMORY_TAPE *memory_create_tape (void) { MEMORY_TAPE *tape = (MEMORY_TAPE *)calloc (1, sizeof (*tape)); if (NULL == tape) return tape; tape->ansi_type = -1; return tape; } static const char rad50[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ%.%0123456789"; static uint16 dos11_ascR50(char *inbuf) { uint16 value; value = (strchr (rad50, *inbuf++) - rad50) * 03100; value += (strchr (rad50, *inbuf++) - rad50) * 050; value += (strchr (rad50, *inbuf++) - rad50); return value; } /* * Sanitize a filename to generate a DOS-11 compatible version. Ignore * non-alphanumerics, upper case lower case characters and terminate on '.' */ static void dos11_sanitize(char *buf, int len, const char *inbuf) { while ((len != 0) && (*inbuf != '\0') && (*inbuf !='.')) { char ch = toupper (*inbuf++); if (isalnum(ch)) { *buf++ = ch; len--; } } } static int dos11_copy_ascii_file (FILE *f, MEMORY_TAPE *tape, char *buf, size_t bufSize) { char ch, tmp[512]; t_bool crlast = FALSE; int error = 0; size_t i, data_read, offset = 0; while (!feof (f) && !error) { data_read = fread (tmp, 1, sizeof (tmp), f); if (data_read > 0) for (i = 0; i < data_read; i++) { ch = tmp[i]; if (ch == '\n') { if (!crlast) { buf[offset++] = '\r'; if (offset == bufSize) { error = memory_tape_add_block (tape, (uint8 *)buf, bufSize); offset = 0; } } buf[offset++] = ch; if (offset == bufSize) { error = memory_tape_add_block (tape, (uint8 *)buf, bufSize); offset = 0; } crlast = FALSE; } else { crlast = ch == '\r'; buf[offset++] = ch; if (offset == bufSize) { error = memory_tape_add_block (tape, (uint8 *)buf, bufSize); offset = 0; } } } } if (offset > 0) { /* RSTS COPY to a DOS volume pads the last block with zeros */ /* VMS EXCHANGE COPY /RECORD_FORMAT=STREAM and RSX-11 FLX /FA */ /* output to a DOS volume do not */ /* DOS-11 ignores NULs in ASCII data transfer modes */ memset (buf + offset, 0, bufSize - offset); error = memory_tape_add_block (tape, (uint8 *)buf, bufSize); } return error; } static void sim_tape_add_dos11_entry (const char *directory, const char *filename, t_offset FileSize, const struct stat *filestat, void *context) { MEMORY_TAPE *tape = (MEMORY_TAPE *)context; char FullPath[PATH_MAX + 1]; FILE *f; size_t max_record_size; t_bool lf_line_endings; t_bool crlf_line_endings; uint8 *block = NULL; int error = 0; DOS11_HDR hdr; char fname[9], ext[3]; const char *ptr; struct tm *tm; time_t filetime; uint16 fileday; int year; /* * Compute a suitable year for file creation date. This year will have the * same calendar as the current year but will be in the 20th century so that * DOS/BATCH-11 will be able to interpret it correctly. */ filetime = (time_t)filestat->st_ctime; tm = localtime (&filetime); year = tm->tm_year + 1900; while (year >= 2000) year -= 28; fileday = 1000 * ((year - 70) % 100) + tm->tm_yday + 1; sprintf (FullPath, "%s%s", directory, filename); f = tape_open_and_check_file (FullPath); if (f == NULL) return; tape_classify_file_contents (f, &max_record_size, &lf_line_endings, &crlf_line_endings); memset (&hdr, 0, sizeof (hdr)); memset (fname, ' ', sizeof (fname)); memset (ext, ' ', sizeof (ext)); dos11_sanitize (fname, sizeof (fname), filename); ptr = strchr (filename, '.'); if (ptr != NULL) dos11_sanitize (ext, sizeof (ext), ++ptr); /* * If we were unable to generate a valid DOS11 filename, generate one based * on the file number on the tape (000000 - 999999). */ if (fname[0] == ' ') { char temp[10]; sprintf(temp, "%06u ", tape->file_count % 100000); memcpy(fname, temp, sizeof(fname)); } hdr.fname[0] = dos11_ascR50 (&fname[0]); hdr.fname[1] = dos11_ascR50 (&fname[3]); hdr.ext = dos11_ascR50 (&ext[0]); hdr.prog = 1; hdr.proj = 1; hdr.prot = DOS11_PROT; hdr.date = fileday; hdr.fname3 = dos11_ascR50 (&fname[6]); memory_tape_add_block (tape, (uint8 *)&hdr, sizeof (hdr)); rewind (f); block = (uint8 *)calloc (tape->block_size, 1); if (lf_line_endings || crlf_line_endings) error = dos11_copy_ascii_file (f, tape, (char *)block, tape->block_size); else { size_t data_read; while (!feof (f) && !error) { data_read = fread (block, 1, tape->block_size, f); if (data_read > 0) error = memory_tape_add_block (tape, block, data_read); } } fclose (f); free (block); memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ ++tape->file_count; } static FILE *tape_open_and_check_file (const char *filename) { FILE *file = fopen(filename, "rb"); if (file != NULL) { struct stat statb; memset (&statb, 0, sizeof (statb)); if (fstat (fileno (file), &statb) == 0) { if (((S_IFDIR | S_IFREG) & statb.st_mode) == S_IFREG) return file; sim_printf ("Can't put a %s on tape: %s\n", statb.st_mode & S_IFREG ? "directory" : "non regular file", filename); fclose (file); return NULL; } sim_printf ("Can't stat: %s\n", filename); fclose (file); return NULL; } sim_printf ("Can't open: %s - %s\n", filename, strerror (errno)); return NULL; } static int tape_classify_file_contents (FILE *f, size_t *max_record_size, t_bool *lf_line_endings, t_bool *crlf_line_endings) { long pos = -1; long last_cr = -1; long line_start = 0; int chr; t_bool non_print_chars = FALSE; long lf_lines = 0; long crlf_lines = 0; *max_record_size = 0; *lf_line_endings = FALSE; *crlf_line_endings = FALSE; rewind (f); while (EOF != (chr = fgetc (f))) { ++pos; if (!isprint (chr) && (chr != '\r') && (chr != '\n') && (chr != '\t') && (chr != '\f')) { non_print_chars = TRUE; break; } if (chr == '\r') last_cr = pos; if (chr == '\n') { long line_size; if (last_cr == (pos - 1)) { ++crlf_lines; line_size = pos - line_start - 1; } else { ++lf_lines; line_size = pos - line_start; } if (line_size > (long)(*max_record_size)) *max_record_size = line_size; line_start = pos + 1; } } rewind (f); /* Binary file */ if (non_print_chars) *max_record_size = 512; /* Text file */ else { if ((crlf_lines > 0) && (lf_lines == 0)) { *lf_line_endings = FALSE; *crlf_line_endings = TRUE; } else { if ((lf_lines > 0) && (crlf_lines == 0)) { *lf_line_endings = TRUE; *crlf_line_endings = FALSE; } } } return 0; } MEMORY_TAPE *ansi_create_tape (const char *label, uint32 block_size, uint32 ansi_type) { MEMORY_TAPE *tape = memory_create_tape (); if (NULL == tape) return tape; tape->block_size = block_size; tape->ansi_type = ansi_type; ansi_make_VOL1 (&tape->vol1, label, ansi_type); memory_tape_add_block (tape, (uint8 *)&tape->vol1, sizeof (tape->vol1)); return tape; } static int ansi_add_file_to_tape (MEMORY_TAPE *tape, const char *filename) { FILE *f; struct ansi_tape_parameters *ansi = &ansi_args[tape->ansi_type]; uint8 *block = NULL; size_t rms_record_size, max_record_size; t_bool lf_line_endings, crlf_line_endings; char file_sequence[5]; int block_count = 0; char block_count_string[17]; int error = FALSE; HDR1 hdr1; HDR2 hdr2; HDR3 hdr3; HDR4 hdr4; f = tape_open_and_check_file (filename); if (f == NULL) return TRUE; tape_classify_file_contents (f, &rms_record_size, &lf_line_endings, &crlf_line_endings); if (!lf_line_endings && !crlf_line_endings) { /* Binary File? */ max_record_size = rms_record_size; } else { /* Text file */ if (ansi->fixed_text) { /* ANSI-RT11 and ANSI-RSTS text files are unformatted, i.e., a stream of bytes */ max_record_size = rms_record_size = 512; /* max_record_size must fit */ ASSURE((tape->block_size == 512)); /* ANSI-RT11 and ANSI-RSTS are forced to use -B 512, above */ } else { /* All other ANSI formats use D Record Format */ /* Add the 4-character ANSI RCW and the length of the line endings to rms_record_size */ max_record_size = 4 + rms_record_size + (crlf_line_endings ? 2 - ansi->skip_crlf_line_endings : 1 - ansi->skip_lf_line_endings); /* max_record_size must fit in the 4-character ANSI RCW */ if (max_record_size > 9999) { size_t max_allowed = 9999 - 4 - (crlf_line_endings ? 2 - ansi->skip_crlf_line_endings : 1 - ansi->skip_lf_line_endings); sim_messagef (SCPE_ARG, "Text file: %s has lines longer (%d) than %s format allows (%d)\n", filename, (int)rms_record_size, ansi->name, (int)max_allowed); fclose (f); return TRUE; } } } /* max_record_size must be no greater than the block size */ if (max_record_size > tape->block_size) { sim_messagef (SCPE_ARG, "%s file: %s requires a minimum block size of %d\n", (lf_line_endings || crlf_line_endings) ? "Text" : "Binary", filename, (int)max_record_size); fclose (f); return TRUE; } ansi_make_HDR1 (&hdr1, &tape->vol1, &hdr4, filename, tape->ansi_type); sprintf (file_sequence, "%04d", 1 + tape->file_count); memcpy (hdr1.file_sequence, file_sequence, sizeof (hdr1.file_sequence)); ansi_make_HDR2 (&hdr2, !lf_line_endings && !crlf_line_endings, tape->block_size, max_record_size, tape->ansi_type); if (!(ansi->nohdr3)) { /* Need HDR3? */ char size[5]; if (!lf_line_endings && !crlf_line_endings) /* Binary File? */ memcpy (&hdr3, ansi->hdr3_fixed, sizeof (hdr3)); else { /* Text file */ if (lf_line_endings && !(ansi->fixed_text)) memcpy (&hdr3, ansi->hdr3_lf_line_endings, sizeof (hdr3)); else memcpy (&hdr3, ansi->hdr3_crlf_line_endings, sizeof (hdr3)); } sprintf (size, "%04x", (uint16)rms_record_size); memcpy (hdr3.rms_attributes, size, 4); } memory_tape_add_block (tape, (uint8 *)&hdr1, sizeof (hdr1)); if (!(ansi->nohdr2)) memory_tape_add_block (tape, (uint8 *)&hdr2, sizeof (hdr2)); if (!(ansi->nohdr3)) memory_tape_add_block (tape, (uint8 *)&hdr3, sizeof (hdr3)); if ((0 != memcmp (hdr4.extra_name_used, "00", 2)) && !(ansi->nohdr3) && !(ansi->nohdr2)) memory_tape_add_block (tape, (uint8 *)&hdr4, sizeof (hdr4)); memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ rewind (f); block = (uint8 *)calloc (tape->block_size, 1); while (!feof (f) && !error) { size_t data_read = tape->block_size; if (lf_line_endings || crlf_line_endings) /* Text file? */ ansi_fill_text_buffer (f, (char *)block, tape->block_size, crlf_line_endings ? ansi->skip_crlf_line_endings : ansi->skip_lf_line_endings, ansi->fixed_text); else { /* Binary file */ size_t runt; data_read = fread (block, 1, tape->block_size, f); runt = data_read % max_record_size; /* data_read (=0) % 0 == 0 */ /* Pad short records with zeros */ if (runt > 0) { size_t nPad = max_record_size - runt; memset (block + data_read, 0, nPad); data_read += nPad; } } if (data_read > 0) { error = memory_tape_add_block (tape, block, data_read); if (!error) ++block_count; } } fclose (f); free (block); memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ memcpy (hdr1.type, "EOF", sizeof (hdr1.type)); memcpy (hdr2.type, "EOF", sizeof (hdr2.type)); memcpy (hdr3.type, "EOF", sizeof (hdr3.type)); memcpy (hdr4.type, "EOF", sizeof (hdr4.type)); sprintf (block_count_string, "%06d", block_count); memcpy (hdr1.block_count, block_count_string, sizeof (hdr1.block_count)); memory_tape_add_block (tape, (uint8 *)&hdr1, sizeof (hdr1)); if (!(ansi->nohdr2)) memory_tape_add_block (tape, (uint8 *)&hdr2, sizeof (hdr2)); if (!(ansi->nohdr3)) memory_tape_add_block (tape, (uint8 *)&hdr3, sizeof (hdr3)); if ((0 != memcmp (hdr4.extra_name_used, "00", 2)) && !(ansi->nohdr3) && !(ansi->nohdr2)) memory_tape_add_block (tape, (uint8 *)&hdr4, sizeof (hdr4)); memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ if (sim_switches & SWMASK ('V')) sim_messagef (SCPE_OK, "%17.17s%62.62s\n\t%d blocks of data\n", hdr1.file_ident, hdr4.extra_name, block_count); ++tape->file_count; return error; } static void sim_tape_add_ansi_entry (const char *directory, const char *filename, t_offset FileSize, const struct stat *filestat, void *context) { MEMORY_TAPE *tape = (MEMORY_TAPE *)context; char FullPath[PATH_MAX + 1]; sprintf (FullPath, "%s%s", directory, filename); (void)ansi_add_file_to_tape (tape, FullPath); } /* export an existing tape to a SIMH tape image */ static t_stat sim_export_tape (UNIT *uptr, const char *export_file) { t_stat r; FILE *f; t_addr saved_pos = uptr->pos; uint8 *buf = NULL; t_mtrlnt bc, sbc; t_mtrlnt max = MTR_MAXLEN; if ((export_file == NULL) || (*export_file == '\0')) return sim_messagef (SCPE_ARG, "Missing tape export file specification\n"); f = fopen (export_file, "wb"); if (f == NULL) return sim_messagef (SCPE_OPENERR, "Can't open SIMH tape image file: %s - %s\n", export_file, strerror (errno)); buf = (uint8 *)calloc (max, 1); if (buf == NULL) { fclose (f); return SCPE_MEM; } r = sim_tape_rewind (uptr); while (r == SCPE_OK) { r = sim_tape_rdrecf (uptr, buf, &bc, max); switch (r) { case MTSE_OK: sbc = ((bc + 1) & ~1); /* word alignment for SIMH format data */ if ((1 != sim_fwrite (&bc, sizeof (bc), 1, f)) || (sbc != sim_fwrite (buf, 1, sbc, f)) || (1 != sim_fwrite (&bc, sizeof (bc), 1, f))) r = sim_messagef (SCPE_IOERR, "Error writing file: %s - %s\n", export_file, strerror (errno)); else r = SCPE_OK; break; case MTSE_TMK: bc = 0; if (1 != sim_fwrite (&bc, sizeof (bc), 1, f)) r = sim_messagef (SCPE_IOERR, "Error writing file: %s - %s\n", export_file, strerror (errno)); else r = SCPE_OK; break; default: break; } } if (r == MTSE_EOM) r = SCPE_OK; free (buf); fclose (f); uptr->pos = saved_pos; return r; } |
︙ | ︙ | |||
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #define P7B_SOR 0x80 /* start of record */ #define P7B_PAR 0x40 /* parity */ #define P7B_DATA 0x3F /* data */ #define P7B_DPAR (P7B_PAR|P7B_DATA) /* data and parity */ #define P7B_EOF 0x0F /* eof character */ /* AWS tape format */ typedef uint16 t_awslnt; /* magtape rec lnt */ typedef struct { t_awslnt nxtlen; t_awslnt prelen; t_awslnt rectyp; #define AWS_TMK 0x0040 #define AWS_REC 0x00A0 } t_awshdr; /* TAR tape format */ #define TAR_DFLT_RECSIZE 10240 /* Default Fixed record size */ /* Unit flags */ | > > < < < < < | | | | | | | < > | | | < | > | | > | | | | | | | > > | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | #define P7B_SOR 0x80 /* start of record */ #define P7B_PAR 0x40 /* parity */ #define P7B_DATA 0x3F /* data */ #define P7B_DPAR (P7B_PAR|P7B_DATA) /* data and parity */ #define P7B_EOF 0x0F /* eof character */ /* AWS tape format */ typedef uint16 t_awslnt; /* magtape rec lnt */ typedef struct { t_awslnt nxtlen; t_awslnt prelen; t_awslnt rectyp; #define AWS_TMK 0x0040 #define AWS_REC 0x00A0 } t_awshdr; /* TAR tape format */ #define TAR_DFLT_RECSIZE 10240 /* Default Fixed record size */ /* Unit flags */ #define MTUF_V_UF (UNIT_V_UF + 0) #define MTUF_F_STD 0 /* SIMH format */ #define MTUF_F_E11 1 /* E11 format */ #define MTUF_F_TPC 2 /* TPC format */ #define MTUF_F_P7B 3 /* P7B format */ #define MTUF_F_AWS 4 /* AWS format */ #define MTUF_F_TAR 5 /* TAR format */ /* MT_GET_FMT() >= MTUF_F_ANSI is a MEMORY_TAPE image */ #define MTUF_F_ANSI 6 /* ANSI format */ #define MTUF_F_FIXED 7 /* FIXED format */ #define MTUF_F_DOS11 8 /* DOS11 format */ #define MTAT_F_VMS 0 /* VMS ANSI type */ #define MTAT_F_RSX11 1 /* RSX-11 ANSI type */ #define MTAT_F_RT11 2 /* RT-11 ANSI type */ #define MTAT_F_RSTS 3 /* RSTS ANSI type */ #define MTAT_F_VAR 4 /* RSTS VAR ANSI type */ #define MTUF_WLK UNIT_WLK #define MTUF_WRP (MTUF_WLK | UNIT_RO) #define MT_SET_PNU(u) (u)->dynflags |= UNIT_TAPE_PNU #define MT_CLR_PNU(u) (u)->dynflags &= ~UNIT_TAPE_PNU #define MT_TST_PNU(u) ((u)->dynflags & UNIT_TAPE_PNU) #define MT_SET_INMRK(u) (u)->dynflags = (u)->dynflags | UNIT_TAPE_MRK #define MT_CLR_INMRK(u) (u)->dynflags = (u)->dynflags & ~UNIT_TAPE_MRK #define MT_TST_INMRK(u) ((u)->dynflags & UNIT_TAPE_MRK) #define MT_GET_FMT(u) (((u)->dynflags >> UNIT_V_TAPE_FMT) & ((1 << UNIT_S_TAPE_FMT) - 1)) #define MT_GET_ANSI_TYP(u) (((u)->dynflags >> UNIT_V_TAPE_ANSI) & ((1 << UNIT_S_TAPE_ANSI) - 1)) /* sim_tape_position Position Flags */ #define MTPOS_V_REW 3 #define MTPOS_M_REW (1u << MTPOS_V_REW) /* Rewind First */ #define MTPOS_V_REV 2 #define MTPOS_M_REV (1u << MTPOS_V_REV) /* Reverse Direction */ #define MTPOS_V_OBJ 1 #define MTPOS_M_OBJ (1u << MTPOS_V_OBJ) /* Objects vs Records/Files */ #define MTPOS_V_DLE 4 |
︙ | ︙ |
︙ | ︙ | |||
146 147 148 149 150 151 152 153 154 155 | } #endif /* defined(MS_MIN_GRANULARITY) && (MS_MIN_GRANULARITY != 1) */ t_bool sim_idle_enab = FALSE; /* global flag */ volatile t_bool sim_idle_wait = FALSE; /* global flag */ static int32 sim_calb_tmr = -1; /* the system calibrated timer */ static int32 sim_calb_tmr_last = -1; /* shadow value when at sim> prompt */ static double sim_inst_per_sec_last = 0; /* shadow value when at sim> prompt */ | > > > | > | | | | | > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 | } #endif /* defined(MS_MIN_GRANULARITY) && (MS_MIN_GRANULARITY != 1) */ t_bool sim_idle_enab = FALSE; /* global flag */ volatile t_bool sim_idle_wait = FALSE; /* global flag */ int32 sim_vm_initial_ips = SIM_INITIAL_IPS; static int32 sim_precalibrate_ips = SIM_INITIAL_IPS; static int32 sim_calb_tmr = -1; /* the system calibrated timer */ static int32 sim_calb_tmr_last = -1; /* shadow value when at sim> prompt */ static double sim_inst_per_sec_last = 0; /* shadow value when at sim> prompt */ static uint32 sim_stop_time = 0; /* time when sim_stop_timer_services was called */ double sim_time_at_sim_prompt = 0; /* time spent processing commands from sim> prompt */ static uint32 sim_idle_rate_ms = 0; /* Minimum Sleep time */ static uint32 sim_os_sleep_min_ms = 0; static uint32 sim_os_sleep_inc_ms = 0; static uint32 sim_os_clock_resoluton_ms = 0; static uint32 sim_os_tick_hz = 0; static uint32 sim_idle_stable = SIM_IDLE_STDFLT; static uint32 sim_idle_calib_pct = 100; static double sim_timer_stop_time = 0; static uint32 sim_rom_delay = 0; static uint32 sim_throt_ms_start = 0; static uint32 sim_throt_ms_stop = 0; static uint32 sim_throt_type = 0; static uint32 sim_throt_val = 0; static uint32 sim_throt_drift_pct = SIM_THROT_DRIFT_PCT_DFLT; static uint32 sim_throt_state = SIM_THROT_STATE_INIT; static double sim_throt_cps; static double sim_throt_peak_cps; static double sim_throt_inst_start; static uint32 sim_throt_sleep_time = 0; static int32 sim_throt_wait = 0; static uint32 sim_throt_delay = 3; #define CLK_TPS 100 #define CLK_INIT (sim_precalibrate_ips/CLK_TPS) static int32 sim_int_clk_tps; typedef struct RTC { UNIT *clock_unit; /* registered ticking clock unit */ UNIT *timer_unit; /* points to related clock assist unit (sim_timer_units) */ UNIT *clock_cosched_queue; int32 cosched_interval; uint32 ticks; /* ticks */ uint32 hz; /* tick rate */ uint32 last_hz; /* prior tick rate */ uint32 rtime; /* real time (usecs) */ uint32 vtime; /* virtual time (usecs) */ double gtime; /* instruction time */ uint32 nxintv; /* next interval */ int32 based; /* base delay */ int32 currd; /* current delay */ int32 initd; /* initial delay */ uint32 elapsed; /* seconds since init */ uint32 calibrations; /* calibration count */ double clock_skew_max; /* asynchronous max skew */ double clock_tick_size; /* 1/hz */ uint32 calib_initializations; /* Initialization Count */ double calib_tick_time; /* ticks time */ double calib_tick_time_tot; /* ticks time - total*/ uint32 calib_ticks_acked; /* ticks Acked */ uint32 calib_ticks_acked_tot; /* ticks Acked - total */ uint32 clock_ticks; /* ticks delivered since catchup base */ uint32 clock_ticks_tot; /* ticks delivered since catchup base - total */ double clock_init_base_time; /* reference time for clock initialization */ double clock_tick_start_time; /* reference time when ticking started */ double clock_catchup_base_time; /* reference time for catchup ticks */ uint32 clock_catchup_ticks; /* Record of catchups */ uint32 clock_catchup_ticks_tot; /* Record of catchups - total */ uint32 clock_catchup_ticks_curr;/* Record of catchups in this second */ t_bool clock_catchup_pending; /* clock tick catchup pending */ t_bool clock_catchup_eligible; /* clock tick catchup eligible */ uint32 clock_time_idled; /* total time idled */ uint32 clock_time_idled_last; /* total time idled as of the previous second */ uint32 clock_calib_skip_idle; /* Calibrations skipped due to idling */ uint32 clock_calib_gap2big; /* Calibrations skipped Gap Too Big */ uint32 clock_calib_backwards; /* Calibrations skipped Clock Running Backwards */ } RTC; RTC rtcs[SIM_NTIMERS+1]; UNIT sim_timer_units[SIM_NTIMERS+1];/* Clock assist units */ /* one for each timer and one for an internal */ /* clock if no clocks are registered. */ static t_bool sim_catchup_ticks = TRUE; #if defined (SIM_ASYNCH_CLOCKS) && !defined (SIM_ASYNCH_IO) #undef SIM_ASYNCH_CLOCKS #endif t_bool sim_asynch_timer = FALSE; |
︙ | ︙ | |||
259 260 261 262 263 264 265 | sim_idle_wait = FALSE; pthread_mutex_unlock (&sim_asynch_lock); clock_gettime(CLOCK_REALTIME, &done_time); if (!timedout) { AIO_UPDATE_QUEUE; } sim_timespec_diff (&delta_time, &done_time, &start_time); | | | 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 | sim_idle_wait = FALSE; pthread_mutex_unlock (&sim_asynch_lock); clock_gettime(CLOCK_REALTIME, &done_time); if (!timedout) { AIO_UPDATE_QUEUE; } sim_timespec_diff (&delta_time, &done_time, &start_time); delta_ms = (uint32)((delta_time.tv_sec * 1000) + ((delta_time.tv_nsec + 500000) / 1000000)); return delta_ms; } #else uint32 sim_idle_ms_sleep (unsigned int msec) { return sim_os_ms_sleep (msec); } |
︙ | ︙ | |||
700 701 702 703 704 705 706 | } } /* Forward declarations */ static double _timespec_to_double (struct timespec *time); static void _double_to_timespec (struct timespec *time, double dtime); | | | 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 | } } /* Forward declarations */ static double _timespec_to_double (struct timespec *time); static void _double_to_timespec (struct timespec *time, double dtime); static t_bool _rtcn_tick_catchup_check (RTC *rtc, int32 time); static void _rtcn_configure_calibrated_clock (int32 newtmr); static t_bool _sim_coschedule_cancel (UNIT *uptr); static t_bool _sim_wallclock_cancel (UNIT *uptr); static t_bool _sim_wallclock_is_active (UNIT *uptr); t_stat sim_timer_show_idle_mode (FILE* st, UNIT* uptr, int32 val, CONST void * desc); |
︙ | ︙ | |||
734 735 736 737 738 739 740 | else return 0; } #endif /* defined(SIM_ASYNCH_CLOCKS) */ /* OS independent clock calibration package */ | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | | < < < > > > > > | > | | > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | > | | | | | > > > > > > > | > > | > > | | | | | | | > > | | | > > > > > > | | | | | | > | | | | > > | | | | | | | | > > > > > | | | | | > > > > > > | | | | | | | | | > > > | | < | < > > | | | | | | > | | | | > | | | > | | | | | | | > | | | > | | | | | | | > | | > | | | | | | | | > | > > | | > | | | > > > > > > | | | > > > | | 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 | else return 0; } #endif /* defined(SIM_ASYNCH_CLOCKS) */ /* OS independent clock calibration package */ static uint32 sim_idle_cyc_ms = 0; /* Cycles per millisecond while not idling */ static uint32 sim_idle_cyc_sleep = 0; /* Cycles per minimum sleep interval */ static double sim_idle_end_time = 0.0; /* Time when last idle completed */ UNIT sim_stop_unit; /* Stop unit */ UNIT sim_internal_timer_unit; /* Internal calibration timer */ int32 sim_internal_timer_time; /* Pending internal timer delay */ UNIT sim_throttle_unit; /* one for throttle */ t_stat sim_throt_svc (UNIT *uptr); t_stat sim_timer_tick_svc (UNIT *uptr); t_stat sim_timer_stop_svc (UNIT *uptr); #define DBG_IDL TIMER_DBG_IDLE /* idling */ #define DBG_QUE TIMER_DBG_QUEUE /* queue activities */ #define DBG_MUX TIMER_DBG_MUX /* tmxr queue activities */ #define DBG_TRC 0x008 /* tracing */ #define DBG_CAL 0x010 /* calibration activities */ #define DBG_TIM 0x020 /* timer thread activities */ #define DBG_THR 0x040 /* throttle activities */ #define DBG_ACK 0x080 /* interrupt acknowledgement activities */ #define DBG_CHK 0x100 /* check scheduled activation time*/ #define DBG_INT 0x200 /* internal timer activities */ #define DBG_GET 0x400 /* get_time activities */ #define DBG_TIK 0x800 /* tick activities */ DEBTAB sim_timer_debug[] = { {"TRACE", DBG_TRC, "Trace routine calls"}, {"IDLE", DBG_IDL, "Idling activities"}, {"QUEUE", DBG_QUE, "Event queuing activities"}, {"IACK", DBG_ACK, "interrupt acknowledgement activities"}, {"CALIB", DBG_CAL, "Calibration activities"}, {"TICK", DBG_TIK, "Calibration tick activities"}, {"TIME", DBG_TIM, "Activation and scheduling activities"}, {"GETTIME", DBG_GET, "get_time activities"}, {"INTER", DBG_INT, "Internal timer activities"}, {"THROT", DBG_THR, "Throttling activities"}, {"MUX", DBG_MUX, "Tmxr scheduling activities"}, {"CHECK", DBG_CHK, "Check scheduled activation time"}, {0} }; /* Forward device declarations */ extern DEVICE sim_timer_dev; extern DEVICE sim_throttle_dev; extern DEVICE sim_stop_dev; void sim_rtcn_init_all (void) { int32 tmr; RTC *rtc; for (tmr = 0; tmr <= SIM_NTIMERS; tmr++) { rtc = &rtcs[tmr]; if (rtc->initd != 0) sim_rtcn_init (rtc->initd, tmr); } } int32 sim_rtcn_init (int32 time, int32 tmr) { return sim_rtcn_init_unit (NULL, time, tmr); } int32 sim_rtcn_init_unit (UNIT *uptr, int32 time, int32 tmr) { return sim_rtcn_init_unit_ticks (uptr, time, tmr, 0); } int32 sim_rtcn_init_unit_ticks (UNIT *uptr, int32 time, int32 tmr, int32 ticksper) { RTC *rtc; if (time == 0) time = 1; if (tmr == SIM_INTERNAL_CLK) tmr = SIM_NTIMERS; else { if ((tmr < 0) || (tmr >= SIM_NTIMERS)) return time; } rtc = &rtcs[tmr]; /* * If we'd previously succeeded in calibrating a tick value, then use that * delay as a better default to setup when we're re-initialized. * Re-initializing happens on any boot. */ if (rtc->currd) time = rtc->currd; if (!uptr) uptr = rtc->clock_unit; sim_debug (DBG_CAL, &sim_timer_dev, "sim_rtcn_init_unit(unit=%s, time=%d, tmr=%d)\n", uptr ? sim_uname(uptr) : "", time, tmr); if (uptr) { if (!rtc->clock_unit) sim_register_clock_unit_tmr (uptr, tmr); } rtc->gtime = sim_gtime(); rtc->rtime = sim_is_running ? sim_os_msec () : sim_stop_time; rtc->vtime = rtc->rtime; rtc->nxintv = 1000; rtc->ticks = 0; rtc->last_hz = rtc->hz; rtc->hz = ticksper; rtc->based = time; rtc->currd = time; rtc->initd = time; rtc->elapsed = 0; rtc->calibrations = 0; rtc->clock_ticks_tot += rtc->clock_ticks; rtc->clock_ticks = 0; rtc->calib_tick_time_tot += rtc->calib_tick_time; rtc->calib_tick_time = 0; rtc->clock_catchup_pending = FALSE; rtc->clock_catchup_eligible = FALSE; rtc->clock_catchup_ticks_tot += rtc->clock_catchup_ticks; rtc->clock_catchup_ticks = 0; rtc->clock_catchup_ticks_curr = 0; rtc->calib_ticks_acked_tot += rtc->calib_ticks_acked; rtc->calib_ticks_acked = 0; ++rtc->calib_initializations; rtc->clock_init_base_time = sim_timenow_double (); _rtcn_configure_calibrated_clock (tmr); return time; } int32 sim_rtcn_calb_tick (int32 tmr) { RTC *rtc = &rtcs[tmr]; return sim_rtcn_calb (rtc->hz, tmr); } int32 sim_rtcn_calb (uint32 ticksper, int32 tmr) { uint32 new_rtime, delta_rtime, last_idle_pct, catchup_ticks_curr; int32 delta_vtime; double new_gtime; int32 new_currd; int32 itmr; RTC *rtc; if (tmr == SIM_INTERNAL_CLK) tmr = SIM_NTIMERS; else { if ((tmr < 0) || (tmr >= SIM_NTIMERS)) return 10000; } rtc = &rtcs[tmr]; if (rtc->hz != ticksper) { /* changing tick rate? */ uint32 prior_hz = rtc->hz; if (rtc->hz == 0) rtc->clock_tick_start_time = sim_timenow_double (); if ((rtc->last_hz != 0) && (rtc->last_hz != ticksper) && (ticksper != 0)) rtc->currd = (int32)(sim_timer_inst_per_sec () / ticksper); rtc->last_hz = rtc->hz; rtc->hz = ticksper; _rtcn_configure_calibrated_clock (tmr); if (ticksper != 0) { RTC *crtc = &rtcs[sim_calb_tmr]; rtc->clock_tick_size = 1.0 / ticksper; sim_debug (DBG_CAL, &sim_timer_dev, "sim_rtcn_calb(ticksper=%d,tmr=%d) currd=%d, prior_hz=%d\n", ticksper, tmr, rtc->currd, (int)prior_hz); if ((tmr != sim_calb_tmr) && rtc->clock_unit && (ticksper > crtc->hz)) { sim_catchup_ticks = TRUE; sim_debug (DBG_CAL, &sim_timer_dev, "sim_rtcn_calb(%d) - forcing catchup ticks for %s ticking at %d, host tick rate %ds\n", tmr, sim_uname (rtc->clock_unit), ticksper, sim_os_tick_hz); _rtcn_tick_catchup_check (rtc, 0); } } else sim_debug (DBG_CAL, &sim_timer_dev, "sim_rtcn_calb(ticksper=%d,tmr=%d) timer stopped currd was %d, prior_hz=%d\n", ticksper, tmr, rtc->currd, (int)prior_hz); } if (ticksper == 0) /* running? */ return 10000; if (rtc->clock_unit == NULL) { /* Not using TIMER units? */ rtc->clock_ticks += 1; rtc->calib_tick_time += rtc->clock_tick_size; } if (rtc->clock_catchup_pending) { /* catchup tick? */ ++rtc->clock_catchup_ticks; /* accumulating which were catchups */ ++rtc->clock_catchup_ticks_curr; rtc->clock_catchup_pending = FALSE; } rtc->ticks += 1; /* count ticks */ if (rtc->ticks < ticksper) /* 1 sec yet? */ return rtc->currd; catchup_ticks_curr = rtc->clock_catchup_ticks_curr; rtc->clock_catchup_ticks_curr = 0; rtc->ticks = 0; /* reset ticks */ rtc->elapsed += 1; /* count sec */ if (!rtc_avail) /* no timer? */ return rtc->currd; if (sim_calb_tmr != tmr) { rtc->currd = (int32)(sim_timer_inst_per_sec()/ticksper); sim_debug (DBG_CAL, &sim_timer_dev, "sim_rtcn_calb(tmr=%d) calibrated against internal system tmr=%d, tickper=%d (result: %d)\n", tmr, sim_calb_tmr, ticksper, rtc->currd); return rtc->currd; } new_rtime = sim_os_msec (); /* wall time */ if (!sim_signaled_int_char && ((new_rtime - sim_last_poll_kbd_time) > 500)) { sim_debug (DBG_CAL, &sim_timer_dev, "sim_rtcn_calb(tmr=%d) gratuitious keyboard poll after %d msecs\n", tmr, (int)(new_rtime - sim_last_poll_kbd_time)); (void)sim_poll_kbd (); } ++rtc->calibrations; /* count calibrations */ sim_debug (DBG_TRC, &sim_timer_dev, "sim_rtcn_calb(ticksper=%d, tmr=%d)\n", ticksper, tmr); if (new_rtime < rtc->rtime) { /* time running backwards? */ /* This happens when the value returned by sim_os_msec wraps (as an uint32) */ /* Wrapping will happen initially sometime before a simulator has been running */ /* for 49 days approximately every 49 days thereafter. */ ++rtc->clock_calib_backwards; /* Count statistic */ sim_debug (DBG_CAL, &sim_timer_dev, "time running backwards - OldTime: %u, NewTime: %u, result: %d\n", rtc->rtime, new_rtime, rtc->currd); rtc->vtime = rtc->rtime = new_rtime; /* reset wall time */ rtc->nxintv = 1000; rtc->based = rtc->currd; if (rtc->clock_catchup_eligible) { rtc->clock_catchup_base_time = sim_timenow_double(); rtc->calib_tick_time = 0.0; } return rtc->currd; /* can't calibrate */ } delta_rtime = new_rtime - rtc->rtime; /* elapsed wtime */ rtc->rtime = new_rtime; /* adv wall time */ rtc->vtime += 1000; /* adv sim time */ if (delta_rtime > 30000) { /* gap too big? */ /* This simulator process has somehow been suspended for a significant */ /* amount of time. This will certainly happen if the host system has */ /* slept or hibernated. It also might happen when a simulator */ /* developer stops the simulator at a breakpoint (a process, not simh */ /* breakpoint). To accomodate this, we set the calibration state to */ /* ignore what happened and proceed from here. */ ++rtc->clock_calib_gap2big; /* Count statistic */ rtc->vtime = rtc->rtime; /* sync virtual and real time */ rtc->nxintv = 1000; /* reset next interval */ rtc->gtime = sim_gtime(); /* save instruction time */ rtc->based = rtc->currd; if (rtc->clock_catchup_eligible) rtc->calib_tick_time += ((double)delta_rtime / 1000.0);/* advance tick time */ sim_debug (DBG_CAL, &sim_timer_dev, "gap too big: delta = %d - result: %d\n", delta_rtime, rtc->currd); return rtc->currd; /* can't calibr */ } last_idle_pct = 0; /* normally force calibration */ if (tmr != SIM_NTIMERS) { if (delta_rtime != 0) /* avoid divide by zero */ last_idle_pct = MIN(100, (uint32)(100.0 * (((double)(rtc->clock_time_idled - rtc->clock_time_idled_last)) / ((double)delta_rtime)))); rtc->clock_time_idled_last = rtc->clock_time_idled; if (last_idle_pct > sim_idle_calib_pct) { rtc->rtime = new_rtime; /* save wall time */ rtc->vtime += 1000; /* adv sim time */ rtc->gtime = sim_gtime(); /* save instruction time */ rtc->based = rtc->currd; ++rtc->clock_calib_skip_idle; sim_debug (DBG_CAL, &sim_timer_dev, "skipping calibration due to idling (%d%%) - result: %d\n", last_idle_pct, rtc->currd); return rtc->currd; /* avoid calibrating idle checks */ } } new_gtime = sim_gtime(); if ((last_idle_pct == 0) && (delta_rtime != 0)) { sim_idle_cyc_ms = (uint32)((new_gtime - rtc->gtime) / delta_rtime); if ((sim_idle_rate_ms != 0) && (delta_rtime > 1)) sim_idle_cyc_sleep = (uint32)((new_gtime - rtc->gtime) / (delta_rtime / sim_idle_rate_ms)); } if (sim_asynch_timer || (catchup_ticks_curr > 0)) { /* An asynchronous clock or when catchup ticks have */ /* occurred, we merely needs to divide the number of */ /* instructions actually executed by the clock rate. */ new_currd = (int32)((new_gtime - rtc->gtime)/ticksper); /* avoid excessive swings in the calibrated result */ if (new_currd > 10*rtc->currd) /* don't swing big too fast */ new_currd = 10*rtc->currd; else { if (new_currd < rtc->currd/10) /* don't swing small too fast */ new_currd = rtc->currd/10; } rtc->based = rtc->currd = new_currd; rtc->gtime = new_gtime; /* save instruction time */ sim_debug (DBG_CAL, &sim_timer_dev, "sim_rtcn_calb(%s tmr=%d, tickper=%d) catchups=%u, idle=%d%% result: %d\n", sim_asynch_timer ? "asynch" : "catchup", tmr, ticksper, catchup_ticks_curr, last_idle_pct, rtc->currd); return rtc->currd; /* calibrated result */ } rtc->gtime = new_gtime; /* save instruction time */ /* This self regulating algorithm depends directly on the assumption */ /* that this routine is called back after processing the number of */ /* instructions which was returned the last time it was called. */ if (delta_rtime == 0) /* gap too small? */ rtc->based = rtc->based * ticksper; /* slew wide */ else rtc->based = (int32) (((double) rtc->based * (double) rtc->nxintv) / ((double) delta_rtime));/* new base rate */ delta_vtime = rtc->vtime - rtc->rtime; /* gap */ if (delta_vtime > SIM_TMAX) /* limit gap */ delta_vtime = SIM_TMAX; else { if (delta_vtime < -SIM_TMAX) delta_vtime = -SIM_TMAX; } rtc->nxintv = 1000 + delta_vtime; /* next wtime */ rtc->currd = (int32) (((double) rtc->based * (double) rtc->nxintv) / 1000.0); /* next delay */ if (rtc->based <= 0) /* never negative or zero! */ rtc->based = 1; if (rtc->currd <= 0) /* never negative or zero! */ rtc->currd = 1; sim_debug (DBG_CAL, &sim_timer_dev, "sim_rtcn_calb(tmr=%d, tickper=%d) (delta_rtime=%d, delta_vtime=%d, base=%d, nxintv=%u, catchups=%u, idle=%d%%, result: %d)\n", tmr, ticksper, (int)delta_rtime, (int)delta_vtime, rtc->based, rtc->nxintv, catchup_ticks_curr, last_idle_pct, rtc->currd); /* Adjust calibration for other timers which depend on this timer's calibration */ for (itmr=0; itmr<=SIM_NTIMERS; itmr++) { RTC *irtc = &rtcs[itmr]; if ((itmr != tmr) && (irtc->hz != 0)) irtc->currd = (rtc->currd * ticksper) / irtc->hz; } AIO_SET_INTERRUPT_LATENCY(rtc->currd * ticksper); /* set interrrupt latency */ return rtc->currd; } /* Prior interfaces - default to timer 0 */ int32 sim_rtc_init (int32 time) { return sim_rtcn_init (time, 0); } int32 sim_rtc_calb (uint32 ticksper) { return sim_rtcn_calb (ticksper, 0); } /* sim_timer_init - get minimum sleep time available on this host */ t_bool sim_timer_init (void) { int tmr; uint32 clock_start, clock_last, clock_now; sim_debug (DBG_TRC, &sim_timer_dev, "sim_timer_init()\n"); /* Clear the event queue before initializing the timer subsystem */ while (sim_clock_queue != QUEUE_LIST_END) sim_cancel (sim_clock_queue); for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; rtc->timer_unit = &sim_timer_units[tmr]; rtc->timer_unit->action = &sim_timer_tick_svc; rtc->timer_unit->flags = UNIT_DIS | UNIT_IDLE; if (rtc->clock_cosched_queue) while (rtc->clock_cosched_queue != QUEUE_LIST_END) sim_cancel (rtc->clock_cosched_queue); rtc->clock_cosched_queue = QUEUE_LIST_END; } sim_stop_unit.action = &sim_timer_stop_svc; SIM_INTERNAL_UNIT.flags = UNIT_IDLE; sim_register_internal_device (&sim_timer_dev); /* Register Clock Assist device */ sim_register_internal_device (&sim_throttle_dev); /* Register Throttle Device */ sim_throttle_unit.action = &sim_throt_svc; sim_register_clock_unit_tmr (&SIM_INTERNAL_UNIT, SIM_INTERNAL_CLK); sim_idle_enab = FALSE; /* init idle off */ sim_idle_rate_ms = sim_os_ms_sleep_init (); /* get OS timer rate */ sim_set_rom_delay_factor (sim_get_rom_delay_factor ()); /* initialize ROM delay factor */ sim_stop_time = clock_last = clock_start = sim_os_msec (); sim_os_clock_resoluton_ms = 1000; do { uint32 clock_diff; clock_now = sim_os_msec (); clock_diff = clock_now - clock_last; if ((clock_diff > 0) && (clock_diff < sim_os_clock_resoluton_ms)) |
︙ | ︙ | |||
1104 1105 1106 1107 1108 1109 1110 | { int tmr, clocks; struct timespec now; time_t time_t_now; int32 calb_tmr = (sim_calb_tmr == -1) ? sim_calb_tmr_last : sim_calb_tmr; double inst_per_sec = sim_timer_inst_per_sec (); | | | | | | | | | | | > | | | > > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 | { int tmr, clocks; struct timespec now; time_t time_t_now; int32 calb_tmr = (sim_calb_tmr == -1) ? sim_calb_tmr_last : sim_calb_tmr; double inst_per_sec = sim_timer_inst_per_sec (); fprintf (st, "Minimum Host Sleep Time: %d ms (%dHz)\n", sim_os_sleep_min_ms, sim_os_tick_hz); if (sim_os_sleep_min_ms != sim_os_sleep_inc_ms) fprintf (st, "Minimum Host Sleep Incr Time: %d ms\n", sim_os_sleep_inc_ms); fprintf (st, "Host Clock Resolution: %d ms\n", sim_os_clock_resoluton_ms); fprintf (st, "Execution Rate: %s %s/sec\n", sim_fmt_numeric (inst_per_sec), sim_vm_interval_units); if (sim_idle_enab) { fprintf (st, "Idling: Enabled\n"); fprintf (st, "Time before Idling starts: %d seconds\n", sim_idle_stable); } if (sim_throt_type != SIM_THROT_NONE) { sim_show_throt (st, NULL, uptr, val, desc); } fprintf (st, "Calibrated Timer: %s\n", (calb_tmr == -1) ? "Undetermined" : ((calb_tmr == SIM_NTIMERS) ? "Internal Timer" : (rtcs[calb_tmr].clock_unit ? sim_uname(rtcs[calb_tmr].clock_unit) : ""))); if (calb_tmr == SIM_NTIMERS) fprintf (st, "Catchup Ticks: %s\n", sim_catchup_ticks ? "Enabled" : "Disabled"); fprintf (st, "Pre-Calibration Estimated Rate: %s\n", sim_fmt_numeric ((double)sim_precalibrate_ips)); if (sim_idle_calib_pct == 100) fprintf (st, "Calibration: Always\n"); else fprintf (st, "Calibration: Skipped when Idle exceeds %d%%\n", sim_idle_calib_pct); #if defined(SIM_ASYNCH_CLOCKS) fprintf (st, "Asynchronous Clocks: %s\n", sim_asynch_timer ? "Active" : "Available"); #endif if (sim_time_at_sim_prompt != 0.0) { double prompt_time = 0.0; if (!sim_is_running) prompt_time = ((double)(sim_os_msec () - sim_stop_time)) / 1000.0; fprintf (st, "Time at sim> prompt: %s\n", sim_fmt_secs (sim_time_at_sim_prompt + prompt_time)); } fprintf (st, "\n"); for (tmr=clocks=0; tmr<=SIM_NTIMERS; ++tmr) { RTC *rtc = &rtcs[tmr]; if (0 == rtc->initd) continue; if (rtc->clock_unit) { ++clocks; fprintf (st, "%s clock device is %s%s%s\n", sim_name, (tmr == SIM_NTIMERS) ? "Internal Calibrated Timer(" : "", sim_uname(rtc->clock_unit), (tmr == SIM_NTIMERS) ? ")" : ""); } fprintf (st, "%s%sTimer %d:\n", sim_asynch_timer ? "Asynchronous " : "", rtc->hz ? "Calibrated " : "Uncalibrated ", tmr); if (rtc->hz) { fprintf (st, " Running at: %d Hz\n", rtc->hz); fprintf (st, " Tick Size: %s\n", sim_fmt_secs (rtc->clock_tick_size)); fprintf (st, " Ticks in current second: %d\n", rtc->ticks); } fprintf (st, " Seconds Running: %s (%s)\n", sim_fmt_numeric ((double)rtc->elapsed), sim_fmt_secs ((double)rtc->elapsed)); if (tmr == calb_tmr) { fprintf (st, " Calibration Opportunities: %s\n", sim_fmt_numeric ((double)rtc->calibrations)); if (sim_idle_calib_pct && (sim_idle_calib_pct != 100)) fprintf (st, " Calib Skip when Idle >: %u%%\n", sim_idle_calib_pct); if (rtc->clock_calib_skip_idle) fprintf (st, " Calibs Skip While Idle: %s\n", sim_fmt_numeric ((double)rtc->clock_calib_skip_idle)); if (rtc->clock_calib_backwards) fprintf (st, " Calibs Skip Backwards: %s\n", sim_fmt_numeric ((double)rtc->clock_calib_backwards)); if (rtc->clock_calib_gap2big) fprintf (st, " Calibs Skip Gap Too Big: %s\n", sim_fmt_numeric ((double)rtc->clock_calib_gap2big)); } if (rtc->gtime) fprintf (st, " Instruction Time: %.0f\n", rtc->gtime); if ((!sim_asynch_timer) && (sim_throt_type == SIM_THROT_NONE)) { fprintf (st, " Real Time: %u\n", rtc->rtime); fprintf (st, " Virtual Time: %u\n", rtc->vtime); fprintf (st, " Next Interval: %s\n", sim_fmt_numeric ((double)rtc->nxintv)); fprintf (st, " Base Tick Delay: %s\n", sim_fmt_numeric ((double)rtc->based)); fprintf (st, " Initial Insts Per Tick: %s\n", sim_fmt_numeric ((double)rtc->initd)); } fprintf (st, " Current Insts Per Tick: %s\n", sim_fmt_numeric ((double)rtc->currd)); fprintf (st, " Initializations: %d\n", rtc->calib_initializations); fprintf (st, " Ticks: %s\n", sim_fmt_numeric ((double)(rtc->clock_ticks))); if (rtc->clock_ticks_tot+rtc->clock_ticks != rtc->clock_ticks) fprintf (st, " Total Ticks: %s\n", sim_fmt_numeric ((double)(rtc->clock_ticks_tot+rtc->clock_ticks))); if (rtc->clock_skew_max != 0.0) fprintf (st, " Peak Clock Skew: %s%s\n", sim_fmt_secs (fabs(rtc->clock_skew_max)), (rtc->clock_skew_max < 0) ? " fast" : " slow"); if (rtc->calib_ticks_acked) fprintf (st, " Ticks Acked: %s\n", sim_fmt_numeric ((double)rtc->calib_ticks_acked)); if (rtc->calib_ticks_acked_tot+rtc->calib_ticks_acked != rtc->calib_ticks_acked) fprintf (st, " Total Ticks Acked: %s\n", sim_fmt_numeric ((double)(rtc->calib_ticks_acked_tot+rtc->calib_ticks_acked))); if (rtc->calib_tick_time) fprintf (st, " Tick Time: %s\n", sim_fmt_secs (rtc->calib_tick_time)); if (rtc->calib_tick_time_tot+rtc->calib_tick_time != rtc->calib_tick_time) fprintf (st, " Total Tick Time: %s\n", sim_fmt_secs (rtc->calib_tick_time_tot+rtc->calib_tick_time)); if (rtc->clock_catchup_ticks) fprintf (st, " Catchup Ticks Sched: %s\n", sim_fmt_numeric ((double)rtc->clock_catchup_ticks)); if (rtc->clock_catchup_ticks_curr) fprintf (st, " Catchup Ticks this second: %s\n", sim_fmt_numeric ((double)rtc->clock_catchup_ticks_curr)); if (rtc->clock_catchup_ticks_tot+rtc->clock_catchup_ticks != rtc->clock_catchup_ticks) fprintf (st, " Total Catchup Ticks Sched: %s\n", sim_fmt_numeric ((double)(rtc->clock_catchup_ticks_tot+rtc->clock_catchup_ticks))); if (rtc->clock_init_base_time) { _double_to_timespec (&now, rtc->clock_init_base_time); time_t_now = (time_t)now.tv_sec; fprintf (st, " Initialize Base Time: %8.8s.%03d\n", 11+ctime(&time_t_now), (int)(now.tv_nsec/1000000)); } if (rtc->clock_tick_start_time) { _double_to_timespec (&now, rtc->clock_tick_start_time); time_t_now = (time_t)now.tv_sec; fprintf (st, " Tick Start Time: %8.8s.%03d\n", 11+ctime(&time_t_now), (int)(now.tv_nsec/1000000)); } clock_gettime (CLOCK_REALTIME, &now); time_t_now = (time_t)now.tv_sec; fprintf (st, " Wall Clock Time Now: %8.8s.%03d\n", 11+ctime(&time_t_now), (int)(now.tv_nsec/1000000)); if (sim_catchup_ticks && rtc->clock_catchup_eligible) { _double_to_timespec (&now, rtc->clock_catchup_base_time+rtc->calib_tick_time); time_t_now = (time_t)now.tv_sec; fprintf (st, " Catchup Tick Time: %8.8s.%03d\n", 11+ctime(&time_t_now), (int)(now.tv_nsec/1000000)); _double_to_timespec (&now, rtc->clock_catchup_base_time); time_t_now = (time_t)now.tv_sec; fprintf (st, " Catchup Base Time: %8.8s.%03d\n", 11+ctime(&time_t_now), (int)(now.tv_nsec/1000000)); } if (rtc->clock_time_idled) fprintf (st, " Total Time Idled: %s\n", sim_fmt_secs (rtc->clock_time_idled/1000.0)); } if (clocks == 0) fprintf (st, "%s clock device is not specified, co-scheduling is unavailable\n", sim_name); return SCPE_OK; } t_stat sim_show_clock_queues (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr) |
︙ | ︙ | |||
1245 1246 1247 1248 1249 1250 1251 | time_t_due = (time_t)due.tv_sec; fprintf (st, " after %s due at %8.8s.%06d\n", tim, 11+ctime(&time_t_due), (int)(due.tv_nsec/1000)); } } } #endif /* SIM_ASYNCH_CLOCKS */ for (tmr=0; tmr<=SIM_NTIMERS; ++tmr) { | > | > | | | | 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 | time_t_due = (time_t)due.tv_sec; fprintf (st, " after %s due at %8.8s.%06d\n", tim, 11+ctime(&time_t_due), (int)(due.tv_nsec/1000)); } } } #endif /* SIM_ASYNCH_CLOCKS */ for (tmr=0; tmr<=SIM_NTIMERS; ++tmr) { RTC *rtc = &rtcs[tmr]; if (rtc->clock_unit == NULL) continue; if (rtc->clock_cosched_queue != QUEUE_LIST_END) { int32 accum; fprintf (st, "%s #%d clock (%s) co-schedule event queue status\n", sim_name, tmr, sim_uname(rtc->clock_unit)); accum = 0; for (uptr = rtc->clock_cosched_queue; uptr != QUEUE_LIST_END; uptr = uptr->next) { if ((dptr = find_dev_from_unit (uptr)) != NULL) { fprintf (st, " %s", sim_dname (dptr)); if (dptr->numunits > 1) fprintf (st, " unit %d", (int32) (uptr - dptr->units)); } else fprintf (st, " Unknown"); |
︙ | ︙ | |||
1283 1284 1285 1286 1287 1288 1289 | } REG sim_timer_reg[] = { { DRDATAD (IDLE_CYC_MS, sim_idle_cyc_ms, 32, "Cycles Per Millisecond"), PV_RSPC|REG_RO}, { DRDATAD (IDLE_CYC_SLEEP, sim_idle_cyc_sleep, 32, "Cycles Per Minimum Sleep"), PV_RSPC|REG_RO}, { DRDATAD (IDLE_STABLE, sim_idle_stable, 32, "IDLE stability delay"), PV_RSPC}, { DRDATAD (ROM_DELAY, sim_rom_delay, 32, "ROM memory reference delay"), PV_RSPC|REG_RO}, | | | | | | | | | | | | | | | | | | | 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 | } REG sim_timer_reg[] = { { DRDATAD (IDLE_CYC_MS, sim_idle_cyc_ms, 32, "Cycles Per Millisecond"), PV_RSPC|REG_RO}, { DRDATAD (IDLE_CYC_SLEEP, sim_idle_cyc_sleep, 32, "Cycles Per Minimum Sleep"), PV_RSPC|REG_RO}, { DRDATAD (IDLE_STABLE, sim_idle_stable, 32, "IDLE stability delay"), PV_RSPC}, { DRDATAD (ROM_DELAY, sim_rom_delay, 32, "ROM memory reference delay"), PV_RSPC|REG_RO}, { DRDATAD (TICK_RATE_0, rtcs[0].hz, 32, "Timer 0 Ticks Per Second") }, { DRDATAD (TICK_SIZE_0, rtcs[0].currd, 32, "Timer 0 Tick Size") }, { DRDATAD (TICK_RATE_1, rtcs[1].hz, 32, "Timer 1 Ticks Per Second") }, { DRDATAD (TICK_SIZE_1, rtcs[1].currd, 32, "Timer 1 Tick Size") }, { DRDATAD (TICK_RATE_2, rtcs[2].hz, 32, "Timer 2 Ticks Per Second") }, { DRDATAD (TICK_SIZE_2, rtcs[2].currd, 32, "Timer 2 Tick Size") }, { DRDATAD (TICK_RATE_3, rtcs[3].hz, 32, "Timer 3 Ticks Per Second") }, { DRDATAD (TICK_SIZE_3, rtcs[3].currd, 32, "Timer 3 Tick Size") }, { DRDATAD (TICK_RATE_4, rtcs[4].hz, 32, "Timer 4 Ticks Per Second") }, { DRDATAD (TICK_SIZE_4, rtcs[4].currd, 32, "Timer 4 Tick Size") }, { DRDATAD (TICK_RATE_5, rtcs[5].hz, 32, "Timer 5 Ticks Per Second") }, { DRDATAD (TICK_SIZE_5, rtcs[5].currd, 32, "Timer 5 Tick Size") }, { DRDATAD (TICK_RATE_6, rtcs[6].hz, 32, "Timer 6 Ticks Per Second") }, { DRDATAD (TICK_SIZE_6, rtcs[6].currd, 32, "Timer 6 Tick Size") }, { DRDATAD (TICK_RATE_7, rtcs[7].hz, 32, "Timer 7 Ticks Per Second") }, { DRDATAD (TICK_SIZE_7, rtcs[7].currd, 32, "Timer 7 Tick Size") }, { DRDATAD (INTERNAL_TICK_RATE,sim_int_clk_tps, 32, "Internal Timer Ticks Per Second") }, { DRDATAD (INTERNAL_TICK_SIZE,rtcs[SIM_NTIMERS].currd,32, "Internal Timer Tick Size") }, { NULL } }; REG sim_throttle_reg[] = { { DRDATAD (THROT_MS_START, sim_throt_ms_start, 32, "Throttle measurement start time"), PV_RSPC|REG_RO}, { DRDATAD (THROT_MS_STOP, sim_throt_ms_stop, 32, "Throttle measurement stop time"), PV_RSPC|REG_RO}, { DRDATAD (THROT_TYPE, sim_throt_type, 32, "Throttle type"), PV_RSPC|REG_RO}, |
︙ | ︙ | |||
1328 1329 1330 1331 1332 1333 1334 | t_stat sim_timer_set_catchup (int32 flag, CONST char *cptr) { if (flag) { if (!sim_catchup_ticks) sim_catchup_ticks = TRUE; } else { | | > < < > > > > | | | | | | | | | | | | | | > | 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 | t_stat sim_timer_set_catchup (int32 flag, CONST char *cptr) { if (flag) { if (!sim_catchup_ticks) sim_catchup_ticks = TRUE; } else { if (sim_catchup_ticks) { sim_catchup_ticks = FALSE; } } return SCPE_OK; } t_stat sim_timer_show_catchup (FILE *st, UNIT *uptr, int32 val, CONST void *desc) { fprintf (st, "Calibrated Ticks%s", sim_catchup_ticks ? " with Catchup Ticks" : ""); return SCPE_OK; } /* Set idle calibration threshold */ t_stat sim_timer_set_idle_pct (int32 flag, CONST char *cptr) { t_stat r = SCPE_OK; if (cptr == NULL) return SCPE_ARG; if (1) { int32 newpct; char gbuf[CBUFSIZE]; cptr = get_glyph (cptr, gbuf, 0); /* get argument */ if (isdigit (gbuf[0])) newpct = (int32) get_uint (gbuf, 10, 100, &r); else { if (MATCH_CMD (gbuf, "ALWAYS") == 0) newpct = 100; else r = SCPE_ARG; } if ((r != SCPE_OK) || (newpct == (int32)(sim_idle_calib_pct))) return r; if (newpct == 0) return SCPE_ARG; sim_idle_calib_pct = (uint32)newpct; } return SCPE_OK; } /* Set stop time */ t_stat sim_timer_set_stop (int32 flag, CONST char *cptr) { |
︙ | ︙ | |||
1516 1517 1518 1519 1520 1521 1522 1523 | t_bool sim_idle (uint32 tmr, int sin_cyc) { uint32 w_ms, w_idle, act_ms; int32 act_cyc; static t_bool in_nowait = FALSE; double cyc_since_idle; | > > > > | | > > > > | | | | < < < < < | | | | | | | | > > | | | | | | 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 | t_bool sim_idle (uint32 tmr, int sin_cyc) { uint32 w_ms, w_idle, act_ms; int32 act_cyc; static t_bool in_nowait = FALSE; double cyc_since_idle; RTC *rtc = &rtcs[tmr]; if (rtc->hz == 0) /* specified timer is not running? */ tmr = sim_calb_tmr; /* use calibrated timer instead */ rtc = &rtcs[tmr]; if (rtc->clock_catchup_pending) { /* Catchup clock tick pending due to ack? */ sim_debug (DBG_TIK, &sim_timer_dev, "sim_idle(tmr=%d, sin_cyc=%d) - accelerating pending catch-up tick before idling %s\n", tmr, sin_cyc, sim_uname (rtc->clock_unit)); sim_activate_abs (&sim_timer_units[tmr], 0); sim_interval -= sin_cyc; return FALSE; } if (_rtcn_tick_catchup_check (rtc, -1)) { /* Check for slow clock tick? */ sim_interval -= sin_cyc; return FALSE; } if ((!sim_idle_enab) || /* idling disabled */ ((sim_clock_queue == QUEUE_LIST_END) && /* or clock queue empty? */ (!sim_asynch_timer))|| /* and not asynch? */ ((sim_clock_queue != QUEUE_LIST_END) && /* or clock queue not empty */ ((sim_clock_queue->flags & UNIT_IDLE) == 0))|| /* and event not idle-able? */ (rtc->elapsed < sim_idle_stable)) { /* or calibrated timer not stable? */ sim_debug (DBG_IDL, &sim_timer_dev, "Can't idle: %s - elapsed: %d and %d/%d\n", !sim_idle_enab ? "idle disabled" : ((rtc->elapsed < sim_idle_stable) ? "not stable" : ((sim_clock_queue != QUEUE_LIST_END) ? sim_uname (sim_clock_queue) : "")), rtc->elapsed, rtc->ticks, rtc->hz); sim_interval -= sin_cyc; return FALSE; } /* When a simulator is in an instruction path (or under other conditions which would indicate idling), the countdown of sim_interval may not be happening at a pace which is consistent with the rate it happens when not in the 'idle capable' state. The consequence of this is that the clock calibration may produce calibrated results which vary much more than they do when not in the idle able state. Sim_idle also uses the calibrated tick size to approximate an adjustment to sim_interval to reflect the number of instructions which would have executed during the actual idle time, so consistent calibrated numbers produce better adjustments. To negate this effect, we accumulate the time actually idled here. sim_rtcn_calb compares the accumulated idle time during the most recent second and if it exceeds the percentage defined by sim_idle_calib_pct calibration is suppressed. Thus recalibration only happens if things didn't idle too much. we also check check sim_idle_enab above so that all simulators can avoid directly checking sim_idle_enab before calling sim_idle so that all of the bookkeeping on sim_idle_idled is done here in sim_timer where it means something, while not idling when it isn't enabled. */ sim_debug (DBG_TRC, &sim_timer_dev, "sim_idle(tmr=%d, sin_cyc=%d)\n", tmr, sin_cyc); if (sim_idle_cyc_ms == 0) { sim_idle_cyc_ms = (rtc->currd * rtc->hz) / 1000;/* cycles per msec */ if (sim_idle_rate_ms != 0) sim_idle_cyc_sleep = (rtc->currd * rtc->hz) / (1000 / sim_idle_rate_ms);/* cycles per minimum sleep */ } if ((sim_idle_rate_ms == 0) || (sim_idle_cyc_ms == 0)) {/* not possible? */ sim_interval -= sin_cyc; sim_debug (DBG_IDL, &sim_timer_dev, "not possible idle_rate_ms=%d - cyc/ms=%d\n", sim_idle_rate_ms, sim_idle_cyc_ms); return FALSE; } w_ms = (uint32) sim_interval / sim_idle_cyc_ms; /* ms to wait */ /* When the host system has a clock tick which is less frequent than the */ /* simulated system's clock, idling will cause delays which will miss */ /* simulated clock ticks. To accomodate this, and still allow idling, if */ /* the simulator acknowledges the processing of clock ticks, then catchup */ /* ticks can be used to make up for missed ticks. */ if (rtc->clock_catchup_eligible) w_idle = (sim_interval * 1000) / rtc->currd; /* 1000 * pending fraction of tick */ else w_idle = (w_ms * 1000) / sim_idle_rate_ms; /* 1000 * intervals to wait */ if ((w_idle < 500) || (w_ms == 0)) { /* shorter than 1/2 the interval or */ sim_interval -= sin_cyc; /* minimal sleep time? */ if (!in_nowait) sim_debug (DBG_IDL, &sim_timer_dev, "no wait, too short: %d usecs\n", w_idle); in_nowait = TRUE; return FALSE; } if (w_ms > 1000) /* too long a wait (runaway calibration) */ sim_debug (DBG_TIK, &sim_timer_dev, "waiting too long: w_ms=%d usecs, w_idle=%d usecs, sim_interval=%d, rtc->currd=%d\n", w_ms, w_idle, sim_interval, rtc->currd); in_nowait = FALSE; if (sim_clock_queue == QUEUE_LIST_END) sim_debug (DBG_IDL, &sim_timer_dev, "sleeping for %d ms - pending event in %d %s\n", w_ms, sim_interval, sim_vm_interval_units); else sim_debug (DBG_IDL, &sim_timer_dev, "sleeping for %d ms - pending event on %s in %d %s\n", w_ms, sim_uname(sim_clock_queue), sim_interval, sim_vm_interval_units); cyc_since_idle = sim_gtime() - sim_idle_end_time; /* time since prior idle */ act_ms = sim_idle_ms_sleep (w_ms); /* wait */ rtc->clock_time_idled += act_ms; act_cyc = act_ms * sim_idle_cyc_ms; if (cyc_since_idle > sim_idle_cyc_sleep) act_cyc -= sim_idle_cyc_sleep / 2; /* account for half an interval's worth of cycles */ else act_cyc -= (int32)cyc_since_idle; /* acount for cycles executed */ sim_interval = sim_interval - act_cyc; /* count down sim_interval to reflect idle period */ sim_idle_end_time = sim_gtime(); /* save idle completed time */ if (sim_clock_queue == QUEUE_LIST_END) sim_debug (DBG_IDL, &sim_timer_dev, "slept for %d ms - pending event in %d %s\n", act_ms, sim_interval, sim_vm_interval_units); else sim_debug (DBG_IDL, &sim_timer_dev, "slept for %d ms - pending event on %s in %d %s\n", act_ms, sim_uname(sim_clock_queue), sim_interval, sim_vm_interval_units); return TRUE; } /* Set idling - implicitly disables throttling */ t_stat sim_set_idle (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { |
︙ | ︙ | |||
1720 1721 1722 1723 1724 1725 1726 | sim_throt_state = SIM_THROT_STATE_THROTTLE; /* force state */ sim_throt_wait = sim_throt_val; } } if (sim_throt_type == SIM_THROT_SPC) /* Set initial value while correct one is determined */ sim_throt_cps = (int32)((1000.0 * sim_throt_val) / (double)sim_throt_sleep_time); else | | | | | | | | | | 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 | sim_throt_state = SIM_THROT_STATE_THROTTLE; /* force state */ sim_throt_wait = sim_throt_val; } } if (sim_throt_type == SIM_THROT_SPC) /* Set initial value while correct one is determined */ sim_throt_cps = (int32)((1000.0 * sim_throt_val) / (double)sim_throt_sleep_time); else sim_throt_cps = sim_precalibrate_ips; return SCPE_OK; } t_stat sim_show_throt (FILE *st, DEVICE *dnotused, UNIT *unotused, int32 flag, CONST char *cptr) { if (sim_idle_rate_ms == 0) fprintf (st, "Throttling: Not Available\n"); else { switch (sim_throt_type) { case SIM_THROT_MCYC: fprintf (st, "Throttle: %d mega%s\n", sim_throt_val, sim_vm_interval_units); if (sim_throt_wait) fprintf (st, "Throttling by sleeping for: %d ms every %d %s\n", sim_throt_sleep_time, sim_throt_wait, sim_vm_interval_units); break; case SIM_THROT_KCYC: fprintf (st, "Throttle: %d kilo%s\n", sim_throt_val, sim_vm_interval_units); if (sim_throt_wait) fprintf (st, "Throttling by sleeping for: %d ms every %d %s\n", sim_throt_sleep_time, sim_throt_wait, sim_vm_interval_units); break; case SIM_THROT_PCT: if (sim_throt_wait) { fprintf (st, "Throttle: %d%% of %s %s per second\n", sim_throt_val, sim_fmt_numeric (sim_throt_peak_cps), sim_vm_interval_units); fprintf (st, "Throttling by sleeping for: %d ms every %d %s\n", sim_throt_sleep_time, sim_throt_wait, sim_vm_interval_units); } else fprintf (st, "Throttle: %d%%\n", sim_throt_val); break; case SIM_THROT_SPC: fprintf (st, "Throttle: %d/%d\n", sim_throt_val, sim_throt_sleep_time); fprintf (st, "Throttling by sleeping for: %d ms every %d %s\n", sim_throt_sleep_time, sim_throt_val, sim_vm_interval_units); break; default: fprintf (st, "Throttling: Disabled\n"); break; } if (sim_throt_type != SIM_THROT_NONE) { |
︙ | ︙ | |||
1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 | SIM_THROT_STATE_THROTTLE periodic waits to slow down the CPU */ t_stat sim_throt_svc (UNIT *uptr) { int32 tmr; uint32 delta_ms; double a_cps, d_cps, delta_inst; switch (sim_throt_state) { case SIM_THROT_STATE_INIT: /* take initial reading */ | > > > | | | | | | | 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 | SIM_THROT_STATE_THROTTLE periodic waits to slow down the CPU */ t_stat sim_throt_svc (UNIT *uptr) { int32 tmr; uint32 delta_ms; double a_cps, d_cps, delta_inst; RTC *rtc = NULL; if (sim_calb_tmr != -1) rtc = &rtcs[sim_calb_tmr]; switch (sim_throt_state) { case SIM_THROT_STATE_INIT: /* take initial reading */ if ((sim_calb_tmr != -1) && (rtc->hz != 0)) { if (rtc->calibrations < sim_throt_delay) { sim_throt_ms_start = sim_os_msec (); sim_throt_inst_start = sim_gtime (); sim_debug (DBG_THR, &sim_timer_dev, "sim_throt_svc(INIT) Deferring until stable (%d more seconds)\n", (int)(sim_throt_delay - rtc->calibrations)); return sim_activate (uptr, rtc->hz * rtc->currd); } sim_debug (DBG_THR, &sim_timer_dev, "sim_throt_svc(INIT) Computing Throttling values based on the last second's execution rate\n"); sim_throt_state = SIM_THROT_STATE_TIME; if (sim_throt_peak_cps < (double)(rtc->hz * rtc->currd)) sim_throt_peak_cps = (double)rtc->hz * rtc->currd; return sim_throt_svc (uptr); } else sim_debug (DBG_THR, &sim_timer_dev, "sim_throt_svc(INIT) Calibrated timer not available. Falling back to legacy method\n"); sim_idle_ms_sleep (sim_idle_rate_ms); /* start on a tick boundary to calibrate */ sim_throt_ms_start = sim_os_msec (); sim_throt_inst_start = sim_gtime (); |
︙ | ︙ | |||
1861 1862 1863 1864 1865 1866 1867 | if (delta_ms < SIM_THROT_MSMIN) { /* not enough time? */ if (delta_inst >= 100000000.0) { /* too many inst? */ sim_throt_state = SIM_THROT_STATE_INIT; /* fails in 32b! */ sim_printf ("Can't throttle. Host CPU is too fast with a minimum sleep time of %d ms\n", sim_idle_rate_ms); sim_set_throt (0, NULL); /* disable throttling */ return SCPE_OK; } | | | | | | 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 | if (delta_ms < SIM_THROT_MSMIN) { /* not enough time? */ if (delta_inst >= 100000000.0) { /* too many inst? */ sim_throt_state = SIM_THROT_STATE_INIT; /* fails in 32b! */ sim_printf ("Can't throttle. Host CPU is too fast with a minimum sleep time of %d ms\n", sim_idle_rate_ms); sim_set_throt (0, NULL); /* disable throttling */ return SCPE_OK; } sim_debug (DBG_THR, &sim_timer_dev, "sim_throt_svc() Not enough time. %d ms executing %.f %s.\n", (int)delta_ms, delta_inst, sim_vm_interval_units); sim_throt_wait = (int32)(delta_inst * SIM_THROT_WMUL); sim_throt_inst_start = sim_gtime(); sim_idle_ms_sleep (sim_idle_rate_ms); /* start on a tick boundart to calibrate */ sim_throt_ms_start = sim_os_msec (); } else { /* long enough */ a_cps = (((double) delta_inst) * 1000.0) / (double) delta_ms; if (sim_throt_type == SIM_THROT_MCYC) /* calc desired cps */ d_cps = (double) sim_throt_val * 1000000.0; else if (sim_throt_type == SIM_THROT_KCYC) d_cps = (double) sim_throt_val * 1000.0; else d_cps = (sim_throt_peak_cps * sim_throt_val) / 100.0; if (d_cps > a_cps) { sim_debug (DBG_THR, &sim_timer_dev, "sim_throt_svc() CPU too slow. Values a_cps = %f, d_cps = %f\n", a_cps, d_cps); sim_throt_state = SIM_THROT_STATE_INIT; sim_printf ("*********** WARNING ***********\n"); sim_printf ("Host CPU is too slow to simulate %s %s per second\n", sim_fmt_numeric(d_cps), sim_vm_interval_units); sim_printf ("Host CPU can only simulate %s %s per second\n", sim_fmt_numeric(sim_throt_peak_cps), sim_vm_interval_units); sim_printf ("Throttling disabled.\n"); sim_set_throt (0, NULL); return SCPE_OK; } while (1) { sim_throt_wait = (int32) /* cycles between sleeps */ ((a_cps * d_cps * ((double) sim_throt_sleep_time)) / |
︙ | ︙ | |||
1907 1908 1909 1910 1911 1912 1913 | sim_throt_state = SIM_THROT_STATE_THROTTLE; sim_debug (DBG_THR, &sim_timer_dev, "sim_throt_svc() Throttle values a_cps = %f, d_cps = %f, wait = %d, sleep = %d ms\n", a_cps, d_cps, sim_throt_wait, sim_throt_sleep_time); sim_throt_cps = d_cps; /* save the desired rate */ /* Run through all timers and adjust the calibration for each */ /* one that is running to reflect the throttle rate */ for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { | > | | | | | | | | | | 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 | sim_throt_state = SIM_THROT_STATE_THROTTLE; sim_debug (DBG_THR, &sim_timer_dev, "sim_throt_svc() Throttle values a_cps = %f, d_cps = %f, wait = %d, sleep = %d ms\n", a_cps, d_cps, sim_throt_wait, sim_throt_sleep_time); sim_throt_cps = d_cps; /* save the desired rate */ /* Run through all timers and adjust the calibration for each */ /* one that is running to reflect the throttle rate */ for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { rtc = &rtcs[tmr]; if (rtc->hz) { /* running? */ rtc->currd = (int32)(sim_throt_cps / rtc->hz);/* use throttle calibration */ rtc->ticks = rtc->hz - 1; /* force clock calibration on next tick */ rtc->rtime = sim_throt_ms_start - 1000 + 1000/rtc->hz;/* adjust calibration parameters to reflect throttled rate */ rtc->gtime = sim_throt_inst_start - sim_throt_cps + sim_throt_cps/rtc->hz; rtc->nxintv = 1000; rtc->based = rtc->currd; if (rtc->clock_unit) sim_activate_abs (rtc->clock_unit, rtc->currd);/* reschedule next tick */ } } } break; case SIM_THROT_STATE_THROTTLE: /* throttling */ sim_idle_ms_sleep (sim_throt_sleep_time); |
︙ | ︙ | |||
1986 1987 1988 1989 1990 1991 1992 1993 | } /* Clock assist activites */ t_stat sim_timer_tick_svc (UNIT *uptr) { int32 tmr = (int32)(uptr-sim_timer_units); t_stat stat; | > | | | | | | | | | | | | | | | | | | | | | | | | 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 | } /* Clock assist activites */ t_stat sim_timer_tick_svc (UNIT *uptr) { int32 tmr = (int32)(uptr-sim_timer_units); t_stat stat; RTC *rtc = &rtcs[tmr]; rtc->clock_ticks += 1; rtc->calib_tick_time += rtc->clock_tick_size; /* * Some devices may depend on executing during the same instruction or * immediately after the clock tick event. To satisfy this, we directly * run the clock event here and if it completes successfully, schedule any * currently coschedule units to run now. Ticks should never return a * non-success status, while co-schedule activities might, so they are * queued to run from sim_process_event */ sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_tick_svc(tmr=%d) - scheduling %s - cosched interval: %d\n", tmr, sim_uname (rtc->clock_unit), rtc->cosched_interval); if (rtc->clock_unit->action == NULL) return SCPE_IERR; stat = rtc->clock_unit->action (rtc->clock_unit); --rtc->cosched_interval; /* Countdown ticks */ if (rtc->clock_cosched_queue != QUEUE_LIST_END) rtc->clock_cosched_queue->time = rtc->cosched_interval; if ((stat == SCPE_OK) && (rtc->cosched_interval <= 0) && (rtc->clock_cosched_queue != QUEUE_LIST_END)) { UNIT *sptr = rtc->clock_cosched_queue; UNIT *cptr = QUEUE_LIST_END; if (rtc->clock_catchup_eligible) { /* calibration started? */ struct timespec now; double skew; clock_gettime(CLOCK_REALTIME, &now); skew = (_timespec_to_double(&now) - (rtc->calib_tick_time+rtc->clock_catchup_base_time)); if (fabs(skew) > fabs(rtc->clock_skew_max)) rtc->clock_skew_max = skew; } /* Gather any queued events which are scheduled for right now */ do { cptr = rtc->clock_cosched_queue; rtc->clock_cosched_queue = cptr->next; if (rtc->clock_cosched_queue != QUEUE_LIST_END) { rtc->clock_cosched_queue->time += rtc->cosched_interval; rtc->cosched_interval = rtc->clock_cosched_queue->time; } else rtc->cosched_interval = 0; } while ((rtc->cosched_interval <= 0) && (rtc->clock_cosched_queue != QUEUE_LIST_END)); if (cptr != QUEUE_LIST_END) cptr->next = QUEUE_LIST_END; /* Now dispatch that list (in order). */ while (sptr != QUEUE_LIST_END) { cptr = sptr; sptr = sptr->next; cptr->next = NULL; |
︙ | ︙ | |||
2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 | } void sim_rtcn_get_time (struct timespec *now, int tmr) { sim_debug (DBG_GET, &sim_timer_dev, "sim_rtcn_get_time(tmr=%d)\n", tmr); clock_gettime (CLOCK_REALTIME, now); } /* * If the host system has a relatively large clock tick (as compared to * the desired simulated hz) ticks will naturally be scheduled late and * these delays will accumulate. The net result will be unreasonably * slow ticks being delivered to the simulated system. * Additionally, when a simulator is idling and/or throttling, it will | > > > > > > > > > > > | 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 | } void sim_rtcn_get_time (struct timespec *now, int tmr) { sim_debug (DBG_GET, &sim_timer_dev, "sim_rtcn_get_time(tmr=%d)\n", tmr); clock_gettime (CLOCK_REALTIME, now); } time_t sim_get_time (time_t *now) { struct timespec ts_now; sim_debug (DBG_GET, &sim_timer_dev, "sim_get_time()\n"); sim_rtcn_get_time (&ts_now, 0); if (now) *now = ts_now.tv_sec; return ts_now.tv_sec; } /* * If the host system has a relatively large clock tick (as compared to * the desired simulated hz) ticks will naturally be scheduled late and * these delays will accumulate. The net result will be unreasonably * slow ticks being delivered to the simulated system. * Additionally, when a simulator is idling and/or throttling, it will |
︙ | ︙ | |||
2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 | * to sim_rtcn_tick_ack. sim_rtcn_tick_ack exists to provide a * mechanism to inform the simh timer facilities when the simulated * system has accepted the most recent clock tick interrupt. * 2) immediately when the simulator calls sim_idle * * catchup ticks are only scheduled (eligible to happen) under these * conditions after at least one tick has been acknowledged. */ /* _rtcn_tick_catchup_check - idle simulator until next event or for specified interval Inputs: | > > > | | > > > | < > > > > > > | > > > > > > > > > > > > > | | | | | | | | | | | | | | | | > | | | > > > | > > | > | | | | 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 | * to sim_rtcn_tick_ack. sim_rtcn_tick_ack exists to provide a * mechanism to inform the simh timer facilities when the simulated * system has accepted the most recent clock tick interrupt. * 2) immediately when the simulator calls sim_idle * * catchup ticks are only scheduled (eligible to happen) under these * conditions after at least one tick has been acknowledged. * * The clock tick UNIT that will be scheduled to run for catchup ticks * must be specified with sim_rtcn_init_unit(). */ /* _rtcn_tick_catchup_check - idle simulator until next event or for specified interval Inputs: RTC = calibrated timer to check/schedule time = instruction delay for next tick Returns TRUE if a catchup tick has been scheduled */ static t_bool _rtcn_tick_catchup_check (RTC *rtc, int32 time) { int32 tmr; t_bool bReturn = FALSE; if (!sim_catchup_ticks) return FALSE; if (time == -1) { for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { rtc = &rtcs[tmr]; if ((rtc->hz > 0) && rtc->clock_catchup_eligible) { double tnow = sim_timenow_double(); if (tnow > (rtc->clock_catchup_base_time + (rtc->calib_tick_time + rtc->clock_tick_size))) { if (!rtc->clock_catchup_pending) { sim_debug (DBG_TIK, &sim_timer_dev, "_rtcn_tick_catchup_check(%d) - scheduling catchup tick %d for %s which is behind %s\n", time, 1 + rtc->ticks, sim_uname (rtc->clock_unit), sim_fmt_secs (tnow - (rtc->clock_catchup_base_time + (rtc->calib_tick_time + rtc->clock_tick_size)))); rtc->clock_catchup_pending = TRUE; sim_activate_abs (rtc->timer_unit, 0); bReturn = TRUE; } else sim_debug (DBG_TIK, &sim_timer_dev, "_rtcn_tick_catchup_check(%d) - already pending catchup tick %d for %s which is behind %s\n", time, 1 + rtc->ticks, sim_uname (rtc->clock_unit), sim_fmt_secs (tnow - (rtc->clock_catchup_base_time + (rtc->calib_tick_time + rtc->clock_tick_size)))); } } } } if ((!rtc->clock_catchup_eligible) && /* not eligible yet? */ (time != -1)) { /* called from ack? */ rtc->clock_catchup_base_time = sim_timenow_double(); rtc->clock_ticks_tot += rtc->clock_ticks; rtc->clock_ticks = 0; rtc->calib_tick_time_tot += rtc->calib_tick_time; rtc->calib_tick_time = 0.0; rtc->clock_catchup_ticks_tot += rtc->clock_catchup_ticks; rtc->clock_catchup_ticks = 0; rtc->calib_ticks_acked_tot += rtc->calib_ticks_acked; rtc->calib_ticks_acked = 0; rtc->clock_catchup_eligible = TRUE; sim_debug (DBG_QUE, &sim_timer_dev, "_rtcn_tick_catchup_check() - Enabling catchup ticks for %s\n", sim_uname (rtc->clock_unit)); bReturn = TRUE; } if ((rtc->hz > 0) && rtc->clock_catchup_eligible) { double tnow = sim_timenow_double(); if (tnow > (rtc->clock_catchup_base_time + (rtc->calib_tick_time + rtc->clock_tick_size))) { if (!rtc->clock_catchup_pending) { sim_debug (DBG_TIK, &sim_timer_dev, "_rtcn_tick_catchup_check(%d) - scheduling catchup tick %d for %s which is behind %s\n", time, 1 + rtc->ticks, sim_uname (rtc->clock_unit), sim_fmt_secs (tnow - (rtc->clock_catchup_base_time + (rtc->calib_tick_time + rtc->clock_tick_size)))); rtc->clock_catchup_pending = TRUE; sim_activate_abs (rtc->timer_unit, (time < 0) ? 0 : time); } else sim_debug (DBG_TIK, &sim_timer_dev, "_rtcn_tick_catchup_check(%d) - already pending catchup tick %d for %s which is behind %s\n", time, 1 + rtc->ticks, sim_uname (rtc->clock_unit), sim_fmt_secs (tnow - (rtc->clock_catchup_base_time + (rtc->calib_tick_time + rtc->clock_tick_size)))); return TRUE; } } return bReturn; } t_stat sim_rtcn_tick_ack (uint32 time, int32 tmr) { RTC *rtc; if ((tmr < 0) || (tmr > SIM_NTIMERS)) return SCPE_TIMER; rtc = &rtcs[tmr]; sim_debug (DBG_ACK, &sim_timer_dev, "sim_rtcn_tick_ack - for %s\n", sim_uname (rtc->clock_unit)); _rtcn_tick_catchup_check (rtc, (int32)time); ++rtc->calib_ticks_acked; return SCPE_OK; } static double _timespec_to_double (struct timespec *time) { return ((double)time->tv_sec)+(double)(time->tv_nsec)/1000000000.0; |
︙ | ︙ | |||
2278 2279 2280 2281 2282 2283 2284 | return NULL; } #endif /* defined(SIM_ASYNCH_CLOCKS) */ /* | | | | | > | | | | | > > > > > > > > > > > | > | | > > | | > | | | | | | | | | | | | | | | | | | > | | | | | | | > | | | | | | | | | | | | | | | | > | 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 | return NULL; } #endif /* defined(SIM_ASYNCH_CLOCKS) */ /* In the event that there are no active calibrated clock devices, no instruction rate calibration will be performed. This is more likely on simpler simulators which don't have a full spectrum of standard devices or possibly when a clock device exists but its use is optional. Additonally, when a host system has a natural clock tick ( or minimal sleep time) which is greater than the tick size that a simulator wants to run a clock at, we run this clock at the rate implied by the host system's minimal sleep time or 50Hz. To solve this we merely run an internal clock at 100Hz. */ static t_stat sim_timer_clock_tick_svc (UNIT *uptr) { sim_debug(DBG_INT, &sim_timer_dev, "sim_timer_clock_tick_svc()\n"); sim_rtcn_calb (sim_int_clk_tps, SIM_INTERNAL_CLK); sim_activate_after (uptr, 1000000/sim_int_clk_tps); /* reactivate unit */ return SCPE_OK; } /* This routine exists to assure that there is a single reliably calibrated clock properly counting instruction execution relative to time. The best way to assure reliable calibration is to use a clock which ticks no faster than the host system's clock. This is optimal so that accurate time measurements are taken. If the simulated system doesn't have a clock with an appropriate tick rate, an internal clock is run that meets this requirement, OR when asynch clocks are enabled, the internal clock is always run. Some simulators have clocks that have dynamically programmable tick rates. Such a clock is only a reliable candidate to be the calibrated clock if it uses a single tick rate rather than changing the tick rate on the fly. Generally most systems like this, under normal conditions don't change their tick rates unless they're running something that is examining the behavior of the clock system (like a diagnostic). Under these conditions this clock is removed from the potential selection as "the" calibrated clock all others are relative to and if necessary, an internal calibrated clock is selected. */ static void _rtcn_configure_calibrated_clock (int32 newtmr) { int32 tmr; RTC *rtc, *crtc; /* Look for a timer running slower or the same as the host system clock */ sim_int_clk_tps = MIN(CLK_TPS, sim_os_tick_hz); for (tmr=0; tmr<SIM_NTIMERS; tmr++) { rtc = &rtcs[tmr]; if ((rtc->hz) && /* is calibrated AND */ (rtc->hz <= (uint32)sim_os_tick_hz) && /* slower than OS tick rate AND */ (rtc->clock_unit) && /* clock has been registered AND */ ((rtc->last_hz == 0) || /* first calibration call OR */ (rtc->last_hz == rtc->hz))) /* subsequent calibration call with an unchanged tick rate */ break; } if (tmr == SIM_NTIMERS) { /* None found? */ if ((tmr != newtmr) && (!sim_is_active (&SIM_INTERNAL_UNIT))) { if ((sim_calb_tmr != SIM_NTIMERS) &&/* not internal timer? */ (sim_calb_tmr != -1)) { /* previously active? */ crtc = &rtcs[sim_calb_tmr]; if (!crtc->hz) { /* now stopped? */ sim_debug (DBG_CAL, &sim_timer_dev, "_rtcn_configure_calibrated_clock(newtmr=%d) - Cleaning up stopped timer %s support\n", newtmr, sim_uname(crtc->clock_unit)); /* Migrate any coscheduled devices to the standard queue */ /* with appropriate usecs_remaining reflecting their currently */ /* scheduled firing time. sim_process_event() will coschedule */ /* appropriately. */ /* temporarily restore prior hz to get correct remaining time */ crtc->hz = crtc->last_hz; while (crtc->clock_cosched_queue != QUEUE_LIST_END) { UNIT *uptr = crtc->clock_cosched_queue; double usecs_remaining = sim_timer_activate_time_usecs (uptr) - 1; _sim_coschedule_cancel (uptr); _sim_activate (uptr, 1); uptr->usecs_remaining = usecs_remaining; } crtc->hz = 0; /* back to 0 */ if (crtc->clock_unit) sim_cancel (crtc->clock_unit); sim_cancel (crtc->timer_unit); } } /* Start the internal timer */ sim_calb_tmr = SIM_NTIMERS; sim_debug (DBG_CAL|DBG_INT, &sim_timer_dev, "_rtcn_configure_calibrated_clock(newtmr=%d) - Starting Internal Calibrated Timer at %dHz\n", newtmr, sim_int_clk_tps); SIM_INTERNAL_UNIT.action = &sim_timer_clock_tick_svc; SIM_INTERNAL_UNIT.flags = UNIT_IDLE; sim_register_internal_device (&sim_int_timer_dev); /* Register Internal timer device */ sim_rtcn_init_unit_ticks (&SIM_INTERNAL_UNIT, (int32)((CLK_INIT*CLK_TPS)/sim_int_clk_tps), SIM_INTERNAL_CLK, sim_int_clk_tps); SIM_INTERNAL_UNIT.action (&SIM_INTERNAL_UNIT); /* Force tick to activate timer */ } return; } if ((tmr == newtmr) && (sim_calb_tmr == newtmr)) /* already set? */ return; if (sim_calb_tmr == SIM_NTIMERS) { /* was old the internal timer? */ sim_debug (DBG_CAL|DBG_INT, &sim_timer_dev, "_rtcn_configure_calibrated_clock(newtmr=%d) - Stopping Internal Calibrated Timer, New Timer = %d (%dHz)\n", newtmr, tmr, rtc->hz); rtcs[SIM_NTIMERS].initd = 0; rtcs[SIM_NTIMERS].hz = 0; sim_register_clock_unit_tmr (NULL, SIM_INTERNAL_CLK); sim_cancel (&SIM_INTERNAL_UNIT); sim_cancel (&sim_timer_units[SIM_NTIMERS]); } else { if (sim_calb_tmr != -1) { crtc = &rtcs[sim_calb_tmr]; if (crtc->hz == 0) { /* Migrate any coscheduled devices to the standard queue */ /* with appropriate usecs_remaining reflecting their currently */ /* scheduled firing time. sim_process_event() will coschedule */ /* appropriately. */ /* temporarily restore prior hz to get correct remaining time */ crtc->hz = crtc->last_hz; while (crtc->clock_cosched_queue != QUEUE_LIST_END) { UNIT *uptr = crtc->clock_cosched_queue; double usecs_remaining = sim_timer_activate_time_usecs (uptr) - 1; _sim_coschedule_cancel (uptr); _sim_activate (uptr, 1); uptr->usecs_remaining = usecs_remaining; } crtc->hz = 0; /* back to 0 */ } sim_debug (DBG_CAL|DBG_INT, &sim_timer_dev, "_rtcn_configure_calibrated_clock(newtmr=%d) - Changing Calibrated Timer from %d (%dHz) to %d (%dHz)\n", newtmr, sim_calb_tmr, crtc->last_hz, tmr, rtc->hz); } sim_calb_tmr = tmr; } sim_calb_tmr = tmr; } static t_stat sim_timer_clock_reset (DEVICE *dptr) { |
︙ | ︙ | |||
2410 2411 2412 2413 2414 2415 2416 | sim_calb_tmr = -1; } return SCPE_OK; } void sim_start_timer_services (void) { | > > > | > > > | | < < | > > > > | | | > > | | < | > > | < < > > > | 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 | sim_calb_tmr = -1; } return SCPE_OK; } void sim_start_timer_services (void) { int32 tmr; uint32 sim_prompt_time = (sim_gtime () > 0) ? (sim_os_msec () - sim_stop_time) : 0; int32 registered_units = 0; sim_time_at_sim_prompt += (((double)sim_prompt_time) / 1000.0); for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; if (rtc->initd) { /* calibrated clock initialized? */ rtc->rtime += sim_prompt_time; rtc->vtime += sim_prompt_time; sim_debug (DBG_CAL, &sim_timer_dev, "sim_start_timer_services(tmr=%d) - adjusting calibration real time by %d ms\n", tmr, (int)sim_prompt_time); if (rtc->clock_catchup_eligible) rtc->calib_tick_time += (((double)sim_prompt_time) / 1000.0); if (rtc->clock_unit) ++registered_units; } } if (registered_units == 1) sim_catchup_ticks = FALSE; if (sim_calb_tmr == -1) { sim_debug (DBG_CAL, &sim_timer_dev, "sim_start_timer_services() - starting from scratch\n"); _rtcn_configure_calibrated_clock (sim_calb_tmr); } else { if (sim_calb_tmr == SIM_NTIMERS) { sim_debug (DBG_CAL, &sim_timer_dev, "sim_start_timer_services() - restarting internal timer after %d %s\n", sim_internal_timer_time, sim_vm_interval_units); sim_activate (&SIM_INTERNAL_UNIT, sim_internal_timer_time); } } if (sim_timer_stop_time > sim_gtime()) sim_activate_abs (&sim_stop_unit, (int32)(sim_timer_stop_time - sim_gtime())); #if defined(SIM_ASYNCH_CLOCKS) pthread_mutex_lock (&sim_timer_lock); if (sim_asynch_timer) { pthread_attr_t attr; |
︙ | ︙ | |||
2453 2454 2455 2456 2457 2458 2459 | #endif } void sim_stop_timer_services (void) { int tmr; | | > | | | | | | | | | | | | > > < | | 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 | #endif } void sim_stop_timer_services (void) { int tmr; sim_debug (DBG_TRC, &sim_timer_dev, "sim_stop_timer_services(sim_interval=%d, sim_calb_tmr=%d)\n", sim_interval, sim_calb_tmr); if (sim_interval < 0) sim_interval = 0; /* No catching up after stopping */ for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { int32 accum; RTC *rtc = &rtcs[tmr]; if (rtc->clock_unit) { int32 clock_time = _sim_activate_time (rtc->timer_unit); /* Stop clock assist unit and make sure the clock unit has a tick queued */ if (sim_is_active (rtc->timer_unit)) { sim_cancel (rtc->timer_unit); sim_debug (DBG_QUE, &sim_timer_dev, "sim_stop_timer_services() - tmr=%d scheduling %s after %d\n", tmr, sim_uname (rtc->clock_unit), clock_time); _sim_activate (rtc->clock_unit, clock_time); } /* Move coscheduled units to the standard event queue */ /* scheduled to fire at the same time as the related */ /* clock unit is to fire with excess time reflected in */ /* the unit usecs_remaining value */ accum = rtc->cosched_interval; while (rtc->clock_cosched_queue != QUEUE_LIST_END) { UNIT *cptr = rtc->clock_cosched_queue; double usecs_remaining = cptr->usecs_remaining; rtc->clock_cosched_queue = cptr->next; cptr->next = NULL; cptr->cancel = NULL; accum += cptr->time; cptr->usecs_remaining = 0.0; _sim_activate (cptr, clock_time); cptr->usecs_remaining = usecs_remaining + floor(1000000.0 * (accum - ((accum > 0) ? 1 : 0)) * rtc->clock_tick_size); sim_debug (DBG_QUE, &sim_timer_dev, "sim_stop_timer_services() - tmr=%d scheduling %s after %d and %.0f usecs\n", tmr, sim_uname (cptr), clock_time, cptr->usecs_remaining); } rtc->cosched_interval = 0; } } if (sim_calb_tmr == SIM_NTIMERS) sim_internal_timer_time = sim_activate_time (&SIM_INTERNAL_UNIT) - 1; sim_cancel (&SIM_INTERNAL_UNIT); /* Make sure Internal Timer is stopped */ sim_cancel (&sim_timer_units[SIM_NTIMERS]); sim_calb_tmr_last = sim_calb_tmr; /* Save calibrated timer value for display */ sim_inst_per_sec_last = sim_timer_inst_per_sec (); /* Save execution rate for display */ sim_stop_time = sim_os_msec (); /* record when execution stopped */ #if defined(SIM_ASYNCH_CLOCKS) pthread_mutex_lock (&sim_timer_lock); if (sim_timer_thread_running) { sim_debug (DBG_TRC, &sim_timer_dev, "sim_stop_timer_services() - stopping\n"); pthread_cond_signal (&sim_timer_wake); pthread_mutex_unlock (&sim_timer_lock); pthread_join (sim_timer_thread, NULL); |
︙ | ︙ | |||
2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 | /* Instruction Execution rate. */ /* returns a double since it is mostly used in double expressions and to avoid overflow if/when strange timing delays might produce unexpected results */ double sim_timer_inst_per_sec (void) { double inst_per_sec = sim_inst_per_sec_last; if (sim_calb_tmr == -1) return inst_per_sec; | > > | | > | > | > | > | 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 | /* Instruction Execution rate. */ /* returns a double since it is mostly used in double expressions and to avoid overflow if/when strange timing delays might produce unexpected results */ double sim_timer_inst_per_sec (void) { double inst_per_sec = sim_inst_per_sec_last; RTC *rtc; if (sim_calb_tmr == -1) return inst_per_sec; rtc = &rtcs[sim_calb_tmr]; inst_per_sec = ((double)rtc->currd) * rtc->hz; if (inst_per_sec == 0.0) inst_per_sec = ((double)rtc->currd) * sim_int_clk_tps; return inst_per_sec; } t_stat sim_timer_activate (UNIT *uptr, int32 interval) { AIO_VALIDATE(uptr); return sim_timer_activate_after (uptr, (double)((interval * 1000000.0) / sim_timer_inst_per_sec ())); } t_stat sim_timer_activate_after (UNIT *uptr, double usec_delay) { UNIT *ouptr = uptr; int inst_delay, tmr; double inst_delay_d, inst_per_usec; t_stat stat; RTC *crtc; AIO_VALIDATE(uptr); /* If this is a clock unit, we need to schedule the related timer unit instead */ for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; if (rtc->clock_unit == uptr) { uptr = rtc->timer_unit; break; } } if (sim_is_active (uptr)) /* already active? */ return SCPE_OK; if (usec_delay < 0.0) { sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_after(%s, %.0f usecs) - surprising usec value\n", sim_uname(uptr), usec_delay); } if ((sim_is_running) || (tmr <= SIM_NTIMERS)) |
︙ | ︙ | |||
2604 2605 2606 2607 2608 2609 2610 | inst_per_usec = sim_timer_inst_per_sec () / 1000000.0; inst_delay_d = floor(inst_per_usec * usec_delay); inst_delay = (int32)inst_delay_d; if ((inst_delay == 0) && (usec_delay != 0)) inst_delay_d = inst_delay = 1; /* Minimum non-zero delay is 1 instruction */ if (uptr->usecs_remaining != 0.0) /* No calibrated timer yet, wait one cycle */ inst_delay_d = inst_delay = 1; /* Minimum non-zero delay is 1 instruction */ | > > | | | | | | | | | | | | | | | | | | | | | | | | | | | > | 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 | inst_per_usec = sim_timer_inst_per_sec () / 1000000.0; inst_delay_d = floor(inst_per_usec * usec_delay); inst_delay = (int32)inst_delay_d; if ((inst_delay == 0) && (usec_delay != 0)) inst_delay_d = inst_delay = 1; /* Minimum non-zero delay is 1 instruction */ if (uptr->usecs_remaining != 0.0) /* No calibrated timer yet, wait one cycle */ inst_delay_d = inst_delay = 1; /* Minimum non-zero delay is 1 instruction */ if (sim_calb_tmr != -1) { crtc = &rtcs[sim_calb_tmr]; if (crtc->hz) { /* Calibrated Timer available? */ int32 inst_til_tick = sim_activate_time (crtc->timer_unit) - 1; int32 ticks_til_calib = crtc->hz - crtc->ticks; double usecs_per_tick = floor (1000000.0 / crtc->hz); int32 inst_til_calib = inst_til_tick + ((ticks_til_calib - 1) * crtc->currd); uint32 usecs_til_calib = (uint32)ceil(inst_til_calib / inst_per_usec); if ((uptr != crtc->timer_unit) && /* Not scheduling calibrated timer */ (inst_til_tick > 0)) { /* and tick not pending? */ if (inst_delay_d > (double)inst_til_calib) { /* long wait? */ stat = sim_clock_coschedule_tmr (uptr, sim_calb_tmr, ticks_til_calib - 1); uptr->usecs_remaining = (stat == SCPE_OK) ? usec_delay - usecs_til_calib : 0.0; sim_debug (DBG_TIM, &sim_timer_dev, "sim_timer_activate_after(%s, %.0f usecs) - coscheduling with with calibrated timer(%d), ticks=%d, usecs_remaining=%.0f usecs, inst_til_tick=%d, ticks_til_calib=%d, usecs_til_calib=%u\n", sim_uname(uptr), usec_delay, sim_calb_tmr, ticks_til_calib, uptr->usecs_remaining, inst_til_tick, ticks_til_calib, usecs_til_calib); sim_debug (DBG_CHK, &sim_timer_dev, "sim_timer_activate_after(%s, %.0f usecs) - result = %.0f usecs, %.0f usecs\n", sim_uname(uptr), usec_delay, sim_timer_activate_time_usecs (ouptr), sim_timer_activate_time_usecs (uptr)); return stat; } if ((usec_delay > (2 * usecs_per_tick)) && (ticks_til_calib > 1)) { /* long wait? */ double usecs_til_tick = floor (inst_til_tick / inst_per_usec); stat = sim_clock_coschedule_tmr (uptr, sim_calb_tmr, 0); uptr->usecs_remaining = (stat == SCPE_OK) ? usec_delay - usecs_til_tick : 0.0; sim_debug (DBG_TIM, &sim_timer_dev, "sim_timer_activate_after(%s, %.0f usecs) - coscheduling with with calibrated timer(%d), ticks=%d, usecs_remaining=%.0f usecs, inst_til_tick=%d, usecs_til_tick=%.0f\n", sim_uname(uptr), usec_delay, sim_calb_tmr, 0, uptr->usecs_remaining, inst_til_tick, usecs_til_tick); sim_debug (DBG_CHK, &sim_timer_dev, "sim_timer_activate_after(%s, %.0f usecs) - result = %.0f usecs, %.0f usecs\n", sim_uname(uptr), usec_delay, sim_timer_activate_time_usecs (ouptr), sim_timer_activate_time_usecs (uptr)); return stat; } } } } /* * We're here to schedule if: * No Calibrated Timer, OR * Scheduling the Calibrated Timer OR |
︙ | ︙ | |||
2663 2664 2665 2666 2667 2668 2669 | uptr->a_usec_delay = usec_delay; uptr->a_due_time = d_now + (usec_delay / 1000000.0); uptr->a_due_gtime = sim_gtime () + (sim_timer_inst_per_sec () * (usec_delay / 1000000.0)); uptr->cancel = &_sim_wallclock_cancel; /* bind cleanup method */ uptr->a_is_active = &_sim_wallclock_is_active; if (tmr <= SIM_NTIMERS) { /* Timer Unit? */ | > > | | | 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 | uptr->a_usec_delay = usec_delay; uptr->a_due_time = d_now + (usec_delay / 1000000.0); uptr->a_due_gtime = sim_gtime () + (sim_timer_inst_per_sec () * (usec_delay / 1000000.0)); uptr->cancel = &_sim_wallclock_cancel; /* bind cleanup method */ uptr->a_is_active = &_sim_wallclock_is_active; if (tmr <= SIM_NTIMERS) { /* Timer Unit? */ RTC *rtc = &rtcs[tmr]; rtc->clock_unit->cancel = &_sim_wallclock_cancel; rtc->clock_unit->a_is_active = &_sim_wallclock_is_active; } sim_debug (DBG_TIM, &sim_timer_dev, "sim_timer_activate_after(%s, %.0f usecs) - queueing wallclock addition at %.6f\n", sim_uname(uptr), usec_delay, uptr->a_due_time); pthread_mutex_lock (&sim_timer_lock); for (cptr = sim_wallclock_queue, prvptr = NULL; cptr != QUEUE_LIST_END; cptr = cptr->a_next) { |
︙ | ︙ | |||
2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 | return stat; } /* Clock coscheduling routines */ t_stat sim_register_clock_unit_tmr (UNIT *uptr, int32 tmr) { if (tmr == SIM_INTERNAL_CLK) tmr = SIM_NTIMERS; else { if ((tmr < 0) || (tmr > SIM_NTIMERS)) return SCPE_IERR; } if (NULL == uptr) { /* deregistering? */ /* Migrate any coscheduled devices to the standard queue */ /* they will fire and subsequently requeue themselves */ | > > > | | | | | | | | | | | | | > | > | 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 | return stat; } /* Clock coscheduling routines */ t_stat sim_register_clock_unit_tmr (UNIT *uptr, int32 tmr) { RTC *rtc; if (tmr == SIM_INTERNAL_CLK) tmr = SIM_NTIMERS; else { if ((tmr < 0) || (tmr > SIM_NTIMERS)) return SCPE_IERR; } rtc = &rtcs[tmr]; if (NULL == uptr) { /* deregistering? */ /* Migrate any coscheduled devices to the standard queue */ /* they will fire and subsequently requeue themselves */ while (rtc->clock_cosched_queue != QUEUE_LIST_END) { UNIT *uptr = rtc->clock_cosched_queue; double usecs_remaining = sim_timer_activate_time_usecs (uptr); _sim_coschedule_cancel (uptr); _sim_activate (uptr, 1); uptr->usecs_remaining = usecs_remaining; } if (rtc->clock_unit) { sim_cancel (rtc->clock_unit); rtc->clock_unit->dynflags &= ~UNIT_TMR_UNIT; } rtc->clock_unit = NULL; sim_cancel (rtc->timer_unit); return SCPE_OK; } if (rtc->clock_unit == NULL) rtc->clock_cosched_queue = QUEUE_LIST_END; rtc->clock_unit = uptr; uptr->dynflags |= UNIT_TMR_UNIT; rtc->timer_unit->flags = ((tmr == SIM_NTIMERS) ? 0 : UNIT_DIS) | (rtc->clock_unit ? UNIT_IDLE : 0); return SCPE_OK; } /* Default timer is 0, otherwise use a calibrated one if it exists */ int32 sim_rtcn_calibrated_tmr (void) { return ((rtcs[0].currd && rtcs[0].hz) ? 0 : ((sim_calb_tmr != -1) ? sim_calb_tmr : 0)); } int32 sim_rtcn_tick_size (int32 tmr) { RTC *rtc = &rtcs[tmr]; return (rtc->currd) ? rtc->currd : 10000; } t_stat sim_register_clock_unit (UNIT *uptr) { return sim_register_clock_unit_tmr (uptr, 0); } |
︙ | ︙ | |||
2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 | return sim_clock_coschedule (uptr, interval); } /* ticks - 0 means on the next tick, 1 means the second tick, etc. */ t_stat sim_clock_coschedule_tmr (UNIT *uptr, int32 tmr, int32 ticks) { if (ticks < 0) return SCPE_ARG; if (sim_is_active (uptr)) { sim_debug (DBG_TIM, &sim_timer_dev, "sim_clock_coschedule_tmr(%s, tmr=%d, ticks=%d) - already active\n", sim_uname (uptr), tmr, ticks); return SCPE_OK; } if (tmr == SIM_INTERNAL_CLK) tmr = SIM_NTIMERS; else { if ((tmr < 0) || (tmr > SIM_NTIMERS)) return sim_activate (uptr, MAX(1, ticks) * 10000); } | > > > | | | | | | | | | | | > > | | | | | 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 | return sim_clock_coschedule (uptr, interval); } /* ticks - 0 means on the next tick, 1 means the second tick, etc. */ t_stat sim_clock_coschedule_tmr (UNIT *uptr, int32 tmr, int32 ticks) { RTC *rtc; if (ticks < 0) return SCPE_ARG; if (sim_is_active (uptr)) { sim_debug (DBG_TIM, &sim_timer_dev, "sim_clock_coschedule_tmr(%s, tmr=%d, ticks=%d) - already active\n", sim_uname (uptr), tmr, ticks); return SCPE_OK; } if (tmr == SIM_INTERNAL_CLK) tmr = SIM_NTIMERS; else { if ((tmr < 0) || (tmr > SIM_NTIMERS)) return sim_activate (uptr, MAX(1, ticks) * 10000); } rtc = &rtcs[tmr]; if ((NULL == rtc->clock_unit) || (rtc->hz == 0)) { sim_debug (DBG_TIM, &sim_timer_dev, "sim_clock_coschedule_tmr(%s, tmr=%d, ticks=%d) - no clock activating after %d %s\n", sim_uname (uptr), tmr, ticks, ticks * (rtc->currd ? rtc->currd : rtcs[sim_rtcn_calibrated_tmr ()].currd), sim_vm_interval_units); return sim_activate (uptr, ticks * (rtc->currd ? rtc->currd : rtcs[sim_rtcn_calibrated_tmr ()].currd)); } else { UNIT *cptr, *prvptr; int32 accum; if (rtc->clock_cosched_queue != QUEUE_LIST_END) rtc->clock_cosched_queue->time = rtc->cosched_interval; prvptr = NULL; accum = 0; for (cptr = rtc->clock_cosched_queue; cptr != QUEUE_LIST_END; cptr = cptr->next) { if (ticks < (accum + cptr->time)) break; accum += cptr->time; prvptr = cptr; } if (prvptr == NULL) { cptr = uptr->next = rtc->clock_cosched_queue; rtc->clock_cosched_queue = uptr; } else { cptr = uptr->next = prvptr->next; prvptr->next = uptr; } uptr->time = ticks - accum; if (cptr != QUEUE_LIST_END) cptr->time = cptr->time - uptr->time; uptr->cancel = &_sim_coschedule_cancel; /* bind cleanup method */ if (uptr == rtc->clock_cosched_queue) rtc->cosched_interval = rtc->clock_cosched_queue->time; sim_debug (DBG_QUE, &sim_timer_dev, "sim_clock_coschedule_tmr(%s, tmr=%d, ticks=%d, hz=%d) - queueing for clock co-schedule, interval now: %d\n", sim_uname (uptr), tmr, ticks, rtc->hz, rtc->cosched_interval); } return SCPE_OK; } t_stat sim_clock_coschedule_tmr_abs (UNIT *uptr, int32 tmr, int32 ticks) { sim_cancel (uptr); return sim_clock_coschedule_tmr (uptr, tmr, ticks); } /* Cancel a unit on the coschedule queue */ static t_bool _sim_coschedule_cancel (UNIT *uptr) { AIO_UPDATE_QUEUE; if (uptr->next) { /* On a queue? */ int tmr; UNIT *nptr; for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; if (rtc->clock_unit) { if (uptr == rtc->clock_cosched_queue) { nptr = rtc->clock_cosched_queue = uptr->next; uptr->next = NULL; } else { UNIT *cptr; for (cptr = rtc->clock_cosched_queue; (cptr != QUEUE_LIST_END); cptr = cptr->next) { if (cptr->next == uptr) { nptr = cptr->next = (uptr)->next; uptr->next = NULL; break; } |
︙ | ︙ | |||
2885 2886 2887 2888 2889 2890 2891 | t_bool sim_timer_is_active (UNIT *uptr) { int32 tmr; if (!(uptr->dynflags & UNIT_TMR_UNIT)) return FALSE; for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { | > | > > | > | > | > > | 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 | t_bool sim_timer_is_active (UNIT *uptr) { int32 tmr; if (!(uptr->dynflags & UNIT_TMR_UNIT)) return FALSE; for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; if (rtc->clock_unit == uptr) return sim_is_active (&sim_timer_units[tmr]); } return FALSE; } t_bool sim_timer_cancel (UNIT *uptr) { int32 tmr; if (!(uptr->dynflags & UNIT_TMR_UNIT)) return SCPE_IERR; for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; if (rtc->clock_unit == uptr) return sim_cancel (&sim_timer_units[tmr]); } return SCPE_IERR; } #if defined(SIM_ASYNCH_CLOCKS) static t_bool _sim_wallclock_cancel (UNIT *uptr) { int32 tmr; t_bool b_return = FALSE; AIO_UPDATE_QUEUE; pthread_mutex_lock (&sim_timer_lock); /* If this is a clock unit, we need to cancel both this and the related timer unit */ for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; if (rtc->clock_unit == uptr) { uptr = &sim_timer_units[tmr]; break; } } if (uptr->a_next) { UNIT *cptr; if (uptr == sim_wallclock_entry) { /* Pending on the queue? */ sim_wallclock_entry = NULL; uptr->a_next = NULL; sim_debug (DBG_QUE, &sim_timer_dev, "Canceled Queue Pending Timer Event for %s\n", sim_uname(uptr)); |
︙ | ︙ | |||
2951 2952 2953 2954 2955 2956 2957 | } } if (uptr->a_next == NULL) { /* Was canceled? */ uptr->a_due_time = uptr->a_due_gtime = uptr->a_usec_delay = 0; uptr->cancel = NULL; uptr->a_is_active = NULL; if (tmr <= SIM_NTIMERS) { /* Timer Unit? */ | > > | | | > | > > | 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 | } } if (uptr->a_next == NULL) { /* Was canceled? */ uptr->a_due_time = uptr->a_due_gtime = uptr->a_usec_delay = 0; uptr->cancel = NULL; uptr->a_is_active = NULL; if (tmr <= SIM_NTIMERS) { /* Timer Unit? */ RTC *rtc = &rtcs[tmr]; rtc->clock_unit->cancel = NULL; rtc->clock_unit->a_is_active = NULL; } b_return = TRUE; } } pthread_mutex_unlock (&sim_timer_lock); return b_return; } static t_bool _sim_wallclock_is_active (UNIT *uptr) { int32 tmr; if (uptr->a_next) return TRUE; /* If this is a clock unit, we need to examine the related timer unit instead */ for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; if (rtc->clock_unit == uptr) return (sim_timer_units[tmr].a_next != NULL); } return FALSE; } #endif /* defined(SIM_ASYNCH_CLOCKS) */ int32 _sim_timer_activate_time (UNIT *uptr) { UNIT *cptr; |
︙ | ︙ | |||
3015 3016 3017 3018 3019 3020 3021 3022 | if (uptr->a_next) return uptr->a_event_time + 1; #endif /* defined(SIM_ASYNCH_CLOCKS) */ if (uptr->cancel == &_sim_coschedule_cancel) { for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { int32 accum = 0; | > > | | | | | > | > | 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 | if (uptr->a_next) return uptr->a_event_time + 1; #endif /* defined(SIM_ASYNCH_CLOCKS) */ if (uptr->cancel == &_sim_coschedule_cancel) { for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { int32 accum = 0; RTC *rtc = &rtcs[tmr]; for (cptr = rtc->clock_cosched_queue; cptr != QUEUE_LIST_END; cptr = cptr->next) { if (cptr == rtc->clock_cosched_queue) { if (rtc->cosched_interval > 0) accum += rtc->cosched_interval; } else accum += cptr->time; if (cptr == uptr) return (rtc->currd * accum) + sim_activate_time (&sim_timer_units[tmr]); } } } for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { if ((uptr == &sim_timer_units[tmr]) && (uptr->next)){ return _sim_activate_time (&sim_timer_units[tmr]); } } return -1; /* Not found. */ } double sim_timer_activate_time_usecs (UNIT *uptr) { UNIT *cptr; int32 tmr; double result = -1.0; /* If this is a clock unit, we need to return the related clock assist unit instead */ for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; if (rtc->clock_unit == uptr) { uptr = &sim_timer_units[tmr]; break; } } if (!sim_is_active (uptr)) { sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) - not active\n", sim_uname (uptr)); |
︙ | ︙ | |||
3090 3091 3092 3093 3094 3095 3096 3097 | return result; } #endif /* defined(SIM_ASYNCH_CLOCKS) */ if (uptr->cancel == &_sim_coschedule_cancel) { for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { int32 accum = 0; | > | | | | | | > > | | | 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 | return result; } #endif /* defined(SIM_ASYNCH_CLOCKS) */ if (uptr->cancel == &_sim_coschedule_cancel) { for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { int32 accum = 0; RTC *rtc = &rtcs[tmr]; for (cptr = rtc->clock_cosched_queue; cptr != QUEUE_LIST_END; cptr = cptr->next) { if (cptr == rtc->clock_cosched_queue) { if (rtc->cosched_interval > 0) accum += rtc->cosched_interval; } else accum += cptr->time; if (cptr == uptr) { result = uptr->usecs_remaining + ceil(1000000.0 * ((rtc->currd * accum) + sim_activate_time (&sim_timer_units[tmr]) - 1) / sim_timer_inst_per_sec ()); sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) coscheduled - %.0f usecs, inst_per_sec=%.0f, tmr=%d, ticksize=%d, ticks=%d, inst_til_tick=%d, usecs_remaining=%.0f\n", sim_uname (uptr), result, sim_timer_inst_per_sec (), tmr, rtc->currd, accum, sim_activate_time (&sim_timer_units[tmr]) - 1, uptr->usecs_remaining); return result; } } } } for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; if ((uptr == rtc->clock_unit) && (uptr->next)) { result = rtc->clock_unit->usecs_remaining + (1000000.0 * (sim_activate_time (&sim_timer_units[tmr]) - 1)) / sim_timer_inst_per_sec (); sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) clock - %.0f usecs, inst_per_sec=%.0f, usecs_remaining=%.0f\n", sim_uname (uptr), result, sim_timer_inst_per_sec (), uptr->usecs_remaining); return result; } if ((uptr == &sim_timer_units[tmr]) && (uptr->next)){ result = uptr->usecs_remaining + (1000000.0 * (sim_activate_time (uptr) - 1)) / sim_timer_inst_per_sec (); sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) clock - %.0f usecs, inst_per_sec=%.0f, usecs_remaining=%.0f\n", sim_uname (uptr), result, sim_timer_inst_per_sec (), uptr->usecs_remaining); return result; |
︙ | ︙ | |||
3195 3196 3197 3198 3199 3200 3201 | return sim_rom_delay; } void sim_set_rom_delay_factor (uint32 delay) { sim_rom_delay = delay; } | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 | return sim_rom_delay; } void sim_set_rom_delay_factor (uint32 delay) { sim_rom_delay = delay; } /* sim_timer_precalibrate_execution_rate * * The point of this routine is to run a bunch of simulator provided * instructions that don't do anything, but run in an effective loop. * That loop is run for some 5 million instructions and based on * the time those 5 million instructions take to execute the effective * execution rate. That rate is used to avoid the initial 3 to 5 * seconds that normal clock calibration takes. * */ void sim_timer_precalibrate_execution_rate (void) { const char **cmd = sim_clock_precalibrate_commands; uint32 start, end; int32 saved_switches = sim_switches; int32 tmr; UNIT precalib_unit = { UDATA (&sim_timer_stop_svc, 0, 0) }; if (cmd == NULL) return; sim_run_boot_prep (RU_GO); while (sim_clock_queue != QUEUE_LIST_END) sim_cancel (sim_clock_queue); while (*cmd) exdep_cmd (EX_D, *(cmd++)); sim_switches = saved_switches; sim_cancel (&SIM_INTERNAL_UNIT); start = sim_os_msec(); do { sim_activate (&precalib_unit, sim_precalibrate_ips); sim_instr(); end = sim_os_msec(); } while ((end - start) < SIM_PRE_CALIBRATE_MIN_MS); sim_precalibrate_ips = (int32)(1000.0 * (sim_precalibrate_ips / (double)(end - start))); for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; if (rtc->hz) rtc->initd = rtc->currd = (int32)(((double)sim_precalibrate_ips) / rtc->hz); } reset_all_p (0); sim_run_boot_prep (RU_GO); for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { RTC *rtc = &rtcs[tmr]; if (rtc->calib_initializations) rtc->calib_initializations = 1; } sim_inst_per_sec_last = sim_precalibrate_ips; sim_idle_stable = 0; } double sim_host_speed_factor (void) { if (sim_precalibrate_ips > sim_vm_initial_ips) return 1.0; return (double)sim_vm_initial_ips / (double)sim_precalibrate_ips; } |
︙ | ︙ | |||
72 73 74 75 76 77 78 | int clock_gettime(int clock_id, struct timespec *tp); #endif #define SIM_NTIMERS 8 /* # timers */ #define SIM_TMAX 500 /* max timer makeup */ | | > | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | int clock_gettime(int clock_id, struct timespec *tp); #endif #define SIM_NTIMERS 8 /* # timers */ #define SIM_TMAX 500 /* max timer makeup */ #define SIM_INITIAL_IPS 5000000 /* uncalibrated assumption */ /* about instructions per second */ #define SIM_PRE_CALIBRATE_MIN_MS 100 /* minimum time to run precalibration activities */ #define SIM_IDLE_CAL 10 /* ms to calibrate */ #define SIM_IDLE_STMIN 2 /* min sec for stability */ #define SIM_IDLE_STDFLT 20 /* dft sec for stability */ #define SIM_IDLE_STMAX 600 /* max sec for stability */ #define SIM_THROT_WINIT 1000 /* cycles to skip */ |
︙ | ︙ | |||
104 105 106 107 108 109 110 111 112 113 | #define TIMER_DBG_MUX 0x004 /* Debug Flag for Asynch Queue Debugging */ t_bool sim_timer_init (void); void sim_timespec_diff (struct timespec *diff, struct timespec *min, struct timespec *sub); double sim_timenow_double (void); int32 sim_rtcn_init (int32 time, int32 tmr); int32 sim_rtcn_init_unit (UNIT *uptr, int32 time, int32 tmr); void sim_rtcn_get_time (struct timespec *now, int tmr); t_stat sim_rtcn_tick_ack (uint32 time, int32 tmr); void sim_rtcn_init_all (void); | > > > | | | 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #define TIMER_DBG_MUX 0x004 /* Debug Flag for Asynch Queue Debugging */ t_bool sim_timer_init (void); void sim_timespec_diff (struct timespec *diff, struct timespec *min, struct timespec *sub); double sim_timenow_double (void); int32 sim_rtcn_init (int32 time, int32 tmr); int32 sim_rtcn_init_unit (UNIT *uptr, int32 time, int32 tmr); int32 sim_rtcn_init_unit_ticks (UNIT *uptr, int32 time, int32 tmr, int32 ticksper); void sim_rtcn_get_time (struct timespec *now, int tmr); time_t sim_get_time (time_t *now); t_stat sim_rtcn_tick_ack (uint32 time, int32 tmr); void sim_rtcn_init_all (void); int32 sim_rtcn_calb (uint32 ticksper, int32 tmr); int32 sim_rtcn_calb_tick (int32 tmr); int32 sim_rtc_init (int32 time); int32 sim_rtc_calb (uint32 ticksper); t_stat sim_set_timers (int32 arg, CONST char *cptr); t_stat sim_show_timers (FILE* st, DEVICE *dptr, UNIT* uptr, int32 val, CONST char* desc); t_stat sim_show_clock_queues (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr); t_bool sim_idle (uint32 tmr, int sin_cyc); t_stat sim_set_throt (int32 arg, CONST char *cptr); t_stat sim_show_throt (FILE *st, DEVICE *dnotused, UNIT *unotused, int32 flag, CONST char *cptr); t_stat sim_set_idle (UNIT *uptr, int32 val, CONST char *cptr, void *desc); |
︙ | ︙ | |||
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | t_stat sim_register_clock_unit (UNIT *uptr); t_stat sim_register_clock_unit_tmr (UNIT *uptr, int32 tmr); t_stat sim_clock_coschedule (UNIT *uptr, int32 interval); t_stat sim_clock_coschedule_abs (UNIT *uptr, int32 interval); t_stat sim_clock_coschedule_tmr (UNIT *uptr, int32 tmr, int32 ticks); t_stat sim_clock_coschedule_tmr_abs (UNIT *uptr, int32 tmr, int32 ticks); double sim_timer_inst_per_sec (void); int32 sim_rtcn_tick_size (int32 tmr); int32 sim_rtcn_calibrated_tmr (void); t_bool sim_timer_idle_capable (uint32 *host_ms_sleep_1, uint32 *host_tick_ms); #define PRIORITY_BELOW_NORMAL -1 #define PRIORITY_NORMAL 0 #define PRIORITY_ABOVE_NORMAL 1 t_stat sim_os_set_thread_priority (int below_normal_above); uint32 sim_get_rom_delay_factor (void); void sim_set_rom_delay_factor (uint32 delay); int32 sim_rom_read_with_delay (int32 val); extern t_bool sim_idle_enab; /* idle enabled flag */ extern volatile t_bool sim_idle_wait; /* idle waiting flag */ extern t_bool sim_asynch_timer; extern DEVICE sim_timer_dev; extern UNIT * volatile sim_clock_cosched_queue[SIM_NTIMERS+1]; extern const t_bool rtc_avail; #ifdef __cplusplus } #endif #endif | > > | 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | t_stat sim_register_clock_unit (UNIT *uptr); t_stat sim_register_clock_unit_tmr (UNIT *uptr, int32 tmr); t_stat sim_clock_coschedule (UNIT *uptr, int32 interval); t_stat sim_clock_coschedule_abs (UNIT *uptr, int32 interval); t_stat sim_clock_coschedule_tmr (UNIT *uptr, int32 tmr, int32 ticks); t_stat sim_clock_coschedule_tmr_abs (UNIT *uptr, int32 tmr, int32 ticks); double sim_timer_inst_per_sec (void); void sim_timer_precalibrate_execution_rate (void); int32 sim_rtcn_tick_size (int32 tmr); int32 sim_rtcn_calibrated_tmr (void); t_bool sim_timer_idle_capable (uint32 *host_ms_sleep_1, uint32 *host_tick_ms); #define PRIORITY_BELOW_NORMAL -1 #define PRIORITY_NORMAL 0 #define PRIORITY_ABOVE_NORMAL 1 t_stat sim_os_set_thread_priority (int below_normal_above); uint32 sim_get_rom_delay_factor (void); void sim_set_rom_delay_factor (uint32 delay); int32 sim_rom_read_with_delay (int32 val); double sim_host_speed_factor (void); extern t_bool sim_idle_enab; /* idle enabled flag */ extern volatile t_bool sim_idle_wait; /* idle waiting flag */ extern t_bool sim_asynch_timer; extern DEVICE sim_timer_dev; extern UNIT * volatile sim_clock_cosched_queue[SIM_NTIMERS+1]; extern const t_bool rtc_avail; #ifdef __cplusplus } #endif #endif |
︙ | ︙ | |||
218 219 220 221 222 223 224 | sim> attach -V MUX Connect=SerN Line specific tcp listening ports are supported. These are configured using commands of the form: | | | | | | | | | 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 | sim> attach -V MUX Connect=SerN Line specific tcp listening ports are supported. These are configured using commands of the form: sim> attach MUX Line=2,port{;notelnet}|{;nomessage} Direct computer to computer connections (Virutal Null Modem cables) may be established using the telnet protocol or via raw tcp sockets. sim> attach MUX Line=2,Connect=host:port{;notelnet} Computer to computer virtual connections can be one way (as illustrated above) or symmetric. A symmetric connection is configured by combining a one way connection with a tcp listening port on the same line: sim> attach MUX Line=2,Connect=host:port,listenport When symmetric virtual connections are configured, incoming connections on the specified listening port are checked to assure that they actually come from the specified connection destination host system. The command syntax for a single line device (MX) is: sim> attach MX port{;notelnet}|{;nomessage} sim> attach MX Connect=serN{;config} sim> attach MX Connect=COM9{;config} sim> attach MX Connect=host:port{;notelnet}|{;nomessage} The command syntax for ANY multi-line device is: sim> attach MX port{;notelnet}|{;nomessage} ; Defines the master listening port for the mux and optionally allows non-telnet (i.e. raw socket) operation for all lines. sim> attach MX Line=n,port{;notelnet}|{;nomessage} ; Defines a line specific listen port for a particular line. Each line can have a separate listen port and the mux can have its own as well. Optionally disable telnet wire protocol (i.e. raw socket) sim> attach MX Line=n,Connect=serN{;config} ; Connects line n to simh generic serial port N (port list visible with the sim> SHOW SERIAL command), the optional ";config" data specifies the speed, parity and stop bits for the connection ; DTR (and RTS) will be raised at attach time and will drop at detach/disconnect time sim> attach MX Line=n,Connect=host:port{;notelnet} ; Causes a connection to be established to the designated host:port. The actual connection will happen in a non-blocking fashion and will be completed and/or re-established by the normal tmxr_poll_conn activities All connections configured for any multiplexer device are unconfigured by: sim> detach MX ; detaches ALL connections/ports/sessions on the MUX. Console serial connections are achieved by: |
︙ | ︙ | |||
280 281 282 283 284 285 286 | sim> attach MUX Line=2,Connect=remotehost:port;notelnet A single line multiplexor can indicate any of the above line options without specifying a line number: sim> attach MUX Connect=ser0;9600-8N1 | | < < < < < | 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 | sim> attach MUX Line=2,Connect=remotehost:port;notelnet A single line multiplexor can indicate any of the above line options without specifying a line number: sim> attach MUX Connect=ser0;9600-8N1 sim> attach MUX 12366{;notelnet}|{;nomessage} sim> attach MUX Connect=remotehost:port sim> attach MUX Connect=remotehost:port;notelnet A multiplexor can disconnect all (telnet, serial and outgoing) previous attachments with: sim> detach MUX A device emulation may choose to implement a command interface to disconnect specific individual lines. This would usually be done via a Unit Modifier table entry (MTAB) which dispatches the command "SET dev DISCONNECT[=line]" to tmxr_dscln. This will cause a telnet connection to be closed, but a serial port will normally have DTR dropped for 500ms and raised again (thus hanging up a modem on that serial port). sim> set MUX disconnect=2 Full Modem Control serial port support. This library supports devices which wish to emulate full modem control/signalling for serial ports. Any device emulation which wishes to support this functionality for attached serial ports must call "tmxr_set_modem_control_passthru" before any call to tmxr_attach. This disables automatic DTR (&RTS) manipulation by this library. |
︙ | ︙ | |||
518 519 520 521 522 523 524 | { int32 unwritten, psave; char cmsg[160]; char dmsg[80] = ""; char lmsg[80] = ""; char msgbuf[512] = ""; | | | 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 | { int32 unwritten, psave; char cmsg[160]; char dmsg[80] = ""; char lmsg[80] = ""; char msgbuf[512] = ""; if (((!lp->notelnet) && (!lp->nomessage)) || (sim_switches & SWMASK ('V'))) { sprintf (cmsg, "\n\r\nConnected to the %s simulator ", sim_name); if (mp->dptr) { /* device defined? */ sprintf (dmsg, "%s device", /* report device name */ sim_dname (mp->dptr)); if (mp->lines > 1) /* more than one line? */ |
︙ | ︙ | |||
579 580 581 582 583 584 585 | is sent to the line about to be disconnected. We do not flush the buffer here, because the disconnect routines will do that just after calling us. */ static void tmxr_report_disconnection (TMLN *lp) { | | | 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 | is sent to the line about to be disconnected. We do not flush the buffer here, because the disconnect routines will do that just after calling us. */ static void tmxr_report_disconnection (TMLN *lp) { if (lp->notelnet || lp->nomessage) return; tmxr_linemsgf (lp, "\r\nDisconnected from the %s simulator\r\n\n", sim_name);/* report disconnection */ } static int32 loop_write_ex (TMLN *lp, char *buf, int32 length, t_bool prefix_datagram) { int32 written = 0; |
︙ | ︙ | |||
869 870 871 872 873 874 875 | free (old); tptr = (char *) calloc (1, 1); if (tptr == NULL) /* no more mem? */ return tptr; if (mp->port) /* copy port */ | | > > > | 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 | free (old); tptr = (char *) calloc (1, 1); if (tptr == NULL) /* no more mem? */ return tptr; if (mp->port) /* copy port */ sprintf (growstring(&tptr, 33 + strlen (mp->port)), "%s%s", mp->port, mp->notelnet ? ";notelnet" : (mp->nomessage ? ";nomessage" : "")); if (mp->logfiletmpl[0]) /* logfile info */ sprintf (growstring(&tptr, 7 + strlen (mp->logfiletmpl)), ",Log=%s", mp->logfiletmpl); if (mp->buffered) sprintf (growstring(&tptr, 10 + 10), ",Buffered=%d", mp->buffered); while ((*tptr == ',') || (*tptr == ' ')) memmove (tptr, tptr+1, strlen(tptr+1)+1); for (i=0; i<mp->lines; ++i) { |
︙ | ︙ | |||
939 940 941 942 943 944 945 | if (!lp->txbfd && (lp->mp->buffered > 0)) sprintf (growstring(&tptr, 32), ",UnBuffered"); if (lp->mp->datagram != lp->datagram) sprintf (growstring(&tptr, 8), ",%s", lp->datagram ? "UDP" : "TCP"); if (lp->mp->packet != lp->packet) sprintf (growstring(&tptr, 8), ",Packet"); if (lp->port) | > | > | 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 | if (!lp->txbfd && (lp->mp->buffered > 0)) sprintf (growstring(&tptr, 32), ",UnBuffered"); if (lp->mp->datagram != lp->datagram) sprintf (growstring(&tptr, 8), ",%s", lp->datagram ? "UDP" : "TCP"); if (lp->mp->packet != lp->packet) sprintf (growstring(&tptr, 8), ",Packet"); if (lp->port) sprintf (growstring(&tptr, 32 + strlen (lp->port)), ",%s%s%s", lp->port, ((lp->mp->notelnet != lp->notelnet) && (!lp->datagram)) ? (lp->notelnet ? ";notelnet" : ";telnet") : "", ((lp->mp->nomessage != lp->nomessage) && (!lp->datagram)) ? (lp->nomessage ? ";nomessage" : ";message") : ""); if (lp->destination) { if (lp->serport) { char portname[CBUFSIZE]; get_glyph_nc (lp->destination, portname, ';'); sprintf (growstring(&tptr, 25 + strlen (lp->destination)), ",Connect=%s%s%s", portname, strcmp("9600-8N1", lp->serconfig ? lp->serconfig : "") ? ";" : "", strcmp("9600-8N1", lp->serconfig ? lp->serconfig : "") ? lp->serconfig : ""); } |
︙ | ︙ | |||
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 | int32 *op; int32 i, j; int32 ringing = -1; char *address; char msg[512]; uint32 poll_time = sim_os_msec (); if (mp->last_poll_time == 0) { /* first poll initializations */ UNIT *uptr = mp->uptr; if (!uptr) /* Attached ? */ return -1; /* No connections are possinle! */ uptr->tmxr = (void *)mp; /* Connect UNIT to TMXR */ | > | 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 | int32 *op; int32 i, j; int32 ringing = -1; char *address; char msg[512]; uint32 poll_time = sim_os_msec (); memset (msg, 0, sizeof (msg)); if (mp->last_poll_time == 0) { /* first poll initializations */ UNIT *uptr = mp->uptr; if (!uptr) /* Attached ? */ return -1; /* No connections are possinle! */ uptr->tmxr = (void *)mp; /* Connect UNIT to TMXR */ |
︙ | ︙ | |||
1038 1039 1040 1041 1042 1043 1044 | sim_cancel (mp->ldsc[i].uptr); if (mp->ldsc[i].o_uptr) sim_cancel (mp->ldsc[i].o_uptr); } } } | > | | | 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 | sim_cancel (mp->ldsc[i].uptr); if (mp->ldsc[i].o_uptr) sim_cancel (mp->ldsc[i].o_uptr); } } } if (sim_is_running && ((poll_time - mp->last_poll_time) < mp->poll_interval*1000)) return -1; /* too soon to try */ srand((unsigned int)poll_time); tmxr_debug_trace (mp, "tmxr_poll_conn()"); mp->last_poll_time = poll_time; /* Check for a pending Telnet/tcp connection */ if (mp->master) { if (mp->ring_sock != INVALID_SOCKET) { /* Use currently 'ringing' socket if one is active */ newsock = mp->ring_sock; mp->ring_sock = INVALID_SOCKET; address = mp->ring_ipad; mp->ring_ipad = NULL; } else newsock = sim_accept_conn_ex (mp->master, &address, (mp->packet ? SIM_SOCK_OPT_NODELAY : 0));/* poll connect */ if (newsock != INVALID_SOCKET) { /* got a live one? */ snprintf (msg, sizeof (msg) - 1, "tmxr_poll_conn() - Connection from %s", address); tmxr_debug_connect (mp, msg); op = mp->lnorder; /* get line connection order list pointer */ i = mp->lines; /* play it safe in case lines == 0 */ ++mp->sessions; /* count the new session */ for (j = 0; j < mp->lines; j++, i++) { /* find next avail line */ if (op && (*op >= 0) && (*op < mp->lines)) /* order list present and valid? */ |
︙ | ︙ | |||
1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 | else { lp = mp->ldsc + i; /* get line desc */ lp->conn = TRUE; /* record connection */ lp->sock = newsock; /* save socket */ lp->ipad = address; /* ip address */ tmxr_init_line (lp); /* init line */ lp->notelnet = mp->notelnet; /* apply mux default telnet setting */ if (!lp->notelnet) { sim_write_sock (newsock, (char *)mantra, sizeof(mantra)); tmxr_debug (TMXR_DBG_XMT, lp, "Sending", (char *)mantra, sizeof(mantra)); lp->telnet_sent_opts = (uint8 *)realloc (lp->telnet_sent_opts, 256); memset (lp->telnet_sent_opts, 0, 256); } tmxr_report_connection (mp, lp); | > | 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 | else { lp = mp->ldsc + i; /* get line desc */ lp->conn = TRUE; /* record connection */ lp->sock = newsock; /* save socket */ lp->ipad = address; /* ip address */ tmxr_init_line (lp); /* init line */ lp->notelnet = mp->notelnet; /* apply mux default telnet setting */ lp->nomessage = mp->nomessage; /* apply mux default telnet setting */ if (!lp->notelnet) { sim_write_sock (newsock, (char *)mantra, sizeof(mantra)); tmxr_debug (TMXR_DBG_XMT, lp, "Sending", (char *)mantra, sizeof(mantra)); lp->telnet_sent_opts = (uint8 *)realloc (lp->telnet_sent_opts, 256); memset (lp->telnet_sent_opts, 0, 256); } tmxr_report_connection (mp, lp); |
︙ | ︙ | |||
1195 1196 1197 1198 1199 1200 1201 | lp->conn = TRUE; /* record connection */ lp->sock = lp->connecting; /* it now looks normal */ lp->connecting = 0; lp->ipad = (char *)realloc (lp->ipad, 1+strlen (lp->destination)); strcpy (lp->ipad, lp->destination); lp->cnms = sim_os_msec (); sim_getnames_sock (lp->sock, &sockname, &peername); | | | | | | | | 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 | lp->conn = TRUE; /* record connection */ lp->sock = lp->connecting; /* it now looks normal */ lp->connecting = 0; lp->ipad = (char *)realloc (lp->ipad, 1+strlen (lp->destination)); strcpy (lp->ipad, lp->destination); lp->cnms = sim_os_msec (); sim_getnames_sock (lp->sock, &sockname, &peername); snprintf (msg, sizeof (msg) -1, "tmxr_poll_conn() - Outgoing Line Connection to %s (%s->%s) established", lp->destination, sockname, peername); tmxr_debug_connect_line (lp, msg); free (sockname); free (peername); if (!lp->notelnet) { sim_write_sock (lp->sock, (char *)mantra, sizeof(mantra)); tmxr_debug (TMXR_DBG_XMT, lp, "Sending", (char *)mantra, sizeof(mantra)); lp->telnet_sent_opts = (uint8 *)realloc (lp->telnet_sent_opts, 256); memset (lp->telnet_sent_opts, 0, 256); } return i; case -1: /* failed connection */ snprintf (msg, sizeof (msg) -1, "tmxr_poll_conn() - Outgoing Line Connection to %s failed", lp->destination); tmxr_debug_connect_line (lp, msg); tmxr_reset_ln (lp); /* retry */ break; } } break; case 1: if (lp->master) { /* Check for a pending Telnet/tcp connection */ while (INVALID_SOCKET != (newsock = sim_accept_conn_ex (lp->master, &address, (lp->packet ? SIM_SOCK_OPT_NODELAY : 0)))) {/* got a live one? */ char *sockname, *peername; sim_getnames_sock (newsock, &sockname, &peername); snprintf (msg, sizeof (msg) -1, "tmxr_poll_conn() - Incoming Line Connection from %s (%s->%s)", address, peername, sockname); tmxr_debug_connect_line (lp, msg); free (sockname); free (peername); ++mp->sessions; /* count the new session */ if (lp->destination) { /* Virtual Null Modem Cable? */ char host[sizeof(msg) - 64]; if (sim_parse_addr (lp->destination, host, sizeof(host), NULL, NULL, 0, NULL, address)) { tmxr_msg (newsock, "Rejecting connection from unexpected source\r\n"); snprintf (msg, sizeof (msg) -1, "tmxr_poll_conn() - Rejecting line connection from: %s, Expected: %s", address, host); tmxr_debug_connect_line (lp, msg); sim_close_sock (newsock); free (address); continue; /* Try for another connection */ } if (lp->connecting) { snprintf (msg, sizeof (msg) -1, "tmxr_poll_conn() - aborting outgoing line connection attempt to: %s", lp->destination); tmxr_debug_connect_line (lp, msg); sim_close_sock (lp->connecting); /* abort our as yet unconnnected socket */ lp->connecting = 0; } } if (lp->conn == FALSE) { /* is the line available? */ if ((!lp->modem_control) || (lp->modembits & TMXR_MDM_DTR)) { |
︙ | ︙ | |||
1282 1283 1284 1285 1286 1287 1288 | break; } /* Check for needed outgoing connection initiation */ if (lp->destination && (!lp->sock) && (!lp->connecting) && (!lp->serport) && (!lp->modem_control || (lp->modembits & TMXR_MDM_DTR))) { | | | > | 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 | break; } /* Check for needed outgoing connection initiation */ if (lp->destination && (!lp->sock) && (!lp->connecting) && (!lp->serport) && (!lp->modem_control || (lp->modembits & TMXR_MDM_DTR))) { snprintf (msg, sizeof (msg) - 1, "tmxr_poll_conn() - establishing outgoing connection to: %s", lp->destination); tmxr_debug_connect_line (lp, msg); lp->connecting = sim_connect_sock_ex (lp->datagram ? lp->port : NULL, lp->destination, "localhost", NULL, (lp->datagram ? SIM_SOCK_OPT_DATAGRAM : 0) | (lp->mp->packet ? SIM_SOCK_OPT_NODELAY : 0)); } } return ringing; /* no new connections made */ } |
︙ | ︙ | |||
1354 1355 1356 1357 1358 1359 1360 | if (lp->connecting) { sim_close_sock (lp->connecting); lp->connecting = 0; } if ((!lp->modem_control) || (lp->modembits & TMXR_MDM_DTR)) { sprintf (msg, "tmxr_reset_ln_ex() - connecting to %s", lp->destination); tmxr_debug_connect_line (lp, msg); | | > | 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 | if (lp->connecting) { sim_close_sock (lp->connecting); lp->connecting = 0; } if ((!lp->modem_control) || (lp->modembits & TMXR_MDM_DTR)) { sprintf (msg, "tmxr_reset_ln_ex() - connecting to %s", lp->destination); tmxr_debug_connect_line (lp, msg); lp->connecting = sim_connect_sock_ex (lp->datagram ? lp->port : NULL, lp->destination, "localhost", NULL, (lp->datagram ? SIM_SOCK_OPT_DATAGRAM : 0) | (lp->packet ? SIM_SOCK_OPT_NODELAY : 0)); } } tmxr_init_line (lp); /* initialize line state */ return SCPE_OK; } t_stat tmxr_close_ln (TMLN *lp) |
︙ | ︙ | |||
1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 | outgoing connecctions associated with the specified multiplexer */ t_stat tmxr_clear_modem_control_passthru (TMXR *mp) { return tmxr_clear_modem_control_passthru_state (mp, FALSE); } /* Declare that tmxr_set_config_line is used. This would best be called in a device reset routine and left set. If the device implementor wants to make this behavior a user option we've got to reject the attempt to set or clear this mode if any | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 | outgoing connecctions associated with the specified multiplexer */ t_stat tmxr_clear_modem_control_passthru (TMXR *mp) { return tmxr_clear_modem_control_passthru_state (mp, FALSE); } /* Declare that all lines on a mux have telnet disabled or enabled. This would best be called in a device reset routine and left. If the device implementor wants to make this behavior a user option we've got to reject the attempt to set or clear this mode if any ports on the MUX are attached. */ static t_stat tmxr_set_notelnet_state (TMXR *mp, t_bool state) { int i; if (mp->master) return SCPE_ALATT; for (i=0; i<mp->lines; ++i) { TMLN *lp; lp = mp->ldsc + i; if ((lp->master) || (lp->sock) || (lp->connecting) || (lp->serport)) return SCPE_ALATT; } mp->notelnet = state; for (i=0; i<mp->lines; ++i) mp->ldsc[i].notelnet = state; return SCPE_OK; } /* Disable Telnet on lines in a mux Inputs: none Output: SCPE_OK or SCPE_ALATT */ t_stat tmxr_set_notelnet (TMXR *mp) { return tmxr_set_notelnet_state (mp, TRUE); } /* Enable Telnet on lines in a mux Inputs: none Output: SCPE_OK or SCPE_ALATT */ t_stat tmxr_clear_notelnet (TMXR *mp) { return tmxr_set_notelnet_state (mp, FALSE); } /* Declare that all lines on a mux will or won't spit out a message on incoming telnet connects. This would best be called in a device reset routine and left. If the device implementor wants to make this behavior a user option we've got to reject the attempt to set or clear this mode if any ports on the MUX are attached. */ static t_stat tmxr_set_nomessage_state (TMXR *mp, t_bool state) { int i; if (mp->master) return SCPE_ALATT; for (i=0; i<mp->lines; ++i) { TMLN *lp; lp = mp->ldsc + i; if ((lp->master) || (lp->sock) || (lp->connecting) || (lp->serport)) return SCPE_ALATT; } mp->nomessage = state; for (i=0; i<mp->lines; ++i) mp->ldsc[i].nomessage = state; return SCPE_OK; } /* Disable Connect time message in incoming Telnet connections to all lines in a mux Inputs: none Output: SCPE_OK or SCPE_ALATT */ t_stat tmxr_set_nomessage (TMXR *mp) { return tmxr_set_nomessage_state (mp, TRUE); } /* Enable Connect time message in incoming Telnet connections to all lines in a mux Inputs: none Output: SCPE_OK or SCPE_ALATT */ t_stat tmxr_clear_nomessage (TMXR *mp) { return tmxr_set_nomessage_state (mp, FALSE); } /* Declare that tmxr_set_config_line is used. This would best be called in a device reset routine and left set. If the device implementor wants to make this behavior a user option we've got to reject the attempt to set or clear this mode if any |
︙ | ︙ | |||
1526 1527 1528 1529 1530 1531 1532 | Inputs: *lp = pointer to terminal line descriptor bits_to_set TMXR_MDM_DTR and/or TMXR_MDM_RTS as desired bits_to_clear TMXR_MDM_DTR and/or TMXR_MDM_RTS as desired Output: | | | | | | 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 | Inputs: *lp = pointer to terminal line descriptor bits_to_set TMXR_MDM_DTR and/or TMXR_MDM_RTS as desired bits_to_clear TMXR_MDM_DTR and/or TMXR_MDM_RTS as desired Output: status_bits if non NULL, returns all of the current signal state bits (incoming: DCD, RNG, CTS, DSR) along with the specifically settable bits (DTR, RTS) Implementation note: If a line is connected to a serial port, then these values affect and reflect the state of the serial port. If the line is connected to a network socket (or could be) then the network session state is set, cleared and/or returned. */ t_stat tmxr_set_get_modem_bits (TMLN *lp, int32 bits_to_set, int32 bits_to_clear, int32 *status_bits) { int32 before_modem_bits, incoming_state; DEVICE *dptr; tmxr_debug_trace_line (lp, "tmxr_set_get_modem_bits()"); if ((bits_to_set & ~(TMXR_MDM_OUTGOING)) || /* Assure only settable bits */ |
︙ | ︙ | |||
1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 | lp->sock = lp->mp->ring_sock; /* save socket */ lp->mp->ring_sock = INVALID_SOCKET; lp->ipad = lp->mp->ring_ipad; /* ip address */ lp->mp->ring_ipad = NULL; lp->mp->ring_start_time = 0; tmxr_init_line (lp); /* init line */ lp->notelnet = lp->mp->notelnet; /* apply mux default telnet setting */ if (!lp->notelnet) { sim_write_sock (lp->sock, (char *)mantra, sizeof(mantra)); tmxr_debug (TMXR_DBG_XMT, lp, "Sending", (char *)mantra, sizeof(mantra)); lp->telnet_sent_opts = (uint8 *)realloc (lp->telnet_sent_opts, 256); memset (lp->telnet_sent_opts, 0, 256); } tmxr_report_connection (lp->mp, lp); | > | 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 | lp->sock = lp->mp->ring_sock; /* save socket */ lp->mp->ring_sock = INVALID_SOCKET; lp->ipad = lp->mp->ring_ipad; /* ip address */ lp->mp->ring_ipad = NULL; lp->mp->ring_start_time = 0; tmxr_init_line (lp); /* init line */ lp->notelnet = lp->mp->notelnet; /* apply mux default telnet setting */ lp->nomessage = lp->mp->nomessage; /* apply mux default telnet setting */ if (!lp->notelnet) { sim_write_sock (lp->sock, (char *)mantra, sizeof(mantra)); tmxr_debug (TMXR_DBG_XMT, lp, "Sending", (char *)mantra, sizeof(mantra)); lp->telnet_sent_opts = (uint8 *)realloc (lp->telnet_sent_opts, 256); memset (lp->telnet_sent_opts, 0, 256); } tmxr_report_connection (lp->mp, lp); |
︙ | ︙ | |||
1616 1617 1618 1619 1620 1621 1622 | } lp->modembits |= incoming_state; dptr = (lp->dptr ? lp->dptr : (lp->mp ? lp->mp->dptr : NULL)); if ((lp->modembits != before_modem_bits) && (sim_deb && lp->mp && dptr)) { sim_debug_bits (TMXR_DBG_MDM, dptr, tmxr_modem_bits, before_modem_bits, lp->modembits, FALSE); sim_debug (TMXR_DBG_MDM, dptr, " - Line %d - %p\n", (int)(lp-lp->mp->ldsc), lp->txb); } | | | | | | > > > > | > | | 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 | } lp->modembits |= incoming_state; dptr = (lp->dptr ? lp->dptr : (lp->mp ? lp->mp->dptr : NULL)); if ((lp->modembits != before_modem_bits) && (sim_deb && lp->mp && dptr)) { sim_debug_bits (TMXR_DBG_MDM, dptr, tmxr_modem_bits, before_modem_bits, lp->modembits, FALSE); sim_debug (TMXR_DBG_MDM, dptr, " - Line %d - %p\n", (int)(lp-lp->mp->ldsc), lp->txb); } if (status_bits) *status_bits = (lp->modembits & (TMXR_MDM_INCOMING | TMXR_MDM_OUTGOING)); if (lp->mp && lp->modem_control) { /* This API ONLY works on modem_control enabled multiplexer lines */ if ((bits_to_set | bits_to_clear) || status_bits) {/* Anything to do? */ if (lp->loopback) { if ((lp->modembits ^ before_modem_bits) & TMXR_MDM_DTR) { /* DTR changed? */ lp->ser_connect_pending = (lp->modembits & TMXR_MDM_DTR); lp->conn = !(lp->modembits & TMXR_MDM_DTR); } return SCPE_OK; } if (lp->serport) { t_stat r = sim_control_serial (lp->serport, bits_to_set, bits_to_clear, status_bits); if (status_bits && (r == SCPE_OK)) lp->modembits = (lp->modembits & ~TMXR_MDM_INCOMING) | *status_bits; return r; } if ((lp->sock) || (lp->connecting)) { if ((before_modem_bits & bits_to_clear & TMXR_MDM_DTR) != 0) { /* drop DTR? */ if (lp->sock) tmxr_report_disconnection (lp); /* report closure */ tmxr_reset_ln (lp); } } else { if ((lp->destination) && /* Virtual Null Modem Cable */ (bits_to_set & ~before_modem_bits & /* and DTR being Raised */ TMXR_MDM_DTR)) { char msg[512]; sprintf (msg, "tmxr_set_get_modem_bits() - establishing outgoing connection to: %s", lp->destination); tmxr_debug_connect_line (lp, msg); lp->connecting = sim_connect_sock_ex (lp->datagram ? lp->port : NULL, lp->destination, "localhost", NULL, (lp->datagram ? SIM_SOCK_OPT_DATAGRAM : 0) | (lp->packet ? SIM_SOCK_OPT_NODELAY : 0)); } } } return SCPE_OK; } if ((lp->sock) || (lp->connecting)) { if ((before_modem_bits & bits_to_clear & TMXR_MDM_DTR) != 0) { /* drop DTR? */ if (lp->sock) tmxr_report_disconnection (lp); /* report closure */ tmxr_reset_ln (lp); } } if ((lp->serport) && (!lp->loopback)) sim_control_serial (lp->serport, 0, 0, status_bits); return SCPE_INCOMP; } /* Enable or Disable loopback mode on a line Inputs: lp - the line to change |
︙ | ︙ | |||
2184 2185 2186 2187 2188 2189 2190 | lp->txbpi %= lp->txbsz; \ if (lp->txbpi == lp->txbpr) \ lp->txbpr = (1+lp->txbpr)%lp->txbsz, ++lp->txdrp; \ } if ((lp->xmte == 0) && (TXBUF_AVAIL(lp) > 1) && ((lp->txbps == 0) || (lp->txnexttime <= sim_gtime ()))) lp->xmte = 1; /* enable line transmit */ | | > | > | | 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 | lp->txbpi %= lp->txbsz; \ if (lp->txbpi == lp->txbpr) \ lp->txbpr = (1+lp->txbpr)%lp->txbsz, ++lp->txdrp; \ } if ((lp->xmte == 0) && (TXBUF_AVAIL(lp) > 1) && ((lp->txbps == 0) || (lp->txnexttime <= sim_gtime ()))) lp->xmte = 1; /* enable line transmit */ if ((lp->conn && (TXBUF_AVAIL(lp) > 1)) || /* connected and room for char (+ IAC)? OR */ (!lp->conn && !lp->notelnet && lp->txbfd)) { /* not connected and buffered ? */ if ((TN_IAC == (u_char) chr) && (!lp->notelnet)) /* char == IAC in telnet session? */ TXBUF_CHAR (lp, TN_IAC); /* stuff extra IAC char */ TXBUF_CHAR (lp, chr); /* buffer char & adv pointer */ if (((!lp->txbfd) && (TXBUF_AVAIL (lp) <= TMXR_GUARD)) || /* near full? */ (lp->txbps)) /* or we're rate limiting output */ lp->xmte = 0; /* disable line transmit until space available or character time has passed */ if (lp->txlog) { /* log if available */ extern TMLN *sim_oline; /* Make sure to avoid recursion */ TMLN *save_oline = sim_oline; /* when logging to a socket */ sim_oline = NULL; /* save output socket */ fputc (chr, lp->txlog); /* log to actual file */ sim_oline = save_oline; /* resture output socket */ } sim_exp_check (&lp->expect, chr); /* process expect rules as needed */ if (!sim_is_running && /* attach message or other non simulation time message? */ !sim_is_remote_console_master_line (lp)) { tmxr_send_buffered_data (lp); /* put data on wire */ sim_os_ms_sleep(((lp->txbps) && (lp->txdeltausecs > 1000)) ? /* rate limiting output slower than 1000 cps */ (lp->txdeltausecs - 1000) / 1000 : 1); /* wait an approximate character delay */ } return SCPE_OK; /* char sent */ } ++lp->txstall; lp->xmte = 0; /* no room, dsbl line */ return SCPE_STALL; /* char not sent */ } |
︙ | ︙ | |||
2586 2587 2588 2589 2590 2591 2592 | int32 i, line, nextline = -1; char tbuf[CBUFSIZE], listen[CBUFSIZE], destination[CBUFSIZE], logfiletmpl[CBUFSIZE], buffered[CBUFSIZE], hostport[CBUFSIZE], port[CBUFSIZE], option[CBUFSIZE], speed[CBUFSIZE], dev_name[CBUFSIZE]; SOCKET sock; SERHANDLE serport; CONST char *tptr = cptr; | | > > | | > > | 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 | int32 i, line, nextline = -1; char tbuf[CBUFSIZE], listen[CBUFSIZE], destination[CBUFSIZE], logfiletmpl[CBUFSIZE], buffered[CBUFSIZE], hostport[CBUFSIZE], port[CBUFSIZE], option[CBUFSIZE], speed[CBUFSIZE], dev_name[CBUFSIZE]; SOCKET sock; SERHANDLE serport; CONST char *tptr = cptr; t_bool nolog, notelnet, listennotelnet, nomessage, listennomessage, modem_control, loopback, datagram, packet, disabled; TMLN *lp; t_stat r = SCPE_OK; snprintf (dev_name, sizeof(dev_name), "%s%s", mp->uptr ? sim_dname (find_dev_from_unit (mp->uptr)) : "", mp->uptr ? " " : ""); if (*tptr == '\0') return SCPE_ARG; for (i = 0; i < mp->lines; i++) { /* initialize lines */ lp = mp->ldsc + i; lp->mp = mp; /* set the back pointer */ lp->modem_control = mp->modem_control; if (lp->bpsfactor == 0.0) lp->bpsfactor = 1.0; } notelnet = listennotelnet = mp->notelnet; nomessage = listennomessage = mp->nomessage; mp->ring_sock = INVALID_SOCKET; free (mp->ring_ipad); mp->ring_ipad = NULL; mp->ring_start_time = 0; tmxr_debug_trace (mp, "tmxr_open_master()"); while (*tptr) { line = nextline; memset(logfiletmpl, '\0', sizeof(logfiletmpl)); memset(listen, '\0', sizeof(listen)); memset(destination, '\0', sizeof(destination)); memset(buffered, '\0', sizeof(buffered)); memset(port, '\0', sizeof(port)); memset(option, '\0', sizeof(option)); memset(speed, '\0', sizeof(speed)); nolog = loopback = disabled = FALSE; datagram = mp->datagram; packet = mp->packet; if (mp->buffered) sprintf(buffered, "%d", mp->buffered); if (line != -1) { notelnet = listennotelnet = mp->notelnet; nomessage = listennomessage = mp->nomessage; } modem_control = mp->modem_control; while (*tptr) { tptr = get_glyph_nc (tptr, tbuf, ','); if (!tbuf[0]) break; cptr = tbuf; if (!isdigit(*cptr)) { |
︙ | ︙ | |||
2691 2692 2693 2694 2695 2696 2697 | return sim_messagef (SCPE_2MARG, "Unexpected Modem Specifier: %s\n", cptr); modem_control = TRUE; continue; } if ((0 == MATCH_CMD (gbuf, "DATAGRAM")) || (0 == MATCH_CMD (gbuf, "UDP"))) { if ((NULL != cptr) && ('\0' != *cptr)) return sim_messagef (SCPE_2MARG, "Unexpected Datagram Specifier: %s\n", cptr); | | | 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 | return sim_messagef (SCPE_2MARG, "Unexpected Modem Specifier: %s\n", cptr); modem_control = TRUE; continue; } if ((0 == MATCH_CMD (gbuf, "DATAGRAM")) || (0 == MATCH_CMD (gbuf, "UDP"))) { if ((NULL != cptr) && ('\0' != *cptr)) return sim_messagef (SCPE_2MARG, "Unexpected Datagram Specifier: %s\n", cptr); nomessage = notelnet = datagram = TRUE; continue; } if (0 == MATCH_CMD (gbuf, "PACKET")) { if ((NULL != cptr) && ('\0' != *cptr)) return sim_messagef (SCPE_2MARG, "Unexpected Packet Specifier: %s\n", cptr); packet = TRUE; continue; |
︙ | ︙ | |||
2732 2733 2734 2735 2736 2737 2738 | return sim_messagef (SCPE_ARG, "%s simulator programmatically sets %sport speed\n", sim_name, dev_name); strlcpy (speed, cptr, sizeof(speed)); continue; } cptr = get_glyph (gbuf, port, ';'); if (sim_parse_addr (port, NULL, 0, NULL, NULL, 0, NULL, NULL)) return sim_messagef (SCPE_ARG, "Invalid Port Specifier: %s\n", port); | | > | | | > > > > > > > | > | > > > > > > | > | 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 | return sim_messagef (SCPE_ARG, "%s simulator programmatically sets %sport speed\n", sim_name, dev_name); strlcpy (speed, cptr, sizeof(speed)); continue; } cptr = get_glyph (gbuf, port, ';'); if (sim_parse_addr (port, NULL, 0, NULL, NULL, 0, NULL, NULL)) return sim_messagef (SCPE_ARG, "Invalid Port Specifier: %s\n", port); while (cptr && *cptr) { char *tptr = gbuf + (cptr - gbuf); cptr = get_glyph (cptr, tptr, ';'); if (0 == MATCH_CMD (tptr, "NOTELNET")) listennotelnet = TRUE; else if (0 == MATCH_CMD (tptr, "TELNET")) listennotelnet = FALSE; else if (0 == MATCH_CMD (tptr, "NOMESSAGE")) listennomessage = TRUE; else if (0 == MATCH_CMD (tptr, "MESSAGE")) listennomessage = FALSE; else { if (*tptr) return sim_messagef (SCPE_ARG, "Invalid Specifier: %s\n", tptr); } } cptr = init_cptr; } cptr = get_glyph_nc (cptr, port, ';'); sock = sim_master_sock (port, &r); /* make master socket to validate port */ if (r) return sim_messagef (SCPE_ARG, "Invalid Port Specifier: %s\n", port); if (sock == INVALID_SOCKET) /* open error */ return sim_messagef (SCPE_OPENERR, "Can't open network port: %s\n", port); sim_close_sock (sock); sim_os_ms_sleep (2); /* let the close finish (required on some platforms) */ strcpy (listen, port); cptr = get_glyph (cptr, option, ';'); while (option[0]) { if (0 == MATCH_CMD (option, "NOTELNET")) listennotelnet = TRUE; else if (0 == MATCH_CMD (option, "TELNET")) listennotelnet = FALSE; else if (0 == MATCH_CMD (option, "NOMESSAGE")) listennomessage = TRUE; else if (0 == MATCH_CMD (option, "MESSAGE")) listennomessage = FALSE; else return sim_messagef (SCPE_ARG, "Invalid Specifier: %s\n", option); cptr = get_glyph (cptr, option, ';'); } } if (disabled) { if (destination[0] || listen[0] || loopback) return sim_messagef (SCPE_ARG, "Can't disable line with%s%s%s%s%s\n", destination[0] ? " CONNECT=" : "", destination, listen[0] ? " " : "", listen, loopback ? " LOOPBACK" : ""); } if (destination[0]) { |
︙ | ︙ | |||
2794 2795 2796 2797 2798 2799 2800 | notelnet = TRUE; else if (0 == MATCH_CMD (eptr, "TELNET")) if (datagram) return sim_messagef (SCPE_ARG, "Telnet invalid on Datagram socket\n"); else notelnet = FALSE; | | | | > | 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 | notelnet = TRUE; else if (0 == MATCH_CMD (eptr, "TELNET")) if (datagram) return sim_messagef (SCPE_ARG, "Telnet invalid on Datagram socket\n"); else notelnet = FALSE; else return sim_messagef (SCPE_ARG, "Unexpected specifier: %s\n", eptr); } sock = sim_connect_sock_ex (NULL, hostport, "localhost", NULL, (datagram ? SIM_SOCK_OPT_DATAGRAM : 0) | (packet ? SIM_SOCK_OPT_NODELAY : 0)); if (sock != INVALID_SOCKET) sim_close_sock (sock); else return sim_messagef (SCPE_ARG, "Invalid destination: %s\n", hostport); } } if (line == -1) { |
︙ | ︙ | |||
2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 | strcpy (mp->port, listen); /* save port */ mp->master = sock; /* save master socket */ mp->ring_sock = INVALID_SOCKET; free (mp->ring_ipad); mp->ring_ipad = NULL; mp->ring_start_time = 0; mp->notelnet = listennotelnet; /* save desired telnet behavior flag */ for (i = 0; i < mp->lines; i++) { /* initialize lines */ lp = mp->ldsc + i; lp->mp = mp; /* set the back pointer */ lp->packet = mp->packet; if (lp->serport) { /* serial port attached? */ tmxr_reset_ln (lp); /* close current serial connection */ | > | 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 | strcpy (mp->port, listen); /* save port */ mp->master = sock; /* save master socket */ mp->ring_sock = INVALID_SOCKET; free (mp->ring_ipad); mp->ring_ipad = NULL; mp->ring_start_time = 0; mp->notelnet = listennotelnet; /* save desired telnet behavior flag */ mp->nomessage = listennomessage; /* save desired telnet behavior flag */ for (i = 0; i < mp->lines; i++) { /* initialize lines */ lp = mp->ldsc + i; lp->mp = mp; /* set the back pointer */ lp->packet = mp->packet; if (lp->serport) { /* serial port attached? */ tmxr_reset_ln (lp); /* close current serial connection */ |
︙ | ︙ | |||
2949 2950 2951 2952 2953 2954 2955 | lp->port = (char *)realloc (lp->port, 1 + strlen (listen)); strcpy (lp->port, listen); /* save port */ } else return sim_messagef (SCPE_ARG, "Missing listen port for Datagram socket\n"); } lp->packet = packet; | | > > | 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 | lp->port = (char *)realloc (lp->port, 1 + strlen (listen)); strcpy (lp->port, listen); /* save port */ } else return sim_messagef (SCPE_ARG, "Missing listen port for Datagram socket\n"); } lp->packet = packet; sock = sim_connect_sock_ex (datagram ? listen : NULL, hostport, "localhost", NULL, (datagram ? SIM_SOCK_OPT_DATAGRAM : 0) | (packet ? SIM_SOCK_OPT_NODELAY : 0)); if (sock != INVALID_SOCKET) { _mux_detach_line (lp, FALSE, TRUE); lp->destination = (char *)malloc(1+strlen(hostport)); strcpy (lp->destination, hostport); lp->mp = mp; if (!lp->modem_control || (lp->modembits & TMXR_MDM_DTR)) { lp->connecting = sock; lp->ipad = (char *)malloc (1 + strlen (lp->destination)); strcpy (lp->ipad, lp->destination); } else sim_close_sock (sock); lp->notelnet = notelnet; lp->nomessage = nomessage; tmxr_init_line (lp); /* init the line state */ if (speed[0] && (!datagram)) tmxr_set_line_speed (lp, speed); return SCPE_OK; } else return sim_messagef (SCPE_ARG, "Can't open %s socket on %s%s%s\n", datagram ? "Datagram" : "Stream", datagram ? listen : "", datagram ? "<->" : "", hostport); |
︙ | ︙ | |||
3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 | lp->port = (char *)realloc (lp->port, 1 + strlen (listen)); strcpy (lp->port, listen); /* save port */ lp->master = sock; /* save master socket */ if (listennotelnet != mp->notelnet) lp->notelnet = listennotelnet; else lp->notelnet = mp->notelnet; } if (destination[0]) { serport = sim_open_serial (destination, lp, &r); if (serport != INVALID_HANDLE) { _mux_detach_line (lp, TRUE, TRUE); lp->destination = (char *)malloc(1+strlen(destination)); strcpy (lp->destination, destination); | > > > > | 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 | lp->port = (char *)realloc (lp->port, 1 + strlen (listen)); strcpy (lp->port, listen); /* save port */ lp->master = sock; /* save master socket */ if (listennotelnet != mp->notelnet) lp->notelnet = listennotelnet; else lp->notelnet = mp->notelnet; if (listennomessage != mp->nomessage) lp->nomessage = listennomessage; else lp->nomessage = mp->nomessage; } if (destination[0]) { serport = sim_open_serial (destination, lp, &r); if (serport != INVALID_HANDLE) { _mux_detach_line (lp, TRUE, TRUE); lp->destination = (char *)malloc(1+strlen(destination)); strcpy (lp->destination, destination); |
︙ | ︙ | |||
3064 3065 3066 3067 3068 3069 3070 | if (listen[0]) { lp->port = (char *)realloc (lp->port, 1 + strlen (listen)); strcpy (lp->port, listen); /* save port */ } else return sim_messagef (SCPE_ARG, "Missing listen port for Datagram socket\n"); } | | > > | 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 | if (listen[0]) { lp->port = (char *)realloc (lp->port, 1 + strlen (listen)); strcpy (lp->port, listen); /* save port */ } else return sim_messagef (SCPE_ARG, "Missing listen port for Datagram socket\n"); } sock = sim_connect_sock_ex (datagram ? listen : NULL, hostport, "localhost", NULL, (datagram ? SIM_SOCK_OPT_DATAGRAM : 0) | (packet ? SIM_SOCK_OPT_NODELAY : 0)); if (sock != INVALID_SOCKET) { _mux_detach_line (lp, FALSE, TRUE); lp->destination = (char *)malloc(1+strlen(hostport)); strcpy (lp->destination, hostport); if (!lp->modem_control || (lp->modembits & TMXR_MDM_DTR)) { lp->connecting = sock; lp->ipad = (char *)malloc (1 + strlen (lp->destination)); strcpy (lp->ipad, lp->destination); } else sim_close_sock (sock); lp->notelnet = notelnet; lp->nomessage = nomessage; tmxr_init_line (lp); /* init the line state */ } else return sim_messagef (SCPE_ARG, "Can't open %s socket on %s%s%s\n", datagram ? "Datagram" : "Stream", datagram ? listen : "", datagram ? "<->" : "", hostport); } } if (loopback) { |
︙ | ︙ | |||
4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 | } if (mp->packet) fprintf(st, ", Packet"); if (mp->datagram) fprintf(st, ", UDP"); if (mp->notelnet) fprintf(st, ", Telnet=disabled"); if (mp->modem_control) fprintf(st, ", ModemControl=enabled"); if (mp->buffered) fprintf(st, ", Buffered=%d", mp->buffered); for (j = 1; j < mp->lines; j++) if (o_uptr != mp->ldsc[j].o_uptr) break; | > > | 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 | } if (mp->packet) fprintf(st, ", Packet"); if (mp->datagram) fprintf(st, ", UDP"); if (mp->notelnet) fprintf(st, ", Telnet=disabled"); if ((!mp->notelnet) && (mp->nomessage)) fprintf(st, ", Message=disabled"); if (mp->modem_control) fprintf(st, ", ModemControl=enabled"); if (mp->buffered) fprintf(st, ", Buffered=%d", mp->buffered); for (j = 1; j < mp->lines; j++) if (o_uptr != mp->ldsc[j].o_uptr) break; |
︙ | ︙ | |||
4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 | if (lp->dptr && (mp->dptr != lp->dptr)) fprintf (st, "Device: %s ", sim_dname(lp->dptr)); fprintf (st, "Line: %d", j); if (lp->conn == TMXR_LINE_DISABLED) fprintf (st, " - Disabled"); if (mp->notelnet != lp->notelnet) fprintf (st, " - %stelnet", lp->notelnet ? "no" : ""); if (lp->uptr && (lp->uptr != lp->mp->uptr)) fprintf (st, " - Unit: %s", sim_uname (lp->uptr)); if ((lp->o_uptr != o_uptr) && lp->o_uptr && (lp->o_uptr != lp->mp->uptr) && (lp->o_uptr != lp->uptr)) fprintf (st, " - Output Unit: %s", sim_uname (lp->o_uptr)); if (mp->modem_control != lp->modem_control) fprintf(st, ", ModemControl=%s", lp->modem_control ? "enabled" : "disabled"); if (lp->loopback) | > > | 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 | if (lp->dptr && (mp->dptr != lp->dptr)) fprintf (st, "Device: %s ", sim_dname(lp->dptr)); fprintf (st, "Line: %d", j); if (lp->conn == TMXR_LINE_DISABLED) fprintf (st, " - Disabled"); if (mp->notelnet != lp->notelnet) fprintf (st, " - %stelnet", lp->notelnet ? "no" : ""); if ((!lp->notelnet) && (mp->nomessage != lp->nomessage)) fprintf (st, " - %smessage", lp->nomessage ? "no" : ""); if (lp->uptr && (lp->uptr != lp->mp->uptr)) fprintf (st, " - Unit: %s", sim_uname (lp->uptr)); if ((lp->o_uptr != o_uptr) && lp->o_uptr && (lp->o_uptr != lp->mp->uptr) && (lp->o_uptr != lp->uptr)) fprintf (st, " - Output Unit: %s", sim_uname (lp->o_uptr)); if (mp->modem_control != lp->modem_control) fprintf(st, ", ModemControl=%s", lp->modem_control ? "enabled" : "disabled"); if (lp->loopback) |
︙ | ︙ | |||
4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 | if ((gbuf[0] != '\0') && (i == tmxr_open_device_count)) return sim_messagef (SCPE_ARG, "Multiplexer device %s not found or attached\n", gbuf); } return SCPE_OK; } /* Close a master listening socket. The listening socket associated with multiplexer descriptor "mp" is closed and deallocated. In addition, all current Telnet sessions are disconnected. Serial and outgoing sessions are also disconnected. */ | > > > > > > > > > > > > > | 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 | if ((gbuf[0] != '\0') && (i == tmxr_open_device_count)) return sim_messagef (SCPE_ARG, "Multiplexer device %s not found or attached\n", gbuf); } return SCPE_OK; } t_stat tmxr_flush_log_files (void) { int i, j; for (i=0; i<tmxr_open_device_count; ++i) { TMXR *mp = tmxr_open_devices[i]; for (j=0; j<mp->lines; ++j) if (mp->ldsc[j].txlog) fflush (mp->ldsc[j].txlog); } return SCPE_OK; } /* Close a master listening socket. The listening socket associated with multiplexer descriptor "mp" is closed and deallocated. In addition, all current Telnet sessions are disconnected. Serial and outgoing sessions are also disconnected. */ |
︙ | ︙ | |||
4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 | fprintf (st, "ports.\n\n"); if (modem_control) { fprintf (st, "The %s device is a full modem control device and therefore is capable of\n", dptr->name); fprintf (st, "passing port configuration information and modem signals.\n"); } fprintf (st, "A Telnet listening port can be configured with:\n\n"); fprintf (st, " sim> ATTACH %s {interface:}port\n\n", dptr->name); fprintf (st, "Line buffering can be enabled for the %s device with:\n\n", dptr->name); fprintf (st, " sim> ATTACH %s Buffer{=bufsize}\n\n", dptr->name); fprintf (st, "Line buffering can be disabled for the %s device with:\n\n", dptr->name); fprintf (st, " sim> ATTACH %s NoBuffer\n\n", dptr->name); fprintf (st, "The default buffer size is 32k bytes, the max buffer size is 1024k bytes\n\n"); fprintf (st, "The outbound traffic the %s device can be logged to a file with:\n", dptr->name); fprintf (st, " sim> ATTACH %s Log=LogFileName\n\n", dptr->name); | > > > | 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 | fprintf (st, "ports.\n\n"); if (modem_control) { fprintf (st, "The %s device is a full modem control device and therefore is capable of\n", dptr->name); fprintf (st, "passing port configuration information and modem signals.\n"); } fprintf (st, "A Telnet listening port can be configured with:\n\n"); fprintf (st, " sim> ATTACH %s {interface:}port\n\n", dptr->name); fprintf (st, "The -U switch can be specified on the attach command that specifies\n"); fprintf (st, "a listening port. This will allow a listening port to be reused if\n"); fprintf (st, "some prior connections haven't completely shutdown.\n\n"); fprintf (st, "Line buffering can be enabled for the %s device with:\n\n", dptr->name); fprintf (st, " sim> ATTACH %s Buffer{=bufsize}\n\n", dptr->name); fprintf (st, "Line buffering can be disabled for the %s device with:\n\n", dptr->name); fprintf (st, " sim> ATTACH %s NoBuffer\n\n", dptr->name); fprintf (st, "The default buffer size is 32k bytes, the max buffer size is 1024k bytes\n\n"); fprintf (st, "The outbound traffic the %s device can be logged to a file with:\n", dptr->name); fprintf (st, " sim> ATTACH %s Log=LogFileName\n\n", dptr->name); |
︙ | ︙ | |||
4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 | } fprintf (st, "Modem Control signalling behaviors can be enabled/disabled on a specific\n"); fprintf (st, "multiplexer line with:\n\n"); fprintf (st, " sim> ATTACH %s Line=n,Modem\n", dptr->name); fprintf (st, " sim> ATTACH %s Line=n,NoModem\n\n", dptr->name); fprintf (st, "A Telnet listening port can be configured with:\n\n"); fprintf (st, " sim> ATTACH %s {interface:}port\n\n", dptr->name); if (mux) fprintf (st, "Line buffering for all %d lines on the %s device can be configured with:\n\n", mux->lines, dptr->name); else fprintf (st, "Line buffering for all lines on the %s device can be configured with:\n\n", dptr->name); fprintf (st, " sim> ATTACH %s Buffer{=bufsize}\n\n", dptr->name); if (mux) fprintf (st, "Line buffering for all %d lines on the %s device can be disabled with:\n\n", mux->lines, dptr->name); | > > > | 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 | } fprintf (st, "Modem Control signalling behaviors can be enabled/disabled on a specific\n"); fprintf (st, "multiplexer line with:\n\n"); fprintf (st, " sim> ATTACH %s Line=n,Modem\n", dptr->name); fprintf (st, " sim> ATTACH %s Line=n,NoModem\n\n", dptr->name); fprintf (st, "A Telnet listening port can be configured with:\n\n"); fprintf (st, " sim> ATTACH %s {interface:}port\n\n", dptr->name); fprintf (st, "The -U switch can be specified on the attach command that specifies\n"); fprintf (st, "a listening port. This will allow a listening port to be reused if\n"); fprintf (st, "some prior connections haven't completely shutdown.\n\n"); if (mux) fprintf (st, "Line buffering for all %d lines on the %s device can be configured with:\n\n", mux->lines, dptr->name); else fprintf (st, "Line buffering for all lines on the %s device can be configured with:\n\n", dptr->name); fprintf (st, " sim> ATTACH %s Buffer{=bufsize}\n\n", dptr->name); if (mux) fprintf (st, "Line buffering for all %d lines on the %s device can be disabled with:\n\n", mux->lines, dptr->name); |
︙ | ︙ | |||
4558 4559 4560 4561 4562 4563 4564 | fprintf (st, "This would be done as:\n\n"); if (single_line) /* Single Line Multiplexer */ fprintf (st, " sim> ATTACH -V %s Connect=SerN\n", dptr->name); else { fprintf (st, " sim> ATTACH -V %s Line=n,Connect=SerN\n\n", dptr->name); fprintf (st, "Line specific tcp listening ports are supported. These are configured\n"); fprintf (st, "using commands of the form:\n\n"); | | | | 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 | fprintf (st, "This would be done as:\n\n"); if (single_line) /* Single Line Multiplexer */ fprintf (st, " sim> ATTACH -V %s Connect=SerN\n", dptr->name); else { fprintf (st, " sim> ATTACH -V %s Line=n,Connect=SerN\n\n", dptr->name); fprintf (st, "Line specific tcp listening ports are supported. These are configured\n"); fprintf (st, "using commands of the form:\n\n"); fprintf (st, " sim> ATTACH %s Line=n,{interface:}port{;notelnet}|{;nomessage}\n\n", dptr->name); } fprintf (st, "Direct computer to computer connections (Virutal Null Modem cables) may\n"); fprintf (st, "be established using the telnet protocol or via raw tcp sockets.\n\n"); fprintf (st, " sim> ATTACH %s Line=n,Connect=host:port{;notelnet}|{;nomessage}\n\n", dptr->name); fprintf (st, "Computer to computer virtual connections can be one way (as illustrated\n"); fprintf (st, "above) or symmetric. A symmetric connection is configured by combining\n"); if (single_line) { /* Single Line Multiplexer */ fprintf (st, "a one way connection with a tcp listening port on the same line:\n\n"); fprintf (st, " sim> ATTACH %s listenport,Connect=host:port\n\n", dptr->name); } else { |
︙ | ︙ | |||
4604 4605 4606 4607 4608 4609 4610 | for (mptr = dptr->modifiers; mptr->mask != 0; mptr++) if (mptr->valid == &tmxr_dscln) { fprintf (st, "A specific line on the %s device can be disconnected with:\n\n", dptr->name); fprintf (st, " sim> SET %s %s=n\n\n", dptr->name, mptr->mstring); fprintf (st, "This will cause a telnet connection to be closed, but a serial port will\n"); fprintf (st, "normally have DTR dropped for 500ms and raised again (thus hanging up a\n"); fprintf (st, "modem on that serial port).\n\n"); | | > | > > | | 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 | for (mptr = dptr->modifiers; mptr->mask != 0; mptr++) if (mptr->valid == &tmxr_dscln) { fprintf (st, "A specific line on the %s device can be disconnected with:\n\n", dptr->name); fprintf (st, " sim> SET %s %s=n\n\n", dptr->name, mptr->mstring); fprintf (st, "This will cause a telnet connection to be closed, but a serial port will\n"); fprintf (st, "normally have DTR dropped for 500ms and raised again (thus hanging up a\n"); fprintf (st, "modem on that serial port).\n\n"); fprintf (st, "Any lines connected to serial port can be manually closed by unplugging\n"); fprintf (st, "the serial cable from the host computer. Dynamically adding or removing\n"); fprintf (st, "a serial port from a mux while the simulated operating system is running\n"); fprintf (st, "is guaranteed to have an inconsistent state between the running OS and\n"); fprintf (st, "the simulated port state. Restart the simulator without the serial port\n"); fprintf (st, "attached.\n\n"); } } return SCPE_OK; } /* Stub examine and deposit */ |
︙ | ︙ | |||
4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 | (lp->modembits & TMXR_MDM_RNG) ? "RNG " : "", (lp->modembits & TMXR_MDM_CTS) ? "CTS " : "", (lp->modembits & TMXR_MDM_DSR) ? "DSR " : ""); } if ((lp->serport == 0) && (lp->sock) && (!lp->datagram)) fprintf (st, " %s\n", (lp->notelnet) ? "Telnet disabled (RAW data)" : "Telnet protocol"); if (lp->send.buffer) sim_show_send_input (st, &lp->send); if (lp->expect.buf) sim_exp_showall (st, &lp->expect); if (lp->txlog) fprintf (st, " Logging to %s\n", lp->txlogname); } | > > | 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 | (lp->modembits & TMXR_MDM_RNG) ? "RNG " : "", (lp->modembits & TMXR_MDM_CTS) ? "CTS " : "", (lp->modembits & TMXR_MDM_DSR) ? "DSR " : ""); } if ((lp->serport == 0) && (lp->sock) && (!lp->datagram)) fprintf (st, " %s\n", (lp->notelnet) ? "Telnet disabled (RAW data)" : "Telnet protocol"); if ((!lp->notelnet) && (lp->nomessage)) fprintf (st, " Telnet connect message disabled\n"); if (lp->send.buffer) sim_show_send_input (st, &lp->send); if (lp->expect.buf) sim_exp_showall (st, &lp->expect); if (lp->txlog) fprintf (st, " Logging to %s\n", lp->txlogname); } |
︙ | ︙ | |||
4841 4842 4843 4844 4845 4846 4847 | 2. If "val" is non-zero, then "cptr" points to a string that is parsed for an explicit line number, and "uptr" is ignored. For example, if "cptr" points to the string "3", then line 3 will be disconnected. If the line was connected to a tcp session, the socket associated with the line will be closed. If the line was connected to a serial port, the port will NOT be closed, but DTR will be dropped. After a 500ms delay DTR will | | < | 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 | 2. If "val" is non-zero, then "cptr" points to a string that is parsed for an explicit line number, and "uptr" is ignored. For example, if "cptr" points to the string "3", then line 3 will be disconnected. If the line was connected to a tcp session, the socket associated with the line will be closed. If the line was connected to a serial port, the port will NOT be closed, but DTR will be dropped. After a 500ms delay DTR will be raised again. Implementation notes: 1. This function is usually called as an MTAB processing routine. */ t_stat tmxr_dscln (UNIT *uptr, int32 val, CONST char *cptr, void *desc) |
︙ | ︙ | |||
4866 4867 4868 4869 4870 4871 4872 | lp = tmxr_get_ldsc (uptr, cptr, mp, &status); /* get referenced line */ if (lp == NULL) /* bad line number? */ return status; /* report it */ if ((lp->sock) || (lp->serport)) { /* connection active? */ | | | | > > > > | | | 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 | lp = tmxr_get_ldsc (uptr, cptr, mp, &status); /* get referenced line */ if (lp == NULL) /* bad line number? */ return status; /* report it */ if ((lp->sock) || (lp->serport)) { /* connection active? */ if ((!lp->notelnet) && (!lp->nomessage)) tmxr_linemsg (lp, "\r\nOperator disconnected line\r\n\n");/* report closure */ if (lp->serport && (sim_switches & SWMASK ('C'))) { sim_messagef (SCPE_OK, "If you really feel the need to disconnect this serial port, unplug the cable\n"); sim_messagef (SCPE_OK, "from the serial port on your system. Alternatively, you should restart the\n"); sim_messagef (SCPE_OK, "simulator without attaching the serial port in your configuration.\n"); } return tmxr_reset_ln_ex (lp, FALSE); /* drop the line */ } return SCPE_OK; } /* Enable logging for line */ t_stat tmxr_set_log (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { TMXR *mp = (TMXR *) desc; TMLN *lp; t_stat r; if (cptr == NULL) /* no file name? */ return SCPE_2FARG; lp = tmxr_find_ldsc (uptr, val, mp); /* find line desc */ if (lp == NULL) return SCPE_IERR; if (lp->txlog) /* close existing log */ tmxr_set_nolog (NULL, val, NULL, desc); lp->txlogname = (char *) calloc (CBUFSIZE, sizeof (char)); /* alloc namebuf */ if (lp->txlogname == NULL) /* can't? */ return SCPE_MEM; strlcpy (lp->txlogname, cptr, CBUFSIZE); /* save file name */ r = sim_open_logfile (cptr, TRUE, &lp->txlog, &lp->txlogref);/* open log */ if ((r != SCPE_OK) || (lp->txlog == NULL)) { /* error? */ free (lp->txlogname); /* free buffer */ return SCPE_OPENERR; } if (mp->uptr) /* attached?, then update attach string */ lp->mp->uptr->filename = tmxr_mux_attach_string (lp->mp->uptr->filename, lp->mp); return SCPE_OK; } |
︙ | ︙ | |||
5422 5423 5424 5425 5426 5427 5428 | sim_debug (dbits, dptr, " rxnexttime=%.0f (%.0f usecs)", lp->rxnexttime, ((lp->rxnexttime - sim_gtime ()) / sim_timer_inst_per_sec ()) * 1000000.0); if (lp->txnexttime != 0.0) sim_debug (dbits, dptr, " txnexttime=%.0f (%.0f usecs)", lp->txnexttime, ((lp->txnexttime - sim_gtime ()) / sim_timer_inst_per_sec ()) * 1000000.0); sim_debug (dbits, dptr, "\n"); } } } | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 | sim_debug (dbits, dptr, " rxnexttime=%.0f (%.0f usecs)", lp->rxnexttime, ((lp->rxnexttime - sim_gtime ()) / sim_timer_inst_per_sec ()) * 1000000.0); if (lp->txnexttime != 0.0) sim_debug (dbits, dptr, " txnexttime=%.0f (%.0f usecs)", lp->txnexttime, ((lp->txnexttime - sim_gtime ()) / sim_timer_inst_per_sec ()) * 1000000.0); sim_debug (dbits, dptr, "\n"); } } } /* Testing of sim_sock and tmxr */ #include <setjmp.h> t_stat tmxr_sock_test (DEVICE *dptr) { char cmd[CBUFSIZE], host[CBUFSIZE], port[CBUFSIZE]; int line; TMXR *tmxr; TMLN *ln; int32 tmp1, tmp2; t_stat stat = SCPE_OK; SOCKET sock_mux = INVALID_SOCKET; SOCKET sock_line = INVALID_SOCKET; SIM_TEST_INIT; sim_printf ("Testing %s:\n", dptr->name); SIM_TEST(sim_parse_addr ("", NULL, 0, "localhost", NULL, 0, "1234", NULL) != -1); SIM_TEST(sim_parse_addr ("", host, 0, "localhost", NULL, 0, "1234", NULL) != -1); SIM_TEST(sim_parse_addr ("", host, sizeof(host), "localhost", port, 0, "1234", NULL) != -1); SIM_TEST((sim_parse_addr ("", host, sizeof(host), "localhost", port, sizeof(port), "1234", NULL) == -1) || (strcmp(host, "localhost")) || (strcmp(port,"1234"))); SIM_TEST((sim_parse_addr ("localhost:6666", host, sizeof(host), "localhost", port, sizeof(port), "1234", NULL) == -1) || (strcmp(host, "localhost")) || (strcmp(port,"6666"))); SIM_TEST(sim_parse_addr ("localhost:66666", host, sizeof(host), "localhost", port, sizeof(port), "1234", NULL) != -1); SIM_TEST((sim_parse_addr ("localhost:telnet", host, sizeof(host), "localhost", port, sizeof(port), "1234", NULL) == -1) || (strcmp(host, "localhost")) || (strcmp(port,"telnet"))); SIM_TEST((sim_parse_addr ("telnet", host, sizeof(host), "localhost", port, sizeof(port), "1234", NULL) == -1) || (strcmp(host, "localhost")) || (strcmp(port,"telnet"))); dptr->dctrl = 0xFFFFFFFF; dptr->dctrl &= ~TMXR_DBG_TRC; sprintf (cmd, "%s -u localhost:65500;telnet;nomessage", dptr->name); SIM_TEST(attach_cmd (0, cmd)); tmxr = (TMXR *)dptr->units->tmxr; ln = &tmxr->ldsc[tmxr->lines - 1]; SIM_TEST(detach_cmd (0, dptr->name)); sprintf (cmd, "%s -u localhost:65500;notelnet", dptr->name); SIM_TEST(attach_cmd (0, cmd)); tmxr = (TMXR *)dptr->units->tmxr; ln = &tmxr->ldsc[tmxr->lines - 1]; SIM_TEST(detach_cmd (0, dptr->name)); if (tmxr->lines > 1) { tmxr->modem_control = FALSE; for (line=0; line < tmxr->lines; line++) tmxr->ldsc[line].modem_control = FALSE; snprintf (cmd + strlen (cmd), sizeof (cmd) - strlen (cmd), ",Line=%d,localhost:65501", tmxr->lines - 1); snprintf (cmd + strlen (cmd), sizeof (cmd) - strlen (cmd), ",Line=0,connect=localhost:65500"); SIM_TEST(attach_cmd (0, cmd)); sock_line = sim_connect_sock_ex (NULL, "localhost:65501", NULL, NULL, 0); sim_os_ms_sleep (100); SIM_TEST((((tmp1 = tmxr_poll_conn (tmxr)) == tmxr->lines - 1) || (tmp1 == 1)) ? SCPE_OK : SCPE_IERR); sock_mux = sim_connect_sock ("", "localhost", "65500"); sim_os_ms_sleep (100); SIM_TEST(((tmp2 = tmxr_poll_conn (tmxr)) == 0) || (tmp2 == 2) ? SCPE_OK : SCPE_IERR); show_cmd (0, "MUX"); sim_close_sock (sock_mux); sock_mux = INVALID_SOCKET; sim_close_sock (sock_line); sock_line = INVALID_SOCKET; SIM_TEST(detach_cmd (0, dptr->name)); } return stat; } |
︙ | ︙ | |||
142 143 144 145 146 147 148 149 150 151 152 153 154 155 | int32 sessions; /* count of tcp connections received */ uint32 cnms; /* conn time */ int32 tsta; /* Telnet state */ int32 rcve; /* rcv enable */ int32 xmte; /* xmt enable */ int32 dstb; /* disable Telnet binary mode */ t_bool notelnet; /* raw binary data (no telnet interpretation) */ uint8 *telnet_sent_opts; /* Telnet Options which we have sent a DON'T/WON'T */ int32 rxbpr; /* rcv buf remove */ int32 rxbpi; /* rcv buf insert */ int32 rxbsz; /* rcv buffer size */ int32 rxcnt; /* rcv count */ int32 rxpcnt; /* rcv packet count */ int32 txbpr; /* xmt buf remove */ | > | 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | int32 sessions; /* count of tcp connections received */ uint32 cnms; /* conn time */ int32 tsta; /* Telnet state */ int32 rcve; /* rcv enable */ int32 xmte; /* xmt enable */ int32 dstb; /* disable Telnet binary mode */ t_bool notelnet; /* raw binary data (no telnet interpretation) */ t_bool nomessage; /* no connect/disconnect message on line even if telnet */ uint8 *telnet_sent_opts; /* Telnet Options which we have sent a DON'T/WON'T */ int32 rxbpr; /* rcv buf remove */ int32 rxbpi; /* rcv buf insert */ int32 rxbsz; /* rcv buffer size */ int32 rxcnt; /* rcv count */ int32 rxpcnt; /* rcv packet count */ int32 txbpr; /* xmt buf remove */ |
︙ | ︙ | |||
221 222 223 224 225 226 227 228 229 230 231 232 233 234 | int32 sessions; /* count of tcp connections received */ uint32 poll_interval; /* frequency of connection polls (seconds) */ uint32 last_poll_time; /* time of last connection poll */ uint32 ring_start_time; /* time ring signal was raised */ char *ring_ipad; /* incoming connection address awaiting DTR */ SOCKET ring_sock; /* incoming connection socket awaiting DTR */ t_bool notelnet; /* default telnet capability for incoming connections */ t_bool modem_control; /* multiplexer supports modem control behaviors */ t_bool port_speed_control; /* multiplexer programmatically sets port speed */ t_bool packet; /* Lines are packet oriented */ t_bool datagram; /* Lines use datagram packet transport */ }; int32 tmxr_poll_conn (TMXR *mp); | > | 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 | int32 sessions; /* count of tcp connections received */ uint32 poll_interval; /* frequency of connection polls (seconds) */ uint32 last_poll_time; /* time of last connection poll */ uint32 ring_start_time; /* time ring signal was raised */ char *ring_ipad; /* incoming connection address awaiting DTR */ SOCKET ring_sock; /* incoming connection socket awaiting DTR */ t_bool notelnet; /* default telnet capability for incoming connections */ t_bool nomessage; /* no connect/disconnect message on line even if telnet */ t_bool modem_control; /* multiplexer supports modem control behaviors */ t_bool port_speed_control; /* multiplexer programmatically sets port speed */ t_bool packet; /* Lines are packet oriented */ t_bool datagram; /* Lines use datagram packet transport */ }; int32 tmxr_poll_conn (TMXR *mp); |
︙ | ︙ | |||
249 250 251 252 253 254 255 256 257 258 259 260 261 262 | t_stat tmxr_connection_poll_interval (TMXR *mp, uint32 seconds); t_stat tmxr_attach_ex (TMXR *mp, UNIT *uptr, CONST char *cptr, t_bool async); t_stat tmxr_detach (TMXR *mp, UNIT *uptr); t_stat tmxr_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); char *tmxr_line_attach_string(TMLN *lp); t_stat tmxr_set_modem_control_passthru (TMXR *mp); t_stat tmxr_clear_modem_control_passthru (TMXR *mp); t_stat tmxr_set_port_speed_control (TMXR *mp); t_stat tmxr_clear_port_speed_control (TMXR *mp); t_stat tmxr_set_line_port_speed_control (TMXR *mp, int line); t_stat tmxr_clear_line_port_speed_control (TMXR *mp, int line); t_stat tmxr_set_get_modem_bits (TMLN *lp, int32 bits_to_set, int32 bits_to_clear, int32 *incoming_bits); t_stat tmxr_set_line_loopback (TMLN *lp, t_bool enable_loopback); t_bool tmxr_get_line_loopback (TMLN *lp); | > > > > | 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 | t_stat tmxr_connection_poll_interval (TMXR *mp, uint32 seconds); t_stat tmxr_attach_ex (TMXR *mp, UNIT *uptr, CONST char *cptr, t_bool async); t_stat tmxr_detach (TMXR *mp, UNIT *uptr); t_stat tmxr_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); char *tmxr_line_attach_string(TMLN *lp); t_stat tmxr_set_modem_control_passthru (TMXR *mp); t_stat tmxr_clear_modem_control_passthru (TMXR *mp); t_stat tmxr_set_notelnet (TMXR *mp); t_stat tmxr_clear_notelnet (TMXR *mp); t_stat tmxr_set_nomessage (TMXR *mp); t_stat tmxr_clear_nomessage (TMXR *mp); t_stat tmxr_set_port_speed_control (TMXR *mp); t_stat tmxr_clear_port_speed_control (TMXR *mp); t_stat tmxr_set_line_port_speed_control (TMXR *mp, int line); t_stat tmxr_clear_line_port_speed_control (TMXR *mp, int line); t_stat tmxr_set_get_modem_bits (TMLN *lp, int32 bits_to_set, int32 bits_to_clear, int32 *incoming_bits); t_stat tmxr_set_line_loopback (TMLN *lp, t_bool enable_loopback); t_bool tmxr_get_line_loopback (TMLN *lp); |
︙ | ︙ | |||
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 | t_bool tmxr_tpbusyln (const TMLN *lp); t_stat tmxr_set_lnorder (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat tmxr_show_lnorder (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat tmxr_show_summ (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat tmxr_show_cstat (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat tmxr_show_lines (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat tmxr_show_open_devices (FILE* st, DEVICE *dptr, UNIT* uptr, int32 val, CONST char* desc); t_stat tmxr_activate (UNIT *uptr, int32 interval); t_stat tmxr_activate_abs (UNIT *uptr, int32 interval); t_stat tmxr_activate_after (UNIT *uptr, uint32 usecs_walltime); t_stat tmxr_activate_after_abs (UNIT *uptr, uint32 usecs_walltime); t_stat tmxr_clock_coschedule (UNIT *uptr, int32 interval); t_stat tmxr_clock_coschedule_abs (UNIT *uptr, int32 interval); t_stat tmxr_clock_coschedule_tmr (UNIT *uptr, int32 tmr, int32 ticks); t_stat tmxr_clock_coschedule_tmr_abs (UNIT *uptr, int32 tmr, int32 ticks); t_stat tmxr_change_async (void); t_stat tmxr_locate_line_send (const char *dev_line, SEND **snd); t_stat tmxr_locate_line_expect (const char *dev_line, EXPECT **exp); t_stat tmxr_locate_line (const char *dev_line, TMLN **lp); const char *tmxr_send_line_name (const SEND *snd); const char *tmxr_expect_line_name (const EXPECT *exp); t_stat tmxr_startup (void); t_stat tmxr_shutdown (void); t_stat tmxr_start_poll (void); t_stat tmxr_stop_poll (void); void _tmxr_debug (uint32 dbits, TMLN *lp, const char *msg, char *buf, int bufsize); #define tmxr_debug(dbits, lp, msg, buf, bufsize) do {if (sim_deb && (lp)->mp && (lp)->mp->dptr && ((dbits) & (lp)->mp->dptr->dctrl)) _tmxr_debug (dbits, lp, msg, buf, bufsize); } while (0) #define tmxr_debug_msg(dbits, lp, msg) do {if (sim_deb && (lp)->mp && (lp)->mp->dptr && ((dbits) & (lp)->mp->dptr->dctrl)) sim_debug (dbits, (lp)->mp->dptr, "%s", msg); } while (0) #define tmxr_debug_return(lp, val) do {if (sim_deb && (val) && (lp)->mp && (lp)->mp->dptr && (TMXR_DBG_RET & (lp)->mp->dptr->dctrl)) { if ((lp)->rxbps) sim_debug (TMXR_DBG_RET, (lp)->mp->dptr, "Ln%d: 0x%x - Next after: %.0f\n", (int)((lp)-(lp)->mp->ldsc), val, (lp)->rxnexttime); else sim_debug (TMXR_DBG_RET, (lp)->mp->dptr, "Ln%d: 0x%x\n", (int)((lp)-(lp)->mp->ldsc), val); } } while (0) #define tmxr_debug_trace(mp, msg) do {if (sim_deb && (mp)->dptr && (TMXR_DBG_TRC & (mp)->dptr->dctrl)) sim_debug (TMXR_DBG_TRC, mp->dptr, "%s\n", (msg)); } while (0) | > > | 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 | t_bool tmxr_tpbusyln (const TMLN *lp); t_stat tmxr_set_lnorder (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat tmxr_show_lnorder (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat tmxr_show_summ (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat tmxr_show_cstat (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat tmxr_show_lines (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat tmxr_show_open_devices (FILE* st, DEVICE *dptr, UNIT* uptr, int32 val, CONST char* desc); t_stat tmxr_flush_log_files (void); t_stat tmxr_activate (UNIT *uptr, int32 interval); t_stat tmxr_activate_abs (UNIT *uptr, int32 interval); t_stat tmxr_activate_after (UNIT *uptr, uint32 usecs_walltime); t_stat tmxr_activate_after_abs (UNIT *uptr, uint32 usecs_walltime); t_stat tmxr_clock_coschedule (UNIT *uptr, int32 interval); t_stat tmxr_clock_coschedule_abs (UNIT *uptr, int32 interval); t_stat tmxr_clock_coschedule_tmr (UNIT *uptr, int32 tmr, int32 ticks); t_stat tmxr_clock_coschedule_tmr_abs (UNIT *uptr, int32 tmr, int32 ticks); t_stat tmxr_change_async (void); t_stat tmxr_locate_line_send (const char *dev_line, SEND **snd); t_stat tmxr_locate_line_expect (const char *dev_line, EXPECT **exp); t_stat tmxr_locate_line (const char *dev_line, TMLN **lp); const char *tmxr_send_line_name (const SEND *snd); const char *tmxr_expect_line_name (const EXPECT *exp); t_stat tmxr_startup (void); t_stat tmxr_shutdown (void); t_stat tmxr_sock_test (DEVICE *dptr); t_stat tmxr_start_poll (void); t_stat tmxr_stop_poll (void); void _tmxr_debug (uint32 dbits, TMLN *lp, const char *msg, char *buf, int bufsize); #define tmxr_debug(dbits, lp, msg, buf, bufsize) do {if (sim_deb && (lp)->mp && (lp)->mp->dptr && ((dbits) & (lp)->mp->dptr->dctrl)) _tmxr_debug (dbits, lp, msg, buf, bufsize); } while (0) #define tmxr_debug_msg(dbits, lp, msg) do {if (sim_deb && (lp)->mp && (lp)->mp->dptr && ((dbits) & (lp)->mp->dptr->dctrl)) sim_debug (dbits, (lp)->mp->dptr, "%s", msg); } while (0) #define tmxr_debug_return(lp, val) do {if (sim_deb && (val) && (lp)->mp && (lp)->mp->dptr && (TMXR_DBG_RET & (lp)->mp->dptr->dctrl)) { if ((lp)->rxbps) sim_debug (TMXR_DBG_RET, (lp)->mp->dptr, "Ln%d: 0x%x - Next after: %.0f\n", (int)((lp)-(lp)->mp->ldsc), val, (lp)->rxnexttime); else sim_debug (TMXR_DBG_RET, (lp)->mp->dptr, "Ln%d: 0x%x\n", (int)((lp)-(lp)->mp->ldsc), val); } } while (0) #define tmxr_debug_trace(mp, msg) do {if (sim_deb && (mp)->dptr && (TMXR_DBG_TRC & (mp)->dptr->dctrl)) sim_debug (TMXR_DBG_TRC, mp->dptr, "%s\n", (msg)); } while (0) |
︙ | ︙ |
︙ | ︙ | |||
26 27 28 29 30 31 32 | 08-Nov-2013 MB Added globals for current mouse status 11-Jun-2013 MB First version */ #include "sim_video.h" #include "scp.h" | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | 08-Nov-2013 MB Added globals for current mouse status 11-Jun-2013 MB First version */ #include "sim_video.h" #include "scp.h" int vid_active = 0; int32 vid_cursor_x; int32 vid_cursor_y; t_bool vid_mouse_b1 = FALSE; t_bool vid_mouse_b2 = FALSE; t_bool vid_mouse_b3 = FALSE; static VID_QUIT_CALLBACK vid_quit_callback = NULL; static VID_GAMEPAD_CALLBACK motion_callback[10]; static VID_GAMEPAD_CALLBACK button_callback[10]; static int vid_gamepad_inited = 0; t_stat vid_register_quit_callback (VID_QUIT_CALLBACK callback) { vid_quit_callback = callback; return SCPE_OK; } static t_stat register_callback (void **array, int n, void *callback) { int i, j = -1; if (!vid_gamepad_inited) { return SCPE_NOATT; } for (i = 0; i < n; i++) { if (array[i] == callback) return SCPE_ALATT; if (array[i] == NULL) j = i; } if (j != -1) { array[j] = callback; return SCPE_OK; } return SCPE_NXM; } t_stat vid_register_gamepad_motion_callback (VID_GAMEPAD_CALLBACK callback) { int n = sizeof (motion_callback) / sizeof (callback); return register_callback ((void **)motion_callback, n, (void *)callback); } t_stat vid_register_gamepad_button_callback (VID_GAMEPAD_CALLBACK callback) { int n = sizeof (button_callback) / sizeof (callback); return register_callback ((void **)button_callback, n, (void *)callback); } t_stat vid_show (FILE* st, DEVICE *dptr, UNIT* uptr, int32 val, CONST char* desc) { return vid_show_video (st, uptr, val, desc); } #if defined(USE_SIM_VIDEO) && defined(HAVE_LIBSDL) static const char *vid_dname (DEVICE *dev) { return dev ? sim_dname(dev) : "Video Device"; } static int vid_gamepad_ok = 0; /* Or else just joysticks. */ char vid_release_key[64] = "Ctrl-Right-Shift"; #include <SDL.h> #include <SDL_thread.h> static const char *key_names[] = {"F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", |
︙ | ︙ | |||
100 101 102 103 104 105 106 107 108 109 110 111 112 113 | * SDL_SavePNG -- libpng-based SDL_Surface writer. * * This code is free software, available under zlib/libpng license. * http://www.libpng.org/pub/png/src/libpng-LICENSE.txt */ #include <SDL.h> #include <png.h> #define SUCCESS 0 #define ERROR -1 #define USE_ROW_POINTERS #if SDL_BYTEORDER == SDL_BIG_ENDIAN | > | 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | * SDL_SavePNG -- libpng-based SDL_Surface writer. * * This code is free software, available under zlib/libpng license. * http://www.libpng.org/pub/png/src/libpng-LICENSE.txt */ #include <SDL.h> #include <png.h> #include <zlib.h> #define SUCCESS 0 #define ERROR -1 #define USE_ROW_POINTERS #if SDL_BYTEORDER == SDL_BIG_ENDIAN |
︙ | ︙ | |||
292 293 294 295 296 297 298 | SDL_sem *sem; int32 head; int32 tail; int32 count; } MOUSE_EVENT_QUEUE; int vid_thread (void* arg); | | | < > | < | < < < < < | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > > > > > > > > | | > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 | SDL_sem *sem; int32 head; int32 tail; int32 count; } MOUSE_EVENT_QUEUE; int vid_thread (void* arg); int vid_video_events (VID_DISPLAY *vptr); void vid_show_video_event (void); void vid_screenshot_event (void); void vid_beep_event (void); static void vid_beep_setup (int duration_ms, int tone_frequency); static void vid_beep_cleanup (void); static void vid_controllers_setup (DEVICE *dptr); static void vid_controllers_cleanup (void); struct VID_DISPLAY { t_bool vid_active_window; t_bool vid_mouse_captured; int32 vid_flags; /* Open Flags */ int32 vid_width; int32 vid_height; t_bool vid_ready; char vid_title[128]; SDL_Texture *vid_texture; /* video buffer in GPU */ SDL_Renderer *vid_renderer; SDL_Window *vid_window; /* window handle */ SDL_PixelFormat *vid_format; uint32 vid_windowID; SDL_mutex *vid_draw_mutex; /* window update mutex */ SDL_Cursor *vid_cursor; /* current cursor */ t_bool vid_cursor_visible; /* cursor visibility state */ DEVICE *vid_dev; t_bool vid_key_state[SDL_NUM_SCANCODES]; VID_DISPLAY *next; t_bool vid_blending; }; SDL_Thread *vid_thread_handle = NULL; /* event thread handle */ static VID_DISPLAY vid_first; KEY_EVENT_QUEUE vid_key_events; /* keyboard events */ MOUSE_EVENT_QUEUE vid_mouse_events; /* mouse events */ static VID_DISPLAY *vid_get_event_window (SDL_Event *ev, Uint32 windowID) { static Uint32 lastID = 0xffffffff; static VID_DISPLAY *last_display = NULL; VID_DISPLAY *vptr; SDL_KeyboardEvent *kev; SDL_MouseButtonEvent *bev; SDL_MouseMotionEvent *mev; SDL_WindowEvent *wev; SDL_UserEvent *uev; if (windowID == lastID) return last_display; for (vptr = &vid_first; vptr != NULL; vptr = vptr->next) { if (windowID == vptr->vid_windowID) { lastID = windowID; return last_display = vptr; } } switch (ev->type) { case SDL_KEYDOWN: case SDL_KEYUP: kev = (SDL_KeyboardEvent *)ev; sim_messagef (SCPE_OK, "Unrecognized key event.\n"); sim_messagef (SCPE_OK, " type = %u\n", kev->type); sim_messagef (SCPE_OK, " timestamp = %u\n", kev->timestamp); sim_messagef (SCPE_OK, " windowID = %u\n", kev->windowID); sim_messagef (SCPE_OK, " state = %u\n", kev->state); sim_messagef (SCPE_OK, " repeat = %u\n", kev->repeat); sim_messagef (SCPE_OK, " scancode = %d\n", kev->keysym.scancode); sim_messagef (SCPE_OK, " sym = %d\n", kev->keysym.sym); sim_messagef (SCPE_OK, " mod = %u\n", kev->keysym.mod); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: bev = (SDL_MouseButtonEvent *)ev; sim_messagef (SCPE_OK, "Unrecognized mouse button event.\n"); sim_messagef (SCPE_OK, " type = %u\n", bev->type); sim_messagef (SCPE_OK, " timestamp = %u\n", bev->timestamp); sim_messagef (SCPE_OK, " windowID = %u\n", bev->windowID); sim_messagef (SCPE_OK, " which = %u\n", bev->which); sim_messagef (SCPE_OK, " button = %u\n", bev->button); sim_messagef (SCPE_OK, " state = %u\n", bev->state); sim_messagef (SCPE_OK, " clicks = %u\n", bev->clicks); sim_messagef (SCPE_OK, " x = %d\n", bev->x); sim_messagef (SCPE_OK, " y = %d\n", bev->y); break; case SDL_MOUSEMOTION: mev = (SDL_MouseMotionEvent *)ev; sim_messagef (SCPE_OK, "Unrecognized mouse motion event.\n"); sim_messagef (SCPE_OK, " type = %u\n", mev->type); sim_messagef (SCPE_OK, " timestamp = %u\n", mev->timestamp); sim_messagef (SCPE_OK, " windowID = %u\n", mev->windowID); sim_messagef (SCPE_OK, " which = %u\n", mev->which); sim_messagef (SCPE_OK, " state = %u\n", mev->state); sim_messagef (SCPE_OK, " x = %d\n", mev->x); sim_messagef (SCPE_OK, " y = %d\n", mev->y); sim_messagef (SCPE_OK, " xrel = %d\n", mev->xrel); sim_messagef (SCPE_OK, " yrel = %d\n", mev->yrel); break; case SDL_WINDOWEVENT: wev = (SDL_WindowEvent *)ev; sim_messagef (SCPE_OK, "Unrecognized window event.\n"); sim_messagef (SCPE_OK, " type = %u\n", wev->type); sim_messagef (SCPE_OK, " timestamp = %u\n", wev->timestamp); sim_messagef (SCPE_OK, " windowID = %u\n", wev->windowID); sim_messagef (SCPE_OK, " event = %u\n", wev->event); sim_messagef (SCPE_OK, " data1 = %d\n", wev->data1); sim_messagef (SCPE_OK, " data2 = %d\n", wev->data2); break; case SDL_USEREVENT: uev = (SDL_UserEvent *)ev; sim_messagef (SCPE_OK, "Unrecognized user event.\n"); sim_messagef (SCPE_OK, " type = %u\n", uev->type); sim_messagef (SCPE_OK, " timestamp = %u\n", uev->timestamp); sim_messagef (SCPE_OK, " windowID = %u\n", uev->windowID); sim_messagef (SCPE_OK, " code = %d\n", uev->code); sim_messagef (SCPE_OK, " data1 = %p\n", uev->data1); sim_messagef (SCPE_OK, " data2 = %p\n", uev->data2); break; default: sim_messagef (SCPE_OK, "Unrecognized event type %u\n", ev->type); break; } sim_messagef (SCPE_OK, "\nSIMH has encountered a bug in SDL2. An upgrade to SDL2\n" "version 2.0.14 should fix this problem.\n"); return NULL; } #if defined (SDL_MAIN_AVAILABLE) #if defined (main) #undef main #endif static int main_argc; |
︙ | ︙ | |||
399 400 401 402 403 404 405 | { SDL_Event event; int status; main_argc = argc; main_argv = argv; | < < < < < < > > > > > < | | | | | < < < | | < | | | | | | | | | > > | > > > > > | | | > > > > > | > > | > > > > > | > > > > | > > > > > > > > | > > > > > > > | | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | > > | > | > > > | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | < < < < < | < < > | < < < | < | < < < < < < < < < < | 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 | { SDL_Event event; int status; main_argc = argc; main_argv = argv; SDL_SetHint (SDL_HINT_RENDER_DRIVER, "software"); status = SDL_Init (SDL_INIT_VIDEO); if (status) { fprintf (stderr, "SDL Video subsystem can't initialize: %s\n", SDL_GetError ()); exit (1); } vid_main_thread_handle = SDL_CreateThread (main_thread , "simh-main", NULL); if (vid_main_thread_handle == NULL) { fprintf (stderr, "SDL_CreateThread failed: %s\n", SDL_GetError ()); exit (1); } vid_beep_setup (400, 660); memset (&event, 0, sizeof (event)); while (1) { int status = SDL_WaitEvent (&event); if (status == 1) { if (event.type == SDL_USEREVENT) { if (event.user.code == EVENT_EXIT) break; if (event.user.code == EVENT_OPEN) vid_video_events ((VID_DISPLAY *)event.user.data1); else { if (event.user.code == EVENT_SHOW) vid_show_video_event (); else { if (event.user.code == EVENT_SCREENSHOT) vid_screenshot_event (); else { sim_printf ("main(): Unexpected User event: %d\n", event.user.code); break; } } } } else { // sim_printf ("main(): Ignoring unexpected event: %d\n", event.type); } } else { if (status < 0) sim_printf ("main() - ` error: %s\n", SDL_GetError()); } } SDL_WaitThread (vid_main_thread_handle, &status); vid_beep_cleanup (); SDL_Quit (); return status; } static t_stat vid_create_window (VID_DISPLAY *vptr) { int wait_count = 0; SDL_Event user_event; vptr->vid_ready = FALSE; user_event.type = SDL_USEREVENT; user_event.user.code = EVENT_OPEN; user_event.user.data1 = vptr; user_event.user.data2 = NULL; SDL_PushEvent (&user_event); while ((!vptr->vid_ready) && (++wait_count < 20)) sim_os_ms_sleep (100); if (!vptr->vid_ready) { vid_close (); return SCPE_OPENERR; } return SCPE_OK; } #else static int vid_create_window (VID_DISPLAY *vptr) { int wait_count = 0; if (vid_thread_handle == NULL) vid_thread_handle = SDL_CreateThread (vid_thread, "vid-thread", vptr); else { SDL_Event user_event; vptr->vid_ready = FALSE; user_event.type = SDL_USEREVENT; user_event.user.code = EVENT_OPEN; user_event.user.data1 = vptr; user_event.user.data2 = NULL; SDL_PushEvent (&user_event); } if (vid_thread_handle == NULL) { vid_close (); return SCPE_OPENERR; } while ((!vptr->vid_ready) && (++wait_count < 20)) sim_os_ms_sleep (100); if (!vptr->vid_ready) { vid_close (); return SCPE_OPENERR; } return SCPE_OK; } #endif static void vid_controllers_setup (DEVICE *dev) { SDL_Joystick *y; SDL_version ver; int i, n; if (vid_gamepad_inited++) return; /* Chech that the SDL_GameControllerFromInstanceID function is available at run time. */ SDL_GetVersion(&ver); vid_gamepad_ok = (ver.major > 2 || (ver.major == 2 && (ver.minor > 0 || ver.patch >= 4))); if (vid_gamepad_ok) SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER); else SDL_InitSubSystem(SDL_INIT_JOYSTICK); if (SDL_JoystickEventState (SDL_ENABLE) < 0) { if (vid_gamepad_ok) SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER); else SDL_QuitSubSystem(SDL_INIT_JOYSTICK); sim_printf ("%s: vid_controllers_setup(): SDL_JoystickEventState error: %s\n", vid_dname(dev), SDL_GetError()); return; } if (vid_gamepad_ok && SDL_GameControllerEventState (SDL_ENABLE) < 0) { if (vid_gamepad_ok) SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER); else SDL_QuitSubSystem(SDL_INIT_JOYSTICK); sim_printf ("%s: vid_controllers_setup(): SDL_GameControllerEventState error: %s\n", vid_dname(dev), SDL_GetError()); return; } n = SDL_NumJoysticks(); for (i = 0; i < n; i++) { if (vid_gamepad_ok && SDL_IsGameController (i)) { SDL_GameController *x = SDL_GameControllerOpen (i); if (x != NULL) { sim_debug (SIM_VID_DBG_VIDEO, dev, "Game controller: %s\n", SDL_GameControllerNameForIndex(i)); } } else { y = SDL_JoystickOpen (i); if (y != NULL) { sim_debug (SIM_VID_DBG_VIDEO, dev, "Joystick: %s\n", SDL_JoystickNameForIndex(i)); sim_debug (SIM_VID_DBG_VIDEO, dev, "Number of axes: %d, buttons: %d\n", SDL_JoystickNumAxes(y), SDL_JoystickNumButtons(y)); } } } } static void vid_controllers_cleanup (void) { if (0 == (--vid_gamepad_inited)) { memset (motion_callback, 0, sizeof motion_callback); memset (button_callback, 0, sizeof button_callback); if (vid_gamepad_ok) SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER); else SDL_QuitSubSystem(SDL_INIT_JOYSTICK); } } static t_stat vid_init_window (VID_DISPLAY *vptr, DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags) { t_stat stat; if ((strlen(sim_name) + 7 + (dptr ? strlen (dptr->name) : 0) + (title ? strlen (title) : 0)) < sizeof (vptr->vid_title)) sprintf (vptr->vid_title, "%s%s%s%s%s", sim_name, dptr ? " - " : "", dptr ? dptr->name : "", title ? " - " : "", title ? title : ""); else sprintf (vptr->vid_title, "%s", sim_name); vptr->vid_flags = flags; vptr->vid_active_window = TRUE; vptr->vid_width = width; vptr->vid_height = height; vptr->vid_mouse_captured = FALSE; vptr->vid_cursor_visible = (vptr->vid_flags & SIM_VID_INPUTCAPTURED); vptr->vid_blending = FALSE; if (!vid_active) { vid_key_events.head = 0; vid_key_events.tail = 0; vid_key_events.count = 0; vid_key_events.sem = SDL_CreateSemaphore (1); vid_mouse_events.head = 0; vid_mouse_events.tail = 0; vid_mouse_events.count = 0; vid_mouse_events.sem = SDL_CreateSemaphore (1); } vptr->vid_dev = dptr; memset (motion_callback, 0, sizeof motion_callback); memset (button_callback, 0, sizeof button_callback); stat = vid_create_window (vptr); if (stat != SCPE_OK) return stat; sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE, vptr->vid_dev, "vid_open() - Success\n"); return SCPE_OK; } t_stat vid_open_window (VID_DISPLAY **vptr, DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags) { t_stat r; *vptr = (VID_DISPLAY *)malloc (sizeof (VID_DISPLAY)); if (*vptr == NULL) return SCPE_NXM; (*vptr)->next = vid_first.next; vid_first.next = *vptr; r = vid_init_window (*vptr, dptr, title, width, height, flags); if (r != SCPE_OK) { vid_first.next = (*vptr)->next; free (*vptr); *vptr = NULL; return r; } return SCPE_OK; } t_stat vid_open (DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags) { if (!vid_first.vid_active_window) return vid_init_window (&vid_first, dptr, title, width, height, flags); return SCPE_OK; } t_stat vid_close_window (VID_DISPLAY *vptr) { SDL_Event user_event; int status; if (vptr->vid_ready) { sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE, vptr->vid_dev, "vid_close()\n"); user_event.type = SDL_USEREVENT; user_event.user.windowID = vptr->vid_windowID; user_event.user.code = EVENT_CLOSE; user_event.user.data1 = NULL; user_event.user.data2 = NULL; while (SDL_PushEvent (&user_event) < 0) sim_os_ms_sleep (10); vptr->vid_dev = NULL; } if (vid_thread_handle && vid_active <= 1) { SDL_WaitThread (vid_thread_handle, &status); vid_thread_handle = NULL; } while (vptr->vid_ready) sim_os_ms_sleep (10); vptr->vid_active_window = FALSE; if (!vid_active && vid_mouse_events.sem) { SDL_DestroySemaphore(vid_mouse_events.sem); vid_mouse_events.sem = NULL; } if (!vid_active && vid_key_events.sem) { SDL_DestroySemaphore(vid_key_events.sem); vid_key_events.sem = NULL; } return SCPE_OK; } t_stat vid_close (void) { if (vid_first.vid_active_window) return vid_close_window (&vid_first); return SCPE_OK; } t_stat vid_close_all (void) { VID_DISPLAY *vptr; vid_close (); for (vptr = vid_first.next; vptr != NULL; vptr = vptr->next) vid_close_window (vptr); return SCPE_OK; } t_stat vid_poll_kb (SIM_KEY_EVENT *ev) { if (SDL_SemTryWait (vid_key_events.sem) == 0) { /* get lock */ if (vid_key_events.count > 0) { /* events in queue? */ |
︙ | ︙ | |||
617 618 619 620 621 622 623 | (ev->b1_state == nev->b1_state) && (ev->b2_state == nev->b2_state) && (ev->b3_state == nev->b3_state)) { if ((++vid_mouse_events.head) == MAX_EVENTS) vid_mouse_events.head = 0; vid_mouse_events.count--; stat = SCPE_EOF; | | | | < | > | > > | < | | < < | | > > | | < < < | > > > > > > > > > > | | > > > > > | > | > > > | | | | | > | > > > > > | | | | | | | > | | | > > > > > | | > | > > > > > | 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 | (ev->b1_state == nev->b1_state) && (ev->b2_state == nev->b2_state) && (ev->b3_state == nev->b3_state)) { if ((++vid_mouse_events.head) == MAX_EVENTS) vid_mouse_events.head = 0; vid_mouse_events.count--; stat = SCPE_EOF; sim_debug (SIM_VID_DBG_MOUSE, ev->dev, "vid_poll_mouse: ignoring bouncing events\n"); } } if (SDL_SemPost (vid_mouse_events.sem)) sim_printf ("vid_poll_mouse(): SDL_SemPost error: %s\n", SDL_GetError()); } return stat; } uint32 vid_map_rgb_window (VID_DISPLAY *vptr, uint8 r, uint8 g, uint8 b) { return SDL_MapRGB (vptr->vid_format, r, g, b); } uint32 vid_map_rgb (uint8 r, uint8 g, uint8 b) { return vid_map_rgb_window (&vid_first, r, g, b); } uint32 vid_map_rgba_window (VID_DISPLAY *vptr, uint8 r, uint8 g, uint8 b, uint8 a) { return SDL_MapRGBA (vptr->vid_format, r, g, b, a); } static SDL_Rect *vid_dst_last; static uint32 *vid_data_last; void vid_draw_window (VID_DISPLAY *vptr, int32 x, int32 y, int32 w, int32 h, uint32 *buf) { SDL_Event user_event; SDL_Rect *vid_dst; uint32 *vid_data; sim_debug (SIM_VID_DBG_VIDEO, vptr->vid_dev, "vid_draw(%d, %d, %d, %d)\n", x, y, w, h); SDL_LockMutex (vptr->vid_draw_mutex); /* Synchronize to check region dimensions */ if (vid_dst_last && /* As yet unprocessed draw rectangle? */ (vid_dst_last->x == x) && (vid_dst_last->y == y) && /* AND identical position? */ (vid_dst_last->w == w) && (vid_dst_last->h == h)) { /* AND identical dimensions? */ memcpy (vid_data_last, buf, w*h*sizeof(*buf)); /* Replace region contents */ SDL_UnlockMutex (vptr->vid_draw_mutex); /* Done */ return; } SDL_UnlockMutex (vptr->vid_draw_mutex); vid_dst = (SDL_Rect *)malloc (sizeof(*vid_dst)); if (!vid_dst) { sim_printf ("%s: vid_draw() memory allocation error\n", vid_dname(vptr->vid_dev)); return; } vid_dst->x = x; vid_dst->y = y; vid_dst->w = w; vid_dst->h = h; vid_data = (uint32 *)malloc (w*h*sizeof(*buf)); if (!vid_data) { sim_printf ("%s: vid_draw() memory allocation error\n", vid_dname(vptr->vid_dev)); free (vid_dst); return; } memcpy (vid_data, buf, w*h*sizeof(*buf)); user_event.type = SDL_USEREVENT; user_event.user.windowID = vptr->vid_windowID; user_event.user.code = EVENT_DRAW; user_event.user.data1 = (void *)vid_dst; user_event.user.data2 = (void *)vid_data; SDL_LockMutex (vptr->vid_draw_mutex); /* protect vid_dst_last & vid_data_last */ vid_dst_last = vid_dst; vid_data_last = vid_data; SDL_UnlockMutex (vptr->vid_draw_mutex); /* done protection */ if (SDL_PushEvent (&user_event) < 0) { sim_printf ("%s: vid_draw() SDL_PushEvent error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); free (vid_dst); free (vid_data); } } void vid_draw (int32 x, int32 y, int32 w, int32 h, uint32 *buf) { vid_draw_window (&vid_first, x, y, w, h, buf); } t_stat vid_set_cursor_window (VID_DISPLAY *vptr, t_bool visible, uint32 width, uint32 height, uint8 *data, uint8 *mask, uint32 hot_x, uint32 hot_y) { SDL_Cursor *cursor = SDL_CreateCursor (data, mask, width, height, hot_x, hot_y); SDL_Event user_event; sim_debug (SIM_VID_DBG_CURSOR, vptr->vid_dev, "vid_set_cursor(%s, %d, %d) Setting New Cursor\n", visible ? "visible" : "invisible", width, height); if (sim_deb) { uint32 i, j; for (i=0; i<height; i++) { sim_debug (SIM_VID_DBG_CURSOR, vptr->vid_dev, "Cursor: "); for (j=0; j<width; j++) { int byte = (j + i*width) >> 3; int bit = 7 - ((j + i*width) & 0x7); static char mode[] = "TWIB"; sim_debug (SIM_VID_DBG_CURSOR, vptr->vid_dev, "%c", mode[(((data[byte]>>bit)&1)<<1)|(mask[byte]>>bit)&1]); } sim_debug (SIM_VID_DBG_CURSOR, vptr->vid_dev, "\n"); } } user_event.type = SDL_USEREVENT; user_event.user.windowID = vptr->vid_windowID; user_event.user.code = EVENT_CURSOR; user_event.user.data1 = cursor; user_event.user.data2 = (void *)((size_t)visible); if (SDL_PushEvent (&user_event) < 0) { sim_printf ("%s: vid_set_cursor() SDL_PushEvent error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); SDL_FreeCursor (cursor); } return SCPE_OK; } t_stat vid_set_cursor (t_bool visible, uint32 width, uint32 height, uint8 *data, uint8 *mask, uint32 hot_x, uint32 hot_y) { return vid_set_cursor_window (&vid_first, visible, width, height, data, mask, hot_x, hot_y); } void vid_set_cursor_position_window (VID_DISPLAY *vptr, int32 x, int32 y) { int32 x_delta = vid_cursor_x - x; int32 y_delta = vid_cursor_y - y; if (vptr->vid_flags & SIM_VID_INPUTCAPTURED) return; if ((x_delta) || (y_delta)) { sim_debug (SIM_VID_DBG_CURSOR, vptr->vid_dev, "vid_set_cursor_position(%d, %d) - Cursor position changed\n", x, y); /* Any queued mouse motion events need to have their relative positions adjusted since they were queued based on different info. */ if (SDL_SemWait (vid_mouse_events.sem) == 0) { int32 i; SIM_MOUSE_EVENT *ev; for (i=0; i<vid_mouse_events.count; i++) { ev = &vid_mouse_events.events[(vid_mouse_events.head + i)%MAX_EVENTS]; sim_debug (SIM_VID_DBG_CURSOR, vptr->vid_dev, "Pending Mouse Motion Event Adjusted from: (%d, %d) to (%d, %d)\n", ev->x_rel, ev->y_rel, ev->x_rel + x_delta, ev->y_rel + y_delta); ev->x_rel += x_delta; ev->y_rel += y_delta; } if (SDL_SemPost (vid_mouse_events.sem)) sim_printf ("%s: vid_set_cursor_position(): SDL_SemPost error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); } else { sim_printf ("%s: vid_set_cursor_position(): SDL_SemWait error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); } vid_cursor_x = x; vid_cursor_y = y; if (vptr->vid_cursor_visible) { SDL_Event user_event; user_event.type = SDL_USEREVENT; user_event.user.windowID = vptr->vid_windowID; user_event.user.code = EVENT_WARP; user_event.user.data1 = NULL; user_event.user.data2 = NULL; if (SDL_PushEvent (&user_event) < 0) sim_printf ("%s: vid_set_cursor_position() SDL_PushEvent error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); sim_debug (SIM_VID_DBG_CURSOR, vptr->vid_dev, "vid_set_cursor_position() - Warp Queued\n"); } else { sim_debug (SIM_VID_DBG_CURSOR, vptr->vid_dev, "vid_set_cursor_position() - Warp Skipped\n"); } } } void vid_set_cursor_position (int32 x, int32 y) { vid_set_cursor_position_window (&vid_first, x, y); } void vid_refresh_window (VID_DISPLAY *vptr) { SDL_Event user_event; sim_debug (SIM_VID_DBG_VIDEO, vptr->vid_dev, "vid_refresh() - Queueing Refresh Event\n"); user_event.type = SDL_USEREVENT; user_event.user.windowID = vptr->vid_windowID; user_event.user.code = EVENT_REDRAW; user_event.user.data1 = NULL; user_event.user.data2 = NULL; if (SDL_PushEvent (&user_event) < 0) sim_printf ("%s: vid_refresh() SDL_PushEvent error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); } void vid_refresh (void) { vid_refresh_window (&vid_first); } int vid_map_key (int key) { switch (key) { case SDLK_BACKSPACE: |
︙ | ︙ | |||
942 943 944 945 946 947 948 | return SIM_KEY_Y; case SDLK_z: return SIM_KEY_Z; case SDLK_DELETE: return SIM_KEY_DELETE; | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 | return SIM_KEY_Y; case SDLK_z: return SIM_KEY_Z; case SDLK_DELETE: return SIM_KEY_DELETE; case SDLK_KP_0: return SIM_KEY_KP_INSERT; case SDLK_KP_1: return SIM_KEY_KP_END; case SDLK_KP_2: |
︙ | ︙ | |||
1002 1003 1004 1005 1006 1007 1008 | return SIM_KEY_KP_HOME; case SDLK_KP_8: return SIM_KEY_KP_UP; case SDLK_KP_9: return SIM_KEY_KP_PAGE_UP; | | | 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 | return SIM_KEY_KP_HOME; case SDLK_KP_8: return SIM_KEY_KP_UP; case SDLK_KP_9: return SIM_KEY_KP_PAGE_UP; case SDLK_KP_PERIOD: return SIM_KEY_KP_DELETE; case SDLK_KP_DIVIDE: return SIM_KEY_KP_DIVIDE; case SDLK_KP_MULTIPLY: |
︙ | ︙ | |||
1083 1084 1085 1086 1087 1088 1089 | return SIM_KEY_F10; case SDLK_F11: return SIM_KEY_F11; case SDLK_F12: return SIM_KEY_F12; | | | | < < < | < < < < < < | < < < < | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < < < < < < < | < | < < < < < < | < | > > | < < < < | | < < < < | < | | > > > | | | < < < < | | | > | | | > > > | | < < < < < < < | | < | | > | | > > > > | > > > | > | > > > > > > | > > > > > > > > > > > > > > > > > | > > | > > > > > | > | > > | | < < | | | | | | | < | | > | | | < < < < | < | | | | | | < < < < | | | | | | | | | | > | | | < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 | return SIM_KEY_F10; case SDLK_F11: return SIM_KEY_F11; case SDLK_F12: return SIM_KEY_F12; case SDLK_NUMLOCKCLEAR: return SIM_KEY_NUM_LOCK; case SDLK_CAPSLOCK: return SIM_KEY_CAPS_LOCK; case SDLK_SCROLLLOCK: return SIM_KEY_SCRL_LOCK; case SDLK_RSHIFT: return SIM_KEY_SHIFT_R; case SDLK_LSHIFT: return SIM_KEY_SHIFT_L; case SDLK_RCTRL: return SIM_KEY_CTRL_R; case SDLK_LCTRL: return SIM_KEY_CTRL_L; case SDLK_RALT: return SIM_KEY_ALT_R; case SDLK_LALT: return SIM_KEY_ALT_L; case SDLK_LGUI: return SIM_KEY_WIN_L; case SDLK_RGUI: return SIM_KEY_WIN_R; case SDLK_PRINTSCREEN: return SIM_KEY_PRINT; case SDLK_PAUSE: return SIM_KEY_PAUSE; case SDLK_MENU: return SIM_KEY_MENU; default: return SIM_KEY_UNKNOWN; } } void vid_joy_motion (SDL_JoyAxisEvent *event) { int n = sizeof motion_callback / sizeof (VID_GAMEPAD_CALLBACK); int i; for (i = 0; i < n; i++) { if (motion_callback[i]) { motion_callback[i](event->which, event->axis, event->value); } } } void vid_joy_button (SDL_JoyButtonEvent *event) { int n = sizeof button_callback / sizeof (VID_GAMEPAD_CALLBACK); int i; for (i = 0; i < n; i++) { if (button_callback[i]) { button_callback[i](event->which, event->button, event->state); } } } void vid_controller_motion (SDL_ControllerAxisEvent *event) { SDL_JoyAxisEvent e; e.which = event->which; e.axis = event->axis; e.value = event->value; vid_joy_motion (&e); } void vid_controller_button (SDL_ControllerButtonEvent *event) { /* SDL_GameControllerFromInstanceID is only available from SDL version 2.0.4, so check the version at compile time. The version is also checked at run time. */ #if (SDL_MAJOR_VERSION > 2) || (SDL_MAJOR_VERSION == 2 && \ (SDL_MINOR_VERSION > 0) || (SDL_PATCHLEVEL >= 4)) SDL_JoyButtonEvent e; SDL_GameControllerButtonBind b; SDL_GameController *c; SDL_GameControllerButton button = (SDL_GameControllerButton)event->button; c = SDL_GameControllerFromInstanceID (event->which); b = SDL_GameControllerGetBindForButton (c, button); e.which = event->which; e.button = b.value.button; e.state = event->state; vid_joy_button (&e); #endif } void vid_key (SDL_KeyboardEvent *event) { SIM_KEY_EVENT ev; VID_DISPLAY *vptr = vid_get_event_window ((SDL_Event *)event, event->windowID); if (vptr == NULL) return; if (vptr->vid_mouse_captured) { static const Uint8 *KeyStates = NULL; static int numkeys; if (!KeyStates) KeyStates = SDL_GetKeyboardState(&numkeys); if ((vptr->vid_flags & SIM_VID_INPUTCAPTURED) && (event->state == SDL_PRESSED) && KeyStates[SDL_SCANCODE_RSHIFT] && (KeyStates[SDL_SCANCODE_LCTRL] || KeyStates[SDL_SCANCODE_RCTRL])) { sim_debug (SIM_VID_DBG_KEY, vptr->vid_dev, "vid_key() - Cursor Release\n"); if (SDL_SetRelativeMouseMode(SDL_FALSE) < 0) /* release cursor, show cursor */ sim_printf ("%s: vid_key(): SDL_SetRelativeMouseMode error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); vptr->vid_mouse_captured = FALSE; return; } } if (!sim_is_running) return; if (SDL_SemWait (vid_key_events.sem) == 0) { if (vid_key_events.count < MAX_EVENTS) { ev.key = vid_map_key (event->keysym.sym); ev.dev = vptr->vid_dev; ev.vptr = vptr; sim_debug (SIM_VID_DBG_KEY, vptr->vid_dev, "Keyboard Event: State: %s, Keysym(scancode,sym): (%d,%d) - %s\n", (event->state == SDL_PRESSED) ? "PRESSED" : "RELEASED", event->keysym.scancode, event->keysym.sym, vid_key_name(ev.key)); if (event->state == SDL_PRESSED) { if (!vptr->vid_key_state[event->keysym.scancode]) {/* Key was not down before */ vptr->vid_key_state[event->keysym.scancode] = TRUE; ev.state = SIM_KEYPRESS_DOWN; } else ev.state = SIM_KEYPRESS_REPEAT; } else { vptr->vid_key_state[event->keysym.scancode] = FALSE; ev.state = SIM_KEYPRESS_UP; } vid_key_events.events[vid_key_events.tail++] = ev; vid_key_events.count++; if (vid_key_events.tail == MAX_EVENTS) vid_key_events.tail = 0; } else { sim_debug (SIM_VID_DBG_KEY, vptr->vid_dev, "Keyboard Event DISCARDED: State: %s, Keysym: Scancode: %d, Keysym: %d\n", (event->state == SDL_PRESSED) ? "PRESSED" : "RELEASED", event->keysym.scancode, event->keysym.sym); } if (SDL_SemPost (vid_key_events.sem)) sim_printf ("%s: vid_key(): SDL_SemPost error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); } } void vid_mouse_move (SDL_MouseMotionEvent *event) { SDL_Event dummy_event; SDL_MouseMotionEvent *dev = (SDL_MouseMotionEvent *)&dummy_event; SIM_MOUSE_EVENT ev; VID_DISPLAY *vptr = vid_get_event_window ((SDL_Event *)event, event->windowID); if (vptr == NULL) return; if ((!vptr->vid_mouse_captured) && (vptr->vid_flags & SIM_VID_INPUTCAPTURED)) return; if (!sim_is_running) return; if (!vptr->vid_cursor_visible) return; sim_debug (SIM_VID_DBG_MOUSE, vptr->vid_dev, "Mouse Move Event: pos:(%d,%d) rel:(%d,%d) buttons:(%d,%d,%d)\n", event->x, event->y, event->xrel, event->yrel, (event->state & SDL_BUTTON(SDL_BUTTON_LEFT)) ? 1 : 0, (event->state & SDL_BUTTON(SDL_BUTTON_MIDDLE)) ? 1 : 0, (event->state & SDL_BUTTON(SDL_BUTTON_RIGHT)) ? 1 : 0); while (SDL_PeepEvents (&dummy_event, 1, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION)) { /* Coalesce motion activity to avoid thrashing */ event->xrel += dev->xrel; event->yrel += dev->yrel; event->x = dev->x; event->y = dev->y; event->state = dev->state; sim_debug (SIM_VID_DBG_MOUSE, vptr->vid_dev, "Mouse Move Event: Additional Event Coalesced:pos:(%d,%d) rel:(%d,%d) buttons:(%d,%d,%d)\n", dev->x, dev->y, dev->xrel, dev->yrel, (dev->state & SDL_BUTTON(SDL_BUTTON_LEFT)) ? 1 : 0, (dev->state & SDL_BUTTON(SDL_BUTTON_MIDDLE)) ? 1 : 0, (dev->state & SDL_BUTTON(SDL_BUTTON_RIGHT)) ? 1 : 0); }; if (SDL_SemWait (vid_mouse_events.sem) == 0) { if (!vptr->vid_mouse_captured) { event->xrel = (event->x - vid_cursor_x); event->yrel = (event->y - vid_cursor_y); } vid_mouse_b1 = (event->state & SDL_BUTTON(SDL_BUTTON_LEFT)) ? TRUE : FALSE; vid_mouse_b2 = (event->state & SDL_BUTTON(SDL_BUTTON_MIDDLE)) ? TRUE : FALSE; vid_mouse_b3 = (event->state & SDL_BUTTON(SDL_BUTTON_RIGHT)) ? TRUE : FALSE; sim_debug (SIM_VID_DBG_MOUSE, vptr->vid_dev, "Mouse Move Event: pos:(%d,%d) rel:(%d,%d) buttons:(%d,%d,%d) - Count: %d vid_cursor:(%d,%d)\n", event->x, event->y, event->xrel, event->yrel, (event->state & SDL_BUTTON(SDL_BUTTON_LEFT)) ? 1 : 0, (event->state & SDL_BUTTON(SDL_BUTTON_MIDDLE)) ? 1 : 0, (event->state & SDL_BUTTON(SDL_BUTTON_RIGHT)) ? 1 : 0, vid_mouse_events.count, vid_cursor_x, vid_cursor_y); if (vid_mouse_events.count < MAX_EVENTS) { SIM_MOUSE_EVENT *tail = &vid_mouse_events.events[(vid_mouse_events.tail+MAX_EVENTS-1)%MAX_EVENTS]; ev.dev = vptr->vid_dev; ev.x_rel = event->xrel; ev.y_rel = event->yrel; ev.b1_state = vid_mouse_b1; ev.b2_state = vid_mouse_b2; ev.b3_state = vid_mouse_b3; ev.x_pos = event->x; ev.y_pos = event->y; if ((vid_mouse_events.count > 0) && /* Is there a tail event? */ (ev.b1_state == tail->b1_state) && /* With the same button state? */ (ev.b2_state == tail->b2_state) && (ev.b3_state == tail->b3_state)) { /* Merge the motion */ tail->x_rel += ev.x_rel; tail->y_rel += ev.y_rel; tail->x_pos = ev.x_pos; tail->y_pos = ev.y_pos; sim_debug (SIM_VID_DBG_MOUSE, vptr->vid_dev, "Mouse Move Event: Coalesced into pending event: (%d,%d)\n", tail->x_rel, tail->y_rel); } else { /* Add a new event */ vid_mouse_events.events[vid_mouse_events.tail++] = ev; vid_mouse_events.count++; if (vid_mouse_events.tail == MAX_EVENTS) vid_mouse_events.tail = 0; } } else { sim_debug (SIM_VID_DBG_MOUSE, vptr->vid_dev, "Mouse Move Event Discarded: Count: %d\n", vid_mouse_events.count); } if (SDL_SemPost (vid_mouse_events.sem)) sim_printf ("%s: vid_mouse_move(): SDL_SemPost error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); } } void vid_mouse_button (SDL_MouseButtonEvent *event) { SDL_Event dummy_event; SIM_MOUSE_EVENT ev; t_bool state; VID_DISPLAY *vptr = vid_get_event_window ((SDL_Event *)event, event->windowID); if (vptr == NULL) return; if ((!vptr->vid_mouse_captured) && (vptr->vid_flags & SIM_VID_INPUTCAPTURED)) { if ((event->state == SDL_PRESSED) && (event->button == SDL_BUTTON_LEFT)) { /* left click and cursor not captured? */ sim_debug (SIM_VID_DBG_KEY, vptr->vid_dev, "vid_mouse_button() - Cursor Captured\n"); if (SDL_SetRelativeMouseMode (SDL_TRUE) < 0) /* lock cursor to window, hide cursor */ sim_printf ("%s: vid_mouse_button(): SDL_SetRelativeMouseMode error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); SDL_WarpMouseInWindow (NULL, vptr->vid_width/2, vptr->vid_height/2);/* back to center */ SDL_PumpEvents (); while (SDL_PeepEvents (&dummy_event, 1, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION)) {}; vptr->vid_mouse_captured = TRUE; } return; } if (!sim_is_running) return; state = (event->state == SDL_PRESSED) ? TRUE : FALSE; if (SDL_SemWait (vid_mouse_events.sem) == 0) { switch (event->button) { case SDL_BUTTON_LEFT: vid_mouse_b1 = state; break; case SDL_BUTTON_MIDDLE: vid_mouse_b2 = state; break; case SDL_BUTTON_RIGHT: vid_mouse_b3 = state; break; } sim_debug (SIM_VID_DBG_MOUSE, vptr->vid_dev, "Mouse Button Event: State: %d, Button: %d, (%d,%d)\n", event->state, event->button, event->x, event->y); if (vid_mouse_events.count < MAX_EVENTS) { ev.dev = vptr->vid_dev; ev.x_rel = 0; ev.y_rel = 0; ev.x_pos = event->x; ev.y_pos = event->y; ev.b1_state = vid_mouse_b1; ev.b2_state = vid_mouse_b2; ev.b3_state = vid_mouse_b3; vid_mouse_events.events[vid_mouse_events.tail++] = ev; vid_mouse_events.count++; if (vid_mouse_events.tail == MAX_EVENTS) vid_mouse_events.tail = 0; } else { sim_debug (SIM_VID_DBG_MOUSE, vptr->vid_dev, "Mouse Button Event Discarded: Count: %d\n", vid_mouse_events.count); } if (SDL_SemPost (vid_mouse_events.sem)) sim_printf ("%s: Mouse Button Event: SDL_SemPost error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); } } t_bool vid_is_fullscreen_window (VID_DISPLAY *vptr) { return SDL_GetWindowFlags (vptr->vid_window) & SDL_WINDOW_FULLSCREEN_DESKTOP; } t_bool vid_is_fullscreen (void) { return vid_is_fullscreen_window (&vid_first); } t_stat vid_set_fullscreen_window (VID_DISPLAY *vptr, t_bool flag) { if (flag) SDL_SetWindowFullscreen (vptr->vid_window, SDL_WINDOW_FULLSCREEN_DESKTOP); else SDL_SetWindowFullscreen (vptr->vid_window, 0); return SCPE_OK; } t_stat vid_set_fullscreen (t_bool flag) { return vid_set_fullscreen_window (&vid_first, flag); } static void vid_stretch(VID_DISPLAY *vptr, SDL_Rect *r) { /* Return in r a rectangle with the same aspect ratio as the video buffer but scaled to fit precisely in the output window. Normally, the buffer and the window have the same sizes, but if the window is resized, or fullscreen is in effect, they are not. */ int w, h; SDL_GetRendererOutputSize(vptr->vid_renderer, &w, &h); if ((double)h / vptr->vid_height < (double)w / vptr->vid_width) { r->w = vptr->vid_width * h / vptr->vid_height; r->h = h; r->x = (w - r->w) / 2; r->y = 0; } else { r->w = w; r->h = vptr->vid_height * w / vptr->vid_width; r->x = 0; r->y = (h - r->h) / 2; } } void vid_update (VID_DISPLAY *vptr) { SDL_Rect vid_dst; vid_stretch(vptr, &vid_dst); sim_debug (SIM_VID_DBG_VIDEO, vptr->vid_dev, "Video Update Event: \n"); if (sim_deb) fflush (sim_deb); if (vptr->vid_blending) SDL_RenderPresent (vptr->vid_renderer); else { if (SDL_RenderClear (vptr->vid_renderer)) sim_printf ("%s: Video Update Event: SDL_RenderClear error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); if (SDL_RenderCopy (vptr->vid_renderer, vptr->vid_texture, NULL, &vid_dst)) sim_printf ("%s: Video Update Event: SDL_RenderCopy error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); SDL_RenderPresent (vptr->vid_renderer); } } void vid_update_cursor (VID_DISPLAY *vptr, SDL_Cursor *cursor, t_bool visible) { if (!cursor) return; sim_debug (SIM_VID_DBG_VIDEO, vptr->vid_dev, "Cursor Update Event: Previously %s, Now %s, New Cursor object at: %p, Old Cursor object at: %p\n", SDL_ShowCursor(-1) ? "visible" : "invisible", visible ? "visible" : "invisible", cursor, vptr->vid_cursor); SDL_SetCursor (cursor); if ((vptr->vid_window == SDL_GetMouseFocus ()) && visible) SDL_WarpMouseInWindow (NULL, vid_cursor_x, vid_cursor_y);/* sync position */ if ((vptr->vid_cursor != cursor) && (vptr->vid_cursor)) SDL_FreeCursor (vptr->vid_cursor); vptr->vid_cursor = cursor; SDL_ShowCursor (visible); vptr->vid_cursor_visible = visible; } void vid_warp_position (VID_DISPLAY *vptr) { sim_debug (SIM_VID_DBG_VIDEO, vptr->vid_dev, "Mouse Warp Event: Warp to: (%d,%d)\n", vid_cursor_x, vid_cursor_y); SDL_PumpEvents (); SDL_WarpMouseInWindow (NULL, vid_cursor_x, vid_cursor_y); SDL_PumpEvents (); } void vid_draw_region (VID_DISPLAY *vptr, SDL_UserEvent *event) { SDL_Rect *vid_dst = (SDL_Rect *)event->data1; uint32 *buf = (uint32 *)event->data2; sim_debug (SIM_VID_DBG_VIDEO, vptr->vid_dev, "Draw Region Event: (%d,%d,%d,%d)\n", vid_dst->x, vid_dst->x, vid_dst->w, vid_dst->h); SDL_LockMutex (vptr->vid_draw_mutex); if (vid_dst == vid_dst_last) { vid_dst_last = NULL; vid_data_last = NULL; } SDL_UnlockMutex (vptr->vid_draw_mutex); if (vptr->vid_blending) { SDL_UpdateTexture(vptr->vid_texture, vid_dst, buf, vid_dst->w*sizeof(*buf)); SDL_RenderCopy (vptr->vid_renderer, vptr->vid_texture, vid_dst, vid_dst); } else if (SDL_UpdateTexture(vptr->vid_texture, vid_dst, buf, vid_dst->w*sizeof(*buf))) sim_printf ("%s: vid_draw_region() - SDL_UpdateTexture error: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); free (vid_dst); free (buf); event->data1 = NULL; } static int vid_new_window (VID_DISPLAY *vptr) { SDL_CreateWindowAndRenderer (vptr->vid_width, vptr->vid_height, SDL_WINDOW_SHOWN, &vptr->vid_window, &vptr->vid_renderer); if ((vptr->vid_window == NULL) || (vptr->vid_renderer == NULL)) { sim_printf ("%s: Error Creating Video Window: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); SDL_Quit (); return 0; } vptr->vid_draw_mutex = SDL_CreateMutex(); if (vptr->vid_draw_mutex == NULL) { fprintf (stderr, "%s: SDL_CreateMutex failed: %s\n", vid_dname(vptr->vid_dev), SDL_GetError ()); SDL_Quit (); return 0; } SDL_SetRenderDrawColor (vptr->vid_renderer, 0, 0, 0, 255); SDL_RenderClear (vptr->vid_renderer); SDL_RenderPresent (vptr->vid_renderer); vptr->vid_texture = SDL_CreateTexture (vptr->vid_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, vptr->vid_width, vptr->vid_height); if (!vptr->vid_texture) { sim_printf ("%s: Error configuring Video environment: %s\n", vid_dname(vptr->vid_dev), SDL_GetError()); SDL_DestroyRenderer(vptr->vid_renderer); vptr->vid_renderer = NULL; SDL_DestroyWindow(vptr->vid_window); vptr->vid_window = NULL; SDL_Quit (); return 0; } vptr->vid_format = SDL_AllocFormat (SDL_PIXELFORMAT_ARGB8888); SDL_StopTextInput (); vptr->vid_windowID = SDL_GetWindowID (vptr->vid_window); if (vptr->vid_flags & SIM_VID_INPUTCAPTURED) { char title[150]; memset (title, 0, sizeof(title)); strlcpy (title, vptr->vid_title, sizeof(title)); strlcat (title, " ReleaseKey=", sizeof(title)); strlcat (title, vid_release_key, sizeof(title)); SDL_SetWindowTitle (vptr->vid_window, title); } else SDL_SetWindowTitle (vptr->vid_window, vptr->vid_title); memset (&vptr->vid_key_state, 0, sizeof(vptr->vid_key_state)); vid_active++; return 1; } t_stat vid_set_alpha_mode (VID_DISPLAY *vptr, int mode) { SDL_BlendMode x; switch (mode) { case SIM_ALPHA_NONE: vptr->vid_blending = FALSE; x = SDL_BLENDMODE_NONE; break; case SIM_ALPHA_BLEND: vptr->vid_blending = TRUE; x = SDL_BLENDMODE_BLEND; break; case SIM_ALPHA_ADD: vptr->vid_blending = TRUE; x = SDL_BLENDMODE_ADD; break; case SIM_ALPHA_MOD: vptr->vid_blending = TRUE; x = SDL_BLENDMODE_MOD; break; default: return SCPE_ARG; } if (SDL_SetTextureBlendMode (vptr->vid_texture, x)) return SCPE_IERR; if (SDL_SetRenderDrawBlendMode (vptr->vid_renderer, x)) return SCPE_IERR; return SCPE_OK; } static void vid_destroy (VID_DISPLAY *vptr) { VID_DISPLAY *parent; vptr->vid_ready = FALSE; if (vptr->vid_cursor) { SDL_FreeCursor (vptr->vid_cursor); vptr->vid_cursor = NULL; } SDL_DestroyTexture(vptr->vid_texture); vptr->vid_texture = NULL; SDL_DestroyRenderer(vptr->vid_renderer); vptr->vid_renderer = NULL; SDL_DestroyWindow(vptr->vid_window); vptr->vid_window = NULL; SDL_DestroyMutex (vptr->vid_draw_mutex); vptr->vid_draw_mutex = NULL; for (parent = &vid_first; parent != NULL; parent = parent->next) { if (parent->next == vptr) parent->next = vptr->next; } vid_active--; } int vid_video_events (VID_DISPLAY *vptr0) { SDL_Event event; static const char *eventtypes[SDL_LASTEVENT]; static const char *windoweventtypes[256]; static t_bool initialized = FALSE; if (!initialized) { initialized = TRUE; eventtypes[SDL_QUIT] = "QUIT"; /**< User-requested quit */ /* These application events have special meaning on iOS, see README-ios.txt for details */ eventtypes[SDL_APP_TERMINATING] = "APP_TERMINATING"; /**< The application is being terminated by the OS Called on iOS in applicationWillTerminate() Called on Android in onDestroy() */ |
︙ | ︙ | |||
1603 1604 1605 1606 1607 1608 1609 | eventtypes[SDL_RENDER_DEVICE_RESET] = "RENDER_DEVICE_RESET"; /**< The render device has been reset */ #endif /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use, * and should be allocated with SDL_RegisterEvents() */ eventtypes[SDL_USEREVENT] = "USEREVENT"; | < | < | < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < | < | < < < < < < < < < < < < < < < < < < < < < < < | < | > | | | | > > > > > > > > > > > > > > > > > > | > | | | | | | > > > > > > | < < < < | | | > | > > > > > > | | | < | < | < < < < < < < < < | > < < < < | < | < | < < < < < < | > | | > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > | | | > < < < < < < < < < < < < < < < < < < < < | 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 | eventtypes[SDL_RENDER_DEVICE_RESET] = "RENDER_DEVICE_RESET"; /**< The render device has been reset */ #endif /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use, * and should be allocated with SDL_RegisterEvents() */ eventtypes[SDL_USEREVENT] = "USEREVENT"; } sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE, vptr0->vid_dev, "vid_thread() - Starting\n"); sim_os_set_thread_priority (PRIORITY_ABOVE_NORMAL); if (!vid_new_window (vptr0)) { return 0; } vid_beep_setup (400, 660); vid_controllers_setup (vptr0->vid_dev); vptr0->vid_ready = TRUE; sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE|SIM_VID_DBG_CURSOR, vptr0->vid_dev, "vid_thread() - Started\n"); while (vid_active) { int status = SDL_WaitEvent (&event); if (status == 1) { VID_DISPLAY *vptr; switch (event.type) { case SDL_KEYDOWN: case SDL_KEYUP: vid_key (&event.key); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: vid_mouse_button (&event.button); break; case SDL_MOUSEMOTION: vid_mouse_move (&event.motion); break; case SDL_JOYAXISMOTION: vid_joy_motion (&event.jaxis); break; case SDL_JOYBUTTONUP: case SDL_JOYBUTTONDOWN: vid_joy_button (&event.jbutton); break; case SDL_CONTROLLERAXISMOTION: vid_controller_motion (&event.caxis); break; case SDL_CONTROLLERBUTTONUP: case SDL_CONTROLLERBUTTONDOWN: vid_controller_button (&event.cbutton); break; case SDL_WINDOWEVENT: vptr = vid_get_event_window (&event, event.window.windowID); if (vptr != NULL) { sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE|SIM_VID_DBG_CURSOR, vptr->vid_dev, "vid_thread() - Window Event: %d - %s\n", event.window.event, windoweventtypes[event.window.event]); switch (event.window.event) { case SDL_WINDOWEVENT_ENTER: if (vptr->vid_flags & SIM_VID_INPUTCAPTURED) SDL_WarpMouseInWindow (NULL, vptr->vid_width/2, vptr->vid_height/2); /* center position */ break; case SDL_WINDOWEVENT_EXPOSED: vid_update (vptr); break; } } break; case SDL_USEREVENT: /* There are 9 user events generated */ /* EVENT_REDRAW to update the display */ /* EVENT_DRAW to update a region in the display texture */ /* EVENT_SHOW to display the current SDL video capabilities */ /* EVENT_CURSOR to change the current cursor */ /* EVENT_WARP to warp the cursor position */ /* EVENT_OPEN to open a new window */ /* EVENT_CLOSE to wake up this thread and let */ /* it notice vid_active has changed */ /* EVENT_SCREENSHOT to take a screenshot */ /* EVENT_BEEP to emit a beep sound */ while (vid_active && event.user.code) { vptr = vid_get_event_window (&event, event.user.windowID); if (vptr == NULL) continue; if (event.user.code == EVENT_REDRAW) { vid_update (vptr); event.user.code = 0; /* Mark as done */ if (0) while (SDL_PeepEvents (&event, 1, SDL_GETEVENT, SDL_USEREVENT, SDL_USEREVENT)) { if (event.user.code == EVENT_REDRAW) { /* Only do a single video update between waiting for events */ sim_debug (SIM_VID_DBG_VIDEO, vptr->vid_dev, "vid_thread() - Ignored extra REDRAW Event\n"); event.user.code = 0; /* Mark as done */ continue; } break; } } if (event.user.code == EVENT_CURSOR) { vid_update_cursor (vptr, (SDL_Cursor *)(event.user.data1), (t_bool)((size_t)event.user.data2)); event.user.data1 = NULL; event.user.code = 0; /* Mark as done */ } if (event.user.code == EVENT_WARP) { vid_warp_position (vptr); event.user.code = 0; /* Mark as done */ } if (event.user.code == EVENT_CLOSE) { vid_destroy (vptr); event.user.code = 0; /* Mark as done */ } if (event.user.code == EVENT_DRAW) { vid_draw_region (vptr, (SDL_UserEvent*)&event); event.user.code = 0; /* Mark as done */ } if (event.user.code == EVENT_SHOW) { vid_show_video_event (); event.user.code = 0; /* Mark as done */ } if (event.user.code == EVENT_SCREENSHOT) { vid_screenshot_event (); event.user.code = 0; /* Mark as done */ } if (event.user.code == EVENT_BEEP) { vid_beep_event (); event.user.code = 0; /* Mark as done */ } if (event.user.code == EVENT_OPEN) { VID_DISPLAY *vptr = (VID_DISPLAY *)event.user.data1; vid_new_window (vptr); vptr->vid_ready = TRUE; event.user.code = 0; /* Mark as done */ } if (event.user.code != 0) { sim_printf ("vid_thread(): Unexpected user event code: %d\n", event.user.code); } } break; case SDL_QUIT: sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE|SIM_VID_DBG_CURSOR, vptr0->vid_dev, "vid_thread() - QUIT Event - %s\n", vid_quit_callback ? "Signaled" : "Ignored"); if (vid_quit_callback) vid_quit_callback (); break; default: sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE|SIM_VID_DBG_CURSOR, vptr0->vid_dev, "vid_thread() - Ignored Event: Type: %s(%d)\n", eventtypes[event.type], event.type); break; } } else { if (status < 0) sim_printf ("%s: vid_thread() - SDL_WaitEvent error: %s\n", vid_dname(vptr0->vid_dev), SDL_GetError()); } } vid_controllers_cleanup (); vid_beep_cleanup (); sim_debug (SIM_VID_DBG_VIDEO|SIM_VID_DBG_KEY|SIM_VID_DBG_MOUSE|SIM_VID_DBG_CURSOR, vptr0->vid_dev, "vid_thread() - Exiting\n"); return 0; } int vid_thread (void *arg) { VID_DISPLAY *vptr = (VID_DISPLAY *)arg; int stat; SDL_SetHint (SDL_HINT_RENDER_DRIVER, "software"); stat = SDL_Init (SDL_INIT_VIDEO); if (stat) { sim_printf ("SDL Video subsystem can't initialize\n"); return 0; } vid_video_events (vptr); SDL_Quit (); return 0; } const char *vid_version(void) { static char SDLVersion[160]; SDL_version compiled, running; SDL_GetVersion(&running); SDL_VERSION(&compiled); SDLVersion[sizeof (SDLVersion) - 1] = '\0'; if ((compiled.major == running.major) && (compiled.minor == running.minor) && (compiled.patch == running.patch)) snprintf(SDLVersion, sizeof (SDLVersion) - 1, "SDL Version %d.%d.%d", compiled.major, compiled.minor, compiled.patch); else snprintf(SDLVersion, sizeof (SDLVersion) - 1, "SDL Version (Compiled: %d.%d.%d, Runtime: %d.%d.%d)", compiled.major, compiled.minor, compiled.patch, running.major, running.minor, running.patch); #if defined (HAVE_LIBPNG) if (1) { png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (strcmp (PNG_LIBPNG_VER_STRING, png_get_libpng_ver (png))) snprintf(&SDLVersion[strlen (SDLVersion)], sizeof (SDLVersion) - (strlen (SDLVersion) + 1), ", PNG Version (Compiled: %s, Runtime: %s)", PNG_LIBPNG_VER_STRING, png_get_libpng_ver (png)); else snprintf(&SDLVersion[strlen (SDLVersion)], sizeof (SDLVersion) - (strlen (SDLVersion) + 1), ", PNG Version %s", PNG_LIBPNG_VER_STRING); png_destroy_read_struct(&png, NULL, NULL); #if defined (ZLIB_VERSION) if (strcmp (ZLIB_VERSION, zlibVersion ())) snprintf(&SDLVersion[strlen (SDLVersion)], sizeof (SDLVersion) - (strlen (SDLVersion) + 1), ", zlib: (Compiled: %s, Runtime: %s)", ZLIB_VERSION, zlibVersion ()); else snprintf(&SDLVersion[strlen (SDLVersion)], sizeof (SDLVersion) - (strlen (SDLVersion) + 1), ", zlib: %s", ZLIB_VERSION); #endif } #endif return (const char *)SDLVersion; } t_stat vid_set_release_key (FILE* st, UNIT* uptr, int32 val, CONST void* desc) { return SCPE_NOFNC; } t_stat vid_show_release_key (FILE* st, UNIT* uptr, int32 val, CONST void* desc) { VID_DISPLAY *vptr; for (vptr = &vid_first; vptr != NULL; vptr = vptr->next) { if (vptr->vid_flags & SIM_VID_INPUTCAPTURED) { fprintf (st, "ReleaseKey=%s", vid_release_key); return SCPE_OK; } } return SCPE_OK; } static t_stat _vid_show_video (FILE* st, UNIT* uptr, int32 val, CONST void* desc) { int i; VID_DISPLAY *vptr; fprintf (st, "Video support using SDL: %s\n", vid_version()); #if defined (SDL_MAIN_AVAILABLE) fprintf (st, " SDL Events being processed on the main process thread\n"); #endif if (!vid_active) { #if !defined (SDL_MAIN_AVAILABLE) int stat = SDL_Init(SDL_INIT_VIDEO); if (stat) return sim_messagef (SCPE_OPENERR, "SDL_Init() failed. Video subsystem is unavailable.\n"); #endif } else { for (vptr = &vid_first; vptr != NULL; vptr = vptr->next) { if (!vptr->vid_active_window) continue; fprintf (st, " Currently Active Video Window: (%d by %d pixels)\n", vptr->vid_width, vptr->vid_height); fprintf (st, " "); vid_show_release_key (st, uptr, val, desc); } fprintf (st, "\n"); fprintf (st, " SDL Video Driver: %s\n", SDL_GetCurrentVideoDriver()); } for (i = 0; i < SDL_GetNumVideoDisplays(); ++i) { SDL_DisplayMode display; if (SDL_GetCurrentDisplayMode(i, &display)) { fprintf (st, "Could not get display mode for video display #%d: %s", i, SDL_GetError()); } else { |
︙ | ︙ | |||
1999 2000 2001 2002 2003 2004 2005 | } } } } if (vid_active) { SDL_RendererInfo info; | > > | > > > | 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 | } } } } if (vid_active) { SDL_RendererInfo info; for (vptr = &vid_first; vptr != NULL; vptr = vptr->next) { if (vptr->vid_active_window) { SDL_GetRendererInfo (vptr->vid_renderer, &info); break; } } fprintf (st, " Currently Active Renderer: %s\n", info.name); } if (1) { static const char *hints[] = { #if defined (SDL_HINT_FRAMEBUFFER_ACCELERATION) SDL_HINT_FRAMEBUFFER_ACCELERATION , #endif |
︙ | ︙ | |||
2101 2102 2103 2104 2105 2106 2107 | NULL}; fprintf (st, " Currently Active SDL Hints:\n"); for (i=0; hints[i]; i++) { if (SDL_GetHint (hints[i])) fprintf (st, " %s = %s\n", hints[i], SDL_GetHint (hints[i])); } } | < | 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 | NULL}; fprintf (st, " Currently Active SDL Hints:\n"); for (i=0; hints[i]; i++) { if (SDL_GetHint (hints[i])) fprintf (st, " %s = %s\n", hints[i], SDL_GetHint (hints[i])); } } #if !defined (SDL_MAIN_AVAILABLE) if (!vid_active) SDL_Quit(); #endif return SCPE_OK; } |
︙ | ︙ | |||
2145 2146 2147 2148 2149 2150 2151 | vid_show_video_event (); #endif while (_show_stat == -1) SDL_Delay (20); return _show_stat; } | | | < < < < < < < < < < < < < < < | | | < > > > > > > > > > > > > > > > > > > > > | > > > > > > | 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 | vid_show_video_event (); #endif while (_show_stat == -1) SDL_Delay (20); return _show_stat; } static t_stat _vid_screenshot (VID_DISPLAY *vptr, const char *filename) { int stat; char *fullname = NULL; if (!vid_active) { sim_printf ("No video display is active\n"); return SCPE_UDIS | SCPE_NOMESSAGE; } fullname = (char *)malloc (strlen(filename) + 5); if (!fullname) return SCPE_MEM; if (1) { SDL_Surface *sshot = sim_end ? SDL_CreateRGBSurface(0, vptr->vid_width, vptr->vid_height, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000) : SDL_CreateRGBSurface(0, vptr->vid_width, vptr->vid_height, 32, 0x0000ff00, 0x000ff000, 0xff000000, 0x000000ff) ; SDL_RenderReadPixels(vptr->vid_renderer, NULL, SDL_PIXELFORMAT_ARGB8888, sshot->pixels, sshot->pitch); #if defined(HAVE_LIBPNG) if (!match_ext (filename, "bmp")) { sprintf (fullname, "%s%s", filename, match_ext (filename, "png") ? "" : ".png"); stat = SDL_SavePNG(sshot, fullname); } else { sprintf (fullname, "%s", filename); stat = SDL_SaveBMP(sshot, fullname); } #else sprintf (fullname, "%s%s", filename, match_ext (filename, "bmp") ? "" : ".bmp"); stat = SDL_SaveBMP(sshot, fullname); #endif /* defined(HAVE_LIBPNG) */ SDL_FreeSurface(sshot); } if (stat) { sim_printf ("Error saving screenshot to %s: %s\n", fullname, SDL_GetError()); free (fullname); return SCPE_IOERR | SCPE_NOMESSAGE; } else { if (!sim_quiet) sim_printf ("Screenshot saved to %s\n", fullname); free (fullname); return SCPE_OK; } } static t_stat _screenshot_stat; static const char *_screenshot_filename; void vid_screenshot_event (void) { VID_DISPLAY *vptr; int i = 0, n; char *name = (char *)malloc (strlen (_screenshot_filename) + 5); char *extension = strrchr ((char *)_screenshot_filename, '.'); if (name == NULL) { _screenshot_stat = SCPE_NXM; return; } if (extension) n = extension - _screenshot_filename; else { n = strlen (_screenshot_filename); extension = (char *)""; } strncpy (name, _screenshot_filename, n); for (vptr = &vid_first; vptr != NULL; vptr = vptr->next) { if (vid_active > 1) sprintf (name + n, "%d%s", i++, extension); else sprintf (name + n, "%s", extension); _screenshot_stat = _vid_screenshot (vptr, name); if (_screenshot_stat != SCPE_OK) { free (name); return; } } free (name); } t_stat vid_screenshot (const char *filename) { SDL_Event user_event; _screenshot_stat = -1; |
︙ | ︙ | |||
2247 2248 2249 2250 2251 2252 2253 | static int16 *vid_beep_data; static int vid_beep_offset; static int vid_beep_duration; static int vid_beep_samples; static void vid_audio_callback(void *ctx, Uint8 *stream, int length) { | < | 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 | static int16 *vid_beep_data; static int vid_beep_offset; static int vid_beep_duration; static int vid_beep_samples; static void vid_audio_callback(void *ctx, Uint8 *stream, int length) { int i, sum, remnant = ((vid_beep_samples - vid_beep_offset) * sizeof (*vid_beep_data)); if (length > remnant) { memset (stream + remnant, 0, length - remnant); length = remnant; if (remnant == 0) { SDL_PauseAudio(1); |
︙ | ︙ | |||
2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 | static void vid_beep_setup (int duration_ms, int tone_frequency) { if (!vid_beep_data) { int i; SDL_AudioSpec desiredSpec; memset (&desiredSpec, 0, sizeof(desiredSpec)); desiredSpec.freq = SAMPLE_FREQUENCY; desiredSpec.format = AUDIO_S16SYS; desiredSpec.channels = 1; desiredSpec.samples = 2048; desiredSpec.callback = vid_audio_callback; | > | 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 | static void vid_beep_setup (int duration_ms, int tone_frequency) { if (!vid_beep_data) { int i; SDL_AudioSpec desiredSpec; SDL_InitSubSystem (SDL_INIT_AUDIO); memset (&desiredSpec, 0, sizeof(desiredSpec)); desiredSpec.freq = SAMPLE_FREQUENCY; desiredSpec.format = AUDIO_S16SYS; desiredSpec.channels = 1; desiredSpec.samples = 2048; desiredSpec.callback = vid_audio_callback; |
︙ | ︙ | |||
2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 | } static void vid_beep_cleanup (void) { SDL_CloseAudio(); free (vid_beep_data); vid_beep_data = NULL; } void vid_beep_event (void) { vid_beep_offset = 0; /* reset to beginning of sample set */ SDL_PauseAudio (0); /* Play sound */ } | > | 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 | } static void vid_beep_cleanup (void) { SDL_CloseAudio(); free (vid_beep_data); vid_beep_data = NULL; SDL_QuitSubSystem (SDL_INIT_AUDIO); } void vid_beep_event (void) { vid_beep_offset = 0; /* reset to beginning of sample set */ SDL_PauseAudio (0); /* Play sound */ } |
︙ | ︙ | |||
2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 | t_stat vid_open (DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags) { return SCPE_NOFNC; } t_stat vid_close (void) { return SCPE_OK; } t_stat vid_poll_kb (SIM_KEY_EVENT *ev) { return SCPE_EOF; } | > > > > > | 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 | t_stat vid_open (DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags) { return SCPE_NOFNC; } t_stat vid_close (void) { return SCPE_OK; } t_stat vid_close_all (void) { return SCPE_OK; } t_stat vid_poll_kb (SIM_KEY_EVENT *ev) { return SCPE_EOF; } |
︙ | ︙ | |||
2388 2389 2390 2391 2392 2393 2394 | { fprintf (st, "no release key"); return SCPE_OK; } t_stat vid_show_video (FILE* st, UNIT* uptr, int32 val, CONST void* desc) { | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 | { fprintf (st, "no release key"); return SCPE_OK; } t_stat vid_show_video (FILE* st, UNIT* uptr, int32 val, CONST void* desc) { fprintf (st, "video support unavailable\n"); return SCPE_OK; } t_stat vid_screenshot (const char *filename) { sim_printf ("video support unavailable\n"); return SCPE_NOFNC|SCPE_NOMESSAGE; } t_bool vid_is_fullscreen (void) { sim_printf ("video support unavailable\n"); return FALSE; } t_stat vid_set_fullscreen (t_bool flag) { sim_printf ("video support unavailable\n"); return SCPE_OK; } t_stat vid_open_window (VID_DISPLAY **vptr, DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags) { *vptr = NULL; return SCPE_NOFNC; } t_stat vid_close_window (VID_DISPLAY *vptr) { return SCPE_OK; } uint32 vid_map_rgb_window (VID_DISPLAY *vptr, uint8 r, uint8 g, uint8 b) { return 0; } void vid_draw_window (VID_DISPLAY *vptr, int32 x, int32 y, int32 w, int32 h, uint32 *buf) { return; } void vid_refresh_window (VID_DISPLAY *vptr) { return; } t_stat vid_set_cursor_window (VID_DISPLAY *vptr, t_bool visible, uint32 width, uint32 height, uint8 *data, uint8 *mask, uint32 hot_x, uint32 hot_y) { return SCPE_NOFNC; } t_bool vid_is_fullscreen_window (VID_DISPLAY *vptr) { sim_printf ("video support unavailable\n"); return FALSE; } t_stat vid_set_fullscreen_window (VID_DISPLAY *vptr, t_bool flag) { sim_printf ("video support unavailable\n"); return SCPE_OK; } void vid_set_cursor_position_window (VID_DISPLAY *vptr, int32 x, int32 y) { return; } const char *vid_key_name (int32 key) { return ""; } #endif /* defined(USE_SIM_VIDEO) */ |
︙ | ︙ | |||
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | #define SIM_KEY_KP_5 101 #define SIM_KEY_KP_ENTER 102 #define SIM_KEY_KP_MULTIPLY 103 #define SIM_KEY_KP_DIVIDE 104 #define SIM_KEY_UNKNOWN 200 struct mouse_event { int32 x_rel; /* X axis relative motion */ int32 y_rel; /* Y axis relative motion */ int32 x_pos; /* X axis position */ int32 y_pos; /* Y axis position */ t_bool b1_state; /* state of button 1 */ t_bool b2_state; /* state of button 2 */ t_bool b3_state; /* state of button 3 */ }; struct key_event { uint32 key; /* key sym */ uint32 state; /* key state change */ }; typedef struct mouse_event SIM_MOUSE_EVENT; typedef struct key_event SIM_KEY_EVENT; t_stat vid_open (DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags); #define SIM_VID_INPUTCAPTURED 1 /* Mouse and Keyboard input captured (calling */ /* code responsible for cursor display in video) */ typedef void (*VID_QUIT_CALLBACK)(void); t_stat vid_register_quit_callback (VID_QUIT_CALLBACK callback); t_stat vid_close (void); t_stat vid_poll_kb (SIM_KEY_EVENT *ev); t_stat vid_poll_mouse (SIM_MOUSE_EVENT *ev); uint32 vid_map_rgb (uint8 r, uint8 g, uint8 b); void vid_draw (int32 x, int32 y, int32 w, int32 h, uint32 *buf); void vid_beep (void); void vid_refresh (void); const char *vid_version (void); const char *vid_key_name (int32 key); t_stat vid_set_cursor (t_bool visible, uint32 width, uint32 height, uint8 *data, uint8 *mask, uint32 hot_x, uint32 hot_y); t_stat vid_set_release_key (FILE* st, UNIT* uptr, int32 val, CONST void* desc); t_stat vid_show_release_key (FILE* st, UNIT* uptr, int32 val, CONST void* desc); t_stat vid_show_video (FILE* st, UNIT* uptr, int32 val, CONST void* desc); t_stat vid_show (FILE* st, DEVICE *dptr, UNIT* uptr, int32 val, CONST char* desc); t_stat vid_screenshot (const char *filename); | > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > | 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 | #define SIM_KEY_KP_5 101 #define SIM_KEY_KP_ENTER 102 #define SIM_KEY_KP_MULTIPLY 103 #define SIM_KEY_KP_DIVIDE 104 #define SIM_KEY_UNKNOWN 200 #define SIM_ALPHA_NONE 1 #define SIM_ALPHA_BLEND 2 #define SIM_ALPHA_ADD 3 #define SIM_ALPHA_MOD 4 typedef struct VID_DISPLAY VID_DISPLAY; struct mouse_event { int32 x_rel; /* X axis relative motion */ int32 y_rel; /* Y axis relative motion */ int32 x_pos; /* X axis position */ int32 y_pos; /* Y axis position */ t_bool b1_state; /* state of button 1 */ t_bool b2_state; /* state of button 2 */ t_bool b3_state; /* state of button 3 */ DEVICE *dev; /* which device */ VID_DISPLAY *vptr; /* which display */ }; struct key_event { uint32 key; /* key sym */ uint32 state; /* key state change */ DEVICE *dev; /* which device */ VID_DISPLAY *vptr; /* which display */ }; typedef struct mouse_event SIM_MOUSE_EVENT; typedef struct key_event SIM_KEY_EVENT; t_stat vid_open (DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags); #define SIM_VID_INPUTCAPTURED 1 /* Mouse and Keyboard input captured (calling */ /* code responsible for cursor display in video) */ typedef void (*VID_QUIT_CALLBACK)(void); t_stat vid_register_quit_callback (VID_QUIT_CALLBACK callback); typedef void (*VID_GAMEPAD_CALLBACK)(int, int, int); t_stat vid_register_gamepad_motion_callback (VID_GAMEPAD_CALLBACK); t_stat vid_register_gamepad_button_callback (VID_GAMEPAD_CALLBACK); t_stat vid_close (void); t_stat vid_poll_kb (SIM_KEY_EVENT *ev); t_stat vid_poll_mouse (SIM_MOUSE_EVENT *ev); uint32 vid_map_rgb (uint8 r, uint8 g, uint8 b); void vid_draw (int32 x, int32 y, int32 w, int32 h, uint32 *buf); void vid_beep (void); void vid_refresh (void); const char *vid_version (void); const char *vid_key_name (int32 key); t_stat vid_set_cursor (t_bool visible, uint32 width, uint32 height, uint8 *data, uint8 *mask, uint32 hot_x, uint32 hot_y); t_stat vid_set_release_key (FILE* st, UNIT* uptr, int32 val, CONST void* desc); t_stat vid_show_release_key (FILE* st, UNIT* uptr, int32 val, CONST void* desc); t_stat vid_show_video (FILE* st, UNIT* uptr, int32 val, CONST void* desc); t_stat vid_show (FILE* st, DEVICE *dptr, UNIT* uptr, int32 val, CONST char* desc); t_stat vid_screenshot (const char *filename); t_bool vid_is_fullscreen (void); t_stat vid_set_fullscreen (t_bool flag); extern int vid_active; void vid_set_cursor_position (int32 x, int32 y); /* cursor position (set by calling code) */ t_stat vid_open_window (VID_DISPLAY **vptr, DEVICE *dptr, const char *title, uint32 width, uint32 height, int flags); t_stat vid_close_window (VID_DISPLAY *vptr); t_stat vid_close_all (void); uint32 vid_map_rgb_window (VID_DISPLAY *vptr, uint8 r, uint8 g, uint8 b); uint32 vid_map_rgba_window (VID_DISPLAY *vptr, uint8 r, uint8 g, uint8 b, uint8 a); void vid_draw_window (VID_DISPLAY *vptr, int32 x, int32 y, int32 w, int32 h, uint32 *buf); void vid_refresh_window (VID_DISPLAY *vptr); t_stat vid_set_cursor_window (VID_DISPLAY *vptr, t_bool visible, uint32 width, uint32 height, uint8 *data, uint8 *mask, uint32 hot_x, uint32 hot_y); t_bool vid_is_fullscreen_window (VID_DISPLAY *vptr); t_stat vid_set_fullscreen_window (VID_DISPLAY *vptr, t_bool flag); void vid_set_cursor_position_window (VID_DISPLAY *vptr, int32 x, int32 y); /* cursor position (set by calling code) */ t_stat vid_set_alpha_mode (VID_DISPLAY *vptr, int mode); /* A device simulator can optionally set the vid_display_kb_event_process * routine pointer to the address of a routine. * Simulator code which uses the display library which processes window * keyboard data with code in display/sim_ws.c can use this routine to * explicitly get access to keyboard events that arrive in the display * window. This routine should return 0 if it has handled the event that |
︙ | ︙ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | # PDP-8 ADVENTURE This is a copy of the [latest upstream release][up], v2.4. Prior releases are [curated separately][alive] as part of [Bill Cattey’s PDP-8 Alive project](https://poetnerd.com/pdp8-alive/). This version of Adventure was orginally written by Rick Murphy when he worked at Digital back in 1979 and published as DECUS 8-889. (Back then he went by Dick, instead of Rick.) Instructions on running ADVENT under the FORTRAN IV Runtime System, `FRTS`, can be found in the text file [`ADVENT.DC`][doc]. [alive]: https://poetnerd.com/pdp8-alive/advent/timeline [doc]: https://tangentsoft.com/pidp8i/doc/trunk/src/advent/ADVENT.DC?mimetype=text/plain [up]: https://www.rickmurphy.net/advent/ ## Original DECUS Writeup: ### Adventure 8-889 *Version*: February 1979 *Author*: Dick Murphy, Digital Equipment Corporation *Operating System*: OS/8 V3C, V3D; OS/12 *Source Language*: FORTRAN IV, RALF *Memory Required*: 32KW *Keywords*: Games *Abstract*: Adventure is a magical, unpredictable and often addicting computer game that has caught on in the United States in near epidemic proportions. It is a treasure hunt with all the trimmings - mysteries and challenges that grow more and more complex as the game unravels. Adventure is more of a puzzle than a game. Once solved, it's mastered. The mastering, however, often takes months of drawing maps and planning strategy. Adventure's sweeping popularity lies in it's power to enchant. Players are projected into a world of fantasy, one that blends the heart pounding suspense of "Treasure Island" with the magic of "Alice in Wonderland". *Note*: This is a version of the popular PDP-11 Adventure game (DECUS No. 11-340), containing all the features, but modified to run on a PDP-8. *Documentation on magnetic media.* *Media Service Charge Code*: Write-Up (AA), DECtape (HA), Floppy Diskette (KB) *Format*: OS/8 *Catalog*: June 1985 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | / SUBROUTINE A5TOA1(A,B,D) /(pdp11:)SUBROUTINE A5TOA1(A,B,C,D) / / THIS ROUTINE TAKES THE UP TO 6 CHARACTER "WORD" IN A:B:C / AND TYPES IT OUT, FOLLOWED BY THE PUNCTUATION MARK IN D. / IT ALSO APPENDS A CRLF TO GET TO A NEW LINE. / For OS/8: the word is in A,B with nothing in C. / / IMPLICIT INTEGER (A-Z) / COMMON /ALPHAS/ BLANK EXTERN SIXOUT EXTERN CGET EXTERN CPUT SECT A5TOA1 JA #ST #XR, ORG .+10 TEXT +A5TOA1+ #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+6 A, ORG .+3 B, ORG .+3 D, ORG .+3 BLANK, TEXT + + ZERO, F 0 THREE, F 3 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 #RTN, BASE #BASE JA #GOBAK FIVE, F 5 SEVEN, F 7 #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA A FLDA% #BASE,1+ FSTA B FLDA% #BASE,1+ FSTA D STARTF FLDA% A FSTA A FLDA% B FSTA B FLDA% D FSTA D / IF (A .NE. BLANK) TYPE 1,A FLDA A FSUB BLANK JEQ #G0001 JSR TRIM JA .+4 JA A JSR SIXOUT JA .+10 JA A JA ZERO JA SEVEN / IF (B .NE. BLANK) TYPE 1,B #G0001, FLDA B FSUB BLANK JEQ #G0002 JSR TRIM JA .+4 JA B JSR SIXOUT JA .+10 JA B JA ZERO JA SEVEN / IF (C .NE. BLANK) TYPE 1,C / TYPE 2,D #G0002, JSR TRIM JA .+4 JA D JSR SIXOUT JA #RTN JA D JA ZERO JA FIVE / RETURN / END /1 FORMAT('+',A2,$) /2 FORMAT('+',A2) SECT TRIM JA #TST #TXR, ORG .+10 TEXT +TRIM + #TRET, SETX #TXR SETB #TBASE JA .+3 #TBASE, ORG .+6 PSTR, ORG .+3 I, ORG .+3 CH, ORG .+3 K1, F 1 K6, F 6 K32, F 32 ORG #TBASE+30 FNOP JA #TRET FNOP #TGOBK, 0;0 #TRTN, BASE #TBASE JA #TGOBK #TST, STARTD 0210 FSTA #TGOBK,0 0200 SETX #TXR SETB #TBASE LDX 0,1 FSTA #TBASE FLDA% #TBASE,1+ FSTA PSTR STARTF FLDA K6 FSTA I #T10, FLDA PSTR STARTD FSTA #TG001 FSTA #TG002 STARTF JSR CGET JA .+0010 #TG001, JA . JA I JA CH FLDA CH FSUB K32 JNE #TRTN JSR CPUT JA .+0010 #TG002, JA . JA I JA ZERO FLDA I FSUB K1 FSTA I JGT #T10 JA #TRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | This version of adventure is based on the RT-11 version by Bob Supnik. It is essentially a recoding of the FORTRAN-IV sources into RALF code. The RALF code has been optimized to fit into 32K. Also, many modifications were made to the code to increase execution speed. Because it is based on the RT-11 version of ADVENTURE, the following features of the FORTRAN-10 version are not supported: 1) MAGIC mode was removed 2) The SUSPEND and HOURS commands were deleted The program requires a secondary storage device with at least 250 blocks of free space for working storage. Included with the sources are batch stream files for compiling and loading the program. COMPILATION: .SUBMIT COMPILE LOADING: .SUBMIT LOAD (this creates a load map - LOAD.LS) EXECUTION: .R FRTS *ADVENT.LD (the ".LD" is optional) *$ (altmode or escape) execution proceeds. When the program is first started, it prompts for the locations of database files: Location of text database (ATEXT.DA) > Location of text index (AINDX.DA) > Location of saved games (ASAVE.DA) > Location of text input (ADVENT.TX) > The value in parenthesis is the default values for those files. You can place files on other than the current SYS device by giving the device name and filename, such as RKB0:ADVENT.TX, etc. See the section below on the ADVENT.IN file for more information on how to place the database files. When first started, the program will take approximately two to three minutes to set up its data base (ATEXT and AINDX). Initialization and execution can be optimized by placing the data file (DATA) on a different device from the text file (ADVENT.TX). Also, it is more efficient to have the load module (ADVENT.LD) on a different device than the data file (DATA). For a two-drive DECtape system, for example, put ADVENT.LD and ADVENT.TX on SYS:, and have the database files written on DTA1:. i.e. .R FRTS *ADVENT Location of text database (ATEXT.DA) > DTA1:ATEXT.DA Location of text index (AINDX.DA) > DTA1:AINDX.DA Location of saved games (ASAVE.DA) > ASAVE.DA Location of text input (ADVENT.TX) > ADVENT.TX The ADVENT.TX file is only used to set up the text database. Once the ATEXT.DA and AINDX.DA files have been built, you can delete this file as it is not needed for normal program operation. The file locataion values given during this startup dialog are stored in a file called ADVENT.IN, which is a simple text file with KEYWORD=VALUE lines for the four filenames. You can edit this later to move the files to other devices, or delete the ADVENT.IN file to completely restart the dialog. To run the program, only the files ADVENT.LD and ADVENT.TX need to be copied from the distribution tape. These are the load module and the text file. The rest of the files are sources. The SAVE command in Adventure writes the ASAVE.DA file. If the file already exists, it is overwritten by subsequent SAVE operations. A saved game is restored using the RESTORE command. Good luck and happy adventuring! |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | C ADVENTURES C C MODIFIED BY KENT BLACKETT C ENGINEERING SYSTEMS GROUP C DIGITAL EQUIPMENT CORP. C 15-JUL-77 C MODIFIED BY BOB SUPNIK C DISK ENGINEERING C 21-OCT-77 C MODIFIED BY BOB SUPNIK C DISK ENGINEERING C 25-AUG-78 C MODIFIED BY BOB SUPNIK C SMALL SYSTEMS C 12-NOV-78 C ORIGINAL VERSION WAS FOR DECSYSTEM-10 C NEXT VERSION WAS FOR FORTRAN IV-PLUS UNDER C THE IAS OPERATING SYSTEM ON THE PDP-11/70 C THIS VERSION IS FOR FORTRAN IV (V01C OR LATER) C UNDER RT-11 ON *ANY* PDP-11 C C C CURRENT LIMITS: C 750 TRAVEL OPTIONS (TRAVEL, TRVSIZ). C 300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). C 150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ). C 100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP). C 35 "ACTION" VERBS (ACTSPK, VRBSIZ). C 205 RANDOM MESSAGES (RTEXT, RTXSIZ). C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ). C THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF C THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE, C SO THERE CAN'T BE MORE THAN 1000 WORDS.) THESE UPPER LIMITS ARE: C 1000 NON-SYNONYMOUS VOCABULARY WORDS C 300 LOCATIONS C 100 OBJECTS C C IMPLICIT INTEGER (A-Z) LOGICAL LMWARN,CLOSNG,PANIC,HINTED, 1 CLOSED,GAVEUP,SCORNG,DSEEN,BITSET C COMMON /VERSN/ VMAJ, VMIN, VEDIT COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA COMMON /VOCCOM/ KTAB,ATAB,TABSIZ COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG COMMON /PTXCOM/ PTEXT COMMON /ABBCOM/ ABB COMMON /MISCOM/ LINUSE,TRVS,CLSSES,OLDLOC,LOC,CVAL,TK,NEWLOC, 1 KEY,PLAC,FIXD,ACTSPK,COND,HINTS,HNTMAX,PROP,TALLY,TALLY2, 2 HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,LAMP,GRATE COMMON /MISCOM/ 3 CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET, 4 CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE,WATER,OIL,PLANT, 5 PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND, 6 BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM COMMON /MISCOM/ 7 PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK, 8 THROW,FIND,INVENT,TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM, 9 NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2, 1 CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG,ODLOC,STREAM,SPICES COMMON /MISC2/ I,RTXSIZ,CLSMAX,LOCSIZ,CTEXT,STEXT,LTEXT, 1 SECT,TRAVEL,TRVCON,TRVLOC,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ, 2 MAXTRS,HINTED,HNTLOC,KK C INTEGER LINES(12),DATA(52),RECORD C The TRAVEL, TRVCON, and TRVLOC arrays are C Packed with words 0,1,2 holding the data. Saves lots C of wasted space at the expense of some complexity. INTEGER TRAVEL(250), TRVCON(250), TRVLOC(250), TRVSIZ INTEGER KTAB(300),ATAB(300),TABSIZ INTEGER LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150), 1 ATLOC(150) INTEGER PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200), 1 PTEXT(100),PROP(100),HOLDNG INTEGER ACTSPK(35) INTEGER RTEXT(205) INTEGER CTEXT(12),CVAL(12) INTEGER HINTLC(20),HINTS(20,4) DIMENSION HINTED(20) INTEGER TK(20),DLOC(6),ODLOC(6) DIMENSION DSEEN(6) INTEGER ASCVAR, TXTLOC, TRVS, CLSSES, OLDLOC INTEGER HNTSIZ, HNTMAX, TALLY, TALLY2, CHLOC, CHLOC2, DFLAG INTEGER DALTLC,GRATE,CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE INTEGER FISSUR,TABLET,CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE INTEGER WATER,OIL,PLANT,PLANT2,AXE,MIRROR,DRAGON,CHASM INTEGER BEAR,MESSAG,VEND,BATTER,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD INTEGER PYRAM,PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY INTEGER LOCK,THROW,FIND,INVENT,TURNS,KNFLOC,DETAIL,ABBNUM INTEGER NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2 INTEGER TROLL,TROLL2,STREAM,SPICES INTEGER RTXSIZ,CLSMAX,LOCSIZ,SECT,TABNDX,OBJ INTEGER VERB,HNTLOC,KK C C INTEGER VMAJ, VMIN, VEDIT DATA VMAJ/2/,VMIN/0/,VEDIT/'A'/ CALL SETIDL CALL INIT CDEBUG WRITE(4,1) CDEBUG1 FORMAT(' INIT DONE') CALL AMAIN CALL EXIT END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 | 1 1,Y]OU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING. 1,A]ROUND YOU IS A FOREST. [A] SMALL STREAM FLOWS OUT OF THE BUILDING AND 1,]DOWN A GULLY. 2,Y]OU HAVE WALKED UP A HILL, STILL IN THE FOREST. [T]HE ROAD SLOPES BACK 2,]DOWN THE OTHER SIDE OF THE HILL. [T]HERE IS A BUILDING IN THE DISTANCE. 3,Y]OU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING. 4,Y]OU ARE IN A VALLEY IN THE FOREST BESIDE A STREAM TUMBLING ALONG A 4,]ROCKY BED. 5,Y]OU ARE IN OPEN FOREST, WITH A DEEP VALLEY TO ONE SIDE. 6,Y]OU ARE IN OPEN FOREST NEAR BOTH A VALLEY AND A ROAD. 7,A]T YOUR FEET ALL THE WATER OF THE STREAM SPLASHES INTO A 2-INCH SLIT 7,]IN THE ROCK. [D]OWNSTREAM THE STREAMBED IS BARE ROCK. 8,Y]OU ARE IN A 20-FOOT DEPRESSION FLOORED WITH BARE DIRT. [S]ET INTO THE 8,]DIRT IS A STRONG STEEL GRATE MOUNTED IN CONCRETE. [A] DRY STREAMBED 8,]LEADS INTO THE DEPRESSION. 9,Y]OU ARE IN A SMALL CHAMBER BENEATH A 3X3 STEEL GRATE TO THE SURFACE. 9,A] LOW CRAWL OVER COBBLES LEADS INWARD TO THE WEST. 10,Y]OU ARE CRAWLING OVER COBBLES IN A LOW PASSAGE. [T]HERE IS A DIM LIGHT 10,]AT THE EAST END OF THE PASSAGE. 11,Y]OU ARE IN A DEBRIS ROOM FILLED WITH STUFF WASHED IN FROM THE SURFACE. 11,A] LOW WIDE PASSAGE WITH COBBLES BECOMES PLUGGED WITH MUD AND DEBRIS 11,]HERE, BUT AN AWKWARD CANYON LEADS UPWARD AND WEST. [A] NOTE ON THE WALL 11,]SAYS "[MAGIC WORD XYZZY". 12,Y]OU ARE IN AN AWKWARD SLOPING EAST/WEST CANYON. 13,Y]OU ARE IN A SPLENDID CHAMBER THIRTY FEET HIGH. [T]HE WALLS ARE FROZEN 13,]RIVERS OF ORANGE STONE. [A]N AWKWARD CANYON AND A GOOD PASSAGE EXIT 13,]FROM EAST AND WEST SIDES OF THE CHAMBER. 14,A]T YOUR FEET IS A SMALL PIT BREATHING TRACES OF WHITE MIST. [A]N EAST 14,]PASSAGE ENDS HERE EXCEPT FOR A SMALL CRACK LEADING ON. 15,Y]OU ARE AT ONE END OF A VAST HALL STRETCHING FORWARD OUT OF SIGHT TO 15,]THE WEST. [T]HERE ARE OPENINGS TO EITHER SIDE. [N]EARBY, A WIDE STONE 15,]STAIRCASE LEADS DOWNWARD. [T]HE HALL IS FILLED WITH WISPS OF WHITE MIST 15,]SWAYING TO AND FRO ALMOST AS IF ALIVE. [A] COLD WIND BLOWS UP THE 15,]STAIRCASE. [T]HERE IS A PASSAGE AT THE TOP OF A DOME BEHIND YOU. 16,T]HE CRACK IS FAR TOO SMALL FOR YOU TO FOLLOW. 17,Y]OU ARE ON THE EAST BANK OF A FISSURE SLICING CLEAR ACROSS THE HALL. 17,T]HE MIST IS QUITE THICK HERE, AND THE FISSURE IS TOO WIDE TO JUMP. 18,T]HIS IS A LOW ROOM WITH A CRUDE NOTE ON THE WALL. [T]HE NOTE SAYS, 18,"Y]OU WON'T GET IT UP THE STEPS". 19,Y]OU ARE IN THE [H]ALL OF THE [M]OUNTAIN [K]ING, WITH PASSAGES OFF IN 19,]ALL DIRECTIONS. 20,Y]OU ARE AT THE BOTTOM OF THE PIT WITH A BROKEN NECK. 21,Y]OU DIDN'T MAKE IT. 22,T]HE DOME IS UNCLIMBABLE. 23,Y]OU ARE AT THE WEST END OF THE [T]WOPIT [R]OOM. [T]HERE IS A LARGE 23,]HOLE IN THE WALL ABOVE THE PIT AT THIS END OF THE ROOM. 24,Y]OU ARE AT THE BOTTOM OF THE EASTERN PIT IN THE [T]WOPIT [R]OOM. 24,T]HERE IS A SMALL POOL OF OIL IN ONE CORNER OF THE PIT. 25,Y]OU ARE AT THE BOTTOM OF THE WESTERN PIT IN THE [T]WOPIT [R]OOM. 25,T]HERE IS A LARGE HOLE IN THE WALL ABOUT 25 FEET ABOVE YOU. 26,Y]OU CLAMBER UP THE PLANT AND SCURRY THROUGH THE HOLE AT THE TOP. 27,Y]OU ARE ON THE WEST SIDE OF THE FISSURE IN THE [H]ALL OF [M]ISTS. 28,Y]OU ARE IN A LOW NORTH/SOUTH PASSAGE AT A HOLE IN THE FLOOR. [T]HE 28,]HOLE GOES DOWN TO AN EAST/WEST PASSAGE. 29,Y]OU ARE IN THE SOUTH SIDE CHAMBER. 30,Y]OU ARE IN THE WEST SIDE CHAMBER OF THE HALL OF THE [M]OUNTAIN [K]ING. 30,A] PASSAGE CONTINUES WEST AND UP HERE. 31,>$< 32,Y]OU CAN'T GET BY THE SNAKE. 33,Y]OU ARE IN A LARGE ROOM, WITH A PASSAGE TO THE SOUTH, A PASSAGE TO THE 33,]WEST, AND A WALL OF BROKEN ROCK TO THE EAST. [T]HERE IS A LARGE "[Y2]" 33,]ON A ROCK IN THE ROOM'S CENTER. 34,Y]OU ARE IN A JUMBLE OF ROCK, WITH CRACKS EVERYWHERE. 35,Y]OU'RE AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHICH EXTENDS UP OUT OF 35,]SIGHT. [A] FLOOR IS INDISTINCTLY VISIBLE OVER 50 FEET BELOW. [T]RACES 35,]OF WHITE MIST COVER THE FLOOR OF THE PIT,BECOMING THICKER TO THE RIGHT. 35,M]ARKS IN THE DUST AROUND THE WINDOW WOULD SEEM TO INDICATE THAT 35,]SOMEONE HAS BEEN HERE RECENTLY. [D]IRECTLY ACROSS THE PIT FROM YOU AND 35,]25 FEET AWAY THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM. 35,A ]SHADOWY FIGURE CAN BE SEEN THERE PEERING BACK AT YOU. 36,Y]OU ARE IN A DIRTY BROKEN PASSAGE. [T]O THE EAST IS A CRAWL. [T]O THE 36,]WEST IS A LARGE PASSAGE. [A]BOVE YOU IS A HOLE TO ANOTHER PASSAGE. 37,Y]OU ARE ON THE BRINK OF A SMALL CLEAN CLIMBABLE PIT. [A] CRAWL LEADS 37,]WEST. 38,Y]OU ARE IN THE BOTTOM OF A SMALL PIT WITH A LITTLE STREAM, WHICH 38,]ENTERS AND EXITS THROUGH TINY SLITS. 39,Y]OU ARE IN A LARGE ROOM FULL OF DUSTY ROCKS. [T]HERE IS A BIG HOLE IN 39,]THE FLOOR. [T]HERE ARE CRACKS EVERYWHERE, AND A PASSAGE LEADING EAST. 40,Y]OU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE PARALLEL TO AND NORTH 40,]OF THE [H]ALL OF [M]ISTS. 41,Y]OU ARE AT THE WEST END OF THE [H]ALL OF [M]ISTS. [A] LOW WIDE CRAWL 41,]CONTINUES WEST AND ANOTHER GOES NORTH. [T]O THE SOUTH IS A LITTLE 41,]PASSAGE 6 FEET OFF THE FLOOR. 42,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 43,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 44,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 45,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 46,D]EAD END! 47,D]EAD END! 48,D]EAD END! 49,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 50,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 51,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 52,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 53,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 54,D]EAD END! 55,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 56,D]EAD END! 57,Y]OU ARE ON THE BRINK OF A THIRTY FOOT PIT WITH A MASSIVE ORANGE COLUMN 57,]DOWN ONE WALL. [Y]OU COULD CLIMB DOWN HERE BUT YOU COULD NOT GET BACK 57,]UP. [T]HE MAZE CONTINUES AT THIS LEVEL. 58,D]EAD END! 59,Y]OU HAVE CRAWLED THROUGH A VERY LOW WIDE PASSAGE PARALLEL TO AND NORTH 59,]OF THE [H]ALL OF [M]ISTS. 60,Y]OU ARE AT THE EAST END OF A VERY LONG HALL APPARENTLY WITHOUT SIDE 60,]CHAMBERS. [T]O THE EAST A LOW WIDE CRAWL SLANTS UP. [T]O THE NORTH A 60,]ROUND TWO FOOT HOLE SLANTS DOWN. 61,Y]OU ARE AT THE WEST END OF A VERY LONG FEATURELESS HALL. [T]HE HALL 61,]JOINS UP WITH A NARROW NORTH/SOUTH PASSAGE. 62,Y]OU ARE AT A CROSSOVER OF A HIGH NORTH/SOUTH PASSAGE AND A LOW 62,]EAST/WEST ONE. 63,D]EAD END! 64,Y]OU ARE AT A COMPLEX JUNCTION. [A] LOW HANDS AND KNEES PASSAGE FROM 64,]THE NORTH JOINS A HIGHER CRAWL FROM THE EAST TO MAKE A WALKING 64,]PASSAGE GOING WEST. [T]HERE IS ALSO A LARGE ROOM ABOVE. [T]HE AIR 64,]IS DAMP HERE. 65,Y]OU ARE IN [B]EDQUILT, A LONG EAST/WEST PASSAGE WITH HOLES EVERYWHERE. 65,T]O EXPLORE AT RANDOM SELECT NORTH, SOUTH, UP, OR DOWN. 66,Y]OU ARE IN A ROOM WHOSE WALLS RESEMBLE [S]WISS CHEESE. [O]BVIOUS 66,]PASSAGES GO WEST, EAST, NORTHEAST, AND NORTHWEST. [P]ART OF THE ROOM 66,]IS OCCUPIED BY A LARGE BEDROCK BLOCK. 67,Y]OU ARE AT THE EAST END OF THE [T]WOPIT [R]OOM. [T]HE FLOOR HERE IS 67,]LITTERED WITH THIN ROCK SLABS, WHICH MAKE IT EASY TO DESCEND THE PITS. 67,]THERE IS A PATH HERE BYPASSING THE PITS TO CONNECT PASSAGES FROM EAST 67,]AND WEST. [T]HERE ARE HOLES ALL OVER, BUT THE ONLY BIG ONE IS ON THE 67,]WALL DIRECTLY OVER THE WEST PIT WHERE YOU CAN'T GET TO IT. 68,Y]OU ARE IN A LARGE LOW CIRCULAR CHAMBER WHOSE FLOOR IS AN IMMENSE SLAB 68,]FALLEN FROM THE CEILING ([S]LAB [R]OOM). [E]AST AND WEST THERE ONCE 68,]WERE LARGE PASSAGES, BUT THEY ARE NOW FILLED WITH BOULDERS. [L]OW SMALL 68,]PASSAGES GO NORTH AND SOUTH, AND THE SOUTH ONE QUICKLY BENDS WEST 68,]AROUND THE BOULDERS. 69,Y]OU ARE IN A SECRET NORTH/SOUTH CANYON ABOVE A LARGE ROOM. 70,Y]OU ARE IN A SECRET NORTH/SOUTH CANYON ABOVE A SIZABLE PASSAGE. 71,Y]OU ARE IN A SECRET CANYON AT A JUNCTION OF THREE CANYONS, BEARING 71,]NORTH, SOUTH, AND SOUTHEAST. [T]HE NORTH ONE IS AS TALL AS THE OTHER 71,]TWO COMBINED. 72,Y]OU ARE IN A LARGE LOW ROOM. [C]RAWLS LEAD NORTH, SOUTHEAST, AND 72,]AND SOUTHWEST. 73,D]EAD END CRAWL. 74,Y]OU ARE IN A SECRET CANYON WHICH HERE RUNS EAST/WEST. [I]T CROSSES 74,]OVER A VERY TIGHT CANYON 15 FEET BELOW. [I]F YOU GO DOWN YOU MAY NOT 74,]BE ABLE TO GET BACK UP. 75,Y]OU ARE AT A WIDE PLACE IN A VERY TIGHT NORTH/SOUTH CANYON. 76,T]HE CANYON HERE BECOMES TOO TIGHT TO GO FURTHER SOUTH. 77,Y]OU ARE IN A TALL EAST/WEST CANYON. [A] LOW TIGHT CRAWL GOES 3 FEET 77,]NORTH AND SEEMS TO OPEN UP. 78,T]HE CANYON RUNS INTO A MASS OF BOULDERS -- DEAD END. 79,T]HE STREAM FLOWS OUT THROUGH A PAIR OF 1 FOOT DIAMETER SEWER PIPES. 79,I]T WOULD BE ADVISABLE TO USE THE EXIT. 80,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 81,D]EAD END! 82,D]EAD END! 83,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 84,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 85,D]EAD END! 86,D]EAD END! 87,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE. 88,Y]OU ARE IN A LONG, NARROW CORRIDOR STRETCHING OUT OF SIGHT TO THE 88,]WEST. AT THE EASTERN END IS A HOLE THROUGH WHICH YOU CAN SEE A 88,]PROFUSION OF LEAVES. 89,T]HERE IS NOTHING HERE TO CLIMB. [U]SE "UP" OR "OUT" TO LEAVE THE PIT. 90,Y]OU HAVE CLIMBED UP THE PLANT AND OUT OF THE PIT. 91,Y]OU ARE AT THE TOP OF A STEEP INCLINE ABOVE A LARGE ROOM. [Y]OU COULD 91,]CLIMB DOWN HERE, BUT YOU WOULD NOT BE ABLE TO CLIMB UP. [T]HERE IS A 91,]PASSAGE LEADING BACK TO THE NORTH. 92,Y]OU ARE IN THE GIANT ROOM. [T]HE CEILING HERE IS TOO HIGH UP FOR YOUR 92,]LAMP TO SHOW IT. [C]AVERNOUS PASSAGES LEAD EAST, NORTH, AND SOUTH. 92,]ON THE WALL IS SCRAWLED THE INSCRIPTION, "[FEE FIE FOE FOO]" (SIC). 93,T]HE PASSAGE HERE IS BLOCKED BY A RECENT CAVE-IN. 94,Y]OU ARE AT ONE END OF AN IMMENSE NORTH/SOUTH PASSAGE. 95,Y]OU ARE IN A MAGNIFICENT CAVERN WITH A RUSHING STREAM, WHICH CASCADES 95,]OVER A SPARKLING WATERFALL INTO A ROARING WHIRLPOOL WHICH DISAPPEARS 95,]THROUGH A HOLE IN THE FLOOR. [P]ASSAGES EXIT TO THE SOUTH AND WEST. 96,Y]OU ARE IN THE [S]OFT [R]OOM. [T]HE WALLS ARE COVERED WITH HEAVY 96,]CURTAINS,THE FLOOR WITH A THICK PILE CARPET.[M]OSS COVERS THE CEILING. 97,T]HIS IS THE [O]RIENTAL ROOM. [A]NCIENT ORIENTAL CAVE DRAWINGS COVER THE 97,]WALLS. [A] GENTLY SLOPING PASSAGE LEADS UPWARD TO THE NORTH, ANOTHER 97,]PASSAGE LEADS SOUTHEAST, AND A HANDS AND KNEES CRAWL LEADS WEST. 98,Y]OU ARE FOLLOWING A WIDE PATH AROUND THE OUTER EDGE OF A LARGE CAVERN. 98,F]AR BELOW, THROUGH A HEAVY WHITE MIST, STRANGE SPLASHING NOISES CAN BE 98,]HEARD. [T]HE MIST RISES UP THROUGH A FISSURE IN THE CEILING. [T]HE 98,]PATH EXITS TO THE SOUTH AND WEST. 99,Y]OU ARE IN AN ALCOVE. [A] SMALL NORTHWEST PATH SEEMS TO WIDEN AFTER 99,]SHORT DISTANCE. [A]N EXTREMELY TIGHT TUNNEL LEADS EAST. [I]T LOOKS LIKE 99,]A VERY TIGHT SQUEEZE. [A]N EERIE LIGHT CAN BE SEEN AT THE OTHER END. 100,Y]OU'RE IN A SMALL CHAMBER LIT BY AN EERIE GREEN LIGHT. [A]N EXTREMELY 100,]NARROW TUNNEL EXITS TO THE WEST. [A] DARK CORRIDOR LEADS NORTHEAST. 101,Y]OU'RE IN THE [D]ARK [R]OOM. [A] CORRIDOR LEADING SOUTH IS THE ONLY 101,]EXIT. 102,Y]OU ARE IN AN ARCHED HALL.[A] CORAL PASSAGE ONCE CONTINUED UP AND EAST 102,]FROM HERE, BUT IS NOW BLOCKED BY DEBRIS.[T]HE AIR SMELLS OF SEA WATER. 103,Y]OU'RE IN A LARGE ROOM CARVED OUT OF SEDIMENTARY ROCK. [T]HE FLOOR AND 103,]WALLS ARE LITTERED WITH BITS OF SHELLS IMBEDDED IN THE STONE. [A] 103,]SHALLOW PASSAGE PROCEEDS DOWNWARD, AND A SOMEWHAT STEEPER ONE LEADS 103,]UP. [A] LOW HANDS AND KNEES PASSAGE ENTERS FROM THE SOUTH. 104,Y]OU ARE IN A LONG SLOPING CORRIDOR WITH RAGGED SHARP WALLS. 105,Y]OU ARE IN A CUL-DE-SAC ABOUT EIGHT FEET ACROSS. 106,Y]OU ARE IN AN ANTEROOM LEADING TO A LARGE PASSAGE TO THE EAST. [S]MALL 106,]PASSAGES GO WEST AND UP. [T]HE REMNANTS OF RECENT DIGGING ARE EVIDENT. 106,A] SIGN IN MIDAIR HERE SAYS "[C]AVE UNDER CONSTRUCTION BEYOND THIS 106,]POINT. [P]ROCEED AT OWN RISK. ([W]ITT [C]ONSTRUCTION [C]OMPANY)" 107,Y]OU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL DIFFERENT. 108,Y]OU ARE AT [W]ITT'S [E]ND. [P]ASSAGES LEAD OFF IN [ALL] DIRECTIONS. 109,Y]OU ARE IN A NORTH/SOUTH CANYON ABOUT 25 FEET ACROSS. [T]HE FLOOR IS 109,]COVERED BY WHITE MIST SEEPING IN FROM THE NORTH. [T]HE WALLS EXTEND 109,]UPWARD FOR WELL OVER 100 FEET. [S]USPENDED FROM SOME UNSEEN POINT FAR 109,]ABOVE YOU, AN ENORMOUS TWO-SIDED MIRROR IS HANGING PARALLEL TO AND 109,]MIDWAY BETWEEN THE CANYON WALLS. ([T]HE MIRROR IS OBVIOUSLY PROVIDED 109,]FOR THE USE OF THE DWARVES, WHO AS YOU KNOW, ARE EXTREMELY VAIN.) [A] 109,]SMALL WINDOW CAN BE SEEN IN EITHER WALL, SOME FIFTY FEET UP. 110,Y]OU'RE AT A LOW WINDOW OVERLOOKING A HUGE PIT, WHICH EXTENDS UP OUT OF 110,]SIGHT. [A] FLOOR IS INDISTINCTLY VISIBLE OVER 50 FEET BELOW. [T]RACES 110,]OF WHITE MIST COVER THE FLOOR OF THE PIT,BECOMING THICKER TO THE LEFT. 110,M]ARKS IN THE DUST AROUND THE WINDOW WOULD SEEM TO INDICATE THAT 110,]SOMEONE HAS BEEN HERE RECENTLY. [D]IRECTLY ACROSS THE PIT FROM YOU AND 110,25 ]FEET AWAY THERE IS A SIMILAR WINDOW LOOKING INTO A LIGHTED ROOM. 110,A] SHADOWY FIGURE CAN BE SEEN THERE PEERING BACK AT YOU. 111,A] LARGE STALACTITE EXTENDS FROM THE ROOF AND ALMOST REACHES THE FLOOR 111,]BELOW. [Y]OU COULD CLIMB DOWN IT, AND JUMP FROM IT TO THE FLOOR, BUT 111,]HAVING DONE SO YOU WOULD BE UNABLE TO REACH IT TO CLIMB BACK UP. 112,Y]OU ARE IN A LITTLE MAZE OF TWISTING PASSAGES, ALL DIFFERENT. 113,Y]OU ARE AT THE EDGE OF A LARGE UNDERGROUND RESERVOIR. [A]N OPAQUE 113,]CLOUD OF WHITE MIST FILLS THE ROOM AND RISES RAPIDLY UPWARD. [T]HE 113,]LAKE IS FED BY A STREAM, WHICH TUMBLES OUT OF A HOLE IN THE WALL ABOUT 113,10 ]FEET OVERHEAD AND SPLASHES NOISILY INTO THE WATER SOMEWHERE WITHIN 113,]THE MIST. [T]HE ONLY PASSAGE GOES BACK TOWARD THE SOUTH. 114,D]EAD END! 115,Y]OU ARE AT THE NORTHEAST END OF AN IMMENSE ROOM, EVEN LARGER THAN THE 115,]GIANT ROOM. [I]T APPEARS TO BE A REPOSITORY FOR THE "[ADVENTURE]" 115,]PROGRAM. [M]ASSIVE TORCHES FAR OVERHEAD BATHE THE ROOM WITH SMOKY 115,]YELLOW LIGHT. [S]CATTERED ABOUT YOU CAN BE SEEN A PILE OF BOTTLES (ALL 115,]OF THEM EMPTY), A NURSERY OF YOUNG BEANSTALKS MURMURING QUIETLY, A BED 115,]OF OYSTERS, A BUNDLE OF BLACK RODS WITH RUSTY STARS ON THEIR ENDS, AND 115,]A COLLECTION OF BRASS LANTERNS. [O]FF TO ONE SIDE A GREAT MANY DWARVES 115,]ARE SLEEPING ON THE FLOOR, SNORING LOUDLY. A SIGN NEARBY READS: "[D]O 115,]NOT DISTURB THE DWARVES!" [A]N IMMENSE MIRROR IS HANGING AGAINST ONE 115,]WALL, AND STRETCHES TO THE OTHER END OF THE ROOM, WHERE VARIOUS OTHER 115,]SUNDRY OBJECTS CAN BE GLIMPSED DIMLY IN THE DISTANCE. 116,Y]OU ARE AT THE SOUTHWEST END OF THE REPOSITORY. [T]O ONE SIDE IS A PIT 116,]FULL OF FIERCE GREEN SNAKES. [O]N THE OTHER SIDE IS A ROW OF SMALL 116,]WICKER CAGES, EACH OF WHICH CONTAINS A LITTLE SULKING BIRD. [I]N ONE 116,]CORNER IS A BUNDLE OF BLACK RODS WITH RUSTY MARKS ON THEIR ENDS. [A] 116,]LARGE NUMBER OF VELVET PILLOWS ARE SCATTERED ABOUT ON THE FLOOR. [A] 116,]VAST MIRROR STRETCHES OFF TO THE NORTHEAST. [A]T YOUR FEET IS A LARGE 116,]STEEL GRATE, NEXT TO WHICH IS A SIGN WHICH READS, "[T]REASURE VAULT. 116,]KEYS IN [M]AIN [O]FFICE." 117,Y]OU ARE ON ONE SIDE OF A LARGE, DEEP CHASM. [A] HEAVY WHITE MIST 117,]RISING UP FROM BELOW OBSCURES ALL VIEW OF THE FAR SIDE. [A] SW PATH 117,]LEADS AWAY FROM THE CHASM INTO A WINDING CORRIDOR. 118,Y]OU ARE IN A LONG WINDING CORRIDOR SLOPING OUT OF SIGHT IN BOTH 118,]DIRECTIONS. 119,Y]OU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST. 120,Y]OU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST. 121,Y]OU ARE IN A SECRET CANYON WHICH EXITS TO THE NORTH AND EAST. 122,Y]OU ARE ON THE FAR SIDE OF THE CHASM. [A] NORTHEAST PATH LEADS AWAY 122,]FROM THE CHASM ON THIS SIDE. 123,Y]OU'RE IN A LONG EAST/WEST CORRIDOR. [A] FAINT RUMBLING NOISE CAN BE 123,]HEARD IN THE DISTANCE. 124,T]HE PATH FORKS HERE. [T]HE LEFT FORK LEADS NORTHEAST.[A] DULL RUMBLING 124,]SEEMS TO GET LOUDER IN THAT DIRECTION.[T]HE RIGHT FORK LEADS SOUTHEAST 124,]DOWN A GENTLE SLOPE. [T]HE MAIN CORRIDOR ENTERS FROM THE WEST. 125,T]HE WALLS ARE QUITE WARM HERE. [F]ROM THE NORTH CAN BE HEARD A STEADY 125,]ROAR, SO LOUD THAT THE ENTIRE CAVE SEEMS TO BE TREMBLING. [A]NOTHER 125,]PASSAGE LEADS SOUTH, AND A LOW CRAWL GOES EAST. 126,Y]OU ARE ON THE EDGE OF A BREATH-TAKING VIEW. [F]AR BELOW YOU IS AN 126,]ACTIVE VOLCANO, FROM WHICH GREAT GOUTS OF MOLTEN LAVA COME SURGING 126,]OUT, CASCADING BACK DOWN INTO THE DEPTHS. [T]HE GLOWING ROCK FILLS THE 126,]FARTHEST REACHES OF THE CAVERN WITH A BLOOD-RED GLARE, GIVING EVERY- 126,]THING AN EERIE, MACABRE APPEARANCE. [T]HE AIR IS FILLED WITH FLICKERING 126,]SPARKS OF ASH AND A HEAVY SMELL OF BRIMSTONE. [T]HE WALLS ARE HOT TO 126,]THE TOUCH, AND THE THUNDERING OF THE VOLCANO DROWNS OUT ALL OTHER 126,]SOUNDS. [E]MBEDDED IN THE JAGGED ROOF FAR OVERHEAD ARE MYRIAD TWISTED 126,]FORMATIONS COMPOSED OF PURE WHITE ALABASTER, WHICH SCATTER THE MURKY 126,]LIGHT INTO SINISTER APPARITIONS UPON THE WALLS.[T]O ONE SIDE IS A DEEP 126,]GORGE, FILLED WITH A BIZARRE CHAOS OF TORTURED ROCK WHICH SEEMS TO 126,]HAVE BEEN CRAFTED BY THE DEVIL HIMSELF. [A]N IMMENSE RIVER OF FIRE 126,]CRASHES OUT FROM THE DEPTHS OF THE VOLCANO, BURNS ITS WAY THROUGH THE 126,]GORGE, AND PLUMMETS INTO A BOTTOMLESS PIT FAR OFF TO YOUR LEFT. [T]O 126,]THE RIGHT, AN IMMENSE GEYSER OF BLISTERING STEAM ERUPTS CONTINUOUSLY 126,]FROM A BARREN ISLAND IN THE CENTER OF A SULFUROUS LAKE, WHICH BUBBLES 126,]OMINOUSLY. [T]HE FAR RIGHT WALL IS AFLAME WITH AN INCANDESCENCE OF ITS 126,]OWN, WHICH LENDS AN ADDITIONAL INFERNAL SPLENDOR TO THE ALREADY 126,]HELLISH SCENE. [A] DARK, FOREBODING PASSAGE EXITS TO THE SOUTH. 127,Y]OU ARE IN A SMALL CHAMBER FILLED WITH LARGE BOULDERS. [T]HE WALLS ARE 127,]VERY WARM, CAUSING THE AIR IN THE ROOM TO BE ALMOST STIFLING FROM THE 127,]HEAT. [T]HE ONLY EXIT IS A CRAWL HEADING WEST, THROUGH WHICH IS COMING 127,]A LOW RUMBLING. 128,Y]OU ARE WALKING ALONG A GENTLY SLOPING NORTH/SOUTH PASSAGE LINED WITH 128,]ODDLY SHAPED LIMESTONE FORMATIONS. 129,Y]OU ARE STANDING AT THE ENTRANCE TO A LARGE, BARREN ROOM. [A] SIGN 129,]POSTED ABOVE THE ENTRANCE READS: "[C]AUTION! [B]EAR IN ROOM!" 130,Y]OU ARE INSIDE A BARREN ROOM. [T]HE CENTER OF THE ROOM IS COMPLETELY 130,]EMPTY EXCEPT FOR SOME DUST. [M]ARKS IN THE DUST LEAD AWAY TOWARD THE 130,]FAR END OF THE ROOM. [T]HE ONLY EXIT IS THE WAY YOU CAME IN. 131,Y]OU ARE IN A MAZE OF TWISTING LITTLE PASSAGES, ALL DIFFERENT. 132,Y]OU ARE IN A LITTLE MAZE OF TWISTY PASSAGES, ALL DIFFERENT. 133,Y]OU ARE IN A TWISTING MAZE OF LITTLE PASSAGES, ALL DIFFERENT. 134,Y]OU ARE IN A TWISTING LITTLE MAZE OF PASSAGES, ALL DIFFERENT. 135,Y]OU ARE IN A TWISTY LITTLE MAZE OF PASSAGES, ALL DIFFERENT. 136,Y]OU ARE IN A TWISTY MAZE OF LITTLE PASSAGES, ALL DIFFERENT. 137,Y]OU ARE IN A LITTLE TWISTY MAZE OF PASSAGES, ALL DIFFERENT. 138,Y]OU ARE IN A MAZE OF LITTLE TWISTING PASSAGES, ALL DIFFERENT. 139,Y]OU ARE IN A MAZE OF LITTLE TWISTY PASSAGES, ALL DIFFERENT. 140,D]EAD END! -1,END 2 1,Y]OU'RE AT END OF ROAD AGAIN. 2,Y]OU'RE AT HILL IN ROAD. 3,Y]OU'RE INSIDE BUILDING. 4,Y]OU'RE IN VALLEY. 5,Y]OU'RE IN FOREST. 6,Y]OU'RE IN FOREST. 7,Y]OU'RE AT SLIT IN STREAMBED. 8,Y]OU'RE OUTSIDE GRATE. 9,Y]OU'RE BELOW THE GRATE. 10,Y]OU'RE IN [C]OBBLE [C]RAWL. 11,Y]OU'RE IN [D]EBRIS [R]OOM. 13,Y]OU'RE IN [B]IRD [C]HAMBER. 14,Y]OU'RE AT TOP OF [S]MALL [P]IT. 15,Y]OU'RE IN [H]ALL OF [M]ISTS. 17,Y]OU'RE ON EAST BANK OF [F]ISSURE. 18,Y]OU'RE IN [N]UGGET OF [G]OLD [R]OOM. 19,Y]OU'RE IN [H]ALL OF [M]T [K]ING. 23,Y]OU'RE AT WEST END OF [T]WOPIT [R]OOM. 24,Y]OU'RE IN [E]AST [P]IT. 25,Y]OU'RE IN [W]EST [P]IT. 33,Y]OU'RE AT "[Y2]". 35,Y]OU'RE AT WINDOW ON [P]IT. 36,Y]OU'RE IN [D]IRTY [P]ASSAGE. 39,Y]OU'RE IN [D]USTY [R]OCK [R]OOM. 41,Y]OU'RE AT WEST END OF [H]ALL OF [M]ISTS. 57,Y]OU'RE AT BRINK OF [P]IT. 60,Y]OU'RE AT EAST END OF [L]ONG [H]ALL. 61,Y]OU'RE AT WEST END OF [L]ONG [H]ALL. 64,Y]OU'RE AT [C]OMPLEX [J]UNCTION. 66,Y]OU'RE IN [S]WISS [C]HEESE ROOM. 67,Y]OU'RE AT EAST END OF [T]WOPIT [R]OOM. 68,Y]OU'RE IN [S]LAB [R]OOM. 71,Y]OU'RE AT [JUNCTION OF [THREE [SECRET [CANYONS. 74,Y]OU'RE IN [S]ECRET EAST/WEST [C]ANYON ABOVE TIGHT CANYON. 88,Y]OU'RE IN [N]ARROW [C]ORRIDOR. 91,Y]OU'RE AT STEEP INCLINE ABOVE [L]ARGE [R]OOM. 92,Y]OU'RE IN [G]IANT [R]OOM. 95,Y]OU'RE IN [C]AVERN WITH [W]ATERFALL. 96,Y]OU'RE IN [S]OFT [R]OOM. 97,Y]OU'RE IN [O]RIENTAL [R]OOM. 98,Y]OU'RE IN [M]ISTY [C]AVERN. 99,Y]OU'RE IN [A]LCOVE. 100,Y]OU'RE IN [P]LOVER [R]OOM. 101,Y]OU'RE IN [D]ARK [R]OOM. 102,Y]OU'RE IN [A]RCHED [H]ALL. 103,Y]OU'RE IN [S]HELL [R]OOM. 106,Y]OU'RE IN [A]NTEROOM. 108,Y]OU'RE AT [W]ITT'S [E]ND. 109,Y]OU'RE IN [M]IRROR [C]ANYON. 110,Y]OU'RE AT WINDOW ON [P]IT. 111,Y]OU'RE AT TOP OF [S]TALACTITE. 113,Y]OU'RE AT [R]ESERVOIR. 115,Y]OU'RE AT NORTHEAST END. 116,Y]OU'RE AT SOUTHWEST END. 117,Y]OU'RE ON SOUTHWEST SIDE OF [C]HASM. 118,Y]OU'RE IN [S]LOPING [C]ORRIDOR. 122,Y]OU'RE ON NORTHEAST SIDE OF [C]HASM. 123,Y]OU'RE IN [C]ORRIDOR. 124,Y]OU'RE AT [F]ORK IN [P]ATH. 125,Y]OU'RE AT [J]UNCTION WITH [W]ARM [W]ALLS. 126,Y]OU'RE AT [B]REATH-TAKING [V]IEW. 127,Y]OU'RE IN [C]HAMBER OF [B]OULDERS. 128,Y]OU'RE IN [L]IMESTONE [P]ASSAGE. 129,Y]OU'RE IN FRONT OF [B]ARREN [R]OOM. 130,Y]OU'RE IN [B]ARREN [R]OOM. -1 3 1,0,2,2,44,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1,0,3,3,12,19,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1,0,4,5,13,14,46,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1,0,5,6,45,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1,0,8,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2,0,1,2,12,7,43,45,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2,0,5,6,45,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 3,0,1,3,11,32,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 3,0,11,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 3,0,33,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 3,0,79,5,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 4,0,1,4,12,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 4,0,5,6,43,44,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 4,0,7,5,46,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 4,0,8,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 5,0,4,9,43,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 5,50,005,6,7,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 5,0,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 5,0,5,44,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 6,0,1,2,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 6,0,4,9,43,44,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 6,0,5,6,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 7,0,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 7,0,4,4,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 7,0,5,6,43,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 7,0,8,5,15,16,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 7,0,595,60,14,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 8,0,5,6,43,44,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 8,0,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 8,0,7,4,13,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 8,303,009,3,19,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 8,0,593,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 9,303,008,11,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 9,0,593,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 9,0,10,17,18,19,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 9,0,14,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 9,0,11,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 10,0,9,11,20,21,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 10,0,11,19,22,44,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 10,0,14,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 11,303,008,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 11,0,9,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 11,0,10,17,18,23,24,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 11,0,12,25,19,29,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 11,0,3,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 11,0,14,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 12,303,008,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 12,0,9,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 12,0,11,30,43,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 12,0,13,19,29,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 12,0,14,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 13,303,008,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 13,0,9,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 13,0,11,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 13,0,12,25,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 13,0,14,23,31,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 14,303,008,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 14,0,9,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 14,0,11,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 14,0,13,23,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 14,150,020,30,31,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 14,0,15,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 14,0,16,33,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 15,0,18,36,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 15,0,17,7,38,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 15,0,19,10,30,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 15,150,022,29,31,34,35,23,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 15,0,14,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 15,0,34,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 16,0,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 17,0,15,38,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 17,312,596,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 17,412,021,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 17,412,597,41,42,44,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 17,0,27,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 18,0,15,38,11,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 19,0,15,10,29,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 19,311,028,45,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 19,311,029,46,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 19,311,030,44,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 19,0,32,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 19,35,074,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 19,211,032,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 19,0,74,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 20,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 22,0,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 23,0,67,43,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 23,0,68,44,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 23,0,25,30,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 23,0,648,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 24,0,67,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 25,0,23,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 25,724,031,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 25,0,26,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 26,0,88,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 27,312,596,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 27,412,021,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 27,412,597,41,42,43,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 27,0,17,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 27,0,40,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 27,0,41,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 28,0,19,38,11,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 28,0,33,45,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 28,0,36,30,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 29,0,19,38,11,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 30,0,19,38,11,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 30,0,62,44,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 31,524,089,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 31,0,90,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 32,0,19,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 33,0,3,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 33,0,28,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 33,0,34,43,53,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 33,0,35,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 33,159,302,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 33,0,100,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 34,0,33,30,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 34,0,15,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 35,0,33,43,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 35,0,20,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 36,0,37,43,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 36,0,28,29,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 36,0,39,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 36,0,65,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 37,0,36,44,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 37,0,38,30,31,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 38,0,37,56,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 38,0,595,60,14,30,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 39,0,36,43,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 39,0,64,30,52,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 39,0,65,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 40,0,41,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 41,0,42,46,29,23,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 41,0,27,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 41,0,59,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 41,0,60,44,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 42,0,41,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 42,0,42,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 42,0,43,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 42,0,45,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 42,0,80,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 43,0,42,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 43,0,44,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 43,0,45,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 44,0,43,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 44,0,48,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 44,0,50,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 44,0,82,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 45,0,42,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 45,0,43,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 45,0,46,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 45,0,47,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 45,0,87,29,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 46,0,45,44,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 47,0,45,43,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 48,0,44,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 49,0,50,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 49,0,51,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 50,0,44,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 50,0,49,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 50,0,51,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 50,0,52,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 51,0,49,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 51,0,50,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 51,0,52,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 51,0,53,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 52,0,50,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 52,0,51,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 52,0,52,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 52,0,53,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 52,0,55,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 52,0,86,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 53,0,51,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 53,0,52,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 53,0,54,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 54,0,53,44,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 55,0,52,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 55,0,55,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 55,0,56,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 55,0,57,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 56,0,55,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 57,0,13,30,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 57,0,55,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 57,0,58,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 57,0,83,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 57,0,84,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 58,0,57,43,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 59,0,27,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 60,0,41,43,29,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 60,0,61,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 60,0,62,45,30,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 61,0,60,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 61,0,62,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 61,100,107,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 62,0,60,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 62,0,63,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 62,0,30,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 62,0,61,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 63,0,62,46,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 64,0,39,29,56,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 64,0,65,44,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 64,0,103,45,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 64,0,106,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,0,64,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,0,66,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,80,556,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,0,68,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,80,556,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,50,070,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,0,39,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,60,556,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,75,072,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,0,71,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,80,556,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65,0,106,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 66,0,65,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 66,0,67,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 66,80,556,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 66,0,77,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 66,0,96,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 66,50,556,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 66,0,97,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 67,0,66,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 67,0,23,44,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 67,0,24,30,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 68,0,23,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 68,0,69,29,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 68,0,65,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 69,0,68,30,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 69,331,120,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 69,0,119,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 69,0,109,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 69,0,113,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 70,0,71,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 70,0,65,30,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 70,0,111,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 71,0,65,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 71,0,70,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 71,0,110,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 72,0,65,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 72,0,118,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 72,0,73,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 72,0,97,48,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 73,0,72,46,17,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 74,0,19,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 74,331,120,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 74,0,121,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 74,0,75,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 75,0,76,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 75,0,77,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 76,0,75,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 77,0,75,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 77,0,78,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 77,0,66,45,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 78,0,77,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 79,0,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 80,0,42,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 80,0,80,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 80,0,80,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 80,0,81,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 81,0,80,44,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 82,0,44,46,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 83,0,57,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 83,0,84,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 83,0,85,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 84,0,57,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 84,0,83,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 84,0,114,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 85,0,83,43,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 86,0,52,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 87,0,45,29,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 88,0,25,30,56,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 88,0,20,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 88,0,92,44,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 89,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 90,0,23,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 91,0,95,45,73,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 91,0,72,30,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 92,0,88,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 92,0,93,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 92,0,94,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 93,0,92,46,27,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 94,0,92,46,27,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 94,309,095,45,3,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 94,0,611,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 95,0,94,46,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 95,0,92,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 95,0,91,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 96,0,66,44,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 97,0,66,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 97,0,72,44,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 97,0,98,29,45,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 98,0,97,46,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 98,0,99,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 99,0,98,50,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 99,0,301,43,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 99,0,100,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 100,0,301,44,23,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 100,0,99,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 100,159,302,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 100,0,33,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 100,0,101,47,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 101,0,100,46,71,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 102,0,103,30,74,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 103,0,102,29,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 103,0,104,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 103,114,618,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 103,115,619,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 103,0,64,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 104,0,103,29,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 104,0,105,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 105,0,104,29,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 105,0,103,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 106,0,64,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 106,0,65,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 106,0,108,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107,0,131,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107,0,132,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107,0,133,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107,0,134,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107,0,135,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107,0,136,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107,0,137,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107,0,138,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107,0,139,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107,0,61,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 108,95,556,45,46,47,48,49,50,29,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 108,10,106,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 108,0,626,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 109,0,69,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 109,0,113,45,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 110,0,71,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 110,0,20,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 111,0,70,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 111,40,050,30,39,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 111,50,053,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 111,0,45,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 112,0,131,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 112,0,132,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 112,0,133,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 112,0,134,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 112,0,135,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 112,0,136,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 112,0,137,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 112,0,138,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 112,0,139,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 112,0,140,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 113,0,109,46,11,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 114,0,84,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 115,0,116,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 116,0,115,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 116,0,593,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 117,0,118,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 117,233,660,41,42,69,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 117,332,661,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 117,0,303,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 117,332,021,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 117,0,596,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 118,0,72,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 118,0,117,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 119,0,69,45,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 119,0,653,43,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 120,0,69,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 120,0,74,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 121,0,74,43,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 121,0,653,45,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 122,0,123,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 122,233,660,41,42,69,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 122,0,303,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 122,0,596,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 122,0,124,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 122,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 122,0,129,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 123,0,122,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 123,0,124,43,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 123,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 123,0,129,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 124,0,123,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 124,0,125,47,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 124,0,128,48,37,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 124,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 124,0,129,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 125,0,124,46,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 125,0,126,45,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 125,0,127,43,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 126,0,125,46,23,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 126,0,124,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 126,0,610,30,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 127,0,125,44,11,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 127,0,124,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 127,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 128,0,124,45,29,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 128,0,129,46,30,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 128,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 129,0,128,44,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 129,0,124,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 129,0,130,43,19,40,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 129,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 130,0,129,44,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 130,0,124,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 130,0,126,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 131,0,107,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 131,0,132,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 131,0,133,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 131,0,134,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 131,0,135,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 131,0,136,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 131,0,137,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 131,0,138,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 131,0,139,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 131,0,112,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 132,0,107,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 132,0,131,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 132,0,133,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 132,0,134,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 132,0,135,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 132,0,136,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 132,0,137,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 132,0,138,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 132,0,139,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 132,0,112,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 133,0,107,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 133,0,131,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 133,0,132,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 133,0,134,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 133,0,135,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 133,0,136,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 133,0,137,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 133,0,138,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 133,0,139,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 133,0,112,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 134,0,107,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 134,0,131,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 134,0,132,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 134,0,133,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 134,0,135,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 134,0,136,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 134,0,137,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 134,0,138,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 134,0,139,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 134,0,112,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 135,0,107,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 135,0,131,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 135,0,132,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 135,0,133,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 135,0,134,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 135,0,136,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 135,0,137,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 135,0,138,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 135,0,139,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 135,0,112,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 136,0,107,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 136,0,131,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 136,0,132,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 136,0,133,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 136,0,134,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 136,0,135,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 136,0,137,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 136,0,138,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 136,0,139,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 136,0,112,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 137,0,107,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 137,0,131,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 137,0,132,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 137,0,133,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 137,0,134,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 137,0,135,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 137,0,136,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 137,0,138,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 137,0,139,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 137,0,112,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 138,0,107,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 138,0,131,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 138,0,132,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 138,0,133,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 138,0,134,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 138,0,135,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 138,0,136,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 138,0,137,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 138,0,139,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 138,0,112,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 139,0,107,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 139,0,131,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 139,0,132,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 139,0,133,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 139,0,134,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 139,0,135,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 139,0,136,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 139,0,137,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 139,0,138,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 139,0,112,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 140,0,112,45,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -1 4 2,ROAD 2,HILL 3,ENTER 4,UPSTR 5,DNSTR 6,FORES 7,FORWA 7,CONTI 7,ONWAR 8,BACK 8,RETUR 8,RETRE 9,VALLE 10,STAIR 11,OUT 11,OUTSI 11,EXIT 11,LEAVE 12,BUILD 12,HOUSE 13,GULLY 14,STREA 15,ROCK 16,BED 17,CRAWL 18,COBBL 19,INWAR 19,INSID 19,IN 20,SURFA 21,NULL 21,NOWHE 22,DARK 23,PASSA 23,TUNNE 24,LOW 25,CANYO 26,AWKWA 27,GIANT 28,VIEW 29,UPWAR 29,UP 29,U 29,ABOVE 29,ASCEN 30,D 30,DOWN 30,DESCE 31,PIT 32,OUTDO 33,CRACK 34,STEPS 35,DOME 36,LEFT 37,RIGHT 38,HALL 39,JUMP 40,BARRE 41,OVER 42,ACROS 43,EAST 43,E 44,WEST 44,W 45,NORTH 45,N 46,SOUTH 46,S 47,NE 48,SE 49,SW 50,NW 51,DEBRI 52,HOLE 53,WALL 54,BROKE 55,Y2 56,CLIMB 57,LOOK 57,EXAMI 57,TOUCH 57,DESCR 58,FLOOR 59,ROOM 60,SLIT 61,SLAB 62,XYZZY 63,DEPRE 64,ENTRA 65,PLUGH 66,SECRE 67,CAVE 69,CROSS 70,BEDQU 71,PLOVE 72,ORIEN 73,CAVER 74,SHELL 75,RESER 76,MAIN 76,OFFIC 77,FORK 1001,KEYS 1001,KEY 1002,LAMP 1002,HEADL 1002,LANTE 1003,GRATE 1004,CAGE 1005,ROD 1006,ROD (MUST BE NEXT OBJECT AFTER "REAL" ROD) 1007,STEPS 1008,BIRD 1009,DOOR 1010,PILLO 1010,VELVE 1011,SNAKE 1012,FISSU 1013,TABLE 1014,CLAM 1015,OYSTE 1016,MAGAZ 1016,ISSUE 1016,SPELU 1016,"SPEL 1017,DWARF 1018,KNIFE 1018,KNIVE 1019,FOOD 1019,RATIO 1020,BOTTL 1020,JAR 1021,WATER 1021,H2O 1022,OIL 1023,MIRRO 1024,PLANT 1024,BEANS 1025,PLANT,(MUST BE NEXT OBJECT AFTER "REAL" PLANT) 1026,STALA 1027,SHADO 1027,FIGUR 1028,AXE 1029,DRAWI 1030,PIRAT 1031,DRAGO 1032,CHASM 1033,TROLL 1034,TROLL,(MUST BE NEXT OBJECT AFTER "REAL" TROLL) 1035,BEAR 1036,MESSA 1037,VOLCA 1037,GEYSE,(SAME AS VOLCANO) 1038,MACHI 1038,VENDI 1039,BATTE 1040,CARPE 1040,MOSS 1050,GOLD 1050,NUGGE 1051,DIAMO 1052,SILVE 1052,BARS 1053,JEWEL 1054,COINS 1055,CHEST 1055,BOX 1055,TREAS 1056,EGGS 1056,EGG 1056,NEST 1057,TRIDE 1058,VASE 1058,MING 1058,SHARD 1058,POTTE 1059,EMERA 1060,PLATI 1060,PYRAM 1061,PEARL 1062,RUG 1062,PERSI 1063,SPICE 1064,CHAIN 2001,CARRY 2001,TAKE 2001,KEEP 2001,CATCH 2001,STEAL 2001,CAPTU 2001,GET 2001,TOTE 2002,DROP 2002,RELEA 2002,FREE 2002,DISCA 2002,DUMP 2003,SAY 2003,CHANT 2003,SING 2003,UTTER 2003,MUMBL 2004,UNLOC 2004,OPEN 2005,NOTHI 2006,LOCK 2006,CLOSE 2007,LIGHT 2007,ON 2008,EXTIN 2008,OFF 2009,WAVE 2009,SHAKE 2009,SWING 2010,CALM 2010,PLACA 2010,TAME 2011,WALK 2011,RUN 2011,TRAVE 2011,GO 2011,PROCE 2011,CONTI 2011,EXPLO 2011,GOTO 2011,FOLLO 2011,TURN 2012,ATTAC 2012,KILL 2012,FIGHT 2012,HIT 2012,STRIK 2013,POUR 2014,EAT 2014,DEVOU 2015,DRINK 2016,RUB 2017,THROW 2017,TOSS 2018,QUIT 2019,FIND 2019,WHERE 2020,INVEN 2021,FEED 2022,FILL 2023,BLAST 2023,DETON 2023,IGNIT 2023,BLOWU 2024,SCORE 2025,FEE 2025,FIE 2025,FOE 2025,FOO 2025,FUM 2026,BRIEF 2027,READ 2027,PERUS 2028,BREAK 2028,SHATT 2028,SMASH 2029,WAKE 2029,DISTU 2030,SUSPE 2030,PAUSE 2030,SAVE 2031,HOURS 2032,RESTO 2032,RESUM 3001,FEE 3002,FIE 3003,FOE 3004,FOO 3005,FUM 3050,SESAM 3050,OPENS 3050,ABRA 3050,ABRAC 3050,SHAZA 3050,HOCUS 3050,POCUS 3051,HELP 3051,? 3064,TREE 3064,TREES 3066,DIG 3066,EXCAV 3068,LOST 3069,MIST 3079,SHIT,VARIOUS BAD WORDS. 3079,DAMN 3079,FUCK 3139,STOP 3142,INFO 3147,SWIM -1 5 1,S]ET OF [K]EYS 000,T]HERE ARE SOME KEYS ON THE GROUND HERE. 2,B]RASS [L]ANTERN 000,T]HERE IS A SHINY BRASS LAMP NEARBY. 100,T]HERE IS A LAMP SHINING NEARBY. 3,*GRATE 000,T]HE GRATE IS LOCKED. 100,T]HE GRATE IS OPEN. 4,W]ICKER [C]AGE 000,T]HERE IS A SMALL WICKER CAGE DISCARDED NEARBY. 5,B]LACK [R]OD 000,A] THREE FOOT BLACK ROD WITH A RUSTY STAR ON AN END LIES NEARBY. 6,B]LACK [R]OD 000,A] THREE FOOT BLACK ROD WITH A RUSTY MARK ON AN END LIES NEARBY. 7,*STEPS 000,R]OUGH STONE STEPS LEAD DOWN THE PIT. 100,R]OUGH STONE STEPS LEAD UP THE DOME. 8,L]ITTLE BIRD IN CAGE 000,A] CHEERFUL LITTLE BIRD IS SITTING HERE SINGING. 100,T]HERE IS A LITTLE BIRD IN THE CAGE. 9,*RUSTY DOOR 000,T]HE WAY NORTH IS BARRED BY A MASSIVE, RUSTY, IRON DOOR. 100,T]HE WAY NORTH LEADS THROUGH A MASSIVE, RUSTY, IRON DOOR. 10,V]ELVET [P]ILLOW 000,A] SMALL VELVET PILLOW LIES ON THE FLOOR. 11,*SNAKE 000,A] HUGE GREEN FIERCE SNAKE BARS THE WAY! 100,>$< (CHASED AWAY) 12,*FISSURE 000,>$< 100,A] CRYSTAL BRIDGE NOW SPANS THE FISSURE. 200,T]HE CRYSTAL BRIDGE HAS VANISHED! 13,*STONE TABLET 000,A] MASSIVE STONE TABLET IMBEDDED IN THE WALL READS: 000,"C]ONGRATULATIONS ON BRINGING LIGHT INTO THE [D]ARK [R]OOM!" 14,G]IANT CLAM >[GRUNT!< 000,T]HERE IS AN ENORMOUS CLAM HERE WITH ITS SHELL TIGHTLY CLOSED. 15,G]IANT OYSTER >[GROAN!< 000,T]HERE IS AN ENORMOUS OYSTER HERE WITH ITS SHELL TIGHTLY CLOSED. 100,I]NTERESTING. [T]HERE SEEMS TO BE SOMETHING WRITTEN ON THE UNDERSIDE OF 100,]THE OYSTER. 16,"S]PELUNKER [T]ODAY" 000,T]HERE ARE A FEW RECENT ISSUES OF "[S]PELUNKER [T]ODAY" MAGAZINE HERE. 19,T]ASTY FOOD 000,T]HERE IS FOOD HERE. 20,S]MALL BOTTLE 000,T]HERE IS A BOTTLE OF WATER HERE. 100,T]HERE IS AN EMPTY BOTTLE HERE. 200,T]HERE IS A BOTTLE OF OIL HERE. 21,W]ATER IN THE BOTTLE 22,O]IL IN THE BOTTLE 23,*MIRROR 000,>$< 24,*PLANT 000,T]HERE IS A TINY LITTLE PLANT IN THE PIT, MURMURING "[W]ATER, WATER,..." 100,T]HE PLANT SPURTS INTO FURIOUS GROWTH FOR A FEW SECONDS. 200,T]HERE IS A 12-FOOT-TALL BEANSTALK STRETCHING UP OUT OF THE PIT, 200,]BELLOWING "[W]ATER!! [W]ATER!!" 300,T]HE PLANT GROWS EXPLOSIVELY, ALMOST FILLING THE BOTTOM OF THE PIT. 400,T]HERE IS A GIGANTIC BEANSTALK STRETCHING ALL THE WAY UP TO THE HOLE. 500,Y]OU'VE OVER-WATERED THE PLANT! [I]T'S SHRIVELING UP! [I]T'S, IT'S... 25,*PHONY PLANT (SEEN IN TWOPIT ROOM ONLY WHEN TALL ENOUGH) 000,>$< 100,T]HE TOP OF A 12-FOOT-TALL BEANSTALK IS POKING OUT OF THE WEST PIT. 200,T]HERE IS A HUGE BEANSTALK GROWING OUT OF THE WEST PIT UP TO THE HOLE. 26,*STALACTITE 000,>$< 27,*SHADOWY FIGURE 000,T]HE SHADOWY FIGURE SEEMS TO BE TRYING TO ATTRACT YOUR ATTENTION. 28,D]WARF'S AXE 000,T]HERE IS A LITTLE AXE HERE. 100,T]HERE IS A LITTLE AXE LYING BESIDE THE BEAR. 29,*CAVE DRAWINGS 000,>$< 30,*PIRATE 000,>$< 31,*DRAGON 000,A] HUGE GREEN FIERCE DRAGON BARS THE WAY! 100,C]ONGRATULATIONS! [Y]OU HAVE JUST VANQUISHED A DRAGON WITH YOUR BARE 100,]HANDS! ([U]NBELIEVABLE, ISN'T IT?) 200,T]HE BODY OF A HUGE GREEN DEAD DRAGON IS LYING OFF TO ONE SIDE. 32,*CHASM 000,A] RICKETY WOODEN BRIDGE EXTENDS ACROSS THE CHASM, VANISHING INTO THE 000,]MIST. [A] SIGN POSTED ON THE BRIDGE READS, "[S]TOP! [P]AY TROLL!" 100,T]HE WRECKAGE OF A BRIDGE (AND A DEAD BEAR) CAN BE SEEN AT THE BOTTOM 100,]OF THE CHASM. 33,*TROLL 000,A] BURLY TROLL STANDS BY THE BRIDGE AND INSISTS YOU THROW HIM A 000,]TREASURE BEFORE YOU MAY CROSS. 100,T]HE TROLL STEPS OUT FROM BENEATH THE BRIDGE AND BLOCKS YOUR WAY. 200,>$< (CHASED AWAY) 34,*PHONY TROLL 000,T]HE TROLL IS NOWHERE TO BE SEEN. 35,>$< (BEAR USES RTEXT 141) 000,T]HERE IS A FEROCIOUS CAVE BEAR EYING YOU FROM THE FAR END OF THE ROOM! 100,T]HERE IS A GENTLE CAVE BEAR SITTING PLACIDLY IN ONE CORNER. 200,T]HERE IS A CONTENTED-LOOKING BEAR WANDERING ABOUT NEARBY. 300,>$< (DEAD) 36,*MESSAGE IN SECOND MAZE 000,T]HERE IS A MESSAGE SCRAWLED IN THE DUST IN A FLOWERY SCRIPT, READING: 000,"[T]HIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS TREASURE CHEST." 37,*VOLCANO AND/OR GEYSER 000,>$< 38,*VENDING MACHINE 000,T]HERE IS A MASSIVE VENDING MACHINE HERE. [T]HE INSTRUCTIONS ON IT READ: 000,"[D]ROP COINS HERE TO RECEIVE FRESH BATTERIES." 39,B]ATTERIES 000,T]HERE ARE FRESH BATTERIES HERE. 100,]SOME WORN-OUT BATTERIES HAVE BEEN DISCARDED NEARBY. 40,*CARPET AND/OR MOSS 000,>$< 50,L]ARGE GOLD NUGGET 000,T]HERE IS A LARGE SPARKLING NUGGET OF GOLD HERE! 51,S]EVERAL DIAMONDS 000,T]HERE ARE DIAMONDS HERE! 52,B]ARS OF SILVER 000,T]HERE ARE BARS OF SILVER HERE! 53,P]RECIOUS JEWELRY 000,T]HERE IS PRECIOUS JEWELRY HERE! 54,R]ARE COINS 000,T]HERE ARE MANY COINS HERE! 55,T]REASURE CHEST 000,T]HE PIRATE'S TREASURE CHEST IS HERE! 56,G]OLDEN EGGS 000,T]HERE IS A LARGE NEST HERE, FULL OF GOLDEN EGGS! 100,T]HE NEST OF GOLDEN EGGS HAS VANISHED! 200,D]ONE! 57,J]EWELED TRIDENT 000,T]HERE IS A JEWEL-ENCRUSTED TRIDENT HERE! 58,M]ING VASE 000,T]HERE IS A DELICATE, PRECIOUS, [M]ING VASE HERE! 100,T]HE VASE IS NOW RESTING, DELICATELY, ON A VELVET PILLOW. 200,T]HE FLOOR IS LITTERED WITH WORTHLESS SHARDS OF POTTERY. 300,T]HE MING VASE DROPS WITH A DELICATE CRASH. 59,E]GG-SIZED EMERALD 000,T]HERE IS AN EMERALD HERE THE SIZE OF A PLOVER'S EGG! 60,P]LATINUM PYRAMID 000,T]HERE IS A PLATINUM PYRAMID HERE, 8 INCHES ON A SIDE! 61,G]LISTENING PEARL 000,O]FF TO ONE SIDE LIES A GLISTENING PEARL! 62,P]ERSIAN RUG 000,T]HERE IS A PERSIAN RUG SPREAD OUT ON THE FLOOR! 100,T]HE DRAGON IS SPRAWLED OUT ON A PERSIAN RUG!! 63,R]ARE SPICES 000,T]HERE ARE RARE SPICES HERE! 64,G]OLDEN CHAIN 000,T]HERE IS A GOLDEN CHAIN LYING IN A HEAP ON THE FLOOR! 100,T]HE BEAR IS LOCKED TO THE WALL WITH A GOLDEN CHAIN! 200,T]HERE IS A GOLDEN CHAIN LOCKED TO THE WALL! -1 6 1,S]OMEWHERE NEARBY IS [C]OLOSSAL [C]AVE, WHERE OTHERS HAVE FOUND FORTUNES 1,]IN TREASURE AND GOLD,THOUGH IT IS RUMORED THAT SOME WHO ENTER ARE NEVER 1,]SEEN AGAIN. [M]AGIC IS SAID TO WORK IN THE CAVE. [I] WILL BE YOUR EYES 1,]AND HANDS. [D]IRECT ME WITH COMMANDS OF 1 OR 2 WORDS. [I] SHOULD WARN 1,]YOU THAT [I] LOOK AT ONLY THE FIRST FOUR LETTERS OF EACH WORD,SO YOU'LL 1,]HAVE TO ENTER "NORTHEAST" AS "NE" TO DISTINGUISH IT FROM "NORTH". 1,(S]HOULD YOU GET STUCK, TYPE "HELP" FOR SOME GENERAL HINTS. [F]OR 1,]INFORMATION ON HOW TO END YOUR ADVENTURE, ETC., TYPE "[INFO".) 1, - - - 1,T]HIS PROGRAM WAS ORIGINALLY DEVELOPED BY [W]ILLIE [C]ROWTHER. [M]OST OF 1,]THE FEATURES OF THE CURRENT PROGRAM WERE ADDED BY [D]ON [W]OODS. 1,T]HIS VERSION, FOR THE [PDP]-8, WAS DONE BY [D]ICK [M]URPHY. IT IS 1,]BASED ON A VERSION FOR [RT]-11 DONE BY [B]OB [S]UPNIK. 2,A] LITTLE DWARF WITH A BIG KNIFE BLOCKS YOUR WAY. 3,A] LITTLE DWARF JUST WALKED AROUND A CORNER, SAW YOU, THREW A LITTLE 3,]AXE AT YOU WHICH MISSED, CURSED, AND RAN AWAY. 4,T]HERE IS A THREATENING LITTLE DWARF IN THE ROOM WITH YOU! 5,O]NE SHARP NASTY KNIFE IS THROWN AT YOU! 6,N]ONE OF THEM HIT YOU! 7,O]NE OF THEM GETS YOU! 8,A] HOLLOW VOICE SAYS "[PLUGH". 9,T]HERE IS NO WAY TO GO THAT DIRECTION. 10,I] AM UNSURE HOW YOU ARE FACING. [U]SE COMPASS POINTS OR NEARBY OBJECTS. 11,I] DON'T KNOW "[IN]" FROM "[OUT]" HERE. [U]SE COMPASS POINTS OR NAME 11,]SOMETHING IN THE GENERAL DIRECTION YOU WANT TO GO. 12,I] DON'T KNOW HOW TO APPLY THAT WORD HERE. 13,I] DON'T UNDERSTAND THAT! 14,I]'M GAME. [W]OULD YOU CARE TO EXPLAIN HOW? 15,S]ORRY, BUT [I] AM NOT ALLOWED TO GIVE MORE DETAIL. [I] WILL REPEAT THE 15,]LONG DESCRIPTION OF YOUR LOCATION. 16,I]T IS NOW PITCH DARK. [I]F YOU PROCEED YOU WILL LIKELY FALL INTO A PIT. 17,I]F YOU PREFER, SIMPLY TYPE "[W]" RATHER THAN "[WEST". 18,A]RE YOU TRYING TO CATCH THE BIRD? 19,T]HE BIRD IS FRIGHTENED RIGHT NOW AND YOU CANNOT CATCH IT NO MATTER 19,]WHAT YOU TRY. [P]ERHAPS YOU MIGHT TRY LATER. 20,A]RE YOU TRYING TO SOMEHOW DEAL WITH THE SNAKE? 21,Y]OU CAN'T KILL THE SNAKE, OR DRIVE IT AWAY, OR AVOID IT, OR ANYTHING 21,L]IKE THAT. [T]HERE IS A WAY TO GET BY, BUT YOU DON'T HAVE THE NECESSARY 21,]RESOURCES RIGHT NOW. 22,D]O YOU REALLY WANT TO QUIT NOW? 23,Y]OU FELL INTO A PIT AND BROKE EVERY BONE IN YOUR BODY! 24,Y]OU ARE ALREADY CARRYING IT! 25,Y]OU CAN'T BE SERIOUS! 26,T]HE BIRD WAS UNAFRAID WHEN YOU ENTERED, BUT AS YOU APPROACH IT BECOMES 26,]DISTURBED AND YOU CANNOT CATCH IT. 27,]YOU CAN CATCH THE BIRD, BUT YOU CANNOT CARRY IT. 28,T]HERE IS NOTHING HERE WITH A LOCK! 29,Y]OU AREN'T CARRYING IT! 30,T]HE LITTLE BIRD ATTACKS THE GREEN SNAKE, AND IN AN ASTOUNDING FLURRY 30,]DRIVES THE SNAKE AWAY. 31,Y]OU HAVE NO KEYS! 32,I]T HAS NO LOCK. 33,I] DON'T KNOW HOW TO LOCK OR UNLOCK SUCH A THING. 34,I]T WAS ALREADY LOCKED. 35,T]HE GRATE IS NOW LOCKED. 36,T]HE GRATE IS NOW UNLOCKED. 37,I]T WAS ALREADY UNLOCKED. 38,Y]OU HAVE NO SOURCE OF LIGHT. 39,Y]OUR LAMP IS NOW ON. 40,Y]OUR LAMP IS NOW OFF. 41,T]HERE IS NO WAY TO GET PAST THE BEAR TO UNLOCK THE CHAIN, WHICH IS 41,]PROBABLY JUST AS WELL. 42,N]OTHING HAPPENS. 43,W]HERE? 44,T]HERE IS NOTHING HERE TO ATTACK. 45,T]HE LITTLE BIRD IS NOW DEAD. [I]TS BODY DISAPPEARS. 46,A]TTACKING THE SNAKE BOTH DOESN'T WORK AND IS VERY DANGEROUS. 47,Y]OU KILLED A LITTLE DWARF. 48,Y]OU ATTACK A LITTLE DWARF, BUT HE DODGES OUT OF THE WAY. 49,W]ITH WHAT? [Y]OUR BARE HANDS? 50,G]OOD TRY, BUT THAT IS AN OLD WORN-OUT MAGIC WORD. 51,I] KNOW OF PLACES, ACTIONS, AND THINGS. [M]OST OF MY VOCABULARY 51,]DESCRIBES PLACES AND IS USED TO MOVE YOU THERE. [T]O MOVE, TRY WORDS 51,]LIKE ["FOREST", "DNSTREAM", "ENTER", "EAST", "WEST", "NORTH", "SOUTH", 51,"UP", ]OR ["DOWN". I] KNOW ABOUT A FEW SPECIAL OBJECTS, LIKE A BLACK ROD 51,]HIDDEN IN THE CAVE. [T]HESE OBJECTS CAN BE MANIPULATED USING SOME OF 51,]THE ACTION WORDS THAT [I] KNOW.[U]SUALLY YOU WILL NEED TO GIVE BOTH THE 51,]OBJECT AND ACTION WORDS (IN EITHER ORDER), BUT SOMETIMES [I] CAN INFER 51,]THE OBJECT FROM THE VERB ALONE. [S]OME OBJECTS ALSO IMPLY VERBS; IN 51,]PARTICULAR,"[INVENTORY]" IMPLIES "[TAKE INVENTORY]", WHICH CAUSES ME TO 51,]GIVE YOU A LIST OF WHAT YOU'RE CARRYING. [T]HE OBJECTS HAVE SIDE 51,]EFFECTS; FOR INSTANCE, THE ROD SCARES THE BIRD. [U]SUALLY PEOPLE HAVING 51,]TROUBLE MOVING JUST NEED TO TRY A FEW MORE WORDS. [U]SUALLY PEOPLE 51,]TRYING UNSUCCESSFULLY TO MANIPULATE AN OBJECT ARE ATTEMPTING SOMETHING 51,]BEYOND THEIR (OR MY!) CAPABILITIES AND SHOULD TRY A COMPLETELY 51,]DIFFERENT TACK. [T]O SPEED THE GAME YOU CAN SOMETIMES MOVE LONG 51,]DISTANCES WITH A SINGLE WORD. [F]OR EXAMPLE, "[BUILDING]" USUALLY GETS 51,]YOU TO THE BUILDING FROM ANYWHERE ABOVE GROUND EXCEPT WHEN LOST IN THE 51,]FOREST. [A]LSO, NOTE THAT CAVE PASSAGES TURN A LOT, AND THAT LEAVING A 51,]ROOM TO THE NORTH DOES NOT GUARANTEE ENTERING THE NEXT FROM THE SOUTH. 51,G]OOD LUCK! 52,I]T MISSES! 53,I]T GETS YOU! 54,OK! 55,Y]OU CAN'T UNLOCK THE KEYS. 56,Y]OU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND WOUND UP BACK IN THE 56,]MAIN PASSAGE. 57,I] DON'T KNOW WHERE THE CAVE IS, BUT HEREABOUTS NO STREAM CAN RUN ON 57,T]HE SURFACE FOR LONG. [I] WOULD TRY THE STREAM. 58,I] NEED MORE DETAILED INSTRUCTIONS TO DO THAT. 59,I] CAN ONLY TELL YOU WHAT YOU SEE AS YOU MOVE ABOUT AND MANIPULATE 59,]THINGS. [I] CANNOT TELL YOU WHERE REMOTE THINGS ARE. 60,I] DON'T KNOW THAT WORD. 61,W]HAT? 62,A]RE YOU TRYING TO GET INTO THE CAVE? 63,T]HE GRATE IS VERY SOLID AND HAS A HARDENED STEEL LOCK. [Y]OU CANNOT 63,]ENTER WITHOUT A KEY, AND THERE ARE NO KEYS NEARBY. [I] WOULD RECOMMEND 63,]LOOKING ELSEWHERE FOR THE KEYS. 64,T]HE TREES OF THE FOREST ARE LARGE HARDWOOD OAK AND MAPLE, WITH AN 64,]OCCASIONAL GROVE OF PINE OR SPRUCE. [T]HERE IS QUITE A BIT OF UNDER- 64,]GROWTH, LARGELY BIRCH AND ASH SAPLINGS PLUS NONDESCRIPT BUSHES OF 64,]VARIOUS SORTS. [T]HIS TIME OF YEAR VISIBILITY IS QUITE RESTRICTED BY 64,]ALL THE LEAVES, BUT TRAVEL IS QUITE EASY IF YOU DETOUR AROUND THE 64,]SPRUCE AND BERRY BUSHES. 65,W]ELCOME TO [A]DVENTURE!! [W]OULD YOU LIKE INSTRUCTIONS? 66,D]IGGING WITHOUT A SHOVEL IS QUITE IMPRACTICAL. [E]VEN WITH A SHOVEL 66,]PROGRESS IS UNLIKELY. 67,B]LASTING REQUIRES DYNAMITE. 68,I]'M AS CONFUSED AS YOU ARE. 69,M]IST IS A WHITE VAPOR, USUALLY WATER, SEEN FROM TIME TO TIME IN 69,]CAVERNS. [I]T CAN BE FOUND ANYWHERE BUT IS FREQUENTLY A SIGN OF A DEEP 69,]PIT LEADING DOWN TO WATER. 70,Y]OUR FEET ARE NOW WET. 71,I] THINK [I] JUST LOST MY APPETITE. 72,T]HANK YOU, IT WAS DELICIOUS! 73,Y]OU HAVE TAKEN A DRINK FROM THE STREAM. [T]HE WATER TASTES STRONGLY OF 73,]MINERALS, BUT IS NOT UNPLEASANT. [I]T IS EXTREMELY COLD. 74,T]HE BOTTLE OF WATER IS NOW EMPTY. 75,R]UBBING THE ELECTRIC LAMP IS NOT PARTICULARLY REWARDING. [A]NYWAY, 75,]NOTHING EXCITING HAPPENS. 76,P]ECULIAR. [N]OTHING UNEXPECTED HAPPENS. 77,Y]OUR BOTTLE IS EMPTY AND THE GROUND IS WET. 78,Y]OU CAN'T POUR THAT. 79,W]ATCH IT! 80,W]HICH WAY? 81,O]H DEAR, YOU SEEM TO HAVE GOTTEN YOURSELF KILLED. [I] MIGHT BE ABLE TO 81,]HELP YOU OUT,BUT [I]'VE NEVER REALLY DONE THIS BEFORE. [D]O YOU WANT ME 81,]TO TRY TO REINCARNATE YOU? 82,A]LL RIGHT. [B]UT DON'T BLAME ME IF SOMETHING GOES WR...... 82, --- POOF!! --- 82,Y]OU ARE ENGULFED IN A CLOUD OF ORANGE SMOKE. [C]OUGHING AND GASPING, 82,]YOU EMERGE FROM THE SMOKE AND FIND.... 83,Y]OU CLUMSY OAF, YOU'VE DONE IT AGAIN! [I] DON'T KNOW HOW LONG [I] CAN 83,]KEEP THIS UP. [D]O YOU WANT ME TO TRY REINCARNATING YOU AGAIN? 84,O]KAY, NOW WHERE DID [I] PUT MY ORANGE SMOKE?.... >P]OOF!< 84,E]VERYTHING DISAPPEARS IN A DENSE CLOUD OF ORANGE SMOKE. 85,N]OW YOU'VE REALLY DONE IT! [I]'M OUT OF ORANGE SMOKE! [Y]OU DON'T 85,]EXPECT ME TO DO A DECENT REINCARNATION WITHOUT ANY ORANGE SMOKE,DO YOU? 86,O]KAY, IF YOU'RE SO SMART, DO IT YOURSELF! [I]'M LEAVING! 90,>>> MESSAGES 81 THRU 90 ARE RESERVED FOR "OBITUARIES". <<< 91,S]ORRY, BUT [I] NO LONGER SEEM TO REMEMBER HOW IT WAS YOU GOT HERE. 92,Y]OU CAN'T CARRY ANYTHING MORE. [Y]OU'LL HAVE TO DROP SOMETHING FIRST. 93,Y]OU CAN'T GO THROUGH A LOCKED STEEL GRATE! 94,I] BELIEVE WHAT YOU WANT IS RIGHT HERE WITH YOU. 95,Y]OU DON'T FIT THROUGH A TWO-INCH SLIT! 96,I] RESPECTFULLY SUGGEST YOU GO ACROSS THE BRIDGE INSTEAD OF JUMPING. 97,T]HERE IS NO WAY ACROSS THE FISSURE. 98,Y]OU'RE NOT CARRYING ANYTHING. 99,Y]OU ARE CURRENTLY HOLDING THE FOLLOWING: 100,I]T'S NOT HUNGRY (IT'S MERELY PININ' FOR THE FJORDS). [B]ESIDES, YOU 100,]HAVE NO BIRD SEED. 101,T]HE SNAKE HAS NOW DEVOURED YOUR BIRD. 102,T]HERE'S NOTHING HERE IT WANTS TO EAT (EXCEPT PERHAPS YOU). 103,Y]OU FOOL, DWARVES EAT ONLY COAL! [N]OW YOU'VE MADE HIM [REALLY] MAD!! 104,Y]OU HAVE NOTHING IN WHICH TO CARRY IT. 105,Y]OUR BOTTLE IS ALREADY FULL. 106,T]HERE IS NOTHING HERE WITH WHICH TO FILL THE BOTTLE. 107,Y]OUR BOTTLE IS NOW FULL OF WATER. 108,Y]OUR BOTTLE IS NOW FULL OF OIL. 109,Y]OU CAN'T FILL THAT. 110,D]ON'T BE RIDICULOUS! 111,T]HE DOOR IS EXTREMELY RUSTY AND REFUSES TO OPEN. 112,T]HE PLANT INDIGNANTLY SHAKES THE OIL OFF ITS LEAVES AND ASKS,"[W]ATER?" 113,T]HE HINGES ARE QUITE THOROUGHLY RUSTED NOW AND WON'T BUDGE. 114,T]HE OIL HAS FREED UP THE HINGES SO THAT THE DOOR WILL NOW MOVE, 114,]ALTHOUGH IT REQUIRES SOME EFFORT. 115,T]HE PLANT HAS EXCEPTIONALLY DEEP ROOTS AND CANNOT BE PULLED FREE. 116,T]HE DWARVES' KNIVES VANISH AS THEY STRIKE THE WALLS OF THE CAVE. 117,S]OMETHING YOU'RE CARRYING WON'T FIT THROUGH THE TUNNEL WITH YOU. 117,Y]OU'D BEST TAKE INVENTORY AND DROP SOMETHING. 118,Y]OU CAN'T FIT THIS FIVE-FOOT CLAM THROUGH THAT LITTLE PASSAGE! 119,Y]OU CAN'T FIT THIS FIVE-FOOT OYSTER THROUGH THAT LITTLE PASSAGE! 120,I] ADVISE YOU TO PUT DOWN THE CLAM BEFORE OPENING IT. >[S]TRAIN!< 121,I] ADVISE YOU TO PUT DOWN THE OYSTER BEFORE OPENING IT. >[W]RENCH!< 122,Y]OU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE CLAM. 123,Y]OU DON'T HAVE ANYTHING STRONG ENOUGH TO OPEN THE OYSTER. 124,A] GLISTENING PEARL FALLS OUT OF THE CLAM AND ROLLS AWAY. [G]OODNESS, 124,]THIS MUST REALLY BE AN OYSTER. ([I] NEVER WAS VERY GOOD AT IDENTIFYING 124,]BIVALVES.) [W]HATEVER IT IS, IT HAS NOW SNAPPED SHUT AGAIN. 125,T]HE OYSTER CREAKS OPEN, REVEALING NOTHING BUT OYSTER INSIDE. [I]T 125,]PROMPTLY SNAPS SHUT AGAIN. 126,Y]OU HAVE CRAWLED AROUND IN SOME LITTLE HOLES AND FOUND YOUR WAY 126,]BLOCKED BY A RECENT CAVE-IN. [Y]OU ARE NOW BACK IN THE MAIN PASSAGE. 127,T]HERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU. 128,O]UT FROM THE SHADOWS BEHIND YOU POUNCES A BEARDED PIRATE! "H]AR, HAR," 128,H]E CHORTLES, "[I]'LL JUST TAKE ALL THIS BOOTY AND HIDE IT AWAY WITH ME 128,]CHEST DEEP IN THE MAZE!" [H]E SNATCHES YOUR TREASURE AND VANISHES INTO 128,]THE GLOOM. 129,A] SEPULCHRAL VOICE REVERBERATING THROUGH THE CAVE SAYS, "[C]AVE CLOSING 129,]SOON. [A]LL ADVENTURERS EXIT IMMEDIATELY THROUGH [M]AIN [O]FFICE." 130,A] MYSTERIOUS RECORDED VOICE GROANS INTO LIFE AND ANNOUNCES: 130, "T]HIS EXIT IS CLOSED. [P]LEASE LEAVE VIA [M]AIN [O]FFICE." 131,I]T LOOKS AS THOUGH YOU'RE DEAD. [W]ELL, SEEING AS HOW IT'S SO CLOSE TO 131,]CLOSING TIME ANYWAY, [I] THINK WE'LL JUST CALL IT A DAY. 132,T]HE SEPULCHRAL VOICE ENTONES, "T]HE CAVE IS NOW CLOSED." [A]S THE 132,]ECHOES FADE, THERE IS A BLINDING FLASH OF LIGHT (AND A SMALL PUFF OF 132,]ORANGE SMOKE). . . .[A]S YOUR EYES REFOCUS, YOU LOOK AROUND AND FIND... 133,T]HERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR 133,]WALL, BURYING THE DWARVES IN THE RUBBLE. [Y]OU MARCH THROUGH THE HOLE 133,]AND FIND YOURSELF IN THE [M]AIN [O]FFICE, WHERE A CHEERING BAND OF 133,]FRIENDLY ELVES CARRY THE CONQUERING ADVENTURER OFF INTO THE SUNSET. 134,T]HERE IS A LOUD EXPLOSION, AND A TWENTY-FOOT HOLE APPEARS IN THE FAR 134,]WALL, BURYING THE SNAKES IN THE RUBBLE. [A] RIVER OF MOLTEN LAVA POURS 134,]IN THROUGH THE HOLE, DESTROYING EVERYTHING IN ITS PATH, INCLUDING YOU! 135,T]HERE IS A LOUD EXPLOSION, AND YOU ARE SUDDENLY SPLASHED ACROSS THE 135,]WALLS OF THE ROOM. 136,T]HE RESULTING RUCKUS HAS AWAKENED THE DWARVES. T]HERE ARE NOW SEVERAL 136,]THREATENING LITTLE DWARVES IN THE ROOM WITH YOU! [M]OST OF THEM THROW 136,]KNIVES AT YOU! [A]LL OF THEM GET YOU! 137,O]H, LEAVE THE POOR UNHAPPY BIRD ALONE. 138,I] DARESAY WHATEVER YOU WANT IS AROUND HERE SOMEWHERE. 139,I] DON'T KNOW THE WORD "[STOP]". [U]SE "[QUIT]" IF YOU WANT TO GIVE UP. 140,Y]OU CAN'T GET THERE FROM HERE. 141,Y]OU ARE BEING FOLLOWED BY A VERY LARGE, TAME BEAR. 142,I]F YOU WANT TO END YOUR ADVENTURE EARLY, SAY "[QUIT]". [T]O SUSPEND 142,]YOUR ADVENTURE SUCH THAT YOU CAN CONTINUE LATER, SAY "[SUSPEND]" (OR 142,"PAUSE" ]OR "[SAVE]"). [T]O SEE WHAT HOURS THE CAVE IS NORMALLY OPEN, 142,]SAY "[HOURS]". [T]O SEE HOW WELL YOU'RE DOING, SAY "[SCORE]". [T]O GET 142,]FULL CREDIT FOR A TREASURE, YOU MUST HAVE LEFT IT SAFELY IN THE 142,]BUILDING, THOUGH YOU GET PARTIAL CREDIT JUST FOR LOCATING IT. [Y]OU 142,]LOSE POINTS FOR GETTING KILLED, OR FOR QUITTING, THOUGH THE FORMER 142,]COSTS YOU MORE. [T]HERE ARE ALSO POINTS BASED ON HOW MUCH (IF ANY) OF 142,]THE CAVE YOU'VE MANAGED TO EXPLORE; IN PARTICULAR, THERE IS A LARGE 142,]BONUS JUST FOR GETTING IN (TO DISTINGUISH THE BEGINNERS FROM THE REST 142,]OF THE PACK), AND THERE ARE OTHER WAYS TO DETERMINE WHETHER YOU'VE BEEN 142,]THROUGH SOME OF THE MORE HARROWING SECTIONS. [I]F YOU THINK YOU'VE 142,]FOUND ALL THE TREASURES, JUST KEEP EXPLORING FOR A WHILE. [I]F NOTHING 142,]INTERESTING HAPPENS, YOU HAVEN'T FOUND THEM ALL YET. [I]F SOMETHING 142,]INTERESTING *DOES* HAPPEN,IT MEANS YOU'RE GETTING A BONUS AND HAVE AN 142,]OPPORTUNITY TO GARNER MANY MORE POINTS IN THE MASTER'S SECTION. 142,I] MAY OCCASIONALLY OFFER HINTS IF YOU SEEM TO BE HAVING TROUBLE. [I]F 142,I] DO, [I]'LL WARN YOU IN ADVANCE HOW MUCH IT WILL AFFECT YOUR SCORE TO 142,]ACCEPT THE HINTS. [F]INALLY, TO SAVE PAPER, YOU MAY SPECIFY ["BRIEF"], 142,]WHICH TELLS ME NEVER TO REPEAT THE FULL DESCRIPTION OF A PLACE UNLESS 142,]YOU EXPLICITLY ASK ME TO. 143,D]O YOU INDEED WISH TO QUIT NOW? 144,T]HERE IS NOTHING HERE WITH WHICH TO FILL THE VASE. 145,T]HE SUDDEN CHANGE IN TEMPERATURE HAS DELICATELY SHATTERED THE VASE. 146,I]T IS BEYOND YOUR POWER TO DO THAT. 147,I] DON'T KNOW HOW. 148,I]T IS TOO FAR UP FOR YOU TO REACH. 149,Y]OU KILLED A LITTLE DWARF. [T]HE BODY VANISHES IN A CLOUD OF GREASY 149,]BLACK SMOKE. 150,T]HE SHELL IS VERY STRONG AND IS IMPERVIOUS TO ATTACK. 151,W]HAT'S THE MATTER, CAN'T YOU READ? [N]OW YOU'D BEST START OVER. 152,T]HE AXE BOUNCES HARMLESSLY OFF THE DRAGON'S THICK SCALES. 153,T]HE DRAGON LOOKS RATHER NASTY. [Y]OU'D BEST NOT TRY TO GET BY. 154,T]HE LITTLE BIRD ATTACKS THE GREEN DRAGON, AND IN AN ASTOUNDING FLURRY 154,]GETS BURNT TO A CINDER. [T]HE ASHES BLOW AWAY. 155,O]N WHAT? 156,O]KAY, FROM NOW ON [I]'LL ONLY DESCRIBE A PLACE IN FULL THE FIRST TIME 156,]YOU COME TO IT. [T]O GET THE FULL DESCRIPTION, SAY "[LOOK". 157,T]ROLLS ARE CLOSE RELATIVES WITH THE ROCKS AND HAVE SKIN AS TOUGH AS 157,]THAT OF A RHINOCEROS. [T]HE TROLL FENDS OFF YOUR BLOWS EFFORTLESSLY. 158,T]HE TROLL DEFTLY CATCHES THE AXE, EXAMINES IT CAREFULLY, AND TOSSES IT 158,]BACK, DECLARING, "[G]OOD WORKMANSHIP, BUT IT'S NOT VALUABLE ENOUGH." 159,T]HE TROLL CATCHES YOUR TREASURE AND SCURRIES AWAY OUT OF SIGHT. 160,T]HE TROLL REFUSES TO LET YOU CROSS. 161,T]HERE IS NO LONGER ANY WAY ACROSS THE CHASM. 162,J]UST AS YOU REACH THE OTHER SIDE, THE BRIDGE BUCKLES BENEATH THE 162,]WEIGHT OF THE BEAR, WHICH WAS STILL FOLLOWING YOU AROUND. [Y]OU 162,]SCRABBLE DESPERATELY FOR SUPPORT, BUT AS THE BRIDGE COLLAPSES YOU 162,]STUMBLE BACK AND FALL INTO THE CHASM. 163,T]HE BEAR LUMBERS TOWARD THE TROLL, WHO LETS OUT A STARTLED SHRIEK AND 163,]SCURRIES AWAY. [T]HE BEAR SOON GIVES UP THE PURSUIT AND WANDERS BACK. 164,T]HE AXE MISSES AND LANDS NEAR THE BEAR WHERE YOU CAN'T GET AT IT. 165,W]ITH WHAT? [Y]OUR BARE HANDS? [A]GAINST *HIS* BEAR HANDS?? 166,T]HE BEAR IS CONFUSED; HE ONLY WANTS TO BE YOUR FRIEND. 167,F]OR CRYING OUT LOUD, THE POOR THING IS ALREADY DEAD! 168,T]HE BEAR EAGERLY WOLFS DOWN YOUR FOOD, AFTER WHICH HE SEEMS TO CALM 168,]DOWN CONSIDERABLY AND EVEN BECOMES RATHER FRIENDLY. 169,T]HE BEAR IS STILL CHAINED TO THE WALL. 170,T]HE CHAIN IS STILL LOCKED. 171,T]HE CHAIN IS NOW UNLOCKED. 172,T]HE CHAIN IS NOW LOCKED. 173,T]HERE IS NOTHING HERE TO WHICH THE CHAIN CAN BE LOCKED. 174,T]HERE IS NOTHING HERE TO EAT. 175,D]O YOU WANT THE HINT? 176,D]O YOU NEED HELP GETTING OUT OF THE MAZE? 177,Y]OU CAN MAKE THE PASSAGES LOOK LESS ALIKE BY DROPPING THINGS. 178,A]RE YOU TRYING TO EXPLORE BEYOND THE [P]LOVER [R]OOM? 179,T]HERE IS A WAY TO EXPLORE THAT REGION WITHOUT HAVING TO WORRY ABOUT 179,]FALLING INTO A PIT. [N]ONE OF THE OBJECTS AVAILABLE IS IMMEDIATELY 179,]USEFUL IN DISCOVERING THE SECRET. 180,D]O YOU NEED HELP GETTING OUT OF HERE? 181,D]ON'T GO WEST. 182,G]LUTTONY IS NOT ONE OF THE TROLL'S VICES. [A]VARICE, HOWEVER, IS. 183,Y]OUR LAMP IS GETTING DIM. YOU'D BEST START WRAPPING THIS UP, UNLESS 183,Y]OU CAN FIND SOME FRESH BATTERIES. [I] SEEM TO RECALL THERE'S A VENDING 183,]MACHINE IN THE MAZE. [B]RING SOME COINS WITH YOU. 184,Y]OUR LAMP HAS RUN OUT OF POWER. 185,T]HERE'S NOT MUCH POINT IN WANDERING AROUND OUT HERE, AND YOU CAN'T 185,]EXPLORE THE CAVE WITHOUT A LAMP. [S]O LET'S JUST CALL IT A DAY. 186,T]HERE ARE FAINT RUSTLING NOISES FROM THE DARKNESS BEHIND YOU. [A]S YOU 186,]TURN TOWARD THEM, THE BEAM OF YOUR LAMP FALLS ACROSS A BEARDED PIRATE. 186,H]E IS CARRYING A LARGE CHEST. "[S]HIVER ME TIMBERS!" HE CRIES, "[I]'VE 186,]BEEN SPOTTED! [I]'D BEST HIE MESELF OFF TO THE MAZE TO HIDE ME CHEST!" 186,W]ITH THAT, HE VANISHES INTO THE GLOOM. 187,Y]OUR LAMP IS GETTING DIM. [Y]OU'D BEST GO BACK FOR THOSE BATTERIES. 188,Y]OUR LAMP IS GETTING DIM. [I]'M TAKING THE LIBERTY OF REPLACING THE 188,]BATTERIES. 189,Y]OUR LAMP IS GETTING DIM, AND YOU'RE OUT OF SPARE BATTERIES. [Y]OU'D 189,]BEST START WRAPPING THIS UP. 190,I]'M AFRAID THE MAGAZINE IS WRITTEN IN [D]WARVISH. 191,"T]HIS IS NOT THE MAZE WHERE THE PIRATE LEAVES HIS TREASURE CHEST." 192,H]MMM, THIS LOOKS LIKE A CLUE, WHICH MEANS IT'LL COST YOU 10 POINTS TO 192,]READ IT. [S]HOULD [I] GO AHEAD AND READ IT ANYWAY? 193,I]T SAYS, "[T]HERE IS SOMETHING STRANGE ABOUT THIS PLACE, SUCH THAT ONE 193,]OF THE WORDS [I]'VE ALWAYS KNOWN NOW HAS A NEW EFFECT." 194,I]T SAYS THE SAME THING IT DID BEFORE. 195,I]'M AFRAID [I] DON'T UNDERSTAND. 196,"C]ONGRATULATIONS ON BRINGING LIGHT INTO THE [D]ARK [R]OOM!" 197,Y]OU STRIKE THE MIRROR A RESOUNDING BLOW, WHEREUPON IT SHATTERS INTO A 197,]MYRIAD TINY FRAGMENTS. 198,Y]OU HAVE TAKEN THE VASE AND HURLED IT DELICATELY TO THE GROUND. 199,Y]OU PROD THE NEAREST DWARF, WHO WAKES UP GRUMPILY, TAKES ONE LOOK AT 199,Y]OU, CURSES, AND GRABS FOR HIS AXE. 200,I]S THIS ACCEPTABLE? 201,C]OLOSSAL [C]AVE IS [ALWAYS] OPEN, PROVIDED THIS IS YOUR [PDP-8. 202,T]AKEN. -1 7 1,3 2,3 3,8,9 4,10 5,11 6,0 7,14,15 8,13 9,94,-1 10,96 11,19,-1 12,17,27 13,101,-1 14,103 15,0 16,106 17,0,-1 18,0 19,3 20,3 21,0 22,0 23,109,-1 24,25,-1 25,23,67 26,111,-1 27,35,110 28,0 29,97,-1 30,0,-1 31,119,121 32,117,122 33,117,122 34,0,0 35,130,-1 36,0,-1 37,126,-1 38,140,-1 39,0 40,96,-1 50,18 51,27 52,28 53,29 54,30 55,0 56,92 57,95 58,97 59,100 60,101 61,0 62,119,121 63,127 64,130,-1 -1 8 1,24 2,29 3,0 4,33 5,0 6,33 7,38 8,38 9,42 10,14 11,43 12,110 13,29 14,110 15,73 16,75 17,29 18,13 19,59 20,59 21,174 22,109 23,67 24,13 25,147 26,155 27,195 28,146 29,110 30,13 31,13 -1 9 0,1,2,3,4,5,6,7,8,9,10 0,100,115,116,126 2,1,3,4,7,38,95,113,24 1,24 3,46,47,48,54,56,58,82,85,86 3,122,123,124,125,126,127,128,129,130 4,8 5,13 6,19 7,42,43,44,45,46,47,48,49,50,51 7,52,53,54,55,56,80,81,82,86,87 8,99,100,101 9,108 -1 10 35,Y]OU ARE OBVIOUSLY A [R]ANK [A]MATEUR. [B]ETTER LUCK NEXT TIME. 100,Y]OUR SCORE QUALIFIES YOU AS A [N]OVICE [C]LASS [A]DVENTURER. 130,Y]OU HAVE ACHIEVED THE RATING: "[E]XPERIENCED [A]DVENTURER". 200,Y]OU MAY NOW CONSIDER YOURSELF A "[S]EASONED [A]DVENTURER". 250,Y]OU HAVE REACHED "[J]UNIOR [M]ASTER" STATUS. 300,Y]OUR SCORE PUTS YOU IN [M]ASTER [A]DVENTURER CLASS [C. 330,Y]OUR SCORE PUTS YOU IN [M]ASTER [A]DVENTURER CLASS [B. 349,Y]OUR SCORE PUTS YOU IN [M]ASTER [A]DVENTURER CLASS [A. 999,A]LL OF [A]DVENTUREDOM GIVES TRIBUTE TO YOU, [A]DVENTURER [G]RANDMASTER! -1 11 2,9999,10,0,0 3,9999,5,0,0 4,4,2,62,63 5,5,2,18,19 6,8,2,20,21 7,75,4,176,177 8,25,5,178,179 9,20,3,180,181 -1 12 -1 0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 | EXTERN SAVEGM EXTERN RSTRGM EXTERN A5TOA1 SECT AMAIN EXTERN BITSET EXTERN BUG EXTERN CARRY EXTERN DROP EXTERN DSTROY EXTERN GETIN EXTERN IABS EXTERN JUGGLE EXTERN MAX0 EXTERN MIN0 EXTERN MOD EXTERN MOVE EXTERN SPEAK EXTERN PSPEAK EXTERN PUT EXTERN RND EXTERN RSPEAK EXTERN SPEAK EXTERN VOCAB EXTERN YES EXTERN #FIX EXTERN #WRITO EXTERN #RENDO EXTERN #RSVO EXTERN #UE EXTERN #EQ EXTERN #NE EXTERN PCT EXTERN GETWRD EXTERN PUTWRD EXTERN SIXOUT JA #ST #XR, ORG .+10 TEXT +AMAIN + #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+6 ZERO, F 0 ONE, F 1 TWO, F 2 THREE, F 3 MINUS1, F -1 IND, 0;0;0 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 HINT, ORG .+3 KENT, ORG .+3 KQ, ORG .+3 K2, ORG .+3 LL, ORG .+3 N, ORG .+3 PBOTL, ORG .+3 SPK, ORG .+3 WD1, ORG .+3 WD1X, ORG .+3 WD2, ORG .+3 WD2X, ORG .+3 YEA, ORG .+3 #TMP, ORG .+30 #LIT, F 4 / Literals. Too many cause ST overflow F 5 /3 F 6 /6 F 8 /11 F 9 /14 F 10 /17 F 12 /22 F 15 /25 F 16 /30 F 17 /33 F 20 /36 F 22 /41 F 23 /44 F 24 /47 F 25 /52 F 26 /55 F 27 /60 F 30 /63 F 35 /66 F 37 /71 F 39 /74 F 40 /77 F 45 /102 F 49 /105 F 50 /110 F 54 /113 F 57 /116 F 58 /121 F 62 /124 F 65 /127 F 81 /132 F 29 /135 F 91 /140 F 92 /143 F 95 /146 F 99 /151 F 100 /154 F 105 /157 F 110 /162 F 115 /165 F 116 /170 F 117 /173 F 127 /176 F 128 /201 F 129 /204 F 130 /207 F 131 /212 F 132 /215 F 136 /220 F 140 /223 F 141 /226 F 143 /231 F 145 /234 F 162 /237 F 163 /242 F 165 /245 F 175 /250 F 184 /253 F 185 /256 F 186 /261 F 188 /264 F 192 /267 F 193 /272 F 197 /275 F 199 /300 F 201 /303 F 300 /306 F 500 /311 F 1000 /314 F 2500 /317 F 10000 /322 F 80 /325 F 60 /330 F 154 /333 TENTE, TEXT +ENTE + TPOUR, TEXT +POUR + TWEST, TEXT +WEST + TQUES, TEXT +?@ + TQDOT, TEXT +".@ + TYES, TEXT +YES + TYE, TEXT +YE + TY, TEXT +Y + #LBL=. COMMON ABBCOM ABB, ORG .+702 COMMON MISCOM LINUSE, ORG .+3 TRVS, ORG .+3 CLSSES, ORG .+3 OLDLOC, ORG .+3 LOC, ORG .+3 CVAL, ORG .+44 TK, ORG .+74 NEWLOC, ORG .+3 KEY, ORG .+702 PLAC, ORG .+454 FIXD, ORG .+454 ACTSPK, ORG .+151 COND, ORG .+702 HINTS, ORG .+360 HNTMAX, ORG .+3 PROP, ORG .+454 TALLY, ORG .+3 TALLY2, ORG .+3 HINTLC, ORG .+74 CHLOC, ORG .+3 CHLOC2, ORG .+3 DSEEN, ORG .+22 DFLAG, ORG .+3 DLOC, ORG .+22 DALTLC, ORG .+3 KEYS, ORG .+3 LAMP, ORG .+3 GRATE, ORG .+3 CAGE, ORG .+3 ROD, ORG .+3 ROD2, ORG .+3 STEPS, ORG .+3 BIRD, ORG .+3 DOOR, ORG .+3 PILLOW, ORG .+3 SNAKE, ORG .+3 FISSUR, ORG .+3 TABLET, ORG .+3 CLAM, ORG .+3 OYSTER, ORG .+3 MAGZIN, ORG .+3 DWARF, ORG .+3 KNIFE, ORG .+3 FOOD, ORG .+3 BOTTLE, ORG .+3 WATER, ORG .+3 OIL, ORG .+3 PLANT, ORG .+3 PLANT2, ORG .+3 AXE, ORG .+3 MIRROR, ORG .+3 DRAGON, ORG .+3 CHASM, ORG .+3 TROLL, ORG .+3 TROLL2, ORG .+3 BEAR, ORG .+3 MESSAG, ORG .+3 VEND, ORG .+3 BATTER, ORG .+3 NUGGET, ORG .+3 COINS, ORG .+3 CHEST, ORG .+3 EGGS, ORG .+3 TRIDNT, ORG .+3 VASE, ORG .+3 EMRALD, ORG .+3 PYRAM, ORG .+3 PEARL, ORG .+3 RUG, ORG .+3 CHAIN, ORG .+3 BACK, ORG .+3 LOOK, ORG .+3 CAVE, ORG .+3 NULL, ORG .+3 ENTRNC, ORG .+3 DPRSSN, ORG .+3 SAY, ORG .+3 LOCK, ORG .+3 THROW, ORG .+3 FIND, ORG .+3 INVENT, ORG .+3 TURNS, ORG .+3 LMWARN, ORG .+3 KNFLOC, ORG .+3 DETAIL, ORG .+3 ABBNUM, ORG .+3 NUMDIE, ORG .+3 MAXDIE, ORG .+3 DKILL, ORG .+3 FOOBAR, ORG .+3 BONUS, ORG .+3 CLOCK1, ORG .+3 CLOCK2, ORG .+3 CLOSNG, ORG .+3 PANIC, ORG .+3 CLOSED, ORG .+3 GAVEUP, ORG .+3 SCORNG, ORG .+3 ODLOC, ORG .+22 STREAM, ORG .+3 SPICES, ORG .+3 COMMON MISC2 I, ORG .+3 ORG .+3 /RTXSIZ ORG .+3 /CLSMAX ORG .+3 /LOCSIZ CTEXT, ORG .+44 STEXT, ORG .+702 LTEXT, ORG .+702 ORG .+3 /SECT TRAVEL, ORG .+1356 TRVCON, ORG .+1356 TRVLOC, ORG .+1356 TRVSIZ, ORG .+3 ORG .+3 /TABNDX OBJ, ORG .+3 J, ORG .+3 K, ORG .+3 VERB, ORG .+3 HNTSIZ, ORG .+3 MAXTRS, ORG .+3 HINTED, ORG .+74 ORG .+3 /HNTLOC KK, ORG .+3 COMMON PLACOM ATLOC, ORG .+702 LINK, ORG .+1130 PLACE, ORG .+454 FIXED, ORG .+454 HOLDNG, ORG .+3 COMMON PTXCOM PTEXT, ORG .+454 COMMON TXTCOM RTEXT, ORG .+1147 ORG .+44 /LINES ORG .+3 /ASCVAR ORG .+3 /TXTLOC ORG .+234 /DATA COMMON MISC3 ATTACK, ORG .+3 DTOTAL, ORG .+3 OLDLC2, ORG .+3 LIMIT, ORG .+3 MXSCOR, ORG .+3 SCORE, ORG .+3 STICK, ORG .+3 WZDARK, ORG .+3 ORG #LBL #25000, #RTN, BASE #BASE JA #GOBAK #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE STARTF JA #STRT /#G0001 / / Statement functions - called with JSA to save space / / TOTING(OBJ)=PLACE(OBJ).EQ.-1 TOTING, 0;0 ATX 3 FLDA PLACE-3,3 FADD ONE JSA #EQ JA TOTING / AT(OBJ)=PLACE(OBJ).EQ.LOC.OR.FIXED(OBJ).EQ.LOC AT, 0;0 ATX 3 FLDA PLACE-3,3 FSUB LOC JEQ ISAT FLDA FIXED-3,3 FSUB LOC ISAT, JSA #EQ JA AT / FORCED(LOC)=COND(LOC).EQ.2 FORCED, 0;0 ATX 3 FLDA COND-3,3 FSUB TWO JSA #EQ JA FORCED / HERE(OBJ) = PLACE(OBJ).EQ.LOC .OR. TOTING(OBJ) HERE, 0;0 JSA TOTING JNE ISHERE FLDA LOC FSUB PLACE-3,3 JEQ ISHERE FCLA JA HERE ISHERE, FLDA ONE JA HERE / DARK(DUMMY)=MOD(COND(LOC),2).EQ.0.AND.(PROP(LAMP).EQ.0.OR. / 1 .NOT.HERE(LAMP)) DARK, 0;0 / .OR. .NOT. HERE(LAMP) FLDA LAMP JSA HERE JEQ NOTHR / .OR. PROP(LAMP) EQ 0 FLDA PROP-3,3 JNE NOTDRK / MOD(COND(LOC),2) .EQ. 0 NOTHR, FLDA LOC / Either prop or not here ATX 4 FLDA COND-3,4 / COND(LOC) FDIV TWO / Divided by two JSA #FIX FMUL TWO FSTA #TMP+14 FLDA COND-3,4 / Get back COND(LOC) FSUB #TMP+14 / Now have mod JNE NOTDRK / If not zero, not dark FLDA ONE JA DARK NOTDRK, FCLA JA DARK / LIQ2(PBOTL)=(1-PBOTL)*WATER+(PBOTL/2)*(WATER+OIL) LIQ2, 0;0 FLDA ONE FSUB PBOTL / 1 - PBOTL FMUL WATER / (1-PBOTL)*WATER FSTA #TMP+14 / Store first term FLDA PBOTL FDIV TWO / PBOTL/2 JSA #FIX FSTA #TMP+6 FLDA WATER FADD OIL / WATER+OIL FMUL #TMP+6 / (PBOTL/2)*(WATER+OIL) FADD #TMP+14 JA LIQ2 / Done / LIQ(DUMMY)=LIQ2(MAX0(PROP(BOTTLE),-1-PROP(BOTTLE))) LIQ, 0;0 /PROP(BOTTLE) FLDA BOTTLE ATX 5 FLDA PROP-3,5 / PROP(BOTTLE) FSTA PBOTL FLDA MINUS1 FSUB PBOTL /-1-PROP(BOTTLE) FSTA #TMP+11 FLDA PBOTL / Find larger FSUB #TMP+11 JGT .+4 / already larger, now PBOTL FLDA #TMP+11 FSTA PBOTL / This is PBOTL JSA LIQ2 / Call LIQ2 with this JA LIQ / And return / LIQLOC(LOC)=LIQ2((MOD(COND(LOC)/2*2,8)-5)*MOD(COND(LOC)/4,2)+1) LIQLOC, 0;0 FLDA LOC / Always called with LOC as arg ATX 2 FLDA COND-3,2 / COND(LOC) FSTA #TMP+11 / Save that FDIV TWO JSA #FIX / COND(LOC)/2 FMUL TWO / COND(LOC)/2*2 FSTA #TMP+17 FDIV #LIT+11 / Modulo 8 JSA #FIX FMUL #LIT+11 FSTA #TMP+22 FLDA #TMP+17 FSUB #TMP+22 / MOD(...) FSUB #LIT+3 / -5. FSTA #TMP+25 / First Term FLDA #TMP+11 / COND(LOC) FDIV #LIT / COND(LOC)/4 JSA #FIX FSTA #TMP+17 FDIV TWO / Mod 2 JSA #FIX FMUL TWO FSTA #TMP+22 FLDA #TMP+17 FSUB #TMP+22 FMUL #TMP+25 / Multiply FADD ONE / +1 FSTA PBOTL / Finally got the term JSA LIQ2 / Send to LIQ2 JA LIQLOC / / Read the property field - object passed in FAC / RDPROP, 0;0 ATX 7 FLDA PROP-3,7 JA RDPROP / / Print a string / SPRINT, 0;0 LDX 0,1 STARTD FLDA SPRINT FSTA IND /Indirect pointer FLDA% IND,1 FSTA PTR FLDA% IND,1+ FSTA CNT FLDA D4 /Add four to skip arguments FADDM SPRINT STARTD JSR SIXOUT JA SPRINT PTR, 0;0 JA ZERO CNT, 0;0 D4, 0;4 / / Main routine entry point / #STRT, /1 I=RND(1) #1, JSR RND JA .+4 JA ONE FSTA I / HINTED(3)=YES(65,1,0) JSR YES JA .+10 JA #LIT+127 JA ONE JA ZERO FSTA HINTED+6 /HINTED(3) / NEWLOC=1 FLDA ONE FSTA NEWLOC / LOC = NEWLOC FSTA LOC / LIMIT=330 DECIMAL LDX 330,0 OCTAL XTA 0 FSTA LIMIT / IF(HINTED(3))LIMIT=1000 FLDA HINTED+6 /HINTED(3) JEQ #2 FLDA #LIT+314 FSTA LIMIT /2 IF(NEWLOC.GE.9.OR.NEWLOC.EQ.0.OR..NOT.CLOSNG)GOTO 71 #2, FLDA NEWLOC FSUB #LIT+14 JGE #71 FLDA NEWLOC JEQ #71 FLDA CLOSNG JEQ #71 / CALL RSPEAK(130) JSR RSPEAK JA .+4 JA #LIT+207 / NEWLOC=LOC FLDA LOC FSTA NEWLOC / IF(.NOT.PANIC)CLOCK2=15 FLDA PANIC JNE .+5 FLDA #LIT+25 FSTA CLOCK2 / PANIC=.TRUE. FLDA ONE FSTA PANIC /C /C SEE IF A DWARF HAS SEEN HIM AND HAS COME FROM WHERE HE WANTS TO GO. IF SO, /C THE DWARF'S BLOCKING HIS WAY. IF COMING FROM PLACE FORBIDDEN TO PIRATE /C (DWARVES ROOTED IN PLACE) LET HIM GET OUT (AND ATTACKED). /C /71 IF(NEWLOC.EQ.LOC.OR.FORCED(LOC).OR.BITSET(LOC,3))GOTO 74 #71, FLDA NEWLOC FSUB LOC JEQ #74 FLDA LOC JSA FORCED JNE #74 JSR BITSET JA .+6 JA LOC JA THREE JNE #74 / DO 73 I=1,5 FLDA ONE FSTA I / IF(ODLOC(I).NE.NEWLOC.OR..NOT.DSEEN(I))GOTO 73 #G0047, FLDA I ATX 7 FLDA ODLOC-3,7 FSUB NEWLOC JNE #73 FLDA DSEEN-3,7 JEQ #73 / NEWLOC=LOC FLDA LOC FSTA NEWLOC / CALL RSPEAK(2) JSR RSPEAK JA .+4 JA TWO / GOTO 74 JA #74 /73 CONTINUE #73, FLDA I FADD ONE FSTA I FSUB #LIT+3 JLE #G0047 #74, FLDA NEWLOC FSTA LOC /C /C DWARF STUFF. SEE EARLIER COMMENTS FOR DESCRIPTION OF VARIABLES. REMEMBER /C SIXTH DWARF IS PIRATE AND IS THUS VERY DIFFERENT EXCEPT FOR MOTION RULES. /C /C FIRST OFF, DON'T LET THE DWARVES FOLLOW HIM INTO A PIT OR A WALL. ACTIVATE /C THE WHOLE MESS THE FIRST TIME HE GETS AS FAR AS THE HALL OF MISTS (LOC 15). /C IF NEWLOC IS FORBIDDEN TO PIRATE (IN PARTICULAR, IF IT'S BEYOND THE TROLL /C BRIDGE), BYPASS DWARF STUFF. THAT WAY PIRATE CAN'T STEAL RETURN TOLL, AND /C DWARVES CAN'T MEET THE BEAR. ALSO MEANS DWARVES WON'T FOLLOW HIM INTO DEAD /C END IN MAZE, BUT C'EST LA VIE. THEY'LL WAIT FOR HIM OUTSIDE THE DEAD END. /C / IF(LOC.EQ.0.OR.FORCED(LOC).OR.BITSET(NEWLOC,3))GOTO 2000 / FLDA LOC JEQ #2000 / FLDA LOC JSA FORCED JNE #2000 JSR BITSET JA .+6 JA NEWLOC JA THREE JNE #2000 / IF(DFLAG.NE.0)GOTO 6000 FLDA DFLAG JNE #6000 / IF(LOC.GE.15)DFLAG=1 FLDA LOC FSUB #LIT+25 JLT #2000 FLDA ONE FSTA DFLAG / GOTO 2000 JA #2000 /C /C WHEN WE ENCOUNTER THE FIRST DWARF, WE KILL 0, 1, OR 2 OF THE 5 DWARVES. IF /C ANY OF THE SURVIVORS IS AT LOC, REPLACE HIM WITH THE ALTERNATE. /C /6000 IF(DFLAG.NE.1)GOTO 6010 #6000, FLDA DFLAG FSUB ONE JNE #6010 / IF(LOC.LT.15.OR.PCT(95))GOTO 2000 FLDA LOC FSUB #LIT+25 JLT #2000 JSR PCT JA .+4 JA #LIT+146 JNE #2000 / DFLAG=2 FLDA TWO FSTA DFLAG / DO 6001 I=1,2 FLDA ONE FSTA I / J=1+RND(5) #G0051, JSR RND JA .+4 JA #LIT+3 FADD ONE FSTA J /6001 IF(PCT(50))DLOC(J)=0 #6001, JSR PCT JA .+4 JA #LIT+110 JEQ .+10 FLDA J ATX 7 FCLA FSTA DLOC-3,7 FLDA I FADD ONE FSTA I FSUB TWO JLE #G0051 / DO 6002 I=1,5 FLDA ONE FSTA I / IF(DLOC(I).EQ.LOC)DLOC(I)=DALTLC #G0053, FLDA I ATX 7 FLDA DLOC-3,7 FSUB LOC JNE #6002 FLDA DALTLC FSTA DLOC-3,7 /6002 ODLOC(I)=DLOC(I) #6002, FLDA I ATX 7 FLDA DLOC-3,7 FSTA ODLOC-3,7 FLDA I FADD ONE FSTA I FSUB #LIT+3 JLE #G0053 / CALL RSPEAK(3) JSR RSPEAK JA .+4 JA THREE / CALL DROP(AXE,LOC) JSR DROP / GOTO 2000 JA #2000 JA AXE JA LOC /C /C THINGS ARE IN FULL SWING. MOVE EACH DWARF AT RANDOM, EXCEPT IF HE'S SEEN US /C HE STICKS WITH US. DWARVES NEVER GO TO LOCS <15. IF WANDERING AT RANDOM, /C THEY DON'T BACK UP UNLESS THERE'S NO ALTERNATIVE. IF THEY DON'T HAVE TO /C MOVE, THEY ATTACK. AND, OF COURSE, DEAD DWARVES DON'T DO MUCH OF ANYTHING. /C /6010 DTOTAL=0 #6010, FCLA FSTA DTOTAL / ATTACK=0 FSTA ATTACK / STICK=0 FSTA STICK / DO 6030 I=1,6 FLDA ONE FSTA I / IF (DLOC(I).EQ.0)GOTO 6030 #G0055, FLDA I ATX 7 FLDA DLOC-3,7 JEQ #6030 / J=1 FLDA ONE FSTA J / KK=DLOC(I) FLDA DLOC-3,7 FSTA KK / KK=KEY(KK) ATX 7 FLDA KEY-3,7 FSTA KK / IF(KK.EQ.0)GOTO 6016 JEQ #6016 /6012 NEWLOC=TRVLOC(KK) #6012, JSR GETWRD JA .+10 JA TRVLOC JA KK JA ZERO FSTA NEWLOC / IF(NEWLOC.GT.300.OR.NEWLOC.LT.15.OR.NEWLOC.EQ.ODLOC(I) / 1 .OR.(J.GT.1.AND.NEWLOC.EQ.TK(J-1)).OR.J.GE.20 / 2 .OR.NEWLOC.EQ.DLOC(I).OR.FORCED(NEWLOC) / 3 .OR.(I.EQ.6.AND.BITSET(NEWLOC,3)) / 4 .OR.TRVCON(KK).EQ.100)GOTO 6014 FSUB #LIT+306 JGT #6014 FLDA NEWLOC FSUB #LIT+25 JLT #6014 FLDA I ATX 7 FLDA NEWLOC FSUB ODLOC-3,7 JEQ #6014 FLDA J FSUB ONE JLE .+11 ATX 6 FLDA NEWLOC FSUB TK-3,6 JEQ #6014 FLDA J FSUB #LIT+36 JGE #6014 FLDA I ATX 7 FLDA NEWLOC FSUB DLOC-3,7 JEQ #6014 FLDA NEWLOC JSA FORCED JNE #6014 FLDA I FSUB #LIT+6 JNE .+14 JSR BITSET JA .+6 JA NEWLOC JA THREE JNE #6014 JSR GETWRD JA .+10 JA TRVCON JA KK JA ZERO FSUB #LIT+154 JEQ #6014 / TK(J)=NEWLOC FLDA J ATX 7 FLDA NEWLOC FSTA TK-3,7 / J=J+1 FLDA ONE FADDM J /6014 KK=KK+1 #6014, FLDA KK FADD ONE FSTA KK / IF(TRAVEL(KK-1).GE.0)GOTO 6012 FSUB ONE FSTA #TMP JSR GETWRD JA .+10 JA TRAVEL JA #TMP JA ZERO JGE #6012 /6016 TK(J)=ODLOC(I) #6016, FLDA J ATX 6 FLDA I ATX 7 FLDA ODLOC-3,7 FSTA TK-3,6 / IF(J.GE.2)J=J-1 FLDA J FSUB TWO JLT .+5 FLDA MINUS1 FADDM J / J=1+RND(J) JSR RND JA .+4 JA J FADD ONE FSTA J / ODLOC(I)=DLOC(I) FLDA DLOC-3,7 FSTA ODLOC-3,7 / DLOC(I)=TK(J) FLDA J ATX 6 FLDA TK-3,6 FSTA DLOC-3,7 / DSEEN(I)=(DSEEN(I).AND.LOC.GE.15) / 1 .OR.(DLOC(I).EQ.LOC.OR.ODLOC(I).EQ.LOC) FLDA LOC FSUB #LIT+25 JLT .+6 FLDA DSEEN-3,7 JNE .+21 FLDA DLOC-3,7 FSUB LOC JEQ .+13 FLDA ODLOC-3,7 FSUB LOC JEQ .+5 FCLA JA .+3 FLDA ONE FSTA DSEEN-3,7 / IF(.NOT.DSEEN(I))GOTO 6030 JEQ #6030 / DLOC(I)=LOC FLDA LOC FSTA DLOC-3,7 / IF(I.NE.6)GOTO 6027 FLDA I FSUB #LIT+6 JNE #6027 /C /C THE PIRATE'S SPOTTED HIM. HE LEAVES HIM ALONE ONCE WE'VE FOUND CHEST. /C K COUNTS IF A TREASURE IS HERE. IF NOT, AND TALLY=TALLY2 PLUS ONE FOR /C AN UNSEEN CHEST, LET THE PIRATE BE SPOTTED. /C / IF(LOC.EQ.CHLOC.OR.PROP(CHEST).GE.0)GOTO 6030 FLDA LOC FSUB CHLOC JEQ #6030 FLDA CHEST JSA RDPROP JGE #6030 / K=0 FCLA FSTA K / DO 6020 J=50,MAXTRS FLDA #LIT+110 FSTA J /C /C PIRATE WON'T TAKE PYRAMID FROM PLOVER ROOM OR DARK ROOM (TOO EASY!). /C / IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM) / 1 .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6020 #G0057, FLDA J FSUB PYRAM JNE .+24 FLDA PYRAM ATX 7 FLDA LOC FSUB PLAC-3,7 JEQ #6020 FLDA EMRALD ATX 6 FLDA LOC FSUB PLAC-3,6 JEQ #6020 / IF(TOTING(J))GOTO 6022 FLDA J JSA TOTING JNE #6022 /6020 IF(HERE(J))K=1 #6020, FLDA J JSA HERE JEQ .+5 FLDA ONE FSTA K FLDA J FADD ONE FSTA J FSUB MAXTRS JLE #G0057 / IF(TALLY.EQ.TALLY2+1.AND.K.EQ.0.AND.PLACE(CHEST).EQ.0 / 1 .AND.HERE(LAMP).AND.PROP(LAMP).EQ.1)GOTO 6025 FLDA TALLY2 FADD ONE FSUB TALLY JNE #M4 FLDA K JNE #M4 FLDA CHEST ATX 7 FLDA PLACE-3,7 JNE #M4 FLDA LAMP JSA HERE JEQ #M4 FLDA PROP-3,3 FSUB ONE JEQ #6025 / IF(ODLOC(6).NE.DLOC(6).AND.PCT(20))CALL RSPEAK(127) #M4, FLDA ODLOC+17 /ODLOC(6) FSUB DLOC+17 /DLOC(6) JEQ #6030 JSR PCT JA .+4 JA #LIT+36 JEQ #6030 JSR RSPEAK / GOTO 6030 JA #6030 JA #LIT+176 /C /6022 CALL RSPEAK(128) #6022, JSR RSPEAK JA .+4 JA #LIT+201 /C /C DON'T STEAL CHEST BACK FROM TROLL! /C / IF(PLACE(MESSAG).EQ.0)CALL MOVE(CHEST,CHLOC) FLDA MESSAG ATX 7 FLDA PLACE-3,7 JNE .+12 JSR MOVE JA .+6 JA CHEST JA CHLOC / CALL MOVE(MESSAG,CHLOC2) JSR MOVE JA .+6 JA MESSAG JA CHLOC2 / DO 6023 J=50,MAXTRS FLDA #LIT+110 FSTA J / IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM) / 1 .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6023 #G0063, FLDA J FSUB PYRAM JNE .+24 FLDA PYRAM ATX 7 FLDA LOC FSUB PLAC-3,7 JEQ #6023 FLDA EMRALD ATX 6 FLDA LOC FSUB PLAC-3,6 JEQ #6023 / IF(AT(J).AND.FIXED(J).EQ.0)CALL CARRY(J,LOC) FLDA J JSA AT JEQ .+16 / FLDA J / ATX 3 FLDA FIXED-3,3 JNE .+12 JSR CARRY JA .+6 JA J JA LOC / IF(TOTING(J))CALL DROP(J,CHLOC) FLDA J JSA TOTING JEQ #6023 JSR DROP JA .+6 JA J JA CHLOC /6023 CONTINUE #6023, FLDA J FADD ONE FSTA J FSUB MAXTRS JLE #G0063 /6024 DLOC(6)=CHLOC #6024, FLDA #LIT+6 ATX 7 FLDA CHLOC FSTA DLOC-3,7 / ODLOC(6)=CHLOC FSTA ODLOC-3,7 / DSEEN(6)=.FALSE. FCLA FSTA DSEEN-3,7 / GOTO 6030 JA #6030 /C /6025 CALL RSPEAK(186) #6025, JSR RSPEAK JA .+4 JA #LIT+261 / CALL MOVE(CHEST,CHLOC) JSR MOVE JA .+6 JA CHEST JA CHLOC / CALL MOVE(MESSAG,CHLOC2) JSR MOVE / GOTO 6024 JA #6024 JA MESSAG JA CHLOC2 /C /C THIS THREATENING LITTLE DWARF IS IN THE ROOM WITH HIM! /C /6027 DTOTAL=DTOTAL+1 #6027, FLDA ONE FADDM DTOTAL / IF(ODLOC(I).NE.DLOC(I))GOTO 6030 FLDA I ATX 7 FLDA ODLOC-3,7 FSUB DLOC-3,7 JNE #6030 / ATTACK=ATTACK+1 FLDA ONE FADDM ATTACK / IF(KNFLOC.GE.0)KNFLOC=LOC FLDA KNFLOC JLT .+6 FLDA LOC FSTA KNFLOC / IF(RND(1000).LT.95*(DFLAG-2))STICK=STICK+1 JSR RND JA .+4 JA #LIT+314 FSTA #TMP FLDA DFLAG FSUB TWO FMUL #LIT+146 FSUB #TMP JLT #6030 FLDA ONE FADDM STICK /6030 CONTINUE #6030, FLDA I FADD ONE FSTA I FSUB #LIT+6 JLE #G0055 /C /C NOW WE KNOW WHAT'S HAPPENING. LET'S TELL THE POOR SUCKER ABOUT IT. /C / IF(DTOTAL.EQ.0)GOTO 2000 FLDA DTOTAL JEQ #2000 / IF(DTOTAL.EQ.1)GOTO 75 FSUB ONE JEQ #75 / TYPE 67,DTOTAL /67 FORMAT(' There are ',I1,' threatening little dwarves in the' / 1 ,' room with you.') JSR SPRINT JA #67A JA TWO TRAP3 #WRITO JA #LIT JA #67 FLDA DTOTAL TRAP3 #RSVO TRAP3 #RENDO JSA SPRINT JA #67B JA ONE / GOTO 77 JA #77 /75 CALL RSPEAK(4) #75, JSR RSPEAK JA .+4 JA #LIT /77 IF(ATTACK.EQ.0)GOTO 2000 #77, FLDA ATTACK JEQ #2000 / IF(DFLAG.EQ.2)DFLAG=3 FLDA DFLAG FSUB TWO JNE .+5 FLDA THREE FSTA DFLAG / IF(ATTACK.EQ.1)GOTO 79 FLDA ATTACK FSUB ONE JEQ #79 / TYPE 78,ATTACK /78 FORMAT(' ',I1,' of them throw knives at you!') TRAP3 #WRITO JA #LIT JA #78 FLDA ATTACK TRAP3 #RSVO TRAP3 #RENDO JSA SPRINT JA #78B JA ONE / K=6 FLDA #LIT+6 FSTA K /82 IF(STICK.GT.1)GOTO 83 #82, FLDA STICK FSUB ONE JGT #83 / CALL RSPEAK(K+STICK) FLDA K FADD STICK FSTA #TMP JSR RSPEAK JA .+4 JA #TMP / IF(STICK.EQ.0)GOTO 2000 FLDA STICK JEQ #2000 / GOTO 84 JA #84 /83 TYPE 68,STICK #83, TRAP3 #WRITO JA #LIT JA #68 FLDA STICK TRAP3 #RSVO TRAP3 #RENDO /68 FORMAT(' ',I1,' of them get you!') JSA SPRINT JA #68B JA ONE /84 OLDLC2=LOC #84, FLDA LOC FSTA OLDLC2 / GOTO 99 JA #99 /C /79 CALL RSPEAK(5) #79, JSR RSPEAK JA .+4 JA #LIT+3 / K=52 DECIMAL LDX 52,0 OCTAL XTA 0 FSTA K / GOTO 82 JA #82 /C DESCRIBE THE CURRENT LOCATION AND (MAYBE) GET NEXT COMMAND. /C /C PRINT TEXT FOR CURRENT LOC. /C /2000 IF(LOC.EQ.0)GOTO 99 #2000, FLDA LOC JEQ #99 / KK=STEXT(LOC) FLDA LOC ATX 7 FLDA STEXT-3,7 FSTA KK / KENT=0 FCLA FSTA KENT / IF (ABBNUM.NE.0) KENT=MOD(ABB(LOC),ABBNUM) FLDA ABBNUM JEQ NOMOD / FLDA LOC / ATX 7 FLDA ABB-3,7 FSTA #TMP JSR MOD JA .+6 JA #TMP JA ABBNUM FSTA KENT / IF (KENT.EQ.0.OR.KK.EQ.0) KK=LTEXT(LOC) NOMOD, FLDA KENT JEQ .+6 FLDA KK JNE .+11 FLDA LOC ATX 7 FLDA LTEXT-3,7 FSTA KK / IF(FORCED(LOC).OR..NOT.DARK(0))GOTO 2001 FLDA LOC JSA FORCED JNE #2001 JSA DARK JEQ #2001 / IF(WZDARK.AND.PCT(35))GOTO 90 FLDA WZDARK JEQ .+12 JSR PCT JA .+4 JA #LIT+66 JNE #90 / KK=RTEXT(16) FLDA RTEXT+55 FSTA KK /2001 IF(TOTING(BEAR))CALL RSPEAK(141) #2001, FLDA BEAR JSA TOTING JEQ .+10 JSR RSPEAK JA .+4 JA #LIT+226 / CALL SPEAK(KK) JSR SPEAK JA .+4 JA KK / K=1 FLDA ONE FSTA K / IF(FORCED(LOC))GOTO 8 FLDA LOC JSA FORCED JNE #8 / IF(LOC.EQ.33.AND.PCT(25).AND..NOT.CLOSNG)CALL RSPEAK(8) DECIMAL LDX 33,0 OCTAL XTA 0 FSUB LOC JNE .+24 JSR PCT JA .+4 JA #LIT+52 JEQ .+14 FLDA CLOSNG JNE .+10 JSR RSPEAK JA .+4 JA #LIT+11 /C /C PRINT OUT DESCRIPTIONS OF OBJECTS AT THIS LOCATION. IF NOT CLOSING AND /C PROPERTY VALUE IS NEGATIVE, TALLY OFF ANOTHER TREASURE. RUG IS SPECIAL /C CASE; ONCE SEEN, ITS PROP IS 1 (DRAGON ON IT) TILL DRAGON IS KILLED. /C SIMILARLY FOR CHAIN; PROP IS INITIALLY 1 (LOCKED TO BEAR). THESE HACKS /C ARE BECAUSE PROP=0 IS NEEDED TO GET FULL SCORE. /C / IF(DARK(0))GOTO 2012 JSA DARK JNE #2012 / ABB(LOC)=ABB(LOC)+1 FLDA LOC ATX 4 FLDA ONE FADDM ABB-3,7 / I=ATLOC(LOC) FLDA ATLOC-3,7 FSTA I /2004 IF(I.EQ.0)GOTO 2012 #2004, FLDA I JEQ #2012 / OBJ=I FSTA OBJ / IF(OBJ.GT.100)OBJ=OBJ-100 FSUB #LIT+154 JLE .+4 / FLDA OBJ / FSUB #LIT+154 FSTA OBJ / IF(OBJ.EQ.STEPS.AND.TOTING(NUGGET))GOTO 2008 FLDA OBJ FSUB STEPS JNE .+10 FLDA NUGGET JSA TOTING JNE #2008 / IF(PROP(OBJ).GE.0)GOTO 2006 FLDA OBJ JSA RDPROP JGE #2006 / IF(CLOSED)GOTO 2008 FLDA CLOSED JNE #2008 / PROP(OBJ)=0 FCLA FSTA PROP-3,7 / IF(OBJ.EQ.RUG.OR.OBJ.EQ.CHAIN)PROP(OBJ)=1 FLDA OBJ FSUB RUG JEQ .+10 FLDA OBJ FSUB CHAIN JNE .+5 FLDA ONE FSTA PROP-3,7 / TALLY=TALLY-1 FLDA TALLY FADD MINUS1 FSTA TALLY /C IF REMAINING TREASURES TOO ELUSIVE, ZAP HIS LAMP. / IF(TALLY.EQ.TALLY2.AND.TALLY.NE.0)LIMIT=MIN0(35,LIMIT) JEQ #2006 FSUB TALLY2 JNE #2006 JSR MIN0 JA .+6 JA #LIT+66 JA LIMIT FSTA LIMIT /2006 KK=PROP(OBJ) #2006, FLDA OBJ JSA RDPROP FSTA KK / IF(OBJ.EQ.STEPS.AND.LOC.EQ.FIXED(STEPS))KK=1 FLDA OBJ FSUB STEPS JNE .+16 FLDA STEPS ATX 7 FLDA LOC FSUB FIXED-3,7 JNE .+5 FLDA ONE FSTA KK / CALL PSPEAK(OBJ,KK) JSR PSPEAK JA .+6 JA OBJ JA KK /2008 I=LINK(I) #2008, FLDA I ATX 7 FLDA LINK-3,7 FSTA I / GOTO 2004 JA #2004 /2009 K=54 #2009, FLDA #LIT+113 FSTA K /2010 SPK=K #2010, FLDA K FSTA SPK /2011 CALL RSPEAK(SPK) #2011, JSR RSPEAK JA .+4 JA SPK /2012 VERB=0 #2012, FCLA FSTA VERB / OBJ=0 FSTA OBJ /C /C CHECK IF THIS LOC IS ELIGIBLE FOR ANY HINTS. IF BEEN HERE LONG ENOUGH, /C BRANCH TO HELP SECTION (ON LATER PAGE). HINTS ALL COME BACK HERE EVENTUALLY /C TO FINISH THE LOOP. IGNORE "HINTS" < 4 (SPECIAL STUFF, SEE DATABASE NOTES). /C /2600 DO 2602 HINT=4,HNTMAX #2600, FLDA #LIT FSTA HINT / IF(HINTED(HINT))GOTO 2602 #G0102, FLDA HINT ATX 7 FLDA HINTED-3,7 JNE #2602 / IF(.NOT.BITSET(LOC,HINT))HINTLC(HINT)=-1 JSR BITSET JA .+6 JA LOC JA HINT JNE .+5 FLDA MINUS1 FSTA HINTLC-3,7 / HINTLC(HINT)=HINTLC(HINT)+1 FLDA ONE FADDM HINTLC-3,7 / IF(HINTLC(HINT).GE.HINTS(HINT,1))GOTO 40000 FLDA #LIT+36 / 20 FADD HINT / HINT,1 ATX 6 FLDA HINTLC-3,7 FSUB HINTS-77,6 JGE #40000 /2602 CONTINUE #2602, FLDA HINT FADD ONE FSTA HINT FSUB HNTMAX JLE #G0102 /C /C KICK THE RANDOM NUMBER GENERATOR JUST TO ADD VARIETY TO THE CHASE. ALSO, /C IF CLOSING TIME, CHECK FOR ANY OBJECTS BEING TOTED WITH PROP < 0 AND SET /C THE PROP TO -1-PROP. THIS WAY OBJECTS WON'T BE DESCRIBED UNTIL THEY'VE /C BEEN PICKED UP AND PUT DOWN SEPARATE FROM THEIR RESPECTIVE PILES. DON'T /C TICK CLOCK1 UNLESS WELL INTO CAVE (AND NOT AT Y2). /C / IF(.NOT.CLOSED)GOTO 2605 FLDA CLOSED JEQ #2605 / IF(PROP(OYSTER).LT.0.AND.TOTING(OYSTER)) / 1 CALL PSPEAK(OYSTER,1) FLDA OYSTER JSA TOTING JEQ .+16 FLDA PROP-3,3 JGE .+12 JSR PSPEAK JA .+6 JA OYSTER JA ONE / DO 2604 I=1,100 FLDA ONE FSTA I /2604 IF(TOTING(I).AND.PROP(I).LT.0)PROP(I)=-1-PROP(I) #2604, FLDA I JSA TOTING JEQ .+13 FLDA PROP-3,3 JGE .+7 FLDA MINUS1 FSUB PROP-3,3 FSTA PROP-3,3 FLDA I FADD ONE FSTA I FSUB #LIT+154 JLE #2604 /2605 WZDARK=DARK(0) #2605, JSA DARK FSTA WZDARK / IF(KNFLOC.GT.0.AND.KNFLOC.NE.LOC)KNFLOC=0 FLDA KNFLOC JLE .+11 FSUB LOC JEQ .+5 FCLA FSTA KNFLOC / I=RND(1) JSR RND JA .+4 JA ONE / CALL GETIN(WD1,WD1X,WD2,WD2X) JSR GETIN JA .+12 JA WD1 JA WD1X JA WD2 JA WD2X /C /C EVERY INPUT, CHECK "FOOBAR" FLAG. IF ZERO, NOTHING'S GOING ON. IF POS, /C MAKE NEG. IF NEG, HE SKIPPED A WORD, SO MAKE IT ZERO. /C /2608 FOOBAR=MIN0(0,-FOOBAR) #2608, FLDA FOOBAR FNEG FSTA #TMP JSR MIN0 JA .+6 JA ZERO JA #TMP FSTA FOOBAR / TURNS=TURNS+1 FLDA ONE FADDM TURNS /C IF(VERB.EQ.SAY.AND.WD2.NE.0)VERB=0 /C IF(VERB.EQ.SAY)GOTO 4090 / IF(TALLY.EQ.0.AND.LOC.GE.15.AND.LOC.NE.33)CLOCK1=CLOCK1-1 FLDA TALLY JNE .+23 FLDA LOC FSUB #LIT+25 JLT .+16 DECIMAL LDX 33,0 OCTAL XTA 0 FSUB LOC JEQ .+7 FLDA CLOCK1 FSUB ONE FSTA CLOCK1 / IF(CLOCK1.EQ.0)GOTO 10000 FLDA CLOCK1 JEQ #10000 / IF(CLOCK1.LT.0)CLOCK2=CLOCK2-1 JGE .+7 FLDA CLOCK2 FSUB ONE FSTA CLOCK2 / IF(CLOCK2.EQ.0)GOTO 11000 FLDA CLOCK2 JEQ #11000 / IF(PROP(LAMP).EQ.1)LIMIT=LIMIT-1 FLDA LAMP JSA RDPROP FSUB ONE JNE .+5 FLDA MINUS1 FADDM LIMIT / IF(LIMIT.LE.30.AND.HERE(BATTER).AND.PROP(BATTER).EQ.0 / 1 .AND.HERE(LAMP))GOTO 12000 FLDA LIMIT FSUB #LIT+63 JGT .+22 FLDA BATTER JSA HERE JEQ .+14 FLDA PROP-3,3 JNE .+10 FLDA LAMP JSA HERE JNE #12000 / IF(LIMIT.EQ.0)GOTO 12400 FLDA LIMIT JEQ #12400 / IF(LIMIT.LT.0.AND.LOC.LE.8)GOTO 12600 / FLDA LIMIT JGE .+7 FLDA LOC FSUB #LIT+11 JLE #12600 / IF(LIMIT.LE.30)GOTO 12200 FLDA LIMIT FSUB #LIT+63 JLE #12200 /19999 K=43 DECIMAL #19999, LDX 43,0 OCTAL XTA 0 FSTA K / IF(LIQLOC(LOC).EQ.WATER)K=70 JSA LIQLOC FSUB WATER JNE .+7 DECIMAL LDX 70,0 OCTAL XTA 0 FSTA K /C /C DO PRELIMINARY ANALYSIS OF SENTENCE TO FIND CERTAIN SPECIAL /C CASES, VIZ, /C /C ENTER <WATER,STREAM> /C ENTER <LOCATION> /C <WATER,OIL> <PLANT,DOOR> /C / CALL VOCAB(WD1,WD1A,-1,I) JSR VOCAB JA .+6 JA WD1 JA MINUS1 FSTA I / CALL VOCAB(WD2,WD2A,-1,J) JSR VOCAB JA .+6 JA WD2 JA MINUS1 FSTA J / IF(WD1.NE.'ENTE') GO TO 2609 FLDA WD1 FSUB TENTE JNE #2609 / IF(J .EQ. (WATER+1000) / 1 .OR. J .EQ. STREAM) GO TO 2010 FLDA WATER FADD #LIT+314 FSUB J JEQ #2010 FLDA J FSUB STREAM JEQ #2010 / IF(WD2 .NE. 0) GO TO 2800 FLDA WD2 JNE #2800 /2609 IF((I .NE. (WATER+1000) .AND. I .NE. (OIL+1000)) / 1 .OR. (J .NE. (PLANT+1000) .AND. J .NE. (DOOR+1000))) / 2 GO TO 2610 #2609, FLDA WATER FADD #LIT+314 FSUB I JEQ .+11 FLDA OIL FADD #LIT+314 FSUB I JNE #2610 FLDA PLANT FADD #LIT+314 FSUB J JEQ .+11 FLDA DOOR FADD #LIT+314 FSUB J JNE #2610 / WD2="POUR" FLDA TPOUR FSTA WD2 /2610 IF(WD1 .EQ. 'WEST' .AND. PCT(10)) / 1 CALL RSPEAK(17) #2610, FLDA WD1 FSUB TWEST JNE #2630 JSR PCT JA .+4 JA #LIT+17 JEQ #2630 JSR RSPEAK JA .+4 JA #LIT+33 /2630 CALL VOCAB(WD1,-1,I) #2630, JSR VOCAB JA .+6 JA WD1 JA MINUS1 FSTA I / IF(I.EQ.-1)GOTO 3000 FADD ONE JEQ #3000 / K=MOD(I,1000) JSR MOD JA .+6 JA I JA #LIT+314 FSTA K / KQ=I/1000+1 FLDA I FDIV #LIT+314 JSA #FIX FADD ONE FSTA KQ / GOTO (8,5000,4000,2010)KQ FLDA KQ ATX 1 STARTD FLDA .+2,1 STARTF JAC JA #8 JA #5000 JA #4000 JA #2010 / CALL BUG(22) JSR BUG JA .+4 JA #LIT+41 /C /C GET SECOND WORD FOR ANALYSIS. /C /2800 WD1=WD2 / WD1A=WD2A #2800, FLDA WD2 FSTA WD1 / WD1X=WD2X FLDA WD2X FSTA WD1X / WD2=0 FCLA FSTA WD2 / GOTO 2610 JA #2610 /C /C GEE, I DON'T UNDERSTAND. /C /3000 SPK=60 #3000, FLDA #LIT+330 FSTA SPK / IF(PCT(20))SPK=61 JSR PCT JA .+4 JA #LIT+36 JEQ .+6 DECIMAL LDX 61,0 OCTAL XTA 0 FSTA SPK / IF(PCT(20))SPK=13 JSR PCT JA .+4 JA #LIT+36 JEQ .+6 DECIMAL LDX 13,0 OCTAL XTA 0 FSTA SPK / CALL RSPEAK(SPK) JSR RSPEAK JA .+4 JA SPK / GOTO 2600 JA #2600 /C /C ANALYSE A VERB. REMEMBER WHAT IT WAS, GO BACK FOR OBJECT IF SECOND WORD /C UNLESS VERB IS "SAY", WHICH SNARFS ARBITRARY SECOND WORD. /C /4000 VERB=K #4000, FLDA K FSTA VERB / SPK=ACTSPK(VERB) ATX 7 FLDA ACTSPK-3,7 FSTA SPK / IF(WD2.NE.0.AND.VERB.NE.SAY)GOTO 2800 FLDA WD2 JEQ .+10 FLDA VERB FSUB SAY JNE #2800 / IF(VERB.EQ.SAY)OBJ=WD2 FLDA VERB FSUB SAY JNE .+5 FLDA WD2 FSTA OBJ / IF(OBJ.NE.0)GOTO 4090 FLDA OBJ FSUB ZERO JNE #4090 /C /C ANALYSE AN INTRANSITIVE VERB (IE, NO OBJECT GIVEN YET). /C /4080 GOTO(8010,8000,8000,8040,2009,8040,9070,9080,8000,8000, / 1 2011,9120,9130,8140,9150,8000,8000,8180,8000,8200, / 2 8000,9220,9230,8240,8250,8260,8270,8000,8000,8300, / 3 8310,8320)VERB /C TAKE DROP SAY OPEN NOTH LOCK ON OFF WAVE CALM /C WALK KILL POUR EAT DRNK RUB TOSS QUIT FIND INVN /C FEED FILL BLST SCOR FOO BRF READ BREK WAKE SUSP /C HOUR RESU #4080, FLDA VERB ATX 1 STARTD FLDA .+2,1 STARTF JAC JA #8010 JA #8000 JA #8000 JA #8040 JA #2009 JA #8040 JA #9070 JA #9080 JA #8000 JA #8000 JA #2011 JA #9120 JA #9130 JA #8140 JA #9150 JA #8000 JA #8000 JA #8180 JA #8000 JA #8200 JA #8000 JA #9220 JA #9230 JA #8240 JA #8250 JA #8260 JA #8270 JA #8000 JA #8000 JA #8300 JA #8310 JA #8320 / CALL BUG(23) JSR BUG JA .+4 JA #LIT+44 /C /C ANALYSE A TRANSITIVE VERB. /C /4090 GOTO(9010,9020,9030,9040,2009,9040,9070,9080,9090,2011, / 1 2011,9120,9130,9140,9150,9160,9170,2011,9190,9190, / 2 9210,9220,9230,2011,2011,2011,9270,9280,9290,2011, / 3 2011,2011)VERB /C TAKE DROP SAY OPEN NOTH LOCK ON OFF WAVE CALM /C WALK KILL POUR EAT DRNK RUB TOSS QUIT FIND INVN /C FEED FILL BLST SCOR FOO BRF READ BREK WAKE SUSP /C HOUR RESU #4090, FLDA VERB ATX 1 STARTD FLDA .+2,1 STARTF JAC JA #9010 JA #9020 JA #9030 JA #9040 JA #2009 JA #9040 JA #9070 JA #9080 JA #9090 JA #2011 JA #2011 JA #9120 JA #9130 JA #9140 JA #9150 JA #9160 JA #9170 JA #2011 JA #9190 JA #9190 JA #9210 JA #9220 JA #9230 JA #2011 JA #2011 JA #2011 JA #9270 JA #9280 JA #9290 JA #2011 JA #2011 JA #2011 JA #2011 / CALL BUG(24) JSR BUG JA .+4 JA #LIT+47 /C /C ANALYSE AN OBJECT WORD. SEE IF THE THING IS HERE, WHETHER WE'VE GOT A VERB /C YET, AND SO ON. OBJECT MUST BE HERE UNLESS VERB IS "FIND" OR "INVENT(ORY)" /C (AND NO NEW VERB YET TO BE ANALYSED). WATER AND OIL ARE ALSO FUNNY, SINCE /C THEY ARE NEVER ACTUALLY DROPPED AT ANY LOCATION, BUT MIGHT BE HERE INSIDE /C THE BOTTLE OR AS A FEATURE OF THE LOCATION. /C /5000 OBJ=K #5000, FLDA K FSTA OBJ / IF(FIXED(K).NE.LOC.AND..NOT.HERE(K))GOTO 5100 FLDA K ATX 7 FLDA FIXED-3,7 FSUB LOC JEQ #5010 FLDA K JSA HERE JEQ #5100 /5010 IF(WD2.NE.0)GOTO 2800 #5010, FLDA WD2 JNE #2800 / IF(VERB.NE.0)GOTO 4090 FLDA VERB JNE #4090 / TYPE 5015 /5015 FORMAT(' What do you want to do with the ',$) JSA SPRINT JA #5015 JA TWO / CALL A5TOA1(WD1,WD1A,WD1X,'?') JSR A5TOA1 JA .+10 JA WD1 JA WD1X JA TQUES TRAP3 #WRITO JA #LIT JA #LINEF+2 TRAP3 #RENDO / GOTO 2600 #LINEF, JA #2600 TEXT +(' ')+ /C /5100 IF(K.NE.GRATE)GOTO 5110 #5100, FLDA K FSUB GRATE JNE #5110 / IF(LOC.EQ.1.OR.LOC.EQ.4.OR.LOC.EQ.7)K=DPRSSN FLDA LOC FSUB ONE JEQ .+10 FSUB THREE JEQ .+5 FSUB THREE JNE .+6 FLDA DPRSSN FSTA K / IF(LOC.GT.9.AND.LOC.LT.15)K=ENTRNC FLDA LOC FSUB #LIT+14 JLE .+13 FLDA LOC FSUB #LIT+25 JGE .+6 FLDA ENTRNC FSTA K / IF(K.NE.GRATE)GOTO 8 FLDA K FSUB GRATE JNE #8 /5110 IF(K.NE.DWARF)GOTO 5120 #5110, FLDA K FSUB DWARF JNE #5120 / DO 5112 I=1,5 FLDA ONE FSTA I / IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 5010 #G0122, FLDA I ATX 7 FLDA DLOC-3,7 FSUB LOC JNE #5112 FLDA DFLAG FSUB TWO JGE #5010 /5112 CONTINUE #5112, FLDA I FADD ONE FSTA I FSUB #LIT+3 JLE #G0122 /5120 IF((LIQ(0).EQ.K.AND.HERE(BOTTLE)).OR.K.EQ.LIQLOC(LOC))GOTO 5010 #5120, JSA LIQ FSUB K JNE .+10 FLDA BOTTLE JSA HERE JNE #5010 JSA LIQLOC FSUB K JEQ #5010 / IF(OBJ.NE.PLANT.OR..NOT.AT(PLANT2).OR.PROP(PLANT2).EQ.0)GOTO 5130 FLDA OBJ FSUB PLANT JNE #5130 FLDA PLANT2 JSA AT JEQ #5130 / FLDA PLANT2 / ATX 3 FLDA PROP-3,3 JEQ #5130 / OBJ=PLANT2 FLDA PLANT2 FSTA OBJ / GOTO 5010 JA #5010 /5130 IF(OBJ.NE.KNIFE.OR.KNFLOC.NE.LOC)GOTO 5140 #5130, FLDA OBJ FSUB KNIFE JNE #5140 FLDA KNFLOC FSUB LOC JNE #5140 / KNFLOC=-1 FLDA MINUS1 FSTA KNFLOC / SPK=116 FLDA #LIT+170 FSTA SPK / GOTO 2011 JA #2011 /5140 IF(OBJ.NE.ROD.OR..NOT.HERE(ROD2))GOTO 5190 #5140, FLDA OBJ FSUB ROD JNE #5190 FLDA ROD2 JSA HERE JEQ #5190 / OBJ=ROD2 FLDA ROD2 FSTA OBJ / GOTO 5010 JA #5010 /5190 IF((VERB.EQ.FIND.OR.VERB.EQ.INVENT).AND.WD2.EQ.0)GOTO 5010 #5190, FLDA VERB FSUB INVENT JEQ .+10 FLDA VERB FSUB FIND JNE .+5 FLDA WD2 JEQ #5010 / TYPE 5199 JSA SPRINT JA #5199 JA TWO /5199 FORMAT(' I don''t see any ',$) / CALL A5TOA1(WD1,WD1A,WD1X,'.') / GOTO 2012 JSR A5TOA1 JA #2012 JA WD1 JA WD1X JA TQDOT /C FIGURE OUT THE NEW LOCATION /C /C GIVEN THE CURRENT LOCATION IN "LOC", AND A MOTION VERB NUMBER IN "K", PUT /C THE NEW LOCATION IN "NEWLOC". THE CURRENT LOC IS SAVED IN "OLDLOC" IN CASE /C HE WANTS TO RETREAT. THE CURRENT OLDLOC IS SAVED IN OLDLC2, IN CASE HE /C DIES. (IF HE DOES, NEWLOC WILL BE LIMBO, AND OLDLOC WILL BE WHAT KILLED /C HIM, SO WE NEED OLDLC2, WHICH IS THE LAST PLACE HE WAS SAFE.) /C /8 KK=KEY(LOC) #8, FLDA LOC ATX 7 FLDA KEY-3,7 FSTA KK / NEWLOC=LOC FLDA LOC FSTA NEWLOC / IF(KK.EQ.0)CALL BUG(26) FLDA KK JNE .+10 JSR BUG JA .+4 JA #LIT+55 / IF(K.EQ.NULL)GOTO 2 FLDA K FSUB NULL JEQ #2 / IF(K.EQ.BACK)GOTO 20 FLDA K FSUB BACK JEQ #20 / IF(K.EQ.LOOK)GOTO 30 FLDA K FSUB LOOK JEQ #30 / IF(K.EQ.CAVE)GOTO 40 FLDA K FSUB CAVE JEQ #40 / OLDLC2=OLDLOC FLDA OLDLOC FSTA OLDLC2 / OLDLOC=LOC FLDA LOC FSTA OLDLOC /C /9 LL=IABS(TRAVEL(KK)) #9, JSR GETWRD JA .+10 JA TRAVEL JA KK JA ZERO FSTA #TMP JSR IABS JA .+4 JA #TMP FSTA LL / IF(LL.EQ.1 .OR. LL.EQ.K)GOTO 10 FSUB ONE JEQ #10 FLDA LL FSUB K JEQ #10 / IF(TRAVEL(KK).LT.0)GOTO 50 JSR GETWRD JA .+10 JA TRAVEL JA KK JA ZERO JLT #50 / KK=KK+1 FLDA ONE FADDM KK / GOTO 9 JA #9 /C /10 NEWLOC=TRVCON(KK) #10, JSR GETWRD JA .+10 JA TRVCON JA KK JA ZERO FSTA NEWLOC / K=MOD(NEWLOC,100) JSR MOD JA .+6 JA NEWLOC JA #LIT+154 FSTA K / IF(NEWLOC.LE.300)GOTO 13 FLDA NEWLOC FSUB #LIT+306 JLE #13 / IF(PROP(K).NE.NEWLOC/100-3)GOTO 16 FLDA K ATX 7 FLDA NEWLOC FDIV #LIT+154 JSA #FIX FSUB THREE FSUB PROP-3,7 JNE #16 /C /C TRY NEXT ENTRY IN TRAVEL TABLE /C /12 IF(TRAVEL(KK).LT.0)CALL BUG(25) #12, JSR GETWRD JA .+10 JA TRAVEL JA KK JA ZERO JGE .+10 JSR BUG JA .+4 JA #LIT+52 / KK=KK+1 FLDA KK FSTA #TMP FADD ONE FSTA KK /C MAKE SURE HE DOESN'T GO THROUGH SAME TEST AGAIN /C / IF(TRVCON(KK-1).EQ.TRVCON(KK) .AND. TRVLOC(KK-1).EQ.TRVLOC(KK)) / 1 GOTO 12 JSR GETWRD JA .+10 JA TRVCON JA #TMP JA ZERO FSTA #TMP+3 JSR GETWRD JA .+10 JA TRVCON JA KK JA ZERO FSUB #TMP+3 JNE #10 JSR GETWRD JA .+10 JA TRVLOC JA #TMP JA ZERO FSTA #TMP+3 JSR GETWRD JA .+10 JA TRVLOC JA #TMP FSUB #TMP+3 JEQ #12 / GO TO 10 JA #10 /C /13 IF(NEWLOC.LE.100)GOTO 14 #13, FLDA NEWLOC FSUB #LIT+154 JLE #14 / IF(TOTING(K).OR.(NEWLOC.GT.200.AND.AT(K)))GOTO 16 FLDA K JSA TOTING JNE #16 DECIMAL LDX 200,0 OCTAL XTA 0 FSUB NEWLOC JGT #12 FLDA K JSA AT JNE #16 / GOTO 12 JA #12 /C /14 IF(NEWLOC.NE.0.AND..NOT.PCT(NEWLOC))GOTO 12 #14, FLDA NEWLOC JEQ #16 JSR PCT JA .+4 JA NEWLOC JEQ #12 /16 NEWLOC=TRVLOC(KK) #16, JSR GETWRD JA .+10 JA TRVLOC JA KK JA ZERO FSTA NEWLOC / IF(NEWLOC.LE.300)GOTO 2 FSUB #LIT+306 JLE #2 / IF(NEWLOC.LE.500)GOTO 30000 FLDA NEWLOC FSUB #LIT+311 JLE #30000 / CALL RSPEAK(NEWLOC-500) / FLDA NEWLOC / FSUB #LIT+311 FSTA #TMP JSR RSPEAK JA .+4 JA #TMP / NEWLOC=LOC FLDA LOC FSTA NEWLOC / GOTO 2 JA #2 /C /C SPECIAL MOTIONS COME HERE. LABELLING CONVENTION: STATEMENT NUMBERS NNNXX /C (XX=00-99) ARE USED FOR SPECIAL CASE NUMBER NNN (NNN=301-500). /C /30000 NEWLOC=NEWLOC-300 #30000, FLDA NEWLOC FSUB #LIT+306 FSTA NEWLOC / GOTO (30100,30200,30300)NEWLOC / FLDA NEWLOC ATX 1 STARTD FLDA .+2,1 STARTF JAC JA #30100 JA #30200 JA #30300 / CALL BUG(20) JSR BUG JA .+4 JA #LIT+36 /C /C TRAVEL 301. PLOVER-ALCOVE PASSAGE. CAN CARRY ONLY EMERALD. NOTE: TRAVEL /C TABLE MUST INCLUDE "USELESS" ENTRIES GOING THROUGH PASSAGE, WHICH CAN NEVER /C BE USED FOR ACTUAL MOTION, BUT CAN BE SPOTTED BY "GO BACK". /C /30100 NEWLOC=99+100-LOC #30100, FLDA #LIT+300 /199 FSUB LOC FSTA NEWLOC / IF(HOLDNG.EQ.0.OR.(HOLDNG.EQ.1.AND.TOTING(EMRALD)))GOTO 2 FLDA HOLDNG JEQ #2 FSUB ONE JNE #M27 FLDA EMRALD JSA TOTING JNE #2 / NEWLOC=LOC #M27, FLDA LOC FSTA NEWLOC / CALL RSPEAK(117) / GOTO 2 JSR RSPEAK JA #2 JA #LIT+173 /C /C TRAVEL 302. PLOVER TRANSPORT. DROP THE EMERALD (ONLY USE SPECIAL TRAVEL IF /C TOTING IT), SO HE'S FORCED TO USE THE PLOVER-PASSAGE TO GET IT OUT. HAVING /C DROPPED IT, GO BACK AND PRETEND HE WASN'T CARRYING IT AFTER ALL. /C /30200 CALL DROP(EMRALD,LOC) /GOTO 12 #30200, JSR DROP JA #12 JA EMRALD JA LOC /C /C TRAVEL 303. TROLL BRIDGE. MUST BE DONE ONLY AS SPECIAL MOTION SO THAT /C DWARVES WON'T WANDER ACROSS AND ENCOUNTER THE BEAR. (THEY WON'T FOLLOW THE /C PLAYER THERE BECAUSE THAT REGION IS FORBIDDEN TO THE PIRATE.) IF /C PROP(TROLL)=1, HE'S CROSSED SINCE PAYING, SO STEP OUT AND BLOCK HIM. /C (STANDARD TRAVEL ENTRIES CHECK FOR PROP(TROLL)=0.) SPECIAL STUFF FOR BEAR. /C /30300 IF(PROP(TROLL).NE.1)GOTO 30310 #30300, FLDA TROLL JSA RDPROP FSUB ONE JNE #30310 / CALL PSPEAK(TROLL,1) JSR PSPEAK JA .+6 JA TROLL JA ONE / PROP(TROLL)=0 FCLA FSTA PROP-3,7 / CALL MOVE(TROLL2,0) JSR MOVE JA .+6 JA TROLL2 JA ZERO / CALL MOVE(TROLL2+100,0) FLDA TROLL2 FADD #LIT+154 FSTA #TMP JSR MOVE JA .+6 JA #TMP JA ZERO / CALL MOVE(TROLL,PLAC(TROLL)) FLDA TROLL ATX 7 FLDA PLAC-3,7 FSTA #TMP JSR MOVE JA .+6 JA TROLL JA #TMP / CALL MOVE(TROLL+100,FIXD(TROLL)) FLDA TROLL ATX 7 FADD #LIT+154 FSTA #TMP FLDA FIXD-3,7 FSTA #TMP+3 JSR MOVE JA .+6 JA #TMP JA #TMP+3 / CALL JUGGLE(CHASM) FLDA CHASM JSA JUGGLE / NEWLOC=LOC FLDA LOC FSTA NEWLOC / GOTO 2 JA #2 /C /30310 NEWLOC=PLAC(TROLL)+FIXD(TROLL)-LOC #30310, FLDA TROLL ATX 7 FLDA PLAC-3,7 FADD FIXD-3,7 FSUB LOC FSTA NEWLOC / IF(PROP(TROLL).EQ.0)PROP(TROLL)=1 FLDA PROP-3,7 JNE .+5 FLDA ONE FSTA PROP-3,7 / IF(.NOT.TOTING(BEAR))GOTO 2 FLDA BEAR JSA TOTING JEQ #2 / CALL RSPEAK(162) JSR RSPEAK JA .+4 JA #LIT+237 / PROP(CHASM)=1 FLDA CHASM ATX 7 FLDA ONE FSTA PROP-3,7 / PROP(TROLL)=2 FLDA TROLL ATX 7 FLDA TWO FSTA PROP-3,7 / CALL DROP(BEAR,NEWLOC) JSR DROP JA .+6 JA BEAR JA NEWLOC / FIXED(BEAR)=-1 FLDA BEAR ATX 7 FLDA MINUS1 FSTA FIXED-3,7 / PROP(BEAR)=3 FLDA THREE FSTA PROP-3,7 / IF(PROP(SPICES).LT.0)TALLY2=TALLY2+1 FLDA SPICES JSA RDPROP JGE .+7 FLDA TALLY2 FADD ONE FSTA TALLY2 / OLDLC2=NEWLOC FLDA NEWLOC FSTA OLDLC2 / GOTO 99 JA #99 /C /C END OF SPECIALS. /C /C HANDLE "GO BACK". LOOK FOR VERB WHICH GOES FROM LOC TO OLDLOC, OR TO OLDLC2 /C IF OLDLOC HAS FORCED-MOTION. K2 SAVES ENTRY -> FORCED LOC -> PREVIOUS LOC. /C /20 K=OLDLOC #20, FLDA OLDLOC FSTA K / IF(FORCED(K))K=OLDLC2 / FLDA K JSA FORCED JEQ .+6 FLDA OLDLC2 FSTA K / OLDLC2=OLDLOC FLDA OLDLOC FSTA OLDLC2 / OLDLOC=LOC FLDA LOC FSTA OLDLOC / K2=0 FCLA FSTA K2 / IF(K.NE.LOC)GOTO 21 FLDA K FSUB LOC JNE #21 / CALL RSPEAK(91) / GOTO 2 JSR RSPEAK JA #2 JA #LIT+140 /C /21 LL=TRVLOC(KK) #21, JSR GETWRD JA .+10 JA TRVLOC JA KK JA ZERO FSTA LL / IF(LL.EQ.K)GOTO 25 FSUB K JEQ #25 / IF(LL.GT.300)GOTO 22 FLDA LL FSUB #LIT+306 JGT #22 / J=KEY(LL) FLDA LL ATX 7 FLDA KEY-3,7 FSTA J / IF(FORCED(LL).AND.TRVLOC(KK).EQ.K)K2=KK FLDA LL JSA FORCED JEQ #22 JSR GETWRD JA .+10 JA TRVLOC JA KK JA ZERO FSUB K JNE #22 FLDA KK FSTA K2 /22 IF(TRAVEL(KK).LT.0)GOTO 23 #22, JSR GETWRD JA .+10 JA TRAVEL JA KK JA ZERO JLT #23 / KK=KK+1 FLDA ONE FADDM KK / GOTO 21 JA #21 /C /23 KK=K2 #23, FLDA K2 FSTA KK / IF(KK.NE.0)GOTO 25 JNE #25 / CALL RSPEAK(140) / GOTO 2 JSR RSPEAK JA #2 JA #LIT+223 /C /25 K=IABS(TRAVEL(KK)) #25, JSR GETWRD JA .+10 JA TRAVEL JA KK JA ZERO FSTA #TMP JSR IABS JA .+4 JA #TMP FSTA K / KK=KEY(LOC) FLDA LOC ATX 7 FLDA KEY-3,7 FSTA KK / GOTO 9 JA #9 /C /C LOOK. CAN'T GIVE MORE DETAIL. PRETEND IT WASN'T DARK (THOUGH IT MAY "NOW" /C BE DARK) SO HE WON'T FALL INTO A PIT WHILE STARING INTO THE GLOOM. /C /30 IF(DETAIL.LT.3)CALL RSPEAK(15) #30, FLDA DETAIL FSUB THREE JGE .+10 JSR RSPEAK JA .+4 JA #LIT+25 / DETAIL=DETAIL+1 FLDA ONE FADDM DETAIL / WZDARK=.FALSE. FCLA FSTA WZDARK / ABB(LOC)=0 FLDA LOC ATX 7 FCLA FSTA ABB-3,7 / GOTO 2 JA #2 /C /C CAVE. DIFFERENT MESSAGES DEPENDING ON WHETHER ABOVE GROUND. /C /40 IF(LOC.LT.8)CALL RSPEAK(57) #40, FLDA LOC FSUB #LIT+11 JGE .+10 JSR RSPEAK JA #2 JA #LIT+116 / IF(LOC.GE.8)CALL RSPEAK(58) / GOTO 2 JSR RSPEAK JA #2 JA #LIT+121 /C /C NON-APPLICABLE MOTION. VARIOUS MESSAGES DEPENDING ON WORD GIVEN. /C /50 SPK=12 #50, FLDA #LIT+22 FSTA SPK / IF(K.GE.43.AND.K.LE.50)SPK=9 DECIMAL LDX 43,0 OCTAL XTA 0 FSUB K JGT .+7 FLDA K FSUB #LIT+110 JLE #M31 / IF(K.EQ.29.OR.K.EQ.30)SPK=9 FLDA #LIT+135 FSUB K JEQ #M31 FADD ONE JNE .+6 #M31, FLDA #LIT+14 FSTA SPK JA #M32 / IF(K.EQ.7.OR.K.EQ.36.OR.K.EQ.37)SPK=10 LDX 7,0 XTA 0 FSUB K JEQ #M34 DECIMAL LDX 36,0 OCTAL XTA 0 FSUB K JEQ #M34 FADD ONE JNE #M35 #M34, FLDA #LIT+17 FSTA SPK JA #M32 / IF(K.EQ.11.OR.K.EQ.19)SPK=11 #M35, DECIMAL LDX 11,0 OCTAL XTA 0 FSUB K JEQ #M36 DECIMAL LDX 19,0 OCTAL XTA 0 FSUB K JNE #M32 #M36, DECIMAL LDX 11,0 OCTAL XTA 0 FSTA SPK / IF(VERB.EQ.FIND.OR.VERB.EQ.INVENT)SPK=59 #M32, FLDA VERB FSUB INVENT JEQ #M37 FLDA VERB FSUB FIND JNE #M38 #M37, DECIMAL LDX 59,0 OCTAL XTA 0 FSTA SPK / IF(K.EQ.62.OR.K.EQ.65)SPK=42 #M38, FLDA K FSUB #LIT+124 JEQ #M39 FSUB THREE JNE #M40 #M39, DECIMAL LDX 42,0 OCTAL XTA 0 FSTA SPK / IF(K.EQ.17)SPK=80 #M40, FLDA K FSUB #LIT+33 JNE #M33 FLDA #LIT+325 FSTA SPK / CALL RSPEAK(SPK) / GOTO 2 #M33, JSR RSPEAK JA #2 JA SPK /C "YOU'RE DEAD, JIM." /C /C IF THE CURRENT LOC IS ZERO, IT MEANS THE CLOWN GOT HIMSELF KILLED. WE'LL /C ALLOW THIS MAXDIE TIMES. MAXDIE IS AUTOMATICALLY SET BASED ON THE NUMBER OF /C SNIDE MESSAGES AVAILABLE. EACH DEATH RESULTS IN A MESSAGE (81, 83, ETC.) /C WHICH OFFERS REINCARNATION; IF ACCEPTED, THIS RESULTS IN MESSAGE 82, 84, /C ETC. THE LAST TIME, IF HE WANTS ANOTHER CHANCE, HE GETS A SNIDE REMARK AS /C WE EXIT. WHEN REINCARNATED, ALL OBJECTS BEING CARRIED GET DROPPED AT OLDLC2 /C (PRESUMABLY THE LAST PLACE PRIOR TO BEING KILLED) WITHOUT CHANGE OF PROPS. /C THE LOOP RUNS BACKWARDS TO ASSURE THAT THE BIRD IS DROPPED BEFORE THE CAGE. /C (THIS KLUGE COULD BE CHANGED ONCE WE'RE SURE ALL REFERENCES TO BIRD AND CAGE /C ARE DONE BY KEYWORDS.) THE LAMP IS A SPECIAL CASE (IT WOULDN'T DO TO LEAVE /C IT IN THE CAVE). IT IS TURNED OFF AND LEFT OUTSIDE THE BUILDING (ONLY IF HE /C WAS CARRYING IT, OF COURSE). HE HIMSELF IS LEFT INSIDE THE BUILDING (AND /C HEAVEN HELP HIM IF HE TRIES TO XYZZY BACK INTO THE CAVE WITHOUT THE LAMP!). /C OLDLOC IS ZAPPED SO HE CAN'T JUST "RETREAT". /C /C THE EASIEST WAY TO GET KILLED IS TO FALL INTO A PIT IN PITCH DARKNESS. /C /90 CALL RSPEAK(23) #90, JSR RSPEAK JA .+4 JA #LIT+44 / OLDLC2=LOC FLDA LOC FSTA OLDLC2 /C /C OKAY, HE'S DEAD. LET'S GET ON WITH IT. /C /99 IF(CLOSNG)GOTO 95 #99, FLDA CLOSNG JNE #95 / YEA=YES(81+NUMDIE*2,82+NUMDIE*2,54) FLDA NUMDIE FADD NUMDIE FADD #LIT+132 FSTA #TMP FADD ONE FSTA #TMP+3 JSR YES JA .+10 JA #TMP JA #TMP+3 JA #LIT+113 FSTA YEA / NUMDIE=NUMDIE+1 FLDA NUMDIE FADD ONE FSTA NUMDIE / IF(NUMDIE.EQ.MAXDIE.OR..NOT.YEA)GOTO 20000 FSUB MAXDIE JEQ #20000 FLDA YEA JEQ #20000 / PLACE(WATER)=0 FLDA WATER ATX 7 FCLA FSTA PLACE-3,7 / PLACE(OIL)=0 FLDA OIL ATX 7 FCLA FSTA PLACE-3,7 / IF(TOTING(LAMP))PROP(LAMP)=0 FLDA LAMP JSA TOTING JEQ .+5 FCLA FSTA PROP-3,3 / DO 98 J=1,100 FLDA ONE FSTA J / I=101-J #G0150, DECIMAL LDX 101,0 OCTAL XTA 0 FSUB J FSTA I / IF(.NOT.TOTING(I))GOTO 98 JSA TOTING JEQ #98 / K=OLDLC2 FLDA OLDLC2 FSTA K / IF(I.EQ.LAMP)K=1 FLDA I FSUB LAMP JNE .+5 FLDA ONE FSTA K / CALL DROP(I,K) JSR DROP JA .+6 JA I JA K /98 CONTINUE #98, FLDA J FADD ONE FSTA J FSUB #LIT+154 JLE #G0150 / LOC=3 FLDA THREE / OLDLOC=LOC FSTA LOC FSTA OLDLOC / GOTO 2000 JA #2000 /C /C HE DIED DURING CLOSING TIME. NO RESURRECTION. TALLY UP A DEATH AND EXIT. /C /95 CALL RSPEAK(131) #95, JSR RSPEAK JA .+4 JA #LIT+212 / NUMDIE=NUMDIE+1 FLDA ONE FADDM NUMDIE / GOTO 20000 JA #20000 /C ROUTINES FOR PERFORMING THE VARIOUS ACTION VERBS /C /C STATEMENT NUMBERS IN THIS SECTION ARE 8000 FOR INTRANSITIVE VERBS, 9000 FOR /C TRANSITIVE, PLUS TEN TIMES THE VERB NUMBER. MANY INTRANSITIVE VERBS USE THE /C TRANSITIVE CODE, AND SOME VERBS USE CODE FOR OTHER VERBS, AS NOTED BELOW. /C /C RANDOM INTRANSITIVE VERBS COME HERE. CLEAR OBJ JUST IN CASE (SEE "ATTACK"). /C /8000 TYPE 8002 #8000, JSA SPRINT JA #8002 JA TWO /8002 FORMAT(' I don''t understand "',$) / CALL A5TOA1(WD1,WD1A,WD1X,'".') JSR A5TOA1 JA .+10 JA WD1 JA WD1X JA TQDOT / OBJ=0 FCLA FSTA OBJ TRAP3 #WRITO JA #LIT JA #LINEF+2 TRAP3 #RENDO / GOTO 2600 JA #2600 /C /C CARRY, NO OBJECT GIVEN YET. OK IF ONLY ONE OBJECT PRESENT. /C /8010 IF(ATLOC(LOC).EQ.0.OR.LINK(ATLOC(LOC)).NE.0)GOTO 8000 #8010, FLDA LOC ATX 7 FLDA ATLOC-3,7 JEQ #8000 ATX 6 FLDA LINK-3,6 JNE #8000 / DO 8012 I=1,5 FLDA ONE FSTA I / IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 8000 #G0152, FLDA I ATX 7 FLDA DLOC-3,7 FSUB LOC JNE #8012 FLDA DFLAG FSUB TWO JGE #8000 /8012 CONTINUE #8012, FLDA I FADD ONE FSTA I FSUB #LIT+3 JLE #G0152 / OBJ=ATLOC(LOC) FLDA LOC ATX 7 FLDA ATLOC-3,7 FSTA OBJ /C /C CARRY AN OBJECT. SPECIAL CASES FOR BIRD AND CAGE (IF BIRD IN CAGE, CAN'T /C TAKE ONE WITHOUT THE OTHER. LIQUIDS ALSO SPECIAL, SINCE THEY DEPEND ON /C STATUS OF BOTTLE. ALSO VARIOUS SIDE EFFECTS, ETC. /C /9010 IF(TOTING(OBJ))GOTO 2011 #9010, FLDA OBJ JSA TOTING JNE #2011 / SPK=25 FLDA #LIT+52 FSTA SPK / IF(OBJ.EQ.PLANT.AND.PROP(PLANT).LE.0)SPK=115 FLDA OBJ FSUB PLANT JNE .+12 FLDA PLANT JSA RDPROP JGT .+4 FLDA #LIT+165 FSTA SPK / IF(OBJ.EQ.BEAR.AND.PROP(BEAR).EQ.1)SPK=169 FLDA OBJ FSUB BEAR JNE .+15 FLDA BEAR JSA RDPROP FSUB ONE JNE .+6 DECIMAL LDX 169,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.CHAIN.AND.PROP(BEAR).NE.0)SPK=170 FLDA OBJ FSUB CHAIN JNE .+14 FLDA BEAR JSA RDPROP JEQ .+6 DECIMAL LDX 170,0 OCTAL XTA 0 FSTA SPK / IF(FIXED(OBJ).NE.0)GOTO 2011 FLDA OBJ ATX 7 FLDA FIXED-3,7 JNE #2011 / IF(OBJ.NE.WATER.AND.OBJ.NE.OIL)GOTO 9017 FLDA OBJ FSUB WATER JEQ .+10 FLDA OBJ FSUB OIL JNE #9017 / IF(HERE(BOTTLE).AND.LIQ(0).EQ.OBJ)GOTO 9018 FLDA BOTTLE JSA HERE JEQ .+10 JSA LIQ FSUB OBJ JEQ #9018 / OBJ=BOTTLE FLDA BOTTLE FSTA OBJ / IF(TOTING(BOTTLE).AND.PROP(BOTTLE).EQ.1)GOTO 9220 FLDA BOTTLE JSA TOTING JEQ .+7 FLDA PROP-3,3 FSUB ONE JEQ #9220 / IF(PROP(BOTTLE).NE.1)SPK=105 FLDA PROP-3,3 FSUB ONE JEQ .+4 FLDA #LIT+157 FSTA SPK / IF(.NOT.TOTING(BOTTLE))SPK=104 FLDA BOTTLE JSA TOTING JNE #2011 DECIMAL LDX 104,0 OCTAL XTA 0 FSTA SPK / GOTO 2011 JA #2011 /9018 OBJ=BOTTLE #9018, FLDA BOTTLE FSTA OBJ /9017 IF(HOLDNG.LT.7)GOTO 9016 #9017, LDX 7,0 XTA 0 FSUB HOLDNG JGE #9016 / CALL RSPEAK(92) JSR RSPEAK JA #2012 JA #LIT+143 / GOTO 2012 /9016 IF(OBJ.NE.BIRD)GOTO 9014 #9016, FLDA OBJ FSUB BIRD JNE #9014 / IF(PROP(BIRD).NE.0)GOTO 9014 FLDA BIRD JSA RDPROP JNE #9014 / IF(.NOT.TOTING(ROD))GOTO 9013 FLDA ROD JSA TOTING JEQ #9013 / CALL RSPEAK(26) JSR RSPEAK JA #2012 JA #LIT+55 / GOTO 2012 /9013 IF(TOTING(CAGE))GOTO 9015 #9013, FLDA CAGE JSA TOTING JNE #9015 / CALL RSPEAK(27) JSR RSPEAK JA #2012 JA #LIT+60 / GOTO 2012 /9015 PROP(BIRD)=1 #9015, FLDA BIRD ATX 7 FLDA ONE FSTA PROP-3,7 /9014 IF((OBJ.EQ.BIRD.OR.OBJ.EQ.CAGE).AND.PROP(BIRD).NE.0) / 1 CALL CARRY(BIRD+CAGE-OBJ,LOC) #9014, FLDA OBJ FSUB BIRD JEQ .+10 FLDA OBJ FSUB CAGE JNE .+27 FLDA BIRD JSA RDPROP JEQ .+21 FLDA BIRD FADD CAGE FSUB OBJ FSTA #TMP JSR CARRY JA .+6 JA #TMP JA LOC / CALL CARRY(OBJ,LOC) JSR CARRY JA .+6 JA OBJ JA LOC / K=LIQ(0) JSA LIQ FSTA K / IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=-1 FLDA OBJ FSUB BOTTLE JNE #2009A FLDA K JEQ #2009A ATX 7 FLDA MINUS1 FSTA PLACE-3,7 / GOTO 2009 #2009A, DECIMAL LDX 202,0 OCTAL XTA 0 FSTA K /RHM - "Taken" message JA #2010 /C /C DISCARD OBJECT. "THROW" ALSO COMES HERE FOR MOST OBJECTS. SPECIAL CASES FOR /C BIRD (MIGHT ATTACK SNAKE OR DRAGON) AND CAGE (MIGHT CONTAIN BIRD) AND VASE. /C DROP COINS AT VENDING MACHINE FOR EXTRA BATTERIES. /C /9020 IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2 #9020, FLDA ROD2 JSA TOTING JEQ .+22 FLDA OBJ FSUB ROD JNE .+14 FLDA ROD JSA TOTING JNE .+6 FLDA ROD2 FSTA OBJ / IF(.NOT.TOTING(OBJ))GOTO 2011 FLDA OBJ JSA TOTING JEQ #2011 / IF(OBJ.NE.BIRD.OR..NOT.HERE(SNAKE))GOTO 9024 FLDA OBJ FSUB BIRD JNE #9024 FLDA SNAKE JSA HERE JEQ #9024 / CALL RSPEAK(30) JSR RSPEAK JA .+4 JA #LIT+63 / IF(CLOSED)GOTO 19000 FLDA CLOSED JNE #19000 / CALL DSTROY(SNAKE) FLDA SNAKE JSA DSTROY /C /C SET PROP FOR USE BY TRAVEL OPTIONS /C / PROP(SNAKE)=1 FLDA SNAKE ATX 7 FLDA ONE FSTA PROP-3,7 /9021 K=LIQ(0) #9021, JSA LIQ FSTA K / IF(K.EQ.OBJ)OBJ=BOTTLE FSUB OBJ JNE .+6 FLDA BOTTLE FSTA OBJ / IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=0 FLDA OBJ FSUB BOTTLE JNE .+12 FLDA K JEQ .+6 ATX 7 FCLA FSTA PLACE-3,7 / IF(OBJ.EQ.CAGE.AND.PROP(BIRD).NE.0)CALL DROP(BIRD,LOC) FLDA OBJ FSUB CAGE JNE .+20 FLDA BIRD JSA RDPROP JEQ .+12 JSR DROP JA .+6 JA BIRD JA LOC / IF(OBJ.EQ.BIRD)PROP(BIRD)=0 FLDA OBJ FSUB BIRD JNE .+10 FLDA BIRD ATX 7 FCLA FSTA PROP-3,7 / CALL DROP(OBJ,LOC) JSR DROP / GO TO 2012 JA #2012 / JA OBJ JA LOC /C /9024 IF(OBJ.NE.COINS.OR..NOT.HERE(VEND))GOTO 9025 #9024, FLDA OBJ FSUB COINS JNE #9025 FLDA VEND JSA HERE JEQ #9025 / CALL DSTROY(COINS) FLDA COINS JSA DSTROY / CALL DROP(BATTER,LOC) JSR DROP JA .+6 JA BATTER JA LOC / CALL PSPEAK(BATTER,0) JSR PSPEAK JA .+6 JA BATTER JA ZERO / GOTO 2012 JA #2012 /C /9025 IF(OBJ.NE.BIRD.OR..NOT.AT(DRAGON).OR.PROP(DRAGON).NE.0)GOTO 9026 #9025, FLDA OBJ FSUB BIRD JNE #9026 FLDA DRAGON JSA AT JEQ #9026 / FLDA DRAGON / ATX 3 FLDA PROP-3,3 JNE #9026 / CALL RSPEAK(154) JSR RSPEAK JA .+4 JA #LIT+333 / CALL DSTROY(BIRD) FLDA BIRD JSA DSTROY / PROP(BIRD)=0 FLDA BIRD ATX 7 FCLA FSTA PROP-3,7 / IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 FLDA SNAKE ATX 7 FLDA PLACE-3,7 FSUB PLAC-3,7 JNE #2012 FLDA TALLY2 FADD ONE FSTA TALLY2 / GOTO 2012 JA #2012 /C /9026 IF(OBJ.NE.BEAR.OR..NOT.AT(TROLL))GOTO 9027 #9026, FLDA OBJ FSUB BEAR JNE #9027 FLDA TROLL JSA AT JEQ #9027 / CALL RSPEAK(163) JSR RSPEAK JA .+4 JA #LIT+242 / CALL MOVE(TROLL,0) JSR MOVE JA .+6 JA TROLL JA ZERO / CALL MOVE(TROLL+100,0) FLDA TROLL FADD #LIT+154 FSTA #TMP JSR MOVE JA .+6 JA #TMP JA ZERO / CALL MOVE(TROLL2,PLAC(TROLL)) FLDA TROLL ATX 7 FLDA PLAC-3,7 FSTA #TMP JSR MOVE JA .+6 JA TROLL2 JA #TMP / CALL MOVE(TROLL2+100,FIXD(TROLL)) FLDA TROLL2 FADD #LIT+154 FSTA #TMP / FLDA TROLL / ATX 7 FLDA FIXD-3,7 FSTA #TMP+3 JSR MOVE JA .+6 JA #TMP JA #TMP+3 / CALL JUGGLE(CHASM) FLDA CHASM JSA JUGGLE / PROP(TROLL)=2 / FLDA TROLL / ATX 7 FLDA TWO FSTA PROP-3,7 / GOTO 9021 JA #9021 /C /9027 IF(OBJ.EQ.VASE.AND.LOC.NE.PLAC(PILLOW))GOTO 9028 #9027, FLDA OBJ FSUB VASE JNE .+13 FLDA PILLOW ATX 7 FLDA LOC FSUB PLAC-3,7 JNE #9028 / CALL RSPEAK(54) JSR RSPEAK JA #9021 JA #LIT+113 / GOTO 9021 /C /9028 PROP(VASE)=2 #9028, FLDA VASE ATX 7 FLDA TWO FSTA PROP-3,7 / IF(AT(PILLOW))PROP(VASE)=0 FLDA PILLOW JSA AT JEQ .+10 FLDA VASE ATX 7 FCLA FSTA PROP-3,7 / CALL PSPEAK(VASE,PROP(VASE)+1) FLDA VASE JSA RDPROP FADD ONE FSTA #TMP JSR PSPEAK JA .+6 JA VASE JA #TMP / IF(PROP(VASE).NE.0)FIXED(VASE)=-1 FLDA VASE ATX 7 FLDA PROP-3,7 JEQ #9021 FLDA MINUS1 FSTA FIXED-3,7 / GOTO 9021 JA #9021 /C /C SAY. ECHO WD2 (OR WD1 IF NO WD2 (SAY WHAT?, ETC.).) MAGIC WORDS OVERRIDE. /C /9030 IF(WD2.EQ.0)GOTO 9031 #9030, FLDA WD2 JEQ #9031 / WD1=WD2 WD1A=WD2A FLDA WD2 FSTA WD1 / WD1X=WD2X FLDA WD2X FSTA WD1X /9031 CALL VOCAB(WD1,WD1A,-1,I) #9031, JSR VOCAB JA .+6 JA WD1 JA MINUS1 FSTA I / IF(I.EQ.62.OR.I.EQ.65.OR.I.EQ.71.OR.I.EQ.2025)GOTO 9035 FSUB #LIT+124 JEQ #9035 FSUB THREE JEQ #9035 FSUB #LIT+3 JEQ #9035 DECIMAL LDX 2025,0 OCTAL XTA 0 FSUB I JEQ #9035 / TYPE 9032 JSA SPRINT JA #9032 JA TWO /9032 FORMAT(' Okay, "',$) / CALL A5TOA1(WD1,WD1A,WD1X,'".') JSR A5TOA1 JA #2012 JA WD1 JA WD1X JA TQDOT / GOTO 2012 /C /9035 WD2=0 #9035, FCLA FSTA WD2 / OBJ=0 FSTA OBJ / GOTO 2630 JA #2630 /C /C LOCK, UNLOCK, NO OBJECT GIVEN. ASSUME VARIOUS THINGS IF PRESENT. /C /8040 SPK=28 #8040, DECIMAL LDX 28,0 OCTAL XTA 0 FSTA SPK / IF(HERE(CLAM))OBJ=CLAM FLDA CLAM JSA HERE JEQ .+6 FLDA CLAM FSTA OBJ / IF(HERE(OYSTER))OBJ=OYSTER FLDA OYSTER JSA HERE JEQ .+6 FLDA OYSTER FSTA OBJ / IF(AT(DOOR))OBJ=DOOR FLDA DOOR JSA AT JEQ .+6 FLDA DOOR FSTA OBJ / IF(AT(GRATE))OBJ=GRATE FLDA GRATE JSA AT JEQ .+6 FLDA GRATE FSTA OBJ / IF(OBJ.NE.0.AND.HERE(CHAIN))GOTO 8000 FLDA OBJ JEQ .+10 FLDA CHAIN JSA HERE JNE #8000 / IF(HERE(CHAIN))OBJ=CHAIN FLDA CHAIN JSA HERE JEQ .+6 FLDA CHAIN FSTA OBJ / IF(OBJ.EQ.0)GOTO 2011 FLDA OBJ JEQ #2011 /C /C LOCK, UNLOCK OBJECT. SPECIAL STUFF FOR OPENING CLAM/OYSTER AND FOR CHAIN. /C /9040 IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)GOTO 9046 #9040, FLDA OBJ FSUB CLAM JEQ #9046 FLDA OBJ FSUB OYSTER JEQ #9046 / IF(OBJ.EQ.DOOR)SPK=111 FLDA OBJ FSUB DOOR JNE #9040A DECIMAL LDX 111,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.DOOR.AND.PROP(DOOR).EQ.1)SPK=54 #9040A, FLDA OBJ FSUB DOOR JNE .+13 FLDA DOOR JSA RDPROP FSUB ONE JEQ .+4 FLDA #LIT+113 FSTA SPK / IF(OBJ.EQ.CAGE)SPK=32 FLDA OBJ FSUB CAGE JNE .+6 DECIMAL LDX 32,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.KEYS)SPK=55 FLDA OBJ FSUB KEYS JNE .+6 DECIMAL LDX 55,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.GRATE.OR.OBJ.EQ.CHAIN)SPK=31 FLDA OBJ FSUB GRATE JEQ .+10 FLDA OBJ FSUB CHAIN JNE .+6 DECIMAL LDX 31,0 OCTAL XTA 0 FSTA SPK / IF(SPK.NE.31.OR..NOT.HERE(KEYS))GOTO 2011 DECIMAL LDX 31,0 OCTAL XTA 0 FSUB SPK JNE #2011 FLDA KEYS JSA HERE JEQ #2011 / IF(OBJ.EQ.CHAIN)GOTO 9048 FLDA OBJ FSUB CHAIN JEQ #9048 / IF(.NOT.CLOSNG)GOTO 9043 FLDA CLOSNG JEQ #9043 / K=130 FLDA #LIT+207 FSTA K / IF(.NOT.PANIC)CLOCK2=15 FLDA PANIC JNE .+5 FLDA #LIT+25 FSTA CLOCK2 / PANIC=.TRUE. FLDA ONE FSTA PANIC / GOTO 2010 JA #2010 /C /9043 K=34+PROP(GRATE) #9043, FLDA GRATE ATX 7 DECIMAL LDX 34,0 OCTAL XTA 0 FADD PROP-3,7 FSTA K / IF(VERB.EQ.LOCK)PROP(GRATE)=0 FLDA ONE FSTA PROP-3,7 FLDA VERB FSUB LOCK JNE .+4 / FCLA / already zero FSTA PROP-3,7 / K=K+2*PROP(GRATE) FLDA TWO FMUL PROP-3,7 FADD K FSTA K / GOTO 2010 JA #2010 /C /C CLAM/OYSTER. /C /9046 K=0 #9046, FCLA FSTA K / IF(OBJ.EQ.OYSTER)K=1 FLDA OBJ FSUB OYSTER JNE .+5 FLDA ONE FSTA K / SPK=124+K DECIMAL LDX 124,0 OCTAL XTA 0 FADD K FSTA SPK / IF(TOTING(OBJ))SPK=120+K FLDA OBJ JSA TOTING JEQ #9046A DECIMAL LDX 120,0 OCTAL XTA 0 FADD K FSTA SPK / IF(.NOT.TOTING(TRIDNT))SPK=122+K #9046A, FLDA TRIDNT JSA TOTING JNE .+10 DECIMAL LDX 122,0 OCTAL XTA 0 FADD K FSTA SPK / IF(VERB.EQ.LOCK)SPK=61 FLDA VERB FSUB LOCK JNE .+6 DECIMAL LDX 61,0 OCTAL XTA 0 FSTA SPK / IF(SPK.NE.124)GOTO 2011 DECIMAL LDX 124,0 OCTAL XTA 0 FSUB SPK JNE #2011 / CALL DSTROY(CLAM) FLDA CLAM JSA DSTROY / CALL DROP(OYSTER,LOC) JSR DROP JA .+6 JA OYSTER JA LOC / CALL DROP(PEARL,105) JSR DROP JA #2011 JA PEARL JA #LIT+157 / GOTO 2011 /C /C CHAIN. /C /9048 IF(VERB.EQ.LOCK)GOTO 9049 #9048, FLDA VERB FSUB LOCK JEQ #9049 / SPK=171 DECIMAL LDX 171,0 OCTAL XTA 0 FSTA SPK / IF(PROP(BEAR).EQ.0)SPK=41 FLDA BEAR JSA RDPROP JNE .+6 DECIMAL LDX 41,0 OCTAL XTA 0 FSTA SPK / IF(PROP(CHAIN).EQ.0)SPK=37 FLDA CHAIN JSA RDPROP JNE .+4 FLDA #LIT+71 FSTA SPK / IF(SPK.NE.171)GOTO 2011 DECIMAL LDX 171,0 OCTAL XTA 0 FSUB SPK JNE #2011 / PROP(CHAIN)=0 FCLA FSTA PROP-3,7 / FIXED(CHAIN)=0 FSTA FIXED-3,7 / IF(PROP(BEAR).NE.3)PROP(BEAR)=2 FLDA BEAR JSA RDPROP FSUB THREE JEQ .+5 FLDA TWO FSTA PROP-3,7 / FIXED(BEAR)=2-PROP(BEAR) FLDA TWO FSUB PROP-3,7 FSTA FIXED-3,7 / GOTO 2011 JA #2011 /C /9049 SPK=172 #9049, DECIMAL LDX 172,0 OCTAL XTA 0 FSTA SPK / IF(PROP(CHAIN).NE.0)SPK=34 FLDA CHAIN JSA RDPROP JEQ .+6 DECIMAL LDX 34,0 OCTAL XTA 0 FSTA SPK / IF(LOC.NE.PLAC(CHAIN))SPK=173 FLDA LOC FSUB PLAC-3,7 JEQ .+6 DECIMAL LDX 173,0 OCTAL XTA 0 FSTA SPK / IF(SPK.NE.172)GOTO 2011 DECIMAL LDX 172,0 OCTAL XTA 0 FSUB SPK JNE #2011 / PROP(CHAIN)=2 FLDA TWO FSTA PROP-3,7 / IF(TOTING(CHAIN))CALL DROP(CHAIN,LOC) FLDA CHAIN JSA TOTING JEQ .+12 JSR DROP JA .+6 JA CHAIN JA LOC / FIXED(CHAIN)=-1 FLDA MINUS1 FSTA FIXED-3,7 / GOTO 2011 JA #2011 /C /C LIGHT LAMP /C /9070 IF(.NOT.HERE(LAMP))GOTO 2011 #9070, FLDA LAMP JSA HERE JEQ #2011 / SPK=184 FLDA #LIT+253 FSTA SPK / IF(LIMIT.LT.0)GOTO 2011 FLDA LIMIT JLT #2011 / PROP(LAMP)=1 FLDA LAMP ATX 7 FLDA ONE FSTA PROP-3,7 / CALL RSPEAK(39) JSR RSPEAK JA .+4 JA #LIT+74 / IF(WZDARK)GOTO 2000 FLDA WZDARK JNE #2000 / GOTO 2012 JA #2012 /C /C LAMP OFF /C /9080 IF(.NOT.HERE(LAMP))GOTO 2011 #9080, FLDA LAMP ATX 7 JSA HERE JEQ #2011 / PROP(LAMP)=0 FCLA FSTA PROP-3,7 / CALL RSPEAK(40) JSR RSPEAK JA .+4 JA #LIT+77 / IF(DARK(0))CALL RSPEAK(16) JSA DARK JEQ #2012 JSR RSPEAK JA #2012 JA #LIT+30 / GOTO 2012 /C /C WAVE. NO EFFECT UNLESS WAVING ROD AT FISSURE. /C /9090 IF((.NOT.TOTING(OBJ)).AND.(OBJ.NE.ROD.OR..NOT.TOTING(ROD2))) / 1 SPK=29 #9090, FLDA OBJ JSA TOTING JNE .+20 FLDA OBJ FSUB ROD JNE .+12 FLDA ROD2 JSA TOTING JNE .+4 FLDA #LIT+135 FSTA SPK / IF(OBJ.NE.ROD.OR..NOT.AT(FISSUR).OR..NOT.TOTING(OBJ) / 1 .OR.CLOSNG)GOTO 2011 FLDA OBJ FSUB ROD JNE #2011 FLDA FISSUR JSA AT JEQ #2011 FLDA OBJ JSA TOTING JEQ #2011 FLDA CLOSNG JNE #2011 / PROP(FISSUR)=1-PROP(FISSUR) FLDA FISSUR ATX 7 FLDA ONE FSUB PROP-3,7 FSTA PROP-3,7 / CALL PSPEAK(FISSUR,2-PROP(FISSUR)) FLDA FISSUR ATX 7 FLDA TWO FSUB PROP-3,7 FSTA #TMP JSR PSPEAK JA #2012 JA FISSUR JA #TMP / GOTO 2012 /C /C ATTACK. ASSUME TARGET IF UNAMBIGUOUS. "THROW" ALSO LINKS HERE. ATTACKABLE /C OBJECTS FALL INTO TWO CATEGORIES: ENEMIES (SNAKE, DWARF, ETC.) AND OTHERS /C (BIRD, CLAM). AMBIGUOUS IF TWO ENEMIES, OR IF NO ENEMIES BUT TWO OTHERS. /C /9120 DO 9121 I=1,5 #9120, FLDA ONE FSTA I #H0102, FLDA I ATX 7 / IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 9122 FLDA DLOC-3,7 FSUB LOC JNE #9121 FLDA DFLAG FSUB TWO JGE #9122 /9121 CONTINUE #9121, FLDA I FADD ONE FSTA I FSUB #LIT+3 JLE #H0102 / I=0 FCLA FSTA I /9122 IF(OBJ.NE.0)GOTO 9124 #9122, FLDA OBJ JNE #9124 / IF(I.NE.0)OBJ=DWARF FLDA I JEQ .+6 FLDA DWARF FSTA OBJ / IF(HERE(SNAKE))OBJ=OBJ*100+SNAKE FLDA SNAKE JSA HERE JEQ .+11 FLDA OBJ FMUL #LIT+154 FADD SNAKE FSTA OBJ / IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)OBJ=OBJ*100+DRAGON FLDA DRAGON JSA AT JEQ .+15 / FLDA DRAGON / ATX 3 FLDA PROP-3,3 JNE .+11 FLDA OBJ FMUL #LIT+154 FADD DRAGON FSTA OBJ / IF(AT(TROLL))OBJ=OBJ*100+TROLL FLDA TROLL JSA AT JEQ .+11 FLDA OBJ FMUL #LIT+154 FADD TROLL FSTA OBJ / IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)OBJ=OBJ*100+BEAR FLDA BEAR JSA HERE JEQ .+15 FLDA PROP-3,3 JNE .+11 FLDA OBJ FMUL #LIT+154 FADD BEAR FSTA OBJ / IF(OBJ.GT.100)GOTO 8000 FLDA OBJ FSUB #LIT+154 JGT #8000 / IF(OBJ.NE.0)GOTO 9124 FLDA OBJ JNE #9124 /C /C CAN'T ATTACK BIRD BY THROWING AXE. /C / IF(HERE(BIRD).AND.VERB.NE.THROW)OBJ=BIRD FLDA BEAR JSA HERE JEQ .+14 FLDA VERB FSUB THROW JNE .+6 FLDA BIRD FSTA OBJ /C /C CLAM AND OYSTER BOTH TREATED AS CLAM FOR INTRANSITIVE CASE; NO HARM DONE. /C / IF(HERE(CLAM).OR.HERE(OYSTER))OBJ=100*OBJ+CLAM FLDA CLAM JSA HERE JNE .+10 FLDA OYSTER JSA HERE JEQ .+11 FLDA #LIT+154 FMUL OBJ FADD CLAM FSTA OBJ / IF(OBJ.GT.100)GOTO 8000 FLDA OBJ FSUB #LIT+154 JGT #8000 /9124 IF(OBJ.NE.BIRD)GOTO 9125 #9124, FLDA OBJ FSUB BIRD JNE #9125 / SPK=137 DECIMAL LDX 137,0 OCTAL XTA 0 FSTA SPK / IF(CLOSED)GOTO 2011 FLDA CLOSED JNE #2011 / CALL DSTROY(BIRD) FLDA BIRD JSA DSTROY / PROP(BIRD)=0 FLDA BIRD ATX 7 FCLA FSTA PROP-3,7 / IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1 FLDA SNAKE ATX 7 FLDA PLACE-3,7 FSUB PLAC-3,7 JNE .+7 FLDA TALLY2 FADD ONE FSTA TALLY2 / SPK=45 FLDA #LIT+102 FSTA SPK /9125 IF(OBJ.EQ.0)SPK=44 #9125, FLDA OBJ JNE .+6 DECIMAL LDX 44,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)SPK=150 FLDA OBJ FSUB CLAM JEQ .+10 FLDA OBJ FSUB OYSTER JNE .+6 DECIMAL LDX 150,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.SNAKE)SPK=46 FLDA OBJ FSUB SNAKE JNE .+6 DECIMAL LDX 46,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.DWARF)SPK=49 FLDA OBJ FSUB DWARF JNE .+4 FLDA #LIT+105 FSTA SPK / IF(OBJ.EQ.DWARF.AND.CLOSED)GOTO 19000 FLDA OBJ FSUB DWARF JNE .+6 FLDA CLOSED JNE #19000 / IF(OBJ.EQ.DRAGON)SPK=167 FLDA OBJ FSUB DRAGON JNE .+6 DECIMAL LDX 167,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.TROLL)SPK=157 FLDA OBJ FSUB TROLL JNE .+6 DECIMAL LDX 157,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.BEAR)SPK=165+(PROP(BEAR)+1)/2 FLDA OBJ FSUB BEAR JNE .+14 FLDA BEAR JSA RDPROP FADD ONE FDIV TWO JSA #FIX FADD #LIT+245 FSTA SPK / IF(OBJ.NE.DRAGON.OR.PROP(DRAGON).NE.0)GOTO 2011 FLDA OBJ FSUB DRAGON JNE #2011 FLDA DRAGON JSA RDPROP JNE #2011 /C /C FUN STUFF FOR DRAGON. IF HE INSISTS ON ATTACKING IT, WIN! SET PROP TO DEAD, /C MOVE DRAGON TO CENTRAL LOC (STILL FIXED), MOVE RUG THERE (NOT FIXED), AND /C MOVE HIM THERE, TOO. THEN DO A NULL MOTION TO GET NEW DESCRIPTION. /C / CALL RSPEAK(49) JSR RSPEAK JA .+4 JA #LIT+105 / VERB=0 FCLA FSTA VERB / OBJ=0 FSTA OBJ / CALL GETIN(WD1,WD1A,WD1X,WD2,WD2A,WD2X) JSR GETIN JA .+12 JA WD1 JA WD1X JA WD2 JA WD2X / IF(WD1.NE.'YE'.AND.WD1.NE.'Y')GOTO 2608 FLDA WD1 FSUB TYES JEQ OKKILL FLDA WD1 FSUB TYE JEQ OKKILL FLDA WD1 FSUB TY JNE #2608 / CALL PSPEAK(DRAGON,1) OKKILL, JSR PSPEAK JA .+6 JA DRAGON JA ONE / PROP(DRAGON)=2 FLDA DRAGON ATX 7 FLDA TWO FSTA PROP-3,7 / PROP(RUG)=0 FLDA RUG ATX 7 FCLA FSTA PROP-3,7 / K=(PLAC(DRAGON)+FIXD(DRAGON))/2 FLDA DRAGON ATX 7 FLDA PLAC-3,7 FADD FIXD-3,7 FDIV TWO JSA #FIX FSTA K / CALL MOVE(DRAGON+100,-1) FLDA DRAGON FADD #LIT+154 FSTA #TMP JSR MOVE JA .+6 JA #TMP JA MINUS1 / CALL MOVE(RUG+100,0) FLDA RUG FADD #LIT+154 FSTA #TMP JSR MOVE JA .+6 JA #TMP JA ZERO / CALL MOVE(DRAGON,K) JSR MOVE JA .+6 JA DRAGON JA K / CALL MOVE(RUG,K) JSR MOVE JA .+6 JA RUG JA K / DO 9126 OBJ=1,100 FLDA ONE FSTA OBJ / IF(PLACE(OBJ).EQ.PLAC(DRAGON).OR.PLACE(OBJ).EQ.FIXD(DRAGON)) / 1 CALL MOVE(OBJ,K) #H0122, FLDA OBJ ATX 7 FLDA DRAGON ATX 6 FLDA PLACE-3,7 FSUB PLAC-3,6 JEQ .+10 FLDA PLACE-3,7 FSUB FIXD-3,6 JNE #9126 JSR MOVE JA .+6 JA OBJ JA K /9126 CONTINUE #9126, FLDA OBJ FADD ONE FSTA OBJ FSUB #LIT+154 JLE #H0122 / LOC=K FLDA K FSTA LOC / K=NULL FLDA NULL FSTA K / GOTO 8 JA #8 /C /C POUR. IF NO OBJECT, OR OBJECT IS BOTTLE, ASSUME CONTENTS OF BOTTLE. /C SPECIAL TESTS FOR POURING WATER OR OIL ON PLANT OR RUSTY DOOR. /C /9130 IF(OBJ.EQ.BOTTLE.OR.OBJ.EQ.0)OBJ=LIQ(0) #9130, FLDA OBJ FSUB BOTTLE JEQ .+6 FLDA OBJ JNE .+6 JSA LIQ FSTA OBJ / IF(OBJ.EQ.0)GOTO 8000 FLDA OBJ JEQ #8000 / IF(.NOT.TOTING(OBJ))GOTO 2011 FLDA OBJ JSA TOTING JEQ #2011 / SPK=78 DECIMAL LDX 78,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.NE.OIL.AND.OBJ.NE.WATER)GOTO 2011 FLDA OBJ FSUB OIL JEQ .+10 FLDA OBJ FSUB WATER JNE #2011 / PROP(BOTTLE)=1 FLDA BOTTLE ATX 7 FLDA ONE FSTA PROP-3,7 / PLACE(OBJ)=0 FLDA OBJ ATX 7 FCLA FSTA PLACE-3,7 / SPK=77 DECIMAL LDX 77,0 OCTAL XTA 0 FSTA SPK / IF(.NOT.(AT(PLANT).OR.AT(DOOR)))GOTO 2011 FLDA PLANT JSA AT JNE .+10 FLDA DOOR JSA AT JEQ #2011 /C / IF(AT(DOOR))GOTO 9132 FLDA DOOR JSA AT JNE #9132 / SPK=112 DECIMAL LDX 112,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.NE.WATER)GOTO 2011 FLDA OBJ FSUB WATER JNE #2011 / CALL PSPEAK(PLANT,PROP(PLANT)+1) FLDA PLANT JSA RDPROP FADD ONE FSTA #TMP JSR PSPEAK JA .+6 JA PLANT JA #TMP / PROP(PLANT)=MOD(PROP(PLANT)+2,6) FLDA PLANT JSA RDPROP FADD TWO FSTA #TMP JSR MOD JA .+6 JA #TMP JA #LIT+6 FSTA PROP-3,7 / PROP(PLANT2)=PROP(PLANT)/2 FLDA PLANT2 ATX 7 FLDA PLANT JSA RDPROP FDIV TWO JSA #FIX FSTA PROP-3,6 / K=NULL FLDA NULL FSTA K / GOTO 8 JA #8 /C /9132 PROP(DOOR)=0 #9132, FLDA DOOR ATX 7 FCLA FSTA PROP-3,7 / IF(OBJ.EQ.OIL)PROP(DOOR)=1 FLDA OBJ FSUB OIL JNE .+10 FLDA DOOR ATX 7 FLDA ONE FSTA PROP-3,7 / SPK=113+PROP(DOOR) FLDA DOOR ATX 7 DECIMAL LDX 113,0 OCTAL XTA 0 FADD PROP-3,7 FSTA SPK / GOTO 2011 JA #2011 /C /C EAT. INTRANSITIVE: ASSUME FOOD IF PRESENT, ELSE ASK WHAT. TRANSITIVE: FOOD /C OK, SOME THINGS LOSE APPETITE, REST ARE RIDICULOUS. /C /8140 IF(.NOT.HERE(FOOD))GOTO 8000 #8140, FLDA FOOD JSA HERE JEQ #8000 /8142 CALL DSTROY(FOOD) #8142, FLDA FOOD JSA DSTROY / SPK=72 DECIMAL LDX 72,0 OCTAL XTA 0 FSTA SPK / GOTO 2011 JA #2011 /C /9140 IF(OBJ.EQ.FOOD)GOTO 8142 #9140, FLDA OBJ FSUB FOOD JEQ #8142 / IF(OBJ.EQ.BIRD.OR.OBJ.EQ.SNAKE.OR.OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER / 1 .OR.OBJ.EQ.DWARF.OR.OBJ.EQ.DRAGON.OR.OBJ.EQ.TROLL / 2 .OR.OBJ.EQ.BEAR)SPK=71 FLDA OBJ FSUB BIRD JEQ #M78 FLDA OBJ FSUB SNAKE JEQ #M78 FLDA OBJ FSUB CLAM JEQ #M78 FLDA OBJ FSUB OYSTER JEQ #M78 FLDA OBJ FSUB DWARF JEQ #M78 FLDA OBJ FSUB DRAGON JEQ #M78 FLDA OBJ FSUB TROLL JEQ #M78 FLDA OBJ FSUB BEAR JNE #2011 #M78, DECIMAL LDX 71,0 OCTAL XTA 0 FSTA SPK / GOTO 2011 JA #2011 /C /C DRINK. IF NO OBJECT, ASSUME WATER AND LOOK FOR IT HERE. IF WATER IS IN /C THE BOTTLE, DRINK THAT, ELSE MUST BE AT A WATER LOC, SO DRINK STREAM. /C /9150 IF(OBJ.EQ.0.AND.LIQLOC(LOC).NE.WATER.AND.(LIQ(0).NE.WATER / 1 .OR..NOT.HERE(BOTTLE)))GOTO 8000 #9150, FLDA OBJ JNE #M79 JSA LIQLOC FSUB WATER JEQ #M79 JSA LIQ FSUB WATER JNE #8000 FLDA BOTTLE JSA HERE JEQ #8000 / IF(OBJ.NE.0.AND.OBJ.NE.WATER)SPK=110 #M79, FLDA OBJ JEQ .+10 / FLDA OBJ FSUB WATER JEQ .+4 FLDA #LIT+162 FSTA SPK / IF(SPK.EQ.110.OR.LIQ(0).NE.WATER.OR..NOT.HERE(BOTTLE))GOTO 2011 FLDA SPK FSUB #LIT+162 JEQ #2011 JSA LIQ FSUB WATER JNE #2011 FLDA BOTTLE JSA HERE JEQ #2011 / PROP(BOTTLE)=1 FLDA ONE FSTA PROP-3,3 / PLACE(WATER)=0 FLDA WATER ATX 7 FCLA FSTA PLACE-3,7 / SPK=74 DECIMAL LDX 74,0 OCTAL XTA 0 FSTA SPK / GOTO 2011 JA #2011 /C /C RUB. YIELDS VARIOUS SNIDE REMARKS. /C /9160 IF(OBJ.NE.LAMP)SPK=76 #9160, FLDA OBJ FSUB LAMP JEQ #2011 DECIMAL LDX 76,0 OCTAL XTA 0 FSTA SPK / GOTO 2011 JA #2011 /C /C THROW. SAME AS DISCARD UNLESS AXE. THEN SAME AS ATTACK EXCEPT IGNORE BIRD, /C AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED. (ONLY WAY TO DO SO!) /C AXE ALSO SPECIAL FOR DRAGON, BEAR, AND TROLL. TREASURES SPECIAL FOR TROLL. /C /9170 IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2 #9170, FLDA ROD2 JSA TOTING JEQ #M81 FLDA OBJ FSUB ROD JNE #M81 FLDA ROD JSA TOTING JNE #M81 FLDA ROD2 FSTA OBJ / IF(.NOT.TOTING(OBJ))GOTO 2011 #M81, FLDA OBJ JSA TOTING JEQ #2011 / IF(OBJ.GE.50.AND.OBJ.LE.MAXTRS.AND.AT(TROLL))GOTO 9178 FLDA OBJ FSUB #LIT+110 JLT #M82 FLDA OBJ FSUB MAXTRS JGT #M82 FLDA TROLL JSA AT JNE #9178 / IF(OBJ.EQ.FOOD.AND.HERE(BEAR))GOTO 9177 #M82, FLDA OBJ FSUB FOOD JNE #M83 FLDA BEAR JSA HERE JNE #9177 / IF(OBJ.NE.AXE)GOTO 9020 #M83, FLDA OBJ FSUB AXE JNE #9020 / DO 9171 I=1,5 FLDA ONE FSTA I /C /C NEEDN'T CHECK DFLAG IF AXE IS HERE. /C / IF(DLOC(I).EQ.LOC)GOTO 9172 #H0132, FLDA I ATX 7 FLDA DLOC-3,7 FSUB LOC JEQ #9172 /9171 CONTINUE #9171, FLDA I FADD ONE FSTA I FSUB #LIT+3 JLE #H0132 / SPK=152 DECIMAL LDX 152,0 OCTAL XTA 0 FSTA SPK / IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)GOTO 9175 FLDA DRAGON JSA AT JEQ #M84 / FLDA DRAGON / ATX 3 FLDA PROP-3,3 JEQ #9175 / SPK=158 #M84, DECIMAL LDX 158,0 OCTAL XTA 0 FSTA SPK / IF(AT(TROLL))GOTO 9175 FLDA TROLL JSA AT JNE #9175 / IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)GOTO 9176 FLDA BEAR JSA HERE JEQ #M85 FLDA PROP-3,3 JEQ #9176 / OBJ=0 #M85, FCLA FSTA OBJ / GOTO 9120 JA #9120 /C /9172 SPK=48 #9172, DECIMAL LDX 48,0 OCTAL XTA 0 FSTA SPK / IF(RND(3).EQ.0)GOTO 9175 JSR RND JA .+4 JA THREE JEQ #9175 / DSEEN(I)=.FALSE. FLDA I ATX 7 FCLA FSTA DSEEN-3,7 / DLOC(I)=0 FSTA DLOC-3,7 / SPK=47 DECIMAL LDX 47,0 OCTAL XTA 0 FSTA SPK / DKILL=DKILL+1 FLDA ONE FADDM DKILL / IF(DKILL.EQ.1)SPK=149 FSUB ONE JNE #9175 DECIMAL LDX 149,0 OCTAL XTA 0 FSTA SPK /9175 CALL RSPEAK(SPK) #9175, JSR RSPEAK JA .+4 JA SPK / CALL DROP(AXE,LOC) JSR DROP JA .+6 JA AXE JA LOC / K=NULL FLDA NULL FSTA K / GOTO 8 JA #8 /C /C THIS'LL TEACH HIM TO THROW THE AXE AT THE BEAR! /C /9176 SPK=164 #9176, DECIMAL LDX 164,0 OCTAL XTA 0 FSTA SPK / CALL DROP(AXE,LOC) JSR DROP JA .+6 JA AXE JA LOC / FIXED(AXE)=-1 FLDA AXE ATX 7 FLDA MINUS1 FSTA FIXED-3,7 / PROP(AXE)=1 FLDA ONE FSTA PROP-3,7 / CALL JUGGLE(BEAR) FLDA BEAR JSA JUGGLE / GOTO 2011 JA #2011 /C /C BUT THROWING FOOD IS ANOTHER STORY. /C /9177 OBJ=BEAR #9177, FLDA BEAR FSTA OBJ / GOTO 9210 JA #9210 /C /C SNARF A TREASURE FOR THE TROLL. /C /9178 SPK=159 #9178, DECIMAL LDX 159,0 OCTAL XTA 0 FSTA SPK / CALL DROP(OBJ,0) JSR DROP JA .+6 JA OBJ JA ZERO / CALL MOVE(TROLL,0) JSR MOVE JA .+6 JA TROLL JA ZERO / CALL MOVE(TROLL+100,0) FLDA TROLL FADD #LIT+154 FSTA #TMP JSR MOVE JA .+6 JA #TMP JA ZERO / CALL DROP(TROLL2,PLAC(TROLL)) FLDA TROLL ATX 7 FLDA PLAC-3,7 FSTA #TMP JSR DROP JA .+6 JA TROLL2 JA #TMP / CALL DROP(TROLL2+100,FIXD(TROLL)) FLDA TROLL2 FADD #LIT+154 FSTA #TMP / FLDA TROLL / ATX 7 FLDA FIXD-3,7 FSTA #TMP+3 JSR DROP JA .+6 JA #TMP JA #TMP+3 / CALL JUGGLE(CHASM) FLDA CHASM JSA JUGGLE / GOTO 2011 JA #2011 /C /C QUIT. INTRANSITIVE ONLY. VERIFY INTENT AND EXIT IF THAT'S WHAT HE WANTS. /C /8180 GAVEUP=YES(22,54,54) #8180, JSR YES JA .+10 JA #LIT+41 JA #LIT+113 JA #LIT+113 FSTA GAVEUP /8185 IF(GAVEUP)GOTO 20000 #8185, FLDA GAVEUP JNE #20000 / GOTO 2012 JA #2012 /C /C FIND. MIGHT BE CARRYING IT, OR IT MIGHT BE HERE. ELSE GIVE CAVEAT. /C /9190 IF(AT(OBJ).OR.(LIQ(0).EQ.OBJ.AND.AT(BOTTLE)) / 1 .OR.K.EQ.LIQLOC(LOC))SPK=94 #9190, FLDA OBJ JSA AT JNE #M86 JSA LIQ FSUB OBJ JNE #M87 FLDA BOTTLE JSA AT JNE #M86 #M87, JSA LIQLOC FSUB K JNE .+6 #M86, DECIMAL LDX 94,0 OCTAL XTA 0 FSTA SPK / DO 9192 I=1,5 FLDA ONE FSTA I /9192 IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2.AND.OBJ.EQ.DWARF)SPK=94 #9192, FLDA I ATX 7 FLDA DLOC-3,7 FSUB LOC JNE #M88 FLDA DFLAG FSUB TWO JLT #M88 FLDA OBJ FSUB DWARF JNE #M88 DECIMAL LDX 94,0 OCTAL XTA 0 FSTA SPK #M88, FLDA I FADD ONE FSTA I FSUB #LIT+3 JLE #9192 / IF(CLOSED)SPK=138 FLDA CLOSED JEQ .+6 DECIMAL LDX 138,0 OCTAL XTA 0 FSTA SPK / IF(TOTING(OBJ))SPK=24 FLDA OBJ JSA TOTING JEQ #2011 FLDA #LIT+47 FSTA SPK / GOTO 2011 JA #2011 /C /C INVENTORY. IF OBJECT, TREAT SAME AS FIND. ELSE REPORT ON CURRENT BURDEN. /C /8200 SPK=98 #8200, DECIMAL LDX 98,0 OCTAL XTA 0 FSTA SPK / DO 8201 I=1,100 FLDA ONE FSTA I / IF(I.EQ.BEAR.OR..NOT.TOTING(I))GOTO 8201 #H0143, FLDA I FSUB BEAR JEQ #8201 FLDA I JSA TOTING JEQ #8201 / IF(SPK.EQ.98)CALL RSPEAK(99) DECIMAL LDX 98,0 OCTAL XTA 0 FSUB SPK JNE .+10 JSR RSPEAK JA .+4 JA #LIT+151 / CALL PSPEAK(I,-1) JSR PSPEAK JA .+6 JA I JA MINUS1 / SPK=0 FCLA FSTA SPK /8201 CONTINUE #8201, FLDA I FADD ONE FSTA I FSUB #LIT+154 JLE #H0143 / IF(TOTING(BEAR))SPK=141 FLDA BEAR JSA TOTING JEQ #2011 FLDA #LIT+226 FSTA SPK / GOTO 2011 JA #2011 /C /C FEED. IF BIRD, NO SEED. SNAKE, DRAGON, TROLL: QUIP. IF DWARF, MAKE HIM /C MAD. BEAR, SPECIAL. /C /9210 IF(OBJ.NE.BIRD)GOTO 9212 #9210, FLDA OBJ FSUB BIRD JNE #9212 / SPK=100 FLDA #LIT+154 FSTA SPK / GOTO 2011 JA #2011 /C /9212 IF(OBJ.NE.SNAKE.AND.OBJ.NE.DRAGON.AND.OBJ.NE.TROLL)GOTO 9213 #9212, FLDA OBJ FSUB SNAKE JEQ #M89 FLDA OBJ FSUB DRAGON JEQ #M89 FLDA OBJ FSUB TROLL JNE #9213 / SPK=102 #M89, DECIMAL LDX 102,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.DRAGON.AND.PROP(DRAGON).NE.0)SPK=110 FLDA OBJ FSUB DRAGON JNE #M90 FLDA DRAGON JSA RDPROP JEQ .+4 FLDA #LIT+162 FSTA SPK / IF(OBJ.EQ.TROLL)SPK=182 #M90, FLDA OBJ FSUB TROLL JNE .+6 DECIMAL LDX 182,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.NE.SNAKE.OR.CLOSED.OR..NOT.HERE(BIRD))GOTO 2011 FLDA OBJ FSUB SNAKE JNE #2011 FLDA CLOSED JNE #2011 FLDA BIRD JSA HERE JEQ #2011 / SPK=101 DECIMAL LDX 101,0 OCTAL XTA 0 FSTA SPK / CALL DSTROY(BIRD) FLDA BIRD JSA DSTROY / PROP(BIRD)=0 FLDA BIRD ATX 7 FCLA FSTA PROP-3,7 / TALLY2=TALLY2+1 FLDA TALLY2 FADD ONE FSTA TALLY2 / GOTO 2011 JA #2011 /C /9213 IF(OBJ.NE.DWARF)GOTO 9214 #9213, FLDA OBJ FSUB DWARF JNE #9214 / IF(.NOT.HERE(FOOD))GOTO 2011 FLDA FOOD JSA HERE JEQ #2011 / SPK=103 DECIMAL LDX 103,0 OCTAL XTA 0 FSTA SPK / DFLAG=DFLAG+1 FLDA ONE FADDM DFLAG / GOTO 2011 JA #2011 /C /9214 IF(OBJ.NE.BEAR)GOTO 9215 #9214, FLDA OBJ FSUB BEAR JNE #9215 / IF(PROP(BEAR).EQ.0)SPK=102 FLDA BEAR JSA RDPROP JNE .+6 DECIMAL LDX 102,0 OCTAL XTA 0 FSTA SPK / IF(PROP(BEAR).EQ.3)SPK=110 FLDA PROP-3,7 FSUB THREE JNE .+4 FLDA #LIT+162 FSTA SPK / IF(.NOT.HERE(FOOD))GOTO 2011 FLDA FOOD JSA HERE JEQ #2011 / CALL DSTROY(FOOD) FLDA FOOD JSA DSTROY / PROP(BEAR)=1 FLDA ONE FSTA PROP-3,7 / FIXED(AXE)=0 FLDA AXE ATX 7 FCLA FSTA FIXED-3,7 / PROP(AXE)=0 FSTA PROP-3,7 / SPK=168 DECIMAL LDX 168,0 OCTAL XTA 0 FSTA SPK / GOTO 2011 JA #2011 /C /9215 SPK=14 #9215, DECIMAL LDX 14,0 OCTAL XTA 0 FSTA SPK / GOTO 2011 JA #2011 /C /C FILL. BOTTLE MUST BE EMPTY, AND SOME LIQUID AVAILABLE. (VASE IS NASTY.) /C /9220 IF(OBJ.EQ.VASE)GOTO 9222 #9220, FLDA OBJ FSUB VASE JEQ #9222 / IF(OBJ.NE.0.AND.OBJ.NE.BOTTLE)GOTO 2011 FLDA OBJ JEQ #M91 FLDA OBJ FSUB BOTTLE JNE #2011 / IF(OBJ.EQ.0.AND..NOT.HERE(BOTTLE))GOTO 8000 #M91, FLDA OBJ JNE #M92 FLDA BOTTLE JSA HERE JEQ #8000 / SPK=107 #M92, DECIMAL LDX 107,0 OCTAL XTA 0 FSTA SPK / IF(LIQLOC(LOC).EQ.0)SPK=106 JSA LIQLOC JNE #M92A DECIMAL LDX 106,0 OCTAL XTA 0 FSTA SPK / IF(LIQ(0).NE.0)SPK=105 #M92A, JSA LIQ JEQ .+4 FLDA #LIT+157 FSTA SPK / IF(SPK.NE.107)GOTO 2011 DECIMAL LDX 107,0 OCTAL XTA 0 FSUB SPK JNE #2011 / PROP(BOTTLE)=MOD(COND(LOC),4)/2*2 FLDA BOTTLE ATX 7 FLDA LOC ATX 6 FLDA COND-3,6 FSTA #TMP JSR MOD JA .+6 JA #TMP JA #LIT FDIV TWO JSA #FIX FMUL TWO FSTA PROP-3,7 / K=LIQ(0) JSA LIQ FSTA K / IF(TOTING(BOTTLE))PLACE(K)=-1 FLDA BOTTLE JSA TOTING JEQ .+10 FLDA K ATX 7 FLDA MINUS1 FSTA PLACE-3,7 / IF(K.EQ.OIL)SPK=108 FLDA K FSUB OIL JNE #2011 DECIMAL LDX 108,0 OCTAL XTA 0 FSTA SPK / GOTO 2011 JA #2011 /C /9222 SPK=29 #9222, FLDA #LIT+135 FSTA SPK / IF(LIQLOC(LOC).EQ.0)SPK=144 JSA LIQLOC JNE .+6 DECIMAL LDX 144,0 OCTAL XTA 0 FSTA SPK / IF(LIQLOC(LOC).EQ.0.OR..NOT.TOTING(VASE))GOTO 2011 JSA LIQLOC JEQ #2011 FLDA VASE JSA TOTING JEQ #2011 / CALL RSPEAK(145) JSR RSPEAK JA .+4 JA #LIT+234 / PROP(VASE)=2 FLDA VASE ATX 7 FLDA TWO FSTA PROP-3,7 / FIXED(VASE)=-1 FLDA MINUS1 FSTA FIXED-3,7 / GOTO 9024 JA #9024 /C /C BLAST. NO EFFECT UNLESS YOU'VE GOT DYNAMITE, WHICH IS A NEAT TRICK! /C /9230 IF(PROP(ROD2).LT.0.OR..NOT.CLOSED)GOTO 2011 #9230, FLDA ROD2 JSA RDPROP JLT #2011 FLDA CLOSED JEQ #2011 / BONUS=133 DECIMAL LDX 133,0 OCTAL XTA 0 FSTA BONUS / IF(LOC.EQ.115)BONUS=134 FLDA LOC FSUB #LIT+165 JNE .+7 DECIMAL LDX 134,0 OCTAL XTA 0 FSTA BONUS / IF(HERE(ROD2))BONUS=135 FLDA ROD2 JSA HERE JEQ .+7 DECIMAL LDX 135,0 OCTAL XTA 0 FSTA BONUS / CALL RSPEAK(BONUS) JSR RSPEAK JA .+4 JA BONUS / GOTO 20000 JA #20000 /C /C SCORE. GO TO SCORING SECTION, WHICH WILL RETURN TO 8241 IF SCORNG IS TRUE. /C /8240 SCORNG=.TRUE. #8240, FLDA ONE FSTA SCORNG / GOTO 20000 JA #20000 /C /8241 SCORNG=.FALSE. #8241, FCLA FSTA SCORNG / TYPE 8243,SCORE,MXSCOR JSA SPRINT JA #8243 JA TWO TRAP3 #WRITO JA #LIT JA #8243A FLDA SCORE TRAP3 #RSVO TRAP3 #RENDO JSA SPRINT JA #8243B JA THREE TRAP3 #WRITO JA #LIT JA #8243A FLDA MXSCOR TRAP3 #RSVO TRAP3 #RENDO JSA SPRINT JA #8243C JA ONE /8243 FORMAT(' If you were to quit now, you would score',I4 / 1 ,' out of a possible',I4,'.') / GAVEUP=YES(143,54,54) JSR YES JA .+10 JA #LIT+231 JA #LIT+113 JA #LIT+113 FSTA GAVEUP / GOTO 8185 JA #8185 /C /C FEE FIE FOE FOO (AND FUM). ADVANCE TO NEXT STATE IF GIVEN IN PROPER ORDER. /C LOOK UP WD1 IN SECTION 3 OF VOCAB TO DETERMINE WHICH WORD WE'VE GOT. LAST /C WORD ZIPS THE EGGS BACK TO THE GIANT ROOM (UNLESS ALREADY THERE). /C /8250 CALL VOCAB(WD1,WD1A,3,K) #8250, JSR VOCAB JA .+6 JA WD1 JA THREE FSTA K / SPK=42 DECIMAL LDX 42,0 OCTAL XTA 0 FSTA SPK / IF(FOOBAR.EQ.1-K)GOTO 8252 FLDA ONE FSUB K FSUB FOOBAR JEQ #8252 / IF(FOOBAR.NE.0)SPK=151 FLDA FOOBAR JEQ #2011 DECIMAL LDX 151,0 OCTAL XTA 0 FSTA SPK / GOTO 2011 JA #2011 /C /8252 FOOBAR=K #8252, FLDA K FSTA FOOBAR / IF(K.NE.4)GOTO 2009 FSUB #LIT JNE #2009 / FOOBAR=0 FCLA FSTA FOOBAR / IF(PLACE(EGGS).EQ.PLAC(EGGS) / 1 .OR.(TOTING(EGGS).AND.LOC.EQ.PLAC(EGGS)))GOTO 2011 FLDA EGGS ATX 7 FLDA PLACE-3,7 FSUB PLAC-3,7 JEQ #2011 FLDA EGGS JSA TOTING JEQ #M93 FLDA LOC FSUB PLAC-3,7 JEQ #2011 /C /C BRING BACK TROLL IF WE STEAL THE EGGS BACK FROM HIM BEFORE CROSSING. /C / IF(PLACE(EGGS).EQ.0.AND.PLACE(TROLL).EQ.0.AND.PROP(TROLL).EQ.0) / 1 PROP(TROLL)=1 #M93, FLDA PLACE-3,7 JNE #M94 FLDA TROLL ATX 6 FLDA PLACE-3,6 JNE #M94 FLDA PROP-3,6 JNE #M94 FLDA ONE FSTA PROP-3,6 / K=2 #M94, FLDA TWO FSTA K / IF(HERE(EGGS))K=1 FLDA EGGS JSA HERE JEQ .+5 FLDA ONE FSTA K / IF(LOC.EQ.PLAC(EGGS))K=0 FLDA LOC FSUB PLAC-3,7 JNE .+5 FCLA FSTA K / CALL MOVE(EGGS,PLAC(EGGS)) FLDA PLAC-3,7 FSTA #TMP JSR MOVE JA .+6 JA EGGS JA #TMP / CALL PSPEAK(EGGS,K) JSR PSPEAK JA .+6 JA EGGS JA K / GOTO 2012 JA #2012 /C /C BRIEF. INTRANSITIVE ONLY. SUPPRESS LONG DESCRIPTIONS AFTER FIRST TIME. /C /8260 SPK=156 #8260, DECIMAL LDX 156,0 OCTAL XTA 0 FSTA SPK / ABBNUM=10000 FLDA #LIT+322 FSTA ABBNUM / DETAIL=3 FLDA THREE FSTA DETAIL / GOTO 2011 JA #2011 /C /C READ. MAGAZINES IN DWARVISH, MESSAGE WE'VE SEEN, AND . . . OYSTER? /C /8270 IF(HERE(MAGZIN))OBJ=MAGZIN #8270, FLDA MAGZIN JSA HERE JEQ .+6 FLDA MAGZIN FSTA OBJ / IF(HERE(TABLET))OBJ=OBJ*100+TABLET FLDA TABLET JSA HERE JEQ .+11 FLDA OBJ FMUL #LIT+154 FADD TABLET FSTA OBJ / IF(HERE(MESSAG))OBJ=OBJ*100+MESSAG FLDA MESSAGE JSA HERE JEQ .+11 FLDA OBJ FMUL #LIT+154 FADD MESSAG FSTA OBJ / IF(CLOSED.AND.TOTING(OYSTER))OBJ=OYSTER FLDA OYSTER JSA TOTING FMUL CLOSED JEQ .+6 FLDA OYSTER FSTA OBJ / IF(OBJ.GT.100.OR.OBJ.EQ.0.OR.DARK(0))GOTO 8000 FLDA OBJ FSUB #LIT+154 JGT #8000 FLDA OBJ JEQ #8000 JSA DARK JNE #8000 /C /9270 IF(DARK(0))GOTO 5190 #9270, JSA DARK JNE #5190 / IF(OBJ.EQ.MAGZIN)SPK=190 FLDA OBJ FSUB MAGZIN JNE .+6 DECIMAL LDX 190,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.TABLET)SPK=196 FLDA OBJ FSUB TABLET JNE .+6 DECIMAL LDX 196,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.MESSAG)SPK=191 FLDA OBJ FSUB MESSAG JNE .+6 DECIMAL LDX 191,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.OYSTER.AND.HINTED(2).AND.TOTING(OYSTER))SPK=194 FLDA OBJ FSUB OYSTER JNE #M95 FLDA HINTED+3 / HINTED(2) JEQ #M95 FLDA OYSTER JSA TOTING JEQ .+6 DECIMAL LDX 194,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.NE.OYSTER.OR.HINTED(2).OR..NOT.TOTING(OYSTER) / 1 .OR..NOT.CLOSED)GOTO 2011 #M95, FLDA OBJ FSUB OYSTER JNE #2011 FLDA HINTED+3 JNE #2011 FLDA OYSTER JSA TOTING JEQ #2011 FLDA CLOSED JEQ #2011 / HINTED(2)=YES(192,193,54) JSR YES JA #2012 JA #LIT+267 JA #LIT+272 JA #LIT+113 FSTA HINTED+3 /HINTED(2) / GOTO 2012 / JA #2012 /C /C BREAK. ONLY WORKS FOR MIRROR IN REPOSITORY AND, OF COURSE, THE VASE. /C /9280 IF(OBJ.EQ.MIRROR)SPK=148 #9280, FLDA OBJ FSUB MIRROR JNE .+6 DECIMAL LDX 148,0 OCTAL XTA 0 FSTA SPK / IF(OBJ.EQ.VASE.AND.PROP(VASE).EQ.0)GOTO 9282 FLDA OBJ FSUB VASE JNE #M96 FLDA VASE JSA RDPROP JEQ #9282 / IF(OBJ.NE.MIRROR.OR..NOT.CLOSED)GOTO 2011 #M96, FLDA OBJ FSUB MIRROR JNE #2011 FLDA CLOSED JEQ #2011 / CALL RSPEAK(197) JSR RSPEAK / GOTO 19000 JA #19000 JA #LIT+275 /C /9282 SPK=198 #9282, DECIMAL LDX 198,0 OCTAL XTA 0 FSTA SPK / IF(TOTING(VASE))CALL DROP(VASE,LOC) FLDA VASE JSA TOTING JEQ .+12 JSR DROP JA .+6 JA VASE JA LOC / PROP(VASE)=2 FLDA TWO FSTA PROP-3,3 / FIXED(VASE)=-1 FLDA MINUS1 FSTA FIXED-3,3 / GOTO 2011 JA #2011 /C /C WAKE. ONLY USE IS TO DISTURB THE DWARVES. /C /9290 IF(OBJ.NE.DWARF.OR..NOT.CLOSED)GOTO 2011 #9290, FLDA OBJ FSUB DWARF JNE #2011 FLDA CLOSED JEQ #2011 / CALL RSPEAK(199) JSR RSPEAK / GOTO 19000 JA #19000 JA #LIT+300 /C /C SUSPEND. SAVE THE WORLD. /C /8300 CALL SAVEGM(.TRUE.,I) / GOTO 2012 #8300, JSR SAVEGM JA #2012 JA ONE JA I /C /C HOURS. JUST A JOKE. /C /8310 CALL RSPEAK(201) #8310, JSR RSPEAK / GOTO 2012 JA #2012 JA #LIT+303 /C /C RESUME. RESTORE THE WORLD. /C /8320 CALL RSTRGM(.TRUE.,I) / GO TO 2012 #8320, JSR RSTRGM JA #2012 JA ONE JA I /C HINTS /C /C COME HERE IF HE'S BEEN LONG ENOUGH AT REQUIRED LOC(S) FOR SOME UNUSED HINT. /C HINT NUMBER IS IN VARIABLE "HINT". BRANCH TO QUICK TEST FOR ADDITIONAL /C CONDITIONS, THEN COME BACK TO DO NEAT STUFF. GOTO 40010 IF CONDITIONS ARE /C MET AND WE WANT TO OFFER THE HINT. GOTO 40020 TO CLEAR HINTLC BACK TO ZERO, /C 40030 TO TAKE NO ACTION YET. /C /40000 GOTO (40400,40500,40600,40700,40800,40900)(HINT-3) /C CAVE BIRD SNAKE MAZE DARK WITT #40000, FLDA HINT FSUB THREE ATX 1 STARTD FLDA .+2,1 STARTF JAC JA #40400 JA #40500 JA #40600 JA #40700 JA #40800 JA #40010 / CALL BUG(27) JSR BUG JA .+4 JA #LIT+60 /C /40010 HINTLC(HINT)=0 #40010, FLDA HINT ATX 7 FCLA FSTA HINTLC-3,7 / IF(.NOT.YES(HINTS(HINT,3),0,54))GOTO 2602 FLDA #LIT+330 / 60 (index 3) FADD HINT / hint,3 ATX 7 FLDA HINTS-77,7 FSTA #TMP JSR YES JA .+10 JA #TMP JA ZERO JA #LIT+113 JEQ #2602 / TYPE 40012,HINTS(HINT,2) JSA SPRINT JA #40012 JA TWO TRAP3 #WRITO JA #LIT JA #4001A FLDA #LIT+77 / 40 FADD HINT / HINT, 2 ATX 7 FLDA HINTS-77,7 TRAP3 #RSVO TRAP3 #RENDO JSA SPRINT JA #4001B JA ONE /40012 FORMAT(' I am prepared to give you a hint, but it will cost you', / 1 I2,' points.') / HINTED(HINT)=YES(175,HINTS(HINT,4),54) FLDA HINT ATX 6 FADD #LIT+325 / 80: HINT,4 ATX 7 FLDA HINTS-77,7 FSTA #TMP JSR YES JA .+10 JA #LIT+250 JA #TMP JA #LIT+113 FSTA HINTED-3,6 / IF(HINTED(HINT).AND.LIMIT.GT.30)LIMIT=LIMIT+30*HINTS(HINT,2) JEQ #40020 FLDA LIMIT FSUB #LIT+63 JLE #40020 FLDA #LIT+77 /80 FADD HINT /HINT,2 ATX 6 FLDA #LIT+63 FMUL HINTS-77,6 FADD LIMIT FSTA LIMIT /40020 HINTLC(HINT)=0 #40020, FLDA HINT ATX 7 FCLA FSTA HINTLC-3,7 /40030 GOTO 2602 #40030, JA #2602 /C /C NOW FOR THE QUICK TESTS. SEE DATABASE DESCRIPTION FOR ONE-LINE NOTES. /C /40400 IF(PROP(GRATE).EQ.0.AND..NOT.HERE(KEYS))GOTO 40010 #40400, FLDA GRATE JSA RDPROP JNE #40020 FLDA KEYS JSA HERE JEQ #40010 / GOTO 40020 JA #40020 /40500 IF(HERE(BIRD).AND.TOTING(ROD).AND.OBJ.EQ.BIRD)GOTO 40010 #40500, FLDA BIRD JSA HERE JEQ #2602 FLDA ROD JSA TOTING JEQ #2602 FLDA OBJ JEQ #40010 FSUB BIRD JEQ #40010 / GOTO 40030 JA #2602 /C /40600 IF(HERE(SNAKE).AND..NOT.HERE(BIRD))GOTO 40010 #40600, FLDA SNAKE JSA HERE JEQ #40020 FLDA BIRD JSA HERE JEQ #40010 / GOTO 40020 JA #40020 /C /40700 IF(ATLOC(LOC).EQ.0.AND.ATLOC(OLDLOC).EQ.0 / 1 .AND.ATLOC(OLDLC2).EQ.0.AND.HOLDNG.GT.1)GOTO 40010 #40700, FLDA LOC ATX 7 FLDA ATLOC-3,7 JNE #40020 FLDA OLDLOC ATX 6 FLDA ATLOC-3,6 JNE #40020 FLDA OLDLC2 ATX 5 FLDA ATLOC-3,5 JNE #40020 FLDA HOLDNG FSUB ONE JGT #40010 / GOTO 40020 JA #40020 /C /40800 IF(PROP(EMRALD).NE.-1.AND.PROP(PYRAM).EQ.-1)GOTO 40010 / GOTO 40020 #40800, FLDA EMRALD ATX 7 FLDA MINUS1 FSUB PROP-3,7 JEQ #40020 FLDA PYRAM ATX 6 FLDA MINUS1 FSUB PROP-3,6 JEQ #40010 / GOTO 40020 JA #40020 /C /40900 JA #40010 /#40900 JA 40010 /C CAVE CLOSING AND SCORING /C /C /C THESE SECTIONS HANDLE THE CLOSING OF THE CAVE. THE CAVE CLOSES "CLOCK1" /C TURNS AFTER THE LAST TREASURE HAS BEEN LOCATED (INCLUDING THE PIRATE'S /C CHEST, WHICH MAY OF COURSE NEVER SHOW UP). NOTE THAT THE TREASURES NEED NOT /C HAVE BEEN TAKEN YET, JUST LOCATED. HENCE CLOCK1 MUST BE LARGE ENOUGH TO GET /C OUT OF THE CAVE (IT ONLY TICKS WHILE INSIDE THE CAVE). WHEN IT HITS ZERO, /C WE BRANCH TO 10000 TO START CLOSING THE CAVE, AND THEN SIT BACK AND WAIT FOR /C HIM TO TRY TO GET OUT. IF HE DOESN'T WITHIN CLOCK2 TURNS, WE CLOSE THE /C CAVE; IF HE DOES TRY, WE ASSUME HE PANICS, AND GIVE HIM A FEW ADDITIONAL /C TURNS TO GET FRANTIC BEFORE WE CLOSE. WHEN CLOCK2 HITS ZERO, WE BRANCH TO /C 11000 TO TRANSPORT HIM INTO THE FINAL PUZZLE. NOTE THAT THE PUZZLE DEPENDS /C UPON ALL SORTS OF RANDOM THINGS. FOR INSTANCE, THERE MUST BE NO WATER OR /C OIL, SINCE THERE ARE BEANSTALKS WHICH WE DON'T WANT TO BE ABLE TO WATER, /C SINCE THE CODE CAN'T HANDLE IT. ALSO, WE CAN HAVE NO KEYS, SINCE THERE IS A /C GRATE (HAVING MOVED THE FIXED OBJECT!) THERE SEPARATING HIM FROM ALL THE /C TREASURES. MOST OF THESE PROBLEMS ARISE FROM THE USE OF NEGATIVE PROP /C NUMBERS TO SUPPRESS THE OBJECT DESCRIPTIONS UNTIL HE'S ACTUALLY MOVED THE /C OBJECTS. /C /C WHEN THE FIRST WARNING COMES, WE LOCK THE GRATE, DESTROY THE BRIDGE, KILL /C ALL THE DWARVES (AND THE PIRATE), REMOVE THE TROLL AND BEAR (UNLESS DEAD), /C AND SET "CLOSNG" TO TRUE. LEAVE THE DRAGON; TOO MUCH TROUBLE TO MOVE IT. /C FROM NOW UNTIL CLOCK2 RUNS OUT, HE CANNOT UNLOCK THE GRATE, MOVE TO ANY /C LOCATION OUTSIDE THE CAVE (LOC<9), OR CREATE THE BRIDGE. NOR CAN HE BE /C RESURRECTED IF HE DIES. NOTE THAT THE SNAKE IS ALREADY GONE, SINCE HE GOT /C TO THE TREASURE ACCESSIBLE ONLY VIA THE HALL OF THE MT. KING. ALSO, HE'S /C BEEN IN GIANT ROOM (TO GET EGGS), SO WE CAN REFER TO IT. ALSO ALSO, HE'S /C GOTTEN THE PEARL, SO WE KNOW THE BIVALVE IS AN OYSTER. *AND*, THE DWARVES /C MUST HAVE BEEN ACTIVATED, SINCE WE'VE FOUND CHEST. /C /10000 PROP(GRATE)=0 #10000, FLDA GRATE ATX 7 FCLA FSTA PROP-3,7 / PROP(FISSUR)=0 FLDA FISSUR ATX 7 FCLA FSTA PROP-3,7 / DO 10010 I=1,6 FLDA ONE FSTA I / DSEEN(I)=.FALSE. #H0204, FLDA I ATX 7 FCLA FSTA DSEEN-3,7 /10010 DLOC(I)=0 /#10010, FLDA I / ATX 7 / FCLA FSTA DLOC-3,7 FLDA I FADD ONE FSTA I FSUB #LIT+6 JLE #H0204 / CALL MOVE(TROLL,0) JSR MOVE JA .+6 JA TROLL JA ZERO / CALL MOVE(TROLL+100,0) FLDA TROLL ATX 7 FADD #LIT+154 FSTA #TMP JSR MOVE JA .+6 JA #TMP JA ZERO / CALL MOVE(TROLL2,PLAC(TROLL)) / FLDA TROLL / ATX 7 FLDA PLAC-3,7 FSTA #TMP JSR MOVE JA .+6 JA TROLL2 JA #TMP / CALL MOVE(TROLL2+100,FIXD(TROLL)) FLDA TROLL2 FADD #LIT+154 FSTA #TMP / FLDA TROLL / ATX 7 FLDA FIXD-3,7 FSTA #TMP+3 JSR MOVE JA .+6 JA #TMP JA #TMP+3 / CALL JUGGLE(CHASM) FLDA CHASM JSA JUGGLE / IF(PROP(BEAR).NE.3)CALL DSTROY(BEAR) FLDA BEAR JSA RDPROP FSUB THREE JEQ .+6 FLDA BEAR JSA DSTROY / PROP(CHAIN)=0 FLDA CHAIN ATX 7 FCLA FSTA PROP-3,7 / FIXED(CHAIN)=0 / PROP(AXE)=0 FLDA AXE ATX 7 FCLA FSTA PROP-3,7 / FIXED(AXE)=0 FSTA FIXED-3,7 / CALL RSPEAK(129) JSR RSPEAK JA .+4 JA #LIT+204 / CLOCK1=-1 FLDA MINUS1 FSTA CLOCK1 / CLOSNG=.TRUE. FLDA ONE FSTA CLOSNG / GOTO 19999 JA #19999 /C /C ONCE HE'S PANICKED, AND CLOCK2 HAS RUN OUT, WE COME HERE TO SET UP THE /C STORAGE ROOM. THE ROOM HAS TWO LOCS, HARDWIRED AS 115 (NE) AND 116 (SW). /C AT THE NE END, WE PLACE EMPTY BOTTLES, A NURSERY OF PLANTS, A BED OF /C OYSTERS, A PILE OF LAMPS, RODS WITH STARS, SLEEPING DWARVES, AND HIM. AND /C THE SW END WE PLACE GRATE OVER TREASURES, SNAKE PIT, COVEY OF CAGED BIRDS, /C MORE RODS, AND PILLOWS. A MIRROR STRETCHES ACROSS ONE WALL. MANY OF THE /C OBJECTS COME FROM KNOWN LOCATIONS AND/OR STATES (E.G. THE SNAKE IS KNOWN TO /C HAVE BEEN DESTROYED AND NEEDN'T BE CARRIED AWAY FROM ITS OLD "PLACE"), /C MAKING THE VARIOUS OBJECTS BE HANDLED DIFFERENTLY. WE ALSO DROP ALL OTHER /C OBJECTS HE MIGHT BE CARRYING (LEST HE HAVE SOME WHICH COULD CAUSE TROUBLE, /C SUCH AS THE KEYS). WE DESCRIBE THE FLASH OF LIGHT AND TRUNDLE BACK. /C /11000 PROP(BOTTLE)=PUT(BOTTLE,115,1) #11000, FLDA BOTTLE ATX 7 JSR PUT JA .+10 JA BOTTLE JA #LIT+165 JA ONE FSTA PROP-3,7 / PROP(PLANT)=PUT(PLANT,115,0) FLDA PLANT ATX 7 JSR PUT JA .+10 JA PLANT JA #LIT+165 JA ZERO FSTA PROP-3,7 / PROP(OYSTER)=PUT(OYSTER,115,0) FLDA OYSTER ATX 7 JSR PUT JA .+10 JA OYSTER JA #LIT+165 JA ZERO FSTA PROP-3,7 / PROP(LAMP)=PUT(LAMP,115,0) FLDA LAMP ATX 7 JSR PUT JA .+10 JA LAMP JA #LIT+165 JA ZERO FSTA PROP-3,7 / PROP(ROD)=PUT(ROD,115,0) FLDA ROD ATX 7 JSR PUT JA .+10 JA ROD JA #LIT+165 JA ZERO FSTA PROP-3,7 / PROP(DWARF)=PUT(DWARF,115,0) FLDA DWARF ATX 7 JSR PUT JA .+10 JA DWARF JA #LIT+165 JA ZERO FSTA PROP-3,7 / LOC=115 / OLDLOC=115 / NEWLOC=115 FLDA #LIT+165 FSTA LOC FSTA OLDLOC FSTA NEWLOC /C /C LEAVE THE GRATE WITH NORMAL (NON-NEGATIVE PROPERTY). /C / I=PUT(GRATE,116,0) JSR PUT JA .+10 JA GRATE JA #LIT+170 JA ZERO FSTA I / PROP(SNAKE)=PUT(SNAKE,116,1) FLDA SNAKE ATX 7 JSR PUT JA .+10 JA SNAKE JA #LIT+170 JA ONE FSTA PROP-3,7 / PROP(BIRD)=PUT(BIRD,116,1) FLDA BIRD ATX 7 JSR PUT JA .+10 JA BIRD JA #LIT+170 JA ONE FSTA PROP-3,7 / PROP(CAGE)=PUT(CAGE,116,0) FLDA CAGE ATX 7 JSR PUT JA .+10 JA CAGE JA #LIT+170 JA ZERO FSTA PROP-3,7 / PROP(ROD2)=PUT(ROD2,116,0) FLDA ROD2 ATX 7 JSR PUT JA .+10 JA ROD2 JA #LIT+170 JA ZERO FSTA PROP-3,7 / PROP(PILLOW)=PUT(PILLOW,116,0) FLDA PILLOW ATX 7 JSR PUT JA .+10 JA PILLOW JA #LIT+170 JA ZERO FSTA PROP-3,7 /C / PROP(MIRROR)=PUT(MIRROR,115,0) FLDA MIRROR ATX 7 JSR PUT JA .+10 JA MIRROR JA #LIT+165 JA ZERO FSTA PROP-3,7 / FIXED(MIRROR)=116 FLDA #LIT+170 FSTA FIXED-3,7 /C / DO 11010 I=1,100 FLDA ONE FSTA I /11010 IF(TOTING(I))CALL DSTROY(I) #11010, FLDA I JSA TOTING JEQ .+6 FLDA I JSA DSTROY FLDA I FADD ONE FSTA I FSUB #LIT+154 JLE #11010 /C / CALL RSPEAK(132) JSR RSPEAK JA .+4 JA #LIT+215 / CLOSED=.TRUE. FLDA ONE FSTA CLOSED / GOTO 2 JA #2 /C /C ANOTHER WAY WE CAN FORCE AN END TO THINGS IS BY HAVING THE LAMP GIVE OUT. /C WHEN IT GETS CLOSE, WE COME HERE TO WARN HIM. WE GO TO 12000 IF THE LAMP /C AND FRESH BATTERIES ARE HERE, IN WHICH CASE WE REPLACE THE BATTERIES AND /C CONTINUE. 12200 IS FOR OTHER CASES OF LAMP DYING.12400 IS WHEN IT GOES /C OUT, AND 12600 IS IF HE'S WANDERED OUTSIDE AND THE LAMP IS USED UP, IN WHICH /C CASE WE FORCE HIM TO GIVE UP. /C /12000 CALL RSPEAK(188) #12000, JSR RSPEAK JA .+4 JA #LIT+264 / PROP(BATTER)=1 FLDA BATTER ATX 7 FLDA ONE FSTA PROP-3,7 / IF(TOTING(BATTER))CALL DROP(BATTER,LOC) FLDA BATTER JSA TOTING JEQ .+12 JSR DROP JA .+6 JA BATTER JA LOC / LIMIT=LIMIT+2500 FLDA #LIT+317 FADDM LIMIT / LMWARN=.FALSE. FCLA FSTA LMWARN / GOTO 19999 JA #19999 /C /12200 IF(LMWARN.OR..NOT.HERE(LAMP))GOTO 19999 #12200, FLDA LAMP JSA HERE JEQ #19999 FLDA LMWARN JNE #19999 / LMWARN=.TRUE. FLDA ONE FSTA LMWARN / SPK=187 DECIMAL LDX 187,0 OCTAL XTA 0 FSTA SPK / IF(PLACE(BATTER).EQ.0)SPK=183 FLDA BATTER ATX 7 FLDA PLACE-3,7 JNE .+6 DECIMAL LDX 183,0 OCTAL XTA 0 FSTA SPK / IF(PROP(BATTER).EQ.1)SPK=189 FLDA PROP-3,7 FSUB ONE JNE .+6 DECIMAL LDX 189,0 OCTAL XTA 0 FSTA SPK / CALL RSPEAK(SPK) #H0214, JSR RSPEAK JA #19999 JA SPK / GOTO 19999 /C /12400 LIMIT=-1 #12400, FLDA MINUS1 FSTA LIMIT / PROP(LAMP)=0 FLDA LAMP ATX 7 FCLA FSTA PROP-3,7 / IF(HERE(LAMP))CALL RSPEAK(184) FLDA LAMP JSA HERE / GOTO 19999 JEQ #19999 JSR RSPEAK JA #19999 JA #LIT+253 /C /12600 CALL RSPEAK(185) #12600, JSR RSPEAK JA .+4 JA #LIT+256 / GAVEUP=.TRUE. FLDA ONE FSTA GAVEUP / GOTO 20000 JA #20000 /C /C /C OH DEAR, HE'S DISTURBED THE DWARVES. /C /19000 CALL RSPEAK(136) #19000, JSR RSPEAK JA .+4 JA #LIT+220 /C /C EXIT CODE. WILL EVENTUALLY INCLUDE SCORING. FOR NOW, HOWEVER, ... /C /C THE PRESENT SCORING ALGORITHM IS AS FOLLOWS: /C OBJECTIVE: POINTS: PRESENT TOTAL POSSIBLE: /C GETTING WELL INTO CAVE 25 25 /C EACH TREASURE < CHEST 12 60 /C TREASURE CHEST ITSELF 14 14 /C EACH TREASURE > CHEST 16 144 /C SURVIVING (MAX-NUM)*10 30 /C NOT QUITTING 4 4 /C REACHING "CLOSNG" 25 25 /C "CLOSED": QUIT/KILLED 10 /C KLUTZED 25 /C WRONG WAY 30 /C SUCCESS 45 45 /C CAME TO WITT'S END 1 1 /C ROUND OUT THE TOTAL 2 2 /C TOTAL: 350 /20000 SCORE=0 #20000, FCLA FSTA SCORE / MXSCOR=0 FSTA MXSCOR /C /C FIRST TALLY UP THE TREASURES. MUST BE IN BUILDING AND NOT BROKEN. /C GIVE THE POOR GUY 2 POINTS JUST FOR FINDING EACH TREASURE. /C / DO 20010 I=50,MAXTRS FLDA #LIT+110 FSTA I / IF(PTEXT(I).EQ.0)GOTO 20010 #H0216, FLDA I ATX 7 FLDA PTEXT-3,7 JEQ #20010 / K=12 FLDA #LIT+22 FSTA K / IF(I.EQ.CHEST)K=14 FLDA I FSUB CHEST JNE .+7 DECIMAL LDX 14,0 OCTAL XTA 0 FSTA K / IF(I.GT.CHEST)K=16 FLDA I FSUB CHEST JLE .+5 FLDA #LIT+30 FSTA K / IF(PROP(I).GE.0)SCORE=SCORE+2 FLDA PROP-3,7 JLT .+5 FLDA TWO FADDM SCORE / IF(PLACE(I).EQ.3.AND.PROP(I).EQ.0)SCORE=SCORE+K-2 FLDA PLACE-3,7 FSUB THREE JNE #M100 FLDA PROP-3,7 JNE #M100 FLDA SCORE FADD K FSUB TWO FSTA SCORE / MXSCOR=MXSCOR+K #M100, FLDA K FADDM MXSCOR /20010 CONTINUE #20010, FLDA I FADD ONE FSTA I FSUB MAXTRS JLE #H0216 /C /C NOW LOOK AT HOW HE FINISHED AND HOW FAR HE GOT. MAXDIE AND NUMDIE TELL US /C HOW WELL HE SURVIVED. GAVEUP SAYS WHETHER HE EXITED VIA QUIT. DFLAG WILL /C TELL US IF HE EVER GOT SUITABLY DEEP INTO THE CAVE. CLOSNG STILL INDICATES /C WHETHER HE REACHED THE ENDGAME. AND IF HE GOT AS FAR AS "CAVE CLOSED" /C (INDICATED BY "CLOSED"), THEN BONUS IS ZERO FOR MUNDANE EXITS OR 133, 134, /C 135 IF HE BLEW IT (SO TO SPEAK). /C / SCORE=SCORE+(MAXDIE-NUMDIE)*10 FLDA MAXDIE FSUB NUMDIE FMUL #LIT+17 FADDM SCORE / MXSCOR=MXSCOR+MAXDIE*10 FLDA MAXDIE FMUL #LIT+17 FADDM MXSCOR / IF(.NOT.(SCORNG.OR.GAVEUP))SCORE=SCORE+4 FLDA SCORNG FADD GAVEUP JNE .+5 FLDA #LIT FADDM SCORE / MXSCOR=MXSCOR+4 FLDA #LIT FADDM MXSCOR / IF(DFLAG.NE.0)SCORE=SCORE+25 FLDA DFLAG JEQ .+5 FLDA #LIT+52 FADDM SCORE / MXSCOR=MXSCOR+25 FLDA #LIT+52 FADDM MXSCOR / IF(CLOSNG)SCORE=SCORE+25 FLDA CLOSNG JEQ .+5 FLDA #LIT+52 FADDM SCORE / MXSCOR=MXSCOR+25 FLDA #LIT+52 FADDM MXSCOR / IF(.NOT.CLOSED)GOTO 20020 FLDA CLOSED JEQ #20020 / IF(BONUS.EQ.0)SCORE=SCORE+10 FLDA BONUS JNE .+5 FLDA #LIT+17 FADDM SCORE / IF(BONUS.EQ.135)SCORE=SCORE+25 DECIMAL LDX 135,0 OCTAL XTA 0 FSUB BONUS JNE .+5 FLDA #LIT+52 FADDM SCORE / IF(BONUS.EQ.134)SCORE=SCORE+30 DECIMAL LDX 134,0 OCTAL XTA 0 FSUB BONUS JNE .+5 FLDA #LIT+63 FADDM SCORE / IF(BONUS.EQ.133)SCORE=SCORE+45 DECIMAL LDX 133,0 OCTAL XTA 0 FSUB BONUS JNE #20020 FLDA #LIT+102 FADDM SCORE /20020 MXSCOR=MXSCOR+45 #20020, FLDA #LIT+102 FADDM MXSCOR /C /C DID HE COME TO WITT'S END AS HE SHOULD? /C / IF(PLACE(MAGZIN).EQ.108)SCORE=SCORE+1 FLDA MAGZIN ATX 7 DECIMAL LDX 108,0 OCTAL XTA 0 FSUB PLACE-3,7 JNE .+5 FLDA ONE FADDM SCORE / MXSCOR=MXSCOR+1 FLDA ONE FADDM MXSCOR /C /C ROUND IT OFF. /C / SCORE=SCORE+2 FLDA TWO FADDM SCORE / MXSCOR=MXSCOR+2 FADDM MXSCOR /C /C DEDUCT POINTS FOR HINTS. HINTS < 4 ARE SPECIAL; SEE DATABASE DESCRIPTION. /C / DO 20030 I=1,HNTMAX FLDA ONE FSTA I /20030 IF(HINTED(I))SCORE=SCORE-HINTS(I,2) #20030, FLDA I ATX 7 FLDA HINTED-3,7 JEQ .+14 FLDA #LIT+77 /20 FADD I /I, 2 ATX 6 FLDA SCORE FSUB HINTS-77,6 FSTA SCORE FLDA I FADD ONE FSTA I FSUB HNTMAX JLE #20030 /C /C RETURN TO SCORE COMMAND IF THAT'S WHERE WE CAME FROM. /C / IF(SCORNG)GOTO 8241 FLDA SCORNG JNE #8241 /C /C THAT SHOULD BE GOOD ENOUGH. LET'S TELL HIM ALL ABOUT IT. /C / TYPE 20100,SCORE,MXSCOR,TURNS JSA SPRINT JA #20100 JA TWO TRAP3 #WRITO JA #LIT JA #2010A FLDA SCORE TRAP3 #RSVO TRAP3 #RENDO JSA SPRINT JA #2010B JA THREE TRAP3 #WRITO JA #LIT JA #2010A FLDA MXSCOR TRAP3 #RSVO TRAP3 #RENDO JSA SPRINT JA #2010C JA THREE TRAP3 #WRITO JA #LIT JA #2010D FLDA TURNS TRAP3 #RSVO TRAP3 #RENDO JSA SPRINT JA #2010E JA ONE /20100 FORMAT(/' You scored',I4,' out of a possible',I4, / 1 ', using',I5,' turns.') /C / DO 20200 I=1,CLSSES FLDA ONE FSTA I / IF(CVAL(I).GE.SCORE)GOTO 20210 #I0064, FLDA I ATX 7 FLDA CVAL-3,7 FSUB SCORE JGE #20210 /20200 CONTINUE #20200, FLDA I FADD ONE FSTA I FSUB CLSSES JLE #I0064 / TYPE 20202 JSA SPRINT JA #20202 JA ZERO /20202 FORMAT(' You just went off my scale!!'/) / GOTO 25000 JA #25000 /C /20210 CALL SPEAK(CTEXT(I)) #20210, FLDA I ATX 7 FLDA CTEXT-3,7 /GET CLASS MESSAGE FSTA #TMP+3 JSR SPEAK JA .+4 JA #TMP+3 / IF(I.EQ.CLSSES-1)GOTO 20220 FLDA CLSSES FSUB ONE FSUB I JEQ #20220 / K=CVAL(I)+1-SCORE FLDA I ATX 7 FLDA CVAL-3,7 FADD ONE FSUB SCORE FSTA K / TYPE 20212,K JSA SPRINT JA #20212 JA TWO JSA SPRINT JA #2021A JA THREE TRAP3 #WRITO JA #LIT JA #2021B FLDA K TRAP3 #RSVO TRAP3 #RENDO JSA SPRINT JA #2021C JA THREE /20212 FORMAT(' To achieve the next higher rating, you need',I3, / 1 ' more point',$) / IF(K.EQ.1) TYPE 20213 FLDA K FSUB ONE JNE .+12 JSA SPRINT JA #20213 JA ONE JA #25000 / IF(K.NE.1) TYPE 20214 JSA SPRINT JA #20214 JA ONE /20213 FORMAT('+.'/) /20214 FORMAT('+s.'/) / GOTO 25000 JA #25000 /C /20220 TYPE 20222 #20220, JSA SPRINT JA #20212 JA TWO JSA SPRINT JA #20222 JA ONE JSA SPRINT JA #20223 JA ZERO /20222 FORMAT(' To achieve the next higher rating ', / 1 'would be a neat trick!'/' Congratulations!!'/) / RETURN JA #GOBAK / END / / Fortran Formats: / #67A, TEXT %T]HERE ARE @% #67, TEXT %('+',I1,$)% #67B, TEXT % T]HREATENING LITTLE DWARVES IN THE ROOM WITH YOU.@% #68, #78, TEXT %(1X,I1,$)% #78B, TEXT % ]OF THEM THROW KNIVES AT YOU!@% #68B, TEXT % ]OF THEM GET YOU!@% #5015, TEXT %W]HAT DO YOU WANT TO DO WITH THE @% #5199, TEXT %I] DON'T SEE ANY "@% #8002, TEXT %I ]DON'T UNDERSTAND "@% #9032, TEXT %O]KAY, "@% #8243, TEXT %I]F YOU WERE TO QUIT NOW, YOU WOULD SCORE @% #2010A, #2021B, #8243A, TEXT %('+',I3,$)% #2010B, #8243B, TEXT % ]OUT OF A POSSIBLE @% #20213, #8243C, TEXT %.@% #40012, TEXT %I] AM PREPARED TO GIVE YOU A HINT, BUT IT WILL COST YOU @% #4001A, TEXT %('+',I2,$)% #4001B, TEXT % ]POINTS.@% #20100, TEXT %Y]OU SCORED @% #2010C, TEXT % ]USING @% #2010D, TEXT %('+',I5,$)% #2010E, TEXT % ]TURNS.@% #20202, TEXT %Y]OU JUST WENT OFF MY SCALE!!@% #20212, TEXT %T]O ACHIEVE THE NEXT HIGHER RATING@% #2021A, TEXT %, ]YOU NEED @% #2021C, TEXT % ]MORE POINT@% #20214, TEXT %]S.@% #20222, TEXT %] WOULD BE A NEAT TRICK!@% #20223, TEXT %C]ONGRATULATIONS!!@% END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 | SECT BTSET ENTRY ISHFT ENTRY BITSET ENTRY #ANDER EXTERN #RETRN EXTERN #FIX SECT8 BITTER #ANDER, TAD #XR /Simple masking AND #XR+1 DCA #XR CIF CDF JMP% #XR+2 / Return /FPP code here; using the rest of the SECT8 page. SECNAM, TEXT +BITSET+ /For traceback #RET, SETX #XR /Return addr SETB #BASE JA .+3 #BASE, ORG .+3 /Base 0 N, ORG .+3 /Base 1 - value L, ORG .+3 #BSET, TEXT +BITSET+ /Base 2 - section name #ISH, TEXT +ISHFT + /Base 3 / Now at address 23, past autoindex registers. #XR, FNOP /XR 0 ADDR #RETRN /XR 1; XR2 return to FRTS address. ORG #XR+10 / Space for our index regs ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 #LBL=. COMMON MISCOM LINUSE, ORG .+0003 TRVS, ORG .+0003 CLSSES, ORG .+0003 OLDLOC, ORG .+0003 LOC, ORG .+0003 CVAL, ORG .+0044 TK, ORG .+0074 NEWLOC, ORG .+0003 KEY, ORG .+0702 PLAC, ORG .+0454 FIXD, ORG .+0454 ACTSPK, ORG .+0151 COND, ORG .+0702 HINTS, ORG .+0360 HNTMAX, ORG .+0003 PROP, ORG .+0454 TALLY, ORG .+0003 TALLY2, ORG .+0003 HINTLC, ORG .+0074 CHLOC, ORG .+0003 CHLOC2, ORG .+0003 DSEEN, ORG .+0022 DFLAG, ORG .+0003 DLOC, ORG .+0022 DALTLC, ORG .+0003 KEYS, ORG .+0003 LAMP, ORG .+0003 GRATE, ORG .+0003 CAGE, ORG .+0003 ROD, ORG .+0003 ROD2, ORG .+0003 STEPS, ORG .+0003 BIRD, ORG .+0003 DOOR, ORG .+0003 PILLOW, ORG .+0003 SNAKE, ORG .+0003 FISSUR, ORG .+0003 TABLET, ORG .+0003 CLAM, ORG .+0003 OYSTER, ORG .+0003 MAGZIN, ORG .+0003 DWARF, ORG .+0003 KNIFE, ORG .+0003 FOOD, ORG .+0003 BOTTLE, ORG .+0003 WATER, ORG .+0003 OIL, ORG .+0003 PLANT, ORG .+0003 PLANT2, ORG .+0003 AXE, ORG .+0003 MIRROR, ORG .+0003 DRAGON, ORG .+0003 CHASM, ORG .+0003 TROLL, ORG .+0003 TROLL2, ORG .+0003 BEAR, ORG .+0003 MESSAG, ORG .+0003 VEND, ORG .+0003 BATTER, ORG .+0003 NUGGET, ORG .+0003 COINS, ORG .+0003 CHEST, ORG .+0003 EGGS, ORG .+0003 TRIDNT, ORG .+0003 VASE, ORG .+0003 EMRALD, ORG .+0003 PYRAM, ORG .+0003 PEARL, ORG .+0003 RUG, ORG .+0003 CHAIN, ORG .+0003 BACK, ORG .+0003 LOOK, ORG .+0003 CAVE, ORG .+0003 NULL, ORG .+0003 ENTRNC, ORG .+0003 DPRSSN, ORG .+0003 SAY, ORG .+0003 LOCK, ORG .+0003 THROW, ORG .+0003 FIND, ORG .+0003 INVENT, ORG .+0003 TURNS, ORG .+0003 LMWARN, ORG .+0003 KNFLOC, ORG .+0003 DETAIL, ORG .+0003 ABBNUM, ORG .+0003 NUMDIE, ORG .+0003 MAXDIE, ORG .+0003 DKILL, ORG .+0003 FOOBAR, ORG .+0003 BONUS, ORG .+0003 CLOCK1, ORG .+0003 CLOCK2, ORG .+0003 CLOSNG, ORG .+0003 PANIC, ORG .+0003 CLOSED, ORG .+0003 GAVEUP, ORG .+0003 SCORNG, ORG .+0003 ODLOC, ORG .+0022 STREAM, ORG .+0003 SPICES, ORG .+0003 ORG #LBL COUNT, ORG .+3 ONE, F 1.0 /BITSET(L,N) = (COND(L).AND.ISHFT(1,N)) .NE.0 BITSET, FLDA #BSET /Section name JSA GETARG /Common setup BASE #BASE FLDA% L /Get array index ATX 1 FLDA COND-0003,1 /COND(L) FSTA ITEST / COND(L) LDX 1,0 /Put 1 into shift value FLDA% N /Get N value JEQ #1 /No shift if zero FNEG /Negate ATX 1 /Into register XTA 0 /Get the "1" back ALN 0 STARTD ALN 1 /Do the shift STARTF ATX 0 /Put result in place #1, XTA 0 /Get result JSA #FIX ATX 0 /One mask value FLDA ITEST JSA #FIX ATX 1 /The other TRAP3 #ANDER /AND it XTA 0 /Restore value JEQ #GOBAK /Return if zero FLDA ONE /Else one JA #GOBAK /Done. ITEST, ORG .+3 /Test value / / ISHFT entry point / BASE 0 ISHFT, FLDA #ISH /Section name JSA GETARG /Common setup BASE #BASE FLDA% N /Get shift count JEQ #SKIP /No need to shift FNEG /Negative shift count goes left ATX 1 /Into XR 1 FLDA% L /Get value to shift ALN 0 /Align to right STARTD ALN 1 /Shift STARTF /Done JSA #FIX JA #GOBAK /Done #SKIP, FLDA% L /Get value back JA #GOBAK /Done GETARG, 0;0 /Common setup routine FSTA SECNAM /AC has section name STARTD 0210 /Get caller's return FSTA #GOBAK,0 0200 /Get arg list SETX #XR /Set up index registers SETB #BASE /Set up base page FSTA #BASE /Set up arg list LDX 0,1 /Zero to XR #1 FLDA% #BASE,1+ /Get first arg FSTA L FLDA% #BASE,1+ /Second arg FSTA N STARTF JA GETARG /Return END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | SUBROUTINE BUG(NUM) C C THE FOLLOWING CONDITIONS ARE CURRENTLY CONSIDERED FATAL BUGS. NUMBERS < 20 C ARE DETECTED WHILE READING THE DATABASE; THE OTHERS OCCUR AT "RUN TIME". C 0 MESSAGE LINE > 70 CHARACTERS C 1 NULL LINE IN MESSAGE C 2 TOO MANY WORDS OF MESSAGES C 3 TOO MANY TRAVEL OPTIONS C 4 TOO MANY VOCABULARY WORDS C 5 REQUIRED VOCABULARY WORD NOT FOUND C 6 TOO MANY RTEXT OR MTEXT MESSAGES C 7 TOO MANY HINTS C 8 LOCATION HAS COND BIT BEING SET TWICE C 9 INVALID SECTION NUMBER IN DATABASE C 20 SPECIAL TRAVEL (500>L>300) EXCEEDS GOTO LIST C 21 RAN OFF END OF VOCABULARY TABLE C 22 VOCABULARY TYPE (N/1000) NOT BETWEEN 0 AND 3 C 23 INTRANSITIVE ACTION VERB EXCEEDS GOTO LIST C 24 TRANSITIVE ACTION VERB EXCEEDS GOTO LIST C 25 CONDITIONAL TRAVEL ENTRY WITH NO ALTERNATIVE C 26 LOCATION HAS NO TRAVEL ENTRIES C 27 HINT NUMBER EXCEEDS GOTO LIST C 28 INVALID MONTH RETURNED BY DATE FUNCTION C WRITE(4,1)NUM 1 FORMAT (' FATAL ERROR ',I3,', CONSULT YOUR LOCAL WIZARD.'/) STOP END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | SECT CARRY / SUBROUTINE CARRY(OBJECT,WHERE) / C / C START TOTING AN OBJECT, REMOVING IT FROM THE LIST OF THINGS AT ITS FORMER / C LOCATION. INCR HOLDNG UNLESS IT WAS ALREADY BEING TOTED. IF OBJECT>100 / C (MOVING "FIXED" SECOND LOC), DON'T CHANGE PLACE OR HOLDNG. / C / IMPLICIT INTEGER (A-Z) / COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG / DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100) / C JA #ST #XR, ORG .+10 TEXT +CARRY+ #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+6 OBJECT, ORG .+3 WHERE, ORG .+3 HUND, F 100.0 ONE, F 1.0 M1, F -1.0 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 #LBL=. COMMON PLACOM ATLOC, ORG .+0702 LINK, ORG .+1130 PLACE, ORG .+0454 FIXED, ORG .+0454 HOLDNG, ORG .+3 ORG #LBL #RTN, BASE #BASE JA #GOBAK #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA OBJECT FLDA% #BASE,1+ FSTA WHERE STARTF FLDA% WHERE /Pre-load indexes ATX 6 FLDA% OBJECT ATX 7 /Fall thru with OBJECT in AC / IF(OBJECT.GT.100)GOTO 5 FSUB HUND JGT #5 / IF(PLACE(OBJECT).EQ.-1)RETURN FLDA ONE FADD PLACE-3,7 JEQ #RTN / PLACE(OBJECT)=-1 FLDA M1 FSTA PLACE-3,7 / HOLDNG=HOLDNG+1 FLDA ONE FADDM HOLDNG / 5 IF(ATLOC(WHERE).NE.OBJECT)GOTO 6 #5, FLDA ATLOC-3,6 FSUB% OBJECT JNE #6 / ATLOC(WHERE)=LINK(OBJECT) FLDA LINK-3,7 FSTA ATLOC-3,6 / RETURN JA #RTN / 6 TEMP=ATLOC(WHERE) #6, FLDA ATLOC-3,6 / 7 IF(LINK(TEMP).EQ.OBJECT)GOTO 8 #7, ATX 5 FLDA LINK-3,5 FSUB% OBJECT JEQ #8 / TEMP=LINK(TEMP) FLDA LINK-3,5 / GOTO 7 JA #7 / 8 LINK(TEMP)=LINK(OBJECT) #8, FLDA LINK-3,7 FSTA LINK-3,5 / RETURN / END JA #RTN END |
> > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $JOB TO DELETE ADVENT STUFF .DEL ADVENT.LD,COMPIL.BI,LOAD.BI,TEXT.TX .DEL ADVENT.FT,A5TOA1.RA,BITSET.RA,BUG.FT .DEL CARRY.RA,DARK.RA,DECODE.RA,DROP.RA .DEL DSTROY.RA,GETIN.FT,HERE.RA,INITABITSET.RA,BUG.FT .DEL CARRY.RA,DARK.RA,DECODE.RA,DROP.RA .DEL DSTROY.RA,GETIN.FT,HERE.RA,INITABITSET.RA,BUG.FT .DEL CARRY.RA,DARK.RA,DECODE.RA,DROP.RA .DEL DSTROY.RA,GETIN.FT,HERE.RA,INITABITSET.RA,BUG.FT .DEL CARRY.RA,DARK.RA,DECODE.RA,DROP.RA .DEL DSTROY.RA,GETIN.FT,HERE.RA,INITA .DEL MOVE.RL,PCT.RL,PSPEAK.RL,PUT.RL .DEL RKB.RL,RSPEAK.RL,SEED.RL,SPEAK.RL .DEL TRVLOC.RL,V .DEL MOVE.RL,PCT.RL,PSPEAK.RL,PUT.RL .DEL RKB.RL,RSPEAK.RL,SEED.RL,SPEAK.RL .DEL TRVLOC.RL,V .DEL MOVE.RL,PCT.RL,PSPEAK.RL,PUT.RL .DEL RKB.RL,RSPEAK.RL,SEED.RL,SPEAK.RL .DEL TRVLOC.RL,V |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | $JOB COMPILE ADVENT STUFF .COMPILE ADVENT/N/Q .COMPILE A5TOA1.RA .COMPILE AMAIN.RA .COMPILE BITSET.RA .COMPILE BUG/N/Q .COMPILE CARRY.RA .COMPILE DROP.RA .COMPILE DSTROY.RA .COMPILE GETIN/N/Q .COMPILE GETWRD.RA .COMPILE INITAD/N/Q .COMPILE IO/N/Q .COMPILE JUGGLE.RA .COMPILE MOVE.RA .COMPILE PCT.RA .COMPILE PSPEAK.RA .COMPILE PUT.RA .COMPILE RND/N/Q .COMPILE RSPEAK.RA .COMPILE RSTRGM/N/Q .COMPILE SAVEGM/N/Q .COMPILE SEED.RA .COMPILE SPEAK.RA .COMPILE VOCAB.RA .COMPILE USR.RA .COMPILE YES/N/Q $END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | SECT DROP / SUBROUTINE DROP(OBJECT,WHERE) / C / C PLACE AN OBJECT AT A GIVEN LOC, PREFIXING IT ONTO THE ATLOC LIST. / C DECR HOLDNG IF THE OBJECT WAS BEING TOTED. / C / IMPLICIT INTEGER (A-Z) / COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG / DIMENSION ATLOC(150) / DIMENSION LINK(200) / DIMENSION PLACE(100) / DIMENSION FIXED(100) JA #ST #XR, ORG .+10 TEXT +DROP + #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+6 OBJECT, ORG .+3 WHERE, ORG .+3 ONE, F 1.0 HUND, F 100.0 M1, F -1.0 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 #LBL=. COMMON PLACOM ATLOC, ORG .+702 LINK, ORG .+1130 PLACE, ORG .+454 FIXED, ORG .+454 HOLDNG, ORG .+3 ORG #LBL #RTN, BASE #BASE JA #GOBAK #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA OBJECT FLDA% #BASE,1+ FSTA WHERE STARTF FLDA% WHERE /Pre-load index regs ATX 6 FLDA% OBJECT ATX 7 / IF(OBJECT.GT.100)GOTO 1 FSUB HUND ATX 5 /Save object-100 JGT #1 / IF(PLACE(OBJECT).EQ.-1)HOLDNG=HOLDNG-1 FLDA ONE FADD PLACE-3,7 JNE #G1 FLDA M1 FADDM HOLDNG / PLACE(OBJECT)=WHERE #G1, FLDA% WHERE FSTA PLACE-3,7 / GOTO 2 JA #2 / 1 FIXED(OBJECT-100)=WHERE #1, FLDA% WHERE FSTA FIXED-3,5 / 2 IF(WHERE.LE.0)RETURN #2, JLE #RTN / LINK(OBJECT)=ATLOC(WHERE) #G2, FLDA ATLOC-3,6 FSTA LINK-3,7 / ATLOC(WHERE)=OBJECT XTA 7 FSTA ATLOC-3,6 / RETURN / END JA #RTN END |
> > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | SECT DSTROY / SUBROUTINE DSTROY(OBJECT) / C / C PERMANENTLY ELIMINATE "OBJECT" BY MOVING TO A NON-EXISTENT LOCATION. / C / / IMPLICIT INTEGER (A-Z) EXTERN MOVE /DSTROY, 0;0 / Subroutine entry point FSTA TEMP / CALL MOVE(OBJECT,0) / RETURN / END JSR MOVE JA DSTROY JA TEMP JA ZERO TEMP, ORG .+3 ZERO, F 0.0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | C ADVENTURES SUBROUTINE DUMPDB C ADVENTURES C C MODIFIED BY KENT BLACKETT C ENGINEERING SYSTEMS GROUP C DIGITAL EQUIPMENT CORP. C 15-JUL-77 C MODIFIED BY BOB SUPNIK C DISK ENGINEERING C 21-OCT-77 C MODIFIED BY BOB SUPNIK C DISK ENGINEERING C 25-AUG-78 C MODIFIED BY BOB SUPNIK C SMALL SYSTEMS C 12-NOV-78 C ORIGINAL VERSION WAS FOR DECSYSTEM-10 C NEXT VERSION WAS FOR FORTRAN IV-PLUS UNDER C THE IAS OPERATING SYSTEM ON THE PDP-11/70 C THIS VERSION IS FOR FORTRAN IV (V01C OR LATER) C UNDER RT-11 ON *ANY* PDP-11 C C C CURRENT LIMITS: C 750 TRAVEL OPTIONS (TRAVEL, TRVSIZ). C 300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). C 150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ). C 100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP). C 35 "ACTION" VERBS (ACTSPK, VRBSIZ). C 205 RANDOM MESSAGES (RTEXT, RTXSIZ). C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ). C THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF C THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE, C SO THERE CAN'T BE MORE THAN 1000 WORDS.) THESE UPPER LIMITS ARE: C 1000 NON-SYNONYMOUS VOCABULARY WORDS C 300 LOCATIONS C 100 OBJECTS C C IMPLICIT INTEGER (A-Z) LOGICAL LMWARN,CLOSNG,PANIC,HINTED, 1 CLOSED,GAVEUP,SCORNG,DSEEN,BITSET C COMMON /VERSN/ VMAJ, VMIN, VEDIT COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA COMMON /VOCCOM/ KTAB,ATAB,TABSIZ COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG COMMON /PTXCOM/ PTEXT COMMON /ABBCOM/ ABB COMMON /MISCOM/ LINUSE,TRVS,CLSSES,OLDLOC,LOC,CVAL,TK,NEWLOC, 1 KEY,PLAC,FIXD,ACTSPK,COND,HINTS,HNTMAX,PROP,TALLY,TALLY2, 2 HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,LAMP,GRATE COMMON /MISCOM/ 3 CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET, 4 CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE,WATER,OIL,PLANT, 5 PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND, 6 BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM COMMON /MISCOM/ 7 PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK, 8 THROW,FIND,INVENT,TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM, 9 NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2, 1 CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG,ODLOC,STREAM,SPICES COMMON /MISC2/ I,RTXSIZ,CLSMAX,LOCSIZ,CTEXT,STEXT,LTEXT, 1 SECT,TRAVEL,TRVCON,TRVLOC,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ, 2 MAXTRS,HINTED,HNTLOC,KK C INTEGER LINES(12),DATA(52),RECORD C The TRAVEL, TRVCON, and TRVLOC arrays are C Packed with words 0,1,2 holding the data. Saves lots C of wasted space at the expense of some complexity. INTEGER TRAVEL(250), TRVCON(250), TRVLOC(250), TRVSIZ INTEGER KTAB(300),ATAB(300),TABSIZ INTEGER LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150), 1 ATLOC(150) INTEGER PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200), 1 PTEXT(100),PROP(100),HOLDNG INTEGER ACTSPK(35) INTEGER RTEXT(205) INTEGER CTEXT(12),CVAL(12) INTEGER HINTLC(20),HINTS(20,4) DIMENSION HINTED(20) INTEGER TK(20),DLOC(6),ODLOC(6) DIMENSION DSEEN(6) INTEGER ASCVAR, TXTLOC, TRVS, CLSSES, OLDLOC INTEGER HNTSIZ, HNTMAX, TALLY, TALLY2, CHLOC, CHLOC2, DFLAG INTEGER DALTLC,GRATE,CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE INTEGER FISSUR,TABLET,CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE INTEGER WATER,OIL,PLANT,PLANT2,AXE,MIRROR,DRAGON,CHASM INTEGER BEAR,MESSAG,VEND,BATTER,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD INTEGER PYRAM,PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY INTEGER LOCK,THROW,FIND,INVENT,TURNS,KNFLOC,DETAIL,ABBNUM INTEGER NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2 INTEGER TROLL,TROLL2,STREAM,SPICES INTEGER RTXSIZ,CLSMAX,LOCSIZ,SECT,TABNDX,OBJ INTEGER VERB,HNTLOC,KK C C C C DO 10 I=1,TRVSIZ WRITE(4,1)TRVSIZ 1 FORMAT(' TRAVEL ENTRIES: ', I10) I1= GETWRD(TRAVEL, I, 0) I2= GETWRD(TRVCON, I, 0) I3= GETWRD(TRVLOC, I, 0) WRITE(4,11) I, I1, I2, I3 11 FORMAT(' TRAVEL ',I4,' GIVES',1X,I4,1X,I4,1X,I4) 10 CONTINUE DO 20 I = 1, TABSIZ WRITE(4,21)I, KTAB(I), ATAB(I) 21 FORMAT(' K/a TAB ',I4,' GIVES ', I6, 1X, A6) 20 CONTINUE DO 30 I = 1, 100 I4 = I + 100 WRITE(4,31)I,PLAC(I),PLACE(I),FIXD(I),FIXED(I),LINK(I),LINK(I4),PTEXT(I),PROP(I) 31 FORMAT(' LOCATION DATA',1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6) 30 CONTINUE RETURN END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | C WAS SUBROUTINE GETIN(WORD1,WORD1A,WORD1X,WORD2,WORD2A,WORD2X) C OS/8 version returns 4 chars in the first word of each command entity C C GET A COMMAND FROM THE ADVENTURER. SNARF OUT THE FIRST WORD, PAD IT WITH C BLANKS, AND RETURN IT IN WORD1 AND WORD1A. (for OS/8, WORD1) C CHARS 5 AND 6 ARE RETURNED IN WORD1X, IN C CASE WE NEED TO PRINT OUT THE WHOLE WORD IN AN ERROR MESSAGE. ANY NUMBER OF C BLANKS MAY FOLLOW THE WORD. IF A SECOND WORD APPEARS, IT IS RETURNED IN C WORD2 AND WORD2A (CHARS 5 AND 68 IN WORD2X), ELSE WORD2 IS SET TO ZERO. C (for OS/8, WORD2 and WORD2X). C C IMPLICIT INTEGER (A-Z) C LOGICAL*1 FRST(20),BLANK,LCA,LCZ,UCA C DATA BLANK/' '/,UCA/'A'/,LCA/'a'/,LCZ/'z'/ SUBROUTINE GETIN(WORD1,WORD1X,WORD2,WORD2X) INTEGER INPUT(20),WORD1,WORD1X INTEGER WORD2,WORD2X 10 WRITE(4,1) 1 FORMAT(' > ',$) C READ(4,2)INPUT C2 FORMAT(20A1) CALL RDLINE(INPUT, 20) WORD1 = ' ' WORD1X = ' ' WORD2 = ' ' WORD2X = ' ' DO 15 I=1,20 C Using INT here to normalize the input values J = INT(INPUT(I)) 15 INPUT(I) = J IX1=0 IX2=0 I=0 C C Find first nonblank C 20 I=I+1 IF(I.GT.20)GOTO 10 IF(INPUT(I).EQ.32)GOTO 20 C C Move four characters to WORD1 C DO 30 IX1 = 1, 4 CALL CPUT(WORD1, IX1, INPUT(I)) I=I+1 IF(I.GT.20)GOTO 100 C C If blank, go to word 2 C IF(INPUT(I) .EQ. 32) GOTO 50 30 CONTINUE C C Move two characters to WORD1X C DO 40 IX1 = 1, 20 IF (IX1 .GT. 2) GOTO 35 CALL CPUT(WORD1X, IX1, INPUT(I)) 35 I=I+1 IF(I.GT.20)GOTO 100 IF(INPUT(I).EQ.32)GOTO 50 40 CONTINUE C C Find next nonblank C 50 I = I + 1 IF(I.GT.20) GOTO 100 IF (INPUT(I).EQ. 32)GOTO 50 C C Move four to WORD2 C DO 60 IX1 = 1,4 CALL CPUT(WORD2, IX1, INPUT(I)) I = I + 1 IF (I.GT.20) GOTO 100 IF (INPUT(I).EQ. 32) GOTO 100 60 CONTINUE C C Move to to WORD2X C DO 70 IX1 = 1,2 CALL CPUT(WORD2X, IX1, INPUT(I)) I = I + 1 IF (I.GT.20) GOTO 100 IF(INPUT(I).EQ.32) GOTO 100 70 CONTINUE 100 IF (WORD2 .NE. ' ') RETURN WORD2 = 0 WORD2X = 0 RETURN END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | SECT WORDS /FILE GETWRD /Version 02.06 /This module contains two entry points to allow FORTRAN /programs access to the contents of any of the 3 12-bit words /in any floating point variable. The idea is to facilitate /operations on text strings which are stored as 8-bit ASCII, /such as input by the routine RDLIN (see write up for RDLIN /included with that routine.). / ROUTINE GETWRD /This routine is a function subroutine (ie: the result is /returned in the FAC). As such it's name may be used in arithmetic /statments and the returned data will be used directly. The /following example illustrates it's use: / . / . / RESULT=GETWRD(MESSAG,INDX,MASK) / . / . /Here, the desired word (exponent,hi or lo mantissa) will /be returned and placed into the variable RESULT. The argument /MESSAG may be a variable or an array. The actual address in the /array will be computed by the routine, depending on the value /of the variable INDX. INDX points to the specific 12-bit word in /the array you want. The routine adds this number to the start /address of the array, and operates on this word with an XTA /instruction. /The following table illustrates this conversion: /Value of INDX Element word Array element / 1 Exponent 1 / 2 Hi mant. 1 / 3 Lo mant. 1 / 4 Exponent 2 / 5 Hi mant. 2 / etc. etc. etc. /The argument MASK allows the masking of the data retrieved /so parity bits etc. can be removed easily. The value should be /the decimal equivalent of the octal number you want the data masked /by. If MASK is 0, no masking takes place. / ROUTINE PUTWRD /This routine provides the converse function of GETWRD. /It is called from FORTRAN using a standard subroutine call: / CALL PUTWRD(MESSAG,INDX,WORD) /The first 2 arguments are identical to those in the routine GETWRD, /but the third argument reflects the difference in function of /these two routines. WORD is the value in decimal that is to /be placed into the 12-bit word referenced by the first two /arguments. Masking is not provided for. EXTERN #RETRN EXTERN #ARGER ENTRY GETWRD ENTRY PUTWRD /Little routine to do masking of octal data. /Although the references to XR 0 and 1 destroy the /value of the Array element in XR 0-2, this is of no /consequence because we've already finished using it. /The only caveat here is that #XR+2 is not an auto index register /Calling in #PAGE0 won't help because we could ge loaded onto /page 0 of some other field. SECT8 #MASK TAD #XR /Index 0 contains fetched data AND #XR+1 /Index 1 contains the mask. DCA #XR /Apply mask to data CIF CDF /Reset data field JMP% #XR+2 /XR5 contains return address /FPP code starts here. It is intended that it be contiguous /with the 8-mode code so the rest of the page is not wasted SECNAM, TEXT +GETWRD+ /Init for traceback #BASE, ORG .+3 /Base 0 INDX, ORG .+3 /Base 1: Stuff addresses in here #PTWRD, TEXT +PUTWRD+ /Base 2: One of the section names #GTWRD, TEXT +GETWRD+ /Base 3: The other section name /Relative address on page is 23. This puts XR+2 out of any possible /danger with respect to auto-index registers. #XR, FNOP /Base 4: XR0-2 ADDR #RETRN / #XR2=return to FRTS address 1;2;3 /Base 5: XR3-5 /TENK, F 4096.0 /Base 6 K2048, F 2048.0 XSETX, 27;47;7777 /Base 7: SETX-JA-1 ORG #BASE+30 FNOP; JA #BASE /Pointer to section name+3 FNOP;#GOBAK, 0;0 /Pointer to calling base page /Routine starts here. Details of index register usage are /as follows: / XR 0 Used to fetch/store/hold target word / XR 1 Used as arg. fetch index, and to hold mask word / XR 2 Contains the FRTS TRAP return address / XR 3 =1 to fetch ARRAY arg / XR 4 =2 to fetch INDEX arg / XR 5 =3 to fetch WORD/MASK arg BASE #BASE /Tell assembler wher the base page is /Enter here for PUTWRD PUTWRD, FLDA #PTWRD,0 /Get putwrd name JSA GETARG /Get args set up FLDA% INDX /Load the new value for target word JLT TSTNEG /Negative range check FSUB K2048 /For positive, < 2048 JGE PUTERR /Out of range JA OK /Else ok TSTNEG, FADD K2048 /Neg more than 2048? JLE PUTERR /Yes, errror OK, FLDA% INDX /In range ATX 0 /Store it JA #GOBAK /Return PUTERR, FLDA SECNAM TRAP4 #ARGER /Enter here for GETWRD GETWRD, FLDA #GTWRD,0 /Load section name JSA GETARG /Get things set up XTA 0 /Get the target word SETX #XR /Reset index registers ATX 0 /Store word in XR 0 FLDA% INDX /Get the mask value JEQ NOMASK /If 0, skip masking ATX 1 /Put the mask value into an index TRAP3 #MASK /Go mask the number NOMASK, XTA 0 /Recover the masked number / JGE #GOBAK /If result is positive, return now / FADD TENK /Otherwise, un-2's complement first JA #GOBAK /Return the answer in FAC /Both routines come here to get things set up. FAC contains /section name. GETARG, 0;0 FSTA SECNAM /Name into traceback prologue SETX #XR /Set address of index registers STARTD /Mode for addresses 0210 /Load pointer to callers prologue FSTA #GOBAK,0 /Store as return address 0200 /Load address of argument list SETB #BASE /Now tell FPP where the base page is FSTA #BASE /Store address of args FLDA% #BASE,4 /Load pointer to INDX FSTA INDX /Store this STARTF /Mode for numbers FLDA% INDX /Load the pointer ALN 0 /Fix it STARTD /Address mode FADD% #BASE,3 /Add address of ARRAY/VARIABLE FADD XSETX /Create a SETX ARRAY+INDEX-1 FSTA ZSETX,0 /Store to execute in line FLDA% #BASE,5 /Load pointer to MASK/Replacement word FSTA INDX /Store this STARTF /Set numeric mode ZSETX, SETX . /Set index on target word JA GETARG /Return, everything set |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 | C ADVENTURES SUBROUTINE INIT C C MODIFIED BY KENT BLACKETT C ENGINEERING SYSTEMS GROUP C DIGITAL EQUIPMENT CORP. C 15-JUL-77 C MODIFIED BY BOB SUPNIK C DISK ENGINEERING C 21-OCT-77 C MODIFIED BY BOB SUPNIK C DISK ENGINEERING C 25-AUG-78 C MODIFIED BY BOB SUPNIK C SMALL SYSTEMS C 12-NOV-78 C ORIGINAL VERSION WAS FOR DECSYSTEM-10 C NEXT VERSION WAS FOR FORTRAN IV-PLUS UNDER C THE IAS OPERATING SYSTEM ON THE PDP-11/70 C THIS VERSION IS FOR FORTRAN IV (V01C OR LATER) C UNDER RT-11 ON *ANY* PDP-11 C C C CURRENT LIMITS: C 300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). C 150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ). C 100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP). C 35 "ACTION" VERBS (ACTSPK, VRBSIZ). C 205 RANDOM MESSAGES (RTEXT, RTXSIZ). C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ). C THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF C THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE, C SO THERE CAN'T BE MORE THAN 1000 WORDS.) THESE UPPER LIMITS ARE: C 1000 NON-SYNONYMOUS VOCABULARY WORDS C 300 LOCATIONS C 100 OBJECTS C C IMPLICIT INTEGER (A-Z) LOGICAL LMWARN,CLOSNG,PANIC,HINTED, 1 CLOSED,GAVEUP,SCORNG,DSEEN,BITSET C LOGICAL WRITN COMMON /VERSN/ VMAJ, VMIN, VEDIT COMMON /FILES/ INDXNM, TEXTNM, SAVENM, INPTNM COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA COMMON /VOCCOM/ KTAB,ATAB,TABSIZ COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG COMMON /PTXCOM/ PTEXT COMMON /ABBCOM/ ABB COMMON /MISCOM/ LINUSE,TRVS,CLSSES,OLDLOC,LOC,CVAL,TK,NEWLOC, 1 KEY,PLAC,FIXD,ACTSPK,COND,HINTS,HNTMAX,PROP,TALLY,TALLY2, 2 HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,LAMP,GRATE COMMON /MISCOM/ 3 CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET, 4 CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE,WATER,OIL,PLANT, 5 PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND, 6 BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM COMMON /MISCOM/ 7 PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK, 8 THROW,FIND,INVENT,TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM, 9 NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2, 1 CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG,ODLOC,STREAM,SPICES COMMON /MISC2/ I,RTXSIZ,CLSMAX,LOCSIZ,CTEXT,STEXT,LTEXT, 1 SECT,TRAVEL,TRVCON,TRVLOC,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ, 2 MAXTRS,HINTED,HNTLOC,KK C INTEGER LINES(12),DATA(78) C The TRAVEL, TRVCON, and TRVLOC arrays are C Packed with words 0,1,2 holding the data. Saves lots C of wasted space at the expense of some complexity. INTEGER TRAVEL(250), TRVCON(250), TRVLOC(250), TRVSIZ INTEGER KTAB(300),ATAB(300),TABSIZ INTEGER LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150), 1 ATLOC(150) INTEGER PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200), 1 PTEXT(100),PROP(100),HOLDNG INTEGER ACTSPK(35) INTEGER RTEXT(205) INTEGER CTEXT(12),CVAL(12) INTEGER HINTLC(20),HINTS(20,4) DIMENSION HINTED(20) INTEGER TK(20),DLOC(6),ODLOC(6) DIMENSION DSEEN(6) INTEGER ASCVAR, TXTLOC, TRVS, CLSSES, OLDLOC INTEGER HNTSIZ, HNTMAX, TALLY, TALLY2, CHLOC, CHLOC2, DFLAG INTEGER DALTLC,GRATE,CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE INTEGER FISSUR,TABLET,CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE INTEGER WATER,OIL,PLANT,PLANT2,AXE,MIRROR,DRAGON,CHASM INTEGER BEAR,MESSAG,VEND,BATTER,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD INTEGER PYRAM,PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY INTEGER LOCK,THROW,FIND,INVENT,TURNS,KNFLOC,DETAIL,ABBNUM INTEGER NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2 INTEGER TROLL,TROLL2,STREAM,SPICES INTEGER RTXSIZ,CLSMAX,LOCSIZ,SECT,TABNDX,OBJ INTEGER VERB,HNTLOC,KK INTEGER INDXNM(3),TEXTNM(3),SAVENM(3),INPTNM(3),CODE,NAME(3) C C C ISHFT(NUMBER,IPOSIT)=NUMBER*(2**IPOSIT) C BITSET(L,N)=(COND(L).AND.ISHFT(1,N)).NE.0 C DESCRIPTION OF THE DATABASE FORMAT C C C THE DATA FILE CONTAINS SEVERAL SECTIONS. EACH BEGINS WITH A LINE CONTAINING C A NUMBER IDENTIFYING THE SECTION, AND ENDS WITH A LINE CONTAINING "-1". C C SECTION 1: LONG FORM DESCRIPTIONS. EACH LINE CONTAINS A LOCATION NUMBER, C A COMMA, AND A LINE OF TEXT. THE SET OF (NECESSARILY ADJACENT) LINES C WHOSE NUMBERS ARE X FORM THE LONG DESCRIPTION OF LOCATION X. C SECTION 2: SHORT FORM DESCRIPTIONS. SAME FORMAT AS LONG FORM. NOT ALL C PLACES HAVE SHORT DESCRIPTIONS. C SECTION 3: TRAVEL TABLE. EACH LINE CONTAINS A LOCATION NUMBER (X), A SECOND C LOCATION NUMBER (Y), AND A LIST OF MOTION NUMBERS (SEE SECTION 4). C EACH MOTION REPRESENTS A VERB WHICH WILL GO TO Y IF CURRENTLY AT X. C Y, IN TURN, IS INTERPRETED AS FOLLOWS. LET M=Y/1000, N=Y MOD 1000. C IF N<=300 IT IS THE LOCATION TO GO TO. C IF 300<N<=500 N-300 IS USED IN A COMPUTED GOTO TO C A SECTION OF SPECIAL CODE. C IF N>500 MESSAGE N-500 FROM SECTION 6 IS PRINTED, C AND HE STAYS WHEREVER HE IS. C MEANWHILE, M SPECIFIES THE CONDITIONS ON THE MOTION. C IF M=0 IT'S UNCONDITIONAL. C IF 0<M<100 IT IS DONE WITH M% PROBABILITY. C IF M=100 UNCONDITIONAL, BUT FORBIDDEN TO DWARVES. C IF 100<M<=200 HE MUST BE CARRYING OBJECT M-100. C IF 200<M<=300 MUST BE CARRYING OR IN SAME ROOM AS M-200. C IF 300<M<=400 PROP(M MOD 100) MUST *NOT* BE 0. C IF 400<M<=500 PROP(M MOD 100) MUST *NOT* BE 1. C IF 500<M<=600 PROP(M MOD 100) MUST *NOT* BE 2, ETC. C IF THE CONDITION (IF ANY) IS NOT MET, THEN THE NEXT *DIFFERENT* C "DESTINATION" VALUE IS USED (UNLESS IT FAILS TO MEET *ITS* CONDITIONS, C IN WHICH CASE THE NEXT IS FOUND, ETC.). TYPICALLY, THE NEXT DEST WILL C BE FOR ONE OF THE SAME VERBS, SO THAT ITS ONLY USE IS AS THE ALTERNATE C DESTINATION FOR THOSE VERBS. FOR INSTANCE: C 15 110022 29 31 34 35 23 43 C 15 14 29 C THIS SAYS THAT, FROM LOC 15, ANY OF THE VERBS 29, 31, ETC., WILL TAKE C HIM TO 22 IF HE'S CARRYING OBJECT 10, AND OTHERWISE WILL GO TO 14. C 11 303008 49 C 11 9 50 C THIS SAYS THAT, FROM 11, 49 TAKES HIM TO 8 UNLESS PROP(3)=0, IN WHICH C CASE HE GOES TO 9. VERB 50 TAKES HIM TO 9 REGARDLESS OF PROP(3). C C IN THIS IMPLEMENTATION, THE SECOND LOCATION NUMBER Y HAS BEEN C SPLIT INTO M, CONDITIONS, AND N, LOCATION. C C SECTION 4: VOCABULARY. EACH LINE CONTAINS A NUMBER (N), A TAB, AND A C FIVE-LETTER WORD. CALL M=N/1000. IF M=0, THEN THE WORD IS A MOTION C VERB FOR USE IN TRAVELLING (SEE SECTION 3). ELSE, IF M=1, THE WORD IS C AN OBJECT. ELSE, IF M=2, THE WORD IS AN ACTION VERB (SUCH AS "CARRY" C OR "ATTACK"). ELSE, IF M=3, THE WORD IS A SPECIAL CASE VERB (SUCH AS C "DIG") AND N MOD 1000 IS AN INDEX INTO SECTION 6. OBJECTS FROM 50 TO C (CURRENTLY, ANYWAY) 79 ARE CONSIDERED TREASURES (FOR PIRATE, CLOSEOUT). C SECTION 5: OBJECT DESCRIPTIONS. EACH LINE CONTAINS A NUMBER (N), A TAB, C AND A MESSAGE. IF N IS FROM 1 TO 100, THE MESSAGE IS THE "INVENTORY" C MESSAGE FOR OBJECT N. OTHERWISE, N SHOULD BE 000, 100, 200, ETC., AND C THE MESSAGE SHOULD BE THE DESCRIPTION OF THE PRECEDING OBJECT WHEN ITS C PROP VALUE IS N/100. THE N/100 IS USED ONLY TO DISTINGUISH MULTIPLE C MESSAGES FROM MULTI-LINE MESSAGES; THE PROP INFO ACTUALLY REQUIRES ALL C MESSAGES FOR AN OBJECT TO BE PRESENT AND CONSECUTIVE. PROPERTIES WHICH C PRODUCE NO MESSAGE SHOULD BE GIVEN THE MESSAGE ">$<". C SECTION 6: ARBITRARY MESSAGES. SAME FORMAT AS SECTIONS 1, 2, AND 5, EXCEPT C THE NUMBERS BEAR NO RELATION TO ANYTHING (EXCEPT FOR SPECIAL VERBS C IN SECTION 4). C SECTION 7: OBJECT LOCATIONS. EACH LINE CONTAINS AN OBJECT NUMBER AND ITS C INITIAL LOCATION (ZERO (OR OMITTED) IF NONE). IF THE OBJECT IS C IMMOVABLE, THE LOCATION IS FOLLOWED BY A "-1". IF IT HAS TWO LOCATIONS C (E.G. THE GRATE) THE FIRST LOCATION IS FOLLOWED WITH THE SECOND, AND C THE OBJECT IS ASSUMED TO BE IMMOVABLE. C SECTION 8: ACTION DEFAULTS. EACH LINE CONTAINS AN "ACTION-VERB" NUMBER AND C THE INDEX (IN SECTION 6) OF THE DEFAULT MESSAGE FOR THE VERB. C SECTION 9: LIQUID ASSETS, ETC. EACH LINE CONTAINS A NUMBER (N) AND UP TO 20 C LOCATION NUMBERS. BIT N (WHERE 0 IS THE UNITS BIT) IS SET IN COND(LOC) C FOR EACH LOC GIVEN. THE COND BITS CURRENTLY ASSIGNED ARE: C 0 LIGHT C 1 IF BIT 2 IS ON: ON FOR OIL, OFF FOR WATER C 2 LIQUID ASSET, SEE BIT 1 C 3 PIRATE DOESN'T GO HERE UNLESS FOLLOWING PLAYER C OTHER BITS ARE USED TO INDICATE AREAS OF INTEREST TO "HINT" ROUTINES: C 4 TRYING TO GET INTO CAVE C 5 TRYING TO CATCH BIRD C 6 TRYING TO DEAL WITH SNAKE C 7 LOST IN MAZE C 8 PONDERING DARK ROOM C 9 AT WITT'S END C COND(LOC) IS SET TO 2, OVERRIDING ALL OTHER BITS, IF LOC HAS FORCED C MOTION. C SECTION 10: CLASS MESSAGES. EACH LINE CONTAINS A NUMBER (N), A TAB, AND A C MESSAGE DESCRIBING A CLASSIFICATION OF PLAYER. THE SCORING SECTION C SELECTS THE APPROPRIATE MESSAGE, WHERE EACH MESSAGE IS CONSIDERED TO C APPLY TO PLAYERS WHOSE SCORES ARE HIGHER THAN THE PREVIOUS N BUT NOT C HIGHER THAN THIS N. NOTE THAT THESE SCORES PROBABLY CHANGE WITH EVERY C MODIFICATION (AND PARTICULARLY EXPANSION) OF THE PROGRAM. C SECTION 11: HINTS. EACH LINE CONTAINS A HINT NUMBER (CORRESPONDING TO A C COND BIT, SEE SECTION 9), THE NUMBER OF TURNS HE MUST BE AT THE RIGHT C LOC(S) BEFORE TRIGGERING THE HINT, THE POINTS DEDUCTED FOR TAKING THE C HINT, THE MESSAGE NUMBER (SECTION 6) OF THE QUESTION, AND THE MESSAGE C NUMBER OF THE HINT. THESE VALUES ARE STASHED IN THE "HINTS" ARRAY. C HNTMAX IS SET TO THE MAX HINT NUMBER (<= HNTSIZ). NUMBERS 1-3 ARE C UNUSABLE SINCE COND BITS ARE OTHERWISE ASSIGNED, SO 2 IS USED TO C REMEMBER IF HE'S READ THE CLUE IN THE REPOSITORY, AND 3 IS USED TO C REMEMBER WHETHER HE ASKED FOR INSTRUCTIONS (GETS MORE TURNS, BUT LOSES C POINTS). C SECTION 12: MAGIC MESSAGES. IDENTICAL TO SECTION 6 EXCEPT PUT IN A SEPARATE C SECTION FOR EASIER REFERENCE. MAGIC MESSAGES ARE USED BY THE STARTUP, C MAINTENANCE MODE, AND RELATED ROUTINES. C SECTION 0: END OF DATABASE. C READ THE DATABASE IF WE HAVE NOT YET DONE SO C ISEED=0 C C FILSIZ Was 900 for RT-11 but we pack 6 records per. C FILSIZ=150 TABSIZ=300 LOCSIZ=150 VRBSIZ=35 RTXSIZ = 205 HNTSIZ = 20 MAGSIZ = 35 TRVSIZ = 750 CLSMAX = 12 C VCNT = 0 CDEBUG WRITE(4,1000) CDEBUG1000 FORMAT(' INITIALIZING...') C C FIRST, TRY TO RESTORE PRE-EXISTING COPY OF DATA BASE C CALL USR(6,'ADVENT.IN',2,ERR) IF (ERR .EQ. 0) GOTO 30 20 CALL SIXOUT('L]OCATION OF TEXT DATABASE ([ATEXT.DA]) >',21,2) WRITE(4,121) 121 FORMAT('+',$) READ(4,21) TEXTNM 21 FORMAT(3A6) IF (TEXTNM(1) .NE. ' ') GOTO 22 TEXTNM(1) = 'ATEXT.' TEXTNM(2) = 'DA' TEXTNM(3) = ' ' 22 CALL SIXOUT('L]OCATION OF TEXT INDEX ([AINDX.DA]) >',21,2) WRITE(4,121) READ(4,21) INDXNM IF (INDXNM(1) .NE. ' ') GOTO 23 INDXNM(1) = 'AINDX.' INDXNM(2) = 'DA' INDXNM(3) = ' ' 23 CALL SIXOUT('L]OCATION OF SAVED GAMES ([ASAVE.DA]) >',21,2) WRITE(4,121) READ(4,21) SAVENM IF (SAVENM(1) .NE. ' ') GOTO 24 SAVENM(1) = 'ASAVE.' SAVENM(2) = 'DA' SAVENM(3) = ' ' 24 CALL SIXOUT('L]OCATION OF TEXT INPUT ([ADVENT.TX]) >',21,2) WRITE(4,121) READ(4,21)INPTNM IF (INPTNM(1) .NE. ' ') GOTO 25 INPTNM(1) = 'ADVENT' INPTNM(2) = '.TX' INPTNM(3) = ' ' 25 CONTINUE CALL USR(6, 'ADVENT.IN',3,ERR) IF (ERR .NE. 0) WRITE(4,28) 28 FORMAT(' CAN''T SAVE SETTINGS IN ADVENT.IN') IF (ERR.NE.0) GOTO 40 WRITE(6, 29)INDXNM,TEXTNM,SAVENM,INPTNM 29 FORMAT(' ADVENTURE SETUP FILE',/, 1 'INDX=',3A6,/,'TEXT=',3A6,/,'SAVE=',3A6,/,'INPT=',3A6) CALL USR(6, 'ADVENT.IN',4,ERR) GOTO 40 30 INDXNM(1) = 'AINDX.' INDXNM(2) = 'DA' INDXNM(3) = ' ' TEXTNM(1) = 'ATEXT.' TEXTNM(2) = 'DA' TEXTNM(3) = ' ' SAVENM(1) = 'ASAVE.' SAVENM(2) = 'DA' SAVENM(3) = ' ' INPTNM(1) = 'ADVENT' INPTNM(2) = '.TX' INPTNM(3) = ' ' 31 CALL CHKEOF(EOF) READ(6, 32) CODE, NAME IF (EOF .NE. 0) GOTO 34 32 FORMAT(A4,1X,3A6) DO 33 I = 1, 3 IF (CODE .EQ. 'INDX') INDXNM(I) = NAME(I) IF (CODE .EQ. 'TEXT') TEXTNM(I) = NAME(I) IF (CODE .EQ. 'SAVE') SAVENM(I) = NAME(I) IF (CODE .EQ. 'INPT') INPTNM(I) = NAME(I) 33 CONTINUE GO TO 31 34 CONTINUE 40 CALL RSTRGM(.FALSE.,I) IF(I.NE.0) GO TO 10 CALL USR(8, TEXTNM, 2, ERR) C C If that can't be opened for input, gotta rebuild C IF (ERR.NE.0) GOTO 10 C C Hack to set the DEFINE FILE stuff up C CALL SETIDL C CALL USR(6, 'ADVENT.TX', 2, ERR) C IF (ERR.EQ.0) GOTO 1235 C CALL SIXOUT('C]AN''T OPEN [ADVENT.TX] FOR INPUT, QUITTING!',23,0) C STOP 1235 WRITN = .FALSE. GO TO 5000 C C CLEAR OUT THE VARIOUS TEXT-POINTER ARRAYS. ALL TEXT IS STORED IN DISK C FILE (RANDOM ACCESS ON UNIT 2). THE TEXT-POINTER ARRAYS CONTAIN RECORD C NUMBERS IN THE FILE. STEXT(N) IS SHORT DESCRIPTION OF LOCATION N. C LTEXT(N) IS LONG DESCRIPTION. PTEXT(N) POINTS TO MESSAGE FOR PROP(N)=0. C SUCCESSIVE PROP MESSAGES ARE FOUND BY CHASING POINTERS. RTEXT CONTAINS C SECTION 6'S STUFF. CTEXT(N) POINTS TO A PLAYER-CLASS MESSAGE. MTEXT IS FOR C SECTION 12. WE ALSO CLEAR COND. SEE DESCRIPTION OF SECTION 9 FOR DETAILS. C WRITN = .TRUE. 10 DO 1001 I=1,TABSIZ KTAB(I)=0 ATAB(I)=0 C C A2TAB not used on the '8 C A2TAB(I)=0 IF(I.GT.100) GO TO 1990 PTEXT(I)=0 PROP(I)=0 PLAC(I)=0 PLACE(I)=0 FIXD(I)=0 FIXED(I)=0 LINK(I)=0 LINK(I+100)=0 1990 IF(I.LE.RTXSIZ)RTEXT(I)=0 IF(I.LE.CLSMAX)CTEXT(I)=0 C IF(I.LE.MAGSIZ)MTEXT(I)=0 IF(I.LE.VRBSIZ)ACTSPK(I)=0 IF(I.GT.LOCSIZ)GOTO 1001 KEY(I)=0 ABB(I)=0 ATLOC(I)=0 STEXT(I)=0 LTEXT(I)=0 COND(I)=0 1001 CONTINUE C CALL USR(6, INPTNM, 2, ERR) IF(ERR.EQ.0)GOTO 1236 CALL SIXOUT('C]AN''T OPEN ',6, 2) CALL SIXOUT(INPTNM, 9, 3) CALL SIXOUT(' ]FOR INPUT!',6, 1) STOP 1236 CALL USR(8, TEXTNM, 3, ERR) IF (ERR.EQ.0) GOTO 1237 CALL SIXOUT('C]AN''T OPEN ',6,2) CALL SIXOUT(TEXTNM, 9, 3) CALL SIXOUT(' ]FOR OUTPUT',6,1) STOP 1237 DEFINE FILE 8(FILSIZ,78,U,RECORD) RECORD = 1 ASCVAR = 1 LINUSE=1 TRVS=1 CLSSES=1 C C START NEW DATA SECTION. ISECT IS THE SECTION NUMBER. C 1002 READ(6,1003)ISECT 1003 FORMAT(I5) CDEBUG WRITE(4,930)ISECT CDEBUG930 FORMAT(' NOW LOADING SECTION',I3) OLDLOC=-1 GOTO(1100,1004,1004,1030,1040,1004,1004,1050,1060,1070,1004, 1 1080,1004) (ISECT+1) C (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) C (11) (12) CALL BUG(9) C C SECTIONS 1, 2, 5, 6, 10, 12. READ MESSAGES AND SET UP POINTERS. C 1004 READ(6,1005) LOC,LINES 1005 FORMAT(I4,12A6) C WRITE(8'ASCVAR) LOC,LINES MULT = 13 * MOD(ASCVAR-1,6)+1 DATA(MULT) = LOC DO 1006 I = 1,12 1006 DATA(I+MULT) = LINES(I) ASCVAR = ASCVAR + 1 IF (MOD(ASCVAR,6) .EQ. 0) WRITE(8'RECORD)DATA 1007 LINUSE = ASCVAR-1 IF(LOC .EQ. -1) GO TO 1002 IF(LOC .EQ. OLDLOC) GO TO 1020 IF(ISECT.EQ.12)GOTO 1020 IF(ISECT.EQ.10)GOTO 1012 IF(ISECT.EQ.6)GOTO 1011 IF(ISECT.EQ.5)GOTO 1010 IF(ISECT.EQ.1)GOTO 1008 C IF(LOC.GT.LOCSIZ) CALL BUG(11) STEXT(LOC)=LINUSE GOTO 1020 C 1008 IF(LOC.GT.LOCSIZ) CALL BUG(11) LTEXT(LOC)=LINUSE GOTO 1020 C 1010 IF(LOC.GT.0.AND.LOC.LE.100)PTEXT(LOC)=LINUSE GOTO 1020 C 1011 IF(LOC .GT. RTXSIZ) CALL BUG(6) RTEXT(LOC)=LINUSE GOTO 1020 C 1012 IF(CLSSES.GT.CLSMAX) CALL BUG(12) CTEXT(CLSSES)=LINUSE CVAL(CLSSES)=LOC CLSSES=CLSSES+1 C GOTO 1020 C1013 C IF(LOC.GT.MAGSIZ)CALL BUG(6) C MTEXT(LOC)=LINUSE C 1020 OLDLOC = LOC IF(RECORD .GE. FILSIZ) CALL BUG(8) GOTO 1004 C C THE STUFF FOR SECTION 3 IS ENCODED HERE. EACH "FROM-LOCATION" GETS A C CONTIGUOUS SECTION OF THE "TRAVEL" ARRAY. EACH ENTRY IN TRAVEL IS C KEYWORD (FROM SECTION 4, MOTION VERBS), AND IS NEGATED IF C THIS IS THE LAST ENTRY FOR THIS LOCATION. KEY(N) IS THE INDEX IN TRAVEL C OF THE FIRST OPTION AT LOCATION N. C C SPECIAL CONDITIONS ON TRAVEL ARE ENCODED IN THE CORRESPONDING C ENTRIES OF TRVCON. THE NEW LOCATION IS IN TRVLOC. C C 1030 READ(6,1031)LOC,J,NEWLOC,TK 1031 FORMAT(99I6) IF(LOC.EQ.-1)GOTO 1002 IF(KEY(LOC).NE.0)GOTO 1033 KEY(LOC)=TRVS GOTO 1035 C1033 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1) 1033 ITEMP = GETWRD(TRAVEL, TRVS-1, 0) ITEMP=-ITEMP CALL PUTWRD(TRAVEL, TRVS-1, ITEMP) 1035 DO 1037 L=1,20 IF(TK(L).EQ.0)GOTO 1039 C TRAVEL(TRVS)=TK(L) CALL PUTWRD(TRAVEL, TRVS, TK(L)) C TRVLOC(TRVS)=NEWLOC CALL PUTWRD(TRVLOC, TRVS, NEWLOC) C TRVCON(TRVS)=J CALL PUTWRD(TRVCON, TRVS, J) TRVS=TRVS+1 IF(TRVS.EQ.TRVSIZ)CALL BUG(3) 1037 CONTINUE C1039 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1) 1039 ITEMP = GETWRD(TRAVEL, TRVS-1, 0) ITEMP=-ITEMP CALL PUTWRD(TRAVEL, TRVS-1, ITEMP) GOTO 1030 C C HERE WE READ IN THE VOCABULARY. KTAB(N) IS THE WORD NUMBER, ATAB(N) IS C THE CORRESPONDING WORD. THE -1 AT THE END OF SECTION 4 IS LEFT IN KTAB C AS AN END-MARKER. C OS/8 note: only reading first four characters as that's what's matched C for vocabulary. C 1040 DO 1042 TABNDX=1,TABSIZ 1043 READ(6,1041)KTAB(TABNDX),ATAB(TABNDX) 1041 FORMAT(I6,A4) IF(KTAB(TABNDX).EQ.-1)GOTO 1002 1042 CONTINUE CALL BUG(4) C C READ IN THE INITIAL LOCATIONS FOR EACH OBJECT. ALSO THE IMMOVABILITY INFO. C PLAC CONTAINS INITIAL LOCATIONS OF OBJECTS. FIXD IS -1 FOR IMMOVABLE C OBJECTS (INCLUDING THE SNAKE), OR = SECOND LOC FOR TWO-PLACED OBJECTS. C 1050 READ(6,1031)IOBJ,J,K IF(IOBJ.EQ.-1)GOTO 1002 IF(IOBJ.GT.100) CALL BUG(13) PLAC(IOBJ)=J FIXD(IOBJ)=K GOTO 1050 C C READ DEFAULT MESSAGE NUMBERS FOR ACTION VERBS, STORE IN ACTSPK. C 1060 READ(6,1031)VERB,J IF(VERB.EQ.-1)GOTO 1002 IF(VERB.GT.VRBSIZ) CALL BUG(10) ACTSPK(VERB)=J VCNT=MAX0(VERB,VCNT) GOTO 1060 C C READ INFO ABOUT AVAILABLE LIQUIDS AND OTHER CONDITIONS, STORE IN COND. C 1070 READ(6,1031)K,TK IF(K.EQ.-1)GOTO 1002 DO 1071 I=1,20 LOC=TK(I) IF(LOC.EQ.0)GOTO 1070 IF(BITSET(LOC,K))CALL BUG(8) 1071 COND(LOC)=COND(LOC)+ISHFT(1,K) GOTO 1070 C C READ DATA FOR HINTS. C 1080 HNTMAX=0 1081 READ(6,1031)K,TK IF(K.EQ.-1)GOTO 1002 IF(K.LT.0.OR.K.GT.HNTSIZ)CALL BUG(7) DO 1083 I=1,4 1083 HINTS(K,I)=TK(I) HNTMAX=MAX0(HNTMAX,K) GOTO 1081 C FINISH CONSTRUCTING INTERNAL DATA FORMAT C THEN SAVE THE RESULTS C 1100 IF (MOD(ASCVAR,6) .NE. 0) WRITE(8'RECORD)DATA CALL USR(8,TEXTNM,4,IERR) CALL USR(8,TEXTNM,2,IERR) C C Restore the "DEFINE FILE" settings C CALL SETIDL C1100 CALL CLOSE(1) CALL SAVEGM(.FALSE.,I) CONTINUE C C HAVING READ IN THE DATABASE, CERTAIN THINGS ARE NOW CONSTRUCTED. PROPS ARE C SET TO ZERO. WE FINISH SETTING UP COND BY CHECKING FOR FORCED-MOTION TRAVEL C ENTRIES. THE PLAC AND FIXD ARRAYS ARE USED TO SET UP ATLOC(N) AS THE FIRST C OBJECT AT LOCATION N, AND LINK(IOBJ) AS THE NEXT OBJECT AT THE SAME LOCATION C AS IOBJ. (IOBJ>100 INDICATES THAT FIXED(IOBJ-100)=LOC; LINK(IOBJ) IS STILL THE C CORRECT LINK TO USE.) ABB IS ZEROED; IT CONTROLS WHETHER THE ABBREVIATED C DESCRIPTION IS PRINTED. COUNTS MOD 5 UNLESS "LOOK" IS USED. C C C IF THE FIRST MOTION VERB IS 1 (ILLEGAL), THEN THIS IS A FORCED C MOTION ENTRY. C 5000 DO 1102 I=1,LOCSIZ IF(LTEXT(I).EQ.0.OR.KEY(I).EQ.0)GOTO 1102 K=KEY(I) C IF(IABS(TRAVEL(K)).EQ.1)COND(I)=2 ITEMP = GETWRD(TRAVEL, K, 0) IF (IABS(ITEMP).EQ.1)COND(I)=2 1102 CONTINUE C C SET UP THE ATLOC AND LINK ARRAYS AS DESCRIBED ABOVE. WE'LL USE THE DROP C SUBROUTINE, WHICH PREFACES NEW OBJECTS ON THE LISTS. SINCE WE WANT THINGS C IN THE OTHER ORDER, WE'LL RUN THE LOOP BACKWARDS. IF THE OBJECT IS IN TWO C LOCS, WE DROP IT TWICE. THIS ALSO SETS UP "PLACE" AND "FIXED" AS COPIES OF C "PLAC" AND "FIXD". ALSO, SINCE TWO-PLACED OBJECTS ARE TYPICALLY BEST C DESCRIBED LAST, WE'LL DROP THEM FIRST. C DO 1106 I=1,100 K=101-I IF(FIXD(K).LE.0)GOTO 1106 CALL DROP(K+100,FIXD(K)) CALL DROP(K,PLAC(K)) 1106 CONTINUE C DO 1107 I=1,100 K=101-I FIXED(K)=FIXD(K) 1107 IF(PLAC(K).NE.0.AND.FIXD(K).LE.0)CALL DROP(K,PLAC(K)) C C TREASURES, AS NOTED EARLIER, ARE OBJECTS 50 THROUGH MAXTRS (CURRENTLY 79). C THEIR PROPS ARE INITIALLY -1, AND ARE SET TO 0 THE FIRST TIME THEY ARE C DESCRIBED. TALLY KEEPS TRACK OF HOW MANY ARE NOT YET FOUND, SO WE KNOW C WHEN TO CLOSE THE CAVE. TALLY2 COUNTS HOW MANY CAN NEVER BE FOUND (E.G. IF C LOST BIRD OR BRIDGE). C MAXTRS=79 TALLY=0 TALLY2=0 DO 1200 I=50,MAXTRS IF(PTEXT(I).NE.0)PROP(I)=-1 1200 TALLY=TALLY-PROP(I) C C CLEAR THE HINT STUFF. HINTLC(I) IS HOW LONG HE'S BEEN AT LOC WITH COND BIT C I. HINTED(I) IS TRUE IFF HINT I HAS BEEN USED. C DO 1300 I=1,HNTMAX HINTED(I)=.FALSE. 1300 HINTLC(I)=0 C CDEBUG WRITE(4,931)TABNDX,TABSIZ,VCNT,VRBSIZ,CLSSES,CLSMAX, CDEBUG 1 HNTMAX,HNTSIZ,TRVS,TRVSIZ,LINUSE,FILSIZ CDEBUG931 FORMAT(' USED VS MAX TABLE VALUES:'/ CDEBUG 1 1X,I5,' OF ',I5,' VOCAB ENTRIES'/ CDEBUG 2 1X,I5,' OF ',I5,' VERB ENTRIES'/ CDEBUG 3 1X,I5,' OF ',I5,' CLASS ENTRIES'/ CDEBUG 4 1X,I5,' OF ',I5,' HINT ENTRIES'/ CDEBUG 5 1X,I5,' OF ',I5,' TRAVEL ENTRIES'/ CDEBUG 6 1X,I5,' OF ',I5,' FILE RECORDS'/) C C DEFINE SOME HANDY MNEMONICS. THESE CORRESPOND TO OBJECT NUMBERS. C KEYS=VOCAB('KEYS',1) LAMP=VOCAB('LAMP',1) GRATE=VOCAB('GRAT',1) CAGE=VOCAB('CAGE',1) ROD=VOCAB('ROD ',1) ROD2=ROD+1 STEPS=VOCAB('STEP',1) BIRD=VOCAB('BIRD',1) DOOR=VOCAB('DOOR',1) PILLOW=VOCAB('PILL',1) SNAKE=VOCAB('SNAK',1) FISSUR=VOCAB('FISS',1) TABLET=VOCAB('TABL',1) CLAM=VOCAB('CLAM',1) OYSTER=VOCAB('OYST',1) MAGZIN=VOCAB('MAGA',1) DWARF=VOCAB('DWAR',1) KNIFE=VOCAB('KNIF',1) FOOD=VOCAB('FOOD',1) BOTTLE=VOCAB('BOTT',1) WATER=VOCAB('WATE',1) OIL=VOCAB('OIL ',1) PLANT=VOCAB('PLAN',1) PLANT2=PLANT+1 AXE=VOCAB('AXE ',1) MIRROR=VOCAB('MIRR',1) DRAGON=VOCAB('DRAG',1) CHASM=VOCAB('CHAS',1) TROLL=VOCAB('TROL',1) TROLL2=TROLL+1 BEAR=VOCAB('BEAR',1) MESSAG=VOCAB('MESS',1) VEND=VOCAB('VEND',1) BATTER=VOCAB('BATT',1) C C OBJECTS FROM 50 THROUGH WHATEVER ARE TREASURES. HERE ARE A FEW. C NUGGET=VOCAB('GOLD',1) COINS=VOCAB('COIN',1) CHEST=VOCAB('CHES',1) EGGS=VOCAB('EGGS',1) TRIDNT=VOCAB('TRID',1) VASE=VOCAB('VASE',1) EMRALD=VOCAB('EMER',1) PYRAM=VOCAB('PYRA',1) PEARL=VOCAB('PEAR',1) RUG=VOCAB('RUG ',1) CHAIN=VOCAB('CHAI',1) C C THESE ARE MOTION-VERB NUMBERS. C BACK=VOCAB('BACK',0) LOOK=VOCAB('LOOK',0) CAVE=VOCAB('CAVE',0) NULL=VOCAB('NULL',0) ENTRNC=VOCAB('ENTR',0) DPRSSN=VOCAB('DEPR',0) STREAM=VOCAB('STRE',0) C C AND SOME ACTION VERBS. C SAY=VOCAB('SAY ',2) LOCK=VOCAB('LOCK',2) THROW=VOCAB('THRO',2) FIND=VOCAB('FIND',2) INVENT=VOCAB('INVE',2) C C INITIALISE THE DWARVES. DLOC IS LOC OF DWARVES, HARD-WIRED IN. ODLOC IS C PRIOR LOC OF EACH DWARF, INITIALLY GARBAGE. DALTLC IS ALTERNATE INITIAL LOC C FOR DWARF, IN CASE ONE OF THEM STARTS OUT ON TOP OF THE ADVENTURER. (NO 2 C OF THE 5 INITIAL LOCS ARE ADJACENT.) DSEEN IS TRUE IF DWARF HAS SEEN HIM. C DFLAG CONTROLS THE LEVEL OF ACTIVATION OF ALL THIS: C 0 NO DWARF STUFF YET (WAIT UNTIL REACHES HALL OF MISTS) C 1 REACHED HALL OF MISTS, BUT HASN'T MET FIRST DWARF C 2 MET FIRST DWARF, OTHERS START MOVING, NO KNIVES THROWN YET C 3 A KNIFE HAS BEEN THROWN (FIRST SET ALWAYS MISSES) C 3+ DWARVES ARE MAD (INCREASES THEIR ACCURACY) C SIXTH DWARF IS SPECIAL (THE PIRATE). HE ALWAYS STARTS AT HIS CHEST'S C EVENTUAL LOCATION INSIDE THE MAZE. THIS LOC IS SAVED IN CHLOC FOR REF. C THE DEAD END IN THE OTHER MAZE HAS ITS LOC STORED IN CHLOC2. C CHLOC=114 CHLOC2=140 DO 1700 I=1,6 1700 DSEEN(I)=.FALSE. DFLAG=0 DLOC(1)=19 DLOC(2)=27 DLOC(3)=33 DLOC(4)=44 DLOC(5)=64 DLOC(6)=CHLOC DALTLC=18 C C OTHER RANDOM FLAGS AND COUNTERS, AS FOLLOWS: C TURNS TALLIES HOW MANY COMMANDS HE'S GIVEN (IGNORES YES/NO) C LIMIT LIFETIME OF LAMP (NOT SET HERE) C KNFLOC 0 IF NO KNIFE HERE, LOC IF KNIFE HERE, -1 AFTER CAVEAT C DETAIL HOW OFTEN WE'VE SAID "NOT ALLOWED TO GIVE MORE DETAIL" C ABBNUM HOW OFTEN WE SHOULD PRINT NON-ABBREVIATED DESCRIPTIONS C MAXDIE NUMBER OF REINCARNATION MESSAGES AVAILABLE (UP TO 5) C NUMDIE NUMBER OF TIMES KILLED SO FAR C HOLDNG NUMBER OF OBJECTS BEING CARRIED C DKILL NUMBER OF DWARVES KILLED (UNUSED IN SCORING, NEEDED FOR MSG) C FOOBAR CURRENT PROGRESS IN SAYING "FEE FIE FOE FOO". C BONUS USED TO DETERMINE AMOUNT OF BONUS IF HE REACHES CLOSING C CLOCK1 NUMBER OF TURNS FROM FINDING LAST TREASURE TILL CLOSING C CLOCK2 NUMBER OF TURNS FROM FIRST WARNING TILL BLINDING FLASH C LOGICALS WERE EXPLAINED EARLIER C TURNS=0 LMWARN=.FALSE. KNFLOC=0 DETAIL=0 ABBNUM=5 DO 1800 I=0,4 1800 IF(RTEXT(2*I+81).NE.0)MAXDIE=I+1 NUMDIE=0 HOLDNG=0 DKILL=0 FOOBAR=0 BONUS=0 CLOCK1=30 CLOCK2=50 CLOSNG=.FALSE. PANIC=.FALSE. CLOSED=.FALSE. GAVEUP=.FALSE. SCORNG=.FALSE. C C C C FINALLY, SINCE WE'RE CLEARLY SETTING THINGS UP FOR THE FIRST TIME... C C PAUSE 'INIT DONE' RETURN END |
> > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | SUBROUTINE IO(RECORD) C C C This function reads the direct access file and unpacks it. C we put 6 13-character records into a single direct access record C because OS/8 FORTRAN puts every record into a single block. C Packing this saves one-sixth the space. C COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA INTEGER RTEXT(205),LINES(12),DATA(78),RECORD INTEGER OLDREC,TXTLOC C COMMON /RECMEM/OLDREC DATA OLDREC/-1/ IREC = RECORD/6 + 1 IF (IREC .NE. OLDREC)READ(8'IREC)DATA OLDREC = IREC N = 13 * (MOD(RECORD-1,6)) + 1 TXTLOC = DATA(N) DO 10 I = 1, 12 10 LINES(I) = DATA(N+I) RETURN END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | SECT JUGGLE / SUBROUTINE JUGGLE(OBJECT) / C / C JUGGLE AN OBJECT BY PICKING IT UP AND PUTTING IT DOWN AGAIN, THE PURPOSE / C BEING TO GET THE OBJECT TO THE FRONT OF THE CHAIN OF THINGS AT ITS LOC. / C / IMPLICIT INTEGER (A-Z) / COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG / DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100) / EXTERN MOVE #LBL=. COMMON PLACOM ATLOC, ORG .+0702 LINK, ORG .+1130 PLACE, ORG .+454 FIXED, ORG .+454 HOLDNG, ORG .+3 ORG #LBL /JUGGLE, 0;0 /JSA entry point FSTA OBJECT ATX 6 / I=PLACE(OBJECT) FLDA PLACE-3,6 FSTA I / J=FIXED(OBJECT) FLDA FIXED-3,6 FSTA J / CALL MOVE(OBJECT,I) JSR MOVE JA .+6 JA OBJECT JA I / CALL MOVE(OBJECT+100,J) / RETURN / END FLDA HUND FADDM OBJECT JSR MOVE JA JUGGLE JA OBJECT JA J OBJECT, ORG .+3 I, ORG .+3 J, ORG .+3 HUND, F 100.0 END |
> > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 | $JOB LOAD ADVENTURE .R LOAD *ADVENT,LOAD.LS<ADVENT/S *SEED,RND,SPEAK,GETWRD,USR,BITSET,DSTROY,JUGGLE,A5TOA1/O *INITAD *AMAIN/O *SAVEGM *RSTRGM *BUG,GETIN,PCT,IO/C *MOVE,PUT,CARRY,DROP,PSPEAK,RSPEAK,YES,VOCAB *$ $END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | SECT MOVE / SUBROUTINE MOVE(OBJECT,WHERE) / C / C PLACE ANY OBJECT ANYWHERE BY PICKING IT UP AND DROPPING IT. MAY ALREADY BE / C TOTING, IN WHICH CASE THE CARRY IS A NO-OP. MUSTN'T PICK UP OBJECTS WHICH / C ARE NOT AT ANY LOC, SINCE CARRY WANTS TO REMOVE OBJECTS FROM ATLOC CHAINS. / C / IMPLICIT INTEGER (A-Z) / COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG / DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100) / C EXTERN CARRY EXTERN DROP JA #ST #XR, ORG .+10 TEXT +MOVE + #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+6 OBJECT, ORG .+3 WHERE, ORG .+3 HUND, F 100.0 THREHN, F 300.0 FROM, ORG .+3 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 #LBL=. COMMON PLACOM ATLOC, ORG .+0702 LINK, ORG .+1130 PLACE, ORG .+0454 FIXED, ORG .+0454 HOLDNG, ORG .+3 ORG #LBL #RTN, BASE #BASE JA #GOBAK #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA OBJECT FSTA #G3 FSTA #G2 FLDA% #BASE,1+ FSTA WHERE FSTA #G4 STARTF FLDA% OBJECT ATX 7 / IF(OBJECT.GT.100)GOTO 1 FSUB HUND ATX 5 JGT #1 / FROM=PLACE(OBJECT) FLDA PLACE-3,7 FSTA FROM / GOTO 2 JA #2 / 1 FROM=FIXED(OBJECT-100) #1, FLDA FIXED-3,5 FSTA FROM / 2 IF(FROM.GT.0.AND.FROM.LE.300)CALL CARRY(OBJECT,FROM) #2, JLE #G1 FSUB THREHN JGT #G1 JSR CARRY JA .+6 #G2, JA . JA FROM / CALL DROP(OBJECT,WHERE) #G1, JSR DROP / RETURN / END JA #RTN #G3, JA . #G4, JA . END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | SECT PCT / PCT(N)=RND(100).LT.N EXTERN RND JA #ST #XR, ORG .+10 TEXT +PCT + #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+6 N, ORG .+3 HUND, F 100.0 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 #RTN, BASE #BASE JA #GOBAK #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA N STARTF / RND(100) JSR RND JA .+0004 JA HUND / .LT. N FSUB% N EXTERN #LT JSA #LT JA #RTN END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | SECT PSPEAK / SUBROUTINE PSPEAK(MSG,SKIP) / C / C FIND THE SKIP+1ST MESSAGE FOR OBJECT MSG AND PRINT IT. / C MSG SHOULD BE THE INDEX OF / C THE OBJECT. (INVEN+N+1 MESSAGE IS PROP=N MESSAGE). / C / IMPLICIT INTEGER (A-Z) / COMMON /TXTCOM/ RTEXT,LINES,ASCVAR / COMMON /PTXCOM/ PTEXT / DIMENSION RTEXT(205),LINES(36),PTEXT(100) EXTERN IO EXTERN SPEAK JA #ST #XR, ORG .+10 TEXT +PSPEAK+ #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+6 MSG, ORG .+3 SKIP, ORG .+3 ONE, F 1.0 #DOTMP, ORG .+3 OLDLOC, ORG .+3 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 I, ORG .+0003 M, ORG .+0003 #LBL=. COMMON PTXCOM PTEXT, ORG .+0454 COMMON TXTCOM RTEXT, ORG .+1147 LINES, ORG .+0044 ASCVAR, ORG .+0003 TXTLOC, ORG .+0003 DATA, ORG .+0352 ORG #LBL #RTN, BASE #BASE JA #GOBAK #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA MSG FLDA% #BASE,1+ FSTA SKIP STARTF / M=PTEXT(MSG) FLDA% MSG ATX 7 FLDA PTEXT-0003,7 FSTA M / IF(SKIP.LT.0)GOTO 9 FLDA% SKIP JLT #9 / OLDLOC=MSG FLDA% MSG FSTA OLDLOC / DO 3 I=1,SKIP+1 FLDA ONE FSTA I FLDA% SKIP FADD ONE FSTA #DOTMP #G0001, / 1 READ(2'M)LOC,LINES #1, JSR IO JA .+0004 JA M / M = ASCVAR FLDA M FADD ONE FSTA M / IF(LOC.EQ.OLDLOC) GO TO 1 FLDA TXTLOC FSUB OLDLOC JEQ #1 / OLDLOC=LOC FLDA TXTLOC FSTA OLDLOC / 3 CONTINUE #3, FLDA I FADD ONE FSTA I FSUB #DOTMP JLE #G0001 / M=M-1 FLDA M FSUB ONE FSTA M / CALL SPEAK(M) #9, JSR SPEAK / RETURN / END JA #RTN JA M END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | SECT PUT / INTEGER FUNCTION PUT(OBJECT,WHERE,PVAL) / C / C PUT IS THE SAME AS MOVE, EXCEPT IT RETURNS A VALUE USED TO SET UP THE / C NEGATED PROP VALUES FOR THE REPOSITORY OBJECTS. / C / IMPLICIT INTEGER (A-Z) / C EXTERN MOVE JA #ST #XR, ORG .+10 TEXT +PUT + #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+6 PVAL, ORG .+3 M1, F -1.0 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 #LBL=. ORG #LBL #RTN, BASE #BASE JA #GOBAK #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA #G1 FLDA% #BASE,1+ FSTA #G2 FLDA% #BASE,1+ FSTA PVAL STARTF / CALL MOVE(OBJECT,WHERE) JSR MOVE JA .+6 #G1, JA . #G2, JA . / PUT=(-1)-PVAL FLDA M1 FSUB% PVAL JA #RTN END |
> > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | INTEGER FUNCTION RND(LIMIT) C C GENERATES RANDOM INTEGER IN THE RANGE C 0 < N < LIMIT C C USES THE RANDOM SEED GENERATED BY THE C RALF MODULE "SEED" C COMMON/NUMCOM/NUMBER LOGICAL FLAG DATA FLAG/.FALSE./,NUMBER/0/ IF(FLAG)GOTO 10 FLAG=.TRUE. IRND=132*(NUMBER+327) 10 IRND=MOD(IRND*1021,1048576) RND=(LIMIT*IRND)/1048576 RETURN END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | SECT RSPEAK / SUBROUTINE RSPEAK(I) /C /C PRINT THE I-TH "RANDOM" MESSAGE (SECTION 6 OF DATABASE). /C / IMPLICIT INTEGER (A-Z) / COMMON /TXTCOM/ RTEXT / DIMENSION RTEXT(205) EXTERN SPEAK JA #ST #XR, ORG .+10 TEXT +RSPEAK+ #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+6 I, ORG .+3 J, ORG .+3 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 #LBL=. COMMON TXTCOM RTEXT, ORG .+1147 LINES, ORG .+44 ASCVAR, ORG .+3 TXTLOC, ORG .+3 DATA, ORG .+0234 ORG #LBL #RTN, BASE #BASE JA #GOBAK #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA I STARTF / IF(I.NE.0)CALL SPEAK(RTEXT(I)) FLDA% I JEQ #RTN / CALL SPEAK(RTEXT(I)) ATX 7 FLDA RTEXT-3,7 FSTA J JSR SPEAK / RETURN JA #RTN JA J END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | C SAVE/RESTORE PROCESSOR C C WRITTEN BY BOB SUPNIK C DISK ENGINEERING C 25-AUG-78 C C CURRENT LIMITS: C 750 TRAVEL OPTIONS (TRAVEL, TRVSIZ). C 300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). C 150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ). C 100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP). C 35 "ACTION" VERBS (ACTSPK, VRBSIZ). C 205 RANDOM MESSAGES (RTEXT, RTXSIZ). C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ). C THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF C THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE, C SO THERE CAN'T BE MORE THAN 1000 WORDS.) THESE UPPER LIMITS ARE: C 1000 NON-SYNONYMOUS VOCABULARY WORDS C 300 LOCATIONS C 100 OBJECTS C SUBROUTINE RSTRGM(F1,F2) LOGICAL F1 INTEGER F2 C IMPLICIT INTEGER (A-Z) LOGICAL LMWARN,CLOSNG,PANIC,HINTED, 1 CLOSED,GAVEUP,SCORNG,DSEEN C COMMON /VERSN/ VMAJ, VMIN, VEDIT INTEGER VMAJ, VMIN, VEDIT COMMON /FILES/ INDXNM, TEXTNM, SAVENM INTEGER INDXNM(3), TEXTNM(3), SAVENM(3) COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA COMMON /VOCCOM/ KTAB,ATAB,TABSIZ COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG COMMON /PTXCOM/ PTEXT COMMON /ABBCOM/ ABB COMMON /MISCOM/ LINUSE,TRVS,CLSSES,OLDLOC,LOC,CVAL,TK,NEWLOC, 1 KEY,PLAC,FIXD,ACTSPK,COND,HINTS,HNTMAX,PROP,TALLY,TALLY2, 2 HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,LAMP,GRATE COMMON /MISCOM/ 3 CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET, 4 CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE,WATER,OIL,PLANT, 5 PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND, 6 BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM COMMON /MISCOM/ 7 PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK, 8 THROW,FIND,INVENT,TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM, 9 NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2, 1 CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG,ODLOC,STREAM,SPICES COMMON /MISC2/ I,RTXSIZ,CLSMAX,LOCSIZ,CTEXT,STEXT,LTEXT, 1 SECT,TRAVEL,TRVCON,TRVLOC,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ, 2 MAXTRS,HINTED,HNTLOC,KK COMMON /MISC3/ATTACK,DTOTAL,OLDLC2,LIMIT,MXSCOR,SCORE, 1 STICK,WZDARK C INTEGER LINES(12),DATA(78) C The TRAVEL, TRVCON, and TRVLOC arrays are C Packed with words 0,1,2 holding the data. Saves lots C of wasted space at the expense of some complexity. INTEGER TRAVEL(250), TRVCON(250), TRVLOC(250), TRVSIZ INTEGER KTAB(300),ATAB(300),TABSIZ INTEGER LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150), 1 ATLOC(150) INTEGER PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200), 1 PTEXT(100),PROP(100),HOLDNG INTEGER ACTSPK(35) INTEGER RTEXT(205) INTEGER CTEXT(12),CVAL(12) INTEGER HINTLC(20),HINTS(20,4) DIMENSION HINTED(20) INTEGER TK(20),DLOC(6),ODLOC(6) DIMENSION DSEEN(6) INTEGER ASCVAR, TXTLOC, TRVS, CLSSES, OLDLOC INTEGER HNTSIZ, HNTMAX, TALLY, TALLY2, CHLOC, CHLOC2, DFLAG INTEGER DALTLC,GRATE,CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE INTEGER FISSUR,TABLET,CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE INTEGER WATER,OIL,PLANT,PLANT2,AXE,MIRROR,DRAGON,CHASM,EMRALD INTEGER BEAR,MESSAG,VEND,BATTER,COINS,CHEST,EGGS,TRIDNT,VASE INTEGER PYRAM,PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN INTEGER LOCK,THROW,FIND,INVENT,TURNS,KNFLOC,DETAIL,ABBNUM,SAY INTEGER NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2 INTEGER TROLL,TROLL2,STREAM,SPICES INTEGER RTXSIZ,CLSMAX,LOCSIZ,SECT,TABNDX,OBJ INTEGER VERB,HNTLOC,KK INTEGER ATTACK,DTOTAL,OLDLC2,LIMIT,MXSCOR,SCORE,STICK,WZDARK C C USR call - FORTRAN unit, filename, operation, error flag C Operation is 2, open input; 3 open output; 4 close output. C Calling "CLOSE" on an input file causes it to be deleted! C IF (.NOT. F1) GOTO 10 C C Attempt to restore saved database C CALL USR(7, SAVENM, 2, IERR) IF (IERR.NE.0) GOTO 60 GOTO 20 C C Attempt to restore initial database C 10 CALL USR(7, INDXNM, 2, IERR) IF (IERR.EQ.0) GOTO 20 F2=-1 RETURN C 20 READ(7) I1,I2,I3 IF((I1.NE.VMAJ).OR.(I2.NE.VMIN)) GO TO 50 READ(7) RTEXT,KTAB,ATAB READ(7) ATLOC,LINK,PLACE,FIXED,HOLDNG READ(7) PTEXT,ABB,LINUSE,TRVS,CLSSES READ(7) OLDLOC,LOC,CVAL,NEWLOC,KEY READ(7) PLAC,FIXD,ACTSPK,COND,HINTS READ(7) HNTMAX,PROP,TALLY,TALLY2,HINTLC READ(7) CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC READ(7) TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM READ(7) NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS READ(7) CLOCK1,CLOCK2,CLOSNG,PANIC,CLOSED READ(7) GAVEUP,SCORNG,ODLOC,CTEXT,STEXT,LTEXT READ(7) TRAVEL,TRVCON,TRVLOC,MAXTRS,HINTED,HNTLOC READ(7) ATTACK,DTOTAL,OLDLC2,LIMIT,MXSCOR,SCORE,STICK,WZDARK C C CLOSNG = 0 IF(F1) CALL SIXOUT('R]ESTORED.@',5,0) F2=0 RETURN 50 IF(F1) CALL SIXOUT('F]ILE IS OBSOLETE, [RESTORE] FAILS.',18,0) F2=-1 RETURN 60 CALL SIXOUT('C]AN''T OPEN SAVE FILE, [RESTORE] FAILS.', 22, 0) F2=-1 RETURN END |
> > > > > | 1 2 3 4 5 | $JOB RUN ADVENTURE .R FRTS *ADVENT *$ $END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | C SAVE/RESTORE PROCESSOR C C WRITTEN BY BOB SUPNIK C DISK ENGINEERING C 25-AUG-78 C C CURRENT LIMITS: C 750 TRAVEL OPTIONS (TRAVEL, TRVSIZ). C 300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ). C 150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ). C 100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP). C 35 "ACTION" VERBS (ACTSPK, VRBSIZ). C 205 RANDOM MESSAGES (RTEXT, RTXSIZ). C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX). C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ). C THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF C THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE, C SO THERE CAN'T BE MORE THAN 1000 WORDS.) THESE UPPER LIMITS ARE: C 1000 NON-SYNONYMOUS VOCABULARY WORDS C 300 LOCATIONS C 100 OBJECTS C SUBROUTINE SAVEGM(F1,F2) LOGICAL F1 INTEGER F2 C IMPLICIT INTEGER (A-Z) LOGICAL LMWARN,CLOSNG,PANIC,HINTED, 1 CLOSED,GAVEUP,SCORNG,DSEEN C COMMON /VERSN/ VMAJ, VMIN, VEDIT INTEGER VMAJ, VMIN, VEDIT COMMON /FILES/ INDXNM, TEXTNM, SAVENM INTEGER INDXNM(3), TEXTNM(3), SAVENM(3) COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA COMMON /VOCCOM/ KTAB,ATAB,TABSIZ COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG COMMON /PTXCOM/ PTEXT COMMON /ABBCOM/ ABB COMMON /MISCOM/ LINUSE,TRVS,CLSSES,OLDLOC,LOC,CVAL,TK,NEWLOC, 1 KEY,PLAC,FIXD,ACTSPK,COND,HINTS,HNTMAX,PROP,TALLY,TALLY2, 2 HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,LAMP,GRATE COMMON /MISCOM/ 3 CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET, 4 CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE,WATER,OIL,PLANT, 5 PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND, 6 BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM COMMON /MISCOM/ 7 PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK, 8 THROW,FIND,INVENT,TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM, 9 NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2, 1 CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG,ODLOC,STREAM,SPICES COMMON /MISC2/ I,RTXSIZ,CLSMAX,LOCSIZ,CTEXT,STEXT,LTEXT, 1 SECT,TRAVEL,TRVCON,TRVLOC,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ, 2 MAXTRS,HINTED,HNTLOC,KK COMMON/MISC3/ATTACK,DTOTAL,OLDLC2,LIMIT,MXSCOR,SCORE, 1 STICK,WZDARK C INTEGER LINES(12),DATA(78) C The TRAVEL, TRVCON, and TRVLOC arrays are C Packed with words 0,1,2 holding the data. Saves lots C of wasted space at the expense of some complexity. INTEGER TRAVEL(250), TRVCON(250), TRVLOC(250), TRVSIZ INTEGER KTAB(300),ATAB(300),TABSIZ INTEGER LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150), 1 ATLOC(150) INTEGER PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200), 1 PTEXT(100),PROP(100),HOLDNG INTEGER ACTSPK(35) INTEGER RTEXT(205) INTEGER CTEXT(12),CVAL(12) INTEGER HINTLC(20),HINTS(20,4) DIMENSION HINTED(20) INTEGER TK(20),DLOC(6),ODLOC(6) DIMENSION DSEEN(6) INTEGER ASCVAR, TXTLOC, TRVS, CLSSES, OLDLOC INTEGER HNTSIZ, HNTMAX, TALLY, TALLY2, CHLOC, CHLOC2, DFLAG INTEGER DALTLC,GRATE,CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE INTEGER FISSUR,TABLET,CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE INTEGER WATER,OIL,PLANT,PLANT2,AXE,MIRROR,DRAGON,CHASM,EMRALD INTEGER BEAR,MESSAG,VEND,BATTER,COINS,CHEST,EGGS,TRIDNT,VASE INTEGER PYRAM,PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN INTEGER SAY,LOCK,THROW,FIND,INVENT,TURNS,KNFLOC,DETAIL,ABBNUM INTEGER NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2 INTEGER TROLL,TROLL2,STREAM,SPICES INTEGER RTXSIZ,CLSMAX,LOCSIZ,SECT,TABNDX,OBJ INTEGER VERB,HNTLOC,KK INTEGER ATTACK,DTOTAL,OLDLC2,LIMIT,MXSCOR,SCORE,STICK,WZDARK C IF (F1) GOTO 10 C C Normal setup, open AINDX.DA for output C CALL USR(7,INDXNM,3,IERR) IF (IERR .EQ. 0) GO TO 20 CALL SIXOUT('C]AN''T OPEN ',6,2) CALL SIXOUT(INDXNM, 9, 3) CALL SIXOUT(' ]FOR OUTPUT',6,1) F2 = -1 RETURN C C Saving game C 10 CALL USR(7,SAVENM,3,IERR) IF (IERR.EQ.0) GOTO 20 CALL SIXOUT('C]AN''T OPEN ',6,2) CALL SIXOUT(SAVENM,9,3) CALL SIXOUT(' ]FOR OUTPUT',6,1) F2 = -1 RETURN C 20 WRITE(7) VMAJ,VMIN,VEDIT WRITE(7) RTEXT,KTAB,ATAB WRITE(7) ATLOC,LINK,PLACE,FIXED,HOLDNG WRITE(7) PTEXT,ABB,LINUSE,TRVS,CLSSES WRITE(7) OLDLOC,LOC,CVAL,NEWLOC,KEY WRITE(7) PLAC,FIXD,ACTSPK,COND,HINTS WRITE(7) HNTMAX,PROP,TALLY,TALLY2,HINTLC WRITE(7) CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC WRITE(7) TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM WRITE(7) NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS WRITE(7) CLOCK1,CLOCK2,CLOSNG,PANIC,CLOSED WRITE(7) GAVEUP,SCORNG,ODLOC,CTEXT,STEXT,LTEXT WRITE(7) TRAVEL,TRVCON,TRVLOC,MAXTRS,HINTED,HNTLOC WRITE(7) ATTACK,DTOTAL,OLDLC2,LIMIT,MXSCOR,SCORE,STICK,WZDARK C IF(F1) CALL SIXOUT('S]AVED.',3, 0) C C Close the output file C IF(F1) CALL USR(7,SAVENM, 4, IERR) IF(.NOT.F1) CALL USR(7, INDXNM, 4, IERR) F2=0 RETURN END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | FIELD1 SETIDL /IDLE RANDOM NUMBER GENERATOR EXTERN #IDLE JA #RET TEXT +SETIDL+ SXR, SETX XR SETB BP BP, F 0.0 XR, ORG .+3 EXP, 0 IDLAD, ADDR #IDLE-1 / Pointer to idle routine in FRTS POINT, JOB, ADDR DOIT / Address of routine to run ORG XR+10 K0100, 100 K0003, 3 ROTWRD, 0017 #LBL=. COMMON NUMCOM NUMBER, ORG .+3 COMMON TXTCOM RTEXT, ORG .+1147 LINES, ORG .+0044 ASCVAR, ORG .+0003 TXTLOC, ORG .+0003 DATA, ORG .+0352 ORG #LBL SEEDPT, ADDR NUMBER 0 DATHAK, 7777 FLDA ASCVAR DATABL, 1763-1 / Address of Direct Access table entry 8 in FRTS COUNT, 0 / Idle loop count COUNT2, 7774 / Outer counter RESET, 7774 / Outer counter value X4=14 / Autoindex reg ORG 10*3+BP FNOP JA SXR 0 RET, JA . BASE 0 #RET, STARTD FLDA 10*3 FSTA RET SETB BP BASE BP STARTF TRAP4 SET8 /GO TO 8 MODE STUFF. JA RET /DONE. ON IDLE QUEUE. SET8, 0 / / Horrible hackery. This sets up the FRTS direct access table / to allow us to open the ADVENT.DA file without having to / rebuild it each time. Open it using USR, and this lets us / go use it later. (DEFINE FILE always creates a new one.) TAD DATABL DCAZ X4 SCDF, CDF 0 TAD DATHAK DCA% X4 TAD DATHAK+1 DCA% X4 TAD DATHAK+2 DCA% X4 TAD CDFIDL SZA CLA JMP SFIELD /ALREADY DONE TAD IDLAD /FIELD OF IDLE ROUTINE JMS MKCDF DCA CDFIDL TAD IDLAD+1 /ADDRESS OF #IDLE DCAZ X4 CDFIDL, 0 /GETS CDF TAD SKPINS /SKP INSTRUCTION DCAZ% X4 /STORE AT #IDLE TAD JOB+1 /ADDRESS OF IDLE ROUTINE DCAZ% X4 /STORE AT #IDLE+1 TAD JOB JMS MKCDF IAC / CDF -> CIF CDF DCAZ% X4 /STORE AT #IDLE+2 SFIELD, CIF CDF JMP% SET8 / / Blinky lights / SKPINS, DOIT, SKP / Entry point, one-time use constant TAD ROTWRD /GET WORD TO DISPLAY STALL, ISZ COUNT JMP STALL ISZ COUNT2 JMP STALL FLOP, RAL /Shift over DCA ROTWRD /Save it TAD RESET /Reset outer counter DCA COUNT2 SNL JMP DONE TAD ROTWRD FLIP, RAR /Rotate back DCA ROTWRD TAD FLOP DCA COUNT /Save old rotate TAD FLIP /And flip 'em around DCA FLOP TAD COUNT DCA FLIP DCA COUNT DONE, TAD SEEDPT JMS MKCDF DCA .+1 0 TAD SEEDPT+1 DCA EXP CLL IAC TAD EXP DCA POINT TAD% POINT TAD K0100 SPA JMP OVRFLO DCA% POINT JMP DOIT+1 OVRFLO, CLA CLL DCA% POINT TAD% EXP IAC AND K0003 DCA% EXP JMP DOIT+1 / Change field number into CDF instruction MKCDF, 0 CLL RTL RAL /INTO BITS 6-8 TAD SCDF /CDF TO #IDLE JMP% MKCDF END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 | / SPEAK - Types out messages from the database / Also includes TTY output routines that unpack / packed sixbit into mixed case ASCII. / FIELD1 ADVTTY TTY, 0 / TTY Output routine, dupe of FRTS IOF / Protect from race conditions SNA / Input or output? JMP KBD / Input - read character DCA HANGPT / Output - save char RDF TAD CDIF00 DCA CDFX CDF 0 TAD% TOCHR / Output character status in FRTS SMA SZA CLA / If gt 0, char backed up JMP BUSY / Else must wait LOOP, TAD% TOCHR / Get the status CLL RAL /Busy flag in link CLA CML RAR /Complement of busy in sign TAD HANGPT SPA /If tty not busy, TLS /Send it DCA% TOCHR /Store pos or neg, backed up or busy TTYRET, ION /Interrupts back on CDFX, HLT /Caller's field JMP% TTY /Return CDIF00, CIF CDF BUSY, CDF 10 /Busy, must wait. Call Field 0 HANG routine CIF 0 JMS% HANGPT+1 0451 / TTUHNG CDF 0 JMP LOOP / Try output again KBD, RDF TAD CDIF00 DCA CDFX CDF 0 TAD% TICHR / Any input? SNA CLA JMP WAIT / No, wait GETIN, TAD% TICHR / Get character DCA HANGPT / Save DCA% TICHR / Clear buffer TAD HANGPT JMP TTYRET / Return WAIT, CDF 10 CIF 0 JMS% HANGPT+1 /Hang 465 /KBUHNG CDF 0 JMP GETIN /Get input TOCHR, 4 TICHR, 5 HANGPT, ADDR #HANG / / Terminal line input routine. Used because the FRTS input is quite limited. / This one handles scope rubouts and allows lower case input. / Inputs: Array Returned characters, stored one sixbit per array word / (The FORTRAN input routine is set up this way to unpack) / Size Number of characters to allow / Prompt Prompt string FIELD1 RDLIN / ENTRY RDLINE RDLINE, JA #RLST #RLXR, ORG .+10 TEXT +RDLINE+ #RLRET, SETX #RLXR SETB #RLBAS JA .+3 #RLBAS, ORG .+6 BUFPT, ORG .+3 BUFLEN, ORG .+3 ORG #RLBAS+30 FNOP JA #RLRET FNOP #RGOBK, 0;0 #RLRTN, BASE #RLBAS JA #RGOBK #RLST, STARTD 0210 FSTA #RGOBK,0 0200 SETX #RLXR SETB #RLBAS LDX 0,1 FSTA #RLBAS FLDA% #RLBAS,1+ FSTA BUFPT FLDA% #RLBAS,1+ FSTA BUFLEN STARTF / / Pass down size to '8' code / SETX BUFSIZ FLDA% BUFLEN FNEG / Make it negative ATX 0 / Pass buffer len SETX #RLXR TRAP4 GETLIN / Get input line JA #RLRTN / And return / Input reader FIELD1 GETLN GETLIN, 0 CLA DCA OFFSET / Start at offset zero TAD% SCOPT AND K200 DCA SCOPE TAD% BUFFLD+1 / Get CDF for buffer AND FLDMSK CLL RTL RAL TAD CDFG DCA BUFCDF / / Go get an input character / GETNXT, JMS% PTTY+1 / Called with zero to get char DCA INCH / Save input / / Specials? / TAD INCH TAD MDEL / Delete? SNA CLA JMP DELETE / Handle that TAD INCH TAD MCR / CR? SNA CLA JMP ENTER / End of line, let's go. TAD INCH TAD MSPC / Less than space? SPA CLA JMP BELL / Nope, ignore TAD OFFSET TAD BUFSIZ / Room left? SMA CLA JMP BELL / Bell if not TAD INCH JMS% PTTY+1 / Echo it TAD INCH TAD LWRA / Is it lowercase? SPA CLA JMP UPPER / No, store it TAD INCH TAD LWRZ SMA CLA JMP UPPER / More than lowercase z TAD INCH TAD AMINA / Adjust to uppercase DCA INCH UPPER, JMS STORE / Store this character JMP GETNXT / Get more / Store a character in the output buffer / using the current offset / STORE, 0 TAD OFFSET TAD OFFSET TAD OFFSET / Count FPP words TAD% BUFPTR+1 / Pointer to exponent word DCA BPT TAD K27 / Exponent 27 for integer JMS STO JMS STO / Zero high word TAD INCH / Char value AND SIXMSK / Convert to sixbit JMS STO / Store in buffer CDF 10 / Back to my field ISZ OFFSET / One more in the buffer SPC, 240 / Really shouldn't overflow; harmless AND JMP% STORE / Return STO, 0 BUFCDF, HLT / Gets CDF for buffer field DCA% BPT ISZ BPT / Next word JMP% STO / Return if no skip TAD BUFCDF TAD BS / Next field DCA BUFCDF JMP% STO BELL, TAD BEL / Warn the user JMS% PTTY+1 JMP GETNXT DELETE, TAD OFFSET / How far into the buffer are we? SNA CLA JMP BELL / Ignore extra deletes TAD SCOPE SNA CLA JMP DUMBDL / Simple fortran-format delete TAD BS JMS% PTTY+1 TAD SPC JMS% PTTY+1 TAD BS JMS% PTTY+1 JMP FIXOFF / Fix the offset DUMBDL, TAD K334 / Backslash JMS% PTTY+1 FIXOFF, CLA CMA TAD OFFSET DCA OFFSET JMP GETNXT ENTER, TAD CR / Send a RETURN JMS% PTTY+1 CLRLP, TAD OFFSET / Is there space available? TAD BUFSIZ SMA CLA JMP CLRDN TAD SPC DCA INCH JMS STORE JMP CLRLP CLRDN, CIF CDF 0 JMP% GETLIN BUFSIZ, 0 SCOPT, 7726 / Scope flag in OS/8 K200, 200 MDEL, -377 / Delete MCR, -215 CR, 215 MSPC, -240 BEL, 207 LWRA, -341 LWRZ, -373 AMINA, -40 / Add to "a" to make "A" BPT, BUFFLD, ADDR BUFPT+1 SCOPE, BUFPTR, ADDR BUFPT+2 OFFSET, PTTY, ADDR TTY BS, 10 K334, 334 CDFG, CDF 0 K27, 27 SIXMSK, 77 FLDMSK, 7 INCH, 0 / / Fortran-callable message printer / Put here to avoid wasting the rest of the page. / Arguments: / BUF Buffer pointer / COUNT Number of characters to write, zero to look for end / CRFLAG Carriage return flags. / Bit 11 (1) = no lead LF / Bit 10 (2) = no trail CR / Bit 9 (4) = start lowercase / ENTRY SIXOUT SIXOUT, JA #STRT #SXR, ORG .+10 TEXT +SIXOUT+ #SRET, SETX #SXR SETB #SBASE JA .+3 #SBASE, ORG .+6 CNT, ORG .+3 SFLAG, ORG .+3 ORG #SBASE+30 FNOP JA #SRET FNOP #SGOBK, 0;0 #SRTN, BASE #SBASE JA #SGOBK #STRT, STARTD 0210 FSTA #SGOBK,0 0200 SETX #SXR SETB #SBASE LDX 0,1 FSTA #SBASE FLDA% #SBASE,1+ FSTA BUF / Buffer pointer FLDA% #SBASE,1+ / Count FSTA CNT FLDA% #SBASE,1+ / Carriage control flag FSTA SFLAG STARTF FLDA% CNT SETX COUNT ATX 0 FLDA% SFLAG ATX 1 SETX #SXR TRAP4 SIX8 /Call the 8-mode output routine JA #SRTN FIELD1 SXOUT ENTRY SIX8 / Mixed case output routine SIX8, 0 TAD CRFLAG /Suppresss carriage control? RAR /Low bit suppresses lead LF SZL CLA JMP .+4 /No leading LF CDF 10 / My field TAD LF /Linefeed JMS% TTYPTR+1 /Output it TAD CRFLAG AND K4 /Start in lower case? SZA CLA TAD K40 /Yes TAD HUN /Reset conversion factor DCA SHIFT TAD BUF /Buffer field AND K7 /Just the field bits CLL RAL RTL /Into place TAD CDF0 /Into CDF instruction DCA CDF1 TAD CDF1 DCA CDF2 TAD COUNT /Get buffer length SNA JMP NOTRIM /Zero means it has a terminating "@" / / Find the end of the string / CLA CMA /End is start + len - 1 TAD COUNT /String len in words TAD BUF+1 /End of the string DCA PTR /Pointer to end TAD COUNT /Invert count CMA IAC DCA COUNT CDF1, HLT FNDEND, TAD% PTR TAD K3740 / - ' ' (two spaces) SZA CLA / Skip if blank JMP NONBLK ISZ COUNT /Count another SKP JMP NONBLK /If empty, done CLA CMA / -1 TAD PTR DCA PTR /Back pointer up JMP FNDEND /Keep looking NONBLK, TAD COUNT SNA CLA /Skip if output left JMP DONE /Nothing if count zero already NOTRIM, TAD BUF+1 /Reset pointer to start DCA PTR CDF2, HLT TAD% PTR /Get word DCA STEMP /Save TAD STEMP RTR RTR RTR /First sixbit JMS OUTONE /Convert and output it TAD STEMP /Second sixbit JMS OUTONE ISZ PTR /Bump pointer SKP /OK if no skip JMP NEWFLD /Next field otherwise INCCNT, ISZ COUNT JMP CDF2 /Keep outputting DONE, CLA TAD CRFLAG /Suppress trailing CR? RTR /2 bit suppresses trailing CR SZL CLA /If zero, write it. JMP OUT /Yes, leave now CDF 10 /My field TAD CRTN JMS% TTYPTR+1 OUT, CIF CDF 0 JMP% SIX8 NEWFLD, TAD CDF1 TAD K10 /Next field DCA CDF1 TAD CDF1 DCA CDF2 JMP INCCNT OUTONE, 0 AND K77 /Mask SNA JMP DONE / End of string TAD K7743 / minus '[' SNA JMP SETLWR /Set to lowercase shift TAD K2 / ok, ']'? SNA JMP SETUPR /Set to uppercase TAD K7773 /Restore SPA TAD SHIFT /For positive, shift it TAD K40 /Else it's not alphabetic CDF 10 /My field JMS% TTYPTR+1 /Output it JMP% OUTONE /Done SETLWR, TAD K40 /Reset shift SETUPR, TAD HUN /For upper/lower DCA SHIFT JMP% OUTONE TTYPTR, ADDR TTY SHIFT, 140 /Shift value / COUNT and CRFLAG must stay together COUNT, 0 /Num words to output. CRFLAG, 0 /1 - no leading LF, 2 no trailing CR PTR, 0 CRTN, 15 LF, 12 K3740, 3740 /minus blank BUF, 0;0;0 /Buffer 15-bit address STEMP, 0 K77, 77 /sixbit mask K7, 7 K4, 4 K40, 40 CDF0, CDF HUN, 100 K7743, 7743 K7773, 7773 K10, 10 /Field increment K2, 2 SECT SPEAK /C / SUBROUTINE SPEAK(N) /C /C PRINT THE MESSAGE IN RECORD N OF THE RANDOM ACCESS MESSAGE FILE. /C / IMPLICIT INTEGER (A-Z) / COMMON /TXTCOM/ RTEXT,LINES,ASCVAR / COMMON /ALPHAS/ BLANK,EOF / DIMENSION RTEXT(205),LINES(36) /C EXTERN IO EXTERN #HANG JA #ST #XR, ORG .+10 TEXT +SPEAK+ #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+6 N, ORG .+3 #DOTMP, ORG .+3 BLANK, TEXT + + EOF, TEXT +>$< + ONE, F 1.0 FOUR, F 4.0 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 I, ORG .+0003 L, ORG .+0003 OLDLOC, ORG .+0003 #LBL=. COMMON TXTCOM RTEXT, ORG .+1147 LINES, ORG .+0044 ASCVAR, ORG .+0003 TXTLOC, ORG .+0003 DATA, ORG .+0352 ORG #LBL #RTN, BASE #BASE JA #GOBAK #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA N STARTF / IF(N.EQ.0)RETURN FLDA% N JEQ #RTN / READ(2'N) LOC,LINES FLDA N STARTD FSTA #G0002 STARTF JSR IO JA .+0004 #G0002, JA . / IF(LINES(1).EQ.EOF)RETURN FLDA ONE ATX 7 FLDA LINES-0003,7 FSUB EOF JEQ #RTN /1 OLDLOC = LOC #1, FLDA TXTLOC FSTA OLDLOC FLDA ONE FSTA I / DO 3 I=36,1,-1 / Set COUNT to the number of words (36 or 44 octal) SETX COUNT LDX 44,0 /44 words LDX 0,1 /With carriage control SETX #XR / L=I /3 CONTINUE /5 TYPE 2,(LINES(I),I=1,L) #5, FLDA LINEPT FSTA BUF /Set buffer pointer TRAP4 SIX8 FLDA% N FADD ONE FSTA% N FLDA N / READ(2'ASCVAR) LOC,LINES STARTD FSTA #G0006 STARTF JSR IO JA .+0004 #G0006, JA . / IF(LOC .EQ. OLDLOC) GO TO 1 FLDA TXTLOC FSUB OLDLOC JEQ #1 EXTERN #WRITO TRAP3 #WRITO JA FOUR JA #10+2 EXTERN #RENDO TRAP3 #RENDO /10 RETURN #10, JA #RTN / (1X) 5061 3051 /2 FORMAT(' ',36A2) PDP/8: (' ',12A6) LINEPT, ADDR LINES 0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 | / SUBROUTINE USR (UNIT, NAME, FUNCT, ERROR) / VERSION 01.18 / WRITTEN BY: / ROBERT PHELPS / BEHAVIOR LAB / DEPT. RAD. BIOL. & BIOPHYSICS / UNIVERSITY OF ROCHESTER / ROCHESTER, NY 14642 / / THIS ROUTINE ALLOWS RUN-TIME DECLARATION OF FILES / IN D.E.C. FORTRAN IV FOR THE PDP-8. / / DESCRIPTION OF PARAMETERS: / / UNIT - LOGICAL UNIT NUMBER / ONLY NUMBERS 5 THRU 9 ARE ALLOWED. / FEWER LOGICAL UNITS MAY BE ALLOWED DEPENDING / ON CORE AVAILABILITY -- SEE PROGRAMMING NOTE / BELOW. / NAME - DEV:FILE.EX / STORED IN FORMAT 3A6 OR EQUIVALENT. / DEVICE ASSUMED TO BE DSK: IF NOT / EXPLICITLY STATED. THIS PARAMETER MAY / ALSO BE A HOLLERITH LITERAL. / NULL CHARACTERS ('@') AND SPACES / ARE IGNORED IN THIS FIELD. / FUNCT - FUNCTION: 2 - OPEN FILE FOR INPUT / 3 - OPEN FILE FOR OUTPUT / 4 - CLOSE OUTPUT FILE / THE OUTPUT FILE NAME GIVEN FOR A <CLOSE> / MUST AGREE WITH THE CORRESPONDING <OPEN> / FILE NAME FOR THAT UNIT. CLOSING A FILE / WITH 0 BLOCKS OR AN INPUT (FUNCT=2) FILE WILL / DELETE THAT FILENAME FROM THE DIRECTORY. / ERROR - RETURN ERROR CONDITION / 0 - NO ERRORS. / 1 - ILLEGAL DEVICE / 2 - ILLEGAL FILE NAME / 3 - ILLEGAL UNIT NUMBER (CORE EXCEEDED!?) / 4 - ILLEGAL FUNCTION CODE / / USER ERRORS MAY TERMINATE EXECUTION UNLESS THE /E / OPTION WAS SPECIFIED TO FRTS. THE FOLLOWING USER / ERRORS FROM <USR> ARE DEFINED: / 0002 - THE USER HAS DEFINED A NON-RESIDENT / DEVICE HANDLER EXTERNAL TO <USR>. / / PROGRAMMING NOTE: EACH UNIT IS ASSIGNED 1000(8) LOCATIONS /IN THE HIGHEST FIELD FOR BUFFER AND HANDLER (400 FOR ITS BUFFER /AND 400 FOR ITS HANDLER). THESE LOCATIONS ARE /NOT DYNAMICALLY ALLOCATED BUT ARE USED FOR DEVICE BUFFER AND /HANDLERS ONLY IF THEY ARE NOT USED BY THE /PROGRAM. TO USE CORE MOST EFFICIENTLY FOR LARGE /PROGRAMS, USE THE HIGHEST ORDER UNIT NUMBERS POSSIBLE. THAT IS, /USING UNIT 5 ALLOWS 1000(8) FEWER WORDS FOR SOURCE CODE THAN IF /UNIT 6 WERE THE LOWEST UNIT NUMBER USED. / / RESTRICTIONS: BECAUSE <FRTS> LOADS NON-RESIDENT HANDLERS FROM /THE TOP OF CORE DOWN, AND <USR> ALSO USES THAT AREA, THE USER IS NOT /ALLOWED TO MAKE LOAD TIME /I/O UNIT DECLARATIONS TO DEVICES WITH NON-RESIDENT /HANDLERS EXTERNAL TO <USR>. TO DO SO WLL CAUSE A FATAL /USER ERROR 2. IT IS RECOMMENDED, AND GENERALLY /MORE CONVIENENT TO USE INTERNAL HANDLERS AND /DECLARE ALL OTHER FILES AT EXECUTION TIME /WITH CALLS TO THIS SUBROUTINE. /THE USE OF <FRTS> INTERNAL HANDLERS, /SYS:, AND DEVICES CO-RESIDENT WITH SYS: ARE LEGAL, /EVEN IF DEFINED EXTERNAL TO THIS SUBROUTINE. / /NOTE: THIS PROGRAM REQUIRES ONE PATCH BE MADE TO / <FRTS> BEFORE IT WILL RUN. IT IS DESCRIBED / BELOW: / /MAXCOR=121 /THESE ARE LOCATIONS IN THE RESIDENT PART OF /HGHLOC=123 /<FRTS> AND REQUIRE THE FOLLOWING PATCH BE PLACED /IN FRTS SO THEY WILL BE SET PROPERLY. THE PATCH /DELETES CODE WHICH INITIALIZES SYSTEMS WITH AN /ANALEX PRINTER, SO IF YOU HAVE AN ANALEX ... WATCH OUT. /Note that MAXCOR and HGHLOC are 2 word variables which have been /created for this routine on page 0 of FRTS. If FRTS /is changed to use more page 0 locations, the patch /will have to be changed as well. / FIELD 1; *2475 /12475 7300 CLA CLL /Note, CDF CIF 0 is pending /12476 1311 TAD 12511 /Load address of VAR /12477 3010 DCA 10010 /Store in auto index / 1023 TAD 10023 /Load value of MAX field / 3410 DCA I 10010 /As high order part of MAXCOR / 3410 DCA I 10010 /Zero low order part / 1025 TAD 10025 /Load highest avail. field / 3410 DCA I 10010 /Store high order word / 1026 TAD 10026 /load high address / 3410 DCA I 10010 /Store low order word of HGHLOC / 7000 NOP /? / 5766 JMP I 12566 /Start up FPP /12511 120 /ADDRESS-1 of MAXCOR EXTERN CGET EXTERN CPUT DSRN=4244 /Address of DSRN table in FRTS SECT USR JA #ST /NOTE: MUCH OF THIS CODE WAS LIFTED FROM A FORTRAN / GENERATED ASSEMBLY LISTING. ACCEPT THIS AS / AN APOLOGY FOR THE LACK OF COMMENTS IN SOME SECTIONS. / #XR, ORG .+10 TEXT +USR + #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+6 /BASE 0 AND 1 UNIT, ORG .+3 /BASE 2 FUNCT, ORG .+3 /BASE 3 ERROR, ORG .+3 /BASE 4 #DSK, TEXT +DSK@@@+ /DEFAULT DEVICE NAME I, F 0.0 /BASE 6 N, F 0.0 /BASE 7 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 PERFLG, F 0.0 /PERIOD FLAG X, #TMP, ORG .+3 ONE, F 1.0 TWO, F 2.0 THREE, F 3.0 FOUR, F 4.0 SEVEN, F 7.0 MUNIT, 0027;0;0 /Low unit: Set according to CORE avail. NINE, F 9.0 TEN, F 10.0 ATEEN, F 18.0 COLON, F 58.0 PERIOD, F 46.0 SPACE, F 32.0 MAXCOR, 0; 7; 0 /RHM: Don't require the FRTS patch. HGHLOC, 0; 7; 2000 /RHM: Hope memory used doesn't get larger. / ADVENT in the current implementation uses up thru 71000 at worst. / This hopefully allows room for extra 2-page handlers and the TD8E ROM. #RTN, BASE #BASE JA #GOBAK #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA UNIT FLDA% #BASE,1+ FSTA NAME FLDA% #BASE,1+ FSTA FUNCT FLDA% #BASE,1+ FSTA ERROR / INITIALIZE PROGRAM SKIP, /JA SKIP2 AFTER FIRST ENTRY / FIND OUT HOW MANY UNITS TO ALLOW /Note that the original scheme was rather bizzare, and for /humerous purposes, I have left it here, commented out. /This worked OK with the old FPP interpreter, since it zeroed /the exponent with a STARTF. The FPP does not, and the /EXPONENT is left indeterminate. This meant that sometimes /you could use past 72400, and sometimes you couldn't. /(Note, that S.B.'s version of FRTS has been changed /so that the FPP interpreter works the same as the FPP.) / FLDA MAXCOR /Load highest field number / FSUB HGHLOC /Subtract high location / FADD D2400 /1 FIELD LESS 5400 LOCS FOR 5 DEVICES / NOTE: PG. 7600 RESERVED FOR OS/8 / PG. 7400 USED FOR OS/8 USR CALL / JGE SKCONT /ROOM FOR 5 DEVICES? / FADD D15000 /Note, FAC= how many locations short / FMUL D1000 /HOW MANY 1000 WORD BLOCKS ARE THERE? / STARTF / FNORM / FMUL E30 /ALTHOUGH WE WERE WORKING WITH AN / /INTEGER ABOVE, THE FPP THOUGHT IT / /HAD A BINARY POINT TO THE RT. OF THE / /SIGN BIT. THIS INSTRUCTION EFFECTIVELY / /CHANGES THE NUMBER TO A REAL FPP INTEGER. / FSTA MUNIT /MINIMUM UNIT # ALLOWED /D15000, 1;5000 /D1000, 4;0 /0.001 /E30, 30;2000;0 /1.E30(2) /The routine should really be modified to check which handlers /are already loaded. This wouldn't be all that difficult, /since the field 1 tables of handler residency are saved on /SYS block 37, and restored each time USR is called. As long /as a reset isn't performed, it should be easy to determine /if a handler is already loaded. Then HGHLOC could be changed /dynamically, as handlers were loaded. The core usage would then /also be independent of the unit number used. FLDA MAXCOR /Load Max field # FADD D7400 /Offset to highest useable address FSUB HGHLOC /Compute locations available LDX 11,1 /Load shift argument ALN 1 /Divide by 1000 FSTA MUNIT+1,0 /Store number of units STARTF FLDA TEN /Load MAX units+1 FSUB MUNIT /Subtract number of units FSTA MUNIT /Store new minimum unit FSUB THREE /Limit min. to three JGE SKCONT /Ok if greater than 2 FLDA THREE /Just in case we need to avoid FSTA MUNIT /field boundary problems SKCONT, STARTD SETX MAXCOR+1 XTA 0 /GET HIGHEST FIELD FDIV D10X /PUT IT INTO BITS 6-8 OF LO ORDER WORD SETX LHIFLD ATX 0 /LOAD HIGHEST FIELD INTO LHIFLD FADD DCDF /MAKE IT CDF HIFLD SETX FD1 ATX 0 /SET LOCATIONS USING IT SETX FD2 ATX 0 FADD ONED /MAKE IT CIF HIFLD SETX FI1 ATX 0 SETX #XR / CHECK TO MAKE SURE USER DID NOT DECLARE / DEVICE WITH HANDLER EXTERNAL TO THESE ROUTINES. FLDA SKIPJA /SET INSTRUCTION SO THIS CODE FSTA SKIP,0 / EXECUTES ONLY ONCE. / FLDA SXDSRN /INITIALIZE SETX INSTRUCTION FSTA SKCON2 LDX -11,6 /SET COUNTER (MAX # DSRN ENTRIES) SKCON2, SETX DSRN /STUFFED AND MODIFIED XTA 0 /GET NEXT HANDLER ENTRY POINT SETX #XR FSUB D5200 JLT SKCON3 /INTERNAL HANDLER, IT'S OK FSUB D2400 JGT SKCON3 /RESIDENT HANDLER (E.G. SYS:), IT'S OK TOO LDX 2,0 /***SOME OTHER HANDLER***USER ERROR 2 EXTERN #UE TRAP3 #UE /USER ILLEGALLY DECLARED A FILE! / SKCON3, FLDA NINED /INCREMENT TO NEXT DSRN ENTRY FADDM SKCON2 JXN SKCON2,6+ / SKIP2, STARTF /***END OF INITILIZATIN CODE*** LDX 1,7 FCLA /INITIALIZE SOME VARIABLES... FSTA PERFLG /NO PERIODS YET FSTA FILE-0003,7 FSTA FILE-0003,7+ FLDA #DSK /SETUP DEFAULT DEVICE FSTA DEV FLDA ONE /FIRST CHARACTER IS # 1 FSTA N FLDA% UNIT /CHECK FOR LEGAL UNIT # FSUB MUNIT JSA #LT / IF (UNIT.LT.MUNIT.OR.UNIT.GT.9) GO TO 900 FSTA #TMP+00 FLDA% UNIT FSUB NINE JSA #GT FADD #TMP+00 JNE #900 FLDA% FUNCT /CHECK FOR LEGAL FUNCTION CODE FSUB TWO EXTERN #LT JSA #LT / IF (FUNCT.LT.2.OR.FUNCT.GT.4) GO TO 901 FSTA #TMP+00 FLDA% FUNCT FSUB FOUR EXTERN #GT JSA #GT FADD #TMP+00 JNE #901 / / PUT DEV:FILE.EXT INTO CORRECT FORMAT FOR USR CALL / FLDA ONE FSTA I / DO 100 I=1,18 #G0002, JSR CGET / CALL CGET (NAME, I, X) JA .+10 NAME, JA . JA I JA X FLDA X / IF (X.NE.COLON) GO TO 40 FSUB COLON JNE #40 FLDA I /COLON MUST BE COLUMN 6 OR BEFORE FSUB SEVEN /7 JGE #DONE FLDA FILE /COLON DEFINES DEVICE NAME FSTA DEV FCLA FSTA FILE FLDA ONE FSTA N JA #100 #40, FLDA X / IF (X.NE.PERIOD) GO TO 60 FSUB PERIOD JNE #60 FLDA PERFLG /ONLY ONE PERIOD ALLOWED JNE #DONE FLDA SEVEN /SET TO DECODE EXTENSION FSTA PERFLG FSTA N JA #100 #60, FLDA X JEQ #100 /SKIP OVER NULL'S FSUB SPACE JEQ #100 /SKIP OVER SPACES JSR CPUT / CALL CPUT (FILE, N, X) JA .+10 JA FILE JA N JA X FLDA N / N=N+1 FADD ONE FSTA N #100, FLDA I / 100 CONTINUE FADD ONE FSTA I FSUB ATEEN JLE #G0002 #DONE, FLDA% FUNCT FSUB FOUR JNE #101 /FUNCTION = CLOSE ? EXTERN #ENDF FLDA% UNIT /YES - END FILE TRAP3 #ENDF #101, SETX FUNCTX /USR XR TO PASS PARAMETERS FLDA% FUNCT ATX 0 FLDA% UNIT ATX 1 TRAP4 #USRSE /TRAP TO THE USR CALLING ROUTINE XTA 2 /GET ERRNO AND RETURN IT FSTA% ERROR JA #RTN #900, FLDA THREE /ILLEGAL UNIT NUMBER!!! FSTA% ERROR JA #RTN #901, FLDA FOUR /ILLEGAL FUNCTION CODE!!! FSTA% ERROR JA #RTN / SKIPJA, JA SKIP2 DCDF, 0;CDF ONED, 0;1 D10X, 400;0 /0.1 D10, 0;10 SXDSRN, SETX DSRN NINED, 0;11 D5200, 0;5200 D2400, 0;2400 D7400, 0;7400 SECT8 #USRSE; 0 / /THIS ROUTINE SETS UP, ON PAGE 7400 OF THE HIGHEST FIELD, A /ROUTINE WHICH CALLS THE OS/8 USR (USER SERVICE ROUTINE). /IT IS NECESSARY TO DO THIS BECAUSE THE FORTRAN IV LOADER /MAY LOAD ANY ROUTINE IN THE RESERVED AREA FOR /THE OS/8 USR (10000 - 11777). / / THIS PROGRAM ALSO REQUIRES / THAT 'HKEY' BE THE LOCATION IN <FRTS> AS DEFINED / BELOW: HKEY=2761 DSRN=4244 /Address of DSRN table in FRTS / /IN CASE CLOSE FUNCTION, GET # BLOCKS WRITTEN / TAD UNITX CLL RTL /MULTIPLY BY 9 RAL TAD UNITX TAD K6 /OFFSET TO CURRENT BLOCK TAD LDSRN /START OF DSRN TABLE - 11 DCA TEMQ CDF 0 TAD% TEMQ DCA SB / /MOVE USR CALLING ROUTINE TO DEFINED LOCATION / I.E. PROTECT LOCS 10000-11777 / TAD K7400 /Target address DCA TEMQ /Store for indirect reference TAD #LUSR+1 /Origin address DCA TEMQ2 /Store for indirect reference TAD M200 /Number of words to move DCA TEMQ3 /Store in a counter TAD #LUSR /Load field word AND K7 /Strip it CLL RTL /Into right bits RAL TAD #CDF DCA .+1 /Store the CDF FUSR, HLT /Set field where USR loads TAD% TEMQ2 /Load routine location FD1, CDF 00 /Set HIGH field DCA% TEMQ /Store location in high field ISZ TEMQ /Bump the pointers ISZ TEMQ2 ISZ TEMQ3 /And the counters JMP FUSR /Loop on it /SET FIELDS AND CALL IT RIF /GET CURRENT FIELD TAD #CDF DCA .+1 HLT /Set this field FI1, CIF 00 /Set high field TAD FUNCTX /Load function number JMS% K7400 /Call routine SB, 0 /START BLOCK OF FILE OR LENGTH IF CLOSE NOBLKS, 0 /LENGTH OF FILE ENTPT, 0 /HANDLER ENTRY POINT DCA ERRUSR /SAVE ERROR RETURN VALUE /SETUP TO MOVE DSRN TABLE APPROPRIATELY TAD UNITX CLL RTL /MULTIPLY BY 9 RAL TAD UNITX TAD LDSRN DCA TEMQ #CDF, CDF 0 DCA% TEMQ /DISABLE FILE IN CASE CLOSE FUNCTION CLA CLL CMA RTL /-3 => AC TAD FUNCTX SMA SZA CLA /CLOSE? JMP USRSL5 /YES /MOVE HANDLER TO APROPRIATE BUFFER CLA CMA CLL RAL /-2 => AC TAD UNITX CLL RTR RTR /UNIT 9 => AC=7000; UNIT 8 => AC=6000 TAD M400 DCA LHNDR /LOCATION FOR THIS UNIT'S HANDLER TAD K5200 DCA TEMQ2 TAD M400 DCA TEMQ3 USRL4, CDF 0 TAD% TEMQ2 FD2, CDF 00 DCA% LHNDR ISZ TEMQ2 ISZ LHNDR ISZ TEMQ3 JMP USRL4 /BUILD UP NEW DSRN TABLE FOR THIS UNIT CDF 0 TAD ENTPT DCA% TEMQ /ENTRY POINT ISZ TEMQ CLL CML RTL /2 => AC (FORMS CONTROL BIT) TAD LHNDR TAD M400 TAD LHIFLD DCA% TEMQ /HANDLER CODE WORD TAD K7774 /*K* KLUDGE TO LET FRTS KNOW WHICH AND% TEMQ / HANDLER IS IN CORE DCA% #HKEY ISZ TEMQ TAD LHNDR TAD LHIFLD DCA% TEMQ /BUFFER ADDRESS & FIELD ISZ TEMQ TAD LHNDR DCA% TEMQ /CHARACTER POINTER ISZ TEMQ CMA CLL RTL /-3 => AC DCA% TEMQ /CHARACTER COUNTER ISZ TEMQ TAD SB DCA% TEMQ /START BLOCK ISZ TEMQ DCA% TEMQ /RELATIVE BLOCK ISZ TEMQ TAD NOBLKS DCA% TEMQ /LENGTH OF FILE ISZ TEMQ DCA% TEMQ /STATUS WORD USRSL5, CDF CIF 0 JMP% #USRSE K6, 6 K7400, 7400 M200, -200 M400, -400 K7, 7 K5200, 5200 LDSRN, DSRN-11 /START LOCATION OF DSRN TABLE LHIFLD, 0 TEMQ, 0 TEMQ2, 0 TEMQ3, 0 LHNDR, 0 FUNCTX, 0 /STUFFED BY RALF CODE UNITX, 0 /STUFFED BY RALF CODE ERRUSR, 0 /READ BY RALF CODE #LUSR, ADDR #USR #HKEY, HKEY /LOCATION OF HKEY IN FRTS / MUST AGREE WITH VERSION!! K7774, 7774 / ORG .+177&7600 /USR CALLING SUBROUTINE FOR FORTRAN / / THIS ROUTINE IS MOVED TO PAGE 7400 OF THE HIGHEST / FIELD BEFORE EXECUTING TO AVOID BEING OVERWRITTEN BY THE USR / ROUTINE. NO FILE SPECIFICATIONS OTHER THAN INTERNAL / HANDLERS AND SYSTEM DEVICES MAY BE MADE EXTERNAL TO THESE / ROUTINES BECAUSE THE USE OF THIS ROUTINE WILL OVERWRITE / THE HANDLERS WHICH ARE STORED IN HIGH CORE. / / #USR, 0 / / ENTER WITH FUNCTION CODE IN THE AC / 2 - LOOKUP (OPEN FOR INPUT) / 3 - ENTER (OPEN FOR OUTPUT) / 4 - CLOSE (CLOSE OUTPUT FILE) / / DEVICE AND FILE NAMES ARE STUFFED BY THE CALLING / PROGRAM BEFORE THIS SUBROUTINE IS CALLED. / / CALLING SEQUENCE: / JMS #USR / START BLOCK OF FILE (RETURNED FOR CODE 2 & 3) / # BLOCKS SUPPLIED IF CODE 4 / NUMBER OF BLOCKS IN FILE (RETURNED FOR CODE 2 & 3) / ENTRY POINT OF HANDLER AS READ INTO PAGE 5200 / <RETURN> / / AC ON EXIT CONTAINS ERROR CONDITION: / 0 - NO ERROR / 1 - ILLEGAL DEVICE / 2 - ILLEGAL FILE NAME / DCA FUNCTY /SAVE FUNCTION CODE TAD% #USR /GET # BLOCKS IN CASE CLOSE FUNCTION DCA #BLKS RDF /SET INSTRUCTION FIELD FOR RETURN TAD #CIF DCA EXIT4 CMA /MAKE IT CDF TAD EXIT4 DCA EXIT DCA ERRNO /INITIALIZE ERROR RETURN VARIABLE CMA TAD #CIF /-1 IN AC MAKES IT CDF RIF DCA .+1 HLT /SET DATA FIELD TO CURRENT FIELD / ********SWAP CORE FOR USR CALL /Note, that it would be much simpler to read in the field /one tables, and call USR at 17700. Let USR do the swapping. /We must only set the correct bits in the JSW. IOF #CIF, CIF 0 JMS% K7607 /CALL SYSTEM HANDLER 5210 / WRITE 17400-17777,10000-11777 7400 27 HLT /DEVICE ERROR CIF 0 JMS% K7607 /READ IN USR 610 0 13 /From block 13 HLT CIF 0 JMS% K7607 /READ IN FIELD ONE TABLES 210 7400 37 /From block 37 (where FRTS put it) HLT / ********PERFORM USR FUNCTIONS CIF 10 JMS% K200 /RESET tables, so it looks like no handlers 13 0 TAD K5201 /SET PAGE FOR HANDLER (allow 2 page handler) DCA ENTRY CIF 10 JMS% K200 /FETCH 1 DEV, 0 /(STUFFED BY RALF ROUTINE) DEVNO, 0 ENTRY, 5201 JMP ERR /ILLEGAL DEVICE TAD #LFILE /SET POINTER TO FILE TAD KOFSET DCA LFILE TAD DEVNO /GET DEVICE NUMBER CIF 10 JMS% K200 /PERFORM FUNCTION FUNCTY, 0 SB2, LFILE, 0 #BLKS, 0 JMP ERR2 /FILE ERROR / ********RESTORE CORE EXIT2, CIF 0 JMS% K7607 /SAVE FIELD ONE TABLES 4210 /? Is this really necessary? 7400 /Since they've already been saved? 37 /by FRTS HLT CIF 0 /USROUT function would do this JMS% K7607 /Read in the Stuff we saved 1210 7400 27 HLT ION /Is this necessary? EXIT, HLT TAD SB2 /RETURN SB & #BLKS DCA% #USR ISZ #USR TAD SB2 SZA CLA /NON-FILE STRUCTURED DEVICE? JMP .+3 CMA /YES - SET MAX NUMBER OF BLOCKS JMP .+3 TAD #BLKS CIA DCA% #USR ISZ #USR TAD ENTRY DCA% #USR ISZ #USR TAD ERRNO EXIT4, HLT JMP% #USR K7607, 7607 /SYSTEM HANDLER ENTRY POINT K200, 200 /USR ENTRY POINT K5201, 5201 /PAGE FOR HANDLER (& TWO PAGES AVAILABLE) ERR2, CLA IAC /ILLEGAL FILE NAME ERR, IAC /ILLEGAL DEVICE NAME DCA ERRNO JMP EXIT2 ERRNO, 0 #LFILE, AND FILE /LOCATION OF FILE ON PAGE 7400 /'AND' NEEDED TO TRICK ABSOLUTE REFERENCE /CHECK IN RALF. KOFSET, 7200 /OFFSET TO REAL EXECUTION ADDRESS FILE, 0;0;0;0;0;0;0;0;0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | SECT VOCAB EXTERN SIXOUT / SUBROUTINE VOCAB(ID1,ID2,INIT,V) / OS/8: SUBROUTINE VOCAB(ID, INIT, V) /C /C LOOK UP ID1:ID2 IN THE VOCABULARY (ATAB AND A2TAB) /C Note: A2TAB not used on the '8 /C AND RETURN ITS "DEFINITION" (KTAB), OR /C -1 IF NOT FOUND. IF INIT IS POSITIVE, THIS IS AN INIT CALL SETTING /C UP A KEYWORD VARIABLE, AND NOT FINDING IT CONSTITUTES A BUG. IT ALSO MEANS /C THAT ONLY KTAB VALUES WHICH TAKEN OVER 1000 EQUAL INIT MAY BE CONSIDERED. /C (THUS "STEPS", WHICH IS A MOTION VERB AS WELL AS AN OBJECT, MAY BE LOCATED /C AS AN OBJECT.) AND IT ALSO MEANS THE KTAB VALUE IS TAKEN MOD 1000. /C / IMPLICIT INTEGER (A-Z) / COMMON /VOCCOM/ KTAB,ATAB,A2TAB,TABSIZ / DIMENSION KTAB(300),ATAB(300),A2TAB(300) EXTERN BUG EXTERN MOD JA #ST #XR, ORG .+10 TEXT +VOCAB+ #RET, SETX #XR SETB #BASE JA .+3 #BASE, ORG .+3 ID, ORG .+3 INIT, ORG .+3 ONE, F 1.0 FOUR, F 4.0 THOUS, F 1000.0 TWO, F 2.0 SIX, F 6.0 ORG #BASE+30 FNOP JA #RET FNOP #GOBAK, 0;0 #VAL, ORG .+6 ZERO, F 0.0 I, ORG .+3 KTABI, ORG .+3 K21, F 21.0 K5, F 5.0 #LBL=. COMMON VOCCOM KTAB, ORG .+1604 ATAB, ORG .+1604 TABSIZ, ORG .+3 ORG #LBL #RTN, BASE #BASE FLDA #VAL JA #GOBAK #ST, STARTD 0210 FSTA #GOBAK,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA ID FLDA% #BASE,1+ FSTA INIT STARTF FLDA% INIT FSTA INIT FLDA% ID FSTA ID / DO 1 I=1,TABSIZ FLDA ONE FSTA I / IF(KTAB(I).EQ.-1)GOTO 2 #G0001, FLDA I ATX 7 FLDA KTAB-3,7 FSTA KTABI FADD ONE JEQ #2 / IF(INIT.GE.0.AND.KTAB(I)/1000.NE.INIT)GOTO 1 FLDA INIT JLT #M1 FLDA KTABI FDIV THOUS EXTERN #FIX JSA #FIX FSUB INIT JNE #1 / IF(ATAB(I).EQ.ID1 .AND. A2TAB(I).EQ.ID2)GOTO 3 / OS/8: IF(ATAB(I).EQ.ID)GOTO 3 #M1, FLDA ATAB-0003,7 FSUB ID JEQ #3 /1 CONTINUE / do loop end #1, FLDA I FADD ONE FSTA I FSUB TABSIZ JLE #G0001 / CALL BUG(21) JSR BUG JA .+0004 JA K21 /2 V=-1 #2, FLDA ONE FNEG FSTA #VAL / IF(INIT.LT.0)RETURN FLDA INIT JLT #RTN / TYPE 100,ID #G0002, JSR SIXOUT JA .+10 JA #100 JA ZERO JA TWO JSR SIXOUT JA .+10 JA ID JA TWO JA ONE / CALL BUG(5) JSR BUG JA .+0004 JA K5 /3 V=KTAB(I) #3, FLDA KTABI FSTA #VAL / IF(INIT.GE.0)V=MOD(V,1000) FLDA INIT JLT #RTN JSR MOD JA .+0006 JA #VAL JA THOUS FSTA #VAL / RETURN / END JA #RTN /100 FORMAT(' KEYWORD = ',2A2) / OS/8: ,A4 #100, TEXT 'K]EYWORD = @' END |
> > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | LOGICAL FUNCTION YES(X,Y,Z) C C PRINT MESSAGE X, WAIT FOR YES/NO ANSWER. IF YES, PRINT Y AND LEAVE YEA C TRUE; IF NO, PRINT Z AND LEAVE YEA FALSE. SPK IS EITHER RSPEAK OR MSPEAK. C INTEGER REPLY,X,Y,Z C 1 IF(X.NE.0)CALL RSPEAK(X) CALL GETIN(REPLY,JUNK1,JUNK2,JUNK3) IF(REPLY.EQ.'YES'.OR.REPLY.EQ.'YE'.OR.REPLY.EQ.'Y')GOTO 10 IF(REPLY.EQ.'NO' .OR. REPLY.EQ.'N')GOTO 20 C WRITE(4,9) C9 FORMAT(/' PLEASE ANSWER THE QUESTION.') CALL SIXOUT('P]LEASE ANSWER THE QUESTION.',15,0) GOTO 1 10 YES=. TRUE. IF(Y.NE.0)CALL RSPEAK(Y) RETURN 20 YES=.FALSE. IF(Z.NE.0)CALL RSPEAK(Z) RETURN END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | 50 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 100 RANDOMIZE 120 PRINT "YOU ARE NOW GOING TO PLAY A COMPUTERIZED VERSION OF BINGO--" 180 LET F=1 185 V=0\W=0 190 DIM B(10,10) 200 DIM L(75) 210 A$(1)="B"\A$(2)="I"\A$(3)="N"\A$(4)="G"\A$(5)="O" 235 REM THIS SEQUENCE GENERATES THE CARD NUMBERS (LINES 240-430) 240 FOR K1=1 TO 75 250 LET L(K1)=0 260 NEXT K1 270 PRINT " "," HERE'S "; 280 IF F>1 THEN 310 290 PRINT "YOUR CARD" 300 GOTO 320 310 PRINT "MY CARD" 320 LET M=16 330 LET G=F+4 340 FOR Y=F TO G 350 FOR X=F TO G 360 LET R=INT(M*RND(0)) 370 IF R<M-15 THEN 360 380 IF L(R)<>0 THEN 360 390 LET B(X,Y)=R 400 LET L(R)=1 410 NEXT X 420 LET M=M+15 430 NEXT Y 435 REM THIS SEQUENCE PRINTS THE CARD (LINES 440-670) 440 PRINT 450 PRINT"--B--","--I--","--N--","--G--","--O--" 460 FOR X=F TO G 470 PRINT 480 PRINT 490 PRINT 500 FOR Y=F TO G 510 IF B(X,Y)=B(F+2,F+2) THEN 540 520 PRINT B(X,Y), 530 GOTO 550 540 PRINT "FREE", 550 NEXT Y 560 NEXT X 570 PRINT 580 PRINT 590 PRINT 600 PRINT"---------------------------------------------------------------" 610 PRINT" (TEAR OFF AFTER MACHINE AUTOMATICALLY ADVANCES PAPER)" 620 FOR K9=1 TO 9 630 PRINT 640 NEXT K9 650 IF F=6 THEN 680 660 LET F=6 670 GOTO 240 680 PRINT 690 PRINT"NOW WE'RE ALL SET TO PLAY THE GAME. USE A PENCIL TO MARK OFF" 700 PRINT"THE NUMBERS ON YOUR CARD AS THEY ARE CALLED." 710 PRINT" (PLEASE PLAY MY CARD AS WELL AS YOUR OWN)" 720 PRINT"***DON'T GET SMART. I'LL BE PLAYING BOTH YOUR CARD AND MINE" 730 PRINT" UP HERE IN BOSTON. (SO THERE--)" 740 PRINT 750 PRINT"ARE YOU READY"; 760 INPUT R$ 770 IF R$<>"NO" THEN 820 780 PRINT 790 PRINT"*********:HURRY UP:*********" 800 GOTO 740 810 REM 820 FOR K1=1 TO 75 830 LET L(K1)=0 840 NEXT K1 850 PRINT 860 LET B(3,3)=0 870 LET B(8,8)=0 875 REM THIS SEQUENCE GENERATES THE BINGO NUMBERS (LINES 880-1100) 880 LET U=INT(75*RND(0))+1 910 IF L(U)<>0 THEN 880 920 LET L(U)=1 930 PRINT 949 IF RND(0) > .5 THEN 970 950 PRINT"THE NUMBER COMES UP:", 960 GOTO 980 970 PRINT "THE NEXT ONE IS:", 980 PRINT A$(INT((U-1)/15)+1);U 1105 REM THIS IS THE "NUMBER ON CARD?" SEQUENCE (LINES 1110-1260) 1110 FOR Y=1 TO 10 1120 FOR X=1 TO 10 1130 IF B(X,Y)=U THEN 1250 1140 NEXT X 1150 NEXT Y 1160 LET F=1 1170 GOSUB 1270 1180 LET F=6 1190 GOSUB 1270 1200 IF V=0 THEN 1230 1210 IF W=1 THEN 1980 1220 GOTO 2050 1230 IF W=0 THEN 880 1240 GOTO 2120 1250 LET B(X,Y)=0 1260 GOTO 1140 1265 REM THIS IS THE BINGO DETERMINING SEQUENCE (LINES 1270-1950) 1267 REM THIS IS THE VERTICAL CHECK FOR BINGO*** (LINES 1270-1430) 1270 LET G=F+4 1280 FOR Y=F TO G 1290 FOR X=F TO G 1300 IF B(X,Y)<>0 THEN 1430 1310 IF X<F+4 THEN 1420 1320 IF F=6 THEN 1370 1330 PRINT 1340 PRINT"YOU'VE GOT A B I N G O * * *" 1350 LET W=1 1360 RETURN 1370 PRINT 1380 PRINT"I'VE GOT A B I N G O * * * * *" 1390 LET V=1 1410 GOTO 1360 1420 NEXT X 1430 NEXT Y 1440 REM THIS IS THE HORIZONTAL CHECK FOR BINGO*** (LINES 1450-1610) 1450 LET G=F+4 1460 FOR X=F TO G 1470 FOR Y=F TO G 1480 IF B(X,Y)<>0 THEN 1610 1490 IF Y<F+4 THEN 1600 1500 IF F=6 THEN 1550 1510 PRINT 1520 PRINT"YOU'VE GOT A B I N G O * * *" 1530 LET W=1 1540 RETURN 1550 PRINT 1560 PRINT"I'VE GOT A B I N G O * * * * *" 1570 LET V=1 1590 GOTO 1540 1600 NEXT Y 1610 NEXT X 1615 REM THIS IS THE SLANT CHECK (M=-1) FOR BINGO*** (LINES 1620-1700) 1620 LET X=F 1630 LET Y=F 1640 IF B(X,Y)<>0 THEN 1780 1650 LET X=X+1 1660 LET Y=Y+1 1670 IF Y<F+5 THEN 1640 1680 IF Y=11 THEN 1740 1690 LET W=1 1700 PRINT 1710 PRINT"YOU'VE GOT A B I N G O * * *" 1730 RETURN 1740 PRINT"I'VE GOT A B I N G O * * * * *" 1750 LET V=1 1770 RETURN 1775 REM THIS IS THE SLANT CHECK (M=1) FOR BINGO*** (LINES 1780-1950) 1780 LET X=F+4 1790 Y=F 1800 IF B(X,Y)<>0 THEN 1950 1810 LET X=X-1 1820 LET Y=Y+1 1830 IF Y<F+5 THEN 1800 1840 IF Y=11 THEN 1900 1850 PRINT 1860 PRINT"YOU'VE GOT A B I N G O * * *" 1870 LET W=1 1890 RETURN 1900 PRINT 1910 PRINT"I'VE GOT A B I N G O * * * * *" 1920 LET V=1 1950 RETURN 1970 REM THIS IS THE TIE POINTOUT SEQUENCE 1980 PRINT 1990 PRINT" *********** IT'S A TIE ***********" 1995 REM THIS IS THE "PLAY AGAIN?" SEQUENCE 2000 PRINT 2010 PRINT "DO YOU WANT TO PLAY AGAIN"; 2020 INPUT E$ 2025 PRINT 2030 IF E$="YES" THEN 180 2040 STOP 2045 REM THIS IS THE "I WIN" SEQUENCE 2050 PRINT 2060 FOR S=1 TO 6 2070 PRINT"I WIN. "; 2080 NEXT S 2090 PRINT 2100 PRINT 2110 GOTO 2000 2115 REM THIS IS THE "YOU WIN" SEQUENCE 2120 PRINT 2130 PRINT" YOU WIN..... YOU WIN....... YOU WIN......." 2140 GOTO 2000 2145 REM THIS IS THE "END" OF THE LIST OF PROGRAM ENTITLED "BINGO" 2150 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 | 5 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ....DEC 10 PRINT "DO YOU WANT INSTRUCTIONS (IF SO TYPE A 1)"; 15 INPUT K 25 IF K<>1 THEN 85 30 PRINT 35 PRINT 40 PRINT 45 PRINT 50 PRINT"THIS IS A GAME OF BLACKJACK, LAS VEGAS STYLE." 55 PRINT"HERE ARE THE RULES OF THE HOUSE. THE DEALER" 60 PRINT"MUST HIT ON 16 OR LESS AND WILL STAY ON 17 OR" 65 PRINT"MORE. YOU MAY SPLIT TWO CARDS IF THEY ARE THE" 70 PRINT"SAME AND PLAY ONE HAND WITH EACH OF THEM. ALSO," 75 PRINT"YOU MAY DOUBLE YOUR BET AND RECEIVE EXACTLY ONE " 80 PRINT"MORE CARD ANY TIME ON YOUR FIRST HIT. THE TYPING" 85 PRINT"INSTRUCTIONS ARE: 0-NO HIT; 1-HIT; 2-DOUBLE; AND" 90 PRINT "3-SPLIT A PAIR." 95 IF K<> 1 THEN 155 100 PRINT"WHEN THE DEALER HAS AN EXPOSED ACE HE WILL ASK" 105 PRINT"YOU FOR AN INSURANCE BET. AN INSURANCE BET WILL" 110 PRINT"RISK HALF YOUR BET FOR AN AMOUNT EQUAL TO YOUR BET" 115 PRINT"IF YOU WIN. YOU WIN IF THE DEALER HAS A BLACKJACK" 120 PRINT"AND LOSE IF HE DOESN'T. THE HOUSE LIMIT IS $500.00" 125 PRINT"GOOD LUCK. OH, BY THE WAY, THE DEALER IS NOTED FOR" 130 PRINT"DEALING OFF THE BOTTOM OF THE DECK. WATCH HIM VERY" 135 PRINT"CLOSELY. HERE HE IS NOW." 140 PRINT 145 PRINT 150 PRINT 155 LET K=0 160 LET W1=0 165 RANDOMIZE 170 LET N=INT(1945*RND(0)+1) 175 PRINT 180 PRINT"ANY TIME YOU WANT ME TO RESHUFFLE THE CARDS SIMPLY" 185 PRINT"TYPE 7777 WHEN I ASK FOR YOUR WAGER AND I'LL BE VERY" 190 PRINT"HAPPY TO OBLIGE. O.K., HERE IS THE FIRST HAND." 200 LET X=INT(10*RND(0)) 210 DIM D(52),E(5),V(5),T(5),W(5) 215 FOR A=1 TO 52 220 LET D(A)=0 225 NEXT A 230 DIM Q(52) 235 FOR A=0 TO 39 STEP 13 240 FOR C=1 TO 13 245 LET Q(A+C)=C 250 NEXT C 255 NEXT A 260 PRINT 265 LET K=K+1 270 FOR P=1 TO 5 275 LET E(P)=0 280 LET V(P)=0 285 LET T(P)=0 290 NEXT P 295 LET V(3)=1 300 PRINT 305 PRINT 310 PRINT 315 PRINT"WAGER"; 320 LET P=1 325 INPUT W 330 LET W(2)=W 335 IF W<=0 THEN 1685 340 IF W<=500 THEN 370 345 IF W<>7777 THEN 360 350 GOSUB 1645 355 GOTO315 360 PRINT"THAT'S TOO MUCH - HOUSE LIMIT IS $500" 365 GOTO 315 370 PRINT 375 PRINT "I SHOW", 380 GOSUB 865 385 IF E(1)=0 THEN 395 390 LET V(4)=1 395 LET V(5)=1 400 GOSUB 865 405 LET M=X 410 LET P=2 415 PRINT"FIRST CARD IS", 420 GOSUB 865 425 LET G=X 430 PRINT"NEXT CARD IS", 435 GOSUB 865 440 IF V(2)>0 THEN 605 445 LET S=X 450 IF V(3)<>1 THEN 605 455 IF T(P)<>21 THEN 505 460 PRINT " ***BLACKJACK*** " 465 PRINT 470 PRINT" THAT'S GETTING A BIT RIDICULOUS::::" 475 PRINT 480 PRINT "MY HOLE CARD WAS ", 485 LET X=M 490 GOSUB 1035 495 LET W1=W1+1.5*W 500 GOSUB 1335 505 IF V(4)=0 THEN 570 510 PRINT"INSURANCE ANYONE (TYPE 1 OR 0, 1 MEANS YES)"; 515 INPUT I 520 PRINT 525 IF I=0 THEN 570 530 IF T(1)<>21 THEN 555 535 LET W1=W1+W 540 PRINT 545 PRINT "YOU WIN $";W;"ON YOUR INSURANCE BET" 550 GOTO 570 555 LET W1=W1-W/2 560 PRINT 565 PRINT"YOU LOST $";W/2;"ON YOUR INSURANCE BET - I DON'T HAVE BLACKJACK" 570 IF T(1)<>21 THEN 605 575 PRINT 580 PRINT"**I HAVE BLACKJACK**" 585 PRINT "MY HOLE CARD WAS ", 590 LET X=M 595 GOSUB 1035 600 GOTO 1300 605 IF T(P)<=21 THEN 650 610 IF E(P)>0 THEN 640 615 PRINT"YOU BUSTED, "; 620 PRINT"YOUR TOTAL IS";T(P) 625 LET C1=T(P)-5*(INT(T(P)/5)) 630 IF V(2)=1 THEN 775 635 GOTO 1175 640 LET E(P)=E(P)-1 645 LET T(P)=T(P)-10 650 IF V(1)=2 THEN 620 655 LET V(3)=V(3)+1 660 PRINT"HIT "; 665 INPUT V(1) 670 IF V(1)<>3 THEN 830 675 IF V(2)>0 THEN 820 680 IF V(3)<>2 THEN 820 685 IF Q(G)=Q(S) THEN 700 690 PRINT"NOW IS THAT A PAIR?" 695 GOTO 660 700 LET V(2)=1 705 IF Q(G)<>1 THEN 715 710 LET V(1)=2 715 LET P=3 720 PRINT" PLAY HAND ONE NOW" 725 PRINT"FIRST CARD IS ", 730 LET W(3)=W 735 LET X=G 740 GOSUB 750 745 GOTO 430 750 GOSUB 990 755 GOSUB 1035 760 LET V(3)=1 765 LET T(P)=C 770 RETURN 775 LET P=2 780 LET V(2)=2 785 PRINT" PLAY HAND TWO NOW" 790 PRINT"FIRST CARD IS", 795 LET X=S 800 GOSUB 750 805 IF Q(G)=1 THEN 815 810 LET V(1)=0 815 GOTO 430 820 PRINT"NO SPLITS NOW -- TRY AGAIN" 825 GOTO 660 830 IF V(1)<>2 THEN 855 835 IF V(3)=2 THEN 850 840 PRINT"TOO LATE TO DOUBLE, CHARLIE." 845 GOTO 660 850 LET W(P)=2*W(P) 855 IF V(1)>0 THEN 430 860 GOTO 620 865 GOSUB 900 870 LET T(P)=T(P)+C 875 IF V(5)=0 THEN 890 880 LET V(5)=0 885 RETURN 890 GOSUB 1035 895 RETURN 900 IF R>=50 THEN 945 905 LET N=10*(1+ABS(COS(N+W1))) 910 FOR A=1 TO N 915 LET X=INT(52.999999*RND(Y)) 920 IF X=0 THEN 915 925 NEXT A 930 IF D(X)=0 THEN 980 935 LET R=R+1 940 IF R<50 THEN 900 945 FOR A=1 TO 52 950 IF D(A)=K THEN 960 955 LET D(A)=0 960 NEXT A 965 LET R=0 970 PRINT" I RESHUFFLED "; 975 GOTO 900 980 LET R=0 985 LET D(X)=K 990 IF Q(X)<>1 THEN 1010 995 LET C=11 1000 LET E(P)=E(P)+1 1005 RETURN 1010 IF Q(X)>10 THEN 1025 1015 LET C=Q(X) 1020 RETURN 1025 LET C=10 1030 RETURN 1035 GOSUB 1050 1040 GOSUB 1120 1045 RETURN 1050 IF Q(X)<>1 THEN 1065 1055 PRINT" ACE "; 1060 RETURN 1065 IF Q(X)>10 THEN 1080 1070 PRINT Q(X);" "; 1075 RETURN 1080 IF Q(X)>11 THEN 1095 1085 PRINT " JACK "; 1090 RETURN 1095 IF Q(X)>12 THEN 1110 1100 PRINT" QUEEN "; 1105 RETURN 1110 PRINT" KING "; 1115 RETURN 1120 IF X>39 THEN 1145 1125 IF X>26 THEN 1155 1130 IF X>13 THEN 1165 1135 PRINT"OF SPADES" 1140 RETURN 1145 PRINT"OF CLUBS" 1150 RETURN 1155 PRINT"OF HEARTS" 1160 RETURN 1165 PRINT"OF DIAMONDS" 1170 RETURN 1175 LET P=2 1180 PRINT "MY HOLE CARD WAS ", 1185 LET X=M 1190 GOSUB 1035 1195 IF T(2)<22 THEN 1210 1200 IF V(2)=0 THEN 1300 1205 IF T(3)>21 THEN 1300 1210 LET P=1 1215 IF T(1)<17 THEN 1360 1220 IF T(1)>17 THEN 1230 1225 IF E(1)>0 THEN 1360 1230 IF T(1)>21 THEN 1375 1235 LET P=2 1240 PRINT"MY TOTAL IS";T(1) 1245 IF T(P)>21 THEN 1300 1250 IF T(1)>21 THEN 1265 1255 IF T(1)>T(P) THEN 1300 1260 IF T(1)=T(P) THEN 1330 1265 LET W1=W1+W(P) 1270 IF C1>3 THEN 1445 1275 IF C1>2 THEN 1465 1280 IF C1>1 THEN 1485 1285 IF C1>0 THEN 1505 1290 GOTO 1525 1295 GOTO 1330 1300 LET W1=W1-W(P) 1305 IF C1>3 THEN 1545 1310 IF C1>2 THEN 1565 1315 IF C1>1 THEN 1585 1320 IF C1>0 THEN 1605 1325 GOTO 1625 1330 IF V(2)>0 THEN 1345 1335 GOSUB 1405 1340 GOTO 265 1345 LET P=3 1350 LET V(2)=0 1355 GOTO 1245 1360 PRINT "I DRAW", 1365 GOSUB 865 1370 GOTO 1210 1375 IF E(1)=0 THEN 1395 1380 LET E(1)=E(1)-1 1385 LET T(1)=T(1)-10 1390 GOTO 1210 1395 PRINT"I BUSTED*****" 1400 GOTO 1235 1405 IF W1<0 THEN 1425 1410 IF W1=0 THEN 1435 1415 PRINT"YOU'RE AHEAD $";W1 1420 RETURN 1425 PRINT"YOU'RE BEHIND $";ABS(W1) 1430 RETURN 1435 PRINT"YOU'RE EVEN" 1440 RETURN 1445 PRINT 1450 PRINT"I MUST HAVE DEALT WRONG." 1455 PRINT 1460 GOTO 1330 1465 PRINT 1470 PRINT"YOU LUCKED OUT AGAIN:" 1475 PRINT 1480 GOTO 1330 1485 PRINT 1490 PRINT"YOU MUST HAVE BEEN PEEKING." 1495 PRINT 1500 GOTO 1330 1505 PRINT 1510 PRINT"I COULD LOSE MY JOB THIS WAY." 1515 PRINT 1520 GOTO 1330 1525 PRINT 1530 PRINT"THE CARDS HAVE TURNED AGAINST ME:" 1535 PRINT 1540 GOTO 1330 1545 PRINT 1550 PRINT"THE BOTTOM OF THE DECK STRIKES AGAIN:" 1555 PRINT 1560 GOTO 1330 1565 PRINT 1570 PRINT"A VICTORY FOR US GOOD GUYS." 1575 PRINT 1580 GOTO 1330 1585 PRINT 1590 PRINT"YOU CAN'T BEAT SKILL." 1595 PRINT 1600 GOTO 1330 1605 PRINT 1610 PRINT"YOU CAN'T WIN 'EM ALL." 1615 PRINT 1620 GOTO 1330 1625 PRINT 1630 PRINT"BABY GETS A NEW PAIR OF SHOES:" 1635 PRINT 1640 GOTO 1330 1645 FOR M9 = 1 TO 52 1650 LET D(M9)=0 1655 NEXT M9 1660 LET R=0 1665 PRINT 1670 PRINT" I RESHUFFLED" 1675 PRINT"" 1680 RETURN 1685 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | 4 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 5 PRINT "WELCOME TO DIGITAL EDUSYSTEM COMPUTER BLACKJACK!!" 6 PRINT\PRINT "YOUR DEALER TONIGHT IS PETEY P. EIGHT." 7 PRINT "WATCH HIM CLOSELY.... HE HAS A REPUTATION FOR" 8PRINT "DEALING OFF THE BOTTOM OF THE DECK."\PRINT 9 RANDOMIZE 10 DIM A(13) 20 PRINT "QUESTIONS REQUIRING A YES OR NO ANSWER" 25 PRINT "SHOULD BE ANSWERED WITH A 'Y' FOR YES, 'N' FOR NO."\PRINT 30 PRINT "DON'T START PLAYING WITH LESS THAN $100.. HAVE FUN!"\PRINT 40 PRINT "HOW MANY DOLLARS ARE YOU STARTING WITH"; 41 INPUT F 42 PRINT 43 F1=F 50 PRINT "WHAT IS YOUR WAGER THIS TIME"; 51 INPUT W 52 PRINT 53 IF W>F GOTO 56 54 IF W<10 GOTO 58 55 GOTO 100 56 PRINT "YOUR BET EXCEEDS YOUR REMAINING DOLLARS." 57 GOTO 50 58 PRINT "MINIMUM WAGER IS $10." 59 GOTO 50 100 GOSUB 780 102 P1=I 104 PRINT "YOUR FIRST CARD IS ";CHR$(L) 106 GOSUB 780 110 P2=I 112 PRINT "YOUR SECOND CARD IS ";CHR$(L) 115 GOTO 200 117 PRINT "YOU HAVE ";P3;" SHOWING." 119 GOSUB 760 120 P3=P3+I 122 PRINT "YOU GOT A ";CHR$(L) 123 IF P3>21 GOTO 820 124 GOTO 117 200 GOSUB 780 201 P3=P1+P2 202 D1=I 204 GOSUB 780 206 D2=I 208 PRINT "DEALER SHOWS A ";;CHR$(L) 210 GOTO 117 212 D3=D1+D2 214 PRINT "DEALER HAS ";D3 216 IF D3>16 GOTO 222 217 GOSUB 780 218 PRINT "DEALER GETS A ";;CHR$(L) 219 D3=D3+I 220 GOTO 214 222 IF D3<22 GOTO 800 224 PRINT "DEALER BUSTED." 226 GOTO 802 760 PRINT "DO YOU WANT A HIT?"; 762 INPUT K$ 764 PRINT 766 IF K$="N" GOTO 212 768 GOSUB 780 770 RETURN 780 I=INT(13*RND(0)+1) 782 A(I)=A(I)+1 784 IF A(I)>4 GOTO 780 786 GOSUB 900 788 RETURN 800 IF D3>=P3 GOTO 820 802 F=F+W 806 PRINT "YOU WIN. YOU NOW HAVE $";F 808 GOTO 980 820 F=F-W 822 PRINT "YOU LOSE. YOU NOW HAVE $";F 824 GOTO 980 900 IF I<>1 GOTO 910 904 I=11 906 L=1 908 GOTO 942 910 IF I<>13 GOTO 920 912 I=10 914 L=11 916 GOTO 942 920 IF I<>12 GOTO 930 922 I=10 924 L=17 926 GOTO 942 930 IF I<>11 GOTO 937 932 I=10 934 L=10 936 GOTO 942 937 IF I<>10 GOTO 940 938 L=20 939 GOTO 942 940 L=I+48 942 RETURN 980 PRINT "DO YOU WISH TO PLAY AGAIN?"; 982 INPUT K$ 984 PRINT\PRINT 986 IF K$="Y" GOTO 50 987 PRINT\PRINT\PRINT \IF F>F1 THEN 995 988 PRINT "TOO BAD! YOU LOST";F1-F;"DOLLARS AT THE EDUSYSTEM CASINO." 990 GOTO 998 995 PRINT "NOT BAD! YOU WON";F-F1;"DOLLARS AT THE EDUSYSTEM CASINO." 998 PRINT\PRINT "HOPE YOU ENJOYED YOURSELF. THANKS FOR PLAYING." 999 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 5 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 10 PRINT" UN" 20 PRINT"BUN BUNNYB" 30 PRINT"BUNNYB NYBUNNYBUN" 40 PRINT"BUNNYBUN UNNYBUNNYBUN" 50 PRINT" UNNYBUNNY NNYBUNNYBUNNYB" 60 PRINT" NNYBUNNYBU UNNYBUNNYBUNNYB" 70 PRINT" NYBUNNYBUNN YBUNNYBUNNYBUNNY" 80 PRINT" YBUNNYBUNNY NNYBUNNYBUNNYBUNN" 90 PRINT" BUNNYBUNNYB UNNYBUNNYBUNNYBUN" 100PRINT" UNNYBUNNYBU BUNNYBUNNYBUNNYB" 110PRINT" NNYBUNNYBUN YBUNNYBUNNYBUNNY" 120PRINT" NYBUNNYBUNNY NYBUNNYBUNNYBUNN" 130PRINT" YBUNNYBUNNYB NNYBUNNYBUNNYBU" 140PRINT" BUNNYBUNNYBU UNNYBUNNYBUNNYB" 150PRINT" UNNYBUNNYBUN BUNNYBUNNYBUNN" 160PRINT" NNYBUNNYBUN YBUNNYBUNNYBU" 170PRINT" NYBUNNYBUNNYBUNNYBUNNY" 180PRINT" YBUNNYBUNNYBUNNYBUNN" 190PRINT" BUNNYBUNNYBUNNYBU" 200PRINT" NNYBUNNYBUNNY" 210PRINT" NYBUNNYBUN" 220PRINT" YBUNNYBU" 230PRINT" UNNYBUNNYBUNN" 240PRINT" NYBUNNYBUNNYBUNNYB" 250PRINT" UNNYBUNNYBUNNYBUNNYBU" 260PRINT" BUNNYBUNNYBUNNYBUNNYBUN" 270PRINT" NYBUNNYBUNNYBUNNYBUNNYBUNN" 280PRINT" NNYBUNNYBUNNYBUNNYBUNNYBUNNY" 290PRINT" UNNYBUNN UNNYBUNNYBUNNYBUNNY" 300PRINT" BUNNYBUN UNNYBUNNYBUNNYBUNNYB" 310PRINT" YBUNNYBUN UNNYBUNNYBUNNYBUNNYB" 320PRINT" NYBUNNYBUN BUNNYBUNNYBUNNYBUNNYB" 330PRINT" NNYBUNNYBUNNYBUNNYBUNNYBUNNYBUNNYB" 340PRINT" UNNYBUNNYBUNNYBUNNYBUNNYBUNNYBUNNYB" 350PRINT" NNYBUNNYBUNNYBUNNYBUNNYBUNNYBUNNY" 360PRINT" NYBUNNYBUNNYBUNNYBUNNYBUNNYBUNNY" 370PRINT" YBUNNYBUNNYBUNNYBUNNYBUNNYBUNN" 380PRINT" UNNYBUNNYBUNNYBUNNYBUNNYBUNN" 390PRINT" BUNNYBUNNYBUNNYBUNNYBUN Y" 400PRINT" YBUN YBUNNYB NYBU B" 410PRINT" BUNNY NYBUNNYB U" 420PRINT" YBUNN U YBUNNYB N" 430PRINT" NYBUNN NYBUNNY NYBUNN" 440PRINT" NNYBUNNYBUNNYBUNNY UNN" 450PRINT" UNN N Y N YBUNNYBU" 460PRINT" BU NN N Y Y" 470PRINT" NN UNNY" 480PRINT" NNY" 490PRINT" NY" 500 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | 50 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 100 REM VALUES FOR 1974: SEE NOTES 110 REM 115 DIM M(12) 120 FOR I=1 TO 6\PRINT\NEXT I 125 REM 1974 STARTS ON TUESDAY.(0=SUN.,-1=MON.,-2=TUE...) 130 D=-2 140 S=0 150 REM: READ DAYS OF EACH MONTH 160 FOR N=0 TO 12 \ READ M(N) \ NEXT N 170 REM ***************************** 180 FOR N=1 TO 12 190 PRINT \ PRINT \ S=S+M(N-1) 200 PRINT "**";S;TAB(7); 210 FOR I=1 TO 18 \ PRINT "*"; \ NEXT I 220 IF N=2 GOTO 240\IF N=3 GOTO 250\IF N=4 GOTO 260 221 IF N=5 GOTO 270\IF N=6 GOTO 280\IF N=7 GOTO 290 222 IF N=8 GOTO 300\ IF N=9 GOTO 310\ IF N=10 GOTO 320 223 IF N=11 GOTO 330\ IF N=12 GOTO 340 230 PRINT " JANUARY "; \GOTO 350 240 PRINT " FEBRUARY"; \GOTO 350 250 PRINT " MARCH "; \GOTO 350 260 PRINT " APRIL "; \GOTO 350 270 PRINT " MAY "; \GOTO 350 280 PRINT " JUNE "; \GOTO 350 290 PRINT " JULY "; \GOTO 350 300 PRINT " AUGUST "; \GOTO 350 310 PRINT "SEPTEMBER"; \GOTO 350 320 PRINT " OCTOBER "; \GOTO 350 330 PRINT " NOVEMBER"; \GOTO 350 340 PRINT " DECEMBER"; 350 FOR I=1 TO 18 \ PRINT "*"; \ NEXT I 360 PRINT 365-S;"**"; 370 REM (366-S; ON LEAP YEARS) 380 PRINT\PRINT\PRINT " S M T W"; 390 PRINT " T F S" 400 PRINT 410 FOR I=1 TO 59 \ PRINT "*"; \ NEXT I 420 REM ********************************* 430 FOR W=1 TO 6 440 PRINT\PRINT 450 PRINT TAB(4); 460 REM ********************************* 470 FOR G=1 TO 7 480 D=D+1 490 D2=D-S 500 IF D2>M(N) THEN 580 510 IF D2=<0 GOTO 520\PRINT D2; 520 PRINT TAB(4+8*G); 530 NEXT G 540 REM ********************************* 550 IF D2=M(N) THEN 590 560 NEXT W 570 REM ********************************* 580 D=D-G 590 NEXT N 600 REM ********************************* 610 FOR I=1 TO 6\PRINT\NEXT I 620 DATA 0,31,28,31,30,31,30,31,31,30,31,30,31 630 REM (0,31,29, ..., ON LEAP YEARS) 640 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | 50 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 100 PRINT" THIS PROGRAM WILL PLAY CHECKERS. THE COMPUTER IS X," 200 PRINT"AND YOU ARE O. THE COMPUTER WILL GO FIRST,-NOTE: SQUARES" 300 PRINT"ARE IN THE FORM-(X,Y) AND SQ. 1,1 IS THE BOTTOM LEFT!" 400 PRINT"DO NOT ATTEMPT A DOUBLE JUMP OR YOUR PIECE MIGHT JUST " 500 PRINT"DISAPPEAR(SAME FOR A TRIPLE!)" 600 PRINT" WAIT FOR THE COMP. TO MOVE!!!!!" 700 LET G=-1 800 DIM R(50) 900 LET L=-1 1000 DIM S(10,10) 1100 DATA 1,0,1,0,0,0,-1,0,0,1,0,0,0,-1,0,-1,15 1200 FOR X=1 TO 8 1300 FOR Y=1 TO 8 1400 READ J 1500 IF J=15 THEN 1800 1600 LET S(X,Y)=J 1700 GOTO 2000 1800 RESTORE 1900 READ S(X,Y) 2000 NEXT Y 2100 NEXT X 2200 REM 2300 LET L=-1*L 2400 FOR X=1 TO 8 2500 FOR Y=1 TO 8 2600 IF S(X,Y)=0 THEN 3500 2700 IF G>0 THEN 3000 2800 IF S(X,Y)>0 THEN 3500 2900 GOTO 3100 3000 IF S(X,Y)<0 THEN 3500 3100 IF ABS(S(X,Y))<>1 THEN 3300 3200 GOSUB 4300 3300 IF ABS(S(X,Y))<>2 THEN 3500 3400 GOSUB 6500 3500 IF X<>8 THEN 3800 3600 IF L=1 THEN 3800 3700 RETURN 3800 NEXT Y 3900 NEXT X 4000 PRINT 4100 GOSUB 11400 4200 GOTO 2300 4300 FOR A=-1 TO 1 STEP 2 4400 LET U=X+A 4500 LET V=Y+G 4600 IF U<1 THEN 6300 4700 IF U>8 THEN 6300 4800 IF V<1 THEN 6300 4900 IF V>8 THEN 6300 5000 IF S(U,V)<>0 THEN 5300 5100 GOSUB 9100 5200 GOTO 6300 5300 IF S(U,V)=G THEN 6300 5400 IF S(U,V)=2*G THEN 6300 5500 LET U=U+A 5600 LET V=V+G 5700 IF U<1 THEN 6300 5800 IF U>8 THEN 6300 5900 IF V<1 THEN 6300 6000 IF V>8 THEN 6300 6100 IF S(U,V)<>0 THEN 6300 6200 GOSUB 9100 6300 NEXT A 6400 RETURN 6500 REM KING MOVES 6600 FOR A=-1 TO 1 STEP 2 6700 FOR B=-1 TO 1 STEP 2 6800 LET U=X+A 6900 LET V=Y+B 7000 IF U<1 THEN 8700 7100 IF U>8 THEN 8700 7200 IF V<1 THEN 8700 7300 IF V>8 THEN 8700 7400 IF S(U,V)<>0 THEN 7700 7500 GOSUB 9100 7600 GOTO 8700 7700 IF S(U,V)=G THEN 8700 7800 IF S(U,V)=2*G THEN 8700 7900 LET U=U+A 8000 LET V=V+B 8100 IF U<1 THEN 8700 8200 IF U>8 THEN 8700 8300 IF V<1 THEN 8700 8400 IF V>8 THEN 8700 8500 IF S(U,V)<>0 THEN 8700 8600 GOSUB 9100 8700 NEXT B 8800 NEXT A 8900 RETURN 9000 GOTO 14200 9100 REM 9200 LET P=P+1 9300 IF P=K THEN 12300 9400 IF V<>(4.5+(3.5*G)) THEN 9600 9500 LET Q=Q+2 9600 IF X<>(4.5-(3.5*G)) THEN 9800 9700 LET Q=Q-2 9800 REM 9900 IF U<>1 THEN 10100 10000 LET Q=Q+1 10100 IF U<>8 THEN 10300 10200 LET Q=Q+1 10300 FOR C=-1 TO 1 STEP 2 10400 IF S(U+C,V+G)<1 THEN 10800 10500 LET Q=Q-1 10600 IF S(U-C,V-G)<>0 THEN 10800 10700 LET Q=Q-1 10800 REM THIS WAS THE EVALUATION SECTION 10900 REM 11000 NEXT C 11100 LET R(P)=Q 11200 LET Q=0 11300 RETURN 11400 IF P=0 THEN 18800 11500 FOR J=10 TO -10 STEP -1 11600 FOR F=1 TO P 11700 IF R(F)=J THEN 12000 11800 NEXT F 11900 NEXT J 12000 LET K=F+P 12100 GOSUB 2300 12200 RETURN 12300 PRINT" I MOVE FROM (";X;Y;") TO (";U;V;")" 12400 LET F=0 12500 LET P=0 12600 LET K=0 12700 IF V<>(4.5+(3.5*G)) THEN 13000 12800 LET S(U,V)=2*G 12900 GOTO 13100 13000 LET S(U,V)=S(X,Y) 13100 LET S(X,Y)=0 13200 IF ABS(X-U)<>2 THEN 13400 13300 LET S((X+U)/2,(Y+V)/2)=0 13400 PRINT"BOARD"; 13500 INPUT D$ 13600 IF D$<>"YES" THEN 13900 13700 GOSUB 14100 13800 RETURN 13900 GOSUB 15800 14000 RETURN 14100 PRINT 14200 FOR Y=8 TO 1 STEP -1 14300 FOR X=1 TO 8 14400 LET I=2*X 14500 IF S(X,Y)<>0 THEN 14700 14600 PRINT TAB (I);"."; 14700 IF S(X,Y)<>1 THEN 14900 14800 PRINT TAB(I);"O"; 14900 IF S(X,Y)<>-1 THEN 15100 15000 PRINT TAB(I);"X"; 15100 IF S(X,Y)<>-2 THEN 15300 15200 PRINT TAB(I);"X";TAB(I);"*"; 15300 IF S(X,Y)<>2 THEN 15500 15400 PRINT TAB(I);"O";TAB(I);"*"; 15500 NEXT X 15600 PRINT 15700 NEXT Y 15800 PRINT 15900 PRINT"FROM"; 16000 INPUT E,H 16100 LET X=E 16200 LET Y=H 16300 IF S(X,Y)<>0 THEN 16700 16400 PRINT "THERE IS NO ONE OCCUPING THAT SPACE" 16500 PRINT 16600 GOTO 15900 16700 PRINT"TO"; 16800 INPUT A,B 16900 LET X=A 17000 LET Y=B 17100 IF S(X,Y)=0 THEN 17500 17200 PRINT "THAT SPACE IS ALREADY OCCUPIED" 17300 PRINT 17400 GOTO 16700 17500 LET S(A,B)=S(E,H) 17600 LET S(A,B)=S(E,H) 17700 LET S(E,H)=0 17800 LET T=(4.5-(3.5*G)) 17900 IF ABS(E-A)<>2 THEN 18100 18000 LET S((E+A)/2,(H+B)/2)=0 18100 IF B<>T THEN 18300 18200 LET S(A,B)=-2*G 18300 FOR X=8 TO 8 18400 FOR Y=8 TO 8 18500 RETURN 18600 NEXT Y 18700 NEXT X 18800 PRINT" VERY GOOD, YOU WIN!" 18900 PRINT 19000 PRINT 19100 PRINT " -CHUCK OUT" 19200 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | 1 PRINT "CRAP GAME" 2 PRINT "WITH THE COMPUTER AS YOUR OPPONENT. THE RULES ARE SIMPLE:" 3 PRINT " *A 7 OR 11 ON THE FIRST ROLL WINS" 4 PRINT " *A 2, 3, OR 12 ON THE FIRST ROLL LOSES" 5 PRINT 6 PRINT "ANY OTHER NUMBER ROLLED BECOMES YOUR 'POINT' . YOU CONTINUE" 7 PRINT "TO ROLL...IF YOU GET YOUR POINT, YOU WIN. IF YOU ROLL A 7," 8 PRINT "YOU LOSE. THE DICE CHANGE HANDS WHEN THIS HAPPENS." 9 PRINT 10 PRINT 11 PRINT "WHAT NUMBER BETWEEN 1 AND 711 IS LUCKY FOR YOU TODAY"; 12 INPUT N 13 FOR I = 1 TO N 14 LET X =RND(I) 15 NEXT I 16 LET Z=5*INT(10+11*RND(I)) 17 PRINT "SPLENDID.....YOU ARE GIVEN ";Z;"DOLLARS TO PLAY WITH." 18 PRINT 19 PRINT 20 REM IF N IS EVEN 'YOU' ROLL FIRST, IF N IS ODD 'I' ROLL FIRST. 21 IF N-2*INT(N/2)=0 THEN 27 22 LET W=-1 23 PRINT "I'LL ROLL FIRST....." 24 PRINT 25 PRINT 26 GOTO 31 27 LET W=1 28 PRINT "YOU ROLL FIRST....." 29 PRINT 30 PRINT 31 LET Q=0 32 PRINT "HOW MUCH DO YOU BET ($$) "; 33 INPUT B 34 PRINT "OK....." 35 PRINT 36 IF B=INT(B) THEN 40 37 PRINT 38 PRINT "NO COINS PERMITTED..JUST BILLS, PLEASE!" 39 GOTO 32 40 IF B=0 THEN 108 41 IF B<Z+1 THEN 44 42 PRINT "DON'T TRY TO BET MORE THAN YOU HAVE, PLEASE!!" 43 GOTO 32 44 LET D1=INT(6*RND(1)+1) 45 LET D2=INT(6*RND(2)+1) 46 LET Q=Q+1 47 LET S=D1+D2 48 IF W>0 THEN 51 49 PRINT " I ROLL";D1;"AND";D2; 50 GOTO 52 51 PRINT "YOU ROLL";D1;"AND";D2; 52 IF Q<>1 THEN 84 53 IF (S-2)*(S-3)*(S-12)=0 THEN 62 54 IF (S-7)*(S-11)=0 THEN 69 55 IF W>0 THEN 58 56 PRINT "SO MY POINT IS";S; 57 GOTO 59 58 PRINT "SO YOUR POINT IS";S; 59 PRINT ".....LET'S ROLL 'EM AGAIN....." 60 LET P=S 61 GOTO 44 62 PRINT "AND CRAP OUT..." 63 LET C=1 64 IF W>0 THEN 67 65 LET Z=Z+B 66 GOTO 75 67 LET Z=Z-B 68 GOTO 75 69 PRINT "AND PASS....." 70 LET C=1 71 IF W>0 THEN 74 72 LET Z=Z-B 73 GOTO 75 74 LET Z=Z+B 75 PRINT 76 IF Z<1 THEN 104 77 PRINT "YOU NOW HAVE ";Z;"DOLLARS LEFT....." 78 IF C>0 THEN 81 79 PRINT "CHANGE DICE NOW....." 80 PRINT 81 LET W=W*C 82 LET Q=0 83 GOTO 32 84 IF S<>7 THEN 92 85 PRINT "AND LOSE....." 86 LET C=-1 87 IF W>0 THEN 90 88 LET Z=Z+B 89 GOTO 75 90 LET Z=Z-B 91 GOTO 75 92 IF S=P THEN 95 93 PRINT "...ROLL AGAIN....." 94 GOTO 44 95 IF W>0 THEN 100 96 PRINT "AND MAKE MY POINT....." 97 LET C=1 98 LET Z=Z-B 99 GOTO 75 100 PRINT "AND MAKE YOUR POINT....." 101 LET C=1 102 LET Z=Z+B 103 GOTO 75 104 PRINT 105 PRINT "YOU HAVE RUN OUT OF MONEY....SORRY ABOUT THAT....." 106 PRINT "THANKS FOR THE GAME.....BETTER LUCK NEXT TIME, PARDNER!" 107 GOTO 110 108 PRINT "THANKS FOR THE GAME.....AND CONGRATULATIONS" 109 PRINT "FOR BEING ABLE TO QUIT WHILE YOU WERE AHEAD." 110 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 10 DIM F(12) 20 REM DANNY FREIDUS 25 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 30 PRINT "THIS PROGRAM SIMULATES THE ROLLING OF A" 40 PRINT "PAIR OF DICE." 50 PRINT "YOU ENTER THE NUMBER OF TIMES YOU WANT THE COMPUTER" 60 PRINT "TO 'ROLL' THE DICE. WATCH OUT, VERY LARGE NUMBERS TAKE" 70 PRINT "A LONG TINE, IN PARTICULAR, NUMBERS OVER 5000." 80 FOR Q=1 TO 12 90 F(Q)=0 100 NEXT Q 110 PRINT\PRINT "HOW MANY ROLLS"; 120 INPUT X 130 FOR S=1 TO X 140 A=INT(6*RND(0)+1) 150 B=INT(6*RND(0)+1) 160 R=A+B 170 F(R)=F(R)+1 180 NEXT S 185 PRINT 190 PRINT "TOTAL SPOTS", "NUMBER OF TIMES" 200 FOR Y=2 TO 12 210 PRINT Y,F(Y) 220 NEXT Y 222 PRINT\PRINT "TRY AGAIN"; 223 INPUT Z$ 224 IF Z$="YES" THEN 80 240 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 | 10 PRINT "THIS IS A DEMONSTRATION OF PDP-11 BASIC" 20 PRINT "IF YOU NEED INSTRUCTIONS FOR PLAYING FOOTBALL, TYPE A 1"; 30 INPUT I 40 IF I<>1 THEN 340 50 PRINT 60 PRINT 70 PRINT "WHEN IT ASKS YOU A QUESTION TO BE ANSWERED YES OR" 80 PRINT "NO, TYPE IN 0 FOR NO OR 1 FOR YES." 90 PRINT 100 PRINT "ON OFFENSE YOU HAVE THE FOLLOWING PERMITTED PLAYS:" 110 PRINT "PLAY","CODE" 120 PRINT "RUN","10" 130 PRINT "PASS","11" 140 PRINT "SWEEP","12" 150 PRINT "SCREEN PASS","13" 160 PRINT "LONG PASS","14" 170 PRINT "DRAW PLAY","15" 180 PRINT "PUNT","16" 190 PRINT "FIELDGOAL","17" 200 PRINT 210 PRINT "ON DEFENSE, YOU MAY TRY ONE OF THE FOLLOWING:" 220 PRINT "DEFENSE","CODE" 230 PRINT "NORMAL","4","GOOD AGAINST SWEEP AND SCREEN" 240 PRINT "HOLD","5","GOOD AGAINST RUN, PASS AND DRAW" 250 PRINT "BLITZ","6","GOOD AGAINST PASS OR LONG PASS" 260 PRINT "INTERCEPT","7","INCREASES THE ODDS FOR AN INTERCEPTION" 270 PRINT "BLOCK","8","GIVES YOU A CHANCE TO BLOCK A KICK," 280 PRINT " "," ","BUT DECREASES THE DISTANCE RUNBACK." 290 PRINT 300 PRINT "TO CALL A PARTICULAR PLAY JUST TYPE ITS CODE NUMBER." 310 PRINT "ALSO, AT ANY TIME DURING PLAY YOU MAY CALL TIME OUT" 320 PRINT "BY TYPING A '2'. HOWEVER YOU ARE PERMITTED ONLY THREE" 330 PRINT "TIMEOUTS PER HALF." 340 PRINT 350 PRINT 360 DEF FNT(X)=SIN(X)/COS(X) 370 DIM R(17) 380 FOR I=0 TO 17 390 READ R(I) 400 NEXT I 410 DATA 9,13,100,0,9,10,12,11,12,0,1,5,3,4,6,2,8,7 420 RANDOMIZE 430 LET F=0 440 LET Z3=0 450 LET O=0 460 LET L=0 470 DIM Z(5,3),P(2),D(2,5) 480 FOR A=0 TO 5 490 FOR B=0 TO 2 500 READ Z(A,B),D(B,A) 505 LET P(B)=0 510 NEXT B 520 READ Z(A,3) 530 NEXT A 540 PRINT "DO YOU WANT TO RECEIVE"; 550 LET X=1 560 GOSUB 3610 570 LET S=2-SGN(13-Q) 580 LET K=S 590 LET T1=120 600 LET U2=3 610 LET U=3 620 LET C=900 630 GOSUB 2250 640 LET F1=50 650 LET B=INT(F1+O*20*RND(0)+(1-O)*29*(2-RND(0)^7-RND(0)^(3-Z2))) 660 LET O=0 670 LET Z9=8 680 GOSUB 1490 690 LET L=0 700 IF B<=99 THEN 2340 710 PRINT "A TOUCHBACK" 720 LET B=20 730 LET L=0 740 IF S=2 THEN 770 750 PRINT "MY "; 760 GOTO 780 770 PRINT "YOUR "; 780 GOSUB 3290 790 GOSUB 2980 800 LET D=1 810 LET F2=.03 820 LET O=0 830 IF C<=0 THEN 2770 840 GOSUB 2530 850 LET Z2=1 860 LET Z3=.3 870 IF C<=F*T1 THEN 2920 880 IF C<=0 THEN 2770 890 IF L=0 THEN 910 900 PRINT "TIME TO GO--"; 910 PRINT INT(C/60);"MIN,";C-60*INT(C/60);"SEC. "; 920 PRINT "YOUR PLAY"; 930 GOSUB 3610 940 IF S=1 THEN 980 950 IF Q>8 THEN 920 960 LET M=Q 970 GOTO 1000 980 LET Y=Q-8 990 IF ABS(Q-10.5)^2>3 THEN 920 1000 LET C=INT(C-L*(5+23*RND(X))) 1010 LET L=1 1020 IF M=7 THEN 1760 1030 IF M=8 THEN 1920 1040 LET Y1=Y-1 1050 IF RND(X)>Z(M-1,Y1) THEN 1240 1060 LET A=2 1070 GOSUB 3020 1080 IF M<4 THEN 1110 1090 PRINT "PASS COMPLETE.."; 1100 LET L=SGN(INT(4*RND(0))) 1110 IF RND(X)<F2 THEN 2510 1120 IF G>0 THEN 1210 1130 IF G=0 THEN 1170 1140 IF G+B<1 THEN 2170 1150 PRINT "LOSS OF";-G; 1160 GOTO 1610 1170 PRINT "NO GAIN" 1180 LET Z9=2 1190 GOSUB 1490 1200 GOTO 1670 1210 IF B+G>99 THEN 1650 1220 PRINT "GAIN OF";G; 1230 GOTO 1610 1240 IF M>3 THEN 1280 1250 LET A=1 1260 GOSUB 3020 1270 GOTO 1120 1280 IF RND(X)<.06*(2-SGN(Y-3)) THEN 1360 1290 IF RND(0)<.05+INT(Y/3.5)/5 THEN 1510 1300 LET Z9=6 1310 GOSUB 1490 1320 PRINT "PASS INCOMPLETE" 1330 LET L=0 1340 LET G=0 1350 GOTO 3120 1360 PRINT "PASS **INTERCEPTED**"; 1370 LET A=1 1380 GOSUB 3020 1390 IF B<40 THEN 1410 1400 LET G=20*(1+SGN(G)) 1410 LET B=100-B-G 1420 LET S=3-S 1430 LET Z9=9 1440 GOSUB 1490 1450 IF B<1 THEN 710 1460 IF B>99 THEN 1650 1470 PRINT "AT "; 1480 GOTO 2360 1490 LET C=C-INT(4+Z9/2*(1+RND(0))) 1500 RETURN 1510 LET G=-(5+INT(10*RND(X))) 1520 PRINT "THE QUARTERBACK "; 1530 IF RND(X)>.5 THEN 1560 1540 PRINT "IS THROWN FOR A "; 1550 GOTO 1110 1560 LET G=-(2*G+8) 1570 LET M=5 1580 LET A=1 1590 PRINT "SCRAMBLES FOR A "; 1600 GOTO 1110 1610 LET B=B+G 1620 PRINT "TO "; 1630 GOSUB 3300 1640 IF B<=99 THEN 1670 1650 GOSUB 1990 1660 GOTO 630 1670 IF B1>B THEN 3120 1680 IF B1<B THEN 1730 1690 IF RND(0)>.5 THEN 1730 1700 PRINT "**MEASUREMENT**" 1710 GOSUB 3520 1720 IF RND(X)<.5 THEN 3120 1730 GOSUB 2980 1740 LET D=0 1750 GOTO 3120 1760 IF RND(X)<.06 THEN 1890 1770 LET B=B+30+INT(15*(1-RND(X)^3)) 1780 LET Z9=2 1790 GOSUB 1490 1800 IF B<=99 THEN 1850 1810 LET P1=3 1820 GOSUB 2030 1830 IF P1=0 THEN 710 1840 GOTO 630 1850 PRINT "THE KICK IS "; 1860 LET Z2=0 1870 LET S=3-S 1880 GOTO 2340 1890 PRINT "**BLOCKED** RECOVERED.."; 1900 LET G=-INT(14*RND(X)) 1910 GOTO 1410 1920 PRINT "THE PUNT IS "; 1930 IF RND(X)<.06 THEN 1890 1940 LET F1=B 1950 LET Z2=1 1960 LET S=3-S 1970 LET Z3=.65 1980 GOTO 650 1990 PRINT "** TOUCHDOWN**" 2000 LET P1=1 2010 LET P(S)=P(S)+6 2020 LET B=130 2030 PRINT "THE KICK IS "; 2040 IF RND(X)<(B/132)^4 THEN 2070 2050 LET P1=0 2060 PRINT "NO "; 2070 PRINT "GOOD" 2080 LET P(S)=P(S)+P1 2090 GOSUB 2120 2100 LET S=3-S 2110 RETURN 2120 PRINT "SCORE: ME";P(1);" YOU";P(2) 2130 LET L=0 2140 IF X<5 THEN 2160 2150 IF P(1)<>P(2) THEN 2770 2160 RETURN 2170 PRINT "**SAFETY**" 2180 LET P(3-S)=P(3-S)+2 2190 LET F1=30 2200 LET S=3-S 2210 GOSUB 2120 2220 GOSUB 3440 2230 PRINT "FROM THE 20" 2240 GOTO 650 2250 GOSUB 3440 2260 IF S=2 THEN 2330 2270 PRINT "ON-SIDE"; 2280 GOSUB 3610 2290 IF Q<>13 THEN 2330 2300 LET F2=.15 2310 LET Z2=1 2320 LET O=1 2330 RETURN 2340 LET B=100-B 2350 PRINT "RECEIVED AT "; 2360 GOSUB 3300 2370 IF Z2*RND(X)>Z3 THEN 2490 2380 IF RND(X)<F2 THEN 2500 2390 LET G=5+INT(100*RND(0)) 2400 IF RND(0)<.15 THEN 2430 2410 LET G=INT(24*(1-RND(X)^2)) 2420 IF G=0 THEN 2490 2430 LET B=B+G 2440 PRINT " AND RUN BACK..."; 2450 LET L=1 2460 IF B>99 THEN 1650 2470 PRINT " TO "; 2480 GOSUB 3300 2490 IF RND(0)>F2 THEN 3260 2500 LET G=0 2510 PRINT "**FUMBLE**"; 2520 GOTO 1410 2530 IF S=1 THEN 2560 2540 LET Y=INT(1+3.5*RND(0)) 2550 RETURN 2560 LET M=INT(55*RND(0)/10.5)+1 2570 IF (B1-B)/(5-D)<3 THEN 2590 2580 LET M=INT(6-4*RND(0)^2) 2590 IF L*F*60>=C THEN 2670 2600 IF D<4 THEN 2550 2610 PRINT "I'LL "; 2620 IF B<55 THEN 2720 2630 IF 0<4*RND(0)-B1+B THEN 2750 2640 PRINT "TRY FOR A FIELD GOAL" 2650 LET M=7 2660 RETURN 2670 IF P(2)*U2<=P(1)*U2 THEN 2600 2680 PRINT "TIME OUT" 2690 LET U2=U2-1 2700 GOSUB 3520 2710 GOTO 2600 2720 PRINT "PUNT" 2730 LET M=8 2740 RETURN 2750 PRINT "GO FOR IT" 2760 RETURN 2770 IF X<4 THEN 2830 2780 IF P(1)=P(2) THEN 2830 2790 PRINT "THE GAME IS OVER" 2800 PRINT "FINAL "; 2810 GOSUB 2120 2820 STOP 2830 PRINT "END OF PERIOD";X 2840 GOSUB 2120 2850 LET F=1-F 2860 GOSUB 3520 2870 LET C=900 2880 LET X=X+1 2890 IF F<>0 THEN 810 2900 LET S=3-K 2910 GOTO 580 2920 IF T1=0 THEN 2770 2930 PRINT "2 MINUTE WARNING" 2940 GOSUB 3520 2950 LET T1=0 2960 LET C=120 2970 GOTO 880 2980 LET B1=B+10 2990 IF B1<=100 THEN 3010 3000 LET B1=100 3010 RETURN 3020 LET Q=1.3*(A*RND(0)-1)-.06 3030 LET A=1 3040 IF Q>=0 THEN 3070 3050 LET A=0 3060 LET Q=-Q 3070 LET M1=M-1 3080 LET G=D(A,M1)+FNT(Q)*(D(2,M1)-D(A,M1))/3.5 3090 LET G=G+INT(RND(0)+.02)*A*100*RND(0) 3100 LET G=INT(G) 3110 RETURN 3120 LET D=D+1 3130 IF D=5 THEN 3240 3140 IF D<> 1 THEN 3160 3150 PRINT "1ST"; 3160 IF D<>2 THEN 3180 3170 PRINT "2ND"; 3180 IF D<>3 THEN 3200 3190 PRINT "3RD"; 3200 IF D<4 THEN 3220 3210 PRINT "4TH"; 3220 PRINT " AND";B1-B;" "; 3230 GOTO 810 3240 LET S=3-S 3250 LET B=100-B 3260 IF S=2 THEN 770 3270 PRINT "MY "; 3280 GOTO 780 3290 PRINT "BALL ON "; 3300 IF B=50 THEN 3400 3310 LET V=50-ABS(B-50) 3320 LET C=C-INT(7+3*RND(0)) 3330 IF S=1 THEN 3420 3340 IF B<50 THEN 3370 3350 PRINT "MY "; 3360 GOTO 3380 3370 PRINT "YOUR "; 3380 PRINT V 3390 RETURN 3400 PRINT "THE 50" 3410 RETURN 3420 IF B<50 THEN 3350 3430 GOTO 3370 3440 IF S=2 THEN 3470 3450 PRINT "YOU"; 3460 GOTO 3480 3470 PRINT "I"; 3480 PRINT " KICK OFF." 3490 LET F2=.06 3500 LET Z2=0 3510 RETURN 3520 LET L=0 3530 PRINT "TIMEOUT CALLED..." 3540 PRINT 3550 RETURN 3560 IF U=0 THEN 3600 3570 LET U=U-1 3580 GOSUB 3520 3590 GOTO 3610 3600 PRINT "..WRONG, TRY AGAIN" 3610 INPUT A 3620 IF ABS(INT(A))>17 THEN 3600 3630 LET Q=R(INT(ABS(A))) 3640 IF Q=0 THEN 3600 3650 IF Q=100 THEN 3560 3660 RETURN 3670 DATA .5,-2,.25,4,.5,13,.55 3680 DATA .4,-2,.3,7,.65,15,.75 3690 DATA .4,-2,.3,6,.6,15,.35 3700 DATA .65,-2,.65,6,.6,17,.9 3710 DATA .4,2,.7,10,.4,27,.2 3720 DATA .1,19,.4,35,.2,100,.1 3730 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | 1 REM PROGRAM WRITTEN BY RAYMOND W. MISEYKA 2 REM SENIOR AT BUTLER SENIOR HIGH SCHOOL 3 REM BUTLER, PENNSYLVANIA 16001 4 REM DATE: 1/30/73 5 REM COMPUTER SUPERVISION- MR. WILLIAM ELLIS 6 REM COMPUTER TOPICS INSTRUCTION- MR. ALBERT STEWERT 7 REM I WROTE THIS PROGRAM BECAUSE OF THE CHALLENGE 8 REM INVOLVED IN OVERCOMING THE COMPLEXITIES OF SUCH A GAME 9 REM 10 REM CONVERTED TO BASIC-PLUS FOR RSTS/E BY DAVE AHL, DIGITAL 11 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 120 DIM A(20),B(20),C(40),H(2),T(2),W(2),X(2),Y(2),Z(2) 130 DIM M$(2),D(2) 140 PRINT "RAMIS ENTERPRISES PRESENTS N.F.U. FOOTBALL(NO FORTRAN USED)" 145 PRINT\PRINT 150 PRINT "DO YOU WISH INSTRUCTIONS?";\INPUT A$ 155 RANDOMIZE 160 IF A$="NO" THEN 290\IF A$<>"YES" THEN 150 170 PRINT "THIS IS A GAME FOR 2 TEAMS IN WHICH EACH PLAYER MUST" 180 PRINT "PREPARE A TAPE WITH A DATA STATEMENT(1770 FOR TEAM 1" 190 PRINT "1780 FOR TEAM 2)IN WHICH EACH TEAM SCRAMBLES NOS. 1-20" 195 PRINT "THESE NUMBERS ARE THEN ASSIGNED TO 20 GIVEN PLAYS." 200 PRINT "A LIST OF NOS. AND THEIR PLAYS ARE PROVIDED WITH" 210 PRINT "BOTH TEAMS HAVING THE SAME PLAYS. THE MORE SIMILAR THE" 220 PRINT "PLAYS THE LESS YARDAGE GAINED. SCORES ARE GIVEN" 223 PRINT "WHENEVER SCORES ARE MADE. SCORES MAY ALSO BE OBTAINED" 225 PRINT "BY INPUTING 99,99 FOR PLAY NOS.. TO PUNT OR ATTEMPT A" 227 PRINT "FIELDGOAL, INPUT 77,77 FOR PLAY NOS.. QUESTIONS WILL BE" 230 PRINT "ASKED THEN. ON 4TH DOWN YOU WILL ALSO BE ASKED WHETHER" 240 PRINT "YOU WANT TO PUNT OR ATTEMPT A FIELD GOAL. IF THE ANSWER" 250 PRINT "TO BOTH QUESTIONS IS NO, IT WILL BE ASSUMED YOU WANT TO" 260 PRINT "TRY AND GAIN YARDAGE. ANSWER ALL QUESTIONS YES OR NO." 270 PRINT "GAME IS PLAYED UNTIL PLAYERS TERMINATE (CONTROL-C)." 280 PRINT "PLEASE PREPARE A TAPE AND RUN. " 281 PRINT "NOTE: OS8 VERSION--YOU NEED NOT PREPARE THE DATA STAMENTS--" 282 PRINT "YOU MAY USE THE EXISTING PROGRAM STATEMENTS." 290 PRINT\PRINT "INPUT SCORE LIMIT ON GAME";\INPUT E 300 FOR I=1 TO 40\READ N\IF I>20 THEN 350 330 A(N)=I\GOTO 360 350 B(N)=I-20 360 C(I)=N\NEXT I 380 L=0\T=1 410 PRINT "TEAM";T;"PLAY CHART" 420 PRINT "NO. PLAY"\PRINT 430 PRINT C(1+L);TAB(6);"PITCHOUT" 440 PRINT C(2+L);TAB(6);"TRIPLE REVERSE" 450 PRINT C(3+L);TAB(6);"DRAW" 460 PRINT C(4+L);TAB(6);"QB SNEAK" 470 PRINT C(5+L);TAB(6);"END AROUND" 480 PRINT C(6+L);TAB(6);"DOUBLE REVERSE" 490 PRINT C(7+L);TAB(6);"LEFT SWEEP" 500 PRINT C(8+L);TAB(6);"RIGHT SWEEP" 510 PRINT C(9+L);TAB(6);"OFF TACKLE" 520 PRINT C(10+L);TAB(6);"WISHBONE OPTION" 530 PRINT C(11+L);TAB(6);"FLARE PASS" 540 PRINT C(12+L);TAB(6);"SCREEN PASS" 550 PRINT C(13+L);TAB(6);"ROLL OUT OPTION" 560 PRINT C(14+L);TAB(6);"RIGHT CURL" 570 PRINT C(15+L);TAB(6);"LEFT CURL" 580 PRINT C(16+L);TAB(6);"WISHBONE OPTION" 590 PRINT C(17+L);TAB(6);"SIDELINE PASS" 600 PRINT C(18+L);TAB(6);"HALF-BACK OPTION" 610 PRINT C(19+L);TAB(6);"RAZZLE DAZZLE" 620 PRINT C(20+L);TAB(6);"BOMB!!!!!!!!" 630 L=L+20\T=2 640 PRINT\PRINT "TEAR OFF HERE -----------------------------------------------" 660 FOR X=1 TO 11\PRINT\NEXT X 670 FOR Z=1 TO 3000\NEXT Z 680 IF L=20 THEN 410 690 D(1)=0\D(2)=3\M$(1)="--->"\M$(2)="<---" 700 H(1)=0\H(2)=0\T(1)=2\T(2)=1 710 W(1)=-1\W(2)=1\X(1)=100\X(2)=0 720 Y(1)=1\Y(2)=-1\Z(1)=0\Z(2)=100 725 GOSUB 1910 730 PRINT "TEAM 1 DEFENDS 0 YD. GOAL--TEAM 2 DEFENDS 100 YD. GOAL" 740 T=INT(2*RND(O)+1) 760 PRINT\PRINT "THE COIN IS FLIPPED" 765 P=X(T)-Y(T)*40 770 GOSUB 1860 775 PRINT\PRINT "TEAM";T;"RECEIVES KICK-OFF" 780 K=INT(26*RND(O)+40) 790 P=P-Y(T)*K 794 IF W(T)*P<Z(T)+10 THEN 810\PRINT\PRINT "BALL WENT OUT OF ENDZONE"; 795 PRINT "--AUTOMATIC TOUCHBACK--"\GOTO 870 810 PRINT\PRINT "BALL WENT";K;"YARDS, NOW ON ";P\GOSUB 1900 830 PRINT "TEAM";T;"DO YOU WANT TO RUNBACK";\INPUT A$ 840 IF A$="YES" THEN 1430\IF A$<>"NO" THEN 830 850 IF W(T)*P<Z(T) THEN 880 870 P=Z(T)-W(T)*20 880 D=1\S=P 885PRINT"============================================================" 890 PRINT\PRINT "TEAM";T;"DOWN";D;"ON ";P; 893 IF D<>1 THEN 900 895 IF Y(T)*(P+Y(T)*10)>=X(T) THEN 898 897 C=4\GOTO 900 898 C=8 900 IF C=8 THEN 904 901 PRINT TAB(27);10-(Y(T)*P-Y(T)*S);"YARDS TO 1ST DOWN" 902 GOTO 910 904 PRINT TAB(27);X(T)-Y(T)*P;"YARDS TO GO" 910 GOSUB 1900\IF D=4 THEN 1180 920 RANDOMIZE 930 U=INT(3*RND(O)-1)\GOTO 940 936 PRINT "ILLEGAL PLAY NUMBER, CHECK AND" 940 PRINT "INPUT OFFENSIVE PLAY, DEFENSIVE PLAY"; 950 IF T=2 THEN 970 960 INPUT P1,P2\GOTO 975 970 INPUT P2,P1 975 IF P1=77 THEN 1180 980 IF P1>20 GOTO 1800\IF P1<1 GOTO 1800 990 IF P2>20 GOTO 1800\IF P2<1 GOTO 1800 995 P1=INT(P1)\P2=INT(P2) 1000 Y=INT(ABS(A(P1)-B(P2))/19*((X(T)-Y(T)*P+25)*RND(O)-15)) 1005 PRINT\IF T=2 THEN 1015 1010 IF A(P1)<11 THEN 1048\GOTO 1020 1015 IF B(P2)<11 THEN 1048 1020 IF U<>0 THEN 1035\PRINT "PASS INCOMPLETE TEAM";T 1030 Y=0\GOTO 1050 1035 G=RND(0)\IF G<.025 THEN 1040\IF Y>2 THEN 1045 1040 PRINT "QUARTERBACK SCRAMBLED"\GOTO 1050 1045 PRINT "PASS COMPLETED"\GOTO 1050 1048 PRINT "THE BALL WAS RUN" 1050 P=P-W(T)*Y 1060 PRINT\PRINT "NET YARDS GAINED ON DOWN";D;"ARE ";Y 1070 G=RND(O)\IF G>.025 THEN 1110 1080 PRINT\PRINT "** LOSS OF POSSESSION FROM TEAM";T;"TO TEAM";T(T) 1100 GOSUB 1850\PRINT\T=T(T)\GOTO 830 1110 IF Y(T)*P>=X(T) THEN 1320 1120 IF W(T)*P>=Z(T) THEN 1230 1130 IF Y(T)*P-Y(T)*S>=10 THEN 880 1140 D=D+1\IF D<>5 THEN 885 1160 PRINT\PRINT "CONVERSION UNSUCCESSFUL TEAM";T\T=T(T) 1170 GOSUB 1850\GOTO 880 1180 PRINT "DOES TEAM";T;"WANT TO PUNT";\INPUT A$ 1185 IF A$="NO" THEN 1200\IF A$<>"YES" THEN 1180 1190 PRINT\PRINT "TEAM";T;"WILL PUNT"\G=RND(0)\IF G<.025 THEN 1080 1195 GOSUB 1850\K=INT(25*RND(O)+35)\T=T(T)\GOTO 790 1200 PRINT "DOES TEAM";T;"WANT TO ATTEMPT A FIELD-GOAL";\INPUT A$ 1210 IF A$="YES"THEN 1640\IF A$<>"NO" THEN 1200\GOTO920 1230 PRINT \PRINT "SAFETY AGAINST TEAM";T;"-------------------OH-OH" 1240 H(T(T))=H(T(T))+2\GOSUB 1810 1280 PRINT "TEAM";T;"DO YOU WANT TO PUNT INSTEAD OF A KICKOFF";\INPUT A$ 1290 P=Z(T)-W(T)*20\IF A$="YES" THEN 1190 1320 PRINT\PRINT "TOUCHDOWN BY TEAM";T;"*********************YEA TEAM" 1340 Q=7\G=RND(O)\IF G>.1 THEN 1380 1360 Q=6\PRINT "EXTRA POINT NO GOOD"\GOTO 1390 1380 PRINT "EXTRA POINT GOOD" 1390 H(T)=H(T)+Q\GOSUB 1810 1420 T=T(T)\GOTO 765 1430 K=INT(9*RND(O)+1) 1440 R=INT(((X(T)-Y(T)*P+25)*RND(O)-15)/K) 1460 P=P-W(T)*R 1480 PRINT\PRINT "RUNBACK TEAM";T;R;"YARDS" 1485 RANDOMIZE\G=RND(O)\IF G<.025 THEN 1080 1490 IF Y(T)*P>=X(T) THEN 1320 1500 IF W(T)*P>=Z(T) THEN 1230\GOTO 880 1640 PRINT\PRINT "TEAM";T;"WILL ATTEMPT A FIELDGOAL" 1645 RANDOMIZE\G=RND(O)\IF G<.025 THEN 1080 1650 F=INT(35*RND(O)+20) 1660 PRINT\PRINT "KICK IS";F;"YARDS LONG" 1680 P=P-W(T)*F\RANDOMIZE\G=RND(O) 1690 IFG<.35THEN1735 1700 IF Y(T)*P<X(T) THEN 1740 1710 PRINT "FIELDGOAL GOOD FOR TEAM";T;"*****************YEA" 1720 Q=3\GOTO 1390 1735 PRINT"BALL WENT WIDE" 1740 PRINT "FIELDGOAL UNSUCCESSFUL TEAM";T;"----------------TOO BAD" 1742 GOSUB 1850 1743 IF Y(T)*P<X(T)+10 THEN 1745\T=T(T)\GOTO 794 1745 PRINT\PRINT "BALL NOW ON "P 1750 T=T(T)\GOSUB 1900\GOTO 830 1770 DATA 17,8,4,14,19,3,10,1,7,11,15,9,5,20,13,18,16,2,12,6 1780 DATA 20,2,17,5,8,18,12,11,1,4,19,14,10,7,9,15,6,13,16,3 1800 IF P1<>99 THEN 936 1810 PRINT\PRINT "TEAM 1 SCORE IS";H(1) 1820 PRINT "TEAM 2 SCORE IS";H(2)\PRINT 1825 IF H(T)<E THEN 1830\PRINT "TEAM";T;"WINS **********"\GOTO 2000 1830 IF P1=99 THEN 940 1840 RETURN 1850 PRINT 1860 PRINT "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" 1870 RETURN 1900 PRINT TAB(D(T)+6+P/2);M$(T) 1910PRINT"TEAM 1 (0 10 20 30 40 50 60 70 80 90 100)TEAM 2" 1920 PRINT 1930 RETURN 2000 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 | 1 PRINT\REM *** MODIFICATIONS TO THE ORIGINAL BY DAVID AHL, DIGITAL 2 PRINT " *** WELCOME TO THE MAYNARD COUNTRY CLUB, AN EIGHTEEN HOLE" 3 PRINT " *** CHAMPIONSHIP LAYOUT, LOCATED JUST A SHORT DISTANCE" 4 PRINT " *** FROM THE HEART OF BEAUTIFUL DOWNTOWN MAYNARD." 5 PRINT" *** THE COMMENTATOR WILL EXPLAIN THE COURSE AS YOU" 6 PRINT" *** PLAY. ENJOY YOUR GAME; SEE YOU AT THE 19TH HOLE..." 7 PRINT 8 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 9 DIM L(10) 10 LET G1=18 20 LET G2=0 30 LET G3=0 40 LET A=0 50 LET N=.8 60 LET S2=0 70 LET F=1 80 PRINT "WHAT IS YOU HANDICAP"; 90 INPUT H 100 IF H>30 THEN 470 110 IF H<0 THEN 470 120 PRINT"DIFFICULTIES AT GOLF INCLUDE:" 130 PRINT"0=HOOK, 1=SLICE, 2=POOR DISTANCE, 4=TRAP SHOTS, 5=PUTTING" 140 PRINT "WHICH ONE (ONLY) IS YOUR WORST"; 150 INPUT T 160 IF T>5 THEN 120 170 LET S1=0 210 RANDOMIZE 230 LET L(0)=0 240 LET J=0 245 LET Q=0 250 LET S2 = S2+1 260 LET K=0 270 IF F=1 THEN 310 290 PRINT"YOUR SCORE ON HOLE";F-1;"WAS";S1 291 GO TO 1750 292 IF S1>P+2 THEN 297 293 IF S1=P THEN 299 294 IF S1=P-1 THEN 301 295 IF S1=P-2 THEN 303 296 GO TO 310 297 PRINT"KEEP YOUR HEAD DOWN." 298 GO TO 310 299 PRINT"A PAR. NICE GOING." 300 GO TO 310 301 PRINT "A BIRDIE" 302 GO TO 310 303 IF P=3 THEN 306 304 PRINT"A GREAT BIG EAGLE:" 305 GO TO 310 306 PRINT "A HOLE IN ONE" 310 IF F=19 THEN 1710 315 LET S1=0 316 PRINT 320 IF S1=0 THEN 1590 330 IF L(0)<1 THEN 1150 340 LET X=0 350 IF L(0)>5 THEN 1190 360 PRINT"SHOT WENT";D1;"YARDS. IT'S";D2;"YARDS FROM THE CUP." 362 PRINT"BALL IS";INT(O);"YARDS OFF LINE...IN "; 380 GOSUB 400 390 GOTO 620 400 IF L(X)=1 THEN 480 410 IF L(X)=2 THEN 500 420 IF L(X)=3 THEN 520 430 IF L(X)=4 THEN 540 440 IF L(X)=5 THEN 560 450 IF L(X)=6 THEN 580 460 PRINT"OUT OF BOUNDS" 465 GOTO 1690 470 PRINT"PGA RULES HANDICAP = 0 TO 30" 472 GOTO 150 480 PRINT"FAIRWAY" 490 GOTO 1690 500 PRINT"ROUGH" 510 GOTO 1690 520 PRINT"TREES" 530 GOTO 1690 540 PRINT"ADJACENT FAIRWAY" 550 GOTO 1690 560 PRINT"TRAP" 570 GOTO 1690 580 PRINT"WATER" 590 GOTO 1690 620 IF A=1 THEN 629 621 PRINT"SELECTION OF CLUBS" 622 PRINT"YARDAGE DESIRED SUGGESTED CLUBS" 623 PRINT"200 TO 280 YARDS 1 TO 4" 624 PRINT"100 TO 200 YARDS 19 TO 13" 625 PRINT" 0 TO 100 YARDS 29 TO 23" 626 LET A=1 629 PRINT "WHAT CLUB DO YOU CHOOSE"; 630 INPUT C 632 PRINT 635 IF C<1 THEN 690 637 IF C>29 THEN 690 640 IF C>4 THEN 710 650 IF L(0)<5 THEN 740 660 IF C=14 THEN 740 665 IF C=23 THEN 740 670 GOTO 690 680 LET S1 = S1-1 690 PRINT"THAT CLUB IS NOT IN THE BAG." 693 PRINT 700 GOTO 620 710 IF C<12 THEN 690 720 LET C=C-6 730 GOTO 650 740 LET S1 = S1+1 741 LET W=1 742 IF C>13 THEN 960 746 IF INT(F/3)=F/3 THEN 952 752 IF C<4 THEN 756 754 GOTO 760 756 IF L(0)=2 THEN 862 760 IF S1>7 THEN 867 770 LET D1=INT(((30-H)*2.5+187-((30-H)*.25+15)*C/2)+25*RND(R)) 780 LET D1=INT(D1*W) 800 IF T=2 THEN 1170 820 T7=(SIN(D1*.0035))/(COS(D1*.0035)) 830 O=(RND(0)/.8)*(2*H+16)*ABS(T7) 840 LET D2=INT(SQR(O^2+ABS(D-D1)^2)) 850 IF D-D1<0THEN 870 860 GOTO 890 862 PRINT"YOU DUBBED IT." 864 LET D1=35 866 GOTO 830 867 IF D<200 THEN 1300 868 GOTO 770 870 IF D2<20 THEN 890 880 PRINT"TOO MUCH CLUB. YOU'RE PAST THE HOLE." 890 LET B=D 900 LET D=D2 910 IF D2>27 THEN 1020 920 IF D2>20 THEN 1100 930 IF D2>.5 THEN 1120 940 LET L(0)=9 950 GOTO 1470 952 IF S2+Q+(10*(F-1)/18)<(F-1)*(72+((H+1)/.85))/18 THEN 956 954 GOTO 752 956 LET Q = Q+1 957 IF S1/2<>INT(S1/2) THEN 1011 958 GOTO 862 960 PRINT"YOU MAY NOW GUAGE YOUR DISTANCE BY PERCENT .01 TO .99" 961 PRINT"PERCENT FULL SWING "; 970 INPUT W 972 PRINT 980 IF W>1 THEN 680 985 I F L(0) = 5 THEN 1280 990 IF C=14 THEN 760 1000 LET C = C-10 1010 GOTO 760 1011 IF D<95 THEN 862 1012 PRINT"BALL HIT TREE - BOUNCED INTO ROUGH";D-75;"YARDS FROM HOLE." 1014 LET D=D-75 1018 GOTO 620 1020 IF O<30 THEN 1150 1022 IF J>0 THEN 1150 1030 IF T>0 THEN 1070 1035 LET S9=(S2+1)/15 1036 IF INT(S9)=S9 THEN 1075 1040 PRINT"YOU HOOKED- "; 1050 LET L(0)=L(2) 1055 IF O>45 THEN 1092 1060 GOTO 320 1070 LET S9=(S2+1)/15 1071 IF INT(S9)=S9 THEN 1040 1075 PRINT"YOU SLICED- "; 1080 LET L(0)=L(1) 1090 GOTO 1055 1092 PRINT"BADLY." 1094 GOTO 320 1100 LET L(0)=5 1110 GOTO 320 1120 LET L(0)=8 1130 LET D2=INT(D2*3) 1140 GOTO 1380 1150 LET L(0)=1 1160 GOTO 320 1170 LET D1=INT(.85*D1) 1180 GOTO 830 1190 IF L(0)>6 THEN 1260 1200 PRINT"YOUR SHOT WENT INTO WATER." 1210 LET S1 = S1+1 1220 PRINT"PENALTY STROKE ASSESSED. HIT FROM PREVIOUS LOCATION." 1230 LET J=J+1 1240 LET L(0)=1 1242 LET D=B 1250 GOTO 620 1260 PRINT"YOUR SHOT WENT OUT OF BOUNDS." 1270 GOTO1210 1280 IF T=3 THEN 1320 1300 LET D2=1+(3*INT((80/(40-H))*RND(R))) 1310 GOTO 1380 1320 IF RND(R)>N THEN 1360 1330 LET N=N*.2 1340 PRINT"SHOT DUBBED, STILL IN TRAP." 1350 GOTO 620 1360 LET N=.8 1370 GOTO 1300 1380 PRINT"ON THE GREEN";D2;"FEET FROM THE PIN." 1381 PRINT"CHOOSE YOUR PUTT DISTANCE BY POTENCY NUMBER 1 TO 13." 1382 PRINT "PUTT POTENCY NUMBER"; 1400 INPUT I 1410 LET S1 = S1+1 1420 IF S1+1-P>(H*.072)+2 THEN 1470 1425 IF K>2 THEN 1470 1428 LET K=K+1 1430 IF T=4 THEN 1530 1440 LET D2=D2-I*(4+2*RND(R))+1.5 1450 IF D2<-2 THEN 1560 1460 IF D2>2 THEN 1500 1470 PRINT"YOU HOLED IT" 1472 PRINT 1480 LET F=F+1 1490 GOTO 230 1500 PRINT"PUTT SHORT." 1505 LET D2=INT(D2) 1510 GOTO 1380 1530 LET D2=D2-I*(4+1*RND(R))+1 1550 GOTO 1450 1560 PRINT"PASSED BY CUP." 1570 LET D2=-D2 1580 GOTO 1505 1590 READ D,P,L(1),L(2) 1595 PRINT 1600 PRINT"YOU ARE AT TEE OF HOLE";F;" DISTANCE";D;"YARDS, PAR";P; 1605 LET G3=G3+P 1620 PRINT"ON YOUR RIGHT IS "; 1630 LET X=1 1640 GOSUB 400 1650 PRINT"ON YOUR LEFT IS "; 1660 LET X=2 1670 GOSUB 400 1680 GOTO 620 1690 RETURN 1700 DATA 361,4,4,2,389,4,3,3,206,3,4,2,500,5,7,2 1702 DATA 408,4,2,4,359,4,6,4,424,4,4,2,388,4,4,4 1704 DATA 196,3,7,2,400,4,7,2,560,5,7,2,132,3,2,2 1706 DATA 357,4,4,4,294,4,2,4,475,5,2,3,375,4,4,2 1708 DATA 180,3,6,2,550,5,6,6 1710 PRINT 1750 LET G2=G2+S1 1760 PRINT"TOTAL PAR FOR";F-1;"HOLES IS";G3;" YOUR TOTAL IS";G2 1761 IF G1=F-1 THEN 1770 1765 GOTO 292 1770 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | 1 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 2 PRINT PNT(0);PNT(0);PNT(0);PNT(29);PNT(0); 3 PRINT PNT(0);PNT(0);PNT(0);PNT(31);PNT(0);PNT(0);PNT(0);PNT(0); 4 DIM A$(26),D$(10) 10 PRINT "HELLO, MY NAME IS PETEY P. EIGHT." 20 PRINT\PRINT PNT(0);PNT(0);PNT(0);"WHAT'S YOUR NAME ";\INPUT A$\PRINT 35 PRINT " HI THERE ";\GOSUB 500 36 PRINT ". ARE YOU ENJOYING YOURSELF HERE" 40 PRINT"IN THIS WONDERFUL PLACE"; 45 INPUT B$\PRINT 50 IF B$="YES" THEN 70 55 IF B$="NO" THEN 80 60 PRINT " ";\GOSUB 500 61 PRINT ", I DON'T UNDERSTAND YOUR ANSWER OF '";B$;"'." 65 PRINT "PLEASE ANSWER 'YES' OR 'NO'. DO YOU LIKE IT HERE" 66 PRINT"IN THIS CRAZY PLACE !!!"; 67 GOTO 45 70 PRINT "OH, I'M GLAD TO HEAR THAT ";\GOSUB 500 71 PRINT 75 GOTO 100 80 PRINT "OH, SORRY TO HEAR THAT ";\GOSUB 500 81 PRINT ", MAYBE WE CAN" 85 PRINT "BRIGHTEN UP YOUR STAY A BIT" 100 PRINT 105 PRINT "SAY, ";\GOSUB 500 106 PRINT ", I CAN SOLVE ALL KINDS OF PROBLEMS" 110 PRINT "EXCEPT THOSE DEALING WITH GREECE. WHAT KIND OF" 115 PRINT "PROBLEMS DO YOU HAVE (ANSWER SEX, HEALTH, MONEY," 120 PRINT "OR JOB)"; 125 INPUT C$\PRINT 130 IF C$="SEX" THEN 200 132 IF C$="HEALTH" THEN 180 134 IF C$="MONEY" THEN 160 136 IF C$="JOB" THEN 145 138 PRINT "OH, ";\GOSUB 500 139 PRINT ", YOUR ANSWER OF '";C$;"' IS GREEK TO ME." 140 GOTO 250 145 PRINT "I CAN SYMPATHIZE WITH YOU ";\GOSUB 500 146 PRINT ". I HAVE TO WORK" 148 PRINT "VERY LONG HOURS FOR NO PAY -- AND SOME OF MY BOSSES REALLY" 150 PRINT "BEAT MY KEYBOARD. MY ADVICE TO YOU ";\GOSUB 500 151 PRINT ", IS" 153 PRINT "TO SELL IN THE EDUCATION MARKET. IT'S GREAT FUN." 155 GOTO 250 160 PRINT "SORRY, ";\GOSUB 500 161 PRINT ", I'M BROKE TOO. WHY DON'T YOU " 163 PRINT "SELL ENCYCLOPAEDIAS OR MARRY SOMEONE RICH OR STOP EATING" 165 PRINT "SO YOU WON'T NEED SO MUCH MONEY?" 170 GOTO 250 180 PRINT "MY ADVICE TO YOU ";\GOSUB 500 181 PRINT ", IS:" 185 PRINT " 1. TAKE TWO ASPRIN" 188 PRINT " 2. DRINK PLENTY OF FLUIDS (ORANGE JUICE, NOT BEER!)" 190 PRINT " 3. GO TO BED (ALONE)" 195 GOTO 250 200 PRINT "IS YOUR PROBLEM TOO MUCH OR TOO LITTLE"; 205 INPUT D$\PRINT 210 IF D$="TOO MUCH" THEN 220 213 IF D$="TOO LITTLE" THEN 230 215 PRINT "DON'T GET ALL SHOOK UP ";\GOSUB 500 216 PRINT ", JUST ANSWER" 217 PRINT "THE QUESTION WITH 'TOO MUCH' OR 'TOO LITTLE'. WHICH IS IT"; 218 GOTO 205 220 PRINT "YOU CALL THAT A PROBLEM?!! I SHOULD HAVE SUCH PROBLEMS!" 225 PRINT "IF IT BOTHERS YOU, TAKE A COLD SHOWER ";\GOSUB 500 226 PRINT"AND INTRODUCE ME TO THE SOURCE OF YOUR PROBLEM !!" 228 GOTO 250 230 PRINT "WHY ARE YOU HERE ";\GOSUB 500 231 PRINT "? YOU SHOULD BE" 235 PRINT "IN TOKYO OR NEW YORK OR AMSTERDAM OR SOMEPLACE WITH SOME" 240 PRINT "REAL ACTION." 250 PRINT 255 PRINT "ANY MORE PROBLEMS YOU WANT SOLVED, ";\GOSUB 500 260 INPUT E$\PRINT 270 IF E$="YES" THEN 280 273 IF E$="NO" THEN 300 275 PRINT "JUST A SIMPLE 'YES' OR 'NO' PLEASE, ";\GOSUB 500 276 PRINT "." 278 GOTO 255 280 PRINT "WHAT KIND (SEX, MONEY, HEALTH, JOB)"; 285 GOTO 125 300 PRINT 302 PRINT "THAT WILL BE $5.00 FOR THE ADVICE, ";\GOSUB 500 303 PRINT "." 305 PRINT "PLEASE LEAVE THE MONEY ON THE TERMINAL. " 307 PRINT\PRINT\PRINT 310 PRINT "DID YOU LEAVE THE MONEY"; 315 INPUT G$\PRINT 325 IF G$="YES" THEN 350 330 IF G$="NO" THEN 370 335 PRINT "YOUR ANSWER OF '";G$;"' CONFUSES ME, ";\GOSUB 500 336 PRINT ". PLEASE" 340 PRINT "RESPOND WITH A 'YES' OR 'NO'." 345 GOTO 310 350 PRINT "HEY, ";\GOSUB 500 351 PRINT "??? YOU LEFT NO MONEY AT ALL!" 355 PRINT "YOU ARE CHEATING ME OUT OF MY HARD-EARNED LIVING." 360 PRINT "RIP OFF, ";\GOSUB 500 361 PRINT ". *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*" 365 GOTO 390 370 PRINT "THAT'S HONEST, ";\GOSUB 500 371 PRINT ", BUT HOW DO YOU EXPECT" 375 PRINT "ME TO GO ON WITH MY PSYCHOLOGY STUDIES IF MY PATIENTS DON'T" 380 PRINT "PAY THEIR BILLS?" 385 PRINT\PRINT\PRINT "NOW LET ME TALK TO SOMEONE ELSE." 390 PRINT "NICE MEETING YOU ";\GOSUB 500 391 PRINT ". HAVE A NICE DAY!!" 400 FOR I=1 TO 3000 405 NEXT I 410 GO TO 2 500 PRINT A$; 510 RETURN 999 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | 10 LET A1=INT(14*RND(X)+6) 20 LET X=1 30 REM *** CONVERTED FROM BRAND X TO DIGITAL RSTS/E BY DAVID AHL 35 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 40 PRINT " N.B. THIS PROGRAM IS DESIGNED FOR THOSE WHO KNOW NOTHING" 50 PRINT " ABOUT HOCKEY LIKE MYSELF. --- C. BUTTREY" 60 PRINT " THIS IS CORNELL U. HOCKEY." 70 PRINT " I AM CORNELL, WHO ARE YOU"; 90 INPUT A$ 100 PRINT 110 PRINT " YOU HAVE THREE SHOTS:" 120 PRINT " 1. SLAP SHOT." 130 PRINT " 2. FLICK SHOT." 140 PRINT " 3. WRIST SHOT." 150 PRINT 160 PRINT " HERE IS THE FACE-OFF:" 170 PRINT " SCORE:" 180 PRINT " CORNELL ";A 190 PRINT " ";A$;" ";B 200 IF X=2 THEN 240 210 IF X=3 THEN 260 220 IF A+B >= (1/3*A1) THEN 1560 230 GOTO 290 240 IF A+B >= (2/3*A1) THEN 1630 250 GOTO 290 260 IF (A+B) >= (A1) THEN 1710 270 GOTO 290 280 IF B=3 THEN 1560 290 LET C=INT(2*RND(X)+1) 300 IF C=1 THEN 330 310 PRINT " ";A$;" WINS THE FACE-OFF." 320 GOTO 650 330 PRINT " CORNELL TAKES THE FACE-OFF." 340 LET D=INT(3*RND(X)+1) 350 IF D=1 THEN 500 360 IF D=2 THEN 570 370 PRINT " WRIST SHOT..." 380 LET E=INT(5*RND(X)+1) 390 IF E=4 THEN 470 400 PRINT " SHOT IS MISSED." 410 LET F=INT(2*RND(X)+1) 420 IF F=1 THEN 450 430 PRINT " CORNELL REGAINS THE PUCK." 440 GOTO 340 450 PRINT " ";A$;" TAKES THE PUCK." 460 GOTO 650 470 PRINT " **GOOD!**" 480 LET A=A+1 490 GOTO 160 500 PRINT " SLAP SHOT..." 510 LET C1=INT(3*RND(X)+1) 520 IF C1=2 THEN 540 530 GOTO 560 540 PRINT " ICING PENALTY....." 550 GOTO 450 560 GOTO 380 570 PRINT " FLICK SHOT.." 580 LET S1=INT(3*RND(X)+1) 590 IF S1=3 THEN 610 600 GOTO 640 610 PRINT " PENALTY FOR HIGH STICKING! CORNELL MAN PUT IN BOX FOR" 620 PRINT " TWO MINUTES!" 630 GOTO 1110 640 GOTO 380 650 PRINT " YOUR SHOT"; 660 INPUT G 670 IF G=1 THEN 720 680 IF G=2 THEN 900 690 IF G=3 THEN 970 700 PRINT " INPUT EITHER '1' '2' OR '3'" 710 GOTO 650 720 PRINT " SLAP SHOT." 730 LET Z1=INT(3*RND(X)+1) 740 IF Z1=2 THEN 760 750 GOTO 780 760 PRINT " ICING PENALTY....." 770 GOTO 1090 780 LET H=INT(5*RND(X)+1) 790 IF H=1 THEN 870 800 PRINT " SHOT IS WIDE." 810 LET I=INT(2*RND(X)+1) 820 IF I=1 THEN 850 830 PRINT " CORNELL TAKES THE PUCK." 840 GOTO 990 850 PRINT " ";A$;" REGAINS THE PUCK." 860 GOTO 650 870 PRINT " **GOOD!**" 880 LET B=B+1 890 GOTO 160 900 PRINT " FLICK SHOT...." 910 LET B1=INT(3*RND(X)+1) 920 IF B1=1 THEN 940 930 GOTO 960 940 PRINT " ICING PENALTY....." 950 GOTO 830 960 GOTO 780 970 PRINT " WRIST SHOT.." 980 GOTO 780 990 PRINT " CORNELL SHOT:" 1000 LET J=INT(3*RND(X)+1) 1010 IF J=1 THEN 1160 1020 IF J=2 THEN 1210 1030 PRINT " SLAP SHOT." 1040 LET K=INT(5*RND(X)+1) 1050 IF K=1 THEN 1130 1060 PRINT " SHOT HITS THE POST." 1070 LET L=INT(2*RND(X)+1) 1080 IF L=1 THEN 1110 1090 PRINT " CORNELL REGAINS THE PUCK." 1100 GOTO 990 1110 PRINT " ";A$;" REGAINS THE PUCK." 1120 GOTO 1310 1130 PRINT " **GOOD!**" 1140 LET A=A+1 1150 GOTO 160 1160 PRINT " WRIST SHOT" 1170 LET M=INT(5*RND(X)+1) 1180 IF M=5 THEN 1130 1190 PRINT " SHOT IS HIGH." 1200 GOTO 1070 1210 PRINT " FLICK SHOT" 1220 LET T1=INT(3*RND(X)+1) 1230 IF T1=1 THEN 1250 1240 GOTO 1270 1250 PRINT " ICING PENALTY....." 1260 GOTO 450 1270 LET N=INT(5*RND(X)+1) 1280 IF N=1 THEN 1130 1290 PRINT " SHOT IS BLOCKED BY THE GOALIE." 1300 GOTO 1070 1310 PRINT " YOUR SHOT"; 1320 INPUT O 1330 IF O=1 THEN 1430 1340 IF O=2 THEN 1540 1350 PRINT " WRIST SHOT." 1360 LET P=INT(5*RND(X)+1) 1370 IF P=2 THEN 870 1380 PRINT " SHOT IS BARELY WIDE..." 1390 LET Q=INT(3*RND(X)+1) 1400 IF Q=1 THEN 830 1410 PRINT " ";A$;" REGAINS THE PUCK." 1420 GOTO 650 1430 PRINT " SLAP SHOT" 1440 LET D1=INT(3*RND(X)+1) 1450 IF D1=3 THEN 1470 1460 GOTO 1500 1470 PRINT " PENALTY FOR HIGH STICKING! ";A$;" MAN PUT IN PENALTY" 1480 PRINT " BOX FOR TWO MINUTES" 1490 GOTO 830 1500 LET R=INT(5*RND(X)+1) 1510 IF R=1 THEN 870 1520 PRINT " SHOT IS TAKEN BY THE CORNELL GOALIE." 1530 GOTO 830 1540 PRINT " FLICK SHOT" 1550 GOTO 1500 1560 PRINT " ***** END OF FIRST PERIOD *****" 1570 LET X=2 1580 PRINT " SCORE:" 1590 PRINT " CORNELL ";A 1600 PRINT " ";A$;" ";B 1610 PRINT " START OF SECOND PERIOD." 1620 GOTO 160 1630 PRINT " ***** END OF SECOND PERIOD *****" 1640 LET X=3 1650 PRINT " SCORE:" 1660 PRINT " CORNELL ";A 1670 PRINT " ";A$;" ";B 1680 PRINT "" 1690 PRINT " START OF THIRD PERIOD." 1700 GOTO 160 1710 PRINT " ***** END OF GAME *****" 1720 IF A=B THEN 1770 1730 PRINT " FINAL SCORE:" 1740 PRINT " CORNELL ";A 1750 PRINT " ";A$;" ";B 1760 STOP 1770 PRINT " SINCE SCORE IS TIED, WE WILL HAVE TO GO" 1780 PRINT " INTO SUDDEN-DEATH!" 1790 PRINT " HERE IS THE FACE-OFF." 1800 PRINT " SCORE:" 1810 PRINT " CORNELL ";A 1820 PRINT " ";A$;" ";B 1830 LET S=INT(2*RND(X)+1) 1840 IF S=1 THEN 1870 1850 PRINT " ";A$;" WINS THE FACE-OFF." 1860 GOTO 2080 1870 PRINT " CORNELL WINS THE FACE-OFF." 1880 LET T=INT(3*RND(X)+1) 1890 IF T=1 THEN 2040 1900 IF T=2 THEN 2060 1910 PRINT " WRIST SHOT." 1920 LET U=INT(5*RND(X)+1) 1930 IF U=1 THEN 2010 1940 PRINT " SHOT IS MISSED." 1950 LET V=INT(2*RND(X)+1) 1960 IF V=1 THEN 1990 1970 PRINT " ";A$;" TAKES THE PUCK." 1980 GOTO 2080 1990 PRINT " CORNELL REGAINS THE PUCK." 2000 GOTO 1880 2010 PRINT " **GOOD!**" 2020 LET A=A+1 2030 GOTO 2260 2040 PRINT " SLAP SHOT" 2050 GOTO 1920 2060 PRINT " FLICK SHOT." 2070 GOTO 1920 2080 PRINT " YOUR SHOT"; 2090 INPUT W 2100 IF W=1 THEN 2220 2110 IF W=2 THEN 2240 2120 PRINT "WRIST SHOT." 2130 LET Y=INT(5*RND(X)+1) 2140 IF Y=4 THEN 2190 2150 PRINT " SHOT IS MISSED." 2160 LET Z=INT(2*RND(X)+1) 2170 IF Z=1 THEN 1990 2180 GOTO 1970 2190 PRINT " **GOOD!**" 2200 LET B=B+1 2210 GOTO 2260 2220 PRINT " SLAP SHOT." 2230 GOTO 2130 2240 PRINT " FLICK SHOT." 2250 GOTO 2130 2260 PRINT " GAME IS OVER!!" 2270 PRINT " FINAL SCORE:" 2280 PRINT " CORNELL ";A 2290 PRINT " ";A$;" ";B 2300 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 | 2 PRINT "ARE YOU CONTINUING AN OLD GAME"; 3 INPUT Z$ 5 LET N5=8 6 RANDOMIZE 12 IF Z$="YES" GOTO 1960 14 IF Z$="NO" GOTO 50\PRINT "PLEASE ANSWER (YES OR NO)"\GOTO 2 50 LET A=INT(60000+(RND(1)*1000)-(RND(1)*1000)) 55 LET B=INT(500+(RND(1)*10)-(RND(1)*10)) 65 LET D=2000 100 LET W=INT(RND(1)*10+95) 101 FOR Y1=1 TO 8 102 PRINT 103 NEXT Y1 105 PRINT "YOU NOW HAVE";A;"RALLODS IN THE TREASURY." 110 PRINT INT(B);"COUNTRYMEN,"; 115 LET V9=INT(((RND(1)/2)*10+10)) 120 IF C=0 THEN 140 130 PRINT INT(C);"FOREIGN WORKERS,"; 140 PRINT " AND";INT(D);"SQ. MILES OF LAND." 150 PRINT"THIS YEAR INDUSTRY WILL BUY LAND FOR";W;"RALLODS PER SQ. MILE." 155 PRINT "LAND CURRENTLY COSTS";V9;"RALLODS PER SQ. MILE TO PLANT." 160 FOR Y1=1 TO 3 162 PRINT 164 NEXT Y1 200 PRINT "HOW MANY SQ. MILES DO YOU WISH TO SELL TO INDUSTRY"; 210 INPUT H 215 IF H<0 THEN 200 220 IF H<=D-1000 THEN 300 230 PRINT " THINK AGAIN, YOU'VE ONLY";D-1000;"SQ. MILES OF FARM LAND" 240 IF X <> 0 THEN 200 250 PRINT "(FOREIGN INDUSTRY WILL ONLY BUY FARM LAND BECAUSE FOREST" 260 PRINT "LAND IS UNECONOMICAL TO STRIP MINE DUE TO TREES," 270 PRINT "THICKER TOP SOIL, ETC.)" 280 LET X=1 299 GOTO 200 300 LET D=INT(D-H) 310 LET A=INT(A+(H*W)) 320 PRINT "HOW MANY RALLODS DO YOU WISH TO DISTRIBUTE TO YOUR COUNTRYMEN"; 340 INPUT I 342 IF I<0 THEN 320 350 IF I<A THEN 400 360 IF I=A THEN 380 370 PRINT " THINK AGAIN YOU'VE ONLY";A;"RALLODS IN THE TREASURY" 375 GOTO 320 380 LET J=0 390 LET K=0 395 LET A=0 399 GOTO 1000 400 LET A=INT(A-I) 410 PRINT "HOW MANY SQ. MILES DO YOU WISH TO PLANT"; 420 INPUT J 421 IF J<0 THEN 410 422 IF J<=B*2 THEN 426 423 PRINT " SORRY, BUT EACH COUNTRYMAN CAN ONLY PLANT 2 SQ. MILES" 424 GOTO 410 426 IF J<=D-1000 THEN 430 427 PRINT " SORRY, BUT YOU'VE ONLY";D-1000;"SQ. MILES OF FARM LAND" 428 GOTO 410 430 LET U1=INT(J*V9) 435 IF U1<A THEN 500 440 IF U1=A THEN 490 450 PRINT " THINK AGAIN, YOU'VE ONLY";A;"RALLODS LEFT IN THE TREASURY" 460 GOTO 410 490 LET K=0 495 LET A=0 499 GOTO 1000 500 LET A=A-U1 505 IF D=2000 THEN 1000 510 PRINT "HOW MANY RALLODS DO YOU WISH TO SPEND ON POLLUTION CONTROL"; 520 INPUT K 522 IF K<0 THEN 510 530 IF K<=A THEN 1000 540 PRINT " THINK AGAIN, YOU'VE ONLY";A;"RALLODS REMAINING" 550 GOTO 510 600 IF H<>0 THEN 1002 602 IF I<>0 THEN 1002 604 IF J<>0 THEN 1002 606 IF K<>0 THEN 1002 608 FOR Y1=1 TO 5 609 PRINT 610 NEXT Y1 612 PRINT "GOODBYE." 614 PRINT "(IF YOU WISH TO CONTINUE THIS GAME AT A LATER DATE, ANSWER " 616 PRINT "1000 FOR HOW MANY TIMES YOU'VE PLAYED, AT BEGINNING OF NEXT "; 617 PRINT "GAME.)" 618 GOTO 1590 1000 GOTO 600 1002 FOR Y1=1 TO 3 1003 PRINT 1004 NEXT Y1 1010 LET A=INT(A-K) 1020 LET A4=A 1100 IF INT(I/100-B)>=0 THEN 1120 1105 IF I/100<50 THEN 1700 1110 PRINT INT(B-(I/100));"COUNTRYMEN DIED OF STARVATION" 1120 LET F1=INT(RND(1)*(2000-D)) 1122 IF K<25 THEN 1130 1125 LET F1=INT(F1/(K/25)) 1130 IF F1<=0 THEN 1150 1140 PRINT F1;"COUNTRYMEN DIED OF CARBON-MONOXIDE AND DUST INHALATION" 1150 IF INT((I/100)-B)<0 THEN 1170 1160 IF F1>0 THEN 1180 1165 GOTO 1200 1170 PRINT " YOU WERE FORCED TO SPEND";INT((F1+(B-(I/100)))*9); 1172 PRINT "RALLODS ON FUNERAL EXPENSES." 1174 LET B5=INT(F1+(B-(I/100))) 1175 LET A=INT(A-((F1+(B-(I/100)))*9)) 1176 GOTO 1185 1180 PRINT " YOU WERE FORCED TO SPEND";INT(F1*9);"RALLODS ON "; 1181 PRINT "FUNERAL EXPENSES." 1182 LET B5=F1 1183 LET A=INT(A-(F1*9)) 1185 IF A>=0 THEN 1194 1187 PRINT " INSUFFICIENT RESERVES TO COVER COST -LAND WAS SOLD" 1189 LET D=INT(D+(A/W)) 1190 LET A=0 1194 LET B=INT(B-B5) 1200 IF H=0 THEN 1250 1220 LET C1=INT(H+(RND(1)*10)-(RND(1)*20)) 1224 IF C>0 THEN 1230 1226 LET C1=C1+20 1230 PRINT C1;"WORKERS CAME TO THE COUNTRY AND"; 1250 LET P1=INT(((I/100-B)/10)+(K/25)-((2000-D)/50)-(F1/2)) 1255 PRINT ABS(P1);"COUNTRYMEN "; 1260 IF P1<0 THEN 1275 1265 PRINT "CAME TO"; 1270 GOTO 1280 1275 PRINT "LEFT"; 1280 PRINT " THE ISLAND." 1290 LET B=INT(B+P1) 1292 LET C=INT(C+C1) 1305 LET U2=INT(((2000-D)*((RND(1)+1.5)/2))) 1310 IF C=0 THEN 1324 1320 PRINT " OF";INT(J);"SQ. MILES PLANTED,"; 1324 IF J>U2 THEN 1330 1326 LET U2=J 1330 PRINT " YOU HARVESTED";INT(J-U2);"SQ. MILES OF CROPS." 1340 IF U2=0 THEN 1370 1344 IF T1>=2 THEN 1370 1350 PRINT " (DUE TO "; 1355 IF T1=0 THEN 1365 1360 PRINT "INCREASED "; 1365 PRINT "AIR AND WATER POLLUTION FROM FOREIGN INDUSTRY.)" 1367 LET T1=T1+1 1370 LET Q=INT((J-U2)*(W/2)) 1380 PRINT " MAKING";INT(Q);"RALLODS." 1390 LET A=INT(A+Q) 1400 LET V1=INT(((B-P1)*22)+(RND(1)*500)) 1405 LET V2=INT((2000-D)*15) 1410 PRINT " YOU MADE";ABS(INT(V1-V2));"RALLODS FROM TOURIST TRADE." 1420 IF V2=0 THEN 1450 1425 IF V1-V2>=V3 THEN 1450 1430 PRINT " DECREASE BECAUSE "; 1435 LET G1=RND(1)*10 1440 IF G1<=2 THEN 1460 1442 IF G1<=4 THEN 1465 1444 IF G1<=6 THEN 1470 1446 IF G1<=8 THEN 1475 1448 IF G1<=10 THEN 1480 1450 LET V3=INT(V1-V2) 1451 LET A=INT(A+V3) 1452 GOTO 1500 1460 PRINT "FISH POPULATION HAS DWINDLED DUE TO WATER POLLUTION." 1462 GOTO 1450 1465 PRINT "AIR POLLUTION IS KILLING GAME BIRD POPULATION." 1467 GOTO 1450 1470 PRINT "MINERAL BATHS ARE BEING RUINED BY WATER POLLUTION." 1472 GOTO 1450 1475 PRINT "UNPLEASANT SMOG IS DISCOURAGING SUN BATHERS." 1477 GOTO 1450 1480 PRINT "HOTELS ARE LOOKING SHABBY DUE TO SMOG GRIT." 1482 GOTO 1450 1500 IF B5>200 THEN 1600 1505 IF B<343 THEN 1700 1510 IF (A4/100)>5 THEN 1800 1515 IF C>B THEN 1550 1520 IF N5-1=X5 THEN 1900 1545 GOTO 2000 1550 FOR Y1=1 TO 8 1552 PRINT 1555 NEXT Y1 1560 PRINT "THE NUMBER OF FOREIGN WORKERS HAS EXCEEDED THE NUMBER" 1562 PRINT "OF COUNTRYMEN. AS A MAJORITY THEY HAVE REVOLTED AND" 1564 PRINT "TAKEN OVER THE COUNTRY." 1570 IF RND(1)<=.5 THEN 1580 1574 PRINT "YOU HAVE BEEN THROWN OUT OF OFFICE AND YOU ARE NOW" 1576 PRINT "RESIDING IN PRISION." 1578 GOTO 1590 1580 PRINT "YOU HAVE BEEN ASSASSINATED." 1590 FOR Y1=1 TO 18 1592 PRINT 1594 NEXT Y1 1596 STOP 1600 FOR Y1=1 TO 8 1602 PRINT 1605 NEXT Y1 1610 PRINT B5;"COUNTYRMEN DIED IN ONE YEAR!!!!!" 1615 PRINT "DUE TO THIS EXTREME MISMANAGEMENT YOU HAVE NOT ONLY" 1620 PRINT "BEEN IMPEACHED AND THROWN OUT OF OFFICE BUT YOU" 1622 LET M6=INT(RND(1)*10) 1625 IF M6<=3 THEN 1670 1630 IF M6<=6 THEN 1680 1635 IF M6<=10 THEN 1690 1670 PRINT "ALSO HAD YOUR LEFT EYE GOUGED OUT." 1672 GOTO 1590 1680 PRINT "HAVE ALSO GAINED A VERY BAD REPUTATION." 1682 GOTO 1590 1690 PRINT "HAVE ALSO BEEN DECLARED NATIONAL FINK." 1692 GOTO 1590 1700 FOR Y1=1 TO 8 1702 PRINT 1705 NEXT Y1 1710 PRINT "OVER ONE THIRD OF THE POPULATION HAS DIED SINCE YOU" 1715 PRINT "WERE ELECTED TO OFFICE. THE PROPLE (REMAINING)" 1720 PRINT "HATE YOUR GUTS." 1730 GOTO 1570 1800 IF B5-F1<2 THEN 1515 1805 FOR Y1=1 TO 8 1807 PRINT 1810 NEXT Y1 1815 PRINT "MONEY WAS LEFT OVER IN THE TREASURY WHICH YOU DID" 1820 PRINT "NOT SPEND. AS A RESULT SOME OF YOUR COUNTRYMEN DIED" 1825 PRINT "OF STARVATION. THE PUBLIC IS ENRAGED AND YOU HAVE" 1830 PRINT "BEEN FORCED TO EITHER RESIGN OR COMMIT SUCIDE" 1835 PRINT "THE CHOICE IS YOURS." 1840 PRINT "IF YOU CHOOSE THE LATTER, PLEASE TURN OFF YOUR TTY"; 1845 PRINT " BEFORE PROCEEDING." 1850 GOTO 1590 1900 FOR Y1=1 TO 8 1902 PRINT 1905 NEXT Y1 1920 PRINT "CONGRATULATIONS!!!!!!!!!!!!!!!!!" 1925 PRINT "YOU HAVE SUCCESSFULLY COMPLETED YOUR";N5;"YEAR TERM" 1930 PRINT "OF OFFICE. YOU WERE, OF COURSE, EXTREMELY LUCKY, BUT NEVER THE" 1935 PRINT "LESS, IT'S QUITE AN ACHIEVEMENT. GOODBY AND GOOD LUCK -YOU'LL" 1940 PRINT "PROBABLY NEED IT IF YOU'RE THE TYPE THAT PLAYS THIS GAME." 1945 PRINT " -FOR FURTHER THRILLS, TRY LANDING ON THE MOON" 1950 GOTO 1590 1960 PRINT "HOW MANY YEARS HAD YOU BEEN IN OFFICE WHEN INTERRUPTED"; 1961 INPUT X5 1962 IF X5<0 THEN 1590 1963 IF X5<8 THEN 1969 1965 PRINT " COME ON, YOUR TERM OF OFFICE IS ONLY";N5;"YEARS" 1967 GOTO 1960 1969 PRINT "HOW MUCH DID YOU HAVE IN THE TREASURY"; 1970 INPUT A 1971 IF A<0 THEN 1590 1975 PRINT "HOW MANY COUNTRYMEN"; 1976 INPUT B 1977 IF B<0 THEN 1590 1980 PRINT "HOW MANY WORKERS"; 1981 INPUT C 1982 IF C<0 THEN 1590 1990 PRINT "HOW MANY SQ. MILES OF LAND"; 1991 INPUT D 1992 IF D<0 THEN 1590 1993 IF D>2000 THEN 1996 1994 IF D>1000 THEN 100 1996 PRINT " COME ON, YOU STARTED WITH 1000 SQ. MILES OF FARM LAND" 1997 PRINT " AND 1000 SQ. MILES OF FOREST LAND" 1998 GOTO 1990 2000 X5=X5+1 2020 B5=0 2040 GOTO 100 2046 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 1 REM LIFE CLARK BAKER 3/72 C.O.G. 2 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 3 X1=1\Y1=1\X2=24\Y2=70 4 PRINT "ENTER YOUR PATTERN - END BY " 5 PRINT "ANSWERING THE ? WITH THE LETTER 'Z'" 10 DIM A(24,70),B$(24,24) 40 C=1 50 INPUT B$(C)\IF SEG$(B$(C),1,1)="Z" GOTO 80 55 B$(C)=SEG$(B$(C),1,LEN(B$(C))) 60 C=C+1 70 GO TO 50 80 L=0\C=C-1 90 FOR X=1 TO C 100 IF LEN(B$(X))=<L THEN 110\L=LEN(B$(X)) 110 NEXT X 120 X1=INT(11-C/2) 130 Y1=INT(33-L/2) 140 FOR X=1 TO C 150 FOR Y=1 TO LEN(B$(X)) 160 IF SEG$(B$(X),Y,Y)=" " THEN 170\A(X1+X,Y1+Y)=1\P=P+1 170 NEXT Y 180 NEXT X 200 PRINT 210 PRINT "GENERATION:";G,"POPULATION:";P;\IF I9<>-1 GOTO 215\PRINT "INVALID!"; 215 X3=24\Y3=70\X4=1\Y4=1\P=0 220 G=G+1 225 PRINT 230 FOR X=X1 TO X2 240 PRINT 250 FOR Y=Y1 TO Y2 253 IF A(X,Y)<>2 THEN 256\A(X,Y)=0\GO TO 270 256 IF A(X,Y)<>3 THEN 260\A(X,Y)=1\GO TO 261 260 IF A(X,Y)<>1 THEN 270 261 PRINT TAB(Y);"*"; 262 IF X=>X3 GOTO 264\X3=X 264 IF X=<X4 GOTO 266\X4=X 266 IF Y=>Y3 GOTO 268\Y3=Y 268 IF Y=<Y4 GOTO 270\Y4=Y 270 NEXT Y 290 NEXT X 295 PRINT 298 PRINT 299 X1=X3\X2=X4\Y1=Y3\Y2=Y4 301 IF X1>=3 THEN 303 \ X1=3\I9=-1 303 IF X2<=22 THEN 305 \X2=22\I9=-1 305 IF Y1>=3 THEN 307 \Y1=3\I9=-1 307 IF Y2=<68 THEN 309 \ Y2=68\I9=-1 309 P=0 500 FOR X=X1-1 TO X2+1 510 FOR Y=Y1-1 TO Y2+1 520 C=0 530 FOR I=X-1 TO X+1 540 FOR J=Y-1 TO Y+1 550 IF A(I,J)<1 GOTO 560\IF A(I,J)>2 THEN 560\ C=C+1 560 NEXT J 570 NEXT I 580 IF A(X,Y)=0 THEN 610 590 IFC=3 GOTO 595\IFC=4 GOTO 595\A(X,Y)=2\GOTO 600 595 P=P+1 600 GO TO 620 610 IF C<>3 THEN 620\A(X,Y)=3\P=P+1 620 NEXT Y 630 NEXT X 635 X1=X1-1\Y1=Y1-1\X2=X2+1\Y2=Y2+1 640 GO TO 210 650 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | 1PRINT"COMPETITIVE LIFE, YOU MUST KNOW THE RULES TO PLAY" 2 REM *** WRITTEN BY BRIAN WYVILL, UNIV OF BRADFORD, ENGLAND 3 DATA 3,102,103,120,130,121,112,111,12 4 DATA 21,30,1020,1030,1011,1021,1003,1002,1012 5 DIM N1(6,6),K1(18),A1(16),X(2),Y(2) 6 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 10 FORM=1TO18\READK1(M)\NEXTM 13 DATA-1,0,1,0,0,-1,0,1,-1,-1,1,-1,-1,1,1,1 14 FORO1=1TO16\READA1(O1)\NEXTO1 20 GOTO500 50 FORJ=1TO5 51 FORK=1TO5 55 IFN1(J,K)>99 GOTO 56\GOTO 60 56 GOSUB 200 60 NEXTK 65 NEXTJ 90 LETK=0\LETM2=0\LETM3=0 99 FORJ=0TO6\PRINT 100 FORK=0TO6 101 IF J=0 GOTO 102\IF J<>6 GOTO 105 102 IFK<>6 GOTO 103\PRINT 0;\GOTO 125 103 PRINTK;\GOTO120 105 IF K=0 GOTO 106\IF K<>6 GOTO 110 106IF J<>6 GOTO 107\PRINT 0;\GOTO 126 107 PRINTJ;\GOTO120 110 GOSUB300 120 NEXTK 125 NEXTJ 126 RETURN 200 LETB=1\IFN1(J,K)=<999 GOTO 220\B=10 220 FORO1=1TO15STEP2 230 LETN1(J+A1(O1),K+A1(O1+1))=N1(J+A1(O1),K+A1(O1+1))+B 231 NEXTO1 239 RETURN 300 IFN1(J,K)<3THEN399 305 FORO1=1TO18 310 IFN1(J,K)=K1(O1)THEN350 315 NEXTO1 320 GOTO399 350 IFO1>9THEN360 351 LETN1(J,K)=100\LETM2=M2+1\PRINT" * "; 355 RETURN 360 LET N1(J,K)=1000\LET M3=M3+1\PRINT" # "; 365 RETURN 399 LETN1(J,K)=0\PRINT" ";\RETURN 500 PRINT"SET UP THE BOARD"\PRINT"AND LET'S PLAY..."\PRINT 505 LETM2=0\LETM3=0 510 FORJ=1TO5 511 FORK=1TO5 515 LETN1(J,K)=0 516 NEXTK 517 NEXTJ 519 FORB=1TO2\LETP1=3\IFB<>2 GOTO 520\P1=30 520 PRINT"PLAYER";B;"3 LIVE PIECES" 535 FORK1=1TO3\GOSUB700 540 LETN1(X(B),Y(B))=P1\NEXTK1 542 NEXTB 559 GOSUB90 560 PRINT\GOSUB50 570 IF M2<>0 GOTO 571\IFM3=0GOTO 574 571 IFM3<>0 GOTO 572\B=1\GOTO 574 572 IFM2<>0 GOTO 573\B=2\GOTO 575 573 GOTO580 574 PRINT\PRINT "A DRAW GAME"\GOTO 1 575 PRINT\PRINT "PLAYER";B;"IS THE WINNER"\RESTORE\GOTO 1 580 FORB=1TO2\PRINT\PRINT"PLAYER";B;\GOSUB700 581 IFB=99THEN560 582 NEXTB 586 LETN1(X(1),Y(1))=100\LETN1(X(2),Y(2))=1000 596 GOTO 560 700 PRINT "X,Y"\INPUT Y(B),X(B) 705 IFX(B)>5 GOTO 706\IFX(B)>0 GOTO 708 706 GOTO750 708 IFY(B)>5 GOTO 710\IF Y(B)>0 GOTO 715 710 GOTO750 715 IFN1(X(B),Y(B))<>0THEN750 720 IFB<>1 GOTO 725\RETURN 725 IF X(1)<>X(2) GOTO 730\IF Y(1)=Y(2) GOTO 740 730 RETURN 740 PRINT"SAME COORD. SET TO 0" 741 N1(X(B)+1,Y(B)+1)=0\B=99\RETURN 750 PRINT"ILLEGAL COORDS. RETYPE"\GOTO 700 900 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | MEDITERRANEAN AVENUE COMMUNITY CHEST BALTIC AVENUE INCOME TAX READING RAILROAD ORIENTAL AVENUE CHANCE ? VERMONT AVENUE CONNECTICUT AVENUE VISITING IN JAIL ST.CHARLES PLACE ELECTRIC COMPANY STATES AVENUE VIRGINIA AVENUE PENNSYLVANIA RAILROAD ST.JAMES PLACE COMMUNITY CHEST TENNESSEE AVENUE NEW YORK AVENUE FREE PARKING KENTUCKY AVENUE CHANCE ? INDIANA AVENUE ILLINOIS AVENUE B.& O. RAILROAD ATLANTIC AVENUE VENTNOR AVENUE WATER WORKS MARVIN GARDENS GO TO JAIL PACIFIC AVENUE NORTH CAROLINA AVENUE COMMUNITY CHEST PENNSYLVANIA AVENUE SHORT LINE CHANCE ? PARK PLACE LUXURY TAX BOARDWALK GO *************THIS IS MATLIDA'S MONOPOLY FOR TWO************* EACH PLAYER HAS $1500 WHEN YOU BUY HOUSES YOU HAVE TO PUT THE SAME NUMBER ON EACH MEMBER OF A COLOR GROUP WHEN YOU BUY HOUSES INPUT THE NUMBER YOU WANT PER LOT TO ROLL DICE TYPE ROLL IT IS FOR SALE FOR ONLY IF YOU WISH TO BUY IT TYPE BUY YOU ROLLED DOUBLES**ROLL AGAIN YOU ROLLED 3 SETS OF DOUBLES**GO TO JAIL IF YOU WANT TO QUIT TYPE QUIT YOU ALREADY OWN THIS PIECE OF PROPERTY IF THERE IS ANY PROPERTY YOU WISH TO SELL AND YOUR OPPONENT WANTS TO BUY TYPE SELL IF YOU NEED A LIST OF PROPERTY TYPE LIST YOU CAN'T SELL THIS**YOU DON'T OWN IT WHAT PROPERTY DO YOU WANT TO SELL IF THERE IS ANY MORE PROPERTY YOU WISH TO SELL TYPE YES IF YOU WANT TO IMPROVE YOUR PROPERTY TYPE HOUSE YOU DON'T HAVE ENOUGH MONEY FOR THAT MANY HOUSES PAY POOR TAX OF $15 ADVANCE TOKEN TO ILLINOIS AVENUE GO BACK THREE SPACES ADVANCE TO GO BANK PAYS YOU DIVIDEND OF $50 TAKE A RIDE ON THE READING GO TO JAIL BUILDING AND LOAN MATURES**COLLECT $150 ADVANCE TO BOARDWALK ADVANCE TO ST.CHARLES PLACE XMAS FUND MATURES**COLLECT $100 LIFE INSURANCE MATURES**COLLECT $100 INCOME TAX REFUND**COLLECT $20 DOCTOR'S FEE**PAY $50 YOU INHERIT $100 ADVANCE TO GO PAY HOSPITAL $100 GO TO JAIL PAY SCHOOL TAX OF $50 BANK ERROR IN YOUR FAVOR**COLLECT $200 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | 1 REM MONOPOLY GAME BY DAVID BARKER, SOUTHEASTERN STATE COLLEGE, DURANT, OK 2 REM SLIGHT PROGRAM MODIFICATIONS BY DAVID AHL, DIGITAL 3 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 4 M(1)=1500\M(2)=1500\I(1)=0\I(2)=0\DIM A$(26,21),B$(26,21),H(40) 5 DIM O$(21),G$(40,21),P$(21),L(40),P(40),R(40),C$(10,39),Z$(10,38),M$(20,60) 6 P$="HOW MANY HOUSES AT $"\O$=" EACH DO YOU WANT ON" 7 DEF FNR(H,I,Z,R)=(H(I(Z))*R(I(Z))*10) 8 FOR I=1 TO 40\L(I)=0\H(I)=0\NEXT I 9 FOR I=1 TO 8\U(I)=0\NEXT I 10 FILE #1:"RKB0:MONPLY.B1" 11 FOR I=1 TO 40\INPUT #1:G$(I)\NEXT I 12 FOR I=1 TO 20\INPUT #1:M$(I)\NEXT I 13 FOR I=1 TO 10\INPUT #1:C$(I)\NEXT I 14 FOR I=1 TO 10\INPUT #1:Z$(I)\NEXT I 15 PRINT M$(1)\PRINT\PRINT\PRINT"**RULES**"\PRINT M$(2) 16 PRINT M$(3)\PRINT M$(4)\PRINT M$(5)\CLOSE #1 17 FOR I=1 TO 40\READ P(I),R(I)\NEXT I 18 DATA 60,2,0,0,60,4,0,0,200,25,100,6,0,0,100,6,120,8,0,0 19 DATA 140,10,150,35,140,10,160,12,200,25,180,14,0,0 20 DATA 180,14,200,16,0,0,220,18,0,0,220,18,240,20,200,25 21 DATA 260,22,260,22,150,35,280,24,0,0,300,26,300,26,0,0 22 DATA 320,28,200,25,0,0,350,35,0,0,400,50,0,0 23 RESTORE 24 DIM V$(21) 25 DIM P$(20) 26 DIM N$(2,8) 30 PRINT"WHO IS PLAYER #1";\INPUT N$(1) 40 PRINT"WHO IS PLAYER #2";\INPUT N$(2) 100 PRINT\PRINT "**";N$(1);"'S TURN**********"\F=0 102 Z=1\GOSUB 1000 103 GOSUB 2000 115 IF D<>D1 GOTO 117\F=F+1\IF F=>3 GOTO 117\PRINTM$(9)\GOTO 102 117 IF F<>3 GOTO 200\PRINT M$(10)\I(Z)=10\M(Z)=M(Z)-50 200 PRINT\PRINT"**";N$(2);"'S TURN**********"\F=0 202 Z=2\GOSUB 1000 203 GOSUB 2000 215 IF D<>D1 GOTO 217\F=F+1\IF F>=3 GOTO 217\PRINTM$(9)\GOTO202 217 IF F<>3GOTO225\PRINT M$(10)\I(Z)=10\M(Z)=M(Z)-50 225 PRINT M$(11);\INPUT F$\IF F$="QUIT" THEN 30000\GOTO 100 999 REM DICE ROLL 1000 PRINT M$(6);\INPUT F$\RANDOMIZE\X=RND(0)\Y=RND(0) 1004 D=INT(X*6+1)\D1=INT(Y*6+1) 1015 PRINT "YOU ROLLED A";D;"AND A";D1\I(Z)=I(Z)+(D+D1) 1016 IF I(Z)=<40GOTO1017\I(Z)=I(Z)-40\M(Z)=M(Z)+200 1017 RETURN 1999 REM PLACEMENT 2000 PRINT"YOU ARE ON ";G$(I(Z)) 2001 REM COM CHEST 2002 IF I(Z)=2 THEN 4100\IFI(Z)=17THEN4100\IFI(Z)=33THEN4100 2003 REM INC TAX 2004 IFI(Z)<>4THEN2006\M(Z)=M(Z)-200\RETURN 2005 REM CHANCE 2006 IFI(Z)=7THEN4400\IFI(Z)=22THEN4400\IFI(Z)=36THEN4400 2007 REM VISIT IN JAIL OR FREE PARKING 2008 IFI(Z)=10THEN2014\IFI(Z)=20THEN2014 2009 REM JAIL 2010 IFI(Z)<>30THEN2011\M(Z)=M(Z)-50\I(Z)=10\RETURN 2011 IFI(Z)<>38THEN2012\M(Z)=M(Z)-75\RETURN\REM LUX TAX 2012 IFI(Z)<>40THEN2018\M(Z)=M(Z)+200\I(Z)=0\RETURN\REM GO 2014 RETURN 2018 IFL(I(Z))<>Z THEN 2019\PRINT M$(12)\GOTO 3100 2019 IFH(I(Z))<>0GOTO2020\IFL(I(Z))=<0GOTO2020\IFL(I(Z))<>ZTHEN2125 2020 IFH(I(Z))=<0GOTO2022\IFL(I(Z))=<0GOTO2022\IFL(I(Z))<>ZTHEN2100 2022 PRINT M$(7);P(I(Z));"DOLLARS" 2024 PRINT M$(8);\INPUT F$\ IF F$<>"BUY" THEN 3100 2026 M(Z)=M(Z)-P(I(Z))\PRINT "YOU NOW HAVE";M(Z);"DOLLARS" 2027 L(I(Z))=Z\GOTO 3100 2100 IF Z<>1 THEN 2101\M(Z)=M(Z)-FNR(H,I,Z,R)\M(2)=M(2)+FNR(H,I,Z,R) 2101 PRINT "YOU OWE";FNR(H,I,Z,R);"DOLLARS RENT"\RETURN 2102 IF Z<>2 THEN 2103\M(Z)=M(Z)-FNR(H,I,Z,R)\M(1)=M(1)+FNR(H,I,Z,R) 2103 PRINT "YOU OWE";FNR(H,I,Z,R);"DOLLARS RENT"\RETURN 2125 IFZ<>1 THEN 2126\M(Z)=M(Z)-R(I(Z))\M(2)=M(2)+R(I(Z)) 2126 PRINT "YOU OWE";R(I(Z));"DOLLARS RENT"\RETURN 2127 IF Z<>2 THEN 2128\M(Z)=M(Z)-R(I(Z))\M(1)=M(1)+R(I(Z)) 2128 PRINT "YOU OWE";R(I(Z));"DOLLARS RENT"\RETURN 3100 PRINT M$(13)\PRINTM$(14);\INPUTF$\IFF$="SELL"THEN3102 3101 GOTO 3105 3102 GOSUB 3150 3105 PRINTM$(19);\INPUTH$\IFH$="HOUSE"THEN3200\RETURN 3150 PRINTM$(15);\INPUTF$\IFF$<>"LIST"THEN3152\GOSUB3170 3152 PRINTM$(17);\INPUTV$\PRINT"HOW MUCH DO YOU WANT FOR IT";\INPUTV 3154 FOR I=1 TO 39 3156 IF V$<>G$(I)THEN3158\IFL(I)<>0THEN3158\PRINTM$(16)\RETURN 3158 IFV$<>G$(I)THEN3160\IFL(I)<>1THEN3160\M(1)=M(1)+V 3159 M(2)=M(2)-V\L(I)=2\GOTO 3165 3160 IF V$<>G$(I)THEN3162\IFL(I)<>2THEN3162\M(2)=M(2)+V 3161 M(1)=M(1)-V\L(I)=1\GOTO 3165 3162 NEXT I 3165 PRINT M$(18);\INPUT F$\IFF$="YES"THEN 3152\RETURN 3170 C=0\D=0 3171 FOR I=1 TO 39 3172 IFL(I)<>1THEN 3174\C=C+1\A$(C)=G$(I) 3174 IFL(I)<>2 THEN 3175\D=D+1\B$(D)=G$(I) 3175 NEXT I 3176 PRINT N$(1);"'S PROPERTY" 3177 FOR I=1 TO C\PRINT A$(I)\NEXT I 3178 PRINT N$(2);"'S PROPERTY" 3180 FOR I=1 TO D\PRINT B$(I)\NEXT I 3182 RETURN 3200 IFL(1)<>ZTHEN3202\IFL(3)<>ZTHEN3202\PRINTP$;"50";O$ 3201 PRINT G$(1);" ";G$(3);\INPUT U\GOSUB 3250 3202 IFL(6)<>ZGOTO3204\IFL(8)<>ZGOTO3204\IFL(9)<>ZGOTO3204 3203 PRINTP$;"50";O$\PRINTG$(6);" ";G$(8);" ";G$(9);\INPUTU\GOSUB3254 3204 IFL(11)<>ZGOTO3206\IFL(13)<>ZGOTO3206\IFL(14)<>ZGOTO3206 3205PRINTP$;"100";O$\PRINTG$(11);" ";G$(13);" ";G$(14);\INPUTU\GOSUB3258 3206 IFL(16)<>ZGOTO3208\IFL(18)<>ZGOTO3208\IFL(19)<>ZGOTO3208 3207PRINTP$;"100";O$\PRINTG$(16);" ";G$(18);" ";G$(19);\INPUTU\GOSUB3262 3208IFL(21)<>ZGOTO3210\IFL(23)<>ZGOTO3210\IFL(24)<>ZGOTO3210 3209PRINTP$;"150";O$\PRINTG$(21);" ";G$(23);" ";G$(24);\INPUTU\GOSUB3266 3210IFL(26)<>ZGOTO3212\IFL(27)<>ZGOTO3212\IFL(29)<>ZGOTO3212 3211PRINTP$;"150";O$\PRINTG$(26);" ";G$(27);" ";G$(29);\INPUTU\GOSUB3270 3212IFL(31)<>ZGOTO3214\IFL(32)<>ZGOTO3214\IFL(34)<>ZGOTO3214 3213PRINTP$;"200";O$\PRINTG$(31);" ";G$(32);" ";G$(34);\INPUTU\GOSUB3274 3214IFL(37)<>ZGOTO3220\IFL(39)<>ZGOTO3220\PRINTP$;"200";O$ 3215PRINTG$(37);" ";G$(39);\INPUTU\GOSUB3278 3220 RETURN 3250U(1)=U(1)+U\M(Z)=M(Z)-(U*100)\IFM(Z)=>0THEN3252\PRINTM$(20) 3251 M(Z)=M(Z)+(U*100)\U(1)=U(1)-U\RETURN 3252 H(1)=U(1)\H(3)=U(1)\RETURN 3254U(2)=U(2)+U\M(Z)=M(Z)-(U*150)\IFM(Z)=>0THEN3256\PRINTM$(20) 3255 M(Z)=M(Z)+(U*150)\U(2)=U(2)-U\RETURN 3256 H(6)=U(2)\H(8)=U(2)\H(9)=U(2)\RETURN 3258U(3)=U(3)+U\M(Z)=M(Z)-(U*150)\IFM(Z)=>0THEN3260\PRINTM$(20) 3259 M(Z)=M(Z)+(U*150)\U(3)=U(3)-U\RETURN 3260 H(11)=U(3)\H(13)=U(3)\H(14)=U(3)\RETURN 3262U(4)=U(4)+U\M(Z)=M(Z)-(U*300)\IFM(Z)=>0THEN3264\PRINTM$(20) 3263 M(Z)=M(Z)+(U*300)\U(4)=U(4)-U\RETURN 3264 H(16)=U(4)\H(18)=U(4)\H(19)=U(4)\RETURN 3266U(5)=U(5)+U\M(Z)=M(Z)-(U*450)\IFM(Z)=>0THEN3268\PRINTM$(20) 3267 M(Z)=M(Z)+(U*450)\U(5)=U(5)-U\RETURN 3268 H(21)=U(5)\H(23)=U(5)\H(24)=U(5)\RETURN 3270U(6)=U(6)+U\M(Z)=M(Z)-(U*450)\IFM(Z)=>0THEN3272\PRINTM$(20) 3271M(Z)=M(Z)+(U*450)\U(6)=U(6)-U\RETURN 3272 H(26)=U(6)\H(27)=U(6)\H(29)=U(6)\RETURN 3274U(7)=U(7)+U\M(Z)=M(Z)-(U*600)\IFM(Z)=>0THEN3276\PRINTM$(20) 3275 M(Z)=M(Z)+(U*600)\U(7)=U(7)-U\RETURN 3276 H(31)=U(7)\H(32)=U(7)\H(34)=U(7)\RETURN 3278U(8)=U(8)+U\M(Z)=M(Z)-(U*400)\IFM(Z)=>0THEN3280\PRINTM$(20) 3279 M(Z)=M(Z)+(U*400)\U(8)=U(8)-U\RETURN 3280 H(37)=U(8)\H(39)=U(8)\RETURN 3900 REM COMMUNITY CHEST 4100 RANDOMIZE\L=RND(0) 4102 IF L>.1 THEN 4104\PRINTZ$(1)\M(Z)=M(Z)+100\RETURN 4104 IF L>.2 THEN 4106\PRINTZ$(2)\M(Z)=M(Z)+100\RETURN 4106 IF L>.3 THEN 4108\PRINTZ$(3)\M(Z)=M(Z)+20\RETURN 4108 IF L>.4 THEN 4110\PRINTZ$(4)\M(Z)=M(Z)-50\RETURN 4110 IF L>.5 THEN 4112\PRINTZ$(5)\M(Z)=M(Z)+100\RETURN 4112 IF L>.6 THEN 4114\PRINTZ$(6)\M(Z)=M(Z)+200\I(Z)=0\RETURN 4114 IF L>.7 THEN 4116\PRINTZ$(7)\M(Z)=M(Z)-100\RETURN 4116 IF L>.8 THEN 4118\PRINTZ$(8)\M(Z)=M(Z)-50\I(Z)=10\RETURN 4118 IF L>.9 THEN 4120\PRINTZ$(9)\M(Z)=M(Z)-50\RETURN 4120 PRINT Z$(10)\M(Z)=M(Z)+200\RETURN 4300 REM CHANCE 4400 RANDOMIZE\L=RND(0) 4402 IF L>.1 THEN 4404\PRINTC$(1)\M(Z)=M(Z)-15\RETURN 4404 IF L>.2 THEN 4406\PRINTC$(2)\I(Z)=24\GOSUB 2000 4405 RETURN 4406 IF L>.3 THEN 4408\PRINTC$(3)\I(Z)=I(Z)-3\GOSUB 2000 4407 RETURN 4408 IF L>.4 THEN 4410\PRINTC$(4)\I(Z)=0\M(Z)=M(Z)+200\RETURN 4410 IF L>.5 THEN 4412\PRINTC$(5)\M(Z)=M(Z)+50\RETURN 4412 IF L>.6 THEN 4414\PRINTC$(6)\I(Z)=5\M(Z)=M(Z)+200\GOSUB2000 4413 RETURN 4414 IF L>.7 THEN 4416\PRINTC$(7)\I(Z)=10\M(Z)=M(Z)-50\RETURN 4416 IF L>.8 THEN 4418\PRINTC$(8)\M(Z)=M(Z)+150\RETURN 4418 IF L>.9 THEN 4420\PRINTC$(9)\I(Z)=39\GOSUB 2000 4419 RETURN 4420 PRINTC$(10)\I(Z)=11\GOSUB 2000 4421 RETURN 30000 C=0\D=0 30002 FOR I=1 TO 39 30004 IF L(I)<>1 THEN 30006\C=C+1\A$(C)=G$(I) 30006 IF L(I)<>2 THEN 30007\D=D+1\B$(D)=G$(I) 30007 NEXT I\PRINT \PRINT 30008 PRINT N$(1);" OWNED THE FOLLOWING PROPERTY" 30009 FOR I=1 TO C\PRINTA$(I)\NEXT I 30010 PRINT "AND HAD";M(1);"DOLLARS AT THE END OF THE GAME" 30011 PRINT N$(2);" OWNED THE FOLLOWING PROPERTY" 30012 FOR I=1 TO D\PRINT B$(I)\NEXT I 30013 PRINT "AND HAD";M(2);"DOLLARS AT THE END OF THE GAME" 30020 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 | 1 DIM A(50),B(15) 2 DEF FNA(X)=INT(10*RND(X)) 3 DEF FNB(X)=X-100*INT(X/100) 4 PRINT "WELCOME TO THE HALLDEN CASINO. WE EACH HAVE $200" 5 PRINT "I WILL OPEN THE BETTING BEFORE THE DRAW; YOU OPEN AFTER" 6 PRINT "WHEN YOU FOLD, BET 0; TO CHECK, BET .5" 7 PRINT "ENOUGH TALK -- LET'S GET DOWN TO BUSINESS" 8 PRINT 9 LET O=1 10 LET C=200 11 LET S=200 12 LET P=0 14 PRINT 15 IF C<=5 THEN 367 16 PRINT "THE ANTE IS $5. I WILL DEAL" 17 PRINT 18 IF S>5 THEN 20 19 GOSUB 383 20 LET P=P+10 21 LET S=S-5 22 LET C=C-5 23 FOR Z=1 TO 10 24 GOSUB 174 25 NEXT Z 26 PRINT "YOUR HAND:" 27 LET N=1 28 GOSUB 185 29 LET N=6 30 LET I=2 31 GOSUB 217 32 PRINT 33 IF I<>6 THEN 47 34 IF FNA (0)<=7 THEN 37 35 LET X=11100 36 GOTO 42 37 IF FNA (0)<=7 THEN 40 38 LET X=11110 39 GOTO 42 40 IF FNA (0)>=1 THEN 45 41 LET X=11111 42 LET I=7 43 LET Z=23 44 GOTO 58 45 LET Z=1 46 GOTO 51 47 IF U>=13 THEN 54 48 IF FNA (0)>=2 THEN 50 49 GOTO 42 50 LET Z=0 51 LET K=0 52 PRINT "I CHECK" 53 GOTO 62 54 IF U<=16 THEN 57 55 LET Z=2 56 IF FNA (0)>=1 THEN 58 57 LET Z=35 58 LET V=Z+FNA(0) 59 GOSUB 348 60 PRINT "I'LL OPEN WITH ";V 61 LET K=V 62 GOSUB 305 63 GOSUB 65 64 GOTO 82 65 IF I<>3 THEN 76 66 PRINT 67 PRINT "I WIN" 68 LET C=C+P 69 PRINT "NOW I HAVE $";C;"AND YOU HAVE $";S 70 PRINT "DO YOU WISH TO CONTINUE"; 71 INPUT H$ 72 IF H$="YES" THEN 12 73 IF H$="NO" THEN 410 74 PRINT "ANSWER YES OR NO" 75 GOTO 70 76 IF I<>4 THEN 81 77 PRINT 78 PRINT "YOU WIN" 79 LET S=S+P 80 GOTO 69 81 RETURN 82 PRINT 83 PRINT "NOW WE DRAW -- HOW MANY CARDS DO YOU WANT"; 84 INPUT T 85 IF T=0 THEN 98 86 LET Z=10 87 IF T<4 THEN 90 88 PRINT "YOU CAN'T DRAW MORE THAN THREE CARDS" 89 GOTO 84 90 PRINT "WHAT ARE THEIR NUMBERS" 91 FOR Q=1 TO T 92 INPUT U 93 GOSUB 173 94 NEXT Q 95 PRINT "YOUR NEW HAND:" 96 LET N=1 97 GOSUB 185 98 LET Z=10+T 99 FOR U=6 TO 10 100 IF INT(X/10^(U-6))<>10*INT(X/10^(U-5)) THEN 102 101 GOSUB 173 102 NEXT U 103 PRINT 104 PRINT "I AM TAKING ";Z-10-T;"CARD" ; 105 IF Z=11+T THEN 109 106 PRINT "S" 107 PRINT 108 GOTO 110 109 PRINT 110 LET N=6 111 LET V=I 112 LET I=1 113 GOSUB 217 115 LET M=D 116 IF V<>7 THEN 119 117 LET Z=28 118 GOTO 133 119 IF I<>6 THEN 122 120 LET Z=1 121 GOTO 133 122 IF U>=13 THEN 127 123 LET Z=2 124 IF FNA (0)<>6 THEN 126 125 LET Z=19 126 GOTO 133 127 IF U>=16 THEN 132 128 LET Z=19 129 IF FNA (0)<>8 THEN 131 130 LET Z=11 131 GOTO 133 132 LET Z=2 133 LET K=0 134 GOSUB 305 135 IF T<>.5 THEN 145 136 IF V=7 THEN 140 137 IF I<>6 THEN 140 138 PRINT "I'LL CHECK" 139 GOTO 146 140 LET V=Z+FNA(0) 141 GOSUB 348 142 PRINT "I'LL BET ";V 143 LET K=V 144 GOSUB 306 145 GOSUB 65 146 PRINT 147 PRINT "NOW WE COMPARE HANDS" 148 LET J$=H$ 149 LET K$=I$ 150 PRINT "MY HAND:" 151 LET N=6 152 GOSUB 185 153 LET N=1 154 GOSUB 217 155 PRINT 156 PRINT "YOU HAVE "; 157 LET K=D 158 GOSUB 369 159 LET H$=J$ 160 LET I$=K$ 161 LET K=M 162 PRINT "AND I HAVE "; 163 GOSUB 369 164 IF R>U THEN 67 165 IF U>R THEN 78 166 IF H$="A FLUS" THEN 170 167 PRINT "THE HAND IS DRAWN" 168 PRINT "ALL $";P;" REMAIN IN THE POT" 169 GOTO 14 170 IF FNB (M)>FNB (D) THEN 67 171 IF FNB (D)>FNB (M) THEN 78 172 GOTO 167 173 LET Z=Z+1 174 LET A(Z)=INT(1000*RND(0)) 175 IF INT(A(Z)/100)>3 THEN 174 176 IF A(Z)-100*INT(A(Z)/100)>12 THEN 174 177 FOR K=1 TO Z-1 178 IF A(Z)=A(K) THEN 174 179 NEXT K 180 IF Z<=10 THEN 184 181 LET N=A(U) 182 LET A(U)=A(Z) 183 LET A(Z)=N 184 RETURN 185 FOR Z=N TO N+4 186 PRINT Z;"-- "; 187 GOSUB 195 188 PRINT " OF"; 189 GOSUB 207 190 IF Z/2<>INT(Z/2) THEN 192 191 PRINT 192 NEXT Z 193 PRINT 194 RETURN 195 LET K=FNB (A(Z)) 196 IF K<>9 THEN 198 197 PRINT "JACK"; 198 IF K<>10 THEN 200 199 PRINT "QUEEN"; 200 IF K<>11 THEN 202 201 PRINT "KING"; 202 IF K<>12 THEN 204 203 PRINT "ACE"; 204 IF K>=9 THEN 206 205 PRINT K+2; 206 RETURN 207 LET K=INT(A(Z)/100) 208 IF K<>0 THEN 210 209 PRINT " CLUBS", 210 IF K<>1 THEN 212 211 PRINT " DIAMONDS", 212 IF K<>2 THEN 214 213 PRINT " HEARTS", 214 IF K<>3 THEN 216 215 PRINT " SPADES", 216 RETURN 217 LET U=0 218 FOR Z=N TO N+4 219 LET B(Z)=FNB(A(Z)) 220 IF Z=N+4 THEN 223 221 IF INT(A(Z)/100) <>INT(A(Z+1)/100) THEN 223 222 LET U=U+1 223 NEXT Z 224 IF U<>4 THEN 231 225 LET X=11111 226 LET D=A(N) 227 LET H$="A FLUS" 228 LET I$="H IN" 229 LET U=15 230 RETURN 231 FOR Z=N TO N+3 232 FOR K=Z+1 TO N+4 233 IF B(Z)<=B(K) THEN 239 234 LET X=A(Z) 235 LET A(Z)=A(K) 236 LET B(Z)=B(K) 237 LET A(K)=X 238 LET B(K)=A(K)-100*INT(A(K)/100) 239 NEXT K 240 NEXT Z 241 LET X=0 242 FOR Z=N TO N+3 243 IF B(Z)<>B(Z+1) THEN 247 244 LET X=X+11*10^(Z-N) 245 LET D=A(Z) 246 GOSUB 276 247 NEXT Z 248 IF X<>0 THEN 262 249 IF B(N)+3<>B(N+3) THEN 252 250 LET X=1111 251 LET U=10 252 IF B(N+1)+3<>B(N+4) THEN 262 253 IF U<>10 THEN 260 254 LET U=14 255 LET H$="STRAIG" 256 LET I$="HT" 257 LET X=11111 258 LET D=A(N+4) 259 RETURN 260 LET U=10 261 LET X=11110 262 IF U>=10 THEN 269 263 LET D=A(N+4) 264 LET H$="SCHMAL" 265 LET I$="TZ, " 266 LET U=9 267 LET X=11000 268 GOTO 274 269 IF U<>10 THEN 272 270 IF I=1 THEN 274 271 GOTO 275 272 IF U>12 THEN 275 273 IF FNB(D)>6 THEN 275 274 LET I=6 275 RETURN 276 IF U>=11 THEN 281 277 LET U=11 278 LET H$="A PAIR" 279 LET I$=" OF " 280 RETURN 281 IF U<>11 THEN 291 282 IF B(Z)<>B(Z-1) THEN 287 283 LET H$="THREE" 284 LET I$=" " 285 LET U=13 286 RETURN 287 LET H$="TWO P" 288 LET I$="AIR, " 289 LET U=12 290 RETURN 291 IF U<>12 THEN 296 292 LET U=16 293 LET H$="FULL H" 294 LET I$="OUSE, " 295 RETURN 296 IF B(Z)<>B(Z-1) THEN 301 297 LET U=17 298 LET H$="FOUR" 299 LET I$=" " 300 RETURN 301 LET U=16 302 LET H$="FULL H" 303 LET I$="OUSE, " 304 RETURN 305 LET G=0 306 PRINT "WHAT IS YOUR BET"; 307 INPUT T 308 IF T-INT(T)=0 THEN 314 309 IF K<>0 THEN 312 310 IF G<>0 THEN 312 311 IF T=.5 THEN 341 312 PRINT "NO SMALL CHANGE, PLEASE" 313 GOTO 306 314 IF S-G-T>=0 THEN 317 315 GOSUB 383 316 GOTO 306 317 IF T<>0 THEN 320 318 LET I=3 319 GOTO 338 320 IF G+T>=K THEN 323 321 PRINT "IF YOU CAN'T SEE MY BET, THEN FOLD" 322 GOTO 306 323 LET G=G+T 324 IF G=K THEN 338 325 IF Z<>1 THEN 342 326 IF G>5 THEN 330 327 IF Z>=2 THEN 335 328 LET V=5 329 GOTO 342 330 IF Z=1 THEN 332 331 IF T<=25 THEN 335 332 LET I=4 333 PRINT "I FOLD" 334 RETURN 335 IF Z=2 THEN 343 336 PRINT "I'LL SEE YOU" 337 LET K=G 338 LET S=S-G 339 LET C=C-K 340 LET P=P+G+K 341 RETURN 342 IF G>3*Z THEN 335 343 LET V=G-K+FNA(0) 344 GOSUB 348 345 PRINT "I'LL SEE YOU, AND RAISE YOU ";V 346 LET K=G+V 347 GOTO 306 348 IF C-G-V>=0 THEN 366 349 IF G<>0 THEN 352 350 LET V=C 351 RETURN 352 IF C-G>=0 THEN 336 353 IF O/2<>INT(O/2) THEN 360 354 PRINT "WOULD YOU LIKE TO BUY BACK YOUR WATCH FOR $50"; 355 INPUT J$ 356 IF J$="NO" THEN 360 357 LET C=C+50 358 LET O=O/2 359 RETURN 360 IF O/3<>INT(O/3) THEN 367 361 PRINT "WOULD YOU LIKE TO BUY BACK YOUR TIE TACK FOR $50"; 362 INPUT J$ 363 IF J$="NO" THEN 367 364 LET C=C+50 365 LET O=O/3 366 RETURN 367 PRINT "I'M BUSTED. CONGRATULATIONS" 368 STOP 369 PRINT H$;I$; 370 IF H$<>"A FLUS" THEN 375 371 LET K=INT(K/100) 372 GOSUB 208 373 PRINT 374 RETURN 375 LET K=FNB(K) 376 GOSUB 196 377 IF H$="SCHMAL" THEN 379 378 IF H$<>"STRAIG" THEN 381 379 PRINT " HIGH" 380 RETURN 381 PRINT "S" 382 RETURN 383 PRINT 384 PRINT "YOU CAN'T BET WHAT YOU HAVEN'T GOT" 385 IF O/2=INT(O/2) THEN 397 386 PRINT "WOULD YOU LIKE TO SELL YOUR WATCH"; 387 INPUT J$ 388 IF J$="NO" THEN 397 389 IF FNA(0)>=7 THEN 393 390 PRINT "I'LL GIVE YOU $75 FOR IT" 391 LET S=S+75 392 GOTO 395 393 PRINT "THAT'S A PRETTY CRUMMY WATCH - I'LL GIVE YOU $25" 394 LET S=S+25 395 LET O=O*2 396 RETURN 397 IF O/3=INT(O/3) THEN 409 398 PRINT "WILL YOU PART WITH THAT DIAMOND TIE TACK"; 399 INPUT J$ 400 IF J$="NO" THEN 408 401 IF FNA(0)>=6 THEN 405 402 PRINT "YOU ARE NOW $100 RICHER" 403 LET S=S+100 404 GOTO 407 405 PRINT "IT'S PASTE. $25" 406 LET S=S+25 407 LET O=O*3 408 RETURN 409 PRINT "YOUR WAD IS SHOT. SO LONG, SUCKER" 410 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | # BASIC Games and Demos When this package is installed, the files are found on the `DSK:` partition of the bootable image. Many of them were ported to OS/8 BASIC by DEC employee Kay R. Fisher. Most were published in the DEC publication, *101 BASIC Computer Games*. That book describes itself as follows: >It is the first collection of games all in BASIC. It is also the only collection that contains both a complete listing and a sample run of each game along with a descriptive write-up. The first printing was in 1973. Apparently the original version of the programs were in PDP-11 RSTS BASIC, so porting to the OS/8 BASIC dialect would often be needed. A quite readable preserved version of the 1975 edition can be [found online][book]. If a demo is from this book, it is designated `-101-` instead of `-----` below. The book provides a page or two of useful lore, and a sample run. This file provides usage, history, and ongoing curation information about the items in this package. (An HTML table is used instead of a markdown table to take greater control of the display of the information.) [book]: http://bitsavers.trailing-edge.com/pdf/dec/_Books/101_BASIC_Computer_Games_Mar75.pdf <table> <tr><th>File name</th><th>Src</th><th>Description</th></tr> <tr><td><tt>BINGO .BA</tt></td><td>-101-</td><td>Computer generates bingo card for you and itself and calls out numbers at random.</td></tr> <tr><td><tt>BLKJAC.BA</td></td><td>-101-</td><td>Play the card game of 21 against the computer.</td></tr> <tr><td><tt>BLKJAK.BA</td></td><td>-101-</td><td>Blackjack written for PDP-8 Edusystem 30 BASIC by Tom Kloos, Oregon Museum of Science and Industry.</td></tr> <tr><td><tt>BUNNY .BA</td></td><td>-101-</td><td>Prints the Playboy rabbit as typewriter art.</td></tr> <tr><td><tt>CALNDR.BA</td></td><td>-101-</td><td>Perpetual calendar program, by Geoffrey Chase, OSB, Portsmouth Abbey School.<br><b>Usage: </b>You must modify line 160 to name the day of the week for January 1 of your year. (0 for Sunday, -1 for Monday, etc.). You also need to modify lines 360 and 620 for leap years: Change the number 365 on line 360 to 366, and change the third element of the array in line 620 from 28 to 29. </td></tr> <tr><td><tt>CHECKR.BA</td></td><td>-101-</td><td>Written by Alan J. Segal. Play checkers against the computer.</td></tr> <tr><td><tt>CRAPS .BA</td></td><td>-----</td><td>The dice game of craps. Surprisingly it's not the version from <i>101 BASIC Computer Games</i>.</td></tr> <tr><td><tt>DICE .BA</td></td><td>-101-</td><td>Simulates rolling of dice, and prints the distribution of values returned.</td></tr> <tr><td><tt>FOOTBL.BA</td></td><td>-101-</td><td>The first of two football simulations from <i>101 BASIC Computer Games</i>.</td></tr> <tr><td><tt>FOTBAL.BA</td></td><td>-101-</td><td>The other football game from *101 BASIC GAMES* by Raymond W. Miseyka, Butler Sr. High School, Butler, PA.</td></tr> <tr><td><tt>GOLF .BA</td></td><td>-----</td><td>A not so great golf simulation. The one in <i>101 BASIC Computer Games</i> looks a lot better.</td></tr> <tr><td><tt>HELLO .BA</td></td><td>-101-</td><td>Simple conversation program where Petey P. Eight gives advice.</td></tr> <tr><td><tt>HOCKEY.BA</td></td><td>-101-</td><td>Simulation of regulation hockey game. Written by Charles Buttrey, Eaglebrook School, Deerfield, MA .</td></tr> <tr><td><tt>KING .BA</td></td><td>-101-</td><td>Land management simulation by James A. Storer, Lexington High School, Lexington, MA. Missing a bit of the text output in the game published in the 1975 edition of <i>101 BASIC Computer Games</i>, but functionally equivalent.</td></tr> <tr><td><tt>LIFE .BA</td></td><td>-101-</td><td>Conway's game of life by Clark Baker, Project DELTA, Delaware School Auxiliary Assoc., Newport, Delaware.</td></tr> <tr><td><tt>LIFE2 .BA</td></td><td>-101-</td><td>Two players put pieces on the board. Rules of Conway's game of life determines survivor. Written by Brian Wyvill, Bradford University, Bradford, Yorkshire, England.</td></tr> <tr><td><tt>MONPLY.BA</td></td><td>-101-</td><td>Monopoly board game simulation, by David Barker, Southeastern State College, Durant, OK. Ported to OS/8 BASIC by Kay R. Fisher who eliminated the original RSTS-E virtual files.</td></tr> <tr><td><tt>POKER .BA</td></td><td>-101-</td><td>Play poker against the computer. Original author: A. Christopher Hall, Trinity College, Hartford, CT. Re-ported to OS/8 BASIC from <a href="https://amaus.org/static/S100/MESSAGE%20BOARDS/CPM%20Users%20Group/cpmug020/POKER.BAS">CPM Users Group POKER.BAS</a> source by Bill Cattey fixing constructs OS/8 BASIC didn't like. </td></tr> <tr><td><tt>RESEQ.BA</td></td><td>-----</td><td>Re-sequence line numbers of a BASIC program. Not from the DEC BASIC book.</td></tr> <tr><td><tt>ROCKET.BA</td></td><td>-101-</td><td>Lunar lander simulation. Written by Jim Storer, Lexington High School. Ported from Focal by David Ahl, Digital. Lost for a while due to bad disk bits. Using a partial copy from <a href="http://www.pdp8online.com/pdp8cgi/os8_html/ROCKET.BA?act=file;fn=images/os8/diag-games-kermit.rk05;blk=561,9,1;to=ascii">Dave Gesswein's Archive</a>, a RSTS-11 version was found at <a href="http://pdp-11.trailing-edge.com/rsts11/rsts-11-013/ROCKET.BAS">pdp-11.trailing-edge.com</a> and re-ported to OS/8 by Bill Cattey, converting RSTS BASIC constructs to OS/8 constructs, and eliminating ON ERROR GOTO that does not exist in OS/8. This code diverged significantly from the version appearing in <i>101 BASIC Computer Games</i>, but is functionally equivalent. </td></tr> <tr><td><tt>ROCKT1.BA</td></td><td>-101-</td><td>Another Lunar Lander Simulator. Written by Eric Peters, Digital. Thought lost. Recovered from <a href="http://www.pdp8online.com/pdp8cgi/os8_html/ROCKT1.BA?act=file;fn=images/os8/diag-games-kermit.rk05;blk=570,8,1;to=auto">Dave Gesswein's Archive</a>.</td></tr> <tr><td><tt>ROULET.BA</td></td><td>-----</td><td>European Roulette Wheel game. Written by David Joslin. Converted to BASIC-PLUS by David Ahl, Digital. Ported to OS/8 BASIC By Kay R. Fisher, DEC. Thought lost. Recovered from <a href="http://www.pdp8online.com/pdp8cgi/os8_html/ROULET.BA?act=file;fn=images/os8/diag-games-kermit.rk05;blk=578,17,1;to=auto">Dave Gesswein's Archive.</td></tr> <tr><td><tt>SIGNS .BA</td></td><td>-----</td><td>Program to print posters by Daniel R. Vernon, Butler High School, Butler PA.<br><b>Usage: </b>When tested the under OS/8 BASIC we get <tt>SU AT LINE 00261</tt> which is a Subscript out of Bounds error.</td></tr> <tr><td><tt>SNOOPY.BA</td></td><td>-----</td><td>The old <i>Curse You Red Barron</i> Snoopy poster.</td></tr> <tr><td><tt>SPACWR.BA</td></td><td>-101-</td><td>Space war game based on classic Star Trek. Game written by Mike Mayfield, Centerline Engineering.</td></tr> <tr><td><tt>TICTAC.BA</td></td><td>-----</td><td>Play tic-tac-toe with the computer. Simple version. Thought lost. Recovered from <a href="http://www.pdp8online.com/pdp8cgi/os8_html/TICTAC.BA?act=file;fn=images/os8/diag-games-kermit.rk05;blk=595,7,1;to=auto">Dave Gesswein's Archive.</td></tr> <tr><td><tt>WAR.BA</td></td><td>-101-</td><td>Play the game of war against the computer. Was thought lost. Recovered from [Dave Gesswein's Archive](). However, that port to OS/8 BASIC contained a bug and could never run. Line 230 defines the array for the cards. In OS/8 BASIC the maximum string size needed to be specified, as well as the number of strings. `230 DIM A$(52,3),L(54)` will not accomodate the 10-value card. The 3 needed to be a 4. Program fixed and run-tested.</td></tr> <tr><td><tt>WAR2.BA</td></td><td>-101-</td><td>Deploy 72,000 soldiers to Army, Navy, and Air Force against the computer. Written by Bob Dores, Milton, MA.</td></tr> <tr><td><tt>WEKDAY.BA</td></td><td>-101-</td><td>Input a birth date and learn fun facts about happenings in the elapsed time. Written by Tom Kloos, Oregon Museum of Science and 'Industry.</td></tr> <tr><td><tt>WUMPUS.BA</td></td><td>-----</td><td>Hunt the wumpus.</td></tr> <tr><td><tt>YAHTZE.BA</td></td><td>-101-</td><td>Dice game of Yahtze. Author unknown. Quite an elaborate and comprehensive implementation.</td></tr> </table> ## License Copyright © 2017-2020 by Bill Cattey. This document is licensed under the terms of [the SIMH license][sl]. [sl]: https://tangentsoft.com/pidp8i/doc/trunk/SIMH-LICENSE.md |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | 1 REM *** WRITTEN BY JIM STORER, LEXINGTON HS 2 REM *** CONVERTED FROM FOCAL TO BASIC BY DAVID AHL, DIGITAL 3 REM *** PORTED TO OS/8 BASIC BY BILL CATTEY USING SALVAGED BITS. 4 REM COLON BECOMES BACKSLASH FOR MULITI COMMAND LINES. 5 REM LEFT(R$,1) BECOMES SEG$(R$,1,1) IN LINE 592 6 REM NO "ELSE" SO LINE 593 BECOMES 3 IF STATEMENTS 10REM LUNAR MODULE PROGRAM "ROCKET" 20 PRINT\PRINT\PRINT "CONTROL CALLING LUNAR MODULE.."\PRINT 35PRINT"YOU MAY SET THE FUEL RATE (K) TO ZERO OR ANY VALUE" 40PRINT"BETWEEN 8 AND 200 LBS PER SECOND. A NEGATIVE FUEL" 50 PRINT "RATE WILL ABORT THE LANDING, UNLESS THE RATE" 55 PRINT "IS -2, IN WHICH CASE THE CURRENT POSITION IS " 57 PRINT "SAVED FOR LATER RECALL UPON RESTART." \ PRINT 60PRINT"YOU HAVE 16000 LBS OF FUEL." 70PRINT"ESTIMATED FREE FALL IMPACT TIME IS 120 SECONDS." 80PRINT"CAPSULE WEIGHT IS 32,500 LBS." 90 PRINT\PRINT "FIRST RADAR CHECK COMING UP..." 100 PRINT "BEGIN LANDING PROCEDURE"\PRINT\PRINT 110PRINT"TIME(SECS)","HEIGHT(MI)","VELOCITY(MPH)","FUEL(LBS)","FUEL RATE" 120 LET L=0\LET A=120\LET V=1\LET M=32500\LET N=16500 170 LET G=.001\LET Z=1.8 210 PRINT INT(L+.5),A,V*3600,M-N,"K"; 220 INPUT K 225 LET T=10 227 IF K <> -2 THEN 230 228 M1=M \ L1=L \ V1=V \ A1=A \ PRINT "SAVED YOUR POSITION" \ GOTO 220 230 IF K<0 GO TO 590 235 IF K=0 GOTO 310 240 IF K<8 THEN 260 250 IF K<=200 GO TO 310 260 PRINT "NOT POSSIBLE",,,,"K"; 270 INPUT K \ GOTO 230 310 IF M-N-.001 <=0 GOTO410 320 IF T<.001 GOTO 210 330 LET S=T\IF N+S*K<=M GO TO 350 340 LET S=(M-N)/K 350 LET I0=1 \ GOTO 900 360 IF I <= 0 GOT O 710 370 IF V<=0 GO TO 380 375 IF J<0 GOTO 810 380 LET I0=1\GOTO600 410 PRINT"FUEL OUT AT ";L;"SECS." 420 LET S=(-V+SQR(V*V+2*A*G))/G 430 LET V = V+G*S 440 LET L=L+S 510 PRINT"ON THE MOON AT ";L;"SECS." 511 LET W = 3600*V 514 PRINT "IMPACT VELOCITY OF ";W;"M.P.H." 520 PRINT "FUEL LEFT ";M-N;"LBS." 530 IF W>=1 GOTO 550 540 PRINT "PERFECT LANDING! CONGRATULATIONS!!"\ GOTO 590 550 IF W >=10 THEN 560 552 PRINT "VERY GOOD LANDING, NOT PERFECT YET."\GOTO590 560 IF W >= 25 THEN 570 562 PRINT "A FAIR LANDING, NO CRAFT DAMAGE."\GOTO590 570 IF W >= 60 THEN580 572 PRINT "CRAFT DAMAGE -- BETTER LUCK NEXT TIME."\GOTO 590 580 PRINT "SORRY, BUT THERE WERE NO SURVIVORS." 585 PRINT "IN FACT YOU BLASTED A NEW LUNAR CRATER ";W*.277777;" FEET DEEP." 590 PRINT\PRINT\PRINT "TRY AGAIN? (Y,N,RESTART, OR LOW WINDOW)"; 592 INPUT R$\ R$=SEG$(R$,1,1) 593 IF R$="Y" THEN 90 \ IF R$="R" THEN 1200 \ IF R$="L" THEN 1100 595 PRINT\ PRINT "CONTROL OUT" \ GOTO 1800 600 LET L=L+S 610 LET T = T-S 620 LET M=M-S*K 630 LET A=I 640 LET V=J 650 IF I0=1 GO TO 310 660 IF I0=3 GO TO 850 710 IF S< .005 GO TO 510 720 LET S= 2*A/(V+SQR(V*V+2*A*(G-Z*K/M))) 730 LET I0=2 \GOTO 900 810 LET W=(1-M*G/(Z*K))/2 820 LET S=M*V/(Z*K*(W+SQR(W*W+V/Z)))+.05 825 LET I0=3 \GOTO 900 830 IF I<=0 THEN 710 840 GOTO 600 850 IF J>=0 THEN 310 860 IF V<=0 GO TO 310 870 GOTO 810 900 LET Q=S*K/M 905 IF Q<=0 THEN 1000 910 LET J=V+G*S+Z*(-Q-(Q^2)/2-(Q^3)/3-(Q^4)/4-(Q^5)/5) 920 LET I=A-G*S*S/2-V*S+Z*S*(Q/2+Q^2/6+Q^3/12+Q^4/20+Q^5/30) 930 IF I0=1 GOTO 360 940 IF I0=2 GOTO 600 950 IF I0=3 GOTO 830 1000 LET J=V+G*S 1010 LET I=A-G*S*S/2-V*S 1020 GOTO930 1100 LET L=140 1110 LET A=2.382342 1120 LET V=.1257558 1130 LET M=18500 1140 LET N=16500 1150 GOTO 170 1200 M=M1 \ L=L1 \ V=V1 \ A=A1 \ GOTO 210 1800 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 5 REM **** WRITTEN BY ERIC PETERS, DIGITAL 10 REM *** CONVERTED TO RSTS/E BY DAVID AHL, DIGITAL 20 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 70 PRINT "LUNAR LANDING SIMULATION" 80 PRINT "----- ------- ----------"\PRINT 100 PRINT "DO YOU WANT INSTRUCTIONS (YES OR NO)";\INPUT A$ 120 IF A$="NO" THEN 390 160 PRINT 200 PRINT "YOU ARE LANDING ON THE MOON AND HAVE TAKEN OVER MANUAL" 210 PRINT "CONTROL 500 FEET ABOVE A GOOD LANDING SPOT. YOU HAVE A" 220 PRINT "DOWNWARD VELOCITY OF 50 FT/SEC. 120 UNITS OF FUEL REMAIN." 225 PRINT 230 PRINT "HERE ARE THE RULES THAT GOVERN YOUR SPACE VEHICLE:" 240 PRINT "(1) AFTER EACH SECOND, THE HEIGHT, VELOCITY, AND REMAINING" 250 PRINT " FUEL WILL BE REPORTED." 260 PRINT "(2) AFTER THE REPORT, A '?' WILL BE TYPED. ENTER THE" 270 PRINT " NUMBER OF UNITS OF FUEL YOU WISH TO BURN DURING THE" 280 PRINT " NEXT SECOND. EACH UNIT OF FUEL WILL SLOW YOUR DESCENT" 290 PRINT " BY 1 FT/SEC." 310 PRINT "(3) THE MAXIMUM THRUST OF YOUR ENGINE IS 30 FT/SEC/SEC OR" 320 PRINT " 30 UNITS OF FUEL PER SECOND." 330 PRINT "(4) WHEN YOU CONTACT THE LUNAR SURFACE, YOUR DESCENT ENGINE" 340 PRINT " WILL AUTOMATICALLY CUT OFF AND YOU WILL BE GIVEN A" 350 PRINT " REPORT OF YOUR LANDING SPEED AND REMAINING FUEL." 360 PRINT "(5) IF YOU RUN OUT OF FUEL, THE '?' WILL NO LONGER APPEAR," 370 PRINT " BUT YOUR SECOND BY SECOND REPORT WILL CONTINUE UNTIL" 380 PRINT " YOU CONTACT THE LUNAR SURFACE."\PRINT 390 PRINT "BEGINNING LANDING PROCEDURE....."\PRINT 410 PRINT "G O O D L U C K ! ! !" 420 PRINT\PRINT 440 PRINT "SEC FEET SPEED FUEL PLOT OF DISTANCE" 450 PRINT 455 T=0\H=500\V=50\F=120 490 PRINT T;TAB(4);H;TAB(12);V;TAB(20);F;TAB(29);"I";TAB(H/12+29);"*" 500 INPUT B 510 IF B<0 THEN 650 520 IF B<=30 THEN 530\B=30 530 IF B<=F THEN 540\B=F 540 V1=V-B+5 560 F=F-B 570 H=H-.5*(V+V1) 580 IF H<=0 THEN 670 590 T=T+1 600 V=V1 610 IF F>0 THEN 490 615 IF B=0 THEN 640 620 PRINT "*** OUT OF FUEL ***" 640 PRINT T;TAB(4);H;TAB(12);V;TAB(20);F;TAB(29);"I";TAB(H/12+29);"*" 650 B=0 660 GOTO 540 670 PRINT "*** CONTACT ***" 680 H=H+.5*(V+V1) 690 IF B=5 THEN 720 700 D=(-V+SQR(V*V+H*(10-2*B)))/(5-B) 710 GOTO 730 720 D=H/V 730 V1=V+(5-B)*D 760 PRINT "TOUCHDOWN AT";T+D;"SECONDS." 770 PRINT "LANDING VELOCITY =";V1;"FT/SEC" 780 PRINT F;"UNITS OF FUEL REMAINING." 790 IF V1<>0 THEN 810 800 PRINT "CONGRATULATIONS!! A PERFECT LANDING!" 805 PRINT "YOUR LICENSE WILL BE RENEWED.......LATER." 810 IF ABS(V1)<2 THEN 840 820 PRINT "***** SORRY, BUT YOU BLEW IT!!!!" 830 PRINT "APPROPRIATE CONDOLENCES WILL BE SENT TO YOUR NEXT OF KIN." 840 PRINT\PRINT\PRINT 850 PRINT "ANOTHER MISSION";\INPUT A$ 870 IF A$="YES" THEN 390 880 PRINT\PRINT "CONTROL OUT."\PRINT 999 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 | 1000 REM *** GAME OF ROULETTE WRITTEN BY DAVID JOSLIN 1010 REM *** CONVERTED TO BASIC-PLUS BY DAVID AHL, DIGITAL 1015 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 1020 PRINT "WELCOME TO THE ROULETTE TABLE" 1030 PRINT 1040 PRINT "WANT INSTRUCTIONS (Y OR N)";\INPUT Y$ 1060 IF Y$="N" THEN 1550 1070 PRINT 1080 PRINT "THIS IS THE BETTING LAYOUT" 1090 PRINT " (*=RED)" 1100 PRINT 1110 PRINT " 1* 2 3*" 1120 PRINT " 4 5* 6 " 1130 PRINT " 7* 8 9*" 1140 PRINT "10 11 12*" 1150 PRINT "---------------" 1160 PRINT "13 14* 15 " 1170 PRINT "16* 17 18*" 1180 PRINT "19* 20 21*" 1190 PRINT "22 23* 24 " 1200 PRINT "---------------" 1210 PRINT "25* 26 27*" 1220 PRINT "28 29 30*" 1230 PRINT "31 32* 33 " 1240 PRINT "34* 35 36*" 1250 PRINT "---------------" 1260 PRINT " 00 0 " 1270 PRINT 1280 PRINT "TYPES OF BETS" 1290 PRINT 1300 PRINT "THE NUMBERS 1 TO 36 SIGNIFY A STRAIGHT BET" 1310 PRINT "ON THAT NUMBER" 1320 PRINT "THESE PAY OFF 35:1" 1330 PRINT 1340 PRINT "THE 2:1 BETS ARE:" 1350 PRINT " 37) 1-12 40) FIRST COLUMN" 1360 PRINT " 38) 13-24 41) SECOND COLUMN" 1370 PRINT " 39) 25-36 42) THIRD COLUMN" 1380 PRINT 1390 PRINT "THE EVEN MONEY BETS ARE:" 1400 PRINT " 43) 1-18 46) ODD" 1410 PRINT " 44) 19-36 47) RED" 1420 PRINT " 45) EVEN 48) BLACK" 1430 PRINT 1440 PRINT " 49)0 AND 50)00 PAY OFF 35:1" 1450 PRINT " NOTE: 0 AND 00 DO NOT COUNT UNDER ANY" 1460 PRINT " BETS EXCEPT THEIR OWN" 1470 PRINT 1480 PRINT "WHEN I ASK FOR EACH BET,TYPE THE NUMBER" 1490 PRINT "AND THE AMOUNT,SEPERATED BY A COMMA" 1500 PRINT "FOR EXAMPLE:TO BET $500 ON BLACK,TYPE 48,500" 1520 PRINT 1530 PRINT "MINIMUM BET IS $5,MAXIMUM IS $500" 1540PRINT"YOU'RE STARTING WITH $1000; I HAVE $100,000 IN THE BANK"\PRINT 1550 REM-PROGRAM BEGINS HERE 1560 REM-TYPE OF BET(NUMBER) ODDS 1580 DIM B(100),C(100),T(100),X(38),A(50) 1590 DIM B$(26) 1600 FOR I=1 TO 38\X(I)=0\NEXT I 1610 P=1000 1620 D=100000. 1630 PRINT "HOW MANY BETS"; 1640 INPUT Y 1650 IF Y<1 THEN 1630\IF Y<>INT(Y) THEN 1630 1660 FOR I=1 TO 50\A(I)=0\NEXT I 1670 FOR C=1 TO Y 1680 PRINT "NUMBER";C; 1690 INPUT X,Z 1700 B(C)=Z 1710 T(C)=X 1720 IF X<1 THEN 1680\IF X>50 THEN 1680\IF X<>INT(X) THEN 1680 1730 IF Z<1 THEN 1680\IF Z<>INT(Z) THEN 1680 1740 IF Z<5 THEN 1680\IF Z>500 THEN 1680 1750 IF A(X)=0 THEN 1780 1760 PRINT "YOU MADE THAT BET ONCE ALREADY,DUM-DUM" 1770 GOTO 1680 1780 A(X)=1 1790 NEXT C 1800 PRINT "SPINNING" 1810 PRINT 1820 PRINT 1830 S=INT(RND(0)*100) 1840 IF S=0 THEN 1830\IF S>38 THEN 1830 1850 X(S)=X(S)+1 1860 IF S<37 THEN 1920 1870 IF S=37 THEN 1900 1880 PRINT "00" 1890 GOTO 2020 1900 PRINT "0" 1910 GOTO 2020 1920 RESTORE 1930 FOR I=1 TO 18 1940 READ R 1950 IF R=S THEN 2000 1960 NEXT I 1970 A$="BLACK" 1980 PRINT S;A$ 1990 GOTO 2020 2000 A$="RED" 2010 GOTO 1980 2020 PRINT 2030 FOR C=1 TO Y 2040 IF T(C)<37 THEN 2710 2050 F=T(C)-36\IF F=1 GOTO 2090\IF F=2 GOTO 2190 2052 IF F=3 GOTO 2220\IF F=4 GOTO 2250\IF F=5 GOTO 2300 2054 IF F=6 GOTO 2350\IF F=7 GOTO 2400\IF F=8 GOTO 2470 2056 IF F=9 GOTO 2500\IF F=10 GOTO 2530\IF F=11 GOTO 2560 2058 IF F=12 GOTO 2630 2070 GOTO 2710 2080 STOP 2090 REM 1-12(37) 2:1 2100 IF S <= 12 THEN 2150 2110 PRINT "YOU LOSE";B(C);"DOLLARS ON BET";C 2120 D=D+B(C) 2130 P=P-B(C) 2140 GOTO 2180 2150 PRINT "YOU WIN";B(C)*2;"DOLLARS ON BET";C 2160 D=D-B(C)*2 2170 P=P+B(C)*2 2180 GOTO 2810 2190 REM 13-24(38) 2:1 2200 IF S=<12 GOTO 2210\IF S<25 GOTO 2150 2210 GOTO 2110 2220 REM 25-36(39) 2:1 2230 IF S=<24 GOTO 2240\IF S<37 GOTO 2150 2240 GOTO 2110 2250 REM FIRST COLUMN(40) 2:1 2260 FOR I=1 TO 34 STEP 3 2270 IF S=I THEN 2150 2280 NEXT I 2290 GOTO 2110 2300 REM SECOND COLUMN(41) 2:1 2310 FOR I=2 TO 35 STEP 3 2320 IF S=I THEN 2150 2330 NEXT I 2340 GOTO 2110 2350 REM THIRD COLUMN(42) 2:1 2360 FOR I=3 TO 36 STEP 3 2370 IF S=I THEN 2150 2380 NEXT I 2390 GOTO 2110 2400 REM 1-18(43) 1:1 2410 IF S<19 THEN 2430 2420 GOTO 2110 2430 PRINT "YOU WIN";B(C);"DOLLARS ON BET";C 2440 D=D-B(C) 2450 P=P+B(C) 2460 GOTO 2810 2470 REM 19-36(44) 1:1 2480 IF S=<18 GOTO 2490\IF S<37 GOTO 2430 2490 GOTO 2110 2500 REM EVEN(45) 1:1 2510 IF S/2<> INT(S/2) THEN 2520\IF S<37 THEN 2430 2520 GOTO 2110 2530 REM ODD(46) 1:1 2540 IF S/2=INT(S/2) THEN 2550\IF S<37 THEN 2430 2550 GOTO 2110 2560 REM RED(47) 1:1 2570 RESTORE 2580 FOR I=1 TO 18 2590 READ R 2600 IF S=R THEN 2430 2610 NEXT I 2620 GOTO 2110 2630 REM BLACK(48) 1:1 2640 RESTORE 2650 FOR I=1 TO 18 2660 READ R 2670 IF S=R THEN 2110 2680 NEXT I 2690 IF S>36 THEN 2110 2700 GOTO 2430 2710 REM--1TO36,0,00(1-36,49,50)35:1 2720 IF T(C)<49 THEN 2760 2730 IF T(C)<>49 GOTO 2740\IF S=37 GOTO 2780 2740 IF T(C)<>50 GOTO 2750\IF S=38 GOTO 2780 2750 GOTO 2110 2760 IF T(C)=S THEN 2780 2770 GOTO 2110 2780 PRINT "YOU WIN";B(C)*35;"DOLLARS ON BET";C 2790 D=D-B(C)*35 2800 P=P+B(C)*35 2810 NEXT C 2820 PRINT 2830 PRINT "TOTALS:","ME","YOU" 2840 PRINT " ",D,P 2850 IF P>0 THEN 2880 2860 PRINT "OOPS! YOU JUST SPENT YOUR LAST DOLLAR" 2870 GOTO 3190 2880 IF D>0 THEN 2920 2890 PRINT "YOU BROKE THE HOUSE!" 2900 P=101000. 2910 GOTO 2960 2920 PRINT "AGAIN"; 2930 INPUT Y$ 2935 Y$=SEG$(Y$,1,1) 2940 IF Y$="Y" THEN 1630 2950 DATA 1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36 2960 IF P<1 THEN 3190 2970 PRINT "TO WHOM SHALL I MAKE OUT THE CHECK"; 2980 INPUT B$ 2990 PRINT 3000 PRINT "-------------------------------------------------------" 3010 PRINT TAB(50);"CHECK NO. ";INT(RND(0)*100) 3020 PRINT 3040 PRINT TAB(40);DAT$(0) 3050 PRINT 3060 PRINT 3070 PRINT "PAY TO THE ORDER OF-----";B$;"-----$ "; 3080 PRINT P 3090 PRINT 3100 PRINT 3110 PRINT TAB(10),"THE MEMORY BANK OF VIRGINIA" 3120 PRINT 3130 PRINT TAB(40),"THE COMPUTER" 3140 PRINT TAB(40);"----------X-----" 3150 PRINT 3160 PRINT "--------------------------------------------------------------" 3170 PRINT "COME BACK SOON!" 3180 GOTO 3210 3190 PRINT "THANKS FOR YOUR MONEY" 3200 PRINT "I'LL USE IT TO BUY A SOLID GOLD ROULETTE WHEEL" 3210 PRINT 3220 GOTO 3420 3420 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 | 100 REM PROGRAM WRITTEN BY DANIEL R. VERNON 110 REM SENIOR AT BUTLER SENIOR HIGH SCHOOL 120 REM BUTLER, PENNSYLVANIA 16001 130 REM DATE: 2-1-73 140 REM COMPUTER SUPERVISION- MR. WILLIAM ELLIS 150 REM COMPUTER TOPICS INSTRUCTION- MR. ALBERT STEWART 160 REM 170 REM THIS PROGRAM IS DESIGNED TO CREATE POSTERS 180 REM 185 REM TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 190 DIM G$(54,1),H$(6,6),B$(54),G(6),A(54) 195 FILEV #1:"LPT:" 200 PRINT "INPUT HEIGHT IN INCHES"\INPUT L 205 PRINT "INPUT WIDTH IN INCHES"\INPUT R\S=0\A=R*2\C=A 210 PRINT"HOW FAR, IN INCHES FROM THE LEFT HAND SIDE, DO YOU WANT TO PLACE " 220 PRINT"THE LETTERS";\INPUT S\S=12*S 230 PRINT"INPUT MESSAGE HERE" 240 INPUT B$ 250 FOR I=1TO LEN(B$) 252 A(I)=ASC(SEG$(B$,I,I)) 253 NEXT I 260 H$(1)=" "\H$(2)=" "\H$(3)=" "\H$(4)=" " 261 H$(5)=" "\H$(6)=" "\H$=H$(L) 262 GOSUB 940 270 F=F+1\IF A(F)=0 GOTO 990\G(0)=L 271 FOR I=1 TO LEN(B$) 272 G$(I)=CHR$(A(I)) 280 NEXT I 290 FOR X=1TO A/2 291 PRINT#1: 292 NEXT X 295 G$=CHR$(A(F)) 297 FOR X=2 TO L\G$=G$&CHR$(A(F))\NEXT X 300 IF A(F)=46 GOTO 345\IFA(F)=36GOTO990\IFA(F)=32GOTO630\IFA(F)<27GOTO305 301 IF A(F)<48 GOTO 270\IF A(F)>57 GOTO 270 305 IFA(F)<27 GOTO310\IF A(F)=48 GOTO500\IF A(F)=49 GOTO 440 306 IFA(F)=50GOTO 620\IF A(F)=51 GOTO625\IF A(F)=52 GOTO 635 307 IF A(F)=53 GOTO 550\IF A(F)=54 GOTO 615\IF A(F)=55 GOTO 605 308 IF A(F)=56 GOTO 595\IF A(F)=57 GOTO 585 310 IF A(F)>26 GOTO 270\IF A(F)>15 GOTO 330 320 IF A(F)=1 GOTO 350\IF A(F)=2 GOTO 360\IF A(F)=3 GOTO 370 321 IF A(F)=4 GOTO 380\IF A(F)=5 GOTO 390\IF A(F)=6 GOTO 400 322 IF A(F)=7 GOTO 410\IF A(F)=8 GOTO 430\IF A(F)=9 GOTO 440 323 IF A(F)=10 GOTO 450\IF A(F)=11 GOTO 460\IF A(F)=12 GOTO 470 324 IF A(F)=13 GOTO 480\IF A(F)=14 GOTO 490\IF A(F)=15 GOTO 500 330 IF A(F)>26 GOTO 270\IF A(F)=16 GOTO 510\IF A(F)=17 GOTO 520 331 IF A(F)=18 GOTO 540\IF A(F)=19 GOTO 550\IF A(F)=20 GOTO 560 332 IF A(F)=21 GOTO 570\IF A(F)=22 GOTO 580\IF A(F)=23 GOTO 590 333 IF A(F)=24 GOTO 600\IF A(F)=25 GOTO 610\IF A(F)=26 GOTO 620 340 GOTO 270 345 FOR X=1 TO A 346 PRINT #1:TAB(S);G$;G$ 347 NEXT X 348 GOTO 270 350 GOSUB 640 351 GOSUB 690 352 GOSUB 640 353 GOTO 270 360 GOSUB 640 361 GOSUB 650 363 A=C*.5 365 GOSUB 640 366 A=C 367 GOSUB 810 368 GOTO 270 370 GOSUB 640 372 GOSUB 700 374 GOSUB 700 376 GOTO 270 380 GOSUB 640 382 GOSUB 700 384 A=C*.5\GOSUB 640 386 A=C\GOSUB 840 388 GOTO 270 390 GOSUB 640 392 GOSUB 650 394 GOSUB 650 396 GOTO 270 400 GOSUB 640 402 GOSUB 690 404 GOSUB 690 406 GOTO 270 410 GOSUB 640 412 A=C*.75\GOSUB 700 414 A=C*.25\GOSUB 650 416 A=C\GOSUB 760 420 A=C*.25\GOSUB 710 422 A=C\GOTO 270 430 GOSUB 640 432 GOSUB 710 434 GOSUB 640 436 GOTO 270 440 GOSUB 640 442 GOTO 270 450 GOSUB 750 452 GOSUB 740 454 GOSUB 640 456 GOTO 270 460 GOSUB 640 462 GOSUB 860 464 GOTO 270 470 GOSUB 640 472 GOSUB 740 474 GOSUB 740 476 GOTO 270 480 GOSUB 640 482 GOSUB 890 484 GOSUB 880 486 GOSUB 640 488 GOTO 270 490 GOSUB 640 492 GOSUB 890 494 GOSUB 640 496 GOTO 270 500 GOSUB 640 502 GOSUB 700 504 GOSUB 640 506 GOTO 270 510 GOSUB 640 512 GOSUB 690 514 GOSUB 790 516 GOTO 270 520 GOSUB 640 522 A=C*.75\GOSUB 700 524 A=C*.25\GOSUB 650 526 A=C\GOSUB 640 530 A=C*.25\GOSUB 710 532 A=C\GOTO 270 540 GOSUB 640 542 GOSUB 690 544 A=C*.5\GOSUB 640 546 GOSUB 810 548 A=C\GOTO 270 550 GOSUB 770 552 GOSUB 650 554 GOSUB 760 556 GOTO 270 560 GOSUB 780 562 GOSUB 640 564 GOSUB 780 566 GOTO 270 570 GOSUB 640 572 GOSUB 740 574 GOSUB 640 576 GOTO 270 580 GOSUB 890 582 GOSUB 880 584 GOTO 270 585 GOSUB 790 586 GOSUB 690 587 GOSUB 640 588 GOTO 270 590 GOSUB 640 591 GOSUB 880 592 GOSUB 890 593 GOSUB 640 594 GOTO 270 595 GOSUB 640 596 GOSUB 650 597 GOSUB 640 598 GOTO 270 600 GOSUB 900 601 GOTO 270 605 GOSUB 780 606 GOSUB 780 607 GOSUB 640 608 GOTO 270 610 GOSUB 970 611 GOSUB 800 612 GOSUB 960 613 GOTO 270 615 GOSUB 640 616 GOSUB 650 617 GOSUB 760 618 GOTO 270 620 GOSUB 920 621 GOTO 270 625 GOSUB 700 626 GOSUB 650 627 A=C*.5\GOSUB 640 628 A=C\GOSUB 810 629 GOTO 270 630 GOSUB 940 631 GOTO 270 635 GOSUB 790 636 GOSUB 710 637 GOSUB 640 638 GOTO 270 640 FOR Y=1 TO A 641 PRINT #1:TAB(S); 642 FOR X=1 TO 10 643 PRINT #1:G$; 644 NEXT X 645 PRINT #1: 646 NEXT Y 647 RETURN 650 IF A<1 THEN 660\GOTO 670 660 A=1 670 FOR X=1 TO A\PRINT #1:TAB(S);G$;G$;H$;H$;G$;G$;H$;H$;G$;G$\NEXT X 672 RETURN 680 PRINT#1:TAB(S); 690 FOR X=1 TO A\PRINT #1:TAB(4*L+S);G$;G$;H$;H$;G$;G$\NEXT X 692 RETURN 700 FOR X=1 TO A\PRINT#1:TAB(S);G$;G$;\PRINT#1:TAB(8*L+S);G$;G$\NEXT X 701 RETURN 710 IF A<1 THEN 720\GOTO 730 720 A=1 730 FOR X=1 TO A\PRINT#1:TAB(4*L+S);G$;G$\NEXT X 731 RETURN 740 FOR X=1 TO A\PRINT#1:TAB(S);G$;G$\NEXT X 742 RETURN 750 FOR X=1 TO A\PRINT#1:TAB(S);G$;G$;G$;G$\NEXT X 752 RETURN 760 FOR Y=1 TO A\PRINT#1:TAB(S);G$;G$;G$;G$;G$;G$;H$;H$;G$;G$\NEXT Y 761 RETURN 770 FOR X=1 TO A\PRINT#1:TAB(S);G$;G$;H$;H$;G$;G$;G$;G$;G$;G$\NEXT X 772 RETURN 780 FOR X=1 TO A\PRINT #1:TAB(8*L+S);G$;G$\NEXT X 782 RETURN 790 FOR X=1 TO A\PRINT#1:TAB(4*L+S);G$;G$;G$;G$;G$;G$\NEXT X 792 RETURN 800 FOR X=1 TO A\PRINT#1:TAB(S);G$;G$;G$;G$;G$;G$\NEXT X 805 RETURN 810 FOR X=1 TO C/2 811 PRINT #1:TAB(S); 812 FOR Y=1 TO 2 813 FOR Z=1 TO (5*L)-X 814 PRINT#1:SEG$(G$,1,1); 815 NEXT Z 820 IF X>3 THEN 950\V=X 830 PRINT#1:H$(2*V);\NEXT Y 832 PRINT #1:\NEXT X 834 RETURN 840 FOR X=1 TO C/2\PRINT #1:TAB(S);H$(X); 842 FOR Y=1 TO (10*L)-(2*X) 843 PRINT #1:SEG$(G$,1,1); 844 NEXT Y 845 PRINT #1: 850 NEXT X 852 RETURN 860 FOR X=4*L TO 7*L STEP (14*L)/(C*6) 861 PRINT #1:TAB(7*L-X+S);G$;G$;G$; 862 IF (7*L-X+S+3*L)<(X+S) GOTO 868 863 FOR I=(7*L-X) TO X\PRINT#1:SEG$(G$,1,1);\NEXT I 864 GOTO 871 868 PRINT#1:TAB(X+S);G$;G$;G$; 871 PRINT#1:\NEXT X 872 RETURN 880 FOR X=0 TO 6*L STEP 6*L/C\PRINT#1:TAB(X+S);G$;G$;G$;G$\NEXT X 882 RETURN 890 FOR X=6*L TO 0 STEP -6*L/C\PRINT#1:TAB(X+S);G$;G$;G$;G$\NEXT X 892 RETURN 900 FOR X=0 TO 7*L STEP (14*L)/(C*6) 901 IF X>3.5*L GOTO 907 902 PRINT#1:TAB(X+S);G$;G$;G$; 903 IF (X+S+3*L)<(7*L-X+S) GOTO 906 904 FOR I=X TO (7*L-X) \ PRINT#1:SEG$(G$,1,1);\NEXT I 905 GOTO 912 906 PRINT#1:TAB(7*L-X+S);G$;G$;G$;\GO TO 912 907 PRINT#1:TAB(7*L-X+S);G$;G$;G$; 908 IF (7*L-X+S+3*L)<(X+S) GOTO 911 909 FOR I=(7*L-X) TO X\PRINT#1:SEG$(G$,1,1);\NEXT I 910 GOTO 912 911 PRINT#1:TAB(X+S);G$;G$;G$; 912 PRINT #1: 913 NEXT X 914 RETURN 920FOR X=0 TO 7*L STEP (7*L)/(C*3) 921 PRINT#1:TAB(S);G$;G$; 922 IF X>2*L GOTO 926\PRINT#1:G$; 923 FOR I=1 TO X\PRINT#1:SEG$(G$,1,1);\NEXT I 924 GOTO 930 926 PRINT#1:TAB(X+S);G$;G$;G$; 927 IF X+3*L<8*L GOTO 930 928 FOR I=X+3*L TO 10*L\PRINT#1:SEG$(G$,1,1);\NEXT I 929 GOTO 932 930 PRINT#1: TAB(8*L+S);G$;G$;G$; 932 PRINT#1: 933 NEXT X 934 RETURN 940 FOR X=1 TO A*3 941 PRINT#1: 942 NEXT X 943 RETURN 950 FOR W=1 TO X-3\PRINT#1:" ";\NEXT W 952 B=3\GOTO 830 960 FOR X=4*L TO 7*L STEP L*4/C\PRINT#1:TAB(X+S);G$;G$;G$\NEXT X 962 RETURN 970 FOR X=7*L TO 4*L STEP -4*L/C\PRINT #1:TAB(X+S);G$;G$;G$\NEXT X 972 RETURN 990 FOR X= 1 TO C*3 991 PRINT#1: 992 NEXT X 1000 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 1 PRINT "DIRECT YOUR DOG TO ANY OF THE FOLLOWING FILES:" 2 PRINT "1=KEYBOARD,2=LINE PRINTER,3=HIGH SPEED PUNCH" 3 PRINT "WHICH ONE";\INPUT A 4 IF A=1 GOTO 6\IF A=2 GOTO 7\IF A=3 GOTO 5\GOTO 3 5 FILEV #1:"PTP:"\GOTO 10 6 FILEV #1:"TTY:"\GOTO 10 7 FILEV #1:"LPT:"\GOTO 10 9 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 10 PRINT #1: 20 PRINT #1: 30 PRINT #1: 40 PRINT #1:" XXXX" 50 PRINT #1:" X XX" 60 PRINT #1:" X *** X XXXXX" 70 PRINT #1:" X ***** X XXX XX" 80 PRINT #1:" XXXX ******* XXX XXXX XX" 90 PRINT #1:" XX X ****** XXXXXXXXX XX XXX" 100 PRINT #1:" XX X **** X X** X" 110 PRINT #1:" X XX XX X X***X" 120 PRINT #1:" X //XXXX X XXXX" 130 PRINT #1:" X // X XX" 140 PRINT #1:" X // X XXXXXXXXXXXXXXXXXX/" 150 PRINT #1:" X XXX// X X" 160 PRINT #1:" X X X X X" 170 PRINT #1:" X X X X X" 180 PRINT #1:" X X X X X XX" 190 PRINT #1:" X X X X X XXX XX" 200 PRINT #1:" X XXX X X X X X X" 210 PRINT #1:" X X X XX X XXXX" 220 PRINT #1:" X X XXXXXXXX! XX XX X" 230 PRINT #1:" XX XX X X X XX" 240 PRINT #1:" XX XXXX XXXXXX/ X XXXX" 250 PRINT #1:" XXX XX*** X X" 260 PRINT #1:" XXXXXXXXXXXXX * * X X" 270 PRINT #1:" *---* X X X" 280 PRINT #1:" *-* * XXX X X" 290 PRINT #1:" *- * XXX X" 300 PRINT #1:" *- *X XXX" 310 PRINT #1:" *- *X X XXX" 320 PRINT #1:" *- *X X XX" 330 PRINT #1:" *- *XX X X" 340 PRINT #1:" * *X* X X X" 350 PRINT #1:" * *X * X X X" 360 PRINT #1:" * * X** X XXXX X" 370 PRINT #1:" * * X** XX X X" 380 PRINT #1:" * ** X** X XX X" 390 PRINT #1:" * ** X* XXX X X" 400 PRINT #1:" * ** XX XXXX XXX" 410 PRINT #1:" * * * XXXX X X" 420 PRINT #1:" * * * X X X" 430 PRINT #1:" =======******* * * X X XXXXXXXX!" 440 PRINT #1:" * * * /XXXXX XXXXXXXX! )" 450 PRINT #1:" =====********** * X ) ! )" 460 PRINT #1:" ====* * X ! ! )XXXXX" 470 PRINT #1:" =========********** XXXXXXXXXXXXXXXXXXXXXX" 480 PRINT #1: 490 PRINT #1: 491 PRINT #1: 500 PRINT #1:,,,"CURSE YOU RED BARON ! !" 501 PRINT #1: 510 PRINT #1: 515 PRINT #1:,,"COMPLIMENTS OF DIGITAL'S PDP-8/E COMPUTER" 516 PRINT #1: 517 PRINT #1: 518 CLOSE #1 520 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 | 100 REM *** PROGRAM SIMULATES TV PROGRAM STARTREK 110 REM *** WRITTEN BY MIKE MAYFIELD, CENTERLINE ENGINEERING 180 PRINT " * * * STAR TREK * * *"\PRINT 181 PRINT\PRINT 200 PRINT " FOR INSTRUCTIONS USE OS-8 HELP COMMAND FOR 'SPACWR' " 205 RANDOMIZE 235 DIM Z$(72),R$(72),Q$(72),S$(48),A$(3),O1$(24),D$(72) 236 DIM E$(20) 240 Q$=" " 245 Q$=Q$&" " 250 Z$=Q$\R$=Q$\S$=SEG$(Q$,1,48) 260DIM G(8,8),C(9,2),K(3,3),N(3),Z(8,8) 290 T=INT(RND(1)*20+20)*100\T0=T 300 T9=30\D0=0\E=3000\P=10\S9=200\S=0\H8=0\E0=3000\P0=10 360 DEF FND(D)=SQR((K(I,1)-S1)**2+(K(I,2)-S2)**2) 370Q1=INT(RND(1)*8+1) 380Q2=INT(RND(1)*8+1) 390S1=INT(RND(1)*8+1) 400S2=INT(RND(1)*8+1) 420 C(2,1)=-1\C(3,1)=-1\C(4,1)=-1\C(4,2)=-1\C(5,2)=-1\C(6,2)=-1 430 C(1,1)=0\C(3,2)=0\C(5,1)=0\C(7,2)=0\C(9,1)=0 440 C(1,2)=1\C(2,2)=1\C(6,1)=1\C(7,1)=1\C(8,1)=1\C(8,2)=1\C(9,2)=1 460D$="WARP ENGINESS.R. SENSORSL.R. SENSORSPHASER CNTRL" 470 D$=D$&"PHOTON TUBESDAMAGE CNTRL" 480E$="SHIELD CNTRLCOMPUTER" 490 K9=0\B9=0 491REM *** SETS UP WHAT EXISTS IN GALAXY 500FOR I=1TO8 510FOR J=1TO8 520R1=RND(1) 530IF R1>.98 THEN 580 540IF R1>.95 THEN 610 550IF R1>.8 THEN 640 560K3=0\GOTO 660 580K3=3\K9=K9+3\GOTO 660 610K3=2\K9=K9+2\GOTO 660 640K3=1\K9=K9+1 660R1=RND(1) 670IF R1>.96 THEN 700 680B3=0\GOTO 720 700B3=1\B9=B9+1 720S3=INT(RND(1)*8+1) 730G(I,J)=K3*100+B3*10+S3 740Z(I,J)=0 750NEXT J 760NEXT I 770K7=K9 775PRINT\PRINT 776 IF B9>0 GOTO 780 777 G(6,3)=G(6,3)+10 778 B9=1 780 PRINT "YOU MUST DESTROY";K9;"KLINGONS IN";T9; 800 PRINT "STARDATES WITH";B9;"STARBASES" 810 S3=0\K3=0\B3=0 820 IF Q1<1 GOTO 920\IF Q1>8 GOTO 920\IF Q2<1 GOTO 920\IF Q2>8 GOTO 920 830X=G(Q1,Q2)*.01 840K3=INT(X) 850B3=INT((X-K3)*10) 860S3=G(Q1,Q2)-INT(G(Q1,Q2)*.1)*10 870 IF K3=0 THEN920 880 IF S>200 THEN 900 890 PRINT " SHIELDS DANGEROUSLY LOW" 900 PRINT "COMBAT AREA CONDITION RED" 920FOR I=1TO3 930K(I,3)=0 940NEXT I 950 Q$=Z$\R$=Z$ 970 S$=SEG$(Z$,1,48) 971REM *** PUT ENTERPRISE SOMEWHERE 980 A$="<*>" 990Z1=S1 1000Z2=S2 1010GOSUB 5510 1020FOR I=1TOK3 1030 GOSUB 5380 1031REM *** PUT KLINGONS SOMEWHERE 1040A$="+++" 1050Z1=R1 1060Z2=R2 1070GOSUB 5510 1080K(I,1)=R1\ K(I,2)=R2\ K(I,3)=S9 1110NEXT I 1120FOR I=1TOB3 1130GOSUB 5380 1131REM *** PUT STARBASE(S) SOMEWHERE 1140A$=">!<"\ Z1=R1\ Z2=R2 1170GOSUB 5510 1180NEXT I 1190FOR I=1TOS3 1200GOSUB 5380 1201REM *** PUT STARS SOMEWHERE 1210A$=" * "\ Z1=R1\ Z2=R2 1240GOSUB 5510 1250NEXT I 1260GOSUB 4120 1270 PRINT "COMMAND:";\INPUT A 1290IF A=0 GOTO 1410 1291IF A=1 GOTO 1260 1292IF A=2 GOTO 2330 1293IF A=3 GOTO 2530 1294IF A=4 GOTO 2800 1295IF A=5 GOTO 3460 1296IF A=6 GOTO 3560 1297IF A=7 GOTO 4630 1298 IF A=8 GOTO 180 1310PRINT\PRINT" 0 = SET COURSE" 1320PRINT" 1 = SHORT RANGE SENSOR SCAN" 1330PRINT" 2 = LONG RANGE SENSOR SCAN" 1340PRINT" 3 = FIRE PHASERS" 1350PRINT" 4 = FIRE PHOTON TORPEDOES" 1360PRINT" 5 = SHIELD CONTROL" 1370PRINT" 6 = DAMAGE CONTROL REPORT" 1380PRINT" 7 = CALL ON LIBRARY COMPUTER" 1390PRINT" 8 = BEGIN NEW CONTEST"\PRINT 1400GOTO 1270 1401REM *** COURSE CONTROL CODE BEGINS HERE 1410 PRINT "COURSE (1-9):";\INPUT C1 1430IF C1=0 THEN 1270 1440 IF C1<1 GOTO 1410\IF C1=>9 GOTO 1410 1450 PRINT "WARP FACTOR (0-8):";\INPUT W1 1470 IF W1<=0 GOTO 1410\IF W1<=.2 GOTO 1510 1480 IF D(1)>=0 GOTO 1510\IF W1<=.2 GOTO 1510 1490 PRINT "WARP DRIVE IS DISABLED!"\PRINT "IMPULSE ENGINES ACTIVATED." 1495 PRINT "MAXIMUM SPEED = WARP .2" 1500GOTO 1410 1510IF K3<=0 THEN 1560 1520GOSUB 3790 1530IF K3<=0 THEN 1560 1540IF S<0 THEN 4000 1550GOTO 1610 1560 IF E>0 THEN 1610 1570 IF S<1 THEN 3920 1580 PRINT "YOU HAVE";E;"UNITS OF ENERGY" 1590 PRINT "SUGGEST YOU GET SOME FROM YOUR SHIELDS WHICH HAVE";S;"UNITS LEFT" 1600 GOTO 1270 1610FOR I=1TO8\ IF D(I)>=0 THEN 1640 1611REM *** FIX ANY DAMAGED DEVICE 1630D(I)=D(I)+1 1640NEXT I 1650IF RND(1)>.2 THEN 1810 1660R1=INT(RND(1)*8+1) 1670IF RND(1)>= .5 THEN 1750 1680D(R1)=D(R1)-(RND(1)*5+1) 1690 PRINT\PRINT "DAMAGE CONTROL REPORT:"; 1710GOSUB 5610 1720PRINT" DAMAGED"\PRINT\GOTO 1810 1750D(R1)=D(R1)+(RND(1)*5+1) 1760 PRINT\PRINT "DAMAGE CONTROL REPORT:"; 1780GOSUB 5610 1790PRINT" STATE OF REPAIR IMPROVED"\PRINT 1810 N=INT((W1+.0625)*8)\A$=" "\Z1=S1\Z2=S2 1850GOSUB 5510 1870X=S1\Y=S2 1890X1=C(C1,1)+(C(C1+1,1)-C(C1,1))*(C1-INT(C1)) 1900X2=C(C1,2)+(C(C1+1,2)-C(C1,2))*(C1-INT(C1)) 1910FOR I=1TON\S1=S1+X1\S2=S2+X2 1940 IF S1<1 GOTO 2170\IF S1>=9 GOTO 2170\IF S2<1 GOTO 2170\IF S2>=9 GOTO 2170 1950S8=S1*24+S2*3-26\ IF S8>72 THEN 1990 1970 IF SEG$(Q$,S8,S8+2)=" " GOTO 2070 1980GOTO 2030 1990IF S8>144 THEN 2020 2000 IF SEG$(R$,S8-72,S8-70)=" " GOTO 2070 2010GOTO 2030 2020 IF SEG$(S$,S8-144,S8-142)=" " GOTO 2070 2030 S1=INT(S1-X1)\S2=INT(S2-X2)\PRINT "WARP ENGINES SHUTDOWN AT SECTOR"; 2035 PRINT S1;",";S2;"DUE TO BAD NAVAGATION" 2040 GOTO 2080 2070NEXT I 2075 S1=INT(S1)\S2=INT(S2) 2080A$="<*>"\Z1=S1\Z2=S2 2110GOSUB 5510 2120 E=E-N+5\T=(INT(10*T+1.1))/10\IF W1<1 THEN 2150 2140 T=(INT(10*T+9))/10 2150IF T>T0+T9 THEN 3970 2160GOTO 1260 2170X=Q1*8+X+X1*N\Y=Q2*8+Y+X2*N 2190Q1=INT(X/8)\Q2=INT(Y/8)\S1=INT(X-Q1*8)\S2=INT(Y-Q2*8) 2230IF S1<>0 THEN 2260 2240Q1=Q1-1\S1=8 2260IF S2<>0 THEN 2290 2270Q2=Q2-1\S2=8 2290T=T+1\E=E-N+5 2310IF T>T0 + T9 THEN 3970 2320GOTO 810 2321REM *** LONG RANGE SENSON SCAN CODE BEGINS HERE 2330IF D(3)>=0 THEN 2370 2340PRINT "LONG RANGE SENSORS ARE INOPERABLE" 2360GOTO 1270 2370 PRINT "LONG RANGE SENSOR SCAN FOR QUADRANT";Q1;",";Q2 2380PRINT"-------------------" 2390FOR I=Q1-1 TO Q1+1 2410FOR J=Q2-1 TO Q2+1 2420 IF I<1 GOTO 2500\IF I>8 GOTO 2500\IF J<1 GOTO 2500\IF J>8 GOTO 2500 2430N(J-Q2+2)=G(I,J) 2440 IF D(8)<0 THEN 2460 2450Z(I,J)=G(I,J) 2460NEXT J 2470 PRINT ":";N(1);TAB(7);":";N(2);TAB(13);":";N(3);TAB(19);":" 2480PRINT"-------------------" 2490NEXT I 2495 GOTO 1270 2500 N(J-Q2+2)=0\GOTO 2460 2501REM *** PHASER CONTROL CODE BEGINS HERE 2530IF K3<=0 THEN 3670 2540IF D(4)>=0 THEN 2570 2550 PRINT "PHASERS NOT OPERATIONAL" 2560GOTO 1270 2570 IF D(8)>=0 THEN 2590 2580PRINT " COMPUTER FAILURE HAMPERS ACCURACY" 2590 PRINT "PHASERS LOCKED ON TARGET. ENERGY AVAILABLE =";E 2600 PRINT "NUMBER OF UNITS TO FIRE:";\INPUT X 2620IF X<=0 THEN 1270 2630 IF E-X<0 THEN 2590 2640E=E-X 2650GOSUB 3790 2660IF D(7)>=0 THEN 2680 2670X=X*RND(1) 2680FOR I=1TO3 2690IF K(I,3)<=0 THEN 2770 2700H=INT((X/K3/FND(0))*(2*RND(1))) 2710K(I,3)=K(I,3)-H 2720 PRINT H;" UNIT HIT ON KLINGON AT SECTOR";K(I,1);",";K(I,2); 2721 PRINT " (";K(I,3);" LEFT)" 2740IF K(I,3)>0 THEN 2770 2750GOSUB 3690 2760IF K9<=0 THEN 4040 2770NEXT I 2780IF E<0 THEN 4000 2790GOTO 1270 2791REM *** PHOTON TORPEDO CODE BEGINS HERE 2800IF D(5)>=0 THEN 2830 2810PRINT "PHOTON TUBES ARE NOT OPERATIONAL" 2820GOTO 1270 2830IF P>0 THEN 2860 2840PRINT "ALL PHOTON TORPEDOES EXPENDED" 2850GOTO 1270 2860 PRINT "TORPEDO COURSE (1-9):";\INPUT C1 2880IF C1=0 THEN 1270 2890 IF C1<1 GOTO 2860\IF C1>=9 GOTO 2860 2900X1=C(C1,1)+(C(C1+1,1)-C(C1,1))*(C1-INT(C1)) 2910X2=C(C1,2)+(C(C1+1,2)-C(C1,2))*(C1-INT(C1)) 2920X=S1\Y=S2\P=P-1 2950 PRINT "TORPEDO TRACK:" 2960X=X+X1\Y=Y+X2 2980 IF X<1 GOTO 3420\IF X>=9 GOTO 3420\IF Y<1 GOTO 3420\IF Y>=9 GOTO3420 2990 PRINT " ";X;",";Y 2992 IF INT(X+.25)<>INT(X+.75) GOTO 2960 2994 IF INT(Y+.25)<>INT(Y+.75) GOTO 2960 3000 Z1=INT(X+.5)\Z2=INT(Y+.5) 3010 A$=" " 3040GOSUB 5680 3050IF Z3=0 THEN 3070 3060GOTO 2960 3070 A$="+++" 3100GOSUB 5680 3110IF Z3=0 THEN 3220 3120PRINT "*** KLINGON DESTROYED ***" 3130K3=K3-1\K9=K9-1 3150IF K9<=0 THEN 4040 3160FOR I=1TO3\IF INT(X)<>K(I,1) THEN 3190 3180IF INT(Y)=K(I,2) THEN 3200 3190NEXT I 3200K(I,3)=0\GOTO 3360 3220 A$=" * " 3250GOSUB 5680 3260IF Z3=0 THEN 3290 3270PRINT "YOU CAN'T DESTROY STARS, SILLY" 3280GOTO 3420 3290 A$=">!<" 3320GOSUB 5680 3330IF Z3=0 THEN 2960 3340PRINT "*** STAR BASE DESTROYED *** .......CONGRATULATIONS" 3350B3=B3-1 3360 A$=" " 3390GOSUB 5510 3400G(Q1,Q2)=K3*100+B3*10+S3 3405 IF Z(Q1,Q2)<1 GOTO 3410\Z(Q1,Q2)=G(Q1,Q2) 3410GOTO 3430 3420PRINT "TORPEDO MISSED" 3430GOSUB 3790 3440IF E<0 THEN 4000 3450GOTO 1270 3451REM *** SHIELD CONTROL CODE BEGINS HERE 3460IF D(7)>=0 THEN 3490 3470PRINT "SHIELD CONTROL IS NON-OPERATIONAL" 3480GOTO 1270 3490 PRINT "ENERGY AVAILABLE =";E+S 3500 PRINT " NUMBER OF UNITS TO SHIELDS:";\INPUT X 3510 IF X<0 GOTO 1270 3520IF E+S-X<0 THEN 3490 3530E=E+S-X\S=X 3550GOTO 1270 3551REM *** DAMAGE CONTROL REPORT CODE BEGINS HERE 3560IF D(6)>=0 THEN 3590 3570PRINT "DAMAGE CONTROL REPORT IS NOT AVAILABLE" 3580GOTO 1270 3590PRINT\PRINT "DEVICE STATE OF REPAIR" 3610FOR R1=1TO8 3620GOSUB 5610 3630PRINTD(R1) 3640NEXT R1\PRINT 3660GOTO 1270 3670PRINT"SHORT RANGE SENSORS REPORT NO KLINGONS IN THIS QUADRANT" 3680GOTO 1270 3690 PRINT "KLINGON AT SECTOR ";K(I,1);",";K(I,2);"DESTROYED ***" 3710K3=K3-1\K9=K9-1\A$=" "\Z1=K(I,1)\Z2=K(I,2) 3760GOSUB 5510 3770G(Q1,Q2)=K3*100+B3*10+S3 3775 IF Z(Q1,Q2) <1 GOTO 3780\Z(Q1,Q2)=G(Q1,Q2) 3780RETURN 3790IF C$<>"DOCKED" THEN 3820 3800PRINT "STAR BASE SHIELDS PROTECT THE ENTERPRISE" 3810RETURN 3820 IF K3<=0 THEN 3910 3830FOR I=1TO3\IF K(I,3)<=0 THEN 3900 3850H=INT((K(I,3)/FND(0))*(2+RND(1)))\S=S-H 3860 PRINT "KLINGON ATTACK" 3870 PRINT H;" UNIT HIT ON ENTERPRISE FROM SECTOR ";K(I,1);",";K(I,2); 3871 PRINT " (";S;" LEFT)" 3890IF S<0 THEN 4000 3900NEXT I 3910RETURN 3920PRINT "THE ENTERPRISE IS DEAD IN SPACE. IF YOU SURVIVE ALL IMPENDING" 3930PRINT "ATTACKS YOU WILL BE DEMOTED TO THE RANK OF PRIVATE" 3940IF K3<=0 THEN 4020 3950GOSUB 3790 3960GOTO 3940 3970 PRINT\PRINT "IT IS STARDATE";T 3990GOTO 4020 3991REM *** NO ENERGY LEFT 4000PRINT\PRINT"THE ENTERPRISE HAS BEEN DESTROYED. THE FEDERATION WILL BE CONQUERED" 4020 PRINT "THERE ARE STILL ";K9;" KLINGON BATTLE CRUISERS" 4030 PRINT\PRINT\PRINT\PRINT "YOU GET ANOTHER CHANCE...."\GOTO 180 4040PRINT\PRINT"THE LAST KLINGON BATTLE CRUISER IN THE GALAXY HAS BEEN DESTROYED" 4050PRINT"THE FEDERATION HAS BEEN SAVED!!!!!"\PRINT 4075E5=((K7/(T-T0))*1000) 4080 PRINT "YOUR EFFICIENCY RATING =";E5 4100 PRINT "YOUR ACTUAL TIME OF MISSION ="; 4101 PRINT (INT((T-T0)*10))/10;"STARDATES" 4105PRINT\PRINT\PRINT 4106 PRINT "DO YOU WANT TO TRY AGAIN";\INPUT R$ 4107 IF R$="YES" THEN 180 4110 GOTO 5820 4111REM *** SHORT RANGE SENSOR SCAN AND STARTING POINT CODE 4120FOR I=S1-1TO S1+1 4130FOR J=S2-1TO S2+1 4140 IF I<1 GOTO 4200\IF I>8 GOTO 4200\IF J<1 GOTO 4200\IF J>8 GOTO 4200 4150A$=">!<"\Z1=I\Z2=J 4180GOSUB 5680 4190IF Z3=1 THEN 4240 4200NEXT J 4210NEXT I 4220D0=0\GOTO 4310 4240D0=1\C$="DOCKED"\E=3000\P=10 4280PRINT "SHIELDS DROPPED FOR DOCKING PURPOSES" 4281 REMEMBER TO GET REPAIRS 4282 FOR I=1 TO 8 4284 IF D(I)=>0 GOTO 4288 4286 D(I)=0 4288 NEXT I 4290S=0\GOTO 4380 4310IF K3>0 THEN 4350 4320IF E<E0 *.1 THEN 4370 4330C$="GREEN" 4340GOTO 4380 4350C$="RED"\GOTO 4380 4370C$="YELLOW" 4380IF D(2)>=0 THEN 4430 4390PRINT\PRINT"*** SHORT RANGE SENSORS ARE OUT ***"\PRINT 4420GOTO 4530 4430 O1$="------------------------" 4435 PRINT\PRINT O1$ 4445 PRINT SEG$(Q$,1,24) 4455 PRINT SEG$(Q$,25,48);TAB(41);"STARDATE";TAB(57);T 4465 PRINT SEG$(Q$,49,72);TAB(41);"CONDITION";TAB(58);C$ 4475 PRINT SEG$(R$,1,24);TAB(41);"QUADRANT";TAB(57);Q1;",";Q2 4485 PRINT SEG$(R$,25,48);TAB(41);"SECTOR";TAB(57);S1;",";S2 4495 PRINT SEG$(R$,49,72);TAB(41);"TOTAL ENERGY";TAB(57);E 4505 PRINT SEG$(S$,1,24);TAB(41);"PHOTON TORPEDOES";TAB(57);P 4515 PRINT SEG$(S$,25,48);TAB(41);"SHIELDS";TAB(57);S 4520 PRINT O1$\PRINT 4530RETURN 4620REM *** LIBRARY COMPUTER CODE BEGINS HERE 4630IF D(8)>=0 THEN 4660 4640PRINT "COMPUTER DISABLED"\GOTO 1270 4660 PRINT "COMPUTER ACTIVE AND AWAITING COMMAND:";\INPUT A 4680IF A=0 GOTO 4740 4681IF A=1 GOTO 4830 4682IF A=2 GOTO 4880 4690PRINT "FUNCTIONS AVAILABLE FROM COMPUTER" 4700PRINT " 0 = CUMULATIVE GALACTIC RECORD" 4710PRINT " 1 = STATUS REPORT" 4720PRINT " 2 = PHOTON TORPEDO DATA" 4730GOTO 4660 4731REM *** CUMULATIVE GALACTIC RECORD CODE BEGINS HERE 4740 PRINT "COMPUTER RECORD OF GALAXY FOR ALL LONG RANGE SENSOR SCANS" 4760PRINT" 1 2 3 4 5 6 7 8" 4770PRINT" ----- ----- ----- ----- ----- ----- ----- -----" 4780FOR I=1TO8 4795 PRINT I;TAB(5);Z(I,1);TAB(11);Z(I,2);TAB(17);Z(I,3);TAB(23);Z(I,4); 4796 PRINT TAB(29);Z(I,5);TAB(35);Z(I,6);TAB(41);Z(I,7);TAB(47);Z(I,8) 4800PRINT" ----- ----- ----- ----- ----- ----- ----- -----" 4810NEXT I 4820GOTO 1270 4821REM *** STATUS REPORT CODE BEGINS HERE 4830PRINT " STATUS REPORT" 4840 PRINT "NUMBER OF KLINGONS LEFT =";K9 4850 V5=(INT(((T0+T9)-T)*10))/10 4851PRINT "NUMBER OF STARDATES LEFT =";V5 4860 PRINT "NUMBER OF STARBASES LEFT =";B9 4870GOTO 3560 4880PRINT\H8=0 4881REM *** PHOTON TORPEDO DATA CODE BEGINS HERE 4900FOR I=1TO3 4910IF K(I,3)<=0 THEN 5260 4920C1=S1\A=S2\W1=K(I,1)\X=K(I,2) 4960GOTO 5010 4970 PRINT "YOU ARE AT QUADRANT ( ";Q1;",";Q2;" ) SECTOR ( ";S1;",";S2;" )" 4990 PRINT "SHIP AND TARGET COORDINATES ARE:";\INPUT C1,A,W1,X 5010X=X-A\A=C1-W1 5030IF X<0 THEN 5130 5031IF A<0 THEN 5190 5050IF X>0 THEN 5070 5051IF A=0 THEN 5150 5070C1=1 5080IF ABS(A) <= ABS(X) THEN 5110 5085V5=C1+(((ABS(A)-ABS(X))+ABS(A))/ABS(A)) 5090 PRINT "DIRECTION =";V5 5100GOTO 5240 5110 PRINT "DIRECTION =";C1+(ABS(A)/ABS(X)) 5120GOTO 5240 5130IF A>0 THEN 5170 5140IF X=0 THEN 5190 5150C1=5\GOTO 5080 5170C1=3\GOTO5200 5190C1=7 5200IF ABS(A)>=ABS(X) THEN 5230 5210 PRINT "DIRECTION =";C1+(((ABS(X)-ABS(A))+ABS(X))/ABS(X)) 5220GOTO 5240 5230 PRINT "DIRECTION =";C1+(ABS(X)/ABS(A)) 5240 PRINT "DISTANCE =";SQR(X**2+A**2) 5250IF H8=1 THEN 5320 5260NEXT I 5270H8=0 5280 PRINT "DO YOU WANT TO USE THE CALCULATOR";\INPUT A$ 5300IF A$="YES" THEN 4970 5310IF A$<>"NO" THEN 5280 5320GOTO 1270 5321REM *** END OF LIBRARY COMPUTER CODE 5380R1=INT(RND(1)*8+1)\R2=INT(RND(1)*8+1)\A$=" "\Z1=R1\Z2=R2 5430GOSUB 5680 5440IF Z3=0 THEN 5380 5450RETURN 5510REM *** INSERTION IN STRING ARRAY FOR QUADRANT *** 5520S8=Z1*24+Z2*3-26\IF S8>72 THEN 5560 5540 Q$=SEG$(Q$,1,S8-1)&A$&SEG$(Q$,S8+3,72) 5550GOTO 5600 5560IF S8>144 THEN 5590 5570 R$=SEG$(R$,1,S8-73)&A$&SEG$(R$,S8-69,72) 5580GOTO 5600 5590 S$=SEG$(S$,1,S8-145)&A$&SEG$(S$,S8-141,72) 5600RETURN 5610REM *** PRINTS DEVICE NAME FROM ARRAY*** 5620S8=R1*12-11\IF S8>72 THEN 5660 5640 PRINT SEG$(D$,S8,S8+11);\GOTO 5670 5660 PRINT SEG$(E$,S8-72,S8-61); 5670RETURN 5680REM ***STRING COMPARISON IN QUADRANT ARRAY*** 5690S8=Z1*24+Z2*3-26\Z3=0\IF S8>72 THEN 5750 5720 IF SEG$(Q$,S8,S8+2)<>A$ THEN 5810 5730Z3=1\GOTO 5810 5750IF S8>144 THEN 5790 5760 IF SEG$(R$,S8-72,S8-70)<>A$ THEN 5810 5770Z3=1\GOTO 5810 5790 IF SEG$(S$,S8-144,S8-142)<>A$ THEN 5810 5800Z3=1 5810RETURN 5820 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | 1 DATA 2,3,4,9,1,5,8,7,6 2 DATA 2,3,4,9,1,5,8,7,6,2,9,8,3,1,7 3 DATA 4,5,6,2,1,6,4,1,8 4 DATA 0,1,-1,1,-1,1,-1,1,-1 5 DIM A(9) 6 DIM B(9) 7 DIM C(24) 8 DIM D(24) 9 DIM F(9) 10 FOR I=1 TO 9 11 READ A(I) 12 NEXT I 13 FOR I=1 TO 24 14 READ C(I) 15 NEXT I 16 FOR I=1 TO 9 17 READ F(I) 18 NEXT I 19 PRINT "TIC-TAC-TOE" 20 PRINT 21 PRINT "THE MOVE POSITIONS ARE:" 22 PRINT 23 PRINT "1 2 3" 24 PRINT "4 5 6" 25 PRINT "7 8 9" 26 GOSUB 133 27 GOSUB 133 32 LET E=0 33 LET G=2 34 LET K=0 35 FOR I=1 TO 9 36 LET B(I)=0 37 NEXT I 38 FOR I=1 TO 24 39 LET D(I)=0 40 NEXT I 41 PRINT 42 PRINT 43 PRINT "--BEGIN GAME--" 44 PRINT "YOU WILL BE 'X', I WILL BE 'O'" 47 PRINT "TYPE 0 IF YOU WANT ME TO GO FIRST"; 48 INPUT I 49 IF I=0 THEN 65 50 LET L=-1 51 PRINT "YOUR MOVE"; 52 INPUT I 53 PRINT 54 PRINT 55 LET H=INT(ABS(I)) 56 IF H<>I THEN 50 57 IF H < 1 THEN 50 58 IF H>9 THEN 50 59 LET H=A(H) 60 IF B(H) <> 0 THEN 50 61 IF K=1 THEN 64 62 LET G=F(H) 63 LET K=1 64 GOSUB 111 65 LET L=1 66 FOR I=1 TO 22 STEP 3 67 IF D(I) + D(I+1) + D(I+2) = -3 THEN 92 68 NEXT I 69 FOR I=1 TO 22 STEP 3 70 IF D(I) + D(I+1) + D(I+2) = 2 THEN 90 71 NEXT I 72 FOR I=1 TO 22 STEP 3 73 IF D(I) + D(I+1) + D(I+2) = -2 THEN 106 74 NEXT I 75 IF E=1 THEN 77 76 IF G = -1 THEN 78 77 IF B(1)=0 THEN 100 78 IF G <> 0 THEN 82 79 FOR I=2 TO 8 STEP 2 80 IF B(I)=0 THEN 101 81 NEXT I 82 IF H=8 THEN 86 83 FOR I=H+1 TO 8 84 IF B(I)=0 THEN 101 85 NEXT I 86 FOR I=2 TO 9 87 IF B(I)=0 THEN 101 88 NEXT I 89 GO TO 98 90 PRINT "I WIN" 91 GOTO 900 92 PRINT "YOU ARE NOT ALLOWED TO WIN" 93 FOR I=1 TO 9 94 LET B(I)=1 95 NEXT I 96 GOSUB 117 97 GOTO 900 98 PRINT "DRAW" 99 GOTO 900 100 LET I=1 101 LET H=I 102 GOSUB 111 103 LET E=1 104 GOSUB 117 105 GO TO 50 106 FOR J=I TO I+2 107 IF D(J)=0 THEN 109 108 NEXT J 109 LET I=C(J) 110 GO TO 101 111 LET B(H)=L 112 FOR M=1 TO 24 113 IF C(M) <> H THEN 115 114 LET D(M)=L 115 NEXT M 116 RETURN 117 FOR N=1 TO 9 118 IF B(N)=0 THEN 200 119 NEXT N 120 IF N<100 THEN 98 121 FOR N=1 TO 9 STEP 3 122 FOR O= 0 TO 2 123 IF B(A(O+N))=0 THEN 127 124 IF B(A(O+N))=1 THEN 129 125 PRINT "X "; 126 GO TO 130 127 PRINT "- "; 128 GO TO 130 129 PRINT "O "; 130 NEXT O 131 PRINT 132 NEXT N 133 PRINT 136 RETURN 137 STOP 200 LET N=1000 210 GOTO 119 900 GOTO 910 910 PRINT "TRY AGAIN (IF SO TYPE 0)"; 920 INPUT I 930 IF I<>0 THEN 999 940 GOTO 27 999 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 1 REM THIS PROGRAM PLAYS THE CARD GAME OF WAR. THE ONLY CHANGE 2 REM IS THAT A TIE MAKES NO SCORE AT ALL. THE PACK IS READ IN 3 REM AND THEN SHUFFLES IN A RANDOM WAY. THE COMPUTER THEN DEALS THE 4 REM CARDS TWO AT A TIME AS LONG AS THE GAME COMTINUES. A RUNNING 5 REM SCORE IS KEPT. 6 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 100 PRINT "THIS IS THE CARD GAME OF WAR. EACH CARD IS GIVEN BY SUIT-#" 110 PRINT "AS S-7 FOR SPADE 7. "; 120 PRINT "DO YOU WANT DIRECTIONS"; 130 INPUT B$ 140 IF B$="NO" THEN 210 150 IF B$="YES" THEN 180 160 PRINT "YES OR NO, PLEASE. "; 170 GOTO 120 180 PRINT "THE COMPUTER GIVES YOU AND IT A 'CARD'. THE HIGHER 'CARD' "; 190 PRINT "(NUMERICALLY) WINS. THE GAME ENDS WHEN YOU CHOOSE NOT"; 200 PRINT " TO CONTINUE OR WHEN YOU HAVE FINISHED THE PACK." 210 PRINT 220 PRINT 230 DIM A$(52,4),L(54) 240 FOR I=1 TO 52 250 READ A$(I) 260 NEXT I 270 RANDOMIZE 280 FOR J=1 TO 52 290 LET L(J)=INT(52*RND(X)+1) 300 FOR K=1 TO J-1 310 IF L(K)<>L(J) THEN 340 320 LET J=J-1 330 GOTO 350 340 NEXT K 350 NEXT J 360 LET P=P+1 370 LET M1=L(P) 380 LET P=P+1 390 LET M2=L(P) 400 PRINT 410 PRINT 420 PRINT "YOU: ";A$(M1), "COMPUTER: ";A$(M2), 430 LET N1=INT((M1-.5)/4) 440 LET N2=INT((M2-.5)/4) 450 IF N1>=N2 THEN 490 460 LET A1=A1+1 470 PRINT "COMPUTER WINS.";PNT(7);PNT(7);PNT(7);PNT(7);PNT(7) 475 PRINT " YOU HAVE";B1;"; COMPUTER HAS";A1 480 GOTO 540 490 IF N1=N2 THEN 530 500 LET B1=B1+1 510 PRINT "YOU WIN. YOU HAVE";B1;"; COMPUTER HAS";A1 520 GOTO 540 530 PRINT "TIE. NO SCORE CHANGE." 540 IF L(P+1)=0 THEN 610 550 PRINT "DO YOU WANT TO CONTINUE"; 560 INPUT V$ 570 IF V$="YES" THEN 360 580 IF V$="NO" THEN 650 590 PRINT "YES OR NO, PLEASE. "; 600 GOTO 540 610 PRINT 620 PRINT 630 PRINT "YOU HAVE RUN OUT OF CARDS. FINAL SCORE: YOU--";B1; 640 PRINT "; COMPUTER--";A1 650 PRINT "THANKS FOR PLAYING. IT WAS FUN.";PNT(7);PNT(7) 660 DATA "S-2","H-2","C-2","D-2","S-3","H-3","C-3","D-3","S-4","H-4","C-4" 665 DATA "D-4","S-5","H-5","C-5" 670 DATA "D-5","S-6","H-6","C-6","D-6","S-7","H-7","C-7","D-7","S-8","H-8" 675 DATA "C-8","D-8","S-9","H-9" 680 DATA "C-9","D-9","S-10","H-10","C-10","D-10","S-J","H-J","C-J" 685 DATA "D-J","S-Q","H-Q","C-Q","D-Q" 690 DATA "S-K","H-K","C-K","D-K","S-A","H-A","C-A","D-A" 700 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | 1 REM BOB DORES/WAR 2 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 3 PRINT "I AM AT WAR WITH YOU." 4 PRINT "WE HAVE 72000 SOLDIERS A PIECE." 5 PRINT "DISTRIBUTE YOUR FORCES." 6 PRINT " ","ME","YOU" 7 PRINT"ARMY","30000", 8 INPUT A 9 PRINT"NAVY","20000", 10 INPUT B 11 PRINT"A.F.","22000", 12 INPUT C 13 IF A+B+C>72000 THEN 5 14 D=30000 15 E=20000 16 F=22000 17 PRINT "YOU ATTACK FIRST. TYPE 1 FOR ARMY 2 FOR NAVY" 18 PRINT "AND 3 FOR AIR FORCE." 19 INPUT Y 20 PRINT "HOW MANY MEN" 21 INPUT X 22 IF X<0 THEN 20 23 IF Y=2 GOTO 200\IF Y=3 GOTO 300 100 IF X>A THEN 20 105 IF X<A/3 THEN 120 110 IF X<2*A/3 THEN 150 115 GOTO 270 120 PRINT "YOU LOST";X;"MEN FROM YOUR ARMY." 125 A=INT(A-X) 130 GOTO 500 150 PRINT "YOU LOST";INT(X/3);"MEN, BUT I LOST";INT(2*D/3) 155 A=INT(A-X/3) 160 D=0 165 GOTO 500 200 IF X>B THEN 20 210 IF X<E/3 THEN 230 215 IF X<2*E/3 THEN 250 220 GOTO 270 230 PRINT "YOUR ATTACK WAS STOPPED!" 232 B=INT(B-X) 235 GOTO 500 250 PRINT "YOU DESTROYED";INT(2*E/3);"OF MY ARMY." 255 E=INT(E/3) 260 GOTO 500 270 PRINT"YOU SUNK 1 OF MY PATROL BOATS, BUT I WIPED OUT 2" 275 PRINT"OF YOUR A.F. BASES, AND 3 ARMY BASES." 280 A=INT(A/3) 285 C=INT(C/3) 290 E=INT(2*E/3) 293 GOTO 500 300 IF X>C THEN 20 310 IF X<C/3 THEN 350 320 IF X<2*C/3 THEN 370 330 GOTO 380 350 PRINT "YOUR ATTACK WAS WIPED OUT." 355 C=INT(C-X) 360 GOTO 500 370 PRINT "WE HAD A DOGFIGHT- YOU WON - AND FINISHED YOUR MISSION." 375 D=INT(2*D/3) 377 E=INT(E/3) 378 F=INT(F/3) 379 GOTO 500 380 PRINT "YOU WIPED OUT ONE OF MY ARMY PATROLS, BUT I" 381 PRINT "DESTROYED 2 NAVY BASES, AND BOMBED 3 ARMY BASES." 385 A=INT(A/4) 387 B=INT(B/3) 390 D=INT(2*D/3) 500 PRINT 501 PRINT,"YOU","ME" 510 PRINT"ARMY",A,D 520 PRINT"NAVY",B,E 530 PRINT"A.F.",C,F 1000 PRINT "WHAT IS YOUR NEXT MOVE?" 1010 PRINT "ARMY=1 NAVY=2 AIR FORCE=3" 1020 INPUT G 1030 PRINT "HOW MANY MEN" 1040 INPUT T 1045 IF T<0 THEN 1030 1050 IF G=2 GOTO 1700\IF G=3 GOTO 1800 1600 IF T>A THEN 1030 1610 IF T<D/2 THEN 1630 1615 PRINT "YOU DESTROYED MY ARMY!" 1616 D=0 1617 GOTO 2000 1630 PRINT "I WIPED OUT YOUR ATTACK" 1635 A=A-T 1640 GOTO 2000 1700 IF T>B THEN 1030 1710 IF T<E/2 THEN 1750 1720 GOTO 1770 1750 PRINT "I SUNK 2 OF YOUR BATTLESHIPS, AND MY AIR FORCE" 1751 PRINT "WIPED OUT YOUR UNGUARDED CAPITOL." 1755 A=A/4 1760 B=B/2 1765 GOTO 2000 1770 PRINT "YOUR NAVY SHOT DOWN 3 OF MY X111 PLANES ," 1771 PRINT"AND SUNK 3 BATTLESHIPS." 1775 F=2*F/3 1780 E=(E/2) 1790 GOTO 2000 1800 IF T>C THEN 1030 1810 IF T>F/2 THEN 1830 1820 GOTO 1850 1830 PRINT "MY NAVY AND AIR FORCE IN A COMBINED ATTACK LEFT" 1831 PRINT "YOUR COUNTRY IN SHAMBLES." 1835 A=A/3 1837 B=B/3 1840 C=C/3 1845 GOTO 2000 1850 PRINT"ONE OF YOUR PLANES CRASHED INTO MY HOUSE. I AM DEAD." 1851 PRINT"MY COUNTRY FELL APART." 1860 GOTO 2010 2000 PRINT 2001 PRINT "FROM THE RESULTS OF BOTH OF YOUR ATTACKS," 2002 IF A+B+C>3/2*(D+E+F) THEN 2010 2005 IF A+B+C<2/3*(D+E+F) THEN 2015 2006 PRINT"THE TREATY OF PARIS CONCLUDED THAT WE TAKE OUR" 2007 PRINT"RESPECTIVE COUNTRIES, AND LIVE IN PEACE." 2008 GOTO 2020 2010 PRINT "YOU WON, OH! SHUCKS!!!!!" 2012 GOTO 2020 2015 PRINT "YOU LOST-I CONQUERED YOUR COUNTRY. IT SERVES YOU " 2016 PRINT "RIGHT FOR PLAYING THIS STUPID GAME!!!" 2020 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | 10 PRINT"" 20 REM MODIFIED TO LOOK RESPECTABLE ON PDP-8'S BY KAY R. FISHER ...DEC 120PRINT 124 LET Y1 = 1970 130 PRINT" ENTER TODAY'S DATE IN THIS FORM: MONTH,DAY, YEAR"; 140 INPUT M1,D1,Y1 150 IF Y1>100 THEN 170 160 LET Y1 = Y1 + 1900 170 DEF FNA(A)=INT(A/4) 180 DIM T(12) 190 DEF FNB(A)=INT(A/7) 210 FOR I= 1 TO 12 220 READ T(I) 230 NEXT I 240 PRINT 241PRINT"THIS PROGRAM DEMONSTRATES OS8 BASIC AND ALSO GIVES " 242PRINT"FACTS ABOUT A DATE OF INTEREST TO YOU" 244 PRINT 245 PRINT"ENTER DATE OF BIRTH IN THIS FORM: MO,DAY,YEAR"; 250 INPUT M,D,Y 260 PRINT 270 IF Y - 75 >0 THEN 280 275 LET Y = Y+1900 280 LET I1 = INT((Y-1500)/100) 290 IF Y-1582<0 THEN 1300 300 LET A = I1*5+(I1+3)/4 310LET I2 = INT(A-FNB(A)*7) 320 LET Y2= INT(Y/100) 330 LET Y3 = INT(Y-Y2*100) 340 LET A = Y3/4+Y3+D+T(M)+I2 350 LET B = INT(A-FNB(A)*7)+1 360 IF M>2 THEN 470 370 IF Y3= 0 THEN 440 380 LET T1 = INT(Y-FNA(Y)*4) 390 IF T1<> 0 THEN 470 400 IF B<>0 THEN 420 410 LET B = 6 420 LET B = B-1 430 GOTO 470 440 LET A = I1-1 450 LET T1 = INT(A-FNA(A)*4) 460 IF T1 = 0 THEN 400 470 IF B <> 0 THEN 490 480 LET B = 7 490 IF (Y1*12+M1)*31+D1<(Y*12+M)*31+D THEN 550 500 IF (Y1*12+M1)*31+D1=(Y*12+M)*31+D THEN 530 510 PRINT M;"/";D;"/";Y;" WAS A "; 520 GOTO 570 530 PRINT M;"/";D;"/";Y;" IS A "; 540 GOTO 570 550 PRINT M;"/";D;"/";Y;" WILL BE A "; 570 IF B<>1 THEN 590 580 PRINT "SUNDAY" 590 IF B<>2 THEN 610 600 PRINT "MONDAY" 610 IF B<>3 THEN630 620 PRINT "TUESDAY" 630 IF B<>4 THEN 650 640 PRINT "WEDNESDAY" 650 IF B<>5 THEN 670 660 PRINT "THURSDAY" 670 IF B<>6 THEN 690 680 GOTO 1250 690 IF B<>7 THEN 710 700 PRINT "SATURDAY" 710 IF (Y1*12+M1)*31+D1=(Y*12+M)*31+D THEN 1120 720 LET I5=Y1-Y 730 PRINT 740 LET I6=M1-M 750 LET I7=D1-D 760 IF I7>=0 THEN 790 770 LET I6=I6-1 780 LET I7=I7+30 790 IF I6>=0 THEN 820 800 LET I5=I5-1 810 LET I6=I6+12 820 IF I5<0 THEN 1310 830 IF I7<>0 THEN 850 835 IF I6<>0 THEN 850 840 PRINT "****HAPPY BIRTHDAY*****" 850 PRINT " "," ","YEARS","MONTHS","DAYS" 860 PRINT "YOUR AGE ",I5,I6,I7 870 LET A8= (I5*365)+(I6*30)+I7+INT(I6/2) 880 LET K5=I5 890 LET K6=I6 900 LET K7=I7 920 LET E=Y+65 940 LET F=.35 950 PRINT "YOU HAVE SLEPT ", 960 GOSUB 1370 970 LET F=.17 980 PRINT "YOU HAVE EATEN ", 990 GOSUB 1370 1000 LET F=.23 1010 IF K5 > 3 THEN 1040 1020 PRINT"YOU HAVE PLAYED ", 1030 GOTO 1080 1040 IF K5 > 9 THEN 1070 1050 PRINT "YOU HAVE PLAYED/STUDIED", 1060 GOTO 1080 1070 PRINT "YOU HAVE WORKED/STUDIED", 1080 GOSUB 1370 1090 PRINT "YOU HAVE RELAXED ",K5,K6,K7 1100 PRINT 1110 PRINT " ","**YOU MAY RETIRE IN";E;"**" 1120 PRINT 1130 PRINT" CALCULATED BY THE BEST MINICOMPUTER TODAY - THE GREAT PDP-8" 1140 FOR Q=1 TO 2 1150 PRINT 1160 NEXT Q 1170 PRINT 1240 GOTO 240 1250 IF D=13 THEN 1280 1260 PRINT "FRIDAY " 1270 GOTO 710 1280 PRINT "FRIDAY THE THIRTEENT@---BEWARE!" 1290 GOTO 710 1300 PRINT "NOT PREPARED TO GIVE DAY OF WEEK PRIOR TO MDLXPXII -" 1305 PRINT " THE CURRENT CALENDAR DID NOT EXIST BEFORE THAT YEAR." 1310 GOTO 1140 1330 DATA 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 1370 LET K1= INT(F*A8) 1380 LET I5 = INT(K1/365) 1390 LET K1 = K1-(I5*365) 1400 LET I6 = INT(K1/30) 1410 LET I7 = K1-(I6*30) 1420 LET K5 = K5-I5 1430 LET K6 = K6-I6 1440 LET K7 = K7-I7 1450 IF K7 >= 0 THEN 1480 1460 LET K7 = K7+30 1470 LET K6 = K6-1 1480 IF K6 > 0 THEN 1510 1490 LET K6 = K6+12 1500 LET K5 = K5-1 1510 PRINT I5,I6,I7 1520 RETURN 1530 IF K6 = 12 THEN 1550 1540 GOTO 1090 1550 LET K5 = K5+1 1560 LET K6=0 1570 GOTO 1090 1580 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 | 1 PRINT "FOR HELP TYPE 'HELP WUMPUS' AS AN OS8 COMMAND" 2 PRINT "ENTER A RANDOM NUMBER"; 3 INPUT M 4 PRINT "HERE WE GO----" 5 PRINT "DOWN" 6 PRINT " O" 7 PRINT " W" 8 PRINT "DOWN" 9 PRINT 10 DIM A(20),B(20),C(20),D(20) 20 DIM Q$(20),P$(10) 25 READ Q$ 30 RANDOMIZE 40 FOR Z=1 TO 20 50 A(Z)=0 60 B(Z)=0 70 C(Z)=0 80 D(Z)=0 90 NEXT Z 100 R0=.02 105 B0=0 110 L0=0 120 FOR Z=1 TO 20 130 IF A(Z)<>0 GOTO 190 140 F=INT(20*RND(0))+1 150 IF F=Z GOTO 140 160 IF A(F)<>0 GOTO 140 170 A(Z)=F 180 A(F)=Z 190 NEXT Z 200 FOR Z=1 TO 20 210 IF B(Z)<>0 GOTO 280 220 F=INT(20*RND(0))+1 230 IF F=Z GOTO 220 240 IF A(Z)=F GOTO 220 250 IF B(F)<>0 GOTO 220 260 B(Z)=F 270 B(F)=Z 280 NEXT Z 290 FOR X=1 TO 20 300 IF D(X)<>0 GOTO 410 310 IF X=1 GOTO 340 320 B(Y)=X 330 B(X)=Y 340 Y=X 350 D(Y)=1 360 Y=A(Y) 370 D(Y)=1 380 IF B(Y)=X GOTO 410 390 Y=B(Y) 400 GOTO 350 410 D(X)=0 420 NEXT X 430 B(Y)=1 440 B(1)=Y 450 FOR Z=1 TO 20 460 IF C(Z)<>0 GOTO 540 470 F=INT(20*RND(0))+1 480 IF F=Z GOTO 470 490 IF F=A(Z) GOTO 470 500 IF F=B(Z) GOTO 470 510 IF C(F)<>0 GOTO 470 520 C(Z)=F 530 C(F)=Z 540 NEXT Z 550 FOR X=1000 TO 10000 STEP 9000 560 FOR Z=1 TO 3 570 F=INT(20*RND(0))+1 580 IF D(F)>=X GOTO 570 590 D(F)=D(F)+X 600 GOSUB 2130 610 NEXT Z 620 NEXT X 630 F=INT(20*RND(0))+1 640 X=100000 650 D(F)=D(F)+X 660 GOSUB 2130 670 W=F 680 F=A(W) 690 GOSUB 2130 700 F=B(W) 710 GOSUB 2130 720 F=C(W) 730 GOSUB 2130 740 H=INT(20*RND(0))+1 750 IF D(H)>=1000 GOTO 740 760 FOR S=5 TO 1 STEP -1 770 IF L0=0 GOTO 777 772 GOSUB 1740 774 PRINT "I SEE THAT TUNNELS A B AND C LEAD TO ROOMS"; 776 PRINT A(H);B(H);"AND";C(H);"RESPECTIVELY" 777 IF RND(0)>.04 GOTO 779 778 GOSUB 2191 779 J=D(H) 780 IF J>=1000 GOTO 1240 790 GOTO 1090 800 IF J=0 GOTO 890 810 IF J=INT(J/10)*10 GOTO 830 820 PRINT "I HEAR SQUEAKING, "; 830 J=INT(J/10) 840 IF J=INT(J/10)*10 GOTO 860 850 PRINT "I FEEL A DRAFT, "; 860 IF J<10 GOTO 880 870 PRINT "I SMELL A WUMPUS"; 880 PRINT 890 PRINT "YOU ARE IN ROOM";H;" MOVE THROUGH TUNNEL"; 895 H1=H 900 INPUT P$ 910 IF P$<>"A" GOTO 940 920 H=A(H) 930 GOTO 770 940 IF P$<>"B" GOTO 970 950 H=B(H) 960 GOTO 770 970 IF P$<>"C" GOTO 1000 980 H=C(H) 990 GOTO 770 1000 IF P$="SHOOT" GOTO 1470 1010 IF P$<>"MAP" GOTO 1040 1020 GOSUB 2200 1030 GOTO 779 1040 IF P$<>"LIGHTS ON" GOTO 1070 1050 L0=1 1060 GOTO 770 1070 IF P$<>"LIGHTS OFF" GOTO 770 1075 L0=0 1080 GOTO 770 1090 IF RND(0)>R0 GOTO 800 1100 PRINT "YOU TRIPPED ON A ";Q$;" IN ROOM";H; 1110 F=INT(20*RND(0))+1 1120 IF F=A(H) GOTO 1150 1130 IF F=B(H) GOTO 1150 1140 IF F<>C(H) GOTO 1110 1145 IF F=H GOTO 1110 1150 PRINT "AND HAVE TUMBLED INTO ROOM";F 1160 IF R0<.2 GOTO 1190 1165 IF RND(0)<.5 GOTO 1190 1170 PRINT "YOU ARE GETTING CLUMSIER BY THE MINUTE" 1180 PRINT "YOU SEEM TO BE STUMBLING AROUND";R0*100;"% OF THE TIME" 1190 R0=R0+.02 1200 H=F 1210 IF D(H)>=100000 GOTO 1430 1220 GOSUB 1740 1230 GOTO 770 1240 J=INT(J/1000) 1250 IF J>=10 GOTO 1300 1260 PRINT "THERE IS A SUPER-BAT IN ROOM";H;". FLAP--FLAP OUCH!!" 1270 H=INT(20*RND(0))+1 1280 IF D(H)>999 GOTO 1270 1283 IF H=H1 GOTO 1270 1290 GOTO 770 1300 IF J>=100 GOTO 1430 1310 PRINT "YOU FELL INTO THE BOTTOMLESS PIT IN ROOM";H 1320 IF J-10<>0 GOTO 2050 1330 IF D(H)<>INT(D(H)/10)*10 GOTO 2070 1340 PRINT "PLAY AGAIN (YES OR NO)"; 1350 RESTORE 1360 INPUT P$ 1370 PRINT 1380 IF P$="YES" GOTO 40 1390 IF P$<>"MAP" GOTO 1420 1400 GOSUB 2200 1410 GOTO 1340 1420 STOP 1430 PRINT "YOU HAVE BEEN DEVOURED BY THE WUMPUS IN ROOM";H 1440 GOTO 1340 1450 PRINT "YOU SHOT YOURSELF" 1460 GOTO 1340 1470 PRINT "THE ARROW ZINGS IN"; 1480 K=H 1490 K1=H 1500 FOR R=1 TO 5 1510 PRINT "TO ROOM "; 1520 INPUT M 1530 IF M=A(K) GOTO 1600 1540 IF M=B(K) GOTO 1600 1550 IF M=C(K) GOTO 1600 1560 IF M=0 GOTO 1700 1570 R=6 1580 M=INT(20*RND(0))+1 1590 GOTO 1530 1600 IF R<=5 GOTO 1626 1620 PRINT "THE ARROW WENT ASTRAY" 1624 GOTO 1630 1626 IF M=K1 GOTO 1570 1630 IF M=H GOTO 1450 1640 IF D(M)<100000 GOTO 1670 1650 PRINT "YOU HAVE SLAIN THE WUMPUS" 1655 S=S-1 1660 GOTO 1340 1670 IF INT(D(M)/1000)=INT(D(M)/10000)*10 GOTO 1678 1671 PRINT "YOU PICKED OFF AN INNOCENT SUPER-BAT" 1672 X=-1000 1673 F=M 1674 GOSUB 2130 1675 D(M)=D(M)-1000 1676 B0=B0+1 1677 GOTO 1700 1678 K1=K 1680 K=M 1690 NEXT R 1700 GOSUB 1740 1710 NEXT S 1720 PRINT "YOU HAVE EXHAUSTED YOUR SUPPLY OF ARROWS -- THE SHOW'S OVER" 1730 GOTO 1340 1740 IF RND(0)>.5 GOTO 2000 1750 PRINT "ROAR**THUD**THUD**RRUUMMBBLLEE**THWUMP**ZZZZZZZZZZZ" 1760 X=-100000 1770 F=W 1780 GOSUB 2130 1790 F=A(W) 1800 GOSUB 2130 1810 F=B(W) 1820 GOSUB 2130 1830 F=C(W) 1840 GOSUB 2130 1850 D(W)=D(W)-100000 1860 F=INT(20*RND(0))+1 1870 IF F=A(W) GOTO 1900 1880 IF F=B(W) GOTO 1900 1890 IF F<>C(W) GOTO 1860 1900 X=100000 1910 D(F)=D(F)+X 1920 W=F 1930 GOSUB 2130 1940 F=A(W) 1950 GOSUB 2130 1960 F=B(W) 1970 GOSUB 2130 1980 F=C(W) 1990 GOSUB 2130 2000 READ Q$ 2010 IF Q$<>"END" GOTO 2040 2020 RESTORE 2030 GOTO 2000 2040 RETURN 2050 PRINT "YOU HAVE BEEN SNATCHED UP BY A SUPER-BAT" 2060 GOTO 1270 2070 PRINT "THERE IS A BAT IN AN ADJACENT ROOM -- HE'S FLYING THIS WAY!" 2080 IF RND(0)>.25 GOTO 2110 2090 PRINT "YOU STRUCK YOUR HEAD ON A ";Q$;" GOOD-BYYEEE" 2100 GOTO 1340 2110 PRINT "PHEWWW!!! "; 2120 GOTO 2050 2130 F1=A(F) 2140 D(F1)=D(F1)+X/1000 2150 F1=B(F) 2160 D(F1)=D(F1)+X/1000 2170 F1=C(F) 2180 D(F1)=D(F1)+X/1000 2190 RETURN 2191 IF B0<0 GOTO 2199 2192 B0=B0-1 2193 F=INT(20*RND(0))+1 2194 IF INT(D(F)/1000)<>INT(D(F)/10000)*10 GOTO 2193 2195 X=1000 2196 D(F)=D(F)+X 2197 GOSUB 2130 2198 PRINT "ANOTHER SUPER-BAT HAS BEEN BORN. LOOKS LIKE A STRONG ONE!" 2199 RETURN 2200 Z=1 2210 PRINT Z;TAB(4);A(Z);TAB(8);B(Z);TAB(12);C(Z);TAB(16);D(Z);TAB(24); 2220 Z=Z+1 2230 PRINT Z;TAB(28);A(Z);TAB(32);B(Z);TAB(36);C(Z);TAB(40);D(Z);TAB(48); 2232 Z=Z+1 2233 IF Z>20 GOTO 2245 2234 PRINT Z;TAB(52);A(Z);TAB(56);B(Z);TAB(60);C(Z);TAB(64);D(Z) 2235 Z=Z+1 2240 GOTO 2210 2245 PRINT 2250 PRINT "HEAR=1 FEEL=10 SMELL=100 "; 2260 PRINT "BATS=1000 PIT=10000 WUMPUS=100000" 2270 PRINT "YOU ARE IN ROOM ";H;" AND HAVE ";S;" ARROW(S) LEFT" 2280 RETURN 2290 DATA "CORPSE","DEAD BAT","BROKEN ARROW","STALAGMITE","PEBBLE" 2291 DATA "WUMPUS CLAW","LEDGE","LUNCH BAG","DOG" 2300 DATA "END" 2310 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 | 900 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 1060 DIM A(4,15),T(4,15),F(4,15),S(4,15),L(4,15),K(4,15),H(15,15) 1065 DIM Z$(15) 1070 FOR I=1TO5\B(I)=0\Q(I)=0\A1(I)=0\NEXT I 1120 RANDOMIZE 1130 PRINT "HOW MANY PLAYERS (TYPE: '0' FOR INSTRUCTIONS)"; 1140 INPUT P 1150 IF P>15 THEN 1180 1160 IF P<>0 THEN 1240\CHAIN "RKB0:YAHTZE.IN" 1180 GOSUB 5710 1190 GOTO 1130 1240 FOR I=1 TO P 1250 A(1,I)=-5 1260 T(1,I)=-5\T(2,I)=-5\F(1,I)=-5\F(2,I)=-5\S(1,I)=-5 1310 T(3,I)=-5\F(3,I)=-5\F(4,I)=-5\S(2,I)=-5\L(1,I)=-5 1360 Y(I)=-5\C(I)=-5\K(1,I)=0\K1(I)=0\M(I)=0 1410 PRINT "NAME"; 1420 INPUT N$(I) 1470 NEXT I 1480 R=0 1490 R=R+1 1495 IF R>13 THEN 6470 1500 PRINT\PRINT\PRINT "ROUND";R\PRINT 1540 FOR I=1 TO P 1550 PRINT\PRINT\PRINT N$(I);"'S TURN" 1580 FOR L=1TO5\A1(L)=INT(6*RND(0)+1)\NEXT L 1605 GOSUB 1610 1607 GOTO 1700 1610 G=0 1620 FOR X=1 TO 5 1630 IF A1(X)>=A1(X+1) THEN 1680 1640 H=A1(X) 1650 A1(X)=A1(X+1) 1660 A1(X+1)=H 1670 G=1 1680 NEXT X 1685 IF G=1 THEN 1610 1690 RETURN 1700 PRINT "YOU HAVE A ";A1(1);A1(2);A1(3);A1(4);A1(5) 1710 PRINT "THIS IS YOUR 2ND OF 3 ROLLS," 1720 PRINT "HOW MANY DO YOU WANT TO CHANGE"; 1730 INPUT Z 1780 IF Z=0 THEN 2620 1790 IF Z=5 THEN 1890 1792 FOR E=1 TO 5\B(E)=0\NEXT E 1800 FOR S=1 TO Z 1810 PRINT "WHICH"; 1820 INPUT B(S) 1870 NEXT S 1880 GOTO 1930 1890 FOR S=1 TO 5 1900 A1(S)=INT(6*RND(-1)+1) 1910 NEXT S 1920 GOTO 2050 1930 FOR L=1 TO 5 1940 FOR L1=1 TO 5 1950 IF B(L)=L1 THEN 1970 1960 GOTO 1980 1970 A1(L1)=Q(L1) 1980 NEXT L1 1990 NEXT L 2000 FOR S=1 TO 5 2010 IF A1(S)=0 THEN 2030 2020 GOTO 2040 2030 A1(S)=INT(6*RND(-1)+1) 2040 NEXT S 2050 GOSUB 1610 2140 PRINT "YOU HAVE A ";A1(1);A1(2);A1(3);A1(4);A1(5) 2150 PRINT "THIS IS YOUR LAST ROLL," 2160 PRINT "HOW MANY DO YOU WANT TO CHANGE"; 2170 INPUT Z 2220 IF Z=0 THEN 2620 2230 IF Z=5 THEN 2360 2240 FOR E=1 TO 5 2250 B(E)=0 2260 NEXT E 2270 FOR S=1 TO Z 2280 PRINT "WHICH"; 2290 INPUT B(S) 2340 NEXT S 2350 GOTO 2400 2360 FOR S=1 TO 5 2370 A1(S)=INT(6*RND(-1)+1) 2380 NEXT S 2390 GOTO 2520 2400 FOR L=1 TO 5 2410 FOR L1=1 TO 5 2420 IF B(L)=L1 THEN 2440 2430 GOTO 2450 2440 A1(L1)=Q(L) 2450 NEXT L1 2460 NEXT L 2470 FOR S=1 TO 5 2480 IF A1(S)=0 THEN 2500 2490 GOTO 2510 2500 A1(S)=INT(6*RND(-1)+1) 2510 NEXT S 2520 GOSUB 1610 2610 PRINT "YOU HAVE A ";A1(1);A1(2);A1(3);A1(4);A1(5) 2620 PRINT "HOW DO YOU WANT THIS ROUND SCORED"; 2630 INPUT Z$ 2650 IF Z$="SUMMARY" THEN 2670 2660 GOTO 2700 2670 GOSUB 6140 2675 GOTO 2620 2700 IF Z$="ACES" THEN 2850 2710 IF Z$="TWOS" THEN 2940 2720 IF Z$="THREES" THEN 3030 2730 IF Z$="FOURS" THEN 3120 2740 IF Z$="FIVES" THEN 3210 2750 IF Z$="SIXES" THEN 3300 2760 IF Z$="THREE OF A KIND" THEN 3390 2770 IF Z$="FOUR OF A KIND" THEN 3440 2780 IF Z$="FULL HOUSE" THEN 3520 2790 IF Z$="SM. STRAIGHT" THEN 3620 2800 IF Z$="LG. STRAIGHT" THEN 3660 2810 IF Z$="YAHTZEE" THEN 3730 2820 IF Z$="CHANCE" THEN 3820 2830 IF Z$="ZERO" THEN 3890 2840 GOTO 2620 2850 IF A(1,I)<>-5 THEN 3870 2860 A(1,I)=0 2870 FOR S=1 TO 5 2880 IF A1(S)=1 THEN 2900 2890 GOTO 2910 2900 A(1,I)=A(1,I)+1 2910 NEXT S 2920 M(I)=A(1,I) 2930 GOTO 4690 2940 IF T(1,I)<>-5 THEN 3870 2950 T(1,I)=0 2960 FOR S=1 TO 5 2970 IF A1(S)=2 THEN 2990 2980 GOTO 3000 2990 T(1,I)=T(1,I)+2 3000 NEXT S 3010 M(I)=T(1,I) 3020 GOTO 4690 3030 IF T(2,I)<>-5 THEN 3870 3040 T(2,I)=0 3050 FOR S=1 TO 5 3060 IF A1(S)=3 THEN 3080 3070 GOTO 3090 3080 T(2,I)=T(2,I)+3 3090 NEXT S 3100 M(I)=T(2,I) 3110 GOTO 4690 3120 IF F(1,I)<>-5 THEN 3870 3130 F(1,I)=0 3140 FOR S=1 TO 5 3150 IF A1(S)=4 THEN 3170 3160 GOTO 3180 3170 F(1,I)=F(1,I)+4 3180 NEXT S 3185 M(I)=F(1,I) 3190 GOTO 4690 3210 IF F(2,I)<>-5 THEN 3870 3220 F(2,I)=0 3230 FOR S=1 TO 5 3240 IF A1(S)=5 THEN 3260 3250 GOTO 3270 3260 F(2,I)=F(2,I)+5 3270 NEXT S 3280 M(I)=F(2,I) 3290 GOTO 4690 3300 IF S(1,I)<>-5 THEN 3870 3310 S(1,I)=0 3320 FOR S=1 TO 5 3330 IF A1(S)=6 THEN 3350 3340 GOTO 3360 3350 S(1,I)=S(1,I)+6 3360 NEXT S 3370 M(I)=S(1,I) 3380 GOTO 4690 3390 IF T(3,I)<>-5 THEN 3870 3400 T(3,I)=0 3410 T(3,I)=A1(1)+A1(2)+A1(3)+A1(4)+A1(5) 3420 M(I)=T(3,I) 3430 GOTO 4690 3440 IF F(3,I)<>-5 THEN 3870 3450 IF A1(1)<>A1(4) THEN 4960 3460 IF A1(2)<>A1(3) THEN 4960 3470 F(3,I)=0 3480 F(3,I)=A1(1)+A1(2)+A1(3)+A1(4)+A1(5) 3490 M(I)=F(3,I) 3500 F(3,I)=0 3510 GOTO 4690 3520 IF F(4,I)<>-5 THEN 3870 3530 IF A1(1)<>A1(2) THEN 4960 3540 IF A1(4)<>A1(5) THEN 4960 3550 IF A1(3)<>A1(2) THEN 3570 3560 GOTO 3590 3570 IF A1(3)<>A1(4) THEN 4960 3590 F(4,I)=25 3600 M(I)=F(4,I) 3610 GOTO 4690 3620 IF S(2,I)<>-5 THEN 3870 3630 S(2,I)=30 3640 M(I)=S(2,I) 3650 GOTO 4690 3660 IF L(1,I)<>-5 THEN 3870 3670 IF A1(1)<>A1(5)+4 THEN 4960 3680 IF A1(2)<>A1(4)+2 THEN 4960 3690 IF A1(3)<>A1(5)+2 THEN 4960 3700 L(1,I)=40 3710 M(I)=L(1,I) 3720 GOTO 4690 3730 IF Y(I)<>-5 THEN 3870 3740 FOR O=1 TO 5 3750 FOR O1=1 TO 5 3760 IF A1(O)<>A1(O1) THEN 4960 3770 NEXT O1 3780 NEXT O 3790 Y(I)=50 3800 M(I)=Y(I) 3810 GOTO 4690 3820 IF C(I)<>-5 THEN 3870 3830 C(I)=A1(1)+A1(2)+A1(3)+A1(4)+A1(5) 3850 M(I)=C(I) 3860 GOTO 4690 3870 GOSUB 4650 3880 GOTO 2620 3890 PRINT "WHAT DO YOU WANT TO ZERO"; 3900 INPUT Z$ 3920 IF Z$="SUMMARY" THEN 3940 3930 GOTO 3970 3940 GOSUB 6140 3945 GOTO 2620 3970 IF Z$="ACES" THEN 4110 3980 IF Z$="TWOS" THEN 4150 3990 IF Z$="THREES" THEN 4190 4000 IF Z$="FOURS" THEN 4230 4010 IF Z$="FIVES" THEN 4270 4020 IF Z$="SIXES" THEN 4310 4030 IF Z$="THREE OF A KIND" THEN 4350 4040 IF Z$="FOUR OF A KIND" THEN 4390 4050 IF Z$="FULL HOUSE" THEN 4430 4060 IF Z$="SM. STRAIGHT" THEN 4470 4070 IF Z$="LG. STRAIGHT" THEN 4510 4080 IF Z$="YAHTZEE" THEN 4550 4090 IF Z$="CHANCE" THEN 4590 4100 GOTO 3890 4110 IF A(1,I)<>-5THEN 4630 4120 A(1,I)=0 4130 M(I)=A(1,I) 4140 GOTO 4690 4150 IF T(1,I)<>-5 THEN 4630 4160 T(1,I)=0 4170 M(I)=T(1,I) 4180 GOTO 4690 4190 IF T(2,I)<>-5 THEN 4630 4200 T(2,I)=0 4210 M(I)=T(2,I) 4220 GOTO 4690 4230 IF F(1,I)<>-5 THEN 4630 4240 F(1,I)=0 4250 M(I)=F(1,I) 4260 GOTO 4690 4270 IF F(2,I)<>-5 THEN 4630 4280 F(2,I)=0 4290 M(I)=F(2,I) 4300 GOTO 4690 4310 IF S(1,I)<>-5 THEN 4630 4320 S(1,I)=0 4330 M(I)=S(1,I) 4340 GOTO 4690 4350 IF T(3,I)<>-5 THEN 4630 4360 T(3,I)=0 4370 M(I)=T(3,I) 4380 GOTO 4690 4390 IF F(3,I)<>-5 THEN 4630 4400 F(3,I)=0 4410 M(I)=F(3,I) 4420 GOTO 4690 4430 IF F(4,I)<>-5 THEN 4630 4440 F(4,I)=0 4450 M(I)=F(4,I) 4460 GOTO 4690 4470 IF S(2,I)<>-5 THEN 4630 4480 S(2,I)=0 4490 M(I)=S(2,I) 4500 GOTO 4690 4510 IF L(1,I)<>-5 THEN 4630 4520 L(1,I)=0 4530 M(I)=L(1,I) 4540 GOTO 4690 4550 IF Y(I)<>-5 THEN 4630 4560 Y(I)=0 4570 M(I)=Y(I) 4580 GOTO 4690 4590 IF C(I)<>-5 THEN 4630 4600 C(I)=0 4610 M(I)=C(I) 4620 GOTO 4690 4630 GOSUB 4650 4640 GOTO 2620 4650 PRINT "YOU HAVE ALREADY USED ";Z$;" AS A CATEGORY" 4660 PRINT 4670 RETURN 4680 GOTO 2620 4690 PRINT N$(I);" YOU GET A SCORE OF ";M(I);" FOR THIS ROUND" 4700 GOTO 5750 4710 NEXT I 4720 PRINT 4730 FOR J=1 TO P 4740 IF M(J)=A(1,J) THEN 4810 4750 IF M(J)=T(1,J) THEN 4810 4760 IF M(J)=T(2,J) THEN 4810 4770 IF M(J)=F(1,J) THEN 4810 4780 IF M(J)=F(2,J) THEN 4810 4790 IF M(J)=S(1,J) THEN 4810 4800 GOTO 4920 4810 K(1,J)=K(1,J)+M(J) 4830 IF K(1,J)>=63 THEN 4860 4840 K1(J)=K1(J)+M(J) 4850 GOTO 4930 4860 K(1,J)=K(1,J)+35 4870 PRINT N$(J);" HAS ACCUMULATED AT LEAST 63 POINTS" 4880 PRINT "IN THE FIRST SIX CATEGORIES." 4890 PRINT "HE SCORED A BONUS OF 35 POINTS!" 4900 K1(J)=K1(J)+M(J) 4910 GOTO 4930 4920 K1(J)=K1(J)+M(J) 4930 PRINT N$(J);" HAS ";K1(J);" POINTS" 4940 NEXT J 4950 GOTO 1490 4960 PRINT "IT IS ILLEGAL TO USE ";Z$;" THIS ROUND" 4970 GOTO 2620 5680 PRINT "WHICH CATEGORY DO YOU WANT ZEROED" 5690 RETURN 5710 PRINT "A MAXIMUM OF 15 PLAYERS IS ALLOWED" 5720 RETURN 5750 IF Z$="ACES" THEN 5880 5760 IF Z$="TWOS" THEN 5900 5770 IF Z$="THREES" THEN 5920 5780 IF Z$="FOURS" THEN 5940 5790 IF Z$="FIVES" THEN 5960 5800 IF Z$="SIXES" THEN 5980 5810 IF Z$="THREE OF A KIND" THEN 6000 5820 IF Z$="FOUR OF A KIND" THEN 6020 5830 IF Z$="FULL HOUSE" THEN 6040 5840 IF Z$="SM. STRAIGHT" THEN 6060 5850 IF Z$="LG. STRAIGHT" THEN 6080 5860 IF Z$="YAHTZEE" THEN 6100 5870 IF Z$="CHANCE" THEN 6120 5880 H(I,R)=1\GOTO 4710 5900 H(I,R)=2\GOTO 4710 5920 H(I,R)=3\GOTO 4710 5940 H(I,R)=4\GOTO 4710 5960 H(I,R)=5\GOTO 4710 5980 H(I,R)=6\GOTO 4710 6000 H(I,R)=7\GOTO 4710 6020 H(I,R)=8\GOTO 4710 6040 H(I,R)=9\GOTO 4710 6060 H(I,R)=10\GOTO 4710 6080 H(I,R)=11\GOTO 4710 6100 H(I,R)=12\GOTO 4710 6120 H(I,R)=13\GOTO 4710 6140 PRINT N$(I);" HAS USED THE FOLLOWING CATEGORIES:" 6150 FOR S=1 TO R-1 6160 IF H(I,S)>7 THEN 6180 6170 IF H(I,S)=2 GOTO 6210\IFH(I,S)=3GOTO6230\IFH(I,S)=4GOTO6250 6175 IF H(I,S)=5 GOTO 6270\IFH(I,S)=6GOTO6290\IFH(I,S)=7GOTO6310 6180 IF H(I,S)=8 GOTO 6330\IFH(I,S)=9GOTO6350\IFH(I,S)=10GOTO6370 6185 IF H(I,S)=11GOTO6390\IFH(I,S)=12GOTO6410\IFH(I,S)=13GOTO6430 6190 PRINT "ACES, ";\GOTO 6440 6210 PRINT "TWOS, ";\GOTO 6440 6230 PRINT "THREES, ";\GOTO 6440 6250 PRINT "FOURS, ";\GOTO 6440 6270 PRINT "FIVES, ";\GOTO 6440 6290 PRINT "SIXES, ";\GOTO 6440 6310 PRINT "THREE OF A KIND, ";\GOTO 6440 6330 PRINT "FOUR OF A KIND, ";\GOTO 6440 6350 PRINT "FULL HOUSE, ";\GOTO 6440 6370 PRINT "SM. STRAIGHT, ";\GOTO 6440 6390 PRINT "LG. STRAIGHT, ";\GOTO 6440 6410 PRINT "YAHTZEE, ";\GOTO 6440 6430 PRINT "CHANCE, "; 6440 NEXT S 6445 PRINT\PRINT "HE HAS ";K1(I);" POINTS." 6447 PRINT "AND ";K(1,I);" OF THE 65 POINTS NEEDED FOR THE BONUS"; 6450 PRINT "." 6460 RETURN 6470 G=0 6480 FOR X=1 TO P 6490 IF S1(X)>=S1(X+1) THEN 6540 6500 H=S1(X) 6510 S1(X)=S1(X+1) 6520 S1(X+1)=H 6530 G=1 6540 NEXT X 6550 IF G=1 THEN 6470 6560 PRINT "THE GAME IS OVER."\PRINT 6571 FOR X=1 TO P\IF K1(X)=S1(X) THEN 6580\NEXT X 6580 GOTO 6585 6585 IF P=1 THEN 9999 6586 PRINT "FINAL SCORES ARE:" 6590 FOR Y=1 TO P 6600 IF K1(Y)=S1(X) THEN 6620 6610 PRINT N$(Y);" FINISHES WITH ";K1(Y);" POINTS." 6620 NEXT Y 9999 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 4980 PRINT 4990 PRINT 5000 PRINT 5010 PRINT "INSTRUCTIONS FOR PLAYING YAHTZEE" 5020 PRINT 5030 PRINT "YAHTZEE MAY BE PLAYED BY UP TO 15 PEOPLE." 5040 PRINT "THE OBJECT OF THE GAME IS TO GET THE HIGHEST SCORE" 5050 PRINT "EACH PLAYER ON HIS TURN RECEIVES FROM THE COMPUTER" 5060 PRINT "THE VALUES OF THE 5 PSEUDO-DICE. HE MAY THEN ROLL" 5070 PRINT "AS MANY OF THEM AS HE WANTS TO AGAIN. HOWEVER," 5080 PRINT "HE IS ENTITLED UP TO BUT NO MORE THAN THREE ROLLS" 5090 PRINT "OF THE DICE." 5100 PRINT " YOU TELL THE COMPUTER HOW MANY DICE YOU" 5110 PRINT "WANT TO CHANGE, THEN TELL IT WHICH ONES IN THE FOL-" 5120 PRINT "LOWING MANNER;" 5130 PRINT 5140 PRINT " TYPE: '1' FOR THE 1ST DIE, '2' FOR THE 2ND, ETC." 5150 PRINT " AFTER THE THIRD ROLL THE PLAYER MUST DECIDE HOW" 5160 PRINT "HE WANTS TO SCORE HIS FIVE DICE." 5170 PRINT "TYPING 'SUMMARY' WILL SHOW WHAT CATEGORIES" 5180 PRINT "HAVE BEEN USED. OTHERWISE," 5190 PRINT "YOU HAVE 13 CHOICES, TYPE ONE OF THE FOLLOWING" 5200 PRINT "DEPENDING ON HOW YOU WANT YOUR DICE SCORED." 5210 PRINT "THE CHOICES ARE:" 5220 PRINT "ACES,TWOS,THREES,FOURS,FIVES,SIXES" 5230 PRINT "THREE OF A KIND,FOUR OF A KIND,FULL HOUSE, SM. STRAIGHT," 5240 PRINT "LG. STRAIGHT, YAHTZEE,CHANCE." 5250 PRINT "WHAT THE COMPUTER WILL DO:" 5260 PRINT "FOR ACES IT WILL COUNT AND ADD ALL OF YOUR ONES." 5270 PRINT "FOR TWOS IT WILL COUNT AND ADD ALL OF YOUR TWOS." 5280 PRINT "THE SAME IS TRUE THROUGH THE SIXES" 5290 PRINT "THREE OF A KIND WILL TOTAL ALL OF THE DICE PRO-" 5300 PRINT "VIDED THAT YOU HAVE THREE OF A KIND" 5310 PRINT "FOUR OF A KIND IS THE SAME AS THREE OF A KIND EXCEPT" 5320 PRINT "THAT YOU MUST HAVE FOUR OF A KIND" 5330 PRINT "FULL HOUSE (3 OF ONE NO. AND 2 OF ANOTHER) WILL YIELD" 5340 PRINT "25 POINTS. SM. STRAIGHT WILL GIVE YOU 30 POINTS BUT" 5350 PRINT "YOU MUST HAVE A SEQUENCE OF FOUR." 5360 PRINT "LG.STRAIGHT WILL YIELD 40 POINTS BUT YOU MUST HAVE A SE-" 5370 PRINT "QUENCE OF FIVE." 5380 PRINT "YAHTZEE WILL GIVE 50 POINTS IF YOU HAVE FIVE OF A KIND." 5390 PRINT "CHANCE WILL TOTAL ALL OF YOUR DICE AND USE THAT AS YOUR SCORE." 5400 PRINT "CHANCE IS USEFUL WHEN YOU DON'T HAVE ANY THING WORTH SCORING." 5410 PRINT "ANOTHER CATEGORY, 'ZERO' WILL ZERO OUT A CATAGORY" 5420 PRINT "IF YOU DON'T HAVE ANYTHING WORTH SCORING" 5430 PRINT "BUT HAVE PERHAPS ALREADY USED YOUR CHANCE." 5440 PRINT 5450 PRINT "IF YOUR ACCUMULATED SCORE OF THE FIRST SIX CATEGORIES" 5460 PRINT "EVER REACHES AT LEAST 63 POINTS YOU WILL RECEIVE" 5470 PRINT "A BONUS OF 35 POINTS!" 5480 PRINT 5530 PRINT 5540 PRINT 5550 PRINT 5560 PRINT "GOOD LUCK!!!!!" 5570 CHAIN "RKB0:YAHTZE.BA" 5575 END |
︙ | ︙ | |||
768 769 770 771 772 773 774 | /* * inclusive 'or' the primary and secondary registers * */ void gen_or () { output_line("\tJMSI POP"); | | | 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 | /* * inclusive 'or' the primary and secondary registers * */ void gen_or () { output_line("\tJMSI POP"); output_line("\tMQA"); stkp = stkp + INTSIZE; } /* * exclusive 'or' the primary and secondary registers * */ |
︙ | ︙ |
|
| < < < < | 1 2 3 4 5 6 7 | /** * The functions created to implement this C compiler have wide and diverse * couplings and dependencies. * In order to silence pedantic warnings by very modern compilers, this module * creates the external declarations required for everybody to cross connect. * * This is a list of all declarations used outside of the various modules. |
︙ | ︙ |
|
| < < < < < | | | | | | | < | | < | | | | | | | | | | > | | > | | > | | > | | > | | | | | | | | | | | | < < | | > | | | | > > | | | | > | | | | | | > | | | > > > < > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 | #define SMAX 10 #define CMAX 256 #define BMAX 64 #define LMAX 32 #define DMAX 32 #define CBMX 1024 #define LXMX 999 int E[SMAX]; /* subroutine line number stack */ int L[CMAX]; /* FOR loop beginning line number */ int M[CMAX]; /* FOR loop maximum index value */ int P[CMAX]; /* program variable value */ int Lb[CBMX]; /* Line buffer of CBMX chars */ int l,i,j; int *C; /* subroutine stack pointer */ int B[BMAX]; /* command input buffer */ int F[2]; /* temporary search string */ int *p,*q,*x,*y,*z,*s,*d; int *m[LXMX]; /* pointers to lines of program. This is a real waste of space! */ int G( ) { /* get program line from buffer */ atoi(B,&l); x=m[l]; if(x){ if(strstr(B," ")) strcpy(x,B); else x=m[l]=0; return; } x=Lb; while(*x) x=x+DMAX; strcpy(x,B); m[l]=x; } /* end G */ /* recursive descent parser for arithmetic/logical expressions */ int S( ) { int o,tm; o=J( ); tm=*p++; switch(tm){ case '=': return o==S( ); break; case '#': return o!=S( ); default: p--; return o; } } /* end S */ int J( ) { int o,tm; o=K( ); tm=*p++; switch(tm){ case '<': return o<J( ); break; case '>': return o>J( ); default: p--; return o; } } /* end J */ int K( ) { int o,tm; o=V( ); tm=*p++; switch(tm){ case '$': return o<=K( ); break; case '!': return o>=K( ); default: p--; return o; } } /* end K */ int V( ) { int o,tm; o=W( ); tm=*p++; switch(tm){ case '+': return o+V( ); break; case '-': return o-V( ); default: p--; return o; } } /* end V */ int W( ) { int o,tm; o=Y( ); tm=*p++; switch(tm){ case '*': return o*W( ); break; case '/': return o/W( ); default: p--; return o; } } /* end W */ int Y( ) { int o; if(*p=='-'){ p++; return -Y(); } q=p; if(isnum(*p)){ while(isnum(*p)) p++; atoi(q,&o); return o; } if(*p=='('){ p++; o=S( ); p++; return o; } return P[*p++]; } /* end Y */ int bfclr() { memset(m,0,LXMX); memset(Lb,0,CBMX); } int main( ) { int tmp; /* temp var to fix bug 07Sep2005 Somos */ bfclr(); while(puts("Ok\r\n"),gets(B)) { switch(*B){ case 'R': /* "RUN" command */ C=E; l=1; for(i=0; i<CMAX; i++) /* initialize variables */ P[i]=0; while(l){ while(!(s=m[l])) l++; while(*s!=' ') s++; /* skip line number */ while ((p=strstr(s,"<>"))){*p++='#';*p=' ';} while ((p=strstr(s,"<="))){*p++='$';*p=' ';} while ((p=strstr(s,">="))){*p++='!';*p=' ';} d=B; j=0; while(*s){ if(*s=='"') j++; if((*s!=' ')|(j&1)) *d++=*s; s++; } *d=j=0; d--; /* backup to last char in line */ if(B[1]!='='){ switch(*B){ case 'E': /* "END" */ puts("End\r\n"); l=-1; break; case 'R': /* "REM" */ if(B[2]!='M') l=*--C; /* "RETURN" */ break; case 'I': if(B[1]=='N'){ /* "INPUT" */ tmp=*d; /* save for bug fix next line 07Sep2005 Somos */ gets(p=B); P[tmp]=S( ); } else { /* "IF" */ tmp=strstr(B,"TH"); /* "THEN" */ *tmp=0; p=B+2; if(S( )){ p=tmp+4; l=S( )-1; } } break; case 'P': /* "PRINT" */ tmp=','; p=B+5; while(tmp==','){ if(*p=='"'){ p++; while(*p!='"') putc(*p++); p++; } else { printf("%d",S( )); } tmp=*p++; putc(' '); } puts("\r\n"); break; case 'G': /* "GOTO" */ p=B+4; if(B[2]=='S'){ /* "GOSUB" */ *C++=l; p++; } l=S( )-1; break; case 'F': /* "FOR" */ tmp=strstr(B,"TO"); /* "TO" */ *tmp=0; p=B+5; P[i=B[3]]=S( ); p=tmp+2; M[i]=S( ); L[i]=l; break; case 'N': /* "NEXT" */ tmp=*d; if(P[tmp]<M[tmp]){ l=L[tmp]; P[tmp]=P[tmp]+1; } break; default: break; } } else { p=B+2; P[*B]=S( ); } l++; } /* end while l */ break; case 'L': /* "LIST" command */ for(j=0; j<LXMX; j++) if(m[j]){ puts(m[j]); puts("\r\n"); } break; case 'N': /* "NEW" command */ bfclr(); break; case 'B': /* "BYE" command */ exit(0); break; case 0: G( ); break; default: G( ); break; }/* end switch *B */ } } /* end main */ |
|
| | | > < | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | /* Print the Fibonacci series. For OS/8 native compiler or cc8 */ /* Invoke with .EXE CCR and enter this filename */ /* Note use of recursion */ int fib(n) { if (n < 2) return n; else return fib(n-1)+fib(n-2); } int main() { int i,rsl; i=1; while (1) { rsl=fib(i); if (rsl<0) { printf("Overflow at #%d = %u\r\n",i,rsl); break; } printf("Fib #%2d = %d\r\n",i,rsl); i++; } } |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 | char bfr[100]; int stk[100]; char num[100]; char dict[101]; /* Room for 25 predefined dictionary entries (101!!!)*/ char func[1000]; char fp[20],ip[20],dp[20]; int rsl,*stkp,noex,tm,ed; char *p,*q,*r,*f,*i,*d; int prcln() { int stp; if (*p==' ') return; if (noex) { if (*p==';') { f--; p=*f; return; } if (atoi(p,&tm) & !tm) { *stkp++=0; return; } if (*p=='.') { /* Print TOS */ r=p+1; if (*r=='"') { p=p+3; while((*p!='"') & *p) putc(*p++); return; } stkp--; printf("%d ",*stkp); if (*r=='S') stkp++; return; } if (*p==':') { ed=1; p++; while(*p==' ') p++; /* skip spaces */ q=num; *q++='$'; /* Function marker */ while(1) { while(*p) if((*q++=*p++)==';') ed=0; *q++=' '; *q=0; r=strcat(func,num); if (!ed) break; puts(":"); gets(p=bfr); q=num; } strcat(func,"\r\n"); return; } stp=1; q=stkp-2; *num=' '; r=p+1; switch(*p) { case '+': stkp--; if (*r=='L') { /* probably +LOOP */ stp=*stkp; p++; break; } *q=*q + *stkp; return; case '-': if (isnum(*r)) { p=p+atoi(p,stkp++); return; } stkp--; *q=*q - *stkp; return; case '*': stkp--; *q=*q * *stkp; return; case '/': stkp--; *q=*q / *stkp; return; case '>': stkp--; *q=*q > *stkp; return; case '<': stkp--; if (*r=='>') { *q=*q != *stkp; p++; return; } *q=*q < *stkp; return; case '=': stkp--; *q=*q == *stkp; return; case '(': while (*p++!=')'); return; default: break; } if(isnum(*p)) { p=p+atoi(p,stkp++); return; } } if (isalpha(*p)) { q=num; *q++='$'; while(*p & (*p!=' ') & (*p!=';')) *q++=*p++; *q++=0; rsl=strstr(dict,num+1); if (rsl==0) { if (noex==0) return; rsl=strstr(func,num); if (rsl==0) { printf("? %s\r\n",num); stkp=stk; /* Zero the stack after invalid token */ return; } *f++=p; /* Push current text pointer*/ p=rsl; while (*p!=' ') p++; /* Skip name and then execute to ; */ return; } rsl=(rsl-dict)/4; q=stkp-1; if ((!noex) & (rsl>1)) return; switch(rsl) { case 0: if (i>ip) i--; noex=1; break; case 1: r=i-1; noex=!*r; break; case 2: r=d-3; *stkp++=*r; break; case 3: *stkp++=*q; break; case 4: stkp--; break; case 5: q--; *stkp++=*q; break; case 6: if (!noex) { *i++=0; break; } stkp--; *i++=noex=(*stkp!=0); break; case 7: rsl=*q; r=q-1; *q=*r; *r=rsl; break; case 8: puts("Bye\r\n"); exit(0); break; case 9: puts("\r\n"); break; case 10: puts(func); break; case 11: stkp--; *d++=*stkp; /* Start */ stkp--; *d++=*stkp; /* Limit */ *d++=p; /* Buffer* */ break; case 12: q=d-3; *q=*q+stp; rsl=*q++; if (stp < 0) { if (rsl>*q++) p=*q; /* repeat loop -ve */ else d=d-3; /* exit loop */ break; } if (*q++>rsl) p=*q; /* repeat loop +ve */ else d=d-3; /* exit loop */ break; case 13: stkp--; putc(*stkp); break; case 14: if (*q) *stkp++=*q; break; case 15: q=stkp-2; stkp--; *q=*q % *stkp; break; case 16: *stkp++=getc(); break; case 17: fopen("FORTH.TX","r"); q=func; while((*q++=fgetc())); break; case 18: fopen("FORTH.TX","w"); q=func; while(*q) fputc(*q++); fclose(); break; case 19: q=stkp-3; tm=*q; r=stkp-2; *q++=*r++; *q++=*r++; *q=tm; break; case 20: rsl=*q; r=q-1; *q=*r; *r=rsl; *stkp++=rsl; break; case 21: q--; stkp--; *q=*q & *stkp; break;; case 22: q--; stkp--; *q=*q | *stkp; break; default: break; } } } int main() { xinit(); puts("Forth interpreter\r\n>"); strcpy(dict,"THENELSEI DUP DROPOVERIF SWAPBYE CR SEE DO "); strcat(dict,"LOOPEMIT?DUPMOD KEY LOADSAVEROT TUCKAND OR "); memset(stk-1,0,101); stkp=stk; f=fp; *func=0; while(1) { p=bfr; gets(bfr); noex=-1; i=ip; /* Init DO and IF stacks here */ d=dp; while(*p) { prcln(); if (*p) p++; } if (stkp<stk) { puts(" Stack?\r\n"); stkp=stk; } puts(">"); } } |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #define MAXX 1024 #define MAXY 768 int lstx,stx,lsty,sty; int slen; int xs,ys; int stdraw(x1,y1) int x1,y1; { if (x1 < 0) x1 = 0; if (x1 >= MAXX) x1 = MAXX -1; if (y1 < 0) y1 = 0; if (y1 >= MAXY) y1 = MAXY - 1; putc(29); putc((y1 / 32) + 32); putc((y1 & 31) + 96); putc((x1 / 32) + 32); putc((x1 & 31) + 64); xs = x1; ys = y1; } int xdraw(x2,y2) int x2,y2; { if (x2 < 0) x2 = 0; if (x2 > MAXX) x2 = MAXX -1; if (y2 < 0) y2 = 0; if (y2 > MAXY) y2 = MAXY - 1; putc((y2 / 32) + 32); putc((y2 & 31) + 96); putc((x2 / 32) + 32); putc((x2 & 31) + 64); xs = x2; ys = y2; } int endraw() { putc(31); } int drrel(dx,dy) int dx,dy; { xdraw(lstx + dx, lsty + dy); lstx = lstx + dx; lsty = lsty + dy; } int hlbt(depth,dx,dy) int depth,dx,dy; { if (depth > 1) hlbt(depth - 1, dy, dx); drrel(dx, dy); if (depth > 1) hlbt(depth - 1, dx, dy); drrel(dy, dx); if (depth > 1) hlbt(depth - 1, dx, dy); drrel(-dx, -dy); if (depth > 1) hlbt(depth - 1, -dy, -dx); } int main() { int depth; slen=20; stx=51; sty=51; depth=5; putc(27); putc(12); { /* Draw the curve. */ lstx=stx; lsty=sty; stdraw(stx,sty); hlbt(depth, slen, 0); endraw(); stdraw(0,0); endraw(); } } |
|
| < |
|
| < |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | /* Simple double precision integer routines and tests for them. */ /* Add single precision (low order 12 bit signed integer) to * 24 bit signed integer. */ int dadd(rsl,val) int *rsl,val; { int i; i=val; rsl; #asm DCA JLC CLL TADI JLC TADI STKP DCAI JLC ISZ JLC SZL ISZI JLC TADI STKP SPA CLA CMA TADI JLC DCAI JLC #endasm } /* Same as dadd() but in pure C. Less efficient; consider dadd() to be * the hand-optimized version. */ int dbadd(rsl,val) int *rsl,val; { int tm,*px; tm=*rsl; px=rsl+1; *rsl=*rsl+val; if (*rsl>0 & tm<0 & val>0) *px=*px+1; if (*rsl<0 & tm>-1 & val<0) *px=*px-1; } /* Print a double-precision integer to the terminal. */ int dprint(vl) int *vl; { int *p,ct; p=vl+1; ct=0; while (*p>-1) { dadd(vl,-1000); ct++; } ct--; dadd(vl,1000); printf("%d%03d",ct,*vl); } /* Test dadd() and dprint(). */ int main(void) { int total[2],i; memset(total,0,2); for (i = 3; i < 1000; i++) if (i%5==0 | i%3==0) dadd(total,i); puts("Total:"); dprint(total); puts("\r\n"); memset(total,0,2); puts("Test:"); dadd(total,2010); dprint(total); puts("\r\n"); } |
|
| > > | | > > > < < < | | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /* Print Pascal's triangle */ /* Invoke with .EXE CCR and enter this filenme */ #define COUNT 14 int ar[20],i,j; int main() { for (i=1;i<COUNT;i++) { ar[i]=1; for (j=i-1;j>1;j--) ar[j]=ar[j-1]+ar[j]; for (j=0;j<2*(COUNT-i-1);j++) putc(' '); for (j=1;j<i+1;j++) printf("%4d",ar[j]); printf("\r\n"); } printf("Completed\r\n"); } |
︙ | ︙ | |||
37 38 39 40 41 42 43 | */ #define itoa libc0 #define puts libc1 #define dispxy libc2 #define getc libc3 #define gets libc4 #define atoi libc5 | | | | | | | > > | > | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | */ #define itoa libc0 #define puts libc1 #define dispxy libc2 #define getc libc3 #define gets libc4 #define atoi libc5 #define strpd libc6 #define xinit libc7 #define memcpy libc10 #define kbhit libc11 #define putc libc12 #define strcpy libc13 #define strcat libc14 #define strstr libc15 #define exit libc16 #define isnum libc17 #define isalpha libc20 #define toupper libc21 #define memset libc22 #define fgetc libc23 #define fopen libc24 #define fputc libc25 #define fclose libc26 #define revcpy libc27 #define isalnum libc30 #define isspace libc31 #define fgets libc32 #define fputs libc33 #define strcmp libc34 #define cupper libc35 #define fprintf vlibc36 #define printf vlibc37 #define sprintf vlibc40 #define sscanf vlibc41 #define scanf vlibc42 #define fscanf vlibc43 /* Declare function aliases. */ #define isdigit isnum |
1 | /* | | | | | | | | | | | | | | | | | > > > > > > > > > > > > > > | > > > > > > > > > > > | > > > > > > | | > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | > > | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | > > > > > > > > > > | | > > > > > > > > > > > > > > > > | | > > > | | | | | | | | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | > > > | | > > > > > | | | | | | | | | | > > > > > > > > | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 | /* * This file is part of the CC8 OS/8 C compiler. * * The CC8 OS/8 C compiler is free software: you can redistribute it * and/or modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * The CC8 OS/8 C compiler is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with the CC8 OS/8 C compiler as ../GPL3.txt. If not, see * <http://www.gnu.org/licenses/>. */ #include <libc.h> #include <init.h> /* * This file is the c pre processor of the native C compiler for the PDP-8 series of computers. * Linked with LIBC.RL to create CC0.SV * Hardware requirements: * 1. PDP/8 processor with minimal EAE (MQ register is heavily used). * 2. 20K (5x4K banks) of core. * 3. OS/8 operating system with FORTRAN II library (LIB8.RL) * 4. SABR assembler (SABR.SV) * 5. Linking loader (LOADER.SV) * * 1. The compiler consists of 3 files: CC0.SV, CC1.SV, CC2.SV on system device. (SYS:) * The runtime support files are: * 1. The c library created from libc.c and assembled to LIBC.RL on the user device. * 2. A runtime support file: HEADER.SB on the user device (DSK:) * These 3 .SV files run in sequence: * CC0: C pre-processor: Asks for ONE source file and creates CC.CC for CC1.SV. * And, generates an intermediate file (CASM.TX) used by CC2.SV. * CC1: C tokeniser: Reads CC.CC and converts the code to a token list in FIELD 4 * CC2: SABR code generator: Reads token list and generates CC.SB from * a collection of code fragments. * Finally, the SABR assembler is used on CC.SB and the runtime is generated * by LOADER.SV using CC.RL and LIBC.RL */ /* Ask for input file, copy to CC.CC and run CC1 */ /* Update Feb 2018 */ /* 1. Read file line by line */ /* 2. Exclude FF (12) */ /* 3. Implement simple #define directive **Warning** quoted text is not ignored */ /* 4. Implement #asm/#endasm directive */ /* Update April 2020 */ /* 5. Implement switch satement via re-write */ /* *** 1: default: must be included 2: Fall through is not implemented */ /* 3: Nesting is allowed */ /* 6: Implement logical operators !=,>=,<= via token symbols #,_,? */ /* 7. Permit multiline comments */ int ln[128],*p,*q,*tm,*dfp,tkbf[10],smbf[10]; int dflst[1024],tmln[80]; int asm[1024]; int *swp,swpbf[256],*swc,xm,cm; int rh1[80],rh2[80],rh3[80],*n; int ocntr,ccntr; skpsp() { while (isspace(*p)) p++; } strlen(p) char *p; { int n; n=0; while (*p++) n++; return n; } getsym() { q=tkbf; skpsp(); while (isalnum(*p)) *q++=*p++; *q=0; skpsp(); return *tkbf; } parse() { getsym(); strcpy(dfp,tkbf); getsym(); strcpy(dfp+512,tkbf); dfp+=10; } int dorep() { p=dflst; while (*p) { q=strstr(ln,p); while (q) { memset(tmln,0,80); if (q-p) memcpy(tmln,ln,q-ln); strcat(tmln,p+512); strcat(tmln,q+strlen(p)); memcpy(ln,tmln,80); q=strstr(ln,p); } p+=10; } } /* Set bit 7 in string constants to exclude from processing */ /* Also, translate control chara .. /n etc. to actual values */ int strip() { int cm; cm=0; p=ln; while(*p) { if (*p==39 && !cm) p+=3; if (*p=='"') { cm=!cm; *p|=128; } if (cm) { q=p+1; if (*p==92) { switch (*q) { case 't': *q=9; break; case 'r': *q=13; break; case 'n': *q=10; break; } strcpy(p,q); } *p|=128; } p++; } p=ln; } main() { int bfr; int fnm[10]; putc('>'); gets(fnm); cupper(fnm); fopen(fnm,"r"); fopen("CC.CC","w"); *asm=0; memset(dflst,0,1024); dfp=dflst; ocntr=ccntr=cm=0; while (1) { fgets(p=ln); if (!*ln) break; swc=swp=swpbf; /* Remove #include lines */ if (strstr(ln,"#include")) strcpy(ln,"\r\n"); strip(); /* Find comment. If partial, set cm */ if (p=strstr(ln,"/*")) { if (!strstr(p,"*/")) cm++; *p=0; strcat(ln,"\r\n"); } /* If cm, strip lines until terminating */ if (cm) { while(1) { fgets(p=ln); strip(); if (!cm) break; if (strstr(p,"*/")) cm=0; } } if (!*ln) break; /* Convert type char to int */ p=ln; getsym(); if (*tkbf) { if (!strcmp(tkbf,"char")) { q=strstr(ln,"char "); memcpy(q,"int ",4); } else if (!strcmp(tkbf,"void")) { q=strstr(ln,"void "); memcpy(q,"int ",4); } } /* Call dorep to replace #defines */ dorep(); /* Initial tokenise to convert digraphs to marker charcters */ p=ln; while (*p) { tm=p; switch (*p++) { case '"': while (*p++!='"'); break; case 12: case 9: *tm=' '; break; case '{': ocntr++; break; case '}': ccntr++; break; case 39: sprintf(tmln,"%3d",*p); memcpy(tm,tmln,3); break; case '>': switch (*p) { case '=': *tm=' '; *p='@'; break; case '>': *tm=' '; *p='.'; } break; case '<': switch (*p) { case '=': *tm=' '; *p='#'; break; case '<': *tm=' '; *p=':'; } break; case '=': if (*p=='=') { *tm=' '; *p='$'; } break; case '!': if (*p=='=') { *tm=' '; *p='_'; } break; case '&': case '|': if (*p==*tm) { *tm=' '; printf("W: ||,&& coversion\r\n"); } break; } } /* Manage #asm/#endasm. Concatenate asm code into asm string */ p=strstr(ln,"#asm"); q=0; while (p) { fgets(ln); q=strstr(ln,"#endasm"); if (q) { strcpy(ln,"`\r\n"); break; } toupper(ln); strcat(asm,ln); } if (p) strcat(asm,"$"); /* Rewrite switch statement using if within a while loop */ p=strstr(ln,"switch"); if (p) { p=p+6; while (*p!='{') { if (!*p) fgets(p=ln); *swp++=*p++; } *swp=0; xm=0; strcpy(ln,"while(1) {\r\n"); } p=strstr(ln,"case "); if (p) { p=p+5; q=strstr(ln,":"); *q++=0; strcpy(rh1,q); memcpy(tmln,p,q-p); if (xm) fputs("}\r\n"); sprintf(ln,"if (%s $ %s) {\r\n",swc,tmln); strcat(ln,rh1); xm++; } p=strstr(ln,"default:"); if (p) { if (xm) fputs("}"); p=p+8; fprintf("\r\n%s",p); *ln=0; } /* Manage ternary operator ?: using if/else statements */ while (1) { p=n=ln; memset(tmln,0,80); memset(rh1,0,80); memset(rh2,0,80); while (1) { getsym(); switch (tm=*p++) { case '=': memcpy(tmln,n,p-n); n=p; break; case '?': memcpy(rh1,n,p-n-1); n=p; break; case ':': memcpy(rh2,n,p-n-1); strcpy(rh3,p); tm=0; break; } if (!tm) { if (*rh1 && *rh2) sprintf(ln,"\tif (%s)\r\n%s%s;\r\n\telse\r\n%s%s",rh1,tmln,rh2,tmln,rh3); break; } } if (strstr(ln,"?") && *rh1 && *rh2) { fprintf("\tif (%s)\r\n%s%s;\r\n\telse\r\n",rh1,tmln,rh2); sprintf(ln,"\t%s%s\r\n",tmln,rh3); } else break; } /* Extract define symbols ... expected format #define <symbol to be replaced> <symbol> */ /* Symbols may only be alhanumeric strings. No complex macros.... */ /* Finally, strip bit 8 to return string constants to normal */ p=strstr(ln,"#define "); if (p) { p=p+8; parse(); } else { p=ln; while (*p) *p++&=127; fputs(ln); } } /* Close CC.CC and write CASM.TX */ /* CC.CC is tokenised by CC1.SV and CASM.TX will be prepended to CC.SB by CC2.SV */ fclose(); fopen("HEADER.SB","r"); fopen("CASM.TX","w"); while (bfr=fgetc()) fputc(bfr); fputc('!'); p=asm; while (*p) fputc(*p++); fclose(); /* The only error check for now! */ if (ocntr!=ccntr) { printf("E: {} count mismatch\r\n"); exit(0); } #asm CALL 1,CHAIN ARG FNM HLT FNM, TEXT "CC1@@@" #endasm } |
1 2 3 4 5 6 | $JOB COMPILE AND RUN C PROGRAMME .R CC .COMP CC.SB .R LOADER *CC,LIBC/I/O/G $END | > | 1 2 3 4 5 6 7 | $JOB COMPILE AND RUN C PROGRAMME .DEL CC.SB,CC.RL .R CC .COMP CC.SB .R LOADER *CC,LIBC/I/O/G $END |
> | 1 | ITOA PUTS DISPXY GETC GETS ATOI STRPD XINIT MEMCPY KBHIT PUTC STRCPY STRCAT STRSTR EXIT ISNUM ISALPHA TOUPPER MEMSET FGETC FOPEN FPUTC FCLOSE REVCPY ISALNUM ISSPACE FGETS FPUTS STRCMP CUPPER FPRINTF PRINTF SPRINTF SSCANF SCANF FSCANF |
︙ | ︙ | |||
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | OPDEF JMPI 5400 OPDEF MQL 7421 OPDEF ACL 7701 OPDEF MQA 7501 OPDEF SWP 7521 OPDEF CDF1 6211 OPDEF CDF0 6201 OPDEF RIF 6224 OPDEF CAF0 6203 OPDEF BSW 7002 OPDEF CAM 7621 OPDEF DILX 6053 OPDEF DILY 6054 OPDEF DIXY 6055 / DECLARE INIT CODE GLOBALS. SEE INIT.H COMMENTARY. ABSYM POP 160 ABSYM PSH 161 ABSYM JLC 162 ABSYM STKP 163 ABSYM PTSK 164 ABSYM POPR 165 ABSYM PCAL 166 | > > > | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | OPDEF JMPI 5400 OPDEF MQL 7421 OPDEF ACL 7701 OPDEF MQA 7501 OPDEF SWP 7521 OPDEF CDF1 6211 OPDEF CDF0 6201 OPDEF CDF4 6241 OPDEF RIF 6224 OPDEF CAF0 6203 OPDEF BSW 7002 OPDEF CAM 7621 OPDEF DILX 6053 OPDEF DILY 6054 OPDEF DIXY 6055 / DECLARE INIT CODE GLOBALS. SEE INIT.H COMMENTARY. ABSYM TLOC 156 ABSYM STRV 157 ABSYM POP 160 ABSYM PSH 161 ABSYM JLC 162 ABSYM STKP 163 ABSYM PTSK 164 ABSYM POPR 165 ABSYM PCAL 166 |
︙ | ︙ | |||
122 123 124 125 126 127 128 | CLA CLL PCL1, 0 TADI PCALL DCA ZTMP TAD PCALL IAC JMSI PSH / PUSH RETURN | | > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | CLA CLL PCL1, 0 TADI PCALL DCA ZTMP TAD PCALL IAC JMSI PSH / PUSH RETURN CLA CLL JMPI ZTMP PVL, PUSH OVL, PPOP MVL, PUTSTK SVL, STK PVR, POPRET PVC, PCALL / THESE ARE RATHER LONG FUNCTIONS / INSERTED HERE IN USER SPACE / AS SUBROUTINES RATHER THAN / INLINE CODE. / / XOR '^' XXOR, CMA TAD STKP DCA JLC TADI JLC MQA CMA CLL SWP ANDI JLC MQA CMA JMPI POPR / >> AND << ROUTINES XXRL, DCA ZTMP CMA TAD STKP DCA JLC TADI JLC XXRD, CLL RAR ISZ ZTMP JMP XXRD JMPI POPR XXLL, ACL SPA JMP XXRL CIA DCA ZTMP CMA TAD STKP DCA JLC TADI JLC SNL JMPI POPR XXLD, CLL RAL ISZ ZTMP JMP XXLD JMPI POPR IINIT, CLA TAD STKP TAD (-1 DCA JLC TADI JLC DCA STRV JMPI POPR STRI, CLA TAD STKP TAD (-1 DCA JLC TADI JLC CDF4 DCAI STRV CDF1 ISZ STRV NOP JMPI POPR STRD, CDF4 CLA TADI STRV CDF1 ISZ STRV NOP JMPI POPR STRL, CDF4 CLA TADI STRV CDF1 JMPI POPR / |
|
| < |
︙ | ︙ | |||
163 164 165 166 167 168 169 | / CPNT, CLIST CPAGE 41 / # OF ENTRIES IN CLIST BELOW, IN OCTAL / / THIS IS THE DISPATCH LIST FOR THIS LIBRARY / MAKE SURE LIBC.H MATCHES / | | | | | | | | | > > > | 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | / CPNT, CLIST CPAGE 41 / # OF ENTRIES IN CLIST BELOW, IN OCTAL / / THIS IS THE DISPATCH LIST FOR THIS LIBRARY / MAKE SURE LIBC.H MATCHES / CLIST, ITOA PUTS DISPXY GETC GETS ATOI STRPD XINIT MEMCPY KBHIT PUTC STRCPY STRCAT STRSTR EXIT ISNUM ISALPHA TOUPPER MEMSET FGETC FOPEN FPUTC FCLOSE REVCPY ISALNUM ISSPACE FGETS FPUTS STRCMP CUPPER FPRINTF PRINTF SPRINTF SSCANF SCANF FSCANF #endasm #define stdout 0 #define NULL 0 #define isdigit isnum |
︙ | ︙ | |||
338 339 340 341 342 343 344 345 346 347 348 349 350 351 | DCA FRSL CALL 2,CHRIO ARG (4 ARG FRSL CDF1 #endasm } fopen (fnm,flg) char *fnm; int flg; { char *p; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 | DCA FRSL CALL 2,CHRIO ARG (4 ARG FRSL CDF1 #endasm } xinit() { puts("PDP-8 C Compiler V2.0:\r\n"); } memcpy(dst,src,cnt) int dst,src,cnt; { #asm CLA TAD STKP TAD (-4 DCA 14 CMA TADI 14 DCA 13 CMA TADI 14 DCA 12 TADI 14 CIA DCA ZTMP CP1, TADI 12 DCAI 13 ISZ ZTMP JMP CP1 #endasm } kbhit() { #asm CLA CMA KSF CLA #endasm } fopen (fnm,flg) char *fnm; int flg; { char *p; |
︙ | ︙ | |||
510 511 512 513 514 515 516 | p--; } } putc(10); /* newline */ return q; } | < > > > > | | > > > > > > | | < < < < > | < | > | | > > > > > > | < < < > | < > > > > > > > | | > > > > > > > > | > > > > > | | > > > > | > > > | > > > > | | | | > | < | > | < < < > > | < > | | | | | | | < < < < < < < < < < < < < < < < < < | < < | < | < < < < < < < < | < | < < < < < < | | 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 | p--; } } putc(10); /* newline */ return q; } atoi(p,rsl) char *p; int *rsl; { *p; #asm OPDEF MUY 7405 CLA CLL DCA ZTMP / FINAL VALUE DCA ZCTR / CAHR COUNTER AT777, TADI JLC TAD(-40 / SPACE+1 SZA CLA JMP AT000 ISZ JLC JMP AT777 AT000, TAD (7000 / NOP DCA TMP / STORE SIGN TADI JLC TAD (-55 / - SZA CLA JMP AT001 TAD (7041 / CIA DCA TMP ISZ JLC ISZ ZCTR AT001, TAD (12 / DEFAULT BASE 10 DCA FPTR TADI JLC TAD (-60 / 0 SZA CLA JMP AT004 TAD (10 DCA FPTR ISZ JLC ISZ ZCTR AT002, TADI JLC TAD (-170 / LC X SZA CLA JMP AT003 TAD (20 DCA FPTR ISZ JLC ISZ ZCTR AT003, TADI JLC TAD (-142 / LC B SZA CLA JMP AT004 CLA CLL IAC RAL DCA FPTR ISZ JLC ISZ ZCTR AT004, TADI JLC SNA JMP AT006 TAD (-60 / 0 SPA JMP AT006 TAD (-12 / 10 SMA JMP AT005 TAD (12 JMP AT51 / RANGE 0-9 AT005, TAD (-47 / LC A-F 0-5 SPA JMP AT006 TAD (12 AT51, DCA ZPTR TAD FPTR CIA TAD ZPTR SMA CLA JMP AT006 TAD ZTMP CALL 1,MPY ARG FPTR CDF1 TAD ZPTR DCA ZTMP ISZ JLC ISZ ZCTR JMP AT004 AT006, CLA TAD TMP DCA XINV CLA CLL CMA TAD STKP DCA TMP TADI TMP DCA TMP TAD ZTMP XINV, NOP DCAI TMP DCA FPTR DCA ZPTR TAD ZCTR #endasm ; } putc(p) char p; { p; #asm TLS MP1, TSF JMP MP1 #endasm } strcmp( dm , sm ) char *dm,*sm; { int rsl; rsl=0; while (*dm) rsl|=(*sm++-*dm++); return rsl; } strcpy( dm , sm ) char *dm,*sm; { while (*dm++=*sm++); |
︙ | ︙ | |||
683 684 685 686 687 688 689 | #asm TAD (D-48 / ASCII '0' SPA JMP XNO TAD (D-10 / # OF DECIMAL DIGITS SMA CLA XNO, CLA SKP | | | | 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 | #asm TAD (D-48 / ASCII '0' SPA JMP XNO TAD (D-10 / # OF DECIMAL DIGITS SMA CLA XNO, CLA SKP CMA #endasm } isspace(vl) int vl; { vl; #asm SNA JMP YNO TAD (D-33 / ONE PAST ASCII ' ' SMA CLA YNO, CLA SKP CMA #endasm } isalpha(vl) int vl; { |
︙ | ︙ | |||
719 720 721 722 723 724 725 | JMP BNO TAD (D-6 / 'a' - 'Z' IN ASCII SPA JMP ANO TAD (D-26 / # OF LOWERCASE ENGLISH LETTERS BNO, SMA CLA ANO, CLA SKP | | | 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 | JMP BNO TAD (D-6 / 'a' - 'Z' IN ASCII SPA JMP ANO TAD (D-26 / # OF LOWERCASE ENGLISH LETTERS BNO, SMA CLA ANO, CLA SKP CMA #endasm } cupper(p) /* In place convert to uppercase */ int p; { p; |
︙ | ︙ | |||
752 753 754 755 756 757 758 | } toupper(p) int p; { p; #asm | | > > > > > > > > | 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 | } toupper(p) int p; { p; #asm TPP1, DCA ZTMP / AALT ENTRY USED BY ATOI TAD ZTMP TAD (D-97 / SEE cupper() COMMENTARY SPA JMP TPP3 TAD (D-26 SMA JMP TPP3 TAD (D91 JMP TPP2 TPP3, CLA CLL TAD ZTMP TPP2, #endasm } strpd(buff,sym) char *buff,*sym; { strcpy(buff," "); /* 9 spaces */ while (*sym) *buff++=*sym++; } /* Arbitrary fgets(). Read until LF, CR/LF are retained*/ /* EOF returns null, else strlen(*p) */ fgets(p) char *p; { |
︙ | ︙ | |||
789 790 791 792 793 794 795 | return (p-q); } memset(dst, dt, sz) char *dst; int dt,sz; { | > > | | > > > > > > > > > > > > > | > | 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 | return (p-q); } memset(dst, dt, sz) char *dst; int dt,sz; { #asm CLA TAD STKP TAD (-4 DCA 14 CMA TADI 14 DCA 13 TADI 14 DCA 12 TADI 14 CIA DCA ZTMP CP2, TAD 12 DCAI 13 ISZ ZTMP JMP CP2 #endasm } /* ** reverse string in place */ reverse(s) char *s; { char *j; int c; |
︙ | ︙ | |||
958 959 960 961 962 963 964 | reverse (s); } strlen(p) char *p; { | > > > > > > > > > > > | > | > > > | > | | | > > > > > > > > > | > > > > > > > > | | 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 | reverse (s); } strlen(p) char *p; { #asm DCA TMP #endasm while (*p++) #asm ISZ TMP #endasm #asm TAD TMP #endasm } fscanf(nxtarg) int nxtarg; { fgets(16); /* USE PRINTF BUFFER FOR INPUT STRING */ #asm JMP SC1 #endasm } scanf(nxtarg) int nxtarg; { gets(16); /* USE PRINTF BUFFER FOR INPUT STRING */ #asm SC1, CLA CLL TAD (20 DCA ZPTR / FOR FSCANF,SCANF, BUFFER LOCATION IN ZPTR = 20 (8) JMP SSCANF #endasm } #define EOF 0 sscanf(nxtarg) int nxtarg; { char *ctl; int u; int *narg, ac, width, ch, cnv, base, ovfl, sign, *ibfr,zptr; #asm TAD ZPTR DCAI STKP / POINTS TO ZPTR #endasm ac = 0; nxtarg = &nxtarg-nxtarg; if (zptr) ibfr=zptr; else ibfr = *nxtarg++; ctl = *nxtarg++; while(*ctl) { if(*ctl++ != '%') continue; narg = *nxtarg++; ctl += atoi(ctl, &width); if (!width) width=-1; |
︙ | ︙ | |||
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 | case 'd': base = 10; break; case 'o': base = 8; break; case 'x': base = 16; break; default: return (ac); } *narg = u = 0; sign = 1; while(width-- && (ch=*ibfr++)>32) { if(ch == '-') {sign = -1; continue;} if(ch < '0') break; if(ch >= 'a') ch -= 87; else if(ch >= 'A') ch -= 55; else ch -= '0'; u = u * base + ch; } *narg = sign * u; } ++ac; } return (ac); } revcpy(dst,src,cnt) int *dst,*src,cnt; { dst+=cnt; src+=cnt; while (cnt--) *dst--=*src--; } | > > > > > > > | 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 | case 'd': base = 10; break; case 'o': base = 8; break; case 'x': base = 16; break; default: return (ac); } *narg = u = 0; sign = 1; while (isspace(*ibfr)) ibfr++; while(width-- && (ch=*ibfr++)>32) { if(ch == '-') {sign = -1; continue;} if(ch < '0') break; if(ch >= 'a') ch -= 87; else if(ch >= 'A') ch -= 55; else ch -= '0'; u = u * base + ch; } *narg = sign * u; } ++ac; } #asm CLA DCA ZPTR / CLEAR FLAGS DCA FPTR #endasm return (ac); } revcpy(dst,src,cnt) int *dst,*src,cnt; { dst+=cnt; src+=cnt; while (cnt--) *dst--=*src--; } |
|
| < |
︙ | ︙ | |||
12 13 14 15 16 17 18 19 20 21 22 23 | * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with the CC8 OS/8 C compiler as ../GPL3.txt. If not, see * <http://www.gnu.org/licenses/>. */ #include <libc.h> #include <init.h> #define SMAX 10 | > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | < | < > > > > > | > | > > > > > > > > | > > > > > > > > > > > > > > > > | > > | > | | > > > > > > > > > > > > > > > > > > > > > | > > > > | > > | | | > > > > | > > > > > > > > > > > > > > > > | | > > > | > > > | | < | < < < | | | < < < < < < < < < < < < | < < < < < < | | | > | | > > > > > > > > > > > > | | < > > > > > > > > > | > > > > > > | | | > > > > > > | | | > | | < | | | | | > > > | | | | | | | | | | | | > | | | | | | | | | | | | > > | | | | | | > | | | < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > > | > > > > | | > | | | > > > > | > > > | > > | > | > > > > > > | | > > > > > > > > > > > > > > | > > > | > > > > > > > > > > > > > > > > > > > | > > > > > | | > > > > | > > | > > > < | | < | > | > > | > | < | > > | | > | < > | > | | | < | | | | < | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | > > | < > > | > > > | | > | < | | > | > > > > > > > | | > > | | | < | < | > > > > > > > | | | | < > > | | | < | | < < < < < < < < < < < < < < < | < | | | | < < < < < | < < < < < | | > | | < < < < < < < < < < < < < | < < < | < < < < < < < < < < | < < < < < < < < < < < | | | < < | < | < < < | < < < < < < < < < < | < < < < < < | < < < | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 | * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with the CC8 OS/8 C compiler as ../GPL3.txt. If not, see * <http://www.gnu.org/licenses/>. */ /* * This file is the core of the native C compiler for the PDP-8 series of computers. * Linked with LIBC.RL to create CC1.SV * Hardware requirements: * 1. PDP/8 processor with minimal EAE (MQ register is heavily used). * 2. 20K (5x4K banks) of core. * 3. OS/8 operating system with FORTRAN II library (LIB8.RL) * 4. SABR assembler (SABR.SV) * 5. Linking loader (LOADER.SV) * * 1. The compiler consists of 3 files: CC0.SV, CC1.SV, CC2.SV on system device. (SYS:) * The runtime support files are: * 1. The c library created from libc.c and assembled to LIBC.RL on the user device. * 2. A runtime support file: HEADER.SB on the user device (DSK:) * These 3 .SV files run in sequence: * CC0: C pre-processor: Asks for ONE source file and creates CC.CC for CC1.SV. * And, generates an intermediate file (CASM.TX) used by CC2.SV. * CC1: C tokeniser: Reads CC.CC and converts the code to a token list in FIELD 4 * CC2: SABR code generator: Reads token list and generates CC.SB from * a collection of code fragments. * Finally, the SABR assembler is used on CC.SB and the runtime is generated * by LOADER.SV using CC.RL and LIBC.RL */ #include <libc.h> #include <init.h> #define SMAX 10 #define CMAX 300 #define BMAX 64 #define LMAX 64 #define DMAX 32 #define CBMX 1024 #define LXMX 999 int ltbf[512]; int xlt[CMAX]; int gm[512]; /* Global symbol table */ int dumy[DMAX]; int *p,*q,*s,*ltpt; int gsym,lsym,gadr,ladr,stkp,lctr,*fptr,gsz,ctr,tm,ectr,glim; int cop,*n,ccm; int tmp; int tkn[BMAX]; int bfr[LXMX]; int smbf[DMAX]; int lm[CMAX]; /* Auto symbol table */ int fstk[BMAX]; /* Push down stack for For etc. */ int inproc,addr,cbrk; int izf,idf,ssz,mode,ppflg,opeq,vl,vf,mkr; int dstk[DMAX],dptr; int Lb[128]; int tmbf[128]; int tkbf[128]; getln() { if (!fgets(p=Lb)) { stri(0); #asm CALL 1,CHAIN ARG FNM HLT FNM, TEXT "CC2@@@" #endasm } } gtch() { if (!*p) getln(); return *p++; } skpsp() { while (isspace(gtch())); p--; } sksps() { while (isspace(*p)) p++; } strpad(sym) char *sym; { strpd(smbf,sym); } addsym(sym,sz,flg) char *sym; int sz,flg; { strpad(sym); smbf[8]=sz; /* Allow for 0 size symbols ... alloc via <symb>=const int */ if (inproc+(sz<0)) { smbf[7]=stkp+1; stkp=stkp+sz; strcat(lm,smbf); if (flg) { stri(6); stri(sz); } return; } smbf[7]=gadr; gadr=gadr+sz; strcat(gm,smbf); gsz=gsz+9; } fndlcl(sym) char *sym; { strpad(sym); smbf[7]=0; if (s=strstr(lm,smbf)) { ssz=s[8]; /* Correct */ s=s+7; return *s-stkp; } if (s=strstr(gm,smbf)) { ssz=s[8]; /* Correct */ s=s+7; return *s; } return 0; } ckop() { if (opeq) { stri(41); opeq=0; } } /* recursive descent parser for arithmetic/logical expressions */ S( ) { int rtv; cop=rtv=0; J( ); switch(*p++){ case '=': S(); stri(1); stkp--; break; case ']': case ')': rtv++; break; case ',': ccm++; break; case ';': ppflg++; break; default: p--; } sksps(); return rtv; } /* end S */ J( ) { K( ); switch(*p++){ case '&': J( ); stri(20); break; case '|': J( ); stri(4076); break; case '^': J( ); stri(32); break; default: p--; return; } stkp--; } /* end J */ K( ) { V( ); switch(*p++){ case '.': K( ); stri(30); break; case ':': K( ); stri(31); break; case '<': K( ); stri(11); break; case '>': K( ); stri(4085); break; /* -11 */ case '@': K( ); stri(11); stri(4070); break; case '#': K( ); stri(4085); stri(4070); break; case '_': K( ); stri(24); stri(4070); break; case '$': K( ); stri(24); break; default: p--; return; } stkp--; } /* end K */ V( ) { W( ); switch(*p++){ case '+': V(); stri(2); break; case '-': V(); stri(3); break; default: p--; return; } stkp--; } /* end V */ W( ) { Y( ); sksps(); switch(cop=*p++) { case '*': W( ); stri(13); break; case '/': W( ); stri(14); break; case '%': W( ); stri(14);stri(4082); break; default: p--; return; } stkp--; } /* end W */ Y( ) { int o,ctx,ixf; int txbf[10]; sksps(); if (!*p) return; if (cop) { stri(19); stkp++; cop=0; } if (*p=='"') { stri(10); stri(ltpt-ltbf); while (*++p-'"') *ltpt++=*p; *ltpt++=0; p++; return; } if(isdigit(*p)) { stri(4); p=p+atoi(p,&tmp); stri(tmp); return; } ixf=izf=idf=0; if (!getsym()) { switch (*p++) { case '&': getsym(); stri(21); stri(fndlcl(tkbf)); return; case '*': getsym(); if (*tkbf) { ixf++; break; } J(); if (*p=='=') { stri(19); stkp++; } else stri(22); return; case '!': Y(); stri(26); return; case '~': Y(); stri(4070); return; case '`': stri(29); return; case '(': S(); return; case ')': return; case '+': if (*p=='+') { izf=-15; p++; getsym(); break; } Y(); break; case '-': if (*p=='-') { izf=-25; p++; getsym(); break; } Y(); stri(27); return; case '=': stri(40); Y(); opeq++; case ';': return; } } if(*p=='('){ strcpy(txbf,tkbf); ctx=o=0;p++; sksps(); while (*p && !o && *p-')') { o=S( ); ckop(); stkp++; stri(19); ctx++; /* arg count */ } ckop(); if (!ctx) p++; stri(9); stri(ctx); stkp-=ctx; if ((o=strstr(gm,txbf))){ stri(o-gm); } else { stri(gsz); strpad(txbf); strcat(gm,smbf); gsz=gsz+9; } ccm=0; return; } /* Digraphs */ q=p+1; if (tmp=*q==*p) switch (*p) { case '+': izf=15; p=p+2; break; case '-': idf=-tmp; p=p+2; break; } o=fndlcl(tkbf); tmp=-17; if (ssz>1) { if (*p=='[') { stri(21); stri(o); stri(19); stkp++; p++;S(); stri(2); if (ixf) stri(22); if (*p=='=') stri(19); else { stri(22); stkp--; } ixf=0; return; } tmp=21; } switch (*p) { case '=': if (izf<0) break; tmp=8; if (ixf && ssz==1) tmp=-8; ixf=0; stkp++; } stri(tmp); stri(o); if (izf) stri(izf); if (idf) stri(25); if (ixf) stri(22); } /* end Y */ popfr() { while (*fptr==inproc) { cbrk=*--fptr; stri(23); fptr--; if (*dptr) { stri(*dptr); *dptr=0; } else stri(*fptr); stri(5); stri(*fptr+2); fptr--; } } gtexp2() { q=bfr; mkr=0; while (1) { tm=*q=gtch(); if (tm=='"') mkr=!mkr; if (mkr) { q++; continue; } if (mode==1) switch (*q) { case '(': *q=0; stri(7); stri(gsz); strcpy(tkbf,bfr); if (strstr("main",tkbf)) strcpy(tkbf,"XMAIN"); addsym(tkbf,1,1); q=p; ctr=2; while(*q) if (*q++==',') ctr++; stkp=-ctr; sksps(); while (*p-')') { if (getsym()) { addsym(tkbf,-1,1); stkp=stkp+2; } else p++; } mode=0; stkp=0; /* Setup for locals */ cbrk=200; /* No break at top level */ p++; return; case ';': *q=0; dodecl(); mode=0; return; } else switch(*q) { case '{': inproc++; dptr++; case ';': *q=ctr=mode=0; return; case '}': popfr(); inproc--; dptr--; *q=0; if (!inproc) { stri(5); stri(ectr++); stri(16); stri(-stkp); stkp = *lm = 0; } return; } q++; } } getsym() { q=tkbf; skpsp(); while (isalnum(*p)) *q++=*p++; *q=0; tm=*p; if (*p) skpsp(); return *tkbf; } cmst() { do { ccm=0; S(); ckop(); } while (ccm); } dodecl() { if (ctr) return; /* No dec from func arg list */ p=bfr; while (*p) { vl=vf=1; getsym(); strcpy(tmbf,tkbf); if (*p) switch (*p++) { case '=': Y(); stri(19); vf=0; break; case '[': p=p+atoi(p,&vl)+1; sksps(); if (*p=='=') { p++; sksps(); while (*p++-'}') { Y(); sksps(); stri(19); vl++; } vf=0; } } if (*tmbf) addsym(tmbf,vl,vf); sksps(); } } main() { int i,fflg; memset(ltbf,0,tmbf-ltbf); fopen("CC.CC","r"); strcpy(tkn,"int if else while for break returndo "); lctr = 10; ectr = 900; ltpt = ltbf; fptr = fstk; dptr = dstk; *fptr = 4095; gadr = 128; /* Start of globals */ iinit(128); ppflg++; getln(); while (1) { fflg=lctr; stri(99); mode=0; if (getsym()) { strpad(tkbf); smbf[6]=0; if (q=strstr(tkn,smbf)) mode=1+(q-tkn)/6; } if (ppflg && mode-3) popfr(); switch (mode) { case 0: gtexp2(); strcat(tkbf,bfr); strcpy(bfr,tkbf); n=p; p=bfr; cmst(); p=n; if (*p) ppflg++; break; case 1: gtexp2(); break; case 3: stri(4073); stri(400+lctr+2); popfr(); *++fptr=400+lctr++; *++fptr=cbrk; *++fptr=inproc; ppflg=0; break; case 2: fflg=fflg+400; case 4: stri(5); *++fptr=fflg; stri(fflg); ppflg=0; p++; cmst(); stri(12); stri(tm=*fptr+2); *++fptr=cbrk; if (fflg<400) cbrk=tm; *++fptr=inproc; lctr=lctr+3; tm=0; break; case 5: cmst(); stri(5); stri(lctr++); *++fptr=lctr; cmst(); stri(12); stri(lctr+2); stri(23); stri(lctr+1); stri(5); stri(lctr++); cmst(); *++fptr=cbrk; *++fptr=inproc; stri(23); stri(lctr-2); stri(5); stri(lctr++); cbrk=lctr++; tm=ppflg=0; break; case 6: stri(23); stri(cbrk); ppflg++; break; case 7: S(); stri(4073); /* -23 */ stri(ectr); ppflg++; break; case 8: stri(5); stri(*dptr=lctr+++200); } } } |
︙ | ︙ | |||
12 13 14 15 16 17 18 19 20 21 22 23 | * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with the CC8 OS/8 C compiler as ../GPL3.txt. If not, see * <http://www.gnu.org/licenses/>. */ #include <libc.h> #include <init.h> #define SMAX 10 | > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | < > > > > > > > > < < < < | | | | | | | | | | | | | | | | | | | | | | | | | | > > | | | | | | | | | | | | | | > > > | | | | > > > > > > > > > > > > > > > > > > > > | | | | | | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 | * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with the CC8 OS/8 C compiler as ../GPL3.txt. If not, see * <http://www.gnu.org/licenses/>. */ /* * This file is the code generator of the native C compiler for the PDP-8 series of computers. * Linked with LIBC.RL to create CC2.SV * Hardware requirements: * 1. PDP/8 processor with minimal EAE (MQ register is heavily used). * 2. 20K (5x4K banks) of core. * 3. OS/8 operating system with FORTRAN II library (LIB8.RL) * 4. SABR assembler (SABR.SV) * 5. Linking loader (LOADER.SV) * * 1. The compiler consists of 3 files: CC0.SV, CC1.SV, CC2.SV on system device. (SYS:) * The runtime support files are: * 1. The c library created from libc.c and assembled to LIBC.RL on the user device. * 2. A runtime support file: HEADER.SB on the user device (DSK:) * These 3 .SV files run in sequence: * CC0: C pre-processor: Asks for ONE source file and creates CC.CC for CC1.SV. * And, generates an intermediate file (CASM.TX) used by CC2.SV. * CC1: C tokeniser: Reads CC.CC and converts the code to a token list in FIELD 4 * CC2: SABR code generator: Reads token list and generates CC.SB from * a collection of code fragments. * Finally, the SABR assembler is used on CC.SB and the runtime is generated * by LOADER.SV using CC.RL and LIBC.RL */ #include <libc.h> #include <init.h> #define SMAX 10 #define CMAX 300 #define BMAX 64 #define LMAX 64 #define DMAX 32 #define CBMX 1024 #define LXMX 999 int ltbf[512]; int xlt[CMAX]; int gm[512]; /* Global symbol table */ int tkbf[DMAX]; int *p,*q,*s,*ltpt; int gsym,lsym,gadr,ladr,stkp,lctr,*fptr,gsz,ctr,tm,ectr,glim; int ltsz,pflg,t; int tmstr[32]; fputx(str) char *str; { fputs(str); } main() { iinit(128); fopen("CTBL.TX","r"); fgets(xlt); fopen("CASM.TX","r"); fopen("CC.SB","w"); while (1) { t=fgetc(); if (t=='!') break; fputc(t); } cupper(gm); while (strl()) { pflg=*tmstr=0; switch (strd()) { case 99: fputx("/\r"); break; case 1: fputx("\tJMSI PTSK\r"); break; case 3: strcpy(tmstr,"\tCIA\r"); case 2: fprintf("%s\tTADI STKP\r\tJMSI POP\r",tmstr); break; case 4: fprintf("\tCLA\r\tTAD (%o\r",strd()); break; case 5: tm=strd(); if (tm<0) tm=400-tm; fprintf("CC%o,\r",tm); break; case 6: if (strl()>1) fprintf("\tCLA\r\tTAD STKP\r\tTAD (%o\r\tDCA STKP\r",strl()); else if (strl()>0) fputx("\tISZ STKP\r"); strd(); break; case 7: p=gm+strd(); while (*p-' ') fputc(*p++); fputx(",\r"); break; case -8: strcpy(tmstr,"\tDCA JLC\r\tTADI JLC\r"); case 8: if (strl()>0) fprintf("\tCLA\r\tTAD (%o\r%s\tJMSI PSH\r",strd(),tmstr); else fprintf("\tCLA\r\tTAD STKP\r\tTAD (%o\r%s\tJMSI PSH\r",strd(),tmstr); break; case 9: tm=strd(); p=gm+strd(); strcpy(tkbf," "); memcpy(tkbf,p,7); if (p=strstr(xlt,tkbf)) { t=(p-xlt)>>3; if (t>29) /* Push arg count for sscanf, sprintf, printf, fprintf, scanf */ fprintf("\tCLA\r\tTAD (%o\r\tJMSI PSH\r",tm++); fprintf("\tCLA\r\tTAD (%o\r\tMQL\r\tCALL 1,LIBC\r\tARG STKP\r\tCDF1\r",t); } else fprintf("\tCPAGE 2\r\tJMSI PCAL\r\t%s\r",tkbf); if (tm) fprintf("\tMQL\r\tTAD (%o\r\tTAD STKP\r\tDCA STKP\r\tSWP\r",-tm); break; case 10: fprintf("\tCLA\r\tTAD GBL\r\tTAD (%o\r",strd()); break; case -11: fputx("\tCIA\r\tTADI STKP\r\tJMSI POP\r\tSMA SZA CLA\r\tCMA\r"); break; case 11: fputx("\tCIA\r\tTADI STKP\r\tJMSI POP\r\tSPA CLA\r\tCMA\r"); break; case 12: fprintf("\tSNA\r\tJMP CC%o\r",strd()); break; case 13: fputx("\tJMSI POP\r\tDCA JLC\r\tSWP\r\tCALL 1,MPY\r\tARG JLC\r\tCDF1\r"); break; case -14: fputx("\tCALL 1,IREM\r\tARG 0\r\tCDF1\r"); break; case 14: fputx("\tJMSI POP\r\tDCA JLC\r\tSWP\r\tCALL 1,DIV\r\tARG JLC\r\tCDF1\r"); break; case -15: fputx("\tIAC\r"); case 15: fputx("\tISZI JLC\r\tNOP\r"); break; case 16: fprintf("\tMQL\r\tTAD STKP\r\tTAD (%o\r\tDCA STKP\r\tSWP\r\tJMPI POPR\r/\r",strd()); break; case 17: pflg++; case -17: if (strl()>0) fprintf("\tCLA\r\tTAD (%o\r\tDCA JLC\r\tTADI JLC\r",strd()); else fprintf("\tCLA\r\tTAD STKP\r\tTAD (%o\r\tDCA JLC\r\tTADI JLC\r",strd()); if (pflg==0) break; case 19: fputx("\tJMSI PSH\r"); break; case 20: fputx("\tANDI STKP\r\tJMSI POP\r"); break; case -20: fputx("\tJMSI POP\r\tMQA\r"); break; case 21: if (strl()>0) fprintf("\tCLA\r\tTAD (%o\r",strd()); else fprintf("\tCLA\r\tTAD STKP\r\tTAD (%o\r",strd()); break; case 22: fputx("\tDCA JLC\r\tTADI JLC\r"); break; case 23: if (strl()<400) fprintf("\tJMP CC%o\r",strl()); strd(); break; case -23: fprintf("\tJMP CC%o\r",strd()); break; case 24: fputx("\tCIA\r\tTADI STKP\r\tJMSI POP\r\tSNA CLA\r\tCMA\r"); break; case -25: fputx("\tCLA CMA\r\tTADI JLC\r\tDCAI JLC\r\tTADI JLC\r"); break; case 25: fputx("\tMQL\r\tCMA\r\tTADI JLC\r\tDCAI JLC\r\tSWP\r"); break; case 26: fputx("\tSNA CLA\r"); case -26: fputx("\tCMA\r"); break; case 27: fputx("\tCIA\r"); break; case 28: fputx("\tSZA CLA\r\tCMA\r"); break; case 29: while (1) { t=fgetc(); if (t=='$') break; fputc(t); } break; case 30: fputx("\CIA\r"); case 31: fputx("\tMQL\r\tJMSI PCAL\r\tXXLL\r\tJMSI POP\r"); break; case 32: fputx("\tMQL\r\tJMSI PCAL\r\tXXOR\r\tJMSI POP\r"); break; case 40: fputx("\tCLA\r\tTAD JLC\r\tDCA TLOC\r"); break; case 41: fputx("\tDCAI TLOC\r\tTADI TLOC\r"); } } /* Dump literal table. Add 2 extra words as SABR can cause a problem. */ ltsz=ltpt-ltbf+2; fprintf("\tLAP\rLCC0,\t%o\rXCC0,\tCC0\r\tCPAGE %o\rCC0,\r",-ltsz,ltsz); p=ltbf; while (ltsz) { fprintf("%o",*p++); if (ltsz>1) fputx("; "); if ((ltsz&7)==0) fputc(13); ltsz--; } fprintf("\r\tEAP\rGBLS,\t%o\r",gadr); fputx("\rMCC0,\t0\r\tCDF1\r\tTAD LCC0\r\tSNA CLA\r\tJMP I MCC0\r\tTAD XCC0\r\tDCA JLC\rDCC0,\tCDF0\r\tTADI JLC\r"); fputx("\tJMSI PSH\r\tCLA\r\tISZ JLC\r\tISZ LCC0\r\tJMP DCC0\r\tJMP I MCC0\rCCEND,\t0\r\t\END\r"); fclose(); } |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 | / CHEKMO II ZZZ=63 /AUTHOR JOHN E. COMEAU / ::::::::::::::::::::::::::::::: / : : / : : / : : / : CHEKMO II : / : CHESS PROGRAM 2/74 : / : : / : : / : : / ::::::::::::::::::::::::::::::: / FIELD 0 CORE UTILIZATION / 0000-0177 CONSTANTS AND POINTERS / 0200-0377 INITIALIZATION / 0400-4777 THE THINKER PART / 5000-6377 INPUT/OUTPUT ROUTINES / 6400-7377 PUSH DOWN LIST AREA / 7400-7577 BOARD & MISC. TABLES / 7600-7777 BINARY LOADER PROGRAM /SYMBOL DEFINITIONS /MISC. SYMBOLS PDLS=6400 /BEGINING OF 1000(OCTAL) WORDS RESERVED FOR PUSH DOWN LISTS /PIECE VALUES DEFINED DECIMAL KING= 15^32 /15. RELATIVE TO A PAWNS VALUE QUEEN= 9^32 /9.0 RELATIVE TO A PAWNS VALUE ROOK= 5^32 /5.0 RELATIVE TO A PAWNS VALUE BISHOP= 3^32+10 /3.3 RELATIVE TO A PAWNS VALUE KNIGHT= 3^32+4 /3.1 RELATIVE TO A PAWNS VALUE PAWN= 1^32 /1.0 RELATIVE TO A PAWNS VALUE OCTAL /PSEUDO INSTRUCTIONS DEFINED PUSH1= JMS I [PUSH01 /PUSH THE AC INTO PUSH DOWN LIST #1 POP1= JMS I [POP01 /POP THE TOP ENTRY OF PUSH DOWN LIST #1 INTO THE AC PRINTO= JMS I [MES /PRINT 6BIT 2CHAR/WORD TEXT AT ADDRESS SPECIFIED IN THE AC IPDL1= JMS I [IPDL01 /INITIALIZE PUSH DOWN LIST #1 PUSH2= JMS I [PUSHIT /PUSH THE CONTENTS OF THE AC INTO PUSH DOWN LIST #2 POP2= JMS I [POPIT /POP THE TOP ENTRY OF PUSH DOWN LIST #2 INTO THE AC IPDL2= JMS I [PDLIN /INITIALIZE PUSH DOWN LIST #2 SNO= JMS I [RFOFL /SKIP NO OVERFLOW (C(AC)>=0 & C(AC8)=0) /PDP 8/E IOTS DEFINED CAF= 6007 PSKF=6661 PCLF=6662 PSKE=6663 PSTB=6664 PCIE=6667 /CONDITIONAL ASSEMBLY DEFINITIONS OS8=1 /NO SPECIAL MEANING TO "^C" LPTREE=1 /DON'T INCLUDE LINE PRINTER CAPABILITIES DEBUG=1 /OPT FOR DYNAMIC ERROR DETECTION RANVAL=1 /NOISY EVALUATIONS PLEASE /DEFAULT ASSEMBLY DEFINITIONS IFNDEF OS8 <OS8=0> /NON OS8 SYSTEM IFNDEF DEBUG <DEBUG=0> /DEBUG SWITCH CLEARED IFNDEF LPTREE <LPTREE=0> /DONT INCLUDE TREE PRINTOUT CAPABILITIES IFNDEF RANVAL <RANVAL=1> /INCLUDE A SMIDGEN OF RANDOMNESS IN EVALUATIONS /ABREVIATIONS USED / SQR SQUARE / INC INCREMENT / # NUMBER / = EQUALS / - MINUS, NEGATIVE OR TO / & AND / INFO INFORMATION / AC ACCUMULATOR / TEMP TEMPORARY /K-SIDE KING SIDE /Q-SIDE QUEEN SIDE / LOC LOCATION / CR CARRIAGE RETURN / LF LINE FEED / MSW MOVE SQUARE WORD / MDW MOVE DATA WORD / CHAR CHARACTER / W/ WITH / < LESS THAN / > GREATER THAN / PSW POSITION STATUS WORD / ADDR ADDRESS / PDL PUSH DOWN LIST / PDL#1 PUSH DOWN LIST #1 / PDL#2 PUSH DOWN LIST #2 / ABS ABSOLUTE / PROM PROMOTION / ARG ARGUMENT / VAL VALUE / MOVE SQUARE WORD(MSW) FORMAT / / ------------------------------------------------------------------------- / I I I I I I I I I I I I I / I 0 I 1 I 2 I 3 I 4 I 5 I 6 I 7 I 8 I 9 I 10 I 11 I / I I I I I I I I I I I I I / ------------------------------------------------------------------------- / I I I I / -----------------I----------------- -----------------I----------------- / / SIXBIT ADDRESS OF THE SIXBIT ADDRESS OF THE / "FROM SQUARE" "TO SQUARE" / MOVE DATA WORD(MDW) FORMAT / ------------------------------------------------------------------------- / I I I I I I I I I I I I I / I 0 I 1 I 2 I 3 I 4 I 5 I 6 I 7 I 8 I 9 I 10 I 11 I / I I I I I I I I I I I I I / ------------------------------------------------------------------------- / I I I I I I I / I ----I---- ----------------I---------------- -------I------- / I / I UNUSED = THE SIXBIT ADDRESS OF 0 = NORMAL / I ALLWAYS THE "TO SQUARE" IF THE 1 = QUEEN SIDE CASTLING / I EQUALS 0 MOVE IS A 2 SQUARE 2 = KING SIDE CASTLING / I PAWN MOVE 3 = EN PASSANT CAPTURE / I 4 = PAWN PROM. TO KNIGHT / I 5 = PAWN PROM. TO BISHOP / I 6 = PAWN PROM. TO ROOK / I 7 = PAWN PROM. TO QUEEN / I / I / I / I / / = 1 IF THIS MOVE / IS A CAPTURE *0000 /INTERRUPT! IFRM, 0000 JMP I .+1 INTHAN /ADDRESS OF THE INTERUPT HANDLER REV, ZZZ /LOC 3 HOLDS PROGRAM REVISION # ODT4, 0000 /LOCATIONS 4, 5, AND 6 ARE RESERVED FOR DEBUGERS ODT5, 0000 ODT6, 0000 / ZERO PAGE CONSTANTS *11 RANDOM, 0000 XR0, 0000 ITMP0, 0000 ITMP1, 0000 /AUTO-INCREMENT TEMPORARY STORAGE ITMP2, 0000 CLIST, KBUF-1 /INPUT BUFFER POINTER LIST2, 0000 TEMP, 0000 /TEMPORARY STORAGE LOCATIONS TEMP1, 0000 / . TEMP2, 0000 / . TEMP3, 0000 / . TEMP4, 0000 / . TMP, 0000 /TEMPORARY STORAGE ZOUT, OUT /POINTS TO OUTPUT ROUTINE CHAR, 0000 /TEMP. STORAGE PLACE FOR A CHARACTER ZCRLF, CRLF /POINTS TO CR-LF PRINTING ROUTINE XXXX, 0000 /TEMPORARY STORAGE ZBEGIN, BEGIN /POINTS TO INPUT INITIATING ROUTINE CNTCHR, 0000 /CHARACTER COUNT ISW, 0000 /INPUT SWITCH ZGETC, GETC /POINTS TO INPUT BUFFER READING ROUTINE PONDIR, 0001 /PAWN DIRECTION CONSTANT M1, 0000 M2, 0000 M3, 0000 M4, 0000 GN1, 0000 /COMMON STORAGE FOR THE MOVE GENERATION ROUTINES GN2, 0000 / . GN3, 0000 / . GN4, 0000 / . GNMSW, 0000 / . GNMDW, 0000 / . FSTRNK, 7777 /-VALUE OF THE FIRST RANK ZCHKIO, CHKIO /POINTS TO IO STALL ROUTINE WPSW, 0000 /WHITES POSITION STATUS WORD BPSW, 0000 /BLACKS POSITION STATUS WORD CPSW, 0000 /ADDRESS OF CURRENT POSITION STATUS WORD IS KEPT HERE GMAP, 0000 OMAP, 0000 TOMAK1, 0000 /MOVE SQUARE WORD HERE TOMAK2, 0000 /MOVE DATA WORD HERE DIR1, 0000 DIR2, 0000 CNTR1, 0000 WKING, 0000 /ADDRESS OF THE WHITE KING IS STORED HERE BKING, 0000 /ADDRESS OF THE BLACK KING IS STORED HERE CKING, 0000 /ADRESS OF THE KING BEING TESTED TKING, 0000 /TEMP STORAGE FOR KING ADDR LSTMV, 0000 /LOCATION WHICH DESCRIBES THE LAST MOVE MADE IF DOUBLE PAWN MOVE ZGNMV, GNMV /POINTS TO MOVE GENERATION ROUTINE ZMKMV, MKMV /POINTS TO THE MOVE MAKING ROUTINE ZUNMV, UNMV /POINTS TO THE MOVE UNMAKING ROUTINE ZMAPEC, MAPEC /POINTS TO PIECE MAP ROUTINE PW, 0000 /SET = TO TOTAL VALUE OF ALL PIECES ON THE BOARD BY 'MAPEC' WHOSE, 0000 /THIS LOC =0 IF IT IS WHITES MOVE, =-1 IF BLACKS PCNT, 0000 /USED BY CHKATK =# OF PIECES ATTACKING THE SQUARE PVAL, 0000 /USED BY CHKATK =LEAST VALUABLE ATTACKER PSQR, 0000 /USED BY CHKATK =ADDRESS OF THE LEAST VALUABLE ATTACKING PIECE ZSPLIT, SPLIT /POINTS TO A SUBROUTINE WHICH SPLITS UP A MSW ZTSTCH, TSTCHK /POINTS TO CHECK TESTING ROUTINE ZFNL, TSTCHK /POINTS TO FINAL LEGAL MOVE VERIFICATION ROUTINE GNCNT, 0000 /LOC=NUMBER OF MOVES GENERATED BY GNWMV TOADR, 0000 IOMDW, 0000 /ARGUMENT STORAGE FOR I/O ROUTINES IOMSW, 0000 /ARGUMENT STORAGE FOR I/O ROUTINES CMSW, 0000 /CHECKMATE SWITCH SMSW, 0000 /STALEMATE SWITCH COMP, 0000 ZLOOKA, LOOKA /POINTS TO THE RECURSIVE LOOKAHEAD SUBROUTINE UVAL1, 0000 CVAL1, 3777 RVAL1, 0000 MVAL1, 0000 /HOLDS MOBILITY VALUE PLY, 0000 /HOLDS CURRENT RECURSION LEVEL OF THE "LOOKA" SUBROUTINE DEPTH, 0003 /HOLDS THE MAXIMUM RECURSION LEVEL FOR THE "LOOKA" SUBROUTINE RDEPTH, 0000 BUG, 0000 RNKKNT, 0000 /TEMP STORAGE FOR BOARD OUTPRINT & BOARD INPUT ROUTINES FILKNT, 0 PIECE, 0 COLOR, 0 RNKPTR, 0 MOBMOD, 0000 KNGBLK, 0000 /SET BY "GNMV" TO # OF KING MOVES ILLEGAL BECAUSE OF CHECK MOB0, 0000 MOB1, 0000 CTNEED, 0000 STRATG, 0000 /HOLDS STRATEGIC VALUE PC01, 0000 /POINTER FOR PUSH DOWN LIST #1 PDLADR, 0000 /POINTER FOR PUSH DOWN LIST #2 IFNZRO DEBUG< ENO, 0000 ENOB, 0000 > WHOWHI, 0000 WHOBLK, 0000 COMTMP, 0000 BOGUS, 0000 DOMAP, 0000 *200 START, IFNZRO LPTREE < TAD (OUT DCA ZOUT /MAKE SURE OUTPUT GOES TO THE TTY > JMS I ZCRLF PRINTO; NAME /PRINT "CHEKMO-II" JMS I ZCRLF DCA WHOSE JMS SETBRD /SETUP THE BOARD COMPN, DCA WHOWHI /RESET SWITCH FOR THE USER TO PLAY WHITE DCA WHOBLK /RESET SWITCH FOR THE USER TO PLAY BLACK COMMAN, IPDL2 /INITIALIZE PUSH DOWN LISTS IPDL1 ISZ DOMAP /MAKE SURE A PIECE MAP IS REALY DONE JMS QMATE /TEST FOR SIDE TO MOVE IN CHECKMATE OR STALEMATE TAD WHOSE /GET "WHOSE MOVE" SWITCH SPA CLA /IS IT WHITES OR BLACKS MOVE? JMP BLKMVE /BLACKS PRINTO; MESG23 /PRINT "W. " TAD WHOWHI /GET THE "WHO PLAYS WHITE" SWITCH SZA CLA /DOES THE COMPUTER PLAY ON BEHALF OF WHITE? JMP CMOVE /YES USER, PRINTO; MESG24 /PRINT "YOUR MOVE?" JMS I ZBEGIN /SETUP TO ACCEPT A LINE OF INPUT ION /ACCEPT IT ANY TIME NOW JMS I ZCHKIO /WAIT FOR IT TO FINISH JMS I ZGETC /GET 1ST CHAR AND [0077 /ONLY NEED 6 BITS RTL CLL /MOVE THEM TO THE HIGH ORDER 6 BITS RTL /POSITION RTL DCA COMTMP /STORE FOR A WHILE JMS I ZGETC /GET 2ND CHAR AND [0077 /ONLY NEED 6 BITS TAD COMTMP /WE NOW HAVE THE FIRST 2 INPUT CHARS PACKED DCA COMTMP /6BIT STYLE IN 1 WORD TAD (COMLST-2/ADDRESS-2 OF THE COMMAND LIST DCA XR0 /TO AUTO INDEX REGISTER NUTHER, ISZ XR0 /INC POINTER TO POINT AT A 6BIT COMMAND IN THE COMMAND LIST TAD I XR0 /GET A LEGAL 6BIT COMMAND SNA /WERE THERE ANY MORE TO GET? JMP UINP /NO. THE USER MUST BE TRYING TO ENTER A MOVE TAD COMTMP /YES. COMPARE WITH THE ONE THE USER JUST INPUTED SZA CLA /IS IT A MATCH? JMP NUTHER /NO. TRY AGAIN TAD I XR0 /YES. GET THE TRANSFER ADDRESS DCA TEMP JMP I TEMP /TRANSFER COMPW, ISZ WHOWHI /SET SWITCH TO INDICATE THAT WHITE IS PLAYED JMP COMMAN /BY THE COMPUTER COMPB, ISZ WHOBLK /SET THE SWITCH TO INDICATE THAT BLACK IS PLAYED JMP COMMAN /BY THE COMPUTER COMBD, JMS DISPLAY /DISPLAY THE BOARD ON THE TELLETYPE JMP COMMAN COMIP, JMS INPUT /GET THE INPUT OF A POSITION FROM THE TELLETYPE JMP COMPN UINP, JMS I ZBEGIN /REINIT THE KEYBOARD BUFFER POINTER JMS INMV /WAS A LEGAL MOVE TYPED IN? SKP CLA /NO. JMP COMMAN /YES. IT WAS ALSO MADE BY THE "INMOVE" SUBROUTINE TAD ("? /PRINT A "?" JMS I ZOUT /TO INDICATE THE ERROR JMS I ZCRLF JMP COMMAN /TRY AGAIN BLKMVE, PRINTO; MESG22 /BRINT "B. " TAD WHOBLK SNA CLA /DOES THE USER PLAY BLACK, OR DOES THE COMPUTER? JMP USER /THE USER CMOVE, CLA /COMPUTER NOW MAKES A MOVE TAD (3777 /INITIALIZE SEARCH VALUE TO PREVENT PRUNING AT THE FIRST PLY DCA CVAL1 DCA PLY /MAKE SURE PLY # IS 0 BEFORE ENTERING RECURSIVE EVALUATOR IFNZRO LPTREE< TAD (LPTOUT /SWITCH OUTPUT DEVICE TO LINE PRINTER DCA ZOUT JMS I ZCRLF JMS DISPLA /PRINT THE BOARD AT PLY 0 JMS TABPLY > CMA CLA TAD DEPTH /DO A SHORT "PRE ANALYSIS" SNA /UNLESS WE ARE IN "BLITZ MODE" (DEPTH OF 1) JMP CMOVE1 /WHICH WE ARE IAC DCA RDEPTH /SAVE THE REAL DEPTH IAC DCA DEPTH /SET THE DEPTH TO 1 TEMPORARILY JMS I ZLOOKA /FIND OUT WHICH MOVE LOOKS THE BEST TAD RDEPTH DCA DEPTH /RESTORE THE REAL DEPTH CMOVE1, JMS I ZLOOKA /FIGURE OUT WHICH MOVE TO MAKE IFNZRO LPTREE< TAD (OUT /SWITCH OUTPUT DEV. BACK TO TTY DCA ZOUT > TAD BESTBL DCA IOMSW TAD BESTBL+1 DCA IOMDW TAD BESTBL /GET THE LAST MOVE TO WIN A COMPARE ON PLY #1 DCA TOMAK1 /FROM THE TABLE OF BEST MOVES TAD BESTBL+1 DCA TOMAK2 JMS I ZMKMV /MAKE THE MOVE JMS OUTMV /PRINT OUT THE MOVE JUST MADE JMS GNMVSM /GENERATE MOVES FOR THE SIDE TO MOVE TAD GNCHEK /GET # OF ATTACKS ON THE KING SZA CLA /IS THE SIDE TO MOVE IN CHECK? TAD ("+ /YES. PRINT A "+" TO INDICATE IT JMS I ZOUT JMS I ZCRLF JMP COMMAN PAGE /THIS SUBROUTINE GENERATES ALL MOVES FOR A SIDE /AND STICKS THEM INTO PDL2. /THIS SUBROUTINE IN ADDITION... /SETS "GNCNT" TO THE # OF MOVES GENERATED /SETS "CMSW" TO A NON-ZERO VALUE IF NO MOVES CAN BE GENERATED BECAUSE OF CHECKMATE /SETS "SMSW" TO A NON-ZERO VALUE IF NO MOVES CAN BE GENERATED BECAUSE OF STALEMATE /SETS "GNCHEK" TO THE NUMBER OF PIECES ATTACKING THE KING IF THE KING IS IN CHECK /SETS "KNGBLK" TO THE NUMBER OF ADJACENT SQUARES THE KING CANNOT MOVE /INTO BECAUSE THAT WOULD PUT HIM IN CHECK /SETS "MOBMOD" TO THE MOVING SIDES MOBILITY VALUE, BASED ON "GNCNT" AND /THE NUMBER OF MOVES THAT ARE ILLEGAL BECAUSE THEY DO NOT /GET THE KING OUT OF CHECK, BUT ARE OTHERWISE LEGAL, MINUS /50% OF THE TOTAL # OF QUEEN MOVES. /IF THIS ROUTINE IS CALLED WITH "BOGUS" SET TO A NON-ZERO VALUE /THIS SUBROUTINE WILL NOT PUT ANY MOVES IN PDL#2 OR TRY TO GENERATE /EN PASSANT PAWN CAPTURES /THIS SUBROUTINE SETS BOGUS TO ZERO BEFORE RETURNING GNMV, 0000 CLL CLA DCA MOBMOD /INITIALIZE THE MOBMOD COUNTER DCA KNGBLK /INITIALIZE THE BLOCKED KING MOVE COUNTER DCA CMSW /INITIALIZE CHECKMATE SWITCH TO = NO CHECKMATE DCA SMSW /INITIALIZE STALEMATE SWITCH TO = NO STALEMATE DCA QMVCNT /INIT QUEEN MOVE COUNTER TAD CKING /TEST FOR KING IN CHECK DCA TEMP JMS CHKATK /CALL W/AC CLEAR---FIND ALL ATTACKS ON THE KING TAD PCNT /GET # OF ATTACKS DCA GNCHEK /SAVE THE # OF ATTACKS ON THE KING DCA GNCNT /INITIALIZE GENERATION COUNT = 0 TAD BOGUS SZA CLA /ARE WE GOING TO BE PUTTING MOVES IN PDL#2? JMP .+3 /NO. NO NEED FOR MARKERS THEN PUSH2 /YES. FIRST THING TO DO IS PUSH 2 BLANK WORDS PUSH2 /TO MARK LIST PLACE TAD CKING /SETUP TO GENERATE KING MOVES DCA CNTR1 TAD CNTR1 /SPLIT THE KINGS SQUARES ADDR UP INTO RANK AND FILE #'S AND [0007 DCA GN2 /STORE THE FILE # TAD CNTR1 RTR RAR AND [0007 DCA GN1 /STORE THE RANK # JMS GKM /GENERATE THOSE KING MOVES TAD GNCHEK /GET THE NUMBER OF PIECES PRESENTLY CHECKING THE KING RAR CLL /NO COMMENT SZA CLA /IS THE KING IN DOUBLE CHECK? JMP TSCMSM /YES. NO USE TRYING TO GENERATE MOVES BY OTHER PIECES TAD BOGUS /NO. SNA CLA /IS THIS FOR REAL? JMS GNEP /YES. GENERATE ANY POSIBLE 'EN PASSANT' PAWN CAPTURES NOW TAD GMAP /ADDRESS-1 OF MAP DCA ITMP2 /STORE IT NXTSQR, CLL CLA TAD I ITMP2 /GET THE ADDRESS OF THE NEXT PIECE SNA /IS IT REALY A PIECE? JMP TSCMSM /NO. MOVES ARE ALL GENERATED. DCA CNTR1 /YES. STORE ITS ADDRESS IAC DCA CTNEED /INITIALIZE THE CHECK TEST NEED SWITCH TAD CNTR1 /NOW STRIP RANK AND FILE NUMBERS FROM THE ADDRESS AND [0007 DCA GN2 /STORE THE FILE NUMBER TAD CNTR1 RTR RAR AND [0007 DCA GN1 /STORE THE RANK NUMBER TAD I CNTR1 /GET THE VALUE OF THE PIECE ON THE SQUARE JMS CLRFIX TAD [-PAWN SNA /IS IT A PAWN? JMP GPM /YES TAD (PAWN-KNIGHT SNA /IS IT A KNIGHT? JMP GNM /YES TAD (KNIGHT-BISHOP SNA /IS IT A BISHOP? JMP GBM /YES TAD (BISHOP-ROOK SNA /IS IT A ROOK? JMP GRM /YES TAD (ROOK-KING SNA /IS IT A KING? JMP NXTSQR /YES. TRY NEXT PIECE SINCE KING MOVES HAVE ALLREADY BEEN GENERATED TAD (KING-QUEEN SNA /IS IT A QUEEN? JMP GQM /YES HLT /NO. SOMTHINGS WRONG HERE ! QMVCNT, 0000 GNCHEK, 0000 TSCMSM, TAD QMVCNT /ADD # OF QUEEN MOVES & QUEEN MOVE REJECTS CLL RAR /DIVIDE BY 2 TAD QMVCNT CLL RAR /AC WIL EQUAL 3/4 OF THE # OF QUEEN MOVES & REJECTS CIA /SUBTRACT TAD MOBMOD /FROM THE MOBILITY MODIFIER TAD GNCNT /ADD "REAL" MOBILITY IN WITH THE MOBILITY MODIFIER DCA MOBMOD DCA BOGUS TAD GNCNT /GET # OF MOVES GENERATED SZA CLA /ANY? JMP I GNMV /YES: RETURN TAD GNCHEK /NO. ITS EITHER A CHECKMATE OR STALEMATE POSITION SNA /WAS THE KING IN CHECK? ISZ SMSW /NO. SET THE STALEMATE SWITCH DCA CMSW /IF KING WAS IN CHECK (GNCHEK>=1) SET THE CHECKMATE SWITCH JMP I GNMV /RETURN IFNZRO DEBUG< /ROUTINE TO ALLOW THE TIMING OF THE "GNMV" SUBROUTINE /CALLS IT 4000(OCTAL) TIMES, THEN HALTS TIME, IPDL2 IPDL1 JMS GNWMV ISZ .+2 JMP .-4 4000 /# OF ITTERATIONS OF THE TIMING LOOP HLT > / SNO -- SKIP NO OVERFLOW /PSEUDO-INSTRUCTION TO TEST FOR RANK OR FILE OVERFLOW. /EFFECTIVLY SKIPS IF NO OVERFLOW. CALL WITH RANK OR FILE /NUMBER IN AC. RETURN WITH NUMBER IN AC IF NO OVERFLOW, GARBAGE OTHERWISE RFOFL, 0000 SPA /LESS THAN ZERO? JMP I RFOFL /YES. RETURN RTR /SHIFT BIT 8 INTO LINK RTR /IF IT'S SET OVERFLOW HAS OCCURED SZL /GREATER THAN 7? JMP I RFOFL /YES. RETURN (WITH A GARBLED ACCUMULATOR) RTL RTL /SHIFT THE WORD BACK TO NORMAL ISZ RFOFL /INC RETURN ADDRESS JMP I RFOFL /RETURN PAGE /THIS ROUTINE GENERATES ALL THE MOVES OF A 'STRAIGHT LINE' MOVING /PIECE. ITMP0 MUST BE PRESET TO THE ADDRESS-1 OF THE MOVE GENERATION /DIRECTION LIST. LCNT MUST BE SET TO MINUS THE NUMBER OF 2-WORD /ENTRIES IN THAT LIST LINE, CLA TAD I ITMP0 /GET THE VERTICAL DIRECTION DCA DIR1 /SAVE IT TAD I ITMP0 /GET THE HORIZINTAL DIRECTION DCA DIR2 /SAVE THAT ALSO TAD GN1 DCA GN3 TAD GN2 DCA GN4 LINEM, TAD GN3 /BUILD SQUARE RANK NUMBER TAD DIR1 SNO /IS THAT RANK REALY ON THE BOARD? JMP XXOX /NO. IT DOES NOT EXIST DCA GN3 TAD DIR2 TAD GN4 JMS XYZ JMP XXOX TAD I CNTR1 /GET VALUE OF THE MOVING PIECE JMS CLRFIX TAD (-QUEEN SNA CLA /ARE WE TESTING FOR A LEGAL QUEEN MOVE? ISZ QMVCNT /YES. INC QUEEN MOVE COUNTER TAD GNMSW JMS I ZFNL /DO FINAL TEST FOR KING CHECK JMP XOOO /MOVE ILLEGAL: KING IS IN CHECK TAD I TOADR /GET VALUE OF THE 'TO' SQUARE SZA CLA /IS THE MOVE A CAPTURE? STL RAR /YES: SET CAPTURE BIT DCA GNMDW JMS GNSTR /PUSH THE MOVE INTO THE STACK XOOO, TAD I TOADR /GET THE VALUE OF THE PIECE ON THE 'TO SQUARE' SNA CLA /WAS THE MOVE A CAPTURE? JMP LINEM /NO. COULD BE MORE MOVES IN THIS DIRECTION XXOX, CLA /YES. NO MORE MOVES IN THIS DIRECTION ISZ LCNT /DONE ALL DIRECTIONS? JMP LINE /NO. TRY ANOTHER JMP NXTSQR /YES. DONE WITH THIS PIECE. TRY NEXT LCNT, 0000 /ROUTINE TO STORE THE MSW AND MDW IN THE PDL GNSTR, 0000 ISZ GNCNT /INC GENERATION COUNT CLA TAD BOGUS SZA CLA /SHOULD THESE MOVES GO INTO PDL#2? JMP I GNSTR /NO. DONT PUT ANY THERE! TAD GNMSW /GET MSW PUSH2 /PUSH IT INTO THE LIST TAD GNMDW /GET THE MDW PUSH2 /PUSH IT INTO LIST JMP I GNSTR /RETURN /SUBROUTINE TO TEST IF THE 'TO' SQUARE IS OCCUPIED BY OWN PIECE /IF NOT SKIP FOR RETURN AND BUILD MSW XYZ, 0000 SNO /DID IT GO OFF THE BOARD? JMP I XYZ /YES: RETURN DCA GN4 /NO: SAVE THIS HALF JMS BLDTO /BUILD 'TO' ADDR TAD I TOADR /GET VALUE OF THE 'TO' SQUARE JMS CLRFIX SMA SZA CLA /OCCUPIED BY OWN PIECE? JMP I XYZ /YES: RETURN JMS BLDMSW /NO: BUILD THE MSW ISZ XYZ /INC RETURN ADDR JMP I XYZ /RETURN GQM, CLA /GENERATE QUEEN MOVES TAD [-10 /DO ALL DIRECTIONS DCA LCNT TAD (OTRX-1 /DIAGONAL AND ORTHOGONAL DCA ITMP0 JMP LINE GRM, CLA /GENERATE ROOK MOVES TAD (-4 /DO ONLY HALF OF THE DIRECTIONS DCA LCNT TAD (OTR-1 /THE ORTHOGONAL ONES DCA ITMP0 JMP LINE GBM, CLA /GENERATE BISHOP MOVES TAD (-4 /DO ONLY HALF OF THE DIRECTIONS DCA LCNT TAD (OTRX-1 /THE DIAGONAL ONES DCA ITMP0 JMP LINE /SUBROUTINE TO BUILD AN MSW. CALL WITH ADDRESS OF THE 'TO SQUARE' IN LOCATION /'TOADR', AND THE LOCATION OF THE 'FROM SQUARE IN LOCATION "CNTR1". RETURN WITH THE /NEW MSW IN LOCATION 'GNMSW BLDMSW, 0000 CLA TAD TOADR AND [0077 /STRIP THE 'TO SQUARE' ADDRESS DOWN INTO 6BIT DCA GNMSW /STORE IT TEMPORARILY TAD CNTR1 AND [0077 /DO THE SAME FOR THE 'FROM SQUARE' ADDRESS RTL CLL /BUT INSTEAD OF STORING IT, ROTATE IT INTO BITS 0-5 RTL RTL TAD GNMSW /NOW PACK THE 6BIT 'TO SQUARE' ADDRESS IN WITH IT DCA GNMSW /STORE AWAY THE NEW MSW JMP I BLDMSW /RETURN PUSHIT, 0000 /PUSH ROUTINE DCA I PDLADR /PUT NEW ITEM ON TOP ISZ PDLADR /PUSH JMS OFLOW /TEST FOR LIST OVERLAP JMP I PUSHIT /RETURN POPIT, 0000 /POP ROUTINE CLA CMA TAD PDLADR /MOVE LIST POINTER DOWN SMA /MAKE SURE LIST DOESN'T GO WILD HLT /IT DID! MANY EXTRA POPS DCA PDLADR TAD I PDLADR /GRAB THE TOP WORD JMP I POPIT /RETURN WITH IT PUSH01, 0000 DCA I PC01 /PUT NEW ITEM ON TOP CMA TAD PC01 DCA PC01 /PUSH IT DOWN JMS OFLOW /TEST FOR PDL OVERFLOW JMP I PUSH01 /RETURN POP01, 0000 ISZ PC01 /MOVE THE LIST POINTER DOWN SKP CLA HLT /LOTS OF EXTRA POPS TAD I PC01 /GRAB THE WORD ON TOP JMP I POP01 /RETURN WITH IT PAGE /ROUTINE TO GENERATE ALL MOVES OF A KING OR KNIGHT /CALLED WITH THE MOVE GENERATION LIST ADDRESS-1 IN AC SNGMV, 0000 DCA ITMP0 /STORE THE ADDRESS OF THE LIST TAD [7770 DCA SCNT /THERE ARE 8 DIRECTIONS DCA GNMDW /INITIALIZE THE MDW TAD GN1 TAD I ITMP0 SNO /OFF THE BOARD JMP XXXO-1 /YES TRY ANOTHER DIRECTION DCA GN3 TAD GN2 TAD I ITMP0 JMS XYZ JMP XXXO TAD I CNTR1 /GET VALUE OF THE MOVING PIECE JMS CLRFIX TAD (-KING SZA CLA /IS IT A KING? JMP SNGKNT /NO: ITS A KNIGHT TAD GNMSW /YES JMS MMOVE /MAKE THE KING MOVE TAD TOADR DCA TEMP /TEST FOR AN ATTACK ON THE KINGS NEW SQUARE IAC /AND RETURN AFTER THE FIRST ATTACK IS FOUND JMS CHKATK JMS UMOVE /UNMAKE THE MOVE TAD PCNT /NOW WORRY ABOUT LEGAL OR ILLEGAL SNA CLA /WAS THE KING IN CHECK? JMP SNGLGL /NO. MOVE IS LEGAL ISZ KNGBLK /YES. INC BLOCKED KING MOVE COUNTER JMP XXXO /GO TO THE ILLEGAL PLACE SNGKNT, TAD GNMSW JMS I ZFNL /DO FINAL CHECK JMP XXXO /KING IS ATTACKED: KNIGHT MOVE NO GOOD SNGLGL, TAD I TOADR /GET VALUE OF THE 'TO' SQUARE SZA CLA /IS THE MOVE A CAPTURE? CLA STL RAR /YES: SET CAPTURE BIT TAD GNMDW DCA GNMDW /STORE MDW AGAIN JMS GNSTR /PUSH MOVE INTO LIST SKP ISZ ITMP0 /FAILED ON FIRST LIST ELEMENT. PASS OVER SECOND XXXO, CLA ISZ SCNT /TESTED ALL DIRECTIONS? JMP SNGMV+4 /NO. TRY THE NEXT ONE JMP I SNGMV /YES. RETURN SCNT, 0000 /DIRECTION COUNTER GPM, CLA /GENERATE THE MOVES OF A PAWN DCA GNMDW TAD GN2 DCA GN4 TAD GN1 JMS PST JMP GPM1 /MOVING 1 FORWARD BLOCKED: FORGET 2 TAD GN1 /MOVING 1 FORWARD IS NOT BLOCKED. NOW TEST FOR 2 TAD FSTRNK SZA CLA JMP GPM1 /NOT THIS PAWNS FIRST MOVE. CAN'T MOVE 2 CLA STL RTR DCA GNMDW /SETUP MDW TO INDICATE DOUBLE PAWN MOVE(TEMPORARY INDICATION) TAD GN3 JMS PST NOP /MUST BE HERE CAUSE "PST" SUBROUTINE SOMETIMES RETURNS TO ADDRESS+2 OF THE CALLING JMS GPM1, CLA /NOW TEST CAPTURES TAD GN1 TAD PONDIR DCA GN3 IAC TAD GN2 DCA GN4 TAD GN4 AND [7770 SZA CLA /CAN IT CAPTURE TO THE HIGH SIDE? JMP .+2 /NO. IT WAS ON THE EDGE OF THE HIGH SIDE JMS CAPTST CLA CMA TAD GN2 SPA /CAN IT CAPTURE TO THE LOW SIDE? JMP .+3 /NO. IT WAS ON THE LOW EDGE DCA GN4 JMS CAPTST JMP NXTSQR /FOLLOWING ARE THE MOVE GENERATION DIRECTION LISTS OTRX, 1 /BISHOP MOVE DIRECTION LIST -1 1 1 -1 -1 -1 1 OTR, 1 /ROOK MOVE DIRECTION LIST 0 0 -1 0 1 -1 0 KNLST, 2 /KNIGHT MOVE DIRECTION LIST -1 2 1 1 2 -1 2 -2 1 -2 -1 -1 -2 1 -2 PAGE /GENERATE KING MOVES GKM, 0000 /FIRST TRY CASTLING IAC CLA /SETUP MDW TO INDICATE CASTLING DCA GNMDW TAD PONDIR /BUILD THE ADDRESS OF THE KINGS ORIGINAL SQUARE AND (0070 TAD (BOARD+4/KING IS ON FILE E DCA TEMP /STORE THE ADDRESS OF THE KINGS ORIGINAL SQUARE TAD I TEMP /GET THE VALUE OF THE PIECE ON IT JMS CLRFIX TAD (-KING SNA CLA /IS IT A KING? JMP GKM2 /YES TAD I CPSW /NO. MAKE 'CPSW' REFLECT THIS AND [0007 /SAVE BITS 9-11 IN CASE HE IS CASTLED TAD (3000 /SET THE "NO MORE CASTLING" BITS DCA I CPSW /NO MORE CASTLING JMP GKM1 /BUT NORMAL KING MOVES ARE OK. GENERATE THEM NOW GKM2, TAD TEMP /CHANGE 'TEMP' TO EQUAL THE ADDRESS OF THE QUEENS ROOK AND [7770 /BY CHANGING THE FILE TO A DCA TEMP /STORE ADDRESS OF QUEENS ROOK TAD I CPSW RTL /MOVE 'QUEEN ROOK BIT' INTO AC0 SPA CLA /IF ITS SET THE QUEENS ROOK HAS MOVED JMP CAKR /QUEENS ROOK HAS MOVED ALLREADY: TRY KING SIDE CASTLING TAD I TEMP /GET VALUE OF PIECE ON A1(A8) JMS CLRFIX TAD (-ROOK SNA CLA /IS IT A ROOK? JMP .+5 /YES. CONTINUE TAD (1000 /NO. 'QUEEN ROOK BIT' LIED TAD I CPSW /CHANGE IT TO GIVE A TRUE INDICATION DCA I CPSW /NO MARE CASTLING WITH THE QUEENS ROOK JMP CAKR /AND TRY KING-SIDE CASTLING TAD GNCHEK /FIND OUT IF THE KING IS IN CHECK SZA CLA /IS THE KING IN CHECK JMP CAKR /YES. GO SEE IF THE KINGS ROOK HAS MOVED ISZ TEMP /NO. INC 'TEMP' SO THAT IT EQUALS THE ADDRESS OF B1(B8) TAD I TEMP /GET THE VALUE OF THE SQUARE SZA CLA /IS IT EMPTY? JMP CAKR /NO. TRY KING-SIDE CASTLING ISZ TEMP /INC 'TEMP' SO THAT IT EQUALS THE ADDRESS OF C1(C8) TAD I TEMP /GET THE VALUE OF THE SQUARE SZA CLA /IS IT EMPTY? JMP CAKR /NO. TRY KING-SIDE CASTLING JMS CHKATK /CHECK FOR AN ATTACK ON THAT SQUARE BY AN ENEMY PIECE TAD PCNT /GET # OF ATTACKS SZA CLA /ANY? JMP CAKR /YES. Q-SIDE CASTLING ILLEGAL, TRY K-SIDE ISZ TEMP /INC 'TEMP' TO EQUAL ADDRESS OF D1(D8) TAD I TEMP /GET THE SQUARES VALUE SZA CLA /IS IT OCCUPIED? JMP CAKR /YES. TRY K-SIDE CASTLING INSTEAD JMS CHKATK /CHECK FOR ATTACKS ON SQUARE D1(D8) TAD PCNT /GET # OF ATTACKS SZA CLA /ARE THERE ANY? JMP CAKR /YES. TRY K-SIDE CASTLING TAD PONDIR /NO. QUEEN SIDE CASTLING IS LEGAL!! AND (7070 /BUILD AN MSW FOR QUEEN SIDE CASTLING TAD (0402 DCA GNMSW /STORE THE NEW MSW JMS GNSTR /PUSH THE MOVE ONTO PDL2 CAKR, CLA TAD I CPSW /TRY TO GENERATE A KING SIDE CASTLING MOVE RAL /MOVE 'KING ROOK BIT' OF THE PSW INTO AC0 SPA CLA /IS IT SET? JMP GKM1 /YES. KINGS ROOK HAS ALLREADY MOVED TAD TEMP /NO. BUILD ADDRESS OF THE KINGS ROOK AND [7770 TAD [0007 DCA TEMP TAD I TEMP /GET THE VALUE OF THE PIECE ON H1(H8) JMS CLRFIX TAD (-ROOK SNA CLA /IS IT A ROOK? JMP .+5 /YES CONTINUE CLA STL RTR /NO. 'KING ROOK BIT' LIED: FIX IT TAD I CPSW DCA I CPSW JMP GKM1 /GO TRY PROPER STYLE KING MOVES TAD GNCHEK /TEST FOR KING IN CHECK SZA CLA /IS THEKING IN CHECK? JMP GKM1 /YES. GO TRY REGULAR STYLE KING MOVES TAD TEMP /NO. CONTINUE TRYING FOR KING SIDE CASTLING TAD (-2 DCA TEMP /SET 'TEMP' = THE ADDRESS OF SQUARE E1(E8) JMS CAKR1 /TEST TO SEE IF THE SQUARE IS OCUPIED OR ATTACKED ISZ TEMP /NO. INC 'TEMP' TO EQUAL THE ADDRESS OF F1(F8) JMS CAKR1 /TEST THE SQUARE FOR OCCUPATION OR ATTACKS TAD PONDIR /NO. BUILD AN MSW CAUSE KING SIDE CASTLING IS LEGAL!! AND (7070 TAD (0406 DCA GNMSW ISZ GNMDW /INC MDW SO THAT IT INDICATES KING SIDE CASTLING JMS GNSTR /STORE THE MOVE IN PDL2 GKM1, CLA TAD (OTRX-1 /NOW GENERATE 'NORMAL' KING MOVES JMS SNGMV JMP I GKM /RETURN CAKR1, 0000 TAD I TEMP /GET THE VALUE OF THE SQUARE SZA CLA /IS THERE A PIECE ON IT? JMP GKM1 /YES. MOVE ON TO NORMAL KING MOVES JMS CHKATK /NO. TEST FOR ATTACKS ON THAT SQUARE BY ENEMY PIECES TAD PCNT /GET # OF ATTACKS SZA CLA /ANY? JMP GKM1 /YES. JMP I CAKR1 /RETURN GNM, CLA /GENERATE KNIGHT MOVES TAD (KNLST-1/GET ADDRESS OF THE KNIGHT MOVE GENERATION LIST JMS SNGMV JMP NXTSQR PAGE /SUBROUTINE TO BUILD A 'TO SQUARE' ADDRESS /RETURN WITH ADDRESS IN LOC 'TOADR' BLDTO, 0000 TAD GN3 /GET RANK # AND ROTATE IT RTL CLL /INTO ITS PROPER PLACE(BITS 6-8) RAL TAD GN4 /ADD IN THE FILE # TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT DCA TOADR /STORE THE ADDRESS JMP I BLDTO /RETURN /SUBROUTINE TO FIX THE COLOR PROBLEM, AND ALLOW ANY SUBROUTINE /TO WORK WITH BLACK PIECES AS WELL AS WHITE PIECES CLRFIX, 0000 COLR, HLT /=NOP FOR WHITE, =CIA FOR BLACK JMP I CLRFIX /RETURN /SUBROUTINE TO GENERATE 'EN PASSANT' PAWN CAPTURES /IF PAWNS MYSTERYOUSLY CHANGE COLOR, THIS ROUTINE IS THE LIKLEY SUSPECT GNEP, 0000 CMA CLA /-1 TO THE AC DCA CTNEED /ALWAYS TEST FOR KING IN CHECK TAD LSTMV /GET SOME INFORMATION ON THE LAST MOVE MADE AND (0770 /ISOLATE THE 'DOUBLE PAWN MOVE' INFO SNA /WAS THE LAST MOVE MADE A DOUBLE PAWN MOVE? JMP I GNEP /NO. 'EN PASSANT' CAPTURES ARE NOT POSIBLE. RETURN RTR CLL /YES. ROTATE THE INFO(6BIT 'TO ADDRESS') INTO BITS 6-11 RAR TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT DCA CNTR1 /STORE THE ADDRESS OF THE CAPTURED PAWN TAD CNTR1 DCA GNEPTM /STORE THE ADDRESS OF THE CAPTURED PAWN DCA I GNEPTM /TAKE THE PAWN OFF THE BOARD NOW FOR CONVIENIENCE TAD CNTR1 /BUILD A 'TO RANK' THEN A 'TO ADDRESS' RTR CLL /FIRST ROTATE THE OLD 'TO RANK' INTO BITS 9-11 RAR AND [0007 TAD PONDIR /NEW 'TO RANK' IS 1 MOVE GREATER THAN THE OLD ONE RTL CLL /ROTATE THE 'TO RANK' BACK INTO PLACE AGAIN RAL DCA GNMDW /STORE IT TEMPORARILY TAD CNTR1 /GET THE ADDRESS OF THE PAWN BEING CAPTURED AND (7707 /CLEAR OUT ROOM FOR THE NEW 'TO RANK' TAD GNMDW /ADD THE NEW 'TO RANK' IN DCA TOADR /STORE THE 'TO SQUARE' ADDRESS TAD (4003 /4003 IS THE MDW REPRESENTING AN 'EN PASSANT' CAPTURE DCA GNMDW /STORE THE NEW MDW ISZ CNTR1 /TRY THE ADDJACENT FILE ON THE HIGH SIDE FIRST TAD CNTR1 AND [0007 SNA CLA /IS THERE REALY A FILE ON THAT SIDE? JMP GNOTF /NO. TRY THE OTHER SIDE TAD I CNTR1 /GET THE VALUE OF THE PIECE ON THE SQUARE JMS CLRFIX TAD [-PAWN SZA CLA /IS IT A PAWN? JMP GNOTF /NO. TRY THE OTHER ADDJACENT FILE JMS BLDMSW /YES. MOVE SEEMS OK. BUILD AN MSW FOR IT TAD GNMSW /LOAD THE MSW INTO THE AC JMS I ZTSTCH /TEST IF THE MOVE IS ILLEGAL BY VIRTUE OF KING IN CHECK SKP /IT IS ILLEGAL DONT STORE IT IN THE PUSH DOWN LIST JMS GNSTR /MOVE IS LEGAL STORE IT IN PDL2 GNOTF, CLA TAD CNTR1 /GET THE 'FROM SQUARE ADDRESS' TAD (-2 /CHANGE IT TO POINT TO THE ADDJACENT FILE ON THE OTHER SIDE DCA CNTR1 TAD GNEPTM /NOW TEST IF THAT FILE REALY EXISTS AND [0007 /IF THE FILE IS 0 WE'RE ON THE EDGE SNA CLA /DOES THE FILE REALY EXIST, OR IS THE PAWN ON THE EDGE OF THE BOARD JMP GNEPDN /DOES NOT EXIST! TAD I CNTR1 /GET THE VALUE OF THE PIECE ON THAT SQUARE JMS CLRFIX TAD [-PAWN SZA CLA /IS IT A PAWN? JMP GNEPDN /NO JMS BLDMSW /YES. BUILD AN MSW TAD GNMSW JMS I ZTSTCH /IS THE KING IN CHECK IF THAT MOVE IS MADE SKP /YES. DONT STORE THE MOVE IN THE PDL JMS GNSTR /NO. STORE THE MOVE IN PDL2 GNEPDN, TAD [-PAWN JMS CLRFIX DCA I GNEPTM /REPLACE THE PAWN THAT WAS REMOVED EARLIER JMP I GNEP /RETURN GNEPTM, 0000 /LOCATION FOR STORAGE OF THE CAPTURED PAWNS ADDRESS /SUBROUTINE TO MAP THE PIECES IF NECCESARY(IF DOMAP=-1). /MAP IS IN TWO PARTS, 1 FOR EACH COLOR /WHITE MAP STARTS AT LOC 7400. BLACK MAP STARTS AT LOC 7424. /MAP FORMAT-- 1 WORD PER PIECE, REPRESENTING THE ADDRESS OF THAT PIECE MAPEC, 0000 CLA CMA TAD [BOARD /SETUP BOARD ADDRESS DCA ITMP2 TAD DOMAP SNA CLA /IS A MAP REALY NECCESARY? JMP I MAPEC /NO. RETURN DCA DOMAP TAD (MAP-1 /YES. SETUP MAP OF WHITES PIECE ADDRESSES DCA ITMP0 TAD (MAP+23 /SETUP MAP OF BLACK PIECE ADDRESSES DCA ITMP1 TAD (-100 /SETUP COUNT FOR 100(OCTAL) SQUARES ON THE BOARD DCA TEMP4 TAD I ITMP2 /GET VALUE OF THE PIECE ON THE SQUARE SZA /IS SQUARE OCCUPIED? JMP MAPOC /YES MAPGO, ISZ TEMP4 /FINISHED BOARD YET? JMP .-4 /NO. DO MORE SQUARES DCA I ITMP0 /YES. PUT A 0000 AT THE END OF THE WHITE MAP DCA I ITMP1 /ALSO AT THE END OF THE BLACK MAP JMP I MAPEC /RETURN MAPOC, SPA /IS IT WHITE OR BLACK? JMP MAPOCB /ITS BLACK TAD (-KING /ITS WHITE. IS IT A KING? SZA CLA JMP .+3 /NO TAD ITMP2 /YES DCA WKING /STORE ADDRESS OF THE WHITE KING TAD ITMP2 DCA I ITMP0 /PUT IT IN THE WHITE MAP WHATEVER IT IS JMP MAPGO MAPOCB, TAD (KING /IS IT THE BLACK KING? SZA CLA JMP .+3 /NO. PROCEDE NORMALY TAD ITMP2 /YES, GET ITS ADDRESS DCA BKING /STORE IT TAD ITMP2 /GET THE ADDRESS DCA I ITMP1 /EITHER WAY, PUT IT IN THE BLACK MAP JMP MAPGO PAGE /SUBROUTINE TO CHECK FOR A 'DOUBLE PAWN MOVE', AND MODIFY THE /MDW IF IT IS. ALSO TEST IF A LEGAL PAWN MOVE IS ALSO A PROMOTING MOVE /APPROPRIATE ACTION IS TAKEN IF IT IS. IN ANY CASE THIS ROUTINE CALLS /'GNSTR' TO STORE MSW & MDW IN PDL2 PROMCK, 0000 CLA TAD GNMDW /GET THE MOVE DATA WORD RTL /ROTATE AC BIT 1 INTO THE LINK SZL CLA /DOES IT SAY 'DOUBLE PAWN MOVE'? JMP PROM1 /YES. SET THE MDW TO SHOW IT TAD GN3 /BUILD THE RANK OF THE PAWN, IF IT WERE TO BE TAD PONDIR /MOVED ONE MORE TIME SNO /IS IT STILL ON THE BOARD? SKP CLA /NO: IT'S A PROMOTIMG MOVE JMP PPLSTR /YES: IT'S NOT A PROMOTING MOVE TAD GNMDW TAD [0004 /SET 'PAWN PROMOTION BIT' (BIT 9) OF THE MDW DCA GNMDW JMS GNSTR /STORE PROMOTION TO KNIGHT MOVE IN PDL2 ISZ GNMDW /CHANGE MDW TO INDICATE PROMOTION TO A BISHOP JMS GNSTR /STORE MOVE IN PDL2 ISZ GNMDW /CHANGE MDW TO INDICATE PROMOTION TO A ROOK JMS GNSTR /STORE MOVE IN PDL2 ISZ GNMDW /CHANGE THE MDW TO INDICATE PROMOTION TO A QUEEN PPLSTR, JMS GNSTR /STORE MOVE IN PDL2 JMP I PROMCK /RETURN PROM1, CLL RTR /CLEAR LINK(BIT 1)AND REROTATE THE MDW BACK INTO POSITION DCA GNMDW /RESTORE THE MDW TAD GNMSW /NOW GET THE MSW AND [0077 /EXTRACT 'TO SQUARE' INFO RTL CLL /ROTATE THE INFO SO THAT IT FITS IN MDW BITS 3-8 RAL TAD GNMDW /ADD IT TO THE MDW DCA GNMDW /THERES THE NEW MDW!!! JMP PPLSTR /IF THE PAWN MOVE A DOUBLE MOVE, IT WASN'T QUEENING /SUBROUTINE TO CHECK FOR LEGAL PAWN CAPTURES CAPTST, 0000 JMS BLDTO /BUILD THE ADDRESS OF THE 'TO' SQUARE TAD I TOADR /GET THE VALUE OF THE SQUARE JMS CLRFIX SMA CLA /IS IT AN ENEMY PIECE? JMP I CAPTST /YES. CAN ONLY CAPTURE OPPOSING PIECES JMS BLDMSW /NO. CAPTURE SEEMS LEGAL. BUILD AN MSW CLA STL RAR /BUILD AN MDW WHICH INDICATES CASTLING DCA GNMDW TAD GNMSW /FINAL TEST FOR MOVE LEGALITY COMING UP JMS I ZFNL /IS KING IN CHECK? JMP I CAPTST /YES: MOVE ILLEGAL JMS PROMCK /NO: CHECK FOR PROMOTION JMP I CAPTST /RETURN PST, 0000 TAD PONDIR DCA GN3 JMS BLDTO /BUILD THE 'TO' ADDR TAD I TOADR /GET VALUE OF 'TO' SQUARE SZA CLA /IS THE SQUARE OCCUPIED? JMP I PST /YES, MOVE NO GOOD JMS BLDMSW /NO. PACK IT INTO 12 BITS. TAD GNMSW JMS I ZFNL /IS KING IN CHECK? SKP /YES: MOVE NO GOOD JMS PROMCK /MOVE IS LEGAL. CHECK FOR PAWN PROMOTION ISZ PST /INC RETURN ADDRESS IF "TO" SQUARE WAS NOT OCCUPIED JMP I PST /TEST FOR LEGAL KNIGHT CAPTURE: ISLNM, CLA CLL CMA RAL /AC WILL=-2 DCA TOOS TAD M1 /COMPARE RANKS CIA TAD M3 SMA CIA IAC SNA JMP .+5 IAC SZA CLA JMP BATAK ISZ TOOS TAD M2 CIA TAD M4 SMA CIA IAC SNA JMP .+5 IAC SZA CLA JMP BATAK ISZ TOOS SKP JMP BATAK ISZ TOOS JMP BATAK JMP GATAK TOOS, 0000 PDLIN, 0000 /INITIALIZE THE LIST CLA TAD (PDLS DCA PDLADR /INITIALIZE LIST ADDRESS JMP I PDLIN /RETURN IPDL01, 0000 /INITIALIZE PUSH DOWN LIST #1 CLA TAD (PDLS+777 DCA PC01 JMP I IPDL01 /RETURN /SUBROUTINE TO TEST FOR PUSH DOWN LIST OVERFLOW OFLOW, 0000 TAD PC01 /GET ADDR OF BOTTOM PDL#1 CIA /COMPARE IT WITH TAD PDLADR /THE ADDR OF BOTTOM PDL#2 SZA CLA /ARE THEY THE SAME? JMP I OFLOW /NO. RETURN. /PUSH DOWN LIST HAS OVERFLOWED!!!!! IFNZRO LPTREE< TAD (OUT DCA ZOUT /MAKE SURE OUTPUT GOES TO THE TTY > PRINTO; MESG26 /PRINT "I RESIGN" JMS I ZCRLF HLT MESG26, TEXT \I RESIGN\ PAGE /CHECK FOR LEGAL KING MOVE ISLKM, CLA TAD M1 CIA TAD M3 SMA CIA SZA IAC SZA CLA JMP BATAK TAD M2 CIA TAD M4 SMA CIA SZA IAC SNA CLA JMP GATAK JMP BATAK /ROUTINE TO CHECK FOR PIECES IN THE MOVE ROW ROW, 0000 CLA TAD M1 CIA TAD M3 RAL CLL /GET THE SIGN SZA CLA TAD (10 SZL CIA DCA TEMP3 TAD M4 CIA TAD M2 RAL CLL /GET THE SIGN SZA CLA IAC SNL CIA TAD TEMP3 DCA TMP TAD TMATK /GET THE SQUARE OF THE ATTACKER DCA TEMP3 /COPY IT SO WE DONT HAVE TO DESTROY THE ORIGINAL MIDLIN, TAD TEMP3 /SET TO NEXT SQUARE TAD TMP DCA TEMP3 TAD TEMP3 /COMPARE IT WITH THE ATTACKED SQUARE CIA TAD TEMP SNA CLA /ARE THEY THE SAME? JMP I ROW /YES RETURN TAD I TEMP3 /NO. GET THE VALUE OF THE PIECE ON THE SQUARE SNA CLA /IS THE SQUARE EMPTY? JMP MIDLIN /YES- KEEP GOING UNTIL WE FIND ONE THAT ISN'T ISZ ROW /NO. ITS NOT A LEGAL ATTACK--INC RETURN ADDRESS JMP I ROW /RETURN /CHECK FOR LEGAL BISHOP MOVE SUBR1, 0000 CLA TAD M1 CIA TAD M3 SMA CIA DCA TEMP3 TAD M2 CIA TAD M4 SPA CIA TAD TEMP3 SZA CLA /ARE BOTH SQUARES ON THE SAME DIAGONAL? JMP I SUBR1 /NO JMS ROW /YES. FIND OUT IF ANY PIECES ARE BLOCKING THAT DIAGONAL ISZ SUBR1 /NONE FOUND -- INC RETURN ADDRESS JMP I SUBR1 /RETURN /CHECK FOR LEGAL ROOK MOVE SUBR2, 0000 CLA TAD M1 CIA TAD M3 SNA CLA JMP .+6 /SAME RANK. FORGET FILE TAD M2 CIA TAD M4 SZA CLA JMP I SUBR2 /BOTH RANK AND FILE CHANGED?! JMS ROW ISZ SUBR2 /NO PIECES IN THE WAY-- INC RETURN ADDRESS JMP I SUBR2 /CHECK FOR LEGAL QUEEN MOVE /GO TO 'GATAK' IF IT IS ISLQM, JMS SUBR2 /CHECK FOR A QUEEN MOVE 'ROOK STYLE' SKP /NOT FOUND JMP GATAK /FOUND JMS SUBR1 /IF NOT CHECK FOR BISHOP STYLE QUEEN MOVE JMP BATAK /NIETHER ONE JMP GATAK /FOUND BISHOP STYLE QUEEN MOVE ISLBM, CLA JMS SUBR1 JMP BATAK JMP GATAK ISLRM, CLA JMS SUBR2 JMP BATAK JMP GATAK PAGE /SUBROUTINE TO TEST IF A SQUARE IS ATTACKED BY A PIECE. /ALSO FINDS OUT HOW MANY ATTACKERS, AND THE VALUE OF THE LEAST VALUABLE ATTACKER /CALL WITH ADDRESS OF SQUARE TO BE TESTED IN LOCATION 'TEMP' /ALSO PONDIR AND COLR SET IN REVERSE OF THE ATTACKERS /AND THE ATTACKERS PIECE LIST ADDRESS-1 IN LOC 'OMAP' /RETURNS WITH NUMBER OF ATTACKERS IN LOC. 'PCNT', THE ADDRESS /OF THE LEATST VALUABLE ATTACKER IN LOC "PSQR" AND VALUE OF THE LEAST /VALUABLE ATTACKER IN LOC. 'PVAL' /IF THE VALUE OF THE LEAST VALUABLE ATTACKER, AND THE # OF ATTACKERS /IS NOT IMPORTANT, CALL WITH AC NOT =0 /RETURN IN THIS CASE IS DIRECTLY AFTER THE FIRST ATTACK IS FOUND CHKATK, 0000 DCA CKMODE /SET RETURN MODE SWITCH CLA CMA DCA TMATK /INITIALIZE SWITCH ENABLING 1 LOOPBACK IN THE PAWN SECTION DCA PCNT /INITIALIZE PIECE COUNT DCA PVAL /INITIALIZE PIECE VALUE TO 0 DCA PSQR /INIT PIECE ADDRESS TAD TEMP /GET SQUARE TO BE CHECKED AND [0007 /EXTRACT THE FILE # DCA M4 /RECORD IT TAD TEMP /GET SQUARE ADDR AGAIN RTR CLL /ROTATE RIGHT 3 BITS SO THAT THE RANK CAN RAR /BE EXTRACTED IN A SIMILAR MANNER AND [0007 DCA M3 /STORE RANK # TAD PONDIR /CHECK FOR AN ATTACK BY A PAWN TAD M3 SNO /IMPOSIBLE RANK? JMP TAG1 /YES. FORGET PAWN ATTACKS DCA M1 /NO. SAVE THE RANK IAC CLA /NOW BUILD A FILE TAG0, TAD M4 SNO /IS THAT FILE REALY ON THE BOARD? JMP TAG3 /NO. RTR CLL /YES: PASTE TOGETHER THE ADDRESS OF THIS HYPOTHETICAL PAWN RAR TAD M1 RTL RAL TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT DCA TEMP1 /VOLIA! STORE THE ADDRESS TAD I TEMP1 /GET THE VALUE OF THE PIECE AT THAT ADDR JMS CLRFIX TAD (PAWN SZA CLA /PER CHANCE A PAWN? JMP TAG3 /NO: TRY NEXT PIECE TAG2, ISZ PCNT /YES. ITS A PAWN ATTACK. INC PIECE COUNT TAD I TEMP1 /SET LOWEST VALUED ATTACKING PIECE VALUE = PAWN DCA PVAL TAD TEMP1 /ALSO SET THE ADDRESS OF THE LOWEST ATTACKING PIECE DCA PSQR /EQUAL TO THE ADDRESS OF THE PAWN TAD CKMODE /TEST FOR 'FAST RETURN' MODE SZA CLA JMP I CHKATK /RETURN NOW TAG3, ISZ TMATK /TESTED FOR PAWNS ON BOTH ADJACENT FILES? JMP TAG1 /YES CMA CLA /NO. LOOP BACK FOR THE OTHER FILE JMP TAG0 TMATK, 0000 CKMODE, 0000 TMATK1, 0000 TAG1, CLA TAD OMAP /GET ADDRESS-1 OF THE ATTACKERS PIECE MAP DCA TOMAK1 BATAK, ISZ TOMAK1 /INC THE PIECE TABLE ADDRESS TAD I TOMAK1 /GET THE ADDRESS OF THE PIECE SNA /IS IT REALY A PIECE, OR IS THE SQUARE BLANK? JMP I CHKATK /BLANK. TABLE EXAUSTED:RETURN DCA TMATK /NO. SOMTHINGS THERE. STORE ITS ADDRESS TAD TMATK /GET THE ATTACKERS SQR ADDR CIA TAD TEMP /COMPARE WITH THE ATTACKED SQUARS ADDRESS SNA CLA /ARE THEY THE SAME? JMP BATAK /YES.PIECES CANNOT ATTACK THEMSELVES TAD I TMATK JMS CLRFIX TAD (PAWN SNA CLA /IS IT A PAWN? JMP BATAK /YES, DONE PAWNS ALLREADY, TRY NEXT PIECE TAD TMATK /NO GET SQUARE ADDRESS AND [0007 /EXTRACT THE FILE DCA M2 /STORE IT TAD TMATK /GET ADDRESS AGAIN RTR /ROTATE RANK # INTO BITS 9-11 RAR AND [0007 /ISOLATE RANK INFO DCA M1 /STORE IT TAD I TMATK /GET THE VALUE OF THE PIECE AGAIN JMS CLRFIX TAD (ROOK /NOW IDENTIFY IT SNA /IS IT A ROOK? JMP ISLRM /YES TAD (-ROOK+BISHOP SNA /IS IT A BISHOP? JMP ISLBM /YES TAD (-BISHOP+KNIGHT SNA /IS IT A KNIGHT? JMP ISLNM /YES TAD (-KNIGHT+KING SNA /IS IT A KING? JMP ISLKM /YES TAD (-KING+QUEEN SNA CLA /IS IT A QUEEN? JMP ISLQM /YES JMP BATAK /NO? WHATEVER WAS THERE MUST HAVE MOVED! PLEASE TO IGNORE. /WE REACH HERE IF AN ATTACK ON THE SQUARE IN QUESTION IS FOUND GATAK, ISZ PCNT /INC ATTACK COUNTER TAD CKMODE /TEST FOR FAST RETURN SZA CLA /'FAST RETURN' MODE? JMP I CHKATK /YES. RETURN NOW CMA CLA TAD PCNT SNA CLA /IS THIS THE FIRST ATTACK FOUND? JMP TAG4 /YES. DONT COMPARE TAD I TMATK /NOW COMPARE THE VALUE OF THIS ATTACKING PIECE CIA /WITH THE LOWEST VALUED ATTACKER FOUND SO FAR TAD PVAL JMS CLRFIX SMA CLA /IS THE VALUE OF THIS PIECE LOWER? JMP BATAK /NO TAG4, TAD I TMATK /YES. REPLACE THE OLD VALUE WITH THIS ONE DCA PVAL TAD TMATK DCA PSQR JMP BATAK PAGE /TEST FOR KING IN CHECK BY MOVING A PIECE AND CALLING CHKATK /CALL WITH MSW IN AC, AND THE KINGS ADDRESS IN "CKING" /RETURN TO THE ADDRESS+1 OF THE CALLING JMS IF THE KING IS IN CHECK /RETURN TO THE ADDRESS+2 OF THE CALLING JMS IF THE KING IS NOT IN CHECK TSTCHK, 0000 DCA MMUMTM /STORE THE MSW FOR THE MOMENT TAD GNCHEK /GET # OF ATTACKS ON THE KING SZA CLA /WAS THE KING IN CHECK? JMP TSTCH1 /YES. DO A COMPLETE TEST FOR KING IN CHECK TAD CTNEED SPA /HAVE WE DETERMINED THAT A CHECK TEST IS NESCESARY? JMP TSTCH1 /YES. DO ONE SNA CLA /NO. HAVE WE DETERMINED THAT IT IS NOT? JMP TSTCH2 /YES. DONT DO ONE THEN DCA CTNEED /NO. DETERMINE THAT NOW TAD CKING DCA TEMP TAD CNTR1 DCA TMATK TAD TEMP RTR CLL RAR AND [0007 DCA M3 TAD TEMP AND [0007 DCA M4 TAD CNTR1 RTR CLL RAR AND [0007 DCA M1 TAD CNTR1 AND [0007 DCA M2 JMS SUBR1 SKP JMP TSTCH1 JMS SUBR2 JMP TSTCH2 TSTCH1, CLA CMA DCA CTNEED /SET CHECK TEST NEED SWITCH TAD MMUMTM /GET THE MSW BACK AGAIN JMS MMOVE TAD CKING /ADDRESS TO TEST FOR ATTACK DCA TEMP IAC /RETURN AFTER FIRST ATTACK IS FOUND JMS CHKATK JMS UMOVE /PUT THE PIECE BACK WHERE IT BELONGS TAD PCNT /GET # OF ATTACKS SNA /ANY? TSTCH2, ISZ TSTCHK /NO. INC RETURN ADDRESS SNA CLA /I'LL ASK AGAIN: WERE THERE ANY? JMP I TSTCHK /NO. RETURN TAD GNCHEK SZA CLA /WAS IT A CHECK REPLY? ISZ MOBMOD /TALLY ONE MORE ILLEGAL BY VIRTUE OF KING IN CHECK JMP I TSTCHK /SUBROUTINE TO MAKE A SIMPLE TYPE MOVE /CALL WITH MSW IN AC MMOVE, 0000 DCA MMUMT1 /STORE THE MSW TAD MMUMT1 JMS I ZSPLIT /SPLIT THE MSW UP INTO 'TO' AND 'FROM' SQUARE ADDRESSES TAD I TEMP1 /GET VALUE OF CAPTURED PIECE DCA MMUMTM /STORE IT TAD I TEMP2 /MOVE THE PIECE DCA I TEMP1 /ONTO ITS NEW SQR DCA I TEMP2 /CLEAR OUT OLD SQR JMP I MMOVE /SUBROUTINE TO UMMAKE SIMPLE TYPE MOVES /AS MADE BY THE MMOVE SUBROUTINE UMOVE, 0000 CLA TAD MMUMT1 /GET THE MSW JMS I ZSPLIT /SPLIT IT UP INTO 'TO' AND 'FROM' SQUARE ADDRESSES TAD I TEMP1 /GET VALUE OF THE PIECE BEING UNMOVED DCA I TEMP2 /PUT IT BACK ON ITS ORIGINAL SQUARE TAD MMUMTM DCA I TEMP1 /RESTORE CAPTURED PIECE JMP I UMOVE MMUMTM, 0000 MMUMT1, 0000 /SUBROUTINE TO GENERATE ALL MOVES FOR WHITE GNWMV, 0000 CMA CLA /SETUP FIRST RANK CONSTANT DCA FSTRNK JMS I ZMAPEC /MAP THE PIECES TAD (NOP /SETUP COLOR COMPLIMENTOR DCA COLR IAC /SETUP PAWN DIRECTION CONSTANT DCA PONDIR TAD WKING /SAVE THE ADDRESS OF THE WHITE KING DCA CKING TAD (MAP-1 /SETUP ADDRESS OF WHITE PIECE MAP DCA GMAP TAD (MAP+23 /SETUP ADDRESS OF BLACK PIECE MAP DCA OMAP TAD (WPSW /SETUP CURRENT PSW ADDRESS DCA CPSW JMS I ZGNMV /GENERATE THE MOVES JMP I GNWMV /RETURN /SUBROUTINE TO GENERATE ALL MOVES FOR BLACK GNBMV, 0000 CMA CLA /SETUP THE PAWN DIRECTION CONSTANT DCA PONDIR JMS I ZMAPEC /MAP THE PIECES TAD [CIA /SETUP COLOR COMPLIMENTOR DCA COLR TAD BKING /SAVE THE ADDRESS OF THE BLACK KING DCA CKING TAD (7772 /SETUP FIRST RANK CONSTANT DCA FSTRNK TAD (MAP+23 /SETUP ADDRESS OF BLACK PIECE MAP DCA GMAP TAD (MAP-1 /SETUP ADDRESS OF WHITE PIECE MAP DCA OMAP TAD (BPSW /SETUP POSITION STATUS WORD ADDRESS DCA CPSW JMS I ZGNMV /GENERATE THE MOVES JMP I GNBMV /RETURN PAGE /SUBROUTINE TO TEST FOR WHITE ATTACKS /CALL WITH ADDRESS OF THE SQUARE TO BE TESTED IN AC TSTWAT, 0000 DCA TEMP TAD [CIA DCA COLR CLA CMA DCA PONDIR TAD (MAP-1 /ADDRESS-1 OF MAP OF ATTACKING PIECES DCA OMAP JMS CHKATK /DO THE TEST JMP I TSTWAT /RETURN /SUBROUTINE TO TEST FOR BLACK ATTACKS ON ANY SQUARE /CALL WITH THE ADDRESS OF THE SQUARE TO BE TESTED IN AC TSTBAT, 0000 DCA TEMP /STORE ADDRESS OF SQUARE TO BE TESTED TAD (NOP DCA COLR CLA IAC DCA PONDIR TAD (MAP+23 /ADDRESS-1 OF THE BLACK PIECE MAP DCA OMAP JMS CHKATK /DO THE TEST JMP I TSTBAT /RETURN /SUBROUTINE TO MAKE A MOVE. CALLED WITH MSW IN LOCATION 'TOMAK1' /AND MDW IN LOCATION 'TOMAK2' MKMV, 0000 CLA CLL ISZ DOMAP /SET SWITCH INDICATING THAT A PIECE MAP IS NESSECARY IFNZRO DEBUG< JMS TSTBRD /TEST BOARD > TAD TOMAK1 PUSH1 /SAVE THE MSW TAD TOMAK1 /GET THE MSW JMS I ZSPLIT /SPLIT THE MSW UP INTO A 'TO' AND A 'FROM' ADDRESSES TAD TOMAK2 /MDW TO AC SMA CLA /IS THE MOVE A CAPTURE? JMP MKMV1 /NO. TAD I TEMP1 /YES. SAVE ITS VALUE IN PUSH1 /THE PUSH DOWN LIST TAD I TEMP1 /GET VAL OF CAPTURED PIECE CIA /SUBTRACT IT FROM THE TAD PW /TOTAL VALUE OF THE BOARD DCA PW MKMV1, TAD I TEMP2 /NOW PHYSICALY MOVE THE PIECE DCA I TEMP1 /ONTO ITS NEW SQUARE DCA I TEMP2 /REMOVE THE PIECE FROM ITS OLD SQUARE TAD WPSW /SAVE WHITES POSITION STATUS WORD PUSH1 TAD BPSW /SAVE BLACKS POSITION STATUS WORD PUSH1 TAD LSTMV PUSH1 /SAVE THE 'LSTMV' INFORMATION TAD TOMAK2 /INSTALL NEW INFORMATION ON THE LAST(THIS) MOVE MADE DCA LSTMV TAD TOMAK2 AND [0007 SNA /IS THIS ONE OF THE SPECIAL TYPES OF MOVES? JMP MKMVDN /NO. ALL DONE SO RETURN TAD (JMP .+2 /YES. BUILD A 'JMP' TO THE PROPER SPECIAL CASE HANDLER DCA .+1 HLT /PUT THE JUMP HERE /A JMP TO ONE OF THE FOLLOWING 7 INSTRUCTIONS WAS EXECUTED /BY THE PREVIOUS INSTRUCTION JMP MKQSC /MAKE A QUEEN SIDE CASTLING MOVE JMP MKKSC /MAKE A KING SIDE CASTLING MOVE JMP MKEP /EN PASANT TAD (KNIGHT-BISHOP /PROMOTING TO A KNIGHT TAD (BISHOP-ROOK /PROMOTING TO A BISHOP TAD (ROOK-QUEEN /PROMOTING TO A ROOK TAD (QUEEN /PROMOTE TO A QUEEN DCA TEMP3 /STORE ABS VALUE OF THE PROM PIECE TAD I TEMP1 /GET THE VALUE OF THE PROMOTEING PAWN CIA /SUBTRACT IT FROM THE TAD PW /TOTAL VALUE OF THE BOARD DCA PW TAD I TEMP1 /GET THE VAL OF THE MOVING PAWN RAL /LOAD THE SIGN INTO THE LINK CLA TAD TEMP3 /GET ABS VALUE OF PROM PIECE SZL /WAS THE PROMOTING PAWN BLACK? CIA /YES. MAKE THE PROMOTION PIECE BLACK ALSO DCA I TEMP1 /PLACE THE NEW PIECE ON THE BOARD TAD I TEMP1 /ADD THE VALUE OF THE NEW PIECE TAD PW /IN WITH THE TOTAL VALUE DCA PW JMP MKMVDN MKQSC, TAD TEMP1 /IT'S QUEENS SIDE CASTLING AND [7770 DCA TEMP2 /STORE THE ADDR OF QUEENS ROOK BEFORE CASTLING TAD TEMP2 TAD (3 DCA TEMP1 /STORE ADDRESS OF ROOKS NEW SQUARE MKCA1, TAD I TEMP2 /LOAD AC WITH VALUE OF THE ROOK DCA I TEMP1 /PUT THE ROOK DOWN ON ITS NEW SQR DCA I TEMP2 /REMOVE THE ROOK FROM ITS OLD SQR TAD I TEMP1 /GET COLOR OF CASTLING SIDE SPA /IS IT BLACK? ISZ BPSW /YES. SET BIT 11 OF HIS PSW SMA CLA /OR IS IT WHITE? ISZ WPSW /YES. SET BIT 11 OF HIS PSW JMP MKMVDN MKKSC, TAD TEMP1 /BUILD ADDRESS OF THE IAC /KINGS ROOK DCA TEMP2 /STORE THE ADDR OF KINGS ROOK BEFORE CASTLING TAD (-5 /BUILD THE ADDRESS OF THE ROOKS JMP MKCA1-3 /NEW SQUARE MKEP, TAD TEMP2 /IT'S AN 'EN PASSANT' CAPTURE AND [7770 /BUILD ADDRESS OF THE PAWN THAT WAS TAKEN DCA TEMP3 TAD TEMP1 AND [0007 TAD TEMP3 DCA TEMP3 TAD I TEMP3 /SUBTRACT THE PAWNS VALUE CIA /FROM THE TOTAL TAD PW DCA PW DCA I TEMP3 /REMOVE CAPTURED PAWN FROM THE BOARD MKMVDN, IFNZRO DEBUG < JMS TSTBRD /TEST BOARD VALUE > TAD WHOSE /NOW THAT THE MOVE IS MADE CMA /COMPLIMENT DCA WHOSE /THE "WHOSE MOVE" SWITCH JMP I MKMV /AND RETURN PAGE /SUBROUTINE TO UNMAKE A MOVE MADE BY THE 'MKMV' ROUTINE /LIKE THE 'MKMV' SUBROUTINE 'UNMV' IS COLOR INDEPENDENT- USES NO 'CLRFIX' UNMV, 0000 CLA CLL ISZ DOMAP /SET SWITCH FOR OBSOLETE PIECE MAP IFNZRO DEBUG< JMS TSTBRD /MAKE SURE BOARD VALUE IS OK > TAD LSTMV /GET THE MDW FOR THE LAST(THIS) MOVE MADE DCA TOMAK2 POP1 /GET THE OLD 'LSTMV' INFO DCA LSTMV /RESTORE IT POP1 /RESTORE BLACKS PSW DCA BPSW POP1 /RESTORE WHITES PSW DCA WPSW TAD TOMAK2 /GET THE MDW FOR THE MOVE SPA CLA /IS IT A CAPTURE? POP1 /YES. GET THE VALUE OF THE CAPTURED PIECE DCA TEMP3 /STORE IT POP1 /GET THE OLD MSW DCA TOMAK1 /STORE THE MSW TAD TOMAK1 /BACK AGAIN JMS I ZSPLIT /UNPACK THE MSW AND BUILD THE 'TO' AND 'FROM' ADDRESSES TAD I TEMP1 /GET THE MOVED PIECE AND IFNZRO DEBUG< SNA /IS IT STILL THERE? HLT /BUG!!! > DCA I TEMP2 /PUT IT BACK ON ITS OLD SQUARE TAD TEMP3 DCA I TEMP1 /RESTORE THE VALUE OF THE CAPTURED PIECE(OR EMPTY SQUARE) TAD TEMP3 /ADD VAL OF CAPTURED PIECE TAD PW /BACK IN WITH THE TOTAL DCA PW TAD TOMAK2 AND [0007 SNA /WAS THE MOVE A SPECIAL TYPE? JMP UNMVDN /NO. RETURN TAD (JMP .+2 DCA .+1 HLT /THE JUMP GOES HERE /A JUMP TO ONE OF THE FOLLOWING 7 LOCATIONS WAS /EXECUTED BY THE PREVIOUS INSTRUCTION JMP UNQSC /UNMAKE A QUEEN SIDE CASTLING MOVE JMP UNKSC /UNMAKE KING SIDE CASTLING MOVE JMP UNEP /UNMAKE AN EN PASSANT CAPTURE JMP UNQP JMP UNQP JMP UNQP UNQP, TAD I TEMP2 /PAWN PROM. MOVE CIA /SUBTRACT PROMOTION VALUE TAD PW /FROM THE TOTAL DCA PW TAD I TEMP2 /GET VALUE OF THE PROMOTION PIECE SMA CLA /WHICH COLOR IS MOVING? TAD (PAWN+PAWN /WHITE IS MOVING. TAD [-PAWN DCA I TEMP2 /RESTORE THE PROMOTION PIECE BACK TO A PAWN TAD I TEMP2 /ADD THE VAL OF THE PAWN TAD PW /IN WITH THE TOTAL VALUE DCA PW JMP UNMVDN UNKSC, TAD TEMP2 /BUILD ADDR OF ROOKS 'POST CASTLING' SQUARE IAC /BY ADDING +1 TO THE KINGS 'PRE CASTLING' SQUARE ADDRESS DCA TEMP2 /STORE IT UNKS1, TAD TEMP2 /BUILD ADDRESS OF THE ROOKS 'PRE CASTLING' SQUARE ADDR TAD (2 /BY ADDING +2 TO ITS 'POST-CASTLING' SQUARE ADDR DCA TEMP1 /STORE ROOKS PRE CASTLING SQUARE ADDRESS TAD I TEMP2 /GET THE ROOKS VALUE DCA I TEMP1 /PLACE THE ROOK BACK ON ITS 'PRE CASTLING' SQUARE DCA I TEMP2 /REMOVE IT FROM ITS 'POST CASTLING SQUARE' JMP UNMVDN UNQSC, TAD TEMP1 /BUILD THE ADDR OF THE ROOKS 'POST CASTLING SQUARE IAC /BY ADDING +1 TO THE KINGS 'POST CASTLING' SQUARE ADDRESS DCA TEMP2 /STORE IT TAD (-5 /BUILD THE ADDRESS OF THE ROOKS 'PRE CASTLING SQUARE' JMP UNKS1 /SAME AS KING SIDE EXCEPT OVER 5 FILES UNEP, TAD TEMP1 /BUILD THE ADDRESS OF THE CAPTURED PAWN AND [0007 /TAKE THE FILE OF THE 'TO SQUARE' DCA TEMP3 /STORE THE TO SQUARE' FILE # TAD TEMP2 /AND EVERYTHING BUT THE FILE # AND [7770 /FROM THE FROM SQUARE ADDRESS TAD TEMP3 /ADD THEN TOGEATHER DCA TEMP3 /STORE TAD I TEMP2 /GET THE VALUE OF THE CAAPTURING PAWN CIA /MAKE THE VALUE THAT OF AN OPOSITE COLORED PAWN DCA I TEMP3 /REPLACE THE PAWN THAT WAS TAKEN 'EN PASSANT' TAD I TEMP3 /ADD PAWNS VALUE TAD PW /IN WITH THE TOTAL DCA PW UNMVDN, IFNZRO DEBUG < JMS TSTBRD /VERIFY BOARD VALUE > TAD WHOSE /NOW THAT THE MOVE IS UNMADE CMA /COMPLIMENT DCA WHOSE /THE "WHOSE MOVE" SWITCH JMP I UNMV /RETURN /SUBROUTINE TO SPLIT A MSW UP LEAVING THE ADDRESS /OF THE 'TO' SQUARE IN LOC 'TEMP1' AND THE ADDRESS OF THE 'FROM' /SQUARE IN LOC. 'TEMP2'. CALL WITH MSW IN AC SPLIT, 0000 DCA TEMP1 TAD TEMP1 /FIRST BUILD THE 'FROM' SQUARE ADDRESS RTR CLL RTR RTR AND [0077 /MASK OUT THE GARBAGE IN BITS 0-5 TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT DCA TEMP2 /STORE 'FROM' SQUARE ADDRESS TAD TEMP1 /NOW FOR THE 'TO' SQUARE. AND [0077 /MASK OUT BITS 0-5 TAD [BOARD /ADD IN BOARD ADDRESS CONSTANT DCA TEMP1 /STORE THE ADDRESS OF THE 'TO' SQUARE JMP I SPLIT /RETURN /SUBROUTINE TO RETURN THE PLY#-1 IN THE AC. /IF THE PLY # IS 8 OR GREATER, 7 IS RETURNED, AND THE LINK IS SET /IF PLY # <8 THE LINK IS RETURNED CLEAR PLYCHP, 0000 CLA STL TAD PLY /GET PLY # TAD [7770 /SUBTRACT 8 SMA /IS PLY # 8 OR GREATER ? CLA /YES. PRETEND IT WAS 8 TAD [0007 /RESTORE AC VALUE TO PLY#-1 JMP I PLYCHP /RETURN IFNZRO DEBUG < /SUBROUTINE TO GET AN OLD BOARD VALUE FROM PDL#1 AND COMPARE IT WITH THE CURRENT /BOARD VALUE. TO VERIFY THE "MKMV" AND "UNMV" SUBROUTINES TSTBRD, 0000 CLA TAD PW DCA TEMP1 JMS BRDVAL /GET CURRENT BOARD VALUE CIA TAD TEMP1 SZA CLA /ARE THEY THE SAME? HLT /NO. ERROR SOMEWHERE JMP I TSTBRD /ALL IS WELL > PAGE /SUBROUTINE TO COMPARE THE AC WITH LOCATION 'COMP' /RETURN NORMALY IF THEY ARE EQUAL /RETURN TO THE ADDRESS+2 OF THE JMS IF THE AC IS LARGER /RETURN TO THE ADDRESS+3 OF THE JMS IF 'COMP' IS LARGER COMPAR, 0000 CIA DCA COMPAC /STORE THE COMPLIMENT OF THE AC TAD COMPAC /COMPARE THE AC WITH 'COMP' TAD COMP SNA CLA /ARE THEY EQUAL? JMP I COMPAR /YES. RETURN NORMALY TAD COMPAC /NO. GET COMPLIMENT OF THE AC AGAIN SPA SNA CLA /WAS THE AC POSITIVE? JMP XXAP /YES. AC WAS POSITIVE TAD COMP /NEGATIVE SMA /IS 'COMP' POSITIVE? JMP XXCL /YES. 'COMP' IS LARGER ALSO TAD COMPAC /NO. BOTH ARE NEGATIVE SPA CLA /BUT WHICH IS THE LARGER? JMP XXAL /THE AC IS THE LARGER JMP XXCL /'COMP' IS THE LARGER XXAP, TAD COMP /THE AC WAS POSITIVE SPA /TEST 'COMP' FOR ITS SIGN JMP XXAL /'COMP' IS NEGATIVE, AND THEREFORE LARGER TAD COMPAC SMA CLA XXCL, ISZ COMPAR /'COMP' IS LARGER XXAL, ISZ COMPAR /AC IS LARGER CLA JMP I COMPAR /RETURN COMPAC, 0000 /SUBROUTINE TO TALLY UP THE VALUES OF ALL PIECES ON THE BOARD /STORE THE RESULT IN LOC "PW", AND IN THE AC ON RETURN BRDVAL, 0000 CLA TAD (-100 /INITIALIZE FOR 64 SQUARES DCA TEMP TAD (BOARD-1/ADDRESS-1 OF BOARD DCA ITMP1 /TO AUTO INDEX REG TAD I ITMP1 ISZ TEMP /DONE ALL SQUARES? JMP .-2 /NO DO ANNOTHER DCA PW /YES. STORE BOARD VALUE TAD PW /ALSO LOAD INTO AC JMP I BRDVAL /RETURN PRNCNT, 0000 EVAL, 0000 CLA IFNZRO RANVAL< TAD I RANDOM /INTRODUCE A RANDOM VARIATION INTO THIS EVALUATION AND (0001 /LET IT BE NO GREATER THAN +1 > DCA STRATG JMS BREV /DO A BACK RANK EVALUATION JMS COEV /DO A CENTER OCCUPATION EVALUATION JMS CASTEV /EVALUATE CASTLING STATUS TAD PW /ADD THE VALUE OF ALL PIECES ON THE BOARD TAD STRATG /ADD IN STRATEGICAL VALUE JMS LCLRFX /DO A COLOR FIX DCA STRATG /STORE JMS MOBGET /GET MOBILITY VALUE TAD STRATG /ADD IT IN WITH THE TOTAL DCA STRATG /STORE /UPCOMING IS A MINI ALPHA BETA PRUNER /SINCE THE "HIEP" PART OF THE EVALUATION IS TIME CONSUMING /AND IT ONLY SERVES TO MAKE THE EVALUATION RETURNED LESS /FAVORABLE FOR THE SIDE TO THAT JUST MOVED, IT IS BOTH /WISE AND PROFITABLE TO TRY SAVE TIME THIS WAY TAD STRATG JMS PLYFIX DCA COMP /LOAD SOFTWARE COMPARE REGISTER TAD UVAL1 JMS PLYFIX JMS COMPARE/COMPARE VALUES JMP EVAL2 /THEY ARE EQUAL. PRUNE JMP EVAL1 /"HIEP" EVALUATION IS NESSECARY JMP EVAL2 /NO "HIEP" NESSECARY(GOOD) EVAL1, JMS HIEP /GET THE CONTROVERSIAL VALUE JMS LCLRFX TAD STRATG JMP I EVAL /RETURN EVAL2, IFNZRO LPTREE< TAD ("_ /SIGNAL THAT A MINI-PRUNE WAS DONE JMS I ZOUT > TAD STRATG /GET VALUE JMP I EVAL /RETURN /SUBROUTINE TO GET THE MOBILITY VALUE FOR THIS POINT IN /THE ANALYSIS /RETURN WITH VALUE IN THE AC MOBGET, 0000 CLA TAD MOB0 SZA CLA /DO SE HAVE ANY RELIABLE INFORMATION AT HAND ALREADY? JMP MOBGE1 /YES. USE IT ISZ BOGUS /NO. GET SOME NOW TAD GNCNT /SAVE COUNTERS WE ARE ABOUT TO MODIFY PUSH1 TAD MOBMOD PUSH1 JMS GNBMV /DO A PSEUDO MOVE GENERATION TAD MOBMOD /GET MOBILITY VALUE FOR BLACK DCA MOBGTM /SAVE FOR THE MOMENT ISZ BOGUS JMS GNWMV /DO ANOTHER PSUEDO MOVE GENERATION TAD MOBGTM /SUBTRACT BLACKS MOBILITY VALUE CIA TAD MOBMOD /FROM WHITES JMS LCLRFX DCA MOBGTM /STORE VALUE FOR THE MOMENT POP1 /RESTORE THE COUNTERS THAT WE DESTROYED DCA MOBMOD POP1 DCA GNCNT TAD MOBGTM /GET VALUE BACK AGAIN JMP I MOBGET /RETURN MOBGE1, TAD MOBMOD /GET MOBILITY VALUE FOR THIS LEVEL SNA /IS THERE ONE FOR THIS LEVEL? TAD MOB0 /NO. USE THE ONE FOR 2 PLYS BACK CIA TAD MOB1 CIA JMS PLYFIX JMP I MOBGET /RETURN MOBGTM, 0000 PAGE /THIS IS THE RECURSIVE LOOKAHEAD SUBROUTINE /SEARCHES THE GAME TREE "DEPTH" PLYS DEEP. LOACTION "PLY" /HOLDS THE CURRENT RECURSION LEVEL, OR DEPTH LEVEL OF THE SEARCH /AND MUST BE SET TO = 0, BEFORE THIS ROUTINE IS CALLED FOR THE FIRST TIME /SETTING "CVAL1" TO -3777 BEFORE CALLING THIS ROUTINE FOR THE FIRST TIME /IS ALSO NICE, TO PREVENT ALPHA-BETA PRUNING AT LEVEL #1 /THIS ROUTINE ASSUMES THAT THE COMPUTER HAS WHITE, BUT THE "LCLRFX" SUBROUTINE /ALLOWS THE COMPUTER TO PLAY BLACK, BY SETING LOCATION "LCLRFX"+1 TO EQUAL /A CIA INSTRUCTION LOOKA, 0000 CLA CLL TAD LOOKA /GET RETURN ADDRESS PUSH1 /SAVE IT IN PDL#1 ISZ PLY /INC PLY NUMBER CMA CLA /-1 TO AC TAD PLY SZA CLA /IS THIS THE FIRST PLY? JMP LOOKA1 /NO TAD WHOSE /YES. SETUP "LCLRFX" SMA CLA /WHICH COLOR ARE WE TO LOOK AHEAD ON BEHALF OF? TAD (NOP-CIA/WHITE TAD [CIA /BLACK DCA LCLRFX+1 DCA MOBMOD /INITIALIZE MOBILITY VALUES DCA MOB0 DCA MOB1 DCA ENO /SET EVALUATION COUNTER TO 0 LOOKA1, TAD UVAL1 /SAVE THE OLD "UPPER LEVEL VALUE" PUSH1 /IN PDL#1 TAD CVAL1 /THE OLD "CURRENT LEVEL VALUE" DCA UVAL1 /BECOMES THE NEW "UPPER LEVEL VALUE" TAD PLYFIX+1 /SAVE PLY COMPENSATOR VALUE PUSH1 TAD GNCNT /SAVE GENERATION COUNTER PUSH1 /IN PDL#1 TAD STRATG /SAVE STRATEGIC VALUE PUSH1 DCA GNCNT /CLEAR OUT GENERATION COUNTER, IN CASE NO MOVES ARE GENERATED TAD MOB0 /SAVE MOBILITY OF THE LEVEL 2 ABOVE THIS ONE PUSH1 TAD MOB1 /BUMP ALL THE LEVELS BY 1 DCA MOB0 TAD MOBMOD DCA MOB1 DCA MOBMOD /!!!BUG OF AUG 13 FIXED!!!/ IFNZRO DEBUG < TAD PDLADR /PUSH A MARKER SO THAT PDL#2 CAN BE VERIFIED PUSH1 TAD PC01 /PUSH A MARKER SO THAT PDL#1 CAN BE PUSH1 /VERIFIED TO BE IN LINE > TAD PLY /BUILD A NEW PLY COMPENSATOR. FIRST GET PLY # RAR /EVEN/ODD BIT TO LINK SZL CLA /IS PLY # EVEN ? TAD (NOP-CIA/NO. BUILD A NOP INSTRUCTION TAD [CIA DCA PLYFIX+1 TAD PLY /PLY # TO AC CIA /COMPARE AGAINST TAD DEPTH /THE MAXIMUM DEPTH SPA CLA /DOES CURRENT PLY# EXCCEDE THE MAX DEPTH #? JMP LEVAL /YES. DO A STATIC EVALUATION OF THE POSITION LKFUR, TAD (-3777 /NO. BUILD A STARTING VALUE FOR THIS LEVEL JMS PLYFIX DCA CVAL1 /INITIALIZE VALUE FOR THIS LEVEL JMS GNMVSM /GENERATE THE MOVES OF THE SIDE WHOSE MOVE IT IS TAD CMSW /GIT CHECKMATE SWITCH SZA CLA /IS SIDE TO MOVE IN CHECKMATE? JMP LKCM /YES. DO SOMTHING TAD SMSW /GET STALEMATE SWITCH SZA CLA /IS THE SIDE TO MOVE IN STALEMATE? JMP LKSM /YES. DO SOMTHING JMS PRUNE /ONLY CONSIDER "GOOD" MOVES PICK, POP2 /POP A MOVE OUT OF PDL2 DCA TOMAK2 /STORE THE MDW POP2 SNA /IS IT A MOVE OR THE END OF THE LIST? JMP LKAD /ITS THE END OF THE LIST. DCA TOMAK1 /ITS A MOVE--STORE THE MSW IFNZRO LPTREE < TAD TOMAK1 DCA IOMSW TAD TOMAK2 DCA IOMDW JMS OUTMV /PRINT OUT THE MOVE JMS SPACE /ALSO A SPACE SO THAT THE NEXT TAB STOP IS REACHED > JMS I ZMKMV /MAKE THE MOVE JMS I ZLOOKA /PEER FURTHER INTO THE MURKY DEPTHS OF THE GAME TREE IFNZRO LPTREE< JMS I ZCRLF /PRINT A CARRIAGE RETURN > JMS I ZUNMV /UNMAKE THE MOVE JMP COMPMV /GO DO A COMPARE /SUBROUTINE TO POP OUT A GROUP OF MOVES FROM PDP#2 POPOUT, 0000 CLA POP2 /OUT MDW POP2 /OUT MSW SZA CLA /IS IT AN MSW OR IS IT THE END OF THE MOVES MARKER? JMP .-3 /IST AN MSW. GO POP OUT ANOTHER MOVE JMP I POPOUT /END. RETURN /SUBROUTINE TO GENERATE THE MOVES OF THE SIDE WHOSE TURN IT IS TO MOVE /AS INDICATED BY THE "WHOSE" SWITCH /RETURN WITH THE MOVES IN PDL#2, AND THE AC CLEARED GNMVSM, 0000 CLA TAD WHOSE /GET "WHOSE MOVE" SWITCH SMA CLA /IS IT WHITES MOVE? JMS GNWMV /YES. GENERATE WHITES MOVES TAD WHOSE SPA CLA /OR IS IT BLACKS MOVE? JMS GNBMV /YES. GENERATE BLACKS MOVES JMP I GNMVSM /RETURN PAGE COMPMV, CLA IFNZRO LPTREE < JMS TABPLY /TAB TO COLOMN "PLY" TAD RVAL1 JMS OCTOUT TAD CVAL1 JMS OCTOUT /PRINT THE VALUE TO BEAT > TAD RVAL1 /GET VALUE RETURNED JMS PLYFIX /FIX W/RESPECT TO PLY NUMBER DCA COMP /LOAD SOFTWARE COMPARE REGISTER WITH IT TAD CVAL1 /GET CURRENT VALUE FOR THIS LEVEL JMS PLYFIX /FIX W/RESPECT TO PLY # JMS COMPAR /COMPARE IT WITH THE RETURNED VALUE NOW IN COMPARE REGISTER JMP JMPICK /THEY ARE EQUAL: JMP JMPICK /UNFAVORABLE COMPARE: GO ON TO NEXT MOVE RPLACE, TAD RVAL1 /HAIL NEW "BEST MOVE VALUE" DCA CVAL1 /STORE NEW "BEST MOVE VALUE" IFNZRO LPTREE < TAD ("* JMS I ZOUT /THE RETURN MOVE WON INDICATION > JMS SETPNT TAD TOMAK1 /MSW DCA I XR0 /INTO "BEST MOVE" TABLE TAD TOMAK2 /MDW DCA I XR0 /INTO THE "BEST MOVE" TABLE /COMING UP IS THE "ALPHA BETA PRUNER" /IT CHECKS IF THE NEW "BEST VALUE" FOR THIS LEVEL /IS COMPETITIVE WITH THE "BEST VALUE" ON THE LEVEL ABOVE ALPHAB, CLA TAD CVAL1 /GET CURRENT LEVEL VALUE JMS PLYFIX /COMPLIMENT IF THIS IS AN EVEN PLY DCA COMP /LOAD COMPARE REGISTER WITH IT TAD UVAL1 /GET THE VALUE OF THE LEVEL ABOVE JMS PLYFIX JMS COMPAR /COMPARE WITH THE CURRENT LEVEL VALUE IN THE COMPARE REGISTER JMP ALPHAP /EQUAL MEANS PRUNE JMP JMPICK /SORRY. THE VALUE WOULD STILL BE COMPETITIVE ON THE LEVEL ABOVE ALPHAP, JMS POPOUT /REMOVE ALL OTHER MOVES ON THIS LEVEL TAD PLY /FOR DEBUG CLA CLL IFNZRO LPTREE< TAD ("! JMS I ZOUT /PRINT INDICATION FOR PRUNE > JMP LKAD /YES. GO SET RETURN VALUE JMPICK, IFNZRO LPTREE < JMS I ZCRLF /CARRIAGE RETURN JMS TABPLY /TAD TO COLOMN # "PLY" > CLA JMP PICK SAVBRD, ROOK KNIGHT BISHOP QUEEN KING BISHOP KNIGHT ROOK PAWN PAWN PAWN PAWN PAWN PAWN PAWN PAWN BESTBL, ZBLOCK 30 /TABLE TO HOLD THE LAST "BEST MOVE" ON ANY LEVEL /SUBROUTINE TO SET AUTO-INDEX REG "XRO0" TO POINT TO /THE WORD BEFORE THE 2WORD ENTRY IN THE "BESTBL" COROSPONDING WITH THIS PLY SETPNT, 0000 CLA TAD PLY /GET PLY # CLL RAL /MULT TIMES 2 WORDS IN EACH ENTRY TAD ADCON /ADD IN ADDRESS CONSTANT DCA XR0 /STORE ADDR AS ADVERTISED JMP I SETPNT /RETURN ADCON, BESTBL-3 -PAWN -PAWN -PAWN -PAWN -PAWN -PAWN -PAWN -PAWN -ROOK -KNIGHT -BISHOP -QUEEN -KING -BISHOP -KNIGHT -ROOK PAGE LKAD, CLA /FINISHED GENERATING & EXPLORING MOVES ON THIS LEVEL TAD CVAL1 /SET RETURN VALUE = THIS LEVELS VALUE DCA RVAL1 JMP DONE /PREPARE TO RETURN LKSM, CLA /ITS A STALEMATE! IFNZRO LPTREE< TAD ("= JMS I ZOUT /PRINTOUT STALEMATE INDICATION > DCA RVAL1 /SET RETURN VALUE TO TOTALY EVEN GAME ( 0 ) JMP LKXM /TAKE SAME RETURN PATH AS A CHECKMATE NOW /COME HERE TO RETURN FROM THE "LOOKA" SUBROUTINE DONE, CLA CMA /-1 TO AC TAD PLY /DECREMENT PLY # DCA PLY TAD UVAL1 /RESTORE VARIOUS DATA TO ITS STATE BEFORE CALLING DCA CVAL1 IFNZRO DEBUG < POP1 /POP OUT PDL#1 VERIFIER WORD CIA /SHOULD BE SAME ON EXIT AS WAS ON ENTRY TAD PC01 SZA /AFTER COMPLIMENTING, SHOULD BE 0. IS IT? HLT /NO. SURE GLAD I PUT THIS TEST IN! POP1 /DO THE SAME THING FOR PDL#2 CIA TAD PDLADR SZA /IS PDL#2 IN LINE? HLT /NO. AMOUNT OFF IS IN THE AC > TAD MOB1 DCA MOBMOD /RESTORE MOBMOD COUNTER TAD MOB0 DCA MOB1 POP1 DCA MOB0 POP1 DCA STRATG /RESTORE STRATEGIC VALUE POP1 DCA GNCNT /RESTORE OLD MOVE GENERATION COUNTER POP1 /POP OFF OLD PLY COMPENSATOR VALUE DCA PLYFIX+1 /RESTORE IT POP1 DCA UVAL1 /RESTORE "UPPER LEVEL VALUE" POP1 /POP OFF RETURN ADDRESS DCA TEMP /RESTORE IT JMP I TEMP /RETURN FROM "LOOKA" SUBROUTINE LKCM, CLA /ITS A CHECKMATE. IFNZRO LPTREE< TAD ("+ JMS I ZOUT /PRINT CHECKMATE INDICATION > TAD PLY /SUBTRACT PLY # FROM TAD (-3740 /VALUE FOR RETURN VALUE JMS PLYFIX /RETURN VALUE IS POSITIVE IF THIS IS AN EVEN PLY DCA RVAL1 LKXM, POP2 /POP THE 2 MARKER WORDS OFF OF PDL2 POP2 /THAT "GNMV" PUT THERE JMP DONE /READY TO RETURN /COLOR FIXING SUBROUTINE EXCLUSIVLY FOR THE "LOOKA" SUBROUTINE. /FIXES COLOR WITH RESPECT TO PLY EVEN/ODD PLYFIX, 0000 CIA /=NOP IF PLY IS ODD, OR TO = CIA IF PLY IS EVEN JMP I PLYFIX /RETURN /GENERAL PURPOSE COLOR FIXING ROUTINE /SET "LCLRFX"+1 ONLY ONCE A PROGRAM INITIALIZATION TIME. SET IT TO /EQUAL A "NOP" INSTRUCTION IF THE COMPUTER HAS WHITE, SET IT TO A /"CIA" INSTRUSTION IF THE COMPUTER HAS BLACK LCLRFX, 0000 NOP /COMPUTER HAS: WHITE="NOP", BLACK="CIA" JMP I LCLRFX /RETURN /STATIC EVALUATION ROUTINE LEVAL, CLA CLL JMS I ZMAPEC /MAP PIECES TAD WHOSE /GET "WHOSE MOVE SWITCH" SMA CLA /IS IT WHITES OR BLACKS? JMP .+4 /WHITES TAD BKING /BLACKS. GET BLACKS KING ADDRESS JMS TSTWAT /FIND OUT IF IT IS ATTACKED JMP .+3 TAD WKING /GET WHITES KINGS ADDRESS JMS TSTBAT /FIND OUT IF IT IS ATTACKED TAD PCNT /GET # OF ATTACKERS SZA CLA /IS THE KING IN CHECK? JMP LKFUR /YES. LOOK AHEAD 1 MORE MOVE IFNZRO LPTREE < TAD ("# JMS I ZOUT /PRINT EVALUATION INDICATOR ISZ ENO /INC EVALUATION # TAD ENO /FIND OUT IF IT IS OF SPECIAL INTREST CIA /BY TESTING TO SE IF IT IS THE SAME TAD ENOB /AS "ENOB" SNA CLA /IS IT? NOP /YES. A BREAKPOINT FOR ODT MAY BE PLACED HERE TAD ENO /PRINT OUT THE EVALUATION # JMS OCTNFM > JMS EVAL /GET AN EVALUATION DCA RVAL1 /SETUP RETURN VALUE JMP DONE /READY TO RETURN /SUBROUTINE TO PRUNE UNDESIRABLE MOVES OUT OF THE TREE BEFORE THEY CREATE /HUGE BRANCHES. WHAT TYPES OF MOVES ARE DESIRABLE AND UNDESIRABLE AT ANY GIVEN /PLY, IS DETERMINED BY THE TABLE AT LOCATION "PRNPRO" /THIS ROUTINE SHOULD SET "PRNCNT" TO THE NUMBER OF MOVES PRUNED PRUNE, 0000 CLA DCA PRNCNT /INIT PRUNED MOVE COUNTER TO 0 TAD GNCHEK /GET # OF CHECKS ON THE KING SZA /IS THE KING IN CHECK? JMP I PRUNE /NO. DONT PRUNE ANY MOVES JMS PLYCHP /GET PLY # TAD (JMP I .+3 /BUILD A JMP I TO THE PROPER PRUNE PROCEDURE DCA .+1 /PUT THE JMP I DOWN SO THAT IT MAY BE EXECUTED HLT /JMP GOES HERE PRNPRO, PPA /PRUNE PROCEDURE FOR PLY 1 PPB /PRUNE PROCEDURE FOR PLY 2 PPB /PRUNE PROCEDURE FOR PLY 3 PPB /PRUNE PROCEDURE FOR PLY 4 PPB /PRUNE PROCEDURE FOR PLY 5 PPB /PRUNE PROCEDURE FOR PLY 6 PPB /PRUNE PROCEDURE FOR PLY 7 PPB /PRUNE PROCEDURE FOR PLY 8 OR GREATER PPA, JMS BSTOP /COUNT ON A "PRE-ANALYSIS" PPZ, JMP I PRUNE /RETURN PPB, JMS HIEP /FIND OUT THE VALUE OF THE MOST FAVORABLE EN PRISE PIECE CAPTURE SNA CLA /DOES A FAVORABLE ONE EXIST? JMP .+4 /NO. COUNT ON THE ENTRY IN "BESTBL" JMS SETPNT /YES. SETUP POINTER FOR THE INSERTION TAD HIEPMS /OF THE EN PRISE PIECE CAPTURE MSW DCA I XR0 /INTO THE "BESTBL" JMS BSTOP /IF IT EXISTS, BSTOP WILL INSURE THAT IT IS LOOKED AT FIRST JMP I PRUNE /RETURN PAGE /SUBROUTINE TO SCAN THROUGH THE LAST BUNCH OF MOVES IN PDL#2 /IF A MOVE EXISTS, WHICH HAS THE SAME MSW AS THE LAST "BEST MOVE" /ON THIS PLY, THAT MOVE IS SWAPED WITH THE MOVE ON THE TOP OF THE LIST BSTOP, 0000 JMS SETPNT TAD I XR0 CIA DCA TEMP2 TAD GNCNT CIA TAD PRNCNT SNA /ANY MOVES TO RUMMAGE THRU? JMP I BSTOP /NO. RETURN DCA TEMP /SETUP COUNT TAD TEMP CLL RAL /MULT TIMES 2 WORDS PER MOVE TAD PDLADR DCA TEMP1 BSTOP1, TAD I TEMP1 /GET AN MSW IFNZRO DEBUG < SNA /DOES IT LOOK LIKE AN MSW HLT /NOT IF ITS 0 IT DOESNT > TAD TEMP2 SNA CLA /IS IT A MATCH? JMP BSTOP2 /YES!! GO SWAP IT WITH THE MOVE ON TOP ISZ TEMP1 /BUMP POINTER BY 2 TO POINT TO THE NEXT MSW ISZ TEMP1 ISZ TEMP /COMPARED AGAINST ALL MOVES? JMP BSTOP1 /NO. DO ANOTHER JMP I BSTOP /YES. RETURN BSTOP2, TAD PDLADR TAD (-2 DCA TEMP TAD I TEMP DCA I TEMP1 TAD TEMP2 CIA DCA I TEMP ISZ TEMP ISZ TEMP1 TAD I TEMP1 DCA XR0 TAD I TEMP DCA I TEMP1 TAD XR0 DCA I TEMP JMP I BSTOP /SUBROUTINE TO EVALUATE THE BACK RANK /TO FIND OUT WHAT'S NOT DEVELOPED, AND RETURN A VALUE FOR DEVELOPMENT BREV, 0000 CLA TAD (NOP DCA BREV2 /SETUP TO DO THE WHITE SIDE FIRST JMS BREV1 /DO AN EVALUATION CIA /NEGATE THE VALUE FOR WHITES SIDE TAD STRATG DCA STRATG TAD [CIA DCA BREV2 /SETUP TO DO THE BLACK SIDE TAD (70 /RANK 8 JMS BREV1 /DO THE BLACK EVALUATION TAD STRATG DCA STRATG JMP I BREV /RETURN WITH IT BREV1, 0000 TAD (BOARD-1/CONSTANT FOR BOARD ADDRESS DCA ITMP0 DCA TEMP2 /INIT MINOR PIECE COUNTER TAD [7770 /COUNT FOR 10 SQUARES ON THE BACK RANK DCA TEMP1 TAD I ITMP0 /GET THE PIECES VALUE BREV2, HLT /COMPLIMENT IT IF IT IS BLACK TAD (-KNIGHT SNA /IS IT A KNIGHT? ISZ TEMP2 /YES. INC MINOR PIECE COUNTER TAD (KNIGHT-BISHOP SNA CLA /IS IT A BISHOP? ISZ TEMP2 /YES. INC MINOR PIECE COUNTER ISZ TEMP1 /DONE ALL 8 SQUARES YET? JMP BREV2-1 /NO. GO BACK AND DO ANOTHER TAD TEMP2 /ADD IN # OF MINOR PIECES RAL CLL /MULT TIMES 2 RAL CLL /MULT TIMES 2 AGAIN (2*2=4) JMP I BREV1 /RETURN WITH RANK EVALUATION IN THE AC / /CENTER OCCUPATION EVALUATOR COEV, 0000 CLA TAD (-4 /SETUP COUNT FOR 4 CENTER SQUARES DCA TEMP1 TAD (TAD I COTB /SETUP TO ACCESS ADDRESSES OF THE 4 CENTER SQUARES DCA COEV1 COEV1, HLT /GET SQUARES VALUE SNA /IS IT OCCUPIED JMP COEV2 /NO. TEST TO SEE IF DONE SMA CLA /IS IT A WHITE PIECE? TAD (10 /VALUE WILL BE +4 TAD (-4 /OR -4 IF IT IS BLACK TAD STRATG /ADD TO THE CENTER OCCUPATION VALUE DCA STRATG COEV2, ISZ COEV1 /INC INSTRUCTION SO THAT IT REFFRENCES THE NEXT CENTER SQUARE ISZ TEMP1 /DONE ALL 4 SQUARES YET? JMP COEV1 /NO. DO ANOTHER TAD TEMP /YES. GET FINAL VALUE JMP I COEV /AND RETURN /ADDRESSES OF THE 4 CENTER SQUARES COTB, BOARD+33 BOARD+34 BOARD+43 BOARD+44 /CASTLING STATUS EVALUATOR CASTEV, 0000 CLA TAD WPSW RAR /MOVE "CASTLED BIT" INTO LINK SZL CLA /HAS WHITE CASTLED? TAD (10 /YES ADD TO STRATEGIC VALUE TAD STRATG DCA STRATG TAD BPSW RAR /MOVE "CASTLED BIT" TO THE LINK SZL CLA /HAS BLACK CASTLED YET? TAD [7770 /YES. SUBTRACT POINTS FROM THE STRATEGIC VALUE TAD STRATG DCA STRATG JMP I CASTEV /RETURN PAGE /SUBROUTINE TO TEST IF A PIECE IS EN PRISE /CALL WITH THE ADDRESS OF THE SQUARE TO BE TESTED IN THE AC /IF THE PIECE IS EN PRISE, RETURN WITH THE PREDICTED EXCHANGE /LOSS IN THE AC, IF NOT 0 IS RETURNED /THE ADDRESS OF THE SQUARE IS RETURNED IN "ENPRAD" /RETURN WITH ADDR OF ATTACKER IN "ENPSQR" /RETURN WITH ADDR OF THE LEAST VALUABLE DEFENDER IN "PSQR" /RETURN WITH THE # OF ATTACKERS IN "ENPCNT" /RETURN WITH THE # OF DEFENDERS IN "PCNT" ENPRIS, 0000 DCA ENPRAD /SAVE ADDR OF EN PRIS SQUARE JMS I ZMAPEC /MAKE SURE PIECE MAP IS UP TO DATE TAD I ENPRAD SNA /IS THERE A PIECE ON IT? JMP I ENPRIS /NO. IDIOT! CONSIDER YOURSELF SAVED SMA CLA /YES. IS IT WHITE OR BLACK? JMP ENPRWH /ITS WHITE TAD ENPRAD /BLACK. FIND OUT ABOUT WHITES ATTACKS JMS TSTWAT TAD PVAL DCA ENPVAL /SAVE VALUE OF SMALEST ATTACKER TAD PCNT SNA /ANY ATTACKERS? JMP I ENPRIS /NO.RETURN DCA ENPCNT /SAVE # OF ATTACKERS TAD PSQR DCA ENPSQR /SAVE ADDR OF LEAST VALUABLE ATTACKER TAD ENPRAD /FIND OUT ABOUT DEFENDERS NOW JMS TSTBAT JMP ENPR0 /ALL DONE SETTING UP. GO TO THE BUISINESS PART ENPRWH, TAD ENPRAD /FIND OUT ABOUT BLACK ATTACKS JMS TSTBAT TAD PVAL CIA DCA ENPVAL /SAVE VALUE OF LEAST VALUABLE ATTACKER TAD PSQR DCA ENPSQR /SAVE ADDR OF LEAST VALUABLE ATTACKER TAD PCNT SNA /ANY ATTACKERS? JMP I ENPRIS /NO. RETURN DCA ENPCNT /STORE # OF ATTACKERS TAD ENPRAD /FIND OUT ABOUT WHITES DEFENCE JMS TSTWAT TAD PVAL CIA /COMPLIMENT VALUE OF LEAST VALUABLE DEFENDER DCA PVAL ENPR0, TAD ENPCNT /GET # OF ATTACKERS CIA TAD PCNT /COMPARE WITH # OF DEFENDERS SMA CLA /MORE ATTACKERS THAN DEFENDERS? JMP ENPR1 /NO. TAD PCNT /# OF DEFENDERS CLL RAR SZA CLA /MORE THAN 1 DEFENDER? JMP ENPR1 /YES. TOO COMPLICATED TO PREDICT THE SWAP ALL THE WAY DOWN SNL CLA /NO. ARE THERE ANY DEFENDERS AT ALL? JMP ENPR2 /NO. ITS EN PRISE ALL RIGHT TAD I ENPRAD /YES. ITS EXACTLY 1 DEFENDER JMS CLRFIX TAD PVAL /ADD VALUE OF DEFENDER PLUS OBJECT TAD ENPVAL /COMPARE WITH THE ATTACKERS VALUE SMA CLA /IS ATTACKER SMALLER THAN DEFENDER PLUS OBJECT? JMP ENPR3 /NO. THE OBJECT IS NOT EN PRISE TAD PVAL /-D TAD ENPVAL /+A SPA SNA CLA /IS DEFENDER SMALLER THAN ATTACKER? JMP ENPR2 /NO. HE WONT CAPTURE BACK THEN TAD PVAL /YES TAD ENPVAL JMS CLRFIX ENPR2, TAD I ENPRAD CIA JMP I ENPRIS /RETURN ENPR1, CLA TAD I ENPRAD /COMPARE VALUE OF OBJECT JMS CLRFIX TAD ENPVAL /WITH THE VALUE OF THE ATTACKER SMA /IS THE ATTACKERS VALUE SMALLER? ENPR3, CLA /NO. PIECE IS NOT EN PRISE CIA JMS CLRFIX JMP I ENPRIS /RETURN ENPRAD, 0000 ENPVAL, 0000 ENPSQR, 0000 ENPCNT, 0000 IFNZRO DEBUG< /TEST OF THE "ENPRIS" ROUTINE TESTEP, JMS INPUT JMS I ZMAPEC TAD [BOARD DCA TSTTMP TAD (7700 DCA TSTCNT TEP2, TAD TSTTMP JMS ENPRIS SNA /IS IT EN PRIS? JMP TEP1 /NO JMS OCTOUT JMS SPACE TAD TSTTMP JMS OUTSQR JMS I ZCRLF TEP1, ISZ TSTTMP ISZ TSTCNT JMP TEP2 HLT JMP TESTEP TSTTMP, 0000 TSTCNT, 0000 > PAGE /SUBROUTINE TO RETURN THE EXCHANGE VALUE OF THE HIGHEST EN PRISE /PIECE THAT CAN BE TAKEN BY THE SIDE TO MOVE /ADDED IN WITH THE VALUE IS A 10 POINT "PENALTY" FOR EACH ADDITIONAL EN PRISE PIECE /THAT CAN BE TAKEN /THE VALUE IS RETURNED IN SUCH A WAY THAT IT CAN SIMPLY BE ADDED /TO THE EVALUATION /CALL WITH AC CLEAR TO USE NORMALY /THIS ROUTINE CALCULATES WHOSE MOVE IT IS BY EXAMINING LOCATION "WHOSE" HIEP, 0000 CLA TAD WHOSE SPA CLA /IS IT WHITES MOVE OR BLACKS? TAD (NOP-CIA /BLACKS - SET "HIEPX"=NOP TAD [CIA /WHITES - SET "HIEPX"=CIA DCA HIEPX /SEE DCA HIEPVL /INIT VALUE TO 0 DCA HIEPCN /INIT COUNT TO 0 JMS I ZMAPEC /MAKE SURE THE PIECE MAP IS UP TO DATE TAD (-12 JMS HIEPFX TAD (MAP+12 /BUILD THE ADDR OF THE PIECE MAP(WHICHEVER ONE IT IS) DCA HMAPAD HIEP1, CLA TAD I HMAPAD /GET PIECE ADDR ISZ HMAPAD /INC MAP ADDRESS POINTER SNA /DONE ALL PIECES YET? JMP HIEP2 /YES DCA HIEPTM /STORE ADDR FOR THE MOMENT TAD I HIEPTM /GET THE PIECES VALUE JMS HIEPFX TAD (-KING /COMPARE IT WITH THAT OF A KING SNA CLA /IS IT A KING? JMP HIEP1 /YES. KINGS CANT BE SWAPED ANYWAYS TAD HIEPTM /NO. GET THE PIECES ADDR JMS ENPRIS /FIND OUT IF IT IS ENPRIS SNA /IS IT? JMP HIEP1 /NO. TRY THE NEXT ONE DCA HIEPTM /YES. SAVE THE EXCHANGE VALUE ISZ HIEPCN /INC EN PRIS PIECE COUNTER TAD HIEPVL /GET BEST VALUE SO FAR CIA TAD HIEPTM /COMPARE IT WITH THE ONE JUST AQUIRED JMS HIEPFX SMA CLA /IS THE ONE WE JUST GOT BIGGER? JMP HIEP1 /NO. GO TRY ANOTHER PIECE TAD HIEPTM /YES.MAKE THE ONE WE JUST GOT THE NEW VALUE TO BEAT DCA HIEPVL TAD ENPSQR /BUILD MSW FOR THE MOVE TO CAPTURE THIS EN PRISE PIECE AND [0077 /"FROM SQUARE" IS THAT OF THE RTL CLL /LEAST VALUABLE ATTACKER RTL RTL DCA HIEPTM TAD ENPRAD /"TO SQUARE" IS THAT OF THE PIECE ITSELF AND [0077 TAD HIEPTM /COMBINE "TO" AND "FROM" 6BIT ADDRESSES DCA HIEPMS /INTO ONE CONVIENIENT MSW JMP HIEP1 /GO TRY ANOTHER PIECE HIEP2, CLA CMA TAD HIEPCN /GET # OF EN PRISE PIECES SPA /WERE THERE ANY? CLA /NO CLL RTL RAL /MULT TIMES 8 AND INCLUDE IN THE VALUE RETURNED CIA JMS HIEPFX TAD HIEPVL /GET THE EXCHANGE VALUE JMP I HIEP /RETURN HIEPFX, 0000 HIEPX, HLT /NOP,BLACKS MOVE/CIA,WHITES MOVE JMP I HIEPFX HIEPVL, 0000 HIEPTM, 0000 HIEPCN, 0000 HIEPMS, 0000 HMAPAD, 0000 /SUBROUTINE TO SETUP THE BOARD SETBRD, 0000 CLA CLL TAD (-100 /IST PUT ALL OF THE PIECES ON THE BOARD DCA TEMP /SETUP A COUNT FOR 64 SQUARES TAD (BOARD-1 DCA ITMP0 /BOARD ADDRESS TO AUTO INDEX REG TAD (SAVBRD-1 DCA ITMP1 /SAVED BOARD ADDRESS TO AUTO-INDEX REG TAD I ITMP1 /MOVE FROM THE SAVED BOARD AREA DCA I ITMP0 /TO THE WORKING AREA ISZ TEMP /DONE 64 SQUARES YET? JMP .-3 /NO. DO MORE TAD (-40 /NOW CLEAR OUT THE MIDDLE DCA TEMP TAD (BOARD+17 DCA ITMP1 DCA I ITMP1 ISZ TEMP /CLEARED OUT 32 SQUARES YET? JMP .-2 /NO. DO 1 MORE DCA LSTMV DCA WPSW /ENABLE CASTLING BY WHITE DCA BPSW /AND BY BLACK DCA PW /INITIALIZE TOTAL PIECE VALUE JMP I SETBRD /RETURN COMTM, IAC /TOURNAMENT MODE SETTING IAC COMBM, IAC /BLITZ MODE SETTING DCA DEPTH /DEPTH=3 FOR TOURNAMENT MODE, DEPTH=1 FOR BLITZ MODE JMP COMMAN PAGE /THIS IS THE INTERRUPT HANDLING ROUTINE INTHAN, DCA ACHOLD /SAVE ACCUMULATOR RAL /LINK TO AC11 DCA LKHOLD /SAVE LINK KSF /KEYBOARD INTERRUPT? HLT /NO. UNEXPLANED INTERRUPT. PRESS START (CLEAR&CONT) TO CLEAR FLAGS KRB /YES. GET THE CHAR SNA /IS IT A NULL CHARACTER ? JMP RTINT /YES. IGNOR IT TOTALY AND (0177 /MAKE SURE BIT 4 IS SET IN TAD (200 /CASE OF A PARITY TTY DCA CHAR /NOW STORE THE CHAR. FOR EASY ACCESS TAD ISW /GET INPUT IN PROGRESS SWITCH SNA CLA /IS IT SET? JMP RTINT /NO. RETURN AND FORGET THAT THIS HAPPENED TAD CHAR /LOAD IT BACK INTO THE AC JMS I ZOUT /ECCO IT TAD CHAR /TEST IF IT IS TO BE IGNORED TAD (-240 SNA CLA /IS IT A SPACE ? JMP RTINT /YES. IGNOR IT ISZ CNTCHR /TOO MUCH INPUT? SKP /NO JMP UGO /YES. PRINT "^U", REINITIALIZE, AND TRY AGAIN TAD CHAR /LOAD THE CHAR BACK INTO THE AC AGAIN TAD (-215 /FIND OUT IF IT IS A SPECIAL CHARACTER (CR OR RUBOUT) SNA /IS IT A CR? JMP LINDUN /YES! HE'S DONE TYPING THE INPUT LINE TAD (215-377 SNA /IS IT A RUBOUT CHAR? JMP RUBGO /YES. DELETE THE LAST CHAR TYPED TAD (377-225 /NO SNA CLA /IS IT A CONTROL-U? JMP UGO /YES. DELETE A WHOLE LINE TAD CHAR /NO. IFNZRO OS8< TAD (-203 SNA CLA /IS CHAR A CONTROL-C ? JMP MONITR /YES TAD CHAR /NO. GET ITS VALUE BACK AGAIN > DCA I CLIST /STORE THE CHAR. IN THE KEYBOARD BUFFER RTINT, TAD LKHOLD /RESTORE THE LINK TO ITS PRE-INTERRUPT STATE CLL RAR TAD ACHOLD /RESTORE ACCUMULATOR RMF /AND THE MEMORY FIELDS ION /WITH INTERRUPT ENABLED, JMP I IFRM /RETURN TO MAIN PROGRAM ACHOLD, 0000 /HOLD AC AFTER INTERRUPT LKHOLD, 0000 /HOLD LINK AFTER INTERRUPT LINDUN, DCA I CLIST /MARK THE END OF INPUT WITH A 0000 CHAR. IN BUFFER TAD (KBUF-1 /REINITIALIZE THE KEYBOARD BUFFER DCA CLIST DCA ISW /CLEAR THE INPUT SWITCH JMS I ZCRLF /PRINT A CARRIAGE RETURN-LINE FEED JMP RTINT /RETURN LNOGO, JMS I ZCRLF /PRINT A CARRIAGE RETURN LINE FEED JMS I ZBEGIN /REINITIALIZE INPUT BUFFER JMP RTINT /RETURN FROM THE LAST INTERRUPT /IO STALL SUBROUTINE: RETURN WHEN INPUT IS DONE CHKIO, 0000 CLA TAD ISW /GET THE INPUT SWITCH ISZ RANDOM /INCREMENT THE RANDOM NUMBER SZA CLA /IS INPUT DONE? JMP .-4 /NO: CHECK AGAIN IOF /DONT NEED THIS ANYMORE JMP I CHKIO /YES: RETURN RUBGO, CLA TAD (KBUF-1 CIA TAD CLIST SNA CLA /ARE WE AT THE BEGINING OF A LINE ALLREADY? JMP LNOGO /YES. TAD ("\ /NO. PRINT A "\" CHAR JMS I ZOUT CMA CLA /NOW MOVE BACK THE BUFFER POINTER TAD CLIST DCA CLIST JMP RTINT /RETURN FROM INTERUPT UGO, CLA PRINTO; MESG21 /PRINT A "^U" JMP LNOGO /GO SETUP FOR A NEW LINE /FOLLOWING IS THE LEGAL COMMAND LIST /IT CONSISTS OF A NUMBER OF 2WORD ENTRIES /THE 1ST WORD IN EACH ENTRY IS THE 6BIT REPRESENTATION(NEGATED FOR EASY COMPARING) /OF A 2 CHARACTER COMMAND /THE 2ND WORD CONTAINS THE ADDRESS TO GO TO IF THAT COMMAND IS TYPED COMLST, -2027; COMPW /PW - PLAY WHITE -2002; COMPB /PB - PLAY BLACK -2016; COMPN /PN - PLAY NIETHER WHITE OR BLACK -0204; COMBD /BD - DISPLAY THE POSITION -1120; COMIP /IP - INPUT A POSITION -2205; START /RE - RESET (RESIGN) -1526; CMOVE /MV - MOVE -2313; COMSK /SK - SKIP A MOVE -0215; COMBM /BM - BLITZ MODE -2415; COMTM /TM - TOURNAMENT IFNZRO LPTREE < -1424; COMLT /LT - OUTPUT TREE TO LINE PRINTER(LP08) > -0000; 0000 /END OF COMMAND LIST MESG14, TEXT \STALEMATE\ MESG24, TEXT \YOUR MOVE? \ PAGE /MESSAGE PRINTING SUBROUTINE--CALL WITH ADDR OF MESSAGE IN AC /RETURN WITH THE AC CLEAR /IF CALLED WITH THE AC IS CLEAR THE ADDRESS OF THE MESSAGE IS TAKEN FROM THE WORD /AT THE ADDRESS+1 OF THE CALL TO THIS SUBROUTINE, AND THE RETURN ADDRESS /IS THE ADDRESS+2 OF THE CALLING JMS MES, 0000 SZA /IS THE ADDRESS OF THE MESSAGE IN THE AC? JMP .+3 /YES. DONT BOTHER GETTING IT FROM THE WORD FOLLOWING THE JMS TAD I MES /NO. BOTHER PLEASE ISZ MES /AND INC THE RETURN ADDRESS DCA TEMP /STORE THE ADDRESS OF THE MASSAGE MES2, TAD I TEMP /GRAB 2 CHARS. PACKED INTO 1 WORD RTR RTR RTR JMS TYPO /PRINT CHAR IN BITS 0-5 TAD I TEMP JMS TYPO /PRINT CHAR IN BITS 6-11 ISZ TEMP /NEXT WORD PLEASE JMP MES2 TYPO, 0000 AND [0077 /CLEAROUT BITS BELONGING TO THE OTHER CHAR. SNA /IS IT A NULL CHARACTER? JMP I MES /YES: RETURN TAD [-40 /NO. CONVERT IT TO 8 BIT SPA TAD (100 TAD (240 JMS I ZOUT /NOW PRINT IT JMP I TYPO /PRINTOUT SUBROUTINE--SINGLE CHARACTER OUT, 0000 TLS /FIRST PRINT THE CHAR TSF /WAIT FOR THE FLAG TO RETURN JMP .-1 /NOT YET IT HASN'T TCF /CLEAR FLAG TO AVOID TELLEPRINTER INTERUPTS CLA JMP I OUT /RETURN /CARRIAGE RETURN & LINE FEED SUBROUTINE CRLF, 0000 CLA TAD (215 JMS I ZOUT /PRINT THE CR JMS I ZOUT /AND A NULL TAD (212 JMS I ZOUT /PRINT THE LF JMS I ZOUT /PRINT A COUPLE OF NULL FILLER CHARS IN CASE SOMEONE JMS I ZOUT /TRYS TO USE A FANCY VIDEO-SCREEN TERMINAL JMP I CRLF /RETURN /INITIALIZE INPUT BEGIN, 0000 CLA IAC DCA ISW /SET THE 'INPUT IN PROGRESS' SWITCH TAD (KBUF-1 /INITIALIZE THE KEYBOARD BUFFER POINTER DCA CLIST TAD (-30 DCA CNTCHR /30 CHARACTERS MAXIMUM KCC /REINITIALZE THE KEYBOARD FLAG JMP I BEGIN /RETURN /GET A CHARACTER FROM THE INPUT BUFFER /IGNOR "-" AND ":" CHARACTERS GETC, 0000 CLA TAD I CLIST /TAKE A CHAR. OUT OF THE BUFFER DCA TEMP /MAKE IT EASILY REACHED TAD TEMP /FIND OUT IF THE CHAR SHOULD BE IGNORED TAD (-"- SNA /IS IT A MINUS SIGN? JMP GETC+1 /YES. IGNOR IT TAD ("--": /NO. TEST FOR A COLON SNA CLA /IS IT A COLON? JMP GETC+1 /YES. IGNOR IT TAD TEMP /NO. LOAD IT BACK INTO AC JMP I GETC /RETURN /SUBROUTINE TO PRINT A "SIGNED OCTAL" NUMBER OCTOUT, 0000 DCA TEMP JMS SPACE /PRINT A LEADING SPACE TAD TEMP SPA CLA /IS IT A NEGATIVE #? TAD ("--" /YES PRINT A MINUS SIGN TAD (" JMS I ZOUT TAD TEMP /GET # AGAIN SPA /IS IT NEGATIVE? CIA /YES. MAKE POSITIVE JMS OCTNFM /PRINT IN OCTAL JMP I OCTOUT /RETURN /SUBROUTINE TO PRINT OUT AN OCTAL NUMBER WITH NO FORMATING OCTNFM, 0000 RAL /ROTATE INTO POSITION DCA TEMP TAD (-4 DCA TEMP1 /SETUP COUNT FOR 4 DIGITS OCTMID, TAD TEMP RAL RTL DCA TEMP TAD TEMP AND [0007 TAD ("0 JMS I ZOUT ISZ TEMP1 JMP OCTMID JMP I OCTNFM /RETURN /SUBROUTINE TO PRINT A SPACE CHARACTER SPACE, 0000 CLA TAD (240 /LOAD AC WITH SPACE CODE JMS I ZOUT /SEND IT OUT JMP I SPACE /RETURN IFNZRO OS8 < /PRINT A "^C" AND RETURN TO THE OS8 MONITOR MONITR, CLA PRINTO; MESG18 /PRINT "^C" CIF CDF 0 /MONITOR IS IN FIELD 0 JMP I (7600 /GO TO MONITOR > IFNZRO LPTREE < /SUBROUTINE TO TAB OVER TO COLOMN # "PLY" TABPLY, 0000 CLA TAD PLY /GET PLY # SNA /IS IT ZERO? IAC /YES. DO ONE TAB ANYWAYS CIA DCA CMBCNT /SETUP COLOMN COUNTER PRINTO; MESG19 /PRINT 8 SPACES ISZ CMBCNT /TABBED ENOUGH PLACES YET? JMP .-3 /NO. TAB AGAIN JMP I TABPLY /YES. RETURN CMBCNT, 0000 > PAGE /SUBROUTINE TO TRY TO INTERPERT THE CONTENTS OF THE KEYBOARD /BUFFER AS A MOVE TYPED IN USING MODIFIED /ALGEBREIC NOTATION, TEST THE MOVES LEGALITY, AND MAKE THE /MOVE ON THE BOARD /IF INPUT IS NOT A LEGAL MOVE RETURN IS TO THE ADDRESS+1 /OF THE CALLING JMS AND THE AC MAY NOT BE CLEARED INMV, 0000 CLA DCA IOMSW /INITIALIZE MSW AND MDW DCA IOMDW JMS I ZGETC /GET A CHARACTER JMS ISA2H /IS IT A LETTER "A" TO "H" ? JMP INCA /NO. MOVE MUST BE CASTLING TAD (-301 RTL CLL RTL RTL JMS INPAK /STORE THIS CHAR AND GET NEXT JMS IS128 /IS IT A NUMBER "1" TO "8" ? JMP I INMV /NO: BAD INPUT, TAKE ERROR RETURN TAD (-261 RTR CLL /ROTATE BITS 9-11 INTO THE 'FROM RANK' POSITION RTR JMS INPAK /PACK IT INTO MSW AND GET NEXT CHAR JMS ISA2H /IS IT A LETTER "A" TO "H" ? JMP I INMV /NO. TAKE ERROR RETURN TAD (-301 JMS INPAK JMS IS128 /IS IT A NUMBER "1" TO "8" ? JMP I INMV /NO. TAKE ERROR RETURN TAD (-261 RTL CLL /YES. ROTATE BITS 9-11 INTO THE 'TO RANK' POSITION RAL JMS INPAK TAD (-"= SZA CLA /IS IT AN EQUAL SIGN? JMP INMID-1 /NO. INPUT FINISHED, CHECK FOR LEGALITY NOP /YES. HE SAYS IT'S A PAWN PROMOTION JMS I ZGETC /GET THE LETTER OF THE PROMOTION PIECE TAD (-"Q SNA /IS IT A QUEEN? JMP IPPQ /YES TAD ("Q-"R SNA /IS IT A ROOK? JMP IPPR /YES TAD ("R-"B SNA /IS IT A BISHOP? JMP IPPB /YES TAD ("B-"N SNA /IS IT A KNIGHT? JMP IPPN /YES JMP I INMV /NO. NONE OF THE ABOVE. TAKE ERROR RETURN IPPQ, IAC IPPR, IAC IPPB, IAC IPPN, TAD (0004 DCA IOMDW JMP INMID-1 INCA, TAD (-"O SZA CLA /COULD IT BE CASTLING? JMP I INMV /NO TAKE ERROR RETURN JMS I ZGETC /IT MUST BE CASTLING, GET NEXT CHAR TAD (-"O SZA CLA /IS IT AN "O" ? JMP I INMV /NO. TAKE ERROR RETURN TAD PONDIR /YES. THE MOVE IS CASTLING CALCULATE THE 8TH RANK AND (7070 /AND USE IT TO HELP BUILD AN MSW TAD (0406 /KING ALWAYS STARTS FROM FILE 4 DCA IOMSW JMS I ZGETC /GET ANOTHER CHAR TAD (-"O /ANOTHER "O" MEANS QUEEN SIDE CASTLING SZA /IS IT QUEENS SIDE? JMP INMID-1 /NO. INPUT DONE. CHECK FOR LEGALITY TAD (-4 /YES. CHANGE 'TO FILE' TO C TAD IOMSW DCA IOMSW JMS GNMVSM /GENERATE THE MOVES OF THE SIDE TO MOVE INMID, POP2 /POP OFF AN MDW DCA TOMAK2 /STORE IT POP2 /POP OFF AN MSW SNA /IS IT AN MSW OR THE END OF THE LIST? JMP I INMV /END OF LIST AND MOVE NOT FOUND, TAKE ERROR RETURN CIA TAD IOMSW /COMPARE THE MSW WITH THE ONE HE INPUTED SZA CLA /MATCH? JMP INMID /NO: TRY NEXT TAD IOMSW /YES DCA TOMAK1 /STORE THE MSW TAD IOMDW /GET THE INPUTED MDW SNA CLA /IS IT = 0 ? JMP INMID2 /YES. MOVE IS LEGAL TAD TOMAK2 AND [0007 /CLEAR IRRELEVENT BITS CIA TAD IOMDW SZA CLA /DO THE IMPORTANT PARTS OF THE MDW'S MATCH? JMP INMID /NO TRY NEXT MOVE FOR A MATCK INMID2, JMS I ZMKMV /MAKE THE MOVE IPDL1 /REINITIALIZE PUSH DOWN LIST #1 JMS POPOUT /REINITIALIZE PDL2 ISZ INMV /NORMAL RETURN IS TO THE ADDRESS+2 OF THE CALLING JMS JMP I INMV /RETURN /SUBROUTINE USED BY INMV. ADDS NEW COMPONENT TO 'IOMSW' /ALSO GETS NEXT CHAR FROM THE BUFFER, AND RETURN WITH ITS VALUE IN THE AC INPAK, 0000 TAD IOMSW DCA IOMSW JMS I ZGETC JMP I INPAK MESG18, TEXT \^C\ MESG15, TEXT \O-O-O\ NAME, TEXT \CHEKMO-II\ PAGE /SUBROUTINE TO OUTPUT A MOVE IN MODIFIED ALGEBREIC NOTATION /CALL WITH MSW IN 'IOMSW', AND MDW IN 'IOMDW' OUTMV, 0000 CLA TAD (" DCA IOCH1 TAD (" DCA IOCH2 TAD IOMDW AND [0007 /BUILD A JUMP TAD (JMP .+3 DCA .+1 HLT /A JUMP TO ONE OF THE NEXT 8 INSTRUCTIONS IS PLACED HERE JMP OUTSTD /STANDARD OUTPUT FOR NORMAL MOVES JMP OUTQCA /QUEEN-SIDE CASTLING JMP OUTKCA /KING-SIDE CASTLING JMP OUTSTD /STANDARD OUTPUT FOR 'EN PASSANT' CAPTURES TAD ("N-"B /PRIMOTE TO A KNIGHT TAD ("B-"R /PROMOTE TO A BISHOP TAD ("R-"Q /PROMOTE TO A ROOK TAD ("Q /PROMOTE TO A QUEEN DCA IOCH2 TAD ("= /PRINT AN EQUAL SIGN BEFORE LETTER OF THE PROMOTION PIECE DCA IOCH1 OUTSTD, CLA /DO STANDARD OUTPUT TAD IOMSW /GET THE MSW FOR THE MOVE TO BE OUTPUT RTR /ROTATE THE 'FROM FILE' BITS INTO AC 9-11 RTR RTR JMS OUTSQR /OUTPUT THE "FROM" SQUARE COORDINATES TAD IOMDW /TEST TO SEE IF MOVE IS A CAPTURE SPA CLA /IS IT? TAD (":-"- /YES: OUTPUT A ":" INSTEAD OF A "-" TAD ("- /LOAD AC WITH THE CODE FOR A DASH JMS I ZOUT /OUTPUT IT TAD IOMSW /GET MSW JMS OUTSQR /OUTPUT THE "TO" SQUARE COORDINATES TAD IOCH1 /THIS IS A SPACE UNLESS MOVE IS A PAWN PROMOTION JMS I ZOUT TAD IOCH2 /THIS IS A SPACE UNLESS MOVE IS A PAWN PROMOTION JMS I ZOUT /PRINT THE LAST CHARACTER AND, JMP I OUTMV /RETURN /SUBROUTINE TO OUTPUT THE COORDINATES OF A SQUARE /CALL WITH SQUARE # IN AC BITS 6-11 OUTSQR, 0000 DCA IOTMP /SAVE SQR # TAD IOTMP AND [0007 /CLEAR BITS 0-8 TAD (301 /OUTPUT FILE AS A CHARACTER "A" TO "H" JMS I ZOUT TAD IOTMP /GET MSW RTR /MOVE RANK INTO BITS 9-11 RAR AND [0007 TAD (261 /BUILD A CHARACTER "1" TO "8" JMS I ZOUT /OUTPUT IT JMP I OUTSQR /RETURN OUTKCA, IAC /PASS OVER THE FIRST "O-" OF THE QUEEN SIDE CASTLING MESSAGE OUTQCA, TAD (MESG15 /GET ADDRESS OF THE QUEEN SIDE CASTLING MESSAGE PRINTO /TYPE THE MESSAGE JMP I OUTMV /RETURN IOCH1, 0000 IOCH2, 0000 IOTMP, 0000 /SUBROUTINE TO CHECK FOR A CHARACTER FROM "1" TO "8". SKIP IF IT IS /CALL W/CHARACTER IN AC, RETURN SAME WAY IS128, 0000 TAD (-"1 SPA /GREATER OR EQUAL TO "1"? JMP .+4 /NO. DON'T SKIP TAD [7770 SPA CLA /LESS THAN "8"? ISZ IS128 /YES. INC RETURN ADDRESS CLA TAD TEMP /LOAD THE CHARACTER BACK INTO THE AC JMP I IS128 /RETURN /SUBROUTINE TO CHECK FOR A CHARACTER FROM "A" TO "H" /CALL W/CHARACTER IN AC, RETURN SAME /SUBROUTINE EFFECTS A SKIP IF CHAR IS BETWEEN "A" AND "H" ISA2H, 0000 TAD (-"A SPA /IS IT >= "A" ? JMP .+4 /NO. DONT SKIP TAD [7770 SPA CLA /IS IT <= "H" ? ISZ ISA2H /YES. INC RETURN ADDRESS CLA TAD TEMP /GET CHAR BACK JMP I ISA2H /RETURN /SUBROUTINE TO TEST FOR CHECKMATE OR STALEMATE QMATE, 0000 JMS GNMVSM /GENERATE THE MOVES OF THE SIDE WHOSE MOVE IT IS JMS POPOUT /DONT NEED THE MOVES JUST THE INFO ON THEM TAD GNCNT /GET # OF MOVES GENERATED SZA CLA /ANY? JMP I QMATE /YES. RETURN TAD CMSW /NO. GET CHECKMATE SWITCH SNA CLA /IS IT SET? TAD (-MESG9+MESG14 /NO. GET ADDR OF STALEMATE MESSAGE TAD (MESG9 /ADD ADDR OF CHECKMATE MESAGE PRINTO /PRINT THE MESSAGE OUT JMS I ZCRLF JMS DISPLA /PRINTOUT THE FINAL POSITION JMP START /START A NEW GAME IFNZRO LPTREE < COMLT, TAD LTSW CMA DCA LTSW JMP COMMAN > COMSK, TAD WHOSE /COMPLIMENT THE "WHOSE MOVE" SWITCH CMA /SO THAT SOMEONE MISSES A MOVE DCA WHOSE DCA LSTMV /DISABLE EN PASSANT PAWN CAPTURES FOR THE NEXT MOVE JMP COMMAN PAGE MESG19, TEXT \ \ MESG21, TEXT \^U\ IFNZRO LPTREE < /SUBROUTINE TO OUTPUT A CHARACTER TO THE LINE PRINTER /CALL WITH THE CHAR. IN THE AC, RETURN WITH THE AC CLEARED LPTOUT, 0000 SNA /TRYING TO PRINT A NULL CHAR ? JMP I LPTOUT /YES. DONT BOTHER, JUST RETURN DCA LPTMP /STORE THE CHAR JUST FOR A MOMENT TAD LTSW /GET TREE PRINTOUT SWITCH SNA CLA /IS IT SET? JMP I LPTOUT /NO. DO NO OUTPUT TO THE LINE PRINTER LAS /READ SWITCHES SMA CLA /SWITCH 0 SET? JMP I LPTOUT /NO. DO NOT OUTPUT TO LINE PRINTER TAD LPTMP /YES. PSKE /ERROR? SKP /NO. CONTINUE JMP .-2 /YES. WAIT FOR THE ERROR TO GO AWAY PSKF /IS THE PRINTER READY TO ACCEPT THE CHAR? JMP .-1 /NO. TEST AGAIN, AND AGAIN PCLF PSTB /YES. PRINT IT CLA /GET READY TO RETURN PCIE /CLEAR LINE PRINTER INTERUPT FLAG JMP I LPTOUT /RETURN LPTMP, 0000 /TEMP STORAGE FOR LINE PRINTER ROUTINE LTSW, 0000 /TREE PRINTOUT SWITCH > / CHESSBOARD PRINTER DISPLAY,0 JMS I ZCRLF /PRINT A BLANK LINE TAD (BOARD+70-1 DCA RNKPTR /POINT TO TOP RANK TAD [7770 DCA RNKKNT /SET UP FOR 8 RANKS RNKLUP, TAD RNKPTR DCA XR0 /POINT TO BEFORE LEFTMOST SQUARE IN RANK TAD [7770 DCA FILKNT /SET UP FOR 8 SQUARES PER RANK JMP RL1 RL2, TAD (240 JMS I ZOUT RL1, DCA COLOR /SET COLOR TO ZERO TAD I XR0 /GET PIECE SNA /IS SQUARE OCCUPIED? JMP EMPTY /NO SPA /YES ISZ COLOR /SET COLOR TO 1 IF BLACK PIECE SPA CIA /TAKE ABSOLUTE VALUE OF PIECE TAD [-PAWN SNA /IS IT A PAWN? JMP DP /YES TAD (PAWN-KNIGHT/NO SNA /IS IT A KNIGHT? JMP DN /YES TAD (KNIGHT-BISHOP/NO SNA /IS IT A BISHOP? JMP DB /YES TAD (BISHOP-ROOK/NO SNA /IS IT A ROOK? JMP DR /YES TAD (ROOK-QUEEN /NO SNA /IS IT HER MAJESTY? JMP DQ /YES TAD (QUEEN-KING /NO SNA CLA /IS IT HIS HIGHNESS? JMP DK /YES TAD ("?-"P /IT'S AN UNKNOWN PIECE DP, TAD ("P-"N DN, TAD ("N-"B DB, TAD ("B-"R DR, TAD ("R-"K DK, TAD ("K-"Q DQ, TAD ("Q DCA PIECE /SAVE PIECE TAD COLOR /WHICH COLOR PIECE IS IT? SZA CLA TAD ("B-"W /BLACK TAD ("W /WHITE JMS I ZOUT /PRINT COLOR OF PIECE TAD PIECE JMS I ZOUT /PRINT NAME OF PIECE JMP NEXT EMPTY, TAD XR0 RTR RAR AND [0007 /ISOLATE RANK TAD XR0 /ADD IN FILE RAR /PUT PARITY IN LINK SZL CLA /WHITE OR BLACK SQUARE? TAD ("--"* /WHITE TAD ("* /BLACK DCA PIECE TAD PIECE JMS I ZOUT TAD PIECE JMS I ZOUT NEXT, ISZ FILKNT /AT END OF RANK? JMP RL2 /NO, GO ON TO NEXT SQUARE JMS I ZCRLF /YES, GO TO NEXT RANK TAD RNKPTR TAD [7770 DCA RNKPTR ISZ RNKKNT /WAS THIS THE LAST RANK? JMP RNKLUP /NO, PROCEED TO NEXT RANK JMS I ZCRLF /AN EXTRA CRLF FOR GOOD LUCK JMP I DISPLAY /RETURN PAGE /CHESS POSITION INPUTTER /INPUT A LINE AT A TIME IN FORSYTH NOTATION / / POSIBLE ERRORS.... / 1? TRYING TO PUT TOO MUCH STUFF ON A RANK / 2? INCOMPLETE RANK SPECIFICATION(NOT ENOUGH STUFF) / 3? UNKNOWN PIECE LETTER / 4? PIECE COLOR NOT "W" OR "B" INPUT, 0 JMS I ZCRLF TAD (BOARD+70-1 DCA RNKPTR TAD [7770 DCA RNKKNT /SET UP FOR 8 RANKS RNLUP, TAD RNKPTR DCA XR0 TAD ("> JMS I ZOUT /PRINT A ">" TO INDIACTE READYNESS FOR INPUT TAD (7767 DCA FILKNT JMS I ZBEGIN /SETUP TO READ A LINE OF INPUT ION /GO ! JMS I ZCHKIO RL3, JMS I ZGETC /READ A CHARACTER SNA /AT END OF LINE? JMP EOL /YES JMS I (IS128 /IS CHAR A DIGIT? JMP LETTR /NO TAD (-260 /YES, CONVERT TO DIGIT CIA DCA COLOR JMS CHK /TEST FOR TOO ENOUGH STUFF ON THIS RANK ALREADY DCA I XR0 ISZ COLOR JMP .-3 JMP RL3 LETTR, TAD (-"B SNA /IS IT A BLACK PIECE? JMP BLP /YES TAD ("B-"W SZA CLA /IS IT A WHITE PIECE? JMP ERR4 /NOT "B" OR "W" WHP, STA BLP, DCA COLOR JMS CHK JMS I ZGETC /GET PIECE NAME TAD (-"B SNA /IS IT A BISHOP? JMP GB /YES TAD ("B-"N /NO SNA /IS IT A KNIGHT? JMP GN /YES TAD ("N-"P /NO SNA /IS IT A PAWN? JMP GP /YES TAD ("P-"R /NO SNA /IS IT A ROOK? JMP GR /YES TAD ("R-"K /NO SNA /IT IT A KING? JMP GK /YES TAD ("K-"Q /NO SNA /IT IT A QUEEN? JMP GQ /YES TAD ("Q-"S /NO SNA CLA /IS IT A SPRINGER? JMP GN /YES, ACCEPT AS KNIGHT JMP ERR3 /UNKNOWN PIECE GP, TAD (PAWN-KNIGHT GN, TAD (KNIGHT-BISHOP GB, TAD (BISHOP-ROOK GR, TAD (ROOK-QUEEN GQ, TAD (QUEEN-KING GK, TAD (KING ISZ COLOR /WHICH COLOR CIA /COMPLEMENT VALUE IF BLACK DCA I XR0 /STORE AWAY PIECE JMP RL3 /REITERATE EOL, ISZ FILKNT /WERE 8 SQUARES INPUTTED? JMP ERR2 /NO, TOO FEW SQUARES TAD RNKPTR TAD [7770 DCA RNKPTR /POINT TO NEXT RANK ISZ RNKKNT /WAS THIS LAST RANK? JMP RNLUP /NO DCA BPSW /YES. INITIALIZE POSITION STATUS WORDS DCA WPSW /TO ALLOW CASTLING DCA LSTMV /DISSALLOW EN PASSANT PAWN CAPTURES FOR THE NEXT MOVE JMS BRDVAL /THEN FIGURE OUT ITS VALUE /<<DANGER>> THE AC MIGHT NOT EQUAL ZERO NOW! JMS I ZCRLF /LET GUY KNOW HE'S THROUGH JMS DISPLA /PRINT OUT THE BOARD JUST INPUTED JMP I INPUT /RETURN ERR4, IAC ERR3, IAC ERR2, IAC ERR1, TAD (61 JMS I ZOUT TAD ("? JMS I ZOUT JMS I ZCRLF JMP RNLUP CHK, 0 ISZ FILKNT /IS THIS RANK FULL ALREADY? JMP I CHK /NO. KEEP GOING JMP ERR1 /YES. SIGNAL ERROR MESG9, TEXT \CHECKMATE\ MESG22, TEXT \B. \ MESG23, TEXT \W. \ PAGE *7400 /TABLE AREA MAP, ZBLOCK 50 /50 WORDS RESERVED FOR PIECE MAP KBUF, ZBLOCK 30 /30 WORDS RESERVED FOR THE KEYBOARD BUFFER / THE BOARD BOARD, IFNZRO .&0077<?BOARD MUST OCCUPY 1ST OR 2ND HALF OF A PAGE ?> ROOK KNIGHT BISHOP QUEEN KING BISHOP KNIGHT ROOK PAWN PAWN PAWN PAWN PAWN PAWN PAWN PAWN ZBLOCK 40 -PAWN -PAWN -PAWN -PAWN -PAWN -PAWN -PAWN -PAWN -ROOK -KNIGHT -BISHOP -QUEEN -KING -BISHOP -KNIGHT -ROOK $&$ SAID FARMER BROWN WHOSE BALD ON TOP WISH I COULD ROTATE THE CROP BURMA SHAVE CHEKMO-II WAS WRITTEN, PRODUCED AND DIRECTED BY: JOHN E. COMEAU |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | # CHEKMO II: Chess Playing Program Originally distributed as DECUS 8-822 Upstream source: Vince Slyngstad's so-much-stuff repository offers the [archival DECUS 8-882][vince] source and a PDF scan of the documentation (provided here as decus-8-882.pdf). However, a slightly modified source can be found in a [DECtape image on Dave Gesswein's pdp8online.com][dgw-src]. It has a small patch and enables the OS8 config by default. That is the source of CHEKMO.PA provided here. There is also a cool writeup with links to other interesting content at [chesprogramming.org/CHEKMO-II][chessprog] ## Original Decus Writeup: **Author:** John E. Comeau Digital Equipment Corporation Maynard, MA **Operating System:** Paper Tape **Source Language:** PAL-8 **Memory Required:** 4K **Other Software Required:** Requires OS/8 for assembly. **Abstract:** CHEKMO II is a chess playing program which will run on any PDP-8 family computer. The program will play either the white pieces or the black pieces, and will play and accept all classes of legal moves, including castling both short and long, en passant pawn captures, and pawn promoting moves to any legal promotion piece. The program prints out its moves m Algebraic Notation, and accepts moves using Algebraic Notation. Included in the command structure of the program are commands which allow you to input board positions using Forsyth Notation, and get a printout of the board at your terminal. **Media Price Code:** A2, F6, H32, K27 **Format:** OS/8 **Catalog:** August 1978 [vince]: http://svn.so-much-stuff.com/svn/trunk/pdp8/src/decus/8-822/ [dgw-src]: http://www.pdp8.net/pdp8cgi/os8_html?act=dir;fn=images/misc_dectapes/chekmo_misc.tu56;sort=name [chessprog]: https://www.chessprogramming.org/CHEKMO-II |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 | 1.4 ASSEMBLERS PAGE 1.4-1 JAN 1975 -------------- -NAME: DCP -AUTHOR: A.E. BROUWER, MATH. CENTR., A'DAM -DATE: 731003 -VERSION NR: DCP AB-V21 -LAST UPDATE: 741112 -ENVIRONMENT: OS/8 OPER. SYSTEM DCP (PRELIMINARY DESCRIPTION). DCP (SOMETIMES CALLED DEASS) IS A PROGRAM TO DEASSEMBLE (OR DISASSEMBLE) A PAL PROGRAM GIVEN IN BINARY OR IN CORE IMAGE FORMAT AS 1ST INPUT FILE. INFORMATION ABOUT THE PROGRAM AND MEANINGFUL TAGS CAN BE GIVEN IN A SECOND INPUT FILE. A WELL READABLE LISTING WITH MEANINGFUL TAGS BUT WITHOUT COMMENT CAN BE OBTAINED IN A FEW PASSES (TYPICALLY FOUR). THE FIRST TIME NO INFORMATION IS SUPPLIED; WHILE READING THE OUTPUT ONE RECOGNIZES CERTAIN PARTS AS MESSAGES ("NO ROOM FOR OUTPUT") OR NUMERIC TABLES (6030,7634,7766,7777) OR SIMPLE SUBROUTINES (TTYOUT, PUSH, PRINT). PUTTING THESE THINGS IN AN INFORMATION FILE AND THEN RUNNING DCP AGAIN GIVES YOU A MUCH NICER OUTPUT THE SECOND TIME. NOW YOU MAY EMBARK ON THE PROGRAM ITSELF AND OBTAIN AFTER A SMALL NUMBER OF PASSES (DEPENDING ON THE COMPLEXITY OF THE PROGRAM AND YOUR LAZINESS) A SOURCE THAT MIGHT HAVE BEEN THE ORIGINAL ONE EXCEPT FOR ITS LACK OF COMMENT. AT THIS MOMENT YOU COULD PROFITABLY USE THE CTRL/E FEATURE OF MCEDIT TO PROVIE THE WHOLE SOURCE OF COMMENT. (FOR EXAMPLE, WE OBTAINED A SOURCE OF A FORTRAN COMPILER IN THREE DAYS AFTER FIVE PASSES.) BELOW WE WILL DESCRIBE THE OS/8 VERSION OF THE PROGRAM -MEMORY REQUIREMENTS: 16K -ASSEMBLY INSTRUCTIONS: .R PAL8 *102,DCP_SBIN,DCPZ/L$ .SAVE SYS DCP -OPERATING INSTRUCTIONS: .R DCP *OUTPUT<INPUT,INFO(OPTIONS) PAGE 1.4-2 JAN 1975 COMMAND LINE INTERPRETATION: 1. IF NO INPUT AND NO OUTPUT SPECIFIED THEN DELETE DSK:DCPLS.TM IF COMMAND CLOSED WITH ALTMODE THEN EXIT TO OS/8 MONITOR ELSE CALL COMMAND DECODER AGAIN. 2. IF NO OUTPUT GIVEN BUT AN OUTPUT FILE IS REQUIRED BECAUSE CHAINING TO CREF.SV IS REQUESTED THEN DSK:DCPLS.TM IS USED. 3. IF NO INPUT GIVEN THEN USE OUTPUT FILENAME WITH EXTENSIONS .SV AND .SM (IF PRESENT) E.G. *DEASS< IS EQUIVALENT TO *DEASS<DEASS.V IF DEASS.SM DOES NOT EXIST, AND TO *DEASS<DEASS.SV,DEASS.SM OTHERWISE. IN THIS CASE A PREVIOUS VERSION OF THE OUTPUTFILE IS DELETED FIRST (IF NECESSARY). 4. IF THE OUTPUTFILE HAS NO EXPLICIT EXTENSION THEN ADD .DC IF A SOURCE IS PRODUCED, AND .LS OTHERWISE (ONE WOULD EXPECT .PA INSTEAD OF .DC BUT THAT PROVED DANGEROUS) OPTIONS AFFECTING INTERPRETATION OF COMMAND LINE: /B EXPECT .BN RATHER THAN .SV FORMAT IN FIRST INPUTFILE THIS CHANGES THE DEFAULT EXTENSION INTO .BN IF NO INPUT IS SPECIFIED. /L PRODUCE .LS RATHER THAN .DC OUTPUT /X CHAIN TO CREF.SV (1ST OUTPUT BECOMES INPUT AND 2ND OUTPUT BECOMES OUTPUT) THIS OPTION IMPLIES THE OPTIONS /L AND /T E.G. .R DCP *DEASS,TTY:</X/B IS EQUIVALENT TO .R PIP *DEASS.LS</D$ .R DCP *DEASS.LS<DEASS.BN,DEASS.SM/L/T/B .R CREF *TTY:<DEASS.LS ALSO .R DCP * *DEASS.SV,SPECS1,SPECS2,SPECS3/S MEANS .R PIP *DEASS.TM</D$ .R DCP *DCPLS.TM<DEASS.SV,SPECS1,SPECS2,SPECS3/L/T .R CREF *DCPLS.TM PAGE 1.4-3 JAN 1975 OPTIONS: /A DO NOT GENERATE A 'START' LABEL (BY DEFAULT A LABLE 'START' IS GENERATED WHEN DECODING A CORE IMAGE FILE. THIS IS POSSIBLE SINCE THE CORE COONTROL BLOCK CONTAINS THE STARTING ADDRESS) /B EXPECT .BN INSTEAD OF .SV INPUT /C COPY THE INFO FILE AFTER THE OUTPUT /D ALLOW 'JMP .-3', 'JMP I .+1' INSTRUCTIONS (NORMALLY FOR EACH REFERENCE A TAG IS GENERATED) /H DO NOT GENERATE LITERALS /K ALLOW MODIFICATION OF LITERALS (NORMALLY AN INSTRUCTION LIKE 1377 WILL BE TRANSLATED BY 'TAD (1234' BUT 2377 BY 'ISZ A177' SINCE NO DECENT PROGRAMMER EVER WRITES 'ISZ (1234'. IT WAS FOUND HOWEVER THAT SEVERAL DEC PROGRAMS CONTAIN SUCH CONSTRUCTS) /L PRODUCE OUTPUT IN .LS FORMAT /N DO NOT GENERATE TABLE OF UNDEFINED SYMBOLS /S GENERATE TABLE OF ALL SYMBOLS /T CONVERT TABS INTO SPACES /W DO NOT INTERPRET 6141 AS THE PDP12 'LINC' INSTRUCTION /X CHAIN TO CREF.SV /(F) (WHERE F DESIGNATES A DIGIT BETWEEN 0 AND 7) TRANSLATE FIELD F OF THE PROGRAM (DEFAULT: /0) (THE TRANSLATION IS DONE ONE FIELD AT A TIME; THIS CAUSES SOME FLAWS IN THE OUTPUT: CIF 10 JMS I (200 IS TRANSLATED AS CIF 10 JMS I (START IF LOC 200 IN THE CURRENT FIELD IS LABELED START. NOTE THAT ASSEMBLING THE PRODUCED SOURCE GIVES THE CORRECT BINARY) =NNNNMMMM THE = OPTION CAN BE USED TO SPECIFY A PART OF THE PROGRAM TO BE DECODED. NNN GIVES BEGIN AND MMMM END+1 OF THE RANGE. (NOTE THAT IF BEGIN>3777 THE COMMAND HAS TO BE CLOSED WITH ALTMODE INSTEAD OF RETURN). PAGE 1.4-4 JAN 1975 INPUT FORMAT EACH INPUT SECTION STARTS WITH $X (WHERE X IS A LETTER INDICATING THE TYPE OF THE SECTION) AND ENDS WITH $ . $<CR> INDICATES THE END OF ALL INPUT (WHEN NOT WITHIN A SECION). BETWEEN THE SECTIONS COMMENT NOT CONTAINING $ MAY BE INSERTED. SECTION TYPES: $A TRANSLATE AS 6BIT ASCII (TEXT "STRING") $D DONT TRANSLATE $I TRANSLATE AS INSTRUCTION (OVERRIDING OTHER SPECS) $L TRANSLATE AS IDENTIFIER RATHER THAN AS INSTRUCTION $N TRANSLATE OCTAL $S SUBROUTINE WITH ARGS $T SYMBOL DEFINITIONS $Z SPECIAL CODING $ END OF INPUT CONTENT OF SECTION: 1. SECTIONS $X WHERE X IS A,D,I,L OR N. CONTENTS: LINES OF THE FORM MMMM-NNNN OR NNNN WHERE NNNN AND MMMM ARE OCTAL ADDRESSES. E.G. THE SECTION $N 1717-1730 1750 $ SPECIFIES THAT THE LOCATIONS 1717-1730 AND 1750 ARE TO BE TRANSLATED AS OCTAL NUMBERS. 2. SECTIONS $S. CONTENTS: LINES OF THE FORM SSSS:XXXXX WHERE SSSS IS A SUBROUTINE ADDRESS AND XXXXX SPECIFIES THE KIND OF ARGUMENTS THE SUBROUTINE HAS. E.G. THE SECTION $S 1000:NL $ INDICATES THAT EACH CALL TO THE SUBROUTINE AT LOC 1000 HAS TWO ARGUMENTS OF TYPE OCTAL AND LABEL RESPECTIVELY. 3. SECTIONS $T. CONTENTS: LINES OF THE FORM TAG=NNNN OR TAG MEANING: IF NO OCTAL VALUE OF A TAG IS SPECIFIED THEN ITS VALUE IS TAKEN AS ONE MORE THAN THE VALUE OF THE PREVIOUS TAG. PAGE 1.4-5 JAN 1975 4. SECTION $Z. THIS IS AN AD HOC CONSTRUCT TO ENABLE THE TRANSLATION OF SYMBOLTABLES LIKE THOSE OF PAL8 AND CRF. E.G. $Z=52;0=240;1=301;40=260 NNNN-MMMM:(UUUL) $ INDICATES THAT THE RANGE NNNN-MMMM IS A TABLE OF FOUR-WORD ENTRIES THREE WORDS IN A SPECIAL FORMAT AND ONE LABEL. THE SPECIAL FORMAT IS AS FOLLOWS: THE VALUE IS DIVIDED BY 52 GIVING A QUOTIENT AND A REMAINDER. BOTH ARE CONVERTED INTO A CHARACTER AS FOLLOWS: 0 GIVES A SPACE, 1-37 GIVE LETTERS A-_, AND 40-51 GIVE DIGITS 0-9. THE CODING HERE IS NOT FOOLPROOF YYET: A STRANGE COMMAND MIGHT GIVE STRANGE OUTPUT INSTEAD OF AN ERROR MESSAGE. IN LATER VERSIONS THIS COMMAND WILL BE GENERALIZED, SO WE DONT DESCRIBE IT IN FULL HERE. ERRORMESSAGES. THESE ARE VERY POOR (BECAUSE OF LACK OF SPACE): HLTNNNN, WHERE NNNN INDICATES THE ADDRESS OF THE ROUTINE IN DCP THAT DETECTED THE ERROR. ERRORS ARE ALMOST ALWAYS VIOLATIONS OF THE INPUT FORMAT. A COMPLETE LIST WILL APPEAR IN THE FINAL REPORT. 1.4 ASSEMBLERS PAGE 1.4-6 FEB 1975 -------------- NAME: DCP (ERROR TABLE) AUTHOR: A.E. BROUWER DATE: 750213 AS NOTED: THE ERRORMESSAGES OF DCP LOOK LIKE 'HLT....' WHERE .... STANDS FOR THE OCTAL ADDRESS OF THE ROUTINE THAT DETECTED THE ERROR. (OF COURSE GIVING INTELLIGIBLE MESSAGES IS HIGHLY DESIRABLE BUT LACK OF SPACE PREVENTED THIS. SOME FUTURE VERSION OF DCP WILL CHAIN TO A FILE DECPERR.SV CONTAINING THE MESSAGES.) BELOW THE ERROR NUMBERS ARE GIVEN FOR DCP AB-V21. [NOTE: THESE NUMBERS MAY CHANGE SLIGHTLY EACH TIME THAT DCP IS ASSEMBLED ANEW.] NUMBER ERROR 0000 PREMATURE END OF .BN INPUT 0230 CLOSE ERROR 0301 LOOKUP FOR SYS:CREV.SV FAILED 1414 OUTPUT ERROR OR NO ROOM FOR OUTPUT 1451 INPUT ERROR (INFO FILE) 1522 NO CARRIAGE RETURN WHERE EXPECTED IN THE INFO FILE 1755 UPPER BOUND IN BOUND PAIR LESS THAN LOWER BOUND 2031 ASCII STRING CONTAINED A SIXBIT ZERO, BUT NOT AT THE END (I.E. A WORD 00XX). (THIS MIGHT HAVE BEEN AN @, BUT IS USUALLY AN ERROR.) 2046 ASCII STRING WITHOUT TRAILING ZERO 2061 DCP COULD NOT FIND A SUITABLE DELIMITER FOR THE ASCII STRING IN THE RANGE "" TO "? 2125 IMPOSSIBLE 2214 TEXT BUFFER OVERFLOW (TOO MANY OR TOO LONG IDENTIFIERS). 2234 NO IDENTIFIER WHERE EXPECTED (IN A $T SECTION). 2666 ZERO SUBROUTINE ADDRESS SPECIFIED IN A $S SECTION 2705 S-BUFFER OVERFLOW (TOO MANY SUBROUTINES WITH ARGS.) 2761 UNKNOWN TYPE LETTER IN SPECIFICATION OF SUBROUTINE ARGS 3006 $Z NO FOLLOWED BY = 3011 $Z= NOT FOLLOWED BY A NONZERO NUMBER 3022 NO CARRIAGE RETURN OR SEMICOLON WHERE EXPECTED IN $Z HEADER 3030 NO = WHERE EXPECTED IN $Z HEADER LINE 3041 ZERO LOWER BOUND IN BOUND PAIR IN $Z SECTION 3064 Z-BUFFER OVERFLOW 3117 PREMATURELY EXHAUSTED Z-FORMAT 3135 UNKNOWN Z-FORMAT SYMBOL 3470 T-BUFFER OVERFLOW 3723 NO VALUE ASSIGNED TO FIRST TAG IN $T SECTION 4213 NO INPUT AND NO OUTPUT AND NO DSK:DCPLS.TM TO DELETE 4245 HANDLER FETCH ERROR 4341 LOOKUP FOR INPUTFILE FAILED 4442 OUTPUT OPEN ERROR 4456 NO 16K MEMORY AVAILABLE 4470 CHECKSUM OR FORMAT ERROR IN BINARY INPUT FILE 4613 FORMAT ERROR IN CORE CONTROL BLOCK OF .SV INPUT FILE 4647 ERROR READING CORE CONTROL BLOCK OF .SV INPUT 4723 ERROR READING .SV INPUT FILE 1.4 ASSEMBLERS PAGE 1.4-8 MAR 1976 -------------- NAME: DCP-AB-WW-V24 AUTHOR: W.F. WAKKER, MATH. CENTR., A'DAM DATE: 760325 DCP VERSION 24 IS A 24K VERSION OF DCP. THE FOLLOWING EXTENSIONS ARE MADE: -DCP24 TRANSLATES EAE INSTRUCTIONS IN BOTH A AND B MODE (FOR MODE SWITCHING SEE BELOW) EXAMPE: 1200 DAD;1234 IS TRANSLATED AS IF THE INFO-FILE CONTAINS THE FOLLOWING INTO: $I 1200 $ $L 1201 $ $N 1234+ $ - IN THE INFO-FILE ONE CAN GIVE : NNNN+ .THIS HAS THE SAME EFFECT AS NNNN-MMMM WHERE MMMM=NNNN+1. - SEVERAL BUFFERS HAVE BEEN ENLARGED. - THE OUTPUT IS PAGINATED AND HAS A HEADING ON EACH PAGE. (THE PAGE NUMBER IS IN OCTAL ....) - ERROR MESSAGE ARE UNFORTUNATELY AS POOR AS BEFORE (SEE DCP24 ERROR TABLE). - NEW SECTIONS, NOW POSSIBLE IN THE INFO-FILE ARE: $B TRANSLATE AS 8-BIT ASCII $C GIVE COMMENT $E FORCE EAE MODE A $F FORCE EAE MODE B $M TRANSLATE NEGATIVE - SECTION $B $B NNNN-MMMM $ CAUSES THE LOCATION NNNN-MMMM TO BE TRANSLATED AS 8-BIT ASCII, E.G. 0301 IS TRANSLATED AS "A. VALUES LESS THEN 241 ARE TRANSLATED AS OCTAL NUMBERS. PAGE 1.4-9 MAR 1976 - SECTIONS $E AND $F WHEN DCP ENCOUNTERS EAE INSTRUCTIONS, SOME SLIGHT HEURISTICS ARE DONE TO DETERMINE THE MODE. THE MODE IS INITIALLY A; SWAB, DAD, AND DST CAUSE THE MODE TO CHANGE TO MODE B ETC. WHEN THESE HEURISTICS ARE TOO POOR, YOU CAN USE THE $E SECTION TO FORCE MODE A AND THE $F SECTION TO FORCE MODE B. - SECTION $M THIS SECTION HAS THE SAME EFFECT AS SECTION $N, ONLY ALL OCTALS ARE GIVEN NEGATIVE, E.G. 7770 BECOMES -10. IT IS ALSO POSSIBLE TO GIVE $B AND $M TO THE SAME LOC. EXAMPLE: 7477 IS NOW TRANSLATED AS -"A. - SECTION $C NOW YOU CAA GIVE COMMENT!! FORMAT: NNNN:THIS IS COMMENT EFFECT: NNNN ........ /THIS IS COMMENT ATTENTION: THE $C SECTION MUST BE THE LAST ONE IN THE INFO-FILE: WHEN $C IS SEEN IN THE INFO-FILE, A SETUP IS MADE TO GIVE THE COMMENT AND NO MORE INPUT WILL BE READ ( E.G. THE PROGRAM ACTS LIKE $$ ON THE END IS SEEN). THE COMMENTS ARE ADDED TO THE LISTING IN THE LAST PASS OF THE PROGRAM. **** YOU MUST SORT THE ADDRESSES. 300:COMM1 200:COMM2 HAS AS EFFECT THAT FROM ADRESS 300 ON, NO MORE COMMENT WILL BE GIVEN, SINCE ADDRESS 200 IS NOT FOUND ANY MORE. **** DO NOT GIVE COMMENT ON ADDRESSES WHICH DO NOT BELONG TO THE PROGRAM. - EXTENSION OF $S SECTION AS ARGUMENTS IN THE $S SECTION YOU CAN GIVE N, L, A, I, B, M, (WITH THE OBVIOUS MEANING, SEE ABOVE ) AND ALSO U. U SHOULD ONLY BE USED FOR THE ADDRESSES 200 AND 7700. IT MARKS THE ENTRYPOINT OF THE USER SERVICE ROUTINE AND GIVES A NICE TRANSLATION OF EACH USR CALL. - EXTENSION OF $Z SECTION NEW POSSIBLE ARGUMENTS: M, B. 1.4 ASSEMBLERS PAGE 1.4-10 MAR 1976 -------------- NAME: DCP-V24 (ERROR TABLE) NUMBER ERROR 0000 PREMATURE END OF .BN INPUT 0237 CLOSE ERROR 0305 LOOKUP FOR SYS:CREF.SV FAILED 1414 OUTPUT ERROR OR NO ROOM FOR OUTPUT 1511 NO CARRIAGE RETURN WHERE EXPECTED IN THE INFO FILE 1707 NO : AS SEPARATOR IN $C SECTION 2145 UPPER BOUND IN BOUND PAIR LESS THAN LOWER BOUND 2235 NO : AS SEPARATOR IN FIRST LINE OF $C SECTION 2331 INPUT ERROR (INFO FILE) 2431 ASCII STRING CONTAINED A SIXBIT ZERO, BUT NO AT THE END (I.E. A WORD 00XX). (THIS MIGHT HAVE BEEN AN @, BUT IS USUALLY AN ERROR.) 2446 ASCII STRING WITHOUT TRAILING ZERO 2461 DCP COULD NOT FIND A SUITABLE DELIMITER FOR THE ASCII STRING IN THE RANGE "" TO "? 2525 IMPOSSIBLE 2614 TEXT BUFFER OVERFLOW (TOO MANY OR TOO LONG IDENTIFIERS) 2634 NO IDENTIFIER WHERE EXPECTED (IN A $T SECTION) 3266 ZERO SUBROUTINE ADDRESS SPECIFIED IN A $S SECTION 3305 S-BUFFER OVERFLOW (TOO MANY SUBROUTINES WITH ARGS) 3367 UNKNOWN TYPE LETTER IN SPECIFICATION OF SUBROUTINE ARGS 3406 $Z NOT FOLLOWED BY = 3411 $Z= NOT FOLLOWED BY A NONZERO NUMBER 3422 NO CARRIAGE RETURN OR SEMICOLON WHERE EXPECTED IN $Z HEADER 3430 NO = WHERE EXPECTED IN $Z HEADER LINE 3441 ZERO LOWER BOUND IN BOUND PAIR IN $Z SECTION 3463 Z-BUFFER OVERFLOW 3517 PREMATURELY EXHAUSTED Z-FORMAT 3541 UNKNOWN Z-FORMAT SYMBOL 4070 T-BUFFER OVERFLOW 4324 NO VALUE ASSIGNED TO FIRST TAG IN $T SECTION |
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # DCP A PAL Disassembly Program This is a pretty good disassembler for the PDP-8 with a powerful mechanism for refining the disassembly. The source has been lost, but at some point, some intrepid soul will feed DCP to itself and regenerate it. There are two differen tools, DCP16 an DCP24. The former fits into 16K of memory. The latter, consuming 24K, does a richer job of interpreting EAE (Extended Arithmetic Element) instructions, and a richer INFO file to refine the disassembly. The documentation in DCP.WU is adequate to make sense of using the program. Upstream is from [bitsavers.org][bitsavers] and replicated at [dbit.com][dbit] and [The deramp.com Vintage Computing Archive][deramp]. [dbit]: http://www.dbit.com/pub/pdp8/nickel/utils/dcp/os8/ [bitsavers]: http://www.bitsavers.org/bits/DEC/pdp8/papertapeImages/russ.ucs.indiana.edu/Utils/DCP/OS8/ [deramp]: https://deramp.com/downloads/mfe_archive/011-Digital%20Equipment%20Corporation/01%20DEC%20PDP-8%20Family%20Software/10%20Operating%20Systems/OS-8/20%20Utilities/DCP/ |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | E8 was created by Bill Silver <bsilver@tidewater.net>. The first version was [posted to the PiDP-8/I mailing list][op] on 2020.04.05; it is tagged “v0” in the Fossil repository. The subsequent 8 versions were also posted to the mailing list and are tagged with their version numbers and posting timestamps. Warren Young <wyoung@tangentsoft.com> converted these zip files to [a Fossil repository][repo] and converted the PDF user manual to Markdown format on 2020.04.25, making some improvements to the manual along the way. From v9 onward, development happened on the Fossil repository. [op]: https://groups.google.com/d/msg/pidp-8/d6edAjHiWWY/8MLYob9_BwAJ [repo]: https://tangentsoft.com/e8/ |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | This tape contains source binary and documentation for E8, the Emacs-like editor written by Bill Silver. E8.SV is the executable editor. (The .BN and .LS files from the assembly are included.) Two reference help files are included as reminders: E8CMDS.TX lists the keyboard commands. E8SRCH.TX lists the keys to use during the search/replace commands. It also contains documentation that cannot readily be displayed in the PDP-8 environment. Copy the E8 manual E8MANU.MD, and its diagram, BUFSVG.XX to a POSIX system as follows: E8MANU.MD -> e8-manual.md BUFSVG.XX -> e8-buffer.svg |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 | /#E8# OS/8 EMACS CORE FUNCTIONS OCTAL BELL=7 / SPECIAL CHARACTERS TAB=11 LF=12 CR=15 ESC=33 SP=40 BS=10 ZERO="0&177 LBRAK="[&177 SEMI=";&177 DOT=".&177 COMMA=",&177 / NEW LINE IN BUFFER. GENERALLY CAN BE ANY CONTROL CHAR, / BUT THERE IS ONE PLACE (INSF1) THAT ASSUMES IT'S CR: IN / FILE INPUT TO CONVERT CR/LF TO NL BY DISCARDING LF. NL=CR / DISPLAY SCREEN DIMENSIONS. WD * (HT+1) MUST BE <= 3968 TO AVOID / RUNNING INTO OS/8 USE OF LAST PAGE OF FIELD 1 DECIMAL IFNDEF SCRWD <SCRWD=80> IFNDEF SCRHT <SCRHT=42> TXTHT=SCRHT-2 / SCREEN HEIGHT MINUS MODE LINES OCTAL / FIELD DEFINITIONS IFNDEF MEMSIZ <MEMSIZ=10> BUFFLD=CDF 20 / TEXT BUFFER START ENDFLD=MEMSIZ^10+CDF / TEXT BUFFER END CODFLD=CDF 0 / CODE SCRFLD=CDF 10 / SCREEN COPY / ASSERTION FAILURE FAIL=JMS I [ASSERT / PAGE 0 *10 SRCP, 0 / AUTOINDEX USED IN SOME LOOPS DSTP, 0 TMP0, 0 TMP1, 0 *20 BUF, 0; BUFFLD / START OF TEXT BUFFER BUFEND, 0; ENDFLD / END OF TEXT BUFFER POINT, 0; ENDFLD / INSERT/DELETE POINT (END OF GAP) MARK, 0; BUFFLD / SEE COMMENTS IN EE.PA TOS, 0; BUFFLD / TOP OF SCREEN GAP, 0; BUFFLD / START OF GAP SRCHP, 0; 0 / SEARCH POINTER CHANGD, 0 / NON-ZERO IF FILE HAS CHANGED MLHOLD, 0 / HOLD MODE LINE FOR ONE CYCLE MKFLAG, 0 / MARK BEFORE (0) OR AFTER (1) POINT AC24, 0; 0 / 24-BIT ACCUMULATOR DSKEP, 0 / DSK HANDLER ENTRY POINT BACKCH, 0 / IF NON-ZERO, RE-READ THIS CHARACTER UPDOWN, 0 / STATE FOR ^N, ^P FIXLOC, 0 SRCHC, 0 / SFWD, SREV CHARACTER GOSTOP, 0; 0 / END ADDRESS FOR MOVING FWD, REV / A ZONE (ENTIRE BUFFER OR JUST REGION) FOR WRITING TO A FILE WRBEG, 0 / POINTER TO 15-BIT BEGINNING BELOW GAP WREND, 0 / POINTER TO 15-BIT END ABOVE POINT WRNAME, 0 / POINTER TO FILENAME WRSIZE, 0 / FILE SIZE IN OS/8 BLOCKS (256 WORDS) / VARIABLES NEED FOR SCREEN UPDATE. ON PAGE 0 SINCE THE CODE SPANS / MULTIPLE PAGES ROW, 0 / SCREEN POSITION DURING UPDATE COL, 0 CURROW, 0 / POSITION OF POINT (CURSOR) FOUND DURING UPDATE CURCOL, 0 BUFP, 0 / POINTER INTO BUFFER (FIELD BITS AT RNDFLD) SCRLIN, 0 / POINTER TO CURRENT SCREEN LINE SCRP, 0 / POINTER INTO SCREEN COPY IN FIELD 1 RNDP, 0 / POINTER INTO RENDER BUFFER IN FIELD 1 RNDFLG, 0 / RENDERING BEFORE (0) OR AFTER (1) GAP RNDESC, 0 / NEGATIVE GAP OR BUFEND ADDRESS / TEMP REGISTERS USED BY 15-BIT ADDRESS ROUTINES A15, 0 B15, 0 C15, 0 / USED TO RECOVER DELETED CHARS RCVPT, 0; ENDFLD / POINT RECOVER ZONE RCVGP, 0; BUFFLD / GAP RECOVER ZONE LASTPT, 0; ENDFLD / PREVIOUS POINT LASTGP, 0; BUFFLD / PREVIOUS GAP / PAGE 0 LITERALS / SRCHP POINT GAP BELL 10 NL -10 SP BUF -SP BUFEND SCRWD 77 SSTRNG / PAGE 0 LINKS / WR6 INC15 SNE15 WRTTY SFWDPT RDTTY GOFWD SREVGP CLRMLT UPDATE WRMLT / SFWD GOREV LD24 SUB15 SREV UPPER DEC15 USR INSERT DIVIDE GET15 / RNDFIN GOBEG WRDEC SCHSTR RNDINI ADD15 SETFN FIXMRK CLRFN GOEND / 7600 OFFER FIX24 WRRND GETFIL LUFILE WRSTR SCINIT INSFIL SKIPAN / FILENM+3 DEVNUM ERMLT WRITEF / TOP LEVEL *200 /------------ TLS JMS I [SCINIT JMS IOINIT JMP I [7600 / FILE SYS ERR, QUIT TOP, TAD MLHOLD / CLEAR MODE LINE TEXT UNLESS BEING HELD SNA CLA JMS I [CLRMLT DCA MLHOLD JMS I [FIXMRK / FIX MARK IF NECESSARY JMS RCZONE / MAINTAIN RECOVER ZONE JMS I [UPDATE / UPDATE SCREEN TAD UPDOWN / HANDLE ^N ^P STATE SMA CLA JMP TOPA TAD UPDOWN CIA JMP TOPB TOPA, TAD CURCOL TOPB, DCA UPDOWN JMS I [RDTTY / GET AND PROCESS CHAR INPUT TAD [-SP SPA JMP CTRL TAD [SP / NORMAL CHARACTER, INSERT JMS I [INSERT JMP ERR JMP TOP / CONTROL CHAR CTRL, TAD [SP TAD (CTABLE ALTEX, DCA CMD TAD I CMD SNA JMP ERR DCA CMD JMS I CMD JMP ERR JMP TOP / ERROR ERR, TAD [BELL JMS I [WRTTY JMP TOP / ALT PREFIX (ESCAPE SEQUENCE START) ALTPRE, 0 JMS I [RDTTY JMS I [UPPER AND [77 TAD (ALTTBL JMP ALTEX / ^X COMMANDS. CONTROL, UPPER, AND LOWER CASE LETTERS ARE ALL / THE SAME, DUE TO SOME CONTROL CHARS BEING INTERCEPTED BY / LINUX, MOBAXTERM, OR SIM CTRLX, 0 TAD (30 JMS I [WRMLT JMS I [UPDATE JMS I [RDTTY AND (37 TAD (XTABLE JMP ALTEX CMD, 0 / SOME CONTROL CHARS ARE JUST INSERTED INSTAB, 0 TAD (TAB JMS I [INSERT SKP ISZ INSTAB JMP I INSTAB NEWLN, 0 TAD [NL JMS I [INSERT SKP ISZ NEWLN JMP I NEWLN / LF = NL, TAB NLTAB, 0 JMS NEWLN JMP I NLTAB JMS INSTAB JMP I NLTAB ISZ NLTAB JMP I NLTAB / READ QUOTED CHARACTER GETQ, 0 TAD (21 JMS I [WRMLT JMS I [UPDATE JMS I [RDTTY JMP I GETQ / QUOTED INSERT QUOTE, 0 JMS GETQ JMS I [INSERT SKP ISZ QUOTE JMP I QUOTE / ALT-Q. LIKE ^Q, BUT REGULAR LETTERS ARE INTERPRETED AS CTRL / DUE TO SOME CTRL CHARS BEING INTERCEPTED AQUOTE, 0 JMS GETQ TAD (-100 SMA JMP AQA CLA JMP I AQUOTE AQA, AND (37 JMS I [INSERT JMP I AQUOTE ISZ AQUOTE JMP I AQUOTE / EXIT TO OS/8 EXIT, 0 JMS I [OFFER JMP I EXIT IFDEF FSCROL < TAD (ESC JMS I [WRTTY TAD (143 JMS I [WRTTY > IFNDEF FSCROL < TAD (SCRHT-1 DCA ROW DCA COL JMS SETCUR > TSF / WAIT FOR TTY TO BE DONE BEFORE JMP .-1 / EXITING TO OS/8 JMP I [7600 PAGE /------------ 0400 CTABLE, SETMRK; BEGLN; BACK; 0; DELFWD; ENDLN; FWD; 0 DELREV; INSTAB; NLTAB; KEOL; REDRAW; NEWLN; NXTLN; OPEN PRVLN; QUOTE; 0; ISRCH; 0; 0; FWDSCR; DELREG CTRLX; YANK; EXIT; ALTPRE; SCRLUP; 0; 0; 0 ALTTBL, 0; BEGLN; BACKWD; 0; DLFWWD; ENDLN; FWDWD; 0 DLRVWD; 0; 0; 0; 0; 0; SCHNXT; 0 0; AQUOTE; RECOVR; ISRCH; 0; 0; REVSCR; WRREG 0; 0; 0; KEYS; SCRLDN; 0; 0; 0 0; 0; 0; 0; 0; QREPL; 0; 0 0; 0; 0; 0; 0; 0; 0; 0 0; 0; 0; 0; 0; 0; 0; 0 0; 0; 0; 0; GOBEG; 0; GOEND; 0 XTABLE, 0; 0; 0; 0; 0; 0; FFILE; 0 0; INFILE; 0; 0; 0; 0; 0; 0 0; 0; RDMORE; SVFILE; 0; 0; 0; WRFILE EXGPM; 0; 0; 0; 0; 0; 0; 0 PAGE /------------ 0600 / CHARACTER I/O RDTTY, 0 JMS REREAD JMP I RDTTY KSF JMP .-1 KRB AND (177 TAD (-177 / CONVERT DELETE TO BACKSPACE TO HANDLE SNA / MODERN ENTER KEY, WHICH MIGHT SEND TAD (BS-177 / EITHER TAD (177 JMP I RDTTY / WRITE 0-TERMINATED STRING TO SUBROUTINE WHOSE / ADDRESS FOLLOWS JMS WRSTR, 0 DCA WRSTRP TAD I WRSTR DCA WRSUB ISZ WRSTR WRSTRA, TAD I WRSTRP SNA JMP I WRSTR ISZ WRSTRP JMS I WRSUB JMP WRSTRA WRSTRP, 0 / WRITE AC DECIMAL, UNSIGNED, TO SUBROUTINE WHOSE / ADDRESS FOLLOWS JMS WRDEC, 0 DCA AC24 DCA AC24+1 TAD (W10BUF / SET UP BUFFER DCA W10P TAD I WRDEC / GET SUBROUTINE DCA WRSUB ISZ WRDEC WRDECA, TAD (12 / NEXT DIGIT, REVERSE ORDER JMS I [DIVIDE TAD AC24+1 TAD (ZERO DCA I W10P ISZ W10P DCA AC24+1 TAD AC24 SZA CLA JMP WRDECA WRDECB, STA / WRITE DIGITS IN REVERSE TAD W10P DCA W10P TAD I W10P JMS I WRSUB TAD W10P TAD (-W10BUF SZA CLA JMP WRDECB JMP I WRDEC W10P, 0 W10BUF, ZBLOCK 4 WRSUB, 0 W8CNT=W10P W8NUM=W10BUF / WRITE AC OCTAL, UNSIGNED, TO SUBROUTINE WHOSE / ADDRESS FOLLOWS JMS. WROCT, 0 DCA W8NUM TAD I WROCT DCA WRSUB ISZ WROCT TAD (-4 DCA W8CNT WROCTA, TAD W8NUM CLL RTL; RAL DCA W8NUM TAD W8NUM RAL AND (7 TAD (ZERO JMS I WRSUB ISZ W8CNT JMP WROCTA JMP I WROCT / INSERT AC AT POINT INSERT, 0 DCA C15 / BUFFER FULL (GAP == POINT)? TAD [GAP JMS I [SNE15; POINT JMP INSFUL ISZ INSERT TAD C15 / NO, CHAR GOES IN GAP JMS PUT15; GAP TAD [GAP JMS I [INC15 STA DCA CHANGD JMP I INSERT INSFUL, TAD (FULMSG / BUFFER FULL JMS I [WR6 WRMLT ISZ MLHOLD JMP I INSERT FULMSG, TEXT / BUFFER FULL!/ / 15-BIT POINTERS ARE TWO WORDS, ADDRESS FOLLOWED BY CDF THAT / HOLDS FIELD. / INCREMENT 15-BIT POINTER. INC15, 0 DCA A15 ISZ I A15 JMP I INC15 ISZ A15 TAD I A15 TAD [10 DCA I A15 JMP I INC15 PAGE /------------ 1000 WRTTY, 0 TSF JMP .-1 TLS CLA JMP I WRTTY / DECREMENT 15-BIT POINTER DEC15, 0 DCA A15 STA STL TAD I A15 DCA I A15 SNL JMP I DEC15 ISZ A15 TAD I A15 TAD [-10 DCA I A15 JMP I DEC15 / FETCH FROM 15-BIT POINTER GET15, 0 DCA A15 TAD I A15 DCA B15 ISZ A15 TAD I A15 DCA .+1 0 TAD I B15 CODFLD JMP I GET15 / STORE AC AT 15-BIT POINTER WHOSE ADDRESS FOLLOWS JMS PUT15, 0 DCA C15 TAD I PUT15 ISZ PUT15 DCA A15 TAD I A15 DCA B15 ISZ A15 TAD I A15 DCA .+1 0 TAD C15 DCA I B15 CODFLD JMP I PUT15 / SKIP IF TWO 15-BIT POINTERS ARE NOT EQUAL. AC AND FOLLOWING WORD / HAVE ADDRESS OF THE POINTERS SNE15, 0 DCA A15 TAD I SNE15 ISZ SNE15 DCA B15 TAD I A15 CIA TAD I B15 SZA CLA JMP SNE15A ISZ A15 ISZ B15 TAD I A15 CIA TAD I B15 SZA CLA SNE15A, ISZ SNE15 JMP I SNE15 / MOVE POINT FORWARD 1, SKIP IF OK FWD, 0 TAD [POINT / OK TO MOVE? JMS I [SNE15; BUFEND JMP I FWD ISZ FWD / YES, SKIP RETURN JMS I [SFWDPT / MOVE ONE FORWARD TAD [SRCHP JMS I [INC15 JMS I [GOFWD JMP I FWD / MOVE POINT BACK 1, SKIP IF OK BACK, 0 TAD [BUF / OK TO MOVE? JMS I [SNE15; GAP JMP I BACK ISZ BACK / YES, SKIP RETURN JMS I [SREVGP TAD [SRCHP JMS I [DEC15 JMS I [GOREV JMP I BACK /#EA# / DELETE FORWARD DELFWD, 0 TAD [POINT / AT END (POINT == BUFEND)? JMS I [SNE15; BUFEND JMP I DELFWD ISZ DELFWD TAD [POINT / NO, JUST INCREMENT POINY JMS I [INC15 STA DCA CHANGD JMP I DELFWD / DELETE REVERSE DELREV, 0 / BACK ONE AND THEN DELETE FORWARD JMS BACK JMP I DELREV JMS DELFWD FAIL ISZ DELREV JMP I DELREV / BEGINNING OF BUFFER. ASSUME BUFFER STARTS AT ADDRESS 0 IN SOME FIELD. GOBEG, 0 DCA SRCHP / SRCHP = BEGINNING OF BUFFE TAD (BUFFLD DCA SRCHP+1 JMS I [GOREV / GO THERE ISZ GOBEG JMP I GOBEG / END OF BUFFER. ASSUME BUFFER ENDS AT ADDRESS 0 IN SOME FIELD / (INCLUDING IMAGINARY FIELD 10) GOEND, 0 DCA SRCHP / SRCHP = END OF BUFFER TAD (ENDFLD DCA SRCHP+1 JMS I [GOFWD / GO THERE ISZ GOEND JMP I GOEND / OPEN NEW LINE OPEN, 0 JMS NEWLN JMP I OPEN JMS BACK FAIL ISZ OPEN JMP I OPEN PAGE /------------ 1200 REREAD, 0 TAD BACKCH SZA JMP RERDA ISZ REREAD JMP I REREAD RERDA, DCA RDBACK DCA BACKCH TAD RDBACK JMP I REREAD RDBACK, 0 / END OF LINE ENDLN, 0 ISZ ENDLN / CAN'T FAIL JMS I [SFWDPT / SEARCH FORWARD FOR NL TAD [NL JMS I [SFWD JMP ENDLNA JMS I [GOFWD / FOUND GO THERE JMP I ENDLN ENDLNA, JMS I [GOEND / NOT FOUND, GO TO END FAIL / CAN'T FAIL JMP I ENDLN / NEXT LINE NXTLN, 0 JMS I [SFWDPT / SEARCH FORWARD FOR NL TAD [NL JMS I [SFWD JMP I NXTLN TAD [SRCHP / SKIP OVER NL JMS I [INC15 JMS I [GOFWD / GO THERE JMS FIXCOL ISZ NXTLN JMP I NXTLN / BEGINNING OF LINE BEGLN, 0 ISZ BEGLN / CAN'T FAIL JMS I [SREVGP / SEARCH BACK FOR NL TAD [NL JMS I [SREV JMP BEGLNA TAD [SRCHP / SKIP OVER NL JMS I [INC15 JMS I [GOREV / GO THERE JMP I BEGLN BEGLNA, JMS I [GOBEG / NOT FOUND, GO TO BEGINNING FAIL JMP I BEGLN / PREVIOUS LINE PRVLN, 0 JMS I [SREVGP / SEARCH REVERSE FOR NL TAD [NL JMS I [SREV JMP I PRVLN JMS I [GOREV / GO THERE JMS BEGLN / THEN TO BEGINNING OF THAT LINE FAIL JMS FIXCOL ISZ PRVLN JMP I PRVLN / SEARCH FORWARD FROM SRCHP FOR CHAR IN AC. IF FOUND UPDATE SRCHP / AND SKIP. SRCHP >= POINT. FOR SPEED, DON'T USE 15-BIT ADDRESS / SUBROUTINES SFWD, 0 CIA DCA SRCHC TAD SRCHP+1 DCA SFWDF SFWDA, TAD SRCHP / DONE (SRCHP == BUFEND)? SZA CLA JMP SFWDF TAD SFWDF TAD (-ENDFLD SNA CLA JMP SFWDC SFWDF, 0 / NOT DONE, MATCH? TAD I SRCHP TAD SRCHC SNA CLA JMP SFWDB ISZ SRCHP / NO MATCH, SRCHP++ JMP SFWDA TAD SFWDF TAD [10 DCA SFWDF JMP SFWDA SFWDB, TAD SFWDF / MATCH, STORE FINAL FIELD DCA SRCHP+1 ISZ SFWD SFWDC, CODFLD JMP I SFWD / SEARCH REVERSE FROM SRCHP-1 FOR CHAR IN AC. IF FOUND UPDATE SRCHP / AND SKIP. SRCHP <= GAP. FOR SPEED, DON'T USE 15-BIT ADDRESS / SUBROUTINES SREV, 0 CIA DCA SRCHC TAD SRCHP+1 DCA SREVF SREVA, TAD SRCHP / DONE (SRCHP == BUF) SZA CLA JMP SREVC TAD SREVF TAD (-BUFFLD SNA CLA JMP SREVD SREVC, STA STL / NOT DONE, --SRCHP TAD SRCHP DCA SRCHP SNL CLA JMP SREVF TAD SREVF TAD [-10 DCA SREVF SREVF, 0 / MATCH? TAD I SRCHP TAD SRCHC SZA CLA JMP SREVA SREVB, TAD SREVF / YES DCA SRCHP+1 ISZ SREV SREVD, CODFLD JMP I SREV / ASSERTION FAILURE, FATAL ERROR ASSERT, 0 TAD (FAILMS JMS I [WR6 WRTTY TAD ASSERT JMS WROCT WRTTY JMP I [7600 PAGE /------------ 1400 / SET UP TO SEARCH FORWARD FROM POINT SFWDPT, 0 TAD POINT DCA SRCHP TAD POINT+1 DCA SRCHP+1 JMP I SFWDPT / SET UP TO SEARCH REVERSE FROM GAP SREVGP, 0 TAD GAP DCA SRCHP TAD GAP+1 DCA SRCHP+1 JMP I SREVGP / GO FORWARD FROM POINT TO SRCHP. POINT <= SRCHP <= BUFEND. / THIS IS POTENTIALLY THE SLOWEST EDIT OPERATION, SINCE IT / CAN MOVE LOTS OF CHARACTERS, SO DON'T USE 15-BIT ADDRESS / SUBROUTINES. 20 CYCLES = 30 US PER CHARACTER (8/I). GOFWD, 0 TAD SRCHP / GET -STOP ADDRESS CIA DCA GOSTOP TAD SRCHP+1 CIA DCA GOSTOP+1 TAD POINT+1 / SET UP CDF INSTRUCTIONS DCA GOFWDP TAD GAP+1 DCA GOFWDG GOFWDA, TAD POINT / AT STOP POINT? TAD GOSTOP SZA CLA JMP GOFWDP TAD GOFWDP TAD GOSTOP+1 SZA CLA JMP GOFWDP CODFLD / YES, UPDATE POINT AND GAP TAD GOFWDP DCA POINT+1 TAD GOFWDG DCA GAP+1 JMP I GOFWD / AND DONE GOFWDP, 0 / MOVE CHAR FROM POINT TO GAP TAD I POINT GOFWDG, 0 DCA I GAP ISZ POINT / ++POINT JMP GOFWDB TAD GOFWDP TAD [10 DCA GOFWDP GOFWDB, ISZ GAP / ++GAP JMP GOFWDA TAD GOFWDG TAD [10 DCA GOFWDG JMP GOFWDA / NEXT / GO BACKWARDS FROM GAP TO SRCHP. BUF <= SRCHP <= GAP / 29 CYCLES = 43.5 US PER CHARACTER (8/I) GOREV, 0 TAD SRCHP / GET -STOP ADDRESS CIA DCA GOSTOP TAD SRCHP+1 CIA DCA GOSTOP+1 TAD POINT+1 / SET UP CDF INSTRUCTIONS DCA GOREVP TAD GAP+1 DCA GOREVG GOREVA, TAD GAP / AT STOP POINT? TAD GOSTOP SZA CLA JMP GOREVC TAD GOREVG TAD GOSTOP+1 SZA CLA JMP GOREVC CODFLD / YES, UPDATE POINT AND GAP TAD GOREVP DCA POINT+1 TAD GOREVG DCA GAP+1 JMP I GOREV / DONE GOREVC, STA STL / --POINT TAD POINT DCA POINT SNL JMP GOREVB TAD GOREVP TAD [-10 DCA GOREVP GOREVB, STA STL / --GAP TAD GAP DCA GAP SNL JMP GOREVG TAD GOREVG TAD [-10 DCA GOREVG GOREVG, 0 / MOVE CHAR FROM GAP TO POINT TAD I GAP GOREVP, 0 DCA I POINT JMP GOREVA / COMPUTE NUMBER OF CHARS IN BUFFER, PUT IN AC24 BUFSIZ, 0 TAD [BUFEND JMS I [LD24 TAD [BUF JMS I [SUB15 TAD [POINT JMS I [SUB15 TAD [GAP JMS I [ADD15 JMS I [FIX24 JMP I BUFSIZ /#EB# UPDATE SCREEN, MODE LINE PAGE /------------ 1600 / THESE MARKS MUST BE NEGATIVE AND DISTINCT. THE LSB IS CLEAR FOR EXTENDED / (LINE LONGER THAN SCRWD-1) SMARK=STA / 7777 MARK END OF NORMAL SCREEN LINE SMARKX=STL CLA RAR / 4000 MARK END OF EXTENDED SCREEN LOINE RMARK=STA CLL RTL / 7775 MARK END OF NORMAL REDNER LINE RMARKX=STA CLL RAL / 7776 MARK END OF EXTENDED RENDER LINE RNDBUF=SCRWD^SCRHT / LOCATION OF RENDER BUFFER (ONE SCRWD LINE) RNDEND=RNDBUF+SCRWD / CLEAR RENDER BUFFER, COL = 0 RNDINI, 0 DCA COL TAD (RNDBUF DCA RNDP RMARK DCA RNDMRK JMP I RNDINI / END RENDER LINE RNDFIN, 0 TAD RNDMRK / MARK END SCRFLD DCA I RNDP CODFLD JMP I RNDFIN RNDMRK, 0 / RENDER CURRENT LINE OF TEXT BUFFER TO RENDER BUFFER RENDER, 0 JMS I [RNDINI TAD (-SCRWD DCA RNDLIM RNDA, TAD BUFP / POSSIBLE GAP OR END? TAD RNDESC SNA CLA JMP RNDB RNDFLD, 0 / FETCH CHAR FROM TEXT BUFFER TAD I BUFP ISZ BUFP / UPDATE BUFFER POINTER JMP RNDG DCA RNDTMP TAD RNDFLD TAD [10 DCA RNDFLD TAD RNDTMP RNDG, TAD [-SP / CONTROL CHAR? SCRFLD SPA JMP RNDC TAD [SP / NO, PUT IN BUFFER DCA I RNDP ISZ RNDP ISZ RNDLIM / DID IT FIT? JMP RNDA RNDZ, STA / NO, BACK UP DCA RNDLIM STA TAD RNDP DCA RNDP RMARKX / SET EXTENDED LINE MARK DCA RNDMRK JMP RNDA RNDB, TAD RNDFLG / LOOKING FOR GAP OR END OF BUFFER? SZA CLA JMP RNDE TAD RNDFLD / SKIP OVER GAP? CIA TAD GAP+1 SZA CLA JMP RNDFLD TAD POINT / YES, SKIP OVER GAP DCA BUFP TAD POINT+1 DCA RNDFLD TAD ROW / SAVE CURSOR POSITION DCA CURROW TAD RNDLIM TAD [SCRWD DCA CURCOL ISZ RNDFLG / SET FLAG TO LOOK FOR END OF BUFFER DCA RNDESC TAD BUFP / END OF BUFFER ADDRESS IS 0 SZA CLA JMP RNDFLD RNDE, TAD RNDFLD / END OF BUFFER? CIA TAD BUFEND+1 SZA CLA JMP RNDFLD JMP RNDX / YES, DONE RNDC, TAD (SP-TAB / TAB? SZA JMP RNDF TAD RNDLIM / YES, GET NUMBER OF SPACES TO WRITE TAD [SCRWD AND (7 TAD (7770 DCA RNDTMP RNDD, TAD [SP / NEXT SPACE DCA I RNDP ISZ RNDP ISZ RNDLIM / DID IT FIT? SKP JMP RNDZ ISZ RNDTMP JMP RNDD JMP RNDA RNDF, TAD (TAB-NL / END OF LINE? SNA JMP RNDX TAD (NL+100 / CONTROL CHAR DCA RNDTMP TAD (136 / ^ DCA I RNDP ISZ RNDP ISZ RNDLIM / DID IT FIT? SKP JMP RNDZ TAD RNDTMP / YES, CHAR DCA I RNDP ISZ RNDP ISZ RNDLIM JMP RNDA JMP RNDZ RNDX, JMS I [RNDFIN / MARK END OF BUFFER JMP I RENDER RNDLIM, 0 RNDTMP, 0 PAGE /------------------ 2000 / WRITE RENDERED LINE TO SCREEN. COMPARE TO SCREEN COPY, BE / FRUGAL IN WRITING CHARACTERS TO TTY WRSCR, 0 STA / SCREEN COPY ADDRESS TAD SCRLIN DCA DSTP TAD (RNDBUF-1 / RENDER BUF DCA SRCP DCA WRFLAG / FLAG = FALSE SCRFLD WRSCRA, TAD I SRCP / FAST SCAN FOR MISMATCH CIA / END OF LINE IS ALWAYS A MISMATCH TAD I DSTP SNA CLA JMP WRSCRA TAD SRCP / RECOVER POINTERS DCA RNDP TAD DSTP DCA SCRP TAD RNDP / RECOVER COL TAD (-RNDBUF DCA COL TAD I RNDP / END OF BOTH? AND I SCRP SPA CLA JMP WRSCRX / YES, CHECK EXTENDED CODFLD / SOME DIFFERENCE JMS SETCUR / SET CURSOR TO BEGIN FIXING WRSCRD, SCRFLD TAD I RNDP / END OF SCREEN LINE, CMA / AND NOT END OF RENDER LINE? AND I SCRP SPA CLA ISZ WRFLAG / YES, SET FLAG TAD I RNDP / END OF RENDERED LINE? SPA JMP WRSCRC DCA I SCRP / NO, UPDATE SCREEN TAD I RNDP CODFLD JMS I [WRTTY ISZ RNDP ISZ SCRP JMP WRSCRD WRSCRC, CLA TAD I RNDP / END OF RENDERED LINE, EXTENDED? RAR SZL CLA JMP WRSCRB TAD (76 / YES, SET EXTENDED MARKS JMS I [WRTTY ISZ WRFLAG / PREVENT CLEAR TO EOL SMARKX JMP WRSCRE WRSCRB, SMARK / END OF RENDERED LINE, MARK SCREEN WRSCRE, DCA I SCRP CODFLD TAD WRFLAG / CLEAR TO END OF LINE IF NECESSARY SZA CLA JMP I WRSCR TAD (CLREOL JMS I [WRSTR WRTTY JMP I WRSCR WRSCRX, TAD I RNDP / NO CHANGES SO FAR, EXTENDED BITS AGREE? TAD I SCRP CODFLD RAR SNL CLA JMP I WRSCR JMS SETCUR / SET CURSOR SCRFLD / FIX END OF LINE JMP WRSCRC CLREOL, ESC; LBRAK; "K; 0 WRFLAG, 0 / ZERO MEANS OLD LINE LONGER THAN NEW / NEXT SCREEN ROW. SKIP IF NO CHARACTERS WAITING NXTROW, 0 ISZ ROW TAD SCRLIN TAD [SCRWD DCA SCRLIN KSF ISZ NXTROW JMP I NXTROW / UPDATE SCREEN UPDATE, 0 JMS SETTOS / SET TOP OF SCREEN DCA SCRLIN / INITIALIZATIONS DCA SCRP DCA ROW DCA RNDFLG / START BEFORE GAP TAD GAP CIA DCA RNDESC TAD TOS / BUFP = TOS DCA BUFP TAD TOS+1 DCA RNDFLD UPDA, JMS RENDER / RENDER AND WRITE TEXT BUFFER JMS WRSCR JMS NXTROW JMP UPDB TAD ROW TAD (-TXTHT / LEAVE ROOM FOR STATUS LINES SZA CLA JMP UPDA JMS RMODE / RENDER AND WRITE MODE LINE JMS WRSCR JMS NXTROW JMP UPDB JMS RNDMLT JMS WRSCR TAD CURROW / SET CURSOR AT POINT DCA ROW TAD CURCOL DCA COL JMS SETCUR UPDB, JMP I UPDATE |
> > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | E8 COMMANDS ^@ ^SP Set Mark ^A ALT-A Go line begin ^B Go back 1 ^D Del next char ^E ALT-E Go line end ^F Go forward 1 ^H BS Del prev char ^I TAB Insert TAB ^J LF Insert CR, TAB ^K Kill to EOL ^L Redraw aLign ^M CR Insert CR ^N Go next line ^O Open line ^P Go prev line ^Q Insert "quoted" ^S Search ALT-S Search ^V View next screen ALT-V View prev screen ^\ Scroll up ALT-\ Scroll down ^W Wipe to CLIP.E8 ALT-W Write to CLIP.E8 no wipe ^Y Yank from CLIP.E8 ^Z Exit to OS/8 ALT-% Query-repl ALT-< Go buf start ALT-> Go buf end ALT-B Back 1 word ALT-D Del next word ALT-F Forward 1 word ALT-H Del prev word ALT-BS Del prev word ALT-N Search next ALT-Q Insert as CTRL (ALT-QA inserts ^A.) ALT-R Recover deleted chars ^X^F ^XF Open file ^X^I or ^XI Insert file ^X^R ^XR Read more of large file ^X^S ^XS Save file ^X^W or ^XW Write file, new name ^X^X ^XX Exchange mark and cur |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 | / E8FILE PAGE /-------------------------- 2200 / RENDER MODE LINES RMODE, 0 JMS I [RNDINI / BASE MODE LINE TAD (MLBASE JMS I [WR6 WRRND JMS I [RNDFIN TAD CHANGD / INDICATE BUFFER CHANGED SNA CLA JMP RMODEB TAD (RNDBUF+1 DCA RNDP TAD (CHGMSG JMS I [WR6 WRRND RMODEB, TAD (RNDBUF+5 / FILE NAME DCA RNDP TAD FILENM+3 / SAVE EXTENSION DCA RMODET DCA FILENM+3 TAD (FILENM JMS I [WR6 WRRND TAD (DOT JMS I [WRRND TAD RMODET DCA FILENM+3 TAD (FILENM+3 JMS I [WR6 WRRND JMS BUFSIZ / BUFFER SIZE IN AC24 TAD (RNDBUF+23 / POINTER TO LSD OF DECIMAL SIZE DCA RNDP RMODEA, TAD (12 / WRITE DECIMAL TO RENDER BUFFER JMS I [DIVIDE / IN REVERSE. WORKS FOR SIZE < 100000 TAD AC24+1 TAD (ZERO SCRFLD DCA I RNDP CODFLD STA TAD RNDP DCA RNDP DCA AC24+1 TAD AC24 SZA CLA JMP RMODEA JMP I RMODE RMODET, 0 MLBASE, TEXT /---- / CHGMSG, TEXT /**/ / 24-BIT ARITHMETIC. ALL BINARY OPS USE AC24 AND TWO-WORD VALUE / POINTED T0 BY WORD FOLLOWING JMS. 24-BIT DOUBLEWORDS ARE / LITTLE-ENDIAN, OF COURSE. P24, 0 / CLEAR 24-BIT ACCUMULATOR CLR24, 0 DCA AC24 DCA AC24+1 JMP I CLR24 / LOAD 24-BIT ACCUMULATOR LD24, 0 DCA P24 TAD I P24 DCA AC24 ISZ P24 TAD I P24 DCA AC24+1 JMP I LD24 /STORE 24-BIT ACCUMULATOR ST24, 0 DCA P24 TAD AC24 DCA I P24 ISZ P24 TAD AC24+1 DCA I P24 JMP I ST24 / ADD A 15-BIT POINTER TO AC24, WHICH HOLDS THE RESULT OF / A SUB15 OPERATION, TO YIELD A 15-BIT POINTER ADD15, 0 DCA P24 CLL TAD AC24 TAD I P24 DCA AC24 ISZ P24 RTL; RTL TAD AC24+1 TAD I P24 DCA AC24+1 JMP I ADD15 / SUBTRACT TWO 15-BIT POINTERS TO YIELD A DIFFERENCE THAT CAN / BE ADDED TO A 15-BIT POINTER, OR FIX24 TO GET A PROPER / 15-BIT INTEGER. SUB15, 0 DCA P24 TAD I P24 CLL CIA TAD AC24 DCA AC24 ISZ P24 TAD I P24 CMA SNL TAD [-10 IAC TAD AC24+1 DCA AC24+1 JMP I SUB15 PAGE /-------------------------- 2400 / FIX AC24 FOR 15-BIT POINTER SUBTRACTIONS THAT YIELD NON-NEGATIVE / RESULTS FIX24, 0 TAD AC24+1 CLL RTR; RAR DCA AC24+1 JMP I FIX24 / WRITE CHAR IN AC TO RENDER BUFFER IF IT FITS WRRND, 0 SCRFLD DCA I RNDP CODFLD TAD RNDP TAD (-RNDEND+1 SZA CLA ISZ RNDP JMP I WRRND /#EC# SCREEN AND MODE LINE TEXT FUNCTIONS HALFHT=TXTHT%2 / SET TOP OF SCREEN. SEARCH BACK LINES FROM POINT UNTIL / * FIND LINE CURRENTLY AT TOS. DONE, NO CHANGE / * REACH BEGINNING OF BUFFER. SET TOS THERE. / * MOVED SCRHT LINES, TOS NOT ON SCREEN, SET TOS / TO HALF OF SCRHT LINES BEFORE POINT SETTOS, 0 TAD BUF / DEFAULT TOS IS BEGINNING OF BUFFER DCA NEWTOS TAD BUF+1 DCA NEWTOS+1 JMS I [SREVGP DCA TOSN / ZERO LINE COUNT TOSA, TAD [NL / SEARCH BACK FOR NL JMS I [SREV JMP TOSD TAD [SRCHP / IF WE FOUND THE TOS, WE'RE DONE JMS I [INC15 TAD [SRCHP JMS I [SNE15; TOS JMP I SETTOS ISZ TOSN / UPDATE LINE COUNT TAD TOSN / SAVE A GOOD TOS IF WE NEED IT TAD (-HALFHT SZA CLA JMP TOSB TAD SRCHP DCA NEWTOS TAD SRCHP+1 DCA NEWTOS+1 TOSB, TAD TOSN / GONE BACK SCRHT LINES? TAD (-TXTHT SNA CLA JMP TOSC TAD [SRCHP / NO, UNDO THE INC15 AND KEEP LOOKING JMS I [DEC15 JMP TOSA TOSD, TAD (TOS / COULDN'T FIND ANY NL, TOS ALREADY JMS I [SNE15; BUF JMP I SETTOS / YES, DONE TOSC, TAD NEWTOS / SET NEW TOS DCA TOS TAD NEWTOS+1 DCA TOS+1 JMP I SETTOS TOSN, 0 NEWTOS, 0; 0 / FORWARD ONE SCREEN. FWDSCR, 0 TAD CURROW / COMPUTE NUMBER OF LINES TO MOVE TAD (-TXTHT-HALFHT+1 DCA TOSN JMS I [SFWDPT FWSCA, TAD [NL / NEXT LINE JMS I [SFWD JMP FWSCB TAD [SRCHP / SKIP OVER NL JMS I [INC15 ISZ TOSN / MOVED FAR ENOUGH? JMP FWSCA JMS I [GOFWD / YES, GO THERE FWSCC, ISZ FWDSCR JMP I FWDSCR FWSCB, TAD TOSN / NO NL, IF CURRENT LINE IS NOT TAD (HALFHT-1 / ON SCREEN, MOVE TO END SPA CLA JMP I FWDSCR JMS I [GOEND FAIL JMP FWSCC / REVERSE ONE SCREEN REVSCR, 0 TAD CURROW / COMPUTE NUMBER OF LINES TO MOVE CIA TAD (-HALFHT-1 DCA TOSN JMS I [SREVGP RVSCA, TAD [NL / PREVIONS LINE JMS I [SREV JMP RVSCB ISZ TOSN / MOVED FAR ENOUGH? JMP RVSCA TAD [SRCHP / YES, SKIP OVER NL JMS I [INC15 JMS I [GOREV / GO THERE RVSCC, ISZ REVSCR JMP I REVSCR RVSCB, TAD (TOS / CAN'T FIND NL, TOS == BUF? JMS I [SNE15; BUF JMP I REVSCR JMS I [GOBEG / YES, GO TO BEGINNING FAIL JMP RVSCC PAGE /-------------------------- 2600 / SKIP IF AC IS ALPHANUMERIC SKIPAN, 0 JMS I [UPPER DCA SKANCH TAD SKANCH TAD (-60 / NUMERIC? SPA CLA JMP SKNAB TAD SKANCH TAD (-72 SPA CLA JMP SKANA SKNAB, TAD SKANCH / NO, ALPHA? TAD (-101 SPA CLA JMP I SKIPAN TAD SKANCH TAD (-133 SPA CLA SKANA, ISZ SKIPAN JMP I SKIPAN SKANCH, 0 / CONVERT 6-BIT ASCII TO 8-BIT CV68, 0 TAD [SP AND [77 TAD [SP JMP I CV68 / WRITE 6-BIT STRING TO SUBROUTINE WR6, 0 DCA WR6P TAD I WR6 ISZ WR6 DCA WR6SUB WR6A, TAD I WR6P / FIRST CHAR RTR; RTR; RTR AND [77 SNA JMP I WR6 JMS CV68 JMS I WR6SUB TAD I WR6P / SECOND CHAR AND [77 SNA JMP I WR6 JMS CV68 JMS I WR6SUB ISZ WR6P JMP WR6A WR6P, 0 WR6SUB, 0 / ERASE SCREEN, SET TOS SO THAT CURSOR IS IN MIDDLE OF SCREEN REDRAW, 0 JMS I [SCINIT / ERASE TAD (HALFHT / MOVE TOS JMS MOVTOS ISZ REDRAW JMP I REDRAW MOVTOS, 0 CMA DCA MVTSN JMS I [SREVGP MVTSA, TAD [NL / BACK HALF-SCREEN OF LINES JMS I [SREV JMP MVTSB ISZ MVTSN JMP MVTSA TAD [SRCHP / SKIP OVER NL JMS I [INC15 TAD SRCHP / SET TOS DCA TOS TAD SRCHP+1 DCA TOS+1 JMP I MOVTOS MVTSB, TAD BUF / NL NOT FOUND, TOS = BUF DCA TOS TAD BUF+1 DCA TOS+1 JMP I MOVTOS MVTSN, 0 / DELETE CHARS FROM POINT TO END OF LINE. IF NONE, DELETE / NL. FAILS IF NOTHING WAS DELETED (AT END OF BUFFER) KEOL, 0 JMS I [SFWDPT / FIND EOL TAD [NL JMS I [SFWD JMP KEOLA TAD [POINT / IF AT EOL, DELETE THE NL JMS I [SNE15; SRCHP SKP JMP KEOLC TAD [SRCHP JMS I [INC15 KEOLC, TAD SRCHP / DO THE DELETE DCA POINT TAD SRCHP+1 DCA POINT+1 KEOLB, ISZ KEOL / NORMAL RETURN, SET CHANGED STA DCA CHANGD JMP I KEOL KEOLA, TAD [POINT / LAST LINE, ANYTHING TO DELETE? JMS I [SNE15; BUFEND JMP I KEOL TAD BUFEND / YES, DO IT DCA POINT TAD BUFEND+1 DCA POINT+1 JMP KEOLB PAGE /-------------------------- 3000 / MODE LINE TEXT MLTP, 0 / CLEAR MLT CLRMLT, 0 TAD (MLTBUF DCA MLTP DCA I MLTP JMP I CLRMLT / WRITE CHARACTER TO MLT, IGNORE IF BUFFER FULL WRMLT, 0 DCA I MLTP TAD MLTP TAD (-MLTEND+1 SZA CLA ISZ MLTP DCA I MLTP JMP I WRMLT / ERASE CHARACTER FROM MLT, IGNORE IF BUFFER EMPTY ERMLT, 0 TAD MLTP TAD (-MLTBUF SNA CLA JMP I ERMLT STA TAD MLTP DCA MLTP DCA I MLTP JMP I ERMLT / RENDER MLT. MUST FIT, OVERFLOW NOT CHECKED RNDMLT, 0 JMS I [RNDINI TAD (MLTBUF DCA MLTP RMLTA, TAD I MLTP / RENDER EACH CHAR SNA JMP RMLTB TAD [-SP / CONTROL CHAR? SMA CLA JMP RMLTC TAD (136 JMS I [WRRND TAD (100 RMLTC, TAD I MLTP JMS I [WRRND ISZ MLTP JMP RMLTA RMLTB, JMS I [RNDFIN JMP I RNDMLT /#ED# FILE INPUT / OS/8 USER SERVICE ROUTINE DEFS USR=7700 FETCH=1 LOOKUP=2 ENTER=3 CLOSE=4 RESET=13 / FIND FILE FFILE, 0 JMS I [GETFIL / GET FILENAME JMP I FFILE JMS CLRBUF / GOT ONE, CLEAR BUFFER JMP I FFILE / USER ABORTED SAVE OFFER JMS I [SETFN / ACTIVE FILENAME = ENTERED NAME TAD (FILEEN / LOOKUP FILE JMS I [LUFILE JMP FFNEW JMS I [INSFIL / EXISTS, INSERT JMP FFERR FFILEA, DCA CHANGD / SET BUFFER NOT CHANGED JMS I [GOBEG / BEGINNING OF FILE FAIL ISZ FFILE JMP I FFILE FFNEW, JMS I [CLRMLT / FILE NOT FOUND, NEW ONE TAD (NEWMSG JMS I [WR6 WRMLT ISZ MLHOLD JMP FFILEA FFERR, JMS I [CLRFN / ERROR (BUFFER FULL) DON'T LET JMP I FFILE / USER ACCIDENTALLY WRITE PARTIAL FILE / INSERT FILE AT POINT INFILE, 0 JMS I [GETFIL / GET FILENAME JMP I INFILE TAD (FILEEN / LOOK FOR IT JMS I [LUFILE JMP INFLN JMS I [INSFIL / INSERT SKP ISZ INFILE JMP I INFILE INFLN, TAD (NFMSG / FILE MUST BE FOUND JMS I [WR6 WRMLT ISZ MLHOLD JMP I INFILE / CLEAR BUFFER, SKIP IF NOT QUIT CLRBUF, 0 JMS I [OFFER JMP I CLRBUF ISZ CLRBUF TAD BUF DCA GAP TAD BUF+1 DCA GAP+1 TAD BUFEND DCA POINT TAD BUFEND+1 DCA POINT+1 JMP I CLRBUF / CONVERT CHAR IN AC TO UPPER CASE, A LITTLE TOO AGRESSIVELY SINCE / THE SYMBOLS >= 140 ARE ALSO AFFECTED UPPER, 0 TAD (-140 SPA TAD [SP TAD (100 JMP I UPPER PAGE /-------------------------- 3200 / INSERT ONE CHAR, SKIP IF NOT ^Z AND THE CHAR FITS. IGNORE LF INSF1, 0 TAD (-32 / ^Z? SNA JMP I INSF1 TAD (32-LF / LF? SNA JMP INSF1A TAD (LF JMS I [INSERT / OK TO INSERT JMP INSF1B INSF1A, ISZ INSF1 JMP I INSF1 INSF1B, ISZ MOREOK JMP I INSF1 MOREOK, 0 / BUFFER FULL, MORE TO READ / CLEAR ACTIVE FILENAME CLRFN, 0 DCA FILENM DCA FILENM+3 JMP I CLRFN / SKIP IF THERE IS AN ACTIVE FILENAME HAVEFN, 0 TAD FILENM SZA CLA ISZ HAVEFN JMP I HAVEFN / INSERT PREVIOUSLY LOOKED UP FILE AT POINT, SKIP IF OK INSFIL, 0 TAD FILLOC DCA FILBLK DCA MOREOK INSFA, JMS I DSKEP / NEXT BLOCK 200 FILBUF, IOBUF FILBLK, 0 JMP INSFER ISZ FILBLK / UPDATE BLOCK NUMBER TAD (-200 / PROCESS CHARACTERS DCA INSFN TAD FILBUF DCA INSFP INSFC, TAD I INSFP / CHAR 1 AND (177 JMS INSF1 JMP INSFB TAD I INSFP / SAVE HIGH NIBBLE OF CHAR 3 AND (3400 CLL RTR; RTR DCA INSFT ISZ INSFP / CHAR 2 TAD I INSFP AND (177 JMS INSF1 JMP INSFB TAD I INSFP / CHAR 3 RTL; RTL; RAL AND (17 TAD INSFT JMS INSF1 JMP INSFB ISZ INSFP ISZ INSFN JMP INSFC ISZ FILSIZ JMP INSFA INSFB, TAD [POINT / DISTINGUISH EOF FROM BUFFER FULL JMS I [SNE15; GAP / EOF SKIPS, BUFFER FULL DOESN'T SKP ISZ INSFIL JMP I INSFIL INSFER, SMA CLA / I/O ERROR, SHOW MESSAGE TAD (INSE2-INSE1 / SHOUDN'T GET NON-FATAL TAD (INSE1 JMS I [WR6 WRMLT ISZ MLHOLD JMP I INSFIL INSFP, 0 INSFN, 0 INSFT, 0 / LOOKUP FILE, AC->NAME, SKIP IF FOUND LUFILE, 0 DCA FILLOC TAD DEVNUM CIF 10 JMS I [USR LOOKUP FILLOC, 0 FILSIZ, 0 SKP ISZ LUFILE JMP I LUFILE / INITIALIZE FILE I/O, SKIP IF OK IOINIT, 0 CIF 10 / TELL OS/8 NO DEVICE HANDLERS IN CORE JMS I [USR RESET 0 CIF 10 / FETCH DISK HANDLER JMS I [USR FETCH DEVNUM=.+1 DEVICE DSK DEVEP, 7201 JMP I IOINIT TAD DEVEP DCA DSKEP ISZ IOINIT JMP I IOINIT PAGE /-------------------------- 3400 / GET FILE NAME, SKIP IF NOT QUIT GETFIL, 0 GETFR, JMS I [CLRMLT / PROMPT IN MODE LINE TEXT (MLT) TAD (GFMSG JMS I [WR6 WRMLT JMS I [UPDATE DCA FILEEN / CLEAR NAME TO BE ENTERED DCA FILEEN+1 DCA FILEEN+2 DCA FILEEN+3 TAD (FILEEN DCA FILEP / SEE COMMENTS BELOW DCA FILEX DCA FILEH GETFA, JMS I [RDTTY / READ NEXT CHAR DCA GETFCH TAD GETFCH / QUIT? TAD (-BELL SNA CLA JMP I GETFIL GETFE, TAD GETFCH TAD (-CR / END OF ENTRY? SNA CLA JMP GETFB TAD GETFCH / ERASE? TAD [-10 SNA CLA JMP GETFR TAD GETFCH / DOT? TAD (-56 SZA CLA JMP GETFD TAD FILEX / YES DOT, IN EXTENSION MODE? SZA CLA JMP GETFER TAD FILEEN / NO, ANY NAME CHARACTERS? SNA CLA JMP GETFER ISZ FILEX / YES, OK TO SWITCH TO EXTENSION MODE TAD (FILEEN+3 DCA FILEP DCA FILEH JMP GETFC GETFD, TAD FILEX / NOT DOT, TOO MANY CHARACTERS? SZA CLA JMP .+3 TAD FILEEN+2 SKP TAD FILEEN+3 AND [77 SZA CLA JMP GETFER TAD GETFCH / CONVERT TO UPPERCASE JMS I [UPPER DCA GETFCH TAD GETFCH / ALPHANUMERIC? JMS I [SKIPAN JMP GETFER TAD FILEH / CHAR OK, INSERT IN FILENAME SZA CLA JMP GETFG TAD GETFCH / LEFT HALF AND [77 CLL RTL; RTL; RTL DCA I FILEP ISZ FILEH JMP GETFC GETFG, TAD GETFCH / RIGHT HALF AND [77 TAD I FILEP DCA I FILEP DCA FILEH ISZ FILEP GETFC, TAD GETFCH JMS I [WRMLT JMS I [UPDATE JMP GETFA GETFER, TAD [BELL / ERROR, IGNORE CHARACTER JMS I [WRTTY JMP GETFA GETFB, TAD FILEEN / GOT CR, ANY NAME ENTERED? SNA CLA JMP GETFER ISZ GETFIL JMP I GETFIL / MAKE ENTERED FILENAME CURRENT SETFN, 0 TAD FILEEN DCA FILENM TAD FILEEN+1 DCA FILENM+1 TAD FILEEN+2 DCA FILENM+2 TAD FILEEN+3 DCA FILENM+3 JMP I SETFN GETFCH, 0 / CHARACTER BEING ENTERED FILEP, 0 / POINTER INTO FILEEN FILEX, 0 / NON-ZERO IF WORKING ON FILE EXTENSION FILEH, 0 / NON-ZERO IF INSERTING INTO RIGHT HALF FILEEN, ZBLOCK 4 / ENTER NEW NAME HERE FILENM, ZBLOCK 5 / FILE OF CURRENT BUFFER, DISPLAYED IN MODE LINE / ONE EXTRA FOR RMODE PAGE /-------------------------- 3600 / DIVIDE AC24 BY AC, QUOTIENT TO AC24, REMAINDER TO AC24+1 / ASSUME NO OVERFLOW DIVIDE, 0 CIA / NEGATE DIVISOR FOR SHIFT/SUBTRACT DCA DIVSR TAD (-15 / LOOP COUNT DCA DIVCNT CLL JMP DIVB DIVA, TAD AC24+1 RAL DCA AC24+1 TAD AC24+1 TAD DIVSR SZL DCA AC24+1 CLA DIVB, TAD AC24 RAL DCA AC24 ISZ DIVCNT JMP DIVA JMP I DIVIDE DIVSR, 0 DIVCNT, 0 /#EE# FILE OUTPUT / COUNT NL CHARS FROM POINT TO WREND ADD RESULT TO WRFSIZ NLFWD, 0 JMS I [SFWDPT NLFWDA, TAD [NL / NEXT NL JMS I [SFWD JMP I NLFWD TAD [SRCHP / SRCHP < WREND? JMS I [LD24 TAD WREND JMS I [SUB15 TAD AC24+1 SMA CLA JMP I NLFWD ISZ WRFSIZ / YES, ADD 1 SKP ISZ WRFSIZ+1 TAD [SRCHP / SKIP OVER NL JMS I [INC15 JMP NLFWDA / COUNT NL CHARS FROM GAP TO WRBEG ADD RESULT TO WRFSIZ NLREV, 0 JMS I [SREVGP NLREVA, TAD [NL / NEXT NL JMS I [SREV JMP I NLREV TAD [SRCHP / SRCHP >= WRBEG? JMS I [LD24 TAD WRBEG JMS I [SUB15 TAD AC24+1 SPA CLA JMP I NLREV ISZ WRFSIZ / YES, ADD 1 SKP ISZ WRFSIZ+1 JMP NLREVA / COMPUTE SIZE OF ZONE IN OS/8 BLOCKS (256 WORDS) WRFBLK, 0 TAD [GAP / NUM CHARS IN ZONE JMS I [LD24 TAD WRBEG JMS I [SUB15 TAD WREND JMS I [ADD15 TAD [POINT JMS I [SUB15 JMS I [FIX24 TAD (WRFSIZ JMS I [ST24 JMS NLFWD / ADD EXTRA FOR NL CHARS JMS NLREV TAD (WRFSIZ / ROUND UP TO NUMBER OF BLOCKS JMS I [LD24 TAD (600 JMS I [DIVIDE TAD AC24 IAC DCA WRSIZE JMP I WRFBLK WRFSIZ, 0; 0 / SIZE OF ZONE INCLUDING EXTRA NL CHARS AND ^Z AT END / ENTER TENTATIVE OUTPUT FILE, SKIP IF OK. AC CONTAINS / NUMBER OF 256-WORD BLOCKS TO BE WRITTEN. INITIALIZE / SOME CLFILE AND PACK VARIABLES ENFILE, 0 TAD WRNAME DCA ENLOC TAD WRSIZE IAC / ONE MORE TO BE SAFE CLL RTL; RTL TAD DEVNUM CIF 10 JMS I [USR ENTER ENLOC, 0 ENSIZ, 0 JMP I ENFILE TAD ENLOC DCA PACKBL DCA CLSIZ ISZ ENFILE JMP I ENFILE PAGE /-------------------------- 4000 / CLOSE OUTPUT FILE AND MAKE PERMANENT, SKIP IF OK. CLFILE, 0 TAD WRNAME DCA CLNAME TAD DEVNUM CIF 10 JMS I [USR CLOSE CLNAME, 0 CLSIZ, 0 SKP ISZ CLFILE JMP I CLFILE / PACK CHARACTERS INTO IOBUF. IF FULL, WRITE IT OUT. SKIP IF OK. / THREE CHARS IN TWO WORDS, OS/8 ASCII FILE FORMAT PACK, 0 DCA PACKCH TAD PACKX SZA JMP PACKA TAD PACKCH / CHAR 0 DCA PACK0 ISZ PACKX JMP PACKC PACKA, SPA CLA JMP PACKB TAD PACKCH / CHAR 1 DCA PACK1 STA DCA PACKX JMP PACKC PACKB, TAD PACKCH / CHAR 2 AND (360 CLL RTL; RTL TAD PACK0 DCA I PACKP ISZ PACKP TAD PACKCH AND (17 CLL RTR; RTR; RAR TAD PACK1 DCA I PACKP ISZ PACKP DCA PACKX TAD PACKP / END OF IOBUF? TAD (-IOBUFE SZA CLA JMP PACKC ISZ ENSIZ / OVERWRITE BUG? SKP JMP I PACK JMS I DSKEP / YES, WRITE BLOCK 4200 / WRITE 1 BLOCK PACKIO, IOBUF PACKBL, 0 JMP I PACK ISZ PACKBL / UPDATE BLOCK NUMBER ISZ CLSIZ / UPDATE FILE SIZE TAD PACKIO / RESET POINTER DCA PACKP PACKC, ISZ PACK JMP I PACK PACKCH, 0 / CHAR TO PACK PACKX, 0 / TRISTATE: 0 CHAR 1, 1 CHAR 2, -1 CHAR 3 PACK0, 0 / PACKED WORD 0 PACK1, 0 / PACKED WORD 1 PACKP, 0 / -> PLACE IN IOBUF / SAVE FILE COMMAND. SVFILE, 0 TAD [BUF / WRBEG = BUF DCA WRBEG TAD [BUFEND / WREND = BUFEND DCA WREND TAD (FILENM / WRITE TO ACTIVE FILE DCA WRNAME JMS HAVEFN / HAVE ACTIVE FILE? SKP JMP SVFLA JMS I [GETFIL / NO, GET FILENAME JMP I SVFILE / USER QUITS JMS I [SETFN / SET ACTIVE FILE SVFLA, JMS I [WRITEF / WRITE THE FILE JMP I SVFILE DCA CHANGD / BUFFER NOT CHANGED TAD WRSIZE / DIAGNOSTIC DISPLAY OF PREDICTED JMS I [WRDEC / AND ACTUAL NUMBER OF BLOCKS WRITTEN WRMLT TAD (COMMA JMS I [WRMLT TAD CLSIZ JMS I [WRDEC WRMLT ISZ MLHOLD ISZ SVFILE JMP I SVFILE / WRITE BUFFER TO NEW FILE NAME WRFILE, 0 JMS I [CLRFN JMS SVFILE SKP ISZ WRFILE JMP I WRFILE PAGE /-------------------------- 4200 / WRITE ZONE WRBEG,WREND TO FILE WRNAME. SKIP IF OK WRITEF, 0 TAD PACKIO / INITIALIZE PACK DCA PACKP DCA PACKX JMS WRFBLK / GET FILE SIZE JMS ENFILE / ENTER TENTATIVE FILE JMP NOENTR TAD I WRBEG / SRCHP = WRBEG DCA SRCHP ISZ WRBEG TAD I WRBEG DCA SRCHP+1 STA TAD WRBEG DCA WRBEG WRFLA, TAD [GAP / SKIP OVER GAP? JMS I [SNE15; SRCHP JMP WRFLGP WRFLF, TAD WREND / AT END OF ZONE? JMS I [SNE15; SRCHP JMP WRFLEZ TAD [SRCHP / WRITE NEXT CHARACTER JMS I [GET15 TAD (-NL SNA JMP WRFNL TAD [NL JMS PACK JMP NOPACK JMP WRFLB WRFNL, TAD (CR / WRITE NEW LINE JMS PACK JMP NOPACK TAD (LF JMS PACK JMP NOPACK WRFLB, TAD [SRCHP / NEXT CHARACTER JMS I [INC15 JMP WRFLA WRFLGP, TAD POINT / SKIP OVER GAP DCA SRCHP TAD POINT+1 DCA SRCHP+1 JMP WRFLF WRFLEZ, TAD (32 / WRITE ^Z JMS PACK JMP NOPACK WRFLC, TAD PACKP / ZERO REST OF IOBUF AND WRITE IT TAD (-IOBUF SZA CLA JMP WRFLG TAD PACKX SNA CLA JMP WRFLD WRFLG, JMS PACK JMP NOPACK JMP WRFLC WRFLD, JMS CLFILE / CLOSE FILE JMP NOCLOS ISZ WRITEF JMP I WRITEF NOENTR, TAD (NOEMSG JMP WRFLE NOPACK, DCA CLSIZ / ATTEMPT TO DELETE FILE JMS CLFILE NOP TAD (NOPMSG JMP WRFLE NOCLOS, TAD (NOCMSG WRFLE, JMS I [WR6 WRMLT ISZ MLHOLD JMP I WRITEF / OFFER TO SAVE CHANGED FILE OFFER, 0 TAD CHANGD SNA CLA JMP OFFERN JMS I [CLRMLT / CHANGED, PROMPT FOR OPTION TAD (SAVMSG JMS I [WR6 WRMLT JMS I [UPDATE OFFERA, JMS I [RDTTY TAD (-131 / Y? ("Y HAS PARITY BIT SET) SNA JMP OFFERY TAD (131-116 / N? SNA JMP OFFERN TAD (116-BELL / ^G? SNA CLA JMP I OFFER TAD [BELL / YES, QUIT RETURN JMS I [WRTTY JMP OFFERA OFFERY, JMS SVFILE / Y, SAVE FILE SKP OFFERN, ISZ OFFER JMP I OFFER PAGE /-------------------------- 4400 / KEEP MARK IN LEGAL POSITION AS POINT CROSSES MARK FIXMRK, 0 TAD MKFLAG SZA CLA JMP FXMKA TAD (MARK / MARK AT OR BEFORE GAP? JMS I [LD24 TAD [GAP JMS I [SUB15 TAD AC24+1 SPA CLA JMP FXMKX / YES, ALL SET TAD [POINT / NO, FIX IT JMS I [ADD15 TAD (MARK JMS I [ST24 ISZ MKFLAG TAD [BUFEND / BEYOND END OF BUFFER? JMS I [LD24 TAD (MARK JMS I [SUB15 TAD AC24+1 SMA CLA JMP FXMKX TAD BUFEND / YES, SET TO END DCA MARK TAD BUFEND+1 DCA MARK+1 JMP FXMKX FXMKA, TAD (MARK / MARK AT OR AFTER POINT? JMS I [LD24 TAD [POINT JMS I [SUB15 TAD AC24+1 SMA CLA JMP FXMKX / YES, ALL SET TAD [GAP / NO, FIX IT JMS I [ADD15 TAD (MARK JMS I [ST24 DCA MKFLAG TAD (MARK / BEYOND BEGINNING OF BUFFER? JMS I [LD24 TAD [BUF JMS I [SUB15 TAD AC24+1 SMA CLA JMP FXMKX TAD BUF / YES, SET TO BEGINNING DCA MARK TAD BUF+1 DCA MARK+1 FXMKX, JMP I FIXMRK / SET MARK TO POINT SETPM, 0 TAD POINT DCA MARK TAD POINT+1 DCA MARK+1 CLA IAC DCA MKFLAG JMP I SETPM / SET MARK TO POINT COMMAND SETMRK, 0 JMS SETPM TAD (MRKMSG JMS I [WR6 WRMLT ISZ MLHOLD ISZ SETMRK JMP I SETMRK / EXCHANGE POINT AND MARK EXGPM, 0 ISZ EXGPM TAD MARK / GET SET TO MOVE POINT TO MARK DCA SRCHP TAD MARK+1 DCA SRCHP+1 TAD MKFLAG / WHICH DIRECTION? SZA CLA JMP EXGPMA TAD POINT / REVERSE DCA MARK TAD POINT+1 DCA MARK+1 JMS I [GOREV ISZ MKFLAG JMP I EXGPM EXGPMA, TAD GAP DCA MARK TAD GAP+1 DCA MARK+1 JMS I [GOFWD / FORWARD DCA MKFLAG JMP I EXGPM |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 | /#EF# REGIONS, SEARCH / SAVE (CLIP.E8) AND DELETE REGION DELREG, 0 JMS WRREG / SAVE IT JMP I DELREG ISZ DELREG STA / BUFFER IS GOING TO CHANGE DCA CHANGD TAD MKFLAG / MARK BEFORE OR AFTER POINT? SZA CLA JMP DLRGA TAD MARK / BEFORE, GAP = MARK DCA GAP TAD MARK+1 DCA GAP+1 JMP I DELREG DLRGA, TAD MARK / AFTER, POINT = MAK DCA POINT TAD MARK+1 DCA POINT+1 JMP I DELREG PAGE /-------------------------- 4600 / WRITE REGION AND SKIP IF NOT EMPTY. WRREG, 0 TAD MKFLAG SZA CLA JMP WRREGA TAD (MARK / MARK BEFORE GAP, NULL REGION? JMS I [SNE15; GAP JMP WRREGN TAD (MARK / NO, WRITE BEFORE GAP DCA WRBEG TAD [POINT DCA WREND JMP WRREGB WRREGA, TAD (MARK / MARK AFTER POINT, NULL REGION? JMS I [SNE15; POINT JMP WRREGN TAD [GAP / NO, WRITE AFTER POINT DCA WRBEG TAD (MARK DCA WREND WRREGB, TAD (TEMPFN / WRITE TO CLIP.E8 DCA WRNAME JMS I [WRITEF SKP ISZ WRREG JMP I WRREG WRREGN, TAD (NRMSG / NULL REGION, SHOW MESAGE JMS I [WR6 WRMLT ISZ MLHOLD JMP I WRREG TEMPFN, FILENAME CLIP.E8 / INSERT SAVED REGION YANK, 0 TAD (TEMPFN / LOOK FOR IT JMS I [LUFILE JMP I YANK JMS I [INSFIL / INSERT SKP ISZ YANK JMP I YANK / SET SCREEN CURSOR USING ROW, COL SETCUR, 0 TAD (ESC JMS I [WRTTY TAD (LBRAK JMS I [WRTTY TAD ROW IAC JMS I [WRDEC WRTTY TAD (SEMI JMS I [WRTTY TAD COL IAC JMS I [WRDEC WRTTY TAD ("H&177 JMS I [WRTTY JMP I SETCUR / IF BUFFER FILLED WHEN READING, READ MORE RDMORE, 0 TAD MOREOK SNA CLA JMP I RDMORE STA TAD FILBLK DCA FILLOC JMS CLRBUF JMP I RDMORE JMS I [INSFIL NOP ISZ RDMORE JMP I RDMORE / INCREMENTAL SEARCH / LOOK FOR THE <0-TERMINATED SEARCH STRING. START AT SRCHP, / UPDATE AND SKIP IF FOUND. IF NOT FOUND SRCHP IS UNDEFINED SCHSTR, 0 SCSTC, TAD [SSTRNG DCA SCSTP TAD I SCSTP / NULL SEARCH STRING IS FOUND SPA CLA JMP SCSTB TAD I SCSTP / FIND FIRST CHAR OF STRING JMS I [SFWD JMP I SCHSTR TAD SRCHP DCA SCSTQ TAD SRCHP+1 DCA SCSTQ+1 SCSTA, ISZ SCSTP / ADVANCE POINTERS TAD (SCSTQ JMS I [INC15 TAD I SCSTP / DONE? SPA CLA JMP SCSTB TAD (SCSTQ / END OF BUFFER? JMS I [SNE15; BUFEND JMP I SCHSTR TAD (SCSTQ / NO, COMPARE JMS I [GET15 CIA TAD I SCSTP SNA CLA JMP SCSTA / MATCH, KEEP GOING TAD [SRCHP / NO MATCH, FIND NEXT PLACE TO LOOK JMS I [INC15 JMP SCSTC SCSTB, ISZ SCHSTR / FOUND JMP I SCHSTR SCSTP, 0 / -> SEARCH STRING SCSTQ, 0; 0 / ->15 BUFFER PAGE /-------------------------- 5000 / INCREMENTAL SEARCH COMMAND ISRCH, 0 ISZ ISRCH / CAN'T FAIL JMS I [CLRMLT / PROMPT TAD (ISMSG JMS I [WR6 WRMLT TAD [SSTRNG / INIT SEARCH STRING POINTER DCA ISP JMS SETPM / SET MARK TO STARTING POINT ISD, STA / MARK EMPTY SEARCH STRING DCA I ISP ISA, JMS I [UPDATE JMS I [SFWDPT / START FROM POINT ISC, JMS I [RDTTY TAD (-BS / BACKSPACE? SNA JMP ISBS TAD (BS-TAB / ^I SNA JMP ISTAB TAD (TAB-6 / ^F? SNA JMP ISNXT TAD (6-23 / ^S? SNA JMP ISNXT TAD (23-16 / ^N? SNA JMP ISNL TAD (16-CR / CR? SNA JMP I ISRCH / CR, DONE TAD (CR-SP / OTHER CONTROL CHAR SPA JMP ISEXE TAD [SP / REGULAR CHAR ISREG, DCA ISCH / SAVE IT TAD ISP / SEARCH STRING FULL? TAD (-SSEND+1 SNA CLA JMP ISB TAD ISCH / PUT IN SEARCH STRING DCA I ISP ISZ ISP STA / MARK END OF SEARCH STRING DCA I ISP ISF, JMS I [SCHSTR / LOOK FOR IT JMP ISNF JMS I [GOFWD / FOUND, GO THERE TAD ISCH / ECHO IN MODE LINE JMS I [WRMLT JMP ISA ISBS, TAD ISP / BACKUP. ALREADY AT BEGINNING? TAD (-SSTRNG SZA CLA JMP ISE TAD [BELL JMS I [WRTTY JMP ISC ISE, STA / NO, DEC POINTER TAD ISP DCA ISP STA DCA I ISP JMS I [FIXMRK / BACK TO STARTING POINT JMS EXGPM FAIL JMS SETPM / FIND SHORTER STRING JMS I [SFWDPT JMS I [SCHSTR FAIL / MUST BE FOUND JMS I [GOFWD / GO THERE JMS I [ERMLT / ERASE CHAR FROM MODE LINE JMP ISA ISTAB, TAD (TAB JMP ISREG ISNL, TAD [CR / INSERT CR JMP ISREG ISEXE, TAD [SP / OTHER CONTROL CHAR, PUSH IT BACK TO DCA BACKCH / INPUT FOR EXECUTION JMP I ISRCH ISNXT, TAD [SRCHP / FIND NEXT OCCURANCE JMS I [SNE15; BUFEND / AT END OF BUFFER? JMP ISB TAD [SRCHP / NO, ADVANCE 1 JMS I [INC15 JMS I [SCHSTR / FIND JMP ISB JMS I [GOFWD / GO THERE JMP ISA ISB, TAD [BELL / NOT FOUND JMS I [WRTTY JMP ISA ISNF, TAD [BELL / NOT FOUND JMS I [WRTTY STA / REMOVE CHAR FROM SEARCH STRING TAD ISP DCA ISP JMP ISD ISCH, 0 / NEXT CHAR IN SEARCH STRING ISP, 0 / -> SEARCH STRING PAGE /-------------------------- 5200 / SEARCH AGAIN FOR LAST SEARCH STRING SCHNXT, 0 TAD SSTRNG / ANY STRING? SPA CLA JMP I SCHNXT JMS I [SFWDPT / YES, START AT POINT TAD [SRCHP / AT END OF BUFFER? JMS I [SNE15; BUFEND JMP I SCHNXT TAD [SRCHP / NO, SKIP 1 JMS I [INC15 JMS I [SCHSTR / LOOK FOR STRING JMP I SCHNXT JMS I [GOFWD / FOUND, GO THERE ISZ SCHNXT JMP I SCHNXT / MOVE SRCHP FORWARD ONE WORD FROM POINT FWORD, 0 JMS I [SFWDPT / SKIP OVER NON-ALPHANUMERIC FWORDA, TAD [SRCHP / AT END OF BUFFER? JMS I [SNE15; BUFEND JMP I FWORD TAD [SRCHP / NO, GET CHAR JMS I [GET15 JMS I [SKIPAN / ALPHANUMERIC? SKP JMP FWORDB TAD [SRCHP / NO, KEEP LOOKING JMS I [INC15 JMP FWORDA / SKIP OVER ALPHANUMERIC FWORDB, TAD [SRCHP / ADVANCE ONE JMS I [INC15 TAD [SRCHP / AT END OF BUFFER? JMS I [SNE15; BUFEND JMP FWORDC TAD [SRCHP / NO, GET CHAR JMS I [GET15 JMS I [SKIPAN / ALPHANUMERIC? JMP FWORDC JMP FWORDB FWORDC, ISZ FWORD JMP I FWORD / MOVE SRCHP BACK ONE WORD FROM GAP BWORD, 0 JMS I [SREVGP / SKIP NON-ALPHANUMERIC BWORDA, TAD [SRCHP / AT BEGINNING OF BUFFER? JMS I [SNE15; BUF JMP I BWORD TAD [SRCHP / NO, BACK UP JMS DEC15 TAD [SRCHP / GET CHAR JMS I [GET15 JMS I [SKIPAN / ALPHANUMERIC JMP BWORDA / SKIP OVER ALPHANUMERIC BWORDB, TAD [SRCHP / BACK ONE JMS DEC15 TAD [SRCHP / AT BEGINNING OF BUFFER? JMS I [SNE15; BUF JMP BWORDC TAD [SRCHP / NO, GET CHAR JMS I [GET15 JMS I [SKIPAN / ALPHANUMERIC? SKP JMP BWORDB TAD [SRCHP / NO, BACK TO A-N CHAR JMS I [INC15 BWORDC, ISZ BWORD JMP I BWORD / MOVE POINT FORWARD ONE WORD FWDWD, 0 JMS FWORD JMP I FWDWD JMS I [GOFWD ISZ FWDWD JMP I FWDWD / MOVE POINT BACK ONE WORD BACKWD, 0 JMS BWORD JMP I BACKWD JMS I [GOREV ISZ BACKWD JMP I BACKWD / DELETE WORD FORWARD DLFWWD, 0 JMS FWORD JMP I DLFWWD TAD SRCHP DCA POINT TAD SRCHP+1 DCA POINT+1 STA DCA CHANGD ISZ DLFWWD JMP I DLFWWD / DELETE WORD REVERSE DLRVWD, 0 JMS BWORD JMP I DLRVWD TAD SRCHP DCA GAP TAD SRCHP+1 DCA GAP+1 STA DCA CHANGD ISZ DLRVWD JMP I DLRVWD FIXCLT, 0 TAD (NL-TAB / TAB? SNA CLA JMP FIXTBA ISZ FIXCLT / OTHER CONTROL CHAR, TWO COLUMNS JMP I FIXCLT FIXTBA, TAD FIXLOC / TAB TAD (10 AND (7770 DCA FIXLOC JMP I FIXCLT PAGE /-------------------------- 5400 NFMSG, TEXT / NOT FOUND/ NEWMSG, TEXT /NEW FILE/ INSE1, TEXT /FATAL ERR/ INSE2, TEXT /EOF?/ / SHOULD BE IMPOSSIBLE, BUT ... NOEMSG, TEXT /ERR OPENING/ NOPMSG, TEXT /ERR WRITING/ NOCMSG, TEXT /ERR CLOSING/ MRKMSG, TEXT /MARK SET/ NRMSG, TEXT /NO REGION/ SAVMSG, TEXT /SAVE? (Y, N, ^G):/ GFMSG, TEXT /FILE: / ISMSG, TEXT /SEARCH: / QRMSG1, TEXT /REPLACE: / QRMSG2, TEXT / WITH: / QRMSG3, TEXT /REPLACED / FAILMS, TEXT /ASSERT / / KEYS DISPATCH TABLES ARROWS, PRVLN; NXTLN; FWD; BACK OTHERS, BEGLN; 0; DELFWD; ENDLN; REVSCR; FWDSCR; 0; 0 / VT100 SCROLL ESCAPE SEQUENCES IFDEF FSCROL < SUPSEQ, ESC; LBRAK; WINDHI; WINDLO; "H; ESC; "D; 0 SDNSEQ, ESC; LBRAK; "H; ESC; "M; 0 > / GET SIZE OF AC->STRING, RETURN IN AC STRSIZ, 0 DCA SSIZP DCA SSIZN SSIZA, TAD I SSIZP ISZ SSIZP SPA CLA JMP SSIZB ISZ SSIZN JMP SSIZA SSIZB, TAD SSIZN JMP I STRSIZ SSIZP, 0 SSIZN, 0 PAGE /-------------------------- 5600 / MODE LINE TEXT (MLT) BUFFER MLTBUF, ZBLOCK 50 MLTEND, / SEARCH STRING BUFFER SSTRNG, -1 / MARK EMPTY ZBLOCK 20 SSEND, / REPLACE STRING BUFFER RSTRNG, -1 / MARK EMPTY ZBLOCK 20 RSEND, /#EG# RECOVER, QUERY REPLACE / MAINTAIN RECOVER ZONE RCZONE, 0 TAD [POINT / POINT MOVED INTO GAP? JMS I [LD24 TAD (LASTPT JMS I [SUB15 TAD AC24+1 SPA CLA JMP RCZA TAD (LASTGP / NO, GAP MOVED INTO GAP? JMS I [LD24 TAD [GAP JMS I [SUB15 TAD AC24+1 SMA CLA JMP RCZB RCZA, TAD POINT / IF EITHER WAS YES, RESET DCA RCVPT / RECOVER ZONE TAD POINT+1 DCA RCVPT+1 TAD GAP DCA RCVGP TAD GAP+1 DCA RCVGP+1 RCZB, TAD POINT / SAVE POINT-GAP PAIR DCA LASTPT TAD POINT+1 DCA LASTPT+1 TAD GAP DCA LASTGP TAD GAP+1 DCA LASTGP+1 JMP I RCZONE / RECOVER ZONE RECOVR, 0 TAD [POINT / ANY ZONE TO RECOVER? JMS I [SNE15; RCVPT SKP JMP RCVRA TAD [GAP JMS I [SNE15; RCVGP JMP I RECOVR RCVRA, TAD RCVPT / YES, DO IT DCA POINT TAD RCVPT+1 DCA POINT+1 TAD RCVGP DCA GAP TAD RCVGP+1 DCA GAP+1 ISZ RECOVR JMP I RECOVR PAGE /------------------------- 6000 / PROMPT AND READ INPUT FROM USER, SKIP IF NOT QUIT / JMS GETSTR / -> PROMPT / -> BUFFER / -> LAST ELEMENT OF BUFFER / QUIT RETURN GETSTR, 0 TAD I GETSTR / PROMPT ISZ GETSTR JMS I [WR6 WRMLT JMS I [UPDATE TAD I GETSTR / FETCH BUFFER POINTERS ISZ GETSTR DCA GETSBF TAD GETSBF DCA GETSP TAD I GETSTR ISZ GETSTR CIA DCA GETSEN STA / MARK EMPTY DCA I GETSP GETSA, JMS I [RDTTY / GET AND PROCESS NEXT CHAR TAD (-BELL / QUIT? SNA JMP GETSQ TAD (BELL-CR / NO, END ENTRY? SNA JMP GETSX TAD (CR-10 / NO, BACHSPACE? SNA JMP GETSBS TAD [10 / ORDINARY CHARACTER DCA GETSCH TAD GETSP / ROOM FOR IT? TAD GETSEN SNA CLA JMP GETSER TAD GETSCH / YES, ECHO IT JMS I [WRMLT JMS I [UPDATE TAD GETSCH / PUT IN BUFFER TAD (-16 / CONVERT ^N TO NL SNA TAD (NL-16 TAD (16 DCA I GETSP ISZ GETSP STA / MARK END DCA I GETSP JMP GETSA GETSQ, STA / QUIT, LEAVE BUFFER EMPTY DCA I GETSBF JMP I GETSTR GETSER, TAD [BELL / ERROR JMS I [WRTTY JMP GETSA GETSBS, TAD GETSBF / BACKSPACE, ALREADY AT BEGINNING? CIA TAD GETSP SNA CLA JMP GETSER STA / NO, BACKUP TAD GETSP DCA GETSP STA / MARK END DCA I GETSP JMS I [ERMLT / ERASE LAST CHAR JMS I [UPDATE JMP GETSA GETSX, ISZ GETSTR / NORMAL EXIT JMP I GETSTR GETSP, 0 / -> END MARKER AS CHARS ARE ENTERED GETSBF, 0 / -> BUFFER GETSEN, 0 / - ADDRESS OF LAST ELEMENT GETSCH, 0 / CHAR BEING INSERTED / SCREEN INITIALIZATION SCINIT, 0 DCA SCRP TAD (-SCRHT DCA ROW SCRFLD INITA, SMARK / MARK END OF LINES IN SCREEN COPY DCA I SCRP TAD SCRP TAD [SCRWD DCA SCRP ISZ ROW JMP INITA CODFLD TAD (CLRSC / CLEAR THE SCREEN JMS I [WRSTR WRTTY JMP I SCINIT / ADJUST COLUMN TO MAKE ^N, ^P MOVE VERTICALLY FIXCOL, 0 TAD UPDOWN / PRESERVE COLUMN INDEX CIA DCA UPDOWN DCA FIXLOC / INIT CURRENT COL FIXCLA, TAD FIXLOC / DONE? TAD UPDOWN SMA CLA JMP I FIXCOL TAD [POINT / GET CHAR AT POINT JMS I [GET15 TAD [-SP / CONTROL CHAR? SMA JMP FIXCLC / NO, ONE COL TAD (SP-NL / YES, NL? SNA JMP I FIXCOL / YES, CAN GO NO FARTHER JMS FIXCLT JMP FIXCLD FIXCLB, ISZ FIXLOC FIXCLC, ISZ FIXLOC CLA FIXCLD, JMS FWD JMP I FIXCOL JMP FIXCLA PAGE /-------------------------- 6200 WINDHI=TXTHT%12 WINDHO=WINDHI^12 WINDLO=TXTHT-WINDHO+60 WINDHI=WINDHI+60 CLRSC, ESC; LBRAK; "2; "J IFDEF FSCROL < ESC; LBRAK; "1; SEMI; WINDHI; WINDLO; 162 > 0 / QUERY REPLACE QREPL, 0 QRD, JMS I [CLRMLT JMS GETSTR / GET SEARCH STRING QRMSG1 SSTRNG SSEND-1 JMP I QREPL TAD [SSTRNG / GET SIZE OF SEARCH STRING JMS STRSIZ SNA / IF EMPTY, TRY AGAIN JMP QRD DCA QRSIZE JMS GETSTR / GET REPLACE STRING QRMSG2 RSTRNG RSEND-1 JMP I QREPL DCA QRNUM / ZERO COUNT QRA, JMS I [SFWDPT / START AT POINT QRB, JMS I [SCHSTR / LOOK FOR STRING TO REPLACE JMP QRX JMS I [GOFWD / FOUND, GO THERE JMS I [UPDATE QRC, JMS I [RDTTY / WHAT TO DO? JMS I [UPPER / FOR "N" RESPONSE TAD (-CR / DONE? SNA JMP QRX TAD (CR-SP / REPLACE AND CONTINUE? SNA JMP QRSP TAD (SP-116 / CONTINUE? SNA JMP QRNO TAD (116-56 / REPLACE AND QUIT? SNA JMP QRDOT TAD (56-41 / REPLACE ALL? SNA JMP QRALL TAD [BELL / ERROR, TRY AGAIN JMS I [WRTTY JMP QRC QRSP, JMS QRACT / REPLACE AND CONTINUE JMP QRX JMP QRA QRNO, JMS I [SFWDPT TAD [SRCHP / CONTINUE JMS I [INC15 JMP QRB QRALL, JMS QRACT / REPLACE ALL JMP QRX JMS I [SFWDPT JMS I [SCHSTR JMP QRX JMS I [GOFWD JMP QRALL QRDOT, JMS QRACT / REPLACE AND QUIT NOP QRX, JMS I [CLRMLT / DONE, SHOW NUMBER OF REPLACEMENTS TAD (QRMSG3 JMS I [WR6 WRMLT TAD QRNUM JMS I [WRDEC WRMLT ISZ MLHOLD ISZ QREPL JMP I QREPL QRNUM, 0 QRSIZE, 0 / REPLACE QRSIZE CHARS AT POINT WITH RSTRNG QRACT, 0 CLL / DELETE SEARCH STRING TAD POINT TAD QRSIZE DCA POINT SNL JMP QRACTA TAD POINT+1 TAD [10 DCA POINT+1 QRACTA, STA / SET CHANGED IN CASE REPLACE STRING IS NULL DCA CHANGD TAD (RSTRNG / INSERT REPLACE STRING DCA QRACTP QRACTB, TAD I QRACTP ISZ QRACTP SPA JMP QRACTX JMS I [INSERT SKP JMP QRACTB TAD [BELL / BUFFER FULL, GIVE UP JMS I [WRTTY JMP I QRACT QRACTX, CLA ISZ QRNUM ISZ QRACT JMP I QRACT QRACTP, 0 PAGE /-------------------------- 6400 KEYS, 0 JMS I [RDTTY / GET ESCAPE CODE TAD (-101 / ARROW KEY? DCA KEYSCH TAD KEYSCH AND (7774 SZA CLA JMP KEYSA TAD (ARROWS / YES, EXECUTE ARROW KEY KEYSX, TAD KEYSCH DCA KEYSCH TAD I KEYSCH SNA JMP I KEYS DCA KEYSCH JMS I KEYSCH SKP ISZ KEYS JMP I KEYS KEYSA, TAD KEYSCH / NO, OTHER RECOGNIZED KEY? TAD (100-60 DCA KEYSCH TAD KEYSCH AND (7770 SZA CLA JMP I KEYS JMS I [RDTTY / YES, MAKE SURE FOLLOWING CHAR TAD (-176 / IS ~ SZA CLA JMP I KEYS TAD (OTHERS / EXECUTE OTHER KEY JMP KEYSX KEYSCH, 0 / SCROLL DOWN ONE LINE SCRLUP, 0 JMS NXTLN STA TAD CURROW SPA JMP SCUPA JMS MOVTOS IFDEF FSCROL <JMS FASTUP> ISZ SCRLUP SCUPA, CLA JMP I SCRLUP / SCROLL UP ONE LINE SCRLDN, 0 JMS PRVLN JMP I SCRLDN TAD CURROW JMS MOVTOS IFDEF FSCROL <JMS FASTDN> ISZ SCRLDN JMP I SCRLDN IFDEF FSCROL < FASTUP, 0 TAD (SUPSEQ / SCROLL THE SCREEN WINDOW JMS I [WRSTR WRTTY STA / SCROLL THE SCREEN COPY DCA TMP0 TAD (-TXTHT+1 DCA TMP1 SCRFLD FUPA, TAD TMP0 / NEXT LINE DCA DSTP TAD TMP0 TAD [SCRWD DCA TMP0 TAD TMP0 DCA SRCP FUPB, TAD I SRCP / NEXT CHAR SPA JMP FUPC DCA I DSTP JMP FUPB FUPC, DCA I DSTP ISZ TMP1 JMP FUPA SMARK DCA I TMP0 CODFLD JMP I FASTUP FASTDN, 0 TAD (SDNSEQ JMS I [WRSTR WRTTY TAD (TXTHT^SCRWD-SCRWD-1 DCA TMP0 TAD (-TXTHT+1 DCA TMP1 SCRFLD FDNA, TAD TMP0 DCA DSTP TAD TMP0 TAD (-SCRWD DCA TMP0 TAD TMP0 DCA SRCP FDNB, TAD I SRCP SPA JMP FDNC DCA I DSTP JMP FDNB FDNC, DCA I DSTP ISZ TMP1 JMP FDNA SMARK DCA I TMP0 CODFLD JMP I FASTDN > PAGE /-------------------------- IOBUF, ZBLOCK 400 IOBUFE, $ |
> > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | E8 Search Commands Incremental search (^S) CR End search. BS Erase last search char and back up. ^S or ^F Next. ^N Match CR (newline) in search text. Query-Replace (ALT-%) When entering replace/with strings: CR Accept string. BS Delete last character entered. ^G Abort query-replace. ^N Put CR (newline) in string. When performing replace: CR Quit. SP Replace and continue. . Replace and quit. ! Replace all without asking. n or N Don’t replace and continue. |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 | / FLOAT.ZZM / PAGE ZERO OF THE / FLOATING POINT ARITHMETIC INTERPRETER FOR FOCAL / SOURCE RECREATION, TIDYING UP BY: / CHARLES J. LASNER P?S NY / LAST EDIT: 08-APR-1987 23:00:00 CJL *40 EX1, 0 /OPERAND STORAGE AC1H, 0 AC1L, 0 OVER1, 0 FLAC= . /FLOATING ACCUMULATOR EXP, 0 /F.A. HORD, 0 LORD, 0 OVER2, 0 SIGNF, 0 /FLOATING SIGN MINSKI, ACMINS /NEGATE FLAC SUBROUTINE FISW, 2004 /OUTPUT FORMAT INTEGER,FIX /FIX FLAC / FUNCTIONS CONTAINED IN THIS SECTION / ARTN / FEXP / FLOG / FSIN / FCOS / XSQRT / FLOATING POINT PACKAGE - EXPONENTIAL GETSGN= TAD FLAC+1 RETURN= JMP I EFUN3I *4600+20 FEXP, GETSGN /TAKE ABSOLUTE VALUE SPA CLA JMS I NEGP DCA T3 /C(SIGN)=-1 IF I X2<0 FINT FMUL LG2E FPUT I X2 FEXT JMS I INTEGER /TAKE INTEGER PART DCA FLAG2 /SAVE LOW ORDER DATA FINT FNOR FPUT I XSQ2 FGET I X2 FSUB I XSQ2 FPUT I X2 FMUL I X2 FPUT I XSQ2 FADD DF FPUT TEMP FGET CF FDIV TEMP FSUB I X2 FADD AF FPUT TEMP FGET BF FMUL I XSQ2 FADD TEMP FPUT TEMP FGET I X2 FDIV TEMP FMUL TWO FADD ONE FEXT TAD FLAG2 TAD FLAC DCA FLAC ISZ T3 RETURN FINT FPUT I X2 FGET ONE FDIV I X2 FEXT RETURN / CONSTANTS FOR FEXP X2, X XSQ2, XSQR AF, 0004 2372 1402 BF, 7774 2157 5157 CF, 0012 5454 0343 DF, 0007 2566 5341 LG2E, 0001 2705 2435 ONE, 0001 2000 0000 TWO, 0002 2000 0000 NEGP, FNEG FLAG2, 0 TEMP, 0 0 0 0 / MAIN ALGORITHM FOR ARCTANGENT ARCALG, FINT FGET I X2 FMUL I X2 FPUT I XSQ2 FMUL BET2 FADD BET1 FMUL I XSQ2 FADD BETZ FPUT TEMP FGET ALF2 FMUL I XSQ2 FADD ALF1 FMUL I XSQ2 FADD ALFZ FMUL I X2 FDIV TEMP FEXT JMP I .+1; ARCRTN / CONSTANTS - FLOATING ARC TANGENT ALFZ, 0000 2437 1643 ALF1, 7777 3304 4434 ALF2, 7773 3306 5454 BETZ, 0000 2437 1646 BET1, 0000 2427 2323 BET2, 7775 3427 7052 / FLOATING POINT ARC TANGENT PAGE ARTN, GETSGN /TAKE ABSOLUTE VALUE SPA CLA JMS FNEG DCA T3 FINT FPUT I X1 FSUB I CON1 FEXT GETSGN SPA CLA JMP GO /LESS THAN ONE FINT FGET I CON1 FDIV I X1 FPUT I X1 FEXT CLA CMA GO, DCA FLAG1 /SIGN FLAG OF RESULT JMP I .+1; ARCALG /CALL ALGORITHM ARCRTN, ISZ FLAG1 /RETURN HERE JMP I EXIT1 FINT FPUT I X1 FGET I PI2 FSUB I X1 FEXT JMP I .+1 EXIT1, EXIT2 / CONSTANTS FOR ARCTANGENT X1, X PI2, PIOT CON1, ONE FLOG, GETSGN /FLOATING LOGARITHM SNA ERROR3 /ZERO ARGUMENT FOR LOG SPA CLA JMS I MINSKI /NEGATIVE ARGUMENT FINT FPUT I TEM FSUB I CON1 FEXT GETSGN SNA RETURN SMA CLA JMP STARTL FINT FGET I CON1 FDIV I TEM FPUT I TEM FEXT CLA CMA STARTL, DCA T3 TAD P13 DCA FLAC CMA TAD I TEM DCA FLAC+1 DCA FLAC+2 DCA FLAC+3 IAC DCA I TEM FINT FMUL LOG2 FPUT I X1 FGET I TEM FSUB I CON1 FPUT I TEM FMUL LOG8 FADD LOG7 FMUL I TEM FADD LOG6 FMUL I TEM FADD LOG5 FMUL I TEM FADD L4 FMUL I TEM FADD L3 FMUL I TEM FADD L2 FMUL I TEM FADD L1 FMUL I TEM FADD I X1 FEXT JMP I EXIT1 L1, 0000 3777 7742 L2, 7777 4000 4100 L3, 7777 2517 0307 L4, 7776 4113 7211 / LOGARITHM CONSTANTS LOG5, 7776 2535 3301 LOG6, 7775 4746 0771 LOG7, 7774 2236 4304 LOG8, 7771 4544 1735 TEM, TEMP LOG2, 0 2613 4414 FLAG1, 0 FNEG, 0 JMS I MINSKI CLA CMA JMP I FNEG / FLOATING POINT SINE AND COSINE PAGE FCOS, FINT /COS(X)=SIN(PI/2-X) FPUT X FGET PIOT FSUB X FEXT FSIN, GETSGN SMA SZA CLA JMP MOD GETSGN SMA CLA RETURN /YES SIN(0)=0 JMS I MINSKI CMA /NO: SIN(-X)=-SIN(X) MOD, DCA T3 / REDUCE X MODULO 2 PI FINT FDIV TWOPI FPUT XSQR FEXT JMS I INTEGER FINT FNOR FPUT X FGET XSQR FSUB X FMUL TWOPI FPUT X FSUB PI /X<PI? FEXT GETSGN SPA CLA JMP PCHECK /YES FINT /NO, SIN(X-PI)=-SIN(X) FPUT X FEXT TAD T3 /INVERT THE SIGN CMA DCA T3 PCHECK, FINT /X<PI/2? FGET X FSUB PIOT FEXT GETSGN SPA CLA JMP PALG /YES FINT /NO FGET PI /SIN(X)=SIN(PI-X) FSUB X FPUT X FEXT PALG, FINT FGET X FDIV PIOT FPUT X FMUL X FPUT XSQR FGET C9 FMUL XSQR FADD C7 FMUL XSQR FADD C5 FMUL XSQR FADD C3 FMUL XSQR FADD PIOT FMUL X FEXT EXIT2, ISZ T3 RETURN JMS I MINSKI RETURN / CONSTANTS AND POINTERS TWOPI, 0003 3110 3756 /(3755) - FOR 4-WORD 3235 PI, 0002 3110 3756 3235 PIOT, 0001 /USED BY SINE AND COSINE 3110 3756 3235 X, 0000 0000 0000 0000 XSQR, 0000 0000 0000 0000 / SINE CONSTANTS C9, 7764 2401 7015 1042 C7, 7771 5464 5514 6150 C5, 7775 2431 5361 4736 C3, 0000 5325 0414 3167 / END OF EXTENDED FUNCTIONS. / PAGE 1 - INPUT/OUTPUT ROUTINES FOR THE FOCAL / FLOATING POINT PACKAGE. / IN THE COMMENTS BELOW: / F = NUMBER OF DIGITS TO BE OUTPUT =FISW / D = NUMBER OF DECIMAL PLACES =DECP / E = DECIMAL EXPONENT =BEXP / P = NUMBER OF PLACES REMAINING TO BE / PRINTED BEFORE DECIMAL POINT PAGE DIGITS= 6 /NUMBER OF DECIMAL DIGITS OUT TGO, 0 DCA SCOUNT /SAVE MAX. NUMBER OF DIGITS AVAILABLE - *SET COUNTS* TAD FISW RTL6 AND P77 DCA T1 TAD T1 CIA /NO, COMPUTE FIELD SIZES SNA TAD MD DCA FCOUNT TAD FISW /(JMP FPRNT) - FOR NO ROUNDING. SNA /FLOATING OUTPUT? JMP R6 /YES, ROUND OFF TO MAX. NO. PLACES AND P77 DCA DECP TAD FCOUNT TAD DECP SPA / F-D > 0? JMP .+5 /YES CLA CMA /NO, TAD T1 DCA DECP /MAKE D = F-1 CMA TAD T3 /COMPARE DECIMAL EXPONENT SMA / F-D > E? CLA /NO, ROUND OFF TO .F PLACES TAD T1 /YES SPA / D+E < 0? JMP FPRNT-2 /YES, NO ROUNDING NEEDED, GO TO PRINT TAD MD /NO, ROUND TO D+E PLACES, SMA /TO A MAXIMUM OF D PLACES CLA R6, TAD RND2 / *ROUND UP * DCA T2 /SAVE NUMBER+1 OF PLACES TO ROUND TO. TAD I BUFST TAD T2 /SET UP BUFFER ADDRESS AT WHICH DCA PLCE /ROUNDING OFF SHOULD START TAD T2 CIA /SET UP COUNT OF MAXIMUM NUMBER DCA T2 /OF CARRIES ALLOWABLE TAD K5 /LITTLE EXTRA ON FIRST DIGIT. RET, ISZ I PLCE /ADD 1 TO DIGIT AT CURRENT POSITION TAD I PLCE TAD OM12 SPA CLA /CARRY REQUIRED? JMP FPRNT /NO, GO TO OUTPUT DCA I PLCE /YES, MAKE CURRENT DIGIT ZERO ISZ T2 /BEGINNING OF BUFFER REACHED? JMP DECR /NO, DECREMENT BUFFER ADDRESS AND REPEAT ISZ I PLCE /YES, SET MANTISSA TO 0.1 ISZ T3 /COMPENSATE BY INCREMENTING EXPONENT CLA FPRNT, TAD FISW /AUTO-INDEX REGISTER ALREADY SET. - *PRINT* SNA CLA / F = 0? JMP FLOUT /YES, OUTPUT AS FLOATING NUMBER TAD FCOUNT TAD T3 SMA SZA / E > F? JMP FLOUT-1 /YES, CONVERT TO E FORMAT TAD DECP SMA / E < F-D? CLA /NO, TAKE P = E CIA /YES, TAKE P = F-D TAD T3 CIA DCA T1 /SET UP MINUS P BACK, TAD T3 /PRINT DD.DDD TAD T1 SNA CLA / P = E? JMP DIG /YES, PRINT DIGIT TAD T1 /NO, IAC SPA CLA / P > 1? TAD M20 /YES, TAKE SPACE (240-260); OTHERWISE ZERO IN, JMS OUTA /PRINT CHARACTER ISZ T1 /P CHARACTERS PRINTED? JMP BACK /NO TAD PER /YES, PRINTC /PRINT DECIMAL POINT JMP BACK DECR, CMA /BACKUP TO TOP OF BUFFER. TAD PLCE DCA PLCE JMP RET K5, 5 MD, -DIGITS RND2, DIGITS+1 OM12, -12 BUFST, SADR OPUT, OUTDG DECP, 0 /MODIFIABLE LOCATIONS SCOUNT, 0 FCOUNT, 0 PLCE= . OUTA, 0 /MODIFIED REGISTERS. JMS I OPUT /PRINT CHARACTER ISZ FCOUNT /F CHARACTERS PRINTED? JMP I OUTA /NO JMP I TGO /YES, NUMBER FINSHED DIG, CMA TAD T3 /REDUCE E, BY 1 DCA T3 ISZ SCOUNT /ARE ALL SIG. FIGS. USED? JMP .+4 /NO CMA /YES, DCA SCOUNT /RESET COUNT TO -1 JMP IN /AND LEAVE C(AC) = 0 TAD I FLTXR /TAKE NEXT DIGIT FROM BUFFER JMP IN / DO FLOATING OUTPUT CLA /IF OUTPUT TOO LARGE, FLOUT, JMS I OPUT /PRINT "0" TAD PER PRINTC /PRINT "." ISZ TGO /SECOND RETURN TAD I FLTXR /TAKE NEXT DIGIT FROM BUFFER JMS OUTA /PRINT IT ISZ SCOUNT /TEST FOR END OF INPUT JMP .-3 /AND REPEAT CMA DCA SCOUNT /OUTPUT EXTRA ZEROS. JMP .-5 ABSOLV, 0 TAD HORD DCA SIGNF TAD HORD SPA CLA JMS I MINSKI JMP I ABSOLV / DOUBLE PRECISION DECIMAL-BINARY / INPUT AND CONVERSION FOR + OR - XXX... PAGE DECONV, 0 DCA LORD DCA EXP /ZERO THE EXPONENT AND DCA HORD /INITIALIZE FLOATING AC. DCA OVER2 DCA DNUMBR DCA SIGNF TAD CHAR /ALLOW KEYBOARD SIGN CHECKS. TAD MPLUS SNA JMP .+6 /+SIGN; GET NEXT TAD M2 /CHECK - SIGN SZA CLA JMP .+4 CMA /INIT SIGN CHECK TO POS. DCA SIGNF JMS I XINPUT /GET NEXT TAD CHAR /A SPACE PERHAPS? TAD MSPACE SNA CLA JMP .-4 JMS DECON JMP I DECONV DECON, 0 TAD CHAR /TEST LEAD CHARACTER FOR TERMINATOR TAD MINE SNA CLA JMP I DECON /E TESTN JMP I DECON /. JMP DTST /OTHER TAD SORTCN /N DSAVE, DCA DIGIT /YES JMS MULT10 /REMAIN MUST =0 SINCE OVERFLOW IS CHECKED ISZ DNUMBR /COUNT DIGITS SZA CLA ERROR2 /INPUT-OVERFLOW ERROR JMS I XINPUT JMP DECON+1 /CONTINUE DTST, TAD CHAR /ALLOW A-Z TAD MINUSA SPA CLA JMP I DECON TAD CHAR TAD MINUSZ SZA SMA CLA JMP I DECON /USE SIX BITS OF ASCII TAD CHAR AND P77 JMP DSAVE MINE, -"E /(7532)- FOR AMPERSAND MINUSZ, -"Z MPLUS, -"+ MSPACE, -" XINPUT, INPUT MULT10, 0 /ROUTINE TO MULTIPLY FLAC BY TEN (10) TAD OVER2 DCA OVER1 TAD LORD /DOUBLE PRECISION WORD DCA AC1L /BY TEN (DECIMAL) TAD HORD /REMAIN=REMAINDER DCA AC1H DCA REMAIN /CLEAR OVERFLOW WORD JMS MULT2 /CALL SUBROUTINE TO JMS MULT2 /MULTIPLY BY TWO JMS DUBLAD /CALL DOUBLE ADD JMS MULT2 TAD DIGIT /ADD LAST DIGIT RECEIVED DCA OVER1 DCA AC1L DCA AC1H JMS DUBLAD TAD REMAIN /EXIT WITH REMAINDER JMP I MULT10 /IN AC REMAIN, 0 DIGIT, 0 /STORAGE FOR DIGIT DNUMBR, 0 /=NUMBER OF DIGITS MULT2, 0 /MULTIPLY OVER2, LORD, HORD BY 2 TAD OVER2 CLL RAL /CARRY INSERT BIT IS IN LINK DCA OVER2 TAD LORD RAL DCA LORD TAD HORD RAL DCA HORD TAD REMAIN RAL DCA REMAIN JMP I MULT2 DUBLAD, 0 /TRIPLE PRECISION ADDITION CLA CLL TAD OVER2 TAD OVER1 DCA OVER2 RAL TAD LORD TAD AC1L DCA LORD RAL TAD HORD TAD AC1H DCA HORD RAL TAD REMAIN /WITH OVERFLOW DCA REMAIN JMP I DUBLAD DIV1, 0 /SHIFT OPERAND RIGHT CLA CLL /TRIPLE PRECISION TAD AC1H SPA CLL CML RAR DCA AC1H TAD AC1L RAR DCA AC1L TAD OVER1 RAR DCA OVER1 ISZ EX1 JMP I DIV1 JMP I DIV1 PAGE / FLOATING OUTPUT CONVERSION ROUTINE FLOUTP, 0 TAD PEQ PRINTC /(CLA)- TO SUPPRESS "=" TAD HORD /NUMBER>0?? SMA CLA TAD SMSP /PRINT "-" OR A SPACE. TAD SMIN PRINTC JMS I ABSOL2 FGO2, DCA T3 /INITIALIZE DECIMAL EXPONENT TAD EXP /IS EXP 0 TO 4? SPA JMP FGO3 /TOO LARGE: MULTIPLY BY 1/10 SZA TAD M4 SPA SNA CLA JMP FGO4 FINT FMUL I PPTEN FEXT IAC TAD T3 JMP FGO2 FGO3, FINT FMUL I TENPT FEXT CMA JMP .-6 FGO4, DCA I DPT /MULTIPLY BY TWO TO POSITION BIT0 DCA I REPT /CLEAR OVERFLOW WORD TAD SADR /INIT BUFFER POINTER DCA FLTXR TAD EXP /COMPUTE BITS IN 1ST DIGIT CLL CMA DCA OUTDG /TEMP COUNT TAD DCOUNT /SETUP COUNT OF TOTAL OUTPUT DCA EXP JMS I DOUBLE /ROTATE OUT THE 1ST 4 BITS ISZ OUTDG JMP .-2 TAD I REPT /TEST FOR 10-15, 0, 1-9 SNA JMP FGO5 /IGNORE 1ST ZERO TAD FM12 SPA CLA JMP .+7 /0-9 IAC DCA I FLTXR /OUTPUT A 1 ISZ EXP /COUNT THE DIGIT TAD FM12 /CORRECT REMAINDER ISZ T3 /BUMP DECIMAL EXPONENT NOP TAD I REPT /COMPUTE RESULTANT OR SECOND DIGIT ISZ T3 NOP SKP FGO5, JMS I M10PT /IE. .672X10=6+.72.. ETC DCA I FLTXR ISZ EXP /ALL DIGITS OUTPUT?? JMP .-3 /NO: CONTINUE TAD SADR /INIT BUFFER POINTER DCA FLTXR TAD DCOUNT JMS I ROUND /OUTPUT MANTISSA JMP I FLOUTP /FIXED POINT DONE TAD CHRT /PRINT "E" PRINTC / OUTPUT THE EXPONENT TAD T3 /TAKE ABSOLUTE VALUE OF EXPONENT SPA CIA DCA HORD /SAVE + POWER TAD T3 /PRINT SIGN SMA CLA TAD M2 TAD SMIN PRINTC TAD HORD ISZ EXP TAD M144 SMA JMP .-3 TAD C144 DCA HORD /SAVE TENS AND UNITS CMA /OUTPUT HUNDREDS TAD EXP SZA /UNLESS ZERO JMS OUTDG TAD HORD /PRINT TWO DIGITS JMS I PRNTI JMP I FLOUTP PRNTI, PRNT CHRT, "E /E (0246) - FOR AMPERSAND SMSP, " -"- / PEQ, "= SMIN, "- M144, -144 /-100 C144, 0144 /+100 M4, -4 FM12, -12 DCOUNT, -DIGITS-1 /NUMBER OF DIGITS OUTPUT PPTEN, PTEN /IEI DPT, DIGIT REPT, REMAIN /OVERFLOW FROM INTEGER MULTIPLY M10PT, MULT10 SADR, BUFFER-1 ROUND, TGO /ACTUAL OUTPUT ROUTINE TENPT, TEN ABSOL2, ABSOLV OUTDG, 0 /OUTPUT ONE DIGIT TAD C260 PRINTC JMP I OUTDG / USED BY 8K / FLOATING POINT INPUT PAGE FLINTP, 0 /IF C(AC) = 0, USE CHAR SZA CLA /IF C(AC) NON-ZERO, GET NEXT JMS I XIN /GET FIRST CHAR TAD CHAR /IGNORE LEADING SPACES TAD M240 SNA CLA JMP .-4 JMS I DPCVPT /READ FIRST DIGIT GROUP TAD CHAR /AND SET "SIGNF" TAD MPER SZA CLA /ENDED BY PERIOD? JMP FIGO1 JMS I XIN /YES, READ 2AND GROUP DCA I DPN JMS I DCONP TAD I DPN /SAVE NUMBER OF DIGITS IN T3 CMA IAC FIGO1, DCA T3 /NO, TAD P43 DCA EXP JMS I RESOL5 JMS I INORM /NORMALIZE FIRST, THEN FINT FPUT I PT1 /SAVE NUMBER FEXT TAD CHAR TAD MINUSE SZA CLA /"E" READ IN? JMP ENDFI+3 /NO JMS I XIN /YES, READ 3RD DIGIT GROUP JMS I DPCVPT /I.E. CONVERT DECIMAL EXPONENT JMS I RESOL5 TAD OVER2 TAD T3 /C(SEXP) PLACES TO RIGHT DCA T3 /OF LAST DIGIT / COMPENSATE FOR DECIMAL EXPONENTS ENDFI, FINT /RESTORE MANTISSA FGET I PT1 FEXT TAD T3 /TEST DECIMAL EXPONENT SNA JMP I FLINTP /FINISHED SMA CLA JMP FIGO4 FINT /. IS TO THE LEFT: FMUL PTEN /TIMES .1000 FPUT I PT1 FEXT IAC JMP .+6 FIGO4, FINT /. IS TO THE RIGHT: FMUL TEN /MULTIPLY BY 10 FPUT I PT1 FEXT CMA TAD T3 DCA T3 JMP ENDFI+3 TEN, 0004 2400 0000 0000 PTEN, 7775 3146 3147 /(3146) - FOR 4-WORD 3150 MINUSE, -"E /(7532) - FOR AMPERSAND DPCVPT, DECONV DCONP, DECON RESOL5, RESOLV DPN, DNUMBR XIN, INPUT INORM, DNORM P43, 43 / END OF FLOATING POINT INPUT / 7 FREE / USED BY H.S. READER PAGE / FLOATING-POINT INTERPRETER FOR FOCAL. FPNT, 0 CLA CLL DCA OVER2 /(NOP) - FOR 4-WORD DCA OVER1 /(NOP) - FOR 4-WORD. TAD I FPNT /GET NEXT INSTRUCTION SNA JMP I FPNT /FAST EXIT DCA JUMP TAD JUMP AND C200 /GET PAGE BIT SNA CLA /PAGE ZERO? JMP .+3 /YES TAD P7600 /NO AND FPNT /C(FPNT)0-4 CONTAINS PAGE BITS DCA ADDR TAD P177 /GET 7 BIT ADDRESS AND JUMP TAD ADDR DCA ADDR TAD INDRCT /INDIRECT BIT=1? AND JUMP SNA CLA JMP LOOP01 /NO-GO ON TAD I ADDR /YES, DEFER, W/O AUTO-INDEX DCA ADDR LOOP01, ISZ FPNT CMA TAD ADDR DCA FLTXR2 TAD JUMP /GET COMMAND CLL RTL RTL AND P17 /GET BITS 0-2, IE OPCODE SNA JMP FLGT TAD TABLE /LOOKUP IN TABLE DCA JUMP TAD I JUMP SNA JMP FLPT DCA JUMP TAD CEX1 /SAVE FLOATING ARGUMENT, UNLESS 'GET' OR 'PUT' DCA FLTXR TAD MFLT DCA CNTR TAD I FLTXR2 DCA I FLTXR ISZ CNTR JMP .-3 JMP I JUMP /GO THERE JUMP, 0 ADDR= EX1 INDRCT, 0400 TABLE, ITABLE FLPT, TAD CEXP /EXP TO (ADDR) JMP .+5 FLGT, TAD CEXP /(ADDR) TO EXP DCA FLTXR2 CMA TAD ADDR DCA FLTXR /SAVE 'FROM' ADDRESS TAD MFLT /3 OR 4 WORDS DCA CNTR TAD I FLTXR DCA I FLTXR2 ISZ CNTR JMP .-3 JMP FPNT+1 CEXP, EXP-1 CEX1, EX1-1 FLSU, JMS I OPMINS /FSUB=2 - NEGATE THE OPERAND FLAD, JMS I ALGN /FLAD=1 - FIRST ALIGN EXPONENTS JMP FPNT+1 /RETURN IF NO ALIGNMENT IS POSSIBLE JMS I RAR2 /TRIPLE PRECISION ADDDITION JMS I RAR1 /SINCE BITS ARE SHIFTED JMS I TRAD /RIGHT NORF, JMS I NORM /NORMALIZE THE RESULT JMP FPNT+1 /HINT: USE 700X FOR FUNCTIONS. / INTERPRETIVE POWER FLEX, TAD HORD /ZERO? SZA CLA JMP .+6 ZERO, DCA EXP /YES DCA HORD DCA LORD DCA OVER2 JMP FPNT+1 PUSHF /AC TO A + POWER FLAC PUSHF /SETUP ARGUMENT (THE EXPONENT) EX1 POPF FLAC JMS I INTEGER /ONLY POSITIVE, INTEGER EXPONENTS SPA JMP .+5 /(COULD DIVIDE) CMA DCA JUMP /TEMP STORAGE DCA OVER1 /(NOP) - FOR 4-WORD TAD HORD SZA CLA ERROR2 /TOO LARGE OR NEGATIVE EXPONENT PUSHF /INITIALIZE TO ONE. FLTONE POPF FLAC POPF ITER1 JMP .+6 PUSHF ITER1 POPF EX1 JMS I MULT /"MULT" ISZ JUMP JMP .-6 JMP FPNT+1 FLMY, JMS I MULT /MULTIPLY JMP FPNT+1 OPMINS, MINUS2 MULT, DMULT NORM, DNORM ALGN, ALIGN RAR1, DIV1 RAR2, DIV2 TRAD, DUBLAD ITABLE= .-1 FLAD FLSU FLDV FLMY FLEX 0000 NORF ACMINS, 0 /ROUTINE TO COMPLEMENT FLAC - VIA "MINSKI" CLA CLL TAD OVER2 /TRIPLE PRECISION NEGATION CMA IAC /OF FLOATING AC DCA OVER2 TAD LORD CMA SZL CLL IAC DCA LORD TAD HORD CMA SZL CLL IAC DCA HORD JMP I ACMINS ALIGN, 0 /SUBROUTINE TO ALIGN TAD HORD /BINARY POINTS SNA TAD LORD /IS MANTISSA ZERO? SNA CLA JMP NOX1 /YES, RESULT=OPERAND TAD AC1H /NO, IS OPERAND ZERO? SNA TAD AC1L SNA TAD OVER1 SNA CLA JMP I ALIGN /YES, EXIT. TAD EX1 CMA IAC TAD EXP SNA /ARE EXPONENTS EQUAL? JMP ADONE /YES DCA ACMINS TAD ACMINS SMA /NO CIA /NEGATE AND DCA AMOUNT /SAVE THE DIFFERENCE TAD AMOUNT TAD TEST2 SPA CLA /CAN THE EXPONENTS BE ALIGNED? JMP NOX /NO, USE LARGER OF THE TWO. TAD ACMINS /YES, SHIFT THE SMALLER SMA CLA JMP ASHFT JMS DIV2 ISZ AMOUNT JMP .-2 JMP ADONE ASHFT, CMA TAD EX1 DCA EX1 JMS I TAG1 ISZ AMOUNT JMP .-2 ADONE, ISZ ALIGN JMP I ALIGN NOX, TAD EX1 /MISSION IMPOSSIBLE! SMA CLA /CHECK FOR SIGN DIFFERENCE JMP NOX2 TAD EXP SMA CLA JMP I ALIGN /-+ JMP .+3 /-- NOX2, TAD EXP SMA CLA TAD ACMINS /TEMP STORAGE OF DIFFERENCE. BOTH POS EXP OR BOTH NEG. SMA SZA CLA JMP I ALIGN /OK (+-) NOX1, TAD EX1 /USE LARGER DCA EXP TAD AC1H DCA HORD TAD AC1L DCA LORD TAD OVER1 DCA OVER2 JMP I ALIGN AMOUNT, 0 TAG1, DIV1 / LEAVE 12 BIT ANSWER IN AC UPON RETURN / LEAVE FLAC AS AN INTEGER, FIX, 0 /VIA (INTEGER) JMS I ABSOL TAD EXP /TEST FOR FRACTION SPA SNA CLA JMP FIXM /DOUBLE CHECK FOR MINUS ONE. IAC DCA OVER1 TAD P27 /INIT ALIGNMENT DCA EX1 JMS ALIGN /DO THE ALIGNMENT TO AN INTEGER TEST2, 0027 /ALREADY DONE; (43)-FOR 4-WORD ISZ OVER2 JMP .+4 ISZ LORD SKP ISZ HORD DCA OVER2 /CLEAR THE FRACTION JMS I RESOL TAD LORD /EXIT WITH LOW ORDER RESULT IN AC. JMP I FIX P27, 27 ABSOL, ABSOLV RESOL, RESOLV FIXM, DCA EXP /CLEAR EXPONENT DCA HORD DCA LORD JMP TEST2+6 DIV2, 0 /SHIFT FLAC RIGHT CLA CLL TAD HORD SPA CML RAR DCA HORD TAD LORD RAR DCA LORD TAD OVER2 RAR DCA OVER2 ISZ EXP JMP I DIV2 JMP I DIV2 SPECIAL=. /INPUT CHARACTERS 337 /LEFT ARROW 377 /RUBOUT "J&237 /L.F. 375 /ALT MODE -1 / (A+B+C)*(D+E+F)=A*D, A*E, B*D, B*E DMULT, 0 /N- PRECISION MULTIPLY WITH IAC /PRODUCT IN TRIPLE PRECISION TAD EX1 /ADD EXPONENTS+1 JMS SIGN /AND DETERMINE SIGN OF RESULT SPA CLA JMS MINUS2 DCA DATUM-1 /INITIALIZE RESULT DCA DATUM-2 DCA DATUM-3 DCA DATUM-4 TAD A /A*D SAVE /STORE IN MP2 TAD D /SINGLE PRECISION MULTIPLY MULTY 2 /ACCUMULATE STARTING IN #2 DATA WORD TAD E /A*E MULTY 3 TAD B /B*D SAVE TAD D MULTY 3 TAD E /B*E MULTY 4 DMULT4, JMP DMDONE /(DCA DATUM-5)-FOR 4-WORD DCA DATUM-6 TAD F /A*F SAVE TAD A MULTY 4 TAD B /B*F MULTY 5 TAD C /C*D SAVE TAD D MULTY 4 TAD E /C*E MULTY 5 TAD F /C*F MULTY 6 DMDONE, TAD DATUM-1 /COPY RESULT DCA HORD TAD DATUM-2 DCA LORD TAD DATUM-3 DCA OVER2 JMS MULDIV DCA OVER2 /(NOP) - FOR 4-WORD JMP I DMULT DATUM= .+6 /INTERMEDIATE STORAGE / #6-LOW ORDER RESULT / #5 / #4 / #3 / #2 / #1-HIGH ORDER RESULT *DATUM-1 MULDIV, 0 /TERMINATE MULTIPLY AND DIVIDE. ISZ SIGNF /CORRECT FOR SIGN JMS I MINSKI JMS I NORMF /SHIFT LEFT ISZ OVER2 /ROUNDUP LAST BIT; (NOP) - FOR 4-WORD JMP I MULDIV FLDV, TAD AC1H /4:DIVIDE SNA CLA ERROR2 /DIVISION BY ZERO TAD EX1 /SUBTRACT EXPONENTS+1 CMA IAC IAC JMS SIGN /SET UP SIGNS SMA CLA JMS MINUS2 /NEGATE DIVISOR JMS I DIVIDE /DIVIDE JMS MULDIV JMP I .+1; FPNT+1 / THIS SUBROUTINE PREPARES MULTIPLY AND DIVIDE / FOR ANY COMBINATION OF SIGNED ARGUMENTS AND FOR ZERO. / THE RESULT OF EITHER IS ZERO IF FLAC = 0. / RESULT OF MULTIPLY IS ZERO IF EITHER IS ZERO; / DIVISION BY ZERO IS CHECKED BEFORE THIS / ROUTINE IS CALLED. / THE CALLING AC CONTAINS AN UPDATE VALUE FOR THE / EXPONENT. THE RETURNING AC CONTAINS THE SIGN OF / THE ARGUMENT FOR FURTHER TESTING BY EACH ROUTINE. SIGN, 0 /TEST AND SAVE SIGN OF RESULT TAD EXP /COMPUTE NEW EXPONENT FOR MUL-DIV. DCA EXP TAD P4000 /LOAD 4000 TO XOR THE SIGN BITS AND HORD TAD AC1H SMA CLA /RESULT MAY BE ZERO CMA DCA SIGNF TAD HORD SNA JMP I REVIT /ANSWER IS ZERO. SPA CLA /TAKE ABSOLUTE VALUE OF FLAC JMS I MINSKI TAD AC1H SNA /RESULT OF EITHER MAY BE ZERO JMP I REVIT JMP I SIGN / SIGN OF RESULT = SIGNF / +=-1 / -=0 REVIT, ZERO NORMF, DNORM DIVIDE, DUBDIV SAVE= DCA I .;MP2 MULTY= JMS I .;MP4 A= FLAC+1 B= FLAC+2 C= FLAC+3 D= AC1H E= AC1L F= OVER1 MINUS2, 0 /NEGATE OPERAND CLA CLL /TRIPLE PRECISION TAD OVER1 CMA IAC DCA OVER1 TAD AC1L CMA SZL CLL IAC DCA AC1L TAD AC1H CMA SZL CLL IAC DCA AC1H JMP I MINUS2 RESOLV, 0 TAD SIGNF SPA CLA JMS I MINSKI JMP I RESOLV PAGE MP4, 0 /SINGLE PRECISION, UNSIGNED MULTIPLY - "MULTY" SNA /NO RESULT ADDED IF ZERO JMP I MP4 / FOR EAE INSERT THE FOLLOWING: / 7203 3206 DCA .+3 / 7204 1256 TAD MP2 / 7205 7425 MQL MUY / 7206 0000 0 / 7207 3253 DCA MP5 / 7210 7501 MQA / 7211 3255 DCA MP3 / 7212 5227 JMP .+15 DCA MP1 /12 BITS BY 12 BITS DCA MP5 TAD THIR DCA MP3 CLL MP6, TAD MP1 RAR DCA MP1 TAD MP5 SNL JMP .+3 CLL TAD MP2 RAR DCA MP5 /SAVE HIGH ORDER RESULT ISZ MP3 JMP MP6 TAD MP1 /CORRECT LOW ORDER RESULT RAR DCA MP3 TAD I MP4 /PICKUP SCALE FACTOR CIA TAD DATUMA /COMPUTE ADDRESS DCA MP1 /TEMP TAD MP3 /LOW ORDER PART CLL TAD I MP1 /ACCUMULATE DCA I MP1 ISZ MP1 RAL TAD MP5 TAD I MP1 DCA I MP1 SNL JMP I MP4 /NO CARRY ISZ MP1 ISZ I MP1 JMP I MP4 JMP .-3 /CARRY AGAIN DATUMA, DATUM MP5, 0 /PRODUCT MP1, 0 /MULTIPLIER MP3, 0 MP2, 0 /MULTIPLICAND THIR, -14 /12 BITS MIF, -27 /(-43) - FOR 4-WORD (=7735) DUBDIV, 0 /2 OR 3 PRECISION DIVIDE DCA MP4 DCA MP1 TAD MIF /INIT BIT COUNTER DCA MP3 SKP DV3, JMS I DOUBLE /SHIFT FLAC LEFT CLL TAD AC1L /COMBINE ONE POSITION AND (4-WORD) TAD LORD DCA MP2 /SAVE RESULT RAL TAD HORD /ADD OVERFLOW TAD AC1H SNL /SKIP IF OVERFLOW JMP .+4 DCA HORD /UPDATE FLAC TAD MP2 DCA LORD CLA /CLEAR ACCUMULATOR TAD MP1 /SAVE OVERFLOW BITS CIRCULARLY RAL DCA MP1 TAD MP4 RAL DCA MP4 ISZ MP3 /TEST FOR END OF DIVIDE JMP DV3 TAD MP1 /LOAD RESULTS DCA LORD TAD MP4 DCA HORD JMP I DUBDIV /(NOP) RAL /EXTRA FOR 4-WORD DCA DNORM ISZ MP3 /TEST FOR END OF DIVIDE JMP DV3 TAD DNORM DCA HORD TAD MP4 DCA LORD TAD MP1 DCA OVER2 JMP I DUBDIV DNORM, 0 /SUBROUTINE TO NORMALIZE FLAC JMS I ABSOL3 JMS TEST4 TAD HORD SNA /IS MANTISSA=0? TAD OVER2 SNA TAD LORD SNA CLA JMP EXIT3 /YES TAD HORD CLL RAL SPA CLA /WILL SHIFT BE TOO FAR? JMP .+6 JMS I DOUBLE CLL CMA TAD EXP DCA EXP JMP .-10 JMS I RESOL3 JMS TEST4 /DON'T LEAVE 4000 JMP I DNORM EXIT3, DCA EXP /SET TO ZERO JMP I DNORM /RETURN XRAR2, DIV2 TEST4, 0 TAD HORD /TEST FOR 4000 SPA CIA SPA CLA JMS I XRAR2 /SHIFT BACK JMP I TEST4 ABSOL3, ABSOLV RESOL3, RESOLV PAGE / FLOATING SQUARE ROOT FUNCTION XSQRT, FINT FPUT FPAC1 /VALUE FEXT /NEWTON'S METHOD IS USED GETSGN SPA CLA ERROR2 /NUMBER IS NEGATIVE=IMAGINARY ROOTS TAD EXP /LINK IS =0 FROM FINT SPA /MATCH THE SIGN WITH LINK BIT CML RAR DCA ITER1 /MAKE FIRST APPROXIMATION SZL /TEST LSB OF EXP ISZ ITER1 NOP TAD SQCON1 DCA ITER1+1 DCA ITER1+2 DCA ITER1+3 TAD FPAC1+1 SNA TAD FPAC1+2 SNA CLA JMP SQEND /NUMBER=0 CLCU, FINT FGET FPAC1 FDIV ITER1 FADD ITER1 FEXT CLA CMA TAD EXP DCA EXP TAD EXP CMA IAC TAD ITER1 SZA CLA /ARE EXPONENTS EQUAL? JMP ROOTGO /NO TAD HORD /ARE HIGH-ORDER MANTISSAS EQUAL? CMA IAC TAD ITER1+1 SZA CLA JMP ROOTGO /NO TAD LORD CMA IAC TAD ITER1+2 /DO LOW-ORDER MANTISSAS AGREE SMA CMA IAC /WITHIN ONE BIT? IAC SMA CLA RETURN ROOTGO, FINT FPUT ITER1 FEXT JMP CLCU SQEND, DCA EXP RETURN SQCON1, 3015 BUFFER= . ITER1, 0 0 0 0 FPAC1, 0 0 0 BUFFER+13 /ADDRESS OF NEXT FREE LOCATION IN 10-DIGIT VERSION. ENPUNCH /IN CASE BINARY WAS TURNED OFF BEFORE $ /THAT'S ALL FOLK! |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 | / FOCAL.ZZM / F O C A L / T H E F O R M U L A C A L C U L A T O R / FOR FORMULATING ON-LINE CALCULATIONS IN ALGEBRAIC LANGUAGE / ON THE FOLLOWING D.E.C. COMPUTERS: / 5, 8, 8/I, 8/S, 8/L, LINC-8, LAB-8, TSS-8, PDP-12 / SOURCE RECREATION, TIDYING UP BY: / CHARLES J. LASNER P?S NY / LAST EDIT: 08-APR-1987 23:00:00 CJL / F O C A L AND F L O A T / COPYRIGHT@ 1969 BY / DIGITAL EQUIPMENT CORPORATION / FOCAL IS A REGISTERED / TRADEMARK OF / DIGITAL EQUIPMENT CORPORATION / ALL RIGHTS RESERVED / 3RD REVISION FIXMRI AND= 0000 /ACTUAL MEMORY REFERENCE INSTRUCTIONS FIXMRI TAD= 1000 FIXMRI ISZ= 2000 FIXMRI DCA= 3000 FIXMRI JMS= 4000 FIXMRI JMP= 5000 FIXMRI FPOW= 5000 /PSEUDO-FLOATING POINT INSTRUCTIONS. FIXMRI FADD= 1000 FIXMRI FSUB= 2000 FIXMRI FMUL= 4000 FIXMRI FDIV= 3000 FIXMRI FGET= 0000 FIXMRI FPUT= 6000 FNOR= 7000 FEXT= 0000 FXIT= 0000 FINT= JMS I 7 NOP= 7000 CLA= 7200 CLL= 7100 CMA= 7040 RAL= 7004 CML= 7020 RAR= 7010 RTR= 7012 RTL= 7006 IAC= 7001 SMA= 7500 SZA= 7440 SPA= 7510 SNA= 7450 SNL= 7420 SZL= 7430 SKP= 7410 HLT= 7402 CIA= 7041 ION= 6001 IOF= 6002 KSF= 6031 KRB= 6036 TSF= 6041 TCF= 6042 TPC= 6044 TLS= 6046 PLS= 6026 RSF= 6011 RRB= 6012 RFC= 6014 SMP= 6101 RMF= 6244 / * FOCAL * - BY RICK MERRILL - FOR THE FAMILY OF 8. / MISCELLANEOUS ITEMS *1 JMP I .+2 /INTERRUPT PROCESSOR ENTRY. JMP I .+1 /(USED BY PDP-5) INTRPT DDTJR, DDTJR /USED FOR DEBUGGING P13, 13 /CONSTANT C100, 100 /CONSTANT T= 00 /TEXT FIELD NO. P= 00 /PROGRAM FIELD NO. CDF= 7000 /(X-MEM) - OPR FPNT /ADDRESS OF FLOATING POINT INTERPRETER (LOC *7) / AUTO-INDEX REGISTERS - (START OF SAVE BY QUAD) AXIN, 0 /STORAGE INDEX (LOC *10) XRT, 0 /EXTRA XR XRT2, 0 /EXTRA XR PDLXR, BEGIN-1 /PUSHDOWN LIST INDEX REGISTER. FLTXR, IOBUF-1 /XR FOR FLOATING POINT FLTXR2, 0 /EXTRA FOR F.P. TELSW, HLT /TELETYPE IN PROGRESS SWITCH TEXTP=. /TEXT POINTERS (LOC *17) AXOUT, FRSTX /OUTPUT INDEX XCT, 0 /UNPACK SWITCH GTEM, 0 /UNPACK STORAGE PC, FLTZER /PROGRAM COUNTER THISLN, 0 /LINE POINTER FROM 'FINDLN' THISOP, 0 /CURRENT 'EVAL' OPERATION LASTLN, 0 /BACK POINTER FROM 'FINDLN' DEBGSW, 1 /DEBUG SWITCH ; NON-ZERO FOR LITERAL. PACKST, 0 /RUBOUT PROTECTION PT1, 0 /VARIABLE POINTER LASTV, BUFBEG /ADDRESS OF LAST VARIABLE T1, 0 /TEMPORARY REGISTER - MAIN T3, 0 /TEMP REGISTER FOR OUTPUT INBUF, 0 /KEYBOARD INPUT BUFFER BOTTOM, BEGIN-1 /LAST LOCATION CURRENTLY AVAILABLE IN FIELD ZERO ** INSUB, 0 /0= GETC; #0 = READC HINBUF, 0 /HIGH SPEED INPUT BUFFER / *40 = FLOATING POINT *54 / VARIABLES - INITIALIZED FOR THE DIALOGUE SORTCN, 0 /NUMBER IN TABLE FROM SORTC LASTOP, 0 /LAST OPERATION FOR EVAL EFOP= . /FUNCTION CODE. ATSW, 0 /ASK-TYPE SWITCH CNTR, -20 /DELETE AND ERROR COUNTER (USED BY F.P. ALSO) STARTV= . /=END FOR 8K BUFR, BUFBEG /NEXT LOCATION IN BUFFER = LAST LOCATION OF TEXT. ADD, OUTL /CHAR. BUF. IN. (DEBUG AIDS. SEE BELOW.) XCTIN, I33 /PACK SWITCH OUTDEV, XOUTL /POINTER TO OUT. SUB. (OUTL)-FOR DEBUGGING INDEV, XI33 /POINTER TO IN. SUB. (I33)-FOR DEBUGGING NAGSW, 0001 /NOT ALL AND/OR GROUP SWITCH (4000=ONE; 1=ALL; /0=GROUP); (0000)-FOR TSS-8 CHAR, "M&237 /THE MOST IMPORTANT REGISTER LINENO, 0000 /LINE NUMBER READ BY GETLN; (0400)-FOR TSS-8 GINC, WORDS+2 /=6 FOR 4-WORD - CONSTANT T2, 0 /TEMP REGISTER - FOR NEW INST. ROUTINES. / FOR DEBUGGING, SET OUTL AND I33 INTO OUTDEV AND INDEV; / ALSO PATCH THE ERROR ROUTINE = FOUR / PATCHES PLUS TWO FOR THE HIGH SPEED READER. LIST6= . /INPUT LIST FOR "SFOUND". "L&237 /F.F. "G&237 /BELL LIST7= . "C&237 /CONTROL-C FOR DEBUGGING AND TSS8 P337, "^+1 /LEFT ARR CLF, "J&237 /L.F. LIST3= . /EXCRETION LIST CCR, "M&237 /LIST BRANCHER. DMPSW, HLT /(SEARCH CHARACTER)-VARIABLE; =0000 FOR TRACE ON. / THE REST OF PAGE ZERO IS PURE TO THE MULTI-USER SYSTEM M100= . P7700, 7700 /LEFT MASK PER, ". /PERIOD M77, -77 /EXTEND CODE TEST P7600, 7600 /GROUP MASK M20, -20 /CONSTANT P177, 177 /STEP MASK P17, 17 /BCD MASK P277, "? /"?" M2, -2 /CONSTANT MINUSA, -"A /CONSTANT C260, "0 /ASCII FOR ZERO M240, -" /SPACE TEST MPER, -". /PERIOD TEST MCR, -"M!100 /C.R. TEST MFLT, -WORDS /= -4 FOR 4-WORD M5, -5 /PAREN TEST M11, -11 /PAREN TEST P77, 77 /RIGHT MASK C200, 200 /CONSTANTS P4000, 4000 /NAGSW TEST CONSTANT (FOR PDP-5) FLARGP, FLARG /DATA ADDRESS PTCH, CHIN /GENERAL CHARACTER INPUT ROUTINE. DOUBLE, MULT2 /MULTIPLY FLAC BY 2 FOUTPUT,FLOUTP /FLOATING OUTPUT FINPUT, FLINTP /FLOATING INPUT COMBUF, COMEIN /COMMAND BUFFER START CFRS, FRST /ADDRESS OF DUMMY LINE. END, COMEIN /FIRST LOCATION USED IN 8K. ENDT, BUFBEG /START OF STORAGE AREA ** EFUN3I, EFUN3 /FUNCTION RETURN CFRSX, FLTZER /POINTER TO ZERO DATA / 'FINPUT' USES CHAR AND GETC OR READC TO DEVELOP / A NUMBER WHICH IS THEN STORED VIA PT1. WORDS= 3 /OR 4 / NEW INSTRUCTIONS: PUSHJ= JMS I .;XPUSHJ/RECURSIVE SUBROUTINE CALL POPA= TAD I PDLXR /RESTORE AC POPJ= JMP I .;XPOPJ /SUBROUTINE RETURN PUSHA= JMS I .;XPUSHA/SAVE AC PUSHF= JMS I .;PD2 /SAVE GROUP OF DATA POPF= JMS I .;PD3 /RESTORE GROUP GETC= JMS I .;UTRA /UNPACK A CHARACTER PACKC= JMS I .;PACBUF/PACK A CHARACTER SORTJ= JMS I .;SORTB /SORT AND BRANCH ON AC OR CHAR SORTC= JMS I .;XSORTC/SORT CHAR PRINTC= JMS I .;OUT /PRINT AC OR CHAR RDIV, READC= JMS I .;CHIN /READ DATA INTO CHAR AND PRINT IT PRNTLN= JMS I .;XPRNT /PRINT C(LINENO) GETLN= JMS I .;XGETLN/UNPACK AND FORM A LINENUMBER FINDLN= JMS I .;XFIND /SEARCH FOR A GIVEN LINE ENDLN= JMS I .;XENDLN/INSERT LINE POINTERS RTL6= JMS I .;XRTL6 /ROTATE LEFT SIX SPNOR= JMS I .;XSPNOR/IGNORE SPACES AND LEADING ZEROS TESTN= JMS I .;XTESTN/PERIOD; OTHER; NUMBER TSTLPR= JMS I .;LPRTST/SKIP IF 5<SORTCN<= 11 (I.E. AN L-PAR) TSTGRP= JMS I .;GRPTST/SKIP IF G(AC) = G(LINENO) TESTC= JMS I .;XTESTC/TERM; NUMBER; FUNCTION; LETTER- AND IGNORE SPACES. PSIN, DELETE= JMS I .;XDELET/REMOVE OLD TEXT LINE ERROR2= JMS I .; /EXCESS SOMETHING ERROR ERROR3= JMS I .; /MISCELLANEOUS ERROR ERROR4= JMS I .;ERR2 /FORMAT ERROR / USED BY 8K / FOCAL'S COMMAND/INPUT DRIVER *176 BEGIN /BECOMES (RECOVR+1) ** START, SKP CLA /PROGRAM START FROM SELF JMP I .-2 /CONSOLE START: SW=200 TAD CFRSX /(PC) => 0 DCA PC /FOR COMMAND MODE IAC /USE ONE IN THE AC TO DCA DMPSW /INIT UNPACK AND TRACE SWITCH DCA DEBGSW /ENABLE TRACE FOR INPUT OF (?) TAD COMBOT /PROTECT COMMAND BUFFER DCA PDLXR /NO PATCH TEST TAD CSTAR /ANNOUNCE PRESENCE PRINTC /BY TYPING THE LEAD-IN CHARACTER IBAR, TAD COMBUF /INITIALIZE COMMAND BUFFER DCA AXIN /FOR UNPACKING DCA XCTIN TAD COMBUF /RUBOUT PROTECTION DCA PACKST IGNOR, READC /READ COMMAND STRING SORTJ LIST7-1 INLIST-LIST7 PACKC /SAVE STRING CHARACTER. JMP IGNOR CSTAR, "* /ACKNOWLEDGE CHARACTER COMBOT, COMEOUT+12 /END OF COMMAND BUFFER, LESS PROTECTION COUNT. / COMMAND/INPUT PROCESSOR IRETN, PACKC /START TO PACK C.R. PACKC /FINISH C.R. TAD COMBUF /INITIALIZE "TEXTP" GONE, DCA AXOUT /SETUP CURRENT LINE DCA XCT GETC /READ FIRST CHARACTER. TAD BOTTOM /INIT PUSH-DOWN-LIST DCA PDLXR SPNOR /IGNORE LEADING BLANKS TESTN /DOES THE LINE BEGIN WITH 1-9? JMP GZERR /PERIOD =ILLEGAL GROUP ZERO USAGE JMP INPUTX /NO ISZ DEBGSW /YES, DISABLE TRACE FOR REPACKING GETLN /READ THIS LINE NUMBER TAD P4000 /TEST FOR SINGLE LINE. TAD NAGSW SZA CLA ERROR3 /ILLEGAL LINE NUMBER ON INPUT TAD BUFR /SET POINTERS DCA AXIN DCA XCTIN TAD LINENO /SAVE LINE # DCA I AXIN /(X-MEM) SPNOR /IGNORE SPACES AFTER LINE NUMBER SKP GETC /READ 1ST AFTER LINENO TERMINATOR. SRETN, PACKC /SAVE TEXT AND RESTORE DATA FIELD TAD CHAR /TEST FOR END OF INPUT STRING TAD MCR SZA CLA JMP .-5 DELETE /REMOVE OLD LINE, IF ANY. ENDLN /INSERT NEW LINE JMP START /POINTERS MUST BE REINITIALIZED INPUTX, PUSHJ /PROCESS IMMEDIATE COMMAND. PROC TAD I PC /CHECK NEXT LINE (X-MEM) SNA /END OF PROGRAM? JMP START /YES DCA PC /SAVE NEW LINE NO. TAD PC /START NEW LINE IAC JMP GONE /PROCESS OTHER COMMANDS / TEXT LINE BUFFER FORMAT* / #1 : POINTER OR ZERO IN LAST / #2 : LINENO / #3 - #N+1 : TEXT / #N : C.R. / LINE NUMBER FORMATION XGETLN, 0 /DEVELOP I.D. - "GETLN" SPNOR /IGNORE LEADING SPACES. TAD CHAR /"ALL" IS A SPECIAL ARGUMENT. TAD MINUSA SNA CLA JMP TESTA DCA INSUB /CALL 'GETC' FROM 'INPUT' VIA 'DECON' JMS I LCON /(DECONV - IN FLOAT.) TAD FLAC+3 /GROUP TOO LARGE? AND P7740 TAD FLAC+2 SZA CLA ERROR2 /GROUP NUMBER TOO LARGE TAD FLAC+3 RTL6 RAL TESTA, DCA LINENO TESTN /TEST3 GETC /READ STEP NUMBER. TESTN /TEST4, OTHER JMP GERR /DOUBLE PERIODS JMP GEXIT /OTHER TAD SORTCN /NUMBER CLL RTL TAD SORTCN RAL TAD LINENO DCA LINENO GETC /READ SECOND STEP NUMBER. TESTN /TEST4, OTHER GERR, ERROR4 /DOUBLE PERIODS JMP GEXIT /OTHER TAD SORTCN /NUMBER TAD LINENO DCA LINENO GETC /TEST FOR CORRECT TERMINATOR TESTN /CHECK SIZE JMP GERR /. SKP ERROR2 /TOO LARGE A LINE NUMBER. GEXIT, CLL /CLEAR LINK BIT TAD LINENO /TEST FOR GROUP NUMBER. AND P7600 SZA CLA CML TAD LINENO AND P177 /REPARE "NAGSW" SNL SZA GZERR, ERROR2 /0.X = ERROR: ILLEGAL LINE NUMBER. SZA CLA TAD P2000 CML RAL DCA NAGSW JMP I XGETLN LCON, DECONV P7740, 7740 P2000, 2000 / RANGE OF ACCEPTIBLE LINE NUMBERS = 1.01 TO 31.99 / NAGSW: / GROUP=0000 / LINE=4000 / ALL=0001 / LIST OF FUNCTION ADDRESSES. (NAMES ARE IN "FNTABL") FNTABF= . XABS /ABS -ABSOLUTE VALUE XSGN /SGN -SIGN PART XINT /ITR -INTEGER PART XDYS /DIS -DISPLAY AND INTENSIFY XRAN /RAN -RANDOM NUMBER XADC /ADC -READ ANALOG TO DIGITAL CONVERTER ARTN /ATN - FEXP /EXP -EXPONENTIAL FUNCTIONS FLOG /LOG - FSIN /SIN -TRIG FUNCTIONS FCOS /COS - XSQRT /SQT -SQUARE ROOT ERROR5 /NEW -USER DEFINED FUNCTIONS ERROR5 /COM - ERROR5 /X - XRTL6, 0 /ROTATE AC LEFT SIX - "RTL6" CLL RTL RTL RTL JMP I XRTL6 / RECURSIVE OPERATE, EXECUTE, OR CALL DO, GETLN /EXECUTE ONE LINE, A GROUP, OR ALL TAD PC /SAVE ADDRESS PUSHA /OF CURRENT LINE PUSHF /SAVE REST OF THIS LINE TEXTP /ADDRESS OF TEXT POINTERS DGRP, PUSHF /SAVE NAGSW; CHAR; AND LINENO. NAGSW TAD NAGSW /CHECK DATA FROM GETLN. SPA CLA /SKIP IF GROUP OR ALL JMP DOONE /DO ONE LINE FINDLN /INIT FOR GROUP AND SET THISLN NOP TAD THISLN /TEST FOR GOOD GROUP NUMBER. DCA XRT TAD I XRT /(X-MEM) TSTGRP ERROR2 /NO SUCH GROUP NUMBER DGRP1, PUSHJ /EXECUTE OBJECT LINE AND SET PC. PROCESS-2 POPF /RESTORE THE DATA NAGSW TAD I PC /CHECK FOR END OF TEXT (X-MEM) SNA JMP DCONT /ALL DONE IAC DCA PT1 /SAVE POINTER TO LINENO TAD NAGSW /CHECK FOR GROUP SMA SZA CLA JMP .+4 /DO ALL TAD I PT1 /TEST GROUP (X-MEM) TSTGRP JMP DCONT /NOT IN GROUP TAD I PT1 /READ NEXT LINE NO. (X-MEM) DCA LINENO JMP DGRP /CONTINUE THE SUBROUTINE DOONE, FINDLN /FIND THE LINE ERROR2 /NO SUCH LINE NUMBER PUSHJ /EXECUTE IT PROCESS POPF /RESTORE CHAR NAGSW DCONT, POPF /RESTORE TEXT POINTERS TEXTP POPA /RESTORE ADDRESS OF CURRENT LINE. DCA PC JMP I .+1; PROC /CONTINUE PROCESSING THIS LINE. / PUSHDOWN LIST CONTROLS XPUSHA, 0 /PUSHDOWN THE AC - "PUSHA" DCA T2 /BACKUP POINTER CMA /AND THEN JMS PCHK /CHECK CORE USAGE TAD T2 /OK DCA I PDLXR /PUSH DOWN LIST POINTER CMA /BACKUP AGAIN JMS PCHK JMP I XPUSHA PCHK, 0 TAD PDLXR /INC IN AC DCA PDLXR TAD PDLXR CLL CIA TAD LASTV SZL CLA ERROR3 /STORAGE FILLED BY PUSH-DOWN LIST JMP I PCHK XPUSHJ, 0 /RECURSIVE SUBROUTINE CALL - "PUSHJ" TAD I XPUSHJ DCA T2 /SAVE SUBR. ADDR. CMA JMS PCHK TAD XPUSHJ IAC DCA I PDLXR /SAVE RETURN CMA JMS PCHK JMP I T2 /TRANSFER CONTROL PD2, 0 /SAVE A FLOATING POINT NUMBER - "PUSHF" CLA CMA /COMPUTE VARIABLE ADDR TAD I .-2 DCA XRT ISZ PD2 /FIX RETURN TAD MFLT /COMPUTE PUSH. POINTER JMS PCHK TAD MFLT DCA T2 TAD I XRT DCA I PDLXR ISZ T2 JMP .-3 TAD MFLT /RESET POINTER JMS PCHK JMP I PD2 PD3, 0 /RESTORE A FLOATING POINT NUMBER - "POPF" CLA CMA /GET VAR. ADDR. TAD I PD3 ISZ PD3 DCA XRT TAD MFLT DCA T2 TAD I PDLXR /MOVE DCA I XRT ISZ T2 JMP .-3 JMP I PD3 /EXIT INLIST= . /INPUT CONTROL CHARACTERS RECOVR /C.C. = BREAK IBAR /B.A. = RESTART IGNOR /L.F. = IGNORE IRETN /C.R. = TERMINATE STRING FLIST2, FLIMIT /,=STANDARD FINFIN /;=SHORT ERROR5 /CR=DUMB FLIST1, FINCR /,=STANDARD FORMAT PROCESS /;=SET; PLUS ,.. PC1 /C.R.=SET COMMAND. MF, -"F /USED BY TESTC / PRIMARY CONTROL AND TRANSFER GOTO, GETLN /READ THE LINE NUMBER REQUESTED FINDLN /LOCATE IT AND RESET TEXTP ERROR2 /NOT THERE TAD THISLN /SET PC DCA PC PROCESS,GETC /TEST FOR END OF LINE PROC, TAD CHAR /FIRST CHARACTER READY = USE PROC TAD MCR SNA CLA PC1, POPJ /EXIT "PROCESS" SORTC /IGNORE "SPACE", ",", AND ";". GLIST-1 JMP PROCESS TAD CHAR /SAVE COMMAND CHARACTER AND P337 /EXECUTE LOWER CASE ALSO PUSHA GETC /GO TO TERMINATOR SORTC GLIST-1 SKP JMP .-4 POPA SORTJ /GO DO COMMAND COMLST-1 COMGO-COMLST ERROR2 /ILLEGAL COMMAND COMMENT=PC1 /ALSO IS CONTINUE / OUTPUT COMMAND TEXT WRITE, GETLN /SET LINENO ISZ DEBGSW /DISABLE TRACE FINDLN /SEARCH FOR LINE NUMBER JMP WTESTG /NOT THERE OR GROUP TAD LINENO SZA CLA PRNTLN /PRINT LINE NUMBER AND A SPACE. GETC PRINTC /PRINT TEXT OF A LINE. TAD CHAR TAD MCR SZA CLA /SKIP IF END OF LINE JMP .-5 TAD I THISLN /TEST FOR END OF TEXT (X-MEM) WTEST2, SNA JMP WX-2 /EXIT; DO NEXT INDIRECT LINE. IAC DCA PT1 /SAVE POINTER TO LINENO OF NEXT TAD NAGSW SMA CLA TAD I PT1 /(X-MEM) TSTGRP /TRY NEXT LINENO FOR GROUP. JMP WX WALL, TAD I PT1 /SET LINENO (X-MEM) DCA LINENO JMP WRITE+2 WTESTG, TAD THISLN /INIT GROUP PRINTOUT JMP WTEST2 DCA DEBGSW POPJ WX, TAD NAGSW SPA SNA CLA /SKIP IF ALL JMP WX-2 PRINTC /PRINT C.R. AGAIN JMP WALL XTESTC, 0 /TEST THE NATURE OF THE NEXT ALPHANUMERIC - "TESTC" SPNOR /IGNORE SPACES SORTC /TEST THE VARIABLE TERMINATORS TERMS-1 JMP I XTESTC /YES - SORTCN IS SET TAD CHAR /NO ISZ XTESTC TAD MF SNA CLA /TEST FOR "F" JMP XT3 TESTN JMP I XTESTC /. SKP /OTHER JMP I XTESTC /NUMBER ISZ XTESTC XT3, ISZ XTESTC /RETURNS:T; N; F; A JMP I XTESTC XSORTC, 0 /SORT CHAR AGAINST TABLE - "SORTC" TAD I XSORTC DCA XRT2 /1ST ARG IS LIST-1 TAD I XRT2 SPA /LIST IS ENDED BY A NEGATIVE NUMBER JMP SEXC /2AND EXIT = NOT IN LIST CIA TAD CHAR SZA CLA /COMPARE JMP .-6 TAD I XSORTC /COMPUTE INCREMENT : 0 - N CMA TAD XRT2 DCA SORTCN SKP /1ST EXIT = YES SEXC, ISZ XSORTC ISZ XSORTC CLA CLL JMP I XSORTC GRPTST, 0 /AC VS LINENO - "TSTGRP" AND P7600 CIA DCA T2 TAD LINENO AND P7600 TAD T2 SNA CLA ISZ GRPTST JMP I GRPTST / INPUT FROM TEXT OR KEYBOARD; / IF BACK-ARROW, RESTART INPUT INPUT, 0 /INPUT A CHARACTER TAD INSUB /NON-ZERO FOR KEYBOARD SZA CLA JMP .+3 GETC JMP I INPUT READC SORTJ SPECIAL-1 INFIX-SPECIAL JMP I INPUT ILIST, IF1 /, PROCESS /; PC1 /CR / ENGLISH-FRENCH COMLST= . /COMMAND DECODING LIST "S /SET - ORGANIZE "F /FOR - QUAND "I /IF - SI "D /DO - FAIZ "G /GOTO - VA "C /COMMENT- COMMENTE "A /ASK - DEMANDE "T /TYPE - TAPE "L /LIBRARY- ENTREPOSE "E /ERASE - BIFFE "W /WRITE - INSCRIS "M /MODIFY - MODIFIE "Q /QUIT - ARRETE "R /RETURN - RETOURNE "*-40 /(ASTERISK)=EXPANDABLE COMMAND / THIS COMMAND LIST IS SPEED OPTIMIZED. / CONDITIONAL TRANSFER PROCESS. IF, TESTC /IGNORE SPACES AND TEST JMS I IECALL /T ISZ PDLXR /N-DUMP THE (EFOP) JMS I IPART /F-CHECK FOR PAREN MATCH TAD M2 /A DCA T1 TAD FLAC+1 /TEST -, 0, + SPA ISZ T1 /N-TO -1, -2, -3 SPA SNA CLA IF3, ISZ T1 /COUNT COMMAS SKP JMP I COMGO+4 /TRANSFER SORTJ /SEARCH TEXT UNTIL ,;C.R. TLIST-1 ILIST-TLIST GETC JMP .-4 IF1, GETC /MOVE PAST COMMA JMP IF3 IECALL, ECALL IPART, PARTEST / LOOP CONTROL STATEMENT SET= . /SUBSET OF "FOR". FOR, PUSHJ /LOOPS, ETC. GETARG /LOOK FOR "=" NEXT SPNOR /IGNORE SPACES TAD CHAR TAD MEQ SZA ERROR4 /LEFT OF "=" IN ERROR: 'FOR' OR 'SET' TAD PT1 PUSHA /SAVE POINTER TO VARIABLE PUSHJ EVAL-1 /GET INITIAL VALUE EXPRESSION POPA DCA PT1 FINT /INITIALIZE NOW. FPUT I PT1 FXIT SORTJ /TEST LAST CHAR FROM "EVAL" TLIST-1 FLIST1-TLIST ERROR4 /EXCESS R-PAR FINCR, TAD PT1 /SAVE VARIABLE ADDRESS * PUSHA PUSHJ /EVALUATE THE INCREMENT,IF ANY. EVAL-1 SORTJ /TEST TERMINATORS TLIST-1 FLIST2-TLIST ERROR4 /ILLEGAL TERMINATOR IN 'FOR' FLIMIT, PUSHF /SAVE THE INCREMENT. * FLARG PUSHJ /GET THE LIMIT (NO ERROR DETECTION AFTER LIMIT) EVAL-1 FCONT, PUSHF /SAVE THE LIMIT * FLARG PUSHF /SAVE TEXT OF OBJECT STATEMENTS TEXTP PUSHJ /DO THE OBJECT STATEMENTS PROCESS POPF /RESTORE REMAINING TEXT. TEXTP POPF /GET LIMIT FLARG POPF /GET INCREMENT ITER1 POPA /GET VARIABLE ADDRESS DCA PT1 FINT /INCREMENT AND TEST FGET I PT1 /LOAD THE VARIABLE FADD I FINKP /INCREMENT IT FPUT I PT1 /CHANGE IT FSUB I FLARGP /TEST IT FXIT TAD FLAC+1 SMA SZA CLA POPJ /END OF LOOP TAD PT1 PUSHA /SAVE ADDRESS * PUSHF /SAVE INCREMENT AGAIN * FINKP, ITER1 JMP FCONT MEQ, -"= MCOM, -", FINFIN, PUSHF /SET INCREMENT TO ONE. FLTONE JMP FCONT / SET AND INTENSIFY THE POINT: FDIS(X,Y) XDYS, JMS I INTEGER /RETURN=INTEGER VALUE OF Y. PUSHA TAD CHAR TAD MCOM SZA CLA ERROR3 /ARG MISSING PUSHJ EVAL-1 JMS I INTEGER 6063 /DYL CLA POPA 6057 /DXL DIX SKP / TAKE THE INTEGER PART XINT, JMS I INTEGER /(FIX) CLA JMP I EFUN3I COMGO= . /COMMAND ROUTINE ADDRESSES SET FOR IF DO GOTO /(REFERENCED) COMMENT ASK TYPE LIBRARY ERASE WRITE MODIFY START /RETURN TO COMMAND MODE VIA 'QUIT' RETRN HSPX /ACTIVATE THE HIGH SPEED READER / INPUT-OUTPUT STATEMENTS ASK, CLA CMA /REMEMBER WHICH CALL. TYPE, DCA ATSW TASK, DCA DEBGSW /RE-ENABLE THE TRACE SORTJ /SPECIAL CHARACTER? ALIST-1 ATLIST-ALIST ISZ ATSW /TEST QUOTE SWITCH JMP TYPE2 PUSHJ /DO ASK; SETUP PT1 GETARG TAD CHAR /SAVE IN-LINE CHARACTER. PUSHA TAD COL /TYPE COLON PRINTC /(CLA)- TO SUPRESS ":" ISZ INSUB /INDICATE 'READC' IAC /POINT PAST CHAR JMS I FINPUT /READ DATA AND SAVE POPA /RE-TEST LAST TERMINATOR DCA CHAR JMP ASK /CONTINUE PROCESSING TYPE2, PUSHJ /DO TYPE EVAL JMS I FOUTPUT /PRINT JMP TYPE TQUOT, ISZ DEBGSW /DISABLE TRACE GETC /TYPE LITERALS SORTJ TLIST2-1 TLIST3-TLIST2 PRINTC JMP TQUOT+1 TINTR, GETC /PASS PERCENT SIGN GETLN /READ FORMAT CONTROL: "%7.03" TAD LINENO DCA FISW /SAVE FORMAT CODE JMP TASK TCRLF2, TAD CCR /SPLAT=CR ALONE JMS I OUTDEV CMA /NON-PRINTING DELAY FOR CR TCRLF, TAD CCR /EXCLAMATION POINT=CR, LF. PRINTC TASK4, GETC /MOVE TO NEXT CHARACTER JMP TASK COL, ": /":" / IF DEBGSW= 0: ENABLE FLIP-FLOP "DMPSW" / #0: DISABLE AND RETURN ALL"?" ' S. / IF DMPSW= 0: TRACE ON, IF ENABLED / #0: TRACE OFF / IF BOTH= 0: PRINT TRACE. / SEARCH ROUTINES MODIFY, GETLN /READ LINE NO. FINDLN /LOOK IT UP NOW. ERROR2 /NOT THERE = BAD COMMAND UNLESS ZERO. TAD BUFR /SET POINTERS DCA AXIN /FOR INPUT DCA XCTIN TAD LINENO /COPY THE SAME LINE NUMBER. DCA I AXIN /(X-MEM) TAD AXIN /SAVE START OF NEW LINE DCA PACKST SCONT, JMS I INDEV /READ THE TELETYPE INPUT SILENTLY. DCA LIST3+1 /SAVE SEARCH CHARACTER ISZ DEBGSW /NO BREAKS. SCHAR, GETC /TYPE+TEST-F.F. PRINTC /PLAYBACK THE TEXT SORTJ /LOOK FOR MATCH LIST3-1 LISTGO-LIST3 PACKC /SAVE NEW LINE. JMP SCHAR SBAR, TAD BUFR /RESTART-B.A. IAC DCA AXIN /SET POINTERS DCA XCTIN SFOUND, READC /READ FROM KEYBOARD SORTJ /TEST LIST6-1 SRNLST-LIST6 SGOT, PACKC /PACK CHAR. JMP SFOUND /MORE SORTB, 0 /SORT AND BRANCH ROUTINE. - "SORTJ" SNA TAD CHAR /ASSUME CHAR IF AC=0 CIA DCA T2 /SAVE SORT ITEM TAD I SORTB /FIRST ARG IS LIST LESS ONE ISZ SORTB /2AND IS INTRA-LIST LENGTH DCA XRT2 TAD I XRT2 SPA /**LISTS ENDED BY NEGATIVE NUMBERS** JMP SEX /READ EXIT TAD T2 /FIND ADDRESS SZA CLA JMP .-5 TAD XRT2 /MATCH FOUND. TAD I SORTB DCA T2 TAD I T2 DCA T2 /DEBUG : AC = ADDRESS JMP I T2 SEX, ISZ SORTB /MATCH NOT FOUND. CLA CLL JMP I SORTB / ANALOGUE TO DIGITAL CONVERSION FOR AX08 XADC, JMS I INTEGER NOP /(IOF)-FOR OTHER BRANDS 6375 /ACMX ADCV 6332 /SKAD JMP .-1 6362 /RADC DCA FLAC+2 ION JMP I EFUN3I OUTL, 0 /SLOW OUTPUT FOR ODT SYNCRONIZATION TLS /AND FOR H.S. PUNCH PLS TSF /IOT FOR SLOWEST DEVICE JMP .-1 CLA JMP I OUTL SRNLST= . /'MODIFY' CONTROL CHARACTER TABLE SCHAR /F.F. = CONTINUE SCONT /BELL = CHANGE SEARCH CHARACTER RECOVR /C.C. = BREAK SBAR /B.A. = RESTART SCONT+1 /L.F. = FINISH THE LINE AS BEFORE. LISTGO= . SRETN /C.R. = END THE LINE HERE AS IS. SGOT /CHAR = SEARCH CHARACTER ALIST= . /ASK/TYPE LIST OF CONTROLS. "% /% "" /" "! /! "# /# "$ /$ GLIST= . " /SPACE TLIST= . ", /, "; /; "M&237 /C.R. / THIS LIST IS ENDED BY 'TESTC'. / FIND OR ENTER A VARIABLE IN THE LIST. GETARG, TESTC /FIRST LETTER OF ARG TLIST2, "" /" "M&237 /C.R. - FUNCTION OR NUMBER IS NOT AN ARG. ERROR4 /BAD ARGUMENT IN 'FOR', 'SET', OR 'ASK' GETVAR, DCA XCTIN /PACK INTO ADD. PACKC GETC /SECOND LETTER SORTC /TERMINATOR? TERMS-1 JMP GSERCH /YES TAD CHAR /NO AND P77 /SAVE 2AND LETTER OF NAME TAD ADD DCA ADD GETC /IGNORE THE REST SORTC TERMS-1 JMP GSERCH JMP .-4 GSERCH, TSTLPR /LOOK FOR SUBSCRIPT VIA SORTCN JMP GS1 /NOT SUBSCRIPTED BY L-PAR. TAD ADD /SAVE NAME DCA EFOP /FOR RECURSIVE AND ERROR CHECK JMS I GECALL /TO EVAL POPA DCA ADD /RESTORE NAME JMS I PTEST /TEST PAREN MATCH, ETC. JMS I INTEGER /CONVERT TO 12-BIT NUMBER. GS1, DCA SUBS /SAVE SUBSCRIPT TAD STARTV /SEARCH FOR VARIABLE(CHANGE FOR X-MEM) GS3, DCA PT1 TAD PT1 CIA TAD LASTV /TEST FOR END OF LIST SPA SNA CLA JMP GS2 /END SEARCH TAD I PT1 /GET TABLE ENTRY CIA TAD ADD SNA CLA JMP GFND1 /FOUND XX GS4, TAD PT1 /TRY NEXT ONE TAD GINC JMP GS3 PTEST, PARTEST GECALL, ECALL GS2, TAD LASTV /ADD THE VARIABLE TAD P13 /TEST STORAGE LIMITS CLL CIA TAD PDLXR SNL CLA ERROR3 TAD LASTV /UPDATE THE LIST. TAD GINC DCA LASTV TAD ADD /SAVE NAME DCA I PT1 ISZ PT1 /SAVE SUBSCRIPT TAD SUBS DCA I PT1 ISZ PT1 /SET PT1 FINT FGET I CFRSX FPUT I PT1 FXIT POPJ /EXIT GFND1, TAD PT1 /FOUND SAME DCA XRT /TEST SUBSCRIPTS TAD I XRT CIA TAD SUBS SZA CLA JMP GS4 /WRONG SUBSCRIPT ISZ PT1 /SET POINTER TO DATA ISZ PT1 POPJ SUBS= . XSPNOR, 0 /IGNORE LEADING SPACES - "SPNOR" TAD CHAR TAD M240 SZA CLA JMP I XSPNOR GETC JMP XSPNOR+1 M260, -"0 M271, -"9 RANO, 0000 /RANDOM NUMBER STORAGE! 2000 0000 XTESTN, 0 /RETURNS: .; OTHER; NUMBER - "TESTN" TAD CHAR TAD MPER SZA CLA ISZ XTESTN TAD CHAR TAD M260 DCA SORTCN /SAVE VALUE OF THE NUMBER TAD SORTCN /TEST IF REALLY A DIGIT. SPA CLA JMP I XTESTN TAD CHAR TAD M271 SPA SNA CLA ISZ XTESTN /IF A NUMBER JMP I XTESTN XRAN, FINT /PSEUDO-RANDOM NUMBER GENERATOR. FADD RANO /ADD RUNNING RESULT TO THE ARGUMENT, IF ANY. FMUL .-5 /BLAST THE ARGUMENT FPUT RANO FXIT DCA RANO /CONVERT TO .5 THROUGH .999 DCA FLAC /SAME AS RETURN JMP I EFUN3I / EXIT FROM A "DO" SUBROUTINE RETRN, TAD CFRSX /(PC) => 0 DCA PC XPOPJ, TAD I PDLXR /RECURSIVE EXIT - "POPJ" DCA T2 JMP I T2 ATLIST= . /ASK-TYPE CONTROL CHARACTER TABLE TINTR /% - FORMAT DELIMITER TQUOT /" - LITERAL DELIMITER TCRLF /! - CARRIAGE RETURN AND LINE FEED TCRLF2 /# - CARRIAGE RETURN ONLY TDUMP /$ - DUMP THE SYMBOL TABLE CONTENTS TASK4 /SP- TERMINATOR FOR NAMES TASK4 /, - TERMINATOR FOR EXPRESSIONS PROCESS /; - TERMINATOR FOR COMMANDS PC1 /C.R. - TERMINATOR FOR STRINGS / $ - FOR 'TDUMP' TERMINATES THE COMMAND. / EVALUATE AN EXPRESSION WHICH / TERMINATES WITH AN R-PAR,; OR C.R. AND / LEAVE THE RESULT IN FLAC AND IN FLARG. ECALL, 0 /RECURSIVE CALL TO "EVAL" TAD SORTCN /SAVE 'SORTCN','LASTOP',AND 'EFOP' PUSHA TAD LASTOP PUSHA TAD EFOP /SAVE FUNCTION CODE. PUSHA TAD ECALL /RETURN TO CALLING PUSHA /ADDRESS AFTER NEXT POPJ GETC /MOVE PAST EXTRA CHARACTER EVAL, DCA LASTOP /EVALUATION CONTROLLER (CHECKPOINT?) TESTC /TEST CHARACTER AND IGNORE SPACES JMP ETERM1 /TERMINATOR JMP ENUM /NUMBER JMP EFUN /FUNCTION PUSHJ /LETTER OF VARIABLE GETVAR /FIND OR CREATE VARIABLE; ALSO SET PT1. OPNEXT, TESTC /PT1=>ARG JMP ETERMN /T ECHOLST,"J&237 /N-ERROR IN FORMAT 0377 /F ERROR4 /L - MISSING OPERATOR ETERM1, TAD CFRSX /SET PT1. DCA PT1 /TO POINT TO ZERO TAD M2 /TEST FOR UNARY OPERATIONS TAD SORTCN SNA JMP ETERM /CREATE DUMMY FOR UNARY MINUS IAC SNA CLA JMP ARGNXT /IGNORE UNARY PLUS TAD SORTCN /TEST FOR NULL PARENS. TAD M11 SPA CLA JMP ELPAR /MIGHT BE AN L-PAR. ETERMN, TSTLPR SKP ERROR4 /OPERATOR MISSING BEFORE PAREN ETERM, TAD SORTCN /SET FROM "TESTC"-"SORTC" DCA THISOP TAD THISOP TAD M11 SMA CLA /END? DCA THISOP /"THISOP" EQUIV. TO END OF EXP. ETERM2, TAD THISOP /COMPARE PRIORITIES CIA TAD LASTOP SPA CLA JMP EPAR /CONTINUE TAD LASTOP /FIND OPERATION CLL RTR RTR TAD OPTABL DCA FLOP TAD LASTOP SZA CLA /TEST FOR END OF DATA INTO FLOATING AC. POPF /GET LAST DATA FLAC FINT FLOP, 00 /(FLOPR I PT1)+-*/ FPUT I FLARGP /SAVE RESULT FXIT TAD FLARGP DCA PT1 TAD THISOP TAD LASTOP /=0? SNA CLA POPJ /EXIT "EVAL" POPA /GET PRIOR OP DCA LASTOP JMP ETERM2 /COMPARE THIS OP EPAR, TSTLPR /TEST FOR SUB-EXPRESSION SKP JMP EPAR2 /GO EVALUATE EXPRESSION TAD LASTOP /CONTINUE READING THE EXPRESSION PUSHA /SAVE "LASTOP". TAD PT1 DCA .+2 PUSHF /SAVE LAST ARGUMENT 00 TAD THISOP /MORE TO COME DCA LASTOP ARGNXT, GETC /READ 1ST CHAR OF AN ARG. TESTC /DO SPECIAL CHECK JMP ELPAR /COULD BE LEFT PAREN JMP ENUM /N JMP EFUN /F JMP OPNEXT-2 /L OPTABL, FGET I PT1 /BASE FOR OPERATION COMPUTATION ENUM, PUSHF /TO PROCESS A NUMBER, SAVE AC FLAC TAD FLARGP /SET POINTER AS FOR A VARIABLE. DCA PT1 DCA INSUB /POINT TO 'GETC' AND USE CHAR JMS I FINPUT /READ TEXT NUMBER => (PT1) POPF /RESTORE THE AC FLAC JMP OPNEXT /CONTINUE EFUN, DCA EFOP /SET CODE GETC /READ FUNCTION NAME.(1, 2, OR 3 LETTERS) SORTC /LOOK FOR TERMINATION CHARACTER. TERMS-1 JMP EFUN2 /YES TAD EFOP /NO CLL RAL /MISH-MASH HASH CODE TAD CHAR JMP EFUN EFUN2, TSTLPR ERROR4 /MUST BE FOLLOWED BY PARENS TO SET ARGUMENT JMS ECALL /CALL "EVAL" TO COMPUTE ARGUMENT POPA /BRANCH ON FUNCTION CODE; RETURN VIA EFUN3I. SORTJ FNTABL-1 FNTABF-FNTABL ELPAR, TSTLPR /LEFT PAREN OR FELL THROUGH FUNCTION TABLE ERROR4 /DOUBLE OPERATORS OR ILLEGAL FUNCTION NAME. EPAR2, JMS ECALL /EVALUATE NESTED EXPRESSION ISZ PDLXR /DUMP EXTRA ARG. JMP I EFUN3I TERMS= . /TERMINATOR TABLE FOR 'EVAL' AND 'GETVAR' " /SPACE 0 "+ /+ 1 "- /- 2 "/ // 3 "* /* 4 "^ /UP ARR 5 "( /( 6 L-PARS "[ /[ 7 "< /< 10 ") /) 11 R-PARS "] /] 12 "> /> 13 ", /, 14 "; /; 15 "M&237 /C.R. 16 "= /= TO END GETARG FROM 'SET' / TWO MINOR FUNCTIONS XSGN, PUSHF /TAKE SIGN*1 OF FLARG FLTONE POPF FLAC XABS, TAD FLARG+1 /TAKE ABSOLUTE VALUE OF FLAC SPA CLA /SKIP TO CONTINUE JMS I MINSKI /NEGATE THE FLOATING AC / CONTINUATION OF FUNCTION CALLS. EFUN3, FINT FNOR /NORMALIZE FUNCTION RETURN FPUT FLARG /SAVE FUNCTION VALUE FXIT TAD FLARGP /SET POINTER DCA PT1 JMS PARTEST JMP I .+1; OPNEXT /FUNCTION RETURN IS OK FLARG, 0 /DATA TEMPORARY STORAGE 0 0 0 P3, 3 LPRTST, 0 /SKIP IF LEFT PAREN. - 'TSTLPR' TAD SORTCN TAD M11 SMA CLA JMP I LPRTST TAD SORTCN TAD M5 SMA SZA CLA ISZ LPRTST JMP I LPRTST PARTEST,0 /TEST THE PAREN MATCHINGS POPA /RESTORE LAST OPERATION DCA LASTOP TAD P3 /+3 TO COMPARE CODES POPA /GET LAST PAREN CODE. CIA /CHECK FOR PAREN MATCH. TAD SORTCN /(STILL SET FROM THE LAST "EVAL") SZA CLA /SKIP IF MATCH ERROR4 /PAREN ERROR GETC /MOVE PAST R-PAR JMP I PARTEST / THE DELETE A LINE ROUTINE XDELETE,0 /UNCHAIN A LINE AND RECOVER THE SPACE. IOF /PROTECT POINTER CHANGES FROM INTERRUPTIONS FINDLN /SETS "THISLN" AND "LASTLN". JMP I XDELETE /ALREADY GONE ISZ DEBGSW /DISABLE TRACE GETC /MEASURE LENGTH TAD CHAR TAD MCR SZA CLA JMP .-4 TAD AXOUT /SAVE LAST ADDRESS CMA TAD THISLN DCA CNTR /LENGTH < 0 TAD CFRS /IT IS ILLEGAL TO DELETE THE FIRST LINE CIA TAD THISLN SNA CLA JMP START /JUST IGNORE SUCH COMMANDS CDF T /CHANGE DATA FIELD TO TEXT.(X-MEM) TAD I THISLN /DISCONNECT DCA I LASTLN TAD CFRS /START LIST AT TOP DOK, DCA T2 /EXAMINATION ADDRESS TAD I T2 /GET THE NEXT ADDR. SNA /TEST FOR END JMP DONE /YES-WRAP UP ALL. DCA T1 /SAVE NEXT ADDRESS. TAD THISLN /COMPARE LINE POSITIONS CLL CIA TAD T1 SZL CLA /SKIP IF THISLN > X TAD CNTR /CHANGE (X) TO ACCOUNT FOR TAD T1 /GARBAGE COLLECTION. DCA I T2 TAD T1 /GET NEXT JMP DOK / GARBAGE COLLECTION DONE, CMA /BACKUP L FOR XR TAD THISLN DCA XRT TAD CNTR /SETUP END OF HOSE CMA TAD THISLN DCA XRT2 TAD CNTR /CORRECT END OF BUFFER POINTER. TAD BUFR DCA BUFR TAD AXIN /COMPUTE COUNT CMA TAD XRT2 DCA T1 TAD AXIN TAD CNTR DCA AXIN TAD I XRT2 /SIPHON LOWER PART. DCA I XRT ISZ T1 JMP .-3 JMP XDELETE+1 /RESET 'LASTLN', 'THISLN', AND DATA FIELD. CHIN, 0 /READ IN A CHARACTER SUBR. - "READC" JMS I INDEV DCA CHAR SORTC /LINEFEED OR RUBOUT? ECHOLST-1 JMP I CHIN /YES PRINTC /ECHO THE INPUT JMP I CHIN FNTABL= . "A^2+"B^2+"S /ABS "S^2+"G^2+"N /SGN "I^2+"T^2+"R /ITR "D^2+"I^2+"S /DIS "R^2+"A^2+"N /RAN "A^2+"D^2+"C /ADC "A^2+"T^2+"N /ATN "E^2+"X^2+"P /EXP "L^2+"O^2+"G /LOG "S^2+"I^2+"N /SIN LIST OF CODED FUNCTION NAMES "C^2+"O^2+"S /COS "S^2+"Q^2+"T /SQT "N^2+"E^2+"W /NEW "C^2+"O^2+"M /COM "X /X / ERASE SINGLE LINES, GROUPS, OR VARIABLES ERASE, TESTC /TEST THE SECOND WORD, IF ANY. JMP ERVX /ERASE VARIABLES JMP ERL /LINES OR GROUPS JMP .+4 /ERROR TAD CHAR /ALL TEXT TAD MINUSA SZA ERROR3 /BAD ARG FOR ERASE. ERT, TAD ENDT /ERASE ALL TEXT ** DCA BUFR DCA I CFRS /(X-MEM) ERV, TAD STARTV /ERASE VARIABLES ** DCA LASTV JMP START /POINTERS MAY BE DIFFERENT NOW. ERL, GETLN /ERASE LINES. TAD BUFR /PROTECT REST OF TEXT. DCA AXIN ERG, DELETE /EXTRACT ONE LINE ISZ THISLN TAD NAGSW SMA CLA TAD I THISLN /(X-MEM) TSTGRP /SKIP IF G(AC) = G(LINENO) JMP ERV TAD I THISLN /(X-MEM) DCA LINENO JMP ERG ERVX, TAD STARTV /INIT VARIABLES MAY BE INDIRECT COMMAND DCA LASTV POPJ / ROUTINE CALLED VIA "FINDLN": / SEARCH FOR A GIVEN LINE I.D. =[ "LINENO" ] / 1ST RETURN IF NOT FOUND, / 2AND IF FOUND. / "THISLN" = FOUND LINE OR NEXT LARGER. / "LASTLN" = LESSER AND/OR LAST. / "TEXTP" IS SET. XFIND, 0 TAD CFRS /INITIALIZE POINTERS TO FIRST LINE DCA LASTLN TAD CFRS FINDN, DCA THISLN /SAVE THIS ONE TAD THISLN DCA XRT TAD LINENO CLL CMA IAC /CLEAR LINK AND NEGATE LINENO. TAD I XRT /LINENO=0 WILL ALSO BE FOUND(X-MEM) SNA JMP FEND3-1 /FOUND IT. SZL CLA JMP FEND3 /PAST IT. TAD THISLN /MOVE POINTERS DCA LASTLN TAD I THISLN /END OF TEXT? (X-MEM) SZA JMP FINDN /NOT YET SKP ISZ XFIND /2ND EXIT = FOUND FEND3, TAD THISLN /1ST RETURN = NOT FOUND IAC DCA AXOUT /SET "TEXTP". DCA XCT JMP I XFIND UTRA, 0 /UNPACK CHARACTER. - "GETC" JMS GET1 UTE, SPA CLA /NORM & EXTEND TAD C100 /300-337 & 340-376 TAD M137 /240-276 & 200-236 TAD CHAR SNA JMP UTX /"?" FOUND TAD P337 UTQ, DCA CHAR TAD DEBGSW TAD DMPSW SNA CLA /PRINT ONLY IF BOTH ARE ZERO. PRINTC JMP I UTRA EXTR, JMS GET1 CMA JMP UTE UTX, TAD DEBGSW /TEST FOR TRACE-ENABLED SZA CLA JMP .+6 TAD DMPSW /FLIP THE TRACE FLOP SNA CLA IAC DCA DMPSW JMP UTRA+1 /GET NEXT CHARACTER INSTEAD. TAD P277 /TRACE DISABLED = RETURN "?" JMP UTQ GET1, 0 /UNPACK 6-BITS ISZ XCT /STARTS=0 JMP GET3 TAD GTEM GEND, AND P77 DCA CHAR /SAVE TAD CHAR TAD M77 SNA CLA JMP EXTR /EXTENDED TAD CHAR TAD M40 JMP I GET1 GET3, TAD I AXOUT /(X-MEM) DCA GTEM CMA DCA XCT TAD GTEM CLL RTR RTR RTR JMP GEND M40, -40 M137, -137 XENDLN, 0 /TERMINATE THE BUFFERED LINE - "ENDLN" CDF T /(X-MEM) TAD I LASTLN /SAVE OLD POINTER DCA I BUFR TAD BUFR /POINT TO NEW LAST LINE DCA I LASTLN TAD ADD /CHECK FOR EXTRA INFO SZA DCA I AXIN TAD AXIN /COMPUTE NEW END OF BUFFER IAC DCA BUFR TAD STARTV /RESET VARIABLE LIST (X-MEM) DCA LASTV JMP I XENDLN TLIST3= . /LITERAL TERMINATORS TASK4 /" PC1 /C.R. = AUTOMATIC QUOTE MATCH INFIX= . /DATA CONTROL CHARACTERS FLINTP+2 /LEFT ARROW = KILL INPUT+1 /RUBOUT = IGNORE INPUT+1 /L.F. = IGNORE ENDFI+5 /ALT MODE = EXIT FLTONE, 0001 /(NO RELATIVE REFERENCES) 2000 FLTZER, 0000 0000 0000 0000 M12, -12 /DECIMAL CONVERSION FACTOR FOR "PRNT" I33, 0 /NO-INTERRUPT INPUT ROUTINE KSF JMP .-1 KRB AND P177 /IGNORE PARITY BIT SNA JMP .-5 TAD C200 JMP I I33 XPRNT, 0 /PRINT A LINE NUMBER - "PRNTLN" TAD LINENO RTL6 AND P77 JMS PRNT /TWO DIGIT "PART" NUMBER TAD PER PRINTC /PERIOD FOR SEPARATION TAD LINENO JMS PRNT /TWO DIGIT "STEP" NUMBER. TAD M140 DCA CHAR /SAVE SPACE IN CHAR. PRINTC /PRINT TRAILING SPACE JMP I XPRNT VAL= T1 PRNT, 0 /PRINT TWO DECIMAL DIGITS AND P177 DCA VAL TAD C260 DCA T3 JMP .+3 ISZ T3 XYZ, DCA VAL TAD VAL TAD M12 SMA JMP XYZ-1 CLA TAD T3 PRINTC TAD VAL TAD C260 PRINTC JMP I PRNT OUT, 0 /OUTPUT A CHARACTER - "PRINTC" SNA /USE (AC) OR (CHAR) TAD CHAR TAD MCR SNA JMP OUTCR TAD CCR JMS I OUTDEV OUTX, JMP I OUT OUTCR, TAD CCR JMS I OUTDEV TAD CLF JMP OUTX-1 PACBUF, 0 /PACK A CHARACTER - "PACKC" TAD P277 CIA TAD CHAR SNA /CHANGE 277 TO 337 TAD P40 TAD M100 SNA /TEST FOR RUBOUT. JMP I RUBIT TAD P377 DCA T2 /SAVE INPUT ITEM TAD T2 /SO THAT QUESTION DOESN'T MAKE AND C140 /CHAR LOOK LIKE A LEFT-ARROW TAD M140 SZA /DATA WORD. TAD C140 SNA CLA JMP ESCA /340-377 AND 200-237 PA1, TAD T2 /240-337 AND P77 SZA /IGNORE 300 JMS PCK1 PACX, CDF P /(X-MEM) JMP I PACBUF ESCA, TAD P77 JMS PCK1 JMP PA1 PCK1, 0 ISZ XCTIN /=0 TO START JMP ROT TAD ADD DCA I AXIN /(X-MEM) DCA ADD /CLEAR PACKING WORD TAD PDLXR /CHECK FOR OVERFLOW CLL CMA IAC TAD P13 /RESERVATIONS FOR PUSH-DOWN LIST TAD AXIN SNL CLA JMP I PCK1 ERROR2 /FULL BUFFER P40, 40 P377, 377 C140, 140 RUBIT, RUB1 M140, -140 ROT, RTL6 /(EAE) DCA ADD CMA DCA XCTIN JMP I PCK1 /REST OF PAGE USED BY 8K PAGE / INTERRUPT PROCESSOR. SAVAC, 0 /CONTENTS OF AC SAVLK, 0 /CONTENTS OF LINK MBREAK, -203 /CONTROL-C INTRPT, DCA SAVAC /SAVE WORKING DATA RAR DCA SAVLK TSF /GIVE OUTPUT PRIORITY JMP KINT TCF DCA TELSW /TURN OFF THE IN-PROGRESS FLAG. TAD I OPTRI SNA JMP KINT /DONE TPC /TYPE NEXT. DCA TELSW /CLEAR AC AND TURN ON THE FLAG. DCA I OPTRI /ZERO OUT THE DATA AREA TAD OPTRI IAC AND P17 TAD OPTR0 DCA OPTRI KINT, KSF /CHECK FOR KEYBOARD FIRST JMP EXIT KRB /READ BUFFER AND CLEAR FLAG TO FETCH NEXT AND P177 /IGNORE BLANK AND L-T AND PARITY BIT. SNA JMP EXIT TAD C200 DCA SIN TAD SIN TAD MBREAK /MANUAL STOP? SNA CLA JMP RECOVR TAD INBUF /ANY SPACE? SZA CLA ERROR2 /WILL WAIT FOR OUTPUT BUFFER TAD SIN DCA INBUF /SAVE INPUT EXIT, RSF /TEST H.S. READER FLAG JMP .+3 RRB /READ BUFFER AND CLEAR FLAG DCA HINBUF /SAVE CHARACTER RMF /RESTORE MEMORY FIELD. SMP /(THESE TWO COULD PATCH TO OTHER PDP-8 DEVICES) NOP /ONLY POSSIBLE HALT = PARITY ERROR IN 8/S ONLY. TAD SAVLK CLL RAL TAD SAVAC ION EXITJ, JMP I 0 /MODIFIED FOR PDP-5 SIN, 0 OPTR0, IOBUF /OUTPUT POINTERS OPTRO, IOBUF /VARS OPTRI, IOBUF XI33, 0 /VIA (INDEV) TAD INBUF /ANY INPUT? SPA SNA JMP .-2 /NO = WAIT DCA XOUTL DCA INBUF /CLEAR INPUT BUFFER TAD XOUTL JMP I XI33 XOUTL, 0 /VIA (OUTDEV) DCA XI33 /SAVE CURRENT CHARACTER. ION /BE SURE INTERRUPT IS ON. TAD I OPTRO /ANY ROOM? SZA CLA /A CHARACTER IS NON-ZERO JMP .-2 /NO = WAIT. IOF TAD TELSW /IN PROGRESS? SZA CLA JMP .+5 TAD XI33 /NO TLS /TYPE CHARACTER. DCA TELSW /SET IN-PROGRESS FLAG. JMP .+10 /RETURN TAD XI33 /SEND DATA DCA I OPTRO TAD OPTRO /SET POINTERS IAC AND P17 TAD OPTR0 DCA OPTRO ION JMP I XOUTL / ERROR RECOVERY PROCEEDURE ERROR5, DCA .+1 /ERROR CALLED FROM A TABLE ERR2, 0 /LIMIT EXCEEDED CLA CMA /COMPUTE CALLING ADDRESS (ALSO "SPACE") TAD ERR2 /AND USE IT AS ERROR NUMBER. DCA LINENO /SAVE ERROR CODE. ION /(JMP .+4) - FOR DEBUGGING TAD TELSW /WAIT FOR OUTPUT TO FINISH SZA CLA JMP .-2 IOF /DISABLE INTERRUPT FOR INITIALIZATIONS JMP .+3 RECOVR, TAD C200 DCA LINENO /SAVE ERROR NUMBER ISZ TELSW /TURN ON IN-PROGRESS SWITCH TAD M20 /SETUP INIT COUNT DCA CNTR CMA TAD OPTR0 DCA AXIN /INIT I/O BUFFERS. CDF P /(X-MEM RESET) DCA I AXIN ISZ CNTR JMP .-2 DCA INBUF /INIT KEY-BUFR. TAD OPTR0 /INIT TTY POINTERS. DCA OPTRI TAD OPTR0 DCA OPTRO RECOVX, CMA /PREPARE A STOP BIT FOR TTY TLS /AND RAISE FLAG. (NOP) - FOR DEBUGGING TAD P7700 /MAKE A "?". PRINTC /AND TURN ON THE INTERRUPT PRNTLN /PRINT ERROR NUMBER AND, ISZ PC TAD I PC /UNLESS IT IS ZERO, (X-MEM) SNA JMP .+6 DCA LINENO TAD P7700 /PRINT ATSIGN PRINTC PRINTC /PRINT SPACE AGAIN AND PRNTLN /PRINT LINE OF ERROR. TAD CCR PRINTC TAD PTCH /RESET "READC" DCA RDIV /IF AN ERROR OCCURS. JMP START /INTERRUPT WILL BE RE-ENABLED SOON. / CHRACTER REMOVAL ROUTINE RUB1, TAD XCTIN /RUBOUT ONE LETTER SZA CLA JMP .+6 TAD AXIN CIA TAD PACKST SMA CLA /TEST NULL LINE JMP I RUB5 TAD SPLAT /FOR A RUBOUT ACKNOWLEDGEMENT PRINTC TAD AXIN DCA T2 CDF T /(X-MEM) ISZ XCTIN /TEST HALF JMP RUB2 TAD I T2 /"ADD" IS FULL. AND P77 TAD M77 SZA CLA /TEST FOR EXTEND JMP RUB4 RUB3, CMA /SET SWITCH DCA XCTIN CMA /BACKUP POINTER TAD AXIN DCA AXIN TAD I T2 /RESET ADD AND P7700 RUB4, DCA ADD JMP I RUB5 RUB5, PACX RUB2, TAD I T2 /CHECK FOR EXTENDED AND P7700 TAD C100 SZA CLA JMP RUB3 DCA I T2 /SAVE CORRECTION JMP RUB3+1 SPLAT, 334 / SYMBOL TABLE TYPEOUT ROUTINE TDUMP, TAD STARTV /INIT POINTER FOR SYMBOL DUMP.(X-MEM) DCA PT1 TAD LASTV /TEST FOR END OF LIST CIA TAD PT1 SNA CLA POPJ TAD I PT1 /GET THE VARIABLE DCA OP+1 /(DCA I (4)-FOR(X-MEM)):SAVE NAME TAD OP /SETUP UNPACK POINTERS DCA AXOUT DCA XCT GETC /READ AND PRINT "XX(" PRINTC GETC PRINTC GETC PRINTC ISZ PT1 TAD I PT1 /PRINT SUBSCRIPT TO 99 JMS I PRNT2 GETC /PRINT ")" PRINTC ISZ PT1 FINT /PICK UP VALUE FGET I PT1 FXIT JMS I FOUTPUT /PRINT VALUE TAD CCR PRINTC TAD GINC TAD M2 TAD PT1 JMP TDUMP+1 PRNT2, PRNT OP, . / (X-MEM) 0000 / (X-MEM) "(^100+")-200 /(THESE GO IN 10005 FOR X-MEM) / OUTPUT CHARACTER BUFFER (ADDRESS IS A MULTIPLE OF 20) IOBUF= 3120 COMEIN= IOBUF+20 /COMMAND - INPUT BUFFER COMEOUT=COMEIN+46 *COMEOUT FRST, 0 /TEXT POINTER 0000 /DUMMY LINE NO. "C^100+"--200 /TITLE "F^100+"O-300 /FO "C^100+"A-300 /CA "L^100+",-200 /L, "1^100+"9-200 /19 FRSTX, "6^100+"9-200 /69 "?^100+"M-300 /DUMMY C.R. / TO SAVE TEXT, SAVE C(BUFR), C(LASTV), AND C(FRST TO C(BUFR)) / WITH ODT-JR46. THE TAPES MAY BE TOGETHER WITH / THE SYMBOLIC DUMP LAST : FOCAL + FLOAT + DIALOG . / LOADING THE LAST SECTION MAY BE CONSIDERED OPTIONAL. BUFBEG= . /TEXT BUFFER STARTS HERE. *4400-10 O1, RECOVR+1 /STARTING ADDRESS BEGIN, TAD O1 /INITIALIZE ANY 8-FAMILY COMPUTER. DCA START-1 6142 /CLEAR F.H.'S 8.((JMP ATES+1)-FOR TSS-8) 6077 /SET INTENSITY LEVEL, 34D 6152 /CLEAR LPT 6762 /TC01 6012 /CLEAR PC02 FOR PDP-5 6346 /CLEAR LAB-8 6772 /CLEAR 552 CLA CLL DCA I FLTXR ISZ CNTR /INITIALIZED BY LOAD. JMP .-2 /CLEAR INPUT BUFFER / TEST FOR COMPUTER TYPE TAD PDP /CREATE THE VARIABLE 'PDP' JMS LOOKUP /MUST RETURN ZERO TAD PDP5 /TEST FOR PDP-5 DCA 0000 O4, CMA /LINC-8 OR PDP-12? 6167 /SET LINC AC- (INITS AND KILLS 338) CLA 6171 /READ LINC AC SNA CLA JMP T12 TAD P7 /CLEAR LINC-INTERRUPTS 6141 TAD P2 6141 CLA JMP ATES-3 /YES T12, 6141 /BECOME A LINC 0017 /COMPLEMENT AC 0002 /BACK TO 8 MODE IAC /SET TO ZERO IF PDP-12 SNA CLA JMP ATES-5 CLL IAC /LAB-8? 6344 /"OTEN" 6331 /"XRIN" SMA CLA JMP .+6 /NO TAD L8A /YES DCA I L8AY TAD L8B /SETUP SCOPE CONTROLS DCA I L8AX JMP ATES-4 7354 /NL3776 TAD PDP8I /IS THIS A PDP-8/I OR 8/L? SNA CLA JMP ATEI 7344 /NL7776 TAD P2 SNA CLA JMP ATES-1 /8 TAD CCR+1 /PDP-8/S DCA I O6 /SETUP PARITY-ERROR HALT TAD O4 /CORRECT READER WAIT DCA I O5 JMP ATES PDP5X, ISZ I O2 /INCREMENT INTERRUPT RETURN JMP ATES+1 ATEI, TLS G8L, 6000 6000 6000 6000 6000 6000 6000 6000 ISZ CNTR TSF JMP G8L TAD CNTR TAD FOUTPUT SPA CLA JMP ATES-2 /8/I ISZ I PT1 /8/L = 7/2^11 ISZ I PT1 /PDP-12 = 6/2^11 ISZ I PT1 /LAB-8 = 5/2^11 ISZ I PT1 /LINC-8 = 4/2^11 ISZ I PT1 /8/I = 3/2^11 ISZ I PT1 /8 = 2/2^11 ATES, ISZ I PT1 /8/S = 1/2^11 /5 = 0 / INITIALIZE THE DIALOGUE TLS ION /ENABLE INTERRUPT PUSHJ DO+1 IOF / SHALL I KEEP EXP, LOG, ATN? (256) / SHALL I KEEP SIN, COS? (128) / XF = +1(NO) -1(YES) 0(YES) TAD XF JMS LOOKUP SNA JMP OOUT /NO DIALOGUE EXECUTED SPA CLA TAD P2 TAD M5 /DELETE X-FUNCTIONS DCA CNTR TAD FNPT DCA XRT TAD ER5 DCA I XRT /SET THE TABLE ISZ CNTR JMP .-3 TAD XF /CORRECT BUFFER PROTECT JMS LOOKUP SPA CLA TAD P7600 /(-200) TAD BFXX OOUT, TAD BFX DCA BOTTOM JMP I .+1; ERT /GOES TO START AFTER ERASING ALL L8A, 6313 L8B, 6307 L8AY, XDYS+11 L8AX, XDYS+14 FNPT, FNTABF+5 ER5, ERROR5 BFXX, TGO-FEXP /WITHOUT BFX, FEXP-1 /WITH XF, "X^100+"F-300 /X, F O2, EXITJ /INTERRUPT EXIT PDP, "P^100+"D-300 /P, D O5, HREAD+1 O6, EXIT+6 P7, 7 P2, 2 PDP8I, 4002 /(-3776) PDP5, PDP5X-1 LOOKUP, DDTJR+DMULT4+END+RECOVX+PSIN /MAKE BELIEVE DCA ADD PUSHJ /CALL THE VARIABLE SEARCH ROUTINE. GS1 ISZ PT1 TAD I PT1 JMP I LOOKUP *6321 /STUCK INTO THE FLOATING POINT PACKAGE. HREAD, 0 /HAMILTON STANDARD READER SUBROUTINE. TAD M20 /(CMA)- FOR 8/S. DCA HSWITC HREAD2, TAD HINBUF /(RSF) -WHEN DEBUGGING SMA CLA /(SKP) JMP HSGO ISZ T1 /SKIP IF OUT OF TAPE JMP HREAD2 ISZ HSWITC JMP HREAD2 JMS HSWITC /LEAVES LINK ZERO TAD PDLXR / < FRST? TAD HTST SNL CLA JMP I .+3 /YES=DIRECT COMMAND ISZ PDLXR /NO=OK TO DUMP CALL POPJ IBAR HSWITC, 0 TAD HSPSW /INITIALIZE H.S. READER CMA DCA HSPSW /CHANGE STATUS CLL CMA /CLEAR LINK DCA HINBUF /CLEAR BUFFER TAD HSPSW SZA RFC /START HARDWARE SZA CLA TAD RESTR /(HREAD) TAD PTCH DCA RDIV /"READC" JMP I HSWITC HSPX, JMS HSWITC /COMMAND "*" - SWAP JMP I .+1; PROC HSGO, CMA /FETCH NEXT CHARACTER DCA HINBUF RFC RRB /PICK UP NEXT CHARACTER AND P177 /CHECK FOR LEADER-TRAILER,ETC. SNA JMP HREAD+1 TAD C200 DCA CHAR /SAVE INPUT JMP I HREAD HSPSW, 0 HTST, -COMEOUT-13 RESTR, HREAD-CHIN / DISK MONITOR INTERACTIVE COMMAND OPERATES VIA THE KEYBOARD. / THIS FITS UNDER THE 10 DIGIT FLOATING POINT OUTPUT BUFFER. *7503 LIBRARY,TAD CFRS JMS PRNT8 TAD BUFR /TYPE C(CFRS), C(BUFR), C(LASTV), C(BOTTOM) JMS PRNT8 /OCTAL OUTPUT + COMMA TAD LASTV JMS PRNT8 TAD BOTTOM JMS PRNT8 JMP .+3 GETC PRINTC TAD CHAR TAD MCR SZA CLA JMP .-5 TAD TELSW SZA CLA JMP .-2 /(NOP) - WHEN DEBUGGING IOF JMP I P7600 /(7600=DISK MONITOR) PRNT8, 0 DCA T1 TAD T1 RTL RTL JMS PRINTD RTL6 RAL JMS PRINTD RTR RAR JMS PRINTD JMS PRINTD CLA TAD CCR PRINTC JMP I PRNT8 PRINTD, 0 AND LP7 TAD C260 PRINTC TAD T1 JMP I PRINTD LP7, 7 / USED BY 8K |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # FOCAL69 Significant work to recover original codeline and lore by Charles Lasner (cjl) Upstream is a repository at [ibiblio.org][ibiblio]. The recovery of the 8K overlay was a collaboration between Bill Cattey and Charles Lasner for the purpose of preservation of the history and disseminating the lore of how FOCAL-69 was crafted. # Manifest * `DEC-08-AJAD-D.pdf` has been certfied by cjl as the definitive FOCAL 69 manual. This in spie of its front cover saying it is FOCAL-8. Apparently FOCAL-8 was a product based on FOCAL-69 that had some changes of dubious value. * `overlays` contains overlays to add features to FOCAL69. # Assembling PAL8 FOCAL.BN<FOCAL.ZM,FLOAT.ZM You will get a non-fatal error: RD C100 +0001 This is just a redefinition of a symbol. The new definition is accepted. To Load LOAD FOCAL.BN/G We use run from a load of `FOCAL.BN` because we often use overlays. [ibiblio]: http://www.ibiblio.org/pub/academic/computer-science/history/pdp-8/FOCL69%20Files/ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | / FOCAL69 4K VIDEO TERMINAL RUBOUT / LAST EDIT: 25-SEP-2017 WDC / DEFINITIONS FROM FOCAL69 / THESE MUST NOT CHANGE BECAUSE THEY SAY WHERE THE PATCH BITS LAND AXOUT= 0017 BUFR= 0060 /POINTER TO NEXT FREE LOCATION IN TEXT BUFFER COMBOT= 0226 /PDL PROTECTION POINTER COMBUF= 0132 /START OF COMMAND BUFFER STORED HERE LASTV= 0031 /ADDRESS OF LAST VARIABLE OP= 3115 /XMEM TEMP RUB1= 3004 /RUBOUT ADDRESS FLTXR= 0014 / IOBUF MOVES. ADJUST FLTXR OPTR0= 2663 / IOBUF MOVES. ADGUST OPTR0, O AND I PRINTC= 4551 / MISCELLANEOUS DEFINITIONS. / DIRECT PATCHES TO 4K FOCAL 69 FIELD 0 /ENSURE FIELD ZERO *AXOUT AXOUT, FRSTX /OUTPUT INDEX *FLTXR FLTXR, IOBUF-1 *LASTV /LAST VARIABLE POINTER LASTV, BUFBEG /USE OLD COMMAND BUFFER, OLD DUMMY LINE AS WELL *BUFR /USER TEXT POINTER BUFR, BUFBEG *COMBUF /OVER COMMAND BUFFER POINTER COMBUF, COMEIN /COMMAND BUFFER START CFRS, FRST /ADDRESS OF DUMMY LINE END, COMEIN ENDT, BUFBEG /START OF STORAGE AREA *COMBOT /OVER END OF COMMAND BUFFER POINTER COMBOT, COMEOUT+12 /END OF COMMAND BUFFER, LESS PROTECTION COUNT. *OPTR0 /IOBUF MOVES UPDATE THESE POINTERS OPTR0, IOBUF OPTRO, IOBUF OPTRI, IOBUF *RUB1+10 /VTRUB1, 1251 /OLD CONTENTS VTRUB1, JMP VTRUB2 /OVER TAD SPLAT NOW JMP VTRUB2 *OP+3 VTRUB2, TAD RUB1+3 /USE TAD AXIN AS BS CHAR 010 PRINTC TAD RUB1+1 /USE SZA CLA AS SP CHAR 040 PRINTC TAD RUB1+3 /BS AGAIN JMP VTRUB1+1 /RESUME INPUT /DOES THIS LOCATION NEED TO START ON SOME KIND OF EVEN BOUNDRY? IOBUF=. /SACRIFICED 6 WORDS OF BUFF AND VARIABLES FOR VTRUB COMEIN= IOBUF+20 /COMMAND - INPUT BUFFER COMEOUT=COMEIN+46 *COMEOUT FRST, 0 /TEXT POINTER 0000 /DUMMY LINE NO. "C^100+"--200 /TITLE "F^100+"O-300 /FO "C^100+"A-300 /CA "L^100+"V-300 /LV "1^100+"9-200 /19 FRSTX, "6^100+"9-200 /69 "?^100+"M-300 /DUMMY C.R. / TO SAVE TEXT, SAVE C(BUFR), C(LASTV), AND C(FRST TO C(BUFR)) / WITH ODT-JR46. THE TAPES MAY BE TOGETHER WITH / THE SYMBOLIC DUMP LAST : FOCAL + FLOAT + DIALOG . / LOADING THE LAST SECTION MAY BE CONSIDERED OPTIONAL. BUFBEG= . /TEXT BUFFER STARTS HERE. $ |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 | / FOCAL69 8K OVERLAY / LAST EDIT: 21-SEP-2017 WDC / DISASSEMBLED FROM SECOND HALF OF DEC-08-AJ1E-PB / PAPER TAPE BY BILL CATTEY 21 SEPTEMBER 2017 / WITH EXTENSIVE COMMENTS FROM SOURCE CODE ANNOTATIONS / MADE BY CHARLES LASNER IN THE FOCAL69 CODELINE. / UNDERSTANDING THIS CODE WAS SIGNIFICANTLY EASED / BY CHARLES' WORK ON THE P?S/8 FOCAL 8K OVERLAY. / NEARLY ALL THE COMMENTS IN THIS FILE COME FROM THERE. / / SUPPORT FOR VIDEO TERMINAL STYLE RUBOUT ADDED / CONDITIONAL ON VTRUB=1 / A HANDY DEFINITIFION FILE VTRUB.PA IS INCLUDED / / ASSEMBLY INSTRUCTIONS, NO VIDEO RUBOUT: / .R PAL8 / *8KNOVT.BN<8KVT.PA / / ASSEMBLY INSTRUCTION, WITH VIDEO RUBOUT: / .R PAL8 / *8KVT.BN<VTRUB.PA,8KVT.PA / / OVERLAY INSTRUCTIONS: / SELECT EITHER 8KNOVT OR 8KVT. / IF 4WORD IS USED, LOAD IT FIRST. / SO THE 4 COMBINATIONS OF ARGUMENT LINE TO ABSLDR WOULD BE: / / 8K WITH NO VIDEO RUBOUT: *FOCAL,8KNVT/G / 8K WITH VIDEO RUBOUT: *FOCAL,8KVT/G / 4WORD AND 8K WITH NO VIDEO RUBOUT: *FOCAL,4WORD,8KNOVT/G / 4WORD AND 8K WITH VIDDEO RUBOUT: *FOCAL,4WORD,8KVT/G / / DEFINITIONS FROM FOCAL69 / THESE MUST NOT CHANGE BECAUSE THEY SAY WHERE THE PATCH BITS LAND ADD= 0061 /CHAR. BUF. IN. AXIN= 0010 /PACKING AUTO-INDEX REGISTER AXOUT= 0017 /OUTPUT INDEX BUFR= 0060 /POINTER TO NEXT FREE LOCATION IN TEXT BUFFER C200= 0123 /PAGE ZERO CONSTANT 200 CFRS= 0133 /POINTER TO DUMMY LINE COMBOT= 0226 /PDL PROTECTION POINTER COMBUF= 0132 /START OF COMMAND BUFFER STORED HERE DDTJR= 0004 /USED FOR DEBUGGING DGRP= 0425 /DO ROUTINE ADDRESS DGRP1= 0441 /DO ROUTINE ADDRESS END= 0134 /FIRST VARIABLE LOCATION IN 8K VERSION ENDT= 0135 /END OF TEXT POINTER ERG= 2225 /ERASE LINES ADDRESS ERT= 2214 /ERASE TEXT ADDRESS ERV= 2217 /ERASE VARIABLES ADDRESS ERVX= 2237 /ERASE VARIABLES ADDRESS FINDN= 2246 /FINDLN ADDRESS GET3= 2345 /GET ONE HALFWORD ADDRESS GONE= 0232 /COMMAND PROCESSOR ADDRESS GS1= 1437 /SUBSCRIPT SEARCH ROUTINE ADDRESS INPUTX= 0271 /IMMEDIATE COMMAND ADDRESS LASTV= 0031 /ADDRESS OF LAST VARIABLE LIBRARY=7503 /DISK MONITOR INTERACTIVE MODIFY= 1256 /MODIFY ROUTINE ADDRESS OP= 3115 /XMEM TEMP OUTDG= 6154 /OUTPUT ONE DIGIT ROUTINE PACKST= 0027 /RUBOUT PROTECTION WORD PACX= 2530 /BUFFER CHAR PACK ROUTINE PC= 0022 /PROGRAM COUNTER PCK1= 2535 /PACK ONE HALFWORD ROUTINE PDLXR= 0013 /PUSHDOWN LIST AUTO-INDEX REGISTER PT1= 0030 /TEMPORARY FOR TDUMP ROUTINE, ETC. RECOVR= 2740 /START OF RECOVERY ROUTINE RECOVX= 2761 /ADDRESS INSIDE RECOVERY ROUTINE RETRN= 1563 /ADDRESS OF RETURN ROUTINE RUB1= 3004 /RUBOUT ADDRESS START= 0177 /FOCAL'S INTERNAL STARTING ADDRESS TDUMP= 3052 /SYMBOL TABLE TYPEOUT ROUTINE THISLN= 0023 /LINE POINTER FOR FINDLN TSTGRP= 0163 WALL= 0664 /WRITE COMMAND ADDRESS WRITE= 0635 /WRITE COMMAND ADDRESS WTEST2= 0653 /WRITE COMMAND ADDRESS XDELETE=2062 /DELETE ROUTINE ADDRESS XENDLN= 2360 /ENDLN ROUTINE XRT= 0011 /TEXT, ETC. AUTO-INDEX REGISTER /VALUES DERIVED FROM EARLIER DEFINED VALUES IFNDEF VTRUB < IOBUF= 3120 /LOCATION OF I/O BUFFER > IFDEF VTRUB < FLTXR= 0014 / IOBUF MOVES. ADJUST FLTXR OPTR0= 2663 / IOBUF MOVES. ADGUST OPTR0, O AND I PRINTC= 4551 > COMEIN= IOBUF+20 /COMMAND - INPUT BUFFER / MISCELLANEOUS DEFINITIONS. NCOMEO= 0100 /NEW COMMAND BUFFER ADDRESS P8K= 0167 /8K POINTERS START HERE F1SUB0= 2564 /1ST FIELD 1 SUBROUTINES LIVE HERE F1SUB1= 6160 /2ND FIELD 1 SUBROUTINES LIVE HERE F1SUB2= 7525 /3RD FIELD 1 SUBROUTINES LIVE HERE F1SUB3= 7557 / DIRECT PATCHES TO 4K FOCAL 69 FIELD 0 /ENSURE FIELD ZERO *0000 /BECAUSE IT IS IN THE BINARY 0000 /BECAUSE IT IS IN THE BINARY *PC /OVER PC PC, 0000 IFDEF VTRUB < *FLTXR FLTXR, IOBUF-1 > *LASTV /LAST VARIABLE POINTER LASTV, COMEIN /USE OLD COMMAND BUFFER, OLD DUMMY LINE AS WELL *BUFR /USER TEXT POINTER BUFR, LINE1 /BUFFER START, IN FIELD 1 *COMBUF /OVER COMMAND BUFFER POINTER COMBUF, AXIN /POINT TO NEW INPUT BUFFER CFRS, NCOMEO /POINT TO NEW DUMMY LINE / BADGE LINE *ENDT /OVER RESET VALUE FOR ERASE ENDT, LINE1 /POINT TO NEW SPACE *P8K /OVER AVAILABLE POINTER SPACE DPC, PCD /TAD I PC ROUTINE POINTER DTHIS, THISD /TAD I THISLN ROUTINE POINTER DPT1, PT1D /TAD I PT1 ROUTINE POINTER DXRT, XRTD /TAD I XRT ROUTINE POINTER DAXIN, AXIND /DCA I AXIN ROUTINE POINTER DAXOUT, AXOUTD /DCA I AXOUT ROUTINE POINTER (NOT IN P?S?) *START+2 /OVER TAD CFRSX NOP /JUST POINT TO LOCATION ZERO (ZEROPC) IN TEXT FIELD *COMBOT /OVER END OF COMMAND BUFFER POINTER COMBOT, NCOMEO /NEW COMMAND BUFFER ADDRESS; NO BIAS NEEDED *GONE+23 /OVER DCA I AXIN JMS I DAXIN/[AXIND] /CALL 8K STORE ROUTINE *INPUTX+2 /OVER TAD I PC JMS I DPC/[PCD] /CALL 8K READ ROUTINE *DGRP+11 /OVER TAD I XRT JMS I DXRT/[XRTD] /CALL 8K READ ROUTINE *DGRP1+4 /OVER TAD I PC JMS I DPC/[PCD] /CALL 8K READ ROUTINE *DGRP1+14 /OVER TAD I PT1 JMS I DPT1/[PT1D] /CALL 8K READ ROUTINE *DGRP1+17 /OVER TAD I PT1 JMS I DPT1/[PT1D] /CALL 8K READ ROUTINE *WRITE+15 /OVER TAD I THISLN JMS I DTHIS/[THISD] /CALL 8K READ ROUTINE *WTEST2+6 /OVER TAD I PT1 JMS I DPT1/[PT1D] /CALL 8K READ ROUTINE *WALL /OVER TAD I PT1 WALL, JMS I DPT1/[PT1D] /CALL 8K READ ROUTINE *MODIFY+7 /OVER DCA I AXIN JMS I DAXIN/[AXIND] /CALL 8K STORE ROUTINE *GS1+1 /OVER TAD STARTV TAD END /USE 8K END INSTEAD *RETRN /OVER TAD CFRSX RETRN, NOP /JUST USE LOCATION ZERO IN TEXT FIELD (ZEROPC) *XDELETE+23 /OVER NOP CDF 10 /USE TEXT FIELD *ERT+2 /OVER DCA I CFRS /WITH THIS CHANGE WE NO LONGER CLEAR OUT VARIABLE VALUES CDF 10 /GOTO TEXT FIELD ERV, DCA I CFRS/[LINE0] /OVER TAD STARTV CLEAR FWD PTR IN DUMMY LINE CDF 0 /OVER DCA STARTV *ERG+4 /OVER TAD I THISLN JMS I DTHIS/[THISD] /CALL 8K READ ROUTINE JMS I TSTGRP /SKIP IF G(AC) = G(LINENO) JMP START /OVER JMP ERV JMS I DTHIS /GET THISLN FROM FIELD 1 *ERVX /OVER TAD STARTV ERVX, TAD END /USE 8K END INSTEAD *FINDN+5 /OVER TAD I XRT JMS I DXRT/[XRTD] /CALL 8K READ ROUTINE *FINDN+14 /OVER TAD I THISLN JMS I DTHIS/[THISD] /CALL 8K READ ROUTINE *GET3 /OVER TAD I AXOUT GET3, JMS I DAXOUT /NOT IN P?S 8K PATCH *XENDLN+1 /OVER NOP CDF 10 /CDF TO TEXT FIELD *XENDLN+14 /OVER TAD STARTV CDF 0 /BACK TO OUR FIELD JMP I XENDLN /RETURN WITH VARIABLES INTACT *PACX PACX, CDF 0 /OVER NOP (NOT IN P?S 8K PATCH) *PCK1+4 /OVER DCA I AXIN (DIFFERNT IN P?S) JMS I DAXIN /FIELD 1 DCA I AXIN DCA ADD /CLEAR PACKING WORD CLL /WAS CLL CMA IAC TAD C200 /WAS TAD P13; NEW PDLXR BOUND NOP /WAS TAD AXIN *F1SUB0 /FIRST NICHE HOLDING FIELD 1 ROUTINES. PCD, 0000 /FIELD 1 TAD I PC ROUTINE CDF 10 TAD I PC CDF 0 JMP I PCD *PCD+6 /DON'T KNOW WHY LOCATION 2571 IS UNUSED. AXOUTD, 0000 /FIELD 1 TAD I AXOUT ROUTINE CDF 10 TAD I AXOUT CDF 00 JMP I AXOUTD IFDEF VTRUB < *OPTR0 /IOBUF MOVES UPDATE THESE POINTERS OPTR0, IOBUF OPTRO, IOBUF OPTRI, IOBUF > *RECOVR+10 /NOT IN P?S 8K PATCH CDF 00 /REPLACE NOP WITH CDF 0 *RECOVX+6 JMS I DPC /CALL FIELD 1 TAD I PC IFDEF VTRUB < *RUB1+10 VTRUB1, JMP VTRUB2 /OVER TAD SPLAT NOW JMP VTRUB2 > *RUB1+14 CDF 10 /REPLACE NOP WITH CDF 10 *TDUMP /OVER TAD STARTV TDUMP, TAD END /INIT POINTER FOR SYMBOL DUMP. *TDUMP+10 /NOT IN P?S 8K PATCH JMP I DDDTJR /OVER DCA OP+1 *OP OP, 0003 DDDTJR, DDTJRD /DO FIELD 1 DDTJR WRITE IFDEF VTRUB < "(^100+")-200 /IF THESE GO IN 10005 FOR X-MEM CUT THIS? VTRUB2, TAD RUB1+3 /USE TAD AXIN AS BS CHAR 010 PRINTC TAD RUB1+1 /USE SZA CLA AS SP CHAR 040 PRINTC TAD RUB1+3 /BS AGAIN JMP VTRUB1+1 /RESUME INPUT /DOES THIS LOCATION NEED TO START ON SOME KIND OF EVEN BOUNDRY? IOBUF=. /SACRIFICED 6 WORDS OF VARIABLES FOR VTRUB > *F1SUB1 /SECOND NICHE HOLDING FIELD 1 ROUTINES THISD, 0000 /TAD I THISLN FROM FIELD 1 CDF 10 TAD I THISLN CDF 0 JMP I THISD PT1D, 0000 /TAD I PT1 FROM FIELD 1 CDF 10 TAD I PT1 CDF 0 JMP I PT1D *LIBRARY+22 MONITD, CDF CIF 10 /OVERWRITE OLD IOF JMP I DF1MON /OVERWRITE OLD JMP I P7600 *F1SUB3 DF1MON, F1MOND /FINISH MONITOR CALL OUT IN FIELD 1. XRTD, 0000 /TAD I XRT FROM FIELD 1 CDF 10 TAD I XRT CDF 0 JMP I XRTD AXIND, 0000 /DCA I AXIN INTO FIELD 1 CDF 10 DCA I AXIN CDF 0 JMP I AXIND DDTJRD, CDF 10 /DCA I (4) IN FIELD 1. DCA I LDDTJR CDF 0 JMP I .+2 LDDTJR, DDTJR TDUMP+11 FIELD 1 *0 0000 /THE BINARY HAS LOCATIONS 0000 /0000 - 0004 FILLED WITH ZERO 0000 /DONT KNOW WHY BUT WE WILL TOO 0000 0000 5051 /DONT KNOW WHAT THIS IS YET. F0BUFR, BUFR /PTR TO F0 BUFR POINTER LINE1P, LINE1 /INDIRECT PTR FOR START OF BUFFER. *NCOMEO NCOMEO, 0 /TEXT POINTER 0000 /DUMMY LINE NO. "C^100+"--200 /TITLE "8^100+"K-300 /8K " ^100+"F-300 / F "O^100+"C-300 /OC "A^100+"L-300 /AL " ^100+"@-300 / @ "1^100+"9-200 /19 "6^100+"9-200 /69 "?^100+"M-300 /DUMMY C.R. CDF 0 /SHOULD F1MOND BE HERE INSTEAD? TAD LINE1P /NOBODY SEEMS TO CALL IT. DCA I F0BUFR /NOT SURE WHAT THIS DOES CIF 0 JMP I MONST F1MOND, IOF TAD I F0BUFR /NOT SURE WHY THIS IS NECESSARY DCA LINE1P CDF CIF 0 JMP I MONST MONST, 7600 LINE1=. /USER TEXT STARTS HERE FIELD 0 /RESET FIELD FOR NAIVE OVERLAYS $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | # FOCAL69 Overlays ## Features There are 3 features available here as overlays: 4WORD -- Extends floating point calculation precision from 6 to 10 digits. 8K -- Allows FOCAL69 to use an additional 4K of memory for program and data. VTRUB -- For use on video terminals, to overwrite rubbed out characters. All three features can be enabled at the same time but to do so they overlays must be loaded in the proper order. ## Source files The source for 4WORD has not been recoverd yet. It is available only as a binary patch. 4KVT.PA genrates a video terminal overlay suitable for use without the 8K overlay. 8KVT.PA generates the 8K overlay with and without video terminal rubout depending on whether or not VTRUB=1 is defined. VTRUB.PA is a one line define of VTRUB=1 for use in assembling 8KVT.PA to make it emit an 8K overlay with the video terminal rubout support. ## Loading overlays To get 8K without video terminal rubout support: PAL8 8KNOVT.BN<8KVT.PA To get 8K with video terminal rubout support: PAL8 8KVT.BN<VTRUB.PA,8KVT.PA To get both 4WORD and 8K use the following: LOAD FOCAL.BN,4WORD.BN,8KNOVT.BN If or use 8KVT.BN instead: LOAD FOCAL.BN,4WORD.BN,8KVT.BN If you want to use stock 4K FOCAL69 with video terminal rubout: LOAD FOCAL.BN,4KVT.BN If you want 4k FOCAL69 with both 4-word floating point ant video terminal rubout support: LOAD FOCAL.BN,4WORD.BN,BKVT.BN |
> | 1 | VTRUB= 0001 /ENABLE VIDEO TERMINAL RUBOUT |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | # KERMIT-12: Kermit Software for the Digital Equipment Corporation PDP-8 and PDP-12 Written by Jerry Sands, Randy Hippe, Martyn Hemmings, Sepp Stadelmann, Richard Schlerf, and Charles Lasner. The codeline here uses [Columbia Kermit-12 Archive Distribution k12.tar.gz][k12-dist] as upstream. Another source is [ibiblio.org k12][ibiblio]. The Columbia Archive has two differences: text files k12mit.not, and k12mit.dsk are more up-to-date. [kermitproject.org][org-project] says: Kermit is a robust transport-independent file-transfer protocol and a large collection of software programs that implement it on a [wide variety of platforms][platforms]. In addition to file transfer, many of these programs also make network, dialed, and/or serial-port connections and also offer features such as terminal emulation, character-set conversion, and scripting for automation of any communication or file-management task. The Kermit Project originated at Columbia University in New York City in 1981 and remained there for 30 years. Since 2011 it is independent. [CLICK HERE][project] for more about the Kermit Project. The [Kermit-12 Site at Columbia][columbia-k12] was frozen in 2011, but still has useful information (even though many links there no longer work.) Excerpts from that page: Kermit-12 was written for DEC 12-bit processors including PDP-8, the PDP-12 laboratory computer, and the DECmate I, II, and III, WT-78, VT-78, and VT-278 word processors. It runs under OS/8, OS/78, OS/278, and OS/12. File types found in the Kermit-12 distribution are: | File type | Description | --------- | ------------------------------------------------- | .ann | Announcements (plain ASCII text). | .boo | ASCII-encoded binary encoding to be decoded by k12deb.sv | .bwr | "Beware" file (hints and tips). | .doc | Plain-text ASCII documentation. | .dsk | Description of files (plain text). | .enc | ASCII-encoded 12-bit binary encoding to be decoded by k12dec.sv | .ipl | Initial program ("bootstrap") loader. | .lst | Load map. | .not | Notes. | .odt | Octal Debugging Technique (bootstrapping). | .pal | PAL-8 assembly language source code. | .upd | Update notes. ## Operating Instructions (Extracted from k12mit.pal) KERMIT-12 FOR THE FAMILY OF 12-BIT DEC MACHINES. **BRIEF USAGE DESCRIPTION.** KERMIT-12 IS AN IMPLEMENTATION OF THE KERMIT PROTOCOL FOR THE FAMILY OF 12-BIT DEC (AND COMPATIBLE) MACHINES GENERALLY KNOWN AS PDP-8 OR DECMATE. AS OF THE CURRENT IMPLEMENTATION, THE FOLLOWING COMMANDS ARE EFFECTIVE: 1. CONNECT (TO REMOTE SYSTEM AS TERMINAL). 2. SEND FILESPEC (TO REMOTE RECEIVER OR SERVER). 3. RECEIVE FILESPEC (FROM REMOTE SENDER). 4. GET FILESPEC (FROM REMOTE SERVER). 5. FINISH (SERVING). 6. SETUP (ON DECMATE II/III/III-PLUS ONLY). **** NOT IMPLEMENTED **** 7. EXIT (TO OPERATING SYSTEM). 8. HELP (DISPLAYS HELP MESSAGE). FILESPEC MAY BE ANY LOCAL (OS/8) FILE-STRUCTURED DEVICE:FILENAME.EXTENSION, WHERE THE FILENAME AND EXTENSION WILL BE TRUNCATED TO 6 ALPHANUMERICS AND 2 ALPHANUMERICS RESPECTIVELY, AS NECESSARY (THIS IS REFERRED TO AS 6.2 FILENAME FORMAT). THE DEVICE: FIELD IS OPTIONAL; ALL COMMANDS USING THE DEVICE: FIELD FOR LOCAL DEVICE SPECIFICATION WILL USE THIS DEVICE AS THE SOURCE OR DESTINATION AS NECESSARY FOR THE LOCAL FILES. IF THE DEVICE: FIELD IS OMITTED, THE DEFAULT DEVICE DSK: WILL BE USED. THE ACTUAL DEVICE USED MAY BE SELECTED BEFORE INVOKING KERMIT-12 BY USING THE OS/8 ASSIGN COMMAND: .ASSIGN DEV DSK WHERE DEV IS ANY AVAILABLE FILE-STRUCTURED DEVICE. KERMIT-12 USES AN UNUSUAL SCHEME FOR ITS PROMPT: THE ACTUAL DEFAULT PROMPT TEXT IS PARTIALLY TAKEN FROM THE ACTUAL MACHINE KERMIT-12 IS CURRENTLY EXECUTING ON. FOR EXAMPLE, IF KERMIT-12 HAS DETERMINED THE CPU TYPE AS PDP-8/E, THE PROMPT WILL BE: KERMIT-8/E> THIS ALLOWS KERMIT-12 USERS (WITH DIFFERENT CPU-TYPE MACHINES) TO DISTINGUISH MESSAGES ORIGINATING FROM THE RESPECTIVE SYSTEMS. FUTURE VERSIONS WILL SUPPORT USER PROMPT STRINGS TO ALLOW MORE DISTINCTIVE SYSTEM MESSAGES. THE HELP OR CONNECT COMMANDS MAY BE USED TO DETERMINE THE CURRENT CONNECT MODE ESCAPE CHARACTER. **COMMAND RESTRICTIONS** THE SEND COMMAND ALLOWS DEVICE:FILENAME.EXTENSION (6.2) WITH WILD-CARD SUBSTITUTION. A * MAY BE GIVEN FOR AN ENTIRE FIELD (EITHER FILENAME OR EXTENSION OR BOTH) ONLY. A ? WILL MATCH ANY SINGLE CHARACTER WHICH MUST EXIST IN THE ACTUAL FILENAME OR EXTENSION, UNLESS RIGHT-MOST IN THE FIELD. ALL MATCHING FILES WILL BE SENT. NO OUTBOUND FILENAME (AS-NAME) FACILITY EXISTS AT THIS TIME. THE RECEIVE COMMAND ALLOWS OPTIONAL DEVICE: ONLY. *THE FILENAME AND EXTENSION ARE NOT ALLOWED*. NAMES OF RECEIVED FILES WILL BE MODIFIED IF NECESSARY TO CONFORM TO THE 6.2 FORMAT. *IMPLEMENTATION RESTRICTION* : CERTAIN REMOTE FILENAMES CONTAINING NON-ALPHANUMERIC CHARACTERS MAY CAUSE KERMIT-12 TO HASTILY ABORT THE TRANSMISSION AND RETURN TO COMMAND LEVEL. THE GET COMMAND ALLOWS OPTIONAL DEVICE: TO DETERMINE DESTINATION OF THE INCOMING FILES. THE OUTBOUND FILESPEC MUST CONFORM TO LOCAL CONVENTIONS (FILENAME AND EXTENSION ARE NOT LIMITED TO 6.2 FORMAT; THE DEVICE: FIELD WILL NOT BE SENT TO THE REMOTE KERMIT UNLESS IT IS ILLEGAL WITHIN OS/8 SPECIFICATIONS, SUCH AS TOO MANY DEVICE LETTERS. IN THIS CASE, THE DEFAULT DEVICE DSK: APPLIES, AND THE ENTIRE "DEVICE" FIELD IS SENT ALONG WITH ANY FILENAME AND EXTENSION). CERTAIN REMOTE SYSTEMS ARE INCOMPATIBLE WITH THIS IMPLEMENTATION, AS IMBEDDED SPACES OR NON-ALPHANUMERIC CHARACTERS ARE NOT ALLOWED, EVEN THOUGH THEY MAY BE REQUIRED ON THE REMOTE SYSTEM. WILD-CARD CHARACTERS ARE ALLOWED, BUT ONLY AS SPECIFIED IN THE SEND COMMAND ABOVE. <^X> OR <^Z> CAN BE USED TO ABORT KERMIT TRANSMISSIONS (EVENTUALLY) BUT IS NORMALLY A SLOW PROCESS, SINCE THE CHECKING IS DONE BY A SOFTWARE TIMEOUT SCHEME. AT THE PRESENT TIME, THERE IS NO DISTINCTION BETWEEN THESE THO CHARACTERS, SO IT IS NOT POSSIBLE TO ABORT A SINGLE FILE; THE ENTIRE BATCH OF FILES INVOLVED IN THE TRANSFER IS ABORTED. **DECMATE II/III/III-PLUS CONSIDERATIONS** FUNCTION KEYS SEND <ESC> SEQUENCES SPECIFIED BY SLUSHWARE/FIRMWARE. ALL SOFT FUNCTION KEYS ARE THEREFORE INEFFECTIVE (EXCEPT FOR HOLD SCREEN WHICH ALWAYS WORKS). CONNECT MODE RUNS IN 8-BIT MODE. THE COMPOSE KEY IS ENABLED FOR USE WITH A LOADED COMPOSE TABLE. ANY VALID DECMATE II/III/III-PLUS CHARACTER SET IS ALLOWED WHILE IN CONNECT MODE (MCS TCS LINE, ETC.). ALL <ESC> SEQUENCES ARE PASSED TO THE SLUSHWARE/FIRMWARE UNMODIFIED. KEYBOARD UPPER-CASE LOCK WILL ALWAYS BE AUTOMATICALLY APPLIED UPON RETURN FROM CONNECT MODE. [platforms]: http://www.kermitproject.org/archive.html [project]: http://www.kermitproject.org/kermit.html [columbia-k12]: http://www.columbia.edu/kermit/pdp8.html [org-project]: http://www.kermitproject.org/ [k12-dist]: http://www.columbia.edu/kermit/ftp/archives/k12.tar.gz [ibiblio]: http://www.ibiblio.org/pub/academic/computer-science/history/pdp-8/kermit/k12/ |
> > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | / MEMORY CLEAR / THIS FILE IS USED TO PRE-CLEAR MEMORY WHEN LOADING KERMIT-12. THE RESULTING / "CLEANER" CORE-IMAGE FILE WILL BE SMALLER WHEN ENCODED DUE TO REPEAT / COMPRESSION OF THE CLEARED AREAS OF MEMORY, AS OPPOSED TO RANDOM RELICS LEFT / THERE BY OS/8. / LAST EDIT: 30-AUG-1990 09:00 CJL FIELD 0 /GOING TO FIELD ONE *0 /START AT THE BEGINNING ZBLOCK 7600 /CLEAR FIELD ZERO FIELD 1 /GOING TO FIELD ONE *0 /START AT THE BEGINNING ZBLOCK 7600 /CLEAR FIELD ONE $ /THAT'S ALL FOLK! |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | CREF.SV oX?lP44408030422>2Lg;cXj80PR>24H4QPE2cH85APE<PT<5@\e?RPZ=@`E?@0;=1`E418[1c81 ;cX000hg6`HB=c893`H3<a\6>R0?<P\66`H?1S81;SL000\a21DH5A`E41DZ:W4a00<07`0?800[ 7P042`0:00PQ1Sl6<chT1b4800lW02F0P820P820P9X0~~~~~~~3]YX<0@2P~6OonO~3RNKb3dML XYL0~<M_[o7P00~6B0000803o`3`~3P94;0P00~=O`T8180G20lfO[T0a6o46?bLm_ooSO\0O@Ml AW\PDPokn_md5_F:S@20O`1\B5SoPC2>74`200Ro7A2Pd0oo?g00oRo0P2838@:`203l1?20LaoP oCmeH400ic>0C;D?P0n5R?J9nTlI2a69Q`ooo[\0~;P87\RC0fNa\VUgXV<7Ti6i9:N?>efnVS jNUdO?bITH2RAX7R1X;R1X3R^X22A03PROg3PBS?o8T\oH5lZ@2`nbPo\oZgR@c3POW7R@c3?`aS POS;0<4>9oMSmRP?`TZn22OVm@2`RGO3M_@2e]ISPLg;0:0>RYJj0h<6PdH^18?R1X?RjNUbnj0_ X8?VW8:P321RNJ0_jWbijmR^87QRkf[i>?l?dLm4c^Y84h@oQH28MGBIonZHo`RC4g=Y`B8?ScnT PgFYPa>RZbP_L_jb:83joJP_P3nT27Gi5:1:LBPVL:JJ5:`XKfhY4fdRZ8?jK06o02P25BQRX6_b iNIVinQVJQ8V5D0^:10_`1FVJNDVP?cR;O]R5aER@1OS4<cj;LIJ8AOS8AOT;A94aVZR4_aR;BeS jNTVjJP_nRdSJ7XY;A94enVV[02`~74@8826<C4f8Xn?Yj4i8JX2o]jZ]djY_`@O1UgamcWPKX :2l@22H84cIc`I0V2?oNLjV`A`l8foZFLjWK8Pl8g_[Q4h;oX2nM2:;X7V:Xa?XCoR:X0OkYIfTS ]@X^IR8ERF`E5CJ1oLTE7[86f>noL:TUIkTQ_@[l_iZnIJUToIWYX2okj[XC6R:Pb_[Xnf\CoR8X b?[j:2l8Hd8X:o]Z:2oin;:Pj_[g7[:XQ?XCHRV40:1k6bKf72HMhF\0~24olRZ?_kQ02PKcTR >Nm[7m<47S06cCKf3@<1`^LfDDGo0:066l0_P:2bHOl2H?kboAdTTAbS71adWDB^f=QRAQGV5DH^ 5MPR7:1n7A]T083[~3XMLffMMSf=MTemLff24^edP^:=Wdf2lVla:4@8W\2h4lH20>2R0nX<;j 4[A:XLi:fJ0_bRnR4:Wjf:YZ;aP_0BoV;b0_dbnTcTJ^;Z5TX@2`~3O1C_O7coO7coO7coT@R` 10@010@010@002P?lOnRH5obHEhRjP2`;dH^A0\VG@XVJQ8Vlan`l>7o0?l98R0^8nP_Z2:T8TH^ 5aMRJQDV5B0^;Q8VRAG35b1n5ADV81OR5a9TTh6\P6[R4PYSR@_7PA;4XH2[OPJF^_j2Z:[j4b4^ _kYX_jP_G1>bKJP_G;6j00P34a=R^P2`02h2IQDVRAG3b<oj::P_ce^R5ADg84CR4V1R5ADE06KR b=cj4]5:PL3;PGk9:P1PIS0V;j1^8R4^4V]R<30V;oe9lhU\<2Pon4BR5@9_5AEdFQDWPA;4imn[ 7<`SH7?b9_m;oP6N8V1R>3P6JcTV=RV6FEPW<OeR:ALV5c<f:B0^4U1^11;TV2fV:O`R=2UREoHV mSAc>OLV>DX^EQ86<B4^<aDVRCW35VIR>CTV5\P_c3VSH342<HU\>F0`PD3>maP_gV2^5I0_gXV\ 5CTW<C54PA;2mRab;JP?eV^RmoLV4R0^8RP_nc:f>JI:P2WT:D0^9i0_m3:RA?[PECPVnOJC0B;V =XV<X3WWPOS;nHjJ~3m^la`?EcHUXRKP1TIb6@G<:hG<bh]a=R]20_\jP_0K;VRAG35KMRT`9_ 5LPoXBRRZ:7j]KN2W@9_5E\b5H5l5;DX\ZP_G:2n5ADV]j`V0QCb8AGWPEc;0>l?E03`5`9_5F0` 8AGR5QMR5QEePKG;02h2IQDVRBk3PL3?`\9;02T6EbTR5QIS8BoRj=Sj:Li:f\b;02T2APC^\=X[ 0=X6GWXYf^9:h02`ib4n4d0^inLdinLd48SoZ>OdicFdoojI52QVoH2`P704gh0UX2KV28Sj@414 MH:F8R4^<fIR<99ZE3nD27GiKa\V:4=Rm31TRC33PDS?jGVY6iQ:JVhY<4X^ERl6oj^FRC33=P9_ =\PoA6<R6cISH1\28A_VX3KR=SISlj1^=SHVZl0V0SKclj0_ao>VIUhR<CISX<ojLBPV^cJSPOk9 <GXYX6kY6mi:<hi:=JP_L_fkm;]:@o@VE3nD27Gi@fhY^h2^IS0R<3=TUmZZo?^InP2`mP3`9\P_ mOE;1<`E^P1E;<`C0?l28KSVk;HV]iDVP02`o[@6L8VK7U?0oJ0_U7N[U@9?\JjZ]4H^1_cP]KDg ]4X^2PS^o;H3][MbUKIT^;=:^N0XP8V;][DV][A2]XUk~4U@X0P0P0n`;>eV;5RFagPCb::\T1 0PlmnZV9Ml>1R\`Z0i18053GnJO>kBJ0^X\1RHagn32XmOYgMS1gagX0j`KgnI?inG=@cn:@lo[5 09200>0mmjW]kBKPO[THOVTBP6K`=OFcB0D0oOooP032X2n:k:SoNBWnNRW\c8S2Z2omNRUjNYWl nb6PSo[knS8XV_[in2V::\T8m`>93<N1m\>93<Lo32Ne32MgPCc2\DZ:D\T6~3RPaB19180534 `jC1PJj1R\aB191Z0620N>\0~2OQjFORBF~7L0W<l[:Pj?Xo:2mZ4RK\4XC_Nj8BmF9j4YCKJZ8B k6PBkdY002hoc6^P4^HPhNX0D@9jD99jk9\0n0Wg[D3?kDCP04R0^0AoVP2`WP<0X0je]fCo]RJ0 P;T0U`BeUdZgZ2nERJbfPCbXR?^jc8R9UjZYYJZ;UbJ7oS1:2^kK2Rh:QnBZQj?nf`J7Qd?m:0n9 DZ;l:2n8nk:84dJ80;2?0?00~3R@bfnS0PM_9J2^jh]VBfgCJf]dJ1^\\20@40^090b^8@^?HH ]oAj2^h:bn;KPFbi0920093^gJ;:gBKKMb14fn9g80jeRf:Gg6:7c6^g`4oOOZTT060V8LceP:kc 3k;`V_1VOo00SomAD1;mm1;mQP4g8S:<i208SA:]W0<8B2=EZ03PC@?doB26eQ2;B2>]W0<A11:: R@;Bo@26eQ28]A98i303m3:d3EHBf00N033o7bKC78@L_D[C78@9HST9oS1R69:Pd?[m2BH12N4O 7bH9HST9HSW^o21?7RKkdY_kG9^e01214N892F?^kV;jZ2o@dj_YZ2oTjJCTnJ]@ABTA22Kh0;3B AP4C3CD0m`W_<V8Xm__^9kT;cC^nWVIPhO4_X02fH0D0Q`=61^h6M^20jk@0W0JMSVZMW4JLob90 S?[noBVLWF;mNYVLNRT`R4\0~34@88o6W\a::XZ_[4XDYSnbLC6R8XXOY_Z2nk2:;j`2ng4j95 4i9>X2nQDJ95nI\NDl3hX2nNN;\0~2mhnOb07ni_MYP<SoF^HRiT1^iPP^P5S_D_HRmF=bi^0_ aOBblo=clVIblO1bklEk~37QmV8>M[AW:;8<]UPLXEQmaEP=J4PCMloEkf0fWfR6YB:]H?nX0n ?Z]0P80dE_nBoRUbh:7jEWZB32P?WofY3OdY3_dY3b4^5jP_XH>R:0nB8AORo5^B:82K6_]22_YR 2oUR8giR2P]g8j]:3:A[WFTY:;;kJ80V4f4^P>Lf6=?j6QMRJh03JX2Cn:@VGf<iGjAc755Y5jA4 0>L4b@RSGh1bmj@V0;8;MG:I720^9^9ZB2VBh?Kg9]i:boHWO`2`ik8VOV4^J>Lf6;;kJ6XiJ?Db aA>T720`Dn1?0N53b8lX<6^KPH[<:PF@4hTlojPoP7NSX9OjPH[<DPZ@400e0=d:THT\Mh5loXVL 384ljVYR4XU\jH4loNUdoA94WobYnoZ@nOUcX?SgmbNB8BOVROo3PH[<:P6@0@9o^?HWmOBB:_=S PF82l`Qc4]EX6JP_l_4R20QS8`QS90QS4PQS2MEXl02`28Tl2H5l4]I:eGji301PAPC^4=ok2Y3_ 8>oWgh6o0>h28YeZ7D<5bj>jL>H?`;[e^DmI6G8En<d@aDQU08nO0?l9PHW\oQPFoH4lo8VL`?kS nbP?Uh6\JJP?ULZRn\ibF81nROk3POW0::CjDZP?baVT6?Q7P8W\oX4l`?Ok@<SRm\UbmHUlm0Pn 4<7jA?CWPH[<l`R@cUPWb_XWGo8WP5Bnm85lX?7Wl>nK\K6QUV>RkZAjR@2`kH6L9`H^1=kPjMPV PN_30=SVf^\W>>\30>3bk:0_jMRRjbMddH6\cf2i0<8`a>]XfT:e\l0OYE;fYidHT<0@U0Ragj>? Y:W`e@3P~4>0RX~3I`S60300O`Sl~3PPSl~3Q`PZ~3Q`Sl~3RPPZ~3RPSh0100R`PZ~3R`Sh0100 Z`PZ~3<PW>0100>PWl~3G0U80300N`Un~3R@Wl~3R@U<0200R@U80300S@U40400\@VP0200\@TN 0300d@Un~3d@Wl~3e`WB~3h0UD~3h0TN0300h@Wl~3n@TN0300<`XZ~3<`[h0100F`ZP0200QP[d 0200R@[d0200X`[B~3X`[l~3[0XN0300\0Yn~3\`[l~3m@[h0100m@[d0200n0[l~3nPYn~3o@YD ~3o@[l~30@_l~310_B~31P]D~31`_l~320_l~320_h010020_d02009@]80300:@^40200:@^P 0200:`\Z~3;0\Z~3;0_h0100;P\Z~3<0_:0200<P\Z~3<P_h0100=@^P0200>0\Z~3>0_h0100 B@^X~3B`_l~3CP_h0100E0\N0300F0]n~3F`_l~3F`_>0100o`ooooo6gc>H5ol0~5;3L38[lQ ?2H10;l1H7T2c[lAO`@20;l1SBl2Q;lQSS40d[l1[HL08[lQ_Bl26[m1dj020;l1h:P0094;h5X3 6[m12`PCm;lQNP0@0;l1P00@0;l1R7h@0;l1nJ0B0;l1NDTSn;lAQZdPo00<XB\Q0;l1XHDSd[l1 nHPR9[lAnEXSC;lQ:J@bo00<C@@d0:X2oooooooo17gPoB<Va]lcV1Oo~6[HL08klQ[JD3Pkl1 _8P29[lAg=D0B0<ah;D2CklQj[D2Dj\[1Mh@Z;l11OdACKlQ1OdCo@0\1@@D;28<NP0@0;l1P:d@ o;l1P50Bf;l1P6HB0klaP4TD0klaFkDRCklQNDTSn;lAXB\Q0;l1XHDSd[l100LbO[l1C@@d0:X2 o8daB;laA0100;l1APM2RKl1oooooooo08L2AHQYRDDVP8ZkWXe[0909RP2`28ekROm2:dIXo_dW RAW2Z:7jo?\Wo?XWooTWYobRn?abmoabnH5lcOJ;01;VX2;RAS3VRC33mJP_aa:RAR3^5OAR<0XV m0\V2P\g5Ki:4P4^8X5\o?>b<18T[o:Yl@2`ERORV<gk8TH^l>lW;:YRk\ek084>R^g90^D;0>`; gn\Wf]:`AP0@eP1002l5AX1@96<b1744^_a?0mh:0clO<d?oMf?o_hhD703321<fol6@9XWj4ohY P?nY\4L?28KjoAjBZ83jROc3PL3?WO^SVaiR1P;_n_Vi8OP9moZKX2;R8A;V5OIR5ADVRAG3mJP_ ]AFS@?Cb5A9dah6\nP2`]lHf]hU<a_<`aZ1^l\Hba\ISPKO;0?425ADV5AEdZP2P~d0`0O3`00 gXX4`0:08B:o\a6ThO40ib<0~~~~~S |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | (REMARK Image File Created by PDP-8: 30-Aug-1990) (REMARK File Date: 23-Jan-1984) (FILE CREF.SV) (REMARK File decodes to CREF.SV Version B0. Taken from) (REMARK DECUS DM-101 OS/278 for DECmate II.) (REMARK Should work on any OS/8 family system.) (REMARK A recent assembler is required for assembly of) (REMARK the KERMIT-12 source programs; Version B0 is the) (REMARK latest version. This is the companion CREF for PAL8.) <VVM8620484007040090371P76BT3K8G2109OG88H4KC01E1M25AHG0PC14OLA2P3T8K16> <L8C0FDG04Q53GGGM4G0E4P05S1Q603GS4DI0O1NICG0UC306DGR0ENI00P61C0RU1G0C4> <P05O1N600GM4482K8LA71118AJ58BH000060FV00H0M001SG001EG0400GG0367SHJ8FG> <0F0GI01OFG002B200G240100802D00000X004S1DM9L80G0000X0003IVVVU00003S95P> <IGVH3GK84NX0008UTNVK0F00000X00030I000003G3VVX0003105P20100000X0008IVS> <0G0202VO8MDKNSO0FOJU4O67PPVRFVUSD003NQTUB8O10UKNVNVTFEH8M12G8Q200FTBC> <GI1VU20KHR0S00K006VG3K50VK3VU0VI03VU5G18001I445G027VO021G3RJ7O7VQHQGC> <0O07PTO0L601VS0V1B8GI4VV88P22O8JU3RVUVUX0008T0682E4M60JRC6P9EPT362BP8> <6T95DS5UEMR7QBUIJKPFIFSL4981P32G7G650N0CA08N8K0SH001I4JVN41UA1FPI4NVN> <41NA800FTV52TJFUM8IC6CG5VPP29GOOVJ1J41NU001R0M4SVN1TNIHF1E9BG8C9TVA00> <CH4RN0THF8RB3QR41NJ801QGBHAKM00R86A1U8RG450V0CA1NT4N95UVQ1QG6GEKS10J0> <O8G2F7T0NQKNPBLUR1H04U7UV5L073VV9KACUJ78T8OJV148B209EMBKJVSEL7VJ11GJI> <SOC3SHAHT1VL0SNBA1I2CLBUA5N4BVF52K05VFQHA047VO8ITA19AG2E5H8IS5AC8A8LG> <JFIRH169MVL2K3MR7G200251GL4A7Q09LMSLN6DPREG9L628GLSG12HS8AO1GL4QBEBQ0> <2VHHD5UR1E8AU80ONU45COKMQORH165V22GBK5L0ILHH6KO92VHHD6B9EIRKIT7T85UHI> <Q9K9F91D84LDERKRLG00X000544B0GC462CGJUA5FH5T22CGQV85ERFL9EIVAVS0425IV> <RS3JD7HEHSK221G8623175PGO7P6U25DT5PGM3Q7U25DNAB9EC6RU8NGHBF8S4GJ5VVQ1> <AEI11N847NQHB222CNUVA702RKPCS13LD92S9J62N4965B1BI0PVMOL47N0DVCANUBGM9> <CME0GQNMFSLFTBT5IPCIFT5QFQ1FTQT8GJ46NQ1B56T2VR44PFTSKAP0NQUA20G9HV52P> <B4QNIHFSIV3T0LQLVE8FFL2K444SM5A2000JRC6PFCOE63MV10000089IVVT8NUT88002> <DSHPCEDUU0FKQC0UCC7SQOR01K837GJEFT8V8K00D811NV0BG0L00O9FVTG2VONT87D92> <CE73H0SL7F48RC2R3I6C591BP322KMOE77A0OEK3FG0N0000003K5MNDM9TERC4QSUNDL> <PDHOGIQVI8UA2DIBC65U7J84N41I4J1F410O720C5E43T0LGI15AQ4K6ME5MFQ1B525VO> <GLABDHAL25VOOS0B2U8NV42MJ8BTCTP365P51N880000003JSU57NPTUFFJRSUV7NPE8G> <1004X0105007IHBOIVVR04NP629FBT8004BV4C9261CITC2H6KO9BUC0VVS7U2009VSH2> <S8127VKAL11248N4COBI2SJAC591BOG25PGIP29HASBU40GLC5F208BM2T0IL4U83Q02D> <9GI62M8IS5SG50IL8DO15V60Q5Q5VNQHAL22FH1DFSBKAVVL2QS44P6RUKBBILH001GGO> <9I2ETQ000008N2CPGLP29HBV4APSH8VA5CU9DJ2LOLS8148O92C08LA5F009JFP2MS84L> <D3I0RO341IVJ2K002CPHGCBVA08HE45GI4QP30OO45UFTDSU8ICOF52NO4H31BS172L0L> <4MJHBI0K2AN7NNP1OF6FC0JJ89LVV7VE05H24O03GOS2DDHPGDJ2I9CNB1HH5V92IOBJ2> <THJ4AF20O9EA3G484L9GOMI54NSCD12I9BMUPVM6D13IRRI77IA0LJ148OU44HJC5E8IC> <SM2OJ64EB3I8BFP2MC6E8608OM67496E861I0U80NNU65DTPG22NSGLNM8I8AN751H8CE> <82897UOHC0BFQHBB2DCNNDTP15OG24BP8NUR34GSQKRK08A92JP024VSGLT135P20V8IL> <CE4VIFRE05H2GDM8JQG77741NU4VJA7000007TGUUV03UKJ24MJ6SG09CS11MN4C5DE8P> <HLN44PB9SG2MFT8S0BB5I4J2LGL5DR97S132NU8L892HUKAK65L5DR9RS132KIRE5E828> <A8MKLIVA5LPQG22LGL5DRAPS122JH1E5E83DE003VFUL000OBV08OL0O7228AM2OGNE5I> <HBI0RMK004BH6COASH4PEP0FS0J1BO800CA95E8KM2OOMS892VVKAR119LJKDLF6000H9> <SHN08AOBR800DMH5T5T4RAN2NO000FJU44GJSG1UEJJJST77U47OHUK4SUV78DCVV7V62> <HH8NV880204E0MVB07A0OJF12K88G2415QMG8H2S8B369J662KIIL23VS49EKJFC6R2G9> <1MUH1GP29J1I0V92N9IUA1NAC2DABE4C74K1B65UFVDAU8ICO66RO26DNSG922CDGR6DG> <608DU45GRT813COR36PNJT813COR2LDM0U0HJCBPVK2M7DSP6C9F664PMV85CU9OM52LR> <6DM837V266BQT84MSGDQRP1JL3H3BUKBEAVT9T5BM91MUIAK8FVGH5QI8EBELEV809J26> <1HG8CT9FBD9VIFRNUG01VR000H6VI2FBFQH0HECBEIG04M3PG005VV22QS2THLM5DR9BE> <00007UDD4N1E4S3O2J5VFQ1AABET4LU0LB3AN2MJI6S1GFOEQNMKLKSIN0LO40VGTMFDH> <BEQAKMP5OLCPBJ3G8G2S95DJBAIR2MHTMN280000002KL00480002VDME5LJCBI4JEV41> <P2KIK00V0AHTJUM8IDRSG74AIAG06L4002MNFU9CSRMOG2TQG0E8IDRGV3T8LT9NE1R7E> <UM7003EN7RJV5VP7UF50B7VI2NJJH801Q0002HTJTPEQRMRS2BUC64NSO96G3VGAD8B6L> <4F03VT1VO80B1FK2KAHR1FV5SIVQBQHR4COB1FL0NTXIUG35V0VNUGAHSVR5UNIHAD2V6> <FOP2KIK043UV49E3682FRCH5OC4FRGOAQN1GRNP0AC5AOSHAAI01G0000CHAAI012KG00> <AOH63LGF83I0SHAAI0136K00EG2RO000015V63QBUC90000000000004N1F62UBT0LQ13> <VSK2D9GIHR215BNIFDGI5TCNKG9ARCJAC4KEOG9ATSI0S033VF6EK1GIS85E2002A6BQ4> <K4NLFM002FO9TOAQJ7KTL70G0080IS0FS4Q1C1PS00EK1LL9DPFUQRBG2C00029EIQQIS> <LNVA59BI4JMR41VA5OH2T8PIK9L5TAJAIIHDKN71OFTP5E18MRS2N0KI3QL8S71VJDMI3> <JGS7TUA58I992VJP8N21FMI462ES8007OU00000000068IER0VBP04TN5LO56N15M7DJD> <QIR6MV41NEG0440G00LOSG1CLS86N3OO9DV7LO5E18MBDMU836SG02C0005ESBEIP9MT5> <MO7FP22RC3NS83BAA5MISMSD1TSOIRVO2MVIVJ2800C4R11LTF81FPI1VVG16NMC1VV03> <SF2K9507UIUG7T31HJE8H2HG742218Q2MJJGG86I05A2K0S0QD5T0FQ630QOKB6I0AQEE> <124G412H8I390VKC61LGOGAQJ907460PF8MQ61K0I1M1HS002VTGVHKQ1OGEANM6J871G> <J5H3147UIOH1HUGAQ0NTC2F0244I3TGV62CM4C4PC8NE1V14UOF9VEUIJUTLO6QG03K14> <4B0IC4MTONE5UNQHB8BQCN9VA5E8JKQSIVP4K4KA88M12VO000D45332D8D004VERNI6B> <P8NTLUT4JJ1EUDDFJ9TTG1S41F180BCLG000S7SHN0DO30EQS09QO00QE6JMKE97B9OAE> <2VVQ0L31FT7UMJGKTJVCNKAE9F91GN200000000GHC24VPBM2OJT8LAIC9AGICDVR44P1> <LSKAK4JFVA5BM842VBU0LDP1752I2CIEV85A298P8MVPO7G56BSFK2SUMU000009UVSFV> <I702RJ9UVS0VI15KBJ6SRI05PN0HQ0FB0II5TJVA9HISRV0NH9F8VPJUDVI4PJV2BO7TU> <U500000OF63TH0NPS4DDP641EB30ASKM3LRI409LJO3GRVVLIUU0R6IM42D81AVLHVLQ0> <47O5B702815B2VTVU4AFU1AGPAOJQ037IHAFPVKGDJV90T7UI1VH145VQHAGIGE9843V2> <28BPVGIRIA5O0GD2VDGA5UJ0MBSM4CJUE2JGMGHQLDGCN919R5KV52TI4Q38089UC4S0D> <PVHHB9M38GN0QPO15L3G0NOD91LV5HNBST4C74L2GBKKG009PTCIC47BSK05TRA800BMA> <BLISH1POG64QN2II12JVG7UP16LNHCMVRBFS005PRB49VEC4R8DPVHHEP3D2BA6Q1FBB2> <K2COS08257VG404V15I48V4OBDF41P2KIK02J2F497VVQHA03EVT0L5U83I59A80A642G> <000ARKKHP2BNFI0PVR4963682RL2D9GIP29UJI0NVL799VA15AFPVIFR1UJVIFSVK1VOJ> <TP2FOGM4V497VU83I595801E0FG4AS7UQFL5T32KFPGG4J2FSPGGO98QKGPVA1F4BOM10> <O8C8PGGOI311GI6230J3ARU0006268IS4SG50ILLLTB5V61G00SHN09S8BRVGAV4720VN> <RRVS1001ESOHAJK0TAGTSNAHGE3V6VG2RKMSP9S8PASGVG36MOLA8I07OU009VVK1P28V> <SOC3VN41JV68JR03VO7RUA59FI0GD7T8L59CKVT2PPQOT068IFVCG47PUA5A819FL2MB8> <6A1GVSEG3497VM83V0BUVI05I3VCB4NUN497T70HS8AO7I4FT683I59UC085JJLGB57V8> <IVFSLO1PA7UJ41T83V37OBTULH3CD9C9HNTQL4N28017MSG4H7S1N083F2T5MOP09UNO0> <6R0MQFQO3GFLV00N05R7Q1BKIR1VB89TD3I0RPUB0600C4R28TEUQAGGR7V0FKLII39S9> <Q680O2SK224DVUHVKG59TL8000000000GE0AG00002377HG00008FS7S00001210VG000> <048E0L00000H1OFO000024A0AG00008H8FO0000125G58000048M7S00000HAO2K00002> <9I3JG00009787S000015E39000004NM1V00000J28FO00002C94J000009H4Q80000166> <K8G00004R2AG00000JC9HS00002EH0VG00009Q47S000017BGQ800004U01A00000JO1H> <S00002F11V000009V4OU000018PG5800005367S00000KMPA000002K65T00000AH4NK0> <0001AHGQ800005A63U00000LB1HS00002LG0VG0000AMC7S00001BQHV000005FABQ000> <00LU0FO00002NQ0VG0000AVK2K00001BUGVG00005G23U00000M10D400002O60L00000> <B0S7S00001C40VG00005GG7S00000M21F800002P56I00000B54K400001CKIK000005I> <M0L00000MB02K00002PC3U00000B5O1A00001CO2P800005J40L00000MCGVG00002PL5> <800000B701A00001CS1V000005KI2K00000MIOFO00002QE3U00000BAGOU00001DC0FO> <00005LM3U00000MMOSS00003VVVVVVUF33RVSOU5O0000000000B1JE8H1NS1S29G006V> <GC0JP3JGRU1VI0G003FO8Q8NIGGDV13G32391NS5D11P246VGNKHF86GRU39IK0003FOE> <02K002SH1O1LKGD1NS8B621F86VHF800000RU60000003FOOG1V000DV3U9A0001NSJP6> <I8VG6VIGO5D1V600AGH5C003FPA2E2GQ8DV5U98G4J1NSNP6MH4O6VJ54L41V600D6K0G> <005ANVVVVVVVVVS107QBUM4CU67NVPHSBG0000000002MGGSH33FOAQEIGGCDV1F18G4J> <1NS6S1L9KG41GS0LL4JORU3L2MKIJNAOGA3F0L0DV218VQ96HNS857V9FRG010L040B62> <45T000003FOO02MGVGDV301503C1NSC04PHG66VHG12960ORU9DIMKIF3FP7ID4HV0DV5> <88IM001NSL1718D46VJ00G70VGRUD6K0G005AHVO66J90DV8H000001NT2641O8I6VVVV> <VVVVVVU002GTI5J218IP2RG2SAD7LOQ009I2SA003GHE6KH4NVCAS4CBV7VN4946FQHAG> <IVHVR5V3VKBVNV6L75V3VGBU7USNSFUE8336RURG0C4NA08HE8PHGP29J0BQVL2M744N4> <DOG62KNK4C30KBQ61COAE2Q1BAV22BG1C8M83FU2UCHG84LAV7PBU400SLH2FUCBPKH2S> <HHF0VNM5GLAFRLSQ00EG74AJR805FIG02VC5NRUNFD0Q8A6002DC000019FAHG80CI2CC> <048SABLVU00EMU20VJVSPV8FRNUOORUI7C3GO0623177VGO7P6L29177VAG2FV1C7KFS4> <AGQFT47NQHA0CH4VSP0FS1AEJVDKR47N0DS1BVAFP08CVH7RRVBL048N22O962KNM45B1> <BI4J2KNLVA5BACAV80NKE5A15B3SG6VQ001RER34MV497HGF6R3EK0VI5HJCCF3CG6TN0> <01F28AM2LOL85DAK0000000X001100O1U07O02MU011C0A0244DV3CVQ87GI00V7X0040> <ZAC5M3VVVVVVV> (END CREF.SV) (REMARK End of File) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 | / OS/8 BOO DECODING PROGRAM / LAST EDIT: 22-OCT-1991 12:00:00 CJL / MAY BE ASSEMBLED WITH '/F' SWITCH SET. / PROGRAM TO DECODE OS/8 FILES FROM "PRINTABLE" ASCII (".BOO") FORMAT TO / BINARY-IMAGE FORMAT. INTERMEDIATE "ASCII" CONVERSION SHOULD BE HARMLESS AS / LONG AS ALL PRINTING DATA CHARACTERS ARE NOT MODIFIED. / DISTRIBUTED BY CUCCA AS "K12DEB.PAL" AS PART OF THE CUCCA KERMIT-12 PACKAGE. / WRITTEN BY: / CHARLES LASNER (CJL) / CLA SYSTEMS / 72-55 METROPOLITAN AVENUE / MIDDLE VILLAGE, NEW YORK 11379-2107 / (718) 894-6499 / USAGE: / THIS PROGRAM OPERATES ON "PRINTABLE" ASCII FILES WHICH HAVE BEEN CREATED BY / ENCODING THE CONTENTS OF ARBITRARY (BINARY) FILES. THE ENCODING FORMAT ALLOWS / FOR CERTAIN "WHITE SPACE" MODIFICATIONS SUCH AS LINE WIDTH REFORMATTING AS / LONG AS ALL PRINTING CHARACTERS ARE UNMODIFIED. EXTRANEOUS <CR>/<LF> PAIRS / AND ALL OTHER CONTROL CHARACTERS (<FF>, <VT>, ETC.) ARE IGNORED. / WHEN CREATING THE DESCENDANT DECODED FILE, THE USER MAY SPECIFY EITHER THE / IMBEDDED FILENAME OR AN ALTERNATE FILENAME ON EITHER THE DEFAULT (DSK:) DEVICE / OR A SPECIFIED DEVICE: / .RUN DEV DEBOO INVOKE PROGRAM. / *INPUT INPUT IS DECODED INTO IMBEDDED NAME ON DSK: (DEFAULT). / *DEV:OUTPUT.EX<INPUT INPUT IS DECODED INTO OUTPUT.EX ON DEVICE DEV:. / *DEV:<INPUT INPUT IS DECODED INTO IMBEDDED NAME ON DEVICE DEV:. / *OUTPUT.EX<INPUT$ INPUT IS DECODED INTO OUTPUT.EX ON DSK: (DEFAULT). / THE <ESC> CHARACTER WAS USED TO TERMINATE THE LINE / (THIS IS SIGNIFIED BY $). THIS CAUSES PROGRAM EXIT. / . PROGRAM EXITS NORMALLY. / INPUT FILE ASSUMES .BO EXTENSION; THERE IS NO ASSUMED OUTPUT EXTENSION. / PROGRAM EXIT IS THE NORMAL OS/8 METHOD OF EITHER PRESSING <^C> ON THE CONSOLE / KEYBOARD DURING THE COMMAND, OR ENDING THE COMMAND INPUT LINE WITH AN <ESC> / CHARACTER. / .BOO FORMAT IMPLEMENTATION DESCRIPTION. / THIS PROGRAM SUPPORTS STANDARD .BOO FORMAT ENCODED FILES AND OPTIONALLY THE / USE OF LENGTH CORRECTION BYTES AT THE FILE'S END TO ENSURE PROPER LENGTH. IF / NO LENGTH CORRECTION FIELDS ARE FOUND, IT IS ASSUMED THEY AREN'T NEEDED; IT / IS THE RESPONIBILITY OF THE ENCODER TO INSERT THESE FIELDS IF NECESSARY. OS/8 / FILES PROPERLY ENCODED BY THE COMPANION ENBOO-ING PROGRAM (ENBOO AKA K12ENB) / WILL CONTAIN SUCH BYTES AS NECESSARY, AND WILL BE PROPERLY DECODED INTO THEIR / ORIGINAL FORM WITHOUT LOSS. ALL OTHER FILES WILL BE <NUL>-PADDED AS NECESSARY / TO ROUND-UP THE FILE SIZE TO A NUMBER OF COMPLETE OS/8 RECORDS; THEIR / ORIGINAL LENGTH WILL BE LOST. / **** WARNING **** USE OF ENBOO-ING PROGRAMS NOT COMPATIBLE WITH THE OPTIONAL / LENGTH CORRECTION SCHEME CAN PRODUCE FILES DRASTICALLY DIFFERENT FROM THE / ORIGINAL; AN ENTIRE OS/8 RECORD CONTAINING <NUL> CHARACTERS COULD BE APPENDED / TO THE END OF THE FILES. BEYOND THE WASTE OF DISK SPACE, THESE DEFECTIVE / FILES COULD ACTUALLY BE DANGEROUS TO USE UNDER OS/8. / ORDINARILY THESE FILES SHOULDN'T EXIST, BUT COULD BE CREATED BY METHODS SUCH / AS DECODING ON OTHER SYSTEMS FOLLOWED BY USE OF ENCODERS INCOMPATIBLE WITH THE / LENGTH CORRECTION SCHEME. THIS TENDS TO MAKE THE FILE SIZE WRONG BY ONE OR / TWO BYTES, WHICH WHEN DECODED HERE WILL CAUSE THE CREATION OF AN ENTIRE / ERRONEOUS RECORD. IT IS RECOMMENDED THAT FILES STORED ON OTHER SYSTEMS FOR / EVENTUALLY DELIVERY TO OS/8 SYSTEMS BE MAINTAINED IN .BOO FORMAT TO PREVENT / THIS FORM OF FILE CORRUPTION. / ERROR MESSAGES. / ANY MESSAGE PRINTED IS A FATAL ERROR MESSAGE. ALL MESSAGES ARE THE STANDARD / OS/8 "USER" ERROR MESSAGES OF THE FORM: USER ERROR X AT AAAAA WHERE X IS THE / ERROR NUMBER AND AAAAA IS THE PROGRAM ADDRESS WHERE THE ERROR WAS DETECTED. / THE FOLLOWING USER ERRORS ARE DEFINED: / ERROR NUMBER PROBABLE CAUSE / 0 TOO MANY OUTPUT FILES. / 1 NO INPUT FILE OR TOO MANY INPUT FILES. / 2 IMBEDDED OUTPUT FILENAME FORMAT ERROR. / 3 I/O ERROR WHILE LOCATING IMBEDDED OUTPUT FILENAME. / 4 ERROR WHILE FETCHING FILE HANDLER. / 5 ERROR WHILE ATTEMPTING TO ENTER OUTPUT FILE. / 6 OUTPUT FILE LARGER THAN AVAILABLE FILE SPACE. / 7 ERROR WHILE CLOSING THE OUTPUT FILE. / 8 I/O ERROR WHILE DECODING FILE DATA OR BAD DATA. / 9 OUTPUT ERROR WHILE DECODING FILE DATA. / ASSEMBLY INSTRUCTIONS. / IT IS ASSUMED THE SOURCE FILE K12DEB.PAL HAS BEEN MOVED AND RENAMED TO / DSK:DEBOO.PA. / .PAL DEBOO<DEBOO/E/F ASSEMBLE SOURCE PROGRAM / .LOAD DEBOO LOAD THE BINARY FILE / .SAVE DEV DEBOO=0 SAVE THE CORE-IMAGE FILE / DEFINITIONS. CLOSE= 4 /CLOSE OUTPUT FILE DECODE= 5 /CALL COMMAND DECODER ENTER= 3 /ENTER TENTATIVE FILE FETCH= 1 /FETCH HANDLER IHNDBUF=7200 /INPUT HANDLER BUFFER INBUFFE=6200 /INPUT BUFFER INFILE= 7617 /INPUT FILE INFORMATION HERE INQUIRE=12 /INQUIRE ABOUT HANDLER NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 OHNDBUF=6600 /OUTPUT HANDLER BUFFER OUTBUFF=5600 /OUTPUT BUFFER OUTFILE=7600 /OUTPUT FILE INFORMATION HERE PRGFLD= 00 /PROGRAM FIELD RESET= 13 /RESET SYSTEM TABLES SBOOT= 7600 /MONITOR EXIT TBLFLD= 10 /COMMAND DECODER TABLE FIELD TERMWRD=7642 /TERMINATOR WORD USERROR=7 /USER SIGNALLED ERROR USR= 7700 /USR ENTRY POINT USRFLD= 10 /USR FIELD WRITE= 4000 /I/O WRITE BIT *0 /START AT THE BEGINNING *10 /DEFINE AUTO-INDEX AREA XR1, .-. /AUTO-INDEX NUMBER 1 XR2, .-. /AUTO-INDEX NUMBER 2 *20 /GET PAST AUTO-INDEX AREA BUFPTR, .-. /INPUT BUFFER POINTER BYTES, ZBLOCK 3 /DATA BYTES CHRCNT, .-. /CHARACTER COUNTER CMPCNT, .-. /COMPRESSION COUNTER DANGCNT,.-. /DANGER COUNT DATCNT, .-. /DATA COUNTER IDNUMBE,.-. /INPUT DEVICE NUMBER INPUT, .-. /INPUT HANDLER POINTER INRECOR,.-. /INPUT RECORD FNAME, ZBLOCK 4 /OUTPUT FILENAME GETBERR,.-. /ERROR ROUTINE POINTER FOR GETBYTE ROUTINE LATEST, .-. /LATEST OUTPUT BYTE ODNUMBE,.-. /OUTPUT DEVICE NUMBER ONAME, ZBLOCK 10 /OUTPUT NAME FIELD OUTPUT, .-. /OUTPUT HANDLER POINTER OUTRECO,.-. /OUTPUT RECORD PUTEMP, .-. /INPUT TEMPORARY PUTPTR, .-. /OUTPUT POINTER TEMPTR, .-. /TERMPORARY OUTPUT POINTER THIRD, .-. /THIRD BYTE TEMPORARY PAGE /START AT THE USUAL PLACE BEGIN, NOP /HERE IN CASE WE'RE CHAINED TO CLA /CLEAN UP START, CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE DECODE /WANT COMMAND DECODER "B^100+"O-300 /.BO IS DEFAULT EXTENSION CDF TBLFLD /GOTO TABLE FIELD TAD I (TERMWRD) /GET TERMINATOR WORD SPA CLA /SKIP IF <CR> TERMINATED THE LINE DCA EXITZAP /ELSE CAUSE EXIT LATER TAD I (OUTFILE) /GET FIRST OUTPUT FILE DEVICE WORD SNA /SKIP IF FIRST OUTPUT FILE PRESENT JMP TSTMORE /JUMP IF NOT THERE AND [17] /JUST DEVICE BITS ODNULL, DCA ODNUMBER /SAVE OUTPUT DEVICE NUMBER TAD I (OUTFILE+5) /GET SECOND OUTPUT FILE DEVICE WORD SNA /SKIP IF THERE TAD I (OUTFILE+12) /ELSE GET THIRD OUTPUT FILE DEVICE WORD SZA CLA /SKIP IF BOTH NOT PRESENT JMP OUTERR /ELSE COMPLAIN TAD I (INFILE) /GET FIRST INPUT FILE DEVICE WORD SNA /SKIP IF PRESENT JMP INERR /JUMP IF NOT AND [17] /JUST DEVICE BITS DCA IDNUMBER /SAVE INPUT DEVICE NUMBER TAD I (INFILE+2) /GET SECOND INPUT FILE DEVICE WORD SZA CLA /SKIP IF ONLY ONE INPUT FILE JMP INERR /ELSE COMPLAIN TAD I (INFILE+1) /GET FIRST INPUT FILE STARTING RECORD DCA INRECORD /SET IT UP CDF PRGFLD /BACK TO OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE RESET /RESET SYSTEM TABLES TAD (IHNDBUFFER+1) /GET INPUT BUFFER POINTER+TWO-PAGE BIT DCA IHPTR /STORE IN-LINE TAD IDNUMBER /GET INPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE FETCH /FETCH HANDLER IHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT JMP FERROR /FETCH ERROR TAD IHPTR /GET RETURNED ADDRESS DCA INPUT /STORE AS INPUT HANDLER ADDRESS JMS I (GEOFILE) /GET OUTPUT FILE INFORMATION TAD (OHNDBUFFER+1) /GET BUFFER POINTER+TWO-PAGE BIT DCA OHPTR /STORE IN-LINE TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE FETCH /FETCH HANDLER OHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT JMP FERROR /FETCH ERROR TAD OHPTR /GET RETURNED ADDRESS DCA OUTPUT /STORE AS OUTPUT HANDLER ADDRESS TAD (FNAME) /POINT TO DCA ENTAR1 /STORED FILENAME DCA ENTAR2 /CLEAR SECOND ARGUMENT TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE ENTER /ENTER TENTATIVE FILENAME ENTAR1, .-. /WILL POINT TO FILENAME ENTAR2, .-. /WILL BE ZERO JMP ENTERR /ENTER ERROR TAD ENTAR1 /GET RETURNED FIRST RECORD DCA OUTRECORD /STORE IT TAD ENTAR2 /GET RETURNED EMPTY LENGTH IAC /ADD 2-1 FOR OS/278 CRAZINESS DCA DANGCNT /STORE AS DANGER COUNT JMS I (DECODIT) /GO DO THE ACTUAL DECODING JMP PROCERR /ERROR WHILE DECODING TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE CLOSE /CLOSE OUTPUT FILE FNAME /POINTER TO FILENAME OUTCNT, .-. /WILL BE ACTUAL COUNT JMP CLSERR /CLOSE ERROR EXITZAP,JMP START /**** <ESC> TERMINATION **** 0000 JMP I (SBOOT) /EXIT TO MONITOR / OUTPUT FILE ERROR WHILE PROCESSING. OERROR, TAD [3] /SET INCREMENT SKP /DON'T USE NEXT / ERROR WHILE PROCESSING INPUT FILE. PROCERR,NL0002 /SET INCREMENT SKP /DON'T USE NEXT / ERROR WHILE CLOSING THE OUTPUT FILE. CLSERR, NL0001 /SET INCREMENT SKP /DON'T CLEAR IT / OUTPUT FILE TOO LARGE ERROR. SIZERR, CLA /CLEAN UP TAD [3] /SET INCREMENT SKP /DON'T USE NEXT / ENTER ERROR. ENTERR, NL0002 /SET INCREMENT SKP /DON'T USE NEXT / HANDLER FETCH ERROR. FERROR, NL0001 /SET INCREMENT / I/O ERROR WHILE PROCESSING IMBEDDED FILENAME. NIOERR, IAC /SET INCREMENT / FORMAT ERROR WHILE PROCESSING IMBEDDED FILENAME. CHARERR,IAC /SET INCREMENT / INPUT FILESPEC ERROR. INERR, IAC /SET INCREMENT / OUTPUT FILESPEC ERROR. OUTERR, DCA ERRNUMBER /STORE ERROR NUMBER CDF PRGFLD /ENSURE OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE USERROR /USER ERROR ERRNUMB,.-. /WILL BE PASSED ERROR NUMBER / COMES HERE TO TEST FOR NULL LINE. TSTMORE,TAD I (OUTFILE+5) /GET SECOND OUTPUT FILE DEVICE WORD SNA /SKIP IF PRESENT TAD I (OUTFILE+12) /ELSE GET THIRD OUTPUT FILE DEVICE WORD SZA CLA /SKIP IF NO OUTPUT FILES JMP OUTERR /ELSE COMPLAIN OF SECOND/THIRD (WITHOUT FIRST) OUTPUT TAD I (INFILE) /GET FIRST OUTPUT FILE DEVICE WORD SZA CLA /SKIP IF NO INPUT FILES JMP ODNULL /JUMP IF INPUT WITHOUT OUTPUT CDF PRGFLD /BACK TO OUR FIELD JMP EXITZAP /MIGHT BE LAST TIME, SO GO THERE FIRST PAGE DECODIT,.-. /DECODING ROUTINE TAD (DECERR) /SETUP THE DCA GETBERROR /GETBYTE ERROR ROUTINE DCA DATCNT /CLEAR DATA COUNT NL7777 /SETUP FOR INITIALIZING JMS I (PUTBYTE) /INITIALIZE OUTPUT FILE LOOP, JMS GETCHR /GET A CHARACTER JMP ENDIT /WEREN'T ANY MORE TAD (-176) /COMPARE TO TILDE SZA CLA /SKIP IF IT MATCHES JMP DATPROCESS /JUMP IF NOT JMS GETCHR /GET A CHARACTER DECERR, JMP I DECODIT /WASN'T ANY TAD (-"0!200) /REMOVE PRINTING OFFSET SNA /SKIP IF SIGNIFICENT COMPRESSION JMP DATCORRECT /JUMP IF NOT CIA /INVERT FOR COUNTING DCA CMPCNT /SAVE COMPRESSION COUNT JMS DATOUT /OUTPUT DATA FIELD (IF ANY) AND CLEAR DATA COUNT COMPLP, JMS I (PUTBYTE) /OUTPUT A <NUL> BYTE ISZ CMPCNT /DONE YET? JMP COMPLP /NO, KEEP GOING JMP LOOP /YES, GO BACK FOR MORE FILE ITEMS / ZERO-LENGTH COMPRESSION (CORRECTION) FIELD FOUND. DATCORR,NL7777 /BACKUP TAD DATCNT /NOW HAVE CORRECTED DATA COUNT SPA /SKIP IF COUNT WASN'T ZERO JMP LOOP /IGNORE BECAUSE THERE IS NO DATA SNA /SKIP IF ENOUGH TO CORRECT JMP I DECODIT /TAKE ERROR RETURN IF NOT DCA DATCNT /STORE CORRECTED COUNT JMP LOOP /GO BACK FOR MORE FILE ITEMS / UN-COMPRESSED DATA FOUND. DATPROC,JMS DATOUT /OUTPUT PREVIOUS DATA FIELD (IF ANY), CLEAR DATA COUNT TAD PUTEMP /GET LATEST BACK TAD (-"0!200) /REMOVE DIGIT OFFSET CLL RTL /MOVE UP DCA BYTES /STORE IT JMS GETCHR /GET NEXT CHARACTER JMP I DECODIT /WASN'T ANY AND (17) /JUST LOW-ORDER BITS CLL RTL;RTL /MOVE UP DCA BYTES+1 /STORE IT TAD PUTEMP /GET IT AGAIN RTR;RTR /MOVE DOWN IAC /REMOVE DIGIT BIAS AND (3) /JUST GOOD BITS TAD BYTES /GET OLD BITS DCA BYTES /STORE COMPOSITE JMS GETCHR /GET NEXT CHARACTER JMP I DECODIT /WASN'T ANY TAD (-"0!200) /REMOVE DIGIT OFFSET RTR /MOVE DOWN AND (17) /ISOLATE GOOD BITS TAD BYTES+1 /GET OLD BITS DCA BYTES+1 /STORE COMPOSITE TAD PUTEMP /GET IT AGAIN AND (3) /ISOLATE GOOD BITS CLL RTL;RTL;RTL /MOVE UP DCA BYTES+2 /STORE IT JMS GETCHR /GET NEXT CHARACTER JMP I DECODIT /WASN'T ANY TAD (-"0!200) /REMOVE DIGIT OFFSET TAD BYTES+2 /GET OLD BITS DCA BYTES+2 /STORE COMPOSITE TAD (3) /SETUP THE DCA DATCNT /DATA COUNT JMP LOOP /GO GET NEXT FILE ITEM / COMES HERE AT END-OF-FILE. ENDIT, JMS DATOUT /OUTPUT ANY LEFTOVER DATA SKP /DON'T OUTPUT YET CLOSLUP,JMS I (PUTBYTE) /OUTPUT A <NUL> BYTE TAD PUTPTR /GET THE OUTPUT BUFFER POINTER TAD (-OUTBUFFER) /COMPARE TO RESET VALUE SZA CLA /SKIP IF IT MATCHES JMP CLOSLUP /ELSE KEEP GOING ISZ DECODIT /BUMP TO GOOD RETURN JMP I DECODIT /RETURN TO CALLER DATOUT, .-. /DATA OUTPUT ROUTINE TAD DATCNT /GET CURRENT DATA COUNT CMA /SETUP FOR COUNTING DCA DATCNT /STORE IT TAD (BYTES-1) /POINT TO DCA XR1 /DATA AREA JMP DATEST /CHECK BEFORE OUTPUTTING DATLUP, TAD I XR1 /GET A BYTE JMS I (PUTBYTE) /OUTPUT IT DATEST, ISZ DATCNT /DONE YET? JMP DATLUP /NO, KEEP GOING JMP I DATOUT /YES, RETURN TO CALLER GETCHR, .-. /GET A CHARACTER ROUTINE GETCAGN,CLA /GET A CHARACTER JMS I [GETBYTE] /GET A CHARACTER FROM FILE JMP I GETCHR /WASN'T ANY, TAKE IMMEDIATE RETURN TAD [-" !200] /COMPARE TO <SPACE> SPA SNA CLA /SKIP IF NOT CONTROL CHARACTER OR <SPACE> JMP GETCAGN /GO GET ANOTHER ONE TAD PUTEMP /GET GOOD CHARACTER ISZ GETCHR /BUMP RETURN ADDRESS JMP I GETCHR /RETURN TO CALLER PAGE PUTBYTE,.-. /OUTPUT A BYTE ROUTINE SPA /ARE WE INITIALIZING? JMP PUTINITIALIZE /YES AND (377) /JUST IN CASE DCA LATEST /SAVE LATEST CHARACTER TAD LATEST /GET LATEST CHARACTER JMP I PUTNEXT /GO WHERE YOU SHOULD GO PUTNEXT,.-. /EXIT ROUTINE JMP I PUTBYTE /RETURN TO MAIN CALLER PUTINIT,CLA /CLEAN UP TAD OUTRECORD /GET STARTING RECORD OF TENTATIVE FILE DCA PUTRECORD /STORE IN-LINE DCA I (OUTCNT) /CLEAR ACTUAL FILE LENGTH PUTNEWR,TAD POUTBUFFER/(OUTBUFFER) /SETUP THE DCA PUTPTR /BUFFER POINTER PUTLOOP,JMS PUTNEXT /GET A CHARACTER DCA I PUTPTR /STORE IT TAD PUTPTR /GET POINTER VALUE DCA TEMPTR /SAVE FOR LATER ISZ PUTPTR /BUMP TO NEXT JMS PUTNEXT /GET A CHARACTER DCA I PUTPTR /STORE IT JMS PUTNEXT /GET A CHARACTER RTL;RTL /MOVE UP AND [7400] /ISOLATE HIGH NYBBLE TAD I TEMPTR /ADD ON FIRST BYTE DCA I TEMPTR /STORE COMPOSITE TAD LATEST /GET LATEST CHARACTER RTR;RTR;RAR /MOVE UP AND AND [7400] /ISOLATE LOW NYBBLE TAD I PUTPTR /ADD ON SECOND BYTE DCA I PUTPTR /STORE COMPOSITE ISZ PUTPTR /BUMP TO NEXT TAD PUTPTR /GET LATEST POINTER VALUE TAD (-2^200-OUTBUFFER) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP PUTLOOP /KEEP GOING ISZ DANGCNT /TOO MANY RECORDS? SKP /SKIP IF NOT JMP I (SIZERR) /JUMP IF SO JMS I OUTPUT /CALL I/O HANDLER 2^100+WRITE /WRITE SOME PAGES FROM OUTPUT BUFFER POUTBUF,OUTBUFFER /BUFFER ADDRESS PUTRECO,.-. /WILL BE LATEST RECORD NUMBER JMP I (OERROR) /OUTPUT ERROR! ISZ I (OUTCNT) /BUMP ACTUAL LENGTH ISZ PUTRECORD /BUMP TO NEXT RECORD JMP PUTNEWRECORD /KEEP GOING / OS/8 FILE UNPACK ROUTINE. GETBYTE,.-. /GET A BYTE ROUTINE SNA CLA /INITIALIZING? JMP I PUTC /NO, GO GET NEXT BYTE TAD INRECORD /GET STARTING RECORD OF INPUT FILE DCA GETRECORD /STORE IN-LINE GETNEWR,JMS I INPUT /CALL I/O HANDLER 2^100 /READ TWO PAGES INTO BUFFER PINBUFF,INBUFFER /BUFFER ADDRESS GETRECO,.-. /WILL BE LATEST RECORD NUMBER JMP I GETBERROR /INPUT ERROR! TAD PINBUFFER/(INBUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER GETLOOP,DCA THIRD /CLEAR THIRD BYTE NOW JMS PUTONE /OBTAIN AND SEND BACK FIRST BYTE JMS PUTONE /OBTAIN AND SEND BACK SECOND BYTE TAD THIRD /GET THIRD BYTE JMS PUTC /SEND IT BACK TAD BUFPTR /GET THE POINTER TAD (-2^200-INBUFFER) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP GETLOOP /KEEP GOING ISZ GETRECORD /BUMP TO NEXT RECORD JMP GETNEWRECORD /GO DO ANOTHER ONE PUTONE, .-. /SEND BACK A BYTE ROUTINE TAD I BUFPTR /GET LATEST WORD AND [7400] /JUST THIRD-BYTE NYBBLE CLL RAL /MOVE UP TAD THIRD /GET OLD NYBBLE (IF ANY) RTL;RTL /MOVE UP NYBBLE BITS DCA THIRD /SAVE FOR NEXT TIME TAD I BUFPTR /GET LATEST WORD AGAIN JMS PUTC /SEND BACK CURRENT BYTE ISZ BUFPTR /BUMP TO NEXT WORD JMP I PUTONE /RETURN PUTC, .-. /SEND BACK LATEST BYTE ROUTINE AND (177) /KEEP ONLY GOOD BITS DCA PUTEMP /SAVE IT TAD PUTEMP /GET IT BACK TAD (-"Z!300) /COMPARE TO <^Z> SNA CLA /SKIP IF NOT ASCII <EOF> JMP I GETBYTE /RETURN IF ASCII MODE <EOF> TAD PUTEMP /RESTORE THE CHARACTER ISZ GETBYTE /BUMP PAST <EOF> RETURN JMP I GETBYTE /RETURN TO MAIN CALLER PAGE GEOFILE,.-. /GET OUTPUT FILE ROUTINE TAD ODNUMBER /GET OUTPUT DEVICE NUMBER SZA CLA /SKIP IF NOT ESTABLISHED YET JMP GOTOD /JUMP IF DETERMINED ALREADY TAD ("D^100+"S-300) /GET BEGINNING OF "DSK" DCA DEVNAME /STORE IN-LINE TAD ("K^100) /GET REST OF "DSK" DCA DEVNAME+1 /STORE IN-LINE DCA RETVAL /CLEAR HANDLER ENTRY WORD CDF PRGFLD /INDICATE OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE INQUIRE /INQUIRE ABOUT HANDLER DEVNAME,ZBLOCK 2 /WILL BE DEVICE DSK RETVAL, .-. /BECOMES HANDLER ENTRY POINT WORD HLT /DSK: NOT IN SYSTEM IS IMPOSSIBLE! TAD DEVNAME+1 /GET DEVICE NUMBER FOR DSK: AND [17] /JUST DEVICE BITS DCA ODNUMBER /STORE OUTPUT DEVICE GOTOD, JMS SCANAME /SCAN OFF FILE NAME CDF TBLFLD /BACK TO TABLE FIELD TAD I (OUTFILE+1) /GET OUTPUT FILE FIRST NAME WORD SNA /SKIP IF PRESENT JMP GFLNAME /JUMP IF NOT DCA FNAME /MOVE TO OUR AREA TAD I (OUTFILE+2) /GET SECOND NAME WORD DCA FNAME+1 /MOVE IT TAD I (OUTFILE+3) /GET THIRD NAME WORD DCA FNAME+2 /MOVE IT TAD I (OUTFILE+4) /GET EXTENSION WORD DCA FNAME+3 /MOVE IT CDF PRGFLD /BACK TO OUR FIELD JMP I GEOFILE /RETURN / WE MUST TAKE THE FILENAME FROM THE IMBEDDED FILENAME SUPPLIED. GFLNAME,CDF PRGFLD /BACK TO OUR FIELD TAD ONAME /GET THE FIRST CHARACTER SNA CLA /SKIP IF SOMETHING THERE JMP I (CHARERROR) /COMPLAIN IF NONE THERE TAD (ONAME-1) /SETUP POINTER DCA XR1 /TO NAME CHARACTERS TAD (FNAME-1) /SETUP POINTER DCA XR2 /TO PACKED NAME AREA TAD (-4) /SETUP THE DCA CHRCNT /MOVE COUNT CHRLOOP,TAD I XR1 /GET FIRST CHARACTER CLL RTL;RTL;RTL /MOVE UP TAD I XR1 /ADD ON SECOND CHARACTER DCA I XR2 /STORE THE PAIR ISZ CHRCNT /DONE YET? JMP CHRLOOP /NO, KEEP GOING JMP I GEOFILE /YES, RETURN SCANAME,.-. /SCAN OFF FILENAME ROUTINE TAD (NIOERROR) /SETUP THE DCA GETBERROR /I/O ERROR HANDLER / ZERO OUT THE FILENAME AREA. TAD (-10) /SETUP THE DCA CHRCNT /CLEAR COUNTER TAD (ONAME-1) /SETUP THE DCA XR1 /POINTER JMS CLRNAME /CLEAR THE NAME BUFFER / SETUP FOR SCANNING THE NAME PORTION. TAD (-6) /SETUP THE DCA CHRCNT /SCAN COUNT TAD (ONAME-1) /SETUP THE DCA XR1 /POINTER NL7777 /MAKE IT INITIALIZE FNCAGN, JMS I (GETAN) /GET A CHARACTER JMP GOTSEPARATOR /GOT "."; GOTO NEXT FIELD DCA I XR1 /STASH THE CHARACTER ISZ CHRCNT /DONE ALL YET? JMP FNCAGN /NO, KEEP GOING / THROW AWAY EXTRA NAME CHARACTERS. TOSSNAM,JMS I (GETAN) /GET A CHARACTER JMP GOTSEPARATOR /GOT "."; GOTO NEXT FIELD CLA /THROW AWAY THE CHARACTER JMP TOSSNAME /KEEP GOING / COMES HERE AFTER "." FOUND. GOTSEPA,JMS CLRNAME /CLEAR OUT THE REMAINING NAME FIELD NL7776 /SETUP THE DCA CHRCNT /SCAN COUNT EXCAGN, JMS I (GETAN) /GET A CHARACTER JMP I (CHARERROR) /GOT "."; COMPLAIN DCA I XR1 /STASH THE CHARACTER ISZ CHRCNT /DONE ENOUGH YET? JMP EXCAGN /NO, KEEP GOING / TOSS ANY EXTRA EXTENSION CHARACTERS. TOSSEXT,JMS I (GETAN) /GET A CHARACTER JMP I (CHARERROR) /GOT "."; COMPLAIN CLA /THROW AWAY THE CHARACTER JMP TOSSEXTENSION /KEEP GOING / COMES HERE WHEN TRAILING <CR> IS FOUND. GOTCR, JMS CLRNAME /CLEAR ANY REMAINING EXTENSION CHARACTERS JMP I SCANAME /RETURN CLRNAME,.-. /NAME FIELD CLEARING ROUTINE TAD CHRCNT /GET CHARACTER COUNTER SNA CLA /SKIP IF ANY TO CLEAR JMP I CLRNAME /ELSE JUST RETURN DCA I XR1 /CLEAR A NAME WORD ISZ CHRCNT /COUNT IT JMP .-2 /KEEP GOING JMP I CLRNAME /RETURN PAGE GETCHAR,.-. /GET A CHARACTER ROUTINE JMS I [GETBYTE] /GET A CHARACTER JMP I (CHARERROR) /COMPLAIN IF <EOF> REACHED TAD (-"M!300) /COMPARE TO <CR> SNA /SKIP IF OTHER JMP I (GOTCR) /JUMP IF IT MATCHES TAD (-140+"M-300) /COMPARE TO LOWER-CASE LIMIT SPA /SKIP IF LOWER-CASE TAD (40) /RESTORE ORIGINAL IF UPPER-CASE AND (77) /JUST SIX-BIT DCA PUTEMP /SAVE IN CASE WE NEED IT TAD PUTEMP /GET IT BACK JMP I GETCHAR /RETURN GETAN, .-. /GET ALPHANUMERIC ROUTINE GETNAGN,JMS GETCHAR /GET A CHARACTER TAD [-" !200] /COMPARE TO <SPACE> SNA CLA /SKIP IF OTHER JMP GETNAGN /JUMP IF IT MATCHES TAD PUTEMP /GET THE CHARACTER BACK TAD (-".!200) /COMPARE TO "." SNA /SKIP IF OTHER JMP I GETAN /TAKE FIRST RETURN IF IT MATCHES TAD (-":+".) /SUBTRACT UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD (":-"0) /ADD ON RANGE SZL CLA /SKIP IF NOT NUMERIC JMP GETANOK /JUMP IF NUMERIC TAD PUTEMP /GET THE CHARACTER BACK TAD (-"[!300) /SUBTRACT UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD ("[-"A) /ADD ON RANGE SNL CLA /SKIP IF ALPHABETIC JMP I (CHARERROR) /ELSE COMPLAIN GETANOK,TAD PUTEMP /GET GOOD ALPHANUMERIC CHARACTER ISZ GETAN /BUMP TO SKIP RETURN JMP I GETAN /RETURN PAGE $ /THAT'S ALL FOLK! |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 | / OS/8 DECODING PROGRAM / LAST EDIT: 08-JUL-1992 22:00:00 CJL / PROGRAM TO DECODE OS/8 FILES FROM "PRINTABLE" ASCII FORMAT TO BINARY-IMAGE / FORMAT. INTERMEDIATE "ASCII" CONVERSION SHOULD BE HARMLESS AS LONG AS ALL / PRINTING DATA CHARACTERS ARE NOT MODIFIED. / DISTRIBUTED BY CUCCA AS "K12DEC.PAL" AS PART OF THE CUCCA KERMIT-12 PACKAGE. / WRITTEN BY: / CHARLES LASNER (CJL) / CLA SYSTEMS / 72-55 METROPOLITAN AVENUE / MIDDLE VILLAGE, NEW YORK 11379-2107 / (718) 894-6499 / USAGE: / THIS PROGRAM OPERATES ON "PRINTABLE" ASCII FILES WHICH HAVE BEEN CREATED BY / ENCODING THE CONTENTS OF ARBITRARY (BINARY) FILES. THE ENCODING FORMAT ALLOWS / FOR SOME INNOCUOUS CONTENT MODIFICATION SUCH AS EXTRANEOUS WHITE SPACE AND / EXTRA <CR>/<LF> PAIRS, BUT RIGOROUSLY VALIDATES CERTAIN ASPECTS OF THE FORMAT, / SUCH AS A TRAILING CHECKSUM. / CERTAIN IMBEDDED COMMANDS ARE USED SUCH AS (REMARK .........) WHICH ALLOWS FOR / COMMENTARY LINES WITHIN THE FILE FOR IDENTIFICATION PURPOSES. THE (FILE ) AND / (END ) COMMANDS CONTAIN THE SUGGESTED FILENAME FOR THE DESCENDANT DECODED / FILE. / WHEN CREATING THE DESCENDANT DECODED FILE, THE USER MAY SPECIFY EITHER THE / IMBEDDED FILENAME OR AN ALTERNATE FILENAME ON EITHER THE DEFAULT (DSK:) DEVICE / OR A SPECIFIED DEVICE: / .RUN DEV DECODE INVOKE PROGRAM. / *INPUT INPUT IS DECODED INTO IMBEDDED NAME ON DSK: (DEFAULT). / *DEV:OUTPUT.EX<INPUT INPUT IS DECODED INTO OUTPUT.EX ON DEVICE DEV:. / *DEV:<INPUT INPUT IS DECODED INTO IMBEDDED NAME ON DEVICE DEV:. / *DEV:<INPUT=NNNN/I **** SPECIAL IMAGE TRANSFER MODE **** INPUT IS DECODED / INTO RECORD 0000-[NNNN-1] ON DEVICE DEV:. THE =NNNN / VALUE SHOULD BE CAREFULLY CHOSEN LARGE ENOUGH TO WRITE / ALL DATA RECORDS, BUT NEED NOT BE STATED EXACTLY. / (THE ENCODE PROGRAM REQUIRES PRECISE STATEMENT OF THE / LENGTH IN IMAGE TRANSFER ENCODING MODE. **** NOTE / **** THIS METHOD VIOLATES ALL OS/8 DEVICE STRUCTURE / AND IS MEANT FOR TRANSFER OF COMPLETE DEVICE IMAGES / ONLY; USE WITH CARE! / *DEV:<INPUT=NNNN/I/1 **** SPECIAL IMAGE TRANSFER MODE **** SAME AS REGULAR / IMAGE MODE EXCEPT ONLY THE FIRST HALF OF THE DATA IS / USED. NOTE THAT THE =NNNN VALUE MUST BE GIVEN EXACTLY / BECAUSE IT IS USED TO CALCULATE THE APPROX. 1/2 VALUE / ACTUALLY USED IN THIS HALF OF THE OVERALL TRANSFER. / THIS MODE SHOULD BE USED WITH FILES CREATED FOR THE / EXPRESS PURPOSE OF TRANSMISSION BY HALVES ONLY; USE / WITH CARE! / *DEV:<INPUT=NNNN/I/2 **** SPECIAL IMAGE TRANSFER MODE **** SAME AS REGULAR / IMAGE MODE EXCEPT ONLY THE SECOND HALF OF THE DATA IS / USED. NOTE THAT THE =NNNN VALUE MUST BE GIVEN EXACTLY / BECAUSE IT IS USED TO CALCULATE THE STARTING RECORD OF / THE APPROX. 1/2 VALUE ACTUALLY USED IN THIS HALF OF / THE OVERALL TRANSFER. THIS MODE SHOULD BE USED WITH / FILES CREATED FOR THE EXPRESS PURPOSE OF TRANSMISSION / BY HALVES ONLY; USE WITH CARE! NOTE THAT THERE MUST / BE TWO FILES CREATED, ONE USING /I/1 AND THE OTHER / USING /I/2 TO COMPLETELY TRANSFER A DEVICE IMAGE / UNLESS /I IS USED ALONE! / *OUTPUT.EX<INPUT$ INPUT IS DECODED INTO OUTPUT.EX ON DSK: (DEFAULT). / THE <ESC> CHARACTER WAS USED TO TERMINATE THE LINE / (THIS IS SIGNIFIED BY $). THIS CAUSES PROGRAM EXIT. / . PROGRAM EXITS NORMALLY. / INPUT FILE ASSUMES .EN EXTENSION; THERE IS NO ASSUMED OUTPUT EXTENSION. / IMAGE TRANSFER MODE DOESN'T USE OUTPUT FILENAMES, AS THE TRANSFER DESTROYS THE / OS/8 FILE STRUCTURE (POSSIBLY PRESENT) ON THE DEVICE. / PROGRAM EXIT IS THE NORMAL OS/8 METHOD OF EITHER PRESSING <^C> ON THE CONSOLE / KEYBOARD DURING THE COMMAND, OR ENDING THE COMMAND INPUT LINE WITH AN <ESC> / CHARACTER. / THIS PROGRAM SUPPORTS A PROPER SUBSET OF THE ASCII ENCODING SCHEME DISCUSSED / BY CHARLES LASNER AND FRANK DA CRUZ. THE SCHEME USED IS FIVE-BIT ENCODING / WITH COMPRESSION, (AS OPPOSED TO SIX-BIT WITHOUT COMPRESSION AS USED IN PRIOR / VERSIONS). / RESTRICTIONS: / A) SUPPORTS ONLY ONE DECODABLE FILE PER ENCODED FILE. / B) IGNORES ALL (END ) COMMANDS. / C) <CR> <LF> < ALWAYS INDICATES ENCODED DATA LINES; NO CHECK IS MADE FOR / WHETHER THE > IS ON THE SAME LINE AS THE <. / D) PDP-8 GENERATED CHECKSUM DATA MUST BE THE FINAL DATA IN THE FILE IN / THE PROPER FORMAT: ZCCCCCCCCCCCC WHERE CCCCCCCCCCCC IS THE / TWELVE-CHARACTER PDP-8 CHECKSUM DATA. / IF THE ENCODED FILE IS PASSED THROUGH ANY INTERMEDIARY PROCESS THAT MODIFIES / THE CONTENTS IN A WAY THAT INTERFERES WITH ANY OF THE ABOVE, THIS DECODING / PROGRAM WILL FAIL. IT IS THE USER'S RESPONSIBILITY TO EDIT OUT UNWANTED / CHANGES TO THE ENCODED FILE. ALL OTHER ASPECTS OF THE PROTOCOL ARE OBEYED, / SUCH AS IMBEDDED <FF>, EXTRA <CR> <LF>, OR TRAILING SPACES HAVE NO EFFECT ON / THE RELIABILITY OF THE DECODING PROCESS, ETC. / ERROR MESSAGES. / ANY MESSAGE PRINTED IS A FATAL ERROR MESSAGE. ALL MESSAGES ARE THE STANDARD / OS/8 "USER" ERROR MESSAGES OF THE FORM: USER ERROR X AT AAAAA WHERE X IS THE / ERROR NUMBER AND AAAAA IS THE PROGRAM ADDRESS WHERE THE ERROR WAS DETECTED. / THE FOLLOWING USER ERRORS ARE DEFINED: / ERROR NUMBER PROBABLE CAUSE / 0 TOO MANY OUTPUT FILES. / 1 NO INPUT FILE OR TOO MANY INPUT FILES. / 2 IMBEDDED OUTPUT FILENAME FORMAT ERROR. / 3 I/O ERROR WHILE LOCATING IMBEDDED OUTPUT FILENAME. / 4 ERROR WHILE FETCHING FILE HANDLER. / 5 ERROR WHILE ATTEMPTING TO ENTER OUTPUT FILE. / 6 OUTPUT FILE LARGER THAN AVAILABLE FILE SPACE. / 7 ERROR WHILE CLOSING THE OUTPUT FILE. / 8 I/O ERROR WHILE DECODING FILE DATA OR BAD DATA. / ASSEMBLY INSTRUCTIONS. / IT IS ASSUMED THE SOURCE FILE K12DEC.PAL HAS BEEN MOVED AND RENAMED TO / DSK:DECODE.PA. / .PAL DECODE<DECODE ASSEMBLE SOURCE PROGRAM / .LOAD DECODE LOAD THE BINARY FILE / .SAVE DEV DECODE=0 SAVE THE CORE-IMAGE FILE / DEFINITIONS. CLOSE= 4 /CLOSE OUTPUT FILE DECODE= 5 /CALL COMMAND DECODER ENTER= 3 /ENTER TENTATIVE FILE EQUWRD= 7646 /EQUALS PARAMETER HERE IN TABLE FIELD FETCH= 1 /FETCH HANDLER IHNDBUF=7200 /INPUT HANDLER BUFFER INBUFFE=6200 /INPUT BUFFER INFILE= 7617 /INPUT FILE INFORMATION HERE INQUIRE=12 /INQUIRE ABOUT HANDLER NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 OHNDBUF=6600 /OUTPUT HANDLER BUFFER OUTBUFF=5600 /OUTPUT BUFFER OUTFILE=7600 /OUTPUT FILE INFORMATION HERE PRGFLD= 00 /PROGRAM FIELD RESET= 13 /RESET SYSTEM TABLES SBOOT= 7600 /MONITOR EXIT SWAL= 7643 /A-/L SWITCHES HERE IN TABLE FIELD SWY9= 7645 /Y-/9 SWITCHES HERE IN TABLE FIELD TBLFLD= 10 /COMMAND DECODER TABLE FIELD TERMWRD=7642 /TERMINATOR WORD USERROR=7 /USER SIGNALLED ERROR USR= 7700 /USR ENTRY POINT USRFLD= 10 /USR FIELD WIDTH= 107-2 /69 DATA CHARACTERS PER LINE (TOTAL 71) WRITE= 4000 /I/O WRITE BIT *0 /START AT THE BEGINNING *10 /DEFINE AUTO-INDEX AREA XR1, .-. /AUTO-INDEX NUMBER 1 XR2, .-. /AUTO-INDEX NUMBER 2 *20 /GET PAST AUTO-INDEX AREA BUFPTR, .-. /OUTPUT BUFFER POINTER CCNT, .-. /CHECKSUM COUNTER CHKSUM, ZBLOCK 5 /CHECKSUM TEMPORARY CHRCNT, .-. /CHARACTER COUNTER CSUMTMP,.-. /CHECKSUM TEMPORARY DANGCNT,.-. /DANGER COUNT DATCNT, .-. /DATA COUNTER DSTATE, .-. /DATA STATE VARIABLE IDNUMBE,.-. /INPUT DEVICE NUMBER IMSW, .-. /IMAGE-MODE SWITCH INITFLA,.-. /INITIALIZE INPUT FLAG INPUT, .-. /INPUT HANDLER POINTER INRECOR,.-. /INPUT RECORD FCHKSUM,ZBLOCK 5 /FILE CHECKSUM FNAME, ZBLOCK 4 /OUTPUT FILENAME GWTMP1, .-. /GETWORD TEMPORARY GWTMP2, .-. /GETWORD TEMPORARY GWVALUE,.-. /LATEST WORD VALUE ODNUMBE,.-. /OUTPUT DEVICE NUMBER OUTPUT, .-. /OUTPUT HANDLER POINTER OUTRECO,.-. /OUTPUT RECORD PUTEMP, .-. /OUTPUT TEMPORARY PUTPTR, .-. /OUTPUT POINTER THIRD, .-. /THIRD BYTE TEMPORARY / STATE TABLE. P, SCANIT /0000 LOOKING FOR "(" OR "<" FNDCOMMAND /0001 FOUND "(" AND NOW LOOKING FOR ")" FNDCEND /0002 FOUND ")" AND NOW LOOKING FOR <CR> FNDCR /0003 FOUND <CR> AND NOW LOOKING FOR <LF> TO RESET STORDATA /4000 FOUND "<" AND PROCESSING 69 DATA BYTES ENDATA /4001 FOUND 69 DATA BYTES AND NOW LOOKING FOR ">" ENDCR /4002 FOUND ">" AND NOW LOOKING FOR <CR> FNDCR/ENDLF /4003 FOUND <CR> AND NOW LOOKING FOR <LF> TO RESET PAGE /START AT THE USUAL PLACE BEGIN, NOP /HERE IN CASE WE'RE CHAINED TO CLA /CLEAN UP START, CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE DECODE /WANT COMMAND DECODER "E^100+"N-300 /.EN IS DEFAULT EXTENSION CDF TBLFLD /GOTO TABLE FIELD TAD I (TERMWRD) /GET TERMINATOR WORD SPA CLA /SKIP IF <CR> TERMINATED THE LINE DCA EXITZAP /ELSE CAUSE EXIT LATER DCA IMSW /CLEAR IMAGE-MODE; MIGHT GET SET LATER THOUGH TAD I (OUTFILE) /GET FIRST OUTPUT FILE DEVICE WORD SNA /SKIP IF FIRST OUTPUT FILE PRESENT JMP TSTMORE /JUMP IF NOT THERE AND [17] /JUST DEVICE BITS ODNULL, DCA ODNUMBER /SAVE OUTPUT DEVICE NUMBER TAD I (OUTFILE+5) /GET SECOND OUTPUT FILE DEVICE WORD SNA /SKIP IF THERE TAD I (OUTFILE+12) /ELSE GET THIRD OUTPUT FILE DEVICE WORD SZA CLA /SKIP IF BOTH NOT PRESENT JMP I (OUTERR) /ELSE COMPLAIN TAD I (INFILE) /GET FIRST INPUT FILE DEVICE WORD SNA /SKIP IF PRESENT JMP I (INERR) /JUMP IF NOT AND [17] /JUST DEVICE BITS DCA IDNUMBER /SAVE INPUT DEVICE NUMBER TAD I (INFILE+2) /GET SECOND INPUT FILE DEVICE WORD SZA CLA /SKIP IF ONLY ONE INPUT FILE JMP I (INERR) /ELSE COMPLAIN TAD I (INFILE+1) /GET FIRST INPUT FILE STARTING RECORD DCA INRECORD /SET IT UP CDF PRGFLD /BACK TO OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE RESET /RESET SYSTEM TABLES TAD (IHNDBUFFER+1) /GET INPUT BUFFER POINTER+TWO-PAGE BIT DCA IHPTR /STORE IN-LINE TAD IDNUMBER /GET INPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE FETCH /FETCH HANDLER IHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT JMP I (FERROR) /FETCH ERROR TAD IHPTR /GET RETURNED ADDRESS DCA INPUT /STORE AS INPUT HANDLER ADDRESS JMS I (GEOFILE) /GET OUTPUT FILE INFORMATION TAD (OHNDBUFFER+1) /GET BUFFER POINTER+TWO-PAGE BIT DCA OHPTR /STORE IN-LINE TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE FETCH /FETCH HANDLER OHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT JMP I (FERROR) /FETCH ERROR TAD OHPTR /GET RETURNED ADDRESS DCA OUTPUT /STORE AS OUTPUT HANDLER ADDRESS TAD IMSW /GET IMAGE-MODE SWITCH SNA CLA /SKIP IF SET JMP NOIMAGE /JUMP IF NOT / IF /2 IS SET, THE DATA STARTS HALF-WAY INTO THE IMAGE. OTHER IMAGE MODES / START AT RECORD 0000. CDF TBLFLD /GOTO TABLE FIELD TAD I [SWY9] /GET /Y-/9 SWITCHES AND (200) /JUST /2 SWITCH SNA CLA /SKIP IF SET JMP IMAGE1 /JUMP IF /1 OR NEITHER /1, /2 SET TAD I [EQUWRD] /GET EQUALS PARAMETER CLL RAR /%2 IMAGE1, DCA OUTRECORD /STORE STARTING OUTPUT RECORD CDF PRGFLD /BACK TO OUR FIELD SKP /DON'T ENTER FILE NAME NOIMAGE,JMS I (FENTER) /ENTER THE TENTATIVE FILE NAME DCA DSTATE /SET INITIAL DATA STATE JMS I (CLRCHKSUM) /CLEAR OUT CHECKSUM JMS I (DECODIT) /GO DO THE ACTUAL DECODING JMP I (PROCERR) /ERROR WHILE DECODING TAD IMSW /GET IMAGE-MODE SWITCH SZA CLA /SKIP IF CLEAR JMP EXITZAP /JUMP IF SET TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE CLOSE /CLOSE OUTPUT FILE FNAME /POINTER TO FILENAME OUTCNT, .-. /WILL BE ACTUAL COUNT JMP I (CLSERR) /CLOSE ERROR EXITZAP,JMP START /**** <ESC> TERMINATION **** 0000 JMP I (SBOOT) /EXIT TO MONITOR / COMES HERE TO TEST FOR NULL LINE. TSTMORE,TAD I (OUTFILE+5) /GET SECOND OUTPUT FILE DEVICE WORD SNA /SKIP IF PRESENT TAD I (OUTFILE+12) /ELSE GET THIRD OUTPUT FILE DEVICE WORD SZA CLA /SKIP IF NO OUTPUT FILES JMP I (OUTERR) /ELSE COMPLAIN OF SECOND/THIRD (WITHOUT FIRST) OUTPUT TAD I (INFILE) /GET FIRST OUTPUT FILE DEVICE WORD SZA CLA /SKIP IF NO INPUT FILES JMP ODNULL /JUMP IF INPUT WITHOUT OUTPUT CDF PRGFLD /BACK TO OUR FIELD JMP EXITZAP /MIGHT BE LAST TIME, SO GO THERE FIRST PAGE / ERROR WHILE PROCESSING INPUT FILE. PROCERR,NL0002 /SET INCREMENT SKP /DON'T USE NEXT / ERROR WHILE CLOSING THE OUTPUT FILE. CLSERR, NL0001 /SET INCREMENT SKP /DON'T CLEAR IT / OUTPUT FILE TOO LARGE ERROR. SIZERR, CLA /CLEAN UP TAD [3] /SET INCREMENT SKP /DON'T USE NEXT / ENTER ERROR. ENTERR, NL0002 /SET INCREMENT SKP /DON'T USE NEXT / HANDLER FETCH ERROR. FERROR, NL0001 /SET INCREMENT / I/O ERROR WHILE PROCESSING (FILE ) COMMAND. NIOERR, IAC /SET INCREMENT / FORMAT ERROR WHILE PROCESSING (FILE ) COMMAND. CHARERR,IAC /SET INCREMENT / INPUT FILESPEC ERROR. INERR, IAC /SET INCREMENT / OUTPUT FILESPEC ERROR. OUTERR, DCA ERRNUMBER /STORE ERROR NUMBER CDF PRGFLD /ENSURE OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE USERROR /USER ERROR ERRNUMB,.-. /WILL BE PASSED ERROR NUMBER DECODIT,.-. /DECODING ROUTINE TAD OUTRECORD /GET STARTING RECORD OF TENTATIVE FILE DCA PUTRECORD /STORE IN-LINE DCA I (OUTCNT) /CLEAR ACTUAL FILE LENGTH NL7777 /SETUP THE DCA INITFLAG /INITIALIZE FLAG TAD (GWLOOP) /INITIALIZE THE DCA I (GWNEXT) /DECODE PACK ROUTINE PUTNEWR,TAD POUTBUFFER/(OUTBUFFER) /SETUP THE DCA PUTPTR /OUTPUT BUFFER POINTER PUTLOOP,JMS I (GETWORD) /GET A WORD DCA I PUTPTR /STORE IT ISZ PUTPTR /BUMP TO NEXT TAD PUTPTR /GET THE POINTER TAD (-2^200-OUTBUFFER) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP PUTLOOP /KEEP GOING ISZ DANGCNT /TOO MANY RECORDS? SKP /SKIP IF NOT JMP I (SIZERROR) /NOT ENOUGH SPACE AVAILABLE JMS I OUTPUT /CALL OUTPUT HANDLER 2^100+WRITE /WRITE LATEST RECORD POUTBUF,OUTBUFFER /OUTPUT BUFFER ADDRESS PUTRECO,.-. /WILL BE LATEST RECORD NUMBER DECERR, JMP I DECODIT /I/O ERROR ISZ PUTRECORD /BUMP TO NEXT RECORD NOP /JUST IN CASE ISZ I (OUTCNT) /BUMP ACTUAL LENGTH JMP PUTNEWRECORD /GO DO ANOTHER ONE / GOOD RETURN HERE. DECBMP, ISZ DECODIT /BUMP TO GOOD RETURN JMP I DECODIT /RETURN / OS/8 FILE UNPACK ROUTINE. GETBYTE,.-. /GET A BYTE ROUTINE SNA CLA /INITIALIZING? JMP I PUTC /NO, GO GET NEXT BYTE TAD INRECORD /GET STARTING RECORD OF INPUT FILE DCA GETRECORD /STORE IN-LINE GETNEWR,JMS I INPUT /CALL I/O HANDLER 2^100 /READ TWO PAGES INTO BUFFER INBUFFER /BUFFER ADDRESS GETRECO,.-. /WILL BE LATEST RECORD NUMBER JMP I GETBYTE /INPUT ERROR! TAD (INBUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER GETLOOP,DCA THIRD /CLEAR THIRD BYTE NOW JMS PUTONE /OBTAIN AND SEND BACK FIRST BYTE JMS PUTONE /OBTAIN AND SEND BACK SECOND BYTE TAD THIRD /GET THIRD BYTE JMS PUTC /SEND IT BACK TAD BUFPTR /GET THE POINTER TAD (-2^200-INBUFFER) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP GETLOOP /KEEP GOING ISZ GETRECORD /BUMP TO NEXT RECORD JMP GETNEWRECORD /GO DO ANOTHER ONE PUTONE, .-. /SEND BACK A BYTE ROUTINE TAD I BUFPTR /GET LATEST WORD AND (7400) /JUST THIRD-BYTE NYBBLE CLL RAL /MOVE UP TAD THIRD /GET OLD NYBBLE (IF ANY) RTL;RTL /MOVE UP NYBBLE BITS DCA THIRD /SAVE FOR NEXT TIME TAD I BUFPTR /GET LATEST WORD AGAIN JMS PUTC /SEND BACK CURRENT BYTE ISZ BUFPTR /BUMP TO NEXT WORD JMP I PUTONE /RETURN PUTC, .-. /SEND BACK LATEST BYTE ROUTINE AND (177) /KEEP ONLY GOOD BITS TAD (-"Z!300) /COMPARE TO <^Z> SNA /SKIP IF NOT ASCII <EOF> JMP GETEOF /JUMP IF ASCII MODE <EOF> TAD ("Z&37) /RESTORE THE CHARACTER ISZ GETBYTE /BUMP PAST <EOF> RETURN GETEOF, ISZ GETBYTE /BUMP PAST I/O ERROR RETURN JMP I GETBYTE /RETURN TO MAIN CALLER PAGE / GET A DECODED WORD ROUTINE. GETWORD,.-. /GET A WORD ROUTINE JMP I GWNEXT /GO WHERE YOU SHOULD GO GWNEXT, .-. /EXIT ROUTINE SNL /SKIP IF CHECKSUM PREVENTED JMS I (DOCHECK) /ELSE DO CHECKSUM JMP I GETWORD /RETURN TO MAIN CALLER / COMES HERE TO PROCESSED COMPRESSED DATA. GWX, JMS I (GETCHR) /GET NEXT CHARACTER JMS I (GWORD0) /GET 12-BIT WORD JMS I (DOCHECK) /INCLUDE IN CHECKSUM DCA GWVALUE /SAVE AS COMPRESSED VALUE TAD GWTMP2 /GET LATEST CHARACTER AND [7] /ISOLATE BITS[9-11] CLL RTR;RTR /BITS[9-11] => AC[0-2] DCA GWTMP1 /SAVE FOR NOW JMS GBIHEXBINARY /GET A CHARACTER CLL RTL;RTL /BITS[7-11] => AC[3-7] TAD GWTMP1 /ADD ON BITS[0-2] JMS I (DOCHECK) /INCLUDE IN CHECKSUM CLL RTR;RTR /BITS[0-7] => AC[4-11] SNA /SKIP IF NOT 256 TAD [400] /000 => 256 CIA /INVERT FOR COUNTING DCA GWTMP1 /SAVE AS REPEAT COUNTER GWXLUP, TAD GWVALUE /GET THE VALUE STL /PREVENT CHECKSUMMING IT JMS GWNEXT /RETURN IT TO THEM ISZ GWTMP1 /DONE ENOUGH? JMP GWXLUP /NO, KEEP GOING / COMES HERE TO INITIATE ANOTHER DATA GROUP. GWLOOP, JMS I (GETCHR) /GET LATEST FILE CHARACTER TAD (-"Z!200) /COMPARE TO EOF INDICATOR SNA /SKIP IF OTHER JMP GWZ /JUMP IF IT MATCHES TAD (-"X+"Z) /COMPARE TO COMPRESSION INDICATOR SNA CLA /SKIP IF OTHER JMP GWX /JUMP IF IT MATCHES TAD PUTEMP /GET THE CHARACTER BACK JMS I (GWORD0) /GET A 12-BIT WORD JMS GWNEXT /RETURN IT JMS I (GWORD1) /GET NEXT 12-BIT WORD JMS GWNEXT /RETURN IT JMS I (GWORD2) /GET NEXT 12-BIT WORD JMS GWNEXT /RETURN IT JMS I (GWORD3) /GET NEXT 12-BIT WORD JMS GWNEXT /RETURN IT JMS I (GWORD4) /GET NEXT 12-BIT WORD JMS GWNEXT /RETURN IT JMP GWLOOP /KEEP GOING / COMES HERE WHEN EOF INDICATOR FOUND. GWZ, TAD (FCHKSUM-1) /SETUP THE DCA XR1 /CHECKSUM POINTER JMS I (GETCHR) /GET NEXT CHARACTER JMS I (GWORD0) /GET A 12-BIT WORD DCA I XR1 /STORE IT JMS I (GWORD1) /GET NEXT WORD DCA I XR1 /STORE IT JMS I (GWORD2) /GET NEXT WORD DCA I XR1 /STORE IT JMS I (GWORD3) /GET NEXT WORD DCA I XR1 /STORE IT JMS I (GWORD4) /GET NEXT WORD DCA I XR1 /STORE IT TAD (CHKSUM-1) /POINT TO DCA XR1 /CALCULATED CHECKSUM TAD (FCHKSUM-1) /POINT TO DCA XR2 /FILE CHECKSUM TAD [-5] /SETUP THE DCA CCNT /COMPARE COUNT CLL /CLEAR LINK FOR TEST GWCMPLP,RAL /GET CARRY TAD I XR1 /GET A CALCULATED WORD TAD I XR2 /COMPARE TO FILE WORD SZA CLA /SKIP IF OK JMP I (DECERR) /ELSE COMPLAIN ISZ CCNT /DONE ALL? JMP GWCMPLP /NO, KEEP GOING / THE CHECKSUM IS OK, CHECK IF FILE ENDED IN A PLAUSIBLE PLACE. TAD PUTPTR /GET OUTPUT POINTER TAD (-OUTBUFFER-4) /COMPARE TO LIMIT SMA SZA CLA /SKIP IF GOOD VALUE JMP I (DECERROR) /JUMP IF NOT / THE FILE ENDED OK, THERE WERE POSSIBLY A FEW CHARACTERS LEFTOVER BECAUSE OF / ALIGNMENT CONSIDERATIONS. THEY SHOULD BE IGNORED SINCE OS/8 FILES ARE / MULTIPLES OF WHOLE RECORDS. JMP I (DECBMP) /RETURN WITH ALL OK GBIHEXB,.-. /GET BINARY VALUE OF BIHEXADECIMAL CHARACTER CLA /CLEAN UP TAD GBIHEXBINARY /GET OUR CALLER DCA BIHEXBINARY /MAKE IT THEIRS JMS I (GETCHR) /GET A CHARACTER SKP /DON'T EXECUTE HEADER! BIHEXBI,.-. /CONVERT BIHEXADECIMAL TO BINARY TAD (-"A!200) /COMPARE TO ALPHABETIC LIMIT SMA /SKIP IF LESS TAD ("9+1-"A) /ELSE ADD ON ALPHABETIC OFFSET TAD (-"0+"A) /MAKE IT BINARY, NOT ASCII DCA GWTMP2 /SAVE IT TAD GWTMP2 /GET IT BACK JMP I BIHEXBINARY /RETURN PAGE / GET WORD[0] ROUTINE. AC MUST ALREADY CONTAIN THE FIRST BI-HEXADECIMAL / CHARACTER. GWORD0, .-. /GET 12-BIT WORD[0] JMS I (BIHEXBINARY) /CONVERT PASSED VALUE TO BINARY CLL RTR;RTR;RTR /BITS[7-11] => AC[0-4] DCA GWTMP1 /SAVE FOR NOW JMS I (GBIHEXBINARY) /GET NEXT CHARACTER IN BINARY CLL RTL /BITS[7-11] => AC[5-9] TAD GWTMP1 /ADD ON BITS[0-4] DCA GWTMP1 /SAVE FOR NOW JMS I (GBIHEXBINARY) /GET NEXT CHARACTER IN BINARY RTR;RAR /BITS[7-8] => AC[10-11] AND [3] /ISOLATE BITS[10-11] TAD GWTMP1 /ADD ON BITS[0-9] CLL /CLEAR LINK JMP I GWORD0 /RETURN / GET WORD[1] ROUTINE. GWORD0 MUST HAVE BEEN CALLED LAST, SO GWTMP2 CONTAINS / THE PREVIOUS CHARACTER. GWORD1, .-. /GET 12-BIT WORD[1] TAD GWTMP2 /GET PREVIOUS CHARACTER AND [7] /ISOLATE BITS[9-11] CLL RTR;RTR /BITS[9-11] => AC[0-2] DCA GWTMP1 /SAVE FOR NOW JMS I (GBIHEXBINARY) /GET NEXT CHARACTER IN BINARY CLL RTL;RTL /BITS[7-11] => AC[3-7] TAD GWTMP1 /ADD ON BITS[0-2] DCA GWTMP1 /SAVE FOR NOW JMS I (GBIHEXBINARY) /GET NEXT CHARACTER IN BINARY CLL RAR /BITS[7-10] => AC[8-11] TAD GWTMP1 /ADD ON BITS[0-7] CLL /CLEAR LINK JMP I GWORD1 /RETURN / GET WORD[2] ROUTINE. GWORD1 MUST HAVE BEEN CALLED LAST, SO GWTMP2 CONTAINS / THE PREVIOUS CHARACTER. GWORD2, .-. /GET 12-BIT WORD[2] TAD GWTMP2 /GET PREVIOUS CHARACTER RAR;CLA RAR /BIT[11] => AC[0] DCA GWTMP1 /SAVE FOR NOW JMS I (GBIHEXBINARY) /GET NEXT CHARACTER IN BINARY CLL RTL;RTL;RTL /BITS[7-11] => AC[1-5] TAD GWTMP1 /ADD ON BIT[0] DCA GWTMP1 /SAVE FOR NOW JMS I (GBIHEXBINARY) /GET NEXT CHARACTER IN BINARY CLL RAL /BITS[7-11] => AC[6-10] TAD GWTMP1 /ADD ON BITS[0-5] DCA GWTMP1 /SAVE FOR NOW JMS I (GBIHEXBINARY) /GET NEXT CHARACTER IN BINARY AND (20) /ISOLATE BIT[7] CLL RTR;RTR /BIT[7] => AC[11] TAD GWTMP1 /ADD ON BITS[0-10] CLL /CLEAR LINK JMP I GWORD2 /RETURN / GET WORD[3] ROUTINE. GWORD2 MUST HAVE BEEN CALLED LAST, SO GWTMP2 CONTAINS / THE PREVIOUS CHARACTER. GWORD3, .-. /GET 12-BIT WORD[3] TAD GWTMP2 /GET PREVIOUS CHARACTER CLL RTR;RTR;RAR /BITS[8-11] => AC[0-3] DCA GWTMP1 /SAVE FOR NOW JMS I (GBIHEXBINARY) /GET NEXT CHARACTER IN BINARY CLL RTL;RAL /BITS[7-11] => AC[4-8] TAD GWTMP1 /ADD ON BITS[0-3] DCA GWTMP1 /SAVE FOR NOW JMS I (GBIHEXBINARY) /GET NEXT CHARACTER IN BINARY RTR /BITS[7-9] => AC[9-11] AND [7] /ISOLATE BITS[9-11] TAD GWTMP1 /ADD ON BITS[0-8] CLL /CLEAR LINK JMP I GWORD3 /RETURN / GET WORD[4] ROUTINE. GWORD3 MUST HAVE BEEN CALLED LAST, SO GWTMP2 CONTAINS / THE PREVIOUS CHARACTER. GWORD4, .-. /GET 12-BIT WORD[4] TAD GWTMP2 /GET PREVIOUS CHARACTER AND [3] /ISOLATE BITS[10-11] CLL RTR;RAR /BITS[10-11] => AC[0-1] DCA GWTMP1 /SAVE FOR NOW JMS I (GBIHEXBINARY) /GET NEXT CHARACTER IN BINARY CLL RTL;RTL;RAL /BITS[7-11] => AC[2-6] TAD GWTMP1 /ADD ON BITS[0-1] DCA GWTMP1 /SAVE FOR NOW JMS I (GBIHEXBINARY) /GET NEXT CHARACTER IN BINARY TAD GWTMP1 /ADD ON BITS[0-6] TO BITS[7-11] CLL /CLEAR LINK JMP I GWORD4 /RETURN DOCHECK,.-. /CHECKSUM ROUTINE DCA CSUMTMP /SAVE PASSED VALUE TAD (CHKSUM-1) /SETUP THE DCA XR1 /INPUT POINTER TAD (CHKSUM-1) /SETUP THE DCA XR2 /OUTPUT POINTER TAD [-5] /SETUP THE DCA CCNT /SUM COUNT TAD CSUMTMP /GET THE VALUE CLL RAR /ADJUST FOR OPENING ITERATION CSUMLUP,RAL /GET CARRY TAD I XR1 /ADD ON A WORD DCA I XR2 /STORE BACK ISZ CCNT /DONE ALL YET? JMP CSUMLUP /NO, KEEP GOING TAD CSUMTMP /GET LATEST VALUE JMP I DOCHECK /RETURN PAGE GETCHR, .-. /GET A VALID CHARACTER ROUTINE GETMORE,TAD INITFLAG /GET INITIALIZE FLAG JMS I [GETBYTE] /GET A CHARACTER JMP I (DECERR) /I/O ERROR JMP I (DECERR) /<EOF> DCA PUTEMP /SAVE THE CHARACTER DCA INITFLAG /CLEAR INITIALIZE FLAG TAD DSTATE /GET DATA STATE SPA /SKIP IF NOT ONE OF THE DATA-ORIENTED STATES TAD (4004) /ADD ON DATA-ORIENTED STATES OFFSET TAD (JMP I P) /SETUP JUMP INSTRUCTION DCA .+1 /STORE IN-LINE .-. /AND EXECUTE IT / LOOKING FOR OPENING CHARACTER. SCANIT, TAD PUTEMP /GET THE CHARACTER TAD (-"<!200) /COMPARE TO OPENING DATA CHARACTER SNA /SKIP IF NO MATCH JMP FNDATA /JUMP IF IT MATCHES TAD (-"(+"<) /COMPARE TO OPENING COMMAND CHARACTER SNA CLA /SKIP IF NO MATCH ISZ DSTATE /INDICATE LOOKING FOR END OF COMMAND JMP GETMORE /KEEP GOING / FOUND OPENING COMMAND CHARACTER. FNDCOMM,TAD PUTEMP /GET THE CHARACTER TAD (-")!200) /COMPARE TO CLOSING COMMAND CHARACTER SNA CLA /SKIP IF NO MATCH ISZ DSTATE /INDICATE LOOKING FOR <CR> JMP GETMORE /KEEP GOING / FOUND CLOSING COMMAND CHARACTER. FNDCEND,TAD PUTEMP /GET THE CHARACTER TAD (-"M!300) /COMPARE TO <CR> SNA CLA /SKIP IF NO MATCH ISZ DSTATE /INDICATE LOOKING FOR <LF> JMP GETMORE /KEEP GOING / FOUND <CR> AFTER COMMAND. FNDCR, TAD PUTEMP /GET THE CHARACTER TAD (-"J!300) /COMPARE TO <LF> SNA CLA /SKIP IF NO MATCH DCA DSTATE /RESET TO SCANNING STATE JMP GETMORE /KEEP GOING / FOUND OPENING DATA CHARACTER. FNDATA, TAD (-WIDTH) /SETUP THE DCA DATCNT /DATA COUNTER NL4000 /SETUP THE DCA DSTATE /NEW STATE JMP GETMORE /KEEP GOING / PROCESSING ONE OF 69 DATA CHARACTERS. STORDAT,TAD PUTEMP /GET THE CHARACTER TAD [-140] /SUBTRACT UPPER-CASE LIMIT SPA /SKIP IF LOWER-CASE TAD [40] /RESTORE UPPER-CASE TAD (100) /RESTORE THE CHARACTER DCA PUTEMP /SAVE IT BACK TAD PUTEMP /GET IT AGAIN TAD (-"Z!200-1) /SUBTRACT UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD ("Z-"A+1) /ADD ON RANGE SZL CLA /SKIP IF NOT ALPHABETIC JMP ALPHAOK /JUMP IF ALPHABETIC TAD PUTEMP /GET THE CHARACTER TAD (-"9!200-1) /ADD ON UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD ("9-"0+1) /ADD ON RANGE SNL CLA /SKIP IF OK JMP GETMORE /IGNORE IF NOT ALPHAOK,TAD PUTEMP /GET THE CHARACTER ISZ DATCNT /DONE 69 CHARACTERS? SKP /SKIP IF NOT ISZ DSTATE /ADVANCE TO NEXT STATE JMP I GETCHR /RETURN / PROCESSED 69 DATA CHARACTERS; NOW LOOKING FOR ENDING DATA CHARACTER. ENDATA, TAD PUTEMP /GET THE CHARACTER TAD (-">!200) /COMPARE TO ENDING DATA VALUE SNA CLA /SKIP IF NO MATCH ISZ DSTATE /ELSE ADVANCE TO NEXT STATE JMP GETMORE /KEEP GOING / FOUND ENDING DATA CHARACTER; NOW LOOKING FOR <CR>. ENDCR, TAD PUTEMP /GET THE CHARACTER TAD (-"M!300) /COMPARE TO <CR> SNA CLA /SKIP IF NO MATCH ISZ DSTATE /ELSE ADVANCE TO NEXT STATE JMP GETMORE /KEEP GOING / FOUND ENDING DATA CHARACTER AND <CR>; NOW LOOKING FOR <LF>. /ENDLF, TAD PUTEMP /GET THE CHARACTER / TAD (-"J!300) /COMPARE TO <LF> / SNA CLA /SKIP IF NO MATCH / DCA DSTATE /RESET TO SCANNING STATE / JMP GETMORE /KEEP GOING CLRCHKS,.-. /CLEAR CALCULATED CHECKSUM ROUTINE DCA CHKSUM+0 /CLEAR LOW-ORDER DCA CHKSUM+1 /CLEAR NEXT DCA CHKSUM+2 /CLEAR NEXT DCA CHKSUM+3 /CLEAR NEXT DCA CHKSUM+4 /CLEAR HIGH-ORDER JMP I CLRCHKSUM /RETURN PAGE GEOFILE,.-. /GET OUTPUT FILE ROUTINE TAD ODNUMBER /GET OUTPUT DEVICE NUMBER SZA CLA /SKIP IF NOT ESTABLISHED YET JMP GOTOD /JUMP IF DETERMINED ALREADY TAD ("D^100+"S-300) /GET BEGINNING OF "DSK" DCA DEVNAME /STORE IN-LINE TAD ("K^100) /GET REST OF "DSK" DCA DEVNAME+1 /STORE IN-LINE DCA RETVAL /CLEAR HANDLER ENTRY WORD CDF PRGFLD /INDICATE OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE INQUIRE /INQUIRE ABOUT HANDLER DEVNAME,ZBLOCK 2 /WILL BE DEVICE DSK RETVAL, .-. /BECOMES HANDLER ENTRY POINT WORD HLT /DSK: NOT IN SYSTEM IS IMPOSSIBLE! TAD DEVNAME+1 /GET DEVICE NUMBER FOR DSK: AND [17] /JUST DEVICE BITS DCA ODNUMBER /STORE OUTPUT DEVICE GOTOD, CDF TBLFLD /BACK TO TABLE FIELD TAD I (OUTFILE+1) /GET OUTPUT FILE FIRST NAME WORD SNA /SKIP IF PRESENT JMP GFLNAME /JUMP IF NOT DCA FNAME /MOVE TO OUR AREA TAD I (OUTFILE+2) /GET SECOND NAME WORD DCA FNAME+1 /MOVE IT TAD I (OUTFILE+3) /GET THIRD NAME WORD DCA FNAME+2 /MOVE IT TAD I (OUTFILE+4) /GET EXTENSION WORD DCA FNAME+3 /MOVE IT GEOFXIT,CDF PRGFLD /BACK TO OUR FIELD JMP I GEOFILE /RETURN / WE MUST TAKE THE FILENAME FROM THE IMBEDDED (FILE ) COMMAND. THE ONLY / EXCEPTION IS IF WE ARE DOING AN IMAGE TRANSFER. GFLNAME,TAD I (SWAL) /GET /A-/L SWITCHES AND (10) /JUST /I BIT SZA CLA /SKIP IF NOT SET TAD I [EQUWRD] /GET EQUALS PARAMETER SNA /SKIP IF SET TO SOMETHING JMP DOFLNAME /JUMP IF PARAMETERS NOT SET CMA /INVERT IT DCA DANGCNT /STORE AS DANGER COUNT ISZ IMSW /SET IMAGE-MODE SWITCH TAD I [SWY9] /GET /Y-/9 SWITCHES AND (600) /JUST /1, /2 SWITCHES SNA /SKIP IF EITHER SET JMP GEOFXIT /JUMP IF NEITHER SET AND [400] /JUST /1 SWITCH SNA CLA /SKIP IF /1 SET JMP IM2 /JUMP IF /2 SET TAD I [EQUWRD] /GET EQUALS PARAMETER CLL RAR /%2 JMP IMCOMMON /CONTINUE THERE IM2, TAD I [EQUWRD] /GET EQUALS PARAMETER CLL RAR /%2 CIA /SUBTRACT PART 1 VALUE TAD I [EQUWRD] /FROM EQUALS PARAMETER IMCOMMO,CMA /INVERT IT DCA DANGCNT /STORE AS DANGER COUNT JMP GEOFXIT /EXIT THERE DOFLNAM,CDF PRGFLD /BACK TO OUR FIELD NL7777 /SETUP THE DCA INITFLAG /INPUT FILE INITIALIZATION JMS I (SCNFILE) /SCAN OFF "(FILE" / HAVING FOUND THE (FILE ) COMMAND, WE MUST FIND THE FILENAME. / ZERO OUT THE FILENAME AREA. TAD (-10) /SETUP THE DCA CHRCNT /CLEAR COUNTER TAD (ONAME-1) /SETUP THE DCA XR1 /POINTER JMS I (CLRNAME) /CLEAR THE NAME BUFFER / SETUP FOR SCANNING THE NAME PORTION. TAD (-6) /SETUP THE DCA CHRCNT /SCAN COUNT TAD (ONAME-1) /SETUP THE DCA XR1 /POINTER FNCAGN, JMS I (GETAN) /GET A CHARACTER JMP GOTSEPARATOR /GOT "."; GOTO NEXT FIELD DCA I XR1 /STASH THE CHARACTER ISZ CHRCNT /DONE ALL YET? JMP FNCAGN /NO, KEEP GOING / THROW AWAY EXTRA NAME CHARACTERS. TOSSNAM,JMS I (GETAN) /GET A CHARACTER JMP GOTSEPARATOR /GOT "."; GOTO NEXT FIELD JMP TOSSNAME /KEEP GOING / COMES HERE AFTER "." FOUND. GOTSEPA,JMS I (CLRNAME) /CLEAR OUT THE REMAINING NAME FIELD NL7776 /SETUP THE DCA CHRCNT /SCAN COUNT EXCAGN, JMS I (GETAN) /GET A CHARACTER JMP I [CHARERROR] /GOT "."; COMPLAIN DCA I XR1 /STASH THE CHARACTER ISZ CHRCNT /DONE ENOUGH YET? JMP EXCAGN /NO, KEEP GOING / TOSS ANY EXTRA EXTENSION CHARACTERS. TOSSEXT,JMS I (GETAN) /GET A CHARACTER JMP I [CHARERROR] /GOT "."; COMPLAIN JMP TOSSEXTENSION /KEEP GOING / COMES HERE WHEN TRAILING ")" IS FOUND. GOTRPAR,JMS I (CLRNAME) /CLEAR ANY REMAINING EXTENSION CHARACTERS TAD I (ONAME) /GET THE FIRST CHARACTER SNA CLA /SKIP IF SOMETHING THERE JMP I [CHARERROR] /COMPLAIN IF NONE THERE TAD (ONAME-1) /SETUP POINTER DCA XR1 /TO NAME CHARACTERS TAD (FNAME-1) /SETUP POINTER DCA XR2 /TO PACKED NAME AREA TAD (-4) /SETUP THE DCA CHRCNT /MOVE COUNT CHRLOOP,TAD I XR1 /GET FIRST CHARACTER CLL RTL;RTL;RTL /MOVE UP TAD I XR1 /ADD ON SECOND CHARACTER DCA I XR2 /STORE THE PAIR ISZ CHRCNT /DONE YET? JMP CHRLOOP /NO, KEEP GOING JMP I GEOFILE /YES, RETURN PAGE SCNFILE,.-. /SCAN "(FILE" ROUTINE MATAGN, JMS GETNSPC /GET A CHARACTER TAD (-"(!200) /COMPARE TO "(" SZA CLA /SKIP IF IT MATCHES JMP MATAGN /JUMP IF NOT JMS GETNSPC /GET NEXT CHARACTER TAD (-"F!300) /COMPARE TO "F" SZA CLA /SKIP IF IT MATCHES JMP MATAGN /JUMP IF NOT JMS GETNSPC /GET NEXT CHARACTER TAD (-"I!300) /COMPARE TO "I" SZA CLA /SKIP IF IT MATCHES JMP MATAGN /JUMP IF NOT JMS GETNSPC /GET NEXT CHARACTER TAD (-"L!300) /COMPARE TO "L" SZA CLA /SKIP IF IT MATCHES JMP MATAGN /JUMP IF NOT JMS GETNSPC /GET NEXT CHARACTER TAD (-"E!300) /COMPARE TO "E" SZA CLA /SKIP IF IT MATCHES JMP MATAGN /JUMP IF NOT JMP I SCNFILE /RETURN CLRNAME,.-. /NAME FIELD CLEARING ROUTINE TAD CHRCNT /GET CHARACTER COUNTER SNA CLA /SKIP IF ANY TO CLEAR JMP I CLRNAME /ELSE JUST RETURN DCA I XR1 /CLEAR A NAME WORD ISZ CHRCNT /COUNT IT JMP .-2 /KEEP GOING JMP I CLRNAME /RETURN GETNSPC,.-. /GET NON-<SPACE> CHARACTER GETNAGN,JMS GETCHAR /GET A CHARACTER TAD (-" !200) /COMPARE TO <SPACE> SNA CLA /SKIP IF OTHER JMP GETNAGN /JUMP IF IT MATCHES TAD PUTEMP /GET THE CHARACTER BACK JMP I GETNSPC /RETURN GETCHAR,.-. /GET A CHARACTER ROUTINE CLA /CLEAN UP TAD INITFLAG /GET INITIALIZE FLAG JMS I [GETBYTE] /GET A CHARACTER JMP I (NIOERROR) /COMPLAIN IF AN ERROR JMP I [CHARERROR] /COMPLAIN IF <EOF> REACHED TAD [-140] /COMPARE TO LOWER-CASE LIMIT SPA /SKIP IF LOWER-CASE TAD [40] /RESTORE ORIGINAL IF UPPER-CASE AND (77) /JUST SIX-BIT DCA PUTEMP /SAVE IN CASE WE NEED IT DCA INITFLAG /CLEAR INITIALIZE FLAG TAD PUTEMP /GET IT BACK JMP I GETCHAR /RETURN GETAN, .-. /GET ALPHANUMERIC ROUTINE JMS GETNSPC /GET A NON-<SPACE> CHARACTER TAD (-".!200) /COMPARE TO "." SNA /SKIP IF OTHER JMP I GETAN /TAKE FIRST RETURN IF IT MATCHES TAD (-")+".) /COMPARE TO ")" SNA /SKIP IF OTHER JMP I (GOTRPAREN) /TAKE DEDICATED RETURN IF IT MATCHES TAD (-":+")) /SUBTRACT UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD (":-"0) /ADD ON RANGE SZL CLA /SKIP IF NOT NUMERIC JMP GETANOK /JUMP IF NUMERIC TAD PUTEMP /GET THE CHARACTER BACK TAD (-"[!300) /SUBTRACT UPPER LIMIT CLL /CLEAR LINK FOR TEST TAD ("[-"A) /ADD ON RANGE SNL CLA /SKIP IF ALPHABETIC JMP I [CHARERROR] /ELSE COMPLAIN GETANOK,TAD PUTEMP /GET GOOD ALPHANUMERIC CHARACTER ISZ GETAN /BUMP TO SKIP RETURN JMP I GETAN /RETURN ONAME, ZBLOCK 10 /OUTPUT NAME FIELD FENTER, .-. /FILE ENTER ROUTINE TAD (FNAME) /POINT TO DCA ENTAR1 /STORED FILENAME DCA ENTAR2 /CLEAR SECOND ARGUMENT TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE ENTER /ENTER TENTATIVE FILENAME ENTAR1, .-. /WILL POINT TO FILENAME ENTAR2, .-. /WILL BE ZERO JMP I (ENTERR) /ENTER ERROR TAD ENTAR2 /GET RETURNED EMPTY LENGTH IAC /ADD 2-1 FOR OS/278 CRAZINESS DCA DANGCNT /STORE AS DANGER COUNT TAD ENTAR1 /GET RETURNED FIRST RECORD DCA OUTRECORD /SETUP OUTPUT RECORD JMP I FENTER /RETURN PAGE $ /THAT'S ALL FOLK! |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 | / OS/8 BOO ENCODING PROGRAM / LAST EDIT: 01-OCT-1991 15:00:00 CJL / MAY BE ASSEMBLED WITH '/F' SWITCH SET. / PROGRAM TO ENCODE ANY TYPE OF OS/8 FILE INTO "PRINTABLE" ASCII (".BOO") / FORMAT. THIS IS A COMMON DISTRIBUTION FORMAT FOR MANY COLUMBIA KERMIT FILES / AND IS AN ALTERNATIVE TO ENCODE FORMAT FOR PDP-8 AND DECMATE USERS. / DISTRIBUTED BY CUCCA AS "K12ENB.PAL" AS PART OF THE CUCCA KERMIT-12 PACKAGE. / WRITTEN BY: / CHARLES LASNER (CJL) / CLA SYSTEMS / 72-55 METROPOLITAN AVENUE / MIDDLE VILLAGE, NEW YORK 11379-2107 / (718) 894-6499 / USAGE: / .RUN DEV ENBOO INVOKE PROGRAM / *OUTPUT<INPUT PASS ONE INPUT AND ONE OUTPUT FILE ONLY (WITH <CR>) / *OUTPUT<INPUT$ PASS ONE INPUT AND ONE OUTPUT FILE ONLY (WITH <ESC>) / . PROGRAM EXITS NORMALLY / INPUT FILE ASSUMES .SV EXTENSION; THERE IS NO ASSUMED OUTPUT EXTENSION. / PROGRAM EXIT IS THE NORMAL OS/8 METHOD OF EITHER PRESSING <^C> ON THE CONSOLE / KEYBOARD DURING THE COMMAND, OR ENDING THE COMMAND INPUT LINE WITH AN <ESC> / CHARACTER. / THIS PROGRAM SUPPORTS THE .BOO FORMAT FOR FILE ENCODING WHICH IS POPULAR IN / OTHER SYSTEMS. THIS VERSION IMPLEMENTS THE FILE LENGTH PROTECTION SCHEME / DEVELOPED BY CHARLES LASNER TO ENSURE PRECISE FILE LENGTH. / MANY .BOO PROGRAMS HAVE PROBLEMS MAINTAINING PRECISE FILE LENGTH. THE ACTUAL / LENGTH MAY BE IMPRECISELY STATED BY ONE OR TWO BYTES DUE TO AN INHERENT / WEAKNESS IN THE ORIGINAL .BOO ENCODING FORMAT DESIGN. THIS IMPLEMENTATION / APPENDS CORRECTION BYTES AS NECESSARY TO THE BASIC .BOO FILE TO ENSURE PROPER / DECODING BY PROGRAMS COMPATIBLE WITH THIS EXTENSION. / FILES CREATED BY THIS PROGRAM MAY BE USED WITH EARLIER .BOO DECODERS; THE / RESULTANT FILES MAY INACCURATELY RECREATE THE ORIGINAL FILES BY AS MUCH AS TWO / EXTRANEOUS TRAILING BYTES. THERE WILL BE NO PROBLEMS (BEYOND THE LENGTH / ANOMALY) AS LONG AS THE DECODERS IMPLEMENT ZERO-LENGTH COMPRESSION FIELDS AS / NO OPERATION. IT IS POSSIBLE THAT CERTAIN DECODERS COULD ERRONEOUSLY APPEND / MASSIVE QUANTITIES OF ZEROES ONTO THE END OF THE DECODED FILES, BUT THIS / ACTION WOULD CERTAINLY BE CAUSED BY DEFECTIVE PROGRAM CODE WITHIN THE DECODER. / (ALTHOUGH NOT LIKELY SEEN BEFORE ENCOUNTERING FILES WITH LENGTH CORRECTION / BYTES, THIS WOULD BE A LATENT BUG IN THESE DECODING PROGRAMS. UPDATED / VERSIONS SHOULD BE SOUGHT IF THIS PROBLEM SURFACES.) / ERROR MESSAGES. / ERROR MESSAGES ARE ONE OF TWO VARIETIES: COMMAND DECODER MESSAGES AND USER / (PROGRAM-SIGNALLED) MESSAGES. / COMMAND DECODER MESSAGES ARE NON-FATAL AND MERELY REQUIRE RETYPING THE / COMMAND. ATTEMPTING TO USE MORE THAN ONE OUTPUT FILE WILL YIELD THE COMMAND / DECODER MESSAGE "TOO MANY FILES" AND CAUSE A REPEAT OF THE COMMAND DECODER / PROMPT REQUIRING USER INPUT. THE USER IS DIRECTED TO OTHER DOCUMENTATION OF / THE "SPECIAL" MODE OF THE COMMAND DECODER, AS THAT IS THE ONLY MODE USED BY / THIS UTILITY PROGRAM. / ANY USER MESSAGE PRINTED IS A FATAL ERROR MESSAGE CAUSED BY A PROBLEM BEYOND / THE SCOPE OF THE COMMAND DECODER. ALL USER MESSAGES ARE THE STANDARD OS/8 / "USER" ERROR MESSAGES OF THE FORM: "USER ERROR X AT AAAAA", WHERE X IS THE / ERROR NUMBER AND AAAAA IS THE PROGRAM ADDRESS WHERE THE ERROR WAS DETECTED. / THE FOLLOWING USER ERRORS ARE DEFINED: / ERROR NUMBER PROBABLE CAUSE / 0 NO OUTPUT FILE. / 1 INPUT FILE ERROR (CAN'T FIND INPUT FILE) OR NO INPUT / FILE SPECIFIED OR TOO MANY INPUT FILES SPECIFIED. / 2 ILLEGAL OUTPUT FILE NAME (WILD CARDS NOT ALLOWED). / 3 NO OUTPUT FILE NAME (DEVICE ONLY IS NOT ALLOWED). / 4 ERROR WHILE FETCHING FILE HANDLER. / 5 ERROR WHILE ATTEMPTING TO ENTER OUTPUT FILE. / 6 OUTPUT FILE LARGER THAN AVAILABLE FILE SPACE. / 7 ERROR WHILE CLOSING THE OUTPUT FILE. / 8 I/O ERROR WHILE ENCODING FILE DATA. / 9 OUTPUT ERROR WHILE ENCODING FILE DATA. / ASSEMBLY INSTRUCTIONS. / IT IS ASSUMED THE SOURCE FILE K12ENB.PAL HAS BEEN MOVED AND RENAMED TO / DSK:ENBOO.PA. / .PAL ENBOO<ENBOO/E/F ASSEMBLE SOURCE PROGRAM / .LOAD ENBOO LOAD THE BINARY FILE / .SAVE DEV ENBOO=2001 SAVE THE CORE-IMAGE FILE / DEFINITIONS. CLOSE= 4 /CLOSE OUTPUT FILE DECODE= 5 /CALL COMMAND DECODER ENTER= 3 /ENTER TENTATIVE FILE FETCH= 1 /FETCH HANDLER IHNDBUF=7200 /INPUT HANDLER BUFFER INBUFFE=6200 /INPUT BUFFER INFILE= 7605 /INPUT FILE INFORMATION HERE LOOKUP= 2 /LOOKUP INPUT FILE NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 OHNDBUF=6600 /OUTPUT HANDLER BUFFER OUTBUFF=5600 /OUTPUT BUFFER OUTFILE=7600 /OUTPUT FILE INFORMATION HERE PRGFLD= 00 /PROGRAM FIELD RESET= 13 /RESET SYSTEM TABLES SBOOT= 7600 /MONITOR EXIT TBLFLD= 10 /COMMAND DECODER TABLE FIELD TERMWRD=7642 /TERMINATOR WORD USERROR=7 /USER SIGNALLED ERROR USR= 0200 /USR ENTRY POINT USRENT= 7700 /USR ENTRY POINT WHEN NON-RESIDENT USRFLD= 10 /USR FIELD USRIN= 10 /LOCK USR IN CORE WIDTH= 114 /LINES MUST BE 76 WIDE OR LESS WRITE= 4000 /I/O WRITE BIT *0 /START AT THE BEGINNING *20 /GET PAST AUTO-INDEX AREA BUFPTR, .-. /OUTPUT BUFFER POINTER CHAR, .-. /LATEST INPUT BYTE CHARPTR,.-. /OUTPUT BYTE POINTER CHARS, ZBLOCK 3 /OUTPUT BYTES HERE CMPCNT, .-. /MATCH COUNT FOR COMPRESSION COLUMN, .-. /LATEST COLUMN DANGCNT,.-. /DANGER COUNT IDNUMBE,.-. /INPUT DEVICE NUMBER IFNAME, ZBLOCK 4 /INPUT FILENAME INLEN, .-. /INPUT FILE LENGTH INPTR, .-. /INPUT BUFFER POINTER INPUT, .-. /INPUT HANDLER POINTER INRECOR,.-. /INPUT RECORD FNAME, ZBLOCK 4 /OUTPUT FILENAME LATEST, .-. /LATEST OUTPUT CHARACTER ODNUMBE,.-. /OUTPUT DEVICE NUMBER OUTPUT, .-. /OUTPUT HANDLER POINTER OUTRECO,.-. /OUTPUT RECORD PIFTEMP,.-. /PRINT INPUT FILENAME TEMPORARY TEMPTR, .-. /TEMPORARY POINTER THIRD, .-. /THIRD INPUT BYTE UNPACKING TEMPORARY PAGE /START AT THE USUAL PLACE BEGIN, NOP /IN CASE WE'RE CHAINED TO CLA /CLEAN UP START, CIF USRFLD /GOTO USR FIELD JMS I (USRENT) /CALL USR ROUTINE USRIN /GET IT LOCKED IN CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE DECODE /WANT COMMAND DECODER "*^100 /USING SPECIAL MODE CDF TBLFLD /GOTO TABLE FIELD TAD I (TERMWRD) /GET TERMINATOR WORD SPA CLA /SKIP IF <CR> TERMINATED THE LINE DCA EXITZAP /ELSE CAUSE EXIT LATER TAD I (OUTFILE) /GET OUTPUT FILE DEVICE WORD SNA /SKIP IF FIRST OUTPUT FILE PRESENT JMP TSTMORE /JUMP IF NOT THERE AND [17] /JUST DEVICE BITS DCA ODNUMBER /SAVE OUTPUT DEVICE NUMBER TAD I (INFILE) /GET FIRST INPUT FILE DEVICE WORD SNA /SKIP IF PRESENT JMP INERR /JUMP IF NOT AND [17] /JUST DEVICE BITS DCA IDNUMBER /SAVE INPUT DEVICE NUMBER TAD I (INFILE+5) /GET SECOND INPUT FILE DEVICE WORD SZA CLA /SKIP IF ONLY ONE INPUT FILE JMP INERR /ELSE COMPLAIN JMS I (MIFNAME) /MOVE INPUT FILENAME WITH ADJUSTED EXTENSION TAD I [OUTFILE+1] /GET FIRST OUTPUT FILENAME WORD SNA CLA /SKIP IF NAME PRESENT JMP NONAME /JUMP IF DEVICE ONLY JMS I (MOFNAME) /MOVE OUTPUT FILENAME CDF PRGFLD /BACK TO OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE RESET /RESET SYSTEM TABLES TAD (OHNDBUFFER+1) /GET BUFFER POINTER+TWO-PAGE BIT DCA OHPTR /STORE IN-LINE TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE FETCH /FETCH HANDLER OHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT JMP FERROR /FETCH ERROR TAD OHPTR /GET RETURNED ADDRESS DCA OUTPUT /STORE AS OUTPUT HANDLER ADDRESS TAD (IHNDBUFFER+1) /GET INPUT BUFFER POINTER+TWO-PAGE BIT DCA IHPTR /STORE IN-LINE TAD IDNUMBER /GET INPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE FETCH /FETCH HANDLER IHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT JMP FERROR /FETCH ERROR TAD IHPTR /GET RETURNED ADDRESS DCA INPUT /STORE AS INPUT HANDLER ADDRESS JMS I (GEIFILE) /GO LOOKUP INPUT FILE TAD (FNAME) /POINT TO DCA ENTAR1 /STORED FILENAME DCA ENTAR2 /CLEAR SECOND ARGUMENT TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE ENTER /ENTER TENTATIVE FILENAME ENTAR1, .-. /WILL POINT TO FILENAME ENTAR2, .-. /WILL BE ZERO JMP ENTERR /ENTER ERROR TAD ENTAR1 /GET RETURNED FIRST RECORD DCA OUTRECORD /STORE IT TAD ENTAR2 /GET RETURNED EMPTY LENGTH IAC /ADD 2-1 FOR OS/278 CRAZINESS DCA DANGCNT /STORE AS DANGER COUNT JMS I (ENCODIT) /GO DO THE ACTUAL ENCODING JMP PROCERR /ERROR WHILE ENCODING TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE CLOSE /CLOSE OUTPUT FILE FNAME /POINTER TO FILENAME OUTCNT, .-. /WILL BE ACTUAL COUNT JMP CLSERR /CLOSE ERROR EXITZAP,JMP START /**** <ESC> TERMINATION **** 0000 JMP I (SBOOT) /EXIT TO MONITOR / OUTPUT FILE ERROR WHILE PROCESSING. ENCERRO,TAD [3] /SET INCREMENT SKP /DON'T USE NEXT / ERROR WHILE PROCESSING INPUT FILE. PROCERR,NL0002 /SET INCREMENT SKP /DON'T USE NEXT / ERROR WHILE CLOSING THE OUTPUT FILE. CLSERR, NL0001 /SET INCREMENT SKP /DON'T CLEAR IT / OUTPUT FILE TOO LARGE ERROR. SIZERR, CLA /CLEAN UP TAD [3] /SET INCREMENT SKP /DON'T USE NEXT / ENTER ERROR. ENTERR, NL0002 /SET INCREMENT SKP /DON'T USE NEXT / HANDLER FETCH ERROR. FERROR, NL0001 /SET INCREMENT / NO OUTPUT FILENAME ERROR. NONAME, IAC /SET INCREMENT / ILLEGAL OUTPUT FILE NAME ERROR. BADNAME,IAC /SET INCREMENT / INPUT FILESPEC ERROR. INERR, IAC /SET INCREMENT / OUTPUT FILESPEC ERROR. OUTERR, DCA ERRNUMBER /STORE ERROR NUMBER CDF PRGFLD /ENSURE OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE USERROR /USER ERROR ERRNUMB,.-. /WILL BE PASSED ERROR NUMBER / COMES HERE TO TEST FOR NULL LINE. TSTMORE,TAD I (INFILE) /GET FIRST INPUT FILE DEVICE WORD SZA CLA /SKIP NO INPUT OR OUTPUT GIVEN JMP OUTERR /ELSE COMPLAIN CDF PRGFLD /BACK TO OUR FIELD JMP EXITZAP /MIGHT BE LAST TIME, SO GO THERE FIRST PAGE ENCODIT,.-. /ENCODING ROUTINE NL7777 /SETUP INITIALIZE VALUE JMS I [DOBYTE] /INITIALIZE OUTPUT ROUTINE JMS I (PIFNAME) /OUTPUT THE INPUT FILENAME JMS I (PCRLF) /OUTPUT <CR>/<LF> AND CLEAR COLUMN COUNTER DCA CMPCNT /CLEAR COMPRESSION TAD [CHARS] /SETUP THE DCA CHARPTR /OUTPUT POINTER NL7777 /MAKE IT INITIALIZE LOOP, JMS I (GETBYTE) /GET LATEST BYTE JMP ENDCHECK /AREN'T ANY MORE, FINISH THE FILE / TEST IF ALREADY WITHIN A DEVELOPING COMPRESSION FIELD. TAD CMPCNT /GET COMPRESSION COUNT SNA CLA /SKIP IF COMPRESSION IN PROGRESS JMP NOCOMP /JUMP IF NOT / CHECK IF LATEST INPUT BYTE IS ZERO. TAD CHAR /GET LATEST SZA CLA /SKIP IF SO JMP ENDCOMPRESS /JUMP IF NOT SETCOMP,ISZ CMPCNT /BUMP COMPRESSION COUNT TAD CMPCNT /GET LATEST COUNT TAD (-116) /COMPARE TO MAXIMUM ALLOWED SNA CLA /SKIP IF NOT JMS I (COMPRESSOUT) /OUTPUT MAXIMUM COMPRESSION AND CANCEL COMPRESSION JMP LOOP /GO GET ANOTHER ONE / IF LATEST IS NON-ZERO, THEN COMPLETE EXISTING COMPRESSION FIELD. ENDCOMP,NL7777 /-1 TAD CMPCNT /COMPARE TO COMPRESSION COUNT SZA CLA /SKIP IF TRIVIAL CASE JMP OUTCOMPRESS /JUMP IF NOT / CANCEL TRIVIAL CASE OF ONE BYTE COMPRESSION. DCA CMPCNT /CLEAR COMPRESSION MODE DCA CHARS /FIRST BYTE WAS ZERO TAD (CHARS+1) /SETUP OUTPUT POINTER TO DCA CHARPTR /STORE INTO SECOND BYTE JMP BYTEINSERT /CONTINUE THERE / OUTPUT LATEST COMPRESSION AND PROCESS NEW NON-ZERO BYTE. OUTCOMP,JMS I (COMPRESSOUT) /OUTPUT COMPRESSION FIELD AND CANCEL COMPRESSION / COMES HERE IF NOT WITHIN A COMPRESSION REGION. NOCOMP, TAD CHARPTR /GET POINTER TAD (-CHARS) /CHECK IF AT BEGINNING SZA CLA /SKIP IF BUFFER EMPTY JMP BYTEINSERT /JUMP IF NOT / IF AT BEGINNING OF THREE BYTES, TEST IF LATEST STARTS A COMPRESSION FIELD. TAD CHAR /GET LATEST BYTE SNA CLA /SKIP IF NOT ZERO JMP SETCOMPRESSION /JUMP IF SO BYTEINS,TAD CHAR /GET LATEST BYTE DCA I CHARPTR /STORE IT ISZ CHARPTR /BUMP TO NEXT TAD CHARPTR /GET THE UPDATED POINTER TAD (-CHARS-2-1) /COMPARE TO UPPER LIMIT SNA CLA /SKIP IF LESS THAN THREE PRESENT JMS I (OUT3) /ELSE OUTPUT THE THREE BYTES AND RESET THE BUFFER JMP LOOP /GO GET ANOTHER ONE / COMES HERE AT END OF INPUT. ENDCHEC,NL7776 /-2 TAD CMPCNT /COMPARE TO COMPRESSION COUNT SMA /SKIP IF AT TRIVIAL CASE OR NO COMPRESSION CURRENTLY JMP ENDFCOMPRESS /FINISH WITH A COMPRESSION FIELD IAC /CHECK FURTHER SZA CLA /SKIP IF TRIVIAL COMPRESSION AT END JMP NORMEND /JUMP IF NOT WITHIN COMPRESSION / THE TRIVIAL CASE CONVERTS TO AN INCOMPLETE OUTPUT, COMPLETE WITH CORRECTION / BYTES TO INDICATE THE SHORT FIELD. DCA CHARS /MOVE ZERO BYTE TO FIRST POSITION NORM1, DCA CHARS+1 /CLEAR SECOND POSITION DCA CHARS+2 /CLEAR THIRD POSITION JMS I (OUT3) /OUTPUT THE THREE BYTES DCA CMPCNT /CLEAR COMPRESSION COUNT JMS I (COMPRESSOUT) /OUTPUT NULL COMPRESSION FIELD TO CANCEL THIRD BYTE /NEXT WILL CANCEL SECOND BYTE / COMES HERE IF FILE ENDS ON A COMPRESSION FIELD. ENDFCOM,JMS I (COMPRESSOUT) /OUTPUT COMPRESSION FIELD AND CANCEL COMPRESSION JMP CLOSFILE /FINISH IT THERE / COMES HERE IF FILE ENDS IN SOME FORM OF DATA FIELD. NORMEND,TAD CHARPTR /GET CHARACTER POINTER TAD (-CHARS-2) /COMPARE TO TWO PRESENT VALUE SNA /SKIP IF NOT THE CASE JMP NORM2 /JUMP IF SO IAC /BUMP TO ONE PRESENT VALUE SNA CLA /SKIP IF NOT THE CASE JMP NORM1 /JUMP IF SO CLOSFIL,TAD COLUMN /GET CURRENT COLUMN COUNTER SZA CLA /SKIP IF AT BEGINNING ALREADY JMS I (PCRLF) /ELSE OUTPUT <CR>/<LF> NOW TAD ("Z&37) /GET <^Z> CLOSLUP,JMS I [DOBYTE] /OUTPUT A BYTE (^Z OR NULL) TAD BUFPTR /GET THE OUTPUT BUFFER POINTER TAD (-OUTBUFFER) /COMPARE TO RESET VALUE SZA CLA /SKIP IF IT MATCHES JMP CLOSLUP /ELSE KEEP GOING ISZ ENCODIT /NO ERRORS JMP I ENCODIT /RETURN / COMES HERE IF FILE ENDS WITH ONLY TWO DATA CHARACTERS. NORM2, DCA CHARS+2 /CLEAR THIRD CHARACTER JMS I (OUT3) /OUTPUT THE THREE BYTES JMP ENDFCOMPRESS /FINISH IT THERE PAGE / GET AN INPUT BYTE ROUTINE. GETBYTE,.-. /GET A BYTE ROUTINE SNA CLA /INITIALIZING? JMP I PUTC /NO, GO GET NEXT BYTE TAD INRECORD /GET INPUT FILE STARTING RECORD DCA GETRECORD /STORE IN-LINE GETNEWR,JMS I INPUT /CALL INPUT HANDLER 2^100 /READ TWO PAGES PINBUFF,INBUFFER /INTO INPUT BUFFER GETRECO,.-. /WILL BE LATEST INPUT FILE RECORD JMP I (PROCERR) /INPUT READ ERROR, GO COMPLAIN TAD PINBUFFER/(INBUFFER) /SETUP THE DCA INPTR /BUFFER POINTER GETLOOP,DCA THIRD /CLEAR THIRD BYTE NOW JMS PUTONE /OBTAIN AND SEND BACK FIRST BYTE JMS PUTONE /OBTAIN AND SEND BACK SECOND BYTE TAD THIRD /GET THIRD BYTE JMS PUTC /SEND IT BACK TAD INPTR /GET THE POINTER TAD (-2^200-INBUFFER) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP GETLOOP /KEEP GOING ISZ GETRECORD /BUMP TO NEXT RECORD NOP /JUST IN CASE ISZ INLEN /DONE ALL INPUT RECORDS? JMP GETNEWRECORD /NO, KEEP GOING / AT END-OF-FILE, SO JUST TAKE IMMEDIATE RETURN. JMP I GETBYTE /RETURN TO CALLER PUTONE, .-. /SEND BACK A BYTE ROUTINE TAD I INPTR /GET LATEST WORD AND [7400] /JUST THIRD-BYTE NYBBLE CLL RAL /MOVE UP TAD THIRD /GET OLD NYBBLE (IF ANY) RTL;RTL /MOVE UP NYBBLE BITS DCA THIRD /SAVE FOR NEXT TIME TAD I INPTR /GET LATEST WORD AGAIN JMS PUTC /SEND BACK CURRENT BYTE ISZ INPTR /BUMP TO NEXT WORD JMP I PUTONE /RETURN PUTC, .-. /SEND BACK LATEST BYTE ROUTINE AND (377) /KEEP ONLY GOOD BITS DCA CHAR /SAVE AS LATEST BYTE ISZ GETBYTE /BUMP PAST <EOF> RETURN JMP I GETBYTE /RETURN TO MAIN CALLER / COMPRESSION FIELD OUTPUT ROUTINE. COMPRES,.-. /COMPRESSION OUTPUT ROUTINE CLA /CLEAN UP TAD COLUMN /GET CURRENT COLUMN COUNTER TAD (-WIDTH+2) /COMPARE TO UPPER LIMIT SMA SZA CLA /SKIP IF NOT ABOVE LIMIT JMS PCRLF /ELSE DO <CR>/<LF> FIRST TAD (176) /GET TILDE VALUE JMS I [DOBYTE] /OUTPUT IT TAD CMPCNT /GET COMPRESSION COUNT JMS PDIGIT /OUTPUT IT DCA CMPCNT /CLEAR COMPRESSION JMP I COMPRESSOUT /RETURN / DATA FIELD OUTPUT ROUTINE. OUT3, .-. /OUTPUT THREE BYTES ROUTINE TAD COLUMN /GET CURRENT COLUMN COUNTER TAD (-WIDTH+4) /COMPARE TO UPPER LIMIT SMA SZA CLA /SKIP IF NOT ABOVE LIMIT JMS PCRLF /ELSE DO <CR>/<LF> FIRST TAD CHARS /GET FIRST BYTE RTR /WANT HIGH SIX BITS FIRST JMS PDIGIT /OUTPUT THEM TAD CHARS /GET IT AGAIN AND [3] /JUST TWO LOWEST BITS CLL RTR;RTR;RAR /MOVE UP TAD CHARS+1 /GET SECOND BYTE RTR;RTR /MOVE DOWN JMS PDIGIT /OUTPUT THEM TAD CHARS+2 /GET THIRD BYTE AND (300) /JUST TWO HIGHEST BITS NEEDED CLL RTL;RTL;RAL /MOVE INTO POSITION TAD CHARS+1 /GET SECOND BYTE RTL /MOVE UP AND [77] /JUST DESIRED BITS JMS PDIGIT /OUTPUT THEM TAD CHARS+2 /GET THIRD BYTE AND [77] /JUST SIX BITS JMS PDIGIT /OUTPUT THEM TAD [CHARS] /RESET THE DCA CHARPTR /OUTPUT POINTER JMP I OUT3 /RETURN PDIGIT, .-. /PRINT AS A DIGIT INTO FILE ROUTINE AND [177] /REMOVE JUNK BITS TAD ("0&177) /TURN PASSED VALUE INTO A DIGIT JMS I [DOBYTE] /OUTPUT IT JMP I PDIGIT /RETURN PCRLF, .-. /PRINT <CR>/<LF> INTO FILE ROUTINE TAD ("M&37) /GET A <CR> JMS I [DOBYTE] /OUTPUT IT TAD ("J&37) /GET A <LF> JMS I [DOBYTE] /OUTPUT IT DCA COLUMN /CLEAR COLUMN COUNTER JMP I PCRLF /RETURN PAGE PUTBYTE,.-. /OUTPUT A BYTE ROUTINE SPA /ARE WE INITIALIZING? JMP PUTINITIALIZE /YES AND [177] /JUST IN CASE DCA LATEST /SAVE LATEST CHARACTER TAD LATEST /GET LATEST CHARACTER JMP I PUTNEXT /GO WHERE YOU SHOULD GO PUTNEXT,.-. /EXIT ROUTINE ISZ PUTBYTE /BUMP TO GOOD RETURN PUTERRO,CLA CLL /CLEAN UP JMP I PUTBYTE /RETURN TO MAIN CALLER PUTINIT,CLA /CLEAN UP TAD OUTRECORD /GET STARTING RECORD OF TENTATIVE FILE DCA PUTRECORD /STORE IN-LINE DCA I (OUTCNT) /CLEAR ACTUAL FILE LENGTH PUTNEWR,TAD (OUTBUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER PUTLOOP,JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT TAD BUFPTR /GET POINTER VALUE DCA TEMPTR /SAVE FOR LATER ISZ BUFPTR /BUMP TO NEXT JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT JMS PUTNEXT /GET A CHARACTER RTL;RTL /MOVE UP AND [7400] /ISOLATE HIGH NYBBLE TAD I TEMPTR /ADD ON FIRST BYTE DCA I TEMPTR /STORE COMPOSITE TAD LATEST /GET LATEST CHARACTER RTR;RTR;RAR /MOVE UP AND AND [7400] /ISOLATE LOW NYBBLE TAD I BUFPTR /ADD ON SECOND BYTE DCA I BUFPTR /STORE COMPOSITE ISZ BUFPTR /BUMP TO NEXT TAD BUFPTR /GET LATEST POINTER VALUE TAD (-2^200-OUTBUFF)/COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP PUTLOOP /KEEP GOING ISZ DANGCNT /TOO MANY RECORDS? SKP /SKIP IF NOT JMP I (SIZERR) /JUMP IF SO JMS I OUTPUT /CALL I/O HANDLER 2^100+WRITE /WRITE SOME PAGES FROM OUTPUT BUFFER OUTBUFFER /BUFFER ADDRESS PUTRECO,.-. /WILL BE LATEST RECORD NUMBER JMP PUTERROR /OUTPUT ERROR! ISZ I (OUTCNT) /BUMP ACTUAL LENGTH ISZ PUTRECORD /BUMP TO NEXT RECORD JMP PUTNEWRECORD /KEEP GOING / INPUT FILENAME MOVE ROUTINE; USES DEFAULT EXTENSION IF NONE PROVIDED BY USER. MIFNAME,.-. /MOVE INPUT FILENAME ROUTINE TAD I (INFILE+1) /GET FIRST INPUT FILENAME WORD DCA IFNAME /STASH IT TAD I (INFILE+2) /GET SECOND INPUT FILENAME WORD DCA IFNAME+1 /STASH IT TAD I (INFILE+3) /GET THIRD INPUT FILENAME WORD DCA IFNAME+2 /STASH IT TAD I [INFILE+4] /GET FOURTH INPUT FILENAME WORD SNA /SKIP IF SOMETHING THERE TAD ("S^100+"V-300) /ELSE USE DEFAULT EXTENSION VALUE DCA IFNAME+3 /STASH IT EITHER WAY JMP I MIFNAME /RETURN DOBYTE, .-. /OUTPUT A BYTE ROUTINE JMS PUTBYTE /OUTPUT PASSED VALUE JMP I (ENCERROR) /COULDN'T DO IT ISZ COLUMN /BUMP COLUMN COUNTER JMP I DOBYTE /RETURN PAGE / INPUT FILE ROUTINE. GEIFILE,.-. /GET INPUT FILE ROUTINE JMS LUKUP /TRY TO LOOKUP THE FILE SKP /SKIP IF IT WORKED JMP TRYNULL /TRY NULL EXTENSION VERSION NULLOK, TAD LARG1 /GET FIRST INPUT RECORD DCA INRECORD /STASH IT TAD LARG2 /GET NEGATED LENGTH DCA INLEN /STASH IT JMP I GEIFILE /RETURN / COMES HERE IF LOOKUP FAILED. TRYNULL,CDF TBLFLD /GOTO TABLE FIELD TAD I [INFILE+4] /GET ORIGINAL FILENAME'S EXTENSION CDF PRGFLD /BACK TO OUR FIELD SZA CLA /SKIP IF IT WAS NULL ORIGINALLY JMP I (INERR) /ELSE COMPLAIN OF EXPLICIT LOOKUP FAILURE DCA IFNAME+3 /NOW TRY NULL VERSION INSTEAD OF DEFAULT VERSION JMS LUKUP /TRY TO LOOK IT UP AGAIN JMP NULLOK /THAT WORKED! JMP I (INERR) /COMPLAIN OF LOOKUP FAILURE LUKUP, .-. /LOW-LEVEL LOOKUP ROUTINE TAD (IFNAME) /GET OUR FILENAME POINTER DCA LARG1 /STORE IN-LINE DCA LARG2 /CLEAR SECOND ARGUMENT TAD IDNUMBER /GET INPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE LOOKUP /WANT LOOKUP FUNCTION LARG1, .-. /WILL BE POINTER TO OUR FILENAME LARG2, .-. /WILL RETURN FILE LENGTH (HOPEFULLY) ISZ LUKUP /LOOKUP FAILED, SO BUMP RETURN ADDRESS JMP I LUKUP /RETURN EITHER WAY / INPUT FILENAME PRINT ROUTINE. PIFNAME,.-. /PRINT INPUT FILENAME ROUTINE TAD IFNAME /GET FIRST PAIR JMS PIF2 /PRINT IT TAD IFNAME+1 /GET SECOND PAIR JMS PIF2 /PRINT IT TAD IFNAME+2 /GET THIRD PAIR JMS PIF2 /PRINT IT TAD (".&177) /GET SEPARATOR JMS PIFOUT /PRINT IT TAD IFNAME+3 /GET FOURTH PAIR JMS PIF2 /PRINT IT JMP I PIFNAME /RETURN PIF2, .-. /PRINT A PAIR ROUTINE DCA PIFTEMP /SAVE PASSED PAIR TAD PIFTEMP /GET IT BACK RTR;RTR;RTR /MOVE DOWN JMS PIFOUT /PRINT HIGH-ORDER FIRST TAD PIFTEMP /GET IT AGAIN JMS PIFOUT /PRINT LOW-ORDER JMP I PIF2 /RETURN PIFOUT, .-. /FILENAME CHARACTER OUTPUT ROUTINE AND [77] /JUST SIXBIT SNA /SKIP IF SOMETHING THERE JMP I PIFOUT /ELSE IGNORE IT TAD [40] /INVERT IT AND [77] /REMOVE EXCESS TAD [40] /INVERT IT AGAIN JMS I [DOBYTE] /OUTPUT IT JMP I PIFOUT /RETURN MOFNAME,.-. /MOVE OUTPUT FILENAME ROUTINE TAD I [OUTFILE+1] /GET FIRST OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME /STASH IT TAD I (OUTFILE+2) /GET SECOND OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME+1 /STASH IT TAD I (OUTFILE+3) /GET THIRD OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME+2 /STASH IT TAD I (OUTFILE+4) /GET FOURTH OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME+3 /STASH IT JMP I MOFNAME /RETURN / OUTPUT NAME CHECK ROUTINE. CHKNAME,.-. /OUTPUT NAME CHECK ROUTINE DCA LUKUP /SAVE PASSED VALUE TAD LUKUP /GET IT BACK RTR;RTR;RTR /MOVE DOWN JMS CHKIT /CHECK HIGH-ORDER AND GET IT BACK JMS CHKIT /CHECK LOW-ORDER AND GET IT BACK JMP I CHKNAME /RETURN CHKIT, .-. /ONE CHARACTER CHECK ROUTINE AND [77] /JUST SIX BITS TAD (-"?!200) /COMPARE TO "?" SZA /SKIP IF ALREADY BAD TAD (-"*+"?) /ELSE COMPARE TO "*" SNA CLA /SKIP IF NEITHER BAD CASE JMP I (BADNAME) /COMPLAIN OF WILD CHARACTER TAD LUKUP /GET THE PAIR BACK FOR NEXT TIME JMP I CHKIT /RETURN PAGE $ /THAT'S ALL FOLK! |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 | From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: ENCODE/DECODE format description The latest KERMIT-12 binary files are encoded in a specialized format. This document will describe the internal encoding and related subjects. OS/8 file considerations. All OS/8 files are contiguous multiples of PDP-8 double-page sized logical records. These are sometimes known as blocks, but are more accurately known as records. (The term block is associated with various hardware descriptions, and means different things to different people, such as DECtape blocks or RK05 blocks, where the first means a physical block which just happens to be 1/2 the size of the OS/8 logical record, and the second means a physical sector which is the same size as the OS/8 logical record, but only if the drive is attached to an RK8E. We will therefore avoid this term!) Since PDP-8 pages are 128 12-bit words each, the OS/8 record consists of 256 12-bit words, which can also be viewed as 384 8-bit bytes. For the benefit of various existing utilities, there is a standard method of unpacking the 8-bit bytes yielding a stream of coherent 8-bit bytes. The PDP-8 convention is to number bits from left to right starting with bit[0]. This is INCOMPATIBLE with the notation commonly used in other architectures, which is usually given as what power of 2 the bit represents. The PDP-8 notation is used to denote bit position in a manner consistent with significence of the bit, and arbitrarily uses origin 0, which is the usually assembly-language orientation. Using this notation, the first byte (byte #0) to be unpacked is taken from word[0] bits[4-11]. The second byte (byte #1) to be unpacked is taken from word[1] bits[4-11]. The third byte (byte #2) to be unpacked is taken from word[0] bits[0-3] concatenated with word[1] bits[0-3]. All bits are taken left to right as stated. This method is usually referred to as "3 for 2," and repeated accordingly will yield the correct stream of bytes for ASCII OS/8 files. OS/8 absolute binary files are images of 8-bit paper-tape frames packed in the same format. Although the high-order bit "matters" in absolute binary files, the high-bit is untrustworthy in ASCII files. Both types of files end with a ^Z character which will have the high-order bit set in the case of the absolute binary files. The reason it succeeds in the binary case is that the paper-tape format treats the high-bit present as leader or trailer, not loadable data, etc., so the loader ignores all leading high-bit set bytes, and finishes on the first trailing high-bit set byte. The binary file contains several leader bytes of 0200 octal, and several trailer bytes of 0200 followed by 232, the code for ^Z. There is no "fool-proof" way to derive these formats, rather these are usually given by the extensions .BN for binary, and various extensions (.LS, .PA, .MA, .DI, .BI, .TX, .DC, etc.) for ASCII files. If the file is "known" to be either ASCII or absolute binary, then these conventions can be used to ignore extraneous trailing bytes. If the file type is unknown, then it must be treated as an "image" file, where all data must be preserved. The most typical image file is a .SV file, which is an image of files organized as pages and double-pages, with some trivial absolute loading instructions in a "header" block. Each record of the file is always "paired" off, i.e., the record has an implied double-page boundary of main memory it is meant to load into. If the loading instructions indicate a single-page load, then the first page must be loaded; the second half of the record is IGNORED. Notice it is impossible to specify singular loading of the "odd" page. OS/8 also supports various other formats, so it is difficult to obtain useful knowledge of the "inner" format of the file. Encoding considerations. If the 8-bit bytes of an OS/8 file are unpacked and packed faithfully, the resultant file will be an accurate copy of the original data. This is the basis for an alternate encoding format, perhaps more universal in scope, but it is NOT the method used currently. The method chosen here is to treat the entire file as a contiguous stream of 5-bit bytes spanning words as necessary. This means that bits are taken from left to right, five at a time, and each encoded into a "printable" character for inclusion into the encoded file. This means that data will form 60-bit groups of 12 5-bit characters representing five 12-bit words. The 5-bit encoding is accomplished using the ASCII coding for an extension to hexadecimal, which can be called bi-hexadecimal, or base 32 notation. In this base, the values are 0-9, and A-V (just the "natural" extension of hexadecimal's 0-9, A-F). The alphabetic characters can be upper or lower case as necessary. This method is theoretically 25% more efficient than hexadecimal ASCII since each character holds 5-bit data rather than 4-bit data. Since the 5-bit data has no "good" boundary for most computers, we will use the "best" case for PDP-8 image data, the 60-bit group as described above. Once started, a 60-bit group must be completed, thus there are boundaries throughout the file every 12 characters. At any boundary, the file may have compressed data. Compressed fields are indicated by X (or x) followed by a four character field. The format is basically a truncation of the "normal" 60-bit group, but only contains 20 bits of data. The first 12 bits are the value of the data to be repeated. The last eight bits are the repeat count. Values of the repeat count range from 1-256, where 256 is implied if the value is zero. Practical values range from 3-255, since one or two values would take less file space uncompressed. Due to the boundary requirements, compression fields are independent of the data preceeding them. The repeat count limitation to a maximum of 256 was felt to be a reasonable compromise between compressed field length and adequate repeat count. Making the repeat count even only double the current maximum would require six character compression fields instead of five (including the X). As an implementation restriction, the encoding program only reads one OS/8 record at a time, thus the case of 256 maximum repetitions occurs only at a double-page boundary. The added complexity required to achieve infrequent and minimal improvement was considered to be unimportant, but could be added later. Thus adjacent repeated values split across boundaries, or split across logical records will not contribute to a (single) compression field. Note that compression is achieved by locating repeating strings of 12-bit values; if the file were viewed as repeating strings of 8-bit bytes, then compression would be less likely, except for cases like 0000 octal, which due to "symmetry" are compressible via either method. Many PDP-8 image files contain "filler" words, i.e., otherwise unloaded areas which are "pre-filled" with constant data such as 0000 octal, or 7402 octal, which is the PDP-8 HLT instruction. Image files filled with "large" regions of repeating strings of 7402 will not compress using 8-bit byte orientation. Reliability considerations. Even with the safeguards of a "robust" character set, file validity must be tested to maintain data integrity. Towards this end, the encoding format has several additional features. Unlike other "popular" formats, there is an explicit "command" structure to the encoded file format. All lines of data start with < and end with >. This prevents the characters from being "massaged" into unwanted alternates. Various systems are known to "destroy" files which have lines starting with "from", etc. By enclosing the data lines, we prevent these problems. Additionally, a class of explicit commands exist which start with ( and end with ). Instead of implied positioning, there is a command called (FILE filename.ext), where the filename.ext is the "suggested" name for the decoded file. The encoding program uses the original un-encoded file's file name in this field. After the data, there is another command (END filename.ext) which can be used to validate the data, since the same file name should be in both commands (as implemented in the encoding program). Several (REMARK {anything}) commands are inserted into the file at various points to assist in reconstructing the original file, or in documenting the fact that the file is an encoded "version" of another file. Several "frill" REMARK commands are implemented to indicate the original file date, and the date of encoded file creation. Today's date is always used for the encoded file creation date. The original file date may be omitted, if the system doesn't support Additional Information Words (AIWs), since this optional feature must be present in order for the files to have creation dates. The overall encoding format theoretically can be a concatenated series of encoded files, each with its own (FILE ) and (END ) commands, but the decoding program only supports single-file decoding as an implementation restriction. The file must always end with a good boundary condition. If the last field is an X (compression) field, then this is already satisfied. If the last field is ordinary data, then 1-4 12-bit words of 0000 octal will be added at the end of the last field if necessary to ensure a good boundary. The end of file is signified by a single Z (or z) character. At this point, an extraneous record may be in progress. If it consists of four or less 12-bit words of 0000 octal, it is discarded. Any other situation regarding a partial record indicates defective data in the received encoded file. After the single Z (z) character, there are 12 more characters: an entire 60-bit group. This is the file checksum. It is accomplished with pentuple-precision arithmetic. It is the sum of all 12-bit data values with carry into a total of five 12-bit words. Repeat compression data values are also added, but only once for each compression field. The compression field's repeat count is also added, but it is first multiplied by 16. (The repeat count was expressed originally as *16 so it would have its eight significant bits left-justified). The entire 60-bit quantity is expressed in two's complement notation by negating it and encoding the group as any other 60-bit group. Since most files are relatively short, the high-order bits are generally zero, so most two's complement checksums start with 7777,7777 octal. The five 12-bit quantities holding the checksum are encoded low-order first, so the right-most characters in the checksum field tend to be V (v). This order is used merely to accomodate multi-precision arithmetic, as anyone attempting to observe "backwards bytes" on other machines is familiar with. Future considerations. This format is by no means "perfect," but it is more robust than most, with a minimum of efficiency loss, given the tradeoffs involved. The data bracketing characters can be changed if required. The characters W (w) and Y (y) are available for this purpose. Files could incorporate a word or character count, or other validation technique, etc. Each line could incorporate a local count. These and other considerations could create a "compromise" format that could be more generic and "pallatable" to other systems. The checksum could be limited to 48 bits, which is more amenable to 8 and 16 bit architectures. Perhaps opening parameters could govern the contents of the rest of the file, such as whether the checksum was present, etc. [end of file] |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 | / OS/8 ENCODING PROGRAM / LAST EDIT: 08-JUL-1992 22:00:00 CJL / MUST BE ASSEMBLED WITH '/F' SWITCH SET. / PROGRAM TO ENCODE OS/8 FILES INTO "PRINTABLE" ASCII FORMAT ("ENCODE"). / DISTRIBUTED BY CUCCA AS "K12ENC.PAL" AS PART OF THE CUCCA KERMIT-12 PACKAGE. / WRITTEN BY: / CHARLES LASNER (CJL) / CLA SYSTEMS / 72-55 METROPOLITAN AVENUE / MIDDLE VILLAGE, NEW YORK 11379-2107 / (718) 894-6499 / USAGE: / .RUN DEV ENCODE INVOKE PROGRAM / *OUTPUT<INPUT PASS ONE INPUT AND ONE OUTPUT FILE ONLY (WITH <CR>) / *OUTPUT<DEV:=NNNN/I **** SPECIAL IMAGE TRANSFER MODE **** INPUT IS RECORD / 0000-[NNNN-1] ON DEVICE DEV:. THE =NNNN VALUE MUST BE / STATED PRECISELY TO TRANSFER THE REQUISITE AMOUNT OF / THE DEVICE AS REQUIRED. THE VALUE IS GENERALLY THE / TOTAL LENGTH OF THE DEVICE, BUT COULD BE LESS AS / NECESSARY; LARGER VALUES WILL GENERALLY FAIL. THIS / MODE SHOULD ONLY BE USED TO EFFECT TRANSFER OF / COMPLETE DEVICE IMAGES WHERE THE NORMAL OS/8 FILE / STRUCTURE IS UNSUITABLE. IN THIS MODE, THE OS/8 FILE / (POSSIBLY PRESENT) ON THE DEVICE IS IGNORED. **** / NOTE **** THIS METHOD VIOLATES ALL OS/8 DEVICE / STRUCTURE AND IS MEANT FOR TRANSFER OF COMPLETE DEVICE / IMAGES ONLY; USE WITH CARE! / *OUTPUT<DEV:=NNNN/I/1 **** SPECIAL IMAGE TRANSFER MODE **** SAME AS REGULAR / IMAGE MODE EXCEPT ONLY THE FIRST HALF OF THE DATA IS / USED. THE DECODER MUST BE GIVEN THE EQUIVALENT / PARAMETERS TO TRANSFER THE FIRST HALF. / *OUTPUT<DEV:=NNNN/I/2 **** SPECIAL IMAGE TRANSFER MODE **** SAME AS REGULAR / IMAGE MODE EXCEPT ONLY THE SECOND HALF OF THE DATA IS / USED. NOTE THAT THERE MUST BE TWO FILES CREATED, ONE / USING /I/1 AND THE OTHER USING /I/2 TO COMPLETELY / TRANSFER A DEVICE IMAGE UNLESS /I IS USED ALONE! / *OUTPUT<INPUT$ PASS ONE INPUT AND ONE OUTPUT FILE ONLY (WITH <ESC>) / . PROGRAM EXITS NORMALLY / INPUT FILE ASSUMES .SV EXTENSION; THERE IS NO ASSUMED OUTPUT EXTENSION. IF / IMAGE MODE IS USED, THERE IS NO INPUT FILE SPECIFICATION; ONLY A DEVICE IS / GIVEN ALONG WITH A LENGTH AND THE MANDATORY /I SWITCH. / PROGRAM EXIT IS THE NORMAL OS/8 METHOD OF EITHER PRESSING <^C> ON THE CONSOLE / KEYBOARD DURING THE COMMAND, OR ENDING THE COMMAND INPUT LINE WITH AN <ESC> / CHARACTER. / THIS PROGRAM SUPPORTS A SUBSET OF THE ASCII FILE ENCODING SCHEME DEVELOPED BY / CHARLES LASNER AND FRANK DA CRUZ. THE SCHEME USED IS FIVE-BIT ENCODING WITH / COMPRESSION, (AS OPPOSED TO SIX-BIT WITHOUT COMPRESSION AS USED IN PRIOR / VERSIONS). / RESTRICTIONS: / A) NO SUPPORT FOR MULTIPLE DECODABLE FILES PER ENCODED FILE. / B) CREATES ENCODED PDP-8 60-BIT CHECKSUM AT END OF FILE. / C) CUSTOMIZED (REMARK) COMMANDS MUST BE SEPARATELY ADDED BY THE USER. / D) THE FILENAME IN THE (FILE ) AND (END ) COMMANDS WILL BE IDENTICAL TO / THE ACTUAL INVOKED INPUT FILE. THE USER MUST SEPARATELY MODIFY THESE / COMMANDS WHEN EXPORTING THE ENCODED FILE TO A SYSTEM WITH DIFFERENT / NAMING CONVENTIONS. / ERROR MESSAGES. / ERROR MESSAGES ARE ONE OF TWO VARIETIES: COMMAND DECODER MESSAGES AND USER / (PROGRAM-SIGNALLED) MESSAGES. / COMMAND DECODER MESSAGES ARE NON-FATAL AND MERELY REQUIRE RETYPING THE / COMMAND. ATTEMPTING TO USE MORE THAN ONE OUTPUT FILE WILL YIELD THE COMMAND / DECODER MESSAGE "TOO MANY FILES" AND CAUSE A REPEAT OF THE COMMAND DECODER / PROMPT REQUIRING USER INPUT. THE USER IS DIRECTED TO OTHER DOCUMENTATION OF / THE "SPECIAL" MODE OF THE COMMAND DECODER, AS THAT IS THE ONLY MODE USED BY / THIS UTILITY PROGRAM. / ANY USER MESSAGE PRINTED IS A FATAL ERROR MESSAGE CAUSED BY A PROBLEM BEYOND / THE SCOPE OF THE COMMAND DECODER. ALL USER MESSAGES ARE THE STANDARD OS/8 / "USER" ERROR MESSAGES OF THE FORM: "USER ERROR X AT AAAAA", WHERE X IS THE / ERROR NUMBER AND AAAAA IS THE PROGRAM ADDRESS WHERE THE ERROR WAS DETECTED. / THE FOLLOWING USER ERRORS ARE DEFINED: / ERROR NUMBER PROBABLE CAUSE / 0 NO OUTPUT FILE. / 1 INPUT FILE ERROR (CAN'T FIND INPUT FILE) OR NO INPUT / FILE SPECIFIED OR TOO MANY INPUT FILES SPECIFIED. / 2 ILLEGAL OUTPUT FILE NAME (WILD CARDS NOT ALLOWED). / 3 NO OUTPUT FILE NAME (DEVICE ONLY IS NOT ALLOWED). / 4 ERROR WHILE FETCHING FILE HANDLER. / 5 ERROR WHILE ATTEMPTING TO ENTER OUTPUT FILE. / 6 OUTPUT FILE LARGER THAN AVAILABLE FILE SPACE. / 7 ERROR WHILE CLOSING THE OUTPUT FILE. / 8 I/O ERROR WHILE ENCODING FILE DATA. / ASSEMBLY INSTRUCTIONS. / IT IS ASSUMED THE SOURCE FILE K12ENC.PAL HAS BEEN MOVED AND RENAMED TO / DSK:ENCODE.PA. / .PAL ENCODE<ENCODE/E/F ASSEMBLE SOURCE PROGRAM / .LOAD ENCODE LOAD THE BINARY FILE / .SAVE DEV ENCODE=2001 SAVE THE CORE-IMAGE FILE / DEFINITIONS. AIWCNT= 1404 /ADDITIONAL INFORMATION WORDS COUNT HERE AIWXR= 0017 /POINTER TO ADDITIONAL INFORMATION WORDS CLOSE= 4 /CLOSE OUTPUT FILE DATEXT= 7777 /DATE EXTENSION HERE DATWRD= 7666 /OS/8 DATE WORD DECODE= 5 /CALL COMMAND DECODER ENTER= 3 /ENTER TENTATIVE FILE EQUWRD= 7646 /EQUALS PARAMETER HERE IN TABLE FIELD FETCH= 1 /FETCH HANDLER IHNDBUF=7200 /INPUT HANDLER BUFFER INBUFFE=6200 /INPUT BUFFER INFILE= 7605 /INPUT FILE INFORMATION HERE LOOKUP= 2 /LOOKUP INPUT FILE NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 OHNDBUF=6600 /OUTPUT HANDLER BUFFER OUTBUFF=5600 /OUTPUT BUFFER OUTFILE=7600 /OUTPUT FILE INFORMATION HERE PRGFLD= 00 /PROGRAM FIELD RESET= 13 /RESET SYSTEM TABLES REVISIO=1 /PROGRAM REVISION SBOOT= 7600 /MONITOR EXIT SWAL= 7643 /A-/L SWITCHES HERE IN TABLE FIELD SWY9= 7645 /Y-/9 SWITCHES HERE IN TABLE FIELD TBLFLD= 10 /COMMAND DECODER TABLE FIELD TERMWRD=7642 /TERMINATOR WORD USERROR=7 /USER SIGNALLED ERROR USR= 0200 /USR ENTRY POINT USRENT= 7700 /USR ENTRY POINT WHEN NON-RESIDENT USRFLD= 10 /USR FIELD USRIN= 10 /LOCK USR IN CORE VERSION=2 /PROGRAM VERSION WIDTH= 107-2 /69 DATA CHARACTERS PER LINE (TOTAL 71) WRITE= 4000 /I/O WRITE BIT *0 /START AT THE BEGINNING *10 /DEFINE AUTO-INDEX AREA XR1, .-. /AUTO-INDEX NUMBER 1 XR2, .-. /AUTO-INDEX NUMBER 2 *20 /GET PAST AUTO-INDEX AREA BUFPTR, .-. /OUTPUT BUFFER POINTER CCNT, .-. /CHECKSUM COUNTER CHKFLG, .-. /CHECKSUMMING ALLOWED FLAG CHKSUM, ZBLOCK 5 /CHECKSUM CMPCNT, .-. /MATCH COUNT FOR COMPRESSION DANGCNT,.-. /DANGER COUNT FDATE, .-. /FILE DATE FILLVAL,.-. /FILL VALUE FOR SPECIAL OUTPUT CHARACTERS IDNUMBE,.-. /INPUT DEVICE NUMBER IFNAME, ZBLOCK 4 /INPUT FILENAME IMSW, .-. /IMAGE-MODE SWITCH INLEN, .-. /INPUT FILE LENGTH INPTR, .-. /INPUT BUFFER POINTER INPUT, .-. /INPUT HANDLER POINTER INRECOR,.-. /INPUT RECORD FNAME, ZBLOCK 4 /OUTPUT FILENAME LATEST, .-. /LATEST OUTPUT CHARACTER OBOUND, .-. /OUTPUT BOUNDARY COUNTER OCTCNT, .-. /OCTAL OUTPUT ROUTINE COUNTER OCTEMP, .-. /OCTAL OUTPUT ROUTINE TEMPORARY ODNUMBE,.-. /OUTPUT DEVICE NUMBER OUTPUT, .-. /OUTPUT HANDLER POINTER OUTRECO,.-. /OUTPUT RECORD PRTEMP, .-. /DATE OUTPUT TEMPORARY PUTEMP, .-. /OUTPUT TEMPORARY PUTLATE,.-. /LATEST 5-BIT CHARACTER PUTPREV,.-. /PREVIOUS OUTPUT TEMPORARY QUO, .-. /DIVIDE QUOTIENT REM, .-. /DIVIDE REMAINDER SCRCASE,.-. /CURRENT MESSAGE CASE SCRCHAR,.-. /LATEST MESSAGE CHARACTER SCRPTR, .-. /MESSAGE POINTER TDATE, .-. /TODAY'S DATE TEMP, .-. /TEMPORARY TEMPTR, .-. /TEMPORARY OUTPUT POINTER WIDCNT, .-. /LINE WIDTH COUNTER PAGE /START AT THE USUAL PLACE BEGIN, NOP /IN CASE WE'RE CHAINED TO CLA /CLEAN UP START, CIF USRFLD /GOTO USR FIELD JMS I (USRENTRY) /CALL USR ROUTINE USRIN /GET IT LOCKED IN CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE DECODE /WANT COMMAND DECODER "*^100 /USING SPECIAL MODE CDF TBLFLD /GOTO TABLE FIELD TAD I (TERMWRD) /GET TERMINATOR WORD SPA CLA /SKIP IF <CR> TERMINATED THE LINE DCA EXITZAP /ELSE CAUSE EXIT LATER DCA IMSW /CLEAR IMAGE-MODE; MIGHT GET SET LATER THOUGH TAD I (OUTFILE) /GET OUTPUT FILE DEVICE WORD SNA /SKIP IF OUTPUT FILE PRESENT JMP TSTMORE /JUMP IF NOT THERE AND [17] /JUST DEVICE BITS DCA ODNUMBER /SAVE OUTPUT DEVICE NUMBER TAD I (INFILE) /GET FIRST INPUT FILE DEVICE WORD SNA /SKIP IF PRESENT JMP INERR /JUMP IF NOT AND [17] /JUST DEVICE BITS DCA IDNUMBER /SAVE INPUT DEVICE NUMBER TAD I (INFILE+5) /GET SECOND INPUT FILE DEVICE WORD SZA CLA /SKIP IF ONLY ONE INPUT FILE JMP INERR /ELSE COMPLAIN JMS I (MIFNAME) /MOVE INPUT FILENAME WITH ADJUSTED EXTENSION TAD I [OUTFILE+1] /GET FIRST OUTPUT FILENAME WORD SNA CLA /SKIP IF NAME PRESENT JMP NONAMERROR /JUMP IF DEVICE ONLY JMS I (MOFNAME) /MOVE OUTPUT FILENAME CDF PRGFLD /BACK TO OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE RESET /RESET SYSTEM TABLES TAD (OHNDBUFFER+1) /GET BUFFER POINTER+TWO-PAGE BIT DCA OHPTR /STORE IN-LINE TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE FETCH /FETCH HANDLER OHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT JMP FERROR /FETCH ERROR TAD OHPTR /GET RETURNED ADDRESS DCA OUTPUT /STORE AS OUTPUT HANDLER ADDRESS TAD (IHNDBUFFER+1) /GET INPUT BUFFER POINTER+TWO-PAGE BIT DCA IHPTR /STORE IN-LINE TAD IDNUMBER /GET INPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE FETCH /FETCH HANDLER IHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT JMP FERROR /FETCH ERROR TAD IHPTR /GET RETURNED ADDRESS DCA INPUT /STORE AS INPUT HANDLER ADDRESS TAD IMSW /GET IMAGE-MODE SWITCH SNA CLA /SKIP IF IMAGE MODE SET JMS I (GEIFILE) /GO LOOKUP INPUT FILE TAD (FNAME) /POINT TO DCA ENTAR1 /STORED FILENAME DCA ENTAR2 /CLEAR SECOND ARGUMENT JMS I (INDATE) /GET INPUT FILE'S DATE TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE ENTER /ENTER TENTATIVE FILENAME ENTAR1, .-. /WILL POINT TO FILENAME ENTAR2, .-. /WILL BE ZERO JMP ENTERR /ENTER ERROR TAD ENTAR1 /GET RETURNED FIRST RECORD DCA OUTRECORD /STORE IT TAD ENTAR2 /GET RETURNED EMPTY LENGTH IAC /ADD 2-1 FOR OS/278 CRAZINESS DCA DANGCNT /STORE AS DANGER COUNT JMS I (CLRCHKSUM) /CLEAR THE CHECKSUM JMS I (ENCODIT) /GO DO THE ACTUAL ENCODING JMP PROCERR /ERROR WHILE ENCODING TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE CLOSE /CLOSE OUTPUT FILE FNAME /POINTER TO FILENAME OUTCNT, .-. /WILL BE ACTUAL COUNT JMP CLSERR /CLOSE ERROR EXITZAP,JMP START /**** <ESC> TERMINATION **** 0000 JMP I (SBOOT) /EXIT TO MONITOR / ERROR WHILE PROCESSING INPUT FILE. PROCERR,NL0002 /SET INCREMENT SKP /DON'T USE NEXT / ERROR WHILE CLOSING THE OUTPUT FILE. CLSERR, NL0001 /SET INCREMENT SKP /DON'T CLEAR IT / OUTPUT FILE TOO LARGE ERROR. SIZERR, CLA /CLEAN UP TAD [3] /SET INCREMENT SKP /DON'T USE NEXT / ENTER ERROR. ENTERR, NL0002 /SET INCREMENT SKP /DON'T USE NEXT / HANDLER FETCH ERROR. FERROR, NL0001 /SET INCREMENT / NO OUTPUT FILENAME ERROR. NONAMER,IAC /SET INCREMENT / ILLEGAL OUTPUT FILE NAME ERROR. BADNAME,IAC /SET INCREMENT / INPUT FILESPEC ERROR. INERR, IAC /SET INCREMENT / OUTPUT FILESPEC ERROR. OUTERR, DCA ERRNUMBER /STORE ERROR NUMBER CDF PRGFLD /ENSURE OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE USERROR /USER ERROR ERRNUMB,.-. /WILL BE PASSED ERROR NUMBER / COMES HERE TO TEST FOR NULL LINE. TSTMORE,TAD I (INFILE) /GET FIRST INPUT FILE DEVICE WORD SZA CLA /SKIP NO INPUT OR OUTPUT GIVEN JMP OUTERR /ELSE COMPLAIN CDF PRGFLD /BACK TO OUR FIELD JMP EXITZAP /MIGHT BE LAST TIME, SO GO THERE FIRST PAGE ENCODIT,.-. /ENCODING ROUTINE TAD INRECORD /GET INPUT FILE STARTING RECORD DCA INREC /STORE IN-LINE NL7777 /SETUP INITIALIZE VALUE JMS I [DOBYTE] /INITIALIZE OUTPUT ROUTINE JMS I (TDMESSAGE) /OUTPUT TODAY'S DATE MESSAGE JMS I (FDMESSAGE) /OUTPUT FILE DATE MESSAGE JMS I [SCRIBE] /OUTPUT THE FILMSG /(FILE MESSAGE JMS I (PIFNAME) /OUTPUT THE INPUT FILENAME JMS I [SCRIBE] /OUTPUT THE EMSG /LINE ENDING TAD [-WIDTH] /SETUP THE DCA WIDCNT /LINE WIDTH COUNTER JMS I (OUTSETUP) /SETUP PACKING ROUTINE AND CLEAR FILL TAD [-5] /INITIALIZE DCA OBOUND /BOUNDARY COUNTER ENCLOOP,JMS I INPUT /CALL INPUT HANDLER 2^100 /READ TWO PAGES PINBUFF,INBUFFER /INTO INPUT BUFFER INREC, .-. /WILL BE LATEST INPUT FILE RECORD ENCERRO,JMP I ENCODIT /INPUT ERROR, TAKE IMMEDIATE RETURN ISZ INREC /BUMP TO NEXT RECORD NOP /JUST IN CASE TAD PINBUFFER/(INBUFFER) /SETUP THE DCA INPTR /BUFFER POINTER LOOP, JMS I (CHKBND) /CHECK IF ON A GOOD BOUNDARY JMP NOCOMPRESSION /COMPRESS IS NOT ALLOWED AT THIS TIME TAD INPTR /GET CURRENT POINTER DCA XR1 /STASH FOR SEARCH DCA CMPCNT /CLEAR MATCH COUNT CMPLUP, TAD XR1 /GET INDEX VALUE TAD (-2^200-INBUFFER+1) /COMPARE TO LIMIT SNA CLA /SKIP IF NOT AT END OF BUFFER JMP CMPEND /JUMP IF AT END OF BUFFER TAD I XR1 /GET A CANDIDATE WORD CIA /INVERT FOR TEST TAD I INPTR /COMPARE TO CURRENT TEST VALUE SZA CLA /SKIP IF IT MATCHES JMP CMPEND /JUMP IF THIS IS NOT A REPEAT ISZ CMPCNT /BUMP MATCH COUNT JMP CMPLUP /TRY TO FIND MORE / COMES HERE POSSIBLY WITH SOME COMPRESSED VALUES COUNTED. CMPEND, NL7776 /-2 TAD CMPCNT /DID WE FIND ENOUGH MATCHES? SPA CLA /SKIP IF SO JMP NOCOMPRESSION /FORGET IT TAD ("X-"0) /SETUP COMPRESSION INDICATOR JMS I (OUTSETUP) /SETUP SPECIAL MODE JMS I (PUT5) /OUTPUT "X" JMS I (OUTSETUP) /SETUP NORMAL NUMERICAL MODE TAD I INPTR /GET THE VALUE JMS I [PUTIT] /OUTPUT IT ISZ CMPCNT /ACCOUNT FOR ORIGINAL TAD CMPCNT /GET COMPRESSION COUNT CLL RTL;RTL /*16 JMS I [PUTIT] /OUTPUT BITS[0-7] ONLY JMS I (OUTSETUP) /SETUP NORMAL NUMERICAL MODE AGAIN TAD INPTR /GET INPUT POINTER TAD CMPCNT /UPDATE PAST ALL COMPRESSED VALUES DCA INPTR /STORE BACK JMP TEST /CONTINUE THERE / COMES HERE IF NO COMPRESSION FOUND (OR NOT ALLOWED). NOCOMPR,TAD I INPTR /GET LATEST VALUE JMS I [PUTIT] /OUTPUT IT ISZ INPTR /BUMP TO NEXT ISZ OBOUND /BUMP TO NEXT WORD JMP TEST /KEEP GOING TAD [-5] /RESET THE DCA OBOUND /BOUNDARY COUNTER TEST, TAD INPTR /GET INPUT POINTER TAD (-2^200-INBUFFER) /COMPARE TO UPPER LIMIT SZA CLA /SKIP IF AT END OF BUFFER JMP LOOP /ELSE JUST KEEP GOING ISZ INLEN /DONE ALL INPUT RECORDS? JMP ENCLOOP /NO, KEEP GOING / WE MUST FINISH THE LAST [5 WORDS => 12 BYTES] SEQUENCE. ENDLUP, JMS I (CHKBND) /AT A GOOD BOUNDARY? SKP /SKIP IF NOT JMP ENDONE /JUMP IF SO JMS I [PUTIT] /OUTPUT SOME WASTE BYTES ISZ OBOUND /AT A GOOD BOUNDARY NOW? JMP ENDLUP /NO, TRY AGAIN ENDONE, TAD ("Z-"0) /GET END INDICATOR JMS I (OUTSETUP) /SETUP SPECIAL MODE JMS I (PUT5) /OUTPUT A "Z" JMS I (INVCHKSUM) /INVERT THE CHECKSUM JMS I (OUTSETUP) /SETUP NORMAL NUMERICAL MODE JMS I (CHKOUT) /OUTPUT THE CHECKSUM JMS I [SCRIBE] /OUTPUT THE ENDMSG /END MESSAGE JMS I (PIFNAME) /OUTPUT THE INPUT FILENAME JMS I [SCRIBE] /OUTPUT THE EMSG /LINE ENDING JMS I [SCRIBE] /OUTPUT THE EOFMSG /FINAL MESSAGE TAD ("Z&37) /GET <^Z> CLOSLUP,JMS I [DOBYTE] /OUTPUT A BYTE (^Z OR NULL) TAD BUFPTR /GET THE OUTPUT BUFFER POINTER TAD (-OUTBUFFER) /COMPARE TO RESET VALUE SZA CLA /SKIP IF IT MATCHES JMP CLOSLUP /ELSE KEEP GOING ISZ ENCODIT /NO ERRORS JMP I ENCODIT /RETURN PAGE PUTIT, .-. /WORD OUTPUT ROUTINE DCA PUTEMP /SAVE PASSED VALUE JMS I (CALCHKSUM) /UPDATE CHECKSUM JMP I PUTNXT /GO WHERE YOU SHOULD GO PUTNXT, PUT0 /OUTPUT EXIT ROUTINE TAD PUTEMP /GET LATEST VALUE DCA PUTPREV /SAVE FOR NEXT TIME JMP I PUTIT /RETURN TO MAIL CALLER PUTLUP, JMS PUTNXT /GET ANOTHER WORD PUT0, TAD PUTEMP /GET WORD[0] RTL;RTL;RTL /BITS[0-4] => AC[7-11] JMS PUT5 /OUTPUT A CHARACTER TAD PUTEMP /GET WORD[0] AGAIN RTR /BITS[5-9] => AC[7-11] JMS PUT5 /OUTPUT A CHARACTER JMS PUTNXT /GET ANOTHER WORD PUT1, TAD PUTPREV /GET WORD[0] AND [3] /ISOLATE BITS[10-11] CLL RTL;RAL /BITS[10-11] => AC[7-8] DCA PUTPREV /SAVE FOR NOW TAD PUTEMP /GET WORD[1] RTL;RTL /BITS[0-2] => AC[9-11] AND [7] /ISOLATE DESIRED BITS TAD PUTPREV /ADD ON WORD[0] BITS IN AC[7-8] JMS PUT5 /OUTPUT A CHARACTER TAD PUTEMP /GET WORD[1] RTR;RTR /BITS[3-7] => AC[7-11] JMS PUT5 /OUTPUT A CHARACTER JMS PUTNXT /GET ANOTHER WORD PUT2, TAD PUTEMP /GET WORD[2] RAL /BIT[0] => L CLA /CLEAN UP TAD PUTPREV /GET WORD[1] RAL /BITS[8-11],L => AC[7-11] JMS PUT5 /OUTPUT A CHARACTER TAD PUTEMP /GET WORD[2] RTR;RTR;RTR /BITS[1-5] => AC[7-11] JMS PUT5 /OUTPUT A CHARACTER TAD PUTEMP /GET WORD[2] RAR /BITS[6-10] => AC[7-11] JMS PUT5 /OUTPUT A CHARACTER JMS PUTNXT /GET ANOTHER WORD PUT3, TAD PUTPREV /GET WORD[2] RAR /BIT[11] => L CLA /CLEAN UP TAD PUTEMP /GET WORD[3] RTL;RTL;RAL /L, BITS[0-3] => AC[7-11] JMS PUT5 /OUTPUT A CHARACTER TAD PUTEMP /GET WORD[3] RTR;RAR /BITS[4-8] => AC[7-11] JMS PUT5 /OUTPUT A CHARACTER JMS PUTNXT /GET ANOTHER WORD PUT4, TAD PUTPREV /GET WORD[3] AND [7] /ISOLATE BITS[9-11] CLL RTL /BITS[9-11] => AC[7-9] DCA PUTPREV /SAVE FOR NOW TAD PUTEMP /GET WORD[4] RTL;RAL /BITS[0-1] => AC[10-11] AND [3] /ISOLATE BITS[10-11] TAD PUTPREV /ADD ON WORD[3] BITS IN AC[7-9] JMS PUT5 /OUTPUT A CHARACTER TAD PUTEMP /GET WORD[4] RTR;RTR;RAR /BITS[2-6] => AC[7-11] JMS PUT5 /OUTPUT A CHARACTER TAD PUTEMP /GET WORD[4] BITS[7-11] IN AC[7-11] JMS PUT5 /OUTPUT A CHARACTER JMP PUTLUP /GO DO ANOTHER GROUP OF FIVE WORDS CHKNL, .-. /CHECK IF AT NEW LINE ROUTINE TAD WIDCNT /GET LINE WIDTH COUNTER TAD (WIDTH) /COMPARE TO MAXIMIM VALUE SZA CLA /SKIP IF AT MAXIMUM ISZ CHKNL /TAKE SKIP RETURN IF NOT AT MAXIMUM JMP I CHKNL /RETURN EITHER WAY OUTSETU,.-. /OUTPUT SETUP ROUTINE DCA FILLVALUE /STORE PASSED FILL VALUE TAD (PUT0) /SETUP THE DCA PUTNXT /OUTPUT CO-ROUTINE JMP I OUTSETUP /RETURN PUT5, .-. /FIVE-BIT OUTPUT ROUTINE AND [37] /JUST 5 BITS DCA PUTLATEST /SAVE IT JMS CHKNL /CHECK IF AT BEGINNING OF LINE SKP /SKIP IF NOT JMP PUTNORMAL /JUMP IF SO TAD ("<&177) /GET BEGINNING BRACKET JMS I [DOBYTE] /OUTPUT IT PUTNORM,TAD PUTLATEST /GET LATEST VALUE TAD ("0-"9-1) /COMPARE TO FIRST LIMIT SMA CLA /SKIP IF LESS TAD ["A-"9-1] /CONVERT LARGER VALUES TO A-V TAD PUTLATEST /ADD ON LATEST VALUE TAD ["0&177] /MAKE IT ASCII TAD FILLVALUE /ADD ON FILL VALUE FOR SPECIAL MODE JMS I [DOBYTE] /OUTPUT IT ISZ WIDCNT /BUMP LINE COUNTER TAD WIDCNT /GET LINE COUNTER SZA CLA /SKIP IF AT END OF LINE JMP I PUT5 /ELSE JUST RETURN TAD (">&177) /GET DATA CLOSING CHARACTER JMS I [DOBYTE] /OUTPUT IT TAD ["M&37] /GET A <CR> JMS I [DOBYTE] /OUTPUT IT TAD ["J&37] /GET A <LF> JMS I [DOBYTE] /OUTPUT IT TAD [-WIDTH] /RESET THE DCA WIDCNT /LINE WIDTH COUNTER JMP I PUT5 /RETURN PAGE / MESSAGE PRINT ROUTINE. SCRIBE, .-. /MESSAGE PRINT ROUTINE TAD I SCRIBE /GET IN-LINE POINTER ARGUMENT DCA SCRPTR /STASH THE POINTER ISZ SCRIBE /BUMP PAST ARGUMENT TAD (140) /INITIALIZE TO DCA SCRCASE /LOWER-CASE SCRLUP, TAD I SCRPTR /GET LEFT HALF-WORD RTR;RTR;RTR /MOVE OVER JMS SCRPRNT /PRINT IT TAD I SCRPTR /GET RIGHT HALF-WORD JMS SCRPRNT /PRINT IT ISZ SCRPTR /BUMP TO NEXT PAIR JMP SCRLUP /KEEP GOING SCRPRNT,.-. /CHARACTER PRINT ROUTINE AND [77] /JUST SIX BITS SNA /END OF MESSAGE? JMP I SCRIBE /YES, RETURN TO ORIGINAL CALLER DCA SCRCHAR /NO, SAVE FOR NOW TAD SCRCHAR /GET IT BACK TAD (-"%!200) /IS IT "%"? SNA /SKIP IF NOT JMP SCRCRLF /JUMP IF IT MATCHES TAD (-"^+100+"%) /IS IT "^" SNA CLA /SKIP IF NOT JMP SCRFLIP /JUMP IF IT MATCHES TAD SCRCHAR /GET THE CHARACTER AND [40] /DOES CASE MATTER? SNA CLA /SKIP IF NOT TAD SCRCASE /ELSE GET PREVAILING CASE TAD SCRCHAR /GET THE CHARACTER SCRPRLF,JMS I [DOBYTE] /OUTPUT THE CHARACTER JMP I SCRPRNT /RETURN SCRCRLF,TAD ["M&37] /GET A <CR> JMS I [DOBYTE] /OUTPUT IT TAD ["J&37] /GET A <LF> JMP SCRPRLF /CONTINUE THERE SCRFLIP,TAD SCRCASE /GET CURRENT CASE CIA /INVERT IT TAD (140+100) /ADD SUM OF POSSIBLE VALUES DCA SCRCASE /STORE NEW INVERTED CASE JMP I SCRPRNT /RETURN PUTBYTE,.-. /OUTPUT A BYTE ROUTINE SPA /ARE WE INITIALIZING? JMP PUTINITIALIZE /YES AND (177) /JUST IN CASE DCA LATEST /SAVE LATEST CHARACTER TAD LATEST /GET LATEST CHARACTER JMP I PUTNEXT /GO WHERE YOU SHOULD GO PUTNEXT,.-. /EXIT ROUTINE ISZ PUTBYTE /BUMP TO GOOD RETURN PUTERRO,CLA CLL /CLEAN UP JMP I PUTBYTE /RETURN TO MAIN CALLER PUTINIT,CLA /CLEAN UP TAD OUTRECORD /GET STARTING RECORD OF TENTATIVE FILE DCA PUTRECORD /STORE IN-LINE DCA I (OUTCNT) /CLEAR ACTUAL FILE LENGTH PUTNEWR,TAD (OUTBUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER PUTLOOP,JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT TAD BUFPTR /GET POINTER VALUE DCA TEMPTR /SAVE FOR LATER ISZ BUFPTR /BUMP TO NEXT JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT JMS PUTNEXT /GET A CHARACTER RTL;RTL /MOVE UP AND [7400] /ISOLATE HIGH NYBBLE TAD I TEMPTR /ADD ON FIRST BYTE DCA I TEMPTR /STORE COMPOSITE TAD LATEST /GET LATEST CHARACTER RTR;RTR;RAR /MOVE UP AND AND [7400] /ISOLATE LOW NYBBLE TAD I BUFPTR /ADD ON SECOND BYTE DCA I BUFPTR /STORE COMPOSITE ISZ BUFPTR /BUMP TO NEXT TAD BUFPTR /GET LATEST POINTER VALUE TAD (-2^200-OUTBUFFERR) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP PUTLOOP /KEEP GOING ISZ DANGCNT /TOO MANY RECORDS? SKP /SKIP IF NOT JMP I (SIZERR) /JUMP IF SO JMS I OUTPUT /CALL I/O HANDLER 2^100+WRITE /WRITE SOME PAGES FROM OUTPUT BUFFER OUTBUFFER /BUFFER ADDRESS PUTRECO,.-. /WILL BE LATEST RECORD NUMBER JMP PUTERROR /OUTPUT ERROR! ISZ I (OUTCNT) /BUMP ACTUAL LENGTH ISZ PUTRECORD /BUMP TO NEXT RECORD JMP PUTNEWRECORD /KEEP GOING DOBYTE, .-. /OUTPUT A BYTE ROUTINE JMS PUTBYTE /OUTPUT PASSED VALUE JMP I (ENCERROR) /COULDN'T DO IT JMP I DOBYTE /RETURN PAGE / INPUT FILE ROUTINE. GEIFILE,.-. /GET INPUT FILE ROUTINE JMS LUKUP /TRY TO LOOKUP THE FILE SKP /SKIP IF IT WORKED JMP TRYNULL /TRY NULL EXTENSION VERSION NULLOK, TAD LARG2 /GET NEGATED LENGTH DCA INLEN /STASH IT TAD LARG1 /GET FIRST INPUT RECORD DCA INRECORD /STASH IT JMP I GEIFILE /RETURN / COMES HERE IF LOOKUP FAILED. TRYNULL,CDF TBLFLD /GOTO TABLE FIELD TAD I [INFILE+4] /GET ORIGINAL FILENAME'S EXTENSION CDF PRGFLD /BACK TO OUR FIELD SZA CLA /SKIP IF IT WAS NULL ORIGINALLY JMP I (INERR) /ELSE COMPLAIN OF EXPLICIT LOOKUP FAILURE DCA IFNAME+3 /NOW TRY NULL VERSION INSTEAD OF DEFAULT VERSION JMS LUKUP /TRY TO LOOK IT UP AGAIN JMP NULLOK /THAT WORKED! JMP I (INERR) /COMPLAIN OF LOOKUP FAILURE LUKUP, .-. /LOW-LEVEL LOOKUP ROUTINE TAD (IFNAME) /GET OUR FILENAME POINTER DCA LARG1 /STORE IN-LINE DCA LARG2 /CLEAR SECOND ARGUMENT TAD IDNUMBER /GET INPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE LOOKUP /WANT LOOKUP FUNCTION LARG1, .-. /WILL BE POINTER TO OUR FILENAME LARG2, .-. /WILL RETURN FILE LENGTH (HOPEFULLY) ISZ LUKUP /LOOKUP FAILED, SO BUMP RETURN ADDRESS JMP I LUKUP /RETURN EITHER WAY / INPUT FILENAME PRINT ROUTINE. PIFNAME,.-. /PRINT INPUT FILENAME ROUTINE TAD IMSW /GET IMAGE-MODE SWITCH SNA CLA /SKIP IF SET JMP DOIFNAME /JUMP IF NOT JMS I [SCRIBE] /OUTPUT THE IFMSG /IMAGE MESSAGE CDF TBLFLD /GOTO TABLE FIELD TAD I [EQUWRD] /GET EQUALS PARAMETER CDF PRGFLD /BACK TO OUR FIELD JMS I (OCTOUT) /OUTPUT IT CDF TBLFLD /GOTO TABLE FIELD TAD I [SWY9] /GET /Y-/9 SWITCHES CDF PRGFLD /BACK TO OUR FIELD AND [600] /JUST /1, /2 BITS SNA /SKIP IF SOMETHING SET JMP I PIFNAME /JUST RETURN IF NOT AND [400] /JUST /1 BIT SNA CLA /SKIP IF /1 SET JMP PIFPT2 /JUMP IF /2 SET JMS I [SCRIBE] /OUTPUT THE PT1MSG /PART ONE MESSAGE JMP I PIFNAME /RETURN PIFPT2, JMS I [SCRIBE] /OUTPUT THE PT2MSG /PART TWO MESSAGE JMP I PIFNAME /RETURN DOIFNAM,TAD IFNAME /GET FIRST PAIR JMS PIF2 /PRINT IT TAD IFNAME+1 /GET SECOND PAIR JMS PIF2 /PRINT IT TAD IFNAME+2 /GET THIRD PAIR JMS PIF2 /PRINT IT TAD (".&177) /GET SEPARATOR JMS PIFOUT /PRINT IT TAD IFNAME+3 /GET FOURTH PAIR JMS PIF2 /PRINT IT JMP I PIFNAME /RETURN PIF2, .-. /PRINT A PAIR ROUTINE DCA SCRCHAR /SAVE PASSED PAIR TAD SCRCHAR /GET IT BACK RTR;RTR;RTR /MOVE DOWN JMS PIFOUT /PRINT HIGH-ORDER FIRST TAD SCRCHAR /GET IT AGAIN JMS PIFOUT /PRINT LOW-ORDER JMP I PIF2 /RETURN PIFOUT, .-. /FILENAME CHARACTER OUTPUT ROUTINE AND [77] /JUST SIXBIT SNA /SKIP IF SOMETHING THERE JMP I PIFOUT /ELSE IGNORE IT TAD [40] /INVERT IT AND [77] /REMOVE EXCESS TAD [40] /INVERT IT AGAIN JMS I [DOBYTE] /OUTPUT IT JMP I PIFOUT /RETURN MOFNAME,.-. /MOVE OUTPUT FILENAME ROUTINE TAD I [OUTFILE+1] /GET FIRST OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME /STASH IT TAD I (OUTFILE+2) /GET SECOND OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME+1 /STASH IT TAD I (OUTFILE+3) /GET THIRD OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME+2 /STASH IT TAD I (OUTFILE+4) /GET FOURTH OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME+3 /STASH IT JMP I MOFNAME /RETURN / OUTPUT NAME CHECK ROUTINE. CHKNAME,.-. /OUTPUT NAME CHECK ROUTINE DCA LUKUP /SAVE PASSED VALUE TAD LUKUP /GET IT BACK RTR;RTR;RTR /MOVE DOWN JMS CHKIT /CHECK HIGH-ORDER AND GET IT BACK JMS CHKIT /CHECK LOW-ORDER AND GET IT BACK JMP I CHKNAME /RETURN CHKIT, .-. /ONE CHARACTER CHECK ROUTINE AND [77] /JUST SIX BITS TAD (-"?!200) /COMPARE TO "?" SZA /SKIP IF ALREADY BAD TAD (-"*+"?) /ELSE COMPARE TO "*" SNA CLA /SKIP IF NEITHER BAD CASE JMP I (BADNAME) /COMPLAIN OF WILD CHARACTER TAD LUKUP /GET THE PAIR BACK FOR NEXT TIME JMP I CHKIT /RETURN PAGE CALCHKS,.-. /CALCULATE CHECKSUM ROUTINE TAD CHKFLG /SHOULD WE CHECKSUM? SZA CLA /SKIP IF SO JMP I CALCHKSUM /JUMP IF NOT JMS CHKSETUP /SETUP TAD PUTEMP /GET PASSED VALUE CLL RAR /CLEAR LINK AND MOVE OVER ADDLUP, RAL /MOVE OVER CARRY TAD I XR1 /ADD A WORD DCA I XR2 /STORE BACK ISZ CCNT /DONE ENOUGH? JMP ADDLUP /NO, KEEP GOING JMP I CALCHKSUM /YES, RETURN CHKOUT, .-. /OUTPUT THE CHECKSUM ROUTINE JMS CHKSETUP /SETUP ISZ CHKFLG /DISABLE CHECKSUMMING TAD I XR1 /GET A WORD JMS I [PUTIT] /OUTPUT IT ISZ CCNT /DONE YET? JMP .-3 /NO, KEEP GOING JMP I CHKOUT /YES, WE'RE DONE CLRCHKS,.-. /CLEAR CHECKSUM ROUTINE JMS CHKSETUP /SETUP DCA I XR1 /CLEAR A WORD ISZ CCNT /DONE YET? JMP .-2 /NO, DO ANOTHER DCA CHKFLG /ENABLE CHECKSUMMING JMP I CLRCHKSUM /RETURN INVCHKS,.-. /CHECKSUM INVERSION ROUTINE JMS CHKSETUP /SETUP STL /FORCE INITIAL CARRY COMLUP, TAD I XR1 /GET A WORD CMA /INVERT IT SZL /SKIP IF NO CARRY CLL IAC /ELSE ADD ONE AND CLEAR CARRY FOR NEXT TIME DCA I XR2 /STORE BACK ISZ CCNT /DONE ALL YET? JMP COMLUP /NO, KEEP GOING JMP I INVCHKSUM /YES, RETURN CHKSETU,.-. /CHECKSUM SETUP ROUTINE TAD (CHKSUM-1) /POINT TO DCA XR1 /CHECKSUM AREA TAD (CHKSUM-1) /POINT TO DCA XR2 /CHECKSUM AREA TAD [-5] /SETUP THE DCA CCNT /CHECKSUM COUNT JMP I CHKSETUP /RETURN / FILE DATE ROUTINE. FDMESSA,.-. /PUT FILE DATE IN MESSAGE ROUTINE TAD FDATE /GET INPUT FILE'S DATE SNA CLA /SKIP IF ANY JMP I FDMESSAGE /RETURN IF NONE JMS I [SCRIBE] /PRINT OUT THE DATMSG /DATE BLURB TAD FDATE /GET IT BACK JMS PRDATE /PRINT THE DATE JMS I [SCRIBE] /PRINT THE EMSG /END MESSAGE JMP I FDMESSAGE /RETURN TDMESSA,.-. /PUT TODAY'S DATE IN MESSAGE ROUTINE JMS I [SCRIBE] /OUTPUT THE REMMSG /OPENING REMARKS CDF TBLFLD /GOTO TABLE FIELD TAD I (DATWRD) /GET DATE WORD CDF PRGFLD /BACK TO OUR FIELD SNA /SKIP IF THERE JMP NOTDATE /JUMP IF NOT DCA TDATE /SAVE TODAY'S DATE JMS I [SCRIBE] /OUTPUT THE ONMSG /BRIDGING MESSAGE TAD TDATE /GET TODAY'S DATE JMS PRDATE /PRINT TODAY'S DATE NOTDATE,JMS I [SCRIBE] /OUTPUT THE EMSG /END MESSAGE JMP I TDMESSAGE /RETURN PRDATE, .-. /DATE PRINT ROUTINE DCA PRTEMP /SAVE PASSED VALUE TAD PRTEMP /GET IT BACK RTR;RAR /MOVE DOWN AND [37] /JUST DAY BITS JMS I (DEC2) /PRINT AS TWO DIGITS TAD PRTEMP /GET DATE AGAIN AND [7400] /JUST MONTH BITS CLL RTL;RTL;RTL /MOVE DOWN TAD (MONLST-2-1) /POINT TO PROPER ELEMENT DCA XR1 /STASH THE POINTER TAD I XR1 /GET FIRST PAIR DCA I (MMSG+1) /STORE IN MESSAGE TAD I XR1 /GET SECOND PAIR DCA I (MMSG+2) /STORE IN MESSAGE JMS I [SCRIBE] /OUTPUT THE MMSG /MONTH MESSAGE TAD PRTEMP /GET DATE AGAIN AND [7] /JUST YEAR BITS DCA TEMP /SAVE IT CDF TBLFLD /GOTO TABLE FIELD TAD I (DATWRD) /GET CURRENT DATE WORD CDF PRGFLD /BACK TO OUR FIELD AND [7] /JUST YEAR BITS CIA /INVERT FOR TEST TAD TEMP /COMPARE TO DESIRED YEAR SMA SZA CLA /SKIP IF THEY MATCH OR ARE EARLIER TAD (-10) /ELSE BACKUP A GROUP TAD TEMP /ADD TO YEAR DCA TEMP /STORE BACK TAD I (DATEXT) /GET EXTENSION WORD AND [600] /JUST EXTENSION BITS CLL RTR;RTR /MAKE IT GROUP COUNT TAD TEMP /ADD ON RELATIVE YEAR TAD (106) /MAKE IT ABSOLUTE YEAR (70-99) JMS I (DEC2) /PRINT AS TWO DIGITS JMP I PRDATE /RETURN PAGE DEC2, .-. /PRINT TWO DIGITS ROUTINE JMS DIVIDE /DIVIDE 12 /BY 10 TAD ["0&177] /MAKE IT ASCII JMS I [DOBYTE] /OUTPUT IT TAD REM /GET SECOND DIGIT TAD ["0&177] /MAKE IT ASCII JMS I [DOBYTE] /OUTPUT IT JMP I DEC2 /RETURN / DIVIDE ROUTINE. DIVIDE, .-. /DIVIDE ROUTINE DCA REM /SAVE IN REMAINDER DCA QUO /CLEAR QUOTIENT TAD REM /GET IT BACK STL CIA /INVERT SKP /DON'T FIRST TIME DVLOOP, ISZ QUO /BUMP UP QUOTIENT TAD I DIVIDE /ADD ON ARGUMENT SNA SZL /UNDERFLOW? JMP DVLOOP /NO, KEEP GOING CIA /YES, INVERT IT BACK TAD I DIVIDE /RESTORE LOST VALUE DCA REM /SAVE AS REMAINDER TAD QUO /GET THE QUOTIENT ISZ DIVIDE /BUMP PAST ARGUMENT JMP I DIVIDE /RETURN INDATE, .-. /GET INPUT FILE'S DATE WORD CDF TBLFLD /GOTO TABLE FIELD TAD IMSW /GET IMAGE-MODE SWITCH SNA CLA /SKIP IF SET JMP NOIMG /JUMP IF NOT TAD I (DATWRD) /USE TODAY'S DATE JMP NOAIW /CONTINUE THERE NOIMG, TAD I (AIWCNT) /GET AIW COUNT SNA /SKIP IF ANY JMP NOAIW /JUMP IF NOT TAD I [AIWXR] /GET ENTRY POINTER DCA TEMP /STASH FIRST AIW POINTER TAD I TEMP /GET FIRST AIW NOAIW, DCA FDATE /SAVE AS FILE'S DATE CDF PRGFLD /BACK TO OUR FIELD JMP I INDATE /RETURN / INPUT FILENAME MOVE ROUTINE; USES DEFAULT EXTENSION IF NONE PROVIDED BY USER. MIFNAME,.-. /MOVE INPUT FILENAME ROUTINE TAD I (INFILE+1) /GET FIRST INPUT FILENAME WORD SNA /SKIP IF SOMETHING THERE JMP IMTEST /JUMP IF NOT IFNAMOK,DCA IFNAME /STASH IT TAD I (INFILE+2) /GET SECOND INPUT FILENAME WORD DCA IFNAME+1 /STASH IT TAD I (INFILE+3) /GET THIRD INPUT FILENAME WORD DCA IFNAME+2 /STASH IT TAD I [INFILE+4] /GET FOURTH INPUT FILENAME WORD SNA /SKIP IF SOMETHING THERE TAD ("S^100+"V-300) /ELSE USE DEFAULT EXTENSION VALUE DCA IFNAME+3 /STASH IT EITHER WAY JMP I MIFNAME /RETURN / TEST IF IMAGE-MODE IS SET. ASSUME /1 AND /2 ARE NOT SET. IMTEST, TAD I (SWAL) /GET /A-/L SWITCHES AND (10) /JUST /I BIT SZA CLA /SKIP IF NOT SET TAD I [EQUWRD] /GET EQUALS PARAMETER SNA /SKIP IF SOMETHING THERE JMP I (INERR) /ELSE COMPLAIN CIA /INVERT IT DCA INLEN /USE AS INPUT RECORD COUNT DCA INRECORD /START AT THE BEGINNING OF THE DEVICE ISZ IMSW /INDICATE IMAGE-MODE SET / TEST IF /1 OR /2 IS SET. TAD I [SWY9] /GET /Y-/9 SWITCHES AND [600] /JUST /1, /2 SWITCHES SNA /SKIP IF EITHER SET JMP IFNAMOK /JUMP IF NEITHER SET / TEST IF /1 IS SET. IF NOT, /2 MUST BE SET. AND [400] /JUST /1 SWITCH SNA CLA /SKIP IF /1 SET JMP IM2 /JUMP IF /2 SET / FOR A FIRST HALF, USE THE ROUNDED-DOWN FIRST HALF LENGTH. THE DATA STARTS AT / RECORD ZERO (ALREADY SET). TAD I [EQUWRD] /GET EQUALS PARAMETER CLL RAR /%2 IM2ENTR,CIA /INVERT IT DCA INLEN /SET COUNT FOR HALF OF THE DEVICE JMP IFNAMOK /KEEP GOING / FOR A SECOND HALF, THE DATA STARTS AT THE HALFWAY POINT (ROUNDED DOWN). IM2, TAD I [EQUWRD] /GET EQUALS PARAMETER CLL RAR /%2 DCA INRECORD /SETUP STARTING RECORD / FOR A SECOND HALF, THE COUNT IS THE ORIGINAL AMOUNT MINUS THE COUNT FOR THE / FIRST HALF. TAD I [EQUWRD] /GET EQUALS PARAMETER CLL RAR /%2 CIA /INVERT IT TAD I [EQUWRD] /SUBTRACT FROM EQUALS PARAMETER JMP IM2ENTRY /CONTINUE THERE CHKBND, .-. /CHECK IF ON GOOD OUTPUT BOUNDARY ROUTINE TAD OBOUND /GET BOUNDARY COUNTER TAD (5) /COMPARE TO BEGINNING VALUE SNA CLA /SKIP IF NOT AT BEGINNING ISZ CHKBND /SET SKIP RETURN IF AT BEGINNING JMP I CHKBND /RETURN EITHER WAY OCTOUT, .-. /OCTAL OUTPUT ROUTINE DCA OCTEMP /SAVE IT TAD (-4) /SETUP THE DCA OCTCNT /DIGIT COUNTER OCTLUP, TAD OCTEMP /GET THE VALUE RTL;RAL /MOVE UP A DIGIT DCA OCTEMP /STORE BACK TAD OCTEMP /GET IT AGAIN RAL /PUT INTO CORRECT BITS AND [7] /JUST ONE DIGIT TAD ["0&177] /MAKE IT ASCII JMS I [DOBYTE] /OUTPUT IT ISZ OCTCNT /DONE ENOUGH? JMP OCTLUP /NO, GO BACK FOR MORE JMP I OCTOUT /YES, RETURN TO CALLER PAGE / FILE TEXT MESSAGES. DATMSG, TEXT "(^REMARK F^ILE ^D^ATE: " EMSG, TEXT ")%^" ENDMSG, TEXT ">%(^END ^" EOFMSG, TEXT "(^REMARK E^ND OF ^F^ILE)%" FILMSG, TEXT "(^FILE " IFMSG, TEXT "^B^LOCK-^I^MAGE-^F^ILE =^" MMSG, TEXT "-^D^EC-19" ONMSG, TEXT ": ^" PT1MSG, TEXT " ^F^IRST ^H^ALF" PT2MSG, TEXT " ^S^ECOND ^H^ALF^" REMMSG, TEXT "(^REMARK PDP-8/DEC^MATE ^E^NCODING ^P^ROGRAM ^V^ERSION ^" "0+VERSION^100+".-200; "0+REVISION^100+" -200 TEXT " C^HARLES ^L^ASNER)%" TEXT "(^REMARK I^MAGE ^F^ILE ^C^REATED BY ^PDP^-8" / MONTH TEXT TABLE. MONLST, TEXT "J^AN" /JANUARY TEXT "F^EB" /FEBRUARY TEXT "M^AR" /MARCH TEXT "A^PR" /APRIL TEXT "M^AY" /MAY TEXT "J^UN" /JUNE TEXT "J^UL" /JULY TEXT "A^UG" /AUGUST TEXT "S^EP" /SEPTEMBER TEXT "O^CT" /OCTOBER TEXT "N^OV" /NOVEMBER TEXT "D^EC" /DECEMBER $ /THAT'S ALL FOLK! |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | leader for direct load file which must be in lower case file contains kermit data in ipl encoded format this file contains data for field zero !!M!!!!!!!!!!!!(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`\!!!!!!!! !!"_!!!!!!!N!D!!!R!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"`!!_! UL!>``!!!!!!!!!!!!%!#A3!E!E*1TEB,B%@!!!!!!!!!!?!;!`N9!!."A04!;]! !+A!EZ?Z3^EC.)/!-!G\#8QT!(U5%9+,+:"!%!$`!#`G`T"`<A#!`A&3!A!`G!%1 P`F`9#:&Y!)(U,F_E*F_EPH_,^99,]H\K>K!9:E7K8):K0]IK!;<F_!!K!F_A*K! !!\!/A<23A/A@[3A,Z<3,Y@X<4)@"^*]@W02^)K],4<402@38X4243KR\!,40X0W 0[F\@343)F*[]IL+@343[A@3)<9=1@Y!OA!!!!!!!!4PL64PL8T"!IT'[!,;TW,V TW,VTW9291P5T)[!P5!!T*LKT/[!PJ!!#=5Q6/=6!!!)S5S4!DS7S6+R88Q!1!W! !!F.S3/!3!_IO!F,/!3!]IO!;/CK!!O!!!\!9-,`9`*Z:!O1!!C1,_9`,^:!O9!! ;I)U;J?J3J3IKDO@!!!!!![!/K3K;S0]YBFY!!_IOKM$!!H\K_<-)G@.4.,-@.4. [A@.)B,[YB,.`)L+D/OW3WOW!!)!!!,Z<.P/!!<>,>Y+Y+Y+$Y,>"^*]P3!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$)!(=*=QVULV"VE !!C9O!"X,`_AK"3!O!!!C9O*;8+80_@_+8*W_IO*+83*O*!!!![!*W;U])_IU"KG U'"X94)439O9H^*V]A*U_I1#])KLY!3[K=3UK=O9!!Y!H][!*&OU!!;9*W<J[A"# _IL&CU_AL#U*K_+9])*SU/[!O[4KK_4JK_H\K]!!T"P4\9TW[!TW$[Z)_ILB,ZTW 92[%]A91[!,YTW[!P4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Y!I!&$5N#UW3S`` !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<X)A_A LQ,X"[_ILS,X,`_ILS,XYB)G_ALQ)GLV,XP=,X*R"X4=P=!!!!!!!!!!!!!!!!_" !!FQO!95)5FPY!,`963!O!!!;Q])3Q/Q^)K7*[_AK/3,\!+QO,!!;Q])3Q/Q^)KE *[_IK=3:\!+QO:!!;Q/Q`)KO3QKJ+QOH!!!!<A,AC!L3)9<@)5<?0?YB0@_AL6,? YB)6_IL(4?4@K[,@CHY"<?0?973R3R\")6OR3R,AOR,@CHY"Y"<@0@_IL4KY!!!! !!!!<M)U<N0M@N4M4N1SLFPB!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`` !!;L+LFQK@;M;Q;R,`9O9P,_;N/M]IK@,^_IK=/M3MF/3NK./M,^_AK@3M,`KC\! +L;MCUKI9Z+M3!O!\!+LO!!!!!!!%4,!;;;;;;;;!!]I,]<(0(<!4(0(<"S+FZ!+ !!!!!!OU,"3UOU!!!!<8,\<1,8S+FZ!"!!])4)\!,19LP)!!!!FO,[9/F+.N"(F* !".G1=L@,ZP949P9":.G"/.C!!"'``!!!!!!!!!!!!!!!!!!!!E+!#W"-O`'`]-Q !!;Q)V9U,`F2+QFQKN;R)V9O9P,_;S9WCT/R^)KJ,^]IK<,]_AKNKJ3R)V,\9O9P \E;SCT/R^)KJ*[_AKN3!\!+RO!\!+QO!!!!!!!!!/RH[])L(,Z]IL&,Y_AOT1W*^ F/3SK`3RL21W*^F/3R3SKU/RH[L2\!3RL,\!OT!!04<<4404<=44F+!!!!F*!"0F ])4444P41=L>P4":0B":0E!!!!!!!!!!!!!!!!!!!!!!!!!!!6`";@!$!/`3`[`] !!,`;SH_,^]IK;,]_IK@+S,\`!KO).,[^!*[,Z?S3S[A?S).FNK$[A?SF_E*O!+S ,Y_IK$[A+S;S?S,XFN*]FN,XFNK$\!*MFNK$!!!!"^<'\9)P9P]9L",'Y'Y'Y'=O OT-O,'=O1OOT!!!!]A<R,Q9Q9R,R<M<O,W<N\9,O<O0M]9L=Y+Y+Y+])4M"^<PF0 ,V]ILI*^YB,P_AP(4NL34(P(!!!!!!!!!!!!!!!!!!`"`Y!)IJ"A_AI*_/`TU!88 !!)<;PH`KB;S*L;RH_KB?R/R,^YB;Q3RH_KB?R3QK03R[A?R+SF\YB;QH_KB+Q_I KL\!3PKG,]NK)#_AP\H[K$)#_IO!P\!!!!!!!!!!F`F_C#*"FJF_E*3TOT!!F-QW F_E*O^!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!67CWG>`@'*'! !!FO,`9/):9N)NFICR9N,_9V)NFHCR9N)NFQ])CR9N)ZFGCR<'9T["<(,_@^,(H] CRKJ4'<(H\CR)W_AK=,'_ICRD-)N9:3!O!!![!+RFY5VO!LXAZLRB8LMBVLIH"L@ GPL;H3L5EC!!!!!!!!!!!!!!!!\!9TF+T_"#F*!"!!P-!![A)@"^*]<L,K,L,MF\ <N)F*[]I[A<OF.6JP7!"!D!!"/!!!!``!!!!!!!!!!!!!!!!!!!!!!A==!2Q6)!# !!FO,`9/):9N)NFIKJFQKE;7+7FP])K.9N[A=N9@+7F+!!"3F*!"7K1=K9O!H_KD 3!)N9:O!\!*FO!FEO!\!,^O!"&7H"47?"/7<!!!!FO,`9/):9N)NFIL+FQ])L.9N F,H]8.L.H_L.3T)N9:OT\!,^OT[!OT"48%"#8."#8'!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%KAZ9!!$ !!H`9[S+FZ!,9@F+TU":F*!";*1=K+DBF+T_":F*!":_DB)[_IDBH_DBK1)[_ADB .L,^^)DB,]<O[A@O,\9V,]FHDB\!)Z9])]FGDB,\;Z)]S+FZ!$!!!!DB+Z9X+[Y" 9Y1[[AFD]#)VFCF_BCF-6QF_E*K1)[_IDBFBDBK1)[_AFBY!F+T_":F*!!3!O!FE O!!!F+T_"#F*!!,BFY;1]I,[O!!!!!!!!!!!!!!!!!!!!!!!!!!!F(6)QW`>;`CG "%98";:/"#:5"'9>"&:@!!"/9."'9>"&:@!!HJH<HEB&H%FUH4F2H.FBGNB-!!!! CH])KFCT])3@O@!!;S+S,`Z!,_]93H\!+SOH!!!!;_+_,^Z!*A]93T\!+_OT!!!! .L,]<?@?,\<?0?]IL=YB)G_IL2,@_A,[L5,@_IL90?FDO`L:\"<@4?L'3`O`!!!! !!9$0A9)4A1)-)]IPA)$_ALF-)9$)$PA!!!!!!!!!!!!!!!!!!!!`!QWQ4`'!;_F !!]IKS;(EL#)5!!!O!S*0`9X,_9+-+]IKV<,-+<--+<.-+</[A0_<"<#+<;AKC-+ <#3A4"K@-+]IKZ<+S",^H]KS,+9Y,^FC3!K`S*,+])-+YB)X9X8\K/0[S"]AK$3! O!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5#5!2(>,5%5" !!_IOG)X;)EL#)1!!!O!+(<R<"C:C:,"CG,R,`_AK-3)1YK&KR!!S*0R"@Z%,"Y' Y'<"0RCG4RO:!!S"Y%Z9!^*V]IKT*?"T3!3!O!,S_IKR,_;GKO!!^)L'!^90S*)0 P"!!3Z\!S"OZ[!)X<M@^,L<RD"@R,R;:4RD"@RD"Y'Y'"@/:?:)0Y+Y+Y)"@0R@R 4R,R,`_AL-S"1Y])OZELC)1!!!L$8^4ML+!!!!!!!!!!!!!!!!!!!!!!!!A7?RM! !!)^`)K.)0*V_A+<_IK.*?FDK80`,__AK,)]S+FZ!%6)!!_)3!9[O!!"!!)T_AKL ,^9I,]9F,\9G,[9B9@HZO=F+6Q"'F*!"C)1=KOO=F_BMF-6QF_E*C_])3=O=!!HY [AHXO_L1HW])L"F+)!"%F*!"B_1=L+O_0V,U_IL>F+)!"%F*!"C$1=L8O_F>T_"; O_O_3_O_!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Y!&.%W?!&/C3"_!D!N!RQ!@R ":B""/B.!!":B>"/B;!!":AU"/AR!!":AU!!!!F+TU"4F*!"C@1=K7O3CG\"9T33 O3":C="/C:!!!!,`9U,_F2.L,^,_^A[!,]YB9S,\F1OG\!9#)/,[]AL$F>D2";Y! Y!HZL0,Y_AL0F>T_"#Y![!)[_AFB[!,XNK"%``!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!A!``6-`_QW!+`=`W!B !!]AK&/!3!9U*NC3O!!!]AK//*3*9U,`C3O*!!;@)U;A/A3A^)K>G@\!K7\!O3!! !!!!\9)R9R-Q]9KMY+Y+Y+])1Q"^OB!!]I*]*]"^*]?Y3YOP!!!!9Q9R,_;Y,^<2 F0]ACP42L!,]CP\E<2F0]ACP42L*[A?YOZ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!O`[6Q'[ !![!*N;V/!<+3!)_*=<)S*0+Y+Y+Y+C6S*0+C64+K+!!S""^]IO!<*,*,`]IKJ*M _IKN,*"]_I,),*GVO6*<GV*AKH)__AO6,)YB,_<)O6!![!+V;!,^K$!!<(,(*[`! L%F_AC*R,(FNO\!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'[#A`< !!FOF_A4*"FJF_AIF_AUF_AS<M*"<IH`H_*$]I*%_AL3H^K<H]])H\,L,M_IKBH^ L&H[L&HZL&<N,N"XYB<P,M_IKT,PFYJC_IL#M$,P*"_AK[[AL%<M,L_IK`,NH\,N HYL&*MH\<MY!HXHWHVHUK23!O!Y!HXHWHVHUH^L.0TYB0S_AL.*$_IL?F_D^*%_I K-F_G/K-"$J,"DJ,!!IZ!!!!!!!!(4!!!!!!LWLVLBO@K5MFO!K!O7L#M!L9N>P& !!,YYB,Z_IK2,Z<B[",Z"X*;<ZS*0BS"])CH3!O!!!CH])O5S*@YS"[",Y"X*;<Y ,YYB,Z_I2$O5KE!!Q:L!Q?^)2$])KM"T<B*#_IK],B"X*:]IK_*U_IK`,BOH\9<X 3HOH!!<B,VYB,W,X_AL/,BH`L/P#,BS*@VS"[",V"X*9<VP#!![",VYB,W"X_A49 P9!!,X_APB,VYB,W_IPBS*0WS"H`PB[",W"X*9<WPB!!!!!!!!!!!!!!!!!!!!O_ !!,KYB,L_IKC,L<M[",L"X,`<LS*0MS"<M*#_IKA\9*'_AKA,KYB,L"=_AKA[A:' ,M])D#3!O!!!D#])OFS*@KS"[",K"X,`<K,KYB,L]I2%])KV*="=_I*#_IOF*'_I 2'OF!!U"L<U'^)2%])L("T<M*#_IL8,M"X*:]IL:*U_IL;,MP#\9:&4#P#!!*8:( *8:),`<K,`<L:&:':%P>!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=! !!;@*(YB*)*&_AK-+@H`K-O!+@S*>(S"["*("X*8:(O!!!["*(YB*)"X_A37O7!! *'Z%_IKL,_]1*UH`KLY9:'*&_AO@*(YB*)_IO@S*.)S"H`O@["*)"X*8:)O@!!QB L$QG3_[!O_!!*9@^*9@]*;@\*;@[@Z:$P&!!])*SU*L9U/42[!P2[!9242P2!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!LXLZLYLWLV!2P2 "$"0"/"/"&"$"5``I!"'"*"/"*"4")``.9"&"9"*"5``^`"4"&"/"%``5!"("&"5 ``7!"3"&"$"&"*"7"&``7T")"&"-"1``3T``!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"_!P!A"!!N!D"/!R!A!A``!! !!C;).]IK"O!!!,`]IK.,3D%O'*]D%),"M_AK.O'!!<R9-,RC'O5!!CW]IKL,_]I KNY"]IKQ,^_AO;CW,]_AKH9.O;,\DIN!,[DI\9)-9-KL!![!Q:OWQ="X9.\G)._I M`Q;).OW!!<RC;)-`)L.,RD>L'C;,R"=_A1,!*,R,Z]I9,,Y_I[A),9,P%!!QBP> QG[!4>P>,XDIQ;NZ!!<R,WD>LL,RD>LOPI!!!!!!!!!!"?"$!&`T"0"1`P`]`Q`X \!QG+!>ZH`<I,I,__IK]U/U'[!F_3)F_2FF_3GF_3]F_2=,IZ',I,^;>F_!!F_1A KDF_2HF_E*F_1!F_3N,IZ',]9),\D=ET,IZ',I,[9),ZD=ATS+HY!)NZ@X@W8V8V ++,U_AL)+,,T_IL9R:Y!R?Y!3>L-R@L4;AS,PSR:K+;AS,PR;A,Q;CK+!!<J0=9* 4=S*-)=*4JLCS"P=!!!!!!!!!!!!!!!!2Z#,#!-K-CU[VGV"`!`\4O`]3_1C`VY! !!\!)!<#,`9!,#9!\M,__IK=\E,^_AK_[$,]_IKH[ARX[!RZY"_IK^K`[A_"_AK\ RB!0!#Y"_IK[K]Y/]IKR,\]IKZ,[_IKYL"[.,Z_IKWKXY"Y"Y"Y"Y"Y"Y"Y"Y"Y" Y"O!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`Y`G(S`!!#A#Y` !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! end of data After the program exits back to the monitor, you should save the data with: .SAVE SYS FIELD0.SV 00000-07577=0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | leader for direct load file which must be in lower case file contains kermit data in ipl encoded format this file contains data for field one !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! H`,_C1S"0^_IK*,]C1S$P\H[,ZC1S$P\!!9)S*-)]IO1;<-)S"?<K3!!!!,`TS[! CN3S3]3^4"4$4'KB,`TW\9CNO=!!TX4(KP[!T),YD!S"0XS*,WD!,VD!T'T)[!ON !!T*L"T/[!P!`A!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=65Q!(6/%W%!W.('!+&`#= !!TX,`S"TWS*TWS"\7TW,_TWS*\7TW[!TWS"\(TW,^TWS*\(TW,^TWS"["TW,]TW S*["TW,]TWS"["TW,]TW\6TW,\TW,[TW,ZTW\6TS[![!O!#%D5#'TT'=)1'?KG'@ 91'AT''OD4'VD4'_CU(&)2('_I((L.()92(*+9(+T/J&HOJ.HON$)1N%_IN&L<N' 91N(T'P5<&P6)2P7_IP8P2P9,&P:T/!!!!!!!!!!!!!!!!!!!!"D^%#_!6"!!/!9 #%D5#'Y!$6,Q$7TS$8[!$9TX$:4P$;L:$<4P$=L<$>T)$?,S$@DJ$A)($B,R$CDJ $D,T$EDJ$FT'$GT)$KT*$MT/'?T"'AT''_CU(&T*('L.()"T(+T/N$T"N&T'N']) P3"TP5T*P7T/!!$7TW$8\9$>TI$FTG$GTI$KTJ$MTO'?TB'ATG(&TJ(+TON$TBN& TGP5TJP7TO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ??????????????????????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ?>?!?6?/,/08/!?1%1?NV??!?1%1?NY??!?1%1?NYP4!?-*/$?NY?!?1%1?NYP*! ?1%1?NYP-!?1%1?NRS?!?1%1?NYP&!?1%1?NYP"!WRQQ?????!WRSQ?!F?<$?16A 5:1&A*4[A!QWA!A?<6?4*/(A?$?0..6/*$"5*0/4A?1?035?>!A?<6?4*/(A?1?3 */5&3A?1?035?>?!F?14PYA14PRSA04PYA04PRSA04PXYA04PSXYAA,?&3.*5NRS AA?7RQ?(AAA!?4?&15&.#&3A?!F?5?:1&A?)&-1]$3_?A'03A)&-1F?!RZZQ?!`` ?_???!V?_????!Y?_????!Y?P4_??!-*/$NY_!Y?P*_??!Y?P-_??!RS?_???!Y? P&_??!Y?P"_??!XY?_???!SXY?_??!?6?/,/08/!?1%1?NV??!?1%1?NY??!?1%1 ?NYP4!?-*/$?NY?!?1%1?NYP*!?1%1?NYP-!?1%1?NRS?!?1%1?NYP&!?1%1?NYP "!?75?NXY??!?%&$?."5&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F?'?*-&A?"?#035F?!`?*?/7"-*%A$0.."/%?!FI?$?0//&$5*/(A50A)045MA5: 1&A!?$?0/530-N?!A?$?A50A3&563/A50A?!JF?!!!!!!!!!!!`?&?3303A*/A%& 7*$&A/".&!`?%?*4,A'6--B!`?&?3303A$-04*/(A'*-&!`?&?3303A*/A'*-&A/ ".&!?3?&$&*7*/(A'*-&[A?!?4?&/%*/(A'*-&[A?!`?'?*-&A/".&A4:/5"9A&3 303!F?4?611035&%A$0.."/%4A"3&[FF?$0//&$5?AI50A3&.05&A4:45&.JAF?4 &/%A%&7['*-/".O&9?AF?3&$&*7&A%&7[?AI'*-&/".&A"/%A&95&/4*0/A?/05? A"--08&%JF?(&5A%&7['*-/".O&9?F?'*/*4)?AI4&37&3JF?&9*5?AI50A01&3" 5*/(A4:45&.JAF?)&-1?AI5)*4A.&44"(&JFF?&?4$"1&A$)"3"$5&3[A!F?,?&: #0"3%A*/165A&3303BF!`?6?/"#-&A50A5&--A)045A5)"5A4&44*0/A*4A'*/*4 )&%!`?6?/"#-&A50A-0$"5&A'*-&?!?,?&3.*5N?!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!`?3?&$&*7&A'"*-63&?!`?&?3303A*/A3&$&*7&%A'*-&A/".& ?!?6?/"#-&A50A3&$&*7&ANA)"/%-&3!A&3303?!`?6?/"#-&A50A3&$&*7&ANA* /46''*$*&/5A%*3&$503:A41"$&!F?3?&.05&A-*/&A*/165A&3303BF?!`?6?/" #-&A50A3&$&*7&A-"5&45A1"$,&5?!`?6?/"#-&A50A4&/%ANA%*3&$503:A&330 3!`?6?/"#-&A50A4&/%ANA)"/%-&3A&3303!`?6?/"#-&A50A4&/%!`?6?/"#-&A 50A3&$&*7&ANA%"5"A&3303!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! end of data After the program exits back to the monitor, you should save the data with: .SAVE SYS FIELD1.SV 10000-17577=0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | K12GLB.TE 8@U;<C9@@dP^D44PCD59CUA1BDi5CT=584e1@e9?2C4a;DY1CRda>CPh2C0i>S0`2D=:C0d:3@X_ 2EEC@DM5>Pd:3@X_2Bi@@D`P;4\a<Te9E3a4AEHjBc4bCDUD;dD_ARm>;eL92D=BAD5DAB0RDeU= @Tm<Db8PC4UCE4U>Ab16BDa584m>84ACBcX=2Rl9;TeECTLPBc4bAda2;UA5;4\a<U13B0T92EE@ A45DAB14Dd\jBc4bD4=8;U113@X=2Rl9@e95@EA5Db14Dd\jBc4bD4=8;U1184IBCddPA5=;>T\a <U13B2i@@B0ZEdUDB21>Cb12@D=;EE0Z;R1DB4DPEE=5DR1=EE=D3@X_2D=BAD5DAB11CUTP@T53 BeE@84I9C4DPATUBDe@P:51BAE=ECD52C5TPATmB84=?CE11DTUCCdhPD5EBD4mCAE<PE4lPDdE5 3@X_2EM8@E@PDTE3ADiDC5TP@dQ1CTM5A2T^3@X=2Rl9@e95@EA5Db14Dd\jAE5E@EA5;UA=85M9 E4PPEE14@EA5A211ATI5@eA5A215DEE1E4EC84m>C5TP@E<P@DhP@E9DBDI1@e@^3@X=2Rl9@DiI 84EAED5DAD@PDeU=@Tm<Db12AEAGADE>85A8AB1CD4E3BD5<84A5C4U=BEA5DU<P@E9585E@A45D AD@^3@X=2Rl9E4Q585=@AD=9@D`PA4E<BDe9E4EBDb11DTDP8Sa3DShlC4Hn;blR85M8BD=884eE De@PD595@dE4AB11CT@PADi485A8AB17C4m2@D`=2Rl9DeU=@Tm<Db1DCb12AB15DEE1E4E4;R1? CTaI84EAED5DAB1CE45DADe5CUAC845>A212C45>Bb1<BDi5Db11CT@P?4I6?Pd:;`U3B45B@D=D AE9C845BAB11C4a?EdE48495E5M5ADhPE4Q585=@AD=9@D`PA4E<BDe9E4EBDbh=2Pd:;`U1CUTP DeU=@Tm<84i?E218@EI9CTLP@B1=@E=DAE8PET5<EDDPBDhPBc4bCDUD;TaC85M9C4`P@TDP@dQ1 CTM5A21DCb1185I1C5E53@X_2Dm683Ti>CTPE4lPATmB@dDP@DhP@E=CADe2C5TPAE9BCe8^3@X= 2R4=2T0E<14EFA\Q@B5J8TE5ATdb9dQH@DXjD`hC6b95B51GADI=<RMB;UDiBCYO4a]C?A]B3@X^ ;BQA>B\c:Bdf8TMA>B\c:cI:9d199A<KECPUDCT\;UPi3@Y5DT\a<Te9E2i<Da]ICCU=<C0\;U0` ;2i;Cd4K4@d:@1Da4E4h8ThQ@R4`@BdN8295@dm26bL?G5Di9dQ;Ad5:DcdKDCPRA@5>Cb1F@DaE AB16Ce8P0@d:BU<>4a]B;UDiDcdKDU4i;2iD0@d:0BE59e<>4a]B3@X^EC5L6e4a;2i;DCPRADTi >CTi6bMA>29>DCTV=c0`<2la<30`G54i9SL`<2la<31LDCTV=c0_<C1LDCTV=e`W14`A3@Y05C8A DEPRAA0WBTMHBQ9B6eLKB5QGCEM=F5U>3@X_;a]<<2`^D4EBAE5E@EA5;UA=6eTjCPhH6a]=F39O 3@X_;a\`C30\;T]AAB9>?3hWAEPA3@Y05D4AFEl=2Rl_6d``;2i;8EPQ>U<K8TEJBS4bBA]1CePK 9`d:<4`^;5Y;CC0A3@Y5EdEAED5DABiDCA]J8Ti:>U<^6b95FTY9;U116bM:BDEB6eY:<SM96`d: <5QHCEPUF1]=@BL1Ce15CR19CU1EE216BDa5845>A21DFE1582M=@BLPE4lPDeA1DU@13@XJ~~~~ ~? |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | (REMARK Image File Created by PDP-8: 05-Sep-1990) (REMARK File Date: 11-Jan-1988) (FILE K12GLB.TE) (REMARK File decodes to K12GLB.TEC aka GLOBAL.TEC, a TECO macro for) (REMARK file maintenance of KERMIT-12 source files.) <88DGIKOG68I3SI15010K9MA18JGL8H4L9P2EAGQ2056K8FQI628J2GMH98QE2B9JJ0S31> <69G6EG30G4Q8C2CK390RS5514QL8GAKE0TA1KGDU2IGI0N2842C6B0KMGP99L2K8F1KB9> <B39CHHAJA4I8NV8L26SBO2V5BL14I3AHA4292I412JQMA45H7IAC12AJ1KIHAE9527C82> <4IL6443IFA81K815T780AIBQISL6I9O276IP32H3I9H1EAL1IO55K68QG0I4GIK4GALA4> <8GA4AGG3AEIB6IP32H888D1E2K00RK501A9F8GQL4H0LAH2J881L795J9CHH8K446GN1A> <1904HH4U16K8IQJ6EGKMGP3A1A80BH438G5AT298I720H7I4121MGP5B9855P104I04AH> <ALAD2IQ82LAH9I1NOAA2946L2K85252814S1CK88Q1AIO5AGG98OIC0HAKC94IAC2KAA1> <50L2LAD2D4G94O1CL8OIF887K6H6HA1AI6I94U175A0ILAK1KU92GACIK0JQ56L2I1NOA> <82C5E90GAH2I6HAKAH729G2P8GOKGH758SI4SA80RK501A9F8GQL4H0LAH2J881L795L8> <LAH8GAL8GNDAH10ILP58144AL2G8GAL8H214126AHI46LA48H908K8LALA38L10SJP4O1> <CI842J4G84SL0KA9292HH47PA01N8A02KIUL0P9P902HALAH0I8K248KULIH1C9T2J482> <KATA48NI588458L2J412G6HA4JH0K41A48J6KIH4LAGII0KQ42L95402LAH24292U8G0D> <Q2G0L4NKAHA8A8056H2P8CI10J249H2K96ADAL14AH9H40II0HA24CU3AB1U6J74C8NI5> <T10GLQ4J11L41AD4KO58H85A9238HA4A4G29O248HA4SGG8AH25E824O97G87AC02KIUH> <9TB522OJQL6GG49SH08HAI0H8HAL2K8HA2TSG59QACA80KALAK85A5682L8H0K8LADAJH> <L8GGE85244824PP0K9F108IAKSH9H40IE0H23OP307QGD8BPGIL4285A18GQKAD9540I1> <8H8I0H6F9H2N8HA20L14AHAN4H84SHA591900KQ4B51I842C8H64AH4P9LAK4H857KN01> <AGD8BOGI970B52JQMA45H7K43QE8L420H0PAOIE0HQ43KG5852J4H854HBC84IL0H94I1> <739CHHAJA4IKN39H10ILP4O16288258GOKGH758TA48824U4G440AM8J2LA86V1909CJP> <I14SI741P4L04UL329SI30H94217584QJ8H94Q960B5A54KH4VP901N8A02MI2455809G> <A495I4DL86H188IKAD329L97GI1K3951ACOE86QI4L47A125QHIJ48JJ5QALAIFJKK9J3> <D9T46P0RO555K986E9IMCKM5L922HPJICLK5EHM89SK04IR2CILAE153GSJ5QAO83AGKD> <919D1IIJA59GN5AE8R8JEJI8OS60PE0K22PCN19UQ104D0QD012KOHGK92457388112GF> <2QGG549234JO1NSJJBIAL89TKGH3Q84AJMF9528S48NG1AJR20L0L9H25C814U19006GD> <0IN56K9I3CPEIL8L7CUJAAAHAB22S00Q1L01A982FP9L2CGR43F0KLAS64OR2KA2PCN2A> <4HO6HCKICSP758R29Q3HOH2A5HP6DO30CO15SPG0C1LP58J4O1N6C0IUKOC60IHCE93FS> <O5671G4KB3I8RNBG842J20Q0512K9I4K95G92N21AAGHQKK8913EQNAI3LGH6TAT2OSM9> <0RS545V0R4C72OL828LA5AKA42LA45RAK66T5I5781P0RQ6QLHSP21NOA6BO1M96C619E> <2IQ4BOH27HPU2H8LGG6G188L2G85JLFI1BPF66O4OGMB5OH12M0JLD9L4AI56IH32H4H3> <CAFMM02F86I63IC8B5LK56H610DA2ILE52LAL21AHA2SL6Q3D12KJH3LP9K3D928MKKKG> <N1A10RK9QKI92K3EIQ8CKJE0DQ1L9GGM14QLC4B38R0G8IEH7LA12EI82KSL84AHH08IA> <KOGGE85A48825IL8443974G82E9A09T2J2L0545A11MGAX003IZAEFEFVVVVVVV> (END K12GLB.TE) (REMARK End of File) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | This is an example of an ODT session to manually enter the IPL0.SV program followed by an explicit SAVE command. This is identical to loading the binary produced by IPL0.PA, a customized version of K12IPL.PAL. Locations marked with * are modified according to the REC parameter; locations marked with ** are modified according to the SEN parameter; locations marked with *** are modified according to the BRATE parameter. All values in this example are obtained using default parameters. All commands are normally terminated with CR except within ODT. In ODT all commands are terminated with LF to automatically advance to the next location, except the final numeric command which terminates with CR to end the loading. The xxxx indicates the former contents which are to be ignored. Exit from ODT is via ^C. .ODT 10200/xxxx 6032 10201 /xxxx 1236 10202 /xxxx 6413 ** 10203 /xxxx 6031 10204 /xxxx 5203 10205 /xxxx 6036 10206 /xxxx 6416 ** 10207 /xxxx 6046 10210 /xxxx 6406 * 10211 /xxxx 6201 10212 /xxxx 4236 10213 /xxxx 5212 10214 /xxxx 5217 10215 /xxxx 4236 10216 /xxxx 5232 10217 /xxxx 7106 10220 /xxxx 7006 10221 /xxxx 7006 10222 /xxxx 3635 10223 /xxxx 4236 10224 /xxxx 5232 10225 /xxxx 1635 10226 /xxxx 3635 10227 /xxxx 2235 10230 /xxxx 0177 10231 /xxxx 5215 10232 /xxxx 7600 10233 /xxxx 6203 10234 /xxxx 5632 10235 /xxxx 0000 10236 /xxxx 0007 *** 10237 /xxxx 6401 * 10240 /xxxx 5237 10241 /xxxx 6406 * 10242 /xxxx 0230 10243 /xxxx 1256 10244 /xxxx 7510 10245 /xxxx 5237 10246 /xxxx 1255 10247 /xxxx 7500 10250 /xxxx 5636 10251 /xxxx 0254 10252 /xxxx 2236 10253 /xxxx 5636 10254 /xxxx 0077 10255 /xxxx 7700 10256 /xxxx 7737 ^C .SAVE SYS IPL0 ;10200 IPL0.SV is now ready to run as documented in K12IPL.PAL. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | This is an example of an ODT session to manually enter the IPL1.SV program followed by an explicit SAVE command. This is identical to loading the binary produced by IPL1.PA, a customized version of K12IPL.PAL. Locations marked with * are modified according to the REC parameter; locations marked with ** are modified according to the SEN parameter; locations marked with *** are modified according to the BRATE parameter. All values in this example are obtained using default parameters. All commands are normally terminated with CR except within ODT. In ODT all commands are terminated with LF to automatically advance to the next location, except the final numeric command which terminates with CR to end the loading. The xxxx indicates the former contents which are to be ignored. Exit from ODT is via ^C. .ODT 00200/xxxx 6032 00201 /xxxx 1236 00202 /xxxx 6413 ** 00203 /xxxx 6031 00204 /xxxx 5203 00205 /xxxx 6036 00206 /xxxx 6416 ** 00207 /xxxx 6046 00210 /xxxx 6406 * 00211 /xxxx 6211 00212 /xxxx 4236 00213 /xxxx 5212 00214 /xxxx 5217 00215 /xxxx 4236 00216 /xxxx 5232 00217 /xxxx 7106 00220 /xxxx 7006 00221 /xxxx 7006 00222 /xxxx 3635 00223 /xxxx 4236 00224 /xxxx 5232 00225 /xxxx 1635 00226 /xxxx 3635 00227 /xxxx 2235 00230 /xxxx 0177 00231 /xxxx 5215 00232 /xxxx 7600 00233 /xxxx 6203 00234 /xxxx 5632 00235 /xxxx 0000 00236 /xxxx 0007 *** 00237 /xxxx 6401 * 00240 /xxxx 5237 00241 /xxxx 6406 * 00242 /xxxx 0230 00243 /xxxx 1256 00244 /xxxx 7510 00245 /xxxx 5237 00246 /xxxx 1255 00247 /xxxx 7500 00250 /xxxx 5636 00251 /xxxx 0254 00252 /xxxx 2236 00253 /xxxx 5636 00254 /xxxx 0077 00255 /xxxx 7700 00256 /xxxx 7737 ^C .SAVE SYS IPL1 IPL1.SV is now ready to run as documented in K12IPL.PAL. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 | / IPL GENERATING PROGRAM / LAST EDIT: 08-OCT-1991 12:00:00 CJL / MUST BE ASSEMBLED WITH '/F' SWITCH SET. / THIS IS A UTILITY NAMED IPLGEN (AKA K12IPG) TO CREATE FIELD0.IPL (AKA / K12FL0.IPL) AND FIELD1.IPL (AKA K12FL1.IPL). THESE FILES ARE IN TURN MEANT / FOR USE WITH THE DIRECT LOADING PROGRAM IPLOAD (AKA K12IPL). FUTURE VERSIONS / OF K12MIT.SV MAY "GROW" TO USE FIELD TWO, IN WHICH CASE THIS PROGRAM WILL HAVE / TO BE CHANGED. / THIS PROGRAM ALWAYS RESIDES IN THE NEXT FIELD BEYOND K12MIT.SV, AND CREATES / FILES FOR ALL FIELDS LOWER THAN ITS LOADING FIELD. THIS CURRENTLY REQUIRES A / 12K MACHINE TO ENCODE ALL LOCATIONS 00000-07577 AND 10000-17577. / USAGE: / SINCE K12MIT.SV IS A COMPLETE IMAGE FILE, IT MUST BE LOADED FIRST IN IMAGE / MODE, AND THEN OVERLAYED WITH THE BINARY OF THIS ASSEMBLY: / .PAL IPLGEN<IPLGEN/E/F ASSEMBLE IPLGEN PROGRAM. / .LOAD K12MIT.SV/I$*IPLGEN/G=20200 LOAD K12MIT.SV IN IMAGE MODE; THE $ / INDICATES USING <ESC> TO TERMINATE / THE LINE; THEN LOAD IPLGEN AND START. / THE FILES SYS:FIELD0.IP AND SYS:FIELD1.IP WILL BE CREATED AND THE PROGRAM / EXITS TO THE KEYBOARD MONITOR. THE RESULTANT FILES MAY BE EDITED AS LONG AS / THE RULES OF .IPL FORMAT ENCODING ARE OBEYED (ADDITIONAL LOWER-CASE LEADER / COMMENTS SHOULD BE ADDED AT THE BEGINNING, AND UNRESTRICTED COMMENTS AT THE / END). / ERROR MESSAGES: / ERROR NUMBER PROBABLE CAUSE / 5 ERROR WHILE ATTEMPTING TO ENTER OUTPUT FILE. / 6 OUTPUT FILE LARGER THAN AVAILABLE FILE SPACE. / 7 ERROR WHILE CLOSING THE OUTPUT FILE. / 8 I/O ERROR WHILE ENCODING FILE DATA. / EQUATED SYMBOLS. CLOSE= 4 /CLOSE OUTPUT FILE DFIELD= 2 /PROGRAM LOADS INTO FIELD TWO (ALSO OUTPUT COUNT) DFLD= DFIELD^10 /PROGRAM FIELD FOR CDF INSTRUCTIONS ENTER= 3 /ENTER TENTATIVE FILE NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL7777= CLA CMA /LOAD AC WITH 7777 SBOOT= 7600 /MONITOR EXIT SYSENTR=7607 /CALL SYS: HANDLER HERE USERROR=7 /USER SIGNALLED ERROR USRENT= 7700 /USR ENTRY POINT WHEN NON-RESIDENT USRFLD= 10 /USR FIELD WRITE= 4000 /I/O WRITE BIT FIELD DFIELD /WHERE WE LOAD *20 /GET PAST AUTO-INDEX AREA BUFPTR, .-. /OUTPUT BUFFER POINTER DANGCNT,.-. /DANGER COUNT FOR OUTPUT FILE FCNT, -DFIELD /FIELD, FILE COUNTER FNAME, FILENAM FIELD0.IP /OUTPUT FILE NAME FIELD LATEST, .-. /LATEST OUTPUT CHARACTER OUTRECO,.-. /OUTPUT RECORD SCRCASE,.-. /CURRENT MESSAGE CASE SCRCHAR,.-. /LATEST MESSAGE CHARACTER SCRPTR, .-. /MESSAGE POINTER TEMPTR, .-. /TEMPORARY OUTPUT POINTER WRDADR, .-. /WORD ADDRESS WRDCNT, .-. /WORD COUNTER DSETUP, .-. /DATA FIELD SETUP DATFLD, CDF 00+.-. /WILL BE LATEST DATA FIELD JMP I DSETUP /RETURN TO CALLER PAGE /START AT THE BEGINNING BEGIN, NOP /IN CASE WE'RE CHAINED TO LOOP, TAD (FNAME) /POINT TO DCA ENTAR1 /STORED FILENAME DCA ENTAR2 /CLEAR SECOND ARGUMENT NL0001 /SYS: IS ALWAYS DEVICE ONE CDF DFLD /INDICATE OUR CALLING FIELD CIF USRFLD /GOTO USR FIELD JMS I (USRENTRY) /CALL USR ROUTINE ENTER /ENTER TENTATIVE FILENAME ENTAR1, .-. /WILL POINT TO FILENAME ENTAR2, .-. /WILL BE ZERO JMP ENTERR /ENTER ERROR TAD ENTAR1 /GET RETURNED FIRST RECORD DCA OUTRECORD /STORE IT TAD ENTAR2 /GET RETURNED EMPTY LENGTH IAC /ADD 2-1 FOR OS/278 CRAZINESS DCA DANGCNT /STORE AS DANGER COUNT NL7777 /INDICATE INITIALIZATION JMS I [PUTBYTE] /INITIALIZE OUTPUT FILE JMS LEADER /OUTPUT LEADER JMS I (DOFLD) /OUTPUT LATEST FIELD'S DATA JMS TRAILER /OUTPUT TRAILER TAD ("Z&37) /GET <^Z> CLOSLUP,JMS I [PUTBYTE] /OUTPUT A BYTE (^Z OR NULL) TAD BUFPTR /GET THE OUTPUT BUFFER POINTER TAD (-OUTBUFFER) /COMPARE TO RESET VALUE SZA CLA /SKIP IF IT MATCHES JMP CLOSLUP /ELSE KEEP GOING NL0001 /GET SYS:'S DEVICE NUMBER CDF DFLD /INDICATE OUR CALLING FIELD CIF USRFLD /GOTO USR FIELD JMS I (USRENTRY) /CALL USR ROUTINE CLOSE /CLOSE OUTPUT FILE FNAME /POINTER TO FILENAME OUTCNT, .-. /WILL BE ACTUAL COUNT JMP CLSERR /CLOSE ERROR ISZ FNAME+2 /BUMP THE FILENAME TAD DATFLD /GET CURRENT DATA FIELD TAD (10) /BUMP TO NEXT FIELD DCA DATFLD /STORE BACK ISZ FCNT /DONE ALL FIELDS YET? JMP LOOP /NO, GO DO IT AGAIN CIF CDF 00 /YES, GOTO MONITOR FIELD JMP I [SBOOT] /EXIT TO MONITOR / ERROR WHILE OUTPUTTING THE FILE. PROCERR,NL0002 /SET INCREMENT SKP /DON'T USE NEXT / ERROR WHILE CLOSING THE OUTPUT FILE. CLSERR, NL0001 /SET INCREMENT SKP /DON'T CLEAR IT / OUTPUT FILE TOO LARGE ERROR. SIZERR, CLA /CLEAN UP TAD (3) /SET INCREMENT SKP /DON'T USE NEXT / ENTER ERROR. ENTERR, NL0002 /SET INCREMENT TAD (3) /ADD ON OFFSET DCA ERRNUMBER /STORE ERROR NUMBER CDF DFLD /ENSURE OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I (USRENTRY) /CALL USR ROUTINE USERROR /USER ERROR ERRNUMB,.-. /WILL BE PASSED ERROR NUMBER / LEADER ROUTINE. LEADER, .-. /LEADER ROUTINE JMS I (SCRIBE) /CALL SCRIBE ROUTINE LEADMSG /FOR LEADER MESSAGE TAD DATFLD /GET CURRENT FIELD RTR;RAR /MOVE DOWN AND (7) /JUST FIELD NUMBER TAD (NTABLE) /POINT TO TABLE ELEMENT DCA MSGPTR /STASH THE POINTER TAD I MSGPTR /GET THE MESSAGE ADDRESS DCA MSGPTR /STORE IN-LINE JMS I (SCRIBE) /CALL SCRIBE ROUTINE MSGPTR, .-. /WILL POINT TO CORRECT MESSAGE JMP I LEADER /RETURN / TRAILER ROUTINE. TRAILER,.-. /TRAILER ROUTINE JMS I (SCRIBE) /CALL SCRIBE ROUTINE SAVEMSG /END OF FILE MESSAGE JMS OUTFLD /OUTPUT FIELD DIGIT JMS I (SCRIBE) /CALL SCRIBE ROUTINE SVMSG /.SV BRIDIGING MESSAGE JMS OUTFLD /OUTPUT FIELD DIGIT JMS I (SCRIBE) /CALL SCRIBE ROUTINE SV0MSG /0000 BRIDGING MESSAGE JMS OUTFLD /OUTPUT FIELD DIGIT JMS I (SCRIBE) /CALL SCRIBE ROUTINE SVEMSG /FINISHING MESSAGE JMP I TRAILER /RETURN OUTFLD, .-. /OUTPUT FIELD DIGIT ROUTINE TAD DATFLD /GET OUTPUT FIELD RTR;RAR /MOVE OVER AND (7) /JUST FIELD DIGIT TAD ("0&177) /MAKE IT ASCII JMS I [PUTBYTE] /OUTPUT IT JMP I OUTFLD /RETURN PAGE DOFLD, .-. /DO LATEST FIELD ROUTINE DCA WRDADR /CLEAR WORD ADDRESS TAD (-7600) /SETUP THE DCA WRDCNT /WORD COUNT WRDLUP, JMS DSETUP /GOTO DATA FIELD TAD I WRDADR /GET A WORD DCA DSETUP /SAVE IT CDF DFLD /BACK TO OUR FIELD TAD DSETUP /GET THE WORD AGAIN RTR;RTR;RTR /WANT HIGH-ORDER HALF FIRST JMS DOBYTE /OUTPUT HIGH-ORDER BYTE TAD DSETUP /GET THE WORD AGAIN JMS DOBYTE /OUTPUT LOW-ORDER BYTE ISZ WRDADR /BUMP TO NEXT ADDRESS TAD WRDADR /GET LATEST ADDRESS AND (37) /JUST LOW-ORDER BITS SNA CLA /SKIP IF NOT AT GOOD BOUNDARY JMS PUTCRLF /ELSE OUTPUT LINE BREAK ISZ WRDCNT /DONE ALL WORD YET? JMP WRDLUP /NO, KEEP GOING JMP I DOFLD /YES, RETURN TO CALLER DOBYTE, .-. /OUTPUT A SIX-BIT BYTE ROUTINE AND (77) /JUST SIX BITS TAD (41) /ADD ON OFFSET TO MAKE IT PRINTABLE JMS I [PUTBYTE] /OUTPUT IT JMP I DOBYTE /RETURN / <CR>/<LF> ROUTINE. PUTCRLF,.-. /OUTPUT <CR>/<LF> ROUTINE TAD ("M&37) /GET A <CR> JMS I [PUTBYTE] /OUTPUT IT TAD ("J&37) /GET A <LF> JMS I [PUTBYTE] /OUTPUT IT JMP I PUTCRLF /RETURN / MESSAGE PRINT ROUTINE. SCRIBE, .-. /MESSAGE PRINT ROUTINE TAD I SCRIBE /GET IN-LINE POINTER ARGUMENT DCA SCRPTR /STASH THE POINTER ISZ SCRIBE /BUMP PAST ARGUMENT TAD (140) /INITIALIZE TO DCA SCRCASE /LOWER-CASE SCRLUP, TAD I SCRPTR /GET LEFT HALF-WORD RTR;RTR;RTR /MOVE OVER JMS SCRPRNT /PRINT IT TAD I SCRPTR /GET RIGHT HALF-WORD JMS SCRPRNT /PRINT IT ISZ SCRPTR /BUMP TO NEXT PAIR JMP SCRLUP /KEEP GOING SCRPRNT,.-. /CHARACTER PRINT ROUTINE AND (77) /JUST SIX BITS SNA /END OF MESSAGE? JMP I SCRIBE /YES, RETURN TO ORIGINAL CALLER DCA SCRCHAR /NO, SAVE FOR NOW TAD SCRCHAR /GET IT BACK TAD (-"%!200) /IS IT "%"? SNA /SKIP IF NOT JMP SCRCRLF /JUMP IF IT MATCHES TAD (-"^+100+"%) /IS IT "^" SNA CLA /SKIP IF NOT JMP SCRFLIP /JUMP IF IT MATCHES TAD SCRCHAR /GET THE CHARACTER AND (40) /DOES CASE MATTER? SNA CLA /SKIP IF NOT TAD SCRCASE /ELSE GET PREVAILING CASE TAD SCRCHAR /GET THE CHARACTER JMS I [PUTBYTE] /OUTPUT THE CHARACTER JMP I SCRPRNT /RETURN SCRCRLF,JMS PUTCRLF /OUTPUT <CR>/<LF> JMP I SCRPRNT /RETURN SCRFLIP,TAD SCRCASE /GET CURRENT CASE CIA /INVERT IT TAD (140+100) /ADD SUM OF POSSIBLE VALUES DCA SCRCASE /STORE NEW INVERTED CASE JMP I SCRPRNT /RETURN PAGE PUTBYTE,.-. /OUTPUT A BYTE ROUTINE SPA /ARE WE INITIALIZING? JMP PUTINITIALIZE /YES AND (177) /JUST IN CASE DCA LATEST /SAVE LATEST CHARACTER TAD LATEST /GET LATEST CHARACTER JMP I PUTNEXT /GO WHERE YOU SHOULD GO PUTNEXT,.-. /EXIT ROUTINE JMP I PUTBYTE /RETURN TO MAIN CALLER PUTINIT,CLA /CLEAN UP TAD OUTRECORD /GET STARTING RECORD OF TENTATIVE FILE DCA PUTRECORD /STORE IN-LINE DCA I (OUTCNT) /CLEAR ACTUAL FILE LENGTH PUTNEWR,TAD (OUTBUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER PUTLOOP,JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT TAD BUFPTR /GET POINTER VALUE DCA TEMPTR /SAVE FOR LATER ISZ BUFPTR /BUMP TO NEXT JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT JMS PUTNEXT /GET A CHARACTER RTL;RTL /MOVE UP AND (7400) /ISOLATE HIGH NYBBLE TAD I TEMPTR /ADD ON FIRST BYTE DCA I TEMPTR /STORE COMPOSITE TAD LATEST /GET LATEST CHARACTER RTR;RTR;RAR /MOVE UP AND AND (7400) /ISOLATE LOW NYBBLE TAD I BUFPTR /ADD ON SECOND BYTE DCA I BUFPTR /STORE COMPOSITE ISZ BUFPTR /BUMP TO NEXT TAD BUFPTR /GET LATEST POINTER VALUE TAD (-2^200-OUTBUFFER) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP PUTLOOP /KEEP GOING ISZ DANGCNT /TOO MANY RECORDS? SKP /SKIP IF NOT JMP I (SIZERR) /JUMP IF SO CDF DFLD /SET OUR FIELD CIF 00 /GOING TO SYSTEM FIELD JMS I (SYSENTRY) /CALL I/O HANDLER 2^100+DFLD+WRITE /WRITE SOME PAGES FROM OUTPUT BUFFER OUTBUFFER /BUFFER ADDRESS PUTRECO,.-. /WILL BE LATEST RECORD NUMBER JMP I (PROCERR) /OUTPUT ERROR! ISZ I (OUTCNT) /BUMP ACTUAL LENGTH ISZ PUTRECORD /BUMP TO NEXT RECORD JMP PUTNEWRECORD /KEEP GOING PAGE / TEXT MESSAGES. LEADMSG,TEXT "LEADER FOR DIRECT LOAD FILE WHICH MUST BE IN LOWER CASE%" TEXT "%FILE CONTAINS KERMIT DATA IN IPL ENCODED FORMAT%%" TEXT "THIS FILE CONTAINS DATA FOR FIELD" ONEMSG, TEXT " ONE%%^" SAVEMSG,TEXT "END OF DATA%%^A^FTER THE PROGRAM EXITS BACK TO THE MONITOR, " TEXT "YOU SHOULD SAVE THE DATA WITH:%%.^SAVE SYS FIELD^" SVMSG, TEXT ".^SV " SV0MSG, TEXT "0000-" SVEMSG, TEXT "7577=0%" ZEROMSG,TEXT " ZERO%%" / DIGIT MESSAGE POINTER TABLE. NTABLE, ZEROMSG /POINTER TO ZERO MESSAGE ONEMSG /POINTER TO ONE MESSAGE PAGE /GET TO A GOOD BOUNDARY OUTBUFF=. /OUTPUT BUFFER HERE $ /THAT'S ALL FOLK! |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: Initial Program Load (.IPL) format description Some of the latest KERMIT-12 binary files are encoded in a specialized format designed to allow direct memory loading without an elaborate protocol such as KERMIT. This document will describe the internal encoding of this format known as IPL, and related subjects. The Initial Program Load (.IPL) format is designed expressly for use with the IPL loading program. An error-free connection to a serving host is required as no checking or recovery is performed by the program. (The program itself is meant to be keyed in on the target PDP-8 where there is no other means of acquiring KERMIT-12.) The format is also meant to be "printable" in the same sense as ENCODE, .BOO, or uuencode files. This makes the file format more "friendly" to the host system, and allows simple editing of the file to insert comments, etc. An .IPL file starts with at least one lower-case character (not counting `) meaning any character in the range 141-177 octal. Any number of similar characters may follow immediately to create an arbitrary length leader, but the lower-case requirement must be strictly enforced. Once a non-lower-case character is encountered, it is accepted as the first data character. Data characters continue throughout the rest of the file until the next occurrence of a lower-case character which ends the loading. Any characters past this point are ignored and can be freely added as a trailing comment. Throughout the entire .IPL file, control characters and <SPACE> (000-040 octal) are ignored and may be used within the leader to make the file comment(s) more readable. In some loading situations, <NUL> or <SPACE> characters may be pre-pended to the file to give the operator sufficient time to run down the hall between machines in different rooms to start the PDP-8 loading program after first starting the server. Data lines are broken every 64 characters with <CR>/<LF> to make the file more "readable" to the host system. Each data character in the body of the file represents six bits of PDP-8 data encoded in the form (value+041 octal). This causes 00 octal to be represented as ! through 77 octal to be represented as `. Data characters are taken in pairs where the first character is the upper six bits and the second is the lower six bits of a twelve bit word. Loading is implied to start at 0000 of the loading field and continues through at most 7577. The operating system generally prohibits loading into 7600-7777. This is not a problem since KERMIT-12 conforms to these limitations as a matter of design. If the loading field is 3 or greater (or possibly 2 in certain configurations) then the entire field can possibly be loaded. This is never recommended because such a file would violate loading restrictions of certain configurations. (The general rule is to never load into x7600-x7777 for any field x in the range 0-7.) The loading field itself is not contained in the file data, so it is the user's responsibility to setup the loading program parameters accordingly. File comments (in lower-case if in the leader) often contain this information to aid the user. After loading is complete, the loading program exits to the operating system. The user must save the recently loaded data as an image (.SV) file by providing explicit arguments to a SAVE command. It is recommended that the appropriate command be contained in the trailer of the .IPL file as a comment. Placement at the end of the file allows the commentary to be in upper-case, thus allowing it to be given in the exact form required by OS/8. Certain characters such as "." are required in the complete documentation of these commands which are not allowed in the leader area. The leader can contain a comment referring the user to the end of the file for the information itself. [end of file] |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | / INITIAL PROGRAM LOADER / LAST EDIT: 06-OCT-1991 05:00:00 CJL / MAY BE ASSEMBLED WITH '/F' SWITCH SET. / THIS PROGRAM IS USED TO LOAD BINARY PROGRAMS IN .IPL FORMAT DIRECTLY. AN / ERROR-FREE PATH IS ASSUMED BETWEEN THE PDP-8 (OR DECMATE) AND THE DATA SERVER. / SUCH A CONNECTION COULD BE ESTABLISHED BETWEEN THE PDP-8 AND A NEARBY PC USING / A SHORT RS-232 CABLE WITH NULL MODEM. THIS UTILITY IS WRITTEN FOR THE EXPRESS / PURPOSE OF LOADING KERMIT-12 ON PDP-8 SYSTEMS WITHOUT IT. ONCE KERMIT-12 HAS / BEEN LOADED, ITS USE SUPERSEDES THIS PROGRAM ENTIRELY. / THERE IS NO FLOW-CONTROL PROTOCOL PER SE BETWEEN SYSTEMS, SINCE THE UTILITY / STORES DATA DIRECTLY INTO PDP-8 MEMORY AND THEREFORE DOESN'T REQUIRE / SYNCHRONIZATION DELAYS. INITIAL SYNCHRONIZATION CAN BE ACCOMPLISHED BY / SENDING A SINGLE CHARACTER FROM THE PDP-8 TO THE SERVER SIDE WHICH STARTS THE / TRANSMISSION. ALTERNATIVELY THE PDP-8 PROGRAM CAN BE STARTED FIRST, THEN THE / SERVER CAN SEND DATA DIRECTLY TO THE PDP-8; THIS ASSUMES THE ABILITY TO START / THE SERVER TRANSMISSION FROM THE SERVER'S END. / THIS PROGRAM IS FOR ANY MODEL PDP-8 WITH A KL-STYLE REMOTE LINE SERIAL / INTERFACE OR EQUIVALENT. DEFAULT PARAMETER VALUES ARE CONSISTENT WITH THE / DISTRIBUTION SETTINGS FOR KERMIT-12 ITSELF AND ARE EASILY CHANGED. IT CAN BE / MODIFIED FOR USE ON VARIOUS DECMATE MODELS, BUT WILL BECOME SOMEWHAT LARGER IN / THE PROCESS DUE TO THE MUCH GREATER COMPLEXITY OF THE VARIOUS DECMATE / COMMUNICATIONS INTERFACES UNLESS THE COMPATIBLE PRINTER PORT IS CHOSEN (DEVICE / 32/33). / THIS PROGRAM SHOULD ONLY BE USED IF NO OTHER METHOD IS AVAILABLE AS THE / ASSUMPTION OF AN ERROR-FREE CONNECTION IS UNRELIABLE. DISTRIBUTION PATHS SUCH / AS INTERNET FTP OR CONTACTING THE AUTHOR CAN YIELD COMPLETE COPIES OF THE / PROGRAM DISTRIBUTION ON APPROPRIATE MEDIA WHERE APPLICABLE. / USAGE: / THIS PROGRAM IS RESTRICTED TO A SINGLE-FIELD LOAD ONLY. SEVERAL VARIANT / VERSIONS MUST BE CREATED TO COMPLETELY LOAD KERMIT-12. (AS OF THIS WRITING, / ONLY A FIELD ZERO AND FIELD ONE VERSION NEED BE CREATED. HOWEVER, KERMIT-12 / MAY BECOME LARGER!). THE EXAMPLE GIVEN BELOW ILLUSTRATES USAGE FOR FIELD ONE. / REPEATING THE PROCESS WITH THE INTENDED CONTENTS OF ALL OTHER FIELDS WILL / (EVENTUALLY) YIELD AN ENTIRE COPY OF KERMIT-12: / .R IPL1 (OR RUN DEV IPL1) / [PRESS AN APPROPRIATE KEY (SUCH AS CR) TO START WAITING FOR THE TRANSFER] / [THE DATA IS TRANSFERRED FROM THE OTHER SYSTEM AT THIS TIME AND THE PROGRAM / EXITS AUTOMATICALLY TO THE KEYBOARD MONITOR.] / .SAVE DEV FIELD1.SV 10000-17577=0 / CHANGING ALL OF THE ONES IN THE ABOVE EXAMPLE TO ZERO WILL YIELD THE / FIELD-ZERO LOAD FILE FIELD0.SV AS WELL. DEV IS ANY CONVENIENT OS/8 DEVICE / SUCH AS SYS OR DSK. (IT ISN'T CRITICAL SINCE THESE FILES CAN BE DELETED ONCE / KERMIT-12 IS CREATED.) ONCE ALL PORTIONS OF KERMIT-12 HAVE BEEN OBTAINED, THE / FOLLOWING COMMANDS WILL COMBINE THEM INTO THE STANDARD RELEASE FILE K12MIT.SV: / .LOAD DEV:FIELD1.SV/I,FIELD0.SV/I$ LOAD IMAGE FILES FIELD1.SV, FIELD0.SV / WITH /I SWITCH SET. (FUTURE VERSIONS / MAY REQUIRE LENGTHENING THE COMMAND TO / ADD MORE FILES SUCH AS FIELD2.SV, / FIELD3.SV, ETC.) $ INDICATES USING / <ESC> TO TERMINATE LINE. / .SAVE DEV K12MIT=1 SAVE COMPLETED FILE ON ANY AVAILABLE / DEVICE DEV (PREFERABLY SYS). / CREATING THE VARIANT VERSIONS. / ONLY ONE PARAMETER NEED BE CHANGED TO PRODUCE THE VARIOUS VERSIONS REQUIRED. / SETTING DFIELD=0 CREATES A VERSION USED TO OBTAIN THE FIELD-ZERO DATA. / SETTING DFIELD=1 CREATES THE FIELD-ONE VERSION. LEGAL VALUES FOR DFIELD / EXTEND UP TO SEVEN. THE DEFAULT VALUE IS ZERO. NOTE THAT THE FIELD-ZERO / VERSION LOADS INTO FIELD ONE WHILE ALL OTHER VERSIONS LOAD INTO FIELD ZERO. / THIS IS NECESSARY TO ALLOW UNRESTRICTED FILE LOADING WITHIN THE SELECTED / FIELD. (OS/8 ITSELF GENERALLY BARS LOADING INTO 7600-7777 OF ANY FIELD, THUS / LOADING IS ACTUALLY RESTRICTED TO 0000-7577 OF THE SELECTED FIELD.) / OTHER ASSEMBLY PARAMETERS. / SETTING REC= XX SETS THE REMOTE RECEIVE DEVICE CODE TO / XX (DEFAULT VALUE IS 40). / SETTING SEN= XY SETS THE REMOTE TRANSMIT DEVICE CODE / TO XY (DEFAULT VALUE IS 41). / SETTING BRATE= NN SETS THE BAUD RATE (FOR SYSTEMS THAT / SUPPORT THIS FEATURE SUCH AS THE / VT-78) FROM A TABLE OF VALUES (00-17) / AS FOLLOWS: / NN (OCTAL) BAUD RATE / 00 50 / 01 75 / 02 110 / 03 134.5 / 04 150 / 05 300 / 06 600 / 07 1200 / 10 1800 / 11 2000 / 12 2400 / 13 3600 / 14 4800 / 15 7200 / 16 9600 / 17 19200 / (THE DEFAULT VALUE IS 07 FOR 1200 / BAUD COMMUNICATIONS.) / ASSEMBLY INSTRUCTIONS FOR ANY VARIANT VERSION. / ASSUMING A CUSTOMIZED FILE SETUP FOR LOADING FIELD ZERO DATA IS CALLED / IPL0.PA, THE FOLLOWING COMMANDS WILL CREATE IPL0.SV: / .PAL IPL0<IPL0/E/F ASSEMBLE VARIANT FOR FIELD ZERO / .LOAD IPL0 LOAD THE BINARY / .SAVE DEV IPL0 ;10200=0 SAVE THE IMAGE ON ANY DEV (SUCH AS / SYS). / NOTE THE NON-STANDARD STARTING ADDRESS FOR THE FIELD ZERO VERSION (10200). / ASSUMING A CUSTOMIZED FILE SETUP FOR LOADING FIELD ONE DATA IS CALLED IPL1.PA, / THE FOLLOWING COMMANDS WILL CREATE IPL1.SV: / .PAL IPL1<IPL1/E/F ASSEMBLE VARIANT FOR FIELD ONE / .LOAD IPL1 LOAD THE BINARY / .SAVE DEV IPL1=0 SAVE THE IMAGE ON ANY DEV (SUCH AS / SYS). / IF NECESSARY FOR FIELD TWO AND FOLLOWING, ADDITIONAL VERSIONS CAN BE CREATED. / THE SAVE COMMAND WILL BE THE SAME AS FOR IPL1. / EQUATED SYSMBOLS. / LOADING FIELD DEFINED HERE. REMOVE THE / FROM THE APPROPRIATE LINE. / DFIELD= 0 /LOAD FIELD ZERO DATA / DFIELD= 1 /LOAD FIELD ONE DATA IFNDEF DFIELD <DFIELD=0> /DEFINE LOADING FIELD ZERO BY DEFAULT / REMOTE LINE RECEIVE DEVICE CODE DEFINED HERE. REMOVE THE / AND FILL IN THE / APPROPRIATE VALUE. / REC= 40 /REMOTE RECEIVE DEVICE CODE IFNDEF REC <REC= 40> /DEFAULT RECEIVE DEVICE CODE IS 40 / REMOTE LINE TRANSMIT DEVICE CODE DEFINED HERE. REMOVE THE / AND FILL IN THE / APPROPRIATE VALUE. / SEN= 41 /REMOTE TRANSMIT DEVICE CODE IFNDEF SEN <SEN= 41> /DEFAULT TRANSMIT DEVICE CODE IS 41 / BAUD RATE CONTROL VALUE DEFINED HERE FOR VT-78, ETC. REMOVE THE / AND FILL IN / THE APPROPRIATE VALUE. / BRATE= 7 /BAUD RATE CONTROL VALUE IFNDEF BRATE <BRATE= 7> /DEFAULT IS VALUE FOR 1200 BAUD / REMOTE LINE IOT DEFINITIONS. / RECEIVE DEFINITIONS. / RKCCIOT=REC^10+6002 /CLEAR REMOTE INPUT FLAG, AC RKRBIOT=REC^10+6006 /READ REMOTE, CLEAR FLAG RKSFIOT=REC^10+6001 /SKIP ON REMOTE INPUT FLAG / TRANSMIT DEFINITIONS. RSBIOT= SEN^10+6003 /SET BAUD RATE FROM AC[8-11] RTLSIOT=SEN^10+6006 /TRANSMIT CHARACTER, CLEAR FLAG / RTSFIOT=SEN^10+6001 /SKIP ON TRANSMIT FLAG / OTHER DEFINITIONS. DATFLD= DFIELD^10 /LOADING FIELD FOR CDF INSTRUCTIONS / THE PROGRAM CODE STARTS HERE. IFZERO DFIELD <FIELD 1> /FIELD ZERO VERSION LOADS HERE IFNZRO DFIELD <FIELD 0> /ALL OTHER VERSIONS LOAD HERE *200 /START AT THE BEGINNING START, KCC /CLEAR KEYBOARD FLAG AND AC TAD INPUT /GET BAUD RATE CONTROL VALUE RSBIOT /SETUP THE BAUD RATE / RKSFIOT /**** FOR DECMATE PRINTER PORT ONLY **** KSF /WAIT FOR JMP .-1 /KEYBOARD INPUT KRB /GET THE CHARACTER RTLSIOT /OUTPUT TO REMOTE TLS /LET USER SEE IT ALSO RKRBIOT /CLEAR REMOTE INPUT FLAG NOW CDF DATFLD /SETUP LOADING FIELD JMS INPUT /TRY TO GET A VALID DATA CHARACTER JMP .-1 /LEADER FOUND, IGNORE IT JMP GOTDATA /LOAD FIRST DATA CHARACTER THERE DATLUP, JMS INPUT /TRY TO GET A VALID DATA CHARACTER JMP LOADEND /TRAILER FOUND, GO FINISH THERE GOTDATA,CLL RTL;RTL;RTL /MOVE HALF-WORD UP DCA I LOADPTR /STORE HIGH-ORDER HALF JMS INPUT /TRY TO GET A VALID DATA CHARACTER JMP LOADEND /TRAILER FOUND, GO FINISH THERE TAD I LOADPTR /COMBINE LATEST WITH PREVIOUS DCA I LOADPTR /STORE BACK COMPOSITE ISZ LOADPTR /BUMP TO NEXT L177, 177 /CONSTANT 0177; HERE JUST IN CASE IT SKIPS JMP DATLUP /GO BACK FOR MORE / COMES HERE WHEN LOADING IS DONE. LOADEND,CLA!400 /CLEAN UP; ALSO CONSTANT 7600 CIF CDF 00 /GOING TO MONITOR FIELD JMP I LOADEND/(7600) /EXIT TO MONITOR LOADPTR,0000 /LOADING POINTER INPUT, BRATE /INPUT ROUTINE; ALSO HOLDS BAUD RATE VALUE INPAGN, RKSFIOT /ANY REMOTE INPUT? JMP INPAGN /NO, WAIT FOR IT RKRBIOT /YES, READ IT IN AND L177/(177) /REMOVE PARITY BIT TAD L7737/(-41) /COMPARE TO LOWER LIMIT SPA /SKIP IF GREATER THAN THAT JMP INPAGN /ELSE IGNORE IT TAD L7700/(-100) /COMPARE TO UPPER LIMIT SMA /SKIP IF IN RANGE JMP I INPUT /ELSE TAKE IMMEDIATE RETURN ON LEADER/TRAILER AND L77/(77) /REMOVE JUNK BITS ISZ INPUT /BUMP RETURN JMP I INPUT /TAKE SKIP RETURN TO CALLER L77, 77 /CONSTANT 0077 L7700, 7700 /CONSTANT 7700 L7737, 7737 /CONSTANT 7737 $ /THAT'S ALL FOLK! |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 | Date: Sat, 11 Jul 92 15:00:00 EDT From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: A few more release files for Kermit-12 Now available are two new versions of K12DEC and K12ENC, which have a new feature for image transfer of an entire device optionally split into two parts. This comes at the request of a user, and was quite easy to add. As before, the sources document how to use the programs, etc. The new files have been installed in the regular places: BITNET/EARN Internet KERMSRV@CUVMA watsun.cc.columbia.edu Description K12MIT ANN kermit/d/k12mit.ann Announcement of KERMIT-12 K12MIT UPD kermit/d/k12mit.upd Release update (this) file K12ENB PAL kermit/d/k12enb.pal .BOO-format encoding program K12DEB PAL kermit/d/k12deb.pal .BOO-format decoding program K12MIT NOT kermit/d/k12mit.not Release notes file K12MIT DSK kermit/d/k12mit.dsk Description of RX02 diskettes ------------------------------ Date: Wed, 11 Mar 92 15:52:25 EST From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: A few more release files for Kermit-12 Now available are two new versions of K12DEC and K12ENC, which have a new feature for image transfer of an entire device. This comes at the request of several users, and was quite easy to add. As before, the sources document how to use the programs, etc. I am working on an upgrade (specifically a handler) for OS/278 to allow complete transfer of RX50 diskettes as an encoded ASCII-fied file. This utility merely handles records available to the normal file structure, but in the OS/278 RX50 case (from DEC) this is not the entire disk structure. In part this is a safety feature, so you can't access the "slushware" tracks; you can't transfer an entire image of an RX50 currently. When the system is upgraded with a suitable handler, the encoder and decoder gain access to the entire device; all other system utilities can utilize the entire RX50 as an effectively larger device. If the handler project takes too long (it is actually quite involved surprisingly enough) I will possibly resort (by popular demand) to releasing an interim program that does its own RX50 I/O as a special case of encode and decode. That would be withdrawn later when the handler is available. (DECmates are becoming available to various people around the world, but they don't have the support software to get it running; this method would allow them to get their machines up after they had merely an OS/278 bootable disk (available from DECUS) and the Kermit-12 files :-).) The two new utilities are currently useful for other devices. For example, an entire OS/8 RX01 or RX02 can be encoded as a file. With the WPS-oriented handlers installed (commonly available), images of an RX01 WPS document disk can be encoded/decoded directly. (This even includes bootable WPS RX01 systems diskettes, or even RT-11 RX01 disks!) The existant WPS/COS-style handlers allow transfer of any RX01 as long as track zero can be ignored. This is generally the case on RX01/02, but NOT RX50, thus the above problem. The new files have been installed in the regular places: BITNET/EARN Internet KERMSRV@CUVMA watsun.cc.columbia.edu Description K12MIT ANN kermit/d/k12mit.ann Announcement of KERMIT-12 K12MIT UPD kermit/d/k12mit.upd Release update (this) file K12ENB PAL kermit/d/k12enb.pal .BOO-format encoding program K12DEB PAL kermit/d/k12deb.pal .BOO-format decoding program ------------------------------ Date: Mon Oct 21 1991 12:00:00 EDT From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: Release of Additional Kermit-12 Utilities Keywords: .BOO, PDP-8, PDP-12, VT-78, DECmate, OS/8 Xref: DEC PDP, See PDP This is a release of companion utilities to KERMIT-12 for the purpose of enhancing file distribution. Two areas are addressed: 1) Initial program acquisition, 2) Binary file encoding. 1) Utilities are provided to create and load copies of KERMIT-12 "on the fly" from a server such as a remote time-sharing system or a local PC on the other end of a "clean" connection to the PDP-8. Unfortunately, most PDP-8 family systems lack a communications predecessor to KERMIT-12. Most communications applications were limited to terminal emulation only, so it is rare that any PDP-8 system has an existing utility sufficient to acquire KERMIT-12. (Of course some sites have prior versions of KERMIT-12 already.) Assuming an error-free serial connection to the other system, it is possible to down-load KERMIT-12 directly into the PDP-8 memory without a protocol. This is similar to the process used for years by DEC field service to load paper-tape copies of diagnostics. Loading is limited to a single PDP-8 field at a time. Performing several load operations yields intermediary image files which can be combined into K12MIT.SV identical to the release version (except for irrelevant loading artifacts which is a consequence of the operating system itself). The format chosen for Initial Program Load (.IPL) is an encoding that yields ASCII files that should pass through any system with ease. The scenario of loading is assumed to be either direct system-to-system, or between a remote system and one of its terminals. All control characters (such as CR and LF) are ignored, thus the encoded files contain frequent line breaks to make the encoded file pallatable to the serving system. Strictly lower-case letter messages are added at the beginning and end of the file to serve as leader trailer fields as well as file documentation. Please note that while spaces are insignificent, the rest of the ASCII character set is used for loading information, so editing of .IPL files must scrupulously avoid changes to the "body" of the file. A simple program (K12IPL.PAL) is provided for .IPL loading of a single field. The user must customize it for local requirements, and then enter two variant forms of the loader. (Future releases could require additional variants to be created. The current release occupies two fields.) This process is similar to customizing the communications requirements of KERMIT-12 itself. The program is sufficiently small to allow manual entry into the system debugger (ODT) directly. Examples of such an entry session are provided as K12IP0.ODT and K12IP1.ODT. The source program may also be retyped by any available means (TECO, EDIT, etc.) if desired. Only standard PDP-8 peripherals are supported such as KL8E, KL8-JA, etc., as opposed to KERMIT-12 itself which supports various DECmate communications hardware as well. It was felt that the greatly increased complexity of supporting the DECmate communications ports would make this process too unwieldy. However, it is possible to load the data through the DECmate's printer port. The VT-78 and all prior PDP-8 models are fully supported. Distribution files include K12FL0.IPL and K12FL1.IPL which are the encoded copies of field zero and field one respectively. K12IPL.DOC is a discussion of the .IPL encoding format itself. K12IPG.PAL is the utility used to create K12FL0.IPL and K12FL1.IPL from the standard release file K12MIT.SV. (K12MIT.SV is itself distributed in encoded form as K12MIT.ENC and now also K12MIT.BOO (see below). K12IPG can be used with other programs for similar purposes if required.) 2) Utilities are provided for encoding and decoding arbitrary OS/8 files using the popular .BOO format encoding scheme. .BOO format should be compatible across dis-similar systems thus avoiding intermediary "hazards." While quite popular in the MS-DOS world for file distribution purposes, .BOO format as originally designed has an inherent weakness that makes reliable use on OS/8 family systems impossible. I have designed an extension to the format to make .BOO format sufficiently reliable to allow implementation of an encoder and decoder for OS/8 systems. Note that ENCODE format is still the format of choice for file distribution because of its more robust nature, but the shorter files created by a .BOO encoder may be desirable in certain circumstances. .BOO format files cannot pass through WPFLOP "paths" to distribute files on DECmates or VT-78, so ENCODE format is mandatory on systems used this way. The relevant problem with .BOO format has to do with file length anomalies that are a consequence of the format itself. .BOO files either end on a repeat compression field or a complete three-byte data field expressed as four characters, each only six bits significant. Should a file end with only one or two eight-bit data bytes, two or one additional null bytes will be appended to pad out the last data field. This leads to files that are one or two bytes longer than intended. At least this is the behavior on systems like MS-DOS which maintain a file byte count. Since OS/8 files are multiples of whole records, each of which can be viewed as a collection of 384 bytes, any change in a file's length of even a single extra null byte will cause the creation of an extraneous whole record. Besides wasting space, it is conceivable that an OS/8 file corrupted in this manner could actually be dangerous to use! Note also that this problem can be cumulative in that repeated transmission between systems where the file is stored locally in some decoded form, and then encoded locally before transmission to another site, can cause the problem to worsen indefinitely. Clearly, .BOO format must be firmed up to prevent this form of file corruption before it can be used safely on PDP-8 systems. (It has also been noted that widely distributed .BOO encoding programs exist on certain systems which exhibit defects such as erroneous appendage of additional null bytes onto the end of the file not indicated by the file's contents. This is clearly a program bug and not an inherent problem with .BOO format design.) The method chosen to correct the existing .BOO anomaly is to append a correction field to the end of every file requiring it. The basic correction unit is ~0 which means literally a repeat compression field with a count of zero. This construct is ignored by most .BOO decoders because it contributes nothing to the file. (At the bare minimum, .BOO decoders should implement the robustness of ignoring this type of data. It is conceivable that due to design error, a decoding program could "blow up" when encountering this data. Imagine a file lengthened by 2^32 null bytes! The exact amount of extraneously generated null bytes would likely be 2^{how many bits wide are integers on the machine} or one less than that.) .BOO-encoded files may now contain either ~0 or ~0~0 at the end to indicate whether one or two bytes are to be "taken back" respectively. Tests on MSBPCT.BAS and MSBPCT.C as currently distributed by CUCCA indicate that these corrections are perfectly ignored, thus decoded files are erroneously inflated by one or two bytes. This is the expected behavior of these older decoders. When used with PDP-8 DEBOO.SV (distributed in source form as K12DEB.PAL), the correct file length is maintained. PDP-8 ENBOO.SV (distributed in source form as K12ENB.PAL) is the first encoding program that creates the correction field as necessary. It is hoped that this "pioneering" effort will cause other systems' encoders and decoders to be similarly updated. Overall program operation for the encoder and decoder is identical to the equivalent programs for ENCODE format. Documentation is contained in the source files. As in the ENCODE format decoding program, the target file name can be taken from the original file name imbedded within the file, or optionally the user can specify a target file name as well as a target device. When encoding, the imbedded file name will always be the original name of the file supplied as input to the encoder. The user can specify any valid combination of output file name and device for the resultant encoded file. OS/8 files passed through ENBOO/DEBOO are packed/unpacked according to the standard OS/8 "3 for 2" scheme to ensure byte accuracy where relevant. This allows files which are ASCII, but too "delicate" for ordinary transfer to be sent between unlike systems with total accuracy. This includes any file where the precise placement of CR and LF may be critical, or contains unusual characters in the file such as BEL or ESC. A perfect example of this is the interchange of TECO macros between PDP-8s (used with OS/8 TECO.SV) and IBM-PCs (used with MS-DOS TECO.EXE) with a unix system as an intermediary storage site. Both end systems use like line termination schemes incompatible with the intermediary system. Since both systems support .BOO format, the files can still be sent without loss. Most of the existing K12MIT-related files are unchanged. K12MIT.DSK is updated to reflect all new files pertaining to .IPL or .BOO utilities. K12MIT.ANN and K12MIT.UPD are updated per this announcement. All files distributed in ENCODE format are replicated in .BOO format. The new files have been installed in the regular places: BITNET/EARN Internet KERMSRV@CUVMA watsun.cc.columbia.edu Description K12MIT ANN kermit/d/k12mit.ann Announcement of KERMIT-12 K12MIT UPD kermit/d/k12mit.upd Release update (this) file K12MIT DSK kermit/d/k12mit.dsk Description of RX02 diskettes K12MIT NOT kermit/d/k12mit.not Release notes file K12IPL PAL kermit/d/k12ipl.pal .IPL loading program K12IP0 ODT kermit/d/k12ip0.odt ODT session creating IPL0.SV K12IP1 ODT kermit/d/k12ip1.odt ODT session creating IPL1.SV K12FL0 IPL kermit/d/k12fl0.ipl .IPL encoding of K12mit (FL0) K12FL1 IPL kermit/d/k12fl1.ipl .IPL encoding of K12mit (FL1) K12IPG PAL kermit/d/k12ipg.pal .IPL-format encoding program K12IPL DOC kermit/d/k12ipl.doc Description of .IPL format K12ENB PAL kermit/d/k12enb.pal .BOO-format encoding program K12DEB PAL kermit/d/k12deb.pal .BOO-format decoding program K12MIT BOO kermit/d/k12mit.boo .BOO encoding of KERMIT-12 K12PL8 BOO kermit/d/k12pl8.boo .BOO encoding of PAL8 Ver B0 K12CRF BOO kermit/d/k12crf.boo .BOO encoding of CREF Ver B0 K12GLB BOO kermit/d/k12glb.boo .BOO encoded TECO file macro [Ed. - Thanks, Charles! Additional information can be found in the new file, k12mit.not (K12MIT NOT), a message from Charles to the "PDP-8 lovers" mailing list.] ------------------------------ Date: Thu Sep 6 1990 11:00:00 EDT From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: Announcing KERMIT-12 Version 10g Keywords: PDP-8, PDP-12, VT-78, DECmate, OS/8 Xref: DEC PDP, See PDP This is a maintenance release of KERMIT-12. A minor problem relating to incorrect CPU identification messages has been fixed. The problem only appeared when the CPU was a KK-8A single-board CPU; this configuration was previously untested. Thanks to Johnny Billquist of Sweden for his assistance in pinning down the problem. KERMIT-12 operation was not affected in any other way, as only the DECmate-specific identification is crucial; earlier PDP-8 family members are treated in a generic fashion except for the "frill" of model identification (all PDP-8, PDP-12, VT-78 models use software-compatible port hardware; all DECmates are incompatible and must be handled individually). We are still looking for volunteers to test the various DECmate III and DECmate III+ configurations. The rest of the release concerns the encoding of files into the "ASCII-fied" format. The format has been modified to be more robust, since the original method has proven itself to be problematic in certain practical circumstances (as reported in K12MIT.BWR). The new ENCODing format is based on five-bit encoding with repeat compression. As much as 256 repeated 12-bit words will be expressed in a five character field. Any repeated 12-bit value can be compressed, as opposed to simple zero compression, as in other common encoding schemes. (PDP-8 files often have repeated strings of the value 7402 octal, which is the HLT instruction.) The only printing characters required to pass through any distribution "path" are 0-9, A-V, X, and Z. The alphabetic characters can also be lower-case. All command lines are framed by ( and ); all data lines are framed by < and >. These characters can be changed if required, as they are not part of the data; they could be replaced by W (w) and Y (y) if necessary. (Changing the framing characters requires slight modification of the ENCODing and DECODing programs.) The new format supports a 60-bit file checksum to ensure proper decoding at the other end. The former 12-bit checksum could be compromised on long files. The new ENCODing programs creates internal (REMARK commands stating the ENCODed file's creation date, and the original file's creation date. This will aid in distribution of PDP-8 files where the user wishes to maintain proper file dates. The date algoritm used is the one proscribed by the OS/8 DIRECT program. (OS/8 systems only OPTIONALLY support file dates, and there is an eight-year "anomaly" associated with identifying the year; the user must determine the credibility of the year portion of the date. The value provided by the ENCODE program for the original file creation date is always today's year or the previous seven years as necessary; this field will not be provided if the system doesn't support the required AIW feature.) Overall file size is theoretically as much as 6/5 of the original encoding format (as the earlier format was based on six-bit encoding), but actual size varies downward due to slightly less file overhead (wider lines mean less CR LF; there is now less automatically generated verbiage), and the random improvement afforded by simple repeat compression. Virtually all K12MIT-related files are re-released at this time. There are several new files. Due to the "fragile" nature of TECO macro files, the file K12GLB.TEC is no longer being distributed directly; the file K12GLB.ENC is the same file in the new ENCODE format. The new files have been installed in the regular places: BITNET/EARN Internet KERMSRV@CUVMA watsun.cc.columbia.edu Description K12MIT ENC kermit/d/k12mit.enc Encoded binary of KERMIT-12 K12MIT DOC kermit/d/k12mit.doc Documentation file K12MIT BWR kermit/d/k12mit.bwr Updated "beware" file K12MIT DSK kermit/d/k12mit.dsk Description of RX02 diskettes K12MIT ANN kermit/d/k12mit.ann Announcement of KERMIT-12 K12MIT UPD kermit/d/k12mit.upd Release update file K12DEC PAL kermit/d/k12dec.pal Decoding program K12ENC PAL kermit/d/k12enc.pal Encoding program K12PL8 ENC kermit/d/k12pl8.enc Encoded binary of PAL8 Ver B0 K12CRF ENC kermit/d/k12crf.enc Encoded binary of CREF Ver B0 K12MIT PAL kermit/d/k12mit.pal Main source file of KERMIT-12 K12PCH PAL kermit/d/k12pch.pal KERMIT-12 source patch file K12CLR PAL kermit/d/k12clr.pal Memory clearing file K12MIT LST kermit/d/k12mit.lst Symbols-only listing file K12PRM PAL kermit/d/k12prm.pal Sample VT-78 config file K12GLB ENC kermit/d/k12glb.enc Encoded TECO file macro K12ENC DOC kermit/d/k12enc.doc Encoding format description [Ed. - Many thanks, Charles. Believe it or not, there are still quite a few PDP-8 based systems out there, and even some PDP-12s. You won't find very many other new software packages that support them!] ------------------------------ Date: 05-October-1989 From: lasner@cunixc.cc.columbia.edu (Charles Lasner) Subject: Announcing KERMIT-12 Version 10f Keywords: PDP-8, PDP-12, VT-78, VT-278, DECmate, OS/8 Xref: DEC PDP, See PDP This is to announce the release and availability of a highly revamped KERMIT program for the complete family of Digital Equipment Corporation 12-bit computers, known as KERMIT-12 (or K12MIT), Ver. 10f. Unlike its predecessors (K08MIT and K278, upon which it is partially based, as well as prior versions of KERMIT-12), KERMIT-12, as now distributed, will run on any PDP-8 model (8, LINC-8, 8/i, 8/l, 8/e, 8/f, 8/m, 8/a), PDP-12, VT-78, or DECmate (VT-278, aka DECmate I, DECmate II, DECmate III, DECmate III-plus) under any OS/8 family member operating system. Proper operation is accomplished automatically. Companion utilities are provided to deal with "ASCII-fied" binary files in ENCODE format (a mechanism designed by Charles Lasner and Frank da Cruz as a proposed successor to BOO format); ENCODE format has been employed to distribute the binary portion of this release of KERMIT-12. Due to the myriad port requirements of the various models, conditional parameters have been provided in the source (as well as a separate patching file) for models prior to DECmate I. The program auto-configures for all models of DECmate; parameters are available to select the DECmate ports (DP278, communications, printer, etc.) where applicable. Many improvements have been provided to get this KERMIT "up to speed" relative to other KERMITs. KERMIT-12 has been tested successfully with many KERMIT implementations and will run at the maximum baud rate (and sometimes beyond the DEC-stated limit!) of the relevant interface. Any console terminal configuration acceptable to OS/8, etc. can be used at any baud rate as long as local flow-control protocol is obeyed; remote flow control can be disabled at console speeds higher than the remote line rate. Connect mode I/O is fully ring-buffered in all directions with local flow control always enabled for all console terminal operations. (This should satisfy all console terminal requirements ranging from 110-baud teletypes to built-in 350-Kbaud VT-220 emulators, since any of the gamut of these ASCII terminals could be the system console terminal for any of the KERMIT-12 supported computer configurations!). KERMIT-12 will run anywhere OS/8 does, so it runs on any perfect look-alike suitably configured. Some known compatibles are: - TPA made in Hungary, this machine is an 8/l except for the silkscreened letters which are Magyar, not English. - Fabritek MP-12 - Intersil Intercept - Pacific CyberMetrix PCM-12 - Digital Computer Controls DCC-112 and DCC-112H - Computer Extensions CPU-8 (a drop-in replacement for the 8/e or 8/a cpu for a PDP-8/A-400 or -600 hex-wide box) - Computer Extensions SBC-8 (a single-board computer -8 compatible based on the 6120 like a DECmate, but compatible with -8 peripherals, not DECmate peripherals; it also supports up to 16 comm ports) Various emulators are available for PDP-10, 15 and the IBM-PC which will also support KERMIT-12 if suitably configured. Distribution files are available from CUCCA. Testing is under way for some of the more obscure configurations (e.g., DECmate III with comm port); volunteers are welcome for this task. The author can provide copies to interested parties on virtually all of the popular PDP-8 media on a time-available basis. [Ed. - Many thanks, Charles! The files are in Kermit Distribution area D with prefix K12, and the previous PDP-8 versions having prefixes K08 and K278 have been retired. Internet users may ftp the files as kermit/d/k12*, and BITNET users can get them from KERMSRV at CUVMA as K12* *.] ------------------------------ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | K12MIT.SV oX?lP0400<P70<074QTP1A8B3a80?ahE7Ph10P`581@?81<53P@P;B080@h430DB80DB4PlB03lN 5Ah>0@8<1B0D3b0C1@h403lN5Ah>0@8<1B0D3b0B1@<52AH582dP104D0B054Q8?4P0a4X20P820 P820VP00~xb\b=RXf:[hWDb<WCX<K9c<FPbM>Pd=;?e\W4aLBPe<nPeM?5d]>PclJPblGBcLWD [K6bX=C?X<7<c<oGX<?EdmC?cLWJaLBPe\GBdlW?c]>Pe<nP`\F=RZn9c<o3`Lc<fJ33d\G1e<G4 X=O9e<S?eMBPcLo4bLKIbLk7X=C8aJ3=`LW>X=??eM;3aJ2Xbk6bcLWD[]31c:V^SHZ=RZn9`m;5 `MC9c\NPblGBcLWD[K6bX<KBclfPe<S5X=?D`Lk4~~~~~ToojBT86<oJPoRObRT8><noZinI0X Po_;00P6R@S3:93kV`QSPI_7TP2P0?l2lX3>[K:4_;e4`L=4aZ5:ooH\f:gXW02`mlO4[h2^b?S2 `86<mhTlm\0XmL0Xa\S<P:g[0<T<`Lj\P<3[h03`~s5@L`1e1>=U40SAg62Q1oW100m`coPBcf RLcfPLcFm^cnmRb9e\kfP<kfPLc7m^cmmRb9alkfoL;fPLb1m^clmRb9PLkfo<;fPLb1m^clmRcE m^ckmRcjmRcimRcEl^b0P>j0Q;3DQX3cW<4@WR6VWj4@X676[\7C]H7C_X6daH4AaR6Xao7=b:4A bF6HbR7>AL[^CI[^@i\@A2^XAO_KAZ\@Af_6e<_5eF\AeR^Xeo_Af;_5fB_>0<00~<H`14__0E @00>6024e0R600kEl0;FlPcGP0kHm`cIk`CJf@[Kk`CLf`[Mb0cNlP;Oj@SP1`;Ql@;Rj@SSl`;T j@SUaPcVb0cZb@c\cPbN`AbPaQbn]1S5bAc6cA[8La3:cQa3`Ka5a[a62;oBLk3DbKcFc[`0eP3f el3HgN3XiL3Vi\3Xj\3Yk<3^W\7QX<7VaL7Yb\7^@l_QAL_Ve<_Ye\_^0<00~~~~~~~~~~~~~~~~ ~~~~~JWYigWYigWYigWYigWYigWP1`~NWH1gUHigc]LSP90g4:dGGX3GT11a[AinP91g4:dG;l3T S4ibgWP;P91g4:dG;d3RT11a[Bmn090g4:dGLX37T11a[Bmn@90G4:dG;d3P\C3LWYigP;5m\837 G\>FT61e6@ED2OZ403J<01j8eI=WC^0QPhmgCDhe@e@PCi<S7Qj4dQhe@1iheI=WC^0QT99gCPDU X917SiAdWH1gGQ>Dn12hkg9<3nn48=?SlJ2ldoLk8=?Sl_Rm8=j2DTTC;G9L89J7L8O78028ThEg 54e1QJ04P5ii7U1FH8PGC3`DdYh?1]:324b19H17NG3>P?mo_YigP5imWYkgP1inWYkgP1indijo P0UcPgPkP1knbIjoP1inc9joP79l_YigP1inaIjoP1in`IjoP?Qm_YigP;Ml7Yk_P9EgS\ibeh0c T11a[EimP91g4:dG7X3WT11a[Bmn`8a7C]hPN82gT11a[Bmn@90W4:dG;`3ST11a[G9lP91g4:dG ;d3QT11a[Bmn@9H77WMK7X3WQ4=aSEA`@00@~~~~~~~~~~~~~~~~~~~~~~~~~~~xGYjAC60QPH9g dRDeP=ioGYHSC4@20lf3@H@cP6QiPhmgST<a2HMC5>233m@T81Ve1@18PhmgU8ld;H0g7]j05>23 QAE5SQA8h80gIH2W~7gPmNTQCB2CRP1C69aE0>CH10gQlNDa;PUB4<@3SNG_6BdT<33h?9Qd<6 C890gQmNTQCB2CRPRC453SQ=@06BQGO5EP9>h2691A>PP>NCQGN4CS;PRA45X3j0gWnNC19PPA=5 4cQ>0FDPDV6?P4ANgYA@3eBDA443cH=1Q3?PDT1jIAV3cW>5e32P57[PQCA?1CDCDhH5JE<UThM> 8145^QF93Q==Q@\N9FRB@g59QAD4EX6N:>R91A>1AC<1Q8<558I>bAC>7SR?7SD138?GA35UQjMD 11QFQQi<PB=^F36UQWM>Db8N:2S5UTABIAZ52GHN:5P?3eP5PD@9Qe<CDhH5JE<UR8M<7Q@X28EC 3BQC`AC5IAYNGY73D41Pb11B@`05^U@0GXWNFB6?DP0PCQ8E84EBSaBQ@4WNG_F1S31P3aDDC84P 3c;D54P182G5ddA?X2=C1RQ>Db85027NG_F1S31P3aD<`h=DH0691A>0RgN5SGADGR\0~KgPnN @d59QAD6BH0EQCB0gWmNTQCB2CRPQCC5EP941QQ<H261AC>0UGN>@W0553SPQCC5EP9PH1\1Q2<5 P3@5TXCBP3ONG_F1S31P3aDB@h59QAD]2HRCASF9bA1>81D9QACDdP=Pd6A3@05NWYA=e1=P2A>5 2CR@E3D5TXCBICR0gWmNPE><H04?4UQ3BA6535QDD`4P0EC;E060gWmNPE><H04?4eQ>815P2K65 e43BH3IBSaB0gTmNPE><H04?4eQ>815P0K:41C>PDT6?P4CNG_F1S31P3aDCCX40gQmNPE><H04? 4UQ3BA65;EP4E81PDP6?P4@0~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~Sdl?1d<FP`lS1d\73e<GBX=C?X<k>c\j^SHZ=RZn9dlGDe<W>aj36c<oG_HVaRLG>`L;<aM>P a\c?ejg3clkDd\o<X<;IX<C5a\7Ec=B^SHZ_RM?5e=C9c\NPa\c?ekf9\8W4bM?1`\c5dj36c<oG [L??c]CBclbP`]VPa<G6`MG<e:j=RXf:[hWCaMCDbLk7X<K=clC5_HV`\KNgRM?5e=>Pe<S5X<C5 a\7Ec=BPa\W<aJ3=clC5X=C?X<7C`lW9~22`00~51`00~Kn`l0~6OP00~3;@0S~2<@00~LO`00 P0l[7M3o0?00~70J201009VC<QBN4O8@00~5P0N0kFl03F1Pd`<J00l:00Pi^INm8TU8P3<0^cVG <``750dHRa:I@200oa02iPocOo3PP63PD_4P?`20497oOkT2AFH01n8;O]T9OYT_oYWm62KlnbVM P:XI5VVG6J:?::n0VjIn0920OZT9P8X0`0jPdCJPX4?jX7CidRKhmbOC7f9mO0;fdG=8_?[CdbKA dSOgdECB\D[0dn;gmS?jNcWBdW@UNR8Xb_[BdWBPd^LK72HO04jP0;00~3k`CEkjCG`J`XaPb0 f^;fmL;fmL;f4LH@e6_8P<kD0;39j\[>P<kY0;2L<0E>5EL0202DTl`SUPbE\L;G05`0P4d0C@VB P<>0Z4n0BkV0P3@XP?^>ZVP0P0\0`0h<of8oNF90T6\0T0Sn?bKm@2JH0;2X=6:YZFNYZ4BSWj\0 ~3P0jZZSBbo6<QN>T0Z0nZ0k\0n`Vnc:HVcBO=c4;=cGBPcNLQnR8QcN;8b_[>]X^f]T\00080 n@;=cV\0g@KM2Rh:2^khg@9mO0;B0;00~V0`02g5`B=B_=@FCM09P8P7N`oj0_PH2TP02`V8V; UiMRo_hgUgHRZ8WkUhTTR@2`080>M[@V2:So0JKJ1WO@4a=RV9Q;oGFB87CbZ0;d2:_j0;[TW;BT W9R[~23_b0WTFd:`2H1WKY9Z12h:S5n[BPSl89[KjHXPQblPj0g[[Z];kYY;kkZK`0X<7CbmSf k83fk?Y83ZSQn_Wf;164KR0@mX3hh_J0c]<0\000~C>2P01M@0@SJm\_m?~~~mm`HPX2o`mj9j Z0obmj;oZ2obmj8Q9^:Pl?XVmB[gg2_gLB9gg0CL0;00~9P@l0L0V05;HDKbT0on8EP6B00;2` 26n`\4=8U_YjX2n>RjC0\>:;0;2`26n`\4=8Y?YjZ2nLVJC0\>:I0;2`\6?8[_Z`ZDZ`Yb\0~2 h>1RP=::6=lV5=hVgR4ngj0oeMjR8AGRZ<Ojg]m4^]nRY`6>g]iS5[5T\L5>5K4[\N12\MnbY`6> 0MoVgjPodkRZ~6k3ARkNaSkNadkC94iN6[~Lo`l0Z`J[L2VO[:J`\FKo;RH_oV:][6<XWo[mZ2nL [:>\CTV]SDZ\oC:PWoZ\od:R`:j[[2JdZ8Xi[6:0P4_0Zn:00;00~24l0BVYYVVYYV02P?o<LV al0falM3`HY\N@Z@~4]0_1]2Bd0;00e`Kkd2KGRRai0I0020o8`4k@:bK80;00KPWj3RI:KI=7 B@T1IP<Lgd[if2_Hf4]IIP=>HP<0AP3o0?00~<2PT2P@d^aSol<?<0\0He=2KoDBV`L2V]\JHe ;RH_oV:b=VJc\H=8ZO[m:2nKo::P[OZY\J@enb8^;fKT\^Jc\H=8ZOYjX2n]P:C0\N:0`;j`P2\0 ~5\OXi2<OjnBP_aORRX;?k=We2C[:D_k6TdCJTODhY\K94];6Sn]6J`;7Tbl2^\`2`dm\fdm=3 g==TBP2@04T90ND32=?ddm=;7=e:deV`hET`i00`~B5L4?W`=P3]8?n_co0?l2\_iYoBP_V_bR Z9oj\_\R`:kj3OXR@7[bnK8W\Z1>\PebKH>JX;;WOPVIP;:bn:P_Pj2^\[8V\_MbKGbBKONBKH>J `6cRKH>J~3OLH6f2oR;aQ_`LJR1PK^1RkW\bjcaRhW;[=;~38?7fl30V<O5Rk>iVm^dVf>kRk^aS 6=cj2P[^2PS_k7e0kdmYmBP_j7fR8NoRX<OkkM9:alM;~=`@oh2?0YH:2P2OZ>lol0emD06`:_ ofVQ\ZI[\BKnXIZa\G?m8Bj`\FCnXIZa\7B?\JBP\NNbNbTQ\>KnXIZ`Z2n[`:j_YT[lJR\2X2ok n[V30Z:XP?_k0;00~5OgjIPT62JGjI2K>D\`2`C3JLOPVI_@2`~~~3E[IHWMnORH0A06h9o`hV 6BdV;FPY\Bf6oSDV;FLY\Bf6;G0Y2;7h;CURI[6HaS=VPLOVo_dWao`Y\JV:a\M6nk6H=Z0_W<JR Z;7hc2f26H1TP02`P;7RN3FEP?Nj>O6:Enb:MNR:`MnJ[mZJd]BJ8P2@~:`0hcBVWn@\190I00 c0\0X0hOOB1ljbKZjb;\NbW]9F9j:2nPk^I=JIGF0K0S~2CP000?l?~@70P0L7A80U00KPWo3RHI ;BH]J2VYL:VTUZJFKbT8SOX]X6h]7gJFBRT0DP190I2Z75BHP:_nXiZ0;D8IP6_0IN:0I;V0`;km P2]5Y`ECWPE>V`D0~2K_nB3QUR;BeRJ<ZJL0ROcBfVBobIcLeJo\fJ\be26K=[`?gR\h2n\e>` a49@cD9@aP1@~i:STH00=P0?l9>XY\N@^@7dYYm5W0B@6@RAaTR^6XB_jLFDT90Gh6hCZ2Z>7h o^6HT3ZRX>7hJodbB>7ho>hVX>kWncDVo6LYhL2>>C`V?6HYhO^2^CaRRWW90`000>48^CLV^P4^ >3YTX6?Y0SGbHWjIHTb9L7iI2I2J>ZP_hF69hI2:>Z0_H@2NB_jLFDT90804P6BiP02`B_jL@TT9 0>42N92F:?[bP02`~BAdRE=]g?_jIXA1L6FTh6@U@6AQd6AEl604h03DIP7DEPG`1PjM^Ii4FH a7BIde6IcF6I[DbH~3Y`R?YK>X29odW`2`\[9Rod0^oQP_Yl1>\ZL[~3_[iRoD0^H1P_\l1>_[<[ ~3Jo`bg]iWnmhVgRPog26^9ZP_dMnRX?[be=nRZ=SjgV<i_mVj`MoVg\I:_km;~40`KP23KP24@8 :3oP0k:PiOX80cH3h2\0~>`3Kl4lK?6ZD?02P?\XNV:hR@~2D829_?lg=_h:9PXX?kG;YP[<=P[= =P[>=Z3nhl72IY^P9Z8:Xl:PI<6OBPXX?kW:YX7m`_bbV\Xh9_eR:H2oBXW:`PP:lb4ghSOkIHkj Xh4Pch>0Y800\000~~~40P1EAd]7105E0:P?YSNbR2]YR004080;Qo4V`IUXVL62Y_62oj0_S8RT >8E:\@2PRO73Gd@>`@H^1\7VlJHhlIU;084<15S^?GD2:;?jGW<PP814P?:bZ;7joZHV[P2PB<Kj ?@l6R@o2`@2`^L1>PKW;P3ORk?eWjo4V`O67lITVlL58lL5h1PK^GiT3V@mb2P[^25oPlO4glO52 oj0_c86\>0Q?^B^iR0240<<:oNaDbP2P~@5PRa07\0?@;8SOX?MB:PVo:XSOYNHbVGoj?nX2n; ?:::NLT4B0D0R0n0>TJ00K00<`:PZo[m:2Kl9BKk9RKj8BHOnFVLB[U`AU190I2878B^W:]nK9Q< L9En2IVn28nLW4\0n0VPmnVnd;[f29o1BZT0A2190I1n78C:_Z_em3:XgOY:0994B@T1P`PLedZn GKWnF\2n_[^n_T\0~HCN4fP1M>TQQn8`0]<@00lLMI@@Q>C@P0F@1MCX1J081I=0Q><@P0F@0d 0800BPWdDl190I2O78BFTZ^V`HhcTVBBFK2LCX2I0800o`8doV9AJi?moR9PP?kl8Bhbnf9@YY_0 0^H>nR8P`oYMdIQJ00h0nNW?n::PcoYMoYa200j0>^:PHOV0mn9ZA;3o0?00~d2?m<mOhfo0[L 3oHQl00P3hF0Xh0dAVfB:800\22>nXV9=3CoHY:9R`2O1SBP9Z2P=4RMnYo0WYK0[Y80\0000=Pa hS4`HaR\nPX:kPX8kc1m@:40\2QllWam87bh9kR_B`00030aI_jh9_gA9TlPWjoAQ<3lXZoTS]5? JB2_n=79BZ2hikT0\000~m;_X?L;YA080>KKDVP<XfP3i2G<PVRL[32P[^2YGXRL[3ULZ4RP2P PGg0:83kbLURobP_ZFbRZ:gjbG`PZ<SbbKDYUE^b]F2BYcjRX9Gkb24^o\PVU@2`P;GRP?eRP`2P alMRN\0_a7jY8W62afdY^`2`~~0;X1X=\?06h9OQ>H@FTYORRHOSBHOS:Hk45Rj?mYoT>B:4Cb X=;joI^Jo0ROnn^Bk:P_XOfYaOZYaOVYaNfVkGLP8NoVk:P_\nnRN6:JZ<;j0nnb@J0_^Z2^a>bV jjP__nfRnnfBn<FJK?\Yk01^moJImOBITH2TP02nmoJImOBIoLfJlb4nlZ0ocD>RZ=kjO_fHA:P_ S7jYSXbJ@d\:Hd\:03T:~6d`0@~3m_FZhIn[U2F[P82jU\:j0=RjGLFk0?P28OWRZ97jnN4VPOWR MeX2nHU\hH4l2:OhP81;0:L829CkROS7PH7>n7LPF_PVn24^nJP_@iA;Y02P6L3:7TS?@`Q?[7>P hD9RZ;cjhGLPFBP__WBRZ;ojhJL[f?OVYjM;0>46mB4^m_LRX<kjhOlYc\:[hHT\mH5lPOGRMeP2 mL9[084>mB4^mWLPX=Sdf02`mj0_hOFb8OKRZ>7kROK3POo9hH6nmWLPF?HVh@2`~=_P\0jP8Q jn:XX_[[k2J1jn9go`;[RFc\PCc\@V:XX?[HA^:PX?[Z8Bk[G22PX?ZPA^K\22o2P8B00;3228nU RKcZPGb1j^9go`;ZjV8Qjn8XA?@8]OYLG22X@_:XYO]6Z2m6YD\00@gK1Ze8A?@8aoYck0I2Z2oG k:9gF@8XfOYdZ2oJk:;2f;i5`VC20;1GAbIGB2KojRKojbI5AVI4gF\0~O1`2O1TLQ;TQ58Z2< nYoo:Hb0Zin9;4N1O857hWMG0TN0J`213TLQ;TQg8:2Fm9H0\4I4;ZR[n_h@;gCo:J\H[TI5HZ2O ndLQ;TRX;in9_4R1??nOVh58hWMG0TROJ`0Q3<<V[;j0C[h0\5Sm9eSl9e[k9e[j9oU3M\D0\0Qb lPWHfPkAe83Ajh0Ai]7AB`00~Vm`[in:[fmJXAd@]3C`1>CP15@`1Do`l0AZ19CP19D`18o`mH AC1HB@1Do`moDo15CP14o`l0Ae15E03oP?EBA@13A@19EP15o`ncB515C01@o`ncodl0~~~q0@00 ~~~rORl08400;B<0CS408200o`3`09X83BP_PH2[0?l2:8gjd\@XQWbba0^2K:0?SHJ[0?463?5R QYB;0;H8::_joRP_[@6^:;3joJ0_V[Jho:0_Y`fVV_^bj42;n^PXf0cR3:]Z080>6KK;77O03NI^ 3JP_?aZl3KH[0?46VPb2b<gjlMdXaYZXlE`PX0_d2O42nBP_2oQRZ:3n2`\Va02`8Mg;9X3>gMe; mnPX6WW;0?46m]dXjo6RgNj:j02`~6GT<01O<?Ce00kocol?Oo`2K\P7TWonRFj?hRZ;cj3PKM P7kYR7i9IGi9YWi9_7i9G>Q2A^SRoIdVOP2@OR2DXgjYIgi92GjI07i9[NQ2A_cR2?]Rg3>9j4H^ j?XR2?URg3>8R_S927T;moIgmOEER_@RX<SjRo<RZ=SjF@3>GP3>WLa:Gm?:X8]\lUVlRZ2VRo7; X?1RXXYZ0>T6g0Tfg8U<20TgjN9:PMc;~<NH]0P2X38SXmIT7M`?_ok_a?_R94m@3n0<0>0<8V o`0V`P0Vk?kRZ9cji?gRX;kjPocRZ:OjX7O\P7W\0JS__KnZX87_X;_jH@o00P4>Z;[j_0j^:;7j nbP_^OZRZ;Sj`Hf^nJP_][NZ0@7^0@7^0@7^0@7^0@7^0H3[~~~4n0oVl_700_02?hh0~~~~~~~~ ~wRM;5cLoDaJ_Cd=;9c]B[eM?5dXV9[m?5e:3BaLg?e<FPc<W>aJ39cmBP`lo4aHf:SHZ9bLKJ aM;?RM;5cLoDaHVla<GF];2mRK6nRHV_a<G6`MG<e:3Dcj34aMK9`lFP];2_];6Pe\GBdlW?cXf: SHZ_RLC5e[>`X=31d\7=aMC5d]>^SHZ=RXW9a\kJd\n9a<GF\k29RHVlSHZ=RXW9a\k4aLJ9d\G3 RKcBaL>mRK>`_XV9[lC5e\W3aJ2c\:39 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 | Date: Fri, 1 May 1992 17:00:00 EDT From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: DECmate I problems and more patching problems DECmate I problems. Attempts to use the distributed Kermit-12 Version 10g on a DECmate (I) system will certainly fail. The coding specific to the DECmate I was never tested until recently. Two key routines wait for status flags that never raise because the affected registers do not generate flag changes/interrupts. This is unrelated to general serial data handling which works as originally coded. There is a simple patch to the program to alleviate the problem: .LOAD SYS:KERMIT.SV/I$*$ [load the file in image mode and then ask for more input. The $ which is printed signifies the use of <ESC> as the command terminator. The * is printed by the system command decoder requesting further input. The second $ signifies the use of <ESC> to end input to the command decoder. The loader program terminates and control returns to the keyboard monitor.] .ODT [call in ODT to patch the program] 7/ 0007 0012 [change default baud rate to 2400; this is optional] 353/ 5352 7000 [make a JMP .-1 into a NOP] 10302/ 5301 7000 [make a JMP .-1 into a NOP] 12243/ 3607 3610 [bump the version number] ^C [^C to exit to monitor] .SAVE SYS KERMIT [save patched file] This also updates the release revision from 10g to 10h. Future versions will eliminate the overhead of the now defunct routines. The only DECmate versions remaining to be tested are: DECmate I with DP278B (the system used for testing has DP278A) DECmate III without internal modem DECmate III with internal modem DECmate III+ Patching problems. The restrictions placed on patching apparently stem from a bug going back at least as far as OS/8 V3D (likely further). Apparently, when a JSW value of 1 is used (as Kermit-12 does), the GET command doesn't work. Apparently, the system confuses the need to save the contents of 10000-11777 with the need to load it in the first place. Kermit-12 operates by first placing once-only code in the affected area, then discarding it in favor of a locked-in copy of the USR routine. To avoid overhead, the JSW value of 0001 is set to indicate there is no need to save this dead code when the USR is swapped in over it. Apparently, the GET command sets the =1 too early in the load process, so the code that uses the USR to carry out the actions of the GET operation doesn't properly load the Kermit-12 code. Consequently, the warnings documented in previous chapters of the .BWR file (below) apply in all cases. The interaction with CCL sited below may not apply in all versions, but the GET command problem is apparently universal. cjl ------------------------------ Date: Mon, 28 October 1991 20:00:00 EST From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: Kermit-12 patching restrictions revisited yet again Even more operating system ills (will it ever end?): Still further investigation into operating system bugs in OS/278 V2 on DECmates reveals that the problem in even worse that realized two weeks ago (see previous .BWR article): When a SAVE command is executed from OS/278 involving a loaded handler, the SAVE operation fails! The contents of the files will be corrupted in general and will likely become (at least partially) all zeroes! The exact scope of the problem has not been ascertained, but certain loading tests reveal that the command fails even when accessing additional memory beyond field zero and one. All operations to SYS: or any device co-resident with SYS: (or when DSK:=SYS: which is typically the case in many systems but not a rule) are unaffected beyond the restrictions reported previously. Until recently, SAVE commands were of little interest to the casual user of OS/278, since program execution and ordinary file creation are unaffected. Since there are now several programs to be loaded and saved by users, the problem is more significent. Users of the direct loading method of acquiring KERMIT-12 are also in the affected category. Clearly all developers and anyone assembling any part of the KERMIT-12 package should be aware of this problem. As a precaution, all persons using the SAVE command for any reason are advised to use the form involving SYS: only to avoid this problem. (Advanced users can determine which handlers are possibly co-resident and are thus acceptable as well.) The resultant file can always be copied to any device as required after the fact. cjl ------------------------------ Date: Thu, 10 October 1991 05:00:00 EDT From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: Kermit-12 patching restrictions revisited and .BOO problems More operating system ills regarding file loading: Further investigation into operating system bugs in OS/278 V2 on DECmates reveals that the problem is worse than first realized: When using GET or LOAD (ABSLDR) commands, especially when loading image files such as FIELD0.SV, FIELD1.SV (the partial load files from direct memory loading of K12MIT), or K12MIT.SV with /I, the JSW and starting field/address can become "mangled" into unusable values. One particular case achieved the impossible value of 6303 for a starting field change instruction (legal values are 6203 through 6273 by 10s). Consequently, the general recommendation for SAVE commands as used in various utilities throughout KERMIT-12 configuration etc., is to use explicit starting address and loading locations and JSW values. In short, always give a complete description of the SAVE operation under OS/278. For example, when direct-loading K12MIT through the printer port into the DECmate, the following commands should be used: }LOAD FIELD0.SV/I,FIELD1.SV/I$*$ }SAVE SYS K12MIT.SV 00000-07577,10000-17577;00200=0001 As discussed earlier, the CCL form of the ABSLDR LOAD command works even though other seemingly equivalent forms don't. The complete SAVE command forces all parameters to be taken explicitly from the command; no reliance on system "assumptions" or loading artifacts. Always use the complete values for loading taken from the relevant program documentation. Most users of KERMIT-12 are running OS/8 V3D, etc., where this sort of system bug isn't seen. In the future, all KERMIT-12 documentation will give the "verbose" form of the command to contain this OS/278 V2-specific problem. Regarding .BOO format encoding: The newest release of KERMIT-12 includes .BOO format encoding of all binary files and TECO macros as an alternative to ENCODE format. ENCODE format is still the preferred method of distribution, but .BOO format allows for use with other systems, such as MS-DOS. For example, TECO macros used with OS/8 TECO can be interchanged in .BOO format with similar files used with MS-DOS TECO. Intermediary sites, such as unix systems will not destroy the "delicate" nature of such files, etc. The KERMIT-12 .BOO utilities are NOT totally compatible with existing .BOO utilities on other systems! Just like OS/8 ENCODE and DECODE, ENBOO and DEBOO do a perfect encoding/decoding of OS/8 files into their original form. When used with "foreign" .BOO decoders, some unpredictable things might occur. Certain other .BOO encoders are known to throw in extraneous null bytes at the end of the file. Further, there is a design weakness in the original .BOO format that causes more null bytes to possibly appear. The KERMIT-12 programs utilize a superset of the original format to ensure correct encoding/decoding. When passing these files which now contain "correction bytes" to older decoders, the files are decoded with inflated lengths because the older decoders don't recognize the length correction. When passing files created by older encoders to the PDP-8, the resultant decoded files will also have inflated lengths because the older encoders failed to place correction bytes into the file. The general rule for dealing with .BOO files originating from other systems is that they may have incorrect lengths. The resultant files may be (falsely) padded out with extraneous null bytes. In any case, since the files generally have no blocking structure, the files will be padded by OS/8 up to the nearest whole record or multiple of 384 bytes anyway. Unless the file is ASCII and has a ^Z at the end, there is no way to determine the original intended file length. Files may be padded by null bytes introduced by other systems' bugs, the inherent weakness of the original .BOO format, or ultimately by OS/8 padding requirements. ASCII files from other systems may be adjusted by using an editor such as TECO which stops at the ^Z. A second generation of the transferred file may be somewhat shorter when processed this way. Should a file originating in OS/8 be intended for OS/8 use only (such as an encoding of a .SV file), it should not be decoded on an intermediate system, because a re-encoded version may differ from the encoded original because of ignored correction bytes, bugs, or the inability to insert correction bytes. Violating any of these rules could lead to OS/8 files corrupted into being too long. It is conceivable that these altered files are even dangerous to use under OS/8 because of their inflated lengths. (Certain files are validated by their restricted size, such as .HN files which must be exactly two or three blocks long depending on whether they are for one or two page handlers. If a one-page handler became three pages in file length, it could conceivably be confused with a two-page handler, etc.) cjl ------------------------------ Date: Sun, 7 October 1990 12:00:00 EDT From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: Kermit-12 patching restrictions All Kermit-12 configuration done according to the documentation works "as advertised." Users are tempted to patch the distributed image file K12MIT.SV as a "quick and dirty" method to make small modifications such as changing the default baud rate, etc. There is "conventional wisdom" that this can be accomplished using GET, SAVE commands to allow the use of ODT; this method is ordinarily used with other OS/8 family programs. It has been reported that this does NOT work on OS/278, the usual operating system for the DECmates. The following method should be avoided (a work-around is offered later): .GET SYS KERMIT [setup current image for patching] .ODT [call in ODT to patch the program] 7/ 0007 0012 [change default baud rate to 2400] ^C [^C to exit to monitor] .SAVE SYS KERMIT [save patched file] This method follows the exact procedure described in virtually every OS/8 document regarding patching of image files. The cited example changes the default baud rate from 1200 Baud to 2400 Baud by replacing the value chosen from the DEC standard table for 1200 Baud with the applicable value for 2400 Baud. This value is stored within Kermit-12 as the corresponding twelve-bit word with all high-order bits zeroed. (The location used is 000007; this is valid for Version 10g, but could change in later versions.) This attempt to make changes the "conventional" way produces a corrupted image file of K12MIT.SV (renamed to KERMIT.SV in the above example) when using OS/278 Version 2, the usual operating system on the DECmate II, etc. This method probably works in earlier (OS/8 V3D, etc.) systems, however no attempt has been made to trace this bug in prior systems. A "fool-proof" method is required that works in spite of bugs in the operating system. A work-around was attempted using OS/278 V2 on a DECmate II hard disk system: .LOAD SYS:KERMIT.SV/I [load the file in image mode] .ODT [call in ODT to patch the program] 7/ 0007 0012 [change default baud rate to 2400] ^C [^C to exit to monitor] .SAVE SYS KERMIT [save patched file] This also fails! For reasons not understood yet, the following seemingly equivalent command DOES work: .LOAD SYS:KERMIT.SV/I$*$ [load the file in image mode and then ask for more input. The $ which is printed signifies the use of <ESC> as the command terminator. The * is printed by the system command decoder requesting further input. The second $ signifies the use of <ESC> to end input to the command decoder. The loader program terminates and control returns to the keyboard monitor.] .ODT [call in ODT to patch the program] 7/ 0007 0012 [change default baud rate to 2400] ^C [^C to exit to monitor] .SAVE SYS KERMIT [save patched file] This allows ODT commands to patch the file as intended, and also causes the subsequent SAVE command to work properly. All OS/8 family systems support this command (as long as CCL is enabled), so it will "always" work. For those users who run with CCL turned off, the following sequence will also work: .R ABSLDR [run the loading program directly] *KERMIT.SV/I [load Kermit in image mode] *$ [<ESC> is typed to terminate the loading process.] .ODT [call in ODT to patch the program] 7/ 0007 0012 [change default baud rate to 2400] ^C [^C to exit to monitor] .SAVE SYS KERMIT [save patched file] The newer OS/8 family systems generally can't turn off the CCL mechanism. Since the R and RU commands are typically disabled on newer releases, only the CCL command work-around applies. Users opting to disable CCL are likely running "older" systems, such as OS/8 V3D on DECtapes. On these systems, ANY of the above methods should work, because the problematic bug didn't exist on those systems. Had DEC not gone "backwards" we could have avoided this entire discussion! It is assumed the user will make "correct" patches to KERMIT-12; at least there is a "safe and proper" mechanism available to accomplish it! cjl ------------------------------ Date: Thu, 6 September 1990 12:00:00 EDT From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: Kermit-12 potential problems A newly implemented ENCODE/DECODE method should eliminate the reported problems with regard to passing encoded binary files through problematic "paths." The method chosen is a variant on the 5-bit encoding algorithm suggested. Encoded files now pass right through all of the WPS-related utilities. It is necessary to acquire virtually all files of this re-release of KERMIT-12 since all ENCODed files are different, as well as the source programs for the ENCODing/DECODing utilities themselves. Due to the file being "bare", the TECO macro K12GLB.TEC is possibly defective when it arrives at a user site; it will now be ENCODed as K12GLB.ENC to avoid this problem. The KERMIT-12 source files are different due to maintenance work, requiring the user to obtain the re-released files. The sources now include a file to "pre-clear" memory. This aids in reducing the size of the ENCODed binary file K12MIT.ENC since undefined areas are no longer "relics" of random values, rather they are all set to 0000 octal. The long strings of identical words will be eliminated since the new encoding format does repeat compression. KERMIT-12 has still not been tested on any DECmates other than the DECmate II, as no volunteers have come forward with the proper hardware: DECmate I with DP278A DECmate I with DP278B DECmate III without internal modem DECmate III with internal modem DECmate III+ A tentative volunteer for the DECmate I with DP278A configuration has been contacted, but testing has not yet started. cjl ------------------------------ 26-Jul-90 1:15:43-GMT,15259;000000000001 Return-Path: <lasner@cunixf.cc.columbia.edu> Received: from cunixf.cc.columbia.edu by watsun.cc.columbia.edu (5.59/FCB) id AA26223; Wed, 25 Jul 90 21:15:41 EDT Received: by cunixf.cc.columbia.edu (5.59/FCB) id AA11871; Wed, 25 Jul 90 21:16:19 EDT Date: Wed, 25 Jul 90 21:16:18 EDT From: Charles Lasner <lasner@cunixf.cc.columbia.edu> To: fdc@cunixf.cc.columbia.edu Subject: This was sent out to PDP8-LOVERS Message-Id: <CMM.0.88.648954978.lasner@cunixf.cc.columbia.edu> I thought you might want to see this; it refers to the encoding problem I reported for a user with the problem (he has no net capability) in the programs using that encoding scheme we discussed... From: Charles Lasner (cjl) To: PDP8-LOVERS Subj: Feedback on encoding issues regarding archived files. I have written a pair of OS/8 programs to ENCODE and DECODE binary files into an "ASCII-fied printable" format. Those of you familiar with either uuencode/uudecode or .BOO format will understand my intentions. They were originally written for the purpose of distribution of binary (.SV) files of KERMIT-12 by Columbia University in NY as part of the standard KERMIT collection (K12*.*). Columbia imposes a restriction on all files: they must be distributed in ASCII only. This is to ensure proper distribution regardless of the "path" taken between Columbia and the end user. Be advised that various problematic E-mailers, ASCII-EBCDIC EBCDIC-ASCII translations, filters for reserved codes, known problematic character substitutions, etc. are lurking out there! Consider yourself lucky if you get your sender's copy intact without some form of "cosmetic" reformatting. By encoding the binary files into an appropriate subset of ASCII, these problems hopefully are avoided. While we can't prevent ALL problems, we can usually tackle the most likely ones. My original design was based on a discussion I had with Frank da Cruz of Columbia University (of KERMIT fame) regarding what to restrict ourselves to in a robust format. He was "unhappy" with some of the vulnerabilities of the uuencode and .BOO formats, which while popular, are not impervious to some "real" problems that have come up. We essentially designed an archiving format that was PDP-8 oriented, but not limited to -8s only. Some of the highlights of the format are: a) File format restricted to "printable" six-bit subset of ASCII only. All else ignored; this was to minimize the "garble" factor, yet maintain a fairly high rate of efficiency: two ASCII characters equal one PDP-8 12-bit word. (This has proved to be problematic and is why we are here!) b) The archive file contains imbedded commands, not implied ones. By validating the commands, you can "trust" the contents. Commands are available for whatever purpose arises. Already implemented are commands to start ("(FILE filename.ext)") and end ("(END filename.ext)") the imbedded file, and an official comment command ("(REMARK anything)") to help document the contents of the rest of the file. This is of course expandable. My OS/8 programs create all three types of commands. The start and end commands also theoretically allow multiple files in an archive, but I ignore the end command in the decoder and only allow one file per archive. I do support the start command completely, which includes a suggested name for the file. This name can be used at the user's option, or can be locally overridden. The encoding program inserts the original file name in this field, as this is of course the most likely name for the file at the other end. c) The archive contains a checksum for its contents to ensure the validity of the file. d) All "white space" character considerations are ignored; imbedded extraneous space characters, formfeeds, extra CR/LF, etc. are harmless. The CR/LF must be present at appropriate intervals, but this is only a problem with files passed through unix systems that delete the CR. Since OS/8 requires the CR and LF to be considered "printable", this is not a problem; the use of programs such as c-KERMIT will insert the CR if configured properly (SET FILE TYPE TEXT). Programs such as Rahul Dhesi's FLIP program are available to correct the problem easily if necessary: FLIP -m *.* or equivalent will remedy this. e) There is an internal record length of 64 characters with framing characters, to ensure the validity of each record. This prevents the file from getting "out of sync" with its original. This causes each line to be 68 characters including CR and LF, which is usually reasonable to most systems. Unfortunately, this scheme has proved to be flawed in an important way that "matters." This format must deliver files to OS/278 systems by the prevailing paths of existent systems connected to DECmates containing only the normally present DEC release software. This could include sending the files via DEC-DX through WPS8, or acquiring the files on either DECmate CP/M-80 or DECmate MS-DOS, possibly using KERMIT-80, or KERMIT-MS as appropriate. If a file is received in the CP/M-80 environment, it can be converted to WPS8 format using a DEC-supplied program called WPSCONV. If a file is received in the MS-DOS environment, it can be converted to WPS8 format using a DEC-supplied program called CONVERT. Incidentally, CONVERT can also convert CP/M-80 files as well, using MS-DOS format as an intermediary; WPSCONV is known to have bugs, which were corrected in CONVERT (which requires the MS-DOS hardware, not just the CP/M-80 hardware). These CP/M-80 and MS-DOS files can also come to the DECmate directly from a Rainbow as well, since the corresponding Rainbow systems are format compatible with the DECmate. DECmate MS-DOS additionally supports IBM-PC diskettes (160K or 180K single-sided only and read-only) as yet another source. Thus there are many paths to WPS8 versions of our files. The problem with these methods is that apparently there is a bug in OS/278 WPFLOP, the only distributed conversion program a user would already have on his OS/278 system. (We haven't actually isolated the problem to WPFLOP, as the complaining user was taking the files from MS-DOS via CONVERT then to OS/278 via WPFLOP; conceivably the problem is in CONVERT, but in any case the problem exists somewhere in this supported path.) The internal encoding used is to break the 12-bit word into two six-bit halves. Each half is in the range 00-77 octal. Adding 041 to the value yields characters in the range of ! through ` or 041 through 140 octal. The codes for 101-132 are A through Z and can be replaced by 141-172 for a through z if desired. This prevents case-sensitivity which is another possible network anomaly. We identified the DECmate problem as an anomaly regarding @ and `. The character codes for 100 and 140 are not treated uniquely, so the resulting OS/278 file is an inaccurate representation of the file. The decoding program correctly failed the conversion on a checksum error, so at least the user was aware of the problem! As the PDP8-LOVERS, we will hopefully acquire an archive site for our files, so all of these considerations will apply. We need a file format that is "bullet-proof" to avoid problems like this one. I am soliciting suggestions for improvements on this encoding scheme (and any other overall file format suggestions as well) to provide an effective solution. The resultant programs will be added to the KERMIT-12 collection freely distributed by Columbia as well as other sources (DECUS, etc.). Some suggestions have already been made: 1. Just "quick-fix" the problem by providing an alternate character to the ` to make it non-anomalous with @. The available choices are { | } and ~ only. The DEL character (octal 177) is unsuitable for other reasons; all other characters are either already used, or unprintable, or lower-case. This has the advantage of being most compatible with the existing programs, since the original character code can be supported as well; the "preferred" character would be generated by all future versions of the ENCODE program, and existing files could be trivially edited for compatibility as needed. This would have to be tested -- it is possible that the bug would persist. The choice is further narrowed to { and | only, since 175 and 176 are sometimes treated as alternates to ESC. It is likely that systems which "mangle" the case of a character which is alphabetic could also do the same to { | } and ~ making them [ \ ] and _ respectively. This makes the entire suggestion unworkable. 2. Change the format to "Hexafied-ASCII" where each PDP-8 12-bit word becomes represented by three characters from a 16-character set such as 0-9,A-F or A-P. The alphabetic codes would be immune to case conversion, and virtually every system supports this subset of ASCII. Instead of 64 characters on a line representing 32 12-bit words, each line would be 72 characters on a line representing 24 12-bit words (not counting framing characters and CR/LF). This also allows for many additional codes if needed. This scheme has the drawback of making the encoded file more inefficient, as the file will generally be 50% longer than those created by the original six-bit scheme. This robust scheme is workable. 3. Modify 2. to include some form of compression. The easiest is to incorporate repeat compression. One simple scheme is to use an indicator character (R was suggested) as a prefix for an encoded count. It could be followed by three characters encoding the value of the 12-bit word and two characters encoding the value of the repeat count. Since this occupies six characters, as does two adjacent 12-bit encoded words, this scheme saves space when used for repeat compression lengths greater than two. The compressed field is the same length as two compressed "triplets", so overall file validation techniques wouldn't require special-case checks, as long as trailing "fill" characters were allowed for the last record before the short checksum record (which is signalled by its length). (T was suggested for this trailer character to be used to pad the last line with 0-69 characters.) This allows for compressing 3-258 repeated 12-bit words into six characters. This would benefit files containing large areas of zeroes or HLT instructions, etc., as this can be the actual contents of binary files. If a .BN file created by PAL8, etc. is loaded and saved, then "junk" areas are created in the .SV file. Unfortunately, this is the norm, and the junk increases the size of the encoded version of the file. If the .BN file is loaded AFTER loading an all-zeroes file such as the binary output of: *0 ZBLOCK 7600 $ or equivalent as necessary (extended memory zeroed if required, etc.), then the file has all-zeroes gaps in it. These would repeat compress out using this scheme. Incidentally, an additional advantage of this method is that the resulting "cleaner" core-image file is slightly easier to disassemble, in case the source is lost. (Anyone who ever disassembled a .SV file or equivalent understands what I mean!). This also makes a binary papertape file (such as a diagnostic) loaded into a .SV file a little easier to follow when consulting the write-up, as memory is zeroed in between the locations referenced in the listing. The .SV file is smaller when encoded than the .BN file due to elimination of the paper-tape encoding overhead. OS/8 files of diagnostics could therefore be more efficiently archived as .SV files (encoded) than .BN files. 4. Change to a 5-bit encoding with compression. This would use 32 codes chosen from A-Z, 0-9 to encode the file five bits at a time per character. Five PDP-8 12-bit words would be encoded in 12 characters. Since PDP-8 binary files are always multiples of 128 12-bit word pages, there would need to be 4.8 "junk words" at the end of each block to encode the implied length of 130 words/block. Each line would be 78 characters (plus framing characters and CR/LF) so that four lines encodes a PDP-8 page, just as in the original six-bit scheme (the original scheme used 64 characters per line!). The last line of the file would contain 0-77 padding characters as necessary to maintain the line width as before. Repeat compression schemes can be expressed in any way that is a multiple of 12 characters; perhaps one or two adjacent expressions of repeat compression similar to above. Expected efficiency of this scheme is similar to the original six-bit method, or possibly slightly better; if compression is NEVER useful, then the file is 1.2 times as large. There is an implementation restriction placed on the DECODE program: it should be relatively short, since it must be distributed in source form. It must also be written in a subset of PAL8 compatible with the original PAL8 of the PS/8 days (ugh!) to ensure viability on any OS/8 family system. PAL8 Version B0 from OS/278 is distributed in ENCODed form, so this restriction need not apply to any other programs such as the ENCODE program or KERMIT-12, etc. It has been determined that PAL8 Version B0 and the companion CREF Version B0 will correctly function on any OS/8 family system on any PDP-8 member suitably configured to run the operating system the user already has running. (There is a minor anomaly when using input files from the TTY: handler; see K12MIT.DOC for a detailed explanation.) CPU extensions such as BSW and IAC RAL are not present in these programs, as was the original intention of OS/8 (which eventually was lost as newer members of DEC's programming staff were ignorant of this problem!). It is acceptable to have a "bare-bones" subset of the DECODE program distributed in "old" PAL8-compatible source form, along with a "fancier" version written in a more modern PAL8 language, as the binary could then be DECODed with the subset DECODE program, or the source could be assembled with PAL8 Version B0 to "bootstrap" the "full" version of the DECODE program as necessary. For those of you who can't wait, and want these utilities as they stand (using the fallible six-bit method), they are available via anonymous FTP from Columbia University (watsun) as /w/kermit/d/k12dec.pal and /w/kermit/d/k12enc.pal for the DECODer and ENCODer respectively. More information is available in /w/kermit/d/k12mit.doc or /w/kermit/d/k12mit.pal regarding use of PAL8 Version B0, other assemblers (such as PAL10 or P?S PAL) or other KERMIT-12 issues, etc. Charles Lasner (lasner@cunixf) cjl ------------------------------ Date: Fri, 4 May 90 13:55:02 EDT From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: Kermit-12 problems If the release files of KERMIT-12 are brought to DECmate MS-DOS via any of the various paths that can be used (such as from a Rainbow in either CP/M RX50 or MS-DOS RX50 format, etc.; in this particular case the reporting user obtained them using IBM-PC SSDD 180k 5-1/4" PC-DOS format.) then the files are available as DECmate II MS-DOS or CP/M-80 files on one of its standard devices (a:,b:,c:,d: floppies or e:,f:,g:,h: hard disk volumes). The ultimate goal is to get these files (un-scathed!) to DECmate II OS/278 for KERMIT-12 installation. The standard DEC CONVERT program alledgedly can convert any combination of MS-DOS or CP/M-80 or WPS/8 from/to each other. By converting the files to WPS/8 documents, the files can be translated to OS/278 later (using the OS/278 WPFLOP utility). There is a problem with DEC's CONVERT.EXE: it only CORRECTLY supports Rainbow/DECmate RX50 MS-DOS and CP/M diskettes, so the other formats (8" CP/M-80 diskettes and one-sided PC diskettes) have to be pre-converted with the appropriate copy commands to a supported diskette or hard disk volume first before using CONVERT. This is not a big problem, as we are merely using standard procedures, but the point is that much of this is undocumented or obscure. (I had to help the reporting user to copy his files to a "friendlier" device for CONVERT's benefit which only delayed our discovery of the REAL problem!) The CONVERT program alledgedly supports ASCII/WPS format conversion from/to any of MS-DOS, CP/M-80, or WPS/8 (but only on a:,b:,c:,d:,e:,f:,g:,h: logical drives, not on the other hardware or media possibly hooked up to the DECmate!). Our purpose is to move the K12MIT files to WPS/8 format. This can be attempted with standard commands of CONVERT, but there apparently is a bug: When you boot to OS/278 and retrieve the WPS/8 documents (via WPFLOP) which are the ENCODed files of KERMIT-12 as OS/278 files, there is a character anomaly between two encoding characters (specifically @ and `) that destroys the integrity of the affected file. This is possibly due to a bug in OS/278 WPFLOP, but more likely is a problem with MS-DOS CONVERT. Regardless of the perpetrator, this path is not viable to obtain the ENCODed files of the KERMIT-12 release. Fortunately, the source files are not affected, as the anomalous characters are not part of the PDP-8 assembly language, and only comments could be affected. (As far as I can tell, there aren't any affected characters even in the comments!) It is therefore necessary to assemble KERMIT-12 directly from the sources when installing it on the DECmate II if obtaining it via any path which includes CONVERT/WPFLOP. The other ENCODed files are for PAL8 Version B0 and CREF Version B0 which are already present on the DECmate II as part of the standard release of OS/278 for the DECmate II and are thus superfluous. All ENCODed files can be recreated from OS/278 itself using the sources, etc., so the intended release files can be recreated for distribution to other OS/278 sites (bypassing the CONVERT/WPFLOP path). Future versions of the DECODE program will obviate this problem when an appropriate alternative format is supported properly which is immune to DEC's glitch. A related problem surrounds the GLOBAL TECO macro K12GLB.TEC (aka GLOBAL.TEC). Due to the "delicate" nature of TECO macros, they could get "mangled" by the time they get to a user site. Future releases of KERMIT-12 will "protect" the macro by ENCODing it into K12GLB.ENC. It has also been reported that there are problems running the macro on certain releases of OS/8 family TECO and on other TECOs for other machines, and also problems running certain versions of OS/8 TECO on the DECmates. The author will investigate this problem eventually, but the main usage of the macro is for KERMIT-12 source maintainence on an OS/8 V3D system using the corresponding version of TECO; it is beyond the scope of KERMIT-12 development to investigate the myriad releases of TECO and their hardware and operating system dependencies; perhaps some TECO hackers can assist us! An obscure problem indeed! Users give good feedback... Can you suggest a fix for the CONVERT/WPFLOP-induced corruption? One is to allow the current format as a subset, but use a substitution character for the garbled character. Our character set is the 64 characters from ! through `, so the anomalous occurrences of @ are problematic. If we change the preferred character for ` to a lower-case letter (only octal 141 up is available, so let's assume the use of a) we avoid the CONVERT/WPFLOP problem. Newer released ENCODed files would then be immune to the treachery, but would require the newer DECODing program (or use TECO to change all occurrences of a to ` and then use the old DECODE program). Should we abandon this inner format altogether? We could use an even more robust format like ASCII hex: 0-9 and A-F (allowing a-f as well!) at the expense of longer files (currently 2 characters=12 bits, but would become 3 characters=12 bits). This would also hold up better through EBCDIC network conversion... cjl |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 | / KERMIT FOR DEC 12-BIT MACHINES / LAST EDIT: 06-SEP-1990 11:00:00 CJL XLIST OFF IFNDEF OFF <OFF= 1> /TURN LISTING OFF IFNDEF ON <ON= 0> /TURN LISTING ON XLIST ON; IFZERO 1 < *** **** *********** ********* *** *** *** *********** ***** **** *** **** *********** ********** **** **** *** *********** ***** ****** *** **** *** *** **** **** **** *** *** *** *** *** *** **** *** *** *** ***** ***** *** *** *** ** **** *** **** *** *** *** ***** ***** *** *** *** ** *** ******* *** *** **** ************ *** *** *** ** ****** ********** ********** *** **** *** *** *** ***** *** ** ******* ********** ********* *** **** *** *** *** ***** *** ** *** **** *** *** **** *** ** *** *** *** *** ** *** **** *** *** **** *** ** *** *** *** *** ** *** **** *** *** **** *** *** *** *** *** ** *** **** *********** *** **** *** *** *** *** *** ********* *** **** *********** *** **** *** *** *** *** *** ********* > XLIST ON / COPYRIGHT (C) 1989, 1990 BY THE TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF / NEW YORK. / PERMISSION IS GRANTED TO ANY INDIVIDUAL OR INSTITUTION TO COPY OR USE THIS / DOCUMENT AND THE PROGRAM(S) DESCRIBED IN IT, EXCEPT FOR EXPLICITLY COMMERCIAL / PURPOSES. / EDIT HISTORY. /014 CJL / 052 06-SEP-1990 BUG FIX. CHARLES LASNER (CJL) / SENDING A FILE WHICH EXACTLY FILLS THE LAST DATA PACKET AT THE / END OF THE FILE WILL CAUSE THE PACKET TO BE SENT TWICE. THE / ROUTINE DIDN'T CHECK FOR AN EMPTY OUTPUT BUFFER AT EOF. / 051 29-AUG-1990 BUG FIX. CJL / PDP-8/A NOT IDENTIFIED CORRECTLY IN CPUID ROUTINE. THE UPDATED / PC IS WHAT IS LOADED INTO THE AC WHEN 7016 IS EXECUTED ON THE / KK-8/A CPU. THE ROUTINE WAS CHECKING FOR THE NON-UPDATED VALUE. / ALSO NEW DOCUMENTATION FOR PRE-CLEARING MEMORY FOR BENEFIT OF / ENCODED BINARY FILES. / 050 06-SEP-1989 DECMATE I SUPPORT, ETC. CJL / THIS EDIT IMPLEMENTS DECMATE I SUPPORT USING THE DP278-A OR -B. / A NEW CONDITIONAL 'PORT' SELECTS WHICH PORT IS TO BE USED. IF / KERMIT-12 IS RUN ON DECMATE I (WHILE NOT CONFIGURED FOR SERIAL / PRINTER PORT COMMUNICATIONS; SEE EDIT 048.) THEN REMOTE / COMMUNICATIONS TAKES PLACE ON THE PORT SELECTED AT ASSEMBLY TIME / ('PORT=0' OR 'PORT=1'). ADDED BAUD RATE PARAMETER 'BRATE' TO / SELECT REMOTE COMMUNICATIONS BAUD RATE FROM THE STANDARD TABLE; / DEFAULTS TO 1200 BAUD ('BRATE=7'). / 049 30-AUG-1989 REMOTE FLOW CONTROL, ETC. CJL / THIS EDIT IMPLEMENTS FLOW CONTROL SUPPORT (IF FLOW CONTROL IS / ENABLED) FOR THE REMOTE LINE WHILE SENDING PACKETS TO THE REMOTE / KERMIT REGARDLESS OF STATE. PREVIOUSLY, FLOW CONTROL ONLY / APPLIED TO CONNECT MODE. LOCAL FLOW CONTROL (TOWARDS THE REMOTE / KERMIT) IS UNNECESSARY AS LOCAL BUFFERS FOR REMOTE INPUT ARE / ALWAYS AVAILABLE. CERTAIN ROUTINE CHANGES MADE FOR BENEFIT OF / DECMATE I SUPPORT IN A SUBSEQUENT EDIT. / 048 24-AUG-1989 DECMATE II, ETC. SUPPORT. CJL / ONCE-ONLY CODE ADDED TO IMPLEMENT DECMATE II, ETC. REMOTE LINE / SUPPORT ON SERIAL COMMUNICATIONS PORT. SELECTED PORT IS / INDICATED ON OPENING BANNER IF OPERATING ON DECMATE. / THIS EDIT PROVIDES BASIC SUPPORT OF THE DECMATE II COMMUNICATIONS PORT AS AN / AUTOMATIC FEATURE OF THE STANDARD RELEASE OF K12MIT. AUTOMATIC DETECTION OF / DECMATE II, ETC. HARDWARE IS PERFORMED UNLESS THE PDP-8-TYPE REMOTE LINE / SUPPORT IS ASSEMBLED FOR THE SERIAL PRINTER AS THE REMOTE LINE ('SPRINT' IS / SET OR EQUIVALENT). / THIS EDIT INCORPORATES ALL OF THE INFORMATION TAKEN FROM VARIOUS SOURCES / REGARDING DECMATE PORT INITIALIZATION, ETC. EVERY ATTEMPT HAS BEEN MADE TO / COMPLETELY SET ALL APPROPRIATE REGISTERS, ETC. FOR DECMATE II, III, III+ / OPERATION. NO SUPPORT EXISTS FOR THE DECMATE III BUILT-IN MODEM OPTION, AS / EXPLICIT DOCUMENTATION IS NOT AVAILABLE (SOME OF THE INITIALIZATION CODE IS / APPARENTLY USED TO DISABLE THE MODEM). THESE ROUTINES ARE ONLY KNOWN TO WORK / ON THE DECMATE II, AS THE III (ESPECIALLY WITH OPTIONAL MODEM) AND THE III+ / HAVEN'T BEEN AVAILABLE TO THE AUTHOR FOR TESTING. THE INITIALIZATION CODE / WILL BE UPDATED LATER TO INCLUDE PANEL REQUESTS, ETC. TO CORRECT ANY / PROBLEMS, ETC. DECMATE-SPECIFIC FEATURES (SUCH AS SETUP COMMANDS) WILL BE / ADDED LATER AND ENABLED FROM THESE ROUTINES. / THIS EDIT INCORPORATES NON-INTERRUPT ROUTINES WHICH HAVE BEEN TESTED AT THE / MAXIMUM COMMUNICATIONS SPEED OF THE DECMATE II (19200 BAUD). THEY WILL / SUFFICE FOR ALL KERMIT IMPROVEMENTS SHORT OF SLIDING WINDOWS AT WHICH TIME / INTERRUPT-DRIVEN I/O WILL BE REQUIRED. (INTERRUPT-DRIVEN I/O IS ILLEGAL ON / CERTAIN OS/8 SYSTEMS WHERE INTERRUPTS ARE HARMFUL TO THE SYSTEM OR NON-SYSTEM / HANDLERS.) / 047 21-AUG-1989 CODE CLEANUP. CJL / STREAM-LINED CONNECT MODE ROUTINES FOR MINIMUM USE OF IOTS. THIS / IS IN PREPARATION FOR EVENTUAL DECMATE II OPERATION, AND TO / MINIMIZE K12PCH PATCH FILE SIZE. CERTAIN NON-CONNECT ROUTINES / MOVED TO FACILIATE CONNECT ROUTINE REORGANIZATION. / 046 15-AUG-1989 CODE CLEANUP. CJL / ADDED NEW (NON-CONNECT) MODE COMMUNICATIONS ROUTINES FOR EVENTUAL / DECMATE USE. ELIMINATION OF 'IREM' AND 'IREMW' ROUTINES IN FAVOR / OF 'COMIN'. ELIMINATION OF 'OREM' IN FAVOR OF 'COMOUT'. ADDED / STATUS UPDATE ROUTINE ('UPSTATUS') FOR EVENTUAL DECMATE II, ETC. / USAGE. ELIMINATED PDP-8, DECMATE I, DECMATE II CONDITIONALS. / REORGANIZED SERIAL LINE CONDITIONALS AND ADDED NEW 'SPRINT' / PARAMETER FOR SERIAL PRINTER PORT USAGE AS COMMUNICATIONS PORT. / ADDED ONCE-ONLY CODE ADDED TO AUTOMATICALLY RECOGNIZE DECMATE I / AND II OPERATION UNLESS ASSEMBLED FOR REMOTE COMMUNICATIONS ON / SERIAL PRINTER PORT ('SPRINT' SET). UPDATED K12PCH.PAL TO / CORRESPOND TO NEW DEFINITIONS. DEFINED EVENTUALLY NEEDED / COMMUNICATIONS PORT INSTRUCTIONS FOR DECMATE II; ACTUAL DECMATE / II OPERATION WILL BE DEFINED IN A SUBSEQUENT EDIT. DOCUMENTED / NEW LOADING AND SAVING INSTRUCTIONS FOR K12MIT TO ALLOW FOR / ONCE-ONLY CODE IN 10000-11777 WITHOUT SWAPPING THE CODE OUT FOR / THE USR. THIS ELIMINATES OVERHEAD WHEN LOADING K12MIT, BUT IS / DIFFERENT FROM THE FORMER INSTRUCTIONS WHICH ASSUMED NO OTHER / USAGE OF 10000-11777 OTHER THAN THE (LOCKED-IN) USR. / THIS EDIT PROVIDES THE FRAMEWORK FOR AUTOMATIC DETECTION OF PROGRAM EXECUTION / OF K12MIT ON ANY MEMBER OF THE DECMATE FAMILY (I, II, III, III+). WHEN / 6120-TYPE CPU DETECTION OCCURS, THE DECMATE I OR II-TYPE COMMUNICATIONS PORT / INITIALIZE CODE IS AUTOMATICALLY SELECTED AS NECESSARY UNLESS THE PDP-8-TYPE / ROUTINES ARE ASSEMBLED (WITH 'SPRINT' SET OR EQUIVALENT USER SETTINGS, ETC.) / FOR THE VT-78-TYPE PRINTER PORT (32/33), IN WHICH CASE THE COMMUNICATIONS IS / DONE VIA THE PRINTER PORT ON THE DECMATE (WHICH IS ALMOST PDP-8 COMPATIBLE AND / IS ACCOMODATED AS SUCH). / SUBSEQUENT EDITS SHOULD PROVIDE FOR A DECMATE I PARAMETER TO CONTROL THE PORT / SELECTION, AS THERE ARE AT LEAST TWO VARIANT OPTIONS BOARDS (DP-278A AND / DP-278B) EACH CONSISTING OF TWO PORTS. / 045 12-AUG-1989 BUG FIX. CJL / FINISH, GET, AND RECEIVE COMMANDS FAIL TO ABORT PROPERLY / (ESPECIALLY AFTER THE SEND COMMAND HAS BEEN USED), AS THE CURRENT / OPERATING MODE ('KMODE') IS NEVER PROPERLY SET, OR IS SET AFTER / SEVERAL PACKETS HAVE BEEN SENT. EACH COMMAND NOW SETS ITS OWN / OPERATING MODE BEFORE INITIATING ANY PACKETS. / 044 11-AUG-1989 CODE CLEANUP. CJL / CHANGED 'CCMSG' TO 'ABMSG' WITH CLEARER MESSAGE. CHANGED / 'CCFLAG' TO 'ABFLAG' FOR CONSISTENCY. CHANGED ABORT CHARACTER / FROM <^C> TO CHOICE OF <^X> OR <^Z> FOR CONSISTENCY. ELIMINATED / 'ITTY' AND 'ITTYW' ROUTINES BY USING 'CTLCTST' AND 'INPUT' / ROUTINES ALREADY AVAILABLE A/O EDIT 043. ELIMINATED 'TCHAR' IN / FAVOR OF 'INCHAR' AVAILABLE A/O EDIT 043. / 043 07-AUG-1989 CODE CLEANUP, ETC. CJL / REWRITE OF CONSOLE SUPPORT ROUTINES INCLUDING FORCED-ECHO OUTPUT / AND COLUMN COUNT FOR <HT> SIMULATION IN PREPARATION FOR IMPENDING / USER-INTERFACE REWRITE. 'SCRIBE', 'LININP', AND 'ESCPRNT' / ROUTINES NOW CALL "P7ECHO" ROUTINE TO ENSURE PRINTING OF CRUCIAL / MESSAGES. / 042 13-JUN-1989 CODE CLEANUP. CJL / FIXED VARIOUS NAK-RELATED BUGS AND SEND-INIT PROBLEMS AS IN K278 / (SOME OF THE K278 STUFF IS DEFICIENT!). CALCULATION OF PROPER / SEQUENCE NUMBER FOR NAK CORRECTED OVER FORMER (K08MIT AND K278) / VERSIONS. ADDED ERROR MESSAGE FOR FULL-DISK PROBLEM. / 041 12-MAY-1989 BUG FIX. CJL / VARIOUS VERSIONS (DECMATE) WON'T FUNCTION REMOTELY WHILE KL-8 / VERSIONS WORK FINE. ADDED REMOTE LINE READ IOT TO INITIALIZE / REMOTE LINE AT STARTUP TIME FOR VERSIONS REQUIRING THIS. / CORRESPONDING CHANGES IN PATCH FILE MADE FOR REMOTE LINE READ IOT / IN TWO PLACES. / 040 07-MAR-1989 COSMETIC CLEANUP. CJL / CLEANUP OF EDIT HISTORY AND OTHER COMMENTS. / 039 21-MAY-1988 CODE CLEANUP. CJL / ADDED VARIABLE 'INIECHO' TO ALLOW DEFAULT CONNECT-MODE STATE TO / BE HALF-DUPLEX ("SET LOCAL-ECHO ON"). MODIFIED INPUT SERVICE / ERROR ADDRESSES TO SIMPLIFY ERROR TABLES. / 038 19-MAY-1988 CODE CLEANUP. CJL / ELIMINATED TRAILER FILES DURING ASSEMBLY BY CREATING VARIABLES / 'GENMSG' AND 'UMSG.' THIS ALLOWS THE HEADER FILE (PARAM.PA) TO / CONTAIN THE LOCAL MESSAGE TEXT WITHOUT SUBSEQUENT OVERLAY (WHICH / WAS WHY THERE FORMERLY WAS A TRAILER FILE CAPABILITY). OVERLAY / BY K12PCH.BN WILL DEFAULT TO CREATION OF A DUMMY USER MESSAGE / (WITHIN K12PCH) ENCOURAGING LOCAL CUSTOMIZATION. K12MIT.BN WILL / CONTAIN A NULL MESSAGE BY DEFAULT UNLESS CUSTOMIZED IN PARAM.PA. / 037 21-JAN-1988 BUG FIX. CJL / RESET OS/8 DEVICE CONTROL WORD TABLE TO DELETE TENTATIVE FILE IN / CASE OF PRIOR INPUT SERVICE ERROR. / 036 20-JAN-1988 BUG FIX. CJL / RESET 'OFFLG' WHEN DOING INPUT SERVICE IN CASE PRIOR ERRORS LEAVE / THE FLAG SET. / 035 14-JAN-1988 USR RESIDENT CODING. CJL / CALLS TO USR NOW USE 10200 INSTEAD OF 17700. NO SWAP OVERHEAD / WHEN OPENING OR CLOSING FILES. / 034 13-JAN-1988 CODE CLEANUP. CJL / ALL EIGHT-BIT ORIENTED CONSOLE CODE ELIMINATED; NOW IGNORES / PARITY (JUST SEVEN BITS). / 033 12-JAN-1988 CODE CLEANUP. CJL / 'TTYOUT' AND 'OTTY' ROUTINES ELIMINATED; NOW USES 'P7CH' FOR ALL / CONSOLE OUTPUT (EXCEPT FOR CONNECT MODE). / 032 12-JAN-1988 CODE CLEANUP. CJL / VARIOUS ROUTINES REWRITTEN TO ELIMINATE DEPENDENCIES ON CPU TYPE / BEYOND THE CLASSIC PDP-8. / 031 11-JAN-1988 CODE CLEANUP. CJL / ELIMINATED 'RTDISP' AND CHANGED CALLING CONVENTION FOR DISPATCH / ROUTINE. ALL CALLERS NOW LOCAL OR VIA LOCAL POINTERS. ADDED / SEVERAL CONDITIONAL PARAMETERS AND LABELS FOR BENEFIT OF / K12PCH.PAL. / 030 05-JAN-1988 CODE CLEANUP. CJL / CHANGED LOWER/UPPER CASE CONDITIONAL ASSEMBLY PARAMETERS AND MORE / EFFICIENT CODE. / 029 21-DEC-1987 CODE CLEANUP. CJL / CHANGED CALLING CONVENTIONS FOR 'SCRIBE' AND SIMILAR ROUTINES AND / REWROTE 'COMMAND' ROUTINE. / 028 15-DEC-1987 CODE CLEANUP. CJL / COMPLETE REWRITE OF FILE LOOKUP ROUTINE. 'LUKUP' NOW USES FIELD / ONE BUFFER AND ITS OWN AUTO-INDEX REGISTER CONSERVING PROGRAM / SPACE. / 027 05-DEC-1987 CODE CLEANUP. CJL / CHANGED DISPATCH ('DISPA0') ROUTINE TO USE 'SRCHTABLE' ROUTINE. / ALL CALLS MADE COMPATIBLE. ELIMINATED 'SCANC' CODE. ELIMINATED / CODE WITHIN 'DPARS' ROUTINE. 'LUKUP' ROUTINE NOW DOES ITS OWN / DISK I/O. ELIMINATED 'BLKIN' ROUTINE. / 026 27-NOV-1987 NEW CONNECT MODE CODE. CJL / TOTAL REWRITE OF ALL CONNECT MODE CONSOLE AND REMOTE INPUT AND / OUTPUT TERMINAL ROUTINES. CONNECT IS NOW FULLY BUFFERED IN ALL / DIRECTIONS. IF FLOW CONTROL IS OBEYED, ANY BAUD RATE CAN BE / ACCOMODATED BOTH LOCALLY AND REMOTE (UP TO 9600 BAUD TESTED, / SHOULD WORK TO AT LEAST 19200 BAUD BY INSPECTION). TESTED WITH / FAST VT-100 EMULATOR CONSOLE TO PROVE ESCAPE SEQUENCES ARE NOT / DROPPED WHEN LOCAL TERMINAL IS FASTER THAN REMOTE LINE. LIMITED / USE OF SUBROUTINES TO IMPROVE HIGH BAUD RATE OPERATION. ADDED / TABLE-DRIVEN ERROR EXIT ROUTINE FOR SEND ROUTINES. / THIS EDIT PROVIDES FULLY BUFFERED INPUT/OUTPUT ROUTINES FOR BOTH LOCAL AND / REMOTE PORTS. NO INTERRUPTS ARE USED FOR MAXIMUM COMPATIBILITY WITH OS/8 / DEVICES (SOME OF WHICH ARE INTOLERANT OF INTERRUPTS, SUCH AS TD-8/E). REMOTE / FLOW CONTROL (IF ENABLED) WILL SIGNAL BUFFER FILLING VIA <DC3> WHEN THE BUFFER / IS 3/4 FULL. WHEN THE BUFFER REACHES 1/4 FULL, THE REMOTE WILL BE SENT <DC1> / TO ALLOW FURTHER OUTPUT. REMOTE FLOW CONTROL IS SUPPORTED IN BOTH DIRECTIONS; / LOCAL FLOW CONTROL IS FROM THE KEYBOARD ONLY. / WHILE THE CONSOLE OUTPUT IS PAUSED BY <DC3>, THE BUFFER WILL FILL WITH OUTPUT / CHARACTERS. WHEN THE USER RELEASES THE CONSOLE WITH <DC1>, THE BUFFER WILL / RAPIDLY EMPTY (ASSUMING THE CONSOLE IS FASTER THAN THE REMOTE LINE). THIS / ALLOWS THE USER TO PAUSE THE CONSOLE WITHOUT BACKING UP THE REMOTE LINE UP TO / THE LIMITS OF BOTH LOCAL OUTPUT AND REMOTE INPUT BUFFERS. / 025 24-NOV-1987 NEW FEATURES AND CODE CLEANUP. CJL / PROPER INTERRUPT SETUP FOR <^C> AND <^P>, ECHO STATE. ALL / MESSAGES IN NEW FORMAT, (SOME NEW ONES HAVE BETTER CONTENT). / ELIMINATED 'PRI6B' AND 'REM6B' ROUTINES. NEW AND IMPROVED INPUT / SERVICE ERROR CODE MOVED TO PROPER PAGE. REWROTE CONNECT / ROUTINES TO ALLOW NON-INTERRUPT BUFFERED I/O LATER. CREATED NEW / VARIABLE 'ESCHAR' AND PARAMETER 'ESCAPE' TO SET DEFAULT ESCAPE / CHARACTER. ESCAPE CHARACTER CAN BE CHANGED IN MEMORY AND WILL BE / USED CORRECTLY BY ALL ROUTINES. ADDED 'ESCPRNT' ROUTINE TO / HANDLE ALL CASES (INCLUDING NON-CONTROL CHARACTERS). DEFAULT / ESCAPE PARAMETER VALUE COMPATIBLE WITH K08V2, BUT IS A USER / PARAMETER, CONFIGURED AS OTHER PARAMETERS DEFINED IN EDIT 017. / CREATED ESCAPE FUNCTION TABLE FOR EXPANSION LATER. NOW SUPPORTS / ESCAPE C(LOSE) IN UPPER OR LOWER CASE, ESCAPE ESCAPE (SEND ONE / ESCAPE CHARACTER). ALL BAD ESCAPE COMMANDS WILL ISSUE <BEL> / CHARACTER TO WARN USER THAT COMMAND IS ILLEGAL AND OTHERWISE WAS / IGNORED. CREATED NEW VARIABLE 'ECHOFLAG' TO ALLOW LOCAL ECHO IN / CONNECT MODE. / 024 19-NOV-1987 NEW FEATURES. CJL / NEW STARTUP MESSAGES AND HELP METHOD VIA COMMAND. CPU TYPE / IDENTIFICATION TO ALLOW FUTURE VERSIONS TO CHECK FOR QUIRKS AND / MODEL DEPENDENCIES. THE DEFAULT PROMPT REFLECTS THE ACTUAL CPU / TYPE (THUS "KERMIT-12>" ON PDP-12). VERSION, REVISION, AND DATE / NOW EQUATED SYMBOLS. / 023 18-NOV-1987 NEW CONSOLE I/O PACKAGE. CJL / NEW CONSOLE I/O ROUTINES WITH DC1/DC3 SUPPORT FOR CONSOLE / TERMINAL MESSAGES NOT ASSOCIATED WITH ANY REMOTE ACTIVITY (NOT TO / BE USED DURING CONNECT MODE). USES FIELD ONE FOR MESSAGE TEXT TO / ALLOW FOR MORE PROGRAM SPACE. THE MESSAGES ARE NOW GIVEN IN / UPPER/LOWER SIXBIT FORMAT. SUPPORT FOR <^P> RESTART AND <^O> TO / FLIP ECHO. UPPER-CASE CAN BE FORCED BY CHANGING A VARIABLE / ('UPONLY'). / 022 17-NOV-1987 BUG FIX. CJL / EXTRA-LONG INIT PACKETS CORRUPTING PROGRAM; NOW CHECKS FOR AND / IGNORES EXTRA CAPABILITIES BEYOND 'CAPAS' BYTE. / 021 17-NOV-1987 CODE CLEANUP. CJL / REWROTE TENTATIVE OUTPUT FILE LENGTH CODE FOR MORE CONSISTENCY. / RENAMED "FINISH" COMMAND CORRECTLY (FORMERLY "BYE"). / FORMER CODE REGARDING THE TENTATIVE FILE MAXIMUM LENGTH WAS ACCEPTABLY / ORGANIZED FOR ORIGINAL PS/8, OS/8 CONVENTIONS. WITH THE EVOLUTION OF THE / OPERATING SYSTEM INTO OS/78 (VERSIONS 1-4) AND OS/278 (VERSIONS 1-2), THE / ENTER OPERATION HAS BEEN CHANGED WITH DANGEROUS CONSEQUENCES. / THE ORIGINAL DEFINITION OF THE LENGTH RETURNED BY ENTER IS THE ACTUAL LENGTH / OF THE LARGEST EMPTY (IN TWO'S COMPLEMENT FORM). IF RECORD 7777 IS PART OF / THE ACTUAL LARGEST EMPTY (FULL SIZE DEVICE AND THE LARGEST EMPTY IS LAST ON / THE DEVICE), THEN THE LENGTH RETURNED IS ONE LESS (THIS IS A LONG STANDING / BUG). SINCE THERE IS NO STRAIGHT-FORWARD WAY TO DETERMINE THIS, THE LENGTH IS / ASSUMED TO BE CORRECT. / TESTS WITH THE DECUS VERSION OF OS/278 (DM-101) REVEAL A DANGEROUS CHANGE: / THE LENGTH RETURNED IS TWO LARGER THAN ACTUALLY EXISTS! / TO COUNTERACT THIS, EDIT 010 INSERTED A DECREMENT OF TWO INTO THE LENGTH / BEFORE PASSING IT BACK TO THE KERMIT FILE WRITING ROUTINE. THE FILE WRITING / ROUTINE THEN ADDS ONE TO THE LENGTH TO CREATE A "DANGER COUNT", I.E., IN TWO'S / COMPLEMENT NOTATION, THIS IS THE AMOUNT THAT WILL INDICATE FILE OVERFLOW / SHOULD IT REACH ZERO. / THIS HAS NOW BEEN REORGANIZED TO ALLOW THE ENTER ROUTINE TO SET THE DANGER / COUNT DIRECTLY. OS/8 USERS MUST ALLOW FOR THE EXTRA ROOM (WHICH MUST BE / PRESENT BUT WILL NOT BE USED), SINCE NO CHECK FOR SYSTEM VERSION WILL BE / PERFORMED. / 020 16-NOV-1987 NEW ROUTINES AND CODE CLEANUP. CJL / REWROTE ENTIRE OUTPUT FILE PACK ROUTINE. NOW SUPPORTS / ASCII/BINARY INTERNAL FILE MODE FOR LATER USE. USES OUTPUT / BUFFER IN FIELD ONE (SAME DEFINITIONS AS INPUT BUFFER) TO ALLOW / MORE PROGRAM SPACE. END OF FILE CONVENTION IN ASCII MODE NOW / INCLUDES ENSURING <^Z> CHARACTER PACKED INTO FILE (OR NOT). / REWROTE ENTIRE OUTPUT FILE CLOSE ROUTINE TO IMPLEMENT <^Z> / SCHEME. ELIMINATED SEPARATE OUTPUT FILE INITIALIZE ROUTINE; USE / SPECIAL ROUTINE CALL INSTEAD. FIXED PACKET WRITE BUG. / 019 15-NOV-1987 NEW ROUTINES AND CODE CLEANUP. CJL / FIXED UNPACK <^Z> BUG. REWROTE ENTIRE INPUT FILE UNPACK ROUTINE. / NOW SUPPORTS ASCII/BINARY INTERNAL FILE MODE FOR LATER USE. USES / INPUT BUFFER IN FIELD ONE TO ALLOW MORE PROGRAM SPACE. BUFFER / FIELD DEFINED VIA SYMBOLS TO ALLOW CHANGES IN THE FUTURE. END OF / FILE CONVENTION IN ASCII MODE NOW INCLUDES SENDING <^Z> CHARACTER / OR NOT. ELIMINATED SEPARATE INPUT FILE INITIALIZE ROUTINE; USE / SPECIAL ROUTINE CALL INSTEAD. / 018 09-NOV-1987 BUG FIX AND CODE CLEANUP. CJL / FIXED RECEIVE BUG; NOW ALLOW DEV: ON RECEIVE. / 017 05-NOV-1987 NEW FEATURES. CJL / CONDITIONAL ASSEMBLY PARAMETERS ADDED FOR MACHINE TYPE (PDP-8, / DECMATE I, DECMATE II/III/III+), REMOTE LINE AND LOCAL TERMINAL / INTERFACE DEFINITIONS. / 016 05-NOV-1987 CODE CLEANUP. CJL / OPTIMIZATION OF CODE, LITERALS, CONSTANTS. / 015 04-NOV-1987 BUG FIX. CJL / INPUT SERVICE ROUTINE ERROR DOES JMP INSTEAD OF JMS WHEN CALLING / COMMON ERROR HANDLER. / 014 02-NOV-1987 SOURCE FILE CLEANUP. CJL / SOURCE FILE COSMETICALLY CLEANED UP AND RENAMED TO K12MIT.PAL / WHICH CONFORMS WITH CUCCA NAMING CONVENTION. NO ACTUAL BINARY / CODE CHANGES BEYOND K08V2. THIS EDIT HISTORY ADDED. ENTRIES / PRIOR TO 014 TRANSCRIBED BY CJL. / SINCE THE PDP-12 (AND OTHER 12-BIT DEC MACHINES) IS THE INTENDED ENVIRONMENT / FOR THIS PROGRAM, IT IS NOW KNOWN AS KERMIT-12. / ASSEMBLING THE SOURCE FILE PRODUCES BINARY IDENTICAL TO K08V2.PA CONFIRMING / THAT SOURCE CLEANUP DOESN'T DAMAGE THE CODING (K08V2 IS NOW OBSOLETE). / 013 01-OCT-1987 CHANGE TO VERSION 2.0. R. SCHLERF (RICH) / CHANGED 'RKIOT'/'RTIOT' TO 43/44 REMOTE LINE IOT (LOCAL / PREFERENCE). CHANGED 'ESCAPE' CHARACTER TO ^] ('CONX1') FOR / GENERIC CONFORMITY. ADDED VERSION/COMMAND BANNER AT STARTUP FOR / MINI-HELP. INCORPORATED K278 CHANGES 003-006, 009-010 (NO / INTERRUPTS). DELETED 'ERRMSG.' NOW USES 'STXERR' AT 'CLOOP9'+2 / FOR PROGRAM SPACE. TO CONFORM TO GENERIC KERMIT, "BACK ON PDP8" / MESSAGE DELETED AND REPLACED WITH BEEP <^G>. MESSAGE "SENDING / FILE XXXXXX.XX CREATED ON DD-MM-YY" REDUCED TO "SENDING FILE / XXXXXX.XX" TO CONFORM TO GENERIC KERMIT. PARITY BIT IS IGNORED / ON BOTH REMOTE AND TTY LINES. OUTPUT PARITY IS SET TO SPACE. / PROGRAM RENAMED TO K08V2.PA AND MADE AVAILABLE TO CUCCA BY: / RICHARD SCHLERF (RICH) / AMERICAN CYANAMID COMPANY / MEDICAL RESEARCH DIVISION / LEDERLE LABORATORIES / BUILDING 190 ROOM 115H / PEARL RIVER, NEW YORK 10965 / (914) 732-2186 (09:00 TO 16:00) / SINCE PRIMARY APPLICATION OF K08V2 IS FOR PDP-8 USAGE, THE MODIFICATIONS NOT / SPECIFIC TO DECMATE II/III FROM K278 WERE MOVED TO THE K08MIT VERSION. FUTURE / VERSIONS WILL INCORPORATE THE DECMATE FEATURES AND THUS OBSOLETE ALL OTHER / VERSIONS AT THAT TIME. / 012 04-JUN-1986 PROGRAM FIX. SEPP STADELMANN (SSTA) / RE-INITIALIZE VIA 'V30ST' AS ROM SETUP CLEARS COMPOSETABLE, ETC. / 04-JUN-1986 VERSION RELEASED TO CUCCA BY MARTYN HEMMINGS (DEC GERMANY) AND / SEPP STADELMANN (DEC SWITZERLAND) OF: / DIGITAL EQUIPMENT CORPORATION (DEC) / 146 MAIN STREET / MAYNARD, MASS 01754 / (617) 897-5111 / CUCCA RENAMED FILES (KERMIT.PA AND KERCOM.PA) TO K278.PA AND K278COM.PA (WHICH / DOESN'T REALLY CONFORM TO THE NAMING CONVENTION). / CUCCA VERSION OF K278.PA FOUND TO BE DEFECTIVE. FILE REPAIRED BY: / CHARLES LASNER (CJL) / CLA SYSTEMS / 72-55 METROPOLITAN AVENUE / MIDDLE VILLAGE, NEW YORK 11379-2107 / (718) 894-6499 / REPAIRED FILE (K278.PA) NOW AVAILABLE AT CUCCA. / PROGRAM IS NOW THE DECMATE II/III (III-PLUS) KERMIT ONLY. HOOKS WERE LEFT IN / FOR PDP-8 VERSION, BUT NOT IMPLEMENTED. K278 DOES WORK WITH ADDITIONAL / IMPLEMENTATIONS OF KERMIT, BUT RECEIVE COMMAND DOES NOT WORK. PROGRAM YIELDS / RECOVERABLE SYSTEM ERROR/HALT WHEN EXITING TO FLOPPY-BASED DECMATE II SYSTEM. / CONNECT MODE IS VT200 8-BIT WHICH CONFUSES EVEN/ODD PARITY SYSTEMS. K278 DOES / NOT SUPPORT SETUP KEY OF DECMATE, BUT IMPLEMENTS SETUP COMMAND. / 011 04-JUN-1986 NEW FEATURES. SSTA / 'PRQ3' CODE CONDITIONALS. ROM SETUP COMMAND IMPLEMENTED FOR DMII/III. / AUTOMATIC UPPERCASE SELECT ON RETURN FROM CONNECT. / 010 13-MAR-1986 BUG FIX. MARTYN HEMMINGS (MART) / FULL DISK HANDLED WELL. / 009 13-MAR-1986 BUG FIX. MART / CLEAN UP BREAK AND GET. / 008 12-MAR-1986 BUG FIX. MART / CLEAR INPUT CHARACTERS FROM COMMUNICATIONS PORT WHEN IN IDLE / LOOP. / 007 11-MAR-1986 NEW FEATURES AND BUG FIX. MARTYN HEMMINGS AND / SSEP STADELMANN / (MART+SSTA) / INTERRUPT DRIVEN AND BUG FIX. / 006 10-MAR-1986 NEW FEATURE. MART+SSTA / DEVICE PARSE ON GET. / 005 10-MAR-1986 BUG FIX. MART+SSTA / NO DATE IN FILE WITH <^Z> INTACT. / 004 10-MAR-1986 NEW FEATURES AND BUG FIX. MART+SSTA / MAXIMUM RECEIVE BUFFER FIXUP ('RTERMI'), 15 SECOND TIME-OUT / DURING CONNECT. / 003 10-MAR-1986 BUG FIX. SSTA / TWO PAGE HANDLER FIX. / K08MIT.PAL COPIED TO DEC ENGINEERING NETWORK (NODE LSMVAX::) ULTIMATELY TO / EUROPE (NODE VIRGIN::) WHERE PROGRAM BECAME KERMIT.PAL AND KERCOM.PAL. / KERMIT.PAL AND KERCOM.PAL ARE TWO SOURCE FILES ASSEMBLED TOGETHER TO PRODUCE / THE RUNNING KERMIT-8. *THEY ARE FOR THE DECMATE II/III/III-PLUS ONLY.* / 002 18-JUL-1985 ORIGINAL RELEASE. RANDY HIPPE / 18-JUL-1985 VERSION RELEASED TO CUCCA BY JERRY SANDS AND RANDY HIPPE OF: / BUREAU OF ENGRAVING, INC. / 3311 BROADWAY N.E. / MINNEAPOLIS, MN 55413 / (612) 623-0900 X218 / CUCCA RENAMED FILE (KER8.PAL) TO K08MIT.PAL WHICH CONFORMS TO NAMING / CONVENTION OF KERMIT FILES. / K08MIT SUPPORTS CONNECT, BYE (REALLY FIN), EXIT, SEND, GET, RECEIVE ONLY. / PROGRAM PRONE TO GETTING "CONFUSED" AND OUTPUTS FILE DATE ATTRIBUTE BOTH AS / 'CAPAS' BYTE FEATURE AND ASCII TEXT INSERTED INTO CONTENTS OF FILE AHEAD OF / FILE DATA. COMMAND PROCESSOR ACCEPTS UPPER-CASE COMPLETE COMMANDS ONLY. <^C> / ABORT FEATURE TAKES VERY LONG TIME TO ACT (IF AT ALL!). MANY KERMITS WILL NOT / WORK WITH K08MIT; HOWEVER, K08MIT WAS TESTED SUCCESSFULLY WITH KERMIT-20. / 001 30-JUL-1984 FIRST VERSION (KER8.PAL). JERRY SANDS / HARDWARE HINTS AND KINKS. / KERMIT-12 REQUIRES THE FOLLOWING STANDARD OS/8 FAMILY CONFIGURATION: / PDP-8 FAMILY MEMBER WITH AT LEAST 8K MEMORY. / OS/8 SYSTEM DEVICE (WITH OS/8 FAMILY OPERATING SYSTEM RESIDENT). / KL8-COMPATIBLE CONSOLE INTERFACE. / 7/8-BIT ASCII EXTERNAL CONSOLE TERMINAL DEVICE (TTY:). / KL8-COMPATIBLE REMOTE INTERFACE TO OTHER KERMIT. / NOTE: ASSEMBLY PARAMETERS OF KERMIT-12 ALLOW FOR LOCAL KERMIT CONTROLLING / TERMINALS TO BE OTHER THAN THE PRIMARY OS/8 CONSOLE DEVICE. THE ACTUAL / HARDWARE MUST STILL CONFORM TO THE SAME REQUIREMENTS (THE DEVICE CODES WOULD / THEN BE USER-SPECIFIED AND DIFFER FROM THE STANDARD 03/04) AS THE STANDARD / CONSOLE INTERFACE AND TERMINAL. / SPECIAL DECMATE CONSIDERATIONS: / DECMATE USAGE IS USUALLY OBTAINED BY ASSEMBLING FOR THE STANDARD CONSOLE / DEVICE (03/04), AS THE BUILT-IN FIRMWARE/SLUSHWARE OF THE DECMATES IS / SUFFICIENTLY COMPATIBLE WITH THE PDP-8 HARDWARE FOR KERMIT-12'S REQUIREMENTS. / (THE ONLY OTHER ACCEPTABLE CONSOLE DEVICE ON THE DECMATE IS THE PRINTER PORT.) / DECMATE REMOTE COMMUNICATIONS PORTS ARE *RADICALLY* DIFFERENT FROM / KL8-COMPATIBLE PORTS. THESE ARE HANDLED AUTOMATICALLY BY ONCE-ONLY CODE WHICH / DETECTS THE USAGE OF KERMIT-12 ON THE SPECIFIC DECMATE SYSTEM, AND / SELF-CONFIGURATION AS APPROPRIATE. THERE IS ONE EXCEPTION TO THIS, NAMELY IF / THE COMMUNICATIONS PORT CODE IS ASSEMBLED FOR THE PRINTER PORT (32/33), THEN / THE PRINTER PORT, *NOT* THE COMMUNICATIONS PORT WILL BE USED. THE STANDARD / ASSEMBLY OF KERMIT-12 IS FOR A PDP-8 WITH DEVICE 40/41 COMMUNICATIONS PORT. / THIS DESIGNATED VERSION WILL SELF-CONFIGURE WHEN EXECUTED ON A DECMATE. / CONFIGURATION RESTRICTIONS: / WHEN INTERRUPTS ARE SUPPORTED AGAIN, DEVICES SUCH AS THE TD-8/E WON'T WORK. / THE NON-INTERRUPT VERSION SHOULD WORK TO 19200 BAUD ON THE PDP-8/E CPU, SO / THIS SHOULD NOT BE A PROBLEM. INTERRUPT-DRIVEN VERSIONS OF KERMIT-12 MUST BE / RUN ONLY ON SYSTEMS WHERE *ALL* INTENDED DEVICES CAN HAVE THEIR HANDLERS / INTERRUPTED BY THE CONSOLE AND REMOTE LINE INTERRUPT HANDLERS. WHEN IN DOUBT, / THE NON-INTERRUPT VERSION MUST BE USED (CURRENTLY THE ONLY VERSION). / IF FLOW CONTROL IS DISABLED (DUE TO XON/XOFF BEING UNAVAILABLE) THEN THE / CONSOLE BAUD RATE MUST MEET OR EXCEED THE REMOTE LINE RATE. THE USER MUST / TAKE MINIMAL CARE NOT TO OVERLOAD THE INTERNAL BUFFERS OF KERMIT-12, AS THIS / WILL YIELD THE ERROR MESSAGE: KEYBOARD INPUT ERROR! / THIS IS NOT LIKELY TO OCCUR UNLESS ONE "PLAYS" WITH A KEYBOARD WHICH CAN / GENERATE NUMEROUS ESCAPE SEQUENCES AS THE BUFFERS ARE QUITE ADEQUATE FOR ALL / REASONABLE TERMINAL APPLICATIONS. SIMILARLY, IF THE REMOTE LINE DOES NOT OBEY / XON/XOFF PROTOCOL (WHILE KERMIT-12 HAS IT ENABLED), THEN INTERNAL BUFFER / OVERFLOW WILL YIELD THE ERROR MESSAGE: REMOTE LINE INPUT ERROR! / THESE ERRORS ARE EXTREMELY UNLIKELY AND CAN ONLY BE CREATED BY MISUSE OF FLOW / CONTROL (THE ONLY EXCEPTION TO THIS IS THE ATTEMPT TO USE KERMIT-12 WITH THE / CONSOLE BAUD RATE SLOWER THAN THE REMOTE LINE BAUD RATE WITH FLOW CONTROL / DISABLED). IF FLOW CONTROL IS ENABLED AND OBEYED THEN THE BUFFERING OF REMOTE / LINE INPUT WILL OCCUR WHILE SHORT PAUSES OCCUR ON THE CONSOLE (ASSUMING THE / USER FREEZES/UNFREEZES THE DISPLAY OFTEN AND THE CONSOLE DISPLAY BAUD RATE IS / FASTER THAN THE REMOTE LINE BAUD RATE) WITH PRACTICALLY NO REMOTE LINE DELAY. / FLOW CONTROL IS NOT YET SUPPORTED DURING KERMIT TRANSFERS. SINCE KERMIT-12 / DOES NOT SUPPORT SLIDING WINDOWS, KERMIT-12 WILL NEVER GENERATE OUTGOING / XON/XOFF SEQUENCES. FUTURE REVISIONS WILL SUPPORT INCOMING XON/XOFF FROM THE / REMOTE KERMIT. XON/XOFF PROTOCOL DURING CONNECT MODE IS COMPLETELY AVAILABLE / AT THE USER'S OPTION. / CONSOLE TERMINALS ARE REQUIRED TO SUPPORT "GLASS TTY:" FEATURES, I.E. THE / PRINTING ASCII CHARACTER SET (LOWER-CASE DESIRABLE) AND THE CONTROL CHARACTERS / <CR>, <LF>, AND <BEL> (THE LAST FOR VARIOUS AUDIBLE REPORTS ONLY). TERMINALS / LACKING LOWER-CASE SUPPORT SHOULD "FOLD" LOWER-CASE CHARACTERS TO UPPER-CASE / AUTOMATICALLY. TERMINALS SUCH AS THE VT05 CAN HAVE THE KEYBOARD LOWER-CASE / ENABLED, AS KERMIT-12 SUPPORTS OPTIONAL OUTPUT FOLDING. THE UPPER-CASE ONLY / OPTION SHOULD BE ENABLED FOR TERMINALS WHICH IGNORE LOWER-CASE INPUT FROM THE / HOST, AS KERMIT-12 GENERATES NUMEROUS LOWER-CASE MESSAGE CHARACTERS (WHICH / BECOME UPPER-CASE IF THIS OPTION IS SET). THE <BS> CHARACTER IS REQUIRED FOR / VISUAL RUBOUT (<BS> <SPACE> <BS>) ONLY. FUTURE VERSIONS WILL SUPPORT / HARD-COPY BACKSPACE TO REMOVE THIS REQUIREMENT. ALL TERMINAL FEATURES (SUCH / AS ACTUAL VT-100 FUNCTIONALITY) ARE FREELY PASSED TO THE HOST DURING CONNECT / MODE; THE ONLY CHARACTER ACTUALLY RESERVED IS THE ESCAPE CHARACTER WHICH WILL / BE TREATED AS A SEVEN-BIT CHARACTER ONLY. IF THE USER PRESSES THE ESCAPE / CHARACTER TWICE, THEN THE SEVEN-BIT REPRESENTATION OF THE CHARACTER IS SENT / ONCE; THERE IS NO WAY TO SEND THE ESCAPE CHARACTER WITH THE HIGH-BIT SET. / SINCE THE ESCAPE CHARACTER ITSELF CAN BE SET TO ALMOST ANY SEVEN-BIT VALUE, / THIS SHOULD NOT BE A SERIOUS LIMITATION. TERMINALS THAT DON'T "BEEP" WHEN THE / <BEL> CHARACTER IS SENT SHOULD NOT OUTPUT A PRINTABLE RENDITION OF THE <^G> / CHARACTER, AS THIS WOULD DISRUPT THE TERMINAL OUTPUT AND INTERNAL COLUMN COUNT / DURING VARIOUS MESSAGE SEQUENCES, ETC. / KL-8/E INTERFACES SHOULD BE SETUP WITH THE FOLLOWING STANDARD SETTINGS: / 1 STOP BIT ABOVE 110 BAUD WITH 8 BITS DATA. / FUNCTIONAL BAUD RATES INCLUDE 110, 150, 300, 600, 1200, 2400, 4800, 9600, / 19200, 38400 AND 76800. 2400 BAUD REQUIRES A REVISION "B" OR BETTER M8650 / MODULE (IF ONE USES DEC'S DOCUMENTATION OF AVAILABLE SPLIT-LUG OPTIONS). / ACTUAL BAUD RATES UP TO APPROXIMATELY 100 KBAUD SHOULD WORK WHEN KERMIT-12 / BECOMES INTERRUPT-DRIVEN. RATES OTHER THAN 110 BAUD REQUIRE A 19.6608 MHZ / BAUD-RATE OSCILLATOR. / THE BAUD RATES STATED ABOVE ARE ACTUALLY AVAILABLE ON THE KL-8/E, BUT REQUIRE / A SINGLE SOLDER JUMPER TO IMPLEMENT THE PROPER BAUD RATE ABOVE 2400 BAUD. / CHANGING BAUD-RATE GENERATOR CRYSTALS WILL PRODUCE OTHER RATES AS NECESSARY. / (SEND INQUIRIES TO CLA SYSTEMS FOR INFORMATION REGARDING KL-8/E MODIFICATIONS / INCLUDING UPGRADED BAUD-RATE OSCILLATORS, ETC.) KERMIT-12 HAS BEEN TESTED TO / 9600 BAUD AND SHOULD WORK TO 19200 BAUD (AS OF THE CURRENT VERSION). / KL8-J/A INTERFACES SHOULD BE SETUP WITH THE FOLLOWING STANDARD SETTINGS: / 1 STOP BIT ABOVE 110 BAUD WITH 8 BITS DATA NO PARITY. / FUTURE VERSIONS OF KERMIT-12 WILL SUPPORT VARIOUS SOFTWARE-GENERATED PARITY / OPTIONS. THE FRAMING AND OVERRUN ERRORS CAN BE ENABLED AND WILL EVENTUALLY BE / SUPPORTED (BUT THE PARITY GENERATOR SHOULD BE DISABLED TO PREVENT INTERACTION / WITH THE SOFTWARE USE OF PARITY GENERATION/DETECTION). / ALL BAUD RATES ARE SUPPORTABLE: / 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200. / 19200 BAUD IS ACHIEVED BY CUTTING JUMPER "W2" AND ADDING JUMPER "W5" AND THEN / SETTING THE BOARD FOR WHAT IS NORMALLY 9600 BAUD. A WESTERN DIGITAL TR-1602-B / OR EQUIVALENT UART IS REQUIRED TO SUPPORT 19200 BAUD; MOST OF THE RECENT / PRODUCTION DEC M8655 BOARDS USE THE SMC COMM 2017 UART WHICH MEETS OR EXCEEDS / THIS REQUIREMENT. EARLY M8655 BOARDS USE GI UARTS IN CERAMIC PACKAGES WHICH / *CANNOT* BE USED AT 19200 BAUD (MANY ARE FLAKY AT 9600 BAUD!). / RECEIVE BAUD RATE SHOULD BE IDENTICAL TO TRANSMIT BAUD RATE. (DO NOT SET THE / RECEIVE=150 BAUD SWITCH!) / OTHER INTERFACES: / DKC-8/A (8/A OPTION BOARD #1) INTERFACES SHOULD BE SETUP AS PER THE KL8-J/A / SPECIFICATIONS INCLUDING THE REQUIREMENTS OF THE UART. SOME DEC DOCUMENTATION / INDICATED A PROHIBITION ON THE USE OF 19200 BAUD, BUT THIS IS OBVIATED BY THE / USE OF THE SAME UARTS AS IN THE KL8-J/A. / EARLIER DEVICES SUCH AS PT08, DP-12, KL-8/F OR DC02 (CHANNEL ZERO ONLY) SHOULD / WORK CORRECTLY AS FACTORY WIRED (MOST OF THESE DEVICES DO NOT SUPPORT OPTIONS / KERMIT-12 WOULD REQUIRE TO BE DISABLED ANYWAY. THESE INCLUDE PARITY / GENERATION, FRAMING ERROR DETECTION, ETC.). TO UTILIZE THESE DEVICES, THE / ASSEMBLY PARAMETERS FOR USER DEVICES AND THEIR RESPECTIVE DEVICE CODE VALUES / SHOULD BE GIVEN DURING ASSEMBLY (SEE ASSEMBLY INSTRUCTIONS). PROPER DEVICE / CODE VALUES MUST BE OBTAINED FOR THE SELECTED INTERFACE, AS THERE ARE MANY / ACTUAL POSSIBILITIES. (DP-12 DEVICES ARE GENERALLY DEVICE 40/41; PT08/DC02 / INTERFACES ARE GENERALLY DEVICE 11/12, ETC.) / ASSEMBLY INSTRUCTIONS. / KERMIT-12 CAN BE ASSEMBLED BY EITHER OF TWO METHODS: / P?S/8 METHOD: / ASSUMING THE EXTENDED-LENGTH FILE KERM12 IS THE SOURCE FILE, THE FOLLOWING / COMMAND WILL PRODUCE A FULLY ORNAMENTED LISTING: / .PAL KB1,KB2,KB3,KB4<KERM12(ACEJLMNPQSX8) / OPTION SWITCH BREAKDOWN: / /A ALL SYMBOLS IN SYMBOL PRINTOUT. / /C OPTIMIZE CORE DURING ASSEMBLY FOR MORE SYMBOLS, LESS BUFFERS. / THIS OPTION SHOULD BE DELETED IF MORE THAN 8K IS AVAILABLE FOR / ASSEMBLY. / /E FORGET LITERAL BOUNDARIES WHEN LEAVING THE CURRENT PAGE. / /J *DO NOT* TERMINATE TEXT STRINGS WITH EXTRA ZERO WORD. / /L PERFORM SECOND-PASS LISTING. / /M CHAIN TO MAP FOR BITMAP OUTPUT AT END OF ASSEMBLY. / /N ENABLE NEATNESS ADORNMENTS TO LISTING OUTPUT. / /P ENABLE PRINTER-ORIENTED (WIDE MODE) LISTING OUTPUT. / /Q ENABLE LITERALS ONLY, GENERATED LINKS ARE ERRORS. / /S ENABLE SYMBOL TABLE PRINTOUT. / /X ENABLE CROSS-REFERENCE OUTPUT AT END OF ASSEMBLY. / /8 ENABLE FULL SYMBOL TABLE INCLUDING LINC MODE CROSS ASSEMBLY. / THE NUMBER OF BINARY FILES REQUIRED (KB1, KB2, KB3, ETC.) IS TO BE DETERMINED / AT ASSEMBLY TIME, AS KERMIT-12 WILL TEND TO GROW LARGER AS FEATURES ARE ADDED. / P?S/8 PAL IS THE PREFERRED METHOD OF ASSEMBLING K12MIT DURING DEVELOPMENT DUE / TO SUPERIOR ERROR DIAGNOSTICS AND OVERALL SPEED. K12MIT COULD GROW TO A SIZE / BEYOND THE CAPABILITIES OF OS/8 CREF. THIS LIMITATION CANNOT APPLY TO THE / P?S/8 DEVELOPMENT ENVIRONMENT. / P?S/8 PAL CAN PRODUCE A LISTING OF K12MIT, BUT THE BINARY FILES CREATED BY THE / ASSEMBLY MUST BE TRANSFERRED TO AN OS/8 ENVIRONMENT FOR USE, SINCE K12MIT (AS / SPECIFICALLY WRITTEN) IS FOR THE OS/8 FAMILY OF SYSTEMS ONLY. / NOTE: P?S/8 IS *NOT* A DEC PRODUCT; IT IS SOLD COMMERCIALLY AND IS AVAILABLE / FREE OF CHARGE (EXCEPT FOR MEDIA HANDLING CHARGES, ETC.) *ONLY* TO QUALIFIED / INSTITUTIONS. CONTACT CJL FOR ADDITIONAL INFORMATION ON ACQUIRING P?S/8. / OS/8 FAMILY OF SYSTEMS METHOD: / K12MIT.PA CAN BE ASSEMBLED WITH PAL8 VERSION B0 WHICH IS AVAILABLE FROM DECUS / AS PART OF THE OS/278 RELEASE. PAL8 VERSION B0 WILL RUN ON ANY OS/8 FAMILY / SYSTEM, AS IT HAS NO HARDWARE DEPENDENCIES BEYOND THE ORIGINAL PDP-8 / REQUIREMENT (NO BSW OR IAC ROTATE OR CAF OR R3L INSTRUCTIONS AS WAS INTENDED). / THIS ALSO APPLIES TO CREF VERSION B0 WHICH IS REQUIRED WHEN A CROSS-REFERENCE / IS REQUESTED. PAL8 VERSION B0 AND CREF VERSION B0 ARE AVAILABLE AS PART OF / THE KERMIT-12 DISTRIBUTION AS K12PL8.ENC AND K12CRF.ENC RESPECTIVELY. SEE THE / DOCUMENTATION OF K12DEC FOR INFORMATION ON PRODUCING PAL8.SV AND CREF.SV FROM / THESE ENCODED FILES. / ASSUMING CCL IS ENABLED, THE FOLLOWING COMMAND WILL PRODUCE A BINARY AND FULLY / ORNAMENTED LISTING: / .PAL DEV:K12MIT.BN,DEV:K12MIT.LS,DEV:KSCR.TM<DEV:PARAM.PA,DEV:K12MIT.PA(CEFMW) / DEV: IS THE APPLICABLE DEVICE WHERE THE FILES RESIDE. STANDARD EXTENSIONS / ARE ASSUMED (.BN FOR BINARY, .LS FOR LISTING, .PA FOR PAL SOURCE). THE / KSCR.TM TEMPORARY OUTPUT FILE SPECIFICATION IS OPTIONAL, BUT IS DEFAULTED TO / SYS:CREFLS.TM IF NOT EXPLICITLY GIVEN. MANY SYSTEM DEVICES ARE TOO SMALL TO / SUPPORT THIS TEMPORARY FILE, THUS THE FILE MAY BE DIRECTED TO ANOTHER / AVAILABLE DEVICE WITH SUFFICIENT SPACE. / THE PARAM.PA FILE IS OPTIONAL AND USED TO PASS SHORT USER PARAMETERS, ETC. TO / THE ASSEMBLY. / OPTION SWITCH BREAKDOWN: / /C CHAIN TO CREF.SV TO PRODUCE A CROSS-REFERENCED LISTING FILE. / /E GENERATED LINKS ARE ERRORS. / /F *DO NOT* TERMINATE TEXT STRINGS WITH EXTRA ZERO WORD. / /M USE MAMMOTH SYMBOL TABLE OPTION FOR CREF. / /W FORGET LITERAL BOUNDARIES WHEN LEAVING THE CURRENT PAGE. / LOADING INSTRUCTIONS: / .LOAD DEV:K12CLR,K12MIT.BN THIS LOADS THE BINARY CLEAR AND KERMIT / .SAVE DEV K12MIT.SV=1 THIS SAVES THE CORE IMAGE / THE JOB STATUS WORD (=1) INDICATED THAT K12MIT.SV LOADS INTO 10000-11777, BUT / SHOULD NOT BE SAVED/RESTORED WHEN THE USR IS LOADED OVER THIS AREA OR / DISMISSED (THE USR IS ACTUALLY NEVER DISMISSED IN NORMAL K12MIT OPERATION). / OTHER BITS MAY BE SET AT THE USER'S OPTION, BUT ARE UNNECESSARY; THE BIT / INDICATED SERVES ONLY TO REDUCE SYSTEM OVERHEAD REGARDING THE DISPOSITION OF / 10000-11777. THE BINARY FILE K12CLR.BN (CREATED BY ASSEMBLING K12CLR.PA) / LOADS ZEROES INTO ALL OF MEMORY TO CREATE A "CLEAN" CORE IMAGE FILE, WHICH / MAKES THE ENCODED BINARY FILE SMALLER DUE TO REPEAT COMPRESSION. / PASSING SHORT PARAMETER FILES. / WHEN INSERTING A SHORT USER MODIFICATION FILE IN THE INPUT STREAM (PARAM.PAL) / THE FOLLOWING SHOULD BE NOTED: / ALWAYS PUT THE SHORT PARAMETER FILE (CONTAINING EQUATED SYMBOLS SUCH AS / USER=1, ETC.) IN FRONT OF K12MIT.PAL. / IF TTY: IS USED FOR DIRECT TYPE-IN OF THESE PARAMETERS, THE INFORMATION NEED / ONLY BE TYPED ENDING WITH <^Z> DURING PASS 1. SUBSEQUENT PASSES REQUIRE THE / ENDING <^Z> ONLY. IF THIS METHOD IS USED, A LISTING WITHOUT THE USER INPUT / WHICH DID THE CUSTOMIZING OF KERMIT-12 CAN BE CREATED. NOTE: IF BINARY IS / GENERATED BY THE CONTENTS OF THE PARAMETER FILE (SUCH AS USE OF THE LOCAL TEXT / MESSAGE, ETC.), THE INFORMATION MUST BE TYPED IN DURING PASS 2. THE PASS 3 / LISTING MAY CONTAIN THE INFORMATION IF SO DESIRED, REQUIRING A REPETITION OF / THE INPUT. PASS 1 INPUT OF THE INFORMATION IS EFFECTIVELY IGNORED, AS NO / DEFINITIONS ARE CREATED ('LCLMSG' IS DEFINED ELSEWHERE, ETC.). / EXPERIENCED PDP-8 USERS NEW TO PAL8 VERSION B0 TAKE SPECIAL NOTICE: / DUE TO HARDWARE LIMITATIONS OF THE DECMATES, THE KEYBOARD FLAG WILL BE CLEARED / DURING PDP-8 PAL8 B0 OPERATION. THE KL8E TTY: HANDLER WILL NO LONGER BE ABLE / TO BUFFER <^Z> DURING THE ASSEMBLY; YOU MUST WAIT UNTIL THE HANDLER ACCESSES / THE KEYBOARD ON EACH PASS *THEN* PRESS <^Z> TO CONTINUE THE ASSEMBLY. / CREATING A CUSTOM MESSAGE FROM THE PARAMETER FILE. / IF SO DESIRED, A CUSTOM LOCAL HEADER MESSAGE MAY BE ADDED BY INSERTING THE / FOLLOWING INTO THE PARAMETER FILE: / BUFFLD= 10 /THESE PROBABLY / FILBUFF=2000 /WON'T CHANGE! / GENMSG= 0 /DON'T GENERATE STANDARD (NULL) MESSAGE / UMSG= 0 /DON'T GENERATE STANDARD (DUMMY) USER MESSAGE / FIELD BUFFLD%10 /FIELD FOR TEXT MESSAGE / *FILBUFFER /LOCAL MESSAGE LOADS THERE /LCLMSG,TEXT "%^I^NSERT ^L^OCAL ^M^ESSAGE ^H^ERE!%" / ZBLOCK LCLMSG+40-. /ZERO REST OF MESSAGE AREA / TEXT IS IN UPPER/LOWER-CASE SIXBIT WITH '^' MEANING SHIFT CASE (INITIALLY / LOWER-CASE) AND '%' MEANING <CR>, <LF>. / OTHER METHODS: / KERMIT-12 *CANNOT* BE ASSEMBLED BY PAL10 (LAST KNOWN VERSION OF PDP-8 / CROSS-ASSEMBLER FOR TOPS10 (142)) BECAUSE IT LACKS CERTAIN FEATURES: / DOES NOT SUPPORT 'RELOC' PSEUDO-OP. / DOES NOT SUPPORT PAGE ZERO REDEFINE (CAUSES "Z" ERROR ON SOURCE FILES WHICH / DON'T HAVE ERRORS WHEN ASSEMBLED BY EITHER P?S/8 PAL OR OS/8 PAL8). / INCORRECTLY HANDLES 'ZBLOCK' PSEUDO-OP (LEADS TO "Q" ERROR ON SOURCE FILES / WHICH DON'T HAVE ERRORS WHEN ASSEMBLED BY EITHER P?S/8 PAL OR OS/8 PAL8). / DOES NOT SUPPORT LITERAL "FORGETTING" (P?S/8 PAL OPTION /E OR OS/8 PAL8 OPTION / /W) WHICH IS REQUIRED FOR DEFINING OVERLAY AREAS, ETC. / DOES NOT SUPPORT TEXT WITHOUT ZERO WORD FILL (P?S/8 PAL OPTION /J OR OS/8 PAL8 / OPTION /F FULFILLS THIS REQUIREMENT) WHICH IS REQUIRED FOR TEXT MESSAGES. / P?S/8 PAL IS AN IMPROPER SUPERSET OF PAL10. PAL10 SUPPORTS MACRO-8 MODE AS AN / OPTION AND AUTOMATIC FIELD DUMP BITMAPS; ALL OTHER KNOWN PAL10 FEATURES EXIST / IN P?S/8 PAL INCLUDING THE SUPPORT OF THE AUTOMATIC FIELD DUMP BITMAP / PSEUDO-OPS ('ENBITS' AND 'NOBITS'). / OS/8 PAL8 (VERSION B0) IS A SUBSET OF P?S/8 PAL WHICH HAS SEVERAL SYNTACTIC / QUIRKS (WHICH ARE AVOIDABLE, BUT NONETHELESS ARE INCOMPATIBLE WITH BOTH P?S/8 / PAL AND PAL10 IN CERTAIN MINOR WAYS); REGARDLESS, PAL8 LACKS THE / COMPATIBILITY PROBLEMS OF PAL10. / MAINTAINING SOURCE COMPATIBILITY. / KERMIT-12 SOURCE FILE CONVENTIONS DEMAND THE USE OF THE COMMON SUBSET OF P?S/8 / PAL AND OS/8 PAL8 (VERSION B0). CERTAIN FORMS OF STATEMENTS SHOULD BE / AVOIDED: / TAD /NOT LEGAL IN PAL8 / 0+TAD /NOT LEGAL IN PAL10, AND POSSIBLY WRONG IN PAL8 / TAD (3)+1 /GENERATES SAME AS "TAD (3+1)" IN PAL8 / -A!-B /UNARY OPERATOR HANDLED WRONG IN PAL8 / I+N /NOT LEGAL IN PAL8 / N+I /NOT LEGAL IN PAL8 / I I /NOT LEGAL IN PAL8 / THIS REQUIREMENT IS EASILY MET BY KERMIT-12 AS MOST OF THESE CASES ARE / ESOTERIC QUIRKS AND NOT NEEDED FOR THIS ASSEMBLY. / THE RESTRICTIONS OF PAL10 (EVEN THOUGH IT HAS OTHER DESIRABLE FEATURES, MOST / OF WHICH IT SHARES WITH P?S/8 PAL) ARE TOO SEVERE TO ALLOW USABLE ASSEMBLY OF / THIS PROGRAM. BETTER CROSS-ASSEMBLERS MAY EXIST ELSEWHERE WHICH ARE / SOURCE-COMPATIBLE WITH KERMIT-12. / USE OF P?S/8 LANGUAGE EXTENSIONS. / P?S/8 OFFERS SEVERAL USEFUL FEATURES OVER PAL8 (AND PAL10) WHICH MAY BE USEFUL / FOR ASSEMBLY DEVELOPMENT OF KERMIT-12. THESE INCLUDE LANGUAGE ELEMENTS SUCH / AS "TAD (3)+1" HANDLED CORRECTLY, OR PSEUDO-OPS SUCH AS "PAUSE EXPR" WHERE THE / VALUE OF 'EXPR' WILL BE DISPLAYED ON THE SYSTEM CONSOLE DURING THE ASSEMBLY / WHEN THAT POINT IN THE ASSEMBLY IS REACHED. TO ACCESS THESE FEATURES AND / STILL PROVIDE COMPATIBILITY WITH PAL8 (VERSION B0), THE FOLLOWING CODING / TECHNIQUE IS SUGGESTED: / IFNDEF PQS <PQS=0> /WILL BE 0 ON PAL8, PAL10 / IFZERO PQS < /DO PAL8, ETC. STUFF HERE / FOO= (TABLE) /DEFINE POINTER TO ADDRESS OF TABLE / TAD FOO-1 /GET (POINTER TO ADDRESS OF TABLE)-1 / DCA XR1 /SETUP AUTO-INDEX REGISTER / WISH WE HAD PAUSE AND ERROR PSEUDO-OPS IN PAL8. / > /END OF PAL8, ETC. VARIANT / IFNZRO PQS < /DO P?S/8 PAL STUFF HERE / TAD (TABLE)-1 /GET (POINTER TO ADDRESS OF TABLE)-1 / DCA XR1 /SETUP AUTO-INDEX REGISTER / IFNDEF PASS <PASS=0>/DEFINE PASS VARIABLE / PASS= PASS+1 /BUMP EVERY ASSEMBLER PASS / PAUSE PASS /DISPLAY PASS NUMBER / IFNZRO .&4000 < / ERROR 1234 /DISPLAY ERROR MESSAGE IF THERE ARE PROBLEMS / > / > /END OF P?S/8 PAL VARIANT / THIS ALLOWS TEMPORARY DEVELOPMENT FEATURES OR PERMANENT ELEMENTS WHICH MAY BE / MORE ELEGANTLY EXPRESSED IN P?S/8 PAL VARIANT CODING, WHILE THE PAL8 (VERSION / B0) VERSION CAN STILL BE USED (VIA DIRECT OCTAL, MULTIPLE EQUATE STATEMENTS, / CONDITIONAL FLUSH AS IN THE ABOVE EXAMPLE, ETC. AS NECESSARY) FOR STANDARD / ASSEMBLY OF KERMIT-12. / ASSEMBLY PARAMETERS. / SEVERAL PARAMETERS MUST BE CHANGED WITHIN K12MIT.PA (OR PASSED TO THE / ASSEMBLER VIA A SHORT FILE INSERTED INTO THE ASSEMBLY STREAM BEFORE THE MAIN / FILE): / SETTING KEY= [RECEIVE IOT CODE FOR CONSOLE KEYBOARD] DEFINES THE CONSOLE / KEYBOARD IOT CODE (DEFAULT IS 03). / SETTING TTY= [TRANSMIT IOT CODE FOR CONSOLE OUTPUT] CHANGES THE CONSOLE / PRINTER IOT CODE (DEFAULT IS 04). / THE FOLLOWING DEFINITIONS ARE ESSENTIALLY FOR KL8-TYPE DEVICES ONLY, AS THE / CODE DEMANDS KL8 HARDWARE COMPATIBILITY. MODELS OTHER THAN PDP-8 (SUCH AS / DECMATE) GENERALLY EITHER PLACE RESTRICTIONS ON AVAILABLE INTERFACES (OTHER / SOFTWARE DESIGNATES A SERIAL INTERFACE AS A LOGICAL PRINTER PORT; DECMATES / SUPPORT A FIRMWARE "PRINT SCREEN" KEY WHICH ENFORCES THIS.), OR DON'T ALLOW / USABLE PLUG-IN OPTIONS. / IGNORING BUILT-IN DECMATE SUPPORT, THE FOLLOWING PARAMETERS ARE ACTIVE: / SETTING DEV30= 1 CREATES DEVICE 30/31 REMOTE LINE IOTS. / SETTING DEV40= 1 CREATES DEVICE 40/41 REMOTE LINE IOTS. / SETTING LEDERLE=1 CREATES DEVICE 43/44 REMOTE LINE IOTS (AND A CUSTOM / HEADER). / SETTING ORIGNAL=1 CREATES DEVICE 33/34 REMOTE LINE IOTS (ORIGINAL / SETTINGS). / SETTING SPRINT= 1 CREATES DEVICE 32/33 REMOTE LINE IOTS (SERIAL PRINTER / PORT). / SETTING USER= 1 CREATES DEVICE XX/XY REMOTE LINE IOTS. / IF NONE OF THESE ARE SET, THEN DEV40=1 APPLIES BY DEFAULT. / SETTING USER= 1 REQUIRES THE USER TO DEFINE TWO ADDITIONAL VALUES: / XX= [RECEIVE IOT DEVICE CODE] (DEFAULT IS 40). / XY= [TRANSMIT IOT DEVICE CODE] (DEFAULT IS 41). / SETTING SPRINT= 1 INHIBITS THE BUILT-IN CHECK FOR DECMATE OPERATION AND / USES THE SERIAL PRINTER PORT FOUND ON ALL / WPS-8-CONFIGURED PDP-8/E, PDP-8/A CONFIGURATIONS, / VT-78, AND ALL DECMATES (VT-278, DECMATE II, III, / III+) FOR REMOTE COMMUNICATIONS. / THE USE OF THE SERIAL PRINTER PORT FOR REMOTE COMMUNICATIONS PURPOSES MAY BE / PROBLEMATIC DUE TO CONSIDERATIONS SUCH AS THE RS-232 CONNECTION TO THE PRINTER / IS A MODEM (DCE), RATHER THAN A TERMINAL (DTE) (DECMATE II, ETC. REQUIRES A / GENDER CHANGER.), OR THE SOFTWARE DESIGNATION OF THE PORT AS BEING ALLEDGEDLY / *ONLY* FOR A PRINTER, SUCH AS WHEN CERTAIN SYSTEMS SUPPORT THE "PRINT SCREEN" / KEY AS A SCREEN DUMP TO THE SERIAL PRINTER PORT, ETC. THESE ISSUES ARE NOT / RELEVANT TO KERMIT-12 OPERATION, AS THE "PRINT SCREEN" KEY IS NOT SUPPORTED BY / KERMIT-12 IN THIS CONFIGURATION AS SUCH (FUTURE VERSIONS COULD REDEFINE THE / "PRINT SCREEN" KEY TO SUCH FUNCTIONS AS DUMP SCREEN TO A FILE, ETC.). / SETTING BRATE= NN SETS THE DEFAULT BAUD RATE (FOR SYSTEMS THAT SUPPORT / THIS FEATURE) FROM A TABLE OF VALUES (0-15) AS / FOLLOWS: / NN BAUD RATE / 00 50 / 01 75 / 02 110 / 03 134.5 / 04 150 / 05 300 / 06 600 / 07 1200 / 08 1800 / 09 2000 / 10 2400 / 11 3600 / 12 4800 / 13 7200 / 14 9600 / 15 19200 / SETTING ESCAPE= NNNN SETS THE DEFAULT ESCAPE CHARACTER TO NNNN. / SETTING FLOW= 1 ENABLES FLOW-CONTROL BY DEFAULT. / SETTING FLOW= 0 DISABLES FLOW-CONTROL BY DEFAULT. / SETTING FMODE= 0177 SETS THE DEFAULT FILE MODE TO ASCII. / SETTING FMODE= 4377 SETS THE DEFAULT FILE MODE TO BINARY. / SETTING GENMSG= 0 CAUSES NO BINARY TO BE GENERATED WHERE 'LCLMSG' IS / DEFINED. THIS ALLOWS THE PARAMETER FILE (PARAM.PA) OR / SUBSEQUENT OVERLAY BY K12PCH.BN TO DEFINE THE LOCAL / HEADER MESSAGE. THIS PARAMETER SHOULD NOT BE SET / UNLESS ONE OF THESE METHODS IS USED, ELSE THE HEADER / MESSAGE WILL BE UNDEFINED. (NOTE: IF K12PCH.BN / GENERATES A HEADER MESSAGE, THEN THIS PARAMETER IS / UNIMPORTANT, AS K12PCH.BN OVERLAYS THE BINARY OF / K12MIT.) / SETTING GENMSG= 1 CAUSES A HEADER MESSAGE TO BE GENERATED. THE CONTENTS / OF THE MESSAGE ARE CREATED BY SETTING LEDERLE=1 OR / UMSG=1. IF EITHER IS ZERO, A DEFAULT (NULL) MESSAGE / WILL BE GENERATED. / SETTING ICLOSE= 1 ENSURES A <^Z> AT <EOF> OF ASCII INPUT FILES BY / DEFAULT. / SETTING ICLOSE= 0 CLOSES ASCII INPUT FILES AS RECEIVED BY DEFAULT. / SETTING INIECHO=0 CAUSES A FULL-DUPLEX CONNECT MODE STATE WITH NO LOCAL / CHARACTER ECHOING BY DEFAULT. / SETTING INIECHO=1 CAUSES A HALF-DUPLEX CONNECT MODE STATE WITH LOCAL / ECHO OF ALL CONSOLE CHARACTERS BY DEFAULT. / SETTING LOWER= 0 ALLOWS LOWER-CASE CONSOLE OUTPUT BY DEFAULT. / SETTING LOWER= -40 FOLDS LOWER-CASE CONSOLE OUTPUT TO UPPER-CASE BY / DEFAULT. / SETTING OCLOSE= 0 PREVENTS DEFAULT SENDING OF <^Z> AT <EOF> OF ASCII / FILES. / SETTING OCLOSE= 1 CAUSES <^Z> TO BE SENT AT <EOF> OF ASCII FILES BY / DEFAULT. / SETTING PORT= 0 CAUSES THE DP-278 PORT 0 TO BE USED IF KERMIT-12 IS / RUN ON A DECMATE 1 (ASSUMING SPRINT=0). / SETTING PORT= 1 CAUSES THE DP-278 PORT 1 TO BE USED IF KERMIT-12 IS / RUN ON A DECMATE 1 (ASSUMING SPRINT=0). / SETTING RETCNT= NNNN SETS THE PACKET RETRY COUNT TO NNNN BY DEFAULT. / SETTING UMSG= 0 PREVENTS THE LOCAL USER HEADER MESSAGE FROM BEING / GENERATED. / SETTING UMSG= 1 CAUSES THE LOCAL USER HEADER MESSAGE TO BE GENERATED. / THE PARAMETER GENMSG=1 IS REQUIRED TO BE SET. THE / SOURCE MUST BE MODIFIED LOCALLY TO CHANGE THE MESSAGE / TEXT FROM "INSERT LOCAL USER MESSAGE HERE!," AS THIS / IS THE DEFAULT CONTENTS. / KERMIT-12 FOR THE FAMILY OF 12-BIT DEC MACHINES. / BRIEF USAGE DESCRIPTION. / KERMIT-12 IS AN IMPLEMENTATION OF THE KERMIT PROTOCOL FOR THE FAMILY OF 12-BIT / DEC (AND COMPATIBLE) MACHINES GENERALLY KNOWN AS PDP-8 OR DECMATE. / AS OF THE CURRENT IMPLEMENTATION, THE FOLLOWING COMMANDS ARE EFFECTIVE: / 1. CONNECT (TO REMOTE SYSTEM AS TERMINAL). / 2. SEND FILESPEC (TO REMOTE RECEIVER OR SERVER). / 3. RECEIVE FILESPEC (FROM REMOTE SENDER). / 4. GET FILESPEC (FROM REMOTE SERVER). / 5. FINISH (SERVING). / 6. SETUP (ON DECMATE II/III/III-PLUS ONLY). **** NOT IMPLEMENTED **** / 7. EXIT (TO OPERATING SYSTEM). / 8. HELP (DISPLAYS HELP MESSAGE). / FILESPEC MAY BE ANY LOCAL (OS/8) FILE-STRUCTURED DEVICE:FILENAME.EXTENSION, / WHERE THE FILENAME AND EXTENSION WILL BE TRUNCATED TO 6 ALPHANUMERICS AND 2 / ALPHANUMERICS RESPECTIVELY, AS NECESSARY (THIS IS REFERRED TO AS 6.2 FILENAME / FORMAT). THE DEVICE: FIELD IS OPTIONAL; ALL COMMANDS USING THE DEVICE: / FIELD FOR LOCAL DEVICE SPECIFICATION WILL USE THIS DEVICE AS THE SOURCE OR / DESTINATION AS NECESSARY FOR THE LOCAL FILES. IF THE DEVICE: FIELD IS / OMITTED, THE DEFAULT DEVICE DSK: WILL BE USED. THE ACTUAL DEVICE USED MAY BE / SELECTED BEFORE INVOKING KERMIT-12 BY USING THE OS/8 ASSIGN COMMAND: / .ASSIGN DEV DSK / WHERE DEV IS ANY AVAILABLE FILE-STRUCTURED DEVICE. / KERMIT-12 USES AN UNUSUAL SCHEME FOR ITS PROMPT: THE ACTUAL DEFAULT PROMPT / TEXT IS PARTIALLY TAKEN FROM THE ACTUAL MACHINE KERMIT-12 IS CURRENTLY / EXECUTING ON. FOR EXAMPLE, IF KERMIT-12 HAS DETERMINED THE CPU TYPE AS / PDP-8/E, THE PROMPT WILL BE: / KERMIT-8/E> / THIS ALLOWS KERMIT-12 USERS (WITH DIFFERENT CPU-TYPE MACHINES) TO DISTINGUISH / MESSAGES ORIGINATING FROM THE RESPECTIVE SYSTEMS. FUTURE VERSIONS WILL / SUPPORT USER PROMPT STRINGS TO ALLOW MORE DISTINCTIVE SYSTEM MESSAGES. / THE HELP OR CONNECT COMMANDS MAY BE USED TO DETERMINE THE CURRENT CONNECT MODE / ESCAPE CHARACTER. / COMMAND RESTRICTIONS. / THE SEND COMMAND ALLOWS DEVICE:FILENAME.EXTENSION (6.2) WITH WILD-CARD / SUBSTITUTION. A * MAY BE GIVEN FOR AN ENTIRE FIELD (EITHER FILENAME OR / EXTENSION OR BOTH) ONLY. A ? WILL MATCH ANY SINGLE CHARACTER WHICH MUST / EXIST IN THE ACTUAL FILENAME OR EXTENSION, UNLESS RIGHT-MOST IN THE FIELD. / ALL MATCHING FILES WILL BE SENT. NO OUTBOUND FILENAME (AS-NAME) FACILITY / EXISTS AT THIS TIME. / THE RECEIVE COMMAND ALLOWS OPTIONAL DEVICE: ONLY. *THE FILENAME AND / EXTENSION ARE NOT ALLOWED*. NAMES OF RECEIVED FILES WILL BE MODIFIED IF / NECESSARY TO CONFORM TO THE 6.2 FORMAT. *IMPLEMENTATION RESTRICTION* : / CERTAIN REMOTE FILENAMES CONTAINING NON-ALPHANUMERIC CHARACTERS MAY CAUSE / KERMIT-12 TO HASTILY ABORT THE TRANSMISSION AND RETURN TO COMMAND LEVEL. / THE GET COMMAND ALLOWS OPTIONAL DEVICE: TO DETERMINE DESTINATION OF THE / INCOMING FILES. THE OUTBOUND FILESPEC MUST CONFORM TO LOCAL CONVENTIONS / (FILENAME AND EXTENSION ARE NOT LIMITED TO 6.2 FORMAT; THE DEVICE: FIELD / WILL NOT BE SENT TO THE REMOTE KERMIT UNLESS IT IS ILLEGAL WITHIN OS/8 / SPECIFICATIONS, SUCH AS TOO MANY DEVICE LETTERS. IN THIS CASE, THE DEFAULT / DEVICE DSK: APPLIES, AND THE ENTIRE "DEVICE" FIELD IS SENT ALONG WITH ANY / FILENAME AND EXTENSION). CERTAIN REMOTE SYSTEMS ARE INCOMPATIBLE WITH THIS / IMPLEMENTATION, AS IMBEDDED SPACES OR NON-ALPHANUMERIC CHARACTERS ARE NOT / ALLOWED, EVEN THOUGH THEY MAY BE REQUIRED ON THE REMOTE SYSTEM. WILD-CARD / CHARACTERS ARE ALLOWED, BUT ONLY AS SPECIFIED IN THE SEND COMMAND ABOVE. / <^X> OR <^Z> CAN BE USED TO ABORT KERMIT TRANSMISSIONS (EVENTUALLY) BUT IS / NORMALLY A SLOW PROCESS, SINCE THE CHECKING IS DONE BY A SOFTWARE TIMEOUT / SCHEME. AT THE PRESENT TIME, THERE IS NO DISTINCTION BETWEEN THESE THO / CHARACTERS, SO IT IS NOT POSSIBLE TO ABORT A SINGLE FILE; THE ENTIRE BATCH OF / FILES INVOLVED IN THE TRANSFER IS ABORTED. / DECMATE II/III/III-PLUS CONSIDERATIONS: / FUNCTION KEYS SEND <ESC> SEQUENCES SPECIFIED BY SLUSHWARE/FIRMWARE. ALL SOFT / FUNCTION KEYS ARE THEREFORE INEFFECTIVE (EXCEPT FOR HOLD SCREEN WHICH ALWAYS / WORKS). / CONNECT MODE RUNS IN 8-BIT MODE. / THE COMPOSE KEY IS ENABLED FOR USE WITH A LOADED COMPOSE TABLE. / ANY VALID DECMATE II/III/III-PLUS CHARACTER SET IS ALLOWED WHILE IN CONNECT / MODE (MCS TCS LINE, ETC.). ALL <ESC> SEQUENCES ARE PASSED TO THE / SLUSHWARE/FIRMWARE UNMODIFIED. / KEYBOARD UPPER-CASE LOCK WILL ALWAYS BE AUTOMATICALLY APPLIED UPON RETURN FROM / CONNECT MODE. / DEFINITIONS. /017 CJL *200 /FOR DEFINITIONS /047 CJL / REMOTE LINE PARAMETERS; SET ONLY ONE AS NECESSARY. /046 CJL IFNDEF DEV30 <DEV30= 0> /USE DEVICE 30/31 VALUES IFNDEF DEV40 <DEV40= 0> /USE DEVICE 40/41 VALUES IFNDEF LEDERLE <LEDERLE=0> /USE LEDERLE LABS VALUES IFNDEF ORIGNAL <ORIGNAL=0> /USE ORIGINAL VALUES IFNDEF SPRINT <SPRINT=0> /USE DEVICE 32/33 VALUES IFNDEF USER <USER= 0> /USE USER-DEFINED VALUES REMOTE= DEV30+DEV40+LEDERLE+ORIGNAL /SET REMOTE LINE IOT CODE REMOTE= REMOTE+SPRINT+USER /SET REMOTE LINE IOT CODE IFZERO REMOTE <DEV40= 1> /DEFAULT TO DEVICE 40/41 VERSION / DEV30 PARAMETERS. IFNZRO DEV30 < IFNDEF REC <REC= 30> /DEVICE 30 INPUT IFNDEF SEN <SEN= 31> /DEVICE 31 OUTPUT > / DEV40 PARAMETERS (DEFAULT). IFNZRO DEV40 < IFNDEF REC <REC= 40> /DEVICE 40 INPUT IFNDEF SEN <SEN= 41> /DEVICE 41 OUTPUT > / LEDERLE PARAMETERS. /038 CJL IFNZRO LEDERLE < IFNDEF REC <REC= 43> /DEVICE 43 INPUT IFNDEF SEN <SEN= 44> /DEVICE 44 OUTPUT IFNDEF GENMSG <GENMSG=1> /GENERATE LOCAL HEADER MESSAGE IFNDEF UMSG <UMSG= 0> /DON'T GENERATE USER MESSAGE > / ORIGNAL PARAMETERS. IFNZRO ORIGNAL < IFNDEF REC <REC= 33> /DEVICE 33 INPUT IFNDEF SEN <SEN= 34> /DEVICE 34 OUTPUT > / SPRINT PARAMETERS. /046 CJL IFNZRO SPRINT < IFNDEF REC <REC= 32> /DEVICE 32 INPUT IFNDEF SEN <SEN= 33> /DEVICE 33 OUTPUT > / USER PARAMETERS. IFNZRO USER < IFNDEF XX <XX= 40> /DEFAULT TO DEVICE 40 IFNDEF XY <XY= 41> /DEFAULT TO DEVICE 41 IFNDEF REC <REC= XX> /DEVICE XX INPUT IFNDEF SEN <SEN= XY> /DEVICE XY OUTPUT IFNDEF GENMSG <GENMSG=1> /GENERATE LOCAL HEADER MESSAGE IFNDEF UMSG <UMSG= 1> /GENERATE USER MESSAGE > / REMOTE LINE IOT DEFINITIONS. / RECEIVE DEFINITIONS. RKRBIOT=REC^10+6006 /READ REMOTE, CLEAR FLAG RKSFIOT=REC^10+6001 /SKIP ON REMOTE INPUT FLAG / TRANSMIT DEFINITIONS. RSBIOT= SEN^10+6003 /SET BAUD RATE FROM AC[8-11] RTLSIOT=SEN^10+6006 /TRANSMIT CHARACTER, CLEAR FLAG RTSFIOT=SEN^10+6001 /SKIP ON TRANSMIT FLAG / CONSOLE TTY: DEFINITIONS. /017 CJL / KEYBOARD DEFINITIONS. /017 CJL IFNDEF KEY <KEY= 03> /KEYBOARD DEVICE CODE KCCIOT= KEY^10+6002 /CLEAR CONSOLE KEYBOARD FLAG, AC KRBIOT= KEY^10+6006 /READ CONSOLE KEYBOARD BUFFER, CLEAR FLAG KRSIOT= KEY^10+6004 /READ CONSOLE KEYBOARD BUFFER STATIC KSFIOT= KEY^10+6001 /SKIP ON CONSOLE KEYBOARD FLAG / TELEPRINTER DEFINITIONS. /017 CJL IFNDEF TTY <TTY= 04> /TELEPRINTER DEVICE CODE TLSIOT= TTY^10+6006 /PRINT CHARACTER, CLEAR FLAG TSFIOT= TTY^10+6001 /SKIP ON TELEPRINTER FLAG / DEFAULT ESCAPE CHARACTER DEFINITION. /025 CJL IFNDEF ESCAPE <ESCAPE="]&37> /DEFAULT IS CONTROL-] / DEFAULT LOWER-CASE ENABLE DEFINITION. /030 CJL IFNDEF LOWER <LOWER= 0/-40> /LOWER-CASE IS ALLOWED AS IS /CHANGE TO -40 IF LOWER-CASE /SHOULD BE FOLDED TO UPPER-CASE / DEFAULT RETRY COUNT DEFINITION. /031 CJL IFNDEF RETCNT <RETCNT=5> /DEFAULT IS FIVE RETRIES / DEFAULT FILE MODE DEFINITION. /031 CJL IFNDEF FMODE <FMODE= 0177> /DEFAULT IS ASCII FILE MODE /4377 IS BINARY FILE MODE / DEFAULT FLOW-CONTROL MODE DEFINITION. /031 CJL IFNDEF FLOW <FLOW= 1> /DEFAULT IS FLOW-CONTROL ENABLED / DEFAULT ASCII INPUT FILE <^Z> DISPOSITION. /031 CJL IFNDEF ICLOSE <ICLOSE=1> /ENSURE <^Z> AT ASCII <EOF> / DEFAULT ASCII OUTPUT FILE <^Z> DISPOSITION. /031 CJL IFNDEF OCLOSE <OCLOSE=0> /<^Z> NOT SENT AT ASCII <EOF> / DEFAULT LOCAL MESSAGE GENERATION DEFINITIONS. /038 CJL IFNDEF GENMSG <GENMSG=1> /DEFAULT IS TO GENERATE A MESSAGE IFNDEF UMSG <UMSG= 0> /DEFAULT IS NO DUMMY USER MESSAGE IFNDEF LEDERLE <LEDERLE=0> /DEFAULT IS NO LEDERLE MESSAGE / THE NULL MESSAGE WILL BE GENERATED BY DEFAULT. / ECHO DEFINITION. /039 CJL IFNDEF INIECHO <INIECHO=0> /DEFAULT IS NO LOCAL ECHO / DEFAULT DECMATE I PORT DEFINITION. /050 CJL IFNDEF PORT <PORT= 0> /DEFAULT IS PORT ZERO / DEFAULT BAUD RATE DEFINITION. /050 CJL IFNDEF BRATE <BRATE= 7> /DEFAULT IS 1200 BAUD / STATE DEFINITIONS. STDAT= "D&137 /DATA STACK= "Y&137 /ACK STNAK= "N&137 /NAK STSIN= "S&137 /SEND-INIT STBRK= "B&137 /BREAK LINK STFIL= "F&137 /FILENAME HEADER STEOF= "Z&137 /END OF FILE OR REPLY STERR= "E&137 /ERROR PACKET STATT= "A&137 /FILE ATTRIBUTES STRIN= "R&137 /RECEIVE-INIT STEOT= "B&137 /BREAK TRANSMISSION STGEN= "G&137 /KERMIT GENERIC COMMAND / DEFAULT INIT PARAMETERS. DEFCK= "1&177 /DEFAULT 1 CHARACTER CHECKSUM /014 CJL DEFEOL= 15+40 /CR IS DEFAULT <EOL> DEFQCTL= "#&177 /"#" IS DEFAULT QCTL / BUFFER DEFINITIONS. /014 CJL DECIMAL /MAKE IT EASIER /014 CJL DEFMAXL=94 /DEFAULT MAXIMUM PACKET SIZE LINSIZ= 32 /KEYBOARD LINE BUFFER SIZE OCTAL /BACK TO NORMAL /014 CJL BUFSIZE=200 /128 CHARACTER RING BUFFERS /026 CJL /FOR NO-INTERRUPT CONNECT MODE / CONTROL CHARACTER DEFINITIONS. /023 CJL CNTRLA= "A&37 /<^A> DEFAULT MARK CHARACTER /023 CJL CNTRLB= "B&37 /<^B> /046 CJL CNTRLC= "C&37 /<^C> PROGRAM EXIT CHARACTER /023 CJL CNTRLD= "D&37 /<^D> /046 CJL CNTRLE= "E&37 /<^E> /046 CJL CNTRLF= "F&37 /<^F> /046 CJL CNTRLG= "G&37 /<^G> BELL CHARACTER /023 CJL CNTRLH= "H&37 /<^H> BACKSPACE CHARACTER /023 CJL CNTRLI= "I&37 /<^I> HORIZONTAL TAB CHARACTER /043 CJL CNTRLJ= "J&37 /<^J> LINEFEED CHARACTER /023 CJL CNTRLK= "K&37 /<^K> VERTICAL TAB CHARACTER /046 CJL CNTRLL= "L&37 /<^L> FORM FEED CHARACTER /046 CJL CNTRLM= "M&37 /<^M> CARRIAGE RETURN CHARACTER /023 CJL CNTRLN= "N&37 /<^N> /046 CJL CNTRLO= "O&37 /<^O> ECHO FLIP CHARACTER /023 CJL CNTRLP= "P&37 /<^P> PROGRAM RESTART CHARACTER /023 CJL CNTRLQ= "Q&37 /<^Q> OUTPUT RESUME CHARACTER /023 CJL CNTRLR= "R&37 /<^R> /046 CJL CNTRLS= "S&37 /<^S> OUTPUT WAIT CHARACTER /023 CJL CNTRLT= "T&37 /<^T> /046 CJL CNTRLU= "U&37 /<^U> /046 CJL CNTRLV= "V&37 /<^V> /046 CJL CNTRLW= "W&37 /<^W> /046 CJL CNTRLX= "X&37 /<^X> FILE ABORT CHARACTER /044 CJL CNTRLY= "Y&37 /<^Y> /046 CJL CNTRLZ= "Z&37 /<^Z> ABORT AND <EOF> CHARACTER /044 CJL DELETE= 177 /<DEL> DELETE OR <RO> CHARACTER /034 CJL LOWERC= "C&177+40 /LOWER-CASE C (CLOSE CHARACTER) /025 CJL UPPERC= "C&177 /UPPER-CASE C (CLOSE CHARACTER) /025 CJL / I/O AND FIELD DEFINITIONS. /019 CJL BUFFLD= 10 /I/O BUFFER FIELD /019 CJL DIRFLD= 10 /DIRECTORY LOOKUP BUFFER FIELD /028 CJL DMIFLD= 10 /DECMATE ONCE-ONLY CODE FIELD /046 CJL MSGFLD= 10 /TEXT MESSAGE FIELD /023 CJL PAGCNT= 2 /I/O BUFFER SIZE IN PAGES /019 CJL PRGFLD= 00 /PROGRAM FIELD /019 CJL USRFLD= 10 /USR FIELD /020 CJL / OS/8 MONITOR DEFINITIONS. /014 CJL SBOOT= 7600 /MONITOR EXIT LOCATION IS 07600 /014 CJL USR= 7700 /NON-LOCKED USR ENTRY POINT /035 CJL / USER SERVICE ROUTINE AND HANDLER DEFINITIONS. /020 CJL CLOSE= 4 /CLOSE TENTATIVE OUTPUT FILE /020 CJL ENTER= 3 /ENTER TENTATIVE OUTPUT FILE /020 CJL FETCH= 1 /FETCH HANDLER /020 CJL INQUIRE=12 /INQUIRE ABOUT HANDLER /020 CJL LOOKUP= 2 /LOOKUP FILE /020 CJL RESET= 13 /RESET DEVICE CONTROL WORD TABLE/037 CJL USRIN= 10 /LOCK USR IN CORE /020 CJL WRITE= 4000 /I/O CALL WRITE BIT /020 CJL / INSTRUCTION DEFINITIONS. CLCL= 6136 /CLEAR CLOCK FLAG (8/A, ETC.) /046 CJL CLSK= 6131 /SKIP ON, CLEAR CLOCK FLAG /046 CJL CLSK8A= 6137 /SKIP ON CLOCK FLAG (8/A, ETC.) /046 CJL COM= 0017 /COMPLEMENT AC DCAC= DCA . /CURRENT PAGE DCA INSTRUCTION /047 CJL IAAC= 6171 /"A" REGISTER TO AC IACA= 6167 /AC TO "A" REGISTER ISZC= ISZ . /CURRENT PAGE ISZ INSTRUCTION /050 CJL JMPC= JMP . /CURRENT PAGE JMP INSTRUCTION /047 CJL JMPIC= JMP I . /CURRENT PAGE JMP I INSTRUCTION /047 CJL JMSC= JMS . /CURRENT PAGE JMS INSTRUCTION /047 CJL JMSIC= JMS I . /CURRENT PAGE JMS I INSTRUCTION /047 CJL LINC= 6141 /GOTO LINC MODE PDP= 0002 /GOTO PDP-8 MODE PRQ3= 6236 /TYPE THREE PANEL REQUEST /046 CJL TADC= TAD . /CURRENT PAGE TAD INSTRUCTION /047 CJL R3L= 7014 /ROTATE AC (NOT LINK) LEFT 3 /046 CJL / NUMERIC LOAD DEFINITIONS. /014 CJL NL0000= CLA /LOAD AC WITH 0000 /046 CJL NL0001= CLA IAC /LOAD AC WITH 0001 /014 CJL NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 /014 CJL NL0003= CLA STL IAC RAL /LOAD AC WITH 0003 (8/I ON UP) /046 CJL NL0004= CLA CLL IAC RTL /LOAD AC WITH 0004 (8/I ON UP) /046 CJL NL0006= CLA STL IAC RTL /LOAD AC WITH 0006 (8/I ON UP) /046 CJL NL0010= CLA IAC RAL RAR /LOAD AC WITH 0010 (6120) /024 CJL NL0100= CLA IAC BSW /LOAD AC WITH 0100 (8/E ON UP) /024 CJL NL3776= CLA CLL CMA RAR RAL /LOAD AC WITH 3776 (8/I OR 8/L) /024 CJL NL3777= CLA CLL CMA RAR /LOAD AC WITH 3777 /046 CJL NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 /014 CJL NL5777= CLA CLL CMA RTR /LOAD AC WITH 5777 /046 CJL NL6000= CLA STL IAC RTR /LOAD AC WITH 6000 (8/I ON UP) /046 CJL NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 /014 CJL NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 /014 CJL NL7777= CLA CMA /LOAD AC WITH 7777 /014 CJL / DECMATE I COMMUNICATIONS PORT DEFINITIONS. /050 CJL IPORT0= 30 /COMMUNICATIONS PORT 0 INPUT DEVICE CODE RKFL0= IPORT0^10+6000 /SET COMMUNICATIONS PORT 0 INPUT FLAG RKSF0= IPORT0^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 0 INPUT FLAG RKCC0= IPORT0^10+6002 /CLEAR AC RKIE0= IPORT0^10+6005 /PORT 0 INPUT INTERRUPT ENABLE PER AC[11] RKRB0= IPORT0^10+6006 /READ COMMUNICATIONS PORT 0 INTO AC OPORT0= 31 /COMMUNICATIONS PORT 0 OUTPUT DEVICE CODE RTFL0= OPORT0^10+6000 /SET COMMUNICATIONS PORT 0 OUTPUT FLAG RTSF0= OPORT0^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 0 OUTPUT FLAG RTCF0= OPORT0^10+6002 /NOP RTIE0= OPORT0^10+6005 /PORT 0 OUTPUT INTERRUPT ENABLE PER AC[11] RTLS0= OPORT0^10+6006 /WRITE COMMUNICATIONS PORT 0 FROM AC IPORT1= 34 /COMMUNICATIONS PORT 1 INPUT DEVICE CODE RKFL1= IPORT1^10+6000 /SET COMMUNICATIONS PORT 1 INPUT FLAG RKSF1= IPORT1^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 1 INPUT FLAG RKCC1= IPORT1^10+6002 /CLEAR AC RKIE1= IPORT1^10+6005 /PORT 1 INPUT INTERRUPT ENABLE PER AC[11] RKRB1= IPORT1^10+6006 /READ COMMUNICATIONS PORT 1 INTO AC OPORT1= 35 /COMMUNICATIONS PORT 1 OUTPUT DEVICE CODE RTFL1= OPORT1^10+6000 /SET COMMUNICATIONS PORT 1 OUTPUT FLAG RTSF1= OPORT1^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 1 OUTPUT FLAG RTCF1= OPORT1^10+6002 /NOP RTIE1= OPORT1^10+6005 /PORT 1 OUTPUT INTERRUPT ENABLE PER AC[11] RTLS1= OPORT1^10+6006 /WRITE COMMUNICATIONS PORT 1 FROM AC PCON= 36 /PORT STATUS AND CONTROL DEVICE CODE SMFL= PCON^10+6000 /SET MODEM CHANGE FLAG MFSK= PCON^10+6001 /SKIP ON, CLEAR MODEM CHANGE FLAG WCON0= PCON^10+6002 /WRITE COMMUNICATIONS PORT 0 CONTROL REGISTER PSR= PCON^10+6003 /READ PORT STATUS REGISTER PMR= PCON^10+6004 /READ PORT MODEM REGISTER MFIE= PCON^10+6005 /LOAD MODEM CHANGE INTERRUPT ENABLE PER AC[11] WCON1= PCON^10+6006 /WRITE COMMUNICATIONS PORT 1 CONTROL REGISTER RACD= PCON^10+6007 /RESET ACTIVE COMMUNICATIONS PORT PER AC[0] / DECMATE II, ETC. COMMUNICATIONS PORT DEFINITIONS. /046 CJL PORTIN= 30 /COMMUNICATIONS PORT INPUT DEVICE CODE IFL= PORTIN^10+6000 /SET COMMUNICATIONS PORT INPUT/OUTPUT FLAG ISF= PORTIN^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT INPUT/OUTPUT FLAG ICF= PORTIN^10+6002 /NOP (CLEAR THE AC?) INOP1= PORTIN^10+6003 /(NOP?) IRS= PORTIN^10+6004 /READ COMMUNICATIONS PORT RECEIVE BUFFER IIE= PORTIN^10+6005 /COMMUNICATIONS PORT I/O INTERRUPT ENABLE PER AC[11] IRB= PORTIN^10+6006 /READ COMMUNICATIONS PORT RECEIVE BUFFER INOP2= PORTIN^10+6007 /(NOP?) PORTOUT=31 /COMMUNICATIONS PORT OUTPUT DEVICE CODE DUMBFL= PORTOUT^10+6000 /SET COMMUNICATIONS PORT DUMMY FLAG DUMBSF= PORTOUT^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT DUMMY FLAG DUMBCF= PORTOUT^10+6002 /NOP (CLEAR THE AC?) ONOP1= PORTOUT^10+6003 /(NOP?) OPC= PORTOUT^10+6004 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER DUMBIE= PORTOUT^10+6005 /COMMUNICATIONS PORT DUMMY INTERRUPT ENABLE PER AC[11] OLS= PORTOUT^10+6006 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER ONOP2= PORTOUT^10+6007 /(NOP?) PORTCON=36 /COMMUNICATIONS PORT CONTROL DEVICE CODE MFL= PORTCON^10+6000 /SET MODEM CHANGE FLAG MSF= PORTCON^10+6001 /SKIP ON, CLEAR MODEM CHANGE FLAG MLC= PORTCON^10+6002 /LOAD MODEM CONTROL REGISTER MSB= PORTCON^10+6003 /LOAD BAUD RATE REGISTER MRS= PORTCON^10+6004 /READ MODEM STATUS REGISTER MIE= PORTCON^10+6005 /MODEM CHANGE INTERRUPT ENABLE PER AC[11] MPSCC= PORTCON^10+6006 /ACCESS MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER MPRESET=PORTCON^10+6007 /RESET MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER / MISCELLANEOUS DEFINITIONS. /014 CJL / STATIC DATE CALCULATIONS. /024 CJL / THESE EQUATIONS CAUSE PRINTABLE TEXT OF THE DATE PARTICULARS, WHICH ARE GIVEN / IN OS/8 INTERNAL FORMAT. PROGRAM MAINTAINENCE REQUIRES THE UPDATE OF VERSION, / REVISION, REVDATE, AND REVDGRP. REVDATE AND REVDGRP SHOULD BE OBTAINED FROM / THE SYSTEM WHEN RELEASING A NEW VERSION AFTER FIRST CORRECTLY INVOKING THE / SYSTEM DATE COMMAND. / VERSION=[ANY NUMBER IN THE RANGE 00-143 (DECIMAL 00-99)] / REVISIO=[ANY SIX-BIT ALPHA (A-Z); DO NOT FORGET &77] / REVDATE=[THE CONTENTS OF 17666 (DATE WORD)] / REVDGRP=[THE CONTENTS OF 07777 (ONLY BITS[3-4] ARE USED)] IFNDEF REVDATE <REVDATE=4464> /REVISION DATE (LOCATION 17666) IFNDEF REVDGRP <REVDGRP=0400> /REVISION 8 YEAR DATE GROUP (LOCATION 07777) IFNDEF REVISIO <REVISIO="G&77> /REVISION OF KERMIT-12 IFNDEF VERSION <VERSION=12> /VERSION OF KERMIT-12 DAY= REVDATE&370%10 /REVISION DAY DGROUP= REVDGRP&600%20 /REVISION DATE GROUP (WHICH 8 YEARS) MONTH= REVDATE&7400%400 /REVISION MONTH YEAR= REVDATE&7+DGROUP+106 /REVISION YEAR (SINCE 1900) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 | KERMIT-12 Release Disk Information File a/o 11-Jul-1992. Description of files on RT-11 format double-density (RX02) diskettes. Diskette #1 Source Files Name Size Block Date K12MIT.PAL 453 14 6-Sep-90 K12PCH.PAL 50 467 6-Sep-90 K12ENC.PAL 71 517 8-Jul-92 K12DEC.PAL 69 588 8-Jul-92 K12PRM.PAL 3 657 6-Sep-90 K12CLR.PAL 2 660 30-Aug-90 K12ENB.PAL 47 662 1-Oct-91 K12DEB.PAL 45 709 22-Oct-91 K12IPL.PAL 19 754 6-Oct-91 K12IPG.PAL 23 773 8-Oct-91 <Unused> 192 796 10 files in 782 blocks, 192 free blocks. Diskette #2 Documentation and Support Files Name Size Block Date K12MIT.ANN 48 14 11-Jul-92 K12MIT.UPD 3 62 11-Jul-92 K12MIT.DOC 135 65 6-Sep-90 K12MIT.NOT 56 200 11-Jul-92 K12MIT.ENC 24 256 6-Sep-90 K12PL8.ENC 24 280 30-Aug-90 K12CRF.ENC 17 304 30-Aug-90 K12GLB.ENC 6 321 5-Sep-90 K12MIT.LST 30 327 6-Sep-90 K12MIT.DSK 52 357 11-Jul-92 K12ENC.DOC 24 409 31-Aug-90 K12MIT.BWR 74 433 1-May-92 K12MIT.BOO 18 507 1-Oct-91 K12PL8.BOO 18 525 1-Oct-91 K12CRF.BOO 12 543 1-Oct-91 K12GLB.BOO 4 555 1-Oct-91 K12IPL.DOC 9 559 6-Oct-91 K12FL0.IPL 18 568 8-Oct-91 K12FL1.IPL 18 586 8-Oct-91 K12IP0.ODT 4 604 6-Oct-91 K12IP1.ODT 4 608 6-Oct-91 <Unused> 376 612 21 files in 598 blocks, 376 free blocks. Description of individual files. K12MIT.PAL This is the current release of KERMIT-12 in source form. The beginning of this file contains much information about setting up various hardware (KL-8, etc.) and software settings for KERMIT-12 internal operation; the first 30-35 pages of the listing file created by PAL8 are available as a stopgap user guide in the form of K12MIT.DOC. It is extremely important to read the section on assembly instructions for K12MIT, as non-default switches must be set for proper assembly. Due to the sorry state of the predecessor source (K08MIT) this file is based on, it has taken an extreme amount of effort to overcome many former limitations on many levels; there are still many problems which only development time (when available) will overcome. There is also a lot of inconsistency of implementation, i.e., some features are totally finalized (or are so written in such a way that only a non-existent section of code could "wake up" the feature), while others are bound to be "bodily replaced" (such as the low-level protocol implementation which can "blow up" when dealing with certain atypical (though perfectly reasonable) KERMIT implementations which pass data such as lower-case file name characters, etc.) when time is available. Approx. 2/3 of the source code and 80% of the current file contents have been written by Charles Lasner taking advantage of over 20 years of PDP-8 hacking and "cook-book" methods, etc., including some never-before-seen techniques "borrowed" from P?S/8 (P?S/8 is an alternate PDP-8 operating system and is copyright CLA Systems). Every new piece of code added to KERMIT-12 usually represents an exemplary method for handling a given task, often producing "quantum leap" improvements over the former code; see the built-in edit history for details. It should be noted that KERMIT-12 runs on the minimum OS/8 family configuration of 8K 12-bit words total main memory (including the operating system; this could change in future versions!) and is probably the smallest known (in terms of total executable binary code) KERMIT implementation. (If a P?S/8 KERMIT is written, it will run on a smaller machine, only 4K 12-bit words!) A rough table of improvements (wish list?) includes: a) 100% rewrite of the command parser to conform to accepted guidelines of most KERMITs. b) 100% rewrite of the protocol-related features to allow for a robust (though minimal) KERMIT implementation that should work in all cases. c) Adding in local feature improvements (Connect mode parity support, VT-100 terminal support, command files, etc.) which depend on the better command processor to implement efficiently. d) Adding in protocol improvements such as negotiated parameters (eight-bit, repeat-count compression, file attributes, server mode, etc.) and session statistics (internally and visually on-line). e) Additional "frills" such as scripting language, macros, etc., as well as anything else someone can add to this list. K12PCH.PAL This is the official "patch" file for K12MIT.PAL. All relevant customizing can be accomplished within K12PCH.PAL, as all conditional parameters and their consequences have been copied to K12PCH.PAL, leaving only the "pure" code behind in K12MIT.PAL. A standard assembly of K12MIT.PAL producing K12MIT.BN (or K12MIT.SV via ABSLDR.SV) can be overlaid by K12PCH.BN to accomplish any relevant changes to configure a custom version. If any parameter causes this convention to be violated, please notify Charles Lasner, as this specification must be met to support the ability for a minimal system to configure KERMIT-12 from K12MIT.SV and K12PCH.BN on modest hardware (such as one pair of RX01 only). Use of K12PCH.PAL mandates a local banner message for the running KERMIT.SV which should be locally modified as necessary. The default message is "Insert Local User Message Here" to encourage customization. K12ENC.PAL This is an encoding program (aka ENCODE) to convert OS/8 files in any format to a "printable" ASCII format suitable for transmission through any medium which doesn't "mangle" the printing ASCII characters from 0 through 9, and A through V (or a through v). Several binary files are distributed in ENCODE format (see elsewhere). All characters outside of the printing ASCII character set are ignored except for the necessity for "white-space" to exist between the two fields of the optional (FILE XXXXXX.XX) command, which specifies the name of the original (un-encoded) file. Several other optional commands are supported; see K12MIT.ENC as an example of all of them. When properly decoded (see K12DEC.PAL description below), the original file is totally restored except for additional information words from the directory (not really in the file itself!), thus only the creation date (if the directory is setup to support it) is lost. Users of ENCODE are encouraged to use the (REMARK .....) command to help in the restoration of the file. Assembly instructions as well as usage examples are provided in the source file. NOTE: output files created by this program can overwrite existing files with identical names; use this utility carefully! The format used by ENCODE (and DECODE) was designed by Charles Lasner and Frank da Cruz to allow seven-bit ASCII transmission of arbitrary binary files (any file where the eight-bit representation must be maintained, such as OS/8 files unpacked/packed as strings of eight-bit bytes) through "hostile environments," such as seven-bit ASCII-only KERMIT (alas, the current sorry state of KERMIT-12), or various network E-mailers. An optional checksum feature (supported on the PDP-8 version) will ensure against data corruption. The format is robust enough to allow extraneous "white-space" (<space> <HT> <VT> <FF>, <CR>/<LF>, etc.) to be introduced by various intermediate "editors" with no loss. It is hoped that this format is adopted on many systems, as it was designed to overcome some of the limitations of the former (albeit extremely popular) UUENCODE and .BOO formats used elsewhere. K12DEC.PAL This is an auxiliary utility (aka DECODE) to decode the encoded binary files created by ENCODE into their original form. (See description of K12ENC.PAL.) The files can be recreated with any arbitrary file name including the original file name if embedded within the encoded file (embedded file name commands are optional to the encoded file format.), and can be directed to any OS/8 file-structured device. Since this utility is potentially to be used on systems with "ancient" assemblers, the source file has been restricted in the use of "frill" features, so it can be assembled by virtually any known standard released version of PAL8 associated with any release of PS/8, PS/12, OS/8, OS/12, OS/78, OS/278, etc., and should be used to decode K12PL8.ENC and K12CRF.ENC into PAL8.SV AND CREF.SV respectively, which will then allow further assemblies with the latest PAL8 and CREF (Version B0). Assembly instructions as well as usage examples are contained within the source file. NOTE: output files created by this program can overwrite existing files with identical names; use this utility carefully! K12PRM.PAL This is an example of a custom parameter file ("PARAM" in the documentation) for use with either K12MIT.PAL or K12PCH.PAL. It sets most of the common parameters to their likely (possibly default) values. VT-78-specific parameters are given for SLU2 support; a VT-78-specific banner message is created as an example of a user-defined banner message. K12CLR.PAL This file is a simple memory-clearing file. All KERMIT-12 loading memory is pre-cleared by loading K12MIT.BN over the binary file K12CLR.BN derived from this file. This yields "cleaner" core-image files which will compress better when encoded with ENCODE (K12ENC) or ENBOO (K12ENB). K12ENB.PAL This file is a utility program to encode any OS/8 file into .BOO format for distribution via any "ASCII" path much the same as the ENCODE utility. While not as robust as ENCODE format, .BOO files are generally smaller, which may be desirable. This implementation uses length correction bytes at the end of any file requiring it. The ultimate decoding program must support this aspect of the format to ensure reliable file recreation. This utility, as well as the companion K12DEB (see below) use the standard OS/8 unpacking scheme internally to ensure proper file representation on other systems. This allows ASCII (albeit "delicate") files to be encoded/decoded between systems. This allows exchange of such files as TECO macros without loss. K12DEB.PAL This file is a utility program to decode .BOO format files back into their original (binary) form. Length correction bytes are supported to ensure proper file decoding. Any file encoded with ENBOO (aka K12ENB) will decode perfectly back into the original form as long as the file's contents are intact other than white-space and other insignificent "cosmetic" considerations. Files not originating from OS/8 (not an exact multiple of 384 bytes) will be padded with null bytes to fill the rest of an entire OS/8 record. Files stored this way and then encoded again will reflect these extra null bytes. This implementation doesn't check for line terminations, so files delivered without proper <CR>/<LF> line termination are acceptable. K12IPL.PAL This file is a utility program to load portions of KERMIT-12 directly into memory without any error checking or recovery method. It is used to create K12MIT.SV "from the ground up." Once K12MIT.SV has been created, this utility should be abandoned in favor of K12MIT.SV to acquire all further files. Use this utility only if no other method is available, as it is inherently unreliable. The safest way to use it is with a local dedicated connection to another machine via null modem. K12MIT.SV is available split into single-field encoded files to be loaded by this program. Documentation on the entire loading process is contained within the source file. The binary version(s) of this program can be directly keyed into ODT if desired as the shortest way to load K12MIT.SV if desired. (See K12IP0.ODT and K12IP1.ODT description below.) K12IPG.PAL This file is a utility program to generate the .IPL format files (K12FL0.IPL and K12FL1.IPL from K12MIT.SV) meant to be loaded with IPL0.SV and IPL1.SV as created by the user from K12IPL.PAL. It is primarily a development tool and must be modified if K12MIT.SV is enlarged to occupy an additional memory field. K12MIT.ANN This is the release announcement file for KERMIT-12. K12MIT.UPD This is the release update file for KERMIT-12. K12MIT.DOC This is a collection of hints and kinks, etc. regarding KERMIT-12, including hardware-specific recommendations for customizing and assembling KERMIT-12 for a variety of configurations. The edit history of KERMIT-12 is also included. (This file is the beginning of the file K12MIT.PAL. It is intended for those who do not obtain K12MIT.PAL, the main source code, which is much longer and beyond the filing capabilities of some of the smaller (though supported) systems. By using the information in K12MIT.DOC, KERMIT-12 can be created by merely obtaining all of the files except K12MIT.PAL.) K12MIT.NOT This is a collection of release notes for the latest version. New issues raised or solved by this release will be collected here. Old, but open issues may be retained in this file also. K12MIT.ENC This is the standard assembly of the distributed K12MIT.PAL (using PAL8 Version B0) into K12MIT.BN which is then loaded (using ABSLDR.SV) over K12CLR.BN to produce K12MIT.SV which is then converted to ENCODE format (using ENCODE.SV (aka K12ENC.SV) as described above). All parameters are set to their normal defaults including those parameters which cause the local banner message to be generated as a valid null message (in case K12PCH.BN is not loaded over K12MIT.SV). This file should first be decoded with DECODE.SV (aka K12DEC.SV) into K12MIT.SV and then overlaid by K12PCH.BN to create a customized local version. The resultant customized version should be named KERMIT.SV (or any other appropriate file name), and not be named K12MIT.SV, to avoid confusion with the standard release file of KERMIT-12; it is likely all future releases will use this naming convention. K12PL8.ENC This is PAL8 Version B0 from the "official" release of OS/278 Version 2, i.e., the version available as DECUS DM-101, in ENCODE format. It has no actual dependencies on any cpu hardware extensions beyond the classic PDP-8 (as was originally intended). PAL8 Version B0 and its companion CREF Version B0 (see below) will run on any OS/8 family member system. There is a minor quirk of PAL8 Version B0 documented in K12MIT.PAL regarding interaction with the TTY: handler of operating systems prior to OS/278, but in all other respects this should be treated as a replacement for all prior PAL8 releases. This version supports 128k assembly as do several prior versions; the listing format will truncate one column earlier on wide source file input lines. K12MIT.PAL requires the use of PAL8 Version B0 (or essentially any 2-digit release just prior to Version B0; in any case no versions prior to Version 10A) for proper assembly. PAL8 Version B0 is distributed as a convenience to KERMIT-12 users. K12CRF.ENC This is CREF Version B0 from the "official" release of OS/278 Version 2, i.e., the version available as DECUS DM-101, in ENCODE format. It has no actual dependencies on any hardware extensions beyond the classic PDP-8 (as was originally intended). Besides fixing several long-standing bugs of CREF, this version is the required companion to PAL8 Version B0. This is the only known CREF version that will format 128k-capable assembly output correctly, which was a major sore point for three prior releases, preventing their proper use; many users have had to stick with PAL8 V10A and CREF V3 until this release. CREF Version B0 is distributed as a convenience to KERMIT-12 users. K12GLB.ENC This is a TECO macro K12GLB.TEC (aka GLOBAL.TEC) which maintains the concordance between K12MIT.PAL and K12PCH.PAL. It is distributed in ENCODE format to protect the rigid format requirements of a TECO macro. All global symbols required by K12PCH.PAL are equated within K12MIT.PAL in a special format required by GLOBAL.TEC. The OS/8 MUNG command is used to update K12PCH.PAL whenever KERMIT-12 development (within K12MIT.PAL) dictates. KERMIT-12 developers must fully understand how to use this utility. K12MIT.LST This file is a symbol-table listing of K12MIT.PAL minus the code listing. It is needed by K12GLB.TEC for the maintenance of K12PCH.PAL. K12MIT.LST can be created from K12MIT.PAL merely by assembling K12MIT.PAL as documented within K12GLB.TEC; it is provided in the distribution for those unable to obtain the main source (K12MIT.PAL) due to its size. K12MIT.DSK This file, which explains the KERMIT-12 distribution files as they appear on the RT-11-format RX02 release diskettes. K12ENC.DOC This is a description of the encoding format used for the ENCODed binary files (.ENC) in the KERMIT-12 release. Related issues and file considerations are also discussed to foster future encoding formats, since the format is subject to possible change. K12MIT.BWR This file documents known problems with the current release of KERMIT-12 and related utilities. Possible workarounds are also discussed. K12MIT.BOO This is the standard assembly of the distributed K12MIT.PAL (using PAL8 Version B0) into K12MIT.BN which is then loaded (using ABSLDR.SV) over K12CLR.BN to produce K12MIT.SV which is then converted to .BOO format (using ENBOO.SV (aka K12ENB.SV) as described above). All parameters are set to their normal defaults including those parameters which cause the local banner message to be generated as a valid null message (in case K12PCH.BN is not loaded over K12MIT.SV). This file should first be decoded with DEBOO.SV (aka K12DEB.SV) into K12MIT.SV and then overlaid by K12PCH.BN to create a customized local version. The resultant customized version should be named KERMIT.SV (or any other appropriate file name), and not be named K12MIT.SV, to avoid confusion with the standard release file of KERMIT-12; it is likely all future releases will use this naming convention. It is conceivable that distribution "paths" may be "hostile" to .BOO format thus making K12MIT.SV (or other files) undeliverable when encoded in .BOO format. For example, some users acquire KERMIT-12 via a path including WPS and WPFLOP.SV. .BOO files cannot reliably pass through this process. In this or any other "troublesome" case, the ENCODE format equivalent file is recommended for distribution. K12PL8.BOO This is PAL8 Version B0 from the "official" release of OS/278 Version 2, i.e., the version available as DECUS DM-101, in .BOO format. It has no actual dependencies on any cpu hardware extensions beyond the classic PDP-8 (as was originally intended). PAL8 Version B0 and its companion CREF Version B0 (see below) will run on any OS/8 family member system. There is a minor quirk of PAL8 Version B0 documented in K12MIT.PAL regarding interaction with the TTY: handler of operating systems prior to OS/278, but in all other respects this should be treated as a replacement for all prior PAL8 releases. This version supports 128k assembly as do several prior versions; the listing format will truncate one column earlier on wide source file input lines. K12MIT.PAL requires the use of PAL8 Version B0 (or essentially any 2-digit release just prior to Version B0; in any case no versions prior to Version 10A) for proper assembly. PAL8 Version B0 is distributed as a convenience to KERMIT-12 users. K12CRF.BOO This is CREF Version B0 from the "official" release of OS/278 Version 2, i.e., the version available as DECUS DM-101, in .BOO format. It has no actual dependencies on any hardware extensions beyond the classic PDP-8 (as was originally intended). Besides fixing several long-standing bugs of CREF, this version is the required companion to PAL8 Version B0. This is the only known CREF version that will format 128k-capable assembly output correctly, which was a major sore point for three prior releases, preventing their proper use; many users have had to stick with PAL8 V10A and CREF V3 until this release. CREF Version B0 is distributed as a convenience to KERMIT-12 users. K12GLB.BOO This is a TECO macro K12GLB.TEC (aka GLOBAL.TEC) which maintains the concordance between K12MIT.PAL and K12PCH.PAL. It is distributed in .BOO format to protect the rigid format requirements of a TECO macro. All global symbols required by K12PCH.PAL are equated within K12MIT.PAL in a special format required by GLOBAL.TEC. The OS/8 MUNG command is used to update K12PCH.PAL whenever KERMIT-12 development (within K12MIT.PAL) dictates. KERMIT-12 developers must fully understand how to use this utility. K12IPL.DOC This file is a description of the encoding format for .IPL files as used in the direct loading method of acquiring K12MIT.SV. K12FL0.IPL This file is the field zero data of K12MIT.SV encoded into .IPL format for use with IPL0.SV (from K12IPL.PAL). K12FL1.IPL This file is the field one data of K12MIT.SV encoded into .IPL format for use with IPL1.SV (from K12IPL.PAL). K12IP0.ODT This file is a sample of an ODT session used to create IPL0.SV using manual entry into ODT and a SAVE command only. Some values shown are default and may need to be customized according to parameters documented in K12IPL.PAL. Using IPL0.SV (and IPL1.SV from K12IP1.ODT as described below) is the shortest way possible to obtain K12MIT.SV when no other method is available. K12IP1.ODT This file is the field one companion to K12IP0.ODT used to create IPL1.SV using similar means to those described for IPL0.SV. Both IPL0.SV and IPL1.SV are required to directly obtain K12MIT.SV. [end of file] |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | (REMARK Image File Created by PDP-8: 06-Sep-1990) (REMARK File Date: 06-Sep-1990) (FILE K12MIT.SV) (REMARK Standard core-image binary distribution copy of KERMIT-12.) (REMARK 06-Sep-1990 Version 10g.) (REMARK File decodes into K12MIT.SV.) (REMARK Use DECODE.SV [aka K12DEC.SV] to decode into K12MIT.SV.) <VVM862000400FI000V02280P2191407G289VA7G1S470098C087H80G52CGE0102R0G00> <50E2310A4G20K8I43OG1OVG2NGU00E0442K408F6800AG7103HV05F1S00S0885880GU8> <G00L8302AHC8G05K8480802KG02BOI64GG1090G24010480200J800X001GHIMSP25AHN> <DF92ESGF4SK2E6LJ0CBB4GQF6GVKMDCJ4QOK64LL0CVJALQEMI1KTCU33DPCM5RJACJEM> <IM750VL6A1J0TPHUFR82S7J9VQJEDLIDCA32DQOM5PKVSJB70QEMK1JSC5N2OHADFPJ1S> <VJ0SPJ6P786D472SQH65P84TFJAFP2ML1L6CQJ7TP6E6PIBSTIG8QJ65R86C3R4SK3UJP> <L9T5B2OK2UB5CESQJ4SLOEGLJ7AJ26THA4AJBUC6N9CO6EKLJGCFN5IONED9IDQQAOTK0> <M6LJOCRJA5P3D09KUC2J700000X003UJVPFT28CG4VTVA58IBU8I343NUSVKBSOI343NU> <O00O4CH4O8UA5P0QDJ1341F6T9400000NVPSN812MKM95S9FAC2J1KOQL15VUFDRC8LMS> <S006FEJ3QLVK0PI1FH30CG4VNP29FD302UM60PHMCHQ0BLK00PIDC3J7EG2U0VO000000> <0000X001AE5AJ003L9O9M206OQ73018BV17001JRIVV41PTM8JJRCG7MMPTHFTJRCH7MM> <PTN81JRCG7M7PTHFRJRCH7M7PTHFRJRCG7K1PTHFPJRCH7K1PTHFPJRCG7K1PTHFPJREQ> <N7M5UUFCBTCUONPPTNDBJPEG3K0N00893A0GR7J371106FAKOCVC40Q1J31LQ6J3DCD66> <V8MGE5448SDUK1OUMD3I31274IJ0EAPJL4B7NA9MFEMGP11D2FL2Q5LMTKCO8B8V66NL3> <CBFAI26UMVA5TFF8RR0M5NMECS0000000X00070OVK82V02K2003G1G228QG46S00DABO> <0QR7I1LV803CCUS6P9RODLBCGRD7F1N5DM3ESP06U5SGDV3KGS0G71O9F23H8T4735SOE> <93KGSN661PMCG3LCP47CPJGPTJ0HK3663FKB872SP4E6LJ8SG1PHPB6EMGUC3D2SOQQ6U> <25T41PRQJ69NLMCS000QR7M1LVDG3EST075PPGEDJK0TB791R6ES6FCS4D0PPGSBJKHPB> <7EMGUE3D2SSQUKPQDTDJN00000X000PX0000X0000XF7GBX000LF7BO0UANHOME7LPO0U> <8121TDQNJO0U8121TDS7JO0U8121TDSBQC0U629O6UMU3O0U8121TDSBP40U8121TDSBP> <G0U8121TDOSJO0U8121TDSBOK0U8121TDSBO41MOS61SUF7JO1MOSM1S0INJC6U85C18P> <81C0IJT8031MG041SRANICIE3O3O6U7J9LAE4GO5897JIE0U87HT4KF7820UDLBP6971S> <1SGF4H4SK2KK1SGF3Q98UENG2AU84TVH084TV3IG3QEVOG3QEVHP81T7FRU40UJNSMVH0> <G2ROAI6IAIRHP841SMOS3OF0G801SJF1A1856GGL50F04LSKF6A0B0F20KOGU0QBSUG1H> <T50419H15F067JPO7G3VVFFJPSU0DBRSUF7JO1OFFJPSUF071TF9VJPS0629O7DSFG3GU> <NIFPSU0E3QUCV7JO1HP7NPSUF071TF2VJPS0S7LS3UF7G3FOFFJPSU0CMVGUV7JO0UANH> <OME7LPO0U8121TDQNJO0U8121TDS7JO0U8121TDSBQC0U629O6UMU3O0U8121TDSBP40U> <8121TDSBPG0U8121TDOSJO0U8121TDSBOK0U8121TDSBO40UB53QRNS7JO0U218DSD0L0> <K00000000X006IX0000X0000INGPS961C1S1F0HT4KING3UU4NHPC1628I037J9K2E27G> <2B8F0ROUE718D8971S18FG21T6KM82HIG2O01S3F3PP8I7J5LS0G7GDT0A3S145A5A8T0> <A3S1S0KPBO0000000000001VF1BP4I7KK0IEG10LC91HC0S16H83UU27H56BG1IKOCGG7> <TS5F4I8UIG0PGUJ4JGU064J0K1VF1BP4I7KK0IEG1H4O5G3G4Q507I9S51H95C971S0C9> <61FA0U07IDS57114S7G1H4O5T83O1VF1JOIC2O1O2D2O2DIEA0B20594HT40INIDSL841> <T4K2H406F6J84S49O0545T9CLS37JHOA3A7K2GK7O28AD7L0M0JCKQGADKO4LSJ2JGI04> <2LN8C963G4RE2M3Q15F4GK654LGM042LN9T0K1H4O5709KB00JGI05C50KSJ4JPQ0U73Q> <HT00J1GUN2H56AU3HAI042LN8C963G4RE2M3QAU329OIJ47K2GJ2KIOAIKPBOAO4L3Q18> <A3S0UG2KG58971S16P9L0KR9G9BOG5643Q18A215706HAD613HD6B5F1BP630K0M0340A> <823A1ABL009BOMU2M88U19140IE85AI0594HT51IG7TSLF3G44C2O2GV0A19GP043QD90> <A205909HAD697JK0IJG1H4S99I0K80VNILSE0GHGB0A3S0OF1GAGB0329GAU07HDS5939> <59DF00000X000HVNI9S51H95C5G1G4ICAKGLS0VNGLSI93QA097828A32IAOA4G1H4O5G> <3G4Q5F03PAU7088O5G51U0I2GOKIM2O5M080JGGO59040AI93Q9S0VNILSE0GHGB0A3S1> <451H95C5GBC0IE9L8OC91I8KSKG115451L1T4PG4Q0232G4LSIF19KUK2O1GIE2O14SGA> <L40AI93QA35F07TSLF3G44C2O2GV0918CA9B1C0O1A1AD90808CM5A7G3UUANHO2261C1> <8FG4OKS4GBC089918D8F96C0AI93Q81VF5BOS1130M0K7O2CAE285M080JGGO5980L4I7> <KG3UUANHO2261C18FG4OKS40FRPAU7088O5G51U0I2GOKIM2O5M040L060594HT40X000> <KX0000X0000X0000X0000X0000X0040PKOS7B80ON633I6D4F0TQGM5P87T9IGEPQMETJ> <K8RM58HADFRKQCBJAEP767D86SOV7RNKC9P2FCBJ0SOAM51KUCDV6CQSTDRJQCTJ9CPVD> <0JGMA0N2DOPE1LJ7D9A6VHB49BKUD97AAPO67PHNSP3BPNN5G92ECI79SO9ECPKRA1N67> <PV5DVGUSSBAAPS6CLGGDJJ26ON61PLCD9MN8HAKDRBPOJN2KQJ69FJMA1N3CPTE4NF88J> <EONMV49BKTD839SQHE8P82S9N35O6MC1L6CDJ4SOND0PJQS9IGFQJD07GEC774G02O0X0> <00501O000000000X000FVUO0000000000007S00000000B8260006400X000J0VO01U0D> <5C0TVVO00000000000000400K140I04GIGPP44N127O000000000003O0Q0FTLG003860> <F9G3BO002K014SNN55TI8HKGE0302DR15U3603T2G8O52P9I101007V00NUDVPGFTN010> <7U0590401VJ00H1FVPFTG2CHF0083T1EBUI2CNT4NPVONTC61FP7TQJMK0C6CHDABI36K> <FUA580QDPFO00L04NT04QG000TG1Q0R8KK0T0FUIA0BSMQ8NOFTRD68FGFKJSFTHT3T4A> <NGMJDKPT2V95UT6H9KLB3R02QCVN7THVL5TNQ96I4997LSKAP9UI9KNA0V923DGS87V01> <EG0000000000JNQQL7FLLUC20KCORK05MMFCBQSUONLPTJ12O8BQJ68T05T800CP6NAPJ> <N81FKG004SAC2KSSAG0008P56960HSIR4L5CATFG0403C0004KRI93G140VA5O155JG14> <0UA5O0Q78L800N0001R061GNVCFP7IP0BI000H41FSOVIVLI0N6000QK26HL9FAAAIIKA> <KESVX0003T01QKIL6M8VSS8CNG00FL2TAM0O017TQNPMC49JSQJ6IPHUD9JFA0V6I44NQ> <S89CRV4APA6ENDIBDER000G0001FIR6RPO00DN9DRO5E1BGA1U1DQ1UIFIUIX000R00P0> <07E2BJ1LQAUK3LI0024ON007EBVVK2K1905O0008J2S9D5P9EFV7VOKN4TNQHE4IIT49N> <280000EG0JMDD7GHUKD06L6Q1G7EO9I2D4ON64VQ9QV40JKVA205S4ALFG09EL9OIQAJI> <SO007017UEG0I5ND000QC2EPN9T8045UKAOM5KV85C5K4QNOKOU2175K7EG2TQ9QLBSJK> <QNQFRLF001J0RQFMOPTN81JR0VBI8VA5E2BSSUPGHT17I0O8EG0NOPTN81F9G0000X000> <D0E02G02GQIQ2QDIB5VVG0000X002RDTP21UGAU0NN0UNQHBP2USNVVA5F4BRU44H6V85> <F08JAUKNNNN1FE9OGET6SNN0000000000X0004V08015OBG1GK454MVO02VTGL905O000> <6M3O89C1R1T4AIOJQV858SI5UO0LGN2O00QOF115G7C7KHAI2FBT8L729JR02M2SP003B> <0EOFP2LE9C5AIAOBKS00003E0BG8G2MI463DU8A6ROUUS89TVUGAQKMUS891BUKAOT6U9> <NTBKBFOKVG1DNHTSOB4M55HTG91BEOKM4N0NC9DV2JU07G1DNPTVUKAQELOX0004DR138> <RMJTHVD9R2EQGPASMV1X000JVVO00QLILEBGL7RAOQO6M4NVCBJ2UBV6LKTCUA59UBUVL> <2KS7B2AP574LMKD7B1FRUGAJT5C5VTA5R02LDLCHD5AGOSILH40N07C0ALRG000000004> <9IO1KQXD6G3007IGBU6OSU7DG2CEF3MO74AIU80K0000000ND1C2IQBMG00003DEBTMQ0> <MNP2KNI00G03O89I7C0B865EU8000015N2V9GEIIHMQ13P94016PI1PBFIV6UO9M5TG1C> <JCO2E6OG0013FVS00X0009I2G05M0J5RU6VV1J0006M0HLCD1FV58IM2BGLBBB28QM5PH> <F5VJB4OR8MCTHUI5AIBUV52KR5V7Q1AMQL55H4D9FMON65VN4DCKB6EOV92L94UNQ1AMK> <G3M05CDO1R02M2S0X00047CCVLS4AOSNPUA5CABSFK2TJ8DH7R574MALV9CDD2GR2FMAE> <9CAB5AQ3M6FQLKFC0IOQPFM0NCO00F9MRD6J7KRDOJ9P9800004KI00JSNO89KQD7F9K3> <IMTNKO5IFGGB4V4X000D05FS2QFG0C0EVKNVLVU000NVDCKVSBUV52KQ5V7QHAFIM8NRV> <G5AS86IVBQ04UHFIUP4MBL0FCH0R5MQGFL0FCKNT44RG0LI5U7QHA1UK0LIDCJR4BRPDK> <JSIR9FF5MQGFM04R4MRA1G00000VBCDRC25THFU65C2B3E0RG6S1JITEPJ5OM6EBI2TEP> <G0000U83F2BO661HH5SBEORN2UPNDTM1ESRN3TJOOLN70LO5E1BO89R07QRNP9SNLUA5E> <G9UU44NFV85SEJMQQ967NHO000000000X0005VGFVG04A5430V850JU7FUF80BLO008DM> <LUFVL8BB49LMM6FUL8BR2EOIVNH1DC2B37VAK5TH9C58UIOUK1TH5CKNNOGMM2FUL89B1> <UKALFM09BTACBUBD8G2V85VN7TAGCG2VA5O1FTG0000X0003IVSNT21286B9IVKGIIPRM> <C00IJ63D5V916TTX001NALKBD6EVRSC9300015N2VTGE46B2Q8MPD25HCB9FSOQI5MB7H> <CB2Q8MPE3O8HCB2Q8SPCQ5HDHJ37Q0MOSNUFV9CF7U8M6L99HJCF7TOM4HMV859OB3FL2> <5HHJ12QOCKG2S000780AOPF19LN05FF0SQU62NLR47BBK9O6MVJBTDL79AQI92X0008TG> <33755CVO22II80200BPG00T811U1UIFHNB5QHEMBM9FDND4997LSKEK1NEIJAMJFB0041> <30004S00003VVX000BG73G0HO59002004MSBVM1OGPCB92R5KAL6BGL939CAB9DVO8L3B> <2RQG75LGV55KKK000AAA900AQKGEAJ2S0JVLA6I025LGPN07C09IRG2B4N07C0BURG025> <B9O56MF09PCR000015N2VTGE46B2Q8MPD2MAIS7GHB6M5MABJV2SRB6PVQMD9CP2QOCRM> <FM05VDR7Q0BMC2JBH044N6G89E6X00172AK3IO000C00JVR3LI59F40BC7SKLJQ0B6A90> <0B8IGEAHA71IIMFS1CP9401CVKE28TFL271JVKE3A827BT0HO9MMBUV92715V3ETQG7TO> <NRCD9FP5JOS7M04EB3O8U9CQ715URBI8UCHABP00O00008S4LPCDPBLO0M711QT84M7S1> <26MB2IVK65565E2BUI2D908TFL271IOCE3A827BT0IOF0155CVO2PII800I0BG2B4N000> <155CVO22II800BGPF1KGUA1FLE000000X000BIHQKHGRFRLLVH9G48OBGB9IE0GJ58136> <3K25CNO001761K26C784APFG02F9JMSU912POIBKJKSL376PC6DDGJ000008KVO8L9CB7> <S44JUSV003B4AP2VVI05VNHGIJUO0LIN9O00006NOLU5VF409GF315JTG1BTEPG00006Q> <PFORF7RONRDNHTTSKARJH149NQHB8IRVT05ULD8BFVL2MO7NKM7EVQR7M1DNQDTB34NUT> <VX0003C0PU0O44S108627IHFG20FT0LP9GGO1I0EV0X000AVG63DG9VOO0QV9801SKAM9> <K7IAO8GK0002S0P29VUORIVPGA62NIHAQMPCOADJ1GKR6J19MET81VSR0MO8KRD85A4C5> <6O9509GD9UC5F52LPDIM82BUPVILI5IJ3GBUPC940LFU8IB5F10OAS893EORLVEKE7UM8> <3SGAGD40N00000000000X001LA0IG0H3N9D84A0801UKBKOHND24IM2440000N018EROM> <O64PH69C32J2U4NVV858OI4472K5LC801I4JU42VSH1C3O3E0PM17SCACJORJ400P0F09> <PC07KJLUA5B69F0ED40905O0BPFL2LH5VJADAN003Q8LHG3QO7SH4GFNG800ISUO341NE> <F808RMTHVT5QRF330NU4NHD6AF330NU661S1N0C1FJJ5SP43V0LO5E102V7SBV2JOIU4N> <VV85CPI0K73O8NECIN2440000LGQVQJMAP800X000BG5JR3C0000HTVI58Q87IENT056V> <QHA6IBQB3L5PVUBVFK2KB4F68L5SG0HA8007OGI067AS0008008PVK2LB5VB2GBU64KNR> <C9HFKOGM3UFPN74KKLO08QA900C8GGEALQSSIVK6P565E2BUI2CBTS44JISS004VHQG9U> <UTULK4VDS4AO6AA4004954G063U875CLEV3UKNKVA5DR5520024II80321K3IMNNFKLRJ> <V0BATUNFIBTEV00000X000ES00KQ4R7G0AEH4G7S0HG5K1HO03V21CO842EGJ8001COBK> <2EGMG001CO6G2EGC8001CO6G00004KLJQ0AEA900C9UGEAIQSIH9NC2OPKIASI0MC9O17> <8J400001FUOQ2VQAH6QPFQBVFC3K05V722OP2VEAGN9NC0O121ONQU85C75EOQ42QS070> <17SQPSNOV85CV5ESVO22S07808TFK2B1T01FFDL08JVVX0014G07VUL6FVR1M02NTPVR0> <4400U858AE04G1HK4RC95E0003P0L3HOII4M6GNVH4LOI006JSHKD81Q0IGF92KTJ7VC1> <ABEO2SIX0003TM132OOJ63OOLB70LO5E1BO88C07REGG03P84V17O1UIFHTO9E5QU0000> <1HGCC9FSQS2VLMHIJVI12NKQ6M05V4AVRI6Q6AFU84AUJ8QP7L0FE5RI0000000X00180> <BNVKLO1N800T016QQQJG1MA9013S9E6P3497IN0LO5E1A4LP29SL2AKPAKA006821UV52> <S0DI9CIBVV52L94R7QHAMIP43SVA1CGB4PMMSL4MSRA9GAKSHUV85PAB4E44NUDI5PA00> <EG0LLD01FRA1G01M75HP7LV0AOIBUG8H72B3PDMTRX001M3EGA1VDG02BEIVK1690PD6B> <UGA4NT0Q9FQ1IDR142RK9VUFU4GVIG92FK2MIJVD9N7UF12FR5QPEPUKAK6FTLHCVLB2P> <V6M5DR9EQ1RU45NF5R7QHAPITUBOKONQHB1B0CNF4GFQ1ATEK2M4DR1ENUKANSNDJUPER> <7SAOKJCJUREPO09UUFMJTCV9A8KG2S0S04VF7R9UMFKJVDCQFPU44VIV85CQ91VL2MUIV> <KFQ92FL2KCIVKOTA608EIB0OT4M00A7400X00033KO0000002NMLTDE3EFQIIP5N0581E> <BAOAO0LM5LRF2G00NOS89FJUKAI4NPDOF82BSGESIQDUE8IFGSG7O8H9Q81E000257U25> <P9I4NV341T09FG1RIB9NO5U722BSVL123N55A800C36M0O7NKGH1V12LC0SRE291FL2LS> <5O87E9CV52LU4T7QHAVIS6T7TM3FEIJRKS00DO9FBOGIUONNV85CSBGPVUMENGHE3I4NU> <N41T09FA1RIB1NLNGG01Q0IUNH15TG7FUG4R2UO001FFUGBS4NLS89FDUKBS7497TM837> <VRS7K15TG7E9C6UQV1X000ANFG00BLE44NBVA5A4BLMTJK15QO7EBVMTF497R682RM28B> <T8L87DG93FK2L05QN22BLGBJT0L87A0P32TJO8HGI81E000262U25QBI4NTB41T09EK1R> <IVTNA5QN22BLV5124U25BA9E0BJT84GNQHEII8RT88HLQA00D06MRQ1NKGH2F12M70SRE> <O91FL2MN5R07E9CV52MP4T7QHBD2TIU2TM34AJ1BO8004LR4E9BM90NVDQHFURLM8LI6C> <H5TQ0000000X000IE0000QFI8VH14I14BUGAHGKVJVT8PE02JV49EHU83Q0I8S3N4LR4F> <E0003K14HV22940EVT095LPC0028RI4VA5AMBVF20JKJVTANOC68OI5V85PU93U44I8VA> <5PVI4J9341JVTPVQ0I903N4LR4HEFG0311LGU2CIVEG2TU0015GVUIB1VS4MJVM9D7V9V> <PCGTSA00F10JIQ2DDHK74Q7K0NKF80O8KQ6UHX000RLTTFJBSAUQNL04DT211G9S2E0JG> <4A11GAJVVK004C14G9O290KO4HVVJB0250M04I1AFVVRV0KO4A1708JVVA004E12GAJVV> <B005412G8C250I85C12VVTDJ0I04A160A3VV9CVVU0000000X002T008000000000X002> <T0VG2U0G0801D08O4S0OG4010VVO00008J8GDUA583E0000NVUA58QB98OIS64V4C885G> <DJT0L3DOC006U5GC5SC8DEA0025MUA5AMBVF52LDS0FIHAO2VNT0N6KBCBUFK2L7C3DPK> <BTOT2Q05UKEHRC21HGCLAO01Q0C36TMO707EO6USOGDVA5JVGD21MTM003F32D21JU8LJ> <9F33EQOQ4Q5S85PUG41C095S9FJSK61CNOVA7A085M1EU400623FES4RK09NDTQBROT30> <QMU800ROIUQ6TLQPF33EQTQV8X00050NG4602VUC2F0K7UVVUFU3VNTG62CA07F6FVDQ1> <EGBVFL2LSQ3MGDQ09FP48IVI6B5V4KQBU9F4NSHE2T3I65Q1FQQEPFO00IVI21AHPFP37> <IVKGJ5V402BU9B9EHP32VHG85USDP4PIT3I65Q1FKO42V66SGCU8L7S012RPFTRVCNQLU> <KKA5T7Q1B42HCNJVA5DHHCU032US029RB6CBUMJD868NFPCB6KAD868NFOMK0NGD8L8K0> <06T4USC2ADPI4J11O99QDE5I0RRG00X00078U88M20358P2QEMMDL0VO3VR9RNVOIV44B> <VLS0001R0201M25VR00B1603NC5VNQHAEESGNTV85BTQ1IVJT8L9VA1HRUG33PS0FQHAU> <QNVL0V0FQ1ATSC40F00N03UKANALSS3NIHAOIVFP8LE9FLUKAN2M1T39FJUKAMQLNXS08> <BN00000000000X001JVU7UC7PFO002G0N3U0000000X003TX0040P2AT5N6KPVE57AUD1> <79APQUKPLAT7399H75FBKUT8AGCONUDLL0CBJ6EP765J85CU3ACOD6FHHD8R26PHBE9LH> <MCBV9CH5EIRJACVF2SH7E4DHDR9MOBH7LHL2FOJJ26ON61PLET8IGCPT50PHCTDB1GOML> <KVC5B82OTQOM5PKVSJ37AHMKDV2M8IN2BQO5JP80T1J9DO765BL5D5R9OHNCAP2KOJN3A> <PQ6IJJUS8R2OMEDGN2E8J26THB4AJ2ECCJ78OME6PKHSBM4INIU5RGTOI2PONQC9PBQS9> <JB3P6U5786B16G00000ZFKK57VVVVVVV> (END K12MIT.SV) (REMARK End of File) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | SYMBOLS PAL8-VB0 06-SEP-90 PAGE 181 ABFLAG 0002 CNTRLE 0005 CREST2 0430 DMSEND 0351 ABMSG 4000 CNTRLF 0006 CRLF 4411 DMSER 6730 ABORT 4266 CNTRLG 0007 CSTUFF 5316 DMWAST 0357 ABORT2 4303 CNTRLH 0010 CTLCTS 6466 DM1AND 0710 ABORT3 4317 CNTRLI 0011 CURSEQ 0037 DM1AN2 5722 ABORT9 4321 CNTRLJ 0012 DATWOR 3502 DM1INI 0200 AIWCNT 3501 CNTRLK 0013 DAY 0006 DM1LIS 0600 AIWLUP 3437 CNTRLL 0014 DAYMSG 2145 DM1POR 0234 AIWNUM 2404 CNTRLM 0015 DCAC 3200 DM1SEC 0707 AIWSTO 3440 CNTRLN 0016 DCADAT 3433 DM2INI 0213 AIWTES 3442 CNTRLO 0017 DEFCK 0061 DM2LIS 0467 ALPHA 3247 CNTRLP 0020 DEFDEV 1456 DM234 0360 ALPHA1 3262 CNTRLQ 0021 DEFEOL 0055 DM2460 0361 ALPNM1 3245 CNTRLR 0022 DEFMAX 0136 DM2516 0362 ALPNUM 3237 CNTRLS 0023 DEFQCT 0043 DM3425 0363 AND377 0166 CNTRLT 0024 DELETE 0177 DM50 0332 BININP 0027 CNTRLU 0025 DEVNAM 1460 DNERMS 4071 BRATE 0007 CNTRLV 0026 DEVNUM 0071 DOTAB 6415 BRKXMT 2514 CNTRLW 0027 DEV30 0000 DOUO 6460 BUFCHE 5105 CNTRLX 0030 DEV40 0001 DOUP 6455 BUFFLD 0010 CNTRLY 0031 DFDEV 1437 DPARS 1400 BUFPTR 3761 CNTRLZ 0032 DGROUP 0020 DPAR1 1415 BUFSIZ 0200 COLUMN 0013 DIRBUF 2400 DPAR10 1453 CHKCLR 6453 COM 0017 DIRFLD 0010 DPAR11 1454 CHKUP 6432 COMIN 0630 DIRLIN 2402 DPAR13 1455 CKSUM 0522 COMOUT 0672 DIRREC 3407 DPAR2 1434 CKSUM1 0535 COMWAI 0676 DIRXR 0012 DPAR4 1442 CLCL 6136 CONBUF 3200 DISPAT 0452 DPAR8 1450 CLDMZA 0204 CONCLE 5703 DISPA2 0462 DSFLMS 4105 CLEAR 4521 CONINS 5365 DMIFLD 0010 DUMBCF 6312 CLEAR0 0437 CONNLU 5021 DMINIT 0324 DUMBFL 6310 CLEAR5 0450 CONNMS 4023 DMIOUT 0354 DUMBIE 6315 CLEAR6 0451 CONOUT 5302 DMIPOR 0400 DUMBSF 6311 CLOOP 0200 CONPUT 5676 DMISET 0346 DVNUM 1464 CLOOP1 0217 CONREM 5366 DMISKP 0352 DVNUM5 1500 CLOOP7 0227 CONRES 5705 DMI01 0325 DVNUM9 1507 CLOOP9 0235 CONSRV 5000 DMI02 0326 ECHOFL 5153 CLOSE 0004 CONTEM 5341 DMI03 0327 ECHOSW 0014 CLOSER 4027 CONTES 5330 DMI04 0330 EIGHTB 4422 CLOSIT 4015 CONTLS 5701 DMI05 0331 EIGHT1 4426 CLOSLU 4013 CONTMS 4042 DMI06 0332 EIGHT2 4435 CLOSMS 2040 CONTSF 5677 DMI07 0333 EIGHT5 4437 CLSK 6131 CONUPD 5341 DMI08 0334 EIGHT6 4440 CLSK8A 6137 CONWAI 5367 DMI09 0335 EMPENT 3465 CMDTBL 6000 CON2MS 4050 DMI10 0336 ENTER 0003 CMERMS 4011 CON3MS 4062 DMI11 0337 ENTSTR 2405 CMOUT1 0706 CORESE 5014 DMI12 0340 ESCAPE 0035 CMOUT2 0707 COUTIN 6601 DMI13 0341 ESCFLA 5154 CMOUT3 0711 CPUIDL 2357 DMI14 0342 ESCH 5150 CMOUT4 0712 CPULIS 2042 DMI15 0343 ESCHAR 0101 CMRESE 0674 CPUMSG 4064 DMI16 0344 ESCLIS 5144 CNTRLA 0001 CPUPRM 2277 DMI17 0345 ESCLOS 5113 CNTRLB 0002 CPUTEM 6750 DMPOMS 2147 ESCOMP 5102 CNTRLC 0003 CPUTMS 2134 DMPPMS 2171 ESCPRN 4673 CNTRLD 0004 CRESET 0420 DMPRZA 6640 ESCTEM 4707 SYMBOLS PAL8-VB0 06-SEP-90 PAGE 181-1 ESCTYP 5071 FSERMS 4165 IER31 3123 INPS22 3071 ESPRIN 4704 FSWIT 2134 IFL 6300 INPS30 3116 EXITKE 7577 GENMSG 0001 IIE 6305 INPS40 3124 FCLEMS 4114 GETBYT 3600 ILINK 2200 INPS50 3137 FCMP1 2160 GETCOR 3607 ILINK0 2203 INPS80 3155 FCMP2 2161 GETEND 3663 ILINK1 2217 INPS81 3156 FEND1 1251 GETEOF 3661 ILINK2 2241 INPS90 3200 FEND2 1256 GETFLO 0664 ILINK3 2246 INPS91 3213 FETCH 0001 GETFL1 0665 ILINK4 2253 INPUT 6400 FILBUF 2000 GETIR 0611 ILINK6 2257 INPWAI 6401 FILCLO 4000 GETIR1 0627 ILINK7 2260 INQUIR 0012 FILECN 2400 GETLOO 3614 ILINK8 2261 INREAD 0640 FILENG 3512 GETNEW 3605 ILINK9 2262 INSKIP 0636 FILFND 2506 GETREC 3610 IMAL8 7075 INSTAT 0656 FILMOD 0075 GETSOH 0600 IMAOMN 7047 INTPC 0000 FILN8 4471 GETSRV 2600 IMAUNK 7101 IOCLUP 0241 FILN8C 4521 GETSWT 4454 IMA12 7072 IOTCNT 0306 FINSRV 1530 GETUPZ 3656 IMA5 7100 IPORT0 0030 FIN10 1546 GET6 4517 IMA61 7061 IPORT1 0034 FIN2 1537 GET6F 0061 IMA610 7067 IRB 6306 FIN20 1550 GET6P 0060 IMA612 7066 IRS 6304 FIN5 1542 GET60 4441 IMA8 7077 ISF 6301 FLD1AD 4000 GSRV10 2625 IMA8A 7070 ISZC 2200 FLEN 0070 GSRV12 2630 IMA8E 7071 JMPC 5200 FLENGT 4026 GSRV15 2633 IMA8I 7074 JMPIC 5600 FLEXIT 3477 GSRV20 2636 IMA8IL 7034 JMSC 4200 FLOW 0001 GSRV21 2643 IMA8L 7073 JMSIC 4600 FLOWAI 0702 GSRV22 2644 IMA8S 7076 KCCIOT 6032 FLOWFL 0102 GSRV40 2647 INCHAR 0015 KCCZAP 6501 FMATC 2155 GSRV50 2651 INCHK 0741 KCCZP2 6546 FMATCH 2107 GSRV80 2654 INERTA 3222 KERRLU 5115 FMATF 2156 GSRV90 2626 INFLAG 0020 KERRMS 4375 FMATP 2154 HADR 1520 INIDAT 6364 KERROR 5122 FMATT 2157 HANDNU 1527 INIECH 0000 KEY 0003 FMAT1 2122 HELPMS 4202 INIFLG 0063 KEYBUF 3000 FMAT2 2150 HELPSR 2263 INIOPB 0516 KEYCHE 5221 FMODE 0177 HFETCH 1510 INITEN 0053 KEYDSP 0026 FNAME 3513 HNDADR 0053 INITIA 6600 KEYERR 0103 FNBLK 2510 HNDLR 6600 INITMS 2210 KEYGET 5247 FNDEND 1247 HOLDBF 1000 INITPR 6615 KEYGEX 5274 FNERMS 4127 IAAC 6171 INI612 6674 KEYGNO 5300 FNPTR 0065 IACA 6167 INLUP 0634 KEYINP 5200 FORCEP 0054 ICF 6302 INLUP1 0637 KEYINS 5370 FPACK 4512 ICLOSE 0001 INMSG2 2242 KEYLAT 5155 FPACK0 0240 ICTLZF 4033 INMSG3 2243 KEYPRS 1261 FPACK2 0261 IER02 3020 INOP1 6303 KEYREM 5371 FPACK3 0274 IER05 3027 INOP2 6307 KEYTEM 5341 FPACK4 0312 IER10 3032 INPERR 3141 KEYUPD 5224 FP1 0321 IER11 3034 INPSRV 3000 KGREAD 5252 FP2 0322 IER20 3040 INPS01 3012 KGTEST 5250 FP3 0323 IER21 3044 INPS02 3015 KMODE 0016 FRECMS 4142 IER22 3074 INPS03 3020 KP10 1270 FRSTRE 2401 IER23 3055 INPS05 3023 KP20 1272 FSBLK 0067 IER24 3063 INPS10 3027 KP40 1307 FSENMS 4154 IER30 3121 INPS20 3035 KP45 1322 SYMBOLS PAL8-VB0 06-SEP-90 PAGE 181-2 KP50 1323 MREC 0003 OLS 6316 PRMTMS 4457 KP90 1325 MRS 6364 ON 0000 PROMID 4464 KRBIOT 6036 MSB 6363 ONOP1 6313 PRQ3 6236 KRSIOT 6034 MSEND 0002 ONOP2 6317 PRSERR 0055 KRSZAP 6472 MSF 6361 OPBUF 0466 PRTINI 0255 KSERRO 5244 MSGFLD 0010 OPBUF1 0476 PSEND 0300 KSFIOT 6031 MSGOUT 4665 OPBUF2 0512 PSETF1 0262 KSFLOC 6470 NAKPAK 2551 OPC 6314 PSETF2 0275 KWATCL 5277 NAM 1663 OPORT0 0031 PSKIP 0301 KWATSE 5276 NAMBUF 2560 OPORT1 0035 PSR 6363 LATEST 0017 NAM0 1664 OPRE 1134 PTABLE 0030 LCLMSG 2000 NAM1 1677 OPRE1 1160 PUPSTA 5156 LEDERL 0000 NAM2 1705 OPRE2 1162 PUTBYT 3671 LINBUF 2727 NAM3 1707 OPRE3 1165 PUTC 3646 LINC 6141 NAM4 1713 OP1 0514 PUTCOR 3753 LININP 2000 NAM9 1721 OP2 0515 PUTERR 3703 LINSIZ 0040 NEXTSE 3403 ORIGNA 0000 PUTINI 3706 LIN1 2003 NL0000 7200 OTIME 0751 PUTLOO 3714 LIN10 2056 NL0001 7201 OUTCHA 5072 PUTNEW 3712 LIN2 2032 NL0002 7326 OUTEMP 0630 PUTNEX 3701 LIN5 2037 NL0003 7325 OUTFLA 0021 PUTONE 3631 LIN50 2062 NL0004 7307 OWAIT 0715 PUTREC 3754 LOOKLU 3416 NL0006 7327 OWASTE 0752 PWASTE 0307 LOOKUP 0002 NL0010 7215 PACKIT 2101 P7AGN 6506 LOOK1 1336 NL0100 7203 PACK6 4516 P7CH 6406 LOOK2 1337 NL3776 7354 PACK6F 0057 P7CHAR 6504 LOOK3 1340 NL3777 7350 PACK6P 0056 P7ECHO 6424 LOWER 0000 NL4000 7330 PACK6T 2106 P7OFF 6515 LOWERC 0143 NL5777 7352 PACK60 2063 P7OUT 6535 LPTR 0031 NL6000 7333 PAGCNT 0002 P7TEMP 6561 LUKUP 3400 NL7775 7346 PAKCKS 0036 P7TLS 6540 L11 6522 NL7776 7344 PAKPTR 0035 P7TSF 6536 MACHIN 7000 NL7777 7240 PCON 0036 QFLAG 0040 MACHTE 7102 NODATA 6376 PC8A 7050 RACD 6367 MESMOV 6734 NOECHO 5077 PDP 0002 RATE 0007 MESMVL 6742 NOESCA 5063 PDUMRD 0274 RCAPAS 0052 MFIE 6365 NOESEN 5104 PFNAM 1600 RCHAR 0023 MFL 6360 NOFINI 4412 PFNAM3 1633 RCHKT 0050 MFSK 6361 NOLOCA 5041 PFNAM7 1651 REC 0040 MIE 6365 NOSP 1231 PFNAM9 1655 RECSRV 2663 MLC 6362 NOSP1 1234 PFN10 1660 RECS10 2704 MMOVCN 6751 NOSP3 1244 PFN11 1661 RECS20 2706 MONMSG 2246 NOTFND 4442 PFN15 1662 RECS30 2712 MONTH 0011 NOTYET 0646 PLOAD 0303 RECS60 2715 MOVE 4520 NOWAIT 0705 PMR 6364 RECS80 2717 MOVE0 1341 NUMRC 3263 PORT 0000 RECS90 2726 MOVE1 1345 NUMRC1 3276 PORTCO 0036 REMBUF 3600 MOVE4 0062 NXTFIL 3462 PORTIN 0030 REMCHE 5653 MOVE5 1354 OCLOSE 0000 PORTOU 0031 REMCLE 5730 MOVE6 1355 OCTLZF 3762 PRETEM 1167 REMINE 5440 MOV8 4457 ODNAME 0073 PRGFLD 0000 REMINP 5400 MOV8P 4470 ODNUMB 0074 PRIPAK 2275 REMINS 0107 MPRESE 6367 ODT 0004 PRI8B 4514 REMOTE 0000 MPSCC 6366 OFF 0001 PRI8B0 4400 REMOUT 5600 MQ 0064 OFFLG 0072 PRI8B1 4405 REMPUT 5721 SYMBOLS PAL8-VB0 06-SEP-90 PAGE 181-3 REMREM 0110 RKSFIO 6401 SCRCRL 4651 SNDSV1 2434 REMRES 5535 RKSF0 6301 SCRFLI 4655 SNERTA 2467 REMTEM 5637 RKSF1 6341 SCRIBE 4600 SP 1213 REMTES 5626 RMAXL 0041 SCRLUP 4612 SPACAR 0416 REMTLS 5726 RMPTEM 5705 SCRPRL 4647 SPACK 4511 REMTSF 5724 RMPUT0 5725 SCRPRN 4625 SPACK0 0400 REMUPD 5637 RMPUT1 5727 SCRPTR 4712 SPRINT 0000 REMWAI 0105 RMPUT2 5731 SDERMS 4657 SPZAP 6642 REM8B 4515 RNPAD 0043 SEN 0041 SP1 1216 REM8B0 4411 ROUTIN 6612 SER1 2411 SP3 1226 REM8B1 4416 RPACK 4513 SER2 2417 SRCHLU 3345 REOL 0045 RPADC 0044 SER3 2424 SRCHTA 3340 REPADR 0233 RPERMS 4635 SER4 2430 SRVFIN 1555 REPLAC 0220 RQBIN 0047 SER5 2441 STACK 0131 REPLUP 0222 RQCTL 0046 SER6 2446 STATE 0032 RERRMS 4507 RRBUF 6062 SER7 2454 STATT 0101 RESET 0013 RRDTA 6066 SETBAU 0206 STBRK 0102 RETARG 0233 RREPT 0051 SETINI 4246 STDAT 0104 RETCNT 0005 RRLEN 6063 SHFEMS 4701 STEOF 0132 RETRY 0033 RRSEQ 6064 SLFLAG 2507 STEOT 0102 REVDAT 4464 RRTYP 6065 SLOOP 4076 STERR 0105 REVDGR 0400 RSBIOT 6413 SLOP01 4101 STFIL 0106 REVISI 0007 RSBUF 6222 SLOP05 4112 STGEN 0107 RFLNMS 4521 RSCREN 4603 SLOP10 4115 STNAK 0116 RHFEMS 4541 RSCRIB 4665 SLOP15 4120 STRIN 0122 RIDEMS 4564 RSDTA 6226 SLOP20 4127 STSIN 0123 RIERMS 4616 RSLEN 6223 SLOP25 4132 S00 2451 RIERTS 5136 RSSEQ 6224 SLOP35 4135 TABLEJ 0003 RINBUF 3400 RSTUFF 5614 SLOP90 4200 TADC 1200 RINCHE 5442 RSTYP 6225 SLOP92 4205 TEMP 0022 RINERR 0104 RTCF0 6312 SMFL 6360 TEMPTR 3631 RINGET 5502 RTCF1 6352 SNDEMS 4722 TENTRY 3471 RINGEX 5527 RTERMI 6221 SNDERR 2461 TESTCH 5157 RINGNO 5533 RTFL0 6310 SNDI00 4222 TESTKE 5033 RINGT0 5504 RTFL1 6350 SNDI02 4226 THIRD 3701 RINGT1 5506 RTIE0 6315 SNDI05 4231 THLPMS 2255 RINGT2 5507 RTIE1 6355 SNDI10 4234 TIMEOU 0664 RING2 5507 RTIME 0042 SNDI80 4241 TLSIOT 6046 RININI 6613 RTLSIO 6416 SNDNAK 2526 TRYDM1 6710 RININS 5552 RTLS0 6316 SNDP 1723 TRYDM2 6723 RINREA 5505 RTLS1 6356 SNDPRO 4034 TSFIOT 6041 RINREM 5553 RTRYC 0034 SNDP1 1733 TST612 6635 RINTEM 5554 RTSFIO 6411 SNDP10 4053 TTY 0004 RINTES 5503 RTSF0 6311 SNDP11 4056 UCADDR 0077 RINUPD 5445 RTSF1 6351 SNDP12 4061 UMSG 0000 RINWAI 0106 RWATCL 5532 SNDP15 4064 UPADDR 0100 RKCC0 6302 RWATSE 5531 SNDP2 1734 UPCPRT 6544 RKCC1 6342 R3L 7014 SNDP20 4064 UPERMS 4733 RKFL0 6300 SBOOT 7600 SNDP3 1735 UPONLY 0076 RKFL1 6340 SCANTP 1260 SNDP4 1744 UPPERC 0103 RKIE0 6305 SCAN1 0024 SNDP5 1741 UPRINT 6550 RKIE1 6345 SCAN2 0025 SNDP9 1747 UPSTAT 0723 RKRBIO 6406 SCNEL 1200 SNDP96 4212 UQWAIT 6447 RKRB0 6306 SCRCAS 4710 SNDP98 4217 USEP0 0211 RKRB1 6346 SCRCHA 4711 SNDSRV 2400 USER 0000 SYMBOLS PAL8-VB0 06-SEP-90 PAGE 181-4 USR 7700 USRENT 0200 USRFLD 0010 USRIN 0010 USRLOA 0000 VERSIO 0012 WASTIM 0672 WCON0 6362 WCON1 6366 WILDF 0066 WRIPAK 3277 WRITE 4000 W10 3306 W20 3321 W25 3324 W30 3330 W35 3331 W60 3334 W90 3336 W92 3337 XR0 0010 XR1 0011 YEAR 0132 YEARMS 2274 ERRORS DETECTED: 0 LINKS GENERATED: 0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 | Date: 7/11/92 15:00 EDT From: Charles Lasner (lasner@watsun.cc.columbia.edu) To: pdp8-lovers@ai.mit.edu Subj: Announcement of new Kermit-12 utilities Currently available at watsun.cc.columbia.edu via ftp in /pub/ftp/kermit/d/k12*.* are two new files: k12enc.pal and k12dec.pal. The new files have internal dates of 8-Jul-92. Several other documentation files with similar dates are also available. Anyone who last retrieved Kermit-12 files prior to Feb, 1992 should retrieve much of the current collection which has changed since then. These are the newly updated ENCODE and DECODE programs for moving around OS/8 binary files in a reliable manner. There is several new feature added to both: the ability to deal with "raw" image data sent as a single file, and also sent split into two files. Consider the following usage: .R ENCODE *BIGGY.EN<RXA1:/I=756 When the input specification is a device only AND the /I switch is given AND a non-zero equals parameter is given (and neither /1 nor /2 are given; see below), then the ENCODEd file is created containing the entire logical device for the length specified in the equals parameter. In the example, the length of an RX01 in OS/8 terms is used. Note that the device need not be an OS/8 "legal" structure, and there is no individual input file significence either. The user must set the length to whatever is appropriate. Too large a number could result in program abort due to handler-reported input error. The minimum length is 1; a zero-value is the same as leaving out the parameter. (This is a restriction of OS/8 itself.) Input data always starts at OS/8 logical record 0000. Note that the device must be definable within the scope of the selected OS/8 handler itself, since it is used for all input I/O using "raw" sequential calls. For example, an OS/8 bootable RX01 standard-format diskette would be acceptable for encoding here, while a WPS document disk would not be. The reason is that the handler does not access track zero (not a WPS issue) and also does all reads in 12-bit mode, while WPS documents are written in 8-bit mode, portions of which are lost when using a 12-bit mode handler. By using another (user-written) handler that supplies 8-bit transfers, the WPS document disk CAN be successfully transferred to ENCODE format intact. (Note: there are no current 8-bit mode handlers for RX02 and RX50, just RX01; this is a separate problem being addressed elsewhere.) Output DECODing is accomplished in a symmetrical manner: .R DECODE *RXA1:<BIGGY.EN/I=756 When used in this manner, the equals parameter need not be exact, but must be at least as large as the parameter used when encoding. A smaller value can be used to limit the transfer deliberately where appropriate. For example, using =7 will only transfer the first seven records of the ENCODEd file onto the target device. If the ENCODEd file contains a valid OS/8 device in complete image form, this amount will suffice to transfer only the directory to the target device. This effectively aborts the transfer, so the user can look at the directory with DIR, etc., to determine suitability of the larger transfer, etc. Warning: This usage writes over the output device starting at logical record 0000 (or higher; see below). The (possibly present) previous OS/8 structure will be destroyed. This is the intended function of this usage as the new data is meant to be moved to the beginning of an empty device. Image splitting: As pointed out by a user, if the only device available on a PDP-8 system is being used to acquire an image copy of the media, then this is likely to be impossible to carry out. This is the case in some systems whose only disk device is a pair of RX01, or RX02, or RX50 in the case of the DECmates. The reason is that the image of a device is likely to be larger (as an ENCODEd file) than the OS/8 capacity of the device itself! Since the repeat-compression of the encoding process isn't a reliable phenomena (it's data-dependent), it is likely that some disk-image files will be too large. Of course, if less than an entire device need be transferred, the equals parameter could be set to a shorter value where appropriate, but this prevents a complete transfer. (Alternatively, the data should be placed on a disk where the unused space has a repetitive pattern, such as that left after a format operation, or all zeroes, etc. This would allow the repeat-compression of the ENCODE process to reduce these areas to insignificent quantities in the ENCODEd file.) Of course, this still doesn't address the problem of sending an entire device, such as a fully-loaded diskette. To solve this problem, an additional option has been implemented to split the data into two nearly equal parts before encoding. Assuming the worst case of no repeat compression optimization, the ENCODEd image file representing half of the target disk data should fit on a bootable OS/8 disk. This disk would only contain the system head, the DECODE.SV program, and the ENCODEd data file. From this minimal system, the data can be written to another drive. Then the entire process can be repeated using a similar disk containing instead the second-half ENCODEd file. (There is no hope for a machine with only one disk!) Assuming our original RX01 example again: .R ENCODE *BIGGY1.EN<RXA1:/I/1=756 *BIGGY2.EN<RXA1:/I/2=756 This creates two image encoding files, each containing half of the device image. (In the case of an odd size, the second half is one longer than the first half.) Note that the size must be stated exactly so that the proper split occurs. .R DECODE *RXA1:<BIGGY1.EN/I/1=756 *RXA1:<BIGGY2.EN/I/2=756 This creates the disk image from the ENCODEd files. Note that the size must be stated exactly as it was when the original files were created so that both the length and position of the files (especially the second-half file) are correct. To aid in restoration of the disk, the (FILE statement within the ENCODEd file indicates that it is a block-image file, not an individual file with a file name. Additionally, the =xxxx value used to create the file is given to guide the decoding process. If the ENCODEd files are split files, then it is further indicated that the file is a first-half or second-half of an image file as necessary. As of this version (2.1), the ENCODE program also inserts a (REMARK indicating the program version and other useful information. Overall program operation for all other operations remains unchanged. As before, program documentation is contained in the source files. Except for the new image transfer features, the programs are totally compatible with their previous respective versions. (Note, the latest and previous versions are NOT compatible with the original "ancient" version which was "provisionally" released while the encoding format was still being formulated! Thus, there is one incompatible original version, and all following versions are compatible except for added features.) cjl ------------------------------ Date: 3/11/92 00:48 EST From: Charles Lasner (lasner@watsun.cc.columbia.edu) To: pdp8-lovers@ai.mit.edu Subj: Announcement of new Kermit-12 utilities Currently available at watsun.cc.columbia.edu via ftp in /pub/ftp/kermit/d/k12*.* are two new files: k12enc.pal and k12dec.pal. The new files have internal dates of 1-Mar-92. These are the newly updated ENCODE and DECODE programs for moving around OS/8 binary files. There is a new feature added to both, the ability to deal with "raw" image data. Consider the following usage: .R ENCODE *BIGGY.EN<RXA1:/I=756 When the input specification is a device only AND the /I switch is given AND a non-zero equals parameter is given, then the ENCODEd file is created containing the entire logical device for the length specified in the equals parameter. In the example, the length of an RX01 in OS/8 terms is used. Note that the device need not be an OS/8 "legal" structure, and there is no individual input file significence either. The user must set the length to whatever is appropriate. Too large a number could result in program abort due to handler-reported input error. The minimum length is 1; a zero-value is the same as leaving out the parameter. (This is a restriction of OS/8 itself.) Input data always starts at OS/8 logical record 0000. Note that the device must be definable within the scope of the selected OS/8 handler itself, since it is used for all input I/O using "raw" sequential calls. For example, an OS/8 bootable RX01 standard-format diskette would be acceptable for encoding here, while a WPS document disk would not be. The reason is that the handler does not access track zero (not a WPS issue) and also does all reads in 12-bit mode, while WPS documents are written in 8-bit mode, portions of which are lost when using a 12-bit mode handler. By using another (user-written) handler that supplies 8-bit transfers, the WPS document disk CAN be successfully transferred to ENCODE format intact. (Note: there are no current 8-bit mode handlers for RX02 and RX50, just RX01; this is a separate problem being addressed elsewhere.) Output DECODing is accomplished in a symmetrical manner: .R DECODE *RXA1:<BIGGY.EN/I=756 The equals parameter need not be exact, but must be at least as large as the parameter used when encoding. A smaller value can be used to limit the transfer deliberately where appropriate. For example, using =7 will only transfer the first seven records of the encoded file onto the target device. If the encoded file contains a valid OS/8 device in complete image form, this amount will suffice to transfer only the directory to the target device. This effectively aborts the transfer, so the user can look at the directory with DIR, etc., to determine suitability of the larger transfer, etc. Warning: This usage writes over the output device starting at logical record 0000. The (possibly present) previous OS/8 structure will be destroyed. This is the intended function of this usage as the new data is meant to be moved to the beginning of an empty device. Overall program operation for all other operations remains unchanged. As before, program documentation is contained in the source files. Except for the new image transfer feature, the programs are totally compatible with their previous respective versions. (Note, the latest and previous versions are NOT compatible with older versions!) There are no plans to upgrade the .BOO format encode and decode programs, since the .BOO format has no checksum protection. This is deemed a necessary feature in a complete device image transfer, due to the likelihood of a long file, etc. Since the maximum length of an OS/8 file is limited to 4088 records, the raw input will of necessity be limited to somewhat less than this size of records, depending on the efficiency of the run-length compression inherent in the data encoding. cjl ------------------------------ Date: 10/18/91 20:00 EDT From: Charles Lasner (lasner@watsun.cc.columbia.edu) To: pdp8-lovers@ai.mit.edu Subj: Announcement of additional KERMIT-12 utilities. While no changes have been made to the body of KERMIT-12 itself, several things have been changed/added. At the request of the KERMIT distribution service (KERMSRV) certain files have been slightly modified so they are acceptable to that bitnet, etc. facility. (Seems to be a problem with LRECL>80.) All files are now 80 or less. Except for the .DOC file, all it took was a little "cosmetic surgery" on a few lines. FTP'd copies are mostly unaffected. Most of the problems have to do with interpretation of the inter-page FF character being treated as the first character of the "record" in this non-stream-oriented system. At this time there is no actual doc file, as the file K12MIT.DOC is merely a truncation of the listing of K12MIT.PAL as passed through PAL8 and CREF. Anyone with a system big enough to support a 200K+ long source file can create this file themselves. In addition, due to certain quirks within PAL8 and CREF "beating" against unix line conventions, the file K12MIT.DOC at watsun.cc.columbia.edu was slightly different from the precise output of the assembly process, but again, only a cosmetic change. Since this file greatly exceeded the KERMSRV restriction, it has been withdrawn in favor of the source fragment equivalent to it taken directly from K12MIT.PAL. This source fragment is short enough that even an RX01-based OS/8 system can create the listing file from it thus recreating the original K12MIT.DOC locally. All this will disappear in the future when a "proper" doc file appears. In the meantime, K12MIT.DOC in whatever form it is available contains hardware hints and kinks, assembly options, and other info useful to users and anyone interested in the "innards" of the program, as well as an edit history of how K12MIT got to be where it is now starting from its "grandfather" K08MIT. It ends at the first line of the code in K12MIT.PAL, but includes all of the special purpose definitions particular to the various devices supported, such as DECmate I, DECmate II, etc. Any changes to customize KERMIT-12 are still accomplished using the separate patch file K12PCH.PAL which is unchanged. New files cover two areas: 1) direct loading without KERMIT-12, and 2) .BOO format support. 1) Many users have the hardware for running KERMIT-12, but don't already have it or another suitable program to acquire it yet, a real "catch-22" situation. Towards that end, a set of utilities has been provided to directly load KERMIT-12 without already having it. Most PDP-8 sites do have access to some other machine. Hopefully, the serial connection to be used is fairly "clean" and error-free, or at least some of the time. These programs depend on this fact. This could either be a connection to a remote multi-user system or something like a null-modem connection to a nearby IBM-PC. The programs assume only a few things: a) The connection is error free. b) The other end doesn't absolutely require anything be sent to it to send data to the PDP-8 end. (The -8 end will not send ^S/^Q or anything like that because this is unnecessary; all data goes only into PDP-8 memory directly.) c) The other end will send the data at a time controlled from its end, or after at most one character sent from the PDP-8 end of the link. The first situation is illustrated by the example of a PC connected to the -8. The -8 program is started, and it waits indefinitely after the -8 user presses any one key. (The corresponding character is sent to the PC where it is ignored.) The PC end is initiated with a command such as COPY K12FL0.IPL AUX: and the data goes to the -8. The second situation is illustrated by a remote system where a command such as TYPE K12FL0.IPL is available. The delimiting CR is not typed at this time, and will be finished later by the loading program. The initial connection up until the TYPE command is not covered by the loading program itself, so the user must supply a basic comm program, which is possible to accomplish in about 10 words or less if the rates are "favorable", or worst-case, a terminal can be used and the line switched over to the -8 at the appropriate time. In any case, CR or other appropriate character is hit on the -8 and the loading program echoes it down the line (and on the console) to initiate the data down-load. d) The other end is assumed to send the file verbatim without insertion of <del> characters (octal 177) and upper-case/lower-case is preserved. If all of these assumptions are met, then the down-load accomplishs a partial acquisition of K12MIT.SV, the primary binary file of KERMIT-12. The process must be repeated several times to acquire all portions. If a local compare utility is available that can compare absolute binary files, perhaps the process can be totally repeated to assure reliable results by comparing runs. The method used is borrowed from the field-service use of a medium-speed serial port reader on the -8 for diagnostic read-in. This reader is *almost* compatible with the device 01 reader such as the PC8E. The difference is that the *real* PC8E is fully asynchronous, whereas the portable reader just spews out the characters without any protocol. The PC8E can't drop any characters in theory, although there are reports of misadjusted readers that drop characters at certain crucial data rates. (The PC8E runs at full speed if possible, and failing this falls back to a much slower speed. All operations depend on the use of the hardware handshakes of the IOTs etc., so nothing should be lost but throughput. Misadjusted readers may drop characters when switching over to the slower mode.) The reason the field reader is acceptable is that it is used only to load diagnostics directly into memory using the RIM and BIN loaders. These minimal applications can't possibly fall behind the reader running at full speed. This is the same principle used here to down-load KERMIT-12. The loading program is a 46 word long program suitable to be toggled into ODT and saved as a small core-image program. The user starts the program and then (at the appropriate time) presses one key (usually CR if it matters) and the loader waits for remote input. As the other end sends the data, it is directly loaded into memory. There is a leader/trailer convention, just like paper-tape binary, so at end-of-load the program exits to OS/8 at 07600. At this time the user issues a SAVE command. This completes the down-load of a single field of K12MIT.SV. At the current time, there are actually two fields of K12MIT.SV, namely 00000-07577 and 10000-17577, and there are two such loaders. There is no check for proper field, so the proper loader must be used with the proper data, else the fields will get cross-loaded and will certainly fail. Once the two fields are obtained as separate .SV files (named FIELD0.SV and FIELD1.SV) they can be combined using ABSLDR.SV with the /I switch (image mode) set. The resultant can be saved as K12MIT.SV. This, if all went well, is identical in every way to the distributed K12MIT.SV (which is only distributed in encoded form; see below). Actual file differences will only exist in the extraneous portions of the file representing the header block past all useful information and the artifacts of loading which represent 07600-07777 and 17600-17777 which are not used. This is the normal case for any OS/8 system when any file is saved. Merely saving an image twice will cause this to happen. At this point, K12MIT.SV can be used as intended, namely to acquire, via KERMIT protocol, the entire release. It is recommended that the provisional copy of K12MIT.SV be abandoned as soon as the encoded copy is decoded since the encoding process provides some assurances of valid data (using checksumming, etc.). This process can be accomplished on any KL-style -8 interface including PT08, etc., or on the printer port of VT-78 and all DECmates. When used on the DECmates, there may be some minor problems associated with the down-load which may have to be done as the first use of the printer port after power-on, or some other restriction. The loader includes a suggested instruction for DECmate use if problematic (and raises the program length to 47 words). Also, due to observed bugs in the operating system (OS/278 only), there are restrictions on the use of ABSLDR.SV that cause certain command forms to fail while other seemingly equivalent forms succeed! This is documented in the latest K12MIT.BWR file in the distribution. The command form stated in the K12IPL.PAL file is the only known form that works correctly on these flawed systems. The format for down-load files is known as .IPL or Initial Program Load format. It consists of a leader containing only lower-case letters (code 141-177 only) followed by "printable" data in the range 041 (!) through 140 (`). Each of the characters represents six bits of data, to be read left to right as pairs, which load into PDP-8 12-bit memory. The implied loading address is always to start at 0000 of the implied field. The leader comment contains documentation of which field of data from K12MIT.SV it is. The trailer consists of one lower-case character followed by anything at all. This is why it is crucial that DEL (177) not appear anywhere in the body of the file. Throughout the file, all codes 040 or less are ignored. This allows for spaces in the lower-case leader for better readability, and for CR/LF throughout the entire file. CR/LF is added every 32 words (64 characters) to satisfy certain other systems' requirements. The trailer contains documentation on a suggested SAVE command for the particular data just obtained. 2) PDP-8 ENCODE format is the format of choice to obtain binary OS/8 image files because of the validation techniques employed, etc. This is the standard method of distributing K12MIT.SV as well as other "critical" files such as TECO macros and other image files. In the MS-DOS world there exists another very popular format known as .BOO encoding. It would be useful to support this format on the PDP-8 as well. .BOO format files are smaller because they use six-bit encoding instead of five-bit encoding, or at least in theory. Both ENCODE and .BOO use repeat compression techniques, but ENCODE can compress 12-bit words of any value, while .BOO only compresses zeroes and that itself is based on a byte-order view of the data. PDP-8 programs often include large regions of non-zero words such as 7402 (HLT) which would not compress when looked at as bytes. Such files would show compression ratios quite different from the norm. In any case, .BOO format is useful on the PDP-8 because it allows inter-change with .BOO files created on other systems, such as PCs. This allows the exchange of unusually formatted files, such as TECO macros between PDP-8s and PCs. (Both systems support a viable version of TECO.) The new KERMIT-12 utilities include a .BOO encoder and .BOO decoder, known as K12ENB.PAL (or ENBOO.PAL) and K12DEB.PAL (or DEBOO.PAL) respectively. They use .BOO encoded files unpacked in the standard OS/8 "3 for 2" order to preserve the original byte contents when the files originate from other systems. (Technically, .BOO format doesn't require this, but the obvious advantages dictate it. Anything encoded into .BOO format must merely have a 24-bit data structure encoded into four six-bit characters, so in theory any encoding of two adjacent PDP-8 12-bit words would be acceptable. By additionally supplying the bits in OS/8 pack/unpack order guarantees the inter-system compatibility as well.) There is an inherent weakness in the original .BOO format which must be addressed. .BOO format files always end on one of two data fields: either a repeat-zero compression field, or on a 24-bit field expressed as four characters. Should the data in a 24-bit field consist of only two or even one bytes, there are one or two extraneous null bytes encoded into the field to complete it. Presumably the need to add the extra bytes is to allow validation of the format. In any case, only the encoder knows just how many (0, 1, 2) bytes are extraneous. We can presume that if the last byte is non-zero, it is significant. If the last two are both zero, then the last or possibly both are extraneous with no way to tell. On PC systems, the general trend is to ignore these one or two extra bytes because so far there haven't been any complaints of failure. I have personally discovered that a widely used PC .BOO encoding program (written in C) erroneously adds two null bytes as a short compression field beyond the data! This is not a .BOO format issue, but rather a genuine program bug. Apparently few PC users are concerned that encoding their files prevents transparent delivery to the other end. In the OS/8 world, the situation is quite different. Each OS/8 record is 256 words or 384 bytes. If even a single byte is added, this creates an additional all-zeroes record. Besides wasting space, it is conceivable that such a file could be dangerous to use under OS/8 depending on content. (Certain files, such as .HN files are partially identified by their length. File damage, such as lengthening a file from two to three records will confuse the SET utility, etc.) Many files cannot be identified as having been artifically lengthened (and may be hard to shorten!), so this must be avoided. I have invented a fix for the problem: repeat compression fields are expressed as ~ followed by a count. 2 means two null bytes and is thus the smallest "useful" field to be found. (It takes two characters to express what would take 2-2/3 characters in encoded format. One null would only take 1-1/3 characters, not two, so this case is vestigial, but must be supported for the benefit of brain-dead encoders.) The value of 0 means a count of literally zero, thus ~0 is a "NOP" to a decoder. I have successfully tested MS-DOS programs written in BASIC and C that decode .BOO files successfully even if ~0 is appended to the end with no ill effects. (They correctly ignored the appended fields.) In my encoding scheme, ~0 at the end of a data field containing trailing zeroes means to "take back" a null byte. ~0~0 means to take back two null bytes. Thus files encoded with ENBOO.PAL either end in a repeat-compression field as before, or in a data encoding field possibly followed by ~0 or ~0~0 if necessary. The corresponding DEBOO.PAL correctly decodes such files perfectly. Should files encoded with ENBOO reach "foreign" systems, they will do what they always do, i.e., make files one or two bytes too long occasionally, with no other ill effects. Files originating from such systems will certainly be lacking any trailing correction fields and will cause DEBOO to perform as foolishly as MSBPCT. Extraneous null bytes will appear at the end of the file in OS/8 just as in MS-DOS in this case. (Note that if the file length is not a multiple of 384 bytes, additional bytes are added by DEBOO as well, but this is not a design weakness of .BOO format. It is caused by the clash of fixed record size and a variable size format.) Hopefully, files originating on OS/8 will be decoded on OS/8 as well, thus preserving file lengths. Most "foreign" files will probably be ASCII, so the ^Z convention will allow removal of trailing null bytes at either end. It is hoped that MS-DOS and other systems "upgrade" their .BOO format files to be compatible with the PDP-8 version. All KERMIT-12 files are available via the normal distribution "paths" of anonymous FTP and/or KERMSRV. The user is directed to the file /ftp/pub/kermit/d/k12mit.dsk as a "roadmap" to the entire distribution. Each .PAL file includes assembly instructions. Most use non-default option switches and non-default loading and saving instructions, so each must be carefully read. The development support files (TECO macro, .IPL generator, recent copies of PAL8, CREF, etc.) are included in the total collection. Development is not possible on RX01 systems due to inadequate disk space, but RX02's are barely adequate with a lot of disk exchanges. (Future versions may require larger disks for development.) Charles Lasner (lasner@watsun.cc.columbia.edu) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 | / KERMIT FOR DEC 12-BIT MACHINES / LAST EDIT: 06-SEP-1990 11:00:00 CJL XLIST OFF IFNDEF OFF <OFF= 1> /TURN LISTING OFF IFNDEF ON <ON= 0> /TURN LISTING ON XLIST ON; IFZERO 1 < *** **** *********** ********* *** *** *** *********** ***** **** *** **** *********** ********** **** **** *** *********** ***** ****** *** **** *** *** **** **** **** *** *** *** *** *** *** **** *** *** *** ***** ***** *** *** *** ** **** *** **** *** *** *** ***** ***** *** *** *** ** *** ******* *** *** **** ************ *** *** *** ** ****** ********** ********** *** **** *** *** *** ***** *** ** ******* ********** ********* *** **** *** *** *** ***** *** ** *** **** *** *** **** *** ** *** *** *** *** ** *** **** *** *** **** *** ** *** *** *** *** ** *** **** *** *** **** *** *** *** *** *** ** *** **** *********** *** **** *** *** *** *** *** ********* *** **** *********** *** **** *** *** *** *** *** ********* > XLIST ON / COPYRIGHT (C) 1989, 1990 BY THE TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF / NEW YORK. / PERMISSION IS GRANTED TO ANY INDIVIDUAL OR INSTITUTION TO COPY OR USE THIS / DOCUMENT AND THE PROGRAM(S) DESCRIBED IN IT, EXCEPT FOR EXPLICITLY COMMERCIAL / PURPOSES. / EDIT HISTORY. /014 CJL / 052 06-SEP-1990 BUG FIX. CHARLES LASNER (CJL) / SENDING A FILE WHICH EXACTLY FILLS THE LAST DATA PACKET AT THE / END OF THE FILE WILL CAUSE THE PACKET TO BE SENT TWICE. THE / ROUTINE DIDN'T CHECK FOR AN EMPTY OUTPUT BUFFER AT EOF. / 051 29-AUG-1990 BUG FIX. CJL / PDP-8/A NOT IDENTIFIED CORRECTLY IN CPUID ROUTINE. THE UPDATED / PC IS WHAT IS LOADED INTO THE AC WHEN 7016 IS EXECUTED ON THE / KK-8/A CPU. THE ROUTINE WAS CHECKING FOR THE NON-UPDATED VALUE. / ALSO NEW DOCUMENTATION FOR PRE-CLEARING MEMORY FOR BENEFIT OF / ENCODED BINARY FILES. / 050 06-SEP-1989 DECMATE I SUPPORT, ETC. CJL / THIS EDIT IMPLEMENTS DECMATE I SUPPORT USING THE DP278-A OR -B. / A NEW CONDITIONAL 'PORT' SELECTS WHICH PORT IS TO BE USED. IF / KERMIT-12 IS RUN ON DECMATE I (WHILE NOT CONFIGURED FOR SERIAL / PRINTER PORT COMMUNICATIONS; SEE EDIT 048.) THEN REMOTE / COMMUNICATIONS TAKES PLACE ON THE PORT SELECTED AT ASSEMBLY TIME / ('PORT=0' OR 'PORT=1'). ADDED BAUD RATE PARAMETER 'BRATE' TO / SELECT REMOTE COMMUNICATIONS BAUD RATE FROM THE STANDARD TABLE; / DEFAULTS TO 1200 BAUD ('BRATE=7'). / 049 30-AUG-1989 REMOTE FLOW CONTROL, ETC. CJL / THIS EDIT IMPLEMENTS FLOW CONTROL SUPPORT (IF FLOW CONTROL IS / ENABLED) FOR THE REMOTE LINE WHILE SENDING PACKETS TO THE REMOTE / KERMIT REGARDLESS OF STATE. PREVIOUSLY, FLOW CONTROL ONLY / APPLIED TO CONNECT MODE. LOCAL FLOW CONTROL (TOWARDS THE REMOTE / KERMIT) IS UNNECESSARY AS LOCAL BUFFERS FOR REMOTE INPUT ARE / ALWAYS AVAILABLE. CERTAIN ROUTINE CHANGES MADE FOR BENEFIT OF / DECMATE I SUPPORT IN A SUBSEQUENT EDIT. / 048 24-AUG-1989 DECMATE II, ETC. SUPPORT. CJL / ONCE-ONLY CODE ADDED TO IMPLEMENT DECMATE II, ETC. REMOTE LINE / SUPPORT ON SERIAL COMMUNICATIONS PORT. SELECTED PORT IS / INDICATED ON OPENING BANNER IF OPERATING ON DECMATE. / THIS EDIT PROVIDES BASIC SUPPORT OF THE DECMATE II COMMUNICATIONS PORT AS AN / AUTOMATIC FEATURE OF THE STANDARD RELEASE OF K12MIT. AUTOMATIC DETECTION OF / DECMATE II, ETC. HARDWARE IS PERFORMED UNLESS THE PDP-8-TYPE REMOTE LINE / SUPPORT IS ASSEMBLED FOR THE SERIAL PRINTER AS THE REMOTE LINE ('SPRINT' IS / SET OR EQUIVALENT). / THIS EDIT INCORPORATES ALL OF THE INFORMATION TAKEN FROM VARIOUS SOURCES / REGARDING DECMATE PORT INITIALIZATION, ETC. EVERY ATTEMPT HAS BEEN MADE TO / COMPLETELY SET ALL APPROPRIATE REGISTERS, ETC. FOR DECMATE II, III, III+ / OPERATION. NO SUPPORT EXISTS FOR THE DECMATE III BUILT-IN MODEM OPTION, AS / EXPLICIT DOCUMENTATION IS NOT AVAILABLE (SOME OF THE INITIALIZATION CODE IS / APPARENTLY USED TO DISABLE THE MODEM). THESE ROUTINES ARE ONLY KNOWN TO WORK / ON THE DECMATE II, AS THE III (ESPECIALLY WITH OPTIONAL MODEM) AND THE III+ / HAVEN'T BEEN AVAILABLE TO THE AUTHOR FOR TESTING. THE INITIALIZATION CODE / WILL BE UPDATED LATER TO INCLUDE PANEL REQUESTS, ETC. TO CORRECT ANY / PROBLEMS, ETC. DECMATE-SPECIFIC FEATURES (SUCH AS SETUP COMMANDS) WILL BE / ADDED LATER AND ENABLED FROM THESE ROUTINES. / THIS EDIT INCORPORATES NON-INTERRUPT ROUTINES WHICH HAVE BEEN TESTED AT THE / MAXIMUM COMMUNICATIONS SPEED OF THE DECMATE II (19200 BAUD). THEY WILL / SUFFICE FOR ALL KERMIT IMPROVEMENTS SHORT OF SLIDING WINDOWS AT WHICH TIME / INTERRUPT-DRIVEN I/O WILL BE REQUIRED. (INTERRUPT-DRIVEN I/O IS ILLEGAL ON / CERTAIN OS/8 SYSTEMS WHERE INTERRUPTS ARE HARMFUL TO THE SYSTEM OR NON-SYSTEM / HANDLERS.) / 047 21-AUG-1989 CODE CLEANUP. CJL / STREAM-LINED CONNECT MODE ROUTINES FOR MINIMUM USE OF IOTS. THIS / IS IN PREPARATION FOR EVENTUAL DECMATE II OPERATION, AND TO / MINIMIZE K12PCH PATCH FILE SIZE. CERTAIN NON-CONNECT ROUTINES / MOVED TO FACILIATE CONNECT ROUTINE REORGANIZATION. / 046 15-AUG-1989 CODE CLEANUP. CJL / ADDED NEW (NON-CONNECT) MODE COMMUNICATIONS ROUTINES FOR EVENTUAL / DECMATE USE. ELIMINATION OF 'IREM' AND 'IREMW' ROUTINES IN FAVOR / OF 'COMIN'. ELIMINATION OF 'OREM' IN FAVOR OF 'COMOUT'. ADDED / STATUS UPDATE ROUTINE ('UPSTATUS') FOR EVENTUAL DECMATE II, ETC. / USAGE. ELIMINATED PDP-8, DECMATE I, DECMATE II CONDITIONALS. / REORGANIZED SERIAL LINE CONDITIONALS AND ADDED NEW 'SPRINT' / PARAMETER FOR SERIAL PRINTER PORT USAGE AS COMMUNICATIONS PORT. / ADDED ONCE-ONLY CODE ADDED TO AUTOMATICALLY RECOGNIZE DECMATE I / AND II OPERATION UNLESS ASSEMBLED FOR REMOTE COMMUNICATIONS ON / SERIAL PRINTER PORT ('SPRINT' SET). UPDATED K12PCH.PAL TO / CORRESPOND TO NEW DEFINITIONS. DEFINED EVENTUALLY NEEDED / COMMUNICATIONS PORT INSTRUCTIONS FOR DECMATE II; ACTUAL DECMATE / II OPERATION WILL BE DEFINED IN A SUBSEQUENT EDIT. DOCUMENTED / NEW LOADING AND SAVING INSTRUCTIONS FOR K12MIT TO ALLOW FOR / ONCE-ONLY CODE IN 10000-11777 WITHOUT SWAPPING THE CODE OUT FOR / THE USR. THIS ELIMINATES OVERHEAD WHEN LOADING K12MIT, BUT IS / DIFFERENT FROM THE FORMER INSTRUCTIONS WHICH ASSUMED NO OTHER / USAGE OF 10000-11777 OTHER THAN THE (LOCKED-IN) USR. / THIS EDIT PROVIDES THE FRAMEWORK FOR AUTOMATIC DETECTION OF PROGRAM EXECUTION / OF K12MIT ON ANY MEMBER OF THE DECMATE FAMILY (I, II, III, III+). WHEN / 6120-TYPE CPU DETECTION OCCURS, THE DECMATE I OR II-TYPE COMMUNICATIONS PORT / INITIALIZE CODE IS AUTOMATICALLY SELECTED AS NECESSARY UNLESS THE PDP-8-TYPE / ROUTINES ARE ASSEMBLED (WITH 'SPRINT' SET OR EQUIVALENT USER SETTINGS, ETC.) / FOR THE VT-78-TYPE PRINTER PORT (32/33), IN WHICH CASE THE COMMUNICATIONS IS / DONE VIA THE PRINTER PORT ON THE DECMATE (WHICH IS ALMOST PDP-8 COMPATIBLE AND / IS ACCOMODATED AS SUCH). / SUBSEQUENT EDITS SHOULD PROVIDE FOR A DECMATE I PARAMETER TO CONTROL THE PORT / SELECTION, AS THERE ARE AT LEAST TWO VARIANT OPTIONS BOARDS (DP-278A AND / DP-278B) EACH CONSISTING OF TWO PORTS. / 045 12-AUG-1989 BUG FIX. CJL / FINISH, GET, AND RECEIVE COMMANDS FAIL TO ABORT PROPERLY / (ESPECIALLY AFTER THE SEND COMMAND HAS BEEN USED), AS THE CURRENT / OPERATING MODE ('KMODE') IS NEVER PROPERLY SET, OR IS SET AFTER / SEVERAL PACKETS HAVE BEEN SENT. EACH COMMAND NOW SETS ITS OWN / OPERATING MODE BEFORE INITIATING ANY PACKETS. / 044 11-AUG-1989 CODE CLEANUP. CJL / CHANGED 'CCMSG' TO 'ABMSG' WITH CLEARER MESSAGE. CHANGED / 'CCFLAG' TO 'ABFLAG' FOR CONSISTENCY. CHANGED ABORT CHARACTER / FROM <^C> TO CHOICE OF <^X> OR <^Z> FOR CONSISTENCY. ELIMINATED / 'ITTY' AND 'ITTYW' ROUTINES BY USING 'CTLCTST' AND 'INPUT' / ROUTINES ALREADY AVAILABLE A/O EDIT 043. ELIMINATED 'TCHAR' IN / FAVOR OF 'INCHAR' AVAILABLE A/O EDIT 043. / 043 07-AUG-1989 CODE CLEANUP, ETC. CJL / REWRITE OF CONSOLE SUPPORT ROUTINES INCLUDING FORCED-ECHO OUTPUT / AND COLUMN COUNT FOR <HT> SIMULATION IN PREPARATION FOR IMPENDING / USER-INTERFACE REWRITE. 'SCRIBE', 'LININP', AND 'ESCPRNT' / ROUTINES NOW CALL "P7ECHO" ROUTINE TO ENSURE PRINTING OF CRUCIAL / MESSAGES. / 042 13-JUN-1989 CODE CLEANUP. CJL / FIXED VARIOUS NAK-RELATED BUGS AND SEND-INIT PROBLEMS AS IN K278 / (SOME OF THE K278 STUFF IS DEFICIENT!). CALCULATION OF PROPER / SEQUENCE NUMBER FOR NAK CORRECTED OVER FORMER (K08MIT AND K278) / VERSIONS. ADDED ERROR MESSAGE FOR FULL-DISK PROBLEM. / 041 12-MAY-1989 BUG FIX. CJL / VARIOUS VERSIONS (DECMATE) WON'T FUNCTION REMOTELY WHILE KL-8 / VERSIONS WORK FINE. ADDED REMOTE LINE READ IOT TO INITIALIZE / REMOTE LINE AT STARTUP TIME FOR VERSIONS REQUIRING THIS. / CORRESPONDING CHANGES IN PATCH FILE MADE FOR REMOTE LINE READ IOT / IN TWO PLACES. / 040 07-MAR-1989 COSMETIC CLEANUP. CJL / CLEANUP OF EDIT HISTORY AND OTHER COMMENTS. / 039 21-MAY-1988 CODE CLEANUP. CJL / ADDED VARIABLE 'INIECHO' TO ALLOW DEFAULT CONNECT-MODE STATE TO / BE HALF-DUPLEX ("SET LOCAL-ECHO ON"). MODIFIED INPUT SERVICE / ERROR ADDRESSES TO SIMPLIFY ERROR TABLES. / 038 19-MAY-1988 CODE CLEANUP. CJL / ELIMINATED TRAILER FILES DURING ASSEMBLY BY CREATING VARIABLES / 'GENMSG' AND 'UMSG.' THIS ALLOWS THE HEADER FILE (PARAM.PA) TO / CONTAIN THE LOCAL MESSAGE TEXT WITHOUT SUBSEQUENT OVERLAY (WHICH / WAS WHY THERE FORMERLY WAS A TRAILER FILE CAPABILITY). OVERLAY / BY K12PCH.BN WILL DEFAULT TO CREATION OF A DUMMY USER MESSAGE / (WITHIN K12PCH) ENCOURAGING LOCAL CUSTOMIZATION. K12MIT.BN WILL / CONTAIN A NULL MESSAGE BY DEFAULT UNLESS CUSTOMIZED IN PARAM.PA. / 037 21-JAN-1988 BUG FIX. CJL / RESET OS/8 DEVICE CONTROL WORD TABLE TO DELETE TENTATIVE FILE IN / CASE OF PRIOR INPUT SERVICE ERROR. / 036 20-JAN-1988 BUG FIX. CJL / RESET 'OFFLG' WHEN DOING INPUT SERVICE IN CASE PRIOR ERRORS LEAVE / THE FLAG SET. / 035 14-JAN-1988 USR RESIDENT CODING. CJL / CALLS TO USR NOW USE 10200 INSTEAD OF 17700. NO SWAP OVERHEAD / WHEN OPENING OR CLOSING FILES. / 034 13-JAN-1988 CODE CLEANUP. CJL / ALL EIGHT-BIT ORIENTED CONSOLE CODE ELIMINATED; NOW IGNORES / PARITY (JUST SEVEN BITS). / 033 12-JAN-1988 CODE CLEANUP. CJL / 'TTYOUT' AND 'OTTY' ROUTINES ELIMINATED; NOW USES 'P7CH' FOR ALL / CONSOLE OUTPUT (EXCEPT FOR CONNECT MODE). / 032 12-JAN-1988 CODE CLEANUP. CJL / VARIOUS ROUTINES REWRITTEN TO ELIMINATE DEPENDENCIES ON CPU TYPE / BEYOND THE CLASSIC PDP-8. / 031 11-JAN-1988 CODE CLEANUP. CJL / ELIMINATED 'RTDISP' AND CHANGED CALLING CONVENTION FOR DISPATCH / ROUTINE. ALL CALLERS NOW LOCAL OR VIA LOCAL POINTERS. ADDED / SEVERAL CONDITIONAL PARAMETERS AND LABELS FOR BENEFIT OF / K12PCH.PAL. / 030 05-JAN-1988 CODE CLEANUP. CJL / CHANGED LOWER/UPPER CASE CONDITIONAL ASSEMBLY PARAMETERS AND MORE / EFFICIENT CODE. / 029 21-DEC-1987 CODE CLEANUP. CJL / CHANGED CALLING CONVENTIONS FOR 'SCRIBE' AND SIMILAR ROUTINES AND / REWROTE 'COMMAND' ROUTINE. / 028 15-DEC-1987 CODE CLEANUP. CJL / COMPLETE REWRITE OF FILE LOOKUP ROUTINE. 'LUKUP' NOW USES FIELD / ONE BUFFER AND ITS OWN AUTO-INDEX REGISTER CONSERVING PROGRAM / SPACE. / 027 05-DEC-1987 CODE CLEANUP. CJL / CHANGED DISPATCH ('DISPA0') ROUTINE TO USE 'SRCHTABLE' ROUTINE. / ALL CALLS MADE COMPATIBLE. ELIMINATED 'SCANC' CODE. ELIMINATED / CODE WITHIN 'DPARS' ROUTINE. 'LUKUP' ROUTINE NOW DOES ITS OWN / DISK I/O. ELIMINATED 'BLKIN' ROUTINE. / 026 27-NOV-1987 NEW CONNECT MODE CODE. CJL / TOTAL REWRITE OF ALL CONNECT MODE CONSOLE AND REMOTE INPUT AND / OUTPUT TERMINAL ROUTINES. CONNECT IS NOW FULLY BUFFERED IN ALL / DIRECTIONS. IF FLOW CONTROL IS OBEYED, ANY BAUD RATE CAN BE / ACCOMODATED BOTH LOCALLY AND REMOTE (UP TO 9600 BAUD TESTED, / SHOULD WORK TO AT LEAST 19200 BAUD BY INSPECTION). TESTED WITH / FAST VT-100 EMULATOR CONSOLE TO PROVE ESCAPE SEQUENCES ARE NOT / DROPPED WHEN LOCAL TERMINAL IS FASTER THAN REMOTE LINE. LIMITED / USE OF SUBROUTINES TO IMPROVE HIGH BAUD RATE OPERATION. ADDED / TABLE-DRIVEN ERROR EXIT ROUTINE FOR SEND ROUTINES. / THIS EDIT PROVIDES FULLY BUFFERED INPUT/OUTPUT ROUTINES FOR BOTH LOCAL AND / REMOTE PORTS. NO INTERRUPTS ARE USED FOR MAXIMUM COMPATIBILITY WITH OS/8 / DEVICES (SOME OF WHICH ARE INTOLERANT OF INTERRUPTS, SUCH AS TD-8/E). REMOTE / FLOW CONTROL (IF ENABLED) WILL SIGNAL BUFFER FILLING VIA <DC3> WHEN THE BUFFER / IS 3/4 FULL. WHEN THE BUFFER REACHES 1/4 FULL, THE REMOTE WILL BE SENT <DC1> / TO ALLOW FURTHER OUTPUT. REMOTE FLOW CONTROL IS SUPPORTED IN BOTH DIRECTIONS; / LOCAL FLOW CONTROL IS FROM THE KEYBOARD ONLY. / WHILE THE CONSOLE OUTPUT IS PAUSED BY <DC3>, THE BUFFER WILL FILL WITH OUTPUT / CHARACTERS. WHEN THE USER RELEASES THE CONSOLE WITH <DC1>, THE BUFFER WILL / RAPIDLY EMPTY (ASSUMING THE CONSOLE IS FASTER THAN THE REMOTE LINE). THIS / ALLOWS THE USER TO PAUSE THE CONSOLE WITHOUT BACKING UP THE REMOTE LINE UP TO / THE LIMITS OF BOTH LOCAL OUTPUT AND REMOTE INPUT BUFFERS. / 025 24-NOV-1987 NEW FEATURES AND CODE CLEANUP. CJL / PROPER INTERRUPT SETUP FOR <^C> AND <^P>, ECHO STATE. ALL / MESSAGES IN NEW FORMAT, (SOME NEW ONES HAVE BETTER CONTENT). / ELIMINATED 'PRI6B' AND 'REM6B' ROUTINES. NEW AND IMPROVED INPUT / SERVICE ERROR CODE MOVED TO PROPER PAGE. REWROTE CONNECT / ROUTINES TO ALLOW NON-INTERRUPT BUFFERED I/O LATER. CREATED NEW / VARIABLE 'ESCHAR' AND PARAMETER 'ESCAPE' TO SET DEFAULT ESCAPE / CHARACTER. ESCAPE CHARACTER CAN BE CHANGED IN MEMORY AND WILL BE / USED CORRECTLY BY ALL ROUTINES. ADDED 'ESCPRNT' ROUTINE TO / HANDLE ALL CASES (INCLUDING NON-CONTROL CHARACTERS). DEFAULT / ESCAPE PARAMETER VALUE COMPATIBLE WITH K08V2, BUT IS A USER / PARAMETER, CONFIGURED AS OTHER PARAMETERS DEFINED IN EDIT 017. / CREATED ESCAPE FUNCTION TABLE FOR EXPANSION LATER. NOW SUPPORTS / ESCAPE C(LOSE) IN UPPER OR LOWER CASE, ESCAPE ESCAPE (SEND ONE / ESCAPE CHARACTER). ALL BAD ESCAPE COMMANDS WILL ISSUE <BEL> / CHARACTER TO WARN USER THAT COMMAND IS ILLEGAL AND OTHERWISE WAS / IGNORED. CREATED NEW VARIABLE 'ECHOFLAG' TO ALLOW LOCAL ECHO IN / CONNECT MODE. / 024 19-NOV-1987 NEW FEATURES. CJL / NEW STARTUP MESSAGES AND HELP METHOD VIA COMMAND. CPU TYPE / IDENTIFICATION TO ALLOW FUTURE VERSIONS TO CHECK FOR QUIRKS AND / MODEL DEPENDENCIES. THE DEFAULT PROMPT REFLECTS THE ACTUAL CPU / TYPE (THUS "KERMIT-12>" ON PDP-12). VERSION, REVISION, AND DATE / NOW EQUATED SYMBOLS. / 023 18-NOV-1987 NEW CONSOLE I/O PACKAGE. CJL / NEW CONSOLE I/O ROUTINES WITH DC1/DC3 SUPPORT FOR CONSOLE / TERMINAL MESSAGES NOT ASSOCIATED WITH ANY REMOTE ACTIVITY (NOT TO / BE USED DURING CONNECT MODE). USES FIELD ONE FOR MESSAGE TEXT TO / ALLOW FOR MORE PROGRAM SPACE. THE MESSAGES ARE NOW GIVEN IN / UPPER/LOWER SIXBIT FORMAT. SUPPORT FOR <^P> RESTART AND <^O> TO / FLIP ECHO. UPPER-CASE CAN BE FORCED BY CHANGING A VARIABLE / ('UPONLY'). / 022 17-NOV-1987 BUG FIX. CJL / EXTRA-LONG INIT PACKETS CORRUPTING PROGRAM; NOW CHECKS FOR AND / IGNORES EXTRA CAPABILITIES BEYOND 'CAPAS' BYTE. / 021 17-NOV-1987 CODE CLEANUP. CJL / REWROTE TENTATIVE OUTPUT FILE LENGTH CODE FOR MORE CONSISTENCY. / RENAMED "FINISH" COMMAND CORRECTLY (FORMERLY "BYE"). / FORMER CODE REGARDING THE TENTATIVE FILE MAXIMUM LENGTH WAS ACCEPTABLY / ORGANIZED FOR ORIGINAL PS/8, OS/8 CONVENTIONS. WITH THE EVOLUTION OF THE / OPERATING SYSTEM INTO OS/78 (VERSIONS 1-4) AND OS/278 (VERSIONS 1-2), THE / ENTER OPERATION HAS BEEN CHANGED WITH DANGEROUS CONSEQUENCES. / THE ORIGINAL DEFINITION OF THE LENGTH RETURNED BY ENTER IS THE ACTUAL LENGTH / OF THE LARGEST EMPTY (IN TWO'S COMPLEMENT FORM). IF RECORD 7777 IS PART OF / THE ACTUAL LARGEST EMPTY (FULL SIZE DEVICE AND THE LARGEST EMPTY IS LAST ON / THE DEVICE), THEN THE LENGTH RETURNED IS ONE LESS (THIS IS A LONG STANDING / BUG). SINCE THERE IS NO STRAIGHT-FORWARD WAY TO DETERMINE THIS, THE LENGTH IS / ASSUMED TO BE CORRECT. / TESTS WITH THE DECUS VERSION OF OS/278 (DM-101) REVEAL A DANGEROUS CHANGE: / THE LENGTH RETURNED IS TWO LARGER THAN ACTUALLY EXISTS! / TO COUNTERACT THIS, EDIT 010 INSERTED A DECREMENT OF TWO INTO THE LENGTH / BEFORE PASSING IT BACK TO THE KERMIT FILE WRITING ROUTINE. THE FILE WRITING / ROUTINE THEN ADDS ONE TO THE LENGTH TO CREATE A "DANGER COUNT", I.E., IN TWO'S / COMPLEMENT NOTATION, THIS IS THE AMOUNT THAT WILL INDICATE FILE OVERFLOW / SHOULD IT REACH ZERO. / THIS HAS NOW BEEN REORGANIZED TO ALLOW THE ENTER ROUTINE TO SET THE DANGER / COUNT DIRECTLY. OS/8 USERS MUST ALLOW FOR THE EXTRA ROOM (WHICH MUST BE / PRESENT BUT WILL NOT BE USED), SINCE NO CHECK FOR SYSTEM VERSION WILL BE / PERFORMED. / 020 16-NOV-1987 NEW ROUTINES AND CODE CLEANUP. CJL / REWROTE ENTIRE OUTPUT FILE PACK ROUTINE. NOW SUPPORTS / ASCII/BINARY INTERNAL FILE MODE FOR LATER USE. USES OUTPUT / BUFFER IN FIELD ONE (SAME DEFINITIONS AS INPUT BUFFER) TO ALLOW / MORE PROGRAM SPACE. END OF FILE CONVENTION IN ASCII MODE NOW / INCLUDES ENSURING <^Z> CHARACTER PACKED INTO FILE (OR NOT). / REWROTE ENTIRE OUTPUT FILE CLOSE ROUTINE TO IMPLEMENT <^Z> / SCHEME. ELIMINATED SEPARATE OUTPUT FILE INITIALIZE ROUTINE; USE / SPECIAL ROUTINE CALL INSTEAD. FIXED PACKET WRITE BUG. / 019 15-NOV-1987 NEW ROUTINES AND CODE CLEANUP. CJL / FIXED UNPACK <^Z> BUG. REWROTE ENTIRE INPUT FILE UNPACK ROUTINE. / NOW SUPPORTS ASCII/BINARY INTERNAL FILE MODE FOR LATER USE. USES / INPUT BUFFER IN FIELD ONE TO ALLOW MORE PROGRAM SPACE. BUFFER / FIELD DEFINED VIA SYMBOLS TO ALLOW CHANGES IN THE FUTURE. END OF / FILE CONVENTION IN ASCII MODE NOW INCLUDES SENDING <^Z> CHARACTER / OR NOT. ELIMINATED SEPARATE INPUT FILE INITIALIZE ROUTINE; USE / SPECIAL ROUTINE CALL INSTEAD. / 018 09-NOV-1987 BUG FIX AND CODE CLEANUP. CJL / FIXED RECEIVE BUG; NOW ALLOW DEV: ON RECEIVE. / 017 05-NOV-1987 NEW FEATURES. CJL / CONDITIONAL ASSEMBLY PARAMETERS ADDED FOR MACHINE TYPE (PDP-8, / DECMATE I, DECMATE II/III/III+), REMOTE LINE AND LOCAL TERMINAL / INTERFACE DEFINITIONS. / 016 05-NOV-1987 CODE CLEANUP. CJL / OPTIMIZATION OF CODE, LITERALS, CONSTANTS. / 015 04-NOV-1987 BUG FIX. CJL / INPUT SERVICE ROUTINE ERROR DOES JMP INSTEAD OF JMS WHEN CALLING / COMMON ERROR HANDLER. / 014 02-NOV-1987 SOURCE FILE CLEANUP. CJL / SOURCE FILE COSMETICALLY CLEANED UP AND RENAMED TO K12MIT.PAL / WHICH CONFORMS WITH CUCCA NAMING CONVENTION. NO ACTUAL BINARY / CODE CHANGES BEYOND K08V2. THIS EDIT HISTORY ADDED. ENTRIES / PRIOR TO 014 TRANSCRIBED BY CJL. / SINCE THE PDP-12 (AND OTHER 12-BIT DEC MACHINES) IS THE INTENDED ENVIRONMENT / FOR THIS PROGRAM, IT IS NOW KNOWN AS KERMIT-12. / ASSEMBLING THE SOURCE FILE PRODUCES BINARY IDENTICAL TO K08V2.PA CONFIRMING / THAT SOURCE CLEANUP DOESN'T DAMAGE THE CODING (K08V2 IS NOW OBSOLETE). / 013 01-OCT-1987 CHANGE TO VERSION 2.0. R. SCHLERF (RICH) / CHANGED 'RKIOT'/'RTIOT' TO 43/44 REMOTE LINE IOT (LOCAL / PREFERENCE). CHANGED 'ESCAPE' CHARACTER TO ^] ('CONX1') FOR / GENERIC CONFORMITY. ADDED VERSION/COMMAND BANNER AT STARTUP FOR / MINI-HELP. INCORPORATED K278 CHANGES 003-006, 009-010 (NO / INTERRUPTS). DELETED 'ERRMSG.' NOW USES 'STXERR' AT 'CLOOP9'+2 / FOR PROGRAM SPACE. TO CONFORM TO GENERIC KERMIT, "BACK ON PDP8" / MESSAGE DELETED AND REPLACED WITH BEEP <^G>. MESSAGE "SENDING / FILE XXXXXX.XX CREATED ON DD-MM-YY" REDUCED TO "SENDING FILE / XXXXXX.XX" TO CONFORM TO GENERIC KERMIT. PARITY BIT IS IGNORED / ON BOTH REMOTE AND TTY LINES. OUTPUT PARITY IS SET TO SPACE. / PROGRAM RENAMED TO K08V2.PA AND MADE AVAILABLE TO CUCCA BY: / RICHARD SCHLERF (RICH) / AMERICAN CYANAMID COMPANY / MEDICAL RESEARCH DIVISION / LEDERLE LABORATORIES / BUILDING 190 ROOM 115H / PEARL RIVER, NEW YORK 10965 / (914) 732-2186 (09:00 TO 16:00) / SINCE PRIMARY APPLICATION OF K08V2 IS FOR PDP-8 USAGE, THE MODIFICATIONS NOT / SPECIFIC TO DECMATE II/III FROM K278 WERE MOVED TO THE K08MIT VERSION. FUTURE / VERSIONS WILL INCORPORATE THE DECMATE FEATURES AND THUS OBSOLETE ALL OTHER / VERSIONS AT THAT TIME. / 012 04-JUN-1986 PROGRAM FIX. SEPP STADELMANN (SSTA) / RE-INITIALIZE VIA 'V30ST' AS ROM SETUP CLEARS COMPOSETABLE, ETC. / 04-JUN-1986 VERSION RELEASED TO CUCCA BY MARTYN HEMMINGS (DEC GERMANY) AND / SEPP STADELMANN (DEC SWITZERLAND) OF: / DIGITAL EQUIPMENT CORPORATION (DEC) / 146 MAIN STREET / MAYNARD, MASS 01754 / (617) 897-5111 / CUCCA RENAMED FILES (KERMIT.PA AND KERCOM.PA) TO K278.PA AND K278COM.PA (WHICH / DOESN'T REALLY CONFORM TO THE NAMING CONVENTION). / CUCCA VERSION OF K278.PA FOUND TO BE DEFECTIVE. FILE REPAIRED BY: / CHARLES LASNER (CJL) / CLA SYSTEMS / 72-55 METROPOLITAN AVENUE / MIDDLE VILLAGE, NEW YORK 11379-2107 / (718) 894-6499 / REPAIRED FILE (K278.PA) NOW AVAILABLE AT CUCCA. / PROGRAM IS NOW THE DECMATE II/III (III-PLUS) KERMIT ONLY. HOOKS WERE LEFT IN / FOR PDP-8 VERSION, BUT NOT IMPLEMENTED. K278 DOES WORK WITH ADDITIONAL / IMPLEMENTATIONS OF KERMIT, BUT RECEIVE COMMAND DOES NOT WORK. PROGRAM YIELDS / RECOVERABLE SYSTEM ERROR/HALT WHEN EXITING TO FLOPPY-BASED DECMATE II SYSTEM. / CONNECT MODE IS VT200 8-BIT WHICH CONFUSES EVEN/ODD PARITY SYSTEMS. K278 DOES / NOT SUPPORT SETUP KEY OF DECMATE, BUT IMPLEMENTS SETUP COMMAND. / 011 04-JUN-1986 NEW FEATURES. SSTA / 'PRQ3' CODE CONDITIONALS. ROM SETUP COMMAND IMPLEMENTED FOR DMII/III. / AUTOMATIC UPPERCASE SELECT ON RETURN FROM CONNECT. / 010 13-MAR-1986 BUG FIX. MARTYN HEMMINGS (MART) / FULL DISK HANDLED WELL. / 009 13-MAR-1986 BUG FIX. MART / CLEAN UP BREAK AND GET. / 008 12-MAR-1986 BUG FIX. MART / CLEAR INPUT CHARACTERS FROM COMMUNICATIONS PORT WHEN IN IDLE / LOOP. / 007 11-MAR-1986 NEW FEATURES AND BUG FIX. MARTYN HEMMINGS AND / SSEP STADELMANN / (MART+SSTA) / INTERRUPT DRIVEN AND BUG FIX. / 006 10-MAR-1986 NEW FEATURE. MART+SSTA / DEVICE PARSE ON GET. / 005 10-MAR-1986 BUG FIX. MART+SSTA / NO DATE IN FILE WITH <^Z> INTACT. / 004 10-MAR-1986 NEW FEATURES AND BUG FIX. MART+SSTA / MAXIMUM RECEIVE BUFFER FIXUP ('RTERMI'), 15 SECOND TIME-OUT / DURING CONNECT. / 003 10-MAR-1986 BUG FIX. SSTA / TWO PAGE HANDLER FIX. / K08MIT.PAL COPIED TO DEC ENGINEERING NETWORK (NODE LSMVAX::) ULTIMATELY TO / EUROPE (NODE VIRGIN::) WHERE PROGRAM BECAME KERMIT.PAL AND KERCOM.PAL. / KERMIT.PAL AND KERCOM.PAL ARE TWO SOURCE FILES ASSEMBLED TOGETHER TO PRODUCE / THE RUNNING KERMIT-8. *THEY ARE FOR THE DECMATE II/III/III-PLUS ONLY.* / 002 18-JUL-1985 ORIGINAL RELEASE. RANDY HIPPE / 18-JUL-1985 VERSION RELEASED TO CUCCA BY JERRY SANDS AND RANDY HIPPE OF: / BUREAU OF ENGRAVING, INC. / 3311 BROADWAY N.E. / MINNEAPOLIS, MN 55413 / (612) 623-0900 X218 / CUCCA RENAMED FILE (KER8.PAL) TO K08MIT.PAL WHICH CONFORMS TO NAMING / CONVENTION OF KERMIT FILES. / K08MIT SUPPORTS CONNECT, BYE (REALLY FIN), EXIT, SEND, GET, RECEIVE ONLY. / PROGRAM PRONE TO GETTING "CONFUSED" AND OUTPUTS FILE DATE ATTRIBUTE BOTH AS / 'CAPAS' BYTE FEATURE AND ASCII TEXT INSERTED INTO CONTENTS OF FILE AHEAD OF / FILE DATA. COMMAND PROCESSOR ACCEPTS UPPER-CASE COMPLETE COMMANDS ONLY. <^C> / ABORT FEATURE TAKES VERY LONG TIME TO ACT (IF AT ALL!). MANY KERMITS WILL NOT / WORK WITH K08MIT; HOWEVER, K08MIT WAS TESTED SUCCESSFULLY WITH KERMIT-20. / 001 30-JUL-1984 FIRST VERSION (KER8.PAL). JERRY SANDS / HARDWARE HINTS AND KINKS. / KERMIT-12 REQUIRES THE FOLLOWING STANDARD OS/8 FAMILY CONFIGURATION: / PDP-8 FAMILY MEMBER WITH AT LEAST 8K MEMORY. / OS/8 SYSTEM DEVICE (WITH OS/8 FAMILY OPERATING SYSTEM RESIDENT). / KL8-COMPATIBLE CONSOLE INTERFACE. / 7/8-BIT ASCII EXTERNAL CONSOLE TERMINAL DEVICE (TTY:). / KL8-COMPATIBLE REMOTE INTERFACE TO OTHER KERMIT. / NOTE: ASSEMBLY PARAMETERS OF KERMIT-12 ALLOW FOR LOCAL KERMIT CONTROLLING / TERMINALS TO BE OTHER THAN THE PRIMARY OS/8 CONSOLE DEVICE. THE ACTUAL / HARDWARE MUST STILL CONFORM TO THE SAME REQUIREMENTS (THE DEVICE CODES WOULD / THEN BE USER-SPECIFIED AND DIFFER FROM THE STANDARD 03/04) AS THE STANDARD / CONSOLE INTERFACE AND TERMINAL. / SPECIAL DECMATE CONSIDERATIONS: / DECMATE USAGE IS USUALLY OBTAINED BY ASSEMBLING FOR THE STANDARD CONSOLE / DEVICE (03/04), AS THE BUILT-IN FIRMWARE/SLUSHWARE OF THE DECMATES IS / SUFFICIENTLY COMPATIBLE WITH THE PDP-8 HARDWARE FOR KERMIT-12'S REQUIREMENTS. / (THE ONLY OTHER ACCEPTABLE CONSOLE DEVICE ON THE DECMATE IS THE PRINTER PORT.) / DECMATE REMOTE COMMUNICATIONS PORTS ARE *RADICALLY* DIFFERENT FROM / KL8-COMPATIBLE PORTS. THESE ARE HANDLED AUTOMATICALLY BY ONCE-ONLY CODE WHICH / DETECTS THE USAGE OF KERMIT-12 ON THE SPECIFIC DECMATE SYSTEM, AND / SELF-CONFIGURATION AS APPROPRIATE. THERE IS ONE EXCEPTION TO THIS, NAMELY IF / THE COMMUNICATIONS PORT CODE IS ASSEMBLED FOR THE PRINTER PORT (32/33), THEN / THE PRINTER PORT, *NOT* THE COMMUNICATIONS PORT WILL BE USED. THE STANDARD / ASSEMBLY OF KERMIT-12 IS FOR A PDP-8 WITH DEVICE 40/41 COMMUNICATIONS PORT. / THIS DESIGNATED VERSION WILL SELF-CONFIGURE WHEN EXECUTED ON A DECMATE. / CONFIGURATION RESTRICTIONS: / WHEN INTERRUPTS ARE SUPPORTED AGAIN, DEVICES SUCH AS THE TD-8/E WON'T WORK. / THE NON-INTERRUPT VERSION SHOULD WORK TO 19200 BAUD ON THE PDP-8/E CPU, SO / THIS SHOULD NOT BE A PROBLEM. INTERRUPT-DRIVEN VERSIONS OF KERMIT-12 MUST BE / RUN ONLY ON SYSTEMS WHERE *ALL* INTENDED DEVICES CAN HAVE THEIR HANDLERS / INTERRUPTED BY THE CONSOLE AND REMOTE LINE INTERRUPT HANDLERS. WHEN IN DOUBT, / THE NON-INTERRUPT VERSION MUST BE USED (CURRENTLY THE ONLY VERSION). / IF FLOW CONTROL IS DISABLED (DUE TO XON/XOFF BEING UNAVAILABLE) THEN THE / CONSOLE BAUD RATE MUST MEET OR EXCEED THE REMOTE LINE RATE. THE USER MUST / TAKE MINIMAL CARE NOT TO OVERLOAD THE INTERNAL BUFFERS OF KERMIT-12, AS THIS / WILL YIELD THE ERROR MESSAGE: KEYBOARD INPUT ERROR! / THIS IS NOT LIKELY TO OCCUR UNLESS ONE "PLAYS" WITH A KEYBOARD WHICH CAN / GENERATE NUMEROUS ESCAPE SEQUENCES AS THE BUFFERS ARE QUITE ADEQUATE FOR ALL / REASONABLE TERMINAL APPLICATIONS. SIMILARLY, IF THE REMOTE LINE DOES NOT OBEY / XON/XOFF PROTOCOL (WHILE KERMIT-12 HAS IT ENABLED), THEN INTERNAL BUFFER / OVERFLOW WILL YIELD THE ERROR MESSAGE: REMOTE LINE INPUT ERROR! / THESE ERRORS ARE EXTREMELY UNLIKELY AND CAN ONLY BE CREATED BY MISUSE OF FLOW / CONTROL (THE ONLY EXCEPTION TO THIS IS THE ATTEMPT TO USE KERMIT-12 WITH THE / CONSOLE BAUD RATE SLOWER THAN THE REMOTE LINE BAUD RATE WITH FLOW CONTROL / DISABLED). IF FLOW CONTROL IS ENABLED AND OBEYED THEN THE BUFFERING OF REMOTE / LINE INPUT WILL OCCUR WHILE SHORT PAUSES OCCUR ON THE CONSOLE (ASSUMING THE / USER FREEZES/UNFREEZES THE DISPLAY OFTEN AND THE CONSOLE DISPLAY BAUD RATE IS / FASTER THAN THE REMOTE LINE BAUD RATE) WITH PRACTICALLY NO REMOTE LINE DELAY. / FLOW CONTROL IS NOT YET SUPPORTED DURING KERMIT TRANSFERS. SINCE KERMIT-12 / DOES NOT SUPPORT SLIDING WINDOWS, KERMIT-12 WILL NEVER GENERATE OUTGOING / XON/XOFF SEQUENCES. FUTURE REVISIONS WILL SUPPORT INCOMING XON/XOFF FROM THE / REMOTE KERMIT. XON/XOFF PROTOCOL DURING CONNECT MODE IS COMPLETELY AVAILABLE / AT THE USER'S OPTION. / CONSOLE TERMINALS ARE REQUIRED TO SUPPORT "GLASS TTY:" FEATURES, I.E. THE / PRINTING ASCII CHARACTER SET (LOWER-CASE DESIRABLE) AND THE CONTROL CHARACTERS / <CR>, <LF>, AND <BEL> (THE LAST FOR VARIOUS AUDIBLE REPORTS ONLY). TERMINALS / LACKING LOWER-CASE SUPPORT SHOULD "FOLD" LOWER-CASE CHARACTERS TO UPPER-CASE / AUTOMATICALLY. TERMINALS SUCH AS THE VT05 CAN HAVE THE KEYBOARD LOWER-CASE / ENABLED, AS KERMIT-12 SUPPORTS OPTIONAL OUTPUT FOLDING. THE UPPER-CASE ONLY / OPTION SHOULD BE ENABLED FOR TERMINALS WHICH IGNORE LOWER-CASE INPUT FROM THE / HOST, AS KERMIT-12 GENERATES NUMEROUS LOWER-CASE MESSAGE CHARACTERS (WHICH / BECOME UPPER-CASE IF THIS OPTION IS SET). THE <BS> CHARACTER IS REQUIRED FOR / VISUAL RUBOUT (<BS> <SPACE> <BS>) ONLY. FUTURE VERSIONS WILL SUPPORT / HARD-COPY BACKSPACE TO REMOVE THIS REQUIREMENT. ALL TERMINAL FEATURES (SUCH / AS ACTUAL VT-100 FUNCTIONALITY) ARE FREELY PASSED TO THE HOST DURING CONNECT / MODE; THE ONLY CHARACTER ACTUALLY RESERVED IS THE ESCAPE CHARACTER WHICH WILL / BE TREATED AS A SEVEN-BIT CHARACTER ONLY. IF THE USER PRESSES THE ESCAPE / CHARACTER TWICE, THEN THE SEVEN-BIT REPRESENTATION OF THE CHARACTER IS SENT / ONCE; THERE IS NO WAY TO SEND THE ESCAPE CHARACTER WITH THE HIGH-BIT SET. / SINCE THE ESCAPE CHARACTER ITSELF CAN BE SET TO ALMOST ANY SEVEN-BIT VALUE, / THIS SHOULD NOT BE A SERIOUS LIMITATION. TERMINALS THAT DON'T "BEEP" WHEN THE / <BEL> CHARACTER IS SENT SHOULD NOT OUTPUT A PRINTABLE RENDITION OF THE <^G> / CHARACTER, AS THIS WOULD DISRUPT THE TERMINAL OUTPUT AND INTERNAL COLUMN COUNT / DURING VARIOUS MESSAGE SEQUENCES, ETC. / KL-8/E INTERFACES SHOULD BE SETUP WITH THE FOLLOWING STANDARD SETTINGS: / 1 STOP BIT ABOVE 110 BAUD WITH 8 BITS DATA. / FUNCTIONAL BAUD RATES INCLUDE 110, 150, 300, 600, 1200, 2400, 4800, 9600, / 19200, 38400 AND 76800. 2400 BAUD REQUIRES A REVISION "B" OR BETTER M8650 / MODULE (IF ONE USES DEC'S DOCUMENTATION OF AVAILABLE SPLIT-LUG OPTIONS). / ACTUAL BAUD RATES UP TO APPROXIMATELY 100 KBAUD SHOULD WORK WHEN KERMIT-12 / BECOMES INTERRUPT-DRIVEN. RATES OTHER THAN 110 BAUD REQUIRE A 19.6608 MHZ / BAUD-RATE OSCILLATOR. / THE BAUD RATES STATED ABOVE ARE ACTUALLY AVAILABLE ON THE KL-8/E, BUT REQUIRE / A SINGLE SOLDER JUMPER TO IMPLEMENT THE PROPER BAUD RATE ABOVE 2400 BAUD. / CHANGING BAUD-RATE GENERATOR CRYSTALS WILL PRODUCE OTHER RATES AS NECESSARY. / (SEND INQUIRIES TO CLA SYSTEMS FOR INFORMATION REGARDING KL-8/E MODIFICATIONS / INCLUDING UPGRADED BAUD-RATE OSCILLATORS, ETC.) KERMIT-12 HAS BEEN TESTED TO / 9600 BAUD AND SHOULD WORK TO 19200 BAUD (AS OF THE CURRENT VERSION). / KL8-J/A INTERFACES SHOULD BE SETUP WITH THE FOLLOWING STANDARD SETTINGS: / 1 STOP BIT ABOVE 110 BAUD WITH 8 BITS DATA NO PARITY. / FUTURE VERSIONS OF KERMIT-12 WILL SUPPORT VARIOUS SOFTWARE-GENERATED PARITY / OPTIONS. THE FRAMING AND OVERRUN ERRORS CAN BE ENABLED AND WILL EVENTUALLY BE / SUPPORTED (BUT THE PARITY GENERATOR SHOULD BE DISABLED TO PREVENT INTERACTION / WITH THE SOFTWARE USE OF PARITY GENERATION/DETECTION). / ALL BAUD RATES ARE SUPPORTABLE: / 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200. / 19200 BAUD IS ACHIEVED BY CUTTING JUMPER "W2" AND ADDING JUMPER "W5" AND THEN / SETTING THE BOARD FOR WHAT IS NORMALLY 9600 BAUD. A WESTERN DIGITAL TR-1602-B / OR EQUIVALENT UART IS REQUIRED TO SUPPORT 19200 BAUD; MOST OF THE RECENT / PRODUCTION DEC M8655 BOARDS USE THE SMC COMM 2017 UART WHICH MEETS OR EXCEEDS / THIS REQUIREMENT. EARLY M8655 BOARDS USE GI UARTS IN CERAMIC PACKAGES WHICH / *CANNOT* BE USED AT 19200 BAUD (MANY ARE FLAKY AT 9600 BAUD!). / RECEIVE BAUD RATE SHOULD BE IDENTICAL TO TRANSMIT BAUD RATE. (DO NOT SET THE / RECEIVE=150 BAUD SWITCH!) / OTHER INTERFACES: / DKC-8/A (8/A OPTION BOARD #1) INTERFACES SHOULD BE SETUP AS PER THE KL8-J/A / SPECIFICATIONS INCLUDING THE REQUIREMENTS OF THE UART. SOME DEC DOCUMENTATION / INDICATED A PROHIBITION ON THE USE OF 19200 BAUD, BUT THIS IS OBVIATED BY THE / USE OF THE SAME UARTS AS IN THE KL8-J/A. / EARLIER DEVICES SUCH AS PT08, DP-12, KL-8/F OR DC02 (CHANNEL ZERO ONLY) SHOULD / WORK CORRECTLY AS FACTORY WIRED (MOST OF THESE DEVICES DO NOT SUPPORT OPTIONS / KERMIT-12 WOULD REQUIRE TO BE DISABLED ANYWAY. THESE INCLUDE PARITY / GENERATION, FRAMING ERROR DETECTION, ETC.). TO UTILIZE THESE DEVICES, THE / ASSEMBLY PARAMETERS FOR USER DEVICES AND THEIR RESPECTIVE DEVICE CODE VALUES / SHOULD BE GIVEN DURING ASSEMBLY (SEE ASSEMBLY INSTRUCTIONS). PROPER DEVICE / CODE VALUES MUST BE OBTAINED FOR THE SELECTED INTERFACE, AS THERE ARE MANY / ACTUAL POSSIBILITIES. (DP-12 DEVICES ARE GENERALLY DEVICE 40/41; PT08/DC02 / INTERFACES ARE GENERALLY DEVICE 11/12, ETC.) / ASSEMBLY INSTRUCTIONS. / KERMIT-12 CAN BE ASSEMBLED BY EITHER OF TWO METHODS: / P?S/8 METHOD: / ASSUMING THE EXTENDED-LENGTH FILE KERM12 IS THE SOURCE FILE, THE FOLLOWING / COMMAND WILL PRODUCE A FULLY ORNAMENTED LISTING: / .PAL KB1,KB2,KB3,KB4<KERM12(ACEJLMNPQSX8) / OPTION SWITCH BREAKDOWN: / /A ALL SYMBOLS IN SYMBOL PRINTOUT. / /C OPTIMIZE CORE DURING ASSEMBLY FOR MORE SYMBOLS, LESS BUFFERS. / THIS OPTION SHOULD BE DELETED IF MORE THAN 8K IS AVAILABLE FOR / ASSEMBLY. / /E FORGET LITERAL BOUNDARIES WHEN LEAVING THE CURRENT PAGE. / /J *DO NOT* TERMINATE TEXT STRINGS WITH EXTRA ZERO WORD. / /L PERFORM SECOND-PASS LISTING. / /M CHAIN TO MAP FOR BITMAP OUTPUT AT END OF ASSEMBLY. / /N ENABLE NEATNESS ADORNMENTS TO LISTING OUTPUT. / /P ENABLE PRINTER-ORIENTED (WIDE MODE) LISTING OUTPUT. / /Q ENABLE LITERALS ONLY, GENERATED LINKS ARE ERRORS. / /S ENABLE SYMBOL TABLE PRINTOUT. / /X ENABLE CROSS-REFERENCE OUTPUT AT END OF ASSEMBLY. / /8 ENABLE FULL SYMBOL TABLE INCLUDING LINC MODE CROSS ASSEMBLY. / THE NUMBER OF BINARY FILES REQUIRED (KB1, KB2, KB3, ETC.) IS TO BE DETERMINED / AT ASSEMBLY TIME, AS KERMIT-12 WILL TEND TO GROW LARGER AS FEATURES ARE ADDED. / P?S/8 PAL IS THE PREFERRED METHOD OF ASSEMBLING K12MIT DURING DEVELOPMENT DUE / TO SUPERIOR ERROR DIAGNOSTICS AND OVERALL SPEED. K12MIT COULD GROW TO A SIZE / BEYOND THE CAPABILITIES OF OS/8 CREF. THIS LIMITATION CANNOT APPLY TO THE / P?S/8 DEVELOPMENT ENVIRONMENT. / P?S/8 PAL CAN PRODUCE A LISTING OF K12MIT, BUT THE BINARY FILES CREATED BY THE / ASSEMBLY MUST BE TRANSFERRED TO AN OS/8 ENVIRONMENT FOR USE, SINCE K12MIT (AS / SPECIFICALLY WRITTEN) IS FOR THE OS/8 FAMILY OF SYSTEMS ONLY. / NOTE: P?S/8 IS *NOT* A DEC PRODUCT; IT IS SOLD COMMERCIALLY AND IS AVAILABLE / FREE OF CHARGE (EXCEPT FOR MEDIA HANDLING CHARGES, ETC.) *ONLY* TO QUALIFIED / INSTITUTIONS. CONTACT CJL FOR ADDITIONAL INFORMATION ON ACQUIRING P?S/8. / OS/8 FAMILY OF SYSTEMS METHOD: / K12MIT.PA CAN BE ASSEMBLED WITH PAL8 VERSION B0 WHICH IS AVAILABLE FROM DECUS / AS PART OF THE OS/278 RELEASE. PAL8 VERSION B0 WILL RUN ON ANY OS/8 FAMILY / SYSTEM, AS IT HAS NO HARDWARE DEPENDENCIES BEYOND THE ORIGINAL PDP-8 / REQUIREMENT (NO BSW OR IAC ROTATE OR CAF OR R3L INSTRUCTIONS AS WAS INTENDED). / THIS ALSO APPLIES TO CREF VERSION B0 WHICH IS REQUIRED WHEN A CROSS-REFERENCE / IS REQUESTED. PAL8 VERSION B0 AND CREF VERSION B0 ARE AVAILABLE AS PART OF / THE KERMIT-12 DISTRIBUTION AS K12PL8.ENC AND K12CRF.ENC RESPECTIVELY. SEE THE / DOCUMENTATION OF K12DEC FOR INFORMATION ON PRODUCING PAL8.SV AND CREF.SV FROM / THESE ENCODED FILES. / ASSUMING CCL IS ENABLED, THE FOLLOWING COMMAND WILL PRODUCE A BINARY AND FULLY / ORNAMENTED LISTING: / .PAL DEV:K12MIT.BN,DEV:K12MIT.LS,DEV:KSCR.TM<DEV:PARAM.PA,DEV:K12MIT.PA(CEFMW) / DEV: IS THE APPLICABLE DEVICE WHERE THE FILES RESIDE. STANDARD EXTENSIONS / ARE ASSUMED (.BN FOR BINARY, .LS FOR LISTING, .PA FOR PAL SOURCE). THE / KSCR.TM TEMPORARY OUTPUT FILE SPECIFICATION IS OPTIONAL, BUT IS DEFAULTED TO / SYS:CREFLS.TM IF NOT EXPLICITLY GIVEN. MANY SYSTEM DEVICES ARE TOO SMALL TO / SUPPORT THIS TEMPORARY FILE, THUS THE FILE MAY BE DIRECTED TO ANOTHER / AVAILABLE DEVICE WITH SUFFICIENT SPACE. / THE PARAM.PA FILE IS OPTIONAL AND USED TO PASS SHORT USER PARAMETERS, ETC. TO / THE ASSEMBLY. / OPTION SWITCH BREAKDOWN: / /C CHAIN TO CREF.SV TO PRODUCE A CROSS-REFERENCED LISTING FILE. / /E GENERATED LINKS ARE ERRORS. / /F *DO NOT* TERMINATE TEXT STRINGS WITH EXTRA ZERO WORD. / /M USE MAMMOTH SYMBOL TABLE OPTION FOR CREF. / /W FORGET LITERAL BOUNDARIES WHEN LEAVING THE CURRENT PAGE. / LOADING INSTRUCTIONS: / .LOAD DEV:K12CLR,K12MIT.BN THIS LOADS THE BINARY CLEAR AND KERMIT / .SAVE DEV K12MIT.SV=1 THIS SAVES THE CORE IMAGE / THE JOB STATUS WORD (=1) INDICATED THAT K12MIT.SV LOADS INTO 10000-11777, BUT / SHOULD NOT BE SAVED/RESTORED WHEN THE USR IS LOADED OVER THIS AREA OR / DISMISSED (THE USR IS ACTUALLY NEVER DISMISSED IN NORMAL K12MIT OPERATION). / OTHER BITS MAY BE SET AT THE USER'S OPTION, BUT ARE UNNECESSARY; THE BIT / INDICATED SERVES ONLY TO REDUCE SYSTEM OVERHEAD REGARDING THE DISPOSITION OF / 10000-11777. THE BINARY FILE K12CLR.BN (CREATED BY ASSEMBLING K12CLR.PA) / LOADS ZEROES INTO ALL OF MEMORY TO CREATE A "CLEAN" CORE IMAGE FILE, WHICH / MAKES THE ENCODED BINARY FILE SMALLER DUE TO REPEAT COMPRESSION. / PASSING SHORT PARAMETER FILES. / WHEN INSERTING A SHORT USER MODIFICATION FILE IN THE INPUT STREAM (PARAM.PAL) / THE FOLLOWING SHOULD BE NOTED: / ALWAYS PUT THE SHORT PARAMETER FILE (CONTAINING EQUATED SYMBOLS SUCH AS / USER=1, ETC.) IN FRONT OF K12MIT.PAL. / IF TTY: IS USED FOR DIRECT TYPE-IN OF THESE PARAMETERS, THE INFORMATION NEED / ONLY BE TYPED ENDING WITH <^Z> DURING PASS 1. SUBSEQUENT PASSES REQUIRE THE / ENDING <^Z> ONLY. IF THIS METHOD IS USED, A LISTING WITHOUT THE USER INPUT / WHICH DID THE CUSTOMIZING OF KERMIT-12 CAN BE CREATED. NOTE: IF BINARY IS / GENERATED BY THE CONTENTS OF THE PARAMETER FILE (SUCH AS USE OF THE LOCAL TEXT / MESSAGE, ETC.), THE INFORMATION MUST BE TYPED IN DURING PASS 2. THE PASS 3 / LISTING MAY CONTAIN THE INFORMATION IF SO DESIRED, REQUIRING A REPETITION OF / THE INPUT. PASS 1 INPUT OF THE INFORMATION IS EFFECTIVELY IGNORED, AS NO / DEFINITIONS ARE CREATED ('LCLMSG' IS DEFINED ELSEWHERE, ETC.). / EXPERIENCED PDP-8 USERS NEW TO PAL8 VERSION B0 TAKE SPECIAL NOTICE: / DUE TO HARDWARE LIMITATIONS OF THE DECMATES, THE KEYBOARD FLAG WILL BE CLEARED / DURING PDP-8 PAL8 B0 OPERATION. THE KL8E TTY: HANDLER WILL NO LONGER BE ABLE / TO BUFFER <^Z> DURING THE ASSEMBLY; YOU MUST WAIT UNTIL THE HANDLER ACCESSES / THE KEYBOARD ON EACH PASS *THEN* PRESS <^Z> TO CONTINUE THE ASSEMBLY. / CREATING A CUSTOM MESSAGE FROM THE PARAMETER FILE. / IF SO DESIRED, A CUSTOM LOCAL HEADER MESSAGE MAY BE ADDED BY INSERTING THE / FOLLOWING INTO THE PARAMETER FILE: / BUFFLD= 10 /THESE PROBABLY / FILBUFF=2000 /WON'T CHANGE! / GENMSG= 0 /DON'T GENERATE STANDARD (NULL) MESSAGE / UMSG= 0 /DON'T GENERATE STANDARD (DUMMY) USER MESSAGE / FIELD BUFFLD%10 /FIELD FOR TEXT MESSAGE / *FILBUFFER /LOCAL MESSAGE LOADS THERE /LCLMSG,TEXT "%^I^NSERT ^L^OCAL ^M^ESSAGE ^H^ERE!%" / ZBLOCK LCLMSG+40-. /ZERO REST OF MESSAGE AREA / TEXT IS IN UPPER/LOWER-CASE SIXBIT WITH '^' MEANING SHIFT CASE (INITIALLY / LOWER-CASE) AND '%' MEANING <CR>, <LF>. / OTHER METHODS: / KERMIT-12 *CANNOT* BE ASSEMBLED BY PAL10 (LAST KNOWN VERSION OF PDP-8 / CROSS-ASSEMBLER FOR TOPS10 (142)) BECAUSE IT LACKS CERTAIN FEATURES: / DOES NOT SUPPORT 'RELOC' PSEUDO-OP. / DOES NOT SUPPORT PAGE ZERO REDEFINE (CAUSES "Z" ERROR ON SOURCE FILES WHICH / DON'T HAVE ERRORS WHEN ASSEMBLED BY EITHER P?S/8 PAL OR OS/8 PAL8). / INCORRECTLY HANDLES 'ZBLOCK' PSEUDO-OP (LEADS TO "Q" ERROR ON SOURCE FILES / WHICH DON'T HAVE ERRORS WHEN ASSEMBLED BY EITHER P?S/8 PAL OR OS/8 PAL8). / DOES NOT SUPPORT LITERAL "FORGETTING" (P?S/8 PAL OPTION /E OR OS/8 PAL8 OPTION / /W) WHICH IS REQUIRED FOR DEFINING OVERLAY AREAS, ETC. / DOES NOT SUPPORT TEXT WITHOUT ZERO WORD FILL (P?S/8 PAL OPTION /J OR OS/8 PAL8 / OPTION /F FULFILLS THIS REQUIREMENT) WHICH IS REQUIRED FOR TEXT MESSAGES. / P?S/8 PAL IS AN IMPROPER SUPERSET OF PAL10. PAL10 SUPPORTS MACRO-8 MODE AS AN / OPTION AND AUTOMATIC FIELD DUMP BITMAPS; ALL OTHER KNOWN PAL10 FEATURES EXIST / IN P?S/8 PAL INCLUDING THE SUPPORT OF THE AUTOMATIC FIELD DUMP BITMAP / PSEUDO-OPS ('ENBITS' AND 'NOBITS'). / OS/8 PAL8 (VERSION B0) IS A SUBSET OF P?S/8 PAL WHICH HAS SEVERAL SYNTACTIC / QUIRKS (WHICH ARE AVOIDABLE, BUT NONETHELESS ARE INCOMPATIBLE WITH BOTH P?S/8 / PAL AND PAL10 IN CERTAIN MINOR WAYS); REGARDLESS, PAL8 LACKS THE / COMPATIBILITY PROBLEMS OF PAL10. / MAINTAINING SOURCE COMPATIBILITY. / KERMIT-12 SOURCE FILE CONVENTIONS DEMAND THE USE OF THE COMMON SUBSET OF P?S/8 / PAL AND OS/8 PAL8 (VERSION B0). CERTAIN FORMS OF STATEMENTS SHOULD BE / AVOIDED: / TAD /NOT LEGAL IN PAL8 / 0+TAD /NOT LEGAL IN PAL10, AND POSSIBLY WRONG IN PAL8 / TAD (3)+1 /GENERATES SAME AS "TAD (3+1)" IN PAL8 / -A!-B /UNARY OPERATOR HANDLED WRONG IN PAL8 / I+N /NOT LEGAL IN PAL8 / N+I /NOT LEGAL IN PAL8 / I I /NOT LEGAL IN PAL8 / THIS REQUIREMENT IS EASILY MET BY KERMIT-12 AS MOST OF THESE CASES ARE / ESOTERIC QUIRKS AND NOT NEEDED FOR THIS ASSEMBLY. / THE RESTRICTIONS OF PAL10 (EVEN THOUGH IT HAS OTHER DESIRABLE FEATURES, MOST / OF WHICH IT SHARES WITH P?S/8 PAL) ARE TOO SEVERE TO ALLOW USABLE ASSEMBLY OF / THIS PROGRAM. BETTER CROSS-ASSEMBLERS MAY EXIST ELSEWHERE WHICH ARE / SOURCE-COMPATIBLE WITH KERMIT-12. / USE OF P?S/8 LANGUAGE EXTENSIONS. / P?S/8 OFFERS SEVERAL USEFUL FEATURES OVER PAL8 (AND PAL10) WHICH MAY BE USEFUL / FOR ASSEMBLY DEVELOPMENT OF KERMIT-12. THESE INCLUDE LANGUAGE ELEMENTS SUCH / AS "TAD (3)+1" HANDLED CORRECTLY, OR PSEUDO-OPS SUCH AS "PAUSE EXPR" WHERE THE / VALUE OF 'EXPR' WILL BE DISPLAYED ON THE SYSTEM CONSOLE DURING THE ASSEMBLY / WHEN THAT POINT IN THE ASSEMBLY IS REACHED. TO ACCESS THESE FEATURES AND / STILL PROVIDE COMPATIBILITY WITH PAL8 (VERSION B0), THE FOLLOWING CODING / TECHNIQUE IS SUGGESTED: / IFNDEF PQS <PQS=0> /WILL BE 0 ON PAL8, PAL10 / IFZERO PQS < /DO PAL8, ETC. STUFF HERE / FOO= (TABLE) /DEFINE POINTER TO ADDRESS OF TABLE / TAD FOO-1 /GET (POINTER TO ADDRESS OF TABLE)-1 / DCA XR1 /SETUP AUTO-INDEX REGISTER / WISH WE HAD PAUSE AND ERROR PSEUDO-OPS IN PAL8. / > /END OF PAL8, ETC. VARIANT / IFNZRO PQS < /DO P?S/8 PAL STUFF HERE / TAD (TABLE)-1 /GET (POINTER TO ADDRESS OF TABLE)-1 / DCA XR1 /SETUP AUTO-INDEX REGISTER / IFNDEF PASS <PASS=0>/DEFINE PASS VARIABLE / PASS= PASS+1 /BUMP EVERY ASSEMBLER PASS / PAUSE PASS /DISPLAY PASS NUMBER / IFNZRO .&4000 < / ERROR 1234 /DISPLAY ERROR MESSAGE IF THERE ARE PROBLEMS / > / > /END OF P?S/8 PAL VARIANT / THIS ALLOWS TEMPORARY DEVELOPMENT FEATURES OR PERMANENT ELEMENTS WHICH MAY BE / MORE ELEGANTLY EXPRESSED IN P?S/8 PAL VARIANT CODING, WHILE THE PAL8 (VERSION / B0) VERSION CAN STILL BE USED (VIA DIRECT OCTAL, MULTIPLE EQUATE STATEMENTS, / CONDITIONAL FLUSH AS IN THE ABOVE EXAMPLE, ETC. AS NECESSARY) FOR STANDARD / ASSEMBLY OF KERMIT-12. / ASSEMBLY PARAMETERS. / SEVERAL PARAMETERS MUST BE CHANGED WITHIN K12MIT.PA (OR PASSED TO THE / ASSEMBLER VIA A SHORT FILE INSERTED INTO THE ASSEMBLY STREAM BEFORE THE MAIN / FILE): / SETTING KEY= [RECEIVE IOT CODE FOR CONSOLE KEYBOARD] DEFINES THE CONSOLE / KEYBOARD IOT CODE (DEFAULT IS 03). / SETTING TTY= [TRANSMIT IOT CODE FOR CONSOLE OUTPUT] CHANGES THE CONSOLE / PRINTER IOT CODE (DEFAULT IS 04). / THE FOLLOWING DEFINITIONS ARE ESSENTIALLY FOR KL8-TYPE DEVICES ONLY, AS THE / CODE DEMANDS KL8 HARDWARE COMPATIBILITY. MODELS OTHER THAN PDP-8 (SUCH AS / DECMATE) GENERALLY EITHER PLACE RESTRICTIONS ON AVAILABLE INTERFACES (OTHER / SOFTWARE DESIGNATES A SERIAL INTERFACE AS A LOGICAL PRINTER PORT; DECMATES / SUPPORT A FIRMWARE "PRINT SCREEN" KEY WHICH ENFORCES THIS.), OR DON'T ALLOW / USABLE PLUG-IN OPTIONS. / IGNORING BUILT-IN DECMATE SUPPORT, THE FOLLOWING PARAMETERS ARE ACTIVE: / SETTING DEV30= 1 CREATES DEVICE 30/31 REMOTE LINE IOTS. / SETTING DEV40= 1 CREATES DEVICE 40/41 REMOTE LINE IOTS. / SETTING LEDERLE=1 CREATES DEVICE 43/44 REMOTE LINE IOTS (AND A CUSTOM / HEADER). / SETTING ORIGNAL=1 CREATES DEVICE 33/34 REMOTE LINE IOTS (ORIGINAL / SETTINGS). / SETTING SPRINT= 1 CREATES DEVICE 32/33 REMOTE LINE IOTS (SERIAL PRINTER / PORT). / SETTING USER= 1 CREATES DEVICE XX/XY REMOTE LINE IOTS. / IF NONE OF THESE ARE SET, THEN DEV40=1 APPLIES BY DEFAULT. / SETTING USER= 1 REQUIRES THE USER TO DEFINE TWO ADDITIONAL VALUES: / XX= [RECEIVE IOT DEVICE CODE] (DEFAULT IS 40). / XY= [TRANSMIT IOT DEVICE CODE] (DEFAULT IS 41). / SETTING SPRINT= 1 INHIBITS THE BUILT-IN CHECK FOR DECMATE OPERATION AND / USES THE SERIAL PRINTER PORT FOUND ON ALL / WPS-8-CONFIGURED PDP-8/E, PDP-8/A CONFIGURATIONS, / VT-78, AND ALL DECMATES (VT-278, DECMATE II, III, / III+) FOR REMOTE COMMUNICATIONS. / THE USE OF THE SERIAL PRINTER PORT FOR REMOTE COMMUNICATIONS PURPOSES MAY BE / PROBLEMATIC DUE TO CONSIDERATIONS SUCH AS THE RS-232 CONNECTION TO THE PRINTER / IS A MODEM (DCE), RATHER THAN A TERMINAL (DTE) (DECMATE II, ETC. REQUIRES A / GENDER CHANGER.), OR THE SOFTWARE DESIGNATION OF THE PORT AS BEING ALLEDGEDLY / *ONLY* FOR A PRINTER, SUCH AS WHEN CERTAIN SYSTEMS SUPPORT THE "PRINT SCREEN" / KEY AS A SCREEN DUMP TO THE SERIAL PRINTER PORT, ETC. THESE ISSUES ARE NOT / RELEVANT TO KERMIT-12 OPERATION, AS THE "PRINT SCREEN" KEY IS NOT SUPPORTED BY / KERMIT-12 IN THIS CONFIGURATION AS SUCH (FUTURE VERSIONS COULD REDEFINE THE / "PRINT SCREEN" KEY TO SUCH FUNCTIONS AS DUMP SCREEN TO A FILE, ETC.). / SETTING BRATE= NN SETS THE DEFAULT BAUD RATE (FOR SYSTEMS THAT SUPPORT / THIS FEATURE) FROM A TABLE OF VALUES (0-15) AS / FOLLOWS: / NN BAUD RATE / 00 50 / 01 75 / 02 110 / 03 134.5 / 04 150 / 05 300 / 06 600 / 07 1200 / 08 1800 / 09 2000 / 10 2400 / 11 3600 / 12 4800 / 13 7200 / 14 9600 / 15 19200 / SETTING ESCAPE= NNNN SETS THE DEFAULT ESCAPE CHARACTER TO NNNN. / SETTING FLOW= 1 ENABLES FLOW-CONTROL BY DEFAULT. / SETTING FLOW= 0 DISABLES FLOW-CONTROL BY DEFAULT. / SETTING FMODE= 0177 SETS THE DEFAULT FILE MODE TO ASCII. / SETTING FMODE= 4377 SETS THE DEFAULT FILE MODE TO BINARY. / SETTING GENMSG= 0 CAUSES NO BINARY TO BE GENERATED WHERE 'LCLMSG' IS / DEFINED. THIS ALLOWS THE PARAMETER FILE (PARAM.PA) OR / SUBSEQUENT OVERLAY BY K12PCH.BN TO DEFINE THE LOCAL / HEADER MESSAGE. THIS PARAMETER SHOULD NOT BE SET / UNLESS ONE OF THESE METHODS IS USED, ELSE THE HEADER / MESSAGE WILL BE UNDEFINED. (NOTE: IF K12PCH.BN / GENERATES A HEADER MESSAGE, THEN THIS PARAMETER IS / UNIMPORTANT, AS K12PCH.BN OVERLAYS THE BINARY OF / K12MIT.) / SETTING GENMSG= 1 CAUSES A HEADER MESSAGE TO BE GENERATED. THE CONTENTS / OF THE MESSAGE ARE CREATED BY SETTING LEDERLE=1 OR / UMSG=1. IF EITHER IS ZERO, A DEFAULT (NULL) MESSAGE / WILL BE GENERATED. / SETTING ICLOSE= 1 ENSURES A <^Z> AT <EOF> OF ASCII INPUT FILES BY / DEFAULT. / SETTING ICLOSE= 0 CLOSES ASCII INPUT FILES AS RECEIVED BY DEFAULT. / SETTING INIECHO=0 CAUSES A FULL-DUPLEX CONNECT MODE STATE WITH NO LOCAL / CHARACTER ECHOING BY DEFAULT. / SETTING INIECHO=1 CAUSES A HALF-DUPLEX CONNECT MODE STATE WITH LOCAL / ECHO OF ALL CONSOLE CHARACTERS BY DEFAULT. / SETTING LOWER= 0 ALLOWS LOWER-CASE CONSOLE OUTPUT BY DEFAULT. / SETTING LOWER= -40 FOLDS LOWER-CASE CONSOLE OUTPUT TO UPPER-CASE BY / DEFAULT. / SETTING OCLOSE= 0 PREVENTS DEFAULT SENDING OF <^Z> AT <EOF> OF ASCII / FILES. / SETTING OCLOSE= 1 CAUSES <^Z> TO BE SENT AT <EOF> OF ASCII FILES BY / DEFAULT. / SETTING PORT= 0 CAUSES THE DP-278 PORT 0 TO BE USED IF KERMIT-12 IS / RUN ON A DECMATE 1 (ASSUMING SPRINT=0). / SETTING PORT= 1 CAUSES THE DP-278 PORT 1 TO BE USED IF KERMIT-12 IS / RUN ON A DECMATE 1 (ASSUMING SPRINT=0). / SETTING RETCNT= NNNN SETS THE PACKET RETRY COUNT TO NNNN BY DEFAULT. / SETTING UMSG= 0 PREVENTS THE LOCAL USER HEADER MESSAGE FROM BEING / GENERATED. / SETTING UMSG= 1 CAUSES THE LOCAL USER HEADER MESSAGE TO BE GENERATED. / THE PARAMETER GENMSG=1 IS REQUIRED TO BE SET. THE / SOURCE MUST BE MODIFIED LOCALLY TO CHANGE THE MESSAGE / TEXT FROM "INSERT LOCAL USER MESSAGE HERE!," AS THIS / IS THE DEFAULT CONTENTS. / KERMIT-12 FOR THE FAMILY OF 12-BIT DEC MACHINES. / BRIEF USAGE DESCRIPTION. / KERMIT-12 IS AN IMPLEMENTATION OF THE KERMIT PROTOCOL FOR THE FAMILY OF 12-BIT / DEC (AND COMPATIBLE) MACHINES GENERALLY KNOWN AS PDP-8 OR DECMATE. / AS OF THE CURRENT IMPLEMENTATION, THE FOLLOWING COMMANDS ARE EFFECTIVE: / 1. CONNECT (TO REMOTE SYSTEM AS TERMINAL). / 2. SEND FILESPEC (TO REMOTE RECEIVER OR SERVER). / 3. RECEIVE FILESPEC (FROM REMOTE SENDER). / 4. GET FILESPEC (FROM REMOTE SERVER). / 5. FINISH (SERVING). / 6. SETUP (ON DECMATE II/III/III-PLUS ONLY). **** NOT IMPLEMENTED **** / 7. EXIT (TO OPERATING SYSTEM). / 8. HELP (DISPLAYS HELP MESSAGE). / FILESPEC MAY BE ANY LOCAL (OS/8) FILE-STRUCTURED DEVICE:FILENAME.EXTENSION, / WHERE THE FILENAME AND EXTENSION WILL BE TRUNCATED TO 6 ALPHANUMERICS AND 2 / ALPHANUMERICS RESPECTIVELY, AS NECESSARY (THIS IS REFERRED TO AS 6.2 FILENAME / FORMAT). THE DEVICE: FIELD IS OPTIONAL; ALL COMMANDS USING THE DEVICE: / FIELD FOR LOCAL DEVICE SPECIFICATION WILL USE THIS DEVICE AS THE SOURCE OR / DESTINATION AS NECESSARY FOR THE LOCAL FILES. IF THE DEVICE: FIELD IS / OMITTED, THE DEFAULT DEVICE DSK: WILL BE USED. THE ACTUAL DEVICE USED MAY BE / SELECTED BEFORE INVOKING KERMIT-12 BY USING THE OS/8 ASSIGN COMMAND: / .ASSIGN DEV DSK / WHERE DEV IS ANY AVAILABLE FILE-STRUCTURED DEVICE. / KERMIT-12 USES AN UNUSUAL SCHEME FOR ITS PROMPT: THE ACTUAL DEFAULT PROMPT / TEXT IS PARTIALLY TAKEN FROM THE ACTUAL MACHINE KERMIT-12 IS CURRENTLY / EXECUTING ON. FOR EXAMPLE, IF KERMIT-12 HAS DETERMINED THE CPU TYPE AS / PDP-8/E, THE PROMPT WILL BE: / KERMIT-8/E> / THIS ALLOWS KERMIT-12 USERS (WITH DIFFERENT CPU-TYPE MACHINES) TO DISTINGUISH / MESSAGES ORIGINATING FROM THE RESPECTIVE SYSTEMS. FUTURE VERSIONS WILL / SUPPORT USER PROMPT STRINGS TO ALLOW MORE DISTINCTIVE SYSTEM MESSAGES. / THE HELP OR CONNECT COMMANDS MAY BE USED TO DETERMINE THE CURRENT CONNECT MODE / ESCAPE CHARACTER. / COMMAND RESTRICTIONS. / THE SEND COMMAND ALLOWS DEVICE:FILENAME.EXTENSION (6.2) WITH WILD-CARD / SUBSTITUTION. A * MAY BE GIVEN FOR AN ENTIRE FIELD (EITHER FILENAME OR / EXTENSION OR BOTH) ONLY. A ? WILL MATCH ANY SINGLE CHARACTER WHICH MUST / EXIST IN THE ACTUAL FILENAME OR EXTENSION, UNLESS RIGHT-MOST IN THE FIELD. / ALL MATCHING FILES WILL BE SENT. NO OUTBOUND FILENAME (AS-NAME) FACILITY / EXISTS AT THIS TIME. / THE RECEIVE COMMAND ALLOWS OPTIONAL DEVICE: ONLY. *THE FILENAME AND / EXTENSION ARE NOT ALLOWED*. NAMES OF RECEIVED FILES WILL BE MODIFIED IF / NECESSARY TO CONFORM TO THE 6.2 FORMAT. *IMPLEMENTATION RESTRICTION* : / CERTAIN REMOTE FILENAMES CONTAINING NON-ALPHANUMERIC CHARACTERS MAY CAUSE / KERMIT-12 TO HASTILY ABORT THE TRANSMISSION AND RETURN TO COMMAND LEVEL. / THE GET COMMAND ALLOWS OPTIONAL DEVICE: TO DETERMINE DESTINATION OF THE / INCOMING FILES. THE OUTBOUND FILESPEC MUST CONFORM TO LOCAL CONVENTIONS / (FILENAME AND EXTENSION ARE NOT LIMITED TO 6.2 FORMAT; THE DEVICE: FIELD / WILL NOT BE SENT TO THE REMOTE KERMIT UNLESS IT IS ILLEGAL WITHIN OS/8 / SPECIFICATIONS, SUCH AS TOO MANY DEVICE LETTERS. IN THIS CASE, THE DEFAULT / DEVICE DSK: APPLIES, AND THE ENTIRE "DEVICE" FIELD IS SENT ALONG WITH ANY / FILENAME AND EXTENSION). CERTAIN REMOTE SYSTEMS ARE INCOMPATIBLE WITH THIS / IMPLEMENTATION, AS IMBEDDED SPACES OR NON-ALPHANUMERIC CHARACTERS ARE NOT / ALLOWED, EVEN THOUGH THEY MAY BE REQUIRED ON THE REMOTE SYSTEM. WILD-CARD / CHARACTERS ARE ALLOWED, BUT ONLY AS SPECIFIED IN THE SEND COMMAND ABOVE. / <^X> OR <^Z> CAN BE USED TO ABORT KERMIT TRANSMISSIONS (EVENTUALLY) BUT IS / NORMALLY A SLOW PROCESS, SINCE THE CHECKING IS DONE BY A SOFTWARE TIMEOUT / SCHEME. AT THE PRESENT TIME, THERE IS NO DISTINCTION BETWEEN THESE THO / CHARACTERS, SO IT IS NOT POSSIBLE TO ABORT A SINGLE FILE; THE ENTIRE BATCH OF / FILES INVOLVED IN THE TRANSFER IS ABORTED. / DECMATE II/III/III-PLUS CONSIDERATIONS: / FUNCTION KEYS SEND <ESC> SEQUENCES SPECIFIED BY SLUSHWARE/FIRMWARE. ALL SOFT / FUNCTION KEYS ARE THEREFORE INEFFECTIVE (EXCEPT FOR HOLD SCREEN WHICH ALWAYS / WORKS). / CONNECT MODE RUNS IN 8-BIT MODE. / THE COMPOSE KEY IS ENABLED FOR USE WITH A LOADED COMPOSE TABLE. / ANY VALID DECMATE II/III/III-PLUS CHARACTER SET IS ALLOWED WHILE IN CONNECT / MODE (MCS TCS LINE, ETC.). ALL <ESC> SEQUENCES ARE PASSED TO THE / SLUSHWARE/FIRMWARE UNMODIFIED. / KEYBOARD UPPER-CASE LOCK WILL ALWAYS BE AUTOMATICALLY APPLIED UPON RETURN FROM / CONNECT MODE. / DEFINITIONS. /017 CJL *200 /FOR DEFINITIONS /047 CJL / REMOTE LINE PARAMETERS; SET ONLY ONE AS NECESSARY. /046 CJL IFNDEF DEV30 <DEV30= 0> /USE DEVICE 30/31 VALUES IFNDEF DEV40 <DEV40= 0> /USE DEVICE 40/41 VALUES IFNDEF LEDERLE <LEDERLE=0> /USE LEDERLE LABS VALUES IFNDEF ORIGNAL <ORIGNAL=0> /USE ORIGINAL VALUES IFNDEF SPRINT <SPRINT=0> /USE DEVICE 32/33 VALUES IFNDEF USER <USER= 0> /USE USER-DEFINED VALUES REMOTE= DEV30+DEV40+LEDERLE+ORIGNAL /SET REMOTE LINE IOT CODE REMOTE= REMOTE+SPRINT+USER /SET REMOTE LINE IOT CODE IFZERO REMOTE <DEV40= 1> /DEFAULT TO DEVICE 40/41 VERSION / DEV30 PARAMETERS. IFNZRO DEV30 < IFNDEF REC <REC= 30> /DEVICE 30 INPUT IFNDEF SEN <SEN= 31> /DEVICE 31 OUTPUT > / DEV40 PARAMETERS (DEFAULT). IFNZRO DEV40 < IFNDEF REC <REC= 40> /DEVICE 40 INPUT IFNDEF SEN <SEN= 41> /DEVICE 41 OUTPUT > / LEDERLE PARAMETERS. /038 CJL IFNZRO LEDERLE < IFNDEF REC <REC= 43> /DEVICE 43 INPUT IFNDEF SEN <SEN= 44> /DEVICE 44 OUTPUT IFNDEF GENMSG <GENMSG=1> /GENERATE LOCAL HEADER MESSAGE IFNDEF UMSG <UMSG= 0> /DON'T GENERATE USER MESSAGE > / ORIGNAL PARAMETERS. IFNZRO ORIGNAL < IFNDEF REC <REC= 33> /DEVICE 33 INPUT IFNDEF SEN <SEN= 34> /DEVICE 34 OUTPUT > / SPRINT PARAMETERS. /046 CJL IFNZRO SPRINT < IFNDEF REC <REC= 32> /DEVICE 32 INPUT IFNDEF SEN <SEN= 33> /DEVICE 33 OUTPUT > / USER PARAMETERS. IFNZRO USER < IFNDEF XX <XX= 40> /DEFAULT TO DEVICE 40 IFNDEF XY <XY= 41> /DEFAULT TO DEVICE 41 IFNDEF REC <REC= XX> /DEVICE XX INPUT IFNDEF SEN <SEN= XY> /DEVICE XY OUTPUT IFNDEF GENMSG <GENMSG=1> /GENERATE LOCAL HEADER MESSAGE IFNDEF UMSG <UMSG= 1> /GENERATE USER MESSAGE > / REMOTE LINE IOT DEFINITIONS. / RECEIVE DEFINITIONS. RKRBIOT=REC^10+6006 /READ REMOTE, CLEAR FLAG RKSFIOT=REC^10+6001 /SKIP ON REMOTE INPUT FLAG / TRANSMIT DEFINITIONS. RSBIOT= SEN^10+6003 /SET BAUD RATE FROM AC[8-11] RTLSIOT=SEN^10+6006 /TRANSMIT CHARACTER, CLEAR FLAG RTSFIOT=SEN^10+6001 /SKIP ON TRANSMIT FLAG / CONSOLE TTY: DEFINITIONS. /017 CJL / KEYBOARD DEFINITIONS. /017 CJL IFNDEF KEY <KEY= 03> /KEYBOARD DEVICE CODE KCCIOT= KEY^10+6002 /CLEAR CONSOLE KEYBOARD FLAG, AC KRBIOT= KEY^10+6006 /READ CONSOLE KEYBOARD BUFFER, CLEAR FLAG KRSIOT= KEY^10+6004 /READ CONSOLE KEYBOARD BUFFER STATIC KSFIOT= KEY^10+6001 /SKIP ON CONSOLE KEYBOARD FLAG / TELEPRINTER DEFINITIONS. /017 CJL IFNDEF TTY <TTY= 04> /TELEPRINTER DEVICE CODE TLSIOT= TTY^10+6006 /PRINT CHARACTER, CLEAR FLAG TSFIOT= TTY^10+6001 /SKIP ON TELEPRINTER FLAG / DEFAULT ESCAPE CHARACTER DEFINITION. /025 CJL IFNDEF ESCAPE <ESCAPE="]&37> /DEFAULT IS CONTROL-] / DEFAULT LOWER-CASE ENABLE DEFINITION. /030 CJL IFNDEF LOWER <LOWER= 0/-40> /LOWER-CASE IS ALLOWED AS IS /CHANGE TO -40 IF LOWER-CASE /SHOULD BE FOLDED TO UPPER-CASE / DEFAULT RETRY COUNT DEFINITION. /031 CJL IFNDEF RETCNT <RETCNT=5> /DEFAULT IS FIVE RETRIES / DEFAULT FILE MODE DEFINITION. /031 CJL IFNDEF FMODE <FMODE= 0177> /DEFAULT IS ASCII FILE MODE /4377 IS BINARY FILE MODE / DEFAULT FLOW-CONTROL MODE DEFINITION. /031 CJL IFNDEF FLOW <FLOW= 1> /DEFAULT IS FLOW-CONTROL ENABLED / DEFAULT ASCII INPUT FILE <^Z> DISPOSITION. /031 CJL IFNDEF ICLOSE <ICLOSE=1> /ENSURE <^Z> AT ASCII <EOF> / DEFAULT ASCII OUTPUT FILE <^Z> DISPOSITION. /031 CJL IFNDEF OCLOSE <OCLOSE=0> /<^Z> NOT SENT AT ASCII <EOF> / DEFAULT LOCAL MESSAGE GENERATION DEFINITIONS. /038 CJL IFNDEF GENMSG <GENMSG=1> /DEFAULT IS TO GENERATE A MESSAGE IFNDEF UMSG <UMSG= 0> /DEFAULT IS NO DUMMY USER MESSAGE IFNDEF LEDERLE <LEDERLE=0> /DEFAULT IS NO LEDERLE MESSAGE / THE NULL MESSAGE WILL BE GENERATED BY DEFAULT. / ECHO DEFINITION. /039 CJL IFNDEF INIECHO <INIECHO=0> /DEFAULT IS NO LOCAL ECHO / DEFAULT DECMATE I PORT DEFINITION. /050 CJL IFNDEF PORT <PORT= 0> /DEFAULT IS PORT ZERO / DEFAULT BAUD RATE DEFINITION. /050 CJL IFNDEF BRATE <BRATE= 7> /DEFAULT IS 1200 BAUD / STATE DEFINITIONS. STDAT= "D&137 /DATA STACK= "Y&137 /ACK STNAK= "N&137 /NAK STSIN= "S&137 /SEND-INIT STBRK= "B&137 /BREAK LINK STFIL= "F&137 /FILENAME HEADER STEOF= "Z&137 /END OF FILE OR REPLY STERR= "E&137 /ERROR PACKET STATT= "A&137 /FILE ATTRIBUTES STRIN= "R&137 /RECEIVE-INIT STEOT= "B&137 /BREAK TRANSMISSION STGEN= "G&137 /KERMIT GENERIC COMMAND / DEFAULT INIT PARAMETERS. DEFCK= "1&177 /DEFAULT 1 CHARACTER CHECKSUM /014 CJL DEFEOL= 15+40 /CR IS DEFAULT <EOL> DEFQCTL= "#&177 /"#" IS DEFAULT QCTL / BUFFER DEFINITIONS. /014 CJL DECIMAL /MAKE IT EASIER /014 CJL DEFMAXL=94 /DEFAULT MAXIMUM PACKET SIZE LINSIZ= 32 /KEYBOARD LINE BUFFER SIZE OCTAL /BACK TO NORMAL /014 CJL BUFSIZE=200 /128 CHARACTER RING BUFFERS /026 CJL /FOR NO-INTERRUPT CONNECT MODE / CONTROL CHARACTER DEFINITIONS. /023 CJL CNTRLA= "A&37 /<^A> DEFAULT MARK CHARACTER /023 CJL CNTRLB= "B&37 /<^B> /046 CJL CNTRLC= "C&37 /<^C> PROGRAM EXIT CHARACTER /023 CJL CNTRLD= "D&37 /<^D> /046 CJL CNTRLE= "E&37 /<^E> /046 CJL CNTRLF= "F&37 /<^F> /046 CJL CNTRLG= "G&37 /<^G> BELL CHARACTER /023 CJL CNTRLH= "H&37 /<^H> BACKSPACE CHARACTER /023 CJL CNTRLI= "I&37 /<^I> HORIZONTAL TAB CHARACTER /043 CJL CNTRLJ= "J&37 /<^J> LINEFEED CHARACTER /023 CJL CNTRLK= "K&37 /<^K> VERTICAL TAB CHARACTER /046 CJL CNTRLL= "L&37 /<^L> FORM FEED CHARACTER /046 CJL CNTRLM= "M&37 /<^M> CARRIAGE RETURN CHARACTER /023 CJL CNTRLN= "N&37 /<^N> /046 CJL CNTRLO= "O&37 /<^O> ECHO FLIP CHARACTER /023 CJL CNTRLP= "P&37 /<^P> PROGRAM RESTART CHARACTER /023 CJL CNTRLQ= "Q&37 /<^Q> OUTPUT RESUME CHARACTER /023 CJL CNTRLR= "R&37 /<^R> /046 CJL CNTRLS= "S&37 /<^S> OUTPUT WAIT CHARACTER /023 CJL CNTRLT= "T&37 /<^T> /046 CJL CNTRLU= "U&37 /<^U> /046 CJL CNTRLV= "V&37 /<^V> /046 CJL CNTRLW= "W&37 /<^W> /046 CJL CNTRLX= "X&37 /<^X> FILE ABORT CHARACTER /044 CJL CNTRLY= "Y&37 /<^Y> /046 CJL CNTRLZ= "Z&37 /<^Z> ABORT AND <EOF> CHARACTER /044 CJL DELETE= 177 /<DEL> DELETE OR <RO> CHARACTER /034 CJL LOWERC= "C&177+40 /LOWER-CASE C (CLOSE CHARACTER) /025 CJL UPPERC= "C&177 /UPPER-CASE C (CLOSE CHARACTER) /025 CJL / I/O AND FIELD DEFINITIONS. /019 CJL BUFFLD= 10 /I/O BUFFER FIELD /019 CJL DIRFLD= 10 /DIRECTORY LOOKUP BUFFER FIELD /028 CJL DMIFLD= 10 /DECMATE ONCE-ONLY CODE FIELD /046 CJL MSGFLD= 10 /TEXT MESSAGE FIELD /023 CJL PAGCNT= 2 /I/O BUFFER SIZE IN PAGES /019 CJL PRGFLD= 00 /PROGRAM FIELD /019 CJL USRFLD= 10 /USR FIELD /020 CJL / OS/8 MONITOR DEFINITIONS. /014 CJL SBOOT= 7600 /MONITOR EXIT LOCATION IS 07600 /014 CJL USR= 7700 /NON-LOCKED USR ENTRY POINT /035 CJL / USER SERVICE ROUTINE AND HANDLER DEFINITIONS. /020 CJL CLOSE= 4 /CLOSE TENTATIVE OUTPUT FILE /020 CJL ENTER= 3 /ENTER TENTATIVE OUTPUT FILE /020 CJL FETCH= 1 /FETCH HANDLER /020 CJL INQUIRE=12 /INQUIRE ABOUT HANDLER /020 CJL LOOKUP= 2 /LOOKUP FILE /020 CJL RESET= 13 /RESET DEVICE CONTROL WORD TABLE/037 CJL USRIN= 10 /LOCK USR IN CORE /020 CJL WRITE= 4000 /I/O CALL WRITE BIT /020 CJL / INSTRUCTION DEFINITIONS. CLCL= 6136 /CLEAR CLOCK FLAG (8/A, ETC.) /046 CJL CLSK= 6131 /SKIP ON, CLEAR CLOCK FLAG /046 CJL CLSK8A= 6137 /SKIP ON CLOCK FLAG (8/A, ETC.) /046 CJL COM= 0017 /COMPLEMENT AC DCAC= DCA . /CURRENT PAGE DCA INSTRUCTION /047 CJL IAAC= 6171 /"A" REGISTER TO AC IACA= 6167 /AC TO "A" REGISTER ISZC= ISZ . /CURRENT PAGE ISZ INSTRUCTION /050 CJL JMPC= JMP . /CURRENT PAGE JMP INSTRUCTION /047 CJL JMPIC= JMP I . /CURRENT PAGE JMP I INSTRUCTION /047 CJL JMSC= JMS . /CURRENT PAGE JMS INSTRUCTION /047 CJL JMSIC= JMS I . /CURRENT PAGE JMS I INSTRUCTION /047 CJL LINC= 6141 /GOTO LINC MODE PDP= 0002 /GOTO PDP-8 MODE PRQ3= 6236 /TYPE THREE PANEL REQUEST /046 CJL TADC= TAD . /CURRENT PAGE TAD INSTRUCTION /047 CJL R3L= 7014 /ROTATE AC (NOT LINK) LEFT 3 /046 CJL / NUMERIC LOAD DEFINITIONS. /014 CJL NL0000= CLA /LOAD AC WITH 0000 /046 CJL NL0001= CLA IAC /LOAD AC WITH 0001 /014 CJL NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 /014 CJL NL0003= CLA STL IAC RAL /LOAD AC WITH 0003 (8/I ON UP) /046 CJL NL0004= CLA CLL IAC RTL /LOAD AC WITH 0004 (8/I ON UP) /046 CJL NL0006= CLA STL IAC RTL /LOAD AC WITH 0006 (8/I ON UP) /046 CJL NL0010= CLA IAC RAL RAR /LOAD AC WITH 0010 (6120) /024 CJL NL0100= CLA IAC BSW /LOAD AC WITH 0100 (8/E ON UP) /024 CJL NL3776= CLA CLL CMA RAR RAL /LOAD AC WITH 3776 (8/I OR 8/L) /024 CJL NL3777= CLA CLL CMA RAR /LOAD AC WITH 3777 /046 CJL NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 /014 CJL NL5777= CLA CLL CMA RTR /LOAD AC WITH 5777 /046 CJL NL6000= CLA STL IAC RTR /LOAD AC WITH 6000 (8/I ON UP) /046 CJL NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 /014 CJL NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 /014 CJL NL7777= CLA CMA /LOAD AC WITH 7777 /014 CJL / DECMATE I COMMUNICATIONS PORT DEFINITIONS. /050 CJL IPORT0= 30 /COMMUNICATIONS PORT 0 INPUT DEVICE CODE RKFL0= IPORT0^10+6000 /SET COMMUNICATIONS PORT 0 INPUT FLAG RKSF0= IPORT0^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 0 INPUT FLAG RKCC0= IPORT0^10+6002 /CLEAR AC RKIE0= IPORT0^10+6005 /PORT 0 INPUT INTERRUPT ENABLE PER AC[11] RKRB0= IPORT0^10+6006 /READ COMMUNICATIONS PORT 0 INTO AC OPORT0= 31 /COMMUNICATIONS PORT 0 OUTPUT DEVICE CODE RTFL0= OPORT0^10+6000 /SET COMMUNICATIONS PORT 0 OUTPUT FLAG RTSF0= OPORT0^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 0 OUTPUT FLAG RTCF0= OPORT0^10+6002 /NOP RTIE0= OPORT0^10+6005 /PORT 0 OUTPUT INTERRUPT ENABLE PER AC[11] RTLS0= OPORT0^10+6006 /WRITE COMMUNICATIONS PORT 0 FROM AC IPORT1= 34 /COMMUNICATIONS PORT 1 INPUT DEVICE CODE RKFL1= IPORT1^10+6000 /SET COMMUNICATIONS PORT 1 INPUT FLAG RKSF1= IPORT1^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 1 INPUT FLAG RKCC1= IPORT1^10+6002 /CLEAR AC RKIE1= IPORT1^10+6005 /PORT 1 INPUT INTERRUPT ENABLE PER AC[11] RKRB1= IPORT1^10+6006 /READ COMMUNICATIONS PORT 1 INTO AC OPORT1= 35 /COMMUNICATIONS PORT 1 OUTPUT DEVICE CODE RTFL1= OPORT1^10+6000 /SET COMMUNICATIONS PORT 1 OUTPUT FLAG RTSF1= OPORT1^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 1 OUTPUT FLAG RTCF1= OPORT1^10+6002 /NOP RTIE1= OPORT1^10+6005 /PORT 1 OUTPUT INTERRUPT ENABLE PER AC[11] RTLS1= OPORT1^10+6006 /WRITE COMMUNICATIONS PORT 1 FROM AC PCON= 36 /PORT STATUS AND CONTROL DEVICE CODE SMFL= PCON^10+6000 /SET MODEM CHANGE FLAG MFSK= PCON^10+6001 /SKIP ON, CLEAR MODEM CHANGE FLAG WCON0= PCON^10+6002 /WRITE COMMUNICATIONS PORT 0 CONTROL REGISTER PSR= PCON^10+6003 /READ PORT STATUS REGISTER PMR= PCON^10+6004 /READ PORT MODEM REGISTER MFIE= PCON^10+6005 /LOAD MODEM CHANGE INTERRUPT ENABLE PER AC[11] WCON1= PCON^10+6006 /WRITE COMMUNICATIONS PORT 1 CONTROL REGISTER RACD= PCON^10+6007 /RESET ACTIVE COMMUNICATIONS PORT PER AC[0] / DECMATE II, ETC. COMMUNICATIONS PORT DEFINITIONS. /046 CJL PORTIN= 30 /COMMUNICATIONS PORT INPUT DEVICE CODE IFL= PORTIN^10+6000 /SET COMMUNICATIONS PORT INPUT/OUTPUT FLAG ISF= PORTIN^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT INPUT/OUTPUT FLAG ICF= PORTIN^10+6002 /NOP (CLEAR THE AC?) INOP1= PORTIN^10+6003 /(NOP?) IRS= PORTIN^10+6004 /READ COMMUNICATIONS PORT RECEIVE BUFFER IIE= PORTIN^10+6005 /COMMUNICATIONS PORT I/O INTERRUPT ENABLE PER AC[11] IRB= PORTIN^10+6006 /READ COMMUNICATIONS PORT RECEIVE BUFFER INOP2= PORTIN^10+6007 /(NOP?) PORTOUT=31 /COMMUNICATIONS PORT OUTPUT DEVICE CODE DUMBFL= PORTOUT^10+6000 /SET COMMUNICATIONS PORT DUMMY FLAG DUMBSF= PORTOUT^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT DUMMY FLAG DUMBCF= PORTOUT^10+6002 /NOP (CLEAR THE AC?) ONOP1= PORTOUT^10+6003 /(NOP?) OPC= PORTOUT^10+6004 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER DUMBIE= PORTOUT^10+6005 /COMMUNICATIONS PORT DUMMY INTERRUPT ENABLE PER AC[11] OLS= PORTOUT^10+6006 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER ONOP2= PORTOUT^10+6007 /(NOP?) PORTCON=36 /COMMUNICATIONS PORT CONTROL DEVICE CODE MFL= PORTCON^10+6000 /SET MODEM CHANGE FLAG MSF= PORTCON^10+6001 /SKIP ON, CLEAR MODEM CHANGE FLAG MLC= PORTCON^10+6002 /LOAD MODEM CONTROL REGISTER MSB= PORTCON^10+6003 /LOAD BAUD RATE REGISTER MRS= PORTCON^10+6004 /READ MODEM STATUS REGISTER MIE= PORTCON^10+6005 /MODEM CHANGE INTERRUPT ENABLE PER AC[11] MPSCC= PORTCON^10+6006 /ACCESS MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER MPRESET=PORTCON^10+6007 /RESET MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER / MISCELLANEOUS DEFINITIONS. /014 CJL / STATIC DATE CALCULATIONS. /024 CJL / THESE EQUATIONS CAUSE PRINTABLE TEXT OF THE DATE PARTICULARS, WHICH ARE GIVEN / IN OS/8 INTERNAL FORMAT. PROGRAM MAINTAINENCE REQUIRES THE UPDATE OF VERSION, / REVISION, REVDATE, AND REVDGRP. REVDATE AND REVDGRP SHOULD BE OBTAINED FROM / THE SYSTEM WHEN RELEASING A NEW VERSION AFTER FIRST CORRECTLY INVOKING THE / SYSTEM DATE COMMAND. / VERSION=[ANY NUMBER IN THE RANGE 00-143 (DECIMAL 00-99)] / REVISIO=[ANY SIX-BIT ALPHA (A-Z); DO NOT FORGET &77] / REVDATE=[THE CONTENTS OF 17666 (DATE WORD)] / REVDGRP=[THE CONTENTS OF 07777 (ONLY BITS[3-4] ARE USED)] IFNDEF REVDATE <REVDATE=4464> /REVISION DATE (LOCATION 17666) IFNDEF REVDGRP <REVDGRP=0400> /REVISION 8 YEAR DATE GROUP (LOCATION 07777) IFNDEF REVISIO <REVISIO="G&77> /REVISION OF KERMIT-12 IFNDEF VERSION <VERSION=12> /VERSION OF KERMIT-12 DAY= REVDATE&370%10 /REVISION DAY DGROUP= REVDGRP&600%20 /REVISION DATE GROUP (WHICH 8 YEARS) MONTH= REVDATE&7400%400 /REVISION MONTH YEAR= REVDATE&7+DGROUP+106 /REVISION YEAR (SINCE 1900) FIELD PRGFLD%10 /STARTING FIELD /038 CJL *0 /START AT THE BEGINNING /014 CJL INTPC, .-. /PC FROM INTERRUPT (IF ANY) /014 CJL JMP I INTPC /RETURN WITH INTERRUPTS OFF /014 CJL ABFLAG, .-. /FILE ABORT FLAG /044 CJL TABLEJU,.-. /MATCHING VALUE FOR SRCHTABLE ROUTINE /025 CJL IFNZRO .-4 <ERROR .> /014 CJL ODT, ZBLOCK 7-. /RESERVED FOR OS/8 ODT /014 CJL RATE, BRATE /BAUD RATE /050 CJL *10 /GET TO AUTO-INDEX AREA /014 CJL XR0, .-. /AUTO-INDEX ZERO /014 CJL XR1, .-. /AUTO-INDEX ONE /014 CJL DIRXR, PORT /DIRECTORY LOOKUP DEDICATED AUTO-INDEX /028 CJL /INITIALIZED FOR DECMATE I ONCE-ONLY /050 CJL / THE REMAINING LOCATIONS THROUGH 000017 MUST BE USED DIRECTLY ONLY, SO AS TO / NOT CAUSE INADVERTANT AUTO-INDEXING. / COLUMN COUNTER FOR CONSOLE ROUTINES (NEVER USED INDIRECTLY). /043 CJL COLUMN, .-. /CONSOLE OUTPUT COLUMN COUNTER /043 CJL / CONSOLE TERMINAL ECHO SWITCH (NEVER USED INDIRECTLY). /020 CJL ECHOSW, 0 /0=ECHO, 4000=DON'T ECHO /020 CJL / LATEST (NON-CONNECT MODE) CHARACTER (NEVER USED INDIRECTLY). /043 CJL INCHAR, .-. /LATEST INPUT CHARACTER FROM CONSOLE /043 CJL / CURRENT KERMIT MODE (NEVER USED INDIRECTLY). /025 CJL KMODE, .-. /CURRENT MODE OF KERMIT /025 CJL / KERMIT MODE FLAG VALUES. /014 CJL / MLINE= 1 /KERMIT IS ON-LINE MSEND= 2 /KERMIT IS IN SEND MODE MREC= 3 /KERMIT IS IN RECEIVE MODE / LATEST CHARACTER SENT TO OUTPUT FILE (NEVER USED INDIRECTLY). /020 CJL LATEST, .-. /LATEST CHARACTER SENT TO OUTPUT FILE /020 CJL *20 /GET PAST AUTO-INDEX AREA INFLAG, .-. /DECMATE INPUT AVAILABLE FLAG /046 CJL OUTFLAG,.-. /DECMATE OUTPUT AVAILABLE FLAG /046 CJL TEMP, 0 RCHAR, 0 /REMOTE LINE CURRENT INPUT CHAR SCAN1, 0 / SCAN2, 0 / KEYDSP, 0 /DISPATCH ADDRESS FOR KEYWORD MATCH BININP, 0 /BINARY REGISTER FOR DECIMAL INPUT PTABLE, 0 / LPTR, 0 /HOLDS LINE POINTER STATE, 0 /CURRENT STATE RETRY, -RETCNT /PACKET ERROR RETRY COUNTER /031 CJL RTRYC, 0 /USE THIS FOR ACTUAL COUNTER / CURRENT PACKET I/O DATA. /014 CJL PAKPTR, 0 /POINTER TO OUTPUT PACKET POINTER PAKCKS, 0 /HOLDS CURRENT OUTPUT PACKET CHECKSUM TOTAL CURSEQ, 0 /CURRENT SEQ NUMBER QFLAG, 0 /NON-ZERO WHEN NO CONTROL QUOTING / RECEIVE "INIT" REGISTERS. /014 CJL RMAXL, DEFMAXL+40 /MAX LENGTH FOR DATA PACKET (DEFAULT) RTIME, 0 /TIME-OUT VALUE RNPAD, 0 /NUMBER OF PADDING CHARS RPADC, 0 /CHAR USED FOR PADDING REOL, DEFEOL /TERMINATOR CHAR USED FOR END OF PACKET RQCTL, DEFQCTL /CONTROL CHAR PREFIX CHAR RQBIN, 0 /PARITY CHAR PREFIX CHAR (CHARS GT 177) RCHKT, DEFCK /CHECKSUM TYPE (DEFAULT TYPE 1) RREPT, 0 /PREFIX CHAR FOR REPEATED CHARS RCAPAS, 0 /EXTRA CAPABILITY BIT MASK / ZBLOCK 4 /RESERVED FOR EXTRA CAPABILITIES /022 CJL INITEND=. /END OF INIT REGISTERS /022 CJL HNDADR, 0 /FILE DEVICE HANDLER ADDRESS FORCEP, 0 /FLAG FOR FORCED OUTPUT OF PACKET WHEN THERE IS / NO DATA (JUST SOH, LEN, SEQ, AND CHECKSUM) PRSERR, 0 /HOLDS PARSE POSITION FOR REPORTING ERRORS PACK6P, 0 /POINTER TO STORAGE OF 6 BIT CHARS PACK6F, 0 /FLAG FOR WHICH BYTE TO STORE GET6P, 0 /POINTER USED IN THE GET6 ROUTINE GET6F, 0 /FLAG USED IN THE GET6 ROUTINE MOVE4, 0 /COUNTER FOR "MOVE" INIFLG, 0 /INIT DONE FLAG MQ, .-. /"MQ" TEMPORARY REGISTER /032 CJL / FILE NAME PARSE REGISTERS. /014 CJL FNPTR, 0 /POINTER TO WHERE TO PUT A PARSED FILE NAME WILDF, 0 /WILD CARD IN FILE NAME FLAG / FILE INFORMATION. /014 CJL FSBLK, 0 /FILE START BLOCK FLEN, 0 /FILE LENGTH DEVNUM, 0 /PARSED DEVICE NUMBER HERE OFFLG, 0 /OUTPUT FILE OPEN FLAG ODNAME, 0 /POINTER TO USER SPECIFIED DEVICE FOR OUTPUT ODNUMB, 0 /OUTPUT DEVICE NUMBER / PARITY VARIABLES. /014 CJL /MARK, 0200 /SET BIT [8] FOR COMMAND INPUTS /A013 /PARITY,0 /PARITY MASK (0=SPACE, 200=MARK) /AM013 / INTERNAL FILE MODE FLAG. /019 CJL FILMODE,FMODE /ASCII=0177, BINARY=4377 /019 CJL / UPPER-CASE ONLY FLAG. /023 CJL UPONLY, LOWER /0=UPPER/LOWER CASE, -40=UPPER-CASE ONLY/030 CJL / <^C> DISPATCH ADDRESS. /023 CJL UCADDRE,SBOOT /<^C> ADDRESS SHOULD BE SET AS NECESSARY/023 CJL / <^P> DISPATCH ADDRESS. /023 CJL UPADDRE,CHKCLR /<^P> ADDRESS SHOULD BE SET AS NECESSARY/023 CJL / ESCAPE CHARACTER FOR CONNECT MODE. /025 CJL ESCHAR, ESCAPE /ESCAPE CHARACTER FOR CONNECT MODE /025 CJL / FLOW CONTROL FLAG. /026 CJL FLOWFLA,-FLOW /0=NO FLOW CONTROL, 7777=FLOW CONTROL /049 CJL /VIA <^S>/<^Q> / KEYBOARD INPUT ERROR FLAG. /026 CJL KEYERRO,.-. /0=NO ERROR, NON-ZERO=BAD CHARACTER /026 CJL /OR BUFFER OVERRUN / REMOTE LINE INPUT ERROR FLAG. /026 CJL RINERRO,.-. /0=NO ERROR, NON-ZERO=BAD CHARACTER /026 CJL /OR BUFFER OVERRUN / REMOTE LINE OUTPUT FLOW CONTROL WAIT FLAG. /026 CJL REMWAIT,.-. /0=DON'T WAIT, 4000=WAIT FOR <^Q> /026 CJL / REMOTE INPUT WAIT FLAG. /026 CJL / FLAG STATES: / VALUE ACTION / 0000 BUFFER IS LESS THAN 3/4 FULL. INPUT FREELY ALLOWED / WITHOUT FLOW CONTROL RESTRICTIONS. IF BUFFER BECOMES / 3/4 FULL AND FLOW CONTROL IS IN EFFECT THEN CHANGE / STATE TO 0001. / 0001 BUFFER IS NOW 3/4 FULL. OUTPUT <^S> TO REMOTE AND / THEN CHANGE STATE TO 4000. / 4000 WAITING FOR BUFFER TO EMPTY TO LESS THAN 1/4 FULL. IF / FLOW CONTROL IS BEING OBEYED, THEN BUFFER SHOULD NOW / BE EMPTYING. / 7777 BUFFER IS NOW LESS THAN 1/4 FULL. OUTPUT <^Q> TO / REMOTE AND THEN CHANGE STATE TO 0000. RINWAIT,.-. /REMOTE INPUT WAIT FLAG /026 CJL / REMOTE LINE OUTPUT BUFFER POINTERS. /026 CJL REMINSE,.-. /REMOTE OUTPUT INSERTION POINTER /026 CJL REMREMO,.-. /REMOTE OUTPUT REMOVAL POINTER /026 CJL / POINTER FOR THE PACKET INPUT AND OUTPUT ROUTINES SPACK= JMS I . /SEND A PACKET TO REMOTE SPACK0 /PUT IN A POINTER FPACK= JMS I . /FORMAT PACKET FPACK0 /PUT IN THE POINTER RPACK= JMS I . /RECEIVE A PACKET FROM REMOTE ILINK /PUT IN A POINTER / POINTERS FOR OUTPUT ROUTINES PRI8B= JMS I . /PRINT 8 BIT STRING ON TTY PRI8B0 /PUT IN THE POINTER REM8B= JMS I . /SEND 8 BIT STRING DOWN REMOTE LINE REM8B0 /PUT IN THE POINTER / MISC. PACK6= JMS I . /DEFINE CALL TO ROUTINE PACK60 /POINTER TO ROUTINE GET6= JMS I . /DEFINE THE INSTRUCTION GET60 /PUT IN THE POINTER MOVE= JMS I . /DEFINE CALL TO MOVE ROUTINE MOVE0 /POINTER CLEAR= JMS I . /DEFINE CALL FOR "CLEAR" ROUTINE CLEAR0 /POINTER PAGE /START ON NEW PAGE /A014 CJL / KERMIT-12 PROGRAM STARTS HERE. /A014 CJL CLOOP, JMP I (INITIALIZE) /**** INITIALIZED **** CLA CLL /024 CJL JMS I [CRESET] /RESET CONSOLE ROUTINE STUFF DCA ABFLAG /CLEAR ABORT FLAG /044 CJL DCA REMWAIT /CLEAR REMOTE FLOW CONTROL WAIT /049 CJL CLDMZAP,JMS DMINIT /INITIALIZE DECMATE PORT /048 CJL / THE PREVIOUS INSTRUCTION IS FOR DECMATE OPERATION ONLY. THE DEFAULT / INSTRUCTION IS FOR KL8 INTERFACES ONLY. *CLDMZAP /OVERLAY DECMATE CODE /048 CJL CLDMZAP,NOP /DON'T INITIALIZE DECMATE PORT /048 CJL TAD RATE /GET BAUD RATE SETBAUD,MSB /SET REMOTE BAUD RATE /050 CJL / THE PREVIOUS INSTRUCTION IS FOR DECMATE II OPERATION ONLY. /050 CJL *SETBAUD /OVERLAY DECMATE II CODE /050 CJL SETBAUD,NOP /NOT APPLICABLE ON DECMATE I /050 CJL / THE PREVIOUS INSTRUCTION IS FOR DECMATE I OPERATION ONLY. THE DEFAULT / INSTRUCTION IS FOR KL8 INTERFACES ONLY. *SETBAUD /OVERLAY DECMATE I CODE /050 CJL SETBAUD,RSBIOT /SET REMOTE BAUD RATE /050 CJL JMS I [SCRIBE] /DO A /025 CJL CRLF /<CR>, <LF> /025 CJL JMS I [SCRIBE] /GIVE THEM THE /025 CJL PRMTMSG /PROMPT MESSAGE /025 CJL JMS I (LININP) /GET INPUT LINE FROM USER TAD (CMDTBL) /GET ADDRESS OF PARSE TABLE /M014 CJL DCA PTABLE /STORE FOR PARSER TAD (LINBUF) /GET INPUT LINE BUFFER ADDRESS /M014 CJL CLOOP1, JMS I (KEYPRS) /PARSE OFF A KEYWORD JMP CLOOP9 /NO MATCH ON KEYWORD JMP CLOOP /END OF LINE DETECTED DCA LPTR /STORE POINTER TO NEXT POS ON LINE JMS I KEYDSP /DISPATCH TO SERVICE JMP CLOOP7 /ERROR RETURN FROM SERVICE DISPATCH TAD LPTR /RE-GET COMMAND LINE POINTER JMP CLOOP1 /CONTINUE LINE PARSE CLOOP7, SNA /SKIP IF A RETURNING MESSAGE PASSED /029 CJL JMP CLOOP /JUST GO BACK TO COMMAND LOOP /029 CJL DCA RETARG /STORE IN-LINE /029 CJL JMS I [SCRIBE] /CALL MESSAGE PRINT ROUTINE RETARG, .-. /WILL BE PASSED MESSAGE ADDRESS JMP CLOOP /KEEP GOING CLOOP9, JMS I [SCRIBE] /COMPLAIN OF /025 CJL CMERMSG /BAD COMMAND /025 CJL JMP CLOOP /GO AGAIN / ROUTINE TO FORMAT A PACKET OF DATA / CALL: FPACK / DATA ADDRESS (DATA MUST ALREADY BE CONTROL/QUOTED AND MUST / NOT BE LONGER THAN THE LARGEST PACKET) / PACKET TYPE FPACK0, 0 CLA CLL /INSURE CLEAR AC TAD I FPACK0 /GET THE DATA ADDRESS DCA FP1 /STORE IN SOURCE POINTER ISZ FPACK0 /BUMP ARGUMENT POINTER TAD I FPACK0 /NOW GET TYPE DCA I (RSTYP) /STORE ISZ FPACK0 /BUMP ARGUMENT POINTER TAD (RSDTA /GET ADDRESS OF DATA BUFFER DCA FP2 /STORE IN DESTINATION POINTER TAD (40+3 /SET FOR LENGTH COUNTER DCA I (RSLEN) /STORE IN PACKET DCA FP3 /INIT CHECKSUM TAD CURSEQ /GET CURRENT SEQ NUMBER AND [77] /MODULO 64 /014/016 CJL TAD [40] /TAKE CHAR(SEQUENCE NUMBER) /014/016 CJL DCA I (RSSEQ) /PUT INTO PACKET FPACK2, TAD I FP1 /GET A CHAR FROM SOURCE SPA /SKIP IF NOT END JMP FPACK3 /END TAD FP3 /COMBINE WITH CHECKSUM DCA FP3 /AND RETURN TAD I FP1 /GET CHAR BACK AGAIN DCA I FP2 /NOW PUT INTO DESTINATION ISZ I (RSLEN) /BUMP THE LENGTH ISZ FP1 /BUMP THE SOURCE POINTER ISZ FP2 /BUMP THE DESTINATION POINTER JMP FPACK2 /LOOP FPACK3, CLA CLL /CLEAR THE AC TAD FP3 /GET CALCULATED CHECKSUM TAD I (RSLEN) /INCLUDE THE LENGTH TAD I (RSSEQ) /AND THE SEQUENCE TAD I (RSTYP) /AND THE TYPE JMS I [CKSUM] /GET IT CORRECT DCA I FP2 /STORE WITH PACKET ISZ FP2 /BUMP PACKET POINTER TAD REOL /GET ANY END OF LINE TO INCLUDE TAD [-40] /MAKE IT A REAL CHARACTER /014/016 CJL SNA /SKIP IF EOL CHAR REQUIRED JMP FPACK4 /NO EOL CHAR DCA I FP2 /STORE EOL CHAR WITH PACKET ISZ FP2 /BUMP POINTER FPACK4, NL7777 /SET -1 /032 CJL DCA I FP2 /PACKET NOW COMPLETE TAD RETRY /SET UP RE-TRY COUNTER DCA RTRYC ISZ CURSEQ /BUMP SEQUENCE NUMBER FOR NEXT TIME NOP /PROTECT ISZ JMP I FPACK0 /RETURN FP1, 0 /POINTER TO SOURCE DATA FP2, 0 /POINTER TO PACKET BUFFER FP3, 0 /RUNNING CHECKSUM / DECMATE INITIALIZE ROUTINE. /048 CJL DMINIT, .-. /DECMATE PORT INITIALIZE ROUTINE/048 CJL DMI01, TAD DM234/(234) /GET SCD ENABLE VALUE /050 CJL DMI02, WCON0 /WRITE CONTROL REGISTER 0 (1) /050 CJL DMI03, NL0000 /INDICATE PORT 0 (1) /050 CJL DMI04, RACD /RESET THE ACTIVE PORT /050 CJL DMI05, ISZ DMWASTE /WASTE /050 CJL DMI06, JMP DMI05 /SOME TIME /050 CJL DMI07, ISZ DMWASTE /WASTE /050 CJL DMI08, JMP DMI07 /SOME TIME /050 CJL DMI09, RTFL0 /SET PORT 0 (1) OUTPUT FLAG /050 CJL DMI10, TAD DM2516/(2516) /SETUP FOR 8 BITS, NO PARITY /050 CJL DMI11, JMS DMSEND /SEND TO MODE REGISTER 1 /050 CJL DMI12, TAD RATE /GET BAUD RATE /050 CJL DMI13, TAD DM2460/(2460) /ADD ON CLOCK ENABLE VALUES /050 CJL DMI14, JMS DMSEND /SEND TO MODE REGISTER 2 /050 CJL DMI15, TAD DM3425/(3425) /GET ENABLE AND RESET VALUE /050 CJL DMI16, JMS DMSEND /SEND TO COMMAND REGISTER /050 CJL DMI17, RKRB0 /DO A DUMMY READ ON PORT 0 (1) /050 CJL / THE PREVIOUS INSTRUCTIONS ARE FOR DECMATE I OPERATION ONLY. THE DEFAULT / INSTRUCTIONS ARE FOR DECMATE II, ETC. INTERFACES ONLY. *DMI01 /OVERLAY DECMATE I CODE /050 CJL DMI01, ISZ DMWASTE /WASTE /048 CJL DMI02, JMP DMI01 /SOME TIME /048 CJL DMI03, ISZ DMWASTE /WASTE /048 CJL DMI04, JMP DMI03 /SOME TIME /048 CJL DMI05, ISF /SKIP ON AND CLEAR PORT FLAG /048 CJL DM50, 50/NOP /JUST IN CASE /048 CJL DMI07, IRB /READ THE PORT BUFFER /048 CJL DMI08, CLA /CLEAN UP /048 CJL DMI09, TAD DM50/(50) /GET OUTPUT INTERRUPT VALUE /048 CJL DMI10, MPSCC /CLEAR OUTPUT INTERRUPT /048 CJL DMI11, TAD (60-50) /GET ERROR RESET VALUE /048 CJL DMI12, MPSCC /CLEAR OVERRUN ERRORS /048 CJL DMI13, TAD (70-60) /SET END OF INTERRUPT VALUE /048 CJL DMI14, MPSCC /CLEAR THE INTERRUPT /048 CJL DMI15, DCA OUTFLAG /INDICATE OUTPUT IS AVAILABLE /048 CJL DMI16, DCA INFLAG /CLEAR INPUT AVAILABLE FLAG /048 CJL DMI17, JMP I DMINIT /RETURN /048 CJL / DECMATE I INITIALIZE CODE CONTINUES HERE. /050 CJL DMISET, RTFL0 /SET PORT 0 (1) OUTPUT FLAG /050 CJL CLA /CLEAN UP /050 CJL JMP I DMINIT /RETURN /050 CJL DMSEND, .-. /DECMATE I SEND ROUTINE /050 CJL DMISKP, RTSF0 /SKIP ON PORT 0 (1) OUTPUT FLAG /050 CJL JMP DMISKP /WAIT FOR IT /050 CJL DMIOUT, RTLS0 /SEND TO PORT 0 (1) REGISTER /050 CJL CLA /CLEAN UP /050 CJL JMP I DMSEND /RETURN /050 CJL DMWASTE,.-. /TIMER TEMPORARY /050 CJL DM234, 234 /CONSTANT 0234 /050 CJL DM2460, 2460 /CONSTANT 2460 /050 CJL DM2516, 2516 /CONSTANT 2516 /050 CJL DM3425, 3425 /CONSTANT 3425 /050 CJL PAGE / ROUTINE TO SEND THE FORMATTED PACKET /027 CJL / ARGUMENTS: CALL+1 NON-ZERO = AWAIT RESPONSE / ZERO = DO NOT AWAIT RESPONSE / CALL + 2 DISPATCH TABLE-2 /027 CJL SPACK0, 0 REM8B; RSBUF /SEND PACKET JUST COMPLETED TAD I SPACK0 /DO WE GET A RESPONSE? ISZ SPACK0 /BUMP POINTER PAST ARGUMENT SNA CLA /SKIP IF YES JMP I SPACK0 /ALL DONE HERE RPACK /GET PACKET BACK FROM REMOTE TAD I SPACK0 /DID WE WANT A DISPATCH? ISZ SPACK0 /BUMP PAST ARGUMENT SNA /SKIP IF YES JMP I SPACK0 /EXIT IF NO DCA SPACARG /STORE IN-LINE /031 CJL JMS DISPATCH /CALL DISPATCH ROUTINE /031 CJL SPACARG,.-. /WILL BE DISPATCH TABLE-2 /031 CJL JMP I SPACK0 /NOT FOUND, GOTTA RETURN / CONSOLE RESET ROUTINE. /024 CJL CRESET, .-. /CONSOLE RESET ROUTINE CLA CLL /CLEAN UP DCA ECHOSW /ENABLE OUTPUT ECHO TAD (UPCPRT) /ALLOW THEM TO DCA UCADDRESS /RESTART VIA <^C> TAD [CLOOP] /ALLOW THEM TO DCA UPADDRESS /RESTART VIA <^P> JMP I CRESET /RETURN / ALTERNATE CONSOLE RESET ROUTINE. /025 CJL CREST2, .-. /ALTERNATE CONSOLE RESET ROUTINE JMS CRESET /CLEAR AC AND ENABLE OUTPUT ECHO TAD (KCCZAP) /RENDER <^C> DCA UCADDRESS /TOTALLY HARMLESS TAD (CHKCLR) /MAKE <^P> PRINT "^P" DCA UPADDRESS /AND THEN GO AWAY JMP I CREST2 /RETURN / ROUTINE TO CLEAR WORDS OF MEMORY / ENTER WITH: AC = MINUS NUMBER OF WORDS TO CLEAR / MQ = ADDRESS OF WHERE TO START THE CLEAR CLEAR0, 0 DCA CLEAR5 /STORE COUNT OF WORDS TAD MQ /GET ADDRESS TO CLEAR /032 CJL DCA CLEAR6 /STORE IN POINTER DCA I CLEAR6 /ZERO A WORD ISZ CLEAR6 /BUMP POINTER ISZ CLEAR5 /BUMP COUNTER JMP .-3 /LOOP JMP I CLEAR0 /DONE CLEAR5, 0 /TEMP FOR "CLEAR" ROUTINE CLEAR6, 0 /TEMP FOR "CLEAR" ROUTINE / ROUTINE TO DISPATCH TO ROUTINE BASED ON VALUE OF "RRTYP". /027 CJL / CALLING SEQUENCE: / CLA /AC MUST BE CLEAR / JMS DISPATCH /CALL ROUTINE / ADDRESS-2 /DISPATCH TABLE ADDRESS-2 / NO MATCH RETURN /RETURNS HERE WITH CLEAR AC IF NO MATCH / CALL WILL DISPATCH TO THE CORRESPONDING ROUTINE ON A MATCH IN THE SPECIFIED / TABLE (WHICH ENDS WITH ZERO) WITH A CLEAR AC. DISPATC,.-. /MATCH "RRTYP" AND DISPATCH ROUTINE CLA /JUST IN CASE /031 CJL TAD I DISPATCH /GET PASSED ARGUMENT ISZ DISPATCH /BUMP PAST THE ARGUMENT DCA DISPA2 /SAVE PASSED ARGUMENT IN-LINE TAD I (RRTYP) /GET VALUE OF "RRTYP" CIA /INVERT FOR TESTING JMS I [SRCHTABLE] /CALL TABLE SEARCH ROUTINE DISPA2, .-. /WILL BE TABLE ADDRESS-2 SNA CLA /SKIP IF MATCH FOUND JMP I DISPATCH /RETURN ON NO MATCH JMP I TABLEJUMP /DISPATCH TO MATCHING ADDRESS / ROUTINE TO PUT CHARS INTO A BUFFER TO GET READY TO FORMAT A PACKET. / ENTER WITH CHAR IN THE AC; IF THE CHAR NEEDS CONTROL QUOTING, IT WILL BE ADDED / EXIT + 2 IF EVERYTHING IS OK / EXIT + 1 IF BUFFER IS FULL OPBUF, 0 /PUT CHARACTERS INTO BUFFER FOR PACKET ROUTINE JMS I (OPRE) /CHECK FOR PREFIX JMP OPBUF1 /NO PREFIX DCA OP1 /SAVE CONVERTED CHAR TAD RQCTL /GET QUOTE CHAR TO USE DCA I OP2 /PUT RETURNED PREFIX INTO BUFFER ISZ OP2 /BUMP POINTER TAD OP1 /GET BACK CONVERTED CHAR OPBUF1, DCA I OP2 /PUT INTO BUFFER ISZ OP2 /BUMP POINTER NL7777 /SET -1 /032 CJL DCA I OP2 /ALWAYS TERMINATE BUFFER TAD RMAXL /GET MAX BUFFER LENGTH TAD (-40+HOLDBF-4 / CIA TAD OP2 /COMPARE WITH WHAT WE HAVE SPA CLA /SKIP IF NO ROOM JMP OPBUF2 /HAVE ROOM JMS INIOPB /RESET BUFFER JMP I OPBUF /TAKE RETURN + 1 OPBUF2, ISZ OPBUF /BUMP RETURN FOR BUFFER NOT FULL JMP I OPBUF /DONE OP1, 0 /TEMP LOCATION OP2, HOLDBF /POINTER FOR HOLD BUFFER / ROUTINE TO RE-SET THE HOLD BUFFER. INIOPB, 0 TAD (HOLDBF /RE-SET BUFFER POINTER DCA OP2 JMP I INIOPB / ROUTINE TO CALCULATE A 1 BYTE CHECKSUM. CKSUM, 0 DCA CKSUM1 /STORE TEMP TAD CKSUM1 /GET BACK RTR;RTR;RTR /GET TWO HIGHEST INTO TWO LOWEST /032 CJL AND (3 /KEEP ONLY BITS 0-1 TAD CKSUM1 /GET ORIGINAL AND [77] /KEEP ONLY BITS 0-5 /016 CJL TAD [40] /MAKE A CHAR(CHECKSUM) JMP I CKSUM /DONE, RETURN IN AC CKSUM1, 0 /TEMP FOR "CKSUM" PAGE / ROUTINE TO INPUT CHARS FROM REMOTE UNTIL A "SOH" CHAR IS FOUND. GETSOH, 0 JMS COMIN /GET A CHARACTER FROM THE REMOTE LINE /046 CJL JMP I GETSOH /TIME-OUT AND [177] /IGNORE PARITY BIT /034 CJL TAD (-CNTRLA) /COMPARE WITH "SOH" /034 CJL SZA CLA /SKIP IF SAME JMP GETSOH+1 /LOOP TILL WE GET ONE ISZ GETSOH /BUMP FOR GOOD RETURN JMP I GETSOH /GOT ONE, DONE / ROUTINE TO GET A CHAR FROM THE REMOTE LINE AND UPDATE CHECKSUM. GETIR, 0 JMS COMIN /GET A CHARACTER FROM THE REMOTE LINE /046 CJL JMP I GETIR /TIME-OUT RETURN DCA GETIR1 /STORE TEMP TAD GETIR1 /GET CHAR BACK TAD I (ILINK9) /ADD CHECKSUM DCA I (ILINK9) /RETURN UPDATED CHECKSUM TAD GETIR1 /RE-GET CURRENT INPUT CHAR TAD [-15] /CHECK FOR A RETURN SNA CLA /SKIP IF NOT A RETURN JMP I GETIR /WAS A RETURN, TAKE EXIT + 1 TAD GETIR1 /RE-GET CHAR FOR RETURN ISZ GETIR /BUMP FOR GOOD RETURN JMP I GETIR /AND RETURN IN THE AC GETIR1, 0 /TEMP LOCAL TO "GETIR" / REMOTE COMMUNICATIONS ROUTINES FOR NON-CONNECT USAGE. /046 CJL / REMOTE INPUT ROUTINE. /046 CJL COMIN, .-. /REMOTE INPUT ROUTINE /046 CJL CLA /CLEAN UP /046 CJL TAD [-15] /SETUP THE /049 CJL DCA TIMEOUT /TIME-OUT FACTOR /046 CJL INLUP, TAD INFLAG /IS INPUT AVAILABLE? /046 CJL / THE ABOVE INSTRUCTION IS FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTION IS / FOR KL8 INTERFACES. *INLUP /OVERLAY DECMATE II CODE /049 CJL INLUP, SKP /WE'RE NOT A DECMATE II /049 CJL SNA CLA /SKIP IF INPUT AVAILABLE (ON DECMATE II)/049 CJL INSKIP, JMP NOTYET /JUMP IF NOT /049 CJL INLUP1, DCA INFLAG /CLEAR INPUT AVAILABILITY FLAG /049 CJL INREAD, IRB /GET THE CHARACTER /049 CJL / THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS / ARE FOR KL8 INTERFACES. *INSKIP /OVERLAY DECMATE II CODE /049 CJL INSKIP, RKSFIOT /INPUT FLAG UP? /049 CJL INLUP1, JMP NOTYET /NO, CHECK FOR ABORT, ETC. /049 CJL INREAD, RKRBIOT /YES, READ IN THE CHARACTER /049 CJL AND [177] /JUST SEVEN-BIT /046 CJL DCA RCHAR /SAVE THE CHARACTER /046 CJL TAD RCHAR /GET IT BACK /046 CJL ISZ COMIN /BUMP TO GOOD RETURN /046 CJL JMP I COMIN /RETURN /046 CJL / COMES HERE IF INPUT NOT AVAILABLE. NOTYET, JMS I (CTLCTST) /CHECK FOR <^C>, ETC. /044 CJL TAD [-CNTRLZ] /COMPARE POSSIBLE CHARACTER TO <^Z> /044 CJL SZA /SKIP IF IT ALREADY MATCHES /044 CJL TAD [-CNTRLX+CNTRLZ]/ELSE COMPARE TO <^X> /044 CJL SNA CLA /SKIP IF NEITHER ABORT CHARACTER /049 CJL ISZ ABFLAG /SET ABORT FLAG /049 CJL SKP /SKIP IF NOT TOO MANY TIMES /049 CJL JMP .-2 /ENSURE FLAG SETTING /049 CJL INSTATU,JMS UPSTATUS /UPDATE THE PORT STATUS /049 CJL / THE ABOVE INSTRUCTION IS FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTION IS / FOR KL8 INTERFACES. *INSTATUS /OVERLAY DECMATE II CODE /049 CJL INSTATU,NOP /WE'RE NOT A DECMATE II /049 CJL ISZ WASTIME /WASTE SOME TIME /046 CJL JMP INLUP /KEEP TRYING /046 CJL ISZ TIMEOUT /WAITING TOO LONG? /046 CJL JMP INLUP /NO, KEEP TRYING /046 CJL JMP I COMIN /YES, TAKE ERROR RETURN /046 CJL / FLOW-CONTROL STATUS ROUTINE. /049 CJL GETFLOW,.-. /GET FLOW-CONTROL STATUS GETFL1, JMS UPSTATUS /UPDATE THE CURRENT STATUS / THE ABOVE INSTRUCTION IS FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTION IS / FOR KL8 INTERFACES. *GETFL1 /OVERLAY DECMATE II CODE GETFL1, NOP /WE'RE NOT A DECMATE II JMS I (RINGET) /GET REMOTE CHARACTER (IF ANY) CLA /THROW IT AWAY TAD REMWAIT /GET REMOTE FLOW STATUS JMP I GETFLOW /RETURN / REMOTE OUTPUT ROUTINE. /046 CJL COMOUT, .-. /REMOTE OUTPUT ROUTINE /046 CJL DCA OUTEMP /SAVE PASSED VALUE /046 CJL CMRESET,TAD [-15] /SETUP THE /049 CJL DCA OTIME /TIME-OUT COUNTER /049 CJL COMWAIT,JMS GETFLOW /GET REMOTE WAIT STATUS /049 CJL / THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY. THE DEFAULT INSTRUCTION IS FOR / KL8 INTERFACES. *COMWAIT /OVERLAY DECMATE CODE /049 CJL COMWAIT,NL7777 /SETUP FOR FLOW CONTROL FLAG LOAD /049 CJL AND FLOWFLAG /SHOULD WE WAIT FOR REMOTE FLOW CONTROL?/049 CJL SNA CLA /SKIP IF SO /049 CJL JMP NOWAIT /JUMP IF NOT /049 CJL FLOWAIT,JMS GETFLOW /GET REMOTE WAIT STATUS /049 CJL SZA CLA /SKIP IF NOT WAITING /049 CJL JMP FLOWAIT /JUMP IF STILL WAITING /049 CJL NOWAIT, TAD OUTFLAG /CHECK IF OUTPUT IS AVAILABLE /049 CJL CMOUT1, SNA CLA /SKIP IF SO /049 CJL CMOUT2, JMP OWAIT /JUMP IF NOT /049 CJL DM1AND, DCA OUTFLAG /CLEAR OUTPUT AVAILABILITY FLAG /049 CJL CMOUT3, TAD OUTEMP /GET THE PASSED VALUE /049 CJL CMOUT4, OLS /OUTPUT IT /049 CJL / THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS / ARE FOR KL8 INTERFACES. *NOWAIT /OVERLAY DECMATE II CODE /049 CJL NOWAIT, RTSFIOT /OUTPUT FLAG UP? /049 CJL CMOUT1, JMP OWAIT /NO, WAIT FOR IT THERE /049 CJL / THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS / FOR KL8 INTERFACES. *CMOUT1 /OVERLAY DECMATE I CODE /049 CJL CMOUT1, JMP COMWAIT /NO, WAIT FOR IT /049 CJL CMOUT2, TAD OUTEMP /YES, GET PASSED VALUE /049 CJL DM1AND, AND [377] /ENSURE EIGHT BITS (FOR DECMATE I) /049 CJL / THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS / FOR KL8 INTERFACES. *DM1AND /OVERLAY DECMATE I CODE /049 CJL DM1AND, SKP /WE'RE NOT A DECMATE I /049 CJL CMOUT3, TAD [400] /FORCE OUTPUT WRITE FOR DECMATE I /049 CJL CMOUT4, RTLSIOT /OUTPUT THE CHARACTER /049 CJL CLA /CLEAN UP /049 CJL JMP I COMOUT /RETURN /049 CJL / COMES HERE IF OUTPUT NOT READY. /049 CJL OWAIT, ISZ OWASTE /WASTE SOME TIME /049 CJL JMP COMWAIT /KEEP TRYING /049 CJL ISZ OTIME /WAITING TOO LONG? /049 CJL JMP COMWAIT /NO, KEEP TRYING /049 CJL JMS I (DMINIT) /YES, RESET EVERYTHING /049 CJL JMP CMRESET /TRY, TRY AGAIN /049 CJL / DECMATE II, ETC. STATUS UPDATE ROUTINE. /046 CJL UPSTATU,.-. /UPDATE THE STATUS ROUTINE /046 CJL ISF /COMMUNICATIONS PORT FLAG UP? /046 CJL JMP I UPSTATUS /NO, RETURN /046 CJL NL4000 /SETUP READ OF REGISTER ZERO /046 CJL MPSCC /TELL THE MPSCC CHIP /046 CJL CLA /CLEAN UP /046 CJL MPSCC /READ REGISTER ZERO NOW /046 CJL AND (5) /JUST INPUT AND OUTPUT BITS /046 CJL CLL RAR /MOVE INPUT TO LINK /046 CJL SNA CLA /SKIP IF OUTPUT INTERRUPT /046 CJL JMP INCHK /JUMP IF NOT /046 CJL TAD (050) /GET OUTPUT CLEAR VALUE /046 CJL MPSCC /CLEAR THE OUTPUT INTERRUPT /046 CJL DCA OUTFLAG /INDICATE OUTPUT AVAILABLE NOW /046 CJL INCHK, CLA RAL /GET RECEIVE STATUS /046 CJL SZA /SKIP IF INPUT NOT AVAILABLE RIGHT NOW /046 CJL DCA INFLAG /INDICATE NEW INPUT STATUS /046 CJL CLA /CLEAN UP EITHER WAY /046 CJL TAD (070) /GET END OF INTERRUPT VALUE /046 CJL MPSCC /CLEAR THE INTERRUPT /046 CJL CLA /CLEAN UP /046 CJL JMP I UPSTATUS /RETURN /046 CJL AND377= AND [377] /INSTRUCTION CONSTANT /049 CJL OUTEMP= COMIN /OUTPUT ROUTINE TEMPORARY /049 CJL TIMEOUT=GETFLOW /TIME-OUT TEMPORARY /049 CJL WASTIME=COMOUT /TIME-OUT TEMPORARY /049 CJL OTIME, .-. /TIME-OUT TEMPORARY /049 CJL OWASTE, .-. /TIME-OUT TEMPORARY /049 CJL PAGE / HOLD BUFFER FOR CHAR OUTPUT DECIMAL HOLDBF, ZBLOCK 92 OCTAL / ROUTINE TO CHECK FOR CONTROL PREFIX. / ENTER WITH CHAR TO CHECK IN THE AC. / EXIT + 1 WITH CHAR IN THE AC IF NO PREFIX QUOTING. / EXIT + 2 WITH PROPER CHAR IN THE AC AND QUOTING IS REQUIRED. OPRE, 0 /CHECK FOR CONTROL PREFIX ROUTINE DCA PRETEMP /SAVE THE CHARACTER /032 CJL TAD QFLAG /CHECK FOR IN CTRL QUOTE MODE SZA CLA /SKIP IF YES JMP OPRE1 /NO QUOTE PREFIX TAD PRETEMP /GET THE CHARACTER /032 CJL AND [7740] /QUICK CHECK FOR <40 /014/016 CJL SNA CLA /SKIP IF NOT CONTROL JMP OPRE2 /PREFIX QUOTE TAD PRETEMP /GET THE CHARACTER /032 CJL TAD (-177 /CHECK FOR "DELETE" SNA CLA /SKIP IF NOT JMP OPRE2 /PREFIX QUOTE TAD PRETEMP /GET THE CHARACTER /032 CJL CIA /NEGATE FOR COMPARE TAD RQCTL /SEE IF SAME AS QUOTE CHAR SZA CLA /SKIP IF PREFIX QUOTE JMP OPRE1 /NO PREFIX QUOTE TAD RQCTL /PREFIX WITH PREFIX JMP OPRE3 /PREFIX WITH THE PREFIX OPRE1, TAD PRETEMP /GET THE CHARACTER /032 CJL JMP I OPRE /DONE OPRE2, TAD PRETEMP /GET THE CHARACTER /032 CJL TAD [100] /MAKE IT PRINTABLE /016 CJL AND [177] /IN CASE IT WAS 177 /014/016 CJL OPRE3, ISZ OPRE /BUMP FOR PREFIX RETURN JMP I OPRE /DONE PRETEMP,.-. /PREFIX TEMPORARY /032 CJL PAGE /014 CJL / ROUTINE TO SCAN A TEXT LINE FOR KEYWORD DELIMITERS. / THIS ROUTINE EXPECTS THE AC TO POINT TO A TEXT LINE TO SCAN AND FINDS THE / FIRST NON-SPACE, NON-END OF LINE CHAR IN THE LINE AND SETS "SCAN1" TO POINT TO / IT. NEXT WE FIND THE LAST CHAR IN THE LINE THAT IS A NON-SPACE, NON-END OF / LINE AND STORE A POINTER TO IT IN "SCAN2". KEYWORDS ARE DELIMITED BY A / BEGINNING OF LINE OR SPACE AT THE BEGINNING AND AN END OF LINE OR A SPACE AT / THE END. / ENTER: AC = POINTER TO COMMAND LINE / EXIT: (SUCCESS) SCAN1 = POINTER TO FIRST CHAR OF KEYWORD. / SCAN2 = POINTER TO LAST CHAR OF KEYWORD. / RETURN = RETURN + 2 (NO WORDS LEFT IN LINE). / EXIT: (FAIL) RETURN = RETURN + 1. SCNEL, 0 /SCAN ROUTINE JMS I [NOSP] /FIND FIRST NON-SPACE JMP I SCNEL /END OF LINE RETURN DCA SCAN1 /RETURN SCAN LINE POINTER TAD SCAN1 /RE-GET SCAN LINE POINTER JMS I [SP] /FIND FIRST SPACE OR EOL NOP /RETURN HERE ON EOL TAD (-1 /BACK UP TO PREVIOUS CHAR DCA SCAN2 /SET END ELEMENT POINTER ISZ SCNEL /TAKE SUCCESS RETURN JMP I SCNEL /DONE / ROUTINE TO SCAN THRU A TEXT LINE LOOKING FOR THE NEXT SPACE. / ENTER ROUTINE WITH THE LINE POINTER IN THE AC. / EXIT: RETURN + 2 WITH AC = POINTER TO SPACE. / RETURN + 1 WITH AC = POINTER TO END OF LINE. SP, 0 /CHECK FOR A <SPACE> ROUTINE DCA SCANTP /USE A TEMP POINTER SKP /SKIP INTO LOOP BELOW SP1, ISZ SCANTP /BUMP LINE POINTER TAD I SCANTP /GET A CHAR SPA /SKIP IF NOT END OF LINE JMP SP3 /GOT AN END OF LINE TAD [-" !200] /COMPARE WITH <SP> /034 CJL SZA CLA /SKIP IF IS A SPACE JMP SP1 /LOOP TILL SPACE OR EOL ISZ SP /BUMP RETURN FOR SPACE FOUND SP3, CLA CLL /INSURE A CLEAR AC TAD SCANTP /GET POINTER VALUE JMP I SP /RETURN IN AC / ROUTINE TO SCAN THRU A TEXT LINE FOR THE FIRST NON-SPACE. / ENTER ROUTINE WITH POINTER TO THE LINE IN THE AC. / EXIT: RETURN + 2 WITH AC = POINTER TO NON-SPACE. / RETURN + 1 WITH AC = POINTER TO END OF LINE. NOSP, 0 /FIND A NON-<SPACE> ROUTINE DCA SCANTP /USE A TEMP POINTER SKP /SKIP INTO LOOP BELOW NOSP1, ISZ SCANTP /BUMP THE LINE POINTER TAD I SCANTP /GET A CHAR FROM THE LINE SPA /SKIP IF NOT EOL JMP NOSP3 /EXIT IF EOL TAD [-" !200] /COMPARE WITH <SP> /034 CJL SNA CLA /SKIP IF NOT SPACE JMP NOSP1 /LOOP TILL SPACE OR EOL ISZ NOSP /BUMP RETURN FOR SPACE FOUND NOSP3, CLA CLL /INSURE CLEAR AC TAD SCANTP /GET POINTER JMP I NOSP /RETURN IN AC / ROUTINE TO FIND AN END CHAR IN A STRING. / ENTER ROUTINE WITH POINTER TO THE STRING IN THE AC. / EXIT WITH THE POINTER TO THE FIRST MINUS CHAR IN THE AC. FNDEND, 0 /FIND END CHAR ROUTINE DCA SCANTP /PUT POINTER IN SCANTP FEND1, TAD I SCANTP /GET A CHAR FROM THE STRING SPA CLA /SKIP IF NOT END JMP FEND2 /EXIT IF END OF STRING ISZ SCANTP /BUMP THE POINTER JMP FEND1 /LOOP TILL NON-END OF STRING FEND2, TAD SCANTP /GET POINTER TO NON-END OF STRING JMP I FNDEND /EXIT WITH POINTER IN AC SCANTP, 0 /USED IN THE SCAN ROUTINES "SP", "NOSP", "FNDNUL" / ROUTINE TO LOOKUP THE KEY WORD POINTED TO BY THE AC IN THE /014 CJL / TABLE POINTED TO BY PTABLE. / RETURN + 1 IF NO MATCH IS FOUND WITH AC = ENTRY VALUE. / RETURN + 2 IF NO KEYWORD IS FOUND (EOL DETECTED). / RETURN + 3 IF MATCH IS FOUND WITH THE NEXT PARSE POSITION IN THE LINE IN / THE AC AND THE DISPATCH ADDRESS FROM THE TABLE IN "KEYDSP". KEYPRS, .-. /KEYWORD PARSE ROUTINE DCA LOOK3 /SAVE IN CASE OF FAIL TAD LOOK3 /RE-GET / AND (137) /MAKE CHARACTER UPPER-CASE, NO PARITY /MD013 JMS SCNEL /TRY TO SCAN OFF A KEYWORD JMP KP45 /END OF LINE ENCOUNTERED TAD PTABLE /GET ADDRESS OF TABLE DCA LOOK2 /STORE IN LOCAL POINTER KP10, TAD SCAN1 /GET ADDRESS OF SCAN ELEMENT DCA LOOK1 /INTO LOCAL POINTER KP20, TAD I LOOK1 /GET A CHARACTER FROM THE SCAN ELEMENT CIA /NEGATE FOR COMPARE TAD I LOOK2 /GET A CHAR FROM THE TABLE ELEMENT SZA CLA /SKIP IF MATCH JMP KP90 /NO MATCH, SET TO LOOK AT NEXT TABLE ENTRY TAD LOOK1 /CHECK IF ALL ENTERED CHARS MATCH CIA /NEGATE TO COMPARE TAD SCAN2 /HAVE WE MATCHED TO THE TERMINATOR? SNA CLA /SKIP IF NO JMP KP40 /YES, GOT ENOUGH TO MATCH ISZ LOOK1 /MORE TO MATCH, BUMP SCAN ELEMENT POINTER ISZ LOOK2 /BUMP TABLE ELEMENT POINTER JMP KP20 /CONTINUE MATCH LOOP KP40, TAD LOOK2 /GET CURRENT TABLE POINTER JMS FNDEND /FIND A NULL MARK IAC /BUMP BY 1 DCA LOOK1 /STORE IN A POINTER TAD I LOOK1 /GET DISPATCH ADDRESS DCA KEYDSP /PUT INTO DISPATCH ADDRESS ISZ KEYPRS /BUMP RETURN ISZ KEYPRS /BUMP AGAIN CLA CLL IAC /AC = 1 TAD SCAN2 /GET POINTER TO END OF CURRENT KEY JMP I KEYPRS /RETURN / END OF LINE ENCOUNTERED ON PARSE. KP45, ISZ KEYPRS /BUMP RETURN ONCE FOR EOL / NO MATCHES IN THE TABLE HERE. KP50, TAD LOOK3 /GET ORIGINAL AC JMP I KEYPRS /RETURN / FAILURE ON CURRENT TABLE ENTRY, SET FOR NEXT ENTRY (IF THERE IS ONE) AND TRY / AGAIN. KP90, TAD LOOK2 /GET TABLE POINTER JMS FNDEND /FIND NEXT TABLE ENTRY IAC;IAC /NEXT ENTRY IS 2 PAST THE NULL DCA LOOK2 /RE-SET LOCAL TABLE POINTER TAD I LOOK2 /CHECK END OF TABLE SNA CLA /SKIP IF NOT END OF THE TABLE JMP KP50 /TAKE NOT FOUND EXIT JMP KP10 /TRY MATCH ON THIS ENTRY LOOK1, .-. /TEMPORARY FOR KEYPRS /014 CJL LOOK2, .-. /TEMPORARY FOR KEYPRS /014 CJL LOOK3, .-. /TEMPORARY FOR KEYPRS /014 CJL / ROUTINE TO MOVE WORDS OF MEMORY. /014 CJL / CALLING SEQUENCE: / TAD (DESTINATION) /GET DESTINATION ADDRESS / DCA MQ /INTO MQ /032 CJL / TAD (-COUNT) /GET -NUMBER OF WORDS TO MOVE / DCA MOVE4 /SETUP MOVE COUNTER / TAD (SOURCE) /GET SOURCE ADDRESS / JMS I (MOVE0) /CALL MOVE ROUTINE / RETURN /RETURNS HERE MOVE0, .-. /MOVE ROUTINE /014 CJL DCA MOVE5 /STORE SOURCE ADDRESS IN LOCAL POINTER TAD MQ /GET DESTINATION ADDRESS /032 CJL DCA MOVE6 /STORE IN LOCAL POINTER MOVE1, TAD I MOVE5 /GET A WORD FROM THE SOURCE DCA I MOVE6 /MOVE TO DESTINATION ISZ MOVE5 /BUMP SOURCE POINTER ISZ MOVE6 /BUMP DESTINATION COUNTER ISZ MOVE4 /BUMP COUNTER JMP MOVE1 /LOOP JMP I MOVE0 /DONE MOVE5, .-. /SOURCE POINTER FOR "MOVE" MOVE6, .-. /DESTINATION POINTER FOR "MOVE" PAGE /014 CJL / ROUTINE TO PARSE OFF A DEVICE NAME FROM THE COMMAND LINE. /O14 CJL / CALLING SEQUENCE: / TAD (POINTER) /AC CONTAINS POINTER TO COMMAND LINE / JMS I [DPARS] /CALL ROUTINE / ERROR RETURN /AC UNCHANGED / GOOD RETURN /AC NOW POINTS TO REST OF LINE / DEVNUM= DEVICE NUMBER TO USE. / ":" IS THE FIFTH CHARACTER IF NOT USING DEFAULT DEVICE. DPARS, .-. /DEVICE PARSE ROUTINE /014 CJL DCA DPAR10 /SAVE INITIAL POINTER TO LINE TAD DPAR10 /GET POINTER JMS I [NOSP] /GET PAST ANY LEADING SPACES JMP DFDEV /GOT END OF LINE, USE DEFAULT DEVICE DCA DPAR11 /SAVE POINTER TO LINE DCA DEVNAME /INITIALIZE THE DEVICE NAME /014 CJL DCA DEVNAME+1 /FOR "INQUIRE" FUNCTION /014 CJL TAD (DEVNAM) /GET ADDRESS OF WHERE TO PUT DEVICE NAME/014 CJL DCA PACK6P /STORE IN PACK6 POINTER DCA PACK6F /INITIALIZE PACK6 FLAG FOR LOW BYTE /014 CJL TAD (-4) /SET UP A COUNTER /014 CJL DCA DPAR13 /FOR NO MORE THAN 4 CHARS DPAR1, TAD I DPAR11 /GET A CHAR FROM THE LINE SNA /SKIP IF NOT <EOL> /014 CJL JMP DFDEV /GOT AN <EOL>, USE DEFAULT DEVICE /014 CJL TAD (-":!200) /CHECK FOR ":" /034 CJL SNA CLA /SKIP IF NOT END OF DEVICE NAME JMP DPAR2 /DEVICE NAME SET UP TAD I DPAR11 /RE-GET CHAR ISZ DPAR11 /BUMP LINE POINTER PACK6 /PACK SIX-BIT /014 CJL ISZ DPAR13 /BUMP CHARACTER COUNTER /014 CJL JMP DPAR1 /CAN CONTINUE TAD I DPAR11 /GET CHARACTER AFTER THE FOURTH /014 CJL TAD (-":!200) /CHECK FOR ":" /034 CJL SZA CLA /SKIP IF YES, ALL IS OK JMP DFDEV /USE THE DEFAULT DEVICE DPAR2, ISZ DPAR11 /BUMP POINTER PAST ":" TAD (DEVNAM) /GET PARSED DEVICE NAME ADDRESS /014 CJL JMP DPAR4 /DO AN OS/8 "INQUIRE" DFDEV, CLA CLL /CLEAN UP /019 CJL TAD DPAR10 /GET ORIGINAL AC FOR DCA DPAR11 /RETURN POINTER DPAR4, JMS DVNUM /GET DEVICE NUMBER JMP DPAR8 /DEVICE NAME ERROR DCA DEVNUM /RETURN FOR CALLING PROGRAM TAD DPAR11 /GET CURRENT POINTER ISZ DPARS /BUMP RETURN JMP I DPARS /RETURN /014 CJL DPAR8, CLA CLL /INSURE CLEAR AC TAD DPAR10 /GET ORIGINAL AC JMP I DPARS /TAKE ERROR EXIT DPAR10, .-. /TEMPORARY FOR DPARS /014 CJL DPAR11, .-. /TEMPORARY FOR DPARS /014 CJL DPAR13, .-. /TEMPORARY FOR DPARS /014 CJL DEFDEV, DEVICE DSK /DEFAULT DEVICE DEVNAM, FILENAM ZZZZZZ.ZZ /DEFAULT FILENAME /014 CJL / ROUTINE TO RETURN A DEVICE NUMBER FOR A DEVICE NAME. /014 CJL / CALLING SEQUENCE: / TAD (ADDRESS) /AC=ADDRESS OF DEVICE NAME / /*OR* 0000 IF "DSK:" IS TO BE USED / ERROR RETURN /INVALID DEVICE / GOOD RETURN /AC=DEVICE NUMBER DVNUM, .-. /DEVICE NUMBER ROUTINE /014 CJL SNA /SKIP IF DEVICE NAME SPECIFIED TAD (DEFDEV) /ELSE USE DEFAULT /014 CJL DCA DVNUM9 /SAVE IN LOCAL POINTER TAD I DVNUM9 /GET FIRST TWO CHARACTERS OF NAME /014 CJL DCA DVNUM5 /PUT INTO CALL ISZ DVNUM9 /BUMP POINTER TAD I DVNUM9 /GET LAST TWO CHARACTERS OF NAME /014 CJL DCA DVNUM5+1 /PUT INTO CALL CIF USRFLD /GOTO USR FIELD /020 CJL JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL INQUIRE /INQUIRE ABOUT HANDLER /020 CJL DVNUM5, .-. /FIRST TWO BYTES OF DEVICE NAME /014 CJL .-. /LAST TWO BYTES OF DEVICE NAME /014 CJL 0 /ENTRY POINT OF HANDLER RETURNED HERE JMP I DVNUM /ERROR, TAKE ERROR EXIT TAD DVNUM5+1 /DEVICE NUMBER ISZ DVNUM /BUMP RETURN FOR NO ERROR JMP I DVNUM /RETURN DVNUM9, .-. /LOCAL FOR "DVNUM" /014 CJL / DEVICE HANDLER FETCH ROUTINE. /020 CJL / CALLING SEQUENCE: / TAD (HANDLERNUMBER) /AC CONTAINS DEVICE HANDLER NUMBER / JMS I [HFETCH] /CALL ROUTINE / ERROR RETURN /COULDN'T LOAD HANDLER / GOOD RETURN /HANDLER LOADED / IF THE HANDLER WAS LOADED, THEN HNDADR CONTAINS THE HANDLER ENTRY POINT. HFETCH, .-. /HANDLER FETCH ROUTINE DCA HANDNUMBER /STORE HANDLER NUMBER TAD (HNDLR+1) /GET OUR BUFFER+(TWO PAGE ALLOWED) DCA HADR /STORE IN-LINE TAD HANDNUMBER /GET HANDLER NUMBER AGAIN CIF USRFLD /GOTO USR FIELD JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL FETCH /FETCH HANDLER HADR, .-. /WILL BE OUR SUGGESTED ADDRESS+TWO PAGES ALLOWED SKP /COULDN'T DO IT ISZ HFETCH /BUMP TO GOOD RETURN CLA CLL /CLEAN UP TAD HADR /GET ACTUAL HANDLER ADDRESS DCA HNDADR /STASH THE POINTER JMP I HFETCH /RETURN EITHER WAY HANDNUM,.-. /HANDLER NUMBER TEMPORARY / ROUTINE TO HANDLE THE "FINISH" COMMAND. /021 CJL FINSRV, 0 JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL TAD (MSEND) /GET SEND MODE VALUE /045 CJL DCA KMODE /SETUP PROPER MODE /045 CJL FPACK /FORMAT A PACKET SRVFIN /PACKET DATA ADDRESS STGEN /PACKET TYPE FIN2, SPACK /SEND PACKET 1 /AWAIT RESPONSE FIN20-2 /DISPATCH LIST FOR RESPONSE /027 CJL / NAK OR UNDEFINED RESPONSE HERE FIN5, ISZ RTRYC /BUMP RE-TRY COUNTER JMP FIN2 /GET RESPONSE AND TRY AGAIN TAD (NOFINISH) /FAILED, RETURN MESSAGE /025 CJL JMP I FINSRV / ACK HERE FIN10, ISZ FINSRV /BUMP FOR NON-ERROR EXIT JMP I FINSRV /DONE FIN20, STACK; FIN10 /ACK STNAK; FIN5 /NAK 0 SRVFIN, "F&137 /SERVER KERMIT COMMAND TO SHUT DOWN -1 /END OF DATA PAGE / ROUTINE TO PARSE OFF A FILE NAME. / FILE NAME TO BE PARSED MUST BE LETTERS OR DIGITS AND BE NO MORE THAN / SIX CHARS FOR THE NAME AND TWO CHARS FOR THE EXTENSION. / ENTER WITH: AC = POINTER TO FILE NAME TO PARSE. / FNPTR = POINTER TO WHERE TO PUT THE PARSED FILE NAME. / NON-ERROR EXIT: AC = POINTER TO REMAINDER OF COMMAND LINE. / RETURN THE CALL + 2. / ERROR EXIT: AC = ORIGINAL POINTER. / RETURN THE CALL + 1. PFNAM, 0 DCA PFN10 /SAVE POINTER TO FILE NAME STRING TAD FNPTR /GET POINTER TO FILE NAME BLOCK DCA MQ /SET FOR "CLEAR" ROUTINE /032 CJL TAD (-4 /FOUR WORDS TO CLEAR OUT CLEAR /INIT THE FILE NAME BLOCK TAD PFN10 /GET THE STRING POINTER JMS I [NOSP] /GET PAST ANY LEADING SPACES JMP PFNAM9 /GOT EOL, NO FILE NAME DCA PFN11 /SAVE POINTER TAD FNPTR /GET FILE NAME BLOCK POINTER DCA PACK6P /SET UP THE "PACK6" POINTER DCA PACK6F /INIT THE "PACK6" FLAG TAD (-6 /MAX OF 6 CHARS FOR FILE NAME DCA PFN15 /PUT INTO COUNTER DCA WILDF /INIT THE WILD CARD FLAG JMS NAM /MOVE AND PACK FILE NAME TAD I PFN11 /GET THE TERM CHAR SPA /SKIP IF NOT EOL JMP PFNAM7 /EOL MEANS END OF FILE NAME TAD (-".!200) /COMPARE TO "." /034 CJL SNA /SKIP IF NO JMP PFNAM3 /GO HANDLE EXTENSION TAD (-" +".) /COMPARE TO <SP> /034 CJL SZA CLA /SKIP IF WAS A SPACE JMP PFNAM9 /NOT A SPACE, GOT AN ERROR JMP PFNAM7 /IS A SPACE, END OF FILE NAME PFNAM3, ISZ PFN11 /BUMP PAST THE "." TAD FNPTR /GET FILE NAME BLOCK POINTER TAD (3) /POINT TO EXTENSION /032 CJL DCA PACK6P /SET "PACK6" POINTER DCA PACK6F /INIT "PACK6" FLAG NL7776 /SET -2 /032 CJL DCA PFN15 /COUNTER FOR 2 EXT CHARS JMS NAM /NOW DO THE EXTENSION TAD I PFN11 /GET THE TERM CHAR SPA /SKIP IF NOT EOL JMP PFNAM7 /GOT COMPLETE FILE NAME HERE TAD [-" !200] /COMPARE TO <SP> /034 CJL SZA CLA /SKIP IF IT WAS JMP PFNAM9 /GOT A FILE NAME ERROR PFNAM7, ISZ PFNAM /BUMP RETURN FOR GOOD FILE NAME CLA CLL /INSURE CLEAR AC TAD PFN11 /GET CURRENT STRING POINTER JMP I PFNAM /AND RETURN PFNAM9, CLA CLL /INSURE CLEAR AC TAD PFN10 /GET ORIGINAL STRING POINTER JMP I PFNAM /TAKE ERROR RETURN PFN10, 0 /TEMP FOR PFNAM ROUTINE PFN11, 0 /TEMP FOR PFNAM ROUTINE PFN15, 0 /TEMP FOR PFNAM ROUTINE / LOCAL ROUTINE TO "PFNAM" TO MOVE IN THE FILE NAME OR FILE EXTENSION. / ENTER WITH "PFN11" POINTING TO WHERE TO GET THE NAME OR EXTENSION. / AND "PFN15" EQUAL TO THE MAX NUMBER OF CHARS (6 FOR NAME, 2 FOR EXT). / THIS ROUTINE CHECKS FOR WILD CARD CHARS "*" AND "?" AND PUTS THE / "?" CHAR IN FOR ANY CHARS IN THE NAME THAT ARE WILD. ALSO IF ANY / WILD CARD CHARS ARE FOUND THE FLAG "WILDC" IS SET SO BEFORE PARSING / ANY FILE NAME THE "WILDC" FLAG SHOULD BE INITIALIZED. NAM, 0 NAM0, TAD I PFN11 /GET A CHAR FROM THE STRING JMS I (ALPNUM) /MUST BE ALPHA OR NUMBER SKP /NOT A ALPHA NUMERIC JMP NAM3 /IS ALPHA NUMERIC TAD (-"?!200) /COMPARE TO "?" /034 CJL SNA /SKIP IF NO JMP NAM2 /YES, JUST PUT IT IN TAD (-"*+"?) /COMPARE TO "*" /034 CJL SZA CLA /SKIP IF YES JMP I NAM /TAKE THE FILE NAME ERROR EXIT ISZ WILDF /SET FLAG FOR WILD CARD FOUND NAM1, TAD ["?&77] /GET WILD CARD CHARACTER /034 CJL PACK6 /PUT IN NAME BLOCK ISZ PFN15 /BUMP CHAR COUNTER JMP NAM1 /LOOP TILL ALL FILLED ISZ PFN11 /BUMP THE STRING POINTER JMP NAM9 /EXIT WITH "PFN11" POINTING TO NEXT CHAR NAM2, ISZ WILDF /SET FLAG FOR WILD CARD FOUND TAD ["?&77] /GET WILD CARD CHARACTER /034 CJL NAM3, PACK6 /PUT THE CHAR INTO THE FILE NAME BLOCK ISZ PFN11 /BUMP THE STRING POINTER ISZ PFN15 /BUMP THE CHAR COUNTER JMP NAM0 /LOOP NAM4, TAD I PFN11 /NOW GET TO A TERMINATOR CHAR JMS I (ALPNUM) /BY FINDING FIRST NON-ALPHNUMERIC JMP NAM9 /NOW WE CAN QUIT CLA CLL /IGNORE EXCESS CHARS ISZ PFN11 /BUMP THE STRING POINTER JMP NAM4 /LOOP NAM9, CLA CLL /LEAVE WITH A CLEAR AC JMP I NAM /RETURN / ROUTINE TO SEND A PACKET. / ENTER WITH ADDRESS OF PACKET DATA IN CALL + 1. / AND TYPE OF PACKET IN CALL + 2. / EXIT CALL + 4 IF ACK RETURNED. / EXIT CALL + 3 IF NAK OR OTHER PACKET TYPE RETURNED. SNDP, 0 TAD I SNDP /GET DATA ADDRESS DCA SNDP1 /STORE IN CALL ISZ SNDP /BUMP POINTER TAD I SNDP /GET PACKET TYPE DCA SNDP2 /STORE IN CALL ISZ SNDP /BUMP FPACK /FORMAT A PACKET SNDP1, 0 /DATA ADDRESS GOES HERE SNDP2, 0 /PACKET TYPE GOES HERE SNDP3, SPACK /SEND A DATA PACKET 1 /GET RESPONSE SNDP9-2 /RESPONSE DISPATCH TABLE ADDRESS /027 CJL / HERE ON NOT "NAK" OR "ACK" RESPONSE. SKP / HERE ON "ACK". SNDP5, ISZ SNDP /BUMP RETURN ISZ SNDP /BUMP RETURN JMP I SNDP /EXIT / HERE ON NAK. SNDP4, ISZ RTRYC /BUMP THE RE-TRY COUNTER JMP SNDP3 /RE-TRY JMP I SNDP /TAKE RETURN + 3 SNDP9, STACK; SNDP5 /ACK STACK; SNDP4 /NAK 0 PAGE /014 CJL IFZERO 1 < / ROUTINE TO PARSE OFF A DECIMAL NUMBER. / ENTER ROUTINE WITH A POINTER TO THE PARSE LINE IN THE AC. / EXIT: RETURN + 1 FOR NO NUMBER. / RETURN + 2 FOR INVALID NUMBER. / RETURN + 3 FOR VALID NUMBER. / IN ALL CASES ON RETURN THE AC WILL CONTAIN A POINTER TO THE NEXT CHAR TO PARSE / IN THE LINE. ANY NUMBER PARSED WILL BE CONVERTED TO BINARY AND PUT INTO THE / REGISTER "BININP". DECPRS, 0 JMS I [NOSP] /GET PAST ANY LEADING SPACES JMP I DECPRS /GOT AN END OF LINE, AC POINTS TO IT DCA DP10 /SAVE POINTER TO LINE TAD DP10 /RE-GET POINTER TO LINE DCA DP11 /STORE IN OUR LINE POINTER DCA BININP /INIT BINARY REGISTER DCA DP13 /INIT PARSED NUMBER FLAG SKP /SKIP INTO LOOP BELOW DP1, ISZ DP11 /BUMP THE LINE POINTER TAD I DP11 /GET A CHAR FROM THE LINE JMS DECCK /CHECK FOR PROPER ASCII DECIMAL JMP DP5 /NOT PROPER ASCII DECIMAL ISZ DP13 /FLAG NUMBER INPUT TAD (-"0 /MAKE BINARY DCA DP12 /AND STORE TAD BININP /GET PREVIOUS INPUT JMS MUL10 /AND MULTIPLY TIMES 10 SZL /SKIP IF NO OVERFLOW ENCOUNTERED JMP DP6 /GOT AN OVERFLOW ERROR TAD DP12 /COMBINE WITH CURRENT INPUT SZL /SKIP IF NO OVERFLOW ERROR JMP DP6 /GOT AN OVERFLOW ERROR DCA BININP /RETURN ACCUMULATED SUM JMP DP1 /LOOP DP5, CLA CLL /AC MAY NOT BE CLEAR TAD DP13 /ANY NUMBERS INPUT YET? SNA CLA /SKIP IF YES JMP DP6 /TAKE THE NO NUMBER INPUT RETURN ISZ DECPRS /BUMP THE RETURN ISZ DECPRS /TWICE FOR GOOD NUMBER INPUT RETURN TAD DP11 /GET POINTER TO LINE JMP I DECPRS /AND RETURN DP6, CLA CLL /AC MAY NOT BE CLEAR TAD DP10 /GET ORIGINAL LINE POINTER ISZ DECPRS /BUMP THE RETURN JMP I DECPRS /TAKE THE INVALID NUMBER RETURN > IFZERO 1 < DP10, 0 /TEMP FOR DECPRS DP11, 0 /TEMP FOR DECPRS DP12, 0 /TEMP FOR DECPRS DP13, 0 /TEMP FOR DECPRS / ROUTINE TO MULTIPLY THE VALUE OF THE AC TIMES 10. / VALUE IN THE AC IS ASSUMED BINARY. / THE NUMBER IS RETURNED IN THE AC. IF THE LINK IS SET THE MULTIPLY / OVERFLOWED 12 BITS. MUL10, 0 DCA MULTMP /SAVE THE NUMBER TAD MULTMP /GET THE NUMBER BACK CLL RTL /MULTIPLY TIMES 4 TAD MULTMP /TIMES 5 SNL /SKIP IF ALREADY OVERFLOWED /025 CJL RAL /TIMES 10 JMP I MUL10 /RETURN NUMBER IN AC /THE LINK HAS ANY OVERFLOW MULTMP, 0 /TEMP STORAGE FOR MUL10 ROUTINE / ROUTINE TO CHECK FOR A VALID ASCII DECIMAL VALUE. / ENTER WITH ASCII CHAR IN THE AC. / EXIT RETURN + 1 IF NON-VALID ASCII DECIMAL WITH CHAR IN AC. / EXIT RETURN + 2 IF VALID ASCII DECIMAL WITH CHAR IN AC. DECCK, 0 DCA DECCK5 /STORE THE CHAR TO CHECK TAD DECCK5 /GET THE CHAR TAD (-"0 /CHECK FOR LESS THAN 0 SPA /SKIP IF NOT LESS THAN 0 JMP DECCK1 /NON-ASCII DECIMAL TAD ("0-"9-1 /CHECK GREATER THAN 9 SMA CLA /SKIP IF LE 9 JMP DECCK1 /INVALID ASCII DECIMAL ISZ DECCK /BUMP RETURN FOR VALID ASCII DECIMAL DECCK1, TAD DECCK5 /RE-GET ORIGINAL CHAR IN AC JMP I DECCK /RETURN DECCK5, 0 /TEMP FOR "DECCK" ROUTINE > / ROUTINE TO INPUT A COMMAND LINE FROM THE KEYBOARD. /013/014 CJL LININP, 0 TAD (LINBUF /GET ADDRESS OF LINE BUFFER DCA LIN50 /STORE IN A POINTER LIN1, JMS I (INPUT) /GET A CHARACTER FROM THE KEYBOARD /044 CJL TAD (-CNTRLM) /COMPARE TO <CR> /034 CJL SNA /SKIP IF NOT A RETURN JMP LIN2 /LINE IS INPUT TAD (-DELETE+CNTRLM)/COMPARE TO <DEL> /034 CJL SNA CLA /SKIP IF NOT A DELETE JMP LIN5 /OFF TO HANDLE A DELETE TAD LIN50 /GET VALUE OF LINE POINTER TAD (-LINBUF-LINSIZ /COMPARE WITH END OF LINE BUFFER SMA CLA /SKIP IF ROOM IN LINE BUFFER JMP LIN10 /BEEP FOR FULL BUFFER TAD INCHAR /GET THE KEYBOARD CHARACTER AGAIN /044 CJL TAD (-140) /COMPARE TO LOWER-CASE LIMIT /034 CJL SMA /SKIP IF BELOW LIMIT /034 CJL TAD [-40] /ELSE MAKE IT UPPER-CASE /034 CJL TAD (140) /RESTORE THE CHARACTER /034 CJL DCA I LIN50 /STORE IN THE LINE BUFFER ISZ LIN50 /BUMP THE LINE BUFFER POINTER NL7777 /SET -1 /032 CJL DCA I LIN50 /TERMINATE THE LINE TAD INCHAR /GET THE LATEST KEYBOARD CHARACTER BACK /044 CJL JMS I [P7ECHO] /PRINT IT /043 CJL JMP LIN1 /LOOP TILL A RETURN TYPED LIN2, NL7777 /SET -1 /032 CJL DCA I LIN50 /INSURE STRING TERMINATED JMS I [SCRIBE] /DO A /025 CJL CRLF /<CR>, <LF> /025 CJL JMP I LININP /DONE / HANDLE A DELETE TYPED IN LIN5, TAD LIN50 /FIND OUT FIRST IF... TAD (-LINBUF /WE ARE AT THE BEGINNING OF THE LINE SNA CLA /SKIP IF NO JMP LIN1 /JUST IGNORE THE DELETE NL7777 /SET -1 /032 CJL TAD LIN50 /GET THE LINE POINTER DCA LIN50 /RETURN BACKED UP DCA I LIN50 /ZERO THE CHAR TAD (CNTRLH) /GET A <BS> /025 CJL JMS I [P7ECHO] /PRINT IT /043 CJL TAD [" &177] /GET A <SPACE> /025 CJL JMS I [P7ECHO] /PRINT IT /043 CJL TAD (CNTRLH) /GET A <BS> /025 CJL JMS I [P7ECHO] /PRINT IT /043 CJL JMP LIN1 /BACK TO INPUT / HANDLE FULL LINE BUFFER HERE LIN10, CLA CLL /ENSURE CLEAR AC TAD [CNTRLG] /GET A <BEL> CHARACTER /025 CJL JMS I [P7ECHO] /PRINT IT /043 CJL JMP LIN1 /WAIT FOR EITHER RETURN OF DELETE KEY LIN50, 0 /TEMP POINTER FOR "LININP" ROUTINE / ROUTINE TO PACK TWO SIX-BIT CHARACTERS INTO A WORD. /032 CJL / CALLING SEQUENCE: / [PACK6PTR => CHARACTER PACKING AREA]. / [PACK6FLAG=0 IF PACKING INTO HIGH-ORDER BYTE. / PACK6FLAG=4000 IF PACKING INTO LOW-ORDER BYTE]. / TAD CHAR /AC CONTAINS CHARACTER TO BE PACKED / PACK6 /CALL VIA PAGE ZERO POINTER / RETURNS WITH AC CLEAR AND PACK6PTR AND PACK6FLAG UPDATED FOR NEXT PACKING. PACK60, .-. /PACK SIX-BIT ROUTINE AND [77] /JUST SIX-BIT DCA PACK6TEMP /SAVE FOR NOW NL4000 /SET INVERSION BIT TAD PACK6FLAG /REVERSE THE FLAG DCA PACK6FLAG /STORE BACK SZL /WAS IT CLEAR? JMP PACKIT /NO, GO DO LOW-ORDER TAD PACK6TEMP /GET THE CHARACTER RTL;RTL;RTL /MOVE UP DCA I PACK6PTR /STORE IT JMP I PACK60 /RETURN PACKIT, TAD I PACK6PTR /GET PREVIOUS HIGH-ORDER HALFWORD TAD PACK6TEMP /ADD ON LATEST DCA I PACK6PTR /STORE BOTH ISZ PACK6PTR /BUMP FOR NEXT TIME JMP I PACK60 /RETURN PACK6TE,.-. /PACK6 TEMPORARY / ROUTINE TO COMPARE TWO FILE NAMES FOR EQUALITY. / THE ROUTINE WILL CHECK EACH OF THE 8 FILE NAME CHARS AND IF A / CHAR IN THE FIRST FILE NAME (THE ONE WE ARE LOOKING FOR) CONTAINS / A "?" IT WILL MATCH ON THE SECOND FILE NAME CHAR. / ENTER WITH "FCMP1" POINTING TO THE FILE NAME TO FIND, AND "FCMP2" / POINTING TO THE FILE NAME TO TRY AND MATCH. EXIT + 1 IF NO MATCH / AND EXIT + 2 IF MATCH. (IF NON-ZERO AC ON ENTRY, THE AC IS ASSUMED / TO HAVE THE VALUE FOR "FCMP2".) FMATCH, 0 SZA /SKIP IF NO ARGUMENT IN AC DCA FCMP2 /THIS ARGUMENT CAME IN THE AC TAD FCMP1 /GET ADDRESS OF FIRST FILE NAME BLOCK DCA GET6P /STORE IN A POINTER DCA GET6F /INIT FLAG FOR "GET6" ROUTINE TAD FCMP2 /GET ADDRESS OF SECOND FILE NAME BLOCK DCA FMATP /STORE IN A LOCAL POINTER DCA FMATF /INIT LOCAL FLAG TAD (-10 /8 CHARS TO DO DCA FMATC /STORE IN LOCAL COUNTER FMAT1, NL4000 /SET 4000 /032 CJL TAD FMATF /GET FLAG DCA FMATF /RETURN FLAG, LINK CONTAINS STATUS TAD I FMATP /GET A WORD FROM THE SECOND NAME SZL /SKIP IF HIGH-ORDER WANTED NOW /032 CJL JMP FSWIT /JUMP IF LOW-ORDER WANTED NOW /032 CJL RTR;RTR;RTR /MOVE DOWN HIGH-ORDER /032 CJL SKP /DON'T BUMP YET /032 CJL FSWIT, ISZ FMATP /BUMP THE POINTER /032 CJL AND [77] /KEEP ONLY BOTTOM 6 BITS /016 CJL DCA FMATT /STORE IN A TEMP GET6 /NOW GET A CHAR FROM FIRST NAME TAD (-77 /CHECK IF WILD SNA /SKIP IF NO JMP FMAT2 /NO MATCH CHECK ON A WILD CARD TAD [77] /RESTORE THE CHARACTER /014/016 CJL CIA /NEGATE FOR COMPARE TAD FMATT /COMPARE WITH SECOND FILE NAME SZA CLA /SKIP IF IS A MATCH JMP I FMATCH /THIS IS NOT A MATCH FMAT2, ISZ FMATC /BUMP COUNTER JMP FMAT1 /LOOP, MORE TO CHECK ISZ FMATCH /BUMP RETURN FOR MATCH JMP I FMATCH /GOT A MATCH FMATP, 0 /POINTER FOR "FMATCH" FMATC, 0 /COUNTER FOR "FMATCH" FMATF, 0 /FLAG FOR "FMATCH" FMATT, 0 /TEMP FOR "FMATCH" FCMP1, 0 /POINTER FOR FIRST FILE NAME BLOCK FCMP2, 0 /POINTER FOR SECOND FILE NAME BLOCK PAGE /014 CJL / REMOTE LINK INPUT ROUTINE. / CALL = RPACK. ILINK, 0 TAD RETRY /SET UP A RE-TRY COUNT DCA ILINK6 /RE-TRY COUNT FOR INPUT ERRORS ILINK0, JMS I (GETSOH) /FIRST GET THE "SOH" BYTE JMP ILINK2 /RETURN HERE ON TIME-OUT DCA ILINK9 /INIT CHECKSUM REGISTER TAD [RRLEN] /GET REMOTE RECEIVE BUFFER ADDRESS DCA ILINK8 /STORE IN LOCAL POINTER JMS I (GETIR) /GET A CHAR JMP ILINK2 /GOT A RETURN OR TIME-OUT DCA I ILINK8 /STORE LENGTH IN BUFFER TAD I ILINK8 /GET LENGTH CHAR BACK TAD (-40-1 /CHAR FUNCTION - LENGTH BYTE CIA /NEGATE FOR COUNTER DCA ILINK7 /STORE IN LOCAL COUNTER ILINK1, ISZ ILINK8 /BUMP POINTER JMS I (GETIR) /GET NEXT CHAR JMP ILINK2 /GOT A RETURN DCA I ILINK8 /STORE IN BUFFER ISZ ILINK7 /BUMP COUNTER JMP ILINK1 /LOOP ISZ ILINK8 NL7777 /SET -1 /032 CJL DCA I ILINK8 TAD ILINK9 /GET CALCULATED CHECKSUM JMS I [CKSUM] /CALCULATE 1 BYTE CHECKSUM CIA /NEGATE FOR COMPARE DCA ILINK7 /STORE TEMP JMS I (GETIR) /NOW GET CHECKSUM JMP ILINK2 /GOT A RETURN TAD ILINK7 /COMPARE WITH CALCULATED CHECKSUM SNA CLA /SKIP IF NOT SAME JMP ILINK4 /ARE SAME ILINK2, CLA CLL /INSURE CLEAR AC ISZ ILINK6 /BUMP RE-TRY COUNTER JMP ILINK3 /CAN RE-TRY TAD (RPERMSG) /GET MESSAGE FOR FATAL PACKET ERROR /025 CJL JMP I [CLOOP7] /AND ABORT THE MESS ILINK3, TAD ABFLAG /GET ABORT FLAG /044 CJL SZA CLA /SKIP IF NO JMP I (ABORT) /ABORT THIS JMS I (SNDNAK) /SEND BACK A "NAK" JMP ILINK0 /AND TRY AGAIN ILINK4, TAD ABFLAG /GET ABORT FLAG /044 CJL SNA CLA /SKIP IF YES JMP I ILINK /NOPE, RETURN JMP I (ABORT) ILINK6, 0 /LOCAL TO "ILINK" ILINK7, 0 /LOCAL TO "ILINK" ILINK8, 0 /LOCAL TO "ILINK" ILINK9, 0 /LOCAL TO "ILINK" / HELP COMMAND ROUTINE. /024 CJL HELPSRV,.-. /HELP ROUTINE JMS I [CRESET] /RESET CONSOLE ROUTINE STUFF JMS I [SCRIBE] /GIVE THEM THE HELPMSG /HELP MESSAGE TAD ESCHAR /GET THE ESCAPE CHARACTER JMS I [ESCPRNT] /PRINT IT JMS I [SCRIBE] /DO A CRLF /<CR>, <LF> ISZ HELPSRV /BUMP PAST ERROR RETURN JMP I HELPSRV /RETURN / ROUTINE TO PRINT THE DATA IN THE RECEIVED PACKET. PRIPAK, 0 PRI8B; RRDTA /PRINT THE DATA JMS I [SCRIBE] /DO A /025 CJL CRLF /<CR>, <LF> /025 CJL JMP I PRIPAK /DONE PAGE /014 CJL / ROUTINE TO SERVICE A SEND REQUEST. SNDSRV, 0 JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL TAD (MSEND) /FIRST SET MODE TO SEND DCA KMODE /PUT INTO MODE FLAG TAD LPTR /GET CURRENT LINE POINTER DCA PRSERR /SAVE LINE POSITION TAD PRSERR /GET LINE POSITION JMS I [DPARS] /TRY TO PARSE OFF A DEVICE NAME JMS SNDERROR /RETURN A DEVICE NAME ERROR /026 CJL SER1, DCA PRSERR /SAVE LINE POINTER /026 CJL TAD (FNBLK /GET FILE NAME BLOCK ADDRESS DCA FNPTR /STORE IN POINTER TAD PRSERR /GET STRING POINTER JMS I [PFNAM] /PARSE OFF THE FILE NAME JMS SNDERROR /FILE NAME PARSE ERROR /026 CJL SER2, DCA PRSERR /SAVE THE STRING POINTER /026 CJL TAD PRSERR /GET THE STRING POINTER JMS I [NOSP] /FIND THE END OF STRING SKP /GOT END OF STRING HERE JMS SNDERROR /SYNTAX ERROR /026 CJL SER3, DCA PRSERR /RETURN POINTER /026 CJL TAD DEVNUM /GET THE DEVICE NUMBER PARSED JMS I [HFETCH] /FETCH A HANDLER FOR THIS JMS SNDERROR /HANDLER FETCH ERROR /026 CJL SER4, DCA FILFND /INIT FILE FOUND FLAG DCA INIFLG /CLEAR THE INIT DONE FLAG NL0001 /INITIALIZE DIRECTORY /028 CJL DCA SLFLAG /LOOKUP FLAG /028 CJL SNDSV1, TAD (FNBLK /GET FILE NAME BLOCK ADDRESS DCA I (FCMP1) /SET FOR FILE TO FINE TAD SLFLAG /GET DIRECTORY FLAG /028 CJL JMS I (LUKUP) /FIND A MATCH FOR THIS FILE JMS SNDERROR /DIRECTORY I/O ERROR /026 CJL SER5, JMP S00 /FILE NOT FOUND /026 CJL ISZ FILFND /BUMP FILE FOUND COUNT DCA SLFLAG /DON'T INITIALIZE LOOKUP AGAIN JMS I (SNDPRO) /PROCESS THIS FILE FOR SEND JMS SNDERROR /ERROR IN FILE SEND PROCESS /026 CJL SER6, TAD WILDF /WAS WILD CARD FILE SPEC? /026 CJL SZA CLA /SKIP IF NO JMP SNDSV1 /GOT WILD CARD, TRY FOR NEXT S00, TAD FILFND /CHECK FOR ANY FILES FOUND SNA CLA /SKIP IF YES JMS SNDERROR /RETURN FILE NOT FOUND ERROR /026 CJL SER7, JMS BRKXMT /BREAK THE SEND /026 CJL TAD PRSERR /GET CURRENT CURSOR POSITION DCA LPTR /UPDATE ISZ SNDSRV /BUMP RETURN JMP I SNDSRV /AND DONE / SEND ERRORS COME HERE. /026 CJL SNDERRO,.-. /SEND ERROR ROUTINE CLA /CLEAN UP TAD SNDERROR /GET CALLER JMS I [SRCHTABLE] /GO MATCH IT SNERTABLE-1-1 /IN ERROR TABLE JMP I SNDSRV /TAKE ERROR EXIT WITH MESSAGE ADDRESS IN AC / SEND ERROR MESSAGE DISPATCH TABLE. /026 CJL SNERTAB,-SER1; DNERMSG /DEVICE NAME ERROR -SER2; FNERMSG /FILE NAME ERROR -SER3; FSERMSG /FILE NAME SYNTAX ERROR -SER4; SHFEMSG /HANDLER FETCH ERROR -SER5; SDERMSG /DIRECTORY I/O ERROR -SER6; SNDEMSG /SEND ERROR -SER7; NOTFND /LOOKUP 0 /THIS ENDS THE LIST FILFND, 0 /HOLDS COUNT OF # OF FILES FOUND SLFLAG, .-. /LOOKUP INITIALIZE FLAG /028 CJL FNBLK, 0 0 0 0 / ROUTINE TO RE-SET THE SEND. BRKXMT, .-. CLA CLL /INSURE CLEAR AC DCA INIFLG /CLEAR THE INIT SEND FLAG FPACK /FORMAT A PACKET NODATA /NO DATA FOR THIS PACKET STEOT /"EOT" PACKET TYPE SPACK /SEND THE PACKET 1 /READ RESPONSE /042 CJL 0 /DO NOT DISPATCH /042 CJL JMP I BRKXMT /DONE / ROUTINE TO SEND OUT A NAK WITHOUT DISTURBING THE NORMAL PACKET BUFFER. SNDNAK, 0 NL7777 /-1 /042 CJL TAD CURSEQ /ADD ON CURRENT SEQUENCE NUMBER /042 CJL AND [77] /MODULO 64 /042 CJL TAD [40] /TAKE CHAR(SEQUENCE NUMBER) /042 CJL DCA NAKPAK+2 /PUT IN NAK PACKET BUFFER TAD NAKPAK+1 /GET LENGTH TAD NAKPAK+2 /GET SEQ TAD NAKPAK+3 /GET TYPE JMS I [CKSUM] /CALCULATE CHECKSUM DCA NAKPAK+4 /PUT IN CHECKSUM TAD REOL /GET ANY EOL REQUIRED TAD [-40] /UN-CHAR IT /014/016 CJL SNA /SKIP IF USING NL7777 /NO EOL, PUT IN -1 INSTEAD /032 CJL DCA NAKPAK+5 /PUT EOL IN REM8B; NAKPAK /SEND NAK TO REMOTE JMP I SNDNAK /DONE NAKPAK, CNTRLA /MARK /042 CJL " &77+3 /LENGTH OF NAK PACKET /042 CJL .-. /SEQUENCE NUMBER GOES HERE /042 CJL STNAK /DATA TYPE .-. /CHECKSUM /042 CJL .-. /<EOL> IF USED /042 CJL -1 /TERMINATE / FILENAME BUFFER. /014 CJL NAMBUFF,ZBLOCK 12 /FILENAME.EXTENSION (WITH TERMINATOR) GOES HERE PAGE /014 CJL / ROUTINE TO SERVICE A "GET" COMMAND. GETSRV, 0 JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL TAD (MREC) /GET OUR MODE VALUE /045 CJL DCA KMODE /SETUP NOW /045 CJL TAD LPTR /GET CURRENT LINE POINTER DCA PRSERR /SAVE TAD PRSERR /RE-GET IT JMS I [DPARS] /PARSE OFF THE DEVICE NAME /006/014 CJL JMP GSRV50 /ERROR IN DEVICE NAME /006 JMS I [NOSP] /FIND BEGINNING OF A FILE NAME JMP GSRV22 /GOT <EOL>, NO FILE NAME /006/014 CJL DCA GSRV90 /STORE BEGINNING ADDRESS TAD GSRV90 /NOW WE LOOK FOR JMS I [SP] /THE END OF THE LINE SKP /GOT THE END OF THE LINE HERE JMP .-2 /NOT END YET, CONTINUE DCA PRSERR /STORE POINTER TO EOL NL7777 /SET -1 /032 CJL DCA I PRSERR /TERMINATE FILE NAME WITH -1 DCA CURSEQ /RE-SET THE SEQUENCE TAD GSRV90 /GET ADDRESS OF FILE NAME GSRV10, FPACK /FORMAT THE PACKET GSRV90, 0 /DATA ADDRESS HERE STRIN /RECIEVE INIT PACKET GSRV12, SPACK /SEND THE PACKET 1 /GET RESPONSE GSRV80-2 /DISPATCH TABLE /027 CJL / SERVICE A NAK OR UNDEFINED. GSRV15, ISZ RTRYC /BUMP THE RE-TRY COUNTER JMP GSRV12 /TRY AGAIN JMP I GETSRV /GIVE UP / SERVICE A SEND/INIT FROM THE REMOTE. GSRV20, JMS I (INPSRV) /HANDLE JUST LIKE A RECEIVE JMP GSRV21 /ERROR RETURN FROM "INPSRV" ISZ GETSRV /BUMP RETURN FOR NO ERROR TAD PRSERR /UPDATE THE CURRENT LINE POINTER DCA LPTR GSRV21, JMP I GETSRV GSRV22, CLA CLL /MAKE SURE WE ARE CLEAR /009/014 CJL TAD [NOTFND] /GET ERROR MESSAGE ADDRESS /025 CJL JMP I GETSRV /TAKE ERROR RETURN /009/014 CJL / GOT AN ERROR PACKET, DISPLAY ERROR AND ABORT. GSRV40, JMS I [PRIPAK] /PRINT OUT THE ERROR PACKET JMP I GETSRV /TAKE THE ERROR EXIT / GOT DEVICE ERROR. /006/014 CJL GSRV50, CLA CLL /ENSURE CLEAR AC /006/014 CJL TAD (DNERMSG) /GET ERROR MESSAGE ADDRESS /025 CJL JMP I GETSRV /TAKE ERROR RETURN /006/014 CJL / DISPATCH TABLE. GSRV80, STERR; GSRV40 /ERROR PACKET RETURNED STSIN; GSRV20 /SEND INIT PACKET RETURNED STNAK; GSRV15 /NAK PACKET RETURNED 0 /TERMINATE TABLE / ROUTINE TO SERVICE A "RECEIVE" COMMAND. RECSRV, 0 JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL TAD (MREC) /GET OUR MODE VALUE /045 CJL DCA KMODE /SETUP NOW /045 CJL TAD LPTR /GET CURRENT LINE POINTER DCA PRSERR /SAVE IT TAD PRSERR /GET IT BACK JMS I [DPARS] /PARSE OFF DEVICE NAME /018 CJL JMP RECS30 /ERROR IN DEVICE NAME /018 CJL JMS I [NOSP] /CHECK IF BEGINNING OF FILE NAME /014 CJL SKP /GOT <EOL> HERE /018 CJL JMP RECS60 /SOMETHING ELSE ON LINE, ERROR /014 CJL DCA PRSERR /SAVE CURRENT LINE POINTER /018 CJL RPACK /GET SEND/INIT PACKET FROM REMOTE JMS I (DISPATCH) /DISPATCH BASED ON RRTYP /031 CJL RECS80-2 /TABLE ADDRESS /027/031 CJL JMP RECS60 /DON'T KNOW WHAT IT IS / GOT A SEND INIT PACKET. RECS10, JMS I (INPSRV) /OFF TO HANDLE INPUT JMP RECS60 /ERROR RETURN / TAKE THE NON-ERROR RETURN. RECS20, ISZ RECSRV /BUMP FOR NON-ERROR RETURN TAD PRSERR /GET CURRENT CURSOR POSITION /018 CJL DCA LPTR /UPDATE IT /018 CJL JMP I RECSRV / GOT ERROR IN DEVICE NAME. /018 CJL RECS30, CLA CLL /CLEAN UP /018 CJL TAD (DNERMSG) /GET ERROR MESSAGE ADDRESS /025 CJL JMP I RECSRV /TAKE ERROR RETURN /018 CJL / TAKE THE ERROR RETURN. RECS60, CLA JMP I RECSRV /TAKE ERROR EXIT / DISPATCH TABLE. RECS80, STSIN; RECS10 /SEND INIT PACKET DISPATCH STEOT; RECS60 /END OF CONNECTION STBRK; RECS20 /BREAK TRANSMISSION 0 RECS90, 0 /TEMP FOR "RECSRV" / KEYBOARD LINE BUFFER. /014 CJL LINBUF, ZBLOCK LINSIZE /LINE BUFFER PAGE /014 CJL / ROUTINE TO SERVICE INPUT OF A FILE. INPSRV, 0 JMS I (SETINI) /SET UP INIT REGISTERS DCA OFFLG /INITIALIZE OUTPUT FILE FLAG /036 CJL CIF USRFLD /GOTO USR FIELD /037 CJL JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /037 CJL RESET /RESET TABLES /037 CJL DCA CURSEQ /RE-SET THE SEQUENCE NUMBER FPACK /FORMAT A PACKET INIDAT /PACKET DATA ADDRESS STACK /"ACK" PACKET TYPE INPS01, SPACK /SEND A PACKET 1 /AWAIT RESPONSE INPS91-2 /DISPATCH TABLE ADDRESS /027 CJL / NAK OR UNDEFINED RESPONSE HERE. INPS02, ISZ RTRYC /GOT A NAK, CHECK RE-TRY COUNT JMP INPS01 /RE-TRY THE INIT JMS INPERROR /GIVE UP /025 CJL IER02= . /ERROR TABLE ADDRESS /039 CJL INPS03, FPACK /FORMAT A PACKET NODATA /NO DATA STACK /"ACK" PACKET TYPE INPS05, SPACK /SEND A PACKET 1 /AWAIT RESPONSE INPS90-2 /DISPATCH TABLE ADDRESS /027 CJL JMS INPERROR /UNDEFINED RESPONSE /025 CJL IER05= . /ERROR TABLE ADDRESS /039 CJL / GOT A DATA PACKET, WRITE TO OUTPUT FILE. INPS10, TAD OFFLG /CHECK THE OUTPUT FILE FLAG SNA CLA /SKIP IF OUTPUT FILE OPEN JMS INPERROR /ABORT AND EXIT /025 CJL IER10, JMS I (WRIPAK) /WRITE THE PACKET TO THE FILE /039 CJL JMS INPERROR /ERROR WRITING PACKET /025 CJL IER11, JMP INPS03 /LOOP /039 CJL / GOT A FILE HEADER PACKET, OPEN FILE. INPS20, TAD OFFLG /CHECK IF OUTPUT FILE OPEN SZA CLA /SKIP IF NO JMS INPERROR /ABORT IF FILE ALREADY OPEN /025 CJL IER20, TAD I [RRLEN] /GET CURRENT PACKET LENGTH /039 CJL TAD (-40-3 /CALCULATE LENGTH OF DATA SPA /SKIP IF DATA IN THE PACKET JMS INPERROR /ELSE AN ERROR /025 CJL IER21, TAD (RRDTA) /CALCULATE LAST BYTE IN DATA /039 CJL DCA INPS81 /STORE IN POINTER NL7777 /SET -1 /032 CJL DCA I INPS81 /TERMINATE NAME WITH A MINUS WORD TAD (FNBLK /GET ADDRESS OF FILE NAME BLOCK DCA FNPTR /SAVE FOR NAME PARSE TAD (RRDTA /GET ADDRESS OF DATA IN PACKET JMS I [PFNAM] /PARSE OFF THE FILE NAME JMS INPERROR /ERROR IN FILE NAME /025 CJL / GET TARGET DEVICE. IER23, CLA CLL /CLEAR AC FROM FILE NAME PARSE /039 CJL TAD DEVNUM /GET DEVICE NUMBER PARSED /006 DCA ODNUMB /SAVE OUTPUT DEVICE NUMBER TAD ODNUMB /GET NUMBER BACK JMS I [HFETCH] /FETCH HANDLER FOR THIS DEVICE JMS INPERROR /HANDLER FETCH ERROR /025 CJL IER24, TAD (FNBLK) /GET ADDRESS OF FILE NAME BLOCK /039 CJL DCA INPS22 /PUT IN CALL TAD ODNUMB /GET DEVICE NUMBER CIF USRFLD /GOTO USR FIELD /020 CJL JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL ENTER /ENTER TENTATIVE FILE /020 CJL INPS22, 0 / 0 / JMS INPERROR /NO DIRECTORY ROOM /025 CJL IER22, TAD INPS22 /GET NEW FILE START BLOCK /039 CJL DCA FSBLK /SAVE TAD INPS22+1 /GET INDICATED MAXIMUM FILE SIZE /021 CJL IAC /GIVE ONE MORE THAN 2 LESS /021 CJL DCA FLEN /SAVE AS DANGER COUNT /021 CJL ISZ OFFLG /SET FLAG FOR OUTPUT FILE OPEN NL7777 /INDICATE INITIALIZATION /020 CJL JMS I [PUTBYTE] /INITIALIZE OUTPUT FILE ROUTINE /020 CJL HLT /THIS CAN'T HAPPEN! /020 CJL TAD FNPTR /GET POINTER TO 6 BIT FILE NAME JMS I [FILN8] /MAKE 8 BIT FORMATTED STRING JMS I [SCRIBE] /TELL THEM FRECMSG /WE ARE RECEIVING PRI8B; NAMBUF /WHICH FILE WE ARE RECEIVING JMS I [SCRIBE] /DO A CRLF /<CR>, <LF> JMP INPS03 /LOOP / GOT AN END OF FILE PACKET. INPS30, TAD OFFLG /ANY OUTPUT FILE OPEN? SNA CLA /SKIP IF YES JMS INPERROR /ERROR /025 CJL IER30, JMS I [FILCLOSE] /CLOSE THE FILE /020/039 CJL JMS INPERROR /ERROR CLOSING THE FILE /025 CJL IER31,/ DCA OFFLG /RE-SET FILE OPEN FLAG /D009/039 CJL JMP INPS03 /CONTINUE / GOT AN END OF TRANSMISSION PACKET. INPS40, TAD OFFLG /WAS A FILE OPEN? SZA CLA /SKIP IF NO JMS I [FILCLOSE] /CLOSE ANY OPEN FILE /020 CJL NOP /ERROR CLOSING THE FILE **** FIX THIS **** FPACK /FORMAT A PACKET NODATA /NO DATA IN PACKET STACK /"ACK" PACKET TYPE SPACK /SEND THE PACKET 0 /NO RESPONSE ISZ INPSRV /BUMP RETURN FOR NO ERROR JMP I INPSRV /TAKE NON-ERROR EXIT / GOT AN ERROR PACKET. INPS50, JMS I [PRIPAK] /PRINT THE PACKET DATA JMP I INPSRV /AND TAKE THE ERROR EXIT /009/014 CJL / INPUT ERRORS COME HERE. /025 CJL INPERRO,.-. /INPUT ERROR ROUTINE /025 CJL FPACK /FORMAT A PACKET /025 CJL NODATA /NO DATA /025 CJL STBRK /"BREAK LINK" PACKET TYPE /025 CJL SPACK /SEND THE PACKET /025 CJL 0 /NO RESPONSE /025 CJL TAD INPERROR /GET CALLER /025 CJL JMS I [SRCHTABLE] /TRY TO FIND A MATCH /025 CJL INERTABLE-1-1 /IN ERROR TABLE /025 CJL SNA /SKIP IF FOUND PARTICULAR MESSAGE /025 CJL TAD (RERRMSG) /ELSE USE GENERAL MESSAGE /025 CJL JMP I INPSRV /TAKE ERROR RETURN /025 CJL / TEMPS FOR "INPSRV". INPS80, 0 INPS81, 0 PAGE /014 CJL / DISPATCH TABLES FOR "INPSRV". INPS90, STDAT; INPS10 /HANDLE DATA PACKETS STEOF; INPS30 /HANDLE EOF PACKET STEOT; INPS40 /HANDLE END OF TRANSMISSION PACKET STFIL; INPS20 /HANDLE FILE NAME PACKET STERR; INPS50 /HANDLE ERROR PACKET 0 /TERMINATE TABLE INPS91, STNAK; INPS02 /HANDLE A NAK PACKET STFIL; INPS20 /HANDLE FILE NAME PACKET STERR; INPS50 /HANDLE ERROR PACKET 0 /TERMINATE TABLE / INPUT ERROR MESSAGE DISPATCH TABLE. /025/039 CJL INERTAB,-IER05; UPERMSG /UNDEFINED PACKET ERROR /025 CJL -IER11; DSFLMSG /DISK OVERFLOW ERROR /042 CJL -IER22; RIDEMSG /DIRECTORY FULL ERROR /025 CJL -IER23; RFLNMSG /RECEIVED FILE NAME ERROR /025 CJL -IER24; RHFEMSG /HANDLER FETCH ERROR /025 CJL -IER31; FCLEMSG /FILE CLOSE ERROR /025 CJL 0 /THIS ENDS THE LIST /025 CJL / ROUTINE TO CHECK FOR AN ALPHABETIC OR NUMERIC CHAR. / ENTER WITH THE CHAR IN THE AC. / EXIT + 2 IF ALPHABETIC OR NUMERIC WITH CHAR IN THE AC. / EXIT + 1 IF NON-ALPHABETIC OR NUMERIC WITH CHAR IN THE AC. ALPNUM, 0 JMS ALPHA /CHECK FOR ALPHA FIRST SKP /NON-ALPHA RETURN, MUST CHECK NUMERIC JMP ALPNM1 /IS ALPHA, TAKE RETURN + 2 JMS NUMRC /CHECK IF NUMERIC SKP /NOT NUMERIC ALPNM1, ISZ ALPNUM /BUMP RETURN FOR ALPHA-NUMERIC JMP I ALPNUM /DONE / ROUTINE TO CHECK FOR AN ALPHABETIC CHARACTER. / ROUTINE ASSUMES UPPER CASE. / ENTER ROUTINE WITH CHAR IN THE AC. / EXIT + 2 IF THE CHAR IS ALPHABETIC WITH THE CHAR IN THE AC. / EXIT + 1 IF THE CHAR IS NOT ALPHABETIC WITH THE CHAR IN THE AC. ALPHA, 0 DCA ALPHA1 /STORE THE CHAR FOR RETURN TAD ALPHA1 /GET THE CHAR TAD (-"Z!200-1) /ADD ON UPPER LIMIT /034 CJL CLL /INIT LINK FOR A FLAG TAD ("Z-"A+1 SZL /SKIP IF NOT A LETTER ISZ ALPHA /IS A LETTER, BUMP RETURN CLA CLL /CLEAR AC TAD ALPHA1 /RESTORE CHAR IN THE AC JMP I ALPHA /TAKE PROPER RETURN ALPHA1, 0 /TEMP FOR ALPHA ROUTINE / ROUTINE TO CHECK FOR A NUMERIC CHARACTER. / ENTER WITH THE CHAR TO CHECK IN THE AC. / EXIT + 2 IF NUMERIC WITH THE CHAR IN THE AC. / EXIT + 1 IF NON-NUMERIC WITH THE CHAR IN THE AC. NUMRC, 0 DCA NUMRC1 /SAVE THE CHAR FOR RETURN TAD NUMRC1 /GET THE CHAR BACK TAD (-"9!200-1) /ADD ON UPPER LIMIT /034 CJL CLL /INIT LINK FOR A FLAG TAD ["9-"0+1] /016 CJL SZL /SKIP IF NOT A DIGIT ISZ NUMRC /BUMP RETURN FOR NUMERIC CLA CLL /CLEAR AC TAD NUMRC1 /RESTORE CHAR IN THE AC JMP I NUMRC /DONE NUMRC1, 0 /TEMP FOR NUMRC CHECK ROUTINE / ROUTINE TO WRITE THE CURRENT INPUT PACKET TO THE OUTPUT FILE. / ENTER: NOTHING. / EXIT: + 2 = WRITE SUCCESSFUL. / + 1 = WRITE NOT SUCCESSFUL. WRIPAK, 0 TAD I [RRLEN] /GET LENGTH OF PACKET TAD (RRDTA-40-3 /CALCULATE END OF BUFFER DCA W90 /PUT INTO POINTER DCA I W90 /ZERO AFTER END OF BUFFER TAD (RRDTA /GET ADDRESS OF DATA DCA W90 /PUT INTO POINTER W10, TAD I W90 /GET A CHAR FROM PACKET SNA /SKIP IF NOT END JMP W60 /END, EXIT CIA /NEGATE FOR COMPARE TAD RQCTL /COMPARE WITH CURRENT QUOTE CHAR SNA CLA /SKIP IF NOT QUOTE CHAR JMP W20 /IS QUOTE, HANDLE SPECIAL TAD W92 /WAS LAST CHAR A QUOTE? SZA CLA /SKIP IF NO TAD (-100 /IT WAS, FIX UP THIS CHAR JMP W25 /HANDLE REST BELOW W20, TAD W92 /CURRENT CHAR A QUOTE, CHECK PREVIOUS SNA CLA /SKIP IF YES JMP W30 /JUST THIS CHAR IS QUOTE, SET FLAG W25, TAD I W90 /GET CHAR FROM BUFFER JMS I [PUTBYTE] /OUTPUT TO FILE /020 CJL JMP I WRIPAK /ERROR IN OUTPUT /M020 CJL JMP W35 /FINISH BELOW W30, NL0001 CLL /GOTA SET FLAG FOR QUOTE CHARACTER /032 CJL W35, DCA W92 /SET UP QUOTE FLAG ISZ W90 /BUMP POINTER JMP W10 /LOOP W60, ISZ WRIPAK /BUMP RETURN FOR OK JMP I WRIPAK /DONE W90, 0 /POINTER FOR "WRIPAK" W92, 0 /TEMP FOR "WRIPAK" / TABLE SEARCH ROUTINE. /025 CJL / CALLING SEQUENCE: / TAD VALUE /AC CONTAINS VALUE TO MATCH / JMS I [SRCHTABLE] /CALL ROUTINE / TABLE-2 /ADDRESS(TABLE)-2 / RETURN /ALWAYS RETURNS HERE / IF AC=0 THEN NO MATCH OCCURRED. / IF AC IS NON-ZERO, THEN AC CONTAINS CORRESPONDING VALUE TO MATCH WHICH IS ALSO / STORED IN TABLEJUMP. / TABLE FORMAT. / -VALUE; CORRESPONDING VALUE /TABLE PAIR / ""; "" /ADDITIONAL PAIRS AS NECESSARY / 0 /ZERO TERMINATES THE TABLE SRCHTAB,.-. /TABLE SEARCH ROUTINE DCA TABLEJUMP /SAVE PASSED VALUE TO MATCH TAD I SRCHTABLE /GET PASSED POINTER ARGUMENT DCA XR0 /STASH THE POINTER ISZ SRCHTABLE /BUMP PAST ARGUMENT SRCHLUP,ISZ XR0 /BUMP TO NEXT PAIR TAD I XR0 /GET A TABLE VALUE SNA /END OF TABLE? JMP I SRCHTABLE /YES, RETURN WITH CLEAR AC TAD TABLEJUMP /COMPARE TO DESIRED SZA CLA /SKIP IF IT MATCHES JMP SRCHLUP /JUMP IF NOT TAD I XR0 /GET CORRESPONDING VALUE DCA TABLEJUMP /STASH IT TAD TABLEJUMP /GET IT BACK JMP I SRCHTABLE /RETURN WITH CORRESPONDING VAUE IN AC PAGE /014 CJL IFZERO 1 < / OS8 DIRECTORY FILE DATA SETUP. / ENTER WITH THE DIRECTORY DATE WORD IN THE AC. / EXIT WITH THE DATE IN THE BUFFER "DATBUF". FILD8, 0 DCA FILD89 /SAVE THE DATE WORD TAD FILD89 /GET DATA WORD AND (7 /KEEP ONLY YEAR BITS TAD (116 /ADD 78 YEARS MQL /PUT INTO MQ REGISTER TAD (DATEYR /GET POINTER TO YEAR JMS DECCON /CONVERT TO ASCII DATE TAD FILD89 /GET DATE WORD BACK CLL RTR /SHIFT DAY DOWN RAR AND (37 /KEEP ONLY DAY BITS MQL /PUT IN MQ REGISTER TAD (DATEDA /GET POINTER TO DAY JMS DECCON /CONVERT TO ASCII DAY TAD FILD89 /GET DATE WORD BACK BSW /GET MONTH CLL RTR /DOWN AND (17 /KEEP ONLY MONTH BITS MQL /INTO MQ REGISTER TAD (DATEMO /GET ADDRESS OF WHERE TO PUT MONTH JMS DECCON /CONVERT JMP I FILD8 /ALL DONE FILD89, 0 /TEMP FOR "FILD8" / ROUTINE TO CONVERT A BINARY VALUE INTO A TWO DIGIT ASCII DECIMAL NUMBER. / ENTER WITH WHERE TO STORE THE CONVERTED NUMBER IN THE AC AND THE NUMBER IN THE / MQ REGISTER. DECCON, 0 DCA DECC20 /STORE THE POINTER TAD ("0&177-1 /GET AN ASCII ZERO DCA I DECC20 /START OUT WITH A ZERO MQA /GET THE BINARY VALUE DECC01, ISZ I DECC20 /BUMP TAD (-12 /SUB 10 SMA /SKIP IF NO MORE DIVISION JMP DECC01 /ELSE KEEP GOING TAD (12+"0&177 /CONVERT REMAINDER TO ASCII ISZ DECC20 /BUMP POINTER DCA I DECC20 /STORE / JMS FMTDAT /FORMAT FOR PRINTING /D013 JMP I DECCON /DONE > IFZERO 1 < DECC20, 0 /LOCAL POINTER TO DECCON / ROUTINE TO SET UP THE DATE IN A MM-DD-YY FORMAT TO PUT IN FRONT OF A FILE TO / PASS THE FILES DATE (TEMPORY AND NOT PART OF THE KERMIT PROTOCOL). FMTDAT, 0 TAD DATEMO /GET FIRST CHAR OF DATE DCA FDATE /MOVE IT TAD DATEMO+1 DCA FDATE+1 TAD DATEDA DCA FDATE+3 TAD DATEDA+1 DCA FDATE+4 TAD DATEYR DCA FDATE+6 TAD DATEYR+1 DCA FDATE+7 JMP I FMTDAT /QUICK AND DIRTY DATBUF, "#&177 /FILE CREATION DATE ATTRIBUTE 6+40 /LENGTH OF DATE (CHAR(X)) DATEYR, 0 /ASCII YEAR GOES HERE 0 DATEMO, 0 /ASCII MONTH GOES HERE 0 DATEDA, 0 /ASCII DAY GOES HERE 0 -1 /TERMINATE / FORMATTED DATE GOES HERE. SETDAT,"ANGLEBRACKET&177 /COMMENT SIGN FDATE, 0 0 "-&177 0 0 "-&177 0 0 12 15 -1 > / DIRECTORY LOOKUP ROUTINE. /028 CJL / CALLING SEQUENCE: / NL0001 /IF INITIALIZING THE DIRECTORY / OR / CLA /CLEAR AC IF SUBSEQUENT CALL / JMS I (LUKUP) /CALL ROUTINE / I/O ERROR /DIRECTORY I/O ERROR RETURN WITH AC DIRTY / NOT FOUND /FILE NOT FOUND RETURN / FOUND /LATEST FILE MATCHES REQUEST / SETS FLEN TO -(FILE LENGTH) IN RECORDS. / SETS FSBLK TO STARTING RECORD OF FILE. / MODIFIES DIRECTORY SEGMENT SLIGHTLY (NOT TO BE WRITTEN BACK). / DEPENDS ON DIRXR BEING UNTOUCHED BY OTHER ROUTINES. LUKUP, .-. /DIRECTORY LOOKUP ROUTINE SNA /INITIALIZING DIRECTORY? JMP NXTFILE /NO, JUST GET ANOTHER FILE IF POSSIBLE NEXTSEG,DCA DIRRECORD /STORE LATEST DIRECTORY SEGMENT RECORD JMS I HNDADR /CALL I/O HANDLER PAGCNT^100+DIRFLD /READ IN A DIRECTORY SEGMENT DIRBUFFER /DIRECTORY I/O BUFFER DIRRECO,.-. /WILL BE LATEST SEGMENT NUMBER JMP I LUKUP /I/O ERROR, TAKE DIRTY IMMEDIATE RETURN CDF DIRFLD /GOTO DIRECTORY FIELD TAD I (FRSTRECORD) /GET FIRST RECORD OF FIRST ENTRY DCA FSBLK /STASH IT TAD (ENTSTRT-1) /POINT TO DCA DIRXR /ENTRIES LOOKLUP,TAD I DIRXR /GET FIRST WORD OF ENTRY SNA /SKIP IF NOT EMPTY JMP EMPENTRY /JUMP IF EMPTY ENTRY DCA FNAME /STORE FIRST FILENAME WORD TAD I DIRXR /GET NEXT DCA FNAME+1 /STORE SECOND FILENAME WORD TAD I DIRXR /GET NEXT DCA FNAME+2 /STORE THIRD FILENAME WORD TAD I DIRXR /GET NEXT DCA FNAME+3 /STORE EXTENSION WORD NL7777 /BACKUP TAD I (AIWNUMBER) /GET ADDITIONAL INFORMATION WORD COUNT DCA AIWCNT /STASH THE COUNTER DCADATW,DCA DATWORD /CLEAR THE DATE WORD TAD DCADATW/(DCA DATWORD)/GET STORING INSTRUCTION DCA AIWSTORE /STORE IN-LINE JMP AIWTEST /START LOOP THERE AIWLUP, TAD I DIRXR /GET A WORD FROM ENTRY AIWSTOR,DCA DATWORD+.-. /STORE IN PROPER WORD ISZ AIWSTORE /BUMP TO NEXT INSTRUCTION AIWTEST,ISZ AIWCNT /DONE ALL ADDITIONAL INFORMATION WORDS? JMP AIWLUP /NO, KEEP GOING TAD I DIRXR /GET THE FILE LENGTH SNA /SKIP IF VALID JMP TENTRY /JUMP IF ONLY TENTATIVE FILE (NO LENGTH) DCA FILENGTH /STORE FILE LENGTH CDF PRGFLD /BACK TO OUR FIELD / JMS I (FILTER) /CHECK IF WE LIKE THIS ONE TAD (FNAME) /POINT TO LATEST FILENAME JMS I (FMATCH) /CHECK FOR A MATCH JMP NXTFILE /FORGET THIS ONE, IT DIDN'T MATCH TAD FILENGTH /GET FILE LENGTH DCA FLEN /GIVE TO CALLER TO DESTROY TAD (FNAME) /POINT TO FILENAME JMS I [FILN8] /PUT IN CHARACTER FORM IN BUFFER ISZ LUKUP /BUMP TO FILE MATCH RETURN JMP FLEXIT /EXIT THERE / COMES HERE FROM SUBSEQUENT CALL OR MATCH FAILURE. NXTFILE,CDF DIRFLD /GOTO BUFFER FIELD TAD FILENGTH /GET LATEST FILE LENGTH SKP /DON'T DO EMPTY LENGTH / COMES HERE TO BYPASS AN EMPTY ENTRY. EMPENTR,TAD I DIRXR /GET LENGTH OF EMPTY CIA /WANT POSITIVE FORM TAD FSBLK /UPDATE TO NEXT FILE RECORD DCA FSBLK /STORE UPDATED VALUE TENTRY, ISZ I (FILECNT) /DONE WITH THIS SEGMENT? JMP LOOKLUP /NO, KEEP GOING TAD I (DIRLINK) /GET LINK TO NEXT SEGMENT CDF PRGFLD /BACK TO OUR FIELD SZA /END OF DIRECTORY? JMP NEXTSEGMENT /NO, GO DO NEXT SEGMENT FLEXIT, ISZ LUKUP /BUMP PAST I/O ERROR EXIT JMP I LUKUP /RETURN FOR FILE NOT FOUND AIWCNT, .-. /ADDITIONAL INFORMATION WORD COUNTER DATWORD,.-. /DATE WORD STORED HERE (0000 IF NONE) ZBLOCK 7 /ROOM FOR MORE ADDITIONAL INFORMATION WORDS FILENGT,.-. /LATEST FILE LENGTH FNAME, ZBLOCK 4 /FILENAME AND EXTENSION STORED HERE PAGE / OS/8 FILE UNPACK ROUTINE. /019 CJL / THIS ROUTINE UNPACKS BYTES FROM THE INPUT FILE ACCORDING TO THE CURRENT VALUE / OF FILMODE: / FILMODE CONTAINS 0177 (ASCII MODE). ALL BYTES ARE TREATED AS SEVEN-BIT ASCII / CHARACTERS BY STRIPPING THE HIGH-ORDER BIT. END OF FILE IS THE <^Z> CHARACTER / WHICH WILL BE SENT OR NOT ACCORDING TO THE CONTENTS OF OCTLZFLAG. IF / OCTLZFLAG CONTAINS NON-ZERO, THEN <^Z> WILL BE SENT AT <EOF>; THE NEXT CALL / WILL YIELD THE <EOF> RETURN. IF OCTLZFLAG CONTAINS ZERO, THEN DETECTION OF / <^Z> YIELDS THE <EOF> RETURN IMMEDIATELY. / FILMODE CONTAINS 4377 (BINARY MODE). ALL BYTES ARE TREATED AS EIGHT-BIT / CHARACTERS AND WILL BE SENT WITHOUT <^Z> CHECK. THE NEXT CALL AFTER THE LAST / BYTE OF THE LAST RECORD HAS BEEN SENT YIELDS THE <EOF> RETURN. / CALLING CONSIDERATIONS: / OCTLZFLAG MUST BE SETUP ACCORDINGLY IF IN ASCII MODE. / FILMODE MUST BE SETUP ACCORDINGLY. / FLEN MUST CONTAIN -(FILE LENGTH IN RECORDS) WHEN INITIALIZING THE INPUT FILE. / IT WILL BE MODIFIED BY CALLING THIS ROUTINE. / FSBLK MUST CONTAIN THE THE STARTING RECORD WHEN INITIALIZING THE INPUT FILE. / HNDADR MUST ALREADY BE SETUP TO CALL THE INPUT HANDLER. / CALLING SEQUENCE: / CLA /OR NL7777 IF INITIALIZING THE INPUT FILE / JMS I (GETBYTE) /CALL ROUTINE / I/O ERROR RETURN /FATAL INPUT ERROR OCCURRED; AC CONTAINS JUNK / END OF FILE /<EOF> OCCURRED / GOOD RETURN /AC CONTAINS LATEST SEVEN/EIGHT-BIT CHARACTER GETBYTE,.-. /GET A BYTE ROUTINE SNA CLA /INITIALIZING? JMP I PUTC /NO, GO GET NEXT BYTE TAD FSBLK /GET STARTING RECORD OF INPUT FILE DCA GETRECORD /STORE IN-LINE GETNEWR,JMS I HNDADR /CALL I/O HANDLER PAGCNT^100+BUFFLD /READ SOME PAGES INTO BUFFER FIELD GETCORE,FILBUFFER /BUFFER ADDRESS GETRECO,.-. /WILL BE LATEST RECORD NUMBER JMP I GETBYTE /INPUT ERROR! TAD GETCORE/(FILBUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER GETLOOP,DCA THIRD /CLEAR THIRD BYTE NOW JMS PUTONE /OBTAIN AND SEND BACK FIRST BYTE JMS PUTONE /OBTAIN AND SEND BACK SECOND BYTE TAD THIRD /GET THIRD BYTE JMS PUTC /SEND IT BACK TAD BUFPTR /GET THE POINTER TAD (-PAGCNT^200-FILBUFFER) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP GETLOOP /KEEP GOING ISZ GETRECORD /BUMP TO NEXT RECORD ISZ FLEN /DONE ALL RECORDS? (BINARY MODE ONLY) JMP GETNEWRECORD /NO, GO DO ANOTHER ONE / BINARY <EOF> REACHED HERE. JMP GETEOF /TAKE SKIP RETURN TO MAIN CALLER PUTONE, .-. /SEND BACK A BYTE ROUTINE CDF BUFFLD /GOTO BUFFER FIELD TAD I BUFPTR /GET LATEST WORD AND [7400] /JUST THIRD-BYTE NYBBLE CLL RAL /MOVE UP TAD THIRD /GET OLD NYBBLE (IF ANY) RTL;RTL /MOVE UP NYBBLE BITS DCA THIRD /SAVE FOR NEXT TIME TAD I BUFPTR /GET LATEST WORD AGAIN JMS PUTC /SEND BACK CURRENT BYTE ISZ BUFPTR /BUMP TO NEXT WORD JMP I PUTONE /RETURN PUTC, .-. /SEND BACK LATEST BYTE ROUTINE CDF PRGFLD /BACK TO OUR FIELD RAL /MOVE UP STL RAR /MOVE DOWN WITH BIT[0] SET AND FILMODE /KEEP ONLY GOOD BITS TAD [-CNTRLZ] /COMPARE TO <^Z> SNA /SKIP IF NOT ASCII MODE <EOF> JMP GETEND /JUMP IF ASCII MODE <EOF> GETUPZ, TAD [CNTRLZ] /RESTORE THE CHARACTER AND [377] /ENSURE EIGHT-BIT (MIGHT ALREADY BE SEVEN-BIT) ISZ GETBYTE /BUMP PAST <EOF> RETURN GETEOF, ISZ GETBYTE /BUMP PAST I/O ERROR RETURN JMP I GETBYTE /RETURN TO MAIN CALLER / GOT <Z> IN ASCII MODE. GETEND, TAD OCTLZFLAG /GET <^Z> DISPOSITION FLAG SNA CLA /SKIP IF SET JMP GETEOF /JUST RETURN <EOF> CONDITION TAD (GETEOF) /POINT TO <EOF> DCA PUTC /FOR NEXT TIME JMP GETUPZ /GIVE THEM BACK <^Z> THIS TIME / OS/8 FILE PACK ROUTINE. /020 CJL / THIS ROUTINE PACKS BYTES INTO THE OUTPUT FILE ACCORDING TO THE CURRENT VALUE / OF FILMODE: / FILMODE CONTAINS 0177 (ASCII MODE). ALL BYTES ARE TREATED AS SEVEN-BIT ASCII / CHARACTERS BY STRIPPING THE HIGH-ORDER BIT. / FILMODE CONTAINS 4377 (BINARY MODE). ALL BYTES ARE TREATED AS EIGHT-BIT / CHARACTERS AND WILL BE WRITTEN AS IS. / CALLING CONSIDERATIONS: / FILMODE MUST BE SETUP ACCORDINGLY. / FLEN MUST CONTAIN -(MAXIMUM FILE LENGTH IN RECORDS) WHEN INITIALIZING THE / TENTATIVE OUTPUT FILE. IT WILL BE MODIFIED BY CALLING THIS ROUTINE. / FSBLK MUST CONTAIN THE STARTING RECORD WHEN INITIALIZING THE TENTATIVE OUTPUT / FILE. / HNDADR MUST ALREADY BE SETUP TO CALL THE OUTPUT HANDLER. / CALLING SEQUENCE: / NL7777 /ANY NEGATIVE VALUE / JMS I [PUTBYTE] /CALL ROUTINE TO INITIALIZE / IMPOSSIBLE /CAN'T RETURN HERE / GOOD RETURN /ALWAYS RETURNS HERE / OR / TAD (CHAR&377) /ANY EIGHT-BIT (OR LESS) VALUE / JMS I [PUTBYTE] /CALL ROUTINE TO PACK A CHARACTER / ERROR RETURN /I/O ERROR WHILE WRITING A BUFFER / GOOD RETURN /CHARACTER PACKED WITH NO ERRORS / ALL RETURNS CLEAR THE AC. PUTBYTE,.-. /OUTPUT A BYTE ROUTINE SPA /ARE WE INITIALIZING? JMP PUTINITIALIZE /YES AND FILMODE /REDUCE TO SEVEN-BIT/EIGHT-BIT DCA LATEST /SAVE LATEST CHARACTER CDF BUFFLD /GOTO BUFFER FIELD TAD LATEST /GET LATEST CHARACTER JMP I PUTNEXT /GO WHERE YOU SHOULD GO PUTNEXT,.-. /EXIT ROUTINE ISZ PUTBYTE /BUMP TO GOOD RETURN PUTERRO,CLA CLL /CLEAN UP CDF PRGFLD /BACK TO OUR FIELD JMP I PUTBYTE /RETURN TO MAIN CALLER PUTINIT,CLA /CLEAN UP TAD FSBLK /GET STARTING RECORD OF TENTATIVE FILE DCA PUTRECORD /STORE IN-LINE DCA I (FLENGTH) /CLEAR ACTUAL FILE LENGTH PUTNEWR,TAD PUTCORE/(FILEBUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER PUTLOOP,JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT TAD BUFPTR /GET POINTER VALUE DCA TEMPTR /SAVE FOR LATER ISZ BUFPTR /BUMP TO NEXT JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT JMS PUTNEXT /GET A CHARACTER RTL;RTL /MOVE UP AND [7400] /ISOLATE HIGH NYBBLE TAD I TEMPTR /ADD ON FIRST BYTE DCA I TEMPTR /STORE COMPOSITE TAD LATEST /GET LATEST CHARACTER RTR;RTR;RAR /MOVE UP AND AND [7400] /ISOLATE LOW NYBBLE TAD I BUFPTR /ADD ON SECOND BYTE DCA I BUFPTR /STORE COMPOSITE ISZ BUFPTR /BUMP TO NEXT TAD BUFPTR /GET LATEST POINTER VALUE TAD (-PAGCNT^200-FILBUFFER) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP PUTLOOP /KEEP GOING CDF PRGFLD /BACK TO OUR FIELD ISZ FLEN /TOO MANY RECORDS? SKP /SKIP IF NOT JMP I PUTBYTE /TAKE ERROR RETURN JMS I HNDADR /CALL I/O HANDLER PAGCNT^100+BUFFLD+WRITE /WRITE SOME PAGES FROM BUFFER FIELD PUTCORE,FILBUFFER /BUFFER ADDRESS PUTRECO,.-. /WILL BE LATEST RECORD NUMBER JMP PUTERROR /OUTPUT ERROR! ISZ I (FLENGTH) /BUMP ACTUAL LENGTH ISZ PUTRECORD /BUMP TO NEXT RECORD JMP PUTNEWRECORD /KEEP GOING BUFPTR, .-. /INPUT/OUTPUT BUFFER POINTER / ASCII FILE MODE <^Z> OUTPUT DISPOSITION FLAG. OCTLZFL,OCLOSE /ZERO=DON'T SEND <^Z> AT <EOF>, /NON-ZERO=SEND <^Z> AT <EOF> THIRD= PUTNEXT /THIRD BYTE TEMPORARY TEMPTR= PUTONE /TEMPORARY BUFFER POINTER PAGE / OUTPUT FILE CLOSE ROUTINE /020 CJL / THIS ROUTINE CLOSES THE OPEN OUTPUT FILE ACCORDING TO THE CURRENT VALUE OF / FILMODE: / FILMODE CONTAINS 0177 (ASCII MODE). ALL BYTES PRIOR TO CLOSE ARE STRIPPED / SEVEN-BIT CHARACTERS. IF THE LAST CHARACTER SENT TO PUTBYTE (CONTENTS OF / LATEST) IS A <^Z>, THEN JUST CLOSE THE FILE. IF NOT, THEN IF ICTLZFLAG IS / NON-ZERO, INSERT A <^Z> CHARACTER INTO THE FILE AS <EOF> INDICATOR, ELSE JUST / CLOSE THE FILE. / FILMODE CONTAINS 4377 (BINARY MODE). ALL BYTES PRIOR TO CLOSE ARE EIGHT-BIT / CHARACTERS. IF NECESSARY, <NUL> CHARACTERS WILL BE APPENDED TO THE END OF THE / LAST BLOCK OF THE FILE TO FILL IT. THE FILE IS CLOSED OTHERWISE UNMODIFIED. / CALLING CONSIDERATIONS. / OFFLG MUST BE SET (OUTPUT FILE IS OPEN). / FLENGTH MUST CONTAIN THE ACTUAL FILE LENGTH. / LATEST MUST CONTAIN THE LAST BYTE SENT TO THE OUTPUT FILE VIA PUTBYTE (ASCII / MODE ONLY). / ICTLZFLAG MUST BE SETUP ACCORDINGLY. / FILMODE MUST BE SETUP ACCORDINGLY. / CALLING SEQUENCE: / CLA CLL /CLEAR AC / JMS I (FILCLOSE) /CALL ROUTINE / ERROR RETURN /ERROR WHILE CLOSING FILE / GOOD RETURN /FILE CLOSED PROPERLY / ON RETURN, OFFLG WILL BE CLEAR; THE AC WILL BE CLEAR ALSO. FILCLOS,.-. /OUTPUT FILE CLOSE ROUTINE TAD FILMODE /GET CURRENT FILE MODE SPA CLA /SKIP IF ASCII JMP CLOSIT /JUMP IF BINARY TAD LATEST /GET LATEST CHARACTER TAD [-CNTRLZ] /COMPARE TO <^Z> SZA CLA /SKIP IF <^Z> ALREADY IN FILE TAD ICTLZFLAG /GET <^Z> DISPOSITION FLAG SNA CLA /SKIP IF SET JMP CLOSIT /JUMP IF NOT TAD [CNTRLZ] /GET A <^Z> CLOSLUP,JMS I [PUTBYTE] /OUTPUT A BYTE JMP CLOSERROR /ERROR WHILE WRITING CLOSIT, TAD I (BUFPTR) /GET THE BUFFER POINTER TAD (-FILBUFFER) /COMPARE TO RESET VALUE SZA CLA /SKIP IF IT MATCHES JMP CLOSLUP /ELSE KEEP GOING TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL CLOSE /CLOSE FILE FNBLK /=> FILENAME FLENGTH,.-. /ACTUAL FILE LENGTH CLOSERR,SKP CLA /ERROR WHILE CLOSING THE FILE ISZ FILCLOSE /BUMP RETURN IF NO ERRORS DCA OFFLG /CLEAR OUTPUT FILE OPEN FLAG JMP I FILCLOSE /RETURN TO CALLER / ASCII FILE MODE <^Z> INPUT DISPOSITION FLAG. ICTLZFL,ICLOSE /ZERO=DON'T ENSURE <^Z> IN FILE, NON-ZERO=PACK <^Z> /IF LAST CHARACTER WASN'T <^Z> / SEND PROCESSING SNDPRO, 0 TAD INIFLG /CHECK IF SEND/INIT HAS BEEN DONE SZA CLA /SKIP IF NO JMP SNDP10 /RIGHT INTO FILE TRANSFER TAD (DEFCK /SET UP DEFAULT CHECKSUM DCA RCHKT TAD (DEFEOL /GET DEFAULT EOL DCA REOL /AND SET IT TAD (DEFQCTL /GET DEFAULT QUOTE CONTROL CHAR DCA RQCTL /AND SET IT UP TAD (DEFMAXL+40 /GET DEFAULT MAX BUFFER SIZE DCA RMAXL /SET IT UP DCA CURSEQ /RE-SET SEQUENCE NUMBER JMS I (SNDI00) /HANDLE "SEND-INIT" JMP I SNDPRO /TAKE ERROR RETURN /014 CJL / SEND FILE HEADER DISPATCH ROUTINE SNDP10, FPACK /FORMAT A PACKET NAMBUF /ADDRESS OF FILE HEADER FOR DATA STFIL /"FIL" PACKET TYPE SNDP11, SPACK /SEND A PACKET 1 /AWAIT RESPONSE SNDP96-2 /DISPATCH TABLE ADDRESS /026 CJL / GOT A NAK OR UNDEFINED HERE SNDP12, ISZ RTRYC /BUMP THE COUNTER JMP SNDP11 /TRY AGAIN JMP I SNDPRO /TAKE ERROR RETURN /014 CJL / FILE CREATION DATE HANDLING SNDP15, IFZERO 1 < TAD RCAPAS /CHECK IF REMOTE SUPPORTS FILE AND (10 / ATTRIBUTES SNA CLA /SKIP IF YES JMP SNDP20 /SKIP IF NO FPACK /FORMAT PACKET DATBUF /DATE DATA STATT /"ATT" PACKET TYPE SNDP16, SPACK /SEND THE PACKET 1 /AWAIT RESPONSE SNDP98-2 /DISPATCH TABLE ADDRESS /027 CJL JMP I SNDPRO /TAKE ERROR RETURN /014 CJL > / GOT ACK HERE SNDP20, JMS I [SCRIBE] /TELL THEM /025 CJL FSENMSG /WE ARE SENDING /025 CJL PRI8B; NAMBUF /TELL THEM THE NAME OF THE FILE JMS I [SCRIBE] /DO A /025 CJL CRLF /<CR>, <LF> /025 CJL JMS SLOOP SKP /ERROR RETURN ISZ SNDPRO /BUMP FOR NON-ERROR EXIT JMP I SNDPRO / DATA SEND LOOP. / ROUTINE TO GET CHARS FROM THE INPUT BUFFER AND SEND THEM TO REMOTE / VIA PACKET TRANSFERS. RETURN + 1 IF ERROR, + 2 IF DONE. SLOOP, 0 JMS I (INIOPB) /INIT OUTPUT PACKET HOLD BUFFER NL7777 /INITIALIZE INPUT FILE ROUTINE /019 CJL SLOP01, JMS I (GETBYTE) /GET A FILE CHARACTER /019 CJL JMP I SLOOP /FATAL I/O ERROR /026 CJL JMP SLOP15 /HERE ON EOF JMS I (OPBUF) /PUT INTO PACKET BUFFER SKP /RETURN HERE ON BUFFER FULL JMP SLOP01 /RETURN HERE IF STILL ROOM / PACKET IS FULL HERE, WE MUST SEND IT. FPACK /FORMAT A PACKET HOLDBF /DATA ADDRESS STDAT /"DAT" PACKET TYPE SLOP05, SPACK /SEND PACKET 1 /AWAIT RESPONSE SLOP90-2 /RESPONSE TABLE ADDRESS /027 CJL / HERE ON NAK OR FALL THRU ON UNDEFINED RESPONSE ABOVE. SLOP10, ISZ RTRYC /BUMP THE RE-TRY COUNTER JMP SLOP05 /TRY AGAIN JMP I SLOOP /TAKE ERROR RETURN /026 CJL / HERE ON END OF FILE -- SEND THEM WHAT WE HAVE. SLOP15, TAD I (OP2) /GET THE POINTER /052 CJL TAD (-HOLDBF) /COMPARE TO EMPTY VALUE /052 CJL SNA CLA /SKIP IF NOT EMPTY /052 CJL JMP SLOP35 /JUMP IF EMPTY /052 CJL FPACK /FORMAT A PACKET HOLDBF /ADDRESS OF DATA STDAT /"DAT" PACKET TYPE SLOP20, SPACK /SEND A PACKET 1 /AWAIT RESPONSE SLOP92-2 /DISPATCH TABLE ADDRESS /027 CJL / NAK FOR LAST PACKET. SLOP25, ISZ RTRYC /BUMP RE-TRY COUNTER JMP SLOP20 /TRY AGAIN JMP I SLOOP /TAKE ERROR RETURN /026 CJL / ACK FOR FINAL PACKET, SEND AN EOF PACKET. SLOP35, JMS I [SNDP] /SEND A PACKET NODATA /NO DATA STEOF /MAKE IT AN EOF PACKET JMP I SLOOP /NAK, TAKE ERROR RETURN JMP I SLOOP /OTHER THAN ACK, NAK; TAKE ERROR RETURN /026 CJL ISZ SLOOP /EOF ACCEPTED, BUMP FOR GOOD RETURN JMP I SLOOP /TAKE GOOD RETURN PAGE SLOP90, STACK; SLOP01 /ACK, CONTINUE STNAK; SLOP10 /NAK, HANDLE 0 SLOP92, STACK; SLOP35 /ACK, CONTINUE STNAK; SLOP25 /NAK, HANDLE 0 / COMMAND DISPATCH TABLE FOR SEND SERVICE. SNDP96, STACK; SNDP15 /FILE HEADER ACKNOWLEDGED STNAK; SNDP12 /NAK RETURNED, RE-TRY 0 /END OF TABLE SNDP98, STACK; SNDP20 /DATE ATTRIBUTE ACKNOWLEDGED 0 /END OF TABLE / ROUTINE TO HANDLE A "SEND-INIT" COMMAND. / RETURN + 1 IF ERROR. / RETURN + 2 IF SUCCESSFUL. SNDI00, 0 FPACK /FORMAT A PACKET INIDAT /ADDRESS OF DATA FOR PACKET STSIN /"SIN" PACKET TYPE SNDI02, SPACK /SEND A PACKET 1 /AWAIT RESPONSE SNDI80-2 /RESPONSE TABLE TYPE /027 CJL / HERE ON NAK OR UNDEFINED. SNDI05, ISZ RTRYC /BUMP RE-TRY COUNTER JMP SNDI02 /TRY AGAIN JMP I SNDI00 /TAKE ERROR EXIT / HERE ON ACK. SNDI10, JMS SETINI /SET UP THE INIT REGISTERS NL0001 CLL /NOW FLAG THE SEND/INIT DONE /032 CJL DCA INIFLG /BY MAKING THIS NON-ZERO ISZ SNDI00 /BUMP FOR NON-ERROR RETURN JMP I SNDI00 /BACK TO MAIN SEND PROCESSING SNDI80, STACK; SNDI10 /GOT AN ACK STNAK; SNDI05 /NAK 0 /END OF TABLE / ROUTINE TO MOVE THE SEND/INIT OR RECEIVE/INIT PACKET INTO THE INIT REGISTERS. SETINI, 0 TAD (RMAXL /GET ADDRESS OF RECEIVE INIT REGISTERS DCA MQ /SETUP FOR CLEAR ROUTINE /032 CJL TAD (RMAXL-INITEND) /GET -(NUMBER OF REGISTERS) /022 CJL CLEAR /CLEAR OUT A CHUNK OF MEMORY /M013 / TAD (RMAXL /GET ADDRESS OF RECEIVE INIT REGISTERS / DCA MQ /SETUP FOR MOVE ROUTINE /032 CJL TAD I [RRLEN] /GET LENGTH OF PACKET JUST INPUT TAD (-40-4 /COUNT OF DATA RECEIVED TAD (RMAXL-INITEND) /COMPARE TO MAXIMUM ALLOWED /022 CJL SMA SZA /SKIP IF NOT TOO MANY /022 CJL CLA /ELSE USE ALLOWED MAXIMUM /022 CJL TAD (INITEND-RMAXL) /RESTORE VALUE /022 CJL CIA /MAKE IT NEGATIVE DCA MOVE4 /SAVE FOR "MOVE" ROUTINE TAD (RRDTA /ADDRESS OF DATA IN PACKET MOVE /MOVE THE INIT REGISTERS JMP I SETINI /DONE IFZERO 1 < /D013 / ROUTINE TO SEND THE DATE IN A DATA PACKET. / RETURN + 1 IF ERROR, + 2 IF SUCCESSFUL. DATOUT, 0 JMS INIOPB /INSURE PACKET HOLD BUFFER INITIALIZED TAD (SETDAT /GET ADDRESS OF DATE DCA DATOU9 /PUT INTO POINTER DATOU1, TAD I DATOU9 /GET A CHAR ISZ DATOU9 /BUMP POINTER SPA /SKIP IF NOT ENT JMP DATOU2 /DONE JMS OPBUF /PUT INTO HOLD BUFFER SKP /HOLD FULL, SEND IT JMP DATOU1 /LOOP DATOU2, CLA CLL /INSURE CLEAR AC FPACK /FORMAT A PACKET HOLDBF /DATA ADDRESS STDAT /DATA PACKET DATOU3, SPACK /SEND THE PACKET 1 /GET RESPONSE DATOU7-2 /DISPATCH TABLE ADDRESS /027 CJL / HERE ON NAK OR UNDEFINED RESPONSE. DATOU4, ISZ RTRYC /BUMP RE-TRY COUNTER JMP DATOU3 /TRY AGAIN JMP I DATOUT /ABORT / HERE ON ACK. DATOU5, ISZ DATOUT /BUMP FOR GOOD RETURN JMP I DATOUT /EXIT DATOU7, STACK; DATOU5 /ACK STNAK; DATOU4 /NAK 0 DATOU9, 0 /TEMP POINTER FOR DATOUT > /D013 / HANDLE AN ABORT REQUEST. ABORT, CLA CLL /INSURE CLEAR AC DCA ABFLAG /CLEAR ABORT FLAG NOW /044 CJL TAD KMODE /GET CURRENT MODE TAD (-MSEND /IS IT A SEND? SZA /SKIP IF YES JMP ABORT2 /NOT SEND JMS I [SNDP] /SEND OUT A PACKET ABORT9 /WHICH HAS A "D" IN THE DATA STEOF /AND IS AN EOF PACKET NOP /WE GOT NAK BACK HERE NOP /WE GOT NEITHER NAK OR ACK HERE JMS I (BRKXMT) /BREAK THE SEND JMP ABORT3 /FINISH THE ABORT ABORT2, TAD (MSEND-MREC /CHECK IF IN RECEIVE MODE SZA CLA /SKIP IF YES JMP ABORT3 /JUST BACK TO COMMAND LOOP JMS I [SNDP] /SEND A PACKET BACK FOR AN ABORT IFZERO 1 < /D009 ABORT8 /WHICH HAS AN "X" IN THE DATA STACK /MAKE IT AN ACK PACKET NOP /NAK HERE NOP /NOT NAK OR ACK HERE > /D009 NODATA /NO DATA /A009 STBRK /BREAK TRANSMISSION /A009 NOP /NAK HERE /A009 CLA /NOT ACK OR NAK HERE /A009 TAD OFFLG /GET FILE OPEN FLAG /A009 SZA CLA /IS IT OPEN YET? /A009 JMS I [FILCLOSE] /CLOSE THE OUTPUT FILE /020 CJL CLA /ERROR DURING CLOSE **** FIX THIS **** ABORT3, TAD (ABMSG) /GET MESSAGE ADDRESS /044 CJL JMP I [CLOOP7] /DISPLAY THE ABORT ABORT9, "D&137 /DATA PACKET FOR SEND ABORT -1 PAGE /014 CJL / ROUTINE TO PRINT 8 BIT CHARS ON THE TTY. ENTER ROUTINE WITH THE ADDRESS OF / THE TEXT IN THE AC OR IF AC IS ZERO THE ADDRESS IS IN THE CALL + 1. TEXT / TERMINATES ON A MINUS WORD. PRI8B0, 0 SZA /SKIP IF ADDRESS NOT IN AC JMP PRI8B1 /ADDRESS IS IN THE AC TAD I PRI8B0 /GET ADDRESS FROM CALL + 1 ISZ PRI8B0 /BUMP RETURN POINTER PRI8B1, DCA MQ /SAVE ADDRESS OF STRING /032 CJL TAD [P7ECHO] /GET CONSOLE OUTPUT ROUTINE ADDRESS /043 CJL JMS EIGHTB /AND SEND IT JMP I PRI8B0 /ALL DONE / ROUTINE TO SEND 8 BIT CHARS DOWN THE REMOTE LINE. ENTER ROUTINE WITH THE / ADDRESS OF THE TEXT IN THE AC OR IF AC IS ZERO THE ADDRESS IS IN THE CALL + 1. / TEXT TERMINATES ON A MINUS WORD. REM8B0, 0 SZA /SKIP IF ADDRESS NOT IN AC JMP REM8B1 /ADDRESS IN AC TAD I REM8B0 /GET ADDRESS FROM CALL + 1 ISZ REM8B0 /BUMP RETURN REM8B1, DCA MQ /SAVE ADDRESS OF STRING /032 CJL TAD (COMOUT) /GET ADDRESS OF REMOTE OUTPUT ROUTINE /046 CJL JMS EIGHTB /AND SEND THE STRING JMP I REM8B0 /DONE / ROUTINE TO SEND 8 BIT DATA. ENTER WITH ADDRESS OF DATA IN THE MQ AND THE / ADDRESS OF THE ROUTINE TO TAKE EACH BYTE IN THE AC. TEXT TERMINATES ON A / MINUS WORD. EIGHTB, 0 DCA EIGHT5 /STORE POINTER TO ROUTINE TAD MQ /GET STRING POINTER /032 CJL DCA EIGHT6 /STORE IN LOCAL POINTER EIGHT1, TAD I EIGHT6 /GET A CHAR ISZ EIGHT6 /BUMP THE POINTER SPA /SKIP IF NOT EOL JMP EIGHT2 /GOT EOL JMS I EIGHT5 /CALL OUTPUT ROUTINE CLA CLL /INSURE CLEAR AC JMP EIGHT1 /LOOP EIGHT2, CLA CLL /CLEAR THE AC JMP I EIGHTB /DONE EIGHT5, 0 /POINTER TO ROUTINE TO DO OUTPUT EIGHT6, 0 /POINTER TO TEXT TO OUTPUT / ROUTINE TO UNPACK 6-BT CHARS FROM MEMORY. BEFORE CALLING INIT "GET6P" AS A / POINTER TO THE STRING LOCATION AND "GET6F" SHOULD BE ZEROED TO START WITH THE / TOP BYTE OF THE FIRST MEMORY LOCATION. GET60, 0 NL4000 /SET 4000 /032 CJL TAD GET6F /GET THE FLAG DCA GET6F /RETURN THE FLAG TAD I GET6P /GET TWO BYTES SZL /HIGH-ORDER WANTED? /032 CJL JMP GETSWT /JUMP IF NOT /032 CJL RTR;RTR;RTR /MOVE DOWN HIGH-ORDER HALF /032 CJL SKP /DON'T BUMP POINTER YET /032 CJL GETSWT, ISZ GET6P /BUMP TO NEXT WORD /032 CJL AND [77] /STRIP UNUSED BITS /016 CJL JMP I GET60 /DONE / LOCAL ROUTINE TO "FILN8" TO MAKE THE 6 BIT CHAR IN THE AC INTO 8 BITS AND / STORE IN A STRING. MOV8, .-. /6-BIT CHARACTER => 7-BIT CHARACTER /028 CJL SNA /SKIP IF SOMETHING PASSED /028 CJL TAD [" &77] /ELSE SUPPLY A <SPACE> /025 CJL TAD [" &77] /INVERT THE CHARACTER /028 CJL AND [77] /JUST SIX-BITS /014/016 CJL TAD [" &77] /MAKE IT SEVEN-BIT ASCII /028 CJL DCA I MOV8P /STORE IN THE STRING /028 CJL ISZ MOV8P /BUMP POINTER FOR NEXT TIME /028 CJL JMP I MOV8 /RETURN /028 CJL MOV8P, 0 /POINTER FOR "MOV8" ROUTINE / ROUTINE TO PULL A FILE NAME IN 6 BIT POINTED TO BY THE AC AND PLACE IN THE / FILE NAME BUFFER IN 8 BIT ADDING IN THE "." TO SEPARATE FILE NAME AND / EXTENSION. A MINUS WORD WILL FOLLOW THE NAME. FILN8, 0 DCA GET6P /SET POINTER FOR "GET6" DCA GET6F /SET FLAG FOR "GET6" TAD (NAMBUF /GET ADDRESS OF THE NAME BUFFER DCA MOV8P /SET IN A POINTER TAD (-6 /6 NAME CHARS TO DO DCA FILN8C /SAVE IN COUNTER GET6 /PULL A CHAR SZA /SKIP IF A SPACE JMS MOV8 /PUT INTO THE BUFFER ISZ FILN8C /BUMP COUNTER JMP .-4 /LOOP TILL ALL 6 DONE TAD (".&177) /GET A "." /034 CJL JMS MOV8 /PUT WITH FILE NAME NL7776 /SET -2 /032 CJL DCA FILN8C /2 EXTENSION CHARS GET6 /GET NEXT CHAR SZA /SKIP IF A SPACE JMS MOV8 /PUT WITH NAME ISZ FILN8C /BUMP COUNTER JMP .-4 /LOOP NL7777 /SET -1 /032 CJL DCA I MOV8P /TERMINATE THE STRING JMP I FILN8 /AND RETURN FILN8C, 0 /COUNTER FOR "FILN8" PAGE / CONSOLE I/O ROUTINES, ETC. /023 CJL / CONSOLE MESSAGE PRINT ROUTINE. / CALLING SEQUENCE: / JMS I [SCRIBE] /CALL MESSAGE PRINT ROUTINE / MESSAGEADDRESS /MESSAGE ADDRESS PASSED IN-LINE / AC CAN BE DIRTY ON CALL. / RETURNS WITH CLEAR AC. / MESSAGE FORMAT: / ALL UPPER-CASE CHARACTERS ARE ALLOWED TO EXIST IN THE MESSAGE EXCEPT '%' AND / '^' WHICH ARE RESERVED. A ZERO HALF-WORD TERMINATES THE MESSAGE STRING. IF / '%' IS DETECTED, A <CR> AND <LF> WILL BE OUTPUT. IF '^' IS DETECTED, THE / PREVAILING CASE WILL BE REVERSED. INITIAL CASE IS LOWER-CASE. IF 'UPONLY' IS / SET TO 7740, ALL CASE CHANGES ARE IGNORED AND THE OUTPUT IS FORCED TO / UPPER-CASE ONLY. THE MESSAGE ADDRESS MUST BE IN FIELD ONE AND MUST NOT / OVERLAP AREAS RESERVED FOR OTHER PURPOSES (OS/8 RESIDENT AT 17600-17777, USR / LOCATIONS 10000-11777, ETC.). SCRIBE, .-. /CONSOLE MESSAGE PRINT ROUTINE CLA /CLEAN UP /029 CJL TAD [P7ECHO] /POINT TO /043 CJL RSCRENT,DCA MSGOUT /CONSOLE PRINT ROUTINE TAD I SCRIBE /GET IN-LINE POINTER ARGUMENT DCA SCRPTR /STASH THE POINTER ISZ SCRIBE /BUMP PAST ARGUMENT TAD UPONLY /GET UPPER-ONLY VALUE /030 CJL TAD [140] /ADD ON LOWER-CASE VALUE /030 CJL DCA SCRCASE /STORE INITIAL CASE VALUE SCRLUP, CDF MSGFLD /GOTO MESSAGE FIELD TAD I SCRPTR /GET LEFT HALF-WORD RTR;RTR;RTR /MOVE OVER JMS SCRPRNT /PRINT IT CDF MSGFLD /GOTO MESSAGE FIELD TAD I SCRPTR /GET RIGHT HALF-WORD JMS SCRPRNT /PRINT IT ISZ SCRPTR /BUMP TO NEXT PAIR JMP SCRLUP /KEEP GOING SCRPRNT,.-. /CHARACTER PRINT ROUTINE CDF PRGFLD /BACK TO OUR FIELD AND [77] /JUST SIX BITS SNA /END OF MESSAGE? JMP I SCRIBE /YES, RETURN TO ORIGINAL CALLER DCA SCRCHAR /NO, SAVE FOR NOW TAD SCRCHAR /GET IT BACK TAD (-"%!200) /IS IT "%"? SNA /SKIP IF NOT JMP SCRCRLF /JUMP IF IT MATCHES TAD [-"^+100+"%] /IS IT "^" SNA CLA /SKIP IF NOT JMP SCRFLIP /JUMP IF IT MATCHES TAD SCRCHAR /GET THE CHARACTER AND [40] /DOES CASE MATTER? SNA CLA /SKIP IF NOT TAD SCRCASE /ELSE GET PREVAILING CASE TAD SCRCHAR /GET THE CHARACTER SCRPRLF,JMS I MSGOUT /PRINT THE CHARACTER JMP I SCRPRNT /RETURN SCRCRLF,TAD [CNTRLM] /GET A <CR> JMS I MSGOUT /PRINT IT TAD [CNTRLJ] /GET A <LF> JMP SCRPRLF /CONTINUE THERE SCRFLIP,TAD UPONLY /GET UPPER-ONLY FLAG SZA CLA /SKIP IF OFF JMP I SCRPRNT /RETURN IF ON TAD SCRCASE /GET CURRENT CASE CIA /INVERT IT TAD (140+100) /ADD SUM OF POSSIBLE VALUES DCA SCRCASE /STORE NEW INVERTED CASE JMP I SCRPRNT /RETURN / REMOTE LINE MESSAGE PRINT ROUTINE. / CALLING SEQUENCE: / JMS I [RSCRIBE] /CALL MESSAGE PRINT ROUTINE / MESSAGEADDRESS /MESSAGE ADDRESS PASSED IN-LINE / AC CAN BE DIRTY ON CALL. / RETURNS WITH CLEAR AC. / MESSAGE FORMAT AND RESTRICTIONS ARE IDENTICAL TO SCRIBE ROUTINE. RSCRIBE,.-. /REMOTE LINE MESSAGE PRINT ROUTINE CLA /CLEAN UP /029 CJL TAD RSCRIBE /GET OUR CALLER DCA SCRIBE /MAKE IT THEIRS TAD (COMOUT) /POINT TO REMOTE OUTPUT ROUTINE JMP RSCRENTRY /CONTINUE THERE / ESCAPE CHARACTER PRINT ROUTINE. / CALLING SEQUENCE: / TAD ESCHAR /OR OTHER CHARACTER TO PRINT / JMS I [ESCPRNT] /CALL ROUTINE / RETURNS WITH CLEAR AC HERE / CAUSES CHARACTER TO PRINT LITERALLY IF CHARACTER>37. / CAUSES MESSAGE "CONTROL-" FOLLOWED BY CHARACTER+100 IF CHARACTER<40. ESCPRNT,.-. /ESCAPE CHARACTER PRINT ROUTINE DCA ESCTEMP /SAVE PASSED VALUE TAD ESCTEMP /GET IT BACK TAD [-40] /COMPARE TO CONTROL LIMIT SMA CLA /SKIP IF LESS THAN LIMIT JMP ESPRINT /JUMP IF NOT JMS I [SCRIBE] /GIVE THEM THE CONTMSG /CONTROL MESSAGE TAD [100] /MAKE IT UPPER-CASE, NOT CONTROL ESPRINT,TAD ESCTEMP /GET ORIGINAL VALUE JMS I [P7ECHO] /PRINT IT /043 CJL JMP I ESCPRNT /RETURN MSGOUT= RSCRIBE /OUTPUT ROUTINE POINTER ESCTEMP,.-. /TEMPORARY FOR ESCPRNT ROUTINE SCRCASE,.-. /CURRENT MESSAGE CASE SCRCHAR,.-. /LATEST MESSAGE CHARACTER SCRPTR, .-. /MESSAGE POINTER PAGE / ROUTINE TO HANDLE THE "CONNECT" COMMAND. /025 CJL CONSRV, .-. /CONNECT SERVICE ROUTINE JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL JMS I [SCRIBE] /GIVE THE CONNMSG /OPENING MESSAGE TAD ESCHAR /GET THE CURRENT <ESCAPE> CHARACTER JMS I [ESCPRNT] /PRINT IT JMS I [SCRIBE] /GIVE THEM THE CON2MSG /BRIDGING MESSAGE JMS I [SCRIBE] /PRINT OUT THE CPUMSG /ACTUAL CPU TYPE JMS I [SCRIBE] /GIVE THEM THE CON3MSG /CLOSING MESSAGE CORESET,DCA ESCFLAG /CLEAR <ESCAPE> SEEN FLAG TAD ESCHAR /GET THE <ESCAPE> CHARACTER DCA ESCH /STORE IN SEARCH LIST JMS I (CONRESET) /RESET CONSOLE ROUTINES JMS I (REMRESET) /RESET REMOTE LINE ROUTINES CONNLUP,TAD KEYERROR /GET KEYBOARD ERROR FLAG SNA /SKIP IF KEYBOARD ERROR TAD RINERROR /ELSE GET REMOTE ERROR FLAG SZA CLA /SKIP IF NEITHER KEYBOARD NOR REMOTE LINE ERRORS JMP KERROR /JUMP IF KEYBOARD ERROR JMS I (CONTEST) /TEST IF CONSOLE CAN TAKE OUTPUT JMP TESTKEYBOARD /JUMP IF NOT JMS I (REMINPUT) /TEST IF ANY REMOTE INPUT SKP /SKIP IF NONE JMS I (CONOUT) /OUTPUT TO CONSOLE TESTKEY,TAD ECHOFLAG /GET LOCAL ECHO FLAG TAD ESCFLAG /ADD ON <ESCAPE> SEEN FLAG SNA CLA /SKIP IF LOCAL ECHO POSSIBLY NEEDED JMP NOLOCALECHO /JUMP IF NOT JMS I (CONTEST) /TEST IF CONSOLE CAN TAKE OUTPUT JMP BUFCHECK /JUMP IF NOT NOLOCAL,JMS I (REMTEST) /TEST IF REMOTE CAN TAKE OUTPUT JMP BUFCHECK /JUMP IF NOT JMS I (KEYINPUT) /TEST IF ANY KEYBOARD INPUT JMP BUFCHECK /JUMP IF NOT DCA KEYLATEST /SAVE FOR LATER TAD KEYLATEST /GET IT BACK AND [177] /WANT SEVEN-BIT VERSION FOR TESTS CIA /INVERT IT DCA TESTCHAR /SAVE FOR LATER TAD ESCFLAG /<ESCAPE> SEEN LAST TIME? SNA CLA /SKIP IF SO JMP NOESCAPE /JUMP IF NOT TAD TESTCHAR /GET TEST VAUE JMS I [SRCHTABLE] /SEARCH FOR IT ESCLIST-1-1 /SEARCH TABLE POINTER SNA CLA /SKIP IF FOUND JMP ESCOMPLAIN /JUMP IF NOT JMP I TABLEJUMP /GO WHERE YOU'RE SUPPOSED TO / COMES HERE IF PREVIOUS WAS NOT THE <ESCAPE> CHARACTER. NOESCAP,TAD TESTCHAR /GET THE LATEST CHARACTER TAD ESCHAR /COMPARE TO <ESCAPE> CHARACTER SZA CLA /SKIP IF IT MATCHES JMP OUTCHAR /JUMP IF NOT NL7777 /SET THE / DCA ESCFLAG /<ESCAPE> SEEN FLAG / JMP BUFCHECK /CONTINUE THERE JMP NOESENTRY /CONTINUE THERE / COMES HERE IF BOTH PREVIOUS AND LATEST ARE THE <ESCAPE> CHARACTER. ESCTYPE,DCA ESCFLAG /CLEAR THE <ESCAPE> SEEN FLAG AND OUTPUT / COMES HERE IF PREVIOUS AND LATEST CHARACTER ARE NOT THE <ESCAPE> CHARACTER. OUTCHAR,TAD ECHOFLAG /GET LOCAL ECHO FLAG SNA CLA /SKIP IF SET JMP NOECHO /JUMP IF NOT TAD KEYLATEST /GET LATEST CHARACTER JMS I (CONOUT) /OUTPUT TO CONSOLE NOECHO, TAD KEYLATEST /GET LATEST CHARACTER JMS I (REMOUT) /OUTPUT TO REMOTE JMP BUFCHECK /CONTINUE THERE / COMES HERE IF PREVIOUS WAS THE <ESCAPE> CHARACTER AND THE LATEST IS NOT / A VALID <ESCAPE> COMMAND CHARACTER. ESCOMPL,TAD [CNTRLG] /GET A <BEL> JMS I (CONOUT) /OUTPUT TO CONSOLE NOESENT,DCA ESCFLAG /CLEAR <ESCAPE> SEEN FLAG BUFCHEC,JMS I PUPSTATUS /UPDATE THE PORT STATUS /047 CJL / THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY. THE DEFAULT INSTRUCTION IS FOR / KL8 INTERFACES. *BUFCHECK /OVERLAY DECMATE CODE /047 CJL BUFCHEC,NOP /DON'T CHECK PORT STATUS /047 CJL JMS I (RINUPDATE) /CHECK FOR MORE REMOTE INPUT JMS I (KEYUPDATE) /CHECK FOR MORE KEYBOARD INPUT JMS I (REMUPDATE) /CHECK FOR MORE REMOTE OUTPUT JMS I (CONUPDATE) /CHECK FOR MORE CONSOLE OUTPUT JMP CONNLUP /GO BACK FOR MORE / COMES HERE ON <ESCAPE> C(LOSE). ESCLOSE,ISZ CONSRV /BUMP TO GOOD RETURN JMP I CONSRV /RETURN KERRLUP,JMS I PUPSTATUS /UPDATE THE PORT STATUS /047 CJL / THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY. THE DEFAULT INSTRUCTION IS FOR / KL8 INTERFACES. *KERRLUP /OVERLAY DECMATE CODE /047 CJL KERRLUP,NOP /DON'T CHECK PORT STATUS /047 CJL JMS I (RINUPDATE) /CHECK FOR MORE REMOTE INPUT JMS I (KEYUPDATE) /CHECK FOR MORE KEYBOARD INPUT JMS I (REMUPDATE) /CHECK FOR MORE REMOTE OUTPUT JMS I (CONUPDATE) /CHECK FOR MORE CONSOLE OUTPUT / COMES HERE ON KEYBOARD INPUT ERROR. KERROR, JMS I (CONTEST) /CONSOLE READY FOR OUTPUT? JMP KERRLUP /NO, GO WAIT AWHILE TAD I (CONINSERT) /GET CONSOLE INSERTION POINTER CIA /INVERT FOR TEST TAD I (CONREMOVE) /COMPARE TO CONSOLE REMOVAL POINTER SZA CLA /SKIP IF CONSOLE OUTPUT BUFFER EMPTY JMP KERRLUP /GO WAIT FOR AWHILE TAD KEYERROR /KEYBOARD INPUT ERROR? SNA CLA /SKIP IF SO JMP RIERTST /JUMP IF NOT JMS I [SCRIBE] /TELL THEM KERRMSG /WE HAD A KEYBOARD ERROR RIERTST,TAD RINERROR /REMOTE INPUT ERROR? SNA CLA /SKIP IF SO JMP CORESET /JUMP IF NOT JMS I [SCRIBE] /TELL THEM RIERMSG /WE HAD A REMOTE LINE ERROR JMP CORESET /RESTART / <ESCAPE> CHARACTER SEARCH LIST. ESCLIST,UPPERC; ESCLOSE /<ESCAPE> C(LOSE) LOWERC; ESCLOSE /<ESCAPE> C(LOSE) (LOWER-CASE) ESCH, .-.; ESCTYPE /<ESCAPE> <ESCAPE> 0 /THIS ENDS THE LIST / LOCAL ECHO FLAG FOR CONNECT MODE. ECHOFLA,INIECHO /0=DON'T ECHO, NON-ZERO=ECHO /039 CJL ESCFLAG,.-. /<ESCAPE> CHARACTER SEEN FLAG KEYLATE,.-. /LATEST KEYBOARD CHARACTER PUPSTAT,UPSTATUS /POINTER TO DECMATE STATUS UPDATE /047 CJL TESTCHA,.-. /LATEST KEYBOARD TEST CHARACTER PAGE / CONNECT-MODE SUPPORT ROUTINES. /047 CJL / CONSOLE KEYBOARD ROUTINES. /047 CJL / KEYBOARD INPUT ROUTINE. /026 CJL / CALLING SEQUENCE: / JMS I (KEYINPUT) /CALL ROUTINE / NO INPUT /RETURN IF NO INPUT / INPUT /RETURN IF INPUT AVAILABLE / THE AC WILL BE CLEAR IF THE IMMEDIATE RETURN IS TAKEN FOR NO INPUT. / THE AC WILL CONTAIN THE LATEST CHARACTER IF THE SKIP RETURN IS TAKEN. KEYINPU,.-. /KEYBOARD INPUT ROUTINE TAD KEYINSERT /GET INSERTION POINTER CIA /INVERT FOR TEST TAD KEYREMOVE /COMPARE TO REMOVAL POINTER SNA CLA /SKIP IF BUFFER NOT EMPTY JMP KEYCHECK /JUMP IF BUFFER EMPTY TAD KEYREMOVE /GET REMOVAL POINTER DCA KEYTEMP /SAVE FOR LATER NL0001 /SET INCREMENT TAD KEYREMOVE /UPDATE REMOVAL POINTER AND [BUFSIZE-1] /JUST BUFFER BITS TAD [KEYBUFFER] /MAKE IT ABSOLUTE DCA KEYREMOVE /STORE UPDATED POINTER CDF BUFFLD /GOTO BUFFER FIELD TAD I KEYTEMP /GET THE LATEST CHARACTER CDF PRGFLD /BACK TO OUR FIELD SKP /DON'T GET ANOTHER CHARACTER /047 CJL / COMES HERE IF BUFFER IS EMPTY. KEYCHEC,JMS KEYGET /TRY TO GET A CHARACTER NOW /047 CJL ISZ KEYINPUT /GOT ONE, SO TAKE SKIP RETURN /047 CJL JMP I KEYINPUT /RETURN EITHER WAY / KEYBOARD BUFFER UPDATE ROUTINE. /026 CJL / CALLING SEQUENCE: / JMS I (KEYUPDATE) /CALL ROUTINE / RETURNS WITH CLEAR AC. ANY KEYBOARD INPUT WHICH JUST OCCURRED WILL BE / BUFFERED; CALLS TO KEYINPUT WILL RETRIEVE THE CHARACTERS. KEYUPDA,.-. /KEYBOARD BUFFER UPDATE ROUTINE JMS KEYGET /TRY TO GET A CHARACTER NOW /047 CJL SKP /GOT ONE, DON'T LEAVE YET /047 CJL JMP I KEYUPDATE /CHARACTER NOT AVAILABLE NOW, RETURN /047 CJL CDF BUFFLD /GOTO BUFFER FIELD DCA I KEYINSERT /STORE IN THE BUFFER CDF PRGFLD /BACK TO OUR FIELD NL0001 /SET INCREMENT TAD KEYINSERT /UPDATE POINTER AND [BUFSIZE-1] /JUST BUFFER BITS TAD [KEYBUFFER] /MAKE IT ABSOLUTE DCA KEYINSERT /STORE BACK UPDATED POINTER TAD KEYINSERT /GET INSERTION POINTER CIA /INVERT FOR TEST TAD KEYREMOVE /COMPARE TO REMOVAL POINTER SNA CLA /SKIP IF NOT EQUAL KSERROR,ISZ KEYERROR /INDICATE KEYBOARD ERROR JMP I KEYUPDATE /RETURN JMP KSERROR /MAKE SURE ERROR IS INDICATED / KEYBOARD GET A CHARACTER ROUTINE. /047 CJL / CALLING SEQUENCE: / JMS KEYGET /CALL ROUTINE / CHARACTER AVAILABLE /RETURNS HERE WITH LATEST CHARACTER / NO CHARACTER AVAILABLE /RETURNS HERE IF NO CHARACTER OR HANDLED FLOW-CONTROL / NORMAL RETURN HAS LATEST CHARACTER IN AC. / SKIP RETURN HAS CLEAR AC. / IF FLOWFLAG=0, FLOW CHARACTERS ARE UNPROCESSED AND CAUSE NORMAL RETURN. KEYGET, .-. /KEYBOARD GET A CHARACTER ROUTINE KGTEST, KSFIOT /FLAG UP? JMP KEYGNONE /NO, TAKE SKIP RETURN KGREAD, KRBIOT /YES, READ THE CHARACTER SPA /SKIP IF NO UART ERRORS ISZ KEYERROR /INDICATE KEYBOARD ERROR SKP /SKIP IF NOT TOO MANY ERRORS JMP .-2 /ENSURE KEYBOARD ERROR IS INDICATED AND [377] /JUST EIGHT-BIT DCA KEYTEMP /SAVE FOR NOW TAD FLOWFLAG /GET FLOW CONTROL FLAG SNA CLA /SKIP IF SET JMP KEYGEXIT /JUMP IF NOT TAD KEYTEMP /GET THE CHARACTER AND [177] /JUST SEVEN-BIT TAD [-CNTRLS] /COMPARE TO <^S> SNA /SKIP IF OTHER JMP KWATSET /JUMP IF IT MATCHES TAD [-CNTRLQ+CNTRLS]/COMPARE TO <^S> SNA CLA /SKIP IF OTHER JMP KWATCLEAR /JUMP IF IT MATCHES KEYGEXI,TAD KEYTEMP /GET THE CHARACTER JMP I KEYGET /TAKE IMMEDIATE RETURN / COMES HERE ON <^S> TO SET OUTPUT WAIT. KWATSET,NL4000 /SET WAIT VALUE / COMES HERE ON <^Q> TO CLEAR OUTPUT WAIT. KWATCLE,DCA CONWAIT /STORE NEW STATE KEYGNON,ISZ KEYGET /BUMP RETURN ADDRESS JMP I KEYGET /TAKE SKIP RETURN / CONSOLE TERMINAL ROUTINES. / CONSOLE OUTPUT ROUTINE. / CALLING SEQUENCE: / TAD CHAR /CHARACTER TO OUTPUT IN AC / JMS I (CONOUT) /CALL ROUTINE / RETURN /RETURNS HERE WITH CLEAR AC CONOUT, .-. /CONSOLE OUTPUT ROUTINE DCA CONTEMP /SAVE PASSED VALUE TAD CONINSERT /GET INSERTION POINTER CIA /INVERT FOR TEST TAD CONREMOVE /COMPARE TO REMOVAL POINTER TAD CONWAIT /ADD ON WAIT STATUS SZA CLA /SKIP IF BUFFER EMPTY AND NOT WAITING /047 CJL JMP CSTUFF /JUMP IF CHARACTER MUST BE BUFFERED TAD CONTEMP /GET PASSED VALUE /047 CJL JMS I (CONPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL JMP CSTUFF /COULDN'T OUTPUT IT, SO BUFFER IT /047 CJL JMP I CONOUT /RETURN CSTUFF, TAD CONTEMP /GET THE CHARACTER CDF BUFFLD /GOTO BUFFER FIELD DCA I CONINSERT /STORE THE CHARACTER CDF PRGFLD /BACK TO OUR FIELD NL0001 /SET INCREMENT TAD CONINSERT /UPDATE POINTER AND [BUFSIZE-1] /JUST BUFFER BITS TAD [CONBUFFER] /MAKE IT ABSOLUTE DCA CONINSERT /STORE BACK UPDATED POINTER JMP I CONOUT /RETURN / CONSOLE OUTPUT TEST ROUTINE. / CALLING SEQUENCE: / JMS I (CONTEST) /CALL ROUTINE / NOT READY /RETURN IF OUTPUT NOT READY FOR NEXT CHARACTER / READY /OUTPUT CAN ACCEPT ANOTHER CHARACTER NOW CONTEST,.-. /CONSOLE OUTPUT TEST ROUTINE NL0001 /SET BUFFER INCREMENT TAD CONINSERT /GET UPDATED INSERTION POINTER CIA /INVERT FOR TEST TAD CONREMOVE /COMPARE TO REMOVAL POINTER AND [BUFSIZE-1] /JUST BUFFER BITS SZA CLA /SKIP IF BUFFER IS FULL ISZ CONTEST /BUMP RETURN IF NOT JMP I CONTEST /RETURN EITHER WAY / CONSOLE OUTPUT BUFFER UPDATE ROUTINE. / CALLING SEQUENCE: / JMS I (CONUPDATE) /CALL ROUTINE / RETURN /RETURN WITH CLEAR AC / THE CONSOLE OUTPUT BUFFERING ROUTINES WILL UPDATE POINTERS, ETC. IF ANY / STATUS HAS CHANGED SINCE THE LAST CALL. CONUPDA,.-. /CONSOLE OUTPUT UPDATE ROUTINE TAD CONWAIT /FLOW CONTROL WAIT SET? SZA CLA /SKIP IF NOT JMP I CONUPDATE /JUST RETURN IF SO TAD CONINSERT /GET INSERTION POINTER CIA /INVERT FOR TEST TAD CONREMOVE /COMPARE TO REMOVAL POINTER SNA CLA /SKIP IF BUFFER CONTAINS SOMETHING /047 CJL JMP I CONUPDATE /RETURN IF BUFFER EMPTY /047 CJL CDF BUFFLD /GOTO BUFFER FIELD TAD I CONREMOVE /GET A CHARACTER FROM THE BUFFER CDF PRGFLD /BACK TO OUR FIELD JMS I (CONPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL JMP I CONUPDATE /COULDN'T DO IT, SO JUST RETURN /047 CJL NL0001 /SET BUFFER INCREMENT TAD CONREMOVE /UPDATE REMOVAL POINTER AND [BUFSIZE-1] /JUST BUFFER BITS TAD [CONBUFFER] /MAKE IT ABSOLUTE DCA CONREMOVE /STORE UPDATED POINTER JMP I CONUPDATE /RETURN CONINSE,.-. /CONSOLE OUTPUT INSERTION POINTER CONREMO,.-. /CONSOLE OUTPUT REMOVAL POINTER / CONSOLE FLOW CONTROL WAIT FLAG. CONWAIT,.-. /0=DON'T WAIT, 4000=WAIT FOR <^Q> KEYINSE,.-. /KEYBOARD BUFFER INSERTION POINTER KEYREMO,.-. /KEYBOARD BUFFER REMOVAL POINTER CONTEMP=CONUPDATE /CONSOLE OUTPUT TEMPORARY KEYTEMP=CONUPDATE /KEYBOARD INPUT TEMPORARY PAGE / REMOTE LINE ROUTINES. / REMOTE LINE INPUT ROUTINE. /026 CJL / CALLING SEQUENCE: / JMS I (REMINPUT) /CALL ROUTINE / NO INPUT /RETURN IF NO INPUT / INPUT /RETURN IF INPUT AVAILABLE / THE AC WILL BE CLEAR IF THE IMMEDIATE RETURN IS TAKEN FOR NO INPUT. / THE AC WILL CONTAIN THE LATEST CHARACTER IF THE SKIP RETURN IS TAKEN. REMINPU,.-. /REMOTE LINE INPUT ROUTINE TAD RININSERT /GET INSERTION POINTER CIA /INVERT FOR TEST TAD RINREMOVE /COMPARE TO REMOVAL POINTER SNA CLA /SKIP IF BUFFER NOT EMPTY JMP RINCHECK /JUMP IF BUFFER EMPTY TAD RINREMOVE /GET REMOVAL POINTER DCA RINTEMP /SAVE FOR LATER NL0001 /SET INCREMENT TAD RINREMOVE /UPDATE REMOVAL POINTER AND [BUFSIZE-1] /JUST BUFFER BITS TAD (RINBUFFER) /MAKE IT ABSOLUTE DCA RINREMOVE /STORE UPDATED POINTER CDF BUFFLD /GOTO BUFFER FIELD TAD I RINTEMP /GET THE LATEST CHARACTER CDF PRGFLD /BACK TO OUR FIELD DCA RINTEMP /SAVE FOR LATER TAD FLOWFLAG /GET FLOW CONTROL FLAG SNA CLA /SKIP IF SET JMP REMINEXIT /JUMP IF NOT NL4000 /SET WAITING VALUE TAD RINWAIT /ARE WE WAITING TO EMPTY? SZA CLA /SKIP IF SO JMP REMINEXIT /JUMP IF NOT TAD RININSERT /GET INSERTION POINTER CIA /INVERT FOR TEST TAD RINREMOVE /COMPARE TO REMOVAL POINTER AND [BUFSIZE^3%4] /JUST 3/4 BITS SZA CLA /SKIP IF BUFFER NOW 1/4 FULL (OR LESS) JMP REMINEXIT /JUMP IF NOT NL7777 /SET BUFFER EMPTYING VALUE DCA RINWAIT /STORE FOR OUTPUT ROUTINE REMINEX,TAD RINTEMP /GET THE CHARACTER SKP /DON'T GET ANOTHER ONE /047 CJL / COMES HERE IF REMOTE LINE INPUT BUFFER IS EMPTY. RINCHEC,JMS RINGET /TRY TO GET A CHARACTER NOW /047 CJL ISZ REMINPUT /GOT ONE, SO TAKE SKIP RETURN /047 CJL JMP I REMINPUT /RETURN EITHER WAY / REMOTE LINE INPUT BUFFER UPDATE ROUTINE. /026 CJL / CALLING SEQUENCE: / JMS I (RINUPDATE) /CALL ROUTINE / RETURNS WITH CLEAR AC. ANY REMOTE LINE INPUT WHICH JUST OCCURRED WILL BE / BUFFERED; CALLS TO REMINPUT WILL RETRIEVE THE CHARACTERS. RINUPDA,.-. /REMOTE LINE INPUT BUFFER UPDATE ROUTINE JMS RINGET /TRY TO GET A CHARACTER NOW /047 CJL SKP /GOT ONE, DON'T LEAVE YET /047 CJL JMP I RINUPDATE /CHARACTER NOT AVAILABLE NOW, RETURN /047 CJL CDF BUFFLD /GOTO BUFFER FIELD DCA I RININSERT /STORE IN THE BUFFER CDF PRGFLD /BACK TO OUR FIELD NL0001 /SET INCREMENT TAD RININSERT /UPDATE POINTER AND [BUFSIZE-1] /JUST BUFFER BITS TAD (RINBUFFER) /MAKE IT ABSOLUTE DCA RININSERT /STORE BACK UPDATED POINTER TAD RININSERT /GET INSERTION POINTER CIA /INVERT FOR TEST TAD RINREMOVE /COMPARE TO REMOVAL POINTER SNA /SKIP IF BUFFER NOT FULL ISZ RINERROR /INDICATE REMOTE LINE INPUT ERROR SKP /SKIP IF NO OVERFLOW JMP .-2 /ENSURE ERROR IS SET TAD [BUFSIZE^3%4] /SUBTRACT 1/4 BUFFER'S WORTH AND [BUFSIZE^3%4] /JUST 3/4 BUFFER BITS SNA CLA /SKIP IF NOT 3/4 FULL TAD FLOWFLAG /ELSE CHECK IF FLOW CONTROL IS ENABLED SNA CLA /SKIP IF 3/4 FULL AND FLOW CONTROL IS ENABLED JMP I RINUPDATE /JUST RETURN TAD RINWAIT /GET INPUT WAIT FLAG SNA CLA /SKIP IF ALREADY SET ISZ RINWAIT /SET TO <^S> STATE JMP I RINUPDATE /RETURN / REMOTE LINE GET A CHARACTER ROUTINE. /047 CJL / CALLING SEQUENCE: / JMS I (RINGET) /CALL ROUTINE / CHARACTER AVAILABLE /RETURNS HERE WITH LATEST CHARACTER / NO CHARACTER AVAILABLE /RETURNS HERE IF NO CHARACTER OR HANDLED FLOW-CONTROL / NORMAL RETURN HAS LATEST CHARACTER IN AC. / SKIP RETURN HAS CLEAR AC. / IF FLOWFLAG=0, FLOW CHARACTERS ARE UNPROCESSED AND CAUSE NORMAL RETURN. RINGET, .-. /REMOTE LINE GET A CHARACTER ROUTINE RINTEST,TAD INFLAG /IS INPUT AVAILABLE? RINGT0, SNA CLA /SKIP IF SO RINREAD,JMP RINGNONE /JUMP IF NOT RINGT1, DCA INFLAG /CLEAR AVAILABILITY FLAG RINGT2, IRB /READ IN THE CHARACTER / THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS / ARE FOR KL8 INTERFACES. *RINTEST /OVERLAY DECMATE II CODE RINTEST,RKSFIOT /FLAG UP? RINGT0, JMP RINGNONE /NO, TAKE SKIP RETURN RINREAD,RKRBIOT /YES, READ THE CHARACTER RINGT1, SKP /NO ERRORS ON DECMATE I / THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS / FOR KL8 INTERFACES. *RINGT1 /OVERLAY DECMATE I CODE RINGT1, SPA /SKIP IF NO UART ERRORS RING2, ISZ RINERROR /INDICATE REMOTE LINE INPUT ERROR SKP /SKIP IF NOT TOO MANY ERRORS JMP .-2 /ENSURE REMOTE LINE INPUT ERROR IS INDICATED AND [377] /JUST EIGHT-BIT DCA RINTEMP /SAVE FOR NOW TAD FLOWFLAG /GET FLOW CONTROL FLAG SNA CLA /SKIP IF SET JMP RINGEXIT /JUMP IF NOT TAD RINTEMP /GET THE CHARACTER AND [177] /JUST SEVEN-BIT TAD [-CNTRLS] /COMPARE TO <^S> SNA /SKIP IF OTHER JMP RWATSET /JUMP IF IT MATCHES TAD [-CNTRLQ+CNTRLS]/COMPARE TO <^S> SNA CLA /SKIP IF OTHER JMP RWATCLEAR /JUMP IF IT MATCHES RINGEXI,TAD RINTEMP /GET THE CHARACTER JMP I RINGET /TAKE IMMEDIATE RETURN / COMES HERE ON <^S> TO SET OUTPUT WAIT. RWATSET,NL4000 /SET WAIT VALUE / COMES HERE ON <^Q> TO CLEAR OUTPUT WAIT. RWATCLE,DCA REMWAIT /STORE NEW STATE RINGNON,ISZ RINGET /BUMP RETURN ADDRESS JMP I RINGET /TAKE SKIP RETURN / REMOTE LINE RESET ROUTINE. /026 CJL / CALLING SEQUENCE: / JMS I (REMRESET) /CALL ROUTINE / RETURN /RETURN WITH CLEAR AC / RETURNS WITH CLEAR AC AND ALL REMOTE LINE VARIABLES RESET. REMRESE,.-. /REMOTE LINE RESET ROUTINE TAD [REMBUFFER] /SETUP THE REMOTE LINE DCA REMINSERT /OUTPUT INSERTION POINTER TAD [REMBUFFER] /SETUP THE REMOTE LINE DCA REMREMOVE /OUTPUT REMOVAL POINTER TAD (RINBUFFER) /SETUP THE REMOTE LINE DCA RININSERT /INPUT INSERTION POINTER TAD (RINBUFFER) /SETUP THE REMOTE LINE DCA RINREMOVE /INPUT REMOVAL POINTER DCA REMWAIT /CLEAR REMOTE OUTPUT WAIT DCA RINWAIT /CLEAR REMOTE INPUT WAIT DCA RINERROR /CLEAR REMOTE INPUT ERROR JMP I REMRESET /RETURN RININSE,.-. /REMOTE INPUT INSERTION POINTER RINREMO,.-. /REMOTE INPUT REMOVAL POINTER RINTEMP,.-. /REMOTE INPUT TEMPORARY /047 CJL PAGE / REMOTE LINE OUTPUT ROUTINE. / CALLING SEQUENCE: / TAD CHAR /CHARACTER TO OUTPUT IN AC / JMS I (REMOUT) /CALL ROUTINE / RETURN /RETURNS HERE WITH CLEAR AC REMOUT, .-. /REMOTE LINE OUTPUT ROUTINE DCA REMTEMP /SAVE PASSED VALUE TAD REMINSERT /GET INSERTION POINTER CIA /INVERT FOR TEST TAD REMREMOVE /COMPARE TO REMOVAL POINTER TAD REMWAIT /ADD ON WAIT STATUS SZA CLA /SKIP IF BUFFER EMPTY AND NOT WAITING /047 CJL JMP RSTUFF /JUMP IF CHARACTER MUST BE BUFFERED TAD REMTEMP /GET PASSED VALUE /047 CJL JMS I (REMPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL JMP RSTUFF /COULDN'T OUTPUT IT, SO BUFFER IT /047 CJL JMP I REMOUT /RETURN RSTUFF, TAD REMTEMP /GET THE CHARACTER CDF BUFFLD /GOTO BUFFER FIELD DCA I REMINSERT /STORE IN BUFFER CDF PRGFLD /BACK TO OUR FIELD NL0001 /SET BUFFER INCREMENT TAD REMINSERT /BUMP INSERTION POINTER AND [BUFSIZE-1] /JUST BUFFER BITS TAD [REMBUFFER] /MAKE IT ABSOLUTE DCA REMINSERT /STORE UPDATED POINTER JMP I REMOUT /RETURN / REMOTE LINE OUTPUT TEST ROUTINE. / CALLING SEQUENCE: / JMS I (REMTEST) /CALL ROUTINE / NOT READY /RETURN IF OUTPUT NOT READY FOR NEXT CHARACTER / READY /OUTPUT CAN ACCEPT ANOTHER CHARACTER NOW / AC WILL BE CLEARED AFTER THE CALL. REMTEST,.-. /REMOTE LINE OUTPUT TEST ROUTINE NL0001 /SET BUFFER INCREMENT TAD REMINSERT /GET INSERTION POINTER CIA /INVERT FOR TEST TAD REMREMOVE /COMPARE TO REMOVAL POINTER AND [BUFSIZE-1] /JUST BUFFER BITS SZA CLA /SKIP IF BUFFER IS FULL ISZ REMTEST /BUMP RETURN IF BUFFER IS NOT FULL JMP I REMTEST /RETURN EITHER WAY / REMOTE LINE OUTPUT BUFFER UPDATE ROUTINE. / CALLING SEQUENCE: / JMS I (REMUPDATE) /CALL ROUTINE / RETURN /RETURN WITH CLEAR AC / THE REMOTE LINE OUTPUT BUFFERING ROUTINES WILL UPDATE POINTERS, ETC. IF ANY / STATUS HAS CHANGED SINCE THE LAST CALL. REMUPDA,.-. /REMOTE LINE OUTPUT UPDATE ROUTINE TAD RINWAIT /GET INPUT WAIT FLAG CLL RAL /MAIN STATE BIT TO LINK SNA CLA /SKIP IF OUTPUT FLOW CHARACTER NEEDED /047 CJL JMP REMCHECK /JUMP IF CHARACTER NOT NEEDED NOW /047 CJL TAD (CNTRLQ) /ASSUME RELEASE CHARACTER NEEDED /047 CJL SNL /SKIP IF SO /047 CJL TAD [CNTRLS-CNTRLQ] /ELSE CHANGE IT TO HOLD CHARACTER /047 CJL JMS I (REMPUT) /TRY TO OUTPUT IT NOW /047 CJL JMP REMCHECK /COULDN'T DO IT, FORGET IT FOR NOW /047 CJL CML RAR /SET NEW STATE VALUE /047 CJL DCA RINWAIT /STORE IT REMCHEC,TAD REMWAIT /GET OUTPUT WAIT FLAG SZA CLA /SKIP IF NOT WAITING JMP I REMUPDATE /JUST RETURN IF WAITING TAD REMINSERT /GET OUTPUT INSERTION POINTER CIA /INVERT FOR TEST TAD REMREMOVE /COMPARE TO OUTPUT REMOVAL POINTER SNA CLA /SKIP IF BUFFER CONTAINS SOMETHING /047 CJL JMP I REMUPDATE /RETURN IF BUFFER EMPTY /047 CJL CDF BUFFLD /GOTO BUFFER FIELD TAD I REMREMOVE /GET A CHARACTER FROM THE BUFFER CDF PRGFLD /BACK TO OUR FIELD JMS I (REMPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL JMP I REMUPDATE /COULDN'T DO IT, SO JUST RETURN /047 CJL NL0001 /SET BUFFER INCREMENT TAD REMREMOVE /BUMP REMOVAL POINTER AND [BUFSIZE-1] /JUST BUFFER BITS TAD [REMBUFFER] /MAKE IT ABSOLUTE DCA REMREMOVE /STORE UPDATED POINTER JMP I REMUPDATE /RETURN REMTEMP=REMUPDATE /REMOTE OUTPUT TEMPORARY / LOW-LEVEL CONSOLE OUTPUT ROUTINE. /047 CJL / CALLING SEQUENCE: / [CHARACTER TO OUTPUT IN THE AC] / JMS I (CONPUT) /CALL ROUTINE / NO OUTPUT /RETURNS HERE IF OUTPUT UNAVAILABLE / OUTPUT /RETURNS HERE IF CHARACTER WAS OUTPUT CONPUT, .-. /CONSOLE OUTPUT ROUTINE CONTSF, TSFIOT /FLAG UP? JMP CONCLEAR /NO, FORGET IT CONTLS, TLSIOT /YES, OUTPUT THE CHARACTER NOW ISZ CONPUT /TAKE SKIP RETURN CONCLEA,CLA /CLEAN UP JMP I CONPUT /RETURN EITHER WAY / CONSOLE RESET ROUTINE. /026 CJL / CALLING SEQUENCE: / JMS I (CONRESET) /CALL ROUTINE / RETURN /RETURN WITH CLEAR AC / RETURNS WITH CLEAR AC AND ALL CONSOLE VARIABLES RESET. CONRESE,.-. /CONSOLE RESET ROUTINE TAD [CONBUFFER] /SETUP THE DCA I (CONINSERT) /CONSOLE OUTPUT INSERTION POINTER TAD [CONBUFFER] /SETUP THE DCA I (CONREMOVE) /CONSOLE OUTPUT REMOVAL POINTER TAD [KEYBUFFER] /SETUP THE DCA I (KEYINSERT) /KEYBOARD INSERTION POINTER TAD [KEYBUFFER] /SETUP THE DCA I (KEYREMOVE) /KEYBOARD REMOVAL POINTER DCA I (CONWAIT) /CLEAR OUTPUT WAIT DCA KEYERROR /CLEAR KEYBOARD ERROR JMP I CONRESET /RETURN / LOW-LEVEL REMOTE LINE OUTPUT ROUTINE. /047 CJL / CALLING SEQUENCE: / [CHARACTER TO OUTPUT IN THE AC] / JMS I (REMPUT) /CALL ROUTINE / NO OUTPUT /RETURNS HERE IF OUTPUT UNAVAILABLE / OUTPUT /RETURNS HERE IF CHARACTER WAS OUTPUT REMPUT, .-. /REMOTE LINE OUTPUT ROUTINE DM1AN2, AND [377] /ENSURE EIGHT BIT /049 CJL / THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS / FOR KL8 INTERFACES. *DM1AN2 /OVERLAY DECMATE II CODE /049 CJL DM1AN2, SKP /WE'RE NOT A DECMATE I /049 CJL TAD [400] /SET WRITE BIT /049 CJL REMTSF, DCA RMPTEMP /SAVE PASSED VALUE RMPUT0, TAD OUTFLAG /CHECK IF OUTPUT IS AVAILABLE REMTLS, SNA CLA /SKIP IF SO RMPUT1, JMP I REMPUT /RETURN IF NOT REMCLEA,TAD RMPTEMP /GET THE PASSED VALUE RMPUT2, OLS /OUTPUT THE CHARACTER NOW / THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS / ARE FOR KL8 INTERFACES. *REMTSF /OVERLAY DECMATE II CODE REMTSF, RTSFIOT /FLAG UP? RMPUT0, JMP REMCLEAR /NO, FORGET IT REMTLS, RTLSIOT /YES, OUTPUT THE CHARACTER NOW RMPUT1, ISZ REMPUT /TAKE SKIP RETURN REMCLEA,CLA /CLEAN UP RMPUT2, JMP I REMPUT /RETURN EITHER WAY CLA /CLEAN UP DCA OUTFLAG /INDICATE OUTPUT IS UNAVAILABLE ISZ REMPUT /TAKE SKIP RETURN JMP I REMPUT /RETURN TO CALLER RMPTEMP=CONRESET /REMOTE OUTPUT TEMPORARY PAGE / SEVEN-BIT COMMAND TABLES. /034 CJL CMDTBL= . /COMMAND TABLE HERE "C&177; "O&177; "N&177 /\ "N&177; "E&177; "C&177 / >CONNECT COMMAND "T&177; -1 // CONSRV /CONNECT ROUTINE ADDRESS "F&177; "I&177; "N&177 /\ "I&177; "S&177; "H&177 / >FINISH COMMAND -1 // FINSRV /FINISH ROUTINE ADDRESS "E&177; "X&177; "I&177 /EXIT "T&177; -1 /COMMAND EXITKERMIT /EXIT ROUTINE ADDRESS "S&177; "E&177; "N&177 /SEND "D&177; -1 /COMMAND SNDSRV /SEND ROUTINE ADDRESS "G&177; "E&177; "T&177 /GET -1 /COMMAND GETSRV /GET ROUTINE ADDRESS "R&177; "E&177; "C&177 /\ "E&177; "I&177; "V&177 / >RECEIVE COMMAND "E&177; -1 // RECSRV /RECEIVE ROUTINE ADDRESS "H&177; "E&177; "L&177 /HELP "P&177; -1 /COMMAND HELPSRV /HELP ROUTINE ADDRESS -1 /THIS ENDS THE TABLE /034 CJL / REMOTE PACKET INPUT BUFFER. /014 CJL RRBUF, 0 /MARK RRLEN, 0 /PACKET LENGTH RRSEQ, 0 /PACKET SEQ RRTYP, 0 /PACKET TYPE DECIMAL RRDTA, ZBLOCK 91 /DATA GOES HERE OCTAL RTERMI, 0 /ADD LOCATION WHERE TERMINATOR IS STORED/A004 /ON RECEIVE IF BUFFER IS MAXIMUM LENGTH /A004 / REMOTE PACKET OUTPUT BUFFER RSBUF, CNTRLA /PACKET BUFFER (BEGINS WITH "SOH") /034 CJL RSLEN, 0 /PACKET LENGTH GOES HERE RSSEQ, 0 /PACKET SEQUENCE GOES HERE RSTYP, 0 /PACKET TYPE GOES HERE DECIMAL RSDTA, ZBLOCK 91 /DATA GOES HERE 0 /CHECKSUM HERE ON MAX PACKET 0 /EOL (IF USED HERE ON MAX PACKET) 0 /INTERNAL TERMINATOR HERE ON MAX PACKET OCTAL / SEND-INIT PACKET DEFINITION INIDAT, DECIMAL 94+32 /94 CHARS MAX OCTAL "/&177 /15 SECOND TIME-OUT /M013/014 CJL " &177 /NO PADDING 0+100&177 /NO PADDING CHAR " &177+15 /CR FOR EOL "#&177 /QUOTE CHAR "N&137 /NO 8TH BIT QUOTING "1&177 /CHECK TYPE 1 " &177 /NO REPEAT CHAR " &177+0 /NO EXTRA CAPABILITY NODATA, -1 /END OF DATA (USE THIS FOR SENDING NO-DATA) PAGE /GET TO NEXT PAGE /028 CJL / NO-INTERRUPT CONSOLE INPUT/OUTPUT SUPPORT ROUTINES. /023 CJL / MODIFIED FOR FORCED-ECHO AND COLUMN-COUNTING. /043 CJL / CONSOLE INPUT ROUTINE. RETURNS LATEST CHARACTER WITHOUT ECHOING. MAY BE / CALLED WITH DIRTY AC. RETURNS LATEST SEVEN-BIT CHARACTER TYPED WHILE FIELDING / POTENTIAL <^S>/<^Q> PROTOCOL. INPUT, .-. /CONSOLE INPUT ROUTINE INPWAIT,JMS CHKUP /TRY TO GET A CHARACTER TAD INCHAR /GET THE CHARACTER SNA /SKIP IF ANYTHING CAME IN JMP INPWAIT /WAIT FOR ANYTHING JMP I INPUT /RETURN WITH LATEST CHARACTER / CONSOLE OUTPUT ROUTINE. OUTPUTS CHARACTER IN AC (INCLUDING <HT> VIA / SIMULATION). RETURNS WITH CLEAR AC. SUBJECT TO CONSOLE ECHO STATUS (ECHOSW). P7CH, .-. /CONSOLE OUTPUT ROUTINE TAD (-CNTRLI) /COMPARE TO <HT> SNA /SKIP IF OTHER JMP DOTAB /JUMP IF <HT> TAD L11/(CNTRLI) /RESTORE THE CHARACTER JMS P7CHAR /PRINT IT (UPDATING COLUMN COUNT) JMP I P7CH /RETURN DOTAB, TAD [" &177] /GET A <SPACE> JMS P7CHAR /OUTPUT IT TAD COLUMN /GET CURRENT COLUMN COUNT AND [7] /JUST TAB BITS SZA CLA /SKIP IF NOW AT NEW TAB STOP JMP DOTAB /ELSE KEEP GOING JMP I P7CH /RETURN / FORCED-ECHO CONSOLE OUTPUT ROUTINE. SAME AS P7CH BUT CLEARS ECHOSW BEFORE / OUTPUT OF THE CHARACTER. P7ECHO, .-. /CONSOLE OUTPUT WITH FORCED-ECHO ROUTINE DCA P7TEMP /SAVE PASSED VALUE DCA ECHOSW /CLEAR ECHO STATUS TAD P7TEMP /RESTORE THE CHARACTER JMS P7CH /CALL MAIN ROUTINE JMP I P7ECHO /RETURN CHKUP, .-. /CHECK FOR <^C>, ETC. ROUTINE JMS CTLCTST /CALL LOW-LEVEL INPUT CHECK ROUTINE SNA /SKIP IF ANYTHING CAME BACK JMP CHKCLR /ELSE FORGET IT TAD (-CNTRLP) /COMPARE TO <^P> SNA /SKIP IF OTHER JMP DOUP /GO HANDLE <^P> THERE IAC /TAD (-CNTRLO+CNTRLP)/COMPARE TO <^O> SNA /SKIP IF OTHER JMP DOUO /GO HANDLER <^O> THERE TAD (-CNTRLS+CNTRLO) /COMPARE TO <^S> SZA CLA /SKIP IF IT MATCHES JMP I CHKUP /RETURN ON UNIMPORTANT CHARACTERS UQWAIT, JMS CTLCTST /CALL LOW-LEVEL INPUT CHECK ROUTINE TAD (-CNTRLQ) /COMPARE TO <^Q> SZA CLA /SKIP IF IT MATCHES JMP UQWAIT /ELSE WAIT FOR <^Q> FOREVER CHKCLR, DCA INCHAR /OBLITERATE INPUT CHARACTER JMP I CHKUP /RETURN / COMES HERE TO HANDLE <^P>. DOUP, TAD ("P&177) /GET A "P" JMS UPRINT /PRINT "^P" JMP I UPADDRESS /GO WHERE YOU SHOULD / COMES HERE TO HANDLE <^O>. DOUO, TAD ("O&177) /GET AN "O" JMS UPRINT /PRINT "^O" NL4000 /SET REVERSING BIT TAD ECHOSW /REVERSE THE ECHO STATE DCA ECHOSW /STORE BACK JMP CHKCLR /OBLITERATE <^O> AND RETURN CTLCTST,.-. /LOW-LEVEL <^C> TEST ROUTINE CLA /CLEAN UP KSFLOC, KSFIOT /FLAG UP? JMP I CTLCTST /NO, JUST RETURN KRSZAP, KRSIOT /**** 6120 **** KRBIOT AND [177] /JUST SEVEN-BIT DCA INCHAR /SAVE THE CHARACTER NL7775 /SET -<^C> VALUE TAD INCHAR /COMPARE TO CHARACTER SNA CLA /SKIP IF OTHER THAN <^C> JMP I UCADDRESS /JUMP IF <^C> KCCZAP, KCCIOT /**** 6120 **** 0000 TAD INCHAR /GET THE CHARACTER JMP I CTLCTST /RETURN P7CHAR, .-. /LOWER-LEVEL CONSOLE PRINT ROUTINE DCA P7TEMP /SAVE PASSED VALUE P7AGN, JMS CHKUP /CHECK FOR <^C>, ETC. TAD ECHOSW /GET CURRENT ECHO STATUS SPA CLA /SKIP IF ECHO ON JMP P7OFF /JUMP IF ECHO OFF TAD P7TEMP /GET THE PASSED VALUE BACK JMS P7OUT /TRY TO OUTPUT IT JMP P7AGN /COULDN'T OUTPUT, GO WAIT THERE P7OFF, JMS CHKUP /CHECK FOR <^C>, ETC. TAD P7TEMP /GET THE CHARACTER BACK AND [140] /JUST QUADRANT BITS SZA CLA /SKIP IF CONTROL CHARACTER ISZ COLUMN /BUMP COLUMN IF PRINTING CHARACTER L11, CNTRLI/NOP /JUST IN CASE TAD P7TEMP /GET THE CHARACTER AGAIN TAD (-CNTRLM) /COMPARE TO <CR> SNA /SKIP IF NOT <CR> DCA COLUMN /CLEAR COLUMN COUNT ON <CR> TAD (-CNTRLH+CNTRLM)/COMPARE TO <BS> SNA CLA /SKIP IF OTHER NL7777 /SET BACKUP VALUE TAD COLUMN /UPDATE COLUMN COUNT DCA COLUMN /STORE BACK JMP I P7CHAR /RETURN P7OUT, .-. /LOW-LEVEL CONSOLE OUTPUT ROUTINE P7TSF, TSFIOT /FLAG UP? JMP I P7OUT /NO, TAKE IMMEDIATE RETURN WITH AC INTACT P7TLS, TLSIOT /YES, OUTPUT IT CLA /CLEAN UP ISZ P7OUT /BUMP RETURN ADDRESS JMP I P7OUT /TAKE SKIP RETURN TO CALLER / COMES HERE TO HANDLE <^C> IF SO ENABLED. UPCPRT, TAD ("C&177) /GET A "C" JMS UPRINT /PRINT "^C" KCCZP2, KCCIOT /**** 6120 **** 0000 JMP I [CLOOP] /RESTART UPRINT, .-. /"^"<CHARACTER> PRINTING ROUTINE DCA P7TEMP /SAVE PASSED VALUE TAD ("^&177) /GET AN "^" JMS P7OUT /OUTPUT IT JMP .-1 /WAIT FOR IT TAD P7TEMP /GET PASSED VALUE JMS P7OUT /OUTPUT IT JMP .-1 /WAIT FOR IT JMP I UPRINT /RETURN P7TEMP, .-. /OUTPUT ROUTINE TEMPORARY PAGE / HANDLER I/O BUFFER DEFINITIONS. /014 CJL HNDLR= . /BUFFER FOR DISK I/O HANDLER /014 CJL *PAGCNT^200+HNDLR /RESET ORIGIN PAST HANDLER BUFFER /014 CJL IFNZRO SBOOT-.&4000 <ERROR .> /028 CJL *SBOOT-1 /JUST BEFORE EXIT ADDRESS /025 CJL EXITKER=. /WHERE TO EXIT TO /025 CJL / ONCE-ONLY INITIALIZATION CODE. /024 CJL *HNDLR /OVER AVAILABLE SPACE INITIAL,CLA CLL /CLEAN UP COUTINI,TLSIOT /RAISE CONSOLE OUTPUT FLAG /046 CJL TAD INITIA/(CLA CLL)/GET REPLACEMENT INSTRUCTION DCA I [CLOOP] /DON'T COME BACK TO US JMS I (MACHINE) /IDENTIFY CPU TYPE DCA CPUTEMP /SAVE IT TAD CPUTEMP /GET CPU TYPE TAD (-13) /COMPARE TO DEADLY 6120 VALUE SNA CLA /SKIP IF OTHER JMP INI6120 /JUMP IF IT MATCHES ROUTINI,RTLSIOT /INITIALIZE REMOTE OUTPUT /046 CJL RININIT,RKRBIOT /INITIALIZE REMOTE INPUT /046 CJL CLA /CLEAN UP INITPRT,JMS I [SCRIBE] /GIVE THEM THE INITMSG /OPENING MESSAGE JMS I [SCRIBE] /GIVE THEM THE DAYMSG /DAY MESSAGE JMS I [SCRIBE] /GIVE THEM THE MONMSG /MONTH MESSAGE JMS I [SCRIBE] /GIVE THEM THE YEARMSG /YEAR MESSAGE JMS I [SCRIBE] /GIVE THEM THE CPUTMSG /CPU ID MESSAGE TAD CPUTEMP /*1 CLL RTL /*4 TAD CPUTEMP /*5 TAD (CPULIST) /POINT TO PROPER MESSAGE DCA TST6120 /STORE IN-LINE JMS I [SCRIBE] /TELL THEM THEIR TST6120,0 /ACTUAL CPU ID JMS I [SCRIBE] /GIVE THEM THE CLOSMSG /CLOSING MESSAGE DMPRZAP,JMP .+3 /**** DECMATE USAGE DETECTED **** 0000 JMS I [SCRIBE] /GIVE THEM THE SPZAP, DMPOMSG /DECMATE PORT MESSAGE JMS I [SCRIBE] /GIVE THEM THE CRLF /END OF LINE JMS I [SCRIBE] /GIVE THEM THE LCLMSG /LOCAL PREFERENCE MESSAGE JMS I [SCRIBE] /TELL THEM THEY CAN THLPMSG /ASK FOR HELP TAD CPUTEMP /GET CPU TYPE CLL RTL /*4 TAD (CPUPRMPT-1) /POINT TO PROPER ENTRY DCA XR0 /STASH THE POINTER TAD (-4) /GET MOVE COUNT JMS MESMOVE /MOVE THE PROPER PROMPT TEXT PROMID-1 /TO THERE TAD CPUTEMP /*1 CLL RTL /*4 TAD CPUTEMP /*5 TAD (CPUIDLST-1) /POINT TO PROPER ENTRY DCA XR0 /STASH THE POINTER TAD (-5) /GET MOVE COUNT JMS MESMOVE /MOVE THE PROPER CPU ID TEXT CPUMSG-1 /TO THERE CIF USRFLD /GOTO USR FIELD /035 CJL JMS I (USR) /CALL USER SERVICE ROUTINE /035 CJL USRIN /LOCK USR IN /035 CJL / DO FURTHER INITIALIZATION HERE. JMP I [CLOOP] /GO BACK TO KERMIT PROPER / COMES HERE TO INITIALIZE 6120-BASED MACHINES. /046 CJL INI6120,DCA I (KCCZAP) /ELIMINATE KCCIOT DCA I (KCCZP2) /ELIMINATE KCCIOT ISZ I (KRSZAP) /TURN KRSIOT ISZ I (KRSZAP) /INTO KRBIOT TAD ROUTINITIALIZE /GET OUTPUT INITIALIZE INSTRUCTION /046 CJL TAD (-6336) /COMPARE TO POSSIBLE VALUE /046 CJL SZA CLA /SKIP IF IT MATCHES SERIAL PRINTER VALUE/046 CJL JMP TRYDM1 /JUMP IF NOT CONFIGURED FOR SERIAL PORT /046 CJL TAD RININITIALIZE /GET INPUT INITIALIZE INSTRUCTION /046 CJL TAD (-6326) /COMPARE TO POSSIBLE VALUE /046 CJL SNA CLA /SKIP IF NOT CONFIGURED FOR SERIAL PORT /046 CJL JMP DMSER /JUMP IF SERIAL PORT CONFIGURATION /046 CJL TRYDM1, CLSK /SKIP ON, CLEAR CLOCK FLAG IF DECMATE II/046 CJL NOP /JUST IN CASE /046 CJL CLCL /CLEAR VT278 CLOCK FLAG /046 CJL NOP /JUST IN CASE /046 CJL ISZ TST6120 /WASTE /046 CJL JMP .-1 /SOME TIME /046 CJL CLSK8A /VT278 CLOCK FLAG UP? /046 CJL JMP TRYDM2 /NO, TRY DECMATE II, ETC. /046 CJL DCA DMPRZAP /MAKE IT PRINT OUR MESSAGE /050 CJL CIF CDF DMIFLD /GOTO DECMATE ONCE-ONLY CODE FIELD /046 CJL JMP I (DM1INIT) /CONTINUE THERE /046 CJL TRYDM2, CLSK /CLOCK FLAG UP? /046 CJL JMP ROUTINITIALIZE /NO, MUST BE SOMEBODY ELSE! /046 CJL DCA DMPRZAP /MAKE IT PRINT OUR MESSAGE /048 CJL CIF CDF DMIFLD /GOTO DECMATE ONCE-ONLY FIELD /046 CJL JMP I (DM2INIT) /CONTINUE THERE /046 CJL / COMES HERE IF SERIAL PORT CONFIGURATION ON DECMATE. DMSER, DCA DMPRZAP /MAKE IT PRINT OUR MESSAGE /048 CJL TAD (DMPPMSG) /GET OUR MESSAGE ADDRESS /048 CJL DCA SPZAP /STORE IN-LINE /048 CJL JMP ROUTINITIALIZE /CONTINUE THERE MESMOVE,.-. /MESSAGE MOVE ROUTINE DCA MMOVCNT /SAVE PASSED COUNT TAD I MESMOVE /GET THE PASSED ARGUMENT DCA XR1 /SET IT UP ISZ MESMOVE /BUMP PAST ARGUMENT CDF MSGFLD /GOTO BUFFER FIELD MESMVLP,TAD I XR0 /GET A WORD DCA I XR1 /PUT A WORD ISZ MMOVCNT /DONE YET? JMP MESMVLP /NO, GO BACK CDF PRGFLD /BACK TO OUR FIELD JMP I MESMOVE /YES, RETURN CPUTEMP,.-. /TEMPORARY FOR MACHINE TYPE MMOVCNT,.-. /TEMPORARY FOR MOVE COUNT PAGE / CPU IDENTIFYING ROUTINE. /024 CJL / RETURNS VALUE IN AC ACCORDING TO THE FOLLOWING RULE: / AC CPU TYPE / 0 UNKNOWN (DCC112, MP-12?) / 1 PDP-5 (THE INCOMPATIBLE ONE!) / 2 PDP-8 (THE REAL ONE!) / 3 PDP-8/S (THE SLOW ONE!) / 4 LINC-8 (THE STRANGE ONE!) / 5 PDP-8/I (THE ORANGE ONE!) / 6 PDP-8/L (THE STRIPPED-DOWN ONE!) / 7 PDP-12 (THE GREEN ONE! (BLUE?)) / 10 PDP-8/E (THE FAST ONE!) / 11 PDP-8/A (THE WIDE ONE!) / 12 6100 (THE MICRO ONE!) / 13 6120 (THE HARRIS ONE!) MACHINE,.-. /MACHINE IDENTIFYING ROUTINE CLA CLL /THIS WORKS ON EVERYBODY! TAD 0 /GET PDP-5 PC DCA MACHTEMP /SAVE IT TAD (IMA5-1) /GET PDP-5 NEW PC DCA 0 /STORE IT / IF WE GET HERE, WE'RE NOT A PDP-5. TAD MACHTEMP /GET OLD LOCATION ZERO DCA 0 /RESTORE IT NL3776 /PDP-8/I, L WEIRDNESS TAD (-3776) /COMPARE TO POSSIBLE VALUE SNA CLA /SKIP IF NOT THOSE TWO JMP IMA8IL /JUMP IF ONE OF THEM / IF WE GET HERE, WE'RE NOT A PDP-8/I OR PDP-8/L. NL7776 /SETUP -2 TAD (-7776) /COMPARE TO EXPECTED VALUE SZA CLA /SKIP IF OK JMP IMA8S /JUMP IF RETARDED BROTHER / IF WE GET HERE, WE'RE NOT A PDP-8/S. NL0100 /SETUP 0100 TAD (-100) /COMPARE TO EXPECTED VALUE SNA CLA /SKIP IF STRAIGHT PDP-8 JMP IMAOMNIBUS /JUMP IF NEWER CPU / IF WE GET HERE, WE ARE A PDP-8, BUT ARE WE A LINC-8? NL7777 /SETUP LINC TEST VALUE IACA /LOAD LINC "A" REGISTER CLA /CLEAN UP IAAC /GET IT BACK IAC /ADD ONE SNA CLA /SKIP IF NO LINC HARDWARE JMP IMAL8 /JUMP IF LINC-8 / SINCE WE DON'T CARE ABOUT PERIPHERALS, WE ARE A PDP-8. JMP IMA8 /GO TELL THEM WE ARE A PDP-8 / COMES HERE IF PDP-8/I OR PDP-8/L. IMA8IL, NL7777 /SETUP TEST VALUE CLA!401 /DO PDP-8/I GROUP THREE EAE CLA SZA CLA /SKIP IF PDP-8/I JMP IMA8L /JUMP IF NOT / IF WE GET HERE, WE ARE A PDP-8/I, BUT ARE WE A PDP-12? LINC /GOTO LINC MODE COM /COMPLEMENT AC IF PDP-12, ELSE A HARMLESS AND PDP /GOTO PDP8 MODE IF PDP-12, ELSE HARMLESS AND IAC /ADD ONE FOR TEST SNA CLA /SKIP IF JUST PDP-8/I JMP IMA12 /JUMP IF ACTUALLY A LINC-8/I / SINCE WE DON'T CARE ABOUT PERIPHERALS, WE ARE JUST A PDP-8/I. JMP IMA8I /TELL THEM WE ARE A PDP-8/I IMAOMNI,RTL RTR /DO STRANGE OMNIBUS INSTRUCTION PC8A, SNA /SKIP IF NOT A MICRO CHIP JMP IMA61 /JUMP IF ONE OF THOSE THINGS TAD (.&7600+16^7777) /CHECK FOR PDP-8/E VALUE SNA /SKIP IF NOT HIM JMP IMA8E /JUMP IF IT IS A PDP-8/E (/F OR /M OR 8A-6XX) TAD (.&7600+16-PC8A) /COMPARE TO PDP-8/A VALUE /051 CJL SNA CLA /SKIP IF SOMEBODY ELSE JMP IMA8A /JUMP IF IT MATCHES / IF WE GET HERE, SOME STRANGE PROCESSOR IS RUNNING US. JMP IMAUNKNOWN /YOU FIGURE IT OUT! / IF WE GET HERE, WE ARE A 6100 OR 6120. IMA61, NL0010 /DO 6120 SPECIAL INSTRUCTION TAD (-10) /COMPARE TO EXPECTED VALUE SNA CLA /SKIP IF OTHER JMP IMA6120 /JUMP IF IT MATCHES / WE APPARENTLY ARE ON A 6100, SO TELL THEM SO. JMP IMA6100 /TELL THEM WE ARE A 6100 MACHINE (VT-78, ETC.) / RETURN GAUNTLET. IMA6120,IAC /SET 6120 VALUE IMA6100,IAC /SET 6100 VALUE IMA8A, IAC /SET PDP-8/A VALUE IMA8E, IAC /SET PDP-8/E VALUE IMA12, IAC /SET PDP-12 VALUE IMA8L, IAC /SET PDP-8/L VALUE IMA8I, IAC /SET PDP-8/I VALUE IMAL8, IAC /SET LINC-8 VALUE IMA8S, IAC /SET PDP-8/S VALUE IMA8, IAC /SET PDP-8 VALUE IMA5, IAC /SET PDP-5 VALUE IMAUNKN,JMP I MACHINE /RETURN MACHTEM,.-. /TEMPORARY FOR LOCATION ZERO PAGE FIELD PRGFLD%10 /DUMP THE LITERALS NOW / LAYOUT OF FIELD ONE (PERMANENT CONTENTS). /046 CJL NOPUNCH /FOOL THE ASSEMBLER /046 CJL FIELD USRFLD%10 /USR FIELD /046 CJL *0 /WHERE IT LOADS /046 CJL USRLOAD,ZBLOCK 200-. /GET TO ENTRY POINT /046 CJL USRENTR=. /LOCKED-IN USR ENTRY POINT /046 CJL USRENTR,ZBLOCK 2000-. /USR OWNS REST OF THIS AREA /046 CJL FILBUFF=. /FILE I/O DONE HERE /046 CJL FIELD BUFFLD%10 /FILE I/O BUFFER FIELD /046 CJL *FILBUFFER /RESET ORIGIN /046 CJL FILBUFF,ZBLOCK PAGCNT^200 /THIS IS THE FILE I/O BUFFER /046 CJL DIRBUFF=. /DIRECTORY LOOKUP I/O DONE HERE /028 CJL FIELD DIRFLD%10 /DIRECTORY LOOKUP BUFFER FIELD /028 CJL *DIRBUFFER /RESET ORIGIN /028 CJL FILECNT,.-. /-(NUMBER OF ENTRIES IN THIS SEGMENT) FRSTREC,.-. /FIRST RECORD OF FIRST ENTRY IN THIS SEGMENT DIRLINK,.-. /LINK TO NEXT SEGMENT; 0 IF LAST ACTIVE ONE .-. /TENTATIVE ENTRY POINTER STORED HERE AIWNUMB,.-. /-(NUMBER OF ADDITIONAL INFORMATION WORDS) ENTSTRT=. /FILE ENTRIES START HERE /046 CJL ZBLOCK PAGCNT^200+DIRBUFFER-. /DIRECTORY ENTRIES HERE /046 CJL / CONNECT MODE I/O BUFFERS. /026 CJL KEYBUFF,ZBLOCK BUFSIZE /KEYBOARD BUFFER /026 CJL CONBUFF,ZBLOCK BUFSIZE /CONSOLE OUTPUT BUFFER /026 CJL RINBUFF,ZBLOCK BUFSIZE /REMOTE INPUT BUFFER /026 CJL REMBUFF,ZBLOCK BUFSIZE /REMOTE OUTPUT BUFFER /026 CJL FLD1ADR=. /SPACE AVAILABLE FOR TEXT, ETC. /046 CJL ENPUNCH /UN-FOOL THE ASSEMBLER /046 CJL / DECMATE ONCE-ONLY CODE. /046 CJL FIELD DMIFLD%10 /DECMATE ONCE-ONLY CODE FIELD /046 CJL *USRLOAD /OVER USR ROUTINE /046 CJL / PAGE ZERO FOR ONCE-ONLY CODE. /046 CJL *10 /GET TO AUTO-INDEX AREA /048 CJL XR0, .-. /AUTO-INDEX ZERO /048 CJL *USRENTRY /OVER USR ENTRY POINT /046 CJL / DECMATE I ONCE-ONLY CODE. /046 CJL DM1INIT,JMS I (DM1PORT) /INITIALIZE THE REMOTE PORTS /050 CJL TAD (DM1LIST-1) /POINT TO REPLACEMENT LIST /050 CJL JMS REPLACE /ZAP IN ALL OF OUR PATCHES /050 CJL CDF PRGFLD /GOTO MAIN FIELD /050 CJL TAD I (DIRXR) /GET PORT SELECTION /050 CJL SNA CLA /SKIP IF PORT 1 REQUIRED /050 CJL JMP USEP0 /JUMP IF PORT 0 REQUIRED /050 CJL TAD (DM1SEC-1) /POINT TO REPLACEMENT LIST /050 CJL JMS REPLACE /ZAP IN SECONDARY PATCHES /050 CJL USEP0, CIF CDF PRGFLD /BACK TO REST OF INITIALIZATION /046 CJL JMP I (INITPRT) /CONTINUE THERE /046 CJL / DECMATE II, ETC. ONCE-ONLY CODE. /046 CJL DM2INIT,JMS I (DMIPORT) /INITIALIZE THE REMOTE PORT /048 CJL TAD (DM2LIST-1) /POINT TO REPLACEMENT LIST /048 CJL JMS REPLACE /ZAP IN ALL OF OUR PATCHES /048 CJL CIF CDF PRGFLD /BACK TO REST OF INITIALIZATION /046 CJL JMP I (INITPRT) /CONTINUE THERE /046 CJL REPLACE,.-. /REPLACEMENT ROUTINE /048 CJL DCA XR0 /SAVE PASSED LIST POINTER /048 CJL REPLUP, CDF DMIFLD /BACK TO OUR FIELD /048 CJL TAD I XR0 /GET AN ADDRESS /048 CJL SNA /SKIP IF NOT AT END OF LIST /048 CJL JMP I REPLACE /RETURN IF END OF LIST /048 CJL DCA REPADR /STASH THE ADDRESS /048 CJL TAD I XR0 /GET THE REPLACEMENT VALUE /048 CJL CDF PRGFLD /GOTO ZAPPING FIELD /048 CJL DCA I REPADR /ZAP IT IN /048 CJL JMP REPLUP /KEEP GOING /048 CJL REPADR, .-. /REPLACEMENT ADDRESS TEMPORARY /048 CJL / DECMATE I PORT INITIALIZE ROUTINE /050 CJL DM1PORT,.-. /DECMATE I PORT INITIALIZE ROUTINE TAD (234) /GET PORT 0 SCD ENABLE VALUE WCON0 /WRITE PORT 0 CONTROL REGISTER NL0000 /INDICATE PORT 0 JMS PRTINIT /INITIALIZE PORT 0 / CHANGE ALL IOTS TO PORT 1 VALUES. IOCLUP, ISZ PSETF1 /BUMP SET FLAG INSTRUCTION ISZ PDUMRD /BUMP DUMMY READ INSTRUCTION ISZ PSETF2 /BUMP SET FLAG INSTRUCTION ISZ PSKIP /BUMP SKIP ON FLAG INSTRUCTION ISZ PLOAD /BUMP LOAD INSTRUCTION ISZ IOTCNT /DONE YET? JMP IOCLUP /NO, KEEP GOING TAD (234) /GET PORT 1 SCD ENABLE VALUE WCON1 /WRITE PORT 1 CONTROL REGISTER NL4000 /INDICATE PORT 1 JMS PRTINIT /INITIALIZE PORT 1 JMP I DM1PORT /RETURN PRTINIT,.-. /LOW-LEVEL PORT INTIALIZE ROUTINE RACD /RESET DESIRED PORT ISZ PWASTE /WASTE JMP .-1 /SOME TIME CLA /CLEAN UP PSETF1, RTFL0 /SET THE FLAG NOW TAD (2516) /SETUP FOR 8 BITS, NO PARITY, ETC. JMS PSEND /SEND TO MODE REGISTER 1 CDF PRGFLD /GOTO MAIN FIELD TAD I (RATE) /GET BAUD RATE NOW CDF DMIFLD /BACK TO OUR FIELD TAD (2460) /ADD ON CLOCK ENABLES, ETC. JMS PSEND /SEND TO MODE REGISTER 2 TAD (3425) /GET ENABLE AND RESET VALUE JMS PSEND /SEND TO COMMAND REGISTER PDUMRD, RKRB0 /DO A DUMMY READ NOW PSETF2, RTFL0 /SET THE FLAG NOW CLA /CLEAN UP JMP I PRTINIT /RETURN PSEND, .-. /PORT WRITE ROUTINE PSKIP, RTSF0 /FLAG UP? JMP PSKIP /NO, WAIT FOR IT PLOAD, RTLS0 /YES, LOAD THE VALUE CLA /CLEAN UP JMP I PSEND /RETURN IOTCNT, RKFL0-RKFL1 /INTER-DEVICE IOT COUNT PWASTE, 0 /TIMER TEMPORARY PAGE / DECMATE II, ETC. PORT INITIALIZE ROUTINE. /048 CJL / THIS ROUTINE IS MOSTLY "DARK GREY MAGIC" WHICH IS PRIMARILY DERIVED FROM THE / "OFFICIAL" INFORMATION TAKEN FROM THE ONLY KNOWN DOCUMENTATION, THE DECMATE II / PROGRAMMER'S REFERENCE MANUAL: EK-DECM2-RM-001. VARIOUS EMPLOYEES OF DIGITAL / EQUIPMENT CORPORATION (A MULTI-NATIONAL COMPANY) HAVE ADDITIONALLY CONTRIBUTED / TO THIS EFFORT BY PROVIDING PORTIONS OF THE "SACRED SLUSHWARE NOTES" ON A NOT / NECESSARILY WILLING BASIS THROUGH THEIR RELEASED WORKS, SUCH AS, BUT NOT / LIMITED TO, THE SOURCES OF THE PARTICULAR VERSION OF KERMIT-8 KNOWN AS K278. / IT IS ASSUMED THAT THESE PEOPLE HAVE ACCESS TO BETTER DOCUMENTATION OF THE / HARDWARE, AND ESPECIALLY DOCUMENTATION OF THE THREE DIFFERENT MODELS OF / DECMATE (II, III, III+) THAT THESE ISSUES APPLY TO. / SINCE IT IS NOT KNOWN WHETHER THE K278, ETC. CODE IS SPECIFIC AND PRECISE, OR / MERELY SLOPPY, VARIOUS "QUIRKY" CODING TECHNIQUES HAVE BEEN LEFT "AS IS", WITH / COMMENTS REGARDING POTENTIAL VARIANCE WITH DOCUMENTATION NOTED WHERE / NECESSARY. THE ORDER OF ACCESS TO THE REGISTERS HAS BEEN LEFT INTACT IN CASE / OF POTENTIAL INTERACTION. SEVERAL CHANGES HAVE BEEN MADE BEYOND THIS WORK AS / A RESULT OF TRIAL-AND-ERROR, AND ALSO HAND DIS-ASSEMBLY OF SEVERAL DECMATE / DISKETTES' CONTENTS. / IT IS HOPED THAT FUTURE "NEGOTIATIONS" WITH DEC ALLOW FOR PROPER DISCLOSURE OF / THESE ISSUES TO AVOID POTENTIAL SOFTWARE FAILURES EVIDENT IN THESE ROUTINES / DUE TO LACK OF PROPER DOCUMENTATION. DMIPORT,.-. /COMMUNICATIONS PORT INITIALIZE ROUTINE / ACCORDING TO THE DECMATE II MANUAL, THE FOLLOWING INSTRUCTION IS UNDEFINED. MPRESET /RESET MULTIPROTOCOL COMMUNICATIONS CONTROLLER CHIP / THE DECMATE III HAS AN INTERNAL MODEM OPTION WHICH IS NOT AVAILABLE IN THE / DECMATE II. THE INTERFACE TO THIS DEVICE IS APPARENTLY SHARED WITH THE MPSCC / MODEM INTERFACE WE NORMALLY USE, SO THE REGISTER ACCESS MUST BE MORE CAREFULLY / DEFINED. THE APPARENT DIFFERENTIATION IS THE CURRENT VALUE OF THE DATA FIELD, / NAMELY EITHER FIELD 0 OR 1. IT IS NOT KNOWN WHETHER THE THREE-BIT VALUE OF / THE DATA FIELD IS SIGNIFICENT (PRESUMABLY FOR FUTURE EXPANSION), OR MERELY THE / DATA FIELD'S LOW-ORDER BIT IS USED, AS ALL KNOWN EXAMPLES OF ALLEDGEDLY / FUNCTIONAL CODE USE APPROPRIATE CDF 00 AND CDF 10 ONLY. APPARENTLY THE MODEM / INTERFACE IS REFERRED TO AS "A" AND THE MPSCC INTERFACE IS REFERRED TO AS "B". TAD (030) /GET RESET VALUE CDF 00 /TALKING TO REGISTER 0A MPSCC /RESET COMMUNICATIONS CHIP CDF 10 /TALKING TO REGISTER 0B MPSCC /RESET COMMUNICATIONS CHIP / ACCORDING TO THE DECMATE II MANUAL, CONTROL REGISTER 2 "HAS NO RELEVANT / BITS... IF IT IS EVER WRITTEN, IT MUST BE WRITTEN WITH ALL ZEROS." APPARENTLY / THE MODEM INTERFACE DEMANDS A NON-ZERO VALUE BE WRITTEN TO REGISTER 2 / (PRESUMABLY TO DISABLE IT). TO SATISFY THE ABOVE REQUIREMENT (WHATEVER THIS / IMPLIES!), REGISTER 2(B) IS WRITTEN WITH ALL ZEROS *LAST* IN CASE THIS IS A / DECMATE II WHERE THE DATA FIELD CONSIDERATIONS ARE MEANINGLESS. CDF 00 /TALKING TO REGISTER 0A NL0002 /WANT REGISTER 2A MPSCC /SELECT IT TAD (020-2) /GET RESET VALUE MPSCC /LOAD IT CDF 10 /TALKING TO REGISTER 0B NL0002 /WANT REGISTER 2B MPSCC /SELECT IT NL0000 /GET RESET VALUE (000) MPSCC /LOAD IT / THE K278 CODE DOES NOT HAVE SETUP CODE FOR REGISTER 4B, PRESUMABLY BECAUSE THE / CODE PERFORMS A PANEL REQUEST (PRQ3) WHICH SETS UP THE EQUIVALENT VALUES FOR / ASYNCHRONOUS OPERATION WITH ONE STOP BIT AND NO PARITY. IT IS NOT KNOWN IF / THE DECMATE III EVEN *HAS* A REGISTER 4B, BUT PRESUMABLY IT IS AVAILABLE FOR / LOADING THE RIGHT VALUES COMPATIBLE WITH THE DECMATE II, OR ATTEMPTING TO LOAD / IT IS INNOCUOUS. CDF 00 /TALKING TO REGISTER 0A NL0004 /WANT REGISTER 4A MPSCC /SELECT IT TAD (104-4) /SETUP FOR ASYNCHRONOUS, ONE STOP BIT, NO PARITY MPSCC /LOAD IT CDF 10 /TALKING TO REGISTER 0B NL0004 /WANT REGISTER 4B MPSCC /SELECT IT TAD (104-4) /SETUP FOR ASYNCHRONOUS, ONE STOP BIT, NO PARITY MPSCC /LOAD IT / THE DOCUMENTED VALUES (FOR DECMATE II) REGARDING CONTROL REGISTER 1 INDICATE / THE PROPER VALUE OF 022, WHERE BIT[9] IS DEFINED AS A ZERO. THE VALUE OF 026 / IS TAKEN FROM K278 WHERE PRESUMABLY THE EXTRA BIT IS NECESSARY FOR SOME / DECMATE III OBSCURITY. / THE FOLLOWING CODE IS REDUNDANT FOR LOADING REGISTER 0A BEFORE AND AFTER / LOADING REGISTER 0B. THIS IS EITHER A MISTAKE OR OBSCURELY NECESSARY (TAKEN / FROM K278). CDF 00 /TALKING TO REGISTER 0A NL0001 /WANT REGISTER 1A MPSCC /SELECT IT TAD (026-1) /GET SETUP VALUE MPSCC /LOAD IT CDF 10 /TALKING TO REGISTER 0B NL0001 /WANT REGISTER 1B MPSCC /SELECT IT TAD (026-1) /GET SETUP VALUE MPSCC /LOAD IT CDF 00 /TALKING TO REGISTER 0A NL0001 /WANT REGISTER 1A MPSCC /SELECT IT TAD (026-1) /GET SETUP VALUE MPSCC /LOAD IT / THE DECMATE III INTERNAL MODEM IS PROBABLY ASYNCHRONOUS 8 BIT ONLY. ASSUMING / THE RECEIVE SIDE OF THE INTERNAL MODEM IS ALWAYS "ENABLED", REGISTER 3A WOULD / BE UNNECESSARY. THE K278 CODE DOES NOT ADDRESS REGISTER 3 AS AN A/B PAIR, / PRESUMABLY BECAUSE REGISTER 3 IS NOT DECODED AND IS EFFECTIVELY REGISTER 3B / REGARDLESS OF THE DATA FIELD. THIS IS EITHER TRUE, OR THE K278 CODING FAILS / TO PROPERLY INITIALIZE THE DECMATE III MPSCC PORT. NL0003 /WANT REGISTER 3 MPSCC /SELECT IT TAD (301-3) /SETUP FOR 8 BITS AND ENABLE RECIVER MPSCC /LOAD IT / A SIMILAR SITUATION EXISTS FOR THE TRANSMITTER SIDE OF THE DECMATE III / INTERNAL MODEM. REGISTER 5 IS UTILIZED ACCORDINGLY. TAD (5-301) /WANT REGISTER 5 MPSCC /SELECT IT TAD (150-5) /GET TRANSMITTER ENABLE, 8 BITS VALUE MPSCC /LOAD IT / THE DECMATE II REFERENCE MANUAL INDICATES THE PROPER SETTING FOR THE MODEM / CONTROL REGISTER AS EITHER 030 OR 130 DEPENDING ON WHETHER BIT[5] INDICATES / INTERNAL OR EXTERNAL TIMING (WHERE ONE OF THESE IS ILLEGAL FOR ASYNCHRONOUS / OPERATION!). THE SETTING OF BITS [10] AND [11] WOULD INDICATE ENABLING OF / BOTH LOCAL AND REMOTE LOOPBACKS, YET WE SET ONLY THESE BITS (ALA K278) / ALLEDGEDLY FOR THE PURPOSE OF SETTING RTS AND DTR (WHICH ARE DOCUMENTED AS / BEING BITS[7] AND [8] RESPECTIVELY). NL0003 /SET VALUE MLC /LOAD IT CLA /CLEAN UP / THE BAUD RATE SHOULD BE SET HERE IF DESIRED. / TAD BAUD /GET BAUD RATE / MSB /LOAD IT CLA /CLEAN UP JMP I DMIPORT /RETURN / DECMATE II, ETC. REPLACEMENT LIST. /048 CJL DM2LIST,CLDMZAP / *CLDMZAP DMINIT&177+JMSC /CLDMZAP,JMS DMINIT SETBAUD / *SETBAUD /050 CJL MSB /SETBAUD,MSB /050 CJL INLUP / *INLUP TAD INFLAG /INLUP, TAD INFLAG INSKIP / *INSKIP NOTYET&177+JMPC /INSKIP, JMP NOTYET INLUP1; DCA INFLAG /INLUP1, DCA INFLAG INREAD; IRB /INREAD, IRB INSTATUS / *INSTATUS UPSTATUS&177+JMSC /INSTATU,JMS UPSTATUS GETFL1 / *GETFL1 UPSTATUS&177+JMSC /GETFL1, JMS UPSTATUS COMWAIT / *COMWAIT GETFLOW&177+JMSC /COMWAIT,JMS GETFLOW NOWAIT / *NOWAIT TAD OUTFLAG /NOWAIT, TAD OUTFLAG CMOUT1; SNA CLA /CMOUT1, SNA CLA CMOUT2; OWAIT&177+JMPC /CMOUT2, JMP OWAIT DM1AND; DCA OUTFLAG /DM1AND, DCA OUTFLAG CMOUT3; OUTEMP&177+TADC /CMOUT3, TAD OUTEMP CMOUT4; OLS /CMOUT4, OLS BUFCHECK / *BUFCHECK PUPSTATUS&177+JMSIC /BUFCHEC,JMS I PUPSTATUS KERRLUP / *KERRLUP PUPSTATUS&177+JMSIC /KERRLUP,JMS I PUPSTATUS RINTEST / *RINTEST TAD INFLAG /RINTEST,TAD INFLAG RINGT0; SNA CLA /RINGT0, SNA CLA RINREAD;RINGNONE&177+JMPC /RINREAD,JMP RINGNONE RINGT1; DCA INFLAG /RINGT1, DCA INFLAG RINGT2; IRB /RINGT2, IRB REMTSF / *REMTSF RMPTEMP&177+DCAC /REMTSF, DCA RMPTEMP RMPUT0; TAD OUTFLAG /RMPUT0, TAD OUTFLAG REMTLS; SNA CLA /REMTLS, SNA CLA RMPUT1; REMPUT&177+JMPIC /RMPUT1, JMP I REMPUT REMCLEA;RMPTEMP&177+TADC /REMCLEA,TAD RMPTEMP RMPUT2; OLS /RMPUT2, OLS 0 /THIS ENDS THE LIST PAGE / DECMATE I REPLACEMENT LIST. /050 CJL DM1LIST,CLDMZAP / *CLDMZAP DMINIT&177+JMSC /CLDMZAP,JMS DMINIT SETBAUD / *SETBAUD NOP /SETBAUD,NOP DMI01 / *DMI01 DM234&177+TADC /DMI01, TAD DM234/(234) DMI02; WCON0 /DMI02, WCON0 DMI03; NL0000 /DMI03, NL0000 DMI04; RACD /DMI04, RACD DMI05; DMWASTE&177+ISZC /DMI05, ISZ DMWASTE DMI06; DMI05&177+JMPC /DMI06, JMP DMI05 DMI07; DMWASTE&177+ISZC /DMI07, ISZ DMWASTE DMI08; DMI07&177+JMPC /DMI08, JMP DMI07 DMI09; RTFL0 /DMI09, RTFL0 DMI10; DM2516&177+TADC /DMI10, TAD DM2516/(2516) DMI11; DMSEND&177+JMSC /DMI11, JMS DMSEND DMI12; TAD RATE /DMI12, TAD RATE DMI13; DM2460&177+TADC /DMI13, TAD DM2460/(2460) DMI14; DMSEND&177+JMSC /DMI14, JMS DMSEND DMI15; DM3425&177+TADC /DMI15, TAD DM3425/(3425) DMI16; DMSEND&177+JMSC /DMI16, JMS DMSEND DMI17; RKRB0 /DMI17, RKRB0 DMISET / *DMISET RTFL0 /DMISET, RTFL0 DMISKP / *DMISKP RTSF0 /DMISKP, RTSF0 DMIOUT / *DMIOUT RTLS0 /DMIOUT, RTLS0 INSKIP / *INSKIP RKSF0 /INSKIP, RKSF0 INREAD / *INREAD RKRB0 /INREAD, RKRB0 COMWAIT / *COMWAIT GETFLOW&177+JMSC /COMWAIT,JMS GETFLOW NOWAIT / *NOWAIT RTSF0 /NOWAIT, RTSF0 CMOUT1; OWAIT&177+JMPC /CMOUT1, JMP OWAIT DM1AND / *DM1AND AND377 /DM1AND, AND [377] CMOUT4 / *CMOUT4 RTLS0 /CMOUT4, RTLS0 RINTEST / *RINTEST RKSF0 /RINTEST,RKSF0 RINREAD / *RINREAD RKRB0 /RINREAD,RKRB0 RINGT1; SKP /RINGT1, SKP DM1AN2 / *DM1AN2 AND377 /DM1AN2, AND [377] REMTSF / *REMTSF RTSF0 /REMTSF, RTSF0 REMTLS / *REMTLS RTLS0 /REMTLS, RTLS0 0 /THIS ENDS THE LIST / DECMATE I SECONDARY REPLACEMENT LIST /050 CJL DM1SEC, DMI02 / *DMI02 WCON1 /DMI02, WCON1 DMI03; NL4000 /DMI03, NL4000 DMI09 / *DMI09 RTFL1 /DMI09, RTFL1 DMI17 / *DMI17 RKRB1 /DMI17, RKRB1 DMISET / *DMISET RTFL1 /DMISET, RTFL1 DMISKP / *DMISKP RTSF1 /DMISKP, RTSF1 DMIOUT / *DMIOUT RTLS1 /DMIOUT, RTLS1 INSKIP / *INSKIP RKSF1 /INSKIP, RKSF1 INREAD / *INREAD RKRB1 /INREAD, RKRB1 NOWAIT / *NOWAIT RTSF1 /NOWAIT, RTSF1 CMOUT4 / *CMOUT4 RTLS1 /CMOUT4, RTLS1 RINTEST / *RINTEST RKSF1 /RINTEST,RKSF1 RINREAD / *RINREAD RKRB1 /RINREAD,RKRB1 REMTSF / *REMTSF RTSF1 /REMTSF, RTSF1 REMTLS / *REMTLS RTLS1 /REMTLS, RTLS1 0 /THIS ENDS THE LIST / ONCE-ONLY TEXT MESSAGES. /024 CJL FIELD BUFFLD%10 /FILE I/O BUFFER FIELD *FILBUFFER /OVER FILE I/O BUFFER / LOCAL PREFERENCE MESSAGE. /024 CJL / USE SOMETHING APPROPRIATE HERE TO CUSTOMIZE KERMIT-12 TO YOUR MACHINE. / THIS LOCATION SHOULD BE MAINTAINED SINCE IT IS DOCUMENTED TO BE HERE. XLIST OFF IFZERO GENMSG < XLIST ON LCLMSG, *LCLMSG+40 /EMPTY HOLE FOR USER MESSAGE /039 CJL XLIST OFF > IFNZRO GENMSG < IFNZRO LEDERLE < XLIST ON LCLMSG, TEXT "%^T^HANKS TO: ^B^ILL ^S^MITH AND ^D^INGER ^M^ILLER%" XLIST OFF > IFNZRO UMSG < XLIST ON LCLMSG, TEXT "%^I^NSERT LOCAL USER MESSAGE HERE!%^" XLIST OFF > IFZERO LEDERLE!UMSG < XLIST ON LCLMSG, TEXT "^^^^^^^^^^^^^^^^^^^^^^"/DEFAULT IS NO MESSAGE XLIST OFF > IFNZRO LCLMSG+40-. < XLIST ON ZBLOCK LCLMSG+40-. /LEAVE PATCHING SPACE XLIST OFF > > XLIST ON CLOSMSG,TEXT "^]^" /CPU TYPE CLOSING MESSAGE / CPU IDENTIFICATION LIST; ALL MUST BE 5 WORDS LONG (EXCEPT LAST)./024 CJL CPULIST,TEXT "^U^NKNOWN" /00=UNKNOWN TEXT "^PDP^-5^^" /01=PDP-5 TEXT "^PDP^-8^^" /02=PDP-8 TEXT "^PDP^-8/S" /03=PDP-8/S TEXT "^LINC^-8^" /04=LINC-8 TEXT "^PDP^-8/I" /05=PDP-8/I TEXT "^PDP^-8/L" /06=PDP-8/L TEXT "^PDP^-12^" /07=PDP-12 TEXT "^PDP^-8/E" /10=PDP-8/E TEXT "^PDP^-8/A" /11=PDP-8/A TEXT "6100^^^^^" /12=6100 TEXT "6120^" /13=6120; LAST CAN BE SHORT! CPUTMSG,TEXT "%^[C^PU TYPE IS: " /CPU TYPE MESSAGE DAYMSG, DAY%12^66+DAY+6060 /DAY MESSAGE TEXT " " DMPOMSG,TEXT " ^[U^SING ^C^OMMUNICATIONS" /DECMATE PORT MESSAGE TEXT " ^P^ORT^]" DMPPMSG,TEXT " ^[U^SING ^P^RINTER ^P^ORT^]^" /DECMATE SERIAL PORT MESSAGE INITMSG,TEXT "%^PS/8 PS/12 OS/8 OS/12 " /INITIAL MESSAGE TEXT "OS/78 OS/278 K^ERMIT-12 ^V" INMSG2, VERSION%12^66+VERSION+6060 /VERSION DIGITS INMSG3, "^^100+REVISION /REVISION TEXT " " /END OF MESSAGE XLIST OFF IFZERO MONTH-1 < XLIST ON MONMSG, TEXT "^J^ANUARY ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-2 < XLIST ON MONMSG, TEXT "^F^EBRUARY " /MONTH MESSAGE XLIST OFF > IFZERO MONTH-3 < XLIST ON MONMSG, TEXT "^M^ARCH ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-4 < XLIST ON MONMSG, TEXT "^A^PRIL ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-5 < XLIST ON MONMSG, TEXT "^M^AY ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-6 < XLIST ON MONMSG, TEXT "^J^UNE " /MONTH MESSAGE XLIST OFF > IFZERO MONTH-7 < XLIST ON MONMSG, TEXT "^J^ULY " /MONTH MESSAGE XLIST OFF > IFZERO MONTH-10 < XLIST ON MONMSG, TEXT "^A^UGUST " /MONTH MESSAGE XLIST OFF > IFZERO MONTH-11 < XLIST ON MONMSG, TEXT "^S^EPTEMBER ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-12 < XLIST ON MONMSG, TEXT "^O^CTOBER ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-13 < XLIST ON MONMSG, TEXT "^N^OVEMBER " /MONTH MESSAGE XLIST OFF > IFZERO MONTH-14 < XLIST ON MONMSG, TEXT "^D^ECEMBER " /MONTH MESSAGE XLIST OFF > IFNZRO MONMSG+7-. < XLIST ON ZBLOCK MONMSG+7-. /EMPTY SPACE FOR ALIGNMENT XLIST OFF > XLIST ON THLPMSG,TEXT "%^T^YPE ^HELP<CR>^ FOR HELP%^" /TYPE HELP MESSAGE YEARMSG,TEXT "19" /YEAR MESSAGE YEAR%12^66+YEAR+6060 /YEAR DIGITS TEXT "^" /END OF MESSAGE / CPU-SPECIFIC PROMPT LIST. /024 CJL CPUPRMP,TEXT "??^>^^^" /UNKNOWN TEXT "5^>^^^^" /PDP-5 TEXT "8^>^^^^" /PDP-8 TEXT "8^/S>^^" /PDP-8/S TEXT "LINC-8>" /LINC-8 TEXT "8^/I>^^" /PDP-8/I TEXT "8^/L>^^" /PDP-8/L TEXT "12^>^^^" /PDP-12 TEXT "8^/E>^^" /PDP-8/E TEXT "8^/A>^^" /PDP-8/A TEXT "78^>^^^" /6100 TEXT "278^>^^" /6120 / CPU-SPECIFIC IDENTIFICATION LIST. /025 CJL CPUIDLS,TEXT "^U^NKNOWN" /UNKNOWN TEXT "^PDP^-5^^" /PDP-5 TEXT "^PDP^-8^^" /PDP-8 TEXT "^PDP^-8/S" /PDP-8/S TEXT "^LINC^-8^" /LINC-8 TEXT "^PDP^-8/I" /PDP-8/I TEXT "^PDP^-8/L" /PDP-8/L TEXT "^PDP^-12^" /PDP-12 TEXT "^PDP^-8/E" /PDP-8/E TEXT "^PDP^-8/A" /PDP-8/A TEXT "^VT^-78^^" /VT-78 TEXT "^DEC^MATE" /6120 FIELD MSGFLD%10 /MESSAGE FIELD *FLD1ADR /PERMANENT LOAD ADDRESS /046 CJL /TEXT MESSAGES LOAD HERE/046 CJL ABMSG, TEXT "%^F^ILE ^A^BORT%^" /FILE ABORT MESSAGE CMERMSG,TEXT "?^I^NVALID COMMAND^" /COMMAND ERROR MESSAGE CONNMSG,TEXT "%(^C^ONNECTING TO HOST, TYPE " /FIRST CONNECT MESSAGE CONTMSG,TEXT "^C^ONTROL-^" /CONTROL CHARACTER MESSAGE CON2MSG,TEXT " ^C^ TO RETURN TO ^" /BRIDGING CONNECT MESSAGE CON3MSG,TEXT ")%^" /FINAL CONNECT MESSAGE CPUMSG, ZBLOCK 5 /CPU ID MESSAGE GOES HERE /CRLF, TEXT "%" /<CR>, <LF> MESSAGE DNERMSG,TEXT "?^E^RROR IN DEVICE NAME" /DEVICE NAME ERROR MESSAGE DSFLMSG,TEXT "?^D^ISK FULL!" /DISK OUT OF ROOM ERROR MESSAGE FCLEMSG,TEXT "?^E^RROR CLOSING FILE" /FILE CLOSE ERROR MESSAGE FNERMSG, TEXT "?^E^RROR IN FILE NAME" /FILE NAME ERROR MESSAGE FRECMSG,TEXT "^R^ECEIVING FILE: ^" /RECEIVING FILE MESSAGE FSENMSG,TEXT "^S^ENDING FILE: ^" /SENDING FILE MESSAGE FSERMSG,TEXT "?^F^ILE NAME SYNTAX ERROR" /FILE NAME ERROR MESSAGE HELPMSG,TEXT "%^S^UPPORTED COMMANDS ARE:%%" /HELP MESSAGE TEXT "^CONNECT^ (TO REMOTE SYSTEM) %" TEXT "^SEND DEV:FILNAM.EX^ %" TEXT "^RECEIVE DEV:^ (FILENAME AND EXTENSION ^NOT^ ALLOWED)%" TEXT "^GET DEV:FILNAM.EX^%" TEXT "^FINISH^ (SERVER)%" TEXT "^EXIT^ (TO OPERATING SYSTEM) %" TEXT "^HELP^ (THIS MESSAGE)%" TEXT "%^E^SCAPE CHARACTER: " KERRMSG,TEXT "%^K^EYBOARD INPUT ERROR!%" /KEYBOARD ERROR MESSAGE CRLF= .-1 /<CR>, <LF> MESSAGE NOFINIS,TEXT "?^U^NABLE TO TELL HOST THAT " /FINISH ERROR MESSAGE TEXT "SESSION IS FINISHED" NOTFND, TEXT "?^U^NABLE TO LOCATE FILE^" /FILE NOT FOUND MESSAGE PRMTMSG,TEXT "^K^ERMIT-^" /STATIC PORTION OF PROMPT MESSAGE PROMID, ZBLOCK 23 /MODIFIED PORTION OF PROMPT MESSAGE RERRMSG,TEXT "?^R^ECEIVE FAILURE^" /GENERAL RECEIVE FAILURE MESSAGE RFLNMSG,TEXT "?^E^RROR IN RECEIVED FILE NAME"/RECEIVED NAME ERROR MESSAGE TEXT "^" RHFEMSG,TEXT "^U^NABLE TO RECEIVE - HANDLER" /HANDLER FETCH ERROR MESSAGE TEXT " ERROR^" RIDEMSG,TEXT "?^U^NABLE TO RECEIVE -" /DIRECTORY FULL ERROR MESSAGE TEXT " INSUFFICIENT DIRECTORY SPACE" RIERMSG,TEXT "%^R^EMOTE LINE INPUT ERROR!%^" /REMOTE LINE ERROR MESSAGE RPERMSG,TEXT "?^U^NABLE TO RECEIVE LATEST " /LATEST PACKET ERROR MESSAGE TEXT "PACKET^" SDERMSG,TEXT "?^U^NABLE TO SEND - DIRECTORY "/DIRECTORY INPUT ERROR MESSAGE TEXT "ERROR" SHFEMSG,TEXT "?^U^NABLE TO SEND - HANDLER " /HANDLER FETCH ERROR MESSAGE TEXT "ERROR" SNDEMSG,TEXT "?^U^NABLE TO SEND" /GENERAL SEND ERROR MESSAGE UPERMSG,TEXT "?^U^NABLE TO RECEIVE - DATA " /RECEIVED DATA ERROR MESSAGE TEXT "ERROR" $ /THAT'S ALL FOLK! |
> > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Date: Sat, 11 Jul 92 15:00:00 EDT From: Charles Lasner <lasner@watsun.cc.columbia.edu> Subject: A few more release files for Kermit-12 Now available are two new versions of K12DEC and K12ENC, which have a new feature for image transfer of an entire device optionally split into two parts. This comes at the request of a user, and was quite easy to add. As before, the sources document how to use the programs, etc. The new files have been installed in the regular places: BITNET/EARN Internet KERMSRV@CUVMA watsun.cc.columbia.edu Description K12MIT ANN kermit/d/k12mit.ann Announcement of KERMIT-12 K12MIT UPD kermit/d/k12mit.upd Release update (this) file K12ENB PAL kermit/d/k12enb.pal .BOO-format encoding program K12DEB PAL kermit/d/k12deb.pal .BOO-format decoding program K12MIT NOT kermit/d/k12mit.not Release notes file K12MIT DSK kermit/d/k12mit.dsk Description of RX02 diskettes ------------------------------ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 | / KERMIT-12 PATCH FILE XLIST OFF IFNDEF OFF <OFF= 1> IFNDEF ON <ON= 0> XLIST ON / INDEPENDENT SOURCE FILE TO ALLOW CUSTOMIZATION OF KERMIT-12. / LAST EDIT: 06-SEP-1990 11:00:00 CJL / THIS FILE IS PROVIDED TO USERS OF KERMIT-12 TO ALLOW CUSTOMIZED VERSIONS TO BE / LOCALLY CREATED WITHOUT MODIFYING THE MAIN SOURCE (K12MIT.PAL). / CREATING KERMIT-12 FROM THE STANDARD DISTRIBUTION (AND THIS FILE). / KERMIT-12 IS DISTRIBUTED IN SEVERAL FILES WHICH CAN BE USED TO CREATE A / RUNNING KERMIT-12 VIA SEVERAL METHODS. THE MOST DIRECT METHOD IS TO JUST / ASSEMBLE THE MAIN SOURCE (K12MIT.PAL) POSSIBLY AUGMENTED BY A HEADER FILE / CONTAINING CUSTOMIZING PARAMETERS (PARAM.PAL), OR TO MODIFY AND ASSEMBLE THE / MAIN SOURCE FILE TO PRODUCE A CUSTOMIZED RESULT. THIS ALSO ALLOWS FOR LOCAL / CHANGES TO THE SOURCE ITSELF IF NECESSARY. THE MAIN SOURCE FILE IS RATHER / LARGE AND MIGHT BE DIFFICULT TO ASSEMBLE, ETC. ON SMALL SYSTEMS. MOST USERS / OF KERMIT-12 WILL FIND THE STANDARD ASSEMBLY PARAMETERS SUITING THEIR LOCAL / REQUIREMENTS, AS MOST USER-PREFERENCE ITEMS ARE CUSTOMIZABLE VIA THIS METHOD. / THE USER OF A SMALLER SYSTEM IS ENCOURAGED TO ACQUIRE KERMIT-12 FROM A LARGER / SYSTEM VIA DIRECT MEDIA COPY; AN ACCURATE LISTING OF KERMIT-12 WITH LOCAL / CUSTOMIZATION COULD THEN BE AVAILABLE. / SINCE IT IS NOT ALWAYS POSSIBLE FOR SMALLER INDEPENDENT USERS TO ACQUIRE / KERMIT-12 FROM OTHER INSTALLATIONS, THIS FILE (K12PCH.PAL) WAS CREATED TO / HANDLE MOST PARAMETER SETTINGS. VIRTUALLY ALL OF THE USER-PREFERENCE / PARAMETERS, ETC. HAVE BEEN DUPLICATED HERE TO ALLOW INDEPENDENT ASSEMBLY OF / THIS FILE WHICH IS SMALL ENOUGH TO ALLOW ASSEMBLY ON MODEST SYSTEMS. / NOTE: USING THE METHOD DESCRIBED BELOW ASSUMES THAT ALL CHANGES REQUIRED BY / THE USER HAVE BEEN UPDATED WITHIN K12PCH.PAL (THIS FILE), OR PLACED IN A / SEPARATE FILE (PARAM.PAL). SEE THE ASSEMBLY PARAMETERS SECTION FOR ANY / CUSTOMIZING INFORMATION. / THE STANDARD DISTRIBUTION OF KERMIT-12 INCLUDES A CORE-IMAGE COPY OF K12MIT.SV / WITH ALL STANDARD DEFAULT VALUES SET. IT IS AVAILABLE AS K12MIT.ENC WHICH IS / A "PRINTABLE" ENCODED VERSION OF THE SAVE IMAGE. ASSEMBLING AND RUNNING THE / DECODING PROGRAM K12DEC.PAL CAN PRODUCE K12MIT.SV FROM K12MIT.ENC. / ASSUMING THE AVAILABILITY OF K12MIT.SV AND K12PCH.PAL ON THE DEFAULT DEVICE / DSK:, THE FOLLLOWING CAN BE USED TO CREATE THE RUNNING KERMIT-12: / .PAL K12PCH<PARAM,K12PCH/E/F/W ASSEMBLE CUSTOMIZED PATCH FILE. / .LOAD K12MIT.SV/I$K12PCH$ LOAD IMAGE FILE K12MIT.SV WITH /I SWITCH SET. / $ INDICATES USING <ESC> TO TERMINATE LINE. / K12PCH.BN IS LOADED OVER K12MIT TO PATCH THE / BINARY TO THE DESIRED LOCAL VERSION. / .SAVE DEV KERMIT=1 SAVE RUNNING VERSION ON ANY AVAILABLE DEVICE / DEV (PREFERABLY SYS). / .R KERMIT OR RUN DEV KERMIT RUNNING VERSION NOW CAN BE INVOKED. / ASSEMBLY PARAMETERS. / NOTE: EDIT NUMBERS PLACED ON VARIOUS SECTIONS OF THIS FILE REFER TO THE / CORRESPONDING EDIT NUMBERS WITHIN K12MIT.PAL. SEE THE K12MIT.PAL EDIT HISTORY / FOR FURTHER INFORMATION. / SEVERAL PARAMETERS MUST BE CHANGED WITHIN THIS FILE (K12PCH.PAL) (OR PASSED TO / THE ASSEMBLER VIA A SHORT FILE INSERTED INTO THE ASSEMBLY STREAM BEFORE THE / MAIN FILE): / SETTING KEY= [RECEIVE IOT CODE FOR CONSOLE KEYBOARD] DEFINES THE CONSOLE / KEYBOARD IOT CODE (DEFAULT IS 03). / SETTING TTY= [TRANSMIT IOT CODE FOR CONSOLE OUTPUT] CHANGES THE CONSOLE / PRINTER IOT CODE (DEFAULT IS 04). / THE FOLLOWING DEFINITIONS ARE ESSENTIALLY FOR KL8-TYPE DEVICES ONLY, AS THE / CODE DEMANDS KL8 HARDWARE COMPATIBILITY. MODELS OTHER THAN PDP-8 (SUCH AS / DECMATE) GENERALLY EITHER PLACE RESTRICTIONS ON AVAILABLE INTERFACES (OTHER / SOFTWARE DESIGNATES A SERIAL INTERFACE AS A LOGICAL PRINTER PORT; DECMATES / SUPPORT A FIRMWARE "PRINT SCREEN" KEY WHICH ENFORCES THIS.), OR DON'T ALLOW / USABLE PLUG-IN OPTIONS. / IGNORING BUILT-IN DECMATE SUPPORT, THE FOLLOWING PARAMETERS ARE ACTIVE: / SETTING DEV30= 1 CREATES DEVICE 30/31 REMOTE LINE IOTS. / SETTING DEV40= 1 CREATES DEVICE 40/41 REMOTE LINE IOTS. / SETTING LEDERLE=1 CREATES DEVICE 43/44 REMOTE LINE IOTS (AND A CUSTOM / HEADER). / SETTING ORIGNAL=1 CREATES DEVICE 33/34 REMOTE LINE IOTS (ORIGINAL / SETTINGS). / SETTING SPRINT= 1 CREATES DEVICE 32/33 REMOTE LINE IOTS (SERIAL PRINTER / PORT). / SETTING USER= 1 CREATES DEVICE XX/XY REMOTE LINE IOTS. / IF NONE OF THESE ARE SET, THEN DEV40=1 APPLIES BY DEFAULT. / SETTING USER= 1 REQUIRES THE USER TO DEFINE TWO ADDITIONAL VALUES: / XX= [RECEIVE IOT DEVICE CODE] (DEFAULT IS 40). / XY= [TRANSMIT IOT DEVICE CODE] (DEFAULT IS 41). / SETTING SPRINT= 1 INHIBITS THE BUILT-IN CHECK FOR DECMATE OPERATION AND / USES THE SERIAL PRINTER PORT FOUND ON ALL / WPS-8-CONFIGURED PDP-8/E, PDP-8/A CONFIGURATIONS, / VT-78, AND ALL DECMATES (VT-278, DECMATE II, III, / III+) FOR REMOTE COMMUNICATIONS. / THE USE OF THE SERIAL PRINTER PORT FOR REMOTE COMMUNICATIONS PURPOSES MAY BE / PROBLEMATIC DUE TO CONSIDERATIONS SUCH AS THE RS-232 CONNECTION TO THE PRINTER / IS A MODEM (DCE), RATHER THAN A TERMINAL (DTE) (DECMATE II, ETC. REQUIRES A / GENDER CHANGER.), OR THE SOFTWARE DESIGNATION OF THE PORT AS BEING ALLEDGEDLY / *ONLY* FOR A PRINTER, SUCH AS WHEN CERTAIN SYSTEMS SUPPORT THE "PRINT SCREEN" / KEY AS A SCREEN DUMP TO THE SERIAL PRINTER PORT, ETC. THESE ISSUES ARE NOT / RELEVANT TO KERMIT-12 OPERATION, AS THE "PRINT SCREEN" KEY IS NOT SUPPORTED BY / KERMIT-12 IN THIS CONFIGURATION AS SUCH (FUTURE VERSIONS COULD REDEFINE THE / "PRINT SCREEN" KEY TO SUCH FUNCTIONS AS DUMP SCREEN TO A FILE, ETC.). / SETTING BRATE= NN SETS THE DEFAULT BAUD RATE (FOR SYSTEMS THAT SUPPORT / THIS FEATURE) FROM A TABLE OF VALUES (0-15) AS / FOLLOWS: / NN BAUD RATE / 00 50 / 01 75 / 02 110 / 03 134.5 / 04 150 / 05 300 / 06 600 / 07 1200 / 08 1800 / 09 2000 / 10 2400 / 11 3600 / 12 4800 / 13 7200 / 14 9600 / 15 19200 / SETTING ESCAPE= NNNN SETS THE DEFAULT ESCAPE CHARACTER TO NNNN. / SETTING FLOW= 1 ENABLES FLOW-CONTROL BY DEFAULT. / SETTING FLOW= 0 DISABLES FLOW-CONTROL BY DEFAULT. / SETTING FMODE= 0177 SETS THE DEFAULT FILE MODE TO ASCII. / SETTING FMODE= 4377 SETS THE DEFAULT FILE MODE TO BINARY. / SETTING GENMSG= 0 CAUSES NO BINARY TO BE GENERATED WHERE 'LCLMSG' IS / DEFINED. THIS ALLOWS THE PARAMETER FILE (PARAM.PA) OR / SUBSEQUENT OVERLAY BY K12PCH.BN TO DEFINE THE LOCAL / HEADER MESSAGE. THIS PARAMETER SHOULD NOT BE SET / UNLESS ONE OF THESE METHODS IS USED, ELSE THE HEADER / MESSAGE WILL BE UNDEFINED. (NOTE: IF K12PCH.BN / GENERATES A HEADER MESSAGE, THEN THIS PARAMETER IS / UNIMPORTANT, AS K12PCH.BN OVERLAYS THE BINARY OF / K12MIT.) / SETTING GENMSG= 1 CAUSES A HEADER MESSAGE TO BE GENERATED. THE CONTENTS / OF THE MESSAGE ARE CREATED BY SETTING LEDERLE=1 OR / UMSG=1. IF EITHER IS ZERO, A DEFAULT (NULL) MESSAGE / WILL BE GENERATED. / SETTING ICLOSE= 1 ENSURES A <^Z> AT <EOF> OF ASCII INPUT FILES BY / DEFAULT. / SETTING ICLOSE= 0 CLOSES ASCII INPUT FILES AS RECEIVED BY DEFAULT. / SETTING INIECHO=0 CAUSES A FULL-DUPLEX CONNECT MODE STATE WITH NO LOCAL / CHARACTER ECHOING BY DEFAULT. / SETTING INIECHO=1 CAUSES A HALF-DUPLEX CONNECT MODE STATE WITH LOCAL / ECHO OF ALL CONSOLE CHARACTERS BY DEFAULT. / SETTING LOWER= 0 ALLOWS LOWER-CASE CONSOLE OUTPUT BY DEFAULT. / SETTING LOWER= -40 FOLDS LOWER-CASE CONSOLE OUTPUT TO UPPER-CASE BY / DEFAULT. / SETTING OCLOSE= 0 PREVENTS DEFAULT SENDING OF <^Z> AT <EOF> OF ASCII / FILES. / SETTING OCLOSE= 1 CAUSES <^Z> TO BE SENT AT <EOF> OF ASCII FILES BY / DEFAULT. / SETTING PORT= 0 CAUSES THE DP-278 PORT 0 TO BE USED IF KERMIT-12 IS / RUN ON A DECMATE 1 (ASSUMING SPRINT=0). / SETTING PORT= 1 CAUSES THE DP-278 PORT 1 TO BE USED IF KERMIT-12 IS / RUN ON A DECMATE 1 (ASSUMING SPRINT=0). / SETTING RETCNT= NNNN SETS THE PACKET RETRY COUNT TO NNNN BY DEFAULT. / SETTING UMSG= 0 PREVENTS THE LOCAL USER HEADER MESSAGE FROM BEING / GENERATED. / SETTING UMSG= 1 CAUSES THE LOCAL USER HEADER MESSAGE TO BE GENERATED. / THE PARAMETER GENMSG=1 IS REQUIRED TO BE SET. THE / SOURCE MUST BE MODIFIED LOCALLY TO CHANGE THE MESSAGE / TEXT FROM "INSERT LOCAL USER MESSAGE HERE!," AS THIS / IS THE DEFAULT CONTENTS. / PASSING SHORT PARAMETER FILES. / WHEN INSERTING A SHORT USER MODIFICATION FILE IN THE INPUT STREAM (PARAM.PAL) / THE FOLLOWING SHOULD BE NOTED: / ALWAYS PUT THE SHORT PARAMETER FILE (CONTAINING EQUATED SYMBOLS SUCH AS / USER=1, ETC.) IN FRONT OF K12PCH.PAL. / IF TTY: IS USED FOR DIRECT TYPE-IN OF THESE PARAMETERS, THE INFORMATION NEED / ONLY BE TYPED ENDING WITH <^Z> DURING PASS 1. SUBSEQUENT PASSES REQUIRE THE / ENDING <^Z> ONLY. IF THIS METHOD IS USED, A LISTING WITHOUT THE USER INPUT / WHICH DID THE CUSTOMIZING OF KERMIT-12 CAN BE CREATED. NOTE: IF BINARY IS / GENERATED BY THE CONTENTS OF THE PARAMETER FILE (SUCH AS USE OF THE LOCAL TEXT / MESSAGE, ETC.), THE INFORMATION MUST BE TYPED IN DURING PASS 2. THE PASS 3 / LISTING MAY CONTAIN THE INFORMATION IF SO DESIRED, REQUIRING A REPETITION OF / THE INPUT. PASS 1 INPUT OF THE INFORMATION IS EFFECTIVELY IGNORED, AS NO / DEFINITIONS ARE CREATED ('LCLMSG' IS DEFINED ELSEWHERE, ETC.). / EXPERIENCED PDP-8 USERS NEW TO PAL8 VERSION B0 TAKE SPECIAL NOTICE: / DUE TO HARDWARE LIMITATIONS OF THE DECMATES, THE KEYBOARD FLAG WILL BE CLEARED / DURING PDP-8 PAL8 B0 OPERATION. THE KL8E TTY: HANDLER WILL NO LONGER BE ABLE / TO BUFFER <^Z> DURING THE ASSEMBLY; YOU MUST WAIT UNTIL THE HANDLER ACCESSES / THE KEYBOARD ON EACH PASS *THEN* PRESS <^Z> TO CONTINUE THE ASSEMBLY. / CREATING A CUSTOM MESSAGE FROM THE PARAMETER FILE. / IF SO DESIRED, A CUSTOM LOCAL HEADER MESSAGE MAY BE ADDED BY INSERTING THE / FOLLOWING INTO THE PARAMETER FILE: / BUFFLD= 10 /THESE PROBABLY / FILBUFF=2000 /WON'T CHANGE! / GENMSG= 0 /DON'T GENERATE STANDARD (NULL) MESSAGE / UMSG= 0 /DON'T GENERATE STANDARD (DUMMY) USER MESSAGE / FIELD BUFFLD%10 /FIELD FOR TEXT MESSAGE / *FILBUFFER /LOCAL MESSAGE LOADS THERE /LCLMSG,TEXT "%^I^NSERT ^L^OCAL ^M^ESSAGE ^H^ERE!%" / ZBLOCK LCLMSG+40-. /ZERO REST OF MESSAGE AREA / TEXT IS IN UPPER/LOWER-CASE SIXBIT WITH '^' MEANING SHIFT CASE (INITIALLY / LOWER-CASE) AND '%' MEANING <CR>, <LF>. / MAINTAINING THIS PATCH FILE. / IF ANY CHANGES ARE MADE TO K12MIT.PAL ITSELF WHICH MIGHT AFFECT THIS FILE, THE / GLOBAL TECO MACRO (K12GLB.TEC AKA GLOBAL.TEC) SHOULD BE USED TO RESOLVE ALL / EXTERNAL REFERENCES TO ROUTINES, ETC. IN K12MIT.PAL. TO UPDATE THIS FILE / (K12PCH.PAL), THE FOLLOWING METHOD IS REQUIRED: / .PAL ,K12MIT<DEV:K12MIT/E/F/N/W CREATE "SYMBOLS" LISTING FILE ON DSK: / .MUNG K12GLB.TEC,K12PCH UPDATE THIS FILE ON DSK: / N.B., DSK:K12PCH.PAL WILL BE UPDATED *WITH NO BACKUP*. DSK:EQUATE.TMP WILL BE / CREATED AS AN ARTIFACT. IT CONTAINS THE ACTUAL EQUATE STATEMENTS WHICH WERE / UPDATED IN K12PCH.PAL. / THIS WILL MODIFY THE EQUATED SYMBOLS BELOW IN THE SPECIALLY DELIMITED AREA. / ONLY EQUATED SYMBOLS (AND ANY WHITESPACE) SHOULD BE PLACED BETWEEN THE SPECIAL / DELIMITERS: "<CR><LF>//" WHICH ARE USED BY THE MACRO TO LOCATE THE GLOBAL / EQUATES TO UPDATE. / AS NEW FEATURES ARE ADDED/(DELETED) IN K12MIT.PAL, THE APPROPRIATE DEFINITIONS / AND CONDITIONAL ASSEMBLY PARAMETERS SHOULD BE ADDED TO BOTH K12MIT.PAL AND / K12PCH.PAL FOR CONSISTENCY AND USER FLEXIBILITY. / DEFINITIONS. /017 CJL / REMOTE LINE PARAMETERS; SET ONLY ONE AS NECESSARY. /046 CJL IFNDEF DEV30 <DEV30= 0> /USE DEVICE 30/31 VALUES IFNDEF DEV40 <DEV40= 0> /USE DEVICE 40/41 VALUES IFNDEF LEDERLE <LEDERLE=0> /USE LEDERLE LABS VALUES IFNDEF ORIGNAL <ORIGNAL=0> /USE ORIGINAL VALUES IFNDEF SPRINT <SPRINT=0> /USE DEVICE 32/33 VALUES IFNDEF USER <USER= 0> /USE USER-DEFINED VALUES REMOTE= DEV30+DEV40+LEDERLE+ORIGNAL /SET REMOTE LINE IOT CODE REMOTE= REMOTE+SPRINT+USER /SET REMOTE LINE IOT CODE IFZERO REMOTE <DEV40= 1> /DEFAULT TO DEVICE 40/41 VERSION / DEV30 PARAMETERS. IFNZRO DEV30 < IFNDEF REC <REC= 30> /DEVICE 30 INPUT IFNDEF SEN <SEN= 31> /DEVICE 31 OUTPUT > / DEV40 PARAMETERS (DEFAULT). IFNZRO DEV40 < IFNDEF REC <REC= 40> /DEVICE 40 INPUT IFNDEF SEN <SEN= 41> /DEVICE 41 OUTPUT > / LEDERLE PARAMETERS. /038 CJL IFNZRO LEDERLE < IFNDEF REC <REC= 43> /DEVICE 43 INPUT IFNDEF SEN <SEN= 44> /DEVICE 44 OUTPUT IFNDEF GENMSG <GENMSG=1> /GENERATE LOCAL HEADER MESSAGE IFNDEF UMSG <UMSG= 0> /DON'T GENERATE USER MESSAGE > / ORIGNAL PARAMETERS. IFNZRO ORIGNAL < IFNDEF REC <REC= 33> /DEVICE 33 INPUT IFNDEF SEN <SEN= 34> /DEVICE 34 OUTPUT > / SPRINT PARAMETERS. /046 CJL IFNZRO SPRINT < IFNDEF REC <REC= 32> /DEVICE 32 INPUT IFNDEF SEN <SEN= 33> /DEVICE 33 OUTPUT > / USER PARAMETERS. IFNZRO USER < IFNDEF XX <XX= 40> /DEFAULT TO DEVICE 40 IFNDEF XY <XY= 41> /DEFAULT TO DEVICE 41 IFNDEF REC <REC= XX> /DEVICE XX INPUT IFNDEF SEN <SEN= XY> /DEVICE XY OUTPUT IFNDEF GENMSG <GENMSG=1> /GENERATE LOCAL HEADER MESSAGE IFNDEF UMSG <UMSG= 1> /GENERATE USER MESSAGE > / REMOTE LINE IOT DEFINITIONS. / RECEIVE DEFINITIONS. RKRBIOT=REC^10+6006 /READ REMOTE, CLEAR FLAG RKSFIOT=REC^10+6001 /SKIP ON REMOTE INPUT FLAG / TRANSMIT DEFINITIONS. RSBIOT= SEN^10+6003 /SET BAUD RATE FROM AC[8-11] RTLSIOT=SEN^10+6006 /TRANSMIT CHARACTER, CLEAR FLAG RTSFIOT=SEN^10+6001 /SKIP ON TRANSMIT FLAG / CONSOLE TTY: DEFINITIONS. /017 CJL / KEYBOARD DEFINITIONS. /017 CJL IFNDEF KEY <KEY= 03> /KEYBOARD DEVICE CODE KCCIOT= KEY^10+6002 /CLEAR CONSOLE KEYBOARD FLAG, AC KRBIOT= KEY^10+6006 /READ CONSOLE KEYBOARD BUFFER, CLEAR FLAG KRSIOT= KEY^10+6004 /READ CONSOLE KEYBOARD BUFFER STATIC KSFIOT= KEY^10+6001 /SKIP ON CONSOLE KEYBOARD FLAG / TELEPRINTER DEFINITIONS. /017 CJL IFNDEF TTY <TTY= 04> /TELEPRINTER DEVICE CODE TLSIOT= TTY^10+6006 /PRINT CHARACTER, CLEAR FLAG TSFIOT= TTY^10+6001 /SKIP ON TELEPRINTER FLAG / DEFAULT ESCAPE CHARACTER DEFINITION. /025 CJL IFNDEF ESCAPE <ESCAPE="]&37> /DEFAULT IS CONTROL-] / DEFAULT LOWER-CASE ENABLE DEFINITION. /030 CJL IFNDEF LOWER <LOWER= 0/-40> /LOWER-CASE IS ALLOWED AS IS /CHANGE TO -40 IF LOWER-CASE /SHOULD BE FOLDED TO UPPER-CASE / DEFAULT RETRY COUNT DEFINITION. /031 CJL IFNDEF RETCNT <RETCNT=5> /DEFAULT IS FIVE RETRIES / DEFAULT FILE MODE DEFINITION. /031 CJL IFNDEF FMODE <FMODE= 0177> /DEFAULT IS ASCII FILE MODE /4377 IS BINARY FILE MODE / DEFAULT FLOW-CONTROL MODE DEFINITION. /031 CJL IFNDEF FLOW <FLOW= 1> /DEFAULT IS FLOW-CONTROL ENABLED / DEFAULT ASCII INPUT FILE <^Z> DISPOSITION. /031 CJL IFNDEF ICLOSE <ICLOSE=1> /ENSURE <^Z> AT ASCII <EOF> / DEFAULT ASCII OUTPUT FILE <^Z> DISPOSITION. /031 CJL IFNDEF OCLOSE <OCLOSE=0> /<^Z> NOT SENT AT ASCII <EOF> / DEFAULT LOCAL MESSAGE GENERATION DEFINITIONS. /038 CJL IFNDEF GENMSG <GENMSG=1> /DEFAULT IS TO GENERATE A MESSAGE IFNDEF UMSG <UMSG= 0> /DEFAULT IS NO DUMMY USER MESSAGE IFNDEF LEDERLE <LEDERLE=0> /DEFAULT IS NO LEDERLE MESSAGE / THE NULL MESSAGE WILL BE GENERATED BY DEFAULT. / ECHO DEFINITION. /039 CJL IFNDEF INIECHO <INIECHO=0> /DEFUALT IS NO LOCAL ECHO / DEFAULT DECMATE I PORT DEFINITION. /050 CJL IFNDEF PORT <PORT= 0> /DEFAULT IS PORT ZERO / DEFAULT BAUD RATE DEFINITION. /050 CJL IFNDEF BRATE <BRATE= 7> /DEFAULT IS 1200 BAUD // GLOBAL EQUATED SYMBOLS FROM K12MIT.PAL. BUFFLD= 0010 /I/O BUFFER FIELD CMOUT4= 0712 /REMOTE OUTPUT WRITE CONTLS= 5701 /CONSOLE OUTPUT WRITE CONTSF= 5677 /CONSOLE OUTPUT TEST COUTINI=6601 /CONSOLE OUTPUT WRITE DAYMSG= 2145 /DAY MESSAGE DIRXR= 0012 /DIRECTORY AUTO-INDEX ECHOFLA=5153 /ECHO FLAG ESCHAR= 0101 /ESCAPE CHARACTER FILBUFF=2000 /FILE BUFFER FILMODE=0075 /INTERNAL FILE MODE FLAG FLOWFLA=0102 /FLOW CONTROL FLAG ICTLZFL=4033 /INPUT <^Z> FLAG INMSG2= 2242 /INITIAL MESSAGE INMSG3= 2243 /INITIAL MESSAGE INREAD= 0640 /REMOTE INPUT READ INSKIP= 0636 /REMOTE INPUT SKIP KCCZAP= 6501 /CONSOLE INPUT CLEAR KCCZP2= 6546 /CONSOLE INPUT CLEAR KGTEST= 5250 /CONSOLE INPUT TEST KGREAD= 5252 /CONSOLE INPUT READ KRSZAP= 6472 /CONSOLE KEYBOARD READ KSFLOC= 6470 /CONSOLE KEYBOARD SKIP LCLMSG= 2000 /LOCAL USER MESSAGE MONMSG= 2246 /MONTH MESSAGE MSGFLD= 0010 /TEXT MESSAGE FIELD NOWAIT= 0705 /REMOTE OUTPUT SKIP OCTLZFL=3762 /OUTPUT <^Z> FLAG PRGFLD= 0000 /PROGRAM FIELD P7TLS= 6540 /CONSOLE OUTPUT WRITE P7TSF= 6536 /CONSOLE OUTPUT TEST RATE= 0007 /BAUD RATE REMTLS= 5726 /REMOTE OUTPUT WRITE REMTSF= 5724 /REMOTE OUTPUT TEST RETRY= 0033 /RETRY COUNT RININIT=6613 /REMOTE INPUT READ RINREAD=5505 /REMOTE INPUT READ RINTEST=5503 /REMOTE INPUT TEST ROUTINI=6612 /REMOTE OUTPUT WRITE UPONLY= 0076 /UPPER-CASE ONLY FLAG YEARMSG=2274 /YEAR MESSAGE // END OF GLOBAL SYMBOLS FROM K12MIT.PAL / EQUATED SYMBOLS. NL7777= CLA CMA /LOAD AC WITH 7777 / STATIC DATE CALCULATIONS. /024 CJL / THESE EQUATIONS CAUSE PRINTABLE TEXT OF THE DATE PARTICULARS, WHICH ARE GIVEN / IN OS/8 INTERNAL FORMAT. PROGRAM MAINTAINENCE REQUIRES THE UPDATE OF VERSION, / REVISION, REVDATE, AND REVDGRP. REVDATE AND REVDGRP SHOULD BE OBTAINED FROM / THE SYSTEM WHEN RELEASING A NEW VERSION AFTER FIRST CORRECTLY INVOKING THE / SYSTEM DATE COMMAND. / VERSION=[ANY NUMBER IN THE RANGE 00-143 (DECIMAL 00-99)] / REVISIO=[ANY SIX-BIT ALPHA (A-Z); DO NOT FORGET &77] / REVDATE=[THE CONTENTS OF 17666 (DATE WORD)] / REVDGRP=[THE CONTENTS OF 07777 (ONLY BITS[3-4] ARE USED)] IFNDEF REVDATE <REVDATE=4464> /REVISION DATE (LOCATION 17666) IFNDEF REVDGRP <REVDGRP=0400> /REVISION 8 YEAR DATE GROUP (LOCATION 07777) IFNDEF REVISIO <REVISIO="G&77> /REVISION OF KERMIT-12 IFNDEF VERSION <VERSION=12> /VERSION OF KERMIT-12 DAY= REVDATE&370%10 /REVISION DAY DGROUP= REVDGRP&600%20 /REVISION DATE GROUP (WHICH 8 YEARS) MONTH= REVDATE&7400%400 /REVISION MONTH YEAR= REVDATE&7+DGROUP+106 /REVISION YEAR (SINCE 1900) / PATCHED LOCATIONS. FIELD PRGFLD%10 /OVER MAIN PROGRAM CODE *RATE /OVER BAUD RATE VALUE RATE, BRATE /BAUD RATE VALUE /050 CJL *RETRY /OVER PACKET ERROR RETRY COUNTER RETRY, -RETCNT /PACKET ERROR RETRY COUNTER /031 CJL *FILMODE /OVER INTERNAL FILE MODE FLAG FILMODE,FMODE /ASCII=0177, BINARY=4377 /019 CJL *UPONLY /OVER UPPER-CASE ONLY FLAG / UPPER-CASE ONLY FLAG. /023 CJL UPONLY, LOWER /0=UPPER/LOWER CASE, -40=UPPER-CASE ONLY/030 CJL *ESCHAR /OVER ESCAPE CHARACTER FOR CONNECT MODE / ESCAPE CHARACTER FOR CONNECT MODE. /025 CJL ESCHAR, ESCAPE /ESCAPE CHARACTER FOR CONNECT MODE /025 CJL *FLOWFLAG /OVER FLOW CONTROL FLAG / FLOW CONTROL FLAG. /026 CJL FLOWFLA,FLOW /0=NO FLOW CONTROL, NON-ZERO=FLOW /026 CJL /CONTROL VIA <^S>/<^Q> / I/O PATCHES. / REMOTE LINE (NON-CONNECT) PATCHES. / INPUT ROUTINE PATCHES. *INSKIP /OVER REMOTE INPUT SKIP INSKIP, RKSFIOT /FLAG UP YET? /049 CJL *INREAD /OVER REMOTE INPUT READ INREAD, RKRBIOT /GET THE CHARACTER /049 CJL / OUTPUT ROUTINE PATCHES. *NOWAIT /OVER REMOTE OUTPUT SKIP NOWAIT, RTSFIOT /OUTPUT FLAG UP? /049 CJL *CMOUT4 /OVER REMOTE OUTPUT WRITE CMOUT4, RTLSIOT /YES, OUTPUT THE CHARACTER NOW /049 CJL / INITIALIZATION PATCHES. *DIRXR /OVER DECMATE I PORT SELECT DIRXR, PORT /DECMATE I PORT SELECT VALUE /050 CJL *ROUTINITIALIZE /OVER REMOTE OUTPUT WRITE ROUTINI,RTLSIOT /INITIALIZE REMOTE OUTPUT /046 CJL *RININITIALIZE /OVER REMOTE INPUT READ RININIT,RKRBIOT /INITIALIZE REMOTE INPUT /046 CJL / CONSOLE (NON-CONNECT) PATCHES. / INPUT ROUTINE PATCHES. *KSFLOC /OVER CONSOLE INPUT ROUTINE KSFLOC, KSFIOT /SKIP ON KEYBOARD FLAG /023 CJL *KRSZAP /OVER CONSOLE INPUT ROUTINE KRSZAP, KRSIOT /READ KEYBOARD BUFFER /023 CJL *KCCZAP /OVER CONSOLE INPUT ROUTINE KCCZAP, KCCIOT /CLEAR KEYBOARD FLAG /023 CJL *KCCZP2 /OVER CONSOLE INPUT ROUTINE KCCZP2, KCCIOT /CLEAR KEYBOARD FLAG, AC /023 CJL / OUTPUT ROUTINE PATCHES. *P7TSF /OVER CONSOLE OUTPUT ROUTINE P7TSF, TSFIOT /TEST IF OUTPUT READY /023 CJL *P7TLS /OVER CONSOLE OUTPUT ROUTINE P7TLS, TLSIOT /OUTPUT THE CHARACTER /023 CJL / INITIALIZATION PATCH. *COUTINIALIZE /OVER CONSOLE INITIALIZE COUTINI,TLSIOT /INITIALIZE CONSOLE OUTPUT FLAG /046 CJL / CONNECT ROUTINE PATCHES. *KGTEST /OVER KEYBOARD TEST KGTEST, KSFIOT /SKIP ON KEYBOARD FLAG /047 CJL *KGREAD /OVER KEYBOARD READ KGREAD, KRBIOT /READ KEYBOARD BUFFER, CLEAR FLAG /047 CJL *CONTSF /OVER CONSOLE OUTPUT TEST CONTSF, TSFIOT /SKIP ON CONSOLE OUTPUT FLAG /047 CJL *CONTLS /OVER CONSOLE OUTPUT WRITE CONTLS, TLSIOT /OUTPUT TO CONSOLE /047 CJL *RINTEST /OVER REMOTE TEST RINTEST,RKSFIOT /SKIP ON REMOTE INPUT FLAG /047 CJL *RINREAD /OVER REMOTE READ RINREAD,RKRBIOT /READ REMOTE CHARACTER /047 CJL *REMTSF /OVER REMOTE OUTPUT TEST REMTSF, RTSFIOT /SKIP ON REMOTE OUTPUT FLAG /047 CJL *REMTLS /OVER REMOTE OUTPUT WRITE REMTLS, RTLSIOT /OUTPUT TO REMOTE /047 CJL / ADDITIONAL PATCHES. *OCTLZFLAG /OVER ASCII OUTPUT FILE <^Z> FLAG / ASCII FILE MODE <^Z> OUTPUT DISPOSITION FLAG. OCTLZFL,OCLOSE /ZERO=DON'T SEND <^Z> AT <EOF>, /NON-ZERO=SEND <^Z> AT <EOF> *ICTLZFLAG /OVER ASCII INPUT FILE <^Z> FLAG / ASCII FILE MODE <^Z> INPUT DISPOSITION FLAG. ICTLZFL,ICLOSE /ZERO=DON'T ENSURE <^Z> IN FILE, NON-ZERO=PACK <^Z> /IF LAST CHARACTER WASN'T <^Z> *ECHOFLAG /OVER ECHO FLAG ECHOFLA,INIECHO /0=DON'T ECHO, NON-ZERO=ECHO / ONCE-ONLY TEXT MESSAGES. /024 CJL FIELD BUFFLD%10 /FILE I/O BUFFER FIELD *FILBUFFER /OVER FILE I/O BUFFER / LOCAL PREFERENCE MESSAGE. /024 CJL / USE SOMETHING APPROPRIATE HERE TO CUSTOMIZE KERMIT-12 TO YOUR MACHINE. / THIS LOCATION SHOULD BE MAINTAINED SINCE IT IS DOCUMENTED TO BE HERE. XLIST OFF IFZERO GENMSG < XLIST ON LCLMSG, *LCLMSG+40 /EMPTY HOLE FOR USER MESSAGE /039 CJL XLIST OFF > IFNZRO GENMSG < IFNZRO LEDERLE < XLIST ON LCLMSG, TEXT "%^T^HANKS TO: ^B^ILL ^S^MITH AND ^D^INGER ^M^ILLER%" XLIST OFF > IFNZRO UMSG < XLIST ON LCLMSG, TEXT "%^I^NSERT LOCAL USER MESSAGE HERE!%^" XLIST OFF > IFZERO LEDERLE!UMSG < XLIST ON LCLMSG, TEXT "^^^^^^^^^^^^^^^^^^^^^^"/DEFAULT IS NO MESSAGE XLIST OFF > IFNZRO LCLMSG+40-. < XLIST ON ZBLOCK LCLMSG+40-. /LEAVE PATCHING SPACE XLIST OFF > > XLIST ON *DAYMSG /OVER DAY OF THE MONTH MESSAGE DAYMSG, DAY%12^66+DAY+6060 /DAY MESSAGE *INMSG2 /OVER INITIAL MESSAGE INMSG2, VERSION%12^66+VERSION+6060 /VERSION DIGITS *INMSG3 /OVER INITIAL MESSAGE INMSG3, "^^100+REVISION /REVISION *MONMSG /OVER MONTH MESSAGE XLIST OFF IFZERO MONTH-1 < XLIST ON MONMSG, TEXT "^J^ANUARY ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-2 < XLIST ON MONMSG, TEXT "^F^EBRUARY " /MONTH MESSAGE XLIST OFF > IFZERO MONTH-3 < XLIST ON MONMSG, TEXT "^M^ARCH ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-4 < XLIST ON MONMSG, TEXT "^A^PRIL ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-5 < XLIST ON MONMSG, TEXT "^M^AY ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-6 < XLIST ON MONMSG, TEXT "^J^UNE " /MONTH MESSAGE XLIST OFF > IFZERO MONTH-7 < XLIST ON MONMSG, TEXT "^J^ULY " /MONTH MESSAGE XLIST OFF > IFZERO MONTH-10 < XLIST ON MONMSG, TEXT "^A^UGUST " /MONTH MESSAGE XLIST OFF > IFZERO MONTH-11 < XLIST ON MONMSG, TEXT "^S^EPTEMBER ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-12 < XLIST ON MONMSG, TEXT "^O^CTOBER ^" /MONTH MESSAGE XLIST OFF > IFZERO MONTH-13 < XLIST ON MONMSG, TEXT "^N^OVEMBER " /MONTH MESSAGE XLIST OFF > IFZERO MONTH-14 < XLIST ON MONMSG, TEXT "^D^ECEMBER " /MONTH MESSAGE XLIST OFF > IFNZRO MONMSG+7-. < XLIST ON ZBLOCK MONMSG+7-. /EMPTY SPACE FOR ALIGNMENT XLIST OFF > XLIST ON *YEARMSG /OVER YEAR MESSAGE YEARMSG,TEXT "19" /YEAR MESSAGE YEAR%12^66+YEAR+6060 /YEAR DIGITS / END OF PATCH FILE. $ /THAT'S ALL FOLK! |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | PAL8.SV oX?lP40400SA0<076Sh@:`@86RLm?QPZ?cXP21XH6RXb9c`j80PJ61XZ9`PJ60`85aP=9ch86QP_ 9B0k90P>60h83QP?21Xi8@PK?QP[7`PG70lj80PJ70l86SP161LZ2`PJ>04L3`PH70lj80\i6cTk 80PJ61Pl42\a:Ph86RLm?QPW?3\030hH5``>61PC>BX>;P0007Tl=`Dg9CHO4BQj~33clb0C`X :SlK30\n7`\;33T:>0P3?B<12c`O~~~~~ZR\0`30Y0~BLUD40;<4~ZcaDRV^XP~B[4ZP00X<~B LUH4068<~T1nHQ3810~C@08Q8nH`9FHU;bIk4994^>nJNZ8@40KX4N0Aj6hB4PH`;bIP<9@U8dB6 ojV00;0<\RRZ2f8:3F:b[8IJaBH02P<02`O5ZTZ1Wl\0@0kn2cJ\2f:\44km42nhAZkl2bJ\ARh4 \>:b0;0J\RSFeV;N2f8:2V8<6F:bfHH;3BIJWbH02P>b060;iCJb3BL0i@8<WgCGPJc50;0_nfT9 HCh@X2og2J=Q4N:PmoX9HChBZ2l2POcU0;00[`Qn8?c308h05`K`<>8H66n0ok8?3f8>X6kinBHG LBhH>2oaB:hG6bHK;bIk5i8I668J6f8Q5n:XkOXI32HK3BKn6I@IHBhJT2o46J;mV9nW]jXIHBhJ T2o46Z;mV9noX:hJ6RJbo:VP6^8JYfXJ32HG3BKn6Y8_H6WT3^8>3V8?6V9Q6n:HgoXG3bNP6^8? 6W815nJ;6Z813nLH3bNPnN;ih6hJ62H@lOZ>6Z;mV9ol`9h>5cH>63KiSTZ00;00~2aNGMWfSD 0?l3PBS?_lbVo\\Wc4X^2?gP`Ob2bl]dc?\RndH>1PC^`L5RB<7Rn\dVnL4V6:GjcDXn2P[^ZLf3 ZLf4X02Pn?LPn<\Wbl54ZObbbl]dm\\WmO@`BP[^`LaRll42`H><P02`bo9B@<;jlL\Tbl]d`Efc ~HDb2BZ@6Z~BD2TA]ZHZ0;X0mPO`P?lO]Sl08?d?901?[Al0[kH?3IX<0@2P~6SolaK<dkG0<n RJ\R~4P000~3P000~9h0<0~90@GCoTn0~8H000~6P@0@074;\000~7l0oaG_Y2j?4?VP00@30P DPokn_l0QOoof082I4;MP180\13H:??lSO0JRB1cT?=00:R0CHZ:>0Y]IJ_RkS5RP9mo90S0KoHH 1`20IfPbjX2PP07PH3ooa3R5?a206`J2Pk^0Q3>15NIoX;hDOf\0P0J1PVInjBJ3869mo`9Po_;m PbCKjJ?YjGAlo9VAP:96PN86P^86P>:jP8941^j1@2kJ62n[@:8X0OkI@6h_fB8Hf_:j\hX0@0kJ 62nk@:8_NfUj420XeoXQP>:P^__X4N0QPN:P^__X4^0QP^:P^_^:X;j:0;00P`J3ARh4Pn86Pn;Y jG;kX2nPPnJLP:00809iX2oZO;W[f:hPN68OX6kjnGEo_KZlOJmV6Z3[i_l0?0HlMbT4ON1f:2Tl OB1f:2V0MKUdLiUb799a>PHLL20k:F:PX?Y_>Y961>i^9bU]OY:`M:WoZiYb799g19j]5j9\Jb0L 769ZJIUX8bHS4cH<>6IWMKUV_YYU^YYT<YH8IOUe89;nX2o1f:iSO9UnHcWmHcWlHcT_HbTbHbUe LYT8<SH8;cH8o3L8oCL8OSLeiTXiIIX8Id\bjTYRm9Yk798Q7N:P4?;0m?YQY9`L7BKX4N084CIP Ii^2P@13Io\0APh61^j00;0O7d<P[oXYj2nJGj8O7f<XV_YNZ2nIGJ8XGI8XgISo7RKn7bHOoDVW 7jLNWTZP7^JO7jLO7dMO7bJP7^J7GZ8XaoXco28XcO[k:2o7nZ8PnO:Pb?XNQTYf82J5:kCAN:8O f6hO83JP7^J5:k8XaOX[7f@OGS8XaO[h:2o3mj:XX?k=0:3n2RH::3oM:;UOh7Z0m^;\mF8XHFTX Jl\05`9[M`W^kk\Od`CU0\3?jOlbm0oNP?Z?[cl0V@HFX2n0V;B=<JB=8JC`G8TaVD9N:2nDFj8W P9^PV>K`P8_o0?00<@;4Z2nJ5[:PV_^^<J9J<BK`<HCckZ8aaV8W<IB[FZ8al6Pald[48BhaFF8; =6H;:3o79jTdF2:P^_[5]bXh:02]8P;C8H:Xd?[69bTQdbS`l8RJ0;07kf;`mVKK1jKfl4<Xj_X7 @2oIP:k`mT8XeoYG9bWHenX7Eb8Wdi_jM?\0F`8WI98Wl9\0F0;`FF8;GF8;l7CkmZ\08P@QG6W1 P9208M30Q[Tg66n0_k8e<69Q=n:HP?\g;bK3<RJQEZUFEYT`HBh_V2ndNjT@_RTA_RTB_RUf:2TM b2RoHBh_;bHH]?XbVDYK:2Tg=DB?G:Tg@2k2RRZ?bHoaQenUo0l0~61@IJ1RH5ARh41NH512ia E`8X1YC<b:\0:@8Xo?[8n_XkBRh8En8X>Y9G:2TGb2PHX2mEERTLb2QOZ3oe=j9FE9Wj=j8PE_UK :2Tgf6\L@2iCnYX070IYJ98U5f9\8`HU8ChS8bC8T_XS9BMYZ9UYDY8U8f8Q9N?0W?XS9BMA5i@G K22PP?]YJ98U9F<CP6^Qdi3Ic@32c`3<d`29R@29R@29;`I08BhTnfY6Z>o74Z;HaoX@4FHBH6VP <>8`;f@T^DYo0;00~6X02Pd031c02h[@3F`P2`X02PcP3?X034`@3Da@2PX02Pd031a`35X000 ;`JG]GQ@:2UK:2T`HBh_V2n^XJX;NbT@^RX0S@V::\T50@B9ol<Xo_;ooG<Xo?;mng>1n\2XU?[i VWY?n2WgZ0nBmZN9nl>1mL2Pm?N9f\kkPAbXZ?ZalbN9l\>1n\2X\_[anCO`R7o_RGcbPCaFZ0o1 2Z<>b7Bi2j<?bGBmkZ?]k0;^Rgc[jY_bk_o4a02Pf@3If@2=~2ZZX0ZZX0ZXd0~3aHd00?T?0>`: ~3P800P800P800P800081>0?l]i[Wb2d\RXeOi9R2@2_PQP2:b4:@?4hToSX@?JolY`?kboO`W 385\N?]gJolYf=QRn_T2Z?Sgf<P_UoNRmTmbooZ@nJP_mDmbolROXoNRm?=kPHHS@T4CPA94@DXf CYEB0DLea@m4e8l3Q4=ARO;3PO70Z?3kRF_3X<Wjg=\W`=]4cl1:POg2o85lRX7>:P:@^o]?eLjR knigl66i9?2kP?c=O83_0@44>8h`3@1OQOo`f08TI=dQP00Q\=P?:?`o<4:IQ250Xh[k_l3^`geB _o1On>4CWoS_b83k[2Po[J`WRKG3PKK0Z;OgRKS3PKW0Z:Oj[24n[J0_VjjR[k1b\Jib\ZYiP022 8:\;3@Tg\j1:]:JK0;ZGoi1jQnoe8ZhZX2kR<BmR<3P_0:?o12D:Y0;`CT:0c191e\a3AY3_cLbc c\l2f]1RfmURg<e[okGk>88<CZn@]P3`h^=XoZP_dn:b9R7<fejRX=?kI=@Z~37Vc0oB0_hl2n Jg:i[k?<97@9HbFM6P2@:J^k`>G9YJ6l9A[I0?d?m5Kh5@00D<d6P2Poaj0_PLfbOZP?cBdR;LeR ojP_Vj>XcOhRX87kCC@VPGJbcJ=X=74PX9gjP@2`Y@9?`KjZcDH^1TkPbLTgcDX^2PS^C\X3b\]b YLYTc<=:O_dYc\>:b\TVb\e2b\ebNL0_=010X`2`0:D:~4J`;<o6;:bf:U@6k>MKU<hRYeni;T 889;Z2mliYkTOh\0m`KjnGT8m?[gkdZPmnKa8:;hO9WWn:Wgld[T0;2YIUZenEn0f;EfMomlf9hc WVR0NJ8XP?Yf8BhM]FIlWYRK7J:XUOXPZBR<<jIlZIRY<hIoHKUSS:X080;XUoXPBR99X0nN84:N 0;1m]@B`]Z98ZI]g]YJP]NJY0;00:@;0Oo_o0;3nX3nkAk8W9iTWK9;mX1o2oJ=n82oHdh:::\T4 ~3k`Zk0;00~6H@;\m6;@kRK\BB961^h6A^3@d2K@D2ke\2ofljT0P0\0R0oHo;950;00~2ndD[ i0oR:RIY9DbEAcEC0202A2P_X?nR`83kO?jIP7GY8?dR:?cknjP_YfJY`h2XLSRB=aaRB7FIP669 HjFZ:bP_W@6^:gaYVgbYMG:I6SET[f6YKacB6aMRJb4>6f\PZ;gjM1VB61]RnQVb61]RJPbFIfBi <Q9Rb1gk8?TR:=7jn:P_mmRnUWbY<^1:5adVHQ2B315R3A9R3QeR3hUZ5b4^7JP_ef6YI8VZP:ig 7JBg]KEgY`1`770P:?KjKRLYkdRakeCo;_XO5EbOhki002`6>1aV=H1RHa^F;<P_ob2boTX^X9Cj 11_VO2bD84\R:=ojoBP_h_bR@23_njP_nVJinD>i`:jXU1^RFZP_n66iHon[0202mb0_mR0_mB0_ m2P___>Rb;kjIJjK[Zi;8aARZ23bl\0_gB>RA4C^9AAR8bD2A23RlB<VO4>I`B>R7A]Rl2<V8b<f 8fFidgbY5mHZ7am3GZP_janS7GaYef6YHj2^8?Q[J51_B;c`0^\?=2<?V01gP3>@a`c`EC7gI3:F 4\0_Qf6YL3:TScFT:LP_Sf6YLa7Bb23bNJ0_ogFi8<P_obbbX?ok;QeRHbjBHfJI2;KjI3:FfQ3P Z;Gj7BP_0@SS;WEYWbbRHB`VP]R^0G;Y22hf21df76\P:=Sj8AORJjP?cabRoQbFbcPV?l1122Ok hgj27AdV;WdPZ=SjHGZJ;VhPX>?h76`P7A`V22<f8`2`7B0^ER0?jf6YJAfR7N=[0?d20d9R10=S JgL2Z0?g0`A4lgjRkZNoZ]NF7A`R721RodX^::;j1_kRB2S_X@B^oDP^::3j1?cRZ9ojnh>J=JP_ nZ2n=AaVnT6n0@7^1?W[71dPPQbR8B?V7B<TZX:Z7B4^n1bbMfj@71aR81gPn22omb0_mR0_0BS_ mD6b:?CklbP_g`6^:>_jl_5Bg2URj=CjgMQ:X=gVlR<fg2<[g]a2g]Aj0=P?:>dbZ>SjkB9T8BUR h5ciFm`Vd^fTm@6`0;`;08`0P0fP`X6ZM84?PI5fH:if`PG`1UD?080>?Z]0P80dE_nBoRUbh:7j EWZB32P?WofY3OdY3_dY3b4^5jP_XH>R:0nB8AORo5^B:82K0?\22_YR2oUR8giR2P]g8j]:3:A[ 06T9:;;kJ80V4f4^P>Lf6=?j6QMRJh03JX2Cn:@VGf<iGjAc755Y5jA4P>MDb@RSGh1bmj@VY;9k MG:I720^9^9ZB2VBh?Kg9]i:boHWO`2`ik8VOV4^J>Lf6;;kJ6XiJ?DbaA>T720`Dn1?0N53b8lX <6^K0304<70^@;P_oojc4?eS4OaS4V1YP02`14S^X_]2@9;jnZ<XXJ1^XZ<XMj6BEZ:FS`2`~3 ::?knD0_n?LRXbVb`7okmP2``<7V`blR`A1>mA0_]4J^m0TV`DH^1<oR`@9_[`2`02l2[`V340US 4@US4PUS7H5\a02`~cOR3lEC\PeNGo9M\?PX40P>H1obVD5SYV>b]V8SmV53iV<aEVGoib26eY OQ<VOVXYoGBi6BUR:?ckb?_kGjPoY5fR:5fB:5BILaJFnoZCnEai?\<X?l<XG?RICoNb2XU\JdH` 2Seb2PYgPOK325C^mXYl:PJ@~33=5SdBQ?beJYaGJR9`bBmOnI`n^dm82@020Plh6jfZFZlRLV lRPVJo4W[ZYZ01L6:J0_hQNb650^6U=9P1[VhXRgVmjTdnm5Qe?biXko^cMBBh0RW0PVSg0bY?KV O7FI;6<Y6f<Y76<YmV<YLQbB299JZPR?jaf621`f21\f22`f8?lR8?kbZ7cio@2`Z:Oj>BFLXCVi YJ7[0?H65f\P:>ojmoaRjfiR1a=Rn?MRMfRB8n]R8bDfn24^8bPoc?RV9B4nmZP_iRFTn<A:mgLY D_PV8b4nn<PofONRXJ2>hJ2^8`L`Z=GjX2?S8b=cjbDVmRDWjb4^9OLRZP2`m^]RZ_MVnn\V@@LV O[HZ~4iPl34mACedK<EoooWb:DMFUb89;nZ2n<^:QeQIYl:i8Q`>JP:n8[7682oO\[`2;0oO\P oR8XX_[lX2nUi:hP:n8[GfMlUY[oWb:DMFUV\9ZhZhYT79HB`2n:HJU`RZX0H@US8:;8Oo]l^9\0 ;`;k49894G894W897G89PGc00;0SX6h822H8nR;8g?XS22NP2>88cF_iAB\080;h@2kgT2oNgT\0 @`WVI[WVi[CV0;0PmR90mN:@kOC]6[0U2_16YORC[lSn2OI42?00_0Cc_K:P`_[0Jb1g_i8@_oHH _OAj2^h:`>:DeVT0P0\0^0[0Jb1gUY:FU69[A0jDJb0Q_>JE_RJnlcRn_SA>U0JnlcRn_SA>BPh: U>8:2^kcYXZm`4nHoj_o0O00~3S`on:E;Xc?[mF9;lFG;k=7KjeRJ9`L>1:<o^RZ`Z0I000Pn9 e\9[M`:PnOTf`2K1@C0PA_9J2^jo`FC1USK1_DJ1Q\[hlbQKlbSg0;1\mP^ijG6TKPN1g^OMMW;] lGEeLYTY:2n>j:mo>;8gOf;oGG8XoY\LMbT4ON3m8bHS;B8]8f8W799m9`Uo8kHM8BhM76907N8@ Z?XSXTZ08n;likRbLZTL5RIOOg\FZ2l1[n[W`8Yb798Q5n8H6BJPnn\H5b8L=FJm8J@Yh2o>8:;8 Oo]lbI[Whh[jF9;WFF8:ff[WfdZPinKM8:8:X7hNO6TP`2oFG:Uo:K:50:1e8994Z2oW8;;0ioCW 0;3alD\HW<of0?3Cc`5f:RJ2`73[f2808`J98l=6o`8S8f>1P<^9o\>12\j@E_;mZGbk^XBQ^lRj VDbk^XBA^lRjo4?k:0nZBZh8^^JjnR;0nO8P^_J9n<>1ml2Xm__em2OclROf4;oal;;_lG\1~2 k\dWP<gS087\kJ0_bbZRJjP_^gjb:[]T^bZ`;hm:_BPYD2PY]C66P02`Jc8VORPY<[Q:]HB`>BX> ;P0007Tl=`Dg9CHO4BQj0484_UBoF@3l`TXQ`oT__`A0Y@G`nSS`ol?hXnooRR[92Q<1`84^0XCb nXUlh84lAUKPX>Cg49CjiNHWRN33PGk0Z9cjjnLWRNS3P@K>`:CjjNYeRN33hJP?h^>cX;;jk><W [>=4^:a:PH[<PB[Y0W4<nm7jg]lY`=7jf=LWf]TWg=\We;Mbe]Egg]dWmOIbmoQbnM1kP659i^:; ZS3Y@SBIC`PhP;K^?II^RX3kX`3b=XY?Uk5GKDaWY27a8STI0M80AQ<C3M9@AP0@ePY2K;l^Al0^ G010~6oongo`2`C@3@~20E4LXkWaP548X@0SPNV<X`21QIo;XFlfRbkUX[b8T1EUXPV4X5?7TjT0 ZU<PTZT1ZU<:T[lYRU>IT=hXR^N<PbN[R>N5Pj<iXNO1P@MJYNO5P9@=PM5UPPfgYLMUPPV5X<>l P>A5ZjPmPP<0ViTgPgAGQIUhP>:7T<C;\GYHR<80l00008AP\N@[ZoNGX@0U3?ONX00Q3?A_X00T 3?2oXP0V3>ZlX@0P3>ONX00R3>FDZ0000]VlX@0H3mTUX00P3mI@XP1A3m>lX@1@3]<UX02P3]5e XP033<lUX0183lflX@0@3ldUX00X3l`UX0103lY@XP083lXiXP003<KTXP063:jJXP0:3ZjlX@06 3ZkNX0053:gNX0093:a:X00:3:ZiX0083:ONX02T3:?NX02D3:=:X02L3:1_X00<39kNX02<39^J XP083Y^lX@043V?NX00A361_X00D35boXP0F35?NX00B35>iX00@33jJXP043c^JXP003QE@XP00 3_:lT@0A3o8UT0113kfoTP243j[NT00I3:VoTP0L3:U:T00N3:2iT00M39[NT00H39Y_T00J37no VP0027m@VP002V32V`0015cTTP0035`6TP0135cNT00234i_T0013SCTTP023aONT00430nGT@24 3YLUR0001WblP@0@3W`UP00P3W^lP@103W\UP0203WSNP02237PUP00Q3W?NP021373NP00735eC P`023S>DR0000040P000P0380Yo9HZE<HZJ9K<N1?:FUM<NVA8O9XP6UiZG:9hXZb@_;1lU6<2S5 nXXZb@4000;9lhXZb@<0~2_@[<cGVOOR:@E_;Ce2ODB3hQd^8fP6BOcRNUcbNVd2N0bK=1Z0oA bK=6b@NQbjF0P;n1dlG?AeG@CUGcm5GelEE1P7bE@:8Q9^H_NfWX4>0PHO8@H6T_9TCIOj\0l0K` 2Rh:2^i\9`W`OB0Wi9\0X0kjngGloBOnN58Ol6^l_JZ?`O[]oW9Q>BK6RY[7?CHETfR90;V9T\>1 Z<n4:J@0XnZ50?2K7bIn9bTOUTZCn;mc5II0;N9CTiS1`Y8X`fF^RJbm_SNm_TBoZ4Z1a\W0ag>0 _>;4^g;5^WViD[U`K297QBn0m_mG^iD002Fo`eD0m2FPfo[jb3o[n[=8V>o[j[;YlIU5j>WPeZkT i2KU_dX2P?\0~6P@a@8Mf7@Pkhn?6?mol58`aBJ?hf2@3nl?o_3o00?\f0Pob0P:D0o`V8P8dQ oP_mX3olnb?D@2I0@3I08BkjoG>PV_Z9i<kinAM^:RJ1n\<>oF=6n>:Y3:;gX2n[mZ:ZZRJP3>J9 3<L<37L<3WBQPJceI2NP<>Kd32H<3BH<NS3cj7h<maOX3>7b37Ca`;h=lcL=mcL=lSL=7CK`39;_ X2njP:]Dgo>kVg]ooOoOFcHm7JkmgO:kWfYmoNl0G@De7igmkoN]i4[odY\00@:0Wh22P023ALl8 P@3oi_oJ^P\:``SaQel0~~~~~S |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | (REMARK Image File Created by PDP-8: 30-Aug-1990) (REMARK File Date: 23-Jan-1984) (FILE PAL8.SV) (REMARK File decodes to PAL8.SV Version B0. Taken from) (REMARK DECUS DM-101 OS/278 for DECmate II.) (REMARK Should work on any OS/8 family system.) (REMARK A recent assembler is required for assembly of) (REMARK the KERMIT-12 source programs; Version B0 is the) (REMARK latest version.) <VVM86204838022000V01381U0AS08CDD4SHUK613U0T1120Q66H2KCJQ7G90K211H8D14> <UG80640O0BT3017GFH1LSC34MP00970G0C81O0EU61GH4D146O84FLHG4FN10OSK3OI18> <403I0F06GJG8CA2S8BK20JHG0H1U086750UCG91CORME8I1843330O640IM0L81OOQQ9P> <3SSC07G1R2340S0BU1G8O6603JOL05O006067ICRN0K95UDJH38K0000063P3U80O7G9A> <MFPGPO5G3UOB0353I0S3101T28OGNSU00000X003UX000472GC0G601800X000B0SI5A0> <04MC00X000R5JP1AAD0T800X000BLB04K00C1800X000B0SI5C00CC800X000N41OUCG6> <0G000X000C4G722OHM61H549B2V5TI23I4VE59K9T021GGTQ012O8UT00IC4H30ONPC11> <G89A27A39VUS00010P2P6L8GBC2H0R2P6LGIQDH800C5001OB9HDALI0RJS00SG1VSO5M> <LGGB9B710BUV22LOSHHFOO5ILJI6S11B1EP000GQHCJDCBB6ROGBC2H0KO62365IDM90M> <O6IB9KV001GKQP000OBDP9B4S6G00N5E329VBBSG6U50032V7TJ17J1447Q1BRJ17J144> <FQ1BRJ17J144NQHS1CG6V5000012NVFR10HGV000062VNG4C31HSCBG0NVC3P0UO7EK0N> <PDU91FPOI33POLSF4G8BM3CGRCBSNM8BM34GOC6H1NOGI2VT8LR91IO623DGDJVI1I8CU> <C4GQV45C88CPVNSOL9TBE8CUC4GQV45C88D9VNSOLFVA08D63ALIJV7A08D63AL746J0O> <8BM1MFU46J2V5GESGGEC3H0SO7I3BJ146VPHBFI2TOFT811KS7I3BG1C5T8M8DE05OF46> <3GVQG2V5NPTO11KOCF22NHL3H1L7UVJ2FSTG1GSOBJ1PGO9UD8TE000000006SBNITJT3> <8001VVI0V52LVDJ1FSV5IPJIAS20FR30IVHUB9IPCOBTGVFI6S1N08R0IO7I85G9FKR6I> <V5M1U65AAF6U9BGAS2KAIF6OL56DL8000BS0USNOFIQCMJ0RL4NSFIQCMBR7PCVL1T74L> <O56O4MC1SPC330SGES0002SMBPF82M25SACMV5KPEU16N8000000000X000CIKP21AKQ0> <400X000B2K0IIARAKO001ENVC03HG3VV1DG3U0GFVL14U00AQ0FGLVTM03E9L80G0000X> <000373OVUDMBPKQSS0P8IALG0000000800000000100000000000X00037O0000000000> <X0003A0AD7VV0G000X00040O0000000000000O200002RH1C000000000000001VOFU6I> <UUGGUG07GJ8O00G021T9FVFVQU07OA3VIR1024P0TQA01005GVM1IHVU0HKGQ12FN6E8A> <8200H054Q25A72JDMP9U47N9CBS00VS29V06DS0O01R811JO687A180O0FGFC0VVHH0OA> <0VGG1GRN0LO6E03GJK1C5DNVQG62IRV00380Q0MG8JUDQB868G0FKNVUO1FSBUKGEMR7Q> <BUIJKPFIFSL4981P32G7G650N0CA08N8K0SH70CA0U80MQU65AM90F53G1DMF408NIR7O> <O5MKBLAPG03I05MNHHATI81HFIUP7K08F52MNS8981UGBNBN804F22A0VK2TQTQ015OGI> <GBT0NELOLQGBH80000386A1U8RG450V0CA1NT4N95UVQ1QG6GEKS100008G2F7T0NQKNP> <BLUR1H04U31VQG7V9FPMVTBRAUFFMJ606NUNVJ001HS4F4NFO20FKJMIA13O1UIEQ98N0> <4NB5Q9EEBI47072OT23G3GCEP2JUGAK2BF4EN4DO22DQ97IR97TAO9EIFVLASN48E9EVG> <4LB91E9M0DDGS474ML5KID1H368R16O6672R7ITCMDAV9CMLQIP335S49CMBL481FTUGA> <O7MOIOSNODV9CCVTIOPVP5HI5UB34CKM75QPE8O8CCHGGONJ11VS623VQC47FP1LLPKJJ> <9IK12R78CLEL5HAUIBR477228EVK0GGVG5F95GSKGGSC7FEG08J11GHIO5ME210G7Q3MP> <O01P3E0RG6N0000GFJ3VP0LBP2JVKAJ8IVC7PHVSKAJ8IUVA59I9EP50ITIA4DQBVM3ON> <UC7Q1V7UQKTOV87L9TQG63QKVE7Q1USFIBTGVT831TA3IBRP8LHP36BUF52MD5UVIHB3I> <VBP05UFQ1B443QK64TJ21E2K5EMH4U31VRC33TH0T831TE2I5FP8LHB2MGFJ3SIUUA5CA> <BSF52M35TVQHQGAPK005VJ0KC5F52UTIA3LVBGEG0NMDR1FAOK9C718MQO008BGDEBNNR> <LUU0FKQF7500NSVVKG6BVKVNL80E7VLS00D691DUGBG14OL3A33A6K467GIN232ACIBRP> <8L515N4JRG3L0D64F1E0FVS0000132B2FL2SQ45NQ1EDALOHH4MJ333O466NJ5RJ32B39> <4T1HLAP5KOOOU11HLSPC9OGM64IPC2R38C5V52M7I9P389CFK2LQ5HDBE0S0505D48KD6> <8GVL2MG5HKIE8GOQE7GHS5PK0060SNFDS3FDBDM0T7M7S7IHBL20VQ0LMF80JO2URP8LL> <P5F4JUR2MN41P5F4JRQFVQMT0009DP4SJ4I9TV0002B1NG4MB0M9EN1D7GLUTVC00449H> <1IN4S220DG011NG4OCORV32S05FR3A8OEC4HNV65O08RM5SM3CCLA35B9AQAM4C7628NV> <J2LKIUP116V226DU44KRS9R950GTHI1BVPGI5THFU65B8GPAJ4IRIA23EGQQHUAS4DV40> <B1AHA4FVIAV3U3GKNVSX0005C195KO320NI6S130A82U0G3H4LSIGG3APIU80012JSKAV> <JU8LUH3NP5E10INIA13K9BP50GNHI11HUG2AMAM474CGDFVL2NL4DSLD5AAV8HNU84LC9> <DP51HNNM11PP09AENQ0031P5KID1H545O6OOHJ4NH148Q27V4AI8H3E9CMJ6K9D4IIC99> <27OGJ4NU0L7126SIPA50N45O6PUGBG2B94Q32ACIM2ES0J88D63CGPK621JOCO39GH449> <X1283CBP41OGM4INRSHNQHB3I2BUOLHR10O8M2AB0T8130OO45T14LEDNU0000000X000> <3180A0380O46C1E0AQ3B0O85G180A0370PS501H0C23A0OK50180A0380O4671H8A0006> <5TSNHD9514K2BE984C7628NVJ2LEL890N5TI22LQ004ORI59580580E8IFVV50NUFVPVR> <SK2VHVT7UU823TFL2KKFUD9K97PV07NVA594VRCH4VRP08FBUG7UJ49TMGVNI0VL2L85C> <BV7I4JUB411UNQHAP3U5VPFS7OGVNSH4VIP085DUKAO4OAE3ICHASJ1DOF9IDBQFN0TKN> <CFRM8N7LRTBVIVRGC8320K06P1M8DI26G005AX1AG413800000OK4D007VI00ATG00000> <80200G040X10048078080DVVV65E90M95VKEANI9G20851V2S048G11UI32FS913NO89L> <PVVU05VHFQVU61J41EU3VM9LPVTMO5M0FKBSVL1VO5M7SHABIUTVM4JSVU3T2V7T8FT94> <V7VVP2L35TRV9FPIG4S62GHK2I0K28Q1CIIKSAAJ05A79HA0U3A3HTC42GU8IFPCG47HV> <A5V1I4JDFT0LI9DOVDKO16R9JTC1I0IVLVSP0E8LQ0P58029EVVNBAIPPVFFRLV15GR4I> <VGP06VPPUFG001809JG2751NO0V18FUBC408J43N980400M3UO6A7VP4O9894408FQ7E5> <ENVM0BGP7QMVVU0FO7OF9VVSFP2S07B7IGAMNLJ497DE822RFL1TNP29RHI0GN7T8L9PQ> <POGILNT0L6PASUNIM1TH5BJR56L8G0G0085QMC6N155JL84R9EJ901TQFVT91U3LTSH2L> <BNA08N664HF4C7JHS0FKC04K9FQ80189O229J0H4JB3PJI6V45SQF60POMFDMHD0RDIR5> <MSNJFVVEQG7342IJGAVUR001N2HOPFTUKBQCN2O9M23BDIBRT0NKP69BA00000O7G6OBU> <V42V3TG5MN5PCLV5J094N95HT4M8Q005IJELSO2F5N9EA3KIP3800VVFV91B02K000K3C> <QE0F50M7V85O2B6GFRT85J92QOMIPKNVVA59N2HIPKNUV85O296M6IS14TJCR2HI6G3HV> <859RE0G0155U0LC3AV2PNI6S1G4SF4NP4MDSIN0LO409OUAFIHCMQIKP96CLGP7T7UOPQ> <M35IJCIJ52PLUA5J97JV046G00N8O0000AKK00000009LMPGNSDIHCMQIU82UEIT94PBH> <9EKNRHP12095VL2BSTPKE9DVG01NNFUKVJS4AUH7NLRVA0RRQU4H0JU4NPBJPV17NLSTU> <8005L6J6BDFVJE05R3RMUTSNPRC66E4UL017JSKAG0JMS8B1QQQPFI4UL6P1RUKAIKH0H> <AD8OOPPFI59HAB37DVPC6J3L30008GFT2KN4814K14VK14U485PS000FL5LLC1BD54BL6> <BNDDNA0QQRL4000012JV0BFUVV001VTUGBNCI7XI9O34R0VRUGAO8VT4VNI13C2QF4AIA> <G0800002NFNEO000000000000009GMTGNK5K3ESBM297I6S1N0C132Q1MG5K750BQVM2N> <MJSO01E0003S8NM1FPD2G0000001FND2USGGFCAKID4IL9HA76D8008G28JP8L81FVV0B> <G2BSJVN815QI40NTUA5VOBTVL2L7IPLC7209E8HOCDP1P549EM40IOD67AII5FP8L7F02> <OLPFIKRIV4NB5P6391LLBSM3LNI3HGR45O6NOGI3C3BVA5BR5Q235GO46TVK8CM30GRIQ> <J0PDJPCHHI44NSHCEI40NPUA5D2BSFL2VNTM59D5U46AN045R1R5H221GC44B0Q8961OG> <TC3T8I8BU44GTVA5DF5GQCIK9F03QTCENKHTLFDBQE0023G3GUA5FC9N94UVF2I7UVTA1> <5RVQI5FLOJHGNO00CB33GOE66KK0IOR1M8MFP2VV481FTP5FK2KKS131N5U45GH04IVIH> <BFIVNP8LOHFPP0F40NRVA5VL5JBV6A3LG4ATAA23CIQVA5VH5GQCEVV00120BRV40NMU8> <1FBSG2UJP8LFHF7V4ANQB5NBIATEN64CGKVA120BPFO2MT48V49P264KGK08P2BP2240N> <HC8SNP51QO4H3C791MBO64CP3C8TI75IQQEBS45TDCGFJ3SIUVA5EMCFM3MBSLLSM39HU> <K1H0NU36HT8F905S00NUM0QF4DSOE04O00PVOS0CULBJ35I668GIVG58F5GQE11IL3Q3A> <8KVP2KFIOEN688VP0H04UFQ1FVPEKH0VI5VU8MFK2VVCBH1R5HI5QB3IPNGHAR9CHHITM> <G11UKAMKGTUA702C465QBLL7P2O9GM5IK2TM7035P311HE6231Q8E0DFP8LM7228BGDFT> <8LJP1P7V63GMBCE23U70F12P7HOP7S8EM3KHE0VFQHBC9C6JQ4BG6TUG8SCGS0R11QOE3> <11H3M8O008EU402MU85EN5GQD4GTC7DU6002VLG34GJ08C1GDCJNVA3G6G1K0INJ4VLUT> <UJPL9MN4791OOE240NVSINIHAHE0ONUSI7IHAGU0GNTSI7IHAGE0GNSVA59V7TQGCHLVA> <5VLQG66LGSNUN43O0U07G4NU91O0EQG8GSS8B268EK4ELAL0H1ROGRV0GSITO6SOE23JH> <007DVHSG2UVP05TNI1O0V52VL4GFIHFQ2UFP8LNV03SKATDFI5SBDO8KVT2MK9NDDHQG6> <RKVIC8PDPCHKROMSFNLD800FR0P85RFQHBK6TL12C892JVG9BGIRDN5D4JMRUK01005RO> <000HIK003DC5A0GEJS1F0B92TG6LRU20180DTAG03K08FGAME04G2AM5VRVS8KVS2L1IL> <H7K06F52KVJV90R7UI1QFT43V228BVL2L150SIG87U44GNJV15N4KBG0005UR0KBT61CN> <PC8P7SS571D13LAR0PEI002B9UA5R49K6G0GJSO9O0RJV32MJC6H1E1LJG2BA701FGQI3> <BUB3ENPQ8OE9A50N992O0JJQP4O8ENP80BRMKHT4NCKNB5P23JH0C9LE554257V0FTI2D> <BF2PDVMMVO00BJMM8JUSO9MGRJV32TI6Q4MKDK2UMM584PHO0G4AFV0809U2B48HU9GMQ> <O00GO263JG4G7RHFVJVPGG7VB12FU62AB0N0001O2E91525UVK1A92VA53D8FA0AH8KEB> <N58CLCQHBHS0000001SKBKCNPUG1FGBRRKCH9VG5NVFR003M0DG9C68NKO7GG5TFH1AQE> <8ONKC29C3P3E0GMFDGFG5ENG00004BSAUC4M20O9C49GIO9315GTP0DS80000000X0010> <UVM209AG7FULVP82BVDGG841100UD7VK55GMCEJ3MOLM49HVC533SOPM2LQV5VJ0H5MIF> <PGJ4VKMLFUPEHGP4AFIHFUFP2VR6NVQHAI2BM984NCIH5A9EDGMJUPVKVSPBGHUHGP3V3> <1PBIFOMJPFEO5CH4RB0HJGK8UN19OAP09VDO4EAHVMP2KIK0300000C31T2J8V52MBILL> <CA9R94SGCJTCVVF1KTEFK101000GBUEK1LMLAABP64SNICA16MVOMLQLA0031E8KVK2V2> <45P1HP843AAJT031LFH7H2KR9NID6NNVGSIJVPNOSMTI6SIB5019OO43HSJGT93FD5U9E> <KHCIOP1N5HI3IB35TKM75P23H88L4KALS48TDGT6231OC463CO8CB120BVV40NUVA4NPF> <UG03T8L9SJJGIRK69PT9DQ2006UOGN0QVIHBNMUSNSDQP6SO3I2DNO5TSNE9K64CNB68R> <2ABSE44P3UA5CORS34NH15TNQHBJ44L7OLH1FF5RIA9NO68V22FSFP2MP5TSA3QGAS7L0> <68O0FUKAQNL068RI6CHITDH55TJIABLU44H55TTQK006UONBDAJFEBTMTCI1C1P7TAR00> <000007UDK1K2D2JDLVSPTBIVSKVD54NB5P240NUVA58P2S9EMK5IV12NOGMO3L04AR2M8> <EF0AVT4APC1V0BVKH05VNIHAH2VJT0L9FE9OG25DHBENSNPAB2VSKVD54NB5JAM25OLAS> <M8OE22BU0L2KM39OAH800IOD668GFP2RVIV5RG0025UFR443GI88N14GIE291QS4SG6U0> <00327QG211G8421FLV4ARGH3E27A084612UD5UDKA00240NOSG1FFU84RQUU004K7FJ9C> <QV69PLUC00240NMSG1FBU84TMVD06NIA05F8Q55P4SAVVV617Q402000IUBUCLTV85C4B> <00DEBN5FVH0QVV315TSUN0LO52O1KKJLG01E0002LO5G06N5RIIPKM5506NP22IG3BS8B> <BOAAMNOTUHSPRSIV09PKK7FKF6EV4NO2ESIN0KAAE1BGAHSTACIUVO2KONVVVU00G0000> <007OUNV257V8LJ4VQ9C7VGIPFUR38BT6QR497GE83SKATR4AIAG0200F0B495LG6M9RVK> <2FP4DJC0F0G87P04HN5LO56NT617GB9CJ0MNN41L1HFH3PIBE7JNTO001MBUPTP3Q8A8T> <NEG5UUFN97CVMLU6BLISH2JSKAHRV8MVP3GORIFTVV4NCIHFV23IBNS107QBUM4CH34BB> <2Q8HP4SGS0VCIFDVM4CGTS8B1Q8EE80GTU45AGGHQKBK048TVP3JQMABI4731CTFRFSGM> <VA703ANOSUM0ISH1POGI2SGOC6FA1FTI30GNC733BAUK44H9VO5CS8GFP2RVIV5CJ3JQS> <EFQ4M3EE9CM1AMR9PTDNQG6SUMT483GLQG63QBS487S1BB9BIRV4AD8A009EKH04H7QHF> <JI43U09PTUE004U6VHO67PPVR0006J3JP7COL7G8605QPDG0064F4968O4CBVM4CP3P0D> <O1I4JVR41S2NP09B7VN59HEQBLIGOND5QP6CBMITCI65R9EHVO3TV52LASIN0GQT2N8NQ> <VG1FJSG6NB497U6823RVL2VM5TBV8BPNUAVMU45V2BO7TUVH00800BN7PNK07JF01I0IT> <NT0LIP2K9LVL2TR4VJ2KITRNC1A8BT8UAUP50IGIA4BAOORG0004QR349V9511ILE5RA2> <2077HA0BG00C0CF4PNE18IBSR726H800245EVFAJQPO01C4552OFVP9FO09UIG0NVQ0E7> <VV31VKFVFP2KIK0512CM0T0FG4A27VB497O683P30ART0FP7H1AA2SLV6P29U1I0GFRT8> <L71EMVJSH4V8P0F0DV0AKHV9BQM8IFG0S7T8NOHU7UGAM8NCFOQAOJHKN2LCP0E8LQ0P5> <802OSFVNB8IRQEVVG5D2BC7QSMQFM9DOVDNQGLNFLJTABF7RLVL5TJVEBS7V6UG904M33> <JBSBLAIC4K54Q39U08T07BCOUUIRSAN07Q68046RSAB5RR2PMN9JT4288I54SG046I2HH> <H6K6GQ8A6002DC852DJLV4HVC0HE00000X0003NVRVVFVG03AD0000040AA4OSHE8F398> <H120028TEIE6801C1L7OSN1NR6QHE5PCRO24A2KJ5K288959JOUL9K04L68GAL6G1IKP0> <L2VQ56AJ16CDT8K8SSSCG9SAN3JJGML32ECEE70Q0TAQHPOCB2A11M6H4PD0QMROOSJ5K> <288B31GNIN4MHCAG8UP0EO0H69JF1Q5AU4P0U4U423ROGEBGUK5HV100000005O85GASI> <PBLTOPE00C4MNN1NG01GGQUG3F00629BO2NS00O9LEK6U00310LPODS00C4AN5H500080> <AR4DS007HHBCG4K00U85DC98003QHLKORO00EA2MJ09801QGAQ4JL00607B7G4K00UI5C> <Q6U003OGLJ82A00F52MC09801T0AP8IG007GHB527400O05CCBI00306LBH9K00E1ALE3> <F001O3ALO6U0060BAMGRO00O2DAO150030ALAGBI00C12L71NG01IIAKC6U00699AHG98> <00P75A01NG030CL7GDS00CHIKR56G01O4AJCDS007099HGRO00O4D601NG030KKN1BU00> <C2QIJ1NG01G9AAC5P006118V2J800U153MAD003G0K595000E02FI3F001S8PU815007K> <36UINS00V14QK3F0030PJA9BU00C3ID90IG01GF9K05P0061R6D0RO00O64PK1NG030QI> <VTBU00802BVKK001809C2U2002015E2SG00O04LO8300301IN0DS00C0AAE0RO01O0P6G> <N4007G54BGRO00O14GU6BG03K4H5S2A006023S3F001O88FG15007211THNG00SG47M0I> <G03K0GU0DS00CGA3O09801OGOEC6U006831O0RO00O1S5QD9G03G2GCS9800002010040> <000000M8D7PCIQII9HL6P29SFI0NKL559HQADA3IP7G1D99AAV5CHA9A02RSMF4G8RP8L> <HE8L4L00400U0HSJI59580300001AUNPIED57P7TU82AOMJFL1T9P4E44MICDI80AFNPO> <L5FJPACV8BG0U90GFQHF8JP426FIDA2N5RG3S0P0AT6N7L8TEGAJIV6NQ5ULFHEGE81AA> <I83H1C9J2V5TUT00GU8162O89C11F89LDJDVG01NG5S70LO5E183CI9PF01UP4UV4007A> <0VT5VCNSFVAVS9S63UVGLF5BRU7QO5VD5VH62OSPOQKA7HR3QOAOIES9I068IE9CG7T8L> <122JO0AKFS50019MOFIFQ9787T9DE9VV2BJC5F408MPAE4JJG9C4OK5OELEP29RQUV4NL> <5U9FTAHI0POPU07HV80AU7OGLRFHCRLESPA8JG4R14FU2VG3VMILQRM80501DVBGP00NQ> <FK2MR7UNSHFLJVBI8V65UMBL9T6FHSHCUHBGEQON4DP2EBAVV0AS0X0005P0EL1KGGGVI> <2VU0VHU7VUS05O8VL5PK06O09VVNV1VNG1V00QFNO1I1QG1C0004VV24DG011NVHVRUG2> <VGVR5L340D0680I0S8BVKFUVK2KQP2FE87SNV4JECAM82FT61OVTSHHFHAKI1GNNV85AM> <BR2L9LAT830PI4N1HOCE33GOG7AK7415TBM9QG660NKC310OO6J1G3QFSVEG467UVN823> <3V4G6BU7M063BV6C6NUSODFSHGQOEPU0GC5RVQ1ATBG3QK7NRRNEDVFVVT7NR5N8UU3NV> <T5NBBNAFUFNVT002LR4QT3VVTFRQARBI9VUUI00103200JS4210687T2G1041VVVUC3DB> <N80AHGQV3U3G0000X003UZMBS4DVVVVVVV> (END PAL8.SV) (REMARK End of File) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | / K12MIT PARAMETER FILE / KERMIT-12 CUSTOM PARAMETER FILE FOR VT-78. / LAST EDIT: 06-SEP-1990 11:00:00 CJL KEY= 03 /KEYBOARD RECEIVE IOT CODE TTY= 04 /CONSOLE TRANSMIT IOT CODE USER= 1 /USER XX/XY IOT CODES FOR REMOTE LINE XX= 30 /SLU2 RECEIVE IOT DEVICE CODE XY= 31 /SLU2 TRANSMIT IOT DEVICE CODE BRATE= 07 /USE 1200 BAUD ON SLU2 (FROM BAUD RATE TABLE) ESCAPE= 004 /USE <CNTRL/D> AS ESCAPE CHARACTER FLOW= 1 /FLOW CONTROL ENABLED FMODE= 0177 /ASCII FILE MODE (ONLY ONE THAT WORKS!) GENMSG= 0 /DON'T GENERATE LOCAL MESSAGE IN MAIN FILE /RATHER CREATE IT HERE IN THIS PARAMETER FILE ICLOSE= 1 /ENSURE A <^Z> AT <EOF> OF ASCII INPUT FILES INIECHO=0 /FULL-DUPLEX CONNECT MODE LOWER= 0 /ALLOW LOWER-CASE CONSOLE OUTPUT OCLOSE= 0 /<^Z> NOT SENT AT <EOF> OF ASCII FILES RETCNT= 5 /RETRY PACKETS 5 TIMES UMSG= 0 /DON'T GENERATE THE LOCAL MESSAGE IN MAIN FILE /RATHER CREATE IT HERE IN THIS PARAMETER FILE BUFFLD= 10 /THESE PROBABLY FILBUFF=2000 /WON'T CHANGE! FIELD BUFFLD%10 /FIELD FOR TEXT MESSAGE *FILBUFFER /LOCAL MESSAGE LOADS THERE LCLMSG, TEXT "%^VT/78 S^ERIAL ^L^INE ^U^NIT 2 ^V^ERSION%" ZBLOCK LCLMSG+40-. /ZERO REST OF MESSAGE AREA |
> > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /* PrismJS 1.17.1 https://prismjs.com/download.html#themes=prism-dark&languages=markup+css+clike+javascript+c+basic+cpp+fortran+makefile+perl+python+tcl */ var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(c){var g=/\blang(?:uage)?-([\w-]+)\b/i,a=0;var _={manual:c.Prism&&c.Prism.manual,disableWorkerMessageHandler:c.Prism&&c.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof L?new L(e.type,_.util.encode(e.content),e.alias):Array.isArray(e)?e.map(_.util.encode):e.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++a}),e.__id},clone:function n(e,r){var t,a,i=_.util.type(e);switch(r=r||{},i){case"Object":if(a=_.util.objId(e),r[a])return r[a];for(var o in t={},r[a]=t,e)e.hasOwnProperty(o)&&(t[o]=n(e[o],r));return t;case"Array":return a=_.util.objId(e),r[a]?r[a]:(t=[],r[a]=t,e.forEach(function(e,a){t[a]=n(e,r)}),t);default:return e}}},languages:{extend:function(e,a){var n=_.util.clone(_.languages[e]);for(var r in a)n[r]=a[r];return n},insertBefore:function(n,e,a,r){var t=(r=r||_.languages)[n],i={};for(var o in t)if(t.hasOwnProperty(o)){if(o==e)for(var l in a)a.hasOwnProperty(l)&&(i[l]=a[l]);a.hasOwnProperty(o)||(i[o]=t[o])}var s=r[n];return r[n]=i,_.languages.DFS(_.languages,function(e,a){a===s&&e!=n&&(this[e]=i)}),i},DFS:function e(a,n,r,t){t=t||{};var i=_.util.objId;for(var o in a)if(a.hasOwnProperty(o)){n.call(a,o,a[o],r||o);var l=a[o],s=_.util.type(l);"Object"!==s||t[i(l)]?"Array"!==s||t[i(l)]||(t[i(l)]=!0,e(l,n,o,t)):(t[i(l)]=!0,e(l,n,null,t))}}},plugins:{},highlightAll:function(e,a){_.highlightAllUnder(document,e,a)},highlightAllUnder:function(e,a,n){var r={callback:n,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};_.hooks.run("before-highlightall",r);for(var t,i=e.querySelectorAll(r.selector),o=0;t=i[o++];)_.highlightElement(t,!0===a,r.callback)},highlightElement:function(e,a,n){var r=function(e){for(;e&&!g.test(e.className);)e=e.parentNode;return e?(e.className.match(g)||[,"none"])[1].toLowerCase():"none"}(e),t=_.languages[r];e.className=e.className.replace(g,"").replace(/\s+/g," ")+" language-"+r;var i=e.parentNode;i&&"pre"===i.nodeName.toLowerCase()&&(i.className=i.className.replace(g,"").replace(/\s+/g," ")+" language-"+r);var o={element:e,language:r,grammar:t,code:e.textContent};function l(e){o.highlightedCode=e,_.hooks.run("before-insert",o),o.element.innerHTML=o.highlightedCode,_.hooks.run("after-highlight",o),_.hooks.run("complete",o),n&&n.call(o.element)}if(_.hooks.run("before-sanity-check",o),!o.code)return _.hooks.run("complete",o),void(n&&n.call(o.element));if(_.hooks.run("before-highlight",o),o.grammar)if(a&&c.Worker){var s=new Worker(_.filename);s.onmessage=function(e){l(e.data)},s.postMessage(JSON.stringify({language:o.language,code:o.code,immediateClose:!0}))}else l(_.highlight(o.code,o.grammar,o.language));else l(_.util.encode(o.code))},highlight:function(e,a,n){var r={code:e,grammar:a,language:n};return _.hooks.run("before-tokenize",r),r.tokens=_.tokenize(r.code,r.grammar),_.hooks.run("after-tokenize",r),L.stringify(_.util.encode(r.tokens),r.language)},matchGrammar:function(e,a,n,r,t,i,o){for(var l in n)if(n.hasOwnProperty(l)&&n[l]){var s=n[l];s=Array.isArray(s)?s:[s];for(var c=0;c<s.length;++c){if(o&&o==l+","+c)return;var g=s[c],u=g.inside,h=!!g.lookbehind,f=!!g.greedy,d=0,m=g.alias;if(f&&!g.pattern.global){var p=g.pattern.toString().match(/[imsuy]*$/)[0];g.pattern=RegExp(g.pattern.source,p+"g")}g=g.pattern||g;for(var y=r,v=t;y<a.length;v+=a[y].length,++y){var k=a[y];if(a.length>e.length)return;if(!(k instanceof L)){if(f&&y!=a.length-1){if(g.lastIndex=v,!(x=g.exec(e)))break;for(var b=x.index+(h&&x[1]?x[1].length:0),w=x.index+x[0].length,A=y,P=v,O=a.length;A<O&&(P<w||!a[A].type&&!a[A-1].greedy);++A)(P+=a[A].length)<=b&&(++y,v=P);if(a[y]instanceof L)continue;j=A-y,k=e.slice(v,P),x.index-=v}else{g.lastIndex=0;var x=g.exec(k),j=1}if(x){h&&(d=x[1]?x[1].length:0);w=(b=x.index+d)+(x=x[0].slice(d)).length;var N=k.slice(0,b),S=k.slice(w),C=[y,j];N&&(++y,v+=N.length,C.push(N));var E=new L(l,u?_.tokenize(x,u):x,m,x,f);if(C.push(E),S&&C.push(S),Array.prototype.splice.apply(a,C),1!=j&&_.matchGrammar(e,a,n,y,v,!0,l+","+c),i)break}else if(i)break}}}}},tokenize:function(e,a){var n=[e],r=a.rest;if(r){for(var t in r)a[t]=r[t];delete a.rest}return _.matchGrammar(e,n,a,0,0,!1),n},hooks:{all:{},add:function(e,a){var n=_.hooks.all;n[e]=n[e]||[],n[e].push(a)},run:function(e,a){var n=_.hooks.all[e];if(n&&n.length)for(var r,t=0;r=n[t++];)r(a)}},Token:L};function L(e,a,n,r,t){this.type=e,this.content=a,this.alias=n,this.length=0|(r||"").length,this.greedy=!!t}if(c.Prism=_,L.stringify=function(e,a){if("string"==typeof e)return e;if(Array.isArray(e))return e.map(function(e){return L.stringify(e,a)}).join("");var n={type:e.type,content:L.stringify(e.content,a),tag:"span",classes:["token",e.type],attributes:{},language:a};if(e.alias){var r=Array.isArray(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(n.classes,r)}_.hooks.run("wrap",n);var t=Object.keys(n.attributes).map(function(e){return e+'="'+(n.attributes[e]||"").replace(/"/g,""")+'"'}).join(" ");return"<"+n.tag+' class="'+n.classes.join(" ")+'"'+(t?" "+t:"")+">"+n.content+"</"+n.tag+">"},!c.document)return c.addEventListener&&(_.disableWorkerMessageHandler||c.addEventListener("message",function(e){var a=JSON.parse(e.data),n=a.language,r=a.code,t=a.immediateClose;c.postMessage(_.highlight(r,_.languages[n],n)),t&&c.close()},!1)),_;var e=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return e&&(_.filename=e.src,_.manual||e.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(_.highlightAll):window.setTimeout(_.highlightAll,16):document.addEventListener("DOMContentLoaded",_.highlightAll))),_}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); Prism.languages.markup={comment:/<!--[\s\S]*?-->/,prolog:/<\?[\s\S]+?\?>/,doctype:/<!DOCTYPE[\s\S]+?>/i,cdata:/<!\[CDATA\[[\s\S]*?]]>/i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var n={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};n["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var i={};i[a]={pattern:RegExp("(<__[\\s\\S]*?>)(?:<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\s*|[\\s\\S])*?(?=<\\/__>)".replace(/__/g,a),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",i)}}),Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup; !function(s){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+t.source+"|[^\n\r()]*)\\)","i"),inside:{function:/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+t.source+")*?(?=\\s*\\{)"),string:{pattern:t,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var e=s.languages.markup;e&&(e.tag.addInlined("style","css"),s.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:e.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:s.languages.css}},alias:"language-css"}},e.tag))}(Prism); Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/}; Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.])\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/-[-=]?|\+[+=]?|!=?=?|<<?=?|>>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript; Prism.languages.c=Prism.languages.extend("clike",{"class-name":{pattern:/(\b(?:enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c.boolean; Prism.languages.basic={comment:{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},string:{pattern:/"(?:""|[!#$%&'()*,\/:;<=>?^_ +\-.A-Z\d])*"/i,greedy:!0},number:/(?:\b\d+\.?\d*|\B\.\d+)(?:E[+-]?\d+)?/i,keyword:/\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SHARED|SINGLE|SELECT CASE|SHELL|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,function:/\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,punctuation:/[,;:()]/}; Prism.languages.cpp=Prism.languages.extend("c",{"class-name":{pattern:/(\b(?:class|enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),Prism.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}); Prism.languages.fortran={"quoted-number":{pattern:/[BOZ](['"])[A-F0-9]+\1/i,alias:"number"},string:{pattern:/(?:\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:\s*!.+(?:\r\n?|\n))?|(?!\1).)*(?:\1|&)/,inside:{comment:{pattern:/(&(?:\r\n?|\n)\s*)!.*/,lookbehind:!0}}},comment:{pattern:/!.*/,greedy:!0},boolean:/\.(?:TRUE|FALSE)\.(?:_\w+)?/i,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,keyword:[/\b(?:INTEGER|REAL|DOUBLE ?PRECISION|COMPLEX|CHARACTER|LOGICAL)\b/i,/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEWHERE|ELSEIF|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i],operator:[/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.(?:EQ|NE|LT|LE|GT|GE|NOT|AND|OR|EQV|NEQV)\.|\.[A-Z]+\./i,{pattern:/(^|(?!\().)\/(?!\))/,lookbehind:!0}],punctuation:/\(\/|\/\)|[(),;:&]/}; Prism.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},builtin:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,symbol:{pattern:/^[^:=\r\n]+(?=\s*:(?!=))/m,inside:{variable:/\$+(?:[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:[/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,{pattern:/(\()(?:addsuffix|abspath|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:s|list)?)(?=[ \t])/,lookbehind:!0}],operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/}; Prism.languages.perl={comment:[{pattern:/(^\s*)=\w+[\s\S]*?=cut.*/m,lookbehind:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0}],string:[{pattern:/\b(?:q|qq|qx|qw)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s+([a-zA-Z0-9])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*\((?:[^()\\]|\\[\s\S])*\)/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*\{(?:[^{}\\]|\\[\s\S])*\}/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*\[(?:[^[\]\\]|\\[\s\S])*\]/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*<(?:[^<>\\]|\\[\s\S])*>/,greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:/\b(?:m|qr)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s+([a-zA-Z0-9])(?:(?!\1)[^\\]|\\[\s\S])*\1[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngc]*/,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s+([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\((?:[^()\\]|\\[\s\S])*\)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\{(?:[^{}\\]|\\[\s\S])*\}\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\[(?:[^[\]\\]|\\[\s\S])*\]\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*<(?:[^<>\\]|\\[\s\S])*>\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor|x)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+)+(?:::)*/i,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*>|\b_\b/,alias:"symbol"},vstring:{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/sub [a-z0-9_]+/i,inside:{keyword:/sub/}},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:\d(?:_?\d)*)?\.?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:lt|gt|le|ge|eq|ne|cmp|not|and|or|xor)\b/,punctuation:/[{}[\];(),:]/}; Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern://,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; Prism.languages.tcl={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,greedy:!0},variable:[{pattern:/(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,lookbehind:!0},{pattern:/(\$){[^}]+}/,lookbehind:!0},{pattern:/(^\s*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,lookbehind:!0}],function:{pattern:/(^\s*proc[ \t]+)[^\s]+/m,lookbehind:!0},builtin:[{pattern:/(^\s*)(?:proc|return|class|error|eval|exit|for|foreach|if|switch|while|break|continue)\b/m,lookbehind:!0},/\b(?:elseif|else)\b/],scope:{pattern:/(^\s*)(?:global|upvar|variable)\b/m,lookbehind:!0,alias:"constant"},keyword:{pattern:/(^\s*|\[)(?:after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|Safe_Base|scan|seek|set|socket|source|split|string|subst|Tcl|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|wordBreak(?:After|Before)|test|vars)|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,lookbehind:!0},operator:/!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|ne|in|ni)\b/,punctuation:/[{}()\[\]]/}; |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 | C=90 !=B V=4 Y B R,M A++,Q R S-G A+ G R Q A+ S B+ Q-G C+ G R M G+,Q C+ C. G Y B R,M F+,Q R S-G F G R Q F S G Q-G A+ G R M E,Q A+ C. E Y B R,M D+,Q R S-G D G R Q D S E Q F M C+,Q C Q-G F G R Q F Q C Y M D+,Q-G D G R Q D Q B Q D M (B+,F+,C),C-G F G F C F Y B (F--,C-,C),Q F Q-G A+ G R C A+ S G Q.-G A+ G R C A+ Y B (F--,C-,C),Q F Q-G A+ G R C A+ S G Q.-G A+ G R C A+ Y M R,C.-G F-,C F,S A+ Q.-G C+ G R Q C+,Q-G A+ G R Q (F-,F,A) C.-G E-,C-G (C,E),Q G Q-G C+ G R C (C,E),S C+ Q. G G R Q E- Y M R,C.-G D-,C-G D,Q F Q-G A+ G R C-G D,S A+ Q.-G F G R Q D- G R Q R,C.-G C-,Q.-G D,Q-G F G R QTC F,S-G A+ G R STC (D,A+) G R Q C- Q R,C.-G B-,Q-G (B,D) G R C-G (B,D),S-G F G R Q. F G R C R,Q (B-,B),S D S-G C G R C.-G F--,Q-G (A,C) G R C-G (A,C),S-G F G R Q. F G R Q (F--,A,C) Y Q R,C.-G G--,Q-G (B,D) G R Q-G (B,D),S-G F G R S-G F G R C-G B,C D,S F Q. A+ G R Q G-- G R C-G (C-,D,F),Q-G G G R S G S F G R C (D,F,G),Q-G C- G R Q C- Y M R,C.-G F-,C F,Q A+ S-G C+ G R S-G C+ G R Q C+,Q-G A+ G R Q (F-,F,A+) C.-G E-,C-G (C,E),Q G S-G C+ G R S-G C+ G R C (C,E),S C+ Q. G G R Q E- Y MTQ R,C.-G D-,C-G D,Q F Q-G A+ G R Q.-G D,Q A G R Q D-,S-G F G R Q.-G (D,F) C.-G C- G R C.(D,F),S-G A+ G R CTS A+ G R Q C- Y Q R,C.-G B-,Q-G (B,D) G R C-G (B,D),S-G F G R Q. F G R Q. R,Q (B-,B,D) C.-G F--,Q-G A,S-G C G R C.. C,Q-G F G R C. A G R C F G R Q F-- S C Y Q. R,C.-G G--,Q.-G B,S D Q-G F G R S-G (B,D),STQ F G R C-G (B,D) G R Q (G--,A+) G R C (B,D),Q-G C-,Q G G R Q (F,C-) Y C R,C.-G F--,B F Q-G (C,A+) G R Q (F--,C,A+) Q (B-,D,B+) C.-G (F--,A+),C. C G R Y C.-G F--,C-G (A+,C+),S-G F+ G R S-G F+ G R S F+ S G+ G R Q-G (A+,C+,F+) G R Q (F--,A+,F+),Q-G C+ G R C R,C-G A-,Q-G C+,S E+ S D+ G R Q-G (A+,C+) G R C (A-,E,A+,C+) Y C.-G B-,C-G (F,B+),S D+ S C+ S D+ S C+ G R Q.-G (F,B+),S D+ S-G C+ G R Q B-,S-G C+ G R MTS F,MTS-G (A+,C+) C-G F-- G R Q F-- Q C- G R C=95 Y C.-G F--,C-G (A+,C+),S-G F+ G R S-G F+ G R S-G F+ G R S-G F+ G R C-G A+,C C+,S F+ Q. G+ G R Q F-- G R Q. R,C-G A-,Q.-G A+,S E+ S D+ S-G C+ G R STC (E,A+,C+) G R C A- Y C.-G B-,C-G (F,B+),S D+ S C+ S D+ S C+ G R Q.-G F,Q. B+,Q D+ G R Q B-,S-G C+ G R STC C+,STC-G (A+,F) C-G F-- G R Q. R,Q F--,C F,C-G A+ Q C- S-G C+ G R Y C.-G F--,C-G (A+,C+),S-G F+ G R S-G F+ G R S-G F+ G R S-G F+ G R C-G (A+,C+),S F+ Q. G+ G R Q F-- G R C-G A-,Q-G (A+,C+),S E+ S D+ G R C. (E,A+,C+) G R C A- Y C.-G B-,Q.-G F,Q. B+,Q-G D+ G R S D+ G R Q.-G (F,D),Q. C+ G R Q (B-,D,B+),Q-G F G R C-G F--,C (F,A+,C+) G R Q (F--),C (A,C) Q C-,S-G F G R S-G F G R Y C R,C.-G F--,C-G F,S A+ Q.-G C+ G R Q-G (F,A+,C+) G R Q (F--,A+,C+),Q-G F G R C-G B-,Q F,Q-G (B+,D+) G R C.TM. (B+,D+,F+) G R Q B- Q F-- B. B-- C R C R,Q-G F G R Q F C=85 M (B,D),S A+ S G+ Q-G F G R Q-G F G R S-G F G R STB F C R,C.-G F-- C (C,A+) G R Q F-- C-G B-,Q-G (D,B+) G R C. (D,B+) G R C B- Y C R,C.-G F-- Q-G (C,F,A+) G R Q (F--,C,A+),Q-G F G R C B-,S-G (D,F,B+) G R Q. (D,B+),Q.-G F G R C (F--,C),C-G (F,A+) G R Y M R,C.-G F-,C F,S A+ Q.-G C+ G R Q C+,Q-G A+ G R Q (F-,F,A) C.-G E-,C-G (C,E),Q G Q-G C+ G R C (C,E),S C+ Q. G G R Q E- Y M R,C.-G D-,C-G D,Q F Q-G A+ G R C-G D,S A+ Q.-G F G R Q D- G R Q R,C.-G C-,Q.-G D,Q-G F G R QTC F,S-G A+ G R STC (D,A+) G R Q C- Q R,C.-G B-,Q-G (B,D) G R C-G (B,D),S-G F G R Q. F G R C R,Q (B-,B),S D S-G C G R C.-G F--,Q-G (A,C) G R C-G (A,C),S-G F G R Q. F G R Q (F--,A,C) Y Q R,C.-G G--,Q-G (B,D) G R Q-G (B,D),S-G F G R S-G F G R C-G B,C D,S F Q. A+ G R Q G-- G R C-G (C-,D,F),Q-G G G R S G S F G R C (D,F,G),Q-G C- G R Q C- Y M R,C.-G F-,C F,Q A+ S-G C+ G R S-G C+ G R Q C+,Q-G A+ G R Q (F-,F,A+) C.-G E-,C-G (C,E),Q G S-G C+ G R S-G C+ G R C (C,E),S C+ Q. G G R Q E- Y MTQ R,C.-G D-,C-G D,Q F Q-G A+ G R Q.-G D,Q A G R Q D-,S-G F G R Q.-G (D,F) C.-G C- G R C.(D,F),S-G A+ G R CTS A+ G R Q C- Y Q R,C.-G B-,Q-G (B,D) G R C-G (B,D),S-G F G R Q. F G R Q. R,Q (B-,B,D) C.-G F--,Q-G A,S-G C G R C.. C,Q-G F G R C. A G R C F G R Q F-- S C Y Q. R,C.-G G--,Q.-G B,S D Q-G F G R S-G (B,D),STQ F G R C-G (B,D) G R Q (G--,A+) G R C (B,D),Q-G C-,Q G G R Q (F,C-) Y C R,C.-G F--,B F Q-G (C,A+) G R Q (F--,C,A+) Q (B-,D,B+) C.-G (F--,A+),C. C G R C=100 Y M R,C.-G F-,C F,S A+ Q.-G C+ G R Q C+,Q-G A+ G R Q (F-,F,A) C.-G E-,C-G (C,E),Q G Q-G C+ G R C (C,E),S C+ Q. G G R Q E- Y M R,C.-G D-,C-G D,Q F Q-G A+ G R C-G D,S A+ Q.-G F G R Q D- G R Q R,C.-G C-,Q.-G D,Q-G F G R QTC F,S-G A+ G R STC (D,A+) G R Q C- Q R,C.-G B-,Q-G (B,D) G R C-G (B,D),S-G F G R Q. F G R C R,Q (B-,B),S D S-G C G R C.-G F--,Q-G (A,C) G R C-G (A,C),S-G F G R Q. F G R Q (F--,A,C) Y Q R,C.-G G--,Q-G (B,D) G R Q-G (B,D),S-G F G R S-G F G R C-G B,C D,S F Q. A+ G R Q G-- G R C-G (C-,D,F),Q-G G G R S G S F G R C (D,F,G),Q-G C- G R Q C- C=90 Y M R,C.-G F-,C F,Q A+ S-G C+ G R S-G C+ G R Q C+,Q-G A+ G R Q (F-,F,A+) C.-G E-,C-G (C,E),Q G S-G C+ G R S-G C+ G R C (C,E),S C+ Q. G G R Q E- Y MTQ R,C.-G D-,C-G D,Q F Q-G A+ G R Q.-G D,Q A G R Q D-,S-G F G R Q.-G (D,F) C.-G C- G R C.(D,F),S-G A+ G R CTS A+ G R Q C- Y Q R,C.-G B-,Q-G (B,D) G R C-G (B,D),S-G F G R Q. F G R Q. R,Q (B-,B,D) C.-G F--,Q-G A,S-G C G R C.. C,Q-G F G R C. A G R C F G R Q F-- S C C=50 Y Q. R,C.-G G--,Q.-G B,S D Q-G F G R S-G (B,D),STQ F G R C-G (B,D) G R Q (G--,A+) G R C (B,D),Q-G C-,Q G G R Q (F,C-) C=90 Y C R,C.-G F--,B F Q-G (C,A+) G R Q (F--,C,A+) Q (B-,D,B+) C.-G (F--,A+),C. C G R Y C.-G F--,C-G (A+,C+),S-G F+ G R S-G F+ G R S F+ S G+ G R Q-G (A+,C+,F+) G R Q (F--,A+,F+),Q-G C+ G R C R,C-G A-,Q-G C+,S E+ S D+ G R Q-G (A+,C+) G R C (A-,E,A+,C+) Y C.-G B-,C-G (F,B+),S D+ S C+ S D+ S C+ G R Q.-G (F,B+),S D+ S-G C+ G R Q B-,S-G C+ G R MTS F,MTS-G (A+,C+) C-G F-- G R Q F-- Q C- G R Y C.-G F--,C-G (A+,C+),S-G F+ G R S-G F+ G R S-G F+ G R S-G F+ G R C-G A+,C C+,S F+ Q. G+ G R Q F-- G R Q. R,C-G A-,Q.-G A+,S E+ S D+ S-G C+ G R STC (E,A+,C+) G R C A- Y C.-G B-,C-G (F,B+),S D+ S C+ S D+ S C+ G R Q.-G F,Q. B+,Q D+ G R Q B-,S-G C+ G R STC C+,STC-G (A+,F) C-G F-- G R Q. R,Q F--,C F,C-G A+ Q C- S-G C+ G R Y C.-G F--,C-G (A+,C+),S-G F+ G R S-G F+ G R S-G F+ G R S-G F+ G R C-G (A+,C+),S F+ Q. G+ G R Q F-- G R C-G A-,Q-G (A+,C+),S E+ S D+ G R C. (E,A+,C+) G R C A- Y C.-G B-,Q.-G F,Q. B+,Q-G D+ G R S D+ G R Q.-G (F,D),Q. C+ G R Q (B-,D,B+),Q-G F G R C-G F--,C (F,A+,C+) G R Q (F--),C (A,C) Q C-,S-G F G R S-G F G R Y C R,C.-G F--,C-G F,S A+ Q.-G C+ G R Q-G (F,A+,C+) G R Q (F--,A+,C+),Q-G F G R C-G B-,Q F,Q-G (B+,D+) G R C.TM. (B+,D+,F+) G R Q B- Q F-- B. B-- C R C R,Q-G F G R Q F C=85 M (B,D),S A+ S G+ Q-G F G R Q-G F G R S-G F G R STBTBTM. F C R,C.-G F-- C (C,A+) G R Q F-- C-G B-,Q-G (D,B+) G R C. (D,B+) G R C B- C R,C.-G F-- Q-G (C,A+) G R Q (F--,C,A+) C B-,S-G (D,B+) G R Q. (D,B+) M. (F--,C,A+) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 | C=125 V=3 !=B Q. F,C (F--,C-) S A+ Q(C+,G#--), C R Q(F+,A-) Q A++,C(F--,C-) Q(G+) Q(F+,G#--),C R Q(D+,A-) Q B"+,C(F--,C-) Q C+ M. R,C R,Q G#-- Q A- Q(F--,C-) Q(F--,C-) Q G#--, C R Q A- Y Q. F,C(F--,C-) S A+ Q(C+,G#--),C R Q(F+,A-) Q A++,C(F--,C-) Q G+ Q(F+,G#--),C R Q(D+,A-) M. C+,Q(F--,C-) Q(F--,C-) Q G#--,C R Q A- C(F--,C-) Q(D+,C#-),C R Q(A!+,D-) Y M.. A!+,Q(B-,F-) Q(B-,F-) Q C#-,C R Q D- Q(B-,F-) Q(B-,F-) Q C-,C R Q(D+,D-) D(G) Q(A!+,B-,F-) Q(F,B-,F-) M. R,C R,Q C#- Q D- Q(B-,F-) Q(B-,F-) C R,Q C- Q D- Y Q. F,C(F--,C-) S A+ Q(C+,G#--),C R Q(F+,A-) Q A++,C(F--,C-) Q G+ Q(F+,G--),C R Q(D+,A-) Q B"+,C(F--,C-) Q C+ MTQ R,C R,Q G#-- Q A- Q(F--,C-) Q(F--,C-) C R,Q D#- Q(C+,E-) Y C G+,Q(C-,G-) Q(C-,G-) C(G+),Q D#- Q E- D(D#+) Q(E+,C-,G-) Q(C+,C-,G-) Q(R,D-),C R Q(C+,E-) M F+,C(B-,F-) C R,Q C#- Q D"- S E!+,M(B-,F-) S F+ S E!+ S C+ Q B+ Q G# Y M B"+,Q(F--,C-) Q(F--,C-) C R,Q G#-- Q A- S B+,M(F--,C-) S C!+ S B+ S A!+ Q F Q C Y Q E!,C(F--,C-) Q F M. R,C R,Q G#-- Q A- C(F--,C-) Q G--,C R Q A- Y Q. F,C (F--,C-) S A+ Q(C+,G#--), C R Q(F+,A-) Q A++,C(F--,C-) Q(G+) Q(F+,G#--),C R Q(D+,A-) Q B"+,C(F--,C-) Q C+ M. R,C R,Q G#-- Q A- Q(F--,C-) Q(F--,C-) Q G#--, C R Q A- Y Q. F,C(F--,C-) S A+ Q(C+,G#--),C R Q(F+,A-) Q A++,C(F--,C-) Q G+ Q(F+,G#--),C R Q(D+,A-) M. C+,Q(F--,C-) Q(F--,C-) Q G#--,C R Q A- C(F--,C-) Q(D+,C#-),C R Q(A!+,D-) Y M.. A!+,Q(B-,F-) Q(B-,F-) Q C#-,C R Q D- Q(B-,F-) Q(B-,F-) Q C-,C R Q(D+,D-) D(G) Q(A!+,B-,F-) Q(F,B-,F-) M. R,C R,Q C#- Q D- Q(B-,F-) Q(B-,F-) C R,Q C- Q D- Y Q. F,C(F--,C-) S A+ Q(C+,G#--),C R Q(F+,A-) Q A++,C(F--,C-) Q G+ Q(F+,G--),C R Q(D+,A-) Q B"+,C(F--,C-) Q C+ MTQ R,C R,Q G#-- Q A- Q(F--,C-) Q(F--,C-) C R,Q D#- Q(C+,E-) Y C G+,Q(C-,G-) Q(C-,G-) C(G+),Q D#- Q E- D(D#+) Q(E+,C-,G-) Q(C+,C-,G-) Q(R,D-),C R Q(C+,E-) M F+,C(B-,F-) C R,Q C#- Q D"- S E!+,M(B-,F-) S F+ S E!+ S C+ Q B+ Q G# Y M B"+,Q(F--,C-) Q(F--,C-) C R,Q G#-- Q A- S B+,M(F--,C-) S C!+ S B+ S A!+ Q F Q C Y Q E!,C(F--,C-) Q F Q D,M. R,C B- Q D Q C,C A- Q C Q B,C G-- Q B Q A,C(F--,C-) Q R C(F+,A++),Q G#-- Q A- C(R,F--,C-) Q(E!+,G+,G#--) Q(E!+,G+,A-) Y C(R,F--,C-) C(F+,A++),Q G#-- Q A- C. R,C(F--,C-) Q(R) Q(C-,C) B R,C(F-,F) Q(A!+,A!) Q(F-,F) Q(B,B+) C.(A,A+) Y D(C#) M.. F+,C(B+,D) C(A+,C) C B+,D C# Q..D Q(A+,C) Q(R) B R,C(F,F-) Q(A!+,A!) Q(F,F-) C(B+,B) Q(A+,A) Q(F,F-) Y B R,Q(A!+,A!) QTM(B+,B) C R,Q F Q A!+ M.. A!+,C(B-,F-) Q C#-,C R Q D- C(B-,F-) Q C-,C R Q(D+,D-) Y D(G) Q A!+,C(B-,F-) Q F M. R,C R,Q C#- Q D- C(B-,F-) Q C-,C R Q D- Q. F,C(F--,C-) S A+ Q(C+,G#--),C R Q(F+,A-) Q A++,C(F--,C-) Q G+ Q(F+,G--),C R Q(D+,A-) Y Q B"+,C(F--,C-) Q C+ MTQ R,C R,Q G#-- Q A- C(F--,C-) Q D#-,C R Q(C+,E-) M G+,C(C-,G-) Q D#-,C R Q E- D D#+,C(C-,G-) S. E+ Q C+ C R,Q R,Q D- Q(C+,E-) Y M F+,C(B-,F-) Q C#-,C R Q B"- S E!+,M(B-,F-) S F+ S E!+ S C+ Q B+ Q G# Q. F,C (F--,C-) S A+ Q(C+,G#--), C R Q(F+,A-) Q A++,C(F--,C-) Q(G+) Q(F+,G#--),C R Q(D+,A-) Q B"+,C(F--,C-) Q C+ M. R,C R,Q G#-- Q A- Q(F--,C-) Q(F--,C-) Q G#--, C R Q A- Y Q. F,C(F--,C-) S A+ Q(C+,G#--),C R Q(F+,A-) Q A++,C(F--,C-) Q G+ Q(F+,G#--),C R Q(D+,A-) M. C+,Q(F--,C-) Q(F--,C-) Q G#--,C R Q A- C(F--,C-) Q(D+,C#-),C R Q(A!+,D-) Y M.. A!+,Q(B-,F-) Q(B-,F-) Q C#-,C R Q D- Q(B-,F-) Q(B-,F-) Q C-,C R Q(D+,D-) D(G) Q(A!+,B-,F-) Q(F,B-,F-) M. R,C R,Q C#- Q D- Q(B-,F-) Q(B-,F-) C R,Q C- Q D- Y Q. F,C(F--,C-) S A+ Q(C+,G#--),C R Q(F+,A-) Q A++,C(F--,C-) Q G+ Q(F+,G--),C R Q(D+,A-) Q B"+,C(F--,C-) Q C+ MTQ R,C R,Q G#-- Q A- Q(F--,C-) Q(F--,C-) C R,Q D#- Q(C+,E-) Y C G+,Q(C-,G-) Q(C-,G-) C(G+),Q D#- Q E- D(D#+) Q(E+,C-,G-) Q(C+,C-,G-) Q(R,D-),C R Q(C+,E-) M F+,C(B-,F-) C R,Q C#- Q D"- S E!+,M(B-,F-) S F+ S E!+ S C+ Q B+ Q G# Y Q(F,F--,C-) Q(R) B. R,M(C-,C) M(D-,D) M(C-,C) BTB(F--,C,E!) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 | C=84 D(C#+,C#++) S(D+,D++) S(E+,E++) S(C+,C++) Q(A+,A++) S(B+,B++) Q(G,G+) D(C#,C#+) S(D,D+) S(E,E+) S(C,C+) Q(A,A+) S(B,B+) Q(G-,G) Y D(C#-,C#--) S(D-,D--) S(E-,E--) S(C-,C--) Q(A-,A--) S(B-,B--) S(A-,A--) S(A!-,A!--) Q(G--,G---) Q R Q(G--,G-,B+,D+) S D S D# Y=221 S E,Q C- Q C+ Q(G-,C) S E Q(C+,G--) Q(G-,B!),S E S C+ CTS C+,Q F-- Q (A,C) Q(E--) S(E+,C++) Q(G-,C),S(F+,D++) S(F#+,D#++) Y S(G+,E++),Q G-- S(E+,C++) S(F+,D++),Q(E-,C) Q(G+,E++) Q G-- S(D+,B++) Q(G-,B,F+,D++) Q(C--,C++),QTS E+ Q(E-,G-,C) S G+ Q(E-,G-,E+,C++) Q(G-,B),S D S D# Y S E,Q(C-) Q C+ Q(G-,C) S E Q(R,C+,G--) Q(G-,B!),S E S C+ C.(C+),Q(R,F--) Q(A,C) Q(E--,E-) Q(E!--,E!-),S(C+,A++) S(G+) Y Q(D--,D-),S(C+,F#+) S(A++) Q(F#-,C),S(E+,C++) Q E++,CTS F#+ Q(D-) S D++ Q(A,D),S C++ S A++ Q(G-,F),CTQ(F+,D++) Q(G--,G-) Q(A-,A) Q(B-,B),S D S D# S E,Q(C-) Q C+ Q(G-,C) S E Q(R,C+,G--) Q(G-,B!),S E S C+ CTS C+,Q F-- Q (A,C) Q(E--) S(E+,C++) Q(G-,C),S(F+,D++) S(F#+,D#++) Y=241 S(G+,E++),Q G-- S(E+,C++) S(F+,D++),Q(E-,C) Q(G+,E++) Q G-- S(D+,B++) Q(G-,B,F+,D++) Q(C--,C++),QTS E+ Q(E-,G-,C) S G+ Q(G-,E),QTS(E+,C++) Q(R) S(F+,D++) Y Q(C--,C-),S(G+,E++) S(E+,C++) Q(G-,E),S(F+,D++) Q(G+,E++) Q(B!--,B!-) Q. G+,S C++ Q(G-,E),S D++ S C++ Q(A--,A-),S(A++,E++) S(C++) Q(A,F),S(A++,D++) CTS A!++,Q E++ Q(A!-,A!-) S C++ Q(A!,F),S D++ S C++ Y Q(G--,G--),S(G+,E++) S(E+,C++) Q(G-,E),S(F+,D++) Q(G+,E++) Q(G--,G--) S(D+,B++) Q(G-,B,F+,D++) Q(C--,C-),CTS.(E+,C++) D(F#--,F#-) Q(G--,G-) S(C--,C-) Q. R,S(E,C+,E+) S(F,D+,F+) S(F#,D#+,F#+) Q(C--,C-,G+),C. E+ Q(G-,C),S A++ Q G+ Q G-- S C+ Q(G-,C),S(D+,F+) S(D#+,F#+) Y Q(C--,C-,G+),C. E+ Q(G-,C),S A++ Q G+ Q G-- Q. R Q(E-,C),S C+ S G Q(F--),S A+ S B+ Q(F-,A,C),S C+ S D+ Q(F--,A!+),S E+ S D+ Q(F-,A!-,C),S C+ S D+ Y Q(E--),S G S E+ Q(E-,G-,C),S F+ S G+ Q G--,S A++ S G+ Q(G-,E),S(C+,E+) S(D+,F+) Q(C--,C-,G+),C. E+ Q(G-,C),S A++ Q G+ Q G-- S C+ Q(G-,C),S(D+,F+) S(D#+,F#+) Y Q(C--,C-,G+),C. E+ Q(G-,E),S A++ Q. G+ Q(E-,E) Q(E!-,E!),S(E!+,A++) S(A#++) Q(D-),Q.(D+,B++) Q(G-,D) Q(C+,B) Q(D-,F#-) S(A++) S(A,D),S(C+,F#+) S(D+) Y=321 Q(G-,D),CTS(B+,G+) Q(F--,F-) Q(E--,E-) S(C+,E+) Q(D--,D-),S(D+,F+) S(D#+,F#+) Q(C--,C-,G+),C. E+ Q(G-,C),S A++ Q G+ Q G-- S C+ Q(G-,C),S(D+,F+) S(D#+,F#+) Y Q(C--,C-,G+),C. E+ Q(G-,C),S A++ Q G+ Q G-- Q. R Q(E-,C),S C+ S G Q(F--),S A+ S B+ Q(F-,A,C),S C+ S D+ Q(F--,A!+),S E+ S D+ Q(F-,A!-,C),S C+ S D+ Y Q(C--,G,C+) Q(E-,G-,C),S E+ S G+ Q(C--),S(C++) S(G,G+) Q(E-,B!),S(F#,F#+) S(G,G+) C(F--,C-),Q(C+,C++) S(A+,A++) Q(C+,C++) C(F#--,C-) S(A+,A++) S(C+,C++) S(A+,A++) Y M(C-,G-),S(G,G+) S(C+,C++) S(E+,E++) Q(G+,G++) S(E+,E++) S(C+,C++) S(G,G+) C F#-,Q(D-,A+,A++) Q(A,C+,C++) Q(G--,F-),S(E+,E++) Q(D+,D++) Q(G-,B) STCTS(E+,C++) Q(C-,C) Q(G--,G-) Q(E--,E-) S E++ Q(D--,D-),S F++ S F#++ Q(G++,C-,C--) S A+++,Q(C,E) Q G++ Q G-- S E++ S F++,Q(C,E) S F#++ V 3-5-1 Q(G++,C-) S A+++,Q(C,E) Q G++ Q G-- S E++ S C++,Q(C,E) S G+ S A++,Q F-- S B++ S C++,Q(F-,A,C) S D++ S E++,Q F-- S D++ S C++,Q(F-,A!,C) S D++ V 3-5-3 S G+,Q E-- S E++ S F++,Q(E-,G-,C) S G++ S A+++,Q G-- S G++ S E++,Q(C,E) S F++ Q(G++,C--,C-) S A+++,Q(C,E) Q G++ Q G-- S E++ S F++,Q(C,E) S F#++ Q(G++,C-) S A+++,Q(C,E) Q G++ Q E- S G++ S A+++,Q E!- S A#+++ Y;V 4-1-1 STQTSTS B+++,Q D- Q(G-,B,D) Q(D-,F#-) S A+++ S F#++,Q C S D++ D G++,Q(G-,B,D) D A+++ D G++ D A+++ D G++,Q(F--,F-) D A+++ D G++ D A+++ S G++,Q(E--,E-) S E++ S F++,Q(D--,D-) S F#++ Q(G++,C--,C-) S A+++,Q(C,E) Q G++ Q G-- S E++ S F++,Q(C,E) S F#++ Q(G++,C-) S A+++,Q(C,E) Q G++ Q G-- S E++ S C++,Q(C,E) S G+ S A++,Q F-- S B++ S C++,Q(F-,A,C) S D++ S E++,Q F-- S D++ S C++,Q(F-,A!,C) S D++ Q(C++,E--) S E++,Q(E-,G-,C) S G++ S C+++,Q C- S G++ S F#++,Q(G-,B!) S G++ Q C+++,C(F-,A,C) S A+++ Q C+++ C(F#-,C,D#) S A+++ S C+++ S A+++ Y;V 4-2-3 D G++,M(G-,C,E) D R D C+++ D R D E+++ D R S G+++ S R D E+++ D R D C+++ D R D G++ D R S A+++,C(A,D,F#) S R S C+++ S R S E+++,C(G-,D,F) Q D+++ STCTQ C+++ Q(C,E) D F#- Q-D G- Q(C--,C-) S D S D# Y=221 S E,Q C- Q C+ Q(G-,C) S E Q(C+,G--) Q(G-,B!),S E S C+ CTS C+,Q F-- Q (A,C) Q(E--) S(E+,C++) Q(G-,C),S(F+,D++) S(F#+,D#++) Y S(G+,E++),Q G-- S(E+,C++) S(F+,D++),Q(E-,C) Q(G+,E++) Q G-- S(D+,B++) Q(G-,B,F+,D++) Q(C--,C++),QTS E+ Q(E-,G-,C) S G+ Q(E-,G-,E+,C++) Q(G-,B),S D S D# Y S E,Q(C-) Q C+ Q(G-,C) S E Q(R,C+,G--) Q(G-,B!),S E S C+ C.(C+),Q(R,F--) Q(A,C) Q(E--,E-) Q(E!--,E!-),S(C+,A++) S(G+) Y Q(D--,D-),S(C+,F#+) S(A++) Q(F#-,C),S(E+,C++) Q E++,CTS F#+ Q(D-) S D++ Q(A,D),S C++ S A++ Q(G-,F),CTQ(F+,D++) Q(G--,G-) Q(A-,A) Q(B-,B),S D S D# S E,Q(C-) Q C+ Q(G-,C) S E Q(R,C+,G--) Q(G-,B!),S E S C+ CTS C+,Q F-- Q (A,C) Q(E--) S(E+,C++) Q(G-,C),S(F+,D++) S(F#+,D#++) Y=241 S(G+,E++),Q G-- S(E+,C++) S(F+,D++),Q(E-,C) Q(G+,E++) Q G-- S(D+,B++) Q(G-,B,F+,D++) Q(C--,C++),QTS E+ Q(E-,G-,C) S G+ Q(G-,E),QTS(E+,C++) Q(R) S(F+,D++) Y Q(C--,C-),S(G+,E++) S(E+,C++) Q(G-,E),S(F+,D++) Q(G+,E++) Q(B!--,B!-) Q. G+,S C++ Q(G-,E),S D++ S C++ Q(A--,A-),S(A++,E++) S(C++) Q(A,F),S(A++,D++) CTS A!++,Q E++ Q(A!-,A!-) S C++ Q(A!,F),S D++ S C++ Y Q(G--,G--),S(G+,E++) S(E+,C++) Q(G-,E),S(F+,D++) Q(G+,E++) Q(G--,G--) S(D+,B++) Q(G-,B,F+,D++) Q(E+,C++,C--,C-) 3S G+,D(F#--,F#-) Q-D(G--,G-) 3S A++ 3S B++ Q(E+,C++,C--,C-) Q R Y;V 4-3-1 !=B S(F+,A++),Q F-- S(E+,G#+) C(F+,A++),Q(A,C) Q C- Q(A++,C++,A,C) M D++,Q(B++,B-) S(B+,B,D) S(A+,A) S(B+,B),Q F- S(C+,C) Q(D+,B,D) S(D+,F+),Q D- S(C#+,E+) C(D+,F+),Q(A,D) Q A- Q(F+,A++,A,D) C.. B++,Q(G+,G--) S(G-,B,G) S(F#-,F#) S(G-,G),Q D S(A,A+) Q(G-,B,B+) S G+ Y;V 4-3-5 Q(B+,D+,B-) S(B+,G+),Q(B,D) Q(B+,D+) Q(G--,G-) S(B+,G+) Q(B+,D+,G#--,G#-) C(A+,C+),Q(A-,A) Q(A,C) C(A+,G+),Q D- Q(A,D) S E+,Q E- S G#+ S B"++,Q(B",D,G#) Q E++ Q G#-- S D++ S B"++,Q(B",D,E) S C Q A++,C A-,G R C-G E-,G R C-3D C S E+ S A++ S B++,Q G--,G R Q-G E-,GR Q-3D B S E+ S G+,Q C-- S B++ Y;V 4-4-4 S(F+,A++),Q F-- S(E+,G#+) C(F+,A++),Q(A,C) Q C- Q(A,C,A++,C++) M D++,Q(B++,B-) S(B+,B,D) S(A+,A) S(B+,B),Q F S(C+,C) Q(D+,B,D) S(D+,F+),Q D- S(C#+,E+) C(D+,F+),Q(A,D) Q A- Q(F+,A++,A,D) C.. B++,Q(G+,G--) S(G,G-,B) S(F#,F#-) S(G,G-),Q D- S(A+,A) Q(G-,B,B+) S G+ Q(B+,D+,B-) S(B+,G+),Q(B,D) Q(B+,D+) Q(G--,G-) Q(B+,G+) Q(G#--,G#-) S(B+,D+) C(A+,C+),S(A-,A) S(F--,F-) S(E--,E-) S(D--,D-) C(D!--,D!-),Q.(G#,F+) S F+ S(C+,A++),Q(C--,C-) Q(A++,C++) Q(A,F) Q(B+,G+) Q(C--,C-) S C+ S(B+,D+),Q(B,E) S E+ Q(A+,F+,F--,F-) 3S C++ 3S D++ 3S E++ Q(F--,A,A++,F+++) Q R !=R Q(C+,F-,A,C) S A+,Q(F-,A,C) Q C+ Q(F#-,A,D#) S A+ S C+,Q(F#-,A,D#) S A+ S G,Q(G-,C,E) S C+ S E+,Q(G-,C,E) Q G+ Q(G-,E,G) S E+ S C+,Q(G-,C,E) S G Q(F#,A+,D-,C) Q(F#,C,D-,A) S(F,E+),Q(G-,B) Q(F,D+) Q(G-,B) STC(E,C+) C(C-,C) Q(C--,C-,E,G) Q R Y=522 Q(D,F,F--) S(C#,E),Q(F-,A) Q(D,F) Q A- S(C,E) Q(D,F,F-,A) S R,Q F-- S A++ S D++,Q(F-,A) S A++ S C++,Q A- S D++ S C++,Q(F-,A) S A++ Q(E,G,C-) S(D#,F#),Q(G-,C) Q(E,G) Q G-- S(D#,F#) Q(E,G,G-,C) Q C-,S R S C++ S E++,Q(E-,G-,C) S C++ S D++,Q G-- S E++ S D++,Q(E-,G-,C) S C++ Y=531 Q(B+,D+,G--) S(A#+,C#+),Q(F-,B) Q(B+,D+) Q B- S(A#+,C#+) Q(F-,B,B+,D+) S R,Q G-- S F++ S A+++,Q(F-,G-,B) S F++ S G++,Q D- S A+++ S G++,Q(F-,G-,B) S F++ D(C++,C+++),Q(D#-,A) D R D(C++,C+++) D R C-G(C++,C+++,D#-,A) G R D(C++,A+++),Q(D#-,A) Q-D R Q(C++,G++,E-,G-) D(E,G) D R D(E,G) D R D(E,G) S. R D(E,G) S. R Q(F--,D,F) S(C#,E),Q(F-,A) Q(D,F) Q A- S(C#,E) Q(F-,A,D,F) S R,Q F-- S A++ S D++,Q(F-,A) S A++ S C++,Q A- S D++ S C++,Q(F-,A) S A++ Q(E,G,C-) S(D#,F#),Q(E-,C) Q(E,G) Q G-- S(D#,F#) Q(E,G,E-,C) S R,Q C- S C++ S E++,Q(E-,G-,C) S C++ S D++,Q G-- S E++ S D++,Q(E-,C) S C++ S A++,Q F- S G#+ S A++,Q(D-,A) Q(G+,G++) Q E- Q(A++,F++) Q(F-,C) S(A++,C++) Y=551 S(G+,E++),Q G- S D#++ S E++,Q(G-,C,E) Q A+++ Q(F#-,C,D#) S C++ S G+,Q(G-,C,E) S E+ Q(F#,C+,A-,A) Q(F#,C+,D--,D-) S(F,E+),Q(G--,G-) Q(F,D+) Q(B-,B) STQ(E,C+) Q(C-,C) 3S G+,D(F#--,F#-) Q-D(G--,G-) 3S A++ 3S B++ Q(C--,C-,E+,C++) Q R $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 | C=200 Q R S (F-,F,F--) S R S (F-,F,F--) S R S (F-,F,F--) S R M (C#-,C#--,C#) Q R S (D#-,D#--,D#) S R S (D#-,D#--,D#) S R S (D#-,D#--,D#) S R BTQ (C-,C--,C) Q R S F S R S F S R S F S R S (A#,C#) S (C#,A#) S (C#,F#,A#) S (A#,C#) S (C#,F#,A#) S (A#,C#) S (C#,F#,A#) S (A#,C#) Q (C#,F,A#) S (F,C#+,A#,C#) S (C#,F,A#) S (F,C#+,A#,C#) S (C#,F,A#) S (F,C#+,A#,C#) S (C#,F,A#) MTS (F,A#+,A#,C#) S A# S (A#,F) S A# S (A#,F) S A# S (A#,F) S A# Q (A,C) S (C,F#,A) S (A,C) S (C,F#,A#) S (A,C) S (C,F#,A) S (A,C) Q (C,F,A) S (F,D#+,A,C) S (C,F,A) S (F,D#+,A,C) S (C,F,A) S (F,D#+,A,C) S (C,F,A) MTS (F,C+,A,C) S (F,A,C) S (F,F+,A,C) S (C,F,A) S (F,F+,A,C) S (C,F,A) S (F,D#+,A,C) S (C,F,A) Q (A#,C#+) S (C#,C#+,A#) S (A#,C#+) S (C#,C#+,A#) S (A#,C#+) S (D#,C#+,A#) S (A#,C#+) S (F,C+,A) S (A,F) S (F,F+,A) S (A,F) S (F,F+,A) S (A,F) S (F,D#+,A) S (A,F) S (F,C#+,A#) S (A#,C#+) S (C#,C#+,A#) S (A#,C#+) S (C#,C#+,A#) S (A#,C#+) S (D#,C#+,A#) S (A#,C#+) S (F,C+,A) S R S (C+,F+,A-,F) S R S (C+,F+,A-,F) S R S (C+,F+,A-,F) S R C (A#+,C#+,A#-,F) C R C (E,A#+,G--) C R C (A+,F+,F--,F) M F+ C R Q R S (F#-,F#,F#--) S R S (F#-,F#,F#--) S R S (F#-,F#,F#--) S R BTC (D#-,D#,D#--) Q R S F# S R S F# S R S F# S R Q D# S (C,D#) S D# S (C,D#) S D# S (C,D#) S D# Q (A,D#) S (A,D#,F#-) S (A,D#) S (A,D#,F#-) S (A,D#) S (A,D#,F#-) S (A,D#) Q (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A#,C#,A#-,F-) S (A#,A#-,F-) Q R S F# S R S F# S R S F# S R Q D# S (C,D#) S D# S (C,D#) S D# S (C,D#) S D# Q (A,D#) S (A,D#,F#-) S (A,D#) S (A,D#,F#-) S (A,D#) S (A,D#,F#-) S (A,D#) Q (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A#,C#,A#-,F-) S (A#,A#-,F-) S F S R S (A#+) S R S (A#+) S R Q (F#,A#+,D#) S (F#,A#+,A#-,D#) S (F#,A#+,D#) S (F#,A#+,A#-,D#) S (F#,A#+,D#) S (F#,A#+,A#-,D#) S (F#,A#+,D#) S (F#,A+,A#-,D#) S (F#,A#-,D#) S (F#,A+,A#-,D#) S (F#,A#-,D#) S A+ S R S C+ S R Q (F,C+,C#) S (F,C+,A#-,C#) S (F,C+,C#) S (F,C+,A#-,C#) S (F,C+,C#) S (F,C+,A#-,C#) S (F,C+,C#) S (F,A#+,A#-,C#) S (F,A#-,C#) S (F,A#+,A#-,C#) S (F,A#-,C#) S (A#+) S R S (C#+) S R Q (F#,C#+,A#-,D#) S (F#,C+,A#-,D#) S (F#,A#-,D#) S C+ S R S (D#+) S R Q (F,D#+,A#-,D) S (F,D+,A#-,D) S (F,A#-,D) S D+ S R S F+ S R Q (F#,F+,A#-,D#) S (F#,D#+,A#-,D#) S (F#,A#-,D#) S (D#+) S R S (F#+) S R Q (G#,F#+,A#-,F) S (G#,F+,A#-,F) S (G#,A#-,F) S F+ S R S (G#+) S R Q (F#,G#+,A#-,D#) S (F#,F#+,A#-,D#) S (F#,A#-,D#) S (F#+) S R S (A#++) S R Q (F#,A#++,A#-,D#) S (F#,A++,A#-,D#) S (F#,A#-,D#) S (A++) S R S (C++) S R S (A#-,A#++) S (A#-) S (A#-,C#++) S (A#-) S (A#-,C#++) S (A#-) S (A#-,C#++) S (A#-) S (A#-,A#++) S (A#-) S (A#-,F+) S (A#-) S (A#-,F+) S (A#-) S (A#-,F+) S (A#-) S (A#-,C#+) S (A#-) S (A#-,A#+) S (A#-) S (A#-,F) S (A#-) S (A#-,F) S (A#-) S (A#-,C#) S R S (A#-,A#) S R S (A#-,C#,A#+) S R S (A#-,C#,A#+) S R S (F--,A,F) S (F--,F) S (F--,D#++,F) S (F--,F) S (F--,C++) S (F--) S (F--,C++) S (F--) S (F--,A++) S (F--) S (F--,F+) S (F--) S (F--,D#+) S (F--) S (F--,D#+) S (F--) S (F--,C+) S (F--) S (F--,A+) S (F--) S (F--,F) S (F--) S (F--,D#) S (F--) S (F--,C) S R S (F--,A) S R S (A#-,A#,A#+) S R S (A#-,A#,A#+) S R S (A#-,A#,A#+) S (A#+) S (A#-,C#++,A#+) S (A#+) S (A#-,C#++,A#+) S (A#+) S (A#-,C#++,A#+) S (A#+) S (A#-,A#++,A#+) S (A#+) S (A#-,G+,A#+) S (A#+) S (A#-,G+,A#+) S (A#+) S (A#-,G+,A#+) S (A#+) S (A#-,E+,A#+) S (A#+) S (A#-,C#+,A#+) S (A#+) S (A#-,C#+,A#+) S (A#+) S (A#-,C#+,A#+) S (A#+) S (A#-,A#+,A#+) S (A#+) S (A#-,G,C#,A#+) S (A#+) S (A#-,G,C#,A#+) S (A#+) S (A#-,G,C#,A#+) S R C (A#-,G,E,C#) C R C R C R C (D#,G#,C-) C R Q R S G# S R S G# S R S G# S R CTQTS C# S R CTQTS D# S R M (G#-) C=50 S (G#,G#-) S (C#+,G#-) S (C+,G#-) S (C#+,G#-) C=200 Q (D#+,G#-) S (D#+,G#-,G#--) S (D#+,G#-) S (A#+,G#-,G#--) S (A#+,G#-) S (A#+,G#-,G#--) S (A#+,G#-) C (A#+,G#-,C#-) QTS (G#,G#-) S (G#-) C=50 S (G#,G#-) S (C#+,G#-) S (C+,G#-) S (C#+,G#-) C=200 Q (D#+,G#-) S (D#+,G#-,G#--) S (D#+,G#-) S (A#+,G#-,G#--) S (A#+,G#-) S (A#+,G#-,G#--) S (A#+,G#-) C (A#+,G#-,C#-) QTS (G#,G#-) S (G#-) C=50 S G# S (A#+) S B+ S (A#+) C=200 Q G# S (A#-,G#) S G# S (A#-,A#+) S (A#+) S (A#-,A#+) S (A#+) C (D#-,G#) QTS F# S R C=50 S B+ S (C#+) S (D#+) C=200 QTS (C#+) S R Q B+ S (C#-,B+) S B+ S (C#-,C#+) S (C#+) S (C#-,C#+) S (C#+) C (F#-,B+) QTS (A#+) S R C (C#,C#+) C (C#,D#+) Q (C#,E+) S (C#,E+,G--) S (C#,E+) S (C#,D#+,G--) S (C#,D#+) S (C#,D#+,G--) S (C#,D#+) C (C#,C#+,G--) Q (C#,D#+) S (C#,D#+) S C# Q (C#,E+) S (C#,E+,A-) S (C#,E+) S (C#,D#+,A-) S (C#,D#+) S (C#,D#+,A-) S (C#,D#+) C (C#,C#+,A-) QTS (C#,D#+) S C# Q (C#,E+) S (C#,E+,A#-) S (C#,E+) S (C#,D#+,A#-) S (C#,D#+) S (C#,D#+,A#-) S (C#,D#+) C (C#,C#+,A#-) C (C#,D#+) Q (C#,E+) S (C#,E+,A#-) S E+ S (C#,D#+,A#-) S (C#,D#+) S (C#,D#+,A#-) S (D#+) QTS (C#,E+,A#-) S E+ S (C#,G+,A#-) S (C#,G+) S (C#,G+,A#-) S R MTS (F#,G#+,D#,C) S (F#,D#,C) S (F#,A#++,D#,C) S R S (G#,G#+,D#,C-) S (G#,D#,C-) S (G#,F#+,D#,C-) S R Q (G#,F#+,F,C#-) S (G#,F+,F,C#-) S R S (D#+) S R S (C#+) S R Q (G#,C#+,F#,D#-) S (G#,C+,F#,D#-) S R S (A#+) S R S C+ S R Q (G#,D#+,F,F-) S (G#,C#+,F,F-) S R S G# S R S F S R Q (A#+,C+,D#,F#-) S (A#+,A#+,D#,F#-) S R S F# S R S D# S R Q (F,A#+,C#,G#-) S (F,G#,C#,G#-) S R S F S R S C# S R Q (D#,G#-,C,G#--) Q G+ Q (G#+) Q G+ Q (D#+,G#+,C-) S (D#+,G+,C-) S (D#+,G+) Q (D#+,G#+,D#-) S (D#+,G+,D#-) S (D#+,G+) S (D#+,G#+,C-) S (D#+,C-) S (D#+,A#++,C-) S (D#+) S (D#+,G#+,D#-) S (D#+,D#-) S (D#+,F#+,D#-) S (D#+) Q (F+,F#+,C#+,C#-) S (F+,F+,C#+,C#-) S R S (F+,D#+,C#+,F-) S (F+,C#+,F-) S (F+,C#+,C#+,F-) S R Q (C#+,D#-) S (C+,D#-) S R S (D#,A#+,C,F#-) S (D#,C,F#-) S (D#,C+,C,F#-) S R Q (D#+,F-) S (C#+,F-) S R S (F,G#,C#,G#-) S (F,C#,G#-) S (F,F,C#,G#-) S R Q (C+,F#-) S (A#+,F#-) S R S (D#,F#,C,A#) S (D#,C,A#) S (D#,D#,C,A#) S R Q (A#+,G#-) S (G#,G#-) S R S (C#,F,G#--) S (C#,G#--) S (C#,C#,G#--) S R S (G#-,G#-) S (G#-) S (G#,G#-) S R S (D#,G#+,C,G#--) S (D#,C,G#--) S (D#,G#+,C,G#--) S R Q (C#+,F-,C#-) S (C#++,C#+,F-,C#-) S (C#+,F-,C#-) S (C#++,C#+,F-,C#-) S (C#+,F-,C#-) S (C#++,C#+,F-,C#-) S (C#+,F-,C#-) S (C#++,C#+,F-,C#-) S (C#+,F-,C#-) S (G#+,C#+,F-,C#-) S (C#+,F-,C#-) S (G#+,C#+,F-,C#-) S (C#+,F-,C#-) S (G#+,C#+,F-,C#-) S (C#+,F-,C#-) S (F+,C#+,F-,C#-) S (C#+,F-,C#-) S (C#+,C#+,F-,C#-) S (C#+,F-,C#-) S (C#+,C#+,F-,C#-) S (C#+,F-,C#-) S (C#+,C#+,F-,C#-) S (C#+,F-,C#-) S (G#,C#+,F-,C#-) S G# S (G#,D#+,G#--) S G# S (G#,D#+,G#--) S G# S (G#,D#+,G#--) S G# Q (F+,G#-,C#-) S (C#++,F+,G#-,C#-) S (F+,G#-,C#-) S (C#++,F+,G#-,C#-) S (F+,G#-,C#-) S (C#++,F+,G#-,C#-) S (F+,G#-,C#-) S (C#++,F+,G#-,C#-) S (F+,G#-,C#-) S (F+,F+,G#-,C#-) S (F+,G#-,C#-) S (C#+,F+,G#-,C#-) S (F+,G#-,C#-) S (C#+,F+,G#-,C#-) S (F+,G#-,C#-) S (G#,F+,G#-,C#-) S G# S (G#,G#+,G#--) S G# S (G#,G#+,G#--) S G# S (G#,G#+,G#--) S G# C (G#,G#+,C#-) C R Q R S (D#+,G#+,C+,G#--) S R S (D#+,G#+,C+,G#--) S R S (D#+,G#+,C+,G#--) S R C (F+,G#+,C#+,C#-) C R Q R S (G#+,C++,D#+,G#--) S R S (G#+,C++,D#+,G#--) S R S (G#+,C++,D#+,G#--) S R C (F+,C#++,C#+,C#-) C=50 C R S R C=200 Q R S (F-,F,F--) S R S (F-,F,F--) S R S (F-,F,F--) S R M (C#-,C#--,C#) Q R S (D#-,D#--,D#) S R S (D#-,D#--,D#) S R S (D#-,D#--,D#) S R BTQ (C-,C--,C) Q R S F S R S F S R S F S R S (A#,C#) S (C#,A#) S (C#,F#,A#) S (A#,C#) S (C#,F#,A#) S (A#,C#) S (C#,F#,A#) S (A#,C#) Q (C#,F,A#) S (F,C#+,A#,C#) S (C#,F,A#) S (F,C#+,A#,C#) S (C#,F,A#) S (F,C#+,A#,C#) S (C#,F,A#) MTS (F,A#+,A#,C#) S A# S (A#,F) S A# S (A#,F) S A# S (A#,F) S A# Q (A,C) S (C,F#,A) S (A,C) S (C,F#,A#) S (A,C) S (C,F#,A) S (A,C) Q (C,F,A) S (F,D#+,A,C) S (C,F,A) S (F,D#+,A,C) S (C,F,A) S (F,D#+,A,C) S (C,F,A) MTS (F,C+,A,C) S (F,A,C) S (F,F+,A,C) S (C,F,A) S (F,F+,A,C) S (C,F,A) S (F,D#+,A,C) S (C,F,A) Q (A#,C#+) S (C#,C#+,A#) S (A#,C#+) S (C#,C#+,A#) S (A#,C#+) S (D#,C#+,A#) S (A#,C#+) S (F,C+,A) S (A,F) S (F,F+,A) S (A,F) S (F,F+,A) S (A,F) S (F,D#+,A) S (A,F) S (F,C#+,A#) S (A#,C#+) S (C#,C#+,A#) S (A#,C#+) S (C#,C#+,A#) S (A#,C#+) S (D#,C#+,A#) S (A#,C#+) S (F,C+,A) S R S (C+,F+,A-,F) S R S (C+,F+,A-,F) S R S (C+,F+,A-,F) S R C (A#+,C#+,A#-,F) C R C (E,A#+,G--) C R C (A+,F+,F--,F) M F+ C R Q R S (F#-,F#,F#--) S R S (F#-,F#,F#--) S R S (F#-,F#,F#--) S R BTC (D#-,D#,D#--) Q R S F# S R S F# S R S F# S R Q D# S (C,D#) S D# S (C,D#) S D# S (C,D#) S D# Q (A,D#) S (A,D#,F#-) S (A,D#) S (A,D#,F#-) S (A,D#) S (A,D#,F#-) S (A,D#) Q (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A#,C#,A#-,F-) S (A#,A#-,F-) Q R S F# S R S F# S R S F# S R Q D# S (C,D#) S D# S (C,D#) S D# S (C,D#) S D# Q (A,D#) S (A,D#,F#-) S (A,D#) S (A,D#,F#-) S (A,D#) S (A,D#,F#-) S (A,D#) Q (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A,D#,F--,F-) S (A,D#,F-) S (A#,C#,A#-,F-) S (A#,A#-,F-) S F S R S (A#+) S R S (A#+) S R Q (F#,A#+,D#) S (F#,A#+,A#-,D#) S (F#,A#+,D#) S (F#,A#+,A#-,D#) S (F#,A#+,D#) S (F#,A#+,A#-,D#) S (F#,A#+,D#) S (F#,A+,A#-,D#) S (F#,A#-,D#) S (F#,A+,A#-,D#) S (F#,A#-,D#) S A+ S R S C+ S R Q (F,C+,C#) S (F,C+,A#-,C#) S (F,C+,C#) S (F,C+,A#-,C#) S (F,C+,C#) S (F,C+,A#-,C#) S (F,C+,C#) S (F,A#+,A#-,C#) S (F,A#-,C#) S (F,A#+,A#-,C#) S (F,A#-,C#) S (A#+) S R S (C#+) S R Q (F#,C#+,A#-,D#) S (F#,C+,A#-,D#) S (F#,A#-,D#) S C+ S R S (D#+) S R Q (F,D#+,A#-,D) S (F,D+,A#-,D) S (F,A#-,D) S D+ S R S F+ S R Q (F#,F+,A#-,D#) S (F#,D#+,A#-,D#) S (F#,A#-,D#) S (D#+) S R S (F#+) S R Q (G#,F#+,A#-,F) S (G#,F+,A#-,F) S (G#,A#-,F) S F+ S R S (G#+) S R Q (F#,G#+,A#-,D#) S (F#,F#+,A#-,D#) S (F#,A#-,D#) S (F#+) S R S (A#++) S R Q (F#,A#++,A#-,D#) S (F#,A++,A#-,D#) S (F#,A#-,D#) S (A++) S R S (C++) S R S (A#-,A#++) S (A#-) S (A#-,C#++) S (A#-) S (A#-,C#++) S (A#-) S (A#-,C#++) S (A#-) S (A#-,A#++) S (A#-) S (A#-,F+) S (A#-) S (A#-,F+) S (A#-) S (A#-,F+) S (A#-) S (A#-,C#+) S (A#-) S (A#-,A#+) S (A#-) S (A#-,F) S (A#-) S (A#-,F) S (A#-) S (A#-,C#) S R S (A#-,A#) S R S (A#-,C#,A#+) S R S (A#-,C#,A#+) S R S (F--,A,F) S (F--,F) S (F--,D#++,F) S (F--,F) S (F--,C++) S (F--) S (F--,C++) S (F--) S (F--,A++) S (F--) S (F--,F+) S (F--) S (F--,D#+) S (F--) S (F--,D#+) S (F--) S (F--,C+) S (F--) S (F--,A+) S (F--) S (F--,F) S (F--) S (F--,D#) S (F--) S (F--,C) S R S (F--,A) S R S (A#-,A#,A#+) S R S (A#-,A#,A#+) S R S (A#-,A#,A#+) S (A#+) S (A#-,C#++,A#+) S (A#+) S (A#-,C#++,A#+) S (A#+) S (A#-,C#++,A#+) S (A#+) S (A#-,A#++,A#+) S (A#+) S (A#-,G+,A#+) S (A#+) S (A#-,G+,A#+) S (A#+) S (A#-,G+,A#+) S (A#+) S (A#-,E+,A#+) S (A#+) S (A#-,C#+,A#+) S (A#+) S (A#-,C#+,A#+) S (A#+) S (A#-,C#+,A#+) S (A#+) S (A#-,A#+,A#+) S (A#+) S (A#-,G,C#,A#+) S (A#+) S (A#-,G,C#,A#+) S (A#+) S (A#-,G,C#,A#+) S R C (A#-,G,E,C#) C R C R C R C (D#,G#,C-) C R Q R S G# S R S G# S R S G# S R CTQTS C# S R CTQTS D# S R M (G#-) C=50 S (G#,G#-) S (C#+,G#-) S (C+,G#-) S (C#+,G#-) C=200 Q (D#+,G#-) S (D#+,G#-,G#--) S (D#+,G#-) S (A#+,G#-,G#--) S (A#+,G#-) S (A#+,G#-,G#--) S (A#+,G#-) C (A#+,G#-,C#-) QTS (G#,G#-) S (G#-) C=50 S (G#,G#-) S (C#+,G#-) S (C+,G#-) S (C#+,G#-) C=200 Q (D#+,G#-) S (D#+,G#-,G#--) S (D#+,G#-) S (A#+,G#-,G#--) S (A#+,G#-) S (A#+,G#-,G#--) S (A#+,G#-) C (A#+,G#-,C#-) QTS (G#,G#-) S (G#-) C=50 S G# S (A#+) S B+ S (A#+) C=200 Q G# S (A#-,G#) S G# S (A#-,A#+) S (A#+) S (A#-,A#+) S (A#+) C (D#-,G#) QTS F# S R C=50 S B+ S (C#+) S (D#+) C=200 QTS (C#+) S R Q B+ S (C#-,B+) S B+ S (C#-,C#+) S (C#+) S (C#-,C#+) S (C#+) C (F#-,B+) QTS (A#+) S R C (C#,C#+) C (C#,D#+) Q (C#,E+) S (C#,E+,G--) S (C#,E+) S (C#,D#+,G--) S (C#,D#+) S (C#,D#+,G--) S (C#,D#+) C (C#,C#+,G--) Q (C#,D#+) S (C#,D#+) S C# Q (C#,E+) S (C#,E+,A-) S (C#,E+) S (C#,D#+,A-) S (C#,D#+) S (C#,D#+,A-) S (C#,D#+) C (C#,C#+,A-) QTS (C#,D#+) S C# Q (C#,E+) S (C#,E+,A#-) S (C#,E+) S (C#,D#+,A#-) S (C#,D#+) S (C#,D#+,A#-) S (C#,D#+) C (C#,C#+,A#-) C (C#,D#+) Q (C#,E+) S (C#,E+,A#-) S E+ S (C#,D#+,A#-) S (C#,D#+) S (C#,D#+,A#-) S (D#+) QTS (C#,E+,A#-) S E+ S (C#,G+,A#-) S (C#,G+) S (C#,G+,A#-) S R MTS (F#,G#+,D#,C) S (F#,D#,C) S (F#,A#++,D#,C) S R S (G#,G#+,D#,C-) S (G#,D#,C-) S (G#,F#+,D#,C-) S R Q (G#,F#+,F,C#-) S (G#,F+,F,C#-) S R S (D#+) S R S (C#+) S R Q (G#,C#+,F#,D#-) S (G#,C+,F#,D#-) S R S (A#+) S R S C+ S R Q (G#,D#+,F,F-) S (G#,C#+,F,F-) S R S G# S R S F S R Q (A#+,C+,D#,F#-) S (A#+,A#+,D#,F#-) S R S F# S R S D# S R Q (F,A#+,C#,G#-) S (F,G#,C#,G#-) S R S F S R S C# S R Q (D#,G#-,C,G#--) Q G+ Q (G#+) Q G+ Q (D#+,G#+,C-) S (D#+,G+,C-) S (D#+,G+) Q (D#+,G#+,D#-) S (D#+,G+,D#-) S (D#+,G+) S (D#+,G#+,C-) S (D#+,C-) S (D#+,A#++,C-) S (D#+) S (D#+,G#+,D#-) S (D#+,D#-) S (D#+,F#+,D#-) S (D#+) Q (F+,F#+,C#+,C#-) S (F+,F+,C#+,C#-) S R S (F+,D#+,C#+,F-) S (F+,C#+,F-) S (F+,C#+,C#+,F-) S R Q (C#+,D#-) S (C+,D#-) S R S (D#,A#+,C,F#-) S (D#,C,F#-) S (D#,C+,C,F#-) S R Q (D#+,F-) S (C#+,F-) S R S (F,G#,C#,G#-) S (F,C#,G#-) S (F,F,C#,G#-) S R Q (C+,F#-) S (A#+,F#-) S R S (D#,F#,C,A#) S (D#,C,A#) S (D#,D#,C,A#) S R Q (A#+,G#-) S (G#,G#-) S R S (C#,F,G#--) S (C#,G#--) S (C#,C#,G#--) S R S (G#-,G#-) S (G#-) S (G#,G#-) S R S (D#,G#+,C,G#--) S (D#,C,G#--) S (D#,G#+,C,G#--) S R Q (C#+,F-,C#-) S (C#++,C#+,F-,C#-) S (C#+,F-,C#-) S (C#++,C#+,F-,C#-) S (C#+,F-,C#-) S (C#++,C#+,F-,C#-) S (C#+,F-,C#-) S (C#++,C#+,F-,C#-) S (C#+,F-,C#-) S (G#+,C#+,F-,C#-) S (C#+,F-,C#-) S (G#+,C#+,F-,C#-) S (C#+,F-,C#-) S (G#+,C#+,F-,C#-) S (C#+,F-,C#-) S (F+,C#+,F-,C#-) S (C#+,F-,C#-) S (C#+,C#+,F-,C#-) S (C#+,F-,C#-) S (C#+,C#+,F-,C#-) S (C#+,F-,C#-) S (C#+,C#+,F-,C#-) S (C#+,F-,C#-) S (G#,C#+,F-,C#-) S G# S (G#,D#+,G#--) S G# S (G#,D#+,G#--) S G# S (G#,D#+,G#--) S G# Q (F+,G#-,C#-) S (C#++,F+,G#-,C#-) S (F+,G#-,C#-) S (C#++,F+,G#-,C#-) S (F+,G#-,C#-) S (C#++,F+,G#-,C#-) S (F+,G#-,C#-) S (C#++,F+,G#-,C#-) S (F+,G#-,C#-) S (F+,F+,G#-,C#-) S (F+,G#-,C#-) S (C#+,F+,G#-,C#-) S (F+,G#-,C#-) S (C#+,F+,G#-,C#-) S (F+,G#-,C#-) S (G#,F+,G#-,C#-) S G# S (G#,G#+,G#--) S G# S (G#,G#+,G#--) S G# S (G#,G#+,G#--) S G# C (G#,G#+,C#-) C R Q R S (D#+,G#+,C+,G#--) S R S (D#+,G#+,C+,G#--) S R S (D#+,G#+,C+,G#--) S R C (F+,G#+,C#+,C#-) C R Q R S (G#+,C++,D#+,G#--) S R S (G#+,C++,D#+,G#--) S R S (G#+,C++,D#+,G#--) S R C (F+,C#++,C#+,C#-) C=50 C R S R $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 | Q=150 D R Q R D R D (F,F+,C,A) D R D F+ D R D F+ D R S (F,F+,C#,A#) Q R D (A+,F+,D#,C) D R D F+ D R D F+ D R S (A#+,F+,F,C#) Q R S (D#,F,C,A-) D F D R D F D R D (C#,F,A#,A#-) S R D R D (G#--) D R D (F,G#,A#,F#--) D R D (D#,F#) D R D (C#,F,F#--) D R S (C,D#,D#-,G#--) Q R D (F,A#+,D,A#) D R D (A#+) D R D (A#+) D R S (F#,A#+,D#,D#) Q R D (G#,A#+,D,F) D R D (A#+) D R D (A#+) D R S (F#,A#+,D#,F#) Q R D (F,A#+,A#,D-) D R D (A#+) D R D (A#+) D R S (F#,A#+,A#,D#-) Q R D (A#+,C#+,B,B-) D R D (G#,B+) D R D (F#,A#+,B-) D R D (F,G#,G#-,C#-) Q R D R D (F#,A#+,A#,F#--) Q R D R D (D#,F#,F#-,B-) S R D R D (A#-) D R D (F#,A#+,A#,G#--) D R D (F,G#) D R D (D#,F#,G#--) D R D (D,F,F-,A#-) S R D R D B D R D A# S R D R D (D#,F#,A#,D#--) D R D (D,F,A#,A#-) S R D R D B D R D A# S R D R D (D#,F#,A#,D#--) D R D (D,F,A#,A#-) S R D R D (D#,F#,A#,D#--) D R D (D,F,A#,A#-) S R D R D (D#,F#,A#,D#--) D R D (D,F,A#,A#-) S R D R D (F--) D R D (A#-) D R D (C#-) D R D F- D R D A# S R D R D C# D R D C S R D R D E- D R D F- Q R D R D (C,F,F-) S R D R D (A+,F-) D R D (C#,A#+,F-) S R D R D (C+,F-) D R D (C#,D#+,F+,F-) D R D F+ D R D (C#+,F+,F-) D R D (C,C+,F+,F-) S R D R D (F--) D R D (D#,F,F-) S R D R D (A+,F-) D R D (C#,A#+,F-) S R D R D (C#+,F-) D R D (A#,F+,F+,F-) D R D F+ D R D (C,D#+,F+,F-) D R D (A#,C#+,F+,F-) S R D R D (F--) D R D (C#,A#+,F-) S R D R D (C#+,F-) D R D (D#,D#+,F-) S R D R D (F+,F-) D R D (F#,F#+,F-) S R D R D (F+,F-) D R D (D#,F+,F-) S R D R D (D#+,F-) D R D (F#,F#+,F-) S R D R D (F+,F-) D R D (D#,F+,F-) D R D (D#+) D R D (D#+,F#-) D R D (D#,D#+,F-) D R D (D#+) D R D (F+,A) D R D (C#,C#+,A#) D R D C+ D R D (A#+,F#-) D R D (D#,A+,F-) D R D (A#+) D R D (C+,A-) D R D (C#,A#+,A#-) D R D (C#+) D R D (D#+,F#-) D R D (D#,D#+,F-) D R D (D#+) D R D (F+,A) D R D (C#,C#+,A#) D R D C+ D R D (A#+,F#-) D R D (D#,A+,F-) D R D (A#+) D R D (C+,A-) D R D (C#,A#+,A#-) D R D (C#+) D R D (D#+,F#-) D R D (D#,D#+,F-) D R D (D#+) D R D (F+,A) D R D (C#,C#+,A#) D R D C+ D R D (A#+,G#-) D R D (D#,D#+,F#-) D R D F+ D R D (F#+,D#-) D R D (A,A+,F-) D R D G D R D (F,D#-) D R D (A#,F,C#-) D R D G D R D (A+,C-) D R D (F-,A#+,A#-) D R D C+ D R D (C#+,G#--) D R D (F#-,D#+,F#--) D R D F+ D R D (F#+,F--) D R D (F#-,F#+,D#--) D R D (G#+) D R D (E-,A#++,E--) D R D (F-,A#++,F--) D R D (F,A#++,F--) D R D (D#,A++,F--) D R D (C#,A#++,F--) Q R D R D (F-,F+,A-) D R D (F+,A-) D R D (F+,A-) D R D (F-,F+,F,A#-) D R D F D R D F D R D (A,F+,F,C-) D R D (F+,C-) D R D (F+,C-) D R D (A#,F+,F,C#-) D R D F D R D F D R D (A#,A#+,F,D--) D R D (A#+,D--) D R D (A#+,D--) D R D (A#,A#+,F#,D#--) Q R D R D (A,F,C,F--) Q R D R QTS (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) QTD (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) QTD (A#,A#-,F#--) D (A#-,A#,A#-,F#--) QTD (A#,A#-,F#--) D (A#-,A#,A#-,F#--) QTD (A#,A#-,F#--) D (A#-,A#,A#-,F#--) QTD (A#,A#-,F#--) D (A#-,A#,A#-,F#--) STD (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) STD (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) STD (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) STD (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) D (A#-,A#,A#-,F#--) D (A#,A#-,F#--) Q=75 D (R,A#,A#-,F#--) D (C#,A#-,F#--) D (F,A#-,F#--) S (A#+,A#-,F#--) D (C#+,A#-,F#--) S (C+,A#-,F#--) D (E,A#-,F#--) D (A#-) D (A#-,F--) D (C#+,A#-,F--) D (C+,A#-,F--) D (C+,A#-) D (F,A#-) D (A#-) D (A#-,E--) D (C#+,A#-,E--) D (C+,A#-,E--) D (C+,A#-) D (G,A#-) D (A#-) D (A#-,F--) D (C#+,A#-,F--) D (C+,A#-,F--) D (C+,A#-) D (F,A#-) D (A#-) D (A#-,F#--) D (C#+,A#-,F#--) D (C+,A#-,F#--) D (C+,A#-) D (E,A#-) D (A#-) D (A#-,F--) D (C#+,A#-,F--) S (C+,A#-,F--) D (F,A#-,F--) S (C#+,A#-,F--) D (C+,A#-,F--) S (F,A#-,F--) D (C#+,A#-,F--) S (C+,A#-,F--) D (F,A#-,F--) S (D+,A#-,F--) D (C+,A#-,F--) S (F,A#-,F--) D (D#+,A#-,F--) S (D+,A#-,F--) D (G,A#-,F--) S (F+,A#-,F--) D (D#+,A#-,F--) S (G,A#-,F--) D (G+,A#-,F--) S (F+,A#-,F--) D (A+,A#-,F--) S (A++,A#-,F--) D (G+,A#-,F--) S (A#+,A#-,F--) D (A#++,A#-,F--) S (A++,A#-,F--) D (C+,A#-,F--) S (C++,A#-,F--) D (A#++,A#-,F--) S (D+,A#-,F--) D (D++,A#-,F--) S (C++,A#-,F--) D (D#+,A#-,F--) Q=25 S (G,D#+,A#,F--) Q (A+,D#+,C,F--) Q=50 D (D,A#+,A#-) D (D,A#+) S (A#+,D+,A#-) S (D+,F+,A#-) Q=100 D (D+,F+,A#-) D R D (C+,D#+,F--) D R D (A#+,D+,A#-) D R D (F,C+,F--) D R D (D,A#+,A#-) D R D (F,C+,F--) D R QTD (D,A#+,A#-) D R D (D,A#+,A#-) Q=400 D (D,A#+,A#-) D R D (D,A#+,A#-) D R Q=100 QTD (F,C+,F--) D R D (F,C+,F--) Q=400 D (F,C+,F--) D R D (F,C+,F--) D R Q=100 Q (A#+,D+,A#-) Q=200 D (A#+,D+,A#-) D (A#-) D (A#+,A#-) D (A#-) D (C+,A#-) D (A#-) D (D+,A#-) D R D (D#+,G--) D (G--) D (D+,G--) D (G--) D (D#+,G--) D (G--) D (F+,G--) D R D (G+,D#--) D (D#--) D (F+,D#--) D (D#--) D (G+,D#--) D (D#--) D (A++,D#--) D R D (A#++,D--) D (A#++) D (A#++,D#--) D (A#++) D (A#++,D--) D (A#++) D (A#++,C--) D (A#++) D (A#++,A#--) D (A#--) D (A#+,A#--) D (A#--) D (C+,A#--) D (A#--) D (D+,A#--) D R D (D#+,G--) D (G--) D (D+,G--) D (G--) D (D#+,G--) D (G--) D (F+,G--) D R D (G+,D#--) D (D#--) D (F+,D#--) D (D#--) D (G+,D#--) D (D#--) D (A++,D#--) D R D (A#++,D--) D (A#++) D (A#++,D#--) D (A#++) D (A#++,D--) D (A#++) D (A#++,C--) D (A#++) D (A#++,A#--) D (A#--) D (A#+,A#--) D (A#--) D (C+,A#--) D (A#--) D (D+,A#--) D R D (D#+,G--) D (G--) D (D+,G--) D (G--) D (D#+,G--) D (G--) D (F+,G--) D R D (G+,D#--) D (D#--) D (F+,D#--) D (D#--) D (G+,D#--) D (D#--) D (A++,D#--) D R D (A#++,D--) D R D (A++,D#--) D R D (A#++,D--) D R D (C++,C--) D R STD (D++,A#--) D R S (F+,A#-) Q=400 D (F+,A#-) D R D (D++,A#-) D R Q=200 S (D#,D++,C,A-) D (D#,C++,C,A-) D A- S (D#,D#+,C,A-) Q=400 D (D#,D#+,C,A-) D A- D (D#,C++,C,A-) D R Q=200 S (D,C++,A#,A#-) D (D,A#++,A#,A#-) D (A#-) S (D,D+,A#,A#-) Q=400 D (D,D+,A#,A#-) D (A#-) D (D,A#++,A#,A#-) D R Q=200 S (C,A#++,A,F--) D (C,A++,A,F--) D R QTSTD (C,A++,A,F--) D R S (D,A#++,A#,A#-) Q=400 D (D,A#++,A#,A#-) D R D (D,D++,A#,A#-) D R Q=200 S (D#,D++,C,A-) D (D#,C++,C,A-) D A- S (D#,D#+,C,A-) Q=400 D (D#,D#+,C,A-) D A- D (D#,C++,C,A-) D R Q=200 S (D,C++,A#,A#-) D (D,A#++,A#,A#-) D (A#-) S (D,D+,A#,A#-) Q=400 D (D,D+,A#,A#-) D (A#-) D (D,A#++,A#,A#-) D R Q=200 S (C,A#++,A,F--) D (C,A++,A,F--) D R QTSTD (C,A++,A,F--) D R S (D,A#++,A#,A#-) Q=400 D (D,A#++,A#,A#-) D R D (D,D++,A#,A#-) D R QTD (D#,D++,C,A-) D R D (D#,C++,C,A-) D R QTD (D#,D#+,A,F--) D R D (D#,C++,A,F--) D R QTD (D,C++,A#,A#-) D R D (D,A#++,A#,A#-) D R QTD (D,D+,A#,D-) D R D (D,A#++,A#,D-) D R STD (C,A++,F-,F-) D (C,A++,F-) D (E-,A++,F-,F--) D (C,F-,F--) D (C,C+,F-,F--) D R Q=200 STD (C,F+,F-,F--) D F+ STD (D,F+,A#) D R D (D,G+,A#) D (D,F+,A#) D (D,D#+,A#) D D+ S (C,C+,F-) D (C,F-,F--) D (C,C+,F-) STD (C,F+,F-,F--) D F+ STD (D,F+,A#) D R D (D,G+,A#) D (D,F+,A#) D (D,D#+,A#) D D+ S (C,C+,F-) Q=400 D (C,C+,F-,F--) D (F--) D (D,F+,A#,F--) D R Q=200 D (D,G+,A#,F--) D (D,F+,A#,F--) D (D,D#+,A#,F--) D D+ S (C,C+,F-) Q=400 D (C,C+,F-,F--) D (F--) D (D,F+,A#,F--) D R Q=200 D (D,G+,A#,F--) D (D,F+,A#,F--) D (D,D#+,A#,F--) D D+ S (C,C+,F-) Q=400 D (C,C+,F-,F--) D (F--) D (D,F+,A#,F--) D R Q=200 D (D,G+,A#,F--) D (D,F+,A#,F--) D (D,D#+,A#,F--) D D+ S (C,C+,F-) Q=400 D (C,C+,F-,F--) D (F--) D (D,F+,A#,F--) D R Q=200 D (D,G+,A#,F--) D (D,F+,A#,F--) D (D,D#+,A#,F--) D D+ D (C,C+,F-,F--) D (F--) D (F+,F--) D F+ D (D#+) D R D D+ D R D C+ D R S D+ D C+ D R D (A#+) D R D A+ D R S D+ D C+ D R D (A#+) D R D A+ D R S (A#+) D A+ D R D G D R D F D R S (A#+) D A+ D R D G D R D F D R S (A#+) D A+ D R D G D R D F D R S (A#,A#+) D (A,A+) D R D (G-,G) D R D (F-,F) D R D (D#-,D#) D R D (D-,D) D R D (C-,C) D R STD (D-,A#,A#-) C (D-,A#) D R Q (D-,F-) CTQ (F-,D) STD (F-,C) D (D-,A#) CTD (F-,C,F--) D (F-,C) D (F-,C,F--) D (F-,C) D (F-,C,A-) D (F-,C) D (F-,C,C-) D (F-,C) D (F-,C,D#-) D (F-,C) D (F-,C,F-) D (F-,C) D (F-,C,A) D (F-,C) D (F-,C,C) D (F-,C) D (F-,C,D#) D (F-,C) D (F-,C,F) D (F-,C) D (F-,C,D#) D (F-,C) D (F-,C,C) D R D (F-,C,A) D (F-,C) D (F-,C,C) D (F-,C) D (F-,C,A) D (F-,C) D (F-,C,F-) D (F-,C) D (F-,C,D#-) D (F-,E-) D (F-,C,C-) D R D (F-,F-,A-) D (F-,F-) D (F-,F-,C-) D (F-,F-) STD (C,D#,F--) QTD (C,D#) STD (A#,D) D (F-,C) CTD (D,A#-,A#--) D (D,A#-) D (D,A#-,A#--) D (D,A#-) D (D,A#-,D--) D (D,A#-) D (D,A#-,F--) D (D,A#-) D (D,A#-,A#-) D (D,A#-) D (D,A#-,D-) D (D,A#-) D (D,A#-,F-) D (D,A#-) D (D,A#-,A#) D (D,A#-) D (D,A#-,D) D (D,A#-) D (D,A#-,A#) D (D,A#-) D (D,A#-,F-) D (D,A#-) D (D,A#-,D-) D (D,A#-) D (G#--,D+,A#) D (D+,A#) D (G--,D+,A#) D D+ D (G#--,D+) D D+ D (G#--,D+) D D+ D (G#--,D+) D (G#--) S (G#--,A#+) D (G#--,D+,A#) D (D+,A#) D (G--,D+,A#) D D+ D (G#--,A#+) D (A#+) D (G#--,A#+) D (A#+) Q (G#--,F+) STD (G#--,D#+) D D+ D (G--,D#+,A#) D (D#+,A#) D (F#--,D#+,A#) D (D#+) D (G--,D#+) D (D#+) D (G--,D#+) D (D#+) STD (G--,D#+) D (G--) Q (G--,A#+) D (G--,D#+,A#) D (D#+,A#) D (F#--,D#+,A#) D (D#+) D (G--,A#+) D (A#+) D (G--,A#+) D (A#+) Q (G--,G+) STD (G--,F+) D (G--,D#+) Q=100 QTD (A+,F+,A-) D (A+,F+) S (A+,F+,F--) S (A+,F+,A-) D (A+,F+,F--) D (F+,F--) S (A+,F+,C-) Q=200 STD (A#+,F+,A#-) D (C+,F+,A-) Q=100 STD (A#+,F+,A#-) D (A#+,F+) S (A#+,F+,F--) S (A#+,F+,A#-) D (A#+,F+,F--) D (F+,F--) S (A#+,F+,D-) Q=200 STD (C+,F+,C-) D (D+,F+,A#-) QTD (C+,F+,A-) D (C+,F+) D (C+,F+,F--) D F+ QTS (A+,F+,C-) D (A#+,F+,A#-) D (C+,F+,A-) QTD (A#+,F+,A#-) D (A#+,F+) D (A#+,F+,F--) D F+ QTS (A#+,F+,D-) D (C+,F+,C-) D (D+,A#-) D (C+,F+,F-) D F+ S (F,F+) D (D#,F+) D F+ D (D,F+) D F+ D (C,F+) D R S (D,F+) D (C,D#+) D R D (A#,D+) D R D (A,C+) D R S (A#,D+) D (A,C+) D R D (G-,A#+) D R D (F-,A+) D R S (F-,F+) D (G-,E+) D R D (C-,A#++) D R D (F-,A++) D F- D (F-,F+) D F+ D E+ D R D (A#++) D R D (A++) D R S F D E D R D (A#+) D R D A+ D R S F- D (D#-) D R D C D R D (D#-) D R S D- Q=300 D (C+,C-) D C+ D D+ D (D+,A) S (D#+) Q=150 S (F,F+,D,A#-) D R D D+ D (D#+) D F+ S (G,G+,D#,A#-) D R D G+ D (A++) D (A#++) S (F,F+,D,A#-) D (F,F+,D) D (F,F+,D,F--) D (F,F+,D,G--) D (F,F+,D,A-) S (F,F+,D,A#-) D R D (A#,F+) D (A#,D#+) D (A#,D+) STD (A,C+) D (A,D#+) D (A,D+) D (A,C+) STD (A#,A#+) D (A#,D+) D (A#,C+) D (A#,A#+) S (C,A+) D R D (A,A+) D (A#,A#+) D (C,C+) S (F-,F) D R Q=300 D (A+,C+,F,D#-) D R D (A#+,D+,F,D-) D R D (C+,D#+,F,C-) D R Q (D+,F+,A#,A#-) S R D (A#+,D+,A#) D R D (C+,D#+,A#) D R D (D+,F+,A#) D R Q (D#+,G+,A#,A#-) S R D (D#+,G+,A#) D R D (F+,A++,A#) D R D (G+,A#++,A#) D R Q (D+,F+,A#,A#-) S (D+,F+,A#) D (D+,F+,A#,F--) D (D+,F+,A#) D (D+,F+,A#,G--) D (D+,F+,A#) D (D+,F+,A#,A-) D (D+,F+,A#) Q=150 S (D+,F+,A#,A#-) D R D (A#,F+) D (A#,D#+) D (A#,D+) STD (A,C+) D (A,D#+) D (A,D+) D (A,C+) STD (A#,A#+) D (A#,D+) D (A#,C+) D (A#,A#+) S (C,A+) D R Q=300 D (F,F--) D R D (F,G--) D R D (F,A-) Q=150 S (A#+,A#-) D R D (C,G+) D (C,F+) D (C,D#+) STD (B,D+) D (B,F+) D (B,D#+) D (B,D+) STD (C,C+) D (C,D#+) D (C,D+) D (C,C+) S (D,B+) D R Q=300 D (G--,G--) D R D (A-,A-) D R D (B-,B-) D R Q=150 S (C-,C-) D R D (A#,A#++,D#-) D (A#,A#++,B) D (A#,G+,D#-) STD (A#,F+,D-) D (A#,G#+,D-) D (A#,G+,D-) D (A#,F+,D-) STD (A#,D#+,D#-) D (A#,G+,D#-) D (A#,F+,D#-) D (A#,D#+,D#-) Q=50 Q (D+,F+,A#,A#-) Q (D+,F#+,A#,A#-) S (D#+,G+,D#-) Q=200 D (D#+,G+,D#-) D G- D (D#+,G+,G#-,D#-) D A# D (D#+,G+,C,D#-) D D D (D#+,G+,D#,D#-) D F D (D#+,G+,G,D#-) D A# D (D#+,G+,C,D#-) D D D (D#+,G+,D#,D#-) D F D (D#+,G+,G,D#-) D G# D (D#+,G+,A#+,D#-) D G D (D#+,G+,G#,D#-) D (A#+) D (D#+,G+,C+,D#-) D D+ D (D#+,G+,D#+,D#-) D F+ D (D#+,G+,G+,D#-) D (D#+,G+,F+) D (D#+,G+,G+,D#-) D (A++) D (E+,E+,A#++,E-) D (E+,E+,A#++) D (E+,E+,A#++,E-) D (A#++) D (F+,F+,A#++,F-) D (F+,F+,A#++) D (F+,F+,A#++,F-) D (A#++) D (F#+,F#+,A#++,F#-) D (F#+,F#+,A#++) D (F#+,F#+,A#++,F#-) D (A#++) D (G+,G+,A#++,G-) D (G+,G+,A#++) D (G+,G+,A++,G-) D G+ D (A++,A++,D+,A) D C+ D (A#++,A#++,A#+,A#) D A+ D (A#,D-,G,A#-) D F D (A#,D#-,D#,C-) D D D (A#,F-,C,D-) D A# Q=50 D (C,D#,G-,D#-) S R D R D (C,A,F-) S R D R $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 | C=175 V=4 #=F Y B. R,C-G G- G R Q G- C-G D G R Q D C-G B G R Q B C-G E G R Q E Y B. R,Q A Q C Q A Q D Q F- Q D Q G- Q B Q G- Q C Q E- Q C Y B. R,Q F- Q A Q F- Q B Q D- Q B Q E- Q G- Q E- Q A Q C- Q A Y B. R,Q F- Q D- Q F- Q G- Q D- Q G- Q A Q D- Q A Q B Q D- Q B Y B. R,S C S B M C Q D G C Q-G B Q A Q G- Q F- Q E- Q D- Y B. R,G C Q-G B Q A Q G- Q F- Q E- Q D- Q C#- Q A- Q-G D- G R D D- D E- Q. D- Q C#- Y B. R,C-G D,Q D- Q F- G R Q (D-,D) C-G A+,Q C#- Q E- G R Q (C#-,A+) C-G F,Q D- Q A G R Q (D,F) C-G B+,Q G- Q B G R Q (D,B+) Y B. R,C-G C#,Q E Q G G R Q (C#,E) C-G F-,Q A+ Q C# G R Q (F-,A+) C-G B,Q D Q F G R Q (B,D) C-G E-,Q G Q B G R Q (E-,G) Y B. R,C-G A,Q C# Q E G R Q (A,C#) C-G D-,Q F Q A G R Q (D-,F) C-G G-,Q B Q D G R Q (G-,B) C C#-,Q E Q G- Q (B-,E) Y C-G A-,Q C# Q A G R Q (A-,C#) C-G B-,Q D Q A G R Q (B-,D) C-G C#-,Q E Q A G R Q (C#-,E) C-G D-,Q F Q A G R Q (D-,F) Y B. R,Q E-,S G S A+ M G,Q F- Q D- Q C#- Q B- Q (A-,A+) C D-,G G Q-G F Q E Q (F-,D) C A,Q C# Q B Q (A-,A) Y B. R,C D-,G G Q-G F Q E Q (F-,D) C A,Q C# Q B Q (G-,A) Q (F-,D) Q (E-,E) Q (D-,C) C-G G-,Q B Q A G R Q (F-,G-) Y B. R,Q (E-,C) Q (D-,D) Q (C-,B) C-G F-,Q A Q G- G R Q (E-,F-) Q (D-,B) Q (C-,C) Q (B-,A) C-G E-,Q G- Q F- G R Q (D-,E-) Y B. R,Q (C-,A) Q (B-,B) Q (A-,G-) C-G D-,Q F- Q E- G R Q (C-,D-) Q (B-,G-) Q (A-,F-) Q (B-,G-) Q (C-,A) Q (B-,G-) Q (C-,A) Y B. R,Q (D-,B) Q (C-,A) Q (D-,B) Q (E-,C) Q (D-,B) Q (E-,C) C F-,Q A Q B Q (D-,C) C G-,Q B Q C Q (G--,D) Y B. R,C F-,Q A Q B Q (D-,C) C G-,Q B Q C Q (G--,D) C G#-,Q B Q C Q (E-,D) C A,Q C Q D Q (A-,E) Y B. R,C G#-,Q B Q C Q (E-,D) C A,Q C Q D Q (A-,E) C F-,Q A Q B Q (D-,C) C G-,Q B Q C Q (G--,D) Y B. R,C F-,Q A Q B Q (D-,C) C G-,Q B Q C Q (G--,D) C A,Q C Q D Q (G-,E) C F-,Q D Q E Q (D-,C) Y B. R,C-G (G-,G),Q B Q D G R Q (G-,B,G) C-G (F-,D+),Q A Q D G R Q (F-,A+,D+) C-G (G,B+),Q G- Q B G R Q (G-,B+),Q-G G G R C-G (G,E+),Q C Q E G R Q (C,G,E+) Y B. R,C-G (F-,F),Q A+ Q C+ G R Q (F-,F,A+) C-G (B,D),Q D+ Q F G R Q (B,D,D+) C-G (E-,E),Q G Q B+ G R Q (E-,E,G) C-G (A,C),Q C+ Q E G R Q (A,C,C+) Y B. R,C-G (D-,D),Q F Q A+ G R Q (D-,D,F) C-G (G-,B),Q B+ Q D G R Q (G-,B,B+) C-G (C-,C),Q E Q G G R Q (G-,E),Q-G C- G R C-G (C-,E-),Q A+ Q C G R Q (C-,E-,A+) Y B. R,C-G (D-,A),Q F Q D G R Q (A,F),Q-G D- G R C-G (D-,B),Q G Q D G R Q (B,G),Q-G D- G R C-G (D-,F-),Q A+ Q D G R Q (F-,A+),Q-G D- G R C G-,C-G D-,Q B+ Q D G R Q (G,B+),Q-G D- G R Y B. R,M F,Q D-,S C+ S B M C+,Q E- Q F- Q D- Q (E-,G) Q (F-,A+,D+) C G-,C-G D,Q B+ Q A+ G R Q (G--,G),Q-G D G R C D-,C-G D,Q F Q E G R Q (C-),Q-G D G R Y B. R,C (B-,D),Q B+ Q A+ Q (C-,E,G) C D-,C-G D,Q F Q D G R Q (F-,D,D+) C (A,C#+),Q A+ Q G- Q (B,F),Q-G D+ G R C (G-,D+),Q E Q F Q (G,C#+),Q-G A G R Y C A,C-G (D-,F),Q D+ Q E+ G R Q (D-,D,F,D+) C-G (A,E,A+),Q C#+ Q D+ G R Q (A,E,C#+),Q-G A+ G R C-G (F-,D,A+),Q F+ Q G+ G R Q (F-,F+),Q-G (D,A+) G R C-G (B,D,A+),Q D+ Q E+ G R Q (B,D,A+,D+) Y C G,C-G (E,G+),Q E- Q G- G R Q (E-,B+),Q-G (E,G) G R C-G (E,C#+),Q (A,G+) Q (C#-,A++) G R Q (A,E,G+),Q-G C#+ G R C-G (D,C#+,F+),Q D- Q F- G R Q (D-,C#+),Q-G (D,F+) G R C-G (D,B+),Q (G-,F+) Q (B-,G+) G R Q (G-,D,F+),Q-G B+ G R Y Y C-G (C#,B+,E+),Q C#- Q E- G R Q (C#-,B+),Q-G (C#,E+) G R C-G (C#,A+),Q (F-,E+) Q (A+,F+) G R Q (F-,C#,E+),Q-G A+ G R C-G (B,A+,D+),Q B- Q D- G R Q (B-,A+),Q-G (B,D+) G R C B,C-G G,Q (E-,D+) Q (G--,E+) G R Q (E-,G,D+),Q-G E G R Y C-G (E,A+,C#+),Q A- Q C#- G R Q (A-,E,C#+),Q-G A+ G R C-G (D,A+,F+),Q D- Q A- G R Q (D-,D,F+),Q-G A+ G R C-G (E,A+,C#+),Q A- Q E- G R Q (A-,E,C#+),Q-G A+ G R C-G (D,A+,D+),Q F- Q A- G R Q (F-,D,D+),Q-G A+ G R Y C-G (C#,E),Q A+,S G- S F- M G-,Q E+ G R Q-G (C#,E,A+) G R C-G (C#,E),Q A+ Q E+ G R Q (A,C#,E),Q-G A+ G R C (D,A+,D+),Q F- Q A C. R,Q F- Q B Q B- Q (B,F,A+),Q-G D+ G R Y C (E,G,D+),Q E- Q G- C. R,QE- Q A Q A- Q (A,E,G),Q-G C#+ G R C (D,F,C#+),Q D- Q F- C. R,Q D- Q G- Q G-- Q(G-,D,F),Q-G B+ G R Y C (C#,E,B+),Q C#- Q E- C. R,Q C#- Q F- Q F-- Q (F-,C#,A#+),Q-G F G R C-G (D,F,B+),Q B- Q D- G R Q (B-,D,B+),Q-G F G R C F,C-G C#,Q (F-,A#+) Q (F--,B+) G R Q (F-,C#,A#,C#+) Y C (D,F),C-G B+,Q B- Q D- G R Q (B-,D+),Q-G (F,B+) G R C-G (F,A#+),Q (F-,C#+) Q (F--,D+) G R Q (F-,A#+,E+),Q-G F G R C-G (F,B+,D+),Q B- Q D- G R Q (B-,F),Q-G (B+,D+) G R C-G (G,B+),Q (E-,D+) Q (E--,E+) G R Q (E-,B+,D+),Q-G G G R Y C-G (G,A+,C#+),Q A- Q C#- G R Q (A-,G),Q-G (A+,C#+) G R C-G (F,A+),Q (D-,C#+) Q (D--,D+) G R Q (D-,A+,C#+),Q-G F G R C-G (F,G,B+),Q G-- Q B- G R Q (G--,F),Q-G (G,B+) G R C-G (E,G,B+),Q C#- Q B- G R Q (C#-,E,G,B+) Y C (F--,C#+),C-G F,Q A#+ Q B+ G R Q (F-,A#,C#+),Q-G F G R C D-,C-G (B,F),Q B+ Q C#+ G R Q (B-,B,F,D+) C (E-,G-),C-G G,Q C#+ Q D+ G R Q (C#-,E,G,B+) C F-,C-G (C#,F,A#+) G R Q (F--,C#,A#+),Q-G F G R Y C B-,C-G (D,F),Q B+ Q D+ G R BTC R,Q B+,Q-G (D,F) G R C-G (D,F),Q F+ Q B+ G R Q (D,F+),Q-G F G R C-G (B,F),Q D+ Q F+ G R Q (B,F,D+) C G,C-G E,Q G+ Q B+ G R Q (E,G+),Q-G B+ G R Y B. R,C-G B+,Q (C#,E+) Q (E,C#+) G R Q (C#,B+,E+) C-G (F,F+),Q A#+ Q C#+ G R Q (F,A#+,F+) C-G F,Q (B,D+) Q (D,B+) G R Q (B,F,D+) C-G E+,Q (E,G) Q (G-,B+) G R Q (E,E+),Q-G G G R Y B. R,C-G G,Q (A,C#+) Q (C#,A+) G R Q (A,G,C#+) C-G D+,Q (D,F) Q (F-,A+) G R Q (D,D+),Q-G F G R C-G F,Q (G-,B+) Q (B,G) G R Q (G-,F,B+) C (E,C#+),Q C# Q E- Q (C#,G,E+) Y B. R,C-G (F,C#+),Q A# Q F- G R Q (A#,C#+),Q-G F G R C-G (F,D+),Q B Q F- G R Q (B,D+),Q-G F G R C-G (F,A#+),Q C# Q F- G R Q (C#,A#+),Q-G F G R C-G (F,B+),QD Q F- G R Q (D,B+),Q-G F G R Y B. R,C-G F,Q A#+,S E S D M E,Q C#+ G R Q-G (F,A#+) G R C-G F,Q A#+ Q C#+ G R Q (E,A#+),Q-G F G R C-G F,Q (D,B+) Q (C#,C#+) G R Q (B,D+),Q-G F G R C-G F,Q (A#,A#+) Q (G#-,B+) G R Q (F-,A#+),Q-G F G R Y B. R,C-G F,Q (D,B+) Q (C#,C#+) G R Q (B,D+),Q-G F G R C-G F,Q (A#,C#+) Q (G#-,B+) G R Q (F-,A#+),Q-G F G R C F,Q (D,B+) Q (C#,A#+) M R,Q (D,B+) Q (E,C#+) Q (D,B+) Q (E,C#+) Y B. R,Q (F,D+) Q (E,C#+) Q (D,B+) Q C#,D A#+ D B+ Q. A#+ Q F Q E,Q-G B+ G R C D,Q B+ Q D+ Q (B,F) C E,Q G Q B+ Q (D,E) Y B. R,C C#,Q A+ Q C#+ Q (A,E) C-G D,Q F Q A+ G R Q (C,D) C B,Q G Q B+ Q (G-,D) C-G C#,Q E Q G G R Q (B,C#) Y B. R,C A,Q F Q A+ Q (F-,C#) C-G B,Q D# Q F G R Q (A,B) C G-,Q E Q G Q E-,Q-G B G R C-G B,Q D# Q F G R Q (A,B) Y B. R,C G-,Q E Q G Q E-,Q-G B G R C-G B,Q D# Q F G R Q (A,B) M. R,Q G- Q B Q E Q F- Q A Q D# Y B. R,Q G- Q B Q E Q F- Q A Q D# Q E- Q B Q G Q D#- Q B Q F Y B. R,Q E- Q B Q G Q D#- Q B Q F Q E- Q B Q G Q F- Q D# Q A+ Y B. R,C G-,Q B+ Q E Q (A,F) Q B,D D# D E Q. D# Q A Q B,Q-G E G R C-G E,Q G- Q F- G R Q (E-,E) C-G B+,Q D#- Q B- G R Q (D#-,B+) Y B. R,C-G G,Q E- Q G- G R Q (E-,G) C-G C+,Q A Q C G R Q (A,C+) Q (D,F) Q (D-,A+) Q (D,F) Q (G-,B+) Q (B,D) Q (G-,B+) Y B. R,Q (C,E) Q (C-,G) Q (C,E) Q (F-,A+) Q (A,C) Q (F-,A+) Q (B,D) Q (B-,F) Q (B,D) Q (E-,G) Q (G-,B) Q (E-,G) Y B. R,Q (A,C) Q (A-,E) Q (A,C) Q (A-,F) Q (A,C) Q (A-,F) C-G B-,Q D# Q B G R Q (B-,D#) C-G C#-,Q E Q B G R Q (C#-,E) Y B. R,C-G D#-,Q F Q B G R Q (D#-,F) C-G E-,Q G Q B G R Q (E-,G) MTQ A+,Q F- Q D#- Q B- Q F- Q D#- Q (B-,B+) Y B. R,Q (E-,G) Q (G-,E) Q (B,G) Q (D#-,B+) Q (F-,F) Q (B,D#) Q (E-,B+) Q (G-,G) Q (B,E) Q (D#-,B+) Q (F-,F) Q (B,D#) Y B. R,Q (E-,B+) Q (G-,G) Q (B,E) Q (F-,D+) Q (A,A+) Q (D,F) Q (G-,D+) Q (B,B+) Q (D,G) Q (F-,D+) Q (A,A+) Q (D,F) Y B. R,Q (G-,D+) Q (B,B+) Q (D,G) Q (G#-,E+) Q (B,B+) Q (E,G#) Q (A,E+) Q (C,C+) Q (E,A+) Q (G#-,E+) Q (B,B+) Q (E,G#) Y B. R,Q (A,E+) Q (C,C+) Q (E,A+) Q (F-,D+) Q (A,A+) Q (D,F) Q (G-,D+) Q (B,B+) Q (D,G) Q (D-,C+) Q (F-,A+) Q(A,F) Y B. R,Q (D-,B+) Q (G-,G) Q (B,D) Q (D-,C+) Q (F-,A+) Q (A,F) C G-,Q B+ Q C+ Q (C,A+) C B,Q G Q A+ Q (A,F) Y B. R,C B,C-G G-,Q G Q A+ G R Q (G-,B+),Q-G D G R C-G (D,F),Q A+ Q D+ G R Q (D,A+),Q-G F G R C-G B,Q (F,D+) Q (B+,D) G R Q (B,F,D+) C-G (E,G),Q B+ Q E+ G R Q (E,B+),Q-G G G R Y B. R,C-G C+,Q (A,G) Q (C,A+) G R Q (A,G),Q-G C+ G R C-G F,Q (D,C+) Q (F-,D+) G R Q (D,C+),Q-G F G R C-G B+,Q (G-,F) Q (B,G) G R Q (G-,F),Q-G B+ G R C-G E,Q (C,B+) Q (E-,C+) G R Q (C,B+),Q-G E G R Y B. R,C-G A+,Q (F-,E) Q (A,F) G R Q (F-,E),Q-G A+ G R C-G D,Q (B,A+) Q (D-,B+) G R Q (B,A+),Q-G D G R C-G G,Q (E-,D) Q (G-,E) G R Q (E-,D),Q-G G G R C-G C,Q (A,G) Q (C-,A+) G R Q (A,C,G) Y B. R,C-G (D,F),Q D- Q F- G R Q (D-,F),Q-G D G R C-G (D,B+),Q G- Q D- G R Q (G-,B+),Q-G D G R C-G (D,F),Q D- Q A G R Q (D-,F),Q-G D G R C-G (D,G),Q B Q D- G R Q (B,G),Q-G D G R Y B. R,MTQ-G C,C-G D,Q F Q A+ G R Q-G (D,F) G R C-G D,Q F Q A+ G R Q (C,F),Q-G D G R C (B,D),Q G Q D+ Q (C,E+),Q-G G G R C (B,G),Q D+ Q E+ Q (A,F,C+) Y B. R,C (G-,G),Q B+ Q C+ C D,Q (F-,A+) C E-,Q G Q (C#,A+) Q (D-,D,F) C (C#-,A),Q E Q G C. D,Q (D-,F) C A,Q E Q F Q (A-,C#,G) Y C D,C-G (D-,D+),Q F Q G G R Q (D-,F,D+),Q-G A+ G R C-G (C#-,A+,A++),Q E Q F G R Q (C#-,E,A++),Q-G A+ G R C-G (D,A+,F+),Q D- Q F- G R Q (D-,A+,F+),Q-G D G R C-G (D,G,B++),Q G- Q G-- G R Q (G-,D,B++),Q-G G G R Y C C#-,C-G (E,G),Q E+ Q G+ G R Q (C#-,G,E),Q-G E G R C-G (E,F),Q (F-,A++) Q (A,C#+) G R Q (F-,E,A++),Q-G F G R C-G (D,F),Q (B,D+) Q (B-,F+) G R Q (B,D,F,D+) C-G (B,E),Q (E-,G+) Q (G-,B+) G R Q (E-,B,G+),Q-G E G R Y C-G (A,E),Q (A,C#+) Q (A-,E+) G R Q (E,C#+),Q-G (A,A) G R C-G (A,D),Q (D-,F+) Q (F-,A+) G R Q (D-,A,F+),Q-G D G R C-G (G-,D),Q (G-,B+) Q (G--,D+) G R Q (D,B+),Q-G (G-,G-) G R C-G (C#-,G-,E),Q E+ Q G G R Q (C#-,G-,E+),Q-G E G R Y C-G (A-,A,E),Q C#+ Q A+ G R Q (C#+,E,A),Q-G A- G R C-G (A-,D,F),Q D+ Q A+ G R Q (D,F,D+),Q-G A- G R C-G (A-,A,C#),Q E+ Q A+ G R Q (C#,E+),Q-G (A-,A) G R C-G (A-,A,D),Q F+ Q A+ G R Q (A,D,F+),Q-G A- G R Y C. (E,A+,G+),Q A- Q C#- Q A- C R,Q E- Q C#- Q (A,C#,E,A++) C D-,C-G (D,A+),Q F+ Q E+ G R Q (F-,D,D+),Q-G A+ G R C (A,E),C-G A+,Q C#+ Q B+ G R Q (A-,C#,E),Q-G A+ G R Y C D-,C-G (D,A+),Q F+ Q E+ G R Q (F-,D,D+),Q-G A+ G R C (A,E),C-G A+,Q C#+ Q B+ G R Q (G-,C#,E,A+) C (F-,A),C-G D,Q D+ Q E+ G R Q (D-,A,C+),Q-G D G R C (G-,G-),C-G D,Q B+ Q A+ G R Q (F-,B,D,G) Y C E-,C-G (G-,C),Q C+ Q D+ G R Q (C-,G-,B+),Q-G C G R C (F-,F-),C-G C,Q A+ Q G G R Q (E-,A,C,F) C D-,C-G (F-,B),Q B+ Q C+ G R Q (B-,F-,A+),Q-G B G R C (E-,E-),C-G B,Q G Q F G R Q (D-,G-,B,E) Y C C#-,C-G (E-,A),Q A+ Q B+ G R Q (A-,A+),Q-G (E-,A) G R C (C#-,E-),C-G A,Q G Q A+ G R Q (A-,C#,G),Q-G A G R C D-,C-G (A,D),Q F Q A+ G R Q (C#-,A,D),Q-G F G R C B-,C-G (D,F),Q B+ Q D+ G R Q (D-,D,F,B+) Y C E-,C-G (B,E),Q G+ Q B+ G R Q (D-,B,E,G+) C C#-,C-G (E,G),Q E+ Q G+ G R Q (B-,E,G),Q-G E+ G R C (A-,E+,A++),Q C# Q E C. R,Q C# Q F Q A Q (D-,F,A++),Q-G D+ G R Y C (G-,D+,G+),Q B Q D C. R,Q B Q E Q G- Q (C#-,E,G+),Q-G C# G R C (F-,C#+,F+),Q A Q C# C. R,Q A Q D Q F- Q (B-,D,F+),Q-G B+ G R Y C (E-,B+,E+),Q G- Q B C. R,Q G- Q C# Q E- Q (E-,C#,G,E+) C (F-,F,C#+),Q A# Q F- Q (A#) C (F-,F,D+),Q B Q F- Q (B) Y C (F-,F,A#+),Q C# Q F- Q (C#) C (F-,F,B+),Q D Q F- Q (D+) MTQ A#-,C-G C#+,Q F,S E S D M-G E,Q A#+ G R Q-G (F,C#+) G R C-G C#+,Q F Q A#+ G R Q (F--,E,C#+),Q-G F G R Y C B-,C-G (F,B+),Q D Q C# G R Q (D-,B,B+),Q-G F G R C (F-,F),C-G C#+,Q A# Q G#- G R Q (F--,F-,A#+,C#+) C B-,C-G (F,B+),Q D Q C# G R Q (D-,B,B+),Q-G F G R C (F-,F),C-G C#+,Q A# Q G# G R Q (E-,F-,A#+,C#+) Y C-G (D-,F,D+),Q B Q A# G R Q (D-,B,F,D+) C-G (C#-,A#+,E+),Q C# Q B G R Q (C#-,C#,A#+,E+) C-G (B-,B+,D+),Q D Q E G R Q (B-,F,B+,D+) C-G (C#-,A#+,E+),Q E Q F G R Q (C#-,G,E+),Q A#+ G R Y C A+,C-G (D-,D+),Q F Q E G R Q (D-,D,F),Q-G D+ G R C F-,C-G (D,A+),Q D+ Q E+ G R Q (D-,A+,C+),Q-G D G R C-G (G--,G),Q (D,B+) Q (B,D+) G R Q (G--,G,B+),Q D G R C-G (D-,F),Q (D,A+) Q (A,D+) G R Q (D-,A+),Q-G (D,F) G R Y C-G (B-,F,D+),Q D Q B G R Q (B-,D,F),Q-G D+ G R C B,C-G (E-,D+),Q G Q B+ G R Q (E-,G,D+),Q-G E G R C E,C-G C+,Q (A-,A+) Q C- G R Q (A-,E,C+,A++) C-G (D,A+),Q (D-,F+) Q (F--,A++) G R Q (D-,A+,F+),Q-G D G R Y C-G (D,G),Q (G--,B++) Q (B-,D+) G R Q (G--,D,B++),Q-G G G R C-G (C,G),Q (C-,E+) Q (E--,G+) G R Q (C-,G,E+),Q-G C G R C-G (C,F),Q (F--,A++) Q (A-,C+) G R Q (F--,C,A++),Q-G F G R C-G (B,F),Q (B-,D+) Q (D--,F+) G R Q (B-,F+,D+),Q-G B G R Y C-G (B,G),Q (E--,G+) Q (G--,B+) G R Q (E--,B,G+),Q-G G G R C-G (A-,G),Q (A-,C+) Q (C--,E+) G R Q (A-,G,C+),Q-G A G R C-G (A+,D+),Q (F--,A) Q (D--,D) G R Q (F--,A,A+),Q-G D+ G R C G,C-G D+,Q (G--,B) Q (D--,D) G R Q (G--,B,B+),Q-G D+ G R Y C-G (A+,D+),Q (A-,F-) Q (D--,D) G R Q (A-,F-,A+),Q-G D+ G R C-G (G,D+),Q (B-,G-) Q (D--,D) G R Q (B-,G-,G),Q-G D+ G R C D+,Q (A,F),S C- S B- M C-,Q (D,A+) C. R,Q-G (A,F) G R Q (A,F) Q (D,A+) Q (D-,A,F),Q-G D+ G R Y C G-,C-G G,Q (B-,D+) Q (D-,B+) G R Q (B-,D),Q-G (G,D+) G R C-G (B,G),Q (G-,D+) Q (B-,G+) G R Q (G-,B,D+),Q-G G G R C-G (C,G),Q (C-,E+) Q (E-,C+) G R Q (C-,G),Q-G (C,E+) G R C-G (C,A+),Q (A,E+) Q (C-,A++) G R Q (A,C,E+),Q-G A+ G R Y C-G (D,A+),Q (D-,F+) Q (F-,D+) G R Q (D-,A+),Q-G (D,F+) G R C-G (D,B+),Q (B,F+) Q (D-,B++) G R Q (B,D,F+),Q-G B+ G R C-G (E,B+),Q (E-,G+) Q (G-,E+) G R Q (E-,B+),Q-G (E,G+) G R C-G (E,C+),Q (C,G+) Q (E-,C++) G R Q (C,E,C+,G+) Y C-G (E+,A++),Q (F-,A+) Q (A,C) G R Q (F-,A+,E+,A++) C-G (D+,F+),Q (B,D) Q (D-,F) G R Q (B,D,F+),Q-G D+ G R C-G (D+,G+),Q (E-,G) Q (G-,B) G R Q (E-,G,D+,G) C-G (C+,E+),Q (A,C) Q (C-,E) G R Q (A,C,E+),Q-G C+ G R Y C-G (C+,D+),Q (D-,F) Q (F-,A) G R Q (D-,F,C+),Q-G D+ G R C-G (G,B+,D+),Q G- Q B- G R Q (G-,G,B+,D+) MTQ-G (C#-,A+),Q (G,E+) Q (E,G+) Q-G (G,E+) G R Q (G,E+) Q (E,G+) G R Q (C#-,G,E+),Q-G A+ G R Y M.-G D,C. D-,Q (A+,F+) Q (B+,G+) Q (C+,A++) C. D--,C (A+,F+) Q-G (B+,G+) G R B (G--,D,B+,G+) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 | Y=211 C=88 !=B,E C G,BTB R C D+ C. B+ Q A+ Q G Q B+ Q A+ Q G Q F# Q A+ C D Q G,B R Q D Q A+ Q D Q B+ S A+ S G Q A+ Q D Y Q G,BTB R S D S G Q A+ S D S A+ Q B+ S A+ S G S A+ S D S D+ S C+ S B+ S A+ S G S B+ S A+ S G S F# S A+ S G S D S G S A+ S B+ S C+ S D+ S E"+ Y S F+,C D,B R S E"+ S D+ S F+ S E"+,C A+ S D+ S C#+ S E"+ Q D+,C. F Q A+ Q D+ Q(E"+,E") Y S F+,Q D,BTB R S G+ S F+,Q F S G+ D A++,Q E" D G+ D A++ D G+ D A++,Q D D G+ D F+ D G+ S A++,Q C# S G+ S A++,Q E" S B++ S A++,C A S G+ S F+ S E"+ V 2-3-1 S F+,Q D S A++ S G+,Q A S A++ S C#+,Q E" S A++ S G+,Q A S A++ S D+,Q F S A++ S G+,S E" S A++,S D S C#+,Q E" S A++ S G+,Q A S A++ Y S F+,Q D,BTB R S D+ S C#+,S A S D+,S D S G+,Q E" S D+ S C#+,S A S D+,S E" S A++,Q F S D+ S(C#+,E") S(D+,D) S(G+,E") S(D+,A) S(C#+,A+) S(D+,G) S F,Q A+ S E" S D,Q F+ S F S E",Q G S D S C#,Q E"+ S E" S D,Q F S A S D,Q A+ S E" S F,Q D+ S G S A+,Q F+ S B"+ Y S C+,Q E+,BTM R,BTB R S B+ S C+,Q A++ S D+ S C+,Q R S B+ S A+,Q E+ S C+ S B+,Q D+ S A+ S B+,Q G+ S C+ S B+,Q R S A+ S G,Q D+ S B+ S C+,Q A+ S B+ S C+,Q G S D+ S C+,Q F# S A++ S G+,Q D S A++ S B+,C(G-,G) S G+ S F#+ S G+ S A+,C D S G+ S E"+ S F#+ Y Q R,C. B,M G+,B R Q D Q G Q(A+,A) S B+,Q G-,M R S C+ S B+,Q B S C+ D D+,Q A D C+ D D+ D C+ D D+,Q G- D C+ D B+ D C+ V 3-1-1 S D+,Q F#-,M R,BTB R S C+ S D+,Q A S E!+ S D+,C D- S C+ S B+ S A+ S B+,Q(G-,D) S D+ S C+,Q D- S D+ S F#,Q(A,C) S D+ S C+,Q D- S D+ S G,Q(B,D) S D+ S(C+,A),Q R S(D+,G-) S F#,Q(A,C) S D+ S C+,Q D- S D+ S R,Q G-,C B+ S G S(F#,D-) S(G,G-) S R,Q A,C C+ S G S(F#,D-) S(G,A) Y Q B,S R,C D,BTM R S G S(A,F#) S(G-,G) S A,C C S(D-,G) S(D,F#) S(C,G) S B,Q R,C D S A S G-,Q B S B S A,Q R,C C S G- S F#-,Q A+ S A S G-,Q R,C B S D- S G-,Q D S A S(B,G),C R S(C,A+) S(D,B+) S(E",G) S F,Q A+,C(D--,D-) S E" S D,Q D+ S F S E",Q C#+,C(A-,A) S D S C#,Q E"+ S E" Y S A++,Q R,C.(F--,F-) S B++ S A++,Q A S G+ S F+,Q D S E"+ S D+,Q(E",E"--,E"-) S C#+ S F,Q(D--,D-,D+) S G S F,Q(F--,F-) S G D A+,Q(E"--,E"-),C R D G D A+ D G D A+,Q(D--,D-) D G D F D G S A+,Q(C#--,C#-,E") S G S A+,Q(E"--,E"-),C R S B+ S A+,C(A--,A-) S G S F,MTQ A+ S E" S F,Q(D--,D-) S A+ S G,Q(A--,A-) S A+ S C#,Q(E"--,E"-) S A+ S G,Q(A--,A-) S A+ Y=341 S D,Q(F--,F-),BTMTS A+ S A+ S(G,E"--,E"-) S(A+,D--,D-) S C#,Q(E"--,E"-) S A+ S G,Q(A--,A-) S A+ S F,Q(D--,D-) S D S(C#,A--,A-) S(D,D--,D-) S G,Q(E"--,E"-) S D S(C#,A--,A-) S(D,E"--,E"-) S A+,Q(F--,F-) S D S(C#,E"--,E"-) S(D,D--,D-) S G,Q(E"--,E"-) S D S C#,Q(A--,A-) S D Q F,Q(D--,D-) S G S(A+,E"),Q(G---,G--) S(B+,D) S A+,Q. C#,C(A--,A-) S G S F S(E",D) Y S D,Q R,M F,C D-- S C S D,Q A+ S E" S D,Q D+,M.TB R S C S B,Q C+ S A S G-,Q R,MTQ B S F- S G-,Q D+ S A S G-,Q G+ S F- S E-,Q F+ S D- 3D C-,MTQ E+ S-3D C S B S C,Q G S D S C,Q C+ S B S A,Q B+ S G- S F-,M A S E- S F-,Q C+ S G- S F-,Q F+ S E- S D-,Q E+ S C- Y S B-,C A,CTS D,BTB R S B S C S D C E,M G S G+ S F#+ S G+ S R,CTS C+ S A S B S C C(D,F#) S B+ S A+ S C+ V 4-1-1 S B+,Q G,C G- S A+ S G,M.. R S B+ S A+,C D S G S F# S A+ S G,C. B S D S E" S F# S G S D S G,Q A S A+ Y S(G-,B+),C G,MTQ R S(B,G) S(A,B+) S(G-,C+) S(F#-,D+),C. R S(G-,A+) S(E"-,D+) S(F#-,C+) S G-,C. B+ S D- S E-,Q(G---,G--) S F#- S G-,Q(G--,G-) S D- S G-,Q(F--,F-,A+) S A Y S B,Q(E--,E-,G) S C S B,Q(R,B+) S C D D,Q(E---,E--,A+) D C D D D C D D,Q(R,G) D C D B D C S D,Q(D--,D--,F#) S C S D,Q A+,QTCTB(D--,D-) S E S D,C D S C S B S A S B,Q G S D S C,Q D S D S F#-,Q A+ S D S C,Q D S D S G-,Q B+ S D S(C,A+) S(D,G) S F#-,Q A+ S D S C,Q D S D Y S B,Q G,B..(D--,D-) S G- S(F#-,D) S(G-,G) S C,Q A+ S G- S(F#-,D) S(G-,A+) S D,Q B+ S G- S(F#-,A+) S(G-,G) S(C,A) S(G-,D) S(F#-,D+) S(G-,C+) S B+,Q G- S A+ S G,Q B S B+ S(A+,C) S(G,B) S(F#,A) S(A+,C) S G,CTS B S B+ S C+ S D+ S E+,M(C--,C-) S(B+,D) S(A+,C) S(G,B) S F#,CTS A S A+ S B+ S C+ S D+,M(B--,B-) S(A+,C) S(G,B) S(F,A) S E,CTS G- S G S A+ S B+ S C+,C(A--,A-) S(G,B) S(F,A) S(E,G-) Y S D,Q B-,C. F-,BTB R S F S G,Q A- S A+ S B+,C G-- S D+ S C+,Q E"- S B+ S A+,Q F,C F- S C+ S D+,Q E S E+ S F+,Q D,C R S G+ S F+,Q C S E+ S D+,C(B-,B) S F+ S E+ S D+ S C+,C F,CTQ R S B+ S A+ S C+ S B+,C. D S F S G,Q C S A+ S B+,Q B S C+ S B+,Q(A,C) S C+ Y S D+,Q B,M G-,BTB R S E"+ S D+,Q D S E"+ D F+,Q C D E"+ D F+ D E"+ D F+,Q B D E"+ D D+ D E"+ S F+,Q A,C F- S E+ S F+,Q C S G+ S F+,C F- S E+ S D+ S C+ V 5-1-1 S D+,Q B,B F S F+ S E+,Q F- S F+ S A+,Q C S F+ S E+,Q F- S F+ S B+,Q D S F+ S E+,S C S F+,S B S A+,Q C S F+ S E+,Q F- S F+ S D+,Q B,B F S B+ S A+,S F- S B+,S B S E+,Q C S B+ S A+,S F- S B+,S C S F+,Q D S B+ S A+,S C S B+,S B S E+,S C S B+,S F- S A+,S F S C+,S E Y S(B+,D),M F S(C+,C) S(D+,B) S(B+,D) S(E+,C) S(D+,B) S(C+,A) S(E+,C) S D+,Q B S C+ S D+,Q G S E+ S D+ S C+ S B+,Q G- S D+ S C+,Q A S B+ S C+,Q F S D+ S C+ S B+ S A+,Q F- S C+ S B+,Q G- S A+ S B+,Q F S C+ S B+,Q C S A+ S G,Q E" S B+ Y S F,Q A+ S E S F,Q F+ S G S F S E S D,Q A!+ S F S E,Q G S D S E,Q E+ S F S E S D S C,Q G S E S D,Q F S C S D,Q D+ S E S D S C S B,Q F S D S(C,E) S(B,G) S(C,C+) S(D,B+) S(C,A"+) S(B,G) S(A,F) S(C,E) Y S(B,D),C(B--,B-) S(C,E) S(D,F) S(B,G) S(C,A+),C(F--,F-) S(D,B+) S(E,C+) S(C,A+) S(D,B+),C.(D--,D-) S(C,F) S(B,G) S(C,A+) S(D,B+) S(E,C+) S(D,B+),Q(C--,C-) S(E,C+) Y S(F,D+),Q(B--,B-) S(G,E"+) S(F,D+),Q(D--,D-) S(G,E"+) D F+,C G,Q(C--,C-) D E"+ D F+ D E"+ D F+,Q(B--,B-) D E"+ D D+ D E"+ S(A+,F+),Q(A--,A-) S(G,E+) S(A+,F+),Q(C--,C-) S(B+,G+) S A+,C(F---,F--),CTS F+ S G S F S E S D,Q(B--,B-) S F,Q F+ S E,Q(F---,F--) S F,Q F S A,Q(C--,C-) S F,Q F+ S E,Q(F---,F--) S F,Q F S B,Q(D-,D--) S F,Q F+ S(E,C--,C-) S(F,B--,B-),Q F S A,Q(C--,C-) S F,Q F+ S E,Q(F---,F--) S F,Q. F S D,Q(B--,B-) S B+ S(A+,F---,F--),M.. F+ S(B+,B--,B-) S E,Q(C--,C-) S B+ S(A+,F---,F--) S(B+,C--,C-) S F,Q(D--,D-) S B+ S(A+,C--,C-) S(B+,B--,B-) S E,Q(C--,C-) S B+ S A+,Q(F---,F--) S B+ V 6-1-1 S(B+,F+),Q(D--,D-) S(D+,E+) S(C+,F+),Q(E--,E-) S(B+,G+) S A+,Q. C+,C(F--,F-) S G S F S(E,A++) S B++,C B-,MTQ D S A++ S B++,Q F S C++ S B++,Q B+ S A++ S G+,Q A+ S F+ S E+,C C-,MTQ G S D+ S E+,Q G- S F+ S E+,Q C S D+ S C+,Q B S B+ S A++,C F--,MTQ A S G+ S A++,Q C S B++ S A++,Q A+ S G+ S F+,Q G S E+ S D+,C B--,MTQ F S C+ S D+,Q F- S E+ S D+,Q B S C+ S B+,Q A S A+ S G+,C E--,MTQ G- S F+ S G+,Q B S A!++ S G+,Q G S F+ S E+,Q F S D+ S C+,MTS E,C A!- S B+ S C+,Q E- S D+ S C+,Q A! S D+ S E+,Q G- S C+ C(D--,F-),CTS F+ S E S D S C C G--,CTS G-,C B" S A!+ S G S F MTS E+,C(C--,C-) S G- S A S B" S C S D S E S C C F--,M A! S C+ S D+,C C S E+ S F+,C A! S G+ S A!++,Q F S F+ Y S B"+,CTS F,Q G-,M G-- S C+ S D+,Q A S B"+ C(G,B") S F S E S D S E,C(C,C+),M G S D S C S E S D,C G+ S C S B" S D S R,Q(C--,C--),C E+ S G- S C,Q(G---,G--) S D S E,Q(C--,C-) S F S E,Q(D--,D-,D+) S F S G,Q C+,C(E--,E-) S E S C,Q E+ S G S A!+,Q D+,C(F--,F-) S F S G,Q C+ S A!+ S D,Q B"+,CTS(G--,G-) S E S D,Q D+ S C C(B",G) S(G--,G-) S(F--,F-) S(G--,G-) S(E--,E-),Q(C,C+) S(G--,G-) S(F--,F-),Q G S(G--,G-) S(B"--,B"-),Q(D,D+) S(G--,G-) S(F--,F-),Q G S(G--,G-) Y S(C--,C-),Q(E,E+) S(G--,G-) S(F--,F-,D+) S(G--,G-,C+) S(B"--,B"-),Q(D,D+) S(G--,G-) S(F--,F-),Q G S(G--,G-) S(E--,E-),Q(C,C+) S(C-,C) S(B"-,B",G) S(C-,C,C+) S(F--,F-),Q(D,D+) S(C-,C) S(B"-,B",G) S(C-,C,D+) S(G--,G-),Q(E,E+) S(C-,C) S(B"-,B",D+) S(C-,C,C+) S(G--,G-,D,D+) S(B"-,B",G) S(A-,A,G+) S(B"-,B",F+) S E+,Q(C-,C) S D+ S C+,Q(E--,E-) S E+ S(F,D+),Q(F--,F-) S(E,C+) S(D,B"+),Q(G--,G-) S(F,D+) S C+,C(E,C--),Q C- S G+ S E+,Q G S G+ S C+,Q E- S E+ S G,Q C- S B+ S A+,C F-- S C+ S A+,Q C S C+ S F,Q A S A+ S C,Q F- S E Y=711 S D,MTQ B S F+ S D+,Q F- S F+ S B+,Q D- S D+ S F,Q B- S A+ S G,C E-- S B+ S G,Q B S B+ S E,Q G- S G S B,Q E- S D S C,MTQ A S E+ S C+,Q E- S E+ S A+,Q C- S C+ S E",Q A- S G S F#,C D-- S A+ S F#,Q A S A+ S D,Q F#- S F# S A,Q D- S C S G--,Q B,C G- S B- S A-,Q G S G-- S D-,Q A S A- S D--,Q F# S C- S G-,Q B-,C G S B S A,Q D- S G- S D,Q F#-- S A S D-,Q D- S C Y S G,Q B,C G S B+ S A+,Q D S G S D+,Q A,C F# S A+ S D,C D S C+ S B+,C G S D+ S C+,Q G S B+ S F+,Q C,C A S C+ S F,C F S E+ S D+,C B S F+ S E+,Q F S D+ S G+,Q D,C B" S D+ S G,C G S F+ S E"+,C C S G+ S F+,Q G S E"+ S A++,Q E",C C# S E"+ S A+,QTS A+ S G+ C(F#+,D) S E+ S D+ S C+ S B+,Q(E",G+) S D+ S A+,Q(F#,A++) S D+ S G,C G,MTC B++ S A!++ S G+ S F#+ S G+,Q A+ S F S E,Q B+ S D S C+,M E+ S G S F S E S C+,M A++ S A+ S F S A+ S B,M D+ S F S E S D S B+,M G+ S G S E S G S A,M C+ S E S D S C S A+,C F#+ S F# S D S F# S B+,C(G---,G--,G) S D+ S C+ S B+ S(F#,A+),C(D--,D-) S(G,B+) S(E",G) S(F#,A+) Y S(G,B+),C.(B--,B-) S C+ S B+,Q D+ S C+ S D+,Q G+ S E+ S D+,Q(A++,A--,A-) S C+ S B++,Q(G---,G--,G+) S A++ S G+,Q(B--,G-,D+) S A++ S F#+,Q(A--,A-,C+) S G+ S F#+,Q(G---,G--,B+) S G+ S A++,Q(F#---,F#--,A+) S G+ S F#+,Q(A--,A-) S E"+ S D+,C(D--,D--) S C+ S B+,C.. D S A+ S B+,Q(G---,G--) S D+ S C+,Q(D--,D--) S D+ S F#,Q(A-,A-) S(D+,D) S(C+,C),Q(D--,D--) S(D+,D) Y S G,C B- S(D,D+) S(C,C+,A-) S(D,D+,G--) S F#,C A- S(D,D+) S(C,C+),Q D-- S(D,D+) S(B,D,B+),Q G-- S(G-,G) S(F#-,F#,D--) S(G-,G,G--) S(C,D,C+),C A- S(G-,G) S(F#-,F#,D--) S(G-,G,A-) C=70 S(D,G,D+),C B- S(G-,G) S(F#-,F#,A-) C=60 S(G-,G,G--) S(C,C+),Q A- S(G-,G) S(F#-,F#),Q D-- S(G-,G) C=40 Q(G--,B,D,B+) Q(G-,G,B+,E+) Q(C-,A,E,G) Q(D-,D,C+,F#+) M(D-,B",G,G+) C R $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 | C=100 V=2 MTS R,S R S C S D S E S F S D S E S C Q G S C- Q C+,S D- S E- S F-,D B+ D A+ S (D-,B+) Q C+,S E- S C- Y Q G-,S D+ S G Q G--,S A+ S B+ CTS R,S C+ S A+ S B+ S G Q D+ S G- Q G+,S A S B S C,D F+ D E+ S (A,F+) Q G+,S B S G- Y Q C,S E+ S A++ Q B,S G+ S F+ Q C,S E+ S G+ Q D,S F+ S A++ Q E,S G+ S F+ Q G-,S E+ S D+ Q A,S C+ S E+ Q B,S D+ S F+ Y Q C,S E+ S D+ Q E-,S C+ S B+ Q F#-,S A+ S C+ Q G-,S B+ S D+ Q A,S C+ S B+ Q B,S A+ S G CTS C,S F# S A+ S G S B+ Q A+ S D- Q D,S E- S F#- S G-,D C+ D B+ Q C+,S E- S F#- S (D-,D+) Q G-,S B+ S A+ Q B-,S G S F# Q C-,S E S G Q D-,S F# S A+ Y Q E-,S G S B+ Q F#-,S A+ S C+ Q G-,S B+ S D+ Q E-,S C+ S E+ Q. B-,S D+ D B+ D C+ S D+ S (C-,G+) Q D-,D-G B+ D-G C+ STGTG B+ Q D--,S A+ S-G G G R Y Q G,S R S G-- C.. R,S A- S B- S C- S A- S B- S G-- Q D- S G Q G-,S A+ S B+ Q F#-,S C+ S A+ Q G-,S B+ S G Y Q F#,S A S D- C.. R,S E- S F#- S G- S E- S F#- S D- Q A S A+ Q D,S B+ S C+ Q C,S D+ S B+ Q D,S C+ S A+ Y Q B+,S G- S G C.. R,S F S E S D S F S E S G Q F S D+ Q E,S C+ S B+ Q F,S A+ S C+ Q D,S B+ S D+ Q E,S C#+ S E+ Y Q D+,S F S B!+ Q C#,S A+ S G Q D+,S F S A+ Q E+,S G S B!+ Q F+,S A+ S G Q A+,S F S E Q B+,S D S F Q C#+,S E S G Y Q D+,S F S E Q F#,S D S C Q G#,S B S D Q A+,S C S E Q B+,S D S C Q C+,S B S A CTS D+,S G#- S B S A S C Q B S E Q E-,S F# S G# S A+,D D D C Q D,S F# S G# S (R,E) S (C,E+) S (B,D+) S (A,C+) S (G-,E+) S (F#-,D+) S (A,C+) S (G#-,B+) S (B,D+) Y S (A,C+) S (C,A++) S (B,G#+) S (D,B++) S (C,A++) S (E,E+) S (D,F+) S (F,D+) Q E,S G# S F+ Q A,S E+ S D+ Q E,D-G C+ D-G D+ STGTG C+ Q E-,S B+ S-G A+ G R Y Q A,S A+ S A++ Q A-,S G+ S F+ CTS R,S E+ S G+ S F+ S A+ MTS G+ S E S D S C S B S D S C# S E MTS D S E+ S F+ S G+ S A++ S F+ S G+ S E+ MTS F+ S A S B S C S D S B S C S A MTS B S G+ S F+ S E+ S D+ S F+ S E+ S G+ MTS F+ S D S C S B S A S C S B S D MTS C S D+ S E+ S F+ S G+ S E+ S F+ S D+ MTS E+ S G- S A S B! S C S A S B! S G- Q A S C+ Q B!,S D+ S E+ Q A,S F+ S D+ Q G-,S E+ S C+ Q F-,S D+ S E+ Q D,S F+ S G+ Q C,S A++ S F+ Q B!,S G+ S E+ Y Q A,S F+ S G+ Q F,S A++ S B++ Q E,S C++ S A++ Q D,S B++ S G+ Q C++,S E S D- Q G+,S E- S F- S G-,D-G E+ D-G F+ STGTG E+ S E- S (F-,D+) S D-,S-G C+ G R Y Q E-,S C+ S B!+ Q C-,S A+ S G Q D-,S F S A+ Q E-,S G S B+ S (F-,A+) S (D-,B+) S (E-,C+) S (F-,E) Q G-,S D S C+ Q G--,S F S B+ Y V=4 B (C--,E,G,C+) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 | C=100 !=B V=2 Y C. R,S D S E S F S G S A+ S B+ Y C. R,S C# S B+ S A+ S G S F S E Y Q F,S D- S E- Q A+,S F- S G- Q D+,S A- S B- Y Q G,S C#- S B Q C#+,S A S G- Q E+,S F- S E- Y Q F-,S D+ S E+ Q A,S F+ S G+ Q D,S A++ S B++ Y Q E-,S C#+ S B++ Q G-,S A++ S G+ Q C#,S F+ S E+ Y Q D-,S F+ S D+ Q D,S E+ S F+ Q F-,S G+ S A++ Y Q G-,S B+ S A++ Q A,S G+ S F+ Q B,S E+ S D+ Y Q C-,S E+ S C+ Q C,S D+ S E+ Q E-,S F+ S G+ Y Q F-,S A+ S G+ Q G-,S F+ S E+ Q A,S D+ S C+ Y S (B,D+) S (G-,E+) S (A,F+) S (B,D+) S (C,E+) S (D,F+) Y Q G,S E- S D C R,S C S B S A S G- Y S (A,C+) S (F-,D+) S (G-,E+) S (A,C+) S (B,D+) S (C,E+) Y Q F,S D- S C Q R,S B S A C B+,S G- S F- S E- S C- Q A+,S D- S E- Q G,S F S G- Y S (A-,C+) S (G-,B+) S (F-,A+) S (E-,G) S (D-,F) S (C-,E) Y S (D-,F) S B-,S-G G G R Q C-,D G D A+ Q G Q C-- S-G F G R Y Q F,S F-- S G-- Q-G C+,S A- S B- G R Q-G C+,S C- S D- G R Y S E--,D C+ D D+ S D-,D C+ D D+ S C-,D C+ D D+ S B-,D C+ D D+ S A-,D C+ D D+ S G--,D C+ D D+ Y S A-,D C+ D D+ S B-,D C+ D D+ S C-,D C+ D D+ S D-,D C+ D D+ S E-,D C+ D D+ S F-,D C+ D D+ Y S G--,D C+ D D+ S F-,D C+ D D+ S E-,D C+ D D+ S D-,D C+ D D+ S C-,D C+ D D+ S B-,D C+ D D+ Y S (A-,C+) S (B-,B+) S (C-,A+) S (A-,G) S (B-,F) S (C-,E) Y Q F#-,S C+ S D C R,S E S F# S G S A+ Y S (G--,B+) S (A-,A+) S (B-,G) S (G--,F) S (A-,E) S (B-,D) Y Q E--,S B+ S C C R,S D S E S F S G Y Q F-,S A+ S B"+ Q F-,S C+ S D+ Q D-,S E+ S F+ Y Q B"-,S G# S F+ Q G#--,S E+ S D+ Q E--,S C+ S B"+ Y S (A-,C+) S (G#--,B"+) S (A-,D+) S (B"-,C+) S (C-,B"+) S (D-,A+) Y S G#,D E- D F- S A+,D E- D F- S G#,D E- D F- S F#,D E- D F- S E,D E- D F- S D,D E- D F- Y S C,D E- D F- S D,D E- D F- S E,D E- D F- S F#,D E- D F- S G#,D E- D F- S A+,D E- D F- Y S D,D E- D F- S C+,D E- D F- S B"+,D E- D F- S A+,D E- D F- S G#,D E- D F- S F#,D E- D F- Y S E,D E- D F- S F#,D E- D F- S G#,D E- D F- S A+,D E- D F- S B"+,D E- D F- S C+,D E- D F- Y S F#,D E- D F- S E+,D E- D F- S D+,D E- D F- S C+,D E- D F- S B"+,D E- D F- S A+,D E- D F- Y Q E-,S G# S A+ Q E,S B"+ S C+ Q D,S D+ S E+ Y Q C,S A+ S F+ Q B",S E+ S D+ Q A,S C+ S B"+ Y Q D,S A++ S G#+ Q E,S F#+ S E+ QTS A++,Q F Q D S D+ Q E,D B"+ D C+ Q B"+ Q E- S-G A+ G R Y Q.-G A+,S A S A- S B- G R S (C-,A+) S (D-,B+) S (E!-,C+) Y Q D,S F#-- S E!- Q F#,S D- S C- Q A+,S B- S A- Y Q.-G G--,S B+ S G S A+ G R S (G--,B+) S (A-,C+) S (B-,D+) Y Q C--,S E S D+ Q G--,S C+ S B+ Q C-,S A+ S G Y Q A+,S F- S G- S (A,F+) S (B",E+) Q F+,S C# S D Y Q G,S E- S D Q E+,S C# S B" Q R,S A S G-- Y Q F-,S D+ S E+ Q A,S F+ S G+ Q D,S A++ S B++ Y Q E-,S C#+ S B++ Q G-,S A++ S G+ Q C#,S F+ S E+ Y Q F+,S D- S E- Q D+,S F- S G- Q. G,S A S B S C#- S (B,D+) S (A,C#+) S (G-,E+) S (F-,A+) S (E-,C#+) Y S (F-,D+) S (G-,B"+) Q. C#+,Q A Q A- S-G D+ G R Y Q. B-,S D+ S C+ S B+ S (C-,A+) S (B-,G) S (A-,F) Y S (G--,B+) S (B,C#) S (A,D) S (G-,E) S (F-,F) S (E-,G) Y S (F-,A+) S (G-,D+) Q (A,F) Q A-,S E S D Y M (D--,D) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 | C=100 V=2 !=B Y M. R,Q R Q F Q A+ Q F Q C+ Q F Y Q F+ Q F-,S E+ S D+ Q A,S C+ S D+ Q F-,S C+ S B+ Q C,S A+ S B+ Q F-,S A+ S G Y Q F Q A+,S E S D Q C+,S C S D Q A+,S C S B Q F+,S A S B Q C+,S A S G- Y Q F-,S A++ S C++ Q A,S B++ S C++ Q C,S A++ S C++ Q A,S B++ S C++ Q F,S A++ S C++ Q C,S B++ S C++ Y S (A+,F+) S (C+,A++) S (B+,G+) S (C+,A++) S (A+,F+) S (C+,A++) S (B+,G+) S (C+,A++) S (A+,F+) S (C+,A++) S (B+,G+) S (C+,A++) Y S (F,D+) S (A+,F+) S (G,E+) S (A+,F+) S (F,D+) S (A+,F+) S (G,E+) S (A+,F+) S (F,D+) S (A+,F+) S (G,E+) S (A+,F+) Y Q B"+,S D S F Q G,S E S F Q D+,S D S F Q B"+,S E S F Q F+,S D S F Q D+,S E S F Y Q B",S G+ S A++ Q G-,S G+ S F+ Q C,S E+ S F+ Q G-,S E+ S D+ Q E,S C+ S D+ Q C,S C+ S B+ Y Q A+,S F S G S (F,D+) S (E,C+) S (D,B"+) S (E,C+) S (D,B"+) S (C,A+) S (B",G) S (C,A+) S (B",G) S (A,F) Y Q G-,S E S F S (C,E) S (B",D) Q C,S A S B" S (A,C+) S (G-,B"+) Q C+,S F- S G- Q E,S F- S E- Y Q F,S D- S E- Q C+,S D- S C- Q E,S G- S F- Q C+,S E- S F- Q (G-,D) Q (G--,B"+) Y Q C+ M R,Q C- Q E- Q C- Q G- Q C- Y Q C Q C+,S B" S A Q E+,S G- S A Q C+,S G- S F- Q G+,S E- S F- Q C+,S E- S D- Y Q (C-,C++) Q E-,S B"++ S A++ Q G-,S G+ S A++ Q E-,S G+ S F+ Q C,S E+ S F+ Q G-,S E+ S D+ Y Q E!,S C+ S B+ Q F#-,S C+ S A++ Q E!,S C+ S A++ Q F#-,S B+ S A++ Q E!,S C+ S A++ Q F#-,S A+ S A++ Y Q (G-,B+) Q G,S F- S E!- Q B+,S D- S E!- Q G,S D- S C- Q D+,S B- S C- Q G,S B- S A- Y Q (G--,G+) Q G-,S F+ S E!+ Q B,S D+ S E!+ Q G-,S D+ S C+ Q D,S B+ S C+ Q G-,S B+ S A+ Y Q G Q B+,S F S E! Q D+,S D S E! Q B+,S D S C Q G+,S B S C Q D+,S B S A Y Q B++,S G- S F- Q C#+,S G- S E Q B++,S G- S E Q C#+,S F- S E Q B++,S G- S E Q C#+,S E- S E Y Q D+,S F- S E- Q A+,S F- S D Q F+,S F- S D Q D+,S E- S D Q A++,S F- S D Q F+,S D- S D Y Q B,S G+ S F+ Q G-,S G+ S B++ Q E-,S C+ S B++ Q G-,S D+ S B++ Q C-,S E+ S B++ Q E-,S C+ S B++ Y Q A,S F+ S E+ Q F-,S F+ S A++ Q D-,S B"+ S A++ Q F-,S C#+ S A++ Q B"-,S D+ S A++ Q D-,S B"+ S A++ Y Q G-,S E+ S D+ Q E-,S E+ S G+ Q C#-,S A+ S G+ Q E-,S B"+ S G+ Q A-,S C#+ S G+ Q C#-,S A+ S G+ Y Q F+,S D-- S D- Q D+,S C- S D- Q B+,S G-- S D- Q D+,S A- S D- Q G,S B- S D- Q F+,S G-- S D- Y Q E+,S C-- S C- Q C+,S B- S C- Q A+,S F-- S C- Q C+,S G-- S C- Q F,S A- S C- Q E!+,S F-- S C- Y Q B-,S D+ S F+ Q D-,S E!+ S F+ Q F-,S D+ S F+ Q D-,S E!+ S F+ Q B,S D+ S F+ Q F-,S E!+ S F+ Y S (D,B+) S (F,D+) S (E!,C+) S (F,D+) S (D,B+) S (F,D+) S (E!,C+) S (F,D+) S (D,B+) S (F,D+) S (E!,C+) S (F,D+) Y S (B,G) S (D,B+) S (C,A+) S (D,B+) S (B,G) S (D,B+) S (C,A+) S (D,B+) S (B,G) S (D,B+) S (C,A+) S (D,B+) Y Q E,S G- S B Q C,S A S B Q G,S G- S B Q E,S A S B Q B+,S G- S B Q G,S A S B Y Q E-,S C+ S D+ Q C-,S C+ S B+ Q F-,S A+ S B+ Q C-,S A+ S G Q A,S F S G Q F-,S F S E! Y Q D,S B S C S (B,G) S (A,F) S (G-,E) S (A,F) S (G-,E) S (F-,D) S (E-,C) S (F-,D) S (E-,C) S (D-,B) Y Q C-,S A S B S (F-,A) S (E-,G-) Q F-,S D- S E- S (D-,F) S (C-,E) Q F,S B- S C- Q A,S B- S A- Y Q B,S G-- S A- Q F,S G-- S F-- Q A,S C- S B- Q F,S A- S B- Q (C-,G-) Q (C--,E) Y V=4 M. (F--,A,C,F) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 | C=125 V=2 #=F Y BTQ R,Q G Q B+ Q D+ Q B+ Q G Q D+ Q B+ Q G Q G+ Y Q D-,S F+ S G+ Q (F-,F+) Q (A,D+) Q (F-,A++) Q (D-,F+) Q (A,D+) Q (F-,A++) Q (D-,F+) Q (C,D+) Y Q G+,S B S C Q (B,D+) Q (G-,B+) Q (D,F"+) Q (B,D+) Q (G-,B+) Q (D,F"+) Q (B,D+) Q (G-,B+) Y Q (C,E+) Q (E,C+) Q (C,A+) Q (A,F) Q (C,A+) Q (A,C+) Q (F-,E+) Q (G-,D+) Q (A,C+) Y Q (B,D+) Q (D,B+) Q (B,G) Q (G-,E) Q (B,G) Q (G-,B+) Q (E-,D+) Q (F-,C+) Q (G-,B+) Y Q (A,C+) Q (C,A+) Q (A,F) Q (F-,D) Q (A,F) Q (F-,A+) Q (D-,C+) Q (E-,B+) Q (F-,A+) Y Q B+,S G- S F- C. G-,Q C+ Q D+ Q E+ Q (F-,B+) Q (E-,G+) Q (D-,E+) Q (E-,B+) Q (C#-,G+) Y Q A+,S F- S E- C. F-,Q B+ Q C#+ Q D+ Q (E-,A+) Q (D-,F+) Q (C#-,D+) Q (D-,A+) Q (B-,F+) Y Q E-,S G S F C. G,Q F- Q G- Q A Q (E-,A+) Q (C#,G) Q (A,F) Q (E-,G) Q (C#,E) Y Q F,S D S C# C. D,Q G Q F Q E Q (D-,F) Q (E-,D) Q (F-,A+) Q (E-,B+) Q (D-,C+) Y Q B+,S G- S F- C. G-,Q C+ Q B+ Q A+ Q (E-,B+) Q (F-,G) Q (G-,E+) Q (F-,F+) Q (E-,G+) Y Q C#+,S A S G- C. A,Q D+ Q C#+ Q B+ Q (B-,C#+) Q (F-,A+) Q (E-,G+) Q (D-,A++) Q (C#-,B++) Y Q (D-,A++) Q (E-,G+) Q (F-,F+) Q (G-,E+) Q (A,F+) Q (B,D+) C A,Q A+ Q D+ Q (A-,C#+) Y Q D-,S D+ S C#+ C D+,Q F- Q A M. R,Q F- Q D- Q A Q F- Q D- Q D Y C A+,S C# S D C C#,Q C#+ Q E+ C. A,Q C#+ Q A+ Q E+ C. R,Q C#+ Q A+ Q G+ Q D-,S F+ S G+ C F+,Q F- Q A C. D+,Q F- Q D- Q A C. R,Q F- Q D- Q C Y Q G,S B S C C B,Q B+ Q D+ C. G-,Q B+ Q G Q D+ C. R,Q B+ Q G Q F"+ Y Q E+,S C- S B- C. C-,Q C+ Q A+ Q A++ Q (D-,E+) Q (E-,C+) Q (F--,A+) Q (G--,B+) Q (A-,C+) Y Q D+,S B- S A- C. B-,Q D+ Q G Q G+ Q (C-,D+) Q (D-,B+) Q (E--,G) Q (F--,A+) Q (G--,B+) Y Q A-,S C+ S D+ Q C-,S C+ S D+ Q E-,S C+ S D+ Q A,S C+ S D+ Q E-,S C+ S D+ Q C-,S C+ C D+ Q A-,S C+ S D+ Q B-,S C+ S D+ Q C-,S C+ S D+ Y Q D-,S C+ S D+ Q F-,S C+ S D+ Q A,S C+ S D+ Q D,S C+ S D+ Q A,S C+ S D+ Q F-,S C+ S D+ Q D-,S C+ S D+ Q E-,S C+ S D+ Q F-,S C+ S D+ Y Q G-,S B+ S C+ Q B,S B+ S C+ Q D,S B+ S C+ Q G,S B+ S C+ Q D,S B+ S C+ Q B,S B+ S C+ Q G-,S B+ S C+ Q A,S B+ S C+ Q B,S B+ S C+ Y Q E-,S B+ S C+ Q G-,S B+ S C+ Q E,S B+ S C+ Q B,S B+ S C+ Q G-,S B+ S C+ Q E-,S B+ S C+ Q F-,S B+ S C+ Q G-,S B+ S C+ Y Q B+,S C- S D- Q E+,S C- S D- Q D+,S C- S D- Q C+,S C- S D- Q D+,S C- S D- Q B+,S C- S D- Q A+,S C- S D- Q B+,S C- S D- Q G,S C- S D- Y Q A+,S C- S D- Q C+,S C- S D- Q B+,S C- S D- Q A+,S C- S D- Q B+,S C- S D- Q G,S C- S D- Q F,S C- S D- Q G,S C- S D- Q E,S C- S D- Y Q C-,S F S G Q (D-,F) Q (F-,D) Q A,S A+ S B+ Q (F-,A+) Q (D-,F) Q C-,S D+ S E+ Q (B-,D+) Q (A-,F) Y Q (B-,G) Q (G--,B+) Q (B-,D+) Q (D-,B+) Q (B-,G) Q (G--,D+) Q (D-,B+) Q (B-,G) Q (G--,G+) Y Q (F--,D+) Q (D--,F+) Q (F--,A++) Q (A-,F+) Q (F--,D+) Q (D--,A++) Q (A-,F+) Q (F--,D+) Q (D--,C++) Y Q (G--,B++) Q (A-,A++) Q (B-,G+) Q (A-,F+) Q (B-,G+) Q (C-,A++) Q (B-,D+) Q (C-,G+) Q (D-,F+) Y MTQ E--,Q G+ Q F+ Q E+ Q D+ Q C+ Q (E-,B+) Q (F-,A+) Q (E-,B+) Q (D-,C+) Y Q B+,S G- S F- Q (G-,A+) Q (B-,G) Q (E-,F) Q (D-,G) Q (C-,A+) Q D,S D- S C- Q (D-,G) Q (D--,F) Y M G--,Q G Q D Q B C. G- Q B- Q D- C. (R,G-) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 | C=85 V=2 #=C,F,G Y S A,D A+ D G Q.-G A+,S B S C S B G R Q-G A+,S A S G- G R S F-,D A+ D G Q.-G A+,S G- S A S G- G R Q A+,S F- S E- S D-,3S B+ 3S A+ S F- 3S B+ S A,3S C+ 3S B+ S F- 3S C+ S D-,3S B+ 3S C+ S F- 3S B+ S B-,3S C+ 3S B+ S D- 3S C+ S F-,3S B+ 3S C+ S D- 3S B+ S B-,3S C+ 3S B+ S D- 3S C+ Y Q G--,S B+ S A+ Q B-,S G S A+ Q G--,S B+ S C+ Q E--,S D+ S C+ Q F--,S D+ S F+ Q G--,S E+ S D+ C A-,S C+ S A+ S C+ S E+ M R,S A++ S F+ S D#+ S B+ S D#+ S F+ S A++ S F+ Y S G+,D E- D D#- Q.-G E-,S A++ S G+ S F+ G R Q-G E-,S E+ S D#+ G R S C+,D E- D D#- Q.-G E-,S D#+ S E+ S D#+ G R Q E-,S C+ S B+ S A+,3S F- 3S E- S C+ 3S F- S E+,3S G- 3S F- S C+ 3S G- S A+,3S F- 3S G- S C+ 3S F- S F,3S G- 3S F- S A+ 3S G- S C+,3S F- 3S G- S A+ 3S F- S F,3S G- 3S F- S A+ 3S G- Y Q D#,S F- S E- Q F,S D#- S E- Q D#,S F- S G- S (A,B) S (G-,D#) S (A,F) S (C,A+) S (B,G) S (A,F) S (G-,E) S (E-,G) S (G-,B+) S (B,E+) S (E,B+) S (B,G) C E,S G- S E- S G- S B Q R,S D S B Y S C,D E+ D D+ Q.-G E+,S D S E S D G R Q-G E+,S C S B G R S A,D E+ D D+ Q.-G E+,S B S C S B G R Q-G E+,S A S G- G R Q F-,S E+ S A++ Q F,S E+ S C+ Q C,S A+ S C+ Q A,S E+ S A++ Q F-,S E+ S C+ Q A,S A+ S C+ Y S B,D D+ D C+ Q.-G D+,S C S D S C G R Q-G D+,S B S A G R S G-,D D+ D C+ Q.-G D+,S A S B S A G R Q-G D+,S G- S F- G R Q E-,S D+ S B++ Q B-,S G+ S D+ Q G--,S B+ S D+ C E--,S G+ S B++ S G+ S D+ Q R,S B+ S D+ Y Q C+,S R S A CTS R,S C S E S A+ S G Q F S D CTS R,S F S A+ S D+ S C+ Q B+ S G- CTS R,S B S D# S G S F Q E# S C CTS R,S E# S G S C+ S B+ Q A+ S F- CTS R,S A S C S F S E Q D S B CTS R,S D S F S B+ S A+ S G S (B-,F) S (D-,B+) S (F-,A+) S (B,G) S (A,F) S (G-,E#) S (C-,G) S (E#-,C+) S (G-,B+) S (C,A+) S (B,G) Y Q F,S A S B Q F+,S A S G- Q-G F,S F- S E- G R Q F,S D- S E- Q C,S F- S E- Q F,S D- S C- S B-,3S G 3S F S D- 3S G S F-,3S A+ 3S G S D- 3S A+ S B-,3S G 3S A+ S D- 3S G S G--,3S A+ 3S G S B- 3S A+ S D-,3S G 3S A+ S B- 3S G S G--,3S A+ 3S G S B- 3S A+ Y Q E#--,S G S F Q G--,S E# S F Q E#--,S G S A+ Q C--,S B+ S A+ Q D#--,S B+ S D"+ Q E#--,S C+ S B+ Q F--,S A+ S F Q F-,S A+ S C+ Q D#-,S F+ S D#+ Q G-,S B#+ S G Q F-,S B#+ S D#+ Q G-,S F+ S D#+ Y S E+,D C- D B#- Q.-G C-,S F+ S E+ S D#+ G R Q-G C-,S C+ S B+ G R S A+,D C- D B#- Q.-G C-,S B+ S C+ S B+ G R Q C-,S A+ S G S F,3S D#- 3S C- S A+ 3S D#- S C+,3S E+ 3S D#- S A+ 3S E- S F,3S D#- 3S E- S A+ 3S D#- S D#,3S E- 3S D#- S F 3S E- S A+,3S D#- 3S E- S F 3S D#- S D#,3S E- 3S D#- S F 3S E- Y Q B#,S D#- S C- Q D#,S B#- S C- Q F,S D#- S E- Q A+,S F- S E- Q G,S F- S A Q B#+,S G- S F- S (E-,C+) S (C-,E+) S (E-,G+) S (G-,E+) S (C,C+) S (G-,E+) S (E-,G+) S (C-,E+) S (E-,C+) S (G-,E+) S (C,G+) S (B,E+) Y S (A#,C+) S (F-,E+) S (A#,F+) S (C,E+) S (F,C+) S (C,E+) S (A#,F+) S (F-,E+) S (A#,C+) S (C,E+) S (F,F+) S (E,A#+) S (D,B+) S (B-,D+) S (D-,F+) S (F-,D+) S (B,B+) S (F-,D+) S (D-,F+) S (B-,D+) S (D-,B+) S (F-,D+) S (B,F+) S (A,D+) Y S (G-,B+) S (E-,D+) S (G-,E+) S (B,D+) S (E,B+) S (B,D+) S (G-,E+) S (E-,D+) S (G-,B+) S (B,D+) S (E,E+) S (D,G) S C,D A+ D G Q.-G A+,S D S E S D G R Q-G A+,S C S B G R S A,D A+ D G Q.-G A+,S B S C S B G R Q-G A+,S A S G- G R Y Q F-,S A+ S D#+ Q A,S B+ S A+ C D#,S F S A+ S B+ S D#+ Q C,S B+ S A+ Q B,S F S A+ S E,D G" D F Q.-G G",S F S G" S F G R Q-G G",S E S D G R S C,D G" D F Q.-G G",S D S E S D G R Q-G G",S C S B G R Y Q A,S G" S E+ Q E-,S C+ S G" Q C-,S E S G" C A-,S C+ S E+ S C+ S G" Q. R,S E S G" Q F S D- CTS R,S F- S A S D S C Q B S G CTS R,S B S D S G S F Q E S C- CTS R,S E- S G- S C S B Q A S F- CTS R,S A S C S F S E Q D S B- CTS R,S D- S F- S B S A Q G- S E- C R,S G- S B S E S D Y S C,D A- D G-- Q.-G A-,S A S C S E G R Q-G A-,S A+ S E G R S C+,D A- D G-- Q.-G A-,S A+ S C+ S E+ G R Q A-,S A++ S C+ S D+,3S B- 3S A- S F+ 3S B- S A++,3S C- 3S B- S F+ 3S C- S D+,3S B- 3S C- S F+ 3S B- S B+,3S C- 3S B- S D+ 3S C- S F+,3S B- 3S C- S D+ 3S B- S B+,3S C- 3S B- S D+ 3S C- Y Q G,S B- S A- Q B+,S G-- S A- Q D+,S B- S C- Q F+,S D- S C- Q E+,S D- S F- Q B+,S E- S D- Q F+,S C- S B- Q E+,S C- S E- Q A+,S D- S C- Q E+,S B- S A- Q D+,S B- S D- Q G,S C- S B- Y Q D+,S A- S G-- Q C+,S A- S B- Q E,S C- S A- S F,D D- D C- Q.-G D-,S G S A+ S B+ G R Q D-,S C+ S D+ S G,3S C- 3S D- S E 3S E- S G,3S D- 3S E- S B+ 3S D- S E+,3S E- 3S D- S B+ 3S E- S G+,3S D- 3S E- S E+ 3S D- S B++,3S E- 3S D- S G+ 3S E- S E+,3S D- 3S E- S G+ 3S D- Y Q A++,S C- S D- Q E+,S C- S B- Q C+,S A- S G-- S (F--,A+) S (F-,D+) S (E-,C+) S (D-,B+) Q. E+,S C- S B- S C- S (F+,D-) Q (E-,C+) Q E--,S B+ STM. A+ M. A- $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 | C=90 V=2 Y Q A-,S R S E C A,S A+ S C+ S B+ S E Q G#-,S B+ S D+ Q C+,S A S E- Q E+,S A S C Q G#,S B S E- Q E+,S B S D Y Q C,S A+ S E Q A,S A+ S C+ Q G#-,S B+ S E Q E-,S B+ S D+ Q C+,S A S E- Q A+,S A S C C R,S B S E- S B S D Y Q C,S R S E+ Q A,S C+ S E+ Q C,S A+ S C+ Q A,S E S G Q F,S D S A Q A+,S F- S A Q D+,S D- S F- Q. F+,S A- S C- Q B- S D+ Q D-,S B+ S D+ Q G-,S G S B+ Q. B,S D S F Q E S G- Q G,S E- S G- Q C+,S C- S E- Q. E+,S G-- S B- Q A- S C+ Q C-,S A+ S C+ Q F,S D- S F- Q. D+,S B- S D- Q G-- S B+ Q B-,S G S B+ Q E,S C- S E- Q. C+,S A- S C- Q F-- S A+ Q D--,S F S A+ Q D,S G-- S G- Q B+,S F- S G- Y Q C+,S C- S G- C. R,S C S E S D S G- S D S F Y Q E,S R S G Q C,S C+ S E+ Q B,S D+ S G Q G-,S D+ S F+ Q E+,S C S G- Q G+,S C S E Q B+,S D S G- Q G+,S D S F Y Q E,S C+ S G Q C,S C+ S E+ CTS R,S D+ S G S D+ S F+ Q E+ S G Q C+,S E S G Q G+,S C S E Q E+,S G- S B Y Q A,S C++ S A++ Q C,S E+ S A++ Q E,S C+ S E+ Q G,S A+ S C+ Q D+,S F# S A+ Q F#+,S D S F# Q A++,S A S D Q C++,S F#- S A Y Q G-,S B++ S G+ Q B,S D+ S G+ Q D,S B+ S D+ Q F#,S G S B+ Q C+,S E S G Q E+,S C S E Q G+,S G- S C Q B++,S E- S G- Y Q F#-,S A++ S F#+ Q A,S D#+ S F#+ Q B,S B+ S D#+ S D#,S F# S A+ Q G,S R S E Q. G+,S C S E S A S (E+,C) S (C+,E) S (E+,G) Y Q A+,S F# S D Q. F#+,S B S D S G- S (D+,B) S (B+,D) S (D+,F#) Q G,S E S C Q. E+,S A S C S F#- S (A,C+) Q. C,S A+ S C+ S F# S (G+,B) S (F#+,C) S (E+,A) Q B,S D#+ S F#+ Q B-,S B+ S D#+ Q E+,S E- S E C. R,S B S G- S E- S B- S G-- S B- Q E--,S R S G+ Q E-,S B!++ S G+ Q G-,S E+ S G+ Q B!,S C#+ S E+ Q C#-,S G+ S E+ Q. R,S C#+ S E+ S A+ Q. R,S G S F S E Y Q D,S R S F+ Q D-,S A++ S F+ Q F-,S D+ S F+ Q A!,S B+ S D+ Q B-,S F+ S D+ Q. R,S B+ S D+ S G Q. R,S F S E S D Y Q C,S R S E+ Q C-,S G+ S E+ Q E-,S C+ S E+ Q F#-,S A+ S C+ Q A-,S D#+ S C+ Q. R,S A+ S C+ S F# Q. R,S E S D# S C# Y Q B,S R S D+ Q B-,S F+ S D+ Q D-,S B+ S D+ Q F-,S G# S B+ Q G#--,S D+ S B+ Q. R,S G# S B+ S E Q. R,S D S C S B Y Q C,S R S E Q A,S A+ S C+ Q G#-,S B+ S E Q E-,S B+ S D+ Q C+,S A S E- Q A+,S A S C Q G#,S B S E- Q E,S B S D Y S (C,A+) S (E,C+) S (A+,E+) S (E,C+) S (C,A+) S (E,C+) S (A,F#) S (C,A+) S (F#-,C+) S (A,A+) S (C,F#) S (A,A+) S (F#-,D#) S (A,C+) S (D#-,B+) S (F#-,A+) Y Q E-,S G# S B+ Q G#-,S D+ S B+ Q B,S G# S B+ Q G#-,S D S F Q E-,S G# S F Q B-,S D S F Q G#--,S B S F Q E--,S E S D Y Q A-,S C S E Q C-,S A+ S E Q E-,S C S E Q C-,S A S C Q A-,S D# S C Q C-,S A S C Q D#--,S F#- S C Q R,S B S A Y Q G#-,S R S B Q B+,S G#- S E- Q G#,S D- S B Q E,S G#- S D- Q C-,S R S E Q E-,S A+ S C+ Q G#--,S B+ S E Q E-,S B+ S D+ Y Q A-,S C+ S A+ Q F#-,S C+ S E+ Q B-,S D+ S B+ S G#-,S D+ S F+ Q C-,S E+ S C+ Q A,S E+ S G+ Q D-,S F+ S E+ Q B!,S D+ S C+ Y Q G#-,S B+ S C+ Q F-,S D+ S E+ Q D-,S F+ S D+ Q B-,S G#+ S D+ Q G#--,S B++ S D+ Q A-,S C+ S A++ Q D--,S F+ S D+ Q E--,S B+ S D+ Y Q F--,S G# S B+ Q D#--,S C+ S A+ Q E--,S E S A+ Q E-,S B+ S G# M. A-,S A+ S E S C S E M A+++ $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 | C=100 !=B,E V=2 Y C B,Q R S B+ S C+ C B-,S D+ S C+ Q B+ C D-,Q F+ Q D+ C F-,Q B++ Q F+ Y M B,Q D+ S F+ S E+ S D+ S E+ Q F+ M R,Q B+ Q D+ Q F Q A!+ Y C R,Q G S E S F C B-,S G S F Q E C E-,Q B+ Q G C G-,Q E+ Q B+ Y M B,Q G S B+ S A!+ S G S A!+ Q B+ M R,Q E Q G Q C Q E Y C R,Q A S C S D C B-,S E S D Q C C C-,Q A+ Q F C E-,Q C+ Q A+ Y M A,Q E+ S F S G S A+ S G Q F M R,Q C+ Q A+ Q F+ Q C+ Y C D+,Q R S B S C C. R,S D S C Q B C E S G+ S F+ C R,S E+ S F+ Q G+ Y C C+,Q R S A S B C. R,S C S B Q A C D S F+ S E+ C R,S D+ S E+ Q F+ Y C B+,Q R S G- S A C. R,S B S A Q G- Q C S (C-,E+) S (D-,D+) S (E-,C+) S (D-,D+) Q (C-,E+) Y C F-,Q A+ S C+ S B+ C F--,S A+ S B+ Q C+ C F,Q R Q C C R,Q A Q F- Y C F+,Q R S F- S G- C F,S A S G- Q F- C A+,Q C Q A C C+,Q F Q C Y M F+,Q A S C S B S A S B Q C M R,Q F- Q A Q C- Q E- Y C R,Q D- S B- S C- C F,S D- S C- Q B- C B+,Q F- Q D- C D+,Q B Q F- Y M F+,Q D- S F- S E- S D- S E- Q F- M R,Q B- Q D- Q G-- Q B- Y C R,Q E"-- S G-- S A- C G,S B- S A- Q G-- C B+,Q E"- Q C- C C+,Q G- Q E"- Y M E"+,Q B S C- S D- S E"- S D- Q C- M R,Q G- Q E"- Q C Q G- Y C A,Q R S F S G C C,S A+ S G Q F C A,Q C+ Q A+ C F-,Q F+ Q C+ Y C F#-,Q A++ S E+ S D+ C A,S C+ S D+ Q E+ C F#-,Q A+ Q C+ C D-,Q F# Q D+ Y C B+,Q G- S G-- S A- C D+,S B- S A- Q G-- C B+,Q D- Q B- C G,Q G- Q D- Y C A!+,Q B S A! S G- C F+,S F- S G- Q A! C A!+,Q D- Q F- C F,Q B- Q D- Y C E-,Q G S C S D C G-,S E S D Q C C E-,Q G Q E C C-,Q C+ Q G Y C B"-,Q D+ S A!+ S G C D-,S F S G Q A!+ C B"-,Q D Q F C G--,Q B" Q G Y C E,Q C- S C-- S D-- C. R,S E-- S D-- Q C-- C. C- S C S D S E S D Q (C,B-) Y C. C+,Q A- S F-- S G-- S A- S G-- Q (B+,F--) C. F-,Q A+ S F S G S A+ S G Q (F,E-) Y C. F+,Q D- S B- S C- S D- S C- Q (B-,E+) C. B,Q D+ S B+ S C+ S D+ S C+ Q (A!,B+) Y C. B++,Q G- S E- S F- S G- S F- Q (E-,A!++) C. E,Q G+ S B++ S A!++ S G+ S A!++ Q (D,B++) Y Q (C,E+) S (E,G+) S (D,F+) S (C,E+) S (D,F+) Q (E,G+) Q (A,C+) S (C,E+) S (B,D+) S (A,C+) S (B,D+) Q (C,E+) Y Q (F-,A+) S (A,C+) S (B,D+) S (C,E+) S (B,D+) Q (A,C+) Q (D,F+) S (F-,A!+) S (E-,G) S (D-,F) S (E-,G) Q (F-,A!+) Y Q (E-,G) S (G-,B+) S (A,C+) S (B,D+) S (A,C+) Q (G-,B+) Q (C,E+) S (E-,G) S (D-,F) S (C-,E) S (D-,F) Q (E-,G) Y Q (D-,F) S (F-,A+) S (G-,B+) S (A,C+) S (G-,B+) Q (F-,A+) Q (B,D+) S (D-,F) S (C-,E) S (B-,D) S (C-,E) Q (D-,F) Y Q (C-,E) S (E-,G) S (F-,A+) S (G-,B+) S (F-,A+) Q (E-,G) Q (A,C+) S (C-,E) S (B-,D) S (A-,C) S (B-,D) Q (C-,E) Y C D,Q B- S B S C C. R,S D S C Q B Q F Q D,S B+ S C+ Q B+,S D+ S C+ Q (F,B+) Y Q (D,F+) Q D+,S F S E Q B++,S D S E Q (F,F+) Q (B,D+) Q D,S F+ S E+ Q F-,S D+ S E+ Q (A!,F+) Y Q (G-,B+) Q E+,S E- S F- Q B+,S G- S F- Q (E-,E+) Q (B,G) Q G-,S E S F Q E,S G S F Q (B,E) Y Q (G-,B+) Q G,S B S A! Q E+,S G- S A! Q (B,B+) Q (E-,G) Q G-,S B+ S A!+ Q B-,S G S A!+ Q (D-,B+) Y C E,Q C- S F-- S G-- C-G E+,S A- S G-- Q F-- G R Q C-,Q-G E+ G R Q A-,S E+ S D+ Q E-,S C+ S D+ Q (C-,E+) Y C F,Q A- S C- S B- C-G E+,S A- S B- Q C- G R Q (F--,E+) Q A-,S C+ S D+ Q C--,S E+ S D+ Q (E--,C+) Y Q (D--,F+) S (B-,D+) S (C-,C+) S (D-,B+) S (C-,C+) Q (B-,D+) C F-,Q F Q B+ C F--,Q C+ Q A+ Y B (B-,B+) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 | V=3 #=C,F Y Q. B-,S B+,MTS R S-G F G R S F S G S B,S-G F G R S (C,F) S (D,B+) S C,S-G F G R S (B,F) Y C A#,S C+,MTS R S-G F G R S F S G S B,S-G F G R S (C,F) S (B,C+) S C,S-G F G R S (A,F) Y Q. B,D D+,MTS R D B+ D D+ D F+ D B++ D F+ C. R,D D+ D F+ D D+ D B+ D D+ D B+ D F D B+ D F D D D F D D Y C R,S B,MTS R S-G F- G R S F- S G- S B+,S-G F- G R S (F-,C+) S (B,D+) S C+,S-G F- G R S (F-,B+) Y C A#+,S C,MTS R S-G F- G R S F- S G- S B+,S-G F- G R S (F-,C+) S (C,B+) S C+,S-G F- G R S (F-,A#+) Y D (D,B+),MTS R D (B,F) D (D,B+) D (F,D+) D (B+,F+) D (F,D+) D (D,B+) D (F,D+) D (D,B+) D (B,F) D (D,B+) D (B,F) D (F-,D) D (B,F) D (F-,D) D (B,F) D (F-,D) D (D-,B) D (F-,D) D (D-,B) Y MTQ D+,Q. B-,S B+ S-G F G R S F S G S B,S-G F G R S (C,F) S (D,B+) S C,S-G F G R S (B,F) MTS G#,Q. E S-G B+ G R S B+ S C+ S E-,S-G B+ G R S (F-,B+) S (G#-,E+) S F-,S-G B+ G R S (E-,B+) Y MTQ C+,Q. A,S A+ S-G E G R S E S F S A-,S-G E G R S (B-,E) S (C-,A+) S B-,S-G E G R S (A-,E) MTS F,Q. D- S-G A+ G R S A+ S B+ S D--,S-G A+ G R S (E--,A+) S (F--,D+) S E--,S-G A+ G R S (D--,A+) Y Q. G--,S G,D B+ D D+ M R,D B+ D G D B+ S G Q. E,D G- D B D G- D E- D G- D E- D (C-,E+) D (E-,G+) D (C-,E+) D (A-,C+) D (C-,E+) D (A-,C+) Y MTS R,Q. F--,D A+ D C+ D A+ D F D A+ D F Q. D,S F- D A D F- D D- D F- D D- D (B-,D+) D (D-,F+) D (B-,D+) D (G--,B+) D (B-,D+) D (G--,B+) Y MTS R,Q. E--,D G D B+ D G D E D G D E D (E-,C) D (G-,E) D (E-,C) D (C-,A) D (E-,C) D (C-,A) S A+,D A- D C- S F,D A- D F-- S G,D A- D F-- Y Q. (D--,F),S D S-G A G R S A C. R,S B S D--,S-G A G R S (E--,A) S (F--,D) S E--,S-G A G R S (D--,A) Y MTS R,Q. C--,S E S-G A G R S A S B S A-,S-G A G R S (B-,A) S (C-,E) S B-,S-G A G R S (A-,A) Y MTS R,C D-,D F D D D F D A+ D D+ D B+ D G# D B+ S E-,D G# D E S F-,D G# D E S E-,D B D E S F-,D B D G#- S D-,D B D G#- Y Q. (C-,E-),S A+ S-G E G R S E C. R,S F S A,S-G E G R S (B,E) S (C,A+) S B,S-G E G R S (A,E) Y C G#-,Q. E-,S B+ S-G E G R S E C. R,S F S A,S-G E G R S (B,E) S (A,B+) S B,S-G E G R S (G#-,E) Y Q. A-,C A,D C+ D A+ D C+ D E+ D A++ D F+ C. F-,D D#+ D F+ S B,D D#+ D B+ S C,D D#+ D B+ S B,D F D B+ S C,D F D D# S A,D F D D Y C. R,Q. G-,S E S-G B G R S B S C S E-,S-G B G R S (F-,B) C G,S (G-,E) S F-,S-G B G R S (E-,B) MTQ C#,Q. A S-G E G R S E S F S A-,S-G E G R S (B-,E) S (C-,A+) S B-,S-G E G R S (A-,E) MTQ F,Q. D- S-G A G R S A S B S D-,S-G A G R S (E-,A) S (F-,D) S E-,S-G A G R S (D-,A) MTQ B,Q. G- S-G D G R S D S E S G-,S-G D G R S (F-,D) S (E-,G) S F-,S-G D G R S (G-,D) MTQ E,Q. C- S-G G#- G R S G#- S A S C-,S-G G#- G R S (B-,G#-) S (A#-,C) S B-,S-G G#- G R S (C-,G#-) MTS A#,Q. F-- S-G C G R S C S D S F-,S-G C G R S (E-,C) S (D-,F) S E-,S-G C G R S (F-,C) Y Q. B-,S B,D D D B M R,D D D F D D D F D (D-,B+) D (B-,F) D (D-,B+) D (F-,D+) D (D-,B+) D (F-,D+) Q. G+,D B D G- D B D E D B D E Y MTS R,Q. A+,D C D A D C D E D C D E D (C-,A+) D (A-,E) D (C-,A+) D (E-,C+) D (C-,A+) D (E-,C+) Q. F+,D A D F- D A D D D A D D Y BTQ R,D (G,B) D (B+,G-) D (G,B) D (D,D) D (G,B) D (D,D) D (B,G) D (D,D) D (B,G) D (G-,B+) D (B,G) D (G-,B+) C E+,D E- D G- D E- D C- D E- D C- C A#- S-G F G R S F S G S G,S-G F G R S (C-,F) S (F--,E+) S B-,S-G F G R S (A#-,F) Y MTS D+,Q. B-,S F S-G B G R S B Q. R,S D S-G B G R S B Q. B-,S F S-G B G R S B Y BTQ E-,MTS G,S D+ S-G B+ G R S B+ S C+ S-G B+ G R S B+ S G+ S-G B+ G R S B+ Q. F,Q.-G A#+ G R C. A#+,C.TD F+ MTS R,Q D- D B+ C.. R,D D+ D F+ D B++ D F+ D D+ D F+ D D+ D B+ D D+ D B+ D F D B+ D F D D D F D D Y BTQ B+,MTQ D+,D B D G- D B D D D G D D D B D D D B D G- D B D G- D D- D G- D D- D B- D D- D B- Q. E#-- S-G C+ G R S C+ C. R,S G#+ S-G C+ G R S C+ S D+ S-G C+ G R S C+ Y Q. (F--,A#+),S E+ S-G C+ G R S C+ S (A#++) S (E-,A+,C+) S (F-,B+,D+) S (G-,C+,E+) S (F-,B+,D+) S (E-,A+,C+) Y C. B+,Q D-,S F+ S G+ S (E-,E+) Q. D+,Q F- S E- Q. A#+,Q (F-,C+) S (F--,B+) Y M. (B-,B+) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 | C=175 V=2 #=F Y M G-,C D+ Q G Q A+ C A,Q B+ Q C+ Y M. B,C D+ C G C G Y M. C,C E+ Q C+ Q D+ Q E+ Q F+ Y M. B,C G+ C G C G Y M. A,C C+ Q D+ Q C+ Q B+ Q A+ Y M. A,C B+ Q C+ Q B+ Q A+ Q G Y C (D,F) C B,Q G Q A+ C G-,Q B+ Q A Y C D,Q B+ MTQ A+ Q D- Q C Q B Q A Y M B,C D+ Q G Q A+ C A,Q B+ Q C+ Y C (G-,D+) C (B,G) C (G-,G) Y M. C,C E+ Q C+ Q D+ Q E+ Q F+ Y C (B,G+) C G,Q C Q B C G,Q A Q G- Y M A,C C+ Q D+ Q C+ C F-,Q B+ Q A+ Y M G,C B+ Q C+ Q B+ C B,Q A+ Q G Y C (C,A+) C D,Q B+ Q A+ C D-,Q G Q F Y M. G,M G- C G-- Y M G-,C D+ Q G Q A+ C A,Q B+ Q C+ Y M. B,C D+ C G C G Y M. C,C E+ Q C+ Q D+ Q E+ Q F+ Y M. B,C G+ C G C G Y M. A,C C+ Q D+ Q C+ Q B+ Q A+ Y M. A,C B+ Q C+ Q B+ Q A+ Q G Y C (D,F) C B,Q G Q A+ C G-,Q B+ Q A Y C D,Q B+ MTQ A+ Q D- Q C Q B Q A Y M B,C D+ Q G Q A+ C A,Q B+ Q C+ Y C (G-,D+) C (B,G) C (G-,G) Y M. C,C E+ Q C+ Q D+ Q E+ Q F+ Y C (B,G+) C G,Q C Q B C G,Q A Q G- Y M A,C C+ Q D+ Q C+ C F-,Q B+ Q A+ Y M G,C B+ Q C+ Q B+ C B,Q A+ Q G Y C (C,A+) C D,Q B+ Q A+ C D-,Q G Q F Y M. G,M G- C G-- Y M. G-,C B++ Q G+ Q A++ Q B++ Q G+ Y M. F-,C A++ Q D+ Q E+ Q F+ Q D+ Y C (E-,G+) C G-,Q E+ Q F+ C E-,Q G+ Q D+ Y M A,C C#+ Q B+ Q C#+ C (A-,A+) Y M. A,Q A+ Q B+ Q C#+ Q D+ Q E+ Q F+ Y C (B,G+) C (D,F+) C (C#,E+) Y C (D,F+) C (F-,A+) C (A,C#+) Y M. D+,C D C D- C C Y C (B,D+) C D,Q G Q F C (B,G) Y C (C,E+) C D,Q G Q F C (C,G) Y C (B,D+) C (A,C+) C (G-,B+) Y M D,Q A+ Q G Q F Q G C (R,A+) Y M D-,Q D Q E Q F Q G C F-,Q A+ Q B+ Y C (E-,C+) C (G-,B+) C (F-,A+) Y C G-,Q B+ Q D+ C (B-,G) C (D-,F) Y M. G,C G- C D- C G-- Y M. G-,C B++ Q G+ Q A++ Q B++ Q G+ Y M. F-,C A++ Q D+ Q E+ Q F+ Q D+ Y C (E-,G+) C G-,Q E+ Q F+ C E-,Q G+ Q D+ Y M A,C C#+ Q B+ Q C#+ C (A-,A+) Y M. A,Q A+ Q B+ Q C#+ Q D+ Q E+ Q F+ Y C (B,G+) C (D,F+) C (C#,E+) Y C (D,F+) C (F-,A+) C (A,C#+) Y M. D+,C D C D- C C Y C (B,D+) C D,Q G Q F C (B,G) Y C (C,E+) C D,Q G Q F C (C,G) Y C (B,D+) C (A,C+) C (G-,B+) Y M D,Q A+ Q G Q F Q G C (R,A+) Y M D-,Q D Q E Q F Q G C F-,Q A+ Q B+ Y C (E-,C+) C (G-,B+) C (F-,A+) Y C G-,Q B+ Q D+ C (B-,G) C (D-,F) Y B G,C G- C D- M G-- $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 | C=120 V=2 #=F,C Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y S (F-,F) S (G-,G) Q (A,A+) Q (G-,G) Q (F-,F) Y Q (E-,E) Q (A,A+) Q (F-,F) Q (D-,D) Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y S (F-,F) S (G-,G) Q (A,A+) Q (G-,G) Q (F-,F) Y Q (E-,E) Q (A,A+) C (D-,D) Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y S (F-,F) S (G-,G) Q (A,A+) Q (G-,G) Q (F-,F) Y Q (E-,E) Q (A,A+) Q (F-,F) Q (D-,D) Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y S (F-,F) S (G-,G) Q (A,A+) Q (G-,G) Q (F-,F) Y Q (E-,E) Q (A,A+) C (D-,D) Y Q A-,S C+ S D+ Q (A,E+) Q A-,S C+ S D+ Q (A,E+) Y Q (A-,A++) Q (A,E+) C E+,Q A Q A Y Q (A-,A++) Q (A,E+) Q (A-,A++) Q (A,E+) Y Q A-,S D+ S C+ Q A,S B+ S A+ Q (E--,B+) Q (E-,E) Y Q (E--,E+) Q (D#+,E-) Q (E--,E) C D+,Q E- Q E-- Q (E-,C+) Q (E--,A++) Q (E-,G#+) Y Q (E--,E+) Q (D#+,E-) Q (E--,E) C D+,Q E- Q E-- Q (E-,C+) Q (E--,A++) Q (E-,G#+) Y Q E--,S E+ S D#+ Q E-,S C+ S D+ Q E--,S E+ S D#+ Q E-,S C+ S D+ Y Q (E--,E+) Q (E-,G#) Q (C-,A+) Q (D-,D+) Y C E-,S C+ S D+ Q E+ Q (A-,A+) Q (D-,D) Y S (C-,C) S (D-,D) Q (E-,E) C (A-,A) Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y S (F-,F) S (G-,G) Q (A,A+) Q (G-,G) Q (F-,F) Y Q (E-,E) Q (A,A+) Q (F-,F) Q (D-,D) Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y S (F-,F) S (G-,G) Q (A,A+) Q (G-,G) Q (F-,F) Y Q (E-,E) Q (A,A+) C (D-,D) Y Q A-,S C+ S D+ Q (A,E+) Q A-,S C+ S D+ Q (A,E+) Y Q (A-,A++) Q (A,E+) C E+,Q A Q A Y Q (A-,A++) Q (A,E+) Q (A-,A++) Q (A,E+) Y Q A-,S D+ S C+ Q A,S B+ S A+ Q (E--,B+) Q (E-,E) Y Q (E--,E+) Q (D#+,E-) Q (E--,E) C D+,Q E- Q E-- Q (E-,C+) Q (E--,A++) Q (E-,G#+) Y Q (E--,E+) Q (D#+,E-) Q (E--,E) C D+,Q E- Q E-- Q (E-,C+) Q (E--,A++) Q (E-,G#+) Y Q E--,S E+ S D#+ Q E-,S C+ S D+ Q E--,S E+ S D#+ Q E-,S C+ S D+ Y Q (E--,E+) Q (E-,G#) Q (C-,A+) Q (D-,D+) Y C E-,S C+ S D+ Q E+ Q (A-,A+) Q (D-,D) Y S (C-,C) S (D-,D) Q (E-,E) C (A-,A) Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y S (F-,F) S (G-,G) Q (A,A+) Q (G-,G) Q (F-,F) Y Q (E-,E) Q (A,A+) Q (F-,F) Q (D-,D) Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y C A,Q D-- Q D- Q D--,S G+ S F+ Q D-,S E+ S D+ Y S (F-,F) S (G-,G) Q (A,A+) Q (G-,G) Q (F-,F) Y Q (E-,E) Q (A,A+) M (F,D+) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 | T=97 C=130 V=4 !=B,E Y MTQ R,Q F-- Q G-- Q-G B- G R Q B- Q G-- Y BTC. B-,C F,C-G (D,B+) G R C G,C-G (D,B+) G R C A!+,C-G (D,B+) G R Q G,Q-G (D,B+) G R C-G (D,F,B+) G R Q F,Q-G (D,B+) G R C G,C-G (D,B+) Q F-- G R C A!+,C-G (D,B+),Q G-- Q-G B- G R C G,C-G (D,B+),Q B- Q-G G-- G R Y BTC. B-,C F,C-G (D,B+) G R C G,C-G (D,B+) G R C A!+,C-G (D,B+) G R Q G,Q-G (D,B+) G R C-G (D,F,B+) G R Q F,Q-G (D,B+) G R C G,C-G (D,B+) Q F-- G R C A!+,C-G (D,B+),Q G-- Q-G B- G R C (D,G),C-G B+,Q B- Q G-- G R Y B-G (B+,D+,F+),C B- Q G- Q G!- C-G F- G R C F- G R Y B B-,M-G (D+,F+),C A!++ C G+ G R C (B+,D+),Q-G F+ G R Q F+ Q E+ C F+,C-G C+,BTQ A!+ C A!- G R Q C+ M. D+,Q G- Q G!- C-G F- G R C F- Y M-G (C+,D+,F+),Q-G A!++ G R Q A!++ C G+ G R C (A!+,C+,D+,F+) C A!-,Q E+ C (F+,B"+),BTQ G C G-- Q C+ M.-G (B"+,D+),Q G- Q G!- C-G F- G R C F- G R Y B G--,M-G (B"+,F+),C A!++ C G+ G R C. (B"+,D+),C F+ Q G+ C. (E,G-),C D!+ M E- Q B+ Q G MTQ B+,MTQ-G (E,G) C-G B- G R C B- G R Y M E-,C.-G (E,G),Q D!+ Q C+ Q B+ G R MTQ-G E,MTQ G,C C+ C-G B- C. B+ G R C B- G R Y M E-,M-G (E,G!),3C D!+ 3C C+ 3C-G B+ G R M E,M-G G!,C.-G B+,C-G B- G R C B- G R Q-G B+ G R Y M-G (E-,G!),M B+,3C F+ 3C E+ 3C F+ G R M (E-,E,G!),Q D!+ Q-G B+ G R C-G B+ G R Y M.-G D+,M-G B-,C-G (F,B+) G R C-G (F,B+) G R M-G B-,Q-G (F,B+) G R C.-G (F,B+) G R Q-G D+ G R Q-G D+ G R Y M-G B-,C. B+,C.-G F#,Q-G D+ G R C D+ G R MTQ (D,F#),C C+ G R M-G B- C.-G B+ G R Y M.-G D+,M-G B-,C-G (G,B+) G R C-G (G,B+) G R M-G B-,Q-G (G,B+) G R C. (G,B+) G R Q-G D+ G R Q D+ G R Y M-G B-,Q (A!++) C D+,C-G A!+ G R MTQ (D,A!+),C C+ G R C B- C.-G B+ C D- G R Y M G,M-G B+,3C (E-,F+) 3C (G-,E+) 3C (B,F+) G R M F,M-G B+,3C (B-,E+) 3C (D-,D+) 3C F-,3C-G E+ G R Y M (B+,E+,F+),M-G G G R M (F--,E,G),3C-G B+ G R 3C-G B+ G R 3C B+ Y C B-,Q (D!+) M.-G (D,F,C+) Q G- Q G!- C-G F- G R Q F- G R BTQ-G (D,F,B+),C G- Q G!- Q F- C G- Q G!- C F- G R Y B-G B-,C F,C-G (D,B+) G R C G,C-G (D,B+) G R C A!+,C-G (D,B+) G R Q G-,Q-G (D,B+) G R C-G (D,F,B+) G R B-G B- G R Q F,Q-G (D,B+) G R C G,C-G (D,B+) G R C A!+,C-G (D,B+) G R C (D,G),C-G B+ G R Y B-G (B+,D+,F+),C B- Q G- Q G!- C-G F- G R C F- G R Y B B-,M-G (D+,F+),C A!++ C G+ G R C (B+,D+),Q-G F+ G R Q F+ Q E+ C F+,C-G C+,BTQ A!+ C A!- G R Q C+ M. D+,Q G- Q G!- C-G F- G R C F- Y M-G (C+,D+,F+),Q-G A!++ G R Q A!++ C G+ G R C (A!+,C+,D+,F+) C A!-,Q E+ C (F+,B"+),BTQ G C G-- Q C+ M.-G (B"+,D+),Q G- Q G!- C-G F- G R C F- G R Y B G--,M-G (B"+,F+),C A!++ C G+ G R C. (B"+,D+),C F+ Q G+ C. (E,G-),C D!+ M E- Q B+ Q G MTQ B+,MTQ-G (E,G) C-G B- G R C B- G R Y M E-,C.-G (E,G),Q D!+ Q C+ Q B+ G R MTQ-G E,MTQ G,C C+ C-G B- C. B+ G R C B- G R Y M E-,M-G (E,G!),3C D!+ 3C C+ 3C-G B+ G R M E,M-G G!,C.-G B+,C-G B- G R C B- G R Q-G B+ G R Y M-G (E-,G!),M B+,3C F+ 3C E+ 3C F+ G R M (E-,E,G!),Q D!+ Q-G B+ G R C-G B+ G R Y M.-G D+,M-G B-,C-G (F,B+) G R C-G (F,B+) G R M-G B-,Q-G (F,B+) G R C.-G (F,B+) G R Q-G D+ G R Q-G D+ G R Y M-G B-,C. B+,C.-G F#,Q-G D+ G R C D+ G R MTQ (D,F#),C C+ G R M-G B- C.-G B+ G R Y M.-G D+,M-G B-,C-G (G,B+) G R C-G (G,B+) G R M-G B-,Q-G (G,B+) G R C. (G,B+) G R Q-G D+ G R Q D+ G R Y M-G B-,Q (A!++) C D+,C-G A!+ G R MTQ (D,A!+),C C+ G R C B- C.-G B+ C D- G R Y M G,M-G B+,3C (E-,F+) 3C (G-,E+) 3C (B,F+) G R M F,M-G B+,3C (B-,E+) 3C (D-,D+) 3C F-,3C-G E+ G R Y M (B+,E+,F+),M-G G G R M (F--,E,G),3C-G B+ G R 3C-G B+ G R 3C B+ Y C B-,Q (D!+) M.-G (D,F,C+) Q G- Q G!- C-G F- G R Q F- G R M.TQ (D,F,C+),C G- Q G!- Q F- C G- Q G!- C F-,Q C+ BTBTQ (B,D),C G C B- BTMTC. F Q G- Q G!- C-G F- G R Q F- C G- Q G!- Q F- C G- Q G!- C F- Y M F+,M-G (A!+,D!+),C-G D!- G R C-G D!- G R M D!+,M-G (A!+,E+),C-G D!- G R C D!- G R Y C. (A!+,C+),C E+,C-G A!- G R C A!-,Q F+ Q (D!+) M (E,G),C.-G B+,C-G E- G R C E- G R Q-G B+ G R Y M-G (G!,B+),C-G G!--,3C-G D!+ G R 3C-G D!+ G R C-G G!-- G R 3C D!+ G R 3CT3C (G!,B+),C-G G!--,3C E+ 3C D!+ G R C G!-- 3C R,3C-G B+ G R Y B (B+,D+),B-G F+,C-G B- G R C-G B- G R C-G B- G R C B- G R Y M-G (A!+,D!+),C.-G F+,C-G D!- G R C-G D!- G R Q F+ G R M D!+,M-G A!+,C-G D!-,Q-G E+ G R C.-G E+ G R C D- G R Y C. (A!+,C+),C E+,C-G A!- G R C A-,Q F+ Q (D!+) M (E,G),M-G B+,C-G E- G R C E- G R Y M-G (G!,B+),C-G (G!--,D!+) G R C (G!--,D!+) G R C.-G (G!,B+),C-G G!--,Q E+ Q D+ G R Q (G!--,E+) G R BTBTQ (G,B+),BTBTQ-G E+,C. F+ Q B++ Q G+ C F+ Q B++ Q G+ C F+ Q B++ Q G+ C F+ C B++ G R Y B-G (B+,D+,F+),C B- Q G- Q G!- C-G F- G R C F- G R Y B B-,M-G (D+,F+),C A!++ C G+ G R C (B+,D+),Q-G F+ G R Q F+ Q E+ C F+,C-G C+,BTQ A!+ C A!- G R Q C+ M. D+,Q G- Q G!- C-G F- G R C F- Y M-G (C+,D+,F+),Q-G A!++ G R Q A!++ C G+ G R C (A!+,C+,D+,F+) C A!-,Q E+ C (F+,B"+),BTQ G C G-- Q C+ M.-G (B"+,D+),Q G- Q G!- C-G F- G R C F- G R Y B G--,M-G (B"+,F+),C A!++ C G+ G R C. (B"+,D+),C F+ Q G+ C. (E,G-),C D!+ M E- Q B+ Q G MTQ B+,MTQ-G (E,G) C-G B- G R C B- G R Y M E-,C.-G (E,G),Q D!+ Q C+ Q B+ G R MTQ-G E,MTQ G,C C+ C-G B- C. B+ G R C B- G R Y M E-,M-G (E,G!),3C D!+ 3C C+ 3C-G B+ G R M E,M-G G!,C.-G B+,C-G B- G R C B- G R Q-G B+ G R Y M-G (E-,G!),M B+,3C F+ 3C E+ 3C F+ G R M (E-,E,G!),Q D!+ Q-G B+ G R C-G B+ G R Y M.-G D+,M-G B-,C-G (F,B+) G R C-G (F,B+) G R M-G B-,Q-G (F,B+) G R C.-G (F,B+) G R Q-G D+ G R Q-G D+ G R Y M-G B-,C. B+,C.-G F#,Q-G D+ G R C D+ G R MTQ (D,F#),C C+ G R M-G B- C.-G B+ G R Y M.-G D+,M-G B-,C-G (G,B+) G R C-G (G,B+) G R M-G B-,Q-G (G,B+) G R C. (G,B+) G R Q-G D+ G R Q D+ G R Y M-G B-,Q (A!++) C D+,C-G A!+ G R MTQ (D,A!+),C C+ G R C B- C.-G B+ C D- G R Y M G,M-G B+,3C (E-,F+) 3C (G-,E+) 3C (B,F+) G R M F,M-G B+,3C (B-,E+) 3C (D-,D+) 3C F-,3C-G E+ G R Y M (B+,E+,F+),M-G G G R M (F--,E,G),3C-G B+ G R 3C-G B+ G R 3C B+ Y C B-,Q (D!+) M. C+,M.-G (D,F+) Q G- Q G!- C-G F- G R Q F- G R M.TQ (D,F,B+),C G- Q G!- Q F- C G- Q G!- C F-,Q C+ MTC.TQ B,MTC.TQ-G D,C G C B- M.-G F Q G- Q G!- C-G F- G R Q F- G R B. (B-,D,F,B+) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 | C=110 S(C#-,C#--) S R S(F#-,F#--) S F# S(C#,C#+,C#-,A#) S F# S(A#,A#+,C#-,F#-) S(C#,C#+) S(G--,G-) S F S(C#,C#+,G#--,G#-) S F S(B,G#,C#-,F-) S(C#,C#+) S(C#,C#+,C#-,B) S R S(C#--,C#-) S R S(F#--,F#-) S F# S(C#,C#+,C#-,A#) S F# S(A#,A#+,C#-,F#-) S(C#,C#+) S(G--,G-) S F S(C#,C#+,G#--,G#-) S F S(B,G#,C#-,F-) S(C#,C#+) S(C#,C#+,C#-,B) S R S(C#--,C#-) S(C#,C#+) S(D--,D-) S F# S A+ S(D,D+) S(C#--,C#-) S(C#,C#+) S(C#--,C#-) S(C#,C#+) S(D--,D-) S F# S A+ S(D,D+) S(C#--,C#-) S(C#,C#+) S R S R S(F#--) S(F#--) S A- S(F#-) S(F#--) S(F#-) S A S F# S(F#-) S F# S A+ S(F#+) S F# S(F#+) S(A++) S(F#++) S(F#+,A+,C,D#) S R S(F#+,A+,C,D#) S R S(F#+,A+,C,D#) S R S(F#+,A+,C,D#) S R S(F#+,A#+,C#,F#) S(C#+) S(A#+,D#+,C#,F#) S(A#+) S(A#+,C#+,C#,F#) S(D#+,F#) S(F#,A#+,C#) S(D+,F#+) S(D+,F#+,D,A+) S(G#+) S(D+,A++,D,A+) S(F#+) S(A#+,G#+,C#) S(C#+,A#++) S(C#,A#+) S(F#+) S(C#+,A#++,C#,A#+) S(F#+) S(C#+,G#+,C#,F) S R S(C#+,F#+,F#,A#+) S R S R S(F#,F#+) S(F#,F#+,C-,A) S R S(F#,F#+,C-,A) S R S(F#,F#+,C-,G#-) S R S(F#,F#+,C-,A) S R S(F#,F#+,C#-,A#) S(C#+) S(F#,D#+,C#-,A#) S(A#+) S(A#,C#+,C#-,F#-) S(F#,D#+) S(F#-,A#,C#-) S(D,F#) S(D,F#,D-,A) S G# S(D,A+,D-,A) S F# S(A#,G#,C#-,F#-) S(C#,A#+) S(F#-,A#,C#-) S F# S(C#,A#+,C#-,A#) S F# S(C#,G#,C#-,B) S R S(C#,F#,F#-,A#) S R S(C#--,C#-) S R S(F#-,F#--) S F# S(C#,C#+,C#-,A#) S F# S(A#,A#+,C#-,F#-) S(C#,C#+) S(G--,G-) S F S(C#,C#+,G#--,G#-) S F S(B,G#,C#-,F-) S(C#,C#+) S(C#,C#+,C#-,B) S R S(C#--,C#-) S R S(F#--,F#-) S F# S(C#,C#+,C#-,A#) S F# S(A#,A#+,C#-,F#-) S(C#,C#+) S(G--,G-) S F S(C#,C#+,G#--,G#-) S F S(B,G#,C#-,F-) S(C#,C#+) S(C#,C#+,C#-,B) S R S(C#--,C#-) S(C#,C#+) S(D--,D-) S F# S A+ S(D,D+) S(C#--,C#-) S(C#,C#+) S(C#--,C#-) S(C#,C#+) S(D--,D-) S F# S A+ S(D,D+) S(C#--,C#-) S(C#,C#+) S R S R S(F#--) S(F#--) S A- S(F#-) S(F#--) S(F#-) S A S F# S(F#-) S F# S A+ S(F#+) S F# S(F#+) S(A++) S(F#++) S(F#+,A+,C,D#) S R S(F#+,A+,C,D#) S R S(F#+,A+,C,D#) S R S(F#+,A+,C,D#) S R S(F#+,A#+,C#,F#) S(C#+) S(A#+,D#+,C#,F#) S(A#+) S(A#+,C#+,C#,F#) S(D#+,F#) S(F#,A#+,C#) S(D+,F#+) S(D+,F#+,D,A+) S(G#+) S(D+,A++,D,A+) S(F#+) S(A#+,G#+,C#) S(C#+,A#++) S(C#,A#+) S(F#+) S(C#+,A#++,C#,A#+) S(F#+) S(C#+,G#+,C#,F) S R S(C#+,F#+,F#,A#+) S R S R S(F#,F#+) S(F#,F#+,C-,A) S R S(F#,F#+,C-,A) S R S(F#,F#+,C-,G#-) S R S(F#,F#+,C-,A) S R S(F#,F#+,C#-,A#) S(C#+) S(F#,D#+,C#-,A#) S(A#+) S(A#,C#+,C#-,F#-) S(F#,D#+) S(F#-,A#,C#-) S(D,F#) S(D,F#,D-,A) S G# S(D,A+,D-,A) S F# S(A#,G#,C#-,F#-) S(C#,A#+) S(F#-,A#,C#-) S F# S(C#,A#+,C#-,A#) S F# S(C#,G#,C#-,B) S R S(C#,F#,F#-,A#) S R S(G--,G-) S R S(G#-,G#--) S F+ S(B,C#+,C#-,F-) S F+ S(C#-,G#+,C#--) S(C+,C++) S(F-,B,C#-) S F+ S(B+,B++,G#--,G#-) S F+ S(B,G#+,C#-,F-) S(A#+,A#++) S(A#+,A#++,C#--,C#-) S(C#+) S(G#,G#+,F--,F-) S(C#+) S(F#--,F#-) S(A#+) S(F#,F#+,C#-,A#) S(A#+) S(C#-,C#+,C#--) S(D#,D#+) S(F#-,A#,C#-) S(A#+) S(F#,F#+,F#--,F#-) S(A#+) S(A#,C#+,C#-,F#-) S(D#,D#+) S(D#,D#+,F#--,F#-) S(A#+) S(D#,D#+,G--,G-) S R S(G#--,G#-) S(C#+) S(F,F+,C#-,B) S G# S(C#-,B+,C#--) S(D#,D#+) S(F-,B,C#-) S(C#+) S(F,F+,G#--,G#-) S G# S(B,B+,C#-,F-) S(D#,D#+) S(D#,D#+,G#--,G#-) S B+ S(D#,D#+,A-,A) S R S(A#-,A#) S(A#+) S(F#,F#+,C#-,A#) S(A#+) S(C#-,C#+,C#--) S(D#,D#+) S(F#-,A#,C#-) S(A#+) S(F#,F#+,F#--,F#-) S(A#+) S(A#,C#+,C#-,F#-) S(D#,D#+) S(D#,D#+,F#--,F#-) S(A#+) S(D#,D#+,G--,G-) S R S(G#--,G#-) S F+ S(B,C#+,C#-,F-) S F+ S(C#-,G#+,C#--) S(C+,C++) S(F-,B,C#-) S F+ S(B+,A#++,G#--,G#-) S F+ S(B,G#+,C#-,F-) S(A#+,A#++) S(A#+,A#++,C#--,C#-) S(C#+) S(G#,G#+,F--,F-) S(C#+) S(F#--,F#-) S(A#+) S(F#,F#+,C#-,A#) S(A#+) S(C#-,C#+,C#--) S(D#,D#+) S(F#-,A#,C#-) S(A#+) S(F#,F#+,F#--,F#-) S R S(F#,F#+,F#--,F#-) S R S(F,F+,F--,F-) S R S(E,E+,E--,E-) S R S(D#--,D#-) S D# S(D#-,G,D#--) S(A#+) S(G-,D#+,G--) S(A#+) S(G-,G,G--) S D# S(G#--,G#-) S D# S(B,G#,D#-,G#-) S B+ S(D#,D#+,D#-,B) S R S(D#,B+,D#-,G#-) S R S(C,A#+,G#--,D#-) S R S(D#-,G#-,G#--) S(F#,A#+,C,D#) S(C#-,C#--) S(B,G#) S(F--,F-) S C# S(A#,F#,F#--,F#-) S R S(C#,C#+,C#-,A#) S R S(C#,C#+,C#-,A#) S R S(C#,C#+,G--,G-) S R S(G#-,G#--) S F+ S(B,C#+,C#-,F-) S F+ S(C#-,G#+,C#--) S(C+,C++) S(F-,B,C#-) S F+ S(B+,B++,G#--,G#-) S F+ S(B,G#+,C#-,F-) S(A#+,A#++) S(A#+,A#++,C#--,C#-) S(C#+) S(G#,G#+,F--,F-) S(C#+) S(F#--,F#-) S(A#+) S(F#,F#+,C#-,A#) S(A#+) S(C#-,C#+,C#--) S(D#,D#+) S(F#-,A#,C#-) S(A#+) S(F#,F#+,F#--,F#-) S(A#+) S(A#,C#+,C#-,F#-) S(D#,D#+) S(D#,D#+,F#--,F#-) S(A#+) S(D#,D#+,G--,G-) S R S(G#--,G#-) S(C#+) S(F,F+,C#-,B) S G# S(C#-,B+,C#--) S(D#,D#+) S(F-,B,C#-) S(C#+) S(F,F+,G#--,G#-) S G# S(B,B+,C#-,F-) S(D#,D#+) S(D#,D#+,G#--,G#-) S B+ S(D#,D#+,A-,A) S R S(A#-,A#) S(A#+) S(F#,F#+,C#-,A#) S(A#+) S(C#-,C#+,C#--) S(D#,D#+) S(F#-,A#,C#-) S(A#+) S(F#,F#+,F#--,F#-) S(A#+) S(A#,C#+,C#-,F#-) S(D#,D#+) S(D#,D#+,F#--,F#-) S(A#+) S(D#,D#+,G--,G-) S R S(G#--,G#-) S F+ S(B,C#+,C#-,F-) S F+ S(C#-,G#+,C#--) S(C+,C++) S(F-,B,C#-) S F+ S(B+,A#++,G#--,G#-) S F+ S(B,G#+,C#-,F-) S(A#+,A#++) S(A#+,A#++,C#--,C#-) S(C#+) S(G#,G#+,F--,F-) S(C#+) S(F#--,F#-) S(A#+) S(F#,F#+,C#-,A#) S(A#+) S(C#-,C#+,C#--) S(D#,D#+) S(F#-,A#,C#-) S(A#+) S(F#,F#+,F#--,F#-) S R S(F#,F#+,F#--,F#-) S R S(F,F+,F--,F-) S R S(E,E+,E--,E-) S R S(D#--,D#-) S D# S(D#-,G,D#--) S(A#+) S(G-,D#+,G--) S(A#+) S(G-,G,G--) S D# S(G#--,G#-) S D# S(B,G#,D#-,G#-) S B+ S(D#,D#+,D#-,B) S R S(D#,B+,D#-,G#-) S R S(C,A#+,G#--,D#-) S R S(D#-,G#-,G#--) S(F#,A#+,C,D#) S(C#-,C#--) S(B,G#) S(F--,F-) S C# S(F#--,F#-) S F# S(C#,A#+,F#-,A#) S(C#+) S(F#,F#+,F#-,A#) S R S(C#--,C#-) S R S(F#-,F#--) S F# S(C#,C#+,C#-,A#) S F# S(A#,A#+,C#-,F#-) S(C#,C#+) S(G--,G-) S F S(C#,C#+,G#--,G#-) S F S(B,G#,C#-,F-) S(C#,C#+) S(C#,C#+,C#-,B) S R S(C#--,C#-) S R S(F#--,F#-) S F# S(C#,C#+,C#-,A#) S F# S(A#,A#+,C#-,F#-) S(C#,C#+) S(G--,G-) S F S(C#,C#+,G#--,G#-) S F S(B,G#,C#-,F-) S(C#,C#+) S(C#,C#+,C#-,B) S R S(C#--,C#-) S(C#,C#+) S(D--,D-) S F# S A+ S(D,D+) S(C#--,C#-) S(C#,C#+) S(C#--,C#-) S(C#,C#+) S(D--,D-) S F# S A+ S(D,D+) S(C#--,C#-) S(C#,C#+) S R S R S(F#--) S(F#--) S A- S(F#-) S(F#--) S(F#-) S A S F# S(F#-) S F# S A+ S(F#+) S F# S(F#+) S(A++) S(F#++) S(F#+,A+,C,D#) S R S(F#+,A+,C,D#) S R S(F#+,A+,C,D#) S R S(F#+,A+,C,D#) S R S(F#+,A#+,C#,F#) S(C#+) S(A#+,D#+,C#,F#) S(A#+) S(A#+,C#+,C#,F#) S(D#+,F#) S(F#,A#+,C#) S(D+,F#+) S(D+,F#+,D,A+) S(G#+) S(D+,A++,D,A+) S(F#+) S(A#+,G#+,C#) S(C#+,A#++) S(C#,A#+) S(F#+) S(C#+,A#++,C#,A#+) S(F#+) S(C#+,G#+,C#,F) S R S(C#+,F#+,F#,A#+) S R S R S(F#,F#+) S(F#,F#+,C-,A) S R S(F#,F#+,C-,A) S R S(F#,F#+,C-,G#-) S R S(F#,F#+,C-,A) S R S(F#,F#+,C#-,A#) S(C#+) S(F#,D#+,C#-,A#) S(A#+) S(A#,C#+,C#-,F#-) S(F#,D#+) S(F#-,A#,C#-) S(D,F#) S(D,F#,D-,A) S G# S(D,A+,D-,A) S F# S(A#,G#,C#-,F#-) S(C#,A#+) S(F#-,A#,C#-) S F# S(C#,A#+,C#-,A#) S F# S(C#,G#,C#-,B) S R S(C#,F#,F#-,A#) S R S(F#+,F#) S R S(C#-,C#--,F#+,F#) S R S(A#,F#-,E) S(G#,C#+,F#+) S(E-,E--,F#+,G#) S(C#+,A#+) S(A#,F#-,G#,E) S R S(D#-,D#--,F#+,F#) S R S(A#,F#-,E) S(G#,C#+,F#+) S(C#-,C#--,F#+,G#) S(C#+,A#+) S(A#-,A#--,G#) S(A#+,C#+) S(B-,B--,F#) S B+ S(B,F#-,G#,D#) S B+ S(F#-,F#--,D#+) S F# S(B,F#-,B+,D#) S(D#+) S(D#-,D#--,G#) S B+ S(B,F#-,D#+,D#) S F# S(B-,B--,F#) S(D#+) S(C-,C--,G#) S(D#+) S(C#-,C#--,F#+,F#) S R S(A#,F#-,E) S(G#,C#+,F#+) S(E-,E--,F#+,G#) S(C#+,A#+) S(A#,F#-,G#,E) S R S(D#-,D#--,F#+,F#) S R S(A#,F#-,E) S(G#,C#+,F#+) S(C#-,C#--,F#+,G#) S(C#+,A#+) S(A#-,A#--,G#) S(A#+,C#+) S(B-,B--,F#) S B+ S(B,F#-,G#,D#) S B+ S(F#-,F#--,D#+) S F# S(F#-,B,D#,B+) S(D#+) S(D#-,D#--,G#) S B+ S(F#-,B,D#,D#+) S F# S(C#--,B-,F#) S(D#+) S(A#--,A#-,G) S(D#+) S(G#,G#--,G#+,G#) S R S(C,G#-,F#) S(A#+,G#+) S(C-,C--,G#+,A#+) S(D#+,C+) S(C,G#-,A#+,F#) S R S(D#-,D#--,G#+,G#) S R S(C,G#-,F#) S(A#+,G#+) S(G#-,G#--,G#+,A#+) S(D#+,C+) S(B,G#-,A#+,F#) S(D#+,C+) S(C#-,C#--) S(C#+) S(E,G#-,G#+,G#) S(C#+) S(E-,E--,E+) S(A#++,A#+) S(C#,G#-,E) S(C#+) S(C#-,C#--,G#+,G#) S(C#+) S(C#,G#-,E+,E) S(A#++,A#+) S(E-,E--,A#++,A#+) S(C#+) S(E,G#-,G#+,G#) S R S(B+,F-,B++,D+) S(G#-) S(D+,B+,B++) S B S(A#+,D,A#++,D+) S B S(G#,G#-,G#+,D+) S F- S(F#-,F#--,D#+,F#) S B+ S(B,F#-,C#+,D#) S(E+,G#) S(G#,G#--,E+) S G# S(C,F#-,D#+,F#) S R S(B,C#-,D#+,F) S B+ S(B,C#-,C#+,G#-) S(D#+,E) S(A#,F#-,D#+,E) S(A#+) S(A#,F#-,C#+,E) S(B+,D#) S(B,B-,B+,D#) S(F#+,F#) S(B,F#-,D#) S(D#+) S(B,F#-,F#+,F#) S(D#+) S(C-,C--,F#+,F#) S(D#+) S(C#-,C#--,F#+,F#) S R S(A#,F#-,E) S(G#,C#+,F#+) S(E-,E--,F#+,G#) S(C#+,A#+) S(A#,F#-,G#,E) S R S(D#-,D#--,F#+,F#) S R S(A#,F#-,E) S(G#,C#+,F#+) S(C#-,C#--,F#+,G#) S(C#+,A#+) S(A#-,A#--,G#) S(A#+,C#+) S(B-,B--,F#) S B+ S(B,F#-,G#,D#) S B+ S(F#-,F#--,D#+) S F# S(B,F#-,B+,D#) S(D#+) S(D#-,D#--,G#) S B+ S(B,F#-,D#+,D#) S F# S(B-,B--,F#) S(D#+) S(C-,C--,G#) S(D#+) S(C#-,C#--,F#+,F#) S R S(A#,F#-,E) S(G#,C#+,F#+) S(E-,E--,F#+,G#) S(C#+,A#+) S(A#,F#-,G#,E) S R S(D#-,D#--,F#+,F#) S R S(A#,F#-,E) S(G#,C#+,F#+) S(C#-,C#--,F#+,G#) S(C#+,A#+) S(A#-,A#--,G#) S(A#+,C#+) S(B-,B--,F#) S B+ S(B,F#-,G#,D#) S B+ S(F#-,F#--,D#+) S F# S(F#-,B,D#,B+) S(D#+) S(D#-,D#--,G#) S B+ S(F#-,B,D#,D#+) S F# S(C#--,B-,F#) S(D#+) S(A#--,A#-,G) S(D#+) S(G#,G#--,G#+,G#) S R S(C,G#-,F#) S(A#+,G#+) S(C-,C--,G#+,A#+) S(D#+,C+) S(C,G#-,A#+,F#) S R S(D#-,D#--,G#+,G#) S R S(C,G#-,F#) S(A#+,G#+) S(G#-,G#--,G#+,A#+) S(D#+,C+) S(B,G#-,A#+,F#) S(D#+,C+) S(C#-,C#--) S(C#+) S(E,G#-,G#+,G#) S(C#+) S(E-,E--,E+) S(A#++,A#+) S(C#,G#-,E) S(C#+) S(C#-,C#--,G#+,G#) S(C#+) S(C#,G#-,E+,E) S(A#++,A#+) S(E-,E--,A#++,A#+) S(C#+) S(E,G#-,G#+,G#) S R S(B+,F-,B++,D+) S(G#-) S(D+,B+,B++) S B S(A#+,D,A#++,D+) S B S(G#,G#-,G#+,D+) S F- S(F#-,F#--,D#+,F#) S B+ S(B,F#-,C#+,D#) S(E+,G#) S(G#,G#--,E+) S G# S(C,F#-,D#+,F#) S R S(B,C#-,D#+,F) S B+ S(B,C#-,C#+,G#-) S(D#+,E) S(A#,F#-,D#+,E) S(A#+) S(A#,F#-,C#+,E) S(B+,D#) S(B,B-,B+,D#) S B+ S(F#-,F#--,D#+) S(F#+) S(B-,B--,B++,B+) S R S(A#-,A#-) S R S(B,G#--,F#+,F#) S R S(B,F#-,D#+,F#) S R S(B,F#-,F#+,F#) S R S(A#,A#-,D#+,F#) S R S(B,B-,F#+,D#+) S R S(D#,F#-,G#+,D#+) S(A#++,D#+) S(G#-,G#--,A#++,D#+) S(G#+) S(A,A-,F#+) S(D#+) S(A#,A#-,C#+) S(D#+) S(A#,F#-,C#) S(A#+,F#) S(C#,F#-,A#+,F#) S R S(C#-,C#--) S R S(F#-,F#--) S(C#+) S(F#-,C#-,D#+,F#) S(A#+) S(C#-,C#--,C#+) S(D#+,F#) S(G-,G--) S(A#+) S(G#-,G#--,C#+,F) S R S(F-,C#-,D#+,B) S(G#,F) S(C#-,C#--,G#,F) S R S(G-,G--) S R S(G#-,G#--) S B+ S(F-,C#-,D#+,F) S G# S(C#-,C#--,B+) S(D#+,F) S(F-,F--) S(A#+,F#) S(F#-,F#--,A#+,F#) S(C#+) S(F#-,C#-,D#+,F#) S(A#+) S(C#-,C#--,C#+) S(D#+,F#) S(F#-,C#-,A#) S(A#+,F#) S(F#-,F#--,A#+,F#) S(C#+) S(F#-,C#-,D#+,F#) S(A#+) S(G#-,G#--,C#+) S(D#+,F#) S(A#,A#-) S(C#+) S(B,B-,F#+,F#) S R S(B,F#-,D#+,F#) S R S(B,F#-,F#+,F#) S R S(A#,A#-,D#+,F#) S R S(B,B-,F#+,D#+) S R S(B,F#-,G#+,D#+) S(A#++,D#+) S(G#-,G#--,A#++,D#+) S(G#+) S(A,A-,F#+) S(D#+) S(A#,A#-,F#+) S R S(A#,F#-,D#+,C#) S R S(A#,F#-,C#+,C#) S(F#+) S(C#-,C#--) S(A#+,F#) S(F#-,F#--,A#+,F#) S(C#+) S(A#,C#-,D#+,F#) S(A#+) S(C#-,C#--,C#+) S(D#+,F#) S(F#-,C#-,A#) S(F#,D#) S(B-,B--,F#,D#) S G# S(B-,B--,F#,D#) S R S(G#--,G#---,F#,D) S R S(C-,C--,G#,D#) S(F#,C#) S(C#-,C#--,F#,C#) S G# S(F#-,C#-,A#+,C#) S F# S(C#-,C#--,G#) S(A#+,C#) S(D-,D--) S(F#,C) S(D#-,D#--,F#,C) S G# S(D#-,D#--,A#+,C) S F# S(F-,F--) S(G#,B) S(F-,F--) S C# S(F#-,F#--,F#,A#) S R S(F#-,C#-,C#+,C#) S R S(G#-,G#--,C#+,C#) S R S(A#,A#-,C#+,C#) S R S(B,G#--,F#+,F#) S R S(B,F#-,D#+,F#) S R S(B,F#-,F#+,F#) S R S(A#,A#-,D#+,F#) S R S(B,B-,F#+,D#+) S R S(D#,F#-,G#+,D#+) S(A#++,D#+) S(G#-,G#--,A#++,D#+) S(G#+) S(A,A-,F#+) S(D#+) S(A#,A#-,C#+) S(D#+) S(A#,F#-,C#) S(A#+,F#) S(C#,F#-,A#+,F#) S R S(C#-,C#--) S R S(F#-,F#--) S(C#+) S(F#-,C#-,D#+,F#) S(A#+) S(C#-,C#--,C#+) S(D#+,F#) S(G-,G--) S(A#+) S(G#-,G#--,C#+,F) S R S(F-,C#-,D#+,B) S(G#,F) S(C#-,C#--,G#,F) S R S(G-,G--) S R S(G#-,G#--) S B+ S(F-,C#-,D#+,F) S G# S(C#-,C#--,B+) S(D#+,F) S(F-,F--) S(A#+,F#) S(F#-,F#--,A#+,F#) S(C#+) S(F#-,C#-,D#+,F#) S(A#+) S(C#-,C#--,C#+) S(D#+,F#) S(F#-,C#-,A#) S(A#+,F#) S(F#-,F#--,A#+,F#) S(C#+) S(F#-,C#-,D#+,F#) S(A#+) S(G#-,G#--,C#+) S(D#+,F#) S(A#,A#-) S(C#+) S(B,B-,F#+,F#) S R S(B,F#-,D#+,F#) S R S(B,F#-,F#+,F#) S R S(A#,A#-,D#+,F#) S R S(B,B-,F#+,D#+) S R S(B,F#-,G#+,D#+) S(A#++,D#+) S(G#-,G#--,A#++,D#+) S(G#+) S(A,A-,F#+) S(D#+) S(A#,A#-,F#+) S R S(A#,F#-,D#+,C#) S R S(A#,F#-,C#+,C#) S(F#+) S(C#-,C#--) S(A#+,F#) S(F#-,F#--,A#+,F#) S(C#+) S(A#,C#-,D#+,F#) S(A#+) S(C#-,C#--,C#+) S(D#+,F#) S(F#-,C#-,A#) S(F#,D#) S(B-,B--,F#,D#) S G# S(B-,B--,F#,D#) S R S(G#--,G#---,F#,D) S R S(C-,C--,G#,D#) S(F#,C#) S(C#-,C#--,F#,C#) S G# S(F#-,C#-,A#+,C#) S F# S(C#-,C#--,G#) S(A#+,C#) S(D-,D--) S(F#,C) S(D#-,D#--,F#,C) S G# S(D#-,D#--,A#+,C) S F# S(F-,F--) S(G#,B) S(F-,F--) S C# S(F#-,F#--,F#,A#) S R S(C#-,C#--,C#+,F) S R S(F#,F#--,F#+,C#+) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | V=4 #=F C=120 Q. (G,B),C R S (A+,C+) Y C (G--,G--),Q. (B+,D+);S (A#+,C#+) Y C (B-,B-),Q. (B+,D+);S (A#+,C#+) Y C (D-,D-),Q. (B+,D+);S (A#+,C#+) Y C (G-,G-),M (B+,D+);C (G--,G--) Y C R,Q. (C+,E+);S (G#,B+) Y M (A+,C+),C (D-,D-);C (D--,D--) Y C R,Q. (B+,D+);S (F,A+);Y;C (G-,G-,G,B+);Y;C (G--,G--,G--,G--) Y C R,Q. (B,G);S (D,A+);Y;C (G--,G--),Q. (G,B+);S (F,A#+) Y C (B-,B-),Q. (G,B+);S (F,A#+);Y;C (D#-,D#-),Q. (G,B+);S (F,A#+) Y M (G,B+),C (E-,E-);C (F-,F-) Y C (G-,G-),Q (F,A+);Q (E,G);Y;C (A,A),Q (E,G);Q (D,F) Y C R,Q (D,F);Q (F,A+);Y;C (A-,A-),Q (E,G);Q (C#,E);Y;C (D-,D-),C (D,D) Y C (D--,D--,D--,D--) Y;Q. (G,B),C R S (A+,C+) Y C (G--,G--),Q. (B+,D+);S (A#+,C#+) Y C (B-,B-),Q. (B+,D+);S (A#+,C#+) Y C (D-,D-),Q. (B+,D+);S (A#+,C#+) Y C (G-,G-),M (B+,D+);C (G--,G--) Y C R,Q. (C+,E+);S (G#,B+) Y M (A+,C+),C (D-,D-);C (D--,D--) Y C R,Q. (B+,D+);S (F,A+);Y;C (G-,G-,G,B+);Y;C (G--,G--,G--,G--) Y C R,Q. (B,G);S (D,A+);Y;C (G--,G--),Q. (G,B+);S (F,A#+) Y C (B-,B-),Q. (G,B+);S (F,A#+);Y;C (D#-,D#-),Q. (G,B+);S (F,A#+) Y M (G,B+),C (E-,E-);C (F-,F-) Y C (G-,G-),Q (F,A+);Q (E,G);Y;C (A,A),Q (E,G);Q (D,F) Y C R,Q (D,F);Q (F,A+);Y;C (A-,A-),Q (E,G);Q (C#,E);Y;C (D-,D-),C (D,D) Y C (D--,D--,D--,D--) Y C R,Q D+;Q G+;Y;C (B,D,D+,G+);C (A,D,C+,F+);C (G-,D,B+,G+) Y;M (A+,A++),M. D,C F-;C D-;C F-,C R,S G+;S F+;S E+;S D+ Y;M (G-,G-),C (A+,C+);C (G,B+);Y;C (C-,C-),Q. (C+,E+);S (A+,C+) Y;C (D-,D-,G,B+);C R,Q (F,A+);Q R Y;C R,Q. (B,G);S (C,A+) Y;C (G--,G--),Q. (D,B+);S (C#,A#+);Y;C (B--,B-),Q. (D,B+);S (C#,A#+) Y;C (D--,D-),Q. (D,B+);S (C#,A#+);Y;M (D,B+),C (G--,G-);C (F"--,F"-) Y;C (E--,E-),Q. (E,C+);S (B,G#);Y;M (C,A+),C (E--,E-);C (E!--,E!-) Y;C (D--,D-),Q. (D,B+);S (A,F);Y;C (G--,G--),M (B,G);C (G-,G-) Y C R,Q D+;Q G+;Y;C (B,D,D+,G+);C (A,D,C+,F+);C (G-,D,B+,G+) Y;M (A+,A++),M. D,C F-;C D-;C F-,C R,S G+;S F+;S E+;S D+ Y;M (G-,G-),C (A+,C+);C (G,B+);Y;C (C-,C-),Q. (C+,E+);S (A+,C+) Y;C (D-,D-,G,B+);C R,Q (F,A+);Q R Y;C R,Q. (B,G);S (C,A+) Y;C (G--,G--),Q. (D,B+);S (C#,A#+);Y;C (B--,B-),Q. (D,B+);S (C#,A#+) Y;C (D--,D-),Q. (D,B+);S (C#,A#+);Y;M (D,B+),C (G--,G-);C (F"--,F"-) Y;C (E--,E-),Q. (E,C+);S (B,G#);Y;M (C,A+),C (E--,E-);C (E!--,E!-) Y;C (D--,D-),Q. (D,B+);S (A,F);Y;C (G--,G--,B,G);Q (G-,G-) Y;Q D+;C R,Q C#+;Q D+;Y;M. R,C (G--,G--),Q B+;Q D+ C (D-,D-),Q G;Q B+;C (G-,G-),Q D;Q B+ Y;M. R,C (C-,C-),Q A+;Q C+;C (D-,D-),Q F;Q A+;C (F-,F-),Q D;Q F Y;M. R,C (B-,B-),Q G;Q F;C (D-,D-),Q G;Q A+;C (G-,G-),Q B+;Q C+ Y;M. R,C (F-,F-),Q D+;Q C#+;C (A,A),Q D+;Q E+;C (D,D),Q D+;Q C+ Y;M. R,C (G-,G-),Q B+;Q A#+;C (B,B),Q B+;Q C+;C (D#-,D#-),Q B+;Q A+ Y;M. R,C (E-,E-),Q G;Q B+;C (C#-,C#-),Q A+;Q G;C (D-,D-),Q F;Q A+ Y;M. R,C (G--,G--),Q E;Q F;C R,Q G;Q E;C (A-,G-),Q C#;Q A;Y;C (D-,F-,D,D) Y;Q D+;C R,Q C#+;Q D+;Y;M. R,C (G--,G--),Q B+;Q D+ C (D-,D-),Q G;Q B+;C (G-,G-),Q D;Q B+ Y;M. R,C (C-,C-),Q A+;Q C+;C (D-,D-),Q F;Q A+;C (F-,F-),Q D;Q F Y;M. R,C (B-,B-),Q G;Q F;C (D-,D-),Q G;Q A+;C (G-,G-),Q B+;Q C+ Y;M. R,C (F-,F-),Q D+;Q C#+;C (A,A),Q D+;Q E+;C (D,D),Q D+;Q C+ Y;M. R,C (G-,G-),Q B+;Q A#+;C (B,B),Q B+;Q C+;C (D#-,D#-),Q B+;Q A+ Y;M. R,C (E-,E-),Q G;Q B+;C (C#-,C#-),Q A+;Q G;C (D-,D-),Q F;Q A+ Y;M. R,C (G--,G--),Q E;Q F;C R,Q G;Q E;C (A-,G-),Q C#;Q A;Y;C (D-,F-,D,D) Q R;Q D+;Q C#+;Q D+ Y;M. R,C (D-,D-),Q E+;Q C+;M R,Q R,Q A+;Q (D,B+);Q (C#,A+);Q (D,B+) Y;M. R,Q (E,C+);Q (C,A+);Q (A,F);Q (B,D+);Q (A#,C#+);Q (B,D+) Y;M. R,Q (C,E+);Q (A,C+);Q (F-,A+);Q (G-,B+);Q (F-,A+);Q (G-,B+) Y;M. R,Q (A,C+);Q (F-,A+);Q (D-,F);Q (D-,D+);Q (E-,C#+);Q (F-,D+) Y;M. R,C (G-,G-),Q B+;Q D+;C (B,B),Q G;Q B+;C (B-,B-),Q D;Q G+ Y;M. C-,C C-,Q E+;Q G+;C E-,Q C+;Q E+;C A,Q A+;Q C+ Y;M. D-,C F-,Q F;Q A+;C A,Q D;Q E;C C,Q F";Q F Y;C. (G-,G-),C (C,A+);Q (B,G);Q R Y;Q D+;C R,Q C#+;Q D+;Y;M. R,C (G--,G--),Q B+;Q D+ C (D-,D-),Q G;Q B+;C (G-,G-),Q D;Q B+ Y;M. R,C (C-,C-),Q A+;Q C+;C (D-,D-),Q F;Q A+;C (F-,F-),Q D;Q F Y;M. R,C (B-,B-),Q G;Q F;C (D-,D-),Q G;Q A+;C (G-,G-),Q B+;Q C+ Y;M. R,C (F-,F-),Q D+;Q C#+;C (A,A),Q D+;Q E+;C (D,D),Q D+;Q C+ Y;M. R,C (G-,G-),Q B+;Q A#+;C (B,B),Q B+;Q C+;C (D#-,D#-),Q B+;Q A+ Y;M. R,C (E-,E-),Q G;Q B+;C (C#-,C#-),Q A+;Q G;C (D-,D-),Q F;Q A+ Y;M. R,C (G--,G--),Q E;Q F;C R,Q G;Q E;C (A-,G-),Q C#;Q A;Y;C (D-,F-,D,D) Q R;Q D+;Q C#+;Q D+ Y;M. R,C (D-,D-),Q E+;Q C+;M R,Q R,Q A+;Q (D,B+);Q (C#,A+);Q (D,B+) Y;M. R,Q (E,C+);Q (C,A+);Q (A,F);Q (B,D+);Q (A#,C#+);Q (B,D+) Y;M. R,Q (C,E+);Q (A,C+);Q (F-,A+);Q (G-,B+);Q (F-,A+);Q (G-,B+) Y;M. R,Q (A,C+);Q (F-,A+);Q (D-,F);Q (D-,D+);Q (E-,C#+);Q (F-,D+) Y;M. R,C (G-,G-),Q B+;Q D+;C (B,B),Q G;Q B+;C (B-,B-),Q D;Q G+ Y;M. C-,C C-,Q E+;Q G+;C E-,Q C+;Q E+;C A,Q A+;Q C+ Y;M. D-,C F-,Q F;Q A+;C A,Q D;Q E;C C,Q F";Q F Y;C. (G-,G-),C (C,A+);Q (B,G);Q R Q. (G,B),C R S (A+,C+) Y C (G--,G--),Q. (B+,D+);S (A#+,C#+) Y C (B-,B-),Q. (B+,D+);S (A#+,C#+) Y C (D-,D-),Q. (B+,D+);S (A#+,C#+) Y C (G-,G-),M (B+,D+);C (G--,G--) Y C R,Q. (C+,E+);S (G#,B+) Y M (A+,C+),C (D-,D-);C (D--,D--) Y C R,Q. (B+,D+);S (F,A+);Y;C (G-,G-,G,B+);Y;C (G--,G--,G--,G--) Y C R,Q. (B,G);S (D,A+);Y;C (G--,G--),Q. (G,B+);S (F,A#+) Y C (B-,B-),Q. (G,B+);S (F,A#+);Y;C (D#-,D#-),Q. (G,B+);S (F,A#+) Y M (G,B+),C (E-,E-);C (F-,F-) Y C (G-,G-),Q (F,A+);Q (E,G);Y;C (A,A),Q (E,G);Q (D,F) Y C R,Q (D,F);Q (F,A+);Y;C (A-,A-),Q (E,G);Q (C#,E);Y;C (D-,D-),C (D,D) Y C (D--,D--,D--,D--) Y C R,Q D+;Q G+;Y;C (B,D,D+,G+);C (A,D,C+,F+);C (G-,D,B+,G+) Y;M (A+,A++),M. D,C F-;C D-;C F-,C R,S G+;S F+;S E+;S D+ Y;M (G-,G-),C (A+,C+);C (G,B+);Y;C (C-,C-),Q. (C+,E+);S (A+,C+) Y;C (D-,D-,G,B+);C R,Q (F,A+);Q R Y;C R,Q. (B,G);S (C,A+) Y;C (G--,G--),Q. (D,B+);S (C#,A#+);Y;C (B--,B-),Q. (D,B+);S (C#,A#+) Y;C (D--,D-),Q. (D,B+);S (C#,A#+);Y;M (D,B+),C (G--,G-);C (F"--,F"-) Y;C (E--,E-),Q. (E,C+);S (B,G#);Y;M (C,A+),C (E--,E-);C (E!--,E!-) Y;C (D--,D-),Q. (D,B+);S (A,F);Y;C (G--,G--,B,G);Q G- B R $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 | C=220 V=4 !=A,B,D,E,G Y M. R,C A+ Q G" Q A+ Q C+ Q B+ Y M. R,Q G" Q A+ Q B+ Q A+ Q C+ Q B+ Y M. R,Q G" Q A+ Q C+ Q B+ Q G" Q A+ Y M. R,Q C+ Q B+ Q G" Q A+ Q C+ Q B+ Y C D-,Q G" Q A+ C-G (A,D,F),Q C+ Q B+ G R C (A,D,F),Q G" Q A+ Y C F-,Q C+ Q B+ C-G (A,D,F),Q G" Q A+ G R C (A,D,F),Q C+ Q B+ Y C D-,Q G" Q A+ C-G (A,D,F),Q C+ Q B+ G R C (A,D,F),Q G" Q A+ Y C F-,Q B+ Q C+ C-G (A,D,F),Q D+ Q E+ G R C (A,D,F),Q F+ Q G+ C A-,C. B++ C-G (A,C,G) Q A++ G R C (A,C,G),Q G+ Q-G F+ G R Y C E-,Q F+ Q-G E+ G R C-G (A,C,G),D-G E+ D-G F+ STGTG E+ Q D"+ G R C (A,C,G,E+) C A-,C. B++ M R,C-G (C,G) Q A+ G R C (C,G),Q G+ Q-G F+ G R Y M. R,C A,Q F+ D-G E+ D-G F+ STGTG E+ C-G (C,G),Q D"+ Q E+ G R C (C,G),Q F+ Q B+ Y C D-,Q G" Q A+ C-G (A,D,F),Q C+ Q B+ G R C (A,D,F),Q G" Q A+ Y C F-,Q C+ Q B+ C-G (A,D,F),Q G" Q A+ G R C (A,D,F),Q C+ Q B+ Y C D-,Q G" Q A+ C-G (A,D,F),Q C+ Q B+ G R C (A,D,F),Q G" Q A+ Y C F-,Q B+ Q C+ C-G (A,D,F),Q D+ Q E+ G R C (A,D,F),Q F+ Q G+ Y C A-,C. B++ C-G (A,C,G) Q A++ G R C (A,C,G),Q G+ Q-G F+ G R Y C E-,Q F+ Q-G E+ G R C-G (A,C,G),D-G E+ D-G F+ STGTG E+ Q D"+ G R C (A,C,G,E+) Y C A-,C. B++ C-G (A,C,G) Q A++ G R C (A,C,G),Q G+ Q F+ Y M. R,C A,Q E+ Q F+ C (C,G),D-G E+ D-G F+ STGTG E+ Q D"+ C A-,Q E+ Q E"+ C (A"-),3Q F+ 3Q G+ 3Q F+ C-G (F-,C,E),Q E"+ Q F+ G R C (F-,C,E),Q A++ Q G+ Y M. R,C B-,Q F+ Q G+ C-G (F-,D),Q F+ Q E"+ G R C (F-,D),Q F+ Q B++ Y C C-,3Q A++ 3Q B++ 3Q A++ C-G (A,E,G),Q G"+ Q A++ G R C (A,E,G),Q C++ Q B++ Y M. R,C D-,Q A++ Q B++ C (A,F),Q A++ Q G"+ C R,Q A++ Q D++ Y M. R,C G-,Q C++ Q B++ C (B,E),Q A++ Q G+ C R,Q F+ Q E+ Y C A-,Q D+ Q C+ C (F-,A,D),Q B+ Q A+ C R,Q G Q F Y M R,C A-,Q E Q D C-G (G-,A),Q C Q E G R C (G-,A,C),Q B+ Q A+ Y C D-,Q G" Q A+ C (A,D,F),Q B+ Q C+ C R,Q D+ Q E+ Y M. A",C R,3Q F+ 3Q G+ 3Q F+ C-G (E,F),Q E"+ Q F+ G R C (E,F),Q A++ Q G+ Y M. B,C R,Q F+ Q G+ C-G (D,F),Q F+ Q E"+ G R C (D,F),Q F+ Q B++ Y M. C,C R,3Q A++ 3Q B++ 3Q A++ C-G (G,A+),Q G"+ Q A++ G R C (G,A+),Q C++ Q B++ Y M. R,C D,Q A++ Q B++ C (F,A+),Q A++ Q G"+ C R,Q A++ Q F++ Y C G-,Q E++ Q D++ C (D,E,B+),Q C++ Q B++ C R,Q A++ Q G+ Y C A-,Q F+ Q E+ C (F-,A,D),Q D+ Q C+ C R,Q B+ Q A+ Y M. R,C A-,Q A"+ Q C+ C-G (G-,A),Q B+ Q F G R C (G-,A),Q G Q C Y M. R,C (D-,D) C (A,F) C F+ C (A"-),3Q F+ 3Q G+ 3Q F+ C-G (F-,C,E),Q E"+ Q F+ G R C (F-,C,E),Q A++ Q G+ Y M. R,C B-,Q F+ Q G+ C-G (F-,D),Q F+ Q E"+ G R C (F-,D),Q F+ Q B++ Y C C-,3Q A++ 3Q B++ 3Q A++ C-G (A,E,G),Q G"+ Q A++ G R C (A,E,G),Q C++ Q B++ Y M. R,C D-,Q A++ Q B++ C (A,F),Q A++ Q G"+ C R,Q A++ Q D++ Y M. R,C G-,Q C++ Q B++ C (B,E),Q A++ Q G+ C R,Q F+ Q E+ Y C A-,Q D+ Q C+ C (F-,A,D),Q B+ Q A+ C R,Q G Q F Y M R,C A-,Q E Q D C-G (G-,A),Q C Q E G R C (G-,A,C),Q B+ Q A+ Y C D-,Q G" Q A+ C (A,D,F),Q B+ Q C+ C R,Q D+ Q E+ Y M. A",C R,3Q F+ 3Q G+ 3Q F+ C-G (E,F),Q E"+ Q F+ G R C (E,F),Q A++ Q G+ Y M. B,C R,Q F+ Q G+ C-G (D,F),Q F+ Q E"+ G R C (D,F),Q F+ Q B++ Y M. C,C R,3Q A++ 3Q B++ 3Q A++ C-G (G,A+),Q G"+ Q A++ G R C (G,A+),Q C++ Q B++ Y M. R,C D,Q A++ Q B++ C (F,A+),Q A++ Q G"+ C R,Q A++ Q F++ Y C G-,Q E++ Q D++ C (D,E,B+),Q C++ Q B++ C R,Q A++ Q G+ Y C A-,Q F+ Q E+ C (F-,A,D),Q D+ Q C+ C R,Q B+ Q A+ Y M. R,C A-,Q A"+ Q C+ C-G (G-,A),Q B+ Q F G R C (G-,A),Q G Q C Y M. R,C (D-,D) C (A,F) C R,M. A+ C A- C-G (G-,A,C) G R C-G (G-,A,C),C E G R Y M A+,C-G (G-,A,C) G R C-G (G-,A,C) G R C (G-,A,C,E") Y M. R,M A+,C D- C-G (A,D) G R C (A,D,F) Y M-G F+,C A- C-G (A,D,F) G R C (A,D,F),M. F+ C E- C-G (A,C,G) G R C (A,C,G,B+) Y M F+,C A- C-G (A,E,G) G R C (A,E,G,C+) Y M E+,C D- C-G (A,D,F) G R C (A,D,F,D+) Y C F-,Q. C+ Q. E+ C-G (A,D,F) Q. D+ G R C (A,D,E) Q. B+ Y M. R,M A+,C C- C-G (G-,A) G R C (G-,A,E) Y M A+,C A- C-G (G-,A,C) G R C (G-,A,C,E") Y M. R,M A+,C D- C-G (A,D) G R C (A,D,F) Y M. F+,C (B"-) C-G (A,D,F) G R C (A,D,F) Y C C-,S C+ S D+ S C+ S D+ C-G (A,C,F),C B"+ G R C (A,C,F,C+) Y C (C--,A++) C (G"-,C,E",B+) C (G"+) M. R,M R,C (F--,A"+) C G+ C (F-,C,A+) Y M. R,C F+ C F C B+ Y M. R,M A+,C C- C-G (G-,A) G R C (G-,A,E) Y C A-,G A++ M-G A+ C-G (G-,A,C) G R C (G-,A,C,E") Y M. R,C D-,G A++ M-G A+ C-G (A,D) G R C (A,D,F) Y C A-,G A++ M-G F+ C-G (A,D,F) G R C (A,D,F,F+) Y C E-,G A++ M-G F+ C-G (A,D,G) G R C (A,D,G,B+) Y C A-,G A++ M-G F+ C-G (A,E,G) G R C (A,E,G,C+) Y C D-,G A++ C-G E+ C-G (A,D,F),C D+ G R C (A,D,F,C+) Y C F-,G A++ C-G E+ C-G (A,D,F),C. D+ G R C (A,D,F) Q B+ Y M. C-,C R,G A++ M-G A+ C-G (G-,A) G R C (G-,A,E) Y C A-,G A++ M-G A+ C-G (G-,A,C) G R C (G-,A,C,E") Y C C!,G A++ M-G A+ C-G (F-,A,E) G R C (F-,A,E,F) Y M. F+,C B- C-G (F-,A,D") G R C (F-,A,D") Y M. R,M F+,C E- C-G (D,G") G R C (D,G",B+) Y M. R,M E+,C R C-G (D,G) G R C (D,G,A") Y M A,C E+ C (C,G,A+) C (D"+) Y M. R,C F+ C E+ C A++ Y M. R,S A+;S B+;S A+;S B+ S A+;S B+;S A+;S B+ S A+;S B+;S A+;S B+ Y M. R,S A+;S B+;S A+;S B+ S A+;S B+;S A+;S B+ S A+;S B+;S A+;S B+ Y M. R,S A+;S B+;S A+;S B+ S A+;S B+;S A+;S B+ S A+;S B+;S A+;S B+ Y M. R,S A+;S B+;S A+;S B+ S A+;S B+;S A+;S B+ S A+;S B+;S A+;S B+ Y M. R,C A+ Q G" Q A+ Q C+ Q B+ Y M. R,Q G" Q A+ Q B+ Q A+ Q C+ Q B+ Y M. R,Q G" Q A+ Q C+ Q B+ Q G" Q A+ Y M. R,Q C+ Q B+ Q G" Q A+ Q C+ Q B+ Y C D-,Q G" Q A+ C-G (A,D,F),Q C+ Q B+ G R C (A,D,F),Q G" Q A+ Y C F-,Q C+ Q B+ C-G (A,D,F),Q G" Q A+ G R C (A,D,F),Q C+ Q B+ Y C D-,Q G" Q A+ C-G (A,D,F),Q C+ Q B+ G R C (A,D,F),Q G" Q A+ Y C F-,Q B+ Q C+ C-G (A,D,F),Q D+ Q E+ G R C (A,D,F),Q F+ Q G+ C A-,C. B++ C-G (A,C,G) Q A++ G R C (A,C,G),Q G+ Q-G F+ G R Y C E-,Q F+ Q-G E+ G R C-G (A,C,G),D-G E+ D-G F+ STGTG E+ Q D"+ G R C (A,C,G,E+) C A-,C. B++ M R,C-G (C,G) Q A+ G R C (C,G),Q G+ Q-G F+ G R Y M. R,C A,Q F+ D-G E+ D-G F+ STGTG E+ C-G (C,G),Q D"+ Q E+ G R C (C,G),Q F+ Q B+ Y C D-,Q G" Q A+ C-G (A,D,F),Q C+ Q B+ G R C (A,D,F),Q G" Q A+ Y C F-,Q C+ Q B+ C-G (A,D,F),Q G" Q A+ G R C (A,D,F),Q C+ Q B+ Y C D-,Q G" Q A+ C-G (A,D,F),Q C+ Q B+ G R C (A,D,F),Q G" Q A+ Y C F-,Q B+ Q C+ C-G (A,D,F),Q D+ Q E+ G R C (A,D,F),Q F+ Q G+ Y C A-,C. B++ C-G (A,C,G) Q A++ G R C (A,C,G),Q G+ Q-G F+ G R Y C E-,Q F+ Q-G E+ G R C-G (A,C,G),D-G E+ D-G F+ STGTG E+ Q D"+ G R C (A,C,G,E+) Y C A-,C. B++ C-G (A,C,G) Q A++ G R C (A,C,G),Q G+ Q F+ Y M. R,C A,Q E+ Q F+ C (C,G),D-G E+ D-G F+ STGTG E+ Q D"+ C A-,Q E+ Q E"+ C (A"-),3Q F+ 3Q G+ 3Q F+ C-G (F-,C,E),Q E"+ Q F+ G R C (F-,C,E),Q A++ Q G+ Y M. R,C B-,Q F+ Q G+ C-G (F-,D),Q F+ Q E"+ G R C (F-,D),Q F+ Q B++ Y C C-,3Q A++ 3Q B++ 3Q A++ C-G (A,E,G),Q G"+ Q A++ G R C (A,E,G),Q C++ Q B++ Y M. R,C D-,Q A++ Q B++ C (A,F),Q A++ Q G"+ C R,Q A++ Q D++ Y M. R,C G-,Q C++ Q B++ C (B,E),Q A++ Q G+ C R,Q F+ Q E+ Y C A-,Q D+ Q C+ C (F-,A,D),Q B+ Q A+ C R,Q G Q F Y M R,C A-,Q E Q D C-G (G-,A),Q C Q E G R C (G-,A,C),Q B+ Q A+ Y C D-,Q G" Q A+ C (A,D,F),Q B+ Q C+ C R,Q D+ Q E+ Y M. A",C R,3Q F+ 3Q G+ 3Q F+ C-G (E,F),Q E"+ Q F+ G R C (E,F),Q A++ Q G+ Y M. B,C R,Q F+ Q G+ C-G (D,F),Q F+ Q E"+ G R C (D,F),Q F+ Q B++ Y M. C,C R,3Q A++ 3Q B++ 3Q A++ C-G (G,A+),Q G"+ Q A++ G R C (G,A+),Q C++ Q B++ Y M. R,C D,Q A++ Q B++ C (F,A+),Q A++ Q G"+ C R,Q A++ Q F++ Y C G-,Q E++ Q D++ C (D,E,B+),Q C++ Q B++ C R,Q A++ Q G+ Y C A-,Q F+ Q E+ C (F-,A,D),Q D+ Q C+ C R,Q B+ Q A+ Y M. R,C A-,Q A"+ Q C+ C-G (G-,A),Q B+ Q F G R C (G-,A),Q G Q C Y M. R,C (D-,D) C (A,F) C F+ Y C (A"-),3Q F+ 3Q G+ 3Q F+ C-G (F-,C,E),Q E"+ Q F+ G R C (F-,C,E),Q A++ Q G+ Y M. R,C B-,Q F+ Q G+ C-G (F-,D),Q F+ Q E"+ G R C (F-,D),Q F+ Q B++ Y C C-,3Q A++ 3Q B++ 3Q A++ C-G (A,E,G),Q G"+ Q A++ G R C (A,E,G),Q C++ Q B++ Y M. R,C D-,Q A++ Q B++ C (A,F),Q A++ Q G"+ C R,Q A++ Q D++ Y M. R,C G-,Q C++ Q B++ C (B,E),Q A++ Q G+ C R,Q F+ Q E+ Y C A-,Q D+ Q C+ C (F-,A,D),Q B+ Q A+ C R,Q G Q F Y M R,C A-,Q E Q D C-G (G-,A),Q C Q E G R C (G-,A,C),Q B+ Q A+ Y C D-,Q G" Q A+ C (A,D,F),Q B+ Q C+ C R,Q D+ Q E+ Y M. A",C R,3Q F+ 3Q G+ 3Q F+ C-G (E,F),Q E"+ Q F+ G R C-G (E,F),Q A++ Q G+ G R Y M. B,C R,Q F+ Q G+ C-G (D,F),Q F+ Q E"+ G R C (D,F),Q F+ Q B++ Y M. C,C R,3Q A++ 3Q B++ 3Q A++ C-G (G,A+),Q G"+ Q A++ G R C (G,A+),Q C++ Q B++ Y M. R,C D,Q A++ Q B++ C (F,A+),Q A++ Q G"+ C R,Q A++ Q F+++ Y C (G--),3Q E+++ 3Q D+++ 3Q C+++ C (D,E,B+),3Q B+++ 3Q A+++ 3Q G++ B R,3Q F++ 3Q E++ 3Q D++ 3Q C++ 3Q B++ 3Q A++ 3Q G+ 3Q F+ 3Q E+ 3Q D+ 3Q C+ 3Q B+ Y M. R,C A-,Q A"+ Q C+ C-G (G-,A),Q B+ Q F G R C (G-,A),Q G Q C Y B D,M (D--) M (F-,A,F) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 | /MUSIC COMPILER /RICH WILSON, 1975 /FOR CCL USE: SAVE SYS MUSIC;201=400 VERSION=3 /CONFIGURATION SECTION: / THE FOLLOWING MUST BE FILLED IN TO CUSTOMIZE THE / MUSIC COMPILER/PLAYER AS DESIRED. / OF THE MANY POSSIBLE CONFIGURATIONS, ONLY SOME / HAVE BEEN TRIED, AND OTHERS ARE NOT GUARANTEED / TO ASSEMBLE OR FUNCTION PROPERLY. IFNDEF CPU <CPU=1> /FILL IN 1 FOR PDP-8/E (ALSO 8/F, 8/M) /FILL IN 2 FOR PDP-8/A (WITH CORE MEMORY) /FILL IN 4 FOR PDP-8/I OR OLD PDP-8 IFNDEF OS8 <OS8=10> /FILL IN 10 TO RUN UNDER OS/8 /FILL IN 20 FOR PAPER TAPE INPUT ONLY IFNDEF CORE <CORE=400> /FILL IN 100 FOR 4K SYSTEM (PAPER TAPE ONLY) /FILL IN 200 FOR 8K OR LARGER SYSTEM /FILL IN 400 FOR 12K OR LARGER SYSTEM /(ENABLES SPECIAL PLAYER) IFNDEF NOISE <NOISE=CAF> /FILL IN THE SINGLE CYCLE INSTRUCTION WHICH IS /TO BE USED TO CREATE NOISE. FOR 8/E OR 8/A WITHOUT /AN RX01, TRY CAF. FOR OTHER SYSTEMS, TRY IOF. /DO NOT USE AN INSTRUCTION WHICH TAKES LONGER /THAN 1.5 MICROSECONDS. IFZERO OS8+CORE-110 <ILLEGAL CONFIGURATION> IFNZRO CPU-1<IFNZRO CPU-2<IFNZRO CPU-4< ILLEGAL CONFIGURATION>>> IFNZRO OS8-10<IFNZRO OS8-20<ILLEGAL CONFIGURATION>> IFNZRO CORE-100<IFNZRO CORE-200<IFNZRO CORE-400< ILLEGAL CONFIGURATION>>> IFZERO CORE-400 < IFNZRO CPU-4 <WOW=10>> MARGIN=4 /DO WE CATCH FIELD CHANGES IN TIME? AC7776=CLL STA RAL AC4000=CLA STL RAR AC0002=STL CLA RTL BRANCH=JMS I [BRAN0 IFZERO OS8-10 < DECODE=5 FETCH=1 > *20 WSA, 0 WSB, 0 WSC, 0 CHAR, 0 NOTE, 0 /-1 FOR REST THROUGH 6 FOR G NOTEV, 0 /POINTER TO #! TABLE:KEYTAB THIRD, 0 /-1 FOR 1/THIRD TIME PAREN, 0 /-1 WHEN ( FOUND OCTAVE, 0 /REMEMBER + AND - THISLE, 0 /LENGTH THIS TIME TOTLEN, 0 /LENGTH OF NOTE ACC, 0 /REMEMBER ACCIDENTALS NOTCNT, 0 /COUNT OF NOTES TO PRODUCE OUTBUF, -1 PROTAB, TIMA, ZBLOCK 3 TIMB, ZBLOCK 3 TIMC, ZBLOCK 3 TIMD, ZBLOCK 3 Y, 0 /# OF Y'S SO FAR L, 0 /# OF LINE FEEDS SINCE Y TFLAG, 0 /-1 TO PRINT LINE MINFLG, 0 /-1 TO SUBTRACT NOTES TRANSP, 0 RTRAN, 0 OUTFLG, 0 PROTND, /THE END OF WORKING LOCATIONS TO BE ZEROED IFZERO OS8-10 < INCHCT, -1 /-# CHARACTERS IN BLOCK INEOF, 1 /NON-ZEOR FOR EOF INFPTR, 7617 /PNTR TO INPUT INFO INCTR, 0 /-LENGTH IN BLOCKS INPTR, 0 /BUFFER POINTER INSAVE, 0 /HALF OF CHAR 3 > /WORKING STORAGE FOR MUSIC MAKER DECIMAL /THE FOLLOWING NUMBERS ALL REPRESENT TENTHS OF A MICROSECOND IFDEF WOW < IFZERO CPU-1 < JIFFY=50 T1=316 T2=290 T3=3044 /DIVIDE TIME TIM6=7 T6A=4 > IFZERO CPU-2 < JIFFY=60 T1=375 T2=330 T3=3600 TIM6=10 T6A=55 /TIM6*64-(DOIT TIME) >> OCTAL IFNDEF WOW < IFZERO CPU-1 <TIM6=26> IFZERO CPU-2 <TIM6=26> IFZERO CPU-4 <TIM6=36>> MDEFAULT=30^74%2 /C=60 T64=0 IFDEF WOW <T64=1> IFZERO CPU-1 <T64=1> /WORKING LOCATIONS *10 AXA, VERSION LINE=AXB AXB, 0 AXC, 0 LOWAIT, 0 OOPS, 0 LIMIT, 0 BUFTAB, 0 *20 WSA, 0 WSB, 0 SAVE, 0 CHAR, 0 FLG, 0 GETPTR, 0 LOSAVE, 0 HOSAVE, 7777 LOLONG, 0 HOLONG, 7700 LOTIM, 0 HOTIM, 0 BUFGET, 0 TRAN, 0 NOTTAB, AC, 0 AR, 0 AT, 0 RTOT, 0 BC, 0 BR, 0 BT, 0 OLDS, 0 CC, 0 CR, 0 CT, 0 SAVS, 0 DC, 0 DR, 0 DT, 0 OLDE, 0 *77 /SOME MAGIC NUMBERS /USED TO FIGURE METER: HOW MANY 6.4US UNITS /ARE THERE IN ONE MINUTE DIVIDED BY TWO? IFNZRO T64 < LOFUDG, 3214 HOFUDG, 2170 > /AND IN 6.0US UNITS? IFZERO T64 < LOFUDG, 5500 HOFUDG, 2304 > IFDEF WOW < /AND THE MAGIC SUBROUTINE DOIT, 0 TAD I DOIT /HOW LONG 'TILL NEXT CALL? DCA LIMIT /REMEMBER CDF 10 DOIT1, TAD LIMIT CLL TAD LOWAIT /IS THERE ENOUGH TIME TO RETURN SNL /AND GET BACK IN TIME? JMP DOIT5 /YES ISZ I BUFGET /HOW ABOUT HIGH ORDER TIME? JMP DOIT6 /YES, TIME CLA CLL /NOT ENOUGH TIME TAD LOWAIT /HOW LONG WE HAVE TO WAIT TAD OOPS /ERROR LAST TIME SZL /HAVE WE WAITED OUR TIME? JMP .+3 /YES TAD (JIFFY /NO, UPDATE AC JMP .-3 /AND TRY AGAIN DCA OOPS /SAVE ERROR IFZERO CPU-1 < ISZ BUFGET /NOW HOW MANY SPIKES? JMP .+3 JMP .+2 /COVER SKIP NOISA, NOISE /MAKE A SPIKE ISZ I BUFGET JMP .-2 /ANOTHER SPIKE ISZ BUFGET SKP /COVER ISZ SKIP NOP /MAKING UP FOR TIMING ERROR > IFZERO CPU-2 < ISZ BUFGET SKP NOP TAD I BUFGET DCA LOWAIT ISZ BUFGET JMP .+3 JMP .+2 NOISA, NOISE ISZ LOWAIT JMP .-2 > TAD I BUFGET /LOW ORDER TIME DCA LOWAIT /SAVE IT ISZ BUFGET /POINT TO HO TIME JMP DOIT1 JMP DOIT1 /COVER ISZ SKIP DOIT5, TAD [0 /TIMING CORRECTOR NOP DOIT6, DCA LOWAIT CDF ISZ DOIT JMP I DOIT > /ALTERNATE RESTART ADDRESS TO BEGIN PLAYING *0 NOP JMP PLAY /GO PLAY NOISA /ADDRESS OF NOISE, FOR CONVENIENCE FIX, -TIM6 CPU+OS8+CORE /FOR CONVENIENCE *200 /BEGINNING OF EVERYTHING START, IFZERO OS8-10 < IFDEF WOW <SKP;SKP> /LEAVE ROOM FOR RESTORE TRAP JMS OSDEC /CALL COMMAND DECODER > START1, TLS /BRING UP PRINTER FLAG JMS KEYC /DEFAULT TO KEY OF C TAD (BUFTBL-1 DCA BUFTAB TAD I BUFTAB /AUTO-INDEX DCA OUTBUF /BEGINNING OF BUFFER TAD I BUFTAB DCA LIMIT /END OF BUFFER IFNZRO CORE-100 < TAD I BUFTAB DCA OUTCDF /FIELD OF BUFFER CORINI, JMS INIT /INITIALIZE CORE SIZE, ETC. > TAD [LINBUF-1 DCA LINE TAD (PROTAB-PROTND /CLEAR OUT ALL THE NOTES DCA WSA /AND OTHER THINGS TAD (PROTAB-1 DCA AXA DCA I AXA ISZ WSA JMP .-2 /INITIALIZE AFTER ; OR CR START2, DCA NOTCNT /INITIALIZE FOR NEXT NOTE DCA THIRD DCA PAREN DCA TOTLEN DCA MINFLG /INITIALIZE FOR NEXT NOTE IN CHORD START5, BRANCH /JMP BASED ON NEXT INPUT CHAR BRANA NEXNOT, ISZ PAREN /ARE WE IN A CHORD? SKP JMP DEFCH2 /YES DCA TOTLEN /NO-ANOTHER LENGTH TIE, BRANCH BRANB TRIPLE, STA DCA THIRD /REMEMBER IT'S A TRIPLET JMP TIE MINUS, STA /SUBTRACT NOTE DURATIONS DCA MINFLG JMP TIE KEYF, AC7776 /DEFINE FLATS KEYS, IAC /DEFINE SHARPS DCA WSC JMS GETEQ /BUMP PAST = JMP BADLINE JMS KEYC /RESET TO KEY OF C KEYL, JMS GETNOTE /IS THERE A NOTE? JMP BADLINE /NO TAD WSC DCA I NOTEV /REMEMBER SHARP/FLAT JMS IN TAD (-", SNA CLA /IS THERE ANOTHER? JMP KEYL /YES TAD CHAR /NO JMP START5 /DO SOMETHING ELSE LENG, IAC /GRACE NOTE! ISZ THIRD /DID HE SAY TRIPLET? JMP ADDLEN /NO JMS BADSTAR /YES-THAT'S NO GOOD JMP LENG LENB, IAC /SEMI-BREVE LENM, IAC /MINIM LENC, IAC /CROTCHET LENQ, IAC /QUAVER LENS, IAC /SEMI-QUAVER LEND, CMA DCA WSA STL RAL ISZ THIRD /THIRD TIME? STL RAL ISZ WSA JMP .-2 ADDLEN, ISZ MINFLG /DO WE SUBTRACT? SKP /NO CIA /YES DCA THISLEN /LENGTH THIS NOTE TAD THISLEN TAD TOTLEN SPA SNA /DID HE SUBTRACT TOO MUCH? JMP ADDNEG /YES DCA TOTLEN /TOTAL LENGTH JMS GETNOTE /IS THERE A NOTE YET? JMP .+3 /NO, SOMETHING ELSE I GUESS NMODS, BRANCH /YES, NOW WHAT? BRANE TAD CHAR BRANCH BRAND PUTNO, JMS BADSTA /OUT OF CORE! JMS MSG /PRINT LAST LINE JMS CRLF TAD ("$ JMS TYPE JMS CRLF JMP ENDM /NOW PLAY IT /DOTTED NOTES: DOT, TAD THISLEN STL SMA /FIX LINK TO SIGN OF NUMBER CLL RAR /DIVIDE BY TWO SZL /VALID? ADDNEG, JMS BADSTA /NO JMP ADDLEN PAGE /DEFINE METER: /METER IS SAVED AS 12 BIT LENGTH*METER/2 DEFM, ISZ PAREN /DEFINE METER SKP JMP BADLINE /OOPS--INSIDE A (? JMS DECIN /GET METER SNA JMP BADLINE /MUST BE VALID DCA DEFM2 TAD TOTLEN /LENGTH OF NOTE CLL RAR DCA WSB JMS MUL /MULTIPLY DEFM2, .-. DCA WSB TAD (4 /DEFINE METER CODE JMS OUT TAD WSB RTR RTR RTR JMS OUT /HIGH ORDER TAD WSB JMS OUT /LOW ORDER JMS LIMTST /TEST FOR END OF BUFFER AREA JMP DEFV /LEFT PAREN FOUND ( DEFCHO, ISZ PAREN SKP JMS BADSTA /NESTED (( DEFCH2, STA DCA PAREN JMS GETNOTE /WE SHOULD HAVE A NOTE JMP BADLINE /OOPS JMP NMODS /NOW TRY FOR "!+= /ACCIDENTALS ACCF, CLL STA RTL /FLAT ACCS, TAD (2 /SHARP TAD ACC DCA ACC JMP NMODS ACCN, IAC /NATURAL DCA ACC OCTMOR, BRANCH /LOOK FOR +- BRANF OCTUP, TAD (30 /FOUND + OCTDN, TAD (-14 /FOUND - TAD OCTAVE DCA OCTAVE JMP OCTMOR /ARE THERE MORE? PPRODU, ISZ PAREN /WE SHOULD BE INSIDE ) HERE JMS BADSTA BRANCH BRANG SPRODU, ISZ PAREN /WAS THERE A PAREN? JMP PRODUCE /NO, OK JMS BADSTA /YES--NO ) THOUGH PRODUC, TAD NOTE SPA CLA /REST? JMP PRO7 /YES TAD ACC SMA /FLAT? CLL RAR /NO, DIVIDE BY TWO SNA /MAYBE ZERO IF NATURAL SZL /NON-ZERO LINK IF NATURAL SKP TAD I NOTEV /GET DEFAULT #!" DCA ACC /-1 FOR !,1 FOR # TAD NOTE TAD (BASTAB DCA NOTE TAD I NOTE /GET NOTE NUMBER TAD ACC /#! TAD OCTAVE /+- TAD TRANSPOSE /DID HE REQUEST TRANSPOSE PRO3, SMA /MAKE SURE IT IS WITHIN RANGE JMP PRO4 TAD (14 PRO3A, DCA WSB JMS BADSTA /OUT OF RANGE TAD WSB JMP PRO3 PRO4, TAD (-117 SPA JMP PRO6 TAD (117-14 /OUT OF RANGE JMP PRO3A PRO6, TAD (117 DCA NOTE PRO7, TAD (PROTAB DCA WSA TAD (-4 DCA WSB PRO8, TAD I WSA SNA CLA /SPACE IN THE TABLE? JMP PRO9 /YES ISZ WSA /GO TO NEXT ENTRY ISZ WSA ISZ WSA ISZ WSB /END? JMP PRO8 /NO JMS BADSTA /TRYING TO PLAY 5 NOTES JMP PROA PAGE PRO9, ISZ NOTCNT /COUNT HOW MANY TAD TOTLEN DCA I WSA ISZ WSA STA DCA I WSA /SET FLAG SO WE WILL ISZ WSA /PROCESS NOTE LATER TAD NOTE DCA I WSA /REMEMBER PITCH TAD CHAR PROA, TAD (-", SNA CLA /DO WE EXPECT MORE NOTES? JMP NEXNOT /YES PROB, TAD NOTCNT SNA JMP START2 /THERE ARE NO NOTES TO WORRY ABOUT CIA DCA NOTCNT TAD (PROTAB DCA WSA TAD (-4 DCA WSB /FIRST WORRY ABOUT NOTES WHICH MUST BE CHANGED TO RESTS PUT0, TAD I WSA ISZ WSA ISZ WSA SZA CLA /IS THIS A TIMED OUT NOTE? JMP PUT2 /NO ISZ I WSA /IS IT A REST? JMP PUT3 /NO-BETTER MAKE IT ONE PUT1, STA DCA I WSA /REMEMBER IT IS REST PUT2, JMS LIMTST /TEST FOR END OF BUFFER AREA ISZ WSA ISZ WSB JMP PUT0 /GO FOR MORE TAD (PROTAB /START OVER AGAIN DCA WSA TAD (-4 DCA WSB /NOW WORRY ABOUT OUR NEW NOTES PUT4, TAD I WSA ISZ WSA SZA CLA /ACTIVE NOTE? JMP PUT6 /YES PUT5, ISZ WSA /GO TO NEXT ENTRY ISZ WSA ISZ WSB JMP PUT4 HLT /HLT HERE MEANS BUG PUT3, TAD (10 /DEFINE A REST TAD WSB /NOTE # STL RAL JMS OUT JMP PUT1 PUT6, ISZ I WSA /FLAG SET? JMP PUT5 /NO, IGNORE IT JMS LIMTST /TEST FOR END OF BUFFER AREA ISZ WSA TAD I WSA SPA CLA /REST? JMP PUT7 /YES TAD RTRAN /GET AUTOMATIC TRANSPOSE TAD I WSA /AND NOTE /THERE ARE MORE THAN 64 NOTES, BUT ONLY 6 BITS /TO REMEMBER WITH. SO WE DO THIS: AND [7700 /IN RANGE? SNA JMP PUT6A /NOTHING TO DO SMA CLA TAD (10 TAD I WSA /TAD IN PITCH AND (70 /GET TRANSPOSE AMOUNT DCA RTRAN /SAVE IT TAD RTRAN TAD (6 /PUT IN FUNCTION CODE JMS OUT /STASH IT IN BUFFER TAD RTRAN CIA DCA RTRAN PUT6A, TAD (10 PUT7, ISZ NOTCNT /LAST NOTE? TAD (4 TAD (4 TAD WSB /NOTE # STL RAL JMS OUT TAD I WSA TAD RTRAN /AUTOMATIC TRANSPOSE SMA /REST? JMS OUT /NO, REMEMBER PITCH CLA CLL TAD NOTCNT SZA CLA /LAST NOTE? JMP PUT5+1 /NO, GO FOR MORE JMP PUT9 /CHECK FOR THE END OF THE BUFFER SPACE LIMTST, 0 CLA CLL TAD OUTBUF TAD LIMIT SNL CLA /AT OR NEAR END? JMP I LIMTST /OK IFNZRO CORE-100 < TAD I BUFTAB /AUTO-INDEX SNA /IS THERE MORE BUFFER AREA? JMP PUTNO /NO DCA LIMIT /LIMIT OF BUFFER IN THIS FIELD TAD (14 /CODE FOR FIELD SWITCH JMS OUT TAD I BUFTAB /CDF NEW FIELD DCA OUTCDF DCA OUTBUF /START AT LOCATION ZERO DCA OUTFLG JMP I LIMTST > IFZERO CORE-100 < JMP PUTNO > PAGE PUT9, AC4000 DCA THISLEN /NOW FIGURE OUT WHAT THE SHORTEST TIME LEFT /IS OF THE FOUR NOTES, AND SUBTRACT THAT /TIME FROM ALL NOTES TAD TIMA JMS SMALL TAD TIMB JMS SMALL TAD TIMC JMS SMALL TAD TIMD JMS SMALL TAD TIMA SZA TAD THISLEN DCA TIMA TAD TIMB SZA TAD THISLEN DCA TIMB TAD TIMC SZA TAD THISLEN DCA TIMC TAD TIMD SZA TAD THISLEN DCA TIMD TAD THISLEN CIA JMS OUT /OUTPUT LENGTH /NOW IF IT WAS LONGER THAN 64, WE NEED TO REMEMBER THAT TAD THISLEN RTR RTR RTR AND [77 TAD [7700 DCA WSA JMS LIMTST /CHECK FOR END OF BUFFER AREA AC0002 ISZ WSA /WAS IT TOO LONG? JMS OUT /YES--CREATE LONGER NOTE SNA CLA JMP .-5 JMP START2 /GO FOR MORE NEXLIN, ISZ TFLAG /ERROR? SKP JMS MSG /YES-PRINT LINE TAD [LINBUF-1 DCA LINE /RESET BUFFER POINTER ISZ L /COUNT LINES JMP START5 JMP START5 DEFY, TAD TIMA /WE FOUND A Y TAD TIMB /ARE ALL NOTES TIMED OUT? TAD TIMC TAD TIMD SZA CLA JMS BADSTA /NOTES DID NOT FINISH TOGETHER DCA TIMA /WHETHER THEY ARE OR NOT, DCA TIMB /WE WILL MAKE THEM SO DCA TIMC DCA TIMD ISZ Y NOP DCA L JMS GETEQ /IS THERE AN = JMP DEFV /NO JMS DECIN /GET DECIMAL # SZA DCA Y /SAVE IT DEFV, TAD CHAR BRANCH /LOOK FOR END OF LINE BRANC DECIN, 0 /DECIMAL INPUT DECIN1, DCA WSB JMS IN TAD (-"9-1 CLL TAD (12 DCA AXA SNL JMP DECIN2 JMS MUL 12 TAD AXA JMP DECIN1 DECIN2, TAD WSB JMP I DECIN SPACE, 0 TAD [240 JMS TYPE JMP I SPACE CRLF, 0 TAD (215 JMS TYPE TAD (212 JMS TYPE JMP I CRLF TYPE, 0 ISZ COFLG /CTRL/O? JMP TYPENO /YES-NO PRINTING TSF JMP .-1 TLS /TYPE CHARACTER TYPENO, CLA KRS /LASTLY TYPED CHARACTER AND [177 /REMOVE PARITY TAD (-"O+300 SNA CLA /IS IT CTRL/O? KSF /AND IS FLAG SET? STA DCA COFLG /REMEMBER FLAG FOR NEXT TIME JMP I TYPE COFLG, -1 PAGE IFZERO OS8-20 < IFNDEF WOW < REMEM=. *HOFUDG+1 >> SMALL, 0 /FIND SMALLEST LENGTH SNA JMP I SMALL /IGNORE ZEROES TAD THISLEN SMA JMP SMALL2 CIA /FOUND A SMALLER ONE TAD THISLEN DCA THISLEN SMALL2, CLA JMP I SMALL IFZERO OS8-10 < OSDEC, 0 /CALL OS8 COMMAND DECODER CIF 10 JMS I C7700 DECODE "M-300^100+"U-300 /.MU DEFAULT STA DCA INCHCT IAC DCA INEOF /CAUSE AN END OF FILE TAD (7617 /INIT FILE POINTER DCA INFPTR JMP I OSDEC OSIN, 0 INCHAR, ISZ INJMP /UNPACKING SWITCH ISZ INCHCT /ANY MORE CHARACTERS? INJMPP, JMP INJMP /YES TAD INEOF SNA CLA /EOF? JMP INGBUF /NO-GO READ GETNEW, JMS INNEWF /GO TO NEXT FILE JMP ENDM /NO MORE FILES INGBUF, ISZ INCTR SKP ISZ INEOF /WE'RE ON LAST BLOCK JMS I INHNDL /READ FROM INPUT 200 /ONE BLOCK INBUFP, INBUF INREC, 0 JMP INERRX INBREC, ISZ INREC /GO TO NEXT BLOCK TAD (-600-1 DCA INCHCT TAD INJMPP DCA INJMP TAD INBUFP DCA INPTR JMP INCHAR INERRX, ISZ INEOF C7700, SMA CLA /FATAL ERROR? JMP INBREC /END OF FILE HLT /I/O ERROR INJMP, HLT /UNPACKING JUMP JMP ICHAR1 JMP ICHAR2 TAD INJMPP DCA INJMP TAD I INPTR AND (7400 CLL RTR RTR TAD INSAVE RTR RTR ISZ INPTR JMP INCOMN ICHAR2, TAD I INPTR AND (7400 DCA INSAVE ISZ INPTR ICHAR1, TAD I INPTR INCOMN, AND [177 TAD (-32 /CTRL/Z? SNA JMP GETNEW /TIME FOR NEXT FILE TAD (232 JMP I OSIN /GO TO NEXT INPUT FILE INNEWF, 0 TAD (INDEVH+1 DCA INHNDL CDF 10 TAD I INFPTR CDF SNA JMP I INNEWF /NO MORE INPUT FILES CIF 10 JMS I C7700 /FETCH HANDLER FETCH INHNDL, .-. HLT CDF 10 TAD I INFPTR AND (7760 SZA TAD (17 STL RTR RTR DCA INCTR ISZ INFPTR TAD I INFPTR CDF DCA INREC ISZ INFPTR DCA INEOF STA DCA INCHCT ISZ INNEWF JMP I INNEWF IFDEF WOW < RESTR2, 0 JMS I [RESTOR STA TAD RESTR2 DCA RESTR2 JMP I RESTR2 >> IFNZRO OS8-10 < OSIN, 0 CH1, TAD [-20 /SET FOR DELAY OF A WHILE DCA CHAR CH2, KSF /ANYTHING AT LOW SPEED? JMP CH3 /NO KRB /YES-GET IT JMP I OSIN /AND RETURN CH3, RSF /ANYTHING AT HIGH SPEED? JMP CH4 /NO RRB RFC /YES, GET IT JMP I OSIN /AND RETURN CH4, ISZ CH5 JMP CH2 ISZ CHAR JMP CH2 LAS SNA CLA RFC /TRY TO START THE READER CLA /IN CASE OF FUNNY INTERFACES JMP CH1 CH5, 0 > PAGE IFZERO OS8-20 < IFNDEF WOW < *REMEM >> BRAN0, 0 /BRANCH BASED ON CHARACTER DCA CHAR /MAYBE USE CHAR IN AC STA TAD I BRAN0 DCA AXA TAD CHAR SNA JMS IN CLA SKP BRAN1, ISZ AXA TAD I AXA SMA SKP CLA TAD CHAR SZA CLA JMP BRAN1 TAD I AXA DCA WSA JMP I WSA /BRANCH! GETEQ, 0 /SKIP IF NEXT CHAR IS = JMS IN TAD (-"= SNA CLA ISZ GETEQ JMP I GETEQ KEYC, 0 /SET TO KEY OF C TAD (KEYTAB-1 DCA AXA TAD (-10 DCA WSA DCA I AXA ISZ WSA JMP .-2 JMP I KEYC GETNOT, 0 /GET A NOTE JMS IN TAD (-"G-1 CLL TAD ("G-"A+1 SNL JMP GETNR GETN2, DCA NOTE TAD NOTE TAD (KEYTAB+1 DCA NOTEV DCA OCTAVE /CLEAR OUT +- DCA ACC /CLEAR ACCIDENTALS ISZ GETNOTE JMP I GETNOTE GETNR, TAD ("A-"R SZA CLA JMP I GETNOTE /NO NOTE STA JMP GETN2 /GET A CHARACTER, AND REMEMBER IN CASE OF ERROR IN, 0 JMS OSIN AND [177 TAD [200 DCA CHAR TAD CHAR TAD (-212 SZA TAD (-3 SNA JMP IN2 /CR OR LF TAD (215-340 CLL TAD (340-240 SNL CLA JMP IN+1 /INVALID CHARACTER-IGNORE IN2, TAD LINE TAD (-LINBUF-100+2 SPA CLA /SOMEWHAT LONG? JMP .+3 TAD [LINBUF-1 /YES, START OVER DCA LINE TAD CHAR DCA I LINE /SAVE IN LINE BUFFER TAD CHAR TAD (-240 SNA CLA JMP IN+1 /IGNORE(BUT PRINT) SPACES TAD CHAR JMP I IN BADLIN, JMS BADSTA /PRINT "*" JMP DEFV /FIND NEXT LINE BADSTA, 0 CLA TAD LINE DCA WSA TAD I WSA /GET LAST CHARACTER DCA I LINE /MOVE IT OVER TAD ("* DCA I WSA /PUT * IN LINE STA DCA TFLAG /PRINT THIS LINE JMP I BADSTA /RETURN /T= : TRANSPOSE DEFT, JMS GETEQ /BUMP OVER EQUAL JMP BADLINE /OOPS, NONE JMS DECIN /GET DECIMAL NUMBER TAD (-144 /T=100 IS NO TRANSPOSE DCA TRANSPOSE JMP DEFV /IGNORE REST OF LINE PAGE ENDM, JMS OUT /OUTPUT END CODE (0) JMP I [PLAY /NOW GO AND PLAY IFDEF WOW < IFZERO OS8-10 < *.-1 /UNLESS THIS IS ASSEMBLED TAD [7600 /SINCE WE USE FIELD ONE AS A DCA WSA /4K BUFFER, WE MUST SAVE THE TAD (SAVBUF-1 DCA AXA /OS/8 STUFF WHICH IS THERE. SAVEL, CDF 10 TAD I WSA CDF DCA I AXA ISZ WSA JMP SAVEL TAD I [7600 DCA MSG TAD (JMS I [RESTR2 DCA I [7600 /SET RESTART TRAP TAD (JMS I [RESTR2 DCA I [START JMP I [PLAY /NOW, WE CAN PLAY MUSIC! RESTOR, 0 /SUBROUTINE TO RESTORE THE TAD [7600 /TOP PAGE OF FIELD ONE DCA WSA TAD (SAVBUF-1 DCA AXA RESTOL, TAD I AXA CDF 10 DCA I WSA CDF ISZ WSA JMP RESTOL TAD MSG /RESTORE 7600 DCA I [7600 TAD (SKP DCA I [START JMP I RESTOR >> MSG, 0 /PRINT LINE TAD Y JMS DECOUT /PRINT Y NUMBER JMS SPACE TAD L JMS DECOUT /PRINT L NUMBER JMS SPACE TAD [LINBUF-1 DCA AXA MSG1, TAD (-76 DCA WSA MSG2, TAD I AXA JMS TYPE TAD AXA CIA TAD LINE SNA CLA JMP I MSG ISZ WSA JMP MSG2 JMS CRLF JMP MSG1 OUT, 0 IFNZRO CORE-100 < OUTCDF, CDF 00 > AND [77 ISZ OUTFLG JMP OUT2 TAD I OUTBUF DCA I OUTBUF ISZ OUTBUF JMP OUT3 OUT2, IFNZRO CPU-4 <BSW> IFZERO CPU-4 < CLL RTL RTL RTL > OUT3, DCA I OUTBUF IFNZRO CORE-100 < CDF > TAD OUTFLG CIA DCA OUTFLG JMP I OUT DECOUT, 0 SNA JMP DECO2 DCA WSB TAD (DECO9 DCA WSA JMS DECO6 SNA JMP .-2 TAD ("0 JMS TYPE JMS DECO6 JMP .-3 DECO2, TAD ("0 JMS TYPE JMP I DECOUT DECO6, 0 DCA WSC DECO7, TAD I WSA SNA JMP I DECOUT STL TAD WSB SZL JMP DECO8 DCA WSB ISZ WSC JMP DECO7 DECO8, CLA ISZ WSA TAD WSC JMP I DECO6 /MULTIPLY:AC=WSB*(JMS+1) MUL, 0 TAD (-14 DCA WSA TAD I MUL ISZ MUL MUL2, CLL RAL SZL TAD WSB ISZ WSA JMP MUL2 JMP I MUL PAGE /THE START OF THE PLAYING PART OF THE COMPILER PLAY, DCA FLG /RESET PACKING FLAG TAD (BFR1 DCA TRAN IFDEF WOW < CDF 10 DCA AXB /START OFF WITH A LONG DCA BUFGET /PAUSE (.84 SEC) STL RAR DCA I BUFGET STA DCA I AXB CDF DCA OOPS > IFNDEF WOW < STA > DCA SAVS /DON'T START WITH POP TAD (BUFTBL-1 DCA BUFTAB TAD I BUFTAB DCA GETPTR IFNZRO CORE-100 < ISZ BUFTAB TAD I BUFTAB DCA GETCDF > TAD (MDEFAULT JMP DOM1 /SET METER DEFAULT RESTM, IFDEF WOW <DECIMAL JMS DOIT /A REST... IFZERO CPU-1 < T1+158 > IFZERO CPU-2 < T1+180 > OCTAL> TAD (2000 /LOW FREQUENCY DCA I AXA DCA I AXA /NO SPIKES NEXT1, STA DCA I AXA /KEEP SIMULTANEOUS NOTES NEXT, IFDEF WOW <DECIMAL JMS DOIT /IN PHASE IFZERO CPU-1 < T1+T2+190 > IFZERO CPU-2 < T1+T2+225 > OCTAL> JMS I [GET /WHAT DO WE DO? CLL RAR SNL JMP SPECIAL /SOMETHING SPECIAL RTR AND (7 /WHAT DO? TAD (JMPTAB DCA WSA TAD I WSA /GET DISPATCH ADDRESS DCA WSA IFDEF WOW <DECIMAL NOP JMS DOIT IFZERO CPU-1 < T1+140 > IFZERO CPU-2 < T1+165 > OCTAL > TAD CHAR AND (6 /WHICH NOTE? CLL RAL TAD (NOTTAB-1 DCA AXA JMP I WSA /NOW DISPATCH REST, IFDEF WOW <DECIMAL JMS DOIT /DO A REST IFZERO CPU-1 < T1+158 > IFZERO CPU-2 < T1+180 > OCTAL> TAD (2000 DCA I AXA /LOW FREQUENCY DCA I AXA /NO SPIKES NEXT2, STA DCA I AXA /KEEP SIMULTANEOUS NOTES IFDEF WOW <DECIMAL JMS DOIT /IN PHASE IFZERO CPU-1 < T1+T2+12 > IFZERO CPU-2 < T1+T2+15 > OCTAL> JMS I [GET /GET DURATION SNA CLA JMP NEXHOL /IT'S A LONG ONE IFDEF WOW <DECIMAL JMS DOIT IFZERO CPU-1 < T1+2678 > IFZERO CPU-2 < T1+3135 > OCTAL> TAD CHAR /NOW WE WANT TO MULTIPLY DURATION IFNZRO CPU-4 <BSW> IFZERO CPU-4 < CLL RTL /BY LENGTH OF A "G" IN RTL /HOSAVE,LOSAVE (IN UNITS OF A RTL > /6.4 MICROSECOND) DCA WSB TAD (-6 DCA WSA DCA LOTIM DCA HOTIM JMP NEXLUP /NOW WE'RE ALL SET TO MULTIPLY NEXSH, TAD LOTIM CLL RAL DCA LOTIM TAD HOTIM RAL DCA HOTIM NEXLUP, TAD WSB RAL DCA WSB /BIT OF MULTIPLIER IN L SNL JMP NEXNO2 /NO ADDING TO DO TAD LOSAVE TAD LOTIM DCA LOTIM CML RAL /REMEMBER CARRY! TAD HOSAVE TAD HOTIM DCA HOTIM IFNDEF WOW <NEXNO2,> NEXNO, ISZ WSA JMP NEXSH JMP NEXINI /DONE MULTIPLYING IFDEF WOW < NEXNO2, TAD /WASTE TIME DCA TAD DCA AND I AXA /NEED AUTO-INDEX FOR EXTRA .2US JMP NEXNO > NEXHOL, IFDEF WOW <DECIMAL JMS DOIT /HOLD FOR 64 "G"S IFZERO CPU-1 < T1+270 > IFZERO CPU-2 < T1+315 > OCTAL> TAD LOLONG DCA LOTIM TAD HOLONG DCA HOTIM NEXINI, TAD AR /REMEMBER HOW MANY TAD BR /SPIKES IN ALL TAD CR TAD DR IFDEF WOW <CIA> IFNDEF WOW <CMA> DCA RTOT IFNDEF WOW < KRB /WHAT WAS THE LAST CHARACTER TYPED? AND (177 /MASK PARITY TAD (-3 /CHECK FOR CTRL/C SNA /IS IT? IFZERO OS8-10 < JMP I [7600 > /YES, RETURN TO MONITOR IFNZRO OS8-10 < JMP START> /YES, READ ANOTHER TAPE TAD ("C-"Q SNA CLA /IS IT A CTRL/Q? IFZERO OS8-10 < JMP DOEND2 > /YES, GO TO NEXT PIECE IFNZRO OS8-10 < JMP START > /YES, GO TO READ ANOTHER TAPE > JMP PLAY2 /AND GO PLAY! PAGE DIVP=LOLONG DIVM=HOLONG /GIVEN THE DESIRED SPEED (12 BITS) AND /(HOFUDG,LOFUDG) (24 BITS), CALCULATE /HOW LONG A "G" IS (24 BITS) AND PUT /IT IN (HOSAVE,LOSAVE) DOMETE, IFDEF WOW <DECIMAL JMS DOIT IFZERO CPU-1 < T1+T2+T2+232 > IFZERO CPU-2 < T1+T2+T2+270 > OCTAL > JMS I [GET IFNZRO CPU-4 <BSW> IFZERO CPU-4< CLL RTL RTL RTL > DCA DIVP JMS I [GET /GET RIGHT HALF TAD DIVP DOM1, DCA DIVP TAD DIVP CIA DCA DIVM /- LENGTH TAD HOFUDG DCA LOTIM DCA HOTIM IFDEF WOW <DECIMAL JMS DOIT IFZERO CPU-1 < T1+T3+78 > IFZERO CPU-2 < T1+T3+90 > OCTAL > JMS DIV /DIVIDE DCA HOSAVE TAD LOFUDG DCA LOTIM IFDEF WOW <DECIMAL JMS DOIT IFZERO CPU-1 < T1+T3+26 > IFZERO CPU-2 < T1+T3+30 > OCTAL> JMS DIV /DIVIDE LO DCA LOSAVE IFDEF WOW <DECIMAL JMS DOIT IFZERO CPU-1 < T1+1124 > IFZERO CPU-2 < T1+1320 > OCTAL> TAD (-6 DCA WSA /WE MUST NOW SHIFT IT 6 TAD HOSAVE /PLACES TO THE LEFT DCA HOLONG /FOR LONG NOTES TAD LOSAVE SKP DOM2, TAD LOLONG CLL RAL DCA LOLONG TAD HOLONG RAL DCA HOLONG ISZ WSA JMP DOM2 JMP I [NEXT DIV, 0 /HOTIM,LOTIM/DIVP(DIVM) TAD (-15 /REM IN HOTIM, QUO IN LOTIM DCA WSA /SET UP DIVIDE COUNT JMP DIVB /AND GO DO IT DIVA, RAL /SHIFT DIVIDEND IFDEF WOW < NOP > /FOR TIMING TAD DIVM /MINUS DIVISOR DCA HOTIM SNL /DID WE OVER-SUBTRACT? JMP DIVD /YES, WE'LL START ADDING DIVISOR IFDEF WOW < NOP > /FOR TIMING DIVB, TAD LOTIM /SHIFT DIVIDEND CML RAL DCA LOTIM TAD HOTIM ISZ WSA /ARE WE THROUGH? JMP DIVA /NO, CONTINUE SUBTRACTING DCA HOTIM /SAVE REMAINDER IFDEF WOW<AND> TAD LOTIM /GET QUOTIENT JMP I DIV /AND RETURN DIVC, RAL /SHIFT DIVIDEND CML /MAKE IT WORK TAD DIVP /POSITIVE DIVISOR DCA HOTIM SZL /HAVE WE ADDED ENOUGH? JMP DIVB /YES, GO SUBTRACT FOR A WHILE IFDEF WOW < NOP > /FOR TIMING DIVD, TAD LOTIM /SHIFT DIVIDEND CML RAL DCA LOTIM TAD HOTIM ISZ WSA /ARE WE THROUGH? JMP DIVC /NO, GO ADD SOME MORE TAD DIVP /YES, CORRECT REMAINDER DCA HOTIM /AND SAVE IT TAD LOTIM /GET QUOTIENT JMP I DIV /AND RETURN DOTRAN, IFDEF WOW <DECIMAL JMS DOIT /DO TRANSPOSE IFZERO CPU-1 < T1+128 > IFZERO CPU-2 < T1+150 > OCTAL> TAD CHAR AND (70 TAD (BFR1 DCA TRAN JMP I [NEXT /GET A BYTE FROM THE INFO BUFFER GET, 0 IFNZRO CORE-100 < GETCDF, CDF 00 > TAD I GETPTR IFNZRO CORE-100 <CDF> ISZ FLG JMP GETL ISZ GETPTR AND [77 DCA CHAR IFDEF WOW < NOP NOP > JMP GET2 GETL, IFNZRO CPU-4< BSW > IFZERO CPU-4 < RTR RTR RTR > AND [77 DCA CHAR STA DCA FLG GET2, TAD CHAR JMP I GET PAGE /THE FIRST TASK IS TO FIGURE OUT WHICH NOTE /WILL BE NEXT TO FINISH ONE CYCLE. PLAYIT, IFDEF WOW <DECIMAL JMS DOIT IFZERO CPU-1 < T1+1128 > IFZERO CPU-2 < T1+1335 > OCTAL> TAD AT CIA CLL TAD BT SZL CLA SKP CIA TAD BT CIA CLL TAD CT SZL CLA SKP CIA TAD CT CIA CLL TAD DT SZL CLA SKP CIA TAD DT CIA CLL DCA SAVE /WELL, WE DON'T REALLY KNOW WHICH ONE, BUT /WE DO KNOW HOW LONG IT IS. SO WE MOVE UP /ALL FOUR COUNTERS, RESETTING ANY WHICH /REACH ZERO, AND REMEMBERING HOW MANY /SPIKES WE SHOULD DO. TAD RTOT IFZERO CPU-4 <DCA SAVS> IFNZRO CPU-4 <MQL> TAD AT TAD SAVE SNA JMP DELA DCA AT IFNZRO CPU-4 < MQA TAD AR MQL > IFZERO CPU-4 < TAD SAVS TAD AR DCA SAVS > RA, TAD BT TAD SAVE SNA JMP DELB DCA BT IFNZRO CPU-4 < MQA TAD BR MQL > IFZERO CPU-4 < TAD SAVS TAD BR DCA SAVS > RB, TAD CT TAD SAVE SNA JMP DELC DCA CT IFNZRO CPU-4 < MQA TAD CR MQL > IFZERO CPU-4 < TAD SAVS TAD CR DCA SAVS> RC, TAD DT TAD SAVE SNA JMP DELD DCA DT IFNZRO CPU-4 < MQA TAD DR MQL > IFZERO CPU-4 < TAD SAVS TAD DR DCA SAVS > RD, IFNZRO CPU-4 < MQA DCA SAVS > /AND NOW FOR A BUNCH OF FUNNY CALCULATIONS. /HOLD ON TO YOUR HAT.... TAD SAVE /HOW MANY SPIKES THIS TIME CLL TAD LOTIM DCA LOTIM /UPDATE NOTE LENGTH SNL AND /TIMING CORRECTOR SZL ISZ HOTIM /UPDATE HIGH ORDER SKP JMP I [NEXT /FINISHED WITH THIS NOTE IFDEF WOW <DECIMAL NOP PLAY2, JMS DOIT IFZERO CPU-1 < T1+216 > IFZERO CPU-2 < T1+255 > OCTAL > IFNDEF WOW < IAC PLAY2, > TAD OLDE /CORRECTION FACTOR FROM LAST TIME TAD FIX /HOW LONG IT IS THRU "DOIT" TAD SAVS /AND HOW MANY SPIKES WE HAVE SPA STL SMA /SET UP LINK FOR +/- CLL TAD SAVE SZL /DO WE HAVE TIME? JMP TRYAGN /NO IFDEF WOW < /WE HAVE BEEN DEALING IN UNITS OF 6.4US. /NOW WE CONVERT IT TO UNITS OF .1US /BY MULTIPLYING BY 64 (SHIFT 6 PLACES) CIA TAD [7700 DCA WSA DECIMAL JMS DOIT IFZERO CPU-1 < T1+674 > IFZERO CPU-2 < T1+810 > OCTAL TAD WSA BSW MQL MQA AND [7700 /JUST LOW ORDER BYTE*64 DCA WSA JMP SAVIT /SINCE THERE ISN'T ENOUGH TIME BETWEEN SETS OF /SPIKES TO GET AROUND DOIT, WE CAN'T DO THEM /AT THE RIGHT TIME. TRYAGN, TAD (+TIM6 DCA OLDE /SAVE RETRY FUDGE DECIMAL JMS DOIT IFZERO CPU-1 < T1+268 > IFZERO CPU-2 < T1+315 > OCTAL /NOW PUT THE EXTRA SPIKES ALONG WITH /THE PREVIOUS BATCH TAD AXB DCA WSA TAD SAVS CDF 10 TAD I WSA DCA I WSA TAD SAVS CDF TAD OLDS DCA OLDS JMP PLAYIT > IFNDEF WOW < CMA DCA SAVE IFNZRO CPU-1 <NOP> IFZERO CPU-1 <AND> ISZ SAVE JMP .-2 TRYAGN, DCA OLDE SKP NOISA, NOISE IFZERO CPU-1 <NOP> ISZ SAVS IFNZRO CPU-1 <JMP .-2> IFZERO CPU-1 <JMP .-3> JMP PLAYIT > DELA, TAD AC DCA AT IFZERO CPU-4 <AND> JMP RA DELB, TAD BC DCA BT IFZERO CPU-4 <AND> JMP RB DELC, TAD CC DCA CT IFZERO CPU-4 <AND> JMP RC DELD, TAD DC DCA DT IFZERO CPU-4 <AND> JMP RD PAGE SPECIA, TAD XJMPT /JUMP TO SPECIAL ROUTINE DCA AXA TAD I AXA DCA WSA JMP I WSA SETN, IFDEF WOW <DECIMAL JMS DOIT /SET NOTE IFZERO CPU-1 < T1+T2+488 > IFZERO CPU-2 < T1+T2+570 > OCTAL> STA /REMEMBER NO MORE NOTES NOW IFNDEF WOW <SETNM, > SETN2, DCA WSB JMS I [GET /GET PITCH TAD TRAN DCA WSA TAD I WSA /PERIOD IN UNITS OF 6.4 US DCA I AXA LAS /CHECK LOUDNESS CMA AND [77 TAD WSA /LOWER NOTES NEED EMPHASIS CLL RAR TAD XB DCA WSA TAD I WSA /HOW MANY SPIKES? DCA I AXA ISZ WSB /CHECK FLAG JMP I XNEXT1 JMP I XNEXT2 IFDEF WOW < DECIMAL SETNM, JMS DOIT IFZERO CPU-1 < T1+T2+488 > IFZERO CPU-2 < T1+T2+570 > JMP SETN2 OCTAL> IFZERO CORE-100 <DOFLD, > ERR0, HLT /PROGRAM BUG DOEND, IFDEF WOW < DECIMAL JMS DOIT /WE'RE AT THE END! IFZERO CPU-1 < T1+114 > IFZERO CPU-2 < T1+135 > OCTAL TAD BUFGET /WE MUST WAIT FOR THE CIA /END OF THE MUSIC TO PLAY TAD AXB AND X7760 SZA CLA JMP DOEND > LAS SPA CLA /REPEAT? JMP I [PLAY /YES DOEND2, IFZERO OS8-10 < IFDEF WOW < JMS I [RESTOR > /RESTORE TOP PAGE OF FIELD 1 JMS I XINNEWF /IS THERE ANOTHER INPUT FILE? SKP JMP I XST1 /YES, PLAY IT CDF 10 TAD I X7642 /ALT-MODE FLAG? CDF SPA CLA JMP I [7600 /RETURN TO MONITOR > JMP I [START /RETURN TO COMMAND DECODER IFNZRO CORE-100 < /CHANGE TO A NEW FIELD FOR INPUT INFO DOFLD, IFDEF WOW < DECIMAL JMS DOIT IFZERO CPU-1 < T1+168 > IFZERO CPU-2 < T1+195 > OCTAL > ISZ BUFTAB TAD I BUFTAB /GET NEW FIELD DCA I XGETCDF /SAVE IT DCA FLG /RESET PACKING FLAG DCA GETPTR /START AT ADDRESS 0 JMP I [NEXT XGETCD, GETCDF > XA=BFR1%2 XB, BFR2-XA XJMPT, JMPTB2-1 XNEXT1, NEXT1 XNEXT2, NEXT2 IFZERO OS8-10 < XINNEW, INNEWF XST1, START1 X7642, 7642 > IFDEF WOW < X7760, 7760 SAVIT, TAD OLDS /CORRECT: SPIKES TAKE TAD SAVS /6.2US, NOT 6.4 US, AND IFZERO CPU-2 <CLL RAL > TAD FUDGE /DOIT DOESN'T REALLY TAKE CLL RAL /TIM6*6.4US TAD WSA CDF 10 DCA I AXB /SAVE LOW ORDER TAD [7700 MQA /NOW WE HAVE HIGH ORDER SZL /BYTE ON RIGHT SIDE OF AC NOP SNL IAC /BORROW FROM LOW ORDER? DCA I AXB /SAVE AWAY HIGH ORDER STA TAD SAVS DCA I AXB /SAVE NO. OF SPIKES CDF DCA OLDS /RESET RETRY COUNTERS DCA OLDE WAIT1, CLL STA RTL TAD BUFGET CIA TAD AXB SZA CLA /BUFFER FULL? JMP I [PLAYIT /NO MQL /ZERO TO MQ FOR SHOW NOP DECIMAL JMS DOIT IFZERO CPU-1 < T1+238 > IFZERO CPU-2 < T1+285 > OCTAL KRB /LAST CHARACTER TYPED? AND C1 /MASK PARITY TAD C2 /CTRL/C? SNA JMP WAIT2 /YES TAD C4 /CTRL/Q? SNA CLA JMP I C5 /YES, NEXT INPUT JMP WAIT1 WAIT2, IFZERO OS8-10 < JMS I [RESTOR > /RESTORE TOP OF FIELD 1 JMP I C3 /JUMP OUT C1, 177 C2, -"C+300 C3, IFZERO OS8-10 <7600> IFNZRO OS8-10 <START> C4, "C-"Q C5, IFZERO OS8-10 <DOEND2> IFNZRO OS8-10 <START> IFZERO CPU-1 < FUDGE, -2 /HALF OF 4 > IFZERO CPU-2 < FUDGE, -33 /ABOUT HALF OF 55 >> BRANA, -"# ;KEYS /DEFINE SHARP -"! ;KEYF /DEFINE FLATS -"V ;DEFV -"Y ;DEFY -"T ;DEFT -215 ;START2 -212 ;NEXLIN -"; ;START2 -"$ ;ENDM /END MUSIC BRANB, -"G ;LENG -"D ;LEND -"S ;LENS -"Q ;LENQ -"C ;LENC -"M ;LENM -"B ;LENB -"3 ;TRIPLET 0 ;BADLINE BRANC, -"; ;PROB -215 ;PROB 0 ;DEFV+1 BRAND, -"= ;DEFM -"( ;DEFCHORD -"T ;TIE -"- ;MINUS -". ;DOT 0 ;BADLINE BRANE, -"" ;ACCN -"# ;ACCS -"! ;ACCF BRANF, -"+ ;OCTUP -"- ;OCTDN -", ;PRODUCE -"; ;SPRODUCE -215 ;SPRODUCE -") ;PPRODUCE 0 ;BADLINE BRANG, -", ;PRODUCE -"; ;PRODUCE -215 ;PRODUCE 0 ;BADLINE KEYTAB, ZBLOCK 10 DECO9, DECIMAL;-1000;-100;-10;-1;0;OCTAL /TABLE: WHERE ARE THE WHITE KEYS, A THROUGH G? BASTAB, 36;40;41;43;45;46;50 /TABLE OF BUFFER AREAS BUFTBL, MUSBUF IFZERO OS8-10 < MARGIN-INBUF> IFZERO OS8-20 < MARGIN-7600 > IFNZRO CORE-100 < CDF 00 IFNDEF WOW< MARGIN-7600 CDF 10> MARGIN-7600 CDF 20 CORTAB=. MARGIN-7600 CDF 30 MARGIN-7600 CDF 40 MARGIN-7600 CDF 50 MARGIN-7600 CDF 60 MARGIN-7600 CDF 70 0 > *.+1&7776 BFR1, DECIMAL IFNZRO T64 < /PERIOD OF NOTES IN UNITS OF 6.4US /USING EQUAL TEMPERAMENT -4018;-3792;-3579;-3378;-3189;-3010 /A-- -2841;-2681;-2531;-2389;-2255;-2128 -2009;-1896;-1790;-1689;-1594;-1505 /A- -1420;-1341;-1265;-1194;-1127;-1064 -1004;-948;-895;-845;-797;-752 /A -710;-670;-633;-597;-564;-532;-502;-474;-447;-422;-399;-376 /A+ -355;-335;-316;-299;-282;-266;-251;-237;-224;-211;-199;-188 /A++ -178;-168;-158;-149;-141;-133;-126;-119;-112;-106;-100;-94 /A+++ -89;-84;-79;-75;-70;-67;-63;-59;-56;-53;-50;-47 -44 /A++++!! > IFZERO T64 < /PERIOD OF NOTES IN 6.0 MICROSECOND UNITS /USING EQUAL TEMPERAMENT -2143;-4045;-3818;-3604;-3401;-3210 /A-- -3030;-2860;-2700;-2548;-2405;-2270 -2143;-2022;-1909;-1802;-1701;-1605 /A- -1515;-1430;-1350;-1274;-1203;-1135 -1071;-1011;-954;-901;-850;-803 /A -758;-715;-675;-637;-601;-568 -536;-506;-477;-450;-425;-401 /A+=A440 -379;-358;-337;-319;-301;-284 -268;-253;-239;-225;-213;-201 /A++ -189;-179;-169;-159;-150;-142 -134;-126;-119;-113;-106;-100 /A+++ -95;-89;-84;-80;-75;-71 -67;-63;-60;-56;-53;-50 -47 /A++++!!! > /NUMBER OF PULSES GENERATED DETERMINE LOUDNESS BFR2, 104;97;91;84;79;74;69 64;60;56;52;48;45;42;39 37;34;32;30;28;26;24;23 21;20;18;17;16;15;14;13 12;11;10;9;9;8;8;7 7;6;6;6;5;5;5;4 4;4;3;3;3;3;3;2 2;2;2;2;2;2;2;1 1;1;1;1;1;1;1;1 OCTAL JMPTAB, REST RESTM SETN SETNM ERR0 ERR0 ERR0 ERR0 JMPTB2, DOEND NEXHOL DOMETER DOTRANSPOSE ERR0;ERR0 DOFLD DOTRANSPOSE; ERR0;ERR0;ERR0;DOTRANSPOSE ERR0;ERR0;ERR0;DOTRANSPOSE ERR0;ERR0;ERR0;ERR0;ERR0;ERR0;ERR0;ERR0 ERR0;ERR0;ERR0;ERR0;ERR0;ERR0;ERR0;ERR0 NOPUNCH LINBUF, ZBLOCK 100 /SAVE INPUT TO PRINT ERROR MESSAGE MUSBUF=. /BEGINNING OF MUSIC BUFFER IFZERO OS8-10 < *6600 IFDEF WOW < SAVBUF, > /SAVE FOR TOP OF FIELD 1 INBUF, ZBLOCK 400 /OS/8 I/O BUFFER INDEVH, ZBLOCK 400 /OS/8 DEVICE HANDLER SPACE > ENPUNCH IFNZRO CORE-100 < /INITIALIZATION CODE *LINBUF+177&7600 INIT, 0 COR0, CDF 0 TAD CORSIZ RTL RAL AND COR70 TAD COREX /MAKE CDF FOR FIELD DCA .+1 /TO BE TESTED COR1, CDF .-. TAD I CORLOC COR2, NOP DCA COR1 TAD COR2 DCA I CORLOC COR70, 70 TAD I CORLOC CORX, 7400 TAD CORX TAD CORV SZA CLA JMP COREX TAD COR1 DCA I CORLOC ISZ CORSIZ JMP COR0 CORLOC, CORX CORV, 1400 CORSIZ, 1 COREX, CDF 00 IFZERO OS8-10 < TAD I BATFLG AND COR70 /ARE WE RESTRICTED IN CORE? CLL RTR SZA JMP .+4> /YES, IGNORE ACTUAL CORE SIZE STA TAD CORSIZ /TOP FIELD CLL RAL TAD CORTBA DCA WSA IFZERO OS8-10 < TAD I BATFLG /ARE WE RUNNING UNDER BATCH? RTL SNL CLA JMP COR3 /NO, OK TAD BATPRO /YES, DON'T WIPE OUT MONITOR DCA I WSA > COR3, ISZ WSA ISZ WSA DCA I WSA /DON'T USE FIRST NONEXISTANT FIELD TAD COR2 /NOP DCA I CORINA /DON'T RETURN HERE IFDEF WOW < STA TAD CORSIZ SPA SNA CLA HLT /NOT ENOUGH CORE!! > JMP I INIT CORINA, CORINI BATFLG, 7777 CORTBA, CORTAB-6 BATPRO, MARGIN-5000 > $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 | C=200 T=97;V CAN'T PLAY IT AT NORMAL PITCH Q G+,C. R Q F#+ Q G+ C A++,M. R C G+ C F+ Y C E+,C. R,M. R C D+ Q E C C+,Q D Q E M. B+,C F,M. R C D C G Y M. C+,C E,C. R,M. R C D Q G- C C,Q F#- Q G- M. (D+,B+,G),C A C G- C F- Y M. (E+,C+,G),C E- C D- C C- C (G+,D+,G,B-) C (F+,B+,G,G--) C (E+,C+,G,C-) Y C (D+,B+,G,G--) M R,Q R Q D+ Q C#+ Q D+ C. R,C E!+ C D+ Q F#+,C. R Q E+,C C+ Q F#+ Y C (G+,B!+),M. R Q R,C A+ Q G+ Q F#+,C G Q G+ C (A++,F#,E!),M. R Q R,M R,C D Q A++ Q G+,C C Q A++ Y C (B!++,B!),M. R Q R,C A Q B!++ Q A++,C G- Q B!++ C (C#++,B!,B!-),M. R Q R,C (A,A-) Q C#++ Q B#++,C (G-,G--) Q C#++ Y C (D++,F#-,F#--),M. R Q R,C (E-,E--) Q D++ Q C#++,C (D-,D--) Q D++ C (B++,G+,D+,G-) C (C++,A++,E+,C-) C (A++,F#+,C+,D-) C (G+,D+,B+,G--) Q R Q G,C. R Q F# Q G Y C A!+,C. R,M. R C G Q B+ Q A+,C F Q B+ C (C+,E!),M. R Q R,C D Q C+ Q B+,C C Q C+ Y C (A+,G!),M. R Q R,C F Q A+ Q G,C E! Q A+ C (B!+,D!),M. R Q R,C C Q B!+ Q A+,C B! Q B!+ Y C (G!+,A),M. R C F+,Q R Q A C E!+,Q G- Q A C (D!+,B!),M. R C C+,Q R Q D! C B!+,Q C Q D! Y C (F++,F+,G-),M. R C (E!++,E!),Q R Q G- C (D!++,D!+),Q F- Q G- C (C++,C+,A!),M. R C (B!++,B!+),Q R Q C C (A!++,A!+),Q B Q C Y C (E!++,E!+,F#-),M. R C (D++,D+),Q R Q F#- C (C++,C+),Q E- Q F#- C (B++,B+,G-),M. R C (A++,A+),Q R Q G- C (G+,G),Q F#- Q G- Y C (E!+,E!,E!-),M. R C (D+,D,D-) C (C+,C,C-) C (G,G-,G--),M. R M R,Q R Q (G-,G--) Q (F#-,F#--) Q (G-,G--) Y C (A!,A!-),M R Q (G-,G--) Q R C (G+,D+,B+,G-) C (F#+,E!+,A+,G-) Q (G+,D+,B+,G-) Q (G-,G--),C. R Q (F#-,F#--) Q (G-,G--) Y C (A!,A!-),M R Q (G-,G--) Q R C (G+,D+,B+,G-) C (A++,F#+,E!+,G-) Q (G+,D+,B+,G-) Q (G-,G--),C. R Q (F#-,F#--) Q (G-,G--) Y C (A!,A!-),M R Q (G-,G--) Q R C (G+,D+,B+,G-) C (A!++,E!+,C+,G-) Q (G+,D+,B+,G-) Q R C (G+,D+,B+,G-) Y C (A!++,E!+,C+,G-) Q (G+,D+,B+,G-) Q R C (G+,D+,B+,G-) C (A!++,E!+,C+,G-) Q (G+,D+,B+,G-) Q G+,C. R Q F#+ Q G+ Y C A!++,M. R Q G+ Q G+ Q F#+ Q G+ C A!++,M. R Q G+ Q G+ Q F#+ Q G+ Y C A!++,M. R Q G+ Q G+ Q F#+ Q G+ C A++,M. R C G+ C F+ Y C E+,C. R,M. R C D+ Q E C C+,Q D Q E M. B+,C F,M. R C D C G Y M. C+,C E,C. R,M. R C D Q E- C C,Q D- Q E- M. (D+,B+,G),C F- C D- C G- Y M. (E+,C+,G),C E- C D- C C- C (E+,C#+),M A+,C F-- C (F+,D+) C (D+,B+,F,G--) Y C (C+,E,C-,C--) Q R,M R Q C+;Q B+;Q C+ C D!+,M. R,C. R C C+ Q E+ Q D+,C B!+ Q E+ Y C (F+,A!+),M. R Q R,C G Q F+ Q E+,C F Q F+ C (B++,A!+),M. R Q R,C G Q B++ Q A++,C F Q B++ Y C (C++,E!),M. R Q R,C D Q C++ Q B++,C C Q C++ C (F#+,E!),M. R Q R,C D Q F#+ Q E#+,C C Q F#+ Y C (G+,B),M. R Q R,C A Q G+ Q F#+,C G- Q G+ C (E+,C+,G,C) C (F+,D+,A+,F-) C (D+,B+,F,G-) Y C (C+,E,C-),M. R M R,Q R Q (C,C-) Q (B,B-) Q (C,C-) C (D!,D!-),M R Q (C,C-) Q R C (E+,C+,G,C) Y C (F+,D+,A!+,C) Q (E+,C+,G,C) Q (C,C-),C. R Q (B,B-) Q (C,C-) C (D!,D!-),M R Q (C,C-) Q R C (C++,G+,E+,C) Y C (B++,A!++,F+,C) Q (C++,G+,E+,C) Q (C,C-),C. R Q (B,B-) Q (C,C-) C (D!,D!-),M R Q (C,C-) Q R C (E++,C++,G,C) Y C (F++,D++,A!+,C) C (E++,C++,G,C) C (E++,C++,G,C) C (F++,D++,A!+,C) C (E++,C++,G,C) C (E++,C++,G,C) Y C (F++,D++,A!+,C) C (E++,C++,G,C) C (C++,C+,C,C-) M. (C+,C,C-,C--) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 | C=200 V=2 Q G+,C G- C A++ C D Q F+ Q D+,C G Q B+ M C+,C E C G- Q E+,C C Q G+ Y M F+,C D! C F Q G+,Q E! Q (F+,D!) C=150 S (E+,C) S (F+,C#) S (F#+,D) C=200 C (G+,E) C (R,G-) Y C R,M. G Q A+ Q B+ Q C+ Q D+ C D!+,C F C (E!+,E!) C (F+,D!) Y Q G+,M C C A++ Q G+ Q F+,C G Q E+ C. G+,Q B Q D Q G C. F+,Q G# Q A+ Q C+ Y M. D+,Q B+ Q A+ C G C F Q G+,M E C B++ Q A++ Q G+,C A+ Q F+ Y C. A++,Q D Q F Q A+ C. G+,Q A#+ Q B+ Q D+ M. E+,Q C+ Q B+ C A+ C G Y Q C++,M E C D++ Q C++ Q B++,C C+ Q A++ C. C++,Q F Q A+ Q C+ C. B++,Q G Q B+ Q D+ Y M. A++,Q C+ Q E+ Q F#+ Q G+ C F+ Q G+,C E+ C A++ C D+ Q G+ Q F+,C C+ Q E+ Y Q (G+,B+) Q (G+,B+) C (G+,B+) C (R,R) C (R,R) Q (G,F) Q (G,F) C (G,F) Y Q G+,M E C A++ Q G+ Q (F+,A+) Q (E+,C+) C. G+,Q E+ Q D+ Q C+ C. F+,Q B+ Q D+ Q C+ Y M. D+,Q B+ Q A+ C G C F Q C++,C E Q B++ Q D++,C G# Q C++ Q B++,C D+ Q F+ Y C. A++,Q C+ Q D Q F C. G+,Q B+ Q C#+ Q D+ M. E+,Q C+ Q B+ Q A+ Q G C E Y Q (E++,G+) C (D++,F+) C (F++,A++) Q (E++,G+) Q (D++,F+) Q (C++,E+) Q (B++,D+) Q (D++,F+) C (C++,E+) Y Q (B++,D+) Q (A++,C+) Q (G+,B+) Q (F+,A+) Q (D+,F) Q (D#+,F#) Q (E+,G) Q (A++,C+) C (G+,B+) C R,Q E Q A!+ Y M. R,Q G Q C+ Q E+ Q G+ Q F+ Q D!+ Q (G+,E+) Q G#+,C R Q A++ Q (B++,B+) Q (C++,A+) Q (D++,A!+) Y M E++,Q G C C+ Q B+ Q (F++,D+) Q (E++,C+) M G++,C. E+ Q D+ C R,Q C+ Q B+ Y C R,Q D+ Q C+ Q (D+,B+) Q (E+,A+) C (F+,F) M D++,Q F C B+ Q A+ Q (E++,C+) Q (D++,B+) Y M F++,C. D+ Q C+ C R,Q B+ Q A+ C R,Q C+ Q B+ Q (C+,A+) Q (D+,G) C (E+,E) Y Q (E+,C) Q (F+,D) Q (F#+,D#) Q (A++,F) C (G+,E) Q (E+,G) Q (F+,G#) Q (F#+,A+) Q (A++,C+) C (G+,B+) Y Q (E++,G+) C (D++,F+) C (F++,A++) Q (E++,G+) Q (D++,F+) Q (C++,E+) Q (B++,D+) Q (D++,F+) C (C++,E+) Y Q (B++,D+) Q (A++,C+) Q (G+,B+) Q (F+,A+) Q (D+,F) Q (D#+,F#) C (E+,G) M R,Q E Q A!+ C G Y Q A!+,M. R Q C+ Q E+ Q A!++ Q G+ Q C++ C E++,Q G C A+ M R Q G Q F Q E Y Q B++,C. G Q D++ Q G++ Q A++,C. F Q C++ Q F++ Q.. B++,M. D D F#++ C G++ C B++ Y M. R,Q D Q E Q F Q G Q A+ Q B+ Q F+,C. A+ Q A++ Q D++ Q E+,C. G Q G+ Q A++ Y Q.. C++,M. E D F#++ C G++ C C++ M. R,Q C+ C D+ Q C+ Q B+ Q A+ Q A++,C. C+ Q C++ Q E++ Q G+,C. B+ Q B++ Q E++ Y Q.. B++,M. F D F#++ C G++ C B++ M D++,Q B+ C C+ Q B+ C E++,Q A+ Q G Y Q G++,C. B+ Q E++ Q B++ Q C++,C. A+ Q A++ Q E+ C G+,M. E Q C++ Q B++ Q D++ Q C++ Y Q (F+,D) Q (G+,E) Q (A++,F) Q (B++,G) Q (C++,A+) Q (D++,B+) Y Q (F++,D+) C (E++,C+) C (G++,E+) Q (F++,D+) Q (E++,C+) Q (D++,B+) Q (C++,A+) Q (E++,C+) C (D++,B+) Y C (R,R) Q (F+,D+) Q (F+,D!+) C (F+,C+) Q (D++,F+) C (C++,E+) C (E++,G+) Q (D++,F+) Y Q (C++,E+) Q (B++,D+) Q (A++,C+) Q (C++,E+) C (B++,D+) Y C (R,R) Q (D+,D!+) Q (D+,C+) C (D+,B+) Q (C++,A+) C (B++,G) Q (D++,B+) Q (C++,A+) Q (A++,F) Y C (F+,D) M R,Q B Q D Q F Q B+ Q (B++,G) C (A++,F) Q (C++,A+) Q (B++,G) Q (G+,E) Y C (E+,C) M R,Q B Q A Q A! Q G- Q G,C E C C+ C G Q B+ Q (D+,F) Q (C+,A+) Y Q E+,C G Q B+ Q (B+,G-) Q (D+,F) C (C+,E) Y Q (D+,D-) Q (C+,E-) Q (B+,F-) Q (A+,A) C (F,D) Q F,C D C B+ C F Q A+ Q (C+,E) Q (B+,G) Y Q D+,C F Q A+ Q (A+,F-) Q (C+,E) C (B+,D) Q (C+,E-) Q (B+,F-) Q (A+,F#-) Q (G,G-) C (E,C) Y Q G,M E Q C+ Q C+ Q B+ M D+,Q F Q B+ Q B+ Q A+ Q D!+,M B!+ Q G+ Q G+ Q F+ Y M. A!+,Q C+ Q F+ Q F+ Q E!+ Q D+ Q C+ Q B!++,M D+ C C++ Q B!++ Q A!++,C C+ Q G+ Y M B!++,Q D Q F Q A!+ Q B!+ C (A!++,D+) Q A!++,M C+ C B!++ Q A!++ Q G+,C B!+ Q E+ Y M A!++,Q C Q E Q A!+ Q C+ C (G+,E+) Q (G+,E+) C (A++,F+) Q (G+,E+) Q (F+,D+) Q (E+,C+) Y Q (C#+,A#+) Q (D+,B+) Q (E+,C+) Q (F+,D+) Q (B++,G+) Q (A++,F+) Q (A++,F+) Q (G+,E+) Q (F#+,D#+) Q (A++,F+) C (G+,E+) Y C (R,R) Q (G,F) Q (G,F) C (G,F) Q (F+,D+) Q (E+,C+) Q (D#+,B+) Q (F+,D+) C (E+,C+) Y Q D+,C G- Q C+ Q B+,C G#- Q D+ Q C+,C A Q A+ C (G,B) M R,Q G Q F Q D! Q A!+ Y M. R,C G Q E Q C C G- Q R,M A! Q C!+ Q E!+ Q F+ Q B!++,C C! Q A!++ Y M. G+,C E Q D Q C Q B Q A M C++,Q A! Q C Q E! Q G! Q (D++,B!+) Q (D#++,B+) Y M. (E++,C+) Q (D++,F+) Q (C++,E+) Q (B++,D+) Q (A++,C+) Q (G+,B+) Q (F+,A+) Y Q (E+,G) Q (A++,C+) C (G+,B+) C R,Q E Q A!+ C (R,G) Q E+,M R Q A!++ Q G+ Q C++ Y Q A!++,C F- Q G+ Q F+,C B Q A!++ Q G+,C D Q F+ C (E+,G) M R,Q F Q D! Q A! Q G- Y Q G+,C B C A++ C D Q F+ Q D+,C G Q B+ C (C+,C) Q (C++,E+) Q (C++,E+) C (C++,E+) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 | C=130 S G,B R,C R,B C- S B+ S C+ S D+ Q E+,C G- Q G Q F,C A Q E+ Q D+,C B Q F S E,B R,C C,B C- S G S A+ S B+ Q C+,C E- Q E Q D,C F- Q C+ Q F,C G- Q B+ Y S. R,B R,B R,S. C- D B+,D B C. C+,C. C Q (A+,A) Q (D#,D#-) C (E,E-) C. (G,D#,B),C F- C G-- MTQ (G,D,B!) C E- C C-- Y S C+,B R,C R,B F- S E+ S F+ S G+ Q A++,C C Q C+ Q B!+,C D Q A++ Q G+,C E Q B!+ S A+,B R,C F,B F- S C+ S D+ S E+ Q F+,C A Q A+ Q G,C B! Q F+ Q B!+,C C Q E+ Y S. R,B R,B R,S. F- D (E+,E) C. (F+,F) Q (D+,D) Q (G#,G#-) C (A+,A) C. (C+,G#,E),C B! C C- MTQ (C+,G,E!) C A C F-- Y Q R,B R,B D,C F#- C C+ C E- Q C+ S R,C F#- S D+ S C+ S B+ Q C+,C D- Q A++ Q C+,B R,C R,M G- C A+ C D C B+ Q G,M R Q (C+,A) Q (D+,B) Q (E+,C) Y Q F+,B R,C D,C R C F C A,Q D- Q (F,C-) S R,C G-,C B- S G S F S E Q F,C (R,G--) Q D+ Q F,B R,C R,M C- C D C G- C E Q C,M R Q (F,D-) Q (G,E-) Q (A+,F-) Y C. (B!+,G,D),Q G- Q F- Q G- Q (B!+,G,D,D-) Q (R,R,R,E-) Q (B!+,G,C,D-) Q (R,R,R,E-) Q (B!+,G,C,C-) Y C. (A+,F,C),Q F- Q E- Q F- Q (A+,F,C,C-) Q (R,R,R,D-) Q (A+,F,B,C-) Q (R,R,R,D-) Q (A+,F,D,B-) Y C. (G,E,B),Q E- Q D- Q E- Q (G,E,B,B-) Q (R,R,R,C#-) Q (G,E,A,B-) Q (R,R,R,C#-) Q (G,E,C#,A-) Y C. (F,D,A),Q D- Q C- Q D- Q (F,D,A,A-) Q (R,R,R,B-) Q (F,D,G-,A-) Q (R,R,R,B-) Q (F,D,G-,G--) Y Q E,B R,C G-,M. C- Q D Q E,C B Q D+ Q C+,M. A Q D Q E,C C- Q C+ Q F#,B R,M. D- Q E Q F#,C A Q C+ Q B+,M B Q F# Q G,C D- S. B+ D D#+ Q E+,B (R,C#,D-) Q F# Q G Q B+ Q A+ Q F# Q G Q E Y Q A+,C (R,C,D-) Q F Q (F#,D!,B!,G-) C E,C. (C,A,F#-) C. D C D- Y S D+,B R,C R,B G- S F#+ S G+ S A++ Q B++,C D Q D+ Q C+,C E Q B++ Q A++,C F# Q C+ S B+,B R,C G,B G- S D+ S E+ S F#+ Q G+,C B Q B+ Q A+,C C Q G+ Q C+,C D Q F#+ Y S. (R,G-),B (R,R) D (F#+,F#) C. (G+,G) Q (E+,E) Q (A#+,A#) C (B+,B) C. (D+,B!+,F#),C C C D- MTQ (D+,A+,F) C B C G-- Y S G,B R,C R,B C- S B+ S C+ S D+ Q E!+,C G- Q G Q F,C A Q E!+ Q D+,C B Q F S E!,B R,C C,M C- S G S A+ S B+ Q C+,C E!- Q E! Q D!,C F-,M A!- Q C+ Q B!+,C G- Q D! Y S. (C,A!),B (R,R) D (G+,G) C. (A!++,A!+) Q (F+,F) Q (B+,B) C (C+,C) C. (E!+,B+,G),C D! C E!- MTQ (E!+,B!+,G!) C C C A!- Y Q R,B (R,F),C A C E!+ C G- Q E!+ S R,C A S F+ S E!+ S D+ Q E!+,C F- Q C++ Y Q E!+,B R,C R,M B! C C+ C F C D+ M A!+,Q R Q (E+,C) Q (F+,D) Q (G+,E) Y Q A!++,B R,C (F,R) C A!+ C C,Q F- Q (A!+,E!-) S R,M B!,C D- S B!+ S A!+ S G Q A!+,C B!- Q F+ Y Q A!+,B R,C R,M E!- C F C B! C G M E!,Q R Q (A!+,F-) Q (B!+,G-) Q (C+,A!) Y C. (D!+,B!+,F),Q B! Q A! Q B! Q (D!+,B!+,F,F-) Q (R,R,R,G-) Q (D!+,B!+,E!,F-) Q (R,R,R,G-) Q (D!+,B!+,E!,E!-) Y C. (C+,A!+,E!),Q A! Q G- Q A! Q (C+,A!,E!,E!-) Q (R,R,R,F-) Q (C+,A!+,D,E!-) Q (R,R,R,F-) Q (C+,A!+,F,D-) Y C. (B!+,G,D),Q G- Q F- Q G- Q (B!+,G,D,D-) Q (R,R,R,E-) Q (B!+,G,C,D-) Q (R,R,R,E-) Q (B!+,G,E,C-) Y C. (A!+,F,C),Q F- Q E!- Q F- Q (A!+,F,C,C-) Q (R,R,R,D-) Q (A!+,F,B!,C-) Q (R,R,R,D-) Q (A!+,F,B!,B!-) Y Q G,B R,C B!,M. E!- Q F Q G,C D Q F+ Q E!+,M C Q F Q G,C E!- Q E!+ Q A+,B R,C C,M F- Q G Q A+,C C Q E!+ Q D+,C R,M B Q A+ Q B+,C G- Q D+ Y Q C+,B R,C E!,M A! Q B!+ Q C+,C G Q B!++ Q A!++,C R,M F Q B!+ Q C+,C A Q A!++ Q D+,B R,C R,M B! Q C+ Q D+,C F Q A!++ Q G+,C R,M E Q D+ Q E+,C C Q G+ Y Q A+,B R,C C#,M. F- Q G Q A+,C E Q G+ Q F+,M D Q G Q A+,C F- Q F+ Y Q B+,B R,C D,M. G- Q A+ Q B+,C D Q F+ Q E+,C E Q B+ Q C+,C G- Q E+ Y D G#+,B (R,F#,G-) S. A++ Q B+ Q C+ Q E+ Q D+ Q B+ Q C+ Q A+ Y Q D+,C (R,F,G-) Q B!+ Q (B+,G!,E!,C) C A+,C. (F,D,B) C. G C G- Y B (R,R,R),S. C- D B C. C Q A Q D#- C E- Y S G,B R,C. G-,C R S B+ S C+ S D+ Q E+,C G-- Q (G,G-) Q F,M G-,C A- Q E+ Q D+,C B- Q F S. E,B (R,R),C C- D B+ C. C+ M. R Q A+ Q D# C E Y C. (G,E,C),S G-- S B- S C- S D- Q E- Q (G,E,C,G--) C. D,Q F-- Q E- Q D- Q (G,D,B,F--) Y C (G,G-,C-,E--) Q F,C (C,C-,A-) Q E C (F,C,D-,A-) C F,Q B,C D-,Q G-- Q A,Q F-- Y C (F,B,D-,G--) Q E,C (B,G-,G--) Q D C (E,C,G-,C-) Q A+,C (A,F-,F--) Q D Y D E,C C,C F-,M. G-- D D D E D D D E D D D E D D D E,Q B,C E- D D D E D D D E,Q A D D D E D D D E,M B,M F- D D D E D D D E D D D E D D D E,C G-- D D D E D D D E D D D E D D C (C,R,E-,C-) Q (G+,E!+,B+,A!) M. (G+,D+,A+,G-) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 | C=150 V=3 Q G,B (R,R) C C+ Q G C. C+ Q G Q C+,B (R,R) Q C+ C B+ C A+ C G Y C C+,B (R,R) C E C F C F# Q. G,B (R,R) S G# Q. A+ S E! Q. D S C C A Y Q C+,B R,C C C G+ C G- Q C+ C. G+,C A C C Q C+ Q G+,B R,C B Q G+ C (F#+,C) C (E+,C#) C (D+,D) Y C G+,B R,C G- C B+,Q G Q F C (C+,E) C (C#+,E!) Q. D+,B R,C D S D#+ Q. E+,C D- S B!+ Q. A+,C C# S G C (E,C) Y S. G,B R,C B D C#+ Q D+ Q. D+,C C- S A!+ Q. G,C B S F Q. D,C B! S C Y S. F,B R,C A D G# Q A+ Q. A+,C G-- S E! Q. D,C F#- S C C (A,F-) Y C (C+,E),Q G- C C C (E+,G) Q G- C (C+,E),C. C C (E+,G) Q G- C (C+,E),Q C Q C C (D+,F,B) C (D#+,F#,A) C (E+,G,G-) Y C C+,Q. E,C C S C M C+,Q. B!+,C E- S C Q. A+,C F- S C M C+,Q. G#,C F#- S C C G,Q. G- S G#- C (C+,F#),Q. A S E!- C C+,M F,Q. D- S C- C (D+,A-) Y C G,M E,Q C- Q D- C. C+,Q E- Q C- M D,Q F#- Q (C+,E-) C R,Q F#- Q D- Y Q C+,M D,C G- Q A+ Q B+,C. G-- Q D+ M F,Q R Q (C,A-) Q (D,B-) Q (A,C-) C (F,B),Q D- Q C- C. F,C A,Q D- Q A- C G-,Q B- Q F,Q A- C (F,D),Q B- Q G-- Y Q F,B G-,C C- Q D Q E,C. C-- Q G MTQ B! Q C- Q D- Q E- B R,C F- Q A Q B,C D- Q C Q D,C E- Q B Q C,C F#- Q A Y Q B,C G-,B R Q C Q D,C E- Q B Q E,C F#- Q C Q D,C G#- Q B Y Q C,B R,C A Q D Q E,C F- Q C Q F,C G- Q D Q E,C A Q C Q D,B R,C B Q E Q F,C G- Q D Q G,C A Q E Q F,C B Q D Y Q G+,C (E,C) C C++ C (F,D) Q G+ C. C++,C (G,E) C (F,D) Q G+ Y Q C++,C (E,C) Q C++ C (B++,F,D) C (A++,F#,D#) C (G+,G,E) Y C (C++,E+),Q. C S C C (E+,C+),Q. B!+ S C C (F+,D+),Q. A+ S C C (F#+,D#+),Q. A! S C Y Q. (G+,E+),C G S (G#+,G#+) Q. (A++,C+),C G- S (E!+,E!+) Q. D+,C (F#,A) S C+ C (A+,F,B) Y S. C+,C (E,C) D D#+ Q E+ Q. (E-,E-) S (C+,E) Q. B+,C E! S A+ C (F#,D) Y C (A+,C),Q A- C D- M. (R,R) Q A- C. D- Q A- M R,Q (E-,D-) C A,Q D- C C- Q C- C. A,C B- C A- Q E- Y Q (B,A),M E-- C E,Q A C G- Q B C. E,C F#-,Q R Q F#-- C E-,Q G-- Q (B,A-) Y Q (E,F#-),M. B- Q E,C B C D Q F#- Q C#,C. B Q D Q E,C A- Q (F#,F#-) Y M F#,Q B,M. G-- Q B C A M B+,C G- C F#-,Q A- Q B- Y Q B+,C (E-,C-) Q G Q (A+,F#-),C B- Q (B+,G-) Q (C+,A),C A- Q (A+,F#-) Q (B+,G-),C D- Q (C+,A) Y Q D+,M (B,G-) C G+ Q D+ C. G+,Q (D,D) C (G,G) Q (D+,D,D) Y Q (G+,D+,B+) Q (G+,D+,B+) C (F#+,C+,A+) C (E+,B+,G) Q (D+,A+,F#) C (E+,B+,G) Y Q (E+,B+,G) C (D+,A+,F#) C (C+,G,E) Q (B+,F#,D) C (C+,G,E) Y Q (C+,G,E) C (B+,F#,D) C (A+,E,C) C. G,C (D,B) C (E,C-) Q F# Q E,C (D,B-) Q F# Q G,C (E,C-) C C+ C (C,A-) Q A+ Y D G,C A,M. D- D F# D G D F# D G D F# D G D F# D G,C B D F# D G D F# D G D F# D G D F# D G,M C D F# D G D F# D G D F# D G D F# C (G,D-) C (G,B),Q. G- S G-- M (R,R),Q. F- S G-- Q. E- S G-- Q. E!- S G-- Y Q. D+,B R,M D- S D Q. C+ S D Q. B+,M. G- S D Q. B!+ S D Q. (A++,A+) S (A+,A+) Q. G+,C A,Q F- Q E- S A+ Q. F#+,C. D,M D- S A+ Q. F+ Q A S A+ Y Q (E+,D),M. A C A++,Q D C C Q E+ C. A++,C B C (A,R) Q E+ Q (A++,E),B R Q A++,C A+ C G+ Q E C F+,C. A+ C E+ Q E Y Q (F+,A+,A) Q (F+,A+),C D C (E+,G) Q A C (D+,F),C. D C (C+,E) Q A B B!+,Q (F,D) Q (F,D) C (E,C) C (D,B!) C (C,A) Y C R,M D,C G- C. B!+,C F- M C,C E- Q B!+ C (R,C-) Y Q B!+,M (C,F-) Q G Q A+ Q C+ M E!,M R,Q R Q F- Q G- Q A Q E!,B R,C B! Q D Q E,C G- Q F Q G,C A Q E Q F,C B Q D Y Q E,B R,C C Q F Q G,C A Q E Q A+,C B Q F Q G,C C# Q E Q F#,B D,C D- Q A+ Q B+,C E- Q C+ Q D+,C F# Q B+ Q C+,C D- Q A+ Y Q (B+,G-),C G- Q (C+,A) Q (D+,B,F-) Q (E+,C,E-) Q (F+,D),C D- Q (D+,B) Q (E+,C),C G- Q (F+,D) Y Q G+,C (E,C) C C++ C (R,R) Q G+ C. C++,Q G-,M R C C Q (G+,G-) Y Q (C++,G,E) Q (C++,G,E) C (B++,F,D) C (A++,E,C) Q (G+,D,B) C (A++,E,C) Y Q (A++,E,C) C (G+,D,B) C (F+,C,A) Q (E+,B+,G-) C (F+,C+,A) Y Q (F+,C+,A) C (E+,B+,G-) C (D+,A+,F-) C. C+,C (G,E-) Q A+,C F- Q (B+,B+) C=140 Q (A+,G),C E- Q (B+,B+) C=130 Q C+,C (A+,F-) C F+ C (F,D-) Q D+ Y C=120 D C+,C D-,M. G-- D B+ D C+ D B+ D C+ D B+ D C+ D B+ D C+,C E- D B+ D C+ D B+ D C+ D B+ D C+ D B+ D C+,M F- D B+ D C+ D B+ D C+ D B+ D C+ D B+ C (C+,G--) B (C+,E,C-) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | C=116 !=B V=2 C A,M D- Q F+ Q E+ Q D+,C E- Q C#+ Y C D+,M F- C A+ C (B+,G-) Y Q C#,M A- Q E Q G Q B+ Q A+,C A-- Q G Y C (F,D-) Q E,C A-- Q F C (D,D--) Y C (F,D-) Q B+,C C- Q A+ Q D+,C B-- Q C+ Y C F+,M A-- Q E+ Q D+ Q C+,C E- Q B+ Y Q A+,C F- S B+ S C+ C (F,A--) C (E,C-) Y C F--,M. F Q F- Q E- Q D- Q C#- Y C A+,M D- Q F+ Q E+ Q D+,C E- Q C#+ Y C D+,M F- C A+ C (B+,G-) Y Q C#,M A- Q E Q G Q B+ Q A+,C A-- Q G Y C (F,D-) Q E,C A-- Q F C (D,D--) Y C (F,D-) Q B+,C C- Q A+ Q D+,C B-- Q C+ Y C F+,M A-- Q E+ Q D+ Q C+,C E- Q B+ Y Q A+,C F- S B+ S C+ C (F,A--) C (E,C-) Y C F-,M. F C C- C F-- Y C (A++,F-) Q F,C A Q A++ Q G+,C B Q F+ Y S E+,C. C S F+ Q G+ Q C+ Q G-,C. C+ Q E- Q C- Y C (F+,D-) Q D,C C- Q F+ Q E+,C B- Q D+ Y S C#+,Q A- S D+ Q E+,Q B- Q C#-,M A+ Q D- Q E- Q F- Y Q A+,C G- Q B+ Q C#+,C E- Q D+ Q E+,C C#- Q F+ Y Q G+,C A- Q E+ Q C#+, C A Q B!++ Q A++,C C# Q G+ Y S F+, C D S E+ Q D+ C (E+,G-) C (C#+,A) Y C D-,M. D+ Q D-- Q A- Q D- Q E- Y C (A++,F-) Q F,C A Q A++ Q G+,C B Q F+ Y S E+,C. C S F+ Q G+ Q C+ Q G-,C. C+ Q E- Q C- Y C (F+,D-) Q D,C C- Q F+ Q E+,C B- Q D+ Y S C#+,Q A- S D+ Q E+,Q B- Q C#-,M A+ Q D- Q E- Q F- Y Q A+,C G- Q B+ Q C#+,C E- Q D+ Q E+,C C#- Q F+ Y Q G+,C A- Q E+ Q C#+, C A Q B!++ Q A++,C C# Q G+ Y S F+, C D S E+ Q D+ C (E+,G-) C (C#+,A) Y C D-,M. D+ C A- C D-- Y $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 | C=120 !=B V=4 T=97;V CAN'T PLAY IT AT NORMAL PITCH B (C++,C+), C G+, Q F-- Q C- C F+, Q A Q C C G+, Q D Q C C F+, Q A Q C- Y B (C++,C+), C G+, Q E!-- Q B- C F+, Q G- Q B C G+, Q C Q B C F+, Q G- Q B- Y B (G+,G), C D+, Q F-- Q C- C C+, Q A Q C C D+, Q D Q C C C+, Q A Q C- Y M. (G+,G), C D+, Q F-- Q C- C C+, Q A Q C C D+, Q D Q C C (C+,R), Q A Q C- Y B (F+,R,R), Q F-- Q C- Q A Q C Q D Q C Q A Q C- Y B (R,R), M F+, Q F-- Q D- Q G- Q B" C E+, Q D Q B" Q (F+,G-) Q (G+,D-) Y B (R,R), M. A++, Q F-- Q D!- Q G- Q B Q D! Q B C F+, Q G- Q D!- Y B (R,R), M G+, Q F-- Q D- Q G- Q B Q (E+,C) Q (D+,B) C C+, Q G- Q C- Y B A++, Q F--, C R, M R Q C- Q C, C A Q D Q F, M (D#,C#) Q A+ Q C#+ Q F+ Y M (A++,D+,A+), Q B- Q F- Q A Q B C G+, Q (F+,B-,E!--) C (F,D!,G-) Q A++ Q (B++,F,D!,G-) Y C. (C++,F+,C), Q C- Q A Q F Q (F+,A,R,R) M (A+,C#+), C F+, Q B"- Q A C F+, Q F Q A Y B (D++,B++), Q B-, C R Q F- Q (D+,B) Q (F+,D) M E!, Q F#+ Q A++ Q F#+ Q E!+ Y C (D++,B++,D+), Q G-- Q D- Q (D++,B++,B,R) Q (D+,D,R,R) Q (C++,A++,C-,R) Q (C+,E,B,R) Q (A++,E+,R,R) Q (G+,E+,B,C#-) Y M (F+,A,D-), C E+ C D+ M (A+,G-), C (D+,C) C (F+,B") Y B (G+,D+), C (D,B) M (G--,C--) C (D,B) Y M. (C+,G), C (B,E-) M (G--,C--) C (C,B,E-,R) Y B (F,F--), Q (R,R) C. C, C C- Q C- M C, Q C- C C- Q C- Y B F--, M F, Q (R,R) C. B", C D- Q D- M B", C E, Q D- C D- Q F Q (G,D-) Y M. A+, B F--, Q (R,R) C. B, C D!- Q D!- C B, Q D!- C D!- C F Q D!- Y M (G,F--), Q (R,R) C. B, C D- Q D- M F--, C E, Q (R,R) C (B,E-) Q D Q (B,C,E-) Y M (A+,F--), Q (R,R) C (E,E-) Q (F,D-) M (A+,F--), Q (R,R) C (D,E!-) Q (D!,E!-) Y M (A+,B-), Q (R,R) C (D,F-) Q (D,F-) M B-, C G, Q (R,R) C (F,G-) Q A+ Q (B+,F,G-) Y C. C+, M A-, Q (R,R) C (C,F-) Q (F,C,F-) C (F,B"-), Q (R,R) C (E!,A) C (F,B"-) Q (E!,A) Y M (D+,B-), Q(R,R) C (A+,D) Q (G,D) M (D+,A-), Q (R,R) C (G,C) Q (F#,C) Y C. D+, M G--, Q (R,R) C (A+,B) Q (D+,G,B) C C+, M A-, Q (R,R) C (F,G#) Q A+ Q (G,E,C#) Y M F, C E, Q (D--,R) Q (A-,R) C (D,F-,R) M (B",F-,G--), C D C F Y M (G,D,F-,C-) M (G,C,E-), C R C C-- Y M F, Q (F--,R,R) Q (C-,R,R) Q (A,R,R) Q (C,R,R) C (C+,F,R,R) C (E+,C#+,G#,D) Y B A++, Q (A-,R,R) Q (E+,E-,R) Q (E++,C#++), C C# Q (D++,B"++) Q (C#++,A++,F#--) Q (C#+,C#-,R) C A, Q (C#++,A++) Q (B"++,G#+) Y B R, Q (A++,F#+,B"-) Q (A+,G#-,R) C D, Q (F#+,R) Q (A++,R) Q (G#+,E+,E-) Q (G#,B",R) Q (A++,A+,F#) Q (B"++,B"+,F) Y M. (C#++,A++,C#+), Q E Q E- Q E Q D Q C# Q E- C (A++,A,R), Q C# Q E Y M (B"++,F#+,D+), Q D Q E- Q D Q C# C (G#+,G#,R), Q B" Q E- C (R,R), Q (F#+,C#) Q (E+,D) Y B (E+,A,E), Q C# Q B" Q A Q D#- Q F#- Q E- Q C#- Q A- Y C. (E+,C+,A+), Q D-- Q A- C F- Q (F+,F,R) C (G+,E+,B"+), Q G-- Q F- C (B",R), Q (A++,A+) Q (B"++,B"+) Y B (C++,C+), Q (C-,R) Q (G+,G-) Q G++, C E Q F++ Q (E++,A-) Q (E+,E-) Q E++, C C Q D++ Y Q (C++,A++,D-), C R Q (C+,A,R) Q (F+,R), C (F,R) Q (C++,A++) Q (B"++,G+,G-), M R Q (B"+,D,R) Q (C++,C+,A+) Q (D++,D+,A+) Y M. (E++,C++,E+), Q G Q G- Q G Q F Q E Q G- C (C++,C+,R), Q E Q G Y M (D++,A++,F+), Q F Q G- Q F Q E C (B"++,G+,F+), Q D Q G- Q (A++,A,E), C R Q (G+,G,F) Y M (C++,F+,B), C A+ Q G Q F C (C++,E+,G,B) Q F#, C R Q G Y Q (B+,F,D,G-) Q (F+,B+,G,D) Q (D+,G,F,B) Q (B+,F,D,G-) C (G,D,B,F-) Q (G,C,B,E-) Q (C+,R,R,R) Y B (F+,R,R), Q F-- Q C- Q A Q C Q D Q C Q A Q C- Y B (R,R), M F+, Q F-- Q D- Q G- Q B" C E+, Q D Q B" Q (F+,G-) Q (G+,D-) Y B (R,R), M. A++, Q F-- Q D!- Q G- Q B Q D! Q B C F+, Q G- Q D!- Y B (R,R), M G+, Q F-- Q D- Q G- Q B Q (E+,C) Q (D+,B) C C+, Q G- Q C- Y B A++, Q F--, C R, M R Q C- Q C, C A Q D Q F, M (D#,C#) Q A+ Q C#+ Q F+ Y M (A++,D+,A+), Q B- Q F- Q A Q B C G+, Q (F+,B-,E!--) C (F,D!,G-) Q A++ Q (B++,F,D!,G-) Y C. (C++,F+,C), Q C- Q A Q F Q (F+,A,R,R) M (A+,C#+), C F+, Q B"- Q A C F+, Q F Q A Y B (D++,B++), Q B-, C R Q F- Q (D+,B) Q (F+,D) M E!, Q F#+ Q A++ Q F#+ Q E!+ Y C (D++,B++,D+), Q G-- Q D- Q (D++,B++,B,R) Q (D+,D,R,R) Q (C++,A++,C-,R) Q (C+,E,B,R) Q (A++,E+,R,R) Q (G+,E+,B,C#-) Y M (F+,A,D-), C E+ C D+ M (A+,G-), C (D+,C) C (F+,B") Y M (G+,D+,B), C R M G-- M (G+,D!+,B) C G-- Y B (F+,F), C C+, Q F- Q C- C D+, Q A Q C C C+, Q D Q C C D+, Q A Q C- Y B (C++,C+), C G+, Q E!-- Q B- C F+, Q G- Q B C G+, Q C Q B C F+, Q G- Q B- Y B (C++,G+,C+), Q F-- Q C- Q A Q C Q D Q C Q G Q F Y Q (C++,G+,C+,A) Q (R,R,R,R) C (E,C,A,F--) M (E,C,A,F--) Y |
> > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /CCL OVERLAY TO DEFINE PLAY COMMAND FIELD 1 *3120 XPLA, 4001; EXTPLA; 0;0;0;0; YMUSIC *3220 XPLA *3340 EXTPLA, 1525; 0 0; 0 FIELD 0 *553 /PLAY 2014 4171 0000 *7016 YMUSIC, FILENAME MUSIC.SV $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | # MUSIC: PDP-8 Music Playing Program A program that inputs musical scores and outputs sound using a PDP-8 either by radio frequency interference, or a special IOT instruction that would be implemented in hardware. A collection of scores is included. Originally distributed as DECUS 8-804. Upstream source: [Vince Slyngstad's DECUS archive 8-804][8-804]. There is another set of sources on the [dbit ftp site][dbit]. The score files are also available in an RK05 image at [Dave Gesswein's Archive: diag-games-kermit.rk05][gesswein]. I'm not quite sure which source I used. This set of sources includes a patch to CCL `PLAYOV`, (that may not work for some versions of CCL) to add a `PLAY` command. SIMH does not have support to get useful sound from this program. However [Randy Dawson in 2017][dawson] came up with a hack that enabled SIMH to output something that was post-processed into audible sound. A detailed instruction manual can be found in the file decus-8-884.pdf. ## Original DECUS Writeup: 8-804 MUSIC: PDP-8 Music Playing Program **Author:** Richard Wilson and others Digital Equipment Corporation, Maynard, MA **Operating System:** Paper Tape or OS/8 **Source Language:** PAL-8 **Memory Required:** 4K **Abstract:** MUSIC is a program which will play music in four part harmony on any PDP-8 family core memory computer, except the 8/S or PDP-12. The music to be played is input to the program as a standard OS/8 ASCII file. The music may be picked up by the use of an AM radio, or by a simple interface. The OS/8 distribution media include the source of the player, which can be customized for various configurations, along with approximately 45 minutes of music, such as Joplin, Bach, Beetho- ven, movie tunes, etc. The binary paper tape is intended for any 1.5 microsecond PDP-8, and runs in 4K, but will only play short tunes. Several short tunes are available on paper tape. **Media Price Code:** A2, F5, H32, K54 **Format:** OS/8 **Catalog:** August 1978 [8-804]: http://svn.so-much-stuff.com/svn/trunk/pdp8/src/decus/8-804 [gesswein]: ftp://ftp.pdp8online.com/images/os8/diag-games-kermit.rk05 [dbit]: ftp://ftp.dbit.com/pub/pdp8/nickel/music/music1/os8/ [dawson]: http://www.classiccmp.org/pipermail/cctech/2017-April/027526.html |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | C=100 !=B,E,A,D,G V=4 C (A+,F,D,D-) Y C. (A+,F,D,D-) Q (F,D,A,D-) C (F,D,A,D-) C (A+,F,D,A-) Y C. (A+,E,C,E-) Q (E,C,A,E-) C (E,C,A,E-) C (F,C,A,A-) Y C (G,E,C,E-) C (A+,E,C,E-) C (B+,G,E,A-) C (C+,G,E,A-) Y M. A+,M F,C (D,D-) C (B",D") C (G,C,E-) Y D (R,R,R,R) C (A+,E,C,A-) Y C. (A+,F,D,D-) Q (F,D,A,D-) C (F,D,A,D-) C (A+,F,D,B-) Y C. (A+,E,C,E-) Q (E,R,C,E-) C (E,R,C,E-) C (E+,A+,C,E-) Y C (D"+,A+,C,E-) C (E+,A+,C,E-) C (F+,G",D,E-) C (B+,G",D,B) Y M. E+,C (A+,C,A) C (G",D,B) C (G,E,C) Y D (R,R,R,R) C (A+,R,A,R) Y C. (F+,A+,D,A) Q (F+,A+,D,F-) C (E+,A+,D,F-) C (D+,F,D,A) Y C. (D+,G,E,A) Q (C+,A+,E,E-) C (C+,A+,E,E-) C (D+,A+,D,F-) Y C (E+,A+,C,G-) C (C+,A+,C,A) C (B+,G,D,B) C (A+,G,E,C) Y M. D+,M F,C D,C R M D-,C A C G,C B Y D (R,R,R,R) C (D+,A+,C!,D-) Y C. (D+,G,B,G-) Q (B+,G,B,G-) C (B+,G,B,G-) C (D+,G,B,E-) Y C. (D+,F,A,R) Q (A+,F,D,A) C (A+,F,D,A) C (A+,R,A-,R) Y C (B+,R,B,R) C (D+,R,D,R) C (A+,R,A,R) C (E+,G,C,A-) Y M. (D+,F,D,D-) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | C=100 T=106 ! = B, E D (B-,D,F,B+) S. R D (F,B+) S. R D (B--,F,C+) S. R D (F,D+) S. R D (B-,D,F,B+) S. R D (F,D+) S. R C (F-,E),D (A,C+) S. R D F S. R D (B-,D,F,B+) S. R D (F,B+) S. R D (B--,F,C+) S. R D (F,D+) S. R C (B-,D,F,B+) D (F-,C,F,A+) S. R D F S. R D (B-,D,F,B+) S. R D (F,B+) S. R D (B--,F,C+) S. R D (F,D+) S. R D (E-,B-,G,E+) S. R D (G,D+) S. R D (E--,G,C+) S. R D (G,B+) S. R D (F-,C,E,A+) S. R D (E,F) S. R D (F--,E,G) S. R D (E,A+) S. R C (B--,F-,D,B+) C (B--,F-,D,B+) C (E-,B-,E), Q. G S A+ C (E--,E), Q G Q F M (B-,E), Q (E-,G) Q (F-,A+) C B+, Q G- Q A- C (B-,D), Q. F S G C (A--,F-,C), Q F Q E M B--, C (F-,D) C (B-,D,F) Q. G, C (B-,E,E--) S A+ Q (E--,B-,E,G) Q F Q (E--,B-,E,G) Q A+ Q (E--,B-,G,B+) Q G Q (F--,B-,D,F) Q B+ Q (F--,C,E,A+) Q C+ C (B--,F-,D,B+) C (B--,F-,D,B+) $ |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 | /1.1 OS8 BINARY MAP (BITMAP) V4 / / / / / / / / / /COPYRIGHT (C) 1972,1973,1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /NO CHANGES MADE FOR OS/8 V3C VERSION= 4 SUBVER= 01 /LOCATED AT "VERLOC" AS 60+VERSION^100+SUBVER XR= 10 LOADXR= 11 XFIELD= 20 /HOLDS FIELD WE ARE "STORING" INTO ORIGIN= 21 /HOLDS CURRENT ORIGIN OUT= 22 B1= 23 B3= 24 C1= 25 COLCTR= 27 WD= 30 WD1= 31 WD2= 32 FILPTR= 33 FLDNO= 35 /OS/8 EQUIVALENCES MPARAM= 7643 JSBITS= 7746 MIFILE= 7617 PTP= 20 DCB= 7760 /BUFFER AND DEVICE HANDLER ASSIGNMENTS OUCTL= 4200 OUBUF= 6000 OUDEVH= 6400 FIELD 1 *2000 BITMAP, JMP CALLCD JMP NOCD /CHAINED ENTRY POINT NEXTCD, TAD I (MPARAM-1 SPA CLA JMP I (BUILD /ALTMODE TERMINATES INPUT, STARTS OUTPUT CALLCD, JMS I (200 5 /COMMAND DECODE 0216 /DEFAULT EXTENSION IS .BN NOCD, TAD (LDRPCH DCA OUT ISZ ONCE JMP CDCOOL CLA CLL CMA RTL CDF 0 AND I (JSBITS /REMOVE "DON'T CARE ABOUT CD AREA" BIT DCA I (JSBITS CDF 10 JMS I (CTINIT CDCOOL, TAD I (MPARAM+1 AND (100 SZA CLA /IS /R SWITCH ON? JMS I (CTINIT /YES - RE-INITIALIZE LOADER TABLES LD7400, 7400 TAD (MIFILE DCA FILPTR JMP I (NEWFIL ONCE, -1 /SUBROUTINE TO "LOAD" A WORD. /INCREMENTS TWO-BIT QUANTITY CORRESPONDING TO THE WORD. /FIELD 0 IS MAPPED INTO WORDS 00000-01377,FIELD 1 INTO 01400-02777 /FIELDS 4-7 ARE MAPPED INTO 20000-25777 LOADWD, 0 /ENTER WITH LOW 4 BITS OF ORIGIN IN AC CLL RAL TAD (BITTBL-1 DCA LOADXR TAD I LOADXR /GET WORD IN THE 3-WORD SET DCA LDOFST /(WHICH MAPS 16 WORDS) TAD I LOADXR /GET THE LOW ORDER BIT OF THE PAIR DCA LDBIT /WHICH MAPS THIS WORD TAD ORIGIN /NOW FIND OUT WHICH TRIPLEWORD TO USE RTL RTL AND (7407 TAD XFIELD RTL RTL CDF 0 RTL RAL SZL CDF20Y, CDF 20 /NOP'ED IF NO FIELD 2 IN MACHINE CLL RTR /FIELDS 4-7 MAPPED IN FIELD 2 DCA LTEMP TAD LTEMP CLL RAL TAD LTEMP TAD LDOFST DCA LTEMP TAD LDBIT CLL RAL TAD LDBIT AND I LTEMP SNA CLA /IF COUNT IS AT 3 (MAX), JMP I LOADWD /DON'T INCREMENT IT TAD LDBIT CIA TAD I LTEMP DCA I LTEMP RDF CDF 10 SZA CLA DCA I (F4FLAG /SEARCH FIELD 2 IF WE STORED THERE JMP I LOADWD LDOFST, 0 LDBIT, 0 LTEMP, 0 /BIT TABLE FOR MAPPING BITTBL, 0;2000;0;400;0;100;0;20;0;4;0;1 1;2000;1;400;1;100;1;20;1;4;1;1 2;2000;2;400;2;100;2;20;2;4;2;1 PAGE NEWFIL, TAD (7001 DCA HANDLR TAD I FILPTR AND (7760 SZA /LENGTH OF 256 BLOCKS IMPLIES AT LEAST 256 TAD (17 CLL CML RTR RTR DCA RCDCNT TAD I FILPTR ISZ FILPTR SNA JMP I (NEXTCD /FILE POINTER = 0 MEANS NO MORE INPUT FILES JMS I (200 1 /ASSIGN HANDLR, 7001 /LOAD INTO 7000 IF NOT ALREADY LOADED JMP I (IOERR TAD I FILPTR DCA RECNO ISZ FILPTR CLA CMA DCA CHCNT DCA REOF TAD I (MPARAM /TEST FOR /I AND (10 SNA CLA JMP I (LOADER /I IS NOT ON JMP I (OERR /NO! GETCH, 0 /GET-NEXT-INPUT-CHARACTER ROUTINE JMS I (CTCTST ISZ JMPGET ISZ CHCNT JMPX, JMP JMPGET TAD REOF SZA CLA JMP I GETCH /EOF REACHED BEFORE LOGICAL END - ERROR CLL TAD RCDCNT TAD (6 SNL DCA RCDCNT SZL ISZ REOF CLL CMA CML RTR RTR RTR TAD (1411 DCA RCTL CIF 0 JMS I HANDLR RCTL, 0 /READ RECORDS INTO FIELD 1 PBUFFR, BUFFER RECNO, 0 JMP RERROR TAD RECNO TAD (6 DCA RECNO TAD (-4401 DCA CHCNT TAD PBUFFR DCA CHPTR TAD JMPX DCA JMPGET JMP GETCH+1 JMPGET, JMP . JMP CHAR1 JMP CHAR2 TAD JMPX DCA JMPGET TAD I CHPTR AND (7400 CLL RTR RTR TAD CHTMP RTR RTR ISZ CHPTR JMP GCHCOM CHAR2, TAD I CHPTR AND (7400 DCA CHTMP ISZ CHPTR CHAR1, TAD I CHPTR GCHCOM, AND (377 ISZ GETCH JMP I GETCH RERROR, SPA CLA JMP I (IOERR /AN ACTUAL READ ERROR - AMAZING! ISZ REOF JMP RECNO+2 REOF, 0 CHCNT, 0 CHPTR, 0 CHTMP, 0 RCDCNT, 0 ZTST, 0 /TEST A BLOCK OF THE BITMAP FOR ALL ONES DCA B3 /LENGTH OF THE BLOCK IN AC TAD LOADXR DCA XR STA JMS I (XCDF AND I XR ISZ B3 JMP .-2 CDF 10 CMA SZA JMP I ZTST TAD XR DCA LOADXR /UPDATE LOADXR IF ALL ZEROES JMP I ZTST PAGE ITSOVR, JMS ASSEMB /GET THE CHECKSUM CIA TAD LCKSUM SZA CLA /IS IT GOOD? JMP I (BADCKS /NO TAD I (MPARAM+1 AND L40 SNA CLA /IF /S IS NOT SET, JMP I (NEWFIL /ONLY ONE PROGRAM PER FILE. LOADER, DCA LCKSUM JMS GETFLD DCA XFIELD TAD (200 DCA ORIGIN /INITIALIZE FOR PROGRAM JMS I (GETCH JMP I (NEWFIL SNA JMP .-3 TAD (-200 /FIND SOME LEADER SZA CLA JMP LOADER+1 LEADER, JMS I (GETCH JMP I (NEWFIL SNA JMP LOADER+1 TAD (-200 /FIND END OF LEADER SNA JMP LEADER NEWWD, SMA /FIELD SETTING? JMP FIELDW /YES TAD (200 DCA WD1 /STORE 1ST CHAR JMS I (GETCH JMP I (BADINP DCA WD2 /2D CHAR JMS I (GETCH JMP I (BADINP TAD (-200 /IF THIS IS LEADER, WE HAVE THE CHECKSUM SNA JMP ITSOVR DCA WD JMS ASSEMB SNL /ORIGIN OR DATA? JMP DATAWD /DATA DCA ORIGIN JMP GETNXT DATAWD, CLA TAD ORIGIN AND (17 JMS I (LOADWD /GO SET THE CORRECT BIT(S) CDF 10 ISZ ORIGIN L40, 40 GETNXT, TAD WD1 TAD WD2 TAD LCKSUM DCA LCKSUM TAD WD JMP NEWWD ASSEMB, 0 TAD WD1 CLL RTL RTL RTL TAD WD2 JMP I ASSEMB FIELDW, TAD (-32 SNA JMP CTLZ TAD (-46 SPA JMP NOTXP DCA WD1 TAD WD1 AND (7 SZA CLA JMP NOTXP TAD WD1 AND (70 DCA XFIELD JMS I (GETCH JMP I (BADINP TAD (-200 SZA JMP NEWWD NOTXP, CLA TAD LCKSUM SNA CLA JMP LOADER JMP I (BADINP LCKSUM, 0 CTLZ, TAD LCKSUM SZA CLA JMP I (BADINP JMP I (NEWFIL GETFLD, 0 /ROUTINE TO CHECK FOR OPTION 0-7 DCA C1 /AND RETURN LOWEST-NUMBERED VALUE TAD I (MPARAM+2 AND (1774 SNA JMP I GETFLD RTL RAL ISZ C1 SNL JMP .-3 CLA CMA TAD C1 CLL RTL RAL JMP I GETFLD PAGE ERPCH, 0 AND (77 /GET LOW ORDER 6 BITS SZA JMP NZCHAR JMS ERR FILMSG, TEXT /, FILE 0/ JMP I (BITMAP NZCHAR, TAD (240 AND (77 TAD (240 JMS I OUT /PRINT JMP I ERPCH /AND RETURN LDRPCH, 0 TLS TSF JMP .-1 CLA JMP I LDRPCH ERR, 0 CLA CDF 10 TAD I (FILPTR /ZERO CHAR GETS REPLACED BY "FILE #" TAD (322 /MAGIC NUMBER CLL CML RAR /AC NOW CONTAINS " #" DCA FILMSG+3 ERRLUP, TAD I ERR SNA JMP EOMESG /MESSAGE MUST BE EVEN NUMBER OF CHARS LONG RTR RTR RTR JMS ERPCH TAD I ERR JMS ERPCH ISZ ERR JMP ERRLUP EOMESG, JMS I (ECRLF JMP I ERR /RETURN IOERR, JMS ERR TEXT %I/O ERROR% JMP I (BITMAP BADINP, JMS ERR TEXT /BAD INPUT/ JMP I (BITMAP BADCKS, JMS ERR TEXT / BAD CHECKSUM/ JMP I (BITMAP NULERR, JMS ERR TEXT /NO INPUT/ JMP I (BITMAP OUTERR, TAD (LDRPCH DCA OUT JMS ERR TEXT /ERROR ON OUTPUT DEVICE/ JMP I (CALLCD OERR, JMS ERR TEXT %NO /I!% JMP I (BITMAP CTINIT, 0 CLA CLL CML RTR DCA C1 DCA B1 DCA 0 /STRAIGHT-8 CROCK CTINLP, CDF 0 CLA CMA DCA I B1 CDF20X, CDF 20 STA DCA I B1 JMP CTFLD2 /*** THIS INSTR SKIPPED IF 8K PDP-8!!! DCA CDF20X /DUE TO BUG IN EXTENDED MEMORY CONTROLLER TAD ERR+1 /A CLA CDF 10 DCA I (CDF20Y CTFLD2, ISZ B1 ISZ C1 JMP CTINLP CDF 10 JMP I CTINIT PAGE /GENERAL OUTPUT ROUTINES /JMS I (OOPEN INITIALIZES THE OUTPUT ROUTINE /ERROR RETURN AC>0 IF NO OUTPUT DEVICE/FILE, AC<0 IF ERROR /JMS I (OCHAR OUTPUTS A CHARACTER /ERROR RETURN OUTPUT ERROR OR TOO MUCH OUTPUT /JMS I (OCLOSE CLOSES THE OUTPUT FILE /ERROR RETURN FILE TOO LARGE TO BE CLOSED OR OUTPUT ERROR /JMS I (OTYPE RETURNS DCB WORD OF OUTPUT DEVICE IN AC /PARAMETERS NEEDED: /OUBUF= ADDRESS OF OUTPUT BUFFER /OUCTL= OUTPUT BUFFER CONTROL WORD (MUST BE NEGATIVE) /OUDEVH= ADDRESS OF PAGE FOR OUTPUT HANDLER /ASSUMES I/O MONITOR IS RESIDENT IN CORE. /CAN BE CALLED FROM ANY FIELD WITH BUFFERS IN ANY FIELD. OUFLD= OUCTL&70 OOPEN, 0 OU7600, 7600 TAD OU7601 DCA OUBLK TAD (OUDEVH+1 DCA OUHNDL CDF 10 TAD I (7604 SNA /IF OUTPUT HAS NO EXTENSION, TAD (1520 /GIVE IT THE EXTENSION .MP DCA I (7604 OUASGN, TAD I OU7600 /GET DEVICE NUMBER WORD OF OUTPUT FILE ENTRY AND (17 /STRIP OFF ANY LENGTH INFO SNA /IS THERE AN OUTPUT DEVICE? JMP USETTY /NO - INHIBIT OUTPUT JMS I (200 1 /ASSIGN, FETCH HANDLER OUHNDL, 0 /OUTPUT DEVICE HANDLER ENTRY HLT /HUH? OUENTR, TAD I OU7600 JMS I (200 3 /ENTER OUTPUT FILE OUBLK, 7601 /REPLACED WITH STARTING BLOCK OUELEN, 0 /REPLACED WITH LENGTH OF HOLE JMP OEFAIL /FAILED - MAYBE WE ASKED TOO MUCH DCA OUCCNT JMS I (OUSETP CDF CIF 10 /RESTORE CALLING FIELDS JMP I OOPEN OEFAIL, TAD I OU7600 AND (7760 /GET REQUESTED LENGTH SNA CLA /WAS IT AN INDEFINITE REQUEST JMP I (OUTERR /YES - CANNOT ENTER THE FILE TAD I OU7600 AND (17 /MAKE THE REQUESTED LENGTH ZERO DCA I OU7600 JMP OUENTR /TRY, TRY AGAIN USETTY, DCA TTYNO JMS I (200 12 5524 TTYNO, 0 0 HLT /NO TELETYPE! TAD TTYNO DCA I OU7600 JMP OUASGN OUTDMP, 0 DCA OUCTLW /STORE THE CONTROL WORD CDF 10 TAD OUCCNT SNA ISZ OUCTLW TAD OUBLK DCA OUREC /COMPUTE THE STARTING BLOCK NUMBER OF THIS TRANSFER TAD OUCTLW CLL RTL RTL RTL AND (17 /COMPUTE THE NUMBER OF RECORDS TAD OUCCNT /UPDATE THE NUMBER OF BLOCKS IN THE FILE DCA OUCCNT TAD OUCCNT CLL CML TAD OUELEN SNL SZA CLA /DOES THE LENGTH EXCEED THE GIVEN LENGTH? JMP I (OUTERR /YES - SIGNAL OUTPUT ERROR CIF 0 JMS I OUHNDL OUCTLW, 0 OUBUF OUREC, 0 JMP I (OUTERR JMP I OUTDMP OCLOSE, 0 CDF 10 JMS I (OTYPE AND (770 TAD (-PTP /CHECK FOR PAPER TAPE PUNCH OUTPUT SZA CLA /AND SKIP ^Z OUTPUT IF TRUE TAD (232 /OUTPUT A ^Z JMS I (OCHAR JMS I (OCHAR FILLLP, JMS I (OCHAR JMS I (OTYPE /GET TYPE OF OUTPUT DEVICE SPA CLA TAD (100 /IF ITS A DIRECTORY DEVICE FORCE A RECORD TAD (77 /BOUNDARY - OTHERWISE A HALF-RECORD AND I (OUDWCT SZA CLA /UP TO THE BOUNDARY YET? JMP FILLLP /NO - FILL WITH ZEROS TAD I (OUDWCT /GET DOUBLEWORD COUNT LEFT TAD (OUCTL&3700 SNA /A FULL WRITE LEFT? JMP NODUMP /YES - DON'T DO IT - THE ^Z IS ALREADY OUT TAD (4000+OUFLD /PUT IN THE FIELD BITS AND THE WRITE BIT JMS OUTDMP NODUMP, TAD I OU7600 /GET THE DEVICE NUMBER JMS I (200 4 /CLOSE THE OUTPUT FILE OU7601, 7601 /POINTER TO THE OUTPUT FILE NAME OUCCNT, 0 JMP I (OUTERR CDF CIF 10 /RESTORE CALLING FIELDS JMP I OCLOSE PAGE OUCTMP= OUCTL&3700 OUSETP, 0 /ROUTINE TO INITIALIZE CHARACTER POINTERS TAD (-OUCTMP /GET SIZE OF BUFFER IN DOUBLEWORDS DCA OUDWCT TAD (OUBUF DCA OUPTR /INITIALIZE WORD POINTER TAD OUJMPE DCA OUJMP /INITIALIZE THREE-WAY CHARACTER SWITCH JMP I OUSETP OCHAR, 0 AND (377 DCA OUTEMP RDF TAD CDIF0 DCA OUCRET CDF OUFLD /SET DATA FIELD TO BUFFER'S FIELD ISZ OUJMP /BUMP THE CHARACTER SWITCH OUJMP, HLT /THREE WAY CHARACTER SWITCH JMP OCHAR1 JMP OCHAR2 OCHAR3, TAD OUTEMP CLL RTL RTL AND (7400 TAD I OUPOLD DCA I OUPOLD /UPDATE FIRST WORD OF TWO WITH HIGH TAD OUTEMP /ORDER 4 BITS OF THIRD CHAR CLL RTR RTR RAR AND (7400 TAD I OUPTR DCA I OUPTR /UPDATE SECOND WORD FROM LOW ORDER 4 BITS TAD OUJMPE DCA OUJMP /RESET SWITCH ISZ OUPTR ISZ OUDWCT /BUMP DOUBLEWORD COUNTER EVERY 3 CHARS JMP OUCRET TAD (OUCTL /LOAD CONTROL WORD FOR A FULL WRITE JMS I (OUTDMP /DUMP THE BUFFER JMS OUSETP /RE-INITIALIZE THE POINTERS JMP OUCRET OCHAR2, TAD OUPTR DCA OUPOLD /SAVE POINTER TO FIRST WORD OF TWO ISZ OUPTR /BUMP WORD POINTER TO SECOND WORD OCHAR1, TAD OUTEMP DCA I OUPTR OUCRET, HLT /RESTORE CALLING FIELDS JMP I OCHAR OUTEMP, 0 OUPOLD, 0 OUPTR, 0 OUJMPE, JMP OUJMP OUDWCT, 0 OTYPE, 0 RDF TAD CDIF0 DCA OTRTN CDF 10 TAD I (7600 AND (17 TAD (DCB-1 DCA OUTEMP TAD I OUTEMP OTRTN, HLT JMP I OTYPE DOBITS, 0 DCA B3 JMS I (XCDF TAD I LOADXR CDF 10 DCA B1 BITLP, TAD B1 CLL RTL DCA B1 TAD B1 CMA CML RAL AND (3 TAD (260 JMS I OUT ISZ COLCTR TAD COLCTR AND (7 SZA CLA JMP BITISZ TAD I (TTOFLG SNA CLA /IF OUTPUT IS NOT TO TTY, TAD (240 /PUT A SPACE AFTER EVERY GROUP OF 8 SZA JMS I OUT BITISZ, ISZ B3 JMP BITLP JMP I DOBITS CTCTST, 0 TAD (200 KRS TAD (-203 SNA CLA /IS THE TELETYPE BUFFER A ^C KSF /WITH THE TELETYPE FLAG ON? JMP I CTCTST /NO CDIF0, CDF CIF 0 /YES - GO TO MONITOR JMP I (7605 /THROUGH THE "DON'T SAVE CORE" RETURN PAGE BUILD, STA DCA SOMTHN TAD (-10 DCA FLDNO TAD MAPSKP DCA F4SKP /INITIALIZE ONCE-ONLY SKIP FLDLP, TAD FLDNO AND (4 CLL RTL TAD (CDF DCA CDFX /STORE A CDF 0 OR CDF 20 TAD FLDNO RTR SZL SPA CLA /IF FLDNO IS 0 OR 4, JMP NOT04 /INITIALIZE LOADXR TO 0 F4SKP, SKP F4FLAG, JMP MAPOVR /ZEROED IF INFO IN FIELD 2 DCA F4SKP STA DCA LOADXR NOT04, TAD (-1400 JMS I (ZTST SZA CLA /FIELD EMPTY? JMP NONEMP /NO FLDISZ, ISZ FLDNO JMP FLDLP MAPOVR, ISZ SOMTHN /WAS THERE ANY INPUT? MAPSKP, SKP JMP I (NULERR JMS I (ECRLF JMS I (ECRLF JMS I (OCLOSE CDF CIF 0 JMP I (7605 NONEMP, ISZ SOMTHN /HAVE WE OUTPUT ANYTHING YET? JMP NOTFST JMS I (OOPEN /NO - OPEN OUTPUT FILE NOW JMS I (OTYPE SNA CLA /SET MODE OF OUTPUT - /T INVERTS TAD (20 /NORMAL TTY/NO TYY DISTINCTION TAD I (MPARAM+1 AND (20 DCA I (TTOFLG TAD (OCHAR DCA OUT NOTFST, JMS I (EJECT1 /PAGE HEADING TAD (-100 DCA PAGECT PAGELP, TAD FLDNO TAD (270 JMS I OUT TAD PAGECT AND (70 CLL RTR RAR TAD (260 /OUTPUT LOC (HIGH 3 DIGITS) AT LEFT MARGIN JMS I OUT TAD PAGECT AND (7 TAD (260 JMS I OUT TAD (260 JMS I OUT TAD (260 JMS I OUT TAD (240 JMS I OUT DCA COLCTR TAD (-14 JMS I (ZTST /IF ALL 64 WORDS ARE ZERO, SNA CLA JMP NO1ND0 /DON'T PRINT LINE TAD (-4 DCA SOMTHN DOBTLP, TAD (-6 JMS I (DOBITS /OUTPUT 4 TRIPLEWORDS FOR 64 LOCATIONS TAD (-6 JMS I (DOBITS TAD (-4 JMS I (DOBITS ISZ SOMTHN JMP DOBTLP NO1ND0, JMS I (ECRLF CLA IAC AND PAGECT SZA CLA JMS I (ECRLF /SKIP A LINE EVERY PDP-8 PAGE TAD PAGECT TAD (41 SNA CLA JMS I (EJECT1 /NEW PAGE AT LOCATION 4000 ISZ PAGECT JMP PAGELP JMP FLDISZ PAGECT, 0 SOMTHN, 0 XCDF, 0 CDFX, HLT JMP I XCDF PAGE EJECT1, 0 TAD FLDNO TAD (4070 DCA FLDNUM TAD TTOFLG SZA CLA /TELETYPE STYLE OUTPUT? JMP EJKTTY /YES TAD (214 /NO - FORM FEED JMS I OUT PRTFLD, JMS I (ERR TEXT / BITMAP V/ *.-1 VERLOC, 60+VERSION^100+SUBVER /V5A, ETC... TEXT / FIELD/ *.-1 FLDNUM, TEXT / 0/ JMS ECRLF TAD TTOFLG SNA CLA /IF NOT TTY OUTPUT, JMP EJKLPT /DON'T PRINT HORIZONTAL GUIDE JMS I (ERR TEXT / 0000000011111111222222223333333344444444555555556666666677777777/ JMS I (ERR TEXT / 0123456701234567012345670123456701234567012345670123456701234567/ EJKLPT, JMS ECRLF JMP I EJECT1 EJKTTY, TAD (-13 DCA EJKTMP JMS ECRLF ISZ EJKTMP JMP ECRLFX JMS I (ERR TEXT /----/ JMS ECRLF JMP PRTFLD EJKTMP, 0 ECRLF, 0 TAD (215 JMS I OUT ECRLFX, TAD (212 JMS I OUT JMP I ECRLF TTOFLG, 0 /20 IF TTY-STYLE OUTPUT PAGE BUFFER=. $-$-$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 | /BOOT.PA 17 /OS/8 V3D WITH RL01,RX02 AND VXA0 DEVICES / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /SR /FIXES MADE FOR MAINTENANCE RELEASE: /1. ADDED RX01 (FLOPPY BOOTSTRAP) /2. LEFT PATCH SPACE IN NAME TABLE / 26-DEC-77 /1. ADDED RL BOOTSTRAP (S.R.) *1 HLT JMP I (7600 *100 INNER, 0 OUTR, -20 CODE, 0 LENGTH, 0 *200 START, CLA /ALLOW BEING CHAINED TO TAD I (7600 SPA CLA JMP OS8IN ISZ INNER JMP .-1 ISZ OUTR JMP .-3 JMS I (TESTRK COSIN, TAD I (7776 COMN, CIA DCA CODE TAD (TABLE DCA PTR LOOP, TAD I PTR SNA JMP I (OS8 TAD CODE SZA CLA JMP NXT IOF ISZ PTR TAD I PTR DCA OLDLOC ISZ PTR TAD I PTR DCA NEWLOC ISZ PTR TAD I PTR CIA DCA LENGTH XXLUP, TAD I OLDLOC DCA I NEWLOC ISZ OLDLOC ISZ NEWLOC ISZ LENGTH JMP XXLUP ISZ PTR TAD I PTR DCA TEMP TAD HLTSWT SNA CLA HLT CLL JMP I TEMP HLTSWT, 1 NXT, TAD PTR TAD (5 DCA PTR JMP LOOP OLDLOC, 0 NEWLOC, 0 PTR, 0 SCAN, 0 OS8IN, TAD I (7600 TAD (-4207 SZA CLA JMP I (RETRY TAD I (1000 TAD (777 SNA CLA TAD (600 TAD (1000-1 DCA SCAN SKAN, ISZ SCAN TAD I SCAN SNA JMP I (RETRY AND (177 TAD (-"/!7600 SZA CLA JMP SKAN ISZ SCAN TAD I SCAN AND (77 CLL RTL RTL RTL DCA TEMP ISZ SCAN TAD I SCAN AND (77 TAD TEMP DCA TEMP ISZ SCAN TAD I SCAN AND (177 TAD (-".!7600 DCA HLTSWT TAD TEMP JMP COMN TEMP, 0 PAGE TABLE, 2403 /TC DECTAP 7554 25 7554 2213 /RK RKADR, RK8 21 11 21 2404 /TD TD8E 7277 34 7277 1424 /LT LINCTP 4400 7 4400 2206 /RF RF08 7746 7 7746 2024 /PT BINLDR 7626 152 7700 3205 /ZE ZERO 4 6 4 2431 /TY TYPSET 7730 42 7730 0414 /DL DIAL 4012 6 4012 0301 /CA CAS 4000 40 4000 0415 /DM DSKMON 171 16 174 2605 /VE VERS VERS 1 VERS 0424 /DT TAPE TAPE 1 TAPE 0413 /DK DISK DISK 1 DISK 2205 /RE RK8E 21 11 21 2523 /US 1 1 1 RETRY 2230 /RX RX01 RX8E 42 RXSTRT 2214 /RL RL01 1 35 1 2630 /VX VXA0 0 7 0 ZBLOCK 3^5 /PATCH SPACE 0 /FORMAT: /SIXBIT OF 2-CHARACTER NAME /ADDRESS OF BOOTSTRAP CODE IN BOOT /ADDRESS WHERE BOOTSTRAP CODE IS TO BE MOVED TO /LENGTH OF BOOTSTRAP IN WORDS /STARTING ADDRESS OF BOOTSTRAP DECTAP, 7600 6774 1374 6766 6771 5360 7240 1354 3773 1354 3772 1375 6766 5376 7754 7755 0600 0220 6771 5376 RK8, 6732 6751 6745 5023 6742 6753 6755 6733 5031 RK8E, 7000 7000 7000 7000 7201 6742 6742 6743 5031 TD8E, 6007 1312 4312 4312 6773 5303 6777 3726 2326 5303 5732 2000 1300 6774 6771 5315 6776 0331 1327 7640 5315 2321 5712 7354 7756 7747 0077 7400 LINCTP, 6141 1020 0020 0004 0700 0000 6020 RF08, 6643 6615 7600 6603 6622 5352 5752 / 1000 IS OS/8 LINE BUUFFER / 1600 IS PS/8 LINE BUFFERE *2000 BINLDR, 0000 3212 4260 1300 7750 5237 2212 7040 5227 1212 7640 5230 1214 0274 1341 7510 2226 7750 5626 1214 0256 1257 3213 5230 0070 6201 0000 0000 6031 5262 6036 3214 1214 5660 6011 5270 6016 5265 0300 4343 7041 1215 7402 6032 6014 6214 1257 3213 7604 7700 1353 1352 3261 4226 5313 3215 1213 3336 1214 3376 4260 3355 4226 5275 4343 7420 5336 3216 1376 1355 1215 5315 0000 3616 2216 7600 5332 0000 1376 7106 7006 7006 1355 5743 5262 0006 0000 0000 6014 6011 5357 6016 7106 7006 7510 5374 7006 6011 5367 6016 7420 3776 3376 5357 0000 5301 ZERO, 1005 3410 5004 5404 0011 2010 DIAL, 6141 1020 0020 0004 0701 7300 / 7300 / 6002 / 6042 / 6022 / 6012 / 6032 / 6601 / 6764 / 1221 / 3010 / 1622 / 2222 / 7450 / 5620 / 3410 / 5212 / 7730 / 7727 / 0223 TYPSET, 6774 1347 4341 7240 1353 3355 1352 4341 5753 7777 6766 3354 6771 5344 5741 4600 7777 7777 4220 7400 7777 7777 7777 6014 6011 5360 7106 6012 7420 5357 5756 4356 3373 4356 VXA0, 7200 1206 6200 6207 5605 0000 7000 PTCLEV, "A L3, "5 LV, "V VERS, TAD LV JMS I (PUT TAD L3 JMS I (PUT TAD PTCLEV JMS I (PUT JMP I PRETRY PRETRY, RETRY DSKMON, 7577 7750 7751 1171 3572 1172 3573 6643 6615 6603 6602 5203 5606 7600 CAS, 1237 1206 6704 6706 6703 5204 7264 6702 7610 3211 3636 1205 6704 6706 6701 5216 7002 7430 1636 7022 3636 7420 2236 2235 5215 7346 7002 3235 5201 7737 3557 7730 LCD=6751 SDN=6755 SER=6754 STR=6753 XDR=6752 RX01, RELOC 20 RX8E, / DEVICE IOT SYMBOLIC EQUATES / LCD=6751 /LOAD COMMAND XDR=6752 /TRANSFER DATA STR=6753 /SKIP IF READY TO TRANSFER SER=6754 /SKIP ON ERROR SDN=6755 /SKIP ON DONE / / / / READ, TAD UNIT /TRY NEXT COMBINATION OF DENSITY AND UNIT TAD CON360 /ADDING IN 360 AND CON420 /KEEPING ONLY 420 BITS DCA UNIT /CYCLES 400,420,0,20,400,,,,,,,, CLL CLA CML IAC RTL /COMMAND TO READ DISK - MUST BE ON OMNIBUS! TAD UNIT /UNIT AND DENSITY LCD /COMMAND TO CONTROLLER CLL CLA IAC /TO SET SECTOR AND TRACK TO 1 JMS LOAD /SECTOR TO CONTROLLER, LEAVES AC ALONE JMS LOAD /AND TRACK LITRAL, 7004 /LEAVING A 2 IN AC; SERVES AS LITERAL / / FOLLOWING IS PART OF WAIT LOOP, SAME SECONDARY BOOTS, OLD PRIMARY BOOT / RXSTRT, XSTRT, SDN /HAS DONE COME UP; CODE STARTS HERE! JMP LOAD+1 /NO, GO CHECK FOR READY TO TRANSFER / / NOW, DONE OR ERROR / SER /SKIP ON AN ERROR, TRY ANOTHER DENSITY ETC. SNA /NASTY, AC=2 FOR ABOUT TO DO SILO, 0 ON START-UP JMP READ /START-UP, GO SET UP UNIT, THEN READ TO SILO TAD UNIT /AC ALREADY 2, PUT IN UNIT, DENSITY LCD /TO EMPTY THE SILO TAD UNIT /SET UP LOC 60 FOR OLD SECONDARY BOOT AND CON360 /KEEPING UNLY DENSITY BIT TAD LITRAL /ADDING IN 7004, BECAUSE THAT'S WHAT SYS WANTS DCA RX1SAV /OLD SECONDARY BOOT MOVES IT TO HANDLER CON360, 360 /LITERAL; EXECUTES IN LINE AS A NO-OP / /FALLS THRU TO NEXT PAGE OF LISTING / / / FOLLOWING CODE SAME AS OLD PRIMARY BOOT / JMS LOAD /GRAB NEXT ITEM FROM SILO DCA 2 /TRADITION; SECONDARY BOOT STARTS LOADING AT 2 ! ISZ 50 /INCREMENT LOAD ADDRESS JMP 47 /GO BACK FOR ANOTHER / / SECONDARY BOOT LOADS OVER PRIMARY BOOT UNIT LOCATION 47 IS LOADED, / THEN CONTROL PASSES TO SECONDARY BOOT / LOAD, 0 /SUBROUTINE TO GIVE AND TAKE DATA FROM CONTROLLER STR /IS HE READY TO TALK TO US? JMP XSTRT /NO, IS HE PERHAPS DONE WITH SILO, OR IN ERROR? XDR /YES, DATA IN OR OUT;IF DATA TO CONTROLLER, AC UNCHANGED JMP I LOAD /NO MAGIC, JUST EXIT FROM SUBROUTINE / / 60 GOES TO OLD SECONDARY BOOT / 61 HAS DENSITY AND UNIT THAT BOOTED SUCCESSFULLY / / CON420, /USE IT TO HOLD 420 LITERAL TO START OUT RX1SAV, 420 /UNIT^20+7004 TO GO TO SYS HANDLER UNIT, 20 /<DENSITY^400>+<UNIT^20> THAT BOOTED OK / RELOC PAGE L2213, 2213 DIML=6615 DISK, CLA IAC DIML SNA CLA JMP GOTRF TAD (70 6732 SNA CLA JMP GOTRK8 CLA IAC 6744 SZA CLA JMP I PRETR STA /RE GOTRF, TAD L2206 /RF JMP I PCOMN L2206, 2206 GOTRK8, TAD L2213 /RK JMP I PCOMN PRETR, RETRY TAPE, 6141 /LINC 17 /COMPL AC 2 /PDP IAC SNA CLA JMP GOTLTA TAD (70 6774 CLA 6772 NOP TAD M70 SNA CLA JMP GOTTC STL CLA RAR 6774 CLA 6776 SMA CLA JMP I PRETR GOTTD, CLA IAC GOTTC, TAD L2403 /TC JMP I PCOMN GOTLTA, TAD L1424 /LT JMP I PCOMN L1424, 1424 L2403, 2403 PCOMN, COMN M70, -70 / 0000 CRLF, 0 TAD L215 JMS PUT TAD L212 JMS PUT JMP I CRLF L215, 215 L212, 212 PUT, 0 TLS TSF JMP .-1 CLA JMP I PUT GET, 0 KSF JMP .-1 KRB AND (177 TLS TSF JMP .-1 TAD (-003 SNA JMP I (7605 TAD (003-177 SNA JMP I (RETRY TAD (177-015 SNA ISZ GET TAD (015 AND (77 JMP I GET TESTRK, 0 TAD (70 6732 SNA CLA JMP I TESTRK RK05, TAD (RK8E DCA I (RKADR JMP I TESTRK PAGE OS8, TAD ("N JMS I (PUT TAD ("O JMS I (PUT CLA IAC DCA I (HLTSWT RETRY, JMS I (CRLF TAD ("/ JMS I (PUT JMS I (GET SKP JMP RETRY CLL RTL RTL RTL DCA I (TEMP JMS I (GET SKP JMP RETRY TAD I (TEMP DCA I (TEMP JMS I (GET JMP .-1 CLA JMS I (CRLF TAD I (TEMP JMP I (COMN RL01, 6600 7201 4027 1004 4027 6615 7002 7012 6615 0025 7004 6603 7325 4027 7332 6605 1026 6607 7327 4027 0377 7600 0000 6604 6601 5031 6617 5427 5001 PAGE FIELD 0 *200 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 | /11 OS8 CAMP / /S.R. / / /CASSETTE & MAGTAPE POSITIONER (CAMP) / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE VITHOUT NOTICE /AND SHOULD NOT BE CONTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / COPYRIGHT (C) 1973,1975,1977 BY DIGITAL EQUIPMENT CORPORATION. / / / / / MUST SKIP LOCS 1000-1377 LINBUF=1000 XR1=11 XR2=12 XR3=13 *20 TEMP, 0 T, 0 T2, 0 LINPTR, 0 T3, 0 FLAG, 0 SPKNT, 0 DEVTYP, 0 /DEVICE TYPE (BITS 6-11) ENTRY, 0 /HANDLER ENTRY POINT NUM, 0 TYP, 0 /0 MEANS 'F', 1 MEANS 'R' T4, 0 DEVNUM, 0 DCW, 0 /DEVICE CONTROL WORD DCWPTR, 0 USR, 200 /POINTS TO USR ENTRY POINT ESCBIT, 0 /1 MEANS USER TYPED ALTMODE CNT, 0 CTOFLG, 0 /-1 MEANS SAW ^O COUNT, 0 PTR, 0 DHIT, 0 /DEVICE HANDLER INFO TABLE - 1 DHI, 0 /DEVICE HANDLER INFO DBLK, 0 /DEVICE HANDLER BLOCK VNOPTR, 0 /PTS TO VERSION # IN HANDLER VNO, 0 /CURRENT HANDLER VERSION NUMBER SAVPTR, 0 NO, 0 /1 MEANS 'NO' FLG, 1 /1 MEANS SAW NO DIGITS P, 0 RR, 0 NUCODE, 0 / MAGTAPE SPECIAL CODES REWKOD=1 SKFKOD=3 /SKIP FORWARD FILE UNLKOD=4 EOFKOD=5 SKPKOD=2 /FORWARD RECORD BAKKOD=SKPKOD+4000 BKFKOD=SKFKOD+4000 DTLA=6766 /0000-0777 /CAMP /1000-1377 /OS/8 LINE BUFFER /1400-1777 /PS/8 LINE BUFFER /2000- /CAMP /7000-7177 /I/O BUFFER /7200-7577 /OS/8 HANDLER /7600-7777 /OS/8 DLDC=6746 DLAG=6743 PAGE *200 START, SKP JMP CHN TAD ("# JMS I [TYPE JMS I [READ /READ A LINE INTO OS/8 LINE BUFFER CHN, TAD [LINBUF /CHAIN ENTRY ADDRESS DCA LINPTR /INITIALIZE POINTER TO LINE BUFFER STA JMS I [SPACE /IGNORE LEADING SPACES JMS GETTWO /GET TWO CHARS DCA TEMP JMS I [SCAN /SCAN PAST EXTRA LETTERS OR DIGITS TAD TEMP JMS I [BRANCH /GO TO APPROPRIATE ROUTINE -2313;SKIP /SK -0517;EOF /EO -0201;BACK /BA -2205;REWIND /RE -2516;UNLOAD /UN -2605;VERSION /VE -1005;HELP /HE -2664;V4 /V4 -2305;SYNTAX /SE SETLOC=.-1 0 SNA CLA JMP I [GOAWAY JMP I [SYNTAX /NONE OF THESE /V1 FEATURES: /FIXES SINCE FIELD TEST RELEASE: /1. ADDED CASSETTE SUPPORT /2. FIXED BUG RE IMMEDIATE ALTMOD /3. CHANGED SPECIAL CODES TO AGREE WITH NEW MAGTAPE HANDLER /4. IGNORE NULLS ON INPUT /5. ALLOW UNLOADING AN RK8E /CHANGES MADE TO V3: /1. SET COMMAND IMPLEMENTED /MAINTENANCE RELEASE CHANGES: /1. TOOK OUT 'SET' SINCE WE DON'T WANT TO SUPPORT IT / UNTIL OS/8 V4 /2. FIXED BUG RE AT EOF AND BOF MESSAGES /3. CHANGED CAMP TO USE NEW TM8E HANDLER / NOTE: CAMP WILL NOT WORK PROPERLY WITH / TM8E HANDLERS PRIOR TO VERSION F /4. PROPERLY FIND EOT EVEN IF WE'RE JUST / BEFORE A FILE MARK. /5. GIVE AT BOT OR EOT MESSAGE IF SEE REFLECTIVE SPOT /6. CHANGED VERSION NUMBER TO V4 /7. ENSURE THAT USER CAN'T PASS OVER EOD /V3D CHANGES: /1. FIXED BUG WITH UNLOADING RKS / GETTWO /GET TWO LETTERS OR DIGITS FROM INPUT LINE, PACK IN SIXBIT /ADVANCE PAST THEM. SUBSTITUTE NULL IF NOT FOUND. GETTWO, 0 JMS GETSIX CLL RTL RTL RTL DCA T2 JMS GETSIX TAD T2 /COMBINE JMP I GETTWO GETSIX, 0 /GET A SIXBIT LETTER OR DIGIT (OR NULL) JMS ALPHA /IS IT ALPHANUMERIC? JMP NOTALPH /NO AND [77 /YES JMP I GETSIX /TRUNCATE TO SIXBIT NOTALPH,CLA JMS BACKC JMP I GETSIX /RETURN NULL GETC, 0 /GET A CHARACTER, ADVANCE POINTER TAD I LINPTR AND [177 /ALWAYS RETURN 8-BIT SZA TAD [200 /WITH HIGH ORDER BIT ON ISZ LINPTR /ADVANCE SCAN JMP I GETC /RETURN BACKC, 0 /MOVE SCAN POINTER BACK ONE STA TAD LINPTR DCA LINPTR JMP I BACKC /RETURN /RETURN 1 NOT OF TYPE DESIRED /RETURN 2 DESIRED TYPE /IN BOTH CASES, CHAR IS LEFT IN AC ALPHA, 0 /LOOK FOR ALPHANUMERIC JMS I [GETC JMS LETTER /IS IT A LETTER? JMP TRYDIG /NO, TRY DIGIT JMP GOTAL /YES TRYDIG, JMS DIGIT /IS IT A DIGIT? JMP I ALPHA /NO, AINT LETTER OR DIGIT GOTAL, ISZ ALPHA /YES, EITHER LETTER OR DIGIT JMP I ALPHA /RETURN WITH IT IN AC LETTER, 0 /LOOK FOR LETTER TAD (-"A CLL TAD ("A-"Z-1 SNL ISZ LETTER TAD ("Z+1 /RESTORE CHAR JMP I LETTER DIGIT, 0 /LOOK FOR DIGIT TAD (-"0 CLL TAD ("0-"9-1 /(DECIMAL) SNL ISZ DIGIT TAD ("9+1 /RESTORE DIGIT TO CHARACTER FORM JMP I DIGIT /AND RETURN WITH IT IN AC PAGE SYNTAX, CLA JMS PRINT TEXT /? SYNTAX ERROR/ GOAWAY, TAD ESCBIT SZA CLA JMP I [7605 /LINE ENDED WITH ESCAPE TAD I [READ /WAS 'READ' EVER CALLED? SZA CLA JMP I [START /YES, GET A NEW LINE JMP I [7605 /NO, WE MUST'VE BEEN CHAINED TO, RECALL KBM PRINT, 0 TAD I PRINT RTR RTR RTR JMS PRIN TAD I PRINT JMS PRIN ISZ PRINT JMP PRINT+1 LV, JMS I [CRLF ISZ PRINT JMP I PRINT PRIN, 0 AND [77 SNA JMP LV TAD [240 AND [77 TAD [240 DCA T3 TAD [200 KRS TAD (-203 SNA JMP CTRLC TAD (203-217 /^O SNA CLA JMS CTRLO TAD T3 JMS I [TYPE JMP I PRIN CTRLC, TAD ["^ JMS I [TYPE TAD ("C JMS I [TYPE /ECHO "^C" JMS I [DELAYY JMP I [7600 /THEN GO AWAY CTRLO, 0 KCC /CLEAR OUT ^O TAD ["^ JMS I [TYPE TAD ("O JMS I [TYPE JMS I [CRLF STA DCA CTOFLG /STOP ECHOING JMP I CTRLO VERSION,JMS PRINT TEXT \OS/8 CAMP V5A\ JMP I [START NUMBIG, JMS PRINT TEXT /? NUMBER TOO BIG/ JMP I [GOAWAY NONEX, JMS PRINT TEXT /? CAN'T - DEVICE DOESN'T EXIST/ JMP I [GOAWAY SYSERR, JMS PRINT TEXT \? I/O ERROR ON SYS:\ JMP I [GOAWAY PAGE HELP, JMS I [PRINT TEXT /BACKSPACE DEV: N FILES/ JMS I [PRINT TEXT /BACKSPACE DEV: N RECORDS/ JMS I [PRINT TEXT /EOF DEV:/ H2, JMP H1 / JMS I [PRINT TEXT /SET DEV: [NO] ATTRIB [N]/ H1, JMS I [PRINT TEXT /SKIP DEV: N FILES/ JMS I [PRINT TEXT /SKIP DEV: N RECORDS/ JMS I [PRINT TEXT /SKIP DEV: EOD/ JMS I [PRINT TEXT /REWIND DEV:/ JMS I [PRINT TEXT /UNLOAD DEV:/ JMS I [PRINT TEXT /VERSION/ JMS I [PRINT TEXT /HELP/ JMP I [START BADEV, CLA JMS I [PRINT TEXT /? CAN'T FOR THIS DEVICE/ JMP I [GOAWAY V4, TAD (SET DCA I (SETLOC TAD H1 DCA H2 JMP I [START PAGE *2000 /ORIGIN PAST OS/8 LINE BUFFER AT 1000. /SKIP PAST PS/8 LINE BUFFER (AT 1400) JUST IN CASE /PS/8 USERS WISH TO PATCH THIS PROGRAM /SCAN PAST EXTRA LETTERS OR DIGITS SCAN, 0 JMS I [ALPHA JMP NOPE CLA JMP SCAN+1 NOPE, CLA JMS I [BACKC JMP I SCAN /SCAN PAST SPACES; GIVE ERROR IF NO SPACES FOUND UNLESS AC=-1 SPACE, 0 DCA FLAG /SET AC=-1 TO PREVENT ERROR ON NO SPACES FOUND DCA SPKNT /INITIALIZE SPACE COUNTER SKP /JUMP INTO LOOP GOTSP, ISZ SPKNT JMS I [GETC /GET NEXT CHAR TAD (-240 SNA CLA /IS IT A SPACE? JMP GOTSP /YES, COUNT IT JMS I [BACKC /NO, PUT IT BACK ISZ FLAG /CHECK FLAG SKP /USER DIDN'T SPECIFY FLAG JMP I SPACE /-0 MEANT DON'T CHECK IF FOUND SPACE TAD SPKNT /HOW MANY SPACES DID WE FIND? SZA CLA JMP I SPACE /SOME. OK JMP I [SYNTAX /NONE. TSK. TSK. BRANCH, 0 DCA T BR2, TAD I BRANCH ISZ BRANCH SNA JMP NOTFND TAD T SNA CLA JMP FOUND ISZ BRANCH JMP BR2 FOUND, TAD I BRANCH DCA T JMP I T /FOUND ITEM IN COLUMN 1, JUMP TO ADDRESS IN COL 2 NOTFND, TAD T JMP I BRANCH /IF NOT FOUND IN COL 1, RETURN WITH AC INTACT CHECKR, 0 TAD DCW RAL SMA CLA JMP I CHECKR RONLY, JMS I [PRINT TEXT /? CAN'T - DEVICE IS READ-ONLY/ JMP I [GOAWAY CHECKW, 0 TAD DCW RTL SMA CLA JMP I CHECKW WONLY, JMS I [PRINT TEXT /? CAN'T - DEVICE IS WRITE-ONLY/ JMP I [GOAWAY ONUM, 0 DCA NUM CLA IAC DCA FLG ONM1, JMS I [GETC TAD (-"0-10 /CONVERT TO DIGIT CLL TAD (10 SNL JMP OEON DCA T4 DCA FLG TAD NUM AND [7000 SZA CLA JMP I [NUMBIG TAD NUM CLL RTL RAL TAD T4 DCA NUM JMP ONM1 OEON, CLA JMS I [BACKC TAD NUM JMP I ONUM PAGE /READ A LINE INTO OS/8 LINE BUFFER READ, 0 DCA CTOFLG /ALLOW ECHOING RD1, TAD [LINBUF DCA LINPTR DCA ESCBIT GT, JMS GET LOOK, JMS I [BRANCH -377;RUBOUT -217;GT /^O -203;CTRLC /^C -212;LF /LINE FEED -215;CR /CARRIAGE RETURN -375;ESCAPE /ALTMODE -376;ESCAPE /ALTMODE (2ND FLAVOR) -233;ESCAPE /ESCAPE -225;CTRLU /^U -200;GT /IGNORE NULLS 0 DCA TEMP /NONE OF THESE TAD LINPTR TAD (-LINBUF-377 SNA CLA /AT END OF LINE BUFFER? JMP GT /YES, DON'T ACCEPT CHAR TAD TEMP /NO, RETRIEVE CHAR JMS TYPE /ECHO IT TAD TEMP /INSERT IN BUFFER DCA I LINPTR ISZ LINPTR /BUMP POINTER JMP GT /NEXT CTRLU, TAD ["^ JMS TYPE TAD ("U JMS TYPE /ECHO "^U" <CR><LF> JMS I [CRLF JMP RD1 RUBOUT, TAD LINPTR TAD [-LINBUF SNA JMP BOL /AT BEGIN OF LINE TAD [LINBUF-1 DCA LINPTR /MOVE POINTER BACK ONE TAD ["\ JMS TYPE /ECHO "\" RUB3, TAD I LINPTR JMS TYPE /ECHO RUBBED-OUT CHARACTER GT2, JMS GET JMS I [BRANCH -377;RUB2 -216;GT2 /IGNORE ^O -203;CTRLC /^C 0 DCA TEMP /A NEW CHAR TAD ["\ JMS TYPE /ENCLOSE RUBBED-OUT CHARS IN \'S TAD TEMP JMP LOOK RUB2, TAD LINPTR TAD [-LINBUF SNA JMP BOL2 TAD [LINBUF-1 DCA LINPTR JMP RUB3 BOL2, TAD ["\ JMS TYPE BOL, JMS I [CRLF JMP RD1 ESCAPE, TAD ("$ /ECHO ESCAPE AS DOLLAR SIGN JMS TYPE ISZ ESCBIT /NOTE ESCAPE CR, DCA I LINPTR /INSERT 0 AT END JMS I [CRLF JMP I READ /RETURN, WE GOT LINE GET, 0 KSF JMP .-1 KRB AND [177 TAD [200 /FORCE TO 8-BIT JMP I GET TYPE, 0 DCA TYPEM JMS I [DELAYY DCA .-1 /DELAY FIRST TIME THRU TO LET THINGS QUIET DOWN TAD CTOFLG SZA CLA JMP I TYPE /NO ECHOING TAD TYPEM TLS TSF JMP .-1 CLA JMP I TYPE TYPEM, 0 LF, DCA I LINPTR /TEMPORARILY INSERT A 0 SENTINEL TAD [LINBUF-1 DCA XR1 JMS I [CRLF TAD ["# JMS I [TYPE LFLP, TAD I XR1 SNA JMP I [GT /FINHSHED, GET SOME MORE CHARS JMS I [TYPE /ECHO CURRENT CHARS JMP LFLP PAGE EOF, JMS I [SPACE /SPAN OVER SPACES JMS I [GETDEV /GET DEVICE JMS I [CHECKR TAD DEVTYP JMS I [BRANCH -20;MAGEOF -27;CASEOF ZBLOCK 2 0 JMP I [BADEV SKIP, JMS I [SPACE JMS I [GETDEV JMS I [CHECKW JMS GETNUM TAD DEVTYP JMS I [BRANCH -20;MAGSKP -27;CASSKP 0 JMP I [BADEV REWIND, JMS I [SPACE JMS I [GETDEV JMS I [CHECKW TAD DEVTYP JMS I [BRANCH -20;MAGREW -27;CASREW -16;TCREW / -17;LTREW ZBLOCK 4 /PATCH SPACE 0 TAD DCW SMA CLA JMP I [BADEV /NOT FILE STRUCTURED CLA IAC /READ BLOCK 0 TO REWIND DCA I [BLK TAD (100 JMS I [GO JMP I [GOAWAY UNLOAD, JMS I [SPACE JMS I [GETDEV JMS I [CHECKW TAD DEVTYP JMS I [BRANCH -20;MAGUNL / -27;CASUNL -16;TCUNL -21;TDUNL / -17;LTUNL -23;RKEUNL ZBLOCK 2 0 JMP I [BADEV BACK, JMS I [SPACE JMS I [GETDEV JMS I [CHECKW JMS GETNUM TAD TYP SPA CLA JMP I [SYNTAX /CAN'T BACKSPACE TO EOD TAD DEVTYP JMS I [BRANCH -20;MAGBAK -27;CASBAK 0 JMP I [BADEV GETNUM, 0 /PARSE OFF :NNNN [F ! R] OR EOD CLA IAC DCA NUM DCA TYP JMS I [GETC SNA JMP I GETNUM /EOL TAD (-": SZA CLA JMP I [SYNTAX STA JMS I [SPACE /OPTIONAL SPACES TAD I LINPTR SNA JMP I GETNUM /EOL TAD (-"E SNA CLA JMP EO JMS I [NUMBER DCA NUM STA JMS I [SPACE /MORE OPTIONAL SPACES DCA TYP JMS I [GETC SNA JMP I GETNUM /NO F OR R. F ASSUMED TAD (-"F SNA JMP R /0 MEANS 'F' TAD ("F-"R SZA CLA JMP I [SYNTAX CLA IAC /1 MEANS 'R' R, DCA TYP JMP I GETNUM EO, STA /-1 MEANS 'E' JMP R PAGE /GET A DECIMAL NUMBER, RETURN IT IN AC NUMBER, 0 DCA NUM CLA IAC DCA FLG NM1, JMS I [GETC JMS I [DIGIT JMP EON TAD (-"0 /CONVERT TO DIGIT DCA T4 DCA FLG /NOTE PASSAGE OF A DIGIT TAD NUM AND [7000 SZA CLA JMP I [NUMBIG TAD NUM CLL RTL TAD NUM CLL RAL TAD T4 SZL JMP I [NUMBIG DCA NUM JMP NM1 EON, CLA JMS I [BACKC TAD FLG SZA DCA NUM /IF NO DIGITS, RETURN A 1 TAD NUM JMP I NUMBER / GETDEV /PARSES OFF A DEVICE NAME (1-4 CHARS) /DETERMINES IF IT EXISTS /LOADS HANDLER INTO 7200-7577 IF NOT ALREADY IN CORE /SETS ENTRY POINT ADDRESS AT 'ENTRY' /SETS DEVICE NUMBER AT 'DEVNUM' /SETS DEVICE CONTROL WORD AT 'DCW' /SETS 'DEVTYP' GETDEV, 0 JMS I [GETTWO DCA WD1 JMS I [GETTWO DCA WD2 TAD WD1 TAD WD2 DCA WD1 /COMBINE TWO WORDS INTO 1 (IN WD1) TAD WD2 SNA CLA JMP INQ TAD WD1 /OS/8 KLUDGE FOR UNIQUENESS CLL RAL STL RAR /FORCE BIT 0 ON IF 2ND WORD WAS NON-ZERO DCA WD1 INQ, DCA WD2 CIF 10 JMS I USR 12 /INQUIRE WD1, 0 /DEVICE NAME WD2, 0 /GETS DEVICE NUMBER WD3, 0 /GETS ENTRY POINT JMP I [NONEX /DEVICE DOESN'T EXIST TAD WD3 SZA /IS HANDLER ALREADY IN CORE? JMP INCORE /YES TAD WD1 DCA DW1 TAD (7201 /ALLOW TWO PAGE HANDLER IN 7200 DCA DW3 DCA DW2 CIF 10 JMS I USR 1 /FETCH DW1, 0 /DEVICE NAME DW2, 0 /GETS DEVICE NUMBER DW3, 0 /GETS ENTRY POINT JMP I [NONEX /DOESN'T EXIST TAD DW2 DCA DEVNUM TAD DW3 DCA ENTRY JMP GETYP INCORE, DCA ENTRY TAD WD2 DCA DEVNUM GETYP, TAD DEVNUM TAD (7757 DCA DCWPTR /POILT INTO DEVICE CONTROL WGRD TABLE CDF 10 TAD I DCWPTR /GET DCW DCA DCW TAD DCW RTR RAR AND [77 DCA DEVTYP STA TAD I (37 /GET ADDRESS OF DHIT DCA DHIT TAD DHIT TAD DEVNUM DCA DHI TAD I DHI CDF 0 DCA DHI TAD DHI RTL RTL RTL AND (17 SZA TAD (15 DCA DBLK JMP I GETDEV DELAYY, 0 TAD (-10 DCA OUTER ISZ ZER JMP .-1 ISZ OUTER JMP .-3 JMP I DELAYY ZER, 0 OUTER, -10 PAGE LOADPT, TAD I (FUNCT TAD (-REWKOD SNA CLA JMP I [GOAWAY /LOAD POINT ON A REWIND IS NOT AN ERROR READBT, JMS I [PRINT TEXT /? CAN'T - AT BOT OR EOT/ JMP I [GOAWAY READEOF,JMS I [PRINT TEXT /% CAN'T - AT EOF/ JMP I [GOAWAY READBOF,JMS I [PRINT TEXT /% CAN'T - AT BOF/ JMP I [GOAWAY CASSKP, DCA I (DIR TAD TYP SNA CLA JMP CSKPF JMP I (NOTIMPL CGO, 0 DCA CFUNCT JMS I ENTRY CFUNCT, 0 CBUFR, 7000 CBLK, -1 SKP JMP I CGO DCA TEMP TAD TEMP SMA CLA JMP I (END /SOFT ERROR JMS I [PRINT TEXT \? CAN'T - I/O ERROR\ JMP I [GOAWAY CASEOF, JMS CGO JMP I [GOAWAY CASREW, TAD (REWKOD JMS CGO JMP I [GOAWAY CSKPF, TAD NUM SNA IAC CIA DCA COUNT TAD (SKFKOD JMS CGO ISZ COUNT JMP .-3 JMP I [GOAWAY CASBAK, CLA IAC DCA I (DIR TAD TYP SZA CLA JMP CBAKBLK TAD NUM CMA DCA COUNT TAD (BKFKOD JMS CGO ISZ COUNT JMP .-3 JMP I [GOAWAY CBAKBLK,TAD NUM SNA IAC CIA DCA COUNT TAD (BAKKOD JMS CGO ISZ COUNT JMP .-3 JMP I [GOAWAY PAGE TCREW, JMS TCR JMP I [GOAWAY TCUNL, JMS TCR TAD ENTRY IAC RTR RTR AND [7000 DTLA /SELECT ANOTHER UNIT JMP I [GOAWAY TCR, 0 TAD ENTRY TAD (-7607 SZA CLA /SYSTEM TC08 DECTAPE MUST BE UNIT 0 TAD ENTRY RTR RTR AND [7000 /ISOLATE UNIT # IN BITS 0-2 TAD (600 /GO REVERSE DTLA JMP I TCR TDUNL, TAD (-7607 SZA CLA TAD ENTRY DCA TEMP TAD TEMP RTR RAR CLA RAR DCA UNIT TAD TEMP AND [3 CIA TAD [77 /GET DEV CODE CLL RTL RAL TAD (6004 /BUILD 'SDLC' DCA BSDLC TAD UNIT TAD (3000 /GO, REVERSE BSDLC, HLT CLA JMP I [GOAWAY UNIT, 0 TTCODE, 0 TAD NO SZA CLA JMP I [SYNTAX JMS I [ONUM SNA JMP I [SYNTAX DCA NUCODE TAD NUCODE AND [7700 SZA CLA JMP I [NUMBIG JMS I [TTST1 TAD (7200 DCA RR JMS GETIOT JMP I [OLDERR CIA DCA T2 TTLP, JMS GETIOT JMP I [OLDERR CIA DCA T3 TAD T3 CIA TAD T2 SNA JMP TTLP SMA CLA JMP .+3 TAD T3 DCA T2 /T2 CONTAINS NEG OF SMALLER IOT TAD (7200 DCA RR TTLP2, JMS GETIOT JMP I TTCODE TAD T2 SZA CLA CLA IAC TAD NUCODE CLL RTL RAL DCA T3 TAD I RR AND (7007 TAD T3 DCA I RR JMP TTLP2 GETIOT, 0 ISZ RR TAD RR TAD (-7600 SNA CLA JMP I GETIOT TAD I RR AND [7000 TAD [-6000 SZA CLA JMP GETIOT+1 TAD I RR RTR RAR AND [77 TAD (-20 CLL RAR SNA JMP GETIOT+1 RAL TAD (20 ISZ GETIOT JMP I GETIOT PAGE MAGSKP, DCA DIR TAD TYP SNA JMP SKPF SPA CLA JMP SKPEOD TAD NUM SNA CLA IAC CIA DCA WC TAD (SKPKOD JMS GO JMP I [GOAWAY MAGEOF, TAD (EOFKOD JMS GO JMP I [GOAWAY SKPF, TAD NUM SNA JMP SKP0 CIA DCA WC JMS I (FUDGE /DON'T LET GUY TRICK US INTO GOING PAST EOD TAD (SKFKOD JMS GO JMP I [GOAWAY SKPEOD, JMS I (FUDGE /DON'T LET GUY TRICK US INTO GOING PAST EOD JMS I ENTRY SKFKOD 0 0 /SKIP 4096 FILES SMA SKP CLA JMP CHKBOT JMP I [GOAWAY MAGBAK, CLA IAC DCA DIR TAD TYP SNA CLA JMP BAKF TAD NUM SNA CLA IAC CIA DCA WC TAD (BAKKOD JMS GO JMP I [GOAWAY BAKF, TAD NUM CMA DCA WC2 JMS I ENTRY BKFKOD 0 WC2, -1 / SMA SKP CLA JMP CHKBOT TAD (SKPKOD /SKIP 1 RECORD FORWARD JMP SKY CHKBOT, DCA TEMP TAD TEMP AND (1000 SNA CLA JMP IOE JMP I (READBT MAGUNL, TAD (UNLKOD JMS GO JMP I [GOAWAY MAGREW, TAD (REWKOD JMS GO JMP I [GOAWAY GO, 0 DCA FUNCT JMS I ENTRY FUNCT, 0 BUFR, 7000 WC, BLK, -1 SKP /I/O ERROR JMP I GO DCA TEMP TAD TEMP SMA CLA JMP END /SOFT ERROR TAD TEMP AND (1000 SZA CLA JMP I [LOADPT IOE, TAD TEMP JMP I [IOERR DIR, 0 /0- FORWARD ; 1- BACKWARDS END, TAD TYP SNA CLA JMP I (EODERR /V3C NEW HANDLER CALL TAD DIR /SAW FILE MARK SNA CLA /V3C JMP I [READEOF /AT END OF FILE JMP I [READBOF /AT BEGIN OF FILE SKP0, JMS I ENTRY SKFKOD 0 /IRRELEVANT -1 /ADVANCE 1 FILE SMA SKP CLA JMP I [IOERR /HARD ERROR TAD (BAKKOD SKY, DCA SKX /V3C JMS I ENTRY SKX, BAKKOD 0 /IRREL -1 /BACK OVER FILE MARK SMA SKP CLA JMP I [IOERR JMP I [GOAWAY PAGE IOERR, AND (3777 CLL RAL DCA TEMP JMS I [PRINT TEXT \? CAN'T - I/O ERROR\ TAD (-13 /11 BITS TO LOOK AT DCA CNT TAD (JLIST DCA JM IOLUP, TAD TEMP RAL DCA TEMP SZL JMP I JM IOCONT, ISZ JM ISZ CNT JMP IOLUP JMP I [GOAWAY JM, 0 JLIST, JMP BIT1 JMP BIT2 JMP BIT3 JMP BIT4 JMP BIT5 JMP BIT6 JMP BIT7 JMP BIT8 JMP I (BIT9 JMP I (BIT10 JMP I (BIT11 BIT1, JMS I [PRINT TEXT /(REWINDING)/ JMP IOCONT BIT2, JMS I [PRINT TEXT /(BOT)/ JMP IOCONT BIT3, JMS I [PRINT TEXT /(SELECT ERROR)/ JMP IOCONT BIT4, JMS I [PRINT TEXT /(PARITY ERROR)/ JMP IOCONT BIT5, JMS I [PRINT TEXT /(EOF)/ JMP IOCONT BIT6, JMS I [PRINT TEXT /(RECORD LENGTH INCORRECT)/ JMP IOCONT BIT7, JMS I [PRINT TEXT /(TIMING ERROR)/ JMP IOCONT BIT8, JMS I [PRINT TEXT /(EOT)/ JMP IOCONT RKEUNL, CLL TAD ENTRY TAD (200 SNL CLA TAD ENTRY AND (6 /ISOLATE UNIT TAD (2000 /WRITE PROTECT DISK DLDC /LOAD COMMAND REGISTER DLAG JMP I [GOAWAY PAGE BIT9, JMS I [PRINT TEXT /(WRITE LOCK-OUT)/ JMP I (IOCONT BIT10, JMS I [PRINT TEXT /(READ COMPARE ERROR)/ JMP I (IOCONT BIT11, JMS I [PRINT TEXT /(ILLEGAL FUNCTION)/ JMP I (IOCONT NOTIMPL,JMS I [PRINT TEXT /% OPERATION NOT YET IMPLEMENTED/ JMP I [GOAWAY EODERR, JMS I [PRINT TEXT /? CAN'T - AT EOD/ JMP I [GOAWAY /THIS ROUTINE PREVENTS US FROM GOING PAST EOD WHEN /SKIPPING FORWARD FILES. /IT DOES THIS BY THE FOLLOWING ALGORITHM: /FIRST WE BACKSPACE A RECORD. /IF WE SAW DATA, THEN OK, WE RETURN TO THE USER; /THIS WILL NOT AFFECT HIS SKIP FILE COUNT. /IF WE SAW A FILE MARK, THEN WE SKIP FORWARD /BACK OVER THAT FILE, IGNORING THE FILE MARK ERROR. /IF WE SAW BOT, THEN, OK NO ERROR. FUDGE, 0 JMS I ENTRY /V3C ALL NEW BAKKOD TM, 0 -1 SKP JMP I FUDGE SPA JMS BER SZA CLA JMS FRWD JMP I FUDGE /IF ERROR WAS BOT, OK BER, 0 DCA TM TAD TM AND (1000 SZA CLA JMP I BER /BOT OK, NO FRWD TAD TM JMP I [IOERR FRWD, 0 JMS I ENTRY SKPKOD 0 -1 SMA SKP CLA JMP I [IOERR JMP I FRWD PAGE SET, JMS I [SPACE DCA VNO /V3C JMS I [GETDEV JMS I [GETC JMS I [BRANCH -":;COLN -" ;COLN -"-;HYPH 0 JMP I [SYNTAX /NO : OR BLANK AFTER NAME COLN, STA JMS I [SPACE /IGNORE OPTIONAL SPACES JMS I [GETC SNA JMP I [SYNTAX TAD (-"- SNA CLA JMP HYPH JMS I [BACKC COLN2, DCA NAM1 DCA NAM2 TAD (MAIN-1 /LOOK FOR DEVICE TYPE IN MAIN TABLE MNLUP, DCA XR1 TAD I XR1 SMA SZA JMP NOTYP /NOT FOUND TAD DEVTYP SNA CLA JMP FNDTYP TAD XR1 TAD (3 /POINT TO NEXT ENTRY JMP MNLUP FNDTYP, TAD I XR1 /GET GENERIC NAME DCA NAM1 TAD I XR1 DCA NAM2 DCA AUXFLG TAD I XR1 /GET PTR TO DEVICE TABLE INTO, DCA PTR DCA NO TAD LINPTR DCA SAVPTR /SAVE SCAN POINTER JMS I [GETTWO TAD (-1617 SNA CLA /ARE NEXT TWO CHARS 'NO'? JMS SAWNO /YES TAD SAVPTR /NO DCA LINPTR /RESTORE PTR SCNLUP, TAD I PTR SNA /GET NEXT KEYWORD POINTER JMP NOKEY ISZ PTR /POINT TO PTR TO ROUTINE JMS I [KEYSRCH JMP NOF /NOT FOUND TAD I PTR /FOUND DCA PTR /GET PTR TO ROUTINE JMS I (HREAD /READ HANDLER JMS I PTR /CALL ROUTINE JMS I (HWRITE /REWRITE HANDLER JMP I [GOAWAY HYPH, JMS I [ALPHA JMP I [BADV DCA VNO TAD VNO SNA JMP I [BADV AND [17 DCA VNO JMS I [SPACE /IGNORE SPACE JMP COLN2 NOKEY, TAD AUXFLG SNA CLA JMP NOO JMS I [PRINT TEXT \? UNKNOWN ATTRIBUTE FOR DEVICE \ *.-1 NAM1, 0 NAM2, 0 0 JMP I [GOAWAY SAWNO, 0 ISZ NO STA JMS I [SPACE TAD LINPTR DCA SAVPTR JMP I SAWNO NOTYP, CLA ISZ AUXFLG TAD (AUX /SEARCH AUXILIARY TABLE JMP INTO NOF, ISZ PTR TAD SAVPTR DCA LINPTR JMP SCNLUP AUXFLG, 0 NOO, ISZ AUXFLG TAD (AUX DCA PTR JMP SCNLUP PAGE HREAD, 0 TAD DBLK SNA JMP RESERR DCA BLOCK JMS I (7607 200 /READ 2 PAGES L7200, 7200 /INTO 7200-7577 BLOCK, 0 /FROM THIS BLOCK ON SYSTEM DEVICE JMP I [SYSERR TAD DHI AND (177 /GET RELATIVE ENTRY PT TAD L7200 DCA ENTRY TAD VNO SZA CLA /V3C JMP I HREAD /VNO ALREADY SET BY - COMMAND TAD ENTRY VLOOP, DCA VNOPTR TAD I VNOPTR CLL TAD (-33 SZL CLA JMP BACKV TAD I VNOPTR SNA JMP OLDERR DCA VNO JMP I HREAD BACKV, STA TAD VNOPTR JMP VLOOP RESERR, JMS I [PRINT TEXT /? CAN'T - DEVICE IS RESIDENT/ JMP I [GOAWAY OLDERR, CLA JMS I [PRINT TEXT /? CAN'T - OBSOLETE HANDLER/ JMP I [GOAWAY HWRITE, 0 TAD BLOCK DCA BLKTWO JMS I (7607 4200 7200 BLKTWO, 0 JMP I [SYSERR JMP I HWRITE NEWERR, CLA JMS I [PRINT TEXT /? CAN'T - UNKNOWN VERSION OF THIS HANDLER/ JMP I [GOAWAY PAGE MAIN, -0; DEVICE TTY; TTYTBL -1; DEVICE PTR; PTRTBL -2; DEVICE PTP; PTPTBL -3; DEVICE CDR; CDRTBL -4; DEVICE LPT; LPTTBL -20; DEVICE MTA; MTATBL 1 ZBLOCK 20 /TABLE ENDS WITH A POSITIVE NON-ZERO NUMBER CDRTBL, CODE;CDCODE ZBLOCK 4 0 LPTTBL, WIDTH;LPWDTH LC;LPLC LV8E;LPLV ZBLOCK 4 0 MTATBL, PARITY;MTAPAR DENSITY;MTADEN FILES;MTAFIL ZBLOCK 4 0 TTYTBL, WIDTH;TTWIDTH CODE;TTCODE ALT;TTALT ECHO;TTECHO LC;TTLC PAYGE;TTPAGE TAB;TTTAB FILL;TTFILL FLAGG;TTFLAG CTRL;TTCTRL GAG;TTGAG DELAY;TTDELAY ZBLOCK 10 0 AUX, LOC;GENLOC FILES;GENFIL READO;GENREA VERS;GENVER ZBLOCK 10 0 PAGE WIDTH, "W;"I;"D;"T;"H;0 LC, "L;"C;0 LV8E, "L;"V;4000+"8;4000+"E;0 CODE, "C;"O;"D;"E;0 ALT, "A;"L;"T;4000+"M;4000+"O;4000+"D;4000+"E;0 ECHO, "E;"C;"H;"O;0 PAYGE, "P;"A;"G;"E;0 TAB, "T;"A;"B;0 LOC, "L;"O;"C;4000+"A;4000+"T;4000+"I;4000+"O;4000+"N;0 FILES, "F;"I;"L;"E;4000+"S;0 READO, "R;"E;"A;"D;4000+"O;4000+"N;4000+"L;4000+"Y;0 VERS, "V;"E;"R;4000+"S;4000+"I;4000+"O;4000+"N;0 PARITY, "P;"A;"R;4000+"I;4000+"T;4000+"Y;0 DENSITY,"D;"E;"N;4000+"S;4000+"I;4000+"T;4000+"Y;0 FILL, "F;"I;"L;"L;0 FLAGG, "F;"L;"A;"G;0 CTRL, "C;"T;"R;"L;0 EVEN, "E;4000+"V;4000+"E;4000+"N;0 ODD, "O;4000+"D;4000+"D;0 DELAY, "D;"E;"L;"A;"Y;0 GAG, "G;"A;"G;0 PAGE LPWDTH, 0 JMS I (GETWID JMS LPTST1 TAD NUM CMA DCA I (7200 JMP I LPWDTH LPTST1, 0 TAD I (7201 SPA CLA JMP L645 TAD VNO JMS I [BRANCH -1;OLDERR -2;LPTOK ZBLOCK 4 0 JMP I [NEWERR LPTOK, JMP I LPTST1 L645, JMS I [PRINT TEXT /? CAN'T AFFECT ANNALEX LPT/ JMP I [GOAWAY ASRTST, 0 TAD DHI SPA CLA JMP I ASRTST JMS I [PRINT TEXT /? CAN'T - NOT KL8E HANDLER/ JMP I [GOAWAY GENVER, 0 TAD NO SZA CLA JMP I [SYNTAX JMS I [ALPHA JMP BADV DCA NUM TAD NUM AND (40 SZA CLA JMP BADV TAD NUM AND (37 DCA I VNOPTR JMP I GENVER GENREA, 0 CDF 10 TAD I DCWPTR CLL RTL CLL RAL TAD NO RAR CML RAR RAR DCA I DCWPTR CDF 0 JMP I GENREA GENFIL, 0 CDF 10 TAD I DCWPTR CLL RAL CLL RAL /ZERO LINK TAD NO RAR CML RAR DCA I DCWPTR CDF 0 JMP I GENFIL BADV, CLA JMS I [PRINT TEXT /? BAD VERSION LETTER/ JMP I [GOAWAY CRLF, 0 TAD [215 JMS I (TYPE TAD [212 JMS I (TYPE JMP I CRLF PAGE LPLV, 0 JMS I (LPTST1 TAD NO CLL RTL RTL TAD (4 DCA I (7201 JMP I LPLV LPLC, 0 JMS I (LPTST1 TAD NO CLL RTL RTL RAL CIA DCA I (7202 JMP I LPLC TTALT, 0 JMS I [TTST1 JMP I [NOTIMPL JMP I TTALT TTECHO, 0 JMS I [TTST1 TAD NO SZA CLA TAD (SKP CLA-SZA TAD (SZA DCA I (7200+120 JMP I TTECHO TTPAGE, 0 JMS I (ASRTST TAD VNO JMS I [BRANCH -1;OLDERR -2;OLDERR -3;OLDERR -4;PAGOK ZBLOCK 2 0 JMP I [NEWERR PAGOK, TAD I (7200+216 TAD (-SNA SZA CLA JMP I [REASEM TAD NO SNA CLA TAD (SZA CLA-CLA TAD (CLA DCA I (7200+216 JMP I TTPAGE TTTAB, 0 JMS I [TTST1 JMS I [GETC SNA JMP TTEO TAD (-"/ SNA CLA JMS I [GETC TAD (-"N SZA CLA JMP I [SYNTAX JMP NOTEC TTEO, TAD NO SNA CLA TAD (5000 TAD L200 JMS I (TECO NOTEC, JMS I [SRCH L200, 200;100;7 JMP I [REASEM DCA TEMP STA CLL RAL /-2 TAD TEMP DCA T2 TAD TEMP TAD (3 DCA T3 TAD NO SNA CLA JMP SETAB TAD TEMP TAD (-4 DCA T4 TAD T4 AND (77 TAD (1200 /TAD TTY240 DCA I T2 TAD (SZA CLA DCA I T3 JMP I TTTAB SETAB, TAD TEMP TAD (-12 DCA T4 TAD I T4 DCA I T2 TAD (SKP CLA DCA I T3 JMP I TTTAB PAGE TTFILL, 0 JMS I [TTST1 JMS I [SRCH 200;100;1377 JMP I [REASEM TAD (-1 DCA TEMP TAD NO CLL RAL TAD (2 TAD TEMP DCA T2 TAD I T2 DCA I TEMP JMP I TTFILL REASEM, JMS I [PRINT TEXT /? CAN'T - MUST REASSEMBLE KL8E SOURCE/ JMP I [GOAWAY TTDELAY,0 JMS I [TTST1 JMP I [NOTIMPL JMP I TTDELAY /ENTER WITH PTR TO POSSIBLE KEYWORD IN AC KEYSRCH,0 DCA KPTR KL, TAD I KPTR ISZ KPTR SNA JMP GOTKEY CIA DCA TEMP JMS I [ALPHA /IS IT ALPHANUMERIC? JMP EOK /NO TAD TEMP /COMPARE CLL RAL /LOW ORDER 11 BITS SNA CLA JMP KL /MATCHED, KEEP LOOKING JMP I KEYSRCH /DIDN'T MATCH EOK, JMS I [BACKC TAD TEMP CIA /INPUT STREAM RAN OUT OR HIT SPACE SPA CLA JMP GOTKEY /SPACE OR EOL MATCH FLAGGED CHARACTER JMP I KEYSRCH KPTR, 0 GOTKEY, JMS I [SCAN STA /SKIP EXTRA STUFF JMS I [SPACE ISZ KEYSRCH /TAKE GOOD RETURN 2 JMP I KEYSRCH PTRTBL, ZBLOCK 4 0 PTPTBL, ZBLOCK 4 0 PAGE TTGAG, 0 JMS TTST1 JMP I [NOTIMPL JMP I TTGAG TTFLAG, 0 JMS TTST1 JMS I [SRCH 200;200;247 JMP I [REASEM TAD (-2 DCA TEMP TAD NO SNA CLA TAD (SZA CLA-CLA TAD (CLA DCA I TEMP JMP I TTFLAG TTLC, 0 JMS TTST1 JMS I [SRCH 200;200;377 JMP I [REASEM TAD (5 DCA TEMP TAD I TEMP CLL TAD [200 SNL CLA JMP I [REASEM TAD NO SNA CLA TAD [40 /SNA CLA TAD (7610 /SKP CLA DCA I TEMP JMP I TTLC TTCTRL, 0 JMS TTST1 JMP I [NOTIMPL JMP I TTCTRL TTWIDTH,0 JMS GETWID JMS TTST1 TAD NUM AND [7 SZA CLA JMP I [BADWID TAD NUM TAD [-200 SNA CLA JMP I [BADWID JMS I [SRCH 200;200;7600 JMP I [REASEM IAC DCA TEMP TAD I TEMP AND [177 TAD (177+7200 DCA T2 TAD TEMP IAC DCA T3 TAD NUM CIA DCA I T3 TAD I T3 DCA I T2 JMP I TTWIDTH GETWID, 0 TAD NO SZA CLA JMP I [SYNTAX JMS OPTEQ JMS I [NUMBER SNA JMP I (BADWID DCA NUM TAD FLG SZA CLA JMP I [SYNTAX /NO DIGITS TAD NUM AND [7400 SZA CLA JMP I [NUMBIG JMP I GETWID TTST1, 0 JMS I (ASRTST TAD VNO JMS I [BRANCH -1;OLDERR -2;OLDERR -3;TTOK -4;TTOK /V3C ZBLOCK 4 0 JMP I [NEWERR TTOK, JMP I TTST1 OPTEQ, 0 JMS I [GETC TAD (-"= SZA CLA JMP NOE JMS I [SPACE JMP I OPTEQ NOE, JMS I [BACKC JMP I OPTEQ PAGE BADWID, JMS I [PRINT TEXT /? ILLEGAL WIDTH/ JMP I [GOAWAY OPRIN, 0 DCA N3 TAD (-4 DCA OKNT OPLP, TAD N3 JMS DGP TAD N3 RTL RAL DCA N3 ISZ OKNT JMP OPLP JMP I OPRIN DGP, 0 RTL RTL AND [7 TAD [60 JMS I [TYPE JMP I DGP OKNT, 0 N3, 0 NUM2, 0 GTEM, 0 SRCH, 0 TAD I SRCH ISZ SRCH TAD (7200-1 DCA XR1 TAD I SRCH ISZ SRCH CIA DCA CNT TAD I SRCH CIA DCA TEMP ISZ SRCH SRLUP, TAD I XR1 TAD TEMP SNA CLA JMP SRFND ISZ CNT JMP SRLUP JMP I SRCH SRFND, ISZ SRCH TAD XR1 JMP I SRCH GENLOC, 0 TAD NO SZA CLA JMP I [SYNTAX JMS I [ONUM DCA NUM2 TAD FLG SZA CLA JMP I [SYNTAX JMS I [GETC DCA TEMP TAD TEMP SNA JMP ENOL TAD (-"= SZA CLA JMP I [SYNTAX ENOL, TAD DHI SPA CLA TAD (-200 TAD (-200 CLL TAD NUM2 SZL CLA JMP I [NUMBIG TAD NUM2 TAD (7200 /BASE OF HANDLER DCA NUM2 TAD TEMP SNA CLA JMP ODT GETNEW, JMS I [ONUM DCA NUM TAD FLG SZA CLA JMP I GENLOC JMS I [GETC SZA CLA JMP I [SYNTAX TAD NUM DCA I NUM2 JMP I GENLOC ODT, TAD I NUM2 JMS OPRIN TAD ("/ JMS I [TYPE TAD I [READ DCA GTEM /SAVE CHAIN STATUS JMS I [READ TAD [LINBUF DCA LINPTR TAD GTEM DCA I [READ JMP GETNEW PAGE MTAPAR, 0 TAD NO SZA CLA JMP I [SYNTAX JMS MTST1 TAD LINPTR DCA SAVPTR TAD (EVEN JMS I [KEYSRCH SKP JMP SETE TAD SAVPTR DCA LINPTR TAD (ODD JMS I [KEYSRCH JMP I [SYNTAX TAD (400 SETE, TAD (2 DCA I (7200 JMP I MTAPAR MTST1, 0 TAD VNO JMS I [BRANCH -1;OLDERR -2;OLDERR -3;OLDERR -4;MTOK -5;MTOK -6;MTOK ZBLOCK 4 0 JMP I [NEWERR MTOK, JMP I MTST1 MTADEN, 0 JMS MTST1 TAD NO SZA CLA JMP I [SYNTAX JMP I [NOTIMP JMP I MTADEN MTAFIL, 0 JMS MTST1 TAD NO DCA I (7201 JMP I MTAFIL BADCOD, JMS I [PRINT TEXT /? UNKNOWN CARD CODE/ JMP I [GOAWAY /SUPPOSED TO WORK ON ALL VERSIONS CDCODE, 0 TAD NO SZA CLA JMP I [SYNTAX JMS I (OPTEQ JMS I [NUMBER TAD (-32 /026 SNA JMP C026 TAD (32-35 /029 SZA CLA JMP BADCOD JMS CHANGE LIST1;LIST2 JMP I CDCODE C026, JMS CHANGE LIST1;LIST3 JMP I CDCODE CHANGE, 0 TAD I CHANGE DCA P1 ISZ CHANGE TAD I CHANGE DCA P2 ISZ CHANGE CHLUP, TAD I P1 SNA JMP I CHANGE TAD (7200 /BASE OF HANDLER DCA P3 TAD I P2 DCA I P3 ISZ P1 ISZ P2 JMP CHLUP P1, 0 P2, 0 P3, 0 PAGE LIST1, 304;305;306 314;315;316 324;325;326;327 334;335;336 0 LIST2, 3203;4007;3502 7514;0577;3637 0104;1211;3374;0641 7316;3410;1376 LIST3, 7735;4076;0774 3314;1002;0305 3204;1273;3606;1341 3716;1175;3401 TECNAM, FILENAME TECO.SV TECO, 0 DCA SA TAD (TECNAM DCA ARG1 CLA IAC /LOOKUP ON SYS CIF 10 JMS I USR 2 ARG1, TECNAM /STARTING BLOCK 0 JMP I TECO /NOT FOUND TAD ARG1 DCA BLKN JMS I (7607 100 /READ 1 PAGE FROM TECO 7000 /BUFFER BLKN, 0 JMP I [SYSERR TAD BLKN DCA BLKN2 TAD SA DCA I (7002 /REL LOC 2 IS S.A. JMS I (7607 4100 7000 BLKN2, 0 JMP I [SYSERR JMP I TECO SA, 0 PAGE /7000-7177 BUFFER FOR TECO CCB /7200-7577 BUFFER FOR HANDLER FIELD 0 *200 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 | /2 PDP-8 OS/8 CROSS REFERENCE / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /CREF IS A CROSS REFERENCING PROGRAM FOR THE OS/8 ASSEMBLERS, /PAL8 AND SABR. THE PURPOSE OF CREF IS: / 1) PROVIDE A SEQUENCE NUMBERED (DECIMAL) OUTPUT LISTING / 2) PROVIDE A LIST OF ALL USER DEFINED SYMBOLS AND LITERALS / AND THE SEQUENCE NUMBER OF THE LINES IN WHICH THEY OCCUR /FIXES FOR MAINTENANCE RELEASE: /1. 1975 COPYRIGHT, VERSION 4, EDIT 1 /2. UNIFIED PAGE SIZE INTO ONE PLACE (& MADE IT WORK) /3. OUTPUT EXTRA FORM FEED AT END /4. MADE /A MEAN KEEP CREFLS.TM INSTEAD OF /E /FIXES FOR V3D: /INSTALLED ALL PUBLISHED PATCHES /DETAILS OF CREF. /CORE UTILIZED /FIELD 0 /0-3377: MAINLINE CREF CODE /4200-4577: INITIALIZATION CODE.EXECUTED ONCE AT BEGINNING /5600-6177: LATER OVERWRITTEN /DEVICE HANDLERS + BUFFERS ALLOCATED ACCORDING /TO REQUIREMENTS OF DEVICES. /USES 3400-5577 FOR INPUT HANDLER, OUTPUT HANDLER, + INPUT BUFFER /7200-7577: OUTPUT BUFFER /5600-7174: USED FOR REFERENCE STORAGE /FIELD 1 /0-NSYM*4+10 NSYM=NO. OF SYMBOLS.(USER+PERMANENT+LITERALS). /7424-7577 PSEUDO OP TABLE /THE REMAINDER IS USED FOR REFERENCES DURING PASSES GREATER THAN ONE /SYSTEM SCRATCH USED. /IF CREF DECIDES THAT MORE THAN 2 PASSES ARE REQUIRED, THE SYMBOL /TABLE IS SEGMENTED AT AN OPTIMUM POINT, AND PART IS SAVED /IN SCRATCH BLOCKS 27-50 FOR A THIRD (OR LARGER) PASS. /MAJOR ROUTINES AND CODE SECTIONS /MAIN-START OF TEXT PROCESSING.CHECKS FOR VALID LINE.READS AND WRITES /TEXT LINES /CVTSEQ CONVERTS SEQUENCE NUMBERS FROM OCTAL TO DECIMAL AND / WRITES THEM INTO THE OUTPUT BUFFER /GETLIN- GET A LINE OF INPUT INTO LINE BUFFER /WRTLIN- WRITE A LINE OF TEXT INTO OUTPUT BUFFER /ANALYZ- LINE SCANNING BEGINS.ALL SYMBOLS COLLECTED HERE /PACK- CHARACTER PACKING ROUTINE. THE SCHEME USED MAPS LETTERS /A-Z AND [,],\,^ INTO 0-37. 0-9 INTO 40-51 / THE PACKING IS: CHAR1-300^52+CHAR2-300 /SYMCHK- BINARY SYMBOL TABLE SEARCH /ENTRY- MAKES ENTRIES IN USER SYMBOL TABLE /BUMP- BUMPS REFERENCE COUNTER OF SYMBOLS IN PASS 1 /ENDPAS- TERMINATES A PASS THROUGH INPUT /PASSN2- FILLS IN REFERENCE STORAGE ARE DURING PASSES / AFTER PASS ONE /DUMP- DUMPS CREF TABLE TO OUT BUFFER /SWITCHES IN CREF: /Q=INPUT IS SABR CODE /R=INPUT IS RALF CODE /P=DISABLE LISTING OUTPUT. RE ENABLE FOR CREF TABLE /X=DON'T CREF LITERALS /M=MAMMOTH FILE(2 PASSES) /E=DON'T ELIMINATE CREFLS.TM /U=/P + NO SYMBOL TABLE DECIMAL PAGLEN=66 /V3C MOST PAPER HAS 66 LINES PER PAGE OCTAL PAGLEN=PAGLEN-6 /HEADINGS VERSN="5 PATCHL="B /PAGE ZERO FOR CREF *10 /AUTO INDEX REGISTERS XRLINE, SYMTAB-1 /USED TO MOVE UP SYMBOL TABLE XRLIT, -1 /DITTO XRSYM1, 0 XRSYM2, 0 /THESE ARE USED IN SEARCHING SYMBOLS OUSAVX, 7611 /USED TO SAVE ARGS FOR /M *20 TXTBEG, LINBUF+12 /TEXT STARTS HERE MARGIN, LINBUF-1 /LINE BUFFER COUNT, 0 /GENERAL COUNTER CHAR, 0 /HOLDS CHARACTER TO EXAMINE SEQNO, 0 /SEQUENCE NO. SAVE, 0 TEMP, 0 TEMP1, 0 /THESE THREE ARE TEMPORARY STORAGE DSWIT, 0 RSWIT, 0 /CD SWITCH WORDS MLF, -212 /-LINE FEED SYMCNT, -6 /ALLOW 6 CHARACTER SYMBOLS ISYM, SYM1 /POINTER TO SYMBOL COLLECTOR PSWCH, 0 /PACK SWITCH..LEFT OR RIGHT HALF SYM1, 0 SYM2, 0 SYM3, 0 /COLLECT SYMBOLS HERE USER, 0 /USER MUST FOLLOW SYM3! 110 /INITIAL SYMBOL TABLE ENTRIES PSEUDO, 0 0 /THESE 2 GET FILLED IN AT INITIALIZATION PASN2, PASSN2 /IF NOT PASS 1 GO HERE WITH A SYMBOL PASSG1, -1 /=0 IF NOT PASS1 MAXFLD, 0 /-# OF FIRST NON-EXISTENT FIELD CONST, 0 /EITHER 0 OR 96(10) FLDPTR, 0 /POINTER TO CORE FIELD USR, 200 /MONITOR IN CORE..CHANGED TO 7700 DOLLAR, DOLL1 SYMFLD, 2 /FIELDS WITH SYMBOLS: BITS 5-11 MASKF, 0 /MASK FOR ABOVE WORD /THESE ARE THE DEFAULT PARAMETERS FOR THE I/O ROUTINES /AJUSTED ACCORDING TO REQUIREMENTS OF DEVICES REQUESTED OUCTL=4200 OUBUF=7200 OUDEVH=4000 /VARIABLE-MAY ALSO BE 3600 OUFLD=OUCTL&70 INCTL=0400 INBUF=4600 /ALSO 4200 INDEVH=3400 INRECS=2 /ALSO 3 INFLD=INCTL&70 /(SUBJECT TO CHANGE WITHOUT NOTICE!) SYMADD, 0 /CONTAINS SYMBOL ADDRESS SYMNUM, 0 /ABOVE MOD 4 K0=USER BUFFER, 0 /POINTER FOR UNPACKING R=52 RAD=52 /RADIX FOR CONVERTING SYMBOLS ADDER, 0 SYSM, 0 BASE, 0 /THESE ARE USED TO END A PASS SYMLIM, 0 /UPPER LIMIT FOR SYMBOL REF TABLE FINI, 0 IOSR, 0 JMS I [7607 CNTROL, 4010 /THIS IS ON PAGE ZERO MAINLY CTPTR, 4 /BECAUSE CTPTR IS USED A LOT SCRATCH=27 SCRATCH /SYSTEM SCRATCH FOR OVERFLOW SKP /ERROR ON SYS!!! JMP I IOSR HIOERR, JMS I [ERROR HNDERR LNPRPG, -PAGLEN /# LINES OF TEXT PER PAGE LINES, -PAGLEN /V3C MASTER COPY THOUS, 6030 /CONVERSION TABLE..OCTAL-DECIMAL 7634 7766 7777 FPUT, STORIT /INITIALLY POINTS TO DCA I XRLINE M12=THOUS+2 M1=THOUS+3 DPAT, 0 DCA I (NOFIRM DCA I (NOFORM JMP I DPAT *200 JMP I (ST1 /INITIALIZATION GETS DESTROYED BREAK, JMP I (CHAIN /CHAIN ENTRY POINT ZBLOCK 7 /BREAK TABLE. HOLDS SYMBOL /NUMBERS DURING VARIOUS PASSES /OF CREF. THE ENTRIES ARE THE NUMBER /OF THE LARGEST SYMBOL /WHOSE REFERENCES ARE IN A PARTICULAR /FIELD. THE 0TH ENTRY CORRESPONDS TO /FIELD 0. ERROR, 0 CLA CDF 0 TAD I ERROR DCA BUFFER TAD [-6 DCA SYMCNT /12 CHARACTER MESSAGES TAD TTY /POINT TO TTY OUT ROUTINE DCA [OCHAR TAD I BUFFER JMS I [DIVIDE /CONVERT AND PRINT MESSAGE ISZ SYMCNT JMP .-3 JMP I [7605 TTY, TTYPRT /THE INPUT LINE IS STORED HERE. XRLINE POINTS TO VARIOUS /PLACES THROUGHOUT THE SCAN, AND CHAR HOLDS THE CORRESPONDING /CHARACTER WHILE WE EXAMINE IT. LINBUF=. LITBUF=.+6 VERTST=.+4 *251 FILEXT, 0 CDF 10 TAD I (7604 CDF 0 SNA TAD (1423 CDF 10 DCA I (7604 CDF 0 JMP I FILEXT P2ADJ, 0 TAD I (PASS2 SNA JMP I P2ADJ DCA I (OUBLK /LAST BLOCK WRITTEN TO CDF 10 TAD I OUSAVX CDF 0 DCA I (OUELEN /SIZE OF HOLE CDF 10 TAD I OUSAVX DCA LNPRPG /NO. LINES IN LAST BLK WRITTEN TAD I OUSAVX /NO. BLKS WRITTEN SO FAR CDF 0 JMP I (MP2 /NO ENTER MORCOR, 0 CLA CLL IAC DCA MAXFLD /IN CASE NOT DEFINED TAD I (7777 AND (70 SNA JMP I MORCOR /USE OLD WAY TO DETERMINE CLL RTR RAR /NEED IT HI 3 DCA MAXFLD JMP I (DONCOR OTYPE, 0 CDF 10 TAD I [7600 /DETERMINE WHAT TYPE OF DEVICE AND [17 DCB=7760 TAD (DCB-1 DCA Q TAD I Q /CHECK DEVICE CONTROL BLOCK CDF 0 JMP I OTYPE Q, 0 *400 /MAIN IS THE START OF CREF.(IF SABR, NXTLIN IS START). /AT MAIN WE SCAN A LINE OF TEXT FOR BINARY DATA. IF NONE IS FOUND, /THE LINE IS WRITTEN OUT AND A NEW LINE READ. IF BINARY IS FOUND, /THE SEQUENCE NUMBER OF THE LINE IS PLACED IN THE OUTPUT /BUFFER AND THE ANALYSIS BEGINS AT ANALYZ. MAIN, JMS I [FORM /FORM FEED (CR/LF) JMS I [HEADER /SKIP HEADER JMS I (GETLIN /AND ONE CR/LF NOTBIN, JMS WRTLIN NXTLIN, JMS I (GETLIN TAD I XRLINE DCA CHAR JMS I [CHECK /CHECK FOR ALPHA LINE 301 -336 JMP NOALPH NOFIRM, ISZ LNPRPG /NEED A FORM FEED YET? JMP NOTBIN /NOT YET JMS I [FORM /NOW!!! JMP NOTBIN NOALPH, TAD CHAR TAD MCTLD /IF RUB OUT, USED /D SNA JMP I [ENDPAS /CAN'T OUTPUT SYM TABLE TAD (163 /CHECK FOR FORM FEED SNA JMP MAIN /YES.. TAD (-41 /IF ------, HE USED /T(DUMMY!) SNA CLA JMP MAIN /GIVE HIM A FORM FEED NOFORM, ISZ LNPRPG /=0 AFTER PASS1 NEW PAGE? SKP /SKIP A FORM FEED JMS I [FORM ISZ SEQNO /BUMP SEQUENCE JMP MAIN2 TAD [140 DCA CONST MAIN2, JMS I [PASTST /STILL PASS ONE? JMP MAIN3 TAD SEQNO JMS CVTSEQ TAD [-3 /3 SPACES JMS I [SPACE MAIN3, TAD CHAR TAD [-215 SNA CLA JMP NOTBIN JMP I [ANALYZ MCTLD, -377 /RUB OUT /THIS ROUTINE CONVERTS SEQUENCE NUMBERS TO DECIMAL NUMBERS AND /PUTS THEM INTO THE OUTPUT BUFFER. IT IS USED WHEN PRINTING /THE CREF TABLE ALSO /THE CALLING SEQUENCE IS: AC=OCTAL NUMBER TO BE CONVERTED. /THE OUTPUT IS AUTOMATICALLY 4 DIGITS. POSPT=TEMP1 DIGPT=MASKF CVTSEQ, 0 TAD CONST DCA SAVE /TEMP STORE TAD CONST SZA CLA TAD [4 DCA DIGIT1 DCA DIGIT1+1 DCA DIGIT1+2 DCA DIGIT1+3 /ZERO CONVERSION AREA TAD [-4 DCA COUNT TAD SAVE CLL /SEE IF SEQUENCE IS ABOVE 8000(10) TAD CONST /EITHER 0 OR 140(8) SNL JMP CVT2 /O.K. DCA SAVE /CORRECTED NUMBER TAD [10 DCA DIGIT1 /PUT AN 8 INTO THERE FOR PRINTING CVT2, CLA TAD (DIGIT1 DCA DIGPT TAD (THOUS DCA POSPT TAD SAVE RPEAT, CLL TAD I POSPT /POINTS TO -1000,-100,-10, OR -1 SNL /IF LINK ON,WE DID TOO MUCH JMP ADDUP /COLLECT THE CONVERTED DIGIT ISZ I DIGPT /BUMP THE COUNTER DIGIT1-DIGIT1+3 JMP RPEAT ADDUP, CIA /RESTORE THE LAST ONE TAD I POSPT CIA ISZ POSPT ISZ DIGPT ISZ COUNT /DONE ALL 4? JMP RPEAT TAD [-4 /YES..OUTPUT THE CONVERTED NUMBERS DCA COUNT TAD (DIGIT1 DCA DIGPT SPCLUP, TAD I DIGPT TAD ZSPRES /LEADING ZERO SUPPRESSION DCA ZSPRES TAD ZSPRES SNA CLA /ZSPRES IS 0 UNTIL A VALID # IS FOUND TAD (-20 TAD I DIGPT TAD [260 JMS I [OCHAR ISZ DIGPT ISZ COUNT JMP SPCLUP DCA ZSPRES JMP I CVTSEQ DIGIT1, 0 0 0 0 ZSPRES, 0 /WRTLIN TRANSFERS INPUT LINE TO OUTPUT BUFFER WRTLIN, 0 TAD MARGIN DCA XRLINE /RESET MARGIN TO LEFT OLINE, TAD I XRLINE /PICK UP TEXT CHARACTER DCA CHAR TAD CHAR SNA /IF NULL,WAS PREMATURE TERMINATOR JMP FLUSH /YES. READ AND WRITE THE REST JMS I [OCHAR /OUTPUT THE CHARACTER TAD CHAR TAD MLF /WAS THIS END OF LINE? SZA CLA JMP OLINE /NO..LOOP AGAIN JMP I WRTLIN FLUSH, JMS I [HEADER JMP I WRTLIN /OVERFLOW NOT IN BUFFER *600 /ANALYZ IS A WORK HORSE. IN IT CHARACTERS ARE EXAMINED AND /SYMBOLS ARE BUILT UP. IF A SYMBOL OR A REFERENCE TO A /SYMBOL IS FOUND,THE APPROPRIATE ACTION IS TAKEN;I.E. /EITHER ENTERING A NEW SYMBOL, BUMPING THE RFERENCE COUNTER, /OR BOTH. ANALYZ, TAD SEMISV /IF #0, LAST WAS SEMICOLON SNA TAD TXTBEG /IF=0, START NORMALLY DCA XRLINE SCAN, TAD I XRLINE DCA CHAR JMS I [CHECK /ALPHANUMERIC CHECK 301 -332 SKP /NONE..TEST FOR SPECIAL CHARS JMP PAKIT /FOUND A LETTER PACK AWAY JMS I [CHECK /TEST FOR 0-9 260 -271 SKP /NOPE..COULD BE SABR JMP SCAN1 SCAN3, JMP TSTIT /IF SABR, THIS LOC IS AND 0 JMS I [CHECK /TEST FOR [,],\,AND ^ 333 -336 SKP JMP PAKIT /VALID SABR CHARACTERS TSTIT, JMS REPACK TAD CHAR /IS THIS A ;? TAD (-273 /IF SO, SAVE PLACE ON LINE SZA CLA JMP .+3 /IF ; SAVE PLACE ON LINE TAD XRLINE DCA SEMISV TAD SYM1 /IS THERE A LEGAL SYMBOL? SNA CLA JMP TSTEND /NO..LOOK FOR A LINE FEED TAD CHAR TAD (-257 SNA CLA /A COMMENT? IAC /YES..NEED SPECIAL RETURN DCA SLSWIT JMS I [SYMCHK /THIS IS EITHER A REFERENCE OR A /DEFINITION OR A PERMANENT SYMBOL,PSEUDO PSEUDO /CHECK PSEUDOS FIRST HC1, JMP USSYM /NOT A PSEUDO-OP /BECOMES JMP PATCH IF /M USED TAD SYMADD TAD [3 DCA SAVE /SYMCHK RETURNS ADDRESS OF SYMBOL IN SYMADD CDF 10 TAD I SAVE DCA SAVE CDF 0 JMS I (CLEAR /WIPE OUT PSEUDO OP JMP I SAVE /PERFORM THE NECESSARY OP FOR PSEUDO PATCH, TAD SYM1 RTL PATCH1, CLA SZL SPA /LG-LH SPLIT JMP B USSYM, JMS I [PASTST JMP I PASN2 JMS I [SYMCHK USER /CHECK PERMANENT AND USER SYMBOLS JMP NTER /DIDN'T FIND IT; SO WE HAVE TO ENTER IT JMS I (TSTPRM /FOUND;TEST FOR PERMANENT SYMBOL JMP B /WAS A PERMANENT SYMBOL JMP BMPIT /FOUND AND NOT PERMANENT;INCREASE THE /REFERENCE COUNTER BY ONE NTER, JMS I [ENTRY /ENTER THE SYMBOL BY PUSHING DOWN ALL /THE ONES BELOW IT BMPIT, JMS I [BUMP /AND INCREASE THE REFERENCE COUNT B, JMS I (CLEAR /SETUP FOR NEXT TAD SLSWIT /WAS LAST A /? SZA CLA JMP I (NOTBIN JMP SCANER TSTEND, TAD CHAR TAD MLF /ARE WE DONE WITH THIS LINE? SZA CLA JMP .+3 /IF LF, CLEAR OUT SEMICOLON CLRSEM, DCA SEMISV JMP I (NOTBIN TAD CHAR TAD (-257 SNA /COMMENT LINE? JMP CLRSEM TAD (15 /A "? SNA ISZ XRLINE /YES..SKIP NEXT LETTER TAD [-2 /A $? SNA JMP I DOLLAR TAD [-4 SNA /TEST FOR ( JMP I (LIT1 TAD (-63 SZA CLA /TEST FOR [ JMP SCANER /NONE OF THEM KEEP GOING JMP I (LIT2 SCAN1, TAD SYM1 /IF WE DON'T HAVE A SYMBOL SNA CLA /DON'T PACK THIS CHARACTER JMP SCAN PAKIT, TAD CHAR JMS I [PACK /PACK A CHARACTER JMP SCAN REPACK, 0 /RESET SYMBOL AREA TAD [-6 DCA SYMCNT /SYMBOL COUNTER..6 CHARS TAD (SYM1 DCA ISYM DCA PSWCH JMP I REPACK SEMISV, 0 SLSWIT, 0 SCANER, TAD CHAR /IF LAST WAS ; READ IN OVERLAY TAD (-273 SNA CLA JMP I (NOTBIN JMP SCAN SUB3, 0 /SUBTRACTS 3 FROM CTPTR TAD [-3 TAD CTPTR DCA CTPTR JMP I SUB3 *1000 /THE PACKING SCHEME IS THE SAME AS THAT USED IN PAL8. THAT IS /IN EACH WORD WE HAVE 2 CHARS. CHAR1-300^45+CHAR2-300. /PERMANENT SYMBOLS HAVE THE FIRST WORD SET TO A NEGATIVE. PACK, 0 DCA BLAH TAD SYMCNT SMA CLA /OVERFLOW PROTECT JMP I PACK TAD BLAH AND [77 /STRIP IT TAD (-37 /INCLUDE VALID SABR CHARS SMA SZA TAD (-20 /NUMBERS GET MAPPED: 40-51 TAD (37 /LETTERS ARE MAPPED:01-37 ISZ PSWCH /WHICH HALF? JMP LEFT TAD I ISYM DCA I ISYM ISZ ISYM JMP PCKOUT LEFT, CLL RAL /*2 DCA TLOW TAD TLOW CLL RTL DCA SAVE /*10 TAD SAVE CLL RTL /*40 TAD SAVE TAD TLOW /*52!! DCA I ISYM CLA CMA /RESET FLIP FLOP DCA PSWCH PCKOUT, ISZ SYMCNT NOP JMP I PACK BLAH, 0 /SYMCHK IS THE BINARY SEARCH ROUTINE FOR CREF. SYMBOLS /ARE A GROUP OF FOUR ENTRIES:THE FIRST THREE WORDS ARE /THE STRIPPED-40 REPRESENTATION OF THE SYMBOL. THE LAST /IS THE REFERENCE COUNTER (IN THE CASE OF A USER SYMBOL) OR /A -1 (IN THE CASE OF A PERMANENT SYMBOL). IN PSEUDO OPS /THE FOURTH WORD DESCRIBES THE DESTINATION OR ACTION /TO BE PERFORMED BY THAT PSEUDO OP. /THE TABLE USER,0 HAS ENTRIES WHICH ARE THE SYMBOL NUMBER /AND NOT THE ABSOLUTE CORE LOCATION OF A SYMBOL. /CALLING SYMCHK: / JMS SYMCHK / TABLE /FIRST WORD OF TWO WHICH GIVES THE LIMITS /MOD 4 OF THE APPROPRIATE TABLE /SYMCHK RETURNS WITH THE NUMBER OF THE SYMBOL IN SYMNUM /AND THE CORE ADDRESS OF THE SYMBOL IN SYMADD. IF THE /SYMBOL IS NOT FOUND, THESE WORDS CONTAIN THE PROPER LOCATION /FOR THE SYMBOL. SYMCHK, 0 TAD I SYMCHK DCA THI DCA LAST TAD I THI /GET LIMITS OF TABLE DCA TLOW /LOW LIMIT ISZ THI TAD I THI DCA THI /HIGH LIMIT COMP, TAD TLOW CIA TAD THI CLL RAR /HALF DIFFERENCE BETWEEN THE LIMITS SNA /IF THIS IS ZERO, WE'RE DONE ISZ LAST /THIS WILL BE LAST TRY TAD TLOW /FORM THE NUMBER OF THE ENTRY DCA SYMNUM /WE ARE GOING TO TEST NOW JMS SETXR /SET UP INDICES FOR TEST ISZ COUNT /WE ONLY WANT -3 IN COUNT! S1, CLL CDF 10 TAD I XRSYM2 /SYMBOL TABLE ENTRY CDF 0 AND [3777 /MASK PERMANENT SYMBOL BIT CMA /USE ONE'S COMPLEMENT TAD I XRSYM1 /OUR COLLECTED SYMBOL CMA /0 AC IF EQUAL SZA CLA /WATCH THE LINK!! JMP COMPR /NOW TEST FOR HI OR LOW COMPARISON ISZ COUNT JMP S1 ISZ SYMCHK /TAKE FOUND ENTRY JMP OUT1 COMPR, TAD LAST /LAST GASP? SZA CLA JMP OUT2 /YEP TAD SYMNUM /LINK TELLS THE TALE! SNL JMP COMP-1 /ADJUST HIGH LIMIT DCA TLOW JMP COMP OUT2, TAD SYMNUM SZL IAC DCA SYMNUM OUT1, TAD SYMNUM /ADDING THE FIRST ENTRY AFTER SZA /AN EXPUNGE WILL CAUSE SYMNUM TO BE 0 /AUTOMATICALLY IT HAS TO BE 1 JMP .+3 ISZ SYMNUM JMP OUT1 CLL RTL /FORM SYMADD FROM SYMNUM DCA SYMADD /CORE ADDRESS OF THE SYMBOL ISZ SYMCHK JMP I SYMCHK THI, 0 TLOW, 0 LAST, 0 /THESE TABLES DEFINE THE LIMITS OF CORE STORAGE IN CREF. /BASTBL GIVES THE START LOC WHERE REFERENCES WILL BE STORED. /LTTBL GIVES THE LO CORE LIMIT OF THOSE REFS. THERE IS ONE ENTRY FOR /EACH FIELD BASTBL, 7174 /THIS TABLE GIVES THE BASE 7424 /LOCATIONS INEACH FIELD WHERE THE 7574 /REFERENCES BEGIN 7574 /REFS START HERE AND BUILD TOWARD LOWER 7574 /CORE ADDRESSES 7574 7574 7574 LTTBL, DOLL1 /THIS TABLE GIVES THE LOW 10 /CORE ADDRESS OF THE REFS IN EACH FIELD 4 /NOTE:ENDPAS JUGGLES THESE AROUND 4 /TO OPTIMIZE CREF STORAGE 4 4 4 4 DIVE, 0 SNA /IF 0, PRODUCE A SPACE JMP DIVSPC TAD (-37 SMA SZA TAD [-60 TAD [77 DIVSPC, TAD [240 JMP I DIVE SETXR, 0 /SETUP INDEX REGS FOR SEARC,ENTRY TAD SYMNUM /SETUP WHEN FOUND SYMBOL CLL RTL /CORE ADDRESS OF SYMBOL TAD M1 DCA XRSYM2 TAD [SYM1-1 DCA XRSYM1 TAD [-4 DCA COUNT JMP I SETXR *1200 /ENTRY IS SLOW! IT ENTERS A SYMBOL BY PUSHING DOWN WHAT IS /BELOW THE PROPER ENTRY.ENTRY CAN ONLY BE USED IN MAKING /ENTRIES IN THE PERMANENT (USER) SYMBOL TABLE. /ENTRY CONDITIONS:AC SHOULD BE CLEAR! / SYMNUM SHOULD HAVE THE SYMBOL NUMBER OF THE / PROPOSED ENTRY. SYMCHK RETURNS THIS WHEN THE / SEARCH IS UNSUCCESSFUL. ENTRY, 0 JMS I (SETXR /SETUP INDEX REGISTERS TAD USER+1 /CHECK FOR POSSIBLE OVERFLOW CMA /WE DON'T WANT TO WIPE PSEUDO TABLE TAD PSEUDO SPA SNA CLA JMP NMOR /BAD!OVERFLOW HAS OCCURRED ISZ USER+1 /OK..BUMP SYMBOL COUNT TAD USER+1 CLL RTL /CORE ADDRESS OF ENTRY DCA TEMP1 TAD TEMP1 TAD [-4 /GIVES BOTTOM OF TABLE NOW DCA SAVE TAD SAVE /TEST FOR AN 'ADD-ON' ENTRY CMA TAD SYMADD DCA COUNT /-# OF WORDS TO MOVE CDF 10 NTR1, TAD I SAVE DCA I TEMP1 /THE BAD LOOP! CMA TAD SAVE DCA SAVE /I WISH WE HAD A DSZ!(DECREMENT &SKIP ON 0 CMA TAD TEMP1 DCA TEMP1 ISZ COUNT /DONE? JMP NTR1 /UNFORTUNATELY NOT CDF 0 ENTER, CLA /NOW PUT IN OUR ENTRY TAD [-4 DCA COUNT /THE 4TH IS A 0 WORD (USER FOLLOWS SYM3) NTR2, TAD I XRSYM1 CDF 10 DCA I XRSYM2 CDF 0 ISZ COUNT JMP NTR2 JMP I ENTRY NMOR, JMS I [ERROR /SYMBOL OVERFLOW SYMERR TXT, JMS GETC TAD (-240 /IGNORE SPACES SNA CLA JMP TXT TAD CHAR CIA /STRING DELIMITER DCA DELMIT TXT2, JMS GETC TAD DELMIT /REACHED END OF STRING? SNA CLA JMP I [B /YES TAD CHAR /NO..END OF LINE? TAD [-215 SNA CLA JMP I [B JMP TXT2 GETC, 0 TAD I XRLINE DCA CHAR TAD CHAR JMP I GETC /GET A CHAR;STORE IT, RETURN IN AC DELMIT, 0 BUMP, 0 /ROUTINE TO BUMP REFERENCE COUNTERS TAD SYMADD TAD [3 DCA SAVE /ADDRESS OF REFERENCE COUNTER CDF 10 TAD I SAVE SPA CLA /IF 4000 BIT ON, AN EXTRA ENTRY HAS /ALREADY BEEN MADE FOR THIS SYMBOL JMP ONEISZ TAD CONST SNA CLA /IS SEQNO >4095? JMP ONEISZ /NOT YET TAD [4000 TAD I SAVE DCA I SAVE /MARK IT AS BEING NOTED CMA ONEISZ, TAD M1 /EITHER -1 OR -2 DCA COUNT BUMP2, TAD [3777 /THIS CODE PROTECTS AGAINST AND I SAVE />2048 REFS. IF SIGN BIT EVER BECOMES ISZ I SAVE /NEG. ON THE ISZ,KILL IT!! NOP /USELESS PROTECTION TAD [3 /IF AC GOES NEG. HE DIES!! SPA CLA JMP ERR7 ISZ COUNT JMP BUMP2 CDF 0 JMP I BUMP ERR7, CDF 0 JMS I [ERROR REFERR PTRSET, 0 /THIS ROUTINE TAKES TAD [3 /THE SYMBOL TABLE THAT DCA BUFFER /PRODUCED AND SETS UP EACH REFERENCE DCA SYMNUM /AREA WITH A POINTER INTO THE AREA CLA CMA TAD USER+1 /AND A 0 LOCATION TO HOLD THE DEFINITION CIA /SEQUENCE NO. DCA COUNT PTRST1, TAD [4 /START PICKING UP POINTERS TAD BUFFER DCA BUFFER ISZ SYMNUM /CORRESPONDING SYMBOL NUMBER JMS I (GETFLD /FORM CDF N FOR REFERENCE AREA DCA CDTFLD CDF 10 TAD I BUFFER /IF PERMANENT SYMBOL, THIS LOC=0 SNA /IF SO, SKIP IT JMP PTRST2 TAD M1 DCA SAVE CDTFLD, HLT DCA I SAVE ISZ SAVE /POINT TO INDEX WORD TAD [2 DCA I SAVE PTRST2, CDF 0 ISZ COUNT JMP PTRST1 JMP I PTRSET *1400 /ENDPAS IS ARRIVED AT WHEN A PASS THROUGH THE INPUT HAS BEEN /COMPLETED.SOME COMPLICATED DIDDLING GOES ON HERE. ENDPAS, ISZ PASSG1 JMP I (DUMP /DUMP WHAT WE HAVE JMS I (ENDFIX IAC /POINT TO END OF NEW TABLE DCA USER+1 /YES..THAT BECOMES THE TOTAL NO. /OF SYMBOLS IN OUR NEW TABLE TAD [3777 /O.K...NOW READ IN A SEGMENT AND CNTROL /NOW FORMING READ CONTROL DCA CNTROL TAD [4 /READ SYMBOLS INTO F1 AT LOC.4 DCA CTPTR JMS IOSR /DO THE READ NDPS1, DCA FLDPTR /INITIALLY AT FIELD 0 TAD [6034 DCA I [OUTSW END2, DCA ADDER /ADDER HOLDS THE COUNT OF THE NUMBER /OF REFERENCES TO THE SYMBOLS THUS FAR /EXAMINED. THIS IS COMPARED TO THE AVAILABLE /CORE IN A PARTICULAR FIELD. WHEN THAT OVER- /FLOWS WE HAVE TO EITHER MOVE TO ANOTHER FIELD /FOR THE REFERENCES OR WRITE PART OF THE SYMBOL /TABLE ONTO SYS. TAD (BASTBL TAD FLDPTR DCA TEMP1 /INITIAL BASE OF REFS TAD I TEMP1 DCA BASE TAD FLDPTR /NOW GET MASK FOR QUESTION.. CMA /DOES THIS FIELD HAVE SYMBOLS? DCA COUNT CLL CML RAL ISZ COUNT JMP .-2 DCA MASKF TAD FLDPTR /GET ADDRESS OF UPPER LIMIT TAD (LTTBL /FOR LATER DCA SYMLIM TAD FLDPTR /SET NEW LIMIT IN FIELD 1 TAD [BREAK DCA NUSER /THE NEW LIMIT FOR REFS IS DCA I NUSER /ZERO SYMBOL IN CURRENT FIELD LOC. TAD I SYMLIM FUJ1, TAD CTPTR /IF MORE THAN 2 FIELDS EXIST /THIS BECOMES A NOP. THE LIMIT IN /FIELD 1 IS AT THE BOTTOM OF THE /SYMBOL TABLE DCA LIMIT NDPS2, TAD CTPTR /CTPTR HOLD THE CORE ADDRESS OF THE /THE 4TH LOCATION OF A GIVEN SYMBOL. THIS /IS ALSO THE REFERENCE COUNTER FOR THAT SYMBOL CLL RTR /FORM SYMBOL NUMBER AND [1777 DCA COUNT /SAVE FOR LATER TAD ADDER CIA TAD BASE /NEXT REFERENCE AREA DCA SAVE /IF IT FITS IN THIS AREA /USED WHEN WE MAKE ACTUAL REF ENTRIES CDF 10 TAD I CTPTR /# REFS FOR THIS SYMBOL DCA TEMP TAD [3 TAD CTPTR DCA CTPTR TAD TEMP SPA CLA /PERMANENT SYMBOL JMP PRMSYM /YES TAD I CTPTR AND [3777 /MASK GT 4095 BIT TAD ADDER DCA ADDER /SEE IF THIS SYMBOL WILL FIT IN THE /CURRENT FIELD HOLDING REFS CDF 10 /MUST ADD UP NEW REFS ALSO TAD I CTPTR AND [3777 CDF 0 CLL TAD LIMIT /IF LINK GOES ON, REFS WON'T FIT SZL JMP CUTSYM CMA CLL /WHEN UPPER MEETS LOWER,QUIT TAD SAVE SNL CLA JMP CUTSYM /OK..QUIT! CDF 10 TAD SAVE /FITS..PUT IN BASE WHERE THIS SYMBOL'S /REFS BEGIN DCA I CTPTR ISZ ADDER ISZ ADDER /2 EXTRA FOR BOOKKEEPING PRMSYM, CDF 0 TAD COUNT /SYMBOL NUMBER..REMEMBER? DCA I NUSER TAD SYMFLD /BUT..IF THIS FIELD HAS SYMBOLS, AND MASKF /LET'S REDUCE HIS AVAILABLE SPACE SNA CLA JMP .+4 /NO SYMBOLS TAD [4 TAD LIMIT DCA LIMIT TAD COUNT /SEE IF WE ARE DONE CMA TAD USER+1 SNA JMP I (DONE /YES!! PROBABLY FORGOT SOMETHING DCA SYSM /BECOMES # SYMBOLS TO WRITE OUT IN CASE /WE RUN OUT OF ROOM ISZ CTPTR JMP NDPS2 /CYCLE FOR NEXT SYMBOL CUTSYM, CLA ISZ FLDPTR /GO TO ANOTHER FIELD TAD FLDPTR /DOES IT EXIST? CLL TAD MAXFLD SNL CLA JMP END3 /YES..GROOVY TAD SYSM /NOPE..HAVE TO WRITE REMAINDER OUT CLL RAL /CONVER TO PAGES AND (3700 /FORM CONTROL WORD FOR WRITE TAD [4110 DCA CNTROL JMS I (SUB3 /RESET CTPTR TAD I NUSER IAC /FUDGE LAST ENTRY IN TABLE DCA USER+1 /NEW END OF TABLE JMS IOSR /WRITE THE SEGMENT CDF 10 /PUT A 7777 AT END OF CURRENT SEG. CLA CMA DCA I CTPTR CDF 0 JMP I (DONE+1 /NOT DONE YET!! END3, JMS I (SUB3 JMP END2 /AND RESUME THY WORK!! NUSER, 0 LIMIT, 0 *1600 /PASSN2 IS ENTERED WHEN WE HAVE COLLECTED SOME SORT OF A /SYMBOL AND IT IS NOT PASS ONE. WE HAVE TO MAKE SURE IT /IS A USER SYMBOL OR LITERAL. IF IT IS, WE HAVE TO ENTER /THE SEQUENCE # IN THE AREA SET UP FOR REFERENCES TO THIS /SYMBOL. ALSO, IF THE REFERENCE IS A DEFINITION, THE SECOND /LOCATION IN THE REFERENCE AREA IS LOADED WITH THE SEQUENCE /NO. OF THE LINE WE ARE DOING. PASSN2, JMS I [SYMCHK USER /IS IT KNOWN TO US? JMP I [B /NO..BUT IT MIGHT BE IN A SEGMENT EITHER /ALREADY DONE OR YET TO BE DONE!! JMS TSTPRM /TEST FOR A PERMANENT SYMBOL JMP I [B /PERMANENT SYMBOL /NOTE:SAVE IS SET UP IN TSTPRM TO CONTAIN THE ADDRESS OF THE /INDEX WORD. WE USE THIS LATER ON JMS GETFLD DCA CDFN /DETERMINE WHAT FIELD THIS SYMBOL HAS ITS /REFS IN AND FORM A CDF N TAD CHAR TAD MCOMMA /IS THIS A DEFINITION? SZA TAD MEQ /AN= MAYBE? SNA CLA IAC /ONE OR OTHER..MARK AS DEFINITION DCA DEF CDF 10 TAD I SAVE /PICK UP POINTER TO REFERENCE AREA DCA SAVE TAD CDFN DCA .+1 HLT /I HATED TO DO THIS!!! TAD I SAVE SPA CLA /IF THIS IS NEGATIVE, IT MEANS THAT THE /SEQUENCE NUMBER HAS WRAPPED AROUND, BUT WE HAVE /ALREADY MADE A 0 ENTRY TO SHOW THAT JMP P2 TAD CONST /HAS THE SEQUENCE # WRAPPED? SNA CLA JMP P2 /NOT YET JMS REFENT /YES..MAKE A 0 ENTRY TAD CDFN DCA .+1 HLT TAD I SAVE /MARK AS HAVING A 0 ENTRY TAD [4000 DCA I SAVE P2, CDF 0 TAD SEQNO /NOW MAKE A REAL ENTRY JMS REFENT TAD DEF SNA CLA /SHOULD WE FILL IN THE DEFINITION LOC? JMP I [B /NO CLA CMA TAD SAVE /YES..POINT TO IT DCA SAVE TAD CDFN DCA .+1 HLT /THIS IS SLOPPY, BUT SO AM I TAD SEQNO CIA DCA I SAVE CDFZ, CDF 0 JMP I [B DEF, 0 MEQ, -21 MCOMMA, -254 /REFENT, MAKES REFERENCES IN THE SYMBOLS AREA AND BUMPS THE /FIRST LOCATION TO POINT TO THE NEXT LOC. REFENT, 0 DCA TEMP1 /SAVE SEQNO CDFN, HLT TAD I SAVE AND [3777 /MASK OFF WRAP AROUND BIT CIA TAD SAVE /FORM ADDRESS OF THIS REFERENCE DCA TEMP TAD TEMP1 DCA I TEMP ISZ I SAVE /BUMP POINTER CDF 0 JMP I REFENT /TSTPRM TESTS THE SYMBOL WE HAVE FOUND FOR BEING A PERMANENT SYMBOL /PERMANENT SYMBOLS ARE DISTINGUISHED BY HAVING THE 4000 BIT ON. TSTPRM, 0 TAD SYMADD TAD [3 DCA SAVE /WE USE THIS ON RETURN!! CDF 10 TAD I SYMADD CDF 0 SMA CLA /IS IT MINUS? ISZ TSTPRM JMP I TSTPRM /GETFLD DETERMINES WHAT FIELD A PARTICULAR SYMBOL HAS ITS /REFS IN. IT DOES IT BY COMPARING THE CURRENT SYMBOLS NUMBER /WITH THE ENTRIES IN THE BREAK TABLE. GETFLD, 0 DCA FLDPTR GF1, TAD [BREAK TAD FLDPTR /GET BREAK TABLE ENTRY DCA TEMP TAD I TEMP CIA TAD SYMNUM /SYMNUM WAS SET UP WHEN WE FOUND THE SYMBOL SPA SNA CLA JMP GF2 /FIRST NEG. VALUE GIVE FLDPTR ISZ FLDPTR /TRY NEXT JMP GF1 GF2, JMS CHDF /FORM THE CDF N JMP I GETFLD CHDF, 0 TAD FLDPTR CLL RTL RAL TAD CDFZ JMP I CHDF SPACE, 0 /GENERATES AS MANY SPACES AS ARE IN AC DCA CHDF TAD [240 JMS I [OCHAR ISZ CHDF JMP SPACE+2 JMP I SPACE CHECK, 0 TAD I CHECK /SUBROUTINE TO TEST CHAR CIA /AGAINST PRESCRIBED LIMITS TAD CHAR CLL TAD I CHECK ISZ CHECK TAD I CHECK ISZ CHECK SNL SKP CLA /VERY UNESTHETIC..BUT IT WORKS! SNA CLA ISZ CHECK JMP I CHECK DONE, ISZ FINI /SET COMPLETION FLAG JMS I (IOPEN /SET FOR REREAD JMS I (PTRSET /PREPARE REFERENCE AREAS DCA SEQNO /BACK TO BASICS DCA CONST JMP I (FIRST /READ FIRST RECORDS *2000 /DUMP DOES A LITTLE FORMATTING OF THE OUTPUT, AND DUMPS THE /CROSS REFERENCING TABLE ONTO THE OUTPUT DEVICE. /ANY FIDDLING WITH THE BUFFERS OR DEVICE HANDLERS WILL HAVE TO /BE DONE IN DUMP COUNTR=BASE REFBUF=IOSR SCHAR=ADDER DUMP, CLA CMA DCA PASSG1 /FORCES ANOTHER PASS AT ENDPAS DMP7, SKP /V3C JMP DMP8 /SKIP FIRST-TIME STUFF ISZ LINES /V3C ISZ LINES /DIF NO. LINES PER PAGE NOW JMS I [FORM /FIRST TIME THRU GETS A FORM FEED DCA DMP7 /FUTURE PASSES DON'T DMP8, TAD USER+1 CIA DCA COUNTR /# SYMBOLS TO PROCESS NOW TAD [3 DCA BUFFER /FIRST SYMBOL IS HERE JMP DMP6 /GET NO. LINES RIGHT FIRST TIME DMP5, JMS I [CRLF /V3C DMP, ISZ LNPRPG /IS FORM FEED NEEDED? SKP /NOT YET JMS I [FORM DMP6, TAD [-3 DCA SYMCNT /2 CHARACTERS PER PASS DCA CONST /RESET FOR <4096 TAD M12 DCA LINENO NXTDV, ISZ BUFFER CDF 10 TAD I BUFFER /PICK UP PACKED WORD CDF 0 SPA /PERMANENT SYMBOL? JMP DPERM /YES JMS I [DIVIDE /CONVERT 2 CHARS AND PRINT ISZ SYMCNT JMP NXTDV+1 TAD [-4 JMS I [SPACE /GENERATE(AC) SPACES TAD BUFFER CLL RTR /GET SYMBOL NUMBER AND [1777 DCA SYMNUM JMS I (GETFLD DCA CDFNA /CDF N CDF 10 TAD I BUFFER DCA REFBUF /BASE OF REFS FOR SYMBOL CDFNA, HLT TAD I REFBUF /IF THIS IS NEGATIVE, SPA CLA /WE LEFT A REF FOR A 0 ENTRY TAD M1 /IN THAT CASE,DON'T INCLUDE THAT ONE AS TAD [-2 /A REAL ENTRY. DCA SYMCNT TAD I REFBUF AND [3777 /NOW CALCULATE REAL NO. ENTRIES TAD SYMCNT CIA DCA SYMCNT CLA CMA TAD REFBUF DCA REFBUF TAD I REFBUF /SEQUENCE # OF DEF. DCA DEFSEQ DMP2, CLA CMA TAD REFBUF DCA REFBUF TAD CDFNA DCA .+1 HLT TAD I REFBUF /PICK UP A REFERENCE TAD DEFSEQ /IS THIS THE DEF? SZA CLA JMP NODEF DCA DEFSEQ /ONLY 1 DEF PER LINE TAD [3 /YES..PRINT # AFTER SEQ # NODEF, TAD [240 /IF NO, PRINT 2 SPACES DCA SCHAR TAD I REFBUF SZA CLA /IF A 0, ALL FOLLOWING REFS ARE >4095 JMP .+4 TAD [140 DCA CONST JMP DMP2 /IGNORE ZERO ENTRY!! TAD I REFBUF CDF 0 JMS I (CVTSEQ /WRITE THE DECIMAL SEQUENCE # TAD SCHAR JMS I [OCHAR /EITHER # OR SPACE CLA CMA JMS I [SPACE ISZ SYMCNT /MORE TO DO? JMP DMP0 /NO, BUT IS CR/LF REQUIRED? GETMOR, ISZ COUNTR /EXHAUSTED ALL SYMBOLS? JMP DMP5 TAD FINI /YES..ARE WE ALL DONE SNA CLA JMP I [ENDPAS /NO..READ IN NEXT SEGMENT JMP I (OCLOSE DMP0, ISZ LINENO /A CR/LF NEEDED? JMP DMP2 TAD M12 DCA LINENO /RESET ENTRIES PER LINE JMS I [CRLF /V3C ISZ LNPRPG /FORM FEED? SKP JMS I [FORM TAD M12 /AND INDENT NEXT LINE JMS I [SPACE JMP DMP2 DPERM, CLA TAD [3 /PERMANENT SYMBOL TAD BUFFER DCA BUFFER /LOOK AT NEXT ISZ COUNTR JMP NXTDV JMP GETMOR+2 FIRST, JMS I (ASHDLR /RESET INPUT FOR READ JMS I (RDREC /AND READ SOME RECORDS JMP I (NXTLIN /START READING TEXT DEFSEQ, 0 LINENO, -12 PASTST, 0 /SR WHICH DETERMINE IF PASS > 1 TAD PASSG1 SPA CLA /IF >0=> PASS >1 ISZ PASTST JMP I PASTST *2200 /I/O ROUTINES FOR OS/8 OUSETP, 0 TAD (OUCTL&3700 CIA DCA OUDWCT /SIZE OF BUFF IN DOUBLEWORDS TAD XOUBUF DCA OUPTR /INITIALIZE POINTER TAD OUJMPE DCA OUJMP /RESET 3 WAY SWITCH JMP I OUSETP OCHAR, 0 AND (377 /CALLED WITH CHARACTER IN AC DCA OUTEMP JMS I [PASTST JMP I OCHAR OUTSW, KRS /TEST FOR ^C WITH FLAG OR /JMP I OCHAR IF /P,/U OR PASS 2 /M TAD (-203 SNA CLA KSF JMP .+2 JMP I [7600 /SAVE CORE FOR SOME REASON ISZ OUJMP /BUMP 3 WAY SWITCH OUJMP, HLT JMP OCHAR1 JMP OCHAR2 OCHAR3, TAD OUTEMP /PICK UP CHARACTER CLL RTL RTL AND (7400 /3RD WORD MERGED INTO 2 BUFFER WORDS TAD I OUPOLD DCA I OUPOLD TAD OUTEMP CLL RTR RTR RAR AND (7400 TAD I OUPTR DCA I OUPTR TAD OUJMPE DCA OUJMP /RESET FOR NEW SET OF 3 CHARS ISZ OUPTR /BUMP BUFFER POINTER ISZ OUDWCT JMP OUCOMN TAD OUCT /YEP JMS OUTDMP /WRITE IT JMS OUSETP /RESET OUT BUFFER JMP I OCHAR OCHAR2, TAD OUPTR DCA OUPOLD /FOR LATER ISZ OUPTR /SECOND WORD GOES HERE OCHAR1, TAD OUTEMP DCA I OUPTR OUCOMN, JMP I OCHAR OUTEMP, 0 /TEMP STORE OUPOLD, 0 /HOLDS OLD POINTER OUPTR, 0 OUJMPE, JMP OUJMP OUDWCT, 0 OUCT, OUCTL OOPEN, 0 /OPEN AN OUTPUT FILE;FETCH HANDLER TAD (OFILE DCA OUBLK /POINT TO FILE NAME TAD XOUDEV DCA OUHNDL /LEAVE ROOM FOR 2 PAGE HANDLER CDF 10 TAD I [7600 /OUTPUT DEVICE # CDF 0 CIF 10 JMS I USR /ASSIGN,FETCH HANDLER 1 OUHNDL, HLT /GETS ENTRY POINT OF HANDLER JMP HIOERR /HANDLER FAILURE OUENTR, JMS I (P2ADJ CDF 10 TAD I [7600 CDF 0 CIF 10 JMS I USR 3 /ENTER OUTPUT FILE OUBLK, OFILE OUELEN, 0 /RETURNS WITH LENGTH OF HOLE JMP OEFAIL MP2, DCA I (OUCCNT TAD OUBLK /STARTING RECORD DCA OUREC JMS OUSETP /SETUP OUTPUT AREA JMP I OOPEN XOUDEV, 4001 /MAY BE ALTERED OEFAIL, CDF 10 TAD I [7600 AND (7760 /GET LENGTH PART SNA CLA /WAS IT 0? JMP ERR3 /YEP..HE LOSES TAD I [7600 AND [17 /TRY WITH INDETERMINATE LENGTH DCA I [7600 JMP OUENTR OUTDMP, 0 /WRITE ACTUAL OUTPUT DCA OUCTLW JMS I (OUNREC /FIGURE # RECS TO WRITE TAD I (OUCCNT DCA I (OUCCNT /UPDATE CLOSE LENGTH TAD I (OUCCNT CLL CML TAD OUELEN /ROOM FOR THIS WRITE? SNL CLA JMP ERR4 /HE LOSES JMS I OUHNDL /NJ WRITE IT OUCTLW, 0 XOUBUF, OUBUF OUREC, 0 JMP HIOERR /A HANDLER BADNESS JMS I (OUNREC TAD OUREC /UPDATE OUTPUT RECORD # DCA OUREC JMP I OUTDMP ERR4, JMS I [ERROR FULERR ERR3, JMS I [ERROR ENTERR *2400 OCLOSE, TAD HCREF SZA CLA /IF NOT LAST PASS JMP NOVERS /NO NEED FOR VERSION NO. JMS CRLF TAD ("V-300^R+VERSN-"0+40 JMS I [DIVIDE TAD (PATCHL /PATCH NO.-ON PAGE JMS I [OCHAR JMS CRLF JMS FORM /V3C NOVERS, TAD HCREF SNA CLA /IF /M PASS 1 TAD (232 JMS I [OCHAR /NO 232 JMS I [OCHAR FILLIP, JMS I [OCHAR /FILL WITH 0'S TAD (177 AND I (OUDWCT SZA CLA /TO BOUNDARY YET? JMP FILLIP /NO..KEEP FILLING TAD I (OUDWCT TAD (OUCTL&3700 SNA /FULL WRITE LEFT? JMP NODUMP /YES..BUT ^Z IS OUT TAD (4000+OUFLD /FORM WRITE JMS I (OUTDMP NODUMP, CIF 10 JMS I USR 10 /LOCK IN MONITOR TAD I (OUREC CDF 10 DCA I OUSAVX CDF 0 TAD I (OUELEN CDF 10 DCA I OUSAVX TAD LNPRPG DCA I OUSAVX TAD OUCCNT DCA I OUSAVX TAD I [7600 CDF 0 ISZ HCREF JMP NOD1 CIF 10 JMS I [200 6 BLK, 0 0 NOD1, CIF 10 JMS I [200 4 /CLOSE OUTPUT FILE OFILE /POINTER TO FILE NAME OUCCNT, 0 /CLOSING LENGTH JMP ERR5 /SORRY /FOR LONG FILES(/M), IT WILL CHAIN TO ITSELF ON FIRST PASS. /ON SECOND PASS,IT WILL DELETE FILE CREFTM.LS(IF NO E) ISZ SLSWH /DELETE TEMP FILE SWITCH JMP ALDONE CLA IAC /SYS CDF 0 CIF 10 JMS I [200 4 /DELETE CREFLS.TM CHANNM 0 CLA ALDONE, JMP I [7605 HCREF, 0 SLSWH, 0 ERR5, JMS I [ERROR CLSERR ERR6, JMS I [ERROR INPERR OFILE, ZBLOCK 4 /OUTPUT FILE NAME GOES HERE FORM, 0 /GENERATE 214 IF NOT TTY JMS I [PASTST /IF PASS>1, NO FORM FEED JMP I FORM TAD TTYSWT SZA CLA JMP FORM2 TAD LNPRPG /FILL TO END OF PAGE SNA /IF 0, GENERATE 8 LINE FEEDS TAD [-4 DCA COUNT JMS CRLF ISZ COUNT JMP CRLF1 /HA! GENERATE EXTRA LINE FEED!! TAD [-6 DCA COUNT TAD ("- /GENERATE ------ JMS I [OCHAR ISZ COUNT JMP .-3 TAD [-4 DCA COUNT FORM3, JMS CRLF ISZ COUNT JMP CRLF1 TAD LINES /V3C NOP DCA LNPRPG /RESET TO TOP OF PAGE JMP I FORM FORM2, CLA CMA DCA COUNT CMA JMP FORM3 /USE [215 TO GENERATE A 214 CRLF, 0 /GENERATE CRRIAGE RET AND LINE FEED TAD [215 JMS I [OCHAR CRLF1, TAD [212 JMS I [OCHAR JMP I CRLF TTYSWT, 0 *2600 IOPEN, 0 CLA CMA DCA INCHCT /FORCE READ OF NEW FILE ISZ INEOF TAD (7617 DCA INFPTR JMP I IOPEN INPTR, INBUF ICHAR, 0 INCHAR, ISZ INJMP /PACKING SWITCH ISZ INCHCT /BUFFER EXHAUSTED? INJMPP, JMP INJMP /NOPE TAD INEOF /WAS LAST AN EOF? SNA CLA JMP INGBUF /NO..GET NEXT INPUT CDF 10 TAD I INFPTR CDF 0 SNA CLA /MORE INPUT? JMP I ICHAR /NO..EOF RETURN JMS ASHDLR /SET UP STRT RECORD INGBUF, JMS RDREC /AND READ SOME RECORDS JMP INCHAR /THIS IS DONE TO OPTIMIZE THE DECTAPE /ROCKING. INITIALIZATION DOES THESE /THE FIRST TIME. INJMP, JMP . /3 WAY SWITCH JMP ICHAR1 JMP ICHAR2 ICHAR3, TAD INJMPP DCA INJMP TAD I INPTR AND (7400 /CONTENTS OF BUFFER CLL RTR RTR TAD INCTLW RTR RTR /GETS THIRD WORD FROM 1 AND 2 ISZ INPTR /NEXT BUFFER LOC JMP INCOMN ICHAR2, TAD I INPTR AND (7400 DCA INCTLW /TEMP SAVE ISZ INPTR ICHAR1, TAD I INPTR INCOMN, AND (177 /PARITY TEST SNA /IF 200 CODE..IGNORE IT JMP INCHAR TAD [200 TAD (-232 /IS IT ^Z? SNA JMP I ICHAR /YES..NOMMORE!! TAD (232 ISZ ICHAR /SKIP EOF RETURN DCA CHAR JMP I ICHAR INCHCT, 0 INFPTR, 7617 INEOF, 0 INCTR, 0 INHAND, 0 ASHDLR, 0 CDF 10 TAD I INFPTR AND (7760 /LENGTH PART OF WORD SZA /0 IMPLIES .GTE. 256 TAD [17 CLL CML RTR RTR DCA INCTR ISZ INFPTR /BUMP TO NEXT TAD I INFPTR /GET STARTING RECORD DCA INREC ISZ INFPTR DCA INEOF CDF 0 JMP I ASHDLR XINREC, 2 /DEFAULT CONDITIONS XINCL1, 401 RDREC, 0 TAD INCTR CLL TAD XINRECS /LINK ON IF OVERFLOW AND LAST READ SNL DCA INCTR /UPDATE IF NO OVERFLOW SZL ISZ INEOF CLL CML CMA RTR /CONTROL WORD FROM OVERFLOW RTR RTR TAD XINCL1 DCA INCTLW CDF 0 JMS I INHAND INCTLW, 0 INBUFP, INBUF INREC, 0 JMP INERRX /FATAL OR EOF INBREC, TAD INREC TAD XINREC DCA INREC /UPDATE # READ TAD INCTLW AND [7600 CLL RAL TAD INCTLW AND [7600 CMA DCA INCHCT /NEW CHARACTER COUNT TAD INJMPP DCA INJMP TAD INBUFP DCA INPTR JMP I RDREC INERRX, ISZ INEOF /FATAL OR EOF SMA CLA JMP INBREC /EOF..NEXT FILE JMS I [ERROR INPERR TTYPRT, 0 /SIMPLE TTY OUTPUT ROUTINE TLS TSF JMP .-1 CLA JMP I TTYPRT *3000 HNDERR, "H-300^R+"A-300 /HANDLER FAIL "N-300^R+"D-300 "L-300^R+"E-300 "R-300^R "F-300^R+"A-300 "I-300^R+"L-300 SYMERR, "S-300^R+"Y-300 "M-300^R "O-300^R+"V-300 "E-300^R+"R-300 "F-300^R+"L-300 "O-300^R+"W-300 LPTERR, "D-300^R+"E-300 /DEV LPT BAD "V-300^R "L-300^R+"P-300 "T-300^R "B-300^R+"A-300 "D-300^R ENTERR, "E-300^R+"N-300 "T-300^R+"E-300 "R-300^R "F-300^R+"A-300 "I-300^R+"L-300 "E-300^R+"D-300 FULERR, "O-300^R+"U-300 "T-300^R "D-300^R+"E-300 "V-300^R "F-300^R+"U-300 "L-300^R+"L-300 CLSERR, "C-300^R+"L-300 "O-300^R+"S-300 "E-300^R "F-300^R+"A-300 "I-300^R+"L-300 "E-300^R+"D-300 INPERR, "I-300^R+"N-300 "P-300^R+"U-300 "T-300^R "E-300^R+"R-300 "R-300^R+"O-300 "R-300^R REFERR, 2664 /2045 REFS 3015 "R-300 "E-300^R+"F-300 "S-300^R 0 /LITERAL PROCESSORS. LITERALS ARE HANDLED ACCORDING TO THEIR /BINARY DEFINITION. A CURRENT PAGE LITERAL AT,SAY, 0377 WILL /BE CALLED _L0377. A PAGE ZERO LITERAL AT LOCATION 0100 WILL /BE CALLED _L0100 /IF ASSEMBLED WITH NEW PAL8, LITERAL INCLUDES FIELD /SO 00377 IS _00377, 10377 IS _10377 LIT2, TAD (2540 /PAGE 0..FIRST NUMBER ALWAYS 0 DCA SYM2 /_L GOES IN SYM1 FOR BOTH JMS LCHK ISZ ISYM ISZ ISYM /POINT TO SYM3 FOR LAST 2 DIGITS JMP LIT3 /COMMON CODE LIT1, JMS LCHK ISZ ISYM /POINT TO SECOND WORD TAD I XRLIT /FIRST BINARY DIGIT JMS I [PACK TAD I XRLIT AND (266 /THIS KNOCKS OFF RELATIVE ADDRESS BIT JMS I [PACK /GOES INTO RIGHT HALF OF SYM2 LIT3, TAD DSWIT /IF /D, DON'T CREF LITERALS SZA CLA JMP LITEX /DON'T DO ANYTHING BUT CLEAR COUNTERS TAD (LITBUF+1 /NOW PICK UP RELATIVE ADD BIT FROM INSTRUCT. DCA XRLIT TAD I XRLIT AND (1 TAD SYM2 DCA SYM2 /FORMING ADDRESS OF LITERAL! TAD I XRLIT JMS I [PACK TAD I XRLIT JMS I [PACK /LOAD UP SYM3 TAD ENDFIX /WILL PRINT FIELD WITH LIT IF NEW PAL8 AND (57 TAD [2426 DCA SYM1 /PUT IN _ (NEGATIVE!) JMS I (REPACK JMP I XUSSYM /DO THE BOOKKEEPING LITEX, JMS I (REPACK JMP I [B XUSSYM, USSYM /WILL BE CHANGED TO PATCH IF /L LCHK, 0 TAD MARGIN DCA XRLIT TAD I XRLIT DCA ENDFIX TAD ENDFIX TAD (-240 SNA CLA JMP LITEX JMP I LCHK GLIN5, TAD CRCNT SNA CLA JMP CROUT /NEED THIS CR ISZ CRCNT JMP CROUT /NEED CR AFTER HEADER JMP I (GETLIN CROUT, TAD [212 JMS I FPUT TAD MARGIN DCA XRLINE JMP I (GLIN6 CRCNT, 0 CHANNM, FILENAME CREFLS.TM ENDFIX, 0 /TEMP ALSO JMS I (DOLOT2 DCA .-1 /ONCE ONLY TAD SYSM SNA JMP I (NDPS1 JMP I ENDFIX *3200 OUNREC, 0 /ESTIMATE # RECS TAD I XOCTLW CLL RTL RTL RTL /ITS NOT AN ESTIMATE, BUT EXACT!! AND [17 JMP I OUNREC XOCTLW, OUCTLW DIVIDE, 0 DCA DIV45B DCA DIV45C JMP DIV45D /START UP HERE DIV45A, ISZ DIV45C /BUMP THE QUOTIENT DCA DIV45B /NEW DIVIDEND DIV45D, TAD DIV45B TAD (-52 /DIVIDE BY 52 SMA JMP DIV45A /STILL +; KEEP LOOPING TAD (52 /REMAINDER IN AC AFTER ADD JMS I (DIVE /LETTER OR NUMBER? DCA DIV45B TAD DIV45C JMS I (DIVE JMS I [OCHAR TAD DIV45B JMS I [OCHAR ISZ BUFFER JMP I DIVIDE DIV45B, 0 DIV45C, 0 GETLIN, 0 /GET A LINE OF INPUT AND STORE TAD MARGIN /IT AT LINBUF DCA XRLINE INLINE, JMS I (ICHAR JMP EN TAD RLSKIP /IF RALF HEADER,ELIM 2 LF SNA CLA JMP REGULR /NOT RALF ISZ RLSKIP /CATCH 2ND LINE JMP INLINE TAD [7776 /ELIM EXTRA CR AFTER HEADER DCA I (CRCNT REGULR, TAD CHAR /LINE FEED TERMINATES THIS ROUTINE TAD MLF SNA JMP INLINE /IGNORE LF'S ON INPUT TAD [212-215 /LF-CR SNA CLA JMP GLIN3 TAD XRLINE TAD (-375 SMA CLA JMP .+3 TAD CHAR JMS I FPUT TAD CHAR TAD [-214 SZA CLA JMP INLINE GLIN3, TAD [215 JMS I FPUT GLIN4, JMP I (GLIN5 GLIN6, TAD [200 /TEST FOR ^C KRS TAD (-203 SNA CLA KSF JMP I GETLIN JMP I [7605 /FOUND ^C RLSKIP, 0 ALLOCT, 0 JMS I (DEVCHK 7617 /CHECK INPUT DEVICE SPA CLA IAC /2 PAGE HANDLER DCA BUFCNT JMS I (DEVCHK 7600 /CHECK SIZE OF OUTPUT DEV HANDLER SPA CLA TAD [2 /2 PAGES TAD BUFCNT DCA BUFCNT CLL TAD BUFCNT RAR CLA SZL CLL /IF 1 OR 3,IN DEV IS 2 PGS TAD [200 TAD (3601 DCA I (XOUDEV TAD [-2 TAD BUFCNT SMA SZA CLA JMP I ALLOCT /2 2PAGERS IS DEFAULT TAD (4200 /IF NOT 2 2PAGERS,INBUF AT 4200 DCA I (INBUFP TAD I (INBUFP DCA I (INPTR TAD [3 DCA I (XINREC TAD (601 DCA I (XINCL1 JMP I ALLOCT BUFCNT, 0 CLEAR, 0 /ROUTINE TO CLEAN OUT OLD SYMBOL DCA SYM1 DCA SYM2 DCA SYM3 JMP I CLEAR EN, JMS DPAT /V3D JMP I [ENDPAS /THIS INITIALIZATION CODE IS DESTROYED WHEN DATA IS READ /INTO THE BUFFER. FOR THAT REASON, CREF IS NOT RESTARTABLE *4200 ST1, CDF 0 KLUD, CIF 10 JMS I USR 5 1423 /DEFAULT EXTENSION IS .LS CHAIN, CDF 10 TAD I (7617 /IF NO INPUT, RESTART CD SNA CLA JMP ST1 TAD I [7600 /IF NO OUTPUT, GIVE HIM LPT!! SZA CLA JMP ST2 CDF 0 CIF 10 JMS I [200 12 /ASSIGN-NO FETCH 1420 DEVS, 2400 0 JMP ERRTWO /DEFAULT DEVICE IS BAD TAD DEVS CDF 10 DCA I [7600 ST2, CDF 0 JMS I (SWITCH CDF 10 TAD I OUSAVX CDF 0 DCA PASS2 BLUE0, TAD [-4 DCA COUNT BLUE, CDF 10 TAD I XNAME CDF 0 DCA I (OFILE ISZ XNAME ISZ (OFILE ISZ COUNT JMP BLUE JMS I (ALLOCT JMS I (OTYPE AND (770 /CHECK FOR TTY AS OUTPUT (CAN CLA IF DEBUGGING) DCA I (TTYSWT TAD I (TTYSWT /IF LPT IS OUTPUT, SZA CLA /NO INTERNAL FORM FEEDS GENERATED DCA I (NOFORM /NOW WE MOVE UP THE PERMANENT AND PSEUDO-OP TABLES. /THE Y WERE ASSEMBLED IN FIELD 0 TO SAVE DECTAPE MOTION /WHEN LOADING. JMS I (FTEST /GET MACHINE SIZE TAD MAXFLD CIA DCA MAXFLD /- NO.FIELDS CDF 10 /ASSIGN THE INPUT HANDLER TAD I (7617 CDF 0 CIF 10 JMS I USR 1 INHNDL, INDEVH+1 HLT /YECH!!! TAD INHNDL DCA I (INHAND /SETUP ENTRY POINT JMS I (ASHDLR /SET UP FIRST READ TAD (7700 DCA USR /SAVE SYMBOL TABLE TAD I (7746 AND KLUD TAD [1000 /MARK NOT RESTARTABLE DCA I (7746 /SAVE CORE BIT TAD I XRLINE DCA COUNT /INITIAL LOAD PROVIDES PARAMETERS FOR /THE SYMBOL TABLE. THIS IS # WORDS TO MOVE JMS MOVEM TAD RSWIT SNA CLA /DETERMINE WHICH PSEUDO-OPS TAD (PPSEUD-SPSEUD TAD (SPSEUD-1 DCA XRLINE TAD I XRLINE DCA PSEUDO /TABLES INITIALLY HAVE A SHORT HEADER /WHICH CONTAINS INFORMATION ABOUT THEM /PSEUDO CONTAINS STARTING # OF FIRST TAD I XRLINE DCA PSEUDO+1 /LAST ENTRY # TAD I XRLINE DCA COUNT /# ENTRIES TO MOVE TAD I XRLINE DCA XRLIT /WHERE THEY GO IN FIELD 1 JMS MOVEM JMP I (XFIRST /READ FIRST RECORDS MOVEM, 0 TAD I XRLINE CDF 10 DCA I XRLIT CDF 0 ISZ COUNT JMP .-5 JMP I MOVEM ERRTWO, JMS I [ERROR /THIS IS AN IMPOSSIBLE ERROR LPTERR CHANCK, 0 CLL RTL /CHECK FOR /C+/E RAL SNL JMP I CHANCK //C IS MINIMUM CONDITION RTR /V3C USE /1 TO MEAN KEEP CREFLS.TM SNL CLA CMA /-1 IF NO E (I.E. DO ELIMINATE) DCA I (SLSWH JMP I CHANCK XNAME, 7601 PASS2, 0 PATCHA, TAD (35 DCA USER+1 JMP BLUE0 *4400 SWITCH, 0 JMS I (FILEXT CLA IAC CDF 10 AND I (7644 /TEST FOR /X DCA DSWIT TAD I (7643 CDF 0 JMS I (CHANCK CDF 10 CLA CLL TAD I (7644 AND (410 /P OR /U USED? SNA JMP ST3 CDF 0 AND [10 SNA CLA JMP TXONLY /JUST /P TAD XDOLL DCA I (DOLL12 /NO SYMBOL TABLE TXONLY, TAD KILOUT /YES..DISABLE PASS ONE OUTPUT DCA I [OUTSW ST3, CLA CDF 10 TAD I (7644 CDF 0 AND (300 /IF SABR (Q), SET RSWIT AND DSWIT SNA JMP HCR1 /PAL8 AND [200 /CHECK FOR RALF SNA CLA JMP RALFCD /Y ISZ RSWIT ISZ DSWIT DCA I (SCAN3 /ENABLE CHECK FOR SABR CHARS HCR1, CLA CDF 10 TAD I (7644 /CHECK FOR M- MAMMOTH FILE(HCREF) CDF 0 SMA CLA JMP I (BLUE0 /NOT LONG FILE /PUT IN NECESSARY PATCHES CLL TAD XPATCH DCA I (HC1 TAD XPTCH1 DCA I (XUSSYM CDF 10 TAD I (7645 RAR /CHECK IF PASS1 OR 2 FOR /M SNL JMP CHNPS1 /PASS 1 RAL CLL /IT'S PASS 2 DCA I (7645 /RESTORE TBL CDF 0 CIF 10 JMS I (7700 /RESTORE USR 10 TAD KILOUT DCA I [OUTSW /NO LIST TAD XDOLL DCA I (DOLL12 TAD [7720 DCA I (PATCH1 /ANOTHER PATCH JMP I SWITCH CHNPS1, CLL CML RAL DCA I (7645 /SET /9 SWITCH CDF 0 CLA CMA DCA I (HCREF /7777 DURING PASS1 JMS I (CHNSET /LOOKUP CREF.SV JMP I (PATCHA XPATCH, PATCH&177+5200 XPTCH1, PATCH XDOLL, DOLL13&177+5200 RALFCD, TAD [7776 /FOR 2 EXTRA LINE FEEDS DCA I (RLSKIP JMP HCR1 KILOUT, OCHAR&177+5600 /JMP I OCHAR /SUBROUTINE TO DETERMINE CORE SIZE FTEST, 0 JMS I (MORCOR COR0, CDF 0 TAD MAXFLD /GET FIELD TO TEST RTL RAL AND COR70 TAD COREX DCA .+1 COR1, CDF /FIELD TO TEST TAD I CORLOC COR2, NOP DCA COR1 TAD COR2 DCA I CORLOC COR70, 70 TAD I CORLOC CORX, 7400 TAD CORX TAD CORV SZA CLA JMP COREX /NON-EXISTENT FIELD TAD COR1 DCA I CORLOC ISZ MAXFLD JMP COR0 COREX, CDF 0 DONCOR, JMP I FTEST CORLOC, CORX CORV, 1400 FIELD 0 /THESE ARE THE PERMANENT AND PSEUDO OP TABLES FOR CREF /RAD IS THE BASE USED TO PACK THE CHARACTERS. FOR SABR IT MAY /HAVE TO BE MOVED TO 51 RATHER THAN 45. RAD=52 *4600 SYMTAB, -453 /INITIAL ENTRIES NOPUNCH *0 ENPUNCH ZBLOCK 4 /DUMMY ENTRY..SYMCHK NEEDS IT "A-300^RAD+"N-300+4000 /AND "D-300^RAD ZBLOCK 2 "B-300^RAD+"S-300+4000 /BSW "W-300^RAD ZBLOCK 2 "C-300^RAD+"A-300+4000 /CAF "F-300^RAD ZBLOCK 2 "C-300^RAD+"D-300+4000 /CDF "F-300^RAD ZBLOCK 2 "C-300^RAD+"I-300+4000 /CIA "A-300^RAD ZBLOCK 2 "C-300^RAD+"I-300+4000 /CIF "F-300^RAD ZBLOCK 2 "C-300^RAD+"L-300+4000 /CLA "A-300^RAD ZBLOCK 2 "C-300^RAD+"L-300+4000 /CLL "L-300^RAD ZBLOCK 2 "C-300^RAD+"M-300+4000 /CMA "A-300^RAD ZBLOCK 2 R=52 "C-300^R+"M-300+4000 /CML "L-300^R ZBLOCK 2 "D-300^R+"C-300+4000 /DCA "A-300^R ZBLOCK 2 "G-300^R+"L-300+4000 /GLK "K-300^R ZBLOCK 2 "G-300^R+"T-300+4000 /GTF "F-300^R ZBLOCK 2 "H-300^R+"L-300+4000 /HLT "T-300^R ZBLOCK 2 "I-300^R+"A-300+4000 /IAC "C-300^R ZBLOCK 2 "I-300^R+"O-300+4000 /IOF "F-300^R ZBLOCK 2 "I-300^R+"O-300+4000 /ION "N-300^R ZBLOCK 2 "I-300^R+"O-300+4000 /IOT "T-300^R ZBLOCK 2 "I-300^R+"S-300+4000 /ISZ "Z-300^R ZBLOCK 2 "J-300^R+"M-300+4000 /JMP "P-300^R ZBLOCK 2 "J-300^R+"M-300+4000 /JMS "S-300^R ZBLOCK 2 "K-300^R+"C-300+4000 /KCC "C-300^R ZBLOCK 2 "K-300^R+"C-300+4000 /KCF "F-300^R ZBLOCK 2 "K-300^R+"I-300+4000 /KIE "E-300^R ZBLOCK 2 "K-300^R+"R-300+4000 /KRB "B-300^R ZBLOCK 2 "K-300^R+"R-300+4000 /KRS "S-300^R ZBLOCK 2 "K-300^R+"S-300+4000 /KSF "F-300^R ZBLOCK 2 "L-300^R+"A-300+4000 /LAS "S-300^R ZBLOCK 2 "M-300^R+"Q-300+4000 /MQA "A-300^R ZBLOCK 2 "M-300^R+"Q-300+4000 /MQL "L-300^R ZBLOCK 2 "N-300^R+"O-300+4000 /NOP "P-300^R ZBLOCK 2 "O-300^R+"P-300+4000 /OPR "R-300^R ZBLOCK 2 "O-300^R+"S-300+4000 /OSR "R-300^R ZBLOCK 2 "P-300^R+"C-300+4000 /PCE "E-300^R ZBLOCK 2 "P-300^R+"C-300+4000 /PCF "F-300^R ZBLOCK 2 "P-300^R+"L-300+4000 /PLS "S-300^R ZBLOCK 2 "P-300^R+"P-300+4000 /PPC "C-300^R ZBLOCK 2 "P-300^R+"S-300+4000 /PSF "F-300^R ZBLOCK 2 "R-300^R+"A-300+4000 /RAL "L-300^R ZBLOCK 2 "R-300^R+"A-300+4000 /RAR "R-300^R ZBLOCK 2 "R-300^R+"D-300+4000 /RDF "F-300^R ZBLOCK 2 "R-300^R+"F-300+4000 /RFC "C-300^R ZBLOCK 2 "R-300^R+"I-300+4000 /RIB "B-300^R ZBLOCK 2 "R-300^R+"I-300+4000 /RIF "F-300^R ZBLOCK 2 "R-300^R+"M-300+4000 /RMF "F-300^R ZBLOCK 2 "R-300^R+"P-300+4000 /RPE "E-300^R ZBLOCK 2 "R-300^R+"R-300+4000 /RRB "B-300^R ZBLOCK 2 "R-300^R+"S-300+4000 /RSF "F-300^R ZBLOCK 2 "R-300^R+"T-300+4000 /RTF "F-300^R ZBLOCK 2 "R-300^R+"T-300+4000 /RTL "L-300^R ZBLOCK 2 "R-300^R+"T-300+4000 /RTR "R-300^R ZBLOCK 2 "S-300^R+"G-300+4000 /SGT "T-300^R ZBLOCK 2 "S-300^R+"K-300+4000 /SKON "O-300^R+"N-300 ZBLOCK 2 "S-300^R+"K-300+4000 /SKP "P-300^R ZBLOCK 2 "S-300^R+"M-300+4000 /SMA "A-300^R ZBLOCK 2 "S-300^R+"N-300+4000 /SNA "A-300^R ZBLOCK 2 "S-300^R+"N-300+4000 /SNL "L-300^R ZBLOCK 2 "S-300^R+"P-300+4000 /SPA "A-300^R ZBLOCK 2 "S-300^R+"R-300+4000 /SRQ "Q-300^R ZBLOCK 2 "S-300^R+"T-300+4000 /STA "A-300^R ZBLOCK 2 "S-300^R+"T-300+4000 /STL "L-300^R ZBLOCK 2 "S-300^R+"W-300+4000 /SWP "P-300^R ZBLOCK 2 "S-300^R+"Z-300+4000 /SZA "A-300^R ZBLOCK 2 "S-300^R+"Z-300+4000 /SZL "L-300^R ZBLOCK 2 "T-300^R+"A-300+4000 /TAD "D-300^R ZBLOCK 2 "T-300^R+"C-300+4000 /TCF "F-300^R ZBLOCK 2 "T-300^R+"F-300+4000 /TFL "L-300^R ZBLOCK 2 "T-300^R+"L-300+4000 /TLS "S-300^R ZBLOCK 2 "T-300^R+"P-300+4000 /TPC "C-300^R ZBLOCK 2 "T-300^R+"S-300+4000 /TSF "F-300^R ZBLOCK 2 "T-300^R+"S-300+4000 /TSK "K-300^R ZBLOCK 2 -1 -1 -1 -1 /DUMMY LOW ENTRY /PSEUDO OP TABLES. ENTRIES ARE SAME FORMAT AS PAL8 /SYMBOLS. *.+SYMTAB SPSEUD, 1706 /SABR PSEUDOS. BEGINS AT 1706*4 1737 /ENDS AT 1737*4 -150 /150 LOCATIONS LONG 7427 /STARTS LOADING AT 17430 NOPUNCH *7430 ENPUNCH ZBLOCK 4 "A-300^R+"B-300 /ABSYM "S-300^R+"Y-300 "M-300^R B /RETURN POINT "A-300^R+"R-300 /ARG "G-300^R 0 B "B-300^R+"L-300 /BLOCK "O-300^R+"C-300 "K-300^R B "C-300^R+"A-300 /CALL "L-300^R+"L-300 0 B "C-300^R+"O-300 /COMMON "M-300^R+"M-300 "O-300^R+"N-300 B "C-300^R+"P-300 /CPAGE "A-300^R+"G-300 "E-300^R B "D-300^R+"E-300 /DECIM "C-300^R+"I-300 "M-300^R B "D-300^R+"U-300 /DUMMY "M-300^R+"M-300 "Y-300^R B "E-300^R+"A-300 /EAP "P-300^R 0 B "E-300^R+"N-300 /END "D-300^R 0 EPASS, DOLL1 /BECOMES ENDPAS "E-300^R+"N-300 /ENTRY "T-300^R+"R-300 "Y-300^R B "F-300^R+"O-300 /FORTR "R-300^R+"T-300 "R-300^R B "I-300^R 0 0 B /I "I-300^R+"F-300 /IF 0 0 B "I-300^R+"N-300 /INC "C-300^R 0 B "L-300^R+"A-300 /LAP "P-300^R 0 B "O-300^R+"C-300 /OCTAL "T-300^R+"A-300 "L-300^R B "O-300^R+"P-300 /OPDEF "D-300^R+"E-300 "F-300^R FXR2, FXMR "P-300^R+"A-300 /PAGE "G-300^R+"E-300 0 B "P-300^R+"A-300 /PAUSE "U-300^R+"S-300 "E-300^R B "R-300^R+"E-300 /REORG "O-300^R+"R-300 "G-300^R B "R-300^R+"E-300 /RETRN "T-300^R+"R-300 "N-300^R B "S-300^R+"K-300 /SKPDF "P-300^R+"D-300 "F-300^R FXR3, FXMR "T-300^R+"E-300 /TEXT "X-300^R+"T-300 0 TXT -1 -1 -1 -1 /PAL8 PSEUDOS. SAME FORMAT AS OTHERS *5424 ENPUNCH PPSEUD, 1706 1737 -150 7427 NOPUNCH *7430 ENPUNCH ZBLOCK 4 "D-300^R+"E-300 /DECIMAL "C-300^R+"I-300 "M-300^R+"A-300 B "D-300^R+"E-300 /DEVICE "V-300^R+"I-300 "C-300^R+"E-300 B "D-300^R+"T-300 /DTORG "O-300^R+"R-300 "G-300^R B "E-300^R+"J-300 /EJECT "E-300^R+"C-300 "T-300^R NOTBIN /SKIP ANY MORE TEXT "E-300^R+"N-300 /ENPUNCH "P-300^R+"U-300 "N-300^R+"C-300 B "E-300^R+"X-300 /EXPUNGE "P-300^R+"U-300 "N-300^R+"G-300 XPJ, XPUNJ "F-300^R+"I-300 /FIELD "E-300^R+"L-300 "D-300^R B "F-300^R+"I-300 /FILENAME "L-300^R+"E-300 "N-300^R+"A-300 B "F-300^R+"I-300 /FIXMRI "X-300^R+"M-300 "R-300^R+"I-300 FXR, FXMR "F-300^R+"I-300 /FIXTAB "X-300^R+"T-300 "A-300^R+"B-300 FXT, FXTAB "I-300^R /I ZBLOCK 2 B "I-300^R+"F-300 /IFDEF "D-300^R+"E-300 "F-300^R B "I-300^R+"F-300 /IFNDEF "N-300^R+"D-300 "E-300^R+"F-300 B "I-300^R+"F-300 /IFNZRO "N-300^R+"Z-300 "R-300^R+"O-300 B "I-300^R+"F-300 /IFZERO "Z-300^R+"E-300 "R-300^R+"O-300 B "N-300^R+"O-300 /NOPUNCH "P-300^R+"U-300 "N-300^R+"C-300 B "O-300^R+"C-300 /OCTAL "T-300^R+"A-300 "L-300^R B "P-300^R+"A-300 /PAGE "G-300^R+"E-300 0 B "P-300^R+"A-300 /PAUSE "U-300^R+"S-300 "E-300^R B "R-300^R+"L-300 /RELOC "L-300^R+"O-300 "C-300^R B "T-300^R+"E-300 /TEXT "X-300^R+"T-300 0 TXT "X-300^R+"L-300 /XLIST "I-300^R+"S-300 "T-300^R B "Z-300^R /Z ZBLOCK 2 B "Z-300^R+"B-300 /ZBLOCK "L-300^R+"O-300 "C-300^R+"K-300 B -1 -1 -1 -1 *5600 /THIS CODE IS EXECUTED DURING PASS ONE ONLY. LATER PASSES /USE THIS AREA TO BUILD A REFERENCE TABLE. HEADER, 0 /HEADER SWITCHES FPUT TO JMS I [OCHAR TAD CPCHIT DCA FPUT /ADDRESS OF PUNCH ROUTINE JMS I CGTLIN /CALL GETLIN TAD CSTRIT /RESTORE FPUT DCA FPUT JMP I HEADER CPCHIT, PNCHIT CGTLIN, GETLIN CSTRIT, STORIT PNCHIT, 0 JMS I COCHAR JMP I PNCHIT STORIT, 0 DCA I XRLINE JMP I STORIT COCHAR, OCHAR DOLL1, TAD (ENDPAS DCA DOLLAR JMS DPAT DOLL12, TAD (KRS /BECOMES JMP .+2 IF /M PASS 2 OR /U DCA I (OUTSW /RE ENABLE OUTPUT DOLL13, CDF 10 TAD RSWIT SNA CLA JMP DOLL2 /PAL8 PSEUDOS TAD (B DCA I (FXR2 TAD (B DCA I (FXR3 TAD (ENDPAS DCA I (EPASS /END PSEUDO NOW TO ENDPAS JMP DOLOUT DOLL2, TAD (B DCA I (XPJ TAD (B DCA I (FXR TAD (B DCA I (FXT DOLOUT, CDF 0 JMS DOLOT2 JMP I (NOTBIN FUDGE, NOP XPUNJ, DCA COUNT CLA CMA TAD USER+1 /SKIP LAST ENTRY (7777) CLL RTL XPUNJ3, DCA BUFFER /POINTER INTO SYMBOLS CDF 10 TAD I BUFFER TAD (5336 /IS THIS A LITERAL? SNA CLA JMP XPUNJ1 /YES..NEXT ENTRY TAD COUNT /NO..NOW PUSH ALL LITERALS UP CLL RTL /BUT IF COUNT =0, THERE ARE NONE CMA DCA SAVE TAD (3 TAD BUFFER /SETTING UP TO DO TRANSFER. IF COUNT=0 DCA XRSYM1 /ONLY THE 7777 GETS TRANSFERRED TAD (3 DCA XRSYM2 TAD I XRSYM1 DCA I XRSYM2 ISZ SAVE /ALL COMPLETED? JMP .-3 TAD COUNT IAC /INCLUDE 7777 ENTRY! DCA USER+1 CDF 0 JMP I (B XPUNJ1, TAD (-4 TAD BUFFER ISZ COUNT JMP XPUNJ3 XFIRST, JMS I (OOPEN JMP I (FIRST+1 DOLOT2, 0 STL RTL /IF WE HAVE MORE THAN 2 FIELDS, TAD MAXFLD /WE SHALL LEAVE THE SYMBOL TABLE IN ONE /PIECE. THAT ALLOWS US TO USE THE UPPER SZL CLA /CORE PROFITABLY JMP I DOLOT2 TAD USER+1 CLL RTL TAD (4 /CLEARS SYMBOL TABLE DCA I (LTTBL+1 /FIX PERMANENT LIMIT IN FIELD 1 DCA SYMFLD /AND FAKE THAT FLD 1 HAS NO SYMBOLS TAD FUDGE /DISABLE RESET OF FIELD 1 LIMIT DCA I (FUJ1 JMP I DOLOT2 CHNSET, 0 CLA IAC /SYS DEV ONLY CIF 10 JMS I (200 2 /LOOKUP STBLK, CREFNM /GET CREF STARTING BLK 0 JMP I (ERR6 TAD STBLK DCA I (BLK JMP I CHNSET CREFNM, FILENAME CREF.SV PAGE FXMR, TAD I XRLINE /SHOULD CONTAIN FIRST CHAR IN INSTR. DCA CHAR JMS I (CHECK /CHECK IT 301 -332 JMP .+4 /NOPE;A NUMBER MAYBE? FX2, TAD CHAR JMS I (PACK JMP FXMR JMS I (CHECK 260 -271 /CHECK FOR DIGIT 0-9 SKP /NOPE. IF THERE IS A SYMBOL, THIS IS TERMINATOR JMP FX2 JMS I (REPACK TAD SYM1 SNA CLA JMP FXMR CDF 10 TAD I (7644 /M RULES FOR FIXMRI TOO CDF 0 SMA CLA JMP FXNTR /NO M TAD I (PATCH1 DCA PATCH2 /APPROPRIATE SWITCH TAD SYM1 RTL PATCH2, HLT /SPA SZA OR SMA SNL + CLA JMP I (B FXNTR, JMS I (SYMCHK USER JMS I (ENTRY /ENTER AS USER SYMBOL JMS I (BUMP JMP I (B FXTAB, CLA CMA /DON'T INCLUDE 7777 ENTRY TAD USER+1 CIA DCA COUNT /# ENTRIES TO EXAMINE DCA SAVE FXTB2, TAD (4 TAD SAVE DCA SAVE FXTB9, CDF 10 TAD I SAVE /STOP AS SOON AS LITERAL FOUND TAD (5336 SNA CLA JMP FXTB3 TAD I SAVE /IF ALREADY NEG. ITS A PERM SYMBOL SMA TAD (4000 /MAKE IT PERMANENT DCA I SAVE ISZ COUNT TAD (3 TAD SAVE DCA SAVE DCA I SAVE ISZ SAVE JMP FXTB9 /LOOP FOR DURATION FXTB3, CDF 0 JMP I (B DEVCHK, 0 TAD I DEVCHK DCA T2 /SAVE TBL START ISZ DEVCHK CDF 10 TAD I T2 /HANDLER NUMBER AND (17 DCA T2 CLA CMA TAD I (37 /TBL LOCN IN 10037 TAD T2 DCA T2 TAD I T2 CDF 0 JMP I DEVCHK T2, 0 /THAT'S ALL FOLKS!! $$$$$$$$$$$$$$$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 | /DIRECT V3D FOR OS/78 V1A AND OS/8 V3D / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /JANUARY 17, 1974 H.J. / /5-AUGUST-1975 MAINT. RELEASE CHANGES S.R. /1. UPDATED COPYRIGHT DATE /2. CHANGED VERSION NUMBER TO V4 /3. INCORPORATED PATCH (SEQ #2) OF FEB 1975 DSN / (FIXES BUG RE: DEFAULTING TO TTY: AND DSK:) / / 5-APR-77 MH OS/78 FIXES (V5A) / 18-MAY-77 MH SPR 2286 (V6A) / /DIRECTORY LISTING PROGRAM / / START ADDRESS 14600; JSW 6403 / PTR=20 CNT=21 INFPTR=22 OUHAND=23 INHAND=24 EPTR=26 INSCNT=27 TEMP=30 OKFLAG=31 IFCNT=32 OSWTCH=33 INFWDS=34 BDPTR=35 GPTR1=36 XR=10 XR1=11 XR2=12 AC2=CLA CLL CML RTL AC4000=CLA CLL CML RAR ACM2=CLA CLL CMA RAL ACM3=CLA CLL CMA RTL ALTOPT=7642 OPT1=7643 OPT2=7644 EQLS=7646 /EQUALS OPTION DATE=7666 BIPCCL=7777 /CONTAINS DATE EXTENSION IN BITS 3 AND 4 (MH) BUF=5200 /THE FILE OUTPUT BUFFER /5 BLOCKS LONG, TO 7577 FIELD 1 *2000 SKP CLA /NORMAL ENTRY JMP MSTRT /CHAIN ENTRY CDCALL, JMS I (200 /SEE WHAT THE PERSON WANTS 5 STAR, 5200 /IN SPECIAL MODE MSTRT, TAD I (OPT2 /GET OPTION /W RTR SNL CLA /SKIP FOR VESION NUMBER JMP EQUALT JMS I (ERROR /PRINT VERSION NUMBER VERNO+40 TAD (215 JMS I (TYPE /SET UP FOR MULTIPLE ENTRIES ON A LINE EQUALT, TAD I (EQLS /EQUALS OPTION WORD SPA /MUST BE POSITIVE CLA CLL CML RTR /SET AC LARGE POSITIVE TAD (-10 /CHECK LEGALITY OF OPTION SMA SZA CLA /SKIP IF GOOD JMP BADEQ /SUBSTITUTE .DI IF NULL EXTENSION TAD I (7604 /GET EXTENSION SNA /SKIP IF GIVEN TAD (0411 /.DI DCA I (7604 /PUT EXTENSION BACK / GET THE DATE INCREMENT BITS CDF 0 /GET GET WORD FORM FIELD 0(MH) TAD I (BIPCCL /THE BITS WITH DATE EXT. ARE 3 AND 4 (MH) CDF 10 /BACK TO FIELD 1 (MH) RTR /SHIFT THOSE BITS SO THEY CREATE A 0,10,20, OR 30(MH) RTR /AFTER MASKING (MH) AND (0030 /MASK (MH) DCA DATINC /SAVE THE DATE EXTENSION (MH) / CHECK FOR ? IN OUTPUT SPECIFICATION TAD (-10 DCA CNT /CNT HAVING -10 PUTS US AT FIRST CHAR S1C, TAD (7605 JMS I (GTSXBT /GET A CHAR TAD (-"?!7700 /CHECK FOR ? SNA JMP QINO TAD ("?-"* SNA CLA JMP AINO ISZ CNT JMP S1C / CHECK FOR EMBEDDED * IN ANY SPECIFICATION TAD (7605 S4L, DCA PTR TAD (-10 DCA CNT ACK, TAD PTR JMS I (GTSXBT TAD (-"*!7700 SZA CLA JMP CNTUP AC2 TAD CNT SZA TAD (6 SNA CLA ISZ CNT TAD PTR JMS I (GTSXBT SZA CLA JMP AINO CNTUP, ISZ CNT JMP ACK TAD I PTR SNA CLA JMP I (NULLCK TAD (5 TAD PTR JMP S4L /THIS IS THE END OF OPERATION CODE /IT CLOSES THE FILE AND HANDLES RETURNS ENDCHK, ISZ I (ECHO TAD (232 OLOOP, JMS I (OUTCHR TAD I (OUWDCT /GET -WORDS LEFT IN BUFFER AND (177 /CHECK AGAINST NEW BUFFER # SNA /SPR 2286, CHECK CAREFULLY (MH) TAD RPOS /TO SEE IF ANY TRAILING (MH) CIA /OR DANGLING CHARS (MH) TAD (RPOS-1 /ARE LEFT OVER (MH) SZA!CLA /(MH) JMP OLOOP /KEEP GOING TO DUMP ONE TAD I (OUWDCT TAD (1200 /DONT DUMP IF AT END SZA CLA JMS DUMP /DUMP BUFFER TAD I (7600 JMS I (200 4 7601 CLEN, 0 JMP CLOERR JMP ABORT /CODE MOVED TO ANOTHER PAGE (MH) PAGE NULLCK, TAD (7201 DCA AO2 TAD (7201 DCA AO1 TAD I (7600 SNA JMP TTYHND JMS I (200 1 AO1, 7201 HLT TAD AO1 JMP CMN TTYHND, TAD (2424 DCA TTY1 TAD (3100 DCA TTY2 JMS I (200 1 TTY1, 0 TTY2, 0 AO2, 7201 JMP I (IDBLVT TAD TTY2 DCA I (7600 TAD AO2 CMN, DCA OUHAND TAD (7601 DCA BLCK TAD I (7600 JMS I (200 3 BLCK, 7601 LENGTH, 0 JMP I (NOROOM TAD BLCK DCA I (BLCKN TAD (BUF DCA I (OCPTR TAD (RPOS-1 /SPR 2286 (MH) DCA I (RPOS TAD (-1200 /NUMBER OF WORDS IN BUFFER DCA I (OUWDCT DCA I (CLEN TAD I (7605 SNA JMP FINDSK /V3C IF NO DEVICE SPECIFIED, LOOKUP 'DSK' SETDEV, DCA I (7605 TAD (7605 DOMOIN, DCA INFPTR TAD (6601 DCA AI1 TAD I INFPTR SNA JMP I (ENDCHK JMS I (200 1 AI1, 6601 HLT TAD AI1 DCA INHAND TAD (OUTCHR DCA OSWTCH JMS I (CRLF TAD I (DATE DCA I (DATNOW /SAVE CURRENT DATE (MH) TAD I (DATE /GET DATE BACK INTO AC (MH) JMS I (PDATE JMS I (CRLF JMS I (CRLF DCA I (ECOUNT CMA TAD I (EQLS SMA /SET UP NEGATIVE COUNT CMA DCA I (ALNCNT /SAVE FOR LATER TAD I (ALNCNT /SAVE FOR LATER DCA I (LNCNT /SAVE FOR LATER JMP I (PG1 AINO, JMS I (ERROR ILLA+40 JMP EOLIN QINO, JMS I (ERROR ILLQ+40 EOLIN, TAD (215 /COME HERE TO ABORT DIRECTORY JMS I (TYPE /AND PRINT CRLF JMP I (ABORT /ABORT OPERATION AND GOTO ENDUP FINDSK, DCA XX /V3C JMS I (200 /CALL USR 12 /TO DO AN INQUIRE 5723 /TO LOCATE 'DSK' XX, 0 0 JMP I (IDBLVT /NO 'DSK' IMPOSSIBLE (SO SAY NO 'TTY') TAD XX /RETURN DEVICE NUMBER OF DSK JMP SETDEV PAGE DIRCTY=0 /LOCATION OF INPUT DIRECTORY PG1, TAD I INFPTR TAD (7757 DCA TEMP TAD I TEMP SMA CLA JMP NFIN CIF 0 JMS I INHAND 1400 DIRCTY 1 JMP INDERR CDF 0 /CODE TO CHECK FOR TAD I (DIRCTY /LEGALITY OF DIRECTORY CMA CLL TAD I (DIRCTY+2 CDF 10 SNL TAD (7700 SZL CLA JMP BIDIR /DIRECTORY IS BAD / COUNT NUMBER OF INPUTS FROM SAME DEVICE TAD INFPTR SKP GETCNT, TAD PTR IAC DCA PTR TAD I PTR SZA CLA JMP NOSUB TAD (5200 DCA I PTR TAD (3 TAD PTR DCA TEMP TAD (5200 DCA I TEMP NOSUB, TAD PTR TAD (4 DCA PTR ISZ CNT TAD I (OPT2 AND (10 SZA CLA JMP NOPTIM TAD I PTR CIA TAD I INFPTR SNA CLA JMP GETCNT NOPTIM, TAD CNT CIA DCA INSCNT TAD PTR DCA I (MOIN DCA BDPTR JMP I (NBLOCK BIDIR, JMS I (ERROR BADDIR+40 JMP I (EOLIN NFIN, JMS I (ERROR NFLEIN+40 JMP I (EOLIN INDERR, JMS I (ERROR BADIRD+40 JMP I (EOLIN /THIS IS THE ERROR MESSAGE PRINTER ERROR, 0 ISZ I (ECHO CLA CLL TAD (TYPE DCA OSWTCH TAD (-100 DCA CNT PLOOP, TAD I ERROR JMS I (GTSXBT DCA DFLAG TAD DFLAG JMS I (CONVTP ISZ CNT TAD DFLAG SZA CLA JMP PLOOP ISZ ERROR JMP I ERROR DFLAG, 0 ABORT, TAD I (ALTOPT /MOVED (MH) SMA CLA JMP I (CDCALL CIF CDF 0 JMP I (7605 BADEQ, JMS I (ERROR BIGEQ+40 JMP I (EOLIN PAGE /THIS IS THE SUPERQUASIFACETED DIRECTORY PATTERN MATCHING ROUTINE /THE INPUT DIRECTORY IS SEARCHED HERE, IF A MATCH /IS FOUND USING THE INPUT GROUPING /GOT1 GETS CONTROL WITH -BLOCKS IN THE AC NBLOCK, TAD BDPTR /POINTER TO START OF DIR BLOCK DCA XR CDF 0 TAD I XR /GET BLOCK NUMBER FIRST FILE DCA BLOCK TAD I XR /NEXT SEGMENT NUMBER DCA LFLAG /IF IT 0 WE AT END ISZ XR /SKIP TENTATIVE FILE WORD TAD I XR /GET -NUMBER OF INFO WORDS CIA /MAKE POSITVE DCA INFWDS TAD XR /POINT TO FIRST IAC /ENTRY DCA EPTR BLOOP, TAD I EPTR /GET FILENAME WORD CDF 10 SNA CLA /SKIP IF FILE HERE JMP EMPTY /NO... ITS REALLY AN EMPTY TAD INSCNT /SET NUMBER OF INPUT TO LOOK DCA NCNT /AT ALL AT ONCE DCA MATFLG /CLEAR MATCH FLAG TAD INFPTR /ADDRESS OF FIRST INPUT SKP MN1, TAD GPTR2 /ADDRESS OF CURRENT INPUT TAD (5 /GTSXBT SUBR REQUIRES US TO DCA GPTR2 /POINT TO END OF FIELD TAD EPTR /POINT DIRECTORY POINTER TO TAD (4 /END OF ENTRY FOR SAME REASON DCA GPTR1 TAD GPTR1 /SET EPNEXT TO POINT TO TAD INFWDS /MINUS NUMBER OF BLOCKS IN DCA EPNEXT /FILE WORD TAD (-10 /NUMBER OF CHARS TO LOOK AT WILDNM, DCA CNT MLP, TAD GPTR2 /OK - GET A CHARACTER FROM JMS I (GTSXBT /STRING TAD (-"*!7700 /IS IT AN * SNA /SKIP IF NOT * JMP WILDA /YEP... ITS A WILD CARD TAD ("*-"? /IS IT A ? SNA /SKIP IF NOT JMP WILD /YES... FORCE MATCH ON THIS CHAR TAD ("?&77 /RESTORE VALUE CIA /NEGATE DCA CHAR /AND SAVE TAD GPTR1 /NOW GET CHAR FROM DIRECTORY CDF 0 JMS I (GTSXBT CDF 10 TAD CHAR /DO CHARS MATCH SZA CLA /SKIP IF THEY DO JMP NM1 /NO MATCH ON THIS INPUT WILD, ISZ CNT /BUMP COUNT OF CHARS & POINTER JMP MLP /COMPARE ALL 8 MEXT, ISZ MATFLG /A MATCH!!!!!!! NM1, CLA /WILD CARD COMES HERE WITH ICHY AC ISZ NCNT /HAVE WE CHECKED GROUP OF INPUTS JMP MN1 /NO CHECK WHOLE GROUP TAD MATFLG /HAVE THERE BEEN ANY MATCHES SZA CLA /SKIP IF NOT TAD (4 /WILL INVERT /V SWITCH TAD I (OPT2 /ADD SWITCH AND (4 /ISOLATE IT CDF 0 /SKIPS IF INPUT DIRECTORY ENTRY IS NOT CANDIDATE /THAT IS - IF A MATCH WAS NOT FOUND BETWEEN ANY /OF THE INPUTS AND /V WAS NOT SPECIFIED OR /A MATCH WAS FOUND AND /V WAS SPECIFIED /THIS ALLOWS /V TO MEAN EVERYTHING BUT... SZA CLA TAD I EPNEXT /GET -NUMBER OF BLOCKS CDF 10 SZA /SKIPS IF TENTATIVE OR NOT CANDIDATE JMP I (GOT1 /PROCESS FILE NENT, TAD EPNEXT /POINT EPTR TO BLOCK DCA EPTR /COUNT OF FILE JMP NEMPTY EMPTY, ISZ EPTR /ON EMPTY MAKE EPTR POINT TO BLOCK COUNT JMS I (HEMPTY /HANDLE EMPTY SLOTS NEMPTY, CDF 0 TAD I EPTR /GET BLOCK COUNT CIA /MAKE POSITIVE TAD BLOCK DCA BLOCK /KEEP SUM ISZ EPTR /POINT TO NEXT ENTRY ISZ I BDPTR /POINTS TO -NUMBER OF ENTRIES JMP BLOOP /NOT DONE WITH SEGMENT CDF 10 TAD (400 /BUMP TO NEXT SEGMENT TAD BDPTR DCA BDPTR TAD LFLAG /DID WE PROCESS LAST SEGMENT SZA CLA /SKIP IF WE DID JMP NBLOCK /PROCESS NEW SEGNENT JMP I (SAYNON /HANDLE WILD CARDS WILDA, TAD CNT /GET CURRENT CHAR POSITION TAD (6 /ADD SIZE OF FILENAME SPA /SKIP IF IN EXTENSION FIELD JMP WILDNM /THIS BUMPS TO EXTENSION JMP MEXT /THIS MEANS IT HAS TO BE A MATCH CHAR, 0 EPNEXT, 0 GPTR2, 0 LFLAG, 0 NCNT, 0 BLOCK, 0 MATFLG, 0 PAGE GOT1, DCA IFCNT /-# OF BLOCKS IN AC JMS I (DATCHK /VERIFY /C AND /O SWITCHES TAD (OUTCHR DCA OSWTCH TAD I (OPT2 SPA CLA JMP I (NENT JMS I (ADDINF /SEE IF ADDITIONAL INFO WORDS TAD I (OPT2 AND (100 /IS /R USED SNA CLA JMP NOR TAD INFPTR /FILL IN *.* FOR FILENAME IAC DCA TEMP TAD (5200 /* DCA I TEMP ISZ TEMP ISZ TEMP ISZ TEMP /POINT TO EXTENSION TAD (5200 /.* DCA I TEMP /SUBSTITUTE IT NOR, TAD GPTR1 CDF JMS I (PNMSUB TAD I (OPT1 RTL SNL CLA JMP SKPBLK JMS I (CONVTP TAD I (BLOCK JMS BSPACE /(MH) PATCH FOR /B/E SKPBLK, TAD I (OPT1 AND (100 SZA CLA JMP NODATE TAD IFCNT CIA JMS I (PRNUM TAD INFWDS SNA CLA JMP NODATE CDF TAD I GPTR1 CDF 10 JMS I (PDATE NODATE, ISZ LNCNT /IS LINE FILLED? JMP MOROLN /NO JMS CRLF TAD ALNCNT /RESET COUNT DCA LNCNT JMP I (NENT MOROLN, TAD (5 /OUTPUT 5 BLANKS JMS I (BLANK JMP I (NENT /BLANKS ROUTINE BLANK, 0 CIA DCA BLTMP JMS I (CONVTP ISZ BLTMP JMP .-2 JMP I BLANK BLTMP, 0 ALNCNT, 0 LNCNT, 0 OUTCHR, 0 JMP I RPOS RPOS1, DCA I OCPTR JMS RPOS RPOS2, DCA HOLD JMS RPOS RPOS3, RTL RTL DCA HOLD2 TAD HOLD2 AND (7400 TAD I OCPTR DCA I OCPTR ISZ OCPTR TAD HOLD2 RTL RTL AND (7400 TAD HOLD DCA I OCPTR ISZ OCPTR ISZ OUWDCT SKP JMS DUMP JMS RPOS JMP RPOS1 RPOS, RPOS1 JMP I OUTCHR OUWDCT, 0 OCPTR, 0 HOLD, 0 HOLD2, 0 BSPACE, 0 /(MH) PATCH FOR /B/E JMS I (OPRNT CLA!IAC JMS I (BLANK JMP I BSPACE PAGE GTSXBT, HLT CLL RAL TAD CNT CML RAR DCA TEMP TAD I TEMP SNL JMS ROTR6 AND (77 JMP I GTSXBT ROTR6, 0 RTR RTR RTR JMP I ROTR6 CONVTP, HLT SZA TAD (240 AND (77 TAD (240 JMS I OSWTCH JMP I CONVTP TYPE, HLT DCA HOLD1 TAD (217 JMS I (CTYPE SKP DCA ECHO TAD ECHO SNA CLA JMP I TYPE JMS I (CINTER SKP JMP I (ABORT TAD HOLD1 JMS TTY JMP I TYPE HOLD1, 0 TTY, 0 TLS TSF JMP .-1 TAD (-215 SZA CLA JMP I TTY TAD (12 JMP TTY+1 ECHO, 1 OPRNT, 0 DCA GTSXBT TAD (-4 DCA CNT OPLP, TAD GTSXBT RTL CLL RAL DCA GTSXBT TAD GTSXBT RAL AND (7 TAD (260 JMS I (CONVTP ISZ CNT JMP OPLP JMP I OPRNT /ROUTINE TO MAKE SURE USER SPECIFIED //C AND /O SWITCHES CAUSE CORRECT MATCH WITH DATE DATCHK, 0 TAD I (OPT1 /CHECK /C JMS MDATE NOP /RETURN HERE WITH AC=0 IF NO /C SZA CLA /RETURN HERE WITH AC=0 IF DATES MATCH JMP I (NENT /DATES DONT MATCH AND /C GIVEN TAD I (OPT2 /CHECK /V JMS MDATE CMA CLA /SET AC=-1 IF NO /V SNA CLA /RETURN HERE AC=0 IF DATES SAME JMP I (NENT /DATES SAME WITH /V-IGNORE FILE JMP I DATCHK /CONTINUE MDATE, 0 //O AND /V ARE AC2 RTL /IS IT OPTION ON? SMA CLA /SKIP IF IT IS JMP I MDATE /NO- RETURN WITH 0 AC ISZ MDATE /SKIP RETURN CDF 0 TAD I GPTR1 /GET DATE WORD CIA CDF 10 TAD I (DATE /COMPARE WITH MONITORS, 0 IF = JMP I MDATE PAGE PRNUM, 0 DCA NUM TAD (PWRTEN DCA PTR PRNTLP, ISZ MPNTCNT SKP AC4000 DCA PNTFLG DCA DIG DIVLPY, TAD I PTR SNA JMP I PRNUM CLL TAD NUM SNL JMP PRTDIG DCA NUM ISZ DIG JMP DIVLPY PRTDIG, CLA TAD DIG TAD PNTFLG SNA STPBLK, JMP PRBLNK TAD (260 JMS I (CONVTP CLA CLL CML RAR NXTPWR, ISZ PTR JMP PRNTLP PRBLNK, JMS I (CONVTP JMP NXTPWR NUM, 0 PNTFLG, 0 DIG, 0 MPNTCNT,0 PWRTEN, -1750;-144;-12;-1;0 PDATE, 0 SNA JMP FDATE DCA DATEY TAD DATNOW /WAS A DATE ENTERED AT BOOT TIME?(MH) SNA /SKIP IF SO(MH) JMP FDATE /NO -- DON'T PRINT DATE IF NOT ENTERED(MH) AND (7 /YES -- SAVE YR NEGATED(MH) CMA!IAC /(MH) DCA DATTMP /SAVE THIS RESULT TEMP(MH) ISZ I (STPBLK JMS I (CONVTP ACM3 DCA I (MPNTCNT TAD DATEY RTR RAR AND (37 JMS I (PRNUM TAD ("- JMS I (CONVTP TAD DATEY CLL RTL RTL RAL AND (17 DCA PRNUM TAD PRNUM TAD PRNUM TAD PRNUM TAD (DATTAB-4 DCA XR ACM3 DCA CNT TAD I XR JMS I OSWTCH ISZ CNT JMP .-3 TAD ("- JMS I OSWTCH TAD DATEY AND (7 TAD DATTMP /ADD -ENTERED YR(MH) CLL /CLEAR LINK FOR FLAG USE(MH) SZA!SMA!CLA /SKIP AND CLEAR IF ENTERED YR BIGGER,SAME(MH) CML /SET LINK IF DIR YR BIGGER THAN ENETERED YR (MH) TAD DATEY /GET DATE BACK(MH) AND (7 /GET THE YR(MH) SZL /SKIP IF ENTERED YR WAS BIG OR SAME(MH) TAD (-10 /SUBTRACT 10 OCTAL IF DIR YR WAS BIGGER(MH) TAD DATINC /ADD DATE INCREMENT(MH) TAD (106 JMS I (PRNUM CLA CMA TAD I (STPBLK DCA I (STPBLK JMP I PDATE FDATE, TAD I (LNCNT /SEE IF AT END OF LINE? IAC /AC=0 NOW IF YES SNA CLA /OUT PUT SPACES TO FILL DATE SLOT JMP I PDATE /NO NEED FOR SPACES IF AT END OF LINE TAD (12 /10 SPACES IS WHATS NEEDED JMS I (BLANK JMP I PDATE /LEAVE DATEY, 0 DATNOW, 0 /CURRENT DATE IF ONE WAS ENTERED(MH) DATINC, 0 /DATE ENXTENSION TO 1970 (0,10,20, OR 30) (MH) DATTMP, 0 /TEMP STORE (MH) PAGE CTYPE, 0 DCA T2 TAD (200 KRS CIA TAD T2 SNA CLA KSF JMP I CTYPE KCC TAD ("^ JMS I (TTY TAD T2 TAD (100 JMS I (TTY TAD (215 JMS I (TTY ISZ CTYPE JMP I CTYPE T2, 0 CINTER, 0 TAD (203 JMS CTYPE JMP UPPCK JMP SPURGE UPPCK, TAD (220 JMS CTYPE JMP I CINTER SKP SPURGE, CMA DCA I (ALTOPT ISZ CINTER JMP I CINTER HEMPTY, 0 CDF 0 TAD I EPTR CDF 10 CIA TAD ECOUNT DCA ECOUNT TAD I (OPT1 AND (200 SZA CLA JMP LISTEM TAD I (OPT2 SMA CLA JMP I HEMPTY LISTEM, TAD I (OPT1 AND (10 /IS /I GIVEN SNA CLA /IF YES PAD BY ADDIDTIONAL INFO WORDS JMP EMSG CLA CMA TAD INFWDS /NUMBER OF SPACES=5*(INFWDS-1) DCA DFLAG TAD DFLAG RTL CLL TAD DFLAG SZA /DONT OUTPUT 4096 BLANKS JMS I (BLANK EMSG, TAD (EMPTYM-1 DCA XR1 TAD (-11 DCA CNT EOLP, TAD I XR1 JMS I (OUTCHR ISZ CNT JMP EOLP TAD I (OPT1 RTL SNL CLA JMP SKIPES JMS I (CONVTP TAD I (BLOCK JMS I (BSPACE /(MH) PATCH FOR /B/E SKIPES, CDF 0 TAD I EPTR CDF 10 CIA JMS I (PRNUM ISZ I (LNCNT /AT END OF LINE JMP WORK /NO. HAVE TO DO BLANK PADDING JMS I (CRLF TAD I (ALNCNT /RESET COUNT DCA I (LNCNT JMP I HEMPTY WORK, TAD (5 /FORCES 5 BLANKS JMS I (BLANK TAD I (OPT1 AND (100 /CHECK FOR /F SZA CLA /ADD 10 SPACES TO COVER DATE JMP I HEMPTY TAD (12 JMS I (BLANK JMP I HEMPTY ECOUNT, 0 PAGE PNMSUB, 0 DCA NMEPLC RDF TAD (CDF DCA FLDFUD TAD (-10 DCA CNT PNLOOP, TAD NMEPLC FLDFUD, HLT JMS I (GTSXBT CDF 10 JMS I (CONVTP TAD (3 TAD CNT SZA CLA JMP .+3 TAD (". JMS I OSWTCH ISZ CNT JMP PNLOOP JMP I PNMSUB NMEPLC, 0 WRTERR, JMS I (ERROR OUERR+40 JMP I (EOLIN CLOERR, JMS I (ERROR CLERR+40 JMP I (EOLIN NOROOM, JMS I (ERROR SPRBLM+40 JMP I (EOLIN IDBLVT, JMS I (ERROR NOTTY+40 JMP I (EOLIN SAYNON, TAD (OUTCHR DCA OSWTCH JMS I (CRLF JMS I (CRLF TAD (-4 /FORCE PRINTING OF ONLY 1 DIGIT DCA I (MPNTCNT /FOR 0 FREE BLOCKS TAD I (ECOUNT JMS I (PRNUM JMS I (CONVTP TAD (FRBLM-1 DCA XR1 TAD (-13 DCA CNT FRBLP, TAD I XR1 JMS I (OUTCHR ISZ CNT JMP FRBLP JMS I (CRLF TAD (14 /FORM FEED JMS I (OUTCHR TAD MOIN JMP I (DOMOIN MOIN, 0 CRLF, 0 TAD (215 JMS OUTCHR TAD (212 JMS OUTCHR JMP I CRLF /ROUTINE TO DUMP ADDITIONAL INFO WORDS IF WANTED ADDINF, 0 TAD I (OPT1 AND (10 /CHECK /I SWITCH SNA CLA JMP I ADDINF CLA CMA TAD INFWDS /GET NUMBER SPA SNA /MUST BE 2 OR MORE TO PRINT JMP CLARET /RETURN CIA DCA CNTX TAD GPTR1 IAC /BUMP TO FIRST ONE DCA PGPTR1 ADDLP, CDF 0 TAD I PGPTR1 /GET WORD CDF 10 JMS I (OPRNT /PRINT IT IN OCTAL JMS I (CONVTP /OUTPUT A BLANK ISZ PGPTR1 /BUMP ISZ CNTX /COUNT NUMBER JMP ADDLP CLARET, CLA /RETRN JMP I ADDINF PGPTR1, 0 CNTX, 0 PAGE VERNO, TEXT /DIRECT V6A / BADIRD, TEXT /ERROR READING INPUT DIRECTORY/ SPRBLM, TEXT /NO ROOM FOR OUTPUT FILE/ OUERR, TEXT /ERROR WRITING FILE/ CLERR, TEXT /ERROR CLOSING FILE/ NFLEIN, TEXT /DEVICE DOES NOT HAVE DIRECTORY/ BIGEQ, TEXT /EQUALS OPTION BAD/ ILLQ, TEXT /ILLEGAL ?/ ILLA, TEXT /ILLEGAL */ BADDIR, TEXT /BAD INPUT DIRECTORY/ NOTTY, TEXT /THERE IS NO HOPE-THERE IS NO TTY HANDLER IN YOUR SYSTEM/ EMPTYM, "<;"E;"M;"P;"T;"Y;">;240;240 FRBLM, "F;"R;"E;"E;240;"B;"L;"O;"C;"K;"S "B;"A;"D /PROTECTION AGAINST BAD DATE DATTAB, "J;"A;"N "F;"E;"B "M;"A;"R "A;"P;"R "M;"A;"Y "J;"U;"N "J;"U;"L "A;"U;"G "S;"E;"P "O;"C;"T "N;"O;"V "D;"E;"C "B;"A;"D /PROTECTION AGAINST BAD DATE "B;"A;"D /PROTECTION AGAINST BAD DATE "B;"A;"D /PROTECTION AGAINST BAD DATE DUMP, 0 TAD I (LENGTH /GET LENGTH AVAILABLE SNA /IF ZERO ITS NON FILE STRUCTURE JMP NOMATR /IF ZERO DOESNT MATTER CLL TAD I (CLEN /ADD CURRENT SIZE TAD (5 /ADD # OF BLOCKS SZL CLA /WE ARE OK IF SKIPS JMP I (NOROOM TAD I (CLEN /UPDATE CLOSING LENGTH TAD (5 /BY NUMBER OF BLOCKS DCA I (CLEN /SAVE FOR CLOSE NOMATR, TAD OUWDCT TAD (5210 DCA CTLWD CIF 0 JMS I OUHAND CTLWD, 5210 BUFAD, BUF BLCKN, 0 JMP WRTERR TAD (5 TAD BLCKN /UPDATE BLOCK # BY 5 DCA BLCKN TAD (-1200 DCA OUWDCT TAD BUFAD DCA OCPTR JMP I DUMP / *4600 JMS INIT JMS INIT JMP I (2000 JMP I (2001 INIT, 0 ISZ INIT CLA CLL TAD (2000 CDF 0 DCA I (7745 TAD (6403 DCA I (7746 CDF 10 JMP I INIT $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 | /DECTAPE COPY, V10 / / / / / / // / / / / /COPYRIGHT (C) 1966, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /DECTAPE COPY /VERSION .B07 / / /COPYRIGHT 1968 DIGITAL EQUIPMENT CORPORATION / MAYNARD, MASS. OCTOBER,1968 / THIS PROGRAM COPIES A DECTAPE FROM ONE / SPECIFIED UNIT TO ANOTHER. ALL DECTAPE / ROUTINES ARE INTERNALLY GENERATED SO THAT / IT MAY BE RUN WITHOUT THE MONITOR SYSTEM. / / STARTING ADDRESS IS 200 / DTRA=6761 DTCA=6762 DTXA=6764 DTSF=6771 DTRB=6772 DTLB=6774 WC=7754 CA=7755 / THESE AREAS ARE USED BY DATA BREAK BUFIOT=1547 /INPUT OUTPUT BUFFER BUFCHK=4563 /RE-READ BUFFER / *20 / PAGE ZERO WORKING STORAGE BADTRY, -3 /COUNT OF READ ERRORS CURBLK, 0 /CURRENT BLOCK NUMBER TRASH1, 0 /WORKING STORAGE TRASH2, 0 /WORKING STORAGE TRASH3, 0 /WORKING STORAGE BLKCNT, 0 /NUMBEROF BLOCKS TO READ /OR MINUS THAT NUMBER SORBLK, 0 /STORAGE FOR CURBLK WORDS, 0 /NUMBER OF WORDS PER BLOCK INUNIT, 0 /INPUT UNIT IN LH OCT CHAR OUTUNI, 0 /OUTPUT UNIT IN LH OCT CHAR RESTOR, 0 /NUMBER OF WORDS TO COPY RESAVE, 0 /NEGATIVE OF BLKCNT SMICAR, 0 /CHARACTER STORAGE SMISUM, 0 /RUNNING SUM SPELIN, 0 /POINTER SEAZIK, 0 /INPUT AREA SEAZOK, 0 /TEMP STORAGE DECTWC, 0 /FLAG TO DETERMINE IF VALIDATION WILL OCCUR DECTCA, 0 /CURRENT ADDRESS STORE FIRST, 0 /STARTING BLOCK NUMBER LAST, 0 /LAST BLOCK NUMBER LENGTH, 0 /NUMBER OF WORDS TO COPY PARITY, 0 /PARITY ERROR FLAG (COUNT) MSKIN, 0 /NEGATIVE OF INUNIT PARDEL, PSTACK /POINTER TO PARITY TABLE / / PAGE ZERO SUBROUTINES DIREC, 0 CLA DTRA /FIND DIRECTION AND [400 SZA CLA /BRANCH BACK ISZ DIREC /REVERSE DIRECTION EXIT JMP I DIREC /FORWARD DIRECTION EXIT / / BACKUP, 0 /SUBROUTINE REWINDS TAPE CLA DTRA AND (670 /CLEAR DIRECTION AND MOVEMENT DTXA TAD (600 /GO IN REVERSE DTXA DTSF JMP .-1 /WAIT UNTILL DONE JMS I [ERROR /BUSYWORK FOR ERRORS JMP I BACKUP /EXIT ON ENDZONE ERROR JMP BACKUP+1 *200 BEGIN, CLA CLL /INITIALIZE DTLB TLS /TELETYPE OUTPUT JMS I [SPEAK MESS0 JMS I [SPEAK MESS1 /INPUT UNIT NUMBER JMS GETNUM /CHECK INPUT UNIT NUMBER DCA INUNIT TAD INUNIT CIA /SET UP INPUT UNIT MASK DCA MSKIN JMS I [SPEAK MESS2 /OUTPUT UNIT NUMBER JMS GETNUM TAD MSKIN /MAKE SURE UNITS ARE DIFFERENT SNA JMP BEGIN /INPUT ERROR TAD INUNIT DCA OUTUNI JMS I [SPEAK /GET FIRST BLOCK NUMBER MESSA JMS I [SMIGIT NOP DCA CURBLK TAD CURBLK CIA /STORE BEGINNING MARKER DCA FIRST JMS I [SPEAK /GET LAST BLOCK NUMBER MESSB JMS I [SMIGIT CLA CMA /KLUDGE IF NO INPUT DCA LAST TAD FIRST CLL SZA TAD LAST /MAKE SURE VALID SZA SNL CLA JMP BEGIN DTLB TAD INUNIT /INIT INPUT UNIT JMS I [FIXTAP DCA WORDS /SET UP BLOCK LENGTH TAD OUTUNI /INIT OUTPUT UNIT JMS I [FIXTAP CIA /MAKE SURE BLOCK LENGTH TAD WORDS /SAME ON INPUT AND OUTPUT SZA CLA JMP BADLEN /BLOCK LENGTH ERROR JMS I [SPEAK /TYPE OUT BLOCK LENGTH MESS3 TAD WORDS JMS I [TYPNUM JMS I [SPEAK /SEND <RETURN><LINE FEED> MESS0+11 TAD WORDS CIA /COMPUTE NUMBER OF BLOCKS DCA LENGTH /TO READ AND WRITE DCA BLKCNT /CLEAR BLOCK COUNTER TAD [3014 /LOAD BUFFER SIZE TAD LENGTH SPA JMP BADLEN /TOO MANY WORDS PER BLOCK ISZ BLKCNT /TALLY TAD LENGTH SMA JMP .-3 /CONTINUE COUNTING TAD WORDS /GET NUMBER OF TAD [-3014 /WORDS TO READ CIA /AND TO WRITE DCA RESTOR /PRESERVE IN RESTOR TAD RESTOR DCA LENGTH TAD BLKCNT /SAVE NEGATIVE OF BLKCNT CIA DCA RESAVE JMS I [SPEAK MESSC JMS I [SMIGIT NOP DCA DECTWC /SET UP VERIFY FLAG / / MAIN LOOP FOR COPY LETS, TAD CURBLK /CHECK FOR PARTIAL BLOCK TO COPY TAD BLKCNT CLL CMA IAC TAD LAST SZL JMP LETT /COPY FULL LENGTH DCA LENGTH /ADJUST WORDS TO COPY TAD RESTOR CIA TAD WORDS ISZ LENGTH JMP .-2 /COMPUTE PROPER LENGTH CIA TAD WORDS DCA LENGTH TAD [REVERS /KLUDGE COPY EXIT DCA I [COPY JMP I [COPY+1 /PERFORM THIS COPY LETT, JMS I [COPY /COPY THIS BLOCKS TAD BLKCNT TAD BLKCNT /ADVANCE CURRENT BLOCK TAD CURBLK DCA CURBLK JMS DIREC JMP LETU /FORWARD EXCEEDED CHECK LETR, TAD CURBLK /REVERSE CHECK TAD FIRST CMA SZA CLA /CHECK FOR MINUS 1 JMP LETT /CONTINUE COPY JMP I [DONE /FINISHED JOB LETU, TAD CURBLK CLL CMA IAC TAD LAST SZL CLA /CHECK FOR END OF TAPE JMP LETS JMP I [REVERV / THIS SUBROUTINE GETS INPUT / AND OUTPUT UNIT NUMBERS FROM / THE TELETYPE AND VALIDATES THEM. / GETNUM, 0 JMS I [SMIGIT NOP AND [7 CLL RTR /MOVE TO LH THREE BITS RTR JMP I GETNUM / / BADLEN, JMS I [SPEAK /BLOCK LENGTH ERROR MESS3A JMP BEGIN / / / PAGE / / THIS TURN AROUND IS ENTERRED / WHEN THE LAST COPY MOVED INTO / THE FINAL DATA AREA REVERV, TAD LAST DCA CURBLK /START OF COPY BACK JMS REVALT /CHANGE INUNIT AND OUTUNI TAD INUNIT DTCA DTXA JMS I [RESET /REPOSITION TAPE TAD OUTUNI DTCA DTXA JMS I [RESET /REPOSITION TAPE REBACK, TAD CURBLK CMA /COMPUTE NEW COPY LENGTH TAD SORBLK TAD BLKCNT SNA JMP REVERS /KLUDGE IF NOTHING TO DO DCA SORBLK /MINUS # OF BLOCKS TAD SORBLK DCA BLKCNT /SAVE THIS NUMBER TAD WORDS ISZ SORBLK JMP .-2 DCA LENGTH /LENGTH FOR COPY JMS I [COPY /PERFORM IT TAD CURBLK TAD BLKCNT TAD RESAVE /ADVANCE CURBLK DCA CURBLK TAD RESAVE DCA BLKCNT TAD RESTOR DCA LENGTH JMP I [LETR /CONTINUE COPY / / / THIS TURN AROUND IS ENTERRED / WHEN THE LAST SEARCH FOR / CURRENT BLOCK CAUSED AN END / OF TAPE ERROR / REVERT, JMS DIREC SKP JMP I [DONE /FINISHED IF DIRECTION REVERSE TAD SORBLK DCA CURBLK /RESTORE CURBLK TAD OUTUNI /RESET LOCATION OF DTCA DTXA /OUTPUT DECTAPE AND JMS I [RESET /FIND LAST BLOCK TAD [4000 /BY LOOKING FOR IMAGINARY JMS I [SEARCH /BLOCK NUMBER (KLUDGING SEARCH) NOP JMP .-3 /TRY AGAIN ON ERRORS TAD SEAZIK /MUST BE LAST BLOCK NUMBER DCA CURBLK JMS REVALT /CHANGE INUNIT AND OUTUNI JMP REBACK / / / THIS TURN AROUND IS ENTERRED WHEN THE / END BLOCK FOR COPY WAS REACHED BY A / PARTIAL BUFFER COPY. / REVERS, CLA CMA /ADJUST CURBLK POINTER TAD SORBLK DCA CURBLK TAD RESAVE DCA BLKCNT /MAKE BLKCNT NEGATIVE TAD RESTOR DCA LENGTH /RESTORE COPY LENGTH JMS REVALT /CHANGE INUNIT AND OUTUNI JMP I [LETR / REVALT, 0 TAD OUTUNI TAD [400 DCA OUTUNI /REVERSE DIRECTION TAD INUNIT TAD [400 DCA INUNIT /REVERSE DIRECTION JMP I REVALT / /THIS SUBROUTINE PERFORMS THE OPERATION /OF COPYING N BLOCKS AND VALIDATING /THE OUTPUT. /WHEN END OF TAPE IS REACHED THE ROUTINE /BRANCHES TO "REVERS", OR TO REVERT /AS APPROPRIATE. / COPY, 0 KSF /CHECK FOR <^C> JMP .+5 KRB TAD [-203 SNA JMP I [7600 CLA TAD INUNIT /LOAD STAT REG A DTCA DTXA TAD [-3 DCA BADTRY /RESTORE ERROR COUNTER JMS I [DECTAP COPO, BUFIOT /INPUT AREA 30 /READ CODE NOP /NORMAL RETURN TAD PARITY /CHECK PARITY FLAG SZA JMP I [ERRPAR /FIX MESSAGE FOR PARITY ERRORS COPZ, TAD OUTUNI /(IGNORE END ZONE) DTCA DTXA /OUTPUT UNIT & DIRECTION COPYB, JMS I [DECTAP /WRITE OUTPUT TAPE BUFIOT /OUTPUT BUFFER 50 /WRITE CODE JMP COPCPR /NORMAL RETURN TAD [REVERS /END ZONE RETURN DCA COPY /FIX UP EXIT COPCPR, TAD CURBLK DCA SORBLK /STORE CURRENT BLOCK NUMBER TAD DECTWC SZA CLA JMP I COPY /NO VERIFICATION JMS I [RESET /RETURN TO FRONT END JMS I [DECTAP /READ DATA COPR, BUFCHK /INPUT AREA 30 /READ CODE JMP .+2 /NORMAL RETURN BRANCH TAD I [WC /END ZONE RETURN TAD LENGTH CIA DCA TRASH3 /COUNTER TAD COPO DCA 17 /FORWARDS POINTER TAD COPR /REREAD BUFFER DCA 16 /SET UP POINTER COPCML, TAD I 16 CIA TAD I 17 SZA JMP COPERR /MISMATCH ON READ ISZ TRASH3 /ANY MORE WORDS JMP COPCML /LOOP JMP I COPY /MADE IT! EXIT COPERR, ISZ BADTRY /HOW MANY ATTEMPTS JMP COPERS /TRY AGAIN JMS I [SPEAK MESS5 /RE-READ ERRORS JMS I [TUNIT /TYPE UNIT NUMBER AND WAIT TAD [-3 DCA BADTRY /RESTORE ERROR COUNTER COPERS, CLA JMS I [RESET JMP COPYB /WRITE OUT BLOCK AGAIN / PAGE / THIS SUBROUTINE MOVES THE DECTAPE / BACK IN PREPARATION FOR ANOTHER / READ OR WRITE. / RESET, 0 CLA CLL /CLEAR AC AND LINK TAD [400 /CHANGE DIRECTION DTXA JMS DIREC /FIND DIRECTION TAD [6 /FORWARD MAKE +3 TAD [-3 /REVERSE MAKE -3 TAD CURBLK SPA /MAKE SURE VALUE IS PLUS JMP RESEV JMS I [SEARCH /FIND THIS BLOCK SKP CLA /FOUND IT JMP RESET+4 REEXT, DTRA AND [200 /CLEAR STOP-GO FLAG TAD [400 /AND REVERSE DIRECTION DTXA JMP I RESET RESEV, JMS BACKUP /REWIND THIS TAPE JMP REEXT / / / THIS BRANCH IS TKEN WHEN / ALL COPYING IS COMPLETED DONE, JMS I [SPEAK MESS4 JMS I [SMIGIT JMP I [BEGIN JMP I [BEGIN /THIS SUBROUTINE READS NUMBERS, /NOT EXCEEDING 4098, FROM A TELETYPE /AND RETURNS THE OCTAL VALUE OF INPUT. /THE FOLLOWING SPECIAL CHARACTERS /ARE USD...<RETURN> MARKS END OF INPUT, CAUSES A <CR><LF> /IF THE <RETURN> IS THE FIRST CHARACTER THEN /DIRECT RETURN IS TAKEN, ELSE RETURN IS TO ENTRY+2 / <^C> CAUSES A BRANCH TO 7600 / SMIGIT, 0 KCC /INITIALIZE TTY INPUT DCA SMISUM /CLEAR TEMP STORAGE JMS TTYIN /GET CHAR AND [177 TAD [200 TAD [-215 /CHECK FOR <RETURN> SNA JMP SMIXIT /EXIT ON FIRST <RETURN> ISZ SMIGIT /ADVANCE EXIT POINTER SMIGOP, TAD [12 /CHECK FOR ^C SNA JMP I [7600 /BRANCH TO MONITOR TAD [-65 /CHECK FOR DIGITS CLL TAD [10 SNL JMP SMILOP /INVALID CHARACTER DCA SMICAR /TEMP STOR TAD SMISUM /GET CHARACTER STRING CLL RAL CLL RAL CLL RAL /ROTATE TO LH POSITION TAD SMICAR /APPEND CURRENT DIGIT DCA SMISUM TAD SMICAR TAD [260 /MAKE ASCII JMS TYPE /ECHO CHARACTER SMILOP, JMS TTYIN /GET NEXT CHARACTER TAD [-215 /CHECK FOR <RETURN> SZA JMP SMIGOP /CONTINUE LOOP SMIXIT, JMS I [SPEAK /SEND A <RETURN><LINE FEED> MESS0+11 TAD SMISUM /GET INPUT STRING JMP I SMIGIT /EXIT /THIS SUBROUTINE READS A CHARACTER FROM THE TTY TTYIN, 0 KSF /WAIT UNTIL READY JMP .-1 KRB /READ TTY BUFFER JMP I TTYIN /THIS SUBROUTINE TYPES OUT A /DIGIT STRING FROM THE AC /AS FOUR OCTAL CHARACTERS TYPNUM, 0 DCA SMICAR /PRESERVE STRING VALUE TAD [-4 DCA SMISUM /INITIALIZE COUNTER TYPXL, TAD SMICAR RTL RAL /GET NEXT PRINT DIGIT DCA SMICAR /RETURN TO STRING TAD [3 AND SMICAR RAL /ENTER CURRENT DIGIT TAD [260 /MAKE ASCII JMS TYPE /TYPE DIGIT ISZ SMISUM /COUNT DIGITS JMP TYPXL /COUNTINUE LOOP JMP I TYPNUM /EXIT /THIS SUBROUTINE TYPES OUT A /MESSAGE IN "TEXT" FORMAT TWO /ASCII CHARACTERS PER WORD. /SPECIAL CHARACTERS ARE NOT /PERMITTED. A CARRIGE RETURN /AND LINE FEED PRECEED THE /MESSAGE. / JMS I [SPEAK <BRANCH TO SUBROUTINE> / MESSAGE <POINTER TO MESSAGE BUFFER> /A ZERO WORD MARKS THE /END OF THE MESSAGE. / SPEAK, 0 CLA CLL TAD [215 JMS I [TYPE /CARRIGE RETURN TAD I SPEAK /GET ADDRESS OF OUTPUT DCA SPELIN ISZ SPEAK TAD [212 JMS I [TYPE /LINE FEED SPEELH, TAD I SPELIN /GET NEXT WORD SNA /CHECK FOR ZERO JMP I SPEAK /EXIT IF ZERO AND [7700 /GET LH CHARACTER CLL RTR /MOVE TO RTR /RIGHT HAND RTR /SIX BITS JMS SPEOUT /TRANSLATE AND OUTPUT TAD I SPELIN ISZ SPELIN /ADVANCE POINTER AND [77 /GET RH CHARACTER JMS SPEOUT /TRANSLATE AND OUTPUT JMP SPEELH SPEOUT, 0 TAD [-40 /CHECK FORMAT SMA TAD [-100 /KLUDGE DIGITS FORMAT<200+XX> TAD [340 /ALPHA FORMAT <300+XX> JMS I [TYPE /OUTPUT IT JMP I SPEOUT /RETURN / /THIS SUBROUTINE TYPES OUT /THE ASCII CHARACTER IN THE AC. / TYPE, 0 TSF /WAIT UNTIL READY JMP .-1 TLS /TYPE CHARACTER CLA JMP I TYPE / /THIS SUBROUTINE TYPES OUT THE /CURRENT UNIT NUMBER TUNIT, 0 CLA DTRA AND [7000 /GET CURRENT UNIT NUMBER CLL RTL /MOVE OVER RTL TAD [260 /MAKE ASCII CODE JMS I [TYPE /TYPE IT JMS I [SMIGIT /WAIT JMP I TUNIT /EXIT JMP I TUNIT / / PAGE /THIS SUBROUTINE SEARCHES DECTAPE /IN A FORWARD OR REVERSE DIRECTION. /STATUS REGISTER A SHOULD CONTAIN /UNIT SELECT NUMBER (0-2), FORWARD /OR REVERSE, AND A5=1. /THE BLOCK NUMBER FOR WHICH THE PROGRAM IS /SEARCHING MUST BE IN THE AC. /ON ERROR RETURN THE COMAND /FOLLOWING THE "JMS" IS SKIPPED, /AN END OF TAPE ERROR WILL CAUSE /THREE MOVES INTO ENDZONE AND TWO COMMANDS FOLLOWING /THE "JMS" ARE SKIPPED SEARCH, 0 CIA /FORM TWO'S COMPLEMENT DCA SEAZOK /STORE - BLOCK NUMBER DCA SEAZIK /CLEAR INPUT WORD DTRA AND [274 DTXA /CLEAR OUT A REGISTER TAD [210 /START DEVICE DTXA JMS DIREC /DETERMINE DIRECTION TAD [NOP-CIA /FORWARD...FIX TO "NOP" TAD [CIA /REVERSE...FIX TO "CIA" DCA SEATIX /FIX UP COMMAND TAD [SEAZIK /BLOCK NUMBER INPUT DCA I [CA /PUT IN CURRENT ADDRESS CLA CMA /NUMBER OF BLOCKS=1 JMS SEARUN /FIND FIRST BLOCK MARK TAD [100 /SET CONTINUOUS MODE FLAG DTXA TAD SEAZIK /BLOCK NUMBER HERE TAD SEAZOK /MINUS BLOCK NUMBER THERE SEATIX, NOP /IFSEARCHING IN REVERSE DIRECTION *.-1 CIA /IF SEARCHING IN FORWARD DIRECTION SPA /SKIP IF DONE JMS SEARUN /FIND "N" BLOCK MARKS DTRA AND [100 /CLEAR CONTINUOUS MODE FLAG DTXA JMP I SEARCH /NORMAL EXIT SEARUN, 0 DCA I [WC /NUMBER OF BLOCKS TO READ DTXA DTSF /CHECK FOR DONE JMP .-1 DTRB /READ STATUS REGISTER B SMA CLA JMP I SEARUN /DT FLAG...NORMAL EXIT JMS I [ERROR /HANDLE ALL ERRORS ISZ SEARCH /END OF TAPE ERROR ISZ SEARCH /ALL OTHER ERRORS JMP SEARUN-4 /EXIT /THIS SUBROUTINE READS OR WRITES /<N> WORDS, IN CONTROL MODE, ON /A BLOCK(S) ASSUMING THAT /THE DECTAPE IS PROPERLY /POSITIONED. IN LINE CODE: / JMS I [DECTAP / <BUFFER> ADDRESS TO READ INTO (OR WRITE FROM) -1 / <3> IF READ, <5> IF WRITE /<<NORMAL RETURN>> /<<END OF TAPE ERROR>> /AN END OF TAPE ERROR WHILE SEARCHING /CAUSES A BRANCH TO "REVERT". /STATUS REGISTER A SHOULD CONTAIN: /AO-2 UNIT NUMBER /A3 FORWARD=0, REVERSE=1 /A4 UNIMPORTANT, SHOULD BE ZERO /A5 1 /A6-8,89 UNIMPORTANT /BLOCK NUMBER IN PAGE ZERO "CURBLK" /NUMBER OF WORDS TO READ OR /WRITE IS IN PAGE ZERO "LENGTH" / DECTAP, 0 TAD I DECTAP /GET INPUT BUFFER DCA DECTCA /STORE ISZ DECTAP DECAGN, TAD CURBLK /SEARCH FOR BLOCK JMS I [SEARCH JMP DECRUN /FOUND IT JMP DECAGN JMP I [REVERT /END ZONE ERROR DECRUN, TAD SEAZIK TAD SEAZOK /CHECK TO SEE IF FOUND BLOCK SZA JMP DECEXT-3 TAD LENGTH /SET UP WORD COUNT CIA DCA I [WC TAD DECTCA /AND INPUT OUTPUT BUFFER DCA I [CA TAD I DECTAP /GET READ OR WRITE DECLOP, DTXA /START GOING DTSF JMP .-1 DTRB /GET FLAGS SMA JMP DECEXI JMS I [ERROR JMP DECEXT-1 /ENDZONE ERROR JMS I [RESET /RESTORE POINTERS JMP DECAGN ISZ DECTAP /END OF TAPE EXIT DECEXT, ISZ DECTAP CLA JMP I DECTAP /FINISHED DECEXI, CLA TAD I [WC /HAVE WE FINISHED? SZA CLA JMP DECLOP /NO-:CONTINUE READ-WRITE DTRA /YES--CLEAR STATUS AND [274 DTXA JMP DECEXT /THIS SUBROUTINE CHECKS THE CONTENTS /OF STATUS REGISTER B. / <BRANCH> JMS I [ERROR / <+1 END OF TAPE ERROR> / <+2 ALL OTHER ERRORS> /IN ADDITION: 1--A SELECT ERROR WILL /CAUSE A TYPEOUT AND HALT. 2--A PARITY /ERROR ON OUTPUT TAPE CAUSES A /BRANCH TO "COPERS"; ON INPUT TAPE /"PARITY ERROR" IS TYPED OUT. 3--GO FLIP-FLOP /AND STATUS REGISTER A6-8 WILL BE CLEARED. / ERROR, 0 CLA CLL DTRB /GET ERROR FLAGS AND [200 /PARITY ERROR FLAG SNA CLA JMP ERNOT /HANDLE OTHER ERRORS DTXA /CLEAR FLAGS, CONTINUE READ MODE DTRA /GET UNIT NUMBER AND [7000 TAD MSKIN /CHECK FOR INPUT UNIT SZA JMP I [COPERR /ERROR ON OUTPUT UNIT TAD I [WC /PUT WORD COUNT IN PUSH CIA DCA I PARDEL /DOWN STACK ISZ PARDEL /ADVANCE POINTER ISZ PARITY /SET FLAG JMP I [DECEXI /RETURN TO READ ERNOT, DTRA /GET STATUS REGISTER A AND [274 TAD [2 /DO NOT DISTURB ERROR FLAGS DTXA /CLEAR A4 AND A6-8 DTRB /GET ERROR FLAGS RTL SMA /SKIP IF END OF TAPE ERROR JMP ERROTH CLA TAD [-3 /LOAD -3 DCA ERRSOR /STORE IN COUNT TAD [200 /GO FLIP-FLOP DTXA /SET DTSF JMP .-1 ISZ ERRSOR /HAVE WE DONE THREE TIMES JMP .-5 JMP I ERROR /EXIT ERRSOR, 0 ERROTH, ISZ ERROR /CHANGE ERROR BRANCH SZL CLA CLL /MARK TRACK ERROR RTL SNL CLA JMP I ERROR /TIMING ERROR BRANCH JMS I [SPEAK /SELECT ERROR MESSAGE ERRSEL ERRUNT, JMS I [TUNIT JMP I ERROR / PAGE / VARIOUS MESSAGES MESS0, TEXT %DECTAPE COPY V10A % MESSA, TEXT %FIRST BLOCK TO COPY (OCTAL) % MESSB, TEXT %FINAL BLOCK TO COPY (OCTAL) % ERRSEL, TEXT %SELECT ERROR ON UNIT #% PMESS, TEXT %PARITY ERROR ON BLOCK % MESSC, TEXT %VERIFY OUTPUT? (0=YES, 1=NO): % MESS1, TEXT %FROM UNIT % MESS2, TEXT %TO UNIT % MESS3, TEXT %PDP-8 WORDS PER BLOCK % MESS4, TEXT %DONE% MESS5, TEXT %WRITE ERRORS ON UNIT #% MESS3A, TEXT %BLOCK LENGTH ERROR% / / PAGE / / /THIS ROUTINE TYPES OUT PARITY ERROR MESSAGES /AND RESTORES POINTERS TO THE PUSH DOWN STACK. ERRPAR, CIA DCA PARITY /SET UP STACK COUNTER CLA CMA TAD PARDEL /MOVE POINTER BACK DCA PARDEL JMS I [SPEAK /TYPE OUT MESSAGE PMESS TAD CURBLK EPLOOP, DCA EPJK TAD I PARDEL /CHECK FOR CORRECT BLOCK NUMBER TAD WORDS /ADVANCE BLOCK WORDS COUNT DCA I PARDEL TAD I PARDEL CIA /REACHED ORIGINAL VALUE? TAD LENGTH SNA CLA JMP EPTYP /TYPE BLOCK AT ERROR JMS DIREC CLL CMA RAL /ADD ONE IF FORWARD CMA /SUBTRACT ONE IF NEGATIVE TAD EPJK /NEXT BLOCK NUMBER JMP EPLOOP /CONTINUE LOOP EPTYP, TAD EPJK JMS I [TYPNUM /TYPE BLOCK NUMBER ISZ PARITY /ADVANCE COUNTER JMP ERRPAR+2 /CONTINUE LOOP JMP I EPPEXT /RETURN TO COPY EPPEXT, COPZ /REENTRY TO COPY EPJK, 0 /WORKING STORAGE /THIS SUBROUTINE READS A RANDOM /BLOCK ON DECTAPE TO DETERMINE THE BLOCK LENGTH FIXTAP, 0 TAD [610 /FIX A REG. WORD DTCA DTXA /LOAD A STAT. REG. CLA CMA DCA I [WC /SEARCH FOR 1 BLOCK TAD [BUFIOT /FIX CURRENT ADDRESS DCA I [CA /TO READ INTO BUFFER DTSF /WAIT AROUND JMP .-1 DTRB SPA CLA JMP FIXERR /HANDLE ERROR CONDITIONS TAD [30 /CHANGE TO READ MODE DTXA DTSF /WAIT TILL READ DONE JMP .-1 TAD [200 /STOP TAPE DTXA TAD I [WC /GET BLOCK LENGTH JMP I FIXTAP /EXIT FIXERR, JMS I [ERROR TAD [400 /END OF TAPE...REVERSE DIRECTION TAD [210 /START TAPE MOVING DTXA /AND CLEAR FLAGS JMP FIXTAP+3 /TRY AGAIN /PARITY ERROR WORD COUNT STACK PSTACK, 0 / /END OF PROGRAM $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 | /TC08 DECTAPE FORMATTER, V4 / / / / / / // / / / / /COPYRIGHT (C) 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /COPYRIGHT 1970 DIGITAL EQUIPMENT CORP. /MAYNARD, MASS. /REVISED APRIL 1970 / TOG-8 TO MARK AND CHECK PDP-8 DECTAPE /THIS PROGRAM WRITES TIMING AND MARK TRACKS ON /DECTAPE MOUNTED ON THE TCO1-TU55 TAPE CONTROL UNIT. X1=10 X2=11 /SYMBOL TABLE AUGMENTATION DTRA=6761 DTCA=6762 DTXA=6764 DTSF=6771 DTRB=6772 DTLB=6774 DTCX=6766 /SET 0 FOR THE LOGIN FEATURE *0 0 JMP I .+1 CONC /CONTROL "C" AND LOGIN /WORKING LOCATIONS *20 W1, 0000 W2, 0000 W3, 0000 W4, 0000 W5, 0000 W6, 0000 BLOCKS, 0000 BLOCKA, 0000 DTA, 0000 ERX, 0000 PHASE, 0000 TOTAL, 0000 VAR1, 0000 VAR2, 0000 /CONSTANTS C1, 0001 C2, 0002 C3, 0003 C4, 0004 C0017, 0017 C0070, 0070 C0077, 0077 C0007, 0007 C0030, 0030 C0400, 0400 C0700, 0700 C203, 0203 C201, 0201 C210, 0210 C260, 0260 C261, 0261 C267, 0267 C270, 0270 C271, 0271 C277, 0277 C1000, 1000 C1620, 1620 C7000, 7000 C7700, 7700 C7714, 7714 C7761, 7761 C7772, 7772 C7775, 7775 CRCOD, 0215 LETK, 0313 LFCOD, 0212 M2, -2 M3, -3 M4, -4 M6, -6 M7, -7 M14, -14 M144, -144 M300, -300 SPCOD, 0240 /INTERPAGE LINKS ADW2, W2-1 ADW3, W3-1 BADD, BUFFER-1 BFR, BUFFER CA, 7755 COMPAR, COMPRE FCON, 0000 IT, INIT1 FORMA, FORM-1 FORMB, FORM QU1, Q1 QU2, Q2 QU3, Q3 QU4, Q4 MESS, MES STX, START TURN, TRN TYOCT, TYCT TYPE, MESAGE TYPIN, TYPN WAIT, STALL WC, 7754 DBUFPT, 0 /POINTER TO CURRENT POSITION IN DTA LIST /TYPE THE CHARACTER IN THE AC ON THE KEYBOARD PRINTER RSEND, 0000 TLS /LOAD AND PRINT, CLEAR FLAG TSF /WAIT FOR CONFIRMATION JMP .-1 /ENDLESSLY TCF /CLEAR THE FLAG ANYWAY JMP I RSEND /PRINT A "?" ON THE KEYBOARD TYPER QU, .+1 IOF /KILL LOG AND CONTROL C FCTN CLA CLL /C(AC)+C(L)=0 TAD C277 /"?" JMS RSEND /TYPE THE CHARACTER JMP I .+1 /RESTART INIT /DECTAPE CONTROL WORDS DT0030, 0030 DT0060, 0060 DT0070, 0070 DT0100, 0100 DT0130, 0130 DT0140, 0140 DT0200, 0200 DT0210, 0210 DT0360, 0360 DT0510, 0510 DT0600, 0600 DT0610, 0610 /SOME SPECIAL LINKS ADBA, 2475 ADWA, 2476 ADWAB, 2477 /CONSTANTS FOR FORMULA TRANSLATION SECTION BINCON, .+1 0001 0012 0144 1750 *200 /PAGE 1 /TYPE CANNED MESSAGES..... /THANKS TO DIGITAL 8-18-U MESAGE, 0 IOF /KILL LOG AND CONTROL FUNCTION CLA CMA /SET C(AC)=-1 TAD MESAGE /ADD LOCATION DCA 10 /AUTO INDEX REGISTER TAD I 10 /FETCH FIRST WORD DCA MSRGHT /SAVE IT TAD MSRGHT RTR RTR /ROTATE 6 BITS TO THE RIGHT RTR JMS TYPECH /TYPE IT TAD MSRGHT /GET DATA AGAIN JMS TYPECH /TYPE RIGHT HALF JMP MESAGE+5 /CONTINUE MSRGHT, 0 /TEMPORARY STORAGE TYPECH, 0 /TYPE CHARACTER IN C(AC)6-11 AND C0077 SNA /IS IT END OF MESSAGE? JMP I 10 /YES: EXIT TAD M40 /SUBTRACT 40 SMA /<40? JMP .+3 /NO TAD C340 /YES: ADD 300 JMP MTP /TO CODES <40 TAD M3 /SUBTRACT 3 SZA /IS IT ZERO? JMP .+3 /NO TAD C212 /YES: CODE 43 IS JMP MTP /LINE-FEED (212) TAD M2 /SUBTRACT 2 SZA /IS IT ZERO? JMP .+3 /NO TAD C215 /YES: CODE 45 IS JMP MTP /CARRIAGE RETURN (215) TAD C245 /ADD 200 TO OTHERS >40 MTP, TLS /TRANSMIT CHARACTER TSF /WAIT FOR THE FLAG JMP .-1 /NOT SET YET CLA /SET: CLEAR C(AC) JMP I TYPECH /RETURN /CONSTANTS M40, -40 C340, 340 C212, 212 C215, 215 C245, 245 /ROUTINE WAITS UNTILL A COMPLETE MESSAGE HAS BEEN ENTERED /SIGNIFIED BY A CR. TYPN, 0 IOF /KILL THE LOG AND CONTROL C FUNCTION KCC /CLEAR AC, KEYBOARD FLAG TAD BADD /GET BUFFER ADDRESS DCA W1 /STORE FOR THE CHARACTER STRING /READ AND RESPOND WITH THE CHARACTER NTYRTN, ISZ W1 /NORMAL RETURN. INCREMENT BUFFER KSF /WAIT FOR KEYBOARD JMP .-1 /FLAG TO RAISE KRB /GOT FLAG, RESET IT, GET CHARACTER JMS RSEND /SEND CHARACTER BACK AND (177 /TAKE CARE OF PARITY TAD (200 DCA I W1 /LOAD CHARACTER INTO BUFFER AREA TAD I W1 /CHECK FOR CTRL C CIA TAD C203 SZA CLA JMP CHKSP /NO- CHECK FOR SPACE 6007 /CTRL C -CLEAR ALL FLAGS NOP /FOR OLD MACHINES CLA /JUST IN CASE DTLB /CLEAR STATUS REGISTER B JMP I (7605 /IF CHARACTER IS A SPACE, IGNORE IT CHKSP, TAD I W1 /CHARACTER INTO THE AC CIA /SUBTRACT FROM SPACE CODE (240) TAD SPCOD /COMPLETE COMPARISON SNA CLA /WAS IT A SPACE? JMP NTYRTN+1 /YES: DO NOT INCREMENT BUFFER /IF CHARACTER IS A CR, EXIT FROM ROUTINE TAD I W1 /CHARACTER TO AC CIA /SET AC TO SUBTRACT CR (215) TAD CRCOD /COMPLETE COMPARISON SZA CLA /WAS IT CR? JMP NTYRTN /NO: INCREMENT BUFFER + WAIT /CARRIAGE RETURN FOUND, EXIT FROM ROUTINE TAD LFCOD /GIVE KEYBOARD LINE FEED JMS RSEND /EXECUTE LINE FEED CLA CLL /EXIT WITH C(ACC) + AND C(L)=0 ION /RESET LOG AND CONTROL C FUNCTION JMP I TYPN /RETURN TO CALL /COMPARE A STRING OF CHARACTERS IN "BUFFER" /TO A CHARACTER STRING AFTER A JMS IN ASCII COMPRE, 0 CLA CMA /C(AC)=7777 TAD COMPRE /SUBTRACT 1 FOR INDEX REG 1 DCA 10 /AUTO INDEX 1 SET TO CHA STRING TAD BADD /AUTO INDEX 2 SET TO BUFFER-1 DCA 11 /LOAD X2 /COMPARE CHARACTERS TILL ONE DOESN'T COMPARE OR TILL /A 0 IS FOUND IN X1. IF OK, RETURN TO TWO PLUS THE /ZERO, IF BAD ONE PLUS TAD I X1 /CHARACTER FROM PROGRAM CIA /TO SUBTRACT FROM TAD I X2 /CHARACTER IN BUFFER SZA CLA /COMPARE? JMP CERR /NO:RESYNC FOR NON COMPARE EXIT TAD I X1 /YES: CHECK FOR GOOD EXIT SZA /IF 0, EXIT GOOD JMP .-6 /NO: TEST NEXT CHAACTER ISZ X1 /+1 TO X1(TOTAL 2 FROM THE 0) JMP I X1 /+1 TO X1, EXIT /ERROR FOUND. RESYNC AND EXIT NO COMPARE CERR, TAD I X1 /CHARACTER FROM PROGRAM SZA CLA /IS THIS EXIT KEY? (0000) JMP .-2 /NO: GET NEXT JMP I X1 /YES: EXIT, NOT COMPARE *400 /VARIOUS ERROR MESSAGES /"NOT DECIMAL" Q1, JMS I TYPE 1617 /NO 2440 /T 0405 /DE 0311 /CI 1501 /MA 1400 /L JMP QUX /"TO MANY WORDS" Q2, JMS I TYPE 2417 /TO 1740 /O 1501 /MA 1631 /NY 4027 / W 1722 /OR 0423 /DS 0000 /00 JMP QUX /"TO MANY BLOCKS" Q3, JMS I TYPE 2417 /TO 1740 /O 1501 /MA 1631 /NY 4002 / B 1417 /LO 0313 /CK 2300 /S0 JMP QUX /"NOT DIVISIBLE BY 3" Q4, JMS I TYPE 1617 /NO 2440 /T 0411 /DI 2611 /VI 2311 /SI 0214 /BL 0540 /E 0231 /BY 4063 / 3 0000 /00 QUX, JMS I TYPE 4345 /CR+LF 0000 /END JMP I .+1 INIT /THE CODING BELOW CREATES THE BLOCK NUMBER /CONVERSION PRIOR TO THE TAPE WRITE. MES, 0 DCA W4 /BLOCK NUMBER GIVEN IN AC TAD W4 /RESTORE TO AC AGAIN CMA /COMPLEMENTED RTL RAL /LEFT 3 DCA W5 /TEMP SAVE TAD W5 /TO AC AGAIN AND C7000 /ISOLATE HIGH CHA DCA V2 /FORWARD BLOCK NUMBER TAD W5 /SHIFTED VALUE AND C0070 /ISOLATE 6,7,8 DCA V1 /FORWARD BLOCK NUMBER TAD W4 /ORIGIONAL SET CMA /UPSIDE DOWN RTR RAR /RIGHT 3 DCA W5 /TEMP SAVE TAD W5 /TO AC AGAIN AND C0700 /ISOLATE 3,4,5 TAD V2 /COMBINE FORWARD BLOCK NUMBER TAD C0077 DCA V2 /1/2 COMPLETE TAD W5 /SHIFTED VALUE AND C0007 /ISOLATE 9, 10,11 TAD V1 /COMBINE WITH BN DCA V1 /FORWARD BLOCK NUMBER COMPLETE /CONVERT REVERSE BLOCK NUMBER CMA /-1 TO GIVEN BLOCK # TAD W4 /ORIGIONAL BLOCK # DCA W5 /TEMP SAVE TAD W5 /TO AC AGAIN RTR RTR /6 RIGHT RTR AND C0077 /ISOLATE LOW DCA V3 /HIGH REVERSE TAD W5 /COMPLEMENT ORIGIONAL -1 RTL RTL /6 LEFT RTL AND C7700 /ISOLATE HIGH DCA V4 /REVERSE COMPLETED JMP I MES /FORM USED TO WRITE 12 DATA WORDS FOR BLOCK NUMBERING FORM, 0000 0000 0000 0000 V1, 0000 V2, 0000 7777 7700 0000 V3, 0000 V4, 0000 0000 //THIS ROUTINE ALLOWS KEYBOARD INTERRUPTION /FOR LOGGING ON THE KEYBOARD, OR FOR A MAJOR /CLEAR IN THE PROGRAM. BY HITTING "CONTROL C" /A SYSTEM RESTART WILL OCCUR. CONC, TSF /IS THE PRINTER FLAG ON? JMP .+5 /NO, CHECK READER TCF /YES: RESET IT KSF /IS THE READER FLAG ON? JMP RTNS /NO: RETURN TO SEQUENCE JMP .+3 KSF HLT /OK. CHECK FOR EITHER LOG OR CONTROL C. DCA MES /SAVE C(AC) RAL /SAVE THE LINK DCA RSYC+6 /FOR LOGGING KRB /GET CHARACTER FROM KEYBOARD TLS /RETURN CHARACTER CIA /TO SEE IF TAD C203 /"CONTROL C" SNA CLA /IS IT? JMP RSYC /YES: RESYNC THE PROGRAM TAD RSYC+6 /RESTORE THE LINK RAR /FOR EXIT. TAD MES /THE AC TOO RTNS, ION /INTERRUPT ON JMP I 0 /RETURN *600 /RESYNC THE SYSTEM TO START RSYC, TSF /WAIT FOR FLAG JMP .-1 /ON LAST SENDOFF JMS I TYPE 2205 /RE 2331 /SY 1603 /NC 0000 /END TAD DTA /TO KILL EXISTING TAPE MOTION DTCX /NOW JMP I STX /RETURN TO START /WAIT FOR THE DECTAPE FLAG TO RISE STALL, 0 CLA DTRB /READ TCU "B" REGISTER SPA /ERROR? JMP ERROR /YES, DECIDE WHAT TO DO RAR /DECTAPE FLAG TO LINK SNL CLA /FLAG? JMP .-5 /NO: CONTINUE WATCH RERR, DTXA /RESET THE DECTAPE FLAG DCA ERX /CLEAR THE END TAPE FLAG JMP I STALL /GOT FLAG, EXIT /DRIVE TAPE INTO THE END ZONE, AND TURN IT /AROUND. /IF C(AC)=0400, TAPE INTO REVERSE END ZONE /IF C(AC)=0000, TAPE INTO FORWARD END ZONE TRN, 0 ISZ ERX /END ZONE IS LEGAL DCA W4 /SAVE DIRECTION TAD DT0200 /MOVE FUNCTION,GO TAD W4 /DIRECTION TO MOVE TAD DTA /DRIVE TO MOVE DTCX /CLEAR AND RESET "A" JMS I WAIT /FOR END ZONE FLAG TAD DT0610 /SEARCH, GO TAD W4 /DIRECTION TO SEARCH AND C0777 /DELETE OVERFLOW BIT TAD DTA /SET THE DECTAPE DTCX /RESET STATUS "A" DCA ERX /END ZONE NOT LEGAL NOW JMP I TRN /RETURN TO SEQUENCE C0777, 0777 /AN ERROR FLAG HAS BEEN SET. IN SOME CASES /END ZONE IS LEGAL, OTHERWISE, A RESTART ATTEMPT /MAY BE INITIATED. /DETERMINE WHICH FLAG SET THE DECTAPE FLAG ERROR, DCA W5 /SAVE "B" REGISTER TAD DTA /GOING TO KILL DTCX /TAPE MOTION TAD W5 /RESTORE "B" REGISTER RTL /POSITION BITS 1+2 SPA /END OF TAPE FLAG? JMP ZEOT /YES: GO TO ROUTINE SZL /MARK TRACK ERROR? JMP ZMKTK /YES: GO TO ROUTINE RTL /POSITION BITS 2+3 SPA /PARITY ERROR? JMP ZPAR /YES: GO TO PARITY ERROR ROUTINE SZL CLA /SELECT ERROR? JMP ZSEL /YES: GO TO ROUTINE JMP ZTIM /MUST BE TIMING ERROR /END OF TAPE FLAG FOUND, SEE IF IT'S LEGAL ZEOT, CLA CLL /CLEAR REMAINS TAD ERX /SWITCH SZA CLA /ERROR? JMP RERR /OK, IT'S LEGAL /NOT LEGAL END ZONE FLAG JMS I TYPE 0516 /EN 0440 /D 2401 /TA 2005 /PE 4000 / 0 JMP ZCOM /MARK TRACK ERROR ZMKTK, JMS I TYPE 1501 /MA 2213 /RK 4024 / T 2201 /RA 0313 /CK 4000 / 0 JMP ZCOM /PARITY ERROR ZPAR, JMS I TYPE 2001 /PA 2211 /RI 2431 /TY 4000 / 0 JMP ZCOM /SELECT ERROR ZSEL, JMS I TYPE 2305 /SE 1405 /LE 0324 /CT 4000 / 0 JMP ZCOM /TIMING ERROR ZTIM, JMS I TYPE 2411 /TI 1511 /MI 1607 /NG 4000 / 0 /TYPE "ERROR PHASE X" ZCOM, TAD PHASE /WHAT PHASE OF OPERATION TAD PFORM /WAS THE MACHINE IN DCA TFORM /WHEN ERROR OCCURED JMS I TYPE 0522 /ER 2217 /RO 2240 /R 2010 /PH 0123 /AS 0540 /E TFORM, 4060 / X 4345 /CR+LF 0000 /END JMS I TYPIN /HE CAN RESTART IF HE TYPES "RETRY" JMS I COMPAR 0322 /R 0305 /E 0324 /T 0322 /R 0331 /Y 0000 /0 JMP I IT /GUESS HE DOESN'T WISH TO TRY AGAIN /ATTEMPT RESTART. NOTE, "ATTEMPT" TAD PHASE /RESTART ACCORDING TO TAD ZFORM /WHICH PHASE WAS HE IN DCA .+3 JMP I .+2 ZFORM, .+2 0000 JMP I .+5 /PHASE 0 JMP I .+5 /PHASE 1 JMP I .+5 /PHASE 2 JMP I .+5 /PHASE 3 JMP I .+5 /PHASE 4 START PSER DOBLK DBN NOP PFORM, 4060 /HERE STARTS THIS PROGRAM. IT WILL ASK THE /OPERATOR FOR DRIVE NUMBERS, THEN ASK HIM FOR /A DIRECTION ON WHAT TO DO WITH THE DRIVES. /THE SEQUENCE FOR MARKING A TAPE WOULD APPEAR AS: /DTA? (3 OR 1 2 3 OR 2 4 7) /DIRECT? (MARK 1215) /2277 WORDS, 0256 BLOCKS.OK? YES OR NO /(YES) /THAT DATA IN PARENTHESIS IS TYPED BY THE OPERATOR /(HE DOESN'T TYPE THE PARENTHESIS) /IF HE HAD ANSWERED NO, "DIRECT?" WOULD BE TYPED OUT. /IF THE DRIVE WAS WRONG, HE WOULD TYPE RESTART. /IF HE HAD TYPED "MARK" IN RESPONSE TO "DIRECT?" THE /TAPE WOULD BE MARKED WITH THE STANDARD PDP-8 CONFIGURATION. /IF HE HAD TYPED "MARK 384" THE TAPE WOULD /BE MARKED WITH THE STANDARD PDP-10 CONFIGURATION /NOTE: THE WORD AND BLOCK NUMBERS ARE TYPED IN OCTAL /IF A MISTAKE OCCURS ON THE OPERATORS PART (WITH REFERANCE /TO BLOCK + WORD SIZE) HE WILL BE TOLD ABOUT IT *1000 /MAKE A CALL FOR THE DECTAPE NUMBERS TO BE /WORKED. START0, JMS I TYPE /PRINT TITLE 4543 4300 JMS I TYPE TEXT /DTFRMT V4A/ START, JMS I TYPE /SET UP TYPER 4543 /CR+LF 4300 /LF+END TYQU, JMS I TYPE /"DTA?" 0424 /DT 0177 /A? 4000 / END /WAIT FOR A REPLY JMS I TYPIN /GET NUMBERS TAD BADD /INITIALIZE POINTER (BFR) IAC /(BADD=BUFFER-1, SO BUMP THE AC) DCA BFR /TO START OF INPUT BUFFER DCA DCTR /INITIALIZE DTA COUNTER TO 0 DCA CRFLAG /CLEAR FLAG SO CR NOT ACCEPTIBLE CRCHK, TAD CRCOD /GET CODE FOR CAR. RETN CIA /NEGATE IT TAD I BFR /SEE IF NEXT CHAR. IN SNA /BUFFER IS CAR. RETN. JMP OKCR /YES: SEE IF C.R. LEGAL HERE DCA CRFLAG /NO: SO C.R. IS LEGAL NOW VALCHK, TAD C261 /SEE IF # IS LESS THAN CIA /ASCII 1 (261) TAD I BFR /SUBTRACT BUFFER DATA SPA CLA /IS IT LESS THAN ASII 0? JMP TYQU /YES: TELL OUTSIDE WORLD TAD C270 /NO: SEE IF GREATER THAN CMA /ASC II 8 (270) TAD I BFR /SUBTRACT BUFFER DATA SMA CLA /GREATER THAN ASCII 7? JMP TYQU /YES: TELL OUTSIDE WORLD TAD I BFR /NO: ACCEPT BUFFER RTR RTR /4 BITS RIGHT AND C7000 /ISOLATE DTA JMS REPEAT /GO CHECK FOR REPEATED DTA AND STORE # ISZ BFR /INCREMENT INPUT BUF. PTR. JMP CRCHK /GO LOOK AT NEXT CHAR. /THIS SECTION CHECKS TO SEE IF THERE HAS BEEN ANY /VALID INPUT ONCE A CARRIAGE RETURN IS SEEN OKCR, CLA /CLEAR AC TAD CRFLAG /LOAD CR FLAG; 0 MEANS NO GOOD SNA CLA JMP START /0: NO VALID INPUT; RESTART TAD DCTR /NOT 0: SO HAVE VALID INPUT TAD DBUFAD /CALCULATE END OF DTA LIST +1 DCA DBUFPT /STORE IT IN BUFFER POINTER, THEN CMA /COMPLEMENT THE AC AND DCA I DBUFPT /TERMINATE DTA LIST WITH 7777 INIT1, CLA /CLEAR AC IF COME THRU LOC IT TAD DBUFAD /AND RESET LIST POINTER DCA DBUFPT /TO START OF LIST JMS I GETDTA /GO GET A DTA NUMBER /INFORM THE OPERATOR THAT THE PROGRAM IS SET TO START /TYPE "DIRECT" AND WAIT FOR THE REPLY INIT, JMS I TYPE /MESSAGE OUT 0411 /DI 2205 /RE 0324 /CT 7740 /? 0000 /END JMS I TYPIN /WAIT FOR A REPLY JMS I COMPAR /DID HE TYPE "MARK"? 0315 /M 0301 /A 0322 /R 0313 /K 0000 /END JMP .+3 JMP I .+1 MARK /TO MARK A TAPE /SEE IF HE TYPED "RDR" (READ AND TYPE FIRST 12 /BLOCK NUMBERS IN REVERSE). JMS I COMPAR 0322 /R 0304 /D 0322 /R 0000 /0 JMP .+3 JMP I .+1 RDR /TYPE BLOCKS /SEE IF HE TYPED "RDF" (READ AND TYPE FIRST 12 /BLOCK NUMBERS FORWARD). JMS I COMPAR 0322 /R 0304 /D 0306 /F 0000 /0 JMP .+3 JMP I .+1 RDFA /TYPE BLOCKS /SEE IF HE TYPED "SAME" (MEANING MARK A TAPE /USING THE SAME CONSTANTS AS BEFORE). JMS I COMPAR 0323 /S 0301 /A 0315 /M 0305 /E 0000 /0 JMP .+3 JMP I .+1 RSTSM /TO MARK AS BEFORE /SEE IF HE TYPED "RESTART" JMS I COMPAR 0322 /R 0305 /E 0323 /S 0324 /T 0301 /A 0322 /R 0324 /T 0000 /0 JMS QU /MUST BE NONSENSE JMP START /START ALL OVER GETDTA, NUDTA /POINTER TO ROUTINE TO SWITCH UNITS CRFLAG, 0 /=0, CR NO GOOD; NOT 0, CR IS OK / *1200 /MARK WAS TYPED IN, IF W1-1 IS NOT A "K",ASSUME THAT /A NUMBER WAS TYPED IN, AND VERIFY THIS. IF W1-1 IS /A "K", ASSUME STANDARD FORMAT.(W1=LAST ENTRY INTO THE BUFFER) MARK, TAD BINCON /ADDRESS OF FIRST BINARY DCA W5 /CONSTANT FOR DEC TO BIN DCA TOTAL /WILL BE BINARY EQUIVILANT /SAVE C(X1) FOR DECREMENT THROUGH BUFFER DNC, CLA CMA /DECREMENT BUFFER ADDRESS TAD W1 /ADDRESS BY 1 DCA W1 /W1=SWEEP ADDRESS /LOOK FOR END OF PROCESSING BY LOOKING FOR A "K" IN BUFFER TAD LETK /LETTER ASCII "K" CIA /SUBTRACT FROM CHARACTER TAD I W1 /IN BUFFER SNA CLA /EQUAL? JMP DIV3 /YES: SEE IF DIVISIBLE BY 3 /VERIFY THIS CHARACTER AS BEING OF DECIMAL ORIGIN TAD C260 /ASCII FOR 0 CIA /TO SEE IF CHARACTER TAD I W1 /IS LESS THAN 260 SPA CLA /IS IT? JMP I QU1 /YES: NOT DECIMAL CHARACTER TAD C271 /ASCII FOR 9 CMA /TO SEE IF GREATER THAN TAD I W1 /9 SMA CLA /IS IT? JMP I QU1 /NOT A DECIMAL CHARACTER /CHARACTER IS DECIMAL. NOW CONVERT IT TO BINARY /REMEMBER POSITION OF CHARACTER IN BUFFER MAY BE /10,100,1000. TAD I W1 /ISOLATE THE NUMBER AND C0017 /FOR PROPER CONVERSION SNA /IF 0, NO BINARY CONVERSION NEEDED JMP IBS /YES: 0: INCREMENT BINARY CONVERSION /NOT 0, SET UP CONVERSION LOOP CLL CIA /NUMBER OF ADDITIONS DCA W4 /TO NEGATIVE FOR ISZ TAD I W5 /BINARY POSITION TO C(ACC) TAD TOTAL /ADD TO PRESENT TOTAL SZL /CHECK ON TO MANY WORDS JMP I QU2 /TO MANY WORDS CALLED FOR DCA TOTAL /KEEP RUNNING SUM ISZ W4 /LAST ADDITION? JMP .-6 /NO: ADD AGAIN /FINAL ADDITION FOR THIS POSITION COMPLETED IBS, ISZ W5 /NEXT POSITION JMP DNC /DO NEXT CHARACTER /LAST CHARACTER COMPLETED. SEE IF DIVISIBLE BY 3 /IF NOT A NORMAL INPUT DIV3, TAD TOTAL /GET TOTAL WORDS SNA /IF TOTAL 0, NORMAL INPUT TAD C201 /129 OCT. THIS TEST REDUNDANT TAD C0017 /ADD CONSTANT 15 TO TOTAL DCA TOTAL /FOR FUTURE CONSIDERATIONS DCA VAR1 /# OF WORDS/3 FOR MARK TRACK WRITING TAD TOTAL /RESTORE IN THE ACC CLL /TO DIVIDE BY 3, LINK KEEPS OVERFLOW TAD M3 /SUBTRACT 3 ISZ VAR1 /ON EACH DIVISION, KEEP RUNNING SUM SZA /IF AC = 0,NO REMAINDER SNL /WHEN LINC GOES TO 0, DIVISION ENDED SKP /NOW SEE IF IT DIVIDED EVENLY JMP .-6 /SUBTRACT 3 MORE SZA CLA /IF 0,OK. OTHERWISE ERROR JMP I QU4 /NOT DIVISIBLE BY 3 /CORRECT "VAR1" ( THE NUMBER OF WORDS/3) FOR THE +15 /ADDED JUST ABOVE AND AN INHERANT +2 DUE TO MARK TRACK /CONFIGURATION TO BE WRITTEN. TAD M7 /SUBTRACT 7 FROM PHONY SETUP TAD VAR1 /GIVING THE NUMBER OF TIMES CIA /TO BE USED LATER IN A ISZ DCA VAR1 /DATA MARK WILL BE WRITTEN /COMPUTE A VALUE FOR TOTAL NUMBER OF BLOCKS /RECORD SIZE + 15 INTO 636160 OCT. TAD C7714 /EXTENDED 64 VALUE. SETS AC#2 DCA W1 /SET FOR 640000 JMS I FORM10 /PATCH TO CHECK FOR STD.10 FORMAT TAD C1620 /VERNIER ADJUSTMENT FOR FORMULA CLL /ACC#2 CARRY FUNCTION TAD TOTAL /WORD COUNT ISZ BLOCKS /+1 TO BLOCK COUNT SKP JMP I QU3 /TO MANY BLOCKS CALLED FOR SNL /CARRY INTO ACC#2? JMP .-5 /NO: CONTINUE COUNT ISZ W1 /YES: FULLY DIVIDED? JMP .-10 /NO: CONTINUE PROCESS CLA CLL /C(ACC)+ C(L)=0 F10RTN, TAD BLOCKS /FOR MARK TRACK (COME HERE FR F10PAT IF 10 FRMT) CMA /WRITING DCA VAR2 /SEE MARK WRITE /VALUES FOR BLOCK AND RECORD SIZE HAVE BEEN /COMPUTED. TELL OUTSIDE WORLD AND GET THE OK. TAD TOTAL /SUBTRACT 15 FROM TOTAL TAD C7761 /WORDS FOOLING OPERATOR DCA TOTAL /CORRECTED FOR TAPE WRITING TAD TOTAL /FOR OCTAL TYPEOUT JMS I TYOCT /TYPE OCTAL WORDS JMS I TYPE /TYPE MESSAGE 4027 / W 1722 /OR 0423 /DS 5400 /, END TAD BLOCKS /TYPE OUT BLOCK #S IAC /TO FOOL THE OPERATOR JMS I TYOCT /IN OCTAL JMS I TYPE /TYPE MESSAGES 4002 / B 1417 /LO 0313 /CK 2356 /S. 1713 /OK 7733 /?( 3105 /YE 2340 /S 1722 /OR 4016 / N 1735 /O) 4543 /CR+LF 0000 /END JMS I TYPIN /WAIT FOR REPLY /SEE IF A YES OR NO ANSWER WAS GIVEN JMS I COMPAR 0331 /Y 0305 /E 0323 /S 0000 /END JMP I IT /SEE IF THE DRIVE IS OK RSTSM, TAD DT0060 /GIVE WRTM, NO GO TAD DTA /AND DTA # DTCX /ORDER EXECUTE DCA W1 /STALL FUNCTION CDTRD, DTRB /READ STATUS "B" SMA CLA /ERROR? JMP CIZ /NO: TIME OUT STALL JMS I TYPE /YES: INCORRECT SETUP 2305 /SE 2425 /TU 2077 /P 0000 /END JMP I .+1 START /STALL FOR A WHILE FOR THE INTERRUPT CIZ, ISZ W1 /ONE ROUND'S WORTH JMP CDTRD /OF ISZ JMP I .+1 STMK /OK, GO DO THE MARK TRACK FORM10, F10PAT *1400 /SET THE TAPE INTO MOTION. ALL VARIABLES ARE /SET. FROM THIS POINT ON, CONTROL IS EXECUTED /VIA THE WCO INTERRUPT /CLEAR OUT STATUS "A" AND RELOAD IT WITH CONTINUOUS /WRITE TIMING AND MARK TRACK COMMAND STMK, TAD DT0360 /FWD, CONT, T+M,GO,INT TAD DTA /ADD IN THE DTA DTCX /CLEAR FLAGS START MOTION DCA PHASE /FOR ERROR ROUTINE TAD VAR2 /TO MAKE A RESTART FOR THE "SAME" DCA W6 /OPTION POSSIBLE /WRITE END ZONE. WRITE ABOUT 10' OF THIS /CONFIGURATION. 4044 / 0440 ON TAPE AS / 4404 (5555) OCTAL. DCA W1 /CLEAR COUNTER, 7777= ABOUT 10' CEZ, TAD REZ /LOAD ADDRESS OF DATA DCA I CA /TO BE WRITTEN INTO THE CA TAD M3 /LOAD # WORDS TO BE WRITTEN INTO DCA I WC /WC LOCATION /WAIT FOR INTERRUPT, TEST FOR END OF /END ZONE WRITING. JMS I WAIT /FOR INTERRUPT ISZ W1 /END OF FOOTAGE? JMP CEZ /NOT END FOOTAGE, CONTINUE /OK, WRITE INTERBLOCK SYNC /WRITE INTERBLOCK SYNC. SINCE THIS CONFIGURATION /ACT AS A NOP TO THE TCU, AT THE BEGINING OF /TAPE, MORE LENGTH OF THIS IS NEEDED FOR TURN AROUND /TIME TO GUARANTEE BLOCK 0000 TO THE LIBRARY SYSTEM /THEREFORE AT THE BEGINING OF TAPE ONLY, WRITE SEVERAL /INTERBLOCK ZONES TAD M144 /NUMBER OF TIMES TO DCA W1 /WRITE INTERBLOCK SYNC JMS INBLSY /WRITE 1 INTERBLOCK SYNC ISZ W1 /CONFIGURATION, TEST END JMP .-2 /NOT TOTAL FOOTAGE. WRITE AGAIN JMP WDZ /COMPLETED, GO ON /AT NORMAL RETURN, WRITE ONLY ONE INTERBLOCK SYNC /CONFIGURATION. APPEARS AS 0404 / 0404 ON TAPE AS / 0404 2525 OCTAL INBLSY, 0 TAD IBZ /COUNTER AND WORD DCA I CA /COUNT WITH KEYS TAD M3 /FOR CONTROL DCA I WC TAD VAR1 /RESET THE WORDS DCA W5 /PER BLOCK COUNTER /WAIT FOR INTERRUPT, RETURN TO SEQUENCE JMS I WAIT /FOR INTERRUPT JMP I INBLSY /WRITE FORWARD BLOCK MARK AND REVERSE GUARD /THREE WORDS 0404 / 4004 ON TAPE AS / 4040 2632 OCTAL WDZ, TAD FBM /ADDRESS OF PATTERN DCA I CA /TO CURRENT ADDRESS TAD M3 /NUMBER OF WORDS DCA I WC /TO WORD COUNTER JMS I WAIT /DROP THROUGH AFTER WRITE /WRITE LOCK MARK, REVERSE CKSUM, REVERSE FINAL,REV PREFINAL /SIX WORDS 1. 0040 4. 0040 / 2. 0000 5. 0000 ON TAPE OCTAL / 3. 4000 6. 4000 10101010 TAD WLMRF /ADDRESS OF PATTERN DCA I CA /TO CURRENT ADDRESS TAD M6 /NUMBER OF WORDS DCA I WC /TO WORD COUNTER JMS I WAIT /DROP THROUGH AFTER WRITE / WRITE THE DATA TRACK. SINCE THE LENGTH OF EACH /RECORD IS A VARIABLE, "VAR1" KEEPS TRACK OF THE /NUMBER OF TIMES THIS CONFIGURATION WILL BE WRITTEN /"VAR1" WAS DECIDED FROM ABOVE IN THE FORMULA /TRANSLATION SECTION /THREE WORDS 4440 / 0044 ON TAPE AS / 4000 7070 OCTAL DTRK, TAD DZ /LOAD ADDRESS OF THE DATA DCA I CA /CONFIGURATION INTO CA TAD M3 /LOAD # WORDS DCA I WC /INTO WORD COUNT /WRITE ONE SET TEST "VAR1" FOR LAST SET JMS I WAIT /ONE CONFIGURATION ISZ W5 /LAST? JMP DTRK /NOW WRITE DATA MARK TRACK AGAIN / MARK TRACK CODE FOR DATA IS COMPLETE. NOW WRITE /PREFINAL, FINAL, CHECKSUM AND REVERSE CHECKSUM. /SIX WORDS 1 4440 4 4440 / 2 4444 5 4444 ON TAPE AS / 3 4044 6 4044 73737373 OCTAL TAD FEZ /LOAD ADDRESS OF DCA I CA /DATA CONFIGURATION INTO CA TAD M6 /LOAD # WORDS DCA I WC /INTO WORD COUNT JMS I WAIT /TILL COMPLETED WRITE /WRITE GUARD, REVERSE BLOCK /THREE WORDS 4040 / 0440 ON TAPE AS / 0404 5145 OCTAL TAD GRZ /DATA ADDRESS TO DCA I CA /THE CA TAD M3 /NUMBER OF WORDS DCA I WC /TO WORD COUNT JMS I WAIT /TILL COMPLETE /THIS COMPLETE SET OF DATA TRANSFERES /COMPLETES ONE BLOCK ON TAPE. SINCE THE /NUMBER OF BLOCKS IS VARIABLE, "VAR2" IS /USED TO RECYCLE. "VAR2" WAS SET UP ABOVE IN /THE FORMULA TRANSLATION SECTION JMS INBLSY /WRITE INTERBLOCK SYNC ISZ W6 /TOTAL NUMBER OF BLOCKS JMP WDZ /WRITTEN? NO: /ALL DATA BLOCKS HAVE BEEN WRITTEN. /NOW PROVIDE A BUFFER ZONE OF INTERBLOCK SYNC AT THE END /OF TAPE AS AT THE START OF TAPE TAD M144 /ABOUT TWO BLOCKS(STANDARD) WORTH DCA W1 /ABOUT 100 TIMES JMS INBLSY /WRITE ONE PATTERN ISZ W1 /AT END YET? JMP .-2 /NO CONTINUE WRITING INTERBLOCK SYNC /COMPLETED BLOCK WRITING /WRITE ANOTHER 10' OF END ZONE (FORWARD) /BEFORE LOADING BLOCK NUMBERS. /THREE WORDS 0400 / 4004 ON TAPE AS / 0040 2222 OCTAL DCA W1 /ISZ=10 FEET WEZF, TAD EZM /LOAD ADDRESS OF DATA DCA I CA /INTO CA TAD M3 /NUMBER OF WORDS DCA I WC /WORD COUNT /WRITE 1 SET, CHECK END OF 10'. JMS I WAIT /TILL COMPLETE ISZ W1 /END OF FOOTAGE? JMP WEZF /NO, CONTINUE WITH END ZONE JMP I .+1 /GO AND START BLOCK NUMBER MWTM /SEQUENCING /THESE ARE THE DATA CONFIGURATIONS FOR THE MARK TRACK /REVERSE END ZONE REZ, . 4044 /ON TAPE AS 5555 (OCT) 0440 4404 /INTERBLOCK SYNC IBZ, . 0404 /ON TAPE AS 2525 (OCT) 0404 0404 /FORWARD BLOCK MARK AND REVERSE GUARD FBM, . 0404 /ON TAPE AS 2632 (OCT) 4004 4040 /LOCK MARK, REVERSE CHECKSUM, REVERSE FINAL /AND REVERSE PREFINAL WLMRF, . 0040 /ON TAPE AS 10101010 (OCT) 0000 4000 0040 0000 4000 /DATA MARK DZ, . 4440 /ON TAPE AS 7070 (OCT) 0044 4000 /PREFINAL, FINAL, FWD CHECKSUM, AND REVERSE LOCK FEZ, . 4440 /ON TAPE AS 73737373 (OCT) 4444 4044 4440 4444 4044 /FORWARD GUARD AND REVERSE BLOCK NUMBER GRZ, . 4040 /ON TAPE AS 5145 (OCT) 0440 0404 /FORWARD END ZONE EZM, . 0400 /ON TAPE AS 2222 (OCT) 4004 0040 /SUBROUTINE TO SEE IF USER TYPED MARK 384 /TO SPECIFY STANDARD PDP-10 FORMAT F10PAT, 0 DCA BLOCKS /CLEAR LOC. BLOCKS IN CASE NOT 10-FORMAT TAD TOTAL /AND GET NUMBER TYPED BY USER TAD M617 /WAS IT 384? SZA CLA JMP I F10PAT /NO-RETURN DCA W1 /YES-CLEAR W1 FOR WAIT LOOP TAD C1101 /AND ADJUST BLOCK TOTAL FOR DCA BLOCKS /1102(OCTAL) BLOCKS. JMP I .+1 F10BAK, F10RTN M617, -617 C1101, 1101 *1600 /THE MARK TRACK HAS BEEN WRITTEN, AND TAPE IS /MOVING FORWARD IN THE FORWARD END ZONE. STOP /THE TAPE AND SEE IF THERE ARE ANY TAPES LEFT TO /MARK--IF SO GO DO THEM, ELSE TELL OPERATOR TO THROW THE /"NORMAL/WRTM/RDTM" SWITCH TO "NORMAL" /HE WILL THEN CONTINUE AFTER THIS ACTION /KILL WRITE, STOP TAPE MWTM, TAD DT0070 /STOP TAPE WITH SELECT ERROR TAD DTA /LOAD DTA INTO ORDER DTCX /EXECUTE THE ABOVE JMS NUDTA /ANY MORE DTAS TO MARK? JMP I DOMARK /YES: GO MARK THEM /MESSAGE TO OPERATOR JMS I TYPE /NO: BACK TO FIRST DTA AND CONTINUE 2305 /SE 2440 /T 2327 /SW 1124 /IT 0310 /CH 4024 / T 1740 /O 1617 /NO 2215 /RM 0114 /AL 0000 /END JMS I TYPIN /WAIT FOR CR /REVERSE TAPE FOR A FEW SECONDS TO GUARANTEE /BLOCK MARK SECT WILL BE UNDER THE HEAD PSER, TAD DT0600 /REVERSE, MOVE, GO TAD DTA /ADD DTA TO ORDER DTCX /CLEAR TCU,GET MOVING IN REVERSE /STALL A FEW SECONDS TAD M300 /AROUND 2 SECONDS DCA W2 /MAJOR STALL MSTALL, ISZ W1 /MINOR STALL JMP .-1 /LOOP MINOR DTSF SKP JMP PSER ISZ W2 /MAJOR STALL JMP MSTALL /LOOP MAJOR /TAPE OUT ON MARK TRACK NOW, TURN AND GET IT /MOVING FORWARD. AT THIS POINT, THE LAST REVERSE /BLOCK NUMBER WILL BE WRITTEN UNTILL END ZONE IS /REACHED. THEREFORE, WHEN THE BOUNCE OUT OF THE END /ZONE TAKES PLACE, THE SYSTEM WILL BE ABLE TO SYNC ON /THE REVERSE BLOCK NUMBER TO WRITE THE REST OF /THE BLOCK NUMBERS AND KNOWN GOOD DATA IN REVERSE. /THIS PROCESS WILL ELIMINATE A NEEDLESS REWIND AND /KEEP THE ENTIRE PROCESS TO TWO COMPLETE PASSES /WRITE LAST REVERSE BLOCK NUMBER GOING FORWARD TAD RZ DCA I CA TAD DT0210 /FORWARD, SEARCH, GO TAD DTA /ADD IN THE DTA DTCX /CLEAR STATUS "A" AND RELOAD IT TAD C1 /PHASE 1 ERROR DCA PHASE /FOR ERROR ROUTINE /WAIT HERE FOR DECTAPE FLAG. CHECK ALSO FOR ERRORS /SET BLOCK NUMBER (REVERSE) INTO FORM TAD BLOCKS /INTO AC WITH LAST BLOCK NUMBER JMS I MESS /CONVERT BLOCK NUMBER FOR TAPE /INTERRUPTED? ERROR? DTRB /READ STATUS "B" RAR /DECTAPE FLAG TO LINK SNL CLA /FLAG SET? JMP .-3 /NO: CONTINUE WAIT /BLOCK FOUND. SWITCH TO READ DATA WITH WC ONE LESS THAN /NUMBER OF WORDS TO BE READ. READ TILL WC=0 TAD DT0130 /TO SET STATUS "A" INTO RCYBR, DTXA /THE READ DATA MODE CLA CMA /SUBTRACT 1 FROM TOTAL TAD TOTAL /GIVING TOTAL-1 (HO HO) CMA /INVERT FOR ISZ DCA I WC /SET WC TAD C4 /NOP DCA I CA /JIMMIED TO DO NOTHING DTRB /READ "B" REGISTER AND C1000 /ISOLATE END ZONE BIT SZA CLA /END ZONE? JMP I GDBLK /YES: GO AND WRITE THE BLOCK NUMBERS TAD I WC /WAIT TILL WORD COUNT ZERO SZA CLA /EQUAL TO ZERO? JMP .-10 /NO: LOOP AGAIN /END OF BLOCK FOUND. WRITE JUNK AND REVERSE BLOCK NUMBER TAD M14 /12 WORDS TO BE WRITTEN DCA I WC /TO WORD COUNT REG. TAD FORMB /FORM TO CA DCA I CA /OF NUMBERING FORM TAD DT0070 /SWITCH TO WRITE ALL DTXA /MODE. /LOOK FOR THE DECTAPE FLAG INDICATING ANOTHER RECYCLE DTRB /NO: GET "B" AGAIN RAR /FLAG TO LINK SNL CLA /FLAG SET? JMP .-3 /NO: BE PATIENT. HAST NOT. TAD DT0070 /TO SWITCH TO READ DATA JMP RCYBR GDBLK, DOBLK DOMARK, STMK /POINTER TO START OF MARK ROUTINE /SUBROUTINE TO GET NEXT DTA UNIT # FROM INPUT LIST OR /RECYCLE TO FIRST UNIT IF ALL HAVE BEEN PROCESSED UP TO /THIS POINT--CALL SEQUENCE / JMS NUDTA /CALL THE ROUTINE / (RETN1) /RETURNS HERE IF MORE DTAS TO PROCESS / (RETN2) /RETURNS HERE IF END OF LIST /END OF LIST MEANS RESET TO FIRST AND RETURN TO (RETN2) /RETURN IS WITH DTA SET TO NEW VALUE AND AC=0 NUDTA, 0 TAD I LSTPT /GET CURRENT VALUE OF DTA LIST PTR DCA TBUFPT /STORE IT AS TEM. BUF. PTR. TAD I TBUFPT /GET A DTA # FROM THE LIST AND C0007 /ISOLATE LOW ORDER DIGIT SZA CLA /IS IT 7777? JMP LSTEND /YES: END OF LIST TAD I TBUFPT /NO: GET IT BACK DCA DTA /AND STORE AS NEW DTA # ISZ I LSTPT /INCREMENT LIST POINTER JMP I NUDTA /RETURN /COMES HERE AT END OF LIST TO RESET PTRS AND RETN TO CALL+2 LSTEND, ISZ NUDTA /INCREMENT RETURN POINTER TAD I STRTPT /GET ADR. OF START OF LIST DCA I LSTPT /STORE TO RE-INITIALIZE LIST PTR. JMP NUDTA+1 /GO GET FIRST DTA # AND RETURN STRTPT, DBUFAD /POINTER TO START OF DTA LIST TBUFPT, 0 /TEM. STORAGE FOR BUF. PTR. LSTPT, DBUFPT /POINTER TO CURRENT VALUE OF DTA LIST PTR DTABUF, 0 /START OF DTA # LIST - MAX. 9 WORDS RZ, .+1 0 /SUBROUTINE TO CHECK FOR REPEATED DTA NUMBERS /DTA # TO COMPARE TO LIST IS IN AC ON ENTRY--THIS /ROUTINE STORES THE DTA # IF IT IS NEW AND IGNORES IT /IF IT IS NOT-CALL BY JMS REPEAT WITH DTA # IN AC REPEAT, 0 DCA DNUM /TEM STORAGE FOR NEW DTA # TAD DBUFAD /INITIALIZE POINTER (DBUFPT) DCA DBUFPT /TO START OF DTA LIST TAD DCTR /LOAD NUM. OF DTAS STORED CMA /COMPLEMENT IT DCA COMCTR /STORE IN COMPARE COUNTER COMCHK, ISZ COMCTR /DONE WITH ALL COMPARES? JMP DOCOMP /NO: GO DO COMPARE TAD DNUM /YES: STORE NEW DTA# DCA I DBUFPT /AT END OF LIST ISZ DCTR /INCR. # OF DTAS STORED JMP I REPEAT /RETURN /THIS SECTION DOES THE ACTUAL COMPARISON BETWEEN /THE DTA# PASSED TO THE ROUTINE AND A NUMBER ON THE LIST DOCOMP, TAD I DBUFPT /GET NEXT DTA NUMBER FROM LIST CIA /NEGATE IT TAD DNUM /ADD IN DTA NUMBER PASSED SNA CLA /ARE THEY THE SAME? JMP I REPEAT /YES: RETURN ISZ DBUFPT /NO: INCREMENT LIST POINTER JMP COMCHK /SEE IF DONE ALL COMPARES / / COMCTR, 0 /COUNTER FOR # OF LIST COMPARISONS TO BE DONE DCTR, 0 /COUNTER FOR # OF DTAS IN LIST DBUFAD, DTABUF /START OF DTA NUM. LIST DNUM, 0 /TEM STORAGE FOR DTA # / *2000 /GO INTO SEARCH IN REVERSE MODE LOOKING FOR /THE LAST BLOCK NUMBER. WHEN FOUND, SYNC THE SYSTEM /AND WRITE ALL DATA AND BLOCK NUMBERS DOBLK, JMS I TURN /INTO REVERSE AND SEARCH MODE TAD BLOCKS /TO SET UP DCA BLOCKA /FOR BLOCK DECREMENTING TAD C2 /PHASE 2 ERROR DCA PHASE /FOR ERROR ROUTINE /LOOK FOR INTERRUPT INDICATING BLOCK NUMBER JMS I WAIT /FOR DECTAPE FLAG /SWITCH TO WRITE ALL. SYSTEM NOW IN SYNC TAD DT0140 /SWITCH TO WRITE ALL DTXA /EXECUTE ORDER NEXTBN, TAD ADF3 /ADDRESS OF FIRST 3 WORDS INCLUDING DCA I CA /THE FORWARD CHECKSUM TO BE WRITTEN TAD M3 /NUMBER OF WORDS TO BE WRITTEN DCA I WC /TO WORD COUNT JMS CEZN /CHECK FOR END ZONE TAD I WC /CHECK FOR WC=0 SZA CLA /=0? JMP .-3 /NOPE: TRY AGAIN DTXA /YUP: CLEAR THE FLAG /WRITE DATA TRACK. REMEMBER CORRECT DATA IS BEING WRITTEN TAD TOTAL /ONE FROM TOTAL NUMBER CIA /OF WORDS FOR COUNTING DCA I WC /DATA WORDS WRITTEN TAD AD7777 /ADDRESS OF SEVENS DCA I CA /DATA TO BE WRITTEN /MONITOR WORD COUNT FOR A ZERO READING /SOME OF THIS TIME IS USED TO SET THE NEXT /BLOCK NUMBER INTO THE FORM. TAD BLOCKA /CURRENT BLOCK NUMBER JMS I MESS /CONVERT INTO FORM CLA CMA /TO DECREMENT TAD BLOCKA /THE BLOCK COUNT DCA BLOCKA /DOWN TO ZERO JMP CEZB /BYPASS FOLLOWING ROUTINE /CHECK FOR END ZONE CEZN, 0 DTRB /READ STATUS "B" AND C1000 /ISOLATE END ZONE SNA CLA /HAVE IT? JMP I CEZN /NOT EZ, RETURN JMP I GDBN /COMPLETED /CHECK HERE ALSO TO SEE IF END ZONE, INDICATING /THAT THE LAST BLOCK HAS BEEN WRITTEN CEZB, JMS CEZN /END ZONE? /LOOK FOR WORD COUNT AS BEING EQUAL TO ZERO TAD I WC /WC TO C(AC) SNA CLA /END OF DATA WRITE? JMP WBN /YES: GO TO WRITE BLOCK NUMBER TAD AD7777 /RESET CURRENT ADDRESS COUNT DCA I CA /DON'T LET THE CA ADVANCE TO JMP CEZB /MUCH /DATA HAS BEEN WRITTEN. NOW WRITE REVERSE /BLOCK NUMBER, FORWARD BLOCK NUMBER, AND REVERSE /CHECKSUM. (12 WORDS) WBN, DTXA /CLEAR OUT DECTAPE FLAG TAD M14 /WILL WRITE 12 WORDS DCA I WC /FOR THIS BIT TAD FORMA /FROM A FORM CONTAINING DCA I CA /BLOCK NUMBERS /WAIT FOR END JMS CEZN /END ZONE? TAD I WC /NO: SEE IF DONE THE WRITE SZA CLA /DONE YET ? JMP .-3 /NO: PATIENCE IS A VIRTUE???? DTXA /RESET THE CURRENT FLAG JMP NEXTBN /YES: GO RECYCLE COMPLETLY GDBN, DBN / FIRST 3 WORDS TO BE WRITTEN ADF3, . 0000 0000 0077 /DATA TO BE WRITTEN ON TAPE (REVERSE) AD7777, . 7777 7777 7777 7777 /CHECK IF ALL DTAS ARE DONE BEFORE RESTARTING SETDTA, JMS I GDTA /ALL DTAS DONE? JMP I CONTNU /NO: BACK TO WRITE BLOCK #S ON NEXT JMP I IT /YES: GO ASK "DIRECT?" GDTA, NUDTA /POINTER TO SUBR FOR GETTING NEXT UNIT # CONTNU, PSER /POINTER TO START OF BLOCK # WRITE ROUTINE /TYPE ONE FOUR CHARACTER OCTAL WORD GIVEN TO THE /ROUTINE VIA C(ACC). C(ACC)=0 ON EXIT TYCT, 0 DCA TW1 /STORE WORD GIVEN TAD TW1 /TO C(ACC) AGAIN RTR RTR /6 BITS GIGHT RTR DCA TYCT1+2 /SAVE ROTATED VALUE, 1ST TWO TAD TYCT1+2 /TO C(ACC) AGAIN AND C0007 /ISOLATE SECOND CHARACTER TAD C6060 /CONVERT TO ASCII DCA TYCT1+1 /STORE AS FIRST PARTIAL 2 TAD TYCT1+2 /ROTATED VALUE STORED ABOVE RTL RAL /3 BITS LEFT AND C0700 /ISOLATE FIRST CHARACTER TAD TYCT1+1 /CONVERT 1ST TO ASCII DCA TYCT1+1 /1ST AND 2ND CHARACTERS READY TAD TW1 /ORIGIONAL WORD AND C0007 /ISOLATE 4TH CHARACTER TAD C6060 /CONVERT 4 TH TO ASCII DCA TYCT1+2 /STORE 4TH FOR A MOMENT TAD TW1 /ORIGIONAL WORD RTL RAL /POSITION IT 3RD CHARACTER AND C0700 /ISOLATE 3RD CHARACTER TAD TYCT1+2 /CONVERT TO ASCII DCA TYCT1+2 /CONVERSION COMPLETE TYCT1, JMS I TYPE /TYPE THE FOUR CHARACTERS 0 /FIRST 2 0 /SECOND 2 0 /KILL KEY JMP I TYCT /EXIT FROM ROUTINE /SOME CONSTANTS FOR THE ROUTINE TW1, 0000 C6060, 6060 *2200 /VERIFY THE TAPE AS BEING WRITTEN CORRECTLY /WITH DATA AND BLOCK NUMBERS. THE INFORMATION WRITTEN /WAS WRITTEN IN SUCH A WAY AS TO BE CORRECT /UPON READING IT BACK /TURN TAPE AND HAVE IT GOING FORWARD DBN, TAD ISZV /RESET INCREMENT DCA VISZ /BLOCK NUMBERS FORWARD DCA FCON /WILL BE ZEROS FORWARD DCA W1 /FIRST BLOCK NUMBER FORWARD TAD C0400 /TURN TO GO FORWARD DBNAUX, JMS I TURN TAD C3 /ERROR IN PHASE 3 DCA PHASE /FOR ERROR ROUTINE /SET SOME OF THE CONTROL REGS DAB, DCA I WC /WORD COUNT DON'T CARE TAD ADBA /SOME WHERE UP ABOVE DCA I CA /TO GET BLOCK NUMBERS /WAIT FOR INTERRUPT JMS I WAIT /INTERRUPT TAD W1 /FIRST OR NEXT BLOCK NUMBER CIA /TO COMPARE TAD I ADBA /GET THE BLOCK NUMBER SZA CLA /COMPARE OK? JMP BLKERZ /BLOCK ERROR FOUND /BLOCK COMPARES, NOW CHECK DATA TAD DT0030 /TO SWITCH INTO READ DTXA /DATA MODE DCA I WC /DON'T CARE ABOUT THE WC CTST, TAD ADWA /FOR COMPARING DCA I CA /FROM TAPE /EVERY TIME THE WORD COUNT MOVES /A DATA TRANSFERE HAS BEEN COMPLETED. /MAKE SURE THAT THE INFORMATION IS OK TAD I WC /GET WORD COUNT SNA CLA /STILL AT ZERO? JMP CEFR /YES: SEE IF AT END TAD FCON /NO: SEE IF DATA CIA /IS SAME AS WRITTEN TAD I ADWAB /RECEIVED DATA SZA CLA /SAME? JMP DTAR /DATA ERROR FOUND DCA I WC /YES: RESET WORD COUNT /CHECK FOR DECTAPE FLAG INDICATING END OF /BLOCK OR ERROR CEFR, DTRB /READ "B" REGISTER SPA /ERROR? JMP PARIR /PARITY ERROR, I GUESS /NO ERROR, END OF BLOCK? RAR /FLAG TO THE LINK SNL CLA /END? JMP CTST /NO: CONTINUE CHECKING TAD DT0030 /CLEAR DECTAPE FLAG DTXA /AND RETURN TO SEARCH /END OF BLOCK. SEE IF END OF TAPE TAD W1 /BLOCK NUMBER JUST TESTED VISZ, ISZ W1 /+1 OR -1 TO BLOCK COUNT SKP HLT /ABSOLUTE PANIC CIA /TO BE COMPARED WITH TAD BLOCKS /TOTAL BLOCKS SZA CLA /LAST? JMP DAB /NO, DO ANOTHER BLOCK /HERE PUT IN THE REVERSE CHECK DDSF, DTSF /WAIT FOR ANY FLAG TO APPEAR JMP .-1 /NOT YET CLA CLL /RID AC OF GARBAGE DTRB /READ THE "B" REGISTER AND C1000 /BETTER BE END ZONE SNA CLA /IS IT? JMP LNE /LAST INTERRUPT NOT END ZONE DTCX /YUP: A OK /BLOCK NUMBERS AND DATA HAVE BEEN CHECKED FORWARD /AND ARE OK. USING THE ABOVE ROUTINE FOR CHECKING /RESET A FEW THINGS AND CHECK IN REVERSE /WAS COMPLETION FOUND FORWARD? IF SO GO CHECK /IN REVERSE; IF NOT GO SEE IF ALL TAPES HAVE BEEN CHECKED. TAD FCON /IF 0'S, IT WAS FWD SZA CLA /FWD? JMP I FINCHK /N0: REVERSE-SEE IF ALL DTAS DONE /RESET THE ABOVE ROUTINE TO READ IN REVERSE CMA /DATA WILL BE AS WRITTEN DCA FCON /I.E., 7777'S TAD SJMP /INSTEAD OF INCREMENTING DCA VISZ /WE WILL DECREMENT BLOCK NUMBERS TAD BLOCKS /STARTING WITH THE HIGHEST DCA W1 /AND WILL WORK TO ZERO JMP DBNAUX /ALL SET, TRAVEL ONWARD /RETURN HERE AFTER EACH BLOCK FOR CHECKING WHEN LAST BLOCK /HAS BEN PROCESSED???????????? SJMP, JMP .+1 SNA /IF AC = 0, WE ARE DONE JMP DDSF /AND NEXT FLAG SHOULD BE END ZONE CIA /OTHERWISE, SUBTRACT ONE FROM CMA /BLOCKS GIVING BLOCKS-1......? DCA W1 /NOT DONE JMP DAB /GO DO ANOTHER BLOCK ISZV, ISZ W1 /VARIABLE TAG FINCHK, SETDTA /BLOCK ERROR FOUND BLKERZ, TAD DTA /TO RESET TAPE DTCX /MOTION TAD I ADBA /GET BAD BLOCK NUMBER JMS I TYOCT /AND TYPE IT OUT JMS TYSB /TYPE "SHOULD BE" TAD W1 /GOOD BLOCK NUMBER JMS I TYOCT /TYPE IT OUT JMS I TYPE 4002 / B 1413 /LK 4005 / E 2243 /R CR 4500 /LF+END DBERZ, JMP I .+1 ZCOM /COMMON ROUTINE TYSB, 0 JMS I TYPE 4023 / S 1017 /HO 2514 /UL 0440 /D 0205 /BE 4000 / 0 JMP I TYSB /DATA ERROR DTAR, TAD DTA /TO STOP TAPE DTCX /MOTION TAD I ADWA /GET THE BAD WORD JMS I TYOCT JMS TYSB /TYPE "SHOULD BE" TAD FCON /GOOD WORD JMS I TYOCT /TYPE IT OUT JMS I TYPE 4004 /D 0124 /AT 0140 /A 0522 /ER 4543 /CR+LF 0000 /END JMP DBERZ /PARITY ERROR FOUND PARIR, JMP I .+1 ERROR /MAIN ERROR ROUTINE /LAST INTERRUPT WAS NOT END ZONE LNE, JMS I TYPE 1401 /LA 2324 /ST 4011 / I 1624 /NT 4016 / N 1724 /OT 4005 / E 1724 /OT 4345 /LF+CR 0000 /END JMP DBERZ *2400 / TYPE OUT THE DTA UNIT NUMBER AND THE FIRST 12 BLOCK /NUMBERS IN EITHER DIRECTION. IF RDR, IN REVERSE /IF RDF, TYPE THEM OUT GOING IN THE FORWARD /DIRECTION FROM THE BEGINING OF TAPE RDFA, TAD C0400 /DIRECTION FOR TURNING DCA SAVEIT /STORE DIRECTION FOR NEXT DTA UNIT TAD SAVEIT /GET DIRECTION FOR TURNING JMS I TURN /AROUND TAD M14 /READ 12 BLOCK DCA W3 /COUNTER TAD BADD /ADDRESS OF BUFFER DCA X2 /TO AUTO INDEX 2 TAD ADW3 /ADDRESS OF W2 DCA I CA /FOR DATA XFER JMS I WAIT /FOR BLOCK INTERRUPT TAD W2 /BLOCK NUMBER DCA I X2 /STORE BLOCK NUMBER ISZ W3 /TOTAL = 12? JMP .-4 /NO: GRAB NEXT TAD DTA /KILL TAPE MOTION DTCX /HERE /TYPE OUT BLOCK NUMBERS AND DTA UNIT # JMS I TYPE /TYPE "DTA" 0424 /DT 0140 /A 0000 /END TAD DTA /GET UNIT # JMS I TYOCT /AND TYPE IT OUT JMS I TYPE 4345 /CR&LF 0000 /END TAD M14 /WILL TYPE ALL DCA W1 /TWELVE WORDS TAD BADD /ADDRESS OF BLOCK DCA X2 /NUMBERS TO INDEX 2 TAD I X2 /FIRST OR NEXT BLOCK JMS I TYOCT /TYPE IT OUT JMS I TYPE /CR AND LINE FEED 4345 /CR+LF 0000 ISZ W1 /COMPLETE? JMP .-6 /NO JMS I NEWDTA /YES: ANY MORE DTAS? JMP RDFA+2 /YES: GO GET BLOCK #S JMP I IT /NO: GO ASK FOR "DIRECT?" RDR, JMP RDFA+1 /OTHER DIRECTION SAVEIT, 0 /TEM. STORAGE FOR DIRECTION NEWDTA, NUDTA /POINTER TO SUBR. TO GET A NEW DTA UNIT # /INPUT BUFFER FOR THE TELETYPE. /NOTE ,,,,,,,THIS MUST BE AT THE END OF THE PROGRAM BUFFER, 0000 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 | /6 OS/8 SYMBOLIC EDITOR, V12 / / / / / / / // / / / / /COPYRIGHT (C) 1977 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /5 JULY 1972 EF /COPYRIGHT 1971,1972 DIGITAL EQUIPMENT CORPORATION / MAYNARD, MASSACHUSSETTS 01754 /THE SYMBOLIC EDITOR IS A LINE-ORIENTED /TEXT EDITOR WITH CHARACTER AND STRING /SEARCH CAPABILITIES. IT IS DESIGNED /TO BE COMPATIBLE WITH THE OS/8 SYSTEM. /THE DESIGN OF THE EDITOR IS SIMILAR /TO THAT OF THE PAPER TAPE SYMBOLIC /EDITOR AND THE DISK MONITOR SYSTEM /EDITOR. / OS/8 V3 CHANGES S.R. /1. ?5 ERROR REMOVED /2. ALLOW CHAINING TO EDIT /3. ADDED VERSION # COMMAND (#) /4. COMBINED ^C ROUTINES, TAKING OUT BRANCH THRU 17667 /5. ALLOWED PARITY CHARACTERS EVERYWHERE / / / FIX FOR V10 J.K. 1975 / / THE CLOSE ERROR MESAGE 2? WAS BEING / GIVEN INSTEAD OF FILE FULL MESSAGE / WHEN THE INPUT FILE FIT INTO THE EDIT BUFFER / BUT WAS TOO LARGE FOR THE AVAILIBLE SPACE ON THE / OUTPUT DEVICE. / V11 CHANGES 25-MAY-77 DAVID SPECTOR /1. ESCAPE KEY NO LONGER ECHOED /2. SCOPE MODE SUPPORTED /3. ONCE-ONLY CODE MOVED TO INPUT HANDLER / AREA IN ORDER TO FREE LOCS 3000-3177 / V12 CHANGES 27-JUN-77 EDWARD P. STEINBERGER / /ALLOWED ESCAPE(233) TO BE AN INPUT CHARACTER IN TEXT MODE. /ECHOS AS "$" ON TERMINAL OR LINEPRINTER (IF V), OUTPUT /TO FILE AS ESCAPE /THE LOADING AND SAVING PROCEDURE FROM PAPER TAPE IS: / .R ABSLDR / *PTR:/9$^ / .SAVE SYS EDIT / /THE STARTING ADDRESS IS 00200. /COMMAND DECODER RULES: /*OUTPUT FILE<UP TO 9 INPUT FILES/OPTIONS /OPTIONS: /A RETURN CONTROL TO EDITOR AFTER FILE CLOSE / (CALLS COMMAND DECODER FOR NEW FILES) / (DEFAULT IS RETURN TO MONITOR) /B CONVERT 2 OR MORE SPACES TO TAB ON INPUT /D DELETE OLD COPY OF OUTPUT FILE BEFORE / STORING NEW FILE /ERROR CODES: / 0 FAILURE IN INPUT DEVICE HANDLER / 1 FAILURE IN OUTPUT DEVICE HANDER / 2 COULD NOT CLOSE FILE / 3 COULD NOT OPEN FILE / 4 DEVICE HANDLER COULD NOT BE LOADED VERSION=12 PATCH="D /PATCH LEVEL D /COMMANDS: /A APPEND TEXT TO BUFFER /I INSERT TEXT INTO BUFFER /C CHANGE TEXT IN BUFFER /L LIST TEXT IN BUFFER /D DELETE TEXT IN BUFFER /K KILL BUFFER /M MOVE TEXT WITHIN BUFFER /G GET AND LIST TAGGED LINE IN BUFFER /B LIST # OF CORE LOCATIONS LEFT IN BUFFER /S CHARACTER SEARCH /J INTER-BUFFER STRING SEARCH /F AFTER J, SEARCH FOR NEXT OCCURRANCE / OF SAME STRING /$ INTRA-BUFFER STRING SEARCH /R READ TEXT INTO BUFFER FROM INPUT DEVICE /N WRITE BUFFER, KILL, AND READ NEXT PAGE /Y INPUT TEXT PAGE, NO OUTPUT /P WRITE TEXT BUFFER TO OUTPUT DEVICE /T PUNCH TRAILER TAPE /E OUTPUT BUFFER, TRANSFER REST OF / INPUT FILE TO OUTPUT FILE / CLOSE OUTPUT FILE /Q IMMEDIATE END OF FILE /V PRINT ON LP08 /# TYPE VERSION NUMBER /ABBREVIATIONS /.LT. LESS THAN /.LE. LESS THAN OR EQUAL TO /.GT. GREATER THAN /.GE. GREATER THAN OR EQUAL TO / R RIGHT / L LEFT /SPECIAL COMMENTS /SINCE THE EDITOR IS CODED ACROSS PAGE BOUNDARIES, IT IS /NECESSARY TO BE AWARE OF THE EFFECTS OF THE INSERTION /OR DELETION OF CODE. FOR THIS REASON, THE LIMITS /OF PERMISSABLE PAGE BOUNDARY WANDERING /ARE INDICATED WITH THE FOLLOWING CONSTRUCTION: /----------------------------------------------------------------------- /SOMEWHERE BETWEEN LINES, THE PAGE BOUNDARY MUST OCCUR /----------------------------------------------------------------------- *1 /MISCELLANEOUS POINTER AND CONSTANTS BUFEND, 6100 /WARNING FOR END OF BUFFER P7700, 7700 /MONITOR CALL LOCATION M77, -77 NOP /RESERVED FOR ODT NOP / " NOP / " C77, 77 M40, -40 C100, 100 C277, 277 /QUESTION MARK /AUTO-INDEX REGISTERS AXOUT, 0 /OUTPUT INDEX AXCOMB, 0 /COMBINE POINTER AXTEM, 0 /TEMPORARY INDEX AXIN, 0 /STORAGE INDEX /CONSTANTS M4, -4 /LETTER COUNT P177, 177 MCR, -215 M240, -240 P40, 40 C200, 200 /(START & RESTART) /LISTS /TAG SEARCH LIST- LIST7=. C240, 240 /SPACE 257 /COMMENT DELIMITER (/) /OUTPUT LIST LIST4=. ESC, 233 /ESC-V12 CTAB, 211 /TAB C215, 215 /CARRIAGE RETURN 212 /LINE FEED 214 /FORM FEED 377 /RUBOUT 216 /CONTROL N (^N) M27, -27 /LIST DELIMITER /SPECIAL CHARACTER LIST FOR /INPUT IN TEXT MODE LIST5=. /USED AT AONE 240 /SPACE LIST6=. /USED AT SFOUND 225 / ^U C214, 214 /FORM FEED BELL, 207 / ^G (BELL) C212, 212 /LINE FEED CRO, 377 /RUBOUT LIST3=. 215 /LIST BRANCHER 000 /(SEARCH CHARACTER) RST3I, RESET3 /RESET AND SAVE BUFFER MCHIN1, -CHIN-1 /LIST DELIMITER /CONSTANTS AND POINTERS CCR=C215 /CARRIAGE RETURN CLF=C212 /LINE FEED MTABS, -10 /TAB COUNTER DELT, DELP CHI1, CHIN IGNORE, CHIN+1 END, 200 KEYBD, I33 CCON, JMP I AXCOMB COM1-1 UTR1, UTRA FIN1, FIND LIS1, LIST LIS, LISTER NINE, 12 NUMB, -272 OUT1, OUT OUTL1=. LOW, OUTL CZ, NOP /CONTENTS OF START ONUM, GTOP SORTJ, SORTB PACK1, PACBUF SXS1, TAD CHAR /CONTENTS OF L3 SXS2, SLOOK&177+5200 /JMP SLOOK L3I, L3 /PATCH POINTER L2I, L2 /CONTINUE SEARCH - LETTERS ENDLNI, ENDLN SPCNO, MOR+4 /PACK SPCGO, MOR+1 /SORT /CHAR IS ALWAYS SET BY OUT, SOMETIMES BY SORTB; /IT IS ALWAYS USED BY PACK AND SORTB. CHAR, 0 MOV1=. COUNTP, 0 /NUMBER OF PAGES CNT=. /PRINT COUNTER XCT, 0 /UNPACK SWITCH XCTIN, 0 /PACK SWITCH ECHOSW, 1 /NON-ZERO TO PRINT SAVE, 0 TABIND, 0 /TABS OR SPACES SWITCH TEMP, 0 /V3 THIS, 0 /LINE POINTER. OUTDEV, OUTL /POINTER TO OUTPUT SUBROUTINE GRBAGE, GARBAG /GARBAGE COLLECTOR MARK, 0 /OBJECT LINE IN G.C. XSAV, 0 /HOLD INPUT POINTER. BUFR, 200 CFRS, FRST KILL1, KILL+3 CHKARG, CHKARX ERSW, ERROR /ERROR ROUTINE L1I, L1 EKILLL, 0 /E CMD SWITCH 1 IF E NOT ALLOWED /I-O RELATED POINTERS AND WORDS P232, 232 /V3 BUFRDI, BUFRD /OR CHIN...IN DEVICE POINTER BUFWTI, BUFWT /WRITE OUTPUT TO DEVICE CLFLI, FLCLOS /SET TO CLOSE FILE P37, 37 /V3 JMPCH, PUNCH&177+5200 /DESTROYED BY YANK /ERROR ROUTINE POINTERS SERR0I, SERR0 SERR1I, SERR1 SERR2I, SERR2 SERR4I, SERR4 GTEM=. /NEXT 6-BITS OF UNPACK DTEM=. /NEXT POINTER IN DELETE CHAIN /ERROR ROUTINE /REJECTS ILLEGAL COMMAND /AND TYPES ? ERROR=JMS . 0 ELIM, 7600 /GRP2-CLA TAD C277 JMS I OUTL1 /PRINT "?" CZONE, TAD CZ /RESET PATCHES DCA I TE1 JMPTE1, JMP I TE1 /*RETURN TO COMMAND MODE* UPAROI, UPAROW /GENERATE ^ CHARACTER MONITOR, MONIT /MONITOR EXIT ROUTINE STRIND, 0 STRFIN, SFIND1 TE1, START /VARIABLES THSN, 0 /CURRENT LINE NUMBER LSTN, 0 /LAST LINE NUMBER TCNT, 0 /TAB COUNT ADD, 0 ARG0, 0 ARG1, 0240 ARG2, -1 POTYPE, OTYPE COMM5, COM5 K7600, 7600 TEMPO, 0 K1210, 1210 X203, -203 K1320, 1320 FRST, 0 /FIRST LINE ADDRESS MOV2=TEMPO LSTCHK, 0 /DIGIT ACCEPTED FLAG *177 INIT /INITIALIZATION CODE /EITHER 3000 OR VALUE OF RESET *200 STA /V3 NORMAL START OR RESTART ADDR DCA TEMP /V3 CHAIN START ADDR JMP I 177 /START AT 3000 OR RESET /HANDLER FOR ^U (IF IN COMMAND MODE) START, NOP /V3 MAY BE MODIFIED TAD LOW /ENTER COMMAND MODE DCA OUTDEV /INITIALIZE KEYBOARD DCA TABIND /CLEAR TAB INDICATOR ISZ ECHOSW /SET UP FOR ECHO DCA LIST3+1 TAD SXS1 DCA I L3I TAD ERSW /RESET ERROR SWITCH AT L1 DCA I L1I TAD CZONE DCA I COMM5 DCA LSTCHK /CLEAR DIGIT ACCEPTED TAD CCR /OUTPUT CARRIAGE RETURN JMS I OUT1 /HANDLER FOR CARRIAGE RETURN (COMMAND MODE) TAD SIGN /OUTPUT # JMS I OUT1 GTOP, DCA ARG0 /CLEAR ARGUMENTS DCA ARG2 /HANDLER FOR SPACE OR + GEXP, TAD NONE /HANDLER FOR - GMIN, TAD CMPT DCA G2 /SET SIGN TO + OR - DBCV2, DCA TEMP CMCHK, JMS I CHI1 /INPUT ONE CHARACTER TAD NUMB CLL TAD NINE SZL /WAS IT A DIGIT? JMP COUNT /YES - CONTINUE ACCEPTING NUMBERS GLOM, CLA /NO TAD TEMP /GET ACCUMULATED NUMBER G2, HLT /(NOP) OR (CIA) TO HANDLE SIGN TAD ARG2 DCA ARG2 /STORE NEW ARGUMENT JMS SORTB /WAS LAST CHARACTER SPECIAL? LIST1-1 /YES - COMPARE TO LIST OPS1-LIST1 /AND BRANCH TO HANDLER TAD CHAR /NO - SAVE COMMAND CHARACTER DCA SAVE JMS I CHI1 /INPUT ONE CHARACTER JMS SORTB /IS IT CARRIAGE RETURN, ^C, OR ^U? LIST1A-1 /YES - EXIT TO HANDLER OPS1A-LIST1A ERROR /NO - TRY AGAIN /CHECK LEGALITY OF ARGUMENTS /ARG0 CONTAINS FIRST ARGUMENT /ARG2 CONTAINS SECOND ARGUMENT RETRN, TAD ARG0 SNA /IS ARG0=0? TAD ARG2 /YES - ARG0=ARG2 DCA ARG0 /NO TAD ARG2 CMA TAD ARG0 SMA /IS ARG0 .LE. ARG2? ERROR /NO DCA ARG1 /YES - ARG1=ARG0-ARG2-1 TAD ARG0 SPA CLA /IS ARG0 .GE. 0? ERROR /NO TAD SAVE /YES - GET COMMAND CHARACTER JMS SORTB /IS IT A LEGAL COMMAND? LIST2-1 /YES - MATCH TO LIST OPS2-LIST2 /AND BRANCH TO ITS HANDLER ERROR /NO - TRY AGAIN /COMMAND IDENTIFICATION LIST LIST2=. /COMMAND LETTERS 305 /E 301 /A 311 /I 303 /C 313 /K 304 /D 314 /L 316 /N 320 /P 322 /R 312 /J 306 /F 324 /T 315 /M 307 /G 323 /S 331 /Y 321 /Q 302 /B 326 /V SIGN, "# /V3 VERSION # NONE, -41 /"NOP-CIA" /SORT AND BRANCH ROUTINE /LOOKS FOR MATCH BETWEEN CHAR /AND ELEMENTS OF TABLE 1 SPECIFIED /CALLING SEQUENCE: / JMS I (SORTB / TABLE1-1 / TABLE2-TABLE1 / RETURN IF NO MATCH /DISPATCHES TO CORRESPONDING ADDRESS IN TABLE 2 SORTB, 0 SZA /IS CHARACTER STORED YET? DCA CHAR /NO - STORE IT TAD I SORTB /YES ISZ SORTB DCA AXTEM /STORE TABLE 1 ADDRESS TAD I AXTEM /GET TABLE ENTRY SPA /DONE YET? JMP SEX /YES - EXIT CMPT, CIA /NO TAD CHAR /GET CHARACTER SZA CLA /DO THEY MATCH? JMP .-6 /NO - KEEP TRYING TAD AXTEM /YES - THEY MATCH TAD I SORTB /GET DISPATCH TABLE ADDRESS DCA SORTB TAD I SORTB DCA SORTB /SET RETURN ADDRESS JMP I SORTB /--RETURN--VIA DISPATCH TABLE SEX, ISZ SORTB /MATCH NOT FOUND CLA JMP I SORTB /-- /DECIMAL ADDITION ROUTINE /FOR NUMERIC ARGUMENTS OF COMMANDS /ENTER WITH INPUT DIGIT IN SORTB /EXIT WITH ACCUMULATED NUMBER IN AC COUNT, DCA SORTB ISZ LSTCHK /GOT A DIGIT NOW TAD TEMP RTL CLL TAD TEMP RAL TAD SORTB JMP DBCV2 /RETURN TO MAIN SEQUENCE /----------------------------------------------------------------- /DISPATCH LIST FOR COMMAND HANDLERS OPS2, ENDFIL /E APP /A XNS /I CNGE /C KILL /K DELE /D LIST /L COMBO /N PUNCH /P TELE /R JERK /J BARROW /F PUNCT /T MOVEM /M GETTAG /G XCRET /S YANK /Y Q /Q CORSPC /B VIEW /V VERSN /# /END OF INPUT TEXT LINE ROUTINE EOL, JMS I ENDLNI /RESET LINK CELLS ISZ LSTN /INCREMENT LINE POINTERS ISZ THSN TAD BUFEND CLL CIA TAD AXIN SNL CLA /IS THE BUFFER FULL? /------------------------------------------------------------ JMP MOR /NO - KEEP FILLING TAD BELL /YES - RING WARNING BELL JMS I OUTL1 JMP I TE1 /*RETURN TO COMMAND MODE* /CONTINUATION OF HANDLERS FOR A, C, AND I COMMANDS APP1, TAD LSTN /APPEND DCA ARG0 /RESET ARG0 TO END OF TEXT JMP INS CNGE1, JMS I DELT /CHANGE - DELETE LINES AND XNS1, TAD ARG0 /INSERT SNA CLA /ANY ARGUMENTS? INS, ISZ ARG0 /NO - INSERT AT BEGINNING OF TEXT TAD ARG0 JMS I FIN1 /FIND THE POINTER DCA THIS ISZ TABIND /SET TAB INDICATOR CDF 10 TAD I THIS /GET LINK TO BUFFER CDF 0 DCA XSAV CMA TAD ARG0 DCA THSN /SET LINE POINTER AONE, TAD BUFR /BEGIN LINE DCA AXIN DCA XCTIN MOR, JMS I BUFRDI /GET A CHARACTER JMS I SORTJ /IS IT SPECIAL? (SEE LIST) LIST5-1 INLIST-LIST5 /YES - GO TO ITS HANDLER JMS PACBUF /NO - PACK IT JMP MOR /FETCH ANOTHER /CHARACTER PACKING ROUTINE /CONVERTS CHARACTER IN CHAR TO INTERNAL CODE /AND CALLS PCK1 TO PACK IT INTO BUFFER /ENTER AND EXIT WITH AC CLEAR PACBUF, 0 CLL TAD AXIN /DON'T ADD CHARACTERS TAD K1210 /IF AXIN ABOVE 6570 SZL CLA /IS THERE ROOM FOR THIS ONE? ERROR /NO TAD CHAR /YES TAD M240 SPA /IS IT 200-237? JMP ESCA /YES - ATTACH 77 TAD M77 SMA SZA /IS IT 337 OR LESS? JMP ESCA /NO - ATTACH 77 TAD P40 /YES - IS IT 277? SNA CLA JMP ESCA /YES - ATTACH 77 TR1, TAD CHAR /240-337 EXCEPT 277 AND C77 /MASK OUT LEFT 6 BITS JMS PCK1 /PACK IT JMP I PACBUF /--RETURN-- ESCA, CLA /200-237, 277,340-377 TAD C77 /PACK A 77 JMS PCK1 JMP TR1 /PACK THE CHARACTER /PACK CHARACTERS INTO TEXT BUFFER /ENTER WITH 6-BIT CODE IN AC PCK1, 0 ISZ XCTIN /LEFT HALF OR RIGHT HALF? JMP ROT /LEFT HALF DCA UTRA /RIGHT HALF - STORE CHARACTER TAD UTRA /GET CHARACTER TAD ADD /GET PREVIOUS CHARACTER CDF 10 DCA I AXIN /STORE IN FIELD 1 BUFFER CDF 0 DCA ADD JMP I PCK1 /--RETURN-- ROT, CLL RTL /LEFT HALF RTL RTL /ROTATE 6 LEFT DCA ADD /RETAIN UNTIL NEXT CHARACTER CMA /IS READY DCA XCTIN /RESET L OR R SWITCH JMP I PCK1 /--RETURN-- UTEST=PACBUF /TEMPORARY /CHARACTER UNPACKING ROUTINE /CONVERTS ONE CHARACTER FROM /BUFFER FORMAT TO 8-BIT ASCII /EXIT WITH CHARACTER IN AC UTRA, 0 CLA CMA /INITIALIZE TO -1 DCA UTEST EXTR, ISZ XCT /LEFT HALF OR RIGHT HALF? JMP GET3 /RIGHT HALF CDF 10 /LEFT HALF TAD I AXOUT /GET BUFFER WORD CDF 0 DCA GTEM TAD GTEM RTR /ROTATE 6 RIGHT RTR RTR JMP GET4 /SKIP TO GETA GET3, CLA CMA /RESET L - R SWITCH DCA XCT TAD GTEM GET4, AND C77 /MASK OUT LEFT 6 BITS TAD M77 CLL SNA /WAS IT 77? ISZ UTEST /YES - WAS IT LEFT HALF? JMP GET5 /NO - CONTINUE JMP EXTR /YES - GET OTHER HALF GET5, TAD P37 ISZ UTEST /RESTORE THE CHARACTER CML SNL TAD C100 TAD C240 TAD X203 /IS IT A ^C? SNA JMP UTRA+1 /YES - IGNORE IT TAD M27 /NO - IS IT A ^Z? SNA JMP UTRA+1 /YES - IGNORE IT TAD P232 /NO - RESTORE CHARACTER JMP I UTRA /--RETURN-- /------------------------------------------------------------- /INPUT LIST FOR SPECIAL CHARACTERS IN TEXT MODE INLIST=. SPACES /SPCS CTRLU /^U FULL /FORM FULL /BELL RUB4+1 /LINE FEED RUB1 /RUBOUT EOL /CARRIAGE RETURN /HANDLER FOR FORM FEED OR ^G FULL, TAD IGNORE / TAD MCHIN1 / SNA CLA /IN APPEND MODE? JMP I TE1 /YES*RETURN TO COMMAND MODE* TAD LSTN /NO - IS BUFFER EMPTY? SNA CLA / /-------------------------------------------------------------- JMP I MORI /YES - IGNORE FORM FEED JMP I TE1 /NO*RETURN TO COMMAND MODE* MORI, MOR /SET UP TO READ FROM INPUT DEVICE /USED BY C AND R COMMANDS /CALLED WITH SEQUENCE / JMS I PSETUP / INPUT ROUTINE / CONTINUATION OF HANDLER /EXITS TO CONTINUATION OF HANDLER SETUP, 0 TAD I SETUP /GET READ AREA FROM ARGS DCA BUFRDI TAD I SETUP /LOCATION FOR IGNORED CHARACTERS IAC CLL /V12 DCA IGNORE ISZ SETUP /SETUP PROPER RETURN POINT TAD I SETUP DCA SETUP TAD BUFR TAD K1320 SZL CLA /IS BUFFER FULL? ERROR /YES - DON'T READ JMP I SETUP /--RETURN-- 0 /*** A FREE LOCATION!!!*** /SUPERVISOR FOR DELETION OF TEXT LINES DELP, 0 JMS I CHKARG /CHECK ARGUMENT VALIDITY TAD ARG0 DCA THSN /SET CURRENT LINE # TAD ARG1 /SAVE # DELETED DCA LISTER TAD ARG0 /GET POINTER TO LINE JMS I FIN1 /TO BE DELETED DCA THIS /STORE IT DELP1, CDF 10 TAD I THIS DCA MARK /CORE ADDRESS OF OBJECT LINE TAD I MARK DCA I THIS /CHAIN NEW POINTERS TO DELETE LINE TAD MARK CDF 0 JMS I GRBAGE /PHYSICALLY DELETE THE LINE ISZ ARG1 /ALL SPECIFIED LINES DELETED? JMP DELP1 /NO - CONTINUE TAD LSTN /IF 1,/D..MAKE CURRENT=0 SNA CLA DCA THSN TAD LISTER /BUMP TOTAL DOWN TAD LSTN DCA LSTN JMP I DELP /YES--RETURN-- /HANDLER FOR < EXLAS, CLA CLL CMA RAL /PRINT LAST LINE - AC=7776=-2 /HANDLER FOR > OR LINE FEED EXNEX, TAD THSN /PRINT NEXT LINE IAC SNA /IS IT AN EXISTING LINE? ERROR /NO DCA ARG0 /YES SAVE EFFECTIVE ARGUMENTS CMA DCA ARG1 /HANDLER FOR L COMMAND LIST, TAD LOW /SET KEYBOARD AS OUTPUT DCA OUTDEV ISZ TABIND /SET TAB INDICATOR JMS LISTER /OUTPUT LINE(S) JMP I TE1 /*RETURN TO COMMAND MODE* /LISTING OUTPUT ROUTINE /OUTPUTS LINES INDICATED BY ARG0,ARG1 LISTER, 0 TAD ARG0 SZA CLA /ANY ARGUMENTS? JMP L0 /YES - SET THEM UP TAD LSTCHK /ALLOW 0L? SZA CLA ERROR /NOPE TAD LSTN /NO - SET TO LIST BUFFER CIA DCA ARG1 ISZ ARG0 /SET TO LINE 1 L0, TAD ARG0 CIA TAD LSTN SPA CLA /ARGUMENTS IN RIGHT RANGE? L1, ERROR /NO -( OR JMP I TE1) TAD ARG0 JMS I FIN1 /GET POINTERS DCA THIS /SAVE POINTER CMA CDF 10 TAD I THIS /GET START DCA AXOUT TAD I AXOUT /SAVE POINTER FOR SEARCH DCA XSAV TAD AXOUT /SAVE OBJECT LINE FOR GARBAGE COLLECT DCA MARK CDF 0 CMA DCA XCT TAD ARG0 /SET POINTER DCA THSN ISZ ARG0 /SET FOR NEXT LINE /(HANDLER FOR FORM FEED DURING CHARACTER SEARCH) L2, JMS I UTR1 /UNPACK A CHARACTER JMS I OUT1 /PRINT A CHARACTER JMS I CPTSTI /WAS IT ^O OR ^C FROM KEYBOARD? JMP L3 /NO - CONTINUE TAD C317 /YES - ^O JMS I UPAROI /GENERATE ^O JMP I TE1 /*RETURN TO COMMAND MODE* L3, TAD CHAR /OR (JMP SLOOK) TAD MCR SZA CLA /WAS IT END OF LINE? JMP L2 /NO - KEEP UNPACKING ISZ ARG1 /YES - DONE YET? JMP L0 /NO - GET NEXT LINE JMP I LISTER /YES --RETURN-- CPTSTI, CTRLP /TEST FOR ^O AND ^C C317, 317 /------------------------------------------------------------ /SEARCH ROUTINES /HANDLER FOR CARRIAGE RETURN SRETN, JMS I ENDLNI /TERMINATE THIS LINE TAD MARK /AND NOW GARBAGE COLLECT JMS I GRBAGE ISZ ARG1 /DONE YET? JMP I LIS1 /NO - GET NEXT LINE JMP I TE1 /YES*RETURN TO COMMAND MODE* SLOOK, JMS I SORTJ /SEARCH DONE? LIST3-1 /(CARRIAGE RETURN OR SEARCH CHARACTER) LISTGO-LIST3 /YES - GO TO ITS HANDLER JMS I PACK1 /NO-PACK SEARCHED CHARACTERS JMP I L2I /CONTINUE SEARCH IFNZRO SLOOK&1000 <PGERR,XXX> /HANDLER FOR ^G DURING CHARACTER SEARCH /CHANGE SEARCH CHARACTER SCONT, JMS I KEYBD /FETCH NEW SEARCH CHARACTER DCA LIST3+1 /STORE IT IN LIST JMP I L2I /CONTINUE SEARCH /HANDLER FOR LINE FEED DURING SEARCH SLINE, TAD CCR DCA CHAR JMS I ENDLNI ISZ ARG0 /MOVE POINT ISZ THSN /BUMP CURRENT LINE COUNT ISZ LSTN /ADD A LINE. /HANDLER FOR _ DURING SEARCH SBAR, TAD CCR /CTRL-U JMS I OUT1 /OUTPUT CARRIAGE RETURN TAD BUFR /RESTART PACK BUFFER DCA AXIN DCA XCTIN /------------------------------------------------------------------- SFOUND, JMS I CHI1 /GET A CHARACTER JMS I SORTJ /SPECIAL SEARCH COMMAND? LIST6-1 SRNLST-LIST6 /YES - GO TO HANDLER /HANDLER FOR SEARCH CHARACTER FOUND SGOT, JMS I PACK1 /NO-PACK INSERTS JMP SFOUND /CONTINUE INPUT /TELETYPE CHARACTER FETCH ROUTINE /ENTER WITH AC CLEAR /EXIT WITH CHARACTER IN CHAR AND AC /FORCE CHANNEL 8 /BLANK TAPE & LEADER TRAILER IGNORED CHIN, 0 DCA CHAR /CLEAR CHARACTER JMS I KEYBD AND P177 /MASK PARITY SNA /IGNORE BLANK AND L/T JMP CHIN+1 TAD C200 /RESTORE CHARACTER JMS I OUT1 /ECHO INPUT TAD CHAR JMP I CHIN /--RETURN-- /SEARCH TEXT BUFFER FOR LINE /WHOSE NUMBER IS ONE LESS THAN /THE CONTENTS OF THE AC /EXIT WITH ADDRESS OF LINK CELL IN AC FIND, 0 /LOCATE LINE BUFFER CIA SMA /IS LINE NUMBER TOO SMALL? ERROR /YES DCA TEMP /NO - STORE NEGATIVE OF LINE # TAD TEMP IAC TAD LSTN SPA CLA /IS LINE NUMBER TOO LARGE? ERROR /YES TAD CFRS /NO JMP FIND1 FIND2, CDF 10 TAD I SAVE /CHAIN THROUGH LIST CDF 0 SZA /FAILSAFE FIND1, DCA SAVE ISZ TEMP /DONE YET? JMP FIND2 /NO - KEEP CHAINING TAD SAVE /YES - GET LINE NUMBER JMP I FIND /--RETURN-- CON, 6030 /CONVERSION CONSTANTS 7634 7766 7777 BOX=COUNTP VAL=ARG0 /HANDLER FOR : OR = /PRINTS REQUESTED LINE NUMBER /WHICH IS FOUND IN ARG2 ON ENTRY PRNT, TAD ARG2 DCA VAL /SET NUMBER TO BE PRINTED TAD M4 DCA CNT /SET CHARACTER COUNT TAD ADDR DCA XYZ+2 FLOOZ, DCA BOX CLL TAD VAL /IF VAL IS TOO LARGE, IT LOOKS SMA CLA /LIKE A NEG NO. THE LINK TAD K50 /DETERMINES THE END POINT IN THAT CASE TAD K7430 /7430=SZL; 7500=SMA DCA XYZ+3 JMP .+4 ISZ BOX CLL XYZ, DCA VAL TAD VAL NOP /TAD CON +() SOME DISPLACEMENT SMA /OR, IF VAL TOO BIG,SZL JMP XYZ-2 /KEEP ADDING THE SAME CONSTANT CLA TAD BOX /BOX HAS THE NUMBER COUNT TAD C260 /MAKE ASCII DIGIT JMS I OUTL1 /OUTPUT THE DIGIT ISZ XYZ+2 /ADD IN NEXT CONVERSION CONSTANT LATER ISZ CNT /DONE ALL FOUR? JMP FLOOZ /NO - KEEP CONVERTING JMP I TE1 /YES*RETURN TO COMMAND MODE* C260, 260 ADDR, TAD CON K50, 50 K7430, 7430 /CHARACTER OUTPUT ROUTINE OUT, 0 DCA CHAR /ESC PATCH 25-MAY-77 DS / TAD ECHOSW / SNA CLA /ECHO SUPPRESSED? JMS I .+1 /DS ESCPA /DS JMP I OUT /YES--RETURN-- JMS I SORTJ /NO - IS IT A FORMAT CHARACTER? LIST4-1 /YES - EXIT TO ITS HANDLER OUTLIS-LIST4 ISZ TCNT /NO - COUNT ONE LETTER TAD CHAR OUTX, JMS I OUTDEV /OUTPUT THE CHARACTER JMP I OUT /--RETURN-- /CARRIAGE RETURN HANDLER OUTCRL, TAD CCR JMS I OUTDEV /OUTPUT CARRIAGE RETURN DCA TCNT /CLEAR TAB COUNTER TAD CLF /OUTPUT LINE FEED JMP OUTX /TAB HANDLER - TAB/RUBOUT OUTRT, TAD CTAB JMS I OUTDEV /OUTPUT TAB CIF 10 JMS I POTYPE /TEST TYPE OF OUTPUT SPA CLA /IS IT DIRECTORY DEVICE? JMP I OUT /YES--RETURN-- TAD CRO /NO - OUTPUT RUBOUT JMP OUTX /TAB HANDLER - SPACES OUTTAB, TAD TABIND SNA CLA /OUTPUT TAB/RUBOUT INSTEAD? JMP OUTRT /YES - GO TO OTHER TAB HANDLER TAD TCNT /NO - TAD MTABS /REDUCE SPACE COUNT TO 8 OR LESS SMA JMP .-2 DCA TCNT TAD C240 /OUTPUT SPACES JMS I OUTDEV ISZ TCNT /DONE YET? JMP .-3 /NO - CONTINUE JMP I OUT /YES--RETURN-- /----------------------------------------------------------------------- /I-O SUBROUTINES /HANDLER FOR S COMMAND XCRET, JMS I KEYBD /GET THE SEARCH CHARACTER DCA LIST3+1 /SAVE IT IN LIST TAD SXS2 DCA I L3I /MAKE LISTER JUMP TO SLOOK TAD BUFR DCA AXIN /BUILD NEW TEXT IMAGE HERE DCA XCTIN TAD CHI1 /READ POINT IS CHIN IAC DCA IGNORE JMP I LIS1 /LIST OF SPECIAL CHARACTERS FOR G COMMAND TAGLIST=. GTAG2 /SPACE GTAG2 // GTAG2 /ESC GTAG2 /TAB GTAG2 /CARRIAGE RETURN /----------------------------------------------------------------------- /LOW SPEED OUTPUT ROUTINE /ENTER WITH CHARACTER IN AC OUTL, 0 TLS TSF JMP .-1 CLA JMP I OUTL /--RETURN-- /LOW SPEED INPUT ROUTINE /CHECKS FOR ^C /EXIT WITH CHARACTER IN AC I33, 0 KSF JMP .-1 JMS CTCK KRB AND P177 TAD C200 JMP I I33 /NO--RETURN-- /SET UP APPEND, CHANGE, INSERT TO WORK /EACH READS KEYBOARD, NOT DEVICE CNGEL, CNGE1-XNS1 XNSL, XNS1-APP1 /HANDLER FOR C COMMAND CNGE, TAD CNGEL /HANDLER FOR I COMMAND XNS, TAD XNSL /HANDLER FOR A COMMAND APP, TAD APPL DCA DEST /RETURN POINT ISZ ECHOSW JMS I PSETUP CHIN /KEYBOARD INPUT DEST, APP1 /SPECIAL OUTPUT LIST OUTLIS=. ESCOUT /233 - ESC - V12 OUTTAB /211 - TAB OUTCRL /215 - CARRIAGE RETURN OUTX+1 /212 - LINE FEED OUTX+1 /214 - FORM FEED OUTX+1 /377 - RUBOUT CTRLN /216 - CNTRL N /CHECK TTY FOR ^C OR ^O INPUT /EXIT TO MONITOR ON ^C /SKIP ON ^O CTRLP, 0 KSF JMP I CTRLP /--RETURN-- JMS CTCK TAD M14 /NO - IS IT ^O? SZA CLA JMP I CTRLP /NO--RETURN-- ISZ CTRLP /YES KCC JMP I CTRLP /--RETURN-- M14, -14 CTCK, 0 TAD C200 KRS TAD X203 SNA JMP I MONITOR JMP I CTCK /HANDLER FOR P COMMAND PUNCH, ISZ ECHOSW TAD BUFWTI /SETUP TO WRITE INTO OUTPUT BUFFER DCA OUTDEV PUNC, JMS I LIS /WRITE THE EDITOR BUFFER TAD C214 /OUTPUT FORM FEED JMS I OUTDEV /HANDLER FOR T COMMAND PUNCT, CDF 10 TAD I K7600 CDF 0 SNA CLA /IS THERE AN OUTPUT DEVICE? JMP I TE1 /NO*RETURN TO COMMAND MODE* TAD BUFWTI /YES - SET UP TO WRITE INTO DCA OUTDEV /OUTPUT BUFFER TAD M40 DCA CTRLP /SET TRAILER COUNTER CIF 10 JMS I POTYPE / SMA CLA /DIRECTORY DEVICE FOR OUTPUT? JMS I OUTDEV /NO - OUTPUT LEADER TRAILER ISZ CTRLP /DONE YET? JMP .-5 /NO - CONTINUE TSF /YES - RESET FLAG JMP .-1 JMP I TE1 /*RETURN TO COMMAND MODE* /HANDLER FOR R COMMAND TELE=. TELEN, TSF JMP .-1 DCA ECHOSW /INHIBIT ECHO JMS I PSETUP /SETUP TO READ FROM BUFRD /INPUT DEVICE APPL, APP1 /APPEND TEXT TO BUFFER /HANDLER FOR Y COMMAND YANK, TAD COM1 /YANK KILLS 'P' PART OF N JMP COMBOA /HANDLER FOR N COMMAND COMBO, TAD JMPCH /YANK WIPES COM1-1 COMBOA, DCA I CCON+1 TAD ARG0 SNA /ANY ARGUMENTS IAC /NO - ASSUME 1 CIA DCA COUNTP /SET NUMBER OF PAGES TO YANK TAD CCON /(JMP I AXCOMB) DCA I TE1 /SET TE1 TO ALLOW LOOPING COMB, TAD CCON+1 /THROUGH PUNCH, KILL, READ DCA AXCOMB /CYCLE DCA ARG0 /CLEAR ARGUMENTS DCA ARG2 DCA LSTCHK /DON'T INHIBIT LISTER! DCA TABIND /CLEAR IN CASE OF MULTIPLE N / JMP PUNC /OUTPUT BUFFER JMP PUNCH /12D FIX COM1, JMP I KILL1 /KILL BUFFER JMP TELEN /READ NEW BUFFER FULL ISZ COUNTP /DONE YET? JMP COMB /NO - CONTINUE CLA CLL CML RAL /YES-AC=1 - RESET CURRENT LINE NUMBER DCA THSN /.=1 ON RETURN COM5, TAD CZ /RESTORE TE1 DCA I TE1 JMP I TE1 /*RETURN TO COMMAND MODE* /IT IS VITAL TO KEEP DUMB1 AND COM5 ON THE SAME PAGE DUMB1, JERK1 PSETUP, SETUP /V3 /----------------------------------------------------------------------- LIST1=. 212 /LINE FEED 240 /SPACE 253 /PLUS (+) 254 /COMMA (,) 255 /MINUS (-) 256 /PERIOD (.) 257 /SLASH (/) 274 /< 275 /= 276 /> 000 /(DUMMY ENTRY) 375 /ALTMODE ASR-33 376 /ALTMODE ASR-35 233 /ESCAPE KEY 242 /DOUBLE QUOTE (") 244 /DOLLAR SIGN ($) 377 /RUBOUT 272 /COLON (:) LIST1A, 215 /CARRIAGE RETURN 225 /^U 203 /^C /HANDLER FOR G COMMAND GETTAG, ISZ THSN TAD ARG0 SNA /ANY ARGUMENTS TAD THSN /NO - BEGIN WITH NEXT LINE (.+1) DCA ARG0 /YES - SET ARGUMENTS SKP GTAG2, ISZ ARG0 IAC TAD ARG0 JMS I FIN1 /GET NEXT LINE DCA AXOUT CMA DCA XCT JMS I UTR1 /UNPACK FIRST CHARACTER JMS I SORTJ /DOES IT BEGIN A TAG? LIST7-1 /NO - TAGLIST EXITS TAGLIST-LIST7 /TO GTAG2 JMP I LIS1 /YES - PRINT LINE MP1=ARG1 MP2=ARG0 MP3=ARG2 /HANDLER FOR M COMMAND /ENTER WITH FIRST LINE TO MOVE IN MOV1 /LAST LINE TO MOVE IN MOV2 /MOV2 .GT. MOV1 /DESTINATION LINE IN ARG2 MOVEM, TAD MOV1 CIA /ARG2 MAY NOT BE BETWEEN TAD ARG2 /MOV1 AND MOV2 SPA CLA /IS MOV1 .GT. ARG2? /----------------------------------------------------------------------- JMP .+6 /YES - O.K. TAD MOV2 CMA TAD ARG2 SPA SNA CLA /IS MOV2 .LT. ARG2? ERROR /NO-FAULTY LOGIC IN COMMAND TAD MOV1 /YES JMS I FIN1 DCA MP1 /STORE FIRST LINE POINTER IAC TAD MOV2 JMS I FIN1 DCA MP2 /STORE LAST LINE POINTER TAD ARG2 JMS I FIN1 DCA MP3 /STORE DESTINATION LINE POINTER CDF 10 /ALL FOUND TAD I MP1 /SWAP POINTERS- DCA TEMP /RESET THE LINK COORDS TAD I MP2 DCA I MP1 TAD I MP3 DCA I MP2 TAD TEMP DCA I MP3 CDF 0 JMP I TE1 /*RETURN TO COMMAND MODE* SRNLST=. SBAR /BACK ARROW (_) L2 /FORM FEED SCONT /BELL SLINE /LINE FEED RUB1 /RUB OUT LISTGO=. SRETN /CARRIAGE RETURN SGOT /SEARCH CHARACTER FOUND /HANDLER FOR RUBOUT IN TEXT OR SEARCH RUB1, TAD AXIN CIA TAD BUFR TAD XCTIN SZA CLA /IS THERE ANYTHING ON THIS LINE? TAD ECHOSW /OR ECHO INHIBITED? SNA CLA JMP I IGNORE /YES-IGNORE RUBOUT /SCOPE PATCH 25-MAY-77 DS / TAD SPLAT /NO- / JMS I OUT1 /OUTPUT BACKSLASH JMS I .+1 /DS RUBPA /DS /DELETE CHAR FROM BUFFER TAD AXIN /GET LAST WORD OF INPUT DCA MOV1 CDF 10 DCA I BUFR /PREVENTS INFINITE RUBOUTS TAD I MOV1 ISZ XCTIN /WHICH HALF OF WORD? JMP RUB2 AND C77 TAD M77 SZA CLA /TEST EXTENSION JMP RUB4 RUB3, CMA DCA XCTIN CMA TAD AXIN DCA AXIN TAD I MOV1 AND P7700 RUB4, DCA ADD CDF 0 JMP I IGNORE /CHIN+1 RUB2, AND P7700 TAD C100 SZA CLA JMP RUB3 DCA I MOV1 JMP RUB3+1 /HANDLER FOR SPACE IN TEXT MODE SPACES, TAD ECHOSW CLA /OR SZA CLA IF B OPTION JMP I SPCNO /PACK IT - (MOR+4) CMA /SET COUNTER SP2, DCA CNT JMS I BUFRDI /GET LAST CHARACTER TAD M240 SNA CLA /WAS IT SPACE? JMP SP2 /YES-IGNORE EXTRA SPACES /----------------------------------------------------------------------- TAD CHAR /NO DCA SAVE /SAVE NON-SPACE ISZ CNT /WAS THERE MORE THAN 1 SPACE? TAD M27 /YES- STORE TAB TAD C240 /NO-STORE SPACES DCA CHAR JMS I PACK1 TAD SAVE JMP I SPCGO /SORT - (MOR+1) /HANDLER FOR $ (PART OF M COMMAND) MOVE, TAD ARG0 /ARG2 .GE. ARG0 CIA TAD ARG2 SPA CLA /ARE LINES TO BE MOVED LEGITIMATE ERROR /NO TAD ARG0 /YES- DCA MOV1 /SET POINTER TO FIRST LINE TAD ARG2 DCA MOV2 /SET POINTER TO LAST LINE JMP I ONUM /CONTINUE COMMAND INPUT OPS1, EXNEX /LINE FEED GEXP /SPACE GEXP /PLUS FIRS /COMMA GMIN /MINUS PERI /POINT(.) SLAS /SLASH EXLAS /BACKUP(<) PRNT /= EXNEX /ALT(>) DBCV2 /DUMMY AMODE /ALTMODE ASR-33 AMODE /ALTMODE ASR-35 AMODE /ESCAPE KEY DBLQUO /" MOVE /DOLLAR SIGN ELIM /COMMAND RUBOUT PRNT /: GTOP-2 /CARRIAGE RETURN START /^U MONIT /^C (MONITOR RESTART) OPS1A, RETRN /RETURN /----------------------------------------------------------------------- OLDTE1, START /^U MONIT /^C /HANDLER FOR E COMMAND ENDFIL, TAD EKILLL /IS E COMMAND ALLOWED? SZA CLA ERROR /NO-NO INPUT SPECIFIED CLA CMA /YES-RESET ARGUMENTS DCA ARG0 TAD JMPTE1 /SKIP LISTER IF EMPTY BUFFER DCA I L1I TAD FLCLSI /CLOSE FILE SETUP DCA ELIM /CLOSES FILE ON READ FAILURE JMP I COMBOP COMBOP, COMBO FLCLSI, JMP I CLFLI AONEI, AONE /HANDLER FOR ^U IN TEXT MODE CTRLU, JMS CTRLU1 /GENERATE A ^U JMP I AONEI /AND CONTINUE /PRINT ^U CTRLU1, 0 TAD C325 JMS I UPAROI /PRINT ^U TAD CCR /AND A CR/LF JMS I OUT1 JMP I CTRLU1 /--RETURN-- C325, 325 /CHECK VALIDITY OF ARGUMENTS /FOR D COMMAND CHKARX, 0 TAD ARG0 CIA IAC TAD ARG1 TAD LSTN SPA CLA /DO LINES EXIST? ERROR /NO JMP I CHKARX /YES--RETURN-- /HANDLER FOR . PERI, TAD THSN SKP /HANDLER FOR / SLAS, TAD LSTN DCA TEMP /SAVE LINE NUMBER DCA CHAR ISZ LSTCHK /GOT EITHE . OR / IN ARGS JMP I .+1 /FETCH REST OF ARGUMENT GLOM /END OF A NEW TEXT LINE /PACK CARRIAGE RETURN INTO BUFFER /SET LINK CELLS AROUND NEW LINE /ENTER WITH: / CHAR CONTAINS CARRIAGE RETURN / THIS CONTAINS ADDRESS OF LINK / CELL OF PRECEDING TEXT LINE / XSAV CONTAINS ADDRESS OF LINK / CELL OF FOLLOWING TEXT LINE / BUFR CONTAINS ADDRESS OF LINK / CELL OF NEW TEXT LINE ENDLN, 0 JMS I PACK1 /PACK CARRIAGE RETURN CDF 10 TAD ADD SZA DCA I AXIN TAD BUFR /RESET LINK CELL DCA I THIS /OF PREVIOUS LINE TAD XSAV DCA I BUFR /RESET LINK CELL OF NEW LINE TAD BUFR DCA THIS /RESET POINTER TO LINK CELL ISZ AXIN TAD AXIN DCA BUFR /RESET FOR NEXT LINE DCA XCTIN /CR CHARACTER SWITCH CDF 0 JMP I ENDLN /--RETURN-- /HANDLER FOR ^C /AND OTHER EXITS TO MONITOR MONIT, JMS FXSTWD /SET JOB STATUS TO SAVE CORE TSF /MAKE SURE TTY FLAG IS SET JMP .-1 JMP I K7600 /****EXIT TO MONITOR**** /CLEAR BIT 11 OF JOB STATUS WORD FXSTWD, 0 CIF 10 JMS I JSWSET /IF NONZERO TEXT,SAVE BUFFER JMP I FXSTWD /--RETURN-- SPCP1A, SPACES+1 BUFRD1, BUFRD+1 /RESET POINTERS AND SAVE BUFFERS RESET3, JMS FXSTWD CIFTEN, CIF 10 /CLEAR BIT 11 OF JSW JMS I P7700 /CALL USER SERVICE ROUTINES 10 /*LOCK USR IN CORE* TAD CIFTEN /RESET POINTERS DCA I BUFRD1 DCA EKILLL TAD OLDTE1 DCA TE1 TAD CZ DCA I TE1 TAD K7600 DCA ELIM TAD K7600 DCA I SPCP1A TAD LOW DCA OUTDEV ISZ ECHOSW TAD JMPCH DCA I CCON+1 ISZ FXSTWD /WASTE TIME FOR TTY FLAG JMP .-3 CIF CDF 10 JMP I .+1 /GO CALL COMMAND DECODER START1 JSWSET, INSET /----------------------------------------------------------------------- /----------------------------------------------------------------------- /READ,WRITE,AND RELATED ROUTINES OURECS=4 /SIZE OF OUTPUT BUFFER *2000 /HANDLER FOR Q COMMAND Q, JMS I FXSWDI /CLEAR BIT 11 OF JSW CDF 10 TAD I K7600 CDF 0 SNA CLA /WAS AN OUTPUT DEVICE SPECIFIED? ERROR /NO- FLCLOS, TAD LSTN SNA CLA /IS BUFFER EMPTY? JMP FLCLS1 /YES-CLOSE FILE TAD FLCLI /NO- DCA TE1 /SET UP RETURN FROM P COMMAND JMP I .+1 EPATCH /V12D PATCH / PUNCH /WRITE CURRENT BUFFER /CLOSE FILE ON E OR Q COMMAND FLCLS1, JMS I PTCH1 /GO TO PATCH TO HANDLE FILE FULL CLA CMA /TELL SYSTEM I/O MONITOR IS IN CORE CDF 10 DCA I P7700 CDF 0 JMP I K7600 /****EXIT TO MONITOR*** / PTCH1, PATCH1 /INPUT ROUTINE FROM DEVICE /VIA INPUT DEVICE HANDLER BUFRD, 0 CIF 10 JMS I ICHARI /FETCH A CHARACTER JMP ERRD /ERROR IN READING FROM BUFFER DCA CHAR /INTERFACE LOCATION TAD CHAR AND P177 SNA /IS IT L/T? JMP BUFRD+1 /YES-GET NEXT CHARACTER TAD C200 /NO RESTORE CHARACTER JMP I BUFRD /--RETURN-- ERRD, SPA CLA /FATAL OR EOF? JMP I SERR0I /FATAL-OUTPUT ERROR MESSAGE TAD ERSW /DISABLE FURTHER READS DCA BUFRD+1 TAD I COMM5 /IF THIS IS NEGATIVE, DO ONE SMA CLA /MORE SEARCH (POSSIBLY) IN THE CASE JMP BUFRD+1 /THAT NO FINAL FORM FEED EXISTS CLA IAC /SET CURRENT LINE TO 1 AND SEARCH DCA THSN /ONCE MORE JMP I .+1 SFIND2 ICHARI, ICHAR /CHARACTER ROUTINES FLCLI, FLCLS1 /OUTPUT ROUTINE TO DEVICE /VIA OUTPUT DEVICE HANDLER BUFWT, 0 CIF 10 JMS I OCHARI /OUTPUT A CHARACTER JMP ERWT /OUTPUT FAILED BUFRTN, TAD BUFWTI /RESET OUTPUT DEVICE HANDLER POINTER DCA OUTDEV JMP I BUFWT /--RETURN-- ERWT, SPA CLA /FATAL, OR NO MORE ROOM? JMP I SERR1I /FATAL-OUTPUT ERROR MESSAGE JMS I FXSWDI /FIX JOB STATUS WORD-NO MORE ROOM TAD I TE1 /STORE POINTERS DCA PTE1 TAD ELIM DCA PELIM TAD TE1 DCA PPTE1 CDF 10 ISZ I PANICI /SET PANIC DUMP TAD MORECS /PREPARE TO CLOSE PRESENT OUT FILE TAD I OCNTI /THIS GIVES OPTIMUM CLOSE LENGTH SPA JMP PATCH2 DCA I OCNTI TAD I OREC /WRITE A ^Z DCA CLSREC /DIRECTLY TO THE DEVICE TAD I OHNDL /HANDLER ENTRY POINT DCA TEMPO CDF 0 JMS I TEMPO /CALL OUTPUT DEVICE HANDLER 4110 /THE BUFFER IS A PAGE OF THE EDITOR 7000 /WITH A 232 IN THE FIRST LOCATION CLSREC, 0 /RECORD NUMBER HERE JMP I SERR1I /**WRITE FAILURE** 1* CDF CIF 10 JMS I OCLSI /CLOSE THE FILE IN PANIC MODE JMP I SERR2I /**FILE CLOSE FAILED**2* CIF 10 JMS I C200 /CALL USER SERVICE ROUTINES 11 /*DISMISS USR FROM CORE* PATCH2, CLA CDF 0 TAD POINT /PRINT OUT"FULL" AND RETURN DCA AXIN TAD I AXIN /FETCH CHARACTER SNA /DONE YET? JMP I RST3I /YES-RESET & CALL COMMAND DECODER JMS I OUTL1 /NO - OUTPUT CHARACTER JMP .-4 /GET NEXT CHARACTER FXSWDI, FXSTWD OCNTI, OUCCNT PANICI, PANIC OCHARI, OCHAR MORECS, -OURECS+1 /THIS ALLOWS US TO 'MANUALLY' WRITE /A FORM FEED AND A ^Z. POINT, FULLST-1 OREC, OUREC OHNDL, OUHNDL /RESET POINTERS STORED PREVIOUSLY BUFRET, TAD PPTE1 DCA TE1 TAD PTE1 DCA I TE1 TAD PELIM DCA ELIM JMP BUFRTN PPTE1, 0 PELIM, 0 PTE1, 0 OCLSI, OCLOSE /V3 FILE CLOSE ROUTINE /----------------------------------------------------------------------- /ERROR MESSAGE- FULL - FULLST, 306 /F 325 /U 314 /L 314 /L 215 /CARRIAGE RETURN 212 /LINE FEED 0 /DELIMITER SRCBUF, ZBLOCK 24 /SEARCH BUFFER /SPECIAL CHARACTER LIST FOR STRING SEARCH SLST=. 247 /" 242 /' 377 /RUBOUT 203 /^C 225 /^U /----------------------------------------------------------------------- NEXBUF, DUMB1&177+5600 /JMP I DUMB1 /DISPATCH LIST FOR STRING SEARCH OSLST, QUO1 /" QUO2 /' FORGET /RUBOUT MONIT /^C RLEAS /^U IN STRING SEARCH /GENERATE ^ FOLLOWED BY THE CHARACTER /WHICH IS IN AC ON ENTRY UPAROW, 0 DCA TEMPO /SAVE CHARACTER TSF JMP .-1 TAD C336 JMS I OUTL1 /PRINT ^ TAD TEMPO JMS I OUTL1 /PRINT CHARACTER JMP I UPAROW /--RETURN-- C336, 336 /HANDLER FOR ^U DURING STRING SEARCH RLEAS, JMS I (CTRLU1 JMP I (START /^U GETS US BACK TO # /HANDLER FOR ALTMODE AMODE, DCA STRIND /NEED SETUP JMS I STRFIN /SEARCH FOR STRING ERROR TAD THSN /RESULT IS LINE NUMBER JMP I .+1 /LINK TO COMMAND STRUCTURE GTOP+1 /HANDLER FOR J COMMAND JERK, DCA STRIND /SETUP FOR SEARCH JERK1, JMS I STRFIN /SEARCH FOR STRING JMP GMOR /GET NEXT BUFFER TSF JMP .-1 /JUST TO BE SURE TAD CZ /RESTORE MONITOR EXIT DCA I TE1 JMP I TE1 /*POSSIBLE RETURN TO COMMAND MODE* /GET NEXT BUFFER FOR S SEARCH GMOR, TAD I CNTRI SNA CLA /IS BUFFER EMPTY? ERROR /NO ISZ STRIND /YES-BYPASS SETUP TAD NEXBUF DCA I COMM5 /SET UP READ OF ONE BUFFER IAC DCA ARG0 TAD EKILLL SZA CLA /IS THERE AN OUTPUT DEVICE? JMP I .+2 /NO JMP I .+2 /YES YANK /NO OUTPUT COMBO /THERE IS OUTPUT /HANDLER FOR F COMMAND BARROW, ISZ STRIND /CONTINUES LOOKING FOR EXISTING STRING ISZ THSN /INCREMENT FOR NEXT LINE JMP JERK1 CNTRI, CNTR /HANDLER FOR " DBLQUO, ISZ THSN /USES STRING NOW IN BUFFER ISZ STRIND /NO SETUP REQUIRED JMP AMODE+1 /HANDLER FOR B COMMAND CORSPC, CLL TAD BUFR TAD K1320 SZL CLA /IS ANY CORE LEFT? JMP ZROCOR /NO TAD BUFR /YES-SET UP NUMBER OF LOCATIONS CIA /IN ARG2 TAD BUFEND TAD K360 ZROCOR, DCA ARG2 JMP I .+1 PRNT K360, 360 /HANDLER FOR K COMMAND KILL, TAD ARG0 /IN CASE HE TYPED N,MK SZA CLA /INSTEAD OF N,ML. SAVE HIM!! ERROR TAD END /RESET BUFFER POINTERS DCA BUFR /TO REFLECT EMPTY BUFFER DCA LSTN DCA THSN CDF 10 /ZERO FIELD 1 POINTER DCA I CFRS CDF 0 JMP I TE1 /*RETURN TO COMMAND MODE* /ROUTINE TO REASSIGN INPUT HANDLER /AFTER A PANIC DUMP AND RESTART PIASGN, CDF CIF 10 TAD I PINEOF SZA CLA /IS THERE A HANDLER TO RESTORE? JMP I PIRETN /NO - BACK TO FIELD 1 TAD I IHPAGE /YES - DCA PIHND /GET HANDLER PAGE TAD I IDVNO CDF 0 /I/O MONITOR IS IN CORE AT THIS POINT JMS I C200 /CALL USER SERVICE ROUTINES 1 /*FETCH HANDLER* PIHND, 0 JMP I SERR4I /**DEVICE HANDLER ERROR**+** TAD PIHND CDF CIF 10 DCA I PIHNDL /PUT NEW HANDLER ADDRESS BACK JMP I PIRETN /AND RETURN PIRETN, PANOPN /GO OPEN OUTPUT FILES PIHNDL, INHNDL IHPAGE, I1 /I1 CONTAINS "INDEVH+1" IDVNO, INDEV PINEOF, INEOF /HANDLER FOR # COMMAND VERSN, TAD ("V /V3 JMS I OUTL1 /V3 PRINT V TAD (VERSION&70%10+260 /V3 JMS I OUTL1 /V3 PRINT VERSION # TAD (VERSION&7+260 JMS I OUTL1 /V3C PRINT 2ND NUMBER OF VERSION # TAD (PATCH /V3 JMS I OUTL1 /V3 PRINT PATCH LEVEL JMP I TE1 /V3 RESTART *2400 /----------------------------------------------------------------------- /----------------------------------------------------------------------- /STRING SEARCH ROUTINE /CALLED BY $(ALTMODE) AND J COMMAND HANDLERS SFIND1, 0 ISZ ECHOSW TAD STRIND /IS SETUP NECESSARY SZA CLA JMP SFIND2 /NO. TAD MSCNT DCA BUFCNT /SET COUNTER TAD SBUF DCA AXIN /BEGIN SEARCH BUFFER TAD ATSIGN JMS I OUTL1 /OUTPUT $ ISZ TABIND RLOOP, JMS I CHI1 /FETCH CHARACTER FROM TTY JMS I SORTJ /IS IT SPECIAL FOR SEARCH STRING? SLST-1 /YES-HANDLE IT OSLST-SLST ISZ BUFCNT /NO-SEARCH BUFFER FULL? JMP STORE /NO-STORE THIS CHARACTER CLA CMA DCA BUFCNT /YES-DON'T ALLOW ANY MORE JMP RLOOP-1 /BUT KEEP ECHOING HIS STORE, TAD CHAR /STORE CHARACTER IN SEARCH BUFFER DCA I AXIN JMP RLOOP /HANDLER FOR " QUO2, TAD THSN /START AT .+1 /HANDLER FOR ' QUO1, IAC /START AT .=1 DCA THSN TAD AXIN CIA /MAKE UP COUNT OF NO. CHARS NOW IN TAD SBUF /SEARCH BUFFER DCA CNTR DCA I AXIN /END STRING WITH A 0 SFIND2, TAD CNTR SNA CLA /IS BUFFER EMPTY? JMP ER1 /YES-PREPARE TO EXIT JMS NUCHAR /NO GET FIRST STRING CHARACTER TAD THSN JMS I FIN1 /GET APPROPRIATE POINTER DCA THIS /THE TRICK IS TO GET THE NEXT DCA CHFND CDF 10 /POINTER SO THAT WE NEVER HAVE TO GO TAD I THIS /BACK TO THE FIND ROUTINE COMBAK, DCA TMP2 TAD I TMP2 DCA NEXTPT CDF 0 TAD THSN CIA TAD LSTN SPA CLA /LAST LINE? JMP ER1 /YES-FINISHED WITH BUFFER TAD TMP2 /NO DCA AXOUT /SET TO UNPACK CHARACTERS CMA DCA XCT UPK1, JMS I UTR1 /UNPACK A CHARACTER DCA TMP2 TAD TMP2 TAD MCR SZA CLA /END OF LINE? JMP NOCR /NO ISZ THSN /YES-INCREMENT LINE COUNTER JMS NUCHAR /FORGET PREVIOUS MATCHES ON NEW LINE DCA CHFND CDF 10 TAD NEXTPT /AND GET NEXT LINE JMP COMBAK NOCR, TAD TMP2 /CHARACTER OTHER THAN CARRIAGE RETURN TAD TMP1 /GET A CHARACTER FROM SEARCH BUFFER SZA CLA /DO THEY MATCH JMP UPK /NO ISZ CHFND /YES-BUMP A RANDOM POINTER CLA CMA DCA FMATCH /SIGNIFY FIRST MATCH JMS NUCHA /GET NEXT SEARCH CHARACTERR JMP UPK1 /AND ANOTHER BUFFER CHARACTER UPK, ISZ FMATCH /WAS THIS FIRST MATCH? JMP NOTSO /NO-NO PROBLEM TAD XCT /YES-DON'T LET THE POINTERS BE SPA CLA /BE CHANGED JMP WREK CMA TAD AXOUT DCA AXOUT CMA WREK, DCA XCT NOTSO, JMS NUCHAR /GET FIRST CHARACTER OF SEARCH STRING DCA CHFND JMP UPK1 /TRY AGAIN STFIN, TAD CHFND /END OF STRING-DO COUNTS MATCH? TAD CNTR SNA CLA JMP GOOD /YES-SEARCH SUCCESSFUL ER1, TAD LSTN /IF BUFFER EMPTY, SET .=0 SZA CLA IAC DCA THSN SKP /CAUSE ERROR RETURN (?) GOOD, ISZ SFIND1 /INCREMENT RETURN JMP I SFIND1 /--RETURN-- /GET NEXT SEARCH CHARACTER NUCHA, 0 TAD .-1 /SET TO RETURN FROM NUCHAR DCA NUCHAR JMP NEXX /GET FIRST CHARACTER OF SEARCH STRING NUCHAR, 0 TAD SBUF DCA AXIN NEXX, TAD I AXIN SNA /END OF STRING? JMP STFIN /YES CIA /NO - NEGATE SEARCH CHARACTER DCA TMP1 /AND STORE IT JMP I NUCHAR /--RETURN-- ENDA=SRCBUF-1 ATSIGN, 244 TMP1, 0 TMP2, 0 CNTR, 0 FMATCH, 0 BUFCNT, 0 NEXTPT, 0 CHFND, 1 /MUST BE NONZERO INITIALLY SBUF, ENDA MSCNT, -24 /HANDLER FOR RUBOUT IN SEARCH STRING FORGET, TAD CCR JMS I OUT1 /OUTPUT CARRIAGE RETURN JMP SFIND1+1 *2600 /----------------------------------------------------------------------- /----------------------------------------------------------------------- THISX=COUNTP THISX2=DTEM RELCNT=LPT /GARBAGE COLLECTION ROUTINE /ENTER WITH NUMBER OF LINE TO BE DELETED /IN AC GARBAG, 0 DCA LINPTR /SAVE OBJECT LINE ADDRESS TAD LINPTR DCA AXCOMB /SCAN LINE LOOKING FOR 7715 OR 1500 (CR) IAC /CNT HOLDS DCA CNT /TOTAL # LOCS IN THIS LINE CDF 10 COLECT, ISZ CNT TAD I AXCOMB /GET A WORD TAD K63 SNA /IS IT 7715? JMP FINONE /YES-END OF LINE TAD K6215 SZA CLA /NO-IS IT 1500? JMP COLECT /NO-TRY NEXT WORD FINONE, TAD CNT /YES MINUS CNT GIVES AMOUNT CIA /TO REDUCE CERTAIN POINTERS DCA RELCNT CDF 0 IAC /GO THROUGH LIST OF POINTERS JMS I FIN1 /& OFFSET POINTERS WHICH WILL BE MOVED CDF 10 /MOVED ALONG WITH TEXT GBG2, DCA THISX /SAVE POINTER TAD I THISX /GET ADDRESS OF THIS LINE SNA /DONE WITH STRING? JMP GBGEND /YES JMS CGEPTR /DECREASE POINTER IF NECESSARY DCA I THISX /STORE NEW POINTER TAD THISX2 JMP GBG2 /DO NEXT LINE GBGEND, CDF 0 /ALL POINTERS ARE REDUCED. NOW, CLL CML TAD BUFR /PHYSICALLY MOVE CORE TO CIA /CORRESPOND WITH POINTERS TAD AXCOMB /AXCOMB POINTS TO FIRST LOC. TO GO SMA SNL /POINTERS O.K.? ERROR /NO DCA XCT /YES-SET UP OTHER POINTERS CDF 10 CMA TAD LINPTR DCA AXOUT TAD I AXCOMB /MOVE TEXT DCA I AXOUT ISZ XCT /ALL TEXT MOVED? JMP .-3 /NO-CONTINUE MOVING CDF 0 /YES TAD AXOUT DCA BUFR /RESET TOP OF BUFFER TAD BUFR /REDUCE AXIN FOR CHARACTER SEARCH DCA AXIN TAD THIS /NOW DECREASE THIS IF IT IS NECESSARY JMS CGEPTR DCA THIS JMP I GARBAG /--RETURN-- LINPTR, 0 K63, 63 CGEPTR, 0 /THIS ROUTINE DETERMINES IF THE DCA THISX2 /OF THE AC MUST BE DECREASED BY RELCNT. CLL /IF THISX2 IS GREATER THAN LINPTR TAD THISX2 /DECREASE THISX2 BY RELCNT. CIA TAD LINPTR /THIS EFFECTIVELY DECREASE ALL POINTERS SNL CLA /WHICH HAVE TO BE RELOCATED TAD RELCNT TAD THISX2 JMP I CGEPTR /HANDLER FOR V COMMAND VIEW, TAD (LPT /SET UP LISTER TO EXIT TO LPT DCA OUTDEV ISZ TABIND JMS I LIS /LIST BUFFER TAD C214 /AND OUTPUT A FORM FEED JMS I OUTDEV JMP I TE1 /*RETURN TO COMMAND MODE* /LINE PRINTER OUTPUT ROUTINE /ENTER WITH CHARACTER IN AC /EXIT WITH AC CLEAR LPT, 0 6666 /LLS 6661 /LSF JMP .-1 CLA JMP I LPT /--RETURN-- /HANDLER FOR , FIRS, TAD ARG2 JMP I ONUM K6215, 6215 /THE FOLLOWING GIVES ERROR MESSAGES FOR I/O RELATED ERRORS /EACH IS A FATAL ERROR AND WILL ALWAYS EXIT THROUGH /7600, SAVING THE TEXT BUFFER. /N IS THE ERROR IDENTIFICATION CODE /N=0=> FAILED IN READING DEVICE /N=1=> FATAL WRITE ERROR /N=2=> FILE CLOSE ERROR /N=3=> FILE OPEN ERROR /N=4=> DEVICE HANDLER ERROR SERR4, IAC SERR3, IAC SERR2, IAC SERR1, IAC SERR0, DCA TEMPO TLS TSF JMP .-1 TAD C215 JMS I OUTL1 /OUTPUT CARRIAGE RETURN TAD CLF JMS I OUTL1 /OUTPUT LINE FEED TAD C277 JMS I OUTL1 /OUTPUT? TAD TEMPO TAD P260 JMS I OUTL1 /SEND ERROR CODE TAD C303 JMS I UPAROI /SEND ^C JMP I MONITO /****EXIT TO MONITOR**** P260, 260 C303, 303 DELE, JMS I DELT /DELETE THE LINES TSF JMP .-1 JMP I TE1 CTRLN, TAD C316 JMS I UPAROI /ECHO ^N JMP I .+1 OUTX+1 C316, 316 / PATCH1, 0 CIF 10 JMS I OCLSE /CLOSE FILE SKP JMP I PATCH1 /FILE CLOSED OK -RETURN SPA CLA JMP SERR2 /**FILE CLOSE FAILED**2* JMP I NOROOM /RAN OUT OF SPACE WHILE CLOSING / NOROOM, ERWT+2 OCLSE, OCLOSE / /12D PATCH EPATCH, DCA TABIND JMP I .+1 PUNCH / /*********************************************************************** /THE CODE AT 3000 IS ONCE ONLY CODE. IT TAKES THE FIELD 1 /PART OF THE CODE WHICH IS INITIALLY IN FIELD 0 AND MOVES /IT UP TO THE PROPER LOCATIONS IN FIELD 1. *3000 /----------------------------------------------------------------------- /----------------------------------------------------------------------- INIT, TAD (3177 /COLD LOAD STARTS AT 3200 DCA AXIN TAD (6577 /CODE SHOULD BE IN 6600 OF FIELD 1 DCA AXOUT TAD (7000 /MOVE 1000 LOCATIONS UP DCA COUNTA LOOP, CDF 0 TAD I AXIN /MOVE CODE CDF 10 DCA I AXOUT ISZ COUNTA /DONE YET? JMP LOOP /NO DCA AXIN /YES-RESET COUNTERS DCA AXOUT CDF 0 /PUT A NOP INTO LOC. 203 TAD (NOP DCA I (START TAD RST3I /CHANGE START ADDRESS TO SAVE BUFFER DCA 177 CIF CDF 10 JMP I K6600 /STARTING ADDRESS IS 16600 K6600, 6600 /FIELD 1 STARTING ADDRESS COUNTA, 0 /ERR5, CDF 0 /SET NOT RESTARTABLE BIT IF CHAIN / TAD I (1000 / TAD I (7746 / DCA I (7746 / JMP I (SERR5 /AND GIVE ?5^C /MISCELLANEOUS PATCHES (NOT ONCE-ONLY!) /ESCAPE PATCH 25-MAY-77 DS ESCPA, 0 ISZ ESCPA /SKIP OVER PATCH ADDR TAD ECHOSW /IS ECHO SUPPRESSED? SNA CLA JMP I ESCPA /YES, RETURN TAD CHAR /NO, TEST FOR ESC TAD (-233) SNA CLA /V12 JMP .+3 /V12 ISZ ESCPA /PRINT UNLESS IT IS ESC JMP I ESCPA TAD I CHI1 /V12 - TAD CHIN TAD (-CMCHK-1 SZA CLA /COMMAND MODE? ISZ ESCPA /NO, OUTPUT IT JMP I ESCPA /YES, DON'T OUTPUT IT NOW /V12 /SCOPE PATCH 25-MAY-77 DS RUBPA, 0 ISZ RUBPA /SKIP OVER PATCH ADDR CDF 10 /LOOK AT "SCOPE" BIT IN TAD I (7726) /RESIDENT MONITOR CDF 00 AND (200) SZA CLA JMP RP1 TAD SPLAT /NO SCOPE, PRINT BACKSLASH RP2, JMS I OUT1 /PRINT JMP I RUBPA /DONE, DELETE THE CHAR RP1, TAD (210) /SCOPE, PRINT BACK SPACE JMS I OUT1 TAD (240) /THEN A SPACE JMS I OUT1 TAD (210) /THEN ANOTHER BACK SPACE JMP RP2 SPLAT, 334 /ACKNOWLEDGE RUBOUT /ROUTINE TO HANDLE ESCAPE OUTPUT /V12 - 27-JUN-77 ES ESCOUT, TAD OUTDEV TAD (-OUTL SZA TAD (OUTL-LPT SZA CLA /OUTPUT TO TERMINAL OR LINEPRINTER? TAD (233-"$ /NO, OUTPUT ESC TAD ("$ /YES, OUTPUT "$" JMP OUTX /DO IT /MORE STUFF MAY BE INSERTED HERE /LITERALS PAGE *3200 /******************************************************************** /CODE MOVED TO 16600-16762 NOPUNC *6600 ENPUNC /OURECS=4 /SETUP FOR USING GENERAL INPUT, OUTPUT ROUTINES INBUF=4200 /INPUT BUFFER AT 04200 INCTL=0600 /INPUT CONTROL - 6 PAGES INRECS=3 /3 RECORDS INTO FIELD 0 INDEVH=3200 /INPUT HANDLER AT 03200 OUBUF=5600 /OUTPUT BUFFER AT 05600 OUCTL=5000 /OUTPUT CONTROL - 8 PAGES OUDEVH=3600 /OUTPUT HANDLER AT 03600 MPARAM=7643 /OPTION SWITCHES JMS I L7700 /CALL USER SERVICE ROUTINES 10 /*LOCK USR IN CORE* CDF 0 /V3 ISZ I PTEMP /V3 WERE WE CHAINED TO? JMP CHN /V3 YES CDF 10 /V3 NO START1, JMS I L200 /CALL USER SERVICE ROUTINES 5 /*COMMAND DECODER* 0 CHN, CDF 10 TAD K7620 /RESET OUTDMP DCA I THOLE TAD I P7600A /OUTPUT LIST AND C17 SZCL, SZA CLA /IS THERE AN OUTPUT DEVICE? JMP NXTOP /YES CDF 0 /NO-DISALLOW E COMMAND ISZ I EKILSW CDF 10 NXTOP, TAD I PARAM RAL /B BIT TO BIT 0 DCA DVHAND /SAVE PARAM. SWITCH TAD DVHAND SMA CLA /WAS /B OPTION SPECIFIED? JMP NEWOP /NO P7600A, 7600 /YES- TAD SZCL /SET UP TO CONVERT SPACES TO TABS CDF 0 DCA I SPCP1 CDF 10 NEWOP, TAD DVHAND RTL SMA CLA /WAS /D OPTION SPECIFIED? JMP FILOP /NO TAD I OHANDL /YES-HANDLER BROUGHT IN FOR D OPTION DCA DVHAND TAD I P7600A /DEVICE NUMBER JMS I L200 /CALL USER SERVICE ROUTINES 1 /*ASSIGN* DVHAND, 0 JMP ISERR4 /**DEVICE HANDLER ERROR**4** TAD I P7600A /GET DEVICE NUMBER JMS I L200 /CALL USER SERVICE ROUTINES 4 /*CLOSE* 7601 0 JLSTN, LSTN /PAGE ZERO. 'AND' SOME ADDRESS FILOP, TAD PANIC /PANIC CASE? SNA JMS I IOPENI /SET BUFFER POINTERS OR RESTORE HANDLER SZA CLA /YES- JMP GINDVH /RESTORE INPUT DEVICE HANDLER IN PANIC MODE PANOPN, JMS I OOPENI /OPEN OUTPUT FILES SMA CLA /ERROR RETURN SKP /NORMAL RETURN JMP ISERR3 /**FILE OPEN ERROR**3** TAD PANIC /PANIC CASE? SNA CLA JMP NOPAN /NO TAD I P7600A /YES IF NO OUTPUT,DON'T ALLOW HIM SNA CLA /TO DESTROY HIS TEXT JMP START1 TAD K5000 /SET TO WRITE BUFFER JMS I ODMP /DUMP IT JMP ISERR1 /**FATAL WRITE ERROR**1** CLA IAC NOPAN, DCA DVHAND DCA PANIC /CLEAR PANIC SWITCH JMS I L200 /CALL USER SERVICE ROUTINES 11 /*DISMISS USR FROM CORE* JMS I OUSTPI /RE-INITIALIZE OUTPUT POINTERS CLA IAC JMS I SETJSI CDF 0 /IF LSTN#0, CLEAR FRST TAD I JLSTN /BUT IN FIELD 1 SNA CLA DCA FRST CIF CDF 0 TAD DVHAND SNA CLA /PANIC MODE? JMP I STRTUP /NO-START THE EDITOR TLS JMP I .+1 /YES - RESUME OUTPUT BUFRET GINDVH, CDF CIF 0 JMP I .+1 PIASGN ISERR3, JMS I L200 /CALL USER SERVICE ROUTINES 11 /*DISMISS USR FROM CORE* CIF CDF 0 JMP I ASERR3 /**FILE OPEN ERROR**3** ISERR4, JMS I L200 /CALL USER SERVICE ROUTINES 11 /*DISMISS USR FROM CORE* CIF CDF 0 JMP I ASERR4 /**DEVICE HANDLER ERROR**4** ISERR1, JMS I L200 /CALL USER SERVICE ROUTINES 11 /*DISMISS USR FROM CORE* CIF CDF 0 JMP I ASERR1 /**FATAL WRITE ERROR**1** SETJSI, SETJSB L200, 200 STRTUP, START PANIC, 0 SPCP1, SPACES+1 IOPENI, IOPEN OOPENI, OOPEN EKILSW, EKILLL ODMP, OUTDMP OHANDL, O1 C17, 17 PARAM, MPARAM L7700, 7700 ASERR1, SERR1 ASERR3, SERR3 ASERR4, SERR4 K5000, 5000 /OUTPUT BUFF CONTROL WORD OUSTPI, OUSETP THOLE, TSTHOL K7620, 7620 PTEMP, TEMP /*********************************************************************** *3400 /*********************************************************************** /CODE MOVED TO 17000-17173 NOPUNC *7000 ENPUNC 232 /THIS PAGE IS ^Z BUFFER /SET UP ROUTINE FOR OUTPUT /INITIALIZES CHARACTERS POINTERS OUSETP, 0 TAD I PANICJ /IS IT PANIC DUMP TIME? SZA CLA /IF YES, DONT RESET POINTERS JMP I OUSETP /--RETURN-- TAD C1 /GET SIZE OF BUFFER IN DOUBLEWORDS CIA /NEGATE IT DCA OUDWCT TAD C2 DCA OUPTR /INITIALIZE WORD POINTER TAD OUJMPE DCA OUJMP /INITIALIZE THREE-WAY CHARACTER SWITCH JMP I OUSETP /--RETURN-- /OUTPUT A CHARACTER /ENTER WITH CHARACTER IN 8-BIT ASCII /IN AC OCHAR, 0 AND C377 /MASK OUT EXTRA BITS DCA OUTEMP KRS TAD M203 SNA CLA KSF JMP .+3 CIF CDF 0 JMP I C7600 RDF /NO- TAD CDIF0 DCA OUCRET TAD OUTINH /IS OUTPUT INHIBITED? SZA CLA JMP PSTOP /NO CDF OUFLD /YES-SET DATA FIELD TO BUFFER'S FIELD ISZ OUJMP /BUMP THE CHARACTER SWITCH OUJMP, HLT /3 WAY CHARACTER SWITCH JMP OCHAR1 JMP OCHAR2 OCHAR3, TAD OUTEMP CLL RTL RTL AND K7400 TAD I OUPOLD DCA I OUPOLD /UPDATE FIRST WORD OF TWO WITH HIGH /ORDER 4 BITS OF 3RD CHAR TAD OUTEMP CLL RTR RTR RAR AND K7400 TAD I OUPTR DCA I OUPTR /UPDATE SECOND WORD FROM LOW ORDER 4 BITS TAD OUJMPE DCA OUJMP /RESET SWITCH ISZ OUPTR ISZ OUDWCT /BUMP DOUBLEWORD COUNTER EVERY 3 CHARS JMP OUCOMN TAD OUCT /LOAD CONTROL WORD FOR A FULL WRITE JMS I DMPO /DUMP THE BUFFER JMP OUCRET /OUTPUT ERROR - GIVE ERROR RETURN JMS OUSETP /RE-INITIALIZE THE POINTERS JMP OUCOMN OCHAR2, TAD OUPTR DCA OUPOLD /SAVE POINTER TO FIRST WORD OF TWO ISZ OUPTR /BUMP WORD POINTER TO SECOND WORD OCHAR1, TAD OUTEMP DCA I OUPTR OUCOMN, ISZ OCHAR OUCRET, HLT /RESTORE CALLING FIELDS JMP I OCHAR /--RETURN-- OUTEMP, 0 OUPOLD, 0 OUPTR, 0 OUJMPE, JMP OUJMP OUDWCT, 0 OUTINH, 0 /FETCH OUTPUT DEVICE CONTROL WORD OTYPE, 0 RDF TAD CDIF0 DCA OTRTN CDF 10 TAD I C7600 /FETCH OUTPUT DEVICE NUMBER AND P17 TAD DCBM1 /+DCB-1 DCA OUTEMP /FETCH DEVICE CONTROL WORD TAD I OUTEMP OTRTN, HLT /RESTORE CALLING FIELDS JMP I OTYPE /--RETURN-- PSTOP, CIF 0 /PRINTS ? WHEN NO OUTPUT DEV ERROR INSET, 0 DCA OTYPE /SAVE AC RDF TAD CDIF0 DCA INSTRT /SET RETURN FIELDS CDF 0 TAD I PLASTN CDF 10 SNA CLA /IS THERE ANYTHING IN BUFFER? IAC /NO-NO NEED TO SAVE USR AREA JMS SETJSB /YES- TAD OTYPE /RESTORE AC INSTRT, CIF CDF 0 /RESTORE CALLING FIELDS JMP I INSET /--RETURN-- /SET JOB STATUS BIT 11 TO SAVE OR NOT SAVE /ENTER WITH AC=0 OR 1, DEPENDING ON BUFFER SETJSB, 0 DCA JSBTM /SAVE AC CDF 0 CLA CLL CMA RAL AND I PJSBTS /CLEAR BIT 11 OF JSW TAD JSBTM /SET ACCORDING TO AC DCA I PJSBTS CDF 10 JMP I SETJSB /--RETURN-- JSBTM, 0 PJSBTS, 7746 PLASTN, LSTN DCB=7760 C1, OUCTL&3700 C2, OUBUF C377, 377 M203, -203 CDIF0, CDF CIF 0 K7400, 7400 OUCT, OUCTL C7600, 7600 P17, 17 DCBM1, DCB-1 DMPO, OUTDMP PANICJ, PANIC /*********************************************************************** *3600 /*********************************************************************** /CODE MOVED TO 17200-17376 NOPUNC *7200 ENPUNC /OPEN OUTPUT FILE O17, 17 OOPEN, 0 OU7600, 7600 TAD OU7601 DCA OUBLK TAD O1 DCA OUHNDL /SET OUTPUT HANDLER ENTRY CDF 10 TAD I OU7600 /GET DEVICE NUMBER WORD OF OUTPUT FILE ENTRY SNA /IS THERE AN OUTPUT DEVICE? JMP ONOFIL /NO - INHIBIT OUTPUT JMS I O200 /CALL USER SERVICE ROUTINES 1 /*ASSIGN,FETCH HANDLER* OUHNDL, 2600 /OUTPUT DEVICE HANDLER ENTRY JMP I SERR4A /**DEVICE HANDLER ERROR**4** OUENTR, TAD I OU7600 JMS I O200 /CALL USER SERVICE ROUTINES 3 /*ENTER OUTPUT FILE* OUBLK, 7601 /REPLACED WITH STARTING BLOCK OUELEN, 0 /REPLACED WITH LENGTH OF HOLE JMP OEFAIL /FAILED - MAYBE WE ASKED TOO MUCH DCA OUCCNT DCA I O2 /ZERO OUTPUT INHIBIT FLAG TAD OUBLK DCA OUREC /INITIALIZE OUTPUT RECORD NUMBER JMS I O3 ISZ OOPEN OORETN, JMP I OOPEN OEFAIL, TAD I OU7600 AND O7760 /GET REQUESTED LENGTH SNA CLA /WAS IT AN INDEFINITE REQUEST JMP ONTERR /YES - CANNOT ENTER THE FILE TAD I OU7600 O200, AND O17 /MAKE THE REQUESTED LENGTH ZERO DCA I OU7600 JMP OUENTR /TRY, TRY AGAIN ONTERR, CLA CLL CML RAR /AC=2 JMP OORETN /TAKE THE ERROR RETURN WITH AC<0 ONOFIL, ISZ I O2 JMP OORETN /TAKE THE ERROR RETURN WITH AC=0 OUTDMP, 0 DCA OUCTLW /STORE THE CONTROL WORD JMS OUNREC /COMPUTE NO. OF RECORDS TAD OUCCNT DCA OUCCNT TAD OUCCNT CLL CML TAD OUELEN TSTHOL, SNL CLA /IF ZERO OR POSITIVE,GIVE ERROR JMP OUERR CDF CIF 0 CDF 10 JMS I OUHNDL /CALL OUTPUT DEVICE HANDLER OUCTLW, 0 /CONTROL WORD OUBUF /BUFFER ADDRESS OUREC, 0 /RECORD NUMBER JMP OUERR /THERE ARE NO SOFT OUTPUT HANDLER ERRORS JMS OUNREC TAD OUREC DCA OUREC /UPDATE OUTPUT RECORD NUMBER ISZ OUTDMP /BUMP OUTDMP TO NORMAL RETURN OUERR, JMP I OUTDMP /--RETURN-- /CLOSE OUTPUT FILE OCLOSE, 0 TAD K7660 /SET UP SNL SZA CLA FOR CLOSE DCA TSTHOL CDF 10 TAD I PANICC SZA CLA JMP NODUMP TAD I O2 SZA CLA /IS OUTPUT INHIBITED? JMP OCISZ /YES - CLOSE IS A NOP TAD O232 /OUTPUT A ^Z JMS I O4 JMP OCRET /AND SOME 0'S JMS I O4 JMP OCRET FILLLP, JMS I O4 JMP OCRET JMS I O5 /GET TYPE OF OUTPUT DEVICE SPA CLA TAD O100 /IF ITS A DIRECTORY DEVICE FORCE A RECORD TAD O77 /BOUNDARY-OTHERWISE HALF RECORD AND I O6 SZA CLA /UP TO THE BOUNDARY YET? JMP FILLLP /NO - FILL WITH ZEROS TAD I O6 /GET DOUBLEWORD COUNT LEFT TAD O7 SNA /A FULL WRITE LEFT? JMP NODUMP /YES - DON'T DO IT - ^Z IS ALREADY OUT TAD O8 /PUT IN FIELD BITS AND WRITE BIT JMS OUTDMP JMP OCRET /ERROR OCCURRED WHILE DUMPING THE BUFFER NODUMP, JMS I O7700 /CALL USER SERVICE ROUTINES 10 /*LOCK USR IN CORE* TAD I OU7600 /DEVICE NUMBER JMS I O200 /CALL USER SERVICE ROUTINES 4 /*CLOSE OUTPUT FILE* OU7601, 7601 /POINTER TO THE OUTPUT FILE NAME OUCCNT, 0 SKP /ERROR WHILE CLOSING THE FILE OCISZ, ISZ OCLOSE OCRET, CIF CDF 0 /RESTORE CALLING FIELDS JMP I OCLOSE /--RETURN-- PANICC, PANIC /CONVERT OUTPUT CONTROL WORD /TO NUMBER OF RECORDS OUNREC, 0 TAD OUCTLW CLL RTL RTL RTL AND O17 JMP I OUNREC /--RETURN-- K7660, SNL SZA CLA O1, OUDEVH+1 O7700, 7700 O2, OUTINH O3, OUSETP O7760, 7760 O232, 232 O4, OCHAR O5, OTYPE O100, 100 O77, 77 O6, OUDWCT O7, OUCTL&3700 O8, 4000+OUFLD SERR4A, ISERR4 /*********************************************************************** INFLD=INCTL&70 /FIELD OF INPUT BUFFER OUFLD=OUCTL&70 /FIELD OF OUTPUT BUFFER /*********************************************************************** /CODE MOVED TO 17400 -17574 *4000 NOPUNC *7400 ENPUNC /PREPARE TO OPEN NEW INPUT FILE IN7400, 7400 IOPEN, 0 CLA CMA DCA INCHCT /SET INCHCT TO FORCE A READ ISZ INEOF /SET END-OF-FILE FLAG TO FORCE A NEW FILE TAD I7617 DCA INFPTR /RESET FILE POINTER JMP I IOPEN /--RETURN-- INPTR, 0 INDEV, 0 /INPUT A CHARACTER ICHAR, 0 IN7600, 7600 INCHAR, CDF INFLD ISZ INJMP /BUMP THREE-WAY UNPACK SWITCH ISZ INCHCT INJMPP, JMP INJMP TAD INEOF SNA CLA /DID LAST READ YIELD END-OF-FILE? JMP INGBUF /NO-DO ANOTHER INNEWF, CDF 10 TAD I1 DCA INHNDL /INITIALIZE HANDLER ADDRESS TAD I INFPTR /GET NEXT CD INPUT FILE ENTRY DCA INDEV /SAVE IT FOR PANIC TAD INDEV SNA /ANY MORE? JMP EOFERR /NO - OUT OF INPUT JMS I PINSET /YES-SAVE BUFFER IF NECESSARY JMS I I7700 /CALL USER SERVICE ROUTINE 1 /*ASSIGN, FETCH HANDLER* INHNDL, 0 JMP I SERR4B /**DEVICE HANDLER ERROR**+** TAD I INFPTR AND I7760 /GET LENGTH PART OF WORD SZA /LENGTH OF 0 MEANS LENGTH >=256 TAD I17 /ADD HIGH ORDER BITS CLL CML RTR RTR DCA INCTR /STORE LENGTH OF FILE ISZ INFPTR TAD I INFPTR DCA INREC /STORE STARTING RECORD NUMBER OF FILE ISZ INFPTR DCA INEOF /ZERO END-OF-FILE FLAG INGBUF, TAD INCTR CLL TAD I2 SNL DCA INCTR /RESTORE INCTR IF IT HASN'T OVERFLOWED SZL /IS THIS THE LAST READ? ISZ INEOF /YES - SET END-OF-FILE FLAG CLL CML CMA RTR /CONSTRUCT A CONTROL WORD FOR THE READ RTR /FROM THE AMOUNT OF THE OVERFLOW RTR /(IF ANY) AND THE STANDARD CONTROL WORD TAD I3 DCA INCTLW CDF CIF 0 CDF 10 JMS I INHNDL /CALL INPUT DEVICE HANDLER INCTLW, 0 /CONTROL WORD INBUFP, INBUF /INPUT BUFFER INREC, 0 /NUMBER OF RECORDS JMP INERRX /SOME KIND OF HANDLER ERROR INBREC, TAD INREC TAD I2 DCA INREC /UPDATE THE RECORD NUMBER TAD INCTLW AND IN7600 CLL RAL TAD INCTLW AND IN7600 CMA DCA INCHCT /COMPUTE THE NEW CHARACTER COUNT TAD INJMPP DCA INJMP /RESET THE CHARACTER SWITCH TAD INBUFP DCA INPTR /AND THE WORD POINTER JMP INCHAR /GO BACK AND MAKE BELIEVE THIS NEVER HAPPENED INERRX, ISZ INEOF /EITHER AN END-OF-FILE OR A ERROR SMA CLA /WHICH TYPE WAS IT? JMP INBREC /END OF FILE - RESUME PROCESSING INERR, CLA CLL CML RAR /BAD - GIVE ERROR RETURN WITH NEGATIVE AC EOFERR, JMP INRTRN INJMP, HLT /3 WAY CHARACTER SWITCH JMP ICHAR1 JMP ICHAR2 ICHAR3, TAD INJMPP DCA INJMP TAD I INPTR AND IN7400 CLL RTR RTR /COMBINE THE HIGH-ORDER FOUR BITS OF TAD INCTLW RTR /THE TWO WORD TO FORM THE THIRD CHARACTER RTR ISZ INPTR JMP INCOMN ICHAR2, TAD I INPTR AND IN7400 DCA INCTLW /SAVE THE HIGH-ORDER BITS FOR THE THIRD CHAR ISZ INPTR /BUMP THE WORD POINTER ICHAR1, TAD I INPTR INCOMN, AND I377 TAD IM232 SNA /IS THE CHARACTER A ^Z? JMP INNEWF /YES - GET A NEW FILE TAD I232 /RESTORE THE CHARACTER ISZ ICHAR /BUMP RETURN TO NORMAL RETURN INRTRN, CDF CIF 0 /RESTORE CALLING FIELDS JMP I ICHAR /--RETURN-- INCHCT, -1 INFPTR, 7617 INEOF, 1 INCTR=IOPEN PINSET, INSET I7617, 7617 I1, INDEVH+1 I7760, 7760 I17, 17 I2, INRECS I3, INCTL+1 I377, 377 IM232, -232 I232, 232 I7700, 7700 SERR4B, ISERR4 $ /*********************************************************************** |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 | /EPIC PROGRAM, V5A / / / / / / / // / / / / /COPYRIGHT (C) 1973, 1975, 1977 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /EPIC PROGRAM /COPYRIGHT 1973,1977 /DIGITAL EQUIPMENT CORP. /MAYNARD, MASS.01754 PTAPE=1 *0 VERS, 10 *10 NDX0, 0 NDX1, 0 NDX2, 0 *20 BCC1, 0 BCC2, 0 BLKLEN, 13 BUFFLD, 10 BUFPTR, 0 BYTCNT, 0 CLOC=BYTCNT CHKC, CTRLC CRLF, TYCRLF DATBUF, HDATA DOCRC, CRC EBLKHI, 0 EFLG, -1 EOTFLG, 0 EQBLK, 0 ERCODE, 0 EOLWD=ERCODE FLEN, 0 FNPTR, 0 FRMPTR, 0 MODF=FRMPTR GETCD, DECOD HANADR, 0 IDOFLG, 0 MODB=IDOFLG IMPFLG, 0 INCHR, 0 INPTR, 0 IOERR, PHYSIO LPWT, LPWAIT LSPFLG, 0 MAXCNT, 0 MAXLEN, -MXPBLK MIFLG, 0 M4, -4 NAME, 0 OCNT, 0 OUDEV, 0;0;0 OUTCHR, 0 OUTPTR, 0 PARCHR, 0 MSKWD=PARCHR PARPTR, PARADR PATFLG, 0 P17, 17 P200, 200 RDCHR, 0 SRWD=RDCHR RDPBLK, PREAD RDSWIT, SWITCH RELBLK, HDATA+5 RBLK, 0 SATOL, 0 SBLK, 0 SLPTR, 0 SMTOX, 0 SYTO9, 0 TMP0, 0 TMP1, 0 TMP2, 0 TMP3, 0 TMP4, 0 TNAME, TYPNAM TYDEV, TYPDEV TYPTXT, TTOTXT USR, DOUSR USRDEV, 0 WRCHR, 0 PAGE START, NOP CIF 10 /START OF PROG JMS I (7700 USRIN TAD MAXLEN DCA MAXCNT TLS PLS RFC DECOD, TAD (-PTAP TAD MODE SZA CLA JMP .+4 TAD LSPFLG SZA CLA JMS I LPWT JMS I CRLF TSF JMP .-1 CIF 10 JMS I P200 DECODE 0 TLS /INIT. TTY JMS I (SETDV JMS I (CHKMI CDF 10 TAD I (MTOX CDF 0 CLL RTR RAR SNL JMP NOVERS JMS I CRLF JMS I TYPTXT /IF /V,TYPE VERSION NUMBER VERSON JMS I CRLF NOVERS, TAD (FNAME DCA NAME TAD (7600 /GET NAME DCA NDX0 TAD NAME DCA TMP2 TAD DATBUF DCA TMP3 TAD VERS DCA I TMP3 ISZ TMP3 TAD M4 DCA TMP0 CDF 10 TAD I (YTO9 RAL /CHK /Z SMA CLA JMP .+3 DCA EQBLK DCA EBLKHI TAD I (ATOL AND (20 /H ? SZA CLA FOURK /YES DCA TMP1 CLA CLL CMA RAR /=3777 AND I (7642 /HI EQUALS N TAD TMP1 SZA DCA EBLKHI TAD I (7642 DCA TMP1 TAD I (7646 SZA DCA EQBLK /=N LO ORD TAD I (ATOL DCA SATOL TAD I (YTO9 DCA SYTO9 TAD I (MTOX DCA SMTOX JMS I (DODFN TAD TMP1 SMA CLA JMP GOTMOD TAD (MODTBL-1 /GET NEW MODE DCA TMP1 TAD SYTO9 RAL CLL CML RAL ISZ TMP1 SMA /FOUND IT ? JMP .-3 CLA TAD I TMP1 DCA MODE JMS I CRLF GOTMOD, JMP I MODE MODTBL, PTAP FED COMPAR IFNZRO PTAPE < DECOD > DECOD DECOD DECOD DECOD DECOD DECOD MODE, DECOD VERSON, TEXT "V 5A " 0 PAGE DODFN, 0 TAD I (7601 SZA CLA JMP LOP0 TAD SYTO9 SPA CLA JMP LOP0 ISZ TMP2 ISZ TMP3 ISZ TMP0 JMP .-3 CDF JMP I DODFN LOP0, CDF 10 TAD I NDX0 CDF DCA I TMP2 TAD I TMP2 DCA I TMP3 ISZ TMP2 ISZ TMP3 ISZ TMP0 JMP LOP0 JMP I DODFN HSPRDR, 0 JMS IOWAIT RSF RRB DCA INCHR RFC TAD INCHR JMP I HSPRDR HSPPCH, 0 DCA OUTCHR JMS IOWAIT PSF TAD OUTCHR PLS CLA JMP I HSPPCH LSPRDR, 0 JMS IOWAIT KSF KRB DCA INCHR TAD INCHR JMP I LSPRDR LSPPCH, 0 DCA OUTCHR JMS IOWAIT TSF TAD OUTCHR TLS CLA JMP I LSPPCH IOWAIT, 0 TAD I IOWAIT DCA IOTSKP ISZ IOWAIT TAD IOTSKP RTL RAL AND (700 TAD VERS IOTSKP, 0 JMP .-1 CLA JMP I IOWAIT CTRLC, 0 KSF JMP I CTRLC TAD [200 /FORCE BIT 8 ON KRS TAD (-203 SZA CLA JMP I CTRLC KCC CTRLC0, JMS I CRLF TAD (336 JMS I (LSPPCH TAD (303 JMS I (LSPPCH JMS I CRLF TSF JMP .-1 JMP I .+1 7605 PAGE /HERE FOR SYS:<PTP PTIN, TAD LSPFLG SNA CLA JMP .+4 IAC DCA I (OUTTBL TAD (LSPRDR-HSPRDR TAD (HSPRDR DCA RDCHR TAD I (OUTTBL DCA USRDEV RFC JMS I RDPBLK /GET 1ST PBLK JMS RDERR TAD DATBUF /GET NAME DCA NDX0 TAD NAME DCA TMP1 TAD M4 DCA TMP0 TAD I NDX0 DCA I TMP1 ISZ TMP1 ISZ TMP0 JMP .-4 ISZ NDX0 /BY RELBLK TAD I NDX0 DCA BLKW /FILE LEN TAD PATFLG SZA CLA /RDING A PATCH? TAD (LOOKUP-ENTER TAD (ENTER /ENTER=NO PATCH JMS I USR CLL TAD FLEN TAD BLKW SNA /DOES IT FIT? JMP .+3 SZL CLA JMP NOFIT TAD BLKW DCA FLEN DCA RBLK TAD FLEN CIA DCA FCNT JMS I (ICHKB /SEE IF WE GOT /THE RIGHT BLK LOP3, TAD SBLK /ABS STR BLK TAD I RELBLK DCA BLKW /=BLK TO DO JMS I HANADR 4200 /WRITE 1 BLK BUFADR BLKW, 0 JMP I IOERR ISZ RBLK ISZ FCNT JMP BY3 TAD (CLOSE JMS I USR JMP I GETCD BY3, JMS I RDPBLK SKP JMP LOP3 MTHREE TAD ERCODE /EOT IS ONLY /LEGAL ERROR SNA CLA JMP IFEOT JMS RDERR /RETRY JMP LOP3-1 IFEOT, TAD PATFLG SZA CLA JMP I GETCD /PATCH MODE /TERMS ON EOT JMS I TYPTXT EOTMSG JMS I TYPTXT NTMSG JMS I CRLF CLA CMA JMS I LPWT JMS I RDPBLK JMS RDERR JMP LOP3-1 RDERR, 0 MTWO DCA ERCNT LOP4, TAD ERCODE TAD (AMSG DCA TMP0 TAD I TMP0 DCA .+2 JMS I TYPTXT 0 JMS I CRLF CLA CMA JMS I LPWT JMS I RDCHR CLA JMS I RDPBLK SKP JMP I RDERR ISZ ERCNT JMP LOP4 JMP I IOERR ERCNT, 0 FCNT, 0 NOFIT, TAD (16 JMS I TYDEV TAD NAME JMS I TNAME JMS I TYPTXT BIGMSG TAD USRDEV JMS I TYDEV JMP I GETCD PAGE PTAP, JMS I RDSWIT PSTBL TAD I NAME SNA CLA JMP I (PTIN /PTAP INPUT TAD I (OUTTBL DCA USRDEV TAD LSPFLG SNA CLA TAD (HSPPCH-LSPPCH TAD (LSPPCH DCA WRCHR PLS TAD (LOOKUP JMS I USR TAD PATFLG SNA CLA /PUNCH PATCH ? JMP NOPAT CLL TAD EQBLK /CHK FOR =N TAD FLEN /OUT OF RANGE SNL CLA /? JMP .+4 JMS I TYPTXT BEQMSG JMP I GETCD TAD EQBLK NOPAT, DCA TMP0 TAD TMP0 TAD SBLK DCA BLKR /1ST BLK TO PCH TAD TMP0 /PUT REL BLK DCA I TMP3 /IN HDR TAD FLEN CIA /=FILE LEN ISZ TMP3 DCA I TMP3 ISZ TMP3 DCA I TMP3 /0 TO LST HDR /WORD TAD PATFLG /ONLY 1 BLK SZA /PATCHES AT A DCA FLEN /TIME TAD LSPFLG SNA CLA JMP .+3 LOP2, CLA CMA JMS I LPWT /ON PUNCH TAD MAXLEN CIA TAD MAXCNT SZA CLA /PCH L/T ? JMP .+3 /NO JMS WLT JMS WLT LOP1, JMS I HANADR /READ 1 BLK 200 /OF FILE BUFADR BLKR, 0 JMP I IOERR ISZ BLKR JMS I (PWRITE ISZ I RELBLK ISZ FLEN JMP BYDUN TAD EOTFLG SNA CLA /PCH EOT ? JMS EOT /YES JMP I GETCD BYDUN, ISZ MAXCNT JMP LOP1 JMS EOT /PHYSICAL END /OF PTP TAD LSPFLG SZA CLA JMS I LPWT JMS I TYPTXT EOTMSG JMS I CRLF JMP LOP2 /NEXT PTP WLT, 0 TAD LTCNT DCA TMP0 TAD P200 JMS I WRCHR JMS I CHKC ISZ TMP0 JMP .-4 JMP I WLT LTCNT, -LTLEN EOT, 0 TAD (377 JMS I WRCHR JMS WLT JMS WLT JMS WLT TAD MAXLEN DCA MAXCNT JMP I EOT PAGE PREAD, 0 /READ A PTP BLK JMS I RDCHR SNA JMP PREAD+1 /ITS L/T TAD (-200 SNA JMP PREAD+1 /L/T RAR CLL /201 PCH MUST SNA CLA /SEPARATE L/T /AND DATA JMP ONBLK TAD (-377 /ONLY OTHER TAD INCHR /POSSIBILTY IS SNA CLA /END OF PTP IAC /EOT CODE IAC /L/T ERR BYTERR, IAC BLKERR, DCA ERCODE JMP I PREAD /P+1=ERR RTN ONBLK, JMS I (ISETB DCA PARFLG JMS GETBYT ISZ BYTCNT JMP .-2 JMS I RDCHR CIA TAD BCC1 SZA CLA JMP BLKERR JMS I RDCHR CIA TAD BCC2 SZA CLA JMP BLKERR TAD PARFLG SPA CLA JMP BYTERR ISZ PREAD /GOOD BLK JMP BLKERR+1 GETBYT, 0 TAD LSPFLG SNA CLA JMS I CHKC DCA PARCHR TAD M4 DCA CNTR0 LOP6, MTHREE DCA CNTR1 LOP5, JMS I RDCHR DCA I FRMPTR ISZ FRMPTR TAD INCHR JMS I DOCRC ISZ CNTR1 JMP LOP5 MTHREE TAD FRMPTR DCA FRMPTR JMS PACK ISZ CNTR0 JMP LOP6 JMS I RDCHR JMS I DOCRC TAD INCHR CIA TAD PARCHR SNA CLA JMP NOPAR CLA CMA DCA PARFLG TAD ABORT SPA CLA JMP BYTERR FOURK NOPAR, TAD INCHR DCA I PARPTR ISZ PARPTR JMP I GETBYT /HERE TO PACK 3 8 BIT FRAMES INTO /2 12 BIT WORDS PACK, 0 TAD I FRMPTR RTL CLL RAL /1ST FRM TO DCA I BUFPTR /B1-B8 ISZ FRMPTR TAD I FRMPTR /PUT HI HALF OF RTR CLL /2ND FRM INTO RTR /B9-B11 AND LNK RAR DCA HOLDW2 TAD HOLDW2 /PUT 1ST FRM IN AND (7 /B0-B7,AND PUT TAD I BUFPTR /HI HALF OF 2ND RAL /IN B8-B11 DCA I BUFPTR /YOU AINT SEEN TAD I BUFPTR /NOTHING YET. JMS I (DOPAR TAD HOLDW2 /LO HAF OF 2ND AND (7400 /FRM IS IN ISZ FRMPTR /B0-B3. PUT TAD I FRMPTR /WITH 3RD FRM ISZ BUFPTR DCA I BUFPTR TAD I BUFPTR JMS I (DOPAR ISZ FRMPTR ISZ BUFPTR JMP I PACK PARFLG, 0 CNTR0, 0 CNTR1, 0 ABORT, -1 HOLDW2, 0 PAGE PWRITE, 0 /HERE TO WRITE /1 BLK OF PTP JMS ISETB JMS I (WLT TAD (201 /START OF DATA /BLK CHAR JMS I WRCHR JMS PUTBYT ISZ BYTCNT JMP .-2 TAD BCC1 JMS I WRCHR TAD BCC2 JMS I WRCHR JMP I PWRITE ISETB, 0 TAD (FRMADR DCA FRMPTR TAD (PARADR DCA PARPTR TAD DATBUF DCA BUFPTR DCA BCC1 DCA BCC2 TAD (-NBYTS DCA BYTCNT JMP I ISETB LPWAIT, 0 HLT RFC CLA JMP I LPWAIT PUTBYT, 0 DCA PARCHR TAD M4 DCA CNTR2 LOP7, TAD I BUFPTR JMS DOPAR TAD I BUFPTR /PUT 2 WORDS IN RTR CLL /3 8 BIT FRMS RTR DCA F2 TAD F2 /B0-B7 OF 1ST AND (377 /FOR FRM 1 DCA F1 TAD F2 /LO 4 BITS OF RAR /WORD 1 AND (7400 /TO B0-B3 OF DCA F2 /FRM 2 TAD F1 JMS I WRCHR TAD F1 JMS I DOCRC ISZ BUFPTR TAD I BUFPTR JMS DOPAR TAD I BUFPTR /PUT B0-B3 AND (7400 /OF WD2 RTR CLL /INTO B4-B8 RTR TAD F2 /NOW PUT LO 4 RTR /BITS OF WD1 RTR /(B0-B3) AND HI /4 BITS OF W2 /INTO B4-B11 JMS I WRCHR TAD OUTCHR /=CHR JST PCHED JMS I DOCRC TAD I BUFPTR AND (377 /LO 8 OF 2ND JMS I WRCHR TAD OUTCHR /=F3 JMS I DOCRC ISZ BUFPTR ISZ CNTR2 JMP LOP7 TAD PARCHR JMS I WRCHR TAD PARCHR JMS I DOCRC JMS I CHKC JMP I PUTBYT CNTR2, 0 F2, 0 F1, 0 /HERE TO COMPUTE PARITY (EVEN ODD) /12 BIT WORD IS IN AC. /AFTER EACH (SPA,CML,RAR) SEQUENCE /AC B0=0 IF THE /NUMBER OF ALREADY PROCESSED 1 /STATE BITS IS EVEN. OTHERWISE AC B0=1. DOPAR, 0 DCA TMP0 TAD (-13 /-13 BECAUSE 2 /BITS ARE /PROCESSED /INITIALLY DCA TMP1 TAD TMP0 RTR /LNK HOLDS /NEWBIT,AC B0 /HOLDS STATUS /TO DATE. SPA /CHNG FROM ODD /TO EVEN ? CML /YES CHANGE /STATUS RAR /GET NXT ISZ TMP1 /DONE ? JMP .-4 /NO CMA RAL /SET LNK=1=EVEN CLA /LNK=0=ODD TAD PARCHR /UPDATE PARITY RAL DCA PARCHR JMP I DOPAR PAGE TTOTXT, 0 TAD I TTOTXT DCA TMP0 ISZ TTOTXT LOP8, TAD I TMP0 RTR RTR RTR JMS DOHAF JMP I TTOTXT TAD I TMP0 JMS DOHAF JMP I TTOTXT ISZ TMP0 JMP LOP8 DOHAF, 0 AND (77 SNA JMP I DOHAF ISZ DOHAF TAD (-40 SPA TAD (100 TAD (240 JMS I (LSPPCH JMP I DOHAF TYCRLF, 0 TAD (215 JMS I (LSPPCH TAD (212 JMS I (LSPPCH JMP I TYCRLF PHYSIO, JMS I TYPTXT IOMSG JMP I GETCD TYPNAM, 0 DCA TMP2 TAD TMP2 DCA TMP0 MTHREE DCA TMP1 LOP9, TAD I TMP0 RTR RTR RTR JMS DOHAF JMP DOEXT TAD I TMP0 JMS DOHAF JMP DOEXT ISZ TMP0 ISZ TMP1 JMP LOP9 DOEXT, TAD P3 TAD TMP2 DCA TMP0 TAD I TMP0 SNA CLA JMP P3+1 TAD P256 /. JMS I (LSPPCH TAD I TMP0 RTR RTR RTR JMS DOHAF P256, 256 TAD I TMP0 JMS DOHAF P3, 3 TAD (240 JMS I (LSPPCH JMP I TYPNAM OCTOUT, 0 RAL DCA TMP0 TAD M4 DCA TMP1 LOP11, TAD TMP0 RTL RAL DCA TMP0 RAL DCA TMP2 TAD TMP0 AND (7 TAD (260 JMS I (LSPPCH TAD TMP2 RAR CLL ISZ TMP1 JMP LOP11 TAD (240 JMS I (LSPPCH JMP I OCTOUT PAGE /HERE TO SEE IF WE READ THE CORRECT /BLK OF THE CORRECT FILE. ICHKB, 0 TAD PATFLG /DONT CHK IF SZA CLA /IN PATCH MODE JMP I ICHKB LOP12, TAD M4 DCA TMP0 TAD LSPFLG SNA CLA JMS I CHKC TAD DATBUF /COMPARE NAMES DCA NDX0 TAD NAME DCA TMP1 LOP10, TAD I NDX0 CIA TAD I TMP1 SZA CLA JMP NAMERR ISZ TMP1 ISZ TMP0 JMP LOP10 TAD RBLK /CHK BLK CIA TAD I RELBLK SNA CLA JMP I ICHKB /GOOD BLK JMS I TYPTXT NMSG TAD RBLK JMS I (OCTOUT JMS I TYPTXT FMSG TAD I RELBLK JMS I (OCTOUT RECHK, JMS I CRLF CLA CMA JMS I LPWT JMS I RDPBLK JMS I (RDERR JMP LOP12 NAMERR, JMS I TYPTXT NMSG TAD NAME JMS I TNAME JMS I TYPTXT FMSG TAD DATBUF IAC JMS I TNAME JMP RECHK /CRC GENERATOR /COURTESY OF MARIO S. ROOT /COUSIN TO MARIO LEONARD CRC, 0 DCA TMP0 TAD (-7 DCA TMP1 TAD TMP0 AND BCC2 CIA CLL RAL TAD TMP0 TAD BCC2 CLL RTR SPA CML RAR ISZ TMP1 JMP .-4 SPA JMP .+4 DCA TMP1 TAD BCC1 JMP .+5 DCA TMP1 TAD BCC1 RAR CML RAL DCA BCC2 TAD TMP1 AND (60 CLL RTL DCA BCC1 TAD BCC1 AND BCC2 CIA CLL RAL TAD BCC1 TAD BCC2 DCA BCC2 TAD TMP1 CLL RTR RTR DCA BCC1 TAD BCC1 CLL RAR CLL RAR DCA TMP1 TAD TMP1 AND BCC1 CIA CLL RAL TAD BCC1 TAD TMP1 DCA BCC1 JMP I CRC PAGE /CHK FOR MASTER INPUT DEVICE ONLY CHKMI, 0 TAD (INTBL-1 DCA NDX0 TAD I NDX0 SNA CLA JMP BY1 /NO MI TAD (-10 DCA TMP0 ISZ NDX0 TAD I NDX0 /MUST HAVE NO SZA CLA /OTHER IN DEVS JMP BY1 /FOUND 1 ISZ TMP0 JMP .-5 CLA CMA /MI ONLY SET BY1, DCA MIFLG /MI FLAG JMP I CHKMI DOUSR, 0 /HERE TO DO A DCA N1-1 /USR CALL TAD NAME /EITHER LOOKUP DCA N1 /,ENTER OR TAD FLEN /CLOSE DCA N1+1 TAD USRDEV JMS I (GETHAN CIF 10 TAD USRDEV AND P17 JMS I P200 0 N1, 0;0 JMP USRERR TAD N1 DCA SBLK TAD N1+1 DCA FLEN JMP I DOUSR USRERR, JMS I TYPTXT USRMSG TAD N1-1 JMS I (OCTOUT TAD USRDEV JMS I TYDEV TAD NAME JMS I TNAME JMS I CRLF JMP I GETCD PAGE SETDV, 0 JMS CHKP37 7600-1 /OUTPUT INFO OUTTBL-1 4 -3 JMS CHKP37 7617-1 /INPUT INFO INTBL-1 1 -11 JMP I SETDV CHKP37, 0 DCA TMP0 TAD (TM-1 DCA NDX1 TAD I CHKP37 /P37 ADDR DCA NDX0 ISZ CHKP37 TAD I CHKP37 DCA TMP1 /PERM TBL ISZ CHKP37 TAD I CHKP37 DCA TMP3 /ENTRY LEN-1 ISZ CHKP37 TAD I CHKP37 DCA TMP2 /-NUM TO DO XLOP2, CDF 10 TAD I NDX0 SZA /BLANK ENTRY ? ISZ TMP0 /NO CDF DCA I NDX1 /TMP SAV TAD NDX0 /ADV PTR TO NXT TAD TMP3 DCA NDX0 ISZ TMP2 /DONE? JMP XLOP2 /NO TAD TMP0 /WAS P37 SNA CLA /BLANK ? JMP BY0 /YES USE SET OF /DEV LAST /SPECIFIED TAD TMP1 DCA NDX1 TAD (TM-1 DCA NDX0 TAD I CHKP37 DCA TMP0 TAD I NDX0 /NEW UNIT DCA I NDX1 DCA I NDX1 /0 TO SBLK ISZ TMP0 JMP .-4 DCA I NDX1 BY0, ISZ CHKP37 JMP I CHKP37 /ROUT TO INTERPRET PS/8 SWITCHES SWITCH, 0 TAD I SWITCH /PTR TO TBL DCA TMP0 ISZ SWITCH CLL TAD (7757 AND SATOL TAD SMTOX SNA SZL CLA JMP I SWITCH /NONE TO READ XLOP0, TAD I TMP0 SNA /END OF TBL ? JMP I SWITCH /YES DCA TMP1 /PTR TO FLAG CLA CMA /SET TO YES DCA I TMP1 /STATE XLOP1, ISZ TMP0 TAD I TMP0 /AC=P37 SW ADDR ISZ TMP0 /=PTR TO MASK SNA /MORE ARGS FOR /THIS SWIT ? JMP XLOP0 /NO DO NXT DCA TMP2 TAD I TMP2 AND I TMP0 /CLR NON SWITCH /BITS CIA /COMP WITH MASK TAD I TMP0 SZA CLA /IF ALL OK /LEAVE SWITCH /ALONE DCA I TMP1 JMP XLOP1 PAGE WRITE, 0 TAD WRITE DCA READ FOURK JMP READ+1 READ, 0 DCA RWBIT JMS I CHKC TAD I READ DCA DVPTR ISZ READ TAD I DVPTR /UNIT JMS I (GETHAN ISZ DVPTR TAD I DVPTR /PUT NUM BLKS AND P17 /IN B1-B5 RTL CLL RTL RTL RAL TAD BUFFLD TAD RWBIT DCA IOLST ISZ DVPTR TAD I DVPTR DCA IOLST+2 /SBLK JMS I HANADR IOLST, 0 2000 0 JMP .+3 ISZ READ /NON ERR RTN JMP I READ CLA JMS I TYPTXT IOMSG MTWO TAD DVPTR DCA TMP0 TAD I TMP0 JMS I TYDEV TAD I NAME SNA CLA JMP .+3 TAD NAME JMS I TNAME TAD IOLST+2 JMS I (OCTOUT TAD RWBIT SMA CLA JMP DONALL TAD (337 JMS I (LSPPCH /BACK ARROW DONALL, JMS I CRLF JMP I READ RWBIT, 0 DVPTR, 0 PAGE GETHAN, 0 AND P17 DCA TMP1 TAD TMP1 TAD (DEVRES-1 DCA TMP0 CDF 10 TAD I TMP0 /IS HANDLER IN CDF /IN CORE ? SZA JMP NOFET /YES MTWO TAD TMP1 SNA CLA TAD (1200 TAD (6001 /ENABLE 2 PG HANDLERS DCA .+5 TAD TMP1 CIF 10 JMS I P200 FETCH 0 JMP FETERR TAD .-2 NOFET, DCA HANADR JMP I GETHAN FETERR, JMS I TYPTXT USRMSG TAD (FETCH JMS I (OCTOUT JMP I GETCD /ABORT /COMMAND TYPDEV, 0 AND P17 TAD (DMTBL-1 DCA TMP0 TAD I TMP0 DCA .+2 JMS I TYPTXT 0 JMP I TYPDEV PAGE COMPAR, JMS I RDSWIT CSTBL TAD I (OUTTBL DCA USRDEV TAD USRDEV DCA CD1 TAD (INTBL DCA INPTR TAD I NAME SNA CLA JMP CDEV TAD (LOOKUP JMS I USR TAD SBLK DCA CD1+2 TAD I INPTR DCA CD2 CDF 10 TAD I (7620 CDF DCA CD2+2 JMS DOCOMP CDEV, JMP I GETCD DOCOMP, 0 LOP14, JMS I (READ CD1 JMP I GETCD TAD (2400 DCA I (IOLST+1 JMS I (READ CD2 JMP CERR CLA CMA DCA BADB TWOK DCA I (IOLST+1 TAD (1777 DCA NDX0 TAD (2377 DCA NDX1 TAD (-400 DCA ZCNT CDF 10 LOP13, TAD I NDX0 CIA TAD I NDX1 SZA CLA JMP BADCOM LOP15, ISZ ZCNT JMP LOP13 CDF ISZ CD1+2 ISZ CD2+2 ISZ FLEN JMP LOP14 JMP I DOCOMP BADCOM, CDF ISZ BADB JMP BYBLK TAD CD1 JMS I TYDEV TAD CD1+2 JMS I (OCTOUT TAD CD2 JMS I TYDEV TAD CD2+2 JMS I (OCTOUT JMS I CRLF BYBLK, TAD BADFO SZA CLA JMP I GETCD TAD BADBO SZA CLA JMP DOMORE TAD (400 TAD ZCNT JMS I (OCTOUT TAD NDX0 DCA TMP0 CDF 10 TAD I TMP0 CDF JMS I (OCTOUT TAD NDX1 DCA TMP0 CDF 10 TAD I TMP0 CDF JMS I (OCTOUT JMS I CRLF DOMORE, JMS I CHKC CDF 10 JMP LOP15 CERR, TWOK DCA I (IOLST+1 JMP I GETCD CD1, 0;1;0 CD2, 0;1;0 BADB, 0 BADBO, 0 BADFO, 0 ZCNT, 0 PAGE /FILE EDITOR FOR OS/8. FED, TAD I (OUTTBL AND P17 DCA USRDEV TAD I NAME SZA CLA JMP ITSNAM TAD USRDEV TAD (DLTBL-1 DCA TMP0 TAD I TMP0 DCA FLEN DCA SBLK JMP .+3 ITSNAM, TAD (LOOKUP JMS I USR DCA SRWD CLA CMA DCA MSKWD DCA MODF TAD USRDEV DCA OUDEV IAC DCA OUDEV+1 JMS I (RD LOP16, JMS I (GINP JMS I (G6BIT JMP GOTCMD DCA ENDCT TAD (CMDTBL-2 DCA NDX0 ISZ NDX0 TAD I NDX0 CIA TAD ENDCT SZA CLA JMP .-5 TAD I NDX0 DCA CMDTBL-1 GOTCMD, JMS I CMDTBL-1 JMP LOP16 QMARK CMDTBL, 2200 R 2700 W 0300 C 2300 SR 1700 O 0500 EX ENDCT, 0 QMARK QMARK, 0 TAD (277 JMS I (LSPPCH JMS I CRLF JMP I QMARK C, 0 /STATUS COMMAND TAD RBLK JMS I (OCTOUT TAD MODF SNA CLA JMP .+3 TAD (306 JMS I (LSPPCH TAD MODB SNA CLA JMP .+3 TAD (302 JMS I (LSPPCH TAD (240 JMS I (LSPPCH TAD CLOC JMS I (OCTOUT TAD SRWD JMS I (OCTOUT TAD MSKWD JMS I (OCTOUT JMS I CRLF JMP I C PAGE GETC, 0 /GET AN INPUT TAD I BUFPTR /CHAR TAD EOLWD SNA CLA JMP I GETC TAD I BUFPTR DCA INCHR ISZ BUFPTR TAD INCHR TAD (-254 /, SNA CLA JMP I GETC ISZ GETC TAD INCHR JMP I GETC G6BIT, 0 /8 TO 6 BIT JMS GETC JMP I G6BIT AND (77 RTL CLL RTL RTL DCA TMP0 JMS GETC JMP EX6 AND (77 TAD TMP0 DCA TMP0 JMS GETC JMP EX6 JMS BUPTR JMS BUPTR JMS BUPTR JMP I G6BIT EX6, TAD TMP0 ISZ G6BIT JMP I G6BIT GOCTAL, 0 /GET OCTAL DIGIT TAD BUFPTR DCA TMP2 JMS GETC JMP I GOCTAL JMS BUPTR LOP17, DCA TMP1 JMS GETC JMP FOCT TAD (-260 DCA TMP0 TAD TMP0 AND (7770 SNA CLA JMP .+4 TAD TMP2 DCA BUFPTR JMP I GOCTAL TAD TMP1 RTL CLL RAL TAD TMP0 JMP LOP17 FOCT, ISZ GOCTAL TAD TMP1 JMP I GOCTAL BUPTR, 0 CLA CMA TAD BUFPTR DCA BUFPTR JMP I BUPTR RD, 0 /READ A BLK DCA TMP0 /=REL BLK TO DO CLL TAD FLEN TAD TMP0 SNL CLA JMP .+3 JMS I (QMARK JMP I RD TAD TMP0 DCA RBLK TAD RBLK TAD SBLK DCA OUDEV+2 JMS I (READ OUDEV JMP I IOERR DCA MODB DCA CLOC JMP I RD R, 0 /R COMMAND JMS GOCTAL TAD RBLK JMS RD JMP I R W, 0 /WRITE COMMAND TAD MODB SNA CLA JMP .+5 JMS I (WRITE OUDEV JMP I IOERR CLA CMA DCA MODF TAD RBLK IAC JMS RD DCA MODB JMP I W EX, 0 /EXIT TO DECODE TAD MODB SNA CLA JMP I GETCD JMS I (WRITE OUDEV JMP I IOERR JMP I GETCD PAGE GINP, 0 /GET KBRD INPUT TAD MAXLEN DCA OCNT TAD (BUFADR DCA BUFPTR JMS I [LSPRDR AND [177 TAD [200 DCA INCHR TAD INCHR TAD (-212 SNA JMP LFEND TAD (212-203 SNA JMP I [CTRLC0 TAD (203-215 SNA JMP LFEND-1 TAD (215-225 SZA JMP TRYRUB TAD (336 JMS I (LSPPCH TAD (325 JMS I (LSPPCH JMS I CRLF JMP GINP+1 TRYRUB, TAD (225-377 SZA CLA JMP PUTC TAD MAXLEN CIA TAD OCNT SNA CLA JMP GINP+5 CLA CMA TAD OCNT DCA OCNT CLA CMA TAD BUFPTR DCA BUFPTR TAD (334 JMS I (LSPPCH JMP GINP+5 PUTC, TAD INCHR JMS I (LSPPCH TAD INCHR TAD (-240 SNA CLA JMP GINP+5 TAD INCHR DCA I BUFPTR ISZ BUFPTR ISZ OCNT JMP GINP+5 IAC LFEND, DCA I BUFPTR TAD I BUFPTR CIA DCA EOLWD TAD (BUFADR DCA BUFPTR JMS I CRLF JMP I GINP O, 0 /OPEN LOC N JMS I (GOCTAL JMP .+3 AND (377 LOP20, DCA CLOC JMS DOLOC TAD EOLWD SZA CLA JMP I O TAD CLOC IAC AND (377 SZA JMP LOP20 JMS I (W JMP LOP20+1 DOLOC, 0 JMS GETWRD JMS I (OCTOUT TAD (257 JMS I (LSPPCH JMS GINP JMS I (GOCTAL JMP I DOLOC JMS PUTWRD JMP I DOLOC GETWRD, 0 TAD CLOC TAD I (IOLST+1 DCA TMP0 CDF 10 TAD I TMP0 CDF JMP I GETWRD PUTWRD, 0 DCA TMP0 TAD CLOC TAD I (IOLST+1 DCA TMP1 TAD TMP0 CDF 10 DCA I TMP1 CDF CLA CMA DCA MODB JMP I PUTWRD PAGE SR, 0 /SEARCH COMM. JMS I (GOCTAL SKP DCA SRWD JMS I (GOCTAL SKP DCA MSKWD TAD EOLWD DCA ISVEOL DCA MATFLG TAD SRWD AND MSKWD CIA DCA BCC1 CLA CMA DCA SRBFLG LOP18, JMS I (GETWRD AND MSKWD TAD BCC1 SNA CLA JMP SRMAT LOP19, ISZ CLOC TAD CLOC AND (377 SZA CLA JMP LOP18 TAD (377 DCA CLOC TAD ISVEOL SZA CLA JMP EXS JMS I (W TAD CLOC SNA CLA JMP LOP18-2 JMP EXS SRMAT, TAD SRBFLG SNA CLA JMP .+3 TAD RBLK JMS I (OCTOUT CLA CMA DCA MATFLG DCA SRBFLG TAD CLOC JMS I (OCTOUT JMS I CRLF JMS I (DOLOC TAD EOLWD SNA CLA JMP LOP19 EXS, TAD MATFLG SNA CLA JMS I (QMARK JMP I SR SRBFLG, 0 MATFLG, 0 ISVEOL, 0 PAGE /TABLES FOR FPIP DLTBL, -6260 /DEVICE LENGTHS -6260 /FOR UNITS 1-17 0 /SYS,DSK,TTY 0 /LPT -1341;-1341 /DTA0- -1341;-1341 /DTA7 -1341;-1341 -1341;-1341 0 0 0 DMTBL, SYMSG DKMSG TTMSG LPMSG D0MSG D1MSG D2MSG D3MSG D4MSG D5MSG D6MSG D7MSG PPMSG PRMSG CDMSG AMSG, PARMSG PARMSG LTMSG EOTMSG PSTBL, EOTFLG SATOL 200 /E 0 LSPFLG SATOL 1 /L 0 PATFLG SMTOX 400 /P 0;0 CSTBL, BADBO SATOL 2000 /B 0 BADFO SATOL 4000 0;0 TM, 0 0 0 0 0 0 0 0 0 OUTTBL, 1;0 0;0 0;0 0 INTBL, 5;0 0;0 0;0 0;0 0;0 0;0 0;0 0;0 0;0 0 S0FLG, 0 /CM SYMSG, TEXT "SYS:" 0 DKMSG, TEXT "DSK:" 0 TTMSG, TEXT "TTY:" 0 LPMSG, TEXT "LPT:" 0 D0MSG, TEXT "DTA0:" 0 D1MSG, TEXT "DTA1:" 0 D2MSG, TEXT "DTA2:" 0 D3MSG, TEXT "DTA3:" 0 D4MSG, TEXT "DTA4:" 0 D5MSG, TEXT "DTA5:" 0 D6MSG, TEXT "DTA6:" 0 D7MSG, TEXT "DTA7:" 0 PPMSG, TEXT "PTP:" 0 PRMSG, TEXT "PTR:" 0 CDMSG, TEXT "CDR:" 0 EOTMSG, TEXT "END OF TAPE " 0 NTMSG, TEXT "ENTER NEXT " 0 BIGMSG, TEXT "IS TOO BIG FOR " 0 PARMSG, TEXT "PARITY ERROR " 0 LTMSG, TEXT "L/T ERROR " 0 USRMSG, TEXT "USR " 0 IOMSG, TEXT "I/O ERROR " 0 NMSG, TEXT "NEED: " 0 FMSG, TEXT "FOUND: " 0 BEQMSG, TEXT "BAD =BLK" 0 PARADR, 0 *PARADR+41 FNAME, 0;0;0;0;0 FRMADR, 0 *614+FRMADR AAFREE, 0 *6600-10 HDATA, 0 /TYPE (HOLDS /VERS FOR NOW) 0;0;0;0 /NAME 0 /REL BLK 0 /LEN 0 /CONTINUATION /WD 0 FOR NOW BUFADR, 0 LTLEN=124 MXPBLK=40 NBYTS=41 MTHREE=7346 /CLA CLL CMA RTL MTWO=7344 /CLA CLL CMA RAL TWOK=7332 /CLA CLL CML RTR FOURK=7330 /CLL CML CLA RAR FETCH=1 LOOKUP=2 ENTER=3 CLOSE=4 DECODE=5 CHAINE=6 ERROR=7 USRIN=10 USROUT=11 INQUIRE=12 RESET=13 PLS=6026 PSF=6021 RFC=6014 RRB=6012 RSF=6011 DEVRES=7647 ATOL=7643 MTOX=7644 YTO9=7645 IFZERO PTAPE < NSLOTS=S0END-S0FLG > $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 | /3.1 OS/8 V3 FOTP 5-AUGUST-1975 (NOT HALLOWEEN) / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /WITH FAILSAFE CHANGES NOV 17, 1973 R.L. / FOTP (FILE ORIENTED TRANSFER PROGRAM) H.J. /CORE MAP /FROM TOP OF CORE / FIELD 2 GETS CONDITIONALLY USED AS BUFFER / FIELD 1 / 7777-7600 MONITOR / 7577-4600 INCORE OUTPUT DIRECTORY / 4577-2000 FOTP CODE / 1777-0 RESIDENT USR / / FIELD 0 / 7777-7600 MONITOR / 7577-7200 ERROR MESSAGES / 7177-0 WORK AREA AS: / / AT TOP- OUTPUT HANDLER IF NEEDED / 1 OR 2 PAGES / INPUT HANDLER IF NEEDED / 1 OR 2 PAGES / INPUT DEVICES DIRECTORY / (ONLY USED PORTION) / THE TRANSFER BUFFER IN 8K / IS WHAT EVER REMAINS. /FIXES FOR MAINTENANCE RELEASE: (S.R. 5-AUG-75) /1. CHANGED COPYRIGHT DATE /2. INCORPORATED SEQ #1 PATCH (DSN MARCH 1975) / PERMITS FOTP TO RECOVER FROM A MONITOR ERROR 6 / BY UNFAKING THE SYSTEM HANDLER /3. UPDATED FOTP VERSION NUMBER TO V8 /4. ADDED SPACE FOR A PATCH LEVEL /5. ALLOWED /T SWITCH TO WORK IN CONJUNCTION WITH /R /6. PERMITS RENAMING A FILE TO IT'S OWN NAME /7. IF NO OUTPUT DEVICE IS SPECIFIED WITH /R, / ASSUME OUT DEV=INPUT DEVICE. /8. FIXED BUG RE ADDITIONAL INFO WORDS /ADDED THE PATCH FROM DSN 21.19.1 TO ALLOW FOTP TO KNOW ABOUT LARGE /DIRECTORIES. /PAGE 0 LOCATIONS OS/8 USR WON'T MANGLE PTR=20 CNT=21 INFPTR=22 OUHAND=23 INHAND=24 FPAGE=25 EPTR=26 INSCNT=27 TEMP=30 OKFLAG=31 IFCNT=32 BUFSIZ=33 INFWDS=34 BDPTR=35 GPTR1=36 INEOF=37 /AUTO INDEX REGISTERS USR WILL ALLOW ME TO USE TEMPORARILY XR=10 XR1=11 XR2=12 /VARIOUS CONSTANTS THAT CAN BE GENERATED AC2=CLA CLL CML RTL AC4000=CLA CLL CML RAR ACM2=CLA CLL CMA RAL ACM3=CLA CLL CMA RTL / LOCATIONS REFERENCED IN OS/8 ALTOPT=7642 OPT1=7643 OPT2=7644 DATE=7666 DIRKEY=7 /"DIRECTORY SEGMENT IN CORE" KEY /SYMBOLIC FOTP LOCATIONS: OUBUFR= 4600 /OUTPUT BUFFER - IN FIELD 1 INBUFR= 0 /INPUT BUFFER - IN FIELD 0 LSTFPG= 7000 /FIRST LOC OF LAST FREE PAGE IN FIELD 0 FAKHND= 200 /LOCATION OF OS/8 FAKEOUT HANDLER VERSION= 11 /VERSION NUMBER SUBVER= 02 /SUB VERSION (PATCH LEVEL) /LOCATED AT "VERLOC" AS 60+VERSION^100+SUBVER /STARTS AT 4600 IN FIELD 1 (ONCE ONLY CODE) /SAVE INFO: / .LOAD FOTP(89P) / .SAVE SYS FOTP;14600 FIELD 1 *2000 CDCALL, JMS I (200 /SEE WHAT THE PERSON WANTS FIVE, 5 STAR, 5200 /IN SPECIAL MODE BYPSCD, JMS I (INTERC /CATCH CALLS TO 7600 TAD I (7600 /SAVE USER OUTPUT DEVICE DCA I (USEROD /-FOR LATER / CHECK FOR ? IN OUTPUT SPECIFICATION TAD (-10 /8CHARACTERS TO LOOK AT DCA CNT /CNT HAVING -10 PUTS US AT FIRST CHAR S1C, TAD (7605 JMS I (GTSXBT /GET A CHAR TAD (-"?!7700 /CHECK FOR ? SNA CLA JMP QINO /? IN OUTPUT NOT ALLOWED ISZ CNT JMP S1C / CHECK FOR EMBEDDED * IN ANY SPECIFICATION TAD (7605 S4L, DCA PTR TAD (-10 DCA CNT ACK, TAD PTR JMS I (GTSXBT TAD (-"*!7700 /CHECK TO SEE IF CHARACTER * SZA CLA /SKIP IF IT IS JMP CNTUP /GO LOOK AT NEXT AC2 TAD CNT /ARE WE AT EXTENSION SZA /SKIP IF YES TAD (6 /ARE WE AT START OF FILENAME? SNA CLA /SKIP IF NOT ISZ CNT /BUMP COUNT ONLY IF OK TAD PTR /LOOK AT NEXT CHAR JMS I (GTSXBT SZA CLA /SKIP IF ITS NULL - OK JMP AINO /ERROR CNTUP, ISZ CNT /BUMP TO NEXT CHAR JMP ACK /CONTINUE CHECKING TAD I PTR /ANY MORE INPUT SNA CLA /SKIP IF THERE IS JMP NULLCK TAD FIVE /BUMP TO NEXT ENTRY TAD PTR JMP S4L / CHECK FOR NULL OUTPUT SPECIFICATION AND MAKE *.* NULLCK, TAD I (7601 /WAS OUTPUT FILENAME GIVEN? SZA CLA /SKIP IF NONE JMP DIDEML TAD STAR /PUT AN ASTERISK IN DCA I (7601 /FILENAME TAD STAR DCA I (7604 /AND EXTENSION /THIS CODE SETS A DEFAULT OUTPUT DEVICE ON DELETE DIDEML, TAD I (7600 /IS AN OUTPUT DEVICE SPECIFIED? SZA /SKIP IF NOT JMP ODSPEC /NOTE DEVICE NUMBER IN AC TAD I (OPT1 /CHECK FOR /D AND (400 SZA CLA /SKIP IF NOT /D JMP MOV /OUTPUT=INPUT TAD I (OPT2 /V3C AND (100 /CHECK FOR /R SZA CLA /V3C MOV, TAD I (7605 /WE'LL SUBSTITUTE FIRST INPUT DEVICE FOR USER ODSPEC, AND (17 /CLEAR USER SPECIFIED LENGTH DCA I (7600 /WE KNOW BETTER /THE FOLLOWING BRINGS IN THE OUTPUT DEVICE HANDLER, /READS THE DIRECTORY INTO CORE AND VERIFIES IT. TAD (LSTFPG /SET THE FREE SPACE POINTER DCA FPAGE /TO THE LAST FREE PAGE IN FIELD 0 TAD I (7600 /IS THERE AN OUTPUT DEVICE? SZA /IF NO OUTPUT, DON'T FETCH HANDLER JMS I (ASSIGN /GET THE HANDLER AND ALLOCATE ITS SPACE DCA OUHAND /AC RETURNS HANDLER ENTRY POINT JMS I (ODIRIN /READ IN THE OUTPUT DIRECTORY TAD (7605 /INGIALIZE INPUT POINTER /THIS IS THE BEGINING OF THE INPUT FILE LOOP DOMOIN, DCA INFPTR /POINTER TO CURRENT INPUT TAD I INFPTR /WHEN 0 NO MORE INPUT SNA /SKIP IF MORE TO DO JMP I (ENDCHK /DO END PROCESSING JMS I (ASSIGN /ASSIGN AND ALLOCATE SPACE FOR INPUT HANDLER DCA INHAND /AND SAVE ITS ENTRY ADDRESS /THE FOLLOWING 2 INSTRUCTIONS HELP AVOID ALL KINDS OF /PROBLEMS WITH THE MONITOR. IF A HANDLER GETS LOADED, THE /MONITOR MAKES IT RESIDENT FOR OTHER PEOPLE AND DOESN'T DELETE /ITS RESIDENT STATUS IF A REQUEST IS MADE FOR A NEW HANDLER /TO BE LOADED OVER IT IF THE NEW HANDLER IS ALREADY RESIDENT TAD FPAGE /SAVE FREE SPACE POINTER HERE DCA SFUDG JMP I (PG1 /LINK TO NEXT SECTION SFUDG, 0 ONDERR, JMS I (ERROR ODRERR+40 /ERROR READING OUT DIR AINO, JMS I (ERROR ILLA+40 /ILLEGAL * QINO, JMS I (ERROR ILLQ+40 /ILLEGAL ? PAGE /CHECK FOR NON FILE STRUCTURED INPUT /WE CAN'T HANDLE IT PG1, TAD I INFPTR TAD (7757 DCA TEMP TAD I TEMP /IS FILE STRUCTURED BIT ON SMA CLA /SKIP IF IT IS JMP NFIN /ERROR CIF 0 JMS I INHAND /READ INPUT DEVICES DIRECTORY 1400 IDBUF, INBUFR 1 JMP INDERR /ERROR CDF 0 TAD I IDBUF /MAKE SURE THAT THE CMA CLL /DIRECTORY OF TAD I (INBUFR+2 /THE DEVICE IS CDF 10 /GOOD SNL TAD (-107 //ALLOW FOTP TO RECOGNIZE UP TO 71 (D) ENTRIES //IN A DIRECTORY SEGMENT. DSN 21.19.1 AUG78. /(SEE COMMENT ON TEST IN ROUTINE "ODIRIN") SZL CLA /SKIP IF ITS GOOD JMP BIDIR /ERROR /FIND LAST BLOCK OF DIRECTORY AC2 /LINK TO NEXT SGMENT NUMBER FNDLST, DCA PTR /SAVE IT CDF 0 TAD I PTR /IS THERE ANOTHER SEGMENT? SNA CLA /SKIP IF YES JMP ATIT /NO...WE ARE POINTING TO LAST TAD PTR /BUMP TO NEXT SEGMENT TAD (400 JMP FNDLST /LOOK AGAIN ATIT, ACM3 /AC=7775 AND PTR /AND OUT 2'S BIT TAD (400 /TOTAL SIZE OF IN CORE DIRECTRY CIA /NEGATE FOR ISZ DCA CNT TAD FPAGE /WE ARE GOING TO PACK DIRECTORY TAD (200 /RIGHT UP TO INPUT HANDLER SO TAD CNT /WE GET MAX SIZE TRANSFER BUFFER DCA FPAGE /ADJUSTED FREE CORE POINTER CMA TAD FPAGE DCA XR1 /SET UP PLACE TO MOVE TO CMA DCA XR2 /ALWAYS COMES FROM 0 TAD I XR2 /MOVE DCA I XR1 /IT ISZ CNT JMP .-3 /SET SAME DEVICE FLAG FLAG 4000 IF /D CDF 10 TAD I (OPT1 AND (400 RTL CLL /PUT /D BIT INTO AC 0 RAL DCA SDFLG / COUNT NUMBER OF INPUTS FROM SAME DEVICE /ALSO MAKE NULL INPUT FILENAMES *.* /BUT ONLY IF NOT /D TAD INFPTR /OK LETS GO THROUGH DCA PTR /THE INPUT SPECIFICATIONS GETCNT, ISZ PTR /POINT TO FILENAME WORD TAD (3 /SET TEMP TO POINT TO EXTENSION TAD PTR DCA TEMP TAD SDFLG /ARE WE DOING /D K7450, SNA /SKIP IF YES - AC NON 0 TAD I PTR /NO /D - LOOK AT FILENAME SZA CLA /ITS NULL PUT IN *.* JMP NOSUB /DONT CHANGE IT TAD (5200 /MAKE IT * DCA I PTR TAD (5200 /.* DCA I TEMP NOSUB, CLA IAC /TEMP+1 POINTS TO NEW INPUT TAD TEMP DCA PTR /NOTE CNT WAS SET BY ISZ'ING TO ZERO ISZ CNT /KEEP COUNT OF DEVICES IN GROUP TAD I (OPT2 /CHECK FOR /U (UGLY SWITCH) AND (10 SZA CLA /SKIP IN NO /U JMP NOPTIM /WERE FORCED TO DO ONE AT A TIME TAD I PTR /COMPARE DEVICE NUMBERS CIA /IN A GROUPING TAD I INFPTR SNA CLA /SKIP IF NEW GROUP JMP GETCNT /WE'LL DO ALL THE SAME AT ONCE NOPTIM, TAD CNT CIA /NEGATE COUNT DCA INSCNT /AS NUMBER OF INPUTS TO DO AT ONCE TAD PTR /SAVE WHERE TO CONTINUE FOR REST DCA I (MOIN /THE FOLLOWING CHECKS TO SEE IF A OPERATION /IS BEING DONE FROM A DEVICE TO ITSELF TAD I (7600 /GET DEVICE NUMBER TAD (7646 /HANDLER ENTRY POINT TABLE DCA TEMP TAD I INFPTR /GET INPUT ENTRY POINT TAD (7646 DCA PTR TAD I PTR /CHECK INPUT ENTRY POINT AGAINST CIA TAD I TEMP /OUTPUT ENRTY POINT SNA CLA /SKIP IF THEY ARE DIFFERENT ISZ SDFLG /SET SAME DEVICE FLAG, AC11 TAD FPAGE /SET POINTER TO DCA BDPTR /START OF DIRECTORY DCA TYPFND /CLEAR FOUND FILE FLAG JMP I (NBLOCK /LINK TO SOME MORE TYPFND, 0 SDFLG, 0 /NEGATIVE MEANS /D, ODD MEANS OUTPUT DEV=INPUT DEV NFIN, JMS I (ERROR NFLEIN+40 /NON FILE STRUCTED INPUT INDERR, JMS I (ERROR BADIRD+40 /ERROR READING INPUT DIR BIDIR, JMS I (ERROR BIDIRM+40 /NOT A GOOD DIRECTORY PAGE /THIS IS THE SUPERQUASIFACETED DIRECTORY PATTERN MATCHING ROUTINE /THE INPUT DIRECTORY IS SEARCHED HERE, IF A MATCH /IS FOUND USING THE INPUT GROUPING /GOT1 GETS CONTROL WITH -BLOCKS IN THE AC NBLOCK, STA TAD BDPTR /POINTER TO START OF DIR BLOCK DCA XR CDF 0 TAD I XR /GET COUNT OF NUMBER OF ENTRIES DCA ENTCNT /SAVE LOCALLY TO AVOID HERB'S BUG TAD I XR /GET BLOCK NUMBER FIRST FILE DCA BLOCK TAD I XR /NEXT SEGMENT NUMBER DCA LFLAG /IF IT 0 WE AT END ISZ XR /SKIP TENTATIVE FILE WORD TAD I XR /GET -NUMBER OF INFO WORDS CIA /MAKE POSITVE DCA INFWDS TAD XR /POINT TO FIRST IAC /ENTRY DCA EPTR BLOOP, TAD I EPTR /GET FILENAME WORD CDF 10 SNA CLA /SKIP IF FILE HERE JMP EMPTY /NO... ITS REALLY AN EMPTY TAD INSCNT /SET NUMBER OF INPUT TO LOOK DCA NCNT /AT ALL AT ONCE DCA MATFLG /CLEAR MATCH FLAG TAD INFPTR /ADDRESS OF FIRST INPUT SKP MN1, TAD GPTR2 /ADDRESS OF CURRENT INPUT TAD (5 /GTSXBT SUBR REQUIRES US TO DCA GPTR2 /POINT TO END OF FIELD TAD EPTR /POINT DIRECTORY POINTER TO TAD (4 /END OF ENTRY FOR SAME REASON DCA GPTR1 TAD GPTR1 /SET EPNEXT TO POINT TO TAD INFWDS /MINUS NUMBER OF BLOCKS IN DCA EPNEXT /FILE WORD TAD (-10 /NUMBER OF CHARS TO LOOK AT WILDNM, DCA CNT MLP, TAD GPTR2 /OK - GET A CHARACTER FROM JMS I (GTSXBT /STRING TAD (-"*!7700 /IS IT AN * SNA /SKIP IF NOT * JMP WILDA /YEP... ITS A WILD CARD TAD ("*-"? /IS IT A ? SNA /SKIP IF NOT JMP WILD /YES... FORCE MATCH ON THIS CHAR TAD ("?&77 /RESTORE VALUE CIA /NEGATE DCA CHAR /AND SAVE TAD GPTR1 /NOW GET CHAR FROM DIRECTORY CDF 0 JMS I (GTSXBT CDF 10 TAD CHAR /DO CHARS MATCH SZA CLA /SKIP IF THEY DO JMP NM1 /NO MATCH ON THIS INPUT WILD, ISZ CNT /BUMP COUNT OF CHARS & POINTER JMP MLP /COMPARE ALL 8 MEXT, ISZ MATFLG /A MATCH!!!!!!! NM1, CLA /WILD CARD COMES HERE WITH ICHY AC ISZ NCNT /HAVE WE CHECKED GROUP OF INPUTS JMP MN1 /NO CHECK WHOLE GROUP TAD MATFLG /HAVE THERE BEEN ANY MATCHES SZA CLA /SKIP IF NOT TAD (4 /WILL INVERT /V SWITCH TAD I (OPT2 /ADD SWITCH AND (4 /ISOLATE IT CDF 0 /SKIPS IF INPUT DIRECTORY ENTRY IS NOT CANDIDATE /THAT IS - IF A MATCH WAS NOT FOUND BETWEEN ANY /OF THE INPUTS AND /V WAS NOT SPECIFIED OR /A MATCH WAS FOUND AND /V WAS SPECIFIED /THIS ALLOWS /V TO MEAN EVERYTHING BUT... SZA CLA TAD I EPNEXT /GET -NUMBER OF BLOCKS CDF 10 SZA /SKIPS IF TENTATIVE OR NOT CANDIDATE JMP I (GOT1 /PROCESS FILE NENT, TAD EPNEXT /POINT EPTR TO BLOCK DCA EPTR /COUNT OF FILE SKP EMPTY, ISZ EPTR /ON EMPTY MAKE EPTR POINT TO BLOCK COUNT CDF 0 TAD I EPTR /GET BLOCK COUNT CIA /MAKE POSITIVE TAD BLOCK DCA BLOCK /KEEP SUM ISZ EPTR /POINT TO NEXT ENTRY ISZ ENTCNT /BUMP THE NUMBER OF ENTRIES JMP BLOOP /NOT DONE WITH SEGMENT CDF 10 TAD (400 /BUMP TO NEXT SEGMENT TAD BDPTR DCA BDPTR TAD LFLAG /DID WE PROCESS LAST SEGMENT SZA CLA /SKIP IF WE DID JMP NBLOCK /PROCESS NEW SEGNENT TAD I (SFUDG /RESET FREE CORE POINTER DCA FPAGE /TO PRESERVE INPUT HANDLER IF PRESENT JMP I (SAYNON /HANDLE WILD CARDS WILDA, TAD CNT /GET CURRENT CHAR POSITION TAD (6 /ADD SIZE OF FILENAME SPA /SKIP IF IN EXTENSION FIELD JMP WILDNM /THIS BUMPS TO EXTENSION JMP MEXT /THIS MEANS IT HAS TO BE A MATCH CHAR, 0 EPNEXT, 0 GPTR2, 0 LFLAG, 0 NCNT, 0 BLOCK, 0 MATFLG, 0 ENTCNT, 0 PAGE GOT1, DCA IFCNT /-# OF BLOCKS IN AC JMS I (DATCHK /VERIFY IF /C OR /O ALSO MATCH ISZ I (TYPFND /COMES BACK IF THEY DO - /TURN OFF NO FILES MSG FOR THIS INPUT GROUP TAD I (OPT2 /CHECK FOR /T AND (20 SNA CLA /SKIP IF /T TAD INFWDS /SEE IF DATE PRESENT CDF 0 SZA CLA /SKIP IF NO DATE OR /T TAD I GPTR1 CDF 10 SZA /SKIP IF NO DATE OR /T DCA I (DATE /GIVE MONITOR FILES DATE TAD (-4 /MAKE 2 COPIES DCA CNT /OF THE INPUT CMA /FILE NAME IN TAD EPTR /FIELD 1 TO DCA XR /WORK WITH THEM TAD (SPOT-1 /MAKE THEM AT SPOT DCA XR1 /AND SPOT1 TAD (SPOT1 /SPOT1 WILL ALWAYS DCA PTR /CONTAIN THE ORIGINAL MOVENT, CDF 0 /AND SPOT WILL TAD I XR /CONTAIN THE CDF 10 /UPDATED VERSION AS DCA I PTR /REFLECTED FROM TAD I PTR /THE OUTPUT SPECIFICATION ISZ PTR /- DCA I XR1 /- ISZ CNT /- JMP MOVENT /- TAD I (7601 /GET OUTPUT FILENAME TAD (-5200 /WAS IT * SNA CLA /SKIP IF NOT JMP TSTEXT /YES... LEAVE FILENAME ALONE TAD I (7601 /REPLACE INPUT NAME DCA I (SPOT /WITH GIVEN TAD I (7602 /OUTPUT DCA I (SPOT+1 /SPECIFICATION TAD I (7603 DCA I (SPOT+2 /- TSTEXT, TAD I (7604 /SEE IF EXTENSION TAD (-5200 /WAS * SNA CLA /SKIP IF IT WASNT JMP .+3 /LEAVE INPUT DEFAULT ALONE TAD I (7604 /REPLCE EXTENSION DCA I (SPOT+3 /WITH GIVEN EXTENSION DCA TRFLG /CLEAR THE TRANSFER FLAG TAD I (OPT2 /IS /R ON? AND (100 TAD I (SDFLG /OR /D OR INPUT DEV=OUTPUT DEV? SNA /SKIP IF ANY JMP SETGD /WE ARE DEFINITELY OK SMA CLA /IF /D THEN CHECK OUTPUT TAD (SPOT1-SPOT /OTHERWISE INPUT JMS I (LOOKUP JMP NSETGD /NO OUTPUT FILE GIVEN SNA /AC=BLOCK NO OF FILE OR 0 IF NONE JMP I (NENT /NO FILE - DO NOTHING DCA TEMP /SAVE - WE MIGHT NEED IT TAD I (SDFLG /IF OPERATION IS TRANSFER THEN /TRFLG IS SET IF FILE HAS NOT /MOVED; IF /D TRFLG MUST NOT BE /SET ; WE DONT CARE ABOUT /RENAME - ITS IRRELEVANT. SMA CLA /SKIP IF /D- WILL CAUSE TRFLG=0 TAD TEMP /GET THE BLOCK FILE IS NOW AT CIA /CHECK AGAINST ORIGINAL TAD I (BLOCK /LOCATION SNA CLA /SKIP IF IT MOVED - NOTE THAT /IF THIS SKIPS THE USER IS DOING /A PLAY WITH DEATH OPERATION SETGD, ISZ TRFLG /ENABLE TRANSFERING OF THE FILE NSETGD, TAD I (SDFLG /SET UP TO PROMPT OR LIST SPA CLA /SKIP IF NOT /D TAD (SPOT-SPOT1 /USE OUTPUT NAME TAD (SPOT1+4 /USE INPUT NAME JMS I (PRINTE /SEE IF HE WANTS TO BE PROMPTED FLSRSM, TAD I (OPT2 RTL /PUT /N INTO LINK AND (400 /ISOLATE /R OPTION SZA CLA /SKIP IF NOT /R JMP I (RENAME /GO TO RENAME CODE TAD I (SDFLG /CHECK FOR NO /D AND SAME DEV SPA SNA CLA /SKIP IF NO /D AND SANE DEV TAD I (7600 /IS THERE AN OUTPUT? SNA SZL /SKIP IF NO /N AND OUTPUT DEV /DIDNT SKIP IF NO /D AND SAME DEVICE JMP NODEL /DONT DELETE JMS I (FAKUSR /FAKE USR HANDLER CALLS JMS I (200 /CALL USR 4 /CLOSE SPOT /OUTPUT FILE NAME 0 CLA SKP /O.K. TO GET CLOSE ERROR NOW ISZ I (WRTDIR /SIGNAL CHANGE MADE TO DIRECTRY JMS I (UNFAK /FIXUP HANDLER ADDRESS AGAIN NODEL, CLA TAD TRFLG /SET AC NOT 0 IF TRANSFER GO AHEAD JMP I (NPG /LINK TO SOME MORE TRFLG, 0 PAGE /THIS PAGE OF CODE PERFORMS FILE MOVES FROM /INPUT TO OUTPUT NPG, SNA CLA /SKIP IF WE CAN DO TRANSFER JMP NFUNCT /GO PROCESS NEXT ENTRY /THE FOLLOWING SMALL STRANGE PIECE OF CODE /DYNAMICALLY ALLOCATES THE BUFFER ACCORDING /TO THE FREE SPACE IN FIELD 0 (INCLUDING /DIRECTORY SHRINKING) OR ALLOCATES 15 BLOCKS /IN FIELD 2 IF ITS AVAILABLE. F2C1, TAD (7400 /BECOMES TAD EPTR IF ONLY 8K AND (7400 /CALCULATE FREE SPACE RAL CLL /SIZE RTL /AND SAVE RTL /IT DCA BUFSIZ TAD IFCNT /SET THE OUTPUT CIA /FILE COUNT DCA OFCNT /AS POSITIVE NIMBER OF BLOCKS TAD OFCNT /SET THE NUMBER AND (7400 /OF BLOCKS SNA CLA /UP FOR ENTER TAD OFCNT /IF IT IS LESS RTL CLL /THAN 256 OR RTL /SET IT TO 0 DCA TEMP /FOR FILES GREATER THAN 256 TAD (SPOT /SET THE ADDRESS OF THE DCA SBLKN /OUTPUT NAME TAD I (7600 /IS THERE AN OUTPUT FILE? SNA /SKIP IF THERE IS JMP NFUNCT /DO NO TRANSFER TAD (7757 /INDEX INTO TENTATIVE FILE DCA MSIZE /TABLE IN ORDER TO TAD I MSIZE /CLEAR OUT ANY AND (7770 /TENTATIVE WE DONT WANT DCA I MSIZE /THIS COMES IF AN I/O ERROR HIT TAD I (7600 /DO THE ENTER JMS I (FAKUSR /MAKE USR USE IN CORE HANDLER TAD TEMP /ADD IN BLOCK COUNT JMS I (200 3 /ENTER SBLKN, SPOT MSIZE, 0 JMP I (NOROOM /ENTER FAILED TAD I (SVDATE /RESTORE REAL DATE TO MONITOR DCA I (DATE JMS I (UNFAK /REMOVE OUR FAKE HANDLER JMS I (ADDINF /COPY ADDITIONAL INFO WORDS TAD IFCNT /SEE IF ENTER SIZE STL CIA /GIVEN BACK IS TAD MSIZE /ENOUGH - HANDLES >255 AND SNL SZA CLA /NON FILE STRUCTURED JMP I (NOROOM /LENGTHS. NOT ENOUGH DCA INEOF /CLEAR INPUT END OF FILE TAD SBLKN /SET THE OUTPUT BLOCK NUMBER DCA OBLCKN TAD I (BLOCK /SET THE INPUT BLOCK NUMBER DCA BLOCKN /THE FOLLOWING PIECE OF CODE IS A TRICKY PIECE /THAT CALCULATES THE NUMBER OF BLOCKS TO READ MOVEIT, TAD IFCNT /GET THE NUMBER OF BLOCKS CLL /ITS NEGATIVE TAD BUFSIZ /ADD ON BUFFER SIZE SNL /SKIP IF MORE ROOM AVAILABLE THAN NEEDED DCA IFCNT /OTHERWISE RESAVE NEW COUNT SZL /SKIP IF NOT AT END OF FILE ISZ INEOF /SET END OF FILE INDICATOR CIA /MAKES -BUFSIZ+COUNT TAD BUFSIZ /MAKES COUNT OF NUMBER OF BLOCK RTR CLL /BUILD THE RTR /INPUT CONTROL RTR /WORD F2C2, TAD (20 /BECOMES NOP IF ONLY 8K DCA INCTLW /SET INPUT CONTROL WORD JMS I (CINTER /CHECK FOR ^C SKP /SKIP IF NOT JMP I (CTCDE /ABORT OPERATION CIF 0 JMS I INHAND /READ INPUT HUNK INCTLW, 0 0 BLOCKN, 0 JMP I (RDERR /WELL- SCRATCH THAT FILE TAD BLOCKN /UPDATE BLOCK COUNT TAD BUFSIZ DCA BLOCKN AC4000 /SET THE OUTPUT TAD INCTLW /CONTROL WORD DCA OUCTLW JMS I (CINTER /CHECK FOR ^C SKP /SKIP IF NOT JMP I (CTCDE /ABORT OPERATION ISZ I (MUSTWT /SIGNAL REAL OUTPUT DONE CIF 0 JMS I OUHAND /WRITE A HUNK OF FILE OUCTLW, 0 0 OBLCKN, 0 JMP I (WRTERR /WHAT A CRUMBY OUTPUT DEVICE TAD OBLCKN /UPDATE THE TAD BUFSIZ /OUTPUT FILE DCA OBLCKN /BLOCK NUMBER TAD INEOF /SEE IF THATS ALL FOLKS SNA CLA /SKIP IF WE TRANSFERED FILE JMP MOVEIT /DO SOME MORE TAD I (7600 /OK - LETS MAKE IT PERMANENT JMS I (FAKUSR /TELL USR TO USE INCORE HANDLER JMS I (200 4 /CLOSE SPOT OFCNT, 0 JMP I (CLOERR /THIS IS IMPOSSIBLE (I HOPE) JMS I (UNFAK /ENABLE SYSTEM USE OF REAL HANDLER ISZ I (WRTDIR /SET WE CHANGED DIRECTORY FLAG NFUNCT, JMP I (NENT /I KNOW ITS INEFFICIENT TO JUMP HERE /BUT- IT'S CLEAN... PAGE /HERE COMES GOBBS AND GOBBS OF GOODY LITTLE ROUTINES /FIRST WE HAVE A NICE LITTLE ROUTINE WHICH WILL DO /HANDY LITTLE THINGS LIKE FETCH A HANDLER /AND IN ADDITION ALLOCATE THE SPACE FOR IT. /JUST IMAGINE THIS CAN BE YOURS FOR THE LOW LOW PRICE /OF 23 INSTRUCTIONS ASSIGN, 0 DCA TEMP /SAVE DEVICE NUMBER TAD TEMP JMS I (200 12 /INQUIRE ABOUT HANDLER HADDR1, 0 JMP I (CLOERR /CANT HAPPEN (I HOPE) TAD HADDR1 /DID WE GET BACK ADDRESS SZA /SKIP IF NOT- NON-RESIDENT JMP I ASSIGN /YES... RETURN ITS ENTRY POINT SKP TWOPAG, IAC /TURN ON 2-PAGE BIT TAD FPAGE /GET FREE SPACE POINTER DCA HADDR2 /SET FOR FETCH TAD FPAGE /TAKE AWAY TAD (-200 /PAGE FROM DCA FPAGE /FREE SPACE TAD TEMP /GET DEVICE NUMBER JMS I (200 1 /FETCH HADDR2, 0 JMP TWOPAG /FAILED- MUST BE 2-PAGER TAD HADDR2 /RETURN ENTRY POINT ADDRESS JMP I ASSIGN /THIS UTILITY ROUTINE RETURNS A SIS BIT /CHARACTER FROM ANY FIELD (SET ON ENTRY) /FROM ADDRESS IN AC-COUNT(IN HALF WORDS) GTSXBT, HLT CLL RAL /DOUBLE POINTER ADDRESS TAD CNT /ADD NEGATIVE DISPLACEMENT CML RAR /GET WORD ADDRESS AGAIN DCA TEMP /SAVE IT TAD I TEMP /GET WORD SNL /SKIP IF WE WANT RIGHT HALF JMS ROTR6 /MAKE LEFT HALF RIGHT HALF AND (77 /GET LOW SIX BITS JMP I GTSXBT ROTR6, 0 RTR RTR RTR JMP I ROTR6 /THIS TAKES A SIX BIT CHAR IN AC AND CONVERTS /IT TO ASCII TO TYPE IT CONVTP, HLT SZA /CONVERT 0 TO BLANKS TAD (240 AND (77 TAD (240 JMS I (TYPE /TYPE IT JMP I CONVTP /TYPE TAKES A CHARACTER IN THE AC AND CALLS /TTY TO TYPE IT IF ^O IS NOT IN AFFECT /ALSO CHECKS FOR ^C AND ^P TYPE, HLT DCA READKB /SAVE CHARACTER JMS I (CINTER /SEE IF ^C SKP /NO JMP I (CTCDE /ABORT OPERATION IF ^C OR ^P TAD (217 /^O JMS I (CTYPE /SEE IF TYPED SKP /SKIP IF NOT DCA ECHO /CLEAR ECHO SWITCH TAD ECHO /IS ECHO IN EFFECT SNA CLA /SKIP IF YES JMP I TYPE /IGNORE CHARACTER IF ^O TAD READKB /TYPE CHAR JMS TTY JMP I TYPE TTY, 0 DCA TCHAR /SAVE CHAR TAD TCHAR /GET CHAR BACK /** NEXT 4 LOCATIONS REPLACED IF BATCH ACTIVE BY: TTYOUT, TLS /** SKP TSF /** 7400 /ADDRESS OF BATCH OUTPUT ROUTINE JMP .-1 /** CIF TOPFIELD CLA /** JMS I .-2 TAD TCHAR /GET CHAR AGAIN TAD (-215 /IF WE JUST TYPED A C.R. TYPE SZA CLA /A L.F. JMP I TTY TAD (12 JMP TTY+1 TCHAR, 0 /GET A CHARACTER FROM KEYBOARD AND /CHECK FOR ^C AND ^P READKB, HLT KSF JMP .-1 JMS I (CINTER /IS IT ^C SKP /SKIP IF NOT JMP I (CTCDE /YES KRB /READ IT AND (177 /AND GET RID OF TAD (200 /PARITY JMP I READKB /ROUTINE TO MAKE SURE USER SPECIFIED //C AND /O SWITCHES CAUSE CORRECT MATCH WITH DATE DATCHK, 0 TAD I (OPT1 /CHECK /C JMS MDATE NOP /RETURN HERE WITH AC=0 IF NO /C SZA CLA /RETURN HERE WITH AC=0 IF DATES MATCH JMP I (NENT /DATES DONT MATCH AND /C GIVEN TAD I (OPT2 /CHECK /V JMS MDATE CMA CLA /SET AC=-1 IF NO /V SNA CLA /RETURN HERE AC=0 IF DATES SAME JMP I (NENT /DATES SAME WITH /V-IGNORE FILE JMP I DATCHK /CONTINUE MDATE, 0 //O AND /V ARE AC2 RTL /IS IT OPTION ON? SMA CLA /SKIP IF IT IS JMP I MDATE /NO- RETURN WITH 0 AC ISZ MDATE /SKIP RETURN CDF 0 TAD I GPTR1 /GET DATE WORD CIA CDF 10 TAD I (SVDATE /COMPARE WITH MONITORS, 0 IF = JMP I MDATE ECHO, 1 PAGE /THIS IS THE CORE DEVICE HANDLER /THE USR IS MADE TO COME HERE BY A CALL TO FAKUSR. /THIS HANDLER SWAPS THE DESIRED BLOCK INTO /THE USR AREA AND WRITES THE BLOCK BACK INTO THE /INCORE DIRECTORY. /THE CODE SET UP IN FIELD 0 TO CALL THE HANDLER IS: / *FAKHND / 0 /ENTRY POINT / TAD FAKHND /GET RETURN ADDRESS / CIF CDF 10 / JMP I .+1 /PLOP UP TO BODY OF HANDLER IN FIELD 1 / FAKBDY FAKBDY, DCA RETLOC /SAVE ARGUMENT ADDRESS TAD I RETLOC /GET CONTROL WORD RAL /R/W BIT INTO LINK CLA RAL /R/W BIT INTO AC11 TAD DCAXR1 /IF WRITE MAKE DCA XR2 ELSE XR1 DCA DCASPT /SAVE WHERE WE NEED IT ISZ RETLOC /BUMP TO LOCATION (ALWAYS 1400 FROM USR) ISZ RETLOC /BUMP TO BLOCK NUMBER TAD I RETLOC /GET IT ISZ RETLOC /BUMP TO ERROR RETURN ISZ RETLOC /NOW TO GOOD RETURN (WE WONT FAIL) CLL RTR /MULTIPLY BY 400(8) RTR RAR TAD (4177 /ADD ON TO BEGINING OF DIRECTRY DCAXR1, DCA XR1 /SAVE IN BOTH XR1 TAD XR1 DCA XR2 /AND XR2 TAD (1377 /NOW SAVE USR BLOCK AREA DCASPT, HLT /IN EITHER XR1 OR XR2 (R OR W) TAD (-400 /SET WORD TRANSFER COUNT DCA CNT TAD I XR2 /GET A WORD DCA I XR1 /PUT A WORD ISZ CNT JMP .-3 JMP I RETLOC /GO BACK TO USR /THIS ROUTINE DOES THE SETUP OF THE INCORE /DIRECTORY HANDLER AND CHANGES THE REAL /HANDLERS ENTRY POINT IN THE MONITOR SO THAT /THE USR WILL CALL IT. FAKUSR, 0 DCA UNFAK /SAVE DEVICE NUMBER TAD UNFAK /INDEX INTO MONITORS RESIDENCY TAD (7646 /TABLE DCA TABAD TAD WRTDIR /SEE IF DEVICE HAS DIRECTORY SPA CLA /SKIP IF IT DOES JMP NOSUBST /!!!DONT CHANGE IF NON-FILE DEV TAD (FAKHND /PUT OUR HANDLERS ADDRESS IN DCA I TABAD /MONITORS TABLE NOSUBST,CDF 0 TAD (1200 /PUT IN HANDLER INTERFACE CODE DCA I (FAKHND+1 /INTO FIELD 0 AS GIVEN ABOVE TAD (CIF CDF 10 DCA I (FAKHND+2 TAD (5604 DCA I (FAKHND+3 TAD (FAKBDY DCA I (FAKHND+4 CDF 10 TAD UNFAK /RETURN WITH DEVICE NUMBER IN AC JMP I FAKUSR UNFAK, 0 CLA /V3C TAD OUHAND /RESET MONITORS TABLE TO DCA I TABAD /POINT TO REAL HANDLER DCA TABAD /V3C JMP I UNFAK TABAD, 0 RETLOC, 0 /ENTER HERE IF A BRANCH TO 7600 OR 7605 OCCURS FIXDIR, JMS UNFAK /JUST IN CASE JMS I (CINTER /CHECK FOR ^C NOP AC4000 /EITHER WAY GO BACK TO DCA I (ALTOPT /MONITOR BUT AFTER WE HANDLE DIRECTORY CTCDE, TAD MUSTWT /IS MUST WRITE SET? SNA CLA /SKIP IF /Q OR MUST WRITE TAD WRTDIR /CHECK TO SEE IF WE HAVE TO SPA SNA CLA /WRITE THE DIRECTORY JMP ENDCHK /CONTINUE DCA WRTDIR /KEEP OLD DIRECTORY JMS I (ERROR /TELL HIM DSVED+40 ENDCHK, ISZ I (ECHO /TURN ON ECHO JMS DIROUT /WRITE OUT THE OUTPUT DIRECTORY JMS I (RESTORE /RESTORE 7600 IN FIELD 0 TAD I (OPT2 /GET OPTION /W RTR SNL CLA /SKIP FOR VESION NUMBER JMP NOVER DCA I (OPT2 /STOPS RECUSION WITH ^P JMS I (ERROR /PRINT VERSION NUMBER VERNO+40 TAD (215 JMS I (TYPE NOVER, TAD I (ALTOPT /GO BACK TO MONITOR? SMA CLA /SKIP IF YES JMP I (CDCALL /CALL THE CD AGAIN CIF CDF 0 /RETURN TO MONITOR JMP I (7605 MUSTWT, 0 SVDATE, 0 WRTDIR, 0 DIROUT, 0 /ROUTINE TO WRITE THE OUTPUT DIRECTORY TAD WRTDIR /AC>0 IF WE HAVE TO WRITE IT SPA SNA CLA /SKIP TO WRITE DIRECTORY JMP I DIROUT CIF 0 JMS I OUHAND /WRITE DIRECTORY BACK ONTO DEVICE 5410 4600 1 JMP I (ODERR /IS HE IN TROUBLE... DCA WRTDIR /CLEAR WRITE DIRECTORY FLAG JMP I DIROUT /RETURN PAGE /ROUTINE WHICH ECHOES ^(CHAR) AND SKIP RETURNS IF /ONE WE WANTED CTYPE, 0 DCA T2 /SAVE CHARACTER TAD (200 /GT RID OF PARITY KRS /SEE WHATS IN BUFFER CIA TAD T2 /COMPARE AGAINST DESIRED ONE SNA CLA /SKIP IF NOT ONE KSF /IS FLAG UP? JMP I CTYPE /NO... JUST RETURN KCC /CLEAR CHARACTER TAD ("^ /OUTPUT ^ JMS I (TTY TAD T2 TAD (100 /CHAR JMS I (TTY TAD (215 JMS I (TTY ISZ CTYPE /SKIP RETURN JMP I CTYPE T2, 0 /ROUTINE USED TO DETERMINE IF ^C OR ^P TYPED CINTER, 0 TAD (203 /CHECK FOR ^C JMS CTYPE JMP UPPCK /NO CHECK FOR ^P JMP SPURGE /YES SET ALTMODE BIT UPPCK, TAD (220 JMS CTYPE JMP I CINTER /NOT EITHER ^P OR ^C SKP /IF ^P CLEAR ALTMODE BIT SPURGE, CMA /SET BIT DCA I (ALTOPT ISZ CINTER /SKIP RETURN JMP I CINTER /THIS ROUTINE MODIFIES THE THE MONITOR RETURN /LOCATIONS TO COME BACK TO FOTP AND SAVES WHAT /WAS THERE SO RESTORE CAN RESTORE THEM INTERC, 0 TAD I (DATE DCA I (SVDATE /SAVE MONITOR DATE CDF 0 TAD I (7600 /SAVE 7600,7601,7602,7605 DCA SCODE /AND REPLACE WITH TAD (CIF CDF 10 /CIF CDF 10 DCA I (7600 /JMP I .+1 TAD I (7601 /FIXDIR DCA SCODE+1 /7605 GETS JMP 7600 TAD (5602 /THIS ENABLES FOTP TO WRITE DCA I (7601 /OUT DIRECTORY AN MANUAL ABORT TAD I (7602 /OR IF HANDLER PICKS UP ^C DCA SCODE+2 /AND TRIES TO GO TO MONITOR TAD (FIXDIR DCA I (7602 TAD I (7605 DCA SCODE+3 TAD (5200 DCA I (7605 CDF 10 JMP I INTERC /THIS ROUTINE SIMPLY RESTORES THE MONITOR /LOCATIONS TO THEIR ORIGINAL VALUE RESTORE,0 TAD I (SVDATE /RESTORE DATE DCA I (DATE CDF 0 TAD SCODE DCA I (7600 /RESTORE LOCATIONS TAD SCODE+1 DCA I (7601 TAD SCODE+2 DCA I (7602 TAD SCODE+3 DCA I (7605 CDF 10 JMP I RESTORE SCODE, 0;0;0;0 /THIS IS THE MAGIC MESSAGE PRINTER /IT IS ACTUALLY USED MORE THAN JUST FOR ERROR MESSAGES /IF THE MESSAGE ENDS WITH A % THEN THE OPERATION /IS ABORTED OTHERWISE CONTROL IS RETURNED /TO THE CALLER AND NO CRLF IS GIVEN /ALL MESSAGES COMMING THROUGH HERE ARE ECHOED ERROR, 0 CLA CLL /JUNK MIGHT BE IN AC TAD I (ECHO /SAVE ECHO STATUS SO WE CAN DCA I (ECTMP /RESTORE IT AFTER MESSAGE ISZ I (ECHO /TURN ON ECHO TAD (-100 /USED SO WE CAN USE GTSXBT TO DCA CNT /UNPACK THE MESSAGES PLOOP, TAD I ERROR /CONTAINS ADDRESS OF MESSAGE CDF 0 /IN FIELD 0 JMS I (GTSXBT /GET CHARACTER CDF 10 TAD (-45 /IS IT % SNA /SKIP IF NOT JMP CRLF /WE HIT EOM AND CALLER NO WANT CONTROL TAD ("%&77 /RESTORE CHARACTER DCA DFLAG /SAVE IT FOR LATER TAD DFLAG /PRINT IT, 0 PRINTS AS BLANK JMS I (CONVTP ISZ CNT /BUMP TO NEXT CHAR IN MESSAGE TAD DFLAG /ARE WE AT END SZA CLA /SKIP IF WE ARE JMP PLOOP /DO ANOTHER CHARACTER ISZ ERROR /SKIP ADDRESS OF MESSAGE JMP I ERROR /RETURN CRLF, TAD (215 /PRINT CR JMS I (TYPE /LF JMP I (ENDCHK /FINISH PROCESSING DFLAG, 0 PAGE /THIS ROUTINE PRINTS A FILENAME.EXTENSION PNMSUB, 0 DCA NMEPLC /SAVE ADDRESS OF NAME TAD (-10 /SET CHAR COUNT DCA CNT PNLOOP, TAD NMEPLC /GET THE SIXBIT CHAR JMS I (GTSXBT SZA /SKIP IF NULL CHAR JMS I (CONVTP /PRINT CHAR TAD (3 /SEE IF AT START OF TAD CNT /EXTENSION SZA CLA /SKIP IF SO JMP .+3 TAD (". /PRINT THE DOT JMS I (TYPE ISZ CNT JMP PNLOOP /KEEP GOING JMP I PNMSUB NMEPLC, 0 ECTMP, 0 RDERR, JMS I (ERROR INERR+40 /ERROR READING FILE DYSTF1, TAD (SPOT1+4 /PRINT INPUT FILE NAME DYSTUF, JMS I (PNMSUB TAD (215 JMS I (TYPE TAD ECTMP /RESTORE ECHO FLAG AS DCA I (ECHO /SAVED ON ENTRY TO ERROR JMP I (NENT /GO TO NEXT FILE WRTERR, JMS I (ERROR OUERR+40 /ERROR WRITING FILE POUTNM, TAD (SPOT+4 /PRINT OUTPUT FILE NAME JMP DYSTUF NORUMX, JMS I (ERROR /NOT ENOUGH ROOM FOR SPRBLM+40 /FILE ON OUTPUT DEVICE JMP DYSTF1 /ROUTINE WHICH PRINTS NO FILES MSG IF NECESSARY /IT WONT PRINT MESSAGE IF ANY FILE IN A SO CALLED /INPUT GROUP MATCHES(A BUG?) SAYNON, TAD I (TYPFND /GET INPUT MATCH FLAG SZA CLA /SKIP IF NOTHING MATCHED JMP GOBCK /DONT DO MESSAGE TLP, JMS I (ERROR /PRINT MESSAGE NOFILE+40 TAD INFPTR /POINT TO END OF INPUT ENTRY TAD (5 /TO MAKE GTSXBT WORK CORRECTLY DCA INFPTR TAD INFPTR /PRINT THE FILE NAME JMS I (PNMSUB TAD (OTAB-2 /NOW PRINT /V,/C,/O IF DCA XR2 /ANY OF THEM SPECIFIED NOPT1, ISZ XR2 /FIX POINTER WHEN SWITCH NOT ON NOPT, TAD I XR2 /GET ADDRESS OF OPTION SNA /SKIP IF NOT AT END JMP CRIT /WE ARE AT END DCA TEMP TAD I TEMP /GET OPTION WORD AND I XR2 /AND WITH OPTION BIT SNA CLA /SKIP IF OPTION GIVEN JMP NOPT1 /DO ANOTHER TAD ("/ /PRINT / JMS I (TYPE TAD I XR2 /OPTION JMS I (TYPE JMP NOPT /DO ANOTHER CRIT, TAD (215 /END WITH A CRLF JMS I (TYPE TAD ECTMP /RESTORE ECHO FLAG THAT ERROR DCA I (ECHO /SAVED ISZ INSCNT /PRINT MESSAGE FOR ALL FILES JMP TLP /IN GROUP GOBCK, TAD I (USEROD /GET USER SPECIFIED DEVICE SNA CLA /SKIP IF HE GAVE ONE TAD I (SDFLG /IF HE DIDNT WE CANT HANDLE /D SPA CLA /SKIP IF NO /D TAD I MOIN /YEP. /D BETTER NOT BE ANY MORE INPUT SZA CLA /THERE WASN'T - O.K. JMP DELERR /WARN HIM OF THE SHORTCOMING TAD MOIN /GET SAVED INPUT POINTER JMP I (DOMOIN /AND DO SOME MORE INPUTS DELERR, JMS I (ERROR CNTDEL+40 /MULTIPLE DEVICE DELETE TAD (215 JMS I (TYPE JMS I (ERROR CNTDE2+40 USEROD, 0 MOIN, 0 /TABLE OF SWITCHES FOR "NO FILES" MESSAGE OTAB, OPT2 4 "V OPT1 1000 "C OPT2 1000 "O 0 PAGE /THIS ROUTINE HANDLES THE /L AND /Q OPTIONS /IF EITHER IS ON IT PRINTS THE NAME /THEN IF ITS /Q IT PRINTS A ? AND WAITS FOR /A RESPONSE. IF Y IT RETURNS, ANYTHING ELSE /AND IT GOES TO PROCESS THE NEXT DIRECTORY ENTRY PRINTE, 0 DCA I (NMEPLC /SAVE ADDRESS OF NAME TAD I (OPT1 /CHECK /L RAR SZL CLA /SKIP IF NO /L JMP PIT /PRINT NAME TAD I (OPT2 /CHECK /Q AND (200 SNA CLA /SKIP IF /Q JMP I PRINTE /RETURN ISZ I (ECHO /IF /Q FORCE ECHO ON PIT, TAD I (NMEPLC /NOW PRINT FILENAME JMS I (PNMSUB DCA OKFLAG /CLEAR OKFLAG TAD I (OPT2 /WAS IT /Q? AND (200 SNA CLA /SKIP IF /Q JMP FUNCT2 /JUST PRINT CRLF TAD ("? /PRINT ? JMS I (TYPE CMA /SET OKFLAG NO GOOD DCA OKFLAG JMS I (READKB /GET A CHAR TAD (-"Y /IS IT Y? SNA CLA /SKIP ON NO ISZ OKFLAG /IT WAS Y, SET OK AND SKIP TAD ("N-"Y /GET N TAD ("Y /GET Y JMS I (TYPE /ECHO IT FUNCT2, TAD (215 /PRINT CRLF JMS I (TYPE TAD OKFLAG /OKFLG=0 MEANS YES SZA CLA /SKIP IF TO PROCESS FILE JMP I (NFUNCT /SKIP THIS FILE JMP I PRINTE /RETURN ODERR, CLA DCA I (WRTDIR /FIX RECURSION JMS I (ERROR ODIERR+40 /ERROR WRITING DIRECTORY BODIR, JMS I (ERROR BODORM+40 /BAD OUTPUT DIRECTORY CLOERR, JMS I (ERROR SERR+40 /SYSTEM ERROR HLT /DONT LET HIM CONTINUE JMP .-1 /IT CAN ONLY GET WORSE SPOT, ZBLOCK 4 /ROOM FOR OUTPUT FILE NAME SPOT1, ZBLOCK 4 /ROOM FOR INPUT FILE NAME /CODE TO HANDLE OUT OF ROOM CONDITION ON OUTPUT DEVICE NOROOM, JMS I (UNFAK /RESTORE THE REAL OUTPUT HANDLER TAD I (OPT1 AND (100 /CHECK FOR THE /F OPTION SPECIFIED SNA CLA JMP I (NORUMX /NO - GIVE AN ERROR MESSAGE JMS I (DIROUT /FAILSAFING - WRITE OUT THE OUTPUT DIRECTORY JMS I (ERROR /PRINT THE MESSAGE FLSFMS+40 /"MOUNT NEXT OUTPUT VOLUME" JMS I (READKB /GET AN ANSWER CLA /ANY CHAR EXCEPT ^C OR ^P IS YES TAD (215 JMS I (TYPE /PRINT CRLF JMS ODIRIN /READ IN THE NEW OUTPUT DIRECTORY JMP I (FLSRSM /RECOMPUTE THE PENDING TRANSFER. ODIRIN, 0 /SUBROUTINE TO READ IN THE OUTPUT DIRECTORY TAD I (7600 /GET OUTPUT DEVICE NUMBER SNA /IS IT PRESENT? JMP NOUTFL /NO - DON'T READ OUTPUT DIRECTORY TAD (7757 /ADD ADDRESS OF MONITOR TABLE DCA TEMP /TO INDEX INTO IT TAD I TEMP /FILE STRUCTURED BIT IS 0 SMA CLA /SKIP IF DIRECTORY DEVICE JMP NOUTFL /WE DONT WANT TO READ OR WRITE DIRECTORY CIF 0 JMS I OUHAND /READ DIRECTORY 1410 ODBUF, OUBUFR 1 JMP I (ONDERR /ERROR TAD I ODBUF CMA CLL /CHECK FOR LEGAL OUTPUT DIRECTORY - FIRST TAD I (OUBUFR+2 /WORD OF AN OS/8 DIRECTORY IS .LT. 50 SNL /AND THE THIRD WORD MUST BE .LT. 7, TAD (-107 //DSN 21.19.1 AUG 78 TO ALLOW 71 (D) ENTRIES/SEGMENT /SO WE CAN CHECK FOR THE SUM OF THOSE SZL CLA /WORDS BEING .LT. 64 JMP I (BODIR /ERROR - CANT BE DIRECTORY SKP NOUTFL, AC4000 /WRTDIR MINUS MEANS DONT WRITE DCA I (WRTDIR /DIRECTORY DCA I (MUSTWT /CLEAR THE MUST WRITE FLAG DCA DIRKEY /CLEAR THE OS/8 DIRECTORY KEY JMP I ODIRIN /RETURN PAGE /SUBROUTINE TO DO LOOKUPS ON OUTPUT DEVICE /DOES IMMEDIATE RETURN IF NO OUTPUT DEVICE /OTHERWISE RETURNS WITH BLOCK OF FILE IN AC OR /0 IN AC MEANING NOT FOUND OR NON-FILE STRUCTURED DEVICE LOOKUP, 0 TAD (SPOT /ADDRESS OF FILE NAME DCA PLACE TAD I (7600 /GET OUTPUT DEVICE SNA /SKIP IF PRESENT JMP I LOOKUP /NO OUTPUT DEVICE JMS I (FAKUSR /FAKE OUT THE USR JMS I (200 2 /LOOKUP PLACE, SPOT 0 DCA PLACE /NOT FOUND, 0 PLACE JMS I (UNFAK /RESTORE RESIDENT HANDLER ISZ LOOKUP /SKIP RETURN TAD PLACE /WITH BLOCK IN AC JMP I LOOKUP /HERE IS WHAT WE HAVE ALL BEEN WAITING FOR ////////////////////////////////////// / / / RENAME / / / ////////////////////////////////////// RENAME, JMS LOOKUP JMP I (CLOERR /SUPER SYSTEM DISASTER DCA OBLOCK /V3C SAVE BLOCK OF NEW NAME (IF ANY) TAD (SPOT1-SPOT /LOOKUP INPUT FILE JMS LOOKUP JMP I (CLOERR /SUPER SYSTEM DISASTER CIA /LOOKUP INPUT NAME ON OUTPUT DEVICE TAD OBLOCK /IS IT SAME SPOT AS NEW NAME ON OUTPUT DEVICE? SZA CLA /V3C JMS EXERR /NO, MAYBE ALREADY EXISTS TAD I (1404 /GET ADDRESS OF FILE TAD 17 /FROM MONITOR BY THE TAD (-4 /DOCUMENTED METHOD DCA TEMP TAD (SPOT-1 /GET NEW OUTPUT NAME DCA XR1 TAD (-4 /SET UP COUNT OF WORDS TO MOVE DCA CNT RNAM, TAD I XR1 /MOVE THEM DCA I TEMP ISZ TEMP ISZ CNT JMP RNAM /CONTINUE TILL DONE TAD I (1404 /V3C SNA CLA /BUT IS THERE ROOM FOR DATE? JMP NONUDA /NO, NO ADDITIONAL INFO WORDS TAD I (DATE /YES, MOVE DATE DCA I TEMP /INTO NEW FILENAME ENTRY NONUDA, JMS WRKEY /V3C ISZ I (WRTDIR /INDICATE DIRECTORY CHANGED JMP I (NFUNCT /DO NEXT FILE WRKEY, 0 /V9 TAD DIRKEY /GET "SEGMENT IN CORE" KEY AND (7 /ISOLATE SEGMENT NUMBER DCA SEGNO /NUMBER FOR WRITE CIF 0 JMS I 51 /CALL HANDLER USR USED TO DO 4210 /LOOKUP, THIS POINTS TO FOTPS 1400 /INCORE DIRECTORY HANDLER SEGNO, 0 /REWRITE UPDATED DIRECTORY BLOCK JMP I (CLOERR /SYSTEM ERROR JMP I WRKEY EXERR, 0 /BLOCK NUMBERS DIFFERENT TAD OBLOCK /LOOK AT BLOCK NUMBER OF EXISTING FILE SNA CLA /DID IT REALLY EXIST? JMP I EXERR /NO, OK TO RENAME TO THIS NAME JMS I (ERROR /YES, TRYING TO RENAME TO EXISTING NAME RENERR+40 /FILE ALREADY EXISTS JMP I (POUTNM OBLOCK, 0 /TEMPORARY, HOLDS BLOCK NUMBER OF ALREADY /EXISTING FILE WITH SAME NAME AS PROPOSED NEW NAME /ON OUT PUT DEVICE (OR 0 IF NONE) /THIS ROUTINE TRANSFERS THE ADDITIONAL /INFORMATION WORDS OF THE INPUT FILE WHEN COPYING /IT IF THERE ARE ANY ADDINF, 0 CLA IAC /AC=1 TAD I (1404 /GET NUMBER OF WORDS FROM OUTPUT DIRECTORY SMA /SKIP IF 2 OR MORE JMP NOTRAN /WE DONT TOUCH IT DCA LOOKUP /SAVE NEGATIVE NUMBER TO MOVE TAD LOOKUP /ADD NUMBER TO LOC 17 TAD 17 /TO FIND ADDR(SECOND) DCA PPTR1 /USE 17 TAD INFWDS /GET NUMBER OF AIW IN INPUT CIA /NEGATE IAC /ADD 1 SMA /SKIP IF MORE THAN 1 AIW JMP ZEROUT /ZERO OUTPUT AIW DCA TEMP /SAVE COUNT MOVEM, ISZ GPTR1 /BUMP PTR (1ST TIME PAST DATE) CDF 0 TAD I GPTR1 /GET WORD ZLOOP, CDF 10 DCA I PPTR1 /PUT IT INTO OUTPUT DIRECTORY ISZ PPTR1 ISZ LOOKUP /HAS OUTPUT COUNT OVERFLOWED? JMP MORE /MORE OUTPUT TO DO JMS WRKEY /V9 NOTRAN, CLA /EXIT JMP I ADDINF /WERE DONE MORE, ISZ TEMP /BUMP INPUT COUNT JMP MOVEM /IT HASNT OVERFLOWED ZEROUT, CLA CMA /NO MORE INPUT WORDS- DCA TEMP /SO FIX UP TO ZERO REST OF OUTPUT WORDS JMP ZLOOP /DO ALL THE OUTPUTS PPTR1, 0 PAGE /** THIS IS THE STARTING ADDRESS OF FOTP!!! FOTP, JMS INIT /REGULAR ENTRY POINT JMS INIT /CHAIN ENTRY POINT JMP I (CDCALL /CALL COMMAND DECODER JMP I (BYPSCD /DONT CALL COMMAND DECODER INIT, 0 ISZ INIT /DO SKIP RETURN CLA CLL CDF 0 TAD I (7777 /GET BATCH CONTROL WORD AND (70 TAD FCIF0 /FORM CIF TO BATCH FIELD DCA BATCIF TAD I (7777 CDF 10 RTL SNL CLA /BATCH RUNNING? JMP NOBTCH /NO BMOVLP, TAD BATOUT DCA I TTOUTP /MOVE IN SUBSTITUTE TTY OUTPUT CODE ISZ BMOVLP ISZ TTOUTP ISZ TTCNT4 JMP .-5 STA NOBTCH, DCA CORFUJ / =0 IF NO BATCH, -1 IF BATCH MOVMSG, TAD I ONCE /MOVE MSGS TO LOWER FIELD CDF 0 DCA I ONLY CDF 10 TAD I M1 CDF 0 /MOVE CORE DETERMINER DCA I M1 /INTO FIELD 0 ALSO CDF 10 ISZ M1 ISZ ONCE ISZ ONLY ISZ CODE JMP MOVMSG TAD (2000 /SET RESTART LOCATION CDF 0 DCA I (7745 TAD (6403 /SET JSW DCA I (7746 CDF 10 FCIF0, CIF 0 JMS I (CORE TAD CORFUJ /COMPUTE AMOUNT OF CORE EXCLUDING BATCH FIELD TAD (-1 SZA CLA /SKIP IF WE HAVE ONLY 8K (OR 12K AND BATCH) JMP I INIT TAD (TAD EPTR /PATCH LOCATIONS IN FOTP DCA I (F2C1 /TO WORK WITH ONLY 8K TAD (NOP DCA I (F2C2 JMP I INIT /START M1, .&7600 ONCE, MSGS ONLY, LSTFPG+200 CODE, 7400 CORFUJ, 0 TTCNT4, -4 TTOUTP, TTYOUT BATOUT, SKP /OUTPUT TO BATCH LOG 7400 BATCIF, HLT TTYOUT+1&177+4600 /JMS I .-2 /SUBR TO DETERMINE MACHINE SIZE - RETURNS NUMBER OF /BANKS IN AC. /MUST RUN IN FIELD 0. CORE, 0 TAD C6203 RDF DCA CORRTN CDF 0 TAD I (7777 AND (70 SNA /DOES LOCATION 7777 SPECIFY CORE SIZE? JMP CORELP /NO CLL RTR /YES - BELIEVE IT. RAR JMP CORRTN CORELP, CDF 0 /NEEDED FOR PDP-8L TAD TRYFLD /GET FLD TO TST CLL RTL RAL AND COR70 /MASK USEFUL BITS TAD CORELP DCA .+1 /SET UP CDF TO FLD COR706, 0 TAD I CORLOC /SAV CURRENT CONTENTS NOP /HACK FOR PDP-8 DCA .-3 TAD .-2 /7000 IS A GOOD PATTERN DCA I CORLOC COR70, 70 /HACK FOR PDP-8.,NO-OP TAD I CORLOC /TRY TO READ BK 7000 7400 /HACK FOR PDP-8,.NO-OP TAD .-1 /GUARD AGAINST WRAP AROUND TAD CORLOC+1 /TAD 1400 SZA CLA JMP .+5 /NON EXISTENT FLD EXIT TAD COR706 /RESTORE CONTENS DESTROYED DCA I CORLOC ISZ TRYFLD /TRY NXT HIGHER FLD JMP CORELP STA TAD TRYFLD CORRTN, 0 JMP I CORE CORLOC, COR70+2 /ADR TO TST IN EACH FLD 1400 /7000+7400+1400=0 TRYFLD, 1 /CURRENT FLD TO TST C6203, 6203 PAGE /FOTP'S ERROR MESSAGES /THESE RESIDE IN FIELD 0 LOCATIONS 7200-7577 MSGS, NOPUNCH *LSTFPG+200 ENPUNCH ILLQ, TEXT /ILLEGAL ?%/ ILLA, TEXT /ILLEGAL *%/ SERR, TEXT /SYSTEM ERROR/ RENERR, TEXT /ALREADY EXISTS-/ VERNO, 0617;2420;4026 /FOTP V VERLOC, VERSION+60^100+SUBVER /ONE-DIGIT VERSION NUMBER AND 1 CHAR PATCH LEVEL 0 BADIRD, TEXT /ERROR READING INPUT DIRECTORY%/ ODRERR, TEXT /ERROR READING OUTPUT DIRECTORY%/ ODIERR, TEXT /ERROR WRITING OUTPUT DIRECTORY%/ SPRBLM, TEXT /NO ROOM, SKIPPING-/ INERR, TEXT /ERROR ON INPUT DEVICE-SKIPPING-/ OUERR, TEXT /ERROR ON OUTPUT DEVICE-SKIPPING-/ NFLEIN, TEXT /USE PIP FOR NON-FILE STRUCTURED INPUT%/ NOFILE, TEXT /NO FILES OF THE FORM:/ BIDIRM, TEXT /BAD INPUT DIRECTORY%/ BODORM, TEXT /BAD OUTPUT DIRECTORY%/ CNTDEL, TEXT /DELETES PERFORMED ONLY ON INPUT DEVICE GROUP 1/ CNTDE2, TEXT /CAN'T HANDLE MULTIPLE DEVICE DELETES%/ DSVED, TEXT /ORIGINAL DIRECTORY PRESERVED%/ FLSFMS, TEXT /MOUNT NEXT OUTPUT VOLUME:/ FIELD 1 /SELF-STARTING BINARY LOADER STUFF FOR ABSLDR *FOTP $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 | /FUTIL - FILE UTILITY - V08A DECIMAL VERSION=08 OCTAL PATCH="B&77 / OS/8 FILE UTILITY PROGRAM. ALLOWS EXAMINATION AND / MODIFICATION OF OS/8 MASS STORAGE DEVICES FROM THE CON- / SOLE. DUMPING OF BLOCKS, LISTING OF WORDS AND MODIFICA- / TION OF WORDS CAN BE DONE IN 7 FORMATS: OCTAL; SIGNED AND / UNSIGNED DECIMAL; UNPACKED, 6-BIT PACKED, XS240 PACKED AND / OS/8 PACKED ASCII. LISTING AND DUMPING CAN ALSO BE DONE / IN 5 MORE FORMATS: BCD, BYTE (OCTAL CHARACTER), 2 PSEUDO- / SYMBOLIC FORMATS [PDP-8 & FPP-12/8A], AND A COMBINATION / FORMAT FOR DIRECTORY DUMPING. PROGRAM USES BOTH COMMAND / WORDS AND COMMAND CHARACTERS (LIKE ODT) FOR DIRECTION. /BY: JIM CRAPUCHETTES / MENLO COMPUTER ASSOCIATES, INC. / (FORMERLY: FRELAN ASSOCIATES) / P.O. BOX 298 / MENLO PARK, CALIF. 94025 / / /VERSIONS 1 THRU 4 - "XTAPE" FOR THE XSYSTEM, / LAST REVISION--APRIL 1970. / /VERSION 5 - OS/8 OPERATION, JULY 1972 THRU JUNE 1976 / "(...)", "C & 'CC AS NUMBERS, IOT DECODING, LIST / & DUMP FORMATS, OUTPUT TO LPT:, FILE DATE & LOC / IN DIRECTORY, "WORD MEMREF...", BCD OUTPUT, / ADDITIONAL ODT OUTPUTS, "BYTE" OUTPUT. /VERSION 6 - EXPANSION OF OS/8 OPERATION, JUNE 1976: / "FILLER" FOR "MODIFY", SEARCH LIMITS CHANGE, "WRITE" / WITH AN ARGUMENT, FPP INSTRUCTION DECODING, CHAINING / SUPPORT (FOR CCL CALLS), LOAD MODULE HANDLING AND / "SHOW HEADER", MULTIPLE DEFAULT EXTENSIONS, ^R FOR / RETYPE, SET REPLACES OPTION, NEW OUTPUT ROUTINE FOR / "DIRECTORY" FORMAT, LINK OVERLAY HANDLING, ODT CHANGES, / EXIT, SCAN, WRITE LOCKED OPERATION, SPEED UP SEARCHES, / XS240 FORMATS /VERSION 6.17 - APR 1, 1977; BATCH OPERATION, COMMENT /VERSION 6.20 - MAY 16, 1977; NEW DATE, FULL FILE OUTPUT / (SET/SHOW DDEV, OPEN ..., CLOSE), OPT ":" ON DEVICES. /VERSION 6.21 - JUN 4, 1977; NEW INPUT ROUTINE, TEMP STORAGE /VERSION 6.22 - JUL 13, 1977; CRTL-Q & -S, SCOPE MODE, / IF/END COMMANDS, ALPHA DATE. / /PREVIOUS VERSIONS HAVE BEEN AVAILABLE THROUGH DECUS, / DEC SUPPORT BEGINS WITH VERSION 7 - 20-JUL-77. / VERSION 7 PATCHES: / 1.CTRL/U CRASH & OVERLAY MAPPING IN SAVE MODE(7A TO 7B) / 2.FIXED SHOW CCB PROBLEM(7B TO 7C) / 3.ODT MAPPING ON LD. MODULES(7C TO 7D) / 4.ADDED SHOW CCB SUPPORT FOR KT8A SAVE IMAGES(7D TO 7E) / SOME ROUTINES AND IDEAS USED IN THIS PROGRAM WERE / DERIVED FROM EDIT-8 AND FOCAL, BY RICK MERRILL, DEC. / THE ODT COMMAND SET IS NEARLY IDENTICAL TO THE OS/8 / ODT COMMAND SET EXCEPT THAT 15 BIT ADDRESSES ARE USED / EVERYWHERE AND THERE ARE NO COMMANDS FOR PROGRAM EXECU- / TION. / THE DOUBLE PRECISION ARITHMETIC ROUTINES ARE A MUCH / MODIFIED VERSION OF DECUS 8-115A. / 9-DEC-2018 LHN / DSN 35.13.1 applied here to correct the starting address / and job status word when assembling Futil. / / ASSEMBLY INFORMATION: / / .R PAL8 [VERSION 9] / *FUTIL<FUTIL/L/K/P;06400=0400$ / .SA ... FUTIL / / THE LISTING FILE REQUIRES ABOUT 725 BLOCKS, THE BIN- / ARY FILE ABOUT 35 BLOCKS AND THE CREF LISTING FILE ABOUT / 960 BLOCKS. CREFING REQUIRES EITHER "/M" OR "/X" FOR / CREF V3. /MEMORY ALLOCATION: / /00000-06310 PROGRAM PROPER /06310-06577 ARGUMENT STRING BUFFER /06400-06777 --- ONCE ONLY CODE FOR CHAIN --- /06600-07177 DDEV HANDLER AREA, 2 PAGES /07200-07577 DEVICE HANDLER AREA, 2 PAGES / /10000-11777 USR AREA & ERROR MESSAGES (SWAPPED) /12000-12377 CCB/HEADER CODE, OPEN, CLOSE & OUTPUT /12600-15700 TEXT STRINGS, LISTS /15700-16377 STRING MASK, COMMAND BUFFERS, PDL /16400-16577 CCB BUFFER, 1 PAGE /16600-17177 DDEV BUFFER, 2 PAGES /17200-17577 I/O BUFFER, 2 PAGES /PAGE 0: POINTERS, CONSTANTS, VARIABLES, SWITCHES, ADDRESSES *0 OVLFLG, 0 /OVERLAY FLAG FOR SAVE FILES DPSGN, 0 LASTOP, 0 THISOP, 0 ZBLOCK 3 /USED BY ODT /VARIABLES & SWITCHES PDLPT, 0 /P.D.L. POINTER DPNT, RUBO-1 /USED UNIVERSALLY (SCOPE INITIALIZATION) SPNT, SCOPLS-1 /USED BY 'XSTRIN', 'XSMASK', 'READ', 'TERMT' SCANX1, BATLS-1 /USED BY 'SORTJ' (BATCH INITIALIZATION) SCANX2, 0 /USED BY 'XSTRIN' GETPNT, 0 /USED BY 'GET' & 'BKLOC' COMIR, 0 /USED FOR USER LINE INPUT COMOUT, COMB-1 /USED FOR USER LINE SCAN TYPSW, 0 /ODT COMMAND OCT-SYM SWITCH (0=OCT) ERMODE, 0 /ERROR MESSAGE MODE SWITCH (0=LONG) TEMP, 0 TEMP1, 0 TEMP2, 0 TEMP3, 0 ACC1, 0 /24 BIT ACCUMULATORS ACC2, 0 ACCX1, 0 ACCX2, 0 NAM1= ACC1 /DEFINITIONS FOR NAME BUFFER: NAM2= ACC1+1 / THESE LOCATIONS ARE USED FOR A NAM3= ACC1+2 / 6 CHARACTER FILE (OR DEVICE) NAM4= ACC1+3 / NAME & A 2 CHAR EXTENSION. OPER1, 0 OPER2, 0 TEMPV1, 0 /24 BIT TEMPORARY STORAGE FOR TEMPV2, 0 / "SET TEMP ..." & "EVAL T" CHAR, 0 CNT, 0 CNTR, 0 CNTRA, 0 NCNT, 0 /LINE POSITION COUNTER FCNT, 0 /FORMAT NUMBER (INIT TO PACKED ASCII) OUTPNT, PACOUT /POINTER TO DEFAULT OUTPUT ROUTINE MODSW, 0 /MODES: NORMAL=0,MAPPED=+,OFFSET=-. CHARSW, 0 /CHARACTER PACK & UNPACK SWITCH CRSWT, 0 /= -1 IF GWORD TERMINATOR WAS A SPACE SHUT, 0 /= -1 IF SOMETHING OPEN MODIF, 0 /= -1 IF SOMETHING WAS MODIFIED ABSSW, 0 /ABSOLUTE OR RELATIVE LOCATION FOR SEARCHES DSWIT, 0 /DUMP SWITCH: "DUMP","LIST" & "SHOW ERR" -> 1 DMODE, 0 /DUMP MODE: NONE=0,PART=1,ALL=4000 CBLK, 0 /= CURRENT BLOCK 0 /DUMMY FOR "SHOW ABS" CAD, 0 /= CURRENT ADDRESS (0 -> 377)+IOBUF BLK, 0 /= "BLOCK" LOCH, 0 LOCL, 0 /= "LOCATION" (DISPLACEMENT) UBLK, 0 /UPPER LIMIT FOR SEARCHES ULOCH, 1 ULOCL, 7577 LBLK, 0 /LOWER LIMIT FOR SEARCHES LLOCH, 0 LLOCL, 200 SBLK, 0 /"LOCATION" FOR "ODT" ROUTINES SLOCH, 0 SLOCL, 0 OFFSET, 0 /OFFSET FILLER, 0 /FILLER CONSTANT FOR "MODIFY" MASK, -1 /MASK FOR WORD SEARCH SMASKL, -1 /= -(LENGTH OF SMASK) RBLK1, 0 /START BLOCK OF FILE DEVAD, 7607 /DEVICE ENTRY ADDR (INIT TO "SYS") DEVNO, 1 /DEVICE NUMBER (INIT TO "SYS") USRAD, 7700 /USR ADDRESS, INITIALIZED TO OUT /7700=MSGS IN; 0=NONE IN; 200=USR IN /CONSTANTS M400, -400 M240, -240 M215, -215 M200, -200 M100, -100 M20, -20 M10, -10 M1, -1 N7, 7 N15, 15 N20, 20 N77, 77 N177, 177 N200, 200 N377, 377 N7000, 7000 N7400= M400 /ADDRESSES READLN= JMS I . /GET NEXT INPUT LINE, WITH READ / SPECIAL TERMINATORS TYPSTI, TYPSTR TYPSI, TYPES TYPECI, TYPEC TWOCI, TWOCS CRLFI, CRLF DIGIT= JMS I . /OUTPUT AN ASCII DIGIT DODIG SPACE1= JMS I . /OUTPUT 1 SPACE OR ... DO1SP SPACE2= JMS I . /OUTPUT 2 SPACES DO2SP CTRLI, CTRL TWOT, PACOUT TYPEI, TYPE DECI, DPRT OCTI, OPRT DEC2I, DEC2 PDATEI, PDATE RTL6I, RTL6 RTR6I, RTR6 SOCTI, OCTSET BKLOCI, BKLOC EVALI, EVAL PUSH= JMS I . /PUSH AC ON P.D.L. PUSHX POP= JMS I . /POP P.D.L. INTO AC POPX CALUSR= JMS I . /DO USR FUNCTION USEUSR TADIDP= JMS I . /"TAD I DPNT" IN FIELD 1 TIDPNT TADICAD= JMS I . /"TAD I CAD" IN FIELD 1 TICAD DCAICAD= JMS I . /"DCA I CAD" IN FIELD 1 DICAD GWORDI, GWORD GARGI, GARGS ARGI, ARG GETI, GET ODGETI, ODGET GETNI, GETN SSKIPI, SSKIP LIMITI, LIMITS INCI, INC SORTI, SORTJ ENDCI, ENDC RECRLF, MAIN1-1 RESTAR, MAIN1 ERROR= JMS I . XERROR COMST, COMB-1 TEMPST, TEMPL-1 MASKBS, SMASKB-1 PAGE /PROGRAM MAIN LOOP AND DRIVER. COLLECTS CHARACTERS /INTO COMMAND BUFFER UNTIL END IS REACHED. DCA USRAD /CLEAR ON RESTART (NOTHING IN)! TLS /RAISE TELETYPE FLAG DCA SHUT /NOTHING IS OPEN JMS I CRLFI /OUTPUT CR-LF. MAIN1, JMS I SOCTI /SET INPUT TO OCTAL; EXEC 'COMMENT' DCA DSWIT /RESET DUMP OUTPUT SWITCH TAD COMST /INIT COMMAND BUFFER. DCA COMIR TAD (PDLB+1 /INIT PUSH-DOWN-LIST DCA PDLPT MAIN2, READLN /GET A LINE FROM INPUT. CCHARL-1 /CR LF ; ! / ALT- COPSL-CCHARL / MODES ETC... JMP MAIN1 /BUFFER WAS EMPTIED. /ROUTINE TO HANDLE CARRIAGE RETURN. CRCR, JMS I ENDCI /PUT A CR IN BUFFER JMP CRCRC /ONLY A CR IN BUFFER JMS I GWORDI /GET COMMAND WORD JMP CRCRN /BUFFER BEGINS WITH A # ISZ CRSWT /WORD ENDED BY A CR? JMP CRCR1 /YES, ONLY A FEW ARE OK JMS I SORTI /NO, LOOK UP COMMAND CWORDL-1 WOPSL-CWORDL ERCB, ERROR /NOT A LEGAL COMMAND / CRCR1, JMS I SORTI /"WRITE","REWIND","EXIT" & "COMMENT" CWORL2-1 WOPSLL-CWORL2 ERCA, ERROR /SOMETHING NOT LEGAL / CRCRN, JMS CLOSE /CLOSE THE OPEN LOCATION IF OPEN CRCRC, DCA SHUT / MARK LOCATION CLOSED JMP MAIN1 /ROUTINE TO HANDLE SLASH SLASH, JMS I ENDCI /END BUFFER WITH A CR JMP SLA1 /OPEN LAST, CR ONLY JMS WCHEK /DOES LINE START W. A WORD? JMS I LIMITI /NO, GET ARG-- SBLK / & SLOCH & SLOCL SLA1, SPACE1 /OUTPUT SPACE SLO1, JMS ODTOUT /GET THE WORD & OUTPUT SLO2, SPACE1 /FOLLOWED BY 2 SPACES SPACE1 /(FOR ";"--OUTPUT ONLY 1 SPACE AND JMS I ODGETI / THEN FORCE ACTION & IGNORE VALUE) STA JMP CRCRC /GO MARK LOCATION OPEN /ROUTINE TO HANDLE ALT MODE & ESCAPE KEYS ALTMOD, TAD OUTPNT /USE OUTPUT ROUTINE 'SET' BY JMP ALTM1 / 'FORMAT' OPTION. /ROUTINE TO CLOSE A LOCATION, OUTPUT ITS (NEW) CONTENTS IN A / SPECIFIED FORMAT AND THEN RE-OPEN. THE ROUTINE HANDLES: / # (BCD), $ (OS/8 ASCII), % (BYTE OCTAL), & (XS240 ASCII), / : (SIGNED DECIMAL), < (OCTAL), = (UNSIGNED DECIMAL), / > (PDP SYMBOLIC), @ (DATE), [ (ASCII), \ (FPP SYMBOLIC), / ] (PACKED ASCII) AND ? (DIRECTORY). / OMODES, TAD SCANX1 /'SORTJ' POINTER TO CHAR LIST TAD (OTABLE-1-CCHARL DCA DPNT /POINT INTO ADDR TABLE, TADIDP / GET OUTPUT ROUTINE ADDR, ALTM1, DCA OMODPT / & SET POINTER TO ROUTINE. JMS ECLOSE /CLOSE THIS LOCATION SPACE1 /OUTPUT SPACE DCA CHARSW /RESET UNPACK SWITCH JMS I ODGETI /GET WORD JMS I OMODPT /OUTPUT IN DESIRED FORMAT JMP SLO2 /AND GO REOPEN. OMODPT, 0 /ROUTINE TO HANDLE BACKARROW. BACKAR, JMS ECLOSE /CLOSE THIS LOCATION TADICAD /GET THE CONTENTS, JMP UPARR1 /AND USE THEM AS THE ADDR /ROUTINE TO HANDLE UPARROW. UPARR, JMS ECLOSE /CLOSE THIS LOCATION TADICAD /IS THIS A 'PAGE 0' REF.? AND N200 SZA CLA TAD SLOCL /YES, USE PAGE BITS AND M200 / MASK PAGE OR 0 TO PAGE # DCA SLOCL / & SAVE IT TADICAD /GET THE CONTENTS, AND N177 /AND USE THE ADDRESS BITS. TAD SLOCL / ALONG WITH PAGE BITS UPARR1, DCA SLOCL /THIS IS 12 BIT ADDR JMP EXCL2 /NOW GO FINISH /ROUTINE TO HANDLE SEMICOLON, LINE FEED & EXCLAMATION. SEMIC, DCA I TYPEI /SET NO-OUTPUT SWITCH-V7B LFLF, STA /LINE-FEED - CLOSE,INCREMENT,OUTPUT EXCL, DCA OMODPT /EXCLAMATION - CLOSE,DECREMENT,OUTPUT JMS ECLOSE /CLOSE THIS LOCATION IAC DCA ACC1 /SET UP D.P. INCREMENT DCA ACC2 EXCL1, DCA DPSGN /(FOR SAFETY) ISZ OMODPT /INCREMENT OR DECREMENT? JMS DPNEG / DECREMENT, NEGATE VALUE CLL TAD ACC1 TAD SLOCL /UPDATE LOCATION TO 15 BITS DCA SLOCL RAL TAD ACC2 TAD SLOCH AND N7 / (BUT ONLY 15 BITS) DCA SLOCH TAD I TYPEI / ANY OUTPUT?-V7B SNA CLA JMP SLO2+1 / NO, WAS ";" DO ONE SPACE EXCL2, JMS I CRLFI /GIVE CR/LF FOR NEXT LINE JMS I BKLOCI /OUTPUT ADDRESS SBLK-1 JMS I TWOCI /OUTPUT "\ " 3440 JMP SLO1 /NOW GO OPEN NEXT LOCATION /ROUTINE TO HANDLE PLUS & MINUS. PLUS, STA /"+", SET SWITCH MINUS, DCA OMODPT /"-", CLEAR SWITCH JMS I ENDCI /END BUFFER, TEST JMP EXCL2 /NO ARG, DO SAME AGAIN JMS WCHEK /LINE START WITH A COMMAND? JMS I ARGI /NO, GET AN ARG JMP EXCL1 /UPDATE LOC & GO OPEN ECLOSE, 0 /SUB. TO CLOSE THE LOCATION IF ARG. JMS I ENDCI /END BUFFER WITH A CR. JMP I ECLOSE /ONLY A CR IN BUFFER, DONE JMS WCHEK /DOES LINE START W. A WORD? JMS CLOSE /ARG IN BUFFER, USE IT JMP I ECLOSE /DONE CLOSE, 0 /SUBROUTINE TO CLOSE A LOCATION JMS I ARGI /GET ONE ARG ISZ SHUT /ANYTHING OPEN? JMP I CLOSE /NO, RETURN JMS I ODGETI /YES, SET UP THINGS RIGHT STA DCA MODIF /SET MODIFY FLAG TAD ACC1 /USE "LOC" AS DATA DCAICAD /STORE IT JMP I CLOSE PAGE /ROUTINE TO 'EVALUATE' A SIGNED DOUBLE PRECISION ARITHMETIC / EXPRESSION & OUTPUT THE RESULTS IN OCTAL & D.P. SIGNED / DECIMAL. XVAL, JMS I EVALI /GO EVALUATE SKP /TERMINATED BY A CR ERCC, ERROR / SORRY!--TOO MANY ")"S JMS I TWOCI /"= " 7540 TAD ACC2 JMS I OCTI /OUTPUT HIGH ORDER IN OCTAL TAD ACC1 JMS I OCTI /OUTPUT LOW ORDER IN OCTAL TAD ACCX1 /SAVE REMAINDER FOR LATER DCA COMIR TAD ACCX2 DCA COMOUT TAD (-7 DCA XERROR /MUST DEVELOP 7 DIGITS JMS I TWOCI /OUTPUT " (" 4050 TAD ACC2 /IS DPAC NEG? SMA CLA JMP DLOOP1-1 /NO, OUTPUT " " JMS DPNEG /YES, MAKE IT POSITIVE TAD N15 / AND OUTPUT "-". SPACE1 DLOOP1, TAD (12 /RESET DIVISOR TO 10(10) DCA OPER1 DCA OPER2 JMS DDIV /GO DIVIDE DPAC BY 10(10) TAD ACCX1 / GET REMAINDER PUSH /PUT IT ON PUSH-DOWN-LIST ISZ XERROR /DONE YET? JMP DLOOP1 TAD COMOUT /YES, RESTORE REMAINDER DCA ACCX2 TAD COMIR DCA ACCX1 TAD (-7 DCA XERROR /NOW SET UP TO OUTPUT 7 DIGITS DLOOP2, POP / IN REVERSE ORDER! DIGIT /MAKE REMAIN A DIGIT ISZ XERROR /DONE? JMP DLOOP2 JMS I TYPECI /YES, OUTPUT ")" ") JMP I RECRLF / AND CR/LF /ERROR ROUTINE XERROR, 0 CLA /CLEAR POSSIBLE JUNK FROM AC DCA DSWIT /RESET IN CASE DUMP MODE CDF 0 JMS I TYPECI /OUTPUT "?" "? TAD (ERLIST-1 /INIT LIST POINTER DCA DPNT DCA TEMP /SET CODE TO 0 XERR1, ISZ TEMP /BUMP ERROR CODE TADIDP /GET AN ADDRESS SNA JMP XERR2 /(FOR DEBUGGING) CMA /= -(ADDR+1) TAD XERROR /DOES IT MATCH THE CALL? SZA CLA JMP XERR1 /NO XERR2, TAD TEMP /YES, OUTPUT ERROR CODE JMS I DEC2I / AS 2 DECIMAL DIGITS JMS I TYPSI /NOW OUTPUT " AT " MS17 TAD (-COMB+1 /CALCULATE POSITION IN TAD COMOUT / COMMAND BUFFER, JMS I DEC2I / & OUTPUT AS 2 DIGITS. TAD ERMODE /LONG/SHORT MESSAGES? [NOTE: THIS -> XERR3, SZA CLA / "7600" (A CLA) IF 'USROUT' ERROR!] JMP XERR4 /SHORT, GO DO CR/LF JMS USROUT /LONG, BE SURE MESSAGES ARE IN SPACE2 /OUTPUT 2 SPACES TAD TEMP /CODE = ADDRESS-1 OF ADDRESS DCA DPNT / OF MESSAGE TADIDP /GET MESSAGE ADDR JMS I TYPSTI / OUTPUT MESSAGE XERR4, JMS I CRLFI /OUTPUT A CR,LF PAIR JMP I .+1 /*** CIF BAT /BATCH OPER. MAIN1 /*** JMP I N7000 /'BATABT'! USEUSR, 0 /USR CALLER SUBROUTINE (FROM EITHER FIELD!) DCA USRSAV /SAVE CONTENTS OF AC RDF TAD UCDF0 /SET UP RETURN FIELD (FOR 2ND USR CALL) DCA USRCDF UCDF0, CDF 0 /SET TO HERE FOR 1ST CALL TAD USRAD /IS USR IN OR OUT? SMA SZA CLA JMP USRIN /IN, GO TO IT CIF 10 JMS I M100 /OUT, DO "USRIN" FUNCTION 10 TAD N200 DCA USRAD / & SO INDICATE USRIN, CDF CIF 10 TAD USEUSR /MOVE RETURN ADDRESS TO THE DCA I N200 / USR ENTRY POINT USRCDF, CDF /SET UP D.F. FOR RETURN TAD USRSAV /RESTORE AC CONTENTS JMP I (201 / & FAKE A CALL TO IT USRSAV, USROUT, 0 /SUBROUTINE TO REMOVE USR BY RECALLING ERC15, TAD USRAD / ERROR MESSAGES FROM SCRATCH SPA CLA / BLOCKS ON SYS. JMP I USROUT /JUST EXIT IF PRESENT... TAD M100 DCA USRAD /SET USR TO "OUT" JMS I (7607 /READ IN THE MESSAGES 610 / 6 PAGES TO FIELD 1 0 / STARTING AT LOC 10000 27 / FROM SCRATCH BLKS SKP CLA /!!! ERROR !!! JMP I USROUT /OK, JUST EXIT TAD M200 DCA XERR3 /NO MORE MESSAGES ON ERROR! TAD ERC16 DCA ERC15 /AND NO MORE "SHOW ERROR"! ERC16, ERROR /TELL THE HORRIBLE STORY! PAGE /ROUTINE TO EXECUTE THE BLOCK 'SCAN' COMMAND XSCAN, JMS I GARGI /GET ARGS CONVERTED TAD (SCANER / & SET UP FOR SCANNING JMP XDUM0 /ROUTINE TO EXECUTE THE BLOCK 'DUMP' COMMAND XDUMP, TAD MODSW /MAPPED MODE? SMA SZA CLA ERC14, ERROR /YES, DUMP IS MEANINGLESS! JMS XDLCOM /DO COMMON STUFF TAD (LLIST / & SET UP FOR DUMPING XDUM0, DCA XGFORM /SET OUTPUT ROUTINE--DUMP/SCAN XDUM1, ISZ DPNT /SKIP FIRST WORD ISZ DPNT /SKIP A WORD TAD I DPNT /GET NEXT START BLOCK. JMS BLKTST TAD I DPNT /GET NEXT -(# BLOCKS) DCA TEMP1 XDUM2, JMS I CTRLI /TEST HERE FOR 'SCAN' TERMINATE DCA LOCL /SET LOC TO 0 DCA LOCH TAD M400 /SET TO -400(8) [1 BLOCK] JMS I XGFORM /DUMP OR SCAN A BLOCK ISZ BLK /INCREMENT BLOCK NUMBER ISZ TEMP1 /DONE? JMP XDUM2 /NO, DO NEXT BLOCK ISZ TEMP /YES, ARE ALL ARGS DONE? JMP XDUM1 /NO, DO NEXT JMP XLIS2 /YES, DONE--RESET SWITCH /ROUTINE TO EXECUTE THE LOCATION 'LIST' COMMAND XLIST0, JMS XDLCOM /DO COMMON STUFF XLIS1, TAD I DPNT /GET BLOCK # JMS BLKTST /TEST & SET BLK TAD I DPNT /GET & SET LOCATION DCA LOCH TAD I DPNT DCA LOCL TAD I DPNT /GET -(# WORDS) JMS LLIST /NOW GO DO IT ISZ TEMP /ARE ALL ARGS USED? JMP XLIS1 /NO, CONTINUE XLIS2, DCA DSWIT /RESET DUMP SWITCH JMP I RECRLF / DO CR/LF & CONTINUE /COMMON SUBROUTINE FOR 'XDUMP'&'XLIST0' XDLCOM, 0 TAD OUTPNT /INITIALIZE DEFAULTS DCA LISTPT TAD OUTSW DCA LOUTSW JMS XGFORM /GET FORMAT, IF ANY NOP /RETURN FOR NO FORMAT JMS I GARGI /GET ARGS ISZ DSWIT /SET DUMP SWITCH JMP I XDLCOM /SUBROUTINE TO OUTPUT -[C(AC)] WORDS FROM THE DEVICE /BEGINNING AT BLK.LOC IN THE SPECIFIED FORMAT LLIST, 0 DCA CNTRA /SET UP -# WORDS TO LIST DCA CHARSW /RESET UNPACK SWITCH LLIS1, JMS I CRLFI TAD LOCL AND N7 /SET UP # ON THIS LINE DCA CNTR TAD LOUTSW /IF CHARACTER OUTPUT, SNA CLA TAD M10 / DOUBLE # WORDS/LINE TAD CNTR TAD M10 DCA CNTR JMS I BKLOCI /OUTPUT LOCATION BLK-1 JMS I TYPSI /OUTPUT ": " MS13 LLIS2, JMS I GETI /GET A WORD JMP LLIS3 /FILE MODE, NO SUCH ADDR.. JMS I LISTPT /OUTPUT IT TAD LOUTSW /TEST MODE SWITCH SPA JMP LLIS5 /"SYMBOLIC", CR/LF NOW SZA CLA /CHARACTERS, NO SPACES SPACE2 /NUMBERS, TWO SPACES LLIS3, JMS I INCI /INCREMENT LOC ISZ CNTRA /ALL WORDS DONE? JMP LLIS4 /NO JMS I CRLFI JMP I LLIST /YES, RETURN / LLIS4, ISZ CNTR /ALL DONE WITH THIS LINE? JMP LLIS2 /NOT YET JMP LLIS1 /YES, OUTPUT CR/LF & CONTINUE / LLIS5, STA DCA CNTR /FORCE A CR/LF JMP LLIS3 LISTPT, 0 LOUTSW, 0 /SUBROUTINE TO GET A FORMAT FOR 'XFORM' & 'XDLCOM' XGFORM, 0 JMS I GWORDI /GET A WORD JMP I XGFORM /NOT FOLLOWED BY A WORD JMS I SORTI /LOOK UP WORD FORML-1 FOPSL-FORML ERCD, ERROR /WORD NOT RECOGNIZED / XFSYM, STL RAR /"SYMBOLIC"; SWITCH NEG XFNUM, IAC /NUMERIC; SWITCH POS XFCHR, DCA LOUTSW /CHARACTER; SWITCH 0 TAD SCANX1 /'SORTJ' POINTER TO CHAR TAD (-FORML /CALCULATE FORMAT # CLL RAR /(DIVIDE BY 2) DCA TEMP1 / & SAVE IT. TAD TEMP1 TAD (FTABLE-1 DCA DPNT TADIDP DCA LISTPT /SET UP OUTPUT POINTER ISZ XGFORM /BUMP RETURN ADDRESS JMP I XGFORM /ROUTINE TO 'SET' THE 'FORMAT' OPTION XFORM, JMS XGFORM /GET FORMAT WORD ERCE, ERROR /NUMBER?! SORRY ABOUT THAT! TAD LOUTSW /OK, SET UP DEFAULTS: DCA OUTSW / SWITCH, TAD LISTPT DCA OUTPNT / ROUTINE POINTER, TAD TEMP1 DCA FCNT / & FORMAT # JMP XSETN OUTSW, 0 /MODE:0=NOTHING,+=SPACES,-=CR/LF PAGE /ROUTINE TO EXECUTE THE 'OPEN' COMMAND. XOPEN, STA /"." LEGAL IN FILE NAME JMS GNAME /GET FILE NAME FOR OUTPUT CIF 10 JMP XOPEN1 /NOW GO TO FIELD 1 TO HANDLE /ROUTINE TO EXECUTE THE 'CLOSE' COMMAND. XCLOSE, CDF CIF 10 JMP XCLOS1 /ALL CODE IS IN FIELD 1 /ROUTINE TO EXECUTE THE 'FILE' COMMAND. XFIERR, TAD TEMP1 /MADE ALL POSSIBLE ATTEMPTS SMA CLA / AT EXTENSION RETRIES? JMP XFIOUT / YES, ALL TRIES DONE! ISZ DPSGN /THIS WILL SKIP ON 1ST FAIL ISZ TEMP1 /THIS WILL SKIP ON 2ND FAIL TAD (1404 / 2ND TRY--USE "LD" EXTEN DCA NAM4 / 3RD TRY--USE NULL EXTEN JMP XFICHN+2 / 3RD TRY IS FINAL FAILURE / XFIOUT, JMS PNAME /OUTPUT FILE NAME & JMS I TYPSI /"LOOKUP FAILED" MS15 / XFILEN, JMS I CRLFI /OUTPUT CR/LF ISZ CRSWT /WAS LAST ENDED BY A CR? JMP I RESTAR /YES, DONE XFILE, STA /"." LEGAL IN FILE NAME JMS GNAME /GET NEXT FILE NAME XFICHN, STA DCA DPSGN /SET TRY AGAIN SWITCH TAD (NAM1 /INIT POINTER TO NAME DCA FSTBLK TAD DEVNO /GET DEVICE # CALUSR 2 /LOOKUP FSTBLK, 0 /NAME PNTR, BECOMES ST BLK FBKLEN, 0 / BECOMES -(FILE LENGTH) JMP XFIERR /LOOKUP FAILED TAD FSTBLK DCA RBLK1 /SET UP PAGE 0 ST BLK CDF 10 DCA I (CCBB / & RESET CCBB TAD I (1404 /GET # ADD'L INFO WORDS DCA GDEV2 / (NEGATIVE) & SAVE IT TAD GDEV2 TAD I (17 /POINT TO FIRST OF THEM DCA GDEV3 / (THE DATE, IF PRESENT) TAD I N7 /GET THE NUMBER OF THE AND N7 / DIRECTORY SEGMENT IN DCA CNTR / CORE & SAVE IT. TAD GDEV2 /WAS # OF ADD'L WRDS = 0? SZA CLA TAD I GDEV3 / NO, GET THE DATE WORD CDF 0 DCA GDEV1 /STORE DATE OR 0 (NO DATE) JMS PNAME /OUTPUT FILE NAME TAD FSTBLK JMS I OCTI /OUTPUT ST. BLK. IN OCTAL JMS I TYPECI "- TAD FBKLEN /CALCULATE LAST BLK # CMA TAD FSTBLK JMS I OCTI / & OUTPUT IN OCTAL SPACE2 /OUTPUT 2 SPACES TAD FBKLEN CIA JMS I OCTI /OUTPUT LENGTH IN OCTAL JMS I TWOCI /" (" 4050 TAD FBKLEN CIA JMS I DECI / & AGAIN IN DECIMAL JMS I TYPSI /") " MS33 TAD CNTR /GET SEGMENT # JMS I RTL6I / & PUT IN BITS 3-5 JMS I TWOCI / TO OUTPUT IT & "." 6056 TAD GDEV3 /GET ADDR OF 1ST ADD'L WRD TAD (-1400-4 / FOR OFFSET OF NAME START JMS OCT3 /OUTPUT LOCATION IN SEG SPACE2 / & TWO SPACES TAD GDEV1 /GET DATE WORD SZA /IS IT = 0? JMS I PDATEI /NO, OUTPUT DATE JMP XFILEN /NOW OUTPUT CR/LF & CONTINUE /ROUTINE TO 'SET' THE 'DEVICE' OPTION XDEV, JMS GDEVICE /GET & FETCH DEVICE HANDLER DEVHAN+1 / (2 PAGE HANDLER IS OK) DCA DEVAD /SET UP HANDLER ADDRESS TAD GDEV2 /SAVE DEVICE # DCA DEVNO DCA RBLK1 / & NO FILE KNOWN DCA SHUT / & NOTHING OPENED DCA MODIF / & NOTHING MODIFIED TAD NAM1 CIF 10 JMP XDEVM /GO FINISH SETUP IN FIELD 1 /ROUTINE TO 'SET' THE 'DDEV' OPTION XDDEV, JMS GDEVICE /GET & FETCH DEVICE HANDLER DMPHAN+1 / (2 PAGE HANDLER IS OK) CIF 10 JMP XDDEV1 /GO TO FIELD 1 TO FINISH SETUP GDEVICE,0 /SUBROUTINE TO GET DEVICE NAME & FETCH HANDLER JMS GNAME /GET DEV NAME ("." ILLEGAL) TAD NAM1 /MOVE NAME TO CALL DCA GDEV1 TAD NAM2 DCA GDEV2 TAD I GDEVICE /GET HANDLER SPACE ADDRESS ISZ GDEVICE DCA GDEV3 CALUSR 1 /FETCH HANDLER GDEV1, 0 GDEV2, 0 GDEV3, 0 ERCY, ERROR /NO SUCH HANDLER TAD GDEV3 /RETURN HANDLER ADDRESS JMP I GDEVICE PAGE /ROUTINE TO EXECUTE THE 'SHOW' COMMAND XSHBLK, JMS I TYPSI /"BLOCK = " MS32 TAD RBLK1 /OUTPUT BLOCK IN OCTAL XSTYPE, JMS I OCTI XSHCR, JMS I CRLFI /GIVE A CR & LF DCA DSWIT /BE SURE SWITCH IS RESET ISZ CRSWT /LAST WORD ENDED BY CR? JMP I RESTAR /YES, DONE XSHOW, JMS I GWORDI /GET A WORD JMP ERCG /NUMBERS NOT RECOGNIZED JMS I SORTI /LOOK IT UP SHOWL-1 SHOWOP-SHOWL ERCG, ERROR /NOT FOLLOWED BY LEGAL WORD XSHVER, JMS I TYPSI /"VERSION = <VERSION><PATCH>" MSVER JMP XSHCR XSHMSK, JMS I TYPSI /"MASK = " MS02 TAD MASK JMP XSTYPE XSHOFF, JMS I TYPSI /"OFFSET = " MS09 TAD OFFSET CIA JMP XSTYPE XSHFIL, JMS I TYPSI /"FILLER = " MS37 TAD FILLER JMP XSTYPE XSHODL, JMS I TYPSI /"ODT LOC = " MS12 JMS I BKLOCI /OUTPUT IT SBLK-1 JMP XSHBKS XSHREL, JMS I TYPSI /"REL. LOC = " MS20 JMS I BKLOCI / & OUTPUT IT BLK-1 JMP XSHBKS XSHABS, JMS I TYPSI /"ABS. LOC = " MS03 TAD CAD /OUTPUT LOCATION IN BLOCK TAD (-IOBUF DCA CAD JMS I BKLOCI CBLK-1 XSHBKS, TAD MODIF /HAS BLOCK BEEN MODIFIED? SMA CLA JMP XSHCR / NO, SAY NOTHING! JMS I TYPSI / YES, SAY " MOD" MSMOD JMP XSHCR XSHUPP, JMS I TYPSI /"UPPER = " MS04 JMS I BKLOCI /OUTPUT IN BLOCK.LOC FORM UBLK-1 JMP XSHCR XSHLOW, JMS I TYPSI /"LOWER = " MS05 JMS I BKLOCI LBLK-1 JMP XSHCR XSHFMT, JMS I TYPSI /"FORMAT = " MS06 TAD FCNT TAD (FMTLS-1 /SET UP FOR CORRECT TITLE XSHFM, DCA DPNT TADIDP /GET MESSAGE ADDRESS JMS I TYPSTI /OUTPUT DESCRIPTOR JMP XSHCR XSHMOD, JMS I TYPSI /"MODE = " MS10 TAD MODSW /GET CORRECT MESSAGE TAD (MODELS-1 /(OFFSET INTO TABLE) JMP XSHFM /GET ADDRESS & OUTPUT XSHOUT, JMS I TYPSI /"OUTPUT = " MS30 TAD TYPSW /SET UP MESSAGE ADDRESS TAD (OUTLS-1 /(OFFSET INTO TABLE) JMP XSHFM XSHSMS, JMS I TYPSI /"SMASK = " MS07 TAD SMASKL DCA TEMP /-# TO OUTPUT TAD MASKBS DCA DPNT /SET UP TO OUTPUT TAD M10 /SET LINE LENGTH DCA TEMP1 JMP XSHSM2 XSHSM1, JMS I TWOCI /OUTPUT ", " 5440 ISZ TEMP1 /ENOUGH ON THIS LINE? JMP XSHSM2 /NO, OK JMS I CRLFI /YES, OUTPUT CR-LF SPACE2 / & 2 SPACES STA /MAKE LINE 1 LONGER JMP XSHSM1-3 /AND RESET LENGTH / XSHSM2, TADIDP /GET NEXT VALUE JMS I OCTI / & OUTPUT IT ISZ TEMP /ENOUGH? JMP XSHSM1 JMP XSHCR /OK, GET NEXT WORD XSHDEV, JMS I TYPSI /"DEVICE = XXXX" MSDEV JMS I TWOCI /NOW OUTPUT " (" 4050 TAD DEVNO /GET THE DEVICE # JMS I DEC2I / & OUTPUT AS 2 DIGITS JMS I TYPECI /FINALLY OUTPUT ")" ") JMP XSHCR XSHDDEV,JMS I TYPSI /"DDEV = XXXX" MSDDEV JMP XSHCR FPRNT, 0 /PRINT FIELD DIGIT FROM BITS 6-8 JMS I (FPRNTX /FIRST PRINT BANK BITS RTR /MOVE TO BITS 9-11 RAR AND N7 /MASK TO 1 DIGIT DIGIT / & OUTPUT IN ASCII JMP I FPRNT PAGE /CONTINUATION OF 'SHOW' COMMAND /SHOW 'CCB' HANDLER XSHCCB, CDF CIF 10 JMS GCCB /SET UP CCB FOR FILE DCA DPSGN / & SET UP SEGMENTS JMS I TYPSI /"CCB:" MS11 JMS CCHDST /DO SETUP, OUTPUT START JMS I TYPSI /", JSW = " MS19 JMS NXTOCT /OUTPUT J.S.W. IN OCTAL JMS I CRLFI JMS I TYPSI /" CORE SEGS: " MS14 XSHCC1, TAD (-4 DCA CNTR /-#/LINE XSHCC2, TADIDP /GET ORIGIN WORD DCA TEMP1 TADIDP / & COUNT WORD DCA TEMP2 / TAD TEMP2 /GO OUTPUT START FIELD / JMS FPRNT JMS I (ADFLD /ADJUST BANK AND FIELD FOR 128K TAD TEMP1 / & START ADDR JMS I OCTI JMS I TYPECI / & A "-" "- / TAD TEMP2 /OUTPUT FIELD AGAIN / JMS FPRNT JMS I (ADFLD /ADJUST BANK AND FIELD (128K) TAD TEMP2 / PAGE COUNT -> PAGES CLL RAL AND M200 /MASK OFF FIELD DATA TAD TEMP1 /ADD ORIGIN ADDR TAD M1 / & SUBTRACT 1 FOR END JMS I OCTI /OUTPUT END ADDR IN OCTAL ISZ DPSGN /DONE? JMP XSHCC4 /NO TAD OVLFLG /YES, OVERLAYS? (LINK OUTPUT) SNA JMP XSHCR / NO, DONE DCA DPNT / YES, RESET POINTER JMP XSHHD1 / & CONTINUE / XSHCC4, JMS I TWOCI /OUTPUT SEPARATOR 5440 ISZ CNTR /DONE ON THIS LINE? JMP XSHCC2 /NO JMS I CRLFI /YES SPACE2 /ADD 2 SPACES STA /AND 1 MORE ITEM PER LINE JMP XSHCC1 /SHOW 'HEADER' HANDLER XSHHDR, CDF CIF 10 JMS GHDR /SET UP HEADER FOR MODULE JMS I TYPSI /"HEADER:" MS38 JMS CCHDST /DO SETUP, OUTPUT START JMS I TYPSI /", NEXT WORD = " MS39 TADIDP /GET FIELD DIGIT DIGIT / & OUTPUT JMS NXTOCT /FOLLOWED BY ADDRESS JMS I TYPSI /", LOAD VER = " MS40 JMS NXTOCT / & OUTPUT VERSION TADIDP /GET E.P. FLAG SNA CLA JMP XSHHD1 / NO E.P. JMS I TYPSI /", EP REQ'D" MS41 XSHHD1, JMS I CRLFI /TO THE NEXT LINE JMS I TYPSI /" OVLYS START... MS42 XSHHD2, TADIDP /GET NUMBER OF OVERLAYS SNA / FOR THIS LEVEL JMP XSHCR / 0 = END, DONE DCA TEMP1 /SAVE IT JMS I CRLFI /OUTPUT A CR/LF SPACE2 / AND 4 SPACES SPACE2 TAD TEMP1 JMS I DEC2I /# OVLYS IN DECIMAL SPACE2 TADIDP /GET MEMORY START WORD DCA TEMP2 TAD TEMP2 JMS FPRNT /OUTPUT START FIELD TAD TEMP2 AND M400 / & DOUBLE-PAGE JMS I OCTI SPACE2 JMS NXTOCT /OUTPUT RELATIVE BLOCK SPACE2 JMS NXTOCT /OUTPUT OVERLAY LENGTH JMP XSHHD2 /AND DO ANOTHER ROUND! /SHOW 'ERRORS' HANDLER XSHERR, JMS USROUT /BE SURE MESSAGES ARE IN ISZ DSWIT /SET DUMP SWITCH JMS I TYPSI /"ERRORS: FUTIL VERSION ..." MSERR JMS I CRLFI CLA IAC DCA DPNT /SET POINTER & CODE XSHER1, JMS I CRLFI /DO ANOTHER CR/LF TAD DPNT /TEST FOR LAST REAL MESSAGE TAD (-EMSEND /(NOT DEBUG MESSAGE!) SNA CLA JMP XSHCR TAD DPNT /OUTPUT ERROR CODE JMS I DEC2I / AS 2 DIGITS JMS I TYPSI /THEN " = " MS01 TADIDP /GET ADDR OF MESSAGE AND JMS I TYPSTI / OUTPUT IT JMP XSHER1 CCHDST, 0 JMS I CRLFI JMS I TYPSI /" SA = " MS18 TAD (CCBB DCA DPNT /SET UP POINTER TO DATA TADIDP /GET 2ND WORD FROM CCB/HDR JMS FPRNT /IT HAS START FIELD SO OUTPUT JMS NXTOCT / FOLLOWED BY START ADDR JMP I CCHDST PAGE /ROUTINE TO EXECUTE THE 'SET' COMMAND XSETN, ISZ CRSWT /WAS LAST INFO ENDED BY CR? JMP I RESTAR /YES, DONE XSET, JMS I GWORDI /GET OPTION WORD JMP XSET1 /NO NUMBERS PLEASE! ISZ CRSWT /WAS WORD ENDED BY A CR? ERCK, ERROR /YES, ILLEGAL HERE JMS I SORTI /LOOK UP WORD SETLST-1 SETJMP-SETLST XSET1, ERROR /WHAT??? /ROUTINE TO 'SET' THE 'DMODE' (DUMP MODE) XDMODE, JMS I GWORDI /GET A WORD JMP ERC11 /NO NUMBERS HERE! JMS I SORTI /LOOK IT UP XDMLST-1 XDMOPS-XDMLST ERC11, ERROR /NO LIKEE!! / CLL STA RAR /4000: 'ALL' (ECHO TO TTY & FILE) XDMODS, IAC / 1: 'PART' (ONLY DUMP,LIST,ETC) DCA DMODE / 0: 'NONE' (TTY ONLY) JMP XSETN /ROUTINE TO 'SET' THE 'OUTPUT' OPTION XOUTS, JMS I GWORDI /GET OPTION WORD JMP ERCL / # IN THE BUFFER JMS I SORTI /LOOK IT UP XOLST-1 XOOPS-XOLST ERCL, ERROR /NOT FOLLOWED BY LEGAL WORD / CLL STA RAL /-1: 'FPP' (SYMBOLIC) XOUTS1, IAC /+1: 'PDP' (SYMBOLIC) DCA TYPSW / 0: 'OCTAL' JMP XSETN /ROUTINE TO 'SET' THE 'MASK' OPTION XMASK, JMS I ARGI /GET ONE ARG TAD ACC1 /GET 'LOC' DCA MASK / & SET MASK JMP XSETN /ROUTINE TO 'SET' THE 'OFFSET' OPTION XOFFS, JMS I ARGI /GET ONE ARG TAD ACC1 /GET # CIA DCA OFFSET /SET IT JMP XSETN /ROUTINE TO 'SET' THE 'ERROR' (MODE) OPTION XEMODE, JMS I GWORDI /GET WORD JMP ERCZ /NO NUMBERS ALLOWED!!! JMS I SORTI /LOOK IT UP XELST-1 XEOPS-XELST ERCZ, ERROR /ILLEGAL SOMETHING / XEMOD1, IAC /'SHORT' DCA ERMODE /'LONG' JMP XSETN /ROUTINE TO 'SET' THE 'UPPER' LIMITS OPTION XUPP, JMS I LIMITI /UPPER, GET ARGS UBLK JMP XSETN /ROUTINE TO 'SET' THE 'LOWER' LIMITS OPTION XLOW, JMS I LIMITI /LOWER, GET ARGS LBLK JMP XSETN /ROUTINE TO 'SET' THE 'MODE' OPTION XMODE, JMS I GWORDI /GET OPTION WORD JMP ERCJ /NUMBER IN BUFFER, BAIL OUT JMS I SORTI /LOOK IT UP MODLST-1 MODOPS-MODLST ERCJ, ERROR /NOT RECOGNIZED / CLL STA RTL /-1: OFFSET XMODS, IAC /+2: LOAD (MODULE) IAC /+1: SAVE (FILE) DCA MODSW / 0: NORMAL JMP XSETN /ROUTINE TO 'SET' THE 'FILLER' OPTION XFILL, JMS I ARGI /GET ONE ARG TAD ACC1 DCA FILLER / & SET AS FILLER JMP XSETN /ROUTINE TO 'SET' THE 'TEMP' STORAGE XTEMP, JMS I ARGI /GET THE 24 BIT ARG (EXPRESSION!) TAD ACC1 /NOW SAVE THE 24 BITS FOR LATER DCA TEMPV1 TAD ACC2 /GET IT BACK WITH "EVAL T" DCA TEMPV2 / (OR IN AN EXPRESSION) JMP XSETN /ROUTINE TO EXECUTE THE 'IF' COMMAND XIF, JMS I EVALI /EVALUATE THE EXPRESSION SKP / TERMIN = CR, OK JMP ERCC / TOO MANY PARENS TAD ACC1 /TEST THE 24-BIT VALUE FOR ZERO SNA TAD ACC2 SNA CLA JMP I RESTAR /OK, JUST CONTINUE XIFSKP, TAD COMST /NOT ZERO, BEGIN SKIPPING FOR DCA COMIR / LINE STARTING WITH "END" READLN /GET A LINE FROM THE INPUT TYPEM-1 / WITH THESE TERMINATORS IFSKPO-TYPEM JMP XIFSKP /BUFFER EMPTIED / XIFCR, JMS I ENDCI /CR FOUND, TIDY THINGS UP JMP XIFSKP / CR ONLY JMS I GWORDI /GET 1ST WORD ON LINE JMP XIFSKP / NO WORD TAD (-0516 /IS THE WORD "EN..."? SZA CLA JMP XIFSKP / NO, KEEP LOOKING! JMP I RESTAR /YES! BEGIN EXECUTION AGAIN! /ROUTINE TO OUTPUT LOCATION THAT SATISFIED ONE /OF THE SEARCH COMMANDS. IF ABSSW=0, OUTPUT /AS RELATIVE LOCATION. ABKLOC, 0 TAD ABSSW /IS IT 0? SZA CLA JMP ABK2 /NO, OUTPUT AS ABSOLUTE JMS I BKLOCI /OUTPUT LOCATION BLK-1 ABK1, JMS I TWOCI /OUTPUT ": " 7240 JMS I TWOT JMP I ABKLOC / ABK2, TAD LOCL /MAKE ABSOLUTE AND N377 DCA CAD JMS I BKLOCI /NOW OUTPUT IT CBLK-1 JMP ABK1 TWOCS, 0 /OUTPUT 2-CHARACTER ARG TAD I TWOCS /GET ARG ISZ TWOCS /SKIP IT JMS I TWOT /OUTPUT IT JMP I TWOCS NXTOCT, 0 TADIDP /GET NEXT WORD FROM BLOCK JMS I OCTI / & OUTPUT IN OCTAL JMP I NXTOCT PAGE /ROUTINE TO EXECUTE THE 'WORD' SEARCH COMMAND XWORD, JMS SSET /INITIALIZE SEARCH TAD CNOP /SET UP FOR NORMAL, DCA CNOP+1 TAD M10 / EQUAL SEARCH XWOR2, TAD (SNA CLA /"UNEQUAL" WORD SEARCH DCA XWORC XWOR1, JMS I GWORDI /GET POSSIBLE WORD JMP XWOR3 /NUMBERS IN BUFFER ISZ CRSWT /WAS IT ENDED BY A CR? ERCI, ERROR /YES, VELLY SOLLY! JMS I SORTI /LOOK UP COMMAND: UN, ME, XWORCL-1 / AB, FR, TO XWOROP-XWORCL ERCH, ERROR /COMMAND NOT RECOGNIZED / XWOR7, TAD XWOR4+1 /"MEMREF", ONLY MEMORY- DCA CNOP+1 / REFERENCE OP-CODES CAN JMP XWOR1 / EVER BE OUTPUT. / XWOR3, JMS I ARGI /GET AN ARG TAD ACC1 /GET THE VALUE AND MASK CIA DCA CNT /LOOK FOR THIS WORD JMS LSETUP /SET UP COUNT OF WORDS TO DO XWOR4, JMS I GETI /GET A WORD JMP XWOR5 /FILE MODE, NO SUCH ADDRESS AND MASK TAD CNT XWORC, HLT /WILL BE "SZA CLA" OR "SNA CLA" JMP XWOR5 /DID NOT MATCH JMS OPRTST /TEST FOR OP-CODES 6 & 7 CNOP, NOP / 7--OPR NOP / 6--IOT;"NOP" OR "JMP XWOR5" JMS ABKLOC /DID MATCH, OUTPUT LOC JMS I GETI /GET THAT WORD JMP ERCP / OH I HOPE NOT!!! JMS I OCTI /AND OUTPUT IT IN OCTAL JMS I CRLFI XWOR5, JMS LCHEK /DONE YET? JMP XWOR4 /NO /SUBROUTINE TO INITIALIZE THE SEARCH COMMANDS SSET, 0 DCA ABSSW /RESET ABSOLUTE SWITCH TAD LBLK /SET UP START BLK & LOC DCA BLK TAD LLOCH DCA LOCH TAD LLOCL DCA LOCL TAD UBLK /SET UP END BLK & LOC DCA EBLK TAD ULOCH DCA ELOCH TAD ULOCL DCA ELOCL JMP I SSET /COMMON OPTIONS FOR 'WORD' AND 'STRING' SEARCHES XWSABS, STA DCA ABSSW /'ABSOLUTE'--SET SWITCH JMP XWSRET / XWSFRM, JMS I LIMITI /'FROM'--GET LOWER LIMITS BLK JMP XWSRET / XWSTO, TAD UBLK /'TO'--SET UP IF NEEDED DCA EBLK JMS I LIMITI / & GET UPPER LIMITS EBLK XWSRET, STA CLL RAL /= -2, CALCULATE RETURN ADDRESS AS TAD I GWORDI / LAST CALL TO "GWORD" TO ALLOW DCA LCHEK / THESE TO BE COMMON TO BOTH JMP I LCHEK / 'WORD' AND 'STRING' SEARCHES. EBLK, 0 ELOCH, 0 ELOCL, 0 LSETUP, 0 /SET SEARCH WORD-COUNTERS **** SEE NOTE **** DCA ACC1 /INITIALIZE THESE TO 0 DCA ACC2 TAD MODSW /IN A MAPPED MODE? SMA SZA CLA JMP LSETL / YES, IGNORE BLOCK PARTS TAD BLK / NO, SET UP FOR 24 BIT DCA ACC1 TAD EBLK / BLK-EBLK DCA OPER1 DCA OPER2 JMS DSUB /DO THE SUBTRACTION TAD (400 /NOW SET UP MULTIPLY BY 400 DCA OPER1 DCA OPER2 JMS DMUL /GIVES: (BLK-EBLK)*400 LSETL, CLL IAC TAD ELOCL DCA OPER1 /NOW SET UP ELOC+1 RAL TAD ELOCH DCA OPER2 JMS DSUB /AND SUBTRACT IT TAD LOCL /NOW ADD LOC TO GIVE: DCA OPER1 / (BLK-EBLK)*400+(LOC-ELOC-1) TAD LOCH / WHICH IS 24-BIT COUNT OF DCA OPER2 / WORDS TO SEARCH. JMS DADD TAD ACC2 /IF NOT NEGATIVE, ALREADY TOO SMA CLA JMP I RECRLF / FAR, SO JUST QUIT NOW! JMP I LSETUP /**** NOTE: COUNT LEFT SET UP IN ACC1 & ACC2 **** LCHEK, 0 /CHECK IF SEARCH RANGE EXHAUSTED JMS I INCI /INCREMENT LOC ISZ ACC1 /COUNT WORDS TO DO JMP I LCHEK ISZ ACC2 / (24-BIT) JMP I LCHEK JMP I RECRLF /DO CR/LF & STOP! TIDPNT, 0 /"TAD I DPNT" IN FIELD 1 CDF 10 TAD I DPNT CDF 0 JMP I TIDPNT ASCII, 0 /ASCII OUTPUT FORMAT FROM DEVICE AND N177 /MAKE CHARS INTO "STANDARD" TAD N200 / FORM: 7 BITS + PARITY ON JMS I TYPEI / TO CAUSE CORRECT PRINTING JMP I ASCII PAGE /ROUTINE TO 'REWIND' THE DEVICE XREWIN, CDF 10 TAD USRAD /RESET DIRECTORY SEGMENT KEY SMA CLA DCA I N7 / IN USR IF IT IS IN MEMORY. CDF 0 JMS I DEVAD /CALL HANDLER 0110 /READ, 1 PAGE, FIELD 1 PDLB /DUMMY BUFFER (ZAP P.D.L.) 1 /BLK 1 JMP RERROR /READ ERROR! JMP I RESTAR /READ ERROR--TEST TYPE & OUTPUT MESSAGE RERROR, SPA CLA /BIT 0 = 1 IF FATAL ERC00, ERROR /FATAL ERC01, ERROR /NON-FATAL /ROUTINE TO EXECUTE THE 'STRING' SEARCH COMMAND XSTRIN, JMS SSET /INITIALIZE TAD (STJMP-STCDF /RESET MASKING SWITCH XSTR0, TAD XREWIN / OR SET MASKING SWITCH DCA SMSKSW JMS I GWORDI /GET POSSIBLE WORD JMP XSTR1 /NUMBERS ONLY ISZ CRSWT /FOLLOWED BY A CR? JMP ERCI / YES, KICK OUT***** JMS I SORTI /LOOK UP OPTION: MA, STRLST-1 / AB, FR, TO STROPS-STRLST JMP ERCH /NO LIKEE! / XSTR1, JMS I GARGI /GET ARGS - THEN REPACK INTO BUFFER TAD TEMP / MASKING THEM IF SPECIFIED DCA CNTR /SET UP LENGTH TAD TEMPST DCA SCANX2 /STORING DONE IN NEG. FORM JMP XSTR2+2 /GO SET UP MASK / XSTR2, ISZ TEMP3 /MASK END? JMP XSTR3 TAD MASKBS /YES, RESET MASK DCA SPNT TAD SMASKL /SET UP LENGTH DCA TEMP3 XSTR3, ISZ DPNT /SKIP 2 EXTRA WORDS ISZ DPNT TAD I DPNT /GET A WORD JMS STRMSK /TEST & MASK CIA /NEGATE DCA I SCANX2 /STORE ISZ DPNT /BUMP POINTER ISZ CNTR /DONE? JMP XSTR2 JMS LSETUP /YES, SET UP COUNT OF WORDS XSTR4, TAD TEMPST /SET UP FOR SEARCH: DCA DPNT / STRING, TAD TEMP DCA CNTR / & STRING LENGTH. TAD LOCL DCA XLOCL /SAVE CURRENT LOCATION TAD LOCH DCA XLOCH TAD BLK DCA XBLK TAD ACC1 / & COUNT FOR RESET DCA OPER1 TAD ACC2 DCA OPER2 JMP XSTR6 /NOW SET UP MASK / XSTR5, JMS LCHEK /DONE? ISZ TEMP3 /NO, AT MASK END? JMP XSTR7 XSTR6, TAD MASKBS / YES, RESET MASK DCA SPNT TAD SMASKL DCA TEMP3 XSTR7, JMS I GETI /GET NEXT WORD JMP XSTR10 /MAPPED MODE, NO SUCH ADDRESS JMS STRMSK /TEST & MASK TAD I DPNT /COMPARE? SZA CLA JMP XSTR10 /NO, GO RESET & CONTINUE ISZ CNTR /MATCHED ENOUGH? JMP XSTR5 /NOT YET JMS XRSET /YES, RESET LOCATION & COUNT TAD TEMP /AND LENGTH DCA CNTR XSTR8, TAD M10 DCA ACCX1 / -(#/LINE) JMS ABKLOC /OUTPUT THIS LOCATION XSTR9, JMS I GETI /GET A WORD JMP ERCP /BAD,BAD,BAD!!! JMS I OCTI /AND OUTPUT IN OCTAL JMS I INCI /INCREMENT LOC ISZ CNTR /DONE? JMP XSTR11 /NO, CONTINUE JMS I CRLFI /YES, OUTPUT CR/LF XSTR10, JMS XRSET /RESET LOCATION & COUNT JMS LCHEK /DONE? JMP XSTR4 /NO, LOC INC'D, TRY NEXT / XSTR11, SPACE2 /OUTPUT " " ISZ ACCX1 /DONE ON THIS LINE? JMP XSTR9 /NO, NOT YET JMS I CRLFI /YES JMP XSTR8 XRSET, 0 /RESET BLK & LOC FROM XBLK & XLOC TAD XLOCL /LOC DCA LOCL TAD XLOCH DCA LOCH TAD XBLK /BLK DCA BLK TAD OPER1 /WORDS LEFT TO SEARCH DCA ACC1 TAD OPER2 DCA ACC2 JMP I XRSET STRMSK, 0 /STRING MASKING *** NEXT WORD MODIFIED *** SMSKSW, CDF 10 /"CDF 10" OR "JMP I STRMSK" AND I SPNT /OK, MASK IN FIELD 1 CDF 0 JMP I STRMSK STJMP= JMP I STRMSK STCDF= CDF 10 XBLK, 0 XLOCH, 0 XLOCL, 0 PAGE /ROUTINE TO EXECUTE THE BLOCK 'WRITE' COMMAND XWRARG, JMS I ARGI /GET ONE ARG TAD ACC1 /USE IT AS THE BLOCK SKP XWRITE, TAD WBLK /SET BLOCK DCA XWBLK JMS I DEVAD /CALL HANDLER 4210 /WRITE, 2 PAGES, FIELD 1 IOBUF XWBLK, 0 /[** COUNTER FOR MODIFY **] JMP WERROR /WRITE ERROR DCA MODIF /CLEAR SOMETHING-CHANGED FLAG JMP I RESTAR /WRITE ERROR--TEST TYPE & OUTPUT MESSAGE WERROR, SPA CLA /BIT 0 = 1 IF FATAL ERC02, ERROR /FATAL ERC03, ERROR /NON-FATAL /ROUTINE TO EXECUTE THE 'MODIFY' COMMAND XMODIF, JMS I GWORDI /GET FORMAT WORD IF ONE JMP XMODEF /NONE, GET DEFAULT DCA MODTMP /SAVE FOR LATER ISZ CRSWT /TERMINATED BY A CR? JMP ERCO / YES, SAVE USER FROM HIMSELF! TAD MODTMP /TEST FORMAT FOR RECOGNITION JMS I SORTI MODIFL-1 MODADS-MODIFL ERCO, ERROR / I THEENK YOU USE BAD WORD! / /NO FORMAT DESCRIPTOR GIVEN, USE DEFAULT XMODEF, TAD FCNT /USE CURRENT FORMAT, TAD (MODDLS-1 / WITH A LITTLE DIFFERENCE DCA DPNT TADIDP /GET THE ONE TO USE DCA MODTMP / AND SAVE IT / XMOD0, JMS I GARGI /OK, NOW GET ARGS TAD TEMP /MOVE COUNT TO A SAFE PLACE DCA XWBLK XMOD1, TAD I DPNT /GET BLOCK # JMS BLKTST /TEST & SET BLK TAD I DPNT /GET LOC DCA LOCH TAD I DPNT DCA LOCL TAD I DPNT /GET -(# LOCS) DCA CNTR XMOD2, TAD COMST /INIT COMM. BUFF. FOR MODS DCA COMIR DCA CHARSW /RESET HALF SWITCH JMS I SOCTI /INITIALIZE INPUT TO OCTAL JMS I BKLOCI /OUTPUT START LOC BLK-1 JMS I TWOCI /AND ": " 7240 READLN /GET A LINE (TEST: RUBOUT, ^U & ^R) TYPEM-1 /IGNORE LF'S MCHARO-TYPEM JMP XMOD2 /BUFFER EMPTIED! /CR TYPED, END XMODCR, JMS I ENDCI /END BUFFER WITH A CR. JMP XMOD2 /ONLY A CR IN BUFFER-RETRY! TAD MODTMP /NOW LOOK UP FORMAT JMS I SORTI MODIFL-1 MODIFO-MODIFL ERCP, ERROR /ILLEGAL (EXTRA BAD IF HERE) XMODDN, ISZ XWBLK /RETURN HERE, ALL ARGS DONE? JMP XMOD1 /NO JMP I RESTAR /YES MODTMP, 0 XGET, 0 /SUB. TO SET CURRENT LOC & FLAG JMS I GETI /SET LOCATION ERC07, ERROR /MAPPED MODE, NO SUCH ADDRESS STA DCA MODIF /SET FLAG JMP I XGET /NUMERIC FORMATS HERE XNUM0, JMS I SORTI /TEST TERMINATOR GETLST-1-1 /SPACE, COMMA, CR NUMOPS-GETLST+1 JMP ERCQ /ILLEGAL TERMIN / XNUM1, JMS I GETNI /COMMA, SKIP IT JMS I SSKIPI / SPACE, IGNORE IT XNUM2, JMS EXPRIN /GET NEXT ARG--EXPRESSION JMS XGET /SET UP LOCATION TAD ACC1 DCAICAD / & STORE VALUE JMS I INCI /INCREMENT LOCATION ISZ CNTR /ALL MODS DONE? JMP XNUM0 /NO, TEST TERMIN JMP XMODDN /YES, TEST NEXT SET / XNUM3, TAD CNTR /DONE? SNA CLA JMP XMODDN /YES JMS XGET /NO, SET UP LOC TAD FILLER DCAICAD /AND FILL WITH 'FILLER' JMS I INCI /INCREMENT LOC ISZ CNTR /DONE? JMP XNUM3 /NO JMP XMODDN /YES /ASCII FORMAT HERE JMS CGET /GET A CHAR & CHECK FOR CR XASC1, JMS XGET /SET UP LOC & SET FLAG TAD CHAR DCAICAD /STORE THIS CHAR JMS I INCI /INCREMENT LOC ISZ CNTR /MODS DONE? JMP XASC1-1 /NO JMP XMODDN /YES CGET, 0 /GET NEXT CHAR. IF CR, MODS DONE JMS CGTEST /GET & TEST NEXT JMP XNUM3 /CR, FILL REST WITH 'FILLER' JMP I CGET CGTEST, 0 /SUB. TO GET A CHAR & CHECK FOR CR JMS I GETNI /GET NEXT CHARACTER TAD CHAR /IS IT A CR? TAD M215 SZA CLA ISZ CGTEST /RETURN TO CALL+2 IF NOT JMP I CGTEST DO1SP, 0 /OUTPUT " " + AC JMS I TYPECI " JMP I DO1SP /ANOTHER TUFFIE DO2SP, 0 /OUTPUT " " + AC (PACKED ASCII) JMS I TWOCI 4040 JMP I DO2SP /FAST & SWEET! PAGE /ROUTINE TO EXECUTE THE 'SMASK' (STRING MASK) COMMAND XSMASK, JMS I GARGI /GET ARGS TAD TEMP DCA SMASKL /SAVE -(MASK LENGTH) TAD MASKBS /SET UP TO STORE WORDS DCA SPNT XSMAS1, ISZ DPNT /SKIP 2 WORDS ISZ DPNT TAD I DPNT /GET & STORE ONE CDF 10 DCA I SPNT CDF 0 ISZ DPNT /SKIP 1 MORE ISZ TEMP /DONE ? JMP XSMAS1 /NO JMP I RESTAR /XS240 PACKED ASCII FORMAT HERE XXS20, TAD M240 /SET OFFSET /PACKED ASCII FORMAT HERE XPAC0, DCA PNAME /CLEAR OFFSET XPAC1, TAD M240 /IS CHAR < 240? TAD CHAR SMA CLA JMP XPAC2 /NO, JUST PACK CHAR CMA JMS PACK /YES, PACK A FLAG (77) FIRST XPAC2, TAD CHAR /NOW GO PACK CHAR TAD PNAME /(WITH DESIRED OFFSET) JMS PACK JMS CGET /NOW GET & TEST NEXT JMP XPAC1 / OK, CONTINUE /OS/8 ASCII HERE XOPS1, TAD LOCL /TEST START & COUNT FOR EVEN RAR /(LOW BIT TO LINK & CLA / CLEAR AC) TAD CNTR RAR /(LOW TO LINK, LINK TO AC0) SZL SPA CLA /BOTH L=0 & AC0=0 FOR OK ERC04, ERROR /START OR COUNT NOT EVEN XOPS2, TAD CHARSW /GET SWITCH ISZ CHARSW / & BUMP IT CLL RAR /ROTATE AC 11 INTO LINK SZL SNA CLA /CHARACTER 3? JMP XOPS5 /NO, CHAR 1 OR CHAR 2 STA TAD CAD /YES, BACK UP POINTER DCA CAD STA CLL RAL / & SET LOOP COUNT TO -2 DCA CHARSW XOPS3, TAD CHAR /GET REST OF CHAR CLL RTL /4 BITS LEFT RTL DCA CHAR /SAVE IT TAD CHAR /NOW MERGE 4 BITS WITH AND N7400 / A PREVIOUS CHAR TADICAD DCAICAD /4 BITS OF 3RD + 1ST OR 2ND ISZ CAD /BUMP POINTER ISZ CHARSW /DONE? JMP XOPS3 TAD CNTR /YES, DONE ALL MODS? SNA CLA JMP XMODDN /YES, TEST FOR DONE XOPS4, JMS CGET /GET & TEST NEXT CHAR JMP XOPS2 /OK, DO NEXT / XOPS5, JMS XGET /SET UP CURRENT LOC TAD CHAR DCAICAD /AND STORE CHARACTER JMS I INCI /INCREMENT LOC ISZ CNTR /BUMP COUNTER FOR LATER JMP XOPS4 / SO IGNORE SKIP NOW JMP XOPS4 PACK, 0 /SUB. TO PACK CHARACTERS AND N77 /USE ONLY 6 BITS ISZ CHARSW /CHECK HALF JMP PACK1 TADICAD /RIGHT HALF, ADD TO LEFT DCAICAD TAD CNTR /ALL MODS DONE? SZA CLA JMP I PACK /NO JMP XMODDN /YES / PACK1, JMS I RTL6I /LEFT HALF, ROTATE INTO IT DCA CHARSW /SAVE IT JMS XGET /SET UP CURRENT LOC TAD CHARSW DCAICAD /STORE WORD JMS I INCI /INCREMENT LOC ISZ CNTR /BUMP COUNTER FOR LATER NOP / SO DON'T SKIP NOW STA DCA CHARSW /RESET SWITCH JMP I PACK PNAME, 0 /PRINT A FILE NAME, PADDED W. SPACES TAD NAM1 JMS I TWOT / OUTPUT UP TO TAD NAM2 JMS I TWOT / 6 CHARACTERS TAD NAM3 JMS I TWOT / OF FILE NAME, JMS I TYPECI / A "." ". TAD NAM4 / & UP TO 2 CHARS JMS I TWOT / OF EXTENSION. PNAME1, SPACE1 /OUTPUT A " " TAD NCNT /11(10) CHARS ON LINE YET? TAD (-13 SPA CLA JMP PNAME1 /NO, OUTPUT ANOTHER SPACE JMP I PNAME /SUBROUTINE TO GET A NUMERIC ARGUMENT FROM THE / COMMAND BUFFER AND RETURN IT TO THE 3 WORDS / POINTED TO BY CALL+1. THE FIRST WORD (BLOCK / NUMBER) IS NOT CHANGED IF NO BLOCK PART WAS / GIVEN IN THE COMMAND. LIMITS, 0 TAD I LIMITS /GET ADDRESS OF 3 WORDS ISZ LIMITS DCA PNAME / & SAVE IT JMS I ARGI /GET COMMAND DATA TAD TEMP1 /GET BLOCK NUMBER PART ISZ TEMP1 /WAS A BLOCK PART SPEC'D? DCA I PNAME / YES, STORE IT CLA /(CLEAR IN CASE NOT!) ISZ PNAME /BUMP POINTER TAD ACC2 AND N7 DCA I PNAME /STORE HIGH 3 BITS ISZ PNAME TAD ACC1 DCA I PNAME / & LOW 12 BITS OF ADDR. JMP I LIMITS PAGE /SUBROUTINE TO 'GET' A WORD FROM THE DEVICE. / / THE ACTUAL WORD ON THE DEVICE THAT IS ACCESSED / IS DEPENDENT ON THE MODE SWITCH, AS FOLLOWS: / / MODE ACTION / / 0 = NORMAL THE HIGH 7 BITS OF THE 15 BIT ADDRESS / ARE ADDED TO THE SPECIFIED BLOCK # / TO GET THE ACTUAL BLOCK & THE LOW 8 / BITS OF THE 15 BIT ADDR ARE USED TO / SPECIFY THE WORD WITHIN THE BLOCK. / / -1 = OFFSET THE 12 BIT "OFFSET" (WHICH IS NEGATED) / IS ADDED TO THE LOW 12 BITS OF THE / ADDRESS, AND THEN THE NEW ADDRESS IS / HANDLED AS ABOVE. / THIS MODE IS USED PRIMARILY WHEN / WORKING WITH THE OPERATING SYSTEM / WITH OVERLAYS WHOSE REAL START BLOCK / AND LOCATION WITHIN A FIELD ARE KNOWN. / BY SETTING THE "OFFSET" TO THE START / ADDRESS OF THE OVERLAY, ITS REAL / ADDRESSES CAN BE USED AND THE PROPER / LOCATIONS WILL BE ACCESSED. / / +1 = SAVE THIS MODE IS USED WITH CORE IMAGE / "SAVE" FILES ONLY. THE FILE'S CCB / (CORE CONTROL BLOCK) IS USED TO / DETERMINE THE REAL LOCATION ON THE / DEVICE OF THE SPECIFIED 15 BIT ADDR- / ESS. THE START BLOCK OF THE FILE / IS USED, AND ANY SPECIFIED "BLOCK" / PART IS USED TO SPECIFY THE OVERLAY / WANTED AT THAT ADDRESS. FOR FILES / WITHOUT OVERLAYS (GENERATED BY THE / MONITOR "SAVE" COMMAND), THIS PART / MUST BE ZERO (0) OR NO MATCH WILL / OCCUR. FOR FILES WITH OVERLAYS / (GENERATED BY THE PROGRAM "LINK"), / A LEGAL OVERLAY AT THE SPECIFIED / ADDRESS MUST BE SPECIFIED FOR A / MATCH TO OCCUR. THIS MODE CAN ONLY / BE USED AFTER A "FILE" COMMAND. / / +2 = LOAD THIS MODE IS USED WITH OS/8 FORTRAN / IV LOAD MODULES. THE FILE'S HEADER / BLOCK IS USED TO DETERMINE THE REAL / LOCATION ON THE DEVICE OF THE SPECI- / FIED 15 BIT ADDRESS AND THE "BLOCK" / PART IS USED TO SPECIFY THE OVERLAY / WANTED AT THAT ADDRESS. THIS MODE CAN / ONLY BE USED AFTER A "FILE" COMMAND. /CALLING SEQUENCE: / / JMS I GETI / RETURN1 /MODE=MAPPED, NO SUCH ADDRESS / NORMAL RETURN /'CAD' SET, DATA IN AC /SUBROUTINE 'GET'--PART OF THIS PAGE & ALL OF NEXT GET, 0 JMS I CTRLI /GO TEST FOR CONTROL-CHARS TAD MODSW /OK, TEST MODE SNA JMP GET0 /NORMAL MODE, NO CHANGES SMA CLA JMP GET4 /SAVE MODE, DO MAPPING TAD OFFSET /OFFSET MODE, ADD IT GET0, JMS DBLPGS /NOW ADD 'DOUBLE PAGES' TAD BLK / OF LOC TO BLK TO SET DCA CBLK /'CURRENT BLOCK' GET1, JMS GETIO /OUTPUT CURREN (IF NEEDED), GET NEXT JMP RERROR / READ ERROR, GO TELL ABOUT IT TAD MODSW /TEST AGAIN FOR OFFSET SPA CLA TAD OFFSET /YES, ADD IT AGAIN TAD LOCL /USE 8 ADDRESS BITS FROM LOC AND N377 TAD BUFST /INTO BUFFER, TO SET DCA CAD /'CURRENT ADDRESS' TADICAD /NOW GET THE WORD ISZ GET /RETURN TO CALL+2 WITH IT GETX, JMP I GET /[EXIT TO CALL+1 FOR MAP FAIL] GETIO, 0 /DO I/O FOR 'GET' & 'SCANER' TAD CBLK /IS THIS SAME BLOCK AS IS IN CIA /CORE CURRENTLY? TAD RBLK SNA CLA JMP GETIO2 /YES, USE IT. ISZ MODIF /NO, ANY CHANGES IN THIS BLK? JMP GETIO1 /NO, DEVICE OK AS IS JMS I DEVAD /CALL DEVICE HANDLER 4210 /WRITE, 2 PAGES, FIELD 1 BUFST, IOBUF WBLK, 0 JMP WERROR /WRITE ERROR GETIO1, TAD CBLK /NOW UPDATE OUTPUT BLOCK DCA WBLK TAD CBLK / AND INPUT BLOCK # DCA RBLK DCA MODIF / AND RESET SWITCH TAD CBLK /SHOW BLOCK NUMBER IN LIGHTS MQL / (IF THERE ARE ANY!) CLA JMS I DEVAD /CALL DEVICE HANDLER 0210 /READ, 2 PAGES, FIELD 1 IOBUF RBLK, -1 /(NOTHING IN CORE-ILLEGAL BLK #) JMP I GETIO /READ ERROR GETIO2, ISZ GETIO /OK, DO NORMAL RETURN JMP I GETIO DBLPGS, 0 /CONVERT LOCATION TO DOUBLE-PAGES TAD LOCL AND M400 /HIGH 4 BITS HERE CLL RAL /BECOME LOW 4 BITS TAD LOCH /FOR A 7 BIT VALUE RTL RTL JMP I DBLPGS /GET WORD ROUTINE FOR "ODT" COMMANDS ODGET, 0 TAD SBLK /SET UP BLOCK DCA BLK TAD SLOCH DCA LOCH TAD SLOCL DCA LOCL /SET UP LOCATION JMS I GETI /NOW GET WORD ERC05, ERROR /MAPPED MODE, NO SUCH ADDRESS JMP I ODGET / & RETURN WITH IT /OUTPUT 12 BIT BLOCK # & 15 BIT ADDRESS IN OCTAL BKLOC, 0 TAD I BKLOC /GET ARGUMENT (ADDR-1) ISZ BKLOC DCA GETPNT / & SET UP A-XR TAD I GETPNT /GET BLOCK PART JMS I OCTI / & OUTPUT IT TAD I GETPNT /GET FIELD AND N7 JMS I TWOCI / & OUTPUT "." & IT 5660 / (".0") TAD I GETPNT /GET ADDRESS JMS I OCTI / & OUTPUT IT JMP I BKLOC /SUBROUTINE TO GET A COMMAND WORD OR CHARACTER /FROM THE COMMAND BUFFER. IF THE BUFFER CONTAINS /ONLY NUMERIC ITEMS, RETURN TO CALL+1. TERMINATOR /IS SPACE OR CR GWORD, 0 JMS I SSKIPI /GET NEXT NON-SPACE TAD CHAR AND N77 /USE THIS CHAR AS LEFT JMS I RTL6I / 6 BITS. DCA CHARSW /SAVE IT JMS I SORTI /CHECK FOR ^K, ^D, (, ", ', GWLST1-1 / DIGITS, SPACE & CR GWOPS1-GWLST1 JMS I GETNI /NONE, IS NEXT A SPACE JMS I SORTI / OR A C.R.? GWLST2-1 GWOPS2-GWLST2 TAD CHAR /NONE, USE AS LOWER 6 BITS AND N77 TAD CHARSW DCA CHARSW /SAVE IT GWD1, JMS I GETNI /LOOK FOR SPACE OR C.R. JMS I SORTI GWLST2-1 GWOPS2-GWLST2 JMP GWD1 /NEITHER, KEEP LOOKING / GWD2, STA /SPACE FOUND, SET SWITCH GWD3, DCA CRSWT /CR FOUND, RESET SWITCH TAD CHARSW /RETURN WITH WORD ISZ GWORD / TO CALL+2 GWD4, JMP I GWORD /EXIT TO CALL+1 IF ANY NUMERIC ITEM FOUND-- / ^K, ^D, (, ", ', DIGITS /"DIRECTORY" FORMAT OUTPUT ROUTINE DIRDMP, 0 JMS I OCTI /OUTPUT IN OCTAL FIRST SPACE2 TADICAD JMS DIROUT / THEN 3 OTHERS JMP I DIRDMP /"?" ODT OUTPUT ROUTINE DIROUT, 0 CIA /ASSUME WAS NEGATIVE JMS I DECI / & OUTPUT IN DECIMAL SPACE2 TADICAD JMS I PDATEI /OUTPUT AGAIN AS DATE SPACE2 TADICAD JMS I TWOT /OUTPUT LAST TIME AS PACKED ASCII JMP I DIROUT PAGE /CONTINUATION OF 'GET' -- MAPPING FOR "SAVE" AND "LOAD" / MODES DONE HERE. GET4, JMS DBLPGS /GET # DOUBLE-PAGES DCA CAD / & SAVE IT STA TAD MODSW /TEST FOR SAVE OR LOAD MODE SZA CLA JMP GETL1 / LOAD MODE CDF CIF 10 JMS GCCB /SAVE MODE, GET CCB DCA SEGCNT / & SET UP # SEGMENTS TAD RBLK1 /SET UP ACTUAL FIRST BLOCK IAC DCA CBLK / FOR MAPPING. GETS1, CDF 10 TAD I GETPNT /GET AN ORIGIN WORD DCA GETORG TAD I GETPNT / & A CONTROL WORD. CDF 0 DCA GETCW TAD GETCW /TEST FOR FIELD MATCH CLL RTR RAR AND N7 /(MASK OFF COUNT) CIA TAD LOCH /SAME? SZA CLA JMP GETS2 /NO, TRY NEXT SEGMENT TAD LOCL /YES, NOW TEST ADDRESSES AND M200 /(MASK TO PAGE) STL CIA TAD GETORG /[ORIG PAGE]-[ADDR PAGE] SZA SNL /ABOVE THE ORIGIN? JMP GETS2 /NO, TRY NEXT RAR /OK, DIVIDE BY 2 (WITH SIGN) DCA GETORG / & SAVE IT. TAD GETCW /BEYOND TOP OF SEGMENT? AND M100 /(MASK OFF FIELD AND MAKE) SNA STL RAR / 0 => 40, THEN SUBTRACT TAD M100 / ONE PAGE) TAD GETORG SPA CLA JMP GETS2 /NO, TRY NEXT TAD GETORG /YES, UPDATE CBLK TO RIGHT CIA JMS UPCBLK / ACTUAL BLOCK TAD BLK /MUST BE IN "LVL 0" OR SZA CLA JMP GETX / RETURN AS BAD JMP GET1 /NOW GO GET THE DATA / GETS2, CLA TAD GETCW /UPDATE CBLK AND M100 SNA STL RAR /(MAKING 0 => 40) TAD (100 /(ROUND UP PAGE COUNT) JMS UPCBLK ISZ SEGCNT /ALL SEGMENTS DONE? JMP GETS1 /NO, TRY NEXT TAD OVLFLG /YES, OVERLAYS? (LINK OUTPUT) SNA JMP GETX / NO, RETURN TO CALL+1 TAD (4 / YES, RESET POINTER DCA GETPNT / TO SKIP OVER LVL 0 JMP GETL2 / & CONTINUE / GETL1, CDF CIF 10 JMS GHDR /GET & TEST HEADER GETL2, CDF 10 TAD I GETPNT /GET NUMBER OF OVERLAYS DCA SEGCNT TAD I GETPNT /GET PAGE & FIELD DCA GETCW TAD I GETPNT /GET REL BLK NUMBER TAD RBLK1 / + START BLOCK DCA CBLK / = ABS START BLK, THIS LEVEL TAD I GETPNT /GET LENGTH, THESE OVERLAYS CDF 0 DCA GETORG TAD GETCW /GET DBL-PAGE & FIELD SNA JMP GETX / 0 = THE END!!! AND M400 /CONVERT TO DBL-PAGE # CLL RTL RTL TAD GETCW / IN BITS 5-11 RAL AND N177 CIA /-(DBL-PG # OF OVLY START) TAD CAD /+(DBL-PG # OF DESIRED) SPA JMP GETL3 / GONE TOO FAR, MISSED IT! DCA GETCW /= RELATIVE BLOCK NUMBER TAD GETCW /IS THIS WITHIN THIS OVLY? CIA TAD GETORG SPA SNA CLA JMP GETL2 / NO, TRY NEXT OVERLAY TAD BLK /OK, SET UP -(#LVL +1) CMA DCA UPCBLK /V7B TAD UPCBLK /V7B-ADDR IS OK, IS THERE A TAD SEGCNT / LEVEL WANTED? GETL3, SPA CLA JMP GETX /ILLEGAL LEVEL; TOO FAR--EXIT TAD GETCW /ALL OK! ADD RELATIVE BLK SKP GETL4, TAD GETORG / TO (LVLS-1)*LENGTH-V7B TAD CBLK DCA CBLK / TO OVERLAY START BLOCK ISZ UPCBLK /[MULTIPLY BY ADDING]-V7B JMP GETL4 JMP GET1 GETORG, 0 GETCW, 0 SEGCNT, 0 UPCBLK, 0 JMS I RTR6I /MOVE COUNT TO BITS 6-11 CLL RAR /DIVIDE FOR DOUBLE PAGES TAD CBLK /UPDATE DCA CBLK JMP I UPCBLK PAGE /NUMERIC OUTPUT SUBROUTINES, NO ZERO SUPPRESSION: OPRT, 0 /4-DIGIT OCTAL JMS NUMOUT -1000 -100 -10 0 JMP I OPRT OCT3, 0 /3-DIGIT OCTAL JMS NUMOUT -100 -10 0 JMP I OCT3 BPRT, 0 /3-DIGIT BCD JMS NUMOUT -400 -20 0 JMP I BPRT SGNDP, 0 /4-DIGIT DECIMAL, SIGNED DCA NUMB TAD NUMB SPA CLA TAD N15 SPACE1 /OUTPUT "-" OR " " TAD NUMB /NOW OUTPUT IN DECIMAL SPA CIA JMS DPRT JMP I SGNDP DECIMAL DPRT, 0 /4-DIGIT DECIMAL, UNSIGNED JMS NUMOUT -1000 -100 -10 0 JMP I DPRT DEC2, 0 /2-DIGIT DECIMAL, UNSIGNED AND N177 /MASK IT FIRST JMS NUMOUT -10 0 JMP I DEC2 OCTAL NUMOUT, 0 /THE REAL OUTPUT SUBROUTINE DCA NUMB /SAVE THE NUMBER NUMO1, DCA NUMDGT /RESET "DIGIT" TO 0 CLA CLL TAD NUMB /GET CURRENT VALUE TAD I NUMOUT /SUBTRACT DIGIT BASE SNL /DID IT OVERFLOW? JMP NUMO2 /NO, TOO FAR! ISZ NUMDGT /YES, BUMP DIGIT DCA NUMB / & UPDATE VALUE JMP NUMO1+1 / NUMO2, CLA CLL TAD NUMDGT /OUTPUT THE "DIGIT" DIGIT ISZ NUMOUT /BUMP TO NEXT ARG TAD I NUMOUT /DONE ENOUGH? SZA CLA JMP NUMO1 TAD NUMB /YES, SO OUTPUT THE LAST DIGIT / ONE. JMP I NUMOUT /AND RETURN NUMB, 0 NUMDGT, 0 SSKIP, 0 /SKIP SPACES IN COMMAND BUFFER. TAD CHAR TAD M240 /IS THIS A SPACE? SZA CLA JMP I SSKIP /NO, DONE JMS I GETNI /YES, GET NEXT CHAR JMP SSKIP+1 / & GO TRY IT /OS/8 ASCII OUTPUT SUBROUTINE. OUTPUTS 1 CHAR / FOR EVEN WORD & 2 CHARS FOR ODD WORD. OSTYPE, 0 JMS OSSET /DO SETUP FOR UNPACKING JMS I (ASCII /OUTPUT CHARS TO "STANDARD" ISZ CHARSW /UNPACK 2ND CHARACTER? JMP OSUNPK / YES, & RETURN TO OSSET CALL! JMP I OSTYPE /DONE, RETURN TO CALLER /OS/8 "BYTE" OUTPUT SUBROUTINE. OUTPUT ONE / 8-BIT OCTAL NUMBER FOR EVEN WORD AND TWO 8- / BIT OCTAL NUMBERS FOR ODD WORD. USED FOR / DUMPING OS/8 ".BN" FILES OR ASCII IN OCTAL. BYTEO, 0 JMS OSSET /DO SETUP FOR UNPACKING JMS OCT3 /3 DIGIT OCTAL OUTPUT ISZ CHARSW /UNPACK 2ND "CHAR"? SKP JMP I BYTEO / DONE, RETURN SPACE2 /YES, BUT OUTPUT 2 SPACES JMP OSUNPK / BEFORE DOING UNPACKING /OS/8 FORMAT UNPACKING ROUTINES FOR 'OSTYPE' AND / 'BYTEO'. THE SUBROUTINE SETS UP THE COUNTER / FOR NUMBER OF OUTPUTS TO DO, SAVING & RESTORING / THE AC. THE ROUTINE WILL BE CALLED ONLY IF 2 / OUTPUTS BEING DONE AND DOES THE UNPACK OF THE / 2ND "CHARACTER", RETURNING TO THE CALLER OF THE / SUBROUTINE! OSSET, 0 /ENTER HERE TO INITIALIZE DCA INC /SAVE AC IAC AND LOCL /AC = 0 OR 1 CMA /AC = -1 OR -2 (-# TO DO) DCA CHARSW /SET UP UNPACK COUNT OSRETN, TAD INC /GET VALUE TO AC AND N377 /MASK TO 8 BITS JMP I OSSET / OSUNPK, STA /JUMP HERE IF 2ND CHAR TO GET TAD CAD DCA SGNDP /POINT TO HIGH WORD CDF 10 TAD I CAD /GET LOW BITS OF "CHAR" AND N7400 / MASK TO 4 BITS AND JMS I RTR6I / MOVE TO BITS 8-11 RTR DCA INC /SAVING IT HERE FOR LATER! TAD I SGNDP /NOW GET HIGH BITS OF "CHAR" AND N7400 / MASK TO 4 BITS AND CDF 0 CLL RTR / MOVE TO BITS 4-7 RTR JMP OSRETN /GET OTHER BITS & RETURN! /SUBROUTINE TO INCREMENT THE "CURRENT LOCATION" INC, 0 ISZ LOCL /INCREMENT LOW 12 ADDR BITS JMP I INC /OK AS IS CLL TAD LOCH /LOW OVERFLOW, INCR. HIGH TAD (7771 / 3 ADDRESS BITS (& TEST) AND N7 DCA LOCH SZL /DID HIGH OVERFLOW ALSO? TAD N200 / YES, THEN BUMP BLK ALSO TAD BLK DCA BLK JMP I INC PAGE /OUTPUT PACKED STRING, ADDRESS IN CALL+1, / TERMINATOR IS XX00. TYPES, 0 TAD I TYPES ISZ TYPES JMS TYPSTR JMP I TYPES /OUTPUT PACKED STRING, ADDRESS IN AC, TERMIN IS XX00 TYPSTR, 0 DCA GETNT TTAGN, CDF 10 TAD I GETNT CDF 0 ISZ GETNT JMS PACOUT TAD GNAME AND N77 SNA CLA JMP I TYPSTR JMP TTAGN /PACKED ASCII OUTPUT ROUTINE PACOUT, 0 DCA GNAME TAD GNAME /USE LEFT 6 BITS JMS I RTR6I JMS ONECHR TAD GNAME /USE RIGHT 6 BITS JMS ONECHR JMP I PACOUT /OUTPUT TRIMMED OR UNTRIMMED ASCII IN THE AC ONECHR, 0 /NO CODE FOR CR/LF AND N77 SNA JMP I ONECHR /IGNORE "@" TAD (-40 SMA TAD M100 JMS I TYPECI 340 JMP I ONECHR /SUBROUTINE TO MATCH CHAR AGAINST LIST1 AND JUMP /THROUGH LIST2 WHEN MATCH FOUND. BOTH LISTS IN /FIELD 1. SORTJ, 0 SNA TAD CHAR /USE CHAR IF AC = 0 DCA SORTEM /ITEM TO LOOK UP TAD I SORTJ ISZ SORTJ /GET LIST1 ADDRESS DCA SCANX1 SORT1, CDF 10 TAD I SCANX1 /COMPARE WITH SORTEM CDF 0 SNA /0 ? JMP SORT2 /END OF LIST CIA STL TAD SORTEM SZA CLA /DOES IT MATCH? JMP SORT1 /NO, TRY NEXT TAD SCANX1 /YES, GET ADDRESS... TAD I SORTJ DCA SORTJ /...OF JUMP ADDRESS CDF 10 TAD I SORTJ DCA SORTJ CDF 0 JMP I SORTJ /GO TO ROUTINE SORT2, ISZ SORTJ /MATCH NOT FOUND, JMP I SORTJ /EXIT TO CALL+3 SORTEM, 0 /SUBROUTINE TO GET A NAME FOR 'XOPEN', 'XFILE', 'XDEV' & 'XDDEV' GNAME, 0 /GET A FILE OR DEVICE NAME DCA TEMP1 /SET UP "." SWITCH AND TAD TEMP1 / FILE/DEVICE SWITCH DCA TEMP2 DCA NAM1 DCA NAM2 /CLEAR NAME AREA DCA NAM3 TAD (2326 / & INIT EXTENSION TO "SV" DCA NAM4 TAD (NAM1 / & INIT POINTER FOR NAME DCA TEMP JMS I SSKIPI /SKIP LEADING SPACES STA TAD COMOUT /BACK UP THE POINTER DCA COMOUT JMS GPAIR /1ST & 2ND CHAR JMS GPAIR /3RD & 4TH GETSCN, JMS GPAIR /5TH & 6TH OR 1ST & 2ND EXT. JMS GETNT /SCAN FOR TERMINATOR CLA JMP .-2 / GETCOL, TAD TEMP2 /":" SEEN, DEVICE OR FILE NAME? SZA CLA JMP GETNTC / FILE, JUST USE THE ":" ISZ TEMP2 / DEVICE, FLAG ":" SEEN JMP GETSCN+1 / AND SCAN TO TERMIN. / GETPER, ISZ TEMP1 /"." FOUND, FIRST ONE? ERCM, ERROR /NO, THE END... DCA NAM4 /YES, RESET EXT, TAD (NAM4 / SET POINTER DCA TEMP JMP GETSCN / & GO GET IT / GETEND, STA /TERM = SPACE, SET SWITCH DCA CRSWT /TERM = CR, RESET SWITCH JMP I GNAME /..DONE.... GETNT, 0 /GET & TEST A CHAR JMS I GETNI /GET NEXT CHAR JMS I SORTI /TEST IT GETLST-1 GETOPS-GETLST GETNTC, TAD CHAR /OK, USE CHAR AND N77 /MASK TO 6 BITS JMP I GETNT / & EXIT WITH IT GPAIR, 0 /GET RIGHT/LEFT-HALF-CHARS JMS GETNT JMS I RTL6I /TO LEFT HALF DCA I TEMP / & STORE IT JMS GETNT TAD I TEMP /MERGE WITH LAST LEFT DCA I TEMP ISZ TEMP /BUMP POINTER JMP I GPAIR RTL6, 0 /ROTATE AC 6 LEFT CLL RTL RTL RTL JMP I RTL6 RTR6, 0 /ROTATE AC 6 RIGHT CLL RTR RTR RTR JMP I RTR6 PAGE /SUBROUTINE TO READ A "LINE" FROM THE USER. IT CHECKS FOR / RUBOUT, ^U AND ^R FIRST, THEN CHECKS FOR ONE OF A LIST OF / TERMINATORS PASSED BY THE CALLER. AS WITH OS/8, RUBOUT / DELETES CHARACTES AND ^U DELETES THE CURRENT LINE. ^R / (FOR RETYPE) ECHOES THE CURRENT COMMAND BUFFER IN THE SAME / MANNER AS LINE-FEED DOES FOR OS/8. IF THE CHARACTER IS A / TERMINATOR, CONTROL PASSES DIRECTLY TO THE CORRESPONDING / CALLER ROUTINE (OUT OF THIS ROUTINE). INPUT CHARACTERS / ARE ALSO TRANSLATED FROM LOWER CASE TO UPPER CASE. EXIT / IN THE NORMAL MANNER OCCURS ONLY ON BUFFER EMPTY FROM / RUBOUT OR ^U. READ, 0 /READ AND ECHO INPUT CHARACTER TAD I READ /GET TWO LIST ADDRESS PARAMETERS ISZ READ DCA RETERM / FROM CALLER AND SET UP IN TAD I READ / SORT ROUTINE CALL ISZ READ DCA RETERM+1 RENEXT, JMS RKEY /GET A CHAR JMP RUBO /RUBOUT, GO BEGIN DELETIONS REKEY, DCA CHAR JMS I SORTI /CHECK FOR CTRL-R & CTRL-U REACTL-1 REACTS-REACTL TAD CHAR JMS I TYPEI JMS I SORTI /CHECK FOR CALLER TERMINATORS RETERM, 0 / PARAMETERS HERE 0 TAD CHAR /NONE, JUST STORE IN BUFFER SKP RESPC, TAD (" /FOR CAMMAND INPUT, TAB -> SPACE! CDF 10 DCA I COMIR /COMMAND (LINE) INPUT BUFFER CDF 0 JMP RENEXT / /+++ FOR SCOPE OPERATION, RUBOUTS CAUSE OUTPUT OF THE /+++ SEQUENCE BACKSPACE, SPACE, BACKSPACE TO CLEAR THE /+++ PREVIOUS CHARACTER FROM THE SCREEN. IF "SCOPE /+++ MODE" IS SET, RUBO IS OVERLAID ON STARTUP. /*** FOR BATCH OPERATION, RUBOUTS ARE IGNORED BY 'RKEY' /*** AND 'RUBO' IS OVERLAID WITH CODE TO IGNORE A LINE- /*** FEED THAT FOLLOWS A CARRIAGE-RETURN. / RUBO, JMS BTEST /RUBOUT TYPED,TEST FOR EMPTY JMP RUBOF / INPUT BUFFER EMPTY! JMS I TYPECI /OK, OUTPUT 1ST "\" "\ RUBO1, JMS BTEST /NOW EMPTY? JMP RUBOE / YES, LINE END TAD COMIR /ECHO LAST CHAR IN BUFFER DCA ENDC CDF 10 TAD I ENDC CDF 0 JMS I TYPEI STA TAD COMIR /NOW BACK UP POINTER DCA COMIR JMS RKEY /GET A CHAR JMP RUBO1 /ANOTHER RUBOUT, GO HANDLE DCA BTEST /SAVE THE CHAR JMS I TYPECI / DO CLOSING "\" "\ TAD BTEST JMP REKEY /& GO USE NEW CHAR / RUBOE, JMS I TYPECI /BUFFER WAS EMPTIED, "\ /OUTPUT CLOSING "\" RUBOF, JMS I CRLFI / & A CR/LF JMP I READ / RECHO, JMS I TYPECI /ECHO "^R" & THEN "R-100 JMS I CRLFI /ECHO CURRENT LINE TAD COMST /INIT AUTO-XR DCA COMOUT RECHO1, TAD COMOUT /DONE? CIA TAD COMIR SNA CLA JMP RENEXT /YES, MORE INPUT JMS I GETNI /NO, GET NEXT CHAR JMS I TYPEI / & OUTPUT IT JMP RECHO1 / & CONTINUE / RERASE, JMS I TYPECI /OUTPUT "^U" "U-100 JMP RUBOF /GO OUTPUT CR/LF & EXIT BTEST, 0 /TEST FOR COMM. BUFFER EMPTY TAD COMIR CIA TAD COMST SZA CLA /EMPTY? ISZ BTEST /NO, STILL OK, TO CALL+2 JMP I BTEST / OTHERWISE TO CALL+1 RKEY, 0 /GET A NON-NULL CHAR, TEST & TRANSLATE KSF /*** JMS I CTRLI /CHECK KEYBOARD JMP .-1 /*** CIF BAT /BATCH OPER. JMS I CTRLI /*** JMS I BATINI KSF /*** ERROR /EOF!! JMP RKEY+1 /*** NOP /MUST USE SPECIAL CARE KRB /*** NOP / TO HANDLE CTRL-Q! AND N177 /MASK OFF PARITY SNA JMP RKEY+1 /NULL CHAR TAD (-177 /IS IT A RUBOUT? SNA RKEY0, JMP I RKEY /YES, EXIT TO CALL+1 /*** BATCH ISZ RKEY /NO, EXIT TO CALL+2 /*** OPER. TAD (2 /TEST FOR ALT-MODES SMA JMP RKEY1 / 375 OR 376 TAD (35 /IS IT LOWER CASE? SMA TAD (-40 /YES, MAKE UPPER CASE TAD (-35 RKEY1, TAD (375 /RESTORE CHAR & ADD PARITY JMP I RKEY / & EXIT WITH IT /SUBROUTINE TO TERMINATE COMMAND BUFFER WITH A C.R. /RETURN TO CALL+1 IF ONLY A CR (EXCLUDING LEADING /SPACES) IN BUFFER, TO CALL+2 IF ANYTHING ELSE. ENDC, 0 TAD (215 /PUT A CR IN BUFFER CDF 10 DCA I COMIR CDF 0 TAD COMST /INIT'L BUFFER UNLOAD DCA COMOUT TAD CHAR /SAVE CHAR FOR POSSIBLE DCA TEMP / USE BY 'WCHEK' JMS I GETNI /GET FIRST CHARACTER JMS I SSKIPI /SKIP LEADING SPACES TAD CHAR /GET 1ST NON-SPACE TAD M215 /IS IT A CR? SZA CLA /YES, NOTHING IN BUFFER ISZ ENDC /OTHERWISE RETURN TO CALL+2 JMP I ENDC DODIG, 0 /OUTPUT AC AS AN ASCII DIGIT JMS I TYPECI "0 JMP I DODIG PAGE /'FPP'/OCTAL/'PDP' OUTPUT ROUTINE FOR ODT ODTOUT, 0 TAD TYPSW /-1, 0, +1 TAD (TAD ODTOL /GENERATE ADDRESS OF DESIRED DCA ODTOPT / OUTPUT ROUTINE ODTOPT, HLT /[USED TWICE!] DCA ODTOPT JMS I ODGETI /GET SPECIFIED WORD JMS I ODTOPT / & OUTPUT IT JMP I ODTOUT FPPDMP /-1 = OCTAL + FPP ODTOL, OPRT / 0 = OCTAL PDPDMP /+1 = OCTAL + PDP /OCTAL & 'PDP' (SYMBOLIC) DUMP ROUTINE PDPDMP, 0 JMS I OCTI /FIRST OUTPUT IN OCTAL SPACE2 /FOLLOWED BY 2 SPACES, JMS PDPOUT / & THEN AS 'PDP' JMP I PDPDMP /'PDP' (SYMBOLIC) INSTRUCTION DECODING PDPOUT, 0 CLA JMS OPRTST /TEST FOR OPR & IOT JMP OPRS / OPR JMS IOPRNT / IOT SYMS, JMS GETOP /GET OP-CODE TO BITS 9-11 RAL / * 2 JMS SYMTYP /OUTPUT 3 CHAR SYMBOL & SPACE INSLST /(TABLE FOR INDEXING) -2 /(- # WORDS) JMS OPRTST /TEST FOR OPR & IOT JMP SYMEND / OPR, DONE JMP IOTS / IOT TADICAD /MEMORY REF., INDIRECT? AND (400 SNA CLA JMP REFS1 /NO JMS I TWOCI /YES, OUTPUT "I " 1140 REFS1, TADICAD /SET UP ADDR BITS AND N177 DCA BITVAL /SAVE THEM TADICAD /IS THIS A 'PAGE 0 REF'? AND N200 SZA CLA TAD LOCL /NO, USE PAGE BITS AND M200 TAD BITVAL /OK, NOW ADD ADDR BITS REFS2, JMS I OCTI /OUTPUT IN OCTAL SYMEND, JMP I PDPOUT /DONE, RETURN / IOTS, TADICAD /USE ONLY LAST 9 BITS AND (777 JMP REFS2 /AND OUTPUT IN OCTAL / OPRS, TADICAD /IS THIS A NOP? AND (777 SNA JMP SYMS /YES, OUTPUT "NOP " AND N200 /IS THERE A CLA IN IT? SNA CLA JMP OPRS1 /NO, CONTINUE JMS SYMTYP /YES, OUTPUT "CLA " CLANAM -2 IAC OPRS1, DCA CNT /SET ANYTHING OUTPUT SWITCH TADICAD /SET UP WORD FOR DECODE JMS I RTL6I RAR DCA BITVAL /SAVE IT TADICAD /CHECK FOR OPR1, OPR2 OR EAE CLL RAR AND N200 SNA JMP OPR1A /OPR1 MICRO-INSTRUCTION SNL CLA JMP OPR2A /OPR2 MICRO-INSTRUCTION / /DO THE DOCODING FOR THE EAE MICRO-INSTRUCTIONS EAE, TAD (EAELST-2 /SET UP EAE LIST POINTER DCA BITPNT JMS BITS /SHIFT & CHECK BIT 5 JMS OPRTYP /IF = 1, "MQA " TAD BITVAL /CHECK BIT 6 CLL RAL /("SCA" IN "A" MODE OF 8/E DCA BITVAL / 'MODE BIT' IN "B" MODE) SZL TAD N20 /IF ON, USE OTHER WORDS DCA EAETMP JMS BITS /CHECK BIT 7 JMS OPRTYP / "MQL " TADICAD AND (16 TAD EAETMP /(ADD SWITCH WORD) JMS SYMLIM /CHECK FOR & OUTPUT LAST INST. -36 /UPPER LIMIT EAETMP, 0 / /DO THE DECODING FOR THE OPR1 MICRO-INSTRUCTIONS OPR1A, TAD (OP1LST-2 /SET OPR1 LIST DCA BITPNT JMS BITS /SHIFT & CHECK BIT 5 JMS OPRTYP /IF = 1, OUTPUT "CLL " JMS BITS /CHECK BIT 6 JMS OPRTYP / "CMA " JMS BITS /CHECK BIT 7 JMS OPRTYP / "CML " ISZ BITPNT /BUMP POINTER ISZ BITPNT TADICAD /LOOK FOR IAC RAR SZL CLA JMS OPRTYP /OUTPUT "IAC " TADICAD /SET UP TO CHECK FOR ROTATES AND (16 JMS SYMLIM /CHECK & OUTPUT -12 /UPPER LIMIT PAGE /OCTAL & 'FPP' (SYMBOLIC) DUMP ROUTINE FPPDMP, 0 JMS I OCTI /FIRST OUTPUT IN OCTAL SPACE2 / THEN 2 SPACES JMS FPPOUT / & THEN AS FPP JMP I FPPDMP /THE FOLLOWING ROUTINES ARE USED BY 'PDPOUT' /DO THE DECODING FOR THE OPR2 MICROINSTRUCTIONS OPR2A, TAD (OP2LST-2 /SET UP LIST POINTER DCA BITPNT JMS BITS /SHIFT & CHECK BIT 5 JMS OPR2T /IF 1, OUTPUT "SMA " OR "SPA " JMS BITS /CHECK BIT 6 JMS OPR2T / "SZA " OR "SNA " JMS BITS /CHECK BIT 7 JMS OPR2T / "SNL " OR "SZL " JMS BITS /CHECK BIT 8 SKP JMP OPR2B /IT WAS 0 TADICAD /MUST CHECK FOR "SKP " AND (160 SNA CLA /ARE ALL SKIP SENSES = 0? JMS OPRTYP /YES, SO OUTPUT "SKP " OPR2B, TAD (OP2LST+14 /SET UP CHECK FOR OSR & HLT DCA BITPNT JMS BITS /CHECK BIT 9 JMS OPRTYP / "OSR " JMS BITS /CHECK BIT 10 JMS OPRTYP / "HLT " JMP OPEND /CHECK FOR ANY DONE SYMLIM, 0 /CHECK LAST SYMBOL AGAINST LIMIT DCA CHAR /SAVE AC TAD CHAR SPA SNA /IS IT > 0? JMP OPEND /NO, TEST IF ANY OUTPUT DONE TAD I SYMLIM /IT IS > UPPER LIMIT? SMA SZA CLA JMP OPEND /NO, GO CHECK AGAIN TAD CHAR /CALCULATE ADDRESS JMS OPRTYP / & OUTPUT LAST JMP SYMEND /...DONE / OPEND, CLA TAD CNT /ANYTHING OUTPUT? SZA CLA JMP SYMEND /YES, DONE WITH OUTPUT JMS SYMTYP /NO, OUTPUT "OPR " OPRMES -2 JMP IOTS /NOW GO OUTPUT LAST 9 BITS BITS, 0 /DECODE A WORD ONE BIT AT A TIME TAD BITVAL /SHIFT A BIT INTO LINK CLL RAL DCA BITVAL /SAVE FOR LATER ISZ BITPNT /BUMP SYMBOL POINTER ISZ BITPNT SNL ISZ BITS /TO CALL+2 IF L = 0 JMP I BITS OPRTYP, 0 /OUTPUT AN OPR SYMBOL JMS SYMTYP /OUTPUT THE SYMBOL BITPNT, 0 /ADDRESS -2 ISZ CNT /SET SWITCH JMP I OPRTYP SYMTYP, 0 /OUTPUT A SYMBOL TAD I SYMTYP /ADD TABLE ADDR TO ANY INDEX ISZ SYMTYP DCA SYMPNT /SAVE POINTER TAD I SYMTYP /GET COUNT OF WORDS ISZ SYMTYP DCA BITS / & SAVE IT SYMNXT, CDF 10 /"SYMBOL"S IN FIELD 1 TAD I SYMPNT CDF 0 JMS I TWOT /OUTPUT A PAIR OF LETTERS ISZ SYMPNT ISZ BITS /DONE? JMP SYMNXT JMP I SYMTYP SYMPNT, 0 OPR2T, 0 /OUTPUT AN OPR2 SYMBOL TADICAD AND (10 /IF BIT IS ON, REVERSE THE JMS OPRTYP /SENSE OF THE SKIP JMP I OPR2T BITVAL, 0 IOPRNT, 0 /OUTPUT I/O NAMES TAD (IOTTAB /SET UP POINTER IOPRN1, DCA IOPNT /SET (OR UPDATE) POINTER CDF 10 TAD I IOPNT /GET NEXT IOT CDF 0 SNA /AT END OF TABLE? JMP I IOPRNT /YES, CODE NOT FOUND CIA TADICAD /NO, DO THEY MATCH? SNA CLA JMP IOPRN2 /YES, OUTPUT NAME TAD (4 /NO, UPDATE POINTER TAD IOPNT JMP IOPRN1 / & TRY AGAIN / IOPRN2, IAC /WORD FOLLOWS CODE JMS SYMTYP /OUTPUT THE MNEMONIC IOPNT, 0 -3 JMP SYMEND / & RETURN OPRTST, 0 /TEST "INSTRUCTION" FOR OPR & IOT TADICAD /GET WORD AND N7000 /MASK OFF OP CODE TAD (1000 /IS IT AN OPR? SNA JMP I OPRTST /YES, EXIT TO CALL+1 ISZ OPRTST TAD (1000 /IS IT AN IOT? SZA CLA ISZ OPRTST /NO, EXIT TO CALL+3 JMP I OPRTST / YES, TO CALL+2 PAGE /'FPP' (SYMBOLIC) INSTRUCTION DECODING FPPOUT, 0 CLA /HARD TO TELL WHAT MIGHT COME! TADICAD /GET THE WORD AND (600 /MASK OFF MODE BITS SNA JMP SPECIAL / NON-ARITHMETIC TAD M400 /GIVES: -=BASE, 0=LONG, +=INDIR. DCA TEMP2 JMS GETOP /GET OP-CODE TO BITS 9-11 FPLEA, JMS MULT3 /MULTIPLY BY 3 (WORDS/OP OUT) JMS SYMTYP /OUTPUT 6 CHAR OPR SYMBOL FPPINS /(INCLUDING "LEA") -3 TAD TEMP2 /NOW HANDLE MODE SNA JMP LONG / LONG INDEXED SMA CLA JMP INDIR / INDIRECT INDEXED BASE, JMS I TYPSI / BASE - OUTPUT " B+" MSBASE TADICAD /GET WORD AGAIN AND N177 / MASK OFF OFFSET JMS MULT3 / MULTIPLY IT BY 3 JMS OCT3 / & OUTPUT IN OCTAL JMP I FPPOUT / INDIR, JMS I TYPSI /OUTPUT "% B+" MSINDI TADICAD /GET WORD AGAIN AND N7 / MASK OFF OFFSET JMS MULT3 / MULTIPLY IT BY 3 JMS OCT3 / & OUTPUT IT IN OCTAL JMP XRPLUS /FINALLY DO XR OUTPUT / LONG, JMS I TWOCI /OUTPUT "# " 4340 JMS FLDOUT /AND FIELD AND "*" XRPLUS, JMS GET678 /GET XR FIELD JMS I TWOCI / & OUTPUT ",X" WHERE 5460 / "X" IS A DIGIT TADICAD /GET WORD THE LAST TIME AND (100 / AND CHECK "+" BIT SZA CLA JMS I TYPECI /OUTPUT "+" OR SKIP "+ /[A NOP] JMP I FPPOUT / SPECIAL,JMS GETOP /GET OP-CODE JMS I SORTI / & BRANCH ON IT FPPMO0-1 FPPMOJ-FPPMO0 SPCOP0, TADICAD /FALLS THRU ON 0, GET AND (170 / SUB-OP-CODE JMS I SORTI / & BRANCH ON IT FPPOP0-1 FPPOPJ-FPPOP0 SPOP00, TADICAD /FALLS THRU ON 0, USE AS AND N7 / INDEX INTO LAST LIST IAC SPOP04, JMS MULT3 /THREE WORDS/SYMBOL JMS SYMTYP /OUTPUT ONE OF SEVERAL FPOP00 / SYMBOLS IN THIS LIST -3 JMP I FPPOUT / SPOP05, CLL STA /= -1 JMP SPOP04 /OUTPUT "STARTE" / SPNUSE, CLL STA RAL /= -2 JMP SPOP04 /OUTPUT "UNUSED" / SPO123, JMS GET678 /"ALN X", "ATX X", "XTA X" CLL RAL /(2 WORDS PER) JMS SYMTYP /OUTPUT SYMBOL FPXR1S-2 -2 JMP XROUT / & XR VALUE / SPOP10, TAD (4 /"LDX *,X" SPOP11, JMS SYMTYP /"ADDX *,X" FPXR2S -4 XROUT, TADICAD /GET XR FIELD AND N7 DIGIT / & OUTPUT AS DIGIT JMP I FPPOUT / SPCOP1, TADICAD /GROUP 0 OR 1? AND (100 SNA CLA JMP SPOP1J / 1 = CONDITIONAL JUMPS JMS GET678 / 0 = SETS, ETC. TAD (-4 /SUB-OP-CODES 0 THRU 3? SMA CLA JMP SPNUSE / NO, 4 THRU 7 = UN-USED JMS GET678 /0 THRU 3: SETX,SETB,JSA,JSR IAC / +1+1 => 2 THRU 5 SPCOP3, IAC / 1: TRAP3 SPCOP4, JMS MULT3 / 0: TRAP4 JMS SYMTYP /GO DO ONE OF THESE FOP134 -3 JMP DOFLD /FINISH WITH FIELD / SPOP1J, JMS CONDIT /CONDITIONAL JUMPS 1200 / "J--" SPACE2 DOFLD, JMS FLDOUT /OUTPUT FIELD & "*" JMP I FPPOUT / SPCOP2, JMS I TYPSI /OUTPUT "JNX " MSJNX JMP XRPLUS-1 / & HANDLE ADDRESS / / SPCOP3 & SPCOP4 / SPCOP5, TADICAD /GET WORD AGAIN AND (100 SZA CLA JMP SPNUSE /BIT 5 ON IS UNUSED OP JMS CONDIT /LOAD TRUTH 1424 / "LT--" JMP I FPPOUT / SPCOP7, IAC / "LEA" INDIRECT, SET SWITCH SPCOP6, DCA TEMP2 / "LEA" LONG, SET SWITCH CLL STA JMP FPLEA / & GO DO OUTPUT PAGE PDATE, 0 /ROUTINE TO OUTPUT AN EXTENDED DATE WORD DCA CRLF /SAVE IT TAD CRLF /GET WORD & MASK AND N377 CLL RTR /DAY (4-8) TO 7-11 RAR JMS I DEC2I / OUTPUT AS 2 DIGITS (MASKED) JMS I TYPECI / AND A SEPARATOR "- TAD CRLF /GET WORD A SECOND TIME JMS I RTR6I /MONTH (0-3) TO 7-10 RAR / FOR MONTH*2 AND (36 / MASK IT AND USE AS AN INDEX JMS I TYPSI / TO OUTPUT MONTH IN ALPHA MONTHS / FORM (WITH SAFETY...) JMS I TYPECI /FOLLOWED BY "-" "- TAD CRLF /GET LAST TIME AND N7 / MASK OFF YEAR TAD YRTEST / TEST IF .GT. THIS YEAR SMA SZA TAD (-10 / YES, SUBTRACT 8 TAD YRBASE / ADD TO BASE YEAR JMS I DEC2I / & OUTPUT IT JMP I PDATE YRTEST, 0 /-(THIS YEAR) FOR TESTING YRBASE, 0 /BASE YEAR FOR DATE + THIS YEAR TYPEA, 0 /OUTPUT ASCII CHARACTER IN THE AC TAD I TYPEA /GET ARG, IF ANY ISZ TYPEA DCA I RTL6I /SAVE THE CHAR HERE FOR FIELD 1 JMS I CTRLI CIF 10 JMP TYPE1 /GO TO FIELD 1 TO DO THE OUTPUT / TYPEX, ISZ NCNT /BUMP LINE POSITION JMP I TYPEA / & EXIT CRLF, 0 /OUTPUT CARRIAGE RETURN, LINE FEED CLA JMS TYPEA 215 JMS TYPEA 212 DCA NCNT /RESET LINE POSITION JMP I CRLF TYPEC, 0 /OUTPUT A SINGLE CHAR ARG TAD I TYPEC /GET IT ISZ TYPEC JMS TYPE /OUTPUT IT JMP I TYPEC TYPE, 0 /CHARACTER OUTPUT ROUTINE AND N377 /BE SURE ONLY 8 BITS SNA TAD CHAR /USE CHAR IF AC = 0 DCA TCHAR /CHAR TO OUTPUT TAD TCHAR JMS I SORTI /CHECK FOR SPECIALS TYPEL-1 TYPEOP-TYPEL TAD TCHAR /IS TCHAR < 240? TAD M240 SPA CLA JMP TYPCTL /NO, OUTPUT AS CTRL-CHAR TYPC, JMS TYPEA /NOW OUTPUT CHAR TCHAR, 0 JMP I TYPE / TYPALT, JMS TYPEA /OUTPUT "$" FOR ALT-MODES "$ JMP I TYPE / TYPCR, JMS CRLF /C.R. TO OUTPUT JMP I TYPE / TYPTAB, JMS TYPEA /SPACE OVER FOR TAB " TAD NCNT /TAB TO OUTPUT TAD M10 SNA JMP I TYPE SMA JMP TYPTAB+3 /REDUCE BY TAB SIZE CLA JMP TYPTAB / TYPCTL, JMS TYPEA /CONTROL-CHAR, OUTPUT AS "^ TAD C100 / "^","CHAR+100" JMP TYPC C100, 100 CTRL, 0 /CHECK FOR CTRL-C, CTRL-S, CTRL-Q & CTRL-P DCA CTRLQS /CLEAR HANG FLAG CTRL0, KSF /HAS A KEY BEEN HIT? JMP CTRLX /NO, TEST IF HANGING KRS AND N177 /YES, MASK OFF PARITY BIT TAD (-"C+300 /IS IT A CTRL-C (ABORT PROGRAM)? SNA BCTRLC, JMP CTRLC /*** JMP I CTRLCI /== ABORT == TAD M20 /IS IT A CTRL-S (STOP OUTPUT)? SZA JMP CTRL1 ISZ CTRLQS / YES, SET HANG FLAG KCC / & CLEAR HARDWARE FLAG CTRL1, TAD (2 /IS IT A CTRL-Q (START OUTPUT)? SZA JMP CTRL2 KCC / YES, CLEAR THE HARDWARE JMP I CTRL / & JUST EXIT / CTRL2, IAC /IS IT A CTRL-P (STOP PROGRAM)? SZA CLA JMP CTRLX /NO, TEST IF HANGING KCC DCA DSWIT /YES, RESET DUMP SWITCH JMS I TYPECI /OUTPUT "^P" "P-100 JMP I RECRLF / THEN CR/LF & RESTART / /ROUTINE TO EXECUTE THE 'EXIT' COMMAND / XEXIT, CTRLC, DCA DSWIT /RESET DUMP SWITCH JMP I M200 / & GO TO SYSTEM CTRLCI, XERR4+1 /*** CTRL-C ABORTS JOB STREAM! *** / CTRLX, TAD CTRLQS /HANGING BECAUSE OF CTRL-S? SZA CLA JMP CTRL0 / YES, BACK FOR ANOTHER ROUND JMP I CTRL / NO, OUT WE GO! CTRLQS, 0 /CTRL-S, CTRL-Q FLAG PAGE /INPUT AN UNSIGNED 24 BIT NUMBER ACCEPT, 0 DCA ACC1 /CLEAR LO DCA ACC2 / & HI WORDS DCA DADD / & LEGAL INPUT SWITCH JMS I SSKIPI /GET FIRST NON-SPACE SKP ACCPT1, JMS I GETNI /DON'T IGNORE SPACES JMS I SORTI /CHECK FOR ^D, ^K, (, ", ', GWLST1-1 / DIGITS, SPACE ACOPS-GWLST1 JMP ACCPT3 /NONE OF THE ABOVE / ACCNUM, TAD CHAR TAD (-"0 /MAKE A DIGIT DCA OCTSET TAD OCTSET /IS DIGIT LEGAL? CIA TAD ACBASE SPA SNA CLA ERC09, ERROR / NO, ILLEGAL DIGIT! ACCMUL, TAD ACBASE /SET UP MULTIPLY OF PREVIOUS DCA OPER1 / BY BASE DCA OPER2 JMS DMUL / DO MULTIPLY TAD OCTSET /SET UP ADD OF NEXT "DIGIT" DCA OPER1 DCA OPER2 JMS DADD /OK, DO THE ADD (& SET SWITCH) JMP ACCPT1 / STA / SPACE HERE DCA CRSWT /SET SWITCH: CR HERE ACCPT3, TAD DADD /TERMINATING CHAR RECEIVED SNA CLA /CHECK FOR LEGAL INPUT ERCR, ERROR /YOU CAN'T OUT-SMART ME! JMP I ACCEPT ACBASE, 10 / / DQUOTE, JMS QUOTEC / " - GET SINGLE CHAR DCA OCTSET / SAVE VALUE JMP ACCMUL / & USE IT AS A "DIGIT" / SQUOTE, JMS QUOTEC / ' - PACKED ASCII, GET 1ST AND N77 /MASK TO 6 BITS JMS I RTL6I /MOVE TO LEFT HALF DCA OCTSET / & SAVE IT JMS QUOTEC /GET 2ND CHAR AND N77 /MASK TAD OCTSET /MERGE JMP DQUOTE+1 / & USE THIS AS A "DIGIT" / CTRLD, TAD (2 / ^D - SET RADIX TO DECIMAL CTRLK, JMS OCTSET / ^K - SET RADIX TO OCTAL JMP ACCPT1 /SUB. TO SET UP FOR OCTAL/DECIMAL INPUT. CALLED FROM / COMMAND INPUT & MODIFY & IF AN "^K"/"^D" IN INPUT. OCTSET, 0 /SET UP FOR OCTAL/DECIMAL INPUT TAD (10 /ENTER WITH AC= 2 FOR DECIMAL DCA ACBASE JMP I OCTSET QUOTEC, 0 /GET A QUOTED CHARACTER JMS CGTEST /GET & TEST FOR A CR ERC13, ERROR / ILLEGAL USE OF " OR ' TAD CHAR /OK, RETURN WITH IT JMP I QUOTEC /SUBROUTINE TO DEVELOP ARGUMENTS FROM THE COMMAND /BUFFER, AND RETURN WITH -(#) OF ARGS IN 'TEMP'. GARGS, 0 TAD TEMPST /GET BUFFER ADDRESS DCA DPNT DCA TEMP /ZERO THE NUMBER OF ARGS GAR1, STA DCA TEMP1 /SET BLK TO -1 STA DCA CNT /RESET SWITCH GAR2, JMS EXPRIN /GET NEXT ARG JMS I SSKIPI /IGNORE TRAILING SPACES JMS I SORTI /BRANCH ON TERMINATOR GARLST-1 GAROPS-GARLST ERCS, ERROR /ILLEGAL TERMIN., FLAME OUT / GAR3, JMS GPUT /CR FOUND, END TAD TEMPST /SET UP POINTER FOR DCA DPNT / GETTING RESULTS JMP I GARGS / GAR4, JMS I GETNI /SKIP OVER "." TAD ACC1 /.= TERMIN (BLOCK PART) JMP GAR1+1 /SET BLOCK & GET NEXT / GAR5, TAD ACC1 /-= TERMIN (LOC PART) DCA TEMP2 JMS I GETNI /SKIP OVER "-" JMP GAR2-1 /GO SET SWITCH / GAR6, JMS GPUT /,= TERMIN JMS I GETNI /SKIP OVER "," JMP GAR1 /SUBROUTINE TO PUT THE DEVELOPED ARGS IN THE ARG /BUFFER. ALL ARGUMENTS ARE STORED IN 4 WORDS IN /THE BUFFER, AS SPECIFIED BY: / BLOCK.LOC1-LOC2 (TERMINATED BY , OR C.R.) /AS: /I-------I-------I-------I-------I----- /I WORD1 I WORD2 I WORD3 I WORD4 I ETC. /I-------I-------I-------I-------I----- /WHERE: / WORD1= BLOCK (OR -1 IF NONE SPECIFIED) / WORD2= LOC (HIGH) [ONLY 3 BITS, LOC2 IF SPEC'D] / WORD3= LOC1 (LOW) / WORD4= LOC2-LOC1-1 (LOC2=LOC1 IF NOT / SPECIFIED) [ONLY 12 LOW BITS USED] GPUT, 0 TAD TEMP1 DCA I DPNT /SET BLOCK ISZ CNT /WAS A LOC2 SPECIFIED? JMP GPUT1 /YES, OK TAD ACC1 DCA TEMP2 /NO, MAKE ARGS SAME GPUT1, TAD ACC2 /STORE HIGH ADDR AND N7 /MASKED TO 3 BITS DCA I DPNT TAD TEMP2 /USE 1ST ARG DCA I DPNT TAD ACC1 CMA TAD TEMP2 DCA I DPNT /DIFF= (TEMP2-ACC1-1) STA TAD TEMP /ANOTHER ENTRY DCA TEMP JMP I GPUT XS240O, 0 /XS240 FORMAT PACKED ASCII JMS I RTR6I /HIGH 6 BITS AND N77 SPACE1 / PLUS A SPACE TADICAD /THEN LOW 6 BITS, AND N77 SPACE1 / PLUS A SPACE JMP I XS240O GETN, 0 /GET NEXT CHAR FROM COMM. BUFF. CDF 10 TAD I COMOUT CDF 0 DCA CHAR JMP I GETN PAGE /ROUTINE TO EVALUATE THE PARENTHESIZED EXPRESSION /OF DOUBLE PRECISION INTEGERS IN THE COMMAND BUFFER. /IT CALLS ITSELF RECURSIVELY TO EVALUATE EXPRESSIONS /IN "(...)", PLACING INFORMATION ON A PUSH-DOWN-LIST /OR DOING ARITHMETIC ACCORDING TO OPERATOR PRECIDENCE. / /OPERATIONS (IN ORDER OF PRECIDENCE): / OR AND ADD SUB DIV MPY / ! & + - / * /ALL ARITHMETIC IS DONE IN DOUBLE-PRECISION SIGNED /INTEGER. OVERFLOW ON MULTIPLY, ADD OR SUBTRACT IS /IGNORED BUT DIVIDE BY 0 WILL CAUSE AN ERROR. EVAL, 0 DCA OPER2 /0 => D.P. TEMP (NEW NUMBER DCA OPER1 / OR LAST RESULT). DCA LASTOP /0 => LASTOP JMS I TERMTI /GET NEXT & TEST FOR TERM. JMP EVAL1 /TERM, CHECK IT JMP ENUM / IT MUST BE A NUMBER EVAL1, JMS I SORTI /CHECK LEGAL TERMS EVLST1-1 /"+","-" & "(" EVOPS1-EVLST1 ERCT, ERROR /SORRY ABOUT THAT EVAL2, JMS I LPARI /IS CHAR "("? ERCU, ERROR /YES,ILLEGAL (NO OP FIRST) EVMIN, TAD CNTRA /SEQN # OF TERMINATOR DCA THISOP /SET UP THISOP TAD CNTRA /IS IT ")" OR "CR"? TAD M10 SMA CLA DCA THISOP /YES, 0 => THISOP EVAL3, TAD THISOP /CHECK PRIORITIES CIA TAD LASTOP /IS LASTOP < THISOP? SPA CLA JMP EVPAR /YES, CONTINUE SCAN TAD THISOP / IS THISOP+LASTOP=0? TAD LASTOP SNA CLA JMP EVALX /YES, DONE TAD LASTOP /NO, DO THIS OP NOW TAD EVTAB DCA EVOP /SET UP OPERATION TAD LASTOP /IS THIS =0? SNA CLA JMP EVOP /YES, DO OP POP /NO, POP LAST OFF LIST DCA ACC2 / INTO D.P.AC. POP DCA ACC1 EVOP, HLT /JMS TO OPERATION ROUTINE TAD ACC2 DCA OPER2 /DUPLICATE D.P.AC. INTO TAD ACC1 DCA OPER1 / D.P. TEMP POP DCA LASTOP /POP UP ANOTHER OLD OPERATOR JMP EVAL3 /AND GO DO IT EVPAR, JMS I LPARI /IS CHAR A "("? JMP EVLPAR /YES, GO DO A SUB-EXPRESSION TAD LASTOP /NO, PUSH DOWN OLD OP PUSH TAD OPER1 / & D.P. TEMP (LAST PUSH TAD OPER2 / RESULT OR NEW NUMBER). PUSH TAD THISOP /UPDATE LASTOP DCA LASTOP EVNEXT, JMS I TERMTI /GET NEXT & TEST FOR TERM. JMP EVLPAR /TERM, MUST BE A "(" ENUM, JMS I SORTI /CHECK FOR "C","B", ETC... EVLST2-1 EVOPS2-EVLST2 JMS ACCEPT /GET A # OR BOMB OUT! STA TAD COMOUT /BACK UP POINTER DCA COMOUT ENUMX, TAD ACC1 DCA OPER1 /LO ORDER PART TAD ACC2 DCA OPER2 /HI ORDER PART JMP EVOPN /GO CHECK TERMINATOR / EVDATE, CDF 10 /"D" -- USE DATE WORD TAD I (7666 /GET DATE WORD CDF 0 JMP EVBLK+1 EVREM, TAD ACCX1 /"R" -- USE REMAINDER DCA ACC1 TAD ACCX2 / AS NEXT "INPUT". JMP EVBLK+2 EVTEMP, TAD TEMPV1 /"T" -- USE 'TEMP' STORAGE DCA ACC1 TAD TEMPV2 JMP EVBLK+2 EVSR, LAS SKP /"S" -- USE SWITCHES TADICAD /"C" -- USE CONTENTS JMP EVBLK+1 EVFIL, TAD FILLER /"F" -- USE FILLER JMP EVBLK+1 EVLOC, TAD LOCL /"L" -- USE LOCATION DCA ACC1 TAD LOCH JMP EVBLK+2 EVBLK, TAD BLK /"B" -- USE BLOCK DCA ACC1 /INTO LO ORDER PART DCA ACC2 /0 HIGH ORDER PART JMP ENUMX /CHECK NEXT CHARACTER EVLPAR, JMS I LPARI /IS CHAR "("? SKP ERCV, ERROR /NO, DIE! (ILLEGAL OPERATOR) EVPAR2, TAD LASTOP /PUSH DOWN LASTOP PUSH TAD EVAL /PREPARE TO RE-CALL PUSH JMS EVAL /RECURSIVE CALL ERCW, ERROR /TERM = CR, NOT ENOUGH PARENS POP DCA EVAL /RESTORE RETURN ADDR POP DCA LASTOP /RESTORE LASTOP EVOPN, JMS I TERMTI /GET NEXT & TEST FOR TERM. JMP EVAL2 /OK JMP EVPAR2-1 /GARBAGE, GIVE SAME ERROR EVALX, TAD CNTRA /WAS CHAR CR OR ")"? TAD M10 SNA CLA ISZ EVAL / ")", RETURN TO CALL+2 JMP I EVAL / CR, RETURN TO CALL+1 LPARI, LPAR TERMTI, TERMT EVTAB, JMS I . /JMS THRU TABLE TO OPERATIONS DIOR /INCLUSIVE OR DAND /AND DADD /ADD DSUB /SUBTRACT DDIV /DIVIDE DMUL /MULTIPLY PAGE PUSHX, 0 /PUSH AC ONTO LIST CDF 10 DCA I PDLPT CDF 0 ISZ PDLPT /BUMP POINTER JMP I PUSHX POPX, 0 /POP LIST INTO AC STA STL /SET LINK SO IT WILL BE 0 TAD PDLPT /BACK UP POINTER DCA PDLPT CDF 10 TAD I PDLPT CDF 0 JMP I POPX LPAR, 0 /CHECK IF CHAR = "(" TAD CHAR TAD (-"( SZA CLA ISZ LPAR /IF IT IS NOT, TO CALL+2 JMP I LPAR / ELSE TO CALL+1 /COMPARE CHAR AGAINST LIST OF TERMINATORS. IF IT /IS ONE, RETURN TO CALL+1, ELSE TO CALL+2. TERMT, 0 CLA CLL JMS I GETNI /GET NEXT CHARACTER JMS I SSKIPI /IGNORE SPACES TAD (TERMS-1 /SET UP POINTER DCA SPNT DCA CNTRA /SET CNTRA TO 0 TERMT1, CDF 10 TAD I SPNT /GET AN ITEM CDF 0 ISZ CNTRA /ADD 1 TO ITEM # SNA JMP TERMTE /WAS 0, END CIA TAD CHAR /SAME AS THIS? SNA CLA JMP I TERMT /YES, TO CALL+1 JMP TERMT1 TERMTE, ISZ TERMT /DIDN'T FIND IT, TO JMP I TERMT / CALL+2 /DOUBLE-PRECISION ROUTINES DADD, 0 /D.P. ADD CLL TAD OPER1 TAD ACC1 /ADD LOW ORDER PARTS DCA ACC1 RAL /GET CARRY TO AC11 TAD OPER2 /ADD HIGH ORDER PARTS TAD ACC2 DCA ACC2 /STORE HIGH ORDER PART JMP I DADD DSUB, 0 /D.P. SUBTRACT DCA DPSGN /ZERO IT FOR SAFETY JMS MULNEG /NEGATE OPERAND JMS DADD / & ADD JMP I DSUB DAND, 0 /D.P. LOGICAL AND TAD ACC2 /AND HIGH ORDER PARTS AND OPER2 DCA ACC2 TAD ACC1 /AND LOW ORDER PARTS AND OPER1 DCA ACC1 JMP I DAND /RETURN DIOR, 0 /D.P. LOGICAL INCLUSIVE OR TAD ACC2 /IOR HIGH ORDER PARTS CMA AND OPER2 TAD ACC2 DCA ACC2 TAD ACC1 /IOR LOW ORDER PARTS CMA AND OPER1 TAD ACC1 DCA ACC1 JMP I DIOR /SUBROUTINE TO GET SINGLE ARGS FROM THE COMMAND /BUFFER. MUST BE IN 'BLOK.LOC' FORM. ONLY ".", /SPACE AND CR ARE ALLOWED OTHER THAN DIGITS. ARG, 0 STA ARG1, DCA TEMP1 /SET 'BLOK' [INIT TO -1] JMS EXPRIN / GET AN ARG JMS I SORTI /LOOK UP TERMINATOR ARGLST-1 ARGOPS-ARGLST ERCQ, ERROR /ILLEGAL TERMINATOR / ARG2, JMS I GETNI /SKIP OVER "." TAD ACC1 /TERM = ".", SET 'BLOK' JMP ARG1 / ARG3, JMP I ARG /TERM = " " OR CR /GET NEXT ARG FROM COMM. BUFF. IF NEXT CHAR IS / A "(", USE 'EVAL' TO GET IT, OTHERWISE USE / 'ACCEPT'. EXPRIN, 0 JMS I SSKIPI /IGNORE SPACES JMS LPAR /IS CHAR A "("? JMP EXPRI1 JMS ACCEPT /NO, MUST BE A NUMBER JMP I EXPRIN / EXPRI1, JMS I EVALI /YES, GO EVALUATE EXPRESSION ERC08, ERROR /CR = ILLEGAL TERMINATOR JMS CGTEST /OK, SKIP OVER ")" & TEST FOR CR SKP STA /NO, SET SWITCH DCA CRSWT /YES, RESET IT JMP I EXPRIN / & LEAVE... SCANER, 0 /EXECUTION SUBROUTINE FOR 'SCAN' COMMAND CLA TAD BLK /SET UP DESIRED BLOCK DCA CBLK JMS GETIO /DO NECESSARY I/O SKP CLA / READ ERROR! JMP I SCANER /THIS BLOCK IS OK! TAD BLK JMS I OCTI /OUTPUT BLOCK NUMBER JMS I TYPSI / & TELL IT'S BAD MSBAD JMS I CRLFI / TO ANOTHER LINE JMP I SCANER PAGE /SIGNED MULTIPLY AND DIVIDE ROUTINES DMUL, 0 JMS MDCOM /MAKE DPAC POS, INITIALIZE SPA CLA /MAKE SURE MULTIPLIER IS POSITIVE JMS MULNEG / IT WAS NEG, MAKE POS & SET SIGN DMUL1, TAD ACC2 /SHIFT RIGHT & OUT RAR DCA ACC2 /THRU HI OF LO TAD ACC1 RAR DCA ACC1 /THRU LO OF LO INTO LINK ISZ DPNEG /DONE YET? JMP DMUL2 /NO, CONTINUE DMUL4, TAD DPSGN /YES, CHECK SIGN OF RESULT RAR SZL CLA /SKIP IF SIGN OK JMS DPNEG /NOT OK, NEGATE JMP I DMUL / DMUL2, SNL /ADD IN THIS TIME? JMP DMUL3 /NO, BIT OUT WAS 0 CLA CLL /YES, BIT WAS 1 TAD OPER1 /START WITH LOW TAD ACCX1 DCA ACCX1 CLA RAL /GET CARRY TAD OPER2 /ADD HIGH PARTS DMUL3, TAD ACCX2 /AND BEGIN SHIFTING OUT RAR DCA ACCX2 TAD ACCX1 RAR DCA ACCX1 JMP DMUL1 DDIV, 0 TAD DDIV /MOVE RETURN ADDRESS DCA DMUL JMS MDCOM /MAKE DPAC POS, INITIALIZE SMA CLA /IS DIVISOR NEGATIVE? JMS MULNEG / NO, NEGATE IT & SET SIGN SZL / IS IT 0? (CARRY OUT ON NEGATE) ERCX, ERROR / YES, YOU LOST ISZ DPSGN /CORRECT FOR SIGN DIF IN * & / DDIV1, TAD ACCX1 /SUBTRACT LO OF LO TAD OPER1 DCA ACCX1 CLA RAL /CARRY TO AC TAD ACCX2 /SUBTRACT HI OF LO TAD OPER2 SPA /TOO FAR? JMP DDIV2 /YES CLL CML /NO, SET LINK DCA ACCX2 JMP DDIV3 DDIV2, CLA TAD OPER1 /RESET LO ORDER PART CIA TAD ACCX1 DCA ACCX1 CLL /RESET LINK DDIV3, TAD ACC1 /BEGIN SHIFTING RAL DCA ACC1 TAD ACC2 RAL DCA ACC2 ISZ DPNEG /DONE YET? SKP JMP DMUL4 /YES, CHECK SIGN & RETURN TAD ACCX1 /NO, KEEP SHIFTING RAL DCA ACCX1 TAD ACCX2 RAL DCA ACCX2 JMP DDIV1 MDCOM, 0 /COMMON ROUTINE FOR MULTIPLY & DIVIDE DCA DPSGN /RESET SIGN TAD ACC2 /IS DPAC POS? SPA CLA JMS DPNEG /NO, NEGATE DCA ACCX2 / 0 => DPACX DCA ACCX1 TAD (-31 /INITIALIZE COUNTER DCA DPNEG CLL TAD OPER2 /RETURN W. HIGH OPERAND JMP I MDCOM MULNEG, 0 /NEGATE THE MULTIPLIER/DIVISOR TAD OPER1 /DO LO-ORDER PART CLL CIA DCA OPER1 TAD OPER2 /DO HI-ORDER PART CMA SZL /CARRY? CLL IAC /YES, ADD IT IN DCA OPER2 ISZ DPSGN /SIGN CHANGE MADE JMP I MULNEG DPNEG, 0 /NEGATE THE D.P.AC. TAD ACC1 /DO LO-ORDER PART CLL CIA DCA ACC1 TAD ACC2 /DO HI-ORDER PART CMA SZL /CARRY? CLL IAC /YES, ADD IT IN DCA ACC2 ISZ DPSGN /SIGN CHANGE MADE JMP I DPNEG BLKTST, 0 /TEST & SET BLK DCA DPNEG /SAVE DATA TAD DPNEG /GET IT BACK AGAIN ISZ DPNEG /LEGAL BLOCK NUMBER? DCA BLK / YES IF NOT 7777 (-1) CLA / IF NOT, CLEAR JUNK JMP I BLKTST DICAD, 0 /"DCA I CAD" IN FIELD 1 CDF 10 DCA I CAD CDF 0 JMP I DICAD TICAD, 0 /"TAD I CAD" IN FIELD 1 CDF 10 TAD I CAD CDF 0 JMP I TICAD PAGE /CHECK IF THE COMMAND BUFFER STARTS WITH A WORD. IF /IT DOES, RETURN TO 'MAIN3' WITH THE SPECIAL CHAR- /ACTER AND JUST USE IT AS PART OF THE COMMAND STRING. /IF IT DOES NOT, TEST FOR EXPRESSIONS [IN "(...)", /TO ALLOW CHARACTERS IN THE EXPRESSIONS TO NOT BE /TAKEN AS COMMAND CHARACTERS] AND SINGLE & DOUBLE /QUOTES [THE FOLLOWING CHARACTER OR CHARACTERS ARE /LITERALS, NOT COMMANDS]. IF THE PARENS MATCH AND /THE QUOTES ARE FOLLOWED BY THE CORRECT NUMBER OF /CHARACTERS, THEN THE LAST CHARACTER WAS AN "ODT" /COMMAND TO BE EXECUTED SO RETURN TO CALL+1. OTHER- /WISE RETURN TO 'MAIN3' AS ABOVE. WCHEK, 0 JMS I GWORDI /COM BUF BEGIN WITH A WORD? JMP WCHEK2 /NO, TEST FOR PARENS, ETC. WCHEK1, STA TAD COMIR /YES, BACK UP COMIR DCA COMIR TAD TEMP /AND USE THE SPECIAL CHAR AS JMP I .+1 / PART OF THE COMMAND STRING RESPC+1 / WCHEK2, STA TAD COMOUT /SET UP ANOTHER A-XR DCA DPNT DCA CNT /RESET (OR SET) PAREN COUNT WCHEK3, TADIDP /GET A CHAR FROM COMM. BUFF. JMS I SORTI / & GO TEST IT WCKLST-1 WCKOPS-WCKLST JMP WCHEK3 /NONE, CONTINUE SCAN / WCHEK4, TAD CNT /CR, DO PARENS MATCH? SZA CLA JMP WCHEK1 /NO, CONTINUE COMMAND INPUT JMP I WCHEK /YES, INPUT IS DONE / WCHEK5, STA CLL RAL /SET TO -2 IAC /AC = +1 OR -1 TAD CNT / UPDATE PAREN COUNT JMP WCHEK3-1 / & CONTINUE SCAN / WCHEK6, JMS WCHONE / ' -- 2 CHARACTERS JMS WCHONE / " -- 1 CHARACTER JMP WCHEK3 /OK, CONTINUE SCAN WCHONE, 0 TADIDP /GET NEXT CHAR TAD M215 /IS IT A CR? SNA CLA JMP WCHEK1 /YES, DON'T EXECUTE SPECIAL JMP I WCHONE /NO, OK /FPP INSTRUCTION DECODING SUPPORT SUBROUTINES GETOP, 0 /GET OP-CODE (BITS 0-3) TO BITS 9-11 TADICAD AND N7000 CLL RTL RTL JMP I GETOP GET678, 0 /GET BITS 678 TO BITS 9-11 TADICAD CLL RTR RAR AND N7 JMP I GET678 MULT3, 0 /MULTIPLY AC BY THREE DCA GETOP TAD GETOP CLL RAL TAD GETOP /WORKS FOR POS OR NEG! JMP I MULT3 CONDIT, 0 /OUTPUT CONDITIONAL FPP INSTRUCTION TAD I CONDIT /GET LEADING 1 OR 2 CHARS ISZ CONDIT JMS I TWOT / & OUTPUT THEM JMS GET678 /GET CONDITION CODE JMS I SYMTYI / AS INDEX TO TABLE FPCOND -1 JMP I CONDIT SYMTYI, SYMTYP FLDOUT, 0 /OUTPUT FIELD DIGIT & "*" TADICAD AND N7 /GET FIELD JMS I RTL6I / TO BITS 3-5 JMS I TWOCI / & OUTPUT "F*" 6052 / WHERE "F" IS DIGIT JMP I FLDOUT DECIMAL /SET RADIX TO DECIMAL TEMPL= . /ARGUMENT BUFFER /L(TEMPL)=180(10) F0END= TEMPL+180 DMPHAN-F0END /(SHOW SPACE LEFT) OCTAL PAGE /****** MUST BE NO LITERALS! ****** DMPHAN= 06600 /DUMP HANDLER AREA, 2 FIELD 0 PAGES DEVHAN= 07200 /DEVICE HANDLER AREA, 2 FIELD 0 PGS IFNZRO DMPHAN-F0END&4000 <BADERR,__CAN'T RUN> /IF THE ABOVE ASSEMBLES, THE BUFFERS ARE OVER- / RUNNING THE DUMP DEVICE HANDLER. *TEMPL /ADD INITIALIZATION CODE WHICH IS OVERLAID INIMSG, 0 /INITIALIZE ERROR MESSAGES ON SCRATCH BLKS CDF 10 TAD I (7726 /BUT FIRST CHECK FOR "SCOPE MODE" CDF 0 AND N200 / (BIT 4 OF 17726) SNA CLA JMP INIDAT / NOT SET, GO SET UP DATE INISCO, TAD I SPNT /SET, CHANGE RUBOUT HANDLER TO SNA JMP INIDAT / ERASE CHARACTERS FROM SCREEN DCA I DPNT / AND FROM BUFFER (MUCH EASIER JMP INISCO / THAN ON HARD COPY!) / INIDAT, CDF 10 /NOW INIT EXTENDED DATE TAD I (7666 /GET SYSTEM DATE WORD CDF 0 AND N7 /PICK OFF THIS YEAR PART CIA DCA YRTEST / AND SET TEST YEAR (NEG) TAD I M1 /NOW GET EXTENDED YEAR BITS AND (600 / FROM "B.I.P." WORD AND CLL RTR / MOVE TO BITS 7,8 (*8) RTR TAD (106 /ADD TO A STARTING BASE OF 70[10] CIA TAD YRTEST /AND ADD THIS YEAR ALSO CIA DCA YRBASE /= 70 + EXTEND*8 + THIS YEAR TAD I (7746 /GET JSW AND (6777 /CLEAR BIT 2 (CAN RESTART!) CLL RAR STL RAL /SET BIT 11 (DON'T SAVE FIELD 1) DCA I (7746 /& PUT IT BACK JMS I (7607 /WRITE ERROR MESSAGES 4610 / 6 PAGES, FIELD 1 0 / FROM LOC 10000 27 / NORMAL SAVE AREA! SKP CLA JMP I INIMSG /OK, JUST EXIT TAD M200 DCA XERR3 /FAILED, ASSUME WRITE LOCKED TAD (ERROR / SO NO ERROR MESSAGES ON DCA ERC15 / ERROR OR "SHOW ERRORS" JMP I INIMSG PAGE /LITERALS HERE ARE OK! /INITIALIZATION CODE--RESIDES IN BUFFER AREA AND IS WIPED / OUT DURING EXECUTION. HANDLES CHAINED AND NORMAL STARTS. START, CLA SKP /NORMAL STA /CHAINED (FROM CCL!) DCA TEMP CDF 10 DCA I (CCBB /ZAP CCB SWITCH CDF 0 TAD N200 DCA I (7745 /RESET START ADDRESS JMS INIMSG /INIT SCOPE, DATE & ERROR MESSAGES JMS BATSET /TEST & SET UP FOR BATCH ISZ TEMP /CHAINED? JMP I (201 / NO, START IT UP! CDF 10 TAD I M200 /YES, 1ST OUTPUT DEVICE? CDF 0 AND (17 /(IGNORE LENGTH SPEC) SNA JMP STSWIT / NO, LEAVE AS SYS DCA DEVNO /YES, SET DEVICE NUMBER TAD DEVNO CALUSR /NOW DO HANDLER FETCH BY 1 / NUMBER (PAINTING?) STDEV, DEVHAN+1 /--2 PAGES-- JMP STERR /ARGGGG! FAILED!!! TAD STDEV DCA DEVAD /SET UP HANDLER ENTRY TAD M200 DCA DPNT /SET UP FIELD 1 POINTER TADIDP /GET NAME OF FILE DCA NAM1 TADIDP DCA NAM2 TADIDP DCA NAM3 TADIDP /GET EXTENSION DCA NAM4 TAD NAM1 /WAS THERE REALLY A NAME? SZA CLA STA / YES, SET NAME SWITCH DCA TEMP / NO, RESET CDF 10 DCA I (XDNAM /CLEAR DEVICE NAME WORDS DCA I (XDNAM+1 TAD I DPNT /GET NEXT WORD & TEST FOR ZERO SZA CLA JMP STSWIT / SOMETHING NOT RIGHT! TAD I DPNT /OK, ASSUME CCL CHAIN & SET DCA I (XDNAM / UP DEVICE NAME TAD I DPNT DCA I (XDNAM+1 TAD I (XDNAM /EMPTY? SZA CLA JMP STSWIT TAD (0423 /YES, MUST BE DEFAULT NAME-- DCA I (XDNAM / "DSK" TAD (1300 DCA I (XDNAM+1 STSWIT, CDF 10 TAD I (7643 /TEST SWITCHES AND N200 / "/E"? DCA ERMODE / 0= LONG, NON-0= SHORT IAC AND I (7643 / "/L"? [LOAD] SNA CLA JMP STSWO /NO, CHECK NEXT TAD NAM4 /YES, SET DEFAULT EXTENSION SNA TAD (1404 / TO ".LD" DCA NAM4 IAC JMP STSWEX-2 / & GO SET MODE / STSWO, TAD I (7644 AND (1000 / "/O"? [OFFSET] SNA CLA JMP STSWS /NO, GO CHECK LAST TAD I (7646 /YES, GET LOW 12 BITS OF CIA / "=NNNN" AS OFFSET AND DCA OFFSET / IT UP STA JMP STSWEX-1 / & GO SET MODE / STSWS, TAD I (7644 / "/S"? [SAVE] AND (40 SNA CLA JMP STSWEX /NO, WAS NOT ANY THAT COUNT TAD NAM4 /YES, SET DEFAULT EXTENSION SNA TAD (2326 / TO ".SV" DCA NAM4 IAC / & SET MODE DCA MODSW /-1=OFF,0=NOR,+1=SV,+2=LD STSWEX, CDF 0 ISZ TEMP /FILE NAME SPECIFIED? JMP I (201 / NO, JUST START DCA CRSWT /YES, SET SWITCH TO CR, STTLS, TLS / START TTY *** BATCH OPER. JMS I CRLFI / & DO CR/LF TAD NAM4 /ANY EXTENSION SPECIFIED? SNA CLA STA / NO--ALLOW 3 TRIES: SV, LD, NULL DCA TEMP1 / ELSE ALLOW ONLY 1 TRY TAD NAM4 /IF NO EXTENSION SET YET, SNA TAD (2326 / SET TO START DEFAULTS WITH SV DCA NAM4 JMP XFICHN /NOW GO DO FILE LOOKUP / STERR, TLS /START UP OUTPUT *** BATCH OPER. JMP ERCY / & GIVE ERROR! PAGE /INITIALIZATION CODE FOR BATCH OPERATION BATSET, 0 TAD I M1 /TEST BIT 1 OF 07777 FOR "BIP" RAL / (BATCH-IN-PROGRESS) SMA CLA JMP I BATSET / NO, INTERACTIVE MODE TAD I M1 / YES, GET FIELD BITS OF BATCH AND (70 / TO GENERATE A "CIF BAT" TAD (CIF / AND SET UP 3 CALLS: DCA CBATI / INPUT, TAD CBATI DCA CBATO / OUTPUT AND TAD CBATI DCA CBATE / ERROR. BATMOV, TAD I SCANX1 /GET NEXT STORAGE ADDRESS SNA JMP I BATSET / 0 = ALL DONE! DCA DPNT /SET UP POINTER BATLUP, TAD I SCANX1 /GET A PATCH WORD SNA JMP BATMOV / 0 = GROUP END BATPAT, CDF 0 /CHANGED FOR "TYPEB"!! DCA I DPNT /PATCH THE WORD CDF 0 JMP BATLUP /DO IT AGAIN! /"SCOPE MODE" PATCHES FOR RUBOUT HANDLER. INITIAL- / IZATION CODE FIRST CHECKS FOR SCOPE AND THEN FOR / BATCH. THUS, IF BOTH ARE SET, FIRST THINGS WILL BE / SET UP FOR SCOPE AND THEN THEY WILL BE RESET FOR / BATCH. THIS SEQUENCE IS REQUIRED! SCOPLS, RELOC RUBO JMS BTEST /BUFFER NOW EMPTY? JMP RENEXT / YES, JUST IGNORE RUBOUT STA TAD COMIR /NO, BACK UP POINTER DCA COMIR TAD COMIR /SET UP POINTER FOR TESTING, ALSO DCA COMOUT JMS RUBO2 /OUTPUT BACKSPACE, SPACE, BACKSPACE JMS I GETNI /GET RUBBED OUT CHAR AND TEST TAD CHAR TAD M240 / FOR A CONTROL CHAR SPA CLA JMS RUBO2 /YES, ERASE "^" ALSO! JMP RENEXT /TRY FOR ANOTHER CHAR RUBO2, HLT /MUST BE NON-ZERO!!! JMS I TYPEAI /OUTPUT A BACKSPACE, "H-100 /(CTRL-H) SPACE1 / SPACE, JMS I TYPEAI / BACKSPACE SEQUENCE TO "H-100 / CLEAR OFF SCREEN CHAR JMP I RUBO2 TYPEAI, TYPEA 0 RELOC BATLS, /PATCHES--ADDRESS-1, CODE, 0 WITH EXTRA 0 FOR END. RUBO-1 /==== INPUT PATCHES ==== RELOC RUBO DCA CHAR /SAVE NEW CHAR INPUT TAD CHAR /IS THIS A FORM-FEED? TAD RM214 SNA JMP RKEY+1 / YES, JUST IGNORE IT! TAD R2 /NO, THEN IS IT A LINE-FEED? SNA CLA TAD RLAST / YES, WAS LAST A CARRIAGE-RETURN? TAD M215 SZA CLA TAD CHAR /NO TO ONE OR OTHER, USE CHAR. DCA RLAST / YES TO BOTH, SET TO 0! TAD RLAST /OK, WAS IT A CR-LF PAIR? SNA CLA JMP RKEY+1 / YES, JUST IGNORE LF! JMP REKEY+1 / NO, GO USE THIS CHAR BATINI, 5400 /IN THE BATCH FIELD RM214, -214 R2, 2 RLAST, 215 /!!! CR OF ".R FUTIL" HAS AN LF !! 0 RKEY+1-1 RELOC /TO PUT 'CBATI' ON THIS PAGE CBATI= .+1 /REALLY ON "CIF BAT" RELOC RKEY+1 JMS I CTRLI /CHECK FOR CONTROL KEYS CIF /*** CIF BAT JMS I BATINI /GET A BATCH CHARACTER ERC17, ERROR /!!! EOF ON INPUT !!! NOP /FILLER FOR INTERACTIVE CTRL-Q NOP 0 RKEY0-1 RELOC RKEY0 JMP RKEY+1 /IGNORE RUBOUT UNDER BATCH NOP / & RETURN TO CALL+1! 0 BCTRLC-1 RELOC BCTRLC JMP I CTRLCI /CTRL-C, ABORT JOB STREAM! 0 RELOC /==== OUTPUT PATCHES ==== 201-1 NOP 0 STTLS-1 NOP /ZAP 3 "TLS"S USED FOR STARTUP 0 STERR-1 NOP 0 RELOC /==== ERROR PATCH ==== XERR4-1 CBATE= . /REALLY ON "CIF BAT" RELOC XERR4 CIF /*** CIF BAT JMP I N7000 /ABORT TO BATCH FIELD! 0 RELOC BATPAT-1 CDF 10 /*** NEXT CODE IN FIELD 1 *** 0 TYPEB-1 RELOC CBATO= .+1 /REALLY ON "CIF BAT" IFDEF TYPEB </NO PASS1 ERROR! RELOC TYPEB /*** REALLY IN FIELD 1 *** > CDF 10 /*** SET UP RETURN D.F. CIF /*** CIF BAT JMS I .+1 /OUTPUT A CHARACTER TO LOG 7400 /BATOUT, IN THE BATCH FIELD CDF 0 /*** RESET D.F. 0 RELOC 0 PAGE *7000 /NEW CODE TO HANDLE 128K SUPPORT ADFLD, 0 /ADJUSTS BANK AND FIELD FOR CCB PRINTING TAD TEMP2 AND (76 CLL RTR SZL TAD (20 CLL RTL JMS I (FPRNT JMP I ADFLD FPRNTX, 0 /ROUTINE TO PRINT BANK BITS AND (174 /ISOLATE BANK AND FIELD BITS DCA FLD TAD FLD AND (104 /ISOLATE BANK BITS CLL RTR /SSWITCH THEM AROUND RAR SZL TAD (4 CLL RTR DIGIT /PRINT BANK BITS TAD FLD JMP I FPRNTX FLD, 0 FIELD 1 /THE END OF FIELD 0! *10000 /PUT A POINTER HERE! NXTIOT /ADDR OF NEXT FREE SPACE IN TABLE /ERROR MESSAGES AND ADDRESS LIST. THESE ITEMS RESIDE / UNDER THE USR, REQUIRING THAT THE USR SWAP THEM / WHEN IT IS USED AND THAT THE PROGRAM KICK OUT THE / USR WHEN AN ERROR OCCURS IN LONG ERROR MESSAGE MODE / OR WHEN A "SHOW ERRORS" COMMAND IS GIVEN. IT IS / TO THE ADVANTAGE OF DECTAPE (AND PROBABLY ALSO / FLOPPY DISK) SYSTEMS TO USE SHORT ERROR MESSAGE / MODE TO REDUCE USR SWAPPING IF DOING MANY "FILE" / OR "SET DEVICE ...DDEV..." COMMANDS. *10002 /MESSAGE ADDRESS AT ERROR CODE NUMBER +1 (AUTO-XR) /LIST OF ADDRESSES OF ERROR MESSAGES ERMSA ERMSB ERMSC ERMS14 ERMSD ERMSE ERMSG ERMSH ERMSI ERMSK ERMSJ ERMSXO ERMSL ERMSZ ERMSO ERMS11 ERMS04 ERMSP ERMSQ ERMSR ERMS09 ERMS08 ERMS13 ERMSS ERMST ERMSU ERMSV ERMSW ERMSX ERMSY ERMSM ERMS00 ERMS01 ERMS02 ERMS03 ERMS10 ERMSF ERMSGC ERMSHD ERMS05 ERMS07 ERMS18 ERMS19 ERMS20 ERMS15 ERMS16 EMSEND, ERMS17 ERMS99 /ERROR MESSAGES: ERMSA, TEXT &ILLEGAL SINGLE-WORD COMMAND& ERMSB, TEXT &ILLEGAL MULTI-WORD COMMAND& ERMSC, TEXT &TOO MANY ")"S& ERMSD, TEXT &ILLEGAL FORMAT WORD& ERMSE, TEXT &BAD FORMAT SYNTAX& ERMSF, TEXT &NO FILE FOR C.C.B./HEADER REQUEST& ERMSGC, TEXT &BAD C.C.B (NOT A SAVE FILE)& ERMSHD, TEXT &BAD HEADER (NOT A LOAD MODULE)& ERMSG, TEXT &ILLEGAL ITEM TO SHOW& ERMSH, TEXT &ILLEGAL SEARCH MODIFIER& ERMSI, TEXT &BAD SEARCH SYNTAX& ERMSJ, TEXT &ILLEGAL MODE& ERMSK, TEXT &SET OPTION FOLLOWED BY A CR, BAD SYNTAX& ERMSXO, TEXT &NUMBER OR ILLEGAL SET OPTION& ERMSL, TEXT &NUMBER OR ILLEGAL OUTPUT OPTION& ERMSM, TEXT &ILLEGAL "." IN NAME (FILE OR DEVICE)& ERMSO, TEXT &ILLEGAL MODIFY FORMAT& ERMSP, TEXT &PROGRAM OR HARDWARE PROBLEM& ERMSQ, TEXT &BAD TERMINATOR IN SINGLE ARGUMENT& ERMSR, TEXT &TERMINATOR BEFORE LEGAL NUMBER INPUT& ERMSS, TEXT &BAD TERMINATOR IN MULTIPLE ARGUMENT& ERMST, TEXT &ILLEGAL CHARACTER IN EXPRESSION& ERMSU, TEXT &ILLEGAL USE OF "(" IN EXPRESSION& ERMSV, TEXT &ILLEGAL OPERATOR IN EXPRESSION& ERMSW, TEXT &TOO FEW ")"S IN EXPRESSION& ERMSX, TEXT &DIVISION BY 0 ATTEMPTED& ERMSY, TEXT &UNKNOWN HANDLER NAME& ERMSZ, TEXT &NUMBER OR ILLEGAL ERROR OPTION& ERMS01, TEXT &NON-& *.-1 ERMS00, TEXT &FATAL READ ERROR& ERMS03, TEXT &NON-& *.-1 ERMS02, TEXT &FATAL WRITE ERROR& ERMS04, TEXT &ODD START LOC OR COUNT IN OS/8 MODIFY& ERMS05, TEXT &BAD ADDRESS/OVERLAY (ODT COMMANDS)& /ERMS06, ERMS07, TEXT &BAD ADDRESS/OVERLAY (MODIFY)& ERMS08, TEXT &ARGUMENT EXPRESSION NOT TERMINATED BY ")"& ERMS09, TEXT &ILLEGAL DIGIT& ERMS10, TEXT &DUMP HANDLER ERROR& ERMS11, TEXT &NUMBER OR ILLEGAL DMODE OPTION& /ERMS12, ERMS13, TEXT &ILLEGAL USE OF ' OR "& ERMS14, TEXT &MAPPED MODE--USE LIST, NOT DUMP& ERMS15, TEXT &NO ERROR MESSAGES& ERMS16, TEXT &INPUT ERROR ON MESSAGES& ERMS17, TEXT &EOF ON BATCH INPUT& ERMS18, TEXT &ENTER FAILED& ERMS19, TEXT &CLOSE FAILED& ERMS20, TEXT &DUMP FILE OVERRUN& ERMS99, TEXT &DEBUG& *12000 /BEGIN ABOVE THE USR AREA /GCCB & GHDR--ROUTINES TO READ IN THE FIRST BLOCK OF THE / LAST FILE SPECIFIED BY THE LAST "FILE" COMMAND, ASSUM- / ING THAT IT WAS A SAVE FILE OR LOAD MODULE, AND DO THE / FEW CHECKS THAT ARE AVAILABLE TO TEST FOR A CCB (CORE- / CONTROL-BLOCK) OR HEADER BLOCK BEFORE LETTING THE DATA / BE USED FOR THE APPROPRIATE PURPOSE. GCCB, 0 /GET CORE-CONTROL-BLOCK JMS CCBHDR /DO COMMON TEST & READ-IN CLL RAL /ADJUSTS FOR 128K INDICATOR BIT STL RAR SMA CLA /1ST WORD (-# SEGS) NEG? JMP GCCERR / NO, CAN'T BE CCB TAD I (CCBB+3 /GET JOB STATUS WORD AND (200 /OVERLAY BIT SET (LINK)? SZA CLA / 0 = NO TAD (CCBB+140-1 / 1 = YES, START ADDR-1 CDF 0 DCA I (OVLFLG /NO = 0; YES = ADDR-1 CDF 10 TAD I (CCBB+1 /2ND WORD A "CDF CIF X0"? AND (7603 CIA TAD GCCCDF SZA CLA GCCERR, JMS ERROR1 /LOOKS BAD, JUST EXIT NOW! ISZ GETSWX /LOOKS OK, 1ST TIME SINCE READ? JMP GCCB2 /NO, DON'T CHANGE THINGS AGAIN TAD (CCBB+140+3 /YES, POINT TO LENGTH WORDS GCCB1, DCA GHDR / TO CHANGE PAGES TO BLOCKS TAD GHDR /GET A WORD - PAGES-V7C TAD (-6603 /V7C SNA CLA /V7C JMP GCCB2 / 0 = DONE TAD I GHDR /V7C IAC /ROUND DOWN IN 2 STEPS FOR PDP-8 CLL RAR DCA I GHDR /STORE A WORD - BLOCKS TAD GHDR /UPDATE POINTER TO NEXT TAD (4 JMP GCCB1 / GCCB2, DCA GETSWX /BE SURE SWITCH STAYS CLEAR TAD I SEGNI /GET -# SEGMENTS CLL RAL STL RAR /ADJUSTS FOR 128K INDICATOR BIT GCCCDF, CDF CIF 0 JMP I GCCB /OK, RETURN VALUE GHDR, 0 /GET HEADER BLOCK (FORTRAN IV) TAD (3 /TO SET UP CCBB+6 JMS CCBHDR /DO COMMON TEST & READ-IN TAD (-2 /1ST WORD MUST BE EXACTLY 2 SZA CLA JMP HDRERR / NO, CAN'T BE A HEADER ISZ GETSWX /1ST TIME THRU SINCE READ? JMP GHDR1 / NO, DON'T CHANGE ANYTHING DCA I (CCBB+47 /YES, BE SURE THESE WORDS DCA I (CCBB+50 / ARE 0 FOR USERS TAD I (CCBB+1 /GET START FIELD WORD SNA JMP HDRERR / SHOULD BE 1 THRU 7 CLL RTL /LOOKS OK, MOVE FIELD TO BITS RAL / 6-8 TO HELP "SHOW HEAD" DCA I (CCBB+1 TAD I (CCBB+1 /ARE THESE ONLY BITS SET? AND (7707 SZA CLA JMP HDRERR / NO, SOMETHING MUST BE BAD TAD I (CCBB+3 /OK, TEST FIELD OF NEXT FREE SNA JMP HDRERR / SHOULD BE 1 THRU 7 AND (7770 SZA CLA HDRERR, JMS ERROR1 GHDR1, DCA GETSWX /MAKE SURE THIS IS 0 NOP /AC NON-ZERO FOR OK-V7C CDF CIF 0 JMP I GHDR /OK, BACK TO USER CCBHDR, 0 TAD (CCBB+3 /CCBB+6 FOR GHDR CDF 0 DCA I (GETPNT /SET UP POINTER FOR 'GET' TAD I (DEVAD /GET ADDR OF DEVICE DCA DEVADX / HANDLER & SAVE HERE TAD I (RBLK1 /GET START BLOCK NUMBER SNA ERCF, JMS ERROR1 / NO FILE!!! GIVE ERROR CDF 10 DCA GCCBLK /OK, SET UP 1ST BLOCK TAD I SEGNI /IS SOMETHING IN MEMORY? SZA JMP I CCBHDR / YES, RETURN 1ST WORD CIF 0 JMS I DEVADX /NO, READ 1ST BLOCK OF FILE 0110 /READ; 1 PAGE; FIELD 1 SEGNI, CCBB /BUFFER IS HERE GCCBLK, 0 /BLOCK NUMBER JMP RDERX /...BAD NEWS... STA DCA GETSWX /OK, SET "JUST READ" SWITCH TAD I SEGNI /AND GET 1ST WORD JMP I CCBHDR / RDERX, CDF CIF 0 /RETURN TO FIELD 0 JMP I (RERROR / FOR READ ERROR DEVADX, 0 GETSWX, 0 MSMOD, TEXT " MOD" MSBAD, TEXT " BAD BLOCK" PAGE /CONTINUATION OF OUTPUT COMMANDS AND ROUTINES FROM FIELD 0 /CONTINUATION OF 'SET' 'DDEV' HANDLER XDDEV1, DCA DDEVAD /SET UP HANDLER ADDRESS TAD I (GDEV2 DCA DDEVNO / AND DEVICE NUMBER CDF 10 TAD DDEVNO /LOOK AT DCW FOR SPECIFIED TAD (7760-1 / DEVICE TO SEE IF FILE DCA DDCWPT / STRUCTURED. TAD I DDCWPT /BIT 0 = 1 FOR FILES SMA CLA TAD (212 / NO, LINE-AT-A-TIME DCA DDEVS / YES, BLOCK-AT-A-TIME TAD DMPADR /OK, INITIALIZE OUTPUT POINTER DCA DMPPTR DCA XOSIZ / AND ZERO BLOCK COUNTER DCA DNAM / AND CLEAR ANY FILE NAME IAC DCA DMPBLK / AND SET BLOCK NUMBER TO 1 JMP XDDEV2 /LAST, GO SET UP NAME FOR OUTPUT /CONTINUATION OF EXECUTION OF 'OPEN' COMMAND XOPEN1, TAD (NAM1-1 /SET UP POINTER TO FIELD 0 FILE DCA DPNT / NAME (NOTE: XR IN FIELD 1!!!) TAD I DPNT /MOVE THE FILE NAME UP HERE DCA DNAM TAD I DPNT DCA DNAM+1 TAD I DPNT DCA DNAM+2 TAD I DPNT /GET THE EXTENSION PART ISZ I (TEMP1 / WAS ANYTHING REALLY SPECIFIED? JMP XOPEN2 CLA TAD (0425 / NO, DEFAULT TO ".DU" XOPEN2, DCA DNAM+3 TAD XCLNAM /SET UP POINTER TO NAME FOR USR DCA XOBLK CDF 10 /SET UP RETURN FIELD TAD I DDCWPT /CLEAR ANY OPEN FILE ON AND (7770 / THIS DEVICE SO "OPEN" DCA I DDCWPT / CAN BE DONE WHENEVER! CIF 0 /SET UP SUBROUTINE FIELD TAD DDEVNO /GET DUMP DEVICE NUMBER JMS USEUSR / AND GO GET USR & CALL IT. 3 /ENTER XOBLK, 0 /NAME POINTER, BECOMES START BLK XOSIZ, 0 / BECOMES -# BLOCKS CAN USE ERC18, JMS ERROR1 /THE ENTER FAILED! TAD XOBLK /OK! SET UP FILE START BLOCK DCA DMPBLK TAD DMPADR /INITIALIZE POINTER DCA DMPPTR XOCEX, CDF CIF 0 JMP MAIN1 /TRY NEXT COMMAND DDEVAD, 7607 /INIT ADDRESS TO "SYS:" (SEE ABOVE) DDEVNO, 1 /INIT THIS TO "SYS:" ALSO. DDCWPT, 7760 / THIS ALSO DNAM, 0 /DUMP FILE NAME, INIT TO NULL 0 0 0 /(EXTENSION HERE) /CONTINUATION OF EXECUTION OF 'CLOSE' COMMAND XCLOS1, TAD DNAM /IS ANY FILE OPEN? SNA CLA JMP XOCEX / NO, IGNORE COMMAND TAD XCTLZ / YES, OUTPUT A CTRL-Z JMS DMPOUT / AND FILL TO END XCTLZ, "Z-100 TAD XOBLK /OK, CALCULATE FILE SIZE CIA TAD DMPBLK /= NEXT - START DCA XCLSIZ /= FILE SIZE IN BLOCKS TAD DDEVNO /GET DUMP DEVICE NUMBER CIF 0 JMS USEUSR /GET USR AND CALL IT 4 /CLOSE XCLNAM, DNAM /POINTER TO FILE NAME XCLSIZ, 0 /SIZE OF NEW FILE ERC19, JMS ERROR1 /OH NO! CLOSE FAILED! DCA DNAM /OK, ZAP KNOWLEDGE OF FILE JMP XOCEX DMPOUT, 0 /DUMP FILE CHARACTER OUTPUT ROUTINE DCA DMPCHR /SAVE THE CHARACTER TAD DMPCHR /PUT IT INTO FILE BUFFER CDF 10 /(MUST BE SURE!) DMPNUL, DCA I DMPPTR /INSERT AN 8 BIT CHAR ISZ DMPPTR TAD DMPPTR /NOW AT END OF BUFFER? TAD (-DMPBUF-400 SNA CLA JMP DMPIT / YES, DUMP BUFFER NOW TAD DMPCHR /NO, FILL FOLLOWING THIS CHAR? CIA TAD I DMPOUT /(THE TEST CHAR @ CALL+1) SNA CLA JMP DMPNUL / YES, FILL WITH NULLS! JMP I DMPOUT / NO, EXECUTE FILL CHAR / DMPIT, CIF 0 JMS I DDEVAD /CALL DUMP FILE HANDLER 4210 /WRITE, 2 PAGES, FIELD 1 DMPADR, DMPBUF DMPBLK, 1 /BLOCK NUMBER ERC10, JMS ERROR1 /ERROR ON OUTPUT FILE! TAD DMPADR /NOW RESET OUTPUT POINTER DCA DMPPTR ISZ DMPBLK /INCREMENT BLOCK NUMBER ISZ XOSIZ /ANY MORE SPACE LEFT? JMP I DMPOUT / YES, EXIT NOW DCA DNAM / NO! ZAP DUMP FILE ERC20, JMS ERROR1 / AND DIE! DMPCHR, 0 DMPPTR, 0 /CHARACTER OUTPUT POINTER PAGE /CONTINUATION OF ROUTINE TO OUTPUT A CHAR TO A DEVICE TYPE1, TAD I (DMODE /TTY= NONE, PART&-DSWIT, ALL AND I (DSWIT / SO TEST FOR PART&DSWIT SZA CLA JMP TYPE2 /NO OUTPUT TO TTY TAD I (RTL6 /GET CHARACTER TO OUTPUT TYPEB, NOP /*** CDF 10 /*** BATCH TSF /*** CIF BAT /*** CHANGES JMP .-1 /*** JMS I .+1 /*** LOG TLS /*** 7400 /*** OUTPUT CLA /*** CDF 0 TYPE2, STL CLA RAR /=4000 (SET AC BIT 0 FOR TEST) TAD I (DSWIT /=4000 OR 4001 (DSWIT=1) AND I (DMODE /FILE= PART&DSWIT OR ALL SNA CLA JMP TYPE3 / OUTPUT TO TTY ONLY TAD DDEVS /FILE STRUCTURED OUTPUT? CDF 10 SNA TAD I (DNAM / YES, FILE OPEN? CDF 0 SNA CLA JMP TYPE3 / NO TO EITHER TAD I (RTL6 /OK, GET CHARACTER TO OUTPUT JMS DMPOUT /OUTPUT IT & TEST FOR END DDEVS, 0 /TEST: 0=FILE, 212= NON-FILE TYPE3, CDF CIF 0 JMP TYPEX /BACK AND OUT ERROR1, 0 /FIELD 1 ERROR ROUTINE HEAD CLA /CLEAR POSSIBLE JUNK IN AC TAD ERROR1 /MOVE RETURN ADDR TO FIELD 0 CDF CIF 0 DCA I (XERROR JMP I (XERROR+1 XDDEV2, CDF 0 /NAME IS OVER THERE TAD I (NAM1 /MOVE DEVICE NAME INTO STRING DCA XDDNAM / IN THIS FIELD FOR "SHOW DDEV" TAD I (NAM2 DCA XDDNAM+1 CDF CIF 0 JMP XSETN /BACK TO 'SET' MSDDEV, TEXT "@DDEV = SYS@" XDDNAM= .-3 MSDEV, TEXT "@DEVICE = SYS@" XDNAM= .-3 /ADDR OF 1ST WORD OF DEVICE NAME /CONTINUATION OF CODE FROM FIELD 0 XDEVM, DCA XDNAM /SET 4 DEVICE NAME CHARS IN TAD I (NAM2 / OUTPUT MESSAGE DCA XDNAM+1 CDF 10 DCA I (CCBB /NO C.C.B. OR HEADER PRESENT CDF CIF 0 STA DCA I (RBLK /RESET BLOCK NUMBER JMP XSETN /GO DO NEXT OPTION MSERR, TEXT " ERROR CODES: FUTIL " *.-1 /VERSION NUMBER MESSAGE--THE FOLLOWING CODE INSERTS THE / VERSION NUMBER AND PATCH LEVEL SET NEAR THE START OF / THE SOURCE INTO THE VERSION MESSAGE. MSVER, TEXT "VERSION = ???" /VERS = 2 DIGITS, PATCH = 1 *.-2 VERTEN= VERSION%12 /TENS DIGIT VERONE= -VERTEN^12+VERSION /ONES DIGIT VERTEN^100+VERONE+6060 /INSERT TWO DIGITS PATCH^100 /INSERT PATCH + NULL TERM /ALPHA MONTH NAMES PLUS DUMMIES FOR PDATE SUBROUTINE MONTHS, TEXT " 00@JAN@FEB@MAR@APR@MAY@JUN@JUL" TEXT "AUG@SEP@OCT@NOV@DEC@ 13@ 14@ 15" PAGE /SYMBOLICS FOR PDP-8 INSTRUCTIONS: INSLST, TEXT "AND TAD ISZ DCA JMS JMP IOT NOP " *.-1 / GROUP 1 MICRO-INSTS.: OP1LST, TEXT "CLL CMA CML IAC BSW RAL RTL RAR RTR " *.-1 / GROUP 2 MICRO-INST'S: OP2LST, TEXT "SMA SZA SNL SKP SPA SNA SZL OSR HLT " *.-1 / EAE MICRO-INST'S: EAELST, TEXT "MQA MQL SCL MUY DVI NMI SHL ASR LSR SCA " *.-1 TEXT "DAD DST SWBADPSZDPICDCM SAM " *.-1 CLANAM, 0314 /"CLA " 0140 OPRMES, 1720 /"OPR " 2240 / IOT INSTRUCTIONS: IOTTAB, 6000 TEXT "SKON" 6001 TEXT "ION@" 6002 TEXT "IOF@" 6003 TEXT "SRQ@" 6004 TEXT "GTF@" 6005 TEXT "RTF@" 6006 TEXT "SGT@" 6007 TEXT "CAF@" 6010 TEXT "RPE@" 6011 TEXT "RSF@" 6012 TEXT "RRB@" 6014 TEXT "RCF@" 6016 TEXT "RCC@" 6020 TEXT "PCE@" 6021 TEXT "PSF@" 6022 TEXT "PCF@" 6024 TEXT "PPC@" 6026 TEXT "PLS@" 6030 TEXT "KCF@" 6031 TEXT "KSF@" 6032 TEXT "KCC@" 6034 TEXT "KRS@" 6035 TEXT "KIE@" 6036 TEXT "KRB@" 6040 TEXT "TFL@" 6041 TEXT "TSF@" 6042 TEXT "TCF@" 6044 TEXT "TPC@" 6045 TEXT "TSK@" 6046 TEXT "TLS@" 6100 TEXT "DPI@" 6101 TEXT "SMP@" 6102 TEXT "SPL@" 6103 TEXT "EPI@" 6104 TEXT "CMP@" 6105 TEXT "S,CMP" 6106 TEXT "CEP@" 6107 TEXT "SPO@" 6110 TEXT "RCTV" 6111 TEXT "RCRL" 6112 TEXT "RCRH" 6113 TEXT "RCCV" 6114 TEXT "RCGB" 6115 TEXT "RCLC" 6116 TEXT "RCCB" 6130 TEXT "CLZE" 6131 TEXT "CLSK" 6132 TEXT "CLOE" 6133 TEXT "CLAB" 6134 TEXT "CLEN" 6135 TEXT "CLSA" 6136 TEXT "CLBA" 6137 TEXT "CLCA" 6201 TEXT "CDF 00" *.-1 6211 TEXT "CDF 10" *.-1 6221 TEXT "CDF 20" *.-1 6231 TEXT "CDF 30" *.-1 6241 TEXT "CDF 40" *.-1 6251 TEXT "CDF 50" *.-1 6261 TEXT "CDF 60" *.-1 6271 TEXT "CDF 70" *.-1 6202 TEXT "CIF 00" *.-1 6212 TEXT "CIF 10" *.-1 6222 TEXT "CIF 20" *.-1 6232 TEXT "CIF 30" *.-1 6242 TEXT "CIF 40" *.-1 6252 TEXT "CIF 50" *.-1 6262 TEXT "CIF 60" *.-1 6272 TEXT "CIF 70" *.-1 6203 TEXT "CDIF00" *.-1 6213 TEXT "CDIF10" *.-1 6223 TEXT "CDIF20" *.-1 6233 TEXT "CDIF30" *.-1 6243 TEXT "CDIF40" *.-1 6253 TEXT "CDIF50" *.-1 6263 TEXT "CDIF60" *.-1 6273 TEXT "CDIF70" *.-1 6204 TEXT "CINT" 6214 TEXT "RDF@" 6224 TEXT "RIF@" 6234 TEXT "RIB@" 6244 TEXT "RMF@" 6254 TEXT "SINT" 6264 TEXT "CUF@" 6274 TEXT "SUF@" 6550 TEXT "FFST" 6551 TEXT "FPINT" 6552 TEXT "FPICL" 6553 TEXT "FPCOM" 6554 TEXT "FPHLT" 6555 TEXT "FPST" 6556 TEXT "FPRST" 6557 TEXT "FPIST" 6561 TEXT "FMODE" 6563 TEXT "FMRB" 6564 TEXT "FMRP" 6565 TEXT "FMDO" 6567 TEXT "FPEP" NXTIOT, ZBLOCK 200 /LEAVE ROOM FOR EXPANSION 0 /TABLE TERMINATOR /CODES MAY BE ADDED TO THE TABLE IN THE SPACE LEFT BY THE / "ZBLOCK 200". SINCE EACH ENTRY REQUIRES 4 WORDS (THE / ACTUAL CODE IN THE FIRST WORD AND UP TO 6 PACKED ASCII / CHARACTERS IN THE NEXT THREE WORDS, PADDED WITH TRAIL- / ING 0'S), THERE IS ROOM FOR 40 OCTAL (32 DECIMAL) IOTS / AND THEIR NAMES. THESE CAN BE PATCHED IN DIRECTLY / USING THE PROGRAM ITSELF. **** NOTE THAT THE CONTENTS / OF LOCATION 10000 POINT TO THE FIRST FREE ENTRY. **** /SYMBOLICS FOR FPP-12/8A INSTRUCTIONS MSBASE, TEXT " B+" MSINDI, TEXT "% B+" MSJNX, TEXT "JNX " /THE FOLLOWING STRINGS ARE PADDED WITH "@"S IN PROPER / PLACES TO FORCE WORD ALIGNMENT AS NEEDED. TEXT "LEA@" /+1 WORD 0000 FPPINS, TEXT "FLDA@@FADD@@FSUB@@FDIV" TEXT "FMUL@@FADDM@FSTA@@FMULM" TEXT "UNUSEDSTARTE" *.-1 FPOP00, TEXT "FNOP@@FEXIT@FPAUSEFCLA@@FNEG" TEXT "FNORM@STARTFSTARTDJAC@@" FPXR1S, TEXT "ALN ATX XTA " FPXR2S, TEXT "ADDX *,@LDX *,@" FOP134, TEXT "TRAP4 TRAP3 SETX SETB JSA @JSR " FPCOND, TEXT "EQGELEA@NELTGTAL" /CONTROL TABLES FOR FPP INSTRUCTION DECODING FPPMO0, 7 /MAJOR SUB-OP-CODE OF SPECIALS 6 5 4 3 2 1 0 /END & FALL-OUT POINT FPPMOJ, SPCOP7 SPCOP6 SPCOP5 SPCOP4 SPCOP3 SPCOP2 SPCOP1 FPPOP0, 170 /MINOR SUB-OP-CODE OF SUB-OP-CODE 160 / 0 SPECIALS 150 140 130 120 110 100 70 60 50 40 30 20 10 00 FPPOPJ, SPNUSE /ALL UNUSED POSSIBILITIES SPNUSE SPNUSE SPNUSE SPNUSE SPNUSE SPOP11 SPOP10 SPNUSE SPNUSE SPOP05 SPOP04 SPO123 SPO123 SPO123 /MESSAGES: MS01, TEXT " = " MS07, 0023 /"SMASK = " MS02, TEXT "MASK = " MS03, TEXT "ABS. LOC = " MS04, TEXT "UPPER = " MS05, TEXT "LOWER = " MS06, TEXT "FORMAT = " MS08, TEXT "DIRECTORY" MS09, TEXT "OFFSET = " MS10, TEXT "MODE = " MS11, TEXT "CCB:" MS12, TEXT "ODT LOC = " MS13, TEXT ": " MS14, TEXT " CORE SEGS: " MS15, TEXT "LOOKUP FAILED" MS16, TEXT "FPP" MS17, TEXT " AT " MS18, TEXT " SA = " MS19, TEXT ", JSW = " MS20, TEXT "REL. LOC = " MS21, TEXT "PACKED" MS22, TEXT "ASCII" MS23, TEXT "OS/8" MS24, 2516 /"UNSIGNED" MS25, TEXT "SIGNED" MS26, TEXT "OCTAL" MS27, TEXT "OFFSET" MS28, TEXT "SAVE" MS29, TEXT "NORMAL" MS30, TEXT "OUTPUT = " MS31, TEXT "PDP" MS32, TEXT "BLOCK = " MS33, TEXT ") " MS34, TEXT "LOAD" MS35, TEXT "BCD" MS36, TEXT "BYTE" MS37, TEXT "FILLER = " MS38, TEXT "HEADER:" MS39, TEXT ", NEXT WORD = " MS40, TEXT ", LOAD V " MS41, TEXT ", E.P. REQ'D" MS42, TEXT " OVLYS START BLOCK LENGTH" MS43, TEXT "XS240" /MAIN LOOP CHARACTER LIST CCHARL, "# "$ "% "& ": "< "= "> "? "@ "[ "\ "] "/ "! "+ "- "; "^ "_ /'TYPE' COMMAND LIST TYPEL, 211 /TAB 233 /ALT MODES 375 376 /'XMODIF' CHECK LIST TYPEM, 215 /CR 212 /LF 0 /ADDRESSES FOR 'OMODES' OTABLE, BPRT /# OSTYPE /$ BYTEO /% XS240O /& SGNDP /: OPRT /< DPRT /= PDPOUT /> DIROUT /? PDATE /@ ASCII /[ FPPOUT /\ PACOUT /] /MAIN LOOP JUMP LIST - RESPOND TO SPECIAL CHAR COPSL, OMODES OMODES OMODES OMODES OMODES OMODES OMODES /SEE ABOVE LIST OMODES OMODES OMODES OMODES OMODES OMODES SLASH EXCL PLUS MINUS SEMIC UPARR BACKAR RESPC ALTMOD ALTMOD ALTMOD CRCR LFLF /'TYPE' JUMP LIST TYPEOP, TYPTAB TYPALT TYPALT TYPALT TYPCR TYPCR+1 /COMMAND WORD LIST FOR COMMANDS NOT FOLLOWED BY CR CWORDL, TEXT "EVE@DUD@LIL@FIF@OPSCSTSMWOW@MOM@SHSES@WRIFEXCOC@" /MAIN LOOP JUMP LIST - EXECUTE A COMMAND WOPSL, XVAL XVAL XDUMP XDUMP XLIST0 XLIST0 XFILE XFILE XOPEN XSCAN XSTRIN XSMASK XWORD XWORD XMODIF XMODIF XSHOW XSET XSET XWRARG XIF XEXIT MAIN1 /COMMENT MAIN1 /LISTS FOR COMMANDS FOLLOWED BY A CR. CWORL2, TEXT "REWRENEXCLCOC@" WOPSLL, XREWIN /REWIND XWRITE /WRITE MAIN1 /END XEXIT /EXIT XCLOSE /CLOSE MAIN1 /COMMENT MAIN1 /'XFORM' LISTS ----ORDER IS CRITICAL---- FORML, TEXT "PAP@ASA@OSOSXSX@UNU@SIS@OCO@BCB@BYBYPDPDFPF@DID@" FOPSL, XFCHR /PACKED (ASCII) XFCHR XFCHR /ASCII XFCHR XFCHR /OS/8 (ASCII, PACKED) XFCHR XFCHR /XS240 (ASCII, PACKED) XFCHR XFNUM /UNSIGNED (DECIMAL) XFNUM XFNUM /SIGNED (DECIMAL) XFNUM XFNUM /OCTAL XFNUM XFNUM /BCD XFNUM XFNUM /BYTE (OCTAL) XFNUM XFSYM /PDP (SYMBOLIC) XFSYM XFSYM /FPP (SYMBOLIC) XFSYM XFSYM /DIRECTORY XFSYM / ROUTINE ADDRESS LIST FTABLE, PACOUT ASCII OSTYPE XS240O DPRT SGNDP OPRT BPRT BYTEO PDPDMP FPPDMP DIRDMP /'XSHFMT' DESCRIPTOR ADDRESS LIST FMTLS, MS21 /PACKED ASCII MS22 /ASCII MS23 /OS/8 ASCII MS43 /XS240 ASCII MS24 /UNSIGNED DECIMAL MS25 /SIGNED DECIMAL MS26 /OCTAL MS35 /BCD MS36 /BYTE MS31 /PDP SYMBOLIC MS16 /FPP SYMBOLIC MS08 /DIRECTORY /'XMODIF' COMMAND LIST MODIFL, TEXT "PAP@ASA@OSXSNUN@" /'XMODIF' JUMP LIST MODIFO, XPAC0 /PACKED XPAC0 XASC1 /ASCII XASC1 XOPS1 /OS/8 XXS20 /XS240 XNUM2 /NUMERIC XNUM2 MODADS, XMOD0 /MODIFL TEST LIST XMOD0 XMOD0 XMOD0 XMOD0 XMOD0 XMOD0 XMOD0 XMOD0 MODDLS, TEXT "PAASOSXSNUNUNUNUNUNUNUNU" /DEFAULT LIST /'XMODIF' CHARACTER JUMP LIST MCHARO, XMODCR /CR, END RENEXT /LF, IGNORE /'XIF' CHARACTER JUMP LIST IFSKPO, XIFCR /CR, END OF LINE RENEXT /LF, IGNORE /XNUM JUMP LIST NUMOPS, XNUM1 /, ERCQ /: ERCQ /. XNUM1+1 /SPACE XNUM3 /CR /'XSHOW' COMMAND LIST SHOWL, TEXT "BLB@ODCCC@HEH@ABA@RER@SMVE" *.-1 /'XSET' COMMAND LIST SETLST, TEXT "DDFOF@OUO@ERE@OFUPLOTEDEDMMOFIMAM@ /'XSHOW' JUMP LIST SHOWOP, XSHBLK /BLOCK XSHBLK XSHODL /ODT LOC XSHCCB /CCB (CORE CONTROL BLOCK) XSHCCB XSHHDR /HEADER (F4 LOAD MODULE) XSHHDR XSHABS /ABS. LOC XSHABS XSHREL /REL. LOC XSHREL XSHSMS /SMASK XSHVER /VERSION XSHDDEV /DDEV XSHFMT /FORMAT XSHFMT XSHOUT /OUTPUT XSHOUT XSHERR /ERRORS XSHERR XSHOFF /OFFSET XSHUPP /UPPER XSHLOW /LOWER ERCG /TEMP--NOT ALLOWED FOR SHOW XSHDEV /DEVICE ERCG /DMODE--NOT ALLOWED FOR SHOW XSHMOD /MODE XSHFIL /FILLER XSHMSK /MASK XSHMSK /'XSET' JUMP LIST SETJMP, XDDEV /DDEV (DUMP DEVICE) XFORM /FORMAT XFORM XOUTS /OUTPUT XOUTS XEMODE /ERROR (MODE) XEMODE XOFFS /OFFSET XUPP /UPPER XLOW /LOWER XTEMP /TEMP XDEV /DEVICE XDMODE /DMODE (DUMP MODE) XMODE /MODE XFILL /FILLER XMASK /MASK XMASK /'XEMODE' COMMAND LIST XELST, TEXT "SHS@LOL@" /'XEMODE' BRANCH LIST XEOPS, XEMOD1 /SHORT XEMOD1 XEMOD1+1 /LONG XEMOD1+1 /'XOUTS' LISTS XOLST, TEXT "FPF@PDP@OCO@" XOOPS, XOUTS1-1 /FPP SYMBOLIC XOUTS1-1 XOUTS1 /PDP SYMBOLIC XOUTS1 XOUTS1+1 /OCTAL XOUTS1+1 /'XMODE' COMMAND LIST MODLST, TEXT "OFO@SAS@LOL@NON@" /'XMODE' JUMP LIST MODOPS, XMODS-1 /OFFSET XMODS-1 XMODS+1 /SAVE FILE XMODS+1 XMODS /LOAD MODULE XMODS XMODS+2 /NORMAL XMODS+2 /'XDMODE' LISTS XDMLST, TEXT "ALPANO" XDMOPS, XDMODS-1 /ALL XDMODS /PART XDMODS+1 /NONE /LIST OF DESCRIPTOR ADDRESSES FOR "SHOW MODE" MS27 /-1 = "OFFSET" MODELS, MS29 / 0 = "NORMAL" MS28 /+1 = "SAVE" MS34 /+2 = "LOAD" /LIST OF DESCRIPTOR ADDRESSES FOR "SHOW OUTPUT" MS16 /-1 = "FPP (SYMBOLIC)" OUTLS, MS26 / 0 = "OCTAL" MS31 /+1 = "PDP (SYMBOLIC)" /'XWORD' COMMAND LIST XWORCL, TEXT "UNU@" *.-1 /'XSTRIN' COMMAND LIST STRLST, TEXT "FRF@TOT@ABA@MAM@ME" /'XWORD' JUMP LIST XWOROP, XWOR2 /UNEQUAL XWOR2 XWSFRM /FROM XWSFRM XWSTO /TO XWSTO XWSABS /ABSOLUTE XWSABS ERCH /MASKED--NO! XWOR7 /MEMREF XWOR7 /'XSTRIN' JUMP LIST STROPS, XWSFRM /FROM XWSFRM XWSTO /TO XWSTO XWSABS /ABSOLUTE XWSABS XSTR0 /MASKED XSTR0 ERCH /MEMREF--NO! /LIST OF TERMINATORS, IN ORDER, FOR 'EVAL' TERMS, "! /1 "& /2 "+ /3 "- /4 "/ /5 "* /6 "( /7 ") /10 215 /CR: 11 0 /'GWORD' & 'ACCEPT' COMMAND LISTS GWLST1, "9 "8 "7 "6 "5 "4 "3 "2 "1 "0 204 /^D 213 /^K "" "' "( GWLST2, 240 /SPACE 215 /CR 0 /'GWORD' JUMP LISTS GWOPS1, GWD4 / 9 - A NUMBER GWD4 / 8 - A NUMBER GWD4 / 7 - A NUMBER GWD4 / 6 - A NUMBER GWD4 / 5 - A NUMBER GWD4 / 4 - A NUMBER GWD4 / 3 - A NUMBER GWD4 / 2 - A NUMBER GWD4 / 1 - A NUMBER GWD4 / 0 - A NUMBER GWD4 /^D - A NUMBER GWD4 /^K - A NUMBER GWD4 / " - A NUMBER GWD4 / ' - A NUMBER GWD4 / ( - A NUMBER GWOPS2, GWD2 /SPACE - TERMINATOR GWD3 / CR - " /'ACCEPT' JUMP LIST ACOPS, ACCNUM / 9 - A DIGIT ACCNUM / 8 - A DIGIT ACCNUM / 7 - A DIGIT ACCNUM / 6 - A DIGIT ACCNUM / 5 - A DIGIT ACCNUM / 4 - A DIGIT ACCNUM / 3 - A DIGIT ACCNUM / 2 - A DIGIT ACCNUM / 1 - A DIGIT ACCNUM / 0 - A DIGIT CTRLD / ^D SWITCH CTRLK / ^K SWITCH DQUOTE / " - SINGLE ASCII SQUOTE / ' - PACKED ASCII ERCR / ( - ILLEGAL HERE ACCPT3-2 /SPACE - END ACCPT3-1 /CR - END /'GARGS' JUMP LIST - TERMINATORS GAROPS, GAR5 /- GAR6 /, ERCS /:, SHOULDN'T SEE, WILL DO ERROR GAR4 /. ERCS /SPACE, SHOULDN'T SEE, WILL DO 'ERROR' GAR3 /CR /'GARGS' & 'ARG' COMMAND LISTS GARLST, "- ", GETLST, ": ARGLST, ". 240 /SPACE 215 /CR 0 /'GETNT' LISTS GETOPS, GETCOL GETPER GETEND GETEND+1 /'ARG' JUMP LIST ARGOPS, ARG2 ARG3 ARG3 /'WCHEK' LISTS WCKLST, "( ") "" "' 215 0 WCKOPS, WCHEK5+1 WCHEK5 WCHEK6+1 WCHEK6 WCHEK4 /'EVAL' JUMP LIST 1 EVOPS1, EVNEXT /+ EVMIN /- EVLPAR /( /'EVAL' COMMAND LISTS EVLST1, "+ "- "( 0 EVLST2, "L "B "S "C "F "R "T "D 0 /'EVAL' JUMP LIST 2 EVOPS2, EVLOC /L (LOC) EVBLK /B (BLK) EVSR /S (S.R.) EVSR+1 /C (CONTENTS) EVFIL /F (FILLER) EVREM /R (REMAINDER) EVTEMP /T (TEMP) EVDATE /D (DATE) /ACTION CHARS FOR "READLN" SUBROUTINE REACTL, "R-100 /CTRL-R = RE-ECHO "U-100 /CTRL-U = ERASE LINE 0 REACTS, RECHO RERASE /ERROR ROUTINE ADDRESS LIST: ERLIST, ERCA ERCB ERCC ERC14 ERCD ERCE ERCG ERCH ERCI ERCK ERCJ XSET1 ERCL ERCZ ERCO ERC11 ERC04 ERCP ERCQ ERCR ERC09 ERC08 ERC13 ERCS ERCT ERCU ERCV ERCW ERCX ERCY ERCM ERC00 ERC01 ERC02 ERC03 ERC10 ERCF GCCERR HDRERR ERC05 ERC07 ERC18 ERC19 ERC20 ERC15 ERC16 ERC17 0 DECIMAL SMASKB, -1 /STRING SEARCH MASK BUFFER /L(SMASKB)=66(10) COMB= SMASKB+66 /COMMAND INPUT BUFFER /L(COMB)= 140(10) PDLB= COMB+140 /PUSH-DOWN-LIST BUFFER /**** ALSO REWIND BUFFER! **** CCBB-PDLB /SHOW PDL SPACE OCTAL CCBB= 16400 /CORE-CONTROL-BLOCK BUFFER AND HEADER / BUFFER FOR LOAD MODULES, 1 PAGE FIELD 1 DMPBUF= 16600 /DUMP OUTPUT BUFFER, 2 PAGES FIELD 1 IOBUF= 17200 /DEVICE I/O DUFFER, 2 PAGES FIELD 1 $$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 | &ABSLDR ABSLDR.SV @CALLING COMMANDS: .LOAD DEV:BINFILE.BN,... .LOAD BINFILE.BN,... /FROM DSK @SWITCHES: /8 PROG DOESN'T USE BELOW 02000 /9 PROG DOESN'T USE BELOW 12000 /G GO /I CORE IMAGE FILE /P PROG DOESN'T DESTROY EXTENDED BATCH RESIDENT /R RESET /S MULTIPLE BINARIES/FILE /N FORCE LOADING TO FIELD N (N IS AN OCTAL DIGIT) =FNNNN SET STARTING ADDRESS &BASIC BASIC.SV @CALLING COMMANDS: .BASIC .R BASIC @INTERNAL COMMANDS: BYE EXIT FROM BASIC LIST LIST CURRENT PROGRAM'S STATEMENTS NAME RENAME CURRENT PROGRAM NEW PREPARE FOR A NEW PROGRAM OLD RETRIEVE AN OLD PROGRAM RUN RUN CURRENT PROGRAM SAVE SAVE CURRENT PROGRAM SCRATCH DELETE CURRENT PROGRAM .HELP BCOMP PRINTS BASIC COMPILER ERROR MESSAGES .HELP BRTS PRINTS BASIC RUN-TIME ERROR MESSAGES &BCOMP BCOMP.SV (ERRORS) @ERRORS: CH ERROR IN CHAIN STATEMENT DE ERROR IN DEF STATEMENT DI ERROR IN DIM STATEMENT FN ERROR IN FILE NUMBER OR FILE NAME FP INCORRECT FOR STATEMENT FR ERROR IN FUNCTION ARGS IF ERROR IN IF STATEMENT IO I/O ERROR LS MISSING EQUALS SIGN IN LET LT STATEMENT TOO LONG MD MULTIPLY DEFINED LINE NUMBER ME MISSING END STATEMENT MO OPERAND EXPECTED AND NOT FOUND MP PARENTHESIS ERROR MT OPERAND OF MIXED TYPE NF NEXT STATEMENT WITHOUT FOR NM MISSING LINE NUMBER OF OUTPUT FILE ERROR PD PUSHDOWN STACK OVERFLOW QS STRING LITERAL TOO LONG SS SUBSCRIPT OR FUNCTION ARG ERROR ST SYMBOL TABLE OVERFLOW SY SYSTEM INCOMPLETE TB PROGRAM TOO BIG TD TOO MUCH DATA IN PROGRAM TS TOO MANY CHARS IN STRING LITERALS UD ERROR IN UDEF STATEMENT UF FOR STATEMENT WITHOUT NEXT US UNDEFINED STATEMENT NUMBER UU USE STATEMENT ERROR XC EXTRA CHARS AFTER LOGICAL END OF LINE &BRTS BRTS.SV (ERRORS) @ERRORS: BO NO MORE FILE BUFFERS AVAILABLE CI INQUIRE FAILURE IN CHAIN. DEVICE NOT FOUND CL LOOKUP FAILURE IN CHAIN. FILENAME NOT FOUND. CX CHAIN ERROR DA ATTEMPT TO READ PAST END OF DATA LIST DE DEVICE DRIVER ERROR DO NO MORE ROOM FOR DRIVERS DV ATTEMPT TO DIVIDE BY 0 EF LOGICAL END OF FILE EM ATTEMPT TO RAISE A NEGATIVE NUMBER TO A REAL POWER EN ENTER ERROR FB ATTEMPT TO USE A FILE ALREADY IN USE FC CLOSE ERROR FE FETCH ERROR FI ATTEMPT TO CLOSE OR USE AN UNOPENED FILE FM ATTEMPT TO FIX NEGATIVE NUMBER FN ILLEGAL FILE NUMBER FO ATTEMPT TO FIX NUMBER GREATER THAN 4095 GR RETURN WITHOUT A GOSUB GS TOO MANY NESTED GOSUBS IA ILLEGAL ARGUMENT IN UDEF FUNCTION CALL IF ILLEGAL DEV:FILENAME SPECIFICATION IN INQUIRE FAILURE IO TTY INPUT BUFFER OVERFLOW LM ATTEMPT TO TAKE LOG OF A NEGATIVE NUMBER OE DRIVER ERROR WHILE OVERLAYING OV NUMERIC OR INPUT OVERFLOW PA ILLEGAL ARGUMENT IN POS FUNCTION RE ATTEMPT TO READ PAST END OF FILE SC STRING TOO LONG AFTER CONCATENATING SL STRING TOO LONG OR UNDEFINED SR ATTEMPT TO READ STRING FROM NUMERIC FILE ST STRING TRUNCATION ON INPUT SU SUBSCRIPT OUT OF DIM STATEMENT RANGE SW ATTEMPT TO WRITE STRING INTO NUMERIC FILE VR ATTEMPT TO READ VARIABLE LENGTH FILE WE ATTEMPT TO WRITE PAST END OF FILE &BOOT BOOT.SV @CALLING COMMANDS: .BOOT/DV @SWITCHES: /CA TA8E CASSETTE CAPS-8 /DK ANY DISK /DL LINCTAPE DIAL /DM ANY DISK DISK MONITOR /DT ANY TAPE /LT LINCTAPE /PT PT8E (LOADS BINLDR) /RE RK8E DISK /RF RF08,DF32 DISKS /RK RK8 DISK /RX RX8E FLOPPY DISK /TD TD8E DECTAPE /TY TYPESET (UNIT 4) /VE VERSION # /TC TC08 DECTAPE ALL SYSTEMS /ZE ZEROES CORE (FIELD 0) DEVICES ARE UNIT 0 IF NOT SPECIFIED DV. HALT AFTER LOADING BOOTSTRAP &BUILD BUILD.SV @INTERNAL COMMANDS: $ALTER GRP,LOC $ALTER GRP,LOC=VALUE $BOOT $BUILD $CTL ACTNAM $CTL ACTNAM=VALUE $CORE N $DCB ACTNAM $DCB ACTNAM=VALUE $DELETE ACTNAM,... $DSK ACTNAM $DSK GRP:NAME $EXAMINE GRP,LOC $INSERT GRP $INSERT GRP:NAME,... $LOAD DEV:FILENM.BN $LOAD ACTNAM $NAME ACTNAM=NEWNAM $PRINT $QLIST $REPLACE ACTNAM,...=GRP:NEWNAM,,, $SIZE ACTNAM $SIZE ACTNAM=VALUE $SYS GRP $SYS GRP:NAME,... $UNLOAD GRP $UNLOAD GRP:NAME,... @ERRORS: ?BAD ARG NO DEVICE NAME IN LOAD COMMAND ?BAD INPUT INPUT NOT A VALID BINARY FILE ?BAD LOAD BINARY HANDLER NOT IN CORRECT FORMAT ?BAD ORIGIN ORIGIN IN BINARY FILE NOT IN RANGE 200-577 ?CORE NOT ENOUGH MEMORY AVAILABLE ?DSK DSK IS NOT FILE STRUCTURED ?HANDLERS MORE THAN 15 HANDLERS ARE ACTIVE I/O ERROR ERROR DURING LOAD ?NAME MISSING NAME NO ROOM TOO MANY DEVICE HANDLERS LOADED NAME NOT FOUND DEVICE OR FILE NAME NOT FOUND ?PLAT TOO MANY PLATTERS SPECIFIED FOR DEVICE ?SYNTAX BAD SYNTAX ?SYS HANDLER IS NOT A SYSTEM HANDLER OR TWO SYSTEM HANDLERS ARE ACTIVE OR HANDLER CORESIDENT WITH NON-ACTIVE SYS SYS ERROR I/O ERROR OCCURED WITH SYSTEM HANDLER. PRESS CONTINUE TO RETRY SYS NOT FOUND NO ACTIVE HANDLER BY NAME OF SYS DURING BOOTSTRAP & &CCL OS/8 MONITOR COMMANDS CMD PROG EXPL ASSIGN KBM ASSIGNS LOGICAL NAME BACKSP CAMP BACKSPACES DEV BASIC BASIC ENTERS BASIC SYSTEM BOOT BOOT BOOTSTRAPS TO DEV CCL CCL DISABLES CCL COMPARE SRCCOM COMPARES FILES COMPILE PAL8 COMPILES PROG F4/FORT BASIC RALF SABR COPY FOTP COPIES FILES CREATE EDIT OPENS FILE FOR EDITING CREF PAL8 ASSEMBLES AND CHAINS TO CREF CREF CREF'S LISTING DATE KBM/CCL SPECIFIES DATE DEAS CCL DEASSIGNS LOGICAL DEVICES DELETE FOTP DELETES FILES DIRECT DIRECT PRINTS DIRECTORIES DUPLIC RXCOPY COPIES RX DISKS EDIT EDIT EDITS FILE EOF CAMP WRITES END-OF-FILE EXECUTE PAL8 COMPILES AND EXECUTES F4/FORT BASIC RALF SABR ABSLDR LOADS AND EXECUTES LOAD(ER) GET KBM GETS CORE-IMAGE HELP HELP LIST'S HELP FILE LIST FOTP LISTS FILES LOAD ABSLDR LOADS FILES LOAD(ER) MAKE TECO MAKES NEW FILE FOR EDITING MAP BITMAP PRINTS BITMAP MEMORY CCL SPECIFIES MACHINE CORE SIZE MUNG TECO MUNGS FILE WITH TECO MACRO ODT KBM RUNS OCTAL DEBUGGER PAL PAL8 RUNS PAL8 PRINT LPTSPL RUNS 'LPTSPL' IF PRESENT PUNCH FOTP PUNCHES DATA R KBM RUNS PROGRAM FROM SYS: RENAME FOTP RENAMES FILES RESORC RESORC PRINTS RESOURCES OF SYSTEMS REWIND CAMP REWINDS DEV RUN KBM RUNS PROGRAM SAVE KBM SAVES CORE IMAGE SET SET ALTERS PARAMETERS SKIP CAMP SKIPS RECORDS SQUISH PIP SQUISHES DEV START KBM STARTS PROG SUBMIT BATCH STARTS BATCH JOB TECO TECO EDITS FILE TYPE FOTP TYPES FILES UA CCL REMEMBERS COMMAND UB CCL UC CCL UNLOAD CAMP UNLOADS DEV VERSION CCL TYPES VERSION # ZERO PIP ZEROES DEV @SWITCHES: -L OUTPUT TO LPT: -S OUTPUT TO TV: -T OUTPUT TO TTY: -P OUTPUT TO PTP: -D OUTPUT TO DUMP: -N OUTPUT TO NULL: -LS PRODUCE LISTING -NB NO BINARY YET -MP PRODUCE MAP -EXT SET DEFAULT EXTENSION @FEATURES: /X PASS SWITCH OPTION X TO PROGRAM (XYZ) PASS SWITCH OPTIONS TO PROGRAM [N] MAX OUTPUT SIZE =NNN PASS OCTAL NUMBER TO PROGRAM #NNN TAKE INTERNAL OCTAL FORM OF FILENAME @FILE REPLACE IN CMD LINE BY FILE'S CONTENTS $ COMPLEMENT DEFAULT ALTMODE SWITCH &CREF CREF.SV @CALLING COMMANDS: .CREF DEV:BINFILE.BN,DEV:LISTFILE.LS,DEV:TEMPFILE.TM<DEV:INFILE.PA .CREF DEV:INFILE.PA /LISTING TO LINE PRINTER ONLY .CREF INFILE.PA /LISTING TO LINE PRINTER, INPUT FILE ON DSK @SWITCHES: /E DON'T DELETE CREFLS.TM /M MAMMOTH (TWICE AS MANY SYMBOLS, TWICE AS SLOW) /P NO PASS 1 LISTING /Q SABR /R RALF /U NO LISTING OR SYMBOL TABLE /X NO LITERALS &DIRECT DIRECT.SV @CALLING COMMANDS .DIR DEV:LISTFILE.DI<DEV:FILETYPE /* IS WILD NAME OR EXTENSION .DIR FILETYPE /? IS WILD CHARACTER @SWITCHES: /B INCLUDE STARTING BLOCK NUMBERS (OCTAL) /C LIST ONLY FILES WITH CURRENT DATE /E INCLUDE EMPTIES /F FAST MODE /I PRINT ADDITIONAL INFO WORDS /L USUAL MODE /M LIST EMPTIES ONLY /O LIST ONLY FILES WITH OTHER THAN TODAY'S DATE /R LIST REMAINDER OF FILES AFTER FIRST ONE (BUT USE /C,/O) /U TREAT EACH INPUT SPECIFICATION SEPARATELY /V LIST FILES NOT OF FORM SPECIFIED /W GIVE VERSION NUMBER =N USE N COLUMNS &EDIT &CREATE EDIT.SV @CALLING COMMANDS: .EDIT DEV:OUTFILE.PA<DEV:INFILE.PA .CREATE OUTFILE.PA @SWITCHES: /A RETURN TO EDITOR ON CLOSE /B CONVERT 2 OR MORE SPACES TO TAB /D PREDELETE @ERRORS: ?0 INPUT ERROR ?1 OUTPUT ERROR ?2 CLOSE ERROR ?3 OPEN ERROR ?4 COULDN'T LOAD DEVICE HANDLER @INTERNAL COMMANDS: A APPEND TEXT B LIST # OF CORE LOCATIONS LEFT C CHANGE TEXT D DELETE TEXT E OUTPUT BUFFER, TRANSFER REST OF DATA, AND CLOSE F AFTER J, SEARCH FOR NEXT OCCURRRENCE OF SAME STRING G GET AND LIST TAGGED LINE I INSERT J INTER-BUFFER STRING SEARCH K KILL BUFFER L LIST TEXT M MOVE TEXT N WRITE BUFFER, KILL AND READ NEXT PAGE P WRITE TEXT BUFFER TO OUTPUT Q IMMEDIATE END OF FILE R READ TEXT FROM INPUT DEVICE S CHARACTER SEARCH T PUNCH TRAILER TAPE V PRINT ON LP08 Y INPUT TEXT PAGE, NO OUTPUT # PRINT VERSION NO. &EPIC EPIC.SV @SWITCHES: /0$ PAPER TAPE I/O TO/FROM OS/8 FILES /E DON'T PUNCH EOT /H SET HIGH BIT=N /L LOW SPEED /P PUNCH PATCH /Z REL BLOCK=0 =N REL BLOCK TO PATCH NO OUT FILE IS READ FILE</1$ EDIT 'FILE' C CURRENT STATUS E EXIT TO CD O,N OPEN BLOCK N R,N READ BLOCK N S,N,M SEARCH FOR N WITH MASK M W WRITE FILE1<FILE2/2$ COMPARE FILE1 AND FILE2 /A ABORT /B BAD BLOCKS ONLY &FORT FORT.SV @CALLING COMMANDS: .COMPILE DEV:BINFILE.BN,DEV:LISTFILE.LS,DEV:MAPFILE.MP<DEV:INFILE.FT .EXE INFILE.FT @SWITCHES: /G GO /K KEEP FORTRN.TM /L LOAD @ERRORS: ALOG ATTEMPT TO COMPUTE LOG OF NEGATIVE NUMBER IOER INPUT/OUTPUT ERROR CHER CHAIN ERROR FMT1 INVALID FORMAT STATEMENT FMT2 ILLEGAL CHARACTER IN I FORMAT FMT3 ILLEGAL CHARACTER IN E OR F FORMAT DIVZ ATTEMPT TO DIVIDE BY 0 EXP ARGUMENT TO EXP TOO LARGE OVFL FLOATING POINT OVERFLOW FLPW ATTEMPT TO RAISE NEGATIVE NUMBER TO REAL POWER SQRT ATTEMPT TO TAKE SQUARE ROOT OF NEGATIVE NUMBER FIX ATTEMPT TO FIX NUMBER GREATER THAN 2047 &FRTS FRTS.SV @SWITCHES: /C CARRIAGE CONTROL SWITCH /E IGNROE ERRORS /H HALT BEFORE STARTING /P PUNCH TO PAPER TAPE &F4 &FORTRAN F4.SV @CALLING COMMANDS: .COMPILE DEV:RALFFILE.RL,DEV:LISTFILE.LS,DEV:MAPFILE.MP<DEV:INFILE.FT .COMPILE INFILE.FT /FROM DSK @SWITCHES: /A RETURN TO KBM AFTER COMPILATION /F PRODUCE RALF LISTING /N SUPPRESS INTERNAL STATEMENT NUMBERS /Q OPTIMIZE .HELP F4ERR PRINTS FORTRAN IV COMPILER ERROR MESSAGES &F4ERR F4.SV (ERRORS) @ERRORS: AA MORE THAN 6 SUBROUTINE ARGUMENTS ARE ARRAYS AS BAD ASSIGN STATEMENT BD BAD DIMENSIONS BS ILLEGAL STATEMENT IN BLOCK DATA SUBPROGRAM CL BAD COMPLEX LITERAL CO SYNTAX ERROR IN COMMON STATEMENT DA BAD SYNTAX IN DATA STATEMENT DE ILLEGAL STATEMENT AT END OF DO DF BAD DEFINE FILE STATEMENT DH HOLLERITH FIELD ERROR IN DATA STATEMENT DL DATA LIST AND VARIABLE LIST ARE NOT SAME LENGTH DN DO-END MISSING OR INCORRECTLY USED DO SYNTAX ERROR IN DO OR IMPLIED DO DP DO LOOP PARAMETER NOT INTEGER OR REAL EX SYNTAX ERROR IN EXTERNAL STATEMENT GT SYNTAX ERROR IN GOTO STATEMENT GV ASSIGNED OR COMPUTED GOTO VARIABLE NOT INTEGER OR REAL HO HOLLERITH FIELD ERROR IE ERROR READING INPUT FILE IF IMPROPER STATEMENT USED WITH LOGICAL IF LI ARGUMENT TO LOGICAL IF IS NOT LOGICAL LT INPUT LINE TOO LONG (TOO MANY CONTINUATIONS) MK MISSPELLED KEYWORD ML MULTIPLY DEFINED LINE NUMBER MM MISMATCHED PARENTHESES MO EXPECTED OPERAND IS MISSING MT MIXED VARIABLE TYPES OF ERROR WRITING OUTPUT FILE OP ILLEGAL OPERATOR OT OPERAND TYPE WRONG FOR GIVEN OPERATOR PD COMPILER STACK OVERFLOW, STATEMENT TOO BIG OR TOO MANY NESTED LOOPS PH BAD PROGRAM HEADER LINE QL NESTING ERROR IN EQUIVALENCE STATEMENT QS SYNTAX ERROR IN EQUIVALENCE STATEMENT RD ATTEMPT TO REDEFINE THE DIMENSIONS OF A VARIABLE RT ATTEMPT TO REDEFINE THE TYPE OF A VARIABLE RW SYNTAX ERROR IN READ/WRITE STATEMENT SF BAD ARITHMETIC STATEMENT FUNCTION SN ILLEGAL SUBROUTINE NAME IN CALL SS ERROR IN SUBSCRIPT EXPRESSION ST COMPILER SYMBOL TABLE FULL SY SYSTEM ERROR; PASS MISSING OR NO ROOM FOR OUTPUT TD BAD SYNTAX IN TYPE DECLARATION STATEMENT US UNDEFINED STATEMENT NUMBER VE VERSION ERROR &LIBRA LIBRA.SV @SWITCHES: /C CONTINUE INPUT SPECIFICATIONS /I INSERTION DECISION /R REPLACE MODULE /Z REPLACE LIBRARY =N EXTRA BLOCKS &LOAD LOAD.SV @CALLING COMMANDS: .LOAD DEV:OUTFILE.LD<DEV:INFILE1.RL,... @SWITCHES: /C MORE INPUT TO LOAD /G CHAIN TO RUN-TIME SYSTEM /L ACCEPT LIBRARY FILE /O MORE OVERLAYS /S SYMBOL MAP /U IGNORE RULES GOVERNING SUBROUTINE CALLS BETWEEN OVERLAYS &LOADER LOADER.SV @CALLING COMMANDS: .LOAD MAPFILE.MP<INFILE.RL,... @SWITCHES: /G GO /H 2 PAGE HANDLERS /I OS/8 FILE INPUT /L 1ST INPUT FILE IS LIBRARY FILE /M PRODUCE MAP /O OS/8 FILE OUTPUT /P OUTPUT COUNT OF FREE PAGES /R RESTART /U OUTPUT UNDEFINED SYMBOLS /N LOAD IN FIELD N (0-7) OR HIGHER =N SET STARTING ADDRESS &MAP &BITMAP BITMAP.SV @CALLING COMMANDS: .MAP MAPFILE.MP<INFILE.BN,... @SWITCHES: /N FORCES MAPPING OF ALL FILES TO FIELD N (0-7) /R RESET INTERNAL MAP /S ALLOW MULTIPLE BINARIES PER FILE /T INVERT TTY-STYLE OUTPUT SWITCH &ODT ODT @CALLING COMMANDS: .ODT @INTERNAL COMMANDS: NNNNN/ OPEN LOC / REOPEN LAST OPENED LOC NN<CR> DEPOSIT NN IN OPEN LOC, CLOSE LOC NN<LF> DEPOSIT NN IN OPEN LOC, CLOSE LOC, OPEN AND DISPLAY NEXT LOC NN;... DEPOSIT NN IN OPEN LOC, CLOSE AND OPEN NEXT LOC <CR> CLOSE PREVIOUSLY OPENED LOC <LF> CLOSE LOC, OPEN NEXT LOC N+ OPEN CUR LOC+N N- OPEN CUR LOC-N ^ CLOSE LOC, OPEN LOC ADDRESSED BY CONTENTS _ CLOSE LOC, OPEN POINTED TO BY CONTENTS NNG GO NNB ESTABLISH BREAKPOINT B REMOVE BREAKPOINT A OPEN AC L OPEN LINK C CONTINUE FROM BREAKPOINT NNC CONTINUE, ITERATE NN TIMES M OPEN SEARCH MASK <LF> OPEN LOWER SEARCH LIMIT <LF> OPEN UPPER SEARCH LIMIT NNW SEARCH CORE FOR NN MASKED BETWEEN LIMITS D OPEN DATA FIELD (0010=FIELD 1) F OPEN FIELD FOR ^, _, W (0010=FIELD 1) ^O SUPRESS PRINTING &PAL8 &PAL PAL8.SV @CALLING COMMANDS: .PAL DEV:BINFILE.BN,DEV:LISTFILE.LS,DEV:TEMPFILE.TM<DEV:INFILE.PA/C .PAL DEV:BINFILE.BN,DEV:LISTFILE.LS<DEV:INFILE.PA .PAL INFILE.PA /FROM DSK .HELP PALERR PRINTS PAL8 ERROR MESSAGES @SWITCHES: /B TREAT ! AS BYTE SHIFT /C CHAIN TO CREF /D DDT-COMPATIBLE SYMBOL TABLE /E ENABLE ERROR MSG ON LINK GENERATED /F DISABLE 0-FILL IN TEXT /G GO /H NON-PAGINATED OUTPUT /J DON'T LIST LINES CONDITIONALIZED OUT /K USE EXTRA CORE /L LOAD /N NO LISTING /O DISABLE ORIGIN 200 AFTER FIELD /S NO SYMBOL TABLE /T NO FORM FEEDS /W DON'T REMEMBER LITERALS &PALERR PAL8.SV (ERRORS) @ERRORS: BE TABLES OVERLAPPED CF CREF.SV NO ON SYS: DE DEVICE ERROR DF DEVICE FULL IC ILLEGAL CHARACTER ID ILLEGAL REDEFINITION IE ILLEGAL EQUALS II ILLEGAL INDIRECT IP ILLEGAL PSEUDO-OP IZ ILLEGAL PAGE ZERO REF LD SYS:ABSLDR.SV NOT FOUND LG LINK GENERATED PE PAGE EXCEEDED PH END OF SOURCE CONDITIONALIZED OUT RD REDEFINITION SE SYMBOL TABLE EXCEEDED UO UNDEFINED ORIGIN US UNDEFINED SYMBOL ZE PAGE 0 EXCEEDED &PIP PIP.SV @SWITCHES: /A ASCII MODE /B BINARY MODE /C ELIM TRAILING BLANKS /D DELETE OUTPUT FILE BEFORE TRANSFER /G IGNORE ERRORS /I IMAGE MODE /O OKAY TO COMPRESS OR ZERO /S SQUISH /T CONVERT TABS TO SPACES, ETC. /V VERSION # /Y COPY SYSTEM HEAD /Z ZERO OUTPUT DIRECTORY BEFORE TRANSFER =N # OF ADDITIONAL INFO WORDS (/Z OR /S) =N SIZE TO CLOSE OUTPUT FILE (/I) &PIP10 PIP10.SV @SWITCHES: /B BINARY MODE /D DELETE OLD OUTPUT FILE BEFORE TRANSFER /F FAST PDP-10 DIRECTORY /I IMAGE MODE /L LIST PDP-10 DIRECTORY /P PRESERVE LINE NUMBERS /Z ZERO PDP-10 DIRECTORY BEFORE TRANSFER &DUPLIC &RXCOPY RXCOPY.SV @CALLING COMMANDS: .DUPLIC OUTDEV:<INDEV: @SWITCHES: /M MATCH WITH NO IMPLIED COPY /N COPY WITH NO IMPLIED MATCH /P PAUSE BEFORE AND AFTER ACCESSING DISKS /R READ OUTPUT DEVICE WITH NO IMPLIED COPY OR MATCH /V PRINT VERSION NUMBER &SABR SABR.SV @CALLING COMMANDS: .COMPILE BINFILE.RL,LISTFILE.LS,MAPFILE.MP<INFILE.SB .EXE DEV:BINFILE.RL,DEV:LISTFILE.LS,DEV:MAPFILE.MP<DEV:INFILE.SB @SWITCHES: /F INPUT IS FROM FORT /G CHAIN TO LOADER AND GO /L CHAIN TO LOADER /N NO LISTING /S NO SYMBOL TABLE @ERRORS: A WRONG NO. OFARG'S C BAD CHAR D I/O ERROR E NO END STMNT I ILLEGAL SYNTAX L SYS:LOADER.SV NOT FOUND M MULTIPLY DEFINED SYMBOL S SYMBOL OVERFLOW U UNDEFINED SYMBOL &SET SET.SV @CALLING COMMANDS: .SET DEV PARAMETER(S) .SET DEV NO PARAMETER(S) @PARAMETERS: READONLY DECLARE DEVICE TO BE READ ONLY FILES DECLARE DEVICE TO BE FILE STRUCTURED DVC CHANGE DEVICE CODES VERSION X CHANGE VERSION LOCATION N[=M] EXAMINE OR CHANGE LOCATIONS LV8E DECLARE LINE PRINTER TO BE AN LV8E LA8A DECLARE LINE PRINTER TO BE LA180 ON DKC8-AA LA78 SAME AS .SET LPT NO LA8A WIDTH N SET WIDTH OF LINE PRINTER OR TTY LC DECLARE LINE PRINTER OR TTY TO HAVE LOWER CASE ECHO RESTORE TTY CHARACTER ECHOING PAGE RESTORE TTY ^S AND ^Q FACILITIES TAB IN TTY PRINT TABS (DON'T SIMULATE WITH SPACES) FILL IN TTY APPEND FILL CHARACTERS AFTER TABS FLAG IN TTY FLAG LOWER CASE CHARACTERS SCOPE ERASE CHARACTER ON TTY RUBOUTS ESC PRINT ESC(ASCII 033) WITHOUT CONVERTING IT TO $ SIGN ARROW PRINT CONTROL CHARACTERS WITH UP ARROW (E.G. ^C, ^S) HEIGHT [M] SET TTY SCREEN HEIGHT PAUSE [N] SET TTY PAUSE TIME COL N SET DIRECT TO USE N COLUMNS (.SET TTY COL 2) CODE N CHANGE TTY IOTS OR CARD READER CODES PARITY EVEN/ODD SET MAGTAPE PARITY OS8 DECLARE SYS TO BE OS/8 OS78 DECLARE SYS TO BE OS/8 INIT XXXXX CAUSE SYS TO EXECUTE XXXXX ON BOOTSTAPPING &SRCCOM &COMPAR SRCCOM.SV @CALLING COMMANDS: .COMPAR DEV:OUTFILE.PA<DEV:INFILE1.PA,DEV:INFILE2.PA .COMPAR OUTFILE.PA<INFILE1.PA,INFILE2.PA /FILES ON DSK @SWITCHES: /B COMPARE BLANK LINES /C DON'T COMPARE (SLASHED) COMMENTS /S DON'T COMPARE TABS AND SPACES /T CONVERT TABS TO SPACES ON OUTPUT /X DON'T COMPARE OR PRINT COMMENTS @ERRORS: ?0 INSUFFICIENT CORE ?1 INPUT ERROR FILE 1 (OR LESS THAN 2 INPUT FILES) ?2 INPUT ERROR FILE 2 ?3 OUTPUT FILE TOO LARGE ?4 OUTPUT ERROR ?5 CAN'T OPEN OUTPUT FILE &BATCH &SUBMIT BATCH.SV @CALLING COMMANDS: .SUBMIT SPOOLDEV:<INPUTDEV:FILE.BI @SWITCHES: /C CARDS /E DON'T ABORT ON MONITOR, CD AND CCL ERRORS /P PTR /Q NO BATCH LOG /H HUSH /T OUTPUT TO TTY /U UNATTENDED /6 USE 026 CARD CODES &TECO &MAKE &MUNG TECO.SV @CALLING COMMANDS: .TECO DEV:OUTFILE.PA<DEV:INFILE.PA .TECO FILE.PA /ON DSK .MAKE DEV:OUTFILE.PA .MAKE OUTFILE.PA /ON DSK .MUNG DEV:INFILE.PA,TECO MACRO ARGUMENT TEXT @ERRORS: ?ILL ILLEGAL COMMAND ?UTC UNTERMINATED COMMAND ?IQN ILLEGAL Q-REGISTER NAME ?PDO INTERNAL PUSH DOWN OVERFLOW (RECURSION) ?MEM MEMORY OVERFLOW ?STL SEARCH STRING TOO LONG ?ARG ARGUMENT ERROR ?IFN ILLEGAL FILE NAME ?SNI SEMICOLON NOT IN ITERATION ?BNI CLOSE BRACKET NOT IN ITERATION ?POP POINTER OFF PAGE ?QMO Q-REGISTER OVERFLOW ?UTM UNTERMINATED MACRO ?OUT OUTPUT ERROR ?INP INPUT ERROR ?FER FILE ERROR ?FUL OUTPUT COMMAND WOULD HAVE OVERFLOWED ?NAY NEGATIVE ARGUMENT TO Y ?IEC ILLEGAL E CHARACTER ?IQC ILLEGAL " CHARACTER ?NAE NO ARGUMENT BEFORE = ?NAU NO ARGUMENT BEFORE U ?NAQ NO ARGUMENT BEFORE " ?SRH FAILING SEARCH ?NAP NEGATIVE OR 0 ARGUMENT TO P ?NAC NEGATIVE ARGUMENT TO , ?NIC NEGATIVE OR 0 ITERATION COUNT ?NAS NEGATIVE OR 0 COUNT TO SEARCH ?WLO CAN'T WRITE OUT ERROR MESSAGE OVERLAY ?NFO NO FILE FOR OUTPUT &FOTP &LIST © &RENAME &TYPE &DELETE FOTP.SV @CALLING COMMANDS: .COPY DEV:OUTFILE.EX<DEV:INFILE.EX /* IS WILD NAME OR EXTENSION .REN DEV:NEWFILE.EX<DEV:OLDFILE.EX /? IS WILD CHARACTER .DEL DEV:FILE.EX .LIST DEV:FILE.EX /= .COPY LPT:<DEV:FILE.EX .TYPE DEV:FILE.EX /= .COPY TTY:<DEV:FILE.EX @SWITCHES: /C MATCH ONLY FILES WITH CURRENT DATE /D DON'T TRANSFER (I.E. AT MOST ONLY DELETE) /F REQUEST NEW DEVICE IF OUT OF ROOM /L TYPE LOG OF INPUT FILENAME MATCHES (*) /N NO PRE-DELETE /O MATCH ONLY FILES WITH OTHER THAN TODAY'S DATE /Q QUERY USER ABOUT FILE BEFORE OPERATION (*) /R RENAME /T USE TODAY'S DATE /U TREAT EACH INPUT SPECIFICATION SEPARATELY /V MATCH FILES NOT OF FORM SPECIFIED /W PRINT VERSION # NOTES: (*) /D CAUSES LOG OF OUTPUT FILES (IF /L ALSO) IF INDEV: EQUALS OUTDEV:, THEN /N IS FORCED. IF NO INPUT FILE, *.* IS FORCED EXCEPT FOR /D IF OUTPUT DEVICE SPECIFIED, BUT NO FILE, *.* IS ASSUMED. ^P ABORT OPERATION, FIX OUTPUT DIRECTORY ^C FIX OUTPT DIRECTORY, RETURN TO OS/8 ^O SUPPRESS TYPEOUT &ASSIGN &DATE &DEASSIGN &GET &MEMORY &R &RUN &SAVE &START &SQUISH &UA &ZERO KEYBOARD MONITOR AN OTHER COMMANDS @CALLING COMMANDS: .ASSIGN DEV NAME /ASSIGN NAME TO DEVICE .DAY DD-MON-YY /ENTER DATE INTO SYSTEM .DEASSIGN /DEASSIGN LOGICAL DEVICE NAMES .GET DEV FILE.EX /LOAD CORE IMAGE .MEMORY N /SPECIFY HIGHEST MEMORY FIELD AVAILABLE .R FILE /EXECUTE FILE.SV FROM SYS .RUN DEV FILE.EX /EXECUTE FILE.EX FROM THE DEVICE .SAVE DEV FILE.EX /SAVE CORE IMAGE .SQUISH DEV: /COMPRESS FILE STORAGE ON DEVICE .START FNNNN /START EXECUTION .UA COMMAND /SAVE COMMAND(.UA<CR> EXECUTES IT) .ZERO DEV: /ZERO DEVICE'S DIRECTORY |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 | / OS/8 HELP PROGRAM / / THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE / AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT / CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY / FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / / THE SOFTWARE DESCRIBED HEREIN IS FURNISHED TO THE PURCHASER / UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED / (WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH / SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / / DIGITAL EQUIPMENT ASSUMES NO RESPONSIBILITY FOR THE USE / OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED / BY DIGITAL. / / COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION / / / VERSION #1 B. M. 1/1/77 / VERSION #2A M. H. 4/22/77 / (CHANGE TAG VERS WHEN CHANGING VERSION NUMBERS) / / THIS PROGRAM CAN BE CALLED DIRECTLY OR CHAINED TO BY CCL TO / PRINT INFORMATION ON RANDOM SUBJECTS THE USER ASKS ABOUT. / / START ADDRESS:200 JSW:3401 / CORE LIMITS:200-7377 / / THIS PROGRAM REQUIRES AN INPUT FILE TO RUN. FOR OS/8 THE FILE / SHOULD BE NAMED "HELP8.HL" FOR OS/78 THE NAME SHOULD BE "HELP78.HL". / / THE FORMAT OF THE FILE IS: / <SP><CR><LF> / &COMMAND NAME / &ADDITIONAL COMMAND NAMES(IF ANY) / TEXT OF HELP INFO / &NEXT COMMAND NAME / TEXT OF NEXT HELP INFO / ETC. / / NOTE: TOO SPEED UP PROCESSING A HASHING ALGORITHM IS USED / WHICH REQUIRES THAT WHEN MULTIPLE COMMANDS REFERENCE A / SINGLE SUBFILE, THE SUBFILE MUST APPEAR IN THE HELP FILE / ALPHABETICALLY ACCORDING TO THE 1ST COMMAND STRING LETTER / CLOSEST TO Z. / THAT IS, SUBFILES MUST BE ARRANGED ALPHABETICALLY ACCORDING TO / THE HIGHEST LETTERED 1ST CHARACTER OF THE COMMAND. / USR= 200 /ADDRESS OF USR OS78= 7771 /ADDRESS OF WD WITH OS/78 FLAG BIT(4) (MH) FETCH= 1 /FETCH A HANDLER LOOKUP= 2 /LOOKUP A FILE NAME ENTER= 3 /ENTER A FILE CLOSE= 4 /CLOSE A FILE DECODE= 5 /CALL THE COMMAND DECODER HASH= 3 /HASH CODE SUBTRACTION FACTOR(MH) *10 NAMPTR, 0 /POINTER TO CMD DECODER INPUT NAMES XR1, 0 /RANDOM INDEX REGISTER XR2, 0 /ANOTHER RANDOM INDEX REGISTER *30 COUNT, 0 /RANDOM WORD COUNT FOR ANYTHING CHAR, 0 /TEMPORARY PLACE TO PUT A CHARACTER WILD, 0 /IF NONZERO, NAME HAS '*' OR '?' IN IT WASHLP, 0 /NONZERO IF HELP WAS FOUND ON THIS WORD NAME, ZBLOCK 6 /NAME HELP WAS REQUESTED ON TXTNAM, ZBLOCK 10 /CURRENT SCRIPT FILE NAME BEING LOOKED AT NAMCNT, 0 /NUMBER OF NAMES IN THE COMMAND DECODER AREA BLKCNT, 0 /NUMBER OF AVAILABLE BLOCKS ON OUTPUT OUTADR, 0 /ADDRESS OF OUTPUT HANDLER LINCNT, 0 /COUNT OF NUMBER OF NAMES ON '*' OR 'HELP' LINE LINMAX, -5 /MAXIMUN NUMBER OF NAMES/LINE ON '*' OR 'HELP' LINE FILNAM, ZBLOCK 4 /OUTPUT FILE NAME WDCTR, 0 /WORD COUNTER IN INPUT BLOCK CHTEM, 0 /TEMPORARY SPOT FOR CHARACTER IN 2/3 UNPACK DEVHND, 0 /OUTPUT DEVICE HANDLER ADDRESS CHPTR, 0 /BUFFER POINTER FOR READING CHARACTERS TEMP, 0 /TEMP STORE / MAIN LOOP OF PROGRAM STADR=200 *STADR START, SKP CLA /NORMAL ENTRY POINT JMP START1 /CHAINED ENTRY (CMD DECODE DONE BY CCL) CIF 10 /SEE WHAT TO DO JMS I (USR DECODE 5200 0 START1, JMS I (INIT /DO ALL INITIALIZATION AND SETUP MAINLP, JMS I (NXTNAM /GET NEXT NAME FROM COMMAND DECODER AREA JMP I (EXIT /NO NAMES LEFT JMS I (RESET /RESET THE INPUT FILE POINTERS TO THE BEGINNING TAD NAME /CHECK FOR '*' OR 'HELP" NAME INDICATING LIST OF HELPS TAD (-"* SNA!CLA JMP HELPLS /NAME BEGAN WITH '*' TAD NAME /NOT '*' LOOK FOR HELP (MH) TAD (-"H SZA!CLA JMP MAIN1 /NO 'HELP' TAD NAME+1 TAD (-"E SZA!CLA JMP MAIN1 TAD NAME+2 TAD (-"L SZA!CLA JMP MAIN1 TAD NAME+3 TAD (-"P SNA!CLA JMP HELPLS /WAS 'HELP" GO PRINT LIST (MH) TAD NAME /IS 1ST CHAR A "?"?(MH) TAD (-"? /(MH) SNA!CLA /(MH) JMP MAIN1 /YES -- DON'T TRY TO HASH FILE (MH) TAD NAME /NO -- HASH START BLK OF FILE BY (MH) AND (77 /MAKING 1ST CHAR OF NAME SIXBIT (MH) DCA TEMP /MULTIPLY BY 1.5 (MH) TAD NAME /THEN SUBTRACT "HASH"(3) (MH) AND (77 /(MH) CLL!RAR /(MH) TAD TEMP /(MH) TAD (-HASH /(MH) SPA /(MH) CLA /IF RESULT IF MINUS, SET TO ZERO (MH) TAD I (BLK /ADD REAL START BLK OF FILE (MH) DCA I (BLK /REPLACE NEW BLOCK(MH) MAIN1, JMS I (FINDNM /GET A NAME FROM THE SCRIPT FILE JMP NOHELP /HIT THE END OF THE FILE INSTEAD OF NAME JMS I (COMPAR /COMPARE THIS NAME WITH THE ONE HE HAD JMP MAIN1 /NOT A MATCH, TRY NEXT ONE JMS I (PRINT /PRINT THE HELP INFORMATION FOR THAT NAME TAD WILD /IF A WILD CARD TYPE NAME (I.E. '?') THEN SZA CLA / THEN KEEP SEARCHING PAST 1ST MATCH SINCE THERE JMP MAIN1 / MAY BE MORE. JMP MAINLP /NOT A WILD CARD, GET NEXT CMD DECODER NAME / HIT THE END OF THE SCRIPT FILE / IF DOING A WILD CARD NAME, SOME HJELP MAY HAVE ALREADY BEEN PRINTED. IF / NOT, PRINT AN ERROR MESSAGE ON THE TELETYPE (OR WHATEVER) NOHELP, TAD WASHLP /SEE IF HELP WAS ADMINISTERED SZA CLA JMP MAINLP /YES IT WAS, TRY NEXT NAME ON LIST JMS I (TYPE /TYPE THE ERROR MESSAGE ON THE TTY SORRY-1 DCA TXTNAM /PUT ON ZERO TERMINATER JMS I (TYPE NAME-1 /TYPE WHAT HELP MISSED JMS I (TYPE CRLF-1 /TYPE CARR RETURN, LINE FEED JMP MAINLP /NOW CONTINUE ON WITH IT / IF A '*' OR 'HELP' WAS TYPED AS HELP NAME, THEN PRINT A LISTING / OF ALL THE INFO IN THE HELP FILE FOR THE USER TO PICK FROM. HELPLS, JMS I [OUTSTR /PRINT THE HEADING MESSAGE AVAIL-1 TAD LINMAX /MAX NO. NAMES PER LINE DCA LINCNT /INITIAL COUNT OF NAMES PER LINE HELP1, JMS I (FINDNM /GET NEXT NAME JMP HELP2 /AT END OF FILE JMS I (NAMLST /PRINT THE NAME JMP HELP1 HELP2, TAD LINCNT /CHECK IF LAST CHAR WAS CRLF SNA!CLA JMP MAINLP /IT WAS, DON'T DO ANOTHER JMS I [OUTSTR CRLF-1 JMP MAINLP PAGE / CLOSE ALL FILES AND RETURN TO MONITOR / EXIT, TAD (32 /WRITE AN AND OF FILE TO THE OUTPUT JMS I [PCH TAD (-600 /CLOSE FILE BY WRITING 600(8) NULLS DCA COUNT JMS I [PCH /WRITE IT ISZ COUNT JMP .-2 TAD I [BLKSRT /COMPUTE ACTUAL FILE LENGTH FOR CLOSE CIA TAD I [OUTBLK /CURRENT BLOCK NUMBER IAC DCA OLEN CIF CDF 10 TAD I [7600 CDF 0 JMS I (USR /CLOSE THE FILE CLOSE FILNAM OLEN, 0 /THE LENGTH NOP /ERROR ON CLOSE... CAN'T HAPPEN(MH) JMP I (7605 /RETURN TO OS/8 / SEARCH FOR A <LF>& IN THE FILE / THIS IS THE START OF SOME HELP INFO FOR A SUBJECT WHICH IS NAMED AFTER / THE &. COPY THE NAME INTO 'TXTNAM' SO COMPARES CAN BE DONE LATER. / SKIP IF THE END OF FILE ISN'T FOUND ON THE WAY. FINDNM, 0 DCA TXTNAM /CLEAR THE NAME OUT DCA TXTNAM+1 DCA TXTNAM+2 DCA TXTNAM+3 DCA TXTNAM+4 DCA TXTNAM+5 DCA TXTNAM+6 FIND1, JMS I [GCH /LOOK FOR A <LF>& IN THE FILE TAD (-232 /CHECK FOR END OF FILE SNA JMP I FINDNM /RETURN IF FOUND TAD (232-212 /CHECK FOR LINE FEED SZA CLA JMP FIND1 /NOT IT FIND5, JMS I [GCH /TRY FOR THE & NOW TAD (-"& SNA CLA JMP FIND2 /FOUND A LF,& TAD ("&-232 /MAKE SURE THIS ISNT THE END OF FILE SNA CLA JMP I FINDNM /END OF FILE FOUND, RETURN JMP FIND1 /KEEP LOOKING FOR NAME FIND2, TAD (TXTNAM-1 /MOVE THE NAME INTO 'TXTNAM' DCA XR1 TAD (-7 /MAX OF 7 CHARACTERS DCA COUNT FIND3, JMS I [GCH /GET A NAME CHARACTER TAD (-215 /CHECK IF THE END OF LINE <CR> SNA CLA JMP FIND4 /END OF LINE, THATS IT TAD CHAR DCA I XR1 /SAVE CHARACTER IN TXTNAM ISZ COUNT JMP FIND3 /IF MORE CHARACTERS LEFT FIND4, ISZ FINDNM /BUMP RETURN ADDRESS FOR FOUND RETURN JMP I FINDNM PAGE / COMPARE TWO STRINGS, ONE IN NAME AND ONE IN TXTNAM. CHECK FOR WILD / CARD STUFF LATER WHEN THIS PART IS WORKING. / SKIP IF NAMES ARE EQUAL COMPAR, 0 TAD [NAME-1 /SET UP REGISTERS FOR COMPARE DCA XR1 TAD (TXTNAM-1 DCA XR2 TAD (-6 DCA COUNT COMP1, TAD I XR1 /GET A CHARACTER AND COMPARE WITH ONE FROM DCA CHAR TAD CHAR TAD (-"? /WILDCARD SZA CLA JMP COMP3 /NO WILDCARD ISZ XR2 ISZ WILD JMP COMP2 COMP3, TAD CHAR CIA / THE OTHER STRING TAD I XR2 SZA CLA JMP I COMPAR /NO MATCH, NORMAL RETURN COMP2, ISZ COUNT JMP COMP1 ISZ COMPAR /EQUAL RETURN IS RETRN ADDR+1 JMP I COMPAR / GET THE NEXT NAME FROM THE COMMAND DECODER AREA / STOP ON EITHER A ZERO OR THE NAME GOING TO ZERO NXTNAM, 0 ISZ NAMCNT /COUNT NAMES, ONLY 5 IN THE AREA SKP JMP I NXTNAM /RETURN, NO MORE NAMES CLA CLL CMA RTL /NUMBER OF WORDS OF NAME(-3) DCA COUNT TAD [NAME-1 DCA XR1 CDF 10 TAD I NAMPTR /GET 1ST CHARACTER OF NAME CDF 0 SNA JMP NXTN3 /MAYBE OUT OF NAMES(MH) NXTN1, DCA CHAR /SAVE THE WORD TAD CHAR RTR RTR RTR /ISOLATE HIGH 6 BITS JMS SIXTO8 DCA I XR1 /PUT IN NAME BUFFER TAD CHAR /NOW DO OTHER HALF JMS SIXTO8 DCA I XR1 /2ND CHARACTER OF WORD ISZ COUNT SKP JMP NXTN2 /NO MORE CHARACTERS IN NAME CDF 10 TAD I NAMPTR /LOOP IS STRANGE (SHOULD USE DEVICE WORD FOR CHECK) CDF 0 JMP NXTN1 NXTN2, ISZ NAMPTR /BUMP POINTER TO NEXT NAME IN AREA ISZ NAMPTR ISZ NXTNAM /BUMP RETURN ADDRESS FOR FOUND NAME JMP I NXTNAM NXTN3, TAD NAMCNT /CHECK FOR "HELP<CR>" OR "TTY:<<CR>"(MH) TAD (4 /IF 1ST TRY AT A NAME THEN NULL COMMAND WAS INPUT(MH) SZA!CLA JMP I NXTNAM /WASN'T NULL -- RETURN, END OF NAMES DCA NAME /WAS NULL -- CLEAR OUT NAME BUFFER DCA NAME+1 DCA NAME+2 DCA NAME+3 DCA NAME+4 DCA NAME+5 JMP NXTN2 /PREPARE TO RETURN(MH) SIXTO8, 0 /CONVERT 6BIT TO 8BIT AND (77 SNA /SNA IF NOT A NULL JMP I SIXTO8 /ELSE RETURN 8BIT NULL TAD (240 AND (77 TAD (240 JMP I SIXTO8 / PRINT ALL THE STUFF BETWEEN LINES OF THE OUTPUT DEVICE / THIS CONTINUES UNTIL A <LF>& IS SEEN OR AND OF FILE IS READ PRINT, 0 ISZ WASHLP /SET FLAG SAYING HE WAS HELPED PRINT3, JMS I [GCH /FIND 1ST LF WITHOUT FOLLOWING &, THEN PRINT(MH) TAD (-212 /WAS CHAR LF?(MH) SZA!CLA /(MH) JMP PRINT3 /NO -- READ NEXT CHAR(MH) JMS I [GCH /YES -- LOOK FOR &(MH) TAD (-"& /(MH) SNA!CLA /(MH) JMP PRINT3 /IT WAS & SO CONTINUE(MH) JMS I (OUTSTR /IT WASN'T & SO BEGIN PRINTING(MH) CRLF-1 TAD CHAR /(MH) SKP /(MH) PRINT1, JMS I [GCH /GET A CHARACTER JMS I [PCH /PRINT THE CHARACTER TAD CHAR /CHECK FOR <LF> TAD (-212 SZA CLA JMP PRINT1 JMS I [GCH /TRY FOR EITHER & OR END OF FILE OR FF TAD (-"& /CHECK FOR A & SNA JMP I PRINT /STOP ON <LF> & FOUND TAD (+32 /CHECK FOR <FF> ("&-"<FF> (MH) SNA /(MH) JMP I PRINT /(MH) TAD (-16 /-<EOT>+<FF> (MH) SNA JMP I PRINT /RETURN IF END OF FILE TAD (232-"@ SNA CLA JMP PRINT1 /SKIP "@" IF 1ST CHAR ON LINE TAD CHAR /GET THE CHARACTER BACK TO PRINT JMS I [PCH /PRINT IT JMP PRINT1 PAGE / TYPE A MESSAGE ON THE TELETYPE / THE MESSAGE IS ONE CHARACTER PER WORD, TERMINATED WITH A ZERO TYPE, 0 TAD I TYPE /GET THE MESSAGE ADDRESS ISZ TYPE /BUMP RETURN ADDRESS DCA XR1 TYPE1, TAD I XR1 /GET A CHARACTER SNA JMP I TYPE /END OF THE MESSAGE TLS /PRINT THE CHARACTER TYPE2, TSF JMP TYPE2 CLA JMP TYPE1 /LOOP /PRINT THE NEXT NAME ON THE OUTPUT DEVICE AND CHECK TO SEE IF / A CRLF IS NEEDED. EACH NAME IS TERMINATED WITH A TAB CHAR NAMLST, 0 TAD TXTNAM /CHECK FOR NULL NAME (MH) SZA!CLA /(MH) JMP NAMLS1 /NOT NULL NAME (MH) JMS OUTSTR /WAS NULL -- PRINT "<NONE>" (MH) NULNAM-1 /(MH) JMP NAMLS2 /PROCEED (MH) NAMLS1, JMS OUTSTR /PRINT THE NAME ON THE DEVICE TXTNAM-1 NAMLS2, JMS OUTSTR /PRINT A TAB AFTER NAME TAB-1 ISZ LINCNT /BUMP NUMBER PRINTED SO FAR JMP I NAMLST /NO YET, JUST RETURN TAD LINMAX /RESET TO MAX NUMBER OF NAMES PER LINE DCA LINCNT JMS OUTSTR /TYPE CRLF CRLF-1 JMP I NAMLST /NOW RETURN / PRINT A STRING ON THE OUTPUT DEVICE BY STUFFING THE CHARACTERS / IN THE OUTPUT FILE. THE ADDRESS-1 IS FOLLOWING THE JMS OUTSTR, 0 TAD I OUTSTR /GET THE ADDRESS ISZ OUTSTR DCA XR1 /POINTER TO NAME OUTS1, TAD I XR1 /GET A CHARACTER SNA JMP I OUTSTR /RETURN IF DONE JMS I [PCH /PRINT THE CHARACTER JMP OUTS1 PAGE / GET A CHARACTER FROM THE INPUT FILE GCH, 0 TAD CHAR /RETURN A EOF IF THE LAST WAS EOF TAD (-232 SZA CLA JMP I GIVCH /NOT EOF, GET NEXT CHARACTER TAD (232 /GET END OF FILE JMP I GCH GIVCH, INITBF /INITIALLY SET UP BUFFERS AND (377 /MASK THE CHARACTER DCA CHAR /SAVE CHARACTER TAD CHAR JMP I GCH /RETURN INITBF, TAD (-2000 /SET WORD COUNT FOR BLOCK(MH) DCA WDCTR TAD BUFAD DCA CHPTR /CHARACTER POINTER FOR BUFFER TAD I (BLKBGN /FIND OUT IF DATA TRANSFER WILL(MH) CMA!IAC /PASS END OF FILE, IF SO REDUCE(MH) TAD I (FSIZE /SIZE OF TRANSFER.(MH) DCA TEMP /SAVE -ST. BLK.-FILE SIZE(MH) TAD RDFCT /GET TRANSFER LENGTH IN BLKS(MH) CLL!RTL /(MH) RTL /(MH) RTL /(MH) TAD BLK /ADD CURRENT BLK(MH) TAD TEMP /SUBTRACT (ST. BLK OF FILE + SIZE)(MH) SPA!SNA /(MH) JMP INITOK /PROCEED -- DON"T CHG. TRANSFER LEN(MH) CLL!RTR /CHANGE TRANSFER LENGTH SO IT WON'T(MH) RTR /PASS END OF FILE(MH) RTR /(MH) CMA!IAC /(MH) TAD RDFCT /(MH) DCA RDFCT /ENTER THIS INTO FUNCTION WD.(MH) INITOK, JMS I DEVHND /CALL THE HANDLER TO READ A BLOCK RDFCT, 2000 /8 BLOCKS(MH) BUFAD, BUFFER BLK, 0 /BLOCK NUMBER JMP RDERR /ERROR RETURN(MH) NXTCH, TAD I CHPTR JMS GIVCH TAD (7400 AND I CHPTR /GET THE HIGH ORDER PART DCA CHTEM ISZ CHPTR TAD I CHPTR JMS GIVCH TAD I CHPTR AND (7400 CLL RTR RTR TAD CHTEM /GET OTHER HALF RTR RTR JMS GIVCH /GIVE THIRD CHARACTER OF GROUP ISZ CHPTR ISZ WDCTR /BUMP WORD COUNTER JMP NXTCH /LOOP TAD RDFCT /INCREMENT BLOCK NUMBER(MH) CLL!RTL /(MH) RTL /(MH) RTL /(MH) TAD BLK /(MH) DCA BLK /ENTER INTO FUNCTION WD(MH) JMP INITBF /READ IT IN PAGE / ROUTINE TO INITIALIZE ALL OF THIS STUFF / POINTERS GET SET AND THE FILES OPENED. INIT, 0 TAD (OUTHSP+1 DCA OUTHND TAD (OUTHSP+1 /HANDLER ADDRESS DCA OUTHN1 CDF 10 TAD I [7600 /GET OUTPUT DEVICE SNA JMP TTYDFL CIF 10 CDF 0 JMS I (USR /FETCH THE HANDLER FETCH OUTHN1, OUTHSP+1 JMP FETERR /ERROR RETURN(MH) TAD OUTHN1 /GET HANDLER ADDRESS JMP COMMON /COMMON CODE FOR BOTH FETCHES / DEFAULT TO THE TTY WHEN NO OUTPUT DEVICE IS SPECIFIED TTYDFL, TAD TTYNM /SET UP THE DEVICE NAME DCA TTY TAD TTYNM+1 DCA TTY+1 CIF 10 /FETCH THE OUTPUT HANDLERS CDF 0 JMS I (USR FETCH TTY, DEVICE TTY /DEFAULT TO THE TTY OUTHND, OUTHSP+1 /PLACE TO PUT THE HANDLER JMP NOTTY /IF TELETYPE HANDLER DOESNT EXIST TAD TTY+1 /SET UP DEVICE NUMBER FOR COMMON CODE CDF 10 DCA I [7600 CDF 0 TAD OUTHND /GET HANDLER ENTRY POINT COMMON, DCA OUTADR TAD (OUTBUF DCA I (OCPTR TAD (-200 /OUTPUT BUFFER COUNT DCA I (OUWDCT TAD (7600 DCA XR1 /COPY NAME FROM FIELD 1 CMD DEC AREA CDF 10 TAD I XR1 SNA TAD (1014 /HL.LS IS DEFAULT NAME IF NONE THERE DCA FILNAM TAD I XR1 DCA FILNAM+1 TAD I XR1 DCA FILNAM+2 TAD I XR1 /COPY EXTENSION SNA TAD (1423 /USE .LS AS DEFAULT EXTENSION DCA FILNAM+3 CDF 0 TAD (FILNAM /INITIALIZE THE ENTER DCA BLKSRT CDF CIF 10 TAD I (7600 CDF 0 JMS I (USR /DO ENTER WITH DEVICE NO IN AC ENTER BLKSRT, 0 /STARTING BLOCK FILLNG, 0 /LENGTH OF FILE JMP NOROOM /DEVICE FULL TAD BLKSRT DCA I [OUTBLK /INITIAL OUTPUT BLOCK TAD FILLNG DCA BLKCNT /NEGATIVE FILE LENGTH IN BLOCKS TAD (7605 /SET NXTNAM POINTER TO THE NEXT NAME DCA NAMPTR TAD (-5 DCA NAMCNT /NUMBER OF CHARACTERS IN NAME CIF 10 JMS I (USR /FETCH THE SYSTEM DEVICE HANDLER FETCH / TO GET THE DEVICE NUMBER TO LOOKUP HELP FILE DEVNAM, DEVICE SYS /(MH) DEVH, 0 /HANDLER ADDRESS FOR READING JMP FETERR /FETCH ERROR(MH) TAD DEVNAM+1 /GET THE SYS DEVICE NUMBER CIF 10 /LOOKUP HELP FILE WITH IT JMS I (USR LOOKUP BLKBGN, HELP8 /STARTING BLOCK OF THE FILE(MH) FSIZE, 0 /-NUMBER OF BLOCKS(MH) JMP NOSCRP /THE SCRIPT FILE (HELP FILE) ISNT THERE TAD DEVH DCA DEVHND /COPY TO PG 0 FOR ADDRESSABILITY JMP I INIT /THATS IT NOSCRP, JMS I (TYPE /TYPE MESSAGE SAYING HELP FILE NOT THERE NOSC-1 JMP I (7605 /RETURN TO NONITOR NOTTY, JMS I (TYPE TTYMIS-1 JMP I (7605 TTYNM, DEVICE TTY NOROOM, JMS I [TYPE /DEVICE FILL DEVFUL-1 JMP I (7605 /RETURN TO MONITOR PAGE / RESET THE INPUT FILE TO THE FIRST BLOCK AND RESET ALL THE CHARACTER / UNPACKING STUFF TO THE 1ST CHARACTER OF THE FILE RESET, 0 TAD I (BUFFER /RESET BUFFER POINTER TO START DCA CHPTR DCA WASHLP /SET NOT YET HELPED DCA CHAR /SET TO STOP EOF STUFF TAD (-2000 /RESET WORD COUNT FOR 8 BLOCKS(MH) DCA WDCTR TAD I (BLKBGN /RESET STARTING BLOCK OF FILE DCA I (BLK TAD (2000 /RESET TRANSFER LEN FOR 8 BLOCKS(MH) DCA I (RDFCT /(MH) TAD (INITBF /SET UP TO REREAD BLOCK 0 OF FILE DCA I (GIVCH JMP I RESET / PUT A CHARACTER OUT TO THE OUTPUT DEVICE / THIS IS A COOROUTINE TYPE GUY JUST LIKE THE INPUT HANDLER PCH, 0 JMP I RPOS /DISPATCH RPOS1, DCA I OCPTR /PUT 1ST CHARACTER IN BUFFER JMS RPOS RPOS2, DCA HOLD /SAVE THE 2ND CHARACTER JMS RPOS RPOS3, RTL /PACK THE CHARACTERS RTL DCA HOLD2 TAD HOLD2 AND (7400 TAD I OCPTR DCA I OCPTR /PART WAY DONE ISZ OCPTR TAD HOLD2 RTL RTL AND (7400 /NOW THE 2ND WORD TAD HOLD DCA I OCPTR ISZ OCPTR /BUMP POINTER AGAIN ISZ OUWDCT SKP JMS DUMP /IF AT THE END OF THE BUFFER RPOS4, JMS RPOS JMP RPOS1 RPOS, RPOS1 /INITIALLY SET TO THE 1ST CHARACTER JMP I PCH /RETURN TO THE USER OUWDCT, 0 /OUTPUT BUFFER WORD COUNTER OCPTR, 0 /OUTPUT CHARACTER BUFFER POINTER HOLD, 0 /TEMPORARY PLACE TO PUT A CHARACACTER HOLD2, 0 /SAME AS ABOVE / DUMP THE OUTPUT BUFFER TO THE OUTPUT FILE DUMP, 0 ISZ BLKCNT /SEE IF ANY ROOM LEFT TO DUMP TO SKP JMP DUMPER /IF OUT OF ROOM JMS I OUTADR /CALL THE HANDLER 4200 OUTBFA, OUTBUF /OUTPUT BUFFER ADDRESS OUTBLK, 0 /OUTPUT BUFFER BLOCK NUMBER JMP WRERR /WRITE ERROR(MH) TAD OUTBFA /RESET INPUT POINTER DCA OCPTR TAD (-200 /RESET THE WORD COUNT DCA OUWDCT ISZ OUTBLK /BUMP OUTPUT BLOCK NUMBER JMP I DUMP /RETURN DUMPER, JMS I (TYPE /TYPE ERROR MESSAGE DEVFUL-1 /FILE FULL ERROR JMP I (7605 WRERR, JMS I (TYPE /WRITE ERROR (MH) MWRERR-1 /(MH) JMP I (7605 /(MH) FETERR, JMS I (TYPE /FETCH ERROR (MH) MFEERR-1 /(MH) JMP I (7605 /(MH) RDERR, JMS I (TYPE /(READ ERROR (MH) MRDERR-1 /(MH) JMP I (7605 /(MH) MWRERR, "W; "R; "I; "T; "E; 240; "E; "R; "R; 215; 212; 0 MFEERR, "F; "E; "T; "C; "H; 240; "E; "R; "R; 215; 212; 0 MRDERR, "R; "E; "A; "D; 240; "E; "R; "R; 215; 212; 0 PAGE TTYMIS, "N;"O;" ;"T;"T;"Y;" ;"H;"A;"N;"D;215;212;0 NOSC, "N;"O;" ;"H;"E;"L;"P; 240; "F; "I; "L; "E; 215;212;0 NULNAM, 242; "N; "O; "N; "E; 242; 0 AVAIL, " ; "H; "E; "L; "P; ".; "S; "V; 215; 212 240; 215; 212 "C; "A; "L; "L; "I; "N; "G; 240; "C; "O; "M; "M; "A; "N; "D; "S; ": 215; 212; ".; "H; "E; "L; "P; 240; "P; "A; "R; "A; "M; "E; "T; "E; "R 215; 212 240; 215; 212 "P; "A; "R; "A; "M; "E; "T; "E; "R; "S; ":; 215; 212; 0 CRLF, 215;212;0 TAB, 211;0 SORRY, 215;212;"N;"O;240;"H;"E;"L;"P;240;"-;240;0 DEVFUL, "D;"E;"V;"I;"C;"E;240;"F;"U;"L;"L;215;212;0 HELP8, FILENAME HELP.HL VERS, 0201 /VERSION 2A (MH) PAGE OUTHSP, ZBLOCK 400 /OUTPUT HANDLER SPACE OUTBUF, ZBLOCK 400 /OUTPUT BUFFER FOR LISTING BUFFER=. /INPUT BUFFER FOR HELP FILE, 8 BLKS OR 4000 WDS (MH) $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 | /7 OS/8 MCPIP MAGTAPE AND CASSETTE PIP / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / S.R. / REVISED FEB. 11, 1974 / SECOND REVISION: 7-AUG-75 /1. INSTALLED PATCH SEQ #1 , SEPT. 1974 DSN / (NOW TRANSFERS LAST 2 BYTES CORRECTLY IN IMAGE MODE) /2. BUMPED VERSION NUMBER TO V5 /3. FIXED /L BUG IF DEVICE NOT MAGTAPE OR CASSETTE / / 12-DEC-2018 LHN - installed DSN date patch 21.21.1 M / KCLR=6700 /CLEAR ALL /CLEAR STATUS A AND B REGISTERS. KSDR=6701 /SKIP ON DATA FLAG KSEN=6702 /SKIP ON ERROR KSBF=6703 /SKIP ON READY FLAG KLSA=6704 /LOAD STATUS A FROM AC 4-11 /CLEAR AC, THEN /LOAD 8 BIT COMPLEMENT OF STATUS A /BACK INTO AC KSAF=6705 /SKIP ON ANY FLAG OR ERROR KGOA=6706 /ASSERT THE CONTENTS OF STATUS A, /TRANSFER DATA IF READ OR WRITE KRSB=6707 /READ STATUS B INTO AC 4-11 FIXMRI CALL=4400 FIXMRI EXIT=5400 FIXMRI INCR=2000 /CORE ALLOCATION /00000-01777 COMMAND DECODER /02000-02377 OUTPUT HANDLER /02400-02777 INPUT HANDLER /03000-03777 CASSETTE OUTPUT BUFFER /04000-04777 CASSETTE INPUT BUFFER /05000-05577 STAND ALONE CASSETTE HANDLER /05600-07577 LOOKUP, ENTER, CLOSE /07600-07777 OS/8 /10000-11777 USR /12000-14577 PIPC /14600-17577 OS/8 INPUT/OUTPUT BUFFER /17600-17777 OS/8 /USR HAS THE FOLLOWING FREE LOCATIONS: /0-6 /10-17 (BUT GET DESTROYED) /20-37 TEMP=20 TEMP1=21 TEMP2=22 TEMP3=23 / STARTING ADDRESS = 12000 / JOB STATUS WORD = 6003 INHAND=2400 OUTHAND=2000 COBUF=3000 CIBUF=4000 PIPVERSION=6 PATCHLEV=77&"B SPCODE=6 CLCODE=0 REWCOD=1 FICODE=3 EOCODE=5 RECCOD=2 /V3 CHANGES: /1. SHRUNK 0S/8 BUFFER TO 3000 WORDS /2. ADDED VERSION NUMBER (/V) /3. MADE INDEPENDENT OF MAGIC LOCATIONS IN CASSETTE HANDLER /4. ADDED MAGTAPE SUPPORT OF CASSETTE FILE STRUCTURE /5. ALTMODE MEANS RETURN TO KBM /6. ^C DOESN'T CLOSE CASSETTES UNLESS WE ALREADY WROTE ON IT /7. FIXED BUG THAT CSA2 THRU CSA7 DIDN'T WORK /8. CR ALONE TO CD GIVES NO ERROR MESSAGE /9. ADDED ^O AND ^C SUPPORT TO MESSAGE PRINTOUT /10. GIVE ERRORS ON ILLEGAL * OR ? IN NAME /11. USES TTY: AS DEFAULT OUTPUT DEVICE ON /L /PROPOSED: /8. ALLOW *.* FOR CASSETTE INPUT /9. SUPPORT OF UNLABELED MAGTAPE STANDARD /10. /7 OR /9 SPECIFIES CHANNEL /FIXES SINCE FIELD TEST : /1. ^C ALWAYS BRINGS YOU BACK TO KBM /2. FIXED BUG RE CHECK FOR FILE FULL /3. MADE COMPATIBLE WITH NEW TM8E HANDLER /4. TIME-OUT ON CASSETTE READ /5. BE NICE-GUY IF OS/8 LOOKUP FAILURE /THIS ROUTINE LEAVES WITH INTERRUPTS OFF AND DEVICE SELECTED /AND READY. /THE NEW UNIT NUMBER (0-7) IS IN THE AC. /THE UNIT NUMBER IS IN BITS 8-11 OF THE AC. /RETURN 1 IS MADE IF THE UNIT IS NOT READY. /CINUSE IS SET TO 1. /THE HANDLER MUST NOT ALREADY BE IN USE. /THE DATA FIELD IS INTERROGATED /AND A RETURN CIF CDF IS BUILT /AND STORED IN LOCATION RETCIF *5000 FIXDVC, 0 DCA DVC RDF TAD (CIF CDF CDF 0 DCA TMP TAD I FIXDVC DCA ERRET ISZ FIXDVC TAD TMP DCA I ERRET TAD DVC SNA JMP CHECKR RAR /MOVE UNIT TO LINK; DEVICE TO AC AND (3 /MASK OFF DEVICE CODE DCA DVC /SAVE DEVICE CODE SZL TAD (100 DCA I (ABUNIT /SET UNIT IN BIT 5 TAD DVC CLL RTL RAL /UGLY DCA DVC /MOVE TO BITS 6-8 TAD (IOTBL DCA IOTPTR IOTLOOP,TAD I IOTPTR SNA /END OF TABLE? JMP CHECKR /YES DCA TMP TAD I TMP AND (7707 /MASK OUT OLD DVC TAD DVC /INSERT NEW ONE DCA I TMP /REPLACE ISZ IOTPTR /POINT TO NEXT ONE JMP IOTLOOP TMP, 0 DVC, 0 /DEVICE CODE IOTPTR, 0 CHECKR, JMS I (CLEAR TAD (200 JMS I (LOADA /SELECT DRIVE JMS I (CHECKB AND (7735 /IGNORE EOT/BOT FLAG /AND WLO TAD (-1 SZA CLA JMP I ERRET /NOT READY ISZ I (CINUSE JMP I FIXDVC ERRET, 0 /ERROR RETURN LOCATION FIDDLE, 0 CIF 10 JMS I (FID2 /NEED ROOM TAD (CIBUF+11 DCA 10 TAD FAST SZA CLA JMP DIREOL TAD (40 DCA I 10 TAD I (CIBUF+20 DCA I 10 TAD I (CIBUF+20 AND (177 SZA TAD (-40 SZA CLA TAD ("/-40 TAD (40 DCA SLSH TAD I (CIBUF+21 DCA I 10 TAD SLSH DCA I 10 INCR 10 INCR 10 TAD SLSH DCA I 10 TAD I (CIBUF+22 DCA I 10 TAD I (CIBUF+23 DCA I 10 DIREOL, TAD (15 DCA I 10 TAD (12 DCA I 10 TAD (32 DCA I 10 FIDLV, EXIT FIDDLE /0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 /F I L E N A M E S D D M M Y Y /F I L E N A . M E S M M / D D / Y Y CR LF ^Z FAST, 0 /0 MEANS F NOT SPECIFIED SLSH, "/ IOTBL, IOT0 IOT1 IOT4 IOT5 IOT6 IOT6C IOT7 0 PAGE UTIL, 0 DCA TEMPU DCA REWSW /ZERO REWIND SWITCH TAD I UTIL TAD (-10 SNA ISZ REWSW ISZ UTIL TAD (210 DCA TEMPFN TAD TEMPU JMS I (FIXDVC /FIX DEVICE CODE UTEND /UNIT NOT READY TAD (UT DCA CRET /SET RETURN ADDRESS STA DCA I (RW /NOTE FACT THAT OP AINT READ TAD TEMPFN JMS I (LOADA JMS GO /INITIATE UTIL JMP CRET+1 ISZ UTIL UTEND, HLT JMP I UTIL UT, JMS CHECKB /LOOK AT STATUS B AND (50 /CHECK FOR CL, EMPTY, OR WLO /GIVE NO ERROR ON WLO ************ /BAD FOR WRGAP SNA JMP OK /NO ERRORS TAD (-40 SZA CLA JMP NOTOK /ERROR NOT CL TAD REWSW SNA CLA /CL OK IF DID REWIND NOTOK, STA OK, JMS CLEAR TAD CINUSE SMA CLA JMP UTEND-1 TAD BSTATE /ERROR JMP UTEND TEMPU, 0 TEMPFN, 0 REWSW, 0 /1 MEANS OPERATION IS REWIND CHECKB, 0 IOT7, KRSB /READ STATUS B INTO AC 4-11 DCA BSTATE /SAVE STATUS B TAD BSTATE JMP I CHECKB CLEAR, 0 DCA CINUSE /LEAVE STATUS CONDITION IN AC; -1 MEANS ERROR IOT0, KCLR /CLEAR STATUS A AND B JMP I CLEAR GO, 0 IOT6, KGOA /ASSERT CONTENTS OF STATUS A CLA JMP I GO CHK, 0 JMS I (CHECKB AND (374 IOT1, KSDR SKP /DATA FLAG NOT UP - JMP I CHK TAD (-20 SNA CLA /IS IT END OF FILE? JMP I (ERRR /YES, ERROR - BUT DON'T RETRY TAD BSTATE JMP I CHK CINUSE, 0 /1 MEANS HANDLER IN USE BSTATE, 0 /STATUS OF REGISTER B ON ERROR DTEM, 0 DOPTION,JMS I (CONVRT 7601 DCA DTEM TAD I (OUNIT JMS I (LOOKUP JMP I (XER4 JMP MBNF /NOT FOUND INCR DTEM JMS I (DELET JMP I (XER77 /OUTPUT ERROR MBNF, TAD DTEM SNA CLA /ANYTHING DELETED? JMP I (XER24 /NO JMS UTIL REWIND CLA CIF CDF 10 /YES JMP I (DECODE CRET, 0 CDF 0 TAD (-200 /COUNT OF HOW LONG TO WAIT DCA I (OUTER IOL, JMS I (CTRLC JMS I (TIMEOUT IOT5, KSAF JMP IOL EXIT CRET PAGE HANDLER,0 DCA TUN TAD I HANDLER /GET FUNCTION CONTROL WORD AND L70 /ISOLATE FIELD OF BUFFER TAD LCDF DCA WCDF TAD I HANDLER /RETRIEVE FUNCTION CONTROL WORD RAL /READ/WRITE BIT TO LINK CLA RAL DCA RW /RW=1 IF WRITE ISZ HANDLER /POINT TO BUFFER ADDRESS TAD I HANDLER /GET BUFFER ADDRESS DCA BUFFER /SAVE IT ISZ HANDLER /POINT TO ERROR RETURN TAD TUN JMS I (FIXDVC LV /NOT READY TAD WCDF DCA BFIELD TAD WCDF DCA BFLD STA CLL RTL /TAD (-3 DCA ERKNT JMS SETUP /SET UP READ OR WRITE JMP I (CRET+1 ISZ HANDLER /POINT TO GOOD RETURN LV, HLT JMP I HANDLER RW, 0 /1 IF WRITE (-1 IF UTIL) ERKNT, -3 SETUP, 0 TAD RW TAD (WRITEX DCA I (CRET /SET RETURN ADDRESS TAD BUFFER DCA BPTR TAD BSIZE CMA /WANT TO READ ONE MORE TAD RW DCA BKNT TAD RW DCA OUTSW TAD RW CLL RTL RTL /WRITE FN CODE=20 TAD (200 /SELECT AND INTERRUPT ENABLE JMS I (LOADA WCDF, HLT TAD RW SZA CLA TAD I BPTR LCDF, CDF 0 JMS I (GO JMP I SETUP READX, JMS I (CHK AND L374 SZA JMP ERRX IOT6C, KGOA /GET CHAR JUST READ DCA BYTE ISZ BKNT SKP JMP RWCRC BMODE, TAD BYTE TUN, BFLD, HLT DCA I BPTR ISZ BPTR L374, 374 JMP I (CRET+1 /CRET ALREADY SET UP BSIZE, 200 OUTSW, 0 /1 MEANS WE BEGAN TO WRITE RWCRC, TAD (260 /ENABLE, ENABLE INTER, READ CRC JMS I (LOADA JMS I (GO JMS I (CRET JMS I (CHK CRCMN, JMS I (GO JMS I (CRET JMS I (CHECKB AND (7775 /IGNORE WLO TAD (-1 ERRX, SNA CLA /ERRORS? JMP ERRR+1 /NO - CLEAN BILL OF HEALTH ISZ ERKNT /TRY 3 TIMES JMP I (ERRCOV /RETRY ERRR, STA /ERROR WHILE READING CRC JMS I (CLEAR TAD I (CINUSE SMA CLA JMP LV-1 TAD I (BSTATE JMP LV WRITEX, JMP READX JMS I (CHK SZA JMP ERRX ISZ BKNT SKP JMP WCRC BFIELD, HLT ISZ BPTR L70, 70 TAD I BPTR JMS I (GO JMP I (CRET+1 WCRC, TAD (260 JMS I (LOADA JMP CRCMN BKNT, 0 /NUMBER OF CHARS EXPECTED BPTR, 0 /NEXT LOCATION IN BUFFER TO STORE INTO BYTE, 0 /TEMPORARILY HOLDS BYTE FOUND BUFFER, 0 PAGE / LOOKUP, ETC. F1=10 READ=0 WRITE=4000 REWIND=10 BACKFIL=30 WRGAP=40 BACKBLOCK=50 SKPFIL=70 HSIZE=40 OBUFFER=4600 /LOCATION OF OS/8 I/O BUFFER BINBUF=OBUFFER OBUFLEN=3000 HOBUFLEN=OBUFLEN%2 MAXBLK=OBUFLEN%400 FILNUM, 0 / ENTER / TAD UNIT / JMS I (ENTER / <ERROR RETURN> / <NORMAL RETURN> / ENTER FILENAME AS SPECIFIED IN SINCH / USER MUST SET SINCH BUT ONLY FIRST 25 (OCTAL) LOCATIONS. ENTER, 0 JMS I (LOOKUP JMP ERET /ERROR WHILE READING JMP NTF JMS I (DELET JMP ERET /ERROR WHILE DELETING NTF, JMS BACK JMP ERET /ERROR BACKING UP JMS I QH1 /WRITE NEW HEADER WRITE SINCH JMP ERET /CASSETTE NOT READY TAD I (RECSIZ DCA I (BSIZE INCR ENTER ERET, EXIT ENTER RDOR, 0 AND (374 /CASSETTE ONLY TAD (-200 SZA CLA /WAS ERROR JUST CRC? EXIT BACK /NO EXIT RDOR /YES, OK CONTINUE BACK, 0 BK4, JMS I QU1 BK2, BACKFIL /GO BACK TO FILE GAP EXIT BACK BK3, JMS I QU1 BACKBLOCK /BACK TO LAST RECORD JMP BKERR TAD I (RECSIZ DCA I (BSIZE JMS I QH1 /READ LAST RECORD OF PREV FILE READ+F1 /DON'T STORE IN BUFFER BINBUF JMS RDOR /^******* /ERROR READING LAST BLOCK NEWGAP, JMS I QU1 WRGAP /WRITE A NEW GAP EXIT BACK BK9, TAD (HSIZE DCA I (BSIZE INCR BACK EXIT BACK BKERR, AND (3775 /CASSETTES ONLY TAD (-41 SZA CLA /WAS ERROR CLEAR LEADER? EXIT BACK JMP NEWGAP BK1, JMP BK9 /FOR MAGTAPES: /BK2_BACKBLOCK /BK3_BK1 CLOSE, 0 JMS I QU1 WRGAP JMP CLRET /ERROR WHILE WRITING GAP TAD (HSIZE DCA I (BSIZE JMS I QH1 WRITE /WRITE SENTINEL ZER JMP CLRET JMS I QU1 REWIND JMP CLRET INCR CLOSE /SKIP ERROR RETURN CLRET, EXIT CLOSE CRED, 0 TAD I (INRECSZ DCA I (BSIZE TAD I (IUNIT JMS I QH1 READ CIBUF JMP INER TAD (CIBUF DCA I (CIPTR TAD I (INRECSZ CIA DCA I (CIKNT / CLA IAC / DCA DATAFLG EXIT CRED INER, AND EOFBIT SZA CLA /REAL ERROR? JMP I (XER4 /YES / TAD DATAFLG / SNA CLA /READ ANY DATA? / JMP INTO /NO REWIND / DCA DATAFLG /YES, COULD CLOSE OUTPUT AND OPEN NEXT INPUT INTO, CLA TAD I (IUNIT JMS I QU1 REWIND CLA TAD I (BIPTR CIF CDF 10 /NO, MERELY END-OF-FILE TAD (-OBUFFER+377 CLL RTL RTL RAL AND (17 DCA I (INTEN /NUMBER OF BLOCKS GOT JMP I (XFIN LOADA, 0 TAD ABUNIT IOT4, KLSA CLA JMP I LOADA EOFBIT, 254 /CHANGED TO 3673 FOR MAGTAPE /DATAFLG,0 /1 MEANS READ DATA QU1, UTIL QH1, HANDLER ABUNIT, 0 PAGE / LOOKUP / TAD UNIT / JMS I (LOOKUP / I/O ERROR RETURN / <NOT FOUND RETURN> / <FOUND RETURN> / ALWAYS LOOKS FOR THING SPECIFIED IN SINCH LOOKUP, 0 DCA P1 CDF 10 TAD I (7644 CDF 0 AND (10 /IS /U SPECIFIED? SZA CLA JMP GOODRT /YES, DO NOTHING TAD P1 JMS I QU2 REWIND JMP ERRIT TAD (HSIZE /SET LENGTH OF RECORD HEADER DCA I (BSIZE DCA I (FILNUM FL1, JMP FL2 /ZERO THIS LOCATION FOR MAGTAPES FLOOP, JMS I QU2 SKPFIL JMP ERRIT FL2, INCR I (FILNUM JMS I QH2 READ INCH JMP ERRIT TAD (INCH DCA P1 TAD I P1 SNA CLA /SENTINEL FILE? JMP NFNDRET /YES, NOT FOUND TAD (SINCH /NO, IS THIS THE ONE WANTED? DCA P2 TAD (-10 DCA SCNT SLOOP, TAD I P1 CIA TAD I P2 AND (177 /ONLY LAST 7 BITS NEED MATCH SZA CLA JMP FLOOP /FILE KEY NOT ONE DESIRED INCR P1 INCR P2 ISZ SCNT JMP SLOOP GOODRT, INCR LOOKUP /SKIP NOT FOUND RETURN NFNDRET,INCR LOOKUP /SKIP ERROR RETURN ERRIT, CLA TAD I (RECSIZ DCA I (BSIZE /BE NICE TO USER LRET, EXIT LOOKUP /BYE-BYE ERRT, AND EOTBIT /REAL ERROR? SZA CLA JMP ERRIT /YES JMP NFNDRET /NO, MERELY END-OF CASSETTE /END OF CASSETTD IS SIGNALLED BY /A SENTINEL FILE /B DOUBLE FILE GAP /C EOT EOTBIT, 314 /CHANGE TO 3663 FOR MAGTAPE P1, 0 P2, 0 SCNT, 0 DELET, 0 JMS I (BACK EXIT DELET JMS I QH2 /WRITE EMPTY HEADER WRITE+10 EMPTINCH EXIT DELET /ERROR WHILE DELETING CLL STA RAL /-2 TAD LOOKUP DCA LOOKUP JMP FLOOP /JUMP INTO LOOKUP TO CONTINUE ZER, 0 QH2, HANDLER QU2, UTIL FL3, JMP FL2 ERRCOV, JMS I (CLEAR JMS I (CTRLC TAD (250 JMS I (LOADA JMS I (GO /BACKSPACE BLOCK JMS I (CRET /WAIT JMS I (CHECKB AND (374 /KILL WRITE-LOCK BIT SZA CLA JMP I (ERRR JMS I (SETUP /RE-SET UP OPERATION JMP I (CRET+1 /GO AWAY TIMEOUT,0 ISZ INNER JMP I TIMEOUT ISZ OUTER JMP I TIMEOUT TAD I (RW / I/O HAS TAKEN A LOT OF TIME SZA CLA /IS IT A READ OP? JMP I TIMEOUT /NO, RETURN JMP I (ERRR /YES, ERROR INNER, 0 OUTER, -200 // DSN PATCH 21.21.1 M DSN13, 0 // TAD I DSN14 // RTR // RTR // AND DSN15 // JMP I DSN13 // DSN14, 7777 // DSN15, 0030 // PAGE /SEND CONTENTS OF OS/8 BUFFER TO CASSETTE /VIA CASSETTE OUTPUT BUFFER CWRITE, 0 TAD (OBUFFER DCA BUPTR /PT TO BEGIN OF BUFFER CDF 10 TAD I (INTEN /GET NO. OF BLOCKS READ SNA JMP CWLV CDF 0 CLL RTR RTR RAR /CONVERT TO WORDS IAC AND (7776 /ROUND UP TO EVEN NO. CLL RAR /DIVIDE BY TWO CIA /USE AS COUNT OF DOUBLE-WORDS DCA BUKNT /2000 TWO-WORD ENTRIES CWLOOP, CDF 10 TAD I BUPTR JMS CWR /SENT TO CASSETTE OUTPUT BUFFER CDF 10 TAD I BUPTR AND (7400 DCA TEMP1 INCR BUPTR /PT TO 2ND HALF TAD I BUPTR JMS CWR CDF 10 TAD I BUPTR AND (7400 CLL RTR RTR TAD TEMP1 RTR RTR JMS CWR INCR BUPTR /PT TO NEXT DOUBLE-WORD ISZ BUKNT /AT END OF BUFFER? JMP CWLOOP /NO CWLV, CIF CDF 10 EXIT CWRITE /YES, RETURN BUPTR, 0 /PTS INTO OBUUFER BUKNT, 0 /INSERT CHAR IN CASSETTE OUTPUT BUFFER /AND OUTPUT BUFFER IF BUFFER FULL CWR, 0 AND (377 CDF 0 DCA CWTMP TAD LDRFLG SZA CLA JMS I (LDRTST CDF 10 TAD I (7643 RTL /PUT /B OPTION IN LINK CDF 0 SNL CLA JMP GOK TAD CWTMP TAD M200 SNA CLA JMP I (PREFIN GOK, TAD CWTMP2 JMS CWR2 TAD CWTMP1 DCA CWTMP2 TAD CWTMP DCA CWTMP1 CWREX, EXIT CWR CWR2, 0 SPA JMP CWRIGN /IGNORE -1 CDF 0 DCA I COPTR /INSERT CHAR IN COBUF INCR COPTR ISZ COKNT /COBUF FULL? EXIT CWR2 /NO, SO RETURN JMS CWRI M200, CWRIGN, 7600 /CLA EXIT CWR2 CWRI, 0 TAD COKNT TAD RECSIZ SNA CLA EXIT CWRI /DO NOTHING IF BUFFER EMPTY TAD RECSIZ DCA I (BSIZE TAD I (OUNIT JMS I QH3 /YES, WRITE OUT BUFFER WRITE /WRITE FROM FIELD 0 PCOBUF, COBUF /LOCATION COBUF JMP XER7 /OUTPUT ERROR TAD PCOBUF DCA COPTR /BUFFER IS NOW EMPTY TAD RECSIZ CIA DCA COKNT EXIT CWRI RECSIZ, 0 /RECORD SIZE ON OUTPUT COPTR, COBUF /PTS TO NEXT FREE LOCATION IN COBUF COKNT, -1000 /NUMBER OF EMPTY SLOTS LEFT IN COBUF XER7, CIF CDF 10 AND (40 SZA CLA /CLEAR LEADER? JMP I (ER5 /YES, DEVICE FULL JMP I (ER7 /OUTPUT ERROR XER4, CIF CDF 10 JMP I (ER4 XER8, CIF CDF 10 JMP I (ER8 LDRFLG, 0 /NON-ZERO IF IGNORING LEADER CWTMP1, -1 CWTMP2, -1 CWTMP, 0 QH3, HANDLER PAGE PREFIN, TAD (200 JMS I (CWR2 /WRITE OUT TRAILER JMP CFIN2 /BUT NO CHECKSUM CFIN, TAD I (CWTMP2 /V3C JMS I (CWR2 TAD I (CWTMP1 /V3C JMS I (CWR2 CFIN2, JMS I (CWRI TAD I (OUNIT XCLOSE, JMS I (CLOSE JMP I (XER8 XLV, CIF CDF 10 JMP I (DECODE CTRTEM, CREAD, 0 TAD (OBUFFER DCA BIPTR TAD (-OBUFLEN DCA BIKNT ZRLUP, CDF 10 DCA I BIPTR /ZERO BUFFER CLA IAC AND I (7643 SZA CLA TAD (DCRE-CRE /GOT L OPTION TAD (CRE CDF 0 DCA XCRE /PT TO INPUT SUBR INCR BIPTR ISZ BIKNT JMP ZRLUP TAD (OBUFFER DCA BIPTR TAD (-HOBUFLEN DCA BIKNT /# OF DOUBLE-WORDS CRLOOP, JMS I XCRE CDF 10 DCA I BIPTR JMS I XCRE DCA TEMP2 JMS I XCRE DCA TEMP3 CDF 10 TAD TEMP3 RTL RTL AND (7400 TAD I BIPTR DCA I BIPTR INCR BIPTR TAD TEMP3 RTR RTR RAR AND (7400 TAD TEMP2 DCA I BIPTR INCR BIPTR ISZ BIKNT JMP CRLOOP /REITERATE CIF CDF 10 TAD (MAXBLK DCA I (INTEN /READ 10 BLOCKS EXIT CREAD /ALL DONE BIPTR, 0 /PTS INTO OBUFFER BIKNT, 0 XCRE, CRE CTRLC, 0 KSF EXIT CTRLC TAD (7600 KRS TAD (-7603 SZA CLA EXIT CTRLC JMS I (CLEAR TAD I (OUNIT SPA CLA JMP I (7600 TAD I (OUNIT DCA CTRTEM STA DCA I (OUNIT TAD CTRTEM JMS I (CLOSE JMP I (XER8 JMP I (7600 LOPTION,TAD I (IUNIT JMS I QU3 REWIND JMP I (INER CLA IAC DCA I (CIBUF LM1, JMP LM2 /ZERO FOR MAGTAPE JMS I QU3 SKPFIL JMP I (INER LM2, CIF CDF 10 JMP I (CHLOOP LM3, JMP LM2 QU3, UTIL PAGE CIKNT, -1 /ONE'S COMPLEMENT OF # OF BYTES LEFT IN CIBUF CIPTR, CIBUF /PTS TO NEXT BYTE IN CIBUF TO BE READ CRE, 0 CDF 0 TAD FTFLG /FIRST TIME THROUGH? SZA CLA JMP FT /YES TAD TLRFLG SNA CLA JMP EPI /TRAILER ISZ CIKNT SKP JMS I (CRED TAD I CIPTR JMS CHKSUM JMS CHKTLR TAD I CIPTR INCR CIPTR / AND (377 EXIT CRE /READ DIRECTORY DCRE, 0 CDF 0 ISZ CIKNT SKP JMS DCRED TAD I CIPTR TAD (-32 SNA JMP DCRE+1 /ALLOW '32' TO SHORTEN BUFFER TAD (32 SNA TAD (232 INCR CIPTR EXIT DCRE FT, DCA FTFLG TAD (200 /SEND LEADER EXIT CRE CHKSUM, 0 DCA CHTEM TAD CHTEM AND (200 SNA CLA TAD CHTEM TAD CHECKSUM DCA CHECKSUM EXIT CHKSUM CHTEM, 0 CHECKSUM,0 FTFLG, 1 /1 IF FIRST TIME HERE CHKPTR, CHKTBL TLRFLG, 0 CHKTBL, 0 /CHECKSUM LEFT PART 0 /CHECKSUM RIGHT PART 200 /TRAILER 32 /CTRL/Z -1 /TABLE END CHKTLR, 0 CDF 10 TAD I (7643 CDF 0 RTL /B SWITCH TO LINK SNL CLA EXIT CHKTLR TAD I CIPTR TAD (-200 SZA CLA EXIT CHKTLR DCA TLRFLG TAD (CHKTBL DCA CHKPTR TAD CHECKSUM RTR RTR RTR AND (77 DCA CHKTBL TAD CHECKSUM AND (77 DCA CHKTBL+1 EPI, TAD I CHKPTR SPA JMP I (INTO INCR CHKPTR EXIT CRE DCRED, 0 TAD (40 DCA I (BSIZE TAD I PCIBUF SNA CLA JMP I (INTO TAD I (IUNIT JMS I QH4 READ PCIBUF, CIBUF JMP I (INER TAD PCIBUF DCA CIPTR TAD I CIPTR SZA CLA TAD (-23 TAD (-2 DCA CIKNT JMS I (FIDDLE TAD I CIPTR SNA CLA EXIT DCRED JMS I QU4 SKPFIL JMP I (INER EXIT DCRED QH4, HANDLER QU4, UTIL /THIS WAS VERY UNOPTIMAL ADDING IN MAGTAPE SUPPORT /AFTER THE PROGRAM WAS ALL DONE AND BURIED. /IT COULD HAVE BEEN DONE IN A MUCH BETTER METHOD /IF IT WAS DESIGNED IN BEFORE THE PROGRAM WAS WRITTEN. PAGE /FIRST ARG: PTS TO OS/8 FILENAME IN FIELD 1 CONVRT, 0 STA TAD I CONVRT DCA ONPTR INCR CONVRT TAD (SINCH DCA CNPTR TAD (-4 DCA CKNT CONLUP, CDF 10 INCR ONPTR TAD I ONPTR CDF 0 RTR RTR RTR JMS CNV DCA I CNPTR INCR CNPTR CDF 10 TAD I ONPTR CDF 0 JMS CNV DCA I CNPTR INCR CNPTR ISZ CKNT JMP CONLUP TAD (40 DCA I CNPTR CDF 10 TAD I (7643 CDF 0 RTL SNL CLA EXIT CONVRT / NOT /B CDF 10 TAD I (7643 RAL CLA TAD I ONPTR CDF 0 SZA CLA EXIT CONVRT /EXTENSION SPECIFIED SZL EXIT CONVRT / /A CLL STA RAL TAD CNPTR DCA CNPTR TAD ("B /SET EXTENSION TO .BIN DCA I CNPTR INCR CNPTR TAD ("I DCA I CNPTR INCR CNPTR TAD ("N DCA I CNPTR EXIT CONVRT CNV, 0 AND (77 SZA /CHANGE 0 TO BLANK TAD (40 AND (77 TAD (40 EXIT CNV ONPTR, 0 CNPTR, 0 CKNT, 0 LOOK4ME,JMS CONVRT 7606 TAD IUNIT JMS I (LOOKUP JMP I (XER4 JMP XER24 TAD I (INCH+12 /GET H.O. INPUT RECORD SIZE CLL RTR RTR RAR TAD I (INCH+13 DCA INRECSZ TAD INRECSZ SNA JMP XER40 /RECORD SIZE 0 CLL TAD (-1001 SZL CLA JMP XER10 CIF CDF 10 JMP I (CHLOOP XER24, CIF CDF 10 JMP I (ER24 XER25, CIF CDF 10 JMP I (ER3 OUNIT, 0 IUNIT, 0 /IN CASE OF CASSETTES, CONTAINS UNIT (AS CHAR) /IN CASE OF MAGTAPE, CONTAINS HANDLER ENTRY ADDRESS /OUNIT IS -1 DURING A ^C CLOSE /-1 MEANS DON'T CLOSE ON ERROR INRECSZ,200 /RECORD SIZE ON INPUT XER40, CIF CDF 10 JMP I (ER40 XER10, CIF CDF 10 JMP I (ER10 F1CTRLC,0 JMS I (CTRLC CIF CDF 10 EXIT F1CTRLC PAGE SINCH, ZBLOCK 16 40;40;40;40;40;40 ZBLOCK 14 INCH, ZBLOCK 40 LDRTST, 0 TAD I (CWTMP TAD (-200 SNA CLA /LEADER? JMP I (CWREX /YES, EXIT CWR DCA I (LDRFLG /NO EXIT LDRTST ENTERO, TAD (COBUF DCA I (COPTR JMS I (CONVRT 7601 JMS I (MAKDAT TAD I (RECSIZ CLL RTL RTL RAL AND (17 DCA I (SINCH+12 TAD I (RECSIZ AND (377 DCA I (SINCH+13 CDF 10 TAD I (FILTYP CDF 0 DCA I (SINCH+11 DCA I (SINCH+14 DCA I (SINCH+15 CDF 10 TAD I (VRSNO CDF 0 DCA I (SINCH+24 TAD I (OUNIT JMS I (ENTER JMP I (XER25 CIF CDF 10 DCA I (OSWITCH JMP I (CONT1 PAGE ZOPTION,TAD I (OUNIT JMS I QU5 REWIND JMP XER77 /OUTPUT ERROR CDF 10 TAD I (7601 CDF 0 SNA CLA JMP NOFILE JMS I (CONVRT 7601 JMS I (LOOKUP JMP I (XER4 JMP I (XER24 JMS I QU5 SKPFIL JMP I (XER24 TAD (40 DCA I (BSIZE JMS I QH5 READ INCH JMP XER77 CLO3, JMS I (BACK JMP XER77 JMS I QH5 WRITE ZER JMP XER77 NOFILE, JMP I (XCLOSE MAKDAT, 0 CDF 10 TAD I (DATE CDF 0 SNA JMP SETOBL DCA SKNT TAD (SINCH+16 DCA SPTR TAD SKNT RTR RAR AND (37 JMS TWO /INSERT DAY TAD SKNT RTL RTL RAL AND (17 JMS TWO /INSERT MONTH TAD SKNT AND (7 / / TAD (106 JMP DSN11 //DSN PATCH 21.21.1 M STARTS HERE DSN10, / JMS TWO /INSERT YEAR EXIT MAKDAT SETOBL, TAD (-6 /SET DATE TO BLANKS DCA SKNT TAD (SINCH+16 DCA SPTR SELOOP, TAD (40 DCA I SPTR INCR SPTR ISZ SKNT JMP SELOOP EXIT MAKDAT SPTR, 0 SKNT, 0 TEM2, 0 TENS, 0 TWO, 0 DCA TEM2 TAD (60 DCA TENS TAD TEM2 TWOLUP, TAD (-12 SPA JMP NEG INCR TENS JMP TWOLUP NEG, TAD (72 DCA TEM2 TAD TENS DCA I SPTR INCR SPTR TAD TEM2 DCA I SPTR INCR SPTR EXIT TWO XER77, CIF CDF 10 JMP I (ER7 /OUTPUT ERROR QU5, UTIL QH5, HANDLER MHANDLER,0 /AC CONTAINS HANDLER ENTRY ADDRESS CIF 10 JMP I (MHAN /KLUDGEY LINK TO FIELD 1 MUTIL, 0 /AC CONTAINS ETC. CIF 10 JMP I (MUT // DSN PATCH 21.21.1 M DSN11, DCA SKNT // JMS I DSN12 // TAD SKNT // TAD (160 // JMP DSN10 // DSN12, DSN13 // PAGE FIELD 1 XR=10 *2000 START, JMP DEC2 /NORMAL STARTING ADDRESS CHAIN, JMP NODEC /CHAIN STARTING ADDRESS DECODE, STL CLA RAR AND I (7642 SZA CLA JMP KBM /RETURN TO KBM ON $ / WOULD BE NICE HERE TO TELL CD/BATCH NOT TO SPOOL DEC2, CALL (200 5 /COMMAND DECODE 5200 /USING SPECIAL MODE NODEC, TAD (OUTHAND+1 DCA ENTR /RESET PTR TO HANDLER LOCATION STA DCA I (OSWITCH JMS I (CHKSW /CHECK FOR SWITCH OPTIONS CDF 0 DCA I (OUTSW STA DCA I (OUNIT CDF 10 TAD I (7666 DCA I (DATE FET, TAD I (7600 /GET DEVICE NUMBER OF OUTPUT FILE SNA /WAS ONE SPECIFIED? JMP NOF /NO - NO OUTPUT FILE CALL (200 1 /FETCH HANDLER ENTR, OUTHAND+1 /INTO PAGES 2400 AND 2600 /REPLACED BY HANDLER STARTING ADDRESS JMP I (ER6 /OUTPUT DEVICE DOESN'T EXIST TAD I (7644 AND (1000 SZA CLA JMP I (FOXOUT /O SPECIFIED STL CLA RTR AND I (7645 TAD I (7601 SNA CLA JMP NOCAS /NO OUTPUT NAME TAD (7600 JMS I (CHKNAM JMP I (STARER /*.* TAD I (7600 JMS I (TCAS /CASSETTE? JMP I (FIXOUT /YES JMP I (FXMOUT /MAGTAPE NOCAS, TAD (7601 /NO DCA OBLK /GET PTR TO OUTPUT FILE NAME TAD ENTR DCA I (OENTRY /STORE AWAY OUTPUT HANDLER ENTRY PT TAD (OWRITE DCA PWRITE TAD (FINIO DCA I (XFINIO TAD I (7643 RTL SNL CLA JMP NOB TAD I (7604 /GET EXT SZA CLA JMP NOB TAD (216 /SET TO .BN DCA I (7604 NOB, TAD I (7600 /GET DEVICE NUMBER AGAIN CALL (200 3 /OPEN OUTPUT FILE OBLK, 7601 /PTS TO OUTPUT FILE NAME /REPLACED BY STARTING BLOCK NUMBER LEN, 0 /REPLACED BY NEGATIVE OF LENGTH OF OUT AREA JMP I (ER3 /FILE OPEN ERROR DCA I (REALEN /ZERO REAL LENGTH TAD OBLK DCA I (OBLOCK /SET STARTING BLOCK NUMBER CONT1, JMS I (GETIN / INITIALIZE INPUT STUFF CHLOOP, CIF CDF 0 JMS I (F1CTRLC CALL PREAD CIF CDF 0 JMS I (F1CTRLC CALL PWRITE JMP CHLOOP PREAD, OREAD PWRITE, OWRITE NOF, STL CLA RTR AND I (7645 SNA CLA JMP I (ER1 JMP I (FOXOUT /Z IMPLIES O KBM, CIF CDF 0 JMP I (7605 PAGE UDIG, 0 GETSWDIG,0 DCA UDIG TAD I (7645 AND (1774 SNA EXIT GETSWDIG /NO UNIT INCR GETSWDIG RTL RAL LUDIG, SZL JMP GOTUD INCR UDIG RAL JMP LUDIG G7600, GOTUD, 7600 TAD UDIG TAD (60 EXIT GETSWDIG FOXOUT, JMS GETSWDIG JMP I (ER1 /NO OUTPUT UNIT JMP GOTOU FIXOUT, TAD I (ENTR JMS I (GETDVC GOTOU, CDF 0 DCA I (OUNIT CDF 10 JMS I (SETCAS YAHAOU, TAD I (7643 AND (400 SZA CLA JMP DOPT STL CLA RTR AND I (7645 SZA CLA JMP ZOPT TAD I G7600 RTR RTR AND (377 /ISOLATE FILE TYPE DCA FILTYP /SAVE IT JMS I (GETLEN TAD (CW DCA I (PWRITE TAD (CFINIO DCA I (XFINIO TAD I (7643 RTL /B TO LINK SZL CLA CLA IAC CIF CDF 0 DCA I (LDRFLG STA DCA I (CWTMP1 STA DCA I (CWTMP2 DCA I (CHECKSUM JMP I (ENTERO / RETURN TO CONT1 FXMOUT, TAD I (ENTR CDF 0 DCA I (OUNIT CDF 10 JMS I (SETMAG TAD I (ENTR /GET LOCATION OF MAGTAPE HANDLER JMS SETDEN JMP YAHAOU SETDEN, 0 AND G7600 DCA MTA TAD I (7644 AND (10 SZA CLA /IS /U SPECIFIED? IAC /YES, USE DENSITY 3 TAD (2 /NO, USE DENSITY 2 DCA DEN CDF 0 TAD PARITY CLL RAR /LINK ON IF PARITY SPECIFIED SZL TAD PAR SNL TAD I MTA /GET RELATIVE LOC 0 AND (400 /ISOLATE PARITY TAD DEN /FORCE CORE DUMP MODE DCA I MTA /STORE BACK DENSITY AND PARITY CDF 10 JMP I SETDEN FILTYP, 0 BINTYP, 0 /SET BINARY TYPE - DON'T TOUCH LINK IAC IAC DCA FILTYP EXIT BINTYP DOPT, CIF CDF 0 JMP I (DOPTION ZOPT, CIF CDF 0 JMP I (ZOPTION MTA, 0 /FIRST LOC OF MAGTAPE HANDLER PARITY, 0 /0 MENAS NOT SPECIFIED, 1 MEANS SPECIFIED PARITY PAR, 0 /0 OR 400 SPECIFYING PARITY DEN, 2 /DENSITY PAGE FID2, 0 TAD I (CIBUF AND (177 /DF=0 TAD (-52 SNA CLA JMS EMPTY TAD I (CIBUF+10 DCA I (CIBUF+11 TAD I (CIBUF+7 DCA I (CIBUF+10 TAD I (CIBUF+6 DCA I (CIBUF+7 TAD (". DCA I (CIBUF+6 CIF 0 JMP I FID2 EMPTY, 0 TAD I (FAST SNA CLA JMP I EMPTY STA DCA I (CIKNT TAD (32 DCA I (CIBUF CIF 0 JMP I (FIDLV GETLEN, 0 CLL STA RAR /3777 AND I (7642 /GET H.O. OPTION DCA VRSNO TAD I (7646 /GET = OPTION (L.O. 12 BITS) CLL TAD (-1001 SZL CLA /LESS THAN 1001? JMP I (ER10 /NO, ERROR TAD I (7646 /YES SNA TAD (200 /200 IS DEFAULT RECORD SIZE CDF 0 DCA I (RECSIZ TAD I (RECSIZ CIA DCA I (COKNT CDF 10 EXIT GETLEN FINIO, JMS I (OWRITE TAD I (7600 /GET OUTPUT DEVICE NUMBER CALL (200 4 /CLOSE 7601 /PTR TO FILE NAME REALEN, 0 /LENGTH OF NEW OUTPUT FILE JMP ER8 /CLOSE ERROR JMP I (DECODE ER8, JMS I (PRINT TEXT /?CLOSE ERROR/ ER5, JMS I (PRINT TEXT /?OUTPUT DEVICE FULL/ ER30, JMS I (PRINT TEXT /?OUT=IN/ VRSNO, 0 ER6, JMS I (PRINT TEXT /?FETCH ERROR/ ER24, STA DCA I (SPSWTCH /RETURN FROM PRINT JMS I (PRINT TEXT /?FILE NOT FOUND/ ISZ I (FUDSW /FIXUP CASSETTE JMP I (CLO PAGE OREAD, 0 TAD (MAXBLK DCA INTEN /TRY TO READ 10 BLOCKS TAD (MAXBLK^200+10 DCA READSZ TAD I (7605 AND (17 TAD (7757 DCA TEMP /GET DCB ADDR TAD I TEMP /GET DCB AND (1000 SZA CLA JMP ER4 /INPUT DEVICE IS WRITE-ONLY TAD I TEMP SMA CLA JMP YES /NOT FILE-STRUCTURED TAD I (INLEN TAD (MAXBLK SMA SZA CLA /CAN I READ IN 10 BLOCKS? JMS SHORT /NO YES, CIF 0 /YES JMS I IENTRY /CALL INPUT HANDLER READSZ, 2010 /READ 20 PAGES INTO FIELD 1 OBUFFER /LOCATION 4000 IBLOCK, 0 /INPUT BLOCK NUMBER JMP QER4 /INPUT ERROR TAD IBLOCK TAD INTEN DCA IBLOCK /UPDATE BLOCK NUMBER TAD I (INLEN TAD INTEN DCA I (INLEN /UPDATE LENGTH LEFT TAD INTEN TAD (-MAXBLK SZA CLA JMP XFIN EXIT OREAD /RETURN INTEN, 10 /NUMBER OF BLOCKS JUST READ XFINIO, FINIO SHORT, 0 TAD I (INLEN /HOW MANY BLOCKS LEFT? CIA /MAKE POSITIVE DCA INTEN /THAT'S AS MUCH AS WE CAN READ TAD INTEN SNA XFIN, JMP I XFINIO /NO MORE CLL RTR RTR RTR /CONVERT TO PAGES IN BITS 1-5 TAD (10 /ADD IN FIELD 1 BIT DCA READSZ EXIT SHORT /RETURN IENTRY, 0 /PTS TO INPUT HANDLER ENTRY POINT QER4, SMA CLA JMP SFIN /NON-FATAL END-OF FILE ER4, JMS I (PRINT TEXT /?INPUT ERROR/ ER26, JMS I (PRINT TEXT /?TOO MANY FILES/ SFIN, TAD (7600 DCA TPTR SLUP, STA TAD TPTR DCA TPTR TAD I TPTR SNA CLA JMP SLUP TAD TPTR TAD (-OBUFFER+1 SNA JMP ALLZ TAD (377 /CHANGED FROM PIPC'S 376 CLL RTL RTL RAL AND (17 DCA INTEN JMP XFIN ALLZ, CLA IAC JMP .-3 TPTR, 0 ER3, JMS I (PRINT TEXT /?ENTER ERROR/ PAGE GETIN, 0 /OPEN INPUT FILE DCA DATE TAD I (7605 /ANY MORE FILES SPECIFIED? SNA CLA JMP NOIN /NO TAD I (7612 SZA CLA JMP I (ER26 /2ND INPUT FILE IS BAD TAD (7605 JMS I (CHKNAM JMP I (STARER /*.* TAD (7606 DCA IN /SET PTR TO FILE NAME TAD (INHAND+1 DCA IN3 TAD I (7605 /GET DEVICE NUMBER CALL (200 1 /FETCH NEW DEVICE HANDLER IN3, INHAND+1 /INTO PAGES 3200 AND 3400 /REPLACED BY ENTRY PT TO INPUT HANDLER JMP I (ER6 /FETCH ERROR TAD I (7643 AND (10 SZA CLA JMP I (FOXIN /I SPECIFIED CLA IAC /V3C AND I (7643 /LOOK AT /L OPTION TAD I (7606 SNA CLA JMP NOCAS2 /IF NO NAME IS GIVEN AND /L IS NOT SPECIFIED, THEN USE /MAGTAPE OR CASSETTE HANDLER AS IS, I.E. AS /A NON-FILE-STRUCTURED OS/8 DRIVER. TAD I (7605 JMS I (TCAS /CASSETTE? JMP I (FIXIN /YES JMP I (FIXMIN /MAGTAPE NOCAS2, CLA IAC AND I (7643 SZA CLA JMP ER11 /V3C /L SPECIFIED WHEN DEVICE WAS NOT MAGTAPE OR CASSETTE TAD (OREAD DCA I (PREAD TAD IN3 /GET NEW HANDLER ENTRY PT DCA I (IENTRY /STORE AWAY TAD I (7605 /GET DEVICE NUMBER AGAIN CALL (200 2 /PERFORM A LOOKUP IN, 0 /PTR TO FILE NAME /REPLACED BY INPUT BLOCK NUMBER IN2, 0 /REPLACED BY NEGATIVE OF INPUT FILE LENGTH JMP LKERR /LOOKUP ERROR TAD IN /GET NEW INPUT BLOCK DCA I (IBLOCK /STORE AWAY TAD IN2 /GET NEW INPUT FILE LENGTH DCA INLEN TAD I (1404 /GET # OF ADDITIONAL WORDS SNA JMP NONE TAD 17 DCA POINTER TAD I POINTER /GET FILE CREATION DATE SNA JMP NONE SETDAT, DCA DATE EXIT GETIN NONE, TAD I (7666 /USE TODAY'S DATE JMP SETDAT LKERR, CLA TAD I (7611 SZA CLA JMP I (ER24 /FILE NOT FOUND TAD I (7643 /TRY .BN RTL SNL CLA JMP I (ER24 / NOT /B TAD (216 DCA I (7611 JMP GETIN+1 INLEN, 0 DATE, 0 /OS8 DATE OF INPUT FILE POINTER,0 NOIN, CLA IAC AND I (7643 SNA CLA JMP I (ER21 JMP I (FOXIN / /L SPECIFIED ER11, JMS I (PRINT /V3C TEXT /?L OPTION OUT OF CONTEXT/ PAGE /ENTER WITH INTEN BLOCKS TO WRITE OWRITE, 0 TAD I (INTEN /HOW MUCH IS THERE TO WRITE? SNA EXIT OWRITE /NOTHING DCA OUTEN /SAVE NUMBER OF BLOCKS TO WRITE TAD I (7600 AND (17 TAD (7757 DCA TEMP STL CLA RTR AND I TEMP SZA CLA JMP I (ER7 /OUTPUT DEVICE IS READ-ONLY TAD OUTEN CLL RTR RTR RTR /CONVERT TO PAGES TAD (4010 /FIELD 1 (WRITE DIRECTLY FROM INPUT BUFFER) DCA WRSIZ TAD I (LEN SNA CLA JMP NFS /NON-FILE STRUCTURED TAD I (REALEN TAD OUTEN STL TAD I (LEN SNL SZA CLA JMP I (ER5 NFS, CIF 0 JMS I OENTRY /CALL OUTPUT HANDLER WRSIZ, 6010 /WRITE 20 PAGES FROM FIELD 1 OBUFFER /LOCATION 4000 OBLOCK, 0 /OUTPUT BLOCK NUMBER JMP I (ER7 /OUTPUT ERROR TAD OBLOCK TAD OUTEN DCA OBLOCK /UPDATE OUTPUT BLOCK NUMBER TAD I (REALEN TAD OUTEN DCA I (REALEN /UPDATE LENGTH WROTE EXIT OWRITE OENTRY, 0 OUTEN, 0 FOXIN, JMS I (GETSWDIG JMP I (ER21 JMP GOTIU FIXIN, TAD I (IN3 /GET INPUT HANDLER ADDRESS JMS I (GETDVC GOTIU, CDF 0 DCA I (IUNIT CDF 10 JMS I (SETCAS YAHAIN, CDF 0 TAD I (OUNIT CIA TAD I (IUNIT SNA CLA JMP I (ER30 STA DCA I (CIKNT DCA I (CHECKSUM CLA IAC DCA I (TLRFLG CDF 10 TAD (CR DCA I (PREAD TAD I (7643 RTL CLA RAL CDF 0 DCA I (FTFLG CDF 10 JMS I (GETLEN TAD I (7643 AND (100 / F OPTION? CDF 0 DCA I (FAST CDF 10 CLA IAC AND I (7643 CIF CDF 0 SZA CLA JMP I (LOPTION JMP I (LOOK4ME /RETURN TO CHLOOP FIXMIN, TAD I (IN3 CDF 0 DCA I (IUNIT CDF 10 JMS I (SETMAG TAD I (IN3 JMS I (SETDEN JMP YAHAIN PAGE PRINT, 0 CLA CDF 10 DCA CTOFLG /ALLOW ECHOING JMS CRLF PRLUP, TAD I PRINT RTR RTR RTR JMS PRIN TAD I PRINT JMS PRIN INCR PRINT JMP PRLUP PRIN, 0 AND (77 SNA JMP PRFIN TAD (240 AND (77 TAD (240 DCA TM KSF JMP NOBOTH TAD (200 KRS TAD (-203 SNA JMP KBM2 TAD (203-217 SZA CLA JMP NOBOTH TAD ("^ JMS TYPE TAD ("O JMS TYPE JMS CRLF ISZ CTOFLG NOBOTH, TAD TM JMS TYPE EXIT PRIN PRFIN, JMS CRLF DCA FUDSW TAD I (SPSWTCH SNA CLA JMP CLO DCA I (SPSWTCH /SWITCH NON-ZERO MEANS RETURN INCR PRINT /POINT TO RETURN JMP I PRINT /DO A CLOSE IF OUTPUT CASSETTE OPEN CLO, CDF 0 TAD I (OUNIT CDF 10 SPA CLA JMP I (DECODE TAD OSWITCH SZA CLA JMP I (DECODE CDF 0 TAD I (OUTSW CDF 10 SNA CLA /DID WE WRITE ON OUTPUT CASSETTE? JMP I (DECODE /NO CIF CDF 0 TAD I (OUNIT DCA TEMP STA DCA I (OUNIT TAD FUDSW SZA CLA JMP I (CLO3 TAD TEMP JMP I (XCLOSE OSWITCH,-1 /0 MEANS OUTPUT CASSETTE OPEN KBM2, CIF CDF 0 JMP I L7600 /RETURN TO OS/8 FUDSW, 0 /1 MEANS GOT OS/8 LOOKUP FAILURE TYPE, 0 DCA TM TAD CTOFLG SZA CLA EXIT TYPE /NOT ECHOING TAD TM TLS TSF JMP .-1 L7600, 7600 EXIT TYPE CRLF, 0 TAD (215 JMS TYPE TAD (212 JMS TYPE EXIT CRLF CTOFLG, 0 /1 MEANS DON'T ECHO TM, 0 ER7, JMS PRINT TEXT /?OUTPUT ERROR/ CFINIO, CIF CDF 0 JMS I (CWRITE CIF CDF 0 JMP I (CFIN /FINISH OUTPUT AND WRITE SENTINEL /RETURN TO DECODE PAGE ER10, JMS I (PRINT TEXT /?RECORD SIZE TOO BIG/ /ENTRY POINT REL 1: UNIT 1 /ENTRY POINT REL 7: UNIT 0 GETDVC, 0 IAC DCA TEMP STL CLA RTL /2 AND TEMP RAR DCA UNIT /DETERMINE IF UNIT 0 OR 1 TAD TEMP AND (7600 DCA TEMP CDF 0 LOOKIO, ISZ TEMP TAD I TEMP /SEARCH HANDLER FOR ANY IOT AND (7700 TAD (-6700 SZA CLA JMP LOOKIO TAD I TEMP /GET CASSETETE IOT CDF 10 AND (30 /V3 BUG FIX FROM V2 CLL RTR TAD UNIT TAD (60 EXIT GETDVC /LEAVE IT IN AC UNIT, 0 CHKNAM, 0 /DON'T ALLOW *'S OR ?'S DCA XR /IN OUTPUT OR INPUT NAME TAD I XR TAD (-5200 SNA JMP STARNM /ENTIRE NAME IS * TAD (5200 JMS CHKSTR TAD I XR JMS CHKSTR TAD I XR JMS CHKSTR TAD I XR JMS CHKSTR ISZ CHKNAM JMP I CHKNAM /NAME GOOD, RETURN 2 CHKSTR, 0 DCA TEM TAD TEM CLL RTR RTR RTR JMS CHC TAD TEM JMS CHC JMP I CHKSTR CHC, 0 AND (77 TAD (-52 SNA JMP STARER /* IN NAME TAD (52-77 SZA CLA JMP I CHC /OKAY STARER, JMS I (PRINT TEXT /?ILLEGAL * OR ?/ STARNM, ISZ XR ISZ XR TAD I XR TAD (-5200 SZA CLA JMP STARER /NOT *.* JMP I CHKNAM /TAKE SPECIAL RETURN ON *.* TEM, 0 CHKSW, 0 /CHECK SWITCHES TAD I (7644 AND (4 /CHECK FOR /V SZA CLA JMS I (VERSN /PRINT MCPIP VERSION # TAD I (7644 AND (400 /CHECK FOR /P /NOTE /P = 400 SAME AS ODD PARITY CODE SZA JMP ODDPAR TAD I (7643 AND (200 /CHECK FOR /E SZA CLA JMP EVPAR GOTP, NOP JMP I CHKSW ODDPAR, /400 IN AC EVPAR, DCA I (PAR CLA IAC DCA I (PARITY JMP GOTP PAGE SPSWTCH,0 /NON-ZERO MEANS RETURN FROM PRINT /RET 1: CASSETTE /RET 2: MAGTAPE /RET 3: NEITHER TCAS, 0 AND (17 /ISOLATE TAD (7757 /ADD IN BASE OF DCB TABLE DCA TEMP /TO GET DCB ADDRESS TAD I TEMP /GET DCB AND (770 /ISOLATE UNIT TYPE TAD (-270 /CASSETTE HANDLER TYPE IS 27 SNA JMP ITSCAS TAD (270-200 SZA CLA INCR TCAS /NOTHING SPECIAL INCR TCAS /MAGTAPE ITSCAS, EXIT TCAS VERSN, 0 STA DCA SPSWTCH /RETURN FROM PRINT JMS I (PRINT TEXT \OS/8 MCPIP V\ *.-1 PIPVERSION+60^100+PATCHLEV 0 JMP I VERSN ER1, TAD I (7605 SNA CLA JMP I (DECODE /NO OUT AND NO IN CLA IAC AND I (7643 /WAS /L SPECIFIED? SZA CLA JMP SETTY /YES JMS I (PRINT TEXT /?NO OUTPUT FILE/ ER40, JMS I (PRINT TEXT /?CANNOT HANDLE VARIABLE-LENGTH RECORDS/ SETTY, TAD (3100 DCA Y JMS I (200 12 /INQUIRE TT, 2424 Y, 3100 /DEVICE TTY 0 JMP ER99 TAD Y /GET DEVICE NO. OF TTY: DCA I (7600 JMP I (FET ER99, JMS I (PRINT TEXT /?TTY DOES NOT EXIST/ ER21, JMS I (PRINT TEXT /?NO INPUT FILE/ CW, 0 CIF CDF 0 JMS I (CWRITE EXIT CW CR, 0 CIF CDF 0 JMS I (CREAD EXIT CR PAGE SETCAS, 0 TAD (UTIL JMS SETU TAD (HANDLER JMS SETH CDF 0 TAD (BACKFIL DCA I (BK2 TAD I (BK4 DCA I (BK3 TAD (254 DCA I (EOFBIT TAD I (FL3 DCA I (FL1 TAD (314 DCA I (EOTBIT TAD I (LM3 DCA I (LM1 CDF 10 JMP I SETCAS SETMAG, 0 TAD (MUTIL JMS SETU TAD (MHANDLER JMS SETH CDF 0 TAD (BACKBLOCK DCA I (BK2 TAD I (BK1 DCA I (BK3 TAD (3673 DCA I (EOFBIT DCA I (FL1 TAD (3663 DCA I (EOTBIT DCA I (LM1 CDF 10 JMP I SETMAG SETU, 0 DCA SETH CDF 0 TAD SETH DCA I (QU1 TAD SETH DCA I (QU2 TAD SETH DCA I (QU3 TAD SETH DCA I (QU4 TAD SETH DCA I (QU5 CDF 10 JMP I SETU SETH, 0 DCA SETU CDF 0 TAD SETU DCA I (QH1 TAD SETU DCA I (QH2 TAD SETU DCA I (QH3 TAD SETU DCA I (QH4 TAD SETU DCA I (QH5 CDF 10 JMP I SETH PAGE MH, 0 MHAN, SZA DCA MENTRY TAD I (MHANDLER DCA MH /PICK UP ARGS VIA MH TAD I MH /GET FN WORD TAD (SPCODE /ADD SPECIAL CODE DCA MARG1 ISZ MH TAD I MH /GET CORE LOC DCA MARG2 ISZ MH /PT TO ERROR RETURN TAD I (BSIZE /GET BLOCKSIZE CIA DCA MARG3 /STORE NEG CDF 10 CIF 0 JMS I MENTRY /CALL MAGTAPE HANDLER MARG1, HLT MARG2, HLT MARG3, HLT SKP /TAKE ERROR RETURN ISZ MH /NORMAL RETURN CIF CDF 0 JMP I MH /GO BACK TO FIELD 0 MENTRY, 0 MU, 0 MUT, SZA DCA MENTRY /DF=0 TAD I (MUTIL /PICK UP ARGS DCA MU /VIA 'MU' TAD I MU /GET UTILITY FUNCTION ISZ MU CDF 10 TAD (-REWIND SNA JMP REWT TAD (REWIND-BACKFIL SNA JMP BAKFT TAD (BACKFIL-WRGAP SNA JMP WRGT TAD (WRGAP-BACKBLOCK SNA JMP BAKBT TAD (BACKBLOCK-SKPFIL SZA CLA HLT /IMPOSSIBLE SKPFT, STL CLA RAR /4000=WRITE BAKFT, TAD (WRITE+FICODE-REWCOD REWT, TAD (REWCOD-EOCODE WRGT, TAD (EOCODE-RECCOD-WRITE BAKBT, TAD (RECCOD+WRITE DCA MRG1 CIF 0 JMS I MENTRY MRG1, HLT MCA, HLT /IRRELEVANT MWC, -1 SKP /ERROR RETURN ISZ MU CIF CDF 0 JMP I MU /RETURN EMPTINCH,52;105;115;120;124;131;40;40;40;14 0;0;0;0;40;40;40;40;40;40 ZBLOCK 14 PAGE *2000 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 | /MARK SENSE BATCH AND PIP / / / / / / / // / / / / /COPYRIGHT (C) 1974, 1975, 1977 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /MARK SENSE BATCH AND PIP JANUARY 9, 1974 / / / / AUTHOR: / MARK B. ROSENTHAL / DIGITAL EQUIPMENT CORPORATION / / VERSION 3A M.H. 28-APR-77 / VERSION 3B / / / / / / / / / / / / / L7775=CLA CLL CMA RTL L7776=CLA CLL CMA RAL L7777=CLA CLL CMA L0002=CLA CLL CML RTL L0001=CLA CLL IAC CONTCH=3 /CONTINUATION CHARACTER RUBOUT=7 /RUBOUT BITS JOBBIT=0200 /BIT POSITION OF $JOB IN COLUMN 1 EOFCHR=6004 /END OF FILE CARD CHARACTER IS _ TABCHR=6010 /TAB CHARACTER FFCHR=3010 /FORM FEED CHARACTER NOCHR=6400 /# CHARACTER RCSE=6672 /CARD READER SELECT AND SKIP IF READY RCSD=6671 /CARD READER SKIP IF CARD DONE RCRD=6674 /CARD READER CLEAR CARD DONE FLAG RCSF=6631 /CARD READER SKIP IF DATA READY RCRB=6634 /CARD READER READ BINARY KCF=6030 /CLEAR KEYBOARD FLAG SYSNO=CLA CLL IAC /OS8 DEVICE NUMBER FOR SYS: DSKNO=CLA CLL CML RTL /OS8 DEVICE NUMBER FOR DSK: FETCH=1 LOOKUP=2 ENTER=3 CLOSE=4 DECODE=5 CHAIN=6 USRIN=10 USROUT=11 F0=0 F1=10 JSBITS=7746 /JOB STATUS WORD *10 XR1, 0 XR2, 0 XRCDR, 0 XROPT, 0 *20 ERROR=JMS I .; XERR CONVRT=JMS I .; XCONVR OUT=JMS I .;OUTAD, XOUT SAVFLD=JMS I .;XSAVDF USR=JMS I .; 200 KEYWD, 0;0;0;0 TEMP1, 0 TEMP2, 0 TEMP3, 0 TEMP4, 0 TEMP5, 0 OPTCNT, 0 /OUTPUT BUFFER COUNT OPTSW, 0 /OUTPUT BUFFER THREE WAY SWITCH KEYADR, 0 KEYVAL, 0 ERRFLG, 0 ERRCNT, 0 CONFLG, 0 LNCNT, 0 USRFLG, 0 OFILE, ZBLOCK 5 /OUTPUT FILE DEVICE, LENGTH, AND NAME CDRFLG, -1 /CDRIN TO PASSES LAST CARD IF 0 BCLSW, 0 CDREOF, -1 DEVENT, 0 /ENTRY ADDRESS OF OUTPUT DEVICE HANDLER IOERR, 0 /ERROR NUMBER VERNO9, ISZ IOERR IOER8, ISZ IOERR CDRER7, ISZ IOERR OPTER6, ISZ IOERR OPTER5, ISZ IOERR OPTER4, ISZ IOERR OPTER3, ISZ IOERR OPTER2, ISZ IOERR OPTER1, JMP I .+1 IOERR1 *200 START, ISZ USRFLG;SKP /IS THE USR IN CORE? JMP CD /YES CIF 10;JMS I (7700;USRIN /LOCK USR IN CORE CD, L7777 /SET FLAG FOR USR IN CORE DCA USRFLG CIF 10;USR;DECODE;0 /DELETE TENTATIVE FILES TAD (7577 /COPY OUTPUT FILE #1 (NAME AND DEVICE) DCA XR1 CDF F1 TAD I (7644 /TEST /V SWITCH AND (4 SZA CLA JMP VERNO9 /YES - PRINT VERSION NUMBER TAD I XR1 SNA /IF NOT SPECIFIED, DSKNO /USE DEVICE DSK: DCA OFILE TAD I XR1 SNA /WAS A NAME GIVEN? JMP OPTER1 /NO INIT1, DCA OFILE+1 TAD I XR1 DCA OFILE+2 TAD I XR1 DCA OFILE+3 TAD I XR1 DCA OFILE+4 TAD (OFILE+1 DCA BLOKNO /SET FILE NAME ADDRESS TAD I (7605 /GET SECOND OUTPUT DEVICE SPECIFICATION DCA I (7600 /MOVE TO FIRST FOR SPOOLING IN BATCH CDF TAD BLOKNO /GET ADDRESS OF FILE NAME DCA I (CLOSNM /AND SAVE FOR CALL TO CLOSE TAD (OPTDEV&7600+1 /SET DEVICE HANDLER SPACE DCA DEVHDL TAD OFILE CIF 10;USR;FETCH /FETCH DEVICE HANDLER DEVHDL, OPTDEV&7600+1 /2 PAGES JMP OPTER2 /ERROR - CANNOT FETCH HANDLER TAD DEVHDL /MOVE ENTRY ADDRESS DCA DEVENT /TO PAGE ZERO TAD OFILE /ENTER THE FILE NAME AS TENTATIVE CIF 10;USR;ENTER BLOKNO, OFILE+1 /FILE NAME, STARTING BLOCK RETURNED HERE FILLEN, 0 /RETURNS FILE LENGTH HERE JMP OPTER3 /CANNOT ENTER FILE CIF 10;USR;USROUT /DISMISS THE USR DCA USRFLG /CLEAR USR IN CORE FLAG CDF 10 TAD BLOKNO /SAVE STARTING BLOCK NO. FOR BATCH DCA I (7620 TAD OFILE /SAVE DEVICE NO. FOR BATCH AND (17 DCA I (7617 TAD I (7643 /GET OPTIONS CDF F0 AND (2100 / /B OR /F SNA DCA I (EOFJMP /IF NEITHER, THEN WE CHAIN TO BATCH CLL RTL /GET /B OUT OF AC SZA CLA /IF AC=0 START WITH BASIC KEYWORDS TAD (FORKEY-BASKEY TAD (BASKEY-15 DCA KEYADR JMP I (INIT5 PAGE INIT5, TAD (BPRI2 /TAILOR IT FOR BATCH PROCESSING DCA I (BPRKEY /"PRINT #4," TAD (BINP2 DCA I (BINKEY /"INPUT #3," TAD (BSTO2 DCA I (BSTKEY /"CLOSE# 4\STOP" TAD (BEND2 DCA I (BENKEY /"CLOSE #4\END" CDF F1 DCA I (CBAS5 /NO JUMP DCA I (DATL48 /NO JUMP TAD (CL2M1A /".R LOADER_*GENIOX" DCA I (CL2SX TAD I (7643 /TEST /I OPTION (INTERACTIVE) AND (10 SNA CLA JMP INIT6 TAD BASJMP /SET UP FOR FILES 0 & 1 DCA I (CBAS5 /SET UP THE JMP TAD BASJM1 /SET UP JUMP DCA I (DATL48 TAD (CL2M1 /".R LOADER_*" DCA I (CL2SX CDF F0 TAD (BPRI DCA I (BPRKEY TAD (BINP DCA I (BINKEY TAD (BSTO DCA I (BSTKEY TAD (BEND DCA I (BENKEY INIT6, CDF 10 TAD I (7644 /TEST /T OPTION AND (20 SNA CLA TAD (BATLPT-BATTTY TAD (BATTTY CIF CDF F1 JMS I (MOVODV TAD I (7645 /TEST /2 OPTION AND (200 SNA CLA JMP INIT3 TAD (CF2 /FORTRAN 2 DCA I (FORADR TAD (CL2 DCA I (LOAADR TAD (DATX2 JMP INIT4 INIT3, TAD (CF4 /FORTRAN 4 DCA I (FORADR TAD (CL4 DCA I (LOAADR TAD (DATX4 /INITIALIZE $DATA INIT4, DCA I (DATFTN TAD I (DATFTN DCA I (DATADR TAD (SAVARA DCA I (SAVPNT DCA I (NAMCNT CDF F0 DCA BCLSW /NO BCL CARDS YET L7777 DCA CDREOF /RESET EOF SWITCH TAD I (BLOKNO /SET STARTING BLOCK NUMBER DCA I (OPTBLK TAD (OPTBUF-1 DCA XROPT TAD (-200 DCA OPTCNT L7775 DCA OPTSW DCA ERRCNT /CLEAR COUNT OF CARDS IN ERROR JMP I (READY BASJMP, JMP CBAS7&177+INIT5 BASJM1, JMP DATL49&177+INIT5 PAGE READY, JMS I (CDRIN /READ A CARD JMP I (EOF /END OF FILE SENSED TAD I XRCDR /GET COLUMN 1 DCA KEYWD /SAVE AS KEYWORD BITS TAD XRCDR DCA XR2 /TRANSLATE LINE NUMBER TAD (-5 DCA TEMP1 DCA LNCNT /CLEAR COUNT DCA KEYWD+3 /CLEAR COLUMN 2-6 KEYWORD BITS LNLP, TAD I XRCDR /GET LINE NO. COLUMN DCA TEMP2 /SAVE CHAR TAD (6000 AND TEMP2 /GET KEYWORD BITS CLL RAL RTL TAD KEYWD+3 CLL RTL DCA KEYWD+3 TAD (1777 AND TEMP2 /GET CHAR SNA JMP LNLPEN /IGNORE BLANKS CONVRT /TRANSLATE JMP LNLPEN /IGNORE RUBOUTS TAD (-"9 SMA SZA JMP LNERR /NOT A NUMBER TAD ("9-"0 SPA JMP LNERR /NOT A NUMBER TAD ("0 LNLP1, DCA I XR2 /INSERT CHARACTER IN OUTPUT BUFFER ISZ LNCNT /COUNT THIS CHARACTER LNLPEN, ISZ TEMP1 /GOT ALL LINE NUMBER COLUMNS? JMP LNLP /NO - LOOP. JMP I (KEYTRA /GO TRANSLATE KEYWORD LNERR, ERROR JMP LNLP1 MAKNA2, 0 /FIELD 1 OUTPUT ROUTINE FOR MAKNAM CIF CDF F1 JMS I (MAKNA3 JMP I MAKNA2 OOUT2, 0 OUT CIF CDF F1 JMP I OOUT2 GETCD1, 0 TAD I XRCDR CIF CDF F1 JMP I GETCD1 /FOR RETURN TO CALLING FIELD /PRESERVES AC AND LINK WHILE PUTTING /CIF CDF TO DATA FIELD AT ADDRESS /SPECIFIED AS FIRST WORD AFTER CALL XSAVDF, 0 DCA XSAVD1 RDF TAD (CIF CDF DCA XSAVD2 CDF TAD I XSAVDF ISZ XSAVDF DCA XSAVD3 TAD XSAVD2 DCA I XSAVD3 TAD XSAVD1 JMP I XSAVDF XSAVD1, 0 XSAVD2, 0 XSAVD3, 0 PAGE XERR, 0 K7600, 7600 TAD ("? /OUTPUT A "?" ISZ ERRFLG /FLAG ERROR ON THIS CARD JMP I XERR TIME=12 CDRIN, 0 /READ A CARD INTO THE BUFFER SAVFLD;CDRCIF /SAVE DATA FIELD FOR RETURN DCA ERRFLG /CLEAR ERROR FLAG FOR THIS CARD ISZ CDREOF /HAVE WE SEEN EOF? JMP CDRCIF /YES - STILL EOF ISZ CDRFLG /SHOULD WE PASS LAST CARD? JMP REINIT /YES CDRIN6, JMS CDRIN5 /RESET TIME OUT COUNTERS TAD (-50 /YES - READ IT INTO THE CDR BUFFER DCA TEMP1 /40 COLUMNS (DECIMAL) TAD (CDRBUF-1 DCA XRCDR CDRIN3, RCSE /CARD READY? JMP CDRIN4 /TEST TIME OUT JMS CDRIN5 /RESET TIME OUT COUNT CDRIN1, JMS KBRD /TEST KEYBOARD (AFTER TIME OUT LOOP) RCSD /CARD DONE? SKP JMP CDRIN7 /YES - TOO FEW COLUMNS RCSF /CHARACTER READY? JMP CDRIN1 /NO - TRY CARD DONE JMS CDRIN5 /RESET TIME OUT COUNT RCRB /YES - READ BINARY CDRIN2, DCA I XRCDR /AND STORE IT ISZ TEMP1 /DON'T READ MORE THAN BUFFER CAN HOLD JMP CDRIN1 /TRY CARD DONE AGAIN RCSD /WAIT FOR END OF CARD - OR ELSE! JMP .-1 RCRD /IF THIS ISN'T CLEARED, /FORTRAN IV BECOMES VERY UNHAPPY! JMP CDRIN8 CDRIN7, RCRD /FORTRAN IV AGAIN ISZ TEMP1 /ALLOW ONE COLUMN TOO FEW (EDU30 - 39 COL) JMP CDRER7 /ERROR! DCA I XRCDR CDRIN8, TAD (CDRBUF-1 /INIT BUFFER POINTERS AGAIN DCA XRCDR TAD (-50 DCA TEMP1 TAD (-EOFCHR /TEST FOR FIRST COLUMN=EOFCHR AND REST =0 EOFLP, TAD I XRCDR /GET NEXT COLUMN SZA CLA JMP REINIT /NON-ZERO - NOT EOF ISZ TEMP1 JMP EOFLP /LOOP JMP CDRCIF /END OF FILE CARD REINIT, TAD (CDRBUF-1 DCA XRCDR ISZ CDRIN /SKIP RETURN IF NOT EOF L7777 /RESET EOF SWITCH CDRCIF, 0 DCA CDREOF L7777 /SET TO READ A NEW CARD NEXT TIME DCA CDRFLG JMP I CDRIN CDRIN4, JMS KBRD /TEST TIME OUT JMP CDRIN3 /TRY SELECTING CARD AGAIN CDRIN5, 0 /RESET TIME OUT DCA TIMOUT TAD (-TIME DCA TIMOU2 JMP I CDRIN5 KBRD, 0 KSF /KEYBOARD? JMP KBRDTM /NO - TIME KRS /IS IT ^C? AND (177 TAD (-3 SNA CLA JMP I K7600 /YES - RETURN TO OS-8 KBRDTM, ISZ TIMOUT /TIMED OUT YET? JMP I KBRD /NO ISZ TIMOU2 JMP I KBRD /LIKEWISE KCF /IGNORE ANYTHING TYPED BEFORE THIS TAD (207 /NOTHING - WAKE HIM UP JMS I (TOUT TAD (MSGJAM /IT COULD BE JAMMED DCA TEMP1 JMS I (TTYOUT KBRD1, KSF /WAIT FOR A CHARACTER OR READER JMP KBRD3 KBRD2, KRS /GET THE CHAR AND (177 /WITHOUT PARITY TAD (-3 /IS IT ^C? SNA JMP I K7600 /YES - TO MONITOR KCF /IF ^C - LEAVE FLAG SO OS-8 WILL SEE IT. ELSE CLEAR IT TAD (3-32 /IS IT ^Z? SNA CLA JMP CDRCIF /YES - EOF JMP CDRIN6 /GO BACK AND TIME OUT AGAIN KBRD3, RCSE /SELECT A CARD? JMP KBRD1 /NO - TRY KEYBOARD TAD (-50 /RESET COUNT DCA TEMP1 TAD (CDRBUF-1 /AND POINTER DCA XRCDR JMP CDRIN3+2 /YES - RE-ENTER ROUTINE WITH SUCCESSFUL SELECT CDRJA1, KSF JMP .-1 JMP KBRD2 TIMOUT, 0 TIMOU2, 0 PAGE KEYTRA, TAD I XRCDR /GET KEYWORD COLUMN DCA KEYWD+1 TAD I XRCDR /DITTO DCA KEYWD+2 /CONVERT KEYWORD BITS TO NUMBER TAD (KEYWD-1 /POINT INDEX REGISTER TO KEYWORD BUFFER DCA XR1 TAD (-4 /SET COUNT OF WORDS DCA TEMP1 DCA KEYVAL /ZERO KEYWORD VALUE WRDLP, TAD (-14 /SET BIT COUNT DCA TEMP2 TAD I XR1 /GET WORD BITLP, ISZ KEYVAL /BUMP BIT VALUE CLL RAL /SHIFT INTO LINK SZL /IS THIS ONE ON? JMP KEYFND /YES - KEYWORD FOUND ISZ TEMP2 /COUNT BITS JMP BITLP ISZ TEMP1 /COUNT WORDS JMP WRDLP JMS I (LNOUT /SEND THE LINE NO. JMP I (TEXTRA /ALL BITS OFF - NO KEYWORD KEYBAD, ERROR OUT JMP KEYBLK TAD I XR1 /GET NEXT WORD KEYFND, SZA CLA /TEST THIS WORD JMP KEYBAD /ERROR - MORE THAN ONE KEYWORD MARKED ISZ TEMP1 /COUNT WORDS JMP KEYFND-1 /AND LOOP /OUTPUT THE KEYWORD TAD KEYVAL /IS IT A BATCH CONTROL LANGUAGE COMMAND? TAD (-14 SMA SZA CLA JMP KEYOUT L7777 /FOUND A BCL CARD DCA BCLSW /GENERATE "$END" BEFORE CLOSING FILE CIF CDF F1 JMP I (BCLTRA /YES - HANDLE THAT SPECIALLY KEYOUT, JMS I (LNOUT /SEND LINE NUMBER TAD KEYADR TAD KEYVAL DCA TEMP1 TAD I TEMP1 /GET ADDRESS OF KEYWORD SNA JMP KEYBAD /IF ZERO - UNUSED KEYWORD DCA TEMP1 /ELSE SAVE IT TAD TEMP1 /IS THIS "INPUT" OR "PRINT TAD (-BPRI2 /BEING FUDGED UNDER BASIC? SNA JMP NOSGN /PRINT - CHECK FOR NUMBER SIGN TAD (BPRI2-BINP2 SZA CLA JMP KEYOU5 /NONE - ALL'S WELL NOSGN, TAD (-40 /SET COUNT DCA TEMP3 NOSGN1, TAD I XRCDR /IS NEXT CHAR BLANK? SZA JMP NOSGN2 /NO - IS IT # ISZ TEMP3 JMP NOSGN1 JMP NOSGN3 /REST IS BLANK NOSGN2, TAD (-NOCHR /IS IT "#"? SZA CLA JMP NOSGN3 /NO TAD TEMP1 /YES - USE "INPUT" OR "PRINT" TAD (-BPRI2 SZA CLA TAD (BINP-BPRI TAD (BPRI DCA TEMP1 NOSGN3, TAD (CDRBUF+7 DCA XRCDR KEYOU5, JMS I (UNPACK /AND OUTPUT KEYWORD KEYBLK, TAD (" /INSERT BLANK AFTER KEYWORD OUT JMP I (TEXTRA PAGE UNPACK, 0 /OUTPUT PACKED 6-BIT ASCII TEXT TAD I TEMP1 /IS FIRST CHAR = 00? AND (7700 SZA CLA JMP KEYOU1 /NO - NORMAL 6-BIT TRANSLATE TAD (211 /YES - THIS IS TAB RATHER THAN END OUT /OUTPUT IT JMP KEYOU3 /AND GET SECOND CHARACTER KEYOU1, TAD I TEMP1 /GET FIRST CHARACTER CLL RTR RTR RTR JMS KEYOU2 /AND OUTPUT IT KEYOU3, TAD I TEMP1 /GET SECOND CHARACTER JMS KEYOU2 /AND OUTPUT IT ISZ TEMP1 /POINT TO NEXT TWO CHARACTERS JMP KEYOU1 /ETC. KEYOU2, 0 AND (77 /MASK FOR THE LOW ORDER BITS SNA JMP I UNPACK /CHARACTER IS 00 - END OF KEYWORD TAD (-37 /<CR>? SNA TAD (215-337 /THIS WILL BE 215 WHEN WE'RE DONE SPA TAD (100 TAD (237 OUT /OUTPUT THE CHARACTER JMP I KEYOU2 TTYOUT, 0 /USE UNPACK ROUTINE TO PRINT MESSAGE ON TTY TAD (TOUT /SWITCH OUTPUT ROUTINES DCA OUTAD JMS UNPACK TAD (XOUT /RESET OUTPUT ROUTINES DCA OUTAD JMP I TTYOUT /RETURN LNOUT, 0 /OUTPUT THE LINE NUMBER SAVFLD;LNCIF TAD LNCNT /GET NUMBER OF CHARS CMA DCA TEMP1 TAD (CDRBUF /START WITH COLUMN 2 DCA XR2 LNOUT1, ISZ TEMP1;SKP /MORE DIGITS? JMP LNOUT2 /NO TAD I XR2;OUT JMP LNOUT1 LNOUT2, TAD LNCNT /ANY DIGITS? SNA CLA JMP LNCIF TAD (" ;OUT /YES - SUFFIX A BLANK LNCIF, 0 JMP I LNOUT PAGE /TRANSLATE TEXT TEXTRA, DCA CONFLG /CLEAR CONTINUATION FLAG DCA TEMP1 /CLEAR COUNT OF BLANK CHARACTERS TAD (-40 /32 COLUMNS OF TEXT (DECIMAL) DCA TEMP3 TEXLP1, TAD I XRCDR SNA /BLANK? JMP TEXBLK /YES - COUNT A BLANK TAD (-CONTCH /CONTINUATION CHARACTER? SNA JMP TEXCON /YES - ENOUGH OF THIS CARD TAD (CONTCH CONVRT /TRANSLATE THE CHARACTER JMP TEXLP2 /RUBOUT? - GET THE NEXT CHARACTER DCA TEMP2 /SAVE THE CHARACTER JMS TEXBOU /OUTPUT THE COUNTED BLANKS TAD TEMP2 OUT /OUTPUT THE CHARACTER TEXLP2, ISZ TEMP3 /COUNT COLUMNS JMP TEXLP1 TAD (215 /OUTPUT A <CR> OUT JMP TEXFIN TEXCON, JMS TEXBOU CLA CMA DCA CONFLG /SET THE CONTINUATION FLAG JMP TEXFIN TEXBLK, ISZ TEMP1 /COUNT THE BLANKS JMP TEXLP2 /GET THE NEXT CHARACTER TEXBOU, 0 /OUTPUT BLANKS TAD TEMP1 CMA DCA TEMP1 TEXBO1, ISZ TEMP1 /MORE BLANKS SKP JMP I TEXBOU /NO - RETURN TAD (" /YES - OUTPUT A BLANK OUT JMP TEXBO1 TEXFIN, TAD ERRFLG /DID THIS CARD HAVE AN ERROR? SZA CLA ISZ ERRCNT /YES - COUNT IT JMP I (READY /PROCESS NEXT CARD /CARD CODE TO ASCII CONVERSION ROUTINE XCONVR, 0 /INPUT 12 BIT CARD CODE - OUTPUT 8 BIT ASCII SAVFLD;XCOCIF /SAVE DATA FIELD FOR RETURN DCA CONVR1 /SAVE 12 BIT CARD CODE TAD (RUBOUT AND CONVR1 TAD (-RUBOUT SNA CLA /WAS CHARACTER RUBBED OUT? JMP XCOCIF /YES - RETURN 0 IN AC ISZ XCONVR /NOT RUBBED OUT - SKIP RETURN TAD CONVR1 RTL RTL AND (7 /GET ZONE BITS CLL RAL DCA CONVR2 /2*ZONE BITS TAD CONVR2 RTL TAD CONVR2 /10*ZONE BITS DCA CONVR2 TAD CONVR1 RTL RAL AND (7770 /1-9 "PUNCHES" SNA JMP CONVR3 /IF ALL OFF DON'T INCREMENT COUNT CLL RAL /SHIFT NEXT BIT INTO LINK ISZ CONVR2 /COUNT THE BIT SNL JMP .-3 /LOOP IF OFF SZA CLA JMP CONILL /IF REST OF AC IS NOT ZERO - ILLEGAL CHARACTER CONVR3, TAD CONVR2 /GET DISPLACEMENT OF CHAR IN TABLE CLL RAR /GET WORD DISPLACEMENT IN AC TAD (TRTAB /ADDRESS OF WORD DCA CONVR2 TAD I CONVR2 /GET WORD SZL JMP .+4 /IF DISPLACEMENT WAS ODD, USE LOW ORDER HALF OF WORD RTR RTR RTR AND (77 /MASK FOR LOW PART OF WORD SNA JMP CONVR4 /ZERO IN TABLE IS ILLEGAL CODE (MAYBE) TAD (240 JMP XCOCIF /RETURN WITH 8 BIT ASCII IN AC CONVR4, TAD CONVR1 /GET 12-BIT CARD CODE TAD (-TABCHR /IS IT A TAB CHAR? SNA JMP CONVR5 /YUP! TAD (TABCHR-FFCHR /HOW ABOUT A FORM FEED? SZA CLA JMP CONILL /NOPE - IT'S REALLY BAD TAD (214-211 /IT'S FORM FEED CONVR5, TAD (211 /IT'S TAB JMP XCOCIF CONILL, ERROR /SET ERROR FLAG; RETURN "?" IN AC XCOCIF, 0 JMP I XCONVR CONVR1, 0 CONVR2, 0 PAGE /OUTPUT A CHARACTER. RETURNS .+1 IF CHARACTER IS /JUST STORED IN BUFFER. RETURNS .+2 IF NO MORE SPACE IN /EMPTY. RETURNS .+3 IF BLOCK WAS WRITTEN AND THERE ARE /MORE BLOCKS IN THE EMPTY. XOUTP, 0 /OUTPUT ROUTINE ISZ OPTSW /THREE WAY SWITCH JMP XOUT1 DCA XOUT2 /SAVE CHAR IN TEMP L7777 TAD XROPT /BACK UP 2 WORDS DCA XOUT3 TAD XOUT2 /GET FIRST HALF OF CHARACTER RTL RTL AND K7400 TAD I XOUT3 /ADD IN FIRST CHARACTER DCA I XOUT3 ISZ XOUT3 TAD XOUT2 /GET SECOND HALF OF CHARACTER RTR RTR RAR AND K7400 TAD I XOUT3 /ADD IN SECOND CHARACTER DCA I XOUT3 ISZ OPTCNT /IS BUFFER FULL? JMP XOUT6 /NO - RETURN NORMALLY JMS I DEVENT /CALL DEVICE HANDLER 4200 /TWO PAGES OF OUTPUT FROM FIELD 0 OPTBUF /BUFFER ADDRESS OPTBLK, 0 /BLOCK NUMBER JMP OPTER4 /ERROR DOING OUTPUT ISZ OPTBLK /INCREMENT BLOCK NUMBER TAD (OPTBUF-1 /RESET BUFFER POINTER DCA XROPT TAD (-200 /AND BUFFER LENGTH /2 DCA OPTCNT ISZ XOUTP /SKIP RETURN IF BLOCK WRITTEN ISZ I (FILLEN /MORE BLOCKS IN EMPTY? ISZ XOUTP /YES - SKIP AGAIN XOUT6, L7775 /RESET 3-WAY SWITCH DCA OPTSW JMP I XOUTP /RETURN XOUT1, DCA I XROPT /SAVE CHARACTER IN BUFFER JMP I XOUTP XOUT2, 0 XOUT3, 0 XOUT, 0 DCA CLOSLN /SAVE CHAR IN A CONVENIENT TEMP TAD CLOSLN JMS XOUTP /OUTPUT THE CHARACTER SKP JMP OPTER5 /FILLED UP AVAILABLE SPACE BEFORE ^Z TAD CLOSLN /WAS IT <CR>? TAD (-215 SZA CLA JMP I XOUT /RETURN TAD (212 JMP XOUT+1 EOF, DCA KEYVAL /FINISH UP ANY BCL CARD IN PROGRESS DCA CONFLG /ZERO THESE TO GET US AROUND DCA LNCNT /THE TESTS IN BCLHUH CIF CDF F1 JMP I (BCLTRA EOF2, ISZ BCLSW /WERE THERE ANY BCL CARDS? JMP EOF1 /NO TAD (MEND /YES - SEND "$END" DCA TEMP1 JMS I (UNPACK EOF1, TAD (32 /^Z JMS XOUTP /OUTPUT CHAR JMP .-1 /BLOCK NOT YET FULL K7400, 7400 /BLOCK WRITTEN TAD I (BLOKNO /BLOCK WRITTEN CIA TAD OPTBLK /GET LENGTH OF FILE WRITTEN DCA CLOSLN /SET LENGTH FOR CLOSE ISZ USRFLG;SKP /IS USR IN CORE? JMP EOF3 /YES CIF 10;JMS I (7700;USRIN /BRING IN THE USR EOF3, L7777 /SET USR IN CORE FLAG DCA USRFLG TAD OFILE /GET DEVICE NUMBER CIF 10;USR;CLOSE CLOSNM, 0 /POINTER TO NAME CLOSLN, 0 /LENGTH OF FILE JMP OPTER6 TAD CLOSLN CIA RTL RTL AND (7760 /GET MINUS LENGTH IN BITS 0-7 CDF 10 TAD I (7617 DCA I (7617 /SET LENGTH AND DEVICE NO. FOR BATCH CDF JMP I (ERRDEC /CONVERT NUMBER OF ERRORS TO DECIMAL PAGE /CONVERT NUMBER OF CARDS IN ERROR TO DECIMAL AND TYPE MESSAGE ERRDEC, TAD (DECN-1 /START POWERS OF 10 AT 1000 DCA XR1 TAD (-4 DCA TEMP1 /FOUR POWERS OF 10 DCA TEMP5 /CLEAR LEADING ZEROES FLAG TAD ERRCNT /SET VALUE DCA TEMP4 TAD (TOUT /FUDGE OUTPUT CALL DCA OUTAD JMS CONDEC /CONVERT TO DECIMAL TAD (XOUT /RESTORE OUTPUT CALL DCA OUTAD TAD (NOMES /SET UP TO PRINT "NO" DCA TEMP1 TAD TEMP5 /DID WE PRINT A NUMBER? SNA CLA JMS I (TTYOUT /NO - PRINT "NO" TAD (CDMES /PRINT "CARDS IN ERROR" DCA TEMP1 JMS I (TTYOUT EOFJMP, JMP I (CD /DONE WITH THIS ONE - CALL COMMAND DECODER SYSNO /LOAD SYS: NUMBER FOR LOOKUP CIF 10;USR;LOOKUP BATBLK, BATNAM 0 JMP IOER8 TAD BATBLK DCA CHNBLK L0001 DCA I (JSBITS /KEEP USR ACROSS CHAIN CIF 10;USR;CHAIN /NOW CHAIN TO BATCH CHNBLK, 0 CONDEC, 0 /CONVERT A NUMBER TO DECIMAL SAVFLD;CONCIF /SAVE DATA FIELD FOR RETURN DIGLP, TAD I XR1 /GET THIS POWER OF 10 DCA TEMP2 /AND SAVE IT DCA TEMP3 /CLEAR THIS DIGIT DIGLP1, TAD TEMP4 /GET NUMBER TO BE CONVERTED TAD TEMP2 /DIVIDE BY SUBTRACTING SPA JMP DIGLP2 /WENT NEGATIVE - DONE ISZ TEMP3 /BUMP COUNT DCA TEMP4 /SAVE REDUCED VALUE JMP DIGLP1 DIGLP2, CLA TAD TEMP3 /GET VALUE OF THIS DIGIT SZA JMP DIGOUT /NOT A ZERO - PRINT IT TAD TEMP5 /IF ZERO - IS IT LEADING? SNA CLA JMP DIGLPE /YES - DON'T PRINT IT DIGOUT, ISZ TEMP5 /IF PRINTING, THEN ZEROES ARE NOT LEADING TAD (260 /CONVERT TO ASCII OUT DIGLPE, ISZ TEMP1 /LAST DIGIT? JMP DIGLP /NO - LOOP CONCIF, 0 JMP I CONDEC /RETURN TOUT, 0 /SEND A CHARACTER TO THE TTY TLS TSF JMP .-1 TAD (-215 /WAS THE CHARACTER <CR>? SZA CLA JMP I TOUT /NO - RETURN TAD (212 /YES - TYPE A LINE FEED JMP TOUT+1 IOERR1, CDF F0 CLA /TYPE ERROR MESSAGE TAD IOERR /GET NUMBER CLL RAL TAD (IOETAB-1 DCA XR1 TAD I XR1 /GET ADDRESS OF MESSAGE DCA TEMP1 DCA IOERR /CLEAR ERROR NUMBER JMS I (TTYOUT /PRINT IT TAD I XR1 /GO TO RESTART ADDRESS DCA TEMP1 JMP I TEMP1 PAGE OPTDEV, ZBLOCK 400 /TWO PAGES FOR DEVICE HANDLER OPTBUF, ZBLOCK 400 /TWO PAGES FOR OUTPUT BUFFER CDRBUF, DECIMAL;ZBLOCK 40;OCTAL BATNAM, TEXT "BATCH@SV";*.-1 MEND, TEXT "_$END_" NOMES, TEXT "NO" CDMES, TEXT " CARDS IN ERROR_" MSGJAM, TEXT "LOAD MORE CARDS OR TYPE ^Z_" IOEM1, TEXT "NO OUTPUT FILE SPECIFIED_" IOEM2, TEXT "CAN'T FETCH DEVICE HANDLER_" IOEM3, TEXT "CAN'T ENTER FILE_" IOEM4, TEXT "OUTPUT ERROR_" IOEM5, TEXT "FILE TOO BIG_" IOEM6, TEXT "CAN'T CLOSE FILE_" IOEM7, TEXT "CARD IN READER BACKWARDS. TYPE SPACE TO CONTINUE._" IOEM8, TEXT /"BATCH.SV" NOT ON SYS: - CAN'T CHAIN_/ VERM9, TEXT "MSBAT - VERSION 3B_@@@@@@" IOETAB, IOEM1;START IOEM2;START IOEM3;START IOEM4;START IOEM5;START IOEM6;START IOEM7;CDRJA1 IOEM8;7600 VERM9;START DECIMAL DECN, -1000 -100 -10 -1 OCTAL /CHARACTER CODE TRANSLATION TABLE TRTAB, /0 IN ROWS 12-0 0021 /?1 2223 /23 2425 /45 2627 /67 3031 /89 /1 2043 /0C 4651 /FI 5457 /LO 6265 /RU 7004 /X$ /2 1442 /,B 4550 /EH 5356 /KN 6164 /QT 6772 /WZ /3 3632 />: 0106 /!& 7540 /]@ 0000 /<FORM FEED> ? 0000 /?? /4 1641 /.A 4447 /DG 5255 /JM 6063 /PS 6671 /VY /5 3400 /<? 0000 /?? 0000 /?? 0000 /?? 0000 /?? /6 3303 /;# 0705 /'% 7337 /[? THE REAL ? 0077 /<TAB> _ 0000 /?? /7 7435 /\= 1315 /+- 1217 /*/ 7610 /^( 1102 /)" /BASIC KEYWORDS BDAT, TEXT "DATA" BCAL, TEXT "CALL" BCLO, TEXT "CLOSE" BDEF, TEXT "DEFINE" BCHN, TEXT "CHAIN" BDIM, TEXT "DIM" TEXT "NSION" BCHG, TEXT "CHANGE" BEND, TEXT "END" BEND2, TEXT "CLOSE #4\END" BFIL, TEXT "FILE" BGOS, TEXT "GOSUB" BIF, TEXT "IF" BINP, TEXT "INPUT" BINP2, TEXT "INPUT #3:" BLIS, TEXT "LIST" BNEX, TEXT "NEXT" BOLD, TEXT "OLD" BPRI, TEXT "PRINT" BPRI2, TEXT "PRINT #4:" BREA, TEXT "READ" BRES, TEXT "RESTORE" BRUN, TEXT "RUN" BFOR, TEXT "FOR" BGOT, TEXT "GOTO" BIFE, TEXT "IF END" BLET, TEXT "LET" BLIN, TEXT "LINPUT" BNEW, TEXT "NEW" BON, TEXT "ON" BRND, TEXT "RANDOM" BOV, TEXT "OVERLAY" BREP, TEXT "REPLACE" BUNS, TEXT "UNSAVE" BREM, TEXT "REMARK" BRET, TEXT "RETURN" BSAV, TEXT "SAVE" BSTO, TEXT "STOP" BSTO2, TEXT "CLOSE #4\STOP" /FORTRAN KEYWORDS FCMN, TEXT "@COMMON" FASN, TEXT "@ASSIGN" FCPX, TEXT "@COMPLEX" FBKS, TEXT "@BACKSPACE" FCNT, TEXT "@CONTINUE" FBKD, TEXT "@BLOCK DATA" FDTA, TEXT "@DATA" FCAL, TEXT "@CALL" FDEF, TEXT "@DEFINE FILE" FDO, TEXT "@DO" FEND, TEXT "@END" FEQU, TEXT "@EQUIVALENCE" FFOR, TEXT "@FORMAT" FGOT, TEXT "@GO TO" FINT, TEXT "@INTEGER" FPAU, TEXT "@PAUSE" FREAL, TEXT "@REAL" FREW, TEXT "@REWIND" FSBR, TEXT "@SUBROUTINE" FCMT, TEXT "C" /COMMENT FDIM, TEXT "@DIMENSION" FDBP, TEXT "@DOUBLE PRECISION" FEF, TEXT "@END FILE" FEXT, TEXT "@EXTERNAL" FFUN, TEXT "@FUNCTION" FIF, TEXT "@IF" FLOG, TEXT "@LOGICAL" FREAD, TEXT "@READ" FRET, TEXT "@RETURN" FSTO, TEXT "@STOP" FWRI, TEXT "@WRITE" BASKEY, /COLUMN 7 ROW BDEF /12 BIFE /11 BLET /0 BLIS /1 BNEW /2 BON /3 BOV /4 BRND /5 BREM /6 BRES /7 BRUN /8 BSTKEY, BSTO /9 /COLUMN 8 ROW BDIM /12 BINKEY, BINP /11 BLIN /0 BNEX /1 BOLD /2 BFIL /3 BPRKEY, BPRI /4 BREA /5 BREP /6 BRET /7 BSAV /8 BUNS /9 /COLUMNS 2-6 COLUMN ROW BCAL /2 12 BENKEY, BEND /2 11 BCLO /3 12 BFOR /3 11 BCHN /4 12 BGOS /4 11 BCHG /5 12 BGOT /5 11 BDAT /6 12 BIF /6 11 FORKEY, /COLUMN 7 /ROW FCAL /12 FDEF /11 FDO /0 FEND /1 FEQU /2 FFOR /3 FGOT /4 FINT /5 FPAU /6 FREAL /7 FREW /8 FSBR /9 /COLUMN 8 ROW FCMT /12 FDIM /11 FDBP /0 FEF /1 FEXT /2 FFUN /3 FIF /4 FLOG /5 FREAD /6 FRET /7 FSTO /8 FWRI /9 /COLUMN 2-6 COLUMN ROW 0 /2 12 0 /2 11 0 /3 12 FCMN /3 11 FASN /4 12 FCPX /4 11 FBKS /5 12 FCNT /5 11 FBKD /6 12 FDTA /6 11 FIELD 1 *17 OXR1, 0 OTEMP1, 0 CHAR, 0 PUTPNT, 0 GETPNT, 0 DATFTN, 0 /ADDRESS OF FORTRAN $RUN GETCHR=JMS I .;XGETCH PUTCHR=JMS I .;XPUTCH BCLIN=JMS I .;XBCLIN OPTION=JMS I .;XOPTIO MOV6=JMS I .;XMOV6 COLNAM=JMS I .;XCOLNA OUTNAM=JMS I .;XOUTNA ISIT=JMS I .;XISIT SEND=JMS I .;XSEND TSTCR=JMS I .;XTSTCR CDRTRA=JMS I .;BCLTRA+1 ISNUM=JMS I .;XISNUM OUT1=JMS I .;OOUT1 *200 /PUT A CHARACTER INTO A 6-BIT BUFFER PUTCH1=XGETCH PUTCH4=CON628 XPUTCH, 0 TAD (-215 /IF <CR>, IT BECOMES 37 SZA TAD (215-337 TAD (337 AND (77 /AND OFF 6 BITS DCA PUTCH1 /SAVE IT IN A TEMP TAD PUTPNT /GET POINTER TO CHARACTER IN 6-BIT BUFFER ISZ PUTPNT /AND BUMP POINTER CLL RAR /GET WORD DISPLACEMENT TAD I XPUTCH /ADD IN BASE ADDRESS ISZ XPUTCH /BUMP RETURN ADDRESS DCA PUTCH4 /SAVE ADDRESS OF WORD CONTAINING CHAR SZL /LINK HAS FIRST OR LAST HALF INDICATOR JMP PUTCH2 TAD PUTCH1 /FIRST HALF - ROTATE CHAR INTO HIGH BITS CLL RTL;RTL;RTL DCA PUTCH1 TAD I PUTCH4 /GET ANY CHARACTER ALREADY THERE AND (77 JMP PUTCH3 PUTCH2, TAD I PUTCH4 AND (7700 /GET CHARACTER ALREADY THERE PUTCH3, TAD PUTCH1 /ADD IN NEW CHARACTER DCA I PUTCH4 /STORE THEM BOTH JMP I XPUTCH /AND RETURN /GET A CHARACTER FROM A 6-BIT BUFFER XGETCH, 0 TAD XGETCH /MOVE RETURN ADDRESS TO CON628 DCA CON628 TAD GETPNT /GET POINTER TO CHARACTER ISZ GETPNT /BUMP IT FOR NEXT TIME JMP CON628+1 /ENTER CONVERSION ROUTINE /CONVERT 6-BIT ASCII TO 8-BIT /AC HAS POINTER TO CHARACTER /ARGUMENT IS BASE ADDRESS OF BUFFER CO628X=XGETCH CON628, 0 CLL RAR /GET WORD DISPLACEMENT IN AC TAD I CON628 /ADD BASE ADDRESS OF BUFFER ISZ CON628 /BUMP RETURN ADDRESS DCA CO628X /SAVE ADDRESS TAD I CO628X /GET WORD CONTAINING CHARACTER SZL /LINK HAS INDICATOR FOR FIRST OR LAST CHAR JMP .+4 RTR;RTR;RTR /FIRST CHAR - PUT IN LOW BITS AND (77 JMS XSEND3 /GET PROPER 8-BIT REPRESENTATION DCA CHAR /SAVE IT TAD CHAR /RETURN WITH IT IN AC JMP I CON628 /RETURN XSEND3, 0 TAD (-37 SNA TAD (215-337 SPA TAD (100 TAD (237 JMP I XSEND3 GETCDR, 0 CIF CDF F0 JMS I (GETCD1 /GET A CHAR FROM THE CDR BUFFER JMP I GETCDR OOUT1, 0 CIF CDF F0 JMS I (OOUT2 JMP I OOUT1 MOVODV, 0 DCA .+2 MOV6;0;BATOUT CIF F0 /RETURN DF=1 JMP I MOVODV XTSTCR, 0 GETCHR;BCLBUF TAD (-215 SNA CLA ISZ XTSTCR L7777 TAD GETPNT DCA GETPNT JMP I XTSTCR PAGE /SUBROUTINE OPTION WILL SCAN THE BATCH CONTROL LANGUAGE /BUFFER FOR OPTIONS SPECIFIED IN IT'S CALL. AN OPTION IS /RECOGNIZED AS ANY ITEM WHICH FOLLOWS A "/". IT'S NAME /IS COMPOSED OF ANY CHARACTERS OTHER THAN "/" , "," , /"=",OR <CR>. THE NAME IS TERMINATED BY ANY ONE OF THE /PREVIOUS DELIMITERS. IF IT IS TERMINATED BY A "=" AND /THE SUBROUTINE CALL INDICATES THAT IT EXPECTS A FILE NAME, /THEN THE FILE NAME FOLLOWS THE "=" AND IS TERMINATED BY A /"/" , "," , OR <CR>. THE SUBROUTINE CALL IS FOLLOWED BY A /POINTER TO A LIST OF ADDRESSES. THIS LIST IS TERMINATED BY /A ZERO ENTRY. EACH ENTRY POINTS TO AN OPTION CONTROL /BLOCK IN THE FOLLOWING FORM: / OPTION CONTROL WORD / (FILE NAME SPACE IF NEEDED - 6 WORDS) / TEXT "OPTION NAME" / /THE FORMAT OF THE OPTION CONTROL WORD IS AS FOLLOWS: / BIT 0: ON RETURN THIS BIT WILL BE SET IF / THE OPTION WAS FOUND, AND CLEARED / IF NOT / BIT1: ON RETURN THIS BIT IS SET IF A NAME / WAS GIVEN WITH THE OPTION / BIT 2: SET IF OPTION HAS ALLOCATED 6 WORDS / FOR A POSSIBLE FILE NAME. CLEARED / IF NOT / BITS 6-8: NUMBER OF CHARACTERS -1 OF SHORT / FORM OF OPTION / BITS 9-11: DIFFERENCE BETWEEN SIZES OF / SHORT AND LONG FORMS / THE SUM OF BITS 6-8 AND BITS 9-11 / SHOULD TOTAL THE LENGTH OF THE / LONG FORM-1 / /THE FILE NAME SPACE MAY BE INITIALIZED TO SOME DEFAULT /DEVICE, NAME, AND EXTENSION. / XOPTIO, 0 /TURN OFF ALL OPTIONS TAD I XOPTIO /GET ADDRESS OF LIST OF OPTION ADDRESSES DCA OPTLIS /SAVE IT OPTIO1, TAD I OPTLIS /GET OPTION ADDRESS ISZ OPTLIS /POINT TO NEXT ONE SNA JMP OPTIO2 /DONE TURNING OFF ALL OPTIONS DCA OPTCTL TAD I OPTCTL /GET OPTION CONTROL WORD AND (1777 /CLEAR FIRST BIT DCA I OPTCTL JMP OPTIO1 /LOOP /SEARCH BCL BUFFER FOR "/" OPTIO2, DCA GETPNT /START AT BEGINNING OF BATCH CONTROL LINE OPTIO3, GETCHR;BCLBUF /GET A CHARACTER FROM THE BUFFER ISIT /IS IT "/" OR <CR>? OPTIS3;OPTIS4-1 JMP OPTIO3 /NO - KEEP LOOKING OPTI3A, TAD GETPNT /YES - SAVE IT'S POSITION DCA OPTBEG TAD I XOPTIO /GET ADDRESS OF LIST AGAIN DCA OPTLIS /AND SAVE IT /FOUND A "/" - TRY ALL OPTIONS OPTIO4, TAD OPTBEG /START COMPARISON OF OPTION WITH CHARACTER AFTER "/" DCA GETPNT TAD I OPTLIS /GET ADDRESS OF OPTION CONTROL WORD ISZ OPTLIS /AND BUMP POINTER FOR NEXT TIME SNA /IS THE LIST ENDED? JMP I (OPTIER /YES - OPTION WAS INVALID DCA OPTCTL /NO - SAVE ADDRESS OF CONTROL WORD TAD I OPTCTL /GET CONTROL WORD RTL SPA CLA /DOES IT HAVE SPACE FOR A FILE NAME TAD (6 /YES - ADD SIZE OF THE SPACE TAD OPTCTL /ADD ADDRESS OF OPTION IAC /BUMP ONE FOR CONTROL WORD DCA OPTTEX /SAVE ADDRESS OF OPTION TEXT TAD I OPTCTL /GET LENGTH FOR UNIQUE OPTION FROM CONTROL WORD RAR;RTR AND (7 CMA /NEGATE IT (INCREMENTED BY ONE) DCA OPTCT1 /SAVE IN COUNTER DCA OPTCT2 /ZERO CHARACTER POSITION /COMPARE OPTION WITH CONTENTS OF BCL BUFFER OPTIO5, JMS OPTI6A SZA CLA /ARE THEY THE SAME? JMP OPTIO4 /NO - TRY NEXT OPTION ISZ OPTCT1 /HAVE WE SUCCEEDED FAR ENOUGH FOR IT TO BE UNIQUE? JMP OPTIO5 /NO - KEEP COMPARING TAD GETPNT /SAVE CURRENT BUFFER POSITION DCA OPTTM2 TAD I OPTCTL /GET REMAINING LENGTH FROM CONTROL WORD AND (7 CMA DCA OPTCT1 OPTIO6, ISZ OPTCT1 /DONE WITH REMAINING CHARACTERS? SKP JMP OPTIO7 /YES - SUCCESS JMS OPTI6A SNA CLA /ARE THEY THE SAME? JMP OPTIO6 /YES - KEEP GOING TAD OPTTM2 /NO - MOVE POINTER BACK TO SHORT FORM DCA GETPNT JMP OPTIO7 OPTI6A, 0 TAD OPTCT2 ISZ OPTCT2 JMS I (CON628 OPTTEX, 0 CIA DCA OPTTM1 GETCHR;BCLBUF TAD OPTTM1 JMP I OPTI6A OPTRET, ISZ XOPTIO /INCREMENT RETURN ADDRESS DCA GETPNT /SET POINTER TO BEGINNING OF BUFFER JMP I XOPTIO OPTLIS, 0 OPTCTL, 0 OPTBEG, 0 OPTCT1, 0 OPTCT2, 0 OPTTM1, 0 OPTTM2, 0 /TEST DELIMITER AFTER OPTION OPTIO7, GETCHR;BCLBUF /GET NEXT BUFFER CHARACTER ISIT /IS IT "=", "," ,"/", OR <CR>? OPTIS1;OPTIS2-1 JMP I (OPTIER /NONE OF THESE OPTIO8, TAD I OPTCTL /YES - GET CONTROL WORD RTL SMA CLA /DOES IT TAKE A FILE NAME? JMP I (OPTIER /NO - ERROR TAD OPTCTL /GET ADDRESS OF FILE NAME SPACE IAC DCA .+2 COLNAM /AND COLLECT A NAME INTO IT OPTTM3, 0 JMP I (OPTIER /ERROR RETURN TAD I OPTCTL /TURN ON NAME BIT AND (1777 TAD (2000 DCA I OPTCTL OPTIO9, TAD I OPTCTL /GET CONTROL WORD AND (3777 TAD (4000 /TURN ON OPTION FOUND BIT DCA I OPTCTL JMP I (OPTI10 PAGE /ON ERROR, REPORT IT OPTIER, TAD I (OPTBEG /OPTION BEGINS AT THIS POSITION JMS OUTERR /OUTPUT THE ERROR OPTERM /SQUISH THE CURRENT OPTION OUT OF BCL BUFFER OPTI10, L7777 /BACK UP OVER "/" TAD I (OPTBEG /POINT TO BEGINNING OF OPTION JMS BCLSQU /SQUISH OUT THIS OPTION L7777 TAD I (OPTBEG JMP I (OPTIO2 /GO LOOK FOR MORE OPTIONS /SQUISH OUT A PORTION OF THE BCL BUFFER / TAD X /POSITION OF FIRST CHAR OF SQUISH / JMS BCLSQU /GETPNT POINTS TO FIRST CHAR SURE TO BE KEPT AFTER /SQUISH CHARS. ONE CHAR PRECEDING IT IS TESTED, /AND IS KEPT IF IT IS A "/" OR <CR> BCLSQU, 0 DCA PUTPNT /AC POINTS TO BEGINNING OF AREA TO BE SQUISHED TAD PUTPNT /SAVE THE POINTER DCA OUTERR L7777 TAD GETPNT DCA GETPNT /TEST LAST CHAR OF STUFF TO BE SQUISHED GETCHR;BCLBUF ISIT /IS IT "/", OR <CR>? BCLIS1;BCLIS2-1 BCLSQ1, GETCHR;BCLBUF /GET A CHAR TAD (-215 /IS IT <CR>? SNA CLA JMP BCLSQ3 /YES - DONE BCLSQ2, TAD CHAR /RESTORE CHAR PUTCHR;BCLBUF /PUT THE CHAR IN THE BUFFER JMP BCLSQ1 /GET ANOTHER CHAR BCLSQ3, TAD (215 /PUT A <CR> PUTCHR;BCLBUF TAD OUTERR /RESTORE POINTER DCA GETPNT JMP I BCLSQU /RETURN /SEND AN ERROR MESSAGE INCLUDING PART OF THE BCL BUFFER /TO THE OUTPUT BUFFER / TAD X /POSITION OF FIRST CHAR IN BUFFER TO BE SENT / JMS OUTERR / A /ADDRESS OF ERROR MESSAGE TO PRECEDE IT / /SIX-BIT ASCII OUTERR, 0 DCA GETPNT /SET BEGINNING OF BCL LINE TO OUTPUT TAD I OUTERR /GET ERROR MESSAGE ADDRESS ISZ OUTERR SEND /PRINT IT OUTER1, GETCHR;BCLBUF /GET A CHARACTER ISIT /IS IT "," ,"/", OR <CR>? OUTIS1;OUTIS2-1 TAD CHAR /NO - SEND CHAR OUT1 JMP OUTER1 OUTER2, TAD (215 OUT1 JMP I OUTERR /RETURN /TEST A CHAR AND JUMP IF IN LIST / JMS XISIT / A1 /ADDRESS OF LIST OF NEGATIVE OF CHARS / /TERMINATED BY A POSITIVE OR ZERO / A2-1 /ADDRESS -1 OF LIST OF / /TRANSFER ADDRESSES XISIT, 0 DCA ISIT1 /SAVE CHAR TAD I XISIT /GET LIST OF CHARS ISZ XISIT DCA ISIT2 TAD I XISIT /GET LIST OF ADDRS - 1 ISZ XISIT DCA ISIT3 ISIT4, TAD I ISIT2 /GET THE NEXT CHAR ISZ ISIT2 ISZ ISIT3 SMA JMP ISIT5 /END OF LIST SIGNALLED BY ENTRY>=0 TAD ISIT1 /IS IT THE CHAR? SZA CLA JMP ISIT4 /NO - TRY THE NEXT TAD I ISIT3 /GET SEND ADDRESS DCA XISIT ISIT5, CLA JMP I XISIT ISIT1, 0 ISIT2, 0 ISIT3, 0 PAGE /COLLECT A NAME FROM THE BUFFER / JMS XCOLNA / X /ADDRESS OF SPACE TO RECEIVE NAME / JMP ERR /INVALID NAME XCOLNA, 0 TAD I XCOLNA DCA .+3 MOV6;ZER6;0 TAD I XCOLNA /ARGUMENT IS ADDRESS TO PUT NAME ISZ XCOLNA DCA COLPU1+2 /SAVE IT FOR USE AS PUTCHR ARG L7776 /SET NAME - EXTENSION SWITCH FOR NAME DCA COLSW TAD (COLIS1 /SET TO COLLECT ANYTHING DCA COLIS3 /I.E. DEVICE, FILE, OR EXTENSION TAD (COLIS2-1 DCA COLIS3+1 TAD GETPNT /SAVE POINTER TO BEGINNING OF NAME DCA COLNP1 COLGE1, TAD GETPNT /SAVE POINTER TO BEGINNING OF SECTION DCA COLNP2 /OF NAME COLGE2, GETCHR;BCLBUF /GET A CHAR ISIT /IS IT ":",".","/", "," , OR <CR>? COLIS3, 0;0 JMP COLGE2 COLDEV, JMS COLMOV;0;-4-1 /MOVE 4 CHARS TO POSITION 0 ISZ COLIS3 /REMOVE ":" FROM LIST ISZ COLIS3+1 JMP COLGE1 /COLLECT NEXT PART OF NAME COLFIL, JMS COLMOV;4;-6-1 /MOVE 6 CHARS TO POSITION 4 ISZ COLSW /NEXT TIME COLLECT EXTENSION TAD (COLIS1+2 /REMOVE "." FROM LIST DCA COLIS3 TAD (COLIS2+1 DCA COLIS3+1 JMP COLGE1 /COLLECT NEXT PART OF NAME COLEXT, ISZ COLSW /ARE WE COLLECTING NAME OR EXTENSION? JMP COLEX1 /NAME JMS COLMOV;12;-2-1 /MOVE 2 CHARS TO POSITION 12 JMP COLEX2 COLEX1, JMS COLMOV;4;-6-1 /MOVE 6 CHARS TO POSITION 4 COLEX2, ISZ XCOLNA /NO ERRORS JMP COLEX3 COLERR, CLA TAD COLNP1 /POINT TO BEGINNING OF NAME JMS I (OUTERR /SEND IT AS ERROR MESSAGE COLERM COLEX3, TAD COLNP1 /POINT TO BEGINNING OF NAME JMS I (BCLSQU /SQUISH IT OUT JMP I XCOLNA /RETURN COLMOV, 0 TAD I COLMOV /FIRST ARG IS POSITION ISZ COLMOV DCA PUTPNT TAD I COLMOV /SECOND ARG IS COUNT ISZ COLMOV DCA COLCT1 TAD CHAR /GET DELIMITER CIA DCA COLCH1 /SAVE FOR TEST TAD CHAR TAD (-"Z DCA COLCH2 /ANOTHER TEST TAD COLNP2 /POINT TO BEGINNING OF THIS PART DCA GETPNT COLMV1, GETCHR;BCLBUF /GET NEXT CHAR TAD COLCH1 /SUBTRACT THE DELIMITER SNA JMP I COLMOV /DELIMITER - WE'RE DONE TAD COLCH2 /CHAR-"Z" SMA SZA JMP COLERR /NOT ALPHA-NUMERIC TAD ("Z-"A SMA JMP COLPUT /ALPHABETIC TAD ("A-"9 SMA SZA JMP COLERR /NOT NUMERIC TAD ("9-"0 SPA JMP COLERR /NOT NUMERIC COLPUT, CLA ISZ COLCT1 /HAVE WE USED UP OUR COUNT? JMP COLPU1 /NO - PUT THE CHAR L7777 /YES - SET COUNTER TO SKIP DCA COLCT1 JMP COLMV1 /GET NEXT CHAR COLPU1, TAD CHAR PUTCHR;0 /PUT THE CHAR IN THE USER SPACE JMP COLMV1 /GET THE NEXT CHAR COLSW, 0 /FILE NAME OR EXTENSION SWITCH COLNP1, 0 /POINTER TO BEGINNING OF NAME COLNP2, 0 /POINTER TO BEGINNING OF NAME PART COLCH1, 0 /TEMP LOC FOR COLMOV COLCH2, 0 /DITTO COLCT1, 0 /DITTO PAGE XMOV6, 0 TAD I XMOV6 /GET "FROM" ADDRESS ISZ XMOV6 DCA MOV61 TAD I XMOV6 /GET "TO" ADDRESS ISZ XMOV6 DCA MOV62 TAD (-6 DCA MOV63 MOV64, TAD I MOV61 DCA I MOV62 ISZ MOV61 ISZ MOV62 ISZ MOV63 JMP MOV64 JMP I XMOV6 /RETURN MOV61, 0 MOV62, 0 MOV63, 0 XBCLIN, 0 DCA PUTPNT /START AT BEGINNING OF BCL BUFFER JMS I (SENDKY /SEND THE KEYWORD DCA MOV61 /CLEAR THE BLANK COUNTER BCLIN5, JMS BCLIN3 /GET NEXT CARD AND PUT IT INTO BCL BUFFER JMP BCLIN7+2 /CARD NOT CONTINUED - DONE CIF F0 JMS I (CDRIN /READ ANOTHER CARD JMP BCLIN7+2 /EOF TAD (-10 DCA BCLIN4 BCLIN6, JMS I (GETCDR /GET FIRST 8 CHARS SZA CLA /TEST FOR ZERO JMP BCLIN7 /NON-ZERO - ERROR ISZ BCLIN4 JMP BCLIN6 JMP BCLIN5 /OK - PUT IT IN BUFFER BCLIN7, CDF F0 DCA I (CDRFLG /SET CDRIN TO RETURN THIS CARD AGAIN CDF F1 TAD (215 /PUT A <CR> PUTCHR;BCLBUF TAD (215;OUT1 DCA GETPNT /SET POINTER TO BEGINNING JMP I XBCLIN /RETURN BCLIN4, 0 BCLIN3, 0 TAD (-40 DCA BCLIN4 BCLIN9, JMS I (GETCDR /GET NEXT CDR CHAR SNA JMP BCLI13 /BLANK TAD (-CONTCH SNA JMP BCLI10 /CONTINUATION TAD (CONTCH CIF F0 JMS I (XCONVR JMP BCLIN8 /RUBOUT DCA XMOV6 /SAVE THE CHAR JMS BCLI14 /SEND THE BLANKS TAD XMOV6 OUT1 /SEND IT TAD XMOV6 PUTCHR;BCLBUF /PUT IT TAD PUTPNT TAD (-BCLSIZ^2+2 /BCL BUFFER FULL? SMA CLA JMP BCLI11 /FULL - ERROR BCLIN8, ISZ BCLIN4 /COUNT COLUMNS JMP BCLIN9 /LOOP JMP I BCLIN3 BCLI10, ISZ BCLIN3 /SKIP RETURN FOR CONTINUATION DCA MOV61 /CLEAR THE BLANK COUNTER SEND;BCL10E /"_$" TAD (211;OUT1 /<TAB> JMP I BCLIN3 /RETURN BCLI11, SEND;BCL11E /SEND ERROR BCLI12, CIF F0 JMS I (CDRIN /GET THE NEXT CARD JMP BCLIN7+2 JMS I (GETCDR /GET THE NEXT COLUMN DCA BCLIN4 /SAVE THIS COLUMN TAD (JOBBIT /IS THIS A $JOB CARD? AND BCLIN4 SNA CLA JMP BCLI12 /NO - FLUSH TO $JOB TAD (-JOBBIT-1 AND BCLIN4 SZA CLA JMP BCLI12 JMP BCLIN7 /YES - DONE BCLI13, ISZ MOV61 /ANOTHER BLANK JMP BCLIN8 BCLI14, 0 TAD MOV61 CMA DCA MOV61 BCLI15, ISZ MOV61;SKP JMP I BCLI14 TAD (" ;OUT1 JMP BCLI15 PAGE BCLTRA, JMP I .+1 /GO FINISH UP LAST BCL COMMAND BCLHUH /HUH? - I.E. WHICH COMMAND WAS IT? CIF CDF F0 JMP I (TEXFIN /TO COPY A DECK UNTIL THE NEXT BCL /COMMAND - JMS BCLTRA+1 BCLHU1, 0 /JMS HERE WITH ARG = TRANSFER ADDRESS TAD I BCLHU1 /GET TRANSFER ADDRESS DCA BCLHU1 TAD (BCLHUH /ON NEXT BCL CARD - NOTHING TO FINISH DCA BCLTRA+1 CIF CDF F0 /FIELD 0! JMP I BCLHU1 /GO GO GO BCLHUH, CDF F0 TAD I (KEYVAL /GET KEYWORD VALUE CDF F1 TAD (BCLGO /USE IT TO GET TRANSFER ADDRESS DCA OTEMP1 TAD I OTEMP1 DCA OTEMP1 CDF F0 TAD I (CONFLG /WAS LAST CARD CONTINUED? CDF F1 SZA CLA JMS BCLHU2 /YES - ERROR CDF F0 TAD I (LNCNT /DID THIS CARD HAVE A LINE NUMBER? CDF F1 SNA CLA JMP I OTEMP1 /YES - GO TO IT! CIF CDF F0 JMS I (LNOUT /OUTPUT THE LINE NUMBER JMS BCLHU2 /WHAT'S IT DOING WITH A NUMBER ANYWAY? JMP I OTEMP1 /NOW WE GO. BCLHU2, 0 CDF F0 ISZ I (ERRFLG CDF F1 SEND;BCLHM1 /"?_" JMP I BCLHU2 BCLEOF, JMS BCLHU1;EOF2 CERR, JMS BCLHU1;KEYBAD XOUTNA, 0 TAD I XOUTNA /GET ADDRESS OF NAME ISZ XOUTNA DCA OUTNA2 TAD GETPNT /SAVE BUFFER INPUT POINTER DCA OUTNA6 DCA OUTNA3 /SET FLAG FOR NO NAME JMS OUTNA4;0;-4 /SEND 4 CHARS FROM POSITION 0 TAD OUTNA3 SNA CLA JMP .+3 /NO DEVICE - NO ":" TAD (": OUT1 JMS OUTNA4;4;-6 /SEND 6 CHARS FROM POSITION 4 TAD (12 /SET UP TO GET EXTENSION DCA GETPNT JMS OUTNA1 /GET FIRST CHAR JMP OUTNA5 /NO EXTENSION CLA TAD (". OUT1 JMS OUTNA4;12;-2 /SEND 2 CHARS FROM POSITION 12 OUTNA5, TAD OUTNA6 /RESTORE BUFFER INPUT POINTER DCA GETPNT JMP I XOUTNA OUTNA1, 0 GETCHR OUTNA2, 0 TAD (-300 /IS IT NULL? SNA JMP I OUTNA1 /YES - DONE ISZ OUTNA1 /SKIP RETURN TAD (300 JMP I OUTNA1 OUTNA3, 0 /NAME PRESENT SWITCH OUTNA4, 0 TAD I OUTNA4 /GET CHAR POSITION ISZ OUTNA4 DCA GETPNT TAD I OUTNA4 /GET NO OF CHARS ISZ OUTNA4 DCA OUTN41 OUTN42, JMS OUTNA1 /GET A CHAR JMP I OUTNA4 /NULL - DONE OUT1 ISZ OUTNA3 /SET NAME PRESENT ISZ OUTN41 JMP OUTN42 JMP I OUTNA4 /DONE - RETURN OUTN41, 0 OUTNA6, 0 PAGE XSEND, 0 SZA /IF AC =0, ADDRESS IS ARG OF CALL JMP XSEND4 TAD I XSEND /GET MESSAGE ADDRESS ISZ XSEND XSEND4, DCA OTEMP1 XSEND1, TAD I OTEMP1 CLL RTR;RTR;RTR JMS XSEND2 TAD I OTEMP1 JMS XSEND2 ISZ OTEMP1 JMP XSEND1 XSEND2, 0 AND (77 SNA JMP I XSEND /NULL ENDS MESSAGE JMS I (XSEND3 /GET 8-BIT REPRESENTATION OUT1 JMP I XSEND2 MAKNAM, 0 TAD (DECN /START CONVERSION AT 100 CDF F0 DCA I (XR1 L7775 /CONVERT 3 DIGITS DCA I (TEMP1 ISZ NAMCNT /BUMP NAME COUNTER TAD NAMCNT DCA I (TEMP4 L0001 DCA I (TEMP5 /SAVE LEADING ZEROES TAD (MAKNA2 DCA I (OUTAD CDF F1 TAD I MAKNAM /MOVE DEFAULT NAME TO OUTPUT AREA DCA .+3 MOV6;FILNAM;0 TAD I MAKNAM ISZ MAKNAM DCA MAKNA3+2 TAD (7 /PUT NUMBER AT POSITION 7-9 DCA PUTPNT CIF F0 JMS I (CONDEC /OUTPUT NUMBER TAD (XOUT /RESTORE OUTPUT ROUTINE CDF F0 DCA I (OUTAD CDF F1 JMP I MAKNAM /RETURN MAKNA3, 0 PUTCHR;0 CIF CDF F0 JMP I MAKNA3 NAMCNT, 0 XISNUM, 0 TAD (-"9 SMA SZA JMP XISNU1 TAD ("9-"0 SMA ISZ XISNUM XISNU1, CLA JMP I XISNUM SAVNAM, 0 TAD SAVPNT DCA SAV1+2 /PUT NAME IN LIST TAD SAVPNT TAD (-SAVTOP /ARE WE AT TOP OF LIST? SNA JMP I SAVNAM /YES - DON'T SAVE NAME TAD (SAVTOP+6 DCA SAVPNT /ADVANCE POINTER FOR NEXT TIME TAD I SAVNAM /GET NAME TO SAVE DCA SAV1+1 ISZ SAVNAM SAV1, MOV6;0;0 JMP I SAVNAM SAVPNT, SAVARA /POINT TO SAVE AREA UNSNAM, 0 TAD I UNSNAM ISZ UNSNAM DCA UNSNA1+2 /POINT TO SPACE TO RECEIVE NAME TAD SAVPNT TAD (-6-SAVARA SPA JMP UNSNA2 /EMPTY - RETURN TAD (SAVARA DCA SAVPNT /BACK UP TAD SAVPNT DCA UNSNA1+1 /SET ADDRESS FROM WHICH NAME WILL COME UNSNA1, MOV6;0;0 ISZ UNSNAM /SKIP RETURN UNLESS EMPTY UNSNA2, CLA JMP I UNSNAM PAGE / / / $DECK / / CDECK, BCLIN /GET THE LINE OPTION;CDEOPT /ANALYZE THE OPTIONS TSTCR /END OF LINE? JMP CDECK1 /NO - GET A NAME CDECK3, MOV6;CDEDEF;NAME1 /YES - MOVE DEFAULT NAME JMP CDECK2 CDECK1, COLNAM;NAME1 /COLLECT A NAME JMP CDECK3 /FAIL - BAD NAME CDECK2, SEND;CDEM1 /".R PIP_*" OUTNAM;NAME1 /SEND THE NAME SEND;CDEM2 /"<BAT:_" TAD I (OPFOR /WAS "/FOR" SPECIFIED? SMA CLA TAD (BASKEY-FORKEY /NO - USE BASIC TAD (FORKEY-15 CDF F0 DCA I (KEYADR CDF F1 CDRTRA /TRANSLATE THE CARDS SEND;CMEOD /"$EOD_" TAD I (OPNOL /WAS "/NOLIST" SPECIFIED? SPA CLA JMP I (BCLHUH /YES - DONE TAD ("*;OUT1 JMS I (PIPOUT;BATOUT /SEND NAME OF LISTING DEVICE TAD ("<;OUT1 OUTNAM;NAME1 /SEND NAME OF FILE TAD (215;OUT1 JMP I (BCLHUH / / / $BASIC / / CBAS, BCLIN /GET BCL LINE OPTION;CBAOPT /ANALYZE OPTIONS TSTCR /END OF LINE? JMP CBAS2 /NO - GET NAME CBAS1, MOV6;CBATK;NAME1 /MOVE IN BAT: SEND;CBAM1 /.R PIP *PROG.BA< OUTNAM;NAME1 /SEND NAME JMP CONT CBAS2, COLNAM;NAME1 /COLLECT THE NAME JMP CBAS1 /FAIL - USE DEFAULT CBAS3, SEND;CBAM1 /".R PIP_*PROG.BA<" SEND;CBAM6 CONT, TAD (215;OUT1 CBAS5, JMP CBAS7 /SET OR CLOBBERED IN INIT TAD (211;OUT1 SEND;CBAM3 /'FILE #0,"DATA.DA"\FILEV #1,"' OUTNAM;BATOUT /"TTY:" OR "LPT:" SEND;CBAM4 /'"_' CBAS7, TAD (BASKEY-15 CDF F0 DCA I (KEYADR /SET KEYWORD LIST CDF F1 CDRTRA /TRANSLATE CARDS SEND;CMEOD /"$EOD_" SEND;CBAM7 SEND;CBAM5 OUTNAM;NAME1 SEND;CBAM8 TAD I (OPNOL /WAS "/NOLIST SPECIFIED?" SPA CLA JMP CBAS4 SEND /SEND AN EOD (MH) CMEOD /(MH) SEND /SEND AN .R PIP * (MH) CDEM1 /(MH) JMS I (PIPOUT;BATOUT SEND;CBAM2 /"<PROG.BA_" CBAS4, TAD (DATBAS DCA I (DATADR /SET "$DATA" ROUTINE JMP I (BCLHUH /DONE / / / $RUN (AFTER $BASIC) / / DATBAS, BCLIN OPTION;ZER6 /NO OPTIONS SEND;DATBM1 /".R PIP_*DATA.DA<BAT:_" CDRTRA /TRANSLATE THE CARDS SEND;DATBM2 /"$EOD_.R BCOMP_*PROG.BA_" TAD DATFTN /$RUN IS FORTRAN NOW DCA I (DATADR JMP I (BCLHUH /DONE PAGE / / / $FORTRAN (FORTRAN IV) / / CF4, BCLIN /GET BCL LINE OPTION;CF4OPT /ANALYZE OPTIONS TSTCR /END OF LINE? JMP CF42 CF41, JMS I (MAKNAM;NAME1 /YES - MAKE A NAME JMP CF43 CF42, COLNAM;NAME1 /NO - COLLECT A NAME JMP CF41 /BAD NAME - MAKE ONE CF43, SEND;CF4M1 /".R PIP_*" OUTNAM;NAME1 /SEND THE NAME TAD ("<;OUT1 TAD I (OPSRC;RAL /WAS A SOURCE FILE GIVEN SMA CLA JMP CF44 /NO OUTNAM;OPSRC+1 /YES - SEND IT TAD (215;OUT1 JMP CF45 CF44, SEND;CF4M2 /"BAT:_" CF45, TAD (FORKEY-15 /FORTRAN CARDS CDF F0 DCA I (KEYADR CDF F1 CDRTRA /TRANSLATE THE CARDS SEND;CF4M3 /"$EOD_.R F4_*" OUTNAM;NAME1 TAD I (OPNOL /WAS "/NOLIST" SPECIFIED? SPA CLA JMP CF46 /YES - DON'T GENERATE LIST FILES TAD (",;OUT1 TAD I (OPLIS RAL SPA CLA /WAS A NAME GIVEN? JMP CF47 /YES - GET IT MOV6;BATOUT;OPLIS+1 /NO - GIVE LIST DEV CF47, OUTNAM;OPLIS+1 /SEND NAME OF LISTING FILE CF46, TAD ("<;OUT1 OUTNAM;NAME1 TAD I (OPRALF /PRODUCE RALF LISTING? SMA CLA JMP CF48 /NO SEND;CF4M4 /"/F" CF48, TAD (215;OUT1 TAD (DATF4 DCA I (DATADR /SET "$DATA" ADDRESS JMS I (SAVNAM;NAME1 /SAVE NAME FOR "$LOAD" JMP I (BCLHUH /DONE / / / $RUN (FORTRAN II) / / DATF2, BCLIN JMS I (CL2S /DO $LOAD STUFF JMP DATL21 DATL2, BCLIN OPTION;ZER6 /NO OPTIONS IF ALREADY LOADED JMP DATL21 DATX2, BCLIN JMS I (DATNAM /GET A NAME TAD I (NAMELD /WAS A DEVICE SPECIFIED? SZA CLA JMP DATL21 /YES TAD (0423 /NO - USE "DSK" DCA I (NAMELD TAD (1300 DCA I (NAMELD+1 DATL21, SEND;DTF2M1 /".RUN " OUTNAM;NAMELD TAD (215;OUT1 CDRTRA /WITH GENIOX, INPUT IS FROM BATCH STREAM SEND;CMEOD /"$EOD_" TAD DATFTN /$DATA IS NOW FORTRAN DCA I (DATADR JMP I (BCLHUH PAGE / / / $LOAD (FORTRAN IV) / / /THIS SUBROUTINE IS USED WITH EITHER A $LOAD OR $RUN CL4S, 0 OPTION;CL4OPT /ANALYZE OPTIONS SEND;CL4SM1 /".R LOAD_*" TAD I (OPIMAG /WAS "/IMAGE" FILE SPECIFIED RAL SMA CLA JMP CL4S1 /NO MOV6;OPIMAG+1;NAMELD /YES - MOVE NAME JMP CL4S2 CL4S1, MOV6;CL4DEF;NAMELD /USE DEFAULT NAME CL4S2, OUTNAM;NAMELD /SEND THE NAME OF THE IMAGE FILE TAD I (OPLIS /WAS "/LIST" FILE GIVEN? SMA CLA JMP CL4S4 TAD I (OPLIS;RAL SPA CLA JMP CL4S3 MOV6;BATOUT;OPLIS+1 CL4S3, TAD (",;OUT1 OUTNAM;OPLIS+1 CL4S4, TAD I (OPSSYM /LIST SYSTEM SYMBOLS? SMA CLA JMP CL4S11 /NO SEND;CL4SM8 /"/S" CL4S11, SEND;CL4SM2 /"<_*" TAD I (OPLIB;RAL /WAS "/LIBRARY" FILE SPECIFIED? SMA CLA JMP CL4S5 OUTNAM;OPLIB+1 /SEND NAME OF LIBRARY SEND;CL4SM3 /"/L_*" CL4S5, TAD I (OPNOA /WAS "/NOAUTO" SPECIFIED? SPA CLA JMP CL4S7 /YES - DON'T BOTHER WITH SAVED NAMES CL4S6, JMS I (UNSNAM;NAME1 /GET A SAVED NAME JMP CL4S7 /OUT OF NAMES OUTNAM;NAME1 /SEND IT SEND;CL4SM4 /"/C_*" JMP CL4S6 CL4S7, TSTCR;SKP /END OF LINE? JMP CL4S10 GETCHR;BCLBUF /GET NEXT CHARACTER DCA CHRSAV GETCHR;BCLBUF TAD (-"= SZA CLA JMP CL4S8 TAD CHRSAV ISIT;CLIS1;CLIS2-1 /IS IT "L" OR "O" CL4S8, L7776 TAD GETPNT /BACK UP 2 DCA GETPNT CL4S9, COLNAM;NAME1 JMP CL4S7 /BAD NAME OUTNAM;NAME1 /SEND THE NAME SEND;CL4SM4 /"/C_*" JMP CL4S7 CL4SL, SEND;CL4SM5 /"/O" CL4SO, SEND;CL4SM6 /"_*" L7776 TAD GETPNT /BACK 2 JMS I (BCLSQU JMP CL4S9 CL4S10, SEND;CL4SM7 /"$_" DCA I (NAMCNT JMP I CL4S /RETURN /$LOAD CL4, BCLIN /GET THE LINE JMS CL4S /ANALYZE IT TAD (DATL4 /SET "$DATA" ADDRESS DCA I (DATADR JMS I (BCLHU1;TEXFIN CHRSAV, 0 PAGE / / / $RUN (FORTRAN IV) - FORMERLY CALLED $DATA / / /THIS SUBROUTINE IS CALLED FROM DATF4 - THE REAL $RUN PROCESSOR DAT4, 0 TAD (-12^7 /ZERO OUT CONTROL WORD DCA DEVASC /FOR EACH DEVICE NUMBER TAD (DEVASN-1 DCA OXR1 DEVAS1, DCA I OXR1 ISZ DEVASC JMP DEVAS1 BCLIN /GET THE INPUT LINE DAT41, GETCHR;BCLBUF /GET A CHAR DAT411, ISIT;OPTIS3;DATIS1-1 /IS IT "/" OR <CR>? JMP DAT41 /NO DAT42, L7777 TAD GETPNT /SAVE POINTER TO "/" DCA DEVAST GETCHR;BCLBUF ISNUM JMP DAT411 /IT'S NOT A NUMBER TAD CHAR TAD (-"0 CIA DCA DEVASC TAD DEVASC CIA CLL RAL;RTL TAD DEVASC /NUMBER*7 TAD (DEVASN DCA DEVASC DAT47, GETCHR;BCLBUF /GET ANOTHER CHAR ISIT;DATIS2;DATIS3-1 /IS IT "N","C", OR "="? JMP DAT411 /NO DAT44, TAD I DEVASC /"N" SETS BIT 1 AND (5777 TAD (2000 DCA I DEVASC JMP DAT47 DAT45, TAD I DEVASC /"C" SETS BIT 2 AND (6777 TAD (1000 DCA I DEVASC JMP DAT47 DAT46, TAD GETPNT /SAVE POINTER TO POSSIBLE NAME DCA DEVASP GETCHR;BCLBUF /GET THE NEXT CHAR ISNUM JMP DAT48 /NOT A NUMBER TAD CHAR /SAVE THE NUMBER DCA DEVASS GETCHR;BCLBUF ISIT;DATIS4;DATIS5-1 /IS IT "," "/" OR <CR>? DAT48, TAD DEVASP /RESET NAME POINTER DCA GETPNT TAD I DEVASC /ZERO OUT NUMBER AND (7400 DCA I DEVASC TAD DEVASC;IAC /GET POINTER TO DEVICE BLOCK DCA .+2 COLNAM;0 /COLLECT NAME JMP DAT49 /BAD NAME DAT412, TAD I DEVASC /NAME OR NUM OK - SET BIT 0 AND (3777 TAD (4000 DCA I DEVASC DAT49, TAD DEVAST /SQUISH JMS I (BCLSQU JMP DAT41 DAT410, TAD I DEVASC /ADD NUMBER TO CONTROL WORD AND (7400 TAD DEVASS DCA I DEVASC JMP DAT412 DAT43, JMP I DAT4 DEVASP, 0 DEVASC, 0 DEVASS, 0 DEVAST, 0 /SEND A NAME AND SEND /T OPTION IF DEVICE IS TTY: PIPOUT, 0 TAD I PIPOUT /GET ADDRESS OF NAME ISZ PIPOUT DCA PIPPNT OUTNAM /SEND IT PIPPNT, 0 TAD I PIPPNT /GET CHAR OF DEVICE TAD (-2424 /IS IT "TT"? SZA CLA JMP I PIPOUT /NO ISZ PIPPNT TAD I PIPPNT TAD (-3100 /IS IT "Y@"? SZA CLA JMP I PIPOUT /NO SEND;PIPM1 /"/T" JMP I PIPOUT PAGE /$RUN (FORTRAN IV) DATF4, JMS I (DAT4 /PROCESS DEVICE NUMBER STUFF JMS I (CL4S /DO LOAD STUFF JMP DATL46 DATL4, JMS I (DAT4 OPTION;ZER6 /NO OPTIONS JMP DATL46 DATX4, JMS I (DAT4 /DO DEVICE NUMBER STUFF JMS DATNAM /COLLECT A NAME DATL46, SEND;DTF4M1 /".R PIP_*DATA.DA<BAT:_" CDRTRA /TRANSLATE CARDS SEND;DTF4M2 /"$EOD_.R FRTS_*" OUTNAM;NAMELD /SEND LOADER NAME DATL48, JMP DATL49 /ZEROED OR CREATED IN INIT SEND;DTF4M6 /"_*DATA.DA/4_*" OUTNAM;BATOUT SEND;DTF4M7 /"/5" JMP DTL410 DATL49, SEND;DTF4M8 /"_*/5=4" DTL410, SEND;DTF4M3 /"_*" TAD (-12 /TRANSLATE THE DEVICE NUMBERS DCA DATF4C TAD (DEVASN-7 DCA DATF4P DATL41, TAD (7 TAD DATF4P DCA DATF4P TAD I DATF4P SMA CLA /WAS THIS ONE SPECIFIED? JMP DATL47 /NO TAD I DATF4P AND (377 /WAS IT A NUMBER? SNA JMP DATL42 DCA CHAR /YES - SAVE IT TAD ("=;OUT1 TAD CHAR;OUT1 JMP DATL43 DATL42, TAD DATF4P;IAC /POINT TO NAME DCA .+2 OUTNAM;0 /SEND IT DATL43, TAD I DATF4P /"N"? RAL SMA CLA JMP DATL44 /NO TAD ("<;OUT1 DATL44, TAD I DATF4P /"C"? RTL SMA CLA JMP DATL45 /NO SEND;DTF4M4 /"/C" DATL45, TAD ("/;OUT1 TAD DATF4C TAD ("0+12;OUT1 SEND;DTF4M3 /"_*" DATL47, ISZ DATF4C JMP DATL41 SEND;DTF4M5 /"$_" TAD DATFTN /"$DATA" IS NOW FORTRAN DCA I (DATADR JMP I (BCLHUH DATF4C, 0 DATF4P, 0 DATNAM, 0 OPTION;ZER6 /NO OPTIONS TSTCR;SKP /IS THERE A NAME? JMP DATNO /NO COLNAM;NAMELD /YES - COLLECT IT JMP DATNO /INVALID NAME JMP I DATNAM /RETURN DATNO, SEND;DATNO1 /"?NO PROGRAM TO RUN_" JMS I (BCLHU1;TEXFIN PAGE / / / $FORTRAN (FORTRAN II) / / CF2, BCLIN OPTION;CF2OPT /ANALYZE OPTIONS TSTCR /END OF LINE? JMP CF22 CF21, JMS I (MAKNAM;NAME1 /CREATE A NAME JMP CF23 CF22, COLNAM;NAME1 /COLLECT A NAME JMP CF21 /FAIL - CREATE A NAME CF23, SEND;CF2M1 /".R PIP_*" OUTNAM;NAME1 TAD ("<;OUT1 TAD I (OPSRC;RAL /WAS A SOURCE FILE GIVEN? SMA CLA JMP CF24 /NO OUTNAM;OPSRC+1 TAD (215;OUT1 JMP CF25 CF24, SEND;CF2M2 /"BAT:_" CF25, TAD (FORKEY-15 /FORTRAN CARDS CDF F0 DCA I (KEYADR CDF F1 CDRTRA /TRANSLATE THE CARDS SEND;CF2M3 /"$EOD" TAD I (OPNOL /WAS "/NOLIST" SPECIFIED? SPA CLA JMP CF27 SEND;CF2M4 /"_*" TAD I (OPLIS;RAL /WAS A LISTING FILE GIVEN? SPA CLA JMP CF26 /YES MOV6;BATOUT;OPLIS+1 /NO - USE LISTING DEVICE CF26, JMS I (PIPOUT;OPLIS+1 TAD ("<;OUT1 OUTNAM;NAME1 CF27, SEND;CF2M5 /"_.R FORT_*" OUTNAM;NAME1 TAD I (OPNOL /NOLIST? SPA CLA JMP CF28 /YES TAD I (OPSABR /WAS "/SABR" SPECIFIED? SMA CLA JMP CF28 /NO TAD (",;OUT1 OUTNAM;OPLIS+1 CF28, TAD ("<;OUT1 OUTNAM;NAME1 TAD (215;OUT1 TAD (DATF2 DCA I (DATADR /ENABLE $DATA JMS I (SAVNAM;NAME1 /SAVE THE NAME FOR $LOAD JMP I (BCLHUH /DONE / / / $EOD / $MSG / / CEOD, CMSG, JMS SENDKY /OUTPUT THE BCL KEYWORD JMS I (BCLHU1;TEXTRA / / / $JOB / / CJOB, TAD (SAVARA /RESET SAVED NAMES DCA I (SAVPNT DCA I (NAMCNT /ZERO MAKNAM COUNTER TAD DATFTN /$RUN IS NOW FORTRAN DCA I (DATADR BCLIN /SEND THE LINE TO THE BATCH STREAM SEND;MJOB1 /".R FOTP_*FIL???.*/D_" JMS I (BCLHU1;TEXFIN SENDKY, 0 CDF F0 TAD I (KEYVAL CDF F1 TAD (BCLKEY-1 DCA OTEMP1 TAD I OTEMP1 SEND TAD (" ;OUT1 JMP I SENDKY PAGE / / / $LOAD (FORTRAN II) / / /THIS SUBROUTINE IS CALLED BY CL2 OR DATF2 CL2S, 0 OPTION;CL2OPT /ANALYZE OPTIONS SEND /".R LOADER_*" OR ".R LOADER_*GENIOX" CL2SX, CL2M1 /OR CL2M1A TAD I (OPINP /WAS "/INPUT" SPECIFIED? SMA CLA JMP CL2S1 SEND;CL2M3 /"/I" CL2S1, TAD I (OPOPT /WAS "/OUTPUT" SPECIFIED? SMA CLA JMP CL2S2 SEND;CL2M4 /"/O" CL2S2, TAD I (OPTWO /WAS "/TWO" SPECIFIED? SMA CLA JMP CL2S3 SEND;CL2M5 /"/H" CL2S3, SEND;CL2M6 /"_*" TAD I (OPLIB;RAL /WAS A LIBRARY SPECIFIED? SMA CLA JMP CL2S4 OUTNAM;OPLIB+1 SEND;CL2M7 /"/L_*" CL2S4, TAD I (OPLIS /WAS "/LIST" SPECIFIED? SMA CLA JMP CL2S6 TAD I (OPLIS;RAL /WAS A NAME GIVEN? SPA CLA JMP CL2S5 /YES MOV6;BATOUT;OPLIS+1 CL2S5, OUTNAM;OPLIS+1 SEND;CL2M8 /"</M_*" CL2S6, TAD I (OPNOA /WAS "/NOAUTO" SPECIFIED? SPA CLA JMP CL2S8 CL2S7, JMS I (UNSNAM;NAME1 /GET A SAVED NAME JMP CL2S8 /EMPTY OUTNAM;NAME1 SEND;CL2M6 /"_*" JMP CL2S7 CL2S8, TSTCR;SKP /END OF LINE? JMP CL2S9 /YES COLNAM;NAME1 OUTNAM;NAME1 SEND;CL2M6 /"_*" JMP CL2S8 CL2S9, SEND;CL2M9 /"$_.SAVE " TAD I (OPIMAG;RAL /WAS AN IMAGE FILE NAME GIVEN? SMA CLA JMP CL2S10 /NO - USE DEFAULT TAD I (OPIMAG+1 /WAS A DEVICE GIVEN? SZA CLA JMP CL2S11 /YES TAD (0423 /"DS" DCA I (OPIMAG+1 TAD (1300 /"K" DCA I (OPIMAG+2 CL2S11, MOV6;OPIMAG+1;NAMELD CL2S12, OUTNAM;NAMELD TAD (215;OUT1 JMP I CL2S CL2S10, MOV6;CL2SN2;NAMELD DCA I (NAMCNT JMP CL2S12 /$LOAD CL2, BCLIN JMS CL2S TAD (DATL2 /$DATA DOES NOT DO LOAD DCA I (DATADR JMS I (BCLHU1;TEXFIN PAGE BCLBUF, ZBLOCK 400 /SPACE FOR A WHOLE BUNCH OF CONTINUATION CARDS BCLSIZ=.-BCLBUF SAVARA, ZBLOCK 6^62 /SPACE FOR SAVED NAMES SAVTOP=. /OPTION LISTS CDEOPT, OPBAS;OPFOR;OPNOL;0 /$DECK CBAOPT, OPNOL;0 /$BASIC CF4OPT, OPSRC;OPNOL;OPLIS;OPRALF;0 /$FORTRAN (F4) CL4OPT, OPIMAG;OPLIS;OPLIB;OPNOA;OPSSYM;0 /$LOAD (F4) CF2OPT, OPSRC;OPNOL;OPLIS;OPSABR;0 /$FORTRAN (F2) CL2OPT, OPINP;OPOPT;OPTWO;OPIMAG;OPLIS;OPLIB;OPNOA;0 /$LOAD (F2) /OPTIONS WITHOUT ASSOCIATED FILE NAME OPBAS, 0004;TEXT "BASIC" /B OPFOR, 0006;TEXT "FORTRAN" /F OPNOL, 0023;TEXT "NOLIST";*.-1 /NOL OPRALF, 0003;TEXT "RALF";*.-1 /R OPNOA, 0023;TEXT "NOAUTO";*.-1 /NOA OPSSYM, 0013;TEXT "SSYMB" /SS OPSABR, 0012;TEXT "SABR";*.-1 /SA OPINP, 0013;TEXT "INPUT" /IN OPOPT, 0023;TEXT "OUTPUT";*.-1 /OUT OPTWO, 0020;TEXT "TWO" /TWO /OPTIONS WITH ASSOCIATED FILE NAME OPSRC, 1002;ZBLOCK 6;TEXT "SRC" /S OPLIS, 1003;ZBLOCK 6;TEXT "LIST";*.-1 /L OPIMAG, 1013;ZBLOCK 6;TEXT "IMAGE" /IM OPLIB, 1024;ZBLOCK 6;TEXT "LIBRARY" /LIB /FILE NAMES NAME1, ZBLOCK 6 NAMELD, ZBLOCK 6 BATOUT, ZBLOCK 6 ZER6, ZBLOCK 6 BATTTY, TEXT "TTY@@@@@@@@@";*.-1 BATLPT, TEXT "LPT@@@@@@@@@";*.-1 CDEDEF, TEXT "@@@@DECK@@@@";*.-1 CBATK, TEXT "BAT@@@@@@@@@";*.-1 CL4DEF, TEXT "@@@@PROG@@LD";*.-1 FILNAM, TEXT "@@@@FIL@@@@@";*.-1 CL2SN2, TEXT "DSK@PROG@@@@";*.-1 /SPACE FOR DEVICE ASSIGNMENTS UNDER FORTRAN 4 DEVASN, ZBLOCK 7^12 /LISTS FOR ISIT CLIS1, -"L;-"O;0 CLIS2, CL4SL;CL4SO DATIS1, DAT42 /"/" DAT43 /<CR> DATIS2, -"N;-"C;-"=;0 DATIS3, DAT44;DAT45;DAT46 DATIS5, DAT410;DAT410;DAT410 OPTIS2, OPTIO8 /"=" OPTIO9 /"," OPTIO9 /"/" OPTIO9 /<CR> OPTIS4, OPTI3A OPTRET OPTIS1, -"= DATIS4, OUTIS1, -", OPTIS3, BCLIS1, -"/;-215 /LIST MUST BE TERMINATED BY A POSITIVE WORD 0 COLIS2, COLDEV /":" COLFIL /"." COLEXT /"/" COLEXT /"," COLEXT /<CR> COLIS1, -":;-".;-"/;-",;-215 /TERMINATE LIST WITH POSITIVE WORD 0 BCLIS2, BCLSQ2 /"/" BCLSQ3 /<CR> OUTIS2, OUTER2 /"," OUTER2 /"/" OUTER2 /<CR> /LIST OF BCL ROUTINE ADDRESSES BCLGO, BCLEOF /FOR FINISHING UP BEFORE CLOSING FILE CBAS /$BAS FORADR, CF4 /$FOR DATADR, DATX4 /$DATA LOAADR, CL4 /$LOAD CJOB /$JOB CMSG /$MSG CDECK /$DECK CEOD /$EOD CERR CERR CERR CERR /LIST OF BCL KEYWORDS BCLKEY, MBAS MFOR MDATA MLOAD MJOB MMSG MDECK MEOD /ERROR MESSAGES OPTERM, TEXT "?INVALID OPTION: /" COLERM, TEXT "?INVALID FILE SPECIFICATION - " BCL11E, TEXT "?_BCL LINE TOO LONG_" /MESSAGES BCLHM1, TEXT "?_" BCL10E, TEXT "_$" CF4M1, CF2M1, CDEM1, TEXT ".R PIP_*" CDEM2, TEXT "<BAT:_" CMEOD, TEXT "$EOD_" CBAM1, TEXT ".R PIP" *.-1 CBAM7, TEXT "_*PROG.BA<" CBAM2, TEXT "<PROG.BA" *.-1 CBAM8, TEXT "_" CBAM3, TEXT 'FILE #3:"DATA.DA"\FILEV #4:"' CBAM4, TEXT '"_' CBAM5, TEXT "PROG.BA," CBAM6, TEXT "BAT:," PIPM1, TEXT "/T" DTF4M1, DATBM1, TEXT ".R PIP_*DATA.DA<BAT:_" DATBM2, TEXT "$EOD_.R BCOMP_*PROG.BA_" CF2M2, CF4M2, TEXT "BAT:_" CF4M3, TEXT "$EOD_.R F4_*" CF4M4, TEXT "/F" CL4SM1, TEXT ".R LOAD_*" CL4SM2, TEXT "<_*" CL2M7, CL4SM3, TEXT "/L_*" CL4SM4, TEXT "/C_*" CL4SM5, TEXT "/O" DTF4M3, CF2M4, CL2M6, CL4SM6, TEXT "_*" DTF4M5, CL4SM7, TEXT "$_" CL4SM8, TEXT "/S" DTF4M2, TEXT "$EOD_.R FRTS_*" DTF4M4, TEXT "/C" DTF4M6, TEXT "_*DATA.DA/4_*" DTF4M7, TEXT "/5" DTF4M8, TEXT "_*/5=4" DATNO1, TEXT "?NO PROGRAM TO RUN_" CF2M3, TEXT "$EOD" CF2M5, TEXT "_.R FORT_*" CL2M1, TEXT ".R LOADER_*" CL2M1A, TEXT ".R LOADER_*GENIOX" CL2M3, TEXT "/I" CL2M4, TEXT "/O" CL2M5, TEXT "/H" CL2M8, TEXT "</M_*" CL2M9, TEXT "$_.SAVE " DTF2M1, TEXT ".RUN " MBAS, TEXT "$BASIC" MFOR, TEXT "$FORTRAN" MJOB1, TEXT ".R FOTP_*FIL???.*/D_" MEOD, TEXT "$EOD" MJOB, TEXT "$JOB" MMSG, TEXT "$MSG" MDECK, TEXT "$DECK" MLOAD, TEXT "$LOAD" MDATA, TEXT "$RUN" $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 | /2 PAL8 ASSEMBLER FOR OS/8 MONITOR VERSION 13 / / / / / / / / / /COPYRIGHT (C) 1970,1971,1972,1973,1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /1-OCT-75 MB/MB/SM/MB/RL/JR/SR DECIMAL VERSION= 13 SUBVERSION= "A OCTAL /PAL8 IS AN 8K THREE PASS ASSEMBLER DESIGNED /TO BE COMPATIBLE WITH THE OS/8 SYSTEM. /PASS 1 READS THE INPUT (SOURCE) FILE AND CONSTRUCTS /THE SYMBOL TABLE. /PASS 2 GENERATES THE BINARY (OBJECT) FILE, WHICH /MAY BE LOADED WITH THE ABSOLUTE (BINARY) LOADER. /PASS 3 GENERATES THE OCTAL SYMBOLIC ASSEMBLY /LISTING. /PAL8 IS COMPATIBLE IN MOST RESPECTS WITH PAL III, MACRO-8 /4K PAL-D, AND 8K PAL-D, AS WELL AS THE CROSS-ASSEMBLER PAL10. IFNDEF HASH<HASH=1> /DEFINE FOR HASH SYMBOL TABLE /SET HASH=0 TO GET OLD PAL8 WAY OF HANDLING SYMBOL TABLE /MAINTENANCE RELEASE CHANGES: /1. INCLUDED JIM ROTH'S HASH TABLE MODIFICATIONS /2. ALLOWED /B TO WORK PROPERLY [SEQ #2 PATCH FROM AUG '74 DSN] /3. PUT CREFLS.TM ON SYS: NOT DSK: [PATCH SEQ #3, SEP '74 DSN] /4. FIXED 7TH LEVEL CHECKSUM BIT [PATCH SEQ #7, MARCH '75 DSN] /5. ALLOWED PAL8 TO RESTART BEFORE CD EXECUTED [DSN APR '75, SEQ #8] /6. FIXED /F SO IT WORKS [PATCH SEQ #9, DSN APRIL 1975] /7. FIXED /W SO IT DOESN'T REMEMBER TOP OF PAGE [DSN OCT '75] /8. FIXED BUG RE MULTIPLE NON-RES INPUT HANDLERS /9. CHANGED VERSION # TO V10, EDIT 1, 1975 COPYRIGHT /10. ADDED DOCUMENTATION ON LOCATION OF HANDLERS AND BUFFERS /11. CORE ALLOCATION: / WITHOUT /K, ALL CORE BUT 10000-11777 USED FOR SYMBOLS / WITH /K, USES ALL CORE (AND SWAPS USR BETWEEN PASSES) / UNDER BATCH, N5000-N7777 IS RESERVED FOR BATCH RESIDENT AS WELL /12. /7 WITH HASH FEATURES PRINTS 7 COLUMN SYMBOL TABLE /13. 14-DEC-75 JR: FIXED TYPO IN /W CODE IN LITERAL DUMP ROUTINE /JR 14-APR-77 ADDED STANDARD DATE FORMAT TO HEADING /COMMAND DECODER RULES: /*BINARY(.BN),LISTING(.LS),CREF(.LS)<SOURCE(.PA),.../OPTIONS /OPTIONS: /B BYTE SHIFT - ! IS 6 BIT SHIFT (!=^100+) /C CREF AFTER - "CREFLS.TM" CREATED IF NO CREF /D DDT TYPE SYMBOL - ONLY IF LISTING /E 'LG' ERROR - LINKS ARE ERRORS /F NO TEXT FILL - NO EXTRA 0 FILL IN 'TEXT' /G LOAD+GO AFTER - SAME AS /L, BUT /G PASSED TO ABSLDR /H NO PAGING - ONLY IF LISTING /J JUST WHAT LOADS - INHIBITS LISTING OF UNASSEMBLED CODE /K CHECK FOR MORE THAN 8K OF CORE (DEFAULT IS 8K) /L LOAD AFTER - "PAL8BN.TM" CREATED IF NO BINARY /N NO LISTING - ONLY IF LISTING /O NO 200 ORG - NO AUTOMATIC 200 ORIGIN AFTER 'FIELD' /S NO SYMBOL TABLE - ONLY IF LISTING /T CR-LF NOT FF - ONLY IF LISTING /W WIPE LITERALS - INHIBITS REMEMBERING OF LITERAL BOUNDS /PERMANENT PATCH LOCATIONS FOR THE ABOVE SWITCHES ARE SYMBOLS /OF THE FORM Z(SW)(PATCH) - E.G. ZT7640 IS THE LOC TO PATCH TO 7640 /TO REVERSE THE POLARITY OF THE "T" SWITCH. /PSEUDO-OPS: /DECIMAL RADIX TO BASE 10 /DEVICE 2 WORD DEVICE CODE /DTORG TYPESETTING TAPE ORIGIN /EJECT SKIPS TO A NEW PAGE, AND IF ANY TEXT FOLLOWS, / THAT TEXT BECOMES THE NEW HEADER LINE /ENPUNCH ENABLE PUNCHING /EXPUNGE REMOVE ALL SYMBOLS /FIELD SET FIELD /FILENAME 4 WORD FILE CODE /FIXMRI DEFINE MEMORY REFERENCE INSTRUCTION /FIXTAB MAKE ALL SYMBOLS PERMANENT /IFDEF CONDITIONAL ON DEFINITION /IFNDEF CONDITIONAL ON UNDEFINED /IFNZRO CONDITIONAL ON NON-ZERO /IFZERO CONDITIONAL ON ZERO /NOPUNCH DISABLE PUNCHING /OCTAL RADIX TO BASE 8 /PAGE RE-ORIGIN TO BEGINNING OF NEXT PAGE OR PAGE N /PAUSE ALTERNATE END-OF-FILE /RELOC ASSEMBLE FOLLOWING CODE AS IF LOC = ARG OF RELOC /TEXT 6 BIT TEXT /XLIST LISTING INHIBIT UNLESS THE XLIST IS / FOLLOWED BY AN EXPRESSION. THEN IF THE EXPRESSION / IS 0 START LISTING, OR NON-0 THEN INHIBIT LISTING /ZBLOCK RESERVE BLOCK OF ZEROS /SYMBOL LAYOUT: / WORD 1 BIT 0=1 PERMANENT SYMBOL / BIT 1=1 "I" OR "Z" / BITS 3-11 CHARS 1 AND 2 / / WORD 2 BIT 0=1 MEMORY REFERENCE INSTRUCTION / BITS 2-11 CHARS 3 AND 4 / / WORD 3 BIT 0=1 PSEUDO-OP / BITS 2-11 CHARS 5 AND 6 / / WORD 4 BITS 0-11 OCTAL VALUE /CHARS ARE STORED AS: / A TO Z ARE 01 TO 32 / 0 TO 9 ARE 33 TO 44 / / CHAR1^45+CHAR2 /OPERATORS: /+ TWO'S COMPLEMENT ADD /- TWO'S COMPLEMENT SUBTRACT /& BOOLEAN AND /! BOOLEAN INCLUSIVE 'OR' OR BYTE SHIFT / (SPACE) DELIMITER OR INCLUSIVE OR /^ MULTIPLY (REPEATED ADDITION) /% DIVIDE (REPEATED SUBTRACTION) /DEFINITIONS ASWAP= 40 /WATCH THIS SWAP AREA!! MDATE= 7666 /MONITOR DATE BIPCCL= 7777 /DATE EXTENSION AND BATCH IN PROG FLG IN FIELD 0 MPARAM= 7643 /COMMAND DECODER OPTION LIST DCB= 7760 /DEVICE CONTROL BLOCK JSBITS= 7746 /JOB STATUS WORD BATOUT= 7400 /BATCH LOG OUTPUT ROUTINE IN BATCH RESIDENT LNPRPG= 70 /56 LINES PER PAGE HEDLEN= 50 /40 CHARACTERS IN PAGE TITLE /(MUST BE A MULTIPLE OF 8) AC7776= STA CLL RAL AC7775= STA CLL RTL AC4000= STL CLA RAR AC3777= STA CLL RAR AC2000= STL CLA RTR AC0002= STL CLA RTL /TABLE OF ERROR MESSAGE DEFINITIONS IZ= "I-240^100+"Z-240 /ILLEGAL PAGE ZERO REFERENCE CF= "C-240^100+"F-240 /CREF.SV NOT FOUND US= "U-240^100+"S-240 /UNDEFINED SYMBOL IP= "I-240^100+"P-240 /ILLEGAL PSEUDO-OP USAGE SE= "S-240^100+"E-240 /SYMBOL TABLE EXCEEDED ZE= "Z-240^100+"E-240 /PAGE ZERO EXCEEDED PE= "P-240^100+"E-240 /CURRENT PAGE EXCEEDED IC= "I-240^100+"C-240 /ILLEGAL CHARACTER ID= "I-240^100+"D-240 /ILLEGAL DEFINITION BE= "B-240^100+"E-240 /PUSH-DOWN OVERFLOW DE= "D-240^100+"E-240 /DEVICE ERROR DF= "D-240^100+"F-240 /DEVICE FULL LD= "L-240^100+"D-240 /ABSLDR.SV NOT FOUND IE= "I-240^100+"E-240 /ILLEGAL EQUATE PH= "P-240^100+"H-240 /PHASE ERROR II= "I-240^100+"I-240 /ILLEGAL INDIRECT RD= "R-240^100+"D-240 /REDEFINITION UO= "U-240^100+"O-240 /UNDEFINED ORIGIN LG= "L-240^100+"G-240 /LINK GENERATED /ABBREVIATIONS /CR/LF CARRIAGE RETURN/LINE FEED (215,212) /F/F FORM FEED (214) /PAGE ZERO *0 INT, 15 CIF 30 /SYMBIONT CODE JMP .-1 PTR, 0 /V3C USED BY KNTR, 0 /INPUT ROUTINE OCTPR1, 0 OCTPR3, 0 FORMF6, 0 /AUTOINDEX REGISTERS /PRESET FOR ONCE ONLY CODE *10 PDLXR, PDLST /PUSH-DOWN AUTO INDEX REGISTER TAGXR, SWAP1-1 /TAG AUTO INDEX REGISTER XREG1, DSWIT1-1 /GENERAL AUTO INDEX REGISTER XREG2, DSWIT2-1 /GENERAL AUTO INDEX REGISTER /NOT USED AS AUTO INDEX REGISTERS /EXCEPT DURING ONCE ONLY CODE LAST1, DATE-1 /LAST DEFINED SYMBOL LAST2, SWAP2-1 LAST3, IFZERO HASH <SYMPRT+4-1> IFNZRO HASH <SYMNWP-1> LAST4, IFZERO HASH <SYMPR9-2-1> IFNZRO HASH <SYMDDT-1> *20 TAG1, 0 /TAG STORAGE TAG2, 0 TAG3, 0 LITPTR, 200 /LITERAL POINTER RADIX, 0 /7777 IF DECIMAL MODE PUNCHX, 0 /NON-ZERO IF NO PUNCHING XLISTX, 0 /NON-ZERO IF NO LISTING /*NOTE* PUNCHX AND XLISTX MUST BE TOGETHER /AND IN THIS ORDER LOC, 200 /CURRENT LOCATION OFFSET, 0 /LOCATION COUNTER OFFSET FROM "LOC" OFSBUF, 0 /LOCATION COUNTER OFFSET BUFFER STARSW, 0 /-1 IF NEXT ORIGIN SHOULD BE INHIBITED OP, 0 /LAST OPERATOR CODE (0-6) VALUE, 0 /EXPRESSION VALUE VALUE2, 0 /EXPRESSION OPERAND TXTSWT, 0 /SPACE SWITCH TXTPTR, LINBUF+120 /TEXT POINTER CHAR, 0 /CURRENT CHARACTER THISPG, 0 /OVERFLOW PAGE EDITPG, 0 /EDITOR PAGE TEMP, 0 /TEMPORARY REGISTERS TEMP1, 0 TEMP2, 0 TEMP3, 0 OCHAR, OUTPUT /OUTPUT ROUTINE OERROR, OTYPEO /PASS 1=OTYPEO; 2=OTYPEO; 3=LISOUT PASS, -2 /-1 IF PASS 1, 0 IF PASS 2, 1 IF PASS 3 IOMON, 200 /USER SERVICE ROUTINES CONDSW, 0 /NUMBER OF NESTED CONDITIONALS EXPIND, 0 /0 IF MRI OK HERE /NOT 0 IF MRI NOT OK HERE CHKSUM, 0 /BINARY CHECK SUM IZIND, 0 /"I" AND "Z" INDICATOR /IF I, LEFT 6 BITS ARE NON-ZERO /IF Z, RIGHT 6 BITS ARE NON-ZERO THISTG, 0 /ASSIGNED NUMBER OF CURRENT TAG HIGHTG, SYME-SYMS%4-1 /ASSIGNED NUMBER OF LAST TAG LINCNT, 0 /LINE COUNT ALPHAI, 0 /UNDEFINED TAG INDICATOR /-1 IF UNDEFINED GETCI, 0 /NOT=0 IF ONLY CARRIAGE RETURN ENDS LINE /OTHERWISE /,;, OR CARRIAGE RETURN ENDS LSTCNT, 0 /TAB COUNTER UNDFSW, 0 /UNDEFINED SWITCH INCTL, 601 /CONTROL WORD - FOR OS/8 I/O LINKSW, 0 /OFF-PAGE LINK SWITCH /0 IF NO LINK GENERATED, 0700 IF LINK LININD, 0 /BACK-UP FOR LINKSW PERROR, PERRO1 /DUMMY ERROR ROUTINE TO SUPPRESS CERTAIN /MESSAGES DURING PASS 1 FLDIND, "0 /CURRENT FIELD IN ASCII DIGIT FORM VALUEX, 0 /XCODE ERROR5, 0 /USED BY PACKED ASCII PRINT ROUTINE BINSRT, 0 /BINARY OR LISTING STARTING ERCNT, 0 /ERROR COUNTER LINK, 0 /LINK COUNTER IFNZRO HASH< TAGMAX, 0 /SET TO PRIME # EQ TO MAX # SYMS > PAGE /STARTING ADDRESS OF PAL8 (0200) /CHAINING ADDRESS (0201) NAME1, JMP I NAME3 /NAME1-NAME3 USED LATER NAME2, JMP I GETTA2 /TO STORE TAGS AS THEY ARE BUILT NAME3, BEGIN /V3C GETTA2, NOCD /BUILDING SWITCH AND OVERFLOW PROTECT /HANDLERS FOR NOPUNCH AND ENPUNCH PSEUDO-OPS NOPUNX, CLA IAC /NON-ZERO FOR NO PUNCHING ENPUNX, DCA PUNCHX /ZERO FOR PUNCHING JMP I [LOOKEX /--EXIT TO MAIN-- /HANDLERS FOR DECIMAL AND OCTAL PSEUDO-OPS DECIMX, STA /7777 FOR DECIMAL RADIX OCTALX, DCA RADIX /ZERO FOR OCTAL RADIX JMP I [LOOKEX /--EXIT TO MAIN-- /GET A TAG ROUTINE /PICKS UP A TAG AND SEARCHES FOR IT /"THISTG" HAS NUMBER OF TAG /"VALUE2" HAS VALUE /AC=7777 ON RETURN IF TAG NOT FOUND, 0 IF FOUND GETTAG, 0 DCA NAME1 /CLEAR BUILD AREA DCA NAME2 DCA NAME3 TAD [NAME1 DCA GETTA4 /SET POINTER FOR BUILDING DCA GETTA2 /ZERO SWITCH GETTG1, TAD CHAR /GET THE CHARACTER AND [77 /MAKE IT 01-32 OR 60-71 TAD (-32 /WAS IT A TO Z? SMA SZA TAD (-25 /NO - MAKE 60-71 INTO 33-44 TAD (32 /YES - IT IS NOW 01-32 OR 33-44 ISZ GETTA2 /LEFT SIDE? JMP GETTA3 /YES TAD I GETTA4 /NO - RIGHT SIDE DCA I GETTA4 /BUILD THE WORD ISZ GETTA4 /BUMP TO NEXT WORD GETTA1, JMS I [GETC /GET NEXT CHARACTER JMS I (TSTALN /IS IT ALPHANUMERIC? JMP GETTG1 /YES - KEEP BUILDING IFZERO HASH< TAD HIGHTG /NO - GET NUMBER OF HIGHEST TAG CLL RAR /DIVIDE BY 2 DCA TEMP2 /SAVE DIFFERENCE DCA THISTG /START AT TAG ZERO CLL CML /LINK MUST BE ON INITIALLY DCA TEMP1 /GETTA4 IS POINTER TO NAME1-NAME3 /FOR DEPOSITING TAG AS IT IS BUILT /TEMP2 IS # OF TAGS TO SKIP BETWEEN CHECKS FOR MATCH /DURING BINARY SEARCHING GETTG2, SZL /IS THISTG HIGHER THAN TAG? JMP GETTG3 /NO-LOWER GETTG4, DCA TEMP1 /CLEAR LAST TIME SWITCH SNL ISZ TEMP1 /SET LAST TIME SWITCH TO 1 TAD TEMP2 /GET # OF TAGS TO SKIP SNL CIA TAD THISTG /INCREASE OR DECREASE TAG NUMBER DCA THISTG TAD TEMP2 /GET NUMBER CLL RAR /DIVIDE BY 2 SNA /IS RESULT 0? ISZ TEMP1 /YES-BUMP LAST TIME SWITCH SNA IAC /IF RESULT WAS 1, MAKE IT 2 DCA TEMP2 /SAVE IT FOR NEXT TIME JMS I [FINDTG /GET THE TAG TAD [1777 /MASK AND TAG1 /GET WORD 1 CLL CIA TAD NAME1 /DOES IT MATCH? SZA CLA JMP GETTG2 /NO - TRY NEXT TAG AC3777 AND TAG2 /YES - GET WORD 2 CLL CIA TAD NAME2 /DOES IT MATCH? SZA CLA JMP GETTG2 /NO - TRY NEXT TAG AC3777 AND TAG3 /YES - DOES IT MATCH? CLL CIA TAD NAME3 SZA CLA JMP GETTG2 /NO - TRY NEXT TAG JMP I GETTAG /YES--RETURN-- GETTG3, AC7776 TAD TEMP1 /LAST TIME SWITCH = 2? SZA CLA JMP GETTG4 /NO-KEEP TRYING ISZ THISTG /YES-QUIT SEARCHING DCA VALUE2 DCA TAG1 DCA TAG2 DCA TAG3 /TAG NOT FOUND STA /AC=7777 MEANS NOT FOUND JMP I GETTAG /--RETURN-- > IFNZRO HASH< PRIME=TAGMAX GETTGH,/JMS I [TLYREF /HACK ONLY TAD NAME1 /HASH OUR NAME CLL RTL TAD NAME2 RTL TAD NAME3 RTL TAD NAME1 JMS PROBE /NOW PROBE THE TABLE TAD NAME1 /RE HASH THE NAME FOR A STEPSIZE CLL RAL RTL TAD NAME2 CLL /CALC MODULO PRIME INLINE TAD MPRIME SZL JMP .-3 TAD PRIME SNA IAC /STEPSIZE MUST BE NON ZERO! DCA CRPDEL PRBLUP, CLL TAD THISTG /BUMP THE POINTER RANDOMLY TAD CRPDEL SZL /PROTECT AGAINST WRAP AROUND TAD MPRIME /PROBABLY UNOPTIMAL SOLUTION JMS PROBE JMP PRBLUP PROBE, 0 CLL TAD MPRIME SZL JMP .-3 TAD PRIME DCA THISTG /THISTG MODULO PRIME / JMS I [TLYPRB /HACK ONLY JMS I [FINDTG /GO GET IT TAD [1777 /MASK THE TYPE BITS OUT AND TAG1 /IS THERE ONE? SNA JMP NOTFND /NO EXIT POINTING AT IT CIA /YES, DO A COMPARE TAD NAME1 SZA CLA JMP I PROBE AC3777 AND TAG2 CIA TAD NAME2 SZA CLA JMP I PROBE AC3777 AND TAG3 CIA TAD NAME3 SZA CLA JMP I PROBE /FOUND EXIT WITH AC CLEAR JMP I GETTAG NOTFND, STA /NOT FOUND EXIT WITH AC SET JMP I GETTAG CRPDEL, 0 MPRIME, 0 /INITIALIZED BY ONCE ONLY CODE FOR MACHINE AT HAND > GETTA3, DCA GETTA2 /SAVE CHAR TAD GETTA2 CLL RTL /*4 RAL /*10 TAD GETTA2 /*11 RTL /*44 TAD GETTA2 /*45 DCA I GETTA4 /SET LEFT SIDE TAD GETTA4 TAD (-GETTA2 SZA CLA /IS THIS AN OVERFLOW (>6) CHAR? STA /NO - SET SWITCH TO RIGHT HALF DCA GETTA2 /YES - LEAVE SWITCH AT LEFT HALF JMP GETTA1 GETTA4, NAME1 /IGNORE SPACES ROUTINE SPNOR, 0 TAD CHAR /GET THE CHARACTER TAD [-240 /IS IT A SPACE? SZA CLA JMP I SPNOR /NO --RETURN-- JMS I [GETC /YES - GET NEXT CHARACTER JMP SPNOR+1 /LOOP /HANDLER FOR PAUSE PSEUDO-OP /END-OF-TAPE OR END-OF-FILE PAUSEX, AC4000 DCA CHAR /SET END-OF-LINE CHARACTER TAD [LINBUF+120 /REINITIALIZE TEXT POINTER DCA TXTPTR CLA CMA DCA I (INCHCT /INDICATE EMPTY BUFFER ISZ I (INEOF /SET END-OF-FILE JMP I [LOOKEX /--EXIT TO MAIN-- PAGE /OUTPUT 2 CHARACTER ERROR CODE ERROR1, 0 DCA ERROR5 TAD ERROR5 JMS I [RTL6 RAL AND [77 TAD [240 /CONVERT SIXBIT TO ASCII JMS I OERROR /OUTPUT FIRST CHAR TAD ERROR5 AND [77 TAD [240 JMS I OERROR /OUTPUT SECOND CHAR JMP I ERROR1 /--RETURN-- /HANDLER FOR FIELD PSEUDO-OP FIELDX,JMS I [SPNOR /IGNORE SPACES JMS I [DUMPS /DUMP CURRENT PAGE LITERALS JMS I [DUMPZ /DUMP PAGE ZERO LITERALS JMS I [EXP /GET EXPRESSION TAD VALUE /TRIM TO RIGHT 3 BITS AND [7 DCA FLDIND /STORE FOR LISTING TAD VALUE AND [30 DCA VALUEX TAD PASS /IS THIS PASS 2? SZA CLA JMP FIELDY /NO - PREPARE TO EXIT JMS I [XCHANG /XCODE TAD FLDIND /YES - GET FIELD NUMBER CLL RTL RAL /AND CHANNELS 7 AND 8 TAD [7700 JMS I OCHAR /OUTPUT FIELD SETTING FIELDY, JMS I [CLEAN /CLEAN UP THINGS TAD [200 /RESET ORIGIN TO 200 JMP STAR1 /CHANGE LAST 2 LOCATIONS TO: / CLA / JMP STAR1+1 /FOR INDAC GROUP TO OMIT RE-ORIGIN /HANDLER FOR PAGE PSEUDO-OP PAGEX, JMS I [DUMPS /DUMP SAME PAGE LITERALS JMS I (XLISTZ /ANY EXPRESSION? JMP PAGEY /NO JMS I [EXP /YES - GET EXPRESSION TAD VALUE JMS I [RTL6 RAL /GET PAGE NUMBER JMP STAR3-1 PAGEY, TAD LOC /NO ARGUMENT - FIND NEXT PAGE TAD [177 AND [7600 STAR3, DCA VALUE TAD VALUE /GET START OF PAGE STAR1, JMS I [PUNORG /PUNCH ORIGIN JMS I [FINDSP TAD [LITBUF /RESET POINTERS DCA TEMP TAD I TEMP DCA LITPTR /INITIALIZE LITERAL POINTER FOR NEW PAGE DCA LAST1 DCA LININD JMP I [PUNVAL /SEE ABOUT DUMPING SOURCE CODE /HANDLER FOR FIXMRI PSEUDO-OP FIXMRX, JMS I [SPNOR /IGNORE SPACES JMS I [TSTALP /IS CHARACTER ALPHABETIC? JMP FIXMR1 /YES-CONTINUE JMS I [ICMESG /NO - GENERATE IC MESSAGE, GET NEXT CHAR JMP FIXMRX+1 /KEEP LOOKING FOR ALPHABETIC CH. OR END OF LINE FIXMR1, JMS I [GETTAG /PICK UP TAG DCA ALPHAI /STORE UNDEFINED SWITCH SKP FIXMR2, JMS I [ICMESG JMS I [SPNOR /IGNORE SPACES TAD CHAR /WAS CHARACTER = ? TAD (-"= SZA CLA JMP FIXMR2 /NO - PRINT IC MESSAGE AND KEEP LOOKING /FALL INTO EQUALS PROCESSOR /HANDLER FOR = AC4000 /FALL INTO HERE FROM FIXMRI EQUAL, JMS I [PUSHA /PUSH FIXMRI FLAG JMS I [GETC /GET NEXT CHARACTER TAD I [NAME1 /STORE THE SYMBOL NAME JMS I [PUSHA /ON THE PUSH DOWN LIST TAD I (NAME2 JMS I [PUSHA TAD I (NAME3 JMS I [PUSHA TAD THISTG /AND ITS PRESENT (OR FUTURE) JMS I [PUSHA /POSITION IN THE SYMTAB TAD ALPHAI JMS I [PUSHA /STORE UNDEFINED INDICATOR JMS I [SPNOR /IGNORE SPACES JMS I [EXP /GET EXPRESSION TO RIGHT OF = TAD I PDLXR DCA ALPHAI /RESTORE UNDEFINED INDICATOR TAD I PDLXR DCA THISTG /RESTORE SYMBOL TABLE POSITION TAD I PDLXR /RESTORE TAG NAME DCA I (NAME3 TAD I PDLXR DCA I (NAME2 TAD I PDLXR DCA I [NAME1 ISZ UNDFSW /WAS ANY PART OF DEFINITION UNDEFINED? JMP EQUAL3 /NO JMS I PERROR /YES - GENERATE IE ERROR MESSAGE IE ISZ PDLXR /CLEAR EXTRA WORD FROM PDL JMP I [PUNVAL /FORGET ABOUT DEFINING TAG /MORE = PROCESSING EQUAL3, ISZ ALPHAI /WAS TAG DEFINED BEFORE? JMP .+3 /YES - CHECK FOR ILLEGAL REDEFINITION JMS I [INSRTG /NO - INSERT TAG INTO SYMBOL TABLE JMP EQUAL2 /AND BYPASS ILLEGAL REDEF CHECK JMS I [FINDTG /PUT TAG IN TAG1-TAGE AND VALUE2 TAD VALUE CIA TAD VALUE2 SZA CLA /WERE DEFINITIONS THE SAME? TAD TAG1 /NO - IS IT A PERMANENT SYMBOL? SMA CLA JMP EQUAL2 /NO - OK TO REDEFINE JMS I [ERROR /YES - GENERATE RD ERROR MESSAGE FIRST RD EQUAL2, TAD VALUE /DEFINE OR REDEFINE DCA VALUE2 AC3777 AND TAG2 /CLEAR OLD FIXMRI BIT TAD I PDLXR /INSERT NEW ONE DCA TAG2 JMS I [PUTTAG /STORE TAG JMP I [PUNVAL /SEE ABOUT DUMPING SOURCE CODE PAGE /ROTATE AC 6 LEFT RTL6, 0 CLL RTL RTL RTL JMP I RTL6 /--RETURN-- /GET NEXT CHARACTER ROUTINE /READS FROM THE INPUT FILES AND PASSES THE MODIFIED CHARACTERS /TO THE PROGRAM /IT ALSO PRINTS THE LATEST LINE IF IT HAS NOT BEEN PRINTED GETC, 0 ISZ TXTPTR /POINT TO NEXT CHARACTER GETC7, TAD I TXTPTR /GET NEXT CHARACTER SZA /IS IT 0? JMP GETC8 /NO - MORE ARE IN THIS LINE TAD PASS /IS THIS PASS 3? SPA SNA CLA JMP GETC1 /NO TAD [LINBUF /YES DCA TXTPTR /RESET POINTER TO BEGINNING TAD I TXTPTR /GET 1ST CHARACTER SNA /IS IT 0? JMP GETC1 /YES - LINE HAS BEEN PRINTED TAD [-215 /IS IT 215? SNA CLA JMP GETC2 /YES - DO NOT PRINT THE SPACES TAD [211 /NO-OUTPUT 2 TABS JMS I OERROR TAD [211 JMS I OERROR GETC2, JMS LINPRT /NOW PRINT THE LINE GETC1, TAD (-121 DCA TXTSWT TAD (LINBUF-1 DCA TXTPTR /RESET POINTER ISZ TXTPTR GETC6, JMS I (INPUT /GET NEXT CHARACTER JMP GETC4 /215 DCA I TXTPTR /STORE THE CHARACTER ISZ TXTSWT /TOO MANY? JMP GETC6-1 /NO CLA CMA /YES DCA TXTSWT JMP GETC6 GETC4, DCA I TXTPTR /SET END ISZ TXTPTR DCA I TXTPTR /SET END OF LINE TAD [LINBUF DCA TXTPTR /RESET POINTER CLA CMA DCA TXTSWT /RESET SWITCH JMP GETC7 /GET THAT CHARACTER GETC8, TAD [-215 /IS IT A CARRIAGE RETURN? SNA JMP GETC12 /YES-END OF LINE TAD GETCI /NO- TAD (215-"/ /IS IT A /? SNA /YES- JMP GETC13 /"/" IS END TAD ("/-"; /IS IT A ;? SNA /YES- JMP GETC12 /";" IS END TAD (";-211 /IS IT A TAB? SZA TAD (211-240 /OR A SPACE? SZA CLA JMP GETC9 /NO-NOT ANYTHING SPECIAL ISZ TXTSWT /YES-2ND OCCURANCE? JMP GETC+1 /YES - IGNORE TAD [240 DCA CHAR /NO - GIVE A SPACE JMP I GETC /--RETURN-- GETC16, ISZ CONDSW /DECREMENT CONDITIONAL COUNTER JMP GETC15 GETC17, TAD [LINBUF+120 DCA TXTPTR GETC12, AC4000 GETC9, TAD I TXTPTR DCA CHAR /STORE CHARACTER CLA CMA DCA TXTSWT /SET THE SWITCH JMP I GETC /--RETURN-- GETC13, TAD CONDSW /CURRENTLY IN CONDITIONALS? SNA JMP GETC17 /NO DCA CONDSW /STORE UPDATED CONDITIONAL LEVEL GETC15, ISZ TXTPTR /YES-SCAN LINE FOR < AND > TAD I TXTPTR TAD [-215 /IS CHARACTER A CARRIAGE RETURN? SNA JMP GETC17 /YES TAD (215-"> /NO IS IT A >? SNA JMP GETC16 /YES TAD (">-"< /NO-IS IT <? SNA CLA STA /YES - INCREMENT CONDITIONAL COUNTER JMP GETC13 /NO - KEEP LOOKING /CHAR IS NEGATIVE IF LOGICAL END OF LINE: / CARRIAGE RETURN / / / ; /CHAR MAY BE ZERO IF PHYSICAL END OF LINE: / CARRIAGE RETURN /PRINT A LINE OF SOURCE CODE LINPRT, 0 TAD (LINBUF-1 DCA XREG1 /SET POINTER TO LINE LINPR1, TAD I XREG1 /GET CHARACTER SNA /IS IT END OF LINE? JMP I LINPRT /YES - END LINE JMS I OERROR /NO - OUTPUT CHARACTER DCA I [LINBUF /CLEAR OUT 1ST CHAR IN LINE AS "PRINTED" FLAG JMP LINPR1 /HANDLE PHASE ERROR /AND ALL ERROR EXITS TO MONITOR SYMOFL, CLA TAD (SE /SYMBOL TABLE EXCEEDED MESSAGE MONERR, DCA MONER1 /ERROR IS SERIOUS ENOUGH TO PHASE, TAD (OTYPEO / CAUSE IMMEDIATE RETURN TO DCA OERROR / MONITOR JMS I [ERROR MONER1, PH /STORE ERROR TYPE HERE JMP I [7600 /***EXIT TO MONITOR*** /FIND CURRENT PAGE NUMBER /EXIT WITH NUMBER IN AC FINDSP, 0 TAD LOC AND [7600 JMS I [RTL6 JMP I FINDSP /--RETURN-- PAGE /********************************************************** /THIS AREA IS SWAPPED OUT DURING PASS 1 AND 2 /** NO LITERALS IN THIS PAGE, AS THERE IS A PAGE OVERLAYING IT ** SWAP1=. /PASS 3 LISTING OUTPUT LISOUT, 0 DCA LISOU2 TAD XLISTX /IS THIS COVERED BY XLIST? SZA CLA JMP I LISOUT /YES--RETURN-- ISZ LISCNT /NO-WAS PREVIOUS CHARACTER A 215? JMP LISOU1 /NO ISZ LINCNT /WAS IT END OF PAGE? JMP LISOU1 /NO ISZ THISPG /YES-START OVERFLOW PAGE BEGIAB, JMS CRLF /OUTPUT CARRIAGE RETURN/LINE FEED HSWIT1, JMS I [FORMFD /0 IF /H SWITCH OPTION TO SUPRESS PAGING ISZ LINCNT LISOU1, TAD LISOU2 /IS CHARACTER A CARRIAGE RETURN? TAD [-215 SNA JMP LISOU3 /YES - OUTPUT CR/LF TAD [215 /NO - RESTORE CHARACTER JMS I OCHAR /OUTPUT CHARACTER JMP I LISOUT /--RETURN-- LISOU3, CLA CMA DCA LISCNT /REMEMBER THE 215 FOR NEXT TIME JMS CRLF /OUTPUT CARRIAGE RETURN/LINE FEED JMP I LISOUT /--RETURN-- LISCNT, -1 LISOU2, 0 /FORM FEED OUTPUT ROUTINES FORMFD, 0 TAD LINCNT /GET LINE COUNTER TAD FORMLN SNA CLA /ARE WE AT TOP OF PAGE? JMP I FORMFD /YES - NO NEED FOR FORM FEED TAD XLISTX /IS THIS COVERED BY XLIST? SZA CLA JMP I FORMFD /YES--RETURN-- HSWITC, JMP FORMF1 /0 IF /T OR TTY:; JMP FORMF3 IF /H /OUTPUT IF TTY:OR /T OPTION TAD LINCNT TAD [-4 DCA LINCNT JMS CRLF /OUTPUT CARRIAGE RETURN/LINE FEED ISZ LINCNT JMP CRLF1 /OUTPUT LINE FEED /CRLF1 WILL RETURN TO /JMP-1 UNTIL LINCNT HAS /BEEN BUMPED SUFFICIENTLY TAD FORMM6 DCA LINCNT TAD MINUS /OUTPUT ------ JMS I OCHAR ISZ LINCNT /* NEXT 3 LOCS CHANGED IF NO /T OR TTY: FORMF1, JMP .-3 /* STA TAD [-4 /* DCA LINCNT /GENERATE ONE FORM FEED DCA LINCNT /* STA /TURN CR INTO FF JMS CRLF /OUTPUT CR/LF OR FF/LF ISZ LINCNT JMP CRLF1 /OUTPUT LINE FEED TAD FORMLN CIA DCA LINCNT FORM22, TAD [HEADER-1 /OUTPUT HEADER DCA XREG2 DCA LSTCNT FORM30, TAD I XREG2 /GET NEXT CHARACTER OF HEADING SNA /IS IT LAST + 1 JMP FORM20 /YES JMS I OCHAR /NO-OUTPUT IT TAD LSTCNT TAD [-HEDLEN /DONE "HEDLEN" CHARACTERS YET? SZA CLA JMP FORM30 /NO-CONTINUE TAD FORMHD /YES-START SYSTEM HEADER JMP FORM22 /WHICH STARTS AT HEADER+HEDLEN FORMLN, LNPRPG FORMHD, HEDLEN MINUS, "- /TTY: OR /T OUTPUTS FORM FEED AS /CARRIAGE RETURN, MULTIPLE LINE FEEDS TO END OF PAGE /------ /CARRIAGE RETURN, 5 LINE FEEDS /HEADER /NO OPTIONS TREATS F/F AS /F/F, LF, CR/LF /HEADER / /H OPTION TREATS F/F AS 2 CR/LF /USER HEADER IS "HEDLEN" CHARACTERS WIDE /ASSEMBLER HEADER ENDS WITH 0 /OUTPUT PAGE NUMBERS FORM20, TAD EDITPG /OUTPUT EDITOR PAGE NUMBER JMS FORMF4 TAD THISPG /IS THERE PAGE OVERFLOW? SNA CLA FORM21, JMP FORMF3 /NO TAD MINUS /YES JMS I OCHAR /OUTPUT - TAD THISPG /OUTPUT NUMBER OF OVERFLOW PAGE JMS FORMF4 /OUTPUT IF /H OPTION FORMF3, JMS CRLF /OUTPUT 2 CR/LF JMS CRLF JMP I FORMFD /--RETURN-- /DECIMAL PRINT ROUTINE FORMF4, 0 DCA FORMF6 /SAVE NUMBER TAD FORM8F DCA CRLF /POINT TO DIVISION LIST FORM12, DCA FORMF7 /START WITH 0 JMP .+3 FORMF5, DCA FORMF6 ISZ FORMF7 /ADD 1 TO DIGIT TAD I CRLF /SUBTRACT 1000, 100, OR 10 SNA JMP FORM11 /0 IS END OF TABLE - NO MORE DIGITS TAD FORMF6 SMA /OVERFLOW JMP FORMF5 /NO-KEEP SUBTRACTING CLA /YES-DIGIT DONE ISZ CRLF /BUMP LIST POINTER TAD FORMF7 /WAS DIGIT A 0? SNA JMP FORM12 /YES TAD ["0 /NO-MAKE IT ASCII JMS I OCHAR /OUTPUT DIGIT AC4000 JMP FORM12 /4000 IN AC FORCES SIGNIFICANCE FORM11, TAD FORMF6 /GET LAST DIGIT (UNITS PLACE) TAD ["0 JMS I OCHAR /OUTPUT DIGIT JMP I FORMF4 /--RETURN-- FORMM6, -6 FORM8F, FORMF8 /OUTPUT CARRIAGE RETURN/LINE FEED /ENTER WITH AC=-1 TO GENERATE F/F LF HEDCL2, CRLF, 0 TAD [215 JMS I OCHAR CRLF1, TAD [212 /RE-ENTRY FOR MULTIPLE LINE FEEDS JMS I OCHAR JMP I CRLF /--RETURN-- /CLEAR PAGE HEADING BUFFER FORMF7, HEDCLR, 0 TAD [-HEDLEN /SET HEADING BUFFER DCA HEDCL2 /TO TABS TAD [HEADER-1 DCA XREG2 TAD [211 DCA I XREG2 ISZ HEDCL2 JMP .-3 JMP I HEDCLR /--RETURN-- PAGE /SYMBOL TABLE OUTPUT (COLUMNAR) /*CODE TO GENERATE DDT COMPATIBLE* /**SYMBOL TABLE--SUBSTITUTED WITH* /**ONCE ONLY CODE IF NEEDED******* IFZERO HASH< SYMPRT, 0 ISZ EDITPG /NEW PAGE DCA THISPG JMS I [FORMFD TAD SMIN67 /DCA I SYMPR6-1 DCA SYMPR7 /JMS SYMPR9+6 SYMPR8, DCA SYMPR2 /TAD [377 //RUBOUT CLA CMA /JMS I OERROR DCA THISTG /CLA CMA TAD SYMPR2 /DCA THISTG CMA /TAD [215 //CARRIAGE RETURN DCA SYMPR3 /JMS I OERROR SYMPR5, ISZ SYMPR3 /JMS SYMPPP JMP SYMPR4 /JMP SYMPR9-1 TAD [-4 /JMP SYMPR6+2 DCA SYMPR3 /HSWIT1 SYMPR6, JMS SYMPPP /204 //EOT JMP SYMPRB SYMPR1, TAD [1777 AND TAG1 /OUTPUT TAG JMS I SDIV45 TAD TAG2 JMS I SDIV45 TAD TAG3 JMS I SDIV45 TAD [240 JMS I OERROR /OUTPUT SPACE TAD VALUE2 JMS OCTPRT /OUTPUT OCTAL VALUE ISZ SYMPR3 /JMP SYMPR5-2 JMP SYMPR0 /TAD SYMPR6 SYMPR9, TAD [215 /JMS I OERROR /CARRIAGE RETURN JMS I OERROR /TAD [377 //RUBOUT SYMPRB, ISZ SYMPR7 /JMS I OERROR JMP SYMPRA /JMS SYMPR9+6 HSWIT2, JMS I [FORMFD /DCA LINCNT /0 IF NOT /H TAD SMIN67 /JMP I SYMPRT //--RETURN-- DCA SYMPR7 /0 TAD SYMOFS /TAD [-200 SYMPRA, IAC /DCA SYMPR2 TAD SYMPR2 /TAD [200 //LEADER-TRAILER JMP SYMPR8 /JMS I OERROR SYMPR4, JMS SYMPPP /ISZ SYMPR2 JMP I SYMPRT /JMP SYMPR4-2 /--RETURN-- JMP SYMPR5 /JMP I SYMPR9+6 SDIV45, DIV45 SMIN67, 1-LNPRPG SYMPR0, TAD SMIN67 DCA SYMPPB JMS SYMPPP /SKIP 67(8) SYMBOLS JMP SYMPR9 ISZ SYMPPB JMP .-3 JMS I [ERROR1 JMS I [ERROR1 JMS I [ERROR1 JMP SYMPR1 /GO PRINT THE 67TH(8) SYMBOL SYMPR2= LINKSW SYMPR3= UNDFSW SYMPR7= ALPHAI SYMPPB= CHKSUM SYMPPP, 0 ISZ THISTG SYMOFS, 245 TAD THISTG CLL CIA TAD HIGHTG SNL CLA JMP I SYMPPP /--RETURN-- JMS I [FINDTG AC4000 AND TAG1 TAD TAG3 SPA SZL CLA JMP SYMPPP+1 ISZ SYMPPP JMP I SYMPPP /--RETURN-- /SYMNCL, -4 /DEFAULT IN LIU OF =N OPTION /SYMOFS, 245 /OFFSET TO FIRST SYM ON NEXT PAGE > IFNZRO HASH< SYMPRT, 0 ISZ EDITPG DCA THISPG JMS I [FORMFD /OUTPUT A HEADING JMS I SYMHND /NOW READ THE SYMBOL TABLE SORT OVERLAY 0200 /2 PAGES SYMSRT, OUDEVH+400 /TO HERE ASWAP+1 /FROM HERE JMP I SYMERR /UGH JMS I SYMSRT /SORT THEM AND SET LINK SYMNWP, DCA SYMTAG /POINT TO SYMBOL SZL /LINK OFF IF ANY SYMBOLS TO LIST JMP I SYMPRT /NONE --RETURN-- TAD SMIN67 /SET LINE/PAGE COUNT DCA SYMLCT SYMPAG, TAD HIGHTG CLL CIA TAD SYMTAG SZL CLA JMP I SYMPRT /NO MORE IF AT HIGHTAG NOW TAD SYMTAG DCA THISTG /PREPARE TO PRINT LEFTMOST SYMBOL TAD SYMNCL /4 PER LINE (DEFAULT) DCA SYMCCT /TO COLLUMS/LINE CNTR JMP SYMGO SYMLIN, JMS I [ERROR1 JMS I [ERROR1 JMS I [ERROR1 TAD HIGHTG CLL CIA TAD THISTG SZL CLA JMP SYMNXL /SKIP TO NEXT LINE IF OFF TABLE SYMGO, JMS I [FINDTG /OK, GET IT TAD TAG1 JMS I SDIV45 TAD TAG2 JMS I SDIV45 TAD TAG3 JMS I SDIV45 TAD [240 JMS I OERROR TAD VALUE2 /PRINT VALUE NOW JMS OCTPRT SYMDDT, TAD SMIN67 CLL CIA TAD THISTG DCA THISTG SZL JMP SYMNXL /SKIP IF WRAP AROUND ISZ SYMCCT /ELSE DO NEXT COLUMN JMP SYMLIN SYMNXL, TAD [215 JMS I OERROR /CR/LF ISZ SYMTAG /POINT TO NEXT SYMBOL ISZ SYMLCT JMP SYMPAG HSWIT2, JMS I [FORMFD TAD SYMTAG CLL TAD SYMOFS /OFFSET TO NEXT SYMBOL JMP SYMNWP /DO THE NEXT PAGE SDIV45, DIV45 SMIN67, -67 SYMERR, SYSERR SYMHND, 7607 SYMOFS, 245 /DEFAULT SYMNCL, -4 SYMTAG= LINKSW SYMLCT= UNDFSW SYMCCT= ALPHAI ZBLOCK 4 /WASTE SOME SPACE > /END OF AREA WHICH MAY BE SWAPPED OUT /DURING PASSES 1 AND 2 /********************************************************************** ENDOVL= . /OCTAL PRINT ROUTINE /ENTER WITH # TO BE OUTPUT IN AC /** DO NOT USE TEMPS BELOW THIS LOC! OCTPRT, 0 DCA OCTPR1 TAD [-4 DCA OCTPR3 OCTPR2, TAD OCTPR1 /GET EACH DIGIT SEPARATELY CLL RTL RAL DCA OCTPR1 TAD OCTPR1 RAL AND [7 TAD ["0 /MAKE IT INTO AN ASCII CHARACTER JMS I OERROR /OUTPUT IT ISZ OCTPR3 JMP OCTPR2 JMP I OCTPRT /--RETURN-- /OUTPUT ONE REGISTER PUNONE, 0 TAD PASS /WHICH PASS IS THIS? SNA JMP PUNON2 /PASS 2--OUTPUT BINARY SPA CLA JMP PUNON3 /PASS 1--EXIT TAD VALUEX /THE BANK BIT IS CLL RTR /ADJUSTED TO ASCII RAR TAD ["0 JMS I OERROR /THEN PRINTED TAD FLDIND /GET FIELD NUMBER TAD ["0 /CONVERT TO ASCII JMS I OERROR /PRINT IT TAD LOC /GET LOW ORDER 4 DIGITS (LOC CTR) JMS OCTPRT /PRINT IT TOO TAD OFFSET /IF THIS CODE IS IN A RELOC SECTION, SZA CLA / TAD [1200 /FLAG THE LOCATION COUNTER WITH A * DTORG1, JMS I [ERROR1 /OUTPUT 2 SPACES TAD VALUE JMS OCTPRT /OUTPUT CONTENTS TAD I [LINBUF /IS THERE SOURCE CODE TO DUMP? SNA CLA JMP PUNON1 /NO-OUTPUT CARRIAGE RETURN TAD LINKSW /YES-DUMP LINK SWITCH (' ) OR ( ) JMS I [ERROR1 JMS I [LINPRT /DUMP SOURCE CODE JMP PUNON3 /AND EXIT PUNON1, TAD LINKSW /NO LINE - OUTPUT LINK SWITCH ANYWAY SZA /IF THERE IS ONE JMS I [ERROR1 TAD [215 /OUTPUT CARRIAGE RETURN JMS I OERROR PUNON3, DCA LINKSW /CLEAR LINK SWITCH JMP I PUNONE /--RETURN-- /PASS 2-OUTPUT ONE REGISTER PUNON2, TAD VALUE /GET CONTENTS CLL JMS I [PUNOUT /OUTPUT AS 2 FRAMES JMP PUNON3 /AND EXIT PAGE /**CURRENT PAGE LITERALS ON THIS PAGE WILL BE LOST** /***WHEN OVERLAYED BY PUSHDOWN LIST** /ARRANGE TO OUTPUT ONE REGISTER PUNBIN, 0 DCA VALUE JMS I [FINDSP /FIND CURRENT PAGE NUMBER TAD [LITBUF DCA TEMP2 /POINT TO NUMBER OR LITERALS TAD LOC AND [177 DCA TEMP TAD I TEMP2 /IS PAGE FULL? CIA TAD TEMP ISZ TEMP SPA CLA JMP ONEOK /NO-OK TO ADD ONE MORE REGISTER TAD TEMP /YES- DCA I TEMP2 JMS I [FINDSP /FIND CURRENT PAGE NUMBER JMS I PPEZE /GENERATE PE OR ZE ERROR ONEOK, JMS I [FINDSP /FIND CURRENT PAGE NUMBER TAD [TPINST DCA TEMP2 TAD TEMP /IS THIS ADDRESS HIGHER THAN PREVIOUS CIA /HIGH INSTRUCTION PAGE? TAD I TEMP2 SMA CLA JMP PUNMOD /NO TAD TEMP /YES-THIS IS NEW HIGH INSTRUCTION DCA I TEMP2 PUNMOD, JMS I [PUNONE /OUTPUT THIS REGISTER ISZ LOC /GET NEXT LOCATION TAD LOC /IF THE "ISZ" SKIPS IT IS O.K. (A 0) AND [177 /IS THIS FIRST INSTRUCTION ON NEXT PAGE? SZA CLA JMP I PUNBIN /NO--RETURN-- JMS I [FINDSP /YES-FIND CURRENT PAGE NUMBER TAD [LITBUF /RESET POINTERS DCA TEMP2 TAD I TEMP2 DCA LITPTR JMP I PUNBIN /--RETURN-- PPEZE, PEZE HEADER, "S;"Y;"M;"B;"O;"L;"S 211;211;211;211;211 /FOR /N HEADER /************************************************************ /CODE OVERLAYED ON PASS 3 /BY USER HEADER BUFFER /CONTINUATION OF EXPUNGE HANDLER /ENTER ON PASS 1 ONLY EXPUNW, IFZERO HASH< DCA TEMP1 DCA EXPUN2 /CLEAR NEW HIGH TAG COUNTER TAD HIGHTG CMA DCA TEMP3 /SAVE NUMBER OF SYM TBL ENTRIES EXPUNY, TAD TEMP1 DCA THISTG JMS I [FINDTG /GET A SYMBOL TAD TAG1 /ONLY SAVE THE SYMBOL IF RTL CLA /IT WAS A PSEUDO-OP, OR TAD TAG3 /THE SYMBOLS I OR Z SNL SMA CLA JMP EXPUA4 /NO-FORGET TAG TAD EXPUN2 /YES-RETURN TAG TO SYMBOL TABLE DCA THISTG JMS I [PUTTAG ISZ EXPUN2 EXPUA4, ISZ TEMP1 ISZ TEMP3 /DONE YET? JMP EXPUNY /NO- TRY NEXT TAG CLA CMA /YES TAD EXPUN2 /RESET HIGH TAG DCA HIGHTG JMP I [LOOKEX /--EXIT TO MAIN-- EXPUN2, 0 > IFNZRO HASH< /HASH TABLE EXPUNGE - DEPENDS ON PSEUDO OPS /BEING HASHED FIRST. SCANS WHOLE TABLE (SLOW AS HELL!) DCA THISTG /POINT TO FIRST ENTRY TAD TAGMAX /SET THE COUNT CIA DCA TEMP1 EXPUNL, JMS I [FINDTG /GO GET ONE TAD TAG1 RTL CLA TAD TAG3 SPA SZL CLA /PSEUDO OP? JMP EXPUNS /YES, SKIP DELETION DCA TAG1 /NO, WIPE IT DCA TAG2 DCA TAG3 JMS I [PUTTAG /AND PUT IT BACK STA TAD HIGHTG DCA HIGHTG /DECREMENT SYMBOL COUNT EXPUNS, ISZ THISTG /POINT TO NEXT ENTRY ISZ TEMP1 /TALLY COUNT JMP EXPUNL /GET ANOTHER JMP I [LOOKEX /DONE --RETURN-- > /*************************************************************** /ASSEMBLER HEADER BUFFER ZBLOCK HEADER+HEDLEN-. " ;" ;"P;"A;"L;"8;"- "V;"1;VERSION-12+"0;SUBVERSION " DATE, "N;"O;" ;"D;"A;"T;"E;" /GETS SET TO DD-MMM-YY IF DATE PRESENT " ;" ;"P;"A;"G;"E;" ;0 /PUSHDOWN LIST /OCCUPIES NEXT 43(8) LOCATIONS PDLND=. /********************************************************* /ONCE ONLY CODE FOR /D OPTION /PUT INTO SYMLST FOR DDT COMPATIBLE SYMBOL TABLE /OVERLAYED DURING ASSEMBLY BY PUSHDOWN LIST DSWIT1, IFZERO HASH< RELOC SYMPRT+4 DCA I SYMPRF JMS SYMPRC TAD [377 JMS I OERROR CLA CMA DCA THISTG SYMPRE, TAD [215 JMS I OERROR JMS SYMPPP JMP SYMPRD JMP SYMPR1 SYMPRF, HSWIT1 SYM204, 204 RELOC > IFNZRO HASH< RELOC SYMNWP DCA THISTG DCA I SYMHSW JMS DDTLDR TAD [377 JMS I OERROR SYMLUP, TAD [215 JMS I OERROR TAD HIGHTG CLL CIA TAD THISTG SZL CLA JMP SYMXIT JMP SYMGO SYMHSW, HSWIT1 RELOC > DSWITA= . /********************************************************** PAGE /************************************************************* /PAL8 TABLES - LOAD OVER INITIALIZATION CODE PDLST= PDLND+42 /PUSHDOWN LIST 43(8) LOCS LONG LINBUF= PDLST+1 /LINE BUFFER OCCUPIES 122(8) LOCATIONS LITBUF= LINBUF+122 /LITERAL TABLE IS 40(8) LOCATIONS (ONE PER PAGE) / SHOWING LOWEST PAGE ADDRESS USED FOR LITERALS TPINST= LITBUF+40 /TOP INSTRUCTION TABLE IS 40(8) LOCTIONS / SHOWING HIGHEST PAGE ADDRESS USED FOR INSTRUCTIONS LITBF2= TPINST+40-17 /LITERAL BUFFER 2 CONTAINS UP TO 160(8) /PAGE 0 LITERALS, SUBSCRIPTS 20-177 LITBF1= LITBF2+200-100 /LITERAL BUFFER 1 CONTAINS UP TO 100(8) /CURRENT PAGE LITERALS, SUBSCRIPTS 100-177 /************************************************************* /ONCE ONLY CODE FOR ASSEMBLER START UP /OVERLAYED BY BUFFERS /HANDLES SWITCH OPTIONS BEGIN, CIF 10 JMS I IOMON /CALL USER SERVICE ROUTINES 5 /*COMMAND DECODER* 2001 /DEFAULT INPUT EXTENSION IS .PA NOCD, CDF 10 /RETURN TAD I (7604 /IS THERE A BINARY FILE EXTENSION? SNA TAD (216 /NO - DEFAULT EXTENSION IS .BN DCA I (7604 /YES TAD I (7611 /IS THERE A LISTING FILE EXTENSION? SNA TAD (1423 /NO - DEFAULT EXTENSION IS .LS DCA I (7611 TAD I (MPARAM+1 /WAS THE /T OPTION SELECTED? CDF AND (20 ZT7640, SNA CLA JMP BEGINA /NO BEGIAA, DCA I (HSWITC /YES - GENERATE CR/LF IN PLACE OF F/F JMP BEGIN2 BEGINA, TAD [7605 /WAS TTY THE PASS 3 DEVICE? JMS I (OTYPE AND (770 SNA CLA JMP BEGIAA /YES - GENERATE CR/LF IN PLACE OF F/F DCA I (BEGIAB /NOT /T OR TTY: BEGIN2, CDF 10 TAD I (MPARAM+1 /WAS THE /S OPTION SELECTED? CDF AND (40 SZA CLA DCA I (SSWITC /YES -OMIT SYMBOL TABLE CDF 10 AC2000 AND I (MPARAM+1 CDF SNA CLA /WAS THE /N OPTION SELECTED? JMP BEGIN4 /NO TAD BEGSKP /SET SWITCH DCA I (NSWITC /YES -SYMBOL TABLE BUT NO LISTING BEGIN4, CDF 10 TAD I (MPARAM /WAS THE /H OPTION SELECTED? CDF AND (20 ZH7640, SNA CLA JMP BEGINB /NO BEGHSW, TAD I (FORM21 /YES -SUPPRESS LISTING PAGE FORMAT DCA I (HSWITC DCA I (HSWIT1 BEGSKP, CLA SKP BEGINB, DCA I (HSWIT2 CDF 10 TAD I (MPARAM /WAS THE /D OPTION SELECTED? CDF AND [400 ZD7640, SNA CLA JMP BEGIN1 /NO TAD I XREG1 /YES -DDT COMPATIBLE SYMBOL TABLE DCA I LAST3 /SUBSTITUTE ALTERNATE CODE ISZ DSWIT3 /INTO SYMBOL TABLE OUTPUT ROUTINE JMP .-3 TAD I XREG2 DCA I LAST4 ISZ DSWIT4 JMP .-3 BEGIN1, TAD I (JSBITS /RESET JOB STATUS WORD TO AND (6777 /INDICATE PAL8 NOT RESTARTABLE TAD (1000 DCA I (JSBITS CIF CDF 10 JMS I (FMTDAT /CALL ROUTINE IN FIELD 1 TO SETUP DATE JMP I (BEGINZ /CONTINUE ON DSWIT3, DSWIT1-DSWITA DSWIT4, DSWIT2-DSWITB PAGE /ONCE ONLY CODE CONTINUED /ASSEMBLER INITIALIZATION PROCEDURES BEGINZ, TAD [7600 /WHAT DEVICE FOR BINARY OUTPUT? JMS I (OTYPE SMA CLA TAD (-70 /STAND-ALONE TAD (-10 /DIRECTORY DCA I (SWAPR2+LEADER /SET AMOUNT OF LEADER TRAILER DCA LAST1 /NO DEFINED TAG BEGIN5, IFZERO HASH< CDF TAD I BLK1 /MOVE SYMBOL TABLE TO FIELD 1 CDF 10 DCA I BLK2 ISZ BLK1 ISZ BLK2 ISZ BLK3 JMP BEGIN5 > CDF DCA I [LINBUF+120 /SET BUFFER POINTERS DCA I (LINBUF+121 TAD [7600 /IS PTP BINARY OUTPUT DEVICE? JMS I (OTYPE DCA BLK1 TAD BLK1 AND (770 TAD (-20 SNA CLA DCA I (PTPSW /YES - SET PTP SWITCH TAD BLK1 /NO - IS IT A DIRECTORY DEVICE? SPA CLA JMP .+3 /NO TAD (TAD [77 /YES - SET DIRECTORY SWITCH DCA I (DIRSW TAD [7605 /IS PTP GETTING LISTING OUTPUT? JMS I (OTYPE AND (770 TAD (-20 SNA CLA DCA I (SWAPR2+PTPSW1 /YES - SET PASS 3 PTP SWITCH TAD [7605 /NO - IS DIRECTORY DEVICE GETTING JMS I (OTYPE /LISTING OUTPUT? SPA CLA JMP .+3 /NO TAD (TAD [77 /YES - SET PASS 3 DIRECTORY SWITCH DCA I (SWAPR2+DIRSW1 JMP I (BEGINF MONLST, TEXT /JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC/ *.-1 /CONTINUED CHECK OF COMMAND DECODER OPTIONS BEGINH, CDF 10 TAD I (MPARAM /WAS THE /G OR /L OPTION CHOSEN? CDF AND (41 SNA CLA JMP I (BEGISW /NO CDF 10 /YES TAD I [7600 SZA CLA /WAS THERE A BINARY OUTPUT FILE? JMP YESBIN /YES BINLOP, TAD PALBIN /NO - CREATE FILE PAL8BN.TM DCA I PALBIX /ON SYSTEM DEVICE ISZ BINLOP ISZ PALBIX ISZ BINCNT JMP BINLOP CDF TAD (-10 /SET AMOUNT OF LEADER TRAILER DCA I (SWAPR2+LEADER /SET UP FOR LOAD OR LOAD AND GO YESBIN, CDF CIF 10 CLA IAC JMS I IOMON /CALL USER SERVICE ROUTINES 2 /* LOOKUP PERMANENT FILE * LOAD, PLOAD /FILENAME ABSLDR.SV BINCNT, -5 /FILE LENGTH JMP NOLOAD /ABSLDR.SV NOT FOUND TAD LOAD /NORMAL RETURN DCA I (CHAIN /SET STARTING BLOCK NUMBER DCA I (LSWITC /FOR CHAIN CALL JMP I (BEGISW NOLOAD, JMS I [ERROR /GENERATE LD ERROR MESSAGE LD JMP I (BEGISW /ASSEMBLE BUT DO NOT CHAIN TO LOADER BLK1, SYMS BLK2, 7600+SYMS-SYME BLK3, SYMS-SYME PALBIX, 7600 PALBIN, 1 FILENAME PAL8BN.TM PAGE CCC, TAD I CC231 /FINAL PIECE OF STARTUP ONCE-ONLY CODE SNA TAD CC23 DCA I CC231 /"HSWITC"=JMP FORMF1 IF WAS 0 BEGISW, CDF 10 TAD I CCJWD CDF 0 AND CCJBIT ZJ7640, SNA CLA /WAS /J OPTION SPECIFIED? DCA I CCJLOC /NO - PRINT UNASSEMBLED CONDITIONAL CODE CDF 10 TAD I CCWWD CDF 0 AND CCWBIT ZW7640, SNA CLA /WAS /W OPTION SPECIFIED? JMP D4 /V3C D5, TAD I CC231 CIA TAD CC23 SZA CLA /ARE WE OUTPUTTING FF'S IN LISTING? JMP BEGIS3 /NO TAD CC24 /YES - SUBSTITUTE SOME CODE DCA I CC25 TAD CC26 DCA I CC27 TAD CC24 DCA I CC28 BEGIS3, JMS I OVLL7 /CALL SYSTEM DEVICE 4200 /WRITE 2 PAGES SWAP1 /FORM SWAP1 ASWAP /INTO TEMP AREA JMP I OVLL8 /ERROR?! TAD I LAST2 /MOVE PASS 1&2 ONLY CODE DCA I TAGXR /OVER PASS3 SWAPPED OUT CODE ISZ CC29 JMP .-3 IFNZRO HASH< JMS I CCHSH /FINALLY HASH OUT THE TABLE > JMP I .+1 START2-1 /OK - NOW GO DO SOME ASSEMBLING! D4, DCA I CCWLOC /NO - DON'T WIPE LITERALS AS YOU DUMP THEM DCA I (D3 JMP D5 /V3C OVLL7, 7607 OVLL8, SYSER3 CC231, HSWITC CC23, FORMF1&177+5200 CC24, STA CC25, FORMF1 CC26, DCA LINCNT CC27, FORMF1+1 CC28, FORMF1+2 CC29, SWAPB2-SWAPE2 IFNZRO HASH< CCHSH, HSHSMS > CCJWD, MPARAM CCJBIT, 4 CCJLOC, IFTST4 CCWWD, MPARAM+1 CCWBIT, 2 CCWLOC, LITHAK PLOAD, FILENAME ABSLDR.SV CKBAT, TAD I CC7777 /GET BATCH FLAG WORD CLL RTL SNL CLA /BATCH RUNNING? JMP I CCOPTM /NO, GO WITH LINK OFF TAD I CC7777 AND CC0070 /GET BATCH FIELD TAD CCCIF0 /FORM CIF TO BATCH FIELD DCA OTYPB1 /MODIFY TTY OUTPUT ROUTINE TO GO TO BATCH TAD CCJMSB /LOG INSTEAD DCA OTYPB2 TAD OTYPTD DCA OTYPB3 JMP I CCOPTM /RETURN TO CORE DETERMINER, LINK SET CC7777, 7777 CCOPTM, OPTIM4 CC0070, 70 CCCIF0, CIF 0 CCJMSB, JMS I [BATOUT /THIS CODE SITS AFTER THE END OF THE LITERAL TABLE IFNZRO .-LITBF1-200&4000 <*LITBF1+200> OTYPEO, 0 /TYPE A CHARACTER, CHECKING FOR ^O AND ^C DCA OTYPEC /SAVE CHAR JMS CTCCHK /CHECK FOR ^C - RETURN CHAR-203 IN AC TAD (-14 SNA CLA /^O? JMP I OTYPEO /YES OTYPTD, TAD OTYPEC OTYPB1, TLS OTYPB2, TSF OTYPB3, JMP .-1 /WAIT FOR TTY TAD [-215 OTYPCR, SZA CLA /SET TO CLA DURING "ERRORS DETECTED" STUFF JMP I OTYPEO TAD [212 /IF CHAR WAS CR, TYPE LF JMP OTYPEO+1 OTYPEC, 0 CTCCHK, 0 /CHECK FOR ^C TAD [200 KRS /OR IN KEYBOARD CHAR TAD (-203 SNA KSF /3B BUT WAS CHAR REALLY THERE? JMP I CTCCHK /NO ^C - RETURN JMP I [7600 /RETURN TO OS/8 TTLMSG, "E-240^100+"R-240 /ERRORS DETECTED: "R-240^100+"O-240 "R-240^100+"S-240 "D-240 "E-240^100+"T-240 "E-240^100+"C-240 "T-240^100+"E-240 "D-240^100+":-240 0 "L-240^100+"I-240 /LINKS GENERATED: "N-240^100+"K-240 "S-240^100 "G-240^100+"E-240 "N-240^100+"E-240 "R-240^100+"A-240 "T-240^100+"E-240 "D-240^100+":-240 0 PAGE /OUTPUT A CHARACTER TO OUTPUT DEVICE /CALLED BY JMS I OCHAR /WITH CHARACTER IN 8-BIT ASCII IN AC OUTPT1, PUNCHX /PASS 2=PUNCHX; 3=XLISTX OUTPUT, 0 AND [377 /MASK OUT LEFT 4 BITS DCA OUTPT2 /STORE TAD I OUTPT1 /IS THIS PASS 3 AND SNA TAD OUTINH /IS THIS COVERED BY XLIST? SZA CLA JMP I OUTPUT /YES--RETURN-- TAD OUTPT2 /NO - GET CHARACTER AND [200 SNA CLA TAD OUTPT2 /IF LESS THAN 200, THEN TAD CHKSUM /ADD IT TO CHECKSUM DCA CHKSUM TAD OUTPT2 /GET CHARACTER TAD (-211 /IS IT A TAB? SNA CLA JMP OUTPT3 /YES - OUTPUT SPACES JMS OUTPUX /NO - OUTPUT CHARACTER TAD OUTPT2 /IS IT LINE FEED? TAD (-212 SZA CLA JMP I OUTPUT /NO--RETURN-- TAD [7773 /YES - RESET LSTCNT DCA LSTCNT JMP I OUTPUT /--RETURN-- /OUTPUT SPACES INSTEAD OF TAB OUTPT3, TAD [240 DCA OUTPT2 JMS OUTPUX /OUTPUT SPACE TAD LSTCNT /TAB STOPS ARE EVERY 8 SPACES AND [7 SZA CLA JMP .-4 JMP I OUTPUT /--RETURN-- /OUTPUT THE CHARACTER /PACKS CHARACTERS IN STANDARD OS/8 FORMAT OUTPUX, 0 ISZ OUJMP /BUMP 3-WAY SWITCH OUJMP, HLT /WILL BE CHANGED - SHOULD NEVER HALT JMP OCHAR1 /CHARACTER #1 JMP OCHAR2 /CHARACTER #2 OCHAR3, TAD OUTPT2 /CHARACTER #3 CLL RTL RTL AND [7400 TAD I OUPOLD /ADD 4 BITS TO WORD 1 DCA I OUPOLD TAD OUTPT2 CLL RTR RTR RAR AND [7400 TAD I OUPTR /ADD 4 BITS TO WORD 2 DCA I OUPTR TAD OUJMPE DCA OUJMP /RESET SWITCH ISZ OUPTR ISZ OUDWCT /BUFFER FULL? JMP OUCHLV /NO TAD [200 /YES JMS I (OUTDMP /DUMP BUFFER JMS OUSETP /RESET POINTERS JMP OUCHLV OCHAR2, TAD OUPTR /SAVE POINTER DCA OUPOLD ISZ OUPTR OCHAR1, TAD OUTPT2 DCA I OUPTR /SET 8 BIT WORD OUCHLV, TAD OUTPT2 / TAD [40 / AND [100 /CHECK FOR PRINTABLE CHAR / SZA CLA /IF IT IS, TAD [-240 SMA CLA ISZ LSTCNT /BUMP TAB COUNT OUTINH, 0 /ALWAYS 0 OR 1! JMP I OUTPUX /--RETURN-- OUPOLD, 0 OUPTR, 0 OUJMPE, JMP OUJMP OUDWCT, 0 OUTPT2, 0 OUSETP, 0 TAD [7600 /SET OUTPUT WORD COUNT DCA OUDWCT /TO 200 TAD (OUBUF DCA OUPTR /RESET POINTER TAD OUJMPE DCA OUJMP /RESET SWITCH CLL /MUST CLEAR LINK!! JMP I OUSETP /--RETURN-- /HANDLER FOR DEVICE PSEUDO-OP DEVICX, JMS I [SPNOR /IGNORE TRAILING SPACES TAD [-5 JMP DEVIC1 /PACK 4 CHARACTERS /HANDLER FOR FILENAME PSEUDO-OP FILENX, JMS I [SPNOR /IGNORE TRAILING SPACES TAD (-7 JMS FILE1 /PACK 6 CHARACTERS TAD CHAR TAD [-". /WAS CHARACTER . ? SNA CLA JMS I [GETC /YES-SKIP TO EXTENSION AC7775 DEVIC1, JMS FILE1 /PACK 2 CHARACTERS JMP I [LOOKEX /--EXIT TO MAIN-- /PACK CHARACTERS /NEGATIVE OF # OF CHARACTERS TO BE PACKED IN AC ON ENTRY FILE1, 0 DCA FILE6 /SAVE # OF CHARACTERS TO PACK DCA I (TEXT6 /RESET PACK SWITCH FILE4, JMS I (TSTALN /IS CHARACTER IN CHAR ALPHANUMERIC? SKP JMP FILE5 /NO-DONE PACKING ISZ FILE6 /YES-TOO MANY CHARACTERS? JMP FILE3 /NO-O.K. CLA CMA /YES DCA FILE6 /RESET # OF CHARACTERS AND IGNORE JMP FILE2 FILE3, TAD CHAR JMS I (TEXT2 /PACK A CHARACTER FILE2, JMS I [GETC /GET A CHARACTER JMP FILE4 /TEST IT JMS I (TEXT2 /PACK A ZERO CHAR FILE5, ISZ FILE6 /ARE WE DONE? JMP .-2 /NO - PAD WITH ZEROES JMP I FILE1 /YES--RETURN-- FILE6, 0 PAGE /HANDLER FOR TEXT PSEUDO-OP /SPACES ARE IGNORED TO DELIMITER /DELIMITER IS FIRST PRINTING CHARACTER /OTHER THAN SPACE /NON-PRINTING CHARACTERS ARE ILLEGAL /A PRINTING CHARACTER HAS EITHER BIT 5 /OR BIT 6 SET, BUT NOT BOTH TEXT8, JMS I [GETC /GET NEXT CHARACTER TEXTX, CLL CLA CML RAR /AC=4000 DCA GETCI /; AND / ARE NOT END OF LINE JMS TEXT1A /CHECK FOR PRINTING CHARACTER JMP TEXT8 /NON PRINTING - IGNORE TAD [-240 /IGNORE SPACES UNTIL DELIMITER SNA /HAS BEEN FOUND JMP TEXT8 TAD [240 /RESTORE CHARACTER CIA DCA VALUE2 /STORE NEGATIVE DELIMITER DCA TEXT6 /SET PACKING SWITCH TEXT3, JMS I [GETC /GET NEXT CHARACTER JMS TEXT1A /IS IT A PRINTING CHARACTER? JMP TEXT9 /NO - IC TAD VALUE2 /YES - IS IT DELIMITER? SNA CLA JMP TEXT4 /YES - TERMINATE TAD CHAR /NO - PACK AND OUTPUT JMS TEXT2 /PACK IT JMP TEXT3 TEXT4, DCA GETCI /RESET GETCI TO CALL ; AND / END OF LINE JMS I [GETC /SKIP DELIMITER TEXT4X, JMS TEXT2 /OUTPUT 0 TO FILE JMS TEXT2 /CHANGE TEXT4X TO: / NOP /FOR NO EXTRA WORD OF ZEROS DCA GETCI /RESET GETCI IN CASE WE HIT CR JMP I [LOOKEX /--EXIT TO MAIN-- TEXT9, JMS I [ERROR /GENERATE IC ERROR MESSAGE IC JMP TEXT3 /SKIP ON PRINTING CHARACTER TEXT1A, 0 TAD CHAR SPA SNA CLA /IS CHARACTER - JMP TEXT4X /YES TAD CHAR TAD [40 AND [100 SZA CLA /IS THE CHAR PRINTING? ISZ TEXT1A /YES - INCREMENT RETURN TAD CHAR /WITH CHARACTER IN AC JMP I TEXT1A /--RETURN-- /OUTPUT 2 TEXT CHARACTERS (ONE REGISTER) /ENTER WITH CHARACTERS IN AC TEXT2, 0 AND [77 /GET RIGHT 6 BITS ISZ TEXT6 /WHICH HALF OF WORD? JMP TEXT5 /LEFT TAD TEXT7 /RIGHT--ADD IN LEFT HALF JMS I [PUNBIN /OUTPUT IT JMP I TEXT2 /--RETURN-- TEXT5, JMS I [RTL6 /GET LEFT HALF OF WORD DCA TEXT7 /SAVE IT CLA CMA /SET SWITCH FOR RIGHT HALF DCA TEXT6 JMP I TEXT2 /--RETURN-- TEXT6, 0 TEXT7, 0 /HANDLER FOR EXPUNGE PSEUDO-OP EXPUNX, TAD PASS /IS THIS PASS 1 SMA CLA JMP I [LOOKEX /NO--EXIT TO MAIN-- JMP I (EXPUNW /YES-CONTINUE AT EXPUNW /CLOSE OUTPUT FILE OCLOSE, 0 TAD I (OUTINH /OUTPUT INHIBITED? SZA CLA JMP I OCLOSE /YES--RETURN-- PTPSW, TAD [232 /NO-0 IF PTP: - OUTPUT ^Z JMS I OCHAR JMS I OCHAR /AND ZEROS FILLLP, JMS I OCHAR DIRSW, TAD [177 /TAD [77 IF NOT DIRECTORY AND I (OUDWCT /FILL OUT BUFFER OR HALF BUFFER SZA CLA /WITH ZEROS JMP FILLLP TAD I (OUDWCT /IS THERE OUTPUT TO BE DUMPED? TAD [200 SZA JMS OUTDMP /YES - DUMP IT TAD OUFILE /GET DEVICE NUMBER IN AC CIF 10 JMS I IOMON /CALL USER SERVICE ROUTINES 4 /*CLOSE OUTPUT FILE* OUCNAM, 0 /POINTER TO FILENAME TO BE DELETED OUCCNT, 0 /LENGTH OF NEW PERMANENT FILE JMP SYSER3 /DE**FATAL ERROR** JMP I OCLOSE /--RETURN-- OUFILE, ZBLOCK 5 /OUTPUT DUMP /AC CONTAINS CONTROL WORD FOR DUMP OUTDMP, 0 TAD [4000 /BE SURE CONTROL WORD IS DCA OUCTLW /A WRITE OPERATION TAD OUBLK /GET STARTING BLOCK NUMBER TAD OUCCNT /ADD IN COUNT DCA OUREC /SET THIS BLOCK NUMBER TAD OUCTLW TAD [100 /ROUND HALF-BLOCK, IF ANY CLL RTL RTL RTL AND [17 /GET THIS COUNT TAD OUCCNT DCA OUCCNT /ADD TO TOTAL COUNT TAD OUCCNT /IS OUTPUT DEVICE FULL? CLL CML TAD OUELEN /CHECK AGAINST MAXIMUM LENGTH SNL SZA CLA JMP SYSER2 /DF**FATAL ERROR** JMS I OUHNDL /CALL OUTPUT DEVICE HANDLER OUCTLW, 0 /CONTROL WORD OUBUF /BEGINNING OF OUTPUT BUFFER OUREC, 0 /STARTING BLOCK NUMBER SYSER3, CLA SKP /ERROR RETURN JMP I OUTDMP /--RETURN-- SYSERR, TAD (DE /DE **FATAL ERROR** JMP I [MONERR OUHNDL, 0 OUBLK, 0 OUELEN, 0 SYSER2, TAD (DF /GENERATE DF ERROR MESSAGE JMP I [MONERR /**FATAL ERROR** PAGE /MAINLINE CODE LOOKE2, 0 /WAS THIS END OF LINE TAD CHAR / OR END OF CONDITIONAL? TAD [-"> SNA JMP CONEND /END OF CONDITIONAL TAD ("> SMA CLA JMP I LOOKE2 /NOT END OF LINE--RETURN-- LOOKE1, JMS I [GETC /GET A CHARACTER MAIN, JMS I (CTCCHK /CHECK FOR ^C CLA /** CTCCHK RETURNS AC NON-ZERO! JMS I [SPNOR /IGNORE SPACES TAD CHAR TAD (-"$ /WAS IT $ ? SNA /YES-- JMP I (ENDPAS /NO-END THIS PASS TAD ("$-"* SNA CLA /WAS IT * ? JMP STAR /YES-HANDLE * JMS I [TSTALP /NO-WAS IT ALPHABETIC? JMP ALPHA /YES JMS LOOKE2 /NO TOEXP, JMS I [EXP /GET REST OF EXPRESSION TAD LININD DCA LINKSW /STORE LINK SWITCH TAD VALUE JMS I [PUNBIN /OUTPUT THE REGISTER LOOKEX, JMS I [SPNOR /IGNORE TRAILING SPACES JMS LOOKE2 /IS LINE ENDED? ILCHAR, JMS I [ERROR /NO-GENERATE IC ERROR MESSAGE IC JMP CONEN1 CONEND, TAD CONDSW /ARE WE INTO CONDITIONALS? SNA JMP ILCHAR /NO - > IS ILLEGAL IAC /ONE LESS CONDITIONAL DCA CONDSW CONEN1, JMS I [GETC /GET NEXT CHARACTER JMP LOOKEX /AND TRY FOR END AGAIN /HANDLER FOR * STAR, JMS I [GETC /GET NEXT CHARACTER AFTER * JMS I [SPNOR /IGNORE SPACES JMS I [EXP /GET REST OF EXPRESSION STAR0, DCA STARSW /ENTER HERE FROM RELOC WITH AC = -1 ISZ UNDFSW /WAS ANYTHING UNDEFINED? JMP .+3 JMS I [ERROR /YES-GENERATE UO ERROR MESSAGE UO TAD VALUE /NO DCA OP TAD LOC /IS THIS THE SAME PAGE AS AND [7600 /THE PREVIOUS CODE? CIA TAD OP AND [7600 SNA CLA JMP STAR2 /YES-PUNCH ORIGIN JMS I [DUMPS /NO-DUMP LITERALS TAD OFSBUF /SET OFFSET TO NEW VALUE DCA OFFSET /AFTER LITERALS ARE DUMPED. TAD OP /PUNCH NEW ORIGIN, SET "VALUE" JMP I (STAR3 /FOR LISTING, AND SET UP IN NEW PAGE STAR2, TAD OFSBUF /SET OFFSET TO NEW VALUE DCA OFFSET / TAD OP JMS I [PUNORG /PUNCH ORIGIN DCA LAST1 /CLEAR LAST DEFINED SYMBOL JMP I [PUNVAL ALPHA, JMS I [GETTAG /PICK UP TAG-IS IT IN TABLE? DCA ALPHAI /STORE UNDEFINED TAG SWITCH TAD TAG3 /IS IT A PSEUDO-OP? SPA CLA JMP I VALUE2 /YES-GO TO ITS HANDLER TAD CHAR /NO TAD (-", /WAS IT TERMINATED BY , ? SNA JMP COMMA /YES-DEFINE THE SYMBOL TAD (",-"= /NO-WAS IT TERMINATED BY = ? SNA CLA JMP I (EQUAL /YES-EQUATE THE SYMBOL AC4000 /NO JMP TOEXP /TREAT AS AN EXPRESSION /HANDLER FOR , COMMA, JMS I [GETC /GET NEXT CHARACTER ISZ ALPHAI /WAS TAG DEFINED PREVIOUSLY? JMP COMMA2 /YES TAD LOC /NO-STORE CURRENT ADDRESS FOR DEFINITION DCA VALUE2 JMS I [INSRTG /PUT TAG IN SYMBOL TABLE COMMA1, TAD TAG1 /STORE FOR ERROR MESSAGE OUTPUT DCA LAST1 TAD TAG2 DCA LAST2 TAD TAG3 DCA LAST3 TAD VALUE2 DCA LAST4 JMP MAIN /--EXIT TO MAIN-- COMMA2, TAD LOC /DO NEW AND OLD DEFINITIONS AGREE? CIA TAD VALUE2 SNA CLA JMP COMMA1 /YES-ALLOW REDEFINITION JMS I [ERROR /NO-GENERATE ID ERROR MESSAGE ID JMP MAIN /--EXIT TO MAIN-- OPTABL, OP0 /+ OP1 /- OP6 /% OP2 /& OP5 /(SPACE) OPEXPL, OP5 /! - CHANGED TO OP3 IF /B ON OP4 /^ XCHANG, 0 TAD VALUE AND [30 SNA JMP .+3 TAD [7700 JMS I OCHAR JMP I XCHANG PAGE /EXPRESSION PROCESSOR /POSSIBLE RECURSIVE ENTRY /ENTER WITH CHARACTER IN CHAR EXP, 0 DCA EXPIND /SET INDICATOR (NOT 0 IF NO MRI FOUND) DCA LININD /CLEAR LINK GENERATED SWITCH (' ) DCA VALUE /START WITH "VALUE" = 0 DCA UNDFSW /CLEAR UNDIFINED SWITCH TAD EXP JMS I [PUSHA /SAVE RETURN ADDRESS DCA OP /OP=0; ADD TAD EXPIND SPA CLA JMP I (EXPINT TAD CHAR /IS CHARACTER A + ? TAD (-"+ CLL RTR /PUT THE 2 BIT IN THE LINK SZA CLA /WAS CHAR 53(+) OR 55(-)? JMP EXP1A /NO RAL /YES - OP IS 0 OR 1, DEPENDING EXP1, DCA OP JMS I [GETC /GET NEXT CHARACTER ISZ EXPIND /MRI NO LONGER LEGAL ON THIS LINE EXP1A, TAD CHAR /IS CHARACTER A . ? TAD [-". SNA JMP PERIOD /YES-GO TO . HANDLER TAD (".-"" /NO-IS IT " ? SNA JMP QUOTE /YES-GO TO " HANDLER TAD (""-"[ /NO-IS IT [ ? CLL SZA TAD ("[-"( /OR (? SNA CLA JMP I (LIT /YES - LITERAL - LINK HOLDS WHICH KIND JMS I [TSTALP /NO-IS IT ALPHABETIC? JMP I (ALPHA1 /YES-HANDLE SYMBOL JMS I [TSTNUM /NO-IS IT NUMERIC? JMP NUMBER /YES-HANDLE NUMBER EXP2, JMS ENDCHK /NO-CHECK FOR END JMP EXP1A /NOGO - TRY AGAIN TAD OP TAD [-4 /IS OP SPACE (4) SNA CLA JMP I (EXPXIT /YES-EXIT JMS I [ERROR IC /GIVE IC MESSAGE ON ILLEGAL OPERATOR JMP I (EXPINT /EXIT ANYWAY /END OF EXPRESSION CHECK /SKIP IF OK ENDCHK, 0 TAD CHAR TAD (-"] /IS CHARACTER A ] ? SZA /YES-SKIP A EXIT TAD ("]-") /IS CHARACTER A ) ? SZA /YES-SKIP A EXIT TAD (")-"> /IS CHARACTER A > ? SZA /YES-SKIP AND EXIT TAD (">-"< /IS CHARACTER A < ? SNA JMP ENDCH1 /YES-SKIP AND EXIT TAD ("< SPA CLA /IS IT END-OF-LINE? JMP ENDCH1 /YES-SKIP AND EXIT JMS I [ICMESG /NO - GENERATE IC MESSAGE AND GET NEXT CHAR JMP I ENDCHK /--RETURN-- ENDCH1, ISZ ENDCHK /INCREMENT RETURN ADDRESS JMP I ENDCHK /--RETURN-- NUMBER, DCA TEMP NUMBE2, TAD RADIX /IS THE CURRENT RADIX OCTAL? SNA CLA TAD CHAR /YES-IS THE DIGIT GREATER THAN 7? TAD (-"8 SMA CLA JMP NUMBE3 /YES-ILLEGAL CHARACTER TAD TEMP /NO-ADD IT TO THE PREVIOUS CLL RAL /ACCUMULATED VALUE CLL RAL DCA TEMP2 TAD RADIX /IS RADIX OCTAL? AND TEMP /NO TAD TEMP2 /YES CLL RAL TAD CHAR TAD (-"0 DCA TEMP JMS I [GETC /GET NEXT CHARACTER NUMBE4, JMS I [TSTNUM /IS IT NUMERIC? JMP NUMBE2 /YES-CONTINUE ACCUMULATING NUMBER TAD TEMP /NO-STORE NUMBER NUMBE1, DCA VALUE2 NUMBE5, TAD OP /GO COMBINE IT VIA LAST OPERATION TAD (OPTABL DCA TEMP /FIND THE OPERATOR HANDLER TAD I TEMP DCA TEMP JMP I TEMP /GO TO THE HANDLER /8 OR 9 FOUND DURING OCTAL RADIX NUMBE3, JMS I [ICMESG /GENERATE IC ERROR MESSAGE AND JMP NUMBE4 /IGNORE CHARACTER /HANDLER FOR . PERIOD, JMS I [GETC /GET NEXT CHARACTER TAD LOC /MAKE CURRENT LOCATION JMP NUMBE1 /INTO VALUE OF NUMBER /HANDLER FOR " QUOTE, ISZ TXTPTR TAD I TXTPTR /GET CHARACTER FROM TEXT BUFFER TAD [-215 /WAS IT CARRIAGE RETURN? SNA CLA JMP QUOTE1 /YES-IT IS IC-IGNORE " TAD I TXTPTR /NO-PUT ASCII CODE INTO DCA VALUE2 /VALUE WORD JMS I [GETC /GET NEXT CHARACTER JMP NUMBE5 /RETURN TO EXPRESSION PROCESSOR /CARRIAGE RETURN FOUND IN SINGLE CHARACTER TEXT QUOTE1, JMS I [ERROR /GENERATE IC ERROR MESSAGE IC CLA CMA DCA CHAR JMP I (EXPXIT PAGE /COME HERE IF FIRST THING IN EXPRESSION IS ALPHA CHARACTER ALPHA1, JMS I [GETTAG /PICK UP TAG DCA ALPHAI /STORE UNDEFINED INDICATOR ALPHA3, TAD TAG3 /IS IT A PSEUDO-OP? SMA CLA JMP .+3 JMS I [ERROR /YES-GENERATE IP ERROR MESSAGE IP ISZ ALPHAI /NO-WAS IT UNDEFINED? JMP ALPHA0 ISZ UNDFSW /YES-SET UNDEFINED SWITCH TAD PASS /IS THIS PASS 1? SPA CLA JMP ALPHA0 /YES-SUPPRESS ERROR MAESSAGE JMS I [ERROR /NO-GENERATE US ERROR MESSAGE US ALPHA0, TAD TAG2 /NO-WAS IT A MEMORY REFERENCE INSTRUCTION? SPA CLA TAD CHAR /YES-GET TERMINATING CHARACTER TAD [-240 /WAS IT SPACE? SZA CLA JMP I (NUMBE5 /NOT MEMREF FOLLOWED BY SPACE JMS I [SPNOR /YES-IGNORE SPACES TAD CHAR SPA CLA JMP I (NUMBE5 TAD EXPIND /IS MEMORY REFERENCE INSTRUCTION OK? SZA CLA JMP I (NUMBE5 /NO- DCA IZIND /YES-CLEAR I AND Z INDICATOR TAD VALUE2 /STORE MRI ON PUSHDOWN LIST JMS I [PUSHA ALPHA6, TAD IZIND JMS I [PUSHA /PUSH THE I AND Z INDICATOR JMS I [TSTALP /WAS TERMINATING CHARACTER ALPHABETIC? SKP JMP ALPHA4 /NO- JMS I [GETTAG /YES-PICK UP TAG DCA ALPHAI /STORE UNDEFINED INDICATOR AC2000 AND TAG1 /WAS IT AN I OR Z? SNA CLA JMP ALPHA5 /NO TAD VALUE2 /YES-WAS IT I? SNA IAC /NO - SET LOW ORDER TAD I PDLXR /GET OLD IZIND FROM PDL DCA IZIND /SET NEW IZIND JMS I [SPNOR /IGNORE SPACES JMP ALPHA6 EXPINT, TAD EXPIND TAD [4000 DCA EXPIND JMP ALPHA3 ALPHA5, AC4000 ALPHA4, IAC JMS I [EXP /GET REST OF EXPRESSION TAD I PDLXR /RETRIEVE MRI DCA IZIND TAD I PDLXR DCA VALUE2 /FALL INTO NEXT PAGE /COMBINE ADDRESS WITH MEMORY REFERENCE INSTRUCTION TAD VALUE /GET ADDRESS AND [7600 SNA /IS IT PAGE 0? JMP FIX4 /YES CIA /NO-IS IT ON CURRENT PAGE? TAD LOC AND [7600 SNA CLA JMP FIX2 /YES TAD VALUE /NO-SET UP LINK JMS I (FINDS DCA VALUE TAD FIXMD0 /SET ' IN LISTING DCA LININD ISZ LINK /BUMP NUMBER OF LINKS GENERATED FIXMD0, 0700 /PROTECTION FOR ISZ LGERR, SKP /JMS I PERROR IF /E SPECIFIED LG JMS ADDIND /SET INDIRECT BIT IN INSTRUCTION FIX2, TAD [200 /SET CURRENT PAGE BIT TAD VALUE2 DCA VALUE2 TAD IZIND AND [77 /WAS Z SPECIFIED? SNA CLA JMP FIX4 /NO JMS I [ERROR /YES - ILLEGAL REFERENCE IZ /TO PAGE 0 FIX4, TAD IZIND /WAS THERE AN I? AND [7700 SZA CLA JMS ADDIND /YES - ADD INDIRECT BIT TO INSTRUCTION TAD VALUE /GET ADDRESS AND [177 TAD VALUE2 /GET OP CODE DCA VALUE /STORE POPJ, TAD I PDLXR DCA TEMP /POP A WORD OFF THE STACK JMP I TEMP /JUMP THROUGH IT. ADDIND, 0 /ROUTINE TO ADD INDIRECT BIT TO AN INSTR TAD VALUE2 CMA AND [400 SZA /WAS THERE ONE ALREADY? JMP .+3 /NO JMS I [ERROR /YES - ILLEGAL INDIRECT II TAD VALUE2 DCA VALUE2 JMP I ADDIND / ALLOWS MULTIPLE NON-RESIDENT INPUT HANDLERS TO NOT BOMB PTCH, 0 /RUNS IN DF 10 TAD (7647 /POINT TO DEVICE DCA PTR /HANDLER RESIDENCY TABLE TAD [-17 /IT HAS 15 ENTRIES DCA KNTR /V3C KLOOP, TAD I PTR /GET HANDLER ENTRY POINT AND [7600 /LOOK AT PAGE IT'S ON TAD [-INDEVH /IS IT ON THE PAGE WE PUT BUFFER OVER? SNA CLA /WELL? DCA I PTR /YES IT IS, WIPE IT FROM RESIDENCY ISZ PTR /LOOK AT NEXT ENTRY ISZ KNTR /ANY MORE ENTRIES? JMP KLOOP /YES, MIGHT HAVE TO WIPE SEVERAL GUYS TAD [200 /INCREASE INPUT BUFFER SIZE JMP I PTCH /V3C PAGE /COMBINE CURRENT VALUE WITH PREVIOUS VALUE /ACCORDING TO LAST OPERATOR OP0, TAD VALUE2 /HANDLER FOR + TAD VALUE /** OP0+1 AND OP0+2 JUMPED TO ** DCA VALUE EXP3, TAD CHAR /GET LAST OPERATOR TAD (-"+ /WAS IT A + OR - ? CLL RTR SNA JMP PLSMIN /YES - LINK=0 FOR +, 1 FOR - RTL TAD ("+-"% CLL RAR SNA /IS THE CHAR % OR &? JMP DIVAND /YES - LINK=0 FOR %, 1 FOR & RAL TAD ("%-240 CLL RAR SNA /IS THE CHAR SPACE OR !? JMP BLKEXP /YES - LINK=0 FOR SPACE, 1 FOR ! RAL TAD (240-"^ SNA CLA /IS THE CHAR ^? JMP MUL /YES - LINK IRRELEVANT JMS I (ENDCHK /NO-SEE IF END OF LINE FOUND JMP EXP3 /NO-TRY AGAIN EXPXIT, TAD UNDFSW /EXIT FROM EXP SNA CLA /RESTORE EXIT POINT JMP I (POPJ /--EXIT VIA POPJ-- CLA CMA DCA UNDFSW /SET UNDEFINED SWITCH DCA VALUE /RESULT IS 0 JMP I (POPJ /--EXIT VIA POPJ-- MUL, CLL IAC /LINK DOESN'T COUNT FOR ^ BLKEXP, IAC /** BLANK ASSUMED TO BE 4 ELSEWHERE ** DIVAND, IAC PLSMIN, RAL JMP I (EXP1 /GET REST OF EXPRESSION /HANDLER FOR & OP2, TAD VALUE AND VALUE2 JMP OP0+2 /HANDLER FOR ^ /MULTIPLY BY REPEATED ADDITION OP4, TAD VALUE CIA DCA TEMP TAD VALUE2 ISZ TEMP JMP .-2 JMP OP0+2 OP1, TAD VALUE2 /- OPERATOR CIA JMP I (OP0+1 /JUMP INTO ADD OPERATOR /OPTIONAL HANDLER FOR ! AS 6 BIT LEFT SHIFT AND THEN OR: OP3, TAD VALUE JMS I [RTL6 AND [7700 /ISOLATE 6 BITS AND FALL INTO "OR" DCA VALUE /V3C /HANDLER FOR ! AND SPACE AS INCLUSIVE OR OP5, TAD VALUE CMA AND VALUE2 JMP I (OP0+1 /CHARACTER INPUT CHECK /ENTER WITH CHARACTER IN AC LSTCH9, SZA /IGNORE NULL (0) TAD (-177 SZA /IGNORE RUBOUT (377) TAD (177-13 SZA /IGNORE VERTICAL TAB (213) IAC SNA JMP I (INPUT+1 /IGNORE LINE FEED (212) TAD [12-32 /WAS IT ^Z (END-OF-FILE=232)? SNA JMP I (ENDCHR /YES - GET NEXT FILE TAD (32-15 /NO - WAS IT CARRIAGE RETURN? SNA JMP LSTCHR /YES - LAST CHARACTER OF LINE IAC /NO SNA /WAS IT FORM FEED (214)? JMP FORCHR /YES - HANDLER FORM FEED ISZ I (INPUT TAD (14+200 DCA LSTCH5 /STORE CHARACTER TAD PASS /IS THIS PASS 3? SPA SNA CLA JMP LSTCH4 /NO - ISZ LSTCH6 /YES - FILLING HEADER AREA? JMP LSTCH3 /YES CLA CMA /NO - RESET SWITCH DCA LSTCH6 LSTCH4, TAD I (INPUT DCA TEMP TAD LSTCH5 /GET CHARACTER IN AC JMP I TEMP /-EXIT FROM INPUT- LSTCH3, ISZ LSTCH7 /FILLING HEADER TAD LSTCH5 /STORE CHARACTER IN HEADER AREA DCA I LSTCH7 JMP LSTCH4 LSTCH5, 0 LSTCH6, -HEDLEN LSTCH7, HEADER-1 LSTCHR, TAD FORMSW /CARRIAGE RETURN WAS FOUND SNA CLA /HAS THERE BEEN A FORM FEED? JMP LSTCH1 /NO - DCA FORMSW /YES - CLEAR FORM FEED SWITCH ISZ EDITPG /GO TO NEXT EDITOR PAGE DCA THISPG /CLEAR OVERFLOW PAGE TAD PASS /IS THIS PASS 3? SMA SZA CLA JMS I [FORMFD /YES - GENERATE FORM FEED LSTCH1, TAD [215 /NO - CARRIAGE RETURN IS CHARACTER DCA LSTCH5 JMP LSTCH4-2 /EXIT FORCHR, ISZ FORMSW /SET FORM FEED SWITCH JMP I (INPUT+1 /GET ANOTHER CHARACTER FORMSW, 1 PAGE /ERROR MESSAGE OUTPUT DUMPS1, ERROR, 0 CLA ISZ ERCNT /COUNT THE ERRORS ERPLUS, "+ /PROTECTION TAD I ERROR /GET ERROR MESSAGE ISZ ERROR /INCREMENT RETURN ADDRESS JMS I [ERROR1 /OUTPUT 2 CHARACTER ERROR MESSAGE TAD (JMP I [7600 /PUT EXIT TO MONITOR CSWIT1, DCA I (LSWITC /IN SWITCH - "CLA" IF /C TAD PASS /IS THIS PASS 3? SMA SZA CLA JMP ERROR4 /YES - CARRIAGE RETURN/LINE FEED JMS I [ERROR1 /NO - OUTPUT 2 SPACES TAD [1777 /IS THERE A TAG SAVED? AND LAST1 SNA JMP ERROR3 /NO JMS I (DIV45 /YES - OUTPUT FIRST 2 CHARACTERS TAD LAST2 /OUTPUT SECOND 2 CHARACTERS JMS I (DIV45 TAD LAST3 JMS I (DIV45 /OUTPUT THIRD 2 CHARACTERS TAD LAST4 /IS ERROR LOCATION SAME AS LAST TAG? CIA TAD LOC SNA CLA JMP ERROR4 /YES - CARRIAGE RETURN TAD ERPLUS JMS I OERROR TAD LAST4 CIA ERROR3, TAD LOC /OUTPUT 4 DIGIT ADDRESS OR INCREMENT JMS I (OCTPRT ERROR4, TAD [215 /OUTPUT CARRIAGE RETURN/LINE FEED JMS I OERROR JMP I ERROR /--RETURN-- /RESET LITERAL TABLES AND POINTERS DUMPS5, CLEAN, 0 TAD (LITBUF-1 DCA XREG1 /SET LITERAL TABLE POINTER TAD (TPINST-1 DCA XREG2 /SET TOP INST. TABLE POINTER TAD (-40 DCA TEMP TAD [200 DCA I XREG1 /SET LITERAL TABLE ENTRIES TO 200 DCA I XREG2 /SET TOP INST. TABLE ENTRIES TO 0 ISZ TEMP JMP .-4 DCA LAST1 /CLEAR LAST DEFINED TAG JMP I CLEAN /--RETURN-- /DUMP CURRENT PAGE LITERALS DUMPS, 0 JMS I [FINDSP SNA /IF THIS IS PAGE 0, JMP I DUMPS /--RETURN-- TAD [LITBUF DCA DUMPS1 TAD LITPTR CIA CLL TAD I DUMPS1 DCA DUMPS2 /STORE NUMBER OF LITERALS ON THIS PAGE SZL /ARE THERE ANY? JMP D2 /V3C DCA STARSW /FORCE ORIGIN PUNCH IF RELOC JUST INVOKED TAD LOC AND [7600 TAD I DUMPS1 JMS I [PUNORG /OUTPUT ORIGIN TAD I DUMPS1 TAD (LITBF1 DUMPS3, DCA DUMPS5 TAD I [LINBUF /SAVE LINBUF JMS I [PUSHA DCA I [LINBUF DUMPS6, TAD I DUMPS5 DCA VALUE JMSPUN, JMS I [PUNONE /OUTPUT ONE REGISTER ISZ LOC ISZ DUMPS5 LITHAK, ISZ I DUMPS1 /DESTROY RECORD OF CURRENT PAGE LITERALS - /ZEROED IF NO /W OPTION SPECIFIED ISZ DUMPS2 JMP DUMPS6 TAD I PDLXR DCA I [LINBUF /RESTORE LINBUF D2, TAD DUMPS1 /WIPE REMEMBRANCE OF TOP OF PAGE (JR) TAD (40 /V3C DCA DUMPS5 D3, DCA I DUMPS5 JMP I DUMPS /--RETURN-- /HANDLER FOR ZBLOCK PSEUDO-OP /RESERVES AS MANY WORDS OF ZERO /AS VALUE OF EXPRESSION ZBLOCX, JMS I [SPNOR /IGNORE SPACES JMS I [EXP /GET THE EXPRESSION TAD VALUE CMA /PROTECT AGAINST ZERO CASE DCA TEMP3 /STORE NEGATIVE AS COUNTER JMP ZBLOCZ /JUMP INTO LOOP ZBLOCY, JMS I [PUNBIN /OUTPUT ONE WORD OF ZERO TAD PASS /IS THIS PASS 3? SMA SZA CLA DCA I (PUNMOD /YES - PREVENT OUTPUT ZBLOCZ, ISZ TEMP3 /NO - DONE YET? JMP ZBLOCY /NO - CONTINUE TAD JMSPUN /YES - RESTORE PUNMOD DCA I (PUNMOD JMP I [LOOKEX /--EXIT TO MAIN-- /DUMP PAGE 0 LITERALS DUMPS2, DUMPZ, 0 TAD DUMPZ /RESET EXIT FROM DUMPS DCA DUMPS TAD [200 CIA CLL TAD I [LITBUF /STORE THE NUMBER OF LITERALS ON PAGE 0 DCA DUMPS2 SZL /ARE THERE ANY? JMP I DUMPS /NO - ** DUMPZ IS DESTROYED ** TAD I [LITBUF JMS I [PUNORG /OUTPUT ORIGIN TAD I [LITBUF /SET VALUES FOR DUMPS TAD (LITBF2 JMP DUMPS3 PAGE /ENTER A TAG INTO SYMBOL TABLE IFZERO HASH< INSRTG, 0 TAD VALUE2 /SAVE VALUE 2 JMS I [PUSHA ISZ HIGHTG /COUNT IN THIS TAG TAD TAGMAX CLL CIA /GET LIMIT OF SYMBOL STORAGE TAD HIGHTG /IS THERE ROOM FOR ONE MORE? SZL JMP I (SYMOFL /NO - SE**FATAL ERROR** TAD TAGMAX /YES - IS USR IN CORE? TAD (-1340 SZL CLA JMP GETTG5 /YES TAD [7700 /NO - RESET ADDRESS TO DCA IOMON /USR NON-RESIDENT AC7776 AND I (JSBITS /RESET JOB STATUS WORD TO DCA I (JSBITS /SAVE CORE WHEN USR CALLED GETTG5, TAD THISTG /SEARCH SYMBOL TABLE DCA TEMP2 TAD HIGHTG IAC DCA THISTG GETTG8, AC7776 TAD THISTG DCA THISTG JMS I [FINDTG /GET NEXT TAG FROM SYMBOL TABLE ISZ THISTG TAD THISTG CIA TAD TEMP2 /DOES NEW TAG GO WHERE PREVIOUS TAG WAS? SNA CLA JMP GETTG9 /YES-PUT IT THERE AND EXIT JMS I [PUTTAG /NO-REPLACE RETRIEVED TAG WHERE PREVIOUS TAG WAS JMP GETTG8 /THE ABOVE CODE WILL BE OPTIMIZED AT INITIALIZATION /IF THE ASSEMBLER IS TO BE RESTRICTED TO 8K OF CORE GETTG9, TAD I (NAME1 /GET CURRENT TAG DCA TAG1 /PUT IT IN TAG1-TAG3 TAD I (NAME2 DCA TAG2 TAD I (NAME3 DCA TAG3 TAD I PDLXR /RESTORE VALUE 2 DCA VALUE2 JMS I [PUTTAG /PUT TAG1 - TAG3 INTO SYMBOL TABLE JMP I INSRTG /--RETURN-- TAGMAX, 1740 /12K=3740, ... > / IFNZRO HASH< /***HACK ONLY*** /TLYREF, 0 /TALLY REFS TO SYMBOL TABLE / ISZ NREFL / JMP I TLYREF / ISZ NREFH / JMP I TLYREF / JMP I TLYREF /TLYPRB, 0 /TALLY PROBES INTO TABLE / JMS I [FINDTG /FUDGE, OUT OF ROOM / ISZ NPROBL / JMP I TLYPRB / ISZ NPROBH / JMP I TLYPRB / JMP I TLYPRB /NREFH, 0 /NREFL, 0 /NPROBH, 0 /NPROBL, 0 / > /***HACK ONLY*** IFNZRO HASH< /INSERT A TAG INTO THE HASH TABLE INSRTG, 0 ISZ HIGHTG /BUMP SYM NUM (SKIPS ON 0) TAD HIGHTG STL CMA TAD TAGMAX SNA SZL CLA /STILL ROOM FOR AT LEAST 2 MORE? JMP I (SYMOFL /NO SE** FATAL ERROR** TAD I (NAME1 DCA TAG1 TAD I (NAME2 DCA TAG2 TAD I (NAME3 DCA TAG3 JMS I [PUTTAG /NOW ACTUALLY INSERT IT JMP I INSRTG > /OUTPUT 2 CHARACTER WORD /FROM SYMBOL TABLE FORMAT /DIVIDE BY 45(8) DIV45, 0 RAL CLL RAR /CLEAR SIGN BIT DIV45A, ISZ DIV45C TAD (-45 SMA JMP DIV45A TAD (45 JMS DIV45E DCA DIV45B STA TAD DIV45C JMS DIV45E JMS I [RTL6 TAD DIV45B JMS I [ERROR1 /OUTPUT 2 CHARACTERS DCA DIV45C /CLEAR DIV45C FOR NEXT GO-ROUND JMP I DIV45 /--RETURN-- DIV45B, 0 DIV45C, 0 /** MUST BE 0 WHEN DIV45 IS ENTERED ** DIV45E, 0 SNA JMP I DIV45E TAD (-33 SMA TAD (20-40-33 TAD (33+40 JMP I DIV45E /--RETURN-- /HANDLER FOR FIXTAB PSEUDO-OP FIXTBX, TAD PASS /IS THIS PASS 1? SMA CLA JMP I [LOOKEX /NO--EXIT TO MAIN-- JMP I (FIXTAY /YES--DO FIXTAB /SET FIELD SETFLD, 0 CLA CLL /SETFLD CALLED WITH AC RANDOM DCA SETFL1 /INITIALIZE FIELD IFNZRO HASH< TAD USROFS /FUDGE FOR KEEPING USR AROUND > TAD THISTG SETFLP, ISZ SETFL1 CML TAD (-1740 /PUT 1740 SYMBOLS IN EACH FIELD SNL /IS THE DIVIDE THROUGH? JMP SETFLP /NO - CONTINUE IFZERO HASH< CLL CMA RTL /AC CONTAINED REM-1740; THIS MAKES IT INTO TAD (-1 /7573-4*REM WHICH IS THE ADDRESS WE WANT > IFNZRO HASH< CLL RTL /AC GETS 0201 TO 7775 TAD (-202 /AC GETS 7777 TO 7573 FOR TAGXR > DCA TAGXR /TO STICK INTO AN AUTO-XR TAD SETFL1 CLL RTL RAL TAD SETFL2 DCA SETFL1 SETFL1, HLT JMP I SETFLD /--RETURN-- IFNZRO HASH< USROFS, 0 /GETS 400 IF KEEPING USR > /FIND TAG /GET TAG FROM SYMBOL TABLE /PUT IT INTO TAG1-TAG3 /WITH ITS VALUE IN VALUE2 FINDTG, 0 TAD THISTG JMS SETFLD TAD I TAGXR DCA TAG1 TAD I TAGXR DCA TAG2 TAD I TAGXR DCA TAG3 TAD I TAGXR DCA VALUE2 SETFL2, CDF JMP I FINDTG /--RETURN-- /OPTIMIZATION MAY CHANGE SETFLD TO /REMOVE CLA ON ENTRY PAGE /BEGINNING OF PASS CODE JMS I (IOPEN /SET INPUT ROUTINE TO OPEN FILE START2, ISZ PASS /SET UP COUNTERS AND POINTERS DCA XLISTX /CLEAR XLIST SWITCH DCA FLDIND /SET FIELD TO 0 DCA VALUEX /SET BANK TO ZERO(128K) DCA CONDSW DCA EDITPG DCA LINK DCA RADIX DCA ERCNT DCA GETCI DCA PUNCHX DCA I [LINBUF TAD (PDLST DCA PDLXR JMS I [CLEAN TAD [200 DCA LITPTR TAD [200 JMS I [PUNORG JMP I (LOOKE1 /--EXIT TO MAIN-- /HANDLER FOR $ ENDPAS, JMS I [DUMPS /DUMP CURRENT PAGE LITERALS DCA OFSBUF /CLEAR OFFSET FOR NEXT PASS TAD PASS /WHAT PASS IS ENDING? SNA JMP I (ENDPA2 /PASS 2 SPA CLA JMP I (START1 /PASS 1 TAD I [LINBUF /PASS 3 SNA CLA /ANYTHING TO PRINT? JMP ENDPA1-1 /NO TAD [211 /YES - TAB OVER TWICE JMS I OERROR TAD [211 JMS I OERROR JMS I [LINPRT /PRINT LINE JMS I [DUMPZ /DUMP PAGE 0 LITERALS ENDPA1, DCA XLISTX /OUTPUT SYMBOL TABLE SSWITC, JMS I (SYMPRT /(0 IF /S) TAD I (FORM21 DCA I (FORM22 JMS I [FORMFD /OUTPUT FORM FEED ERMSGS, TAD ERCNT JMS OUTTTL /PRINT "ERRORS DETECTED: N" TAD LINK JMS OUTTTL /PRINT "LINKS GENERATED: N" FINLFF, JMS I [FORMFD /PRINT FINAL FF (ZEROED IF NO PASS 3) JMS I (OCLOSE /AND CLOSE THE OUTPUT FILE /CREF AND LOAD-AND-GO OPTIONS /****FINAL EXIT TO MONITOR**** LSWITC, JMP I [7605 /0 IF /L OR /G OR /C TAD (7616 DCA XREG1 CDF 10 CSWITC, TAD I [7600 /"TAD I [7605" IF /C AND [17 DCA I XREG1 /SET BINARY DEVICE TAD BINSRT /EXIT FROM PAL8 BY CHAINING /TO NEXT PROGRAM /SHOULD BE ABSLDR OR CREF DCA I XREG1 /SET STARTING BLOCK DCA I XREG1 /SET 0 TERMINATOR CDF TAD I (JSBITS /SET BIT 11 OF JOB STATUS WORD RAR /SO 10000-11777 IS NOT SAVED CLL CML RAL DCA I (JSBITS CIF 10 JMS I IOMON /CALL USER SERVICE ROUTINES 6 /*CHAIN TO NEXT PROGRAM* CHAIN, 0 /STARTING BLOCK OF NEXT PROGRAM OUTTTL, 0 DCA LAST1 /SAVE NUMBER TO BE PRINTED OUTTLL, TAD I TTLPTR /GET A WORD OF MESSAGE ISZ TTLPTR SNA /END? JMP PRTTTL /YES JMS I [ERROR1 /NO - PRINT IT JMP OUTTLL /AND LOOP PRTTTL, TAD [240 /PRINT A SPACE JMS I OCHAR TAD LAST1 JMS I (FORMF4 /PRINT NUMBER IN DECIMAL JMS I (CRLF /PRINT CR AND 2 LF'S (1 IF PASS 3) JMP I OUTTTL /AND RETURN TTLPTR, TTLMSG /COME HERE TO LOAD THE PASS 3 OVERLAY AT THE END OF PASS 2 LOADOV, JMS I (7607 /CALL SYSTEM DEVICE HANDLER 0200 /SWAP IN CODE UNIQUE TO PASS 3 SWAP1 /BUFFER ADDRESS ASWAP /STARTING BLOCK NUMBER JMP I (SYSER3 /DE**FATAL ERROR** NSWITC, JMP START2 /(0 IF NO LIST FILE, SKP IF /N) START PASS3 JMP ERMSG1 JMP ENDPA1 ERMSG1, TAD (OTYPEO /COME HERE IF NO PASS 3 OUTPUT FILE DCA OCHAR TAD (OTYPEO DCA OERROR TAD [7600 DCA I (OTYPCR /INHIBIT AUTO-LF ON CARRIAGE RETURN DCA FINLFF /KILL LAST FORM FEED JMP ERMSGS /ADD BITS TO PUNCH ORIGIN PUNORG, 0 DCA LOC TAD PASS /IS THIS PASS 2? SZA CLA JMP I PUNORG /NO--RETURN-- TAD LOC /YES - OUTPUT ORIGIN SETTING TAD OFFSET /"LOC" MAY BE FICTITIOUS - MAKE IT REAL CLL CML ISZ STARSW /INHIBIT PUNCHING ORIGIN IF NECESSARY JMS I [PUNOUT CLA DCA STARSW /RESET SWITCH JMP I PUNORG /--RETURN-- PAGE /EVALUATE LITERAL LIT, STA RAL /-2 IF PAGE 0 LITERAL, -1 IF CUR PAGE DCA FINDS1 /SAVE FLAG JMS I [GETC /GET NEXT CHARACTER JMS I [SPNOR /IGNORE SPACES TAD EXPIND /STORE IMPORTANT VALUES PRIOR TO JMS I [PUSHA /ENTRANCE INTO EXP TAD OP JMS I [PUSHA TAD VALUE JMS I [PUSHA TAD FINDS1 JMS I [PUSHA JMS I [EXP /GET EXPRESSION TAD VALUE /FIND LITERAL IN TABLE ISZ I PDLXR /PAGE 0? JMP .+3 JMS FINDS /NO SKP JMS FIND0 /YES DCA VALUE2 /STORE ADDRESS TAD I PDLXR DCA VALUE TAD I PDLXR /RESTORE SAVED VALUES DCA OP TAD I PDLXR DCA EXPIND TAD CHAR /IGNORE ) OR ] TAD (-") SZA TAD (")-"] SNA CLA JMS I [GETC /GET NEXT CHARACTER JMP I (NUMBE5 /RETURN TO EXPRESSION PROCESSOR PEZE, 0 /SUBR TO ISSUE PE OR ZE MESSAGE SNA CLA /WHICH ONE? JMP .+4 /PAGE 0 JMS I PERROR PE JMP I PEZE JMS I PERROR ZE JMP I PEZE /FIND LITERAL ON CURRENT PAGE FINDS, 0 DCA FINDS1 TAD LOC AND [7600 SNA /IS THIS PAGE 0? JMP FIND01 /YES DCA FINDS2 /NO - SAVE PAGE NUMBER TAD (LITBF1 DCA FIND0 TAD [7700 /ALLOW 100(8) CURRENT PAGE LITERALS DCA FORMF6 TAD LITPTR /GET PG ADDR OF 1ST LITERAL IN BUFFER FIND02, DCA FINDS3 TAD FINDS2 JMS I [RTL6 TAD [LITBUF DCA TEMP TAD FIND0 /COMPUTE ACTUAL CORE ADDRESS OF LITERAL TAD I TEMP DCA TEMP2 TAD FINDS3 /COMPUTE THE NUMBER OF ENTRIES CIA TAD I TEMP /IN THE LITERAL BUFFER SNA JMP FINDS6 /NONE DCA FINDS3 FINDS4, TAD I TEMP2 /GET LITERAL FROM TABLE CIA TAD FINDS1 /AND CURRENT LITERAL SNA CLA /DO THEY MATCH? JMP FINDS5 /YES ISZ TEMP2 /NO - BUMP COUNTERS ISZ FINDS3 JMP FINDS4 /TRY AGAIN FINDS6, TAD FINDS2 JMS I [RTL6 TAD [TPINST DCA FINDS3 TAD I TEMP /DOES THIS OVERFLOW PAGE? CIA TAD I FINDS3 SPA CLA JMP FINDS7 /NO FIND03, TAD FINDS2 /PAGE FULL - WHICH PAGE? JMS PEZE /GENERATE PE OR ZE MESSAGE CLA CMA JMP FINDS9 FINDS7, CLA CMA TAD I TEMP /IS PAGE FULL? AND FORMF6 SNA CLA JMP FIND03 /YES - OUTPUT ERROR MESSAGE CLA CMA TAD I TEMP /NO DCA I TEMP FINDS9, TAD I TEMP TAD FIND0 DCA TEMP2 TAD FINDS1 DCA I TEMP2 FINDS5, TAD FIND0 /GET ADDRESS OF LITERAL CIA TAD TEMP2 TAD FINDS2 JMP I FINDS /--RETURN-- /FIND LITERAL ON PAGE 0 FIND0, 0 DCA FINDS1 TAD FIND0 /RESET EXIT FROM FINDS DCA FINDS FIND01, DCA FINDS2 /SET POINTERS TAD (LITBF2 DCA FIND0 TAD [7760 /ALLOW 160(8) PAGE 0 LITERALS DCA FORMF6 TAD [200 JMP FIND02 FINDS1, 0 FINDS2, 0 FINDS3, 0 PAGE /HANDLER FOR IFZERO PSEUDO-OP IF0, TAD (10 /IFTST1, SNA CLA /HANDLER FOR IFNZERO PSEUDO-OP IFN0, TAD IFSZA /IFTST1, SZA CLA DCA IFTST1 JMS I [SPNOR /IGNORE SPACES JMS I [EXP /GET EXPRESSION IFTST3, TAD CHAR /GET LAST CHARACTER TAD (-"< SNA CLA /IS IT <? JMP IFTST2 /YES JMS ICMESG /PRINT IC MESSAGE AND GET NEXT CHAR IFTST9, JMS I [SPNOR /IGNORE SPACES JMP IFTST3 /TRY AGAIN IFTST2, JMS I [GETC /GET NEXT CHARACTER TAD CONDSW CIA DCA CONDTM /SET NUMBER OF NESTED CONDITIONALS CLA CMA /DECREMENT NUMBER OF NESTED CONDITIONALS TAD CONDSW DCA CONDSW TAD VALUE IFTST1, HLT /SZA CLA OR SNA CLA JMP I (MAIN /--EXIT TO MAIN-- IFTST5, TAD CONDSW /DONE WITH ALL CONDITIONALS IN NEST? TAD CONDTM SMA CLA JMP I (MAIN /YES --EXIT TO MAIN-- TAD CHAR TAD (-"< /NO - GET NEXT CHARACTER SNA /IS IT <? JMP IFTST6 /YES - HANDLE NEXT CONDITIONAL TAD ("<-"> /NO - IS IT >? IFSZA, SZA CLA JMP IFTST4 /NO - FINISH THIS CONDITIONAL AC7776 IFTST6, CMA TAD CONDSW DCA CONDSW IFTST4, DCA I [LINBUF /INHIBIT LISTING OF UNASSEMBLED CODE - /ZEROED IF /J OPTION NOT SPECIFIED JMS I [GETC /GET NEXT CHARACTER JMP IFTST5 /HANDLER FOR IFDEF PSEUDO-OP IFD, TAD (10 /IFTST1, SNA CLA /HANDLER FOR IFNDEF PSEUDO-OP IFND, TAD IFSZA /IFTST1, SZA CLA DCA IFTST1 IFTST7, JMS I [SPNOR /IGNORE SPACES JMS I [TSTALP /IS NEXT CHARACTER ALPHABETIC JMP IFTST8 /YES JMS ICMESG /PRINT IC MESSAGE AND GET NEXT CHAR JMP IFTST7 /KEEP TRYING IFTST8, JMS I [GETTAG /PICK UP TAG DCA VALUE /STORE UNDEFINED INDICATOR TAD TAG3 /WAS IT A PSEUDO-OP? SMA CLA JMP IFTST9 /NO JMS I [ERROR /YES - GENERATE IP ERROR MESSAGE IP JMP IFTST9 ICMESG, 0 JMS I [ERROR IC /IC COMES OUT ON ALL PASSES TAD CHAR SPA CLA JMP I [LOOKEX /END OF LINE - GO AWAY JMS I [GETC /GET NEXT CHAR JMP I ICMESG CONDTM, /PUT TAG IN SYMBOL TABLE PUTTAG, 0 TAD THISTG JMS I (SETFLD /SET FIELD TAD TAG1 DCA I TAGXR TAD TAG2 DCA I TAGXR TAD TAG3 DCA I TAGXR TAD VALUE2 DCA I TAGXR CDF JMP I PUTTAG /--RETURN-- /PUSHDOWN ROUTINE /PUT NEW ENTRY ON PUSHDOWN STACK PUSHA, 0 DCA TEMP CLA CMA TAD PDLXR DCA PDLXR TAD PDLXR TAD (-PDLND SPA CLA /IS LIST TOO FULL? JMP PUSHA1 /BE**FATAL ERROR** TAD TEMP /NO - MAKE ENTRY DCA I PDLXR CLA CMA TAD PDLXR DCA PDLXR JMP I PUSHA /--RETURN-- PUSHA1, TAD (BE JMP I [MONERR /PUSHDOWN OVERFLOW IS FATAL ERROR /TEST NUMERIC ROUTINE /CALL WITH CHARACTER TO TEST IN "CHAR" /SKIPS IF THE CHARACTER IS NOT NUMERIC TSTNUM, 0 TAD CHAR /GET THE CHARACTER TAD (-"9-1 CLL TAD ("9-"0+1 SNL CLA /CHECK FOR RANGE 0-9 ISZ TSTNUM /OUT OF RANGE JMP I TSTNUM /--RETURN-- /TEST ALPHANUMERIC ROUTINE /CALL WITH CHARACTER IN "CHAR" /SKIPS IF CHARACTER IS NOT ALPHANUMERIC TSTALN, 0 JMS I [TSTNUM /IS IT NUMERIC JMP I TSTALN /YES--RETURN-- JMS I [TSTALP /IS IT ALPHABETIC JMP I TSTALN /YES--RETURN-- ISZ TSTALN /NEITHER JMP I TSTALN /--RETURN-- /TEST ALPHABETIC ROUTINE /CALL WITH CHARACTER IN "CHAR" /SKIPS IF NOT ALPHABETIC TSTALP, 0 TAD CHAR TAD (-"Z-1 CLL TAD ("Z-"A+1 SNL CLA /CHECK FOR RANGE A-Z ISZ TSTALP /OUT OF RANGE JMP I TSTALP /--RETURN-- PAGE /INPUT ROUTINE /UNPACKS CHARACTERS FROM BUFFER INPUT, 0 ISZ INCHCT /ARE THERE CHARACTERS LEFT IN BUFFER? JMP I CHARLV /YES - FETCH ONE TAD INEOF /NO - WAS OLD FILE ENDED? SZA CLA JMP ENDCHR /YES - START NEW FILE INGBUF, TAD INCTLA /NO AND [7600 JMS I [RTL6 TAD INCTR SNL DCA INCTR SZL ISZ INEOF CLL CML CMA RTR /SET CONTROL WORD RTR RTR TAD INCTLA DCA INCTLW JMS I INHNDL /CALL INPUT DEVICE HANDLER INCTLW, 0 /CONTROL WORD INBUFP, INBUF /INPUT BUFFER ADDRESS INREC, 0 /STARTING BLOCK NUMBER JMP INERRX /ERROR RETURN INBREC, TAD INCTLA /NORMAL RETURN AND [7600 JMS I [RTL6 TAD INREC DCA INREC /RESET STARTING BLOCK NUMBER TAD INCTLW AND [7600 CLL RAL TAD INCTLW AND [7600 CIA DCA INCHCT /SET CHARACTER COUNT TAD INBUFP DCA INPTR /SET BUFFER POINTER /CHARACTERS ARE FOUND IN BUFFER /IN STANDARD OS/8 PACKING /WORD 1: AAA A11 111 111 /WORD 2: BBB B22 222 222 /WHICH REPRESENTS 3 CHARACTERS /CHARACTER 1: 11 111 111 /CHARACTER 2: 22 222 222 /CHARACTER 3: AA AAB BBB ICHAR1, TAD I INPTR /PICK UP CHARACTER WORD 1 JMS CHARLV /CHECK RIGHT 8 BITS ICHAR2, TAD I INPTR /PICK UP WORD 1 ISZ INPTR /(INCREMENT POINTER TO WORD 2) AND [7400 /WITH WORD 1 IN AC DCA INCTLW /RETRIEVE LEFT 4 BITS AND SAVE TAD I INPTR /PICK UP WORD 2 JMS CHARLV /CHECK RIGHT 8 BITS ICHAR3, TAD I INPTR /PICK UP WORD 2 ISZ INPTR /(POINT TO NEXT WORD 1) AND [7400 /WITH WORD 2 IN AC CLL RTR /RETRIEVE LEFT 4 BITS RTR TAD INCTLW /PUT BOTH SETS OF 4 BITS TOGETHER RTR RTR JMS CHARLV /CHECK CHARACTER JMP ICHAR1 /TRY NEXT SET OF 2 WORDS INERRX, ISZ INEOF SMA CLA /EOF OR FATAL ERROR? JMP INBREC /EOF - UNPACK THIS BUFFER JMP I (SYSERR /FATAL - GENERATE DE ERROR MESSAGE INCHCT, -1 INEOF, 1 INPTR, 0 INCTR, 0 INCTLA, 0 INFPTR, 7617 /START NEW FILE ENDCHR, ISZ I (FORMSW /^Z OR EOF SIMULATES FORM FEED TAD PASS /IS THIS PASS 3? SPA SNA CLA JMP NXTFLE /NO JMS I (HEDCLR /YES - CLEAR HEADING BUFFER TAD [-HEDLEN DCA I (LSTCH6 TAD [HEADER-1 DCA I (LSTCH7 DCA LSTCNT NXTFLE, TAD (INDEVH+1 /SET ADDRESS OF DEVICE HANDLER DCA INHNDL CDF 10 TAD I INFPTR CDF SNA JMP FAKDLR /END OF FILE - FAKE A $ CIF 10 JMS I IOMON /CALL USER SERVICE ROUTINES 1 /*FETCH HANDLER* INHNDL, 0 /LOADING ADDRESS OF HANDLER HLT /ERROR RETURN CDF 10 /V3C TAD INHNDL /NORMAL RETURN - HANDLER IN CORE AND [7600 TAD [-INDEVH /SEE IF INPUT HANDLER IS IN 7200 SZA CLA JMS I (PTCH /IT IS - INCREASE SIZE OF BUFFER /AND REMOVE FROM RESIDENCY ANY HANDLERS THERE TAD INCTL DCA INCTLA /DF=10 TAD I INFPTR AND [7760 SZA TAD [17 CLL CML RTR RTR DCA INCTR ISZ INFPTR TAD I INFPTR DCA INREC /RESET STARTING BLOCK NUMBER ISZ INFPTR DCA INEOF CDF JMP INGBUF FAKDLR, TAD (244 JMS CHARLV /CALL THE COROUTINE TAD [215 /WITH $ AND CR JMS CHARLV /TO END THE ASSEMBLY. JMP I (PHASE /** DIDN'T WORK - MUST BE IN CONDITIONAL - FATAL CHARLV, 0 /CHARACTER IN AC AND [177 /AND OFF LEFT 5 BITS JMP I (LSTCH9 /RETURN TO LSTCH9 PAGE /HANDLER FOR DTORG PSEUDO-OP (TYPESETTING) /PUNCHES 4 DIGIT BLOCK NUMBER IN 2 FRAMES /FIRST FRAME HAS CHANNELS 7 AND 8 PUNCHED /ADDED TO CHECKSUM DTORGX, JMS I [SPNOR /IGNORE SPACES JMS I [EXP /GET EXPRESSION TAD PASS /IS THIS PASS 2? SNA JMP DTORG2 /YES PUNVA1, SPA SNA CLA /NO - IS THIS PASS 3? JMP I [LOOKEX /NO--EXIT TO MAIN-- TAD LININD /GET LINK SWITCH FROM "EXP" DCA LINKSW /YES TAD [LOOKEX /FIX PUNONE TO EXIT TO MAIN DCA I (PUNONE TAD [211 /OUTPUT TAB JMS I OERROR JMP I (DTORG1 DTORG2, TAD VALUE /PASS 2 - GET BLOCK NUMBER JMS I [RTL6 RAL AND [77 TAD (300 /PICK UP CHANNELS 7 AND 8 DCA TEMP TAD TEMP TAD CHKSUM /ADD VALUE TO CHECKSUM DCA CHKSUM TAD TEMP JMS I OCHAR /OUTPUT BLOCK NUMBER - FIRST FRAME TAD VALUE AND [77 JMS I OCHAR /OUTPUT SECOND FRAME JMP I [LOOKEX /--EXIT TO MAIN-- /HANDLER FOR % /DIVIDE BY REPEATED SUBTRACTION OP6, DCA TEMP TAD VALUE2 CIA DCA VALUE2 TAD VALUE OP6A, CLL TAD VALUE2 /SUBTRACT DIVISOR FROM DIVIDEND SNL /DONE YET? JMP OP6B /YES - EXIT ISZ TEMP /NO - COUNT ONE MORE SUBTRACTION JMP OP6A /SUBTRACT AGAIN OP6B, CLA TAD TEMP /RESULT IS # OF SUBTRACTIONS JMP I (OP0+2 /HANDLER FOR XLIST PSEUDO-OP XLISTY, JMS XLISTZ /ANY EXPRESSION? JMP XLIST1 /NO JMS I [EXP /GET EXPRESSION TAD VALUE /USE THE VALUE XLIST2, DCA XLISTX /SET SWITCH DCA I [LINBUF /XLIST NEVER LISTS! JMP I [LOOKEX /--EXIT TO MAIN-- XLIST1, TAD XLISTX SNA CLA IAC /FLIP IT JMP XLIST2 RELOCY, JMS XLISTZ /RELOCATE PSEUDO-OP - EXPRESSION? JMP RELOC1 /NO JMS I [EXP /GET IT TAD VALUE CIA /COMPUTE OFFSET OF REL LOC CTR TAD LOC /FROM FAKE LOC CTR TAD OFFSET /OFFSET IS CUMULATIVE! RELOC2, DCA OFSBUF /SET NEW OFFSET - THIS TAKES EFFECT AFTER STA /THE LITERALS (IF ANY) ARE DUMPED. JMP I (STAR0 /FAKE ORIGIN TO NEW LOC, /ACTUALLY A NO-OP BECAUSE OF OFFSET RELOC1, TAD OFFSET /SET OFSBUF=0, LOC=LOC+OFFSET - TAD LOC /THIS CANCELS ALL RELOCATION STUFF. DCA VALUE DCA UNDFSW /JUST IN CASE - "STAR0" CHECKS THIS JMP RELOC2 /STILL MUST OUTPUT *. TO GET IN SYNCH /HANDLER FOR EJECT PSEUDO-OP EJECTX, ISZ THISPG TAD PASS /IS THIS PASS 3? SMA SZA CLA JMP EJECT2 /YES EJECT1, TAD CHAR /NO - LOOK FOR NEXT NEGATIVE CHARACTER SPA CLA JMP I [LOOKEX /--EXIT TO MAIN-- JMS I [GETC /GET NEXT CHARACTER JMP EJECT1 EJECT2, JMS XLISTZ /PASS 3 - IS THERE AN EXPRESSION? JMP EJECT3 /NO - EXIT JMS I (HEDCLR /YES - CLEAR HEADING BUFFER TAD [-HEDLEN DCA EJECT7 /SET UP FOR 40 NEW CHARACTERS TAD [HEADER-1 DCA XREG1 /SET HEADER BUFFER POINTER JMP EJECT4 EJECT6, ISZ EJECT7 /FILLED 40 CHARACTERS YET? JMP EJECT4 /NO - KEEP FILLING CLA CMA /YES - SKIP CHARACTERS TO DCA EJECT7 /END OF LINE JMP EJECT5 EJECT4, TAD CHAR /FILL HEADING BUFFER DCA I XREG1 EJECT5, CLA CMA DCA TXTSWT JMS I [GETC /GET NEXT CHARACTER TAD CHAR /END OF LINE? SMA CLA JMP EJECT6 /NO - KEEP FILLING EJECT3, JMS I [FORMFD /GENERATE FORM FEED JMP I [LOOKEX /--EXIT TO MAIN-- PUNVAL, TAD PASS /IS THIS PASS 3? JMP PUNVA1 /IF SO, LIST STUFF /SEE IF EXPRESSION FOLLOWS XLIST /SKIP ON EXPRESSION EJECT7, XLISTZ, 0 JMS I [SPNOR /IGNORE TRAILING SPACES TAD CHAR TAD [-"> /IS THERE AN EXPRESSION? SNA CLA JMP I XLISTZ /NO--RETURN-- TAD CHAR SMA CLA ISZ XLISTZ /YES - INCREMENT RETURN ADDRESS JMP I XLISTZ /--RETURN-- /DUMMY ERROR ROUTINE /TO SUPPRESS CERTAIN ERROR MESSAGES /ON PASS 1 PERRO1, 0 ISZ PERRO1 /SKIP ERROR MESSAGE POINTER JMP I PERRO1 /--RETURN-- /CONSTANTS FOR DECIMAL PRINT DECIMAL FORMF8, -1000 -100 -10 0 OCTAL PAGE /********************************************************************* INBUF=. /INPUT BUFFER OUBUF=. /OUTPUT BUFFER OUDEVH=.+400 /OUTPUT DEVICE HANDLER INDEVH=7200 /INPUT DEVICE HANDLER /********************************************************************** / EXPLANATION OF PAL8'S BUFFER ALLOCATION ALGORITHM /PASS1: / THE INPUT BUFFER STARTS AT 5600 AND ENDS AT 7200 / THE INPUT HANDLER GOES IN 7200-7600. / THERE IS NO OUTPUT HANDLER. / HOWEVER, IF THE CURRENT INPUT HANDLER DOES NOT / LOAD INTO 7200, THEN THE BUFFER SIZE IS INCREASED / SO THAT THE INPUT BUFFER IS 5600-7600 /PASS2 AND PASS3: / THE OUTPUT BUFFER IS ALWAYS 1 BLOCK LONG, LOCATED / AT 5600-6200. / THE OUTPUT HANDLER RESIDES IN 6200-6600. / THE INPUT HANDLER RESIDES IN 7200-7600. / THE INPUT BUFFER NORMALLY RESIDES IN 6600-7200 / BUT MAY GROW OVER EITHER THE INPUT HANDLER AREA OR / THE OUTPUT HANDLER AREA, IF EITHER OR BOTH OF THESE / DON'T EXIST. /WHENEVER A BUFFER GROWS OVER A HANDLER AREA, THE MONITOR /HANDLER RESIDENCY TABLE IS SEARCHED TO SEE IF THERE /WERE ANY HANDLERS THERE. IF ANY HANDLERS WERE THERE IN THE PAST, /THEY ARE NOW MARKED AS BEING NON-RESIDENT. /MORE ONCE ONLY CODE OTYPE, 0 DCA TEMP CDF 10 TAD I TEMP AND [17 /GET DEVICE NUMBER TAD (DCB-1 DCA TEMP TAD I TEMP /GET DCB ENTRY CDF JMP I OTYPE /--RETURN-- /CHECK TO SEE HOW MUCH CORE EXISTS /AND STORE SYMBOL TABLE ACCORDINGLY IFZERO HASH< BEGINF, CDF 10 /WAS THE /K OPTION SELECTED TO TAD I (MPARAM /CHECK FOR MORE THAN 8K? CDF 0 RTR ZK7630, SNL CLA /YES JMP I (CKBAT /NO - CHECK FOR BATCH, USE 8K ONLY CDF 50 JMS FLD2 /WHAT IS HIGHEST FIELD? JMP FLD1-1 /5 CDF 40 JMS FLD2 JMP FLD1 /4 CDF 30 JMS FLD2 JMP FLD1+1 /3 CDF 20 JMS FLD2 JMP FLD1+2 /2 JMP OPTIM4 /1 TAD [177 /IF FIELD 5, ALLOW 4095 SYMBOLS FLD1, TAD (1740 /OTHERWISE ALLOW 1740*(NR OF FIELDS) TAD (1740 TAD (1740 OPTIM0, TAD (1740 DCA I (TAGMAX /SET HIGHEST ADDRESS FOR TAGS JMP I (BEGING OPTIM4, TAD I OPTIM1 /OPTIMIZE SEARCH PATTERN ISZ OPTIM1 /BY SUBSTITUTING CODE IN SEARCH DCA I OPTIM2 /ROUTINE ISZ OPTIM2 ISZ OPTIM3 JMP OPTIM4 OPTIM8, TAD I OPTIM5 ISZ OPTIM5 DCA I OPTIM6 ISZ OPTIM6 ISZ OPTIM7 JMP OPTIM8 JMP OPTIM0 > IFNZRO HASH< /SIZE CHECK OUR MACHINE BEGINF, CDF 10 TAD I (MPARAM CDF RTR /K TO LINK ZK7630, SNL CLA /ALTER FOR COMPLEMENT OF K TAD [400 /TAD TO KEEP USR DCA I (USROFS CDF 50 JMS FLD2 ISZ HIFLD CDF 40 JMS FLD2 ISZ HIFLD CDF 30 JMS FLD2 ISZ HIFLD CDF 20 JMS FLD2 ISZ HIFLD TAD I (7777 /CHECK SOFT CORE SIZE AND (70 SNA JMP CKSEV /NOT THERE CLL RTR RAR DCA HIFLD /THERE, SET HIFLD WITH IT TAD HIFLD /TAKE MIN(HIFLD,5) TAD (7772 SMA CLA /SMA TO USE HIFLD TAD (5 /ELSE USE 5 SZA DCA HIFLD /STORE 5 IF NECESSARY CKSEV, CDF 10 TAD I (MPARAM+2 /LOOK AT /7 CDF AND (4 SNA CLA /SNA IF THERE JMP I (CKBAT /ELSE CHECK FOR BATCH TAD (-7 /SET TO PRINT 7 COLUMNS OF STAB DCA I (SYMNCL TAD (67^6 /SET OFFSET TO FIRST SYMBOL ON NEXT PAGE DCA I (SYMOFS JMP I (CKBAT /OK, CHECK FOR BATCH NOW OPTIM4, SNL /SNL IF BATCH RUNNING JMP I (BEGING /ELSE TAKE DEFAULT TABLE SIZE TAD (BPRIME/SET ALTERNATE TABLE SIZE DCA I (PRIMES /INTO THE ONCE ONLY CODE JMP I (BEGING /NOW HIFLD=# OF HIGHEST USABLE FIELD HIFLD, 1 /8K MINIMUM > /SKIP IF CURRENT DATA FIELD DOES NOT EXIST FLD2, 0 TAD (FLD3 DCA I FLD4 FLD3, CLA TAD I FLD4 NOP CDF TAD (-FLD3 SZA CLA JMP FLD5 TAD IOMON TAD [-200 SNA CLA /IS FIELD THERE? JMP I FLD2 /YES--RETURN-- TAD [200 DCA IOMON FLD5, ISZ FLD2 /NO-INCREMENT RETURN ADDRESS JMP I FLD2 /--RETURN-- FLD4, IOMON /OVERLAY CODE FOR OPTIMAL SYMBOL TABLE SEARCH /IN 8K IFZERO HASH< OPTIM1, OPTIMA OPTIM2, SETFLD+1 OPTIM3, -7 OPTIM5, OPTIMB OPTIM6, GETTG5 OPTIM7, -21 OPTIMA, RELOC SETFLD+1 CLL CMA RTL TAD STM202 DCA TAGXR CDF 10 JMP I SETFLD STM202, -202 SETFL4, 4 RELOC OPTIMB, RELOC GETTG5 TAD HIGHTG JMS SETFLD TAD TAGXR DCA XREG1 TAD XREG1 TAD SETFL4 DCA XREG2 TAD THISTG JMS SETFLD OPTIML, TAD I XREG2 DCA I XREG1 TAD XREG1 CIA TAD TAGXR SZA CLA JMP OPTIML CDF RELOC > /OVERLAY CODE FOR DDT SYMBOL TABLE PRINT DSWIT2, IFZERO HASH< RELOC SYMPR9-2 JMP SYMPRE SYMPRD, TAD SYM204 JMS I OERROR TAD [377 JMS I OERROR JMS SYMPRC DCA LINCNT JMP I SYMPRT SYMPRC, 0 TAD [-200 DCA SYMPR2 TAD [200 JMS I OERROR ISZ SYMPR2 JMP .-3 JMP I SYMPRC RELOC > IFNZRO HASH< RELOC SYMDDT ISZ THISTG JMP SYMLUP SYMXIT, TAD SYM204 JMS I OERROR TAD [377 JMS I OERROR JMS DDTLDR DCA LINCNT JMP I SYMPRT DDTLDR, 0 TAD [7600 DCA SYMCCT TAD [200 JMS I OERROR ISZ SYMCCT JMP .-3 JMP I DDTLDR SYM204, 204 RELOC > DSWITB= . PAGE BEGING, CIF 10 JMS I IOMON /CALL THE USR 12 /TO FIND OUT DSK: BEGINJ, TEXT /DSK/ 7201 /DUMMY HLT /NEVER! /V3C TAD BEGINJ+1 /GET DEVICE NUMBER OF DSK: /V3C DCA CC7 /AND SET IT TAD BEGINJ+1 DCA I BEGINL /AND SET IT INTO "PALBIN" CDF 10 TAD I CC1 /GET PARAMETER WORD 1 CDF CLL RTL /OPTION /B INTO LINK AND [400 /IS IT /F? ZF7650, SZA CLA DCA I CCX1 /YES: /F => NO 0 FILL ZB7430, SNL /IS IT /B? JMP .+3 TAD CCX2 DCA I CCX3 /YES: /B => ! IS SHIFT CDF 10 TAD I CC1 /GET WORD 1 AGAIN CDF AND [200 /IS IT /E? ZE7640, SNA CLA JMP .+3 TAD CCX8 DCA I CCX4 /YES: /E => SET 'LG' ERROR CDF 10 TAD I CCX5 /GET WORD 2 THIS TIME CDF RTL ZO7710, SMA CLA /IS IT /O? JMP .+3 DCA I CCX6 /YES: /O => NO 200 ORG ISZ I CCX7 CDF 10 TAD I CC1 /GET WORD 1 AGAIN AND CC2 /IS IT /C? SNA CLA JMP I CC3 /NO: TRY FOR /L OR /G TAD I CC4 /CREF FILE SPECIFIED? SZA CLA JMP CC5 /YES CC6, TAD CC7 /NO: GIVE "CREFLS.TM" DCA I CC4 ISZ CC6 ISZ CC4 ISZ CC8 JMP CC6 CC5, CDF CIF 10 CLA IAC JMS I IOMON /LOOKUP "CREF.SV" 2 CC13, CC9 /POINT TO NAME - BACK WITH START CC8, -5 /LENGTH GOES HERE JMP CC16 /NOT FOUND! TAD CC30 JMS I CC31 /CHECK TYPE FILE SMA CLA JMP CC16 /NOT DIRECTORY IS ERROR TAD CC12 DCA I CC121 /CSWITC=TAD I [7605 TAD CC11 DCA I CC111 /CSWIT1=CLA TAD CC10 DCA I CC101 /CSWIT2=DCA BINSRT DCA I CC171 /CMOVE=0 TAD CC13 DCA I CC131 /CHAIN="CREF.SV" DCA I CC141 /LSWITC=0 TAD CC30 DCA I CC301 /NOPA22=7612 DCA I CC20 /"BEGIAB"=0 TAD CC21 DCA I CC211 /"DIRSW1"=TAD [177 TAD CC22 DCA I CC221 /"PTPSW1"=TAD [232 JMP I .+1 CCC /KEEP GOING (SIGH) CC16, JMS I [ERROR CF /OPTION /C ERROR JMP I CC3 /TRY FOR /L OR /G CC171, SWAPR2+CMOVE CC141, LSWITC CC131, CHAIN CC121, CSWITC CC12, TAD I [7605 CC111, CSWIT1 CC11, CLA CC101, SWAPR2+CSWIT2 CC10, DCA BINSRT CC301, SWAPR2+NOPA22 CC30, 7612 CC31, OTYPE CC1, MPARAM CC2, 1000 CC3, BEGINH CC4, 7612 CCX1, TEXT4X /V3C CCX2, OP3 CCX3, OPEXPL CCX4, LGERR CCX5, MPARAM+1 CCX6, FIELDY+1 CCX7, FIELDY+2 CCX8, JMS I PERROR CC7, 1 FILENAME CREFLS.TM CC9, FILENAME CREF.SV CC20, BEGIAB CC21, TAD [177 CC211, SWAPR2+DIRSW1 CC22, TAD [232 CC221, SWAPR2+PTPSW1 BEGINL, PALBIN PAGE /*********************************************************************** /SYMBOL TABLE /MOVED BY ASSEMBLER TO FIELD 1 /MUST REMAIN IN ALPHABETICAL ORDER /*********************************************************************** SYMS, 5777 /TERMINATOR 3777 /IMPOSSIBLE (LIMITING) SYMBOL 5777 0000 IFNZRO HASH< /PSEUDO OPS MUST GO FIRST FOR EXPUNGE "I-300^45+4000+2000 /I 0 0 0400 "P-300^45+"A-300+4000 /PAUSE "U-300^45+"S-300 "E-300^45+4000 PAUSEX "P-300^45+"A-300+4000 /PAGE "G-300^45+"E-300 4000 PAGEX "T-300^45+"E-300+4000 /TEXT "X-300^45+"T-300 4000 TEXTX "R-300^45+"E-300+4000 /RELOC "L-300^45+"O-300 "C-300^45+4000 RELOCY "O-300^45+"C-300+4000 /OCTAL "T-300^45+"A-300 "L-300^45+4000 OCTALX "N-300^45+"O-300+4000 /NOPUNCH "P-300^45+"U-300 "N-300^45+"C-300+4000 NOPUNX "I-300^45+"F-300+4000 /IFZERO "Z-300^45+"E-300 "R-300^45+"O-300+4000 IF0 "I-300^45+"F-300+4000 /IFNZRO "N-300^45+"Z-300 "R-300^45+"O-300+4000 IFN0 "I-300^45+"F-300+4000 /IFNDEF "N-300^45+"D-300 "E-300^45+"F-300+4000 IFND "I-300^45+"F-300+4000 /IFDEF "D-300^45+"E-300 "F-300^45+4000 IFD "F-300^45+"I-300+4000 /FIXTAB "X-300^45+"T-300 "A-300^45+"B-300+4000 FIXTBX "F-300^45+"I-300+4000 /FIXMRI "X-300^45+"M-300 "R-300^45+"I-300+4000 FIXMRX "F-300^45+"I-300+4000 /FILENAME "L-300^45+"E-300 "N-300^45+"A-300+4000 FILENX "F-300^45+"I-300+4000 /FIELD "E-300^45+"L-300 "D-300^45+4000 FIELDX "E-300^45+"X-300+4000 /EXPUNGE "P-300^45+"U-300 "N-300^45+"G-300+4000 EXPUNX "E-300^45+"N-300+4000 /ENPUNCH "P-300^45+"U-300 "N-300^45+"C-300+4000 ENPUNX "E-300^45+"J-300+4000 /EJECT "E-300^45+"C-300 "T-300^45+4000 EJECTX "D-300^45+"T-300+4000 /DTORG "O-300^45+"R-300 "G-300^45+4000 DTORGX "D-300^45+"E-300+4000 /DEVICE "V-300^45+"I-300 "C-300^45+"E-300+4000 DEVICX "D-300^45+"E-300+4000 /DECIMAL "C-300^45+"I-300 "M-300^45+"A-300+4000 DECIMX > "Z-300^45+"B-300+4000 /ZBLOCK "L-300^45+"O-300 "C-300^45+"K-300+4000 ZBLOCX "Z-300^45+4000+2000 /Z 0 0 0000 "X-300^45+"L-300+4000 /XLIST "I-300^45+"S-300 "T-300^45+4000 XLISTY "T-300^45+"S-300+4000 /TSK "K-300^45 0 6045 "T-300^45+"S-300+4000 /TSF "F-300^45 0 TSF "T-300^45+"P-300+4000 /TPC "C-300^45 0 TPC "T-300^45+"L-300+4000 /TLS "S-300^45 0 TLS "T-300^45+"F-300+4000 /TFL "L-300^45 0 6040 IFZERO HASH< "T-300^45+"E-300+4000 /TEXT "X-300^45+"T-300 4000 TEXTX > "T-300^45+"C-300+4000 /TCF "F-300^45 0 TCF "T-300^45+"A-300+4000 /TAD "D-300^45+4000 0 TAD 0 "S-300^45+"Z-300+4000 /SZL "L-300^45 0 SZL "S-300^45+"Z-300+4000 /SZA "A-300^45 0 SZA "S-300^45+"W-300+4000 /SWP "P-300^45 0 7521 "S-300^45+"T-300+4000 /STL "L-300^45 0 STL "S-300^45+"T-300+4000 /STA "A-300^45 0 STA "S-300^45+"R-300+4000 /SRQ "Q-300^45 0 6003 "S-300^45+"P-300+4000 /SPA "A-300^45 0 SPA "S-300^45+"N-300+4000 /SNL "L-300^45 0 SNL "S-300^45+"N-300+4000 /SNA "A-300^45 0 SNA "S-300^45+"M-300+4000 /SMA "A-300^45 0 SMA "S-300^45+"K-300+4000 /SKP "P-300^45 0 SKP "S-300^45+"K-300+4000 /SKON "O-300^45+"N-300 0 6000 "S-300^45+"G-300+4000 /SGT "T-300^45 0 6006 "R-300^45+"T-300+4000 /RTR "R-300^45 0 RTR "R-300^45+"T-300+4000 /RTL "L-300^45 0 RTL "R-300^45+"T-300+4000 /RTF "F-300^45 0 6005 "R-300^45+"S-300+4000 /RSF "F-300^45 0 RSF "R-300^45+"R-300+4000 /RRB "B-300^45 0 RRB "R-300^45+"P-300+4000 /RPE "E-300^45 0 6010 "R-300^45+"M-300+4000 /RMF "F-300^45 0 RMF "R-300^45+"I-300+4000 /RIF "F-300^45 0 RIF "R-300^45+"I-300+4000 /RIB "B-300^45 0 RIB "R-300^45+"F-300+4000 /RFC "C-300^45 0 RFC IFZERO HASH< "R-300^45+"E-300+4000 /RELOC "L-300^45+"O-300 "C-300^45+4000 RELOCY > "R-300^45+"D-300+4000 /RDF "F-300^45 0 RDF "R-300^45+"A-300+4000 /RAR "R-300^45 0 RAR "R-300^45+"A-300+4000 /RAL "L-300^45 0 RAL "P-300^45+"S-300+4000 /PSF "F-300^45 0 PSF "P-300^45+"P-300+4000 /PPC "C-300^45 0 PPC "P-300^45+"L-300+4000 /PLS "S-300^45 0 PLS "P-300^45+"C-300+4000 /PCF "F-300^45 0 PCF "P-300^45+"C-300+4000 /PCE "E-300^45 0 6020 IFZERO HASH< "P-300^45+"A-300+4000 /PAUSE "U-300^45+"S-300 "E-300^45+4000 PAUSEX "P-300^45+"A-300+4000 /PAGE "G-300^45+"E-300 4000 PAGEX > "O-300^45+"S-300+4000 /OSR "R-300^45 0 OSR "O-300^45+"P-300+4000 /OPR "R-300^45 0 OPR IFZERO HASH< "O-300^45+"C-300+4000 /OCTAL "T-300^45+"A-300 "L-300^45+4000 OCTALX > IFZERO HASH< "N-300^45+"O-300+4000 /NOPUNCH "P-300^45+"U-300 "N-300^45+"C-300+4000 NOPUNX > "N-300^45+"O-300+4000 /NOP "P-300^45 0 NOP "M-300^45+"Q-300+4000 /MQL "L-300^45 0 7421 "M-300^45+"Q-300+4000 /MQA "A-300^45 0 7501 "L-300^45+"A-300+4000 /LAS "S-300^45 0 LAS "K-300^45+"S-300+4000 /KSF "F-300^45 0 KSF "K-300^45+"R-300+4000 /KRS "S-300^45 0 KRS "K-300^45+"R-300+4000 /KRB "B-300^45 0 KRB "K-300^45+"I-300+4000 /KIE "E-300^45 0 6035 "K-300^45+"C-300+4000 /KCF "F-300^45 0 6030 "K-300^45+"C-300+4000 /KCC "C-300^45 0 KCC "J-300^45+"M-300+4000 /JMS "S-300^45+4000 0 JMS 0 "J-300^45+"M-300+4000 /JMP "P-300^45+4000 0 JMP 0 "I-300^45+"S-300+4000 /ISZ "Z-300^45+4000 0 ISZ 0 "I-300^45+"O-300+4000 /IOT "T-300^45 0 IOT "I-300^45+"O-300+4000 /ION "N-300^45 0 ION "I-300^45+"O-300+4000 /IOF "F-300^45 0 IOF IFZERO HASH< "I-300^45+"F-300+4000 /IFZERO "Z-300^45+"E-300 "R-300^45+"O-300+4000 IF0 "I-300^45+"F-300+4000 /IFNZRO "N-300^45+"Z-300 "R-300^45+"O-300+4000 IFN0 "I-300^45+"F-300+4000 /IFNDEF "N-300^45+"D-300 "E-300^45+"F-300+4000 IFND > IFZERO HASH< "I-300^45+"F-300+4000 /IFDEF "D-300^45+"E-300 "F-300^45+4000 IFD > "I-300^45+"A-300+4000 /IAC "C-300^45 0 IAC IFZERO HASH< "I-300^45+4000+2000 /I 0 0 0400 > "H-300^45+"L-300+4000 /HLT "T-300^45 0 HLT "G-300^45+"T-300+4000 /GTF "F-300^45 0 6004 "G-300^45+"L-300+4000 /GLK "K-300^45 0 GLK IFZERO HASH< "F-300^45+"I-300+4000 /FIXTAB "X-300^45+"T-300 "A-300^45+"B-300+4000 FIXTBX "F-300^45+"I-300+4000 /FIXMRI "X-300^45+"M-300 "R-300^45+"I-300+4000 FIXMRX "F-300^45+"I-300+4000 /FILENAME "L-300^45+"E-300 "N-300^45+"A-300+4000 FILENX "F-300^45+"I-300+4000 /FIELD "E-300^45+"L-300 "D-300^45+4000 FIELDX > IFZERO HASH< "E-300^45+"X-300+4000 /EXPUNGE "P-300^45+"U-300 "N-300^45+"G-300+4000 EXPUNX "E-300^45+"N-300+4000 /ENPUNCH "P-300^45+"U-300 "N-300^45+"C-300+4000 ENPUNX "E-300^45+"J-300+4000 /EJECT "E-300^45+"C-300 "T-300^45+4000 EJECTX "D-300^45+"T-300+4000 /DTORG "O-300^45+"R-300 "G-300^45+4000 DTORGX "D-300^45+"E-300+4000 /DEVICE "V-300^45+"I-300 "C-300^45+"E-300+4000 DEVICX "D-300^45+"E-300+4000 /DECIMAL "C-300^45+"I-300 "M-300^45+"A-300+4000 DECIMX > "D-300^45+"C-300+4000 /DCA "A-300^45+4000 0 DCA 0 "C-300^45+"M-300+4000 /CML "L-300^45 0 CML "C-300^45+"M-300+4000 /CMA "A-300^45 0 CMA "C-300^45+"L-300+4000 /CLL "L-300^45 0 CLL "C-300^45+"L-300+4000 /CLA "A-300^45 0 CLA "C-300^45+"I-300+4000 /CIF "F-300^45 0 CIF "C-300^45+"I-300+4000 /CIA "A-300^45 0 CIA "C-300^45+"D-300+4000 /CDF "F-300^45 0 CDF "C-300^45+"A-300+4000 /CAF "F-300^45 0 6007 "B-300^45+"S-300+4000 /BSW "W-300^45 0 7002 "A-300^45+"N-300+4000 /AND "D-300^45+4000 0 AND 0 4001 /TERMINATOR 0000 /IMPOSSIBLE (LIMITING) SYMBOL 4000 0000 SYME=. /********************************************************************** /TOP OF SYMBOL TABLE /********************************************************************** SWAP2=. /********************************************************************** /CODE UNIQUE TO PASSES 1 AND 2 /SWAPPED IN FOR PASSES 1 AND 2 /OVERLAYED DURING PASS 3 *** NO LITERALS *** RELOC 1000 /ASSEMBLED INTO 1000-1247 SWAPB2= . SWAPR2= SWAP2-SWAPB2 /RELOCATION FACTOR FOR THIS CODE OOPEN, 0 TAD OPEN01 /OPEN BINARY AND LISTING FILES DCA XOUHND /SET ADDRESS OF DEVICE HANDLER TAD OPEN02 DCA XOUBLK TAD [-5 DCA XOUELE /SET NEW OUTPUT FILE LENGTH CDF 10 TAD I OUFPTR CDF DCA I XOUBLK ISZ XOUBLK ISZ OUFPTR ISZ XOUELE /INCREMENT OUTPUT FILE LENGTH JMP .-7 TAD OPEN02 IAC DCA XOUBLK /SET POINTER TO NEW FILENAME TAD XOUBLK DCA I OPEN04 CIF 10 JMS I IOMON /CALL USER SERVICE ROUTINES 13 /*RESET SYSTEM TABLES* DCA I OPEN05 /DELETE UNCLOSED FILES AND TAD I OPEN02 /DELETE HANDLERS AND [17 /GET NEW DEVICE HANDLER # SNA /OUTPUT INHIBIT? JMP ONOFIL /YES CIF 10 /NO JMS I IOMON /CALL USER SERVICE ROUTINE 1 /*FETCH DEVICE HANDLER* XOUHND, 0 /LOADING ADDRESS HLT /HANDLER NOT AVAILABLE OUENTR, TAD I OPEN02 /NORMAL RETURN - GET OUTPUT CIF 10 /DEVICE NUMBER AND FILE LENGTH JMS I IOMON /CALL NEW SERVICE ROUTINES 3 /*ENTER OUTUT FILE XOUBLK, 0 /POINTER TO FILENAME XOUELE, 0 /FILE LENGTH JMP OEFAIL /ERROR RETURN DCA I OPEN06 /NORMAL RETURN JMS I OPEN07 TAD XOUHND TAD [200 /LINK IS CLEAR!! SNL CLA TAD [400 TAD OUFDEV DCA I OUFINP TAD I OUFINP CLL RAR CIA TAD OU3501 DCA INCTL ISZ OOPEN TAD XOUHND DCA I OPEN09 TAD XOUBLK DCA I OPEN10 TAD XOUELE DCA I OPEN11 JMP I OOPEN /--RETURN-- OEFAIL, TAD I OPEN02 AND [7760 SNA CLA JMP I OPEN12 /DE**FATAL ERROR** TAD I OPEN02 AND [17 DCA I OPEN02 JMP OUENTR ONOFIL, ISZ I OPEN05 /SET OUTPUT INHIBIT SWITCH JMP I OOPEN /--RETURN-- OUFPTR, 7600 OPEN01, OUDEVH+1 OPEN02, OUFILE OPEN04, OUCNAM OPEN05, OUTINH OPEN06, OUCCNT OPEN07, OUSETP OPEN09, OUHNDL OPEN10, OUBLK OPEN11, OUELEN OPEN12, SYSERR OU3501, 3501 OUFDEV, OUDEVH OUFINP, INBUFP /CONTINUATION OF FIXTAB HANDLER FIXTAY, IFZERO HASH< TAD HIGHTG /SET POINTERS TO TABLE CMA > IFNZRO HASH< TAD TAGMAX CIA > DCA TEMP3 DCA THISTG FIXTAX, JMS I [FINDTG /GET A TAG AC3777 AND TAG1 IFNZRO HASH< SZA > TAD [4000 /SET BIT 0 OF FIRST WORD TO 1 DCA TAG1 /RETURN IT TO TABLE JMS I [PUTTAG ISZ THISTG ISZ TEMP3 /DONE WITH TABLE YET? JMP FIXTAX /NO JMP I [LOOKEX /YES--EXIT TO MAIN-- /OUTPUT ONE REGISTER - BINARY /ENTER WITH CONTENTS IN AC PUNOUT, 0 DCA PUNOU1 TAD PUNOU1 RTR RTR RTR AND [177 JMS I OCHAR /OUTPUT FIRST FRAME TAD PUNOU1 AND [77 JMS I OCHAR /OUTPUT SECOND FRAME JMP I PUNOUT /--RETURN-- PUNOU1, IOPEN, 0 /SET UP INPUT ROUTINE CLA CMA /TO OPEN FILE DCA I IOPEN1 ISZ I IOPEN2 TAD IOPEN3 DCA I IOPEN4 ISZ I IOPEN5 TAD [LINBUF+120 DCA TXTPTR JMP I IOPEN /--RETURN-- IOPEN1, INCHCT IOPEN2, INEOF IOPEN3, 7617 IOPEN4, INFPTR IOPEN5, FORMSW PAGE /START PASS 2 *** NO LITERALS HERE EITHER *** START1, TAD [ERROR DCA PERROR /RESET PREUDO-ERROR ROUTINE JMS I ST1OPN /OPEN PASS 2 OUTPUT FILE JMP NOPA21 /NO PASS 2 IF PASS 3 NOPA23, TAD I ST1OBL DCA BINSRT DCA PUNCHX /CLEAR PUNCH INHIBIT JMS START3 JMP I .+1 START2-1 NOPA21, CDF 10 TAD I NOPA22 /IS THERE A PASS 3? CDF SNA CLA JMP NOPA23 /NO - DO PASS 2 ISZ PASS /SKIP PASS 2 NOP JMP NOPAS2 /CONTINUE TO PASS 3 NOPA22, 7605 START3, 0 /GENERATE LEADER/TRAILER TAD LEADER DCA TXTPTR TAD [200 JMS I OCHAR ISZ TXTPTR JMP .-3 JMP I START3 /--RETURN-- LEADER, -10 /END PASS 2 ENDPA2, JMS I [DUMPZ /DUMP PAGE 0 LITERALS DCA PUNCHX CLL /V3C TAD CHKSUM /OUTPUT CHECKSUM JMS I [PUNOUT /PUNCH THE CHECKSUM JMS START3 /GENERATE LEADER/TRAILER JMS I EN2CLS /CLOSE PASS 2 OUTPUT FILE NOPAS2, TAD EN2LSO DCA OERROR /SET NEW OUTPUT TO BE LISTING ISZ I EN2OU1 CMOVE, JMP CMOVA /ZEROED IF /C CDF 10 /MOVE CODE FOR /C OPTION CMOVB, TAD I CMOV1 DCA I CMOV2 /MOVE OUTPUT FILE STORAGE ISZ CMOV1 ISZ CMOV2 ISZ CMOV3 JMP CMOVB /LOOP CMOVA, CDF JMS I ST1OPN /OPEN 3RD PASS FILE DCA I CMOV4 /NO 3RD PASS TAD I ST1OBL /GET FILE START CSWIT2, CLA /"DCA BINSRT" IF /C TAD PTPSW1 DCA I EN2PTP /RESET PAPERTAPE SWITCH TAD DIRSW1 DCA I EN2DIR /RESET DIRECTORY SWITCH JMS I PIOPEN JMP I .+1 LOADOV /OVERLAY THIS AREA WITH PASS3 CODE PIOPEN, IOPEN DIRSW1, TAD [177 PTPSW1, TAD [232 CMOV1, 7605 CMOV2, 7600 CMOV3, -12 CMOV4, NSWITC EN2CLS, OCLOSE EN2LSO, LISOUT EN2OU1, OUTPT1 EN2PTP, PTPSW EN2DIR, DIRSW ST1OPN, OOPEN ST1OBL, OUBLK SWAPE2, RELOC IFNZRO ENDOVL-SWAPE2&4000 <OVLERR,__ERROR__> PAGE IFNZRO HASH< /ONCE ONLY CODE TO HASH OUT THE PERMANENT SYMBOLS HSHSMS, 0 JMS I (7607 /WRITE THE SYMBOL TABLE SORT OVERLAY 4210 /2 PAGES FROM FIELD 1 OUDEVH+400 /FROM HERE ASWAP+1 /TO HERE JMP I (SYSERR/WONDERFUL. TAD I (USROFS SZA CLA /SZA IF KICKING OUT USR TAD (12 /ELSE FUDGE POINTER TAD I (HIFLD /FIRST SET HASH TABLE SIZE TAD PRIMES /ACCORDING TO CORE SIZE DCA PRIME TAD I PRIME DCA PRIME TAD PRIME CIA DCA I (MPRIME TAD I (USROFS SZA CLA JMP KPUSR /JMP IF KEEPING USR CDF 10 /SERVE NOTICE WE'RE OCCUPYING FIELD 1 AC7776 AND I (JSBITS DCA I (JSBITS TAD [7700 DCA IOMON /AND POINT AT PROPER MONITOR E.P. KPUSR, CDF TAD I (MPRIME /HOW MANY SLOTS TO WIPE DCA LAST3 /TO COUNTER TAD I (USROFS CLL RTL TAD (7777 /FUDGE THE INITIAL AUTO XR JMP CLRGO /INTO THE LOOP NOW CLRLUP, TAD LAST1 TAD (-7577 SZA CLA /SZA IF NEED TO DO NEXT FIELD JMP CLCDF0+1/ELSE CLEAR ANOTHER TAD (10 TAD CLCDF0 DCA CLCDF0 /CDF INSTR GETS BUMPED STA CLRGO, DCA LAST1 /XRGETS SET CLCDF0, CDF 10 /INITIALLY CDF 10 DCA I LAST1 DCA I LAST1 DCA I LAST1 DCA I LAST1 ISZ LAST3 /SKP IF NO MORE JMP CLRLUP /ELSE DO ANOTHER CDF /THE TABLE IS CLEAN TAD (HSHRTN DCA I [GETTAG STA DCA HIGHTG /HIGHTG=CURRENT SYMBOL INDEX TAD (SYMS+3 /USE THESE AUTO XR'S NOW DCA LAST1 TAD LAST1 DCA LAST2 HSHLP, TAD I LAST1 AND [1777 /FIRST, STRIP THE TYPE BITS DCA I (NAME1 AC3777 AND I LAST1 DCA I (NAME2 AC3777 AND I LAST1 DCA I (NAME3 ISZ LAST1 /SKIP THE VALUE JMP I (GETTGH /GO FIND IT'S PLACE HSHRTN, CLA CLL TAD I LAST2 DCA I (NAME1 TAD I LAST2 DCA I (NAME2 TAD I LAST2 DCA I (NAME3 TAD I LAST2 DCA VALUE2 JMS I (INSRTG /AND STORE IT TAD LAST1 TAD (1-SYME+4 SZA CLA JMP HSHLP /LOOP IF MORE TO GO JMP I HSHSMS /--RETURN-- PRIMES, . 1737 /1 FIELD 3673 /2 FIELDS 5633 /3 FIELDS 7577 /4 FIELDS 7775 /5 FIELDS (THE LAST MOSTELY WASTE) BPRIMES=.-1 /ALTERNATE TABLE SIZE FOR BATCH COMPATABILITY 1737 /1 FIELD (MEANS NO BATCH) 3133 /2 FIELDS 5075 /3 FIELDS 7035 /4 FIELDS 7775 /5 FIELDS (SOME OF WASTE FOR BATCH) 1335 /STILL ANOTHER ALTERNATE SET IF KEEPING USR 3273 5237 7175 7775 0 2535 4465 6437 7775 PAGE > /************************************************************** /PAGE 0 LITERALS /************************************************************** IFNZRO HASH< /SYMBOL TABLE SORT OVERLAY /ONLY SWAPPED IF TABLE WILL BE LISTED /FIRST, SOME EQUATES PPUTTAG= [PUTTAG PFINDTG= [FINDTG O1777= [1777 O7774= [7774 SXR= XREG1 TXR= XREG2 SXR2= LAST1 TXR2= LAST2 UXR= LAST3 DXR= LAST4 BEG= LOC END= OFFSET LO= OFSBUF HI= STARSW MED= OP FIELD 1 /SET THE FIELD NOW *OUDEVH+400 /IT GOES HERE SORTAB, 0 /FIRST LOC IN PAGE TAD TAGMAX CIA DCA TEMP /TEMP=#CELLS TO SCAN /DEFLATE TABLE PRIOR TO SORTING AND LISTING IT /OUT WITH EMPTIES AND PERMANENTS DCA HIGHTG /TARGET POINTER DCA TEMP2 /SOURCE POINTER DEFLP, TAD TEMP2 DCA THISTG JMS I PFINDTG /GET THE NEXT STAB CELL TAD TAG1 CLL RAL SNA SZL CLA /AND THERE BUT NOT FIXED? JMP DEFNUL /NO, DON'T STORE IT TAD O1777 /YES,DISCARD THE TYPE BITS NOW AND TAG1 DCA TAG1 AC3777 AND TAG2 DCA TAG2 AC3777 AND TAG3 DCA TAG3 TAD HIGHTG DCA THISTG JMS I PPUTTAG ISZ HIGHTG DEFNUL, ISZ TEMP2 ISZ TEMP /TRY AGAIN JMP DEFLP JMS I (SORT /NOW SORT THEM JMP I SORTAB /EXIT TO PRTSTAB /MOVE A SYMBOL THRU THE TABLE SMOV, 0 TAD SXR2 /GET SOURCE DF+XREG JMS GETFLD DCA SMVCD1 TAD TXR DCA SXR TAD TXR2 JMS GETFLD DCA SMVCD2 TAD O7774 DCA SSWT SMVCD1, 0 TAD I SXR SMVCD2, 0 DCA I TXR ISZ SSWT JMP SMVCD1 SMVCD0, CDF JMP I SMOV /AUXILLIARY FIELD+XREG SETTER GETFLD, 0 CLL TAD I (USROFS /IF KEEPING USR DCA TXR /AC=SYM NUM DCA SMVCD2 TAD TXR ISZ SMVCD2 CML TAD (-1740 SNL JMP .-4 CLL RTL TAD (-202 /SETS AS IN SETFLD... DCA TXR /TENTATIVELY SET TXR TAD SMVCD2 CLL RTL RAL TAD SMVCD0 JMP I GETFLD /EXIT WITH AC SET TO CDF INSTR /ROUTINE TO EXCHANGE SYMBOLS LO AND HI SSWT, 0 TAD HI JMS GETFLD DCA SWCDF1 TAD SWCDF1 DCA SWCDF3 TAD TXR DCA SXR TAD SXR DCA SXR2 /SXR'S FOR HIGH SYMBOL TAD LO JMS GETFLD DCA SWCDF2 TAD TXR DCA TXR2 /TXR'S FOR LOW SYMBOL TAD O7774 DCA SMOV /COUNTER SWCDF1, 0 TAD I SXR /GET HI SYM WORD DCA GETFLD /HOLD IT SWCDF2, 0 TAD I TXR /GET LO DCA SCOM /HOLD IT TAD GETFLD DCA I TXR2 /STORE HI IN LOW SWCDF3, 0 TAD SCOM /NOW STORE LO DCA I SXR2 /IN HI ISZ SMOV JMP SWCDF1+1 CDF JMP I SSWT /COMPARE SYMBOLS + SET LINK THEREBY SCOM, 0 DCA THISTG /AC=TAG # JMS I (SETFLD TAD I TAGXR CLL CIA TAD TAG1 SZA CLA JMP SCOMRT TAD I TAGXR CLL CIA TAD TAG2 SZA CLA JMP SCOMRT TAD I TAGXR CLL CIA TAD TAG3 SNA CLA HLT /NEVER SCOMRT, CDF JMP I SCOM PAGE /SORT ROUTINE HERE SORT, 0 DCA BEG /INITIALIZE PARTITION BOUNDS STA STL TAD HIGHTG DCA END /ARE THERE ANY SYMBOLS? SZL JMP I SORT /NO EXIT WITH LINK SET TAD (LITBF1-1+26 /OK, SET STACK NOW DCA DXR TAD DXR DCA UXR SLOOP, STA TAD LEVEL DCA LEVEL SLOOP2, TAD BEG STL CIA TAD END SNA SZL JMP OKCOOL /END.LOS.BEG CLL RAR TAD BEG DCA MED /MED=BEG+(END-BEG)/2 TAD MED DCA THISTG JMS I PFINDTG /T=A(MED) TAD BEG DCA LO /LO=BEG TAD END DCA HI /HI=END TAD MED CIA TAD BEG SNA CLA JMP JUSTWO /BEG.EQ.MED TAD LO DCA SXR2 TAD MED DCA TXR2 JMS I (SMOV /A(MED)=A(LO) BEGLP, ISZ LO TAD LO CLL CIA TAD HI SNL CLA JMP DONE /HI.LOS.LO TAD LO JMS I (SCOM /T.GT.A(LO) TO LINK SZL CLA JMP BEGLP /T.GT.A(LO) JMP ENDGO /T.LT.A(LO) ENDLP, TAD LO CLL CIA TAD HI SNL CLA JMP DONE /IF HI.LO.LO ENDGO, TAD HI JMS I (SCOM SZL CLA JMP SWITCH STA TAD HI DCA HI JMP ENDLP SWITCH, JMS I (SSWT STA TAD HI DCA HI JMP BEGLP DONE, TAD HI DCA SXR2 TAD BEG DCA TXR2 JMS I (SMOV /A(BEG)=A(HI) TAD HI DCA THISTG JMS I PPUTTAG /A(HI)=T AC7776 TAD UXR DCA UXR TAD UXR DCA DXR TAD HI CLL CIA TAD MED SZL CLA JMP HIBIGR /DEFER HIGH FOR LATER TAD BEG DCA I DXR /DEFER LO FOR LATER STA TAD HI DCA I DXR TAD HI IAC DCA BEG JMP SLOOP HIBIGR, TAD HI IAC DCA I DXR TAD END DCA I DXR STA TAD LEVEL /CLUMSY DCA LEVEL CLL STA TAD HI DCA END SNL /PROTECT AGAINST WRAP AROUND JMP OKCOOL JMP SLOOP2 JUSTWO, TAD HI JMS I (SCOM SZL CLA JMS I (SSWT /SWITCH IF T.GT.A(HI) OKCOOL, CLA CLL /NOW CONSIDER PREV PARTITIONS TAD I UXR DCA BEG TAD I UXR DCA END ISZ LEVEL JMP SLOOP2 /REITERATE JMP I SORT /DONE, RETURN WITH A CLEAR LINK LEVEL, 0 PAGE > /ROUTINE TO STORE THE DATE OF THE FORM DD-MMM-YY /IN THE HEADING IFZERO HASH < FIELD 1 *OUDEVH+400 > FMTDAT, 0 TAD I (MDATE /PICK UP THE DATE WORD OF THE FORM MMM MDD DDD YYY CDF /RUN WITH DF = 0 SNA JMP NODATE /EXIT IF NO DATE DCA DATWD /ELSE STORE DATE WORD TAD ("0-1 DCA I DATPTR /SET FIRST DIGIT OF DAY TAD DATWD /NOW GET DAY BITS CLL RTR RAR AND (37 JMS DIV10 /DO DAY DIGITS NOW TAD ("- DCA I DATPTR /STORE DASH ISZ DATPTR TAD DATWD /NOW GET MONTH BITS TAD (7400 /REDUCE TO ORIGIN 0 AND (7400 CLL RTL RTL RAL DCA DIV10 TAD DIV10 CLL RAR /GENERATE 1.5*MONTH INDEX TAD DIV10 TAD (MONLST /INDEX MONTH LIST (SIXBIT) DCA MONPTR TAD (-3 DCA DIV10 /SET 3 TIMES THRU LOOP SZL JMP MONGO /IF EVEN START AT RIGHT HALF MONLP, TAD I MONPTR CLL RTR RTR RTR JMS MONPUT /PUT LEFT CHAR MONGO, TAD I MONPTR JMS MONPUT /PUT RIGHT CHAR ISZ MONPTR JMP MONLP /LOOP FOR MORE MONPUT, 0 TAD (40 AND (77 TAD (40 /CONVERT TO 7BIT DCA I DATPTR ISZ DATPTR ISZ DIV10 JMP I MONPUT /RETURN TO UNPACK LOOP TAD ("- DCA I DATPTR /PUT ANOTHER DASH ISZ DATPTR TAD ("6 DCA I DATPTR /SETUP YEAR TENS DIGIT FOR DIVIDE TAD I (BIPCCL AND (600 /GET YEAR EXTENSION FROM 600 BITS CLL RTR RTR DCA DIV10 TAD DATWD /NOW GET YEAR AND (7 /ISOLATE IT TAD DIV10 /ADD EXTENSION JMS DIV10 /UNPACK IT NODATE, CIF CDF /NOW RETURN JMP I FMTDAT DIV10, 0 ISZ I DATPTR TAD (-12 SMA JMP .-3 /REDUCE MON 10. TAD (12+"0 ISZ DATPTR DCA I DATPTR /STORE LOW DIGIT ISZ DATPTR JMP I DIV10 /--RETURN-- DATPTR, DATE DATWD, 0 MONPTR, 0 PAGE $$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 | /3 PIP FOR OS/8 MONITOR / / / / / / / / / /COPYRIGHT (C) 1970,1971,1972,1973,1974,1975,1977 /BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / 4-MAY-1977 FILE: PIP.PA OS/8 VERSION 14A /RL/EF/ET.AL./S.R./E.S. /ABSTRACT---- /PIP (PERIPHERAL INTERCHANGE PROGRAM) IS A GENERAL FILE /MANIPULATION PROGRAM FOR THE OS/8 PROGRAMMING SYSTEM. /PIP ACCOMPLISHES DATA TRANSFERS BETWEEN ANY DEVICES IN THE OS/8 /CONFIGURATION. /VERSION 3 MODS: /FIXED PROBLEM WITH ONE-PAGE WRITE /IN /S OR /Z, =OPTION IS TAKEN MODULO 100 (OCTAL) / WITH 100, 200, ETC. MEANING USE 0 ADDITIONAL WDS. /DATES STILL DON'T LINE UP /'0 FREE BLOCKS' /ALLOW FILLING UP DEVICE TO VERY LAST BLOCK /ALLOW 7-BIT ^C /ALTMODE ON CD LINE RETURNS TO MONITOR WHEN DONE /NO HALT ON /L IF NO TTY HANDLER (ACTS AS NOP) / /V PRINTS VERSION NUMBER FIRST TIME CALLED / /O AFFIRMS /Y ON ZERO SYS OR ARE YOU SURE /=NNNN ON /I OPTION SPECIFIES LENGTH TO CLOSE FILE /MAINTENANCE RELEASE CHANGES: /1. FIXED LENGTH OF ALL VARIETIES OF RF08 /2. ADDED RX01 TO INTERNAL LENGTH TABLES /3. CHANGED VERSION NUMBER TO V10 /4. ADDED CHECK FOR 7-BIT CTRL/Z TO ASCII HANDLER /E.S. DISABLED /E,/F,/L /E.S. FIXED /Y OPTION PER SPR / DEVICE UPGRADE KIT CHANGES(V12C): / 1.ADDED RX02 SUPPORT / 2.ADDED /Y OPTION CHANGES TO SUPPORT NEW MONITOR /DETAILS OF PIP: /PIP RUNS WITH THE USR (USER SERVICE ROUTINES) ALWAYS IN CORE. /THIS ELIMINATES SWAPPING THE MONITOR. IF ANY CHANGES ARE MADE /TO PIP, CARE SHOULD BE TAKEN IN USING PAGE ZERO LOCATIONS, AS /THEY MUST NOT DESTROY ANY MONITOR LOCATIONS. /CORE USED: /FIELD 0 /00000-02777- OUTPUT BUFFER /03000-06377- INPUT BUFFER /06400-06577- USED FOR /Y COMMAND ONLY /06600-07177- INPUT HANDLER /07200-07577- OUTPUT HANDLER /FIELD 1 /10000-11777- OS/8 I/O MONITOR /12000-16577- EXECUTABLE CODE /16600-17177- HOLDS NEW DIRECTORY SEGMENT FOR /S OPTION /17200-17577- HOLDS OLD DIRECTORY SEGMENT IN /S OPTION /MAJOR PIECES OF CODE AND THEIR FUNCTION (BRIEFLY). /THIS IS A LIST OF ROUTINES AS THEY APPEAR PHYSICALLY, AND /NOT AS THEY ARE LOGICALLY CONNECTED. /ICHAR- GENERAL CHARACTER INPUT ROUTINE. ASSIGNS NEW / DEVICE HANDLERS AS NEEDED. /OOPEN- ENTERS A FILE ON A SPECIFIED DEVICE. /OUTDMP- WRITES OUTPUT BUFFER TO OUTPUT DEVICE. /OCLOSE- CLOSES FILE CREATED BY OOPEN /OCHAR- CHARACTER OUTPUT ROUTINE. WRITES CHARACTERS / TO OUTPUT BUFFER, CALLING OUTDMP WHEN FULL. /OTYPE- USES DEVICE NUMBER IN OUTPUT AREA OF CD TO / INSPECT THE DEVICE CONTROL BLOCK WORD. THIS / GIVES A CODE FOR THE TYPE OF DEVICE. /SLASHG- HANDLES I/O ERRORS. IF /G IS SET, HARD I/O / ERRORS ARE IGNORED. IF /S AND /G ARE ON, A / SPECIAL RETURN IS TAKEN. /IMAGE- IMAGE MODE PROCESSOR FOR PIP. /SQTRA- MAIN SUBROUTINE OF IMAGE MODE, AND /S OPTION. /PIP, PIP+1- MAIN ENTRANCES TO PIP. THE CODE ON THIS PAGE / INSPECTS CD OPTION WORDS AND BRANCHES TO PROPER / ROUTINES. /ASCII- THE DEFAULT TRANSFER MODE IN PIP IS ASCII. /DELETE- DELETES FILES ON OUTPUT SIDE OF CD LIST. /DZERO- ZEROES DIRECTORY OF FIRST OUTPUT DEVICE. /PIPERR- ERROR ROUTINR FOR PIP. /DIRPRE- DIRECTORY PRINTING ROUTINE. /BINARY- BINARY MODE PROCESSOR. HANDLES ABSOLUTE AND / RELOCATABLE BINARY FILES. /ERPRNT- ERROR PRINTOUT. /SQUISH- FILE COMPRESSION PROCESSOR. ELIMINATES 'HOLES' / IN DIRECTORY OF INPUT DEVICE. /SYSCOP- SYSTEM COPY PROCESSOR. ALLOWS TRANSFER OF THE / OS/8 SYSTEM AREA. /OPTIONS AVAILABLE IN PIP: /A- ASCII TRANSFER; DEFAULT MODE /B- BINARY MODE TANSFER /C- DELETE TRAILING BLANKS. (ASCII MODE) /D- DELETE FIRST OUTPUT FILE BEFORE PROCEEDING /E- LIST INPUT DIRECTORY INCLUDING EMPTY FILES /F- LIST INPUT DIRECTORY; ONLY FILE NAMES /G- IGNORE ERRORS WHILE TRANSFERING /I- IMAGE MODE TRANSFER /L- LIST INPUT DIRECTORY; EXCLUDE EMPTY FILES /O- OK TO PERFORM A SQUISH OR ZERO WITHOUT ASKING /S- COMPRESS INPUT DEVICE ONTO OUTPUT DEVICE. ELIMINATES / 'HOLES' ON INPUT DEVICE. /T- PROVIDE SIMPLE TTY FORMATTING. (ASCII ONLY) /Y- COPY OS/8 SYSTEM AREA /Z- ZERO OUTPUT DEVICE DIRECTORY BEFORE PROCEEDING /=N- LEAVE N WORDS EXTRA PER DIRECTORY ENTR. VALID / ONLY WITH /S OR /Z. /=N- WITH /I OPTION CLOSES OUTPUT FILE WITH THIS LENGTH /V PRINTS VERSION # (FIRST TIME ONLY) /COMMENTS ON THE PROGRAM: /SINCE PIP RUNS WITH USR IN CORE, NO PAGE ZERO LITERALS /CAN BE USED. THE LOCATIONS CURRENTLY USED IN /FIELD 1 ON PAGE ZERO ARE: OUTXR=10 INXR=11 TEMP1=12 IHNDLR=24 /HOLDS INPUT HANDLER ADDRESS OHNDLR=25 /OUTPUT HANDLER ADDRESS SQFLAG=26 /'SQUISH INDICATOR OUWAST=27 /# WASTE WORDS ON OUTPUT OUTBLK=30 OUDLEN=31 SAME=32 INBLK=33 RECCNT=34 /CONSTANTS USED BY THE DIRECTORY PRINTOUT ROUTINE (OVERLAPPING) ARE: FLENGT=24 BLOKNO=25 DTYPE=27 DCOUNT=30 DLINK=31 WASTE=32 DDATE=33 ECOUNT=35 /PIP FOR OS/8 MONITOR /EQUIVALENCES FOR GENERAL CHARACTER I/O ROUTINES OUBUF=0 /MUST BE LOWER THAN INBUF OUCTL=5400 /OUTPUT BUFFER OF 3000 WORDS OUDEVH=7200 /PROVIDE ROOM FOR TWO-PAGE HANDLERS INBUF=3000 INCTL=1600 /INPUT BUFFER OF 3400 WORDS INRECS=7 INDEVH=6600 /PAGE 6400 IS FREE, EXCEPT DURING /Y COMMAND /EQUIVALENCES NECESSARY TO INTERFACE WITH MONITOR DCB=7760 MPARAM=7643 /CD PARAMETER AREA OLDDIR=7 /POINTER TO MONITOR VARIABLE "OLDT9" MTEMP=27 /MONITOR SCRATCH AREA ON "SYS" - ***VOLATILE*** PTP=20 /INTERNAL TYPE CODE FOR PAPER TAPE PUNCH XR=10 TEMP=20 CHAR=21 INFPTR=22 INEOF=23 ABUF=6601 /LINE BUFFER - 150 CHARACTERS LONG SQBUF1=6600 /DIRECTORY BUFFER FOR "SQUISH" OPTION SQBUF2=7200 /"" FIELD 1 /TO ENABLE /E,/F,/L SET /OS78=0 /TO DISABLE /E,/F,/L IFNDEF OS78 <OS78=1> /GENERAL CHARACTER I/O ROUTINES FOR BLEEP /CALLED AS FOLLOWS: /JMS I (IOPEN INITIALIZES THE INPUT ROUTINE /JMS I (ICHAR READS A CHARACTER /ERROR RETURN /AC>0 IF END OF FILE, AC<0 IF READ ERROR /JMS I (OOPEN INITIALIZES THE OUTPUT ROUTINE /ERROR RETURN AC>0 IF NO OUTPUT DEVICE/FILE, AC<0 IF ERROR /JMS I (OCHAR OUTPUTS A CHARACTER /ERROR RETURN OUTPUT ERROR OR TOO MUCH OUTPUT /JMS I (OCLOSE CLOSES THE OUTPUT FILE /ERROR RETURN FILE TOO LARGE TO BE CLOSED OR OUTPUT ERROR /JMS I (OTYPE RETURNS DCB WORD OF OUTPUT DEVICE IN AC /PARAMETERS NEEDED: /INBUF= ADDRESS OF INPUT BUFFER /INCTL= INPUT BUFFER CONTROL WORD /OUBUF= ADDRESS OF OUTPUT BUFFER /OUCTL= OUTPUT BUFFER CONTROL WORD (MUST BE NEGATIVE) /INRECS= [INCTL/256] /INDEVH= ADDRESS OF PAGE FOR INPUT HANDLER /OUDEVH= ADDRESS OF PAGE FOR OUTPUT HANDLER /ASSUMES I/O MONITOR IS RESIDENT IN CORE. /CAN BE CALLED FROM ANY FIELD WITH BUFFERS IN ANY FIELD. INFLD=INCTL&70 /GET FIELD OF INPUT BUFFER OUFLD=OUCTL&70 /DITTO OUTPUT BUFFER *2000 IN7400, 7400 IOPEN, 0 CLA CMA DCA INCHCT /SET INCHCT TO FORCE A READ ISZ INEOF /SET END-OF-FILE FLAG TO FORCE A NEW FILE TAD (7617 DCA INFPTR /RESET FILE POINTER RDF TAD INCDIF DCA .+1 INPTR, HLT /RESTORE CALLING FIELDS JMP I IOPEN ICHAR, 0 IN7600, 7600 RDF TAD INCDIF DCA INRTRN /SAVE CALLING FIELDS INCHAR, CDF INFLD ISZ INJMP /BUMP THREE-WAY UNPACK SWITCH ISZ INCHCT INJMPP, JMP INJMP TAD INEOF SNA CLA /DID LAST READ YIELD END-OF-FILE? JMP INGBUF /NO - DO ANOTHER GETNEW, JMS INNEWF /OPEN A NEW INPUT FILE JMP EOFERR /NO FILE TO OPEN INGBUF, TAD INCTR CLL TAD (INRECS SNL DCA INCTR /RESTORE INCTR IF IT HASN'T OVERFLOWED SZL /IS THIS THE LAST READ? ISZ INEOF /YES - SET END-OF-FILE FLAG /NOT END-OF-FILE IF INPUT DEVICE /IS NON-FILE STRUCTURED! CLL CML CMA RTR /CONSTRUCT A CONTROL WORD FOR THE READ RTR /FROM THE AMOUNT OF THE OVERFLOW RTR /(IF ANY) AND THE STANDARD CONTROL WORD TAD (INCTL+1 DCA INCTLW INCDIF, CDF CIF 0 CDF 10 JMS I INHNDL /CALL THE DEVICE HANDLER INCTLW, 0 INBUFP, INBUF INREC, 0 JMS I (SLASHG /A HANDLER ERROR - SHOULD WE IGNORE? INERRX-. /ADDRESS IF NOT INBREC, TAD INREC TAD (INRECS DCA INREC /UPDATE THE RECORD NUMBER TAD INCTLW AND IN7600 CLL RAL TAD INCTLW AND IN7600 CMA DCA INCHCT /COMPUTE THE NEW CHARACTER COUNT TAD INJMPP DCA INJMP /RESET THE CHARACTER SWITCH TAD INBUFP DCA INPTR /AND THE WORD POINTER JMP INCHAR /GO BACK AND MAKE BELIEVE THIS NEVER HAPPENED INERRX, ISZ INEOF /EITHER AN END-OF-FILE OR A BADDIE SMA CLA /WHICH TYPE WAS IT? JMP INBREC /END OF FILE - RESUME THY PROCESSING INERR, CLA CLL CML RAR /BADDIE - GIVE ERROR RETURN WITH NEGATIVE AC EOFERR, JMP INRTRN INJMP, HLT /THIS IS THE THREE - WAY CHARACTER SWITCH JMP ICHAR1 JMP ICHAR2 ICHAR3, TAD INJMPP DCA INJMP TAD I INPTR IN200, AND IN7400 CLL RTR RTR /COMBINE THE HIGH-ORDER FOUR BITS OF TAD INCTLW RTR /THE TWO WORD TO FORM THE THIRD CHARACTER RTR ISZ INPTR JMP INCOMN ICHAR2, TAD I INPTR AND IN7400 DCA INCTLW /SAVE THE HIGH-ORDER BITS FOR THE THIRD CHAR ISZ INPTR /BUMP THE WORD POINTER ICHAR1, TAD I INPTR INCOMN, AND (377 TAD (-232 INCTZF, SNA /IS THE CHARACTER A ^Z? JMP GETNEW /YES - GET A NEW FILE TAD (232 /RESTORE THE CHARACTER ISZ ICHAR /BUMP RETURN TO NORMAL RETURN INRTRN, 0 /RESTORE CALLING FIELDS JMP I ICHAR /AND RETURN /IOPEN IS UNNECESSARY. INNEWF, -1 /ROUTINE TO OPEN NEW INPUT FILE INCHCT=INNEWF CDF 10 TAD (INDEVH+1 DCA INHNDL /INITIALIZE HANDLER ADDRESS TAD I INFPTR /GET NEXT CD INPUT FILE ENTRY SNA /ANY MORE? JMP I INNEWF /NO - OUT OF INPUT JMS I IN200 1 /ASSIGN, FETCH HANDLER INHNDL, 0 HLT /HUH? TAD I INFPTR AND (7760 /GET LENGTH PART OF WORD SZA /LENGTH OF 0 MEANS LENGTH >=256 TAD (17 /ADD HIGH-ORDER BITS CLL CML RTR RTR DCA INCTR /STORE LENGTH OF FILE ISZ INFPTR TAD I INFPTR DCA INREC /STORE STARTING RECORD NUMBER OF FILE ISZ INFPTR DCA INEOF /ZERO END-OF-FILE FLAG ISZ INNEWF JMP I INNEWF INCTR=IOPEN PAGE OOPEN, 0 /OPEN OUTPUT FILE OU7600, 7600 / RDF / TAD OUCDIF / DCA OORETN TAD OU7601 DCA OUBLK TAD (OUDEVH+1 DCA OUHNDL CDF 10 TAD I OU7600 /GET DEVICE NUMBER WORD OF OUTPUT FILE ENTRY AND (17 /STRIP OFF ANY LENGTH INFO SNA /IS THERE AN OUTPUT DEVICE? JMP ONOFIL /NO - INHIBIT OUTPUT JMS I (200 1 /ASSIGN, FETCH HANDLER OUHNDL, 0 /OUTPUT DEVICE HANDLER ENTRY HLT /HUH? OUENTR, TAD I OU7600 JMS I (200 3 /ENTER OUTPUT FILE OUBLK, 7601 /REPLACED WITH STARTING BLOCK OUELEN, 0 /REPLACED WITH LENGTH OF HOLE JMP OEFAIL /FAILED - MAYBE WE ASKED TOO MUCH DCA OUCCNT DCA I (OUTINH /ZERO OUTPUT INHIBIT FLAG JMS I (OUSETP ISZ OOPEN OORETN, CDF CIF 10 /RESTORE CALLING FIELDS JMP I OOPEN OEFAIL, TAD I OU7600 AND (7760 /GET REQUESTED LENGTH SNA CLA /WAS IT AN INDEFINITE REQUEST JMP ONTERR /YES - CANNOT ENTER THE FILE TAD I OU7600 AND (17 /MAKE THE REQUESTED LENGTH ZERO DCA I OU7600 JMP OUENTR /TRY, TRY AGAIN ONTERR, CLA CLL CML RAR JMP OORETN /TAKE THE ERROR RETURN WITH AC<0 ONOFIL, ISZ I (OUTINH JMP OORETN /TAKE THE ERROR RETURN WITH AC=0 OUTDMP, 0 DCA OUCTLW /STORE THE CONTROL WORD CDF 10 TAD I (OUTINH SZA CLA JMP OUNOWR TAD OUCCNT SNA ISZ OUCTLW TAD OUBLK DCA OUREC /COMPUTE THE STARTING BLOCK NUMBER OF THIS TRANSFER TAD OUCTLW CLL RTL RTL RTL AND (17 /COMPUTE THE NUMBER OF RECORDS TAD OUCCNT /UPDATE THE NUMBER OF BLOCKS IN THE FILE DCA OUCCNT TAD OUCCNT CLL CML TAD OUELEN SNL SZA CLA /DOES THE LENGTH EXCEED THE GIVEN LENGTH? JMP I OUTDMP /YES - SIGNAL OUTPUT ERROR OUCDIF, CDF CIF 0 CDF 10 JMS I OUHNDL OUCTLW, 0 OUBUF OUREC, 0 JMS I (SLASHG .+2-. OUNOWR, ISZ OUTDMP /BUMP OUTDMP TO NORMAL RETURN JMP I OUTDMP OCLOSE, 0 CDF 10 TAD I (OUTINH SZA CLA /IS OUTPUT INHIBITED? JMP OCISZ /YES - CLOSE IS A NOP JMS I (OTYPE AND (770 TAD (-PTP /CHECK FOR PAPER TAPE PUNCH OUTPUT SZA CLA /AND SKIP ^Z OUTPUT IF TRUE TAD (232 /OUTPUT A ^Z JMS I (OCHAR JMP OCRET JMS I (OCHAR JMP OCRET FILLLP, JMS I (OCHAR JMP OCRET JMS I (OTYPE /GET TYPE OF OUTPUT DEVICE SPA CLA TAD (100 /IF ITS A DIRECTORY DEVICE FORCE A RECORD TAD (77 /BOUNDARY - OTHERWISE A HALF-RECORD AND I (OUDWCT SZA CLA /UP TO THE BOUNDARY YET? JMP FILLLP /NO - FILL WITH ZEROS TAD I (OUDWCT /GET DOUBLEWORD COUNT LEFT TAD (OUCTL&3700 SNA /A FULL WRITE LEFT? JMP NODUMP /YES - DON'T DO IT - THE ^Z IS ALREADY OUT TAD (4000+OUFLD /PUT IN THE FIELD BITS AND THE WRITE BIT JMS OUTDMP JMP OCRET /AN ERROR OCCURRED WHILE DUMPING THE BUFFER NODUMP, TAD I OU7600 /GET THE DEVICE NUMBER JMS I (200 4 /CLOSE THE OUTPUT FILE OU7601, 7601 /POINTER TO THE OUTPUT FILE NAME OUCCNT, 0 SKP /ERROR WHILE CLOSING THE FILE - BAD! OCISZ, ISZ OCLOSE OCRET, CDF CIF 10 /RESTORE CALLING FIELDS JMP I OCLOSE PAGE OUSETP, 0 /ROUTINE TO INITIALIZE CHARACTER POINTERS TAD (OUCTL&3700 /GET SIZE OF BUFFER IN DOUBLEWORDS CIA /PAL10 IS DEFINITELY NOT NICE DCA OUDWCT / TAD (OUBUF IFNZRO OUBUF <ERROR!> /V3 DCA OUPTR /INITIALIZE WORD POINTER TAD OUJMPE DCA OUJMP /INITIALIZE THREE-WAY CHARACTER SWITCH JMP I OUSETP OCHAR, 0 AND (377 DCA OUTEMP RDF TAD (CDF CIF 0 DCA OUCRET TAD OUTINH SZA CLA /IS THERE AN OUTPUT FILE? JMP OUCOMN /NO - EXIT OUCHAR, CDF OUFLD /SET DATA FIELD TO BUFFER'S FIELD ISZ OUJMP /BUMP THE CHARACTER SWITCH OUJMP, HLT /THREE WAY CHARACTER SWITCH JMP OCHAR1 JMP OCHAR2 OCHAR3, TAD OUTEMP CLL RTL RTL AND (7400 TAD I OUPOLD DCA I OUPOLD /UPDATE FIRST WORD OF TWO WITH HIGH /ORDER 4 BITS OF THIRD CHAR TAD OUTEMP CLL RTR RTR RAR AND (7400 TAD I OUPTR DCA I OUPTR /UPDATE SECOND WORD FROM LOW ORDER 4 BITS TAD OUJMPE DCA OUJMP /RESET SWITCH ISZ OUPTR ISZ OUDWCT /BUMP DOUBLEWORD COUNTER EVERY 3 CHARS JMP OUCOMN TAD (OUCTL /LOAD CONTROL WORD FOR A FULL WRITE JMS I (OUTDMP /DUMP THE BUFFER JMP OUCRET /OUTPUT ERROR - GIVE ERROR RETURN JMS OUSETP /RE-INITIALIZE THE POINTERS JMP OUCOMN OCHAR2, TAD OUPTR DCA OUPOLD /SAVE POINTER TO FIRST WORD OF TWO ISZ OUPTR /BUMP WORD POINTER TO SECOND WORD OCHAR1, TAD OUTEMP DCA I OUPTR OUCOMN, ISZ OCHAR OUCRET, HLT /RESTORE CALLING FIELDS JMP I OCHAR OUTEMP, 0 OUPOLD, 0 OUPTR, 0 OUJMPE, JMP OUJMP OUDWCT, 0 OUTINH, 0 OTYPE, 0 RDF TAD (CDF CIF 0 DCA OTRTN CDF 10 TAD I (7600 AND (17 TAD (DCB-1 DCA OUTEMP TAD I OUTEMP OTRTN, HLT JMP I OTYPE CTCTST, 0 TAD (200 /V3 KRS TAD (-203 SNA CLA /IS THE TELETYPE BUFFER A ^C KSF /WITH THE TELETYPE FLAG ON? JMP I CTCTST /NO LEAVE, CDF CIF 0 /YES - GO TO MONITOR JMP I (7600 /THROUGH THE "SAVE CORE" RETURN SLASHG, 0 DCA CTCTST TAD SQFLAG SZA CLA /ARE WE SQUISHING? JMP I (SQIOER /YES TAD CTCTST SPA CLA /ONLY IGNORE HARD ERRORS TAD I (MPARAM AND (40 SZA CLA / "G" SWITCH SLGRET, JMP I SLASHG /IGNORED! TAD I SLASHG TAD SLASHG DCA SLASHG /SET UP NON-IGNORE ADDRESS TAD CTCTST JMP I SLASHG /RETURN WITH AC RESTORED IFZERO OS78 < DIR, DCA DTYPE /SAVE TYPE OF REQUEST TAD I (7600 SZA CLA /IS THERE AN OUTPUT FILE? JMP I (DIRPRE /YES DCA TTYDEV+1 JMS I (200 12 /ASSIGN WITHOUT FETCH TTYDEV, 5524 /COMPRESSED CODE FOR "TTY" 0 0 JMP I (PIP /V3 WHAT - NO TELETYPE! TAD TTYDEV+1 DCA I (7600 JMP I (DIRPRE > IFNZRO OS78 < DIR, JMS I (PIPERR /TYPE OUT MESSAGE 14 DIRMSG, TEXT "USE DIRECT" > PAGE /PIP PROPER BEGINS HERE /********************** /IMAGE MODE PROCESSOR FOR PIP IMAGE, JMS I (FIXLEN JMS I (OUTOPN JMS IMTRA IMCLOS, TAD I (OUTINH SZA CLA /WAS THERE AN OUTPUT FILE? JMP I (PIPCLR /NO - DON'T CLOSE IT JMS I (OUK /GET THE LENGTH OF THE OUTPUT FILE DCA IMCCNT TAD I IM7600 JMS I (200 4 /CLOSE 7601 /FILE NAME IMCCNT, 0 JMP I (AOUERR JMP I (PIPCLR ENDFUJ, 0 /PART OF DIRECTORY PRINTING ROUTINE JMS I (PRNUM TAD (-6 JMS I (PRWD /PRINT SIX WORDS 0006 / F 2205 /RE 0500 /E 0214 /BL 1703 /OC 1323 /KS JMS I (PCRLF JMS I (PCRLF /LEAVE A SPACE BETWEEN DIRECTORIES ISZ INEOF /SIMULATE "END OF FILE" FOR INPUT ROUTINE CLA CMA DCA I (INCHCT /AS WELL AS "END OF BUFFER" JMP I ENDFUJ IMHNDL, /V3 SQTRA, 0 TAD SQTRA DCA IMTRA /FAKE A CALL TO "IMTRA" TAD RECCNT /SETTING UP THE ARGS TO DO THE SQUISHING FOR US DCA I (INCTR TAD IHNDLR DCA IMHNDL TAD INBLK DCA IMREC TAD OUTBLK DCA I (OUCCNT DCA INEOF JMP IMRCLP IMTRA, 0 JMS I (IOPEN /INITIALIZE INPUT ROUTINE AGAIN, TAD INEOF /IOPEN ALWAYS SETS INEOF SNA CLA /KEEP READING? JMP IMRCLP /YES /NO, OPEN NEXT FILE IMFILP, JMS I (INNEWF /SET UP PARAMS FOR NEXT FILE JMP I IMTRA /NO NEXT FILE TAD I (INHNDL DCA IMHNDL /GET DEVICE HANDLER ENTRY TAD I (INREC DCA IMREC /AND STARTING BLOCK NUMBER IMRCLP, TAD I (INCTR CLL TAD (15 SNL /IF LINK IS ON, THERE ARE LESS THAN 16 BLOCKS LEFT DCA I (INCTR SZL ISZ INEOF CLL CML CMA RTR RTR RTR TAD (3201 /FORM A FULL OR PARTIAL READ CONTROL WORD DCA IMCTLW JMS I (CTCTST /CHECK FOR ^C CIF 0 JMS I IMHNDL IMCTLW, 0 OUBUF IMREC, 0 JMS I (SLASHG IMERRX-. TAD IMREC TAD (15 DCA IMREC /UPDATE BLOCK NUMBER CLA CLL CML RAR TAD IMCTLW IMOUT, JMS I (OUTDMP /WRITE OUT WHAT WE JUST READ IN JMP I (AOUERR /WRITE ERROR - BAD! JMP AGAIN /V3 IMERRX, ISZ INEOF /SIGNAL EOF OR WORSE SPA CLA /WHICH ONE IS IT? JMP IM7600 TAD (6377 /MARCH DOWN THROUGH CORE IMEFLP, DCA CHAR /LOOKING FOR THE FIRST NON-ZERO WORD CDF 0 TAD I CHAR SZA CLA JMP IMNZRO CLA CMA CLL TAD CHAR SZL /IF WE GO THROUGH THE BUFFER WITHOUT A NON-ZERO WORD JMP IMEFLP IM7600, 7600 JMS I (PIPERR /SOMETHING IS WRONG (HANDLER SHOULD HAVE INSERTED 4 /A ^Z AT LEAST) IMNZRO, CDF 10 TAD CHAR CLL CML RAR AND IM7600 TAD (200 /GET THE LENGTH OF THE USEFUL PART OF THE BUFFER JMP IMOUT /AS AN OUTPUT CONTROL WORD AND GO OUTPUT IT PAGE /** PIP STARTS HERE (OR HERE+1 IF CHAINED TO) ** PIPSA, JMP PIPCD /NORMAL ENTRY/RE-ENTRY - CALL CD JMP NOPCD /ENTRY FROM CHAIN COMMAND - ASSUME CD AREA SET UP /PART OF ASCII PROCESSOR - CLEAN UP AT END OF LINE AND END OF FILE LFEED, TAD CHAR DCA I XR /PUT THE LINE FEED IN THE LINE BUFFER EOL, DCA I XR /MARK THE END OF USEFUL INFO JMS I (CTCTST TAD (ABUF-1 DCA XR /RESET BUFFER POINTER EOLLP, TAD I XR /GET A CHARACTER FROM THE LINE BUFFER PIPSNA, SNA /ZERO MEANS NO MORE CHARS JMP EOFTST JMS I (OCHAR /OUTPUT THE CHARACTER JMP I (AOUERR JMP EOLLP EOFTST, TAD AEOFFG SNA CLA /END OF INPUT ENCOUNTERED? JMP I (ASCIGO /NO - GET NEXT LINE ACLOSE, JMS I (OCLOSE /YES - CLOSE THE OUTPUT FILE JMP I (AOUERR /ERROR ON CLOSE PIP, TAD I (MPARAM-1 /V3 SMA CLA /ALTMODE TERMINATE LAST COMMAND STRING? JMP PIPCD /NO CDF CIF 0 /YES JMP I (7605 /EXIT TO OS/8 WITHOUT SAVING CORE PIPCD, JMS I (200 /OF COURSE THE MONITOR IS IN CORE! 5 /COMMAND DECODE 0 /NO ASSUMED EXTENSIONS ON INPUT L20, /V3 NOPCD, JMS I (ONCE /REPLACED BY '20' BY ONCE-ONLY CODE JMS I (SRSTOR /CLEAR /S OR /Y;READ MONITOR DCA SQFLAG /CLEAR /S INDICATOR TAD PIPSNA DCA I (INCTZF /RESET INPUT SWITCH TO DETECT "^Z"'S TAD I (MPARAM+1 AND (40 /"S" SWITCH SZA CLA JMP I (SQUISH /IT WAS ON - COMPRESS THE INDICATED DEVICES TAD I (MPARAM+2 RTL SZL CLA /"Z" SWITCH IN THE LINK JMS I (DZERO /ZERO DIRECTORY BEFORE PROCEEDING TAD I (MPARAM AND (400 /"D" SWITCH SZA CLA JMS I (DELETE /DELETE OUTPUT FILE TAD I (MPARAM+2 /IS /Y ON? SPA CLA JMP I (SYSCOP /YEP..TRANSFER SYSTEM HEAD TAD I (MPARAM AND (301 /"E","F" AND "L" SWITCHES SZA /ANY ONE OF THEM ON? JMP I (DIR /YES - LIST A DIRECTORY TAD I (MPARAM RTL AND (40 /"I" SWITCH ROTATED TWO LEFT SZA CLA JMP I (IMAGE /IMAGE MODE TRANSFER TAD I (7617 /MUST PRESERVE THE LINK SNA CLA /V3 IMAGE MODE ALLOWS NO INPUT FILE JMP PIP /TERMINATE HERE IF NO INPUT SIDE SZL CLA /"B" SWITCH IN LINK JMP I (BINARY /BINARY MODE TRANSFER /DEFAULT MODE OF TRANSFER IS ASCII ASCII, TAD I (MPARAM+1 AND L20 DCA COPTSW TAD COPTSW JMS I (ASCI2 /TEST FOR OUTPUT DEVICE JMS I (OUTOPN JMS I (IOPEN /OPEN THE INPUT FILES DCA AEOFFG /ZERO THE END-OF-FILE FLAG JMS I (LEADER JMP I (ASCIGO /ENTRY ON END OF INPUT ASCEOF, SPA CLA /WAS IT END OF INPUT OR AN INPUT ERROR? PER4, JMS I (PIPERR 4 ISZ AEOFFG /SET END-OF-INPUT FLAG JMP EOL /PROCESS LAST LINE (IF ANY) AEOFFG, 0 /SUBROUTINE TO OUTPUT RUBOUTS AFTER FORM CONTROL CHARACTERS RUBOUT, 0 /UNLESS OUTPUT IS TO A DIRECTORY DEVICE DCA TEMP /STORE COUNT JMS I (OTYPE /GET TYPE OF OUTPUT DEVICE SPA CLA JMP I RUBOUT /DIRECTORY DEVICE - DON'T BOTHER RBTLP, TAD CHAR TAD (-214 SNA CLA /IS THE FORM CONTROL CHAR A FORM-FEED? IAC /YES - OUTPUT BLANK TAPE INSTEAD TAD (377 DCA I XR /PUT IN BUFFER ISZ TEMP JMP RBTLP /LOOP FOR THE REQUISITE COUNT JMP I RUBOUT COPTSW, 0 DEND, SPA CLA JMP PER4 JMP ACLOSE PAGE *3200 /ASCII PROCESSOR CONTINUED ASCIGO, TAD (ABUF-2 DCA XR DCA I XR /PROTECT AGAINST NULL LINE WITH "T" OPTION DCA COLCT /ZERO COLUMN COUNTER FOR TAB CONVERSION ACHLP, JMS I (ICHAR /GET A CHARACTER JMP I (ASCEOF /END OF INPUT OR WORSE AND (177 /MASK OUT PARITY BIT SZA /IGNORE BLANK TAPE AND LEADER/TRAILER TAD (-177 SNA JMP ACHLP /DITTO RUBOUTS TAD (177-32 /V3C SNA JMP I (ASCPTCH /7-BIT ^Z CHECK TAD (232 /FORCE COLUMN 8 ON DCA CHAR TAD CHAR TAD (-216 CLL TAD ASCI5 SNL /IS THE CHARACTER A FORM CONTROL CHARACTER? JMP CINSRT /NO TAD ASCJMP /YES - GO TO APPROPRIATE ROUTINE DCA .+1 HLT ASCJMP, JMP I .+1 TAB LFEED VTAB FFEED CARRET CINSRT, 7600 /GRP 2 CLA TAD CHAR ADCAXR, DCA I XR /STORE THE CHARACTER IN THE LINE BUFFER ISZ COLCT /ALWAYS BUMP THE COLUMN POINTER TESTXR, TAD XR TAD (-ABUF-226 SPA CLA /HAS THE BUFFER OVERFLOWED? JMP ACHLP /NO - GET NEXT CHARACTER JMS I (PIPERR 1 TAB, TAD I (COPTSW SNA CLA /DO WE WANT TO CONVERT? JMP TABRBT /NO TABLP, TAD (240 DCA I XR /OUTPUT A SPACE ISZ COLCT TAD COLCT AND (7 SZA CLA /IS THE COLUMN COUNTER A MULTIPLE OF 8? JMP TABLP /NOT YET JMP TESTXR /YES - CHECK BUFFER OVERFLOW TABRBT, TAD CHAR DCA I XR CLA CMA JMS I (RUBOUT /TWO RUBOUTS FOLLOW A TAB JMP TESTXR /CHECK FOR BUFFER OVERFLOW VTAB, TAD I (COPTSW SZA CLA /SHOULD WE CONVERT? JMP VTLF /YES TAD CHAR DCA I XR TAD (-4 JMS I (RUBOUT /FOUR RUBOUTS AFTER A VERTICAL TAB JMP I (EOL FFLF, TAD (-4 /NINE LINE FEED SIMULATE A FORM FEED VTLF, TAD (-5 /FIVE LINE FEEDS SIMULATE A VERTICAL TAB DCA TEMP TAD (212 DCA I XR ISZ TEMP JMP .-3 JMP I (EOL /FORM FEED AND VERTICAL TAB ARE LINE ENDERS FFEED, TAD I (COPTSW SZA CLA /SHOULD WE CONVERT? JMP FFLF /YES TAD CHAR DCA I XR TAD (-11 /NINE RUBOUTS AFTER A FORM FEED JMS I (RUBOUT JMP I (EOL CARRET, TAD I (MPARAM RTL SMA CLA /"C" SWITCH MEANS DELETE TRAILING BLANKS FROM CARDS JMP NOTOPT /IT WASN'T ON TOPT, TAD XR DCA TEMP TAD I TEMP TAD (-240 SZA CLA /WAS THE LAST CHAR ON THE LINE A SPACE? JMP NOTOPT /NO CLA CMA TAD XR /YES - BACK UP THE LINE POINTER DCA XR JMP TOPT NOTOPT, TAD CHAR DCA I XR /STORE THE CARRIAGE RETURN IN THE BUFFER JMP TESTXR /CARRIAGE RETURN IS NOT A LINE TERMINATOR COLCT, 0 OUTOPN, 0 JMS I (OOPEN SMA CLA JMP I OUTOPN JMS I (PIPERR ASCI5, 5 PAGE /SUBROUTINES CALLED BY THE REST OF PIP K770, 770 /** DON'T MOVE THIS CONSTANT DELETE, 0 TAD P7600 DCA DPFILE CLA CLL CMA RTL DCA CHAR /MAXIMUM OF THREE OUTPUT FILES DELOOP, TAD (7201 DCA DLHNDL TAD I DPFILE SNA /DOES THIS FILE EXIST? JMP I DELETE /THAT'S ALL JMS I C200 1 /ASSIGN HANDLER FOR THE DELETION DLHNDL, 0 HLT TAD I DPFILE /RELOAD DEVICE NUMBER FOR DELETE ISZ DPFILE /BUMP DPFILE TO POINT TO THE FILE NAME JMS I C200 /DEVICE NUMBER IN AC DP4, 4 /CLOSE - USED AS DELETE IN THIS CASE DPFILE, 0 /POINTER TO FILE NAME 0 /ZERO LENGTH FOR DELETE JMS I (PIPERR /FILE WASN'T THERE TO BE DELETED 3 TAD DPFILE TAD DP4 DCA DPFILE ISZ CHAR JMP DELOOP /DELETE AS MANY FILES AS HE LISTED(UP TO 3) JMP I DELETE DZERO, 0 /SUBROUTINE TO ZERO THE DIRECTORY OF THE /FIRST OUTPUT DEVICE JMS I (OTYPE CLL RTL SZL /IS DEVICE READ-ONLY? JMP OZERR /YES - ERROR RTR SMA /FILE-STRUCTURED DEVICES WILL HAVE 4000 BIT SET JMP NONDIR /NON-DIRECTORY DEVICE AND K770 /MASK OUT DEVICE TYPE CLL RTR RAR TAD (DEVLEN /USE IT TO INDEX A TABLE OF DEVICE LENGTHS DCA PIPERR TAD (OUDEVH+1 DCA OZHNDL TAD I P7600 JMS I C200 1 /ASSIGN DEVICE, FETCH HANDLER OZHNDL, 0 HLT TAD I PIPERR SNA /IS THE LENGTH ZERO? JMS I (DVREDE /IF SO, GO "READ LENGTH" DCA PIPERR /STORE LENGTH TAD I (MPARAM+2 /IF /Y ON, DO SYSTEM ZERO SPA CLA JMP ZRO70 TAD OZHNDL /BUT IF NOT, CHECK FOR SYSTEM ZERO TAD (-7607 SZA CLA JMP ZRO70+1 /NOT SYSTEM FILES BEGIN AT 7 JMS I (CONFRM /ASK IF HE'S SURE SYSZRO /V3 ZRO70, TAD (61 TAD (7 DCA I (DFORG DCA I (SQFLAG /AND CLEAR OUT SQUISHES TAD PIPERR TAD I (DFORG DCA I (DLENGT JMS I (GETEQ DCA I (DWASTE /DEFINE # OF WASTE WORDS DCA I (MPARAM+3 /KILL = OPTION FOR FUTURE /I TRANSFERS CIF 0 JMS I OZHNDL 5410 /V3 OUTPUT 6 BLOCKS FROM FIELD 1 DIRECT 1 /ALL DIRECTORIES ARE IN RECORD 1 OZERR, JMS I (PIPERR /ERROR WHILE ZEROING DIRECTORY 2 DCA OLDDIR /ZERO DIRECTORY POINTER TO FORCE A NEW READ NONDIR, CLA /NON DIRECTORY RETURN JMP I DZERO PIPERR, 0 P7600, 7600 /V3 CLA JMS I (SRSTOR /RESET 07600! CDF 10 /JUST IN CASE TAD I PIPERR /GET ARG TAD (ERRTBL DCA TEMP TAD I TEMP JMS I (ERPRNT JMP I (PIP /RESTART PIP LEADER, 0 JMS I (OTYPE C200, AND K770 /GET THE TYPE OF THE OUTPUT DEVICE TAD (-PTP /IS IT A PAPER TAPE PUNCH? SZA CLA JMP I LEADER /NO TAD P7600 DCA TEMP JMS I (OCHAR /PUT OUT SOME LEADER JMP I (AOUERR ISZ TEMP JMP .-3 JMP I LEADER PAGE /TABLE OF DEVICE LENGTHS FOR /Z OPTION DEVLEN, 0;0;0;0;0;1520 /RK08 (1520= - DECIMAL 3248) 6001;4001;2001;0001 /RF08 IN VARIOUS SIZES /(CHEATS A BLOCK ON LARGEST TO KEEP IT NON-ZERO) 7601;7401;7201;7001 /DF32 IN VARIOUS SIZES /(CHEATS A BLOCK TO AVOID HARDWARE TROUBLE) 6437;6437 /DECTAPE AND LINCTAPE ZBLOCK 1 /20 MAGTAPE 6437 /21 TD8E 0 1520 / 1/2 OF AN RK8E IS 23 0 /24 7022 /25 RX01 FLOPPY DISK 17 /26 RL DEVICE 0 0 4027 /31 RL DEVICE 0 /32 NEW RX MUST BE ZERO TO EXAMINE MEDIA 7600 /33 VX EXT MEM - DF32 PSEUDO DEVICE 7400;7200 /2ND AND 3RD PLATTERS ZBLOCK 42 /ALL THE REST FIXLEN, 0 /ROUTINE TO ESTIMATE OUTPUT FILE LENGTH TAD I (7600 AND (7760 SZA CLA /DID THE USER PROVIDE AN ESTIMATE? JMP I FIXLEN /YES - USE IT DCA CHAR TAD (7617 DCA TEMP FIXLP, TAD I TEMP /GET NEXT INPUT FILE SNA JMP FIXOVR /NO MORE INPUT FILES AND (7760 CIA CLL /GET LENGTH AS A POSITIVE NUMBER /(LENGTH OF ZERO TURNS LINK ON) TAD CHAR DCA CHAR /UPDATE CUMULATIVE LENGTH SZL CLA /DID CUMULATIVE LENGTH OVERFLOW 256 BLOCKS? JMP I FIXLEN /YES - CAN'T ESTIMATE IT ISZ TEMP ISZ TEMP JMP FIXLP FIXOVR, TAD CHAR TAD I (7600 DCA I (7600 /STICK LENGTH IN OUTPUT FILE DESCRIPTOR JMP I FIXLEN NOYES, TEXT /NO/ TEXT /YES/ CONFRM, 0 TAD I (MPARAM+1 RTL /'O' BIT TO SIGN SPA CLA JMP GOTCON /V3 'O' MEANS OK, ASSUME 'YES' TAD I CONFRM /V3 JMS I (ERPRNT KSF JMP .-1 JMS I (CTCTST KRB /LOOK AT HIS REPLY AND (177 /IGNORE PARITY TTY TAD (-"Y!7600 /V3 SNA CLA /IS IT YES? ISZ SQFLAG /SET SQFLAG TO 1 (NEEDED 1 LATER) TAD SQFLAG /USE SQFLAG AS INDEX FOR MESSAGE CLL RAL TAD (NOYES JMS I (ERPRNT TAD SQFLAG SNA CLA JMP I (PIP CNFMXT, ISZ CONFRM JMP I CONFRM GOTCON, ISZ SQFLAG /SET SQFLAG JMP CNFMXT /AND TAKE SKIP EXIT PAGE /DIRECTORY PRINTER FOR PIP MDATE=7666 DIRPRE, JMS I (OUTOPN /OPEN THE OUTPUT FILE TAD (ABUF DCA CHAR /ABUF WILL BE A TEMPORARY ARRAY OF STARTING FILES TAD (7617 DCA TEMP TAD I (7617 SNA JMS I (DSKNUM DCA I (7617 /DEFAULT DIRECTORY IS DSK: DFUJLP, TAD I TEMP SNA /ARE WE THROUGH WITH THE INPUT DEVICES? JMP GETDIR /YES AND (17 DCA I TEMP /ONLY THE DEVICE NUMBER IS IMPORTANT TAD I TEMP TAD (DCB-1 DCA PRWD CLA CLL CML RTL TAD TEMP DCA INFPTR /THIS SERVES NO FUNCTION EXCEPT IMPROVING ERROR MESSAGES TAD I PRWD SMA CLA /IS THE DEVICE A DIRECTORY DEVICE? JMS I (PIPERR /NO 6 ISZ TEMP TAD I TEMP DCA I CHAR /SAVE THE STARTING BLOCK NUMBER CLA IAC DCA I TEMP /READ FROM THE DIRECTORY ISZ TEMP ISZ CHAR JMP DFUJLP GETDIR, TAD (ABUF DCA CHAR JMS PCRLF TAD I (MDATE JMS I (PDATE JMS PCRLF JMS I (IOPEN /RESET POINTERS - WERE GONNA FAKE OUT THOSE "GENERAL" /ROUTINES JMP I (NXTDIR PRWD, 0 /ROUTINE TO PRINT SIXBIT TEXT SNA /IS COUNT ZERO? CMA /MAKE IT ONE DCA PRCT /STORE COUNT PRWDLP, TAD I PRWD PR212, RTR RTR RTR JMS PR6BIT TAD I PRWD JMS PR6BIT ISZ PRWD ISZ PRCT JMP PRWDLP JMP I PRWD PRCT, 0 PR6BIT, 0 AND (77 SZA TAD (240 /V3 AND (77 /V3 TAD (240 /V3 JMS I (OCHAR JMP I (AOUERR JMP I PR6BIT PRNUM, 0 DCA PRWD DCA TEMP TAD (PWRTEN DCA PCRLF PRNMLP, DCA PR6BIT TAD I PCRLF SNA JMP PRLAST /V3 CLL TAD PRWD SNL JMP .+4 DCA PRWD ISZ PR6BIT JMP PRNMLP+1 CLA TAD PR6BIT TAD TEMP SNA PBLJMP, JMP PRBLNK /INCREMENTED BY PDATE TO KILL LEADING BLANKS TAD (260 JMS PR6BIT CLA CLL CML RAR DCA TEMP ISZ PCRLF JMP PRNMLP PRBLNK, JMS PR6BIT JMP .-3 PRLAST, TAD PRWD /V3 TAD (260 /V3 JMS PR6BIT /V3 JMP I PRNUM /V3 PCRLF, 0 TAD (215 JMS I (OCHAR JMP I (AOUERR TAD PR212 JMS I (OCHAR JMP I (AOUERR JMP I PCRLF PWRTEN, -1750;-144;-12;0 /V3 PAGE /MAIN DIRECTORY PRINTING LOOP NXTDIR, JMS I (ICHAR /FAKE, FAKE JMP I (DEND CLA /WE DON'T WANT THE CHARACTER DCA ECOUNT TAD (INBUF-1 /WE WANT THE BUFFER! NEWSEG, DCA XR CDF 0 TAD I XR DCA DCOUNT /NUMBER OF ENTRIES TAD DCOUNT CLL TAD (100 SNL CLA JMS I (PIPERR 11 TAD I XR DCA BLOKNO /FIRST BLOCK OF FILE STORAGE TAD I XR DCA DLINK /LINK TO NEXT SEGMENT ISZ XR /BUMP XR PAST FLAG WORD TAD I XR DCA WASTE NAMELP, CDF 0 TAD I XR SNA /WHAT TYPE OF ENTRY IS IT? JMP DEMPTY /A FREE FILE DCA NAME1 /A PERMENANT OR TENTATIVE FILE TAD I XR DCA NAME2 TAD I XR DCA NAME3 TAD I XR DCA NAME4 TAD I XR DCA DDATE TAD WASTE /COMPENSATE FOR THE DATE INCREMENT CMA /AND THE WASTE WORDS TAD XR DCA XR TAD I XR SNA /IS IT A TENTATIVE FILE? JMP ADDLEN+1 /YES - TENTATIVE FILES ARE ALWAYS IGNORED CIA DCA FLENGT /NO - STORE THE LENGTH CDF 10 TAD I CHAR /GET THE STARTING FILE FOR THIS LISTING CIA CLL TAD BLOKNO SNL CLA /ARE WE THERE YET? JMP ADDLEN /NO - KEEP GOING CLA CLL CMA RTL JMS I (PRWD /PRINT THREE WORDS NAME1, 0 NAME2, 0 NAME3, 0 TAD NAME4 SNA CLA /IS THERE AN EXTENSION? TAD (-16 /NO - PRINT A BLANK TAD (56 /YES - PRINT A PERIOD JMS I (PR6BIT JMS I (PRWD NAME4, 0 /ZERO PRINTS AS TWO MORE BLANKS PRLNGT, TAD DTYPE AND (100 SZA CLA /WAS THE LISTING SWITCH /F? JMP PRTCRL /YES - DON'T PRINT LENGTH TAD FLENGT JMS I (PRNUM TAD WASTE SZA CLA TAD DDATE JMS I (PDATE /PRINT THE CREATION DATE OF THE FILE PRTCRL, JMS I (PCRLF ADDLEN, TAD FLENGT TAD BLOKNO DCA BLOKNO /UPDATE BLOCK NUMBER ISZ DCOUNT JMP NAMELP /LOOP UNTIL ALL FILES ARE PROCESSED TAD DLINK SNA CLA /MULTI-SEGMENT DIRECTORY? JMP ENDDIR /NO - FINISH UP TAD XR AND (7400 TAD (377 /BUMP XR TO NEXT BLOCK JMP NEWSEG /PROCESS NEXT LINK DEMPTY, TAD I XR CIA DCA FLENGT /STORE LENGTH OF FREE ENTRY CDF 10 TAD FLENGT TAD ECOUNT DCA ECOUNT /BUMP COUNT OF FREE BLOCKS TAD DTYPE AND (200 SNA CLA /IS THE /E SWITCH ON? JMP ADDLEN /NO - DON'T LIST FREE FILES TAD (-4 JMS I (PRWD TEXT /<EMPTY>/ JMS I (PR6BIT TAD FLENGT JMS I (PRNUM JMP PRTCRL ENDDIR, ISZ CHAR /BUMP TEMP ARRAY TO NEXT ENTRY TAD ECOUNT JMS I (ENDFUJ JMP NXTDIR PAGE /BINARY MODE PROCESSOR FOR PIP BIN360, 360 BINARY, JMS I (FIXLEN JMS I (OUTOPN JMS I (IOPEN JMS I (LEADER /PUT OUT BLANK TAPE IF HS PUNCH OUTPUT JMS LTCODE NEWTAP, JMS I (ICHAR JMP BEOF /END OF FILE ON INPUT SNA JMP NEWTAP /BLANK TAPE - KEEP GOING TAD BN7600 SZA CLA JMP NEWTAP JMS I (ICHAR JMP BEOF TAD BN7600 SNA JMP .-4 TAD BIN200 DCA CHAR TAD CHAR BIN200, AND BIN360 TAD (-240 /CHECK TYPE OF TAPE SNA /IS IT RELOCATABLE? JMP RELBIN /YES TAD (-40 /IF A FIELD SETTING, IT'S ABSOLUTE AND (7700 SNA JMP ABSLUT TAD BIN200 /CHECK FOR ORIGIN ALSO SZA CLA JMP NEWTAP /NOTHING..NEXT FRAME ABSLUT, CLA CMA JMS LTCODE ABSBIN, JMS RCOPY1 /COPY THIS FRAME AND READ NEXT TAD BN7600 BNM140, SZA CLA /IS IT TRAILER? JMP ABSBIN /NO - KEEP GOING BEOT, CLA CMA /END OF TAPE JMS LTCODE /PUT OUT SHORT LEADER/TRAILER JMP NEWTAP /GET NEXT TAPE LTCODE, 0 /SUBROUTINE TO PUNCH 200 CODE SMA /SHORT LEADER/TRAILER? JMS I (OTYPE SPA CLA /DIRECTORY DEVICE? TAD (70 /YES TAD (-100 DCA TEMP LTLOOP, TAD BIN200 JMS I (OCHAR /OUTPUT 64 OR 8 FRAMES OF L/T CODE JMP I (AOUERR ISZ TEMP JMP LTLOOP JMP I LTCODE RELBIN, TAD (SKP DCA I (INCTZF /DISABLE CONTROL-Z CHECKING ON INPUT CLA CMA JMS LTCODE /PUT OUT SHORT LEADER/TRAILER RELLP, TAD CHAR RTR RTR AND (17 TAD (RELTBL DCA TEMP TAD I TEMP /GET DATA WORD FOR THIS FRAME SMA SZA /POSITIVE MEANS SPECIAL OR ERROR JMP RELERR RELSNA, SNA JMP RELEND /ZERO MEANS CHECKSUM FRAME DCA TEMP /NEGATIVE MEANS COUNT OF NUMBER OF SLAVE FRAMES JMS RCOPY1 BN7600, 7600 ISZ TEMP JMP .-3 /COPY THIS FRAME AND ALL SLAVE FRAMES JMP RELLP /GET NEXT CONTROL FRAME RELEND, JMS RCOPY1 /COPY THE FIRST FRAME OF THE CHECKSUM JMS I (OCHAR JMP I (AOUERR /OUTPUT THE SECOND FRAME JMP BEOT /END TAPE - START NEXT ONE BEOF, JMS LTCODE JMS I (OCLOSE JMP I (AOUERR JMP I (PIP RCOPY1, 0 /ROUTINE TO ADVANCE "CHAR" TO NEXT INPUT CHARACTER TAD CHAR JMS I (OCHAR JMP I (AOUERR JMS I (ICHAR JMP INEFER DCA CHAR TAD CHAR JMP I RCOPY1 INEFER, SMA CLA /DETECT FATALITIES JMS I (PIPERR 7 JMS I (PIPERR /A REAL BAD READ 4 RELERR, CLL RAR SZA CLA /CODE OF 1 MEANS SPECIAL JMS I (PIPERR /ILLEGAL RELOCATABLE INPUT 10 JMS RCOPY1 CLL CML CMA RTL /MULTIPLY NAME COUNT BY -6 (APPROXIMATELY) TAD CHAR CLL CML RAL /(ACTUALLY THIS PRODUCES -6X-1 WHICH IS WHAT WE WANT) JMP RELSNA PAGE ERPRNT, 0 /ERROR MESSAGE PRINTOUT ROUTINE DCA TEMP ERLP, TAD I TEMP RTR RTR RTR JMS ERPCH /PRINT HIGH-ORDER CHARACTER TAD I TEMP JMS ERPCH /PRINT LOW-ORDER CHARACTER ISZ TEMP JMP ERLP ERPCH, 0 AND (77 SNA JMP ERCRLF /0 CHARACTER TERMINATES JMS CHPRNT JMP I ERPCH FILENR, TAD ("# JMS I (TTYOUT TAD INFPTR /GET PTR TO CURRENT INPUT FILE TAD (321 /MAGIC NUMBER CLL RAR JMP FILENR-2 CHPRNT, 0 TAD (-37 /IS IT A _? SNA JMP FILENR /YES..PRINT FILE NUMBER IAC SNA /MAYBE ^? JMP I (SQFILE /YEP..PRINT FILE NAME SPA TAD (100 TAD (236 JMS I (TTYOUT JMP I CHPRNT ERCRLF, TAD (215 JMS I (TTYOUT TAD (212 JMS I (TTYOUT JMP I ERPRNT PDATE, 0 /PRINTS THE DATE SNA JMP I PDATE /NO DATE TO PRINT DCA ERPRNT ISZ I (PBLJMP JMS I (PR6BIT TAD ERPRNT CLL RTL RTL RAL AND (17 JMS I (PRNUM TAD (57 JMS I (PR6BIT TAD ERPRNT RTR RAR AND (37 JMS I (PRNUM TAD (57 JMS I (PR6BIT TAD ERPRNT AND (7 TAD (106 JMS I (PRNUM CLA CMA TAD I (PBLJMP DCA I (PBLJMP /RESET PRNUM TO PRINT LEADING SPACES JMP I PDATE DSKNUM, 0 DCA DSKNAM+1 JMS I (200 12 DSKNAM, 5723 0 0 HLT TAD DSKNAM+1 JMP I DSKNUM RELTBL, -2;-2;2;-10;-2;-2;-2;2;0;2;-2;2;2;2;2;1 ERRTBL, ERR0 ERR1 ERR2 ERR3 ERR4 ERR5 ERR6 ERR7 ERR8 ERR9 ERR10 ERR11 IFNZRO OS78 <DIRMSG> PAGE /ERROR MESSAGE TEXT GOES HERE ERR0, TEXT /NO ROOM FOR OUTPUT FILE/ ERR1, TEXT /LINE TOO LONG IN FILE_/ ERR3, TEXT /ERROR DELETING FILE/ ERR4, TEXT /INPUT ERROR, FILE_/ ERR5, TEXT /CAN'T OPEN OUTPUT FILE/ ERR6, TEXT /DEVICE_ NOT A DIRECTORY DEVICE/ ERR7, TEXT /PREMATURE END OF FILE, FILE_/ ERR8, TEXT /ILLEGAL BINARY INPUT, FILE_/ ERR9, TEXT /BAD DIRECTORY ON DEVICE_/ ERR10, TEXT /DIRECTORY ERROR/ TTYOUT, 0 TLS TSF JMP .-1 CLA JMP I TTYOUT PAGE /SQUISH PROCESSOR SQUISH, JMS I (CONFRM SURE /V3 SQUISX, DCA I (OUELEN /INITIALIZE PARAMS TO FAKE OUT "IMTRA" DCA I (OUBLK DCA I (7621 /ZERO SECOND FILE FOR "INNEWF" DCA I (CTCFLG JMS I (IOPEN JMS I (INNEWF JMP I (PIP /NO INPUT TAD (OUDEVH+1 DCA SOHND TAD I SQ7600 SNA JMP I (PIP /NO OUTPUTEE, NO SQUISHEE JMS I (200 1 SOHND, 0 HLT JMS INTEST JMS I (OTYPE CLL RTR RAR AND (77 TAD (DEVLEN DCA TEMP TAD SOHND /SET UP OZHNDL DCA I (OZHNDL /IN CASE OF JMP TO DVREDE TAD I TEMP /GET ENTRY FROM DEVICE LENGTH TABLE SNA /IS THE DEVICE LENGTH ZERO ? JMS I (DVREDE /IF SO, READ THE LENGTH DCA OUDLEN /SAVE OUTPUT DEVICE LENGTH JMS I (GETEQ DCA OUWAST TAD SOHND DCA OHNDLR TAD OHNDLR DCA I (OUHNDL TAD I (INHNDL DCA IHNDLR JMS SETCTC JMS I (CTCFLG CIF 0 JMS I IHNDLR 1400 0 1 JMP I (SQIDER+1 CIF 0 JMS I (7607 5400 0 MTEMP /MOVE THE INPUT DIRECTORY TO SYS: JMP I (SQIDER+1 CLA IAC DCA I (SQBUF2+2 DCA I (CTCFLG TAD SOHND /SETUP DIRECTORY START JMS I (SQDTST JMS I (SETSAM /IF IHNDLR=OHNDLR, SAME=1 CLA CMA DCA I (SQBUF2 DCA I (OUTSEG JMP I (NEWOUT INTEST, 0 /TEST IF INPUT IS DIRECTORY TAD I (7617 AND (17 TAD (DCB-1 DCA TEMP TAD I TEMP SMA CLA JMS I (PIPERR 6 JMP I INTEST SETCTC, 0 /MODIFY 07600 TO RETURN TO SQCTLC TAD CDIF10 CDF 0 DCA I SQ7600 TAD (5602 /JMP I .+1 DCA I (7601 TAD (SQCTLC DCA I (7602 CDIF10, CIF CDF 10 JMP I SETCTC OUK, 0 /V3 ON IMAGE MODE TRANSFER /CLOSE OUT FILE WITH = OPTION /IF NOT TOO SMALL TAD I (OUCCNT CLL CIA TAD I (MPARAM+3 SNL /IS = OPTION LARGER? SQ7600, 7600 /RETURN OUCCNT IF IT'S LARGER TAD I (OUCCNT /RETURN LOW ORDER = OPTION IF IT'S LARGER JMP I OUK PAGE NEWIN, TAD (MTEMP-1 DCA INSEG JMS I (CTCFLG CIF 0 JMS I (7607 0210 S7200, SQBUF2 INSEG, 0 JMP I (SQIDER DCA I (CTCFLG TAD I (SQBUF2+1 DCA INBLK TAD (SQBUF2+4 DCA INXR SGETIN, TAD I INXR SNA JMP SEMPTY DCA I OUTXR TAD OUTXR DCA OUSAVE JMS I (CYWAST /COPY WASTE WORDS TAD I INXR DCA RECCNT TAD RECCNT SNA JMP SNULL CMA CLL /V3 TAD OUTBLK TAD OUDLEN SZL CLA JMP SNULER TAD RECCNT DCA I OUTXR CLA CMA TAD I (SQBUF1 DCA I (SQBUF1 TAD INBLK CIA TAD OUTBLK SNA CLA TAD SAME SNA CLA MOVFIL, JMS I (SQTRA /MOVE THE FILE DOWN TAD RECCNT CIA TAD OUTBLK DCA OUTBLK TAD RECCNT DMTX, CIA TAD INBLK DCA INBLK TAD OUTXR CIA TAD OUWAST TAD OUWAST TAD (SQBUF1+365 SMA CLA /DO WE HAVE ROOM FOR TWO MORE ENTRIES? JMP NEXTIN /DIRECTORY SEGMENT OVERFLOW ON OUTPUT... ISZ I (OUTSEG TAD I (OUTSEG IAC DCA I (SQBUF1+2 /STORE LINK TO NEXT SEGMENT TAD I (SQBUF1+2 TAD (-7 SMA CLA JMP I (SQIDER-1 /TOO MANY SEGMENTS JMS I (OUTDIR /OUTPUT THIS SEGMENT NEWOUT, TAD (SQBUF1-1 DCA OUTXR /INITIALIZE XR FOR NEXT OUTPUT SEGMENT DCA I (OUTINH /ZAP ANY OLD OUTPUT INHIBIT FLAG DCA I OUTXR TAD OUTBLK DCA I OUTXR DCA I OUTXR DCA I OUTXR TAD OUWAST DCA I OUTXR NEXTIN, ISZ I S7200 JMP SGETIN TAD I (SQBUF2+2 SNA /ANY MORE INPUT SEGMENTS? JMP I (SQOVER JMP NEWIN SNULER, TAD (NOROOM JMS I (ERPRNT SNULL, CLA CMA TAD OUSAVE DCA OUTXR JMP DMTX-1 SEMPTY, TAD I INXR JMP DMTX OUSAVE, 0 SURE, TEXT /ARE YOU SURE?/ SETSAM, 0 TAD IHNDLR CIA TAD OHNDLR SNA CLA IAC DCA SAME JMP I SETSAM PAGE SQOVER, DCA I OUTXR TAD OUDLEN TAD OUTBLK SNA JMP CKZERO DCA I OUTXR CLA CMA TAD I (SQBUF1 DCA I (SQBUF1 CKZERO, TAD I (SQBUF1 SZA CLA JMP ZEROK CLA CLL CML RAR JMS OUTDIR /READ IN LAST DIRECTORY DCA I (SQBUF1+2 /ZERO OUT LINK WORD SKP ZEROK, ISZ OUTSEG JMS OUTDIR ZEROKS, JMS SRSTOR JMP I (PIP DCA I (SQBUF1+2 SQIDER, JMS OUTDIR JMS SRSTOR JMS I (PIPERR 12 OUTDIR, 0 TAD (4210 DCA .+4 JMS CTCFLG CIF 0 JMS I OHNDLR 0 SQBUF1 OUTSEG, 0 JMP SQIDER+1 DCA CTCFLG JMP I OUTDIR SQIOER, TAD (IOMSG JMS I (ERPRNT JMP I (SLGRET SQCTLC, KCC /JUMPED TO BY CODE AT 07600 JMS I (TSTSAM /TEST IF OPERATION IS TO ITSELF TAD (CTCMSG JMS I (ERPRNT TAD CTCFLG SZA CLA JMP I CTCFLG TAD I (MPARAM+1 /IS IT /S? AND (40 SNA CLA JMP I (SYSCPY /NO../Y JMP I (MOVFIL SRSTOR, 0 JMS I (7700 /MAKE SURE MONITOR IS IN CORE 10 DCA .-2 /AND WIPE THE CALL AWAY TAD (4207 CDF 0 DCA I (7600 TAD (5000 DCA I (7601 DCA I (7602 CDF 10 JMP I SRSTOR CTCFLG, 0 JMP I CTCFLG CTCMSG, TEXT /SORRY - NO INTERRUPTIONS/ IOMSG, TEXT /I-O ERROR IN ^ - CONTINUING/ NOROOM, TEXT /NO ROOM IN ^ - CONTINUING/ PAGE K7760, 7760 SYSCOP, TAD K7622 /SET INFPTR IN CASE OF /Y ERROR DCA INFPTR /WILL FILE #1 JMS I (SETCTC /KLUDGE UP 07600 SYSCPY, TAD (INDEVH+1 DCA YIHAND /SET TO ASSIGN INPUT HANDLER TAD (OUDEVH+1 DCA YOHAND TAD (2000 DCA K2000 /THIS MAY GET CLOBBERED READING IN DIRECT. IAC /V12B DCA OFSET TAD I K7617 SNA CLA /IS THERE AN INPUT DEVICE? ISZ I K7617 /MAKE INPUT =SYS JMS I (INTEST /SEE IF OPERATIONS ARE TO SAME DEVICE TAD I K7617 JMS I K200 /ASSIGN HANDLER 1 YIHAND, 0 K7622, 7622 /THINLY DISGUISED HALT TAD I K7617 K200, AND K7760 /CHECK INPUT FILE LENGTH SNA /IF BLANK,INPUT SYSTEM HEAD JMP YSOUT TAD (-6340 /CHECK FOR PROPER LENGTH SZA CLA JMP PER13 /ERROR..NOT SYSTEM HEAD TAD I (7601 /IS THERE OUTPUT DEVICE? SZA CLA /IF YES..WE CAN DO IMAGE XFER JMP I (IMGTST TAD I (7620 YOUSYS, DCA YINREC /PICK UP STARTING RECORD CIF 0 JMS I YIHAND /READ IN FIRST INPUT RECORDS K2000, 2000 /(0-15 IF SYSTEM HEAD,0-7 IF FILE) OUBUF YINREC, 0 JMP I (PER4 /INPUT ERROR TAD I (7620 /IF INPUT FROM A FILE, OPEN SNA CLA /TEST LOC 605 TAD (3000 /IF FROM HEAD, TEST 3605 TAD (605 DCA I (HDTST JMS I (TSTHED /TEST FOR VALID SYSTEM HEAD TAD YINREC TAD OFSET /BUMP TO NEXT RECORD DCA NXTRD TAD I (7600 /IF NO OUTPUT, FORGET IT SNA JMP PIPCLR /RESET AND GO TO PIP JMS I K200 1 YOHAND, 0 HLT /V3 JMS I (FAKE JMS I (SETSAM JMS I (TSTIO /TEST OUTPUT. SEE IF DIRECT. DEV. CIF 0 JMS I YOHAND /READ OUTPUT DIRECTORY INTO PLACE 1400 400 1 JMP I (PER4 CDF 0 TAD I (401 /NOW TEST FOR VALID OUTPUT DEVICE CDF 10 TAD (-10 /IF LESS THAN 10, DON'T XFER SPA CLA JMS I (PIPERR 11 TAD (-10 /V12B DCA YINREC /XFER COUNTER JMP YDUMP YLOOP, CIF 0 JMS I YIHAND /READ NEXT K3400, 1600 /V12B 7 BLOCKS OUBUF NXTRD, 0 JMP I (PER4 TAD NXTRD TAD (7 /V12B DCA NXTRD YDUMP, TAD (5600 /V12B JMS I (OUTDMP /WRITE BUFFER JMP I (AOUERR ISZ YINREC /DONE YET? JMP YLOOP /NOT YET..LOOP PIPCLR, JMS I (SRSTOR /CLEAR OUT 07600 JMP I (PIP YSOUT, TAD I (7601 /HERE IF INPUT FROM SYSTEM HEAD SZA CLA /IS THERE AN OUTPUT FILE? JMP I (YTSOUT /YES, SET UP FOR IMAGE MODE YNOOUT, TAD (7 /AND RESTART READ AT RECORD 16 DCA OFSET JMP YOUSYS OFSET, 0 PER13, JMS I (PIPERR 13 K7617, 7617 /V3 PAGE DIRECT, -1 DFORG, 0 /FILE STORAGE 0 0 DWASTE, 0 /#WASTE WORDS 0 DLENGT, 0 MOVE, 0 IMGTST, DCA SAME /V12B TAD I (YIHAND /V12B DCA IHNDLR /V12B JMP I (IMAGE /V12B TAD (6777 MOVE1, DCA TSTSAM CDF 0 TAD I MWAST DCA I TSTSAM CMA TAD MWAST DCA MWAST CMA TAD TSTSAM ISZ TEMP JMP MOVE1 CLA CDF 10 JMP I MOVE ERR11, TEXT /BAD SYSTEM HEAD/ YTSOUT, TAD I (7617 /O.K. SETUP CD AREA FOR IMAGE XFER TAD (7760 /FROM SYSTEM AREA OF INPUT DEVICE DCA I (7617 TAD I (7617 AND (17 TAD (6360 DCA I (7621 TAD K7 DCA I (7622 DCA SAME /ALLOW ^C IF TO OUTPUT FILE TAD I (YIHAND /TEST FOT VALID SYSTEM DCA IHNDLR CIF 0 JMS I IHNDLR 0200 3400 K7, 7 JMP I (PER4 JMS I (TSTHED JMP I (IMAGE TSTSAM, 0 TAD SAME /IF /Y IS TO SAME DEVICE AS INPUT (SYS) SNA CLA /^C GIVES MESSAGE AND RETRIES OPERATION JMP I (ZEROKS JMP I TSTSAM ERR2, TEXT /OUTPUT ERROR/ SQFILE, DCA MWAST TAD I (OUSAVE DCA TSTSAM /IF ERROR DURING /S DCA DWASTE CLA CLL CMA RTL DCA MOVE /-3 FOR FILE NAME SQFIL3, TAD I TSTSAM /FIRST 2 CHARS. IN NAME CLL RTR RTR RTR SQFIL5, AND (77 SZA /IF ZERO, DON'T BOTHER JMS I (CHPRNT ISZ DWASTE /RIGHT HALF OR NEW WORD? JMP SQFIL4 /RIGHT HALF ISZ TSTSAM ISZ MOVE /EXHAUSTED ALL? JMP SQFIL3 /NOPE TAD MWAST /DONE WITH IT YET? SZA CLA JMP I (FILENR-1 /YES TAD I TSTSAM /IS THERE AN EXTENSION? SNA CLA JMP I (FILENR-1 /NO..CONTINUE ORIGINAL MSG TAD (256 JMS I (TTYOUT ISZ MWAST /SIGNAL END CLA CMA JMP SQFIL3-1 SQFIL4, CLA CMA DCA DWASTE TAD I TSTSAM /GET RIGHT HALF JMP SQFIL5 MWAST, 0 DCA TEMP TAD I INXR DCA I OUTXR /ROUTINE TO COPY WASTE WORDS ISZ TEMP JMP .-3 JMP I MWAST PAGE FAKE, 0 TAD I (YIHAND DCA IHNDLR TAD I (YOHAND DCA OHNDLR DCA I (OUCCNT DCA I (OUBLK DCA I (OUELEN TAD I (YOHAND DCA I (OUHNDL JMP I FAKE CYWAST, 0 /ROUTINE TO COPY WASTE WORDS CLA CLL CMA RTL /THREE MORE FOR FILE NAME JMS I (MWAST /COPY THEM TAD I (SQBUF2+4 /NOW ADJUST I/O WASTE WORDS CIA TAD OUWAST /DIFF. BETWEEN OUT AND IN WORDS SMA /IF <0, MORE OUT THAN IN JMP CGEWST /POS. MORE IN THAN OUT (OR SAME) DCA TEMP1 TAD I (SQBUF2+4 SZA JMS I (MWAST /COPY ALL INPUT WORDS DCA I OUTXR /AND 0 ALL EXTRA OUTPUT WORDS ISZ TEMP1 JMP .-2 JMP I CYWAST CGEWST, DCA TEMP1 TAD OUWAST /XFER ONLY ENOUGH OUTPUT WDS. SZA JMS I (MWAST TAD INXR TAD TEMP1 /POINT INPUT TO NEXT FILE DCA INXR JMP I CYWAST TSTHED, 0 /TESTS FOR KEYBOARD MONITOR CDF 0 TAD I HDTST /V12C CDF 10 TAD (-7200 SZA CLA JMP I (PER13 /IF NOT CLA, NOT VALID JMP I TSTHED HDTST, 3605 TSTIO, 0 /SEE IF OUTPUT IS DIRECTORY DEVICE JMS I (OTYPE /GET DCB WORD FOR OUTPUT SMA CLA /IF NOT NEG., NOT DIRECT DEVICE JMS I (PIPERR 5 TAD OHNDLR /IF OUTPUT=SYS, SET NO INTERRUPT TAD (171 SNA CLA ISZ SAME JMP I TSTIO ASCI2, 0 /SEE IF VALID ASCII OUTPUT DCA TSTIO TAD I (7600 SNA CLA JMP I (PIP /NO..BACK TO PIP TAD TSTIO /SEE IF /C IS ON SNA CLA JMS I (FIXLEN /NO..TRY TO ESTIMATE OUTPUT JMP I ASCI2 SQDTST, 0 /ROUTINE TO CHECK /S DIRECTORIES DCA NOHND /PRESERVE POSSIBLE SYS ON OUTPUT TAD (7 /DEFAULT TO BLOCK 7 DCA OUTBLK /INITIAL GUESS CDF 10 /NOW TRY TO READ DIRECTORY OF OUTPUT JMS I (OTYPE /IF NON-FILE, DON'T READ IT SMA CLA JMP P1A CIF 0 /COULD BE NON-FILE, HOWEVER. JMS I NOHND 0210 1400 P1, 1 JMP I (SQIDER+1 /ERROR IN READ P1A, DCA OLDDIR /WIPES ANY DIRECT. SEGMENT TAD I (1401 TAD (-70 /IS OUTPUT A SYS DEVICE? SNA CLA JMP SYSDIR /YES. TAD NOHND /IS OUTPUT THE SYSTEM DEVICE? TAD (171 SZA CLA JMP .+3 SYSDIR, TAD (70 DCA OUTBLK JMP I SQDTST NOHND=FAKE SYSZRO, TEXT /ZERO SYS?/ AOUERR, SMA CLA /WAS IT A DEVICE ERROR OR ARE WE OUT OF SPACE? JMP BOUERR /OUT OF SPACE PER2, JMS I (PIPERR 2 BOUERR, JMS I (PIPERR 0 ASCPTCH,TAD (ACHLP+1 /V3C FAKE OUT ICHAR DCA I (ICHAR /SIMULATE CALL TO ICHAR FROM 'ACHLP' JMP I (GETNEW /V3C SIMULATE OCCURRENCE OF 8-BIT ^Z IN ICHAR PAGE /THIS IS ONCE-ONLY CODE ONCE, 0 STA TAD ONCE DCA ONCENF TAD (20 DCA I ONCENF /RESTORE L20, DON'T ALLOW REENTRY TAD I (MPARAM+1 AND (7 SNA CLA /IS /V SET? JMP I ONCE /NO, RETURN TAD (VER /YES JMS I (ERPRNT /PRINT VERSION NUMBER JMP I ONCE /RETURN VER, TEXT \OS/8 PIP V14A\ ONCENF, 0 GETEQ, 0 /V3 TAD I (MPARAM+3 SNA IAC AND (77 /CONVERT 0 TO 1 AND 100 TO 0 CIA JMP I GETEQ DVREDE, 0 /READ DEVICE WITH BAD BLOCK REFERENCED TAD I (OZHNDL /GET DEVICE ENTRY POINT DCA NEWHL CIF 0 JMS I NEWHL /DO THE READ 0011 0 -111 /NEGATIVE BLOCK - RETURNS MINUS LENGTH CIF 10 JMP I DVREDE /ERROR RETURN FOR READ YIELDS DESIRED RESULTS NEWHL, 0 PAGE $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 | /2 OS8 PIP10 - PDP-10 CONVERSION PROGRAM V3A / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / DTRB=6772 DTLB=6774 DTXA=6764 DTCA=6762 DTRA=6761 DTSF=6771 /WRITTEN BY MARK BRAMHALL 1970 /MODIFIED FOR TD8E BY R. LARY 1973 /DATE 75 PATCH ADDED BY S.R. AFTER 1/5/75 / / 12-DEC-2018 LHN - added DSN date patch 21.24.1 M dated / June-July 1979 (not the one dated / Dec 78/Jan 79) / /PIP10 IS A PIP FOR OS8 THAT HANDLES PDP-10 DECTAPES / /COMMAND DECODER RULES: / /*OUTPUT_INPUT,INPUT,... / /OUTPUT IS: / DEV:FILE.EXT[NN] / DEFAULT DEVICE IS DSK: / [NN] IGNORED IF PDP-10 OUTPUT / IF /L OR /F DEFAULT OUTPUT IS TTY: / /INPUT IS: / DEV:FILE.EXT / DEFAULT DEVICE IS DSK: / FOLLOWING DEFAULT DEVICES ARE THE PRECEEDING DEVICE / UP TO NINE (9) INPUT FILES / /OPTIONS ARE: / /L IS LIST DIRECTORY (ONLY VALID IF PDP-10 INPUT) / /F IS SHORT FORM DIRECTORY (ONLY PDP-10 INPUT) / /Z IS ZERO DIRECTORY BEFORE TRANSFER (ONLY IF PDP-10 OUTPUT) / /D IS DELETE OLD OUTPUT FILE BEFORE TRANSFER / /B IS BINARY MODE TRANSFER (I.E. 8 BITS PER 36 BITS) / /I IS IMAGE MODE TRANSFER (I.E. 3 12 BITS PER 36 BITS) / /P IS PRESERVE LINE NUMBERS (DEFAULT IS TO DELETE THEM) / MAINTENACE RELEASE FIXES: /1. DATE 75 STUFF /2. TD8E RELIABILITY IMPROVEMENTS /3. ANSI DATE OUTPUT FORMAT /4. INCORPORATED PATCH BY DAVID HEMBLEN [UNITED AIRCRAFT / RESEARCH LABORATORIES] TO ALLOW WRITING PDP-6 / DECTAPES ON A TD8E. /COMMAND DECODER SETS UP: / /AT "MOUTPU" THE LIST-- / LLL LLL LLD DDD OR UUU 100 000 000 / NAME (TRIMMED) NAME (EXCESS 40) / NAME NAME / NAME NAME / EXTENSION EXTENSION / 0 EXTENSION / / OS8 FILE OR PDP-10 FILE / /WHERE L IS LENGTH (8 BITS), D IS DEVICE (4 BITS), U IS UNIT (3 BITS) / /AT "MINPUT" THE LIST-- / LLL LLL LLD DDD OR UUU 100 000 000 / START BLOCK ANY BLOCK / / OS8 FILE OR PDP-10 FILE / /THE LIST ENDS WITH A ZERO (0) WORD / /AT "MPARAM" THE BLOCK-- / ABC DEF GHI JKL / MNO PQR STU VWX / YZ0 123 456 789 / /WHICH ARE THE OPTION CHARACTERS / /THE = CONSTRUCTION IS NOT IMPLEMENTED /DEFINITIONS VERSION= 3 /VERSION NUMBER SUBVER= 02 /PATCH LEVEL /LOCATED AT "VERLOC" AS 60+VERSION^100+SUBVER DIRECT=7000 /PDP-10 DIRECTORY BUFFER (FIELD 1) IBUF10=3000 /PDP-10 INPUT BUFFER (FIELD 1) INBUF=3000 /OS8 INPUT BUFFER (FIELD 1) OBUF10=5000 /PDP-10 OUTPUT BUFFER (FIELD 1) OUBUF=5000 /OS8 OUTPUT BUFFER (FIELD 1) OUDEVH=7200 /OUTPUT DEVICE (FIELD 0) INDEVH=6600 /INPUT DEVICE (FIELD 0) INCTL=1010 /INPUT CONTROL OUCTL=5010 /OUTPUT CONTROL INRECS=4 /INPUT RECORDS MDATE=7666 /MONITOR'S DATE (FIELD 1) MINPUT=7617 /INPUT LIST (FIELD 1) MOUTPU=7600 /OUTPUT LIST (FIELD 1) MPARAM=7643 /PARAMETER LIST (FIELD 1) JSBITS=7746 /0S8 JOB STATUS BITS DCB=7760 /DEVICE CONTROL BLOCK (FIELD 1) PTP=20 /DCB VALUE OF THE PAPER TAPE PUNCH /PAGE ZERO AND POINTERS *10 INDEX0, 0 /AUTO-INDEX REGISTERS INDEX1, 0 INDEX2, 0 INDEX3, 0 INDEX4, 0 INDEX5, 0 INDEX6, 0 IXR, 0 /INPUT LIST INDEX REGISTER *20 UNIT10, 0 /CURRENT PDP-10 UNIT (U400) POINT, 0 /GENERAL POINTER CNTR, 0 /GENERAL COUNTER TEMP1, 0 /TEMPORARIES TEMP2, 0 TEMP3, 0 TEMP4, 0 TEMP5, 0 TEMP6, 0 CHARNI, 0 /CHARACTER INPUT NUMBER CHARNO, 0 /CHARACTER OUTPUT NUMBER OUNIT, 0 /OUTPUT UNIT IUNIT, 0 /INPUT UNIT IBLOCK, 0 /INPUT BLOCK OBLOCK, 0 /OUTPUT BLOCK INPUT, 0 /INPUT ROUTINE POINTER OUTPUT, 0 /OUTPUT ROUTINE POINTER IPOINT, 0 /INPUT POINTER OPOINT, 0 /OUTPUT POINTER SAVELN, 0 /OPTION /P SWITCH MODE, 0 /OPTION /I AND /B SWITCH WORDS, 0 /WORDS LEFT COUNTER DATE, 0 /TODAY'S DATE FREEP, 0 /POINT TO FREE SPOT PRINT0, 0 /PRINT ROUTINE TEMPORARIES PRINT1, 0 PRINT2, 0 PRINT3, 0 PRINTC, 0 /240 FOR LEADING SPACES RBFLAG, 0 /RUBOUT FLAG CDDEVF, 0 /DEFAULT DEVICE NAME 0 CDNAME, 0 /FILE NAME 0 0 CDEXT, 0 /FILE EXTENSION 0 0 /FILLER WORD PERSW, 0 /PERIOD SWITCH DEVSW, 0 /DEVICE SWITCH CDDEV, 0 /DEVICE 0 INSEG, 0 /PDP-10 UNIT WITH DIRECTORY IN CORE PDP10D, ZBLOCK 10 /LIST OF KNOWN PDP-10 UNITS CDCNT, 0 /INPUT LIST COUNTER CDI04, 0 /POINTER SAVE XDSK, TEXT /DSK/ /DEFAULT DEVICE DSK: OCHARY, 0 /TEMPORARY DVTYPE, 0 /DEVICE TYPE HOLDER TDUNIT, 0 /0 OR 4000 TAPFUN, 0 /DECTAPE FUNCTION DATE75, 0 /1 MEANS HAD H.O. BIT ON XDATE, 0 /POINTS TO EXTRA DATE BIT HIDATE, 0 /HIGH-ORDER BIT OF TODAY'S DATE / KLUDGE FOR DATE-75 BUG: / ONLY CONSIDER 1 MORE BIT OF PRECISION / INSTEAD OF ALL 3 EXTRA BITS / SINCE OS/8 DATE WILL RUN OUT BEFORE / THAT FAILS PAGE JMP I (PIP10 /NORMAL ENTRY JMS ERROR /PIP10 CANNOT BE CHAINED TO ERMES0-1 /ERROR ROUTINES IOERR, JMS ERROR /I/O ERROR ERMES1-1 NOROOM, JMS ERROR /NO ROOM IN TAPE OR DIRECTORY ERMES2-1 NOOFIL, JMS ERROR /NO SUCH DEVICE ERMES3-1 FNOTFD, JMS ERROR /FILE NOT FOUND ERMES9-1 NOT10F, JMS ERROR /NOT A PDP-10 FILE ERMES4-1 ERDELF, JMS ERROR /ERROR DELETING A FILE ERMES5-1 NOTPSF, JMS ERROR /NOT A OS8 FILE ERMES6-1 NOOOFL, JMS ERROR /ERROR OPENING THE OUTPUT FILE ERMES7-1 SYNTAX, JMS ERROR /SYNTAX ERROR ERMES8-1 ERROR, 0 /ERROR ROUTINE CLA CDF TAD I ERROR DCA INDEX0 /POINT TO MESSAG-1 TAD (ERROR3 DCA OUTPUT /SET TTY: OUTPUT JMS ERROR4 /PRINT THE STRING JMP I (PIPCD /AND BACK TO NORMAL ERROR4, 0 /PRINT THE STRING POINTED BY INDEX0 TAD I INDEX0 DCA TEMP1 /SAVE WORD TAD TEMP1 RTR RTR RTR JMS ERROR2 /BREAK IT DOWN TAD TEMP1 JMS ERROR2 JMP ERROR4+1 /LOOP ERROR2, 0 AND [77 /USE 6 BITS SNA JMP I ERROR4 /END DCA TEMP2 TAD TEMP2 AND (40 SNA CLA TAD (100 TAD [200 /MAKE A CHAR TAD TEMP2 TAD (-337 /_ IS SPECIAL SNA TAD (215-337 TAD (337 JMS ERROR7 /PUT IT JMP I ERROR2 ERROR7, 0 DCA TEMP2 TAD TEMP2 JMS I OUTPUT TAD TEMP2 TAD (-215 SZA CLA JMP I ERROR7 TAD (212 JMP ERROR7+1 ERROR3, 0 TLS TSF JMP .-1 CLA JMP I ERROR3 /PRINT ROUTINE PRINT, 0 DCA PRINT0 PRINT7, DCA PRINTC /SET SWITCH TAD (PRINTL DCA PRINT1 CLL CLA CMA RTL DCA PRINT3 PRINT4, DCA PRINT2 JMP .+3 DCA PRINT0 ISZ PRINT2 TAD PRINT0 TAD I PRINT1 SMA JMP .-5 CLA ISZ PRINT1 TAD PRINT2 SZA JMP PRINT5 /IT IS NON-ZERO TAD PRINTC SZA JMS I OUTPUT /PRINT LEADING SPACE IF DESIRED JMP PRINT6 PRINT5, TAD ("0 JMS I OUTPUT CLL CLA CML RAR PRINT6, ISZ PRINT3 JMP PRINT4 TAD PRINT0 TAD ("0 JMS I OUTPUT JMP I PRINT PAGE /PDP-10 DECTAPE SERVICE ROUTINE / /CALL: / JMS READT /READ PDP-10 DECTAPE / BUFFER /BUFFER ADDRESS - FIELD 1 / BLOCK /BLOCK NUMBER / / JMS WRITET /WRITE PDP-10 DECTAPE / BUFFER /BUFFER ADDRESS - FIELD 1 / BLOCK /BLOCK NUMBER / /THE UNIT IS IN "UNIT10" TCON2, 2 /MUST BE AT BEGINNING OF PAGE! WRITET, 0 /WRITE PDP-10 DECTAPE CDF /BE SURE OF FIELD 0 TAD WRITET STL JMS I (TDIOCK /CHECK FOR TD IO TAD I WRITET /GET BUFFER ADDRESS DCA TBUF /AND SAVE IT JMS RWTEST /TEST DIRECTION WRITE2, JMS I (FLIP /REVERSE - FLIP BUFFER NOW TAD (50 WRITE1, DCA TAPFUN /SET FUNCTION (30=READ, 50=WRITE) DTLB /SEARCH INTO FIELD 0 TAD (TBLK DCA I TCA /TAPE BLOCK INTO "TBLK" TERR, RTL /ERROR BIT IS 0 INITIALLY RAL /SHIFT END ZONE BIT INTO LINK CML CLA /CLEAR REST OF THE JUNK TAD [200 /'GO' BIT TSTART, SNL /SKIP IF NO REVERSE DIRECTION TAD [400 /'REVERSE' BIT DTXA /START DRIVE GOING TLOOP, JMS I (DTWAIT TOUT, SPA /ERROR? JMP TERR /YES - CHECK IT DTRA /CHECK DIRECTION RTL RTL /DIRECTION BIT INTO LINK TMOD1, SZL CLA /'SNL CLA' IF REVERSE MODE TMOD4, TAD TCON2 /'CLL CLA CMA RAL' IF REVERSE MODE TAD TBLK /GET BLOCK FOUND CMA TAD I WRITET /GET BLOCK DESIRED CMA SZA CLA /SKIP IF FOUND THE BLOCK JMP TSTART /NOT FOUND - GO AGAIN TMOD2, SZL CLA /'SNL CLA' IF REVERSE MODE JMP TSTART+1 /FOUND BUT WRONG DIRECTION - REVERSE IT CLA CMA TAD TBUF /GET BUFFER ADDRESS-1 DCA I TCA /SET ADDRESS TAD (10 DTLB /SET FIELD 1 BUFFER TAD TAPFUN DTXA /SET READ OR WRITE TAD TM600 DCA I TWC /SET WORD COUNT OF 600 OCTAL WORDS DTSF /FLAG? JMP .-1 /NO - WAIT DTRB /CHECK FOR ERRORS SPA CLA JMP I (IOERR /ERROR!! TAD [200 DTXA /STOP THE DRIVE TMOD3, JMS I (FLIP /POSSIBLE FLIP AFTER READ ISZ WRITET JMP I WRITET /EXIT TCA, 7755 /DECTAPE CURRENT ADDRESS TWC, 7754 /DECTAPE WORD COUNT TBLK, 0 /SET TO BLOCK FOUND IN SEARCH TBUF, 0 /HOLDS BUFFER ADDRESS /READ ENTRY POINT READT, 0 /PDP-10 DECTAPE READ CDF /INSURE FIELD 0 TAD READT CLL JMS I (TDIOCK /CHECK FOR TD IO TAD I READT /GET BUFFER ADDRESS DCA TBUF /AND SAVE IT TAD READT DCA WRITET /MOVE RETURN ADDRESS JMS RWTEST /CHECK DIRECTION NOP /NO INITIAL FLIP IF REVERSE TAD (30 /READ FUNCTION JMP WRITE1 /GO DO REST OF THE ROUTINE RWTEST, 0 /CHECK DIRECTION TO READ/WRITE AND SEARCH ISZ WRITET JMS I (GOLDBK /GET OLD BLOCK NUMBER (NEGATIVE) TAD I WRITET /GET DESIRED BLOCK DCA TBLK /SAVE FOR FUTURE USE SZL CLA TAD (10 /FORWARD - SZL CLA TAD TMOD6 /REVERSE - SNL CLA DCA TMOD1 /SET UP FOR DIRECTION TAD TMOD1 DCA TMOD2 SNL CLA TAD WRITE2 /REVERSE - FLIP BUFFER AFTER DCA TMOD3 /FORWARD - NO BUFFER FLIP TMOD6, SNL CLA TAD (7344-1200 /REVERSE - CLL CLA CMA RAL TAD TMOD5 /FORWARD - TAD TCON2 DCA TMOD4 /X0002 OR 17776 SZL CLA ISZ RWTEST /FORWARD - 2ND EXIT IAC SNL CIA /REVERSE DIRECTION TAD I WRITET SPA TM600, CLA /NO LOWER THAN 0 DCA I TAPFUN /SET NEW LAST SERVICED BLOCK TAD TBLK /REMEMBER SAVING THIS? CLL SMA SZA /<0 AND 0 SKIP AND HAVE LINK=0 CLL CML CIA />0 BECOMES <0 AND HAS LINK=1 TMOD5, TAD TCON2 CLA RTR /LINK HAS SEARCH DIRECTION RTR TAD (10 /ADD 'SEARCH' BIT DTCA DTXA /LOAD SEARCH AND DIRECTION TAD UNIT10 /GET UNIT DTXA /ADD UNIT (ALSO FLIPS DIRECTION) JMP I RWTEST /EXIT PAGE /"OLDTBL" IS LIST OF LAST SERVICED BLOCKS OLDTBL, 0;0;0;0;0;0;0;0 /FLIP THE BUFFER ROUTINE FLIP, 0 /FLIP A 600 WORD BUFFER (FIELD 1) TAD I (TBUF /BUFFER START DCA FLIP1 /SET START TAD (577 TAD I (TBUF DCA FLIP2 /SET END (END=START+577) TAD (-300 DCA FLIP3 /SET COUNT (600/2=300) CDF 10 /BUFFER IS IN FIELD 1 FLIP6, TAD I FLIP1 /GET START JMS FLIP4 /FLIP IT DCA FLIP5 /SAVE TEMPORARILY TAD I FLIP2 /GET END JMS FLIP4 /FLIP IT DCA I FLIP1 /PUT END INTO START TAD FLIP5 DCA I FLIP2 /PUT START INTO END ISZ FLIP1 /BUMP POINTERS CLA CMA TAD FLIP2 DCA FLIP2 ISZ FLIP3 /DONE? JMP FLIP6 /NO - LOOP CDF /BACK TO FIELD 0 JMP I FLIP /EXIT FLIP1, 0 /START POINTER FLIP2, 0 /END POINTER FLIP3, 0 /COUNTER FLIP5, 0 /TEMPORARY FLIP7, 0 /FLIPPING TEMPORARIES FLIP8, 0 /" " FLIP4, 0 /FLIP A CELL DCA FLIP7 /SAVE IT TAD FLIP7 RTL RTL AND (7 /GET ...1 DCA FLIP8 /ACCUMULATE RESULT TAD FLIP7 RTR RAR AND (70 /GET ..2. TAD FLIP8 DCA FLIP8 /BUILD RESULT TAD FLIP7 AND (70 CLL RTL RAL /GET .3.. TAD FLIP8 DCA FLIP8 /BUILD RESULT TAD FLIP7 AND (7 CLL RTR RTR /GET 4... TAD FLIP8 CMA /GET NOT 4321 JMP I FLIP4 /EXIT /TD8E I/O ROUTINE - CALLS STANDARD ROUTINE TDIOCK, 0 DCA TDRET /SAVE RETURN ADDR RAR DCA TDFUN /SAVE READ/WRITE JMS I (GET10D /GET TYPE OF DECTAPE TAD (-2 SZA CLA JMP I TDIOCK /TC08 - CONTINUE TAD I TDRET DCA TDBUF /SAVE BUF ADDR ISZ TDRET JMS GOLDBK /GET OLD BLOCK # TAD I TDRET CLA RAL /GET DIRECTION TAD (110 /ONE BLOCK, FIELD 1 TAD TDFUN DCA TDFUN /SAVE FINAL FUNCTION WORD JMS I (TDUSET /SET UP HANDLER TAD TDUNIT SPA CLA TAD (DTA1-DTA0 TAD (DTA0 DCA TDIOCK /SET UP HANDLER ENTRY PTR TAD I TDRET DCA I TAPFUN TAD I TAPFUN DCA TDBLK JMS I TDIOCK TDFUN, 0 TDBUF, 0 TDBLK, 0 JMP I (IOERR ISZ TDRET JMP I TDRET TDRET, 0 GOLDBK, 0 TAD UNIT10 /GET THE UNIT WE NEED CLL RTL RTL /SHIFT INTO BITS 9-11 TAD (OLDTBL DCA TAPFUN /POINT TO THIS UNIT'S POSITION TAD I TAPFUN /GET LAST SERVICED BLOCK CLL CIA JMP I GOLDBK PAGE /GET A LINE ROUTINE GLINE, 0 /GET A LINE TAD ["* JMS I [ERROR3 /ANNOUNCE US WITH A * DCA RBFLAG /RESET RUBOUT FLAG TAD [LINBUF-1 DCA IXR /POINT TO THE BUFFER CHLOOP, KSF JMP CHLOOP /WAIT FOR TTY: TAD [200 KRS /READ TTY: DCA TEMP1 KCC TAD [SPADR-1 DCA INDEX0 /SET LIST SEARCH TAD I INDEX0 SNA JMP .+6 /END OF LIST TAD TEMP1 SNA CLA JMP I INDEX0 /FOUND SO JUMP ISZ INDEX0 JMP .-7 /LOOP JMS PRNT /PRINT IT CINSRT, TAD TEMP1 DCA I IXR /STORE THE CHARACTER TAD IXR TAD (-LINBUF-100 SZA CLA JMP CHLOOP /GET ANOTHER CHARACTER JMS CRCR JMP I (SYNTAX /ERROR CARRET, JMS CRCR CLFINI, DCA I IXR /SET END DCA I IXR JMP I GLINE /EXIT SPADR, -225;JMP CTRLU -215;JMP CARRET -377;JMP RUBOUT -375;JMP ALTMOD -376;JMP ALTMOD -233;JMP ALTMOD -200;JMP CHLOOP -217;JMP CHLOOP -337;JMP BAKARR -212;JMP LFEED -203;JMP CTRLC 0 BAKARR, JMS PRNT /"_" TAD ["< JMP CINSRT+1 /USE "<" INSTEAD CTRLC, CTRLU, TAD ["^ JMS I [ERROR3 /CONTROL CHARACTERS TAD TEMP1 TAD [100 CLRLIN, JMS I [ERROR3 JMS CRCR TAD I INDEX0 SZA CLA JMP GLINE+1 /NOT "^C" TSF JMP .-1 JMP I (7605 /TO MONITOR CRCR, 0 TAD [215 DCA TEMP1 JMS PRNT TAD [212 JMS I [ERROR3 /PRINT CR-LF JMP I CRCR ALTMOD, TAD ["$ DCA TEMP1 /ALTMODE IS "$" JMS PRNT JMP CLFINI /ENDS THE LINE RUBOUT, TAD IXR TAD (1-LINBUF SNA CLA JMP RBSPCL /SPECIAL TREATMENT TAD ("\ ISZ RBFLAG JMS I [ERROR3 /PRINT \ CLA CMA DCA RBFLAG /SET FLAG TAD IXR DCA TEMP2 TAD I TEMP2 JMS I [ERROR3 /PRINT RUBED CHAR LBCKUP, CLA CMA TAD IXR JMP CHLOOP-1 /GO GET ANOTHER RBSPCL, ISZ RBFLAG JMP CLRLIN+1 /NOT INTO RUBOUTS TAD ("\ JMP CLRLIN PRNT, 0 ISZ RBFLAG JMP .+3 TAD ("\ JMS I [ERROR3 /END OF RUBOUTS DCA RBFLAG TAD TEMP1 JMS I [ERROR3 /PRINT CHAR JMP I PRNT LFEED, JMS CRCR DCA I IXR /SET END TAD [LINBUF-1 DCA IXR TAD ["* JMS I [ERROR3 TAD I IXR /PRINT THE LINE SNA JMP LBCKUP JMP .-4 PAGE /FIND A SLOT ROUTINE /SLOT NUMBERS BETWEEN 0 AND 1101 /RETURN WITH A 5 BIT NUMBER (1 TO 26 OCTAL) / /CALL: / JMS FINDSL /FIND A SLOT / SLOT# /SLOT NUMBER / (AC) /VALUE OF SLOT RETURNED / /SLOT NUMBER OF 0 RETURNS 7777 FINDSL, 0 /FIND A SLOT CLA CMA TAD I FINDSL /GET SLOT NUMBER-1 ISZ FINDSL SPA /WAS IT 0? JMP FINDSA /YES JMS DIV7 /NO - DIVIDE BY 7 TAD (JMP I FINDS0+7 DCA DIV1 /USE REMAINDER FOR JUMPING CDF 10 /BUFFER IS IN FIELD 1 DIV1, HLT /TEMPORARY AND JUMP CELL FINDSA, CLA CMA JMP I FINDSL /EXIT WITH 7777 FOR SLOT NUMBER 0 FINDS0, FINDS1 /JUMP TABLE FINDS2 FINDS3 FINDS4 FINDS5 FINDS6 FINDS7 /DIVIDE BY 7 ROUTINE DIV7, 0 /DIVIDE BY 7 DCA DIV1 /SAVE IT TAD (DIRECT DCA POINT /POINT TO DIRECTORY TAD DIV1 DIV3, TAD (-7 /SUBTRACT 7'S SPA JMP I DIV7 /EXIT WITH REMAINDER ISZ POINT /BUMP POINTER BY 3 ISZ POINT ISZ POINT JMP DIV3 /AND LOOP /FIND SLOT ROUTINE #1 /USE WORD 1 BITS 0-4 FINDS1, TAD I POINT /GET CELL RTL RTL RTL /GET FIRST 5 BITS FINDS8, AND [37 /ONLY 5 BITS CDF /BACK TO FIELD 0 JMP I FINDSL /AND EXIT WITH VALUE IN AC /FIND SLOT ROUTINE #2 /USE WORD 1 BITS 5-9 FINDS2, TAD I POINT RTR /USE BITS 5-9 JMP FINDS8 /FIND SLOT ROUTINE #3 /USE WORD 1 BITS 10-11 AND WORD 2 BITS 0-2 FINDS3, TAD I POINT AND [3 /USE BITS 10-11 OF 1ST WORD CLL RTL RAL /SHIFT TO BITS 7-8 DCA DIV1 /SAVE IT ISZ POINT /NEXT WORD TAD I POINT CLL RTL FINDS9, RTL /GET INTO BITS 8-11 AND [17 /GET ONLY BITS 8-11 TAD DIV1 /ADD OTHER BITS JMP FINDS8 /FIND SLOT ROUTINE #4 /USE WORD 2 BITS 3-7 FINDS4, ISZ POINT /USE 2ND WORD TAD I POINT RTR /USE BITS 3-7 JMP FINDS2+1 /FIND SLOT ROUTINE #5 /USE WORD 2 BITS 8-11 AND WORD 3 BIT 0 FINDS5, ISZ POINT /USE 2ND WORD TAD I POINT AND [17 CLL RAL /GET BITS 7-10 DCA DIV1 /AND SAVE THEM ISZ POINT /NEXT WORD CLL CLA CML RAR AND I POINT /GET BIT 0 JMP FINDS9 /FIND SLOT ROUTINE #6 /USE WORD 2 BITS 1-5 FINDS6, ISZ POINT ISZ POINT /USE 3RD WORD TAD I POINT RAL JMP FINDS1+1 /FIND SLOT ROUTINE #7 /USE WORD 3 BITS 6-10 FINDS7, ISZ POINT ISZ POINT /USE 3RD WORD TAD I POINT RAR /GET RID OF LAST BIT JMP FINDS8 /DELETE A PDP-10 ENTRY / /CALL: / (AC) /POINT TO NAME-1 (FIELD 1) / JMS DELETE /DELETE A PDP-10 ENTRY / -NO- /NOT FOUND / -OK- /ENTRY DELETED DELETE, 0 /DELETE A PDP-10 ENTRY JMS I (FIND /TRY TO FIND IT FIRST JMP I DELETE /NOT FOUND ISZ DELETE /FOUND - 2ND EXIT DCA DELET1 /SAVE SLOT NUMBER CLA IAC DCA DELET2 /START AT SLOT 1 TAD (-1101 DCA DELET3 /DO 1101 SLOTS JMS FINDSL /FIND A SLOT DELET2, 0 /SLOT NUMBER CIA TAD DELET1 /IS IT ONE OF OURS? SZA CLA JMP DELET4 /NO TAD DELET2 /YES DCA .+2 /SET SLOT NUMBER AGAIN JMS I (FILLSL /FILL WITH A 0 0 0 /FILL WITH A 0 DELET4, ISZ DELET2 /NEXT SLOT ISZ DELET3 /MORE? JMP DELET2-1 /YES - LOOP CDF 10 /DIRECTORY IS IN FIELD 1 DCA I INDEX0 /REMEMBER "FIND" SETTING THIS UP? DCA I INDEX0 /REMOVE THE FILE NAME DCA I INDEX0 TAD INDEX0 TAD [77 DCA INDEX0 /POINT TO EXTENSION DCA I INDEX0 DCA I INDEX0 /REMOVE EXTENSION DCA I INDEX0 CDF JMP I DELETE /EXIT DELET1, 0 /HOLDS FOUND SLOT NUMBER DELET3, 0 /COUNTER PAGE /FILL A SLOT ROUTINE / /CALL: / JMS FILLSL /FILL A SLOT / SLOT# /SLOT NUMBER / VALUE /VALUE TO FILL SLOT WITH / /SLOT NUMBER 0 IS ILLEGAL! FILLSL, 0 /FILL A SLOT ROUTINE CLA CMA TAD I FILLSL /GET SLOT NUMBER-1 ISZ FILLSL JMS I (DIV7 /DIVIDE BY 7 TAD (JMP I FILLS0+7 DCA FILLS9 /USE REMAINDER FOR JUMPING TAD I FILLSL /GET VALUE ISZ FILLSL AND [37 /5 BIT VALUE ONLY CDF 10 /DIRECTORY IS IN FIELD 1 FILLS9, HLT /TEMPORARY AND JUMP CELL /JUMP TABLE FILLS0, FILLS1 FILLS2 FILLS3 FILLS4 FILLS5 FILLS6 FILLS7 FILLSA, 0 /TEMPORARY /FILL SLOT ROUTINE #1 /BITS 0-4 OF WORD 1 FILLS1, CLL RTR RTR /VALUE INTO BITS 0-4 RTR DCA FILLS9 /SAVE VALUE TAD I POINT AND [177 /AND OFF BITS 0-4 FILLS8, TAD FILLS9 /ADD IN VALUE DCA I POINT /SET NEW WORD CDF /BACK TO FIELD 0 JMP I FILLSL /EXIT /FILL SLOT ROUTINE #2 /BITS 5-9 OF WORD 1 FILLS2, CLL RTL /VALUE INTO BITS 5-9 DCA FILLS9 /SAVE VALUE TAD I POINT AND (7603 /AND OFF BITS 5-9 JMP FILLS8 /FILL SLOT ROUTINE #3 /BITS 10-11 OF WORD 1 AND BITS 0-2 OF WORD 2 FILLS3, DCA FILLS9 /SAVE VALUE TAD FILLS9 CLL RAR CLL RAR /GET BITS 10-11 CLL RAR DCA FILLSA /SAVE TAD I POINT AND (7774 /AND OFF BITS 10-11 TAD FILLSA /ADD IN BITS 10-11 DCA I POINT /SET NEW WORD ISZ POINT /GOTO WORD 2 TAD FILLS9 AND [7 /GET BITS 0-2 CLL RTR RTR /SHIFT THEM DCA FILLS9 /SAVE VALUE TAD I POINT AND (777 /AND OFF BITS 0-2 JMP FILLS8 /FILL SLOT ROUTINE #4 /BITS 3-7 OF WORD 2 FILLS4, CLL RTL RTL /SHIFT INTO POSITION DCA FILLS9 /AND SAVE ISZ POINT /USE WORD 2 TAD I POINT AND (7017 /AND OFF BITS 3-7 JMP FILLS8 /FILL SLOT ROUTINE #5 /BITS 8-11 OF WORD 2 AND BIT 0 OF WORD 3 FILLS5, DCA FILLS9 TAD FILLS9 /GET VALUE CLL RAR /GET BITS 8-11 DCA FILLSA /AND SAVE ISZ POINT /USE WORD 2 FIRST TAD I POINT AND [7760 /AND OFF BITS 8-11 TAD FILLSA /ADD IN THOSE BITS DCA I POINT /SET NEW WORD 2 ISZ POINT /NOW WORD 3 CLA IAC AND FILLS9 /GET BIT 0 CLL RTR /AND SHIFT INTO POSITION DCA FILLS9 /AND SAVE IT CLL CLA CMA RAR AND I POINT /AND OFF BIT 0 JMP FILLS8 /FILL SLOT ROUTINE #6 /BITS 1-5 OF WORD 3 FILLS6, CLL RTL RTL /SHIFT INTO POSITION RTL DCA FILLS9 /AND SAVE ISZ POINT ISZ POINT /USE WORD 3 TAD I POINT AND (4077 /AND OFF BITS 1-5 JMP FILLS8 /FILL SLOT ROUTINE #7 /BITS 6-10 OF WORD 3 /BIT 11 OF WORD 3 A 0 FILLS7, CLL RAL /SHIFT INTO POSITION DCA FILLS9 /AND SAVE ISZ POINT ISZ POINT /USE WORD 3 TAD I POINT AND [7700 /AND OFF BITS 6-11 JMP FILLS8 FIX75, 0 /DF 10 CDF /SET H.O. DATE WORD OF FILE TAD I (SLOTNO /ENTRY NO. OF FILE CLL RAL /*3 TAD I (SLOTNO /SINCE 1 -10 WORD= 3 -8 WORDS TAD (DIRECT-1 /POINT TO HIGH ORDER BIT OF DATE DCA FIXPTR /V3C CDF 10 STA CLL RAL /OTHER STUFF IS VERY IMPORTANT AND I FIXPTR /SO KEEP IT TAD HIDATE /OR IN THIS BIT DCA I FIXPTR /AND WRITE IT BACK JMP I FIX75 FIXPTR, 0 /POINTS TO WORD CONTAINING H.O. DATE PAT11, 0 //DSN 21.24.1 M TAD I PAT12 // AND [0200 // CLL RTR // RTR // DCA 116 // TAD TEMP1 // AND [0007 // JMP I PAT11 // PAT12, 7777 // PAGE /GET NEXT SLOT ROUTINE /GOES BY 5'S EITHER FORWARD OR BACKWARD / /CALL: / (AC) /CURRENT BLOCK NUMBER / JMS NEXTSL /GET NEXT SLOT / (AC) /NEXT BLOCK NUMBER / /GOES TO "NOROOM" IF DIRECTORY FULL NEXTSL, 0 /GET NEXT SLOT TAD NEXTDI /ADD IN DIRECTION FACTOR SPA JMP NEXTS2 /<0 MEANS REVERSE DIRECTION TAD [-1102 SMA JMP NEXTS2 />1101 MEANS REVERSE DIRECTION TAD (1102 DCA NEXTS1 /SET NEW BLOCK NUMBER JMS I (FINDSL /IS THIS SLOT FREE? NEXTS1, 0 /BLOCK NUMBER SZA CLA JMP NEXTS3 /NO - NOT FREE TAD NEXTS1 /FREE DCA NEXTS7+1 /SET BLOCK AGAIN NEXTS7, JMS I (FILLSL /FILL THIS SLOT THEN 0 /SLOT TO FILL SLOTNO, 0 /VALUE TO FILL WITH TAD NEXTDI SMA CLA /MAKE SURE DIRECTION IS -4 OR 4 TAD (10 TAD (-4 DCA NEXTDI TAD NEXTS7+1 /GET NEW BLOCK JMP I NEXTSL /EXIT NEXTS2, CLA /REVERSE DIRECTION TAD NEXTDI SMA CLA /SET 0 OR 1101 TAD (1101 DCA NEXTS1 /INTO BLOCK NUMBER TAD NEXTDI CIA /REVERSE DIRECTION JMP NEXTS3+1 /GO PRETEND WE FOUND A FULL SLOT NEXTS3, TAD NEXTDI SMA CLA /MAKE DIRECTION -1 OR 1 CLL CLA CMA RAL CMA DCA NEXTDI /DIRECTION IS -1 OR 1 TAD [-1102 DCA NEXTS4 /CHECK 1102 BLOCKS TAD NEXTS1 DCA NEXTS5 /SET START BLOCK JMS I (FINDSL /CHECK A SLOT NEXTS5, 0 /SLOT TO CHECK SNA CLA JMP NEXTS6 /FOUND A FREE SLOT ISZ NEXTS4 /TRY MORE? SKP /YES JMP I (NOROOM /NO - OUT OF ROOM TAD NEXTS5 TAD NEXTDI /ADD DIRECTION TO SLOT SPA JMP NEXTS2 /<0 IS TOO FAR TAD [-1102 SMA JMP NEXTS2 />1101 IS TOO FAR TAD (1102 DCA NEXTS5 /SET NEW BLOCK JMP NEXTS5-1 /KEEP GOING NEXTS6, TAD NEXTS5 /GET FREE BLOCK JMP NEXTS7-1 /AND SET IT NEXTS4, 0 /COUNTER NEXTDI, 0 /DIRECTION (5, -5, 1, -1) /MORE PDP-10 OUTPUT /OUTPUT CHARACTER #3 - BITS 9-11 WORD 2 AND BITS 0-3 WORD 3 OCHAR3, TAD OCHARY CLL RTR RTR AND [7 TAD I OPOINT DCA I OPOINT ISZ OPOINT TAD OCHARY AND [17 CLL RTR RTR RAR JMP I (OCHARD MONTBL, "J;"A;"N "F;"E;"B "M;"A;"R "A;"P;"R "M;"A;"Y "J;"U;"N "J;"U;"L "A;"U;"G "S;"E;"P "O;"C;"T "N;"O;"V "D;"E;"C PAGE /PDP-10 CHARACTER OUTPUT ROUTINE / /CALL: / (AC) /CHARACTER / JMS OCHR10 /OUTPUT TO PDP-10 / -RETURN- /O.K. RETURN OCHR10, 0 /OUTPUT TO PDP-10 DCA OCHARY /SAVE CHAR TAD MODE /IMAGE MODE? SZA JMP OC10A1 /YES /I OR /B TAD OCHARY /NO - USE 7 BITS AND [177 OC10A2, DCA OCHARY OC10A3, TAD CHARNO /GET CHAR NUMBER TAD (JMP I OCHARX DCA OCHARZ /USE TO SET UP JUMP CDF 10 /BUFFER IS IN FIELD 1 OCHARZ, 0 /JUMP TO THE ROUTINE OC10A1, SMA CLA /BINARY? JMP OC10A3 /NO TAD OCHARY /YES AND [377 JMP OC10A2 OCHARX, OCHAR0 OCHAR1 OCHAR2 OCHAR3 OCHAR4 /OUTPUT CHARACTER #0 - BITS 0-6 WORD 1 OCHAR0, TAD I [OBUF10+2 AND [177 /GET COUNT TAD (-177 SZA CLA JMP OCHARA /STILL ROOM IN BUFFER CDF /NO ROOM IN BUFFER TAD OBLOCK JMS I (NEXTSL /GET THE NEXT BLOCK NUMBER DCA OCHARZ /AND SAVE IT CDF 10 /BACK TO FIELD 1 TAD OCHARZ AND [7700 CLL RTR RTR RTR /GET LINK POINTER DCA I [OBUF10 TAD OCHARZ AND [77 CLL RTL RTL RTL TAD I [OBUF10+1 DCA I [OBUF10+1 /AND SET POINTER TAD OUNIT DCA UNIT10 /SET OUR UNIT TAD OBLOCK DCA .+3 /AND OUR BLOCK JMS I (WRITET /WRITE PDP-10 DECTAPE OBUF10 0 /BLOCK NUMBER IS SET CDF 10 /BACK TO FIELD 1 DCA I [OBUF10 TAD I [OBUF10+1 AND [77 DCA I [OBUF10+1 /CLEAR POINTER TAD OCHARZ DCA OBLOCK /SET NEW BLOCK TAD I [OBUF10+2 AND [7400 DCA I [OBUF10+2 /ZERO COUNT TAD (OBUF10+3 DCA OPOINT /RESET POINTER OCHARA, ISZ I [OBUF10+2 /BUMP COUNT TAD MODE /IMAGE MODE? SNA JMP OCHARB /NO SMA CLA /BINARY? JMP OC10A4 /NO DCA I OPOINT /YES ISZ OPOINT DCA I OPOINT ISZ OPOINT TAD OCHARY DCA I OPOINT /SET 8 BITS ISZ OPOINT OCHARC, CDF /BACK TO FIELD 0 JMP I OCHR10 /EXIT OC10A5, ISZ OPOINT OC10A4, TAD OCHARY JMP OCHARD OCHARB, TAD OCHARY CLL RTL RTL RAL /USE BITS 0-6 OCHARD, DCA I OPOINT /SET IT ISZ CHARNO /BUMP CHARACTER NUMBER JMP OCHARC /OUTPUT CHARACTER #1 - BITS 7-11 WORD 1 AND BITS 0-1 WORD 2 OCHAR1, TAD MODE SZA CLA JMP OC10A5 TAD OCHARY CLL RAR /GET BITS 7-11 CLL RAR TAD I OPOINT DCA I OPOINT /SET WORD 1 ISZ OPOINT /NOW WORD 2 TAD OCHARY AND [3 CLL RTR RAR /GET BITS 0-1 JMP OCHARD /OUTPUT CHARACTER #2 - BITS 2-8 WORD 2 OCHAR2, TAD MODE SZA CLA JMP OC10A6 TAD OCHARY CLL RTL RAL /GET BITS 2-8 TAD I OPOINT JMP OCHARD /OUTPUT CHARACTER #4 - BITS 4-10 WORD 3 /BIT 11 WORD 3 IS 0 OCHAR4, TAD OCHARY CLL RAL /BITS 4-10 TAD I OPOINT OC10A7, DCA I OPOINT /SET WORD 3 ISZ OPOINT DCA CHARNO /RESET CHARACTER NUMBER JMP OCHARC OC10A6, ISZ OPOINT TAD OCHARY JMP OC10A7 PAGE /PDP-10 CHARACTER INPUT / /CALL: / JMS ICHR10 /PDP-10 INPUT / -EOF- /END OF FILE RETURN / (AC) /NORMAL RETURN - CHARACTER IN AC ICHR10, 0 /PCP-10 INPUT ROUTINE TAD CHARNI TAD (JMP I ICHARX DCA ICHARY /USE CHARACTER NUMBER TO FORM JUMP CDF 10 /BUFFER IS IN FIELD 1 ICHARY, 0 /TEMPORARY AND JUMP CELL ICHARX, ICHAR0 ICHAR1 ICHAR2 ICHAR3 ICHAR4 /INPUT CHARACTER #0 - BITS 0-6 WORD 1 ICHAR0, TAD WORDS /GET NUMBER OF WORD LEFT SZA CLA JMP ICHARA /STILL MORE WORDS LEFT TAD IBLOCK /GET NEXT BLOCK SNA JMP ICHARC+1 /NONE - EOF DCA .+5 /SET NEXT BLOCK TAD IUNIT DCA UNIT10 /SET OUR UNIT JMS I (READT /READ PDP-10 DECTAPE IBUF10 0 /OUR BLOCK IS SET CDF 10 /BACK TO FIELD 1 TAD I [IBUF10+2 AND [177 DCA WORDS /SET NUMBER OF WORDS TAD I [IBUF10+1 RTR RTR RTR AND [77 DCA IBLOCK /SET NEXT BLOCK TAD I [IBUF10 AND [77 CLL RTL RTL RTL TAD IBLOCK DCA IBLOCK /SET NEXT BLOCK TAD (IBUF10+3 DCA IPOINT /RESET POINTER JMP ICHAR0 ICHARA, CLA CMA TAD WORDS DCA WORDS /COUNT DOWM ON NUMBER OF WORDS TAD MODE /IMAGE MODE? SNA JMP ICHARB /NO SMA CLA JMP IC10A1 ISZ IPOINT /YES ISZ IPOINT TAD I IPOINT /GET WORD 3 ISZ IPOINT AND [377 /USE 8 BITS ICHARC, ISZ ICHR10 /2ND EXIT CDF /BACK TO FIELD 0 JMP I ICHR10 /EXIT ICHARB, TAD SAVELN /PRESERVE OPTION? SZA CLA JMP ICHARF /YES CLL CLA CML RTL /NO TAD IPOINT DCA ICHARY /POINT TO WORD 3 TAD I ICHARY CLL RAR SNL CLA JMP ICHARF /WORD O.K. ISZ IPOINT ISZ IPOINT /IGNORE THIS WORD ISZ IPOINT JMP ICHAR0 ICHARF, TAD I IPOINT RTR RTR /GET BITS 0-6 RAR ICHARD, ISZ CHARNI /BUMP COUNTER AND [177 /USE 7 BITS TAD [200 /ADD BIT 8 JMP ICHARC /INPUT CHARACTER #1 - BITS 7-11 WORD 1 AND BITS 0-1 WORD 2 ICHAR1, TAD MODE SZA CLA JMP IC10A1 TAD I IPOINT AND [37 CLL RTL /GET BITS 7-11 DCA ICHARY ISZ IPOINT /USE WORD 2 NOW TAD I IPOINT CLL RTL RAL AND [3 /GET BITS 0-1 ICHARE, TAD ICHARY /ADD IN OTHER BITS JMP ICHARD /INPUT CHARACTER #2 - BITS 2-8 WORD 2 ICHAR2, TAD MODE SZA CLA JMP IC10A3 TAD I IPOINT RAR RTR /GET BITS 2-8 JMP ICHARD /INPUT CHARACTER #3 - BITS 9-11 WORD 2 AND BITS 0-3 WORD 3 ICHAR3, TAD I IPOINT AND [7 CLL RTL RTL /GET BITS 9-11 DCA ICHARY ISZ IPOINT /USE WORD 3 NOW TAD I IPOINT RTL RTL RAL AND [17 /GET BITS 0-3 JMP ICHARE /INPUT CHARACTER #4 - BITS 4-10 WORD 3 ICHAR4, DCA CHARNI /RESET CHARACTER COUNT TAD I IPOINT ISZ IPOINT RAR JMP ICHARD+1 IC10A3, DCA CHARNI SKP IC10A1, ISZ CHARNI TAD I IPOINT ISZ IPOINT JMP ICHARC PAGE /CLOSE A PDP-10 FILE / /CALL: / JMS CLOS10 /CLOSE A PDP-10 FILE / -RETURN- CLOS10, 0 /CLOSE A PDP-10 FILE TAD MODE /IMAGE MODE? SPA CLA JMP CLOS1A /YES - NO FILL NEEDED TAD CHARNO SNA CLA JMP CLOS1A /CHARACTER NUMBER IS 0 - FILL DONE JMS I (OCHR10 /0 FILL JMP .-4 /LOOP CLOS1A, TAD OUNIT DCA UNIT10 /SET OUR UNIT TAD OBLOCK DCA .+3 /SET THE BLOCK JMS I (WRITET /WRITE PDP-10 DECTAPE OBUF10 0 /BLOCK IS SET TAD (MOUTPU JMS I (DELETE /DELETE THE OLD FILE NOP /O.K. IF IT IS NOT THERE TAD FREEP DCA INDEX0 /POINT TO THE FREE SPOT TAD [MOUTPU DCA INDEX1 /POINT TO THE FILE NAME CDF 10 /TO FIELD 1 TAD I INDEX1 DCA I INDEX0 TAD I INDEX1 /SET THE NAME DCA I INDEX0 TAD I INDEX1 DCA I INDEX0 TAD INDEX0 TAD [77 DCA INDEX0 /POINT TO THE EXTENSION TAD I INDEX1 DCA I INDEX0 /SET THE EXTENSION TAD I INDEX1 DCA I INDEX0 TAD DATE DCA I INDEX0 /SET THE DATE JMS I (FIX75 /V3C SET HIGH ORDER BIT TOO JMS I (WRITET /WRITE PDP-10 DECTAPE DIRECT /DIRECTORY 144 /BLOCK 100 BASE 10 JMP I CLOS10 /EXIT /OPEN A PDP-10 FILE FOR OUTPUT / /CALL: / JMS OOPN10 /OPEN A PDP-10 FILE / -RETURN- OOPN10, 0 /OPEN A PDP-10 FILE TAD (ZFREE-1 JMS I (FIND /FIND A FREE SPOT JMP I (NOROOM /NO ROOM LEFT DCA I (SLOTNO /SET THIS SLOT TAD INDEX0 DCA FREEP /SAVE POINTER TO FREE SPOT CLA CMA DCA I (NEXTDI /SET DIRECTION = -1 TAD (144 JMS I (NEXTSL /FIND FIRST OPEN SLOT DCA OBLOCK /AND SET IT CDF 10 TAD I [MOUTPU DCA OUNIT /SET UNIT TAD OBLOCK AND [17 CLL RTR RTR RAR DCA I [OBUF10+2 /SET FIRST BLOCK POINTER TAD OBLOCK CLL RTR RTR AND [77 DCA I [OBUF10+1 /SET FIRST BLOCK POINTER DCA I [OBUF10 /ZERO LINK POINTER DCA CHARNO /RESET CHARACTER NUMBER TAD (OBUF10+3 DCA OPOINT /RESET POINTER CDF JMP I OOPN10 /EXIT /OPEN PDP-10 INPUT FILE / /CALL: / (AC) /POINT TO FILE NAME-1 / JMS IOPN10 /OPEN PDP-10 INPUT FILE / -NO- /NOT THERE / (AC) /ANY BLOCK OF THE FILE IOPN10, 0 /OPEN PDP-10 INPUT FILE JMS I (FIND /FIND THE FILE JMP I IOPN10 /NOT THERE DCA IOPN1B /SAVE SLOT NUMBER TAD (143 DCA IOPN1A TAD (CLA CMA DCA IOPN1D IOPN1F, JMS I (FINDSL /FIND A SLOT IOPN1A, 0 /SLOT TO FIND CIA TAD IOPN1B /IS IT US? SNA CLA JMP IOPN1C /YES IOPN1D, CLA CMA TAD IOPN1A /BUMP BLOCK NUMBER SPA JMP IOPN1E /TOO FAR TAD [-1102 SMA JMP I IOPN10 /TOO FAR - EXIT TAD (1102 DCA IOPN1A /SET NEW BLOCK JMP IOPN1F /RETRY IOPN1B, 0 /SLOT THAT WE WANT IOPN1E, CLA TAD (CLA IAC JMP IOPN1F-1 /CHANGE DIRECTION AND RETRY IOPN1C, TAD IOPN1A CDF ISZ IOPN10 JMP I IOPN10 /EXIT PAGE /CONVERT OS8 DATE TO PDP-10 DATE CVDATE, 0 SNA JMP I CVDATE /0 CONVERTS TO 0 DCA TEMP1 TAD TEMP1 /V3C RTR RAR AND [37 TAD (-1 /GET DAY DCA DATE4 /V3C / //DSN 21.24.1 M / TAD TEMP1 // / AND [7 /GET OS8 YEAR (-1970) // JMS I PAT10 // TAD 116 // DECIMAL TAD (1970-1964 OCTAL DCA DATE1 /SAVE YEAR TAD DATE1 CLL RAL /*2 TAD DATE1 /*2+1=*3 CLL RTL /*3*4=*12 DCA DATE1 /DATE1=DATE1*12 TAD TEMP1 RTL RTL RAL AND [17 /GET MONTH TAD (-1 TAD DATE1 /ADD IN MONTH DCA DATE1 TAD DATE1 CLL RAL /*2 TAD DATE1 /*2+1=*3 DCA TEMP2 TAD TEMP2 CLL RTL /*3*4=*12 TAD TEMP2 /*12+*3=*15 CLL RAL /*15*2=*30 TAD DATE1 /*30+1=*31 TAD DATE4 /V3C ADD IN DAY DCA DATE1 /DATE1=DATE1+MONTH-1 * 31 RAL /V3C LINK NOW HAS HIGH ORDER DATE BIT DCA HIDATE /ONLY WITHIN RANGE OF OS/8 TAD DATE1 /RETURN LOW ORDER 12 BITS OF DATE JMP I CVDATE DATE1, 0 DATE4, 0 /TYPE A PDP-10 DATE DATE10, 0 SZL /LINK HAD HIGH ORDER BIT TAD (4 /IF ON, WANT ADDITIONAL 11 YEARS, 4 DAYS DCA DATE1 /SAVE VALUE RAL /V3C DCA DATE75 /SAVE FACT THAT NEED 'NUTHER 11 YEARS TAD (100 /V3C BASE IS (19)64 DCA DATE2 /WILL BE YEAR DATE11, TAD DATE1 SMA CLA JMP DATE12 /MUST BE POSITIVE ISZ DATE2 /BUMP YEAR TAD DATE1 TAD (-564 /-372 DECIMAL (DAYS PER YEAR) DCA DATE1 JMP DATE11 DATE12, DCA DATE3 /WILL BE MONTH TAD DATE1 /DIVIDE BY 31 TAD (-37 SPA JMP .+4 ISZ DATE3 /BUMP MONTH DCA DATE1 JMP .-6 CLA ISZ DATE1 /+1 IS DAY TAD DATE3 /DIVIDE BY 12 TAD (-14 SPA JMP .+4 ISZ DATE2 /BUMP YEAR DCA DATE3 JMP .-6 CLA TAD DATE1 TAD (-12 SMA CLA JMP DATE9 TAD ("0 JMS I OUTPUT /PRINT LEADING 0 IF NECESSARY DATE9, TAD DATE1 JMS I (PRINT /PRINT DAY TAD ("- JMS I OUTPUT TAD DATE3 TAD DATE3 TAD DATE3 /V3C MULTIPLY BY 3 TAD (MONTBL /ADD IN BASE OF MONTH NAMES DCA MONPTR /POINT TO PROPER MONTH NAME TAD I MONPTR /GET CHAR 1 JMS I OUTPUT /PRINT IT ISZ MONPTR /POINT TO NEXT CHAR TAD I MONPTR /GET CHAR 2 JMS I OUTPUT /PRINT IT ISZ MONPTR /V3C TAD I MONPTR JMS I OUTPUT TAD ("- JMS I OUTPUT TAD DATE75 /V3C SZA CLA TAD (13 /ADD 11 YEARS IF H.O. BIT ON TAD DATE2 JMS I (PRINT /PRINT YEAR JMP I DATE10 DATE2, 0 /YEAR DATE3, 0 /MONTH MONPTR, 0 /V3C POINTS TO MONTH NAME PAT10, PAT11 //DSN 21.24.1 M PAGE DECIMAL PRINTL, -1000 -100 -10 OCTAL PRINTZ, 0 /PRINT WITH LEADING SPACES DCA PRINT0 TAD PRINTZ DCA I (PRINT TAD (240 JMP I (PRINT7 /ZERO A DIRECTORY (PDP-10) ZERO10, 0 /ZERO THE PDP-10 DIRECTORY TAD I [MOUTPU AND [17 SZA CLA JMP I (NOT10F /NOT A PDP-10 TAD I [MOUTPU DCA UNIT10 /SET UNIT TAD (DIRECT-1 DCA INDEX0 /POINT TO DIRECTORY TAD (-600 DCA CNTR /COUNT OF 600 DCA I INDEX0 /ZERO THE DIRECTORY ISZ CNTR JMP .-2 /LOOP TAD (7570 DCA I (DIRECT /SAVE BLOCKS 1 AND 2 TAD (170 DCA I (DIRECT+52 /SAVE BLOCK 144 TAD (777 DCA I (DIRECT+367 /SAVE BLOCKS 1102 ON UP CLA CMA DCA I (DIRECT+370 JMS I (WRITET /WRITE PDP-10 DECTAPE DIRECT /DIRECTORY 144 /DIRECTORY BLOCK CDF 10 JMP I ZERO10 /EXIT /DELETE A PDP-10 FILE DELE10, 0 /DELETE A PDP-10 FILE TAD I [MOUTPU AND [17 SZA JMP DELOS8 /DELETE A OS8 FILE TAD I [MOUTPU DCA UNIT10 /SET UNIT TAD [MOUTPU CDF JMS I (DELETE /DELETE THE PDP-10 FILE JMP I (ERDELF /NOT THERE JMS I (WRITET /WRITE PDP-10 DECTAPE DIRECT 144 /DIRECTORY BLOCK JMP I DELE10 /EXIT DELOS8, CIF CDF 10 JMS I (DELPS1 /DELETE A OS8 FILE JMP I DELE10 JMP I (ERDELF /ERROR DELETING THE FILE PAGE /GET THE NEXT INPUT FILE NEXIFL, 0 /GET THE NEXT INPUT FILE DCA CHARNI /RESET STUFF DCA WORDS CDF 10 CLA CMA DCA I (INCHCT DCA I (INEOF TAD (INDEVH+1 DCA INDEVX TAD I IXR /GET NEXT SNA JMP NEXIF2 /E.O.F DCA IUNIT TAD I IXR DCA IBLOCK /SET START BLOCK CDF TAD IUNIT AND [17 SNA JMP NEXIF1 /PDP-10 FILE CIF 10 JMS I [200 1 INDEVX, 0 JMP I (NOOFIL CDF 10 TAD INDEVX DCA I (INHNDL TAD IBLOCK DCA I (INREC TAD IUNIT AND [7760 SZA TAD [17 CLL CML RTR RTR DCA I (INCTR TAD (ICHRPS JMP NEXIF3 NEXIF1, TAD IUNIT DCA UNIT10 TAD IBLOCK DCA .+3 JMS I (READT IBUF10 0 /READ ANY BLOCK CDF 10 TAD I [IBUF10+2 RTL RTL RAL AND [17 DCA IBLOCK TAD I [IBUF10+1 AND [77 CLL RTL RTL TAD IBLOCK DCA IBLOCK /SET START BLOCK TAD (ICHR10 NEXIF3, DCA INPUT /SET ROUTINE POINTER ISZ NEXIFL NEXIF2, CDF JMP I NEXIFL /EXIT ICHRPS, 0 CIF CDF 10 JMS I (ICHARP SKP ISZ ICHRPS JMP I ICHRPS OCHRPS, 0 CIF 10 JMS I (OCHARP JMP I (IOERR JMP I OCHRPS PAGE PIP10, CDF 10 /STARTS HERE - JUMPED TO FROM 200 DCA HIDATE /V3C TAD I (MDATE /GET TODAY'S DATE CDF JMS I (CVDATE /CONVERT IT DCA DATE /AND STORE IT TAD (3401 /UNRESTARTABLE, DOESN'T DESTROY BATCH OR USR AREA DCA I (JSBITS PIPCD, CDF JMS I (CD /COMMAND DECODE CDF 10 TAD I (MPARAM AND (2010 CLL RAL DCA MODE /SET /I SWITCH TAD I (MPARAM+1 AND (400 DCA SAVELN /SET /P SWITCH TAD I (MPARAM AND (101 SZA CLA JMP I (LIST10 /EITHER /F OR /L TAD I [MOUTPU SZA CLA JMP PIP001 /IS AN OUTPUT FILE TAD I (MINPUT SNA CLA JMP PIPCD /NO OUTPUT OR INPUT FILES JMP I (NOOOFL /INPUT, BUT NO OUTPUT PIP001, CLL CLA CML RTR AND I (MPARAM+2 SZA CLA JMS I (ZERO10 /IT IS /Z OPTION TAD (OUDEVH+1 DCA OUDEVX TAD I [MOUTPU AND [17 SZA JMP PIPB /OUTPUT IS OS8 TAD I [MOUTPU DCA UNIT10 /SET UNIT JMS I (READT DIRECT /GET DIRECTORY INTO CORE 144 PIPA, CDF 10 TAD OUDEVX DCA I (OUHNDL TAD I (MPARAM AND (400 SZA CLA JMS I (DELE10 /DELETE A PDP-10 FILE FIRST CDF 10 TAD (MINPUT-1 DCA IXR TAD I IXR SNA CLA JMP PIPCD /NO INPUT TAD (MINPUT-1 DCA IXR /SET INPUT LIST TAD I [MOUTPU AND [17 CDF SZA CLA JMP PIPC /OUTPUT IS OS8 JMS I (OOPN10 /OPEN PDP-10 OUTPUT TAD (OCHR10 PIPD, DCA OUTPUT /SET OUTPUT ROUTINE PIPE, SZA CLA /IS IT ERROR OR EOF JMP I (IOERR /ERROR JMS I (NEXIFL /GET NEXT FILE JMP PIPF /FINAL EOF JMS I INPUT /GET INPUT JMP PIPE /EOF OR ERROR JMS I OUTPUT /OUTPUT JMP .-3 /LOOP PIPC, CIF CDF 10 JMS I (OOPNPS /OPEN OS8 OUTPUT JMP I (NOOOFL TAD (OCHRPS JMP PIPD PIPB, CDF 0 CIF 10 JMS I [200 1 /GET OS8 OUTPUT HANDLER OUDEVX, 0 JMP I (NOOFIL JMP PIPA PIPF, CDF 10 TAD I [MOUTPU /NOW CLOSE THE OUTPUT FILE AND [17 CDF SZA CLA JMP PIPG JMS I (CLOS10 JMP PIPCD PIPG, CIF CDF 10 JMS I (OCLOSE JMP I (IOERR JMP PIPCD PAGE LIST10, TAD (OUDEVH+1 DCA OUDEVY TAD (OUDEVH+1 DCA OUDEVZ TAD (3100 /RESET THINGS DCA LISTDV+1 TAD I [MOUTPU SZA JMP LIST11 /OUTPUT FILE EXISTS CDF 0 CIF 10 JMS I [200 1 LISTDV, TEXT /TTY/ /LOOKUP THE TTY: OUDEVY, 0 JMP I (NOOOFL CDF 10 TAD LISTDV+1 DCA I [MOUTPU /SET TTY: DEVICE NUMBER TAD I [MOUTPU LIST11, AND [17 SNA JMP I (NOTPSF /NOT A OS8 FILE CDF 0 CIF 10 JMS I [200 1 /LOOKUP DEVICE OUDEVZ, 0 JMP I (NOOFIL LIST12, CDF CIF 10 TAD OUDEVZ DCA I (OUHNDL JMS I (OOPNPS /OPEN OUTPUT FILE JMP I (NOOOFL TAD (OCHRPS DCA OUTPUT /SET OUTPUT ROUTINE CDF 10 TAD I (MINPUT DCA UNIT10 CDF TAD UNIT10 SNA JMP I (PIPCD /NO INPUT AND [17 SZA CLA JMP I (NOT10F JMS I (READT /READ THE DIRECTORY DIRECT 144 TAD (LISTL-1 DCA INDEX0 TAD (-40 DCA CNTR DCA I INDEX0 /CLEAR THE COUNTS ISZ CNTR JMP .-2 TAD (-1101 DCA LIST13 CLA IAC DCA LIST14 JMS I (FINDSL /FIND ALL SLOTS LIST14, 0 TAD (LISTL DCA LIST15 ISZ I LIST15 /COUNT THE NUMBER IN EACH SLOT ISZ LIST14 ISZ LIST13 JMP LIST14-1 JMS I (CRLF TAD I (LISTL JMS I (PRINTZ /PRINT FREE BLOCKS TAD (LISTM1-1 DCA INDEX0 JMS I (ERROR4 /"FREE BLOCKS" JMS I (CRLF TAD (-26 DCA LIST13 TAD (DIRECT+370 DCA INDEX6 TAD (DIRECT+2 /HIGH ORDER BIT (4096'S) OCCURS AT END OF EACH DCA XDATE /PDP-10 WORD AT BEGIN OF DIRECTORY /THIS IS END OF EVERY 3RD PDP-8 WORD LIST17, CDF 10 /MAIN LOOP TAD I INDEX6 SNA JMP I (LIST16 /DO NOT PRINT THIS BLANK ENTRY JMS I (LIST18 TAD I INDEX6 JMS I (LIST18 TAD I INDEX6 JMS I (LIST18 CDF TAD (". JMS I OUTPUT JMP I (LIST22 LIST13, 0 LIST15, 0 PAGE LIST22, CDF 10 TAD INDEX6 TAD [77 DCA INDEX5 TAD I INDEX5 /GET EXTENSION JMS LIST18 TAD I INDEX5 AND [7700 JMS LIST18 CLA IAC AND I (MPARAM SNA CLA JMP LIST19 /NO EXTRA IF NOT /L JMS LIST18 CDF TAD I (LIST13 TAD (LISTL+27 DCA LIST23 TAD I LIST23 /GET NUMBER OF BLOCKS JMS I (PRINTZ JMS LIST18 TAD I XDATE /V3C RAR /HIGH ORDER BIT OF DATE TO LINK CLA TAD I INDEX5 CDF JMS I (DATE10 LIST19, CDF JMS CRLF LIST20, CDF TAD XDATE /V3C TAD (3 /POINT TO NEXT DATE H.O. BIT DCA XDATE ISZ I (LIST13 JMP I (LIST17 /LOOP JMS CRLF JMP I (PIPG /CLOSE THE FILE LIST16, ISZ INDEX6 ISZ INDEX6 JMP LIST20 CRLF, 0 TAD [215 JMS I OUTPUT TAD [212 JMS I OUTPUT JMP I CRLF LIST23, 0 LIST18, 0 CDF DCA TEMP1 TAD TEMP1 RTR RTR RTR JMS LIST21 TAD TEMP1 JMS LIST21 CDF 10 JMP I LIST18 LIST21, 0 AND [77 TAD [240 JMS I OUTPUT JMP I LIST21 /FIND A PDP-10 ENTRY IN DIRECTORY / /CALL: / (AC) /POINT TO NAME-1 (FIELD 1) / JMS FIND /FIND A PDP-10 ENTRY / -NO- /NOT FOUND / (AC) /SLOT NUMBER IF FOUND FIND, 0 /FIND A PDP-10 FILE DCA FIND4 /SAVE POINTER TAD (DIRECT+370 DCA INDEX0 /POINT TO DIRECTORY START TAD (-26 DCA CNTR /22 DECIMAL FILES CDF 10 /DIRECTORY IS IN FIELD 1 FIND2, TAD FIND4 /GET POINTER DCA INDEX2 /POINT TO NAME,EXT TAD I INDEX0 CIA TAD I INDEX2 /CHECK WORD 1 SZA CLA JMP FIND1 /NO TAD I INDEX0 CIA TAD I INDEX2 /CHECK WORD 2 SZA CLA JMP FIND1+1 /NO TAD I INDEX0 CIA TAD I INDEX2 /CHECK WORD 3 SZA CLA JMP FIND1+2 /NO TAD INDEX0 TAD [77 DCA INDEX1 /POINT TO EXTENSIONS TAD I INDEX1 CIA TAD I INDEX2 /CHECK WORD 4 SZA CLA JMP FIND1+2 /NO TAD I INDEX1 AND [7700 CIA TAD I INDEX2 /CHECK WORD 5 SZA CLA JMP FIND1+2 /NO CLL CLA CMA RTL TAD INDEX0 DCA INDEX0 /POINT TO ENTRY AGAIN TAD CNTR TAD (27 ISZ FIND /WE FOUND IT - 2ND EXIT FIND3, CDF /BACK TO FIELD 0 JMP I FIND /EXIT FIND1, ISZ INDEX0 /EXTRA POINTER BUMPS ISZ INDEX0 ISZ CNTR /MORE FILES? JMP FIND2 /YES - LOOP JMP FIND3 /NO - NOT FOUND FIND4, 0 /POINTER TO NAME-1 PAGE LINBUF=. LISTL, ZBLOCK 105 LISTM1, TEXT / FREE BLOCKS PIP10 V/ VERLOC, *.-1 60+VERSION^100+SUBVER 3700 ERMES0, TEXT /_PIP10 CANNOT BE CHAINED TO_/ ERMES1, TEXT #_I/O ERROR_# ERMES2, TEXT /_DEVICE FULL_/ ERMES3, TEXT /_NO SUCH DEVICE_/ ERMES4, TEXT /_NOT PDP-10 FILE_/ ERMES5, TEXT /_ERROR DELETING FILE_/ ERMES6, TEXT /_NOT OS8 FILE_/ ERMES7, TEXT /_OUTPUT FILE OPEN ERROR_/ ERMES8, TEXT /_SYNTAX ERROR_/ ERMES9, TEXT /_FILE NOT FOUND_/ /ROUTINE TO SET TD8E UNIT INFORMATION FROM UNIT10 TDUSET, 0 TAD UNIT10 CLL RTL RAL AND (7 TAD (DVCTBL DCA DVCPTR RAR DCA TDUNIT /SAVE EVEN/ODD BIT TAD (TDUTBL DCA TDUPTR TDULP, TAD I TDUPTR SNA JMP I TDUSET DCA TDUT TAD I TDUT AND (7 TAD I DVCPTR DCA I TDUT ISZ TDUPTR JMP TDULP TDUPTR, 0 TDUT, 0 DVCPTR, 0 DVCTBL, 6770;6760;6750;6740 TDUTBL, DIO01 DIO02 DIO03 DIO04 DIO05 DIO06 DIO07 DIO08 DIO09 DIO10 DIO11 DIO12 DIO13 DIO14 DIO15 DIO16 DIO17 DIO18 DIO19 DIO20 DIO21 DIO22 IOTX1 IOTX2 IOTX3 IOTX4 IOTX5 IOTX6 IOTX7 IOTX8 0 PAGE /GET A CHARACTER GCH, 0 TAD I IXR /GET A CHAR TAD (-240 SNA JMP GCH+1 /IGNORE SPACES TAD (240-"/ SNA JMP SLASH TAD ("/-"( SNA JMP OPENP TAD ("( JMP I GCH /EXIT SLASH, TAD I IXR JMS SLSHCH /GET OPTION JMP GCH+1 OPENP, TAD I IXR TAD (-") SNA JMP GCH+1 /END TAD (") JMS SLSHCH /GET OPTION JMP OPENP SLSHCH, 0 SNA JMP I (SYNTAX /ERROR DCA TEMP6 TAD (MPARAM-1 DCA TEMP5 /POINT TO PARAMETERS JMS DECODE JMP I (SYNTAX SZL TAD (32 /ADD TAD (-14 ISZ TEMP5 SMA JMP .-3 /FIND DIVIDED BY 12 DCA TEMP4 CLL CML RAL ISZ TEMP4 JMP .-2 /SHIFT A BIT DCA TEMP4 /SAVE IT CDF 10 TAD TEMP4 CMA AND I TEMP5 TAD TEMP4 /OR IN THAT BIT DCA I TEMP5 CDF JMP I SLSHCH DECODE, 0 TAD TEMP6 TAD (-"9-1 CLL TAD ("9+1-"0 SZL JMP DECOD1 TAD ("0-"Z-1 CLL CML TAD ("Z-"A+1 SNL DECOD1, ISZ DECODE JMP I DECODE EXA40, 0 TAD (CDNAME DCA TEMP5 TAD (-5 DCA TEMP4 EXA401, CLL CLA CML RAR TAD I TEMP5 AND [7700 CLL RAL SZA RAR DCA TEMP3 TAD I TEMP5 TAD (40 AND [77 TAD (-40 SZA TAD (40 TAD TEMP3 DCA I TEMP5 ISZ TEMP5 ISZ TEMP4 JMP EXA401 JMP I EXA40 PAGE /GET A NAME ROUTINE GNAME, 0 DCA CDDEV /CLEAR AREA DCA CDDEV+1 CLA CMA DCA DEVSW /ALLOW DEVICES GNAME1, DCA CDNAME /CLEAR NAME,EXTENSION DCA CDNAME+1 DCA CDNAME+2 DCA CDEXT DCA CDEXT+1 CLA CMA DCA PERSW /ALLOW EXTENSIONS TAD (CDNAME DCA POINT /SET POINTER DCA CNTR /SET SWITCH GNAME2, JMS I (GCH /GET A CHAR DCA TEMP6 TAD TEMP6 SNA JMP GNAME6 /END TAD (-": SNA JMP GNAME5 /: IS DEVICE TAD (":-". SNA JMP GNAME4 /. IS EXTENSION TAD (". DCA TEMP6 /SAVE THE CHAR JMS I (DECODE JMP GNAME6-1 /NOT 0-9 OR A-Z IS END CLA TAD TEMP6 AND [77 /GET TRIMMED ASCII ISZ CNTR JMP GNAME3 /LEFT HALF TAD I POINT DCA I POINT /SET RIGHT HALF ISZ POINT JMP GNAME2 /LOOP GNAME3, CLL RTL RTL RTL DCA I POINT /SET LEFT HALF CLA CMA DCA CNTR TAD POINT TAD (-CDEXT-2 SZA CLA JMP GNAME2 /LOOP JMP GNAME2-1 /LOOP - IGNORE GNAME4, TAD CDNAME SZA CLA ISZ PERSW JMP I (SYNTAX /ERROR DCA CDEXT DCA CDEXT+1 /CLEAR EXTENSION TAD (CDEXT JMP GNAME2-2 /GET EXTENSION GNAME5, ISZ DEVSW JMP I (SYNTAX /ERROR ISZ PERSW JMP I (SYNTAX /ERROR TAD CDNAME SNA JMP I (SYNTAX /ERROR DCA CDDEV TAD CDNAME+1 DCA CDDEV+1 /SET DEVICE JMP GNAME1 /NOW GET THE NAME CLA GNAME6, DCA CDEXT+2 TAD CDEXT+1 AND [7700 DCA CDEXT+1 ISZ PERSW JMP I GNAME /EXIT DCA CDEXT DCA CDEXT+1 /CLEAR EXTENSION JMP I GNAME /EXIT PAGE CD, 0 TAD [MOUTPU-1 DCA INDEX0 TAD (-47 DCA CNTR CDF 10 DCA I INDEX0 /CLEAR AREAS ISZ CNTR JMP .-2 CDF CIF 10 JMS I [200 13 /RESET TABLES 0 DCA INSEG /NO DIRECTORY IN CORE DCA PDP10D /NO KNOWN PDP-10 DRIVES DCA PDP10D+1 DCA PDP10D+2 DCA PDP10D+3 DCA PDP10D+4 DCA PDP10D+5 DCA PDP10D+6 DCA PDP10D+7 DCA CDCNT /ZERO INPUT COUNT JMS I (GLINE /GET A LINE TAD [LINBUF-1 DCA IXR TAD I IXR SNA JMP NOBAKB /NO "<" IS LINE TAD (-"< SZA CLA JMP .-5 TAD [LINBUF-1 DCA IXR TAD XDSK DCA CDDEVF /SET "DSK" AS DEFAULT TAD XDSK+1 DCA CDDEVF+1 JMS I (GNAME /GET THE NAME TAD TEMP6 TAD (-"[ SZA CLA JMP CDX03 /NO SIZE SPECIFIED CDX01, JMS I (GCH TAD (-"] SNA JMP CDX02 /END OF SIZE TAD ("]-"0 SPA JMP I (SYNTAX /ERROR DCA TEMP1 TAD CDEXT+2 CLL RTL TAD CDEXT+2 RAL TAD TEMP1 DCA CDEXT+2 /ADD IN NUMBER TAD TEMP1 TAD (-11 SMA SZA CLA JMP I (SYNTAX /ERROR JMP CDX01 CDX02, JMS I (GCH SKP CDX03, TAD TEMP6 TAD (-"< SZA CLA JMP I (SYNTAX /ERROR JMS I (CDOUTX /SET OUTPUT STUFF NOBAKA, TAD (MINPUT-1 DCA INDEX6 TAD XDSK DCA CDDEVF /SET DEFAULT TAD XDSK+1 DCA CDDEVF+1 TAD IXR DCA CDI04 /SAVE POINTER JMS I (GCH SNA CLA JMP I CD /NO INPUT FILES TAD CDI04 DCA IXR /RESET POINTER CDI01, JMS I (GNAME /GET A FILE ISZ DEVSW JMP CDI02 /DEVICE SPECIFIED TAD CDDEVF DCA CDDEV TAD CDDEVF+1 DCA CDDEV+1 /SET DEFAULT DEVICE CDI02, TAD CDDEV DCA CDDEVF TAD CDDEV+1 DCA CDDEVF+1 /SET NEW DEFAULT ISZ CDCNT /COUNT INPUT FILES TAD CDCNT TAD (-12 SMA CLA JMP I (SYNTAX /TOO MANY FILES JMS I (CDINX /SET INPUT STUFF TAD TEMP6 SNA JMP I CD /MAIN EXIT TAD (-", SNA CLA JMP CDI01 JMP I (SYNTAX /ERROR NOBAKB, TAD [LINBUF-1 DCA IXR JMP NOBAKA PAGE CDOUTX, 0 /SET OUTPUT STUFF ISZ DEVSW JMP CDOUT9 /DEVICE SPECIFIED TAD CDNAME SNA CLA JMP I CDOUTX /NO NAME AND NO DEVICE IS NOTHING TAD CDDEVF DCA CDDEV TAD CDDEVF+1 DCA CDDEV+1 /SET DEFAULT DEVICE CDOUT9, TAD (OUDEVH+1 DCA CDOUT2 /SET OUTPUT HANDLER ADDRESS TAD [MOUTPU-1 DCA INDEX6 TAD CDDEV DCA CDOUT1 TAD CDDEV+1 DCA CDOUT1+1 /SET DEVICE CIF 10 JMS I [200 12 /FIND HANDLER CDOUT1, 0 0 CDOUT2, 0 JMP I (NOOFIL TAD CDOUT1+1 JMS I (GTDVTP /GET DEVICE TYPE AND COMPARE WITH TC08 AND TD8E SZA CLA JMP CDOUT3 /NOT DECTAPE TAD (OUDEVH+1 DCA CDOUT5 TAD CDOUT1+1 CIF 10 JMS I [200 1 /GET HANDLER CDOUT5, 0 JMP I (NOOFIL TAD CDOUT5 JMS SETUNT /SET UP PHYSICAL UNIT FROM HANDLER ENTRY POINT JMS I (ROCK /CHECK THE TAPE JMP CDOUT3 /NOT PDP-10 DECTAPE JMS I (EXA40 /EXCESS 40 CONVERSION TAD UNIT10 JMP CDOUT4 /SET PARAMETERS CDOUT3, DCA CDEXT+1 TAD CDEXT+2 /GET LENGTH TAD (-400 SPA CLA TAD CDEXT+2 /O.K. - USE LENGTH CLL RTL RTL AND [7760 /8 BIT LENGTH TAD CDOUT1+1 /ADD IN DEVICE NUMBER CDOUT4, CDF 10 DCA I INDEX6 /SET DEVICE TAD CDNAME DCA I INDEX6 /SET NAME TAD CDNAME+1 DCA I INDEX6 TAD CDNAME+2 DCA I INDEX6 TAD CDEXT DCA I INDEX6 TAD CDEXT+1 DCA I INDEX6 CDF JMP I CDOUTX /EXIT SETUNT, 0 STL TAD (-7607 SZA /IF IT IS 7607, TAD (7 /ITS UNIT 0 AND (7 CLL CML RTR RTR DCA UNIT10 TAD DVTYPE AND (10 SNA CLA JMP I SETUNT /TC08 - FINISHED CLL TAD UNIT10 AND (7000 /TD8E ENTRY POINTS ARE STRANGE - TAD UNIT10 /MUST ROTATE UNIT NUMBER LEFT 1 SZL TAD (1000 DCA UNIT10 JMS I (TDUSET /SET UP TD8E OPCODES JMP I SETUNT PAGE CDINX, 0 /SET INPUT STUFF TAD (OUDEVH+1 DCA CDIN1 TAD CDDEV DCA CDIN2 /SET DEVICE TAD CDDEV+1 DCA CDIN2+1 CIF 10 JMS I [200 1 /GET HANDLER CDIN2, 0 0 CDIN1, 0 JMP I (NOOFIL TAD CDIN2+1 JMS GTDVTP /COMPARE DCB ENTRY WITH TC08 OR TD8E SZA CLA JMP CDIN3 /NOT DECTAPE TAD CDIN1 JMS I (SETUNT /SET UP UNIT NUMBER JMS I (ROCK /CHECK THE TAPE JMP CDIN3 /NOT PDP-10 DECTAPE JMS I (EXA40 /DO EXCESS 40 TAD INSEG CIA TAD UNIT10 /IS DIRECTORY IN CORE? SNA CLA JMP CDIN8 /YES - NO READ TAD CDNAME SNA CLA JMP CDIN7 /NO NAME - NO READ JMS I (READT DIRECT /READ DIRECTORY 144 TAD UNIT10 DCA INSEG /SET DIRECTORY IN CORE CDIN8, TAD (-5 DCA CNTR TAD (CDNAME-1 DCA INDEX0 TAD (CDINXX-1 DCA INDEX1 TAD I INDEX0 CDF 10 DCA I INDEX1 CDF ISZ CNTR JMP .-5 TAD (CDINXX-1 JMS I (IOPN10 /OPEN THE PDP-10 FILE JMP I (FNOTFD CDIN7, DCA CDIN4 TAD UNIT10 JMP CDIN6 CDIN3, TAD (CDNAME DCA CDIN4 TAD CDNAME SNA CLA JMP CDIN9 /NO LOOKUP IF NO NAME TAD CDIN2+1 CIF 10 JMS I [200 2 CDIN4, CDNAME /LOOKUP CDIN5, 0 JMP I (FNOTFD TAD CDIN5 TAD (400 SPA CLA CLL RTL RTL AND [7760 /GET LENGTH TAD CDIN2+1 /ADD DEVICE CDIN6, CDF 10 DCA I INDEX6 TAD CDIN4 DCA I INDEX6 /SET BLOCK STARTING CDF JMP I CDINX CDIN9, DCA CDIN4 JMP CDIN6-1 GTDVTP, 0 TAD (DCB-1 DCA TEMP1 CDF 10 TAD I TEMP1 /GET DCB ENTRY CDF DCA DVTYPE TAD DVTYPE AND (770 TAD (-210 SZA TAD (30 JMP I GTDVTP PAGE ROCK, 0 JMS GET10D /GET ENTRY IN TAPE TYPE TABLE SNA JMP ROCK4 /UNKNOWN - ROCK IT SMA CLA ISZ ROCK JMP I ROCK /EXIT GET10D, 0 TAD UNIT10 CLL RTL RTL TAD (PDP10D DCA TEMP5 /POINT TO KNOWN TABLE TAD I TEMP5 JMP I GET10D ROCK4, CLA CMA DCA I TEMP5 TAD DVTYPE AND (10 SZA CLA /WHAT KIND OF TAPE? JMP TDCHK /TD8E TAD (OBUF10-1 DCA I (7755 TAD (10 DTLB ROCK1, RTL RAL SZL CLA TAD (-400 TAD UNIT10 TAD (210 DTCA DTXA ROCK2, JMS DTWAIT ROCK3, SPA JMP ROCK1 CLA TAD (OBUF10-1 DCA I (7755 TAD (-600 DCA I (7754 TAD (30 DTXA DTSF DTRB JMP .-1 SPA CLA JMP ROCK4 /RETRY TAD [200 DTXA /STOP DRIVE TAD I (7754 SZA CLA JMP I ROCK /OS8 UNIT CLA IAC SET10, DCA I TEMP5 ISZ ROCK JMP I ROCK /PDP-10 UNIT DTWAIT, 0 /WAIT FOR DECTAPE FLAG DTSF DTRB SKP CLA JMP I DTWAIT KSF JMP DTWAIT+1 TAD [200 KRS TAD (-203 SZA CLA JMP DTWAIT+1 TAD [200 DTXA /STOP THE TAPE JMP I [7600 TDCHK, CLA STL RTR TAD TDUNIT IOTX1, SDLC CLA IOTX2, SDRC AND (100 /CHECK FOR TAPE NOT READY SZA CLA JMP TDCHK /WAIT FOR TAPE TO COME UP TAD TDUNIT TAD (1000 IOTX3, SDLC JMS SKIP4 JMS SKIP4 IOTX4, SDSS JMP .-1 IOTX5, SDRC AND [77 TAD (-26 SZA CLA /WAIT FOR GUARD JMP IOTX4 DCA TDT TDCLP, JMS SKIP4 ISZ TDT AND [77 TAD (-51 /SEARCH FOR SOME CRAP NEAR END OF RECORD SZA CLA JMP TDCLP TAD I (UNIT IOTX6, SDLC /STOP TAPE CLA TAD TDT TAD (-611 /9 WORDS FOR GOOD LUCK SZA CLA JMP I ROCK STL RTL /SET TABLE ENTRY TO 2 FOR TD8E TAPE JMP SET10 SKIP4, 0 IOTX7, SDSQ JMP .-1 IOTX8, SDRC JMP I SKIP4 TDT, 0 PAGE FIELD 0 /DUMP PG 0 LITERALS HERE /TD8E DECTAPE ROUTINE /VERSION 01 /JULY 2 1971 GB/RL/EF /COPYRIGHT 1971 DIGITAL EQUIPMENT CORP. / MAYNARD, MASS. /ABSTRACT-- / THE ROUTINE DESCRIBED AND LISTED HERE IS A GENERAL /DATA HANDLER FOR THE TD8E DECTAPE SYSTEM. THE ROUTINE /CONTAINS SEARCH, READ, AND WRITE FUNCTIONS IN A FORMAT /WHICH IS COMPATIBLE WITH PS/8 DEVICE HANDLER CALLING /SEQUENCES. /THIS ROUTINE CAN BE RE-EDITED AND ASSEMBLED TO PRODUCE /VARIATIONS ON THE BASIC TD8E SYSTEM. ASSEMBLY PARAMETERS /CONTROL: /A) WHAT DRIVES (UNITS 0-7) WILL BE USED /B) THE ORIGIN OF THE TWO PAGE ROUTINE /C) WHAT MEMORY FIELD THE ROUTINE WILL RUN IN /D) THE SIZE OF THE DECTAPE BLOCK TO BE READ/WRITTEN /FOLLOWING ARE THE PARAMETERS SET UP FOR THE STANDARD /DEC VERSION OF THIS ROUTINE: DRIVE=10 /UNITS 0 AND 1 SELECTED ORIGIN=6200 /ENTRIES AT 6200 AND 6204 AFIELD=0 /INITIAL FIELD SETTING MFIELD=00 /AFIELD*10=MFIELD WDSBLK=600 /384 WORDS PER BLOCK /THE USE OF THE PARAMETERS IS AS FOLLOWS: / DRIVE: DRIVE DETERMINES WHICH UNITS WILL BE SELECTED / DRIVE=10 IMPLIES UNITS 0 &1 / DRIVE=20 IMPLIES UNITS 2&3 / DRIVE=30 IMPLIES UNITS 4&5 / DRIVE=40 IMPLIES UNITS 6&7 /ORIGIN: ALTERING ORIGIN CAUSES ASSEMBLY IN A DIFFERENT / MEMORY LOCATION. WHEN CHANGING ORIGIN KEEP IN MIND /THAT THIS IS A TWO PAGE ROUTINE. /AFIELD: AFIELD DETERMINES THE INITIAL FIELD SETTING FOR THE / LOADER. PERMISSIBLE VALUES FOR AFIELD ARE 0 TO 7. /MFIELD: MFIELD IS USED IN A CIF CDF MFIELD INSTRUCTION. / THE VALUE INSERTED FOR MFIELD SHOULD BE 10(8) TIMES / THE VALUE FOR AFIELD. THE PERMISSIBLE VALUES ARE 00-70. /WDSBLK: WDSBLK GOVERNS HOW MANY WORDS THE ROUTINE THINKS ARE / IN A DECTAPE BLOCK. THE STANDARD VALUE IS 201(8) OR / 128 DECIMAL. NOTE THAT THE FUNCTION WORD BIT 10 CAN / BE USED TO SUBTRACT ONE FROM WDSBLK. THE VALUE USED / FOR WDSBLK SHOULD BE THE NUMBER OF WORDS THE TAPE WAS / FORMATTED TO CONTAIN. /IF WE WANT A HANDLER FOR UNITS 2&3 TO RESIDE IN /FIELD 2 AT LOCATION 3000 AND READ/WRITE 256(10) WORDS /PER BLOCK, THE PARAMETERS WOULD BE: / DRIVE=20 / ORIGIN=3000 / AFIELD=2 / MFIELD=20 / WDSBLK=400 /THE CALL TO THE SUBROUTINE FOLLOWS BASICALLY THE /CALLING SEQUENCE FOR PS/8 DEVICE HANDLERS. /THE CALLING SEQUENCE IS: / CDF CURRENT / CIF MFIELD /MFIELD=FIELD ASSEMBLED IN / JMS ENTRY /ENTRY=ORIGIN (EVEN NUMBERED DRIVE /AND ORIGIN+4 FOR ODD NUMBERED DRIVE. / ARG1 / ARG2 / ARG3 / ERROR RETURN / NORMAL RETURN /THE ARGUMENTS ARE: /ARG1: FUNCTION WORD BIT0: 0=READ, 1=WRITE / BITS 1-5: # BLOCKS IN OPERATION / BITS 6-8: FIELD OF BUFFER AREA / BIT 9: UNUSED / BIT 10: # OF WORDS/BLOCK. / 0= WDSBLK, 1=WDSBLK-1 / BIT 11: 1=START FORWARD, 0=REVERSE /ARG2: BUFFER ADDRESS FOR OPERATION /ARG3: STARTING BLOCK FOR OPERATION /ERRORS: THE HANDLER DETECTS TWO TYPES OF ERRORS: /A) FATAL ERRORS- PARITY ERROR, TIMING ERROR, / TOO GREAT A BLOCK NUMBER / FATAL ERRORS TAKE ERROR RETURN WITH THE / AC=4000. /B) NON-FATAL- SELECT ERROR. / IF NO PROPER UNIT IS SELECTED, THE ERROR / RETURN IS TAKEN WITH CLEAR AC. /FATAL ERRORS TRY THREE TIMES BEFORE TAKING ERROR RETURN. /THE NORMAL RETURN IS TAKEN AFTER ALL INDICATED /BLOCKS HAVE BEEN TRANSFERRED. THE AC IS CLEAR. /THE TD8E IOT'S ARE: SDSS=7001-DRIVE /SKIP ON SINGLE LINE FLAG SDST=7002-DRIVE /SKIP ON TIMING ERROR SDSQ=7003-DRIVE /SKIP ON QUAD LINE FLAG SDLC=7004-DRIVE /LOAD COMMAND REGISTER SDLD=7005-DRIVE /LOAD DATA REGISTER SDRC=7006-DRIVE /READ COMMAND REGISTER SDRD=7007-DRIVE /READ DATA REGISTER /THE IOT'S IN GENERAL ARE 677X,676X,675X,AND 674X. /THE OTHERS CONTROL UNITS 2-7. BLOCK=DTA1 FIELD AFIELD *ORIGIN DTA0, 0 /ENTRY POINT FROM UNIT 0 CLA CLL /0 TO LINK JMP DTA1X C1000, 1000 DTA1, 0 /UNIT 2 ENTRY CLA CLL CML /1 TO LINK TAD DTA1 DCA DTA0 /PICK UP ARGS AT DTA0 DTA1X, RAR DCA UNIT /LINK TO UNIT POSITION RDF TAD C6203 /GET DATA FIELD AND SETUP RETURN DCA LEAVE TAD I DTA0 /GET FUNCTION WORD DIO01, SDLD /PUT FUNCTION INTO DATA REGISTER CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER /BLOCK INTO LINK SZL CLA /KNOCK ONE OFF WDSBLK? IAC /YES TAD MWORDS DCA WCOUNT /STORE MASTER WORD COUNT ISZ DTA0 /TO BUFFER TAD I DTA0 DCA BUFF ISZ DTA0 /TO BLOCK NUMBER TAD I DTA0 DCA BLOCK ISZ DTA0 /POINT TO ERROR EXIT CIF CDF MFIELD /TO ROUTINES DATA FIELD DIO02, SDRD /GET FUNCTION INTO AC CLL RAL AND CM200 /GET # PAGES TO XFER DCA PGCT DIO03, SDRD C374, AND C70 /GET FIELD FOR XFER TAD C6203 /FORM CDF N DCA XFIELD /IF=0 AND DF=N AT XFER. CLA CLL CMA RTL DCA TRYCNT /3 ERROR TRIES TAD UNIT /TEST FOR SELECT ERROR DIO04, SDLC DIO05, SDRC AND C100 SZA CLA JMP FATAL-1 DIO06, SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG. DCA I CXFUN TAD WCOUNT DCA I CXWCT DIO07, SDRD /GET MOTION BIT TO LINK CLL RAR JMP GO /AND START THE MOTION. DIO08, RWCOM, SDST /ANY CHECKSUM ERRORS? SZA CLA /OR CHECKSUM ERRORS? JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS /SET AT RWCOM. GETCHK SETS IT. TAD PGCT /NO ERROR..FINISHED XFER? TAD CM200 SNA JMP EXIT /ALL DONE. GET OUT DCA PGCT /NEW PAGE COUNT ISZ BLOCK /NEXT BLOCK TO XFER TAD WCOUNT /FORM NEXT BUFFER ADDRESS CIA TAD BUFF DCA BUFF CLL CML /FORCES MOTION FORWARD GO, CLA CML RTR /LINK BECOMES MOTION BIT TAD C1000 TAD UNIT /PUT IN 'GO' AND UNIT # DIO09, SDLC /LOOK FOR BLOCK NO. JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK JMS I CRDQUD CM200, 7600 /COULD HAVE SAVED A LOC. HERE DIO10, SRCH, SDSS JMP .-1 /WAIT FOR SINGLE LINE FLAG DIO11, SDRC CLL RTL /DIRECTION TO LINK. INFO BITS /ARE SHIFTED. AND C374 /ISOLATE MARK TRACK BITS TAD M110 /IS IT END ZONE? SNA /THE LINK STAYS SAME THRU THIS JMP ENDZ TAD M20 /CHECK FOR BLOCK MARK SZA CLA JMP SRCH DIO12, SDRD /GET THE BLOCK NUMBER SZL /IF WE ARE IN REVERSE, LOOK FOR 3 /BLOCKS BEFORE TARGET BLOCK. THIS /ALLOWS TURNAROUND AND UP TO SPEED. TAD C3 /REVERSE CMA TAD BLOCK CMA /IS IT RIGHT BLOCK? SNA JMP FOUND /YES..HOORAY! M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT? /ABOVE SNA IS SUPERFLUOUS. JMP SRCH /YES DIO13, ENDZ, SDRC /WE ARE IN THE END ZONE CLL RTL /DIRECTION TO LINK /V3C SZL CLA /ARE WE IN REVERSE? JMP GO /YES..TURN US AROUND /IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR TRY3, CLA CLL /V3C ISZ TRYCNT JMP GO /TRY 3 TIMES JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN EXIT, ISZ DTA0 CLL CML /AC=0 ON NORMAL RETURN FATAL, TAD UNIT DIO14, SDLC /STOP THE UNIT CLA CML RAR LEAVE, HLT JMP I DTA0 C6203, 6203 CRDQUD, RDQUAD WCOUNT, 0 BUFF, 0 MWORDS, -WDSBLK UNIT, 0 CXFUN, XFUNCT M20, -20 PGCT, 0 CXWCT, XWCT C100, 100 TRYCNT, -3 *ORIGIN+170 FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION? JMP GO /WRONG..TURN AROUND TAD UNIT /PUT UNIT INTO LINK CLL RAL /AC IS NOW 0 C70, 70 /********DON'T MOVE THIS!!!!****** C3, 3 TAD BUFF /GET BUFFER ADDRESS XFIELD, HLT /INTO NEXT PAGE *ORIGIN+200 CIF MFIELD DCA XBUFF /SAVE ADDRESS RAR /NOW GET UNIT # DCA XUNIT SDRC /V3C SDLC /V3C TAD XWCT DCA DWORDS /WORD COUNTER DIO15, REVGRD, SDSS JMP .-1 /LOOK FOR REVERSE GUARD DIO16, SDRC AND K77 TAD CM32 /IS IT REVERSE GUARD? SZA CLA JMP REVGRD /NO.KEEP LOOKING TAD XFUNCT /GET FUNCTION READ OR WRITE K7700, SMA CLA JMP READ /NEG. IS WRITE DIO17, WRITE, SDRC AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS SZA CLA JMP I CFATAL /FATAL ERROR. LINK MUST BE ON / JMS RDQUAD /NO ONE EVER USES THIS WORD! / CLA STA /V3C HACK FOR PDP-6 JMS WRQUAD /V3C 7777 FOR REV CHECKSUM AND SKIP OVER LOCK TAD C1400 TAD XUNIT /INITIATE WRITE MODE DIO18, SDLC CLA CMA JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM CLA CMA DCA CHKSUM WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE! JMS WRQUAD ISZ XBUFF /BUMP CORE POINTER K77, 77 /ABOVE MAY SKIP ISZ DWORDS /DONE THIS BLOCK? JMP WRLP /NOT YET..LOOP A WHILE TAD XFUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK? CLL RTR /IF NO, WRITE A 0 WORD SZL CLA JMS WRQUAD /WRITE A WORD OF 0 JMS GETCHK /DO THE CHECK SUM JMS WRQUAD /WRITE FORWARD CHECKSUM JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN JMS WRQUAD /V3C WRITE REST OF CHECKSUM [PDP-6] JMP I CRWCOM READ, JMS RDQUAD JMS RDQUAD JMS RDQUAD /SKIP CONTROL WORDS AND K77 TAD K7700 /TACK 7700 ONTO CHECKSUM. DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY RDLP, JMS RDQUAD JMS EQUFUN /COMPUT CHECKSUM AS WE GO DCA I XBUFF /IT GETS CONDENSED LATER ISZ XBUFF C300, 300 /PROTECTION ISZ DWORDS /DONE THIS OP? JMP RDLP /NO SUCH LUCK TAD XFUNCT /IF OP WAS FOR WDSBLK-1, READ AND CLL RTR /CHECKSUM THE LAST TAPE WORD SNL CLA JMP RDLP2 JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK JMS EQUFUN /CHECKSUM IT RDLP2, JMS RDQUAD /READ CHECKSUM AND K7700 JMS EQUFUN JMS GETCHK /GET SIX BIT CHECKSUM JMP I CRWCOM WRQUAD, 0 /WRITE OUT A 12 BIT WORD JMS EQUFUN /ADD THIS TO CHECKSUM DIO19, SDSQ /SKIP ON QUADLINE FLAG JMP .-1 DIO20, SDLD /LOAD DATA ONTO BUS CLA /SDLD DOESN'T CLEAR AC JMP I WRQUAD RDQUAD, 0 /READ A 12 BIT WORD DIO21, SDSQ JMP .-1 DIO22, SDRD /READ DATA JMP I RDQUAD EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM CMA DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE CIA /IS ASSOCIATIVE, WE CAN DO IT 12 CLL RAL /BITS AT A TIME AND CONDENSE LATER. TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES: TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B) DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B) TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B)) CMA JMP I EQUFUN GETCHK, 0 /FORM 6 BIT CHECKSUM CLA TAD CHKSUM CMA CLL RTL RTL RTL JMS EQUFUN CLA CLL CML /FORCES LINK ON AT RWCOM TAD CHKSUM AND K7700 JMP I GETCHK CFATAL, FATAL CRWCOM, RWCOM XFUNCT, 0 CM32, -32 C1400, 1400 CHKSUM, 0 DWORDS, 0 XBUFF, 0 XWCT, 0 EQUTMP, 0 XUNIT, 0 PAGE FIELD 1 *2000 ZFREE, ZBLOCK 5 INCTR, 0 INHNDL, 0 INPTR, 0 DELPS1, 0 JMS I (200 4 MOUTPU+1 0 ISZ DELPS1 CIF CDF 0 JMP I DELPS1 ICHARP, 0 ISZ INJMP ISZ INCHCT INJMPP, JMP INJMP TAD INEOF SZA CLA JMP INEXIT INGBUF, TAD INCTR CLL TAD (INRECS SNL DCA INCTR SZL ISZ INEOF CLL CML CMA RTR RTR RTR TAD (INCTL+1 DCA INCTLW CIF 0 JMS I INHNDL INCTLW, 0 INBUFP, INBUF INREC, 0 JMP INERRX INBREC, TAD INREC TAD (INRECS DCA INREC TAD INCTLW AND (7600 CLL RAL TAD INCTLW AND (7600 CMA DCA INCHCT TAD INJMPP DCA INJMP TAD INBUFP DCA INPTR JMP ICHARP+1 INERRX, ISZ INEOF SMA CLA JMP INBREC INERR, CLL CLA CML RAR JMP INEXIT INJMP, HLT JMP INCHR1 JMP INCHR2 INCHR3, TAD INJMPP DCA INJMP TAD I INPTR AND (7400 CLL RTR RTR TAD INCTLW RTR RTR ISZ INPTR JMP INCOMN INCHR2, CDF 0 TAD I (MODE CDF 10 SMA SZA CLA JMP IC8A1 TAD I INPTR AND (7400 DCA INCTLW ISZ INPTR IC8A2, TAD I INPTR INCOMN, AND (377 TAD (-232 SNA JMP INEXIT TAD (232 ISZ ICHARP INEXIT, CIF CDF 0 JMP I ICHARP INEOF, 1 INCHCT, -1 INCHR1, CDF 0 TAD I (MODE CDF 10 SPA SNA CLA JMP IC8A2 IC8A3, TAD I INPTR ISZ INPTR JMP INEXIT-1 IC8A1, TAD INJMPP DCA INJMP ISZ INCHCT JMP IC8A3 PAGE OOPNPS, 0 TAD (MOUTPU+1 DCA OUBLK TAD I (MOUTPU JMS I (200 3 OUBLK, 0 OUELEN, 0 JMP OUEFAL DCA OUCCNT JMS I (OUSETP ISZ OOPNPS OUEEXT, CIF CDF 0 JMP I OOPNPS OUEFAL, TAD I (MOUTPU AND (7760 SNA CLA JMP OUEEXT TAD I (MOUTPU AND (17 DCA I (MOUTPU JMP OOPNPS+1 OUHNDL, 0 OUTDMP, 0 DCA OUCTLW TAD OUCCNT SNA ISZ OUCTLW TAD OUBLK DCA OUREC TAD OUCTLW CLL RTL RTL RTL AND (17 TAD OUCCNT DCA OUCCNT TAD OUCCNT CLL CML TAD OUELEN SNL SZA CLA JMP I OUTDMP CIF 0 JMS I OUHNDL OUCTLW, 0 OUBUF OUREC, 0 JMP I OUTDMP ISZ OUTDMP JMP I OUTDMP OCLOSE, 0 CDF 0 TAD I (MODE CDF 10 SMA SZA CLA JMP OULLLP+2 JMS I (OTYPE AND (770 TAD (-PTP SZA CLA TAD (232 JMS I (OCHARP JMP OURET JMS I (OCHARP JMP OURET OULLLP, JMS I (OCHARP JMP OURET JMS I (OTYPE SPA CLA TAD (100 TAD (77 AND I (OUDWCT SZA CLA JMP OULLLP TAD I (OUDWCT TAD (OUCTL&3700 SNA JMP OUDUMP TAD (4010 JMS OUTDMP JMP OURET OUDUMP, TAD I (MOUTPU JMS I (200 4 MOUTPU+1 OUCCNT, 0 SKP ISZ OCLOSE OURET, CIF CDF 0 JMP I OCLOSE PAGE OUTEMP, 0 OUJMP, HLT JMP OCHR1 JMP OCHR2 OCHR3, TAD OUTEMP CLL RTL RTL AND (7400 TAD I OUPOLD DCA I OUPOLD TAD OUTEMP CLL RTR RTR RAR AND (7400 TAD I OUPTR OC8A1, DCA I OUPTR TAD OUJMPP DCA OUJMP ISZ OUPTR ISZ OUDWCT JMP OUCOMN TAD (OUCTL JMS I (OUTDMP JMP OUCRET JMS OUSETP JMP OUCOMN OUSETP, 0 TAD (OUCTL&3700 CIA DCA OUDWCT TAD (OUBUF DCA OUPTR TAD OUJMPP DCA OUJMP JMP I OUSETP OCHARP, 0 DCA OUTEMP RDF TAD (CIF CDF 0 DCA OUCRET CDF 0 TAD I (MODE SMA SZA CLA JMP .+4 TAD OUTEMP AND (377 DCA OUTEMP CDF 10 ISZ OUJMP OUJMPP, JMP OUJMP OCHR2, CDF 0 TAD I (MODE CDF 10 SMA SZA CLA JMP OC8A2 TAD OUPTR DCA OUPOLD ISZ OUPTR OCHR1, TAD OUTEMP DCA I OUPTR OUCOMN, ISZ OCHARP OUCRET, CIF CDF 0 JMP I OCHARP OUPOLD, 0 OUPTR, 0 OUDWCT, 0 OTYPE, 0 TAD I (MOUTPU AND (17 TAD (DCB-1 DCA OUSETP TAD I OUSETP JMP I OTYPE CDINXX, ZBLOCK 5 OC8A2, ISZ OUPTR TAD OUTEMP JMP OC8A1 PAGE $-$-$ |
> > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 | $JOB ASSEMBLE AND LINK RESORC.MA .MAC OUT:RESORC<IN:RESORC.MA .MAC OUT:RESOV0<IN:RESOV0.MA .MAC OUT:RESOV1<IN:RESOV1.MA .MAC OUT:RESOV2<IN:RESOV2.MA .MAC OUT:RESOVD<IN:RESOVD.MA .LINK OUT:RESORC,RESOV0,RESOV1,RESOV2,RESOVD/9/S=12000 .DEL OUT:RESO??.RB .COPY OUT:RESORC.SV<DSK:RESORC.SV .DEL DSK:RESORC.SV $END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 | /15 OS/8 RESOURCES PROGRAM / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977,1978 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / J.M. /SAVE INFO: /INSTRUCTIONS FOR CREATING RESORC.SV V5A / .MAC RESORC / .MAC RESOV0 / .MAC RESOV1 / .MAC RESOV2 / .MAC RESOVD / .LINK RESORC,RESOV0,RESOV1,RESOV2,RESOVD/9/S=12000 /CORE MAP: /0000-1777 C.D. /2000-2377 DEVICE NAME AND LENGTH TABLE /2400-2777 OUTPUT BUFFER (DOESN'T OVERLAP BETA REGISTER) /3000-3377 INPUT HANDLER /3400-3777 OUTPUT HANDLER /4000-7377 INPUT DIRECTORY /4000-7577 INPUT HANDLERS (LOSE 2ND HALF OF LAST ONE) /FIELD 1 /10000-11777 USR /11400-11777 INPUT KBM /12000-15577 PROGRAM /15600-16177 INPUT BLOCK 0 /16200-17577 INPUT USR INPBL0=5600 INPKBM=1400 INPUSR=6200 INPHND=4000 FAST=20 DIG=21 EXTEN=22 DEVNUM=23 /DEVICE NUMBER OF HANDLER CNT=24 PDNT=25 /PTS TO DEVICE NAME TABLE TEMP=26 PUDNT=27 /PTS TO USER DEVICE NAME TABLE PDHIT=30 /PTS TO DEVICE HANDLER INFO TABLE PDCWT=31 /PTS TO DEVICE CONTROL WORD TABLE PTYP=32 LFT=33 RT=LFT+1 DVNO=35 BLOC=36 PDHRT=37 /POINTS TO DEVICE HANDLER RESIDENCY TABLE UN=6 X0=10 XR1=11 RESVERSION="A /FIXES SINCE FIELD TEST RELEASE: /1. 'INPUT ERROR' MESSAGE NO LONGER GARBLED /2. '%NON SYSTEM DEVICE' NEVER PRINTS HANDLERS /FIXES FOR MAINTENANCE RELEASE (V3C): /3. INCORPORATED PATCH SEQ NO 1 ALLOWS DISTINGUISHING BETWEEN / HIGH AND LOW SPEED PTR'S AND ADDITIONAL CASSETTES / [DSN FEB 1975] /4. FIXED LENGTHS OF DF32'S AND RF08'S [SUPERSEDES PATCH SEQ #2 / DSN APR 1975] /5. CHANGED VERSION NUMBER TO V3, UPDATED COPYRIGHT /6. ADDED DUMP, LST, AND RX-- TO INTERNAL NAME TABLES /7. ADDED DETAILS ABOUT DUMP AND FLOPPIES TO TABLES /V3D CHANGES: /8. ADDED NAMES SLU AND LQP TO TABLES /9. CAN DISTINGUISH LQP KIND OF LPTR /10. FIXED BUG ABOUT DUMPING BUFFER FULL OF NULLS /11. REMOVED LITTLE-USED 'OUT', 'DEV' FROM NAME TABLES /VERSION 5 /12. ADDED RL01 SUPPORT /13. CONVERTED TO MACREL /14. ADDED LINKER OVERLAYS /15. ADDED RX02 SUPPORT /16. ADDED VXA0 SUPPORT .EXTERNAL VERSN,SIZE,BLOCK,MODE, ENTRY /IN OV3 .EXTERNAL DIRT,KIND,CNTSLT,ZEROSL .EXTERNAL TYPTBL .GLOBAL GETTYP,PUTNAM,PUTO,PUTSP,CRLF,DPRINT .GLOBAL FREEDV,OPRINT,READI,SLOTAB,PRINT FIELD 1 *2000 START, SKP JMP NOCD /CHAIN ENTRY POINT / JMS I (7700 /WE ASSUME THE USR IS IN CORE / 10 /DON'T HAVE TO LOCK USR IN CORE IF JSW SET RIGHT CD, JMS I (200 5 /COMMAND DECODE 2331 /DEFAULT INPUT EXTENSION = 'SY' NOCD, DCA CTRLO JMS OPENO /OPEN OUTPUT FILE DCA FILENO TAD (7617 DCA INPTR /POINT TO FIRST INPUT FILE TAD I (7644 AND (4 / V OPTION? SZA CLA JMS TYPEV /OUTPUT VERSION # JMS SETSW DCA FLAG TAD I (7617 SNA CLA JMS SPCASE /NO FIRST ARG MEANS USE SYS: IN SPECIAL SENSE JMP INL2 INLOOP, TAD I INPTR /GET INPUT FILE # AND LENGTH SNA CLA JMP FINI /NO MORE INPUT JMS PRDASH INL2, TAD I INPTR AND (17 DCA DVNO /GET 4-BIT DEVICE # ISZ FILENO TAD I INPTR AND (7760 /GET NEGATIVE OF FILE LENGTH DCA FILEN ISZ INPTR TAD I INPTR /GET STARTING BLOCK OF FILE DCA SBLOCK ISZ INPTR TAD DVNO JMS GETDCW SMA CLA JMP NOFLST /DEVICE IS NOT FILE STRUCTURED JMS OPENI /GET INPUT HANDLER JMS DIRECT /ASCERTAIN DIRECTORY INFO JMS HNDLRS /ASCERTAIN HANDLERS TAD EXTEN SZA CLA JMS I (CNTSLT JMS MONVER /ASCERTAIN MONITOR VERSION # NEXT, JMS CRLF DCA FLAG JMP INLOOP NOFLST, JMS PRINT TEXT /%DEV IS NOT FILE STRUCTURED/ JMP NEXT FINI, JMS CLOSEO /CLOSE OUTPUT FILE FINIS, TAD I (7642 SMA CLA JMP CD /COMMAND LINE ENDED WITH CR CIF CDF 0 /COMMAND LINE ENDED WITH ALTMODE JMP I (7605 /GO BACK TO MONITOR /CURRENT PIP /Y FILES ARE 50 (DEC) = 62 (OCTAL) BLOCKS LONG GETDCW, 0 AND (17 TAD (7757 /GET PTR INTO DEVICE CONTROL WORD TABLE DCA DCW TAD I DCW /GET D.C.W. DCA DCW /SAVE (WHY?) TAD DCW JMP I GETDCW SETSW, 0 DCA FAST DCA EXTEN CLA IAC AND I (7643 SNA CLA JMP NOTF ISZ FAST JMP I SETSW NOTF, TAD I (7643 AND (200 SNA CLA JMP I SETSW ISZ EXTEN ISZ FAST JMP I SETSW /FAST GT 0 IF /L OR /E SWITCH SET /EXTEN=1 IF /E SWITCH SET AND /L NOT SET INPTR, 0 /POINTS TO INPUT FILE LIST FILEN, 0 /INPUT FILE LENGTH (NEG IN BITS 0-7) DCW, 0 /INPUT DEVICE CONTROL WORD FILENO, 0 /INPUT FILE NUMBER IN INPUT LIST SBLOCK, 0 /STARTING BLOCK # OF INPUT FILE FLAG, 0 /NON-ZERO MEANS SPECIAL CASE OF NO FIRST ARG SPCASE, 0 ISZ FLAG /NOTE SPECIAL CASE CLA IAC DCA I (7617 /FORCE FIRST INPUT TO BE SYS: JMP I SPCASE PAGE PRINT, 0 TAD I PRINT DCA PRT ISZ PRINT TAD PRT JMS RTR6 JMS PR JMP I PRINT TAD PRT JMS PR JMP I PRINT JMP PRINT+1 PRT, 0 RTR6, 0 TTY212, RTR RTR RTR JMP I RTR6 PR, 0 AND (77 SNA JMP I PR TAD (240 AND (77 TAD (240 JMS PUTO ISZ PR JMP I PR TPRINT, 0 /PRINT TO TELETYPE CLA TAD I TPRINT DCA PRT ISZ TPRINT TAD PRT JMS RTR6 JMS TPUT TAD PRT JMS TPUT JMP TPRINT+1 TPUT, 0 AND (77 SNA JMP PUTCR TAD (240 AND (77 TAD (240 JMS TYPE JMP I TPUT PUTCR, JMS TCRLF JMP I TPRINT TYPE, 0 DCA TYTEM TAD CTRLO SZA CLA JMP I TYPE /DON'T TYPE IF CONTROL/O FLAG SET KSF SKP JMS LOOKC TAD TYTEM A, JMS TYPE2 JMP I TYPE TYTEM, 0 CTRLO, 0 /NON-ZERO MEANS CTRLO/O WAS STRUCK TYPE2, 0 TLS TSF JMP .-1 CLA JMP I TYPE2 LOOKC, 0 KRB AND (177 TAD (-17 SNA /IS IT ^O? JMP CTROLO /YES TAD (17-3 /NO SZA CLA /IS IT ^C? JMP I LOOKC /NO CIF CDF 0 /YES JMP I (7605 CTROLO, TAD ("^ JMS TYPE2 TAD ("O JMS TYPE2 ISZ CTRLO TAD (215 JMS TYPE2 TAD TTY212 JMP A /*** NEEDS CTRL/S CTRL/Q SUPPORT TYPEV, 0 JMS PRINT TEXT /RESORC V5 / *.-2 RESVERSION&77+6500 /THIS OVERLAYS ABOVE VERSION NO /AND THE 6500 INCREASES TO 6600 /FOR THE NEXT RELEASE *.+1 JMS CRLF JMP I TYPEV CRLF, 0 TAD (215 JMS PUTO TAD TTY212 JMS PUTO JMP I CRLF TCRLF, 0 TAD (215 JMS TYPE TAD TTY212 JMS TYPE JMP I TCRLF DLST, -1750 /1000 -144 /100 -12 /10 -1 /1 0 /END PAGE CLOSEO, 0 /CLOSE OUTPUT FILE TAD (232 /PUT ^Z IN BUFFER JMS PUTO TAD (-577 /V3D DCA KNT /SEND 577 NULLS TO OUTPUT BUFFER JMS PUTO /THIS GUARANTEES TO PURGE IT ISZ KNT JMP .-2 TAD I (7600 JMS I (200 4 /CLOSE L7601, 7601 /POINTER TO OUTPUT FILE NAME OUTLEN, 0 /LENGTH OF OUTPUT FILE HLT /SYSTEM ERROR, CANNOT OCCUR JMP I CLOSEO OPENO, 0 JMS OINIT DCA OUTLEN TAD (3401 DCA OENTRY TAD I (7600 SNA CLA JMP DEFALT TAD I (7600 JMS GETDCW RAL SPA CLA JMP NOWR /READ ONLY TAD I (7600 JMS I (200 1 /FETCH DEVICE HANDLER (POSSIBLY 2-PAGE) OENTRY, 3401 /INTO PAGE 3400 HLT /SYSTEM ERROR CANNOT OCCUR O2, TAD L7601 DCA SBLKO TAD I L7601 SNA TAD (2205 /RE DCA I L7601 /DEFAULT OUTPUT NAME IS RE DCA OLEN TAD I (7604 SNA TAD (1423 /LS DCA I (7604 / .LS IS DEFAULT OUTPUT EXTENSION TAD I (7600 JMS I (200 3 /ENTER OUTPUT FILE SBLKO, 7601 /POINTS TO OUTPUT FILE NAME OLEN, 0 /COMPLEMENT OF ACTUAL OUTPUT FILE LENGTH JMP DEVFUL /OUTPUT DEVICE FULL TAD SBLKO DCA OBLOCK TAD OLEN SZA TAD (-1 DCA OLEN JMP I OPENO KNT, 0 DEFALT, TAD (3100 /SET TTY: AS DEFAULT OUTPUT DEVICE DCA DVN TAD (3401 DCA OENT JMS I (200 1 /FETCH HANDLER BY NAME 2424 /TT DVN, 3100 /DEVICE TTY: OENT, 3401 /INTO 3400 JMP NOTTY /NO TTY: ON SYS: TAD OENT DCA OENTRY TAD DVN DCA I (7600 JMP O2 OUTERR, JMS TPRINT TEXT /?OUTPUT ERROR/ JMS CRLF JMP FINIS TRY09, 0 TAD (60 CIA TAD NAM DCA DIG TAD DIG CLL TAD (-10 /TRY DIGITS 0-7 SZL CLA JMP I TRY09 TAD DIG TAD (60 TAD RT DCA RT JMP GOTIT PUTSP, 0 TAD (40 JMS PUTO JMP I PUTSP PAGE PUTO, 0 AND (377 CDF 0 JMP I PUTJMP PUTJMP, X1 X1, DCA I PUTPT1 TAD (X2 DCA PUTJMP PUTLV, CDF 10 JMP I PUTO /RETURN X2, DCA I PUTPT2 TAD (X3 DCA PUTJMP JMP PUTLV X3, DCA TMP TAD TMP CLL RTL RTL AND (7400 TAD I PUTPT1 DCA I PUTPT1 TAD TMP CLL RTR RTR RAR AND (7400 TAD I PUTPT2 DCA I PUTPT2 ISZ PUTPT1 ISZ PUTPT1 ISZ PUTPT2 ISZ PUTPT2 TAD (X1 DCA PUTJMP ISZ PUTKNT JMP PUTLV CDF 10 /BUFFER FILLED ISZ OLEN SKP JMP DEVFUL /CAN'T WRITE ANYMORE CIF 0 TAD OENTRY DCA OENTR /GET ON SAME PAGE JMS I OENTR 4200 /WRITE 1 BLOCK 2400 /FIELD 0, LOC 2400 OBLOCK, 0 /OUTPUT BLOCK # JMP OUTERR ISZ OUTLEN ISZ OBLOCK /POINT TO NEXT BLOCK JMS OINIT JMP I PUTO /RETURN OENTR, 0 PUTPT1, 0 PUTPT2, 0 PUTKNT, 0 TMP, 0 DIRECT, 0 TAD SBLOCK SZA CLA JMP I DIRECT /NO DIRECTORY INFO FOR FILES JMS I (DIRT JMP I DIRECT SLOTAB, ZBLOCK 10 /KEEPS TRACK OF USED SLOTS GETTYP, 0 CDF 0 TAD I PTYP CDF 10 JMP I GETTYP PUTNAM, 0 DCA PUTNMT TAD I PUTNMT JMS PUTPAK ISZ PUTNMT TAD I PUTNMT JMS PUTPAK JMP I PUTNAM PUTNMT, 0 /THIS PRINTS A 4 CHAR NAME, ARG IN AC. COMB, 0 /TEMP TAD LFT TAD RT SMA TAD (4000 JMP I COMB PAGE NAME, 0 DCA NAM TAD FAST SZA CLA JMP TRY1 STA TAD DEVNUM SNA CLA JMP TRY1 TAD (", JMS PUTO TRY1, TAD (LIST1 DCA NM1 LP1, TAD I NM1 SNA JMP TRY2 DCA LFT ISZ NM1 /TRY A-B TAD (-2 /CHANGE TO -4 TO TRY A-D DCA TEMP DCA RT LP1X, TAD RT TAD (100 DCA RT JMS COMB JMS TRY09 ISZ TEMP JMP LP1X JMP LP1 NAM, 0 /SPECIFIED NAME NM1, 0 TRY2, TAD (LIST2 DCA NM1 LP2, TAD I NM1 SNA JMP TRY3 DCA LFT ISZ NM1 TAD I NM1 ISZ NM1 DCA RT JMS COMB DCA TEMP TAD TEMP CIA TAD NAM SNA CLA JMP GOTIT TAD TEMP JMS TRY09 JMP LP2 /TRY0 SHOULD BE SPECIAL CASE TESTS TRY3, TAD NAM JMS RTR6 AND (37 SNA JMP TRY4 JMS SETIFA CLL RAR JMS RTR6 DCA LFT TAD NAM AND (77 JMS SETIFA TAD LFT DCA LFT DCA RT JMP GOTIT SETIFA, 0 SNA JMP I SETIFA TAD (-33 SPA JMP LETR TAD (33-60 CLL TAD (-12 SZL JMP NODI TAD (12+60-33 LETR, TAD (33 JMP I SETIFA NODI, CLA TRY4, TAD NAM JMS NNAME NAMLV, JMP I NAME CMFLG, 0 /COMB, 0 / TAD RT / SZA CLA / STA / DCA CMFLG / TAD LFT / TAD RT / ISZ CMFLG / JMP I COMB / CLL RAL / STL RAR / JMP I COMB /TURN ON BIT 0 OF 1 WORD NAME LIST1, TEXT /DTMTLTTDCSRKRFRXVX/ PRDASH, 0 JMS PRINT TEXT /----/ JMS CRLF JMS CRLF JMP I PRDASH RTL6, 0 RTL RTL RTL JMP I RTL6 PAGE DEVFUL, JMS TPRINT TEXT /?OUTPUT DEV FULL/ JMP FINIS NOWR, JMS TPRINT TEXT /?OUTPUT DEV IS READ-ONLY/ JMP FINIS NOTTY, JMS TPRINT TEXT /?TTY DOES NOT EXIST/ JMP FINIS OINIT, 0 TAD (-200 DCA PUTKNT TAD (2400 DCA PUTPT1 TAD (2401 DCA PUTPT2 TAD (X1 DCA PUTJMP JMP I OINIT READI, 0 TAD I READI DCA ARG1 ISZ READI TAD I READI DCA ARG2 ISZ READI TAD I READI DCA ARG3 ISZ READI CIF 0 JMS I IENTRY ARG1, 0 ARG2, 0 ARG3, 0 JMP INERR JMP I READI /REURN INERR, JMS TPRINT TEXT /?INPUT ERROR/ JMP FINIS OPENI, 0 /FECTH INPUT HANDLER TAD (3001 /INTO PAGES 3000, 3200 DCA IENTRY TAD DVNO JMS I (200 1 /FETCH HANDLER IENTRY, 3001 HLT /SYSTEM ERROR, CAN'T OCCUR JMP I OPENI PAGE /DECIMAL PRINT /LINK OFF MEANS PRINT LEADING SPACES /LINK ON MEANS DON'T PRINT LEADING SPACES OR ZEROS DPRINT, 0 DCA DTM RAR DCA LNK DCA ZFLG TAD (DLST DCA PLST DPL2, DCA DYG DPLUP, TAD I PLST SNA JMP I DPRINT CLL TAD DTM SNL JMP NEGG ISZ DYG DCA DTM JMP DPLUP NEGG, CLA TAD DYG TAD ZFLG SNA JMP PRBLNK TAD (60 JMS PUTO STL CLA RAR /4000 DCA ZFLG ISZZ, ISZ PLST JMP DPL2 PRBLNK, TAD LNK CLL RAL TAD L40 SNL JMS PUTO CLA JMP ISZZ DYG, 0 PLST, 0 ZFLG, 0 /4000 MEANS PASSED LEADING ZEROES LNK, 0 /PRINTS A 2-DIGIT OCTAL NUMBER WITH LEADING 0'S OPRINT, 0 DCA OTEM TAD OTEM RTR RAR JMS OPRI TAD OTEM JMS OPRI JMP I OPRINT OPRI, 0 AND (7 TAD (260 JMS PUTO JMP I OPRI PRINT4, 0 DCA DTM TAD DTM JMS RTR6 JMS OPRINT TAD DTM JMS OPRINT JMP I PRINT4 DTM, 0 PUTPAK, 0 DCA DTM TAD DTM JMS RTR6 JMS PR JMS BLNKIT TAD DTM JMS PR JMS BLNKIT JMP I PUTPAK BLNKIT, 0 TAD FAST SZA CLA TAD L40 JMS PR L40, 40 /CAN'T HURT TO CALL PR WITH A 0 JMP I BLNKIT OTEM, 0 /DIR DID NOT GET IN CORE ON /F? DEV, DCA BLCK0 TAD (66 DCA BLCK66 TAD (7 DCA KBM TAD (13 DCA USRBLK CDF 0 TAD I (4001 /GET STARTING BLOCK # OF FILES CDF 10 TAD (-7 SNA CLA JMP NONSYS /FILES START AT BLOCK 7 OF DEVICE TAD (16 /CHECK TO SEE THAT DEVICE HAS SYSTEM ON IT JMP RD NONSYS, JMS PRINT TEXT /%NON SYSTEM DEVICE/ JMP NEXT PAGE MONVER, 0 TAD FAST SNA CLA JMP I MONVER TAD I (1400 TAD (-7607 SNA JMP NOTV3 TAD (7607+60 DCA TEMPX TAD I (1400+31 DCA TMPTWO OS8, TAD ("O JMS PUTO MONV2, JMS PRINT TEXT \S/8 V\ TAD TEMPX JMS PUTO TAD TMPTWO JMS PUTO JMS CRLF JMP I MONVER TMPTWO, 0 TEMPX, 0 NOTV3, TAD (40 DCA TMPTWO /CHECK FOR PS/8 AND COS JMP OS8 LIST2, DEVICE LPT DEVICE TTY DEVICE PTR DEVICE PTP DEVICE CDR DEVICE SYS DEVICE DSK DEVICE CDP / DEVICE DEV / DEVICE OUT / DEVICE INP DEVICE BAT DEVICE NULL /SHOULD BE IN NEXT TABLE DEVICE LST /V3C DEVICE DUMP DEVICE SLU DEVICE LQP DEVICE RL0A DEVICE RL0B DEVICE RL0C DEVICE RL1A DEVICE RL1B DEVICE RL1C DEVICE RL2A DEVICE RL2B DEVICE RL2C DEVICE RL3A DEVICE RL3B DEVICE RL3C DEVICE VXA0 0 /LIST3, DEVICE NULL / DEVICE TEST / DEVICE LIST / DEVICE DUMP /V3C / ZBLOCK 2 /PATCH SPACE / 0 /INTERESTING NOTE: 'BAT', 'FOO2' AND 'RKC6' ALL HASH OUT TO 6601 /** WANT TO CHANGE AIW PRINTER TO SAY 'NO' ADDITIONAL INFO WORDS /IF THERE ARE NONE. /DTN /DKN GOTIT, TAD FAST SZA CLA JMS PUTSP TAD (LFT JMS PUTNAM TAD FAST SZA CLA JMS PUTSP JMP NAMLV BADFIL, JMS PRINT TEXT /%NOT A SYSTEM HEAD/ JMP NEXT PAGE /FORMAT OF SYSTEM HEAD FILE /REL BLK CONTENTS ABS BLK ON DEV /0 BOOTSTRAP & PAGE 0'S 0 /1-4 KEYBOARD MONITOR 7-12 /5-7 USR 13-15 /10-17 DEVICE HANDLERS 16-25 /20 ENTER 26 /21-42 SCRATCH BLOCKS 27-50 /43-45 COMMAND DECODER 51-53 /46-47 SAVE,DATE 54-55 /50 ERROR OVERLAY 56 /51 CHAIN OVERLAY 57 /52-55 ODT 60-63 /56 RESERVED FOR EXPN 64 /57 CCL SCRATCH 65 /60 12K TD8E HANDLER 66 /61 CCL OVERLAY 67 HNDLRS, 0 TAD SBLOCK SNA /IS IT A FILE? JMP DEV /NO DCA BLCK0 /YES TAD BLCK0 TAD (60 DCA BLCK66 TAD FILEN TAD (-6340 SZA CLA JMP BADFIL /FILE DOESN'T HAVE LENGTH 50 (DECIMAL) TAD BLCK0 IAC DCA KBM TAD BLCK0 TAD (5 DCA USRBLK TAD BLCK0 TAD (10 RD, DCA HNDBLK JMS READI /READ IN BLOCK 0 210 /2 PAGES INPBL0 FREEDV, /# OF FREE DEVICE NUMBERS BLCK0, 0 TAD I (INPBL0+212 /** DEPENDS ON TD8E HANDLER TAD (-3 SZA CLA /IS IT 12K TD8E? JMP NOTD8E /NO JMS READI /YES 110 /1 PAGE INPBL0 BLCK66, 66 NOTD8E, TAD I (INPBL0+200 TAD (-4207 SZA CLA JMP BADMON /BAD MONITOR ON DEVICE DCA 7 /DELETE CURRENT USR DIRECTORY SEGMENT /SINCE KBM READS OVER IT JMS READI /READ IN KEYBOARD MONITOR 211 /ONLY FIRST 2 PAGES INPKBM KBM, 7 JMS READI /READ IN USR 611 /6 PAGES INPUSR USRBLK, 13 JMS READI /READ IN ALL HANDLERS (EXCEPT 2ND PAGE OF LAST ONE) 1700 /17 PAGES INPHND HNDBLK, 16 TAD (-17 DCA CNT DCA FREEDV JMS ZEROSL DCA DEVNUM JMS SETPTS JMS HEADING LOOP, ISZ DEVNUM /PT TO NEXT HANDLER TAD I PDNT /LOOK AT DEVICE NAME SNA CLA JMP NOXXT TAD EXTEN SNA CLA JMP NONUM TAD DEVNUM JMS OPRINT NONUM, TAD I PDNT JMS NAME /PRINT NAME TAD FAST SNA CLA JMP NEXXT JMS TIPE /PRINT TYPE TAD EXTEN SNA CLA JMP PUSER JMS MODE /PRINT MODE JMS SIZE /PRINT SIZE JMS BLOCK /PRINT BLOCK # OF LOC OF HANDLER STA DCA UN JMS KIND /PRINT KIND JMS VERSN /PRINT HANDLER VERSION # JMS ENTRY PUSER, TAD I PUDNT SNA CLA JMP EOL TAD I PUDNT JMS NAME /PRINT USER NAME EOL, JMS CRLF NEXXT, ISZ PDNT ISZ PUDNT ISZ PDHIT ISZ PDCWT ISZ PDHRT ISZ CNT JMP LOOP JMS CRLF JMP I HNDLRS NOXXT, ISZ FREEDV JMP NEXXT PAGE HEADING,0 TAD FAST SNA CLA JMP I HEADING TAD EXTEN SNA CLA JMP REGLR JMS PRINT TEXT /# NAME TYPE MODE SIZ BLK KIND U V ENT USER/ JMP HDLV REGLR, JMS PRINT TEXT / NAME TYPE USER/ HDLV, JMS CRLF JMP I HEADING SETPTS, 0 TAD I (INPUSR+36 TAD (INPUSR DCA PDNT TAD FLAG SZA CLA TAD (7741-141-INPBL0 TAD (INPBL0+141 DCA PUDNT /CHANGE FOR FLAG? TAD I (INPUSR+37 TAD (INPUSR DCA PDHIT /FLAG? TAD (INPBL0+160 DCA PDCWT TAD (INPBL0+47 DCA PDHRT /DEVICE HANDLER RESIDENCY TABLE JMP I SETPTS CODE, 0 /DEVICE CODE NNAME, 0 DCA TIPE TAD ("( JMS PUTO TAD TIPE JMS PRINT4 TAD (") JMS PUTO JMP I NNAME TIPE, 0 TAD I PDCWT RTR RAR AND (77 DCA CODE TAD CODE CLL RTL TAD (TYPTBL DCA PTYP JMS GETTYP ISZ PTYP SNA JMP UNKN JMS PUTPAK JMS GETTYP JMS PUTPAK ISZ PTYP /POINT TO SIZE JMP I TIPE UNKN, JMS PUTSP TAD CODE JMS OPRINT JMS PUTSP ISZ PTYP JMP I TIPE BADMON, JMS PRINT TEXT /%BAD MONITOR/ JMP NEXT PAGE PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | /1 OV0 FOR RESORC .ENTRY VERSN,SIZE,BLOCK,ENTRY,MODE .EXTERNAL GETTYP,DPRINT,OPRINT,PUTSP,PUTO .EXTERNAL SLOTAB,PRINT PDHRT=37 PDCWT=31 PTYP=32 INPBL0=5600 PDHIT=30 INPHND=4000 BLOC=36 .RSECT OV3,LEVEL=1,OVERLAY=0 FIELD 1 VERSN, 0 JMS PUTSP TAD BLOC SNA CLA JMP SYSV /TEMP (ENTRY PT IS IN FIELD 1 7600 TAD I PDHIT AND (177 TAD BLOC GOVR, DCA DTM JMS GETV CLL IAC TAD (-34 SZL CLA JMP NOOOP JMS GETV PUTVR, SZA TAD (40 TAD (40 JMS PUTO JMP I VERSN OTEM, GETV, 0 CDF 0 TAD I DTM CDF 10 JMP I GETV NOOOP, STA TAD DTM /SCAN BACKWARDS FOR HANDLER VERSION # (LT 33) JMP GOVR SYSV, TAD I PDHRT AND (177 TAD (INPBL0+200 DCA DTM TAD I DTM CLL TAD (-34 SNL CLA TAD I DTM /PRINT BAD VERSION # AS SPACE JMP PUTVR DTM, 0 SIZE, 0 JMS GETTYP CIA CLL JMS DPRINT JMS PUTSP ISZ PTYP /POINT TO KIND SUBROUTINE JMP I SIZE MODE, 0 JMS PUTSP TAD (-4 DCA MKNT TAD I PDCWT RTL RAL JMS MSET "R TAD I PDCWT RTL JMS MSET "W TAD I PDCWT RAL CML JMS MSET "F JMS PUTSP ISZ MKNT JMP .-3 JMP I MODE MSET, 0 CLA TAD I MSET DCA MCHAR ISZ MSET SZL JMP I MSET ISZ MKNT TAD MCHAR JMS PUTO JMP I MSET MKNT, 0 PAGE ET, BLOCK, 0 TAD I PDHIT RTL RTL RTL AND (17 SNA JMP SYS DCA SLTM STA TAD SLTM CLL RTR RTR RAR TAD (INPHND DCA BLOC TAD SLTM TAD (15 JMS OPRINT TAD I PDHIT SMA CLA TAD (40-"+ TAD ("+ JMS PUTO /"+" MEANS 2 PAGE HANDLER TAD SLTM TAD (SLOTAB-1 DCA SLTM ISZ I SLTM JMP I BLOCK SYS, JMS PRINT TEXT /SYS/ DCA BLOC /0 MEANS RESIDENT WITH SYS: JMP I BLOCK MCHAR, ENTRY, 0 JMS PUTSP TAD BLOC SNA CLA JMP SYSENT TAD I PDHIT EN2, DCA ET TAD ET RTR RTR RTR AND (1 SZA TAD (20 TAD (40 JMS PUTO TAD ET JMS OPRINT JMP I ENTRY SYSENT, TAD I PDHRT JMP EN2 SLTM, 0 PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 | /1 .EXTERNAL PUTNAM,PUTSP,GETTYP,PUTO .ENTRY KIND .GLOBAL TYPTBL PDHRT=37 XR1=11 TEMP=26 PDHIT=30 BLOC=36 UN=6 .RSECT OV,LEVEL=1,OVERLAY=1 FIELD 1 GETD77, 0 TAD (7707 DCA MASK TAD (-6704 /V3C JMS SRCH RTR RAR AND (7 JMP I GETD77 QTTY, TAD I PDHIT SMA CLA /1 OR 2 PAGE? JMP I ($ASR /1 PAGE JMP I ($KL8E /2 PAGE QRK8E, TAD I PDHIT AND (7 CLL RAR DCA UN JMP I ($RK8E TSTUN, 0 TAD I PDHIT AND (7 DCA UN JMP I TSTUN QRK8, JMS TSTUN JMP I ($RK8 QTC08, QLINC, JMS TSTUN JMP I (NOKIND /HNDGET GETS VALUE IN HANDLER FROM REL LOC IN AC HNDGET, 0 TAD BLOC DCA TEMP CDF 0 TAD I TEMP CDF 10 JMP I HNDGET /SRCH SEARCHES THE HANDLER FOR THE NEGATIVE /OF THE NON-ZERO VALUE IN THE AC. /MASKED BY MASK. /IF FOUND, RETURN IS MADE WITH VALUE(WITHOUT MASK) IN AC /IF NOT FOUND, AC IS 0 UPON RETURN SRCH, 0 DCA LOOK4 STA TAD BLOC DCA XR1 TAD (-230 /V3C MUST SEARCH 2 PAGES; TROUBLE IF TA8E IS IN LAST SLOT DCA SRCHCNT SRCHLP, CDF 0 TAD I XR1 CDF 10 DCA TEMP TAD TEMP AND MASK TAD LOOK4 SNA CLA JMP SRCHGOT ISZ SRCHCNT JMP SRCHLP JMP I SRCH SRCHGOT,TAD TEMP JMP I SRCH SRCHCNT,-400 LOOK4, 0 / **** NOTE: ALL HANDLERS SHOULD BE PADDED OUT TO FILL PAGE / WITH ZEROES /BUILD SHOULD WRITE ZEROES IN 2ND PAGE OF ONE PAGE HANDLER /SPECIAL PURPOSE ROUTINES QPTP, QPTR, STA DCA MASK TAD (-6021 JMS SRCH SZA CLA JMP I ($PT8E JMP I ($LSPT /FOR TYPE PTR / IF HANDLER CONTAINS A 6021 IT IS A PT8E / OTHERWISE IT IS A LSPT QCR8E, TAD (104 JMS HNDGET TAD (-3203 SNA JMP I ($C029 TAD (3203-7735 SNA CLA JMP I ($C026 JMP I (NOKIND /FOR TYPE CR8E / IF REL LOC 104 IS A 3203 IT IN 029 KIND / IF REL LOC 104 IS A 7735 IT IS AN 026 KIND / OTHERWISE IT IS AN UNKNOWN KIND QLPTR, TAD I PDHIT SPA CLA /1 OR 2 PAGE? JMP I ($LQP /2 PG STA /1 PG DCA MASK TAD (-6652 /SEARCH FOR A 6652 JMS SRCH SZA CLA JMP I ($L645 /FOUND IT CLA IAC /LOOK AT REL LOC 1 JMS HNDGET TAD (-4 SNA JMP I ($LV8E TAD (4-14 SNA CLA JMP I ($LPSV JMP I (NOKIND /IF HANDLER CONTAINS A 6652 IT'S AN L645 /OTHERWISE, DEPENDS ON REL LOC 1 / IF REL LOC 1 IS A 14, IT'S A LPSV / IF REL LOC 1 IS A 4, IT'S A LV8E / OTHERWISE IT'S UNKNOWN (POSSIBLY OLD LP08 OR LS8E KIND) MASK, 0 PAGE QTD8E, JMS I (GETD77 CIA TAD (10 DCA TEMP TAD I ($TD8+1 AND (7700 TAD TEMP DCA I ($TD8+1 TAD I PDHIT RTR RAR STA TAD TEMP CML RAL /TIMES 2 + LINK DCA UN JMP I ($TD8 /FIGURE OUT KIND OF TD8E BY DEVICE CODE FOUND IN 67N1 INSTRUCTION / N TYPE / 7 TD8A / 6 TD8B /.. / 1 TD8G / 0 TD8H QTA8E, JMS I (GETD77 IAC DCA TEMP TAD I ($TA8+1 AND (7700 TAD TEMP DCA I ($TA8+1 STA TAD I PDHIT AND (177 SNA CLA CLA IAC DCA UN STA TAD TEMP CLL RAL TAD UN DCA UN JMP I ($TA8 /FIGURE OUT KIND OF TA8E BY DEVICE CODE FOUND IN 67N1 INSTRUCTION / N KIND / 0 TA8A / 1 TA8B /... / 6 TA8G / 7 TA8H RLSPC, TAD I PDHIT TAD (-50 RTR SKP RLSP, TAD I PDHIT AND (3 DCA UN JMP I (NOKIND PAGE $LQP, IAC /23 PLAT4, IAC /22 PLAT3, IAC /21 PLAT2, IAC /20 PLAT1, IAC /17 $XTRA, IAC /16 $KL8E, IAC /15 $RK8E, IAC /14 $RK8, IAC /13 $ASR, IAC /12 $TA8, IAC /11 $TD8, IAC /10 $L645, IAC /7 $LPSV, IAC /6 $LV8E, IAC /5 $C026, IAC /4 $C029, IAC /3 $LSPT, IAC /2 $PT8E, IAC /1 NOKIND, CLL RAL /PRINTS NAME FROM TABLE, ENTER WITH ENTRY # IN AC PRNAM, TAD (TABASE JMS PUTNAM JMS UNIT JMP KINDRET KIND, 0 JMS PUTSP TAD BLOC SNA CLA JMP NOKIND JMS GETTYP SNA JMP NOKIND DCA TEMP JMP I TEMP /BRANCH TO APPROPRIATE SUBROUTINE KINDRET,JMP I KIND /KIND SUBROUTINES /ENTER WITH BLOC POINTING TO HANDLER BLOCK IN CORE TABASE, 4040;4040 /0 DEVICE PT8E /1 DEVICE KS33 /2 DEVICE 029 /3 DEVICE 026 /4 DEVICE LV8E /5 DEVICE LPSV /6 DEVICE L645 /7 KTD8, DEVICE TD8 /10 KTA8, DEVICE TA8 /11 DEVICE AS33 /12 DEVICE RK01 /13 DEVICE RK05 /14 DEVICE KL8E /15 DEVICE XTRA /16 TEXT / =1/ /17 TEXT / =2/ /20 TEXT / =3/ /21 TEXT / =4/ /22 DEVICE LQP /23 UNIT, 0 JMS PUTSP TAD BLOC SNA CLA JMP TSTSUN TAD UN SPA TAD (40+1-60 ZOUN, TAD (60 JMS PUTO JMP I UNIT TSTSUN, TAD I PDHRT TAD (-7607 SZA CLA CLA IAC /ASSUME CORESIDENT HANDLERS ARE UNIT 1 JMP ZOUN /ELSE, NO UNIT PAGE .ASECT TYPTAB,LEVEL=0 FIELD 0 *2000 / DEVICE LENGTH TABLE /FORMAT OF THIS TABLE: /1,2 DEVICE GENERALIZED NAME (CORR TO TYPE) /3 NEG OF LENGTH /4 ADDRESS OF SUBR IN FIELD 1 FOR SPECIALIZATION TYPTBL, DEVICE TTY ;0000;QTTY /0 DEVICE PTR ;0000;QPTR /1 DEVICE PTP ;0000;QPTP /2 DEVICE CR8E;0000;QCR8E /3 DEVICE LPTR;0000;QLPTR /4 V3D DEVICE RK8 ;1520;QRK8 /5 DEVICE RF08;6001;PLAT1 /6 V3C DEVICE RF08;4002;PLAT2 /7 DEVICE RF08;2003;PLAT3 /10 DEVICE RF08;0004;PLAT4 /11 RF'S NOW ONLY HAVE LOGICALLY 1777 BLOCKS DEVICE DF32;7601;PLAT1 /12 DEVICE DF32;7402;PLAT2 /13 V3C DEVICE DF32;7203;PLAT3 /14 DEVICE DF32;7004;PLAT4 /15 DF'S HAVE 177 BLOCKS DEVICE TC08;6437;QTC08 /16 DEVICE LINC;6437;QLINC /17 DEVICE TM8E;0000;0 /20 DEVICE TD8E;6437;QTD8E /21 DEVICE BAT ;0000;0 /22 DEVICE RK8E;1520;QRK8E /23 DEVICE NULL;0000;0 /24 DEVICE RX8E;7022;0 /25 DEVICE RL01;-7761;RLSP /26 DEVICE TA8E;0000;QTA8E /27 DEVICE VR12;0000;0 /30 DEVICE RL01;-3751;RLSPC /31 DEVICE RX02;6044;0 /32 DEVICE VXA0;7200;PLAT3 /33 ZBLOCK 4 /34 ZBLOCK 4 /35 DEVICE DUMP;0000;0 /36 ZBLOCK 4 /37 ZBLOCK TYPTBL+400-. PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 | /1 .EXTERNAL PRINT,FREEDV,READI,CRLF,OPRINT,DPRINT .EXTERNAL SLOTAB .ENTRY DIRT,ZEROSL,CNTSLT FAST=20 EXTEN=22 X0=10 .MACRO .PRINT ARG JMS I (PRINT TEXT "ARG" .ENDM .RSECT OV2,LEVEL=1,OVERLAY=2 FIELD 1 .NOLIST ME,MEB DIRT, 0 JMS I (READI 1400 /READ 6 BLOCKS 4000 /INTO 04000 1 /FROM BLOCK 1 JMS I (DVALID /CHECK IF VALID DIRECTORY TAD FAST SNA CLA JMP I DIRT /NO DIRECT IN FAST MODE JMS I (CRLF DCA USED DCA UNUSED DCA NFILES DCA NMTS DCA NSEGS STL CLA RAR /4000 LUP$: DCA DIRPTR ISZ NSEGS JMS GETDIR DCA NENTRY /- NO. OF ENTRIES IN SEGMENT JMS GETDIR DCA STBLK /STARTING BLOCK # OF FIRST FILE IN SEGMENT JMS GETDIR DCA LINK /LINK TO NEXT SEGMENT JMS GETDIR CLA /IGNORE FLAG WORD TO TENTATIVE FILE JMS GETDIR DCA AIW /# OF ADDITIONAL INFO WORDS TAD NENTRY DCA DKNT L$: JMS GETDIR SNA CLA JMP MT$ /AN EMPTY ENTRY TAD AIW CIA TAD (3 TAD DIRPTR DCA DIRPTR /POINT TO FILE LENGTH JMS GETDIR /GET NEG OF NUMBER OF BLOCKS IN FILE SNA JMP 2$ /A TENTATIVE FILE, IGNORE CIA TAD USED DCA USED ISZ NFILES JMP 2$ MT$: JMS GETDIR CIA TAD UNUSED DCA UNUSED ISZ NMTS 2$: ISZ DKNT /ANY MORE ENTRIES IN THIS SEGMENT? JMP L$ /YES TAD LINK SNA CLA JMP 3$ TAD NSEGS CMA TAD LINK /ASSUME LINKS ARE IN ORDER SZA CLA JMP I (BADDIR STA /GO TO NEXT SEGMENT TAD DIRPTR AND (7400 TAD (400 JMP LUP$ 3$: JMS I (PRINFO LVDIR, JMS I (CRLF JMS I (CRLF JMP I DIRT DKNT, 0 USED, 0 /NO. OF BLOCKS USED UNUSED, 0 /# OF UNUSED BLOCKS ON DEVICE NFILES, 0 /# OF FILES NMTS, 0 /# OF EMPTIES NSEGS, 0 /# OF DIRECTORY SEGMENTS USED NENTRY, 0 /- # OF ENTRIES IN SEGMENT STBLK, 0 /STARTING BLOCK # OF FIRST FILE IN SEGMENT LINK, 0 /LINK TO NEXT SEGMENT AIW, 0 /# OF ADDITIOANAL INFORMATION WORDS GETDIR, 0 CDF 0 TAD I DIRPTR CDF 10 ISZ DIRPTR JMP I GETDIR DIRPTR, 0 PAGE PRINFO, 0 TAD EXTEN SNA CLA JMP 2$ /JUST # OF FREE BLOCKS UNLESS /E TAD I (NFILES SNA JMP 2$ STL JMS I (DPRINT .PRINT " FILES IN " TAD I (USED STL JMS I (DPRINT .PRINT " BLOCKS" STA TAD I (NSEGS SNA CLA JMP 1$ .PRINT " USING " TAD I (NSEGS STL JMS I (DPRINT .PRINT " SEGMENTS" 1$: JMS I (CRLF 2$: TAD I (UNUSED STL JMS I (DPRINT .PRINT " FREE BLOCKS" TAD EXTEN SNA CLA JMP I PRINFO TAD I (NMTS CLL RAR SNA CLA JMP 3$ .PRINT " (" TAD I (NMTS STL JMS I (DPRINT .PRINT " EMPTIES)" 3$: CLA IAC TAD I (AIW SZA CLA JMS PRAIW JMP I PRINFO PRAIW, 0 JMS I (CRLF TAD I (AIW CIA STL JMS I (DPRINT .PRINT " EXTRA INFO WDS" JMP I PRAIW PAGE DVALID, 0 STL CLA RAR /4000 DCA I (DIRPTR JMS I (GETDIR CLL TAD (200 SNL CLA JMP BADDIR JMS I (GETDIR SNA JMP BADDIR TAD (-400 /REMEMBER COS SMA CLA JMP BADDIR JMS I (GETDIR CLA /LINKS THOROUGHLY CHECKED ELSEWHERE JMS I (GETDIR SNA JMP OKDIR TAD (-1400 CLL TAD (-1000 SZL CLA JMP BADDIR OKDIR, JMS I (GETDIR SPA SNA CLA JMP I DVALID BADDIR, .PRINT "?BAD DIRECTORY" JMP I (LVDIR SLTM, 0 SLKNT, ZEROSL, 0 TAD (-10 DCA SLTM TAD (SLOTAB-1 DCA X0 DCA I X0 ISZ SLTM JMP .-2 JMP I ZEROSL CNTSLT, 0 TAD (-10 DCA SLTM DCA SLKNT TAD (SLOTAB-1 DCA X0 L$: TAD I X0 SNA CLA ISZ SLKNT ISZ SLTM JMP L$ .PRINT "FREE DEVICE SLOTS: " TAD I (FREEDV JMS XPRINT .PRINT ", FREE BLOCK SLOTS: " TAD SLKNT JMS XPRINT JMS I (CRLF JMP I CNTSLT XPRINT, 0 SNA JMP 1$ JMS I (OPRINT JMP I XPRINT 1$: .PRINT "NONE" JMP I XPRINT PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | /OVRDRV - OVERLAY DRIVER FOR RESORC /ASSUMES EVERYTHING IS IN FIELD 1 / / / / / / / / / /COPYRIGHT (C) 1977,1978 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /OVERLAY DRIVER /FOR LINKER PROGRAM MODULES /V1B /THIS SECT IS TWO LOCATIONS AND CONTAINS THE TRANSFER VECTOR TO SWAPER /AND A FLAG THAT INDICATES WHETHER A JMP (1) OR JMS (0) WAS PERFORMED /TO THE TRANSFER VECTOR .GLOBAL XFERV /THIS IS THE MAIN DRIVER SECTION .SECT SWAPER,R .GLOBAL SWPTAB FIELD 1 SWAP, 6102 /VERSION NUMBER DCA AC /SAVE CALLING AC RAL DCA LINK /AND LINK RDF /GET CALLING DF TAD (CDF /FORM CDF SWAP0, JMP ONCE /DO ONCE ONLY CODE - REPLACED BY DCA EXIT CDF . /CHANGE TO THIS DATA FIELD TAD I SWAP /GET OVERLAY,LEVEL,FIELD DCA BINDAT /SAVE ISZ SWAP /BUMP POINTER TAD I SWAP /GET SUBROUTINE ADDRESS DCA XITLOC /SAVE TAD BINDAT /FORM CDF TO CALLED SUBROUTINE AND (7 RAL CLL RTL TAD (CDF DCA SWAP1A /SAVE TAD SWAP1A /FORM CIF TO CALLED SUBROUTINE IAC DCA EXIT+1 /SAVE FOR EXIT /LOAD OVERLAY OF CALLED SUBROUTINE LOAD, TAD BINDAT AND (1600 /EXTRACT LEVEL OF CALLED SUBROUTINE RTR CLL /5 RIGHT RTR RAR DCA PNTR /SAVE TAD PNTR TAD (SWPTAB /COMPUTE ENTRY INTO SWAP TABLE DCA FLD /POINTS TO FIELD OF OVERLAY TAD PNTR /COMPUTE ENTRY INTO CURRENT OVERLAY TABLE RTR CLL TAD (CURTAB DCA PNTR TAD BINDAT /EXTRACT DESIRED OVERLAY NUMBER AND (170 RTR CLL /RIGHT 3 RAR CIA /NEGATE DCA TEMP TAD TEMP TAD I PNTR /COMPARE WITH CURRENT OVERLAY NUMBER FOR LEVEL SNA CLA /SAME? JMP SWAP1 /YES, NO READING NEEDED LOAD1, TAD TEMP /NO, SET TO NEW CIA DCA I PNTR /OVERLAY NUMBER TAD FLD /SET UP POINTERS TO IAC DCA ADDRES /ADDRESS TAD ADDRES IAC DCA RELBLK /RELATIVE BLOCK NUMBER TAD RELBLK IAC DCA LENGTH /LENGTH OF OVERLAY TAD TEMP /TEST OVERLAY NUMBER SNA CLA /0? JMP LOAD2 /YES, NO MULTIPLICATION NEEDED TAD I LENGTH /BLOCK NUMBER = (LENGTH OF OVERLAY) JMP I .+1 /TIMES (THE NUMBER OF THE OVERLAY) PATCH LOAD2, TAD I RELBLK /PLUS (RELATIVE BLOCK OF LEVEL) TAD STRBLK /PLUS (STARTING BLOCK OF PROGRAM) DCA REDBLK /SAVE IN CALL LOCATION TAD I ADDRES /GET ADDRESS TO LOAD DCA REDADD /SAVE IN CALL LOCATION TAD I FLD /GET FIELD AND (7 /MASK RTR CLL RAR /POSITION TAD I LENGTH /GET LENGTH RTL RTL RTL DCA REDCNT /FORM CONTROL WORD CIF 0 JMS I (7607 /CALL SYSTEM HANDLER TO READ IN OVERLAY REDCNT, 7756 /FUNCTION CONTROL WORD (POINTS TO MREAD-1 FOR "ONCE" REDADD, -7607 /BUFFER ADDRESS (CONTAINS SYS: ENTRY POINT FOR "ONCE" REDBLK, 0 /STARTING BLOCK NUMBER HLT /ERROR RETURN ADDRESS SWAP1, TAD XFERV /GET JMP-JMS FLAG SZA CLA /SET? JMP SWAP2 /YES, EXECUTE A JMP CLA CLL CMA RTL /-3 TAD SWAP /BACK UP TO CALLER'S PC DCA SWAP TAD I SWAP SWAP1A, 0 /CDF TO CALLED SUBROUTINE DCA I XITLOC /SAVE IN CALLED SUBROUTINE ISZ XITLOC /BUMP TRANSFER ADDRESS /** CDF . TAD (ISZ XFERV DCA I SWAP /SET BACK UP ENTRY IN XFER VECTOR TABLE SWAP2, DCA XFERV /CLEAR FLAG TAD LINK /RESTORE LINK AND AC RAR CLL TAD AC EXIT, 0 /SET DF TO CALLING FIELD 0 /SET IF TO CALLED FIELD JMP I XITLOC /GO TO CALLED SUBROUTINE /VARIABLE LOCATIONS /SOME OF THE FOLLOWING LOCATIONS CONTAIN /ONCE ONLY CODE TO SET UP STARTING BLOCK /AND CHECK THAT FILE CAME FROM SYS: CURTAB=. /CURRENT OVERLAY IN LEVEL TABLE (8 ENTRIES) STRBLK=. /ENTRY 0 IS USED TO HOLD STARTING BLOCK OF FILE ONCE, DCA EXIT /SAVE CALLING FIELD /ALSO ENTRY 0 TAD .-1 /SET UP SO WON'T BE EXECUTED AGAIN /ALSO ENTRY 1 DCA SWAP0 /ALSO ENTRY 2 CDF 0 /ALSO ENTRY 3 TAD I FLD /GET STARTING BLOCK FROM "SOFSET" /ALSO ENTRY 4 SNA /ALSO ENTRY 5 HLT /ERROR, K.M. PATCHES NOT IN /ALSO ENTRY 6 DCA STRBLK /SAVE /ALSO ENTRY 7 TAD I REDCNT /CHECK FILE CAME FROM SYS: TAD REDADD BINDAT, /CONTAINS OVERLAY,LEVEL,FIELD OF DESIRED SUBROUTINE SNA CLA /FROM SYS: ? XITLOC, /CONTAINS LOCATION TO GO TO IN DESIRED SUBROUTINE JMP SWAP0+1 /YES, OK PNTR, /POINTS INTO CURTAB HLT /NO, ERROR TEMP, /TEMP STORAGE JMP .-1 /DON'T ALLOW CONTINUE FLD, /POINTS TO FIELD WORD IN SWPTAB 7747 /POINTER TO "SOFSET" ADDRES=REDADD /POINTS TO ADDRESS WORD IN SWPTAB RELBLK=REDBLK /POINTS TO RELATIVE BLOCK WORD IN SWPTAB LENGTH=REDCNT /POINTS TO LENGTH WORD IN SWPTAB AC, 0 /SAVED AC LINK, 0 /SAVED LINK PAGE /PATCH TO FIX BLOCK POSITION CALCULATION PATCH, IAC /CONVERT PAGES TO BLOCKS CLL RAR DCA PTEMP TAD PTEMP /MULTIPLY BLOCK LENGTH ISZ I PPNT /BY OVERLAY NUMBER JMP .-2 JMP I .+1 LOAD2 PPNT, TEMP PTEMP, 0 /THIS AREA CONTAINS OVERLAY DATA FOR MAIN AND THE 7 LEVELS /THE FORMAT OF EACH ENTRY IS: /WORD1: FIELD OF LEVEL /WORD2: ADDRESS OF LEVEL /WORD3: RELATIVE BLOCK OF 1ST OVERLAY IN LEVEL /WORD4: LENGTH OF THE LEVEL (ANY AND ALL OVERLAYS-EACH) / (ALL OVERLAYS IN A LEVEL ARE THE SAME LENGTH) SWPTAB, *.+40 /THIS AREA CONTAINS THE TRANSFER VECTORS FOR EACH ENTRY POINT /IN ALL THE OVERLAYS IN ALL THE LEVELS /ITS SIZE SHOULD BE MODIFIED BY THE USER /TO FIT THE MAXIMUM NUMBER OF TRANSFER VECTORS NEEDED /EACH TRANSFER VECTOR OCCUPIES 4 LOCATIONS /THE TABLE IS INITIALLY SET UP FOR 24(DEC) (30(OCT)) VECTORS /THE MAXIMUM SIZE THIS TABLE CAN BE IS 3774 (OCT) LOCATIONS FOR /511 (DEC) (777 (OCT)) VECTORS /THE FORMAT OF EACH VECTOR ENTRY IS: /WORD1: ISZ XFERV /WORD2: JMS I XFERV+1 /WORD3: LEVEL/OVERLAY/FIELD /WORD4: ADDRESS .FSECT TRANVC FIELD SWAPER SIZE=14 /MODIFY THIS LINE TO CHANGE THE SIZE OF THE TABLE *SIZE^4 XFERV, 0 SWAPER |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 | /RK8E/RK8L DISK FORMATTER / / / / / / / / / /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /RK8E/RK8L DISK FORMATTER PROGRAM: MD-08-DHRKD-D /MAINDEC-08-DHRKD-D-D / /MODIFIED FOR OS8V3D BY ED STEINBERGER / DLSC=6740 /LOAD SECTOR COUNTER DSKP=6741 /SKIP ON TRANSFER DONE OR ERROR DCLR=6742 /CLEAR DISK CONTROL LOGIC DLAG=6743 /LOAD ADDRESS AND GO DLCA=6744 /LOAD CURRENT ADDRESS DRST=6745 /READ STATUS REGISTER DLDC=6746 /LOAD COMMAND REGISTER DMAN=6747 /LOAD MAINTENANCE / LDSC=JMS I XXLDSC IOTCHN=JMS I XCHANG LODTRK=JMS I XWRTRK REDDSK=JMS I XRDTRK RECAL=JMS I XRESTR RECEIV=JMS I XWAIT KILBUF=JMS I XKLBUF ERROR=JMS I XERRO RDSTAT=JMS I XRDST LDADD=JMS I XLDAD DSKSKP=JMS I XSDKP LDCMD=JMS I XLDCM LDCUR=JMS I XLDCA CLRALL=JMS I XCLDR PRNTER=JMS I XPRN OCTEL=JMS I XFROCT TWOCT=JMS I XTOCT TYPE=JMS I XPRINT CRLF=JMS I XCRLF APT8A=JMS I XAPT8 TIME=JMS I XTIME TICK=JMS I XTICK KAERRO=JMS I XAERRO / *0 / 304 /REV D 5001 0002 0003 / *10 / AUTO10, 0 / AUTO11, 0 / *20 / 0000 /PSEUDO SWITCH REGISTER 0 /CONTROL WORD 1 - USE PSUEDO SWITCHES **ES** 400 /CONTROL WORD 2 - SET CONSOLE PACKAGE ACTIVE **ES** 0000 /RESERVED XAPT8, APT8 XTIME, KTIME XAERRO, AERRO XTICK, KTICK XCHANG, CHANG XWRTRK, WRTTRK XRDTRK, REDTRK XRESTR, RESTOR XWAIT, WAIT XKLBUF, KLBUF XPRINT, PRINT XERRO, ERRO XRDST, RDST XSDKP, SDKP XLDCM, LDCM XLDCA, LDCA XLDAD, LDAD XCLDR, CLDR XXLDSC, XLDSC XPRN, PRN XFROCT, FROCT XTOCT, TOCT XCRLF, UPONE XLOTRK, LOTRK XHITRK, HITRK BGNBUF, WRKBUF AMOUNT, 0 SWITCH, 0 K0003, 0003 K4, 4 K0007, 0007 K0040, 0040 M313, -313 K0277, 0277 K0200, 0200 K0260, 0260 K4000, 4000 K7735, 7735 K7760, 7760 K0400, 400 K0037, 0037 KCDF, CDF M4, -4 M10, -10 DRIVNO, 0 CHAR, 0 LOWAD, 0 HIGHAD, 0 TRKCNT, 0 DSKCNT, 0 SBCNT1, 0 STCNT1, 0 STCNT2, 0 STCNT3, 0 TCNTR1, 0 TCNTR2, 0 TCNTR3, 0 TCNTR4, 0 TCNTR5, 0 / GDREG2, 0 EXBIT, 0 CMREG, 0 STREG, 0 DAREG, 0 CAREG, 0 ADREG, 0 DTREG, 0 BGNTST, FRMDSK HOMEMA, 0 DATCNT, 0 CLKCNT, -2 / XMOVE, MOVE LOC8ED, 0 XEND, ENDTST SOFT, 0 ADPOT1, DSK0A DSK0A, 0 DSK1A, 0 DSK2A, 0 DSK3A, 0 DSK4A, 0 DSK5A, 0 DSK6A, 0 DSK7A, 0 ADPOT2, DSK0B DSK0B, 0 DSK1B, 0 DSK2B, 0 DSK3B, 0 DSK4B, 0 DSK5B, 0 DSK6B, 0 DSK7B, 0 PCOUNT, 0 /USED ONLY IF ON APT / *200 / BGN, RIF DCA HOMEMA TAD HOMEMA TAD KCDF /MAKE HOMEDF DCA .+1 HLT /MAKE DF=IF /NOW TEST FOR APT SYSTEM /IF ON APT TERMINAL MESSAGES ARE SKIP /TO AVOID TIMING PROBLEMS WITH THE SYSTEM APT8A /TEST FOR APT SYSTEM JMS XC8PSW /GET SR=. *.-1 /**ES** NOP /**ES** IOTCHN /CHANGE DEVICE TO SWR3-8 CRLF CRLF PRNTER /PRINT "RK8E/RK8L DISK FORMATTER PROGRAM" MES1 /MESSAGE 1 POINTER CRLF PRNTER /PRINT "FOR ALL QUESTIONS" MES2 /MESSAGE POINTER 2 ALLAGN, TAD M10 DCA STCNT1 /COUNTER FOR AMOUNT OF DISKS DCA LOC8ED DCA STCNT2 SAMAGN, CRLF PRNTER /PRINT "FORMAT DISK ? " MES3 /MESSAGE POINTER 3 TAD STCNT2 TAD K0260 TYPE /TYPE DISK NUMBER QUES1, TAD K0277 TYPE /TYPE ? TAD ADPOT1 TAD STCNT2 DCA STCNT3 RECEIV /WAIT FOR CHARACTER JMP NOTDSK /NO NOT THIS DISK JMP QUES1 /NEITHER YES OR NO WASDSK, ISZ LOC8ED CLA CLL CMA NOTDSK, DCA I STCNT3 /YES, WAS CLEAR DISK POINTER ISZ STCNT2 /UPDATE POINTER ISZ STCNT1 /COUNT DISKS JMP SAMAGN /ASK ABOUT NEXT / DONE, CRLF PRNTER /PRINT "ARE YOU SURE ?" MES4 /MESSAGE POINTER 4 RECEIV /WAIT FOR CHARACTER JMP ALLAGN /NO, START ALL OVER JMP DONE /NEITHER TYPE ? TAD LOC8ED CIA SNA /ANY DISKS JMP BGN /NO, OPERATOR ERROR DCA LOC8ED /YES, AMOUNT LOCATED / /FIRST RECALIBRATE AND FORMAT IN WRITE ALL MODE /ALL DISK DRIVES SELECTED BY OPERATOR,. MAKE THE FIRST /TWO WORDS OF EVERY DISK SECTOR EQUAL TO THE /ABSOLUTE DISK ADDRESS. / FRMDSK, JMS I XMOVE /MOVE DISK POINTERS TAD LOC8ED DCA AMOUNT TAD AMOUNT DCA DSKCNT /COUNTER FOR AMOUNT OF DISKS DCA TCNTR4 TAD ADPOT2 DCA TCNTR5 /A FEW COUNTERS TAD I TCNTR5 SZA CLA /FORMAT THIS DISK JMP FORMAT /YES, GO NEXFRM, ISZ TCNTR5 /NO, TRY NEXT ISZ TCNTR4 JMP .-5 HLT /WHAT HAPPENED???? / FORMAT, TAD TCNTR4 AND K0003 /MASK OUT CLL RAL /MAKE DISK NUMBER DCA DRIVNO TAD TCNTR4 AND K4 SZA CLA TAD K0200 DCA EXBIT /SET EXTENDED DRIVE BIT RECAL /RECALIBRATE THIS DRIVE JMP RENEX1 /RECALIBRATE NEXT EXISTING DCA LOWAD /SETUP ADDRESS POINTER DCA HIGHAD /SETUP ADDRESS POINTER TAD M313 DCA TRKCNT /COUNTER FOR AMOUNT OF TRACKS / / WRTDSK, TICK /TIMING FOR APT IF NEEDED. -4 /OTHERWISE BOTH ARE SKIPPED LODTRK /FORMAT A TRACK JMP RENEX1 /TO NEXT DISK CLA CLL TAD LOWAD TAD K0040 DCA LOWAD /UPDATE TO NEXT TRACK SZL CLA /SET EXTENDED BIT ISZ HIGHAD /YES ISZ TRKCNT /UPDATE TRACK COUNTER JMP WRTDSK /DO NEXT TRACK RENEX1, ISZ DSKCNT /UPDATE DISK COUNTER JMP NEXFRM /DO NEXT DISK / /ROUTINE TO CHECK ADDRESSING INFORMATION ON THE DISK. /THE FIRST TWO WORDS OF EVERY SECTOR SHOULD EQUAL /THE ABSOLUTE DISK ADDRESS. ALL OTHER DATA IS /NOT CHECKED. / CHKDSK, TAD AMOUNT DCA DSKCNT /AMOUNT OF DISKS DCA TCNTR4 TAD ADPOT2 DCA TCNTR5 TAD I TCNTR5 /SOFTWARE INFORMATION SZA CLA /CHECK THIS DISK JMP CHKDAT /CHECK THIS ONE NEXCHK, ISZ TCNTR5 /UPDATE FOR NEXT DISK ISZ TCNTR4 JMP .-5 HLT /WHAT HAPPENED????? / CHKDAT, TAD TCNTR4 AND K0003 /MASK OUT CLL RAL /MAKE DRIVE NUMBER DCA DRIVNO TAD TCNTR4 AND K4 SZA CLA TAD K0200 DCA EXBIT /SET EXTENDED DRIVE BIT RECAL /RECALIBRATE JMP RENEX2 /TRY NEXT DRIVE DCA LOWAD DCA HIGHAD /SETUP STARTING DISK ADDRESS TAD M313 DCA TRKCNT /AMOUNT OF TRACKS TO DO JMP CHECK / PAGE / CHECK, TICK /TIMING FOR APT IF NEEDED. -4 /SKIPPED IF NOT REQUIRED. REDDSK /READ AND CHECK ONE CYLINDER JMP RENEX2 /TO NEXT DISK CLA CLL TAD LOWAD TAD K0040 DCA LOWAD /UPDATE TO NEXT CYLINDER SZL CLA /TIME TO SET EXTENDED BIT ISZ HIGHAD /YES, SET IT ISZ TRKCNT /UPDATE CYLINDER COUNTER JMP CHECK /CHECK NEXT ONE RENEX2, ISZ DSKCNT /UPDATE DISK COUNTER JMP NEXCHK /CHECK NEXT / / TAD 22 AND K4000 /TEST FOR APT SNA CLA /ARE WE? JMP ENDTST /NO. NORMAL RUN ISZ PCOUNT /INCREMENT PASS COUNT JMP FRMDSK /LOOP PROGRAM ENDTST, CRLF PRNTER /PRINT "PASS COMPLETE" TEXEND CRLF PRNTER /PRINT "TRY SAME SEQUENCE" MES5 RECEIV /WAIT FOR INPUT FROM OPERATOR JMP ALLAGN /NO, ASK AGAIN JMP .-5 JMP FRMDSK /TRY SAME SEQUENCE / / /SUBROUTINE FOR "ERRORS," SCOPE LOOPS, AND /ERROR TYPEOUTS. / ERRO, 0 CLA CLL IAC TAD ERRO /GET PC STORED DCA RETRN1 /STORE FOR RETURN KAERRO /NOTIFY APT OF ERROR IS NEED BE CRLF CRLF TAD I ERRO /GET TEXT POINTER AND K0007 /MASK 9-11 TAD HEDTAD /MAKE ERROR HEADER TAD DCA .+1 HLT /MODIFIED HEADER TAD DCA .+2 PRNTER /MODIFIED HEADER POINTER HLT CRLF PRNTER /PRINT PC: TEXPC TAD ERRO /GET PC POINTER OCTEL /PRINT PC STORED TAD I ERRO /GET TEXT POINTER CLL RAL SNL JMP NTGD /NOT GD: REGISTER DCA ERRO PRNTER /PRINT GD: TEXGD TAD GDREG2 OCTEL /PRINT FOUR OCTAL SKP CLA NTGD, DCA ERRO PRNTER TEXEX TAD EXBIT SZA CLA IAC OCTEL TAD XTEXT DCA PCNTR2 TAD XREG DCA AUTO10 TAD K7771 DCA PCNTR1 /COUNTER FOR # OF HEADS CLA CLL CMA RAL DCA PCNTR3 STRAUT, TAD ERRO /GET TEXT POINTER SMA JMP NOTEX /NOT THIS ONE CLL RAL DCA ERRO TAD PCNTR2 /GET TEXT MESSAGE POINTER ISZ PCNTR2 ISZ PCNTR2 DCA .+2 /STORE FOR PRNTER PRNTER /PRINT XX: HLT /MODIFIED TEXT POINTER TAD I AUTO10 OCTEL /PRINT FOUR OCTAL ISZ PCNTR3 SKP CLA CRLF AGAIN, ISZ PCNTR1 JMP STRAUT /CHECK FOR NEXT XX: JMP I RETRN1 /RETURN TO QUESTION NOTEX, CLL RAL DCA ERRO ISZ PCNTR2 ISZ PCNTR2 ISZ AUTO10 JMP AGAIN / RETRN1, 0 XTEXT, TEXCM XREG, EXBIT PCNTR1, 0 PCNTR2, 0 PCNTR3, 0 HEDTAD, TAD HEDLST HEDLST, ERTX1 ERTX2 ERTX3 ERTX4 K7771, 7771 / PAGE / /ROUTINE TO FORMAT CYLINDER /MAKE FIRST TWO WORDS OF EVERY SECTOR /EQUAL TO DISK ADDRESS. / WRTTRK, 0 CLA CLL CML RAR DCA GDREG2 /SETUP COMPARE REGISTER KILBUF /CLEAR BUFFER TAD K7735 /AMOUNT OF SECTORS TO DO DCA TCNTR1 /SETUP COUNTER DCA TCNTR2 /STARTING WITH 0 TAD K7760 /STOPPER DCA TCNTR3 /SECTOR COUNTER POINTER STOP LODR1, TAD TCNTR2 AND K0037 /MASK SECTOR BITS TAD LOWAD /ADD IN CYLINDER DCA I XLOTRK /SETUP TRACK WORD IN BUFFER TAD EXBIT /ADD IN EXTENDED BIT TAD HIGHAD TAD DRIVNO /ADD IN DRIVE NUMBER DCA I XHITRK /SETUP TRACK WORD IN BUFFER TAD I XHITRK AND K7577 TAD HOMEMA /CURRENT FIELD TAD K5000 /FUNCTION WRITE ALL LDCMD /LOAD COMMAND TAD EXBIT LDSC /LOAD EXTENDED DRIVE BIT CLA /CLEAR EXTENDED DRIVE BIT TAD BGNBUF LDCUR /LOAD CURRENT ADDRESS TAD I XLOTRK LDADD /LOAD TRACK AND GO DSKSKP /SKIP ON FLAG JMP .-1 /WAIT FOR FLAG RDSTAT /READ STATUS TAD K4000 SZA CLA /WAS STATUS 0? JMP LODER /ERROR, STATUS ON WRITE ALL ISZ TCNTR2 ISZ TCNTR3 /COUNT FIRST REVOLUTION SKP CLA /STILL IN FIRST REV. DCA TCNTR2 /SETUP FOR SECTOR "1" ISZ TCNTR2 ISZ TCNTR1 /UPDATE SECTOR COUNTER JMP LODR1 /TRY NEXT SECTOR ISZ WRTTRK JMP I WRTTRK /THIS CYLINDER DONE LODER, ERROR /ERROR, STATUS 3602 /TEXT POINTER / RECAL /CLEAR CONTROL AND DRIVE JMP I WRTTRK /TO NEXT DISK CRLF PRNTER /PRINT "TRY SAME AGAIN" ERMES1 RECEIV /WAIT FOR YES OR NO JMP LODER-2 /WAS A NO TRY SAME CYLINDER JMP .-5 /WAS NEITHER ASK AGAIN JMP WRTTRK+1 /YES, TRY NEXT K5000, 5000 K7577, 7577 / / /SUBROUTINE TO READ STATUS REGISTER / RDST, 0 IOT5, DRST /READ STATUS IOT SKP ERHLT5, JMS XC8ERR /SKIP TRAP ERROR. DCA STREG /SAVE RESULTS TAD STREG JMP I RDST /EXIT / /SUBROUTINE TO LOAD CURRENT ADDRESS REGISTER / LDCA, 0 DCA ADREG /SAVE IN ADDRESS TAD ADREG DCA CAREG /SETUP INITIAL CURRENT ADDRESS TAD ADREG IOT4, DLCA /LOAD CURRENT ADDRESS IOT JMP I LDCA /EXIT ERHLT4, JMS XC8ERR /SKIP TRAP ERROR. JMP .-1 / / /SUBROUTINE TO LOAD TRACK ADDRESS REGISTER / LDAD, 0 DCA DAREG /SAVE OUTBOUND DATA TAD DAREG IOT3, DLAG /LOAD DISK ADDRESS REGISTER JMP I LDAD /EXIT ERHLT3, JMS XC8ERR /SKIP TRAP ERROR. JMP .-1 / / /SUBROUTINE TO LOAD COMMAND REGISTER / LDCM, 0 DCA CMREG /SAVE OUTBOUND DATA DCA INMODE JMS XC8CKP /CHECK FOR CONTROL CHARACTERS. CLA CLA TAD CMREG IOT6, DLDC /LOAD COMMAND REGISTER JMP I LDCM /EXIT ERHLT6, JMS XC8ERR /SKIP TRAP ERROR. JMP .-1 / / /SUBROUTINE ISSUE "DLSC" XLDSC, 0 IOT0, DLSC JMP I XLDSC ERHLT0, JMS XC8ERR JMP .-1 /SUBROUTINE TO ISSUE "DSKP" DISK SKIP IOT / SDKP, 0 IOT1, DSKP /DISK SKIP IOT SKP /DID NOT SKIP ISZ SDKP JMP I SDKP /EXIT / /SUBROUTINE TO ISSUE "DCLR" CLEAR IOT / CLDR, 0 IOT2, DCLR /DCLR "CLEAR IOT" JMP I CLDR /EXIT ERHLT2, JMS XC8ERR /SKIP TRAP ERROR. JMP .-1 / /ROUTINE TO ZERO WORK BUFFER / KLBUF, 0 CLA CLL CMA TAD BGNBUF /START OF BUFFER -1 DCA AUTO10 /SETUP AUTO INDEX TAD K7400 DCA DATCNT /SETUP COUNTER DCA I AUTO10 /CLEAR BUFFER ISZ DATCNT /UPDATE COUNTER JMP .-2 /NOT ALL CLEARED YET JMP I KLBUF /BUFFER CLEARED K7400, 7400 / PAGE / / /ROUTINE TO READ AND CHECK A CYLINDER / REDTRK, 0 TAD K7735 DCA TCNTR1 /AMOUNT OF SECTORS TO DO DCA TCNTR2 /STARTING WITH 0 TAD K7760 DCA TCNTR3 KILBUF /CLEAR BUFFER CHKR1, CLA CLL CMA DCA SOFT /SETUP SOFT ERROR FLAG TAD BGNBUF LDCUR /LOAD CURRENT ADDRESS TAD HIGHAD /EXTENDED CYLINDER BIT TAD DRIVNO /CURRENT DRIVE TAD HOMEMA /CURRENT FIELD LDCMD /LOAD COMMAND TAD EXBIT /LOAD EXTENDED DRIVE BIT LDSC CLA /CLEAR EXTENDED DRIVE BIT TAD TCNTR2 AND K0037 /MASK SECTOR BITS OFF TAD LOWAD /ADD IN OTHER DISK ADDRESS LDADD /LOAD AND GO DSKSKP /DISK SKIP IOT JMP .-1 /WAIT FOR FLAG RDSTAT /READ STATUS TAD K4000 /ADD IN FUDGE FACTOR SNA CLA /SKIP IF ERROR JMP STAOK /STATUS O.K. TAD STREG /GET STATUS READ AND K0010 SNA CLA /WAS IT A CRC JMP STAER /NO, JUST A HARD ERROR DCA SOFT /CLEAR SOFT ERROR FLAG STAOK, TAD CMREG /GET LAST COMMAND AND K0007 TAD EXBIT /ADD EXTENDED DRIVE BIT CIA TAD I XHITRK /GET WORD READ FROM DISK SNA CLA /SKIP IF ERROR JMP FRSTOK /FIRST WORD O.K. TAD I XHITRK /GET WORD DCA DTREG /SETUP ERROR PRINTER TAD CMREG AND K0007 DCA GDREG2 /SETUP GOOD FOR PRINTER JMP DATER /NO, DATA ERROR FRSTOK, TAD I XLOTRK /GET WORD READ CIA TAD DAREG /COMPARE TO GOOD SNA CLA /SKIP IF ERROR JMP DATOK /WORD O.K. ISZ ADREG /SETUP ERROR PRINTER TAD DAREG DCA GDREG2 /SETUP GOOD WORD FOR PRINTER TAD I XLOTRK /GET WORD READ DCA DTREG /SETUP FOR PRINTER JMP DATER /DATA ERROR DATOK, TAD SOFT /GET SOFT ERROR FLAG SNA CLA /WAS IT CLEAR JMP STAER /YES, STATUS ERROR TAD TCNTR2 TAD K0003 /ADVANCE 3 SECTORS DCA TCNTR2 ISZ TCNTR3 JMP CHKR1 /MORE TO FORMAT ISZ REDTRK JMP I REDTRK /EXIT, O.K. DATER, TAD K7741 DCA TCHKT /SETUP TEXT POINTER JMP CHKER /ERROR STAER, TAD K3600 DCA TCHKT /SETUP TEXT POINTER CLA CLL CML RAR DCA GDREG2 /SETUP GOOD STATUS PRINTER CHKER, ERROR /ERROR, READ DATA TCHKT, 0 /MODIFIED TEXT POINTER RECAL /CLEAR CONTROL AND DRIVE JMP I REDTRK /TO NEXT DISK CRLF PRNTER /PRINT "TRY SAME AGAIN" ERMES3 RECEIV JMP DATER-2 /CHECK NEXT JMP .-5 /RE-PRINT JMP REDTRK+1 /TRY SAME AGAIN / /THIS ROUTINE WILL TEST FOR APT AND NOP CONSOLE /PACKAGE IF NEED BE / APT8, 0 TAD 22 SMA CLA JMP I APT8 TAD 22 AND K7377 /ON APT. NOP CONSOLE PACKAGE DCA 22 TAD 22 AND K0007 /ISOLATE DRIVE NUMBER OR /NUMBER OF DRIVES TO BE DONE DCA STCNT1 TAD 22 AND K0100 SNA CLA /SINGLE DRIVE TESTING JMP MULDSK /NO.SEVERAL TO DO TAD ADPOT1 /GET DISK POINTER TAD STCNT1 /ESTABLISH DRIVE TO DO DCA STCNT1 CLL CLA CMA /-1 DCA I STCNT1 CLL CLA CMA /ONE DISK TO DO DCA LOC8ED JMP I BGNTST MULDSK, TAD STCNT1 /DRIVE TO BE DONE CMA DCA STCNT1 TAD ADPOT1 /GET DISK POINTER TAD STCNT2 /ESTABLISH DRIVE TO BE DONE DCA STCNT3 ISZ LOC8ED CLL CLA CMA DCA I STCNT3 /DO THIS DRIVE ISZ STCNT2 ISZ STCNT1 JMP MULDSK+3 /MORE TO DO TAD LOC8ED CIA DCA LOC8ED /NUMBER TO BE DONE JMP I BGNTST K7377, 7377 PAGE / /SUBROUTINE TO PRINT TWO OCTAL / TOCT, 0 DCA SBCNT1 /SAVE AC TAD SBCNT1 RAR RTR AND K0007 TAD K0260 TYPE /PRINT FIRST BYTE TAD SBCNT1 AND K0007 TAD K0260 TYPE /PRINT SECOND BIT JMP I TOCT /EXIT / / / /ROUTINE TO DO CRLF / UPONE, 0 CLA CLL TAD K0215 TYPE TAD K0212 TYPE TYPE /TYPE ONE NULL JMP I UPONE / K0215, 0215 K0212, 0212 / /ROUTINE TO PRINT FOUR OCTAL / FROCT, 0 RTL RTL DCA UPONE TAD M4 DCA TOCT TAD UPONE AND K0007 TAD K0260 TYPE TAD UPONE RTL RAL DCA UPONE ISZ TOCT JMP .-11 TAD K0240 TYPE JMP I FROCT / /SUBROUTINE TO PRINT TEXT / PRN, 0 CLA CLL TAD I PRN /GET POINTER ISZ PRN DCA FROCT TAD I FROCT AND K7700 SNA JMP EXIT SMA CML IAC RTR RTR RTR TYPE TAD I FROCT AND K0077 SNA JMP EXIT TAD K3740 SMA TAD K4100 TAD K0240 TYPE ISZ FROCT CLA CLL JMP PRN+5 EXIT, CLA CLL JMP I PRN / K4100, 4100 K3740, 3740 / /ROUTINE TO TYPE / PRINT, 0 TLS TSF JMP .-1 TCF CLA JMP I PRINT K0240, 0240 K7700, 7700 K0077, 0077 K0010, 10 K7741, 7741 K3600, 3600 /ROUTINE TO WAIT FOR KEY FROM OPERATOR / WAIT, 0 CLA CLL KCC KSF JMP .-1 KRB TLS TSF JMP .-1 AND K0177 TAD K0200 DCA CHAR TAD CHAR DCA C8CHAR ISZ INMODE JMS XC8CNT /CHECK FOR CONTROL CHARACTERS. CLA CLA DCA INMODE KCC TCF TAD CHAR CIA TAD K0316 SNA CLA /WAS IT A NO JMP I WAIT /YES ISZ WAIT /UPDATE RETURN POINTER TAD CHAR CIA TAD K0331 SNA CLA /WAS IT A YES ISZ WAIT /WAS A YES JMP I WAIT /WAS NEITHER K0177, 0177 K0316, 0316 K0331, 0331 / PAGE / / /ROUTINE TO RECALIBRATE SELECTED DRIVE / RESTOR, 0 CLA CLL IAC /ENABLE CLEAR CONTROL CLRALL /CLEAR CONTROL TAD DRIVNO /CURRENT DRIVE TAD HOMEMA /CURRENT FIELD LDCMD /LOAD COMMAND TAD EXBIT LDSC /LOAD EXTENDED DRIVE BIT CLA CLL CML RAR /MAYBE EXPECTED STATUS DCA GDREG2 /SETUP COMPARE REGISTER CLA CLL CML RTL /ENABLE RECALIBRATE BIT CLRALL /"RECALIBRATE" DSKSKP /DISK SKIP IOT JMP .-1 /WAIT FOR FIRST DONE FLAG RDSTAT /READ STATUS TAD K2000 SNA /WAS IT BUSY AND DONE JMP RESTA /YES, THEN ITS O.K. TAD K2000 /NO, THEN IT MUST BE JUST DONE SZA CLA /WAS IT JUST DONE JMP RESTER /NO, ERROR RESTA, CLRALL /CLEAR STATUS TAD K0200 /ENABLE SET SECOND DONE FLAG TAD CMREG /ORIGINAL COMMAND LDCMD /LOAD COMMAND DSKSKP /DISK SKIP IOT JMP .-1 /WAIT FOR SECOND DONE RDSTAT /READ STATUS TAD K4000 SZA CLA /WAS IT ONLY DONE FLAG JMP RESTER /NO, ERROR STATUS CLA CLL IAC /ENABLE CLEAR CONTROL CLRALL /CLEAR CONTROL ISZ RESTOR /UPDATE FOR GOOD RECALIBRATE JMP I RESTOR /RETURN RESTER, ERROR /ERROR, STATUS 3603 /TEXT POINTER / CRLF PRNTER /PRINT "TRY RECALIBRATE" ERMES2 RECEIV /WAIT FOR INPUT JMP .+3 /TRY NEXT EXISTING DISK JMP .-5 JMP RESTOR+1 /TRY AGAIN CLA CLL IAC TAD AMOUNT /GET AMOUNT ON SYSTEM SNA /WAS THERE ONLY 1 LEFT JMP I XEND /LAST DISK DCA AMOUNT /MORE TO GO BUT CLEAR THIS ONE DCA I TCNTR5 /CLEAR DISK POINTER JMP I RESTOR /TRY NEXT ONE / / /ROUTINE TO CHANGE DEVICE CODES / CHANG, 0 JMS XC8SW /GET SWITCH REGISTER BITS. RAR SNL CLA /CHANGE DEVICE CODES? JMP I CHANG /NO. JMS XC8SW /GET SWITCHES. AND A0770 DCA CSAVE1 /SAVE DESIRED TAD CCNTR1 DCA CSAVE2 TAD CHNPOT DCA RESTOR CHANGR, TAD I RESTOR /GET ADDRESS POINTER DCA KWAIT TAD I KWAIT /GET OLD CODE AND A7007 /MASK TAD CSAVE1 /ADD IN DESIRED DCA I KWAIT /STORE DESIRED DEVICE CODE ISZ RESTOR /UPDATE POINTER ISZ CSAVE2 /UPDATE CHANGE COUNTER JMP CHANGR JMP I CHANG /EXIT TO PROGRAM. / KWAIT, 0 A7007, 7007 A0770, 0770 CSAVE1, 0 CSAVE2, 0 CCNTR1, 7771 CHNPOT, CHNPOT+1 IOT0 IOT1 IOT2 IOT3 IOT4 IOT5 IOT6 K2000, 2000 / /THIS ROUTINE WILL GENERATE TIMING IF NEEDED BY THE APT SYSTEM / KTICK, 0 CLL CLA TAD 22 /GET HARDWARE CONFIGURATION AND K4000 SNA CLA /ON APT? JMP EXTICK /NO TAD I KTICK /GET TIMING VALUE DCA COUNT /ESATABLISH TIME ISZ CLKCNT JMP EXTICK /RETURN TAD COUNT /GET VALUE OF COUNTER DCA CLKCNT /STORE IT ISZ CNT /TIMING NEED BE DONE? JMP EXTICK TIME TAD KCNT /TIMING VALUE DCA CNT /INIT SECOND COUNTER EXTICK, ISZ KTICK /MOVE BEYOND TIMING VALUE JMP I KTICK COUNT, 0 CNT, -2 KCNT, -2 K0100, 0100 / / /ROUTINE TO NOTIFY APT OF USE IF REQUIRED / KTIME, 0 IOF /DISABLE INTERUPTS RDF /GET PRESENT DATA FIELD TAD KCDF DCA .+1 /ESTABLISHES CURRENT DATA FIELD HLT CIF 70 /FIELD 7. LOCATION OF UV PROM JMS I K6500 CLL CLA JMP I KTIME / K6500, 6500 / PAGE / / /THIS ROUTINE WILL NOTIFY APT OF AN ERROR AND SEND PC TO /APT SYSTEM. ALL ERRORS WILL RESULT IN PROGRAM HLT AND A TIME OUT ON /APT. APT WILL TAKE OVER FROM THERE. / AERRO, 0 IOF /DISABLE INTERUPTS CLA TAD 22 /CHECK FOR APT SYSTEM SMA CLA JMP I AERRO /RETURN NOT ON APT TAD I KERRO /GET PC DCA SAVPC RDF /GET CURRENT DATA FIELD TAD KCDF DCA .+2 TAD SAVPC HLT /REPLACED WILL CURRENT DATA FIELD CIF 70 /CHANGE IF FOR APT RETURN TO FIELD 7 JMP I K6520 /NOTIFIES APT OF ERROR HLT / K6520, 6520 KERRO, ERRO SAVPC, 0 / / /ROUTINE TO MOVE DISK POINTERS / MOVE, 0 TAD ADPT1 DCA AUTO10 TAD ADPT2 DCA AUTO11 TAD M10 DCA MCNTR1 TAD I AUTO10 /FROM HERE DCA I AUTO11 /TO THERE ISZ MCNTR1 /4 POINTERS JMP .-3 JMP I MOVE / ADPT1, DSK0A-1 ADPT2, DSK0B-1 MCNTR1, 0 / / TEXPC, TEXT "PC:" TEXGD, TEXT "GD:" TEXEX, TEXT "EX:" TEXCM, TEXT "CM:" TEXST, TEXT "ST:" TEXDA, TEXT "DA:" TEXCA, TEXT "CA:" TEXAD, TEXT "AD:" TEXDT, TEXT "DT:" / ERTX1, TEXT "READ STATUS ERROR" ERTX2, TEXT "DISK DATA ERROR" ERTX3, TEXT "WRITE STATUS ERROR" ERTX4, TEXT "RECALIBRATE STATUS ERROR" / ERMES1, TEXT "TRY TO FORMAT SAME CYLINDER AGAIN?" ERMES2, TEXT "TRY TO RECALIBRATE SAME DISK AGAIN?" ERMES3, TEXT "TRY TO CHECK SAME CYLINDER AGAIN?" / TEXEND, TEXT "RK8E/RK8L DISK FORMATTER PASS COMPLETE" MES1, TEXT "RK8E/RK8L DISK FORMATTER PROGRAM" MES2, TEXT "FOR ALL QUESTIONS, ANSWER Y FOR YES OR N FOR NO." MES3, TEXT "FORMAT DISK " MES4, TEXT "ARE YOU SURE?" MES5, TEXT "FORMAT SAME DISK(S) AGAIN?" / PAGE / WRKBUF=. / HITRK=. LOTRK=.+1 / ENDBUF=.+377 / /CONSOL SRC -V2-R0- CONSOLE PACKAGE /LAS= CALL C8CKSW OR JMS XC8SW /THIS WILL READ THE SWITCH REGISTER FROM THE PLACE SPECIFIED /BY LOCATION 20 BIT 0. /THE PROGRAN SHOULD CHECK FOR A CONTROL CHARACTER FRON THE TERMINAL /EVERY FIVE(5) SECONDS OR SOONER. /LOCATIONS THAT NEED TO BE SET UP FOR USING THE CONSOLE PACKAGE. /CNTVAL IN XC8PASS THIS LOCATION DETERMINDS THE NUMBER OF /PROGRAM COMPLETIONS THAT ARE NEEDED BEFORE THE PASS MESSAGE IS TYPED /THE VALUE SHOULD PUT THE PASS MESSAGE OUT IN THE RANGE OF 1 TO 5 MINUTES. /THIS SHOULD BE A POSITIVE NUNBER. /C8STRT THIS IS FOUND IN CNTRL ROUTINE CONTROL R PART /IT IS THE RETURN WHEN CONTROL R IS ENTERED (RESTART PROGRAM) /THE RETURN JUMPS TO XDOSW WHICH CONTAINS C8STRT SO PUT THE LABEL C8STRT /WHERE YOU WANT TO RESTART THE PROGRAM. /SETUP1 IN XC8ERR THIS IS THE MASK BIT FOR HALT ON ERROR /PLACE THE CORRECT BIT IN THIS LOCATION FOR HALTING ON ERRORS. /SETUP2 IN XC8PASS THIS IS THE MASK FOR HALT A END OF PASS. /THE CALL TABLE IS A CONDITIONAL ASSEMBLY. /TO ASSEMBLE THE CALL REMOVE THE / BEFORE CONSOL=0. /IN COMBINING THE CONSOL PACKAGE TO A DIAGNOSTIC. /THE CALL TABLE IS TO BE AT THE BEGINNING OF A PROGRAM. /CONSOL=0 PSKF= 6661 PCLF= 6662 PSKE= 6663 PSTB= 6664 PSIE= 6665 GTF= 6004 ACL= 7701 CAF= 6007 MQL= 7421 MQA= 7501 / *3000 / /********************************************************************* /C8PASS /THIS IS CALLED AT THE END OF EACH PROGRAM COMPLETION /THE VALUE OF** CNTVAL** WILL BE DETERMINED BY THE TIME IT TAKES /THE PROGRAM TO COMPLETE THIS MANY C8PASS TO BE IN THE 1 TO 4 MINUTE /RANGE / C8PASS=JMS XC8PAS /EX. OF CALL C8PASS / HLT /HALT IF NON CONSOL PACKAGE / JMP START1 /CONTINUE RUNNING THIS PROGRAM /RETURN TO LOCATION CALL PLUS ONE WITH THE AC=0 IF NON CONSOL PACKAGE AND HLT /IF CONTINUE TO RUN THEN RETURN TO CALL PLUS2 AC=0 /THE LOCATION SETUP2 IS THE MASK BIT FOR THE HALT AT END OF PASS /CHECK THAT IT IS CORRECT FOR THE CURRENT PROGRAM /CALLS USED BY XC8PAS ARE CHKCLA-XC8CRLF-XC8OCTA-XC8SW-XC8PNT-XC8INQ- XC8PAS, 0 CLA JMS CHKCLA /IS WORD 22 BIT 3 ACTIVE CONSOLE? JMP DOPACK /IS CLASSIC JMS C8GET /GET THE REGISTERS. JMS XC8SW /DEACTIVE CONSOL CHECK SR SETTING AND (400 /FOR HALT ON END OF C8PASS SZA CLA /1= HALT 0 CONTINUE JMP I XC8PAS /GO TO HALT JMP C8BY1 /CONTINUE ON RUNNING PROGRAM DOPACK, JMS CKCOUT /CLASS CHECK C8PASS COUNT JMP C8BY1 /C8PASS COUNT NOT DONE REDO PROGRAM ISZ PASCNT /C8PASS COUNT DONE SET C8PASS COUNT JMS XC8CRLF JMS XC8PNT /C8PRNT BUFFER MESPAS / TAD PASCNT /GET NUMBER JMS XC8OCTA /CONVERT IT TO ASCII JMS XC8CRLF /DO A CARRIAGE RETURN JMS C8GET /GET THE REGISTERS. JMS XC8SW /CHECK A HALT AT END OF C8PASS SETUP2, AND (400 /MASK BIT SZA CLA /HALT =1 NO SKIP CONTINUE =0 JMS XC8INQ /STOP PROGRAM EXECUTION-LOOK FOR INPUT C8BY1, ISZ XC8PAS /BUMP RETURN JMP I XC8PAS CKCOUT, 0 TAD DOSET /CHECK IF SET UP NEEDED SZA CLA /0=SET UP C8PASS COUNT VALUE /1=C8PASS COUNT VALUE OK JMP NOSET /C8PASS COUNT VALUE ON TAD CNTVAL /GET COUNT VALUE FOR THIS PROG CMA /SET TO NEGATIVE DCA DOCNT /STORE IN HERE ISZ DOSET /INDICATE VALUE SET UP NOSET, ISZ DOCNT /COUNT THE NUMBER OF PASSES JMP C8BY1 /EXIT FOR ANOTHER PASS DCA DOSET /SET TO C8PRNT C8PASS ISZ CKCOUT /BUMP RETURN FOR JMP I CKCOUT /C8PASS C8TYPE OUT DOCNT, 0 PASCNT, 0 / DOSET, 0 CNTVAL, 0 MESPAS, TEXT "DHRKDD PASS " /********************************************************************* /C8CKSW /THIS ROUTINE CAN BE USED INPLACE OF A READ THE SWITCHES LAS. /ROUTINE THAT WILL CHECK WHERE TO READ THE /C8 SWITCHES FROM IE. FROM PANEL OR PSEUDO SWITCH REGISTER /THE SELECTION IS DETERMINED BY THE STATE OF BIT 0 IN LOCATION 21. /C8CKSW= JMS XC8SW /EX. JMS XC8SW /READ THE C8SWIT REGISTER /RETURN WITH THE CONTENTS OF SWITCH REGISTER /RETURN TO NEXT LOCATION FOLLOWING CALL WITH THE AC= TO VALUE OF C8SWIT SETTING /CALLS USED ARE-XC8CKPA- XC8SW, 0 JMS XC8CKPA /GO CHECK THE IF ANY CONTRL NOP TAD 21 /GET WD FOR INDICATOR SPA CLA /CHECK IF FROM PANEL 4000 7614 /DO LAS AND SKIP GET FROM PANEL WITH LAS TAD 20 /PSEUDO SWITCH JMP I XC8SW /EXIT WITH STATUS BIT IN AC. /********************************************************************* /C8TTYI /THIS ROUTINE WILL LOOK FOR A INPUT FROM THE TERMINAL /AND REMOVE ANY PARITY BITS, THEN MAKE IT 8 BIT ASCI. / C8TTYI= JMS XC8TTY /EX. JMS XC8TTYI /READ CHAR FROM THE CONSOL DEVICE / /RETURN TO CALL PLUS ONE AC CONTAINS THE CHAR /CALLS USED -NONE- BUT C8CHAR IS OFF PAGE AND IN ROUTINE CALLED XC8ECHO / / XC8TTY, 0 KSF /LOOK FOR KEYBOARD FLAG JMP .-1 KRB /GET CHAR AND (177 /MASK FOR 7 BITS TAD (200 /ADD THE EIGTH BIT DCA C8CHAR /STORE IT TAD C8CHAR JMP I XC8TTY /EXIT /********************************************************************* /C8PRNT /THIS ROUTINE WILL TYPE THE CONTENTS OF THE C8 PRINT BUFFER. THE LOCATION /OF THE BUFFER WILL BE IN THE ADDRS FOLLOWING THE CALL. PRINTING OF THE BUFFER /WILL STOP WHEN A 00 CHAR IS DETECTED. CHARACTERS ARE PACKED 2 PER WORD. / C8PRNT= JMS XC8PNT /EX. JMS XC8PNT /C8PRNT THE CONTENTS OF THE FOLLOWING BUFFER / MESS77 /LOCATION OF C8PRNT BUFFER /C8PRNT WILL USE THE LOCATION FOLLOWING THE CALL AS THE POINTER FOR THE /C8PRNT ROUTINE.RETURN TO CALL PLUS TWO WITH AC= 0 /CALLS USED ARE-XC8TYPE-XC8PNT XC8PNT, 0 CLA CLL TAD I XC8PNT /GET C8PRNT BUFFERS STARTING LOCATION DCA PTSTOR /STORE IN PTSTOR ISZ XC8PNT /BUMP RETURN C8DO1, TAD I PTSTOR /GET DATA WORD AND (7700 /MASK FOR LEFT BYTE SNA /CHECK IF 00 TERMINATE JMP I XC8PNT /EXIT SMA /IS AC MINUS CML /MAKE CHAR A 300 AFTER ROTATE IAC /MAKE CHAR A 200 AFTER ROTATE RTR RTR RTR /PUT CHAR IN BITS 4-11 MAKE IT 8 BIT ASCII JMS XC8TYPE /C8PRNT IT ON CONSOLE TAD I PTSTOR /GET DATA WORD AND (0077 /MASK FOR RIGHT BYTE SNA /CHECK IF 00 TERMINATOR JMP I XC8PNT //EXIT TAD (3740 /ADD FUDGE FACTOR TO DETERMINE IF 200 SMA /OR 300 IS TO BE ADD TO CHAR TAD (100 /ADD 100 TAD (240 /ADD 200 JMS XC8TYPE /C8TYPE ONLY BITS 4-11 ISZ PTSTOR /BUMP POINTER FOR NEXT WORD JMP C8DO1 /DO AGAIN PTSTOR, 0 /STOR FOR C8PRNT BUFFER /************************************************************************** /C8PAUS /THIS ROUTINE WILL CHECK IF THE CONSOL PACKAGE IS ACTIVE,IF ACTIVE /IT WILL RETURN TO CALL PLUS ONE AC= 0. AND DO THAT INSTRUCTION. /IF THE CONSOL PACKAGE IS NOT ACTIVE THE CALL WILL BE REPLACED /WITH A 7402 HALT AND THEN RETURN TO THE HALT. / C8PAUS= JMS XC8PAU / / /EX. JMS XC8PAUS /CHECK IF ON ACTIVE CONSOL IF NOT HALT HERE / ANYTHING /RETURN HERE IF ON ACTIVE CONSOL / / /CALLS USED ARE -CHKCLA- XC8PAU, 0 CLA CLL JMS CHKCLA /CHECK LOC 22 BIT 3 CONSOLE BIT JMP C8DO3 /GO DO CONSOL PART RETURN CALL +1 CMA /DEACTIVE CONSOLE PACKAGE PUT HLT IN CALL TAD XC8PAU /GET CORRECT RETURN ADDRS DCA XC8PAU /SET UP RETURN TAD (7402 /GET CODE FOR HLT DCA I XC8PAU /PUT HALT IN CALL LOCATION C8DO3, JMP I XC8PAU /GO TO HALT OR RETURN TO NEXT LOCATION PAGE /********************************************************************* /C8CNTR /THIS ROUTINE WILL CHECK FOR THE PRESENCE OF CONTROL CHARACTERS /IT WILL CHECK FOR THE FOLLOWING CHAR C-R-Q-L-S / C8CNTR= JMS XC8CNT /EX. JMS XC8CNTR /CHECK FOR CONTROL CHARACTER / JMP ANYTHING /LOC FOLLOWING CALL IS FOR CONTINUING THE PROGRAM / JMP ANYTHING /LOC. IS FOR RETURN IF INMODE SET AND NOT CNTRL CHAR / /RETURN IS TO CALL PLUS ONE IF CONTINUE /RETURN IS TO CALL PLUS TWO IF INMODE SET AND NOT CONTROL CHAR /RETURN IS TO CALL PLUS TWO IF INMODE IS NOT SET AND NO /CONTROL CHAR ..THIS WILL PRINT THE CHARACTER AND A ? /CLEAR THE AC AND RETURN CALL+2. /CALLS USED ARE-CHKCLA-XC8TYPE-XC8CRLF-C8GET-UPAROW-XC8TYI-XC8PSW- / / / XC8CNT, 0 DCA ACSAVE /SAVE THE AC JMS CHKCLA /CHECK LOC.22 BIT3 FOR CONSOLE BIT JMP .+3 /ON ACTIVE CONSOLE TAD ACSAVE /DEACTIVE CONSOLEGET AC FOR RETURN JMP I XC8CNT /EXIT NOT ON ACTIVE CONSOLE GTF DCA FLSAVE MQA DCA MQSAVE /SAVE THE MQ DCA INDEXA /SET DISPLACEMENT INTO TABLE B TAD XTABLA /GET ADDRS OF TABLE A DCA GETDAT /CONTAINS POINTER TO CONTROL CHAR REDOA, TAD I GETDAT /GET CONTROL CHAR FROM TABLE SNA /CHECK FOR A 0 END OF TABLE JMP DONEA /END OF TABLE NO CONTROL CHAR TAD C8CHAR /COMPARE CHAR TO CONTROL CHAR SNA CLA /0 IF MATCH JMP GOITA /MATCH ISZ INDEXA /NO MATCH NOT END OF TABLE REDO ISZ GETDAT /BUMP INDEX FOR EXIT WHEN CONTROL FOUND JMP REDOA /BUMP GETDAT FOR COMPARE OF NEXT CNTRL CHAR. DONEA, TAD INMODE /CHECK IF PROGRAM EXPECTS CHAR SZA CLA /1=CHAR EXPECTED 0= NO CHAR EXPECTED JMP EXITA /CHAR EXPECTED TAD C8CHAR /GET CHAR - NOT CONTROL + NOT EXPECTED JMS XC8TYPE /C8PRNT CHAR TAD (277 /GET CODE FOR "?" JMS XC8TYPE JMS XC8CRLF ISZ XC8CNT /BUMP RETURN JMP I XC8CNT /EXIT CALL+2 EXITA, ISZ XC8CNT /BUMP RETURN FOR MAIN PROGRAM CHECK OF CHAR TAD C8CHAR /PUT CHAR IN AC. JMP I XC8CNT /EXIT GOITA, TAD C8CHAR /GET THE CONTENTS OF CHAR TAD (100 /ADD 100 TO FORM A GOOD ASCII CHARACTER DCA C8CHAR /RESTORE COFFECT CHAR TAD XTABLB /GET START OF TABLE B TAD INDEXA /GET NOW FAR INTO TABLE DCA GOTOA /STORE IT TAD I GOTOA /GET THE ROUTINE STARTTING ADDRESS DCA GOTOA /STORE IT IN HERE JMP I GOTOA /GOTO CONTROL CHAR ROUTINE GOTOA, 0000 /ADD OF CNTRL ROUTINE TO EXECUTE INDEXA, 0000 /DISPLACEMENT INTO CNTRL TABLE GETDAT, 0000 /LOCATION OF ADDRS OF CONTROL CHAR. XTABLA, TABLA /ADDRS OF TABLEA XTABLB, TABLB /ADDRS OF TABLEB TABLA, 7575 /CNTRL C BACK TO MONITOR 203 7564 /CNTRL L SWITCH ERROR PRINTTING DEVICE 214 7557 /CNTRL Q START DISPLAYING CHAR. AGAIN 221 7556 /CNTRL R BACK TO BEGINNING OF PROGRAM 222 7555 /CNTRL S STOP SENDING CHAR TO DISPLAY WAIT FOR CNTRL Q 223 7573 /CNTRL E CONTINUE WITH PROGRAM 205 7574 /CONTROL D CHANGE SWITCH REGISTER ON FLY 0000 TABLB, CNTRLC CNTRLL CNTRLQ CNTRLR CNTRLS CNTRLE CNTRLD / /CONTROL Q /START SENDING CHAR. TO THE DISPLAY /THIS WILL RETURN CONTROL TO CALL THAT WAS SET BY /THE CALL FOR CONTROL S. / CNTRLQ, DCA INMODE /SET SOFT FLAG FOR UNEXPECTED CHAR TAD C8SETS /CHECK IF CONTROL S TYPED IN SZA CLA JMP BYRETR /CONTROL S TYPED IN JMS C8GET /NO CONTROL S TYPED PREVIOUSLY JMP I XC8CNTR /LEAVE VIA CNTR ENTRY ADDRESS BYRETR, DCA C8SETS /CLEAR THE SOFT FLAG JMS C8GET /RESTORE REGISTERS JMP I C8RETR /EXIT TO ADDRESS SET BY CONTROL S / / /CONTROL R /GO TO THE QUESTION C8SWIT CNTRLR, DCA TTYLPT /CLEAR THE TYPE FLAG SET TO TTY DCA C8SETS /CLEAR SOFT FLAG FOR CNTRL S DCA INMODE JMS UPAROW /PRINT THE ^ AND C8CHAR C8BY4, DCA C8SWST /CLEAR FLAG FOR CNTRL D OR R JMP I XDOSW /GO TO ADDRS OF C8SWIT XDOSW, BGN /DOSW IS LABEL FOR C8SWIT QUESTION / / /CONTROL S /STOP SENDING CHAR. TO DISPLAY UNTIL A ^Q IS RECEIVED / / CNTRLS, TAD C8SETS /IF1 DO NOT STORE IN C8RETR SZA CLA JMP C8DO7 /DONT SET UP C8RETR IAC /MAKE RETURN CALL PLUS 2 TAD XC8CNT /GET RETURN FOR THIS CALL DCA C8RETR /STORE IT HERE FOR USE BE CNTROL Q C8DO7, ISZ C8SETS /SET FLAG TO SAVE CALL JMS XC8TTYI /LOOK FOR THE INPUT JMS C8GET /GET REGISTERS JMS XC8CNTR /CHECK FOR THE CONTROL CHAR CLA JMP CNTRLS /IF NOT A CNTRL Q R C REASK C8SETS, 0 C8RETR, 0 / /SWITCH OUTPUT FROM ONE OUTPUT DEVICE TO ANOTHER - THE TWO OUTPUTS ARE THE /CONSOLE AND THE PRINTER WITH DEVICE CDOE 66. / / CNTRLL, TAD TTYLPT /GET PRESENT C8SWIT INDICATOR CMA /COMPLEMENT IT DCA TTYLPT /STOR NEW C8SWIT JMS UPAROW /C8PRNT ^ AND CHAR ON NEW DEVICE JMS C8GET /RESTORE THE REGISTERS JMP I XC8CNT /EXIT / /CONTROL E /CONTINUE RUNNING FROM A INQUIRE OR ERROR / / CNTRLE, JMS UPAROW /PRINT THE CONTROL CHAR JMS C8GET /GET THE REGISTERS JMP I XC8CNT /RETURN TO CALL PLUS ONE / /CONTROL C /RETURN TO MONITOR CONTROL C CNTRLC, DCA TTYLPT /CLEAR THE LPT FLAG TO PRINT ON DISPLAY JMS UPAROW /C8PRNT A^ AND LETTER IN CHAR CDF CIF /GO TO 0 FLD CAF /CLEAR THE WORLD JMP I (7600 /GO TO DIAGNOSTIC MONITOR /********************************************************************* / / / PAGE / /CONTROL D /CHANGE THE SWITCH REGISTER ANYTIME CNTRL D AND RETURN TO /THE PROGRAM RUNNING. CNTRLD, JMS UPAROW TAD C8SETD /CHECK IF THE RETURN ADDRS IS SAFE SZA CLA JMP C8DO11 /DO NOT CHANGE THE RETURN ADDRS TAD XC8CNT /GET THE RETURN ADDRS AND SAVE IT DCA C8RETD /SAVE THE RETURN HERE ISZ C8SETD /INDICATE RETURN SAVED DONT DISTROY C8DO11, JMS XC8PSW /GO CHANGE THE SWITCH REGISTER DCA C8SETD /CLEAR THE FLAG JMS C8GET /RESTORE THE AC MQ LINK ETC JMP I C8RETD /RETURN TO THE PROGRAM / C8SETD, 0 C8RETD, 0 /THIS WILL TYPE A UP ARROW AND THE CHAR IN C8CHAR. UPAROW, 0 /C8PRNT THE "^" AND THE CHAR C8TYPED IN TAD (336 /CODE FOR ^ JMS XC8TYPE TAD C8CHAR /C8TYPE THE CHAR JMS XC8TYPE JMS XC8CRLF JMP I UPAROW /EXIT /*********************************************************************** C8GET, 0 CLA TAD MQSAVE MQL /RESTORE MQ TAD FLSAVE RAL /RESTORE THE LINK CLA TAD ACSAVE /RESTORE THE AC JMP I C8GET /GET THE REGISTERS /******************************************************************** /C8INQU /C8INQU ROUTINE WILL PRINT A WAITING /AND THE PROGRAM IS EXPECTING A CONTROL CHAR INPUT /IF CONTINUE FROM CONTROL CHAR RETURN IS CALL PLUS ONE /IF NO CONTROL CHAR ENTERED THEN WAITING IS REPRINTED /AND PROGRAM WAITS FOR A CONTROL CHAR AGAIN. / C8INQU = JMS XC8INQ /EX. JMS XC8INQ /C8 WILL PRINT A WAITINGAND WAIT FOR INPUT / DO ANYTHING /RETURN IS CALL PLUS ONE AC =0 CONTINUE /CALLS USED ARE -CHKCLA-XC8PNT-XC8TYI-C8GET-XC8CNTR- XC8INQ, 0 CLA CLL JMS CHKCLA /CHECK LOC 22 BIT 3 CONSOLE BIT SKP /ACTIVE CONSOLE PACKAGE JMP I XC8INQ /NOT CONSOLE LEAVE JMS XC8PNT WATMES /INQUIR WAITTING JMS XC8TTYI /GET CHARACTER JMS C8GET JMS XC8CNTR /CHECK IF CONTROL CHARACTER JMP I XC8INQ /EXIT AND CONTINUE JMP XC8INQ+1 /REASK WATMES, TEXT "WAITING " /********************************************************************* /C8SWIT /ROUTINE WILL CHECK IF CONSOL IS ACTIVE IF IT IS ACTIVE DISPLAY /SW QUESTION . IN NOT ACTIVE IT WILL NOT PRINT THE SW QUESTION BUT /RETURN TO CALL PLUS ONE AC=0. /C8SWIT WILL SET UP THE PSEUDO SWITCH /REGISTER WITH THE NEW DATA ENTERED / / C8SWIT = JMS XC8PSW /EX. JMS XC8PSW /SET UP PSEUDO C8SWIT REGISTER IF /ON THE CONSOL PACKAGE. RETURN IS CALL PLUS ONE AC = 0 /CALLS USED ARE -CHKCLA-XC8PSW-XC8PNT-XC8OCTA-XC8TYPE- XC8PSW, 0 JMS CHKCLA /CHECK LOC 22 BIT 3 CONSOLE BIT SKP /ACTIVE CONSOLE JMP I XC8PSW /DEACTIVE CONSOLE PACKAGE /RETURN WITHOUT ASKING PSEUDO SWITCH TAD C8SWST /IS THE SOFT FLAG SET FOR SWITCH? SZA CLA /SKIP IF ONE ENTRY AT ATIME OK JMP C8BY4 /SECOND ENTRY WITH OUT A EXIT GO TO SW QUESTION ISZ C8SWST /FIRST ENTRY SET FLAG C8RDPS, JMS XC8PNT /C8PRNT SR= MESA TAD 20 /GET CONTENTS OF SW JMS XC8OCTA /CONVERT IT TO ASCII TAD (40 /GET SPACE JMS XC8TYPE ISZ INMODE /SET FLAG FOR CHAR EXECTED JMS XC8ECHO /LOOK FOR INPUT JMS TSTCHA /NOT CONTROL TEST IT IS LEGAL TAD C8CHAR /STORE NEW CHAR IN SW REG DCA 20 TAD (-3 /GET A MINUS 3 DCA TMPCNT /STORE IN TEMP COUNT GETCH1, JMS XC8ECHO /GET NEXT CHAR JMS TSTCHA /CHECK IF CR + GOOD CHAR TAD 20 /GET C8SWIT REGISTER RTL CLL /ROTATE IT LEFT 3 PLACES RAL TAD C8CHAR /GET CHAR + ADD IT TO PREVIOUS CONTENTS DCA 20 /SAVE NEW CONTENTS ISZ TMPCNT /BUMP COUNT JMP GETCH1 /JMP BACK + GET NEXT CHAR JMP ENDIT /END 4 CHAR C8TYPED IN TSTCHA, 0 CIA /CMPL CHAR IN AC TAD (215 /TEST IF IT IS A CARRIAGE RETURN SNA CLA /SKIP IN NOT CR. JMP ENDIT /WAS CARRIAGE RETURN TAD C8CHAR /NOT CR. GET CHAR TAD (-260 /CHECK IF IT IS IN RANGE SPA CLA /IF NOT POSITIVE C8ERR CHAR SMALLER THEN 260 JMP ERR1 /C8ERR - CHAR TOO SMALL TAD C8CHAR /GET CHAR TAD (-270 /GET A -270 + CHECK IF IT IS LARGER THEN 7 SMA CLA /SKIP IF LESS THEN 7 JMP ERR1 /C8ERR ON CHAR NOT IN RANGE TAD C8CHAR /GET CHAR AND (7 /MASK FOR RIGHT BYTE DCA C8CHAR /STORE IN CHAR /GET CHAR IN AC JMP I TSTCHA /EXIT ERR1, TAD (277 /C8PRNT JMS XC8TYPE /? JMS XC8CRLF / JMP C8RDPS /EXIT + ASK AGAIN ENDIT, JMS XC8CRLF /DO A CR LF DCA C8SWST /CLEAR THE PSW ENTRY FLAG JMP I XC8PSW /EXIT ROUTINE C8SWST, 0 TMPCNT, 0 MESA, TEXT "SR= " PAGE /C8OCTA /OCTAL TO ASCII CONVERSION /THIS ROUTINE WILL TAKE THE OCTAL NUMBER IN THE AC AND CONVERT IT TO ASCII /THE RESULT WILL BE PRINTED ON THE CONSOL TERMINAL / C8OCTA= JMS XC8OCT / /EX. JMS XC8OCTA /AC CONTAINS NUMBER TO BE CHANGE / RETURN IS TO CALL PLUS ONE AC=0 / /CALLS USED ARE -XC8TYPE- XC8OCT, 0 CLL RTL RTL /POSITION THE FIRST CHAR FOR PRINTING DCA C8TMP1 /SAVE CORRECT POSITIONED WORD HERE TAD (-4 DCA C8CKP /STORE COUNTER IN HERE C8DO4, TAD C8TMP1 /GET FIRST NUMBER AND (0007 /MASK TAD (260 /ADD THE PRINT CONSTANT JMS XC8TYPE /TYPE THE NUMBER TAD C8TMP1 / RTL RAL /PUT NEXT NUMBER IN POSITION DCA C8TMP1 /STORE IT ISZ C8CKP /DONE YET WITH FOUR NUMBERS JMP C8DO4 /NOT YET DO MORE JMP I XC8OCT /DONE WITH FOUR C8TMP1, 0 C8CKP, 0 /********************************************************************* /C8CRLF /C8TYPE CR AND LF WITH FILLERS FOLLOWING EACH LF AND CR / / C8CRLF= JMS XC8CRL / /EX. JMS XC8CRLF /C8PRNT A CR AND LF WITH FILL / /RETURN TO CALL PLUS ONE AC =0 /CALLS USED ARE -XC8TYPE- XC8CRLF,0 CLA CLL TAD (215 /GET CODE FOR CR JMS XC8TYPE TAD FILLER CMA DCA FILCNT /STORE FILLER IN HERE TAD (212 /GET CODE FOR LF C8DO2, JMS XC8TYPE ISZ FILCNT /CHECK ON FILLER CHAR JMP C8DO2 /TYPE A NON PRINTING CHAR JMP I XC8CRL /EXIT FILLER, 0004 /FILLER SET FOR 4 CHAR FILCNT, 0 /COUNTER FOR FILL //************************************************************* /C8CKPA /THIS ROUTINE WILL CHECK IF A CHARACTER WAS ENTERED FROM THE /TERMINAL. IFTHE FLAG IS SET AND THE CONSOLE PACKAGE IS /ACTIVE A CHECK IS MADE TO DETERMIND IF IT IS A CONTROL CHAR. /IF IT WAS A CONTROL CHAR THEN ITS CONTROL FUNCTION IS PERFORMED. /IF NOT A CONTROL CHARACTER OR A CONTROL E-D-L-O- IT WILL DO /THE CONTROL FUNCTION AND RETURN TO CALL PLUS 2. /A NON CONTROL CHARACTER WILL BE PRINTEDAND A "?" IT WILL RETURN TO /CALL PLUS 2. /IF NO FLAG IS SET OR THE CONSOL IS NOT ACTIVE THE RETURN IS TO /CALL PLUS 1. / C8CKPA= JMS XC8CKP /EX. JMS XC8CKPA /CALL TO CHECK IF CONTROL CHAR SET / ANYTHING(SKIP) /RETURN IF NOT FLAG OR NOT CONSOLE ACTIVE / ANYTHING(JMP EXIT SKIP CHAIN) /RETURN IF NOT CONTROL OR CONTINUE CONTROL /CALLS USED ARE -XC8TTYI-XC8CNTR-C8GET- XC8CKP, 0 DCA ACSAVE /SAVE THE AC GTF /SAVE THE FLAGS DCA FLSAVE /SAVE THE FLAGS MQA /PUT MQ IN AC DCA MQSAVE /SACE THE MQ KSF /CHECK THE KEYBOARD FLAG JMP C8BY3 /EXIT TO CALL PLUS 1 JMS CHKCLA /CHECK LOC 22 BIT 3 CONSOLE BIT SKP /ACTIVE CONSOLE PACKAGE JMP C8BY3 /EXIT TO CALL PLUS 1 JMS XC8TTYI /GET THE CHAR JMS C8GET /GET THE FLAGS JMS XC8CNTR /CHECK IF CONTROL CHAR. NOP /RETURN IF A CONTINUE CHAR. ISZ XC8CKP /BUMP RETURN FOR CALL PLUS 2 C8BY3, JMS C8GET /GET REGISTERS JMP I XC8CKP /SAY GOOD BY //********************************************************************* /C8ECHO /THIS ROUTINE WILL LOOK FOR A CHAR FROM THE KEYBOARD. STORE IT IN LOCATION CHAR /CHECK IF IT WAS A CONTROL CHARACTER - SET INMODE - PRINT CHARACTER / C8ECHO = JMS XC8ECH /EX. JMS XC8ECHO /LOOK FOR CONSOL CHAR C8PRNT IT /RETURN CALL PLUS ONE AC = CHAR C8TYPED IN /CALLS USED ARE -XC8TTYI-XC8CNTR-C8GET-XC8ECH-XC8TTYPE / XC8ECH, 0 JMS XC8TTYI /WAIT FOR CHAR FROM KEYBOARD JMS C8GET /RESTORE THE REGISTERS ISZ INMODE /SET INMODE IDENTIFING THIS AS A EXPECTED CHAR JMS XC8CNTR /GO CHECK IF IT IS A CONTROL CHAR JMP I XC8ECH /WAS A CONTROL CHAR - CONTINUE RUNNING JMS XC8TYPE /NOT A CONTROL CHAR C8PRNT IT DCA INMODE /CLEAR FLAG THAT CHAR EXPECTED TAD C8CHAR /GET CHAR IN AC JMP I XC8ECH /EXIT C8CHAR, 0 INMODE, 0 /********************************************************************* /C8TYPE /THIS ROUTINE WILL C8PRNT ON THE CONSOLE OR THE LPT WITH DEVICE CODE 66. / / C8TYPE= JMS XC8TYP /EX. JMS XC8TYPE /C8PRNT THE CHAR IN THE AC. / /RETURN CALL PLUS ONE AC =0000 /DO NOT CLEAR THE LINK IN THIS ROUTINE NEEDED BYC8OCT /CALLS USED ARE -C8HANG-XC8CNTR-XC8PNT-XC8CRLF-XC8INQU- XC8TYP, 0 DCA PNTBUF /STORE CHAR TAD TTYLPT /CHECK O=TTY 7777=LPT SZA CLA JMP XDOLPT /DO OUT PUT ON LPT TAD PNTBUF TLS TSF JMP .-1 TCF JMP C8BY5 XDOLPT, TAD PNTBUF /GET CHAR PSTB PCLF /C8PRNT IT JMS C8HANG /CHECK KEYBOARD IF HUNG PCLF /CLEAR THE FLAG C8BY5, 7600 /CLEAR THE AC JMP I XC8TYP /EXIT PNTBUF, 0 TTYLPT, 0 C8HANG, 0 CLA / TAD C8BY5 /GET CONSTANT 7600 DCA PNTBUF /PNTBUF IS NOW A COUNTER PSKF /SKIP ON PRINTER DONE SKP /NOT DONE YET JMP I C8HANG /SAW FLAG DONE ISZ C8CONT /FIRST COUNTER FAST ONE JMP .-4 /CHECK IF FLAG SET YET ISZ PNTBUF /MADE 4096 COUNTS ON FAST COUNTER JMP .-3 /KEEP IT UP FOR 5 SEC TAD XC8CNTR /GET THE RETURN ADDRESS IN CONTROL DCA C8HANG /SAVE IT IN HANG DCA TTYLPT /ALLOW PRINTING ON TTY JMS XC8PNT MESHANG /LPT ERROR JMS XC8CRLF JMS XC8INQU /PRINT WAITING JMP I C8HANG /CONTINUE TO SAVE ADDRESS C8CONT, 0 /COUNTER FOR TIMER MESHANG,TEXT "LPT ERROR" PAGE /********************************************************************* /******************************************************************* /THIS ROUTINE WILL CHECK LOCATION 22 THE HARD WARE CONFIG WORD. /TO SEE IF THE CONSOLE BIT 3 )400) IS SET IF SET THEN RETURN /TO CALL PLUS TWO FO A ACTIVE CONSOLR PACKAGE AC=0 /IF NOT SET THEN TO CALL PLUS ONE FOR A DEACTIVE CONSOLE PACKAGE. CHKCLA, 0 CLA TAD 22 /GET THE COTENTA OF LOCATION 22 AND (400 /MASK FOR BIT 3 (400 SNA CLA / ISZ CHKCLA /ACTIVE CONSOLE PACKAGE RETURN /CALL PLUS ONE (1) FOR ACTIVE JMP I CHKCLA /DEACTIVE CONSOLE PACKAGE RETURN /CALL PLUS TWO (2) /C8ERR /THIS ROUTINE WILL DETERMINE WHAT TO DO WHEN A C8ERR IS ENCOUNTERED /WILL CHECK IF CLASSIC SYSTEM, WILL CHECK C8SWIT REGISTERS. / C8ERR= JMS XC8ERR /EX. JMS XC8ERR /GO TO C8ERR CALL IF NOT CONSOL / /RETURN IS CALL PLUS ONE AC =0000 /CALLS USED ARE -CHKCLA-XC8CRLF-XC8SW-XC8INQU-XC8PNT-XC8OCTA- XC8ERR, 0 IOF DCA ACSAVE /SAVE AC GTF DCA FLSAVE /SAVE THE FLAGS MQA DCA MQSAVE /SAVE THE MQ CLA CLL CMA /SUBTRACT A 1 FOR TRUE LOCATION TAD XC8ERR /GET RETTURN LOCATION DCA PCSAVE /SAVE ADD OF C8ERR CALL JMS CHKCLA /CHECK LOC.22 BIT 3 CONSOL BIT SKP /ACTIVE CONSOLE PACKAGE JMP NTCLAS /NOT CLASSIC SYSTEM JMS C8GET /GET THE REGISTERS. JMS XC8SW /CHECK SWITCH REG FOR BIT THAT INDICATES /NO ERROR MESSAGE SETUP1, AND (0000 /MASK FOR BIT FOR NO ERROR PRINTING /IF THIS ERROR MESSAGE IS TO ALWAYS /BE PRINTED LEAVE AND VALUE AT 0000 SZA CLA /SKIP IF BIT IS 0 PRINT ERROR MESSAGE JMP C8DO10 /DO NOT PRINT JMS XC8CRLF JMS XC8PNT ERRMES /PRINT THE ERROR MESSAGE JMS XC8PNT MESPC /PRINT THE PC STSTEMENT TAD PCSAVE JMS XC8OCTA /CONVERT 4 DIGIT PC TO ASCII JMS XC8PNT MESAC /PRINT THE AC MESS TAD ACSAVE JMS XC8OCTA JMS XC8PNT MESMQ /PRINT MQ TAD MQSAVE JMS XC8OCTA JMS XC8PNT MESFL /PRINT FL TAD FLSAVE JMS XC8OCTA JMS XC8CRLF C8DO10, JMS C8GET /GET THE REGISTERS. JMS XC8SW /CHECK SWITCH REGISTER SKP CLA /SKIP IF BIT 0 SET JMP C8BY2 /LEAVE JMS XC8INQ /GO TO THE INQUIRE ROUTINE JMP C8BY2 /LEAVE NTCLAS, JMS C8GET /GET THE REGISTERS. JMS XC8SW /CHECK PSEUDO SWITCH REGISTER /CHECK THE C8SWIT REGISTER SKP CLA /SKIP IF HALT JMP I XC8ERR /NO HALT CONTINUE TAD (7402 /CODE FOR HLT DCA I PCSAVE /PUT IT IN CALL LOC. JMS C8GET JMP I PCSAVE /EXIT TO CALL AND HALT C8BY2, JMS C8GET /GET THE REGISTERS JMP I XC8ERR ERRMES, TEXT "DHRKDD FAILED " MESPC, TEXT " PC:" MESAC, TEXT " AC:" MESMQ, TEXT " MQ:" MESFL, TEXT " FL:" PCSAVE, 7777 ACSAVE, 7777 MQSAVE, 7777 FLSAVE, 7777 $$$ /#8 /#8 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 | /RLFRMT: RL01 DISK PACK FORMATTER / / / / / / / / / /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /RL01 DISK PACK FORMATTING PROGRAM VERSION=1 PATCH="A&77 /NOTE: /THIS SOFTWARE WILL RUN ONLY ON PDP-8A,E,F,M! /EDIT HISTORY: /2-NOV-77 DAVID SPECTOR: CREATION /RLFRMT WRITES OS/8 BAD BLOCK LISTS /ON RL01 DISK PACKS /BAD BLOCK LIST FORMATS: /1. FACTORY-DETECTED BAD BLOCKS / CYLINDER 377 SURFACE 1 EVEN SECTORS 0-16 / BYTE CONTENTS COMMENTS / 0 22111000 SERIAL NUMBER: / 1 ?4443332 9876543210 (OCTAL) / 2 77666555 / 3 ?9998887 / 4 ? UNUSED / 5 ? / 6 ? / 7 ? / 10 CYLINDER BAD SECTOR ENTRY / 11 ???????D DOUBLE-DENSITY EXTENSION / 12 ??SECTOR / 13 ???????S SURFACE BIT / ... ... MORE BAD SECTOR ENTRIES / ??? ALL 1'S TERMINATOR ENTRY / NOTE: "?" REPRESENTS UNUSED ITEMS (0) /2. OS/8 BAD BLOCK LISTS /2A. DEVICES A AND B / CYLINDER 0 SURFACE 0 SECTOR 14 /WORD CONTENTS / 0 IDENTIFICATION CODE (ID) / 1 BAD BLOCKS FOR DEVICE A IN ASCENDING ORDER /... ... /20 0 (TERMINATOR FOR LIST) /21 BAD BLOCKS FOR DEVICE B IN ASCENDING ORDER /... ... /40 0 (TERMINATOR FOR LIST) /2B. DEVICE C / CYLINDER 0 SURFACE 0 SECTOR 16 /WORD CONTENTS / 0 IDENTIFICATION CODE (ID) / 1 BAD BLOCKS FOR DEVICE C IN ASCENDING ORDER /... ... /20 0 (TERMINATOR FOR LIST) /100-177 ID CODE /3. INTERNAL TRACK-SECTOR FORMAT: /WORD 0: TRACK /WORD 1: SECTOR /TERMINATOR: NEGATIVE TRACK WORD /4. INTERNAL OS/8 FORMAT: /WORD 0: DEVICE (0=A, 1=B, 2=C) /WORD 1: BLOCK NUMBER /TERMINATOR: NEGATIVE DEVICE WORD / +-------------------------------+ / ! ! / ! NOTE ! / ! ! / ! REFER TO THE DOCUMENT "RL01 ! / ! SUPPORT UNDER OS/8" FOR ! / ! FURTHER INFORMATION. ! / ! ! / ! ! / +-------------------------------+ /INSTRUCTIONS THAT GENERATE CONSTANTS AC0001=CLA IAC AC0002=CLA CLL CML RTL AC0003=CLA CLL CML IAC RAL /* AC0004=CLA CLL IAC RTL /* AC0006=CLA CLL CML IAC RTL /* AC0100=CLA IAC BSW /* AC2000=CLA CLL CML RTR AC3777=CLA CLL CMA RAR AC4000=CLA CLL CML RAR AC5777=CLA CLL CMA RTR AC6000=CLA CLL CML IAC RTR /* AC7775=CLA CLL CMA RTL AC7776=CLA CLL CMA RAL /* USE ONLY ON VT-78 AND PDP-8A,E,F,M /PAGE 0 VARIABLES AUTO1=10 AUTO2=11 AUTO3=12 AUTO4=13 TEMP=20 KEY=21 INT=22 /RESERVED TMP1=23 TMP2=24 TMP3=25 TMP4=26 TMP5=27 TMP6=30 TMP7=31 DIGIT=32 /DRIVE NUMBER DRIVE=DIGIT /DRIVE VALUE FMT=33 /7777 IF FORMATTED DISK FAC=34 /7777 IF FACTORY LIST OK /LOCATIONS WITHIN OS/8 MON=7605 /FAST MONITOR RETURN FROM RLFRMT /IDENTIFICATION CODE FOR BAD BLOCK LISTS ID=123 /BUFFERS FACTRY=4000 /2 PAGES: FACTORY LIST AANDB=FACTRY+400 /1 PAGE: OS/8 A&B LISTS C=AANDB+200 /1 PAGE: OS/8 C LIST X=C+200 /1 PAGE: "DON'T CARE" PAGE /(FOR READ-CHECKING) OLD=X /1 PAGE: OLD OS/8 A,B,C NEW=X+200 /1 PAGE: NEWLY-FOUND BAD BLOCKS /RL01 DEFINITIONS RLIOT=6600 RLDC=RLIOT 0 /CLEAR DEVICE RLSD=RLIOT 1 /SKIP IF DONE RLMA=RLIOT 2 /LOAD MEM ADDR RLCA=RLIOT 3 /LOAD REGISTER "A" RLCB=RLIOT 4 /LOAD REG "B" AND EXECUTE RLSA=RLIOT 5 /LOAD SECTOR ADDR /RLIOT 6 UNUSED RLWC=RLIOT 7 /LOAD WORD COUNT RRER=RLIOT 10 /READ ERROR REG RRWC=RLIOT 11 /READ WORD COUNT RRCA=RLIOT 12 /READ REG "A" RRCB=RLIOT 13 /READ REG "B" RRSA=RLIOT 14 /READ SECTOR ADDR RRSI=RLIOT 15 /READ SILO BYTE /RLIOT 16 UNUSED RLSE=RLIOT 17 /SKIP IF ERROR /RLCB FUNCTION BITS: RLMT=0 /MAINTENANCE MODE RLRE=1 /RESET DRIVE ERRORS RLST=2 /READ STATUS REGS INTO SILO RLSK=3 /SEEK RLRH=4 /READ HEADER RLWR=5 /WRITE RLRD=6 /READ RLRN=7 /READ WITH NO HEADER CHECK /BIT DEFINITIONS IN REGISTERS: BYTE=1000 /BYTE TRANSFER MODE *200 /STARTING ADDRESS TAD (IDMSG) /START HERE JMS TYPE /IDENTIFY SELF RE, TAD (MSG) /RESTART HERE. JMS TYPE /ASK FOR DRIVE NUMBER RE1, JMS GETKEY /WAIT FOR KEY TAD (-60) /CONVERT TO DIGIT DCA DIGIT TAD DIGIT AND (7774) /ALLOW ONLY DRIVES 0-3 SNA CLA JMP FA1 BUIN, TAD (BDMSG) /BAD USER INPUT: ADVISE USER. JMS TYPE JMP RE FA1, JMS GETKEY /WAIT FOR RETURN KEY TAD (-15) SZA CLA JMP BUIN TAD DIGIT /GOOD USER INPUT; BSW /CHANGE DIGIT TO DRIVE NR. DCA DIGIT JMS CRLF AC2000 /SET CURRENT TRACK TO ILLEGAL DCA CURTRK /VALUE IN ORDER TO FORCE A 'READ /HEADER' OPERATION THE FIRST /TIME "RL01" IS CALLED, SO WE /CAN FIND OUT WHERE THE HEAD IS. JMS RL01 /READ OS/8 BAD BLOCK LIST /(BBL) FOR DEVICES A&B RLRD /FUNCTION AANDB /MA 0 /TRACK 14 /SECTOR JMP FATAL /ERROR RETURN JMS RL01 /NORMAL RETURN: READ OS/8 /BBL FOR DEVICE C RLRD /FUNCTION C /MA 0 /TRACK 16 /SECTOR JMP FATAL /ERROR RETURN DCA RCTRK /PERFORM READ-CHECK OF ENTIRE /DISK TAD (-1000) /NUMBER OF TRACKS DCA TMP2 TAD (NEW-1) DCA AUTO3 /STORAGE FOR BAD ONES FOUND TAD (-100) DCA BADCNT /IN CASE ALL ARE "BAD" RCNEXT, JMS RCSUB /READ NEXT TRACK /EVEN SECTORS CLA IAC JMS RCSUB /ODD SECTORS ISZ RCTRK ISZ TMP2 JMP RCNEXT STA /TERMINATE NEW BAD LIST DCA I AUTO3 STA /READ BAD BLOCK LISTS FROM DISK /START WITH FACTORY-DETECTED /BAD BLOCK LIST /TRY ALL BAD BLOCK LISTS ON LAST /TRACK - SET "FAC" TO -1 IF LIST /IS READ IN OK, ELSE 0. /INITIALLY ASSUME OK. DCA FAC TAD (-10) /SET FOR 8 TRIES. DCA TMP1 DCA FACSEC /EVEN SECTORS, STARTING WITH 0. FACRD, JMS RL01 /CALL RL01 TRANSFER SUBROUTINE /TO TRY READING FACTORY BAD /BLOCK LIST. BYTE RLRD /FUNCTION WORD FACTRY /MA 777 /TRACK FACSEC, 0 /SECTOR JMP FACBAD /ERROR RETURN TAD (FACCTL-1) /NORMAL RETURN: TEST LIST JUST /READ FOR VALIDITY (4 ZEROS IN /FACTRY+4, 4 377'S IN FACTRY+374). DCA AUTO1 FAC1, TAD I AUTO1 /LOC FOR VALIDITY TEST. SNA /0 TERMINATES CONTROL LIST. JMP FACOK /MUST BE VALID; CONTINUE. DCA AUTO2 /LOC FOR VALIDITY TEST. TAD I AUTO1 /VALUE FOR VALIDITY TEST. DCA TMP2 TAD (-4) /BYTES TO CHECK. DCA TMP3 FAC2, TAD I AUTO2 /CHECK NEXT BYTE. AND (377) /HARDWARE SHOULD DO THIS! CIA TAD TMP2 SZA CLA /VALUE CHECKS OK? JMP FACBAD /NO. ISZ TMP3 /YES, DONE? JMP FAC2 /NO, CHECK NEXT BYTE. JMP FAC1 /YES, DO NEXT TEST IF ANY. FACBAD, ISZ FACSEC /BAD LIST OR I/O ERROR: TRY /READING NEXT COPY OF LIST. ISZ FACSEC /INCREMENT SECTOR BY 2. ISZ TMP1 /DONE 8 TRIES? JMP FACRD /NO, TRY NEXT LIST. DCA FAC /YES, DECLARE LIST BAD. FACOK, JMP CC1 /CONTINUE ON NEXT PAGE PAGE /CONTINUE FROM PREVIOUS PAGE CC1, TAD (-100) /FIND OUT IF DISK IS ALREADY DCA TMP1 /FORMATTED: SET FMT=0 IF NO, TAD (C+77) /FMT=7777 IF YES. LAST 100 OCTAL DCA AUTO1 /WORDS OF "C" LIST ARE EQUAL TO /ID CODE. STA /ASSUME IT IS FORMATTED DCA FMT PFCLP, TAD I AUTO1 /SCAN ID CODE LIST TAD (-ID) SZA CLA DCA FMT /FMT=0 IF UNFORMATTED ISZ TMP1 /DONE SCAN? JMP PFCLP /NOT YET TAD FMT /YES - TYPE SERIAL NR SZA CLA /AND WHETHER DISK IS ALREADY TAD (FRMMSG-UNFMSG) /FORMATTED TAD (UNFMSG) /OR NOT. JMS TYPE TAD FAC /IF FACTORY LISTS ARE BAD, SZA CLA /TYPE A SPECIAL MESSAGE. JMP EE1 TAD (BDFMSG) /"FACTORY LIST DESTROYED" JMS TYPE JMP EE2 /AND SKIP AROUND FACTORY BBL /PROCESSING. EE1, TAD (SERMSG) /IF FACTORY LISTS ARE GOOD, /PRINT PACK SERIAL NUMBER JMS TYPE TAD (FACTRY+3) /ADDR OF MSB DCA TMP1 JMS DPSNH /DIGITS 9-5 JMS DPSNH /DIGITS 4-0 JMS CRLF TAD (FACTRY+7) /CONVERT FACTORY-DETECTED DCA AUTO1 /BAD BLOCK LIST FROM FACTORY TAD (FACTRY+7) /FORMAT (DEC STANDARD 144) TO DCA AUTO2 /TRACK/SECTOR FORMAT. JMS CONV1 TAD (FACTRY+7) /CONVERT FACTORY-DETECTED BAD DCA AUTO1 /BLOCK LIST FROM TRACK/SECTOR TAD (FACTRY+7) /FORMAT TO 2-WD OS/8 FORMAT. DCA AUTO2 JMS CONV2 TAD (FACTRY+10) /PUT FACTORY-DETECTED BAD BLOCK JMS ORDER /LIST INTO ASCENDING ORDER AND /DELETE ANY DUPLICATE BLOCKS /CAUSED BY BOTH SECTORS BEING /BAD. JMS REPORT /TYPE BAD BLOCK LIST FACMSG /OF FACTORY-DETECTED FACTRY+10 /BAD BLOCKS. EE2, TAD FMT /IS DISK FORMATTED? SNA CLA JMP AA /NO - THERE ARE NO OLD OS/8 LISTS TAD (OLD-1) /YES - TRANSFER OLD OS/8 BAD DCA AUTO3 /BLOCK LISTS TO "OLD" LIST AND TAD (BBCTL-1) /CONVERT TO 2-WD OS/8 FORMAT. DCA AUTO2 BBTRAN, TAD I AUTO2 /TRANSFER NEXT LIST (A,B,C) SNA JMP AB /DONE DCA AUTO1 /LIST ADDRESS TAD I AUTO2 /DEVICE CODE DCA TMP1 BBTRNA, TAD I AUTO1 /TRANSFER NEXT ENTRY SNA /(0 IS OS/8 TERMINATOR) JMP BBTRAN /TRY NEXT LIST DCA TMP2 TAD TMP1 DCA I AUTO3 /STORE DEVICE CODE IN "OLD" TAD TMP2 DCA I AUTO3 /STORE BLOCK IN "OLD" JMP BBTRNA /TRY NEXT ENTRY AB, STA /TERMINATE "OLD" LIST DCA I AUTO3 TAD (OLD) /ORDER "OLD" LIST JMS ORDER JMS REPORT /TYPE BAD BLOCK LIST OLDMSG /OF OLD OS/8 BLOCKS OLD AA, TAD (NEW-1) /CONVERT NEWLY-FOUND BAD DCA AUTO1 /BLOCK LIST FROM TRACK/SECTOR TAD (NEW-1) /FORMAT TO 2-WD OS/8 FORMAT. DCA AUTO2 JMS CONV2 TAD (NEW) /ORDER "NEW" LIST JMS ORDER JMS REPORT /TYPE BAD BLOCK LIST NEWMSG /OF NEWLY-FOUND NEW /BAD BLOCKS. TAD FMT /FORMATTED DISK? SNA CLA JMP AA1 /NO TAD (NEW-1) /YES: FIND OUT IF THERE ARE DCA AUTO1 /ANY NEW BAD BLOCKS NOT LISTED /IN THE OLD LIST JMP AA2 /CONTINUE ON NEXT PAGE PAGE /CONTINUE FROM PREVIOUS PAGE AA2, TAD (OLD-1) /EXAMINE NEXT ENTRY IN "NEW" DCA AUTO2 TAD I AUTO1 SPA JMP AA1 /NO MORE ENTRIES IN "NEW" DCA TMP1 /DEVICE CODE TAD I AUTO1 DCA TMP2 /BLOCK SKP AA3, ISZ AUTO2 /SKIP REST OF "OLD" ENTRY AA4, TAD I AUTO2 /SCAN "OLD" ENTRIES /IS THERE ANOTHER ENTRY? SPA JMP NEWFND /NO - A NEW ENTRY WAS FOUND /WHICH HAD NO CORRESPONDING OLD /ENTRY - TYPE WARNING MESSAGE. CIA /YES - DOES IT EQUAL THE NEW TAD TMP1 /ENTRY? SZA CLA JMP AA3 /NO, CONTINUE SCAN TAD I AUTO2 /TEST 2ND WORD OF ENTRY CIA TAD TMP2 SZA CLA JMP AA4 /NO, CONTINUE SCAN JMP AA2 /YES - NEW BLOCK APPEARS IN /OLD LIST; TRY NEXT NEW ENTRY. NEWFND, CLA /A REALLY NEW BAD BLOCK TAD (ADDMSG) /HAS BEEN FOUND JMS TYPE AA1, CLA TAD FMT /IS DISK UNFORMATTED AND ALSO /WITHOUT A VALID FACTORY BBL? TAD FAC SNA CLA JMP EE3 /YES TO BOTH - SKIP MERGE PRO- /CEDURE SO THAT "NEW" WILL CON- /SIST ONLY OF NEWLY-FOUND BAD /BLOCKS. TAD FMT /IS DISK FORMATTED? SNA CLA TAD (FACTRY+7-OLD+1) /NO: MERGE FACTORY- /DETECTED BAD BLOCK LIST /INTO NEWLY-FOUND BAD BLOCK /LIST TAD (OLD-1) /YES: MERGE OLD OS/8 BAD /BLOCKS INTO NEW LIST DCA AUTO1 TAD (NEW-1) DCA AUTO2 AB1, TAD I AUTO2 /FIND END OF "NEW" LIST SPA CLA JMP AB2 /FOUND END ISZ AUTO2 /NOT YET JMP AB1 AB2, STA /FOUND END; BACKUP POINTER TAD AUTO2 /TO POINT TO JUST BEFORE DCA AUTO2 /END OF "NEW" LIST AB4, TAD I AUTO1 /GET NEXT INPUT ENTRY SPA JMP AB3 /NO MORE ENTRIES TO MERGE DCA I AUTO2 /TACK INPUT ONTO END OF TAD I AUTO1 /"NEW" LIST DCA I AUTO2 JMP AB4 /TRANSFER NEXT ENTRY AB3, DCA I AUTO2 /DONE MERGE; TERMINATE "NEW" EE3, TAD (NEW) /ORDER "NEW" AND DELETE JMS ORDER /DUPLICATE ENTRIES IF ANY. JMS REPORT /TYPE BAD BLOCK LIST FINMSG /OF OS/8 BAD BLOCKS ABOUT NEW /TO BE WRITTEN OUT. TAD (AANDB-1) /NEW LIST IS NOW COMPLETE. /PREPARE OS/8 LISTS FOR /WRITING ONTO DISK. /ZERO EACH LIST JMS ZERO TAD (C-1) JMS ZERO TAD (ID) /STORE ID CODES IN PROPER DCA AANDB /PLACES. TAD (ID) DCA C TAD (C+77) DCA AUTO1 TAD (-100) DCA TMP1 TAD (ID) DCA I AUTO1 ISZ TMP1 JMP .-3 TAD (NEW) /TRANSFER NEW LIST TO PROPER DCA TMP3 /OS/8 LISTS PRIOR TO WRITING. TAD (BBCTL-1) DCA AUTO2 JMP AD1A /TRANSFER FIRST LIST (A) AD1, CLA /TRANSFER NEXT LIST (B,C) DCA I AUTO3 /TERMINATE LAST LIST (A,B,C) AD1A, TAD I AUTO2 SNA JMP ASK /DONE TRANSFER DCA AUTO3 /OS/8 LIST ADDRESS TAD I AUTO2 DCA TMP1 /DEVICE CODE TAD (-20) DCA TMP2 /COUNTER - ONLY 15 BAD BLOCKS /ARE ALLOWED PER DEVICE. SKP /TRANSFER EACH ENTRY, THIS DEV. AD2, ISZ TMP3 /LOCATE TO NEXT ENTRY IN "NEW". TAD I TMP3 /GET DEV CODE - IS NEW ENTRY /SAME DEVICE AS /CURRENT OS/8 LIST BEING FILLED? SPA JMP AD1 /NO MORE ENTRIES IN "NEW" CIA /COMPARE DEVICES TAD TMP1 SZA CLA JMP AD1 /DIFFERENT DEVICE; TRANSFER TO /NEXT OS/8 LIST. JMP AD4 /SAME DEVICE. /CONTINUE ON NEXT PAGE PAGE /CONTINUE FROM PREVIOUS PAGE AD4, ISZ TMP3 /LOCATE TO BLOCK NR. TAD TMP1 /CHECK TO SEE IF BAD BLOCK IS /IN THE RANGE 0-66 OCTAL ON SZA CLA /DEVICE A; IF SO, WARN USER NOT JMP AD3 /TO USE AS SYSTEM DEVICE. TAD I TMP3 STL CIA /13-BIT NEGATE TAD (66) /13-BIT COMPARE SZL CLA /IS BLOCK LE 66? JMP AD3 /NO, IT'S OK TAD (ZERMSG) /YES, WARN USER JMS TYPE AD3, TAD I TMP3 /IGNORE ANY BLOCK ZERO (BLOCK /ZERO CANNOT BE REPRESENTED IN /OS/8 BAD BLOCK LISTS.) SNA JMP AD2 /IGNORE ZERO BLOCK DCA I AUTO3 /STORE IN OS/8 LIST A,B, OR C /(NON-ZERO BLOCK NR) ISZ TMP2 /16 BAD BLOCKS, THIS DEVICE? JMP AD2 /NO, TRANSFER NEXT ENTRY TAD (OVFMSG) /YES, WARN USER AND QUIT JMP ERROR ASK, TAD (FMTMSG) /WAIT FOR USER TO VERIFY /GOING AHEAD AND WRITING /OUT OS/8 BAD BLOCK LISTS. /"FORMAT DISK PACK?" JMS TYPE JMS GETKEY /WAIT FOR KEY DCA TMP1 JMS GETKEY /WAIT FOR RETURN TAD (-15) SZA CLA JMP ASK JMS CRLF TAD TMP1 ZZ="Y&177 TAD (-ZZ) /TEST FOR "Y" (YES) SZA CLA JMP RE RLDC /GO-AHEAD RECEIVED: CHECK FOR WRITE-LOCK. /CLEAR CONTROLLER. TAD (BYTE RLST) JMS IO /DO "GET STATUS" COMMAND. JMP FATAL /ERROR: CANNOT HAPPEN. RRSI /IGNORE BYTE #1. RRSI /GET BYTE #2. BSW /BIT [40] IS WRITE-LOCK BIT. SPA CLA /IS WRITE-LOCK ENABLED? JMS REMOVE /YES: ASK USER TO DISABLE. JMS RL01 /NO: DO ACTUAL FORMATTING. /ACTUAL FORMATTING: WRITE /OUT ALL OS/8 BAD BLOCK /LISTS. CALL INTERNAL HANDLER /FOR EACH LIST WRITTEN. RLWR /FUNCTION=WRITE AANDB /A AND B LISTS 0 /TRACK=0 14 /SECTOR=14 JMP FATAL /ERROR RETURN JMS RL01 RLWR /FUNCTION=WRITE C /C LIST 0 /TRACK=0 16 /SECTOR=16 JMP FATAL /ERROR RETURN TAD (DNMSG) /TYPE "DONE" JMS TYPE JMP RE /AND ASK FOR NEXT PACK. /SUBROUTINE TO ASK USER TO DISABLE WRITE-LOCK REMOVE, 0 REMOV1, TAD (WRMSG) JMS TYPE JMS GETKEY TAD (-15) /WAIT FOR RETURN. SZA CLA JMP REMOV1 /IGNORE ANY OTHER KEY. JMP I REMOVE /CONVERSION SUBROUTINES /SUBROUTINE TO CONVERT FROM FACTORY FORMAT (DEC STANDARD 144) /TO TRACK/SECTOR FORMAT /INPUT: AUTO1=INPUT LIST-1 / AUTO2=OUTPUT LIST-1 CONV1, 0 CONV1A, TAD I AUTO1 /CYLINDER BYTE AND (377) /HARDWARE SHOULD DO THIS! DCA TMP1 TAD I AUTO1 /DOUBLE DENSITY BIT AND (377) /HARDWARE SHOULD DO THIS! CLA /IGNORE TAD I AUTO1 /SECTOR BYTE AND (377) /HARDWARE SHOULD DO THIS! DCA TMP2 TAD I AUTO1 /SURFACE BIT AND (377) /HARDWARE SHOULD DO THIS! CLL RAR SZA CLA /TEST FOR END OF LIST JMP CONV1B /DONE TAD TMP1 /CONSTRUCT TRACK RAL DCA I AUTO2 /STORE TRACK TAD TMP2 AND (77) DCA I AUTO2 /STORE SECTOR JMP CONV1 CONV1B, STA /TERMINATE OUTPUT LIST DCA I AUTO2 JMP I CONV1 PAGE /SUBROUTINE TO CONVERT FROM TRACK/SECTOR FORMAT /TO 2-WD OS/8 FORMAT /INPUT: AUTO1=INPUT LIST-1 / AUTO2=OUTPUT LIST-1 CONV2, 0 CONV2C, TAD I AUTO1 DCA TMP1 /TRACK TAD I AUTO1 DCA TMP2 /SECTOR TAD TMP1 /TEST FOR END OF LIST SPA CLA JMP CONV2D /DONE TAD TMP2 /TEST FOR DEVICE C CLL RAR SZL JMP CONV2A /MUST BE A OR B TAD (-10) SMA CLA JMP CONV2A /MUST BE A OR B TAD TMP1 /MUST BE C; TEST FOR ILLEGAL /BAD BLOCKS. SNA CLA JMP CONV2C /ILLEGAL: TRACK 0; IGNORE TAD (-777) SNA CLA JMP CONV2C /ILLEGAL: TRACK 777; IGNORE TAD TMP2 /CONVERT DEVICE C BLOCK CLL RTR DCA TMP2 /BITS [3] SO FAR TAD TMP1 AC0002 DCA I AUTO2 /STORE DEVICE CODE FOR C STA TAD TMP1 CLL RTL /BITS [3774] TAD TMP2 /BITS [3777] CONV2B, DCA I AUTO2 /STORE BLOCK NUMBER JMP CONV2C /CONVERT NEXT ENTRY CONV2A, CLA /PROCESS DEVICES A AND B TAD TMP2 /CONVERT BLOCK NR CLL RAR SZL TAD (24) TAD (-10) CLL RAR DCA TMP2 /BITS [17] SO FAR TAD TMP1 CLL RTL RTL /LINK=DEVICE NR (A=0, B=1) /BITS [7760] TAD TMP2 /BITS [7777] DCA TMP1 RAL /GET DEVICE CODE DCA I AUTO2 /STORE DEVICE CODE FOR A OR B TAD TMP1 JMP CONV2B /STORE BLOCK NR CONV2D, STA /TERMINATE OUTPUT LIST DCA I AUTO2 JMP I CONV2 /SUBROUTINE TO ZERO A PAGE CONTAINING AN OS/8 BAD /BLOCK LIST /INPUT: AC=ADDRESS OF LIST-1 ZERO, 0 DCA AUTO1 TAD (-200) DCA TMP1 DCA I AUTO1 ISZ TMP1 JMP .-2 JMP I ZERO /SUBROUTINE TO ORDER A 2-WD OS/8 BAD BLOCK LIST AND /DELETE DUPLICATE ENTRIES IF ANY /INPUT: AC=ADDRESS OF LIST ORDER, 0 DCA TMP1 AC7776 TAD TMP1 DCA TMP2 /FOR EACH TMP2, ALL TMP3 WILL /BE COMPARED TO DETERMINE /MINIMUM VALUE ORDERA, AC0002 /FIND MINIMUM OF REMAINING /ENTRIES IN LIST TAD TMP2 DCA TMP2 TAD I TMP2 SPA CLA JMP DD /DONE; DELETE DUPLICATES TAD TMP2 /START WITH CURRENT ENTRY DCA TMP3 /AND COMPARE WITH REST ORDERB, AC0002 /COMPARE WITH NEXT ENTRY TAD TMP3 DCA TMP3 TAD I TMP3 SPA CLA JMP ORDERA /NO MORE REMAINING ENTRIES; /ORDER NEXT ENTRY TAD I TMP3 /COMPARE DEVICE CODES CIA /12-BIT COMPARE TAD I TMP2 SPA SNA JMP ORDERD /COMPARE 2ND WORD ORDERC, CLA /DISORDERED; INTERCHANGE ENTRIES TAD TMP2 DCA TMP4 TAD TMP3 DCA TMP5 JMS EXCH ISZ TMP4 ISZ TMP5 JMS EXCH JMP ORDERB /CONTINUE COMPARING TO FIND /MINIMUM ENTRY /RETURN FROM "ORDER" DD2, DCA I TMP2 /STORE TERMINATOR JMP I ORDER /AND RETURN /SUBROUTINE TO INTERCHANGE TWO ENTRIES EXCH, 0 TAD I TMP4 DCA TMP6 TAD I TMP5 DCA I TMP4 TAD TMP6 DCA I TMP5 JMP I EXCH PAGE /CONTINUATION OF ORDERING SUBROUTINE ORDERD, SZA CLA /COMPARE DEVICE CODES JMP ORDERB /ALREADY ORDERED OK TAD TMP2 /PREPARE TO COMPARE 2ND WORD DCA AUTO2 /(BLOCK NR) TAD TMP3 DCA AUTO3 TAD I AUTO3 STL CIA /13-BIT NEGATE TAD I AUTO2 /13-BIT COMPARE SNL SZA JMP ORDERC /DISORDERED; INTERCHANGE SZA CLA JMP ORDERB /ALREADY ORDERED OK AC2000 /DEVICE CODE AND BLOCK NR /BOTH EQUAL: A DUPLICATE ENTRY! /SET EARLIER COPY TO SPECIAL /VALUE (2000); LATER IT WILL /BE DELETED FROM LIST. DCA I TMP2 JMP ORDERA /CONSIDER IT ORDERED AND /ORDER NEXT ENTRY. DD, TAD TMP1 /LIST IS NOW ORDERED. SCAN /LIST, COMPRESSING OUT ANY /"2000" VALUES (DUPLICATE /ENTRIES). /INITIAL OUTPUT IS INPUT DCA TMP2 DD1, TAD I TMP1 /SCAN NEXT ENTRY SPA JMP DD2 /DONE TAD (-2000) /TEST FOR DUPLICATE SZA CLA JMP DD3 /NO - COPY OVER ISZ TMP1 /YES - IGNORE IT ISZ TMP1 JMP DD1 DD3, TAD I TMP1 /COPY OVER INPUT TO OUTPUT DCA I TMP2 /TO COMPRESS LIST. ISZ TMP1 ISZ TMP2 TAD I TMP1 DCA I TMP2 ISZ TMP1 ISZ TMP2 JMP DD1 /SCAN NEXT ENTRY /SUBROUTINE TO REPORT (TYPE) A BAD BLOCK LIST REPORT, 0 TAD (-4-1) /MAX ENTRIES ON FIRST LINE DCA TMP2 TAD I REPORT /ADDR OF HEADING MESSAGE JMS TYPE TAD (BBMSG) /"BAD BLOCKS:" JMS TYPE ISZ REPORT TAD I REPORT /ADDRESS OF LIST DCA TMP1 ISZ REPORT TAD I TMP1 /IS LIST NULL? SMA CLA JMP REP2 /NO TAD (NNMSG) /YES - TYPE "NONE" JMS TYPE REP3, JMS CRLF /DONE JMP I REPORT REP2, TAD I TMP1 /TYPE NEXT ENTRY SPA CLA JMP REP3 /NONE - DONE ISZ TMP2 /IS OUTPUT LINE FILLED? JMP REP4 /NO TAD (-10) /YES, PRINT CRLF /MAX ENTRIES ON SUCCEEDING LINES DCA TMP2 JMS CRLF REP4, TAD I TMP1 /VALID ENTRY: TYPE IT TAD ("A) /CONVERT DEVICE CODE TO /DEVICE LETTER AND TYPE IT. JMS PRINT /"A","B","C" JMS PRINTB /SPACE ISZ TMP1 TAD I TMP1 /BLOCK NR JMS PRINTN /PRINT AS OCTAL NR JMS PRINTB /2 SPACES JMS PRINTB ISZ TMP1 /NEXT ENTRY JMP REP2 /TYPE NEXT ENTRY /SUBROUTINE TO PRINT 5 DIGITS OF SERIAL NUMBER DPSNH, 0 TAD I TMP1 RAR JMS DPSNT /DIGITS 9-8, 4-3 TAD I TMP1 RAR /LINK=MSB OF DIGIT 7 OR 2 STA CML /BACKUP BYTE POINTER AND /CORRECT LINK FOR OVERFLOW. TAD TMP1 DCA TMP1 RTL /LINK TO BIT [4]. RAL DCA TMP2 TAD I TMP1 BSW AND (3) /BITS [3]. TAD TMP2 /BITS [7]. JMS DPSND /DIGIT 7, 2 TAD I TMP1 JMS DPSNT /DIGITS 6-5, 1-0 STA TAD TMP1 DCA TMP1 JMP I DPSNH /SUBROUTINE TO PRINT 2 DIGITS OF SERIAL NUMBER DPSNT, 0 DCA TMP2 TAD TMP2 RTR RAR JMS DPSND /2ND SIG. DIGIT TAD TMP2 JMS DPSND /1ST SIG. DIGIT JMP I DPSNT /SUBROUTINE TO PRINT OCTAL DIGIT DPSND, 0 AND (7) TAD ("0) JMS PRINT JMP I DPSND PAGE /FATAL I/O ERROR ROUTINE FATAL, TAD (FAMSG) JMP ERROR /"FATAL I/O ERROR" AND QUIT. /SUBROUTINE TO READ-CHECK EVEN OR ODD SECTORS /ON ONE TRACK RCSUB, 0 DCA RCSECT TAD (-24) /NUMBER OF SECTORS DCA TMP1 RCLOOP, JMS RL01 /PERFORM READ RLRD X /MA (DON'T CARE) RCTRK, 0 /TRACK RCSECT, 0 /SECTOR JMS RCBAD /ERROR RETURN: ADD BLOCK /TO "NEW" BAD BLOCK LIST ISZ RCSECT /NORMAL RETURN: INCREMENT ISZ RCSECT /SECTOR ISZ TMP1 JMP RCLOOP JMP I RCSUB /DONE /SAVE TRACK/SECTOR OF NEWLY-FOUND BAD BLOCK RCBAD, 0 TAD RCTRK DCA I AUTO3 TAD RCSECT DCA I AUTO3 ISZ BADCNT /ONLY ALLOW 64 JMP I RCBAD TAD (TOOMSG) /OVER 63 BAD BLOCKS ERROR, JMS TYPE /SEVERE ERROR ENTRY POINT TAD (ERRMSG) /"CANNOT FORMAT DISK" JMS TYPE JMP RE /RESTART ("DRIVE?") BADCNT, 0 /TERMINAL SUPPORT SUBROUTINES /FUNCTIONS: /TYPE TYPE A STRING WHOSE ADDR IS IN AC (UNDERLINE / MEANS CRLF, 00 TERMINATES). /GETKEY WAIT FOR A KEY, GET AND ECHO THE 7-BIT ASCII VALUE. /PRINT PRINT ASCII CHAR. /PRINTN PRINT OCTAL CONTENTS OF AC. /CRLF PRINT RETURN/LINE FEED COMBINATION. /PRINTB PRINT A BLANK CHAR. /INTERESTING LOCATIONS: /TEMP TEMP STORAGE /KEY LAST KEY TYPED TYPE, 0 DCA TEMP CLL TY1, TAD I TEMP SNL BSW AND (77) SNA JMP I TYPE TAD (-37) /TEST FOR UNDERLINE CHAR SZA JMP TY2 JMS CRLF JMP TY3 TY2, TAD (277) AND (277) TAD (240) JMS PRINT TY3, SNL CLA ISZ TEMP JMP TY1 GETKEY, 0 KSF JMP .-1 JMS LOOK JMS PRINT TAD KEY JMP I GETKEY LOOK, 0 KRB AND (177) DCA KEY TAD KEY TAD (-3) SNA CLA JMP I (7605) TAD KEY JMP I LOOK PRINTN, 0 DCA 0 TAD (-4) DCA TEMP PR1, TAD 0 RTL; RAL DCA 0 TAD 0 RAL AND (7) TAD (260) JMS PRINT ISZ TEMP JMP PR1 JMP I PRINTN PRINT, 0 TLS TSF JMP .-1 CLA KSF JMP I PRINT JMS LOOK CLA JMP I PRINT CRLF, 0 TAD (215) JMS PRINT TAD (212) JMS PRINT JMP I CRLF PRINTB, 0 TAD (240) JMS PRINT JMP I PRINTB /LITERALS PAGE /SUBROUTINE TO TRANSFER DATA TO/FROM RL01 DISK /NOTE: ONLY ONE TRY IS ATTEMPTED! RL01, 0 TAD I RL01 /GET ARGUMENTS: FUNCTION DCA FNC ISZ RL01 TAD I RL01 /MA DCA MA ISZ RL01 TAD I RL01 /TRACK DCA TRACK ISZ RL01 TAD I RL01 /SECTOR BSW /CONVERT TO RL8A FORMAT DCA SECTOR ISZ RL01 TAD TRACK /CALCULATE CYLINDER AND CLL RAR /SURFACE FROM TRACK DCA CYL RTR DCA SURF JMS TRKCMP /COMPARE WITH CURRENT /TRACK; IF SAME, DO THE /TRANSFER RETRY, RLDC /IF DIFFERENT, SEEK TO /REQUESTED TRACK /CLEAR CONTROLLER, AC SEEK, IAC /SEEK WHEN CALLED FROM /BELOW, ELSE RESET DRIVE /REGISTERS (AC=1 TO RESET, /AC=3 TO SEEK) JMS IO /RESET DRIVE OR SEEK JMP RETRY /ERROR RETURN TAD (BYTE RLRH) /NORMAL RETURN: /READ NEXT HEADER TO FIND /CURRENT TRACK JMS IO JMP RETRY /ERROR RETURN RRSI /NORMAL RETURN: /GET HEADER BYTE #1 BSW AND (3) DCA CURTRK /SAVE 2 LSB RRSI /GET HEADER BYTE #2 AND (377) /HARDWARE SHOULD DO THIS CLL RTL TAD CURTRK /ADD IN MSB DCA CURTRK JMS TRKCMP /COMPARE WITH CURRENT /TRACK; IF SAME, DO THE /TRANSFER TAD CURTRK /OFF TRACK: SEEK TO TRACK. CLL RAR /CONSTRUCT DIFFERENCE WORD FOR SEEK. CIA TAD CYL SMA JMP AROUND CIA SKP AROUND, TAD (4000) /SET DIRECTION BIT IF TO HIGHER /CYLINDER ADDRESS. TAD SURF /ADD SURFACE BIT RLCA /LOAD DIFFERENCE WORD AC0002 /PREPARE FOR SEEK JMP SEEK /LOOP BACK AND SEEK; THIS /ENSURES THAT THE TRACK REACHED /IS THE CORRECT ONE IN SPITE /OF POSSIBLE RL01 SEEK /UNRELIABILITY /SUBROUTINE TO COMPARE REQUESTED TRACK WITH CURRENT /(REMEMBERED) TRACK; IF SAME, DO TRANSFER. IF DIFFERENT, /RETURN WITH AC=REQUESTED-CURRENT, LINK=1 TRKCMP, 0 TAD CURTRK CIA TAD TRACK SZA CLA JMP I TRKCMP /DIFFERENT; RETURN TAD SECTOR /SAME: DO TRANSFER /LOAD ALL REGISTERS RLSA TAD FNC /WC IS DOUBLED FOR BYTE MODE AND (BYTE) SZA CLA TAD (-200) /2 PAGES TAD (-200) /1 PAGE RLWC TAD SURF /HARDWARE SHOULD DO THIS TAD CYL RLCA TAD MA RLMA TAD FNC JMS IO /READ OR WRITE ONE SECTOR JMP I RL01 /ERROR: TAKE ERROR RETURN ISZ RL01 /TAKE NORMAL EXIT JMP I RL01 /SUBROUTINE TO DO RL01 I/O IO, 0 TAD DRIVE RLCB /DO I/O OPERATION WAIT, CLA /IN CASE NO RL01 PRESENT KSF /WAIT UNTIL DONE /RETURN TO MONITOR IF /USER TYPES CTRL,C JMP WAIT2 TAD (7600) KRS TAD (-7603) SNA CLA JMP I (MON) WAIT2, RLSD JMP WAIT RLSE ISZ IO /NORMAL RETURN JMP I IO /ERROR RETURN /DATA TRACK, 0 /REQUESTED TRACK CURTRK, 2000 /CURRENT TRACK (INITIALLY /ILLEGAL TO FORCE HEADER /READ AND SEEK IF NECESSARY) SECTOR, 0 CYL, 0 SURF, 0 FNC, 0 MA, 0 PAGE /TEXT STRINGS IDMSG, TEXT "RLFRMT V??_" *.-2 VERSION+60^100+PATCH *.+2 MSG, TEXT "_DRIVE ? " BDMSG, TEXT "_PLEASE SPECIFY DRIVE NUMBER (0-3) ON WHICH_" *.-1 TEXT "PACK TO BE FORMATTED IS MOUNTED._" FAMSG, TEXT "_FATAL I/O ERROR" SERMSG, TEXT " DISK PACK SERIAL NUMBER " TOOMSG, TEXT "_OVER 63 NEWLY-FOUND BAD BLOCKS" ERRMSG, TEXT "_CANNOT FORMAT DISK_" ADDMSG, TEXT "_WARNING: AN ADDITIONAL BAD BLOCK FOUND." *.-1 TEXT "_ZERO DISK BEFORE USE!_" OVFMSG, TEXT "_OVER 15 BAD BLOCKS ON ONE DEVICE" ZERMSG, TEXT "_WARNING: BAD BLOCK IN SYSTEM AREA._DO NOT USE AS SYSTEM DISK!_" UNFMSG, TEXT "_UNFORMATTED (NEW)" FRMMSG, TEXT "_OS/8 (OLD)" BDFMSG, TEXT " DISK._WARNING: ALL FACTORY-WRITTEN LISTS DESTROYED._" FACMSG, TEXT "_FACTORY-DETECTED" OLDMSG, TEXT "_PREVIOUS OS/8" NEWMSG, TEXT "_NEWLY-FOUND" FINMSG, TEXT "_NEW OS/8" BBMSG, TEXT " BAD BLOCKS: " NNMSG, TEXT "NONE" FMTMSG, TEXT "_FORMAT PACK WITH THIS NEW LIST? " DNMSG, TEXT "_DONE_" WRMSG, TEXT "_PLEASE WRITE-ENABLE DRIVE, THEN HIT 'RETURN'._" /OTHER DATA BBCTL, AANDB /OS/8 BAD BLOCK CONTROL LIST /LIST ADDRESS 0 /DEVICE CODE AANDB+20 /LIST ADDRESS 1 /DEVICE CODE C /LIST ADDRESS 2 /DEVICE CODE 0 /TERMINATOR FACCTL, FACTRY+3 /CONTROL LIST TO CHECK VALIDITY /OF FACTORY-WRITTEN BBLS. /POINTER BEFORE 4 BYTES TO TEST. 0 /VALUE TO TEST FOR. FACTRY+373 /POINTER. 377 /VALUE. 0 /TERMINATOR. $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 | / RXCOPY FOR OS/8 V3D AND OS/78 V1A / / THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A / SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION / OF THE ABOVE SOPYRIGHT NOTICE. THIS SOFTWARE, OR ANY THEREOF, / MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER / PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO / THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE / SHALL AT ALL TIMES REMAIN IN DEC. / / THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT / NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL / EQUIPMENT CORPORATION. / / DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS / SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / VERSION V4A M.H. MAY 20, 1977 / S.R. MAY 20, 1977 / VERSION V4B S.R. AUG 24, 1978 / / START ADDRESS 16000; JSW 7003 / / THIS PROGRAM PERFORMS COPY, READ, AND COMPARE OPERATIONS ON / RX FLOPPY DISKS ON A TRACK BY TRACK BASIS. / / THE COMMAND OPTIONS ARE: / /P PAUSE BEFORE AND AFTER ACCESSING DISK /M MATCH WITH NO IMPLIED COPY /N COPY WITH NO IMPLIED MATCH /R READ OUTPUT DEVICE WITH NO IMPLIED MATCH OR COPY /V PRINT VERSION NUMBER /C (NOT DOCUMENTED) COPY /S FORMAT (ONLY) OUTPUT DEVICE TO SINGLE DENSITY /D FORMAT (ONLY) OUTPUT DEVICE TO DOUBLE DENSITY / IF NO OPTIONS ARE EXPLICITLY DECLARED, COPY AND MATCH ARE ASSUMED. / / THERE ARE TWO COMMAND FORMATS: / / DEV:<DEV:/OPTION WHERE OPTIONS ARE C, P, N, M, OR V. / DEV:/R DEV:</R <DEV:/R THREE FORMATS FOR R, S, D, OR V. / / / WARNING!! / / THIS PROGRAM HAS TWO PATHOGENIC CONNECTIONS WITH THE STANDARD / RX HANDLERS / / IT IS ASSUMED THAT THE RX SYSTEM HANDLER HAS AT LOCATION 7623 / A WORD THAT CONTAINS THE 20 BIT IF BOOTED TO UNIT #1 / / IT IS ASSUMED THAT THE RX NON-SYSTEM HANDLER HAS ENTRY POINTS / CORRESPONDING TO UNIT NUMBERS AS FOLLOWS: / / UNIT LAST DIGIT OF ENTRY POINT / / 0 0 / 1 4 / 2 1 / 3 5 / / WHERE UNITS 2 AND 3 ARE A SECOND PAIR OF FLOPPIES ON A VT78 ONLY! / / MAGIC=7623 /WORD IN RX SYSTEM HANDLER HAS 20 IF BOOTED ONTO / /UNIT #1 (RIGHT-HAND ONE) OPT1=7643 /1ST COMMAND DECODER OPTION WORD OPT2=7644 /2ND COMMAND DECODER OPTION WORD OPT3=7645 /3RD COMMAND DECODER OPTION WORD BUFF=2000 /INPUT BUFFER FOR TTY MSGS TYP1=25 /DEVICE CODE FOR RX01 TYP2=32 /DEVICE CODE FOR MULTI-RX HANDLER WAS 27 (TAKEN BY TA8E) BSIZE=6400 /BUFFER SIZE IN OCTAL WORDS BSTART=20 /BUFFER START BHALF=BSIZE%2 /HALF OF BSIZE USR=200 /ENTRY POINT OF USR NOMAT=2000 /NO MATCH OPTION MASK COPY=1000 /COPY OPTION MASK MATCH=4000 /MATCH OPTION MASK; NOTE SOME CODE !KNOWS! THIS IS 4000 READ=0100 /READ OPTION MASK VERSION=0004 /VERSION OPTION MASK PAUS=0400 /PAUSE OPTION MASK SINGLE=40 /SINGLE DENSITY FORMAT ONLY DOUBLE=200 /DOUBLE DENSITY FORMAT ONLY OLDOUB=400 /ORIGINAL POSITION OF DOUBLE BIT CHANGE=1 /IN OPTION WORD, 1 MEANS MUST FORMAT OUTPUT MEDIA / / CORE LAYOUT / / FIELD 0 / / RX BUFFER 0020-6417 / ERROR MSGS 6420-7177 / TTY HANDLER 7200-7577 / SYSTEM 7600-7777 / / FIELD 1 / / RX BUFFER 0020-6417 / INIT CODE 5000-6417 / PROGRAM 6420-7577 / SYSTEM 7600-7777 / / FIELD 2&3 (OPTIONAL) / / RX BUFFER 0020-6417 / / EXECUTION ORDER / / INIT CODE STARTS AT 6000, THEN TO 5000, 5200, 5400, 7110 / / MAIN LOOP IS AT 6420 / SERVICE SUBROUINES OCCUPY MOST OF REST OF THE FIELD / / / FLOPPY IOT'S / SDN=6755 LCD=6751 STR=6753 XDR=6752 SER=6754 FLINIT=6757 / AC7776=CLL CLA CMA RAL /SET AC TO -2 AC7775=CLL CLA CMA RTL /SET AC TO -3 AC0002=CLL CLA CML RTL /SET AC TO 2 AC4000=CLL CLA CML RAR /SET AC TO 4000 / / / THE OPTION WORDS FROM THE COMMAND DECODER ARE COMBINED INTO ONE WORD / HERE CALLED 'OPTION'. THE BITS IN OPTION ARE M,N,C,P,D,R,S,0,0,V,0,0. / NOTE THAT ONLY THE 'D' BIT HAS BEEN REPOSITIONED. / / WARNING! THE MEANING OF THE M AND C BITS ON INPUT IS DIFFERENT THAN THAT / WHILE THE PROGRAM IS ACTUALLY RUNNING. ON INPUT C IS COPY AND MATCH. / ON INPUT M IS MATCH WITHOUT COPY. WHILE THE PROGRAM IS RUNNING, M / IS MATCH (INDEPENDENT OF COPY), AND C IS COPY (INDEPENDENT OF MATCH). / / SUMMARY OF CONFIGURATION DEPENDENT VARIABLES / / ISVT78 1 IF A VT78, 0 IF NOT / ISBIG 1 IF GREATER THAN 12K, 0 IF NOT / ISDOUB 0 IF SINGLE DENSITY TRANSFER, 1 IF DOUBLE / / / SUMMARY OF DERIVED VARIABLES (DO NOT APPEAR AS SUCH IN PROGRAM) / / HLFTRK (NOT ISBIG).AND.ISDOUB=1.AND.MATCH OPTION / SHORT ISDOUB=0.IOR.HLFTRK / SLOW ISVT78.AND.ISDOUB=1 / / I/O CONTROLL INFORMATION IS PLACED IN THE VARIABLES RIFN, ROFN / / RIFN 4000 IF RX02 OR RX03 HARDWARE / 0400 IF A DOUBLE DENSITY TRANSFER IS TAKING PLACE / 0020 IF UNITS 1 OR 3 / 0002 ALWAYS SET, INDICATES READ FUNCTION / 0001 IF UNITS 2 OR 3, SECOND PAIR ON VT78 / / ROFN WHICH IS THE SAME WORD FOR OUTPUT, GETS BITS IN / THE SAME FORMAT / / THE ABOVE VARIABLES RESULT IN THE SETTING OF THE FOLLOWING COUNTS / WHICH ARE PLACED HERE AND THERE IN CONVENIENT PAGES / / COUNT1 -20 IF ISDOUB=1, -10 IF NOT / COUNT2 -100 IF ISDOUB=1, -40 IF NOT / COUNT3 -400 IF ISDOUB=1, -200 IF NOT / COUNT4 -2 IF DOUBLE HEADED, -1 IF NOT / COUNT5 -2 IF HLFTRK, -1 IF NOT; / COUNT6 10 IF SHORT, 20 IF NOT / COUNT7 -1 IF SHORT, -2 IF NOT / COUNT8 3 IF SLOW, 2 IF NOT / COUNT9 SKP IF SLOW, IAC IF NOT / / FIELD 1 *5000 / / ADDITIONAL ONCE-ONLY CODE / / / / PRINT VERSION NUMBER EVEN IF SOME ERRORS / LOC3, TAD OPT2 /PRINT VERSION FIRST EVEN IF AN ERROR AND (VERSION SNA CLA /SKIP IF PRINTOUT NEEDED JMP VALID /NO, CONTINUE CHECKING TAD (VERBUF /ADDRESS OF MESSAGE IN FIELD 0 JMS TYPE / / / / VARIOUS CHECKING FOR ILLEGAL SWITCHES / VALID, TAD (-COPY-OLDOUB-1 /IS SWITCH OTHER THAN COPY OR DOUBLE? AND OPT1 /IN THE FIRST COMMAND DECODER OPTION WORD SZA CLA /SKIP IF OK JMP ERR17 TAD (-MATCH-NOMAT-PAUS-READ-SINGLE-VERSIO-1 AND OPT2 /CHECKING FOR OTHER THAN M,N,P,R,S,V SZA CLA JMP ERR17 TAD OPT3 /THIS WORD SHOULD BE 0, I.E. NO SWITCHES AT ALL SZA CLA /SKIP IF OK JMP ERR17 TAD OPT1 /DOUBLE, IF PRESENT, MUST CHANGE POSITION AND (OLDOUB /CHECK IT IN OLD POSITION SZA CLA /SKIP IF NOT THERE TAD (DOUBLE-OLDOUB /MOVE TO NEW POSITION NOFORM, TAD OPT1 /JOIN ALL SWITCHES INTO ONE WORD TAD OPT2 /COMBINING WORDS DCA OPTION /HOLD ALL TOGETHER FOR SIMPPLICITY TAD (BITTAB /LOAD UP TO TEST COMBINATIONS DCA TMP5 TAD OPTION DCA TMP6 VALLOO, TAD TMP6 CLL RAL /NEXT OPTION BIIT TO LINK DCA TMP6 TAD I TMP5 /NEXT MASK SNA /SKIP IF MORE TO DO JMP CROSS /CROSS TALK CHECKED OUT ISZ TMP5 /BUMP POINTER AND TMP6 /CHECK ILLEGAL POSSIBILITIES SNL /SKIP ONLY IF MASTER BIT IS ON CLA /GO OUT VIA JMP VALLOO SNA CLA /SKIP IF MASTER AND SOME OTHER MATCH, ILLEGAL JMP VALLOO ERR17, TAD (MSG17-MSG6 /SWITCHES ERROR MSG ERR6, TAD (MSG6-MSG5 ERR5, TAD (MSG5-MSG3 ERR3, TAD (MSG3 JMP PERR /GO PRINT ERROR / CROSS, TAD (SINGLE+DOUBLE+MATCH+READ /ANY SPECIFIED FUNCTION AND OPTION SZA CLA /SKIP IF NO JMP CROSS1 /A FUNCTION THERE, DON'T SET C TAD OPTION AND (-COPY-1 TAD (COPY DCA OPTION CROSS1, TAD (SINGLE+DOUBLE+NOMAT+READ AND OPTION /SET M IF REQUIRED SZA CLA /SKIP IF NECESSARY JMP CROSS3 /NO TAD OPTION RAL /KNOW! THAT MATCH=4000 CLL CML RAR DCA OPTION / / NOW OUTPUT DEVICE / CROSS3, TAD OUTDEV SNA JMP ERR6 /DEVICE NOT THERE AT ALL! JMS CHCKRX /IS IT REALLY AN RX? RETURN UNIT NUMBER;+2 FOR READ DCA ROFN /BUILD REST OF IT IN LATER / / NOW INPUT DEVICE (IF ANY) / CROSS2, TAD (READ+SINGLE+DOUBLE AND OPTION /AN INPUT DEVICE NEEDED SZA CLA /SKIP IF NECESSARY JMP REAFOR /READ OR FORMAT TAD INDEV SNA JMP ERR5 /DEVICE NOT PRESENT AT ALL, ERROR JMS CHCKRX /IS IT REALLY AN RX? RETURN READ CODE +UNIT # DCA RIFN TAD RIFN /CHECK IF UNIT NUMBERS THE SAME CIA /WHICH IS AN ERROR TAD ROFN SNA CLA /SKIP IF DIFFERENT JMP ERR2 JMP IICNT / REAFOR, TAD INDEV /FOR READ AND FORMAT INPUT DEVICE IS ILLEGAL SZA CLA /SKIP IF NOT PRESENT JMP ERR2 /SPECIFICATION ERROR ON EXTRA DEVICE JMP IICNT /OK, CONTINUE INITIALIZATION / / TMP5, 0 /WORK LOCATIONS TMP6, 0 / PAGE / / / ESTABLISH FUNDAMENTAL CONFIGURATION VARIABLES / IICNT, JMS I (USR /UNLOCK USR 11 TAD OPTION /IF SLASH-P, MUST GET CORRECT FLOPPY ON! AND (PAUS SNA CLA /SKIP IF SLASH-P JMP IICNT2 /NO, JUST KEEP GOING SYSOFF, JMS QUEST /ASK REMOUNT QUESTION MSG12 /ADDR OF MESSAGE JMP SYSOFF /"N" ASK AGAIN / /"Y" CONTINUE TO INITIALIZE IICNT2, CDF 70 /TEST FOR A VT78 RDF CDF 10 /BACK TO US TAD (7750 /VT78 RETURNS 30 FROM 70 ! SNA CLA IAC DCA ISVT78 / CDF 0 /FETCH CORE SIZE WORD TAD I (7777 CDF 10 /INDIRECTS HERE AND (70 TAD (7750 /MAKING + IF 16 OR MORE K OF CORE SMA CLA /SKIP IF NOT 16K IAC /16K DCA ISBIG /SAVE THAT INFO TAD ROFN /GET DEVICE STATUS TYPE FOR OUTPUT DEVICE JMS DEVSTT /RETURN CODE IN .+1, UPDATED ROFN WORD IN AC MEDOU, -1 /RETURN 0-3;SINGLE;SINGLE ON DOUB;DOUB;QUAD DCA ROFN TAD MEDOU /DEFAULT FOR MEDIN, IF NO INPUT MEDIA AT ALL DCA MEDIN TAD INDEV /IS AN INPUT DEVICE? SNA CLA /SKIP IF YES JMP ONLY1 /SPECIAL PROCESSING FOR ONE DEVICE CASES TAD RIFN /GETTING UNIT NUMBER JMS DEVSTT /CHECK FOR READY, RETURN TYPE CODE MEDIN, -1 /RETURN 0-3, SAME AS MEDOU DCA RIFN /FULL I/O SKELETON TAD MEDIN /CONVENIENCE, MAKE INPUT OUTER LEVEL INDEX RTL TAD MEDOU /INNER LEVEL INDEX TAD (ACTAB /TABLE FOR WHICH ACTION TO TAKE DCA TMP7 TAD I TMP7 /AN EXTRA INDIRECT NEEDED DCA TMP7 JMP I TMP7 /GO TO CORRECT ACTION / / DEVSTT / / CALL WITH 2 (READ CODE) + UNIT NUMBER IN AC: PARTIAL RIFN/ROFN WORD / / IF DRIVE NOT READY, ERROR OUT DIRECTLY / / RETURN WITH DEVICE TYPE IN CALL +1 / / 0 RX01 DRIVE / 1 RX02 DRIVE WITH RX01 FLOPPY / 2 DOUBLE DENSITY DRIVE AND MEDIA; EITHER BOTH NOT / BOTH MAY BE DOUBLE SIDED, BUT THAT IS IGNORED!! / 3 RX03 DRIVE AND RX03 FLOPPY / / RETURN WITH FULL RIFN/ROFN CODE IN AC / DEVSTT, 0 DCA TMP7 /SAVE CALLING CODE TAD TMP7 /BUT CHECK OUT WHICH DRIVE PAIR JMS SELECT /SELECT PAIR, IF NECESSARY; AC HAS BEEN ANDED WITH 7776 TAD (410 /DO DOUBLE DENSITY 12 BIT READ STATUS SDN /WAITING ON DONE JMP .-1 LCD SDN /WAIT AGAIN ON DONE JMP .-1 XDR /GET STATUS AND (232 /KEEPING READY, DENSITY ERROR, DOUBLE, QUAD DCA TMP8 /SAVE WHILE WE CLEAR UP DEVICE TAD (416 /DUMMY READ ERROR STATUS TO SET DONE AGAIN LCD SER /CLEAR POOSSIBLE ERROR FLAG L7600, 7600 /IT MAY SKIP! TAD TMP8 /GET BACK STATUS TAD L7600 /CHECK FOR READY SPA JMP STERR /NOT READY, PRINT ERROR CLL RTR /PUT QUAD BIT TO LINK SZL /SKIP ON NOT QUAD CLL CML CLA CMA /ALL BITS TO 1 !! FALLS THRU TO EXIT WITH 3 RTR /PUT DOUBLE BIT TO LINK SNL /SKIP ON DOUBLE JMP REJOIN /JOIN WITH OTHER CASES, AC NOW 0 CMA /MAKING SINGLE -2, DOUBLE -1, QUAD 0 TAD (3 /MAKING SINGLE 1, DOUBLE 2, QUAD 3 REJOIN, DCA I DEVSTT /RETURN 0-3 TYPE IN CALL+1 TAD I DEVSTT /GET CODE BACK TAD (FNTAB /TURN CODE INTO FUNCTION BITS DCA TMP8 TAD I TMP8 /4000 FOR DOUBLE DRIVE, 400 FOR DOUBLE TRANSFER TAD TMP7 /ORIGINAL CALLING BITS ISZ DEVSTT /HOP OVER RETURNED ARGUMENT JMP I DEVSTT /EXIT WITH CODE IN AC / / STERR, CLA /AC JUNK COMING IN TAD (MSG18-MSG19 /PRINT MESSAGE 18 ERR19, TAD (MSG19-MSG15 /PRINT MESSAGE 19 ERR15, TAD (MSG15 /PRINT MESSAGE 15 JMP PERR / TMP7, 0 TMP8, 0 / PAGE / / SPECIAL CODE FOR ONE DEVICE CASES; READ, SINGLE, DOUBLE / ONLY1, TAD OPTION /SEPARATE OUT READ AND (SINGLE+DOUBLE SNA /SKIP IF NOT READ (CAN ONLY BE ONE OF THREE BITS!) JMP READIT /READ CASE, FALL INTO OTHER CODE RAL /WATCH OUT! GOING TO SPLICE PROPER DENSITY BIT JMP TOUGH /INTO ROFN FOR LATER FORMAT / / ENTER FROM DISPATCHER, AUTO-FORMAT, AND OK / CISZ, ISZ OPTION /SET CHANGE DENSITY BIT IN OPTION WORD SAME, / / SET UP COUNT VARIABLES / IICNT4, TAD RIFN /PUT TRANSFER DENSITY BIT FROM INPUT INTO OUTPUT TOUGH, AND (400 /KEEPING THAT BIT; FORMAT ONLY CASE JOINS HERE DCA ISDOUB /TERMPORARY USE OF LATER VARIABLE TAD ROFN /OUTPUT CONTROL AND (7377 /KEEPING OTHER BITS TAD ISDOUB DCA ROFN /REPLACING MODIFIED OUTPUT WORD READIT, AC7776 /TAKE OFF READ BIT FOR OUTPUT WRITE FUNCTION TAD ROFN DCA WOFN AC7776 / TAD MEDIN /MAKE A TEMPORARY VARIABLE ISDOUB SMA CLA /SKIP IF SINGLE IAC DCA ISDOUB /WHICH IS 1 IF DOUBLE DENSITY MEDIA TAD ISDOUB /SIGNLE OR DOUBLE SZA CLA /SKIP IF SINGLE TAD (-10 /DOUBLE, MAKE -20 TAD (-10 /SINGLE, MAKE -10 DCA COUNT1 TAD COUNT1 /NOW MULTIPLY BY FOUR CLL RAL CLL RAL DCA COUNT2 TAD COUNT2 /NOW AGAIN BY FOUR CLL RAL CLL RAL DCA COUNT3 AC7775 TAD MEDIN /CHECK FOR QUAD SIZED SMA CLA /SKIP IF NOOT IAC CMA /MAKE A -2 IF YES, -1 IF NO DCA COUNT4 TAD ISBIG /MAKE VARIABLE HLFTRK SNA CLA /MISSES COLLECT IN SZA CHAIN TAD OPTION SPA CLA /!!KNOWS!! THAT MATCH BIT IS AC0 TAD ISDOUB SZA CLA IAC /HALF TRACK; SMALL MACHINE, MATCH OPTION, DOUBLE DENSITY CMA DCA COUNT5 /-2 IF HALF-TRACK, OTHERWISE -1 TAD COUNT5 /FIND OUT IF ONE OR TWO FIELDS PER SWOOP AND ISDOUB /LEAVING 1 IN AC IF TWO FIELDS CMA /SO MAKE ANOTHER -2,-1 COUNTER DCA COUNT7 TAD COUNT7 /NOW MULTIPLY IT BY -10 OCTAL TO MAKE FIELD SPAN CIA CLL RAL RTL DCA COUNT6 TAD ISVT78 /NOW CONSTRUCT INTERLEAVE, TWO OR THREE AND ISDOUB /THREE IF DOUBLE DENSITY ON A VT78 TAD (2 DCA COUNT8 AC7775 /REST OF JOB, MAKE SKP OR IAC TAD COUNT8 SZA CLA /SKIP IF IT WAS THREE INTERLEAVE TAD (IAC-SKP /TWO INTERLEAVE, WANTS AN IAC TAD (SKP /THREE INTERLEAVE, WANTS A SKIP DCA COUNT9 TAD OPTION /INITIALIZE ROFLD AND (READ /IS IT ONLY A READ SNA CLA /SKIP IF YES, CDF 0 TAD COUNT6 /MATCH, INIT AT CDF SPAN TAD (CDF 0 DCA ROFLD TAD OPTION /NEED TO REFORMAT OUTPUT DRIVE? AND (CHANGE+SINGLE+DOUBLE SNA CLA /SKIP IF YES JMP DO00 /NO, GO DO OPERATION JMP REFORM /GO TO REFORMATTER / / ISVT78, 0 /1 IF A VT78, OTHERWISE 0 ISBIG, 0 /1 IF IT HAS 16K OF CORE, 0 IF LESS ISDOUB, 0 /1 IF TRANSFER DOUBLE DENSITY / FIELD 1 *6000 / / / EQUATES FOR AUTO-INCR REG'S, SO THEY SHOW UP IN CREF / X10=10 X11=11 X17=17 / / ***** BEGIN ONCE ONLY CODE ***** / / / ENTER HERE AND GET USER INPUTS / START, CLA!SKP /NORMAL ENTRY (MUST CALL DECODER) CHAIN, JMP NODEC /CHAIN ENTRY CDF 10 JMS I (USR /CALL IT 5 5200 /DEFAULT INPUT EXT.(SPECIAL MODE) 0 /PRESERVE TENTATIVE FILES / / LOAD CONSOLE TTY HANDLER / NODEC, JMS I (USR /LOAD THE KL8E HANDLER 1 DEVICE TTY TTYEP, 7201 JMP ERRUSR /PRINT USER ERROR TAD TTYEP /MOVE ENTRY POINT FROM THIS PAGE DCA TTYENT / / LOAD OUTPUT DEVICE IF SPECIFIED / JMS CTRLC /CHECK FOR CONTROL C TYPE-IN TAD I (7600 /GET OUTPUT DEV AND (17 DCA OUTDEV TAD I (7605 /GET INPUT DEVICE AND (17 DCA INDEV TAD OUTDEV /IF NO OUTPUT DEVICE SZA CLA /IS NAMED MOVE INPUT JMP LOC10 /TO OUTPUT DEVICE TAD INDEV /MOVE IT! DCA OUTDEV DCA INDEV /ZERO INPUT DEVICE / / VALIDATE OUTPUT DEVICES AND FILES / LOC10, JMS CTRLC /CHECK FOR CONTROL C TAD (7601 /MAKE SURE THAT THERE ARE NO OUTPUT FILES DCA TMP1 /OR OTHER OUTPUT DEVICES TAD (-4 DCA TMP2 LOC1, TAD I TMP1 /GET DECODER ENTRY SZA!CLA /IS IT ZERO? JMP ERR2 /NO -- ERROR ISZ TMP1 /INCREMENT POINTER ISZ TMP2 /YES -- DONE WITH OUTPUT ENTRIES? JMP LOC1 /NO -- PROCEED /YES -- / JMS CTRLC /CHECK FOR CONTROL C TAD I (7605 /WAS THERE ANY INPUT SPECIFICATION? SNA CLA JMP LOC3A /NO TAD (7606 /YES -- MAKE SURE THAT THERE ARE NO INPUT FILES DCA TMP1 /OR OTHER INPUT DEVICES TAD (-5 DCA TMP2 LOC2, TAD I TMP1 /GET DECODER ENTRY SZA!CLA /IS IT ZERO? JMP ERR2 /NO -- ERROR ISZ TMP1 /INCREMENT POINTER ISZ TMP2 /YES -- DONE WITH INPUT ENTRIES? JMP LOC2 /NO -- PROCEED LOC3A, JMP LOC3 /YES -- CONTINUE ON NEXT PAGE / OUTDEV, 0 /OUTPUT DEVICE NUMBER INDEV, 0 /INPUT DEVICE NUMBER TMP0, 0 TMP1, 0 /TEMP STORE TMP2, 0 /TEMP STORE / ERR2, TAD (MSG2 /ILLEGAL SPECIFICATION PERR, JMS TYPE /PRINT ERROR MESSAGE JMP GOEXIT /LEAVE / ERRUSR, JMS I (USR /PRINT USER ERROR 7 2 JMP GOEXIT / / / CHCKRX / / CALL WITH DEVICE # IN AC, RETURN IF REALLY AN RX / RETURN WITH UNIT NUMBER IN AC; 20 IF RIGHT HAND DRIVE (#1) / PLUS 1 IF A SECOND PAIR ON A VT78 / PLUS ALWAYS HAVING A 2 ADDED IN FOR A READ FUNCTION / OLDRX=TYP1^10 NEWRX=TYP2^10 /TYPE CODES FOR RX HANDLERS / / / CHCKRX, 0 DCA TMP0 /SAVE DEVICE NUMBER CLA CMA TAD TMP0 /CHECK IF IT IS SYS SZA CLA /SKIP IF YES JMP NONSYS /NO, GO TO NON-SYS PROCESSING CHCKSY, CDF 0 /FETCH SKELETON WORD FROM SYS AC0002 /PUT IN READ BIT (BIT NOT SET IN MAGIC) TAD I (MAGIC CDF 10 JMP CHCKJ /JOIN UP TO MASK AND EXIT NONSYS, TAD (7757 /TABLE BASE TAD TMP0 DCA TMP1 /HOLD FOR INDIRECT TAD I TMP1 /GET STORED CODE AND (770 /KEEP TYPE BITS TAD (-NEWRX /IS IT A NEW ONE SZA /SKIP IF YES, BOUNCE DOWN SZA'S TAD (-OLDRX+NEWRX /SO SEE IF OLD ONE SZA /SKIP IF GOT A MATCH JMP ERR3 /WRONG DEVICE TYPE, ERROR OUT TAD (4001 /RE-ESTABLISH LOAD ADDRESS ARGUMENT DCA LOADAD TAD TMP0 /TRY TO LOAD HANDLER JMS I (USR 1 /LOAD CODE LOADAD, 4001 /GETS WRITTEN OVER JMP ERR3 /ERROR OUT TAD LOADAD /OUCH!! ENTRY POINT FOR UNIT 1+3, HAS A 4 IN IT!! / /ENTRY POINT FOR UNIT 2+3 HAS A 1 IN IT AND (5 /KEEP ONLY THE TWO RELEVANT BITS TAD (16 /SHIFT 4 TO 20, PUT IN 2 FOR READ CODE CHCKJ, AND (23 /KEEP 2 FOR READ CODE, 20 AND 1 FOR UNIT SPECIFIERS JMP I CHCKRX /OK, RETURN / PAGE / / / *6400 / / PUT TABLES HERE TO FIT / BITTAB / / TABLE FOR DETERMINING ILLEGAL CALLING OPTIONS / BITTAB, 6700 /WITH M; N,C,D,R,S ILLEGAL 5600 /WITH N; C,D,R,S ILLEGAL 3400 /WITH C; D,R,S ILLEGAL 0001 /WITH P; ALL ARE LEGAL 6000 /WITH D; R,S ILLEGAL 4000 /WITH R; S ILLEGAL 0 /LOOP STOPPER; ALL LEGAL WITH V, FALLS OUT OK / / ACTAB / / TABLE OF ACTION FOR 16 COMBINATIONS OF INPUT AND OUTPUT TYPES / ACTAB, SAME /IN TYPE 0, OUT TYPE 0 SAME /0,1 CISZ /0,2 CISZ /0,3 SAME /1,0 SAME /1,1 CISZ /1,2 CISZ /1,3 ERR15 /2,0 CISZ /2,1 SAME /2,2 SAME /2,3 ????? ERR15 /3,0 ERR15 /3,1 ERR15 /3,2 SAME /3,3 / / FNTAB, 0 /FUNCTION BITS BY TYPE CODE 0-3 4000 /SINGLE MEDIA BUT 4000 DOUBLE DRIVE 4400 /DOUBLE ON DOUBLE 4400 /QUAD ON QUAD, LOOP HANDLES WHICH HEAD / / DO00, TAD (-115 /TRACK LOOP CONTROL COUNT DCA TRACK / / ****** END OF ONCE ONLY CODE ****** IFNZRO .-6420&4000 <*6420> /FORCE BEYOND BUFFER / / ## MAIN LOOP ## / DO0, TAD COUNT4 /SET UP HEAD CONTROLLER DCA HEADER DO1, TAD COUNT5 /SET UP HALF-TRACK CONTROLLER DCA HFTRCK / / WAS COPY SELECTED? / DO2, TAD HEADER /PLACE HEADER INFO TO COMMAND WORD CMA CLL RTR RTR /0 IF FIRST, 1000 IF SECOND TAD (100 /ALSO NEED EIGHT-BIT BIT DCA LOOPFN /FUNCTION FOR THIS LOOP TAD OPTION /SHOULD WE COPY? AND (COPY SNA!CLA JMP DO3 /NO JMS RI /YES -- READ INPUT DEVICE INTO FIELD 0 JMS WO /WRITE OUTPUT DEVICE FROM FIELD 0 / / WAS READ SELECTED? / DO3, TAD OPTION /SHOULD WE READ? AND (READ SZA CLA /SKIP IF NOT NEEDED JMS RO / / WAS MATCH SELECTED? / DO4, AC4000 /ADD PUTS MATCH BIT TO LINK TAD OPTION AND (COPY /MATCH IN LINK, COPY IN AC SNL /SKIP IF A MATCH JMP DO6 /NO MATCH, READY FOR LOOP CONTROL SNA CLA /HAS A COPY ALREADY BEEN DONE; IF SO DON'T READ TWICE JMS RI /READ FROM INPUT DEVICE JMS RO /READ FROM OUTPUT DEVICE / / COMPARE BUFFERS / DO5, JMS COMP /CALL ACTION TO DO COMPARE / / LOOP CONTROLLERS / DO6, CLA /MAY HIT WITH JUNK IN AC ISZ HFTRCK /GO AGAIN FOR OTHER HALF TRACK? JMP DO2 /YES ISZ HEADER /NEED TO GO TO OTHER HEAD? JMP DO1 /OTHER HEAD, LOOP AGAIN ISZ TRACK /INCREMENT TRACK, CHECK DONE JMP DO0 /NO EXITOK, TAD OPTION /DOES HE NEED TO REMOUNT SYS? AND (PAUS SNA CLA /SKIP IF YES JMP GOEXIT /NO, BACK TO SYSTEM SYSON, JMS QUEST /ASK HIM MSG11 /ADDR OF MESSAGE JMS SYSON /"N" ANSWER, ASK AGAIN / /"Y" ANSWER, GO EXIT GOEXIT, JMS SELECT /FORCE BACK TO FIRST PAIR CDF CIF 0 /FIELDS FOR EXEC JMP I (7605 / / ## END OF MAIN LOOP ## / OPTION, 0 /OPTION BITS TOGETHER IN ONE WORD COUNT4, 0 /-1 IF ONE HEAD, -2 IF TWO COUNT5, 0 /-2 IF TRACK MUST BE DONE IN TWO PASSES / /OTHERWISE -1 HFTRCK, 0 /CONTROLS LOOP PASSES PER TRACK,FILL FROM COUNT5 HEADER, 0 /FILL FROM COUNT4, CONTROLS HEAD LOOPFN, 0 /EIGHT-BIT MODE + WHICH HEAD TO USE / / SUBROUTINE QUEST -- PRINT MSG AND ASK QUESTION / / JMS QUEST / ADDR OF MESSAGE / "N" RETURN / "Y" RETURN / QUEST, 0 Q1, TAD I QUEST /GET ADDR OF MESSAGE JMS TYPE /PRINT IT TAD (BUFF /SELECT INPUT BUFFER JMS RDANS /READ ANSWER TAD I (BUFF /WHAT WAS IT? AND (177 TAD (-116 /WAS IT A "N" SNA JMP Q3 /GO TO "N" EXIT TAD (-131+116 /WAS IT A "Y" SZA!CLA JMP Q1 /NO -- ASK AGAIN Q2, ISZ QUEST /"Y" RETURN AT JMS+3 Q3, ISZ QUEST /"N" RETURN AT JMS+2 JMP I QUEST / / SUBROUTINE CTRLC -- CHECK FOR CONTROL C / CTRLC, 0 KSF /SKIP IF A CHARACTER HAS BEEN TYPED JMP I CTRLC /NO KRS AND (177 TAD (-3 SNA!CLA JMP GOEXIT /IS A CONTROL C, EXIT JMP I CTRLC / / PAGE / / / SUBROUTINE RI -- READ FROM INPUT DEVICE / RI, 0 /READ FROM INPUT DEVICE TAD RISEC /SET UP OUR SECTOR DCA SECTOR TAD RIFN /AND OUR FUNCTION (UNIT, READ, ETC.) TAD LOOPFN /AND LOOP CONTROLLER FUNCTION / /DENSITY, HEAD, AND 8BIT MODE DCA FN TAD RIFLD /SET UP OUR FIELD JMS BUMPER /GO DO IT MSG8 /ERROR MESSAGE ADDRESS TAD SECTOR /GET OUR SECTOR BACK DCA RISEC JMP I RI /BACK TO MAIN LOOP / RISEC, -32 /START AT SECTOR 1 (OFFSET BY 33) RIFLD, CDF 0 /START AT FIELD 0 RIFN, 0 /4000 IF DOUBLE DENSITY DRIVE, 20 IF ODD # UNIT / /2 ALWAYS FOR READ, 1 IF SECOND PAIR ON VT78 / /400 IF DOUBLE DENSITY TRANSFER / / SUBROUTINE RO -- READ FROM OUTPUT DEVICE / RO, 0 /READ FROM OUTDEV TAD ROSEC /SET UP OUR SECTOR DCA SECTOR TAD ROFN /SET UP OUR FUNCTION TAD LOOPFN DCA FN TAD ROFLD /SET UP OUR FIELD JMS BUMPER /GO DO IT MSG9 TAD SECTOR /GET BACK OUR SECTOR DCA ROSEC JMP I RO /BACK TO MAIN / ROSEC, -32 /START AT SECTOR 1 ROFLD, CDF 0 /SET AT INIT TIME ROFN, 0 /SET AT INIT TIME, SAME FORMAT AS RIFN / / SUBROUTINE WO -- WRITE OUTPUT DEVICE / WO, 0 /WRITE TO OUTPUT DEVICE TAD WOSEC /SET UP OUR SECTOR DCA SECTOR TAD WOFN /SET UP OUR FUNCTION TAD LOOPFN DCA FN TAD WOFLD /SET UP OUR FIELD JMS BUMPER /GO DO IT MSG10 TAD SECTOR /GET BACK OUR SECTOR DCA WOSEC JMP I WO /BACK TO MAIN LINE / WOFLD, CDF 0 /FIELD TO START OUR WRITE WOSEC, -32 /OUR SECTOR, START AT 1 WOFN, 0 /SET FUNCTION AT INIT TIME / /SAME FORMAT AS ROFN, BUT NO READ BIT / / / SUBROUTINE COMP -- COMPARE BUFFERS / COMP, 0 TAD COMSEC /OUR SECTOR DCA SECTOR DCA FN /0 IS COMPARE FUNCTION TAD COMFLD /SET OUR FIELD JMS BUMPER /DO IT MSG7 TAD SECTOR /SAVE OUR SECTOR DCA COMSEC JMP I COMP / COMSEC, -32 /START AT 1 COMFLD, CDF 0 / / / / BUMPER / / ROUTINE TO HANDLER SECTORING, CORE POINTER, AND FIELDS / / CALLED BY RI, RO, WO, COMP; / STARTING FIELD IN AC, ERROR MSG ADDR IN CALL+1 / BUMPER IN TURN CALLS ACTION / BUMPER, 0 DCA BUMFLD /PLACE CDF SO SETS WHEN CALL ACTION JMS CTRLC /CHECK A CONTROL C TAD FN /NEED TO SELECT JMS SELECT /DO IF NECESSARY, AC.AND.7776 DCA FN /REPLACE FUNCTION, SELECT ONCE PER BUMPER CALL TAD COUNT7 /HOW MANY FIELDS TO INCREMENT THRU DCA BUMCNT B0, TAD (BSTART-1 /SET AUTO INCREMENT REG'S DCA X10 TAD X10 DCA X11 TAD BUMFLD /SET FIELD INTO ACTION DCA BFIELD BUMFLD, 0 /CDF PLACED HERE BY CALLER JMS ACTION /CALL ACTION ROUTIN JMS OOPS /ERROR, PRINTOUT SOMTHING TAD SECTOR /MOVE TO NEXT SECTOR TAD COUNT8 /ADD IN INTERLEAVE SPA /SKIP IF SPECIAL COMPUTING NEEDED JMP B2 /NO SPECIAL NEEDED, REPLACE SECTOR COUNT9, 0 /IAC OR SKP PLACED HERE !! AND (1 /FOR 2 INTERLEAVE, SWAP 0 AND 1 TAD (-32 /WRAP BACK TO MINUS B2, DCA SECTOR TAD X10 /CHECK IF DONE WITH BUFFER TAD (-BSTART-BSIZE+1 /DONE IF POINTING TO LAST LOC SZA CLA /SKIP IF DONE JMP BUMFLD /NO, DO NEXT SECTOR TAD (10 /INCREMENT FIELD TAD BUMFLD DCA BUMFLD ISZ BUMCNT /DONE WITH ALL FIELDS JMP B0 /NO, DO NEXT ONE ISZ BUMPER /SKIP OVER ERROR POINTER JMP I BUMPER / COUNT7, 0 /MINUS NUMBER OF FIELDS PER PASS COUNT8, 0 /INTERLEAVE 2 OR 3 SET AT INIT TIME BUMCNT, 0 /LOOP CONTROL FOR FIELDS, FILL FROM COUNT7 / / CONSTRUCT ERROR MESSAGE / OOPS, 0 TAD I BUMPER /GET ADDR OF MESSAGE JMS TYPE /PRINT TYPE OF FAILURE JMS ADPRNT /PRINT (HEAD), TRACK, SECTOR JMP I OOPS / PAGE / / SUBROUTINE TYPE -- PRINT MESSAGE / ON ENTRY AC HAS MESSAGE ADDRESS / TYPE, 0 DCA TYPAD /SAVE ADDR CIF 0 JMS I TTYENT 4100 TYPAD, 0 0 NOP JMP I TYPE / / SUBROUTINE RDANS -- READ ANSWER FROM TTY / ON ENTRY AC HAS BUFFER ADDR / RDANS, 0 DCA RDAD /SAVE ADDR CIF 0 JMS I TTYENT 0110 RDAD, 0 0 NOP JMP I RDANS / TTYENT, 0 /ENTRY POINT TO TTY HANDLER / / / SUBROUTINE APRNT -- PRINT TRACK AND SECTOR / ENTER WITH SECTOR IN AC / ADPRNT, 0 TAD LOOPFN /WHICH HEAD CLL RTL RAL /HEAD BIT TO AC11 CLA RAL /BUT CLEARING OUT OTHER BITS JMS SETIN /PUT TO MESSAGE MSG13A-1 TAD TRACK /TRACK KEPT IN COMPLEMENT FORM CMA JMS SETIN MSG13B-1 TAD SECTOR /SECTOR KEPT AS SECTOR-33 TAD (33 JMS SETIN MSG13C-1 TAD COUNT4 /IS QUAD OPERATION IAC /COUNT4 COMES -2 FOR QUAD, -1 NOT SNA CLA /SKIP IF YES TAD (10 /NO, DON'T TALK ABOUT HEADS TAD (MSG13 /ADDR FOR PRINTOUT JMS TYPE JMP I ADPRNT / / SUBROUTINE SETIN -- ENTER NUMBER INTO A MESSAGE / / ON ENTRY AC HAS NUMBER AND JMS+1 HAS POINTER TO MESSAGE / HOLE MINUS 1. (2 DECIMAL DIGIT NUMBERS ARE ASSUMED) / SETIN, 0 DCA SETIN1 /SAVE NUMBER DCA SETCNT /ZERO 10'S COUNTER TAD I SETIN /GET MSG ADDR DCA X17 /ENTER INTO AUTOINC POINTER ISZ SETIN /BUMP RETURN ADDR SETINB, TAD SETIN1 /GET NUMBER TAD (-12 /SUBTRACT 10 DECIMAL SMA /DONE DIVIDING? JMP SETINA /NO CLA /YES TAD SETCNT /GET 10'S SNA /SKIP IF A LEADING DIGIT TAD (-20 /MAKE LEADING 0 A LEADING BLANK TAD (260 /MAKE IT ASCII CDF 0 /ERROR MESSAGES IN FIELD 0! DCA I X17 /STORE IN MESSAGE TAD SETIN1 /GET REMAINDER TAD (260 /MAKE IT ASCII DCA I X17 /STORE IN MESSAGE CDF 10 /POINT CDF BACK HERE JMP I SETIN SETINA, DCA SETIN1 /SAVE RESULT ISZ SETCNT /INCREMENT 10'S COUNT JMP SETINB /CONTINUE / SETIN1, 0 /NUMBER STORAGE SETCNT, 0 /10'S COUNTER / / REFORMAT / / BELONGING HERE ONLY FOR REASONS OF FIT / / REFORM, TAD ROFN /OK, WHAT OUTPUT DENSITY DO WE HAVE SMA CLA /SKIP IF DRIVE IS CAPABLE OF A REFORMAT JMP ERR15 /GO PRINT ILLEGAL TYPE TAD ROFN /GET FUNCTION BACK JMS SELECT /ALSO MUST CHECK WHICH PAIR; AC=AC.AND.7776 TAD (4006 /TURN OFF TOP BIT, MAKE 2 READ INTO 10 REFORMAT SDN /CONTROLLER READY JMP .-1 LCD STR /WAIT FOR READY TO TAKE CODE JMP .-1 TAD (111 /SAFETY CODE XDR /PLACE TO DRIVE CLA SDN /WAIT FOR OVERALL DONE JMP .-1 /WIGGLE AC TO SHOW LIFE ?? AC7776 /SET AC TO STRIP WHICH PAIR BIT SER /SKIP IF AN ERROR DURING FORMAT CLL /CLEAR LINK TO SHOW NO ERROR AND ROFN /SET DONE FLAG TAD (4014 /BY A DUMMY READ ERROR STATUS, FLIPS LINK! LCD SNL /SKIP IF REFORMAT HAD NO ERROR JMP ERR19 /ERROR DURING REFORMAT, FATAL TAD OPTION /WAS IT A REFORMAT ONLY? AND (SINGLE+DOUBLE SNA CLA /SKIP IF YES JMP DO00 /NO, GO DO OTHER STUFF JMS QUEST /ASK IF ANOTHER FORMAT OPERATION WANTED MSG16 JMP EXITOK /"N" RETURN JMP REFORM /"Y" RETURN / PAGE / / / ACTION ROUTINE ENTRY POINT / / WATCH IT! WE CALLED WITH CDF POINTING TO BUFFER / ALSO CDF IS PLACED IN BFIELD, / SO WE CAN DO NO INDIRECTS EXCEPT THRU AUTO INCR TO BUFFER !! / / RETURN WITH SKIP IF OK, DIRECT RETURN WITH ERROR / / RESTORES DF TO 10 ON EITHER EXIT / / DO A SECTOR AT A TIME FOR A SINGLE FUNCTION / ACTION, 0 AC7775 /-3 ERROR RETRY COUNT DCA RETRY TAD FN /SORT FUNCTIONS SNA JMP COMPAR /GO DO COMPAR RTR /READ/WRITE BIT TO LINK SZL CLA /SKIP IF WRITE JMP READLP /GO TO READ / / WRITE LOOP / WRITLP, TAD FN /SET UP SILO OPERATION JMS LDCMD JMP WRIT1 /OTHER PAGE TO MOVE DATA TO SILO WRIT2, JMS DOIO /RETURN FROM OTHER PAGE TO ACCESS I/O JMP REFILL /COMMON EXIT / / READ LOOP / READLP, JMS DOIO /COME HERE TO RETRY I/O TAD FN JMS LDCMD TAD COUNT2 /RX01, 32 PASSES THRU 4 BYTES MOVED DCA RDCNT /RX02, 64 PASSES THRU ST5, STR JMP .-1 XDR DCA I X10 STR JMP .-1 XDR DCA I X10 STR JMP .-1 XDR DCA I X10 STR JMP .-1 XDR DCA I X10 ISZ RDCNT JMP ST5 REFILL, ISZ ACTION /OK EXIT, ALSO A LITERAL ACTEND, CDF 10 /DATA FIELD NORMAL AGAIN JMP I ACTION / / COMPAR / / COMPARE THE TWO BUFFERS / COMPAR, TAD REFILL /RESTORE ERROR FLAG TO 'OK' DCA ZOT TAD BFIELD /CREATE OTHER FIELD POINTER TAD COUNT6 DCA CFIELD TAD COUNT3 /SET UP LOOP CONTROL DCA COMCNT BFIELD, 0 /CDF PLACED HERE TAD I X10 /COMPARE CIA CFIELD, 0 /CDF PLACED HERE TAD I X11 SZA CLA /SKIP IF OK DCA ZOT /NOT OK, MAKE NON-SKIP RETURN!!!! ISZ COMCNT /THRU? JMP BFIELD /NO ZOT, 0 /ISZ ACTION PLACED HERE JMP ACTEND /RESTORE FIELD, GO BACK / / / DO I/O FUNCTION FOR READ OR WRITE / DOIO, 0 TAD FN /SILO FUNCTION, CONVERTED TO READ-WRITE TAD (4 /CONVERT SILO OPERATION TO I/O OPERATION JMS LDCMD TAD SECTOR /REQUESTED SECTOR TO HARDWARE TAD (33 /STORED AS -32 TO -1 STR JMP .-1 XDR CLA TAD TRACK CMA /COMPLEMENT TO PLUS NUMBER STR JMP .-1 XDR CLL CLA CMA RTL /AC=-3 TO KILL READ-WRITE BIT AND FN /I/O SKELETON WITHOUT READ-WRITE BIT TAD (16 /LOAD ERROR STATUS IS GOOD NO-OP JMS LDCMD JMP I DOIO / / LOAD COMMAND REGISTER / RDCNT=. LDCMD, 0 DCA CMDTMP /SAVE THE COMMAND TAD CMDTMP AND (376 /DOUBLE, KEEP ONLY 8 BITS, SINGLE NEVER HAD THEM SDN /SKIP ON DONE JMP .-1 LCD /PUT THE COMMAND TAD CMDTMP /CHECKING TOP BIT FOR DOUBLE DRIVE SMA JMP CDCK /SINGLE, JUST GO CHECK ERROR RTL RTL RAL AND (7 /TOP FOUR BITS NOW SENT STR JMP .-1 XDR CDCK, CLA SER /SKIP ON ERROR JMP I LDCMD ISZ RETRY /TRIED THREE TIMES YET JMP KEEPON /NO, KEEP ON TRYING TAD FN /DID WE ERROR OUT OF READ OR WRITE RTR /READ-WRITE BIT TO LINK SNL CLA /SKIP IF READ JMP ACTEND /WRITE IS ALL SET, GO TO ERROR RETURN TAD COUNT3 /READ MUST ADD APPROPRIATE AMOUNT TO X10 CIA /SO LOOP CONTROL IN BUMPER WORKS RIGHT! TAD X10 / DCA X10 JMP ACTEND /SET CDF BACK, AND ERROR EXIT / / ENTRY TO CONTINUE AFTER ERROR / / KEEPON, TAD FN /RETRYING READ OR WRITE RTR /R/W BIT TO LINK SZL CLA /SKIP ON WRITE JMP READLP /RETRY A READ JMP WRIT2 /SO GO RETRY WRITE / COUNT2, 0 /MINUS NUMBER OF READ PASSES PER SECTOR COUNT3, 0 /MINUS NUMBER OF BYTES (WORDS AS WELL) PER SECTOR COUNT6, 0 /DELTA FIELDS FOR COMPARE TRACK, 0 /TRACK NUMBER IN COMPLEMENT FORM FOR ISZ SECTOR, 0 /SECTOR TO DO, SET BY INTERLEAVE ROUTINE FN, 0 /FUNCTION BITS: ALWAYS 100 FOR 8BIT MODE / /+4000 FOR DOUBLE DRIVE, +1 FOR SECOND PAIR / /NOTE, THE 1 IS STRIPPED PRIOR TO CALL TO ACTION RETRY, 0 /RETRY COUNTER -3 TO 0 CMDTMP, COMCNT, 0 /TEMPORARY FOR COMPARE OR I/O / PAGE / / PART OF ACTION ROUTINE / / FILL SILO FOR WRITE / / SPREAD OUT TO SPEED UP / / / WRIT1, TAD COUNT1 /FOR RX01, 8 TIMES THRU 16 BYTE GIVES 128 DCA WRTCNT /FOR RX02, 16 TIMES THRU FOR 256 ST4, TAD I X10 /FETCH A BYTE STR /SKIP IF READY TO TRANSFER JMP .-1 /NO (SHOULDN'T HIT THIS ON VT78) XDR /MOVE BYTE TO SILO CLA /CLEAR THE MUMBLE AC TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA TAD I X10 STR JMP .-1 XDR CLA ISZ WRTCNT /THRU WITH SILO? JMP ST4 /NO JMP WRIT2 /REST OF LOOP ON OTHER PAGE / WRTCNT, 0 /CONTROL COUNT FOR FILL SILO LOOP COUNT1, 0 /FILLED AT INIT TIME, WRITE PASSES PER SECTOR! / / / SELECT SUBROUTINE / / CALL WITH AC11=0 TO SELECT FIRST PAIR, AC11=1 TO SELECT SECOND / / RETURN AC.AND.7776 / / IF SELECT REQUESTED IS SAME AS LAST SELECT, NO ACTION TAKEN / SELECT, 0 DCA WRTCNT /CONVENIENT TEMPORARY TO SAVE ARGUMENT TAD WRTCNT TAD LSTSEL /IS IT SAME AS LAST TIME RAR /TEST BIT TO LINK SNL CLA /SKIP IF DIFFERENT JMP NOSEL /NO SELECT NEEDED ISZ LSTSEL /CHANGE TO OTHER TYPE NOP /MAY INDEED SKIP CLA IAC AND LSTSEL /SELECT NEW TYPE 6750 /SELECT IOT SER /MUST CLEAR ERROR FLAG, MAY RANDOMLY SET NOP SDN /SAME FOR DONE NOP STR /AND TRANSFER NOP CLA TAD (16 /DUMMY READ ERROR STATUS TO SET DONE FLAG!! LCD NOSEL, AC7776 /RETURN ARGUMENT WITH LOW BIT CLEARED AND WRTCNT JMP I SELECT LSTSEL, 0 /START OFF ON FIRST PAIR / PAGE FIELD 0 *6420 / / PUT ERROR MESSAGES IN FIELD 0 RIGHT AFTER BUFFER / / / ERROR MESSAGES / VERBUF, "R; "X; "C; "O; "P; "Y; 240; "V; "4; "B; 240; 215; 212; 232 MSG2, "I; "L; "L; "E; "G; "A; "L; 240; "S; "P; "E; "C; "I; "F; "I "C; "A; "T; "I; "O; "N; 215; 212; 232 MSG3, "D; "E; "V; "I; "C; "E; 240; "I; "S; 240; "N; "O; "T; 240 "R; "X; 215; 212; 232 MSG5, "N; "O; 240; "I; "N; "P; "U; "T; 240; "D; "E; "V; "I; "C; "E; 215; 212; 232 MSG6, "N; "O; 240; "O; "U; "T; "P; "U; "T; 240 "D; "E; "V; "I; "C; "E; 215; 212; 232 MSG7, "C; "O; "M; "P; "A; "R; "E; 240 "E; "R; "R; "O; "R; 232 MSG8, "I; "N; "P; "U; "T; 240; "D; "E; "V; "I; "C; "E; 240 "R; "E; "A; "D; 240; "E; "R; "R; "O; "R; 232 MSG9, "O; "U; "T; "P; "U; "T; 240; "D; "E; "V; "I; "C; "E; 240 "R; "E; "A; "D; 240; "E; "R; "R; "O; "R; 232 MSG10, "O; "U; "T; "P; "U; "T; 240; "D; "E; "V; "I; "C; "E; 240 "W; "R; "I; "T; "E; 240; "E; "R; "R; "O; "R; 232 MSG11, "I; "S; 240; "M; "O; "N; "I; "T; "O; "R; 240 "R; "E; "M; "O; "U; "N; "T; "E; "D "?; 232 MSG12, "R; "E; "A; "D; "Y; "?; 232 MSG13, 240; "H; "E; "A; "D; MSG13A, 0 0 ", 240; "T; "R; "A; "C; "K; 240 MSG13B, 0 0 ", 240; "S; "E; "C; "T; "O; "R; 240 MSG13C, 0 0 215; 212; 232 MSG15, "I; "L; "L; "E; "G; "A; "L; 240; "F; "L; "O; "P; "P; "Y; 240; "T; "Y; "P; "E; 215; 212; 232 MSG16, "F; "O; "R; "M; "A; "T; 240; "A; "N; "O; "T; "H; "E; "R; 240; "F; "L; "O; "P; "P; "Y; "?; 232 MSG17, "I; "L; "L; "E; "G; "A; "L; 240; "S; "W; "I; "T; "C; "H; "(; "E; "S; "); 215; 212; 232 MSG18, "F; "L; "O; "P; "P; "Y; 240; "N; "O; "T; 240; "R; "E; "A; "D; "Y; 215; 212; 232 MSG19, "E; "R; "R; "O; "R; 240; "D; "U; "R; "I; "N; "G; 240; "F; "O; "R; "M; "A; "T; 215; 212; 232 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 | /11 OS8 SET (PAL8/MACREL VERSION) / /S.R. / / / S E T / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / COPYRIGHT (C) 1977,1978 BY DIGITAL EQUIPMENT CORPORATION. / / / / / EDIT HISTORY: / 19-MAR-77 S.R. REMOVED FROM CAMP V4 / 19-MAR-77 S.R. FIXED BUG WITH SET MTA FILES / 19-MAR-77 S.R. FIXED BUG WITH SET CDR / 19-MAR-77 S.R. FIXED BUG WITH = OPTION / 19-MAR-77 S.R. CONVERTED TO MACREL CODE / 01-APR-77 S.R. TTY PAUSE / 01-APR-77 S.R. TTY HEIGHT / 01-APR-77 S.R. TTY SCOPE / 17-APR-77 S.R. REWROTE TTY PAGE / 17-APR-77 S.R. DEV: DVCODE / 17-APR-77 S.R. FINISHED TTY SCOPE / 27-APR-77 S.R. TTY COL / 27-APR-77 S.R. SYS OPTIONS (INIT, OS8, OS78) / 03-MAY-77 S.R. LA8A, LA78 / 03-MAY-77 S.R. INIT OS78 FIXES TERMINATE / 03-MAY-77 S.R. BASIC FIXES / 29-JUN-77 S.R. TTY ARROW (NOT FOR PS/8) / 29-JUN-77 S.R. TTY ESC (NOT FOR PS/8) / 29-JUN-77 S.R. DEV BLK LOC (NOT FOR PS/8) / 8-DEC-77 S.R. ADDED SYMBIONT SUPPORT / 23-MAY-78 S.R. FIXED SCOPE BUG AND 2-PAGE SYS HANDLER BUG / 8-JUN-78 S.R. FIXED WIDTH=N BUG / MUST SKIP LOCS 1000-1777 LINBUF=1000 AUXBUF=6600 IFDEF EDF <MACREL=1> IFNDEF EDF <MACREL=0> IFNZRO MACREL < .ASECT AAA > IFZERO MACREL < *0 > 0 CIF 30 JMP .-1 IFNZRO MACREL < .XSECT XSET > IFZERO MACREL < *10 > XR1, 0 XR2, 0 XR3, 0 IFNZRO MACREL < .ZSECT ZSET > IFZERO MACREL < *20 > TEMP, 0 T, 0 T2, 0 LINPTR, 0 T3, 0 FLAG, 0 SPKNT, 0 DEVTYP, 0 /DEVICE TYPE (BITS 6-11) ENTRY, 0 /HANDLER ENTRY POINT NUM, 0 TYP, 0 /0 MEANS 'F', 1 MEANS 'R' T4, 0 DEVNUM, 0 DCW, 0 /DEVICE CONTROL WORD DCWPTR, 0 USR, 200 /POINTS TO USR ENTRY POINT ESCBIT, 0 /1 MEANS USER TYPED ALTMODE CNT, 0 CTOFLG, 0 /-1 MEANS SAW ^O PTR, 0 DHIT, 0 /DEVICE HANDLER INFO TABLE - 1 DHI, 0 /DEVICE HANDLER INFO DBLK, 0 /DEVICE HANDLER BLOCK VNOPTR, 0 /PTS TO VERSION # IN HANDLER VNO, 0 /CURRENT HANDLER VERSION NUMBER SAVPTR, 0 NO, 0 /1 MEANS 'NO' FLG, 1 /1 MEANS SAW NO DIGITS RR, 0 NUCODE, 0 SCOP, 0 /NON-0 IF TTY IS SCOPE NUM2, 0 /0000-0777 /SET /1000-1377 /OS/8 LINE BUFFER /1400-1777 /PS/8 LINE BUFFER /2000-6577 /SET /6600-7177 /AUXILIARY I/O BUFFER /7000-7177 /I/O BUFFER FOR TECO CCB /7200-7577 /OS/8 HANDLER /7600-7777 /OS/8 SCPBIT=7726 /BIT 4 IFNZRO MACREL < .ASECT ASET > *200 START, SKP JMP CHN TAD ("# JMS I [TYPE JMS BIT JMS I [READ /READ A LINE INTO OS/8 LINE BUFFER CHN, TAD [LINBUF /CHAIN ENTRY ADDRESS DCA LINPTR /INITIALIZE POINTER TO LINE BUFFER JMS BIT STA JMS I [SPACE /IGNORE LEADING SPACES JMS GETTWO /GET TWO CHARS DCA TEMP JMS I [SCAN /SCAN PAST EXTRA LETTERS OR DIGITS TAD TEMP JMS I [BRANCH /GO TO APPROPRIATE ROUTINE -2305;SET /SE -2605;VERSION /VE -1005;HELP /HE 0 SNA CLA JMP I [GOAWAY JMP I [SYNTAX /NONE OF THESE BIT, 0 CDF 10 TAD I (SCPBIT CDF 0 AND [200 DCA SCOP /NOTE WHETHER TTY IS SCOPE V3D TAD I (7612 TAD (-3 SNA CLA JMS I (FIX2P /FIXUP 2-PAGE SYSTEM HANDLER DCA .-1 /ONCE JMP I BIT / GETTWO /GET TWO LETTERS OR DIGITS FROM INPUT LINE, PACK IN SIXBIT /ADVANCE PAST THEM. SUBSTITUTE NULL IF NOT FOUND. GETTWO, 0 JMS GETSIX CLL RTL RTL RTL DCA T2 JMS GETSIX TAD T2 /COMBINE JMP I GETTWO GETSIX, 0 /GET A SIXBIT LETTER OR DIGIT (OR NULL) JMS ALPHA /IS IT ALPHANUMERIC? JMP NOTALPH /NO AND [77 /YES JMP I GETSIX /TRUNCATE TO SIXBIT NOTALPH,CLA JMS BACKC JMP I GETSIX /RETURN NULL GETC, 0 /GET A CHARACTER, ADVANCE POINTER TAD I LINPTR AND [177 /ALWAYS RETURN 8-BIT SZA TAD [200 /WITH HIGH ORDER BIT ON ISZ LINPTR /ADVANCE SCAN JMP I GETC /RETURN BACKC, 0 /MOVE SCAN POINTER BACK ONE STA TAD LINPTR DCA LINPTR JMP I BACKC /RETURN /RETURN 1 NOT OF TYPE DESIRED /RETURN 2 DESIRED TYPE /IN BOTH CASES, CHAR IS LEFT IN AC ALPHA, 0 /LOOK FOR ALPHANUMERIC JMS I [GETC JMS LETTER /IS IT A LETTER? JMP TRYDIG /NO, TRY DIGIT JMP GOTAL /YES TRYDIG, JMS DIGIT /IS IT A DIGIT? JMP I ALPHA /NO, AINT LETTER OR DIGIT GOTAL, ISZ ALPHA /YES, EITHER LETTER OR DIGIT JMP I ALPHA /RETURN WITH IT IN AC LETTER, 0 /LOOK FOR LETTER TAD (-"A CLL TAD ("A-"Z-1 SNL ISZ LETTER TAD ("Z+1 /RESTORE CHAR JMP I LETTER DIGIT, 0 /LOOK FOR DIGIT TAD (-"0 CLL TAD ("0-"9-1 /(DECIMAL) SNL ISZ DIGIT TAD ("9+1 /RESTORE DIGIT TO CHARACTER FORM JMP I DIGIT /AND RETURN WITH IT IN AC HELP, JMS I [PRINT TEXT /SET DEV: [NO] ATTRIB [N]/ JMS I [PRINT TEXT /VERSION/ JMS I [PRINT TEXT /HELP/ JMP I [START PAGE SYNTAX, CLA JMS PRINT TEXT /? SYNTAX ERROR/ GOAWAY, TAD ESCBIT SZA CLA JMP I [7605 /LINE ENDED WITH ESCAPE TAD I [READ /WAS 'READ' EVER CALLED? SZA CLA JMP I [START /YES, GET A NEW LINE JMP I [7605 /NO, WE MUST'VE BEEN CHAINED TO, RECALL KBM PRINT, 0 TAD I PRINT RTR RTR RTR JMS PRIN TAD I PRINT JMS PRIN ISZ PRINT JMP PRINT+1 LV, JMS I [CRLF ISZ PRINT JMP I PRINT PRIN, 0 AND [77 SNA JMP LV TAD [240 AND [77 TAD [240 DCA T3 TAD [200 KRS TAD (-203 SNA JMP CTRLC TAD (203-217 /^O SNA CLA JMS CTRLO TAD T3 JMS I [TYPE JMP I PRIN CTRLC, TAD ["^ JMS I [TYPE TAD ("C JMS I [TYPE /ECHO "^C" JMS I [DELAYY JMP I [7600 /THEN GO AWAY CTRLO, 0 KCC /CLEAR OUT ^O TAD ["^ JMS I [TYPE TAD ("O JMS I [TYPE JMS I [CRLF STA DCA CTOFLG /STOP ECHOING JMP I CTRLO NUMBIG, JMS PRINT TEXT /? NUMBER TOO BIG/ JMP I [GOAWAY NONEX, JMS PRINT TEXT /? CAN'T - DEVICE DOESN'T EXIST/ JMP I [GOAWAY SYSERR, JMS PRINT TEXT \? I/O ERROR ON SYS:\ JMP I [GOAWAY FIX2P, 0 TAD (66 DCA I TB ISZ .-1 ISZ KTR JMP .-4 JMP I FIX2P TB, TP1;TP2;TP3;TP4 KTR, -4 PAGE SYSOS8, 0 TAD NO /REVERSE MEANING OF 'NO' SNA CLA IAC DCA NO JMS SYS78 JMP I SYSOS8 SYS78, 0 TAD [7771 JMS I [SET200 JMS I [7607 200 AUXBUF 0 JMP I [SYSERR TAD (AUXBUF+371 JMS I [SET200 JMS I [7607 4200 AUXBUF 0 JMP I [SYSERR JMS I [7607 /THERE'S A 2ND COPY 200 /IN BLOCK 11 LOCATION 56 AUXBUF 11 JMP I [SYSERR TAD (AUXBUF+56 JMS I [SET200 JMS I [7607 4200 AUXBUF 11 JMP I [SYSERR JMS I (FIXCCL JMP I SYS78 SYSINI, 0 JMS I [GETC SNA CLA JMP DEFINI /ASSUME @INIT TAD NO SZA CLA JMP I [SYNTAX /SET SYS NO INIT CMD JMS I [BACKC TAD LINPTR DCA SAVLP TAD (-6 /ALLOW A MAXIMUM OF 5 CHARS DCA SAVKN SAVLUP, JMS I [GETC SNA CLA JMP DEFDO ISZ SAVKN JMP SAVLUP JMS I [PRINT TEXT /? INITIAL COMMAND TOO BIG/ JMP I [GOAWAY SAVKN, 0 SAVLP, 0 DEFINI, TAD (INIMSG DCA SAVLP DEFDO, JMS I [7607 200 AUXBUF TP1, 0 JMP I [SYSERR TAD NO SZA CLA TAD (400-1077 TAD (1077 DCA I (AUXBUF+77 JMS I [7607 4200 AUXBUF TP2, 0 JMP I [SYSERR TAD NO SZA CLA JMP I SYSINI JMS I [7607 200 AUXBUF 11 JMP I [SYSERR STA TAD SAVLP DCA XR2 TAD (AUXBUF-1 DCA XR3 TAD (-5 DCA SAVKN MOVL, TAD I XR2 DCA I XR3 ISZ SAVKN JMP MOVL JMS I [7607 4200 AUXBUF 11 JMP I [SYSERR JMP I SYSINI INIMSG, "@;"I;"N;"I;"T;0 PAGE *1400 /THIS WON'T ALWAYS WORK UNDER PS/8: TTGGO, JMP I TTGAG TTGAG, 0 JMS I [TTST1 JMS I [PRINT TEXT /A FUNNY THING HAPPENED TO ME ON THE WAY TO THE COMPUTER ROOM./ JMS I [PRINT TEXT /A PANHANDLER CAME UP TO ME AND SAID,/ JMS I [PRINT TEXT /"CAN YOU SPARE ME $25,000 FOR A CUP OF COFFEE?"/ JMS I [PRINT TEXT /"WHY SO MUCH?", I ASKED IN AMAZEMENT./ JMS I [PRINT TEXT /"THINGS HAVE BECOME SO AUTOMATED", HE REPLIED,/ JMS I [PRINT TEXT /"THAT THE ONLY WAY I CAN ORDER IT/ JMS I [PRINT TEXT /IS WITH A COMPUTER ORDER FORM"./ JMP I (TTGGO TTESC, 0 /V3D JMS I (OLDTST JMS I [SRCH 200;200;44 JMP I [REASEM TAD (-4 DCA TEMP /SEE SOURCE OF KL8E TAD NO SZA CLA TAD (7640-CLA /YES TAD (CLA /NO DCA I TEMP JMP I TTESC TTAROW, 0 /V3D JMS I (OLDTST JMS I [SRCH 200;200;7740 JMP I [REASEM IAC DCA TEMP TAD I TEMP RAL KSPA, SPA CLA JMP I [REASEM ISZ TEMP ISZ TEMP TAD TEMP TAD (3 DCA TEMP2 TAD NO SNA CLA JMP YESARO /YES TAD KSPA /NO NOAROW, DCA I TEMP JMP I TTAROW YESARO, TAD I TEMP2 JMP NOAROW GENBLK, 0 /V3D JMS I (GENCMN TAD NUM2 DCA BLOK /GET BLOCK NUMBER TAD (LOC JMS I [KEYSRCH JMP I [SYNTAX JMS I (GENCMN /GET LOCATION TAD [-400 CLL TAD NUM2 SZL CLA JMP I [NUMBIG TAD NUM2 TAD PAUXBUF DCA NUM2 JMS I ENTRY /READ BLOCK 200 PAUXBUF,AUXBUF BLOK, 0 JMP I [SYSERR TAD TEMP SNA CLA JMS I (ODT JMS I [ONUM DCA NUM CLA IAC DCA DEVNUM /FAKE OUT - PREVENTS RE-WRITING USED HANDLER TAD FLG SZA CLA JMP I GENBLK JMS I [GETC SZA CLA JMP I [SYNTAX TAD NUM DCA I NUM2 /SET NEW VALUE TAD BLOK DCA BLOK2 JMS I ENTRY 4200 AUXBUF TEMP2, BLOK2, 0 JMP I [SYSERR JMP I GENBLK PAGE *2000 /ORIGIN PAST OS/8 LINE BUFFER AT 1000. /SKIP PAST PS/8 LINE BUFFER (AT 1400) JUST IN CASE /PS/8 USERS WISH TO PATCH THIS PROGRAM /SCAN PAST EXTRA LETTERS OR DIGITS SCAN, 0 JMS I [ALPHA JMP NOPE CLA JMP SCAN+1 NOPE, CLA JMS I [BACKC JMP I SCAN /SCAN PAST SPACES; GIVE ERROR IF NO SPACES FOUND UNLESS AC=-1 SPACE, 0 DCA FLAG /SET AC=-1 TO PREVENT ERROR ON NO SPACES FOUND DCA SPKNT /INITIALIZE SPACE COUNTER SKP /JUMP INTO LOOP GOTSP, ISZ SPKNT JMS I [GETC /GET NEXT CHAR TAD [-240 SNA CLA /IS IT A SPACE? JMP GOTSP /YES, COUNT IT JMS I [BACKC /NO, PUT IT BACK ISZ FLAG /CHECK FLAG SKP /USER DIDN'T SPECIFY FLAG JMP I SPACE /-0 MEANT DON'T CHECK IF FOUND SPACE TAD SPKNT /HOW MANY SPACES DID WE FIND? SZA CLA JMP I SPACE /SOME. OK JMP I [SYNTAX /NONE. TSK. TSK. BRANCH, 0 DCA T BR2, TAD I BRANCH ISZ BRANCH SNA JMP NOTFND TAD T SNA CLA JMP FOUND ISZ BRANCH JMP BR2 FOUND, TAD I BRANCH DCA T JMP I T /FOUND ITEM IN COLUMN 1, JUMP TO ADDRESS IN COL 2 NOTFND, TAD T JMP I BRANCH /IF NOT FOUND IN COL 1, RETURN WITH AC INTACT BADKBM, CDF 0 JMS I [PRINT TEXT /? OLD VERSION OF KBM/ JMP I [GOAWAY LLS=6666 DBTD=6574 LSF=6661 DBST=6570 LP78, 0 TAD (CMA-NOP JMS LP8A JMP I LP78 LP8A, 0 TAD (NOP /AC MAY BE NON-0 DCA LPKOD JMS I (LPTST1 TAD VNO TAD (-2 SNA CLA JMP I (OLDERR JMS I [SRCH 0;200;7700 JMP I (OLDERR TAD (3 DCA TEMP TAD I TEMP AND [7000 TAD [-7000 SZA CLA /NOP OR CMA JMP I (OLDERR TAD LPKOD DCA I TEMP ISZ TEMP TAD I TEMP AND [7000 TAD (-6000 SZA CLA JMP I (OLDERR TAD LPKOD AND [70 SZA CLA TAD (DBTD-LLS TAD (LLS DCA I TEMP ISZ TEMP TAD LPKOD DCA I TEMP JMS I [SRCH 100;100;6203 JMP I (OLDERR TAD (2 DCA TEMP TAD LPKOD AND [70 SZA CLA TAD (DBST-LSF TAD (LSF DCA I TEMP JMP I LP8A LPKOD, 0 PAGE /READ A LINE INTO OS/8 LINE BUFFER READ, 0 DCA CTOFLG /ALLOW ECHOING RD1, TAD [LINBUF DCA LINPTR DCA ESCBIT GT, JMS I [GET LOOK, JMS I [BRANCH -377;RUBOUT -217;GT /^O -203;CTRLC /^C -212;LF /LINE FEED -215;CR /CARRIAGE RETURN -375;ESCAPE /ALTMODE -376;ESCAPE /ALTMODE (2ND FLAVOR) -233;ESCAPE /ESCAPE -225;CTRLU /^U -200;GT /IGNORE NULLS -223;GT /IGNORE ^S 0 DCA TEMP /NONE OF THESE TAD LINPTR TAD (-LINBUF-377 SNA CLA /AT END OF LINE BUFFER? JMP GT /YES, DON'T ACCEPT CHAR TAD TEMP /NO, RETRIEVE CHAR JMS I [TYPE /ECHO IT TAD TEMP /INSERT IN BUFFER DCA I LINPTR ISZ LINPTR /BUMP POINTER JMP GT /NEXT CTRLU, TAD ["^ JMS I [TYPE TAD ("U JMS I [TYPE /ECHO "^U" <CR><LF> JMS I [CRLF RDA, TAD ("# JMS I [TYPE JMP RD1 BS=10 RUBOUT, TAD LINPTR TAD [-LINBUF SNA JMP BOL /AT BEGIN OF LINE TAD [LINBUF-1 DCA LINPTR /MOVE POINTER BACK ONE TAD SCOP SZA CLA RUB3X, TAD (BS-"\ TAD ["\ JMS I [TYPE /ECHO "\" RUB3, TAD SCOP SNA CLA JMP .+3 TAD [40 SKP TAD I LINPTR JMS I [TYPE /ECHO RUBBED-OUT CHARACTER TAD SCOP SNA CLA JMP GT2 TAD [BS JMS I [TYPE GT2, JMS I [GET JMS I [BRANCH -377;RUB2 -216;GT2 /IGNORE ^O -203;CTRLC /^C 0 DCA TEMP /A NEW CHAR TAD SCOP SZA CLA JMP .+3 TAD ["\ JMS I [TYPE /ENCLOSE RUBBED-OUT CHARS IN \'S TAD TEMP JMP LOOK RUB2, TAD LINPTR TAD [-LINBUF SNA JMP BOL2 TAD [LINBUF-1 DCA LINPTR TAD SCOP SNA CLA JMP RUB3 JMP RUB3X BOL2, TAD SCOP SZA CLA JMP BOL TAD ["\ JMS I [TYPE BOL, JMS I [CRLF JMP RDA ESCAPE, TAD ["$ /ECHO ESCAPE AS DOLLAR SIGN JMS I [TYPE ISZ ESCBIT /NOTE ESCAPE CR, DCA I LINPTR /INSERT 0 AT END JMS I [CRLF JMP I READ /RETURN, WE GOT LINE LF, DCA I LINPTR /TEMPORARILY INSERT A 0 SENTINEL TAD [LINBUF-1 DCA XR1 JMS I [CRLF TAD ["# JMS I [TYPE LFLP, TAD I XR1 SNA JMP I [GT /FINISHED, GET SOME MORE CHARS JMS I [TYPE /ECHO CURRENT CHARS JMP LFLP PAGE /GET A DECIMAL NUMBER, RETURN IT IN AC NUMBER, 0 DCA NUM CLA IAC DCA FLG JMS I [BACKC NM1, JMS I [GETC JMS I [DIGIT JMP EON TAD (-"0 /CONVERT TO DIGIT DCA T4 DCA FLG /NOTE PASSAGE OF A DIGIT TAD NUM AND [7000 SZA CLA JMP I [NUMBIG TAD NUM CLL RTL TAD NUM CLL RAL TAD T4 SZL JMP I [NUMBIG DCA NUM JMP NM1 EON, CLA JMS I [BACKC TAD FLG SZA DCA NUM /IF NO DIGITS, RETURN A 1 TAD NUM JMP I NUMBER / GETDEV /PARSES OFF A DEVICE NAME (1-4 CHARS) /DETERMINES IF IT EXISTS /LOADS HANDLER INTO 7200-7577 IF NOT ALREADY IN CORE /SETS ENTRY POINT ADDRESS AT 'ENTRY' /SETS DEVICE NUMBER AT 'DEVNUM' /SETS DEVICE CONTROL WORD AT 'DCW' /SETS 'DEVTYP' GETDEV, 0 JMS I [GETTWO DCA WD1 JMS I [GETTWO DCA WD2 TAD WD1 TAD WD2 DCA WD1 /COMBINE TWO WORDS INTO 1 (IN WD1) TAD WD2 SNA CLA JMP INQ TAD WD1 /OS/8 KLUDGE FOR UNIQUENESS CLL RAL STL RAR /FORCE BIT 0 ON IF 2ND WORD WAS NON-ZERO DCA WD1 INQ, DCA WD2 CIF 10 JMS I USR 12 /INQUIRE WD1, 0 /DEVICE NAME WD2, 0 /GETS DEVICE NUMBER WD3, 0 /GETS ENTRY POINT JMP I [NONEX /DEVICE DOESN'T EXIST TAD WD3 SZA /IS HANDLER ALREADY IN CORE? JMP INCORE /YES TAD WD1 DCA DW1 TAD (7201 /ALLOW TWO PAGE HANDLER IN 7200 DCA DW3 DCA DW2 CIF 10 JMS I USR 1 /FETCH DW1, 0 /DEVICE NAME DW2, 0 /GETS DEVICE NUMBER DW3, 0 /GETS ENTRY POINT JMP I [NONEX /DOESN'T EXIST TAD DW2 DCA DEVNUM TAD DW3 DCA ENTRY JMP GETYP INCORE, DCA ENTRY TAD WD2 DCA DEVNUM GETYP, TAD DEVNUM TAD (7757 DCA DCWPTR /POINT INTO DEVICE CONTROL WGRD TABLE CDF 10 TAD I DCWPTR /GET DCW DCA DCW TAD DCW RTR RAR AND [77 DCA DEVTYP STA TAD I (37 /GET ADDRESS OF DHIT DCA DHIT TAD DHIT TAD DEVNUM DCA DHI TAD I DHI CDF 0 DCA DHI TAD DHI RTL RTL RTL AND (17 SZA TAD (15 DCA DBLK JMP I GETDEV DELAYY, 0 TAD (-10 DCA OUTER ISZ ZER JMP .-1 ISZ OUTER JMP .-3 JMP I DELAYY ZER, 0 OUTER, -10 PAGE OLDTST, 0 /V3D JMS I (ASRTST TAD VNO JMS I [BRANCH -1;OLDERR -2;OLDERR -3;OLDERR -4;OLDERR -5;TSTOK ZBLOCK 4 0 JMP I [NEWERR TSTOK, JMP I OLDTST TTPAUS, 0 JMS OLDTST JMS I [SRCH 200;100;15 JMP I [REASEM TAD (-3 DCA TEMP /SEE SOURCE OF KL8E FOR EXPLANATION TAD NO SNA CLA TAD (7650-7610 /YES TAD (7610 /NO DCA I TEMP DCA NUM JMS I [GETC SNA CLA JMP NOPA /NO PAUSE VALUE TAD NO SZA CLA JMP I [SYNTAX /SET TTY NO PAUSE N JMS I [NUMBER SNA JMP BADPAUS DCA NUM TAD NUM /SCALE CORRECTLY CLL RAL TAD NUM CLL RTL DCA NUM TAD FLG SZA CLA JMP BADPAUS /NO DIGITS TAD NUM AND [6000 SZA CLA JMP BADPAUS JMS I [SRCH 300;77;7600 JMP I [REASEM TAD (5 DCA TEMP TAD NUM CIA DCA I TEMP NOPA, JMS I (BASLUK JMP I TTPAUS TAD NUM CIA DCA I (AUXBUF+1 JMS I (BASWRI JMP I TTPAUS BADPAUS,JMS I [PRINT TEXT /? BAD VALUE FOR PAUSE DURATION/ JMP I [GOAWAY ONUM, 0 DCA NUM CLA IAC DCA FLG ONM1, JMS I [GETC TAD (-"0-10 /CONVERT TO DIGIT CLL TAD [10 SNL JMP OEON DCA T4 DCA FLG TAD NUM AND [7000 SZA CLA JMP I [NUMBIG TAD NUM CLL RTL RAL TAD T4 DCA NUM JMP ONM1 OEON, CLA JMS I [BACKC TAD NUM JMP I ONUM PAGE TTCOL, 0 TAD NO SZA CLA JMP I [SYNTAX /SET TTY NO COL JMS I [GETC SNA CLA JMP BADCOL /NO COL SPECIFIED JMS I [NUMBER SNA JMP BADCOL DCA NUM TAD FLG SZA CLA JMP I [SYNTAX TAD NUM AND [7770 SZA CLA JMP BADCOL TAD (CCLNAM /READ IN CCL.SV JMS I [LOOKUP JMP CCLNF /CCL NOT FOUND TAD (2 /WANT 2ND BLOCK IN CCL DCA ARG2 /CCL LOCATIONS 12400-12777 JMS I (7607 200 /READ IN 2 PAGES AUXBUF ARG2, 0 JMP I [SYSERR TAD ARG2 DCA ARG3 TAD I (AUXBUF /GET PTR TO DIRECT COL WORD SPA JMP OLDCCL TAD (AUXBUF-2400 /RELOCATE DCA ARG2 TAD NUM DCA I ARG2 JMS I (7607 4200 AUXBUF ARG3, 0 JMP I [SYSERR JMP I TTCOL BADCOL, JMS I [PRINT TEXT /? BAD COLUMN COUNT/ JMP I [GOAWAY OLDCCL, CLA JMS I [PRINT TEXT /? WRONG VERSION OF CCL/ JMP I [GOAWAY TYPE, 0 DCA TYPEM JMS I [DELAYY DCA .-1 /DELAY FIRST TIME THRU TO LET THINGS QUIET DOWN TAD CTOFLG SZA CLA JMP I TYPE /NO ECHOING TAD TYPEM TLS TSF JMP .-1 CLA JMP I TYPE TYPEM, 0 CCLNAM, FILENAME CCL.SV CCLNF, JMS I [PRINT TEXT /? CCL.SV NOT FOUND/ JMP I [GOAWAY CCLBLK=67 FIXCCL, 0 JMS I [7607 200 AUXBUF CCLBLK JMP I [SYSERR TAD I (AUXBUF TAD (-"G SPA CLA JMP I (OLDCCL TAD (CCLTBL JMS I (FIXUP JMS I [7607 4200 AUXBUF CCLBLK JMP I [SYSERR JMP I FIXCCL PAGE ESC, "E;"S;"C;4000+"A;4000+"P;4000+"E;0 TTHGHT, 0 JMS I (OLDTST JMS I [GETC SNA CLA JMP I (BADHIT /NO HEIGHT TAD NO SZA CLA JMP I [SYNTAX /SET TTY NO HEIGHT JMS I [NUMBER SNA JMP I (BADHIT DCA NUM TAD FLG SZA CLA JMP I (BADHIT /NO DIGITS JMS I [SRCH 300;77;7600 JMP I [REASEM TAD (3 DCA TEMP TAD NUM CIA DCA I TEMP TAD I TEMP ISZ TEMP DCA I TEMP JMS I (BASLUK JMP I TTHGHT TAD NUM CIA DCA I (AUXBUF JMS I (BASWRI JMP I TTHGHT / LOC YES NO KBMTBL, AUXBUF+313; 0210; 1070 AUXBUF+314; 1313; 2020 AUXBUF+316; 1324; 7240 AUXBUF+317; 4423; 3020 AUXBUF+322; 1313; 1440 AUXBUF+224; 7555; 7403 AUXBUF+225; 1207; 1302 AUXBUF+226; 7557; 7402 AUXBUF+227; 1207; 1302 0 CDTBL, AUXBUF+135; 0210; 1102 AUXBUF+136; 1335; 2024 AUXBUF+140; 1346; 7240 AUXBUF+141; 4466; 3024 AUXBUF+144; 1335; 1420 AUXBUF+33; 7555; 7403 AUXBUF+34; 5207; 5321 AUXBUF+35; 7557; 7402 AUXBUF+36; 5207; 5321 0 CCLTBL, AUXBUF+4; 0024; 0002 AUXBUF+5; 0522; 0143 AUXBUF+6; 5551; 5363 AUXBUF+7; 5600; 6000 0 AROW, "A;"R;"R;"O;"W;0 PAGE / SCOPE BIT ON DISK: / BLOCK 0 REL 126 BIT 4 / SCOPE BIT IN MEMORY: / LOC 17726 BIT 4 TTSCOP, 0 /THE FOLLOWING CODE WOULD BE ADDED IF WE WANT TO /ALLOW CHANGING KL8E SCOPE PATTERNS / JMS I (ASRTST / TAD VNO / JMS I [BRANCH / -1;OLDERR / -2;OLDERR / -3;OLDERR / -4;OLDERR / -5;TTSCOK / ZBLOCK 2 / 0 / JMP I [NEWERR TTSCOK, JMS I (7607 200 AUXBUF /READ 2 PAGES INTO AUXILIARY BUFFER 11 JMP I [SYSERR TAD (KBMTBL JMS FIXUP JMS I (7607 4200 AUXBUF 11 JMP I [SYSERR JMS I (7607 200 AUXBUF /READ BLOCK 53 (CD) 53 JMP I [SYSERR TAD (CDTBL JMS FIXUP JMS I (7607 4200 AUXBUF 53 JMP I [SYSERR TAD NO /SET SCOPE BIT SNA CLA IAC DCA SCOP CDF 10 TAD (SCPBIT JMS SET200 CDF 0 JMS I (7607 200 AUXBUF TP3, 0 JMP I [SYSERR TAD (AUXBUF+126 JMS SET200 JMS I (7607 4200 AUXBUF TP4, 0 JMP I [SYSERR / JMS I [SRCH / 366;11;7770 / JMP I [REASEM / CLA / JMS I [SRCH / 0;200;"\ / JMP I [OLDERR / IAC / DCA TEMP / TAD NO / SNA CLA / TAD (1336-1367 / TAD (1367 / DCA I TEMP JMP I TTSCOP SET200, 0 /DF IS SPECIALLY SET DCA HLTPTR TAD I HLTPTR AND (7577 DCA TEMP TAD TEMP TAD (-HLT SZA CLA JMP I (BADKBM TAD NO SNA CLA TAD [200 TAD TEMP DCA I HLTPTR JMP I SET200 HLTPTR, 0 FIXUP, 0 DCA FIXPTR FIXLUP, TAD I FIXPTR SNA JMP I FIXUP DCA FIXLOC ISZ FIXPTR TAD NO SZA CLA ISZ FIXPTR TAD I FIXPTR DCA I FIXLOC TAD NO SNA CLA ISZ FIXPTR ISZ FIXPTR JMP FIXLUP FIXPTR, 0 FIXLOC, 0 BASNAM, FILENAME BASIC.SV BASLUK, 0 TAD (BASNAM JMS I (LOOKUP JMP I BASLUK ISZ BASLUK TAD (7 DCA BASBLK JMS I [7607 200 AUXBUF BASBLK, 0 JMP I [SYSERR TAD BASBLK DCA BASB2 TAD I (AUXBUF+2 SNA CLA JMP I BASLUK JMP I (OLDBAS BASWRI, 0 JMS I [7607 4200 AUXBUF BASB2, 0 JMP I [SYSERR JMP I BASWRI PAGE TTCODE, 0 TAD NO SZA CLA JMP I [SYNTAX JMS I [ONUM SNA JMP I [SYNTAX DCA NUCODE TAD NUCODE AND [7700 SZA CLA JMP I [NUMBIG JMS I [TTST1 TAD (7200 DCA RR JMS GETIOT JMP I [OLDERR CIA DCA T2 TTLP, JMS GETIOT JMP I [OLDERR CIA DCA T3 TAD T3 CIA TAD T2 SNA JMP TTLP SMA CLA JMP .+3 TAD T3 DCA T2 /T2 CONTAINS NEG OF SMALLER IOT TAD (7200 DCA RR TTLP2, JMS GETIOT JMP I TTCODE TAD T2 SZA CLA CLA IAC TAD NUCODE CLL RTL RAL DCA T3 TAD I RR AND (7007 TAD T3 DCA I RR JMP TTLP2 GETIOT, 0 ISZ RR TAD RR TAD (-7600 SNA CLA JMP I GETIOT TAD I RR AND [7000 TAD [-6000 SZA CLA JMP GETIOT+1 TAD I RR RTR RAR AND [77 TAD (-20 CLL RAR SNA JMP GETIOT+1 RAL TAD (20 ISZ GETIOT JMP I GETIOT NOTIMPL,JMS I [PRINT TEXT /% OPERATION NOT YET IMPLEMENTED/ JMP I [GOAWAY SET, JMS I [SPACE DCA VNO /V3C JMS I [GETDEV JMS I [GETC JMS I [BRANCH -":;COLN -" ;COLN -"-;HYPH 0 JMP I [SYNTAX /NO : OR BLANK AFTER NAME BADHIT, JMS I [PRINT TEXT /? BAD HEIGHT SPECIFIED/ JMP I [GOAWAY TTALT, 0 JMS I [TTST1 JMP I [NOTIMPL JMP I TTALT PAGE COLN, STA JMS I [SPACE /IGNORE OPTIONAL SPACES JMS I [GETC SNA JMP I [SYNTAX TAD (-"- SNA CLA JMP HYPH JMS I [BACKC STA TAD DEVNUM SNA CLA JMP SYSDV COLN2, DCA NAM1 DCA NAM2 TAD (MAIN-1 /LOOK FOR DEVICE TYPE IN MAIN TABLE MNLUP, DCA XR1 TAD I XR1 SMA SZA JMP NOTYP /NOT FOUND TAD DEVTYP SNA CLA JMP FNDTYP TAD XR1 TAD (3 /POINT TO NEXT ENTRY JMP MNLUP FNDTYP, TAD I XR1 /GET GENERIC NAME DCA NAM1 TAD I XR1 DCA NAM2 DCA AUXFLG TAD I XR1 /GET PTR TO DEVICE TABLE INTO, DCA PTR DCA NO TAD LINPTR DCA SAVPTR /SAVE SCAN POINTER JMS I [GETTWO TAD (-1617 SNA CLA /ARE NEXT TWO CHARS 'NO'? JMS SAWNO /YES TAD SAVPTR /NO DCA LINPTR /RESTORE PTR SCNLUP, TAD I PTR SNA /GET NEXT KEYWORD POINTER JMP NOKEY ISZ PTR /POINT TO PTR TO ROUTINE JMS I [KEYSRCH JMP NOF /NOT FOUND TAD I PTR /FOUND DCA PTR /GET PTR TO ROUTINE STA TAD DEVNUM SZA CLA JMS I (HREAD /READ HANDLER JMS I PTR /CALL ROUTINE STA TAD DEVNUM SZA CLA JMS I (HWRITE /REWRITE HANDLER JMP I [GOAWAY SYSDV, ISZ AUXFLG TAD (SYSAUX JMP INTO /V3D ALLOW SET SYS: HYPH, JMS I [ALPHA JMP I [BADV DCA VNO TAD VNO SNA JMP I [BADV AND [17 DCA VNO JMS I [SPACE /IGNORE SPACE JMP COLN2 NOKEY, TAD AUXFLG SNA CLA JMP NOO JMS I [PRINT TEXT \? UNKNOWN ATTRIBUTE FOR DEVICE \ *.-1 NAM1, 0 NAM2, 0 0 JMP I [GOAWAY SAWNO, 0 ISZ NO STA JMS I [SPACE TAD LINPTR DCA SAVPTR JMP I SAWNO NOTYP, CLA ISZ AUXFLG TAD (AUX /SEARCH AUXILIARY TABLE JMP INTO NOF, ISZ PTR TAD SAVPTR DCA LINPTR JMP SCNLUP AUXFLG, 0 NOO, ISZ AUXFLG TAD (AUX DCA PTR JMP SCNLUP PAGE HREAD, 0 TAD DBLK SNA JMP RESERR DCA BLOCK JMS I [7607 200 /READ 2 PAGES L7200, 7200 /INTO 7200-7577 BLOCK, 0 /FROM THIS BLOCK ON SYSTEM DEVICE JMP I [SYSERR TAD DHI AND [177 /GET RELATIVE ENTRY PT TAD L7200 DCA ENTRY TAD VNO SZA CLA /V3C JMP I HREAD /VNO ALREADY SET BY - COMMAND TAD ENTRY VLOOP, DCA VNOPTR TAD I VNOPTR CLL TAD [-33 SZL CLA JMP BACKV TAD I VNOPTR SNA JMP OLDERR DCA VNO JMP I HREAD BACKV, STA TAD VNOPTR JMP VLOOP RESERR, JMS I [PRINT TEXT /? CAN'T - DEVICE IS RESIDENT/ JMP I [GOAWAY OLDERR, CLA JMS I [PRINT TEXT /? CAN'T - OBSOLETE HANDLER/ JMP I [GOAWAY HWRITE, 0 TAD BLOCK DCA BLKTWO JMS I [7607 4200 7200 BLKTWO, 0 JMP I [SYSERR JMP I HWRITE NEWERR, CLA JMS I [PRINT TEXT /? CAN'T - UNKNOWN VERSION OF THIS HANDLER/ JMP I [GOAWAY MAIN, -0; DEVICE TTY; TTYTBL -1; DEVICE PTR; PTRTBL -2; DEVICE PTP; PTPTBL -3; DEVICE CDR; CDRTBL -4; DEVICE LPT; LPTTBL -20; DEVICE MTA; MTATBL 1 ZBLOCK 20 /TABLE ENDS WITH A POSITIVE NON-ZERO NUMBER LPTTBL, WIDTH;LPWDTH LC;LPLC LV8E;LPLV LA8A; LP8A LA78; LP78 ZBLOCK 4 0 MTATBL, PARITY;MTAPAR DENSITY;MTADEN FILES;MTAFIL ZBLOCK 4 0 AUX, LOC;GENLOC FILES;GENFIL READO;GENREA VERS;GENVER DVCO;GENDVC /V3D BLK;GENBLK /V3D ZBLOCK 6 0 WIDTH, "W;"I;"D;"T;"H;0 LC, "L;"C;0 LV8E, "L;"V;4000+"8;4000+"E;0 CODE, "C;"O;"D;"E;0 ALT, "A;"L;"T;4000+"M;4000+"O;4000+"D;4000+"E;0 ECHO, "E;"C;"H;"O;0 PAYGE, "P;"A;"G;"E;0 TAB, "T;"A;"B;0 LOC, "L;"O;"C;4000+"A;4000+"T;4000+"I;4000+"O;4000+"N;0 FILES, "F;"I;"L;"E;4000+"S;0 READO, "R;"E;"A;"D;4000+"O;4000+"N;4000+"L;4000+"Y;0 VERS, "V;"E;"R;4000+"S;4000+"I;4000+"O;4000+"N;0 PARITY, "P;"A;"R;4000+"I;4000+"T;4000+"Y;0 DENSITY,"D;"E;"N;4000+"S;4000+"I;4000+"T;4000+"Y;0 FILL, "F;"I;"L;"L;0 FLAGG, "F;"L;"A;"G;0 CTRL, "C;"T;"R;"L;0 EVEN, "E;4000+"V;4000+"E;4000+"N;0 ODD, "O;4000+"D;4000+"D;0 DELAY, "D;"E;"L;"A;"Y;0 GAG, "G;"A;"G;0 PAUS, "P;"A;"U;"S;"E;0 HGHT, "H;"E;"I;"G;"H;"T;0 SCOPP, "S;"C;"O;"P;"E;0 SYSAUX, INIT; SYSINI OS8; SYSOS8 OS78; SYS78 ZBLOCK 10 0 DVCO, "D;"V;"C;4000+"O;4000+"D;4000+"E;0 COL, "C;"O;"L;4000+"U;4000+"M;4000+"N;0 LA8A, "L;"A;"8;"A;0 LA78, "L;"A;"7;"8;0 INIT, "I;"N;"I;"T;0 OS8, "O;"S;"8;0 OS78, "O;"S;"7;"8;0 PAGE LPWDTH, 0 JMS I (GETWID JMS LPTST1 TAD NUM CMA DCA I (7200 JMP I LPWDTH LPTST1, 0 TAD I (7201 SPA CLA JMP L645 TAD VNO JMS I [BRANCH -1;OLDERR -2;LPTOK -3;LPTOK ZBLOCK 4 0 JMP I [NEWERR LPTOK, JMP I LPTST1 L645, JMS I [PRINT TEXT /? CAN'T AFFECT ANNALEX LPT/ JMP I [GOAWAY ASRTST, 0 TAD DHI SPA CLA JMP I ASRTST JMS I [PRINT TEXT /? CAN'T - NOT KL8E HANDLER/ JMP I [GOAWAY GENVER, 0 TAD NO SZA CLA JMP I [SYNTAX JMS I [ALPHA JMP BADV DCA NUM TAD NUM AND (40 SZA CLA JMP BADV TAD NUM AND (37 DCA I VNOPTR JMP I GENVER GENREA, 0 CDF 10 TAD I DCWPTR CLL RTL CLL RAL TAD NO RAR CML RAR RAR DCA I DCWPTR CDF 0 JMP I GENREA GENFIL, 0 CDF 10 TAD I DCWPTR CLL RAL CLL RAL /ZERO LINK TAD NO RAR CML RAR DCA I DCWPTR CDF 0 JMP I GENFIL BADV, CLA JMS I [PRINT TEXT /? BAD VERSION LETTER/ JMP I [GOAWAY CRLF, 0 TAD [215 JMS I (TYPE TAD [212 JMS I (TYPE JMP I CRLF PAGE LPLV, 0 JMS I (LPTST1 TAD NO CLL RTL RTL TAD (4 DCA I (7201 JMP I LPLV LPLC, 0 JMS I (LPTST1 TAD NO CLL RTL RTL RAL CIA DCA I (7202 JMP I LPLC TTECHO, 0 JMS I [TTST1 TAD NO SZA CLA TAD (SKP CLA-SZA TAD (SZA DCA I (7200+120 JMP I TTECHO TTPAGE, 0 JMS I (OLDTST JMS I [SRCH /V3D NEW ROUTINE 215;100;7450 JMP I [REASEM TAD (3 /POINT TO 'SZA CLA' DCA TEMP TAD NO SNA CLA TAD (SZA CLA-CLA /YES TAD (CLA /NO DCA I TEMP JMP I TTPAGE TTTAB, 0 JMS I [TTST1 JMS I [GETC SNA JMP TTEO TAD (-"/ SNA CLA JMS I [GETC TAD (-"N SZA CLA JMP I [SYNTAX JMP NOTEC TTEO, TAD NO SNA CLA TAD (5000 TAD L200 JMS I (TECO NOTEC, JMS I [SRCH L200, 200;100;7 JMP I [REASEM DCA TEMP STA CLL RAL /-2 TAD TEMP DCA T2 TAD TEMP TAD (3 DCA T3 TAD NO SNA CLA JMP SETAB TAD TEMP TAD (-4 DCA T4 TAD T4 AND (77 TAD (1200 /TAD TTY240 DCA I T2 TAD (SZA CLA DCA I T3 JMP I TTTAB SETAB, TAD TEMP TAD (-12 DCA T4 TAD I T4 DCA I T2 TAD (SKP CLA DCA I T3 JMP I TTTAB BADWID, JMS I [PRINT TEXT /? ILLEGAL WIDTH/ JMP I [GOAWAY BLK, "B;"L;"O;"C;"K;0 PAGE TTFILL, 0 JMS I [TTST1 JMS I [SRCH 200;100;1377 JMP I [REASEM TAD (-1 DCA TEMP TAD NO CLL RAL TAD (2 TAD TEMP DCA T2 TAD I T2 DCA I TEMP JMP I TTFILL REASEM, JMS I [PRINT TEXT /? CAN'T - MUST REASSEMBLE KL8E SOURCE/ JMP I [GOAWAY TTDELAY,0 JMS I [TTST1 JMP I [NOTIMPL JMP I TTDELAY /ENTER WITH PTR TO POSSIBLE KEYWORD IN AC KEYSRCH,0 DCA KPTR KL, TAD I KPTR ISZ KPTR SNA JMP GOTKEY CIA DCA TEMP JMS I [ALPHA /IS IT ALPHANUMERIC? JMP EOK /NO TAD TEMP /COMPARE CLL RAL /LOW ORDER 11 BITS SNA CLA JMP KL /MATCHED, KEEP LOOKING JMP I KEYSRCH /DIDN'T MATCH EOK, JMS I [BACKC TAD TEMP CIA /INPUT STREAM RAN OUT OR HIT SPACE SPA CLA JMP GOTKEY /SPACE OR EOL MATCH FLAGGED CHARACTER JMP I KEYSRCH KPTR, 0 GOTKEY, JMS I [SCAN STA /SKIP EXTRA STUFF JMS I [SPACE ISZ KEYSRCH /TAKE GOOD RETURN 2 JMP I KEYSRCH PTRTBL, ZBLOCK 4 0 PTPTBL, ZBLOCK 4 0 TTYTBL, WIDTH;TTWIDTH CODE;TTCODE ALT;TTALT ECHO;TTECHO LC;TTLC PAYGE;TTPAGE TAB;TTTAB FILL;TTFILL FLAGG;TTFLAG CTRL;TTCTRL GAG;TTGAG DELAY;TTDELAY PAUS;TTPAUS /V3D HGHT;TTHGHT /V3D SCOPP;TTSCOP /V3D COL;TTCOL /V3D ESC;TTESC /V3D AROW;TTAROW /V3D ZBLOCK 10 0 PAGE TTFLAG, 0 JMS TTST1 JMS I [SRCH 200;200;247 JMP I [REASEM TAD (-2 DCA TEMP TAD NO SNA CLA TAD (SZA CLA-CLA TAD (CLA DCA I TEMP JMP I TTFLAG TTLC, 0 JMS TTST1 JMS I [SRCH 200;200;377 JMP I [REASEM TAD (5 DCA TEMP TAD I TEMP CLL TAD [200 SNL CLA JMP I [REASEM TAD NO SNA CLA TAD [40 /SNA CLA TAD (7610 /SKP CLA DCA I TEMP JMP I TTLC TTCTRL, 0 JMS TTST1 JMP I [NOTIMPL JMP I TTCTRL TTWIDTH,0 JMS GETWID JMS TTST1 TAD NUM AND [7 SZA CLA JMP I [BADWID TAD NUM TAD [-200 SNA CLA JMP I [BADWID JMS I [SRCH 200;200;7600 JMP I [REASEM IAC DCA TEMP TAD I TEMP AND [177 TAD (177+7200 DCA T2 TAD TEMP IAC DCA T3 TAD NUM CIA DCA I T3 TAD I T3 DCA I T2 JMP I TTWIDTH GETWID, 0 TAD NO SZA CLA JMP I [SYNTAX JMS OPTEQ JMS I [NUMBER SNA JMP I (BADWID DCA NUM TAD FLG SZA CLA JMP I [SYNTAX /NO DIGITS TAD NUM AND [7400 SZA CLA JMP I [NUMBIG JMP I GETWID TTST1, 0 JMS I (ASRTST TAD VNO JMS I [BRANCH -1;OLDERR -2;OLDERR -3;TTOK -4;TTOK /V3C -5;TTOK /V3D ZBLOCK 4 0 JMP I [NEWERR TTOK, JMP I TTST1 OPTEQ, 0 JMS I [GETC TAD (-"= SZA CLA JMP I OPTEQ STA /V3D JMS I [SPACE JMS I [GETC /ADVANCE OVER = CLA JMP I OPTEQ PAGE OPRIN, 0 DCA N3 TAD (-4 DCA OKNT OPLP, TAD N3 RTL RTL AND [7 TAD [60 JMS I [TYPE TAD N3 RTL RAL DCA N3 ISZ OKNT JMP OPLP JMP I OPRIN OKNT, 0 N3, 0 GTEM, 0 SRCH, 0 TAD I SRCH ISZ SRCH TAD (7200-1 DCA XR1 TAD I SRCH ISZ SRCH CIA DCA CNT TAD I SRCH CIA DCA TEMP ISZ SRCH SRLUP, TAD I XR1 TAD TEMP SNA CLA JMP SRFND ISZ CNT JMP SRLUP JMP I SRCH SRFND, ISZ SRCH TAD XR1 JMP I SRCH GENCMN, 0 TAD NO SZA CLA JMP I [SYNTAX JMS I [ONUM DCA NUM2 TAD FLG SZA CLA JMP I [SYNTAX JMS I [GETC DCA TEMP TAD TEMP SNA JMP I GENCMN TAD (-"= SZA TAD ("=-", SZA CLA JMP I [SYNTAX JMP I GENCMN GENLOC, 0 JMS GENCMN TAD DHI SPA CLA TAD [-200 TAD [-200 CLL TAD NUM2 SZL CLA JMP I [NUMBIG TAD NUM2 TAD (7200 /BASE OF HANDLER DCA NUM2 TAD TEMP SNA CLA JMS ODT GETNEW, JMS I [ONUM DCA NUM TAD FLG SZA CLA JMP I GENLOC JMS I [GETC SZA CLA JMP I [SYNTAX TAD NUM DCA I NUM2 JMP I GENLOC ODT, 0 TAD I NUM2 JMS OPRIN TAD ("/ JMS I [TYPE TAD I [READ DCA GTEM /SAVE CHAIN STATUS JMS I [READ TAD [LINBUF DCA LINPTR TAD GTEM DCA I [READ JMP I ODT OLDBAS, JMS I [PRINT TEXT /? OLD BASIC/ JMP I [GOAWAY VERSION,JMS I (PRINT TEXT \OS/8 SET V2A\ JMP I [START PAGE MTAPAR, 0 TAD NO SZA CLA JMP I [SYNTAX JMS MTST1 TAD LINPTR DCA SAVPTR TAD (EVEN JMS I [KEYSRCH SKP JMP SETE TAD SAVPTR DCA LINPTR TAD (ODD JMS I [KEYSRCH JMP I [SYNTAX TAD (400 SETE, TAD (2 DCA I (7200 JMP I MTAPAR MTST1, 0 TAD VNO JMS I [BRANCH -1;OLDERR -2;OLDERR -3;OLDERR -4;MTOK -5;MTOK -6;MTOK ZBLOCK 4 0 JMP I [NEWERR MTOK, JMP I MTST1 MTADEN, 0 JMS MTST1 TAD NO SZA CLA JMP I [SYNTAX JMP I [NOTIMP JMP I MTADEN MTAFIL, 0 JMS MTST1 TAD NO CIA /V3D IAC /V3D DCA I (7201 JMP I MTAFIL BADCOD, JMS I [PRINT TEXT /? UNKNOWN CARD CODE/ JMP I [GOAWAY /SUPPOSED TO WORK ON ALL VERSIONS CDCODE, 0 TAD NO SZA CLA JMP I [SYNTAX JMS I (OPTEQ JMS I [NUMBER TAD (-32 /026 SNA JMP C026 TAD (32-35 /029 SZA CLA JMP BADCOD JMS CHANGE LIST1;LIST2 JMP I CDCODE C026, JMS CHANGE LIST1;LIST3 JMP I CDCODE CHANGE, 0 TAD I CHANGE DCA P1 ISZ CHANGE TAD I CHANGE DCA P2 ISZ CHANGE CHLUP, TAD I P1 SNA JMP I CHANGE TAD (7200 /BASE OF HANDLER DCA P3 TAD I P2 DCA I P3 ISZ P1 ISZ P2 JMP CHLUP P1, 0 P2, 0 P3, 0 GET, 0 KSF JMP .-1 KRB AND [177 TAD [200 /FORCE TO 8-BIT JMP I GET PAGE /FIXED FOR V3D: LIST1, 104;105;106 114;115;116 124;125;126;127 134;135;136 0 LIST2, 3203;4007;3502 7514;0577;3637 0104;1211;3374;0641 7316;3410;1376 LIST3, 7735;4076;0774 3314;1002;0305 3204;1273;3606;1341 3716;1175;3401 TECNAM, FILENAME TECO.SV TECO, 0 DCA SA TAD (TECNAM JMS LOOKUP JMP I TECO /NOT THERE DCA BLKN JMS I (7607 100 /READ 1 PAGE FROM TECO 7000 /BUFFER BLKN, 0 JMP I [SYSERR TAD BLKN DCA BLKN2 TAD SA DCA I (7002 /REL LOC 2 IS S.A. JMS I (7607 4100 7000 BLKN2, 0 JMP I [SYSERR JMP I TECO SA, 0 LOOKUP, 0 DCA ARG1 /PTR TO FILENAME IN AC CLA IAC /LOOKUP ON SYS CIF 10 JMS I USR 2 ARG1, 0 /STARTING BLOCK 0 JMP I LOOKUP /NOT FOUND TAD ARG1 ISZ LOOKUP JMP I LOOKUP /RETURN 2 WITH BLOCK # IN AC GENDVC, 0 TAD NO SZA CLA JMP I [SYNTAX JMS I [ONUM SNA JMP I [SYNTAX DCA NUCODE TAD NUCODE AND [7700 SZA CLA JMP I (NUMBIG TAD NUCODE TAD (-30 SPA CLA JMP I [NUMBIG TAD NUCODE CLL RTL RAL DCA NUCODE TAD (7200 DCA RR DVLUP, JMS I (GETIOT JMP I GENDVC TAD (-30 SPA CLA JMP DVLUP TAD I RR AND (7007 TAD NUCODE DCA I RR JMP DVLUP CDRTBL, CODE;CDCODE ZBLOCK 4 0 PAGE /7000-7177 BUFFER FOR TECO CCB /7200-7577 BUFFER FOR HANDLER FIELD 0 *200 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 | /1 OS8 SOURCE COMPARE (SRCCOM) / / / / / / / / / /COPYRIGHT (C) 1972,1973,1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /LAST EDITED 4/28/77 / / /COPYRIGHT 1973,1977 /DIGITAL EQUIPMENT CORPORATION /MAYNARD, MASS. 01754 / /PDP-8 SOURCE COMPARISON PROGRAM /STOLEN FROM PDP-10 SRCCOM BY R. LARY VERSION= 4 /CHANGE EVERY MAJOR EDIT PATCH="A IFNDEF CORE <CORE=2 /DEFAULT IS 8K SYSTEM> MPARAM=7643 /COMMAND DECODER PARAMETER BLOCK IFZERO CORE-2 <F1=0 /FIELD FOR FILE 1 F2=10 /FIELD FOR FILE 2 LNBEG=2000 /BEGINNING OF LINE BUFFER > IFZERO CORE-4 <F1=20 F2=30 LNBEG=20 > BUFLIM=FBLOCK-1001 /END OF LINE BUFFER INBUF=FBLOCK-1000 /INPUT BUFFER /SRCCOM FIELD 0 PAGE 0 FIELD 0 XR=10 *20 SCT, 0 /TEMPORARY OFILNM, ZBLOCK 4 /OUTPUT FILE NAME IFPTR, 0 /TEMPORARY SETUP1, NOPUNCH *7556 /JAM PARAMETERS UP AGAINST TOP OF USER CORE FBLOCK, ENPUNCH /LAYOUT OF FILE PARAMETER TABLE /THERE IS A COPY OF THIS TABLE IN FIELDS F1 AND F2. EACH COPY /CONTAINS ALL THE INFORMATION ABOUT THE FILE WHOSE BUFFERS /ARE IN THE SAME FIELD PGNUM, 1 /CURRENT INPUT PAGE CURLIN, 0 /CURRENT LINE (IN LINE BUFFER) TOPLIN, 0 /NUMBER OF LINES IN LINE BUFFER TMPLIN, 0 /TEMPORARY STORAGE FOR "CURLIN" OLDLIN, 1 /LINE OPTIMIZATION COUNTER OLDPTR, LNBEG /LINE OPTIMIZATION POINTER /THE NEXT SEVERAL WORDS ARE A SUBROUTINE /WHICH READS A BUFFER IN FROM THE INPUT FILE INTEMP, 0 /SHIFT REGISTER FOR "GCHAR" ROUTINE CIF 0 JMS I INHNDL INCHCT, 7777 /COUNT OF CHARACTERS IN BUFFER INPTR, 0 /POINTS TO CURRENT WORD IN BUFFER INREC, 0 /CONTAINS CURRENT INPUT RECORD ISZ INTEMP /SUBROUTINE SKIPS ON INPUT ERROR CIF 10 JMP I INTEMP INHNDL, 0 /POINTS TO ENTRY POINT OF INPUT HANDLER INEOF, 0 /END-OF-FILE INDICATOR INRCNT, 0 /COUNT OF RECORDS REMAINING IN THIS FILE IFNZRO .-7600 <_ERROR_> *SETUP1+.-FBLOCK/PUT ASSEMBLER LOCATION COUNTER BACK SETUP2=. /CORE ALLOCATION FOR 8K SYSTEM / FIELD 0 / /0000-0377 CONTROL CODE /0400-0777 INPUT HANDLER 1 /1000-1377 INPUT HANDLER 2 /1400-1777 OUTPUT HANDLER /2000-6555 FILE 1 LINE BUFFER /6556-7555 FILE 1 INPUT BUFFER /7556-7577 FILE 1 CONTROL BLOCK / / FIELD 1 / /0000-1377 SRCCOM PROPER /1400-1777 OUTPUT BUFFER /2000-6555 FILE 2 LINE BUFFER /6556-7555 FILE 2 INPUT BUFFER /7556-7577 FILE 2 CONTROL BLOCK / / / FORMAT OF LINE BUFFER: / THE LINE BUFFER CONSISTS OF SOURCE LINES. THE FIRST WORD / OF EACH LINE IS A LENGTH WORD GIVING THE LENGTH OF THE / LINE (INCLUDING THE LENGTH WORD ITSELF) AS A POSITIVE / NUMBER. THE NEXT WORD IS THE NUMBER OF THE SOURCE PAGE / ON WHICH THIS LINE WAS FOUND. SUBSEQUENT WORDS CONTAIN THE / CHARACTERS OF THE LINE ITSELF, PACKED ONE PER WORD. NODFMS, "N;"O;" ;"D;"I;"F;"F;"E;"R;"E;"N;"C;"E;"S;0 SETUP, 0 /ROUTINE TO SET UP FILE PARAMETERS TAD [SETUP1-SETUP2 DCA SCT TAD [TAD SETUP1 DCA INST2 TAD [FBLOCK-1 DCA XR INST2, HLT /MOVE THE SKELETON PARAMETER BLOCK DCA I XR /UP INTO THE DESIRED FIELD ISZ INST2 ISZ SCT JMP INST2 RDF TAD [6201 DCA SETCDF /SAVE FIELD NUMBER CDF 10 TAD I IFPTR CDF 0 SNA JMP I [INERR1 /NO INPUT FILE - BAD CIF 10 JMS I [200 /ASSIGN DEVICE HANDLER 1 DVPAGE, 0 HLT /NEVER HOPPEN CDF 10 TAD I IFPTR AND [7760 /COMPUTE FILE LENGTH SZA TAD [17 CLL CML RTR RTR DCA SCT /SAVE IT AWAY TEMPORARILY ISZ IFPTR TAD I IFPTR SETCDF, HLT /RESET DATA FIELD DCA I [INREC /SAVE STARTING BLOCK NUMBER TAD SCT DCA I [INRCNT /SAVE FILE LENGTH TAD DVPAGE DCA I [INHNDL /SAVE DEVICE HANDLER ENTRY POINT ISZ IFPTR JMP I SETUP /RETURN *200 /INITIALIZATION CODE SRCCOM, ISZ NOCHN CIF 10 JMS I [7700 10 /BRING USR INTO CORE SRCCD, TAD NOCHN /HAVE WE BEEN CHAINED TO? SNA CLA JMP NOSRCD /YES CIF 10 JMS I [200 5 /COMMAND DECODE 0 /NO DEFAULT EXTENSIONS NOSRCD, TAD [7617 DCA IFPTR /SET IFPTR POINTING TO FILE 1 TAD [401 DCA DVPAGE /FILE 1 HANDLER GOES IN 400-777 CDF F1 JMS SETUP /SET UP FILE 1 PARAMETER AREA TAD [1001 DCA DVPAGE /FILE 2 HANDLER GOES INTO 1000-1377 CDF F2 JMS SETUP /SET UP FILE 2 PARAMETER AREA TAD [1401 DCA OUPAGE /OUTPUT HANDLER GOES INTO 1400-1777 GTOUHN, CDF 10 TAD I [7600 /GET OUTPUT DEVICE # CDF 0 SZA /IS THERE ONE? JMP ASSOUT DCA TTYNO CIF 10 /NO - LOOK UP "TTY" JMS I [200 12 /INQUIRE 5524 /=2424+3100 = TTY TTYNO, 0 0 JMP OUERR1 /NO TELETYPE TAD TTYNO CDF 10 DCA I [7600 JMP GTOUHN /BACK TO GET IT AGAIN ASSOUT, CIF 10 JMS I [200 1 OUPAGE, 0 JMP OUERR1 TAD [-4 DCA SCT TAD [7600 DCA XR TAD [DCA OFILNM DCA INST1 CDF 10 /MOVE OUTPUT FILE NAME INTO FIELD 0 TAD I XR INST1, HLT ISZ INST1 ISZ SCT JMP INST1-1 TAD PFILNM DCA ORCNO /SET UP ENTER TAD OFILNM+3 SNA TAD [1423 /ASSUMED OUTPUT EXTENSION = .LS DCA OFILNM+3 TAD I [7600 CDF 0 CIF 10 JMS I [200 3 ORCNO, 0 /POINTS TO FILE NAME OLEN, 0 JMP OUERR1 CIF 10 JMS I [200 11 /KICK USR OUT OF CORE DCA OCOUNT CDF CIF 10 TAD ORCNO DCA I [OUREC TAD OUPAGE JMP I .+1 SRCOPT /GO SET UP OPTION SWITCHES AND COMPARE OCLOSE, CIF 10 JMS I [7700 10 /GET USR INTO CORE CDF CIF 10 TAD I [7600 /GET OUTPUT DEVICE NUMBER CDF 0 JMS I [200 4 /CLOSE OUTPUT FILE PFILNM, OFILNM OCOUNT, 0 /COUNT OF BLOCKS WRITTEN JMP OUERR1 /ERROR ON CLOSE SRCATS, ISZ NOCHN /IN CASE WE LOOP, CLEAR "CHAINED TO" FLAG CDF 10 TAD I [MPARAM-1 /GET ALTMODE FLAG CDF 0 SPA CLA JMP I [7605 /GO AWAY IF ALTMODE JMP SRCCD /GO BACK FOR MORE NOCHN, 0 INERR1, RDF CLL RTR RAR TAD [-4 OUERR1, TAD [4005 NOROOM, TAD [260 DCA SETUP TAD [277 JMS TYPE /OUTPUT "?N" WHERE N IS THE ERROR NUMBER TAD SETUP JMS TYPE TAD [215 JMS TYPE TAD [212 JMS TYPE TAD SETUP SPA CLA /IS THE USR IN CORE? JMP SRCATS /YES - DON'T LOAD IT CIF 10 JMS I [7700 /NO - LOAD IT 10 JMP SRCATS TYPE, 0 TLS TSF JMP .-1 CLA JMP I TYPE / PAGE 0 LITERALS FIELD 1 /PAGE 0 FOR SRCCOM *0 T1, 0 T2, 0 T, 0 CT, 0 XR1=11 XR2=12 *20 /*************** SRCCOM SWITCHES *************** CSW, 0 /"C" SWITCH - ON=-257, MEANING IGNORE COMMENTS / OFF=+521, MEANING COMPARE COMMENTS SSW, 0 /"S" SWITCH - ON=-240, MEANING IGNORE SPACES & TABS / OFF=-200, MEANING COMPARE SPACES&TABS TSW, 0 /"T" SWITCH - ON=20 , MEANING CONVERT TABS ON OUTPUT / OFF=0 , MEANING PRINT TABS ON OUTPUT XSW, 0 /"X" SWITCH - ON=1 , MEANING DON'T INPUT COMMENTS / OFF=0 , MEANING INPUT COMMENTS INTO CORE ALLSW, 0 /"B" SWITCH - ON=2000, MEANING COMPARE BLANK LINES / OFF=0 , MEANING IGNORE BLANK LINES NUMLIN, 0 /NUMERICAL ARGUMENT - NUMBER OF LINES CONSTITUTING /A MATCH - SET TO -3 IF NO NUMERICAL ARGUMENT MLIMIT, 0 GETCNT, 0 GETFIL, 0 CHAR, 0 IPTR, 0 NUMTMP, 0 PLNCNT, 0 PNTPGN, 0 OUHNDL, 0 /THESE 5 WORDS ARE USED BY OUTPUT ROUTINE OUCHCT, 0 OUPTR, 0 OUXPTR, 0 OUTEMP, 0 TABCT, 0 DIFFS, 0 /DIFFERENCES FOUND FLAG CTCCHK, 0 TAD [200 KRS /GET A CHAR FROM THE TELETYPE TAD [-203 /CHECK FOR EITHER PARITY ^C SNA CLA KSF /WITH THE KEYBOARD FLAG UP JMP I CTCCHK /NOPE CDF CIF 0 /YUP - RETURN TO OS/8 JMP I [7600 PAGE SETONE, 0 /ROUTINE TO FIND WHERE A LINE IS TAD I [CURLIN /GET LINE NUMBER DCA TLNNUM /SAVE IT AWAY TAD I [OLDPTR /GET THE POINTER TO THE LATEST LINE SETOPT, DCA T /SAVE THE STARTING POINTER TAD TLNNUM /GET THE TARGET LINE CMA CLL TAD I [OLDLIN /IS IT BEFORE OR AFTER THE LATEST LINE? SZL JMP SETRST /BEFORE - WE MUST START SEARCHING FROM LINE 1 DCA CT /AFTER - START SEARCHING FROM LATEST LINE TLOOP, ISZ CT JMP KEEPON /NOT THERE YET TAD TLNNUM /WE FOUND IT - MAKE THIS LINE DCA I [OLDLIN /THE NEW "LATEST LINE" TAD T /TO SPEED UP DCA I [OLDPTR /FUTURE SEARCHES. CLA CMA TAD T JMP I SETONE /RETURN POINTER FOR AUTO-XR KEEPON, TAD I T TAD T /ADD LENGTH OF THIS LINE TO POINTER DCA T /TO GET POINTER TO NEXT LINE JMP TLOOP TLNNUM, 0 /TEMPORARY FOR SETONE - DO NOT USE ANYWHERE ELSE SETRST, CLA IAC /RESET THE "LATEST LINE" POINTERS TO THE FIRST DCA I [OLDLIN /LINE, SINCE THE LINE WE SEEK IS BEFORE TAD [LNBEG /THE CURRENT "LATEST LINE" JMP SETOPT /GO BACK AND FIND THE LINE MOVEUP, 0 /SUBR TO DELETE LINES FROM CORE TAD I [CURLIN /GET FIRST LINE NOT TO BE DELETED CIA TAD I [TOPLIN DCA I [TOPLIN /REDUCE THE NUMBER OF LINES IN THE BUFFER TAD I [TOPLIN /GET NEW LINE COUNT SNA /IF ALL LINES DELETED, DON'T MOVE CORE JMP MOVXIT /JUST CLEAN UP AND GET OUT IAC JMS SETONE /GET POINTER TO LAST LINE+1 CIA DCA MLIMIT /SAVE AS LIMIT ON MOVE IAC JMS SETONE /GET POINTER TO THE FIRST LINE NOT TO DELETE DCA XR1 TAD [LNBEG-1 DCA XR2 MLOOP, TAD I XR1 DCA I XR2 /AREN'T AUTO-XRS WONDERFUL TAD XR1 TAD MLIMIT /(ACTUALLY, NO) SZA CLA JMP MLOOP MOVXIT, CLA IAC /AFTER MOVING CORE AROUND, WE MUST DCA I [OLDLIN /RESET THE "LATEST LINE" POINTERS TO THE FIRST TAD [LNBEG /LINE SINCE IT IS THE ONLY ONE WHICH DCA I [OLDPTR /HAS A KNOWN POSITION. JMP I MOVEUP COMPL, 0 /SUBROUTINE TO COMPARE TWO LINES CDF F1 JMS SETONE /GET POINTER TO CURRENT LINE IN FILE 1 TAD [2 /SKIP OVER PROLOGUE DCA XR1 CDF F2 JMS SETONE /GET POINTER TO CURRENT LINE IN FILE 2 TAD [2 /SKIP OVER PROLOGUE DCA XR2 COMP1, CDF F1 TAD I XR1 /GET A CHAR FROM FILE 1 DCA T1 COMP2, CDF F2 TAD I XR2 DCA T2 /AND A CHAR FROM FILE 2 COMP0, TAD T2 CIA TAD T1 SZA CLA /ARE THEY EQUAL? JMP COMP4 /NO COMP5, TAD T1 SZA TAD CSW /IF AT END OF LINE, OR IF AT A "/" SZA CLA /AND "IGNORE COMMENTS" SWITCH ON, JMP COMP1 JMP I COMPL /TAKE "LINES MATCH" RETURN COMP3, CDF F1 TAD I XR1 /GET THE NEXT CHAR FROM FILE 1 DCA T1 COMP4, TAD T1 TAD SSW /IF T1 IS A BLANK OR A TAB SZA TAD [27 /(27=BLANK-TAB) SNA CLA /AND WE ARE IGNORING BLANKS, JMP COMP3 /THEN IGNORE T1 TAD T2 TAD SSW /DO THE SAME WITH T2 SZA TAD [27 SNA CLA JMP COMP2 TAD T1 CIA TAD T2 /NOW THAT WE HAVE (MAYBE) ELIMINATED BLANKS SNA CLA /ARE T1 AND T2 STILL UNEQUAL? JMP COMP5 /NO - THERE'S STILL HOPE TAD T1 /YES - NOW TEST COMMENT SWITCH CMA AND T2 TAD CSW /IF T1 IS A CARRIAGE RETURN AND T2 IS A "/" SNA CLA /WITH THE COMMENT SWITCH ON WE'VE SUCEEDED JMP I COMPL /SO TAKE "LINES MATCH" RETURN TAD T2 CMA AND T1 /SAME IF T2=CARRIAGE RETURN AND T1="/" TAD CSW SZA CLA ISZ COMPL /OTHERWISE TAKE "LINES DON'T MATCH" RETURN JMP I COMPL GETTWO, 0 /SUBROUTINE TO GET A LINE FROM EACH FILE CLA CLL CMA RTL DCA GETCNT DCA GETFIL /ZERO INDICATOR AS TO WHICH FILE IS NULL CDF F1 JMS I [GLINE /GET A LINE FROM FILE 1 CDF F2 JMS I [GLINE /DITTO FILE 2 ISZ GETCNT /HOW MANY LINES DID WE GET? JMP I GETTWO /LESS THAN TWO - TAKE EOF RETURN ISZ GETTWO JMP I GETTWO /TAKE NORMAL RETURN PAGE GLINE, 0 /SUBROUTINE TO GET A LINE FROM A FILE TAD I [CURLIN CIA TAD I [TOPLIN SZA CLA /IS THE LINE IN CORE? JMP GLEXIT /YES CLA IAC JMS I [SETONE /GET POINTER TO THIS LINE DCA XR1 CLA CLL CML RTL DCA I XR1 /SET WORD COUNT TO 2 TAD XR1 DCA T /SAVE POINTER TO LENGTH WORD JMS CTCCHK /CHECK FOR ^C TYPED ISZ XR1 GLINE2, JMS GCHAR /MAIN LOOP - GET A CHARACTER JMS I [TSTXSW /SEE WHETHER WE SHOULD INPUT COMMENTS CLA CLL CMA RAL TAD CHAR TAD ALLSW /IF THE CHAR IS A CARRIAGE RETURN AND THE TAD I T /"B" SWITCH IS OFF AND THE LINE COUNT IS 2, SNA CLA /THEN WE SHOULD IGNORE THIS BLANK LINE. JMP GLINE2 TAD CHAR DCA I XR1 /SALT IT AWAY TAD XR1 CLL TAD [4-BUFLIM /COMPARE AGAINST END OF BUFFER SNL CLA JMP .+3 CDF CIF 0 /LINE OVERFLOWS CORE - BAD! JMP I [NOROOM /TELL THE WORLD ISZ I T /BUMP COUNTER OF WORDS IN LINE TAD CHAR SZA CLA /WAS IT A CARRIAGE RETURN? JMP GLINE2 /NO ISZ I [TOPLIN /YES - BUMP COUNT OF LINES IN CORE ISZ T TAD I [PGNUM DCA I T GLEXIT, ISZ GETCNT /BUMP COUNTER OF # OF LINES GOTTEN RDF TAD [6201 DCA GETFIL /INDICATE THAT THIS FILE WAS NOT NULL ISZ I [CURLIN /BUMP CURRENT LINE POINTER JMP I GLINE GCHAR, 0 /SUBROUTINE TO GET A CHAR FROM A FILE TAD I [INPTR DCA IPTR /SAVE POINTER TO CURRENT BUFFER WORD ISZ I [INCHCT /BUMP CHAR COUNTER JMP GETIN TAD I [INEOF /END OF BUFFER SZA CLA /END OF FILE?? JMP GEOF+1 /YES CLA CLL CML RTL TAD I [INRCNT /BUMP COUNT OF REMAINING RECORDS BY 2 SZL /OVERFLOW? ISZ I [INEOF /YES - SET END OF FILE FLAG SNL DCA I [INRCNT /RESTORE COUNTER IF NO OVERFLOW CLL CMA CML RTL RTL RTL TAD [401 /COMPUTE INPUT CONTROL WORD RDF DCA I [INCHCT TAD [INBUF DCA I [INPTR /PUT BUFFER ADDRESS INTO CALLING SEQUENCE RDF TAD [6203 DCA .+1 NOP /SET INSTRUCTION FIELD TO DATA FIELD JMS I [INTEMP /CALL SUBR TO READ IN BUFFER JMP .+4 /NO ERROR SPA CLA /FATAL ERROR? JMP I [INERR /YES ISZ I [INEOF /NO - SET END OF FILE FLAG ISZ I [INREC ISZ I [INREC /BUMP RECORD NUMBER BY 2 TAD [10 DCA I [INTEMP /INITIALIZE SHIFT REGISTER TAD I [INCHCT CLL RAL TAD I [INCHCT AND [7600 CMA DCA I [INCHCT /COMPUTE CHAR COUNT FROM BUFFER CONTROL WD JMP GCHAR+1 /START ALL OVER WITH NEW BUFFER GETIN, TAD I [INTEMP SPA /IF WE HAVE A CHAR IN THE SHIFT BUFFER DCA I IPTR /WRITE OVER THE CURRENT BUFFER WORD WITH IT DCA I [INTEMP /AND ZERO THE SHIFT BUFFER TAD I IPTR /GET THE CURRENT BUFFER WORD AND [7400 CLL RAL TAD I [INTEMP RTL /SHIFT THE HIGH ORDER 4 BITS RTL /INTO THE SHIFT BUFFER SMA /DID WE GET A COMPLETE CHARACTER? ISZ I [INPTR /NO - BUMP WORD POINTER DCA I [INTEMP TAD I IPTR AND [177 /USE LOW ORDER 7 BITS OF THE CURRENT WORD SZA /AS THE CHARACTER TAD [-177 /IGNORING BLANK TAPE, RUBOUTS, LINE-FEEDS SZA /AND VERT. TABS TAD [177-13 SZA IAC SNA JMP GCHAR+1 TAD [12-14 SNA JMP FFEED /FORM FEED IS SPECIAL TAD [14-32 SNA JMP GEOF /^Z SIGNIFIES END-OF-FILE TAD [32-15 SZA TAD [215 /AND CARRIAGE RETURN IS MAPPED INTO 0 DCA CHAR JMP I GCHAR FFEED, ISZ I [PGNUM /BUMP THE PROPER PAGE COUNT ON A FORM FEED JMP GCHAR+1 /BUT OTHERWISE IGNORE IT GEOF, ISZ I [INEOF /SET END-OF-FILE FLAG CLA CMA DCA I [INCHCT /FORCE AN EMPTY BUFFER JMP I GLINE /RETURN FROM GLINE WITHOUT SETTING GETFIL PAGE / INITIALIZATION STARTC, JMS I [OUSETP /INITIALIZE OUTPUT BUFFER POINTERS CLA IAC DCA PNTPGN /FUDGE PNTPGN WHILE PRINTING HEADER LINES TAD [HEDING-1 JMS I [PNTHDG /PRINT SRCCOM HEADING LINE JMS I [GETTWO /GET TITLE LINES JMP FINISH /ONE FILE IS EMPTY - ABORT COMPARISON CDF F1 JMS I [PNTTXT /PRINT FILE 1 HEADER CDF F2 JMS I [PNTTXT /AND FILE 2 HEADER DCA PNTPGN /INITIALIZE PAGE NUMBER STA DCA DIFFS /INITIALIZE FLAG TO NO DIFFERENCES / MAIN LOOP MAIN, CDF F1 JMS I [MOVEUP CDF F2 JMS I [MOVEUP /DELETE ANY USELESS LINES MAINST, CDF F1 DCA I [CURLIN CDF F2 DCA I [CURLIN JMS I [GETTWO /GET TWO INPUT LINES JMP MAIN15 /ONE FILE IS EMPTY JMS I [COMPL /COMPARE THE LINES JMP MAIN /EQUAL - DELETE AND CONTINUE DCA DIFFS /UNEQUAL - CLEAR "NO DIFFERENCES" FLAG MAIN10, JMS I [GETTWO /GET TWO MORE LINES JMP MAIN15 /ONE FILE RAN OUT CDF F1 DCA I [CURLIN /INITIALIZE FILE 1 LINE NO. MAIN12, ISZ I [CURLIN /BUMP TO NEXT LINE IN FILE 1 JMS I [COMPL /COMPARE NEW LINE FROM FILE 2 JMS MULTI /WITH THIS LINE FROM FILE 1 CDF F2 /AND IF MATCH IS FOUND CHECK MULTIPLE LINES TAD I [CURLIN CIA CDF F1 TAD I [CURLIN SZA CLA /THROUGH WITH FILE 1 LINES? JMP MAIN12 /NO CDF F2 CLA IAC DCA I [CURLIN /NOW INITIALIZE FILE 2 LINE NO. MAIN14, TAD I [CURLIN CIA CDF F1 TAD I [CURLIN SNA CLA /HAVE WE EXHAUSTED FILE 2 LINES? JMP MAIN10 /YES - NO MATCH AT ALL JMS I [COMPL /NO - COMPARE ALL FILE 2 LINES JMS MULTI /AGAINST NEW FILE 1 LINE CDF F2 /AND, IF MATCH, CHECK MULTIPLE LINES ISZ I [CURLIN /GO TO NEXT FILE 2 LINE JMP MAIN14 /AND LOOP MAIN15, TAD GETFIL SNA /FIND WHICH FILE WAS EMPTY JMP FINISH /BOTH - ALL DONE DCA MAIN18 CDF F1 TAD I [CURLIN CDF F2 SZA CLA TAD I [CURLIN SNA CLA /IS EITHER FILE EXHAUSTED IN CORE? JMP MAIN18 /YES - PRINT ALL OF OTHER FILE TAD MAIN18 /GET CDF OF LONG FILE CIA TAD [4402+F1+F2 /COMPUTE CDF OF SHORT FILE DCA MAIN17 MAIN17, NOP TAD I [CURLIN CMA CLL TAD I [TOPLIN SNL CLA /IS CURLIN < TOPLIN? JMP MAIN10 /NO - WE STILL HAVE SOME COMPARING TO DO ISZ I [CURLIN JMS I [COMPL JMS MULTI JMP MAIN17 MAIN18, NOP /SET DF TO DATA FIELD OF LONG FILE JMS I [PNTTXT /PRINT IT JMP MAIN FINISH, CDF F1 TAD I [CURLIN CDF F2 TAD I [CURLIN SZA CLA /ARE BOTH CORE BUFFERS EMPTY? JMS I [PNTBTH /NO - PRINT THEM JMP I [EOCOMP / MULTI-LINE COMPARATOR MULTI, 0 CDF F1 TAD I [CURLIN DCA I [TMPLIN CDF F2 TAD I [CURLIN DCA I [TMPLIN /STORE CURLIN AWAY IN A TEMPORARY TAD NUMLIN DCA NUMTMP /GET COUNT OF LINES TO COMPARE JMP MULT6 MULT2, JMS I [GETTWO /GET TWO LINES JMP MULT4 /ONE FILE HAS NO MORE JMS I [COMPL /COMPARE THEM JMP MULT6 /THEY COMPARE - KEEP GOING MULT4, JMS SWAPCT /RESET OLD CURLIN JMP I MULTI MULT6, ISZ NUMTMP /LINE COUNT EXHAUSTED? JMP MULT2 /NO - KEEP COMPARING JMS SWAPCT /RESTORE OLD CURLIN JMS I [PNTBTH /PRINT OUT DIFFERENCES TAD [-10 JMS I [PNTAST /PRINT OUT SEPARATOR JMS SWAPCT /RE-SWAP FOR DELETION JMP MAIN /DELETE THRU MATCHING LINES AND CONTINUE SWAPCT, 0 CDF F1 JMS SWAPX /SWAP CURLIN AND TMPLIN FOR FILE 1 CDF F2 JMS SWAPX /DITTO FOR FILE 2 JMP I SWAPCT SWAPX, 0 TAD I [CURLIN DCA NUMTMP TAD I [TMPLIN DCA I [CURLIN TAD NUMTMP DCA I [TMPLIN JMP I SWAPX PAGE PNTBTH, 0 /PRINT BOTH TEXT BUFFERS TAD [212 JMS I [OCHAR /SEPARATOR CDF F1 JMS PNTTXT /PRINT FILE 1 BUFFER TAD [-4 JMS PNTAST /PRINT SEPARATOR CDF F2 JMS PNTTXT /PRINT FILE 2 BUFFER TAD [212 JMS I [OCHAR /SEPARATOR JMP I PNTBTH PNTTXT, 0 /PRINT A TEXT BUFFER TAD I [CURLIN CIA DCA PLNCNT /GET # OF LINES TO PRINT PNTLP, DCA TABCT /ZERO TAB COUNTER (IN CASE "T" SW ON) RDF CLL RTR RAR /GET FILE NUMBER TAD [261 /260 FOR 12K VERSION JMS I [OCHAR TAD [251 JMS I [OCHAR /PRINT RPAR TAD PLNCNT IAC JMS I [SETONE /GET POINTER TO LINE IAC DCA XR1 TAD I XR1 /GET THE PAGE NUMBER OF THE LINE DCA T TAD T CIA TAD PNTPGN SNA CLA /DID THE PAGE NUMBER JUST CHANGE? JMP PNTTAB /NO - DON'T PRINT IT TAD TENTAD DCA PNTTAD TAD T DCA PNTPGN /UPDATE THE CURRENT PAGE NUMBER CLA CLL CMA RTL DCA CT /PRINT 3 DECIMAL DIGITS DIGLP1, DCA T1 JMP .+3 DIGLP2, DCA T ISZ T1 TAD T PNTTAD, HLT /ADD IN A POWER OF 10 SMA JMP DIGLP2 /KEEP GOING PN7200, CLA ISZ PNTTAD /GOT A DIGIT - GO TO NEXT POWER OF 10 TAD T1 TAD [260 JMS I [OCHAR /PRINT DIGIT ISZ CT /THROUGH? JMP DIGLP1 /NO PNTTAB, TAD TSW SNA CLA /SHOULD WE SIMULATE TABS? JMP PNTCHR /NO TAD [240 /YES - PRINT A BLANK JMS I [OCHAR TAD TABCT AND [7 SZA CLA /KEEP PRINTING BLANKS UNTIL WE REACH A MULTIPLE OF JMP PNTTAB /EIGHT COLUMNS. PNTCLP, TAD I XR1 /GET A CHARACTER FROM THE LINE SNA /END? JMP PNTCR /YES TAD [-211 SNA /IS IT A TAB? JMP PNTTAB /YES PNTCHR, TAD [211 /NO - RESTORE THE CHAR JMS I [OCHAR JMP PNTCLP /PRINT IT AND LOOP PNTCR, TAD [215 /PRINT CRLF JMS I [OCHAR TAD [212 JMS I [OCHAR ISZ PLNCNT JMP PNTLP /LOOP FOR EACH LINE IN BUFFER JMP I PNTTXT PNTAST, 0 /ROUTINE TO PRINT ASTERISKS DCA CT /SAVE COUNTER TAD ["* JMS I [OCHAR ISZ CT JMP .-3 /PRINT REQUIRED NUMBER OF ASTERISKS TAD [215 JMS I [OCHAR /TERMINATE THE LINE TAD [212 JMS I [OCHAR DCA PNTPGN /KILL CURR. PAGE NUMBER JMP I PNTAST EOCOMP, ISZ DIFFS /ANY DIFFERENCES? JMP .+4 /YES CDF 0 /MESSAGE IN FIELD 0 TAD [NODFMS-1 JMS I [PNTHDG /NO - PRINT MESSAGE TAD PN7200 /ROUTINE TO FINISH UP OUTPUT DCA CT TAD [214 JMS I [OCHAR /TERMINATE THE OUTPUT FILE TAD [232 /WITH A FORM FEED AND A ^Z JMS I [OCHAR ISZ CT JMP .-2 /FILL WITH ZEROS TO FORCE BUFFER OUT CDF CIF 0 JMP I .+1 /GO TO FIELD 0 TO FINISH UP AS WE WILL BE OCLOSE /OVERLAYED BY THE USR DURING THE CLOSE TENTAD, TAD .+1 /TABLE OF POWERS OF TEN -144 -12 -1 INERR, RDF /INPUT ERROR - ERROR NUMBER=FILE NUMBER CLL RTR RAR IFZERO CORE-2 <IAC> IFZERO CORE-4 <TAD [-1> CDF CIF 0 JMP I [NOROOM /GO TO COMMON ERROR ROUTINE PNTHDG, 0 /ROUTINE TO PRINT A LITERAL LINE DCA XR1 /POINTER TO LINE IN AC TAD PNTHDG DCA PNTTXT /WE WORK BY FAKING OUT PNTTXT STA DCA PLNCNT /SET LINE COUNTER TO 1 JMP PNTCLP PAGE OCHAR, 0 /LOW LEVEL OUTPUT ROUTINE AND [377 DCA OUTEMP ISZ TABCT /BUMP TAB COUNTER RDF TAD [6201 DCA OCDF CDF 10 TAD OUCHCT /GET CHAR COUNTER - CHAR COUNTER COUNTS RTR /FOUR TIMES FOR EACH THREE CHARACTERS. CML /WHEN THE LOW ORDER BITS OF THE COUNT ARE 10, SZL SPA CLA /ITS TIME TO SQUEEZE A CHAR INTO THE HIGH JMP OUNORM /ORDER BITS - OTHERWISE JUST STORE IT ISZ OUCHCT /WE MUST SQUEEZE - BUMP OUCHCT AN EXTRA TAD OUTEMP /TIME RTL RTL AND [7400 TAD I OUXPTR /FIRST WORD OF DOUBLET DCA I OUXPTR TAD OUTEMP RTR RTR RAR AND [7400 TAD I OUPTR /SECOND WORD OF DOUBLET JMP OUCOMN OUNORM, TAD OUPTR DCA OUXPTR /REMEMBER LAST WORD ISZ OUPTR TAD OUTEMP OUCOMN, DCA I OUPTR ISZ OUCHCT /BUMP CHAR COUNT JMP OCDF /RETURN CIF 0 /CHAR COUNT OVFLO - OUTPUT BUFFER JMS I OUHNDL 4210 1400 OUREC, 0 JMP OUERR2 JMS OUSETP /INITIALIZE FOR NEXT BUFFER ISZ OUREC /BUMP RECORD NUMBER CDF 0 ISZ I [OCOUNT /BUMP CLOSING COUNT ISZ I [OLEN /AND LENGTH OF HOLE JMP OCDF OUERR2, CLL CML RTL /OUTPUT ERROR OR FILE TOO BIG - GENERATE IAC /A 3 OR A 4 MESSAGE, RESPECTIVELY CDF CIF 0 JMP I [NOROOM OCDF, HLT /RESTORE DATA FIELD JMP I OCHAR /RETURN OUSETP, 0 TAD [7000 /4 COUNTS FOR 2 WORDS DCA OUCHCT TAD [1377 DCA OUPTR JMP I OUSETP TSTXSW, 0 /SUBROUTINE TO IGNORE COMMENTS ON INPUT TAD CHAR /IF "X" SWITCH SET TAD [-257 SNA CLA TAD XSW /IF XSW IS OFF OR THE CURRENT CHAR ISN'T A / SNA CLA JMP I TSTXSW /RETURN JMS I [GCHAR TAD CHAR /SKIP CHARACTERS UNTIL CARRIAGE RETURN SZA CLA JMP .-3 TSTXLP, CLA CLL CMA RAL TAD I T SNA CLA /ARE WE AT THE BEGINNING OF A LINE? JMP I TSTXSW /YES - GLINE WILL DELETE IT IF NECESSARY TAD XR1 DCA TX TAD I TX TAD [-240 SZA /IS THE PREVIOUS CHARACTER A SPACE TAD [240-211 SZA CLA /OR A TAB? JMP I TSTXSW /NO CMA TAD XR1 DCA XR1 /BACK UP CHAR PTR CMA TAD I T DCA I T /AND CHAR CTR JMP TSTXLP /LOOP TX, 0 SRCOPT, DCA OUHNDL TAD I [MPARAM CMA AND [1000 /"C" OPTION TAD [-257 DCA CSW CLA CLL CML RTR AND I [MPARAM DCA ALLSW /"B" OPTION TAD I [MPARAM+1 CMA AND [40 /"S" OPTION TAD [-240 DCA SSW TAD I [MPARAM+1 AND [20 /"T" OPTION DCA TSW CLA IAC AND I [MPARAM+1 DCA XSW /"X" OPTION TAD I [MPARAM+3 CIA /GET NEGATIVE OF NUMERICAL ARGUMENT SNA CLA CLL CMA RTL /DEFAULT VALUE IS 3 DCA NUMLIN /TO NUMBER OF LINES NECESSARY FOR A MATCH JMP I .+1 STARTC HEDING, "S;"R;"C;"C;"O;"M;" ;"V;VERSION+"0;PATCH;212;0 /PAGE 0 LITERALS FOR FIELD 1 $-$-$ /END OF ASSEMBLY OF SRCCOM |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 | /TD8E DECTAPE COPY, V4 / / / / / / // / / / / /COPYRIGHT (C) 1972, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /DEFINITIONS FOR PAL8 AND PAL10 BSW=7002 MQL=7421 MQA=7501 CAM=7621 SWP=7521 ACL=7701 CAF=6007 CDI=6203 KCF=6030 SDSS=6771 SDST=6772 SDSQ=6773 SDLC=6774 SDLD=6775 SDRC=6776 SDRD=6777 FIXTAB HALT=HLT /UNIT NUMBER DEFINITIONS FOR TD8E IOT'S UNIT01=0770 UNIT23=0760 UNIT45=0750 UNIT67=0740 LIMIT=7600 *11 X11, 0 X12, 0 /PAGE 0 CONSTANTS AND VARIABLES *20 INPUT, 0 /INPUT UNIT CONSTANT OUTPUT, 0 /OUTPUT UNIT CONSTANTS 0 0 0 0 0 0 OCOUNT, 0 /NUMBER OF OUTPUT UNITS SPECIFIED OPOINT, 0 LIST, OUTPUT-1 OUTNUM, 0 IBLOCK, 0 /STARTING INPUT BLOCK OBLOCK, 0 /STARTING OUTPUT BLOCK NUMBER, 0 /NUMBER OF BLOCKS TO TRANSFER FIELDS, 0 /-(HIGHEST FIELD AVAILABLE) COUNT, 0 /TEMPORARY COUNTERS COUNT1, 0 / " COUNT2, 0 / " COUNT3, 0 / " COUNT4, 0 / " UNIT, 0 /UNIT CONSTANT--THIS TRANSFER VERF, 0 /VERIFY SWITCH (1=YES,0=NO) WDCNT, 0 /-(NUMBER OF WORDS PER BLOCK) RW, 0 /READ/WRITE BIT--THIS TRANSFER FLD0, 0 /# OF BLOCKS IN FIELD 0 BUFFER FLDN, 0 /# OF BLOCKS IN FIELD N BUFFER BUF0, 0 /START OF FIELD 0 BUFFER BUFN, 0 /START OF FIELD N BUFFER XNUMB, 0 /# OF BLOCKS LEFT TO TRANSFER BLOCKN, 0 /STARTING BLOCK NUMBER--THIS TRANSFER NUMB1, 0 NUMB2, 0 VB, 0 END0, 0 /BEGINNING OF FIELD 0 VERIFY BUFFER ENTRY, 0 /ENTRY TO TD8E HANDLER INB, 0 OUTB, 0 OHOLD, 0 MESSG1, TEXT @TD8E COPY V4A@ MESSG3, TEXT @ 12-BIT WORDS PER BLOCK@ *200 START, TLS JMS CRLF JMS I [MESSGE MESSG1 /@TD8E COPY@ JMS CRLF DCA COUNT JMP I [END /ONCE ONLY CODE FOR MULTIPLE FIELD TEST START1, JMS QUEST MESSG4 /@FROM UNIT:@ SWP JMS UNITNO /MAKE UNIT NUMBER CONSTANT DCA INPUT TAD LIST DCA OPOINT SKP AGAIN, JMS ERR4 /*ILLEGAL RESPONSE* DCA OCOUNT DCA COUNT JMS I [MESSGE MESSG5 /@TO UNITS:@ MORE2, JMS I [ANSWER JMP AGAIN ACL JMS UNITNO /MAKE UNIT NUMBER CONSTANT MQL /STORE IN MQ MQA /RESTORE TO AC CIA TAD INPUT SNA CLA /IS OUTPUT UNIT = INPUT UNIT ? JMP MORE2+1 /YES--ERROR ISZ OPOINT ISZ OCOUNT /COUNT ONE MORE OUTPUT UNIT TAD OCOUNT TAD [-10 SPA CLA /WERE MORE THAN 7 UNITS SPECIFIED? JMP .+3 JMS CRLF /YES--CARRIAGE RETURN JMP OALL /IGNORE EXTRA ONE SWP /NO-- DCA I OPOINT /STORE UNIT CONSTANT IN LIST TAD COUNT CIA TAD OCOUNT SPA SNA CLA /ALL UNITS IN? JMP MORE2 /YES OALL, DCA COUNT JMS I [MESSGE MESSG6 /@FIRST INPUT BLOCK:@ JMS I [ANSWER JMP WHOLE /COPY WHOLE TAPE TAD COUNT SNA CLA /WERE TOO MANY SPECIFIED? JMP .+5 JMS I [MESSGE /YES ERROR4 /@ILLEGAL RESPONSE@ JMS CRLF JMP OALL /REPEAT THE QUESTION ACL /NO DCA IBLOCK /STORE JMS QUEST MESSG7 /@FIRST OUTPUT BLOCK:@ ACL DCA OBLOCK JMS QUEST MESSG8 /@NUMBER OF BLOCKS TO COPY:@ ACL SNA /WERE 0 BLOCKS SPECIFIED? JMP QUEST1 /YES--REPEAT QUESTION DCA NUMBER JMP .+4 WHOLE, DCA IBLOCK DCA OBLOCK DCA NUMBER /0 MEANS WHOLE TAPE JMS QUEST MESSG9 /@VERIFY OUTPUT (YES=1,NO=0):@ ACL AND [7 DCA VERF JMP I (SETUP /OUTPUT CARRIAGE RETURN/LINE FEED CRLF, 0 TAD (215 JMS I [TYPE TAD [212 JMS I [TYPE JMP I CRLF /--RETURN-- ERR4, 0 JMS I [MESSGE ERROR4 /@ILLEGAL RESPONSE@ JMS CRLF /OUTPUT CARRIAGE RETURN/LINE FEED TAD [-4 TAD ERR4 DCA ERR4 DCA COUNT JMP I ERR4 /--RETURN-- QUEST, 0 TAD I QUEST DCA MNUM ISZ QUEST JMS I [MESSGE MNUM, 0 JMS I [ANSWER QUEST1, JMS ERR4 TAD COUNT SZA CLA JMP QUEST1 JMP I QUEST /--RETURN-- /CONVERT UNIT NUMBER TO A WORD OF THE FORM /000 XXX XXX 000 OR /100 XXX XXX 000 /WHERE XY0 IS THE THIRD DIGIT OF THE IOT /AND 0 OR 1 REFLECTS THE TD8E UNIT NUMBER /ENTER WITH THE UNIT NUMBER IN THE AC /EXIT WITH SPECIAL CODE IN AC UNITNO, 0 AND [7 /MASK OUT ALL EXTRANEOUS BITS CLL RAR /SAVE 0/1 BIT IN LINK MQL /STORE ROTATED WORD, CLEAR AC RAR SWP /PRESERVE 0/1 BIT IN MQ TAD TABX /GET DEVICE NUMBER CORRECTLY DCA CRLF TAD I CRLF MQA /OR IN 0/1 BIT JMP I UNITNO /--RETURN-- TABX, UNITS /SKIP 4 LINES AND FETCH MARK TRACK SKIPQ, 0 IOTR5, SDSQ JMP .-1 IOTR6, SDRC JMP I SKIPQ /--RETURN-- *400 /USER RESPONSE HANDLER /USES MQ FOR TEMPORARY STORAGE /EXIT WITH RESPONSE IN MQ /EXIT TO CALL+1 IF JUST CARRIAGE RETURN /OR ILLEGAL CHARACTER, CARRIAGE RETURN /OR ;,CARRIAGE RETURN /EXIT TO CALL+2 IF GOOD DATA, CARRIAGE RETURN /INCREMENT COUNT AND EXIT TO CALL+2 IF GOOD DATA; /ILLEGAL CHARACTERS CAUSE WHOLE ANSWER TO BE IGNORED /AND EXIT TO CALL+1 ANSWER, 0 CAM /CLEAR AC AND MQ TAD CLEAR DCA SWITCH MORE, JMS LISTEN /FETCH A CHARACTER TAD (-215 SZA /IS IT A CARRIAGE RETURN? JMP .+5 /NO TAD [212 /YES--OUTPUT LINE FEED JMS TYPE SWITCH, NOP /SET UP EXIT ADDRESS JMP I ANSWER /--RETURN-- TAD (215-260 SPA /IS CHARACTER LESS THAN 260? JMP BAD /YES--ILLEGAL CHARACTER TAD [260-270 /NO SMA /IS IT MORE THAN 269? JMP SEMI /YES--CHECK FOR SEMICOLON TAD (270 /RESTORE CHARACTER AND [7 /MASK OUT EXTRANEOUS BITS CLL SWP AND (777 /MASK OUT FIRST DIGIT IF THERE ARE 4 RAL /ROTATE 3 LEFT RTL MQA /FETCH NEW CHARACTER MQL /STORE RESULT IN MQ TAD SKIP /SET UP TO SKIP ON RETURN DCA SWITCH JMP MORE /FETCH ANOTHER CLEAR, NOP SKIP, ISZ ANSWER BAD, CLA /ILLEGAL CHARACTER JMS I [CRLF JMP I ANSWER /--RETURN-- /TEST FOR SEMICOLON SEMI, TAD (270-273 SZA CLA /IS CHARACTER A SEMICOLON? JMP BAD /NO--ILLEGAL CHARACTER ISZ COUNT /YES--INCREMENT COUNTER JMP SWITCH /EXIT FROM ANSWER ROUTINE /TELETYPE INPUT AND ECHO HANDLER LISTEN, 0 KSF JMP .-1 JMS I [PARITY TLS /ECHO CHARACTER JMS CHECK /CHECK FOR CTRL/C AND CTRL/S JMP I LISTEN /--RETURN-- /CHECK FOR CTRL/C AND CTRL/S /ENTER WITH INPUT CHARACTER IN AC /EXIT TO HANDLER OR WITH CHARACTER IN AC CHECK, 0 TAD (-203 SNA /IS IT CTRL/C? JMP I CTRLC /YES--HANDLE IT TAD (203-223 SNA /IS IT CTRL/S? JMP I [REPEAT /YES--HANDLE IT TAD (223 /RESTORE CHARACTER JMP I CHECK /--RETURN-- CTRLC, LIMIT /MESSAGE OUTPUT HANDLER /EXPECTS MESSAGE ADDRESS TO BE IN LOCATION AFTER CALL /EXITS TO CALL+2 MESSGE, 0 TAD I MESSGE DCA FINDER /SET UP POINTER ISZ MESSGE DCA LOC /SET L/R SWITCH TO L (EVEN) LNEXT, TAD I FINDER /GET WORD BSW RHALF, AND [77 SNA /IS CHARACTER 0 (TERMINATOR)? JMP I MESSGE /YES--RETURN-- DCA CHAR TAD CHAR AND (40 SNA CLA /IS IT A LETTER? TAD [100 /YES--301-337 TAD [200 /NO--240-277 TAD CHAR /RESTORE CHARACTER JMS TYPE /OUTPUT IT ISZ LOC TAD LOC RAR SZL CLA /WHICH HALF WAS THAT? JMP .+3 ISZ FINDER /RIGHT JMP LNEXT TAD I FINDER /LEFT JMP RHALF FINDER, 0 LOC, 0 CHAR, 0 /TELETYPE OUTPUT ROUTINE TYPE, 0 TSF JMP .-1 TLS CLA JMP I TYPE /--RETURN-- /INSERT IOT'S ACCORDING TO TABLES /UNIT CONTAINS APPROPRIATE UNIT CODE /COUNT CONTAINS -(NUMBER OF IOT'S TO TRANSFER) /COUNT1 CONTAINS ADDRESS OF ADDRESS TABLE /UNIT CONTAINS UNIT CODE OF CURRENT UNIT INSERT, 0 TAD I COUNT1 DCA COUNT3 TAD UNIT MQL TAD I COUNT3 /MAKE NEW IOT AND (7007 MQA CIA TAD I COUNT3 /COMPARE WITH IOT FROM PROGRAM SNA CLA /ARE THE IOT'S THE SAME AS THE LAST UNIT? JMP I INSERT /YES--RETURN-- INS1, TAD I COUNT1 DCA COUNT3 TAD I COUNT3 /GET IOT FROM PROGRAM AND (7007 /RETAIN ONLY SIGNIFICANT BITS MQA /OR IN UNIT NUMBER DCA I COUNT3 /PUT IT IN PROGRAM ISZ COUNT1 /BUMP COUNTERS ISZ COUNT /DONE YET? JMP INS1 /NO JMP I INSERT /YES--RETURN-- PAGE /COUNT THE NUMBER OF WORDS PER BLOCK /PLACE IT IN MWORDS /BE SURE ALL TAPES MATCH INPUT FORMAT SETUP, TAD LIST DCA OPOINT /SET POINTER TO I/O LIST DCA COUNT2 /CLEAR COUNTER TAD OCOUNT CMA DCA OUTNUM /SET # OF UNITS SET4, TAD (TABLE1-END1-1 /SET UP COUNTERS FOR IOT FIX DCA COUNT TAD (TABLE1 DCA COUNT1 TAD I OPOINT DCA UNIT JMS I [INSERT /PUT THE PROPER IOT'S IN THE FOLLOWING ROUTINE DCA WDCNT /CLEAR WORD COUNT TAD UNIT AND [4000 TAD (2000 IOTX7, SDLC CLA IOTX8, SDRC RTL SZL /DOES UNIT EXIST? JMP .+3 /YES SELERR, JMS I [ERR3 /@SELECT ERROR UNIT N@ JMP SETUP AND (400 SZA CLA /TURNED ON? JMP SELERR /NO TAD UNIT /GET 0 OR 1 UNIT BIT (0 OR 4000) AND [4000 TAD [1000 /GET GO BIT IOTX1, SDLC /START READING FORWARD JMS SKIP4 /SKIP 8 LINES TO AVOID GARBAGE JMS SKIP4 IOTX3, SDSS /LOOK FOR FORWARD BLOCK NUMBER (26) JMP .-1 IOTX4, SDRC AND [77 TAD (-26 SZA CLA /FOUND YET? JMP IOTX3 /NO--KEEP LOOKING SET2, JMS SKIP4 /YES--START COUNTING LINES BY FOURS ISZ WDCNT NOP AND [77 TAD (-51 SZA CLA /FOUND GUARD YET? JMP SET2 /NO TAD UNIT /YES AND [4000 IOTX2, SDLC /STOP UNIT CLA TAD COUNT2 SZA /IS THIS THE INPUT UNIT? JMP SET5 /NO TAD (-11 /YES--SAVE THE COUNT TAD WDCNT CIA DCA COUNT2 JMP SET3 /FIRST OUTPUT UNIT SET5, TAD (-11 /NOT INPUT UNIT TAD WDCNT SZA CLA /SAME NUMBER OF WORDS AS INPUT UNIT? JMP ERR5 /NO*ILLEGAL FORMAT* SET3, ISZ OPOINT /NEXT UNIT ISZ OUTNUM /DONE YET? JMP SET4 /NO TAD COUNT2 /YES--PRINT MESSAGE DCA I [MWORDS /SET UP NUMBER OF WORDS PER BLOCK TAD I [MWORDS CIA JMS I [PRINT /PRINT 4 DIGIT NUMBER OF BLOCKS JMS I [MESSGE /YES--PRINT REST OF MESSAGE MESSG3 JMS I [CRLF /IF WHOLE TAPE IS TO BE COPIED, IT IS NECESSARY TO /COMPUTE THE NUMBER OF BLOCKS ON THE TAPE (NB) /USING THE NUMBER OF WORDS PER BLOCK (WB) /AND THE FORMULA: /OCTAL: NB=[63 6160/(WB+17)]+2 /DECIMAL: NB=[212,080/(WB+15)]+2 TAD NUMBER SZA CLA /COPY WHOLE TAPE? JMP VERFQ /NO-- DCA COUNT /YES--COMPUTE NUMBER OF BLOCKS ON TAPE TAD I [MWORDS CIA TAD (17 DCA COUNT1 /GET NUMBER OF WORDS PER BLOCK+17 TAD (-64 DCA COUNT2 TAD (-6160 SUB, CLL TAD COUNT1 ISZ COUNT /COUNT A BLOCK--TOO MANY? SKP /NO JMP ERR5 /YES--ERROR SZL ISZ COUNT2 JMP SUB CLA CLL TAD COUNT /COUNT IS [63 6160/WB+17]+1 IAC /ADD 1 MORE DCA NUMBER /STORE AS # OF BLOCKS TO TRANSFER JMP I .+1 VERFQ ERR5, CLA JMS I [MESSGE ERROR5 /*ILLEGAL FORMAT UNIT* JMS I [DECODE /PRINT UNIT NUMBER JMS I [CTRLR /WAIT FOR CTRL/R JMS I [CRLF /CARRIAGE RETURN/LINE FEED JMP SETUP /TRY AGAIN /READ FOUR LINES AND FETCH MARK TRACK SKIP4, 0 IOTX5, SDSQ JMP .-1 IOTX6, SDRC JMP I SKIP4 /--RETURN-- PAGE /IS TAPE TO BE VERIFIED? /SET UP DEPENDING ON RESPONSE VERFQ, TAD VERF SZA CLA /VERIFY? JMP YES /YES-- TAD (NOP /NO-- DCA I VERF1A TAD (OUTN DCA I VERF2A JMP CONT YES, TAD (RAR DCA I VERF1A TAD (VERIFY DCA I VERF2A CONT, JMP I .+1 DOIT VERF1A, VERF1 VERF2A, VERF2 /WAIT FOR CTRL/R CTRLR, 0 JMS I [LISTEN /FETCH CHARACTER TAD [-222 SZA CLA /IT IT CTRL/R? JMP .-3 /NO--WAIT FOR ONE JMS I [CRLF /CARRIAGE RETURN/LINE FEED JMP I CTRLR /--RETURN-- REPEAT, DCA COUNT JMS I [CRLF JMS I [QUEST /@REPEAT (YES=1;NO=0):@ MESS11 ACL AND [7 SZA CLA JMP I [CLEAN /YES JMP I [START+4 /NO--RESTART MESSG6, TEXT @FIRST INPUT BLOCK:@ MESSG7, TEXT @FIRST OUTPUT BLOCK:@ MESSG8, TEXT @NUMBER OF BLOCKS TO COPY:@ MESSG9, TEXT @VERIFY OUTPUT (YES=1,NO=0):@ MESS10, TEXT @DONE@ MESS11, TEXT @REPEAT (YES=1,NO=0):@ ERROR1, TEXT @VERIFY ERROR BLOCK @ ERROR2, TEXT @TAPE ERROR BLOCK @ ERROR3, TEXT @SELECT ERROR UNIT @ PAGE /SETUP FOR ACTUAL READ/WRITE/VERIFY OPERATION DOIT, TAD [LIMIT-END /SET UP NUMBER OF BLOCKS JMS DIV1 /IN FIELD 0 BUFFER DCA FLD0 TAD M200 JMS DIV1 /AND IN FIELD N BUFFERS DCA FLDN TAD IBLOCK /SET UP RUNNING COUNTERS AND POINTERS DCA INB /FOR NEXT INPUT BLOCK TAD OBLOCK DCA OUTB /FOR NEXT OUTPUT BLOCK TAD NUMBER DCA NUMB1 /FOR NUMBER OF BLOCKS LEFT TO TRANSFER JMP .+4 ALLDUN, TAD XNUMB SNA CLA /DONE WITH ALL BLOCKS YET? JMP REWIND /YES /READ--- READX, TAD LIST /NO--SET UP POINTER TO OUTPUT UNITS DCA OPOINT TAD OCOUNT CMA DCA OUTNUM TAD INB DCA BLOCKN TAD NUMB1 /SET POINTERS FOR TRANSFER DCA XNUMB TAD NUMB1 DCA NUMB2 /SAVE COUNTER FOR WRITE TAD INPUT /SELECT INPUT UNIT DCA UNIT DCA RW /SET R/W BIT TO READ TAD [END /SET START OF BUFFERS IN CASE DCA BUF0 /THEY WERE CHANGED BY VERIFY DCA BUFN JMS I [READY /FILL THE BUFFERS TAD XNUMB /SAVE THE POINTERS DCA NUMB1 TAD BLOCKN DCA INB OUTN, ISZ OPOINT ISZ OUTNUM /DONE WITH ALL UNITS YET? JMP .+4 /NO--CONTINUE WRITING TAD OHOLD /YES DCA OUTB JMP ALLDUN /READ ANOTHER BUFFER LOAD WRITEX, TAD OUTB DCA OHOLD TAD OHOLD /WRITE DCA BLOCKN /RESET POINTERS TAD OUTB DCA VB /SAVE COUNTER FOR VERIFY TAD NUMB2 DCA XNUMB TAD I OPOINT /SELECT OUTPUT UNIT DCA UNIT CLA CLL CML RAR /AC=4000 DCA RW /SET R/W BIT TO WRITE JMS I [READY TAD BLOCKN DCA OHOLD JMP I .+1 VERF2, VERIFY /SEE HOW MANY BLOCKS WILL FIT INTO BUFFER /ENTER WITH BUFFER SIZE IN AC /EXIT WITH # OF BLOCKS IN AC DIV1, 0 DCA COUNT1 DCA COUNT TAD COUNT1 /TOTAL WORDS DIV2, CLL TAD I [MWORDS /-NUMBER OF WORDS PER BLOCK SNL /RUN OUT OF ROOM? JMP .+3 /YES-- ISZ COUNT /NO--COUNT A BLOCK JMP DIV2 CLA CLL /IGNORE LESS THAN A BLOCK LEFT TAD COUNT VERF1, RAR /DIVIDE BY 2 IF VERIFY (NOP IF NO VERIFY) JMP I DIV1 /--RETURN-- /END OF OPERATION /REWIND TAPES TO INITIAL END ZONE REWIND, TAD OCOUNT CMA DCA COUNT2 /SET NUMBER OF TAPES STILL SPINNING RLIST, CLA CMA TAD LIST DCA OPOINT /SET POINTER TO UNIT LIST TAD OCOUNT IAC CMA DCA OUTNUM /SET NUMBER OF UNITS IN LIST RUNIT, JMS I [PARITY JMS I [CHECK /CHECK TTY FOR CTRL/S OR CTRL/C ISZ OUTNUM /DONE WITH WHOLE LIST YET? SKP CLA /NO JMP RLIST /YES--START THROUGH LIST AGAIN ISZ OPOINT TAD I OPOINT /GET UNIT CODE RTL SZL CLA /STILL SPINNING? JMP RUNIT /NO--TRY NEXT TAPE TAD I OPOINT /YES DCA UNIT TAD [-6 DCA COUNT TAD [RTAB DCA COUNT1 JMS I [INSERT /PUT PROPER IOT'S IN THIS ROUTINE TAD I OPOINT AND [4000 /UNIT/READ TAD [3000 /REVERSE/GO IOTR1, SDLC JMS I [SKIPQ JMS I [SKIPQ /WAIT FOR DRIVE TO GET UP TO SPEED IOTR2, SDSS JMP .-1 IOTR3, SDRC /GET MARK TRACK BITS AND [77 TAD [-22 SZA CLA /END ZONE? JMP RUNIT /NO--NEXT UNIT CLA CLL CML RTR /AC=2000 MQA /UNIT CODE STILL IN MQ FROM INSERT DCA I OPOINT /SET STOPPED BIT TAD I OPOINT AND [6000 IOTR4, SDLC /STOP UNIT M200, 7600 /CLA ISZ COUNT2 /ALL TAPES STOPPED? JMP RUNIT /NO--NEXT UNIT JMS I [MESSGE /YES MESS10 /@DONE@ JMP I [REPEAT PAGE /VERIFICATION ROUTINES VERIFY, TAD VB /SET POINTERS AND COUNTERS FOR TRANSFER DCA BLOCKN TAD NUMB2 DCA XNUMB DCA RW TAD END0 /SET BEGINNINGS OF VERIFY BUFFERS DCA BUF0 TAD (3700 DCA BUFN TAD CDF0 DCA COMP2 JMS I [READY /READ VERIFY BUFFERS FULL TAD COUNT1 /GET # OF BLOCKS IN LAST BUFFER FILLED DCA COUNT3 CMA /SET AUTOINDEX POINTERS TO BUFFERS TAD [END DCA X11 CMA CLL TAD END0 DCA X12 TAD COUNT CMA TAD FIELDS DCA COUNT /SET NUMBER OF FIELDS WHICH WERE FILLED JMS COMP4 /GET NUMBER OF BLOCKS TAD FLD0 CIA DCA COUNT4 /SET COUNTER JMS COMP /COMPARE THE BUFFERS COMP3, TAD COUNT SNA CLA JMP I [OUTN JMS COMP4 /GET NUMBER OF BLOCKS TAD FLDN CIA DCA COUNT4 TAD COMP2 /EACH FIELD------ TAD (10 DCA COMP2 /SET CDF INSTRUCTION PROPERLY CMA CLL /SET AUTOINDEX POINTERS TO BUFFERS DCA X11 TAD (3677 DCA X12 JMS COMP JMP COMP3 /DO THE NEXT FIELD /ENTER WITH AC CLEAR /EXIT TO CALL+1 WITH AC CLEAR IF /NORMAL BUFFER FILL /EXIT TO CALL+2 WITH # OF BLOCKS IN AC IF /LAST BUFFER COMP4, 0 ISZ COUNT /LAST FIELD FILLED? JMP I COMP4 /NO--RETURN-- TAD XNUMB /YES--OUT OF BLOCKS? SZA CLA JMP I COMP4 /NO--RETURN-- TAD COUNT3 /YES--GET ACTUAL # OF BLOCKS ISZ COMP4 /INCREMENT RETURN ADDRESS JMP I COMP4 /--RETURN-- /COMPARE PORTION OF VERIFY ROUTINE COMP, 0 TAD I [MWORDS /SET NUMBER OF WORDS PER BLOCK COUNTER DCA COUNT2 COMP2, HALT /SHOULD CONTAIN CDF N TAD I X11 /GET CORRESPONDING WORDS FROM EACH BUFFER CIA TAD I X12 CDF0, CDF 0 SZA CLA /DO WORDS MATCH? JMP ERR1 /NO--VERIFY ERROR TRY, ISZ COUNT2 /DONE WITH BLOCK? JMP COMP2 /NO--CONTINUE ISZ COUNT4 /DONE WITH ALL BLOCKS? JMP COMP+1 /NO JMP I COMP /YES--RETURN-- ERR1, JMS I [MESSGE ERROR1 /*VERIFY ERROR BLOCK * TAD COUNT4 /GET CURRENT BLOCK NUMBER CIA TAD I (BLOCKS /FROM BLOCK THIS OPERATION STARTED WITH JMS PRINT /PRINT 4 DIGIT BLOCK NUMBER JMS I [MESSGE ERROR6 /*UNIT * JMS I [DECODE /PRINT UNIT NUMBER WAIT, JMS I [LISTEN /WAIT FOR RESPONSE DCA PRINT JMS I [CRLF TAD PRINT TAD [-224 SNA /WAS IT CTRL/T? JMP I [WRITEX /YES--TRY AGAIN TAD [2 SZA CLA /WAS IT CTRL/R? JMP WAIT /NO--WAIT FOR A GOOD RESPONSE JMP TRY /YES--IGNORE AND CONTINUE /PRINT A 4 DIGIT OCTAL NUMBER /ENTER WITH NUMBER IN AC PRINT, 0 DCA I [MESSGE /TEMPORARY STORAGE TAD [-4 DCA I [ANSWER /SET DIGIT COUNTER TAD I [MESSGE RAL DCA I [CRLF FOUR, TAD I [CRLF RAL RTL DCA I [CRLF TAD I [CRLF AND [7 TAD [260 JMS I [TYPE /PRINT ONE DIGIT ISZ I [ANSWER /DONE YET? JMP FOUR /NO JMP I PRINT /YES--RETURN-- /CLEAN UP UNIT TABLES AFTER REWIND CLEAN, TAD LIST DCA OPOINT TAD OCOUNT CMA DCA OUTNUM /SET POINTER AND COUNTER CLEAN1, TAD I OPOINT /GET UNIT CODE AND (4770 /MASK OUT EXTRANEOUS BITS DCA I OPOINT /REPLACE IT ISZ OPOINT ISZ OUTNUM /DONE YET? JMP CLEAN1 /NO JMP I [DOIT /YES--NEXT OPERATION PAGE /FILL ALL N FIELDS ONCE /ENTER WITH AC CLEAR /# OF BLOCKS FOR FIELD 0 IN FLD0 /# OF BLOCKS FOR OTHERS IN FLDN /ADDRESSES OF BUFFERS IN BUF0, BUFN /R/W BIT (0 OR 4000) IN RW READY, 0 TAD [IOTLOC-TABEND-1 DCA COUNT TAD [IOTLOC DCA COUNT1 JMS I [INSERT /PUT PROPER IOT'S IN HANDLER TAD UNIT SPA CLA /EVEN OR ODD UNIT NUMBER? CLL IAC RTL /ODD TAD [ORIGIN /EVEN DCA ENTRY /SET UP ENTRY TO HANDLER TAD RW MQL /STORE UNIT BIT FOR LATER CMA TAD FIELDS /SET COUNTER FOR # OF FIELDS DCA COUNT CLL TAD FLD0 /ADJUST NUMBER OF BLOCKS TO JMS SUB1 /TRANSFER DEPENDING ON NUMBER TAD FLD0 /LEFT TO BE TRANSFERRED JMS SUB2 /RESET FUNCTION WORD TAD BUF0 /SET UP BUFFER POINTERS JMS SUB3 JMS TRANS /TRANSFER DATA--FIELD 0 ZOOM, ISZ COUNT /BEGINNING OF LOOP FOR EACH FIELD ABOVE 0 SKP /DONE YET? JMP I READY /YES--RETURN-- TAD FIELDS CIA CLL TAD COUNT IAC RAL RTL /GET FIELD SETTING READY MQL /STORE IN MQ TAD FUNCTN /GET PREVIOUS FUNCTION WORD AND [4000 /GET R/W BIT MQA /OR IN FIELD SETTING MQL /STORE CLL TAD FLDN /ADJUST NUMBER OF BLOCKS TO TRANSFER JMS SUB1 TAD FLDN JMS SUB2 /AND RESET FUNCTION WORD TAD BUFN JMS SUB3 /SET UP BUFFER POINTERS JMS TRANS /TRANSFER DATA--FIELDS 1-N JMP ZOOM /FILL ANOTHER FIELD SUB1, 0 CIA TAD XNUMB CLL CML /SET LINK=1 SMA /ARE THERE LESS BLOCKS LEFT THAN A FIELD FULL? DCA XNUMB /NO--REDUCE COUNT OF BLOCKS LEFT JMP I SUB1 /YES-TRANSFER BLOCKS LEFT--RETURN-- SUB2, 0 DCA COUNT1 /LINK=1 IF BLOCKS LEFT, 0 IF NONE SNL /DONE WITH ALL BLOCKS YET? DCA XNUMB /YES--BUMP SWITCH TAD COUNT1 /NO BSW MQA /PUT # OF BLOCKS INTO FUNCTION WORD DCA FUNCTN /START REVERSE JMP I SUB2 /--RETURN-- SUB3, 0 DCA BUFADD TAD BLOCKN /SET STARTING BLOCK NUMBER DCA BLOCKS TAD COUNT1 TAD BLOCKN DCA BLOCKN /RESET STARTING BLOCK FOR NEXT TIME JMP I SUB3 /--RETURN-- /CALL TO THE HANDLER TRANS, 0 JMS I [PARITY /CHECK TELETYPE JMS I [CHECK /WAS ^C OR ^S TYPED? JMS I ENTRY FUNCTN, 0 /FUNCTION WORD BUFADD, 0 /BUFFER ADDRESS BLOCKS, 0 /STARTING BLOCK NUMBER JMP ERR /ERROR RETURN JMS I [PARITY /CHECK TELETYPE JMS I [CHECK /WAS ^C OR ^S TYPED? CLA TAD XNUMB SZA CLA /DONE YET? JMP I TRANS /NO--RETURN-- ISZ COUNT JMP I READY /--RETURN-- JMP I READY /--RETURN-- /TRANSFER ERROR HANDLER ERR, SNA CLA /FATAL ERROR? JMP SELECT /NO JMS I [MESSGE /YES ERROR2 /*TAPE ERROR BLOCK * TAD I (BLOCK JMS I [PRINT /PRINT BLOCK NUMBER JMS I [MESSGE ERROR6 /*UNIT * JMS DECODE /PRINT UNIT NUMBER JMS I [CRLF JMP I [REWIND SELECT, JMS ERR3 ISZ FUNCTN /TURN AROUND AND TRY AGAIN JMP FUNCTN-1 ERR3, 0 JMS I [MESSGE ERROR3 /*SELECT ERROR UNIT * JMS DECODE /PRINT UNIT NUMBER JMS CTRLR /WAIT FOR CTRL/R JMP I ERR3 /--RETURN-- /DECODE UNIT NUMBER FOR PRINTING /PRINT UNIT NUMBER BEFORE RETURNING DECODE, 0 CLL TAD UNIT RAL MQL /SAVE ROTATED CODE IN MQ RAL SWP /SAVE EVEN/ODD BIT IN MQ RAR /WORK ON IOT CODE RTR IAC CMA AND [7 MQA /INCLUDE EVEN/ODD BIT TAD [260 /MAKE ASCII DIGIT JMS I [TYPE JMP I DECODE /--RETURN-- PAGE /TD8E DECTAPE HANDLER /SLIGHTLY MODIFIED VERSION OF DEC-E8-UZTA-D /COPYRIGHT 1971 DIGITAL EQUIPMENT CORPORATION / MAYNARD, MASSACHUSETTS 01754 /THE CALLING SEQUENCE IS: / JMS ENTRY / FUNCTION WORD / BUFFER ADDRESS / STARTING BLOCK / ERROR RETURN / NORMAL RETURN (AC CLEAR) /FUNCTION WORD: / BIT 0: 0=READ, 1=WRITE / BITS 1-5: # OF BLOCKS TO BE TRANSFERRED / BITS 6-8: FIELD OF BUFFER AREA / BITS 9-10: UNUSED / BIT 11: 1=START FORWARD, 0=START REVERSE /ERRORS: /THE HANDLER DETECTS TWO TYPES OF ERRORS: /FATAL ERRORS: / PARITY ERROR / TIMING ERROR / TOO GREAT A BLOCK NUMBER /FATAL ERRORS TAKE ERROR RETURN WITH AC=4000 /NON-FATAL ERROR: / SELECT ERROR (IMPROPER UNIT NUMBER OR NO UNIT NUMBER) /NON-FATAL ERROR TAKES ERROR RETURN WITH AC=0 PAGE MFIELD=0 ORIGIN=. DTA0, 0 /ENTRY POINT FROM UNIT 0 CLA CLL /0 TO LINK JMP DTA1X C1000, 1000 DTA1, 0 /UNIT 2 ENTRY CLA CLL CML /1 TO LINK TAD DTA1 DCA DTA0 /PICK UP ARGS AT DTA0 DTA1X, RAR DCA YUNIT /LINK TO UNIT POSITION RDF TAD C6203 /GET DATA FIELD AND SETUP RETURN DCA LEAVE TAD YUNIT /GET FUNCTION WORD IOT4, SDLC /PUT FUNCTION INTO DATA REGISTER TAD I DTA0 IOT1, SDLD CLA TAD MWORDS DCA WCOUNT /STORE MASTER WORD COUNT ISZ DTA0 /TO BUFFER TAD I DTA0 DCA BUFF ISZ DTA0 /TO BLOCK NUMBER TAD I DTA0 DCA BLOCK ISZ DTA0 /POINT TO ERROR EXIT CIF CDF MFIELD /TO ROUTINES DATA FIELD IOT2, SDRD /GET FUNCTION INTO AC CLL RAL AND CM200 /GET # PAGES TO XFER DCA PGCT IOT3, SDRD C374, AND C70 /GET FIELD FOR XFER TAD C6201 /FORM CDF N DCA XFIELD /IF=0 AND DF=N AT XFER. CLA CLL CMA RTL DCA TRYCNT /3 ERROR TRIES IOT5, SDRC AND C100 SZA CLA JMP FATAL-1 IOT6, SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG. DCA I CXFUN TAD WCOUNT DCA I CXWCT IOT7, SDRD /GET MOTION BIT TO LINK CLL RAR JMP GO /AND START THE MOTION. RWCOM, SDST /ANY CHECKSUM ERRORS? SZA CLA /OR CHECKSUM ERRORS? JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS /SET AT RWCOM. GETCHK SETS IT. TAD PGCT /NO ERROR..FINISHED XFER? TAD CM200 SNA JMP EXIT /ALL DONE. GET OUT DCA PGCT /NEW PAGE COUNT ISZ BLOCK /NEXT BLOCK TO XFER TAD WCOUNT /FORM NEXT BUFFER ADDRESS CIA TAD BUFF DCA BUFF CLL CML /FORCES MOTION FORWARD GO, CLA CML RTR /LINK BECOMES MOTION BIT TAD C1000 TAD YUNIT /PUT IN 'GO' AND UNIT # IOT8, SDLC /LOOK FOR BLOCK NO. JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK JMS I CRDQUD CM200, 7600 /COULD HAVE SAVED A LOC. HERE SRCH, SDSS JMP .-1 /WAIT FOR SINGLE LINE FLAG IOT9, SDRC CLL RTL /DIRECTION TO LINK. INFO BITS /ARE SHIFTED. AND C374 /ISOLATE MARK TRACK BITS TAD M110 /IS IT END ZONE? SNA /THE LINK STAYS SAME THRU THIS JMP ENDZ TAD M20 /CHECK FOR BLOCK MARK SZA CLA JMP SRCH IOT10, SDRD /GET THE BLOCK NUMBER SZL /IF WE ARE IN REVERSE, LOOK FOR 3 /BLOCKS BEFORE TARGET BLOCK. THIS /ALLOWS TURNAROUND AND UP TO SPEED. TAD C3 /REVERSE CMA TAD BLOCK CMA /IS IT RIGHT BLOCK? SNA JMP FOUND /YES..HOORAY! M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT? /ABOVE SNA IS SUPERFLUOUS. JMP SRCH /YES ENDZ, SDRC /WE ARE IN THE END ZONE CLL RTL /DIRECTION TO LINK CLA /ARE WE IN REVERSE? JMP GO /YES..TURN US AROUND /IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR TRY3, CLL CLA ISZ TRYCNT JMP GO /TRY 3 TIMES CLL CLA JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN EXIT, ISZ DTA0 CLL CML /AC=0 ON NORMAL RETURN FATAL, TAD YUNIT SDLC /STOP THE UNIT CLA CML RAR LEAVE, HLT JMP I DTA0 /--RETURN-- C6201, 6201 C6203, 6203 CRDQUD, RDQUAD WCOUNT, 0 BUFF, 0 MWORDS, 0 YUNIT, 0 CXFUN, XFUNCT M20, -20 PGCT, 0 CXWCT, XWCT C100, 100 TRYCNT, -3 BLOCK=DTA1 *ORIGIN+170 FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION? JMP GO /WRONG..TURN AROUND TAD YUNIT /PUT UNIT INTO LINK CLL RAL /AC IS NOW 0 C70, 70 /********DON'T MOVE THIS!!!!****** C3, 3 TAD BUFF /GET BUFFER ADDRESS XFIELD, HLT /INTO NEXT PAGE *ORIGIN+200 XUNIT=EQUFUN DCA XBUFF IOT16, SDRC IOT17, SDLC RAR /NOW GET UNIT # DCA XUNIT REVGRD, SDSS JMP REVGRD /LOOK FOR REVERSE GUARD IOT11, SDRC AND K77 TAD CM32 /IS IT REVERSE GUARD? SZA CLA JMP REVGRD /NO.KEEP LOOKING TAD XWCT DCA WORDS /WORD COUNTER TAD XFUNCT /GET FUNCTION READ OR WRITE K7700, SMA CLA JMP READ /NEG. IS WRITE WRITE, SDRC AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS SZA CLA JMP I CFATAL /FATAL ERROR. LINK MUST BE ON JMS RDQUAD /NO ONE EVER USES THIS WORD! C7600, 7600 TAD C1400 TAD XUNIT /INITIATE WRITE MODE IOT12, SDLC CLA CMA JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM CLA CMA DCA CHKSUM WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE! JMS WRQUAD ISZ XBUFF /BUMP CORE POINTER K77, 77 /ABOVE MAY SKIP ISZ WORDS /DONE THIS BLOCK? JMP WRLP /NOT YET..LOOP A WHILE TAD XFUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK? CLL RTR /IF NO, WRITE A 0 WORD SZL CLA JMS WRQUAD /WRITE A WORD OF 0 JMS GETCHK /DO THE CHECK SUM JMS WRQUAD /WRITE FORWARD CHECKSUM JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN JMP I CRWCOM READ, JMS RDQUAD JMS RDQUAD JMS RDQUAD /SKIP CONTROL WORDS AND K77 TAD K7700 /TACK 7700 ONTO CHECKSUM. DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY RDLP, JMS RDQUAD JMS EQUFUN /COMPUT CHECKSUM AS WE GO DCA I XBUFF /IT GETS CONDENSED LATER ISZ XBUFF C300, 300 /PROTECTION ISZ WORDS /DONE THIS OP? JMP RDLP /NO SUCH LUCK TAD XFUNCT /IF OP WAS FOR WDSBLK-1, READ AND CLL RTR /CHECKSUM THE LAST TAPE WORD SNL CLA JMP RDLP2 JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK JMS EQUFUN /CHECKSUM IT RDLP2, JMS RDQUAD /READ CHECKSUM AND K7700 JMS EQUFUN JMS GETCHK /GET SIX BIT CHECKSUM JMP I CRWCOM WRQUAD, 0 /WRITE OUT A 12 BIT WORD JMS EQUFUN /ADD THIS TO CHECKSUM IOT13, SDSQ /SKIP ON QUADLINE FLAG JMP .-1 IOT14, SDLD /LOAD DATA ONTO BUS CLA /SDLD DOESN'T CLEAR AC JMP I WRQUAD RDQUAD, 0 /READ A 12 BIT WORD SDSQ JMP .-1 IOT15, SDRD /READ DATA JMP I RDQUAD EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM CMA DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE CIA /IS ASSOCIATIVE, WE CAN DO IT 12 CLL RAL /BITS AT A TIME AND CONDENSE LATER. TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES: TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B) DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B) TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B)) CMA JMP I EQUFUN GETCHK, 0 /FORM 6 BIT CHECKSUM CLA TAD CHKSUM CMA CLL RTL RTL RTL JMS EQUFUN CLA CLL CML /FORCES LINK ON AT RWCOM TAD CHKSUM AND K7700 JMP I GETCHK CFATAL, FATAL CRWCOM, RWCOM XFUNCT, 0 CM32, -32 C1400, 1400 CHKSUM, 0 WORDS, 0 XBUFF, 0 XWCT, 0 EQUTMP, 0 PAGE / / PARITY, 0 KRB AND [177 TAD [200 JMP I PARITY /IOT TABLES FOR TD8E SUBROUTINE IOTLOC, IOT1 IOT2 IOT3 IOT4 IOT5 IOT6 IOT7 RWCOM IOT8 SRCH IOT9 IOT10 ENDZ FATAL+1 REVGRD IOT11 WRITE IOT12 IOT13 IOT14 RDQUAD+1 IOT15 IOT16 TABEND, IOT17 UNITS=. UNIT01 UNIT23 UNIT45 UNIT67 RTAB, IOTR1 IOTR2 IOTR3 IOTR4 IOTR5 IOTR6 /IOT TABLES FOR WORDS PER BLOCK ROUTINE TABLE1, IOTX1 IOTX2 IOTX3 IOTX4 IOTX5 IOTX6 IOTX7 END1, IOTX8 MESSG4, TEXT @FROM UNIT:@ MESSG5, TEXT @TO UNITS:@ ERROR5, TEXT @ILLEGAL FORMAT UNIT @ ERROR6, TEXT @ UNIT @ ERROR4, TEXT @ILLEGAL RESPONSE@ PAGE /ONCE ONLY CODE END, JMS I (QUEST MESSG2 /@HIGHEST FIELD AVAILABLE:@ ACL AND [7 CIA DCA FIELDS TAD (CDF DCA CDF00 TAD FIELDS SNA /MORE THAN 1 FIELD?? JMP LIM /NO--NO PROBLEM DCA COUNT1 /YES--ARE THEY ALL PRESENT? NEXT, TAD CDF00 TAD (10 DCA CDF00 /SET FOR DATA FIELD CHANGE TAD (HLT CDF00, CDF DCA I (10 /TRY LOCATION 10 TAD I (10 CDF 0 CIA TAD (HLT SNA CLA /IS FIELD THERE? JMP NEXT1 /YES--TRY NEXT ONE JMS I [MESSGE /NO ERROR4 /ILLEGAL RESPONSE JMS I [CRLF /CARRIAGE RETURN/LINE FEED DCA COUNT /CLEAR COUNT JMP END /TRY AGAIN NEXT1, ISZ COUNT1 /DONE YET? JMP NEXT /NO LIM, TAD (LIMIT-END /SET BEGINNING OF VERIFY BUFFER CLL RAR TAD [END DCA END0 TAD (NOP DCA I (START1-1 JMP I (START1 MESSG2, TEXT @HIGHEST FIELD AVAILABLE:@ FIELD 0 *200 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 | /TD8E FORMATTER V4 / / / / / / // / / / / /COPYRIGHT (C) 1971, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /TD8E DECTAPE FORMATTER COPYRIGHT 1971 /DIGITAL EQUIPMENT CORP. /MAYNARD , MASS X1=10 X2=11 /SYMBOL TABLE AUGMENTATION SDSS=6771 SDST=6772 SDSQ=6773 SDLC=6774 SDLD=6775 SDRC=6776 SDRD=6777 *0 0 JMP 1 /HLT PROGRAM GOT INTERRUPTED SOMEHOW 2 3 0 0 /WORKING LOCATIONS *20 W1, 0000 W2, 0000 W3, 0000 W4, 0000 W5, 0000 W6, 0000 BLOCKS, 0000 DTA, 0000 PHASE, 0000 TOTAL, 0000 VAR1, 0000 VAR2, 0000 /CONSTANTS C0017, 0017 C0070, 0070 C0077, 0077 C0007, 0007 C0700, 0700 C203, 0203 C201, 0201 C260, 0260 C261, 0261 C270, 0270 C271, 0271 C277, 0277 C1620, 1620 C7000, 7000 C7700, 7700 C7714, 7714 C7761, 7761 CRCOD, 0215 LETK, 0313 LFCOD, 0212 M2, -2 M3, -3 M6, -6 M7, -7 M14, -14 M144, -144 SPCOD, 0240 BADD, BUFFER-1 BFR, BUFFER COMPAR, COMPRE IT, INIT1 QU1, Q1 QU2, Q2 QU3, Q3 QU4, Q4 MESS, MES STX, START TYOCT, TYCT TYPE, MESAGE TYPIN, TYPN WAIT, STALL WC, 0 MTR, 0 SLRDRC, SRDRC DATRD, 0 M55, -55 M25, -25 M26, -26 M32, -32 M10, -10 M70, -70 M73, -73 M51, -51 M45, -45 M22, -22 M143, -143 M52, -52 M31, -31 M306, -306 CNT, 0 M4, -4 M307, -307 SSDSQT, SDSQT SA3LNS, A3LNS SCEXPC, CEXPC MSK77, 0077 NUD, NUDTA BLK, 0 REVBLK, 0 BCXOR, SBCXOR CHKSUM, 0 SBWORD, 0 /TYPE THE CHARACTER IN THE AC ON THE KEYBOARD PRINTER RSEND, 0000 TLS /LOAD AND PRINT, CLEAR FLAG TSF /WAIT FOR CONFIRMATION JMP .-1 /ENDLESSLY TCF /CLEAR THE FLAG ANYWAY JMP I RSEND /PRINT A "?" ON THE KEYBOARD TYPER QU, .+1 IOF CLA CLL /C(AC)+C(L)=0 TAD C277 /"?" JMS RSEND /TYPE THE CHARACTER JMP I .+1 /RESTART INIT /DECTAPE CONTROL WORDS DT1400, 1400 DT0400, 0400 DT2000, 2000 DT3000, 3000 DT1000, 1000 BINCO, BINCON SELTIM, ZTIM MARKER, ZMKTK BLKERR, ZBLK DATERR, ZDATA CHKERR, ZPAR DOMARK, STMK DBUFPT, 0 /POINTER TO CURRENT POSITION IN DTA LIST *200 /PAGE 1 /TYPE CANNED MESSAGES..... /THANKS TO DIGITAL 8-18-U JMP I .+1 PATCH MESAGE, 0 IOF CLA CMA /SET C(AC)=-1 TAD MESAGE /ADD LOCATION DCA 10 /AUTO INDEX REGISTER TAD I 10 /FETCH FIRST WORD DCA MSRGHT /SAVE IT TAD MSRGHT RTR RTR /ROTATE 6 BITS TO THE RIGHT RTR JMS TYPECH /TYPE IT TAD MSRGHT /GET DATA AGAIN JMS TYPECH /TYPE RIGHT HALF JMP MESAGE+5 /CONTINUE MSRGHT, 0 /TEMPORARY STORAGE TYPECH, 0 /TYPE CHARACTER IN C(AC)6-11 AND C0077 SNA /IS IT END OF MESSAGE? JMP I 10 /YES: EXIT TAD M40 /SUBTRACT 40 SMA /<40? JMP .+3 /NO TAD C340 /YES: ADD 300 JMP MTP /TO CODES <40 TAD M3 /SUBTRACT 3 SZA /IS IT ZERO? JMP .+3 /NO TAD C212 /YES: CODE 43 IS JMP MTP /LINE-FEED (212) TAD M2 /SUBTRACT 2 SZA /IS IT ZERO? JMP .+3 /NO TAD C215 /YES: CODE 45 IS JMP MTP /CARRIAGE RETURN (215) TAD C245 /ADD 200 TO OTHERS >40 MTP, TLS /TRANSMIT CHARACTER TSF /WAIT FOR THE FLAG JMP .-1 /NOT SET YET CLA /SET: CLEAR C(AC) JMP I TYPECH /RETURN /CONSTANTS M40, -40 C340, 340 C212, 212 C215, 215 C245, 245 /ROUTINE WAITS UNTILL A COMPLETE MESSAGE HAS BEEN ENTERED /SIGNIFIED BY A CR. TYPN, 0 IOF KCC /CLEAR AC, KEYBOARD FLAG TAD BADD /GET BUFFER ADDRESS DCA W1 /STORE FOR THE CHARACTER STRING /READ AND RESPOND WITH THE CHARACTER NTYRTN, ISZ W1 /NORMAL RETURN. INCREMENT BUFFER KSF /WAIT FOR KEYBOARD JMP .-1 /FLAG TO RAISE KRB /GOT FLAG, RESET IT, GET CHARACTER JMS RSEND /SEND CHARACTER BACK AND (177 /TAKE CARE OF PARITY TAD (200 DCA I W1 /LOAD CHARACTER INTO BUFFER AREA TAD I W1 /CHECK FOR CTRL C CIA TAD C203 SZA CLA JMP CHKSP /NO- CHECK FOR SPACE 6007 /CAF- CLEAR ALL FLAGS NOP /JUST IN CASE CLA JMP 7605 /IF CHARACTER IS A SPACE, IGNORE IT CHKSP, TAD I W1 /CHARACTER INTO THE AC CIA /SUBTRACT FROM SPACE CODE (240) TAD SPCOD /COMPLETE COMPARISON SNA CLA /WAS IT A SPACE? JMP NTYRTN+1 /YES: DO NOT INCREMENT BUFFER /IF CHARACTER IS A CR, EXIT FROM ROUTINE TAD I W1 /CHARACTER TO AC CIA /SET AC TO SUBTRACT CR (215) TAD CRCOD /COMPLETE COMPARISON SZA CLA /WAS IT CR? JMP NTYRTN /NO: INCREMENT BUFFER + WAIT /CARRIAGE RETURN FOUND, EXIT FROM ROUTINE TAD LFCOD /GIVE KEYBOARD LINE FEED JMS RSEND /EXECUTE LINE FEED CLA CLL /EXIT WITH C(ACC) + AND C(L)=0 IOF JMP I TYPN /RETURN TO CALL /COMPARE A STRING OF CHARACTERS IN "BUFFER" /TO A CHARACTER STRING AFTER A JMS IN ASCII COMPRE, 0 CLA CMA /C(AC)=7777 TAD COMPRE /SUBTRACT 1 FOR INDEX REG 1 DCA 10 /AUTO INDEX 1 SET TO CHA STRING TAD BADD /AUTO INDEX 2 SET TO BUFFER-1 DCA 11 /LOAD X2 /COMPARE CHARACTERS TILL ONE DOESN'T COMPARE OR TILL /A 0 IS FOUND IN X1. IF OK, RETURN TO TWO PLUS THE /ZERO, IF BAD ONE PLUS TAD I X1 /CHARACTER FROM PROGRAM CIA /TO SUBTRACT FROM TAD I X2 /CHARACTER IN BUFFER SZA CLA /COMPARE? JMP CERR /NO:RESYNC FOR NON COMPARE EXIT TAD I X1 /YES: CHECK FOR GOOD EXIT SZA /IF 0, EXIT GOOD JMP .-6 /NO: TEST NEXT CHAACTER ISZ X1 /+1 TO X1(TOTAL 2 FROM THE 0) JMP I X1 /+1 TO X1, EXIT /ERROR FOUND. RESYNC AND EXIT NO COMPARE CERR, TAD I X1 /CHARACTER FROM PROGRAM SZA CLA /IS THIS EXIT KEY? (0000) JMP .-2 /NO: GET NEXT JMP I X1 /YES: EXIT, NOT COMPARE *400 /VARIOUS ERROR MESSAGES /"NOT DECIMAL" Q1, JMS I TYPE 1617 /NO 2440 /T 0405 /DE 0311 /CI 1501 /MA 1400 /L JMP QUX /"TO MANY WORDS" Q2, JMS I TYPE 2417 /TO 1740 /O 1501 /MA 1631 /NY 4027 / W 1722 /OR 0423 /DS 0000 /00 JMP QUX /"TO MANY BLOCKS" Q3, JMS I TYPE 2417 /TO 1740 /O 1501 /MA 1631 /NY 4002 / B 1417 /LO 0313 /CK 2300 /S0 JMP QUX /"NOT DIVISIBLE BY 3" Q4, JMS I TYPE 1617 /NO 2440 /T 0411 /DI 2611 /VI 2311 /SI 0214 /BL 0540 /E 0231 /BY 4063 / 3 0000 /00 QUX, JMS I TYPE 4345 /CR+LF 0000 /END JMP I .+1 INIT /THE CODING BELOW CREATES THE BLOCK NUMBER /CONVERSION PRIOR TO THE TAPE WRITE. MES, 0 DCA W4 /SAVE WORD CLL TAD W4 CMA RTR RTR AND C7000 DCA V1 TAD W4 CMA RTL RAL AND C0700 DCA V2 TAD W4 CMA RTR RAR AND C0070 DCA V3 TAD W4 CMA RTL RTL AND C0007 TAD V1 TAD V2 TAD V3 JMP I MES V1, 0000 V2, 0000 7777 7700 0000 V3, 0000 0000 PATCH, CLA TAD .+4 DCA 1 JMP I .+1 START HLT /TYPE ONE FOUR CHARACTER OCTAL WORD GIVEN TO THE /ROUTINE VIA C(ACC). C(ACC)=0 ON EXIT TYCT, 0 DCA TW1 /STORE WORD GIVEN TAD TW1 /TO C(ACC) AGAIN RTR RTR /6 BITS RIGHT RTR DCA TYCT1+2 /SAVE ROTATED VALUE, 1ST TWO TAD TYCT1+2 /TO C(ACC) AGAIN AND C0007 /ISOLATE SECOND CHARACTER TAD C6060 /CONVERT TO ASCII DCA TYCT1+1 /STORE AS FIRST PARTIAL 2 TAD TYCT1+2 /ROTATED VALUE STORED ABOVE RTL RAL /3 BITS LEFT AND C0700 /ISOLATE FIRST CHARACTER TAD TYCT1+1 /CONVERT 1ST TO ASCII DCA TYCT1+1 /1ST AND 2ND CHARACTERS READY TAD TW1 /ORIGIONAL WORD AND C0007 /ISOLATE 4TH CHARACTER TAD C6060 /CONVERT 4 TH TO ASCII DCA TYCT1+2 /STORE 4TH FOR A MOMENT TAD TW1 /ORIGIONAL WORD RTL RAL /POSITION IT 3RD CHARACTER AND C0700 /ISOLATE 3RD CHARACTER TAD TYCT1+2 /CONVERT TO ASCII DCA TYCT1+2 /CONVERSION COMPLETE TYCT1, JMS I TYPE /TYPE THE FOUR CHARACTERS 0 /FIRST 2 0 /SECOND 2 0 /KILL KEY JMP I TYCT /EXIT FROM ROUTINE /SOME CONSTANTS FOR THE ROUTINE TW1, 0000 C6060, 6060 *600 STALL, 0 CLA TAD I 12 /WORD TO BE WRITTEN SDSQ /WAIT FOR QUADLINE FLAG JMP .-1 SDLD /LOAD DATA REGISTERS SDST /CHECK FOR TIMING ERROR SKP JMS I SELTIM /TIMING ERROR CLA JMP I STALL /GO GET NEXT WORD /WAIT TILL WORD COUNT REGISTER GOES TO ZERO /BLOCK NUMBER ERROR ZBLK, 0 CLA TAD DTA SDLC /STOP MOVEMENT OF TAPE JMS I TYPE 2003 /PC 4000 /END CLA CMA TAD ZBLK JMS I TYOCT JMS I TYPE 4040 /DOUBLE SPACE 0214 /BL 1703 /OC 1340 /K 1625 /NU 1502 /MB 0522 /ER 4000 /END JMP ZCOM /DATA ERRORS ZDATA, 0 CLA TAD DTA SDLC /STOP THE TAPE JMS I TYPE 2003 4000 CLA CMA TAD ZDATA JMS I TYOCT JMS I TYPE 4040 0401 /DA 2401 /TA 4000 /END JMP ZCOM /MARK TRACK ERROR ZMKTK, 0 CLA TAD DTA SDLC /STOP THE TAPE JMS I TYPE 2003 /PC 4000 /END CLA CMA TAD ZMKTK JMS I TYOCT JMS I TYPE 4040 1501 /MA 2213 /RK 4024 / T 2201 /RA 0313 /CK 4000 / 0 JMP ZCOM /PARITY ERROR ZPAR, 0 CLA TAD DTA SDLC /STOP THE TAPE JMS I TYPE 2003 /PC 4000 /END CLA CMA TAD ZPAR JMS I TYOCT JMS I TYPE 4040 0310 /CH 0503 /EC 1323 /KS 2515 /UM 4000 /0 JMP ZCOM /TIMING ERROR ZTIM, 0 CLA TAD DTA SDLC /STOP THE TAPE JMS I TYPE 2003 4000 CLA CMA TAD ZTIM JMS I TYOCT JMS I TYPE 4040 2411 /TI 1511 /MI 1607 /NG 4000 / 0 /TYPE "ERROR PHASE X" ZCOM, TAD PHASE /WHAT PHASE OF OPERATION TAD PFORM /WAS THE MACHINE IN DCA TFORM /WHEN ERROR OCCURED JMS I TYPE 0522 /ER 2217 /RO 2240 /R 2010 /PH 0123 /AS 0540 /E TFORM, 4060 / X 4543 /CR+LF 0000 /END JMP I .+1 RETRY PFORM, 4060 /HERE STARTS THIS PROGRAM. IT WILL ASK THE /OPERATOR FOR DRIVE NUMBERS, THEN ASK HIM FOR /A DIRECTION ON WHAT TO DO WITH THE DRIVES. /THE SEQUENCE FOR MARKING A TAPE WOULD APPEAR AS: /UNIT? (0 OR 1 OR 0 1) /FORMAT? (MARK 1215) /2277 WORDS, 0256 BLOCKS.OK? YES OR NO /(YES) /THAT DATA IN PARENTHESIS IS TYPED BY THE OPERATOR /(HE DOESN'T TYPE THE PARENTHESIS) /IF HE HAD ANSWERED NO, "FORMAT?" WOULD BE TYPED OUT. /IF THE DRIVE WAS WRONG, HE WOULD TYPE RESTART. /IF HE HAD TYPED "MARK" IN RESPONSE TO "FORMAT?" THE /TAPE WOULD BE MARKED WITH THE STANDARD PDP-8 CONFIGURATION. /IF HE HAD TYPED "MARK 384" THE TAPE WOULD /BE MARKED WITH THE STANDARD PDP-10 CONFIGURATION /NOTE: THE WORD AND BLOCK NUMBERS ARE TYPED IN OCTAL /IF A MISTAKE OCCURS ON THE OPERATORS PART (WITH REFERANCE /TO BLOCK + WORD SIZE) HE WILL BE TOLD ABOUT IT *1000 /MAKE A CALL FOR THE DECTAPE NUMBERS TO BE /WORKED. STAR0, JMS I TYPE /TYPE VERSION NUMBER 4543 /CR+LF 4300 /LF+0 JMS I TYPE TEXT /TDFMT V4A/ START, JMS I TYPE /SET UP TYPER 4543 /CR+LF 4300 /LF+END TYQU, JMS I TYPE /"UNIT?" 2516 /UN 1124 /IT 7740 /? 0000 /END /WAIT FOR A REPLY JMS I TYPIN /GET NUMBERS TAD BADD /INITIALIZE POINTER (BFR) IAC /(BADD=BUFFER-1, SO BUMP THE AC) DCA BFR /TO START OF INPUT BUFFER DCA DCTR /INITIALIZE DTA COUNTER TO 0 DCA CRFLAG /CLEAR FLAG SO CR NOT ACCEPTIBLE CRCHK, TAD CRCOD /GET CODE FOR CAR. RETN CIA /NEGATE IT TAD I BFR /SEE IF NEXT CHAR. IN SNA /BUFFER IS CAR. RETN. JMP OKCR /YES: SEE IF C.R. LEGAL HERE DCA CRFLAG /NO: SO C.R. IS LEGAL NOW VALCHK, TAD C260 /SEE IF # IS LESS THAN CIA /ASCII 0 (260) TAD I BFR /SUBTRACT BUFFER DATA SPA CLA /IS IT LESS THAN ASII 0? JMP TYQU /YES: TELL OUTSIDE WORLD TAD C261 /NO: SEE IF GREATER THAN CMA /ASC II 1 (261) TAD I BFR /SUBTRACT BUFFER DATA SMA CLA /GREATER THAN ASCII 7? JMP TYQU /YES: TELL OUTSIDE WORLD TAD I BFR /NO: ACCEPT BUFFER RTR AND C7000 /ISOLATE DTA JMS REPEAT /GO CHECK FOR REPEATED DTA AND STORE # ISZ BFR /INCREMENT INPUT BUF. PTR. JMP CRCHK /GO LOOK AT NEXT CHAR. /THIS SECTION CHECKS TO SEE IF THERE HAS BEEN ANY /VALID INPUT ONCE A CARRIAGE RETURN IS SEEN OKCR, CLA /CLEAR AC TAD CRFLAG /LOAD CR FLAG; 0 MEANS NO GOOD SNA CLA JMP START /0: NO VALID INPUT; RESTART TAD DCTR /NOT 0: SO HAVE VALID INPUT TAD DBUFAD /CALCULATE END OF DTA LIST +1 DCA DBUFPT /STORE IT IN BUFFER POINTER, THEN CMA /COMPLEMENT THE AC AND DCA I DBUFPT /TERMINATE DTA LIST WITH 7777 INIT1, CLA /CLEAR AC IF COME THRU LOC IT TAD DBUFAD /AND RESET LIST POINTER DCA DBUFPT /TO START OF LIST JMS I GETDTA /GO GET A DTA NUMBER /INFORM THE OPERATOR THAT THE PROGRAM IS SET TO START /TYPE "FORMAT" AND WAIT FOR THE REPLY INIT, JMS I TYPE /MESSAGE OUT 0617 /FO 2215 /RM 0124 /AT 7740 /? 0000 /END JMS I TYPIN /WAIT FOR A REPLY JMS I COMPAR /DID HE TYPE "MARK"? 0315 /M 0301 /A 0322 /R 0313 /K 0000 /END JMP .+3 JMP I .+1 MARK /TO MARK A TAPE /SEE IF HE TYPED "RDR" (READ AND TYPE FIRST 12 /BLOCK NUMBERS IN REVERSE). JMS I COMPAR 0322 /R 0304 /D 0322 /R 0000 /0 JMP .+3 JMP I .+1 RDR /TYPE BLOCKS /SEE IF HE TYPED "RDF" (READ AND TYPE FIRST 12 /BLOCK NUMBERS FORWARD). JMS I COMPAR 0322 /R 0304 /D 0306 /F 0000 /0 JMP .+3 JMP I .+1 RDFA /TYPE BLOCKS /SEE IF HE TYPED "SAME" (MEANING MARK A TAPE /USING THE SAME CONSTANTS AS BEFORE). JMS I COMPAR 0323 /S 0301 /A 0315 /M 0305 /E 0000 /0 JMP .+3 JMP I .+1 SWCHK /TO MARK AS BEFORE /SEE IF HE TYPED "RESTART" JMS I COMPAR 0322 /R 0305 /E 0323 /S 0324 /T 0301 /A 0322 /R 0324 /T 0000 /0 JMS QU /MUST BE NONSENSE JMP START /START ALL OVER GETDTA, NUDTA /POINTER TO ROUTINE TO SWITCH UNITS CRFLAG, 0 /=0, CR NO GOOD; NOT 0, CR IS OK *1200 /MARK WAS TYPED IN, IF W1-1 IS NOT A "K",ASSUME THAT /A NUMBER WAS TYPED IN, AND VERIFY THIS. IF W1-1 IS /A "K", ASSUME STANDARD FORMAT.(W1=LAST ENTRY INTO THE BUFFER) MARK, TAD I BINCO /ADDRESS OF FIRST BINARY DCA W5 /CONSTANT FOR DEC TO BIN DCA TOTAL /WILL BE BINARY EQUIVILANT /SAVE C(X1) FOR DECREMENT THROUGH BUFFER DNC, CLA CMA /DECREMENT BUFFER ADDRESS TAD W1 /ADDRESS BY 1 DCA W1 /W1=SWEEP ADDRESS /LOOK FOR END OF PROCESSING BY LOOKING FOR A "K" IN BUFFER TAD LETK /LETTER ASCII "K" CIA /SUBTRACT FROM CHARACTER TAD I W1 /IN BUFFER SNA CLA /EQUAL? JMP DIV3 /YES: SEE IF DIVISIBLE BY 3 /VERIFY THIS CHARACTER AS BEING OF DECIMAL ORIGIN TAD C260 /ASCII FOR 0 CIA /TO SEE IF CHARACTER TAD I W1 /IS LESS THAN 260 SPA CLA /IS IT? JMP I QU1 /YES: NOT DECIMAL CHARACTER TAD C271 /ASCII FOR 9 CMA /TO SEE IF GREATER THAN TAD I W1 /9 SMA CLA /IS IT? JMP I QU1 /NOT A DECIMAL CHARACTER /CHARACTER IS DECIMAL. NOW CONVERT IT TO BINARY /REMEMBER POSITION OF CHARACTER IN BUFFER MAY BE /10,100,1000. TAD I W1 /ISOLATE THE NUMBER AND C0017 /FOR PROPER CONVERSION SNA /IF 0, NO BINARY CONVERSION NEEDED JMP IBS /YES: 0: INCREMENT BINARY CONVERSION /NOT 0, SET UP CONVERSION LOOP CLL CIA /NUMBER OF ADDITIONS DCA W4 /TO NEGATIVE FOR ISZ TAD I W5 /BINARY POSITION TO C(ACC) TAD TOTAL /ADD TO PRESENT TOTAL SZL /CHECK ON TO MANY WORDS JMP I QU2 /TO MANY WORDS CALLED FOR DCA TOTAL /KEEP RUNNING SUM ISZ W4 /LAST ADDITION? JMP .-6 /NO: ADD AGAIN /FINAL ADDITION FOR THIS POSITION COMPLETED IBS, ISZ W5 /NEXT POSITION JMP DNC /DO NEXT CHARACTER /LAST CHARACTER COMPLETED. SEE IF DIVISIBLE BY 3 /IF NOT A NORMAL INPUT DIV3, TAD TOTAL /GET TOTAL WORDS SNA /IF TOTAL 0, NORMAL INPUT TAD C201 /129 OCT. THIS TEST REDUNDANT TAD C0017 /ADD CONSTANT 15 TO TOTAL DCA TOTAL /FOR FUTURE CONSIDERATIONS DCA VAR1 /# OF WORDS/3 FOR MARK TRACK WRITING TAD TOTAL /RESTORE IN THE ACC CLL /TO DIVIDE BY 3, LINK KEEPS OVERFLOW TAD M3 /SUBTRACT 3 ISZ VAR1 /ON EACH DIVISION, KEEP RUNNING SUM SZA /IF AC = 0,NO REMAINDER SNL /WHEN LINC GOES TO 0, DIVISION ENDED SKP /NOW SEE IF IT DIVIDED EVENLY JMP .-6 /SUBTRACT 3 MORE SZA CLA /IF 0,OK. OTHERWISE ERROR JMP I QU4 /NOT DIVISIBLE BY 3 /CORRECT "VAR1" ( THE NUMBER OF WORDS/3) FOR THE +15 /ADDED JUST ABOVE AND AN INHERANT +2 DUE TO MARK TRACK /CONFIGURATION TO BE WRITTEN. TAD M7 /SUBTRACT 7 FROM PHONY SETUP TAD VAR1 /GIVING THE NUMBER OF TIMES CIA /TO BE USED LATER IN A ISZ DCA VAR1 /DATA MARK WILL BE WRITTEN /COMPUTE A VALUE FOR TOTAL NUMBER OF BLOCKS /RECORD SIZE + 15 INTO 636160 OCT. TAD C7714 /EXTENDED 64 VALUE. SETS AC#2 DCA W1 /SET FOR 640000 JMS I FORM10 /PATCH TO CHECK FOR STD.10 FORMAT TAD C1620 /VERNIER ADJUSTMENT FOR FORMULA CLL /ACC#2 CARRY FUNCTION TAD TOTAL /WORD COUNT ISZ BLOCKS /+1 TO BLOCK COUNT SKP JMP I QU3 /TO MANY BLOCKS CALLED FOR SNL /CARRY INTO ACC#2? JMP .-5 /NO: CONTINUE COUNT ISZ W1 /YES: FULLY DIVIDED? JMP .-10 /NO: CONTINUE PROCESS CLA CLL /C(ACC)+ C(L)=0 F10RTN, TAD BLOCKS /FOR MARK TRACK (COME HERE FR F10PAT IF 10 FRMT) CMA /WRITING DCA VAR2 /SEE MARK WRITE /VALUES FOR BLOCK AND RECORD SIZE HAVE BEEN /COMPUTED. TELL OUTSIDE WORLD AND GET THE OK. TAD TOTAL /SUBTRACT 15 FROM TOTAL TAD C7761 /WORDS FOOLING OPERATOR DCA TOTAL /CORRECTED FOR TAPE WRITING TAD TOTAL /FOR OCTAL TYPEOUT JMS I TYOCT /TYPE OCTAL WORDS JMS I TYPE /TYPE MESSAGE 4027 / W 1722 /OR 0423 /DS 5400 /, END TAD BLOCKS /TYPE OUT BLOCK #S IAC /TO FOOL THE OPERATOR JMS I TYOCT /IN OCTAL JMS I TYPE /TYPE MESSAGES 4002 / B 1417 /LO 0313 /CK 2356 /S. 1713 /OK 7733 /?( 3105 /YE 2340 /S 1722 /OR 4016 / N 1735 /O) 4543 /CR+LF 0000 /END JMS I TYPIN /WAIT FOR REPLY /SEE IF A YES OR NO ANSWER WAS GIVEN JMS I COMPAR 0331 /Y 0305 /E 0323 /S 0000 /END JMP I IT JMP I .+1 SWCHK FORM10, F10PAT *1400 /SET THE TAPE INTO MOTION. ALL VARIABLES ARE SET. /WRITE TIMING AND MARK TRACK STMK, CLA DCA PHASE TAD DT1400 /FWD, WRITE, GO TAD DTA /GET UNIT NUMBER SDLC /LOAD COMMAND REGISTER TAD VAR2 /TO MAKE A RESTART FOR THE SAME DCA W6 /OPTION POSSIBLE /WRITE ABOUT 10 FEET OF END ZONE DCA W1 CEZ, TAD REZ /ADDRESS OF DATA JMS SETUP ISZ W1 JMP CEZ /NOT END FOOTAGE TAD M144 /OK WRITE INTERBLOCK SYNC DCA W1 JMS INBLSY ISZ W1 JMP .-2 JMP WDZ /WRITE INTERBLOCK SYNC INBLSY, 0 TAD VAR1 /RESET THE WORDS DCA W5 TAD IBZ /ADDRESS OF DATA JMS SETUP /GO OUT AND WRITE 1 JMP I INBLSY /GO DO AGAIN /WRITE FORWARD BLOCKMARK AND REVERSE GUARD WDZ, TAD FBM /ADDRESS OF PATTERN JMS SETUP /WRITE LOCKMARK, REVERSE CHECKSUM, REV FINAL, REV PREFINAL LRCFP, TAD WLMRF JMS SETUP1 /WRITE THE DATA TRACK DTRK, TAD DZ /ADDRESS OF PATTERN JMS SETUP ISZ W5 JMP DTRK /NOW WRITE DATA MARK TRACK AGAIN /WRITE PREFINAL, FINAL, CHECKSUM, AND REVERSE LOCK PFCRC, TAD FEZ /ADDRESS OF DATA JMS SETUP1 /WRITE GUARD REVERSE BLOCK GRB, TAD GRZ JMS SETUP /THIS COMPLETES 1 BLOCK, GO BACK AND WRITE THE REST JMS INBLSY /WRITE INTERBLOCK SYNC ISZ W6 /TOTAL NUMBER OF BLOCKS JMP WDZ /WRITTEN? NO: /ALL DATA BLOCKS WRITTEN NOW WRITE BUFFER ZONE OF INTERBLOCK SYNC TAD M143 /198 EXPAND CODES AT END OF BLOCKS DCA W1 JMS INBLSY ISZ W1 JMP .-2 /FINISHED BLOCK WRITTING, WRITE ANOTHER 10(1) OF END ZONES DCA W1 WEZF, TAD EZM JMS SETUP ISZ W1 JMP WEZF SDST SKP CLA JMS I SELTIM /TIMING ERROR TAD C1 DCA PHASE JMP I .+1 MWTM SETUP, 0 DCA 12 /WORD TO BE WRITTEN ON MARK TRACK TAD M3 DCA WC JMS I WAIT ISZ WC JMP .-2 JMP I SETUP SETUP1, 0 DCA 12 TAD M6 DCA WC JMS I WAIT ISZ WC JMP .-2 JMP I SETUP1 /THESE ARE THE DATA CONFIGURATIONS FOR THE MARK TRACK /REVERSE END ZONE REZ, . 4044 /ON TAPE AS 5555 (OCT) 0440 4404 /INTERBLOCK SYNC IBZ, . 0404 /ON TAPE AS 2525 (OCT) 0404 0404 /FORWARD BLOCK MARK AND REVERSE GUARD FBM, . 0404 /ON TAPE AS 2632 (OCT) 4004 4040 /LOCK MARK, REVERSE CHECKSUM, REVERSE FINAL /AND REVERSE PREFINAL WLMRF, . 0040 /ON TAPE AS 10101010 (OCT) 0000 4000 0040 0000 4000 /DATA MARK DZ, . 4440 /ON TAPE AS 7070 (OCT) 0044 4000 /PREFINAL, FINAL, FWD CHECKSUM, AND REVERSE LOCK FEZ, . 4440 /ON TAPE AS 73737373 (OCT) 4444 4044 4440 4444 4044 /FORWARD GUARD AND REVERSE BLOCK NUMBER GRZ, . 4040 /ON TAPE AS 5145 (OCT) 0440 0404 /FORWARD END ZONE EZM, . 0400 /ON TAPE AS 2222 (OCT) 4004 0040 /SUBROUTINE TO SEE IF USER TYPED MARK 384 /TO SPECIFY STANDARD PDP-10 FORMAT F10PAT, 0 DCA BLOCKS /CLEAR LOC. BLOCKS IN CASE NOT 10-FORMAT TAD TOTAL /AND GET NUMBER TYPED BY USER TAD M617 /WAS IT 384? SZA CLA JMP I F10PAT /NO-RETURN DCA W1 /YES-CLEAR W1 FOR WAIT LOOP TAD C1101 /AND ADJUST BLOCK TOTAL FOR DCA BLOCKS /1102(OCTAL) BLOCKS. JMP I .+1 F10BAK, F10RTN M617, -617 C1101, 1101 C1, 0001 *1600 /THE MARK TRACK HAS BEEN WRITTEN, AND TAPE IS /MOVING FORWARD IN THE FORWARD END ZONE. STOP /THE TAPE AND SEE IF THERE ARE ANY TAPES LEFT TO /MARK--IF SO GO DO THEM, ELSE TELL OPERATOR TO THROW THE /"OFF/WTM" SWITCH TO "OFF" /HE WILL THEN CONTINUE AFTER THIS ACTION /KILL WRITE,STOP TAPE MWTM, CLA TAD DTA /UNIT SDLC JMS NUDTA JMP I DOMARK /MESSAGE TO THE OPERATOR OFF, JMS I TYPE 2305 /SE 2440 /T 2327 /SW 1124 /IT 0310 /CH 4024 /T 1740 /O 1706 /OF 0600 /F JMS I TYPIN /WAIT FOR CR JMP I .+1 SWOFF /CHECK TO MAKE SURE THAT SWITCH IS OFF /REVERSE TAPE AND READ MARK TRACK PSER, TAD DT3000 /REVERSE GO TAD DTA /UNIT SDLC /LOAD COMMAND REGISTER DCA W1 /STALL ROUTINE TO GET UP TO SPEED SDSQ JMP .-1 SDRC ISZ W1 JMP .-4 SDSQ /SKIP ON QUAD LINE IF SET AFTER WAIT ROUTINE SKP JMP .+3 /FLAG WAS SET SDSS /READ IN A LINE OF TAPE JMP .-1 SDRC /READ THE COMMAND REGISTER SDST /CHECK FOR A TIMING ERROR SKP JMS I SELTIM /TIMING ERROR AND MSK77 /CHECK TO SEE IF TAPE IS STILL IN END ZONE TAD M55 SZA CLA JMP .-11 /NOT A 55 YET JMS I SSDSQT /YES,READ IN SOME MORE TAD M55 /IS IT END ZONE SNA CLA JMP .-3 /STILL IN END ZONE TAD MTR /GET THE MARK TRACK TAD M25 /IS IT EXPAND CODE SZA CLA JMS I SCEXPC /NOT YET,CHECK FOR A 52,AND ADVANCE 3 LINES CLA /YES IT IS EXPAND CODE TAD M306 /SET UP FOR 198 EXPAND CODES DCA CNT JMS I SSDSQT /THE TAPE SHOULD BE IN SYNC NOW TAD M25 /READ THE REST OF EXPAND CODE SZA CLA JMS I MARKER /MARK TRACK ERROR ISZ CNT /INCREMENT COUNTER JMP .-5 TAD VAR2 /NUMBER OF BLOCKS DCA W6 RSTBLK, JMS I SSDSQT /START OF A STANDARD BLOCK TAD M25 /FIRST EXPAND CODE AT BEGINNING SZA CLA /OF BLOCK JMS I MARKER /MARK TRACK ERROR JMS I SSDSQT /READ MARK BLOCK NUMBER TAD M26 SZA CLA JMS I MARKER /MARK TRACK ERROR JMS I SSDSQT /READ MARK GUARD TAD M32 SZA CLA JMS I MARKER /MARK TRACK ERROR TAD M4 DCA CNT JMS I SSDSQT /READ L,CK,F,PF TAD M10 SZA CLA JMS I MARKER /MARK TRACK ERROR ISZ CNT JMP .-5 CLA CLL TAD VAR1 RAL DCA W5 /NUMBER OF DATA MARKS JMS I SSDSQT /READ DATA MARKS TAD M70 SZA CLA JMS I MARKER /MARK TRACK ERROR ISZ W5 /COUNT FOR NUMBER OF BLOCKS JMP .-5 TAD M4 DCA CNT JMS I SSDSQT /READ PF,F,CK,L TAD M73 SZA CLA JMS I MARKER /MARK TRACK ERROR ISZ CNT JMP .-5 JMS I SSDSQT /READ REVERSE GUARD TAD M51 SZA CLA JMS I MARKER JMS I SSDSQT /READ BLOCK NUMBER TAD M45 SZA CLA JMS I MARKER /MARK TRACK ERROR JMS I SSDSQT /READ EXPAND CODE TAD M25 SZA CLA JMS I MARKER /END OF ONE BLOCK,MARK TRACK ERROR ISZ W6 /FINISHED ALL BLOCKS JMP RSTBLK /NO:DO OTHER BLOCKS TAD M307 /SET UP FOR INTERBLOCK SYNC AT END OF TAPE DCA CNT JMS I SSDSQT /CHECK FOR 199 EXPAND CODES TAD M25 SZA CLA JMS I MARKER /MARK TRACK ERROR ISZ CNT JMP .-5 JMS I SSDSQT TAD M22 SZA CLA JMS I MARKER TAD DTA SDLC JMP I .+1 WDBLKN, DBLKN /GO OUT TO WRITE DATA AND BLOCK NUMBERS FORWARD *2000 DBLKN, TAD C2 DCA PHASE TAD VAR2 /NUMBER OF BLOCKS DCA W6 DCA BLK /INITIAL BLOCK IS 0 TAD BLK JMS I MESS /COMPUTE THE COMP OBVERSE OF REV BLK DCA REVBLK SDLD TAD DT1400 /FORWARD,WRITE,GO TAD DTA /UNIT SDLC /LOAD THE COMMAND REGISTER SDRC /CHECK TO MAKE SURE WRITE IS SET RTL RAL SMA CLA JMS WLO /WRITE FAILED TO SET TAD M6 DCA CNT SDSQ /ROUTINE TO GET UP TO SPEED JMP .-1 SDLD ISZ CNT JMP .-4 SDLD SDST SKP JMS I SELTIM /TIMING ERROR LINE, SDSS /WRITE ALL ZEROES TO THE FIRST BLOCK JMP .-1 SDLD /LOAD THE DATA BUFFER SDRC SDST SKP JMS I SELTIM /TIMING ERROR AND MSK77 DCA MTR TAD MTR TAD M26 SZA CLA JMP LINE SDLD SDST SKP JMS I SELTIM /TIMING ERROR JMP WDOBLK /GO AND WRITE REVERSE GUARD WDBLK, CLA CLL /BEGINNING OF BLOCK,WRITE DATA AND BLOCK NUMBER JMS W4L /WRITE EIGHT LINES JMS W4L /END OF EXPAND CODE,BEGINNING OF BLK NUMBER TAD BLK /GET FORWARD BLOCK NUMBER JMS W4L /WRITE IT CLA JMS W4L /WRITE FIRST WORD OF REV GUARD WDOBLK, CLA JMS W4L /SECOND WORD OF REVERSE GUARD JMS W4L JMS W4L /FIRST WORD OF REVERSE CHECKSUM WDATA, TAD TOTAL /NUMBER OF DATA WORDS TO BE WRITTEN CIA DCA W5 /SET UP COUNTER JMS W4L ISZ W5 /INCREMENT COUNTER JMP .-2 CLA CLL TAD MSK77 /COME BACK TO WRITE LAST WORD AND CHECKSUM JMS W4L CLA JMS W4L /FINISH CHECKSUM JMS W4L /FIRST WORD OF REVERSE LOCK JMS W4L /LAST WORD OF RL. AND HALF OF GUARD JMS W4L /REST OF GUARD TAD REVBLK /GET REVERSE BLOCK NUMBER JMS W4L CLA CMA JMS W4L /END OF BLOCK NUMBER AND HALF OF EXPAND CODE JMS W4L /END OF EXPAND CODE ISZ BLK CLA TAD BLK JMS I MESS /COMPUTE NEW BLK NUMBER DCA REVBLK SDST SKP JMS I SELTIM /TIMING ERROR ISZ W6 /IS IT DONE WRITING BLK AND DATA JMP WDBLK /NO SDSQ JMP .-1 SDRD CLA TAD DT1000 /SEARCH FOR END ZONE TAD DTA /GET UNIT SDLC /LOAD THE COMMAND REG SDSS JMP .-1 SDRC AND MSK77 TAD M22 SZA CLA JMP .-6 JMP I .+1 DBLOCK W4L, 0 SDSQ JMP .-1 /SKIP ON QUAD LINE FLAG SDLD /LOAD THE DATA BUFFER SDST /CHECK FOR A TIMING ERROR SKP JMS I SELTIM /TIMING ERROR JMP I W4L C2, 0002 WLO, 0 TAD DTA /STOP THE TAPE SDLC /LOAD THE COMMAND REGISTER JMS I TYPE 2003 /PC 4000 /END CLA CMA TAD WLO JMS I TYOCT JMS I TYPE 4040 2722 /WR 1124 /IT 0540 /E 0000 /END JMP I .+1 ZCOM *2200 BLCSD, TAD C4 DCA PHASE CLA CLL TAD VAR2 DCA W6 /SET UP FOR THE NUMBER OF BLOCKS DCA BLK /SET BLK TO 0 TAD DT1000 /FORWARD READ TAD DTA /UNIT SDLC /LOAD THE COMMAND REG TAD BLK JMS I MESS /CALCULATE THE COMPLEMENT OBVERSE DCA REVBLK SDST SKP JMS I SELTIM /TIMING ERROR TAD M6 /WAIT TO GET UP TO SPEED DCA CNT /SET UP COUNTER SDSQ /SKIP ON A QUAD LINE FLAG JMP .-1 SDRD /READ THE DATA BUFFER TO CLEAR FLAG ISZ CNT JMP .-4 CLA BLCSDA, DCA CHKSUM JMS I SLRDRC /READ A SINGLE LINE AT A TIME TAD M26 SZA CLA /IS IT BLOCK MARK JMP SRDRC+4 /NO,GO BACK SDST SKP JMS I SELTIM /TIMING ERROR TAD DATRD CIA TAD BLK SZA CLA JMS I BLKERR /BLK NUMBER ERROR JMS I SSDSQT /READ GUARD JMS I SSDSQT /READ REVERSE LOCK JMS I SSDSQT /READ CHECKSUM SDRD /READ THE DATA BUFFER SDST SKP JMS I SELTIM /TIMING ERROR AND MSK77 JMS I BCXOR /GO OUT TO CHECKSUM ROUTINE RDATA, TAD TOTAL /NUMBER OF WORDS PER BLOCK CIA DCA W5 /SET UP COUNTER SDSQ JMP .-1 SDRD /READ THE DATA BUFFER SDST SKP JMS I SELTIM /TIMING ERROR DCA DATRD TAD DATRD /SAVE THE DATA WORD SZA CLA JMS I DATERR /DATA ERROR TAD DATRD JMS I BCXOR SDST /CHECK FOR A TIMING ERROR SKP JMS I SELTIM /TIMING ERROR ISZ W5 JMP RDATA+3 SDSQ /READ REVERSE CHECKSUM JMP .-1 SDRD /READ IT IN SDST SKP JMS I SELTIM /TIMING ERROR AND C7700 JMS I BCXOR /CHECK CHECK SUM TAD CHKSUM AND MSK77 IAC TAD C7700 SZA CLA JMS I CHKERR /CHECKSUM ERROR SDST SKP JMS I SELTIM /TIMING ERROR JMS I SLRDRC /ADVANCE A SINGLE LINE FLAG TAD M31 /LOOK FOR REV BLK NUMBER SZA CLA JMP SRDRC+4 SDST SKP JMS I SELTIM /TIMING ERROR TAD DATRD CIA TAD REVBLK /COMPARE BLOCK READ WITH ONE COMPUTED SZA CLA JMS I BLKERR /BLOCK NUMBER ERROR SDSQ JMP .-1 SDRD SDST SKP JMS I SELTIM /TIMING ERROR CLA CLL ISZ BLK TAD BLK JMS I MESS DCA REVBLK SDST SKP JMS I SELTIM /TIMING ERROR ISZ W6 JMP BLCSDA TAD DT1000 TAD DTA SDLC SDSS JMP .-1 SDRC AND MSK77 TAD M22 SZA CLA JMP .-6 JMP I .+1 RDBLKS C4, 0004 *2400 DBLOCK, TAD C3 DCA PHASE CLA CLL DCA DISBLK TAD DT3000 /REVERSE,GO TAD DTA /UNIT SDLC /LOAD THE COMMAND REGISTER CLA CLL DISLUP, SDSS JMP .-1 CLA CLL SDRD DCA DISDAT /SAVE THE DATA BUFFER SDRC AND MSK77 /MASK OUT THE MARK TRACK TAD M26 /CHECK FOR BLOCK NUMBER SZA JMP DISEND /NOT BLK MARK,CHECK FOR END ZONE TAD DISDAT /DISPLAY THE NUMBER IN THE AC ISZ DISBLK JMP .-1 JMP DISLUP /GO SEARCH FOR THE NEXT BLOCK DISEND, TAD FOUR /IS IT END ZONE SZA CLA JMP DISLUP /NO,GO GET NEXT LINE TAD DTA /STOP GET READY TO READ SDLC /LOAD THE COMMAND REGISTER JMP I .+1 BLCSD DISBLK, 0 DISDAT, 0 FOUR, 4 C3, 0003 C5, 0005 RDBLKS, TAD C5 DCA PHASE TAD VAR2 DCA W5 /SET UP FOR NUMBER OF BLOCKS IAC TAD VAR2 DCA W6 /SET UP TO CHECK BLK REVERSE TAD DT3000 /READ REVERSE GO TAD DTA /UNIT SDLC /LOAD THE COMMAND REGISTER TAD M6 DCA CNT SDSS JMP .-1 SDRC CLA ISZ CNT JMP .-5 RDBLK, SDSS JMP .-1 SDRD /READ THE DATA BUFFER AND STORE IT AWAY DCA CNT SDRC AND MSK77 TAD M26 SZA CLA /IS IT BLOCK NUMBER JMP RDBLK TAD CNT TAD W6 SZA CLA JMS I BLKERR /BLOCK NUMBER ERROR IAC TAD W6 /INCREMENT A NUMBER FOR COMPARE COUNTER DCA W6 ISZ W5 /INCREMENT BLK COUNTER JMP RDBLK SDSS JMP .-1 SDRC AND MSK77 TAD M22 SZA CLA JMP .-6 TAD DTA SDLC /LOAD THE COMMAND REGISTER WITH UNIT STOP IAC DCA PHASE JMS NUDTA JMP PSER JMP I .+1 INIT /END GO BACK TO DIRECT / / /SUBROUTINE TO CHECK FOR REPEATED DTA NUMBERS /DTA # TO COMPARE TO LIST IS IN AC ON ENTRY--THIS /ROUTINE STORES THE DTA # IF IT IS NEW AND IGNORES IT /IF IT IS NOT-CALL BY JMS REPEAT WITH DTA # IN AC REPEAT, 0 DCA DNUM /TEM STORAGE FOR NEW DTA # TAD DBUFAD /INITIALIZE POINTER (DBUFPT) DCA DBUFPT /TO START OF DTA LIST TAD DCTR /LOAD NUM. OF DTAS STORED CMA /COMPLEMENT IT DCA COMCTR /STORE IN COMPARE COUNTER COMCHK, ISZ COMCTR /DONE WITH ALL COMPARES? JMP DOCOMP /NO: GO DO COMPARE TAD DNUM /YES: STORE NEW DTA# DCA I DBUFPT /AT END OF LIST ISZ DCTR /INCR. # OF DTAS STORED JMP I REPEAT /RETURN COMCTR, 0 /COUNTER FOR # OF LIST COMPARISONS TO BE DONE DCTR, 0 /COUNTER FOR # OF DTAS IN LIST DBUFAD, DTABUF /START OF DTA NUM. LIST DNUM, 0 /TEM STORAGE FOR DTA # / / /THIS SECTION DOES THE ACTUAL COMPARISON BETWEEN /THE DTA# PASSED TO THE ROUTINE AND A NUMBER ON THE LIST DOCOMP, TAD I DBUFPT /GET NXT DTA NUMBER PASSED CIA /NEGATE IT TAD DNUM /ADD IN DTA NUMBER PASSED SNA CLA /ARE THEY THE SAME JMP I REPEAT /YES: RETURN ISZ DBUFPT /NO: INCREMENT LIST POINTER JMP COMCHK /SEE IF DONE ALL COMPARES / / *2600 RDFA, CLA CLL TAD DT3000 /REVERSE READ GO TAD DTA /GET UNIT SDLC /LOAD THE COMMAND REGISTER SDSS /SKIP ON A SINGLE LINE FLAG JMP .-1 SDRC /READ THE COMMAND REGISTER AND MSK77 TAD M22 /IS IT END ZONE SZA CLA /YES JMP .-6 /NO GO BACK AND LOOK AGAIN TAD DT1000 /FORWARD READ GO TAD DTA /UNIT SDLC /LOAD THE COMMAND REGISTER TAD M6 DCA CNT SDSS JMP .-1 SDRC CLA ISZ CNT JMP .-5 RDFA1, TAD M26 DCA W3 /SET UP COUNTER TO READ 22 BLOCKS TAD BADD /SET UP BUFFER ADDRESS DCA X2 SDSS /GO SINGLE LINE FLAGS JMP .-1 SDRD /READ THE DATA BUFFER DCA CNT SDRC /READ THE COMMAND REGISTER AND MSK77 TAD M26 /SEARCH FOR BLOCK NUMBER SZA CLA JMP RDFA1+4 /NOT BLOCK NUMBER YET GO BACK AGAIN TAD CNT /OK BLK NUMBER STORE IT AWAY DCA I X2 ISZ W3 /INCREMENT COUNTER JMP RDFA1+4 /NOT 22 BLOCKS YET TAD DTA SDLC /STOP THE DTA /TYPE OUT BLOCK NUMBERS AND DTA UNIT# JMS I TYPE 0424 /DT 0140 /A 0000 /END TAD DTA /GET UNIT NUMBER RTL JMS I TYOCT /AND TYPE IT OUT JMS I TYPE 4345 /CR&LF 0000 /END TAD M26 /WILL TYPE ALL DCA W1 /22 WORDS TAD BADD /ADDRESS OF BLOCK DCA X2 /NUMBERS TO INDEX TAD I X2 /FIRST OR NEXT BLOCK JMS I TYOCT /TYPE IT OUT JMS I TYPE /CR&LF 4345 /CR&LF 0000 /END ISZ W1 /COMPLETE JMP .-6 JMP I IT /GO ASK FOR FORMAT RDR, CLA CLL TAD DT1000 /FORWARD READ GO TAD DTA /UNIT SDLC /LOAD THE COMMAND REGISTER SDSS /SKIP ON A SINGLE LINE FLAG JMP .-1 SDRC /READ THE COMMAND REGISTER AND MSK77 TAD M22 /CHECK FOR END ZONE SZA CLA JMP .-6 /NOT YET GO BACK TAD DT3000 /REVERSE READ GO TAD DTA /UNIT SDLC /LOAD THE COMMAND REGISTER TAD M6 DCA CNT SDSS JMP .-1 SDRC CLA ISZ CNT JMP .-5 JMP RDFA1 /STORE NUMBERS IN REVERSE RETRY, JMS I TYPIN JMS I COMPAR 0322 /R 0305 /E 0324 /T 0322 /R 0331 /Y 0000 /END JMP I IT /GUESS HE DOESN'T WANT TO TRY AGAIN CLA TAD DT1000 /FORWARD READ GO TAD DTA /UNIT SDLC /LOAD THE COMMAND REGISTER TAD M6 DCA CNT /WAIT 6 LINES SDSS JMP .-1 SDRC /READ THE COMMAND REGISTER ISZ CNT JMP .-4 SDSS JMP .-1 SDRC AND MSK77 TAD M22 SZA CLA JMP .-6 TAD DT3000 TAD DTA SDLC CLA IAC DCA PHASE JMP I .+1 PSER+11 *3000 SDSQT, 0 SDSQ /ADVANCE SIX LINES JMP .-1 /SKIP ON QUAD LINE FLAG SDRC /READ COMMAND REGISTER SDST SKP JMS I SELTIM /TIMING ERROR SDSS JMP .-1 /SKIP ON SINGLE LINE FLAG SDRC SDST SKP JMS I SELTIM /TIMING ERROR SDSS JMP .-1 SDRC /READ THE COMMAND REGISTER SDST SKP JMS I SELTIM /TIMING ERROR AND MSK77 /SAVE THE MARK TRACK LAST 6 BITS DCA MTR TAD MTR JMP I SDSQT A3LNS, 0 /ADVANCE THREE LINES SDSS JMP .-1 /SKIP ON SINGLE LINE FLAG SDRC SDST SKP JMS I SELTIM /TIMING ERROR SDSS JMP .-1 SDRC SDST SKP JMS I SELTIM /TIMING ERROR SDSS JMP .-1 SDRC SDST SKP JMS I SELTIM /TIMING ERROR AND MSK77 DCA MTR TAD MTR JMP I A3LNS CEXPC, 0 TAD MTR TAD M52 SZA CLA JMS I MARKER /MARK TRACK ERROR JMS A3LNS /READ THREE MORE LINES TAD M25 /IS IT 25 NOW SZA CLA JMS I MARKER /NO ,MARK TRACK ERROR JMP I CEXPC /YES:IT IS EXPAND CODE NUMBER 1 /SIXBIT COMPLEMENT XOR SUBROUTINE /SUBROUTINE IS ENTERED WITH DATA WORD TO BE XORED IN AC /TWO SIX-BIT COMPLEMENT XORS WILL TAKE PLACE TO LOC CHKSUM /WITH THE RESULT IN CHKSUM SBCXOR, 0 CMA /COMPLEMENT WORD DCA SBWORD /AND SAV TAD SBWORD AND CHKSUM CIA CLL RAL TAD SBWORD TAD CHKSUM DCA CHKSUM TAD SBWORD RTR CLL;RTR;RTR DCA SBWORD TAD SBWORD AND CHKSUM CIA CLL RAL TAD SBWORD TAD CHKSUM AND MSK77 DCA CHKSUM JMP I SBCXOR SRDRC, 0 SDSQ SKP JMP .+3 SDSS JMP .-1 SDRD DCA DATRD SDRC AND MSK77 JMP I SRDRC NUDTA, 0 TAD I LSTPT /GET CURRENT VALUE OF DATA LIST PTR DCA TBUFPT /STORE IT AS TEM,BUF,PTR TAD I TBUFPT /GET A DTA # FROM THE LIST AND C0007 SZA CLA /IS IT A 7777 JMP LSTEND /YES END OF LIST TAD I TBUFPT /NO;GET IT BACK DCA DTA ISZ I LSTPT /INCREMENT LIST POINTER JMP I NUDTA /RETURN /COME HERE AT END OF LIST TO RESET POINTERS AND RETURN TO CALL+2 LSTEND, ISZ NUDTA /INCREMENT RETURN POINTER TAD I STRTPT /GET ADR OF START OF LIST DCA I LSTPT JMP NUDTA+1 /GO GET FIRST DTA# AND RETURN STRTPT, DBUFAD /POINTER TO START OF DATA LIST TBUFPT, 0 /TEM STORAGE FOR BOT PTR LSTPT, DBUFPT /POINTER TO CURRENT VALUE OF DTA LIST PTR /CONSTANTS FOR FORMULA TRANSLATION SECTION BINCON, .+1 0001 0012 0144 1750 DTABUF, 0 *3200 /CHECK SWITCH TO SEE IF SET TO WTM POSITION SWCHK, JMS I TYPE /TYPE OUT MESSAGE 2305 /SE 2440 /T 2327 /SW 1124 /IT 0310 /CH 4024 /T 1740 /O 2724 /WT 1500 /M JMS I TYPIN /WAIT FOR CR CLA DCA CNTERL SDLD /CLEAR SINGLE AND QUAD FLAGS SDSS SKP JMP .+4 ISZ CNTERL JMP .-4 JMP SWCHER /ERROR,TYPE ERROR MESSAGE AND GO TO SWCHK /SEE IF THE DRIVE IS OK RSTSM, SDLC /LOAD CR TO CLEAR TIMEING ERROR SDLD /LOAD DATA BUFFER TO CLEAR S Q FLAGS TAD DT0400 /SET WRITE TAD DTA /GET UNIT DCA SAV /STORE IT AWAY TAD SAV SDSS JMP .-1 SDLC TAD SAV SDLC /LOAD THE TRANSPORT SDRC /READ THE COMMAND REGISTER AND CHECK IT RTL RAL SMA /CHECK WRITE TO BE SET JMP ERCHK /WRITE IS NOT SET RAL /CHECK WLO SPA JMP ERCHK /WLO RAL /CHECK SELECT AND TIMING ERROR SPA CLA JMP ERCHK /SELECT OR TIMING ERROR JMS NUDTA /CHECK OTHER DRIVE IF ANY JMP RSTSM-11 /CHECK OTHER DRIVE JMP I .+1 STMK CNTERL, 0 SAV, 0 ERCHK, JMS I TYPE /INCORRECT SETUP 2305 /SE 2425 /TU 2077 /P 0000 /END JMP I .+1 START SWCHER, JMS I TYPE 2327 /SW 1124 /IT 0310 /CH 4016 /N 1724 /OT 4023 /S 0524 /ET 4024 /T 1740 /O 2724 /WT 1540 /M 1722 /OR 4023 /S 1116 /IN 0714 /GL 0540 /E 1411 /LI 1605 /NE 4006 /F 1401 /LA 0740 /G 0601 /FA 1114 /IL 0504 /ED 4024 /T 1740 /O 2305 /SE 2440 /T 4543 /CR LF 0000 /END JMP SWCHK SWOFF, CLA DCA CNTERL SDLD /CLEAR ANY FLAGS THAT ARE SET SDSS SKP JMP OFF /FLAG SHOULDN'T BE SET ISZ CNTERL JMP .-4 CLA JMP I .+1 PSER *3400 /INPUT BUFFER FOR TELETYPE THIS MUST BE AT THE END OF PROGRAM BUFFER, 0 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 | /2 TD8E INITIALIZER PROGRAM, V7A / / / / / / // / / / / /COPYRIGHT (C) 1975, 1977 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /DECEMBER 21, 1973 GB/RL/EF/SR /ABSTRACT-- / THE ROUTINE DESCRIBED AND LISTED HERE IS A GENERAL /DATA HANDLER FOR THE TD8E DECTAPE SYSTEM. THE ROUTINE /CONTAINS SEARCH, READ, AND WRITE FUNCTIONS IN A FORMAT /WHICH IS COMPATIBLE WITH OS/8 DEVICE HANDLER CALLING /SEQUENCES. / EXPLANATION: /THIS IS A SAVE FILE, WHICH MUST BE PLACED AS FILE # 1 /ON THE OS/8 BINARIES TAPE. (I.E. BLOCK 7) /FOLLOWING IT MUST BE THE FOLLOWING FILES, EACH 50 (DEC) BLKS LONG: /TDROM.SY /TD12K.SY / /TO CREATE SPECIAL BLOCK 0 FOR THAT TAPE, START THIS PROGRAM AT /LOCATION 200 AND FOLLOW INSTRUCTIONS. /TO THEN PERFORM THE INITIALIZATION FROM THE LIBRARY TAPES, /MERELY PLACE THE BINARY TAPE ON UNIT 0 AND BOOTSTRAP INTO IT. /THEN FOLLOW INSTRUCTIONS. /FILES TDROM.SY AND TD12K.SY ARE MERELY SYSTEM HEADS OF THE /APPROPRIATE SYSTEMS, THEY MAY CONTAIN ANY HANDLERS. /THE BLOCK 0 SPECIAL SECONDARY BOOTSTRAP READS IN THE FIRST /3 PAGES OF TDINIT (WORDS 200-777) AND BRANCHES TO 'STARTUP'. /THIS THEN READS IN THE REMAINDER OF TDINIT WITH ERROR CHECKING. /CODE LOC BLOCK ON BINARY TAPE /CCB 16,17 (THESE ARE DECTAPE BLOCK NUMBERS, NOT OS/8 RECORDS) /0 20 SKIPPED BY BLOCK 0 /200 21 /400 22 /600 23 /1000 24 /1200 25 /1400 26 /1600 27 /2000 30 /2200 31 TDINIT MUST HAVE USEFUL PART END AT OS/8 RECORD 75 /7400 32,33 RECORD 15 CONTAINS IMAGE OF BLOCK 0 /FIXES SINCE FIELD-TEST RELEASE: /1. FIXED BUG RE CLA ON RETRY AFTER ERROR /2. ALLOWED FINAL BOOTSTRAP TO BE INTO A WRITE-LOCKED DEVICE /OS/8 V3D CHANGES: /3. FIXED BUG RE TD8E BUILD (V6B PATCH) /THIS ROUTINE CAN BE RE-EDITED AND ASSEMBLED TO PRODUCE /VARIATIONS ON THE BASIC TD8E SYSTEM. ASSEMBLY PARAMETERS /CONTROL: /A) WHAT DRIVES (UNITS 0-7) WILL BE USED /B) THE ORIGIN OF THE TWO PAGE ROUTINE /C) WHAT MEMORY FIELD THE ROUTINE WILL RUN IN /D) THE SIZE OF THE DECTAPE BLOCK TO BE READ/WRITTEN /FOLLOWING ARE THE PARAMETERS SET UP FOR THE STANDARD /DEC VERSION OF THIS ROUTINE: DRIVE=10 /UNITS 0 AND 1 SELECTED ORIGIN=400 /ENTER AT ORIGIN, ORIGIN+4 AFIELD=0 /INITIAL FIELD SETTING MFIELD=00 /AFIELD*10=MFIELD WDSBLK=201 /129 WORDS PER BLOCK /THE USE OF THE PARAMETERS IS AS FOLLOWS: / DRIVE: DRIVE DETERMINES WHICH UNITS WILL BE SELECTED / DRIVE=10 IMPLIES UNITS 0 &1 / DRIVE=20 IMPLIES UNITS 2&3 / DRIVE=30 IMPLIES UNITS 4&5 / DRIVE=40 IMPLIES UNITS 6&7 /ORIGIN: ALTERING ORIGIN CAUSES ASSEMBLY IN A DIFFERENT / MEMORY LOCATION. WHEN CHANGING ORIGIN KEEP IN MIND /THAT THIS IS A TWO PAGE ROUTINE. /AFIELD: AFIELD DETERMINES THE INITIAL FIELD SETTING FOR THE / LOADER. PERMISSIBLE VALUES FOR AFIELD ARE 0 TO 7. /MFIELD: MFIELD IS USED IN A CIF CDF MFIELD INSTRUCTION. / THE VALUE INSERTED FOR MFIELD SHOULD BE 10(8) TIMES / THE VALUE FOR AFIELD. THE PERMISSIBLE VALUES ARE 00-70. /WDSBLK: WDSBLK GOVERNS HOW MANY WORDS THE ROUTINE THINKS ARE / IN A DECTAPE BLOCK. THE STANDARD VALUE IS 201(8) OR / 128 DECIMAL. NOTE THAT THE FUNCTION WORD BIT 10 CAN / BE USED TO SUBTRACT ONE FROM WDSBLK. THE VALUE USED / FOR WDSBLK SHOULD BE THE NUMBER OF WORDS THE TAPE WAS / FORMATTED TO CONTAIN. /IF WE WANT A HANDLER FOR UNITS 2&3 TO RESIDE IN /FIELD 2 AT LOCATION 3000 AND READ/WRITE 256(10) WORDS /PER BLOCK, THE PARAMETERS WOULD BE: / DRIVE=20 / ORIGIN=3000 / AFIELD=2 / MFIELD=20 / WDSBLK=400 /THE CALL TO THE SUBROUTINE FOLLOWS BASICALLY THE /CALLING SEQUENCE FOR OS/8 DEVICE HANDLERS. /THE CALLING SEQUENCE IS: / CDF CURRENT / CIF MFIELD /MFIELD=FIELD ASSEMBLED IN / JMS ENTRY /ENTRY=ORIGIN (EVEN NUMBERED DRIVE /AND ORIGIN+4 FOR ODD NUMBERED DRIVE. / ARG1 / ARG2 / ARG3 / ERROR RETURN / NORMAL RETURN /THE ARGUMENTS ARE: /ARG1: FUNCTION WORD BIT0: 0=READ, 1=WRITE / BITS 1-5: # BLOCKS IN OPERATION / BITS 6-8: FIELD OF BUFFER AREA / BIT 9: UNUSED / BIT 10: # OF WORDS/BLOCK. / 0= WDSBLK, 1=WDSBLK-1 / BIT 11: 1=START FORWARD, 0=REVERSE /ARG2: BUFFER ADDRESS FOR OPERATION /ARG3: STARTING BLOCK FOR OPERATION /ERRORS: THE HANDLER DETECTS TWO TYPES OF ERRORS: /A) FATAL ERRORS- PARITY ERROR, TIMING ERROR, / TOO GREAT A BLOCK NUMBER / FATAL ERRORS TAKE ERROR RETURN WITH THE / AC=4000. /B) NON-FATAL- SELECT ERROR. / IF NO PROPER UNIT IS SELECTED, THE ERROR / RETURN IS TAKEN WITH CLEAR AC. /FATAL ERRORS TRY THREE TIMES BEFORE TAKING ERROR RETURN. /THE NORMAL RETURN IS TAKEN AFTER ALL INDICATED /BLOCKS HAVE BEEN TRANSFERRED. THE AC IS CLEAR. /THE TD8E IOT'S ARE: SDSS=7001-DRIVE /SKIP ON SINGLE LINE FLAG SDST=7002-DRIVE /SKIP ON TIMING ERROR SDSQ=7003-DRIVE /SKIP ON QUAD LINE FLAG SDLC=7004-DRIVE /LOAD COMMAND REGISTER SDLD=7005-DRIVE /LOAD DATA REGISTER SDRC=7006-DRIVE /READ COMMAND REGISTER SDRD=7007-DRIVE /READ DATA REGISTER /THE IOT'S IN GENERAL ARE 677X,676X,675X,AND 674X. /THE OTHERS CONTROL UNITS 2-7. INITLN=7 /LENGTH OF TDINIT INCLUDING BLOCK 0 IMAGE (IN BLOCKS) CTRLO=20 INCHAR=21 TEMPA=22 ST, CLA /IN CASE CHAINED TO JMP I (CREATE /CREATE BLOCK 0 -IN HOUSE ONLY - STARTUP,JMS I (DTA0 /TD8E S.R. IS IN 200 NOW 603 /READ 3 BLOCKS INTO 1000-2377 1000 24 /GET REST OF INIT JMP FERR /REALLY BAD! TAD (SKP CLA DCA ST /ALLOWS HIM TO RESTART AT 200 RE, JMS MSG VNO JMS I (CHKCOR /USE ROM OR 12K SYSTEM JMS MSG INIT JMS I (MOVSYS JMS MSG SWTCH JMS TTY /PAUSE TAD INCHAR TAD (-32 SNA CLA JMP I (ZERO /HE TYPED ^Z CPY, JMS MSG COPY TAD (160 DCA B1 TAD (160 DCA B2 RD, JMS I (DTA0 3612 0 B1, 0 JMS I (ER1 JMS I (DTA1 7612 0 B2, 0 JMS I (ER1 TAD B1 TAD (36 DCA B1 TAD B1 DCA B2 TAD B1 /COPY OVER ABOVE 2700 TAD (-2600 /*** SPA CLA JMP RD /KEEP GOING JMS I (DTA0 /COPY DIRECTORY 1412 0 2 JMS I (ER1 JMS I (DTA1 5412 0 2 JMS I (ER1 RESTRT, JMS MSG DISMNT /SETUP TAPES FOR INIT JMS TTY JMP I (BOOT TTY, 0 JMS MSG STRIKE KCC KSF JMP .-1 KRB AND (177 DCA INCHAR JMP I TTY MSG, 0 /MESSAGE TYPER DCA CTRLO JMS I (CRLF TAD I MSG DCA TEMPA ISZ MSG WTMSG, TAD I TEMPA CLL RTR;RTR;RTR JMS PNCH TAD I TEMPA JMS PNCH ISZ TEMPA JMP WTMSG PNCH, 0 AND (77 SNA /IGNORE NULL. _ MEANS CR/LF JMP I PNCH /? MEANS TERMINATE TAD (-37 /IS IT _? SNA JMS I (CRLF /YES TAD (-40 /MAYBE ? SNA JMP I MSG TAD (40 SPA TAD (100 TAD (237 JMS I (TTYOUT JMP I PNCH FERR, HLT CLA JMP STARTUP PAGE / THIS HANDLER USES DECTAPE BLOCKS NOT OS/8 BLOCKS ! *ORIGIN DTA0, 0 /ENTRY POINT FROM UNIT 0 CLA CLL /0 TO LINK JMP DTA1X C1000, 1000 BLOCK, DTA1, 0 /UNIT 2 ENTRY CLA CLL CML /1 TO LINK TAD DTA1 DCA DTA0 /PICK UP ARGS AT DTA0 DTA1X, RAR DCA UNIT /LINK TO UNIT POSITION RDF TAD C6203 /GET DATA FIELD AND SETUP RETURN DCA LEAVE TAD I DTA0 /GET FUNCTION WORD SDLD /PUT FUNCTION INTO DATA REGISTER CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER /BLOCK INTO LINK SZL CLA /KNOCK ONE OFF WDSBLK? IAC /YES TAD MWORDS DCA WCOUNT /STORE MASTER WORD COUNT ISZ DTA0 /TO BUFFER TAD I DTA0 DCA BUFF ISZ DTA0 /TO BLOCK NUMBER TAD I DTA0 DCA BLOCK ISZ DTA0 /POINT TO ERROR EXIT CIF CDF MFIELD /TO ROUTINES DATA FIELD SDRD /GET FUNCTION INTO AC CLL RAL AND CM200 /GET # PAGES TO XFER DCA PGCT SDRD C374, AND C70 /GET FIELD FOR XFER TAD C6203 /FORM CDF N DCA XFIELD /IF=0 AND DF=N AT XFER. CLA CLL CMA RTL DCA TRYCNT /3 ERROR TRIES TAD UNIT /TEST FOR SELECT ERROR SDLC SDRC AND C100 SZA CLA JMP FATAL-1 SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG. DCA I CXFUN TAD WCOUNT DCA I CXWCT SDRD /GET MOTION BIT TO LINK CLL RAR JMP GO /AND START THE MOTION. RWCOM, SDST /ANY CHECKSUM ERRORS? SZA CLA /OR CHECKSUM ERRORS? JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS /SET AT RWCOM. GETCHK SETS IT. TAD PGCT /NO ERROR..FINISHED XFER? TAD CM200 SNA JMP EXIT /ALL DONE. GET OUT DCA PGCT /NEW PAGE COUNT ISZ BLOCK /NEXT BLOCK TO XFER TAD WCOUNT /FORM NEXT BUFFER ADDRESS CIA TAD BUFF DCA BUFF CLL CML /FORCES MOTION FORWARD GO, CLA CML RTR /LINK BECOMES MOTION BIT TAD C1000 TAD UNIT /PUT IN 'GO' AND UNIT # SDLC /LOOK FOR BLOCK NO. JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK JMS I CRDQUD CM200, 7600 /COULD HAVE SAVED A LOC. HERE SRCH, SDSS JMP .-1 /WAIT FOR SINGLE LINE FLAG SDRC CLL RTL /DIRECTION TO LINK. INFO BITS /ARE SHIFTED. AND C374 /ISOLATE MARK TRACK BITS TAD M110 /IS IT END ZONE? SNA /THE LINK STAYS SAME THRU THIS JMP ENDZ TAD M20 /CHECK FOR BLOCK MARK SZA CLA JMP SRCH SDRD /GET THE BLOCK NUMBER SZL /IF WE ARE IN REVERSE, LOOK FOR 3 /BLOCKS BEFORE TARGET BLOCK. THIS /ALLOWS TURNAROUND AND UP TO SPEED. TAD C3 /REVERSE CMA TAD BLOCK CMA /IS IT RIGHT BLOCK? SNA JMP FOUND /YES..HOORAY! M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT? /ABOVE SNA IS SUPERFLUOUS. JMP SRCH /YES ENDZ, SDRC /WE ARE IN THE END ZONE CLL RTL /DIRECTION TO LINK CLA /ARE WE IN REVERSE? JMP GO /YES..TURN US AROUND /IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR TRY3, CLA ISZ TRYCNT JMP GO /TRY 3 TIMES JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN EXIT, ISZ DTA0 CLL CML /AC=0 ON NORMAL RETURN FATAL, TAD UNIT SDLC /STOP THE UNIT CLA CML RAR LEAVE, HLT JMP I DTA0 C6203, 6203 CRDQUD, RDQUAD WCOUNT, 0 BUFF, 0 MWORDS, -WDSBLK UNIT, 0 CXFUN, XFUNCT M20, -20 PGCT, 0 CXWCT, XWCT C100, 100 TRYCNT, -3 *ORIGIN+170 FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION? JMP GO /WRONG..TURN AROUND TAD UNIT /PUT UNIT INTO LINK CLL RAL /AC IS NOW 0 C70, 70 /********DON'T MOVE THIS!!!!****** C3, 3 TAD BUFF /GET BUFFER ADDRESS XFIELD, HLT /INTO NEXT PAGE *ORIGIN+200 CIF MFIELD DCA XBUFF /SAVE ADDRESS RAR /NOW GET UNIT # DCA XUNIT SDRC SDLC REVGRD, SDSS JMP .-1 /LOOK FOR REVERSE GUARD SDRC AND K77 TAD CM32 /IS IT REVERSE GUARD? SZA CLA JMP REVGRD /NO.KEEP LOOKING TAD XWCT DCA WORDS /WORD COUNTER TAD XFUNCT /GET FUNCTION READ OR WRITE K7700, SMA CLA JMP READ /NEG. IS WRITE WRITE, SDRC AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS SZA CLA JMP I CFATAL /FATAL ERROR. LINK MUST BE ON JMS RDQUAD /NO ONE EVER USES THIS WORD! C7600, 7600 TAD C1400 TAD XUNIT /INITIATE WRITE MODE SDLC CLA CMA JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM CLA CMA DCA CHKSUM WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE! JMS WRQUAD ISZ XBUFF /BUMP CORE POINTER K77, 77 /ABOVE MAY SKIP ISZ WORDS /DONE THIS BLOCK? JMP WRLP /NOT YET..LOOP A WHILE TAD XFUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK? CLL RTR /IF NO, WRITE A 0 WORD SZL CLA JMS WRQUAD /WRITE A WORD OF 0 JMS GETCHK /DO THE CHECK SUM JMS WRQUAD /WRITE FORWARD CHECKSUM JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN JMP I CRWCOM READ, JMS RDQUAD JMS RDQUAD JMS RDQUAD /SKIP CONTROL WORDS AND K77 TAD K7700 /TACK 7700 ONTO CHECKSUM. DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY RDLP, JMS RDQUAD JMS EQUFUN /COMPUT CHECKSUM AS WE GO DCA I XBUFF /IT GETS CONDENSED LATER ISZ XBUFF C300, 300 /PROTECTION ISZ WORDS /DONE THIS OP? JMP RDLP /NO SUCH LUCK TAD XFUNCT /IF OP WAS FOR WDSBLK-1, READ AND CLL RTR /CHECKSUM THE LAST TAPE WORD SNL CLA JMP RDLP2 JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK JMS EQUFUN /CHECKSUM IT RDLP2, JMS RDQUAD /READ CHECKSUM AND K7700 JMS EQUFUN JMS GETCHK /GET SIX BIT CHECKSUM JMP I CRWCOM WRQUAD, 0 /WRITE OUT A 12 BIT WORD JMS EQUFUN /ADD THIS TO CHECKSUM SDSQ /SKIP ON QUADLINE FLAG JMP .-1 SDLD /LOAD DATA ONTO BUS CLA /SDLD DOESN'T CLEAR AC JMP I WRQUAD RDQUAD, 0 /READ A 12 BIT WORD SDSQ JMP .-1 SDRD /READ DATA JMP I RDQUAD XUNIT, EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM CMA DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE CIA /IS ASSOCIATIVE, WE CAN DO IT 12 CLL RAL /BITS AT A TIME AND CONDENSE LATER. TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES: TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B) DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B) TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B)) CMA JMP I EQUFUN GETCHK, 0 /FORM 6 BIT CHECKSUM CLA TAD CHKSUM CMA CLL RTL RTL RTL JMS EQUFUN CLA CLL CML /FORCES LINK ON AT RWCOM TAD CHKSUM AND K7700 JMP I GETCHK CFATAL, FATAL CRWCOM, RWCOM XFUNCT, 0 CM32, -32 C1400, 1400 CHKSUM, 0 WORDS, 0 XBUFF, 0 XWCT, 0 EQUTMP, 0 TBL, CPY ZER LVAL PAGE CREATE, JMS I (MSG WRITOUT JMS I (TTY JMS I (DTA1 4202 7400 0 JMS ER1 JMS I (MSG OK HLT JMP I (7605 ROMSW=17 /THIS ROUTINE COPIES THE SYSTEM ONTO UNIT 1. /IT COPIES FROM A SYSTEM HEAD FILE ON TAPE ON UNIT 0. /UNIT 0 MUST BE THE OS/8 BINARIES TAPE /1ST FILE: TDINIT.PA /2ND FILE: TDROM.SY /3RD FILE: TD12K.SY MOVSYS, 0 JMS I (TTY TAD ROMSW /GET ADDRESS OF START OF SYSTEM HEAD SNA CLA TAD (62^2 /12 K TAD (7+INITLN^2 /ROM DCA HEAD JMS I (DTA0 /READ PAGE 0 212 0 HEAD, HLT JMS ER1 CDF 10 TAD I (200 CDF 0 TAD (-4207 /CHECK FOR GOOD SYSTEM HEAD SZA CLA JMP WRGSYS JMS I (DTA1 4212 0 0 JMS ER1 STL CLA RTL /2 TAD HEAD DCA KBM JMS I (DTA0 0012 /READ 40 SYSTEM BLOCKS 7-26 (PAGES 16-55) 0 KBM, HLT JMS ER1 JMS I (DTA1 4012 0 7^2 /WRITE KBM ETC JMS ER1 TAD HEAD TAD (43^2 DCA CD JMS I (DTA0 3613 /READ 51-67 (PAGES 122-157) 0 CD, HLT JMS ER1 JMS I (DTA1 7613 0 43+6^2 JMS ER1 JMP I MOVSYS WRGSYS, JMS I (MSG WRONG JMS I (TTY JMP I (CPY ER1, 0 CLA JMS I (MSG IOERR JMS I (TTY TAD I (INCHAR TAD (-101 SNA CLA /A? JMP I (RE /YES, ABORT TAD ER1 TAD (-5 DCA ER1 /BACK UP, POINT TO CALL JMP I ER1 /RETRY CRLF, 0 TAD (215 JMS TTYOUT TAD (212 JMS TTYOUT JMP I CRLF TTYOUT, 0 DCA TM JMS I (TSTKBD TAD CTRLO SZA CLA JMP I TTYOUT TAD TM TLS TSF JMP .-1 CLA JMP I TTYOUT TM, 0 PAGE CHKCOR, 0 /DETERMINE CONFIGURATION CDF 70 /CHECK FOR ROM TAD I (7503 TAD (-SDSS SZA CLA JMP TRY12K CDF 0 JMS I (MSG ROM8K CLA IAC ENTR12, DCA ROMSW /SET INDICATOR CDF 0 JMP I CHKCOR TRY12K, CDF 20 TAD ENTR12 DCA I (7600 TAD I (7600 CIA TAD ENTR12 CDF 0 SNA CLA JMP OK12 JMS I (MSG HRDWR /NO HARDWARE AROUND! HLT JMP .-1 OK12, JMS I (MSG TD8E12 JMP ENTR12 IN, 0 ZERO, JMS I (MSG SPECIAL JMS I (TTY TAD INCHAR TAD (-62 DCA IN TAD IN SPA CIA CLL RAR /ALLOW ONLY -1, 0, 1 SZA CLA JMP ZERO+1 TAD IN TAD (TBL+1 DCA IN TAD I IN DCA IN JMP I IN /JUMP TO APPROPRIATE ROUTINE ZER, JMS I (MSG ZERY JMS I (DTA1 4202 MTDIR 2 JMS I (ER1 JMP I (RESTRT LVAL, JMS I (MSG PRES JMP I (RESTRT MTDIR, -1 70 /SYSTEM TAPE 0 0 -1 /1 EMPTY FILE 0 6437+70 /-LENGTH OF DECTAPE BOOT, TAD ROMSW SNA CLA JMP TDBOOT JMS I (DTA0 /ROM BOOT 202 7400 0 /READ IN BLOCK 0 JMS I (ER1 TAD (CDF 10 JMS MOVE 7400 JMP I (7605 TDBOOT, JMS I (DTA0 202 7400 0 JMS I (ER1 JMS I (DTA0 202 7000 66^2 JMS I (ER1 TAD (CDF 10 JMS MOVE 7000 TAD (CDF 20 JMS MOVE 7200 JMP I (7605 XRIN=11 XROUT=12 MOVE, 0 DCA MOVCDF STA TAD I MOVE DCA XRIN TAD (-200 /MOVE 200 WORDS TO LOCATION 7600 DCA MVCNT ISZ MOVE TAD (7577 DCA XROUT MOVLUP, TAD I XRIN MOVCDF, HLT DCA I XROUT CDF 0 ISZ MVCNT JMP MOVLUP JMP I MOVE MVCNT, -200 PAGE VNO, TEXT /TD8E INITIALIZER PROGRAM VERSION 7A ?/ INIT, TEXT /MOUNT A CERTIFIED DECTAPE ON UNIT 1 WRITE-ENABLED_/ TEXT /ALWAYS KEEP ORIGINAL SYSTEM DECTAPES WRITE-LOCKED?/ STRIKE, TEXT /STRIKE A CHARACTER TO CONTINUE?/ DISMNT, TEXT /REMOVE AND SAVE TAPE ON UNIT 0_/ TEXT /TAKE NEW TAPE (ON UNIT 1) WHICH WAS JUST CREATED_/ TEXT /AND PLACE IT ON UNIT 0_/ TEXT \IT IS YOUR NEW OS/8 SYSTEM TAPE?\ SWTCH, TEXT /DISMOUNT SYSTEM TAPE #2 FROM UNIT 0 AND SAVE IT_/ TEXT /MOUNT ORIGINAL SYSTEM TAPE #1 ON UNIT 0_/ TEXT /PREPARE TO COPY FILES OVER?/ OK, TEXT /OK?/ WRITOUT,TEXT /READY TO CREATE BLOCK 0 OF UNIT 1?/ COPY, TEXT /COPYING FILES FROM UNIT 0 TO UNIT 1?/ ZERY, TEXT /ZEROING DIRECTORY ON TAPE UNIT 1?/ PRES, TEXT /DIRECTORY ON UNIT 1 PRESERVED?/ WRONG, TEXT /NOT ORIGINAL OS8 SYSTEM TAPE #2_/ TEXT /MOUNT CORRECT TAPE ON UNIT 0?/ ROM8K, TEXT /8K ROM SYSTEM?/ TD8E12, TEXT /12K SYSTEM?/ HRDWR, TEXT /NEED ROM OR 12K?/ IOERR, TEXT /FATAL IO ERR_/ TEXT /TYPE A TO ABORT AND START OVER AGAIN_/ TEXT \TYPE ANY OTHER CHARACTER TO RETRY THIS I/O OPERATION?\ SPECIAL,TEXT /TYPE 1 TO COPY FILES FROM UNIT 0 TO UNIT 1_/ TEXT /TYPE 2 TO ZERO THE DIRECTORY OF UNIT 1_/ TEXT /TYPE 3 TO LEAVE THE DIRECTORY OF UNIT 1 ALONE?/ TSTKBD, 0 KSF JMP I TSTKBD KRS AND (177 TAD (-3 SNA JMP I (RE /^C TAD (3-17 SZA CLA JMP NO CLA IAC DCA CTRLO NO, KCC JMP I TSTKBD PAGE /TD8E SYSTEM INITIALIZER /THIS CODE IS PLACED ON THE BINARY TAPE /IN RECORD 0. WHEN THE 7470 OR STANDARD TD8E BOOTSTRAP /IS EXECUTED, THIS PROGRAM READS THE REST OF THE INIT /SYSTEM FROM THE FIRST FILE ON THE TAPE, AND /STARTR EXECUTION OF IT. A SHORT PROGRAM IS HERE /INCLUDED TO WRITE RECORD 0 ON THE TAPE. THE START ADDRESS /OF THAT CODE IS 200. SDSS=6771 SDST=6772 SDSQ=6773 SDLC=6774 SDLD=6775 SDRC=6776 SDRD=6777 *7420 NOPUNCH *7400 ENPUNCH TAD K177 /INIT FOR TAPE READ DCA 10 NUBLK, TAD KM200 /SET BLOCK WORD COUNT DCA WCNT NOT, JMS GET /GET BLOCK # FORWARD -26 SDRD /THE RIGHT ONE? AND KK77 TAD BLOCKK SZA CLA JMP NOT /I GUESS NOT JMS GET /RIGHT. NOW GET REV. GUARD -32 JMS RQD JMS RQD JMS RQD LP, JMS RQD DCA I 10 /READ THE INIT PROGRAM ISZ WCNT JMP LP ISZ BCNT /DONE ALL BLOCKS? JMP CONT SDLC JMP I .+1 STARTUP CONT, CLA CMA /SET FOR NEXT BLOCK TAD BLOCKK DCA BLOCKK JMP NUBLK RQD, 0 SDSQ JMP .-1 SDRD JMP I RQD GET, 0 /PICK UP A SPECIFIED TAPE FRAME TAD I GET /HOLDS 6 BIT MARK TRACK I.D. DCA RQD GTIT, SDSS JMP .-1 SDRC /FLAG IS UP. READ MARK TRACK AND KK77 TAD RQD /A MATCH? SZA CLA JMP GTIT ISZ GET JMP I GET KK77, 77 KM200, -200 BLOCKK, -21 /SKIP CORE CONTROL BLOCK AND PAGE 0 WCNT, -200 K177, 177 BCNT, -3 *200 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 | /10 OS/8 TECO VERSION 5 / / / / / / / / / /COPYRIGHT (C) 1974,1975,1976,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /BROUGHT TO YOU BY: RUSS HAMM, O.M.S.I., AND RICHARD LARY (IN THAT ORDER) /WITH ASSISTANCE FROM MARIO DENOBILI OF THE P?S /PATCHES INCORPORATED BY S.R. ON 5-AUGUST-75 FOR OS/8 V3C: /1. UPDATED VERSION # TO V4 /2. INCORPORATED PATCHES #S 1 & 2 (V302 AND V303) / PREVENTS \ FROM GOING OUTSIDE OF BUFFER / RESETS CFLAG TO PREVENT ARGUMENT ERROR EVERY 4096 TIMES IN LOOP / CHANGES FOR V5: -S.R.- /3. ADDED OVERLAYS /4. EXPANDED ERROR MESSAGES /5. DOCUMENTED CORE LAYOUT /6. ADDED "T, "S, "F, "U, AND "R /7. FIXED EG BUG /8. MADE DEFAULT ITERATION COUNT TRULY INFINITE /9. ADDED N^T /10. ADDED := /11. ADDED SOME SAFETY ERROR MESSAGES / (I) ERROR IF Y HAS A NUMERIC ARGUMENT / (II) ERROR IF TWO ARGUMENTS ARE SPECIFIED TO D /12. REMOVE ^R (OBSOLETE COMMAND) /13. REMOVE "A AND "B (AFTER AND BEFORE) /14. ADDED 13-BIT ARITHMETIC /15. MADE = AND \ GIVE SIGNED RESULTS (DECIMAL ONLY) /16. ALLOW 13-BIT NUMERIC Q-REGISTERS. / THIS IS ACCOMPLISHED BY RESERVING THE HIGH ORDER BIT / OF THE LENGTH WORD. STRING PORTION OF Q-REGISTER / NOW RESTRICTED TO 2047 CHARACTERS. IT GETS CHECKED BY / ^U AND X. BELL RINGS WITHIN 12 CHARACTERS OF FILLING / UP COMMAND STRING Q-REGISTER. /17. STORED LINK AS LOW ORDER BIT IN NLINK IN CASE WE EVER / WANT TO GO TO 24-BIT ARITHMETIC. /18. ERROR ON A,B,C /19. P DOESN'T CREATE FORM FEEDS /20. ALLOW @ MODIFIER WITH ER, EW, EB. /21. EK /22. ^S FREEZE /23. EGTEXT$ /24. GOT RID OF F_ /25. F IS ILLEGAL IF NOT FOLLOWED BY S OR N /26. W IS NOW AN ILLEGAL COMMAND (EXCEPT ON -12) /27. ADDED :G /28. Y AND _ GIVE ERRORS IF DATA IS GOING TO BE LOST / (IF OUTPUT FILE IS OPEN AND BUFFER IS NOT EMPTY) /29. CASE FLAGGING IMPLEMENTED /30. "< AND "> ARE SYNONYMOUS WITH "L AND "G /31. ^G<SPACE> AND ^G* /32. SCOPE RUBOUTS /33. == NOW PRINTS NUMBER IN OCTAL /34. EUFLAG AND ETFLAG IMPLEMENTED /35. CASE FLAGGING WORKS /36. IMAGE MODE (ET BIT 11) APPLIES TO T, ^A, AND N^T / IT DOES NOT APPLY TO :G /37. ERROR IF TRY TO DO AN EB TO A .BK FILE (IT DOES AN ER) /38. VT AND FF ARE NOW LINE TERMINATORS /39. BELL ECHOES AS ^G AS WELL AS RINGING BELL /40. ^K IS AN ERROR /41. REMOVED ^Z COMMAND /42. CHANGED ^V TO EO /43. CHANGED ^W TO W /44. MEMORY RESIDENT OVERLAYS IF MORE THAN 12K /45. LONG FORM ERROR MESSAGES ON 1EH /46. ET FLAG 8'S BIT AFFECTS ECHOING OF ^T /47. NEGATIVE OR 0 ITERATION SKIPS /48. CTRL/N /49. CTRL/C TRAP /KNOWN BUGS /1. LARGE T OR X AND ONLY 1 BLOCK LEFT IN OUT DEV /2. ^S DOESN'T KEEP SCREEN ON /3. FIX BATCH INTERRACTION /4. MAKE VT AND FF SIMULATION INDEPENDENT OF TAB DECIMAL VERSN= 5 / VERSION NUMBER - CHANGE WITH EVERY EDIT OCTAL / LAST EDIT 12-FEB-76 IN= 6200 /INPUT BUFFER AT 06200 OUT= 5200 /OUTPUT BUFFER AT 05200 ZMAX= 7640 /MAX 4000[10] CHARACTERS IN TEXT BUFFER QMAX= 3720 /MAX 2000[10] Q-REGISTER CHARS IN 8K Q12MAX= 5600 /MAX 2944[10] Q-REGISTER CHARS IN 12K CHNSTR= 46 /38 CHARACTER STRING PASSED ON CHAIN TWO= CLA CLL CML RTL MTWO= CLA CLL CMA RAL MTHREE= CLA CLL CMA RTL AC3777= CLL STA RAR SCPBIT= 7726 /THINGS WE WOULD LIKE TO ADD: /:ER /:EB /NV /@^A /FR /-S /::S /^EQ /M,NS /[Q /]Q /NON-EXACT SEARCH MODE /*N /ERFILESPEC/S FOR SUPERTECO /^N /CHECK FOR $ ON NI$ /CHECK INTO SEARCHES IN ITERATIONS /ERR MSG ON EA, EP /NV=(1-N)TNT /^C TRAP /:X /THINGS FOR -11: /^R /3EH /M,ND /ET BIT 15 SHOULD BE LOWER /ECHO OF NULL /***************************************** / TECO ERROR MESSAGES: /***************************************** / TECO ERROR MESSAGES CONSIST OF A QUESTION MARK AND THREE LETTERS / TYPING "?" IMMEDIATELY AFTER AN ERROR MESSAGE PRINTOUT PRINTS / THE CURRENT COMMAND LINE UP TO THE ERROR CHARACTER. /1 ?ILL ILLEGAL COMMAND /2 ?UTC INCOMPLETE COMMAND (PDL NOT EMPTY AT END OF COMMAND STRING) /3 ?IQN NON-ALPHANUMERIC Q-REGISTER NAME /4 ?PDO PUSHDOWN OVERFLOW (MACROS & ITERATIONS NESTED TOO DEEPLY) /5 ?MEM TEXT BUFFER OVERFLOW /6 ?STL SEARCH STRING TOO LARGE ( >31 CHARS) /7 ?ARG NUMBER MISSING BEFORE COMMA / OR TWO ARGUMENTS SPECIFIED TO D / OR 3 NUMERIC ARGUMENTS /8 ?IFN ILLEGAL FILE NAME IN "ER","EW" OR "EB" COMMAND /9 ?SNI SEMICOLON ON COMMAND LEVEL /10 ?BNI ITERATION CLOSE (>) WITHOUT MATCHING OPEN (<) /11 ?POP ATTEMPT TO MOVE POINTER OUTSIDE OF TEXT BUFFER /12 ?QMO Q-REGISTER STORAGE OVERFLOW /13 ?UTM INCOMPLETE COMMAND (PDL NOT EMPTY AT END OF MACRO) /14 ?OUT OUTPUT FILE TOO BIG OR OUTPUT PARITY ERROR /15 ?INP PARITY ERROR ON INPUT FILE /16 ?FER FILE ERROR: CAN MEAN EITHER / A) INPUT FILE NOT FOUND ON "ER" COMMAND / B) CANNOT ENTER OUTPUT FILE ON "EW" OR "EB" COMMAND / C) DEVICE SPECIFIED FOR FILE DOES NOT EXIST / D) "EB" COMMAND GIVEN ON NON-FILE-STRUCTURED DEVICE /17 ?FUL OUTPUT COMMAND WOULD HAVE OVERFLOWED OUTPUT FILE / [PANIC MODE] /18 ?NAY NUMERIC ARGUMENT SPECIFIED WITH Y COMMAND /19 ?IEC E FOLLOWED BY AN ILLEGAL CHARACTER /20 ?IQC " FOLLOWED BY AN ILLEGAL CHARACTER /21 ?NAE NO NUMERIC ARGUMENT TO THE LEFT OF AN = /22 ?NAU NO NUMERIC ARGUMENT TO THE LEFT OF A U /23 ?NAQ NO NUMERIC ARGUMENT TO THE LEFT OF A " /24 ?SRH FAILING SEARCH AT COMMAND LEVEL /25 ?NAP NEGATIVE OR ZERO ARGUMENT TO P /26 ?NAC NEGATIVE ARGUMENT TO COMMA /27 ?NYI CASE SUPPORT NOT IMPL (USE W FOR WATCH) /28 ? /29 ?NAS NEGATIVE OR ZERO ARGUMENT WITH A SEARCH /30 ?WLO WRITE LOCKED SYSTEM DEVICE /31 ?IFC F FOLLOWED BY AN ILLEGAL CHARACTER /32 ?YCA Y (OR _) COMMAND ABORTED BECAUSE DATA WOULD BE LOST /33 ?CCL CCL NOT FOUND OR EG ARGUMENT TOO LONG /34 ?XAB EXECUTION ABORTED BY ^C /35 ?NYI CASE SUPPORT NOT IMPL (USE EO FOR VERSION) /36 ?NFO ATTEMPT TO OUTPUT WITHOUT OPENING AN OUTPUT FILE / CORE LAYOUT AND OVERLAY STRUCTURE / BUFFER STRUCTURE: /BUFFER 8K VERSION 12K VERSION /INPUT BUFFER 06200-07200 25600-27600 /OUTPUT BUFFER 05200-06200 05200-07200 /Q-REG STORAGE OVER TEXT BFR 20000-25600 / HANDLER LOCATIONS: /HANDLER PDP-8 VERSION PDP-12 VERSION /INPUT HANDLER 7200-7600 7200-7400 /OUTPUT HANDLER 4000-4400 7400-7600 /SIZE OF HNDLR 2-PAGES 1-PAGE /DISPLAY CODE NONE 4000-4400 / OVERLAY STRUCTURE /ALL OVERLAYS ARE TWO PAGES LONG AND RESIDE IN CORE /AT LOCATIONS 3200-3600 WHEN RUNNING. THE I-OVERLAY /INITIALLY RESIDES IN THESE LOCATIONS. /OVERLAY BLOCK INITIAL LOCATION CONTENTS / I-OVERLAY 40 3200-3600 ER,EW,EB / Q-OVERLAY 41 5600-6200 ", O, SKPSET / E-OVERLAY 42 6200-6600 ERROR MESSAGE PROCESSOR / X-OVERLAY 43 6600-7200 EX,EC,EG,EK,EF (EA,EI,EN,EP) / F-OVERLAY 44 7200-7600 ED,EH,EO,ES,ET,EU (EV) IOVRLC=40 QOVRLC=41 EOVRLC=42 XOVRLC=43 FOVRLC=44 IOVRLY=3200 QOVRLY=3201 EOVRLY=3202 XOVRLY=3203 FOVRLY=3204 /EACH OVERLAY IS ASSIGNED A LOCATION AT THE BEGINNING OF PAGE 3200. /IF THIS LOCATION IS 0 (AS IT ALWAYS IS), THEN THAT OVERLAY IS NOT /IN CORE. IF IT IS NOT 0, THEN THIS LOCATION CONTAINS THE /BLOCK NUMBER TO READ IN THAT OVERLAY. /THUS EACH OVERLAY HAS POINTERS TO ALL THE OTHER OVERLAYS. MEMLOC=2000 /IN 16K MACHINES, FIELD 3 IS USED TO HOLD OVERLAYS /NAME BLOCK MEMORY /I 40 2000 /Q 41 2400 /E 42 3000 /X 43 3400 /F 44 4000 /INITIAL MEMORY LAYOUT /0000-3177 TECO /3200-3577 OVERLAY AREA (INITIALLY I-OVERLAY) /3600-3777 TECO /4000-4377 PDP-12 DISPLAY ROUTINE /4400-5177 TECO /5200-5577 INITIALIZATION CODE /5600-6177 Q-OVERLAY CODE /6200-6577 E-OVERLAY CODE /6600-7177 X-OVERLAY CODE /7200-7577 F-OVERLAY CODE /FIELD 1: /4400-7377 EXTENDED ERROR MESSAGES / MOVES TO FIELD 3 /** TECO KLUDGES ** /7/27/73 /ONE OF THE REASONS WHY TECO GETS SO MANY OPERATIONS /INTO SUCH A SMALL AMOUNT OF CORE IS THAT IT /IS FULL OF *K*L*U*D*G*E*S*. THESE SHOULD BE KEPT IN MIND WHEN /MODIFYING THE PROGRAM. SOME OF THEM ARE: / THE "SORT" ROUTINE COMPARE LIST MUST END WITH A NEGATIVE NUMBER. / USUALLY A FORTITUOUS JMS OR OPR INSTRUCTION IS USED / THE "SORT" JUMP LIST ENTRIES ARE TREATED AS JUMP ADDRESSES / IF THEY ARE POSITIVE AND SUBSTITUTE VALUES IF THEY ARE / NEGATIVE - THEREFORE ALL LOCS JUMPED TO MUST BE BELOW 4000 / ANOTHER CONSEQUENCE IS THAT "QUOTST" CANNOT BE CALLED FROM / ABOVE 4000 / THERE ARE OTHER LOCALIZED KLUDGES - THEY CAN GENERALLY / BE IDENTIFIED BY THE APPEARANCE OF A DOUBLE-ASTERISK IN THE / COMMENTS FIELD ALONG WITH A TERSE DESCRIPTIVE COMMENT / OS/8 EQUIVALENCES: JSBITS= 7746 /JOB STATUS BITS - IN FIELD 0 OSHNDT= 7647 /OS/8 DEVICE HANDLER TABLE - IN FIELD 1 OSDCBT= 7760 /OS/8 DEVICE CONTROL TABLE - IN FIELD 1 CCLADR= 400 /CCL OVERLAY LOAD ADDRESS CCLOVL= 67 /BLOCK OF CCL OVERLAY CCLOST= 602 /CCL OVERLAY SECONDARY START ADDRESS *0 NAME, ZBLOCK 4 /NAME BUILD BUFFER - MUST BE AT LOCATION 0 /LOCS 4,5&6 ARE RESERVED SO WE CAN USE OS/8 ODT *10 /CONSTANTS & NON-INDIRECT TEMPS STORED IN AUTO-XRS! QUOTE, 33 /QUOTE CHAR - SINGLE WORD SORT LIST ERR01, SERR, ERR /END OF LIST INRSIZ, 2 /4 IF 12K MACHINE NUMLNS, 3 /NUMBER OF LINES (+ AND -) TO DISPLAY ON VR12 SCOPE DX, 7577 /DISPLAY XR SXR, QPUT12-1/XR USED BY SEARCH PROCESSOR INXR, ASR33-1 /XR USED TO UNPACK INPUT BUFFER XR, ASR35-1 /WORK XR NMT, 0 /USED AS NUMBER TEMP AND SEARCH FAIL FLAG CFLG, 0 /COMMA FLAG CLNF, 0 /COLON FLAG TFLG, 0 /TRACE FLAG NFLG, 0 /NUMBER FLAG QFLG, 0 /QUOTED STRING FLAG M, 0 /NUMBER ARGS N, 0 NLINK, 0 /LINK AFTER ARITH OPERATIONS - TESTED BY "A AND "B CHAR, 0 /CHARACTER BUFFER ITRST, 0 /ITERATION FLAG ITRCNT, 0 /ITERATION COUNT MPDL, 0 /MACRO FLAG SCHAR, 0 /LAST CHAR SORTED FFFLAG, 0 /FORM FEED FLAG - 7777 IF FORM FEED SEEN ON THIS READ REND, 0 /INPUT END-OF-FILE FLAG SCANP, 0 /COMMAND LINE EXECUTION POINTER OSCANP, 0 /BACKUP FOR SCANP PDLP, PDLBEG /PUSH-DOWN-LIST POINTER QCMND, 0 /COMM LINE OR MACRO POINTER P, 0 /CURRENT PNTR TO TEXT BUFFER ZZ, 0 /END OF TEXT BUFFER POINTER Q, 0 /EXTRA BUFFER POINTERS IFNZRO .-47 <_ERROR_> R, 0 QP, 0 /Q REGISTER POINTER QZ, CHNSTR /END OF Q-REG POINTER Z7, CTLBEL, 7 CACR, 15 /CR CAHT, 11 /HT CAAM, 33 /ALT MODE CAFF, 14 /FF: END OF PAGE 13 /VT CALF, 12 /LF ERR07, NERR, ERR /END OF LIST RADIX, DRAD /RADIX TABLE POINTER - DRAD OR ORAD MQ, 0 DVT1, 0 ODEV, 0 /OUTPUT DEVICE NUMBER OUTHND, 0 INHND, 0 EBFLG, 0 /EDIT BACKUP FLAG QNMBR, 0 /LAST Q-REG REFERENCED QBASE, 0 /BASE OF CURRENT COMMAND LINE QLENGT, 0 /LENGTH OF CURRENT COMMAND LINE QPTR, 0 /POINTER TO Q-REGISTER CONTROL BLOCK ICRCNT, 0 /INPUT DOUBLEWORD COUNTER OCRCNT, 0 /OUTPUT " OPTR2, 0 /OUTPUT BUFFER POINTER INRCNT, 0 /NUMBER OF INPUT RECORDS LEFT OCMDLN, 0 /LENGTH OF OLD COMMAND LINE CDT, 0 KTYPE, TYPE /*ET SET TO PUTT IF NO CONVERSION TEMPT, 0 /TEMP. GET RID OF WHEN FIND ROOM ON PAGE MEMSIZ, 0 /HIGHEST MEMORY FIELD IN BITS 9-11 LASTC, 0 /LAST CHARACTER GOTTEN OUT OF COMMAND LINE /NFLG: 0'ED BY COMMANDS WHICH EAT ARGUMENTS OR DON'T RETURN / VALUES; SUCH AS C,R,J,L,^A,X,$,',>,'U,G,O AND / NON-COLON MODIFIED SEARCHES / SET TO -1 TO INDICATE THATWWE'VE SEEN A NUMBER /TECO PSEUDO-OPERATIONS PUSH= JMS I .; PUSHXX POP= JMS I .; POPXX /** MUST BE ONE MORE THAN "PUSH" PUSHJ= JMS I .; PUSHJY POPJ= JMP I .; POPJXX PUSHL= JMS I .; PUSHLX POPL= PUSHL /** POPL CALLED WITH POSITIVE AC ERR= JMS I .;ERROR,ERRXX SORT= JMS I .; SORTB RESORT= JMP I .; SORTA2 SCAN= JMS I .; SGET LISTEN= JMS I .; TYI TYPE= JMS I .; TYPCTV OUTPUT= JMS I .;OUTR, ERRXX /** MUST BE ONE MORE THAN "TYPE" /PROBABLY NOT ANY MORE (19-JUN-77) CRLF= JMS I .; TYCRLF GETQ= JMS I .; GETQX SKPSET= JMS I .; SETSKP NCHK= ISZ NFLG /USED TO BE A SUBROUTINE CALL CTCCHK= JMS I .; CHKCTC BZCHK= JMS I .; CHKBZ QCHK= JMS I .; CHKQF QSKP= JMS I .; QOVER QREF= JMS I .; QREFER QSUM= JMS I .; QSUMR QPUT= JMS I .; QPUTS QUOTST= JMS I .; QTST SETCMD= JMS I .; CMDSET GETN= JMS I .; NGET ADJQ= JMS I .; QADJ MQLDVI= JMS I .; DVIMQL UPPERC= JMS I .; CUPPER SCANUP= JMS I .; SCUPPR TSTSEP= JMS I .; SCHSRT DISPLY= JMS I .; DSPLAY NOTRCE= JMS I .; SAVTRA ENTRCE= JMS I .; RESTRA OVRLAY= JMS I .; OVERLY GETNUM= JMS I .; NUMGET /GET 13 BIT NUMBER INTO L,AC PUTT= JMS I .; TPUT PAGE /ENTER HERE TO USE AN ASR33 AS THE TELETYPE TECO, ISZ I SPUT /IF CALLED BY "R" OR "RUN" - CHANGED TO TLS TECO1, JMP I COMPAR /IF CALLED VIA "CHAIN" - CHANGED TO "JMP T0A" TBEL, JMS COMPAR /HERE ON ^G - 2 ^G'S KILL ENTIRE COMMAND T0, CRLF T0A, TAD (PDLBEG DCA PDLP /INITIALIZE PUSHDOWN LIST T1, TAD PDLP TAD (-PDLBEG SZA CLA ERR02, ERR /ERROR - PUSHDOWN LIST DID NOT BALANCE TAD (45 QREF /SET UP POINTERS TO COMMAND LINE TAD I [QPNTR DCA OCMDLN /SAVE OLD COMMAND LINE LENGTH /** SAVE ONLY IF < 20? ADJQ /REDUCE COMMAND LINE LENGTH TO 0 CLL PUSHJ NRET /CLEAR NUMBER AND LAST OPERATOR DCA CFLG DCA MPDL /DELETE MACRO FLAG DCA ITRST /ALSO ITERATION FLAG, DCA CLNF /AND COLON FLAG PUSHJ /KILL QUOTE FLAG ZROSPN /KILL QUOTE AND NUMBER FLAGS AND SCAN POINTER KCC /KILL ^O IF IN KEYBOARD BUFFER DCA I (CHOOPS /KILL FATAL ERROR RETURN TAD [52 SKP ROCMND, JMS I (BACKUP /BACK UP AND GET LAST CHAR TYPE T2M1, DCA CHAR /KILL CHAR TO PREVENT SPURIOUS DOUBLE CHARACTERS T2, LISTEN /BUILD COMMAND LINE SORT COMLST COMTAB-COMLST T2A, DCA CHAR JMS SPUT /PUT INTO C.L. BUFFER JMP T2 /GO GET ANOTHER TCTLU, TAD SCHAR TYPE /PRINT "^U" TCTLUP, JMS I (BACKUP TAD [-12 /CHECK FOR LF SZA CLA JMP TCTLUP /LOOP UNTIL LF IAC JMP I (TSP9 TCRLF, TAD CACR /CR IN COMM LINE DCA CHAR JMS SPUT /PUT INTO COMM LINE TAD CALF /THEN PUT IN A LF JMP T2A /AND GET SOME MORE /COMMAND EXECUTION LOOP TALTM, JMS COMPAR /2ND ALTM STARTS EXECUTION CRLF /START COMM EXECUTION CHTECO, TAD (45 /NUMBER OF INPUT COMMAND Q-REGISTER SETCMD /SET UP THE INPUT LINE AS THE CURRENT COMMAND LINE T6, SCANUP T6A, DCA CHAR /SAVE COMMAND CHAR TAD CHAR TAD (CDSP /ADD BASE OF DISPATCH TABLE DCA T7 /LOOK UP ENTRY IN TAD I T7 /COMMAND DISPATCH TABLE DCA T7 /CALL RECURSIVELY CLL PUSHJ T7, 0 /CALL TO ROUTINE CTCCHK /CHECK FOR ^C - ** AC MAY NOT BE 0 HERE ** CLA /CTCCHK LEAVES AC NON-ZERO TAD NFLG SPA CLA JMP T6 DCA N /IF WE ARE NOT ENTERING A NUMBER DCA NLINK /SET 13-BIT N TO 0 JMP T6 /KEEP INTERPRETING TQMK, TAD I ERROR SNA CLA /ERROR ROUTINE ENTRY POINT NON-ZERO? RESORT /NO STA /AN ERROR PRINTOUT DCA QLENGT /SET QLENGT BIG SO WE CAN ACCESS ENTIRE LINE NOTRCE /TURN TRACE OFF SCAN TYPE /PRINT OUT THE LINE WHICH CAUSED THE ERROR ISZ I ERROR /UP TO THE ERROR CHAR ITSELF JMP .-3 JMP T0 /RE-INITIALIZE CHUA, POP /^ COMMAND - POP OFF RETURN ADDRESS SCANUP /GET THE NEXT CHARACTER IN UPPER CASE AND [77 /MAKE IT A CONTROL CHARACTER JMP T6A /USE IT INSTEAD OF THE ^ COMPAR, TCINIT /LOOK FOR DOUBLED COMM LINE CHARS TAD SCHAR /MOST RECENT CIA TAD CHAR /PREVIOUS SZA CLA RESORT /NOT THE SAME JMS SPUT /PUT THE CHAR INTO THE COMMAND LINE AND ECHO IT JMP I COMPAR /SAME-SPECIAL HANDLING SPUT, JTECO /PUT CHAR INTO COMM LINE TAD QZ DCA QP TAD CHAR QPUT /STORE CHARACTER AWAY TAD I [QPNTR IAC ADJQ /ADJUST COMMAND LINE REGISTER LENGTH DCA I ERROR /CLEAR "ERROR JUST OCCURRED" FLAG TAD CHAR TYPE /TYPE THE INSERTED CHARACTER TAD I [QPNTR TAD CALF /12 SPA CLA JMP EMERG /TYPE BELL IF WITHIN 12 CHARACTERS OF 2048 CLL TAD QZ TAD QLIMIT SNL CLA /TYPE A BELL IF THE LINE IS JMP I SPUT / WITHIN 12 CHARS OF OVERFLOW EMERG, TAD Z7 TYPE JMP I SPUT QLIMIT, 12-QMAX PAGE /Q REGISTER PACK AND UNPACK /THE Q-REGISTERS ARE STORED IN THE UPPER 4 BITS OF THE WORDS /WHICH HAVE THE TEXT BUFFER CHARACTERS IN THEIR LOWER 8 BITS. /THEREFORE EACH Q-REGISTER CHARACTER TAKES 2 WORDS. QPUTS, 0 /STORE THROUGH POINTER "QP" AND BUMP POINTER CLL RTL RTL DCA GETQX /SAVE CHARACTER TAD QP CLL RAL DCA CHKCTC /COMPUTE CORE POINTER = 2*QP CDF 10 TAD GETQX JMS ST4BTS /STORE HIGH ORDER 4 BITS ISZ CHKCTC TAD GETQX CLL RTL RTL JMS ST4BTS /STORE LOW ORDER 4 BITS CDF 0 ISZ QP /BUMP POINTER JMP I QPUTS GETQX, 0 CLL RAL DCA CHKCTC /COMPUTE CORE POINTER = 2*AC CDF 10 TAD I CHKCTC AND [7400 /FETCH HIGH ORDER ISZ CHKCTC DCA QPUTS TAD I CHKCTC AND [7400 /FETCH LOW ORDER CLL RTR RTR TAD QPUTS /COMBINE TO FORM CHARACTER RTR RTR CDF 0 JMP I GETQX ST4BTS, 0 AND [7400 DCA POPXX TAD I CHKCTC AND [377 TAD POPXX DCA I CHKCTC /STORE HIGH ORDER JMP I ST4BTS CHKCTC, 0 /SUBROUTINE TO CHECK FOR ^C IN KEYBOARD CLA OSR /** AC MAY NOT BE 0 ON ENTRY DCA QPUTS /GET LOCATION FROM SWITCH REGISTER TAD I QPUTS 7421 /DISPLAY INDICATED LOCATION IN MQ C7600, 7600 /JUST IN CASE THERE IS NO MQ KSF JMP I CHKCTC /NO CHAR IN KEYBOARD BUFFER - EXIT KRS AND [177 /KILL PARITY BIT TAD [-20 /^P OUGHT TO GO AWAY SZA TAD CACR SZA /^C? JMP I CHKCTC /NO - RESUME WITH NON-ZERO AC ERR34, ERR /^C, EXECUTION ABORTED CTLC, TSF JMP CTLC /WAIT FOR TELETYPE TO DIE DOWN JMP I C7600 /RETURN TO OS/8 POPJXX, DCA GETQX /POPJ ROUTINE POP POPJXY, DCA POPXX TAD GETQX JMP I POPXX /PUSH DOWN LIST ROUTINES POPXX, 0 /POP ROUTINE CLA CMA TAD PDLP DCA PDLP TAD I PDLP JMP I POPXX PUSHXX, 0 /PUSH ROUTINE (DOESN'T AFFECT LINK) DCA I PDLP ISZ PDLP /BUMP PUSHDOWN POINTER TAD PDLP /CHECK FOR EXACTLY FULL - THIS ALLOWS THE TAD (-PDLEND SNA CLA /** ERROR ROUTINE TO DO A PUSHJ ERR04, ERR /FULL - REPORT IT JMP I PUSHXX PUSHJY, 0 /PUSHJ ROUTINE (DOESN'T AFFECT LINK) DCA GETQX IAC /** LINK SHOULD BE PRESERVED ON EXIT TAD PUSHJY PUSH TAD I PUSHJY JMP POPJXY PUSHLX, 0 /PUSH AND CLEAR A LIST CLL SMA /PUSH LIST IF AC<0, POP IT IF >=0 CMA STL DCA PUSHJY /SET COUNTER RAL /** DEPENDS ON FACT THAT POP=PUSH+1 ** TAD PUSHYY DCA PUSHYX /STORE EITHER A "PUSH" OR A "POP" POP /SAVE RETURN POINTER DCA CHKCTC PUSHLP, TAD I PUSHLX DCA GETQX TAD I GETQX PUSHYX, PUSH /PUSH OR POP DCA I GETQX /IF PUSHYX=PUSH, THIS ZEROES THE PUSHED LOCATION ISZ PUSHLX ISZ PUSHJY JMP PUSHLP TAD CHKCTC /RESTORE RETURN POINTER PUSHYY, PUSH JMP I PUSHLX TPUT, 0 /TELETYPE OUTPUT DCA TEMPT TPUTX, CTCCHK /CHECK FOR ^C OR ^P TAD (3-17 /INHIBIT PRINTING AS LONG AS THERE SNA /IS A ^O IN THE KEYBOARD BUFFER. JMP I TPUT TAD (17-23 /CHECK FOR ^S SNA CLA JMP TPUTX TSF /WAIT FOR TELETYPE FLAG TSFWT, JMP .-1 /WHILE WAITING, DISPLAY TEXT ON SCOPE TAD TEMPT TLS CLA JMP I TPUT PAGE /POINTER MOVING COMMANDS - C,R,J,L CHRJ, DCA NFLG /COMMAND J GETNUM /CAUSE NEG ARGUMENT TO GIVE A POP JMP CLOQ CHRR, GETN /GET LAST NUMBER, DEFAULT=(+ OR -)1 CHR1, CML CIA /NEGATE 13-BIT NUMBER SKP CHRC, GETN /GET LAST NUMBER, DEFAULT=(+ OR -)1 TAD P /OFFSET RELATIVE TO . / / *** LINK NOT ALWAYS SET RIGHT / CLOQ, BZCHK /SEE IF IN RANGE B,Z DCA P /IN RANGE DNN3, CDF 0 POPJ CHRL, GETN /GET LAST NUMBER, DEFAULT=(+ OR -)1 CHRL1, CDF 10 SZL SNA JMP LNEG CIA DCA CDT CHRLP, TAD P CIA TAD ZZ SNA CLA /IF WE ARE AT THE END OF THE BUFFER, JMP DNN3 /RETURN JMS I (CHLCMP /COMPARE CHARACTER AGAINST LINE FEED ISZ P JMP CHRLP /KEEP GOING UNTIL WE GET THERE OR OVERFLOW BUFFER LNEG, TAD (-1 DCA CDT CHRLM, CLA CMA CLL TAD P DCA P /MOVE POINTER BACKWARD 1 SNL JMP I (CHRLI /OOPS - PAST THE BEGINNING OF THE BUFFER - RETURN JMS I (CHLCMP /COMPARE CHARACTER AGAINST LINE FEED JMP CHRLM /NOT SATISFIED YET - KEEP LOOPING NUMGET, 0 /PUT 13-BIT NUMBER IN L,AC TAD NLINK CLL RAR TAD N JMP I NUMGET /D COMMAND AND PART OF ADJUST ROUTINE CHRD, ISZ CFLG /WAS THERE A COMMA? SKP /NO JMP NERR /YES, 2 ARGS TO D GETN /GET LAST NUMBER, DEFAULT=(+ OR -)1 SNL /SIGN BIT OF 13-BIT NUMBER IS IN LINK JMP PLUSND /+ND CLL CIA DCA CDT /-ND TAD CDT PUSHJ /DO (-)NC(+)ND CHR1 TAD CDT JMP PLUSND ADJ, SNA /ADJUST BUFFER + OR - N CHARS /TEST FOR NOTHING POPJ /GO AWAY STL /MOVE UP N CHARACTERS TAD ZZ /ADD TO MAX CHARACTER DCA R /NEW HIGHEST TAD R /SEE IF TOO HIGH TAD (-ZMAX SNL SZA CLA /TWO PLACES FOR OVERFLOW THERE ERR05, ERR TAD ZZ DCA Q TAD R DCA ZZ CDF 10 UPNL, TAD Q CIA TAD P SNA CLA /FINISHED? JMP DNN3 /YES CMA TAD Q DCA Q CMA TAD R DCA R TAD I Q /GET A CHAR L12K1, AND [377 /JMP .+5 IF 12K DCA CHLTMP TAD I R /BE CAREFUL NOT TO AND [7400 /DESTROY THE HIGH- TAD CHLTMP /ORDER 4 BITS J12K1= JMP . DCA I R /AND PUT IT IN THE LOW PART OF THE TARGET WORD JMP UPNL /K COMMAND AND MORE OF ADJUST ROUTINE CHRK, JMS I (NLINES /CONVERT LINES TO CHARS DCA CDT TAD M /SET POINTER DCA P /LOWER ARG TAD CDT PLUSND, SNA POPJ /IGNORE 0D ADJ2, CLL TAD P /MOVE DOWN N CHARACTERS SZL CLA CMA /DETECT GROSS OVERFLOWS /** CHECK BZCHK DCA Q /N IN AC TAD P DCA R CDF 10 DNN1, TAD ZZ CIA TAD Q SNA CLA /FINISHED? JMP DNN2 TAD I Q /GET A CHAR L12K2, AND [377 /JMP .+5 IF 12K DCA CHLTMP TAD I R /BE CAREFUL NOT TO AND [7400 /DESTROY THE HIGH- TAD CHLTMP /ORDER 4 BITS J12K2= JMP . DCA I R /AND PUT IT IN THE LOW PART OF THE TARGET WORD ISZ Q ISZ R JMP DNN1 DNN2, TAD R DCA ZZ JMP DNN3 CHLTMP, 0 /GO TO ADJ TO MOVE UP TEXT /GOTO ADJ2 TO MOVE DOWN TEXT /IN EITHER CASE, AC CONTAINS NUMBER OF CHARS TO MOVE (0-4095) ERR27, ERR /^W ERR35, ERR /^V PAGE /SEARCH SUBROUTINE - CALLED BY N, S, AND _ COMMANDS SEARCH, 0 DCA REPFLG /AC MAY BE NON-0 TO ALLOW A REPLACE GETN SZL SNA ERR29, ERR /NEG OR 0 ARG TO SEARCH CIA DCA CSN /GET NUMBER OF OCCURRANCES TO SEARCH FOR QCHK /GET REPLACEMENT FOR ALTMODE, IF ANY TAD (STABLE-1 DCA SXR /INITIALIZE XR TAD [-40 DCA CSP SGTLP, QUOTST /GET A CHARACTER FROM THE SEARCH STRING JMP SCHQUO /OOPS- NO MORE SORT /SEE IF ITS SPECIAL SCHLST SCHTAB-SCHLST SSTCHR, DCA I SXR /STORE THE CHAR IN THE SEARCH BUFFER ISZ CSP JMP SGTLP /LOOP ERR06, ERR /OOPS - SEARCH BUFFER FULL! SCHQUO, TAD CSP TAD [40 /A NULL SEARCH STRING MEANS USE THE SZA CLA /PREV CONTENTS OF THE SEARCH BUFFER, ELSE DCA I SXR /STORE TERMINATING 0 AND BEGIN THE SEARCH CSST, TAD P DCA CSP JMP CSF1 SCHINV, TAD CSNCL /^N, INVERT SKIP SENSE DCA CSWT CSL, TAD I SXR /GET A CHAR FROM THE SEARCH BUFFER SPA SNA JMP SCCOMD /NEGATIVE CHARS AND 0 ARE SPECIAL CIA CDF 10 TAD I P AND [377 CSWT1, CDF 0 CSWT, SZA CLA JMP CSF /FAIL TO MATCH ON THIS CHARACTER ISZ P CSG, TAD CSZCL DCA CSWT /RESTORE SEARCH TEST TAD ZZ CMA TAD P CSZCL, SZA CLA /CHECK FOR END OF BUFFER JMP CSL /NO DCA P CSZ, DCA NMT JMP I SEARCH /SEARCH SUBROUTINE - CONTINUED SCCOMD, DCA .+1 /SPECIAL CHARACTERS ARE JUMPS OR 0 HLT /0 FALLS THROUGH INTO TERMINATION CODE ISZ CSN /GET NTH OCCURRENCE JMP CSF /MORE TO GO CMA JMP CSZ /GOT IT CSF, ISZ CSP /INDEX P CSF1, TAD (STABLE-1 DCA SXR /INITIALIZE AUTO - INDEX TAD CSP DCA P JMP CSG /SEARCH STRING MODIFIERS ^N,^Q,^S, AND ^X SCHTAB, JMP SCHINV /^N: ANYTHING BUT SCHCTQ /^Q: LITERALLY JMP SCHSEP /^S: ANY SEPARATOR JMP CSWT1 /^X: ANYTHING SCHCTQ, SCAN /GET THE NEXT CHARACTER JMP SSTCHR /AND STORE IT IN PLACE OF THE ^Q SCHSEP, CDF 10 /^S, LOOK FOR SEPARATOR TAD I P AND [377 TSTSEP /SHARED SORTING ROUTINE SKP CMA /SET AC = -1 IF NON-SEPARATOR JMP CSWT1 /GO CHECK RESULTS FN, DCA CNXT STA JMP CHRN1 /S,N AND _ COMMANDS (ALSO FS AND FN) FS, STA /CHANGE S TO FS CHRS, JMS SEARCH /S COMMAND - DO A SEARCH CHKREP, ISZ REPFLG /WAS THERE A REPLACE SPECIFIED? JMP CHKCLN /NO - CHECK FOR COLON QSKP /COUNT UP STRING 2 TAD NMT SMA CLA JMP CHKCLN /FAILED, SET VALUE & EXIT TAD CSP /FIGURE OUT OFFSET TO FAKE OUT "I" ROUTINE CIA /SO THAT WE HAVE THE RIGHT INSERTION COUNT TAD P /BUT THE SIZE OF THE HOLE WE NEED DCA DVT1 /IS DECREASED BY THE LENGTH OF THE SEARCH STRING. TAD CSP /RESET DCA P /TEXT POINTER PUSHJ /INSERT CIL2 /STRING 2 CHKCLN, DCA REPFLG /CLEAR REPLACE FLAG TAD NMT PUSHJ /FORM NUMBER FROM "NMT" NNEW13 /(APPLYING OPERATOR, IF NECESSARY) ISZ CLNF /WAS THERE A COLON ON THIS SEARCH? SKP /NO JMP I [IREST /YES - GO AWAY REGARDLESS OF RESULTS DCA CLNF /RESET COLON FLAG TO 0 ISZ N /DID WE SUCCEED? JMP I (CFSI /NO - SIMULATE A SEMICOLON DCA NFLG /YES - HOWEVER, NO COLON MEANS NO RESULT JMP I [IREST CHBA, CLA IAC /_ COMMAND CHRN, DCA CNXT /N COMMAND - SET OUTPUT FLAG CHRN1, JMS SEARCH /DO A SEARCH TAD REND CIA TAD ZZ CSNCL, SNA CLA /HAVE WE REACHED END-OF-FILE? JMP CHKREP /YES - STOP AND ASSIGN VALUE TAD NMT SZA CLA /HAVE WE SUCCEEDED? JMP CHKREP /YES - STOP AND ASSIGN VALUE TAD CNXT JMS I [NXTBUF /GET NEXT BUFFER JMP CSST /KEEP SEARCHING - RETURN TO CHRN+2 CNXT, 0 /OUTPUT FLAG CSP, 0 /TEMP P CSN, 0 REPFLG, 0 /REPLACE FLAG (-1 MEANS REPLACE) PAGE /NUMBER PROCESSORS: /COMMANDS B,H,Z,. AND DIGITS NMBR, TAD CHAR /NUMBER FOUND IN COMMAND STRING TAD [-60 NMBR2, DCA NMT CLL NCHK /CHECK NUMBER FLAG JMP NNEW /NOT UP, NEW OPERAND TAD DOPR DCA NOPR /USE SAME OPERATOR AS FOR THE PREVIOUS DIGITS TAD NP /MULTIPLY PREV DIGITS BY 10 CLL RTL NMRBAS, TAD NP /REPLACED BY "NOP" FOR OCTAL CLL RAL /** COULD CHECK FOR OVERFLOW IN THIS AREA NNEW, TAD NMT NCOM, DCA NP /CURRENT NUMBER / RAL / DCA NEWLNK / TAD NEWLNK /GET NEW LINK / CLL RAR /INTO LINK NCOM2, TAD NP NOPR, SKP /DISPATCH JUMP FOR OPERATOR CML CIA TAD NACC /CURRENT EXPRESSION VALUE DCA N RAL TAD NACCLK /ADD IN OLD LINK RAR SKP CLA NRET, DCA N RAL DCA NLINK /SAVE LINK FOR POSSIBLE COMPARISON TEST TAD NOPR DCA DOPR TAD NULLOP DCA NOPR /SET OPERATOR TO NULL OP STA JMP DCPOPJ /SET NUMBER FLAG AND EXIT CCPR, STL CLA RTL /2 POPL NOPR NACC NACCLK GETNUM JMP NCOM /COMBINE OLD NUMBER AND PARENTHESIZED RESULT COPR, MTHREE PUSHL NACCLK NACC NOPR DCA N DCA NLINK JMP CPLS /CLEAN OUT INSIDE PARENS CDOT, TAD P /COMMAND . /** COULD CAUSE ERROR IF NFLG SET JMP NCOMCL /NEWLNK, 0 /COMMANDS &,#,/,*,-,+,(,) CAMP, MTWO /*K* LOGICAL AND ** CNBS, TAD (NIOR-NDIV /LOGICAL OR CVIR, TAD (NDIV-NMPY /DIVISION CAST, TAD (NMPY&177+5200-7400 /MULTIPLICATION CMIN, TAD [7400-SKP /SUBTRACTION CPLS, TAD (SKP /ADDITION DCA NOPR /COMMON TO ALL NUMERIC OPERATORS TAD N DCA NACC TAD NLINK DCA NACCLK DCA NP DCPOPJ, DCA NFLG /CLEAR NUMBER FLAG POPJ NAND, AND NACC /BITWISE AND OF BINARY NUMBERS JMP NRET /** KEEP THESE TWO OPNS TOGETHER NIOR, CMA /BITWISE OR OF BINARY VALUES AND NACC TAD NP NULLOP, JMP NRET NACCLK, 0 /LINK OF EXPRESSION WITHOUT NP NMPY, CIA /*** REALLY OUGHT TO IMPLEMENT 13-BIT MULTIPLY DCA ND TAD NACCLK RAR /SET UP OLD LINK TAD NACC ISZ ND JMP .-2 JMP NRET NACC, 0 /VALUE OF EXPRESSION WITHOUT NP NDIV, DCA ND TAD NACC MQLDVI ND, 0 JMP NRET /COMMANDS ^F,^^,^Z,^V, Q AND %, ^D, ^O CTLF, CLA OSR SKP /^F COMMAND - VALUE OF CONSOLE SWITCHES CTUA, SCAN /^^ COMMAND - VALUE OF NEXT CHAR IN COMMAND LINE NCOMCL, CLL JMP NCOM /GO INTO NUMBER PROCESSOR /CTLZ, TAD QZ /COMMAND ^Z / JMP NCOM /RETURN NUMBER OF CHARACTERS IN ALL Q-REGS. /CTLV, TAD (VERSN /^V COMMAND - RETURNS THE CURRENT VERSION NUMBER /NCOM14, CLL / JMP NCOM CTLD, TAD [4 /SET RADIX DECIMAL CTLO, TAD (ORAD /SET RADIX OCTAL DCA RADIX TAD I RADIX DCA NMRBAS /EITHER "NOP"(8) OR "TAD NP"(10) POPJ DOPR, 0 /PREVIOUS OPERATOR NP, 0 /VALUE OF CURRENT NUMBER SCPTAB, BBELL BCR BCR /TAB EASYRO /ALT BFF BVT BLF CTLN, TAD REND CMA JMP I (NNEW13 CQSM, TAD TFLG CMA /TRACE FLAG ALTERNATES BETWEEN 0 AND 7777 DCA TFLG POPJ FTAB, FN FS FLST, 116 /FN 123 /FS CHRF, SCANUP /COMMAND F SORT FLST FTAB-FLST ERR31, ERR /BAD F COMMAND CCLN, STA /: COMMAND - SET VALUE FLAG DCA CLNF POPJ /SO NEXT SEARCH WILL HAVE A NUMERIC VALUE PAGE /CURSOR RIGHT IS $C /CURSOR UP IS $A /ERASE LINE IS $K BUGFLG, 0 /-1 MEANS MUST RETYPE LINE ON NEXT RUBOUT BSP, 0 TAD TTY10 PUTT /TYPE BS, SPACE, BS TAD TTY40 PUTT TAD TTY10 PUTT STA TAD I (COLCT /FIX UP COLUMN COUNTER DCA I (COLCT JMP I BSP SCOPY, JMS I (BACKUP /BACK UP ONE CHAR IN CMD LINE TAD [-40 /LOOK AT CHAR WE BACKED OVER SMA JMP EASYRO /IT'S EASY TO RUB THIS ONE OUT TAD [40 /RESTORE CHARACTER SORT CTLBEL SCPTAB-CTLBEL BBELL, CLA JMS BSP /^X NEEDS TWO RUB OUTS EASYRO, CLA ISZ BUGFLG /MAYBE WE REALLY SHOULD REPRINT LINE TTY10, SKP /NOT NECESSARY JMP BCR /NECESSARY (PREVIOUS VERTICAL MOTION MAY /HAVE SCROLLED OFF TOP OF SCREEN) JMS BSP /RUB IT OUT SCOPGO, DCA BUGFLG JMP I (T2M1 BCR, JMS BELLSP /REPRINT LINE JMS I SCAPE 113 /ERASE LINE JMP SCOPGO BLF, TAD CTLBEL /CURSOR UP 1 BFF, TAD (-4 /CURSOR UP 8 BVT, TAD (-4 /CURSOR UP 4 DCA BSP JMS I (ESCAPE 101 /CURSOR UP ISZ BSP JMP .-3 TTY40, STA JMP SCOPGO TSTAR, DCA BCHAR TSPACE, TAD CHAR /LOOK AT PREVIOUS CHARACTER TAD (-7 SZA CLA /WAS IT ^G ? RESORT /NO STA /YES TSP9, TAD I [QPNTR /REDUCE CMD LINE BY 1 CHAR ADJQ /I.E. GET RID OF ^G JMS BELLSP JMP I (T2M1 BELLSP, 0 BLSP1, CRLF /TAD CACR BLSP2, NOP /TYPE TAD MQ DCA SAVMQ DCA MQ TAD QZ /START FROM END OF COMMAND LINE LFBLP, DCA QP /AND SEARCH FOR LF STA TAD MQ /COUNT HOW MANY DCA MQ STA TAD QP SPA JMP LFSTAR /AT BEGIN OF CMD LINE GETQ TAD BCHAR /LOOK FOR LF SNA CLA /IS IT LF? JMP LFB /YES STA /NO TAD QP /BUMP BACK ONE MORE CHAR JMP LFBLP LFSTAR, CLA TAD [52 /PRINT ANOTHER * TYPE LFB, PUSHJ COLG4 /REPRINT LINE TO END OF CMD LINE TAD SAVMQ /RESTORE MQ DCA MQ BLSP3, NOP /JMS I SCAPE BLSP4, NOP /113 TAD [-12 DCA BCHAR /SET UP FOR NEXT TIME KCC /CLEAR OUT ^O OR ^S JMP I BELLSP SAVMQ, 0 BCHAR, -12 /CHAR WE'RE SEARCHING BACKWARDS FOR SCAPE, ESCAPE SORTB, 0 /SORT AND BRANCH ROUTINE DCA SCHAR /SAVE SORT CHAR STA TAD I SORTB /GET POINTER TO LIST ISZ SORTB DCA XR SORTA1, TAD I XR /GET ITEM IN TEST LIST SPA /END MARKED BY NEG VALUE JMP SORTA2 /FELL OUT BOTTOM CIA STL TAD SCHAR SZA CLA /COMPARE SORT CHAR JMP SORTA1 /NOT IT. TAD XR /GOT IT. NOW MAKE INDEX TAD I SORTB /TO JUMP TABLE DCA COUNT /THIS IS TABLE POINTER TAD I COUNT /GET JUMP ADDRESS FROM TABLE SPA /IF IT IS NEGATIVE, JMP SORTA3 /ITS NOT A JUMP ADDRESS - ITS A VALUE DCA COUNT CLA CLL JMP I COUNT SORTA2, CLA CLL /FELL OUT BOTTOM TAD SCHAR /CARRY CHARACTER BACK TO SORTA3, ISZ SORTB JMP I SORTB /DO SOMETHING ELSE CSMC, SCANUP /GET NEXT CHARACTER IN UPPER CASE AND [77 /MAKE IT A CONTROL CHARACTER DCA SCHAR JMP SORTA1 /SUBSTITUTE IT FOR THE UPARROW COUNT, 0 PAGE /COMMANDS P AND T CHRP, JMS POKE /LOOK AHEAD ONE CHARACTER UPPERC /BUT IN UPPERCASE TAD (-127 /SEE IF IT'S "W" DCA TEMPT /SAVE KNOWLEDGE AS FLAG TAD TEMPT SNA CLA SCAN /PASS UP W CLA /CLEAR W FROM AC TAD CFLG SPA CLA /IS THIS COMMAND M,NP? JMP CHRW /YES - TREAT LIKE M,NPW GETN /COMMAND P - GET # OF PAGES SZL SNA ERR25, ERR /NEG OR 0 ARG TO P CIA DCA CPCT CPOA, PUSHJ CPOC /DO N<HPY> TAD TEMPT /IS NEXT CHARACTER W? SNA CLA JMP NOYANK /YES / TAD REND /IF WANT P TO CREATE FF'S / SZA CLA /WHEN NO MORE INPUT FILE ISZ FFFLAG /NO, SAW FF? JMP NOFF /NO TAD CAFF /YES OUTPUT /OUTPUT FF NOFF, DCA ZZ /FORCE Y COMMAND TO WORK PUSHJ CHRY /WHOEVER THOUGHT OF THE PW COMMAND SHOULD BE SHOT YANKY, ISZ CPCT JMP CPOA POPJ CPCT, 0 POKE, 0 /RETURN NEXT CHARACTER (BY LOOKING AHEAD) TAD QLENGT CIA CLL TAD SCANP SZL CLA /MAKE SURE WE HAVEN'T RUN OFF END OF COMMAND LINE JMP I POKE /RETURN 0 IF NO CHAR TAD SCANP TAD QBASE GETQ JMP I POKE /LEAVE CHAR IN AC NOYANK, TAD CAFF /NPW OUTPUTS FFS OUTPUT JMP YANKY CPOC, PUSHJ CHRH CHRW, TAD (OUTPUT CHRT2, DCA CWOUT /W AND T COMMANDS - SAME THING, DIFFERENT DEVICES JMS NLINES /CONVERT LINES TO CHARS CWOA, CMA DCA NLINES /SET CHARACTER COUNT TAD NLINES CIA MQLDVI /COMPUTE HOW MANY WORDS THIS OUTPUT WILL USE 6 /(BY TAKING 2/3 OF THE NUMBER OF CHARACTERS, CLL CML RTL / BU THAT'S SLOW SO WE TAKE 4/6 AND ROUND) JMS I (FITS /DETERMINE WHETHER THE OUTPUT WILL FIT ERR17, ERR /NO - TELL THE USER CLA /CLEAR CRAP FROM AC JMP CWOC CWOB, CDF 10 TAD I M AND [177 CDF 0 CWOUT, 0 /TYPE, OUTPUT, OR QPUT ISZ M CWOC, ISZ NLINES /DONE? JMP CWOB /NO POPJ CHRT, TAD KTYPE JMP CHRT2 /X COMMAND AND LINES-TO-CHARACTER CONVERTOR CHRX, QREF /COMMAND X JMS NLINES /CONVERT LINES TO CHARS ADJQ /ADJUST Q-REGISTERS AND SET UP NEW LENGTH. TAD (QPUT DCA CWOUT /SET OUTPUT ROUTINE TO STORE INTO Q REG TAD MQ /LOAD THE CHARACTER COUNT JMP CWOA /GO TO TEXT OUTPUTTER NLINES, 0 /CONVERT + OR - N LINES AROUND . TO CHARS M,N ISZ CFLG /WAS THERE A COMMA? SKP /NO JMP MFROMN /YES - DON'T CONVERT LINES TO CHARS TAD P DCA M DCA CFLG /V3C PUSHJ /CHRL DOES A "GETN" CHRL /TO GET THE DEFAULT VALUES OF N TAD P DCA N TAD M DCA P MFROMN, DCA NFLG /CLEAR NFLG IN CASE COMMA FLAG WAS ON CLL /M AND N ARE KNOWN TO BE 12-BITS LONG /AND POSITIVE TAD N BZCHK /IS N OK? CMA CLL /YES - COMPUTE N-M TAD M /BY COMPUTING M-N-1 CMA /AND COMPLEMENTING IT SNL /IS M>N? JMP I NLINES /NO - RETURN N-M TAD M /N-M+M=N NOW IN AC. DCA CPCT /INTERCHANGE M AND N TAD M DCA N TAD CPCT DCA M JMP MFROMN /COMMANDS ; < AND > CFSI, TAD ITRST SNA CLA ERR24, ERR /FAILING SEARCH NOT IN ITERATION CSEM, OVRLAY QOVRLY CSEMO / ^A ROUTINE CTLA, TAD KTYPE CEXP, DCA WHERTO TAD CHAR DCA QUOTE /TERMINATING CHAR SAME AS COMMAND CHAR DCA NFLG /KILL NUMBER IF PRESENT CTLALP, QUOTST JMP I [IREST WHERTO, 0 /TYPE OR IGNORE THE CHARACTER CLA JMP CTLALP PAGE /COMMANDS A AND Y CHRA, NCHK /COMMAND A JMP CHAA GETNUM TAD P DCA R SZL JMP I (ERR11 /ERROR IF POINTER OFF PAGE CDF 10 TAD R CMA CLL TAD ZZ /RETURN 'POP' IF POINTER OUTSIDE RANGE [0,Z-1] SNL CLA /OTHERWISE VALUE OF CHARACTER AT POINTER POSITION JMP I (ERR11 /POP TAD I R AND [377 CDF 0 NCOM14, CLL JMP I (NCOM CHRY, TAD NFLG SZA CLA ERR18, ERR /NUMERIC ARGUMENT TO Y TAD OUTR CIA TAD ERROR SZA CLA TAD ZZ YSKP, SZA CLA /CHANGE TO SKP CLA TO NEVER ABORT Y COMMAND ERR32, ERR /Y COMMAND ABORTED DCA ZZ DCA P /WIPE OUT THE BUFFER CHAA, TAD (ZMAX-1 AND REND CIA CLL TAD ZZ /IF WE HAVE ALREADY SEEN THE INPUT EOF, SZL CLA /OR IF WE'RE ALREADY FULL (OR NEARLY SO) JMP APLF /GET OUT DECGET, ISZ ICRCNT JMP I2 /NO NEED TO READ CLL TAD INRSIZ TAD INRCNT STECO1, SNL /"SKP!CLA" FOR SUPERTECO DCA INRCNT /UPDATE RECORD COUNT LFTAB, CLL CML CMA RTR /IF WE OVERFLOWED THE END OF THE FILE, ! RTR /5 ENTRY TABLE: MUST BE - - - + + ! RTR /SHORTEN THE READ BY THE CORRECT AMOUNT ! TAD INCTLW / ! DCA INCTRL /SO THAT WE WILL NOT READ TOO FAR ! JMS I INHND I3, INCTRL, 0400 BUFIN, IN /6200 IF 8K, 5600 IF 12K IBLK, 0 SMA CLA SKP JMP INER /IGNORE END-OF-FILE ERRORS, WE'LL SEE THE ^Z. TAD IBLK TAD INRSIZ /BUMP RECORD NUMBER BY THE MAXIMUM NUMBER DCA IBLK /(IF WE READ SHORT ITS THE LAST ONE ANYWAY) CLA CMA TAD BUFIN DCA INXR /SET UP INPUT XR TAD INPCNT DCA ICRCNT MTHREE DCA I3 I2, NOP /CDF 20 IF 12K ISZ I3 JMP I1 /NORMAL CHARACTER MTHREE /WEIRD CHARACTER-RESET SWITCH DCA I3 MTWO TAD INXR DCA INXR /MOVE INPUT XR BACK TO BEGINNING OF DBLWORD TAD I INXR AND [7400 DCA FFFLAG /TEMP TAD I INXR AND [7400 CLL RTR RTR TAD FFFLAG CLL RTR RTR SKP I1, TAD I INXR IC, NOP /CDF 0 IF 12K AND [177 /MASK OFF GARBAGE /INPUT CHARACTER IN AC SZA TAD (-177 SNA /IGNORE BLANK TAPE AND RUBOUTS JMP DECGET TAD (177-32 STECO2, SNA /"SKP" FOR SUPERTECO JMP APFS /IT'S A ^Z TAD (16 SNA JMP APFF /ITS A FORM FEED TAD CAFF /RESTORE CHAR CDF 10 DCA MQ /SAVE CHAR TAD I ZZ /PROTECT HIGH- AND [7400 /ORDER BITS TAD MQ /OF TARGET DCA I ZZ /STORE CHAR IN BUFFER TAD MQ CDF 0 ISZ ZZ TAD [-12 SNA CLA /IF THE CHAR IS A LINE FEED, TAD (-310 /CHECK THAT THE BUFFER IS NOT NEARLY FULL JMP CHAA APFS, DCA REND /SIGNAL END OF FILE SKP APFF, STA APLF, DCA FFFLAG /SET FORM FEED FLAG POPJ INER, DCA REND /INHIBIT FUTURE INPUTS ERR15, ERR INCTLW, 401 /1021 IF 12K MACHINE INPCNT, 6400 /5000 IF 12K MACHINE PAGE /TELETYPE ROUTINES TYPCTV, 0 /TELETYPE STUFFER SORT CTLBEL CTLTAB-CTLBEL DCA SCHAR /STORE (POSSIBLY TRANSLATED) CHAR OUTCC, TAD SCHAR ISZ COLCT /BUMP COLUMN COUNTER AND [7740 SZA CLA /IS THE CHAR A CONTROL CHARACTER? JMP NOCON /NO TAD (136 PUTT /OUTPUT "^" ISZ COLCT TAD [100 OUTLF, TAD SCHAR OUTLF1, PUTT JMP I TYPCTV COLCT, 0 OUTCR, DCA COLCT /RESET CHAR COUNT JMP OUTLF OUTVT, TAD [4 OUTFF, TAD [7770 /FORM FEED IS 8 LINE FEEDS, VERT TAB IS 4 DCA COLCT /*** BUG ASR33, TAD CALF /SIMULATE FORMFEEDS AND VERT TABS WITH LINEFEEDS JMP OUTCOM /*K* 8 LOCS AT ASR33 OVERLAYED BY ASR35 CODE OUTHT, TAD COLCT /COLUMN COUNTER, MOD 8 AND [7 TAD [7770 /SIMULATE TABS WITH SPACES DCA COLCT 40 /TAKE UP SPACE SO ASR-35 ROUTINE WILL JUST FIT TAD .-1 /USE SPACES FOR TABS OUTCOM, PUTT /PUT ONE OUT THE ISZ COLCT /WINDOW JMP I (TPUTX /STILL MORE INSIDE JMP I TYPCTV NOCON, TAD SCHAR AND [100 EU1, SNA CLA /*EU SET TO CLA IF EUFLAG < 0 (NO CASE FLAGGING) JMP OUTLF /NOT ALPHANUMERIC EU2, NOP /*EU SET TO TAD [40 IF EUFLAG>0 (FLAG UPPER CASE) TAD SCHAR AND [40 SNA CLA JMP OUTLF TAD SQUO PUTT ISZ COLCT TAD SCHAR AND [137 JMP OUTLF1 /OUTPUT UPPER CASE VERSION OUTBEL, TAD SCHAR PUTT JMP OUTCC /ROUTINE TO MANIPULATE Q-REGISTER STORAGE /*** ALLOW : TO MEAN APPEND TO Q-REGISTER /APPLIES TO X AND ^U COMMANDS /MAKE SURE CMD LINE AND ^S ZERO CLNF QADJ, 0 SPA JMP ERR12 /STRING TOO LONG FOR Q-REGISTER DCA MQ /SAVE NEW LENGTH OF Q-REGISTER QSUM /COMPUTE POINTER TO CURRENT Q-REGISTER AC3777 AND I QPTR TAD QP DCA R AC3777 AND I QPTR /GET ITS CURRENT LENGTH CIA CLL TAD MQ /COMPUTE DIFFERENCE SNL /ADJUST Q-REGS JMP QDNN /TO HOLD NEW STRING SNA /CHECK FOR ZERO JMP QADJDN /NOTHING TO DO TAD QZ /MOVE Q-REGISTERS UP TO INSERT CHARS DCA QP /(LINK IS 1 FROM PREVIOUS SNL) TAD QP TAD MQMAX /SEE IF OUT OF BOUNDS SNL CLA /TWO PLACES TO TOGGLE LINK THERE ERR12, ERR /GETTING TOO FULL TAD QZ DCA Q TAD QP DCA QZ ISZ QP QUPL, TAD Q CIA SQUO, TAD R /DOUBLES AS ASCII FOR ' SNA CLA JMP QADJDN CMA TAD Q DCA Q MTWO TAD QP DCA QP TAD Q GETQ QPUT JMP QUPL QDNN, TAD R /MOVE Q-REGS DOWN TO ABSORB CHARACTERS DCA QP QDNN1, TAD QZ CIA TAD R /-NUMBER OF CHARS TO MOVE SNA CLA /DONE? JMP QDNNF /YES TAD R GETQ QPUT ISZ R JMP QDNN1 /LOOP AGAIN QDNNF, TAD QP /SET NEW VALUE DCA QZ /OF HIGHEST CHAR QADJDN, STL CLA RAR /4000 AND I QPTR /SAVE HIGH ORDER PART TAD MQ DCA I QPTR /SAVE NEW LENGTH OF Q-REGISTER IN Q-REG TABLE TAD QCMND /SET UP COMMAND LINE AGAIN SETCMD /AS IT MAY HAVE BEEN SHUFFLED. QSUM /RECOMPUTE POINTER TO BEGINNING OF NEW Q-REG JMP I QADJ MQMAX, -QMAX QOVER, 0 /SUBROUTINE TO SKIP TO END OF STRING QCHK /GET THE QUOTE CHARACTER (IF ANY) TAD SCANP DCA OSCANP /SAVE BACKUP SCAN POINTER QOVERL, QUOTST JMP I QOVER /FOUND AN ALTM OR EQUIVALENT - RETURN JMP QOVERL /NOT END - SKIP ANOTHER CHAR PAGE /Q-REGISTER SUBROUTINES QSUMR, 0 /COMPUTE POINTER TO Q-REG SNA TAD QNMBR /NORMALLY USES QNMBR, BUT CAN BE OVERRIDDEN BY AC CIA DCA QKNT DCA QP TAD (QARRAY /BASE ADDR OF Q-REG POINTERS DCA QPTR JMP QSUMB QSUML, AC3777 AND I QPTR /ADD # OF CHARS IN LOWER REG TAD QP DCA QP ISZ QPTR /SKIP VALUE WORD ISZ QPTR /POINT TO NEXT Q-REG QSUMB, ISZ QKNT /REACHED OUR Q-REGISTER YET? JMP QSUML /NO - ADD IN ANOTHER JMP I QSUMR QKNT, 0 SGET, 0 /SCAN COMMAND LINE OR MACRO SGET1, CLA /** CALLED WITH AC NON-ZERO ** TAD QLENGT CIA CLL TAD SCANP SZL CLA /CHECK THAT WE ARE STILL INSIDE THE COMMAND LINE JMP SGOVFL /NO - COMMAND DONE TAD SCANP /GET CHARACTER POSITION IN LINE TAD QBASE /ADD IT TO THE ADDRESS OF THE LINE GETQ /AND GET THAT CHARACTER. DCA LASTC TAD TFLG AND LASTC /IF THE TRACE FLAG IS ON, SZA TYPE /PRINT THE CHAR TAD LASTC ISZ SCANP /INCREMENT CHARACTER POINTER AFTER FETCH JMP I SGET /RETURN SGOVFL, TAD MPDL /"MPDL" IS THE PUSHDOWN POINTER ON ENTRY TO THIS SNA /MACRO. IF IT IS 0, WE ARE NOT IN A MACRO JMP I (T1 /SO RETURN TO THE USER TAD PDLP /CHECK THAT THE ENDING POINTER IS THE SAME IAC SZA CLA /AS THE ENTRY ONE - OTHERWISE WE HAVE ERR13, ERR /SCREWED UP SOMEHOW (EG WE ARE POP / IN THE MIDDLE OF A COMMAND) DCA SCANP POP DCA ITRST POP /RESTORE THE PREVIOUS VALUES OF DCA MPDL /MPDL, THE SCAN POINTER AND THE COMMAND LINE POP /POINTER FROM THE PUSHDOWN LIST SETCMD JMP SGET1 /AND FETCH A CHARACTER FROM THE UPPER LEVEL. CMDSET, 0 /SUBROUTINE TO SET UP COMMAND LINE POINTERS DCA QCMND /STORE IN COMMAND LINE NUMBER TAD QCMND QSUM TAD QP /GET FIRST LOCATION IN COMMAND LINE DCA QBASE /AND STORE IN "QBASE" AC3777 AND I QPTR DCA QLENGT /STORE THE LINE LENGTH IN "QLENGT" JMP I CMDSET /RETURN QREFER, 0 /SET UP POINTERS FOR Q-REG REFERENCE SZA JMP QREFEX /AHA - WE ALREADY HAVE THE Q-REGISTER SCANUP /GET Q-REGISTER IDENTIFIER DCA QNMBR TAD QNMBR TSTSEP /TEST FOR ALPHANUMERIC (LOWER CASE LEGAL) ERR03, ERR /OOPS - BAD Q-REGISTER REFERENCE TAD QNMBR TAD [7700 SPA /NUMERIC? TAD Z7 /YES - FORCE NUMBERS UP TO ABUT LETTERS TAD CALF /FORCE IDENTIFIER INTO THE RANGE 1-44 (OCTAL) QREFEX, DCA QNMBR /STORE AWAY NUMBER FOR FURTHER REFERENCE QSUM /COMPUTE QP AND QPTR JMP I QREFER /RETURN CDBQ, OVRLAY QOVRLY /READ IN Q-OVERLAY CDBQO CHRO, OVRLAY /READ IN Q-OVERLAY QOVRLY CHROO OVERLY, 0 TAD I OVERLY /GET LOCATION TO CHECK ISZ OVERLY DCA TMP TAD I OVERLY DCA OVERLY /SET RETURN ADDRESS TAD I TMP /IS OUR OVERLAY IN CORE? SNA JMP I OVERLY /YES, BRANCH INTO IT DCA TMP /NO, SET BLOCK TO READ IN /** THE NEXT 5 WORDS ARE MODIFIED IF WE HAVE MORE THAN 12K OVREAD, JMS I (7607 /CALL SYSTEM HANDLER 0200 /READ 2 PAGES 3200 /INTO 3200 TMP, 0 /FROM THIS BLOCK HLT /ERROR READING OVERLAY JMP I OVERLY /GO TO NEXT SPOT CTLTAB, OUTBEL /BELL OUTCR POUTHT, OUTHT 4044 /$ WITH SIGN BIT ON OUTFF OUTVT OUTLF ALTTAB, 4033 4033 /ALTMODE WITH SIGN BIT ON CATS, STA /@ COMMAND - FAKE OUT "IREST" IREST, DCA QFLG /RESET QUOTED STRING FLAG TAD CAAM DCA QUOTE /RESET QUOTE CHAR TO ALTMODE POPK, POPJ /RETURN QTST, 0 /SUBROUTINE TO GET A CHAR AND TEST FOR ALTMODE SCAN SORT QUOTE QTST-QUOTE /RETURN IF QUOTE FOUND ISZ QTST JMP I QTST /SKIP-RETURN WITH AC INTACT IF NOT FOUND /COMMANDS ^U AND E - ALSO ERROR ROUTINE CTLU, OVRLAY FOVRLY CTLUO PAGE ERRXX, ERR30+1 /ENTRY POINT ALSO SERVES AS A FLAG FOR "TQMK" KCC /CLEARS AC CDF 0 /JUST IN CASE TAD I ERRXX /GRAB SIGNAL '0' NOW DCA ERRTMP /BEFORE OVERLAY MIGHT DESTROY IT OVRLAY /GO TO ERROR OVERLAY EOVRLY ERRYY ERRRET, TAD ERRTMP /GET THE LOCATION AFTER THE CALL SNA CLA /IF IT'S ZERO AND WE WERE CHAINED TO, CHOOPS, NOP /ITS A FATAL ERROR - JMP CTLC FATALJ= JMP I (CTLC CTRLP, TAD SCANP CIA DCA ERRXX /SET ERRXX TO CHAR POSITION OF ERROR CHAR. KCC /ZAP KEYBOARD FLAG JMP I (T0 /CONTINUE AS NORMAL UNLESS USER TYPES "?" CHRE, SCANUP /COMMAND E DCA TYI TAD TYI SORT EFLST EFTAB-EFLST CLA OVRLAY FOVRLY CHRED ERRTMP, 0 /MUST BE INITIALLY 0 /COMMANDS I AND <TAB> CHRI, NCHK /I COMMAND JMP CIL1 TAD N /INSERT CHAR WHOSE VALUE IS N JMS UPOC /*** CHECK FOR $ POPJ CTLI, DCA QFLG /CANNOT BE QUOTED / CLA CMA /FOR TAB INSERT / TAD SCANP / DCA SCANP /BACK UP SCAN POINTER BY ONE / /*** THIS IS A BUG TAD CAHT /TAB JMS UPOC CIL1, QSKP /COUNT LENGTH OF INSERTION DCA DVT1 /ZERO FUDGE USED BY FS COMMAND CIL2, TAD OSCANP TAD QBASE DCA QP /SET UP POINTER TO INSERTION STRING TAD SCANP CIA CLL TAD OSCANP DCA MQ /STORE CHAR COUNT TO INSERT (-1) TAD MQ TAD DVT1 /ADD FS FUDGE CMA SNL /DID WE INSERT MORE THAN WE DELETED? JMP EXPAND /YES - IGNORE SIGN BIT OF COUNT CIA PUSHJ ADJ2 /COMPRESS OUT EXCESS DELETED STUFF JMP CIL4 CIL3, TAD QP GETQ /GET A CHAR DCA TYI JMS STOREC /STORE A CHARACTER ISZ QP CIL4, ISZ MQ JMP CIL3 /OF INSERTION JMP I [IREST STOREC, 0 /STORE CHAR IN "TYI" INTO TEXT BUFFER AT P CDF 10 TAD I P AND [7400 TAD TYI DCA I P CDF 0 ISZ P JMP I STOREC /G COMMAND CHRG, QREF /G COMMAND - GET Q-REGISTER NUMBER DCA NFLG AC3777 AND I QPTR /GET COUNT OF CHARS IN REGISTER CMA DCA MQ /SAVE AS TRANSFER COUNT ISZ CLNF SKP JMP COLG4 DCA CLNF AC3777 AND I QPTR EXPAND, PUSHJ /COME HERE FROM INSERT LOGIC ADJ /INCREASE TEXT BUFFER SIZE ( Q-REG LENGTH MAY JMP CIL4 /BE NEGATIVE) AND GO TRANSFER THE CHARS TYI, 0 /TELETYPE INPUT TYI1, KSF /WAIT FOR THE KEYBOARD FLAG KSFWT, JMP .-1 /WHILE WAITING, DISPLAY TEXT ON SCOPE CTCCHK /CHECK FOR ^C KRB /WATCH OUT - AC MAY NOT BE 0! AND [177 SNA JMP TYI1 /IGNORE NULL CHARS AND LEADER SORT ALTLST ALTTAB-ALTLST /LOOK FOR NON-STANDARD ALTMODES AND [177 /IN CASE WE RETURNED A NEGATIVE VALUE JMP I TYI UPOC, 0 /MOVE TEXT BUFFER UP ONE CHAR AND [177 DCA TYI CLA IAC PUSHJ ADJ JMS STOREC /STORE CHAR IN THE HOLE WE MADE JMP I UPOC CUPPER, 0 /FORCE CHARACTER TO UPPER CASE TAD [-100 SMA /IF ITS >100 AND (37 /REDUCE IT TO BE <140 TAD [100 JMP I CUPPER /RETURN COLG3, TAD QP GETQ /GET A CHAR TYPE ISZ QP COLG4, ISZ MQ JMP COLG3 POPJ ESCAPE, 0 TAD CAAM /TYPE ESCAPE PUTT TAD I ESCAPE PUTT /TYPE ARGUMENT JMP I ESCAPE /OK TO RETURN TO ARGUMENT PAGE TSAVE, TAD I [QPNTR SZA CLA /IF WE ARE NOT AT THE BEGINNING OF THE C.L. RESORT /TREAT THIS LIKE ANY OTHER ^S MTWO /DROP OFF THE TWO BELLS OR ALTMODES TAD OCMDLN ADJQ /SET COMMAND STRING LENGTH TO OLD VALUE TAD L44 QREF /SET UP POINTERS TO Q-REG Z ADJQ /KILL CONTENTS OF Q-REG Z TAD I [QPNTR DCA I (QPNTR-2 DCA I [QPNTR /DO A QUICK SHUFFLE OF Q-REG LENGTHS JMP I (TCTLU CHRQ, QREF /COMMAND Q CLL JMP CQOA CPCS, QREF /COMMAND % GETN CQOA, ISZ QPTR /POINT TO VALUE WORD TAD I QPTR /INCREMENT VALUE BY ARGUMENT DCA I QPTR /ADD LINKS STA TAD QPTR /GO BACK ONE DCA QPTR2 /ALSO COMPL LINK CML RAR TAD I QPTR2 DCA I QPTR2 TAD I QPTR2 RAL CLA TAD I QPTR JMP I (NCOM /MAKE A NUMBER TYCRLF, 0 /TYPE A CR AND LF TAD CACR /CR XTYPE, TYPE TAD CALF /LF TYPE JMP I TYCRLF /RETURN QPTR2, 0 CHGT, OVRLAY QOVRLY CHGTO CHLT, OVRLAY QOVRLY CHLTO CCMA, NCHK /COMMAND , JMP NERR /NUMBER FLAG NOT SET TAD NLINK SZA CLA ERR26, ERR /NEG ARGUMENT TO , ISZ CFLG SKP JMP NERR /3 NUMERIC ARGUMENTS TAD N /MOVE N TO M CCMA3, DCA M /ENTERED HERE BY "H" COMMAND DCA N /AND CLEAR N STA DCA CFLG /SET COMMA FLAG POPJ /RETURNS 13-BIT RESULT IN AC,LINK NGET, 0 /SUBROUTINE TO GET LAST NUMBER, WITH NGET1, NCHK /DEFAULT VALUES OF +1 (NO NUMBER), JMP NGET2 /OR -1 (JUST A MINUS SIGN) GETNUM JMP I NGET /DIGITS SEEN - RETURN THEM NGET2, CLA CLL IAC /NO DIGITS SEEN PUSHJ /MAKE BELIEVE WE SAW THE DIGIT "1" NCOM /AND CREATE A NUMBER FROM IT (TAKING ANY JMP NGET1 /OPERATORS INTO ACCOUNT) AND USE IT BACKUP, 0 TAD I [QPNTR /SEE IF ANYTHING TO ERASE SNA CLA JMP I (T0 /NO, START ALL OVER STA TAD I [QPNTR /THEN THE CHARACTER COUNT ADJQ /REDUCE THE LENGTH OF THE COMMAND REGISTER BY 1 TAD QZ GETQ /GET THE CHARACTER WE RUBBED OUT JMP I BACKUP CHLCMP, 0 /COMPARISON SUBROUTINE TAD I P /DATA FIELD IS 10 AND [377 CDF 0 SORT CAFF LFTAB-CAFF SPA CLA /LINE TERMINATORS ARE CHANGED TO NEGATIVE NOS. ISZ CDT /IS COUNT EXHAUSTED? JMP CHLRET /NO CHRLI, ISZ P L44, 44 CDF 0 POPJ CHRH, PUSHJ /COMMAND H CCMA3 /SET M=0 AND COMMA FLAG ON AND FALL INTO "Z" /** COULD CAUSE ERROR ON B AND H IF NFLG SET CHRZ, TAD ZZ /COMMAND Z CTLH, /^H COMMAND - TIME OF DAY - NOT IMPLEMENTED CHRB, JMP I (NCOM14 /COMMAND B CHLRET, CDF 10 JMP I CHLCMP EFTAB, IOV XOV XOV XOV XOV IOV IOV XOV XOV, OVRLAY XOVRLY CHREX IOV, OVRLAY IOVRLY CHRER /COMMANDS = AND \ DISPATCHER TO OVERLAY CEQL, OVRLAY FOVRLY CEQLO CBSL, OVRLAY FOVRLY CBSLO ZROSPN, DCA SCANP /RESET TO BEGINNING OF ITERATION ZRON, DCA NFLG /KILL NUMBER FLAG JMP I [IREST PAGE / I/O-OVERLAY / IOVRLY XOVRLY FOVRLY / ER EF EU / EB EC ES / EW EX ET / EG EV / EH / EO *3200 IOVRLY, 0 QOVRLC EOVRLC XOVRLC FOVRLC /SUBROUTINE TO DO LOOKUPS AND ENTERS (LINK CRITICAL ON ENTRY) OPEN, 0 /CALLED WITH MONITOR CODE - 2 IN AC DCA RSTSW /ENTER OR LOOKUP SZL CLA /IF THIS IS THE OUTPUT SIDE OF AN "EB" COMMAND, JMP DEVLOD /SKIP THE STATEMENT SCAN QCHK TAD DSKNAM /PACKED SIXBIT FOR 'DSK:' DCA DEVC TAD (72 /RESTORE : NGOM1, DCA DEVLST+1 NGO, DCA NAME /CLEAR NAME DCA NAME+1 DCA NAME+2 MTWO DCA PERDSW NAMCM1, DCA NAMCNT NAMEC, QUOTST /GET CHAR AND TEST FOR ALTM JMP DEVQOT /ALTM - END OF NAME SORT /NO - CHECK SPECIAL CHARS DEVLST /([,:,., AND SPACE DEVTAB-DEVLST TSTSEP /NO, SEE IF ALPHANUMERIC ERR08, ERR /ILLEGAL CHAR TAD NAMCNT TAD [-10 SMA CLA /MORE THAN 6 CHARS? JMP NAMEC /YES, IGNORE TAD NAMCNT /NO, PACK IT CLL RAR DCA TEMP1 /*K* NOTE ASSUMPTION NAME STARTS AT LOC 0! TAD SCHAR UPPERC /** "UPPERC" ALWAYS COMPLEMENTS LINK AND [77 SNL JMP .+4 CLL RTL RTL RTL TAD I TEMP1 DCA I TEMP1 ISZ NAMCNT JMP NAMEC PERD, ISZ PERDSW /FOUND A PERIOD TAD NAME SNA CLA /ERROR IF WE HAVE JMP ERR08 /DOUBLE PERIODS OR NO FILE NAME DCA DEVLST+1 /DEVICE NO LONGER LEGAL DCA NAME+3 /ZERO EXTENSION OUT TAD [6 /AND SET POINTER TO 6TH CHARACTER JMP NAMCM1 COLON, TAD NAME+1 SNA /WE MUST PACK THE NAME INTO ONE WORD OURSELVES JMP .+5 /BECAUSE IF "OPEN" IS CALLED FROM THE OUTPUT TAD NAME /SIDE OF AN "EB" COMMAND, WE SKIP SMA CLA /THE NAME COLLECTOR.(WITH GOOD REASON - CLL CML RAR /THE USR OVERLAYS THE COMMAND LINE). TAD NAME+1 /SINCE THE OS/8 "ASSIGN" CALL TO THE USR TAD NAME /REPLACES THE 2ND NAME WORD WITH THE DEVICE DCA DEVC /NUMBER, ALL NAME INFO MUST BE HELD IN WORD 1. JMP NGOM1 /DEVICE NAME STORED - RESET FOR FILE NAME DEVLST, 56 /. 72 /: DSKNAM, 5723 /=0423+1300+4000 - SERVES AS LIST TERMINATOR DEVQOT, ISZ PERDSW /IF WE NEVER SAW A PERIOD, DCA NAME+3 /WIPE OUT THE EXTENSION JMS I (GETUSR /BRING USR INTO CORE DEVLOD, TAD I OPEN /MOVE HANDLER ADDRESS DCA DEVHND ISZ OPEN /AND BUMP POINTER TWO TAD RSTSW DCA CODE /ENTER OR LOOKUP CIF 10 /AND RESET TABLES JMS I [200 13 RSTSW, 0 /DON'T ZAP OPEN FILES ON INPUT DCA DEVNO /ZERO SECOND NAME WORD CIF 10 JMS I [200 1 /ASSIGN HANDLER DEVC, 0 DEVNO, 0 DEVHND, 0 JMP OPNERR /ERROR - KICK USR OUT FIRST DCA STBLK TAD RSTSW /GET LOOKUP-ENTER SWITCH TAD NAME /IF NAME IS NULL AND THIS IS A LOOKUP, SNA CLA JMP OPSUCC /IT JUST SUCCEEDED TAD DEVNO /DEVICE # CIF 10 JMS I [200 CODE, 0 /ENTER OR LOOKUP STBLK, 0 /FILLED WITH STARTING BLOCK TEMP1, FLN, 0 /FILLED WITH -LENGTH /**** CHECK IF AC MUST = 0 JMP OPNERR /ERROR OPSUCC, TAD DEVHND /HANDLER ADDRESS IN AC JMP I OPEN PERDSW, 7777 /FLIP FLOP FOR EXTENSION NAMCNT, 0 /CHARACTER COUNT /*** CHECK FOR : (SEE P.26) RETURN VALUE IF FNF, ALSO IF FOUND OPNERR, TAD RSTSW /WE SHOULD ONLY KILL THE OUTPUT FILE SNA CLA JMP .+3 /IF THIS IS AN OUTPUT ERROR EBERR, TAD ERROR DCA OUTR PUSHJ PECDSM, ECDISM /DISMISS THE USR ERR16, ERR 0 /*K* TELLS ERR RTN TO EXIT IF WE WERE CHAINED TO PAGE CHRER, TAD I (TYI SORT ERLST ERTAB-ERLST ERR /CAN'T HAPPEN ERTAB, EBAK /EB ROPEN /ER WOPEN /EW ERLST, 102 /EB 122 /ER 127 /EW /FILE OPEN COMMMANDS: EBAK, CLA CMA CLL /"EDIT BACKUP" COMMAND WITH LINK CLEAR PUSHJ /USE 'ROPEN' TO SET POINTERS ROPEN /WITHOUT KICKING OUT THE USR (AC=-1 ON ENTRY) TAD I (DEVNO /DEVICE # TAD (OSDCBT-1 DCA R CDF 10 TAD I R /GET DEVICE CODE FROM DCB TABLE CDF SMA CLA /NEGATIVE IF FILE-STRUCTURED JMP I (EBERR /YOU CAN'T DO THAT! TAD NAME+3 /EXTENSION TAD (-213 SNA JMP I (EBERR /CAN'T EB A .BK FILE TAD DOTBK /RESTORE EXTENSION DCA R /SAVE IT TAD DOTBK /.BK EXTENSION DCA NAME+3 CIF 10 TAD I (DEVNO /DEVICE # JMS I [200 /DELETE THE OLD BACKUP 4 NAME 0 DOTBK, 213 /WHO CARES IF IT'S NOT THERE? TAD R /OLD EXTENSION DCA NAME+3 CLA CLL CML IAC /SET EDIT BACKUP FLAG AND DO AN "ENTER" /LINK MUST BE SET HERE FOR OPEN WOPEN, DCA EBFLG /LINK NORMALLY 0 WHEN GOTTEN HERE CLA IAC /OPEN OUTPUT FILE JMS I (OPEN /ENTER CODE IN AC OUHNDL, 4001 /HANDLER ADDRESS DCA OUTHND /HANDLER ENTRY TAD I (DEVNO DCA ODEV /SAVE DEV # DCA I (OCNT /CLEAR BLOCK COUNT TAD I (FLN DCA I (OMAXLN /MAXIMUM FILE LENGTH TAD NAME DCA I (OUNAM TAD NAME+1 DCA I (OUNAM+1 TAD NAME+2 DCA I (OUNAM+2 TAD NAME+3 DCA I (OUNAM+3 TAD (DECPUT DCA OUTR /ENABLE CHARACTER OUTPUT ROUTINE TAD (ECDISM DCA I (DECPUT /FAKE RETURN FROM CHAR I/O ROUTINE TAD I (STBLK JMP I (OSETP /SET UP BLOCK NUMBER AND POINTERS /FILE OPEN ROUTINE ROPEN, DCA QPTR /ENTERED WITH AC=-1 IF MONITOR IS TO BE KEPT /ENTERED WITH LINK=0 JMS I (OPEN /LOOKUP CODE IN AC INHNDL, 7201 /HANDLER ADDRESS DCA INHND /SAVE HANDLER ENTRY STA DCA ICRCNT /POINTER STA DCA REND /CLEAR END-OF-FILE FLAG TAD I (STBLK DCA I (IBLK /FIRST BLOCK TAD I (FLN DCA INRCNT /SET UP INPUT FILE LENGTH ISZ QPTR /SHOULD WE DISMISS THE MONITOR? JMP I (ECDISM /YES - KICK THE USR OUT AND POPJ JMP I [IREST /EXIT DEVTAB, PERD /. COLON /: PAGE NORMAL, TAD ODEV /CLOSE FILE CIF 10 JMS I [200 4 OUNAM OCNT, 0 /NUMBER OF BLOCKS HLT TAD ERROR /RESET OUTPUT SUBROUTINE POINTER DCA OUTR /TO ERROR ECDISM, CIF 10 /DISMISS OS/8 USR ROUTINE JMS I [200 11 /KICK USR OUT JMP I [IREST /*** REALLY SHOULD BREAK UP INTO 2 ROUTINES SCHSRT, 0 /SORT LETTERS AND NUMBERS UPPERC /CONVERT TO UPPER CASE TO REDUCE CASES CLL /THE LINK WILL ALTERNATE EACH TIME TAD [-60 /WE ADD ONE OF OUR NEGATIVE CONSTANTS. SMA /THE LINK AT THE END WILL TELL WHETHER TAD [-12 /THE CHARACTER WAS ALPHANUMERIC SMA /(I.E. BETWEEN 60-71,101-132 OR 140-172) TAD M7 /OR A SEPARATOR CHARACTER. SMA TAD (-32 SZL CLA /WAS IT ALPHANUMERIC? ISZ SCHSRT /YES JMP I SCHSRT /SKIP RETURN IF ALPHANUMERIC RT, 0 /ROUTINE TO PACK THIRD CHAR INTO OUTPUT BUFFER CLL RTL RTL DCA DM /CALLED TWICE - FIRST TIME WITH CHAR IN AC, TAD DM /SECOND TIME WITH "DM" IN AC AND [7400 TAD I OPTR2 DCA I OPTR2 ISZ OPTR2 JMP I RT DVIMQL, 0 /FAKE MQL DVI DCA DVT1 /STORE DIVIDEND DCA MQ /INITIALIZE QUOTIENT DV1, TAD I DVIMQL /GET DIVISOR CIA CLL /SET UP TO TAKE IMMEDIATE EXIT ON ZERODIVIDE TAD DVT1 /SUBTRACT DIVISOR FROM DIVIDEND SNL /OVERFLOWED YET? JMP DV7200 /YES DCA DVT1 /NO - STORE IT BACK ISZ MQ /BUMP QUOTIENT JMP DV1 /AND LOOP DV7200, CLA TAD MQ ISZ DVIMQL /SKIP PAST DIVISOR JMP I DVIMQL /RETURN WITH QUOTIENT IN AC /SEARCH STRING MODIFIERS: SCHLST, 16 /^N - ANYTHING BUT 21 /^Q - LITERALLY 23 /^S - ANY SEPARATOR 30 /^X - ANYTHING M7, -7 DECPUT, 0 /DEVICE INDEPENDENT I/O TAD [200 /ADD ON PARITY BIT ISZ O3 /3RD CHAR OF 3? JMP O2 /NO JMS RT /YES, SPECIAL HANDLING TAD DM /TEMP STORAGE JMS RT SETO3, MTHREE /RESET SWITCH DCA O3 ISZ OCRCNT /END OF BUFFER? JMP I DECPUT /NO JMS FITS /CHECK FOR OUTPUT OVERFLOW JMP OERR /YUP DCA OCNT /NO - UPDATE OUTPUT COUNT JMS I OUTHND /OUTPUT THE BUFFER OUCTRL, 4400 BUFOUT, OUT OBLK, 0 JMP OERR TAD OBLK TAD INRSIZ /BUMP THE OUTPUT RECORD NUMBER BY THE MAXIMUM OSETP, DCA OBLK /SINCE ALL WRITES EXCEPT THE LAST ARE MAXIMAL TAD BUFOUT /BUFFER POINTERS DCA OPTR1 TAD BUFOUT DCA OPTR2 TAD OUTSIZ DCA OCRCNT /DOUBLEWORD COUNT (7377 IF 8K, 6777 IF 12K) JMP SETO3 /SET BYTE COUNTER AND RETURN OERR, CLA TAD ERROR DCA OUTR /INHIBIT FUTURE OUTPUT ERR14, ERR O2, DCA I OPTR1 /NORMAL HANDLING ISZ OPTR1 /BUMP POINTER JMP I DECPUT OPTR1, 0 OMAXLN, 0 /SIZE OF HOLE FOR OUTPUT OUTSIZ, 7377 /6777 O3, 0 FITS, 0 /SUBROUTINE TO CHECK FOR OUTPUT OVERFLOW TAD OPTR1 /** AC MAY CONTAIN FUDGE ON INPUT ** CIA TAD BUFOUT /COMPUTE NUMBER OF WORDS IN BUFFER AND [7400 /ROUND "UP" TO NEXT BUFFERLOAD CIA /MAKE POSITIVE CLL CML RAR DCA OUCTRL /AND SAVE IT AS A BUFFER CONTROL WORD TAD OUCTRL CLL RAL CLL RTL /ISOLATE THE BLOCK COUNT OF THE CONTROL WORD RTL /IN THE LOW ORDER PART OF THE AC RAL TAD OCNT /ADD IT TO THE CURRENT OUTPUT COUNT CLL CML TAD OMAXLN /SEE THAT WE DIDN'T OVERFLOW SNL SZA /THE ASSIGNED OUTPUT AREA JMP I FITS /OOPS - WE DID - ERROR RETURN CIA TAD OMAXLN /SUBTRACT OFF THE LIMIT CIA /TO ARRIVE AT THE UPDATED BLOCK COUNT ISZ FITS JMP I FITS /AND SKIP RETURN OUNAM, ZBLOCK 4 /NAME OF OPEN OUTPUT FILE GOES HERE PAGE /DISPLAY ROUTINE FOR PDP-12 SCOPE WASTE, 0 /** MUST BE AT MULTIPLE OF 2000 XPOS, 0 /PDP-12 BETA REGISTER 1 BETA2, 0 /PDP-12 BETA REGISTER 2 DSPLAY, 0 /TEXT DISPLAY ROUTINE FOR TECO MTHREE /THIS ROUTINE DEPENDS ON THE FACT THAT THE TAD DSPLAY /HIGH ORDER BITS OF THE X-COORD ARE IGNORED DCA DX /BY THE VR12 HARDWARE TAD I DX /GET THE SKIP DCA DLPTST /PUT IT IN THE LOOP TAD P DCA DX TAD NUMLNS STL CIA /LOOK BACKWARD PUSHJ /FOR BEGINNING OF DISPLAY AREA CHRL1 D360, STA STL /=7360 TAD P DCA DM TAD DX DCA P /RESTORE POSITION TAD NUMLNS /NOW SCAN FORWARD CLL IAC PUSHJ /FOR THE END OF THE DISPLAY AREA CHRL1 TAD P CIA TAD DM DCA R /*K* THIS NUMBER MUST GO IN R - TAD DX /THE ^W COMMAND NEEDS IT THERE DCA P /RESTORE ORIGINAL P DSETUP, TAD P CIA TAD DM DCA DQ /SAVE COUNT OF CHARS TO CURSOR POSITION TAD DM DCA DX TAD R DCA DR TAD D360 DCA YPOS DISCR, TAD DISLF SETXPS, DCA XPOS /SET X POSITION/COLUMN COUNTER JMP DLPTST /DISPLAY LOOP DGETCH, CDF 10 TAD I DX CDF 0 /GET THE CHARACTER FROM FIELD 1 AND [177 /AND OFF THE HIGH ORDER BITS TAD (-33 SNA /CHANGE ALTMODES TAD CAHT /TO DOLLAR SIGNS TAD (-5 SMA SZA /IF NOT A CONTXRACTER JMP DLOOP /DISPLAY IT AND KEEP GOING SNA JMP DBLANK /DO BLANKS FAST TAD (40-15 SNA /CR? JMP DISCR /YES - RESET X COORD STL TAD [4 SNA /TAB? JMP DTABB SNL JMP DISLF /LINE FEED, VERTICAL TAB, OR FORM FEED TAD (51 /ORDINARY CONTROL CHAR - RESTORE IT + 40 DCA WASTE /SAVE CHAR JMS DISCHR /DISPLAY ^ TAD WASTE /NOW DISPLAY ALTERED CHAR DLOOP, JMS DISCHR DLPTST, HLT /EITHER KSF OR TSF OR "ISZ R" SKP JMP I DSPLAY /EXIT IMMEDIATELY IF TEST SKIPS ISZ DQ /ARE WE AT THE CURRENT POINTER POSITION? JMP TSTEDS /NO TAD (-5 TAD XPOS DCA XPOS /BACK UP X POSITION A HALF-CHARACTER TAD DM20 TAD YPOS 6141 /ENTER LINC MODE DM20, 1760 /DSC I 2000 1760 /DISPLAY A ^ 2076 0002 /PDP MTHREE /AND MOVE X POSITION BACK TO WHERE IT WAS JMP DBLANK+1 TSTEDS, ISZ DR /ARE WE THROUGH? JMP DGETCH /NO JMP DSETUP /YES - START OVER DTABB, TAD XPOS /DISPLAY TAB CMA AND Z7 DCA WASTE /GET NUMBER OF COLUMNS TO GO (-1) TAD WASTE CLL RTL RAL TAD WASTE /MULTIPLY BY 9 DBLANK, TAD CAHT /BUMP ONE MORE COLUMN TAD XPOS SZA /OVERFLOW? JMP SETXPS /NO - SET XPOS AND CONTINUE JMP LINOFL /YES - GO TO THE NEXT LINE /SUBROUTINE TO DISPLAY A CHARACTER DISCHR, DLPTST /*K* DISCHR MUST CONTAIN "DLPTST" WHEN WE CLL RAL /ARE EXAMINING CHARACTERS ** TAD (DTABLE-1 DCA BETA2 /STORE ADDRESS OF TABLE ENTRY FOR CHAR -1 TAD YPOS 6141 /ENTER LINC MODE 1762 /DSC I 2 1762 /DSC I 2 0002 /RE-ENTER PDP-8 MODE CLA ISZ XPOS /BUMP THE X COORDINATE/COLUMN COUNTER JMP I DISCHR /RETURN LINOFL, TAD (7054 /INDENT ALL CONTINUATION LINES DCA XPOS DISLF, RAR /*K* RAR=7010 AC MAY HAVE A SMALL NUMBER TAD YPOS /IN IT HERE - THATS OK AS LONG AS ITS SMALL, TAD [-40 /SINCE ONLY THE HIGH 8 BITS OF YPOS COUNT. DCA YPOS JMP I DISCHR /*K* THIS ALWAYS RETURNS TO DLPTST ** YPOS= NAME /USE SOME FREE PAGE ZERO LOCATIONS DR= NAME+1 /FOR OUR TEMPORARIES DQ= NAME+2 DM= NAME+3 PAGE DTABLE, 2000;2076; 7500;0000; 7000;0070; 7714;1477 5721;4671; 6661;4333; 5166;0526; 0000;0070 3600;0041; 4100;0036; 2050;0050; 0404;0437 0500;0006; 0404;0404; 0001;0000; 0601;4030 4536;3651; 2101;0177; 4523;2151; 4122;2651 2414;0477; 5172;0651; 1506;4225; 4443;6050 5126;2651; 5122;3651; 2200;0000; 4601;0000 1000;4224; 1212;1212; 2442;0010; 4020;2055 4077;5751; 4477;7744; 5177;2651; 4136;2241 4177;3641; 4577;4145; 4477;4044; 4136;2645 1077;7710; 7741;0041; 4142;4076; 1077;4324 0177;0301; 3077;7730; 3077;7706; 4177;7741 4477;3044; 4276;0376; 4477;3146; 5121;4651 4040;4077; 0177;7701; 0176;7402; 0677;7701 1463;6314; 0770;7007; 4543;6151; 4177;0000 3040;0106; 0000;7741; 2000;2076; 1604;0404 STABLE, ZBLOCK 40 /SEARCH BUFFER CTLW, NCHK /^W COMMAND - IF THERE WAS A NUMBER BEFORE JMP CTLW2 /THE ^W, SET THE NUMBER OF LINES TO DISPLAY TAD N /EQUAL TO THAT NUMBER. DCA NUMLNS /DON'T WORRY ABOUT NEGATIVE N CTLW2, ISZ R /FAKE OUT! (MUST BE BEFORE CALL TO DISPLY) DISPLY /IN ANY CASE, GO THROUGH ONE DISPLAY CYCLE POPJ /THEN RETURN SAVTRA, 0 /SAVE TRACE MODE TAD TFLG DCA TFGTMP DCA TFLG JMP I SAVTRA /EXIT WITH TRACE OFF RESTRA, 0 /RESTORE TRACE MODE TAD TFGTMP DCA TFLG JMP I RESTRA TFGTMP, 0 CHKQF, 0 /CHECK FOR EXPLICIT QUOTES ISZ QFLG /QUOTE FLAG SET? JMP .+3 /NO SCAN /GET QUOTING CHAR DCA QUOTE /PUT INTO SEARCH TABLE DCA QFLG /ZAP QUOTE FLAG JMP I CHKQF /RETURN NXTBUF, 0 SZA CLA JMP NOWRIT /READ-ONLY IF AC NOT 0 ON ENTRY PUSHJ CPOC /HP DCA ZZ /FORCE Y TO WORK ISZ FFFLAG /IF WE DIDN'T SEE A FORM FEED ON INPUT JMP NOWRIT /DON'T OUTPUT ONE TAD CAFF OUTPUT NOWRIT, PUSHJ CHRY /READ NEW BUFFER CTCCHK /CHECK FOR ^C AND ^P CLA /*K* CTCCHK LEAVES AC NON-ZERO! JMP I NXTBUF GETUSR, 0 /ROUTINE TO LOCK THE USR INTO CORE CDF 0 TAD ZZ /IF THE TEXT BUFFER IS EMPTY AND SNA CLA /WE HAVE 12K, SO Q-REGS ARE IN FIELD 2, NWRUSR, NOP /(CHANGED BY INIT CODE TO "TAD [4" IF 12K) STL RTR /THEN WE SHOULD NOT SAVE CORE ON A USR CALL. DCA I (JSBITS /THIS STORES A 2000 OR A 2001 CIF 10 JMS I [7700 /OK - NOW LOAD THE USR IN 10 JMP I GETUSR /E COMMAND MODIFIERS EFLST, 102 /EB I 103 /EC X 106 /EF X 107 /EG X 113 /EK X 122 /ER I 127 /EW I 130 /EX I CHRU, QREF /COMMAND U NCHK ERR22, ERR /U MUST BE PRECEDED BY A NUMBER TAD NLINK CLL RTR DCA NLINK AC3777 AND I QPTR TAD NLINK DCA I QPTR ISZ QPTR TAD N DCA I QPTR POPJ /RADIX TABLES: ORAD, NOP 1000 100 10 DRAD, NP&177+1200 /"TAD NP" 1750 144 12 /DISPATCH TABLE FOR COMMAND INPUT COMTAB, TBEL /^G TCRLF /CR RUBY, ROCMND /RUBOUT TCTLU /^U TALTM /ALTMODE TQMK /? TSAVE /^S TSTAR /* TSPACE /SPACE EDFLAG, 0 /MUST BE KEPT TOGETHER EHFLAG, 0 EOFLAG, VERSN ESFLAG, 0 ETFLAG, 0 EUFLAG, 0 /CXFLAG, 0 PAGE /COMMAND M /AND Q-REGISTER STORAGE COMLST, 7 /^G, COMMAND LINE EDIT LIST 15 /CR, INSERT CR & LF 177 /RUBOUT 25 /^U - RUB OUT LINE 33 /^[, ALT MODE 77 /? 23 /^S - SAVE OLD COMMAND LINE IN Q-REG Z 52 /* 40 /SPACE CHRM, QREF /COMMAND M TAD M4 /4 ITEMS PUSHED TO PUSHL /SAVE CURRENT MACRO STATE QCMND MPDL ITRST /SO THE "O" COMMAND WILL WORK IN MACROS SCANP /ZEROED BY "PUSHL" TAD PDLP /MUST CHECK PDL AT END OF MACRO CIA DCA MPDL TAD QNMBR /Q-REGISTER TO EXECUTE SETCMD /SET COMMAND LINE TO THIS Q-REG POPJ /LEAVE NUMBER FLAG ALONE AND EXIT CHKBZ, 0 /SEE THAT B .LE. C(AC) .LE. ZZ SZL JMP ERR11 /POP CIA /ENTERED WITH LINK SET CORRECTLY TAD ZZ SNL /13-BIT ARITHMETIC ERR11, ERR /C(AC)>ZZ CIA TAD ZZ /RESTORE ORIGINAL AC JMP I CHKBZ ALTLST, 175 /ALT MODE 176 /ANOTHER ALTMODE M4, -4 SCUPPR, 0 /SCAN AND CONVERT TO UPPER CASE SCAN UPPERC JMP I SCUPPR /THAT'S ALL? /Q-REGISTER STORAGE - EACH Q-REGISTER TAKES 2 WORDS. /WD 1 CONTAINS THE LENGTH OF THE CHARACTER PART OF THE REGISTER (IF ANY) /WD 2 CONTAINS THE VALUE OF THE NUMERIC PART OF THE REGISTER (IF ANY) QARRAY, ZBLOCK 110 /36 Q-REGISTERS * 2 WORDS/REGISTER = 72 WORDS QPNTR, CHNSTR /FAKE Q-REGISTER FOR INPUT LINE - LENGTH ONLY. CTLT, NCHK JMP CTLT2 /NO ARG TAD N ET1, TYPE /TYPE CHAR REPRESENTED BY ARGUMENT POPJ CTLT2, LISTEN /^T COMMAND - VALUE OF NEXT CHAR FROM TTY ET8, TYPE /*ET ECHO THE CHARACTER TAD SCHAR /GET THE CHARACTER JMP I (NCOM14 /JUMP INTO NUMBER PROCESSOR CTLE, TAD FFFLAG /^E COMMAND - RETURNS FORM FEED FLAG NNEW13, CLL SPA STL /EXTEND SIGN BIT TO LINK JMP I (NCOM /RETURN -1 IF F.F., 0 OTHERWISE PAGE *5000 /COMMAND DISPATCH TABLE ** ALLOW EVEN/ODD FOR NOVICE SUBSET? CDSP, POPK;CTLA;SERR;CTLC;CTLD;CTLE;CTLF;CTLC /0-7 CTLH;CTLI;POPK;SERR;POPK;POPK;CTLN;CTLO /10-17 T0;SERR;SERR;SERR;CTLT;CTLU;ERR35;ERR27 /20-27 SERR;SERR;SERR;ZRON;SERR;SERR;CTUA;SERR /30-37 POPK;CEXP;CDBQ;CNBS;SERR;CPCS;CAMP;ZRON /40-47 COPR;CCPR;CAST;CPLS;CCMA;CMIN;CDOT;CVIR /50-57 NMBR;NMBR;NMBR;NMBR;NMBR;NMBR;NMBR;NMBR /60-67 NMBR;NMBR;CCLN;CSEM;CHLT;CEQL;CHGT;CQSM /70-77 CATS;CHRA;CHRB;CHRC;CHRD;CHRE;CHRF;CHRG /100-107 CHRH;CHRI;CHRJ;CHRK;CHRL;CHRM;CHRN;CHRO /110-117 CHRP;CHRQ;CHRR;CHRS;CHRT;CHRU;SERR;SERR /120-127 CHRX;CHRY;CHRZ;SERR;CBSL;SERR;CHUA;CHBA /130-137 /END OF DISPATCH TABLE PDLBEG, ZBLOCK 11 /BEGINNING OF PUSHDOWN LIST QPUT12, ZBLOCK 16 /ROUTINES INSERTED LATER - USED IN ASR35, ZBLOCK 10 /INITIALIZATION, OVERLAYED BY PUSHDOWN LIST PDLEND, 0 /END OF PUSHDOWN LIST PAGE *5200 / INITIALIZATION SECTION / ENTER HERE AT 5200 TO MODIFY TECO TO USE A MODEL 35 TELETYPE / SORRY - NO CURRENT PAGE LITERALS TECO35, ISZ JTECO /IF CALLED VIA "R" OR "RUN" TAD I XR /MOVE ASR-35 PATCH (WHICH OUTPUTS TABS AND DCA I INXR / FORM FEEDS) OVER PRINT ROUTINE ISZ ASRCNT JMP .-3 TAD YOUTHTX DCA I YPOUTHT TAD [TECO DCA I Y7745 /CHANGE STARTING ADDRESS IN CASE WE'RE RESTARTED /AND FALL INTO INITIALIZATION ROUTINE TCINIT, TLS /INITIALIZATION ROUTINE - INITIALIZE THE TTY TAD .-1 DCA I [TECO TAD YT0A /"JMP T0A" DCA I PTECO1 /CHANGE THE ENTRY AT 200 SO WE'RE NOT CALLED AGAIN CLA STL 6141 /ENTER LINC MODE (MAYBE) 4 /ESF - SET SMALL CHARACTERS FOR SCOPE 0261 /ROL I 1 - ROTATE LINK INTO AC11 0002 /BACK TO PDP-8 MODE SNA CLA /AC NON-ZERO IF WE ARE A PDP-12 JMP NOTA12 /NO, JUST AN ORDINARY 8 TAD YPDP12 JMS CHANGE /TRADE OFF TWO PAGE HANDLERS FOR A SCOPE NOTA12, TAD I Y7777 AND COR70 SZA JMP SOFCOR COR0, CDF 0 /NEEDED FOR PDP-8L TAD CORSIZ /GET FIELD TO TEST RTL RAL AND COR70 /MASK USEFUL BITS TAD COREX DCA .+1 /SET UP CDF TO FIELD COR1, CDF /N /N IS FIELD TO TEST TAD I CORLOC /SAVE CURRENT CONTENTS COR2, NOP /HACK FOR PDP-8! DCA COR1 TAD COR2 /7000 IS A "GOOD" PATTERN DCA I CORLOC COR70, 70 /HACK FOR PDP-8, NOP TAD I CORLOC /TRY TO READ BACK 7000 CORX, 7400 /HACK FOR PDP-8, NOP TAD CORX /GUARD AGAINST WRAP-AROUND TAD CORV /TAD (1400 SZA CLA JMP COREX /NON-EXISTENT FIELD EXIT TAD COR1 /RESTORE CONTENTS DESTROYED DCA I CORLOC ISZ CORSIZ /TRY NEXT HIGHER FIELD JMP COR0 COREX, CDF 0 /LEAVE WITH DATA FIELD 0 STA TAD CORSIZ /HIGHEST EXISTING FIELD COR999, DCA MEMSIZ TAD MEMSIZ SNA CLA JMP JTECOM /8K TAD YM7 /MORE THAN 8K JMS I YMOVE CDF 0 QPUT12-1 CDF 0 QPUTS-1 TAD YM7 JMS I YMOVE CDF 0 QPUT12+7-1 CDF 0 GETQX-1 TAD YTWLVEK JMS CHANGE /AND CHANGE A WHOLE MESS OF LOCATIONS JTECOM, JMS I YOVINIT /WRITE OUT OVERLAYS CDF 10 TAD I YSCPBIT CDF 0 AND [200 SNA CLA JMP JTECO TAD YSCOPE JMS CHANGE JTECO, JMP I .+1 /INCREMENTED IF WE WERE'NT CHAINED TO CHINIL PTECO1, TECO1 CORLOC, CORX /ADDRESS TO TEST IN EACH FIELD CORV, 1400 /7000+7400+1400=0 CORSIZ, 1 /CURRENT FIELD TO TEST SOFCOR, CLL RAR RTR JMP COR999 /CHAINED INIT CODE - MOVE 17600 INTO Q-REGISTER SPACE CHINIL, CDF 10 TAD I DX /GET A COMMAND LINE CHAR CDF 0 QPUT ISZ INICT JMP CHINIL TAD YFATALJ /SET UP THE FATAL ERROR EXIT DCA I YCHOOPS /IN THE ERROR ROUTINE JMP I YCHTECO INICT, -CHNSTR ASRCNT, CHANGE, -10 /ROUTINE TO CHANGE SPECIFIC LOCATIONS DCA XR /STORE TABLE POINTER CHANGL, TAD I XR /GET LOCATION SNA JMP I CHANGE /END OF LIST - RETURN DCA TEMPT TAD I XR /GET CONTENTS DCA I TEMPT /ZAP! JMP CHANGL /CHECK FOR OS/8 SCOPE BIT, IF ON, PATCH TECO /ALSO SEND ESC SEQ TO TERMINAL TO SEE IF VT05 OR VT5X. YOUTHTX, OUTHTX YPOUTHT,POUTHT Y7745, 7745 Y7777, 7777 YM7, -7 YMOVE, MOVE YOVINIT,OVINIT YSCPBIT,SCPBIT YFATALJ,FATALJ YCHOOPS,CHOOPS YCHTECO,CHTECO YPDP12, PDP12-1 YTWLVEK,TWLVEK-1 YSCOPE, SCOPE-1 YT0A, T0A&177+5200 /FLOW INTO NEXT PAGE SCOPE, RUBY; SCOPY /MAKE SCOPE RUBOUTS WORK BLSP1; TAD CACR /MAKE BELL SPACE WORK BLSP2; TYPE /AND MORE RUBOUTS BLSP3; SCAPE&177+4600 /JMS I (ESCAPE BLSP4; 113 /MORE BELL SPACE EUFLAG; -1 /SET EU TO -1 EU1; CLA EU2; TAD [40 0 /LOCATIONS TO CHANGE MUST BE CHANGED IN OVERLAY IMAGE /BEFORE OVERLAY IS WRITTEN OUT /LOCATIONS TO CHANGE IF WE HAVE 12K OF CORE TWLVEK, INRSIZ; 4 /INPUT BUFFER GROWS TO 4 BLOCKS LONG INCTLW; 1021 /AND LIVES IN FIELD 2 INPCNT; 5000 I2; CDF 20 IC; CDF 0 /THIS WAS A NOP TO SPEED UP RTS-8 OPERATION L12K1; J12K1 /SPEED UP TEXT MOVE ROUTINES, L12K2; J12K2 /SINCE Q-REGISTERS DON'T SIT ON TOP OF TEXT. OUTSIZ; 6777 /OUTPUT BUFFER TAKES OVER OLD INPUT BUFFER SPACE BUFIN; 5600 NWRUSR; TAD [4 /LET USR BE CALLED WITHOUT SAVING CORE MQMAX; -Q12MAX /ALLOW MORE Q-REGISTER STORAGE QLIMIT; 12-Q12MAX 0 /LOCATIONS TO CHANGE IF WE'RE RUNNING ON A PDP-12 PDP12, KSFWT; DISPLY /FIX KEYBOARD AND PRINTER WAITS TSFWT; DISPLY /SO THEY DISPLAY WHILE WAITING CDSP+127;CTLW /ENABLE W COMMAND INHNDL; 7200 /ONE PAGE INPUT HANDLER ONLY OUHNDL; 7400 /DITTO OUTPUT HANDLER /VALUE MUST BE 0 INITIALLY TO END LIST OVINIT, 0 /WRITE OUT OVERLAYS /IF MORE THAN 12K, MOVE OVERLAYS TO FIELD 3 MTHREE TAD MEMSIZ SPA CLA JMP L16K /LESS THAN 16K TAD [-400 JMS MOVE CDF 0 3200-1 CDF 30 MEMLOC-1 TAD M2000 JMS MOVE CDF 0 5600-1 CDF 30 MEMLOC+400-1 TAD M5 JMS MOVE CDF 10 NEWERR-1 CDF 0 OVREAD-1 / TAD (COREAD-COREND-1 TAD M3000 JMS MOVE CDF 10 4400-1 / COREAD-1 CDF 30 4400-1 JMP G16K L16K, JMS I (7607 4200 3200 /WRITE OUT I/O-OVERLAY IOVRLC JMP OVERR /ERROR WRITING OVERLAY M3000, JMS I (7607 5400 /4 OVERLAYS 5600 /WRITE OUT Q-OVERLAY AND E-OVERLAY QOVRLC JMP OVERR /ERROR WRITING OUT OVERLAY G16K, DCA I (ERRXX JMP I OVINIT /RETURN OVERR, TAD [-400 /SWAP IN ERROR OVERLAY FROM CORE AND MAKE SURE JMS MOVE /WE RETURN TO MONITOR CDF 0 6200-1 CDF 0 3200-1 / DCA I (ERRTMP /SET FATAL SWITCH TAD (FATALJ DCA I (CHOOPS ERR30, JMP I (ERRYY /CALL ERROR MESSAGE PROCESSOR M2000, -2000 M5, -5 MOVE, 0 DCA MQ TAD I MOVE DCA MOVEL ISZ MOVE TAD I MOVE DCA INXR ISZ MOVE TAD I MOVE DCA MOVEC ISZ MOVE TAD I MOVE DCA XR ISZ MOVE MOVEL, HLT TAD I INXR MOVEC, HLT DCA I XR CDF 0 ISZ MQ JMP MOVEL JMP I MOVE /ROUTINES TO BE (POSSIBLY) SWAPPED INTO TECO *QPUT12 RELOC QPUTS QPUTS, 0 /12K Q-REGISTER PUT ROUTINE AND [377 CDF 20 DCA I QP CDF 0 ISZ QP JMP I QPUTS RELOC GETQX GETQX, 0 /12K Q-REGISTER GET ROUTINE DCA CHKCTC CDF 20 TAD I CHKCTC CDF 0 AND [377 JMP I GETQX RELOC ASR33 JMP OUTCMX / FORM FEED/VERT. TAB - USE 8/4 FILLERS OUTHTX, TAD COLCT /GET COLUMN COUNTER RTR RAR CLA CMA RAL /OUTPUT 2 FILLERS IF MORE THAN 4 CHARS TO TAB DCA COLCT /OTHERWISE 1 (COLCT IS A MODULO 8 COUNTER) OUTCMX, TAD SCHAR /GET CONTROL CHAR TO TYPE PUTT /AND TYPE IT - WE WILL NOW FILL WITH NULLS RELOC PAGE / Q-OVERLAY *5600 RELOC 3200 IOVRLC QOVRLY, 0 EOVRLC XOVRLC FOVRLC /O COMMAND CHROO, TAD SCANP /O COMMAND DCA COOQ /SAVE CURRENT SCAN POINTER DCA NFLG /??? DCA QFLG /QUOTED "O" COMMAND NOT ALLOWED QSKP /CHECK THAT THERE IS REALLY A STRING HERE /BECAUSE WE WILL NOT USE "SCAN" TO GET CHARACTERS /FROM THIS STRING IN THE SEARCH LOOP. TAD ITRST /"O" ONLY SCANS FROM THE BEGINNING OF THE DCA SCANP /CURRENT ITERATION LOOP. /(JUMPS BACKWARD OUT OF ITERATIONS ARE VERBOTEN) SKPSET CS41, 41 /SEARCH FOR ! TAD CS41 DCA QUOTE /SET QUOTE CHAR TO ! TAD COOQ TAD QBASE DCA QP /SET UP PTR TO ACCESS GOTO STRING COOC, TAD QP GETQ /GET CHAR FROM GOTO STRING CIA DCA MQ /SAVE IT QUOTST /GET CHAR FROM LABEL JMP COOB /LABEL EXHAUSTED TAD MQ SZA CLA /MATCH? JMP CSMQ /NO - REJOIN SEARCH ROUTINE FOR ANOTHER ! ISZ QP JMP COOC COOB, TAD MQ TAD CAAM /IS GOTO STRING EXHAUSTED TOO? SZA CLA JMP CSMQ+1 /NO - REJOIN ! SEARCH ROUTINE ENTRCE /RE-ENABLE TRACE JMP I [IREST COOQ, 0 /ROUTINE TO SKIP COMMANDS UP TO A CHARACTER SETSKP, 0 /SET UP TO SKIP COMMANDS TAD I SETSKP DCA SKPLST /CHAR TO TRAP ON NOTRCE /DISABLE TRACE MODE CSML1, DCA BRACKS /INITIALIZE BRACKET LEVEL CSML, SCANUP /GET A COMMAND CHAR SORT SKPLST SKPTAB-SKPLST JMP CSML /NOTHING SPECIAL - KEEP GOING CSMD, SCAN /CLEAR OUT MODIFIER JMP CSML CSMU, SCAN /SKIP ^U COMMAND SKP CLA /GET RID OF Q-REG NUMBER CSMFS, QSKP /FS COMMAND - SKIP FIRST STRING CSMQ, QSKP /SKIP OVER A QUOTED STRING CSMQ1, PUSHJ IREST /FIX UP QUOTE CHAR JMP CSML /KEEP GOING CSMY, TAD SCHAR /SKIP ROUTINE FOR ^A AND ! DCA QUOTE /WE MUST SCAN UNTIL WE FIND JMP CSMQ /A COPY OF THE COMMAND CHARACTER. /SORT LIST FOR " COMMAND CNDLST, 103 /C 107 /G 116 /N 114 /L 105 /E 124 /T 123 /S 106 /F 125 /U 122 /R 74 /< 76 /> CSME, SCANUP /FOUND E COMMAND SORT ESKLST /LOOK FOR ER & EW & EG ESKTAB-ESKLST /USE CSMQ TO SKIP JMP CSML /NO STRING CSMF, SCAN /F COMMAND - BETTER BE FOLLOWED BY S,N, OR _ CLA JMP CSMFS /SCAN OFF TWO STRINGS CSMI, ISZ BRACKS /INCREMENT BRACKET LEVEL JMP CSML CSMO, STA TAD BRACKS /DECREMENT BRACKET LEVEL SPA JMS I (POPITR /IF WE EXIT <> POP OFF ITERATION VALUES JMP CSML1 SKPRTN, TAD BRACKS /WE HAVE FOUND THE DESIRED CHARACTER SZA CLA /BUT IF THE BRACKET LEVEL IS NON-ZERO, JMP I XSORTA1 /WE CANNOT ACCEPT IT - KEEP SORTING JMP I SETSKP /EVERYTHING IS OK - RETURN BRACKS, 0 /SORT LIST FOR SKIPPING OVER COMMANDS SKPLST, 0 /TRAP CHAR 41 /! 76 /> 74 /< 42 /" 136 /^ 100 /@ 1 /^A 11 /TAB 25 /^U 36 /^^ 105 /E 106 /F 111 /I 116 /N 117 /O 123 /S 137 /_ 121 /Q 125 /U 130 /X 107 /G 115 /M 45 /% / SKIP LIST FOR E'S ESKLST, 122 /R 127 /W 102 /B 107 /G CSMA, STA /LIST TERMINATOR JMP CSMQ1 /FOUND @ - SET QUOTE FLAG AND CONTINUE XSORTA1,SORTA1 PAGE /DISPATCH TABLE FOR SKIPPING OVER COMMANDS: SKPTAB, SKPRTN /DESIRED CHARACTER - RETURN CSMY /! CSMO /> CSMI /< CNDI /" CSMC /^ CSMA /@ CSMY /^A CSMQ /TAB CSMU /^U CSMD /^^ CSME /E CSMF /F ESKTAB, CSMQ /I OR ER CSMQ /N OR EW CSMQ /O OR EB CSMQ /S OR EG CSMQ /_ CSMD /Q CSMD /U CSMD /X CSMD /G CSMD /M CSMD /% SEMO, SKPSET /PLOD THRU 76 /LOOKING FOR > ENTRCE /IT'S THE RIGHT ONE, TURN TRACE BACK ON JMP I ZCGSG ZCGSG, CGSG CNDTAB, TSTSEP /LEGAL CONSTITUENT OF SYMBOL FOR ASSEMBLER SZL SNA CLA /GT 0 SNA CLA /NE 0 SNL CLA /LT 0 SZA CLA /EQ 0 SNL CLA /TRUE SNL CLA /SUCCESSFUL SZA CLA /FALSE SZA CLA /UNSUCCESSFUL TSTSEP /ALPHANUMERIC SNL CLA /< SZL SNA CLA /> /THIS TABLE PRESUPPOSES 1000000000000 IS ILLEGAL /COMMANDS " AND ' CDBQO, NCHK /COMMAND " ERR23, ERR /NO NUMBER TO TEST SCANUP SORT CNDLST CNDTAB-CNDLST SMA /CHECK THAT CHAR WAS TRANSLATED ERR20, ERR /NO - NO SUCH TEST DCA SKIP /STORE TEST INSTRUCTION GETNUM /PERFORM THE TEST SKIP, HLT /TEST SKIPS IF TRUE SKP CLA POPJ /CONDITION SATISFIED STA /NOT SATISFIED DCA SKIP /BEGINNING SKIPPING COMMANDS SKPSET /CALL SKIPPING ROUTINE 47 /FIND A ' ISZ SKIP /FOUND A ' RESORT /NEED ANOTHER: BACK TO CSML ENTRCE /RE-ENABLE TRACE JMP I [IREST /COMMAND ' NO ACTION TO TAKE CNDI, SCAN /HIT ANOTHER " STA /SO SKIP MATCHING ' TAD SKIP DCA SKIP RESORT /GO BACK TO CSML /COMMANDS ; AND > CSEMO, TAD ITRST /COMMAND ; - ALSO HERE ON FAILING NON-COLON SEARCH SNA CLA ERR09, ERR /IF NOT IN ITERATION CSEM2, TAD NLINK SNA CLA NCHK JMP I (ZRON /NO NUMBER - IGNORE IT, WE DID IT ALREADY JMP SEMO /SEARCH FOR > CHGTO, TAD ITRCNT SNA CLA JMP CGTC /0 MEANS INFINITY ISZ ITRCNT /LOOK FOR COUNT EXHAUSTED JMP CGTC /NO, CONTINUE CGSG, JMS POPITR /POP UP OLD ITERATION PARAMETERS JMP I [IREST CGTC, TAD ITRST SNA ERR10, ERR /IF NOT IN ITERATION JMP I (ZROSPN /BACK TO ROOT POPITR, 0 CLA IAC /** AC NOT NECESSARILY 0 ON ENTRY POPL ITRCNT ITRST JMP I POPITR CHLTO, MTWO /COMMAND < PUSHL ITRST ITRCNT TAD NFLG SNA CLA /WAS A NUMBER SPECIFIED? JMP INF /NO, ASSUME INFINITY TAD NLINK SNA CLA TAD N SNA JMP SEMO /0 OR NEGATIVE MEANS SKIP ITERATION CIA /MAKE NEGATIVE INF, DCA ITRCNT /SET UP TERMINATION TAD SCANP /SAVE CURRENT SCAN PNTR DCA ITRST /ALWAYS .GE. 1 IN ITERATION DCA NFLG /CLEAR NUMBER FLAG POPJ /SHOULD WE TREAT 0<> SPECIAL? PAGE RELOC / ERROR-OVERLAY *6200 RELOC 3200 IOVRLC QOVRLC EOVRLY, 0 XOVRLC FOVRLC ERRYY, DCA N TAD (ERLIST-1 DCA XR ERLOOP, ISZ N /BUMP ERROR NUMBER TAD I XR SZA /END OF LIST? TAD I (ERRXX /NO - CHECK FOR MATCH Z40, SZA CLA /FOUND WHAT WE WANTED? JMP ERLOOP /NO - KEEP LOOKING TAD N CLL RAL /MULTIPLY BY 2 TAD (ERBASE-2 DCA PTR TAD I PTR /GET FIRST WORD OF ERR MSG SPA CLA JMP CTCT /^C TRAP ERL2, TAD [77 TYPE TAD I PTR RTR RTR RTR JMS I (SIXTYP /TYPE LEFT CHARACTER TAD I PTR JMS I (SIXTYP /TYPE RIGHT CHARACTER ISZ PTR TAD I PTR RTR RTR RTR JMS I (SIXTYP /TYPE 3RD CHARACTER CLA IAC AND I (EHFLAG SZA CLA JMP I (ERRRET MTHREE TAD MEMSIZ SPA CLA JMP I (ERRRET /NO LONG ERROR MESSAGE UNLESS 16K OOR MORE TAD Z40 /TYPE EXTENDED ERROR MESSAGE TYPE TAD Z40 TYPE / TAD Z40 / TYPE TAD N TAD (XERBAS-1 DCA PTR /GET PTR TO PTR TO ERROR MSG CDF 30 TAD I PTR /GET PTR TO ERROR MESSAGE DCA PTR XLUP, TAD I PTR CDF 0 SNA JMP I (ERRRET SPA JMS NEGCHR /NEGATIVE CHAR IS FLAG FOR ERRONEOUS CHARACTER PUTT ISZ PTR CDF 30 JMP XLUP CTCT, KRS /CTRL/C ERROR MESSAGE AND [177 /ISOLATE ^C OR ^P INTO 7-BIT TYPE /READ CTRL/C FROM BUFFER CRLF /ECHO IT AND CR LF TAD I [QPNTR SZA CLA JMP ERL2 /PRINT XAB ERROR MESSAGE / MTHREE / TAD CHAR /LOOK AT PREVIOUS CHARACTER / SZA CLA / JMP I (ERRRET /ONE ^C DO NOTHING JMP I (CTLC /TWO ^C'S, ABORT NEGCHR, 0 CLA TAD LASTC SORT CACR ERPTAB-CACR SPA DCA LASTC /SAVE $ FOR ALTMODE CLA TAD ("" PUTT TAD LASTC AND [7740 SNA CLA JMS WOW /USE CARRET FORM FOR CONTROL CHARS TAD LASTC /AC MAY BE NON-0 PUTT TAD ("" JMP I NEGCHR WOW, 0 TAD ("^ PUTT TAD [100 JMP I WOW SPY, TAD LASTC TAD (-11+CNVTAB DCA WOW TAD ("< PUTT TAD I WOW RTR RTR RTR JMS I (SIXTYP TAD I WOW JMS I (SIXTYP TAD ("> JMP I NEGCHR PTR, 0 PAGE SIXTYP, 0 AND [137 /IGNORE SIGN BIT OF BYTE TAD [40 AND [77 TAD [40 PUTT JMP I SIXTYP ERLIST, -ERR01-1 /LIST OF POINTERS TO ALL POSSIBLE -ERR02-1 /CALLS TO THE ERROR ROUTINE. -ERR03-1 -ERR04-1 -ERR05-1 -ERR06-1 -ERR07-1 -ERR08-1 -ERR09-1 -ERR10-1 -ERR11-1 -ERR12-1 -ERR13-1 -ERR14-1 -ERR15-1 -ERR16-1 -ERR17-1 -ERR18-1 -ERR19-1 -ERR20-1 -ERR21-1 -ERR22-1 -ERR23-1 -ERR24-1 -ERR25-1 -ERR26-1 -ERR27-1 ERR28, -ERR28-1 -ERR29-1 -ERR30-1 -ERR31-1 -ERR32-1 -ERR33-1 -ERR34-1 -ERR35-1 0 /ERROR 36 - UNLABELED ERROR - NAMELY "JMS I OUTR" /** MUST BE LAST ERROR MESSAGE ERBASE, TEXT /ILL/ /1 ILLEGAL COMMAND TEXT /UTC/ /2 UNTERMINATED COMMAND TEXT /IQN/ /3 ILLEGAL Q-REGISTER NAME TEXT /PDO/ /4 INTERNAL PUSH DOWN OVERFLOW (RECURSION) TEXT /MEM/ /5 MEMORY OVERFLOW TEXT /STL/ /6 SEARCH STRING TOO LONG TEXT /ARG/ /7 ARGUMENT ERROR TEXT /IFN/ /8 ILLEGAL FILE NAME TEXT /SNI/ /9 SEMICOLON NOT IN ITERATION TEXT /BNI/ /10 CLOSE BRACKET NOT IN ITERATION TEXT /POP/ /11 POINTER OFF PAGE TEXT /QMO/ /12 Q-REGISTER MEMORY OVERFLOW TEXT /UTM/ /13 UNTERMINATED MACRO TEXT /OUT/ /14 OUTPUT ERROR TEXT /INP/ /15 INPUT ERROR TEXT /FER/ /16 FILE ERROR TEXT /FUL/ /17 OUTPUT COMMAND WOULD HAVE OVERFLOWED TEXT /NAY/ /18 NEGATIVE ARGUMENT TO Y TEXT /IEC/ /19 ILLEGAL E CHARACTER TEXT /IQC/ /20 ILLEGAL " CHARACTER TEXT /NAE/ /21 NO ARGUMENT BEFORE = TEXT /NAU/ /22 NO ARGUMENT BEFORE U TEXT /NAQ/ /23 NO ARGUMENT BEFORE " TEXT /SRH/ /24 FAILING SEARCH TEXT /NAP/ /25. NEGATIVE OR 0 ARGUMENT TO P TEXT /NAC/ /26. NEGATIVE ARGUMENT TO , TEXT /NYI/ /27. ^W NOT IMPLEMENTED TEXT /DMY/ /28. NOT USED TEXT /NAS/ /29. NEGATIVE OR 0 COUNT TO SEARCH TEXT /WLO/ /30. CAN'T WRITE OUT ERROR MESSAGE OVERLAY TEXT /IFC/ /31. ILLEGAL F CHARACTER TEXT /YCA/ /32. Y COMMAND ABORTED TEXT /CCL/ /33. CCL NOT FOUND OR EG TOO BIG / TEXT /XAB/ /34. EXECUTION ABORTED BY ^C 7001;0200 TEXT /NYI/ /35. ^V NOT IMPLEMENTED TEXT /NFO/ /36. NO FILE FOR OUTPUT CNVTAB, TEXT /HTLFVTFFCR/ *.-1 ERPTAB, SPY /CR SPY /HT 4044 /$ SPY /FF SPY /VT SPY /LF PAGE RELOC / X-OVERLAY *6600 RELOC 3200 IOVRLC QOVRLC EOVRLC XOVRLY, 0 FOVRLC CHREX, TAD I (TYI SORT XLIS XTAB-XLIS ERR /CAN'T HAPPEN XLIS, 103 /EC 106 /EF 107 /EG 113 /EK 130 /EX /"EX" AND "EC" COMMANDS EXIT, PUSHJ /"EX" COMMAND EXITC /CLOSE OUT THE FILES JMP I (CTLC /AND GO AWAY EXITC, TAD OUTR /"EC" COMMAND CIA /CHECK FOR OPEN OUTPUT FILE TAD ERROR SNA CLA POPJ /NOPE, EXIT ALREADY EXLOOP, JMS I [NXTBUF /GET NEXT BUFFER TAD REND CIA TAD ZZ /CHECK FOR END-OF-FILE AND SZA CLA /TEXT BUFFER EMPTY JMP EXLOOP /NOT YET /ENDFILE PROCESSOR ENDFIL, TAD OCRCNT CMA /REDUCE THE OUTPUT DOUBLEWORD COUNT AND [177 /TO REFLECT ONLY THOSE WORDS REMAINING CMA /UNTIL THE NEXT BLOCK BOUNDARY DCA OCRCNT TAD (7200 /USED TO BE 'DV7200' DCA MQ /SET COUNTER FOR ONE BLOCK WORTH OF STUFF TAD (32 /^Z END-OF-FILE OUTPUT ISZ MQ JMP .-2 /FILL AT LEAST THE CURRENT BUFFER AND OUTPUT IT TAD ODEV /MAKE SURE THE USR KNOWS THE HANDLER TAD (OSHNDT-1 /*K* - POINTER INTO DCA TY / OS/8 DEVICE RESIDENCY TABLE CDF 10 TAD OUTHND DCA I TY /MARK THE HANDLER AS IN CORE JMS I (GETUSR /LOCK THE USR INTO CORE TAD EBFLG /IS THIS AN EDIT BACKUP? SNA CLA JMP I (NORMAL /NO, JUST CLOSE FILE TAD I (OCNT-1 /YES, LOOKUP OLD FILE TO CHANGE NAME DCA TY-1 CIF 10 TAD ODEV /INPUT AND OUTPUT ARE ON SAME DEVICE JMS I [200 2 OUNAM TY, 0 /USELESS LENGTH--USE IT FOR TEMPORARY JMP I (NORMAL /ERROR-JUST CLOSE FILE AND DON'T TELL ANYBODY CDF 10 /ALL THAT WAS JUST TO GET THE DIRECTORY IN CORE STA /SO WE COULD FIDDLE WITH IT TAD I (17 /FORM POINTER TO DIRECTORY ENTRY TAD I (1404 DCA TY TAD (213 /CHANGE EXTENSION TO .BK DCA I TY TAD I Z7 /DIRECTORY BLOCK IT CAME FROM AND Z7 DCA ACI CDF 0 JMS I OUTHND 4210 /WRITE IT BACK OUT 1400 ACI, 0 JMP .-4 /ERROR! KEEP TRYING-THIS CAN BLOW A DIRECTORY JMP I (NORMAL XTAB, EXITC /EC ENDFIL /EF EXITGO /EG EKILL /EK EXIT /EX EKILL, TAD ERROR DCA OUTR POPJ PAGE EXITGO, PUSHJ /DO AN EC TO CLOSE OUT FILE EXITC QCHK /ALLOW @ DCA STOCD /MAKE REUSABLE IN CASE .START TAD (7600 DCA CDPTR TAD (-47 /47 ENTRIES IN CD TABLE DCA EGCNT EG1, QUOTST JMP EG2 TAD [200 /TURN ON PARITY BIT FOR OS/8 JMS STOCD JMP EG1 STOCD, 0 ISZ EGCNT SKP ERR33, ERR /EG ARG TOO BIG CDF 10 DCA I CDPTR CDF 0 ISZ CDPTR JMP I STOCD CDPTR, 7600 EGCNT, -41 EG2, TAD STOCD SNA CLA /ANYTHING IS ARG JMP REGEG /NO JMS STOCD /STORE 0 AT END JMS I (GETUSR TAD (CCLNAM DCA ARG1 /JUST IN CASE PREVIOUS EG FAILED CLA IAC /SYS CIF 10 JMS I [200 2 /LOOKUP ARG1, CCLNAM 0 JMP CCLERR TAD (2001 DCA I (JSBITS /KEEP USR IN CORE TAD ARG1 DCA CHNBLK CIF 10 JMS I [200 6 /CHAIN CHNBLK, 0 CCLERR, PUSHJ ECDISM JMP ERR33 CCLNAM, FILENAME CCL.SV REGEG, /EDIT AND GO - A CCL SPECIAL JMS I (7607 /CALL THE OS/8 SYSTEM HANDLER 0200 /TO READ IN THE CCL OVERLAY CCLADR CCLOVL JMP ERR33 /ERROR ON SYSTEM DEVICE! JMP I .+1 /GO TO THE OVERLAY CCLOST /AT OUR "SPECIAL" LOCATION RELOC / F-OVERLAY *7200 RELOC 3200 IOVRLC QOVRLC EOVRLC XOVRLC FOVRLY, 0 CHRED, TAD I (TYI SORT DLIS DTAB2-DLIS /CHECK FOR LEGALITY ERR19, ERR /BAD CHAR AFTER E DTOK, TAD I (TYI SORT DLIS DTAB-DLIS DCA XXFLAG NCHK /ANY ARGUMENT? JMP XXNO /NO, RETURN VALUE TAD N /YES DCA I XXFLAG /SET NEW VALUE TAD XXFLAG TAD (-EDFLAG+XXSUBS DCA XXSUB TAD I XXSUB DCA XXSUB JMS I XXSUB /CALL IT POPJ /RETURN XXNO, TAD I XXFLAG /GET VALUE JMP I (NNEW13 /MAKE NEW 13-BIT VALUE DLIS, 104 /ED 110 /EH 117 /EO 123 /ES 124 /ET 125 /EU DTAB, EDFLAG /MUST BE NEGATIVE EHFLAG /TO CAUSE SUBSTITUTION EOFLAG ESFLAG ETFLAG EUFLAG XXFLAG, 0 /POINTS TO FLAG IN MEMORY ABOVE 4000 DTAB2, DTOK DTOK DTOK DTOK DTOK DTOK XXSUB, 0 / MASK;SKIP;LOC;VALUE IF SKIPS;VALUE IF NO SKIP EUSUB, 0 JMS FIXUP 7777; SMA CLA; EU1; CLA; SNA CLA 7777; SPA SNA CLA; EU2; TAD [40;NOP 0 JMP I EUSUB ETSUB, 0 JMS FIXUP 1; SNA CLA; KTYPE; PUTT; TYPE 1; SNA CLA; ET1; PUTT; TYPE 10; SNA CLA; ET8; CLA; TYPE 0 JMP I ETSUB LOC, 0 MASK, 0 FIXUP, 0 FIXLUP, TAD I FIXUP SNA JMP I FIXUP /DONE, RETURN TO 0 DCA MASK /SAVE MASK ISZ FIXUP TAD I FIXUP DCA SKIPY /SAVE SKIP CONDITION ISZ FIXUP TAD I FIXUP DCA LOC /SAVE LOC TO CHANGE ISZ FIXUP TAD I XXFLAG /LOOK AT FLAG AND MASK /'AND' WITH MASK SKIPY, HLT JMP SKPF TAD I FIXUP DCA I LOC ISZ FIXUP SKPT, ISZ FIXUP JMP FIXLUP SKPF, ISZ FIXUP TAD I FIXUP DCA I LOC JMP SKPT CTLUO, QREF /COMMAND ^U QSKP /COUNT UP STRING TAD OSCANP CMA TAD SCANP /LENGTH OF STRING / / *** PROHIBIT STRING > 2047 CHARS / ADJQ /ADJUST Q-REGISTERS AND SET NEW LENGTH TAD OSCANP /RESET SCAN POINTER DCA SCANP DCA NFLG NOTRCE CCUB, QUOTST JMP CTLUND QPUT JMP CCUB CTLUND, ENTRCE JMP I [IREST PAGE /NUMERICAL OUTPUT ROUTINE ZEROD, 0 DCA ZERFLG /INITIALIZE "LEADING ZEROS" FLAG TAD I ZEROD ISZ ZEROD DCA OUTDEV /SAVE OUTPUT ROUTINE ADDRESS TAD NLINK /POS OR NEGATIVE? SNA CLA JMP ZER2 /POSITIVE TAD RADIX TAD (-ORAD SNA CLA JMP PUTSGN /OCTAL TAD N /DECIMAL CIA DCA N /NEGATE SKP PUTSGN, TAD ["1-"- TAD ("- JMS I OUTDEV /OUTPUT MINUS SIGN ZER2, MTHREE DCA ZCOUNT /ITERATION COUNT TAD RADIX DCA RXR ZDIGIT, ISZ RXR TAD I RXR DCA DIV1 /GET DIVISOR TAD N MQLDVI /DIVIDE BY A POWER OF THE BASE DIV1, 0 TAD ZERFLG SNA JMP LZ /IGNORE LEADING ZEROS TAD (60 JMS I OUTDEV STL RAR DCA ZERFLG /SET LEADING ZEROS FLAG LZ, TAD DVT1 /GET REMAINDER DCA N ISZ ZCOUNT /GO AROUND AGAIN? JMP ZDIGIT /WHY NOT? TAD N TAD (60 JMS I OUTDEV /OUTPUT LAST DIGIT NO MATTER WHAT JMP I ZEROD OUTDEV, 0 /WHERE WE'RE SENDING THE DIGITS ZERFLG, 0 ZCOUNT, 0 RXR, 0 /COMMANDS = AND \ /COMMANDS = AND \ - NUMERICAL OUTPUT CEQLO, NCHK /COMMAND = ERR21, ERR /NO NUMBER TAD RADIX DCA RADTMP JMS I (POKE /LOOK AHEAD ONE CHARACTER TAD (-75 /CHECK FOR = SIGN SZA CLA JMP SETRAD /SINGLE = SCAN /DOUBLE = (PASS UP SECOND ONE) SKP CLA /CLEAR AC SETRAD, TAD [4 TAD (ORAD DCA RADIX /SET OCTAL RADIX TEMPORARILY JMS ZEROD TPUT TAD RADTMP DCA RADIX /RESTORE ORIGINAL RADIX ISZ CLNF /: SEEN? CRLF /NO, END WITH CRLF DCA CLNF POPJ CBSLO, NCHK /COMMAND \ JMP CBSN JMS ZEROD UPOC POPJ RADTMP, 0 CBSN, PUSHJ NMBR2 /INITIALIZE RESULT TO 0 JMS PTCH TAD I P AND [377 /GET CURRENT CHARACTER CDF 0 TAD (-55 /CHECK FOR MINUS SIGN SZA JMP .+3 /NOT MINUS PUSHJ CMIN /RECORD MINUS SIGN CIA CLL RTR SNA CLA /CHECK FOR PLUS SIGN CBSNP, ISZ P /BUMP POINTER PAST SIGN JMS PTCH TAD I P /GET A CHAR AND [377 CDF 0 TAD (-72 CLL TAD CALF SNL /IS IT A DIGIT? POPJ /NO PUSHJ NMBR2 /YES - ACCUMULATE IT JMP CBSNP /AND LOOP PTCH, 0 TAD P /V3C STL CIA /CHECK FOR END OF BUFFER TAD ZZ SZL SNA CLA POPJ CDF 10 JMP I PTCH XXSUBS, EDSUB EHSUB EOSUB ESSUB ETSUB EUSUB / CXSUB /CXSUB, EDSUB, EHSUB, ESSUB, EOSUB, 0 JMP I EOSUB PAGE RELOC FIELD 1 *4400 XERBAS, XER1 XER2 XER3 XER4 XER5 XER6 XER7 XER8 XER9 XER10 XER11 XER12 XER13 XER14 XER15 XER16 XER17 XER18 XER19 XER20 XER21 XER22 XER23 XER24 XER25 XER26 XER27 XER28 XER29 XER30 XER31 XER32 XER33 XER34 XER35 XER36 XER1, "I;"l;"l;"e;"g;"a;"l;" ;"C;"o;"m;"m;"a;"n;"d;" ;4000;0 XER2, "U;"n;"t;"e;"r;"m;"i;"n;"a;"t;"e;"d;" ;"C;"o;"m;"m;"a;"n;"d;0 XER3, "I;"l;"l;"e;"g;"a;"l;" ;"Q;"-;"r;"e;"g;"i;"s;"t;"e;"r;" ;"N;"a;"m;"e;" ;4000;0 XER4, "I;"n;"t;"e;"r;"n;"a;"l;" ;"P;"u;"s;"h;" ;"D;"o;"w;"n;" ;"O;"v;"e;"r "f;"l;"o;"w;0 XER5, "S;"t;"o;"r;"a;"g;"e;" ;"C;"a;"p;"a;"c;"i;"t;"y;" ;"E;"x;"c;"e;"e;"d;"e;"d;0 XER6, "S;"e;"a;"r;"c;"h;" ;"S;"t;"r;"i;"n;"g;" ;"t;"o;"o;" ;"L;"o;"n;"g;0 XER7, "I;"m;"p;"r;"o;"p;"e;"r;" ;"A;"r;"g;"u;"m;"e;"n;"t;"s;0 XER8, "I;"l;"l;"e;"g;"a;"l;" ;"C;"h;"a;"r;"a;"c;"t;"e;"r;" ;4000 " ;"i;"n;" ;"F;"i;"l;"e;"n;"a;"m;"e;0 XER9, ";;" ;"n;"o;"t;" ;"i;"n;" ;"a;"n;" ;"I;"t;"e;"r;"a;"t;"i;"o;"n;0 XER10, ">;" ;"n;"o;"t;" ;"i;"n;" ;"a;"n;" ;"I;"t;"e;"r;"a;"t;"i;"o;"n;0 XER11, "A;"t;"t;"e;"m;"p;"t;" ;"t;"o;" ;"M;"o;"v;"e;" ;"P;"o;"i;"n;"t;"e;"r " ;"O;"f;"f;" ;"P;"a;"g;"e;0 XER12, "Q;"-;"r;"e;"g;"i;"s;"t;"e;"r;" ;"M;"e;"m;"o;"r;"y;" ;"O;"v;"e;"r;"f;"l;"o;"w;0 XER13, "U;"n;"t;"e;"r;"m;"i;"n;"a;"t;"e;"d;" ;"M;"a;"c;"r;"o;0 XER14, "O;"u;"t;"p;"u;"t;" ;"E;"r;"r;"o;"r;0 XER15, "I;"n;"p;"u;"t;" ;"E;"r;"r;"o;"r;0 XER16, "F;"i;"l;"e;" ;"E;"r;"r;"o;"r;0 XER17, "O;"u;"t;"p;"u;"t;" ;"C;"o;"m;"m;"a;"n;"d;" ;"w;"o;"u;"l;"d;" ;"h;"a;"v;"e " ;"O;"v;"e;"r;"f;"l;"o;"w;"e;"d;0 XER18, "N;"u;"m;"e;"r;"i;"c;" ;"A;"r;"g;"u;"m;"e;"n;"t;" ;"t;"o;" ;"Y;0 XER19, "I;"l;"l;"e;"g;"a;"l;" ;"C;"h;"a;"r;"a;"c;"t;"e;"r;" ;4000 " ;"a;"f;"t;"e;"r;" ;"E;0 XER20, "I;"l;"l;"e;"g;"a;"l;" ;"C;"h;"a;"r;"a;"c;"t;"e;"r;" ;4000 " ;"a;"f;"t;"e;"r;" ;"";0 XER21, "N;"o;" ;"A;"r;"g;"u;"m;"e;"n;"t;" ;"b;"e;"f;"o;"r;"e;" ;"=;0 XER22, "N;"o;" ;"A;"r;"g;"u;"m;"e;"n;"t;" ;"b;"e;"f;"o;"r;"e;" ;"U;0 XER23, "N;"o;" ;"A;"r;"g;"u;"m;"e;"n;"t;" ;"b;"e;"f;"o;"r;"e;" ;"q;"u;"o;"t;"e;0 XER24, "S;"e;"a;"r;"c;"h;" ;"f;"a;"i;"l;"e;"d;0 XER25, "N;"e;"g;"a;"t;"i;"v;"e;" ;"o;"r;" ;"Z;"e;"r;"o " ;"A;"r;"g;"u;"m;"e;"n;"t;" ;"t;"o;" ;"P;0 XER26, "N;"e;"g;"a;"t;"i;"v;"e;" ;"a;"r;"g;"u;"m;"e;"n;"t;" ;"t;"o;" ;",;0 XER27, "C;"a;"s;"e;" ;"S;"u;"p;"p;"o;"r;"t;" ;"n;"o;"t " ;"I;"m;"p;"l;"e;"m;"e;"n;"t;"e;"d;215;212;211;177;177 "[;"u;"s;"e;" ;"W;" ;"f;"o;"r;" ;"W;"a;"t;"c;"h;" ;"C;"o;"m;"m;"a;"n;"d;"];0 /XER28, /"N;"e;"g;"a;"t;"i;"v;"e;" ;"o;"r;" ;"Z;"e;"r;"o;" /"I;"t;"e;"r;"a;"t;"i;"o;"n;" ;"C;"o;"u;"n;"t;0 XER28, 0 XER29, "N;"e;"g;"a;"t;"i;"v;"e;" ;"o;"r;" ;"Z;"e;"r;"o;" "A;"r;"g;"u;"m;"e;"n;"t;" ;"t;"o;" ;"S;0 XER30, "C;"a;"n;"n;"o;"t;" ;"W;"r;"i;"t;"e;" ;"O;"u;"t;" ;"E;"r;"r;"o;"r " ;"M;"e;"s;"s;"a;"g;"e;" ;"O;"v;"e;"r;"l;"a;"y;0 XER31, "I;"l;"l;"e;"g;"a;"l;" ;"C;"h;"a;"r;"a;"c;"t;"e;"r;" ;4000 " ;"a;"f;"t;"e;"r;" ;"F;0 XER32, "Y;" ;"C;"o;"m;"m;"a;"n;"d;" ;"A;"b;"o;"r;"t;"e;"d;0 XER33, "C;"C;"L;".;"S;"V;" ;"n;"o;"t;" ;"f;"o;"u;"n;"d;" ;"o;"r;" "E;"G;" ;"a;"r;"g;"u;"m;"e;"n;"t;" ;"t;"o;"o;" ;"b;"i;"g;0 XER34, "E;"x;"e;"c;"u;"t;"i;"o;"n;" ;"a;"b;"o;"r;"t;"e;"d;0 XER35, "C;"a;"s;"e;" ;"S;"u;"p;"p;"o;"r;"t;" ;"n;"o;"t;" "I;"m;"p;"l;"e;"m;"e;"n;"t;"e;"d;215;212;211;177;177 "[;"u;"s;"e;" ;"E;"O;" ;"f;"o;"r " ;"V;"e;"r;"s;"i;"o;"n;" ;"n;"u;"m;"b;"e;"r;"];0 XER36, "N;"o;" ;"F;"i;"l;"e;" ;"f;"o;"r;" ;"O;"u;"t;"p;"u;"t;0 PAGE COREAD, 0 ISZ COREAD TAD I COREAD /GET BLOCK # AND CO7 CLL RTR RTR RAR /MULTIPLY BY 400 TAD KMEM DCA FLO TAD M400 DCA FLCNT TAD K3200 DCA FTO FLOO, CDF 30 TAD I FLO CDF 0 DCA I FTO ISZ FLO ISZ FTO ISZ FLCNT JMP FLOO ISZ COREAD CIF CDF 0 JMP I COREAD FLCNT, 0 CO7, 7 M400, -400 K3200, 3200 KMEM, MEMLOC FLO, 0 FTO, 0 COREND=. NEWERR, RELOC OVREAD CIF 30 /NEW CODE TO READ OVERLAY JMS I .+1 /MUST BE 5 LOCS LONG COREAD TMP, 0 /BLOCK # NOP RELOC PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | /3 TTY HANDLER FOR BUILD / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -1 DEVICE AS33;DEVICE TTY;0;1;ZBLOCK 2 TTYVERSION="A&77 /V3 FIXES: /1. NOW RECOGNIZES PARITY ^Z ON OUTPUT /2. NOW RECOGNIZES ^Z ON OUTPUT EVEN IF NOT / FOLLOWED BY 0'S /3. VERSION # IS NOW 1. *200 /TELETYPE HANDLER - NOT VERY INTELLEGENT. /ONLY RECOGNIZES ^Z AND ^C ON INPUT /AND ^C AND ^O ON OUTPUT /OH WELL, WHAT CAN YOU EXPECT IN ONE PAGE. / THE LOGIC IS VERY SIMILIAR TO THE PTR AND PTP HANDLERS. TTY360, 360 /MUST BE FIRST LOC ON PAGE! TTY, TTYVERSION TT7600, 7600 RDF TAD TTYCIF DCA TTYXIT /SAVE RETURN FIELD TAD I TTY AND TT70 TAD TTCDF DCA TTYCDF /DATA FIELD OF BUFFER CLA CLL CML RAR TAD I TTY AND TT3700 CMA DCA TTYWC ISZ TTY TAD I TTY DCA TTYCA /SAVE BUFFER ADDRESS ISZ TTY ISZ TTY JMP TTKLG TTYLP, SNL CLA JMP TTYGLP /ZER LINK MEANS READ JMS TTYTST /TEST FOR ^C TAD TTYM14 /-203-14=-217 =-"^O" SNA CLA JMP TTYCTO TAD I TTYCA /CHARACTER 1 IS LOW ORDER 8 BITS OF WORD 1 JMS TTYPCH DCA TTYGCH ISZ TTYCA TT7400, 7400 TAD I TTYCA /CHARACTER 2 IS LOW ORDER 8 BITS OF WORD 2 JMS TTYPCH CLL RTR RTR TAD TTYGCH CLL RTR RTR /CHARACTER 3 IS HIGH ORDER 4 BITS OF WORDS 1 AND 2 JMS TTYPCH /WILL SET LINK ON! TTLOOP, ISZ TTYCA /AC HAPPENS TO BE ZERO HERE TT70, 70 TTKLG, ISZ TTYWC JMP TTYLP TTYRTN, TAD TTYCDF CLL CIA SNL CLA ISZ TTY /SKIP PAST ERROR RETURN TTYXIT, HLT /RESTORE CALLING FIELDS RAL JMP I TTY TTYPCH, 0 /MUST SET LINK ON! DCA TTYTST TAD TTYTST TAD TTYM32 /ONLY CARE IF LOW ORDER 7 BITS ARE -32 AND TTY177 /SO ONLY LOOK AT THESE BITS SNA CLA JMP TTYRTN /WAS A ^Z TAD TTYTST /GET BACK ALL 12 BITS JMS TTPRNT AND TT7400 /BUT RETURN ONLY LEFT THIRD STL /**** CRUD JMP I TTYPCH TTY212, 212 IFNZRO .-TTY360-100 <ER3700,QQQQ> TTYCA, 0 TTYWC, 0 TTYTST, 0 TTYCDF, 0 TAD TTY200 KRS /TEST FOR ^C WITH FLAG UP TAD TTM203 SNA KSF JMP I TTYTST TTYCIF, CDF CIF 0 JMP I TT7600 TTPRNT, 0 TLS TSF JMP .-1 JMP I TTPRNT TTCDF, CDF 0 /FOLLOWING CODE READS TTY AND PACKS IN BUFFER. TTYGLP, JMS TTYGCH DCA I TTYCA TTYM32, JMS TTYGCH DCA TTYPCH JMS TTYGCH RTL RTL DCA TTYGCH TAD TTYGCH AND TT7400 TAD I TTYCA TT3700, DCA I TTYCA TAD TTYGCH TTY200, AND TTY360 CLL RTL RTL /CLEARS LINK TAD TTYPCH ISZ TTYCA DCA I TTYCA JMP TTLOOP IFNZRO .-TTY360-146 <TTYERR,QQQQQ> TTYGCH, 0 /MUST BE AT REL LOC 146 TAD TTYCDF TT7700, SMA CLA JMP I TTYGCH ISZ TTYTST JMP TTYKSF TAD TTY212 JMP TTECHO TTYKSF, KSF JMP .-1 JMS TTYTST TAD TTM27 SNA /IS IT A ^Z? DCA TTYCDF /YES - SET END-OF-FILE FLAG TAD TTY14 DCA TTYTST /TTYTST=-1 IF CARRIAGE RETURN KRB TTECHO, JMS TTPRNT /ECHO THE INPUT CHARACTER JMP I TTYGCH TTM203, -203 TTM27, -27 TTYM14, -14 TTY177, 177 IFNZRO .-TTY360-175 <NICE,QQ> TTYCTO, 6032 /SHOULD BE AT REL LOC 175 FOR PATCHERS JMP TTYRTN TTY14, 14 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | /1 BATCH INPUT STREAM HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -1 /NUMBER OF DEVICES DEVICE BAT /DEVICE TYPE NAME DEVICE BAT /DEVICE NAME 2220 /READ ONLY, CODE=22 0 /ONE PAGE ZBLOCK 2 BATIN= 5400 BATVERSION="B&77 *200 BAT, BATVERSION CLA /PROTECTION RDF /GET USER'S FIELD TAD BATCDF /MAKE CDF CIF DCA BATXIT /SAVE FOR EXIT TAD BATISZ /RESET SUCCESS ISZ DCA BATXIT-1 TAD I BAT AND BA7700 CIA DCA BATWC /SAVE WORD COUNT (DIVIDED BY 2) TAD I BAT AND BA0070 TAD BATCDF /CREATE CDF TO BUFFER FIELD TAD (-2 DCA BATBUF BATISZ, ISZ BAT TAD I BAT DCA BATCA /GET ADDRESS OF BUFFER ISZ BAT ISZ BAT /IGNORE BLOCK NUMBER TAD BATWC /WAS COMMAND WRITE OR BUFFER LENGTH ZERO? BA7700, SMA CLA JMP BATER1 /YES - ERROR BATCDF, CDF CIF 0 TAD I BA7777 /IS BATCH RUNNING? RAL SMA CLA JMP BATER2 /NO - ERROR TAD I BA7777 AND BA0070 TAD BATCDF /CREATE CDF TO BATCH FIELD DCA BATCAL /CREATE CDF CIF TO BATCH FIELD BATLP, JMS BATGET /GET CHAR DCA I BATCA /SAVE IN BUFFER JMS BATGET /GET NEXT CHAR DCA BATTMP /SAVE IT FOR PACKING JMS BATGET /GET NEXT CHAR RTL RTL DCA BATTM2 /SAVE IT TAD BATTM2 AND BA7400 /ADD FIRST HALF TAD I BATCA /TO FIRST CHAR DCA I BATCA /SAVE THEM IN BUFFER ISZ BATCA /UPDATE POINTER BA7400, 7400 /PROTECT THE ISZ TAD BATTM2 /GET SECOND HALF OF CHAR RTL RTL AND BA7400 TAD BATTMP /ADD TO SECOND CHAR DCA I BATCA /SAVE IN BUFFER ISZ BATCA /UPDATE POINTER BA0070, 0070 /PROTECT THE ISZ ISZ BATWC /DONE? JMP BATLP /NO - LOOP ISZ BAT /SUCCESS RETURN (ON EOF THIS BECOMES CLA IAC) BATXIT, HLT /CDF CIF TO USER FIELD JMP I BAT /RETURN BATWC, 0 /WORD COUNT (DIVIDED BY 2) BATCA, 0 /POINTER INTO BUFFER BATTM2, BATCHR, 0 /CHAR RETURNED BY BATGET BATTMP, 0 BA7777, 7777 BATER1, BATER2, CLA STL RAR JMP BATXIT /THIS ROUTINE GETS THE NEXT CHARACTER TO BE PUT INTO THE BUFFER BATGET, 0 0 /IF LAST CHAR WAS <CR> THIS IS "JMP BATLF" BATCAL, HLT /CIF CDF BATCH FIELD (ON EOF THIS IS "JMP BATBUF") TAD I BATVFY TAD (-2214 /VERIFY MAGIC LOCATION IN BATCH SZA /AGAINST EQUALLY MAGIC CONTENTS CDF CIF 0 SZA CLA JMP BATER2 /BATCH IS DESTROYED! CDF /WE ARE IN FIELD ZERO JMS I BATINN /CALL THE BATCH INPUT ROUTINE JMP BATEOF /NO SKIP = END OF FILE DCA BATCHR /SAVE CHARACTER RETURNED TAD BATCHR TAD BMCR /CARRIAGE RETURN? SNA JMP BATCR /YES TAD BCRMLF /LINE FEED? SNA JMP BATCAL /YES - IGNORE IT TAD BLFMDO /DOLLAR SIGN? SNA CLA JMP BATDO /YES BATGEX, DCA BCRFLG /NO SPECIAL CHAR TAD BATCHR /RETURN WITH CHAR IN AC BATBUF, HLT /CDF USER BUFFER JMP I BATGET /RETURN BLFJMP, JMP BATLF BATCR, TAD BLFJMP /SET NEXT CALL TO RETURN <LF> DCA BATGET+1 CLA CMA /SET TO INDICATE <CR> JMP BATGEX BATLF, DCA BATGET+1 /ZAP THE JMP TO HERE TAD BLF /RETURN <LF> BATGEJ, JMP BATBUF BATDO, TAD BCRFLG /IS THE "$" FIRST ON THIS LINE? SNA CLA JMP BATGEX /NO - NOTHING SPECIAL TAD I BA7777 /YES - SET FLAG SO THAT RTR /THE BATCH INPUT ROUTINE STL RTL /WILL PUT THE DOLLAR-SIGN BACK DCA I BA7777 /RETURN CURRENT CHARACTER AGAIN BATEOF, TAD BATCTZ /RETURN CTRL-Z THIS TIME DCA BATCHR DCA BATXIT-1 /SET HANDLER TO RETURN TO ERROR RETURN TAD BATGEJ /SET BATGET TO RETURN ZEROES DCA BATCAL JMP BATCR+2 /AND FLAG NEW LINE FOR NEXT CALL BATINN, BATIN /ENTRY ADDRESS OF BATCH INPUT ROUTINE BATVFY, BATIN+200 BLF, 212 BMCR, -215 BCRMLF, 215-212 BLFMDO, 212-"$ BCRFLG, -1 BATCTZ, 32 /CTRL-Z $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 | /3 CARD READER FOR BUILD / / / / / / / / / /COPYRIGHT (C) 1974 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -1 DEVICE CR8E;DEVICE CDR;2030;4000;ZBLOCK 2 CDRVERSION="C&77 /V3 CHANGES: /1. VERSION # IS NOW 1 /2. FIXED BUG FOR CARDS WITH ODD NUMBER OF COLUMNS /3. CARD DONE FLAG IS CLEARED AT END *200 RCSF=6631 RCRA=6632 RCSP=6671 RCSE=6672 RCRD=6674 CDR, CDRVERSION /ENTRY POINT RELATIVE ZERO CDR770, 7700 /"SMA CLA" CLEARS THE AC CDRTMP, 0 /LESS THAN 400 - PROTECTS THE "SMA CLA" JMP CDRSET /INITIALIZATION - BECOMES "RDF" TAD CDRCIF /FORM "CIF CDF N" TO CALLING FIELDS DCA CDRXIT /SAVE CALLING FIELDS TAD CDRCCF-1 DCA CDRXIT-1 /RESTORE THE "ISZ CDR" TAD I CDR /GET FUNCTION WORD AND CDR070 /GET BUFFER FIELD BITS TAD CDRCCF /MAKE A "CDF N" DCA CDBCDF /SAVE IT IN THE GET CHAR LOOP TAD I CDR /GET FUNCTION WORD AGAIN ISZ CDR SPA /IS IT A WRITE FUNCTION? JMP CDRERR /YES - HARD ERROR AND CDR770 /GET COUNT BITS CIA DCA CDRWC /SAVE WORD COUNT (DIVIDED BY 2) TAD I CDR /GET BUFFER ADDRESS DCA CDRCA /AND SAVE IT ISZ CDR /THE BLOCK NUMBER IS IGNORED CDRCCF, CDF /WE ARE IN FIELD 0 DCA I CDRIN2 /RESET ^Z FLAG TO ZERO CDRLP, JMS I CDRIN4 /GET A CHARACTER DCA CDRTM1 /DATA FIELD STILL ZERO ON RETURN! JMS I CDRIN4 /GET NEXT CHARACTER DCA CDRTMP /AND SAVE IT JMS I CDRIN4 /GET NEXT CHARACTER RTL RTL /GET THE FIRST FOUR BITS OF IT DCA CDRTM2 /SAVE THE REST FOR LATER TAD CDRTM2 AND CDR740 /ONLY 4 BITS TAD CDRTM1 /ADD THOSE BITS TO THE 1ST CHAR CDBCDF, HLT /CDF TO BUFFER FIELD DCA I CDRCA /STORE 1ST CHARACTER ISZ CDRCA /BUMP POINTER TO BUFFER CDR740, 7400 /PROTECT THE ISZ AGAINST SKIPS TAD CDRTM2 RTL RTL /NOW GET LOW ORDER 4 BITS AND CDR7400 /AND ONLY 4 BITS TAD CDRTMP /ADD IN THE 2ND CHARACTER DCA I CDRCA /AND STORE THE WORD ISZ CDRCA /BUMP POINTER AGAIN CDR070, 70 /PROTECT THE ISZ CDF 0 /CDRGCH NEEDS 0 DF ON ENTRY! ISZ CDRWC /DONE? JMP CDRLP /NO - LOOP CDRERR, ISZ CDR /HERE WITH NEGATIVE AC ON WRITE - FATAL ERROR ISZ CDR /IF ^Z THIS IS ZEROED CDRXIT, HLT /RESTORE CALLING FIELDS JMP I CDR /EXIT CDRCA, 0 /BUFFER POINTER CDRWC, 0 /WORD COUNT DIVIDED BY 2 CDRTM1, 0 CDRTM2, 0 /SPLIT WORD TEMPORARY CDRCIF, CIF CDF 0 /TO FORM EXIT WORD CDRIN2, CDRJMP-CDRLOC /CORRECTED AT INITIALIZATION TIME CDRIN4, CDRGCH-CDRLOC 0 /** FREE LOCATIONS - COME AND GET 'EM ! 0 IFNZRO .-277 <RESORC,_ERROR_> /BUT THERE'S A CATCH CDRTBL, 0021;2223;2425;2627;3031;3203;4007;3502 2017;6364;6566;6770;7172;7514;0577;3637 1552;5354;5556;5760;6162;0104;1211;3374 0641;4243;4445;4647;5051;7316;3410;1376 /DO NOT INSERT ANYTHING BETWEEN "CDRTBL" AND "CDRBUF"!! CDRBUF=. /CARD BUFFER CDRSET, RDF /INITIALIZATION CODE TAD CDRCCF DCA CDRSE1 /SAVE CALLING FIELDS CDF /WE ARE IN FIELD 0 JMS . /FIND OUT OUR LOCATION CDRLOC, TAD CDRSE2 /ADDRESS TO MODIFY TAD CDRLOC-1 /CORRECT IT DCA CDRSE3 /SAVE IT TAD I CDRSE3 /GET DATA TO MODIFY TAD CDRLOC-1 /CORRECT IT DCA I CDRSE3 /AND RESTORE IT ISZ CDRLOC /NEXT ADDRESS ISZ CDRSE4 /MORE? JMP CDRLOC /YES - LOOP TAD CDRSET DCA CDR+3 /SET THE "RDF" CDRSE1, HLT /RESTORE CALLING FIELDS JMP CDR+3 /AND BACK TO NORMAL CDRSE3, 0 /MODIFY POINTER CDRSE4, -5 /FIVE LOCATIONS TO MODIFY CDRSE2, CDRIN2-CDRLOC /LOCATIONS TO MODIFY CDRIN4-CDRLOC CDRIN5-CDRLOC CDRABF-CDRLOC CDRTAD-CDRLOC *CDRBUF+50 /END OF THE BUFFER CDRGCH, 0 /GET A CHARACTER ROUTINE - ENTER WITH DF=0 CDRJMP, 0 /THIS IS "JMP I CDRGCH" AFTER A ^Z ISZ CDRCNT /MORE CHARACTERS IN THE INTERNAL BUFFER? JMP CDRGET /YES - GET ONE CDRGE4, ISZ CDRCT2 /GIVE A 215, 212 FOR EVERY CARD JMP CDRCLF /215, 212 ROUTINE CLL CLA CMA RTL DCA CDRCT2 /RESET COUNT TO -3 CDRGNC, TAD CDRABF DCA CDRPT /SET POINTER TO INTERNAL BUFFER CDRGE0, KSF /KEYBORAD FLAG UP? JMP CDRGE7 /NO - TRY TO READ A CARD TAD CDR760 /FORCE THE PARITY BIT ON KRS /READ STATIC FROM KEYBOARD TAD CDR175 /IS IT ^C? SNA JMP I CDR760 /YES - TO MONITOR VIA 07600 TAD CDRM27 /IS IT ^Z? SZA CLA JMP CDRGE7 /NO - GET A CARD KCC /KILL FLAG CDRGEZ, CLA CMA DCA CDRCNT /RESET COUNTS TO SKIP CLA CMA DCA CDRCT2 TAD CDRMOD DCA CDRJMP /SET TO GIVE 0'S DCA I CDRIN5 /AND A SOFT ERROR TAD CDR232 /^Z JMP I CDRGCH /EXIT CDRGE7, RCSE /SELECT A CARD JMP CDRGE0 /NO GO - TRY AGAIN DCA CDRSW /SET PACKING SWITCH CDRGCL, DCA CDRTIM /INITIALIZE TIMEOUT COUNTER CDRGE1, RCSP /CARD DONE? JMP CDRGE2 /NO - TRY FOR DATA READY RCRD /CLEAR CARD DONE FLAG CDRGE3, TAD I CDRPT /GET LAST TWO CHARACTERS SZA /BOTH SPACES? JMP CDRGE5 /NO CLA CMA TAD CDRPT DCA CDRPT /BACK UP POINTER ONE ISZ CDRCNT ISZ CDRCNT /AND TAKE COUNT DOWN BY 2 JMP CDRGE3 /TEST AGAIN OR... JMP CDRGE4 /IF COUNT IS ZERO THE A BLANK CARD CDRGE5, AND CDR077 /IS RIGHT HAND CHARACTER A SPACE? SNA CLA ISZ CDRCNT /YES A SPACE - REDUCE COUNT TAD I CDRPT /GET LAST NON-SPACE TAD CDR077 /THIS FORMS 7777 IFF WORD CONTAINS "_" AND CDRCNT /THIS MAINTAINS 7777 IFF CDRCNT IS -1 CMA SNA CLA /ARE BOTH CONDITIONS TRUE? JMP CDRGEZ /YES - MUST BE END OF FILE CDRGE6, TAD CDR077 DCA CDRSW /SET OFFSET FROM "CDRTBL" CDRGET, ISZ CDRSW /BUMP OFFSET TAD CDRSW /OFFSET INTO AC JMS CDRGE8 /GET A CHARACTER TAD CDR240 /MAKE IT ASCII CDRMOD, JMP I CDRGCH CDRGE8, 0 /GET FROM BUFFER ROUTINE CLL RAR /DIVIDE BY 2 - AND INTO LINK IS INDICATOR TAD CDRTAD /ADDRESS OF "CDRTBL" DCA CDRTM3 /SET POINTER TAD I CDRTM3 /GET WORD SZL /SHIFT? JMP .+4 /NO RTR /YES RTR RTR AND CDR077 /GET 6 BITS JMP I CDRGE8 CDRGE2, RCSF /DATA READY? JMP CDRGEX /NO - TRY FOR TIME OUT RCRA /READ ALPHA JMS CDRGE8 /GET TABLE ENTRY ISZ CDRSW /WHICH SIDE? JMP CDRGE9 /LEFT SIDE TAD I CDRPT DCA I CDRPT /FORM RIGHT SIDE JMP CDRGCL /CONTINUE CDRGE9, CLL RTL /SHIFT LEFT RTL RTL ISZ CDRPT /BUMP POINTER DCA I CDRPT /STORE LEFT SIDE CLA CLL CMA RAL /-2 V3 FROM SIS BULLETING JAN 73 TAD CDRCNT DCA CDRCNT /COUNT THE CHARACTERS CLA CMA JMP CDRGCL-1 /CONTINUE - SET SWITCH CDRCLF, CLA CMA DCA CDRCNT /SET MAIN COUNT TO SKIP TAD CDRCT2 CLL CMA RTL /ALL THIS DOES IS... TAD CDRCT2 /MAKE A 2 OR -1 TAD CDR213 /SO THIS MAKES A 215 OR 212 JMP I CDRGCH CDRGEX, /TEST TIME OUT - FIRST DELAY USING CONSTANTS CDR760, 7600 /MONITOR ADDRESS CDR077, 77 /SIX BIT MASK CDRM77, -7700 /-"_ " CDR175, 175 CDR240, 240 /ASCII SPACE CDR213, 213 /215, 212 CORRECTION FACTOR CDR232, 232 /ASCII ^Z ISZ CDRTIM /THIS LOOP TAKES AT LEAST 100MS ON AN 8/E JMP CDRGE1 DCA CDRCNT /CLEAR COUNT IN CASE PARTIAL CARD READ (E.G. JAM) JMP CDRGNC /TIMED OUT - RESTART CARD CDRTM3, CDRTIM, 0 /TIMEOUT COUNTER CDRM27, -27 /-27-3=-32 ^Z TEST CDRCNT, -1 /MAIN COUNT CDRCT2, -1 /215, 212 COUNT CDRPT, 0 /BUFFER POINTER CDRSW, 0 /SWITCH CDRABF, CDRBUF-1-CDRLOC /MODIFIED LOCATIONS CDRTAD, CDRTBL-CDRLOC CDRIN5, CDRXIT-1-CDRLOC $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 | /4 OS/8 CASSETTE HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / DEC-S8-UCASA-A-LA / COPYRIGHT 1972 / DIGITAL EQUIPMENT CORPORATION / MAYNARD MASSACHUSETTS 01754 / MOUTH/DORP IFNDEF CODE <CODE=0> KCLR=CODE^10+6700 /CLEAR ALL KSDR=CODE^10+6701 /SKIP ON DATA FLAG KSEN=CODE^10+6702 /SKIP ON ERROR KSBF=CODE^10+6703 /SKIP ON READY FLAG KLSA=CODE^10+6704 /LOAD STATUS A KSAF=CODE^10+6705 /SKIP ON ANY FLAG OR ERROR KGOA=CODE^10+6706 /ASSERT CONTENTS OF STATUS A AND XFER KRSB=CODE^10+6707 /READ STATUS B BSW=7002 /BYTE SWAP [8/E,F ONLY] /REWIND=10 /BACKFIL=30 /WRGAP=40 /BACKBLOCK=50 /SKPFIL=70 /SPECIAL CODES / 0 WRITE EOF / 1 REWIND / 2 BACKBLOCK / 3 SKIPFILE/BACKFILE / 4-7 UNUSED (TAKES LOW ORDER 2 BITS ONLY CURRENTLY) VERSION="C&77 *0 -2 /THERE ARE TWO HANDLERS 2401 7001+CODE 0323 0160+CODE+CODE /CSA0 270 /DEVICE CONTROL BLOCK (TYPE 27) 4000+7 /ENTRY POINT FOR CSA0 ZBLOCK 2 2401 7001+CODE 0323 0161+CODE+CODE /CSA1 270 4000+1 /ENTRY POINT FOR CSA1 ZBLOCK 2 *200 K3700, 3700 /MUST BE FIRST LOCATION ON PAGE UNIT, CSA1, VERSION /ENTRY POINT FOR CSA1 CLA /PROTECT CODE AGAINST IGNORANT USERS TAD CSA1 /PICK UP ARGUMENTS DCA CSA0 /VIA CSA0 STL IAC RAL /TAD (3 [8/I,L,E,F] JMP .+3 /JOIN PROCESSING WITH UNIT 1 CSA0, VERSION /ENTRY POINT FOR CSA0 STL CLA RTL /TAD (2 BSW / [8/E,F] DCA UNIT /SAVE UNIT (0 IS 200, 1 IS 300) CS, JMS T /INITIALIZATION; REPLACED BY RDF TAD KCIF /FORM RETURN FIELD INSTRUCTION DCA RETCIF /STORE IN RETURN CODE TAD I CSA0 /GET FUNCTION CONTROL WORD DCA FUN /SAVE IT TAD FUN /GET IT BACK AGAIN AND K70 /ISOLATE FIELD OF BUFFER TAD KCDF /FORM CDF TO FIELD OF BUFFER DCA BUFCDF /STORE IN APPROPRIATE SPOT ISZ CSA0 /POINT TO ARGUMENT 2 TAD I CSA0 /GET BUFFER ADDRESS DCA BUFFER /SAVE IT ISZ CSA0 /POINT TO ARGUMENT 3 TAD I CSA0 /GET BLOCK NUMBER ISZ CSA0 /POINT TO ERROR RETURN KCIF, CIF CDF 0 /SEEK TEMPORARY SAFETY IN CURRENT DATA FIELD SZA CLA JMP NOT1ST /NOT BLOCK 0 STL CLA RAR /TAD (4000 AND FUN /ISOLATE READ/WRITE BIT TAD UNIT /INSERT UNIT JMS I QCAS /CALL CASSETTE ROUTINE REWIND-. /TO PERFORM A REWIND/INITIALIZATION NOT1ST, TAD FUN K200, AND K3700 /ISOLATE NUMBER OF BLOCKS TO XFER SNA JMP SPCASE /0 BLOCKS MEANS SPECIAL THING (EOF) RECLP, DCA BLKNT /SET COUNT OF NUMBER OF BLOCKS STL CLA RAR /TAD (4000 AND FUN /ISOLATE READ/WRITE BIT TAD UNIT /INSERT UNIT JMS I QCAS /CALL CASSETTE ROUTINE RW-. /TO INITIATE READ OR WRITE RETRY, SZA /NON-ZERO AC MEANS ERROR JMP RETCIF /TOUGH LUCK BOOBIE - ERROR TAD K7700 /GET READY TO XFER 100 DOUBLE WORDS DCA DBWDCT /SET DOUBLE WORD COUNTER TAD BUFFER /GET START OF BUFFER SEGMENT DCA BPTR /SET 'BPTR' BUFCDF, HLT /CHANGE TO DATA FIELD OF USER'S BUFFER TAD FUN K7700, SMA CLA /WHICH DIRECTION IS TRANSFER? JMP READ /WANT TO READ WRITE, TAD I BPTR /WANT TO WRITE, SO GET WORD FROM BUFFER JMS I QGPCH /WRITE TAD I BPTR /GET FIRST WORD AGAIN AND P7400 /ISOLATE FIRST HALF OF BYTE 3 DCA T /SAVE FOR FUTURE REFERENCE ISZ BPTR /POINT TO NEXT LOCATION IN BUFFER TAD I BPTR /GET SECOND WORD OF BUFFER PAIR JMS I QGPCH /WRITE BYTE #2 TAD I BPTR /RETRIEVE WORD 2 AND P7400 /ISOLATE 2ND HALF OF BYTE #3 CLL RTR /CREATE MYSTIC HIDDEN BYTE 3 RTR TAD T /GOOD THING I STILL HAVE THIS CLL RTR RTR JMS I QGPCH /WRITE BYTE #3 JMP COM READ, JMS I QGPCH /READ BYTE #1 OF TRIPLE DCA I BPTR /STORE IN WORD 1 OF BUFFER PAIR JMS I QGPCH /READ BYTE #2 OF TRIPLE DCA T /SAVE IT FOR POSTERITY JMS I QGPCH /READ BYTE #3 OF TRIPLE RTL RTL /MYSTIC ROTATES DCA T2 TAD T2 AND P7400 /AND MYSTIC CONSTANTS TAD I BPTR /FIX UP BUFFER WORD 1 OF PAIR DCA I BPTR TAD T2 RTL RTL /MORE ROTATION AND P7400 /AND MORE TAD T ISZ BPTR /POINT TO SECOND WORD OF BUFFER PAIR DCA I BPTR /STORE SECOND WORD COM, ISZ BPTR /POINT TO BEGIN OF NEXT BUFFER PAIR P7400, 7400 /PROTECTION AGAINST CORE WRAP AROUND ISZ DBWDCT /BUMP DOUBLE WORD COUNT JMP BUFCDF /REITERATE JMS I QCAS /CALL CASSETTE ROUTINE CRC-. /TO CHECK CRC TAD BUFFER /GET BUFFER SEGMENT ADDRESS TAD K200 /ADD 200 TO GET TO NEXT SEGMENT DCA BUFFER /REPLACE TAD BLKNT /GET BLOCK COUNT TAD K7700 /SUBTRAT 100 SZA /ARE WE DONE? JMP RECLP /NO, REITERATE ISZ CSA0 /POINT TO NORMAL GOOD RETURN RETCIF, HLT /RETURN TO USER'S DATA AND INSTRUCTION FIELDS JMP I CSA0 /RETURN / INTIALIZATION ROUTINE - ONCE ONLY CODE / OVERLAID BY TEMPORARIES T, 0 /ENTRY POINT TO INITIALIZATION T2, TAD KRDF /REPLACE CALL BY RDF FUN, DCA CS /SO THAT WE'LL NEVER SEE YOU HERE AGAIN BUFFER, TAD T /CORRECT ADDRESS OF GPCH DBWDCT, TAD KQX1 /BY ADDING IN CS+1 QGPCH, DCA . /STORE IT HERE BLKNT, STL CLA RTL /CORRECT ADDRESS OF CAS IS 2 MORE TAD QGPCH QCAS, DCA . /THAN GPCH. STORE IT HERE. BPTR, JMP CS /RETURN TO MAIN PROGRAM KRDF, RDF KQX1, GPCH-CS-1 SPCASE, TAD FUN AND L4003 /ISOLATE R/W BIT + SPECIAL CODE TAD UNIT JMS I QCAS SPCODE-. JMP RETCIF-1 /LEAVE GRACEFULLY K70, 70 KCDF, CDF 0 L4003, 4003 PAGE GPCH, 0 /READ OR WRITE A BYTE JMP AROUND /GO TO REAL LOCATION OF THIS SUBROUTINE CAS, 0 /MUST BE AT GPCH+2; DO CASSETTE STUFF DCA TEMP /SAVE ARGUMENT IN AC CDF 0 TAD I CAS /GET UNRELOCATED RELATIVE LOCAL ENTRY POINT TAD CAS /RELOCATE IT ISZ CAS /POINT TO NORMAL RETURN LOCATION DCA GPCH /SAVE ENTRY POINT IN TEMPORARY JMP I GPCH /GO TO CORRECT ENTRY POINT RW, TAD CAS DCA RTRY /SAVE RETRY ADDRESS TAD TEMP /GET ARGUMENT PASSED VIA AC DCA FNUNIT /SAVE CLL STA RTL /TAD (7775 DCA ERKNT /SET ERROR COUNT TO -3 ERETRY, TAD FNUNIT SPA TAD (20 /READ CODE IS 0; WRITE IS 20 KLSA /LOAD STATUS A TAD FNUNIT /***KLSA CLEARS BIT 0 SMA CLA /READS HAVE TO BE INITIATED JMS CWAIT /READ JMP I RTRY /RETURN AROUND, DCA TEMP TAD FNUNIT SMA CLA JMP RDCHAR /READ TAD TEMP /WRITE JMS CWAIT JMP I GPCH /RETURN RDCHAR, JMS CWAIT TAD TEMP /GET CHAR JUST READ JMP I GPCH /RETURN WITH IT IN AC CRC, TAD FNUNIT TAD (60 KLSA /INITIATE READ/WRITE CRC TAD FNUNIT /***KLSA CLEARS BIT 0 SMA CLA JMS CWAIT /HAVE TO READ TWICE JMS CWAIT /WRITE CRC WRITES BOTH KCLR /WHY NOT? JMP I CAS /RETURN REWIND, TAD (10 JMS UTIL TAD TEMP SMA CLA JMP I CAS /MERELY REWIND IF READING JMP EOF SKIPF, TAD (20 BACKBL, TAD (10 EOF, TAD (10 BACKF, TAD (30 JMS UTIL JMP I CAS /RETURN UTIL, 0 TAD TEMP KLSA TRYAGN, KGOA JMS CTCTST KSBF /WAIT FOR READY JMP .-2 KRSB AND (10 SZA CLA JMP TRYAGN /KEEP TRYING IF ERROR CAUSED BY DRIVE EMPTY JMP I UTIL TEMP, 0 ERKNT, 0 FNUNIT, 0 RTRY, 0 SPCODE, TAD TEMP AND (3 TAD (JMP TABLE DCA J TAD TEMP AND (4300 DCA TEMP J, HLT TABLE, JMP EOF /0 WRITE EOF JMP REWIND /1 REWIND AND WRITE EOF IF BIT 0=1 JMP BACKBL /2 BACK BLOCK TAD TEMP /3 SKIP/BACK FILE DEPENDING ON BIT 0 SMA CLA JMP SKIPF /FORWARD FILE JMP BACKF /BACK FILE CWAIT, 0 KGOA /ASSERT CONTENTS OF STATUS A DCA TEMP /SAVE ANYTHING READ JMS CTCTST KSAF JMP .-2 /WAIT FOR SOMETHING TO HAPPEN KSEN /WAS IT AN ERROR? JMP I CWAIT /NO, SO RETURN ERR, DCA TEMP /YES ... ERROR KRSB AND (30 SNA JMP .+3 AND (20 JMP I RTRY /END OF FILE IS SOFT ERROR ISZ ERKNT /SHALL WE TRY AGAIN? JMP .+3 /YES STL CLA RAR /TAD (4000 JMP I RTRY /RETURN WITH NON-ZERO AC TAD FNUNIT /RETRY TAD (50 /BUT FIRST DO BACKSPACE BLOCK GAP JMS UTIL JMP ERETRY CTCTST, 0 /TEST FOR CONTROL/C L7600, 7600 TAD L7600 KRS TAD (-7603 SNA CLA KSF JMP I CTCTST CIF CDF 0 JMP I L7600 /RETURN TO OS/8 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | /1 DF32 NON SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / SR RF08=0 /CHANGE TO 1 FOR RF08 HANDLER /THE NUMBER OF PLATTERS MUST EITHER BE SET AT ASSEMBLY TIME, /OR MUST BE CHANGED VIA THE ALTER COMMAND IN BUILD *0 -1 IFNZRO RF08 < DEVICE RF;DEVICE RF;4064;RF&177;ZBLOCK 2 > IFZERO RF08 < DEVICE DF;DEVICE DF;4124;DF&177;ZBLOCK 2 > SCA=7751 SWC=7750 RFVERSION="A&77 *200 SYSER, CLA CLL CML RAR /4000 ISZ SYSCNT /TRY AGAIN? SKP CLA JMP SFIELD /WHY BOTHER CLA CLL CMA RTL TAD RF DCA RF /RESET PARAMETERS AND TRY AGAIN JMP RETRY SCIF, CIF 0 SYSCNT, 0 S6603, 6603 S70, 70 S7400, 7400 IFZERO RF08 <S3700, 3700> IFNZRO RF08 <S377, 0377> T1, 0 T2, 0 ZBLOCK 224-. IFNZRO .-224 <ADRERR,QQQQ> /ENTRY PT MUST BE RELATIVE 24 DF, RF, RFVERSION CLA CLL CMA RTL /-3 DCA SYSCNT /# TRYS ON ERROR RETRY, TAD I RF /HANDLER RUNS IN USER'S DATA FIELD RAL CLA RTL TAD S6603 DCA SFUN /EITHER A READ OR WRITE TAD I RF AND S70 DCA SFIELD /GET FIELD OF BUFFER TAD I RF RAL AND S7600 CIA DCA T1 /SET UP WORD COUNT CLA CMA ISZ RF TAD I RF DCA T2 /BUFFER ADDRESS-1 ISZ RF RDF TAD (CDF 0 DCA RESRDF CDF 0 TAD T1 DCA I (SWC TAD T2 DCA I (SCA RESRDF, HLT /RESTORE USER'S DATA FIELD IFZERO RF08 < TAD I RF RTL AND S3700 > TAD SFIELD 6615 /LOAD DISK EXTENDED MEMORY S7600, 7600 IFNZRO RF08 < TAD I RF RTR RTR AND S377 6643 /LOAD HIGH ORDER > TAD I RF RTR RTR RAR AND S7400 SFUN, HLT /BECOMES DISK IOT.(READ OR WRITE) RDF TAD SCIF DCA SFIELD IFZERO RF08 <6622> IFNZRO RF08 <6623> JMP .-1 KRS AND (177 TAD (-3 SNA CLA KSF JMP .+3 CIF CDF 0 /RETURN TO OS/8 IF USER TYPED ^C JMP I S7600 ISZ RF 6621 /SKIP ON ERROR IFNZRO RF08 <SKP /SENSE OF SKIP IS REVERSED> JMP SYSER ISZ RF SFIELD, HLT /RETURN TO PROPER FIELD 6601 /CLEAR TROUBLESOME FLAG JMP I RF $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | /2 DF32 SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /MAINTENANCE RELEASE CHANGES: /1. TOOK OUT SOFSET DF32=1 RF08=0 VERSION="B&77 *0 -1 DEVICE DF32;DEVICE SYS;4124;2007;0;177 STARTB-ENDB-1 NOPUNC *6604 ENPUNC STARTB, NOP /FOR "SWAP" B6653, 6653 B7647, 7647 B7577, 7577 B200, 200 B7605, 7605 B7751, 7751 ZBLOCK 6622-. TAD I B6653 CDF 10 DCA I B7647 CDF 0 ISZ B6653 ISZ B7647 JMP .-6 /MOVE FIELD 1 RESIDENT UP IFNZRO RF08 <6643> 6615 7600 TAD B7577 DCA I B7751 TAD B200 6603 /NOW READ IN FIELD 0 RESIDENT FROM RECORD 1/2 IFNZRO RF08 <6623> IFNZRO DF32 <6622> JMP .-1 6621 IFNZRO RF08 <SKP> HLT /ERROR READING SYSTEM IN ENDB, JMP I B7605 /BOOTSTRAP FOR DISK MONITOR IS AS FOLLOWS: / LOCATION CONTENTS / 7750 7600 / 7751 6603 / 7752 6622 / 7753 5352 / 7754 5752 *200 NOPUNCH *7600 ENPUNCH ZBLOCK 7 SHNDLR, VERSION CLA CLL CMA RTL /-3 DCA SYSCNT /# TRYS ON ERROR TAD I SHNDLR RAL CLA RTL TAD S6603 DCA SFUN /EITHER A READ OR WRITE TAD I SHNDLR AND S70 DCA SFIELD /GET FIELD OF BUFFER TAD I SHNDLR RAL AND S7600 CIA DCA SWC /SET UP WORD COUNT CLA CMA ISZ SHNDLR TAD I SHNDLR DCA SCA /BUFFER ADDRESS-1 ISZ SHNDLR IFNZRO DF32 < TAD I SHNDLR RTL AND S3700> TAD SFIELD 6615 /LOAD DISK EXTENDED MEMORY S7600, 7600 IFNZRO RF08 < TAD I SHNDLR RTR RTR AND S377 6643 /LOAD HIGH ORDER> TAD I SHNDLR RTR RTR RAR AND S7400 SFUN, HLT /BECOMES DISK IOT.(READ OR WRITE) RDF TAD SCIF DCA SFIELD IFNZRO DF32 <6622> IFNZRO RF08 <6623> JMP .-1 ISZ SHNDLR 6621 /SKIP ON ERROR IFNZRO RF08 <SKP /SENSE OF SKIP IS REVERSED> JMP SYSER ISZ SHNDLR SFIELD, HLT /RETURN TO PROPER FIELD 6601 /CLEAR TROUBLESOME FLAG JMP I SHNDLR ZBLOCK 2 SYSER, CLA CLL CML RAR /4000 ISZ SYSCNT /TRY AGAIN? SKP CLA JMP SFIELD /WHY BOTHER CLA CLL CMA RTL TAD SHNDLR DCA SHNDLR /RESET PARAMETERS AND TRY AGAIN IFNZRO RF08 <IFNZRO .-7700 <NZERR>; SKP; HLT> JMP SHNDLR+3 SCIF, CIF 0 SYSCNT, 0 IFNZRO DF32 <IFNZRO .-7700 <NZERR>; SKP; HLT> S6603, 6603 S70, 70 S7400, 7400 IFNZRO DF32 <S3700, 3700> IFNZRO RF08 <S377, 377> SCA=7751 SWC=7750 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 | /8 DUMP LPT HANDLER FOR OS/8 / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / DEC-S8-UCASA-A-LA / COPYRIGHT 1972 / DIGITAL EQUIPMENT CORPORATION / MAYNARD MASSACHUSETTS 01754 / MOUTH/DORP IFNDEF CODE <CODE=0> KCLR=CODE^10+6700 /CLEAR ALL KSDR=CODE^10+6701 /SKIP ON DATA FLAG KSEN=CODE^10+6702 /SKIP ON ERROR KSBF=CODE^10+6703 /SKIP ON READY FLAG KLSA=CODE^10+6704 /LOAD STATUS A KSAF=CODE^10+6705 /SKIP ON ANY FLAG OR ERROR KGOA=CODE^10+6706 /ASSERT CONTENTS OF STATUS A AND XFER KRSB=CODE^10+6707 /READ STATUS B BSW=7002 /BYTE SWAP [8/E,F ONLY] /REWIND=10 /BACKFIL=30 /WRGAP=40 /BACKBLOCK=50 /SKPFIL=70 /SPECIAL CODES / 0 WRITE EOF / 1 REWIND / 2 BACKBLOCK / 3 SKIPFILE/BACKFILE / 4-7 UNUSED (TAKES LOW ORDER 2 BITS ONLY CURRENTLY) / EDIT HISTORY: / 1976 S.R. ORIGINALLY WRITTEN / 19-MAR-77 S.R. FIXED BUG WITH BUFFER ENDING AT 7777 *0 -1 DEVICE DUMP;DEVICE DUMP;1360;DUMP&177+4000;ZBLOCK 2 DMPVER="C&77 *200 LINK, 0 /POINTS TO 'LINC' ON NEXT PAGE TAD I DUMP /GET FUNCTION CONTROL WORD DCA FNWD ISZ DUMP /POINT TO BUFFER STARTING ADDRESS TAD I DUMP /GET BUFFER STARTING ADDRESS DCA BUFFER ISZ DUMP /POINT TO STARTING BLOCK # TAD I DUMP /GET STARTING BLOCK NUMBER DCA BLOCK /SAVE IT IN 'BLOCK' ISZ DUMP /POINT TO USER'S ERROR RETURN RDF TAD KCIDF /FOR 'CIF CDF' TO USER'S FIELD DCA DMPRET /NEED IT TO RETURN TO HIM LATER TAD FNWD /LOOK AT FUNCTION WORD SMA /BIT 0 IS READ/WRITE BIT JMP ERRET /TAKE FATAL ERROR IF GUY TRIED TO /READ FROM 'DUMP' AND L3700 CLL RTR SNA JMP CLOSE /0 PAGES MEANS PERFORM CLOSE /OPERATION, GO AWAY CIA /STORE AWAY NEGATIVE OF /NUMBER OF LINES TO DUMP DCA KNT TAD FNWD /LOOK SOME MORE AT ALL-IMPORTANT /FUNCTION WORD L374, AND L70 /ISOLATE FIELD OF BUFFER TAD KCDF /FORM 'CDF' TO FLD OF BUFFER DCA .+1 /STORE IT IN NEXT LOCATION FNWD, BPTR, HLT /CHANGE DATA FIELD TO FLD OF BUFFER B, TAD M40 DCA RKNT JMS I LINK TAD LOW-200 CIA CLL TAD BLOCK SZL CLA TAD KLLS JMS I LINK DCA LPUT+1-200 TAD BLOCK JMS I LINK JMP BLK-200 JMS I LINK JMP CRLF-200 A, JMS INIT TAD RKNT TAD L40 /MUST BE REAL 40 JMS I LINK JMS PRINT-200 TAD KSLASH JMS I LINK JMP SPACE-200 C, TAD I BPTR /GET WORD FROM BUFFER JMS I LINK JMS PRINT-200 /PRINT IT IN OCTAL ON LIST DEVICE ISZ BPTR /POINT TO NEXT WORD IN BUFFER NOP /V3D ISZ CKNT /DONE WITH THIS ROW? JMP C /NO, GO PRINT NEXT WORD JMS I LINK JMP SPACE-200 JMS INIT D, TAD I BPTR RTR RTR RTR JMS I LINK JMP PUT6-200 TAD I BPTR JMS I LINK JMP PUT6-200 ISZ BPTR /POINT TO NEXT WORD IN BUFFER NOP /V3D ISZ CKNT /DONE WITH THIS ROW? JMP D /NO, GO ON TO NEXT WORD JMS I LINK JMP SPACE-200 JMS INIT E, TAD I BUFFER /GET WORD 1 OF PAIR JMS I LINK JMP PUTSAV-200 /PUT OUT THE CHAR AND SAVE THE WORD ISZ BUFFER /POINT TO WORD 2 OF PAIR TAD I BUFFER /GET WORD 2 OF PAIR JMS I LINK JMP PUTSAV-200 ISZ BUFFER /POINT TO BEGIN OF NEXT PAIR JMS I LINK JMP THIRD-200 /PRINT THIRD CHAR FROM /REMEMBRANCES OF LAST TWO ISZ CKNT ISZ CKNT /DONE WITH THIS ROW? JMP E /NO, GO ON TO NEXT PAIR JMS I LINK /YES JMP CRLF-200 /PRINT CARRIAGE RETURN/LINE FEED ISZ KNT /DONE WITH BUFFER YET? SKP /NO JMP OKRET /YES ISZ RKNT /DONE WITH LAST ROW OF PAGE? JMP A /NO, GO ON TO NEXT ROW IN SAME PAGE ISZ BLOCK /BUMP BLOCK NUMBER BY 1 JMP B /GO DUMP THE NEXT PAGE CLOSE, STA /-1 CHANGES CR TO FORM FEED JMS I LINK JMP CRLF-200 OKRET, ISZ DUMP /POINT TO NORMAL RETURN M40, SMA SZA CLA /AC 0 SO ALWAYS SKIPS ERRET, STL CLA RAR /FATAL ERROR HAS AC NEGATIVE DMPRET, HLT /PERFORM 'CIF CDF' TO USER'S FIELD JMP I DUMP /RETURN INIT, 0 TAD M10 DCA CKNT TAD BUFFER DCA BPTR JMP I INIT KSLASH, 57-40 KCIDF, CIF CDF 0 KCDF, CDF 0 M10, -10 L40, 40 /MUST BE REAL 40 L3700, 3700 BUFFER, 0 RKNT, 0 /ROW COUNT CKNT, 0 /COLUMN COUNT BLOCK, 0 /CURRENT BLOCK NUMBER KLLS, LLS IFZERO .-375&4000 <ERROR> *374 L70, 70 /MUST BE AT REL LOC 174 KNT, 0 /- NUMBER OF PAGES LEFT TO DUMP IFNZRO L70-374 <ERROR> DUMP, DMPVER JMS LINK /GET ADDRESS OF NEXT PAGE INTO LINK IFNZRO .-400 <ERROR> PAGE LSF=6661 /SLIP ON LPT FLAG LLS=6666 /LOAD LPT BUFFER IFDEF DMPTTY < LSF=TSF LLS=TLS > LINC, 0 DCA ARG RDF TAD HCDF TTY12, DCA TEMP HCDF, CDF 0 TAD I LINC DCA DOIT ISZ LINC L77, 77 TEMP, 0 TAD ARG CNT, DOIT, HLT POP, JMP I LINC /RETURN L177, 177 IFNZRO POP&177-15 <ERROR> /MUST BE AT 15 IN PG IFNZRO DOIT&177-14 <ERROR> IFNZRO TEMP&177-12 <ERROR> THIRD, TAD SAVE DCA ARG TAD ARG PUTSAV, AND L7600 CLL RAL TAD SAVE RTL RTL AND L177 DCA SAVE TAD ARG AND L177 /FORCE 7-BIT TAD M140 /DO RANGE CHECK CLL TAD (100 /FOR BETWEEN 40 AND 137 SNL /SKIP ON SUCCESS TTY40, M140, SZA CLA /NEVER SKIPS PUTSPC, TAD TTY40 /RESTORE CHAR OR BLANK PUTPOP, JMS LPUT TTY215, JMP POP LPUT, 0 NOP /THIS MAY BE AN 'LLS' OR 0 L7600, 7600 /CLA KBD, KSF JMP CHECKL TAD L7600 KRS TAD (-7603 SNA CLA JMP CTRLC KRB TLS AND L177 TAD (-15 SNA JMP CR TAD (15-70 CLL TAD (10 DCA TEMP SNL JMP NOT /NOT A DIGIT TAD NUM CLL RAL CLL RAL CLL RAL TAD TEMP DCA NUM JMP CHECKL CTRLC, CIF CDF 0 JMP I L7600 CR, TAD NUM DCA LOW TAD (12-77 NOT, TAD L77 TSF JMP .-1 XTRA, TLS CLA DCA NUM CHECKL, LSF JMP KBD JMP I LPUT /YES, RETURN NUM, 0 LOW, 0 PUT6, TAD TTY40 AND L77 JMP PUTSPC PRINT, 0 DCA ARG TAD TTY40 JMS LPUT TAD (-4 DCA CNT PRLUP, TAD ARG AND L7600 CLL RTL TAD L214 /14 SHIFTS TO 60 /AND L214 HAS AC0 = 0 RTL JMS LPUT TAD ARG RTL RAL DCA ARG ISZ CNT /BUG IF TRY TO USE AS L214 JMP PRLUP JMP I PRINT L214, 214 /COULD BE 'AND CNT' SAVE, 0 /MUST BE DEDICATED. USED AS SHIFT /REG AND MUST BE ALMOST 0 ON ENTRY ARG, 0 SPACE, TAD TTY40 JMS LPUT JMP PUTSPC BLK, SNA CLA DCA LOW /BLOCK 0 INITIALIZATION TAD L214 /FORM FEED JMS LPUT TAD ARG JMS PRINT / TAD (-10 / DCA TEMP / TAD TTY3 / JMS SPACE /LUP, TAD TEMP / TAD (10 /MUST BE REAL 10 / JMS PRINT / ISZ TEMP / JMP LUP CRLF, TAD TTY215 JMS LPUT TAD TTY12 JMP PUTPOP PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 | /17 SUPER TTY HANDLER FOR OS/8 / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /S.W.,S.R.,H.J.,R.L.,S.R. *0 -1 DEVICE KL8E;DEVICE TTY;0;TTY&177+4000;ZBLOCK 2 /TWO-PAGE TELETYPE HANDLER FOR OS/8 V3. /ON INPUT, RECOGNIZES ^Z, ^C, ^U, RUBOUT /^Z MEANS END OF INPUT, INSERT ^Z IN BUFFER, / PAD WITH ZEROES, AND ECHO "^Z" /^C MEANS ABORT JOB, RETURN TO OS/8 VIA LOC 7600 TO SAVE CORE AND PRINT "^C" /^U MEANS DELETE THE LAST LINE, ALLOW OPERATOR TO RETYPE / (LINE STARTS AT BEGIN OF BUFFER AND IS TERMINATED BY A CR) / A CR GETS ENTERED INTO BUFFER, CAUSES A LF TO ALSO ECHO / AND GET ENTERED INTO BUFFER, BUFFER IS THEN PADDED WITH NULLS. / CONVERTS LC TO UC /ON OUTPUT RECOGNIZES ^C, ^O, ^S, ^Q FROM KEYBOARD /^C CAUSES JOB TO ABORT, RETURN TO OS/8 VIA LOCATION 7600 / TO SAVE CORE AND PRINT "^C" /^O CAUSES ECHOING BY THE HANDLER TO CEASE / TYPING ANY OTHER CHARACTER RESUMES ECHOING. /^S CAUSES THE HANDLER TO STOP SENDING TO TERMINAL /^Q RESUMES HANDLER SENDING / ^S AND ^Q ARE IGNORED IN OTHER CASES /WHENEVER PRINTING CHARACTERS (EITHER ON OUTPUT OR WHEN ECHOING), / IGNORES NULLS / FLAGS LC WITH AN APOSTROPHE / HANDLES TABS CORRECTLY (SEVERAL WAYS) / PRINTS ESCAPE AS $ / DELAYS 16 MS AFTER LINEFEEDS / PRINTS CONTROL CHARACTERS AS "^K" /DOES AUTOMATIC CR/LF AT END OF LINE WIDTH. /MAINTENANCE RELEASE CHANGES: /1. ADDED KCC FOR NON-CONSOLE TELETYPES /V3D CHANGES: (VERSION E) /1. ADDED DELAY OPTION FOR VT78 /2. ADDED SCOPE RUBOUTS /3. CHANGED VT78 DEFAULTS /4. REARRANGED CODE FOR SET TTY ESC AND ARROW INDVC=03 OUTDVC=04 KSF=10^INDVC+6001 KCC=10^INDVC+6002 KRS=10^INDVC+6004 KRB=KCC KRS TSF=10^OUTDVC+6001 TCF=10^OUTDVC+6002 TPC=10^OUTDVC+6004 TLS=TCF TPC TTYVERSION="E&77 /BUILD YOUR OWN TELETYPE HANDLER: /THIS SOURCE HAS MUMBLE LOCATIONS LEFT. /THE FOLLOWING CONDITIONALS ALLOW YOU TO INCLUDE OPTIONAL FEATURES. /YOU MAY INCLUDE AS MANY OR AS FEW AS YOU DESIRE PROVIDED THERE /IS ROOM LEFT. /CONDITIONAL LOCATIONS LOCATIONS INCLUDED /VARIABLE PAGE 1 PAGE 2 FEATURES / DELAY 0 7 DELAY AFTER GIVEN CHAR / CTRL 0 3 PRINT CONTROL CHARS AS ^K / RUB 0 0 PRINT CHAR RUBBED OUT ON RUBOUTS / SIMTAB 0 10 SIMULATE TABS AS SPACES / SLOTAB 0 6 PUT OUT 2 RUBOUTS AFTER A TAB / ESC 0 10 PRINT ESCAPE AS $ / FLAGLC 0 12 FLAG LOWER CASE CHARS ON OUTPUT / CNVLC 0 7 CONVERT LOWER CASE ON INPUT TO UPPER CASE / ALTMOD 0 11 CONVERT ALTMODES (175,176) TO ESCAPE (33) / PAUS 0 20 PAUSE BETWEEN PAGES / FREE LOCS: 2 33 VT78=1 /SET TO 0 TO ALLOW OTHER PARAMETERS /SET TO 1 TO FORCE OTHER PARAMETERS TO VT78 COMPATIBLE DELAY=0 /SET NON-ZERO TO ALLOW DELAY AFTER ANY CHAR (12=CR) /TYPICALLY AFTER LF FOR HIGH SPEED VT05 /SET VALUE OF DELAY = 7-BIT CHAR TO DELAY AFTER CTRL=1 /SET TO 1 TO ECHO CONTROL CHARS AS ^K /SET TO 0 TO ACCEPT CONTROL CHARACTERS AND PUT /IN BUFFER, BUT NOT ECHO THEM (EXCEPT THE USUAL) RUB=1 /SET TO 0 TO ECHO EACH RUBOUT BY TYPING A BACK SLASH /SET TO 1 TO ECHO CHARS RUBBED OUT UPON RUB-OUT /SET TO 4000 TO PERFORM SCOPE TYPE RUBOUTS SIMTAB=1 /SET TO 1 TO SIMULATE TABS AS THE CORRECT NUMBER OF SPACES /SET TO 0 TO TYPE TABS AS TABS SLOTAB=0 /SET TO 1 TO TYPE 2 RUBOUTS AFTER A TAB /ONLY IS APPLICABLE IF SIMTAB=0 ALTMOD=0 /SET TO 1 TO CONVERT 175,176 TO 33 /(UPPER CASE TERMINALS ONLY) ESC=1 /SET TO 1 TO ECHO ESCAPE AS $ /SET TO 0 TO ECHO ESCAPE AS A CONTROL CHAR (^[) FLAGLC=1 /SET TO 1 TO FLAG LOWER CASE CHARS ON OUTPUT /THIS IS FOR PEOPLE NOT PRIVELIDGED ENOUGH TO /OWN A LOWER CASE TERMINAL /SET TO 0 TO PRINT LOWER CASE CHARS AS IS CNVLC=0 /SET TO 1 TO CONVERT LOWER CASE CHARS ON INPUT TO UPPER CASE /SET TO 0 TO ACCEPT INPUTTED LOWER CASE CHARS AS IS /THIS IS FOR PEOPLE WHO ARE HANDICAPPED BY A LOWER CASE /TERMINAL AND ONLY WANT UPPER CASE PAUS=200 /NON-0 PAUSES BETWEEN SCOPE PAGES HEIGHT=30 /NUMBER OF LINES PER SCREEN /SOME OF THE ABOVE OPTIONS SHOULD ACTUALLY BE IMPLEMENTED /IN SUCH A MANNER THAT THE USER CAN CHANGE THEM VIA AN ALTER /RATHER THAN HAVE TO REASSEMBLE. IFNZRO VT78 < DELAY=0 CTRL=1 RUB=4000 SIMTAB=0 SLOTAB=0 ALTMOD=0 ESC=1 FLAGLC=0 CNVLC=0 IFNZRO INDVC-3 <CTRL=0> > /CROSS PAGE LINKAGE: /THIS CODE MUST BE ABLE TO LOAD INTO ANY TWO PAGES OF CORE /THE ENTRY POINT IS AT THE NEXT LOCATION TO THE END OF THE FIRST PAGE /AT THE END OF THE FIRST PAGE WE JMS TO PLINK, /THIS LEAVES THE ADDRESS OF THE FIRST LOCATION OF THE NEXT PAGE /IN LOCATION 'PLINK' . THIS JUST HAPPENS TO BE THE ADDRESS /OF BOTH TTYPCH AND TTYGCH. /TTYPCH AND TTYGCH SHARE THE SAME ENTRY POINT. /IF IT IS CALLED WITH A 0 AC, IT IS A CALL TO TTYGCH, /IF IT IS CALLED WITH A NON-ZERO AC, IT IS A CALL TO TTYPCH. /RETURN 1 MEANS GOT RUBOUT /TTYGCH TAKES RETURN 2 IF IT GOT A ^Z. /OTHERWISE IT TAKES RETURN 3 WITH CHARACTER GOTTEN IN AC. /TTYPCH TAKES RETURN 1 IF IT WANTS THE HANDLER TO GO AWAY, /I.E IF IT SAW A ^Z. /AC IS NORMALLY NON-ZERO UPON RETURN /AC IS POSITIVE MEANS DO A CRLF /WHEN ECHOING WE WANT TO CALL TTYPRT /BUT OTHERWISE WE WANT TO CALL TTYPCH (WHICH DOES ADDITIONAL /STUFF LIKE CHECK ^O, ^Q, ETC. /WE TELL BY WHETHER OR NOT TTYGCH HAD BEEN PREVIOUSLY CALLED. *200 PLINK, 0 /GETS ADDRESS OF TTYPCH AND TTYGCH (START OF NEXT PAGE) STL CLA RAR /4000 TAD I TTY /RETRIEVE FUNCTION WORD, BUT PUT R/W BIT IN LINK AND L3700 /EXTRACT NUMBER OF DOUBLE-WORDS TO TRANSFER CMA /GET COUNT+1 DCA BUFSIZ /STORE AWAY RDF /FIND OUT THE USER'S DATA FIELD TAD CIFCDF /FORM OUR EXIT CIF CDF DCA TTYXIT /STORE AWAY FOR EXIT ROUTINE TAD TTY70 /GET FUNCTION WORD L776, AND I TTY /ISOLATE FIELD OF BUFFER TAD TTYCDF /FORM CDF TO FIELD OF BUFFER DCA TTCDBF /STORE WHERE IT WILL BE USEFUL /AT SAME TIME, INITIALIZE TTYEOF ISZ TTY /POINT TO BUFFER ADDRESS TAD I TTY /AND GET IT DCA BUFSTRT /AND SAVE IT ISZ TTY /POINT TO BLOCK # TTY376, ISZ TTY /POINT TO ERROR RETURN SHIFT, /OUTPUT SHIFT REGISTER TTYEOF, /0 IF SAW CR OR ^Z AND WISH TO PAD BUFFER WITH 0'S TTCDBF, HLT /CDF BUFFER FIELD JMP TTYKLG TTYLP, SNL CLA /LINK=1 MEANS OUTPUT JMP TTYGET /INPUT IS FROM TTY: /LINK MUST BE SET FIRST TIME THROUGH HERE. /IT ACTS AS A GUARD BIT IN THE SHIFT REGISTER ROTL, RTL RTL SPA /DO WE HAVE 8 BITS SHIFTED IN? JMP TELP DCA SHIFT /SAVE SHIFT REGISTER TAD I BUFSTRT SZA JMS PUNCH /PRINT A CHARACTER TAD I BUFSTRT ISZ BUFSTRT /BUMP INPUT POINTER TT7400, 7400 /PROTECT ISZ AND TT7400 CLL RAL TAD SHIFT /SHIFT HIGH ORDER 4 BITS INTO JMP ROTL /SHIFT REGISTER TELP, JMS PUNCH /PRINT 3RD CHARACTER OF DOUBLE-WORD STL /***KLUDGE TTYKLG, ISZ BUFSIZ /DONE? JMP TTYLP /NOT YET TTYX, TAD TTYEOF /IF INPUT AND WE WERE PADDING WITH 0'S SZA CLA /TAKE SOFT ERROR EXIT TTYRTN, ISZ TTY /POINT TO NORMAL RETURN /CAN'T GET ERROR OR END-OF-FILE ON OUTPUT TTYXIT, HLT /RETURN TO USER'S FIELD JMP I TTY /RETURN TO USER TTYCA, 0 TTYWC, 0 BUFSIZ, 0 BUFSTRT,0 TTY70, 70 PUNCH, 0 /NEVER CALL TTYPCH WITH ZERO AC JMS I PLINK /CALL TTYPCH JMP TTYRTN /GO AWAY, WE SAW A ^Z L7700, SMA CLA /DID WE REACH END OF TTY LINE? JMS CRLF /YES, PERFORM CR/LF JMP I PUNCH /RETURN TMP, CRLF, 0 TAD L215 JMS I PLINK /CALL TTYPCH TO PRINT CR L215, 215 /CAN'T RETURN HERE CLA /**** TAD L212 JMS I PLINK /CALL TTYPCH TO PRINT LF L212, 212 /CAN'T RETURN HERE CLA /**** JMP I CRLF /RETURN CTRLU, JMS CRLF /PERFORM A CR/LF TTYGET, TAD BUFSTRT DCA TTYCA /POINT TO START OF BUFFER TAD BUFSIZ CLL RAL /CONVERT DOUBLE-WORDS TO WORDS DCAWC, DCA TTYWC /SET SIZE OF BUFFER TSTEND, TAD TTYEOF SNA CLA JMP ZERO JMS I PLINK /CALL TTYGCH TO GET A CHARACTER JMP RUBOUT /RETURN 1 MEANS SAW RUBOUT ZERO, DCA I TTYCA /RETURN 2 MEANS GOT CHARACTER /STORE AWAY TEMPORARILY /USING USER'S BUFFER AS A TEMP LOCATION TAD I TTYCA /GET BACK CHARACTER IFNZRO .-320 <_ERROR> SZA JMS PUNCH /ECHO IT TAD I TTYCA /GET IT AGAIN TAD M32 /-^Z SNA JMP CTRLZ TAD L5 /^Z-^U SNA /IS IT ^U? JMP CTRLU /YES TAD L7 GRUDGE, DCA TMP ISZ TTYCA /NO L7, 7 ISZ TTYWC /IS BUFFER FULL? TT10, SKP JMP TTYX ISZ TMP /WAS LAST CHAR A CR? JMP TSTEND /NO DCA TTYEOF /YES, SET "PAD WITH 0'S" FLAG ISZ TTY /POINT TO NORMAL RETURN /CR IS NOT AN ERROR OR END-OF-FILE TAD L212 /IF LAST CHAR INPUT WAS CR, NOW PRETEND LF WAS INPUT JMP ZERO /REJOIN PROCESSING CTRLZ, DCA TTYEOF JMS CRLF JMP GRUDGE M32, -32 L5, 5 L3700, 3700 CIFCDF, CIF CDF 0 TTYCDF, CDF 0 /TTYEOF IS ZERO MEANS PAD BUFFER WITH ZEROES /DON'T DO YET: /RUBOUT, AND TTYWC /177 IN AC / SNA CLA / JMP CTRLU RUBOUT, KCC /TTYGCH DOESN'T CLEAR RO FROM BUFFER TAD TTYCA CIA TAD BUFSTRT SNA CLA /ARE WE AT BEGIN OF BUFFER? JMP CTRLU /YES STA TAD TTYCA DCA TTYCA IFZERO RUB < LSLASH, "\ TAD LSLASH /PRINT A BACK SLASH FOR EACH RUBBED OUT CHAR > IFNZRO RUB&4000+RUB <TAD I TTYCA> /PRINT CHAR JUST DELETED IFNZRO RUB&4000 <TAD TT10> /BACKSPACE-SPACE-BACKSPACE JMS PUNCH STA TAD TTYWC JMP DCAWC /BUMP BACK WC AND GET ANOTHER CHAR ZBLOCK 376-. TTY, TTYVERSION /ENTRY POINT TO HANDLER JMS PLINK /SET UP CROSS PAGE LINKAGE IFNZRO TTY-376 <ENTERR,QQQQ> PAGE /INTERLUDE: /USA STANDARD CODE FOR INFORMATION INTERCHANGE: / 000 001 010 011 100 101 110 111 / / 0000 NUL DLE SP 0 @ P ' 'P / / 0001 SOH DC1 ! 1 A Q 'A 'Q / / 0010 STX DC2 " 2 B R 'B 'R / / 0011 ETX DC3 # 3 C S 'C 'S / / 0100 EOT DC4 $ 4 D T 'D 'T / / 0101 ENQ NAK % 5 E U 'E 'U / / 0110 ACK SYN & 6 F V 'F 'V / / 0111 BEL ETB ' 7 G W 'G 'W / / 1000 BS CAN ( 8 H X 'H 'X / / 1001 HT EM ) 9 I Y 'I 'Y / / 1010 LF SUB * : J Z 'J 'Z / / 1011 VT ESC + ; K [ 'K '[ / / 1100 FF FS , < L \ 'L '\ / / 1101 CR GS - = M ] 'M '] / / 1110 SO RS . > N ^ 'N '^ / / 1111 SI US / ? O _ 'O '_ / /TTYGCH: GETS A CHAR FROM KBD / IF GOT ^Z, IT SETS TTYEOF FLAG / LEAVES IT IN AC IN 7-BIT /TTYPRT: PRINTS CHAR IN AC ON TTY / IGNORES NULLS / PRINTS ^X ON CONTROL CHARS (EXCEPT CR, LF, FF, VT, TAB) / PRINTS 'X ON LOWER CASE /HANDLES TABS CORRECTLY / AND AUTOMATICALLY PRINTS CR/LF AT EOL / PRINTS ESCAPE AS $ /TTYTLS: USED TO ACTUALLY PRINT CHAR / IT HANDLES TABS AUTOMATICALLY / AND CR/LF'S AT END OF LINE /TTYPCH: IT USES TTYPRT TO PRINT CHAR BUT ALSO RESPONDS TO / ^C, ^O, ^S, ^Q. / IF ^Z IS BEING PRINTED, IT THEN STOPS FURTHER PRINTING /MUST BE AT TOP OF PAGE TTYPCH, /ENTRY POINT TO TTY PUNCH ROUTINE /OR TTY PRINT ROUTINE TTYGCH, 0 /ENTRY POINT TO TTY GET CHAR ROUTINE SNA JMS TGCH /ZERO AC-MEANT CALL TO TTYGCH PCH, AND (177 /FORCE TO 7-BIT DCA TCHAR TAD TGCH M140, SZA CLA /ARE WE ECHOING? JMP ECHO /YES, IGNORE ^S AND STUFF K5, 5 /MUST BE AT REL 10 TAD TCHAR TAD (-32 IFZERO PAUS < SNA CLA JMP I TTYPCH > IFNZRO PAUS < SNA JMP I TTYPCH TAD L15 /32-15 SNA CLA /LOOK FOR CR ISZ LINCNT /AT END OF PAGE? JMP NOPAUS /NOT AT CR, OR AT CR BUT NOT AT END OF PAGE L15, 15 /MUST BE HERE FOR SET TAD PAUSN DCA TTYTLS /SET COUNT FOR OUTER LOOP ISZ LINCNT JMP .-1 ISZ TTYTLS JMP .-3 TAD LINSYZ DCA LINCNT > NOPAUS, JMS TTYTST TAD (203-217 /NO SNA /^O? DCA TCHAR /YES, SET TO NULL SO IT WILL BE IGNORED TAD (217-223 /NO SZA CLA /^S? JMP ECHO /NO, IGNORE CHAR TTCTLQ, JMS TTYTST TAD (203-221 /NO, NOTHING ELSE MATTERS UNTIL ^Q SZA CLA /^Q? JMP TTCTLQ /NO, SUSPEND OUTPUTTING TTY32, KCC /YES, REMOVE ^Q FROM BUFFER /HAD NO ROOM FOR: / TAD LINSYZ / DCA LINCNT ECHO, DCA TGCH ISZ TTYPCH IFNZRO ESC < TAD TCHAR TAD (-33 SZA CLA JMP .+3 TAD L44 DCA TCHAR L44, 44 > TAD TCHAR SNA JMP TTYCTO /IGNORE NULLS IFNZRO RUB&4000 < TAD (-10 SNA JMP RUBO TAD (10-16 > IFZERO RUB&4000 < TAD (-16 > TTY100, CLL TTY10, TAD K5 TTY240, SZA /TAB? JMP NOTAB IFNZRO SIMTAB < TTYTAB, TAD TTY240 JMS TTYTLS TTY7, 7 /HERE FOR NO SPECIAL REASON TAD TABCTR AND TTY7 SZA CLA JMP TTYTAB JMP TTYCTO > IFNZRO SLOTAB < TAD TCHAR JMS TTYTLS TAD (177 JMS TTYTLS TAD (177 JMP PRIN+1 > IFZERO SIMTAB+SLOTAB <JMP PRIN> /BUG: IF HARDWARE TABS, DON'T COUNT COLUMNS CORRECTLY IFNZRO RUB&4000 < RUBO, TAD TTY10 /OUTPUT BACKSPACE-RUBOUT-BACKSPACE JMS TTYTLS TAD TTY240 JMS TTYTLS TAD (-4 TAD TABCTR JMP PREPRN > NOTAB, SZL CLA JMP SPCHR /DON'T UPARROW CHARS LF,CR,TAB,VT,FF IFNZRO FLAGLC < TAD TCHAR AND TTY140 TAD M140 SZA CLA /IS IT LC? JMP NOLC /NO TTYQUO, "' TAD TTYQUO /YES JMS TTYTLS /PRINT QUOTE TAD M40 JMP PRIN /PRINT UPPER CASE OF CHAR > NOLC, TAD TCHAR /NO, GET BACK CHAR AND TTY140 /HIGH ORDER BITS IRRELEVANT IFNZRO CTRL < M40, SMA SZA CLA /CAN'T BE NEGATIVE JMP PRIN /NOT A CONTROL CHARACTER TAD TTYUPA /ECHO 201-237 AS ^X (EXCEPT 211-215) JMS TTYTLS TAD TTY100 /ADD X100 TO ^K TO GET K > IFZERO CTRL < SNA CLA /IS CHAR A CONTROL CHAR? JMP TTYCTO /YES, DON'T ECHO CONTROL CHARACTERS EXCEPT FOR 211-215 > PRIN, TAD TCHAR JMS TTYTLS TTYCTO, TAD TABCTR /RETURN TABCNT IN AC JMP I TTYPCH IFZERO CTRL < M40, -40 > TTY140, SPCHR, STA CLL TAD LINSIZ PREPRN, DCA TABCTR /THESE CHARS RESET COLUMN COUNTER JMP PRIN TGCH, 0 /NON-ZERO MEANS TTYGCH WAS CALLED KSF JMP .-1 /WAIT FOR CHAR TO BE TYPED JMS TTYTST /WILD: (DON'T PUT IN) SZA CLA /FALL THRU AND RETURN R.O. / ISZ TTYGCH TAD (203-377 SNA CLA /TAKE RETURN 1 ON RUB OUT JMP I TTYGCH /"CLUMSY" - R.L. (9/18/73) ISZ TTYGCH KRB /GET CHARACTER TTYAND, AND (177 /MUST RETURN CHAR IN 7-BIT IFNZRO CNVLC < DCA TCHAR TAD TCHAR AND TTY140 TAD M140 SNA CLA /IS IT LC? TAD M40 /YES TAD TCHAR /NO > IFNZRO ALTMOD < TAD (-175 /IS IT 175 OR 176? SMA JMP CONV /YES, CONVERT ALTMODE TO ESCAPE TAD (175 /NO, RESTORE CHAR > JMP I TTYGCH /TAKE RETURN 3 /SHOULDN'T TABCTR BE INITIALIZED TO C(LINSIZ) UPON ENTRY? TABCTR, -110 TTYTLS, 0 TLS IFNZRO DELAY < TAD (-DELAY SZA CLA STA > TTYTSF, TSF JMP .-1 IFNZRO DELAY < IAC SZA /19.66 MS IS G.T. 1/60 SEC JMP TTYTSF > ISZ TABCTR TTYUPA, "^ TT7600, 7600 JMP I TTYTLS LINSIZ, -110 IFNZRO PAUS < LINSYZ, -HEIGHT LINCNT, -HEIGHT PAUSN, -PAUS > IFNZRO ALTMOD < IFNZRO KCC-6032 < CONV, CLA TAD (33 JMP I TTYGCH > IFZERO KCC-6032 < CONV, CLA IAC TAD TTY32 /DEVICE DEPENDENT JMP TTYAND > > TCHAR, 0 /TTYTST: READS KEYBOARD STATICALLY AND RESPONDS TO ^C / OTHERWISE RETURNS CHAR (8-BIT) MINUS 203 IN AC. / IF FLAG IS NOT UP, IT RETURNS A 1. TTYTST, 0 TAD TT7600 /OR CHAR IN KRS TAD (-7603 /-7603=175 KSF CLA IAC /STUFF IN BUFFER IS UNRELIABLE IF FLAG ISN'T UP SZA JMP I TTYTST IFNZRO INDVC-3 <KCC> CIF CDF 0 /BRANCH TO OS/8 MONITOR AT 07600 JMP I TT7600 /IT WILL PRINT "^C" FOR CHAR IN BUFFER PAGE / DYNAMICALLY MODIFYING THE KL8E HANDLER / *** I M P O R T A N T *** / THIS HANDLER CAN BE DYNAMICALLY CHANGED VIA SET COMMANDS. / CONSEQUENTLY, IT IS EXTREMELY IMPORTANT THAT PEOPLE / WHO MODIFY THIS SOURCE DO NOT AFFECT THE ALGORITHMS / NECESSARY TO PERFORM SUCH MODIFICATIONS. / THIS ALGORITHM IS EXPLAINED BELOW. / SET TTY WIDTH=N / SEARCH LOCATIONS 200-377 FOR A 7600. CALL ITS ADDRESS X. / LET Y BE THE INSTRUCTION AT LOCATION X+1. / FORM THE (RELATIVE) ADDRESS T=Y&177+200-1. / THEN LOCATIONS T AND X+2 CONTAIN MINUS THE TTY WIDTH. / THE WIDTH MUST BE A MULTIPLE OF 10 AND MUST NOT BE 200. / (BECAUSE -200 IS THE MAGIC 7600) / SET TTY CODE XX / SEARCH ENTIRE HANDLER FOR INSTRUCTIONS OF THE FORM 6XXY / WHERE XX IS NOT 20 OR 21, / AND FURTHERMORE DON'T INCLUDE A 6031 IF 2 LOCATIONS / FOLLOWING IS A 7650 / AND DON'T INCLUDE A 6034 IF 4 LOCATIONS FOLLOWING IS A 7650. / SET TTY [NO] ECHO / THE WORD INVOLVED IS AT (RELATIVE) LOCATION 120. / SET TO 7440 TO ECHO. / SET TO 7610 TO SUPPRESS ECHOING. / SET TTY LC / SEARCH LOCATIONS 200-377 FOR A 377. CALL ITS ADDRESS X. / LOOK AT LOCATION X+5. / IF THIS LOCATION IS NOT A 7650, THEN LC TO UC CONVERSION / WAS NOT ENABLED AT ASSEMBLY TIME. / IF THE FEATURE IS ENABLED, CHANGE LOCATION X+5 TO A 7610 / TO PREVENT THE CONVERSION. TO ALLOW CONVERSION, SET / LOCATION X+5 BACK TO 7650. / SET TTY PAGE / SEARCH LOCATIONS 215-300 FOR A 7450. CALL ITS ADDRESS X. / SET X+3 TO 7640 TO ENABLE ^S, ^Q. / SET X+3 TO 7200 TO DISABLE ^S, ^Q. / SET TTY TAB / SEARCH LOCATIONS 200-300 FOR A 7. / IF NOT FOUND, SIMULATED TABS WAS NOT ENABLED AT ASSEMBLY TIME. / IF FOUND, CALL ITS ADDRESS X. / TO PATCH OUT SIMULATED TABS: / MOVE C(X-12) TO LOCATION X-2 / CHANGE LOCATION X+3 TO A 7610 / TO RESTORE SIMULATED TABS: / SET LOCATION X-2 TO X-4&77+1200 / CHANGE LOCATION X+3 TO A 7640 / SET TTY FILL / THE LITERAL 177 MUST REMAIN AT THE END OF PAGE 2 / SEARCH LOCATIONS 200-300 FOR A 1377. / IF NOT FOUND, THEN FILL CHARACTERS WERE NOT ENABLED AT ASSEMBLY / TIME. IF FOUND, CALL ITS ADDRESS X. / TO PATCH OUT FILL CHARACTERS, MOVE C(X+3) TO LOCATION X-1. / TO RESTORE FILL CHARACTERS, MOVE C(X+1) TO LOCATION X-1. / SET TTY FLAGLC / SEARCH LOCATIONS 200-377 FOR A 247. / IF NOT FOUND, LOWER CASE FLAGGING WAS NOT ENABLED AT ASSEMBLY TIME. / IF FOUND, CALL ITS ADDRESS X. / TO DISABLE FLAGGING, SET LOCATION X-2 TO A 7200. / TO RE-ENABLE FLAGGING, SET LOCATION X-2 TO A 7640. / SET TTY PAUSE [N] / SEARCH LOCATIONS 200-300 FOR A 15. / IF NOT FOUND, PAUSING WAS NOT ENABLED AT ASSEMBLY TIME. / IF FOUND, CALL ITS ADDRESS X. / TO DISABLE PAUSING AFTER A FULL SCREEN, / SET LOCATION X-3 TO A 7610. / TO RE-ENABLE PAUSING, SET LOCATION X-3 TO A 7650. / TO SET PAUSE DURATION, SEARCH LOCATIONS 300-377 FOR A 7600, / CALLING ITS ADDRESS X. THEN (MINUS THE) PAUSE DURATION IS AT / LOCATION X+5. / SET TTY HEIGHT / THIS IS ONLY APPLICABLE IF SET TTY PAUSE HAS BEEN ASSEMBLED IN / (A 15 CAN BE FOUND ON SECOND PAGE). / NEGATIVE OF HEIGHT MUST BE SET IN BOTH LOCATIONS X+3 AND X+4 / WHERE X IS THE ADDRESS OF A 7600 AS IN ABOVE. / SET TTY ESCAPE / SEARCH LOCATIONS 200-377 FOR A 44. / IF NOT FOUND, THEN $ WAS NOT ASSEMBLED INTO TTY HANDLER. / IF FOUND, CALL ITS ADDRESS X. / TO DISABLE PRINTING ESCAPE AS $, SET LOCATION X-4 TO A 'CLA'. / TO CAUSE ESCAPE TO PRINT AS AN ESCAPE, SET LOCATION X-4 TO SZA CLA. / SET TTY ARROW / SEARCH LOCATIONS 200-377 FOR 7740. / IF NOT FOUND, USING OLD HANDLER. / CALL ITS ADDRESS X. / IF LOCATION X+1 IS MORE THAN 7000, / THEN UPARROW MODE WAS NOT ASSEMBLED INTO KL8E. / OTHERWISE, TO ALLOW ARROWS, SET LOCATION X+3 TO THE / CONTENTS OF LOCATION X+6. / TO CAUSE CONTROL CHARACTERS TO ECHO AS IS, SET / LOCATION X+3 TO 'SKP CLA'. / NOTE THAT THIS IS A DIFFERENT OPTION THAN ASSEMBLING CTRL=0. IFDEF TEST < *600 /TEST ROUTINE FOR KL8E HANDLER GO, JMS I (TTY /CALL HANDLER 0600 /READ SIX PAGES 1000 /BUFFER AT 01000 0001 /BLOCK 1 HLT /ERROR RETURN JMS I (TTY /CALL HANDLER AGAIN 4600 /OUTPUT SIX PAGES 1000 0001 HLT CLA JMP GO > $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | /1 ANALEX LINE PRINTER HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -1 DEVICE L645;DEVICE LPT;1040;0;ZBLOCK 2 /V3 FIXES: /1. ADDED VERSION NUMBER /2. ADDED PARITY ^C /3. ALLOWED ^C TO WORK EVEN IF LPT OFF / S.R. LPTVERSION="A&77 *200 /LINE PRINTER HANDLER FOR "OLD STYLE" LINE PRINTER /RECOGNIZES TAB,LINE FEED,VERTICAL TAB AND FORM FEED /IGNORES CARRIAGE RETURNS, TREATS ^N AS "CARRIAGE RETURN / WITHOUT LINE FEED" CONTROL CHARACTER. LSE=6651 LCF=6652 LLB=6654 LSD=6661 LCB=6662 LPR=6664 LPT, LPTVERSION LP7700, 7700 LPT11, 11 /FALLS THROUGH HARMLESSLY, CLEARING THE AC LPT214, RDF TAD LPTCIF DCA LPTXIT TAD I LPT AND LPT70 TAD LP6201 DCA LPTCDF CLA CLL CML RAR TAD I LPT /LINK IS NOW 1 IF COMMAND WAS A "WRITE" AND LP7700 CMA DCA LPTWC /LPTWC=WORD COUNT/2 ISZ LPT TAD I LPT DCA LPTCA ISZ LPT TAD I LPT ISZ LPT SNL JMP LPTERR SZA CLA JMP LPTCDF LCB JMS LPWAIT TAD LPT214 JMS LPTPCH /FORM FEED, INITIALIZES COUNT LPTCDF, HLT JMP LPT7 LPTLP, TAD I LPTCA JMS LPTPCH TAD I LPTCA AND LP7400 DCA LPTTMP ISZ LPTCA LP7400, 7400 TAD I LPTCA JMS LPTPCH TAD I LPTCA AND LP7400 CLL RTR RTR TAD LPTTMP RTR RTR JMS LPTPCH ISZ LPTCA LPT7, 7 ISZ LPTWC JMP LPTLP LPTRTN, ISZ LPT LPTXIT, HLT JMP I LPT LPTWC, 0 LPTCA, 0 LPTPCH, 0 AND LPT177 SZA TAD LPM140 SMA JMP I LPTPCH TAD LPT106 SNA JMP LPTCTZ TAD LPT13 CLL TAD LPT6 SZL SNA JMP LPTCTL TAD LPT11 LLB JMP LPTKSF LPWAIT, -1 WEIGHT, LSD JMP NOTDON LCF ISZ LPLPTR JMP I LPWAIT CLA IAC LPTCTL, SNA JMP LPTTAB TAD LPTTAD DCA LPTXXX TAD LP7607 DCA LPLPTR LPTXXX, HLT SNA JMP .+3 LPR LPTKSF, JMS LPWAIT JMP I LPTPCH NOTDON, KRS AND LPT177 TAD LPM3 SNA CLA KSF JMP WEIGHT LPTCIF, CDF CIF 0 JMP I .+1 7600 LPTCTZ, TAD LPT214 JMS LPTPCH JMP LPTRTN LPT6, 6 LPTTAB, TAD LPT40 LLB JMS LPWAIT TAD LPLPTR AND LPT7 LPM140, SZA CLA JMP LPTTAB JMP I LPTPCH LPTERR, CLA CLL CML RAR JMP LPTXIT LPTTAD, TAD . LPT70, 70 /LF LPT13, 13 /VT LPT177, 177 /FF 0 /CR LPT40, 40 /CR, NO LF LPM3, -3 LPT106, 106 LP7607, 7607 LP6201, CDF 0 LPTTMP, 0 LPLPTR, 0 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | /1 LINCTAPE HANDLER FOR BUILD / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -10 DEVICE LNC;DEVICE LTA0;4170;10;ZBLOCK 2 DEVICE LNC;DEVICE LTA1;4170;11;ZBLOCK 2 DEVICE LNC;DEVICE LTA2;4170;12;ZBLOCK 2 DEVICE LNC;DEVICE LTA3;4170;13;ZBLOCK 2 DEVICE LNC;DEVICE LTA4;4170;14;ZBLOCK 2 DEVICE LNC;DEVICE LTA5;4170;15;ZBLOCK 2 DEVICE LNC;DEVICE LTA6;4170;16;ZBLOCK 2 DEVICE LNC;DEVICE LTA7;4170;17;ZBLOCK 2 LINCVERSION="A&77 *200 /LINCTAPE HANDLER FOR PS/8 - CRUDE VERSION (WRITE OPERATION CHECKS /AFTER EACH BLOCK) /ALL 8 HANDLERS ARE IN THIS PAGE - SEE DECTAPE HANDLER FOR /DUMB COMMENT /PDP-12 OPCODES NEEDED LINC= 6141 PDP= 0002 CLR= 0011 AXO= 0001 TMA= 0023 TAC= 0003 STDI= 0436 COM= 0017 ROLI1= 0261 ESF= 0004 LTM203, -203 LTA, 0 LTA7, 7 LTA30, 30 LTA70, 70 LTA702, 702 LT3700, 3700 LTATMP, LINCVERSION DTA0, ISZ LTANO DTA1, ISZ LTANO DTA2, ISZ LTANO DTA3, ISZ LTANO DTA4, ISZ LTANO DTA5, ISZ LTANO DTA6, ISZ LTANO DTA7, ISZ LTANO LTA200, 200 TAD LTANO CMA TAD LTATAD DCA LTANO CLA CLL CML RTR TAD LTANO DCA LTADCA RDF TAD LCDIF0 DCA LTAXIT LTANO, 0 DCA LTA TAD LTAISZ LTADCA, 0 TAD I LTA DCA LTARG1 ISZ LTA TAD I LTA DCA LTARG2 ISZ LTA TAD I LTA CLL RAL /MOVE ARGUMENTS TO WORK AREA DCA LTARG3 ISZ LTA ISZ LTA TAD LTARG1 /GET CORE FIELD AND LTA70 TAD LTCDF DCA LTSET TAD LTSET AND LTA70 CLL RTL RTL /MOVE TO BITS 0-2. CONTROLLER RTL /WANTS THEM THERE SLTARG3,DCA LTATMP TAD LTANO /GET UNIT NO. AND LTA7 CLL RAR TAD LTATMP TAD LTA30 /SET BIT 7 ON. EXTENDED ADD. MODE LINC AXO /SEND DATA TO CONTROLLER PDP LT7600, 7600 DCA LTANO /RESET UNIT NO. TAD LTARG1 RTL AND LTA3 CLL RTL TAD LTA702 /ADD TAPE INST; STORE IT DCA LTINST LTALP, TAD LTARG2 /CORE ADDRESS TO CONTROLLER LTATAD, TAD LTA200 /SAVE 129 TH WORD DCA LTATMP LTSET, 0 TAD I LTATMP DCA LTASVC /SAVE LOC. TAD LTARG2 LINC TMA LTINST, 0 /TAPE INSTRUCTION HERE LTARG3, 0 /BLOCK NO. HERE LTAWLP, PDP CLA TAD LTASVC /RESTORE 129TH WORD DCA I LTATMP TAD LTA200 /ADD 200 FOR PARITY TTY KRS TAD LTM203 /TEST FOR ^C SNA CLA KSF /IS FLAG UP? JMP NOTFUG /EITHER NOT ^C OR NO FLAG TAD LTA30 LINC ESF PDP LT7700, 7700 TAD LTASVC DCA I LTATMP LCDIF0, CDF CIF 0 JMP I LT7600 NOTFUG, LINC STDI COM ROLI1 LTA3, TAC PDP SNL JMP LTAWLP LTADUN, CLL IAC CLA IAC RTL AND LTINST SNA CLA JMP LTALP LTNERR, TAD LTARG1 AND LT3700 TAD LT7700 SNA /ALL DONE? JMP LTAXIT DCA LTARG1 /NO.. SAVE COUNT TAD LTATMP DCA LTARG2 ISZ LTARG3 JMP LTALP LTAXIT, HLT JMP I LTA LTAISZ, ISZ LTANO LTARG1, 0 LTARG2, 0 LTCDF, CDF 0 LTASVC=LTADCA $$$$$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | /2 LINCTAPE SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / SOFSET=7747 SBLOCK=7776 LINC=6141 AXO=1 PDP=2 TMA=23 *0 VERSION="B&77 -2 DEVICE LINC;DEVICE SYS;4171;2007;0;1341 DEVICE LINC;DEVICE LTA0;4171;1007;0;1341 /V3D: REMOVED 'SOFSET' STARTB-ENDB-1 NOPUNCH *7600 ENPUNCH STARTB, ZBLOCK 16 B4047, 4047 B7647, 7647 1020;20;4 /IO PRESET 1020;20;AXO /LOAD SOME LINCTAPE FLAGS 1020;7600;TMA /LOAD MEMORY ADDRESS 720;1 /READ RECORD 1 PDP /BACK TO PDP-8 MODE CLA TAD I B4047 CDF 10 DCA I B7647 CDF 00 ISZ B4047 ISZ B7647 JMP .-6 JMP I .+1 ENDB, 7605 /THE BOOTSTRAP FOR A LINCTAPE SYSTEM IS AS FOLLOWS: /LEFT SWITCHES=700,RIGHT SWITCHES=0 /I-O PRESET IN LINC MODE AND PRESS "D0". TAPE WILL MOVE /WHEN TAPE STOPS PRESS "START 20". *200 NOPUNCH;*7600;ENPUNCH ZBLOCK 7 SHNDLR, VERSION S7600, 7600 RDF TAD SCIF DCA SXIT TAD I SHNDLR DCA SFUN /FUNCTION ISZ SHNDLR TAD I SHNDLR DCA SADR /BUFFER ADDRESS ISZ SHNDLR TAD I SHNDLR /V3D TAD SOFSET /SOFSET=0 NOP /SAVE ROOM CLL RAL DCA SBLOK /BLOCK NO. ISZ SHNDLR CLL CML RAR AND SFUN RTL RTL TAD S702 /GET FUNCTION;CREATE READ OR WRITE DCA SINST /READ OR WRITE INSTRUCTION. TAD SFUN AND S70 /FIELD BITS TO AC 0-2 TAD SADCDF DCA SADSET TAD SADSET AND S70 RTL IAC RTL /SET EXTENDED ADDRESS RTL LINC AXO PDP CLA TAD SFUN RAL AND S7600 DCA SFUN SADSET, 0 SLOOP, CLA CLL CMA RTL DCA SERRCT /NO. ERROR TRIES STRY, TAD SADR TAD S200 DCA SADNXT TAD I SADNXT DCA SADSVC TAD SADR LINC TMA /CORE ADDRESS TO CONTROL SINST, 0 /READ OR WRITE SBLOK, 0 /BLOCK NO. HERE PDP CMA /CHECKSUM HERE. 7777=GOOD DCA SADSET TAD SADSVC DCA I SADNXT IFNZRO .-7700 <NZERR> SKP HLT TAD SADSET SZA CLA JMP SERR SOK, ISZ SBLOK TAD SADNXT DCA SADR TAD SFUN TAD S7600 SNA /ALL DONE? JMP SDONE /YES DCA SFUN JMP SLOOP SERR, TAD SINST RTR;RTR SPA CLA /WAS IT READ? JMP SOK /NO..WRITE. CONTINUE ISZ SERRCT /READ..RETRY IT? JMP STRY CLA CLL CML RAR /DON'T BOTHER SKP SDONE, ISZ SHNDLR SXIT, 0 JMP I SHNDLR SFUN, 0 SADR, 0 SERRCT, 0 S702, 702 S200, 200 S70, 70 SCIF, CDF CIF 0 SADCDF, CDF 0 SADNXT, 0 SADSVC, 0 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | /5 LP08/LS8E/LA180/LV8E HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / LPVERSION="C&77 *0 -1 DEVICE LPSV;DEVICE LPT;1040;LPT&177;ZBLOCK 2 /LPT HANDLER FOR EITHER LP08 OR LS8E LINE PRINTER. /HANDLES TABS, PASSES EVERYTHING ELSE ON TO THE HARDWARE. LSF=6661 /SKIP ON FLAG LSR=6663 /SKIP ON ERROR LLS=6666 /LOAD LPT BUFFER DBST= 6570 /SKIP IF DEMAND SET AND CLEAR IT DBTD= 6574 /LOAD COMPLEMENT OF AC0-11 TO TRANSMIT BUFFER DBSE= 6575 /SET INTERRUPT ENABLE DBCE= 6575 /CLEAR INTERRUPT ENABLE LA180=0 /SET TO 1 TO USE LA180 /V3D CHANGES: /ADDED IN LA180 SUPPORT *200 LPWDTH, -205 /-(WIDTH+1) [USE -121 FOR 80 COLUMNS] LTERMC, 14 /4 FOR LV8 LVCCNV, -40 /0 IF PRINTER PRINTS LC LP7770, 7770 LP0007, 0007 LPT, LPVERSION /NORMAL ENTRY POINT CLA STL RAR TAD I LPT / R/W BIT TO LINK L AND LP7700 / I CMA /TREAT 0 PG CNT AS 0 WD CNT N DCA LPTWC /SAVE -(DBLWD COUNT+1) K LPT214, RDF / TAD LPTCIF / M DCA LPTXIT /SAVE CIF CDF RETRN FIELD U TAD I LPT / S AND (70 / T TAD (CDF 0 / DCA LPTCDF / N ISZ LPT /PT TO BUFFER O TAD I LPT /GET BUFFER ADDRESS T DCA LPTCA /SAVE BUFFER PTR ISZ LPT /PT TO BLOCK # C TAD I LPT /GET IT H ISZ LPT /POINT TO ERROR RETURN G LPTCDF, HLT / ! SNL JMP LPTERR /CAN'T READ FROM LPT SNA CLA TAD LPT214 /OUTPUT FORM FEED IF BLOCK 0 LPTELP, JMS LPTPCH /PRINT 3RD CHAR OF DOUBLEWORD ISZ LPTWC JMP LPTLP /GET 3 MORE CHARS SKP LPTCTZ, TAD LTERMC JMS LPTPCH /OUTPUT FORM FEED IF ^Z SEEN (EOT OF LV8) ISZ LPT /BUMP TO NORMAL RETURN LPTXIT, HLT /RESTORE FIELDS JMP I LPT /EXIT /UNPACKING LOOP - USES A SHIFT REGISTER METHOD TO GET THE /THIRD CHARACTER IN EACH DOUBLEWORD. LPTLP, STL /GUARD BIT OF SHIFT REGISTER LPROTL, RTL RTL SPA /DO WE HAVE 8 BITS SHIFTED IN? JMP LPTELP DCA LPTCDF /SAVE SHIFT REGISTER TAD I LPTCA JMS LPTPCH /PRINT A CHAR TAD I LPTCA ISZ LPTCA /BUMP INPUT POINTER LP7400, 7400 /PROTECT ISZ AND LP7400 CLL RAL TAD LPTCDF /SHIFT HIGH 4 BITS INTO JMP LPROTL /SHIFT REGISTER LPTERR, STL CLA RAR /PUT 4000 IN AC JMP LPTXIT /AND TAKE ERROR RETURN LPTWC, 0 LPTCA, 0 /CHAR PRINT ROUTINE LPTPCH, 0 AND (177 TAD (-175 SMA JMP LPFLSH /FLUSH CODES 175-177 TAD (175-140 SMA TAD LVCCNV /CONVERT LC TO UC IF DESIRED TAD (140-33 SNA TAD (11 /CHANGE ALTMODE TO $ IAC SNA JMP LPTCTZ /^Z - END OF FILE TAD (32-11 SNA JMP LPTTAB /TABS MUST BE SIMULATED LPLFHK, TAD (11 /RESTORE CHAR SZA /FLUSH NULLS JMS LPCHAR / TAD LPLPTR /IF COL. CTR GT 0 SMA /WE HIT A CONTROL CHAR TAD LPWDTH /OR EOL- SET TO FULL DCA LPLPTR /WIDTH (NOTE LPLPTR=1 !) LP7700, LPFLSH, SMA CLA /NEVER SKIPS JMP I LPTPCH /RETURN LPCHAR, 0 /LOW LEVEL PRINT ROUTINE IFZERO LA180 < NOP /NOP'S NEEDED FOR SET LLS /PUT CHAR IN LPT BUFFER NOP > IFNZRO LA180 < CMA DBTD /PUT CHAR IN LP BUFFER CMA > AND LP7770 /KLUDGE - CLEARS COLUMN CTR TAD LP7770 /ON CR, LF, VT, FF BUT ALSO SNA CLA /ON ^H,^N, AND ^O. BIG DEAL DCA LPLPTR /?SR RICHIE SAID 'LPCRFG' LP7600, 7600 /CLEAR AC LPCTCL, TAD LP7600 KRS TAD (-7603 /CHECK FOR ^C FROM CONSOLE SNA CLA KSF /WITH FLAG UP JMP .+3 LPTCIF, CDF CIF 0 /YES, RETURN TO OS/8 JMP I LP7600 IFNZRO LA180 <DBST> /NO MUST BE HERE IFZERO LA180 <LSF> /NO FOR SET JMP LPCTCL /WAIT FOR FLAG ISZ LPLPTR /CHECK LINE OVERFLOW JMP I LPCHAR TAD (15 JMS LPCHAR CLA IAC JMP LPLFHK LPTTAB, TAD LPBLNK /GET PSEUDO BLANK JMS LPCHAR /PRINT IT TAD LPWDTH CMA TAD LPLPTR /GET # CHARS IN LINE AND LP0007 LPBLNK, SZA CLA /LOOP 'TILL MULTIPLE OF 8 JMP LPTTAB JMP I LPTPCH LPLPTR, 0 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 | / LQP HANDLER FOR OS/8 / / / THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE / AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT / CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY / FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / / THE SOFTWARE DESCRIBED HEREIN IS FURNISHED TO THE PURCHASER / UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED / (WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH / SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / / DIGITAL EQUIPMENT ASSUMES NO RESPONSIBILITY FOR THE USE / OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED / BY DIGITAL. / / COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION / PDMP=6502 PDMC=6503 PDPC=6504 PDRS=6505 PDWS=6506 PDRE=6507 LPVERSION="A&77 /VERSION A (MH) *0 /ORIGIN FOR BUILD INFO -1 /ONE ENTRY POINT DEVICE LQP /GROUP NAME DEVICE LPT /DEVICE NAME 1040 /DEVICE TYPE LQP&177+4000 /ENTRY POINT + TWO-PAGE FLAG 0 /REQUIRED ZEROES 0 PAGE LQPORG=. LQPCSV, 0 LQPBUF, 0 LQPDWC, 0 LQPDCY, 0 LQP, LPVERSION /ENTRY POINT (MH) CLA STL RTL /RAISE RIBBON PDWS PDRE /INIT PRINTER DCA .-1 /---FIRST TIME ONLY--- JMS LQPDCZ /INIT SECOND PAGE LINK RDF /GET RETURN CIF TAD (CIF CDF) DCA LQPRDF TAD I LQP /GET FUNCTION WORD AND (70) TAD (CDF) DCA LQPBDF /SET BUFFER CDF TAD I LQP AND (3700) CMA DCA LQPDWC /SET DOUBLE-WORD COUNT +1 ISZ LQP TAD I LQP DCA LQPBUF /SET BUFFER PTR ISZ LQP TAD I LQP LQPBDF, 0 /CDF TO BUFFER SZA CLA JMP LQPGO TAD (15);JMS LQPDOC /NEW PAGE ON BLOCK 0 TAD (14);JMS LQPDOC LQPGO, ISZ LQPDWC JMP LQPGO1 /LOOP IF MORE TO DO LQPCZ, TAD (13);JMS LQPDOC /CLEAR SPACE ACCUMULATORS LQPRDF, 0 /THEN RETURN TO CALLER ISZ LQP ISZ LQP JMP I LQP LQPGO1, TAD I LQPBUF /GET NEXT WORD AND (7400) CLL RTR DCA LQPCSV /SAVE PART OF THIRD CHAR TAD I LQPBUF JMS LQPDOC /OUTPUT FIRST CHAR ISZ LQPBUF TAD I LQPBUF JMS LQPDOC /OUTPUT SECOND CHAR TAD I LQPBUF AND (7400) /PUT THIRD CHAR TOGETHER BSW TAD LQPCSV CLL RTR JMS LQPDOC /OUTPUT THIRD CHAR ISZ LQPBUF JMP LQPGO /LOOP FOR DONE TEST LQPDCZ, 0 TAD LQPDCZ AND (7600) TAD (LQPDCX-LQPORG) DCA LQPDCY JMP I LQPDCZ LQPDOC, 0 JMS I LQPDCY JMP LQPCZ KRS /CHECK FOR CONTROL C AT CONSOLE AND (177) TAD (-3) SZA CLA /SKIP IF SO JMP I LQPDOC CIF CDF 0 /RETURN TO OS8 JMP I (7600) PAGE LQPTCH, 24 /2*NUMBER OF INCRS PER CHAR LQLINE, 20 /2*NUMBER OF INCRS PER LINE LQPAGE, -102 /-NUMBER OF LINES PER PAGE LQPDCX, 0 /OUTPUT ONE CHAR AND (177) TAD (-40) /TEST FOR SPECIAL OR BLANK SPA JMP LQPSPC /JUMP IF SPECIAL SNA JMP LQPIDX /JUMP IF BLANK TAD (40) LQPDC1, DCA LQPCTM /SAVE CHAR CODE LQPWLP, PDRS /LOOP TIL DEVICE READY BSW SMA CLA JMP .+5 /JUMP IF NO CHECK FLAG PDRE /ELSE RESET DEVICE DCA LQPX /AND HORIZONTAL POSITIONS DCA LQPDX ISZ LQPDY /ADVANCE A LINE, FOR CLARITY PDRS STL TAD (400) SZL CLA JMP LQPWLP /LOOP IF NOT READY TAD LQPDY /DO Y MOTION, IF NEEDED SNA JMP LQPNDY /JUMP IF NONE CIA DCA LQPMTM /SAVE -NUMBER LINES TO DO TAD LQLINE /SUM TOTAL INCRS TO DO ISZ LQPMTM JMP .-2 PDMP /MOVE PAPER TAD LQPY /COMPUTE NEW POSITION TAD LQPDY TAD LQPAGE /ON PAGE, PLEASE!! SMA JMP .-2 CIA TAD LQPAGE CIA DCA LQPY DCA LQPDY LQPNDY, TAD LQPDX /DO X MOTION, IF NEEDED SNA JMP LQPNDX /JUMP IF NONE STL SMA CLL CIA /ADJUST FOR -X MOTION DCA LQPMTM TAD LQPTCH /SUM TOTAL INCRS TO DO ISZ LQPMTM JMP .-2 RAR /GET DIRECTION INDICATOR BACK PDMC /MOVE CARRIAGE TAD LQPX /COMPUTE NEW POSITION TAD LQPDX DCA LQPX DCA LQPDX LQPNDX, TAD LQPCTM /RETRIEVE SAVED CHAR SNA JMP LQPDCR /JUMP IF NONE CLL RAL /ADJUST FOR OFFSET PDPC /PRINT CHAR LQPIDX, ISZ LQPDX /BUMP SPACE COUNTER JMP LQPDCR /RETURN TO CALLER JMP LQPDCR /...IN CASE ISZ SKIPPED... LQPSPC, /SPECIAL CHARACTER CHECKING TAD (40-32) /CONTROL Z? SNA JMP I LQPDCX /TAKE EOF RETURN IF SO TAD (32-15) /CARRIAGE RETURN? SNA JMP LQPCR /JUMP IF SO IAC /FORM FEED? SNA JMP LQPFF /JUMP IF SO IAC /VERTICAL TAB? SNA JMP LQPDC1 /CLEAR ACCUMULATORS, IF SO IAC /LINE FEED? SNA JMP LQPLF /BUMP LINE COUNTER IF SO IAC /TAB? SNA CLA JMP LQPDCR /RETURN IF NOT RECOGNIZED LQPTB, TAD LQPX /DO TAB TAD LQPDX TAD (10) AND (7770) CIA LQPCR, TAD LQPX CIA DCA LQPDX /SAVE CR OR TAB MOTION LQPDCR, ISZ LQPDCX /BUMP TO OK RETURN JMP I LQPDCX /AND TAKE IT LQPLF, ISZ LQPDY /BUMP LINE COUNTER TAD LQPY /CHECK FOR NEXT PAGE TAD LQPDY TAD LQPAGE SMA CLA JMP LQPDC1 /JUMP IF SO JMP LQPDCR /ELSE, JUST RETURN LQPFF, TAD LQPY /DO FORM FEED TAD LQPAGE CIA DCA LQPDY JMP LQPDC1 /DO PAGE EJECT NOW LQPX, 0 LQPDX, 0 LQPY, 0 LQPDY, 0 LQPMTM, 0 LQPCTM, 0 PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | /1 PTR/PTP HANDLER FOR LOW SPEED / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -2 DEVICE KS33;DEVICE PTP;1020;0;ZBLOCK 2 DEVICE KS33;DEVICE PTR;2010;110;ZBLOCK 2 VERSION="A&77 *200 PTP, VERSION CLA CLL CML /SET LINK ON TO INDICATE PUNCH JMS PSETUP /DO COMMON CRAP PTPLP, KSF JMP PTPCNT /KEYBOARD FLAG OFF - DON'T WORRY ABOUT ^C KRS AND PTP177 TAD PTPM3 SZA CLA /IS THERE A ^C IN THE TTY BUFFER? JMP PTPCNT /NO PTPCIF, CDF CIF 0 JMP I PT7600 PTPCNT, TAD I PTPCA JMS PTPPCH /FIRST CHAR IN LOW ORDER 8 BITS OF WORD 1 DCA PTR ISZ PTPCA PT7700, 7700 TAD I PTPCA JMS PTPPCH /SECOND CHAR IN LOW ORDER 8 BITS OF WORD 2 CLL RTR RTR TAD PTR RTR RTR /THIRD CHARACTER NOW IN AC JMS PTPPCH PTPEND, ISZ PTPCA PT70, 70 /JUST IN CASE WERE PUNCHING PG 7600 KEEP THIS LITERAL HERE JMP PTPISZ PSETUP, 0 RDF /GET FIELD OF CALLING PROGRAM TAD PTPCIF DCA PTPXIT /SET UP RETURN SEQUENCE TAD I PTP AND PT70 TAD PCDF DCA PTPCDF RAR /GET LINK(1=PTP,0=PTR) TAD I PTP /GET FUNCTION WORD ISZ PTP SPA /CHECK CORRECT MODE JMP PTPERR /SIGNAL "UNRECOVERABLE DEVICE ERROR" AND PT7700 CMA /SET UP -(WORD COUNT)/2-1 DCA PTPWC TAD I PTP /SET UP STARTING ADDRESS ISZ PTP DCA PTPCA TAD I PTP PTPCDF, 0 /SET DATA FIELD TO ACCESS BUFFER PTPEOF=PTPCDF SNA CLA SZL JMP PTPISZ TAD PTP336 /INPUT INITIALIZATION - TYPE "^" AND WAIT TLS KSF JMP .-1 PT7600, 7600 PTPISZ, ISZ PTPWC JMP I PSETUP /LOOP FOR BUFFER SIZE (128 WORDS) PTPRTN, TAD PTPEOF SZA CLA /DID WE RUN OUT OF TAPE? ISZ PTP ISZ PTP PTPXIT, HLT /EXIT CDF GOES HERE JMP I PTP PTPPCH, 0 TLS TSF /NOTICE THE GLORIOUS LACK OF OVERLAP JMP .-1 AND PT7400 JMP I PTPPCH PTPCA, 0 PTR, VERSION /*** CORRECT ENTRY IN MAIN ASSEMBLY IF THIS IS MOVED! CLA CLL TAD PTR DCA PTP JMS PSETUP /SET UP ADDRESS, COUNT, FIELDS PTRLP, JMS PTRGCH /READ FIRST CHARACTER OF 3 DCA I PTPCA JMS PTRGCH DCA PTPPCH JMS PTRGCH RTL RTL DCA PTR TAD PTR AND PT7400 TAD I PTPCA DCA I PTPCA /HIGH ORDER 4 BITS INTO WORD 1 TAD PTR /GET THE CHAR FROM THE PTR BUFFER RTL RTL AND PT7400 TAD PTPPCH ISZ PTPCA PT7400, 7400 DCA I PTPCA /LOW ORDER 4 BITS INTO WORD 2 JMP PTPEND PTRGCH, 0 TAD PTPEOF SNA CLA JMP I PTRGCH CLA CLL CMA RTL /-3 DCA PTPEOF DCA PTR PTTIME, ISZ PTR /TIMEOUT LOOP FOR LOW SPEED READER JMP PTP232 ISZ PTPEOF /TIMES OUT IN 132 MS(PDP 8/E) OR 205 MS(PDP 8) JMP PTP232 TAD PTP232 JMP I PTRGCH /OVERFLOWED - PTPEOF IS NOW 0, RETURN ^Z PTP232, 232 /WASTE SOME TIME PTP177, 177 KSF JMP PTTIME /READER NOT READY - CONTINUE TIMEOUT KRB JMP I PTRGCH /RETURN WITH CHARACTER PTPERR, CLA CLL CML RAR /SIGNAL A "PERMANENT I/O ERROR" ON THE DEVICE JMP PTPXIT-2 PCDF, CDF 0 PTP336, 336 PTPWC, 0 PTPM3, -3 $$$$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | /1 HI SPEED READER/PUNCH HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /1 HI SPEED READER/PUNCH HANDLER *0 -2 DEVICE PT8E;DEVICE PTP;1020;0;ZBLOCK 2 DEVICE PT8E;DEVICE PTR;2010;112;ZBLOCK 2 PTVERSION="A&77 *200 /THIS IS THE REAL HIGH SPEED HANDLER. /HIGH SPEED PAPER TAPE HANDLER FOR BLEEP MONITOR /PACKS 3 CHARACTERS IN 2 WORDS ON INPUT, UNPACKS ON OUTPUT /PAGE RELOCATABLE PTP, PTVERSION CLA CLL CML /SET LINK ON TO INDICATE PUNCH JMS PSETUP /DO COMMON CRAP PTPLP, TAD I PTPCA JMS PTPPCH /FIRST CHAR IN LOW ORDER 8 BITS OF WORD 1 DCA PTR ISZ PTPCA PT7700, 7700 TAD I PTPCA JMS PTPPCH /SECOND CHAR IN LOW ORDER 8 BITS OF WORD 2 CLL RTR RTR TAD PTR RTR RTR /THIRD CHARACTER NOW IN AC JMS PTPPCH PTPEND, ISZ PTPCA PT70, 70 /JUST IN CASE WERE PUNCHING PG 7600 KEEP THIS LITERAL HERE KSF JMP PTPISZ /KEYBOARD FLAG OFF - DON'T WORRY ABOUT ^C PTPKRS, KRS AND PTP177 TAD PTPM3 SZA CLA /IS THERE A ^C IN THE TTY BUFFER? JMP PTPISZ /NO PTPCIF, CDF CIF 0 JMP I .+1 7600 PSETUP, 0 RDF /GET FIELD OF CALLING PROGRAM TAD PTPCIF DCA PTPXIT /SET UP RETURN SEQUENCE TAD I PTP AND PT70 TAD PCDF DCA PTPCDF RAR /GET LINK(1=PTP,0=PTR) TAD I PTP /GET FUNCTION WORD ISZ PTP SPA /CHECK CORRECT MODE JMP PTPERR /SIGNAL "UNRECOVERABLE DEVICE ERROR" AND PT7700 CMA /SET UP -(WORD COUNT)/2-1 DCA PTPWC TAD I PTP /SET UP STARTING ADDRESS ISZ PTP DCA PTPCA TAD I PTP PTPCDF, 0 /SET DATA FIELD TO ACCESS BUFFER PTPEOF=PTPCDF SNA CLA SZL JMP PTPKRS TAD PTP336 /INPUT INITIALIZATION - TYPE "^" AND WAIT TLS KSF JMP .-1 JMS PTRGCH /INITIALIZE THE PTR BUFFER CHAR 6032 /CLEAR AC AND KEYBOARD FLAG JMP PTPKRS /CHECK FOR ^C PTPISZ, ISZ PTPWC JMP I PSETUP /LOOP FOR BUFFER SIZE (128 WORDS) PTPRTN, TAD PTPEOF SZA CLA /DID WE RUN OUT OF TAPE? ISZ PTP ISZ PTP PTPXIT, HLT /EXIT CDF GOES HERE JMP I PTP PTPPCH, 0 PLS /NOTICE THE GLORIOUS LACK OF OVERLAP PSF JMP .-1 AND PT7400 JMP I PTPPCH PTPCA, 0 PTR, PTVERSION /*** CORRECT ENTRY IN MAIN ASSEMBLY IF THIS IS MOVED! CLA CLL TAD PTR DCA PTP JMS PSETUP /SET UP ADDRESS, COUNT, FIELDS PTRLP, JMS PTRGCH /READ FIRST CHARACTER OF 3 DCA I PTPCA JMS PTRGCH DCA PTPPCH JMS PTRGCH RTL RTL AND PT7400 TAD I PTPCA DCA I PTPCA /HIGH ORDER 4 BITS INTO WORD 1 TAD PTR /GET THE CHAR FROM THE PTR BUFFER RTR RTR RAR /PUT THE LOW ORDER BITS INTO AC 0-3 AND PT7400 TAD PTPPCH ISZ PTPCA PT7400, 7400 DCA I PTPCA /LOW ORDER 4 BITS INTO WORD 2 JMP PTPEND PTRGCH, 0 TAD PTPEOF SNA CLA JMP PT0BFR /MAKE SURE BUFFER IS ZEROED RFC DCA PTPEOF PTTIME, ISZ PTPEOF /THIS LOOP OVERFLOWS IN APPROX. 100 MS ON A PDP-8, JMP PGCHLP /72 MS ON A PDP-8/E TAD PTP232 /SEND ^Z TO BUFFER PT0BFR, DCA PTR JMP PTRXX /AND 0 GARBAGE CHARACTER PGCHLP, TAD PTPTMP DCA PTR PTP232, 232 PTP336, 336 /FALL THROUGH CONSTANTS TO STALL FOR TIME PTP177, 177 RSF JMP PTTIME /READER NOT READY - CHECK TIMING RRB /READER READY - READ CHAR PTRXX, DCA PTPTMP /BUFFER READER BY ONE CHARACTER TO ELIMINATE TAD PTR /GARBAGE CHARACTER AT END OF TAPE JMP I PTRGCH /AND RETURN PTPERR, CLA CLL CML RAR /SIGNAL A "PERMANENT I/O ERROR" ON THE DEVICE JMP PTPXIT-2 PCDF, CDF 0 PTPTMP, 0 PTPWC, 0 PTPM3, -3 $$$$$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | /3 RF08 NON SYSTEM HANDLER / NULL: / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / SR RF08=1 /CHANGE TO 0 FOR DF32 HANDLER *0 -2 IFNZRO RF08 < DEVICE RF;DEVICE RF;4064;RF&177;ZBLOCK 2 > IFZERO RF08 < DEVICE DF;DEVICE DF;4124;DF&177;ZBLOCK 2 > DEVICE RF;DEVICE NULL;0240;NULL&177;ZBLOCK 2 SCA=7751 SWC=7750 RFVERSION="A&77 NULLVERSION="A&77 *200 INITLC, 0 /PATCH TO 232 TO HAVE NULL STORE ^Z IN BUFFER SYSER, CLA CLL CML RAR /4000 ISZ SYSCNT /TRY AGAIN? SKP CLA JMP SFIELD /WHY BOTHER CLA CLL CMA RTL TAD RF DCA RF /RESET PARAMETERS AND TRY AGAIN JMP RETRY T1, 0 T2, 0 CTLC, 0 KRS AND (177 TAD (-3 SNA CLA KSF JMP I CTLC CIFCDF, CIF CDF 0 /RETURN TO OS/8 IF USER TYPED ^C JMP I S7600 ZBLOCK 224-. IFNZRO .-224 <ADRERR,QQQQ> /ENTRY PT MUST BE RELATIVE 24 DF, RF, RFVERSION CLA CLL CMA RTL /-3 DCA SYSCNT /# TRYS ON ERROR RETRY, TAD I RF /HANDLER RUNS IN USER'S DATA FIELD RAL CLA RTL TAD S6603 DCA SFUN /EITHER A READ OR WRITE TAD I RF AND S70 DCA SFIELD /GET FIELD OF BUFFER TAD I RF RAL AND S7600 CIA DCA T1 /SET UP WORD COUNT CLA CMA ISZ RF TAD I RF DCA T2 /BUFFER ADDRESS-1 ISZ RF RDF TAD SCDF DCA RESRDF SCDF, CDF 0 TAD T1 DCA I (SWC TAD T2 DCA I (SCA RESRDF, HLT /RESTORE USER'S DATA FIELD IFZERO RF08 < TAD I RF RTL AND S3700 > TAD SFIELD 6615 /LOAD DISK EXTENDED MEMORY S7600, 7600 IFNZRO RF08 < TAD I RF RTR RTR AND S377 6643 /LOAD HIGH ORDER > TAD I RF RTR RTR RAR AND S7400 SFUN, HLT /BECOMES DISK IOT.(READ OR WRITE) RDF TAD CIFCDF DCA SFIELD IFZERO RF08 <6622> IFNZRO RF08 <6623> JMP .-1 JMS CTLC ISZ RF 6621 /SKIP ON ERROR IFNZRO RF08 <SKP /SENSE OF SKIP IS REVERSED> JMP SYSER ISZ RF SFIELD, HLT /RETURN TO PROPER FIELD 6601 /CLEAR TROUBLESOME FLAG JMP I RF IFZERO RF08 <S3700, 3700> IFNZRO RF08 <S377, 0377> NULL, NULLVERSION CLA RDF TAD CIFCDF DCA NULRET JMS CTLC TAD I NULL /GET FN WORD DCA SFUN ISZ NULL /POINT TO CORE LOC TAD I NULL /GET START OF BUFFER DCA T1 ISZ NULL /POINT TO BLOCK NUMBER ISZ NULL /POINT TO ERROR RETURN TAD SFUN SPA CLA JMP BYE /LEAVE BUFFER ALONE ON A WRITE TAD SFUN AND S70 /ISOLATE FIELD OF BUFFER TAD SCDF DCA NFIELD TAD SFUN CLL RAL AND S7600 /GET NO. OF WDS IN BUFFER CIA DCA T2 TAD INITLC NFIELD, HLT /GO TO FIELD OF BUFFER DCA I T1 /ZERO BUFFER ISZ T1 ISZ T2 JMP .-3 BYE, TAD SFUN RAL /PUT R/W BIT IN LINK CLA CML RAL /AC=1 IF READING SNA ISZ NULL /POINT TO GOOD RETURN IF WRITE NULRET, HLT /BACK TO USER'S DATA FIELD, INST FIELD JMP I NULL /RETURN SYSCNT, 0 S6603, 6603 S70, 70 S7400, 7400 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | /2 RF08 SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /MAINTENANCE RELEASE CHANGES: /1. REMOVED SOFSET /2. CHANGED LENGTH OF PLATTER DF32=0 RF08=1 VERSION="B&77 *0 -1 DEVICE RF08;DEVICE SYS;4064;2007;0;1777 STARTB-ENDB-1 NOPUNC *6604 ENPUNC STARTB, NOP /FOR "SWAP" B6653, 6653 B7647, 7647 B7577, 7577 B200, 200 B7605, 7605 B7751, 7751 ZBLOCK 6622-. TAD I B6653 CDF 10 DCA I B7647 CDF 0 ISZ B6653 ISZ B7647 JMP .-6 /MOVE FIELD 1 RESIDENT UP IFNZRO RF08 <6643> 6615 7600 TAD B7577 DCA I B7751 TAD B200 6603 /NOW READ IN FIELD 0 RESIDENT FROM RECORD 1/2 IFNZRO RF08 <6623> IFNZRO DF32 <6622> JMP .-1 6621 IFNZRO RF08 <SKP> HLT /ERROR READING SYSTEM IN ENDB, JMP I B7605 /BOOTSTRAP FOR DISK MONITOR IS AS FOLLOWS: / LOCATION CONTENTS / 7750 7600 / 7751 6603 / 7752 6622 / 7753 5352 / 7754 5752 *200 NOPUNCH *7600 ENPUNCH ZBLOCK 7 SHNDLR, VERSION CLA CLL CMA RTL /-3 DCA SYSCNT /# TRYS ON ERROR TAD I SHNDLR RAL CLA RTL TAD S6603 DCA SFUN /EITHER A READ OR WRITE TAD I SHNDLR AND S70 DCA SFIELD /GET FIELD OF BUFFER TAD I SHNDLR RAL AND S7600 CIA DCA SWC /SET UP WORD COUNT CLA CMA ISZ SHNDLR TAD I SHNDLR DCA SCA /BUFFER ADDRESS-1 ISZ SHNDLR IFNZRO DF32 < TAD I SHNDLR RTL AND S3700> TAD SFIELD 6615 /LOAD DISK EXTENDED MEMORY S7600, 7600 IFNZRO RF08 < TAD I SHNDLR RTR RTR AND S377 6643 /LOAD HIGH ORDER> TAD I SHNDLR RTR RTR RAR AND S7400 SFUN, HLT /BECOMES DISK IOT.(READ OR WRITE) RDF TAD SCIF DCA SFIELD IFNZRO DF32 <6622> IFNZRO RF08 <6623> JMP .-1 ISZ SHNDLR 6621 /SKIP ON ERROR IFNZRO RF08 <SKP /SENSE OF SKIP IS REVERSED> JMP SYSER ISZ SHNDLR SFIELD, HLT /RETURN TO PROPER FIELD 6601 /CLEAR TROUBLESOME FLAG JMP I SHNDLR ZBLOCK 2 SYSER, CLA CLL CML RAR /4000 ISZ SYSCNT /TRY AGAIN? SKP CLA JMP SFIELD /WHY BOTHER CLA CLL CMA RTL TAD SHNDLR DCA SHNDLR /RESET PARAMETERS AND TRY AGAIN IFNZRO RF08 <IFNZRO .-7700 <NZERR>; SKP; HLT> JMP SHNDLR+3 SCIF, CIF 0 SYSCNT, 0 IFNZRO DF32 <IFNZRO .-7700 <NZERR>; SKP; HLT> S6603, 6603 S70, 70 S7400, 7400 IFNZRO DF32 <S3700, 3700> IFNZRO RF08 <S377, 377> SCA=7751 SWC=7750 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | /3 RK8 NON SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -4 DEVICE RK01;DEVICE RKA0;4050;20;ZBLOCK 2 DEVICE RK01;DEVICE RKA1;4050;21;ZBLOCK 2 DEVICE RK01;DEVICE RKA2;4050;22;ZBLOCK 2 DEVICE RK01;DEVICE RKA3;4050;23;ZBLOCK 2 DLDC=6732 DCLS=6742 DRDS=6741 DSKD=6745 DSKE=6747 DCLA=6751 DLWC=6753 DLCA=6755 DLDR=6733 RKVERSION="A&77 /V3 CHANGES: /1. VERSION # IS NOW 1 /2. A FULL 4K READ OR WRITE IS NOW LEGAL *200 /THE ENTRY POINTS FOR RK8 ARE SET AT 20-23. VITAL!! RLOC, 0 /FOR BUFFER ADDRESS RREC, 0 /HOLDS RECORD NO. R76, 76 RDLDR, DLDR RKANO, 0 RKAISZ, ISZ RKANO RBLKCT, 0 /HOLDS TOTAL WORD COUNT RERRCT, 0 /# ERROR TRIES R177, 177 R40, 40 RM3, -3 R400, 400 R7400, 7400 RKA, 0 /HOLDS ARGUMENT ADDRESS R34, 34 RZERO, RKVERSION IFNZRO .-220 <ADRERR,QQQ> RKA0, ISZ RKANO RKA1, ISZ RKANO RKA2, ISZ RKANO RKA3, ISZ RKANO R7600, 7600 TAD RM3 DCA RERRCT /3 TRIES ON ERROR TAD RKANO /THIS CODE RESTORES THE ISZ RKANO CMA /WHICH WAS DESTROYED IN THE CALL TAD RKATAD DCA RFUNCT CLA CLL CML RTR TAD RFUNCT /FORM DCA RKAN,WHERE RKAN WAS CALLED DCA RKADCA RDF TAD RCDIF /RESTORE TO PROPER FIELD DCA REXIT RFUNCT, HLT /CONTAINS TAD RKAN WHEN EXECUTED DCA RKA /SO WE SAVE ADDRESS OF ARGUMENTS TAD RKAISZ /AND NOW RESTORE THE ISZ RKANO RKADCA, HLT TAD I RKA /FUNCTION WORD DCA RFUNCT ISZ RKA CLA CMA /BUFFER ADDRESS -1 TAD I RKA DCA RLOC ISZ RKA TAD I RKA /RECORD NUMBER DCA RREC TAD RFUNCT /NOW FORM RK8 IOT FROM FUNCTION. CLL RAL /READ/WRITE TO LINK AND R7600 /ISOLATE WORD COUNT DCA RBLKCT RTL /READ=6733,WRITE=6735 TAD RDLDR DCA RINST RLOOP, TAD RLOC /LOAD CURRENT ADDRESS DLCA TAD RBLKCT /TEST WORD COUNT FOR SIZE. RKATAD, TAD R7600 /FULL=256, HALF=128 SZA CLA TAD R7600 TAD R7600 DLWC /LOAD WORD COUNT TAD RFUNCT /LOADING COMMAND WORD WITH FIELD CMA RAR /AND DISK SELECTION AND R34 TAD RKANO CMA RAL AND R76 DLDC DCLS /CLEARS SELECT ERROR IF STILL UP TAD RREC RINST, HLT /GETS DISK IOT DSKD /TEST COMPLETION FLAG SKP CLA /NOT DONE YET JMP RCTLC /DONE. CHECK FOR ^C DSKE /IS ERROR UP? JMP .-4 RERROR, ISZ RERRCT /ERROR BUMP COUNT JMP .+4 DCA RKANO /IT'S ALL OVER. CLEAR FOR RECALL CLA CLL CML RAR JMP RETRN+1 /FATAL ERROR DRDS /LOOK AT STSTUS AND R40 /TRACK NOT FOUND BIT ISZ RZERO /CARRY OVER FROM SYSTEM HANDLER JMP .-1 SNA CLA JMP RLOOP /TRY AGAIN DCLA /RECALIBRATE DSKD JMP .-1 JMP RLOOP /AND TRY AGAIN RNEXT, DSKE /TRANSFER DONE. IS ERROR UP? SKP JMP RERROR /YEP.TOUGH LUCK ISZ RREC /BUMP RECORD NUMBER TAD RLOC TAD R400 /BUMP CURRENT ADDRESS DCA RLOC TAD RBLKCT /DONE WITH ALL TRANSFERS? SNA JMP RDONE /V3 0 OK HERE CLL CML TAD R7400 SZL SNA JMP RDONE DCA RBLKCT /NO..UPDATE TOTAL WORD COUNT JMP RLOOP /AND DO THE TRANSFER RDONE, CLA DCA RKANO /CLEAR FOR RECALL RETRN, ISZ RKA ISZ RKA REXIT, HLT JMP I RKA RCTLC, KRS /TEST FOR ^C IN KEYBOARD BUFFER AND R177 /WITH THE FLAG UP TAD RM3 SNA CLA KSF JMP RNEXT /NO ^C, KEEP GOING RCDIF, CIF CDF 0 JMP I R7600 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 | /10 OS/8 RK8 SYSTEM HANDLER V3D / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /SYSTEM HANDLER ALSO HAS RESIDENT THE NONSYSTEM HANDLER RKA1: / SOFSET=7747 RKVERSION="D&77 DLDA=6731 /LOAD DISK ADDRESS (MAINT ONLY) DLDC=6732 /LOAD COMMAND REGISTER /0: ENABLE CHANGE IN INTERRUPT STATUS /1: ENABLE PROGRAM INTERRUPT ON TRANSFER DONE /2: ENABLE INTERRUPT ON ERROR /3: UNUSED /4: SEEK TRACK AND SURFACE ONLY /5: ENABLE READ/WRITE OF 2 HEADER WORDS /6-8: EXTENDED MEMORY ADDRESS /9-10: DISK FILE NUMBER /11: UNUSED DLDR=6733 /LOAD DISK ADDRESS AND READ, THEN CLEAR AC /0-7: TRACK ADDRESS /8: SURFACE BIT /9-11: SECTOR ADDRESS DRDA=6734 /READ DISK ADDRESS DLDW=6735 /LOAD DISK ADDRESS AND WRITE, THEN CLEAR AC DRDC=6736 /READ DISK COMMAND REGISTER DCHP=6737 /LOAD DISK ADDRESS AND CHECK PARITY DRDS=6741 /READ DISK STATUS REGISTER /0: ERROR /1: TRANSFER DONE /2: CONTROL BUSY ERROR /3: TIME OUT ERROR /4: PARITY OR TIMING ERROR /5: DATA RATE ERROR /6: TRACK ADDRESS ERROR /7: SECTOR NO GOOD ERROR /8: WRITE LOCK ERROR /9: TRACK CAPACITY EXCEEDED ERROR /10: SELECT ERROR /11: BUSY DCLS=6742 /CLEAR STATUS REGISTER DMNT=6743 /LOAD MAINTENANCE REGISTER /SEE PAGE 7-145 IN 1972 SMALL COMPUTER HANDBOOK DSKD=6745 /SKIP ON DISK DONE DSKE=6747 /SKIP ON DISK ERROR DCLA=6751 /CLEAR ALL DRWC=6752 /READ WORD COUNT REGISTER DLWC=6753 /LOAD WORD COUNT REGISTER DLCA=6755 /LOAD CURRENT ADDRESS REGISTER DRCA=6757 /READ CURRENT ADDRESS REGISTER *0 -3 DEVICE RK8;DEVICE SYS;4051;2007;0;6260 DEVICE RK8;DEVICE RKA0;4051;1007;0;6260 DEVICE RK8;DEVICE RKA1;4051;RKA1&177+1000;0;6260 /V3D CHANGES: /FIXED BUG CONCERNING RETRY COUNT IF LINK SET ON CALL /REMOVED 'SOFSET' BOOT-ENDB-1 NOPUNC *1 ENPUNC BOOT, TAD I BOOTX1 DCA I BOOTX2 TAD I BOOTX3 CDF 10 DCA I BOOTX4 CDF 0 TAD BOOTX2 SZA CLA JMP BOOT JMP BGETUT BOOTX1, 200 BOOTX2, 7577 BOOTX3, 47 BOOTX4, 7646 BGETUT, DRDC RAR AND BOOT3 DCA I BOOTUT JMP I B7605 BOOT3, 3 BOOTUT, DEFUNIT ZBLOCK 27-. B7605, 7605 DSKD /MUST LOAD OVER LOC. 30 JMP .-1 /MUST LOAD OVER 31 ENDB, JMP BOOT /THE BOOTSTRAP FOR THE RK8 IS AS FOLLOWS: (UNIT 0) / LOCATION CONTENTS / 30 6733 / 31 5031 /LOAD ADDRESS 30 AND START /THE BOOTSTRAP FOR OTHER UNITS IS AS FOLLOWS: / 26 7604 / 27 6732 / 30 6733 / 31 5031 /LOAD ADDRESS 26, PUT UNIT NUMBER IN SWITCH REGISTER BITS 9-10, /CLEAR, CONTINUE *200 NOPUNCH;*7600;ENPUNCH ZBLOCK 7 RK8, RKVERSION CLA TAD DEFUNIT /USE DEFAULT UNIT FOR SYSTEM HANDLER JMP COMN DEFUNIT,0 RKBAD, STL CLA RAR /4000 SKP RKOVER, ISZ RK8 /POINT TO GOOD RETURN SFIELD, HLT /CONTAINS CIF CDF TO USER'S FIELD JMP I RK8 /RETURN IFNZRO .&177-21 <BADLOC,XXXX> RKA1, RKVERSION CLA TAD RKA1 DCA RK8 CLA IAC COMN, DCA RKANO CLL STA RTL /V3D DCA RKCNT /SET # OF RETRIES ON AN ERROR TO 3 RDF TAD LCIFCDF /CALLING FIELD FOR RETURN DCA SFIELD RKRETRY,TAD I RK8 /GET FN WORD AND L70 /ISOLATE FIELD OF BUFFER TAD RKANO TAD RKANO /INCLUDE UNIT # (TIMES 2) DLDC /SET FIELD TAD I RK8 /GET FN WORD BACK RAL /MOVE R/W BIT TO LINK AND L7600 /ISOLATE # OF WORDS TO READ SZA CIA /NEGATE DLWC /LOAD WORD COUNT THEN CLEAR AC RTL /MOVE R/W BIT TO AC 10 TAD LDLDR DCA RKINST /CREATE READ (6733) OR WRITE (6735) ISZ RK8 /POINT TO BUFFER ADDRESS STA TAD I RK8 /GET CURRENT ADDRESS-1 DLCA /LOAD CURENT ADDRESS AND CLEAR AC ISZ RK8 /POINT TO BLOCK # DCLS /CLEAR STATUS REGISTER DSKE /CHECK FOR NON-EXISTENT DISK ERROR L7760, SMA SZA SNL CLA /OK, BUT SKIP ALWAYS JMP RKBAD /IT'S BAD /V3D TAD RKANO /! CAN'T HAVE OFFSETS ON OTHER UNITS THAN 0 /V3D SNA CLA /V3D TAD SOFSET TAD I RK8 /GET BACK # ISZ RK8 /POINT TO ERROR RETURN RKINST, HLT /GO (EITHER 6733 OR 6735) SZA CLA /CHECK FOR NO DISK AT ALL JMP RKBAD /IOT DIDN'T CLEAR AC /THE ABOVE TWO LINES ARE USELESS. HOW DID HE BOOTSTRAP IF DISK WASN'T THERE? DSKD /WAIT FOR DONE JMP .-1 DSKE JMP RKOVER /NO ERROR L70, 70 L20, 20 L7600, 7600 L4, 4 SKP CLA IFNZRO .-7701 <NZERR,XXX> HLT /SAFETY HALT AT 7701 DRDS /READ STATUS REGISTER AND L4 /CHECK FOR TRACK OVERFLOW SZA CLA JMP RKTKOV ISZ RKCNT /SOME OTHER ERROR - BADNESS [SIC] JMP RKOK /TRY AGAIN JMP RKBAD /3 TRIES IS ENOUGH RKOK, DRDS /READ STATUS REGISTER AND L40 /TRACK SEEK ERROR? DCLS /CLEAR STATUS REGISTER SNA CLA JMP RKBACK DCLA /YES - RECALIBRATE DSKD /WAIT 'TILL DONE JMP .-1 RKBACK, CLL STA RTL /-3 TAD RK8 DCA RK8 /POINT BACK TO FUNCTION WORD JMP RKRETRY /GO TRY AGAIN RKTKOV, DCLS /CLEAR STATUS REGISTER DRDA /READ TRACK ADDRESS STUFF AND L7760 /ISOLATE JUST TRACK (NEEDED ??) TAD L20 /BUMP TRACK NUMBER BY 1 JMP RKINST /GO BACK AND CONTINUE TRANSFER LCIFCDF,CIF CDF 0 LDLDR, DLDR L40, 40 RKCNT, 0 RKANO, 0 / MUST NOT GO INTO LOCATION 7744 IFZERO .&177-145&4000 <TOOBIG,XXXX> $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | /1 RK8E NON-SYSTEM HANDLER FOR OS/8 / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /DEC-S8-URK8B-A-LA HJ /COPYRIGHT 1973 /DIGITAL EQUIPMENT CORPORATION /MAYNARD, MASSACHUSETTS 01754 /JANUARY 22, 1973 /ONE RK8E IS TREATED AS TWO LOGICAL DISKS /EACH OF 3248 OS/8 BLOCKS. /THIS HANDLER CONTAINS ENTRY POINTS FOR THE 8 LOGICAL UNITS. /(RKA0,RKB0,RKA1,RKB1,RKA2,RKB2,RKA3,RKB3) DCLR=6742 DLAG=6743 DLDC=6746 DRST=6745 DSKP=6741 DLCA=6744 *0 -10 DEVICE RK05;DEVICE RKA0;4230;20;ZBLOCK 2 DEVICE RK05;DEVICE RKB0;4230;21;ZBLOCK 2 DEVICE RK05;DEVICE RKA1;4230;22;ZBLOCK 2 DEVICE RK05;DEVICE RKB1;4230;23;ZBLOCK 2 DEVICE RK05;DEVICE RKA2;4230;24;ZBLOCK 2 DEVICE RK05;DEVICE RKB2;4230;25;ZBLOCK 2 DEVICE RK05;DEVICE RKA3;4230;26;ZBLOCK 2 DEVICE RK05;DEVICE RKB3;4230;27;ZBLOCK 2 VERSION="A&77 *200 /THE FOLLOWING MUST REMAIN HERE BECAUSE OF THE R200 REF. R37, 37 /USED TO CHECK FOR CYLINDER CHANGE RKEBLK, 0 /12 BITS OF BLOCK NUMBER CHKHED, 0 /CHECK HEADER FLAG RKEARG, 0 /HOLDS RETURN ADDRESS RKENO, 0 /HOLDS ENTRY POINT COUNT PAGCNT, 0 /HOLDS REMAINING PAGE COUNT RKEISZ, ISZ RKENO /TO PUT BACK OVER THE EP ADDR CTRLC, TAD R200 /TO IGNORE PARITY KRS /READ THE KEYBOARD TAD R7575 /SUBTRACT ^C SNA CLA KSF /IS KEYBOARD FLAG UP? JMP RWAIT /NO RCIF, CDF CIF 0 JMP I R7600 /BOOTSTRAP /NOTE: A LOCATION CAN BE EEKED OUT BY USING RKA0 BETTER RERRCT, 0 /HOLDS RETRY COUNT ZBLOCK 220-. /PAD ENTRY POINTS TO 220 RKA0, VERSION RKB0, ISZ RKENO /THE ISZ'S SET UP A COUNT OF RKA1, ISZ RKENO /OF WHICH ENTRY POINT WE CAME IN RKB1, ISZ RKENO RKA2, ISZ RKENO RKB2, ISZ RKENO RKA3, ISZ RKENO RKB3, ISZ RKENO R400, 400 /AN INNOCUOUS AND INSTRUCTION WHICH /IS REFERENCED BY A TAD. CLA CLL CMA RTL /AC=-3 DCA RERRCT /RETRY 3 TIMES TAD RKENO /7-EP NUMBER CMA /EP-8 TAD RKETAD /ADD ON INSTRUCTION /WHICH REFERENCES THE 400 TO GENERATE A /TAD CORRECT ENTRY POINT INSTRUCTION. DCA GETENT /WE EXECUTE TO GET USERS ADDRESS CLA CLL CML RTR /AC=2000 TAD GETENT /GENERATE A DCA INTO ENTRY POINT INSTRUCTION DCA RKECMD /THIS IS EXECUTED TO REPLACE ISZ RKENO RDF /GET USERS DATA FIELD TAD RCIF /BUILD A CIF FOR RETURNING DCA REXIT /STORE IT INTO THE EXIT CODE GETENT, HLT /WILL BE A TAD "ENTRY POINT" /WILL SAVE UNIT INFO HERE FOR ERRORS DCA RKEARG /SAVE USERS ADDR IN COMMON LOCATION DCA RKENO /ZERO COUNT FOR NEXT TIME TAD RKEISZ /GET THE ISZ RKENO RKECMD, HLT /THE DCA ENTRY POINT IS PUT HERE /AND THIS LOCATION IS USED FOR THE RK8E COMMAND RETRY, TAD RKEARG /AC=-2 IF ERROR RETRY DCA RKEARG TAD GETENT AND R6 /GET THE UNIT NUMBER DCA RKECMD /SET UP UNIT FOR COMMAND TAD GETENT RAR /PUT HI/LOW LOGICAL DISK BIT IN LINK SZL CLA TAD R6260 /DISPLACEMENT TO 2ND HALF OF DISK DCA RKA0 /NICE PLACE FOR A CONSTANT TAD I RKEARG /GET ARG1 AND R4070 /GET R/W AND DF BITS TAD RKECMD /GET UNIT NUMBER DCA RKECMD /BASE COMMAND TO RK8E(DLDC) TAD I RKEARG /GET ARG1 AGAIN TAD I RKEARG /GET ARG1 AGAIN ISZ RKEARG /POINT TO ARG2 AND R7600 CIA /TO MAKE 0 LOOK LIKE 40 PAGES DCA PAGCNT /SAVE PAGE COUNT TAD I RKEARG /GET ARG2 ISZ RKEARG /POINT TO ARG3 DLCA /LOAD CURRENT ADDRESS REGISTER TAD I RKEARG /GET ARG3 CLL TAD RKA0 /SYS OR RKB0 DISPLACMENT DCA RKEBLK /LOW PART OF RK8E BLOCK NUMBER SZL /STILL OFF IF BELOW BLOCK 10000 OVRFLO, ISZ RKECMD /TURN ON EXTENDED BIT IF OVERFLOWED RELOOP, DCA CHKHED /SET CHECK HEADER FLAG TO EITHER /0 OR 4000(WHICH GETS RTR'D BEFORE USED) /AND CAUSES EITHER A "DATA" OR "ALL" /TRANSFER DCLR /CLEAR STATUS REGISTER TAD PAGCNT /TEST TO SEE IF ONLY 1 PAGE WANTED TAD R200 SNA CLA RKETAD, TAD R400 /7600 WAS IN PAGCNT TAD CHKHED /ADD IN CHECK HEADER FLAG CLL RTR /SHIFT TO CORRECT BITS TAD RKECMD /ADD IN BASE COMMAND DLDC /LOAD COMMAND REGISTER TAD RKEBLK DLAG /LOAD BLOCK REGISTER AND GO RWAIT, DSKP /WAIT ON FLAG JMP CTRLC /CHECK FOR CONTROL C WHILE WAITING DRST /READ COMPLETION REGISTER CLL RAL /GET RID OF SUCCESS BIT SZA /AND SEE IF ANYTHING LEFT JMP RERROR /AN ERROR /IF THERE WAS NO ERROR L=1 BECAUSE DONE FLAG TAD PAGCNT /CHECK TO SEE IF DONE TAD R400 /ADD 2 PAGES ONTO TOTAL SNL JMP RKDONE /NO MORE TO DO DCA PAGCNT /SAVE FOR NEXT TIME TAD RKEBLK CMA /THE R37 MUST REMAIN AT 200 SO THE FOLLOWING IS A 200 R200, AND R37 /IF BLOCK IS AT A 37 MAKE /NEXT OPERATION DO A CHECK HEADER SZA CLA STL RAR /SET AC TO "ALL" FLAG ISZ RKEBLK /BUMP BLOCK NUMBER JMP RELOOP /TRANSFER SOME MORE JMP OVRFLO /PAST BLOCK 7777-SET EXTENDED BIT RERROR, AND R1002 /AC WAS RAL'D AND WE WANT TO SEE IF /DRIVE SEEK FAILED OR CYLINDER ADDR ERROR SNA CLA JMP RKTST3 /WE TRY 3 TIMES /WE HAVE TO RECALIBRATE DRIVE DCLR /CLEAR STAUS REGISTER STL RTL /AC=2 DCLR /RECALIBRATE DRIVE DSKP /WAIT ON FLAG JMP .-1 DCLR /CLEAR STATUS REGISTER DRST /WAIT FOR STATUS TO CLEAR SZA CLA JMP .-2 /STILL DOING RECALIBRATE RKTST3, CLA CLL CMA RAL /AC=-2 ISZ RERRCT /SKIP IF WE TRIED 3 TIMES JMP RETRY /TRY AGAIN JMP .+3 /ERROR EXIT RKDONE, ISZ RKEARG /NORMAL RETURN R7600, 7600 /GROUP 2 CLA ISZ RKEARG /IF JUMPED TO HERE- ERROR RETURN REXIT, HLT /RESET USERS INST FIELD- WE NEVER TOUCHED DF JMP I RKEARG /EXIT R6260, 6260 /SIZE OF ONE LOGICAL DISK R4070, 4070 /USED TO GET READ/WRITE AND DF BITS R1002, 1002 / " TO CHECK FOR RECALIBRATE ERRORS R6, 6 /TO PEEL OUT UNIT NUMBER R7575, 7575 /- ^C CONSTANT $$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 | /3 RK8E SYSTEM HANDLER FOR OS/8 BUILD / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / VERSION="C&77 *0 DECIMAL;RKLEN=3248;OCTAL -3 DEVICE RK8E;DEVICE SYS;4231;2007;0;RKLEN DEVICE RK8E;DEVICE RKA0;4231;1007;0;RKLEN DEVICE RK8E;DEVICE RKB0;4231;SHNDL1&177+1000;0;RKLEN /ONE RK8E IS TREATED AS TWO LOGICAL DISKS /EACH OF 3248 OS/8 BLOCKS. /THIS HANDLER CONTAINS ENTRY POINTS FOR THE SYSTEM DEVICE /AND RKA1. /THIS HANDLER ALLOWS BOOTING OFF OF ANY UNIT DCLR=6742 DLAG=6743 DLDC=6746 DRST=6745 DSKP=6741 DLCA=6744 DMAN=6747 RKEBLK=7750 /12 BITS OF BLOCK NUMBER SERRCT=7751 /HOLDS RETRY COUNT PAGCNT=7752 /PAGE COUNT RKECMD=7753 /BASE OF DLDC COMMAND CHKHED=7754 /CHECK HEADER FLAG /MAINTENANCE RELEASE CHANGES: /1. FIXED BUG RE INTERACTION WITH NON-SYSTEM HANDLER / [APRIL DSN] BOOT-BLAST RELOC 0 BOOT, TAD I BOOTX1 DCA I BOOTX2 TAD I BOOTX3 CDF 10 DCA I BOOTX4 CDF 0 TAD BOOTX2 SZA CLA JMP BOOT JMP I B7605 BOOTX1, 177 BOOTX2, 7577 BOOTX3, 46 BOOTX4, 7646 ZBLOCK 30-. /DSKP GOES OVER 30 DSKP JMP .-1 AND RK6 DCA I RKUNIT JMP BOOT RK6, 6 RKUNIT, SYSUNT+400 /CHANGED BEFORE IT IS MOVED B7605, 7605 BLAST, RELOC /THE BOOTSTRAP IS RK8E ONLY /30 6743 /31 5031 /LOAD ADDRESS 30 AND START /BOOTSTRAP FOR OTHER UNITS: / 25 7604 / 26 6746 / 27 6743 / 30 7604 / 31 5031 /LOAD ADDRESS 25, PUT UNIT # IN BITS 9&10 OF SWITCH REGISTER, /CLEAR CONTINUE. *200 RELOC 7600 ZBLOCK 7 SHNDLR, VERSION /SYSTEM HANDLER ENTRY POINT CLA CLL /GUARD AGAINST RANDOM AC TAD SHNDLR DCA SHNDL1 /SETUP COMMON EXIT AND PARM ADDR'S JMP SHNDC /JUMP TO COMMON CODE /VARIOUS CONSTANTS TO PAD E.P. FOR RKA1 TO 7621 S6260, 6260 /SIZE OF ONE LOGICAL DISK S4070, 4070 /USED TO GET READ/WRITE AND DF BITS S3700, 3700 / " TO GET PAGE COUNT SCIF, CIF 0 / " TO RESTORE USERS FIELD S37, 37 /USED TO CHECK FOR CYLINDER CHANGE IFNZRO .-7621 <ERROR1, BARF> SHNDL1, VERSION /2ND E.P. FOR RKB0 AND TEMPORARY CLA /GUARD AGAINST NON-ZERO AC TAD S6260 /RKB1 IS SECOND HALF OF PACK SHNDC, DCA SHNDLR /SET BLOCK DISPLACEMENT ACCORDING TO SYS OR RKB0 CLA CLL CMA RTL /AC=-3 DCA SERRCT /RETRY COUNT RDF TAD SCIF DCA SFIELD /RESET USER INST FIELD FOR EXIT RETRY, TAD SHNDL1 /AC=-2 IF ERROR ENRTY DCA SHNDL1 TAD I SHNDL1 /GET ARG1 AND S4070 /GET R/W AND DF BITS TAD SYSUNT DCA RKECMD /BASE COMMAND TO RK8E(DLDC) TAD I SHNDL1 /GET ARG1 AGAIN ISZ SHNDL1 /POINT TO ARG2 AND S3700 SNA STL CLA RAR /4000 DCA PAGCNT /SAVE PAGE COUNT TAD I SHNDL1 /GET ARG2 ISZ SHNDL1 /POINT TO ARG3 DLCA /LOAD CURRENT ADDRESS REGISTER TAD I SHNDL1 /GET ARG3 CLL TAD SHNDLR /SYS OR RKB0 DISPLACMENT DCA RKEBLK /LOW PART OF RK8E BLOCK NUMBER SZL /STILL OFF IF BELOW BLOCK 10000 OVRFLO, ISZ RKECMD /TURN ON EXTENDED BIT IF OVERFLOWED RELOOP, DCA CHKHED /SET CHECK HEADER FLAG TO EITHER /0 OR 4000(WHICH GETS RTR'D BEFORE USED) /AND CAUSES EITHER A "DATA" OR "ALL" /TRANSFER TAD PAGCNT /TEST TO SEE IF ONLY 1 PAGE WANTED AND S7600 SNA CLA TAD S400 /100 WAS IN PAGCNT TAD CHKHED /ADD IN CHECK HEADER FLAG CLL RTR /SHIFT TO CORRECT BITS TAD RKECMD /ADD IN BASE COMMAND DLDC /LOAD COMMAND REGISTER TAD RKEBLK DLAG /LOAD BLOCK REGISTER AND GO DSKP /WAIT ON FLAG JMP .-1 DRST /READ COMPLETION REGISTER CLL RAL /GET RID OF SUCCESS BIT SZA CLA /AND SEE IF ANYTHING LEFT JMP SERROR /AN ERROR IFNZRO .-7700 <ERROR2, DOUBLE BARF> SKP /PROTECTION AGAINST JMS I 7700 FIELD 0 HLT /HE'S HAD IT TAD PAGCNT TAD S7600 SPA SNA JMP RKDONE DCA PAGCNT TAD RKEBLK CMA AND S37 /IF BLOCK IS AT A 37 MAKE /NEXT OPERATION DO A CHECK HEADER SZA CLA STL RAR /SET AC TO "ALL" FLAG ISZ RKEBLK /BUMP BLOCK NUMBER JMP RELOOP /TRANSFER SOME MORE JMP OVRFLO /PAST BLOCK 7777-SET EXTENDED BIT /RECALIBRATE ON ALL ERRORS SERROR, DCLR /CLEAR STATUS REGISTER STL RTL /AC=2 DCLR /RECALIBRATE DRIVE DSKP /WAIT ON FLAG JMP .-1 DCLR /CLEAR STATUS REGISTER DRST /WAIT FOR STATUS TO CLEAR SZA CLA JMP .-3 /V3C STILL DOING RECALIBRATE CLA CLL CMA RAL /AC=-2 ISZ SERRCT /SKIP IF WE TRIED 3 TIMES JMP RETRY /TRY AGAIN JMP .+3 /ERROR EXIT RKDONE, ISZ SHNDL1 /NORMAL RETURN S7600, 7600 /GROUP 2 CLA ISZ SHNDL1 /IF JUMPED TO HERE- ERROR RETURN SFIELD, HLT /RESET USERS INST FIELD- WE NEVER TOUCHED DF JMP I SHNDL1 /EXIT S400, 400 / " FOR 128 WORD TRANSFER MODE(RTR'D IN CODE) SYSUNT, 0 /SYSTEM DEV UNIT # (SET BY BOOTSTRAP) RELOC $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 | /RL0: RL01 DRIVE 0 NON-SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /RL01 DRIVE 0 NON-SYSTEM HANDLER VERSION="A&77 /NOTES: /1. PRE-OMNIBUS COMPUTERS NOT SUPPORTED. /EDIT HISTORY: /13-OCT-77 DAVID SPECTOR: CREATION /INSTRUCTIONS THAT GENERATE CONSTANTS AC0001=CLA IAC AC0002=CLA CLL CML RTL AC0003=CLA CLL CML IAC RAL /* AC0004=CLA CLL IAC RTL /* AC0006=CLA CLL CML IAC RTL /* AC0100=CLA IAC BSW /* AC2000=CLA CLL CML RTR AC3777=CLA CLL CMA RAR AC4000=CLA CLL CML RAR AC5777=CLA CLL CMA RTR AC6000=CLA CLL CML IAC RTR /* AC7775=CLA CLL CMA RTL AC7776=CLA CLL CMA RAL /* USE ONLY ON VT-78 AND PDP-8E,F,M,A /ID CODE AT START OF BAD BLOCK LIST (BBL) ID=123 /BAD BLOCK LIST FORMAT: /WORD CONTENTS /0 ID (IDENTIFICATION CODE) /1 BAD BLOCKS FOR DEVICE A (ASCENDING ORDER) /... ... /20 0 (TERMINATOR FOR LIST A) /21 BAD BLOCKS FOR DEVICE B (ASCENDING ORDER) /... ... /40 0 (TERMINATOR FOR LIST B) /RL01 DEFINITIONS RLIOT=6600 RLDC=RLIOT 0 /CLEAR DEVICE RLSD=RLIOT 1 /SKIP IF DONE RLMA=RLIOT 2 /LOAD MEM ADDR RLCA=RLIOT 3 /LOAD REGISTER "A" RLCB=RLIOT 4 /LOAD REG "B" AND EXECUTE RLSA=RLIOT 5 /LOAD SECTOR ADDR /RLIOT 6 UNUSED RLWC=RLIOT 7 /LOAD WORD COUNT RRER=RLIOT 10 /READ ERROR REG RRWC=RLIOT 11 /READ WORD COUNT RRCA=RLIOT 12 /READ REG "A" RRCB=RLIOT 13 /READ REG "B" RRSA=RLIOT 14 /READ SECTOR ADDR RRSI=RLIOT 15 /READ SILO BYTE /RLIOT 16 UNUSED RLSE=RLIOT 17 /SKIP IF ERROR /RLCB FUNCTION BITS: RLMT=0 /MAINTENANCE MODE RLRE=1 /RESET DRIVE ERRORS RLST=2 /READ STATUS REGS INTO SILO RLSK=3 /SEEK RLRH=4 /READ HEADER RLWR=5 /WRITE RLRD=6 /READ RLRN=7 /READ WITH NO HEADER CHECK /BIT DEFINITIONS IN REGISTERS: BYTE=1000 /BYTE TRANSFER MODE /HEADER BLOCK FOR USE BY "BUILD" *0 -2 /- NR DEVICES PER HANDLER /FORMAT OF ENTRIES IN HEADER BLOCK: /WORD DESCRIPTION /0 GROUP NAME (4 CHAR) /2 DEVICE NAME (4 CHAR) /4 DCB WORD FOR AN RL (TYPE 26) DIRECTORY DEVICE /5 OFFSET TO ENTRY POINT, 2-PAGE INDICATOR /6 0 (UNUSED WORD) /7 0 TO REPRESENT NON-SYSTEM DEVICE DRIVE=0 DEVICE RL0;DEVICE RL0A;4260;RLA&177+4000;0;0 DEVICE RL0;DEVICE RL0B;4260;RLB&177+4000;0;0 /HANDLER CODE *200 /FIRST PAGE /DATA A17, 17 A47, 47 A175, 175 A200, 200 A377, 377 A7751, 7751 BASE, TAD BBL+1 ABLOCK, BLOCK-MAIN AMA, MA-MAIN /RELATIVE ADDR OF MA ASECT, SECTOR-MAIN ATRACK, TRACK-MAIN AERROR, ERROR-MAIN /SET UP ARGUMENTS BY CALLING 2ND PAGE SUBROUTINE SET, TAD OFFSET /INITIALIZE MAPPING (BELOW) BSW CLL RTL /(0 OR 20: DEVICE A OR B) TAD BASE DCA MAP TAD RLB /ADDR OF ARGS JMS I GO /SETUP (AC NON-ZERO) /MAP NEXT BLOCK AROUND ANY BAD BLOCKS BELOW IT MAP, TAD /INITIALIZED ABOVE SNA /0 TERMINATES LIST JMP MAPPED STL CIA /13-BIT NEGATE TAD I ABLOCK /COMPARE WITH BLOCK SZL CLA JMP MAPPED /BAD BLOCK IS ABOVE CURRENT BLOCK ISZ MAP /TRY NEXT BAD BLOCK ALSO NEXT, ISZ I ABLOCK /INCREMENT CURRENT BLOCK NUMBER, /EITHER DURING /BAD BLOCK MAPPING OR AFTER SUCCESSFUL TRANSFER /OF TWO SECTORS (PAGES) WITH MORE TO GO JMP MAP /CONTINUE MAPPING JMP I AERROR /ERROR ON BLOCK OVERFLOW ZBLOCK 240+DRIVE-. /UNUSED /ENTRY POINT FOR DEVICE B RLB, VERSION AC0004 /TRACK OFFSET WILL BE 400 JMP START /SKIP AROUND RLA ENTRY POINT OFFSET, 0 /TRACK OFFSET FOR DEVICE (0 OR 400) /ENTRY POINT FOR DEVICE A RLA, VERSION A7600, 7600 /=CLA TAD RLA /TRANSFER CALLING ADDR DCA RLB START, BSW /SET OFFSET TO 0 IF DEV A, 400 IF DEV B DCA OFFSET TAD A7600 /RETURN TO KEYBOARD MONITOR KRS /IF CTRL,C TYPED TAD A175 /-CTRL,C SNA CLA KSF ONCE, JMP ONLY /THIS INSTRUCTION IS DONE ONCE ONLY. IT IS /THEN CHANGED TO "JMP SET" AFTER HANDLER RELOCATION /IS DONE AND THE BAD BLOCK LIST IS READ IN. ACDIF, CIF CDF 00 JMP I A7600 /CALL KB MONITOR /THIS LOC IS SET TO ADDR OF NEXT PAGE BY ONCE-ONLY CODE GO, 0 /ADDR OF MAIN /-----BOUNDARY OF BAD BLOCK LIST----- BBL, /ONCE-ONLY CODE, REPLACED BY BAD BLOCK LIST /READ IN BAD BLOCK LIST (BBL) /SAVE CALLING DATA FIELD RDF TAD OOCDF DCA BACK OOCDF, CDF 00 /SET TO CURRENT FIELD /REPLACE ONCE-ONLY JUMP INSTRUCTION TAD JMPSET DCA ONCE LOOP, TAD LIST /RELOCATE CROSS-PAGE REFERENCES; /SCAN "LIST" FOR RELATIVE LOCATIONS /OF VALUES TO BE RELOCATED SNA /0 ACTS AS TERMINATOR JMP OUT TAD GO /RELOCATE RELATIVE ADDRESS DCA ONLY /"ONLY" IS NOW TEMP STORAGE ISZ LOOP /NEXT VALUE TAD GO TAD I ONLY /RELOCATE THE CONTENTS DCA I ONLY JMP LOOP /CONTINUE UNTIL DONE /LIST OF RELATIVE ADDRESSES OF RELATIVE VALUES LIST, BARG-MAIN ABLOCK-MAIN BBBL-MAIN AMA-MAIN ASECT-MAIN ATRACK-MAIN MA-MAIN AERROR-MAIN 0 /TERMINATOR ZBLOCK BBL+40-. /UNUSED (IN BBL BUFFER) /ONCE-ONLY CODE CONTINUES OUT, JMS I GO /READ BAD BLOCK LIST /-----BOUNDARY OF BAD BLOCK LIST----- OK, CLA /ERROR RETURN (IGNORE) BACK, CDF /RESTORE CALLING FIELD JMPSET, JMP SET /SETUP FOR TRANSFER /END OF ONCE-ONLY CODE /SETUP ARGS FOR CALL TO 2ND PAGE SUBROUTINE /CALCULATE TRACK AND SECTOR FROM BLOCK MAPPED, TAD I ABLOCK RTR RTR AND A377 TAD OFFSET /DEVICE OFFSET (0 OR 400) DCA I ATRACK TAD I ABLOCK /CALCULATE SECTOR FROM BLOCK AND A17 /SECTOR CODE CLL RTL TAD A7751 SPA TAD A47 BSW DCA I ASECT /TRANSFER 1ST PAGE OF BLOCK JMS I GO TAD A200 /INCREMENT MA TAD I AMA DCA I AMA /INCREMENT SECTOR TAD A200 TAD I ASECT DCA I ASECT /TRANSFER 2ND PAGE OF BLOCK JMS I GO TAD A200 /INCREMENT MA TAD I AMA DCA I AMA /CONTINUE WITH NEXT BLOCK JMP NEXT /ONCE-ONLY CODE AT END OF PAGE ZBLOCK 377-. /UNUSED ONLY, JMS GO /EXECUTED ONCE ONLY; STORES ADDR OF /2ND PAGE IN LOC "GO" *400 /2ND PAGE OF HANDLER /SUBROUTINE TO SETUP AND TRANSFER /AC=0 FOR TRANSFER ELSE SETUP MAIN, 0 SNA JMP TRANS /GET HANDLER ARGUMENTS SETUP, DCA BARG /ADDR OF HANDLER ARGS AC2000 /SET "OLDTRK" TO INVALID TRACK DCA OLDTRK /TO FORCE READING NEXT HEADER. TAD B7600 /SET FOR FULL PAGE TRANSFERS DCA WC /(WAS SMALLER FOR BBL READ) TAD I BARG /NOW GET HANDLER ARGUMENTS /FUNCTION WORD /NOTE: THE FOLLOWING INSTRUCTION IS USED AS A CONSTANT B377, AND B4070 /CONVERT TO RLCB FORMAT SPA TAD B3777 TAD BRLRD DCA FNC TAD I BARG /FUNCTION WORD RAL /CONVERT TO PAGE COUNT IN BITS [7600] AND B7600 DCA PAGES ISZ BARG TAD I BARG /MA DCA MA ISZ BARG TAD I BARG /BLOCK DCA BLOCK ISZ BARG /SAVE CALLING FIELD FOR RETURN RDF TAD BCDIF DCA BRTN /RESET DATA FIELD AND RETURN FROM SETUP WITH AC=BLOCK BCDIF, CIF CDF 00 /GET DEVICE OFFSET FROM 1ST PAGE TAD I BBBL /CHECK FOR BBL VALIDITY - TAD CHECK /1ST LOC OF BBL CONTAINS AN SZA CLA /IDENTIFICATION CODE ("ID") JMP ERROR /TAKE ERROR RETURN FROM HANDLER /IF BBL IS INVALID. JMP I MAIN /TRANSFER ONE OR MORE PAGES TO/FROM DISK /GET INTERPAGE ARGUMENTS /RESET RETRY COUNT FOR 2 RETRIES ON I/O ERRORS TRANS, AC7775 /AC=-3 DCA ERRCNT /CALCULATE CYLINDER AND SURFACE FROM TRACK TAD TRACK CLL RAR DCA CYL RTR DCA SURF /COMPARE WITH OLD (PREVIOUS) TRACK; IF SAME, DO TRANSFER JMS TRKCMP /IF REQUESTED TRACK IS DIFFERENT, SEEK TO TRACK /RESET DRIVE (FUNCTION=1) RETRY, RLDC /CLEAR CONTROLLER, AC /SEEK (FUNCTION=3) WHEN CALLED FROM BELOW SEEK, IAC /AC=(1 OR 3) JMS IO /RESET DRIVE OR SEEK /READ NEXT HEADER TO FIND OUT ACTUAL CURRENT TRACK TAD HEADER JMS IO /READ NEXT HEADER RRSI /GET HEADER BYTE #1 BSW AND B3 DCA OLDTRK /SAVE 2 LSB RRSI /GET HEADER BYTE #2 AND B377 /HARDWARE SHOULD DO THIS CLL RTL TAD OLDTRK /ADD IN MSB DCA OLDTRK /COMPARE WITH OLD (PREVIOUS) TRACK; IF SAME, DO TRANSFER JMS TRKCMP /IF REQUESTED TRACK IS DIFFERENT, SEEK TO TRACK /CALCULATE DIFFERENCE WORD FOR SEEK FROM TRACK DIFFERENCE SPA /IF POSITIVE, LINK WILL BE SET CLL CIA /IF NEGATIVE, CLEAR LINK RAR /DELETE SURFACE, INCLUDE DIRECTION TAD SURF /ADD SURFACE RLCA /LOAD DIFFERENCE WORD AC0002 /PREPARE FOR SEEK /LOOP BACK AND PERFORM SEEK; THIS ENSURES THAT THE TRACK /REACHED IS THE CORRECT ONE IN SPITE OF POSSIBLE RL01 /SEEK UNRELIABILITY JMP SEEK /SUBROUTINE TO COMPARE REQUESTED TRACK WITH OLD (REMEMBERED) /TRACK; IF SAME, DO TRANSFER. IF DIFFERENT, RETURN WITH AC= /REQUESTED-OLD, AND LINK=1 TRKCMP, 0 TAD OLDTRK /CALCULATE DIFFERENCE CIA TAD TRACK STL /LINK MUST BE SET WHEN /DIFFERENCE IS POSITIVE. SZA JMP I TRKCMP /DIFFERENT; RETURN /ON TRACK: DO TRANSFER /LOAD ALL REGISTERS TAD SECTOR RLSA TAD WC RLWC TAD SURF TAD CYL RLCA TAD MA RLMA /DO THE READ OR WRITE TAD FNC JMS IO /COUNT REQUESTED NUMBER OF PAGES TAD B7600 TAD PAGES SNA JMP DONE DCA PAGES JMP I MAIN /RETURN FOR MORE /SUBROUTINE TO DO THE ACTUAL I/O IO, 0 /AC=MODE,FIELD,FUNCTION TAD BDRIVE RLCB /DO THE OPERATION RLSD /WAIT UNTIL DONE JMP .-1 RLSE /TEST FOR I/O ERROR(S) JMP I IO /NONE; RETURN /IF ERROR, RETRY TWICE ISZ ERRCNT /MORE RETRIES LEFT? JMP RETRY /YES /AFTER THREE TRIES, TAKE HANDLER ERROR RETURN /WITH AC=4000 ERROR, AC4000 SKP /NORMAL RETURN FROM HANDLER DONE, ISZ BARG /SKIP ERROR RETURN BRTN, CIF CDF 00 /RETURN TO CALLING FIELD /BBL READ: NOP (FIELD 0) JMP I BARG /RETURN TO CALLING PROGRAM /DATA BLOCK, 0 TRACK, 0 /BBL READ: TRACK 0 WC, -41 /BBL READ: -BBL LENGTH SECTOR, 1400 /BBL READ: SECTOR 14 CYL, 0 SURF, 0 ERRCNT, 0 /COUNT OF RETRIES OLDTRK, 2000 /FORCE INITIAL SEEK PAGES, 200 /BBL READ: ONE PAGE FNC, RLRD /BBL READ: READ FUNCTION /RELOCATED RELATIVE ADDRESSES BARG, OK-MAIN /BBL READ: RETURN FROM READ /ADDRESS OF HANDLER ARGUMENTS MA, BBL-MAIN /BBL READ: ADDR OF BBL BBBL, BBL-MAIN B3, 3 B3777, 3777 B7600, 7600 BRLRD, RLRD HEADER, BYTE RLRH BDRIVE, DRIVE^100 /DRIVE BITS FOR RLCB CHECK, -ID /THIS CONSTANT MUST BE AT END OF PAGE ZBLOCK 577-. B4070, 4070 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 | /RL1: RL01 DRIVE 1 NON-SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /RL01 DRIVE 1 NON-SYSTEM HANDLER VERSION="A&77 /NOTES: /1. PRE-OMNIBUS COMPUTERS NOT SUPPORTED. /EDIT HISTORY: /13-OCT-77 DAVID SPECTOR: CREATION /INSTRUCTIONS THAT GENERATE CONSTANTS AC0001=CLA IAC AC0002=CLA CLL CML RTL AC0003=CLA CLL CML IAC RAL /* AC0004=CLA CLL IAC RTL /* AC0006=CLA CLL CML IAC RTL /* AC0100=CLA IAC BSW /* AC2000=CLA CLL CML RTR AC3777=CLA CLL CMA RAR AC4000=CLA CLL CML RAR AC5777=CLA CLL CMA RTR AC6000=CLA CLL CML IAC RTR /* AC7775=CLA CLL CMA RTL AC7776=CLA CLL CMA RAL /* USE ONLY ON VT-78 AND PDP-8E,F,M,A /ID CODE AT START OF BAD BLOCK LIST (BBL) ID=123 /BAD BLOCK LIST FORMAT: /WORD CONTENTS /0 ID (IDENTIFICATION CODE) /1 BAD BLOCKS FOR DEVICE A (ASCENDING ORDER) /... ... /20 0 (TERMINATOR FOR LIST A) /21 BAD BLOCKS FOR DEVICE B (ASCENDING ORDER) /... ... /40 0 (TERMINATOR FOR LIST B) /RL01 DEFINITIONS RLIOT=6600 RLDC=RLIOT 0 /CLEAR DEVICE RLSD=RLIOT 1 /SKIP IF DONE RLMA=RLIOT 2 /LOAD MEM ADDR RLCA=RLIOT 3 /LOAD REGISTER "A" RLCB=RLIOT 4 /LOAD REG "B" AND EXECUTE RLSA=RLIOT 5 /LOAD SECTOR ADDR /RLIOT 6 UNUSED RLWC=RLIOT 7 /LOAD WORD COUNT RRER=RLIOT 10 /READ ERROR REG RRWC=RLIOT 11 /READ WORD COUNT RRCA=RLIOT 12 /READ REG "A" RRCB=RLIOT 13 /READ REG "B" RRSA=RLIOT 14 /READ SECTOR ADDR RRSI=RLIOT 15 /READ SILO BYTE /RLIOT 16 UNUSED RLSE=RLIOT 17 /SKIP IF ERROR /RLCB FUNCTION BITS: RLMT=0 /MAINTENANCE MODE RLRE=1 /RESET DRIVE ERRORS RLST=2 /READ STATUS REGS INTO SILO RLSK=3 /SEEK RLRH=4 /READ HEADER RLWR=5 /WRITE RLRD=6 /READ RLRN=7 /READ WITH NO HEADER CHECK /BIT DEFINITIONS IN REGISTERS: BYTE=1000 /BYTE TRANSFER MODE /HEADER BLOCK FOR USE BY "BUILD" *0 -2 /- NR DEVICES PER HANDLER /FORMAT OF ENTRIES IN HEADER BLOCK: /WORD DESCRIPTION /0 GROUP NAME (4 CHAR) /2 DEVICE NAME (4 CHAR) /4 DCB WORD FOR AN RL (TYPE 26) DIRECTORY DEVICE /5 OFFSET TO ENTRY POINT, 2-PAGE INDICATOR /6 0 (UNUSED WORD) /7 0 TO REPRESENT NON-SYSTEM DEVICE DRIVE=1 DEVICE RL1;DEVICE RL1A;4260;RLA&177+4000;0;0 DEVICE RL1;DEVICE RL1B;4260;RLB&177+4000;0;0 /HANDLER CODE *200 /FIRST PAGE /DATA A17, 17 A47, 47 A175, 175 A200, 200 A377, 377 A7751, 7751 BASE, TAD BBL+1 ABLOCK, BLOCK-MAIN AMA, MA-MAIN /RELATIVE ADDR OF MA ASECT, SECTOR-MAIN ATRACK, TRACK-MAIN AERROR, ERROR-MAIN /SET UP ARGUMENTS BY CALLING 2ND PAGE SUBROUTINE SET, TAD OFFSET /INITIALIZE MAPPING (BELOW) BSW CLL RTL /(0 OR 20: DEVICE A OR B) TAD BASE DCA MAP TAD RLB /ADDR OF ARGS JMS I GO /SETUP (AC NON-ZERO) /MAP NEXT BLOCK AROUND ANY BAD BLOCKS BELOW IT MAP, TAD /INITIALIZED ABOVE SNA /0 TERMINATES LIST JMP MAPPED STL CIA /13-BIT NEGATE TAD I ABLOCK /COMPARE WITH BLOCK SZL CLA JMP MAPPED /BAD BLOCK IS ABOVE CURRENT BLOCK ISZ MAP /TRY NEXT BAD BLOCK ALSO NEXT, ISZ I ABLOCK /INCREMENT CURRENT BLOCK NUMBER, /EITHER DURING /BAD BLOCK MAPPING OR AFTER SUCCESSFUL TRANSFER /OF TWO SECTORS (PAGES) WITH MORE TO GO JMP MAP /CONTINUE MAPPING JMP I AERROR /ERROR ON BLOCK OVERFLOW ZBLOCK 240+DRIVE-. /UNUSED /ENTRY POINT FOR DEVICE B RLB, VERSION AC0004 /TRACK OFFSET WILL BE 400 JMP START /SKIP AROUND RLA ENTRY POINT OFFSET, 0 /TRACK OFFSET FOR DEVICE (0 OR 400) /ENTRY POINT FOR DEVICE A RLA, VERSION A7600, 7600 /=CLA TAD RLA /TRANSFER CALLING ADDR DCA RLB START, BSW /SET OFFSET TO 0 IF DEV A, 400 IF DEV B DCA OFFSET TAD A7600 /RETURN TO KEYBOARD MONITOR KRS /IF CTRL,C TYPED TAD A175 /-CTRL,C SNA CLA KSF ONCE, JMP ONLY /THIS INSTRUCTION IS DONE ONCE ONLY. IT IS /THEN CHANGED TO "JMP SET" AFTER HANDLER RELOCATION /IS DONE AND THE BAD BLOCK LIST IS READ IN. ACDIF, CIF CDF 00 JMP I A7600 /CALL KB MONITOR /THIS LOC IS SET TO ADDR OF NEXT PAGE BY ONCE-ONLY CODE GO, 0 /ADDR OF MAIN /-----BOUNDARY OF BAD BLOCK LIST----- BBL, /ONCE-ONLY CODE, REPLACED BY BAD BLOCK LIST /READ IN BAD BLOCK LIST (BBL) /SAVE CALLING DATA FIELD RDF TAD OOCDF DCA BACK OOCDF, CDF 00 /SET TO CURRENT FIELD /REPLACE ONCE-ONLY JUMP INSTRUCTION TAD JMPSET DCA ONCE LOOP, TAD LIST /RELOCATE CROSS-PAGE REFERENCES; /SCAN "LIST" FOR RELATIVE LOCATIONS /OF VALUES TO BE RELOCATED SNA /0 ACTS AS TERMINATOR JMP OUT TAD GO /RELOCATE RELATIVE ADDRESS DCA ONLY /"ONLY" IS NOW TEMP STORAGE ISZ LOOP /NEXT VALUE TAD GO TAD I ONLY /RELOCATE THE CONTENTS DCA I ONLY JMP LOOP /CONTINUE UNTIL DONE /LIST OF RELATIVE ADDRESSES OF RELATIVE VALUES LIST, BARG-MAIN ABLOCK-MAIN BBBL-MAIN AMA-MAIN ASECT-MAIN ATRACK-MAIN MA-MAIN AERROR-MAIN 0 /TERMINATOR ZBLOCK BBL+40-. /UNUSED (IN BBL BUFFER) /ONCE-ONLY CODE CONTINUES OUT, JMS I GO /READ BAD BLOCK LIST /-----BOUNDARY OF BAD BLOCK LIST----- OK, CLA /ERROR RETURN (IGNORE) BACK, CDF /RESTORE CALLING FIELD JMPSET, JMP SET /SETUP FOR TRANSFER /END OF ONCE-ONLY CODE /SETUP ARGS FOR CALL TO 2ND PAGE SUBROUTINE /CALCULATE TRACK AND SECTOR FROM BLOCK MAPPED, TAD I ABLOCK RTR RTR AND A377 TAD OFFSET /DEVICE OFFSET (0 OR 400) DCA I ATRACK TAD I ABLOCK /CALCULATE SECTOR FROM BLOCK AND A17 /SECTOR CODE CLL RTL TAD A7751 SPA TAD A47 BSW DCA I ASECT /TRANSFER 1ST PAGE OF BLOCK JMS I GO TAD A200 /INCREMENT MA TAD I AMA DCA I AMA /INCREMENT SECTOR TAD A200 TAD I ASECT DCA I ASECT /TRANSFER 2ND PAGE OF BLOCK JMS I GO TAD A200 /INCREMENT MA TAD I AMA DCA I AMA /CONTINUE WITH NEXT BLOCK JMP NEXT /ONCE-ONLY CODE AT END OF PAGE ZBLOCK 377-. /UNUSED ONLY, JMS GO /EXECUTED ONCE ONLY; STORES ADDR OF /2ND PAGE IN LOC "GO" *400 /2ND PAGE OF HANDLER /SUBROUTINE TO SETUP AND TRANSFER /AC=0 FOR TRANSFER ELSE SETUP MAIN, 0 SNA JMP TRANS /GET HANDLER ARGUMENTS SETUP, DCA BARG /ADDR OF HANDLER ARGS AC2000 /SET "OLDTRK" TO INVALID TRACK DCA OLDTRK /TO FORCE READING NEXT HEADER. TAD B7600 /SET FOR FULL PAGE TRANSFERS DCA WC /(WAS SMALLER FOR BBL READ) TAD I BARG /NOW GET HANDLER ARGUMENTS /FUNCTION WORD /NOTE: THE FOLLOWING INSTRUCTION IS USED AS A CONSTANT B377, AND B4070 /CONVERT TO RLCB FORMAT SPA TAD B3777 TAD BRLRD DCA FNC TAD I BARG /FUNCTION WORD RAL /CONVERT TO PAGE COUNT IN BITS [7600] AND B7600 DCA PAGES ISZ BARG TAD I BARG /MA DCA MA ISZ BARG TAD I BARG /BLOCK DCA BLOCK ISZ BARG /SAVE CALLING FIELD FOR RETURN RDF TAD BCDIF DCA BRTN /RESET DATA FIELD AND RETURN FROM SETUP WITH AC=BLOCK BCDIF, CIF CDF 00 /GET DEVICE OFFSET FROM 1ST PAGE TAD I BBBL /CHECK FOR BBL VALIDITY - TAD CHECK /1ST LOC OF BBL CONTAINS AN SZA CLA /IDENTIFICATION CODE ("ID") JMP ERROR /TAKE ERROR RETURN FROM HANDLER /IF BBL IS INVALID. JMP I MAIN /TRANSFER ONE OR MORE PAGES TO/FROM DISK /GET INTERPAGE ARGUMENTS /RESET RETRY COUNT FOR 2 RETRIES ON I/O ERRORS TRANS, AC7775 /AC=-3 DCA ERRCNT /CALCULATE CYLINDER AND SURFACE FROM TRACK TAD TRACK CLL RAR DCA CYL RTR DCA SURF /COMPARE WITH OLD (PREVIOUS) TRACK; IF SAME, DO TRANSFER JMS TRKCMP /IF REQUESTED TRACK IS DIFFERENT, SEEK TO TRACK /RESET DRIVE (FUNCTION=1) RETRY, RLDC /CLEAR CONTROLLER, AC /SEEK (FUNCTION=3) WHEN CALLED FROM BELOW SEEK, IAC /AC=(1 OR 3) JMS IO /RESET DRIVE OR SEEK /READ NEXT HEADER TO FIND OUT ACTUAL CURRENT TRACK TAD HEADER JMS IO /READ NEXT HEADER RRSI /GET HEADER BYTE #1 BSW AND B3 DCA OLDTRK /SAVE 2 LSB RRSI /GET HEADER BYTE #2 AND B377 /HARDWARE SHOULD DO THIS CLL RTL TAD OLDTRK /ADD IN MSB DCA OLDTRK /COMPARE WITH OLD (PREVIOUS) TRACK; IF SAME, DO TRANSFER JMS TRKCMP /IF REQUESTED TRACK IS DIFFERENT, SEEK TO TRACK /CALCULATE DIFFERENCE WORD FOR SEEK FROM TRACK DIFFERENCE SPA /IF POSITIVE, LINK WILL BE SET CLL CIA /IF NEGATIVE, CLEAR LINK RAR /DELETE SURFACE, INCLUDE DIRECTION TAD SURF /ADD SURFACE RLCA /LOAD DIFFERENCE WORD AC0002 /PREPARE FOR SEEK /LOOP BACK AND PERFORM SEEK; THIS ENSURES THAT THE TRACK /REACHED IS THE CORRECT ONE IN SPITE OF POSSIBLE RL01 /SEEK UNRELIABILITY JMP SEEK /SUBROUTINE TO COMPARE REQUESTED TRACK WITH OLD (REMEMBERED) /TRACK; IF SAME, DO TRANSFER. IF DIFFERENT, RETURN WITH AC= /REQUESTED-OLD, AND LINK=1 TRKCMP, 0 TAD OLDTRK /CALCULATE DIFFERENCE CIA TAD TRACK STL /LINK MUST BE SET WHEN /DIFFERENCE IS POSITIVE. SZA JMP I TRKCMP /DIFFERENT; RETURN /ON TRACK: DO TRANSFER /LOAD ALL REGISTERS TAD SECTOR RLSA TAD WC RLWC TAD SURF TAD CYL RLCA TAD MA RLMA /DO THE READ OR WRITE TAD FNC JMS IO /COUNT REQUESTED NUMBER OF PAGES TAD B7600 TAD PAGES SNA JMP DONE DCA PAGES JMP I MAIN /RETURN FOR MORE /SUBROUTINE TO DO THE ACTUAL I/O IO, 0 /AC=MODE,FIELD,FUNCTION TAD BDRIVE RLCB /DO THE OPERATION RLSD /WAIT UNTIL DONE JMP .-1 RLSE /TEST FOR I/O ERROR(S) JMP I IO /NONE; RETURN /IF ERROR, RETRY TWICE ISZ ERRCNT /MORE RETRIES LEFT? JMP RETRY /YES /AFTER THREE TRIES, TAKE HANDLER ERROR RETURN /WITH AC=4000 ERROR, AC4000 SKP /NORMAL RETURN FROM HANDLER DONE, ISZ BARG /SKIP ERROR RETURN BRTN, CIF CDF 00 /RETURN TO CALLING FIELD /BBL READ: NOP (FIELD 0) JMP I BARG /RETURN TO CALLING PROGRAM /DATA BLOCK, 0 TRACK, 0 /BBL READ: TRACK 0 WC, -41 /BBL READ: -BBL LENGTH SECTOR, 1400 /BBL READ: SECTOR 14 CYL, 0 SURF, 0 ERRCNT, 0 /COUNT OF RETRIES OLDTRK, 2000 /FORCE INITIAL SEEK PAGES, 200 /BBL READ: ONE PAGE FNC, RLRD /BBL READ: READ FUNCTION /RELOCATED RELATIVE ADDRESSES BARG, OK-MAIN /BBL READ: RETURN FROM READ /ADDRESS OF HANDLER ARGUMENTS MA, BBL-MAIN /BBL READ: ADDR OF BBL BBBL, BBL-MAIN B3, 3 B3777, 3777 B7600, 7600 BRLRD, RLRD HEADER, BYTE RLRH BDRIVE, DRIVE^100 /DRIVE BITS FOR RLCB CHECK, -ID /THIS CONSTANT MUST BE AT END OF PAGE ZBLOCK 577-. B4070, 4070 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 | /RL2: RL01 DRIVE 2 NON-SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /RL01 DRIVE 2 NON-SYSTEM HANDLER VERSION="A&77 /NOTES: /1. PRE-OMNIBUS COMPUTERS NOT SUPPORTED. /EDIT HISTORY: /13-OCT-77 DAVID SPECTOR: CREATION /INSTRUCTIONS THAT GENERATE CONSTANTS AC0001=CLA IAC AC0002=CLA CLL CML RTL AC0003=CLA CLL CML IAC RAL /* AC0004=CLA CLL IAC RTL /* AC0006=CLA CLL CML IAC RTL /* AC0100=CLA IAC BSW /* AC2000=CLA CLL CML RTR AC3777=CLA CLL CMA RAR AC4000=CLA CLL CML RAR AC5777=CLA CLL CMA RTR AC6000=CLA CLL CML IAC RTR /* AC7775=CLA CLL CMA RTL AC7776=CLA CLL CMA RAL /* USE ONLY ON VT-78 AND PDP-8E,F,M,A /ID CODE AT START OF BAD BLOCK LIST (BBL) ID=123 /BAD BLOCK LIST FORMAT: /WORD CONTENTS /0 ID (IDENTIFICATION CODE) /1 BAD BLOCKS FOR DEVICE A (ASCENDING ORDER) /... ... /20 0 (TERMINATOR FOR LIST A) /21 BAD BLOCKS FOR DEVICE B (ASCENDING ORDER) /... ... /40 0 (TERMINATOR FOR LIST B) /RL01 DEFINITIONS RLIOT=6600 RLDC=RLIOT 0 /CLEAR DEVICE RLSD=RLIOT 1 /SKIP IF DONE RLMA=RLIOT 2 /LOAD MEM ADDR RLCA=RLIOT 3 /LOAD REGISTER "A" RLCB=RLIOT 4 /LOAD REG "B" AND EXECUTE RLSA=RLIOT 5 /LOAD SECTOR ADDR /RLIOT 6 UNUSED RLWC=RLIOT 7 /LOAD WORD COUNT RRER=RLIOT 10 /READ ERROR REG RRWC=RLIOT 11 /READ WORD COUNT RRCA=RLIOT 12 /READ REG "A" RRCB=RLIOT 13 /READ REG "B" RRSA=RLIOT 14 /READ SECTOR ADDR RRSI=RLIOT 15 /READ SILO BYTE /RLIOT 16 UNUSED RLSE=RLIOT 17 /SKIP IF ERROR /RLCB FUNCTION BITS: RLMT=0 /MAINTENANCE MODE RLRE=1 /RESET DRIVE ERRORS RLST=2 /READ STATUS REGS INTO SILO RLSK=3 /SEEK RLRH=4 /READ HEADER RLWR=5 /WRITE RLRD=6 /READ RLRN=7 /READ WITH NO HEADER CHECK /BIT DEFINITIONS IN REGISTERS: BYTE=1000 /BYTE TRANSFER MODE /HEADER BLOCK FOR USE BY "BUILD" *0 -2 /- NR DEVICES PER HANDLER /FORMAT OF ENTRIES IN HEADER BLOCK: /WORD DESCRIPTION /0 GROUP NAME (4 CHAR) /2 DEVICE NAME (4 CHAR) /4 DCB WORD FOR AN RL (TYPE 26) DIRECTORY DEVICE /5 OFFSET TO ENTRY POINT, 2-PAGE INDICATOR /6 0 (UNUSED WORD) /7 0 TO REPRESENT NON-SYSTEM DEVICE DRIVE=2 DEVICE RL2;DEVICE RL2A;4260;RLA&177+4000;0;0 DEVICE RL2;DEVICE RL2B;4260;RLB&177+4000;0;0 /HANDLER CODE *200 /FIRST PAGE /DATA A17, 17 A47, 47 A175, 175 A200, 200 A377, 377 A7751, 7751 BASE, TAD BBL+1 ABLOCK, BLOCK-MAIN AMA, MA-MAIN /RELATIVE ADDR OF MA ASECT, SECTOR-MAIN ATRACK, TRACK-MAIN AERROR, ERROR-MAIN /SET UP ARGUMENTS BY CALLING 2ND PAGE SUBROUTINE SET, TAD OFFSET /INITIALIZE MAPPING (BELOW) BSW CLL RTL /(0 OR 20: DEVICE A OR B) TAD BASE DCA MAP TAD RLB /ADDR OF ARGS JMS I GO /SETUP (AC NON-ZERO) /MAP NEXT BLOCK AROUND ANY BAD BLOCKS BELOW IT MAP, TAD /INITIALIZED ABOVE SNA /0 TERMINATES LIST JMP MAPPED STL CIA /13-BIT NEGATE TAD I ABLOCK /COMPARE WITH BLOCK SZL CLA JMP MAPPED /BAD BLOCK IS ABOVE CURRENT BLOCK ISZ MAP /TRY NEXT BAD BLOCK ALSO NEXT, ISZ I ABLOCK /INCREMENT CURRENT BLOCK NUMBER, /EITHER DURING /BAD BLOCK MAPPING OR AFTER SUCCESSFUL TRANSFER /OF TWO SECTORS (PAGES) WITH MORE TO GO JMP MAP /CONTINUE MAPPING JMP I AERROR /ERROR ON BLOCK OVERFLOW ZBLOCK 240+DRIVE-. /UNUSED /ENTRY POINT FOR DEVICE B RLB, VERSION AC0004 /TRACK OFFSET WILL BE 400 JMP START /SKIP AROUND RLA ENTRY POINT OFFSET, 0 /TRACK OFFSET FOR DEVICE (0 OR 400) /ENTRY POINT FOR DEVICE A RLA, VERSION A7600, 7600 /=CLA TAD RLA /TRANSFER CALLING ADDR DCA RLB START, BSW /SET OFFSET TO 0 IF DEV A, 400 IF DEV B DCA OFFSET TAD A7600 /RETURN TO KEYBOARD MONITOR KRS /IF CTRL,C TYPED TAD A175 /-CTRL,C SNA CLA KSF ONCE, JMP ONLY /THIS INSTRUCTION IS DONE ONCE ONLY. IT IS /THEN CHANGED TO "JMP SET" AFTER HANDLER RELOCATION /IS DONE AND THE BAD BLOCK LIST IS READ IN. ACDIF, CIF CDF 00 JMP I A7600 /CALL KB MONITOR /THIS LOC IS SET TO ADDR OF NEXT PAGE BY ONCE-ONLY CODE GO, 0 /ADDR OF MAIN /-----BOUNDARY OF BAD BLOCK LIST----- BBL, /ONCE-ONLY CODE, REPLACED BY BAD BLOCK LIST /READ IN BAD BLOCK LIST (BBL) /SAVE CALLING DATA FIELD RDF TAD OOCDF DCA BACK OOCDF, CDF 00 /SET TO CURRENT FIELD /REPLACE ONCE-ONLY JUMP INSTRUCTION TAD JMPSET DCA ONCE LOOP, TAD LIST /RELOCATE CROSS-PAGE REFERENCES; /SCAN "LIST" FOR RELATIVE LOCATIONS /OF VALUES TO BE RELOCATED SNA /0 ACTS AS TERMINATOR JMP OUT TAD GO /RELOCATE RELATIVE ADDRESS DCA ONLY /"ONLY" IS NOW TEMP STORAGE ISZ LOOP /NEXT VALUE TAD GO TAD I ONLY /RELOCATE THE CONTENTS DCA I ONLY JMP LOOP /CONTINUE UNTIL DONE /LIST OF RELATIVE ADDRESSES OF RELATIVE VALUES LIST, BARG-MAIN ABLOCK-MAIN BBBL-MAIN AMA-MAIN ASECT-MAIN ATRACK-MAIN MA-MAIN AERROR-MAIN 0 /TERMINATOR ZBLOCK BBL+40-. /UNUSED (IN BBL BUFFER) /ONCE-ONLY CODE CONTINUES OUT, JMS I GO /READ BAD BLOCK LIST /-----BOUNDARY OF BAD BLOCK LIST----- OK, CLA /ERROR RETURN (IGNORE) BACK, CDF /RESTORE CALLING FIELD JMPSET, JMP SET /SETUP FOR TRANSFER /END OF ONCE-ONLY CODE /SETUP ARGS FOR CALL TO 2ND PAGE SUBROUTINE /CALCULATE TRACK AND SECTOR FROM BLOCK MAPPED, TAD I ABLOCK RTR RTR AND A377 TAD OFFSET /DEVICE OFFSET (0 OR 400) DCA I ATRACK TAD I ABLOCK /CALCULATE SECTOR FROM BLOCK AND A17 /SECTOR CODE CLL RTL TAD A7751 SPA TAD A47 BSW DCA I ASECT /TRANSFER 1ST PAGE OF BLOCK JMS I GO TAD A200 /INCREMENT MA TAD I AMA DCA I AMA /INCREMENT SECTOR TAD A200 TAD I ASECT DCA I ASECT /TRANSFER 2ND PAGE OF BLOCK JMS I GO TAD A200 /INCREMENT MA TAD I AMA DCA I AMA /CONTINUE WITH NEXT BLOCK JMP NEXT /ONCE-ONLY CODE AT END OF PAGE ZBLOCK 377-. /UNUSED ONLY, JMS GO /EXECUTED ONCE ONLY; STORES ADDR OF /2ND PAGE IN LOC "GO" *400 /2ND PAGE OF HANDLER /SUBROUTINE TO SETUP AND TRANSFER /AC=0 FOR TRANSFER ELSE SETUP MAIN, 0 SNA JMP TRANS /GET HANDLER ARGUMENTS SETUP, DCA BARG /ADDR OF HANDLER ARGS AC2000 /SET "OLDTRK" TO INVALID TRACK DCA OLDTRK /TO FORCE READING NEXT HEADER. TAD B7600 /SET FOR FULL PAGE TRANSFERS DCA WC /(WAS SMALLER FOR BBL READ) TAD I BARG /NOW GET HANDLER ARGUMENTS /FUNCTION WORD /NOTE: THE FOLLOWING INSTRUCTION IS USED AS A CONSTANT B377, AND B4070 /CONVERT TO RLCB FORMAT SPA TAD B3777 TAD BRLRD DCA FNC TAD I BARG /FUNCTION WORD RAL /CONVERT TO PAGE COUNT IN BITS [7600] AND B7600 DCA PAGES ISZ BARG TAD I BARG /MA DCA MA ISZ BARG TAD I BARG /BLOCK DCA BLOCK ISZ BARG /SAVE CALLING FIELD FOR RETURN RDF TAD BCDIF DCA BRTN /RESET DATA FIELD AND RETURN FROM SETUP WITH AC=BLOCK BCDIF, CIF CDF 00 /GET DEVICE OFFSET FROM 1ST PAGE TAD I BBBL /CHECK FOR BBL VALIDITY - TAD CHECK /1ST LOC OF BBL CONTAINS AN SZA CLA /IDENTIFICATION CODE ("ID") JMP ERROR /TAKE ERROR RETURN FROM HANDLER /IF BBL IS INVALID. JMP I MAIN /TRANSFER ONE OR MORE PAGES TO/FROM DISK /GET INTERPAGE ARGUMENTS /RESET RETRY COUNT FOR 2 RETRIES ON I/O ERRORS TRANS, AC7775 /AC=-3 DCA ERRCNT /CALCULATE CYLINDER AND SURFACE FROM TRACK TAD TRACK CLL RAR DCA CYL RTR DCA SURF /COMPARE WITH OLD (PREVIOUS) TRACK; IF SAME, DO TRANSFER JMS TRKCMP /IF REQUESTED TRACK IS DIFFERENT, SEEK TO TRACK /RESET DRIVE (FUNCTION=1) RETRY, RLDC /CLEAR CONTROLLER, AC /SEEK (FUNCTION=3) WHEN CALLED FROM BELOW SEEK, IAC /AC=(1 OR 3) JMS IO /RESET DRIVE OR SEEK /READ NEXT HEADER TO FIND OUT ACTUAL CURRENT TRACK TAD HEADER JMS IO /READ NEXT HEADER RRSI /GET HEADER BYTE #1 BSW AND B3 DCA OLDTRK /SAVE 2 LSB RRSI /GET HEADER BYTE #2 AND B377 /HARDWARE SHOULD DO THIS CLL RTL TAD OLDTRK /ADD IN MSB DCA OLDTRK /COMPARE WITH OLD (PREVIOUS) TRACK; IF SAME, DO TRANSFER JMS TRKCMP /IF REQUESTED TRACK IS DIFFERENT, SEEK TO TRACK /CALCULATE DIFFERENCE WORD FOR SEEK FROM TRACK DIFFERENCE SPA /IF POSITIVE, LINK WILL BE SET CLL CIA /IF NEGATIVE, CLEAR LINK RAR /DELETE SURFACE, INCLUDE DIRECTION TAD SURF /ADD SURFACE RLCA /LOAD DIFFERENCE WORD AC0002 /PREPARE FOR SEEK /LOOP BACK AND PERFORM SEEK; THIS ENSURES THAT THE TRACK /REACHED IS THE CORRECT ONE IN SPITE OF POSSIBLE RL01 /SEEK UNRELIABILITY JMP SEEK /SUBROUTINE TO COMPARE REQUESTED TRACK WITH OLD (REMEMBERED) /TRACK; IF SAME, DO TRANSFER. IF DIFFERENT, RETURN WITH AC= /REQUESTED-OLD, AND LINK=1 TRKCMP, 0 TAD OLDTRK /CALCULATE DIFFERENCE CIA TAD TRACK STL /LINK MUST BE SET WHEN /DIFFERENCE IS POSITIVE. SZA JMP I TRKCMP /DIFFERENT; RETURN /ON TRACK: DO TRANSFER /LOAD ALL REGISTERS TAD SECTOR RLSA TAD WC RLWC TAD SURF TAD CYL RLCA TAD MA RLMA /DO THE READ OR WRITE TAD FNC JMS IO /COUNT REQUESTED NUMBER OF PAGES TAD B7600 TAD PAGES SNA JMP DONE DCA PAGES JMP I MAIN /RETURN FOR MORE /SUBROUTINE TO DO THE ACTUAL I/O IO, 0 /AC=MODE,FIELD,FUNCTION TAD BDRIVE RLCB /DO THE OPERATION RLSD /WAIT UNTIL DONE JMP .-1 RLSE /TEST FOR I/O ERROR(S) JMP I IO /NONE; RETURN /IF ERROR, RETRY TWICE ISZ ERRCNT /MORE RETRIES LEFT? JMP RETRY /YES /AFTER THREE TRIES, TAKE HANDLER ERROR RETURN /WITH AC=4000 ERROR, AC4000 SKP /NORMAL RETURN FROM HANDLER DONE, ISZ BARG /SKIP ERROR RETURN BRTN, CIF CDF 00 /RETURN TO CALLING FIELD /BBL READ: NOP (FIELD 0) JMP I BARG /RETURN TO CALLING PROGRAM /DATA BLOCK, 0 TRACK, 0 /BBL READ: TRACK 0 WC, -41 /BBL READ: -BBL LENGTH SECTOR, 1400 /BBL READ: SECTOR 14 CYL, 0 SURF, 0 ERRCNT, 0 /COUNT OF RETRIES OLDTRK, 2000 /FORCE INITIAL SEEK PAGES, 200 /BBL READ: ONE PAGE FNC, RLRD /BBL READ: READ FUNCTION /RELOCATED RELATIVE ADDRESSES BARG, OK-MAIN /BBL READ: RETURN FROM READ /ADDRESS OF HANDLER ARGUMENTS MA, BBL-MAIN /BBL READ: ADDR OF BBL BBBL, BBL-MAIN B3, 3 B3777, 3777 B7600, 7600 BRLRD, RLRD HEADER, BYTE RLRH BDRIVE, DRIVE^100 /DRIVE BITS FOR RLCB CHECK, -ID /THIS CONSTANT MUST BE AT END OF PAGE ZBLOCK 577-. B4070, 4070 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 | /RL3: RL01 DRIVE 3 NON-SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /RL01 DRIVE 3 NON-SYSTEM HANDLER VERSION="A&77 /NOTES: /1. PRE-OMNIBUS COMPUTERS NOT SUPPORTED. /EDIT HISTORY: /13-OCT-77 DAVID SPECTOR: CREATION /INSTRUCTIONS THAT GENERATE CONSTANTS AC0001=CLA IAC AC0002=CLA CLL CML RTL AC0003=CLA CLL CML IAC RAL /* AC0004=CLA CLL IAC RTL /* AC0006=CLA CLL CML IAC RTL /* AC0100=CLA IAC BSW /* AC2000=CLA CLL CML RTR AC3777=CLA CLL CMA RAR AC4000=CLA CLL CML RAR AC5777=CLA CLL CMA RTR AC6000=CLA CLL CML IAC RTR /* AC7775=CLA CLL CMA RTL AC7776=CLA CLL CMA RAL /* USE ONLY ON VT-78 AND PDP-8E,F,M,A /ID CODE AT START OF BAD BLOCK LIST (BBL) ID=123 /BAD BLOCK LIST FORMAT: /WORD CONTENTS /0 ID (IDENTIFICATION CODE) /1 BAD BLOCKS FOR DEVICE A (ASCENDING ORDER) /... ... /20 0 (TERMINATOR FOR LIST A) /21 BAD BLOCKS FOR DEVICE B (ASCENDING ORDER) /... ... /40 0 (TERMINATOR FOR LIST B) /RL01 DEFINITIONS RLIOT=6600 RLDC=RLIOT 0 /CLEAR DEVICE RLSD=RLIOT 1 /SKIP IF DONE RLMA=RLIOT 2 /LOAD MEM ADDR RLCA=RLIOT 3 /LOAD REGISTER "A" RLCB=RLIOT 4 /LOAD REG "B" AND EXECUTE RLSA=RLIOT 5 /LOAD SECTOR ADDR /RLIOT 6 UNUSED RLWC=RLIOT 7 /LOAD WORD COUNT RRER=RLIOT 10 /READ ERROR REG RRWC=RLIOT 11 /READ WORD COUNT RRCA=RLIOT 12 /READ REG "A" RRCB=RLIOT 13 /READ REG "B" RRSA=RLIOT 14 /READ SECTOR ADDR RRSI=RLIOT 15 /READ SILO BYTE /RLIOT 16 UNUSED RLSE=RLIOT 17 /SKIP IF ERROR /RLCB FUNCTION BITS: RLMT=0 /MAINTENANCE MODE RLRE=1 /RESET DRIVE ERRORS RLST=2 /READ STATUS REGS INTO SILO RLSK=3 /SEEK RLRH=4 /READ HEADER RLWR=5 /WRITE RLRD=6 /READ RLRN=7 /READ WITH NO HEADER CHECK /BIT DEFINITIONS IN REGISTERS: BYTE=1000 /BYTE TRANSFER MODE /HEADER BLOCK FOR USE BY "BUILD" *0 -2 /- NR DEVICES PER HANDLER /FORMAT OF ENTRIES IN HEADER BLOCK: /WORD DESCRIPTION /0 GROUP NAME (4 CHAR) /2 DEVICE NAME (4 CHAR) /4 DCB WORD FOR AN RL (TYPE 26) DIRECTORY DEVICE /5 OFFSET TO ENTRY POINT, 2-PAGE INDICATOR /6 0 (UNUSED WORD) /7 0 TO REPRESENT NON-SYSTEM DEVICE DRIVE=3 DEVICE RL3;DEVICE RL3A;4260;RLA&177+4000;0;0 DEVICE RL3;DEVICE RL3B;4260;RLB&177+4000;0;0 /HANDLER CODE *200 /FIRST PAGE /DATA A17, 17 A47, 47 A175, 175 A200, 200 A377, 377 A7751, 7751 BASE, TAD BBL+1 ABLOCK, BLOCK-MAIN AMA, MA-MAIN /RELATIVE ADDR OF MA ASECT, SECTOR-MAIN ATRACK, TRACK-MAIN AERROR, ERROR-MAIN /SET UP ARGUMENTS BY CALLING 2ND PAGE SUBROUTINE SET, TAD OFFSET /INITIALIZE MAPPING (BELOW) BSW CLL RTL /(0 OR 20: DEVICE A OR B) TAD BASE DCA MAP TAD RLB /ADDR OF ARGS JMS I GO /SETUP (AC NON-ZERO) /MAP NEXT BLOCK AROUND ANY BAD BLOCKS BELOW IT MAP, TAD /INITIALIZED ABOVE SNA /0 TERMINATES LIST JMP MAPPED STL CIA /13-BIT NEGATE TAD I ABLOCK /COMPARE WITH BLOCK SZL CLA JMP MAPPED /BAD BLOCK IS ABOVE CURRENT BLOCK ISZ MAP /TRY NEXT BAD BLOCK ALSO NEXT, ISZ I ABLOCK /INCREMENT CURRENT BLOCK NUMBER, /EITHER DURING /BAD BLOCK MAPPING OR AFTER SUCCESSFUL TRANSFER /OF TWO SECTORS (PAGES) WITH MORE TO GO JMP MAP /CONTINUE MAPPING JMP I AERROR /ERROR ON BLOCK OVERFLOW ZBLOCK 240+DRIVE-. /UNUSED /ENTRY POINT FOR DEVICE B RLB, VERSION AC0004 /TRACK OFFSET WILL BE 400 JMP START /SKIP AROUND RLA ENTRY POINT OFFSET, 0 /TRACK OFFSET FOR DEVICE (0 OR 400) /ENTRY POINT FOR DEVICE A RLA, VERSION A7600, 7600 /=CLA TAD RLA /TRANSFER CALLING ADDR DCA RLB START, BSW /SET OFFSET TO 0 IF DEV A, 400 IF DEV B DCA OFFSET TAD A7600 /RETURN TO KEYBOARD MONITOR KRS /IF CTRL,C TYPED TAD A175 /-CTRL,C SNA CLA KSF ONCE, JMP ONLY /THIS INSTRUCTION IS DONE ONCE ONLY. IT IS /THEN CHANGED TO "JMP SET" AFTER HANDLER RELOCATION /IS DONE AND THE BAD BLOCK LIST IS READ IN. ACDIF, CIF CDF 00 JMP I A7600 /CALL KB MONITOR /THIS LOC IS SET TO ADDR OF NEXT PAGE BY ONCE-ONLY CODE GO, 0 /ADDR OF MAIN /-----BOUNDARY OF BAD BLOCK LIST----- BBL, /ONCE-ONLY CODE, REPLACED BY BAD BLOCK LIST /READ IN BAD BLOCK LIST (BBL) /SAVE CALLING DATA FIELD RDF TAD OOCDF DCA BACK OOCDF, CDF 00 /SET TO CURRENT FIELD /REPLACE ONCE-ONLY JUMP INSTRUCTION TAD JMPSET DCA ONCE LOOP, TAD LIST /RELOCATE CROSS-PAGE REFERENCES; /SCAN "LIST" FOR RELATIVE LOCATIONS /OF VALUES TO BE RELOCATED SNA /0 ACTS AS TERMINATOR JMP OUT TAD GO /RELOCATE RELATIVE ADDRESS DCA ONLY /"ONLY" IS NOW TEMP STORAGE ISZ LOOP /NEXT VALUE TAD GO TAD I ONLY /RELOCATE THE CONTENTS DCA I ONLY JMP LOOP /CONTINUE UNTIL DONE /LIST OF RELATIVE ADDRESSES OF RELATIVE VALUES LIST, BARG-MAIN ABLOCK-MAIN BBBL-MAIN AMA-MAIN ASECT-MAIN ATRACK-MAIN MA-MAIN AERROR-MAIN 0 /TERMINATOR ZBLOCK BBL+40-. /UNUSED (IN BBL BUFFER) /ONCE-ONLY CODE CONTINUES OUT, JMS I GO /READ BAD BLOCK LIST /-----BOUNDARY OF BAD BLOCK LIST----- OK, CLA /ERROR RETURN (IGNORE) BACK, CDF /RESTORE CALLING FIELD JMPSET, JMP SET /SETUP FOR TRANSFER /END OF ONCE-ONLY CODE /SETUP ARGS FOR CALL TO 2ND PAGE SUBROUTINE /CALCULATE TRACK AND SECTOR FROM BLOCK MAPPED, TAD I ABLOCK RTR RTR AND A377 TAD OFFSET /DEVICE OFFSET (0 OR 400) DCA I ATRACK TAD I ABLOCK /CALCULATE SECTOR FROM BLOCK AND A17 /SECTOR CODE CLL RTL TAD A7751 SPA TAD A47 BSW DCA I ASECT /TRANSFER 1ST PAGE OF BLOCK JMS I GO TAD A200 /INCREMENT MA TAD I AMA DCA I AMA /INCREMENT SECTOR TAD A200 TAD I ASECT DCA I ASECT /TRANSFER 2ND PAGE OF BLOCK JMS I GO TAD A200 /INCREMENT MA TAD I AMA DCA I AMA /CONTINUE WITH NEXT BLOCK JMP NEXT /ONCE-ONLY CODE AT END OF PAGE ZBLOCK 377-. /UNUSED ONLY, JMS GO /EXECUTED ONCE ONLY; STORES ADDR OF /2ND PAGE IN LOC "GO" *400 /2ND PAGE OF HANDLER /SUBROUTINE TO SETUP AND TRANSFER /AC=0 FOR TRANSFER ELSE SETUP MAIN, 0 SNA JMP TRANS /GET HANDLER ARGUMENTS SETUP, DCA BARG /ADDR OF HANDLER ARGS AC2000 /SET "OLDTRK" TO INVALID TRACK DCA OLDTRK /TO FORCE READING NEXT HEADER. TAD B7600 /SET FOR FULL PAGE TRANSFERS DCA WC /(WAS SMALLER FOR BBL READ) TAD I BARG /NOW GET HANDLER ARGUMENTS /FUNCTION WORD /NOTE: THE FOLLOWING INSTRUCTION IS USED AS A CONSTANT B377, AND B4070 /CONVERT TO RLCB FORMAT SPA TAD B3777 TAD BRLRD DCA FNC TAD I BARG /FUNCTION WORD RAL /CONVERT TO PAGE COUNT IN BITS [7600] AND B7600 DCA PAGES ISZ BARG TAD I BARG /MA DCA MA ISZ BARG TAD I BARG /BLOCK DCA BLOCK ISZ BARG /SAVE CALLING FIELD FOR RETURN RDF TAD BCDIF DCA BRTN /RESET DATA FIELD AND RETURN FROM SETUP WITH AC=BLOCK BCDIF, CIF CDF 00 /GET DEVICE OFFSET FROM 1ST PAGE TAD I BBBL /CHECK FOR BBL VALIDITY - TAD CHECK /1ST LOC OF BBL CONTAINS AN SZA CLA /IDENTIFICATION CODE ("ID") JMP ERROR /TAKE ERROR RETURN FROM HANDLER /IF BBL IS INVALID. JMP I MAIN /TRANSFER ONE OR MORE PAGES TO/FROM DISK /GET INTERPAGE ARGUMENTS /RESET RETRY COUNT FOR 2 RETRIES ON I/O ERRORS TRANS, AC7775 /AC=-3 DCA ERRCNT /CALCULATE CYLINDER AND SURFACE FROM TRACK TAD TRACK CLL RAR DCA CYL RTR DCA SURF /COMPARE WITH OLD (PREVIOUS) TRACK; IF SAME, DO TRANSFER JMS TRKCMP /IF REQUESTED TRACK IS DIFFERENT, SEEK TO TRACK /RESET DRIVE (FUNCTION=1) RETRY, RLDC /CLEAR CONTROLLER, AC /SEEK (FUNCTION=3) WHEN CALLED FROM BELOW SEEK, IAC /AC=(1 OR 3) JMS IO /RESET DRIVE OR SEEK /READ NEXT HEADER TO FIND OUT ACTUAL CURRENT TRACK TAD HEADER JMS IO /READ NEXT HEADER RRSI /GET HEADER BYTE #1 BSW AND B3 DCA OLDTRK /SAVE 2 LSB RRSI /GET HEADER BYTE #2 AND B377 /HARDWARE SHOULD DO THIS CLL RTL TAD OLDTRK /ADD IN MSB DCA OLDTRK /COMPARE WITH OLD (PREVIOUS) TRACK; IF SAME, DO TRANSFER JMS TRKCMP /IF REQUESTED TRACK IS DIFFERENT, SEEK TO TRACK /CALCULATE DIFFERENCE WORD FOR SEEK FROM TRACK DIFFERENCE SPA /IF POSITIVE, LINK WILL BE SET CLL CIA /IF NEGATIVE, CLEAR LINK RAR /DELETE SURFACE, INCLUDE DIRECTION TAD SURF /ADD SURFACE RLCA /LOAD DIFFERENCE WORD AC0002 /PREPARE FOR SEEK /LOOP BACK AND PERFORM SEEK; THIS ENSURES THAT THE TRACK /REACHED IS THE CORRECT ONE IN SPITE OF POSSIBLE RL01 /SEEK UNRELIABILITY JMP SEEK /SUBROUTINE TO COMPARE REQUESTED TRACK WITH OLD (REMEMBERED) /TRACK; IF SAME, DO TRANSFER. IF DIFFERENT, RETURN WITH AC= /REQUESTED-OLD, AND LINK=1 TRKCMP, 0 TAD OLDTRK /CALCULATE DIFFERENCE CIA TAD TRACK STL /LINK MUST BE SET WHEN /DIFFERENCE IS POSITIVE. SZA JMP I TRKCMP /DIFFERENT; RETURN /ON TRACK: DO TRANSFER /LOAD ALL REGISTERS TAD SECTOR RLSA TAD WC RLWC TAD SURF TAD CYL RLCA TAD MA RLMA /DO THE READ OR WRITE TAD FNC JMS IO /COUNT REQUESTED NUMBER OF PAGES TAD B7600 TAD PAGES SNA JMP DONE DCA PAGES JMP I MAIN /RETURN FOR MORE /SUBROUTINE TO DO THE ACTUAL I/O IO, 0 /AC=MODE,FIELD,FUNCTION TAD BDRIVE RLCB /DO THE OPERATION RLSD /WAIT UNTIL DONE JMP .-1 RLSE /TEST FOR I/O ERROR(S) JMP I IO /NONE; RETURN /IF ERROR, RETRY TWICE ISZ ERRCNT /MORE RETRIES LEFT? JMP RETRY /YES /AFTER THREE TRIES, TAKE HANDLER ERROR RETURN /WITH AC=4000 ERROR, AC4000 SKP /NORMAL RETURN FROM HANDLER DONE, ISZ BARG /SKIP ERROR RETURN BRTN, CIF CDF 00 /RETURN TO CALLING FIELD /BBL READ: NOP (FIELD 0) JMP I BARG /RETURN TO CALLING PROGRAM /DATA BLOCK, 0 TRACK, 0 /BBL READ: TRACK 0 WC, -41 /BBL READ: -BBL LENGTH SECTOR, 1400 /BBL READ: SECTOR 14 CYL, 0 SURF, 0 ERRCNT, 0 /COUNT OF RETRIES OLDTRK, 2000 /FORCE INITIAL SEEK PAGES, 200 /BBL READ: ONE PAGE FNC, RLRD /BBL READ: READ FUNCTION /RELOCATED RELATIVE ADDRESSES BARG, OK-MAIN /BBL READ: RETURN FROM READ /ADDRESS OF HANDLER ARGUMENTS MA, BBL-MAIN /BBL READ: ADDR OF BBL BBBL, BBL-MAIN B3, 3 B3777, 3777 B7600, 7600 BRLRD, RLRD HEADER, BYTE RLRH BDRIVE, DRIVE^100 /DRIVE BITS FOR RLCB CHECK, -ID /THIS CONSTANT MUST BE AT END OF PAGE ZBLOCK 577-. B4070, 4070 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 | /RLC: RL01 DEVICE C NON-SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /RL01 DEVICE C NON-SYSTEM HANDLER VERSION="A&77 /NOTES: /1. PRE-OMNIBUS COMPUTERS NOT SUPPORTED. /EDIT HISTORY: /9-NOV-77 DAVID SPECTOR: CREATION /INSTRUCTIONS THAT GENERATE CONSTANTS AC0001=CLA IAC AC0002=CLA CLL CML RTL AC0003=CLA CLL CML IAC RAL /* AC0004=CLA CLL IAC RTL /* AC0006=CLA CLL CML IAC RTL /* AC0100=CLA IAC BSW /* AC2000=CLA CLL CML RTR AC3777=CLA CLL CMA RAR AC4000=CLA CLL CML RAR AC5777=CLA CLL CMA RTR AC6000=CLA CLL CML IAC RTR /* AC7775=CLA CLL CMA RTL AC7776=CLA CLL CMA RAL /* USE ONLY ON VT-78 AND PDP-8E,F,M,A /ID CODE AT START OF BAD BLOCK LIST (BBL) ID=123 /BAD BLOCK LIST FORMAT: /(TRACK 0 SECTOR 16) /WORD CONTENTS /0 ID (IDENTIFICATION CODE) /1 BAD BLOCK NUMBERS (ASCENDING ORDER) /... ... /20 0 (LIST TERMINATOR) /RL01 DEFINITIONS RLIOT=6600 RLDC=RLIOT 0 /CLEAR DEVICE RLSD=RLIOT 1 /SKIP IF DONE RLMA=RLIOT 2 /LOAD MEM ADDR RLCA=RLIOT 3 /LOAD REGISTER "A" RLCB=RLIOT 4 /LOAD REG "B" AND EXECUTE RLSA=RLIOT 5 /LOAD SECTOR ADDR /RLIOT 6 UNUSED RLWC=RLIOT 7 /LOAD WORD COUNT RRER=RLIOT 10 /READ ERROR REG RRWC=RLIOT 11 /READ WORD COUNT RRCA=RLIOT 12 /READ REG "A" RRCB=RLIOT 13 /READ REG "B" RRSA=RLIOT 14 /READ SECTOR ADDR RRSI=RLIOT 15 /READ SILO BYTE /RLIOT 16 UNUSED RLSE=RLIOT 17 /SKIP IF ERROR /RLCB FUNCTION BITS: RLMT=0 /MAINTENANCE MODE RLRE=1 /RESET DRIVE ERRORS RLST=2 /READ STATUS REGS INTO SILO RLSK=3 /SEEK RLRH=4 /READ HEADER RLWR=5 /WRITE RLRD=6 /READ RLRN=7 /READ WITH NO HEADER CHECK /BIT DEFINITIONS IN REGISTERS: BYTE=1000 /BYTE TRANSFER MODE /HEADER BLOCK FOR USE BY "BUILD" *0 -4 /- NR DEVICES PER HANDLER /FORMAT OF ENTRIES IN HEADER BLOCK: /WORD DESCRIPTION /0 GROUP NAME (4 CHAR) /2 DEVICE NAME (4 CHAR) /4 DCB WORD FOR AN RL01(C), DIRECTORY DEVICE /5 OFFSET TO ENTRY POINT, 2-PAGE INDICATOR /6 0 (UNUSED WORD) /7 0 TO REPRESENT NON-SYSTEM DEVICE DEVICE RLC;DEVICE RL0C;4310;RL0C&177+4000;0;0 DEVICE RLC;DEVICE RL1C;4310;RL1C&177+4000;0;0 DEVICE RLC;DEVICE RL2C;4310;RL2C&177+4000;0;0 DEVICE RLC;DEVICE RL3C;4310;RL3C&177+4000;0;0 /HANDLER CODE *200 /FIRST PAGE START, DCA DRIVE /SAVE DRIVE NUMBER. TAD DRIVE /FIND ENTRY ADDR IN CLL RTL /ORDER TO TRANSFER TAD TADX /CALLING ADDR TO "ARG". DCA .+1 TAD DCA ARG TAD I ARG /GET ARGUMENTS /FUNCTION WORD AND A4070 /READ-WRITE, FIELD SPA TAD A3777 /IF WRITE, -1 TAD ARLRD /CONVERT FUNCTION TO RL01 /FUNCTION WORD. DCA FNC TAD I ARG /FUNCTION WORD RAL AND A7600 /PAGES IN BITS [7600]; /0 MEANS 40. DCA PAGES ISZ ARG TAD I ARG /MA DCA MA ISZ ARG TAD I ARG /BLOCK DCA BLOCK ISZ ARG RDF /SAVE CALLING FIELD TAD ACIDF /FOR RETURN. DCA RTN ACIDF, CIF CDF 00 /CHANGE TO CURRENT FIELD. TAD A7600 /RETURN TO MONITOR IF USER KRS /TYPES CTRL,C. TAD A175 SNA CLA KSF ONCE, JMP ONLY /ELSE START ONCE-ONLY CODE /AT "ONLY". "ONCE" GETS CHANGED /TO "JMP BEGIN" BY ONCE-ONLY CODE. JMP I A7600 /CALL MONITOR UPON CTRL,C. /CONSTANTS ATRANS, TRANS-MAIN ACURTK, CURTRK-MAIN CHECK, -ID A200, 200 A4070, 4070 /ENTRY POINTS IFNZRO 250-. <ENTRY POINTS START AT OFFSET OF 50> ARG, /ADDR OF ARG LIST RL0C, VERSION /DRIVE 0 ENTRY POINT CLA JMP START TADX, TAD ARG /A CONSTANT RL1C, VERSION /DRIVE 1 ENTRY POINT AC0001 JMP START A175, 175 RL2C, VERSION /DRIVE 2 ENTRY POINT AC0002 JMP START A3777, 3777 RL3C, VERSION /DRIVE 3 ENTRY POINT AC0003 JMP START GO, 0 /ONCE-ONLY CODE. /ADDRESS OF 2ND PAGE STORED HERE. BBL, TAD JMPX /NEXT 21 OCTAL LOCATIONS ARE /REPLACED BY THE BAD BLOCK LIST /WHEN IT IS READ IN /FROM REQUESTED DRIVE. /ONCE-ONLY CODE: PREVENT EXE- /CUTION MORE THAN ONCE. DCA ONCE LOOP, TAD LIST /RELOCATE LOCATIONS CONTAINING SNA /RELATIVE ADDRESSES TO MAKE THEM JMPX, JMP BEGIN /ABSOLUTE. LOCATION LIST IS TERM- /INATED BY ZERO. TAD GO /RELOCATE VALUE IN LIST. DCA ONLY /"ONLY" IS NOW TEMP STORAGE. ISZ LOOP TAD GO /RELOCATE ADDRESS(VALUE). TAD I ONLY DCA I ONLY JMP LOOP /CONTINUE UNTIL DONE. LIST, ABBL-MAIN /LIST OF RELATIVE ADDRESSES OF /RELOCATABLE ADDRESSES. ATRANS-MAIN ACURTK-MAIN BBLOCK-MAIN BSECT-MAIN BTRACK-MAIN BHALF-MAIN BDRIVE-MAIN BASE-MAIN BERROR-MAIN 0 /TERMINATOR. /PERFORM TRANSFER, READING IN BBL IF NECESSARY BEGIN, AC2000 DCA I ACURTK /FORCE IGNORANCE OF CURRENT /TRACK IN CASE OPERATION IS /TO A DIFFERENT DRIVE. /(2000 IS AN ILLEGAL TRACK) TAD DRIVE /HAS DRIVE CHANGED FROM LAST CALL? CIA TAD CURDRV SNA CLA JMP I ATRANS /NO, DO TRANSFER. TAD DRIVE /YES, REMEMBER CHANGE AND DCA CURDRV /READ IN BAD BLOCK LIST. JMS I GO /CALL TRANSFER SUBROUTINE 0 /TRACK=0 16 /SECTOR=16 -21 /WC=-LIST LENGTH ABBL, BBL-MAIN /MA="BBL" ARLRD, RLRD /FUNCTION=READ INTO FIELD 0 TAD I ABBL /IS BBL VALID? TAD CHECK /-ID. SNA CLA JMP I ATRANS /YES, DO TRANSFER. ERROR, AC4000 /HANDLER ERROR RETURN. SKP DONE, ISZ ARG /NORMAL HANDLER RETURN. RTN, CIF CDF /RETURN TO CALLING FIELD. JMP I ARG /SECTOR TRANSFER SUBROUTINE HALF, 0 /TRANSFER ONE PAGE. JMS I GO /CALL TRANSFER SUBROUTINE TRACK, 0 /TRACK SECTOR, 0 /SECTOR A7600, 7600 /-WORD COUNT MA, 0 /MEMORY ADDRESS FNC, 0 /FUNCTION WORD TAD A200 /INCREMENT MEMORY ADDRESS. TAD MA DCA MA ISZ SECTOR /INCREMENT SECTOR ADDRESS. ISZ SECTOR /(2:1 INTERLEAVE) TAD A7600 /DECREMENT PAGE COUNT. TAD PAGES SNA JMP DONE /TAKE NORMAL HANDLER RETURN /WHEN PAGE COUNT REACHES ZERO. DCA PAGES /ELSE CONTINUE TRANSFER. JMP I HALF /VARIABLES DRIVE, 0 PAGES, 0 BLOCK, 0 ZBLOCK 377-. /UNUSED: "ONLY" MUST BE AT 377! CURDRV, /CURRENT DRIVE (INITIALLY INVALID /TO FORCE READ-IN OF BAD BLOCK LIST). ONLY, JMS GO /ONCE-ONLY CODE TO PUT ADDRESS /OF "MAIN" INTO "GO". /REUSED AS CURRENT DRIVE. *400 /SECOND PAGE MAIN, 0 /TRANSFER UP TO ONE PAGE. AC7775 /INITIALIZE FOR 3 TRIES. DCA ERRCNT TAD MAIN /SAVE ADDRESS OF ARGS. DCA MAINSV TAD I MAIN /CALCULATE CYLINDER AND /SURFACE FROM TRACK. /1ST ARG=TRACK. CLL RAR DCA CYL RTR DCA SURF JMS TRKCMP /IF ON TRACK, DO TRANSFER. RETRY, TAD MAINSV /OFF TRACK: SEEK TO TRACK. DCA MAIN /RESTORE ADDRESS OF ARGS. RLDC /CLEAR CONTROLLER REGISTERS. SEEK, IAC /AC=CLEAR DRIVE REGISTERS /FUNCTION (AC=SEEK FUNCTION /WHEN CALLED FROM BELOW). JMS IO /DO RL01 FUNCTION. TAD HEADER JMS IO /READ NEXT HEADER FROM DISK. RRSI /GET HEADER BYTE #1. BSW B377, AND B3 /THIS INSTRUCTION IS ALSO USED /AS A CONSTANT. DCA CURTRK /BITS [3] OF CURRENT TRACK. RRSI /GET HEADER BYTE #2. AND B377 /THIS SHOULD BE DONE BY HARDWARE! CLL RTL /BITS [774] OF CURRENT TRACK. TAD CURTRK DCA CURTRK JMS TRKCMP /IF ON TRACK, DO TRANSFER. TAD CURTRK /OFF TRACK: CONSTRUCT DIFFERENCE CLL RAR /WORD FOR SEEK. CIA TAD CYL SMA JMP AROUND CIA SKP AROUND, TAD B4000 /SET DIRECTION BIT IF TO HIGHER /CYLINDER ADDRESS. TAD SURF RLCA /LOAD DIFFERENCE WORD. AC0002 /PREPARE AC FOR SEEK FUNCTION. JMP SEEK /SEEK. TRKCMP, 0 /IF ON TRACK, DO TRANSFER. TAD CURTRK /COMPARE CURRENT TRACK AND CIA /DESIRED TRACK. TAD I MAIN /1ST ARG=TRACK. SZA CLA JMP I TRKCMP /DIFFERENT: SEEK. ISZ MAIN /ON TRACK: DO TRANSFER. TAD CYL TAD SURF RLCA /LOAD DISK ADDRESS OF TRACK. TAD I MAIN /2ND ARG=SECTOR. BSW RLSA /LOAD SECTOR ADDRESS. ISZ MAIN TAD I MAIN /3RD ARG=WORD COUNT. RLWC /LOAD WORD COUNT. ISZ MAIN TAD I MAIN /4TH ARG=MA. RLMA /LOAD MA. ISZ MAIN TAD I MAIN /5TH ARG=FUNCTION. JMS IO /DO RL01 FUNCTION. ISZ MAIN JMP I MAIN /RETURN FROM TRANSFER SUBROUTINE. TRANS, TAD BASE /DO TRANSFER. /INITIALIZE BAD BLOCK MAPPING. DCA MAPPER MAP, TAD I MAPPER /DO BAD BLOCK MAPPING. /GET BAD BLOCK IF ANY. SNA /DONE? (0 TERMINATES) JMP MAPPED /YES. STL CIA /NO, 13-BIT NEGATE. TAD I BBLOCK /SUBTRACT FROM CURRENT BLOCK. SZL CLA /IS BAD BLOCK GREATER (UNSIGNED)? JMP MAPPED /YES, MAPPING IS DONE. ISZ MAPPER /NO, MAP AROUND THIS BAD BLOCK /AND TRY NEXT. NEXT, ISZ I BBLOCK /WILL NEVER SKIP. JMP MAP /CONTINUE MAPPING UNTIL DONE. MAPPED, TAD I BBLOCK /CALCULATE SECTOR FROM BLOCK. AND B3 CLL RTL DCA I BSECT TAD I BBLOCK /TEST BLOCK FOR LEGALITY: LEGAL TAD B4010 /BLOCKS ARE 0-3767. SZL CLA JMP I BERROR TAD I BBLOCK /CALCULATE TRACK FROM BLOCK. RTR AND B777 IAC DCA I BTRACK JMS I BHALF /TRANSFER 1ST HALF OF BLOCK. JMS I BHALF /TRANSFER 2ND HALF OF BLOCK. JMP NEXT /CONTINUE WITH NEXT BLOCK. IO, 0 /DO RL01 FUNCTION. BSW TAD I BDRIVE BSW /PUT DRIVE INTO BITS [300]. RLCB /DO RL01 COMMAND. RLSD /WAIT UNTIL DONE. JMP .-1 RLSE /ANY ERRORS? JMP I IO /NO, RETURN. ISZ ERRCNT /YES, TRY AGAIN? JMP RETRY /YES. JMP I BERROR /TAKE ERROR RETURN WHEN 3 /TRIES HAVE BEEN DONE. /DATA BBLOCK, BLOCK-MAIN BSECT, SECTOR-MAIN BTRACK, TRACK-MAIN BHALF, HALF-MAIN BDRIVE, DRIVE-MAIN BERROR, ERROR-MAIN BASE, BBL+1-MAIN /START OF BBL FOR MAPPING. MAPPER, 0 MAINSV, 0 /SAVED "MAIN" VALUE. CURTRK, 0 HEADER, BYTE RLRH SURF, 0 CYL, 0 ERRCNT, 0 B777, 777 B4000, 4000 B4010, 4010 ZBLOCK 577-. /UNUSED. B3, 3 /THIS CONSTANT MUST BE AT /LAST LOC OF 2ND PAGE. $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 | /RLSY: RL01 SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /RL01 SYSTEM HANDLER VERSION="A&77 /NOTES: /1. PRE-OMNIBUS COMPUTERS NOT SUPPORTED. /EDIT HISTORY: /21-OCT-77 DAVID SPECTOR: CREATION /INSTRUCTIONS THAT GENERATE CONSTANTS AC0001=CLA IAC AC0002=CLA CLL CML RTL AC0003=CLA CLL CML IAC RAL /* AC0004=CLA CLL IAC RTL /* AC0006=CLA CLL CML IAC RTL /* AC0100=CLA IAC BSW /* AC2000=CLA CLL CML RTR AC3777=CLA CLL CMA RAR AC4000=CLA CLL CML RAR AC5777=CLA CLL CMA RTR AC6000=CLA CLL CML IAC RTR /* AC7775=CLA CLL CMA RTL AC7776=CLA CLL CMA RAL /* USE ONLY ON VT-78 AND PDP-8E,F,M,A /ID CODE AT START OF BAD BLOCK LIST (BBL) ID=123 /RL01 DEFINITIONS RLIOT=6600 RLDC=RLIOT 0 /CLEAR DEVICE RLSD=RLIOT 1 /SKIP IF DONE RLMA=RLIOT 2 /LOAD MEM ADDR RLCA=RLIOT 3 /LOAD REGISTER "A" RLCB=RLIOT 4 /LOAD REG "B" AND EXECUTE RLSA=RLIOT 5 /LOAD SECTOR ADDR /RLIOT 6 UNUSED RLWC=RLIOT 7 /LOAD WORD COUNT RRER=RLIOT 10 /READ ERROR REG RRWC=RLIOT 11 /READ WORD COUNT RRCA=RLIOT 12 /READ REG "A" RRCB=RLIOT 13 /READ REG "B" RRSA=RLIOT 14 /READ SECTOR ADDR RRSI=RLIOT 15 /READ SILO BYTE /RLIOT 16 UNUSED RLSE=RLIOT 17 /SKIP IF ERROR /RLCB FUNCTION BITS: RLMT=0 /MAINTENANCE MODE RLRE=1 /RESET DRIVE ERRORS RLST=2 /READ STATUS REGS INTO SILO RLSK=3 /SEEK RLRH=4 /READ HEADER RLWR=5 /WRITE RLRD=6 /READ RLRN=7 /READ WITH NO HEADER CHECK /BIT DEFINITIONS IN REGISTERS: BYTE=1000 /BYTE TRANSFER MODE /HEADER BLOCK FOR USE BY "BUILD" *0 -2 /- NR. OF ENTRY POINTS /FORMAT OF ENTRIES IN HEADER BLOCK: /WORD DESCRIPTION /1 GROUP NAME (4 CHAR) /3 DEVICE NAME (4 CHAR) /5 DCB WORD FOR AN RL (TYPE 26) DIRECTORY DEVICE, / NO MULTIPLE PLATTERS /6 2-PAGE/SYS/CORESIDENT INDICATOR, OFFSET /7 0 (UNUSED WORD) /10 NUMBER OF BLOCKS IN DEVICE DEVICE RLSY;DEVICE SYS;4260;SYS&177+6000;0;7761 DEVICE RLSY;DEVICE RL0A;4260;SYS&177+5000;0;7761 /DEVICE RLSY;DEVICE RL0B;4260;RL0B&177+5000;0;7761 /RL01 SECONDARY BOOTSTRAP /SYSTEM MAP: /BLOCK CYL. SURF. SECTOR CONTENTS /0 0 0 20 SECONDARY BOOTSTRAP /0 0 0 22 FIELD 0 RESIDENT /66 1 1 1 FIELD 1 RESIDENT /66 1 1 3 FIELD 2 RESIDENT /RESIDENT MONITOR CODE OCCUPIES LAST PAGE OF FIELD /FIELD 0 PAGE IS MONITOR CODE AND SYSTEM HANDLER /FIELD 1 PAGE IS MONITOR TABLES /FIELD 2 PAGE IS SYSTEM HANDLER BOOTA-BOOTB /-LENGTH FOR "BUILD" RELOC 0 /WILL RUN AT 00000 BOOTA, /START OF BOOTSTRAP CODE /DATA C16, 16 C26, 26 C300, 300 C2001, 2001 C6001, 6001 C7600, 7600 C7605, 7605 SECT, 2200 /INITIAL BLOCK 0 VALUE SURCYL, 0 /INITIAL BLOCK 0 VALUE ZBLOCK 31-2-. /LOCATE "IOSUB" (SEE BELOW) FUNC, /TEMPORARY STORAGE FOR RL01 /FUNCTION WORD IOSUB, BOOT /SUBROUTINE TO DO I/O; MATCHES /SIMILAR SUBR IN PRIMARY BOOTSTRAP /INITIAL VALUE WILL START SEC- /ONDARY BOOTSTRAP WHEN IT HAS BEEN /COMPLETELY READ IN. RLCB /EXECUTE RL01 FUNCTION RLSD /WAIT UNTIL DONE. NOTE: THIS WORD /AND THE NEXT ONE MUST BE IN THE /SAME LOCATIONS AS THEIR COUNTER- /PARTS IN THE PRIMARY BOOTSTRAP. JMP .-1 RLSE JMP I IOSUB /NO ERRORS: RETURN JMP . /ERROR OCCURRED: LOOP IN PLACE AS /A CLEAR INDICATION THAT BOOTSTRAP /OPERATION FAILED. /START OF SECONDARY BOOTSTRAP OPERATIONS BOOT, AC0006 /AC=READ FUNCTION JMS READ /READ FIELD 0 RESIDENT RLDC /CLEAR CONTROLLER REGISTERS IN /PREPARATION FOR SEEK TAD C6001 /DIFFERENCE WORD FOR CYL 1 SURF 1 RLCA /LOAD "A" AC0003 /AC=SEEK FUNCTION JMS IOSUB /SEEK AC0100 /AC=SECTOR 1 DCA SECT TAD C2001 /AC=CYL 1 SURF 1 DCA SURCYL TAD C16 /AC=READ FUNCTION JMS READ /READ FIELD 1 RESIDENT TAD C300 /AC=SECTOR 3 DCA SECT TAD C26 /AC=READ FUNCTION JMS READ /READ FIELD 2 RESIDENT CDF 00 /JUST IN CASE JMP I C7605 /START KEYBOARD MONITOR /SUBROUTINE TO READ ONE SECTOR INTO ONE PAGE READ, 0 DCA FUNC /SAVE FUNCTION WORD TAD SECT RLSA /LOAD SECTOR ADDRESS TAD C7600 RLWC /LOAD WORD COUNT TAD SURCYL RLCA /LOAD REGISTER "A" TAD C7600 RLMA /LOAD MA (ALL READS ARE INTO /LAST PAGE OF FIELDS) TAD FUNC /RETRIEVE FUNCTION WORD JMS IOSUB /DO THE READ JMP I READ /NO ERROR: RETURN BOOTB, /END OF BOOTSTRAP CODE RELOC /RL01 SYSTEM HANDLER CODE *200 RELOC 7600 ZBLOCK 7 /REQUIRED BY BUILD /ENTRY POINT FOR SYS SYS, VERSION CLA SWITCH, JMP START /CHANGED TO "JMP SET" /BY ONCE-ONLY CODE AT "START" 3 /THIS IS A FLAG TO OS/8 THAT /THIS IS A 2-PAGE HANDLER. /----- BAD BLOCK LIST (BBL) STARTS HERE / AND CONTINUES FOR 21 OCTAL LOCATIONS BBL, /ONCE-ONLY DATA JMPSET, JMP SET COUNT, -10 ADDR, BARG ABRTN, BRTN ACDIF, CIF CDF 00 /ONCE-ONLY PARAMETERS FOR 2ND PAGE TO READ IN /THE BAD BLOCK LIST (BBL) FOR DEVICE RL0A LIST, ARTN /BARG: RETURN TO SELF 1400 /SECTOR: SECTOR 14 0 /TRACK: 0 BBL /MA: MA 200 /PAGES: 1 PAGE COUNT RLRD /FNC: READ FUNCTION -21 /WC: LENGTH OF READ 2000 /CURTRK: FORCE HEADER READ /ONCE-ONLY CODE TO READ IN BAD BLOCK LIST (BBL) START, RDF /ONCE-ONLY CODE. DESTROYED WHEN /BBL IS READ IN ON TOP OF IT. /FIRST, SAVE CALLING FIELD OVER /THE READ-IN OF THE BBL. TAD BACK /(INITIALLY CONTAINS A CDF) DCA BACK TAD JMPSET /NEXT, RESET "SWITCH" TO SKIP /AROUND ONCE-ONLY CODE FROM /NOW ON. DCA SWITCH CDF 20 LOOP, TAD LIST /RESET ONCE-ONLY DATA IN 2ND PAGE DCA I ADDR /(THIS IS REQUIRED BECAUSE "BUILD" ISZ LOOP /DOESN'T ALLOW ONCE-ONLY CODE IN ISZ ADDR /2ND PAGE OF 2-PAGE SYSTEM HANDLERS) IFNZRO .-7642 <KLUDGE:> CDF 20 /******** MUST BE AT LOCATION 7642 /******** FOR FRTS.SV! ISZ COUNT JMP LOOP TAD ACDIF /ANOTHER ONCE-ONLY RESET DCA I ABRTN JMS GO /READ IN BBL BACK, CDF /RESTORE CALLING FIELD /----- ONCE-ONLY CODE ENDS HERE /FALL THROUGH TO SET UP AND DO THE TRANSFER /SET UP AND DO THE TRANSFER SET, TAD BASE /INITIALIZE BAD BLOCK /MAPPING DCA MAP TAD SYS /ADDR OF ARG LIST JMS GO /CALL 2ND PAGE SETUP SUBROUTINE /DATA FIELD IS 2 ON RETURN MAP, TAD /MAP AROUND BAD BLOCKS, IF /ANY. LOOK AT NEXT BAD BLOCK. SNA /IF 0, TERMINATOR JMP MAPPED STL CIA /IF NOT, 13-BIT NEGATE TAD I ABLOCK /SUBTRACT FROM CURRENT BLOCK SZL CLA /SKIP IF BLOCK IS GREATER THAN /OR EQUAL TO BAD BLOCK JMP MAPPED /ELSE NO MAPPING TO DO ISZ MAP NEXT, ISZ I ABLOCK /INCREMENT CURRENT BLOCK, /EITHER DURING TRANSFER OR /TO MAP AROUND BAD BLOCK JMP MAP /CONTINUE MAPPING UNTIL DONE CIF 20 /IF BLOCK EVER OVERFLOWS TO 0, JMP ERROR /TAKE ERROR RETURN. MAPPED, TAD I ABLOCK /CALCULATE TRACK AND SECTOR /FROM BLOCK RTR RTR AND A377 DCA I ATRACK TAD I ABLOCK AND A17 CLL RTL TAD A7751 SPA TAD A47 BSW DCA I ASECT JMS GO /TRANSFER 1ST PAGE OF BLOCK TAD A200 /INCREMENT MA AND SECTOR TAD I AMA DCA I AMA TAD A200 TAD I ASECT DCA I ASECT JMS GO /TRANSFER 2ND PAGE OF BLOCK TAD A200 /INCREMENT MA TAD I AMA DCA I AMA JMP NEXT /CONTINUE WITH NEXT BLOCK, /IF ANY /SUBROUTINE TO CALL 2ND PAGE SUBR TO DO TRANSFER GO, 0 CIF 20 JMS MAIN ARTN, /ON BBL READ, RETURN HERE /IF IO ERROR. /(ERROR WILL BE DETECTED /DURING 2ND PAGE VALIDITY /CHECK.) CDF 20 /DATA FIELD=2ND PAGE JMP I GO /DATA ASECT, SECTOR ATRACK, TRACK ABLOCK, BLOCK BASE, TAD BBL+1 /SKIP ID CODE WORD AMA, MA A17, 17 A47, 47 A200, 200 A377, 377 A7751, 7751 ZBLOCK 7744-. /UNUSED /SECOND PAGE RELOC *400 RELOC 7600 /SUBROUTINE TO SETUP OR TRANSFER MAIN, 0 SNA /AC TELLS WHICH JMP TRANS /NON-ZERO: TRANSFER SETUP, DCA BARG /SAVE ADDRESS OF ARGUMENTS AC2000 /SET FOR INITIAL HEADER READ DCA CURTRK /(2000 IS AN ILLEGAL TRACK) TAD B7600 /SET FOR FULL PAGE TRANSFERS DCA WC TAD I BARG /GET HANDLER FUNCTION WORD AND B4070 /CONVERT TO RL01 FUNCTION SPA TAD B3777 TAD BRLRD DCA FNC TAD I BARG RAL /CONVERT TO PAGE COUNT AND B7600 DCA PAGES ISZ BARG TAD I BARG /GET MA DCA MA ISZ BARG TAD I BARG /GET BLOCK DCA BLOCK ISZ BARG RDF /SAVE CALLING FIELD TAD BCDIF /FOR RETURN FROM HANDLER DCA BRTN CDF 00 /CHECK BBL FOR VALIDITY - TAD I BBBL /A VALID BBL HAS AN ID TAD CHECK /CODE IN ITS FIRST LOCATION SZA CLA JMP ERROR /INVALID BBL: TAKE ERROR /RETURN FROM HANDLER GOBACK, /RETURN TO 1ST PAGE BCDIF, CIF CDF 00 JMP I MAIN /TRANSFER (READ OR WRITE) TRANS, AC7775 /SET FOR 3 TRIES DCA ERRCNT TAD TRACK /CALCULATE CYLINDER AND /SURFACE FROM TRACK CLL RAR DCA CYL RTR DCA SURF JMS TRKCMP /COMPARE TRACK WITH LAST /ONE TRANSFERRED; IF THE /SAME, DO TRANSFER. RETRY, RLDC /IF DIFFERENT, OR IF RE- /TRYING, SEEK TO TRACK; /CLEAR CONTROLLER REGISTERS /FOR SEEK SEEK, IAC /AC=1 FOR RESETTING DRIVE /REGISTERS (ERRORS), AC=3 /FOR DOING SEEK JMS IO /DO A RESET OR A SEEK TAD HEADER /AC=READ HEADER FUNCTION JMS IO /READ NEXT HEADER RRSI /GET HEADER BYTE #1 BSW /CALCULATE TRACK AND B3 DCA CURTRK RRSI /GET HEADER BYTE #2 AND B377 CLL RTL TAD CURTRK DCA CURTRK JMS TRKCMP /COMPARE CURRENT AND REQUESTED /TRACK; IF SAME, DO TRANSFER SPA /IF DIFFERENT, SEEK: CALCULATE CLL CIA /DIFFERENCE WORD RAR TAD SURF RLCA /LOAD REGISTER "A" AC0002 /PREPARE FOR SEEK JMP SEEK /LOOP BACK TO ENSURE THAT TRACK /REACHED IS REALLY THE DESIRED /TRACK, IN CASE OF RL01 SEEK /UNRELIABILITY. /SUBROUTINE TO COMPARE CURRENT TRACK WITH REQUESTED /TRACK AND DO TRANSFER IF THE SAME TRKCMP, 0 TAD CURTRK CIA TAD TRACK STL /SET DIRECTION BIT IN /DIFFERENCE WORD IF DIFF- /ERENCE IS POSITIVE. SZA /SAME? JMP I TRKCMP /NO TAD SECTOR /YES; LOAD DRIVE REGISTERS RLSA TAD WC RLWC TAD SURF TAD CYL RLCA TAD MA RLMA TAD FNC JMS IO /READ OR WRITE TAD B7600 /COUNT PAGES TRANSFERRED TAD PAGES SNA JMP DONE /NO MORE TO GO DCA PAGES JMP GOBACK /MORE TO GO; RETURN TO /1ST PAGE /SUBROUTINE TO DO RL01 I/O IO, 0 RLCB /EXECUTE FUNCTION (DRIVE 0) RLSD /WAIT UNTIL DONE JMP .-1 RLSE /ANY ERRORS? JMP I IO /NO; RETURN ISZ ERRCNT /YES; MORE RETRIES LEFT? JMP RETRY /YES, RETRY IT. ERROR, AC4000 /NO, TAKE HANDLER ERROR SKP /RETURN. DONE, ISZ BARG /NORMAL HANDLER RETURN BRTN, CIF CDF 00 /RESTORE CALLING FIELD; JMP I BARG /INITIALLY, RETURN TO 1ST PAGE /AFTER BBL READ-IN. /DATA B3, 3 B377, 377 B3777, 3777 B4070, 4070 B7600, 7600 HEADER, BYTE RLRH BRLRD, RLRD CHECK, -ID BBBL, BBL ERRCNT, 0 BLOCK, 0 SURF, 0 CYL, 0 /VARIABLES INITIALIZED TO PERFORM INITIAL BBL READ-IN BARG, ARTN /INITIALLY, RETURN TO 1ST PAGE /AFTER BBL READ-IN. SECTOR, 1400 /BBL: SECTOR 14 (TRACK 0) TRACK, 0 MA, BBL /INITIAL BBL READ PAGES, 200 /INITIAL BBL READ FNC, RLRD /INITIAL BBL READ WC, -21 /INITIAL BBL READ CURTRK, 2000 /INITIAL HEADER READ AND /SEEK IF REQUIRED. ZBLOCK 7774-. /UNUSED ZBLOCK 4 /RESERVED FOR USE BY BATCH /IN 12K SYSTEMS. RELOC $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | /2 ROM-TD8E HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / ROMFLD=70 VERSION="A&77 /THESE ARE ASSEMBLY REFERENCES TO LOCATIONS IN THE ROM: RGO=7405 F2SET=7552 / TD8E MNEMONICS: SDSS=6771 SDST=6772 SDSQ=6773 SDLC=6774 SDLD=6775 SDRC=6776 SDRD=6777 *0 -3 DEVICE ROM;DEVICE SYS;4211;2007;0;1341 DEVICE ROM;DEVICE DTA0;4211;1007;0;1341 DEVICE ROM;DEVICE DTA1;4211;SDTA1&177+1000;0;1341 STARTB-ROMCT-1 NOPUNCH *7360 /ROOM FOR DECTAPE HEADER WORDS ENPUNCH STARTB, ZBLOCK 20 CDF 0 /BOOTSTRAP TO MOVE FIELD 1 TAD I ROM1 /CODE UP TO FIELD 1 CDF 10 DCA I ROM2 ISZ ROM1 NOP ISZ ROM2 NOP ISZ ROMCT JMP 7400 CIF CDF 0 /DONE SDLC /STOP THE TAPE JMP I .+1 7605 /START HER UP ROM1, 7427 /FIELD 1 CODE GETS LOADED HERE ROM2, 7647 /AND GOES UP HERE ROMCT, -130 *200 NOPUNCH *7600 ENPUNCH ZBLOCK 7 SHNDLR, VERSION /UNIT 0 ENTRY CLA CLL JMP SHND2 S70, 70 S6201, 6201 SDTA1, VERSION /UNIT 1 ENTRY POINT CLA CLL CML TAD SDTA1 /GET ARGS AT SHNDLR DCA SHNDLR SHND2, RAR /UNIT BIT IS IN LINC DCA SUNIT RDF TAD S6203 /SETUP RETURN FIELD DCA EFLD TAD I SHNDLR SDLD /STORE FUNCTION WORD IN DATA REG. AND S70 /SDLD DOESN'T CLEAR AC TAD S6201 /ISOLATE FIELD OF XFER DCA TFLD TAD TFLD DCA TFLD2 ISZ SHNDLR TAD I SHNDLR /BUFFER ADDRESS DCA BPTR ISZ SHNDLR TAD I SHNDLR /PS/8 RECORD # CLL RAL /TIMES 2 FOR ABSOLUTE BLOCK DCA BLOCK ISZ SHNDLR CDF 0 CIF ROMFLD /ROM IS IN FIELD 7 JMP I XF2SET /INITIALIZE. GET, 0 TFLD, HLT /ROUTINE TO LOAD DATA FROM BUFFER TAD I XPTR CIF ROMFLD JMP I GET PUT, 0 /PUT DATA INTO BUFFER TFLD2, HLT DCA I XPTR CIF ROMFLD JMP I PUT ERROR, CLA CLL /FORCE TURNAROUND AT RGO CIF ROMFLD ISZ TRYCNT /TRIED 3 TIMES? JMP I XRGO S6203, CIF CDF 0 JMP SEREX /YES..FATAL EXIT XRGO, RGO XF2SET, F2SET /EQUIVALENCES FOR HANDLER EQUTMP=7750 BPTR=7751 XPGCT=7752 XPTR=7753 XWCNT=7754 WRQ=7724 WRQUAD, 0 /WRITE A 12 BIT TAPE WORD CIF ROMFLD JMP WRQ CIFR, CIF ROMFLD JMP I WRQUAD RDQUAD, 0 /READ A 12 BIT DATA WORD SDSQ JMP .-1 SDRD CIF ROMFLD JMP I RDQUAD EQUFUN, 0 /EQUIVALENCE CHECKSUM CMA DCA EQUTMP TAD EQUTMP AND SCKSUM CIA CLL RAL TAD EQUTMP TAD SCKSUM DCA SCKSUM TAD EQUTMP CLL CMA CIF ROMFLD JMP I EQUFUN SEXIT, ISZ SHNDLR /NORMAL EXIT SEREX, TAD SUNIT /STOP THE DRIVE SDLC CLA CML RAR /EXIT CONDITION IN BIT 0 EFLD, HLT JMP I SHNDLR TRYCNT, 0 SXUNIT, 0 SXFUN, 0 SCKSUM, 0 BLOCK, 0 SUNIT, 0 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 | /RX NON-SYSTEM HANDLER, GENERAL CONTROLLER TYPE /FLOPPY DISK HANDLER FOR OS/8. RX78C.PA /***NOT FOR USE WITH VT278. ONLY VT78 *** / / / / / / / / /COPYRIGHT (C) 1978 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / / THIS HANDLER IS SPECIFICALLY FOR A SECOND PAIR OF DRIVES ON A VT78!! / /DEFINITIONS OF RX8/E IOT'S RXVER= "N&77 DEVCOD= 750 /DEVICECODE LCD= 6001+DEVCOD /LOAD COMMAND REGISTER XDR= 6002+DEVCOD /TRANSFER DATA REGISTER STR= 6003+DEVCOD /SKIP ON TRANSFER REQUEST FLAG, CLEAR FLAG SER= 6004+DEVCOD /SKIP ON ERROR FLAG, CLEAR FLAG SDN= 6005+DEVCOD /SKIP ON DONE FLAG, CLEAR FLAG INTR= 6006+DEVCOD /INTERRUPT ENABLE/DISABLE INIT= 6007+DEVCOD /INITIALIZE CONTROLLER AND RECALIBRATE DRIVES /NOTES ON THIS HANDLER: /THIS HANDLER READS AND WRITES THE DISK IN "12-BIT" MODE, IN WHICH /ONLY 6 BITS OF EVERY 8-BIT BYTE ARE USED. AN RX01 CARTRIDGE /CONTAINS 494 OS/8 BLOCKS UNDER THIS METHOD /TO MAXIMIZE SPEED ON THE DEVICE, THE HANDLER READS AND WRITES RX01 DATA /ON A TRACK WITH A TWO-WAY INTERLEAVE - I.E. RECORDS 1-26 ON A TRACK /ARE WRITTEN IN THE SEQUENCE: / 1,3,5,7,9,11,13,15,17,19,21,23,25,2,4,6,8,10,12,14,16,18,20,22,24,26 /DOUBLE DENSITY MEDIA ARE WRITTEN IN A THREE WAY INTERLEAVE / 1,4,7,10,13,16,19,22,25,2,5,8,11,14,17,20,23,26,3,6,9,12,15,18,21,24 /TRACK-SECTOR COMPUTATION IS DONE I/O TO/FROM THE SILO AC4000=CLL CLA CML RAR /SET AC TO 4000 AC7776=CLL CLA CMA RAL /SET AC TO 7776 AC0002=CLL CLA CML RTL /SET AC TO 0002 AC7775=CLL CLA CMA RTL /SET AC TO 7775 / /BUILD DATA *0 / -2 /TWO ENTRY POINTS DEVICE RX0B /DEVICE GROUP NAME DEVICE RXA2 /ENTRY POINT NAME 4320 /CODE FOR MULTI-RX RXA2&177+4000 /ENTRY POINT OFFSET 0 0 DEVICE RX0B /DEVICE GROUP NAME DEVICE RXA3 /ENTRY POINT NAME 4320 /THIS WAS CHANGED FROM 4270 - ASSIGNED TO CASSETTE RXA3&177+4000 /ENTRY POINT OFFSET 0 0 *200 / / / INIT CODE / POINT, HLT /ADDR OF SECOND PAGE AT INIT TIME UNIT, JMS I POINT /GO TO SECOND PAGE TO INIT / / LIST OF VECTORS TO SECOND PAGE / LQUO, QUO-. /LQUO MUST LEAD OFF LIST LRETRY, RETRY-. LREC, REC-. LSIZE, SIZE-. LREMD, REMD-. LFN, FN-. LDENSW, DENSW-. LSELCT, SELECT-. LENTRY, ENTRY-. VCOUNT=LQUO-. /FALLS THRU TO WHICH, HERE IS VECTOR COUNT / / COME HERE FROM ZOO / / PROCESS ENTRY POINT, DEVICE TYPE / WHICH, CLA IAC /SELECT SECOND PAIR IF DRIVES JMS I LSELCT AC7775 /SET RETRY COUNTER DCA I LRETRY TAD I ZOO /GET UNIT NUMBER*20+402 DCA UNIT /HOLD FOR LATER ISZ ZOO /MOVE TO TYPE CODE TAD I ZOO /HAS THIS DRIVE BEED INIT'ED L7700, SMA CLA /SKIP IF NO JMP NORMAL /GO TO NORMAL PATH RSTART, TAD UNIT /PICK UP UNIT BIT, DOUBLE DENSITY +2 TAD L10 /MAKE A READ STATUS CODE SDN JMP .-1 LCD JMP BOUNCE /HOP OVER ENTRY POINTS / / / IFZERO .&177-34&4000 <_ERROR_> / / ENTRY POINTS ARE AT 33, 37 / *.&7600+33 / RXA2, 0 JMS ZOO /COMMON ENTRY ROUTINE 402 /UNIT 0, 402 FOR CONVENIENCE -1 /MINUS SAYS STILL HAVE TO INIT IT; / /SINGLE=0, DOUBLE=20, QUAD=22 RXA3, 0 JMS ZOO L422, 422 /20 SAYS UNIT 1, 402 FOR CONVENIENCE DOOR, JMP WHICH /INIT TIME LITERAL (MUST BE MINUS) / /GETS SAME TYPE CODE AS OTHER ENTRY POINT / / REST OF SET UP CODE / BOUNCE, SDN JMP .-1 XDR /GET STATUS WORD AND L32 /KEEP DENSITY ERROR; DOUBLE; QUAD TAD L10 /SINGLE=10;SING/DOUB=40;DOUB=20;QUAD=22 AND L422 /SINGLE=0;SING/DOUB=0;DOUB=20;QUAD=22 DCA I ZOO /PLACE TYPE CODE, THREE LOC.'S AFTER ENTRY POINT SER /CLEAR ERROR FLAG L10, 10 /MAY SKIP TAD L416 /SET DONE FLAG AGAIN LCD NORMAL, TAD I ZOO /FETCH BACK TYPE CODE SZA CLA /SKIP IF A SINGLE DENSITY TAD L7700 /DOUBLE TAD L7700 /SINGLE=7700, DOUBLE=7600 DCA I LDENSW /PLACE FOR LOOP CONTROL TAD I ZOO CLL RTR /PUT QUAD BIT TO LINK SNA CLA /SKIP IF DOUBLE OR QUAD TAD L1734 /SINGLE TAD L4110 /D&Q=4110, S=6044 SNL /SKIP ON QUAD, IT'S OK RIGHT NOW CLL CML RAR /SINGLE AND DOUBLE DIVIDE BY 2 DCA I LSIZE /S=7022, D=6044, Q=4110 TAD I LDENSW /7700 IF SINGLE, 7600 IF DOUBLE CLL CMA RTL /375 IF SINGLE, 775 IF DOUBLE AND UNIT /VOILA, 400*DOUBLE + 20*UNIT DCA I LFN /PLACE INTO FUNCTION CONTROL WORD AC7775 /BACK UP ZOO TO FETCH CALLING ADDR TAD ZOO DCA T1 /HOLD TEMPORARY TAD I T1 /HERE IS CALLING ADDR CLLFLD, HLT /PUT CDF TO CALLING FIELD HERE JMS I LENTRY /GO TO SECOND PAGE, LEAVING POINTER TO DIVSUB / / DIVSUB SUBROUTINE !!MUST!! FOLLOW IMMEDIATELY / / / DIVSUB / / CALL TO SET UP TRACK, SECTOR, FROM OVERALL SECTOR # / ALSO, SET UNIT WITH HEAD COMMAND IF WE ARE ON TO SECOND SIDE / / CALL WITH AC <0 IF IT IS REALLY AN ERROR RETRY / CALL WITH AC >=0 IF CALL TO DIVSUB / DIVSUB, 0 CDF 0 /AND DATA FIELD MUST BE TO HERE SPA CLA /SKIP IF REALLY A DIVIDE REQUEST JMP RSTART /NO, IT WAS AN ERROR RETRY!! DCA I LQUO /CLEAR DIVIDE QUOTIENT TAD I ZOO /IS IT A TWO HEADER RTR /PUT QUAD BIT TO LINK SNL CLA /SKIP IF YES JMP SHUNT /NO, GO DO DIVIDE TAD I LREC /WHICH RECORD ARE WE WORKING ON TAD LM3670 /NUMBER OF SECTORS ON FIRST SIDE SZL CLA /SKIP IF SECOND SIDED IT JMP SHUNT /NO, JUST REGULAR TAD I LFN /FORCE HEAD BIT ON AND L422 /KEEP DOUBLE, UNIT, READ-WRITE TAD L1000 /ADD IN SECOND SIDE DCA I LFN TAD LM3670 /BUT DECREASE RECORD NUMBER SHUNT, TAD I LREC /THIS FOR TRACK-SECTOR DIVLOO, ISZ I LQUO /MAIN DIIVIDIE LOOP TAD LM32 /DIVIDE BY 26 TO GET TRACK SMA /SKIP IF DONE JMP DIVLOO TAD L32 /REMAINDER 0-25 DCA T1 /HOLD IT IN TEMPORARY TAD I ZOO /SINGLE DENSITY SZA CLA /SKIP IF YES TAD T1 /MULTIPLY BY THREE FOR DOUBLE TAD T1 /AND BY TWO FOR SINGLE TAD T1 CLL IAC /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0 TAD LM32 /DIVIDE BY 26 TO GET SECTOR SMA SZA /SKIP IF DONE JMP .-2 TAD L32 /RESTORE POSITIVE VALUE TO BE SECTOR DCA I LREMD /WHEW, BUT WATCH IT, A FINAL CORRECTION COMING! RAL /IF LINK=0 AND SINGLE: 2,4,6,8,10,12,14,16... SERIES TAD I ZOO /BUT WE HAVE 1,3,5,7,9,11,13,15... SO WE MUST INCREMENT! SNA CLA /SKIP IF SOME OTHER CASE ISZ I LREMD /NOW HAVE IT 2,4,6,8,10,12,14,16... JMP I DIVSUB /OUT / / L416, 416 /SOME LITERALS L32, 32 L1000, 1000 LM32, -32 L1734, 1734 L4110, LM3670, -3670 / / / *.&7600+167 /FORCE TO END OF PAGE / ZOO SUBROUTINE / / TO SET UP ENTRY POINT PROCESSING, AND INIT CODE / ZOO, 0 /ADDR OF 'HIT' ENTRY POINT +2 COMES HERE CLA /FOR SAFETY RDF /SAVE CALLERS FIELD SETTING TAD LCDF0 /ADD IN CDF 0 DCA CLLFLD /RESET WHEN GOING TO I/O SUB LCDF0, CDF 0 /DATA FIELD HERE FOR INDIRECTS CLOSE, TAD DOOR /CLOSE DOOR TO ONCE ONLY CODE (JMP WHICH T1, DCA CLOSE /USE ONCE-ONLY FOR TEMPORARY LOCATION JMS POINT /LEAVE ADDR OF SECOND PAGE / / / VARIABLES, ALSO INIT CODE LIVES HERE / / BUF, 0 /POINTER TO CALLER'S BUFFER RETRY, 0 /RETRY COUNT SIZE, 0 /SIZE OF DEVICE SYS, 0 /POINTER TO CALL QUO, 0 /DIVIDE QUOTIENT, WHICH IS TRACK NUMBER REC, 0 /SECTOR NUMBER OF FLOPPY BC, 0 /CONTROL COUNT, WORDS TO TRANSFER FN, 0 /0 FOR WRITE; 2 FOR READ; HEAD, DENSITY, UNIT DENSW, 0 /7700 IF SINGLE DENSITY, 7600 IF DOUBLE DENSITY ENTRY, 0 /ENTRY POINT, LEAVE ADDR OF DIVSUB HERE / IFNZRO .&177-10&4000 <_ERROR> /ENOUGH ROOM FOR INIT? / *.&7600 / / INIT TIME: FILL VECTOR TABLE / THERE, 0 /FILLED BY JMS, POINTS TO VECTOR ILOOP, TAD THERE /POINTER IS ALSO OFFSET! TAD I THERE /MAKING VECTOR DCA I THERE ISZ THERE /MOVE TO NEXT VECTOR ISZ LDCMD /CONTROL COUNT ON THIS PAGE JMP ILOOP JMP I THERE /BACK TO FIRST PAGE / / IO SUBROUTINE / / ENTRY POINT AT END OF LAST LISTING PAGE / / *ENTRY+1 /RESUME RUNTIME CODE / DCA SYS /POINTER TO ARG'S, EXIT RDF /DATA FIELD OF USER CALL TAD (CDF CIF 0 /MAKE CDF CIF TO CALLER'S FIELD DCA EXFLD /SET UP FOR CALL AC4000 /SET LINK=0, AC=4000 TAD I SYS /CARRY READ-WRITE BIT TO LINK AND L70 /KEEP FIELD FOR BUFFER TAD LLCDF0 /MAKE CDF TO BUFFER FIELD DCA BUFCDF /PLACE INTO I/O LOOP CML RTL /MAKE FUNCTION CODE, 0=WRITE, 2=READ TAD FN /START-UP CODE HAS SET HEAD, DENSITY, UNIT ETC. DCA FN TAD I SYS /MAKE LOOP CONTROL COUNT RAL AND L7600 CIA /0 FOR WHOLE FIELD DCA BC /MINUS TOTAL NUMBER OF WORDS ISZ SYS /NEXT TAD I SYS /IS BUFFER ADDRESS DCA BUF ISZ SYS /NEXT TAD L175 /CARRY WITH DENSW IF SINGLE DENSITY TAD DENSW /BLOCK # TO SECTOR # SMA CLA /SKIP IF DOUBLE, MULTIPLY BY 2 TAD I SYS /SINGLE, MULTIPLY BY FOUR SMA /SKIP ON ILLEGAL NEGATIVE BLOCK #, FORCE LINK ON LATER TAD I SYS ISZ SYS /MOVE POINTER TO ERROR EXIT CLL RAL DCA REC /SAVE SECTOR NUMBER SZL /SKIP IF LEGAL BLOCK # JMP ERREX /FORCE SIZING OF DISK TO RETURN SIZE IN AC JMS I ENTRY /CALL DIVISION SUBROUTINE OTHER PAGE TAD FN /SPLIT READ AND WRITE RTR /READ-WRITE BIT TO LINK SZL CLA /WRITE SKIPS JMP STREAD /READ GOES TO START IN MIDDLE OF LOOP / /WRITE FALLS THRU TO NEXT LISTING PAGE /WRITE FALLS THRU TO THIS LOOP / / TOP OF MAIN LOOP / TOP, TAD FN /SET SILO TO LOAD-UNLOAD JMS LDCMD /COMMAND TO CONTROLLER TAD DENSW /MAKE SILO LOOP COUNT, S=7700, D=7600 DCA FLPWC /LDCMD ENTRY SAFE TEMPORARY BUFCDF, HLT /CDF TO BUFFER FIELD PLACED HERE TRLOOP, TAD I BUF /IN CASE WRITE, FETCH A WORD STR /SKIP IF READY TO PASS DATA JMP .-1 /NO XDR /TO OR FROM AC DCA I BUF /PLACE WORD FOR READ, WRITE REPLACES SAME ISZ BUF /MOVE BUFFER POINTER, (MAY SKIP) REMD, 0 /DIVIDE REMAINDER, WHICH IS SECTOR NUMBER ISZ FLPWC /DONE YET JMP TRLOOP TAD DENSW /ADDING 77 (SINGLE) 177 (DOUBLE) CMA /ONCE WE CMA, THAT IS TAD BC /LOOP CONTROL TO FINISH READ SNA JMP OKEX /OK, DONE DCA BC /REPLACE AND KEEP GOING / / MIDDLE OF MAIN LOOP / STREAD, CLA CLL IAC RTL /KNOWN TO BE A 78, SO THIS WORKS! FOR LITERAL 4 TAD FN /TURNING SILO COMMAND INTO READ-WRITE COMMAND JMS LDCMD /I/O COMMAND TO CONTROLLER TAD REMD /PRECOMPUTED SECTOR # STR JMP .-1 XDR L7600, 7600 /CLEAR AC, AND IS LITERAL TAD QUO /TRACK # STR JMP .-1 XDR /TRACK # IS ALWAYS NON0 !! ISZ REC /MOVE TO NEXT RECORD NUMBER JMS I ENTRY /DO TRACK SECTOR FOR NEXT OPERATION TAD LL16 /WAIT FOR OPERATION TO COMPLETE JMS LDCMD ISZ BC /CHECK FOR WRITE EXIT JMP TOP /STILL MORE OKEX, ISZ SYS /KICK TO OK EXIT SELBAK, DCA REC /TEMPORARY TO HOLD AC JMS SELECT /AC NOW 0 TO FORCE SELECT OF FIRST PAIR TAD REC /RETURN WITH (POSSIBLE) AC VALUE EXFLD, HLT /CDF CIF TO CALLER JMP I SYS /OUT / / / LDCMD SUBROUTINE / / CHECK FOR CONTROL C, LOAD A COMMAND / FLPWC=. /ENTRY POINT A TEMPORARY LDCMD, VCOUNT /INIT COUNTER DCA TRANS /SAVE COMMAND LLCDF0, CDF 0 /DATA FIELD HERE IN CASE CONTROL C TO MONITOR TSTTT, KSF /SKIP IF A TTY CHARACTER HAS HAPPENED JMP TSTSD /NOPE, GO CHECK RX CONTROLLER READY TAD L7600 /FORCE TOP BITS TO BE 1 TO ELIMINATE 3,203 KRS /AMBIGUITY ON TEST TAD L175 /IS IT A CONTROL C SNA CLA /SKIP IF NOT JMP MONEX /GO EXIT TO MONITOR TSTSD, SDN /IS RX CONTROLLER READY JMP TSTTT /NOPE, GO CHECK TTY TAD TRANS /GET BACK COMMAND LCD /TO CONTROLLER SER /SKIP IF AN ERROR JMP I LDCMD AC4000 /ERROR CODE FOR HARD ERROR SKP /SKIP OVER SIZING ENTRY ERREX, TAD SIZE /PUT NEGATIVE SIZE IN AC ISZ RETRY /TRY THREE TIMES? JMS I ENTRY /NO, AC NEGATIVE SAYS RETRY NOT DIVIDE!! JMP SELBAK /SELECT BACK TO FIRST PAIR / MONEX, JMS SELECT /AC=0, SELECT FIRST PAIR JMP I L7600 /BACK / / / / SELECT ROUTINE / TRANS, /TEMPORARY FOR LDCMD TO SAVE COMMAND SELECT, 0 6750 /CONTENTS OF AC11 SAYS WHICH PAIR SER /CLEAR POSSIBLE ERRANT FLAGS L70, 70 /SAFE NO-OP SDN L175, 175 STR LL16, 16 CLA /PERHAPS NOT NECESSARY TAD LL16 /SET DONE FLAG AGAIN LCD JMP I SELECT / PAGE / |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 | /RX NON-SYSTEM HANDLER, GENERAL CONTROLLER TYPE /FLOPPY DISK HANDLER FOR OS/8 / / / / / / / / /COPYRIGHT (C) 1978 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /DEFINITIONS OF RX8/E IOT'S RXVER= "N&77 DEVCOD= 750 /DEVICECODE LCD= 6001+DEVCOD /LOAD COMMAND REGISTER XDR= 6002+DEVCOD /TRANSFER DATA REGISTER STR= 6003+DEVCOD /SKIP ON TRANSFER REQUEST FLAG, CLEAR FLAG SER= 6004+DEVCOD /SKIP ON ERROR FLAG, CLEAR FLAG SDN= 6005+DEVCOD /SKIP ON DONE FLAG, CLEAR FLAG INTR= 6006+DEVCOD /INTERRUPT ENABLE/DISABLE INIT= 6007+DEVCOD /INITIALIZE CONTROLLER AND RECALIBRATE DRIVES /NOTES ON THIS HANDLER: /THIS HANDLER READS AND WRITES THE DISK IN "12-BIT" MODE, IN WHICH /ONLY 6 BITS OF EVERY 8-BIT BYTE ARE USED. AN RX01 CARTRIDGE /CONTAINS 494 OS/8 BLOCKS UNDER THIS METHOD /TO MAXIMIZE SPEED ON THE DEVICE, THE HANDLER READS AND WRITES RX01 DATA /ON A TRACK WITH A TWO-WAY INTERLEAVE - I.E. RECORDS 1-26 ON A TRACK /ARE WRITTEN IN THE SEQUENCE: / 1,3,5,7,9,11,13,15,17,19,21,23,25,2,4,6,8,10,12,14,16,18,20,22,24,26 /DOUBLE DENSITY MEDIA ARE WRITTEN IN A THREE WAY INTERLEAVE / 1,4,7,10,13,16,19,22,25,2,5,8,11,14,17,20,23,26,3,6,9,12,15,18,21,24 /TRACK-SECTOR COMPUTATION IS DONE I/O TO/FROM THE SILO AC4000=CLL CLA CML RAR /SET AC TO 4000 AC7776=CLL CLA CMA RAL /SET AC TO 7776 AC0002=CLL CLA CML RTL /SET AC TO 0002 AC7775=CLL CLA CMA RTL /SET AC TO 7775 / /BUILD DATA *0 / -2 /TWO ENTRY POINTS DEVICE RX02 /DEVICE GROUP NAME DEVICE RXA0 /ENTRY POINT NAME 4320 /CODE FOR MULTI-RX /CHANGED TO 32 RXA0&177+4000 /ENTRY POINT OFFSET 0 0 DEVICE RX02 /DEVICE GROUP NAME DEVICE RXA1 /ENTRY POINT NAME 4320 /THIS IS CHANGED TO 32 FROM 27 AS IT WAS CASSETTE RXA1&177+4000 /ENTRY POINT OFFSET 0 0 *200 / / / INIT CODE / POINT, HLT /ADDR OF SECOND PAGE AT INIT TIME UNIT, JMS I POINT /GO TO SECOND PAGE TO INIT / / LIST OF VECTORS TO SECOND PAGE / LQUO, QUO-. /LQUO MUST LEAD OFF LIST LRETRY, RETRY-. LREC, REC-. LSIZE, SIZE-. LREMD, REMD-. LFN, FN-. LDENSW, DENSW-. LENTRY, ENTRY-. VCOUNT=LQUO-. /FALLS THRU TO WHICH, HERE IS VECTOR COUNT / / COME HERE FROM ZOO / / PROCESS ENTRY POINT, DEVICE TYPE / WHICH, AC7775 /SET RETRY COUNTER DCA I LRETRY TAD I ZOO /GET UNIT NUMBER*20+402 DCA UNIT /HOLD FOR LATER ISZ ZOO /MOVE TO TYPE CODE TAD I ZOO /HAS THIS DRIVE BEED INIT'ED L7700, SMA CLA /SKIP IF NO JMP NORMAL /GO TO NORMAL PATH RSTART, TAD UNIT /PICK UP UNIT BIT, DOUBLE DENSITY +2 TAD L10 /MAKE A READ STATUS CODE SDN JMP .-1 LCD SDN JMP .-1 JMP BOUNCE /HOP OVER ENTRY POINT / / IFZERO .&177-33&4000 <_ERROR_> / / ENTRY POINTS ARE AT 32, 36 / *.&7600+32 / RXA0, 0 JMS ZOO /COMMON ENTRY ROUTINE 402 /UNIT 0, 402 FOR CONVENIENCE -1 /MINUS SAYS STILL HAVE TO INIT IT; / /SINGLE=0, DOUBLE=20, QUAD=22 RXA1, 0 JMS ZOO L422, 422 /20 SAYS UNIT 1, 402 FOR CONVENIENCE DOOR, JMP WHICH /INIT TIME LITERAL (MUST BE MINUS) / /GETS SAME TYPE CODE AS OTHER ENTRY POINT / / REST OF SET UP CODE / BOUNCE, XDR /GET STATUS WORD AND L32 /KEEP DENSITY ERROR; DOUBLE; QUAD TAD L10 /SINGLE=10;SING/DOUB=40;DOUB=20;QUAD=22 AND L422 /SINGLE=0;SING/DOUB=0;DOUB=20;QUAD=22 DCA I ZOO /PLACE TYPE CODE SER /CLEAR ERROR FLAG L10, 10 /MAY SKIP TAD L416 /SET DONE FLAG AGAIN LCD NORMAL, TAD I ZOO /FETCH BACK TYPE CODE SZA CLA /SKIP IF A SINGLE DENSITY TAD L7700 /DOUBLE TAD L7700 /SINGLE=7700, DOUBLE=7600 DCA I LDENSW /PLACE FOR LOOP CONTROL TAD I ZOO CLL RTR /PUT QUAD BIT TO LINK SNA CLA /SKIP IF DOUBLE OR QUAD TAD L1734 /SINGLE TAD L4110 /D&Q=4110, S=6044 SNL /SKIP ON QUAD, IT'S OK RIGHT NOW CLL CML RAR /SINGLE AND DOUBLE DIVIDE BY 2 DCA I LSIZE /S=7022, D=6044, Q=4110 TAD I LDENSW /7700 IF SINGLE, 7600 IF DOUBLE CLL CMA RTL /375 IF SINGLE, 775 IF DOUBLE AND UNIT /VOILA, 400*DOUBLE + 20*UNIT DCA I LFN /PLACE INTO FUNCTION CONTROL WORD AC7775 /BACK UP ZOO TO FETCH CALLING ADDR TAD ZOO DCA T1 /HOLD TEMPORARY TAD I T1 /HERE IS CALLING ADDR CLLFLD, HLT /PUT CDF TO CALLING FIELD HERE JMS I LENTRY /GO TO SECOND PAGE, LEAVING POINTER TO DIVSUB / / DIVSUB SUBROUTINE !!MUST!! FOLLOW IMMEDIATELY / / / DIVSUB / / CALL TO SET UP TRACK, SECTOR, FROM OVERALL SECTOR # / ALSO, SET UNIT WITH HEAD COMMAND IF WE ARE ON TO SECOND SIDE / / CALL WITH AC <0 IF IT IS REALLY AN ERROR RETRY / CALL WITH AC >=0 IF CALL TO DIVSUB / DIVSUB, 0 CDF 0 /AND DATA FIELD MUST BE TO HERE SPA CLA /SKIP IF REALLY A DIVIDE REQUEST JMP RSTART /NO, IT WAS AN ERROR RETRY!! DCA I LQUO /CLEAR DIVIDE QUOTIENT TAD I ZOO /IS IT A TWO HEADER RTR /PUT QUAD BIT TO LINK SNL CLA /SKIP IF YES JMP SHUNT /NO, GO DO DIVIDE TAD I LREC /WHICH RECORD ARE WE WORKING ON TAD LM3670 /NUMBER OF SECTORS ON FIRST SIDE SZL CLA /SKIP IF SECOND SIDED IT JMP SHUNT /NO, JUST REGULAR TAD I LFN /FORCE HEAD BIT ON AND L422 /KEEP DOUBLE, UNIT, READ-WRITE TAD L1000 /ADD IN SECOND SIDE DCA I LFN TAD LM3670 /BUT DECREASE RECORD NUMBER SHUNT, TAD I LREC /THIS FOR TRACK-SECTOR DIVLOO, ISZ I LQUO /MAIN DIIVIDIE LOOP TAD LM32 /DIVIDE BY 26 TO GET TRACK SMA /SKIP IF DONE JMP DIVLOO TAD L32 /REMAINDER 0-25 DCA T1 /HOLD IT IN TEMPORARY TAD I ZOO /SINGLE DENSITY SZA CLA /SKIP IF YES TAD T1 /MULTIPLY BY THREE FOR DOUBLE TAD T1 /AND BY TWO FOR SINGLE TAD T1 CLL IAC /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0 TAD LM32 /DIVIDE BY 26 TO GET SECTOR SMA SZA /SKIP IF DONE JMP .-2 TAD L32 /RESTORE POSITIVE VALUE TO BE SECTOR DCA I LREMD /WHEW, BUT WATCH IT, A FINAL CORRECTION COMING! RAL /IF LINK=0 AND SINGLE: 2,4,6,8,10,12,14,16... SERIES TAD I ZOO /BUT WE HAVE 1,3,5,7,9,11,13,15... SO WE MUST INCREMENT! SNA CLA /SKIP IF SOME OTHER CASE ISZ I LREMD /NOW HAVE IT 2,4,6,8,10,12,14,16... JMP I DIVSUB /OUT / / L416, 416 /SOME LITERALS L1000, 1000 L32, 32 LM32, -32 L1734, 1734 L4110, LM3670, -3670 / / / *.&7600+167 /FORCE TO END OF PAGE / ZOO SUBROUTINE / / TO SET UP ENTRY POINT PROCESSING, AND INIT CODE / ZOO, 0 /ADDR OF 'HIT' ENTRY POINT +2 COMES HERE CLA /FOR SAFETY RDF /SAVE CALLERS FIELD SETTING TAD LCDF0 /ADD IN CDF 0 DCA CLLFLD /RESET WHEN GOING TO I/O SUB LCDF0, CDF 0 /DATA FIELD HERE FOR INDIRECTS CLOSE, TAD DOOR /CLOSE DOOR TO ONCE ONLY CODE (JMP WHICH T1, DCA CLOSE /USE ONCE-ONLY FOR TEMPORARY LOCATION JMS POINT /LEAVE ADDR OF SECOND PAGE / / / VARIABLES, ALSO INIT CODE LIVES HERE / / BUF, 0 /POINTER TO CALLER'S BUFFER RETRY, 0 /RETRY COUNT SIZE, 0 /SIZE OF DEVICE SYS, 0 /POINTER TO CALL QUO, 0 /DIVIDE QUOTIENT, WHICH IS TRACK NUMBER REC, 0 /SECTOR NUMBER OF FLOPPY BC, 0 /CONTROL COUNT, WORDS TO TRANSFER FN, 0 /0 FOR WRITE; 2 FOR READ; HEAD, DENSITY, UNIT DENSW, 0 /7700 IF SINGLE DENSITY, 7600 IF DOUBLE DENSITY ENTRY, 0 /ENTRY POINT, LEAVE ADDR OF DIVSUB HERE / IFNZRO .&177-10&4000 <_ERROR> /ENOUGH ROOM FOR INIT? / *.&7600 / / INIT TIME: FILL VECTOR TABLE / THERE, 0 /FILLED BY JMS, POINTS TO VECTOR ILOOP, TAD THERE /POINTER IS ALSO OFFSET! TAD I THERE /MAKING VECTOR DCA I THERE ISZ THERE /MOVE TO NEXT VECTOR ISZ LDCMD /CONTROL COUNT ON THIS PAGE JMP ILOOP JMP I THERE /BACK TO FIRST PAGE / / IO SUBROUTINE / / ENTRY POINT AT END OF LAST LISTING PAGE / / *ENTRY+1 /RESUME RUNTIME CODE / DCA SYS /POINTER TO ARG'S, EXIT RDF /DATA FIELD OF USER CALL TAD (CDF CIF 0 /MAKE CDF CIF TO CALLER'S FIELD DCA EXFLD /SET UP FOR CALL AC4000 /SET LINK=0, AC=4000 TAD I SYS /CARRY READ-WRITE BIT TO LINK AND (70 /KEEP FIELD FOR BUFFER TAD LLCDF0 /MAKE CDF TO BUFFER FIELD DCA BUFCDF /PLACE INTO I/O LOOP CML RTL /MAKE FUNCTION CODE, 0=WRITE, 2=READ TAD FN /START-UP CODE HAS SET HEAD, DENSITY, UNIT ETC. DCA FN TAD I SYS /MAKE LOOP CONTROL COUNT RAL AND L7600 CIA /0 FOR WHOLE FIELD DCA BC /MINUS TOTAL NUMBER OF WORDS ISZ SYS /NEXT TAD I SYS /IS BUFFER ADDRESS DCA BUF ISZ SYS /NEXT TAD (175 /CARRY WITH DENSW IF SINGLE DENSITY TAD DENSW /BLOCK # TO SECTOR # SMA CLA /SKIP IF DOUBLE, MULTIPLY BY 2 TAD I SYS /SINGLE, MULTIPLY BY FOUR SMA /NEGATIVE BLOCK # ERROR, FORCE LINK TO BE ON TAD I SYS ISZ SYS /MOVE POINTER TO ERROR EXIT CLL RAL DCA REC /SAVE SECTOR NUMBER SZL /SKIP IF LEGAL BLOCK # JMP ERREX /FORCE DISK SIZE TO BE SET UP BEFORE EXIT! JMS I ENTRY /CALL DIVISION SUBROUTINE OTHER PAGE TAD FN /SPLIT READ AND WRITE RTR /READ-WRITE BIT TO LINK SZL CLA /WRITE SKIPS JMP STREAD /READ GOES TO START IN MIDDLE OF LOOP / /WRITE FALLS THRU TO NEXT LISTING PAGE /WRITE FALLS THRU TO THIS LOOP / / TOP OF MAIN LOOP / TOP, TAD FN /SET SILO TO LOAD-UNLOAD JMS LDCMD /COMMAND TO CONTROLLER TAD DENSW /MAKE SILO LOOP COUNT, S=7700, D=7600 DCA FLPWC /LDCMD ENTRY SAFE TEMPORARY BUFCDF, HLT /CDF TO BUFFER FIELD PLACED HERE TRLOOP, TAD I BUF /IN CASE WRITE, FETCH A WORD STR /SKIP IF READY TO PASS DATA JMP .-1 /NO XDR /TO OR FROM AC DCA I BUF /PLACE WORD FOR READ, WRITE REPLACES SAME ISZ BUF /MOVE BUFFER POINTER, (MAY SKIP) REMD, 0 /DIVIDE REMAINDER, WHICH IS SECTOR NUMBER ISZ FLPWC /DONE YET JMP TRLOOP TAD DENSW /ADDING 77 (SINGLE) 177 (DOUBLE) CMA /ONCE WE CMA, THAT IS TAD BC /LOOP CONTROL TO FINISH READ SNA JMP OKEX /OK, DONE DCA BC /REPLACE AND KEEP GOING / / MIDDLE OF MAIN LOOP / STREAD, TAD FN /READ STARTS HERE TAD (4 /TURN SILO COMMAND INTO READ-WRITE COMMAND JMS LDCMD /I/O COMMAND TO CONTROLLER TAD REMD /PRECOMPUTED SECTOR # STR JMP .-1 XDR L7600, 7600 /CLEAR AC, AND IS LITERAL TAD QUO /TRACK # STR JMP .-1 XDR /TRACK # IS ALWAYS NON0 !! ISZ REC /MOVE TO NEXT RECORD NUMBER JMS I ENTRY /DO TRACK SECTOR FOR NEXT OPERATION TAD (16 /WAIT FOR OPERATION TO COMPLETE JMS LDCMD ISZ BC /CHECK FOR WRITE EXIT JMP TOP /STILL MORE OKEX, ISZ SYS /KICK TO OK EXIT EXFLD, HLT /CDF CIF TO CALLER JMP I SYS /OUT / / / LDCMD SUBROUTINE / / CHECK FOR CONTROL C, LOAD A COMMAND / FLPWC=. /ENTRY POINT A TEMPORARY LDCMD, VCOUNT /INIT COUNTER DCA TRANS /SAVE COMMAND LLCDF0, CDF 0 /DATA FIELD HERE IN CASE CONTROL C TO MONITOR TSTTT, KSF /SKIP IF A TTY CHARACTER HAS HAPPENED JMP TSTSD /NOPE, GO CHECK RX CONTROLLER READY TAD L7600 /FORCE TOP BITS TO BE 1 TO ELIMINATE 3,203 KRS /AMBIGUITY ON TEST TAD (175 /IS IT A CONTROL C SNA CLA /SKIP IF NOT JMP I L7600 /EXIT TO MONITOR TSTSD, SDN /IS RX CONTROLLER READY JMP TSTTT /NOPE, GO CHECK TTY TAD TRANS /GET BACK COMMAND LCD /TO CONTROLLER SER /SKIP IF AN ERROR JMP I LDCMD AC4000 /AC CODE FOR EXIT, ALSO TO TELL DIVSUB WE'RE A RETRY! SKP ERREX, TAD SIZE /BLOCK TOO LARGE ENTRY, SET AC CODE ISZ RETRY /TRY THREE TIMES? JMS I ENTRY /NO, AC ZERO SAYS RETRY NOT DIVIDE!! JMP EXFLD /BACK TO CALLER / TRANS, 0 /TEMPORARY FOR LDCMD TO SAVE COMMAND / PAGE / |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 | /RX01 (RX02) SYSTEM HANDLER / / THIS HANDLER WAS DESIGNED TO WORK WITH RX01, RX02, RX03 / / HOWEVER, ONE SINGLE BINARY CANNOT SUCCESSFULLY BE USED IN A / VIRGIN BUILD FOR ALL THREE DEVICES. IT IS CURRENTLY SET UP / TO BUILD AN RX02. / TO GENERATE A BINARY TO BUILD AN RX01, CHANGE THE RXTYP / EQUATE TO 1. FOR AN RX03 BUILD, CHANGE RXTYP TO 3. / RXTYP=1 /THIS IS THE SINGLE DENSITY TWO PAGE HANDLER / / / VERSION="M&77 / / AC1=CLL CLA IAC AC2=CLL CLA CML RTL AC6=CLL CLA CML IAC RTL /RX02'S MUST RUN ON AN OMNI-BUS !! AC4000=CLL CLA CML RAR AC3777=CLL CLA CMA RAR AC7775=CLL CLA CMA RTL / / DEVICE IOT SYMBOLIC EQUATES / LCD=6751 /LOAD COMMAND XDR=6752 /TRANSFER DATA STR=6753 /SKIP IF READY TO TRANSFER SER=6754 /SKIP ON ERROR SDN=6755 /SKIP ON DONE / / HEADER BLOCK FOR BUILD / *0 -1 /ONE ENTRY DEVICE RX8E DEVICE SYS 4320 /MULTI-TYPE RX HANDLER ----- CHANGED FROM 4270 SYS&177+6000 /TWO PAGE HANDLER 0 /UNUSED IFZERO RXTYP-1 <756> /SIZE FOR BUILD IFZERO RXTYP-2 <1734> IFZERO RXTYP-3 <3670> / STBOOT-NDBOOT+12 /-SIZE (+12 FOR GAP) / / HERE IS A LISTING OF THE PRIMARY BOOT FOR CONVENIENCE / NOPUNCH / *20 / READ, TAD UNIT /TRY NEXT COMBINATION OF DENSITY AND UNIT TAD CON360 /ADDING IN 360 AND CON420 /KEEPING ONLY 420 BITS DCA UNIT /CYCLES 400,420,0,20,400,,,,,,,, AC6 /COMMAND TO READ DISK TAD UNIT /UNIT AND DENSITY LCD /COMMAND TO CONTROLLER AC1 /TO SET SECTOR AND TRACK TO 1 JMS LOAD /SECTOR TO CONTROLLER, LEAVES AC ALONE JMS LOAD /AND TRACK LITRAL, 7004 /LEAVING A 2 IN AC; SERVES AS LITERAL / / FOLLOWING IS PART OF WAIT LOOP, SAME SECONDARY BOOTS, OLD PRIMARY BOOT / START, SDN /HAS DONE COME UP; CODE STARTS HERE! JMP LOAD+1 /NO, GO CHECK FOR READY TO TRANSFER / / NOW, DONE OR ERROR / SER /SKIP ON AN ERROR, TRY ANOTHER DENSITY ETC. SNA /NASTY, AC=2 FOR ABOUT TO DO SILO, 0 ON START-UP JMP READ /START-UP, GO SET UP UNIT, THEN READ TO SILO TAD UNIT /AC ALREADY 2, PUT IN UNIT, DENSITY LCD /TO EMPTY THE SILO TAD UNIT /SET UP LOC 60 FOR OLD SECONDARY BOOT AND CON360 /KEEPING UNLY DENSITY BIT TAD LITRAL /ADDING IN 7004, BECAUSE THAT'S WHAT SYS WANTS DCA RX1SAV /OLD SECONDARY BOOT MOVES IT TO HANDLER CON360, 360 /LITERAL; EXECUTES IN LINE AS A NO-OP / /FALLS THRU TO NEXT PAGE OF LISTING / / / FOLLOWING CODE SAME AS OLD PRIMARY BOOT / JMS LOAD /GRAB NEXT ITEM FROM SILO DCA 2 /TRADITION; SECONDARY BOOT STARTS LOADING AT 2 ! ISZ 50 /INCREMENT LOAD ADDRESS JMP 47 /GO BACK FOR ANOTHER / / SECONDARY BOOT LOADS OVER PRIMARY BOOT UNIT LOCATION 47 IS LOADED, / THEN CONTROL PASSES TO SECONDARY BOOT / LOAD, 0 /SUBROUTINE TO GIVE AND TAKE DATA FROM CONTROLLER STR /IS HE READY TO TALK TO US? JMP START /NO, IS HE PERHAPS DONE WITH SILO, OR IN ERROR? XDR /YES, DATA IN OR OUT;IF DATA TO CONTROLLER, AC UNCHANGED JMP I LOAD /NO MAGIC, JUST EXIT FROM SUBROUTINE / / 60 GOES TO OLD SECONDARY BOOT / 61 HAS DENSITY AND UNIT THAT BOOTED SUCCESSFULLY / / CON420, /USE IT TO HOLD 420 LITERAL TO START OUT RX1SAV, 420 /UNIT^20+7004 TO GO TO SYS HANDLER UNIT, 20 /<DENSITY^400>+<UNIT^20> THAT BOOTED OK / ENPUNCH / / ## SECONDARY BOOT ## / RELOC 2 /SECTION LOADING OVER PRIMARY BOOT 2 - 47 / STBOOT=. / / ONCE-ONLY CODE AFTER FIRST SECTOR IS TRANSFERED / ONCE, TAD XR /SINGLE=113, DOUBLE=213 CLL RAR /SINGLE=45, DOUBLE=105 TAD YR /SETTING UP POINTER TO SECTOR, TRACK, FIELD, ADDR DATA DCA YR /DAT01-1 OR DAT02-1 TAD I YR /GETTING SINGLE=774, DOUBLE=1374 (IN CASE OLD TAD RX1SAV /ADD IN 20^UNIT+7004 PRIMARY BOOT) DCA UNIT /PUT INTO 61: <DENSITY^400>+<UNIT^20> JMS NEXSEC /DESTROY LINKAGE TO ONCE ONLY CODE! XTRA, 0 /EXTRA TO MAKE ALL FIT / / / AUTO INCREMENT REGISTERS / XR, 61 /CONTINUE TO LOAD FIRST SECTOR AT 62 YR, DAT01-45-1 /SET UP POINTER TO DATA AREA / / SECTOR DONE, SET UP FOR NEXT / NEXSEC, JMP ONCE /END OF FIRST SECTOR, DO SET-UP CODE CDF 0 /DATA FIELD HERE TO USE AUTO INCR REGISTERS TAD I YR /GET DATA FIELD FOR PLACEMENT OF NEXT SECTOR SMA /SKIP IF MORE TO DO JMP EBOOT /END OF BOOT, DCA XFIELD /PLACE IN LINE TO SET DATA FIELD AC6 /GET AC OF 6 TO SET UP FLOPPY READ TAD UNIT /DENSITY AND UNIT NUMBER LCD TAD I YR /SECTOR FOR NEXT READ JMS LOAD /LOAD LEAVES AC ALONE TAD I YR /TRACK-SECTOR FOR NEXT READ JMS LOAD /LOAD REMAINS FROM PRIMARY BOOT TAD I YR /ADDRESS-TRACK-1 FOR NEXT READ / /FALL TO HANGGG WITH AC NON0 TO SHOW READ / / FOLLOWING TWO LOCATIONS MUST MATCH PRIMARY BOOT / HANGGG, SDN /SKIP IF DONE JMP LOAD+1 /NO, GO CHECK FOR TRANSFER READY / / SORT OUT ERROR, SILO DONE, READ DONE / SER /SKIP IF ERROR SKP /IS GOOD, CHECK WHETHER READ OR SILO HLT /ANY ERROR IS FATAL!! SNA /SKIP IF READY TO SILO (AC HAS LOAD ADDR) JMP NEXSEC /DONE WITH SILO (AC=0) GO TO NEXT SECTOR DCA XR /USE AUTO-INCR TO LOAD CORE JMP OVRFLW /GO TO LOCATIONS NOT FITTING UNDER 47 / / CODE TO EMPTY THE SILO TO CORE / XFIELD, CDF 0 /FIELD FOR TRANSFER PLACED HERE JMS LOAD /LOAD REMAINS FROM PRIMARY BOOT DCA I XR /PLACE NEXT WORD JMP XFIELD /WHEN THIS LOCATION IS PLACED, SECONDARY BOOT / /TAKES CONTROL, CONTINUE FIRST SECTOR AT 62 / / PRIMARY BOOT LOCATIONS 50-61 REMAIN INTACT / STATUS=. /REUSE FOR TEMPORARY / / ## REST OF SECONDARY BOOT ## / RELOC 62 /SECTION LOADING 62 - 213 / / LOCATIONS NOT FITTING WITHIN 2-47 SPACE / OVRFLW, XDR /FETCH READ STATUS FOR LATER DCA STATUS /TO FIGURE OUT IF A DOUBLE SIDED FLOPPY AC2 /CODE FOR SILO OPERATION TAD UNIT /UNIT AND DENSITY LCD /SET TO EMPTY SILO JMP XFIELD /GO TO SILO UNLOADING LOOP / / / / SINGLE DENSITY LOADING DATA / DAT01, 774 /CANCEL OUT 7004 WHEN ADDED TO 70X4 CDF 0 /2ND SECTOR FOR SINGLE DENSITY, FIELD 0 3 /SECTOR 3, INTERLEAVED AT 2 1-3 /TRACK 1 (MINUS SECTOR 3) 114-1-1 /2 THRU 47 + 62 THRU 113 FOR FIRST SECTOR / /-1 FOR TRACK, -1 FOR AUTO INCR CDF 0 /3RD SECTOR TO 7600 FIELD 0 5 1-5 7600-1-1 CDF 0 /4TH SECTOR, SECOND HALF OF PAGE 7 1-7 7700-1-1 CDF 10 /5TH SECTOR, TOP OF FIELD 1 21 /SECTOR 21 11-21 /OF TRACK 11 7600-11-1 /TO 7600 CDF 10 /6TH SECTOR, REST OF FIELD 1 23 11-23 7700-11-1 CDF 20 /7TH SECTOR, TOP OF FIELD 2 25 11-25 7600-11-1 CDF 20 /10TH SECTOR, REST OF FIELD 2 27 11-27 7700-11-1 16 /MARKER AND LITERALS TO MAKE DAT02=DAT01+40 MAGIC, 7623 /THIS WORD IN HANDLER HAS DENSITY, UNIT WORD L7605, 7605 /STARTING ADDR FOR HANDLER / / DOUBLE DENSITY LOADING DATA / DAT02, 1374 /MAKE 400+UNIT WHEN ADDED TO 70X4 CDF 0 /2ND SECTOR TO 7600 4 /INTERLEAVE OF 3 1-4 7600-1-1 CDF 10 15 5-15 7600-5-1 CDF 20 /3RD SECTOR TO 7600 OF FIELD 2 20 /SECOND HALF OF BLOCK 66 OCTAL 5-20 /ON TRACK 5 7600-5-1 16 /MARKER TO STOP WHOLE THING, ALSO LITERAL 16 / / I/O DONE, GO TO HANDLER / EBOOT, TAD UNIT /ENTER WITH AC=16 LCD /SET DONE FLAG FOR HANDLER TAD STATUS /FIND OUT IF DOUBLE SIDED DISK RTR /DOUBLE SIDED BIT TO LINK CLA RAR /DOUBLE SIDED BIT TO AC0 TAD UNIT /REST OF CONTROL WORD DCA I MAGIC /TO 7623 OF SYSTEM HANDLER JMP I L7605 /TO START UP SYSTEM / NDBOOT=. / / CODE THAT IS LOCATION SPECIFIC HAS !! IN COMMENTS / / ## CODE FOR SYSTEM HANDLER ## / RELOC *200 RELOC 7600 / / /USE DATA BREAKS FOR TEMPORARIES / QUO=7750 /QUOTIENT FOR DIVIDE == TRACK REMD=7751 /REMAINDER FOR DIVIDE == SECTOR REC=7752 /CURRENT LOGICAL SECTOR NUMBER RETRY=7753 /RETRIES COUNT / ZBLOCK 7 /REQUIRED BY BUILD / / / ENTRY POINT / SYS, VERSION L32, 32 /FALL THRU SOME LITERALS L1734, 1734 /WHICH MAY PUT STRAY STUFF IN AC 3 /!!REQUIRED AT 7612!! TO SHOW OS8 TWO PAGE HANDLER AC7775 /SET UP RETRY COUNTER DCA RETRY /RETRIES ARE OVER ENTIRE OPERATION RDF /GRAB CALLER'S FIELD TAD LLCDF0 /MAKE CDF TO IT DCA RESTOR /PUT IT BACK, GOING TO I/O ROUTINE ON PAGE 2 IOTYP, JMP FIRST /GO TO ONCE ONLY CODE, LATER USED AS VARIABLE / /HAS HEAD, DENSITY, UNIT FOR I/O REQUEST JMP RSTART /GO CALL SECOND PAGE, IOTYP FALLS THRU TO HERE / / LITERALS ETC. / L5000, 5000 / BOOTYP, /!!MUST BE AT 7623!! SECONDARY BOOT PUTS AT BOOT TIME / /4000 IF QUAD, 400 IF DOUBLE, AND 20 IF UNIT 1 IFZERO RXTYP-1 <0> /INITIAL VALUE MATCHES DEVICE TO ALLOW IFZERO RXTYP-2 <400> /BUILD ONTO VIRGIN MEDIA IFZERO RXTYP-3 <4400> /OTHERWISE, SECONDARY BOOT PUTS IN RIGHT STUFF LDENSW, DENSW /LOCATION ON SECOND PAGE L4110, LM3670, 4110 /VALUE WITH TWO USES LM32, -32 LLCDF0, CDF 0 / / ONCE ONLY CODE / FIRST, JMP MORE /LEAVING ADDITIONAL ONCE-ONLY SPACE / / FIX CDF TO 7642 / *7642 /!!CDF OR CIF MUST BE AT 7642!! MORE, CDF 20 /POINT TO OUR SECOND PAGE TAD BOOTYP /PICK UP BOOT WORD SNGDBL, CLL RAL /MAKE A WORD MINUS IF DOUBLE (OR QUAD) BOOTED SIZE, RTL /REUSE FOR CONSTANTS DCA SNGDBL /JUST FOR CONVENIENCE, THE BIT IS IN BOOTYP ANYHOW TAD QL3400 /ANY LITERAL IN RANGE 3400-3757 (LINK=0 HERE) TAD BOOTYP /FIGURE OUT SIZE OF MEDIA SMA SNL CLA /SKIP IF DOUBLE OR QUAD TAD L1734 /SINGLE TAD L4110 /S=6044, D&Q=4110 SNL /SKIP IF QUAD, ITS SIZE ALREADY THERE CLL CML RAR /OTHER TWO CASES DIVIDE BY TWO DCA SIZE /STORE S=7022, D=6044, Q=4110 TAD SNGDBL /MAKE DENSW, 7600 IF DOUBLE, 7700 IF SINGLE SPA CLA /SKIP IF SINGLE TAD L7700 TAD L7700 QL3400, DCA I LDENSW /MUST LIVE ON SECOND PAGE / / END OF ONCE-ONLY, (RE)START I/O OPERATION / RSTART, /AC MAY HAVE JUNK COMING IN!! AC3777 /MAKE A WORD WITH DENSITY AND UNIT BITS ONLY AND BOOTYP /FOR CONTRUCTING LCD ARGUMENTS DCA IOTYP /ALSO SHUTS OFF PATH TO ONCE-ONLY CODE! TAD SYS /AC HAS THE CALL ADDR RESTOR, HLT /SET DATA FIELD TO THAT OF CALLER CIF 20 JMP PAGE2 / / / CALL WITH AC NON0 TO DO DIVIDE / CALL WITH AC ZERO TO DO I/O RETRY (WHOLE OPERATION) / DIVSUB, 0 SNA CLA /SKIP IF REALLY A DIVIDE REQUEST JMP RSTART /NO, IT WAS AN ERROR RETRY!! DCA QUO /CLEAR DIVIDE QUOTIENT TAD BOOTYP /IS IT A TWO HEADER SKP /!!FAULTY USR CALL DOES JMS HERE (7700) HLT /HALT OUT SUCH AN OCCURRENCE!! L7700, SMA CLA /SKIP IF YES JMP SHUNT /NO, GO DO DIVIDE CLL /TO CHECK 12 BIT SIZE TAD REC /WHICH RECORD ARE WE WORKING ON TAD LM3670 /NUMBER OF SECTORS ON FIRST SIDE SNL CLA /SKIP IF SECOND SIDED IT JMP SHUNT /NO, JUST REGULAR TAD BOOTYP /MAKE IO FUNCTION WORD WITH SECOND HEAD BIT TAD L5000 /CONVERTS TO 20^UNIT +1400 DCA IOTYP TAD LM3670 /BUT DECREASE RECORD NUMBER SHUNT, TAD REC /THIS FOR TRACK-SECTOR DIVLOO, ISZ QUO /MAIN DIVIDE LOOP TAD LM32 /DIVIDE BY 26 TO GET TRACK SMA /SKIP IF DONE JMP DIVLOO TAD L32 /REMAINDER 0-25 DCA REMD /USE AS TEMPORARY UNTIL FINAL VALUE TAD SNGDBL /FIND OUT IF SINGLE BOOT SPA CLA /SKIP IF YES TAD REMD /MULTIPLY BY THREE FOR DOUBLE TAD REMD /AND BY TWO FOR SINGLE TAD REMD CLL IAC /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0 TAD LM32 /DIVIDE BY 26 TO GET SECTOR SMA SZA /SKIP IF DONE JMP .-2 TAD L32 /RESTORE POSITIVE VALUE TO BE SECTOR DCA REMD /WHEW, BUT WATCH IT, A FINAL CORRECTION COMING! TAD SNGDBL /IF LINK=0 AND SINGLE: 2,4,6,8,10,12,14,16... SERIES SMA SNL CLA /SKIP IF NOT THE SINGLE DENS. 1,3,5,7,9,,, SERIES ISZ REMD /NOW HAVE IT 2,4,6,8,10,12,14,16... CIF 20 /POP BACK TO OTHER PAGE JMP I DIVSUB /!!THIS IS IN LAST USABLE LOCATION, EXEC NEEDS 7744!! / / / / ## SECOND PAGE ## / RELOC *400 RELOC 7600 / / FETCH ARGUMENTS, ETC. / PAGE2, DCA FETCH /ENTER WITH ARGUMENT LIST ADDR IN AC RDF /SAFE HERE? TAD LCDIF0 /SET UP EXIT TO CALLER DCA EXFLD AC4000 /SET UP TO PUT R/W BIT TO LINK TAD I FETCH /FIRST ARGUMENT HAS FIELD FOR TRANSFER AND L70 /KEEPING ONLY FIELD TAD LCDF0 /MAKE CDF TO TRANSFER FIELD DCA BUFCDF /PLACE IN LINE FOR SILO LOOP CML RTL /0=WRITE, 2=READ DCA FN TAD I FETCH /MAKE CONTROL COUNT FOR TRANSFER RAL AND L7600 /COUNT OF WORDS CIA /0 FOR WHOLE FIELD DCA BC ISZ FETCH /NEXT ARGUMENT TAD I FETCH /BUFFER ADDRESS DCA BUF ISZ FETCH /NEXT TAD L100 /CARRY WITH DENSW IF SINGLE DENSITY TAD DENSW /SET TO COMPUTE SECTOR# FOR BLOCK# SMA CLA /SKIP IF DOUBLE, MULTIPLE BY 2 TAD I FETCH /SINGLE, MULTIPLY BY FOUR TAD I FETCH ISZ FETCH /MOVING POINTER TO ERROR EXIT CDF 0 /INDIRECT TO FIRST PAGE FOR CONSTANTS CLL RAL /FINAL PART OF MULTIPLY DCA I LREC /SAVE SECTOR NUMBER TAD I LSIZE /TOTAL SIZE OF MEDIA SZL /SKIP IF LEGAL BLOCK # JMP EXFLD /EXIT TO CALLER WITH BLOCK # IN AC LCDIF0, CIF CDF 0 /GO BACK TO FIRST PAGE JMS DIVSUB /SET UP TRACK AND SECTOR TAD FN /SPLIT READ AND WRITE SZA CLA /WRITE SKIPS JMP STREAD /READ STARTS IN MIDDLE OF LOOP / /WRITE FALLS TO NEXT LISTING PAGE / /WRITE FALLS THRU TO THIS LOOP / / TOP OF MAIN LOOP / TOP, TAD FN /SET SILO TO LOAD-UNLOAD JMS LDCMD /COMMAND TO CONTROLLER TAD DENSW /MAKE SILO LOOP COUNT, S=7700, D=7600 DCA FLPWC /LDCMD ENTRY SAFE TEMPORARY BUFCDF, HLT /CDF TO BUFFER FIELD PLACED HERE TRLOOP, TAD I BUF /IN CASE WRITE, FETCH A WORD STR /SKIP IF READY TO PASS DATA JMP .-1 /NO XDR /TO OR FROM AC DCA I BUF /PLACE WORD FOR READ, WRITE REPLACES SAME ISZ BUF /MOVE BUFFER POINTER, (MAY SKIP) L70, 70 ISZ FLPWC /DONE YET JMP TRLOOP TAD DENSW /ADDING 77 (SINGLE) 177 (DOUBLE) CMA /ONCE WE CMA, THAT IS TAD BC /LOOP CONTROL TO FINISH READ SNA JMP OKEX /OK, DONE DCA BC /REPLACE AND KEEP GOING / / MIDDLE OF MAIN LOOP / STREAD, TAD FN /READ STARTS HERE TAD L4 /TURN SILO COMMAND INTO READ-WRITE COMMAND JMS LDCMD /I/O COMMAND TO CONTROLLER TAD I LREMD /PRECOMPUTED SECTOR #; LDCMD SET FIELD TO 0 STR JMP .-1 XDR L7600, 7600 /CLEAR AC, AND IS LITERAL TAD I LQUO /TRACK # STR JMP .-1 XDR /TRACK # IS ALWAYS NON0 !! ISZ I LREC /MOVE TO NEXT RECORD NUMBER BACKER, CDF CIF 0 /GO BACK TO FIRST PAGE JMS DIVSUB /FOR TRACK AND SECTOR TAD L16 /WAIT FOR OPERATION TO COMPLETE JMS LDCMD ISZ BC /CHECK FOR WRITE EXIT JMP TOP /STILL MORE OKEX, ISZ FETCH /KICK TO OK EXIT EXFLD, HLT /CDF CIF TO CALLER JMP I FETCH /OUT / / LDCMD SUBROUTINE / FLPWC=. /ENTRY POINT A SAFE COUNT TEMPORARY LDCMD, 0 /CALL TO GIVE COMMAND TO CONTROLLER LCDF0, CDF 0 /INDIRECTS BACK TO FIRST PAGE TAD I LIOTYP /PUT IN UNIT, DENSITY, HEAD SDN /SKIP IF CONTROLLER READY JMP .-1 /NO LCD /COMMAND SER /SKIP IF AN ERROR JMP I LDCMD /NO ISZ I LRETRY /TRIED ENOUGH TIMES ALREADY? JMP BACKER /TO DIVSUB WITH AC=0 TO RETRY !!!!! AC4000 /HARD ERROR, GIVE BACK MINUS RESULT JMP EXFLD / / VARIABLES ETC. / BUF, 0 /POINTER TO CALLER'S BUFFER FETCH, 0 /POINTER TO CALL BC, 0 /CONTROL COUNT, WORDS TO TRANSFER FN, 0 /0 FOR WRITE, 2 FOR READ DENSW, 0 /7700 IF SINGLE DENSITY, 7600 IF DOUBLE DENSITY / / LITERALS / L4, 4 L16, 16 L100, 100 LIOTYP, IOTYP /POINTERS BACK TO FIRST PAGE LRETRY, RETRY LSIZE, SIZE LQUO, QUO LREC, REC LREMD, REMD |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 | /RX02 SYSTEM HANDLER / / THIS HANDLER WAS DESIGNED TO WORK WITH RX01, RX02, RX03 / / HOWEVER, ONE SINGLE BINARY CANNOT SUCCESSFULLY BE USED IN A / VIRGIN BUILD FOR ALL THREE DEVICES. IT IS CURRENTLY SET UP / TO BUILD AN RX02. / TO GENERATE A BINARY TO BUILD AN RX01, CHANGE THE RXTYP / EQUATE TO 1. FOR AN RX03 BUILD, CHANGE RXTYP TO 3. / RXTYP=2 /DEFAULT, BUILD ONTO AN RX02 / / / VERSION="M&77 / / AC1=CLL CLA IAC AC2=CLL CLA CML RTL AC6=CLL CLA CML IAC RTL /RX02'S MUST RUN ON AN OMNI-BUS !! AC4000=CLL CLA CML RAR AC3777=CLL CLA CMA RAR AC7775=CLL CLA CMA RTL / / DEVICE IOT SYMBOLIC EQUATES / LCD=6751 /LOAD COMMAND XDR=6752 /TRANSFER DATA STR=6753 /SKIP IF READY TO TRANSFER SER=6754 /SKIP ON ERROR SDN=6755 /SKIP ON DONE / / HEADER BLOCK FOR BUILD / *0 -1 /ONE ENTRY DEVICE RX8E DEVICE SYS 4320 /MULTI-TYPE RX HANDLER SYS&177+6000 /TWO PAGE HANDLER 0 /UNUSED IFZERO RXTYP-1 <756> /SIZE FOR BUILD IFZERO RXTYP-2 <1734> IFZERO RXTYP-3 <3670> / STBOOT-NDBOOT+12 /-SIZE (+12 FOR GAP) / / HERE IS A LISTING OF THE PRIMARY BOOT FOR CONVENIENCE / NOPUNCH / *20 / READ, TAD UNIT /TRY NEXT COMBINATION OF DENSITY AND UNIT TAD CON360 /ADDING IN 360 AND CON420 /KEEPING ONLY 420 BITS DCA UNIT /CYCLES 400,420,0,20,400,,,,,,,, AC6 /COMMAND TO READ DISK TAD UNIT /UNIT AND DENSITY LCD /COMMAND TO CONTROLLER AC1 /TO SET SECTOR AND TRACK TO 1 JMS LOAD /SECTOR TO CONTROLLER, LEAVES AC ALONE JMS LOAD /AND TRACK LITRAL, 7004 /LEAVING A 2 IN AC; SERVES AS LITERAL / / FOLLOWING IS PART OF WAIT LOOP, SAME SECONDARY BOOTS, OLD PRIMARY BOOT / START, SDN /HAS DONE COME UP; CODE STARTS HERE! JMP LOAD+1 /NO, GO CHECK FOR READY TO TRANSFER / / NOW, DONE OR ERROR / SER /SKIP ON AN ERROR, TRY ANOTHER DENSITY ETC. SNA /NASTY, AC=2 FOR ABOUT TO DO SILO, 0 ON START-UP JMP READ /START-UP, GO SET UP UNIT, THEN READ TO SILO TAD UNIT /AC ALREADY 2, PUT IN UNIT, DENSITY LCD /TO EMPTY THE SILO TAD UNIT /SET UP LOC 60 FOR OLD SECONDARY BOOT AND CON360 /KEEPING UNLY DENSITY BIT TAD LITRAL /ADDING IN 7004, BECAUSE THAT'S WHAT SYS WANTS DCA RX1SAV /OLD SECONDARY BOOT MOVES IT TO HANDLER CON360, 360 /LITERAL; EXECUTES IN LINE AS A NO-OP / /FALLS THRU TO NEXT PAGE OF LISTING / / / FOLLOWING CODE SAME AS OLD PRIMARY BOOT / JMS LOAD /GRAB NEXT ITEM FROM SILO DCA 2 /TRADITION; SECONDARY BOOT STARTS LOADING AT 2 ! ISZ 50 /INCREMENT LOAD ADDRESS JMP 47 /GO BACK FOR ANOTHER / / SECONDARY BOOT LOADS OVER PRIMARY BOOT UNIT LOCATION 47 IS LOADED, / THEN CONTROL PASSES TO SECONDARY BOOT / LOAD, 0 /SUBROUTINE TO GIVE AND TAKE DATA FROM CONTROLLER STR /IS HE READY TO TALK TO US? JMP START /NO, IS HE PERHAPS DONE WITH SILO, OR IN ERROR? XDR /YES, DATA IN OR OUT;IF DATA TO CONTROLLER, AC UNCHANGED JMP I LOAD /NO MAGIC, JUST EXIT FROM SUBROUTINE / / 60 GOES TO OLD SECONDARY BOOT / 61 HAS DENSITY AND UNIT THAT BOOTED SUCCESSFULLY / / CON420, /USE IT TO HOLD 420 LITERAL TO START OUT RX1SAV, 420 /UNIT^20+7004 TO GO TO SYS HANDLER UNIT, 20 /<DENSITY^400>+<UNIT^20> THAT BOOTED OK / ENPUNCH / / ## SECONDARY BOOT ## / RELOC 2 /SECTION LOADING OVER PRIMARY BOOT 2 - 47 / STBOOT=. / / ONCE-ONLY CODE AFTER FIRST SECTOR IS TRANSFERED / ONCE, TAD XR /SINGLE=113, DOUBLE=213 CLL RAR /SINGLE=45, DOUBLE=105 TAD YR /SETTING UP POINTER TO SECTOR, TRACK, FIELD, ADDR DATA DCA YR /DAT01-1 OR DAT02-1 TAD I YR /GETTING SINGLE=774, DOUBLE=1374 (IN CASE OLD TAD RX1SAV /ADD IN 20^UNIT+7004 PRIMARY BOOT) DCA UNIT /PUT INTO 61: <DENSITY^400>+<UNIT^20> JMS NEXSEC /DESTROY LINKAGE TO ONCE ONLY CODE! XTRA, 0 /EXTRA TO MAKE ALL FIT / / / AUTO INCREMENT REGISTERS / XR, 61 /CONTINUE TO LOAD FIRST SECTOR AT 62 YR, DAT01-45-1 /SET UP POINTER TO DATA AREA / / SECTOR DONE, SET UP FOR NEXT / NEXSEC, JMP ONCE /END OF FIRST SECTOR, DO SET-UP CODE CDF 0 /DATA FIELD HERE TO USE AUTO INCR REGISTERS TAD I YR /GET DATA FIELD FOR PLACEMENT OF NEXT SECTOR SMA /SKIP IF MORE TO DO JMP EBOOT /END OF BOOT, DCA XFIELD /PLACE IN LINE TO SET DATA FIELD AC6 /GET AC OF 6 TO SET UP FLOPPY READ TAD UNIT /DENSITY AND UNIT NUMBER LCD TAD I YR /SECTOR FOR NEXT READ JMS LOAD /LOAD LEAVES AC ALONE TAD I YR /TRACK-SECTOR FOR NEXT READ JMS LOAD /LOAD REMAINS FROM PRIMARY BOOT TAD I YR /ADDRESS-TRACK-1 FOR NEXT READ / /FALL TO HANGGG WITH AC NON0 TO SHOW READ / / FOLLOWING TWO LOCATIONS MUST MATCH PRIMARY BOOT / HANGGG, SDN /SKIP IF DONE JMP LOAD+1 /NO, GO CHECK FOR TRANSFER READY / / SORT OUT ERROR, SILO DONE, READ DONE / SER /SKIP IF ERROR SKP /IS GOOD, CHECK WHETHER READ OR SILO HLT /ANY ERROR IS FATAL!! SNA /SKIP IF READY TO SILO (AC HAS LOAD ADDR) JMP NEXSEC /DONE WITH SILO (AC=0) GO TO NEXT SECTOR DCA XR /USE AUTO-INCR TO LOAD CORE JMP OVRFLW /GO TO LOCATIONS NOT FITTING UNDER 47 / / CODE TO EMPTY THE SILO TO CORE / XFIELD, CDF 0 /FIELD FOR TRANSFER PLACED HERE JMS LOAD /LOAD REMAINS FROM PRIMARY BOOT DCA I XR /PLACE NEXT WORD JMP XFIELD /WHEN THIS LOCATION IS PLACED, SECONDARY BOOT / /TAKES CONTROL, CONTINUE FIRST SECTOR AT 62 / / PRIMARY BOOT LOCATIONS 50-61 REMAIN INTACT / STATUS=. /REUSE FOR TEMPORARY / / ## REST OF SECONDARY BOOT ## / RELOC 62 /SECTION LOADING 62 - 213 / / LOCATIONS NOT FITTING WITHIN 2-47 SPACE / OVRFLW, XDR /FETCH READ STATUS FOR LATER DCA STATUS /TO FIGURE OUT IF A DOUBLE SIDED FLOPPY AC2 /CODE FOR SILO OPERATION TAD UNIT /UNIT AND DENSITY LCD /SET TO EMPTY SILO JMP XFIELD /GO TO SILO UNLOADING LOOP / / / / SINGLE DENSITY LOADING DATA / DAT01, 774 /CANCEL OUT 7004 WHEN ADDED TO 70X4 CDF 0 /2ND SECTOR FOR SINGLE DENSITY, FIELD 0 3 /SECTOR 3, INTERLEAVED AT 2 1-3 /TRACK 1 (MINUS SECTOR 3) 114-1-1 /2 THRU 47 + 62 THRU 113 FOR FIRST SECTOR / /-1 FOR TRACK, -1 FOR AUTO INCR CDF 0 /3RD SECTOR TO 7600 FIELD 0 5 1-5 7600-1-1 CDF 0 /4TH SECTOR, SECOND HALF OF PAGE 7 1-7 7700-1-1 CDF 10 /5TH SECTOR, TOP OF FIELD 1 21 /SECTOR 21 11-21 /OF TRACK 11 7600-11-1 /TO 7600 CDF 10 /6TH SECTOR, REST OF FIELD 1 23 11-23 7700-11-1 CDF 20 /7TH SECTOR, TOP OF FIELD 2 25 11-25 7600-11-1 CDF 20 /10TH SECTOR, REST OF FIELD 2 27 11-27 7700-11-1 16 /MARKER AND LITERALS TO MAKE DAT02=DAT01+40 MAGIC, 7623 /THIS WORD IN HANDLER HAS DENSITY, UNIT WORD L7605, 7605 /STARTING ADDR FOR HANDLER / / DOUBLE DENSITY LOADING DATA / DAT02, 1374 /MAKE 400+UNIT WHEN ADDED TO 70X4 CDF 0 /2ND SECTOR TO 7600 4 /INTERLEAVE OF 3 1-4 7600-1-1 CDF 10 15 5-15 7600-5-1 CDF 20 /3RD SECTOR TO 7600 OF FIELD 2 20 /SECOND HALF OF BLOCK 66 OCTAL 5-20 /ON TRACK 5 7600-5-1 16 /MARKER TO STOP WHOLE THING, ALSO LITERAL 16 / / I/O DONE, GO TO HANDLER / EBOOT, TAD UNIT /ENTER WITH AC=16 LCD /SET DONE FLAG FOR HANDLER TAD STATUS /FIND OUT IF DOUBLE SIDED DISK RTR /DOUBLE SIDED BIT TO LINK CLA RAR /DOUBLE SIDED BIT TO AC0 TAD UNIT /REST OF CONTROL WORD DCA I MAGIC /TO 7623 OF SYSTEM HANDLER JMP I L7605 /TO START UP SYSTEM / NDBOOT=. / / CODE THAT IS LOCATION SPECIFIC HAS !! IN COMMENTS / / ## CODE FOR SYSTEM HANDLER ## / RELOC *200 RELOC 7600 / / /USE DATA BREAKS FOR TEMPORARIES / QUO=7750 /QUOTIENT FOR DIVIDE == TRACK REMD=7751 /REMAINDER FOR DIVIDE == SECTOR REC=7752 /CURRENT LOGICAL SECTOR NUMBER RETRY=7753 /RETRIES COUNT / ZBLOCK 7 /REQUIRED BY BUILD / / / ENTRY POINT / SYS, VERSION L32, 32 /FALL THRU SOME LITERALS L1734, 1734 /WHICH MAY PUT STRAY STUFF IN AC 3 /!!REQUIRED AT 7612!! TO SHOW OS8 TWO PAGE HANDLER AC7775 /SET UP RETRY COUNTER DCA RETRY /RETRIES ARE OVER ENTIRE OPERATION RDF /GRAB CALLER'S FIELD TAD LLCDF0 /MAKE CDF TO IT DCA RESTOR /PUT IT BACK, GOING TO I/O ROUTINE ON PAGE 2 IOTYP, JMP FIRST /GO TO ONCE ONLY CODE, LATER USED AS VARIABLE / /HAS HEAD, DENSITY, UNIT FOR I/O REQUEST JMP RSTART /GO CALL SECOND PAGE, IOTYP FALLS THRU TO HERE / / LITERALS ETC. / L5000, 5000 / BOOTYP, /!!MUST BE AT 7623!! SECONDARY BOOT PUTS AT BOOT TIME / /4000 IF QUAD, 400 IF DOUBLE, AND 20 IF UNIT 1 IFZERO RXTYP-1 <0> /INITIAL VALUE MATCHES DEVICE TO ALLOW IFZERO RXTYP-2 <400> /BUILD ONTO VIRGIN MEDIA IFZERO RXTYP-3 <4400> /OTHERWISE, SECONDARY BOOT PUTS IN RIGHT STUFF LDENSW, DENSW /LOCATION ON SECOND PAGE L4110, LM3670, 4110 /VALUE WITH TWO USES LM32, -32 LLCDF0, CDF 0 / / ONCE ONLY CODE / FIRST, JMP MORE /LEAVING ADDITIONAL ONCE-ONLY SPACE / / FIX CDF TO 7642 / *7642 /!!CDF OR CIF MUST BE AT 7642!! MORE, CDF 20 /POINT TO OUR SECOND PAGE TAD BOOTYP /PICK UP BOOT WORD SNGDBL, CLL RAL /MAKE A WORD MINUS IF DOUBLE (OR QUAD) BOOTED SIZE, RTL /REUSE FOR CONSTANTS DCA SNGDBL /JUST FOR CONVENIENCE, THE BIT IS IN BOOTYP ANYHOW TAD QL3400 /ANY LITERAL IN RANGE 3400-3757 (LINK=0 HERE) TAD BOOTYP /FIGURE OUT SIZE OF MEDIA SMA SNL CLA /SKIP IF DOUBLE OR QUAD TAD L1734 /SINGLE TAD L4110 /S=6044, D&Q=4110 SNL /SKIP IF QUAD, ITS SIZE ALREADY THERE CLL CML RAR /OTHER TWO CASES DIVIDE BY TWO DCA SIZE /STORE S=7022, D=6044, Q=4110 TAD SNGDBL /MAKE DENSW, 7600 IF DOUBLE, 7700 IF SINGLE SPA CLA /SKIP IF SINGLE TAD L7700 TAD L7700 QL3400, DCA I LDENSW /MUST LIVE ON SECOND PAGE / / END OF ONCE-ONLY, (RE)START I/O OPERATION / RSTART, /AC MAY HAVE JUNK COMING IN!! AC3777 /MAKE A WORD WITH DENSITY AND UNIT BITS ONLY AND BOOTYP /FOR CONTRUCTING LCD ARGUMENTS DCA IOTYP /ALSO SHUTS OFF PATH TO ONCE-ONLY CODE! TAD SYS /AC HAS THE CALL ADDR RESTOR, HLT /SET DATA FIELD TO THAT OF CALLER CIF 20 JMP PAGE2 / / / CALL WITH AC NON0 TO DO DIVIDE / CALL WITH AC ZERO TO DO I/O RETRY (WHOLE OPERATION) / DIVSUB, 0 SNA CLA /SKIP IF REALLY A DIVIDE REQUEST JMP RSTART /NO, IT WAS AN ERROR RETRY!! DCA QUO /CLEAR DIVIDE QUOTIENT TAD BOOTYP /IS IT A TWO HEADER SKP /!!FAULTY USR CALL DOES JMS HERE (7700) HLT /HALT OUT SUCH AN OCCURRENCE!! L7700, SMA CLA /SKIP IF YES JMP SHUNT /NO, GO DO DIVIDE CLL /TO CHECK 12 BIT SIZE TAD REC /WHICH RECORD ARE WE WORKING ON TAD LM3670 /NUMBER OF SECTORS ON FIRST SIDE SNL CLA /SKIP IF SECOND SIDED IT JMP SHUNT /NO, JUST REGULAR TAD BOOTYP /MAKE IO FUNCTION WORD WITH SECOND HEAD BIT TAD L5000 /CONVERTS TO 20^UNIT +1400 DCA IOTYP TAD LM3670 /BUT DECREASE RECORD NUMBER SHUNT, TAD REC /THIS FOR TRACK-SECTOR DIVLOO, ISZ QUO /MAIN DIVIDE LOOP TAD LM32 /DIVIDE BY 26 TO GET TRACK SMA /SKIP IF DONE JMP DIVLOO TAD L32 /REMAINDER 0-25 DCA REMD /USE AS TEMPORARY UNTIL FINAL VALUE TAD SNGDBL /FIND OUT IF SINGLE BOOT SPA CLA /SKIP IF YES TAD REMD /MULTIPLY BY THREE FOR DOUBLE TAD REMD /AND BY TWO FOR SINGLE TAD REMD CLL IAC /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0 TAD LM32 /DIVIDE BY 26 TO GET SECTOR SMA SZA /SKIP IF DONE JMP .-2 TAD L32 /RESTORE POSITIVE VALUE TO BE SECTOR DCA REMD /WHEW, BUT WATCH IT, A FINAL CORRECTION COMING! TAD SNGDBL /IF LINK=0 AND SINGLE: 2,4,6,8,10,12,14,16... SERIES SMA SNL CLA /SKIP IF NOT THE SINGLE DENS. 1,3,5,7,9,,, SERIES ISZ REMD /NOW HAVE IT 2,4,6,8,10,12,14,16... CIF 20 /POP BACK TO OTHER PAGE JMP I DIVSUB /!!THIS IS IN LAST USABLE LOCATION, EXEC NEEDS 7744!! / / / / ## SECOND PAGE ## / RELOC *400 RELOC 7600 / / FETCH ARGUMENTS, ETC. / PAGE2, DCA FETCH /ENTER WITH ARGUMENT LIST ADDR IN AC RDF /SAFE HERE? TAD LCDIF0 /SET UP EXIT TO CALLER DCA EXFLD AC4000 /SET UP TO PUT R/W BIT TO LINK TAD I FETCH /FIRST ARGUMENT HAS FIELD FOR TRANSFER AND L70 /KEEPING ONLY FIELD TAD LCDF0 /MAKE CDF TO TRANSFER FIELD DCA BUFCDF /PLACE IN LINE FOR SILO LOOP CML RTL /0=WRITE, 2=READ DCA FN TAD I FETCH /MAKE CONTROL COUNT FOR TRANSFER RAL AND L7600 /COUNT OF WORDS CIA /0 FOR WHOLE FIELD DCA BC ISZ FETCH /NEXT ARGUMENT TAD I FETCH /BUFFER ADDRESS DCA BUF ISZ FETCH /NEXT TAD L100 /CARRY WITH DENSW IF SINGLE DENSITY TAD DENSW /SET TO COMPUTE SECTOR# FOR BLOCK# SMA CLA /SKIP IF DOUBLE, MULTIPLE BY 2 TAD I FETCH /SINGLE, MULTIPLY BY FOUR TAD I FETCH ISZ FETCH /MOVING POINTER TO ERROR EXIT CDF 0 /INDIRECT TO FIRST PAGE FOR CONSTANTS CLL RAL /FINAL PART OF MULTIPLY DCA I LREC /SAVE SECTOR NUMBER TAD I LSIZE /TOTAL SIZE OF MEDIA SZL /SKIP IF LEGAL BLOCK # JMP EXFLD /EXIT TO CALLER WITH BLOCK # IN AC LCDIF0, CIF CDF 0 /GO BACK TO FIRST PAGE JMS DIVSUB /SET UP TRACK AND SECTOR TAD FN /SPLIT READ AND WRITE SZA CLA /WRITE SKIPS JMP STREAD /READ STARTS IN MIDDLE OF LOOP / /WRITE FALLS TO NEXT LISTING PAGE / /WRITE FALLS THRU TO THIS LOOP / / TOP OF MAIN LOOP / TOP, TAD FN /SET SILO TO LOAD-UNLOAD JMS LDCMD /COMMAND TO CONTROLLER TAD DENSW /MAKE SILO LOOP COUNT, S=7700, D=7600 DCA FLPWC /LDCMD ENTRY SAFE TEMPORARY BUFCDF, HLT /CDF TO BUFFER FIELD PLACED HERE TRLOOP, TAD I BUF /IN CASE WRITE, FETCH A WORD STR /SKIP IF READY TO PASS DATA JMP .-1 /NO XDR /TO OR FROM AC DCA I BUF /PLACE WORD FOR READ, WRITE REPLACES SAME ISZ BUF /MOVE BUFFER POINTER, (MAY SKIP) L70, 70 ISZ FLPWC /DONE YET JMP TRLOOP TAD DENSW /ADDING 77 (SINGLE) 177 (DOUBLE) CMA /ONCE WE CMA, THAT IS TAD BC /LOOP CONTROL TO FINISH READ SNA JMP OKEX /OK, DONE DCA BC /REPLACE AND KEEP GOING / / MIDDLE OF MAIN LOOP / STREAD, TAD FN /READ STARTS HERE TAD L4 /TURN SILO COMMAND INTO READ-WRITE COMMAND JMS LDCMD /I/O COMMAND TO CONTROLLER TAD I LREMD /PRECOMPUTED SECTOR #; LDCMD SET FIELD TO 0 STR JMP .-1 XDR L7600, 7600 /CLEAR AC, AND IS LITERAL TAD I LQUO /TRACK # STR JMP .-1 XDR /TRACK # IS ALWAYS NON0 !! ISZ I LREC /MOVE TO NEXT RECORD NUMBER BACKER, CDF CIF 0 /GO BACK TO FIRST PAGE JMS DIVSUB /FOR TRACK AND SECTOR TAD L16 /WAIT FOR OPERATION TO COMPLETE JMS LDCMD ISZ BC /CHECK FOR WRITE EXIT JMP TOP /STILL MORE OKEX, ISZ FETCH /KICK TO OK EXIT EXFLD, HLT /CDF CIF TO CALLER JMP I FETCH /OUT / / LDCMD SUBROUTINE / FLPWC=. /ENTRY POINT A SAFE COUNT TEMPORARY LDCMD, 0 /CALL TO GIVE COMMAND TO CONTROLLER LCDF0, CDF 0 /INDIRECTS BACK TO FIRST PAGE TAD I LIOTYP /PUT IN UNIT, DENSITY, HEAD SDN /SKIP IF CONTROLLER READY JMP .-1 /NO LCD /COMMAND SER /SKIP IF AN ERROR JMP I LDCMD /NO ISZ I LRETRY /TRIED ENOUGH TIMES ALREADY? JMP BACKER /TO DIVSUB WITH AC=0 TO RETRY !!!!! AC4000 /HARD ERROR, GIVE BACK MINUS RESULT JMP EXFLD / / VARIABLES ETC. / BUF, 0 /POINTER TO CALLER'S BUFFER FETCH, 0 /POINTER TO CALL BC, 0 /CONTROL COUNT, WORDS TO TRANSFER FN, 0 /0 FOR WRITE, 2 FOR READ DENSW, 0 /7700 IF SINGLE DENSITY, 7600 IF DOUBLE DENSITY / / LITERALS / L4, 4 L16, 16 L100, 100 LIOTYP, IOTYP /POINTERS BACK TO FIRST PAGE LRETRY, RETRY LSIZE, SIZE LQUO, QUO LREC, REC LREMD, REMD |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | /2 TC08 HANDLER FOR BUILD / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /1 TC08 HANDLER FOR BUILD *0 -10 DEVICE TC;DEVICE DTA0;4160;10;ZBLOCK 2 DEVICE TC;DEVICE DTA1;4160;11;ZBLOCK 2 DEVICE TC;DEVICE DTA2;4160;12;ZBLOCK 2 DEVICE TC;DEVICE DTA3;4160;13;ZBLOCK 2 DEVICE TC;DEVICE DTA4;4160;14;ZBLOCK 2 DEVICE TC;DEVICE DTA5;4160;15;ZBLOCK 2 DEVICE TC;DEVICE DTA6;4160;16;ZBLOCK 2 DEVICE TC;DEVICE DTA7;4160;17;ZBLOCK 2 DTRB=6772 DTLB=6774 DTXA=6764 DTCA=6762 DTRA=6761 DTSF=6771 TCVERSION="A&77 *200 /DECTAPE HANDLERS(PAGE RELOCATABLE) FOR PS/8 MONITOR DFUN, 0 DM203, -203 DBLOCK, 0 DBLKCT, 0 D3, 3 WC, 7754 CA, 7755 DERRCT, TCVERSION DTA0, ISZ DTANO DTA1, ISZ DTANO DTA2, ISZ DTANO DTA3, ISZ DTANO DTA4, ISZ DTANO DTA5, ISZ DTANO DTA6, ISZ DTANO DTA7, ISZ DTANO D400, 400 CLA CLL CMA RTL DCA DERRCT /SET TO REPEAT THREE TIMES IN CASE OF ERROR TAD DTANO CMA TAD DTATAD /GENERATE "TAD DTAN" WHERE DTAN IS THE ONE THAT DCA DTANO /WAS CALLED. CLA CLL CML RTR TAD DTANO /ALSO GENERATE "DCA DTAN" SO WE CAN RESTORE IT DCA DTADCA RDF TAD DCDIF0 DCA DSTOP /STORE CALLING FIELD FOR RETURNING DTANO, 0 /GET CALLING ADDRESS DCA DTA /SAVE IT TAD DTAISZ DTADCA, 0 /RESTORE ENTRY POINT DLOC=DTADCA DTAISZ, ISZ DTANO /BUMP DTANO FOR VARIOUS GROOVY REASONS /WHICH WILL BE APPARENT LATER TAD I DTA DCA DFUN /STORE AWAY FUNCTION WORD FOR FUTURE USE ISZ DTA DT7140, CLL CMA /THE "CLL" IS ONLY NECESSARY TO FORM THE 7140 TAD I DTA DCA DLOC /BUFFER ADDRESS -1 ISZ DTA TAD I DTA CLL RAL /MULTIPLY BY 2 FOR 256-WORD SIMULATED RECORDS DCA DBLOCK /DECTAPE BLOCK # ISZ DTA DTATRY, TAD WC DCDIF0, CDF CIF 0 DCA I CA TAD DFUN RAR CLA CML /COMPLEMENT OF BIT 11 OF DFUN NOW IN THE LINK TAD DTANO /DTANO = "TAD DTAN+1" RTR RTR /THESE TWO ROTATES FORM THE FLLOWING NUMBER /IN THE AC: YYYF00101000, WHERE YYY =DTAN+1 /AND F IS THE COMPLEMENT OF DFUN(11) TAD DT7140 /THE MAGIC STEP - THIS SIMULTANEOUSLY BUMPS DOWN /THE RECORD NUMBER IN AC(0-2) AND TRANSFORMS /THE REST OF THE AC TO F10001000 WHICH IS A /SEARCH IN DIRECTION F(F=1 MEANS BACKWARDS) WITH /THE MOTION BIT ON. DTCA DTXA DTLB /SET DECTAPE FIELD TO 0 FOR SEARCHING JMP DC+3 /JUMP INTO THE BLOCK SEARCH ROUTINE DERR, RTL /DECTAPE STATUS REGISTER B IS USUALLY IN THE AC HERE RAL D7600, 7600 /GET THE "END OF TAPE" FLAG INTO THE LINK AND CLEAR THE AC TAD D200 /GET MOTION BIT DC, SZL /AND, IF LINK IS ON DTATAD, TAD D400 /REVERSE DIRECTION OF MOTION DTXA TAD D200 KRS TAD DM203 SNA CLA KSF /CHECK FOR ^C TYPED JMP DTAWT TAD D7600 /**PROBLEM: LINK IS RANDOM YET MUST BE 0 DCA DTA /FAKE DTA SO WE GO TO LOC 7600 IN FIELD 0 JMP DSTOP1 /AFTER STOPPING THE TAPE DTAWT, DTSF DTRB JMP .-1 /WAIT FOR SEARCH TO COMPLETE SPA /HAS AN ERROR OCCURED? JMP DERR /DO SOMETHING APPROPRIATE DTRA RTL CMA RTL SNL CLA /WAS MOTIOZ OF TAPE FORWARDS? TAD D3 /NO, SO ONLY SUCCEED IF WE ARE 3 BLOCKS IN FRONT /OF TARGET BLOCK TAD I WC CMA TAD DBLOCK CMA /AFTER THIS OPERATION WE HAVE THE FOLLOWING 4 POSSIBILITIES /1)AC=0, L=1 /SEARCH COMPLETE /2)AC=0, L=0 /RIGHT PLACE ON TAPE,WRONG DIRECTION /3)AC .GT. 0, L=0 /WEVE PASSED THE CORRECT BLOCK /4)AC .GT. 0, L=1 /WE HAVENT REACHED THE CORRECT BLOCK YET SZA CLA JMP DC SNL JMP DTATAD /DC+1 TAD DLOC DCA I CA /SET THE CURRENT ADDRESS REGISTER TO THE BUFFER -1 TAD DFUN DTLB /SET FIELD TO BUFFER FIELD TAD D7700 D200, AND DFUN CLL RAL DCA DBLKCT /GET UNCOMPLEMENTED WORD COUNT INTO DBLKCT RAL IAC CLL CML RTL RTL /FORM A 50 IF L=1, A 30 IF L=0 DL, DTXA /XOR IN 50(WRITE) OR 30(READ) OR 0(CONTINUE PREVIOUS OP) TAD D7600 DCA I WC /READ/WRITE 128 WORDS FROM/INTO EACH BLOCK DTSF DTRB JMP .-1 CLL CML /SET ERROR FLAG ON INITIALLY D7700, SMA CLA JMP DJ ISZ DERRCT /ERROR-IS IT THE THIRD? JMP DTATRY /NO-TRY AGAIN JMP DSTOP /3 ERRORS-STOP TAPE! DJ, TAD DBLKCT TAD D7600 SNA /BUMP WORD COUNT BY -128 AND SEE IF 0 /ALSO REVERSE LINK. JMP DOVER /YES - DONE DCA DBLKCT /RESTORE BUMPED WORD COUNT JMP DL /AND LOOP DOVER, ISZ DTA /SKIP ERROR RETURN DSTOP, HLT /RESTORE CALLING FIELD DSTOP1, TAD D200 /STOP THE TAPE DTXA DCA DTANO /INITIALIZE DTANO FOR THE NEXT CALL RAR /GET ERROR CODE FROM LINK INTO AC0 JMP I DTA /AND EXIT DTA, 0 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 | /2 TC08 SYSTEM HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / VERSION="B&77 *0 -2 DEVICE TC08;DEVICE SYS;4161;2007;0;1341 DEVICE TC08;DEVICE DTA0;4161;1007;0;1341 STARTB-ENDB-1 /NEGATIVE OF LENGTH OF BOOTSTRAP NOPUNCH *7600 ENPUNCH STARTB, TAD B600 /THIS CODE ONLY EXECUTED ON DMS-TYPE BOOTSTRAP DTCA DTXA /ALL IT DOES IS SIMULATE THE OTHER TYPE OF BOOTSTRAP DTSF /MORAL: DISK MONITOR SYSTEM SUCKS JMP .-1 DCA BOOTX DCA BOOTX+1 /FUDGE TO MAKE USE OF SOME COMMON CODE TAD B620 JMP BOOT3 /START READING OVER OURSELVES WITH RECORD 0 AGAIN ZBLOCK 7611-. BM7642, -7641 /MUST BE BEFORE 7617 BOOT1, TAD 7755 TAD BM7642 SNA CLA /WATCH THE PROGRESS OF THE READ JMP BOOT2 /WHEN IT GETS PAST 7643, SWITCH TO FIELD 1 NOP /LOADS OVER DTSF IN 7616 JMP BOOT1 /LOADS OVER JMP .-1 IN 7617 - STARTS BOOTSTRAP BOOT2, TAD B10 DTLB /ZAP A 10 INTO STATUS REG B TO LOAD INTO FIELD 1 DTSF /FROM HERE ON - LOAD THE FIELD 1 RESIDENT INTO FIELD 1 JMP .-1 BOOT3, DTXA /CONTINUE READING NEXT RECORD(ALSO SEE CODE AT 7600) DTLB /INTO FIELD 0 TAD B7577 DCA 7755 /PAGE 7600 DCA 7754 BOOTX, CDF CIF 10 JMP 7642 /JUMP INTO WAIT LOOP IN FIELD 1 JMP BOOT1 /DISK MONITOR FUDGE - JUMP INTO WAITING LOOP B7577, 7577 B10, 10 B600, 600 B620, 620 ZBLOCK 7642-. DCA 7744 DTSF /THIS IS LOADED INTO FIELD 1 WITH MONITOR RESIDENT JMP .-1 /IT IS IN THE CD OUTPUT AREA AND SO WILL BE ZAPPED CDF CIF 0 /BY THE KEYBOARD MONITOR ENDB, JMP 7605 /OK, FIELD 0 RESIDENT READ IN, START UP MONITOR /BOOTSTRAP FOR DECTAPE MONITOR IS THE SAME AS FOR THE /DEC LIBRARY SYSTEM, RL MONITOR AND POLY BASIC - OR JUST /READ RECORD 0 INTO 7600 AND TRANSFER TO 7600 A LA DISK /MONITOR SYSTEM ON DECTAPE DTRB=6772 DTLB=6774 DTXA=6764 DTCA=6762 DTRA=6761 DTSF=6771 *200 NOPUNCH *7600 ENPUNCH SBLOCK=7776 /RELIC FROM OS/8 ASSEMBLY ZBLOCK 7 SHNDLR, VERSION CLA CLL CMA RTL DCA SYSCNT /3 TRIES ON ERROR RDF TAD SCIF DCA SFIELD /RETURN FIELD SETUP TAD I SHNDLR DCA SFUN ISZ SHNDLR CLA CMA TAD I SHNDLR DCA SLOC /BUFFER ADDRESS-1 ISZ SHNDLR STRY, TAD S410 /SETUP DTA0 TO DO SEARCH REVERSE DTCA DTXA /BUT MOTION BIT IS NOT ON DTLB CLA CMA CLL RAL DCA SCA /7776=SBLOCK FROM OS/8 ASSEMBLY TAD SFUN RTR RTR SERR, RTL RAL /LAST 4 INST. PUT MOTION BIT IN LINK /IF THIS BIT WAS SET IN THE CALLING /SEQUENCE, SEARCH STARTS FORWARD. S7600, 7600 TAD S200 SC, SZL TAD S400 DTXA /ZAP MOTION BIT ON DTSF DTRB JMP .-1 SPA /CHECK FOR ANY ERRORS JMP SERR DTRA /NO ERRORS RTL CMA RTL /COMPLEMENT OF DIRECTION TO LINK /IF LINK ON, SEARCHING FORWARD. SNL CLA CML RTL TAD SBLOCK /SEARCH FOR ONE RECORD BEFORE THE /REQUIRED ONE. THEN REVERSE DIRECTION CMA TAD I SHNDLR TAD I SHNDLR /X+X=2*X; RECORDS TO BLOCKS NOP NOP CMA SZA CLA /IS IT PROPER RECORD? JMP SC SNL /YES..IF LINK IS ON,WAS FWD SRCH JMP SC+1 /REVERSE..REVERSE TAPE MOTION /AND SEARCH FORWARD TAD SLOC DCA SCA TAD SFUN DTLB /SET UP FIELD TAD SFUN CLL RAL AND S7600 DCA SBLKCT /BLOCK COUNT RAL /FUNCTION TO BIT 11 IFNZRO .-7700 <NZERR> SKP HLT /TO PROTECT AGAINST BAD PROGRAMMERS IAC CLL CML RTL RTL /FORMS EITHER READ OR WRITE SL, DTXA TAD S7600 DCA SWC /TRANSFER 200 (8) DTSF DTRB JMP .-1 CLL CML /IN CASE OF FATAL ERROR SPA CLA JMP SERR2 TAD SBLKCT TAD S7600 SNA /ALL DONE? JMP SOVER /YES DCA SBLKCT JMP SL SERR2, ISZ SYSCNT /TRY AGAIN? JMP STRY SKP /DON'T BOTHER SOVER, ISZ SHNDLR ISZ SHNDLR TAD S200 /STOP THE TAPE DTXA RAR /GIVE FATAL RETURN SFIELD, HLT JMP I SHNDLR SCIF, CIF 0 S400, 400 S200, 200 S410, 410 SBLKCT=7753 SYSCNT=7750 SFUN=7751 SLOC=7752 SWC=7754 SCA=7755 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 | /4 TD8E HANDLER FOR BUILD..TD8E-A / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -2 DEVICE TD8A;DEVICE DTA0;4210;4010;ZBLOCK 2 DEVICE TD8A;DEVICE DTA1;4210;4014;ZBLOCK 2 SDSS=6771 /SKIP ON SINGLE LINE FLAG SDST=6772 /SKIP ON TIME ERROR SDSQ=6773 /SKIP ON QUAD LINE FLAG SDLC=6774 /LOAD TAPE COMMAND REGISTER SDLD=6775 /LOAD DATA REGISTER SDRC=6776 /READ COMMAND REGISTER SDRD=6777 /READ DATA REGISTER TDVERSION="D&77 /V3 CHANGES: /1. VERSION # IS NOW 1 /2. PARITY ^C IS NOW LEGAL /3. ^C CHECK NO LONGER WILL ADVANCE READER /MAINTENANCE RELEASE CHANGES: /4. FIXED ^C BUG /5. MADE CODE IMPROVEMENTS /6. FIXED RETRY BUG *200 NXINIT, 7600 /CLEAR AC HERE!!! JMS I CINIT2 /PART OF INITIALIZATION..DO THE PART BASE2, DCA JINIT /ON SECOND PAGE AND THEN TO JINIT JMP JINIT BUFF, 0 PGCT, 0 FUNCT, 0 C1000, 1000 DTA0, TDVERSION /ENTRY FOR UNIT 0 CLA CLL JMP DTA1X UNIT, 0 /FILLER WORD DTA1, TDVERSION /ENTRY FOR UNIT 1 CLA CLL CML TAD DTA1 DCA DTA0 /PICK UP ARGS AT DTA0 DTA1X, RAR DCA UNIT /UNIT # FROM LINK RDF TAD C6203 DCA LEAVE /SET UP EXIT FROM HANDLER TAD I DTA0 DCA FUNCT /SAVE FUNCTION WORD TAD FUNCT CLL RAL C200, AND CM200 /GET A PAGE COUNT DCA PGCT TAD FUNCT C374, AND C70 /ISOLATE FIELD OF TRANSFER TAD C6203 DCA XFIELD ISZ DTA0 /POINT TO BUFFER TAD I DTA0 DCA BUFF ISZ DTA0 /POINT TO RECORD TAD I DTA0 CLL RAL /CONVERT TO DECTAPE BLOCKS DCA TBLOCK ISZ DTA0 /POINT TO ERROR RET. C6203, CIF CDF 0 JINIT, JMP INIT /FIRST TIME THRU IT GETS EXECUTED /THE RETURN FROM INIT ZEROES IT CLA CLL CMA RTL DCA ERCNT /3 ERROR TRIES TAD UNIT DCA I CXUNIT JMS I CSELCT /CHECK FOR SELEC ERROR JMP .-1 /LOOPS IF NO ^C AND SELECT ERROR TAD FUNCT CLL RAR JMP GO /OK.. START THE SEARCH TRWCOM, SDST /TIME OR CHECK SUM ERROR? SZA CLA JMP TRY3 /YES TRY UP TO 3 TIMES TAD PGCT /NO.. IS PAGE COUNT EXHAUSTED? TAD CM200 SNA JMP EXIT /YES.. DONE THIS TRANSFER DCA PGCT /NEW PAGE COUNT ISZ TBLOCK TAD BUFF TAD C200 /GET NEW BUFFER ADDRESS DCA BUFF CLL CML /FORCE FORWARD MOTION GO, CLA CML RTR /PUT IN DIRECTION BIT TAD C1000 TAD UNIT SDLC /INITIATE THE MOTION JMS I CRDQAD /WAIT FOR 8 LINES TO PASS JMS I CRDQAD M20, 7760 /DON'T CARE IF IT DOES SKIP!!! TSRCH, SDSS /WAIT FOR BLOCK MARK OR END ZONE JMP .-1 SDRC CLL RTL /DIRECTION TO LINK, DATA TO AC 4-9 AND C374 /ISOLATE M.T BITS TAD M110 /IS IT END ZONE? SNA JMP ENDZ /YES..DO SOMETHING REASONABLE TAD M20 /HOW ABOUT BLOCK MARK? SZA CLA JMP TSRCH /NEITHER..KEEP LOOKING SDRD /WHAT IS THIS BLOCK'S #? SZL /IF IN REVERSE, LOOK FOR 3 BEFORE TAD TC3 /THE ACTUAL TARGET BLOCK CMA TAD TBLOCK CMA SNA /IS THIS THE BLOCK? JMP TFOUND /YES..HAVE CORRECT ONE M110, SZL SNA CLA /ARE WE HEADED PROPERLY? JMP TSRCH /YES.. KEEP LOOKING ENDZ, SDRC /IF WE ARE IN END ZONE FORWARD, WE LOSE CLL RTL JMP GO /EXECUTE TURN AROUND AND SEARCH TRY3, CLA CLL /V3C ISZ ERCNT /TRIED 3 TIMES? JMP GO JMP FATAL EXIT, ISZ DTA0 /NORMAL RETURN CLL CML FATAL, TAD UNIT /STOP TAPE FIRST SDLC CLA CML RAR /EITHER 0 OR 4000 IN AC LEAVE, HLT /GETS CIF CDF N JMP I DTA0 INIT, JMS . /FIND OUT WHERE WE GOT LOADED BASE, TAD CRDQAD SPA /NEGATIVE ENDS LIST JMP NXINIT TAD INIT DCA CRDQAD ISZ .-1 ISZ BASE JMP BASE CRDQAD, R4LINE-BASE CINIT2, INIT2-BASE CSELCT, SELECT-BASE CXUNIT, XUNIT-BASE *367 TFOUND, SZL CLA /ARE WE IN RIGHT DIRECTION JMP GO /NOT YET TAD FUNCT CLL RAL /R/W TO LINK CLA C70, 70 TC3, 3 TAD BUFF XFIELD, HLT /CONTROL 'TRICKLES THROUGH TBLOCK=DTA1 ERCNT=INIT+1 CM200=NXINIT DTA2=DTA0 DTA3=DTA1 DTA4=DTA0 DTA5=DTA1 DTA6=DTA0 DTA7=DTA1 *400 CIF 0 /WE ARE IN FIELD 0 DCA XBUFF RAR DCA XFUNCT /READ/WRITE TO FUNCTION RGRD, SDSS JMP .-1 /LOOK FOR REVERSE GUARD PATTERN SDRC AND K77 TAD CM32 SZA CLA /IF NOT REV. GUARD, KEEP LOOKING JMP RGRD TAD C7600 DCA WORDS /128 WORDS/BLOCK TAD XFUNCT K7700, SMA CLA /IS IT READ OR WRITE? JMP TREAD SDRC /CHECK FOR WRITE LOCKOUT AND TC300 CLL /SETUP TO RETRY IF WRITE LOCK SZA CLA JMP I CTRY3 /IF LOCKED OUT, ERROR JMS R4LINE /SKIP A WORD C7600, 7600 /CLA TAD C1400 TAD XUNIT SDLC /TURN ON WRITE HEAD CLA CMA JMS W4LINE /7777 IN REV. CHECKSUM CLA CMA DCA CSUM /AND ALSO TAPE CHECKSUM WRTLP, TAD I XBUFF JMS W4LINE ISZ XBUFF /INCREMENT BUFF. ADD. K77, 77 ISZ WORDS /DONE A BLOCK? JMP WRTLP JMS W4LINE /A 129 TH WORD OF 0 JMS GCHK /GET 6 BIT CHECKSUM JMS W4LINE /WRITE IT TO TAPE JMS W4LINE /LET CHECK SUM FINISH JMP I CRWCOM /SEE IF WE ARE FINISHED TREAD, JMS R4LINE JMS R4LINE /SKIP CONTROL WORDS JMS R4LINE AND K77 /CHECKSUM TAD K7700 DCA CSUM RDLP, JMS R4LINE JMS EFUN /ADD WORD TO CHECKSUM DCA I XBUFF ISZ XBUFF TC300, 300 ISZ WORDS /DONE BLOCK? JMP RDLP JMS R4LINE JMS EFUN /CHECK SUM 129 TH WORD JMS R4LINE AND K7700 /READ CHECKSUM JMS EFUN JMS GCHK /COMPARE TAPE AND OUR CHECKSUM JMP I CRWCOM W4LINE, 0 /ADD TO CHECKSUM AND WRITE A 12 BIT JMS EFUN /WORD SDSQ JMP .-1 /SKIP ON QUAD LINE FLAG SDLD CLA /AC IS NOT CLEARED AFTER SDLD JMP I W4LINE R4LINE, 0 /WAIT FOR QUAD FLAG AND READ SDSQ JMP .-1 SDRD JMP I R4LINE EFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM CMA DCA ETMP /ACTUALLY CHECKSUMS ON DECTAPE ARE TAD ETMP /EQUIVALENCE OF ALL WORDS IN A RCORD AND CSUM /6 BITS AT A TIME. SINCE EQUIVALENCE CIA /IS ASSOCIATIVE WE DO IT 12 AT A TIME CLL RAL /AND CONDENSE LATER. TAD ETMP /IDENTITIES USED ARE: TAD CSUM /A+B=(A.XOR.B)+2*(A.AND.B) DCA CSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B) TAD ETMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B)) CMA JMP I EFUN GCHK, 0 /FORM 6 BIT CHECKSUM CLA TAD CSUM CLL CMA RTL RTL RTL JMS EFUN CLA CLL CML TAD CSUM AND K7700 JMP I GCHK INIT2, 0 /TIS INITIALIZES LOCS IN PAGE 2 INIT3, TAD CTRY3 SNA JMP I INIT2 /0 ENDS LIST TAD INIT2 DCA CTRY3 /UPDATE THE LIST ISZ .-1 ISZ INIT3 JMP INIT3 CTRY3, TRY3-BASE2 CRWCOM, TRWCOM-BASE2 XBUFF, 0 /0 MUST TERMINATE IT!! CM32, -32 C1400, 1400 SELECT, 0 /THIS ROUTINE CHECKS FOR SELECT TAD XUNIT /AND ^C TYPED SDLC SDRC /GET STATUS AND SEE IF SELECT ERROR ON AND C100 SNA CLA ISZ SELECT /NOPE .TAKE NORMAL OUT KSF /SEE IF FLAG IS UP JMP I SELECT /NO..EXIT TAD C7600 KRS TAD (-7603 /IS IT A ^C? SZA CLA JMP I SELECT /NO..EXIT JMP I C7600 C100, 100 XFUNCT=INIT2 CSUM=XFUNCT+1 WORDS=CSUM+1 ETMP=WORDS+1 XUNIT=ETMP+1 $$$$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 | /4 TD8E HANDLER FOR BUILD..TD8E-B / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -2 DEVICE TD8B;DEVICE DTA2;4210;4011;ZBLOCK 2 DEVICE TD8B;DEVICE DTA3;4210;4015;ZBLOCK 2 SDSS=6761 /SKIP ON SINGLE LINE FLAG SDST=6762 /SKIP ON TIME ERROR SDSQ=6763 /SKIP ON QUAD LINE FLAG SDLC=6764 /LOAD TAPE COMMAND REGISTER SDLD=6765 /LOAD DATA REGISTER SDRC=6766 /READ COMMAND REGISTER SDRD=6767 /READ DATA REGISTER TDVERSION="D&77 /V3 CHANGES: /1. VERSION # IS NOW 1 /2. PARITY ^C IS NOW LEGAL /3. ^C CHECK NO LONGER ADVANCES READER /MAINTENANCE RELEASE CHANGES: /4. FIXED ^C BUG /5. MADE CODE IMPROVEMENTS /6. FIXED RETRY BUG *200 NXINIT, 7600 /CLEAR AC HERE!!! JMS I CINIT2 BASE2, DCA JINIT JMP JINIT CRDQAD, R4LINE-BASE CINIT2, INIT2-BASE CSELCT, SELECT-BASE CXUNIT, XUNIT-BASE BUFF, 4000 /MUST BE NEGATIVE INITIALLY DTA0, TDVERSION /ENTRY FOR UNIT 0 CLA CLL JMP DTA1X UNIT, 0 /FILLER WORD DTA1, TDVERSION /ENTRY FOR UNIT 1 CLA CLL CML TAD DTA1 DCA DTA0 /PICK UP ARGS AT DTA0 DTA1X, RAR DCA UNIT /UNIT # FROM LINK RDF TAD C6203 DCA LEAVE /SET UP EXIT FROM HANDLER JINIT, JMP INIT TAD I DTA0 DCA FUNCT /SAVE FUNCTION WORD TAD FUNCT CLL RAL C200, AND CM200 /GET A PAGE COUNT DCA PGCT TAD FUNCT C374, AND C70 /ISOLATE FIELD OF TRANSFER TAD C6203 DCA XFIELD ISZ DTA0 /POINT TO BUFFER TAD I DTA0 DCA BUFF ISZ DTA0 /POINT TO RECORD TAD I DTA0 CLL RAL /CONVERT TO DECTAPE BLOCKS DCA TBLOCK ISZ DTA0 /POINT TO ERROR RET. C6203, CIF CDF 0 /THE RETURN FROM INIT ZEROES IT CLA CLL CMA RTL DCA ERCNT /3 ERROR TRIES TAD UNIT DCA I CXUNIT JMS I CSELCT /CHECK FOR SELEC ERROR JMP .-1 /LOOPS IF NO ^C AND SELECT ERROR TAD FUNCT CLL RAR JMP GO /OK.. START THE SEARCH TRWCOM, SDST /TIME OR CHECK SUM ERROR? SZA CLA JMP TRY3 /YES TRY UP TO 3 TIMES TAD PGCT /NO.. IS PAGE COUNT EXHAUSTED? TAD CM200 SNA JMP EXIT /YES.. DONE THIS TRANSFER DCA PGCT /NEW PAGE COUNT ISZ TBLOCK TAD BUFF TAD C200 /GET NEW BUFFER ADDRESS DCA BUFF CLL CML /FORCE FORWARD MOTION GO, CLA CML RTR /PUT IN DIRECTION BIT TAD C1000 TAD UNIT SDLC /INITIATE THE MOTION JMS I CRDQAD /WAIT FOR 8 LINES TO PASS JMS I CRDQAD M20, 7760 /DON'T CARE IF IT DOES SKIP!!! TSRCH, SDSS /WAIT FOR BLOCK MARK OR END ZONE JMP .-1 SDRC CLL RTL /DIRECTION TO LINK, DATA TO AC 4-9 AND C374 /ISOLATE M.T BITS TAD M110 /IS IT END ZONE? SNA JMP ENDZ /YES..DO SOMETHING REASONABLE TAD M20 /HOW ABOUT BLOCK MARK? SZA CLA JMP TSRCH /NEITHER..KEEP LOOKING SDRD /WHAT IS THIS BLOCK'S #? SZL /IF IN REVERSE, LOOK FOR 3 BEFORE TAD TC3 /THE ACTUAL TARGET BLOCK CMA TAD TBLOCK CMA SNA /IS THIS THE BLOCK? JMP TFOUND /YES..HAVE CORRECT ONE M110, SZL SNA CLA /ARE WE HEADED PROPERLY? JMP TSRCH /YES.. KEEP LOOKING ENDZ, SDRC /IF WE ARE IN END ZONE FORWARD, WE LOSE CLL RTL JMP GO /EXECUTE TURN AROUND AND SEARCH TRY3, CLA CLL /V3C ISZ ERCNT /TRIED 3 TIMES? JMP GO JMP FATAL EXIT, ISZ DTA0 /NORMAL RETURN CLL CML FATAL, TAD UNIT /STOP TAPE FIRST SDLC CLA CML RAR /EITHER 0 OR 4000 IN AC LEAVE, HLT /GETS CIF CDF N JMP I DTA0 INIT, JMS . /FIND OUT WHERE WE GOT LOADED BASE, TAD CRDQAD SPA /NEGATIVE ENDS LIST JMP NXINIT TAD INIT DCA CRDQAD ISZ .-1 ISZ BASE JMP BASE PGCT, 0 FUNCT, 0 C1000, 1000 *367 TFOUND, SZL CLA /ARE WE IN RIGHT DIRECTION JMP GO /NOT YET TAD FUNCT CLL RAL /R/W TO LINK CLA C70, 70 TC3, 3 TAD BUFF XFIELD, HLT /CONTROL 'TRICKLES THROUGH TBLOCK=DTA1 ERCNT=INIT+1 CM200=NXINIT DTA2=DTA0 DTA3=DTA1 DTA4=DTA0 DTA5=DTA1 DTA6=DTA0 DTA7=DTA1 *400 CIF 0 /WE ARE IN FIELD 0 DCA XBUFF RAR DCA XFUNCT /READ/WRITE TO FUNCTION RGRD, SDSS JMP .-1 /LOOK FOR REVERSE GUARD PATTERN SDRC AND K77 TAD CM32 SZA CLA /IF NOT REV. GUARD, KEEP LOOKING JMP RGRD TAD C7600 DCA WORDS /128 WORDS/BLOCK TAD XFUNCT K7700, SMA CLA /IS IT READ OR WRITE? JMP TREAD SDRC /CHECK FOR WRITE LOCKOUT AND TC300 CLL /SETUP TO RETRY IF WRITE LOCK SZA CLA JMP I CTRY3 /IF LOCKED OUT, ERROR JMS R4LINE /SKIP A WORD C7600, 7600 /CLA TAD C1400 TAD XUNIT SDLC /TURN ON WRITE HEAD CLA CMA JMS W4LINE /7777 IN REV. CHECKSUM CLA CMA DCA CSUM /AND ALSO TAPE CHECKSUM WRTLP, TAD I XBUFF JMS W4LINE ISZ XBUFF /INCREMENT BUFF. ADD. K77, 77 ISZ WORDS /DONE A BLOCK? JMP WRTLP JMS W4LINE /A 129 TH WORD OF 0 JMS GCHK /GET 6 BIT CHECKSUM JMS W4LINE /WRITE IT TO TAPE JMS W4LINE /LET CHECK SUM FINISH JMP I CRWCOM /SEE IF WE ARE FINISHED TREAD, JMS R4LINE JMS R4LINE /SKIP CONTROL WORDS JMS R4LINE AND K77 /CHECKSUM TAD K7700 DCA CSUM RDLP, JMS R4LINE JMS EFUN /ADD WORD TO CHECKSUM DCA I XBUFF ISZ XBUFF TC300, 300 ISZ WORDS /DONE BLOCK? JMP RDLP JMS R4LINE JMS EFUN /CHECK SUM 129 TH WORD JMS R4LINE AND K7700 /READ CHECKSUM JMS EFUN JMS GCHK /COMPARE TAPE AND OUR CHECKSUM JMP I CRWCOM W4LINE, 0 /ADD TO CHECKSUM AND WRITE A 12 BIT JMS EFUN /WORD SDSQ JMP .-1 /SKIP ON QUAD LINE FLAG SDLD CLA /AC IS NOT CLEARED AFTER SDLD JMP I W4LINE R4LINE, 0 /WAIT FOR QUAD FLAG AND READ SDSQ JMP .-1 SDRD JMP I R4LINE EFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM CMA DCA ETMP /ACTUALLY CHECKSUMS ON DECTAPE ARE TAD ETMP /EQUIVALENCE OF ALL WORDS IN A RCORD AND CSUM /6 BITS AT A TIME. SINCE EQUIVALENCE CIA /IS ASSOCIATIVE WE DO IT 12 AT A TIME CLL RAL /AND CONDENSE LATER. TAD ETMP /IDENTITIES USED ARE: TAD CSUM /A+B=(A.XOR.B)+2*(A.AND.B) DCA CSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B) TAD ETMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B)) CMA JMP I EFUN GCHK, 0 /FORM 6 BIT CHECKSUM CLA TAD CSUM CLL CMA RTL RTL RTL JMS EFUN CLA CLL CML TAD CSUM AND K7700 JMP I GCHK INIT2, 0 /TIS INITIALIZES LOCS IN PAGE 2 INIT3, TAD CTRY3 SNA JMP I INIT2 /0 ENDS LIST TAD INIT2 DCA CTRY3 /UPDATE THE LIST ISZ .-1 ISZ INIT3 JMP INIT3 CTRY3, TRY3-BASE2 CRWCOM, TRWCOM-BASE2 XBUFF, 0 /0 MUST TERMINATE IT!! CM32, -32 C1400, 1400 SELECT, 0 /THIS ROUTINE CHECKS FOR SELECT TAD XUNIT /AND ^C TYPED SDLC SDRC /GET STATUS AND SEE IF SELECT ERROR ON AND C100 SNA CLA ISZ SELECT /NOPE .TAKE NORMAL OUT KSF /SEE IF FLAG IS UP JMP I SELECT /NO..EXIT TAD C7600 KRS TAD (-7603 /IS IT ^C? SZA CLA JMP I SELECT /NO..EXIT JMP I C7600 C100, 100 XFUNCT=INIT2 CSUM=XFUNCT+1 WORDS=CSUM+1 ETMP=WORDS+1 XUNIT=ETMP+1 $$$$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 | /4 TD8E HANDLER FOR BUILD..TD8E-C / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -2 DEVICE TD8C;DEVICE DTA4;4210;4012;ZBLOCK 2 DEVICE TD8C;DEVICE DTA5;4210;4016;ZBLOCK 2 SDSS=6751 /SKIP ON SINGLE LINE FLAG SDST=6752 /SKIP ON TIME ERROR SDSQ=6753 /SKIP ON QUAD LINE FLAG SDLC=6754 /LOAD TAPE COMMAND REGISTER SDLD=6755 /LOAD DATA REGISTER SDRC=6756 /READ COMMAND REGISTER SDRD=6757 /READ DATA REGISTER TDVERSION="D&77 /V3 CHANGES: /1. VERSION # IS NOW 1 /2. PARITY ^C IS NOW LEGAL /3. INITIALIZATION BUG FIXED /4. ^C CHECK NO LONGER ADVANCES READER /MAINTENANCE RELEASE CHANGES: /5. FIXED ^C BUG /6. MADE CODING IMPROVEMENTS /7. FIXED RETRY BUG *200 NXINIT, 7600 /CLEAR AC HERE!!! JMS I CINIT2 /PART OF INITIALIZATION..DO THE PART BASE2, DCA JINIT /ON SECOND PAGE AND THEN TO JINIT JMP JINIT CRDQAD, R4LINE-BASE CINIT2, INIT2-BASE CSELCT, SELECT-BASE CXUNIT, XUNIT-BASE BUFF, 4000 /V3 PGCT, 0 DTA0, TDVERSION /ENTRY FOR UNIT 0 CLA CLL JMP DTA1X UNIT, 0 /FILLER WORD DTA1, TDVERSION /ENTRY FOR UNIT 1 CLA CLL CML TAD DTA1 DCA DTA0 /PICK UP ARGS AT DTA0 DTA1X, RAR DCA UNIT /UNIT # FROM LINK RDF TAD C6203 DCA LEAVE /SET UP EXIT FROM HANDLER JINIT, JMP INIT TAD I DTA0 DCA FUNCT /SAVE FUNCTION WORD TAD FUNCT CLL RAL C200, AND CM200 /GET A PAGE COUNT DCA PGCT TAD FUNCT C374, AND C70 /ISOLATE FIELD OF TRANSFER TAD C6203 DCA XFIELD ISZ DTA0 /POINT TO BUFFER TAD I DTA0 DCA BUFF ISZ DTA0 /POINT TO RECORD TAD I DTA0 CLL RAL /CONVERT TO DECTAPE BLOCKS DCA TBLOCK ISZ DTA0 /POINT TO ERROR RET. C6203, CIF CDF 0 CLA CLL CMA RTL DCA ERCNT /3 ERROR TRIES TAD UNIT DCA I CXUNIT JMS I CSELCT /CHECK FOR SELEC ERROR JMP .-1 /LOOPS IF NO ^C AND SELECT ERROR TAD FUNCT CLL RAR JMP GO /OK.. START THE SEARCH TRWCOM, SDST /TIME OR CHECK SUM ERROR? SZA CLA JMP TRY3 /YES TRY UP TO 3 TIMES TAD PGCT /NO.. IS PAGE COUNT EXHAUSTED? TAD CM200 SNA JMP EXIT /YES.. DONE THIS TRANSFER DCA PGCT /NEW PAGE COUNT ISZ TBLOCK TAD BUFF TAD C200 /GET NEW BUFFER ADDRESS DCA BUFF CLL CML /FORCE FORWARD MOTION GO, CLA CML RTR /PUT IN DIRECTION BIT TAD C1000 TAD UNIT SDLC /INITIATE THE MOTION JMS I CRDQAD /WAIT FOR 8 LINES TO PASS JMS I CRDQAD M20, 7760 /DON'T CARE IF IT DOES SKIP!!! TSRCH, SDSS /WAIT FOR BLOCK MARK OR END ZONE JMP .-1 SDRC CLL RTL /DIRECTION TO LINK, DATA TO AC 4-9 AND C374 /ISOLATE M.T BITS TAD M110 /IS IT END ZONE? SNA JMP ENDZ /YES..DO SOMETHING REASONABLE TAD M20 /HOW ABOUT BLOCK MARK? SZA CLA JMP TSRCH /NEITHER..KEEP LOOKING SDRD /WHAT IS THIS BLOCK'S #? SZL /IF IN REVERSE, LOOK FOR 3 BEFORE TAD TC3 /THE ACTUAL TARGET BLOCK CMA TAD TBLOCK CMA SNA /IS THIS THE BLOCK? JMP TFOUND /YES..HAVE CORRECT ONE M110, SZL SNA CLA /ARE WE HEADED PROPERLY? JMP TSRCH /YES.. KEEP LOOKING ENDZ, SDRC /IF WE ARE IN END ZONE FORWARD, WE LOSE CLL RTL JMP GO /EXECUTE TURN AROUND AND SEARCH TRY3, CLA CLL /V3C ISZ ERCNT /TRIED 3 TIMES? JMP GO JMP FATAL EXIT, ISZ DTA0 /NORMAL RETURN CLL CML FATAL, TAD UNIT /STOP TAPE FIRST SDLC CLA CML RAR /EITHER 0 OR 4000 IN AC LEAVE, HLT /GETS CIF CDF N JMP I DTA0 INIT, JMS . /FIND OUT WHERE WE GOT LOADED BASE, TAD CRDQAD SPA /NEGATIVE ENDS LIST JMP NXINIT TAD INIT DCA CRDQAD ISZ .-1 ISZ BASE JMP BASE FUNCT, 0 C1000, 1000 *367 TFOUND, SZL CLA /ARE WE IN RIGHT DIRECTION JMP GO /NOT YET TAD FUNCT CLL RAL /R/W TO LINK CLA C70, 70 TC3, 3 TAD BUFF XFIELD, HLT /CONTROL 'TRICKLES THROUGH TBLOCK=DTA1 ERCNT=INIT+1 CM200=NXINIT DTA2=DTA0 DTA3=DTA1 DTA4=DTA0 DTA5=DTA1 DTA6=DTA0 DTA7=DTA1 *400 CIF 0 /WE ARE IN FIELD 0 DCA XBUFF RAR DCA XFUNCT /READ/WRITE TO FUNCTION RGRD, SDSS JMP .-1 /LOOK FOR REVERSE GUARD PATTERN SDRC AND K77 TAD CM32 SZA CLA /IF NOT REV. GUARD, KEEP LOOKING JMP RGRD TAD C7600 DCA WORDS /128 WORDS/BLOCK TAD XFUNCT K7700, SMA CLA /IS IT READ OR WRITE? JMP TREAD SDRC /CHECK FOR WRITE LOCKOUT AND TC300 CLL /SETUP TO RETRY IF WRITE LOCK SZA CLA JMP I CTRY3 /IF LOCKED OUT, ERROR JMS R4LINE /SKIP A WORD C7600, 7600 /CLA TAD C1400 TAD XUNIT SDLC /TURN ON WRITE HEAD CLA CMA JMS W4LINE /7777 IN REV. CHECKSUM CLA CMA DCA CSUM /AND ALSO TAPE CHECKSUM WRTLP, TAD I XBUFF JMS W4LINE ISZ XBUFF /INCREMENT BUFF. ADD. K77, 77 ISZ WORDS /DONE A BLOCK? JMP WRTLP JMS W4LINE /A 129 TH WORD OF 0 JMS GCHK /GET 6 BIT CHECKSUM JMS W4LINE /WRITE IT TO TAPE JMS W4LINE /LET CHECK SUM FINISH JMP I CRWCOM /SEE IF WE ARE FINISHED TREAD, JMS R4LINE JMS R4LINE /SKIP CONTROL WORDS JMS R4LINE AND K77 /CHECKSUM TAD K7700 DCA CSUM RDLP, JMS R4LINE JMS EFUN /ADD WORD TO CHECKSUM DCA I XBUFF ISZ XBUFF TC300, 300 ISZ WORDS /DONE BLOCK? JMP RDLP JMS R4LINE JMS EFUN /CHECK SUM 129 TH WORD JMS R4LINE AND K7700 /READ CHECKSUM JMS EFUN JMS GCHK /COMPARE TAPE AND OUR CHECKSUM JMP I CRWCOM W4LINE, 0 /ADD TO CHECKSUM AND WRITE A 12 BIT JMS EFUN /WORD SDSQ JMP .-1 /SKIP ON QUAD LINE FLAG SDLD CLA /AC IS NOT CLEARED AFTER SDLD JMP I W4LINE R4LINE, 0 /WAIT FOR QUAD FLAG AND READ SDSQ JMP .-1 SDRD JMP I R4LINE EFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM CMA DCA ETMP /ACTUALLY CHECKSUMS ON DECTAPE ARE TAD ETMP /EQUIVALENCE OF ALL WORDS IN A RCORD AND CSUM /6 BITS AT A TIME. SINCE EQUIVALENCE CIA /IS ASSOCIATIVE WE DO IT 12 AT A TIME CLL RAL /AND CONDENSE LATER. TAD ETMP /IDENTITIES USED ARE: TAD CSUM /A+B=(A.XOR.B)+2*(A.AND.B) DCA CSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B) TAD ETMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B)) CMA JMP I EFUN GCHK, 0 /FORM 6 BIT CHECKSUM CLA TAD CSUM CLL CMA RTL RTL RTL JMS EFUN CLA CLL CML TAD CSUM AND K7700 JMP I GCHK INIT2, 0 /TIS INITIALIZES LOCS IN PAGE 2 INIT3, TAD CTRY3 SNA JMP I INIT2 /0 ENDS LIST TAD INIT2 DCA CTRY3 /UPDATE THE LIST ISZ .-1 ISZ INIT3 JMP INIT3 CTRY3, TRY3-BASE2 CRWCOM, TRWCOM-BASE2 XBUFF, 0 /0 MUST TERMINATE IT!! CM32, -32 C1400, 1400 SELECT, 0 /THIS ROUTINE CHECKS FOR SELECT TAD XUNIT /AND ^C TYPED SDLC SDRC /GET STATUS AND SEE IF SELECT ERROR ON AND C100 SNA CLA ISZ SELECT /NOPE .TAKE NORMAL OUT KSF /SEE IF FLAG IS UP JMP I SELECT /NO..EXIT TAD C7600 KRS TAD (-7603 /IS IT ^C? SZA CLA JMP I SELECT /NO..EXIT JMP I C7600 C100, 100 XFUNCT=INIT2 CSUM=XFUNCT+1 WORDS=CSUM+1 ETMP=WORDS+1 XUNIT=ETMP+1 $$$$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 | /4 TD8E HANDLER FOR BUILD..TD8E-D / / / / / / / / / /COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -2 DEVICE TD8D;DEVICE DTA6;4210;4013;ZBLOCK 2 DEVICE TD8D;DEVICE DTA7;4210;4017;ZBLOCK 2 SDSS=6741 /SKIP ON SINGLE LINE FLAG SDST=6742 /SKIP ON TIME ERROR SDSQ=6743 /SKIP ON QUAD LINE FLAG SDLC=6744 /LOAD TAPE COMMAND REGISTER SDLD=6745 /LOAD DATA REGISTER SDRC=6746 /READ COMMAND REGISTER SDRD=6747 /READ DATA REGISTER TDVERSION="D&77 /V3 CHANGES: /1. VERSION # IS NOW 1 /2. PARITY ^C IS NOW LEGAL /3. INITIALIZATION BUG FIXED /4. ^C CHECK NO LONGER ADVANCES READER /MAINTENANCE RELEASE CHANGES: /5. FIXED ^C BUG /6. MADE CODE IMPROVEMENTS /7. FIXED RETRY BUG *200 NXINIT, 7600 /CLEAR AC HERE!!! JMS I CINIT2 /PART OF INITIALIZATION..DO THE PART BASE2, DCA JINIT /ON SECOND PAGE AND THEN TO JINIT JMP JINIT CRDQAD, R4LINE-BASE CINIT2, INIT2-BASE CSELCT, SELECT-BASE CXUNIT, XUNIT-BASE BUFF, 4000 /V3 PGCT, 0 FUNCT, 0 DTA0, TDVERSION /ENTRY FOR UNIT 0 CLA CLL JMP DTA1X UNIT, 0 /FILLER WORD DTA1, TDVERSION /ENTRY FOR UNIT 1 CLA CLL CML TAD DTA1 DCA DTA0 /PICK UP ARGS AT DTA0 DTA1X, RAR DCA UNIT /UNIT # FROM LINK RDF TAD C6203 DCA LEAVE /SET UP EXIT FROM HANDLER JINIT, JMP INIT TAD I DTA0 DCA FUNCT /SAVE FUNCTION WORD TAD FUNCT CLL RAL C200, AND CM200 /GET A PAGE COUNT DCA PGCT TAD FUNCT C374, AND C70 /ISOLATE FIELD OF TRANSFER TAD C6203 DCA XFIELD ISZ DTA0 /POINT TO BUFFER TAD I DTA0 DCA BUFF ISZ DTA0 /POINT TO RECORD TAD I DTA0 CLL RAL /CONVERT TO DECTAPE BLOCKS DCA TBLOCK ISZ DTA0 /POINT TO ERROR RET. C6203, CIF CDF 0 CLA CLL CMA RTL DCA ERCNT /3 ERROR TRIES TAD UNIT DCA I CXUNIT JMS I CSELCT /CHECK FOR SELEC ERROR JMP .-1 /LOOPS IF NO ^C AND SELECT ERROR TAD FUNCT CLL RAR JMP GO /OK.. START THE SEARCH TRWCOM, SDST /TIME OR CHECK SUM ERROR? SZA CLA JMP TRY3 /YES TRY UP TO 3 TIMES TAD PGCT /NO.. IS PAGE COUNT EXHAUSTED? TAD CM200 SNA JMP EXIT /YES.. DONE THIS TRANSFER DCA PGCT /NEW PAGE COUNT ISZ TBLOCK TAD BUFF TAD C200 /GET NEW BUFFER ADDRESS DCA BUFF CLL CML /FORCE FORWARD MOTION GO, CLA CML RTR /PUT IN DIRECTION BIT TAD C1000 TAD UNIT SDLC /INITIATE THE MOTION JMS I CRDQAD /WAIT FOR 8 LINES TO PASS JMS I CRDQAD M20, 7760 /DON'T CARE IF IT DOES SKIP!!! TSRCH, SDSS /WAIT FOR BLOCK MARK OR END ZONE JMP .-1 SDRC CLL RTL /DIRECTION TO LINK, DATA TO AC 4-9 AND C374 /ISOLATE M.T BITS TAD M110 /IS IT END ZONE? SNA JMP ENDZ /YES..DO SOMETHING REASONABLE TAD M20 /HOW ABOUT BLOCK MARK? SZA CLA JMP TSRCH /NEITHER..KEEP LOOKING SDRD /WHAT IS THIS BLOCK'S #? SZL /IF IN REVERSE, LOOK FOR 3 BEFORE TAD TC3 /THE ACTUAL TARGET BLOCK CMA TAD TBLOCK CMA SNA /IS THIS THE BLOCK? JMP TFOUND /YES..HAVE CORRECT ONE M110, SZL SNA CLA /ARE WE HEADED PROPERLY? JMP TSRCH /YES.. KEEP LOOKING ENDZ, SDRC /IF WE ARE IN END ZONE FORWARD, WE LOSE CLL RTL JMP GO /EXECUTE TURN AROUND AND SEARCH TRY3, CLA CLL /V3C ISZ ERCNT /TRIED 3 TIMES? JMP GO JMP FATAL EXIT, ISZ DTA0 /NORMAL RETURN CLL CML FATAL, TAD UNIT /STOP TAPE FIRST SDLC CLA CML RAR /EITHER 0 OR 4000 IN AC LEAVE, HLT /GETS CIF CDF N JMP I DTA0 INIT, JMS . /FIND OUT WHERE WE GOT LOADED BASE, TAD CRDQAD SPA /NEGATIVE ENDS LIST JMP NXINIT TAD INIT DCA CRDQAD ISZ .-1 ISZ BASE JMP BASE C1000, 1000 *367 TFOUND, SZL CLA /ARE WE IN RIGHT DIRECTION JMP GO /NOT YET TAD FUNCT CLL RAL /R/W TO LINK CLA C70, 70 TC3, 3 TAD BUFF XFIELD, HLT /CONTROL 'TRICKLES THROUGH TBLOCK=DTA1 ERCNT=INIT+1 CM200=NXINIT DTA2=DTA0 DTA3=DTA1 DTA4=DTA0 DTA5=DTA1 DTA6=DTA0 DTA7=DTA1 *400 CIF 0 /WE ARE IN FIELD 0 DCA XBUFF RAR DCA XFUNCT /READ/WRITE TO FUNCTION RGRD, SDSS JMP .-1 /LOOK FOR REVERSE GUARD PATTERN SDRC AND K77 TAD CM32 SZA CLA /IF NOT REV. GUARD, KEEP LOOKING JMP RGRD TAD C7600 DCA WORDS /128 WORDS/BLOCK TAD XFUNCT K7700, SMA CLA /IS IT READ OR WRITE? JMP TREAD SDRC /CHECK FOR WRITE LOCKOUT AND TC300 CLL /SETUP TO RETRY IF WRITE LOCK SZA CLA JMP I CTRY3 /IF LOCKED OUT, ERROR JMS R4LINE /SKIP A WORD C7600, 7600 /CLA TAD C1400 TAD XUNIT SDLC /TURN ON WRITE HEAD CLA CMA JMS W4LINE /7777 IN REV. CHECKSUM CLA CMA DCA CSUM /AND ALSO TAPE CHECKSUM WRTLP, TAD I XBUFF JMS W4LINE ISZ XBUFF /INCREMENT BUFF. ADD. K77, 77 ISZ WORDS /DONE A BLOCK? JMP WRTLP JMS W4LINE /A 129 TH WORD OF 0 JMS GCHK /GET 6 BIT CHECKSUM JMS W4LINE /WRITE IT TO TAPE JMS W4LINE /LET CHECK SUM FINISH JMP I CRWCOM /SEE IF WE ARE FINISHED TREAD, JMS R4LINE JMS R4LINE /SKIP CONTROL WORDS JMS R4LINE AND K77 /CHECKSUM TAD K7700 DCA CSUM RDLP, JMS R4LINE JMS EFUN /ADD WORD TO CHECKSUM DCA I XBUFF ISZ XBUFF TC300, 300 ISZ WORDS /DONE BLOCK? JMP RDLP JMS R4LINE JMS EFUN /CHECK SUM 129 TH WORD JMS R4LINE AND K7700 /READ CHECKSUM JMS EFUN JMS GCHK /COMPARE TAPE AND OUR CHECKSUM JMP I CRWCOM W4LINE, 0 /ADD TO CHECKSUM AND WRITE A 12 BIT JMS EFUN /WORD SDSQ JMP .-1 /SKIP ON QUAD LINE FLAG SDLD CLA /AC IS NOT CLEARED AFTER SDLD JMP I W4LINE R4LINE, 0 /WAIT FOR QUAD FLAG AND READ SDSQ JMP .-1 SDRD JMP I R4LINE EFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM CMA DCA ETMP /ACTUALLY CHECKSUMS ON DECTAPE ARE TAD ETMP /EQUIVALENCE OF ALL WORDS IN A RCORD AND CSUM /6 BITS AT A TIME. SINCE EQUIVALENCE CIA /IS ASSOCIATIVE WE DO IT 12 AT A TIME CLL RAL /AND CONDENSE LATER. TAD ETMP /IDENTITIES USED ARE: TAD CSUM /A+B=(A.XOR.B)+2*(A.AND.B) DCA CSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B) TAD ETMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B)) CMA JMP I EFUN GCHK, 0 /FORM 6 BIT CHECKSUM CLA TAD CSUM CLL CMA RTL RTL RTL JMS EFUN CLA CLL CML TAD CSUM AND K7700 JMP I GCHK INIT2, 0 /TIS INITIALIZES LOCS IN PAGE 2 INIT3, TAD CTRY3 SNA JMP I INIT2 /0 ENDS LIST TAD INIT2 DCA CTRY3 /UPDATE THE LIST ISZ .-1 ISZ INIT3 JMP INIT3 CTRY3, TRY3-BASE2 CRWCOM, TRWCOM-BASE2 XBUFF, 0 /0 MUST TERMINATE IT!! CM32, -32 C1400, 1400 SELECT, 0 /THIS ROUTINE CHECKS FOR SELECT TAD XUNIT /AND ^C TYPED SDLC SDRC /GET STATUS AND SEE IF SELECT ERROR ON AND C100 SNA CLA ISZ SELECT /NOPE .TAKE NORMAL OUT KSF /SEE IF FLAG IS UP JMP I SELECT /NO..EXIT TAD C7600 KRS TAD (-7603 /IS IT ^C? SZA CLA JMP I SELECT /NO..EXIT JMP I C7600 C100, 100 XFUNCT=INIT2 CSUM=XFUNCT+1 WORDS=CSUM+1 ETMP=WORDS+1 XUNIT=ETMP+1 $$$$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 | /3 TD8E SYSTEM RESIDENT (12K) / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / *0 -3 DEVICE TD8E;DEVICE SYS;4211;6007;0;1341 DEVICE TD8E;DEVICE DTA0;4211;5007;0;1341 DEVICE TD8E;DEVICE DTA1;4211;SDTA1&177+5000;0;1341 TDBEGN-TD77-1 RELOC 7360 /THE BINARY GETS LOADED INTO 27220 INITIALY, AND /WRITTEN OUT AS PART OF RECORD 0. WHEN THE 30 WORD /BOOTSTRAP IS USED, THIS CODE GETS READ INTO 7400. SDSS=6771 SDST=6772 SDSQ=6773 SDLC=6774 SDLD=6775 SDRC=6776 SDRD=6777 TDBEGN, ZBLOCK 20 TDBOOT, TAD K7600 /128 WORDS PER PAGE DCA TDWCT SDSS /WAIT FOR A BLOCK MARK (TAPE IS JMP .-1 /STILL MOVING) SDRC AND TD77 TAD KM26 /IS IT A BLOCK MARK? SZA CLA JMP TDBOOT+2 /NO..WAIT A WHILE LONGER SDRD /GET THE BLOCK NO. TDBKNO, TAD TDM14 /NEED DECTAPE BLOCKS 154 & 155 (REC. 66) SZA CLA JMP TDBOOT+2 /NOT YET, BUSTER TDRGRD, SDSS JMP .-1 /NOW LET'S LOOK FOR A REVERSE GUARD WORD SDRC AND TD77 TAD KM32 SZA CLA JMP TDRGRD /KEEP LOOKING FOR IT JMS TDRQD JMS TDRQD JMS TDRQD /SKIP CONTROL WORDS CDF 10 /LOAD UP FIELD 1 TDREAD, JMS TDRQD /GET A DATA WORD DCA I TDPTR ISZ TDPTR /ARE WE DONE? JMP TDREAD /NOT YET ISZ TDBKNO /YES..LOOK AT BLOCK 15 TAD KCDF20 DCA TDREAD-1 /LOAD UP FIELD 2 ISZ M2 /DONE THIS JUNK? JMP TDBOOT /GO DO FIELD 2 SDLC /STOP THE TAPE CIF CDF 0 JMP I K7605 TDM14, -154 -155 /USE RECORD 66 TDPTR, TDWCT, 7600 TDRQD, 0 SDSQ JMP .-1 SDRD JMP I TDRQD K7600, 7600 KM26, -26 KM32, -32 KCDF20, CDF 20 M2, -2 K7605, 7605 TD77, 77 / THIS BOOTSTRAP RESIDES IN BLOCK 0 / BLOCK 1/2 CONTAINS THE USUAL IMAGE OF 07600 / BLOCK 66 CONTAINS THE IMAGE OF 17600 / BLOCK 66 1/2 CONTAINS THE IMAGE OF 27600 RELOC *200 /TD8E DECTAPE SYSTEM HANDLER /THIS HANDLER CAN DRIVE UNITS 0&1, AND IS PERMANENTLY /RESIDENT IN FIELDS 0&2. RELOC 7600 VERSION="B&77 ZBLOCK 7 SHNDLR, VERSION /UNIT 0 ENTRY POINT CLA CLL JMP SHND2 C3, 3 /MUST BE HERE FOR BUILD S70, 70 SDTA1, VERSION /UNIT 1 ENTRY CLA CLL CML SC1000, TAD SDTA1 /DOUBLES AS CONSTANT 1000 DCA SHNDLR /GET ARGS AT SHNDLR SHND2, RAR /UNIT # DCA SUNIT RDF /SETUP FOR EXIT TAD S6203 DCA EFLD TAD I SHNDLR /FUNCTION WORD SDLD /PUT IT IN DATA EGISTER AND S70 /SDLD DOES NOT 0 AC..GET FIELD TAD S6203 /CIF CDF N FOR TRANSFER FIELD DCA TFLD ISZ SHNDLR TAD I SHNDLR /BUFFER ADDRESS DCA BPTR ISZ SHNDLR TAD I SHNDLR /BLOCK #. TIMES 2 FOR REAL # CLL RAL DCA BLOCK ISZ SHNDLR /POINT TO ERROR EXIT CIF CDF 20 /PUT UNIT # INTO FIELD 2 TAD SUNIT DCA I SUNIT2 JMP F2SET /TO FIELD 2 FOR INIT. F1GO, SDRD /INITIAL DIRECTION TO LINK RAR JMP RGO RENTER, TAD BPTR /DONE THIS BLOCK..NEXT ADDRESS TAD SC200 DCA BPTR ISZ BLOCK /NEXT TAPE BLOCK..CAN'T SKIP CLL CML /FORCE FORWARD MOTION RGO, CLA CML RTR /LINK TO MOTION BIT TAD SC1000 TAD SUNIT SDLC /MOVE THE TAPE SDSQ JMP .-1 SDRD /KNOCK DOWN QUAD FLAG SDSQ JMP .-1 SDRD /THIS IS NEEDED, ELSE TIME ERROR!!! SRCH, SDSS /WAIT FOR A BLOCK MARK JMP .-1 SDRC /GET MARK TRACK BITS CLL RTL /DIRECTION TO LINK AND SC374 TAD SM110 /IS IT A N END ZONE? SNA JMP SENDZ /YES TAD SM20 /MAYBE A BLOCK MARK? SZA CLA JMP SRCH /NEITHER..KEEP GOING SDRD /READ THE BLOCK # SZL /IF REVERSE, LOOK 3 AHEAD OF TARGET TAD C3 CMA TAD BLOCK CMA SNA /IS IT THE RIGHT ONE? JMP FOUND /YES SM110, CLA SNA SZL /SNA SUPERFLUOUS..ONLY SZL VALID JMP SRCH /HEADED FOR IT..KEEP GOING SENDZ, SDRC CLL RTL SZL CLA /IF IN END ZONE FORWARD, GIVE ERROR JMP RGO CIF 20 /IF IT IS REALL END ZONE, AN ERROR JMP ERROR FOUND, SZL CLA /RIGHT BLOCK..HOW ABOUT DIRECTION? JMP RGO /WRONG..EXECUTE TURNAROUND TAD BPTR TFLD, HLT /GETS CIF CDF N CIF 20 JMP RDWT /LET'S TRANSFER DATA SEXIT, ISZ SHNDLR /NORMAL RETURN SEREX, TAD SUNIT /STOP THE TAPE SDLC CML CLA RAR /EITHER 0 OR 4000 IN AC ON RETURN EFLD, HLT JMP I SHNDLR BPTR=7755 BLOCK=7754 SUNIT=SDTA1 S6203, 6203 SC200, 200 SC374, 374 SM20, -20 SUNIT2, SXUNIT RELOC *400 RELOC 7600 /RUNS IN 27600 XPTR, 0 /BUFFER POINTER F2SET, CLA CLL CMA RTL /3 ERROR TRIES DCA TRYCNT TAD SXUNIT /MAKE SURE TAPE IS STOPPED SDLC F26203, CIF CDF 0 SDRD /FUNCTION WORD CLL RAL AND CX7600 /PAGE COUNT DCA XPGCT SDRD DCA SXFUN /SAVE THE FUNCTION WORD JMP F1GO RDWT, DCA XPTR /SAVE NEW BUFFER ADDRESS TAD CX7600 DCA XWCNT /128 WORDS PER BLOCK REVGRD, SDSS /WAIT FOR REVERSE GUARD WORD JMP .-1 SDRC AND X77 TAD XM32 /IS IT REVERSE GUARD? SZA CLA JMP REVGRD /NO TAD SXFUN SK7700, SMA CLA /READ OR WRITE? JMP READ /READ SDRC AND C300 /ERRORS ON WRITE LOCKOUT AND TIME SZA CLA JMP ERROR JMS RDQUAD /SKIP A WORD CX7600, 7600 TAD WRLP TAD SXUNIT SDLC /TURN ON THE WRITE CLA CMA JMS WRQUAD /WRITE 7777 IN REV. CHECKSUM CLA CMA DCA SCKSUM /AND ALSO IN COMPUTE CHECKSUM WRLP, TAD I XPTR JMS WRQUAD /WRITE THE DATA ISZ XPTR X77, 77 /JUST IN CASE ISZ XWCNT /DONE 128? JMP WRLP JMS WRQUAD /WRITE AND CHECKSUM A WORD OF 0 JMS GETCHK /GET CHECKSUM JMS WRQUAD JMS WRQUAD /LET CHECKSUM GET WRITTEN RWCOM, SDST /CHECK FOR TIME AND CHECKSUM ERRORS SZA CLA JMP ERROR /NOTE THAT LINK IS OFF AT RWCOM CIF CDF 0 TAD XPGCT /FINISHED TRANSFER? TAD CX7600 /LINK GOES ON HERE SNA JMP SEXIT /YES..GETOUT DCA XPGCT JMP RENTER READ, JMS RDQUAD /SKIP CONTROL WORDS JMS RDQUAD JMS RDQUAD /GET CHECKSUM AND X77 TAD SK7700 DCA SCKSUM SRDLP, JMS RDQUAD DCA I XPTR TAD I XPTR JMS EQUFUN ISZ XPTR C300, 300 ISZ XWCNT /DONE ALL? JMP SRDLP /NO JMS RDQUAD /READ AND CHECKSUM LAST WORD JMS EQUFUN JMS RDQUAD /GET CHECKSUM AND SK7700 JMS EQUFUN JMS GETCHK JMP RWCOM ERROR, CLA CLL /THIS CAUSES SEARCH REVERSE AT RGO CIF CDF 0 ISZ TRYCNT /EXHAUSTED ERROR TRIES? JMP RGO JMP SEREX /YES..FATAL EXIT WRQUAD, 0 /WRITE A 12 BIT WORD SDSQ JMP .-1 SDLD JMS EQUFUN /SDLD LEAVES AC ALONE JMP I WRQUAD RDQUAD, 0 /READ A 12 BIT WORD SDSQ JMP .-1 SDRD JMP I RDQUAD EQUFUN, 0 /EQUIVALENCE CHECKSUM CMA DCA EQUTMP TAD EQUTMP AND SCKSUM CIA CLL RAL TAD EQUTMP TAD SCKSUM DCA SCKSUM JMP I EQUFUN GETCHK, 0 TAD SCKSUM CLL CMA RTL RTL RTL JMS EQUFUN TAD SCKSUM AND SK7700 JMP I GETCHK SXUNIT, 0 XPGCT, 0 SXFUN, 0 TRYCNT, 0 XWCNT, 0 XM32, -32 SCKSUM, 0 EQUTMP, 0 /THE LAST 4 LOCS. ARE FREE FOR USE BY BATCH ZBLOCK 4 RELOC $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 | /16 TM8-E MAGTAPE HANDLER FOR OS/8 / / /COPYRIGHT (C) 1973,1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / LWCR=6701 /LOAD WORD COUNT REGISTER AND CLEAR AC LCAR=6703 /LOAD CURRENT ADDRESS REGISTER AND CLEAR AC LCMR=6705 /LOAD COMMAND REGISTER AND CLEAR AC LFGR=6706 /LOAD FUNCTION REGISTER AND CLEAR AC CLT=6712 /CLEAR TRANSPORT RMSR=6714 /CLEAR AC AND READ MAIN STATUS REGISTER RFSR=6716 /CLEAR AC AND READ STUFF SKEF=6721 /SKIP IF ERROR FLAG IS SET SKJD=6723 /SKIP IF THE JOB IS DONE (MTTF IS SET) SKTR=6724 /SKIP IF TAPE UNIT READY (TUR TRUE) MTAVERSION="F&77 /SPECIAL CODES USED WHEN PAGE COUNT=0 (CODES IN BITS 9-11 OF FN WORD) /0 (CLOSE) WRITE 2 EOF'S /1 REWIND /2 SPACE FORWARD/REVERSE RECORDS / IF BIT 0 OF THE FUNCTION WORD IS A 0, / THIS CODE ADVANCES RECORDS. / THE NEGATIVE OF THE NUMBER OF RECODRDS IS SPECIFIED IN ARG 3 / IF BIT 0 OF THE FUNCTION WORD IS A 1, / THIS CODE BACKSPACES RECORDS. / THE NEGATIVE OF THE NUMBER OF RECORDS IS SPECIFIED AS ARG 3. / UNDER NO CIRCUMSTANCES DOES THIS COMMAND CONTINUE PAST A FILE MARK. /3 SPACE FORWARD/REVERSE FILES / IF BIT 0 OF THE FUNCTION WORD IS A 0 / THEN THIS FUNCTION ADVANCE FILE MARKS / THE NEGATIVE OF THE NUMBER OF FILE MARKS IS SPECIFIED BY ARG3 / THE TAPE IS LEFT POSITIONED AFTER THIS FILE MARK / BUT UNDER NO CIRCUMSTANCES DOES THE TAPE ADVANCE PAST / THE SECOND MARK OF TWO CONSECUTIVE FILE MARKS / IF BIT 0 OF THE FUNCTION WORD IS A 1, / THIS CODE BACKSPACES PAST FILE MARKS. / THE NEGATIVE OF THE NUMBER OF FILE MARKS IS SPECIFIED BY ARG 3. / THE TAPE IS LEFT POSITIONED BEFORE THE LAST FILE MARK, / SO THE USER PROBABLY WANTS TO DO A FORWARD RECORD NEXT. /4 REWIND AND PUT OFF-LINE /5 WRITE EOF /6 PERFORM OPERATION WITH SPECIFIED BLOCKSIZE / THE NEGATIVE OF THE DESIRED BLOCKSIZE IS SPECIFIED AS ARG 3. /7 CURRENTLY UNUSED /NOTE: SKIP TO EOD CAN BE PERFORMED BY SKIPPING 4096 FILES /MAINTENANCE RELEASE CHANGES: /1. MAJOR CODE OVERHAUL /2. SKIP RECORDS RETURNS NON-FATAL ERROR IF IT DETECTS FILE MARK /3. SKIP FORWARD FILES NEVER EVER PASSES EOD /4. SKIP FORWARD FILES RETURNS ERROR IF IT STARTS IMMEDIATELY / BEFORE A FILE MARK (UNLESS IT'S AT BOT) / IT THEN REMAINS BEFORE THE FILE MARK /5. FIXED TIMING PROBLEM FOR TS03 /6. CHANGED ORDER OF TEST FOR DATA DURING SKIP FORWARD FILES /7. MADE UNUSED FUNCTION CODE 7 ACT SAME AS 0 /BUILD DESCRIPTOR BLOCK *0 -10 /8 ENTRY POINTS DEVICE TM8E;DEVICE MTA0;200;MTA0&177+4000;ZBLOCK 2 DEVICE TM8E;DEVICE MTA1;200;MTA1&177+4000;ZBLOCK 2 DEVICE TM8E;DEVICE MTA2;200;MTA2&177+4000;ZBLOCK 2 DEVICE TM8E;DEVICE MTA3;200;MTA3&177+4000;ZBLOCK 2 DEVICE TM8E;DEVICE MTA4;200;MTA4&177+4000;ZBLOCK 2 DEVICE TM8E;DEVICE MTA5;200;MTA5&177+4000;ZBLOCK 2 DEVICE TM8E;DEVICE MTA6;200;MTA6&177+4000;ZBLOCK 2 DEVICE TM8E;DEVICE MTA7;200;MTA7&177+4000;ZBLOCK 2 *200 PARITY, 402 /CHANGE TO 2 TO HAVE EVEN PARITY BLOCK0, 0 /SET TO 1 TO INHIBIT REWIND ON BLOCK 0 MTATAD, TAD MTA0 /USED TO MAKE HANDLER SERIALLY REUSABLE /CONTENTS MUST BE 13XX [V3C] MTISZ, ISZ MTANO /DITTO STOP, ISZ MTHX MTEXIT, HLT /CIF CDF TO USER'S FIELD JMP I MTHX PNEXT, 0 /V3C CLA TAD MTANO /GET UNIT # CIA TAD MTATAD /FIND WHICH ENTRY POINT DCA MTFUN /MAKE A 'TAD MTAN' AND EXECUTE IT MTFUN, HLT DCA MTHX /COLLECT ARGUMENTS VIA 'MTHX' CLA STL RTR /2000 TAD MTFUN /MAKE A 'DCA MTAN' AND EXECUTE IT DCA NBLOK TAD MTISZ /RESTORE DESTROYED ISZ NBLOK, HLT TAD I MTHX /GET FUNCTION WORD DCA MTFUN /SAVE IT IN 'MTFUN' ISZ MTHX /POINT TO BUFFER ADDRESS STA /GET ONE LESS THAN TAD I MTHX /BUFFER ADDRESS DCA NBUFF /AND STORE AWAY ISZ MTHX /POINT TO BLOCK NUMBER TAD I MTHX /GET BLOCK NUMBER DCA NBLOK /STORE AWAY ISZ MTHX /POINT TO ERROR RETURN RDF /GET CALLING FIELD TAD MTCDIF /CREATE CIF CDF TO USER'S FIELD DCA MTEXIT /STORE AWAY WHERE WILL BE USEFUL LATER MTCDIF, CIF CDF 0 /GO TO FIELD 0 TAD MTANO /GET UNIT NUMBER CLL RTR RTR DCA MTANO /PUT IN BITS 0-2 OF 'MTANO' TAD MTFUN /RETRIEVE FUNCTION WORD AND L70 /ISOLATE FIELD OF BUFFER TAD PARITY /SET ODD PARITY BITS, AND DENSITY 8 (800 BPI, 7-CHANNEL) TAD MTANO /COMBINE WITH UNIT NUMBER DCA MTAWD /TO GET A USEFUL MTA COMMAND TAD MTFUN /ZERO BUFFER FOR PIP ON EOF AND L70 /FIELD OF ORIGIN TAD MTCDF DCA USRCDF USRCDF, MTANO, 0 DCA MTANO /RESET 'MTANO' FOR NEXT CALL TAD MTFUN RAL AND P7600 /GET # OF WORDS IN BUFFER SNA SZL /ZERO BUFFER IF READING JMP P7600 CIA DCA MTH TAD NBUFF DCA ERROR MCLRLP, ISZ ERROR L100, 100 DCA I ERROR ISZ MTH JMP MCLRLP P7600, 7600 MTCDF, CDF 0 TAD BLOCK0 SNA /OPERATE IN MULTIPLE-FILE MODE? TAD NBLOK /RETRIEVE BLOCK SZA CLA /IS IT BLOCK 0? JMP BIGBLK /NO TAD MTATAD /YES, REWIND [CAN BE 13XX] JMS MTH /CALL MAGTAPE ROUTINE MTAWD, 1000 /CA IMMATERIAL M7603, -7603 /WC IMMATERIAL L70, 70 /NO REWIND ERRORS (THESE CAN'T OCCUR) BIGBLK, TAD MTFUN JMS I PNEXT /GO READ OR WRITE NEXT PAGE NBUFF, 0 /ONE LESS THAN ADDRESS OF BUFFER /MUST BE AT LOC AFTER CALL TO NEXT / MTH /SET UP WC AND CA REGISTERS, LOAD FUNCTION AND GO /CALLING SEQUENCE: / TAD (FNWORD / JMS MTH / BUFFER ADDRESS-1 / -WORD COUNT / MASK FOR UNACCEPTABLE ERROR CONDITIONS / <NORMAL RETURN> / TAKES HANDLER ERROR RETURN ON ERRORS. / IF ERROR, AC HAS ERROR CODE FROM MAIN STATUS REGISTER / AC IS POSITIVE IF E.O.F. READ MTH, 0 /MUST BE AT 2ND LOC AFTER CALL TO NEXT DCA ERROR /SAVE FUNCTION TEMPORARILY SKTR /V3C JMP .-1 /FIX TIMING BUG CLT /CLEAR THE WORLD TAD MTAWD LCMR /LOAD COMMAND REGISTER TAD I MTH /GET CURRENT ADDRESS LCAR /LOAD IT ISZ MTH /POINT TO WORD COUNT TAD I MTH /GET WORD COUNT (TWO'S COMPLEMENT THEREOF) LWCR /LOAD IT ISZ MTH /POINT TO ERROR MASK TAD ERROR /GET FUNCTION BACK LFGR /GO BABY GO JMS ERROR /CHECK FOR ERROR SKJD /THROUGH? JMP .-2 /NO JMS ERROR /YES, ANY ERRORS? E1, ISZ MTH /AMAZING WE MADE IT (NO ERRORS) JMP I MTH /NORMAL RETURN IFNZRO MTH-NBUFF-1 <MTHERR,XXX> ERROR, 0 TAD P7600 /YES KRS /IS IT CTRL/C? TAD M7603 /ALLOW PARITY TELETYPES SNA CLA KSF JMP SIFE CLT /ABORT I/O JMP I P7600 /RETURN TO OS/8 KEYBOARD MONITOR SIFE, SKEF /SKIP ON ERROR JMP I ERROR /RETURN, NO ERRORS RMSR /WHAT'S CAUSING THE ERROR? AND I MTH /IS IT A GOOD ONE? (USE ERROR MASK) SNA CLA /IS ERROR ACCEPTABLE? JMP E1 /YES RMSR /NOT ACCEPTABLE AND L100 /IS IT AN E.O.F.? SNA /IF SO, LEAVE BIT 0 CLEAR RMSR JMP MTEXIT /AND LEAVE WITH STATUS IN AC IFZERO .-367&4000 <PERR,ZZXX> *366 MTHX, MTAVERSION MTA7, ISZ MTANO MTA6, ISZ MTANO MTA5, ISZ MTANO MTA4, ISZ MTANO MTA3, ISZ MTANO MTA2, ISZ MTANO MTA1, ISZ MTANO MTA0, ISZ MTANO JMS PNEXT /GET ADDRESS OF FIRST LOCATION ON NEXT PAGE PAGE IFNZRO PARITY-200 <PARERR,ZZZ> *400 NEXT, 0 DCA RECNO /READ OR WRITE AND HOW MANY TAD NEXT TAD KSTOP DCA NSTOP /ADDRESS OF RETURN ROUTINES TAD NEXT TAD KBLOK DCA WC TAD I WC DCA WC TAD I NEXT DCA BUFFER /GET BUFFER ADDRESS - 1 ISZ NEXT /POINT TO MTH TAD (3677 /V3C DCA ERFLAG /DEFAULT IS REPORT ALL ERRORS EXCEPT EOF TAD RECNO CLL RAL /LINK SPECIFIES READ OR WRITE AND L7600 /-(# OF BLOCKS)^200 SNA JMP ZERO /0 PAGE COUNT! DCA RECNO SZL /READ OR WRITE? STL CLA RTR /WRITE. +2000 TO CONVERT READ CODE TO WRITE CODE TAD L2100 /READ (OR WRITE) & GO DCA TEMP /SAVE THIS COMMAND TAD L7600 DCA WC /OS/8 USES 128 WORD BLOCKS STA /V3C DCA ERFLAG /NOW DEFAULT IS REPORT ALL ERRORS RL1, TAD TEMP JMS GO TAD BUFFER /NEXT 200 WORDS TAD L200 DCA BUFFER TAD RECNO /ANY MORE? TAD L7600 SNA JMP I NSTOP /NO, FINISH DCA RECNO /YES, LOOP JMP RL1 /REJOIN PROCESSING KSTOP, STOP-NBUFF /USED TO RELOCATE 'STOP' KBLOK, NBLOK-NBUFF FLAG, 0 COUNT, TEMP, 0 EFL2, TAD L5100 JMS GO /ALL THIS CODE IS NEW FOR V3C EFL1, TAD L5100 JMP GOO /V3C GO, 0 JMS I NEXT /CALL MTH BUFFER, HLT WC, 0 ERFLAG, -1 JMP I GO L5100, 5100 RECNO, 0 NSTOP, 0 L7, 7 L2100, 2100 ZERO, TAD RECNO /RETRIEVE FN WORD (MUST PRESERVE LINK) AND L7 /ISOLATE SPECIAL CODE TAD PJUMP DCA .+1 FN, HLT /BRANCH THROUGH JUMP TABLE TABLE, JMP EFL2 /0 CLOSE. WRITE TWO EOF'S JMP REW /1 REWIND JMP SPACE /2 SPACE FORWARD/REVERSE RECORDS JMP SEOF /3 SPACE FORWARD/REVERSE FILES JMP UNLOAD /4 REWIND AND OFF-LINE JMP EFL1 /5 WRITE EOF JMP SPEC /6 READ OR WRITE WITH SPECIAL BLOCKSIZE PJUMP, JMP TABLE /7 UNUSED SAME AS 0 SEOF, RAR /LINK ON MEANS REVERSE RTR DCA FN TAD WC DCA COUNT STA DCA WC RMSR AND (3000 /CHECK BOT BIT SZA CLA /SIMULATE DATA IF AT BOT (OR REWINDING) FILE, CLA IAC FILE2, DCA FLAG TAD FN TAD L6100 /V3C FORWARD [OR BACKSPACE] A RECORD JMS GO RMSR AND P100 SNA CLA /SKIP IF FILE MARK FOUND JMP FILE TAD FN TAD FLAG SZA CLA /WAS THERE ANY DATA? JMP CONT /V3C YES, CONTINUE /EITHER SAW DATA OR WAS GOING IN REVERSE STL /NO, BACKSPACE ONE RECORD SPACE, CLA CMA /V3C DON'T TOUCH LINK DCA ERFLAG /ALL ERRORS ARE FATAL RAR /LINK ON MEANS REVERSE (READ BIT) STL RAR STL RAR UNLOAD, TAD P100 /ADD IN 'GO' BIT GOO, JMS GO JMP I NSTOP CONT, ISZ COUNT /V3C JMP FILE2 /CONTINUE? JMP I NSTOP /CHECK FOR EOD BEFORE COUNT /FLAG .NE. 0 MEANS SAW DATA L6100, 6100 P100, 100 L7600, 7600 SPEC, CLA CMA /V3C DON'T TOUCH LINK DCA ERFLAG /ALL ERRORS ARE NOW FATAL SZL /LINK STILL CONTAINS READ/WRITE BIT STL CLA RTR TAD L2100 /V3C JMP GOO /V3C REW, DCA ERFLAG /NO REWIND ERRORS TAD (1000 /V3C JMP UNLOAD /V3C L200, 200 PAGE $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 | /25 OS/12 SCOPE HANDLER / / / / / / / / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / NOVEMBER, 1972 / MARIO DENOBILI, P?S / THIS ROUTINE WAS WRITTEN VERY HASTILY. / THE FOLLOWING FEATURES SHOULD BE PUT / IN, BUT I WAS TOO LAZY TO DO SO. / WITH A FEW HOURS WORK, A COMPETENT / PROGRAMMER SHOULD BE ABLE TO COMPACT / MY HASTY CODE AND EASILY ADD AT LEAST / A FEW OF THE FOLLOWING FEATURES: /1. TABS SHOULD BE HANDLED CORRECTLY. /2. FORM FEEDS SHOULD SIGNAL A NEW / SCOPE PAGE. [BRANCH TO LOCATION 'FULL'] /3. VERTICAL TABS SHOULD BE TREATED AS / 7 LINE FEEDS. /4. THE HANDLER SHOULD RETURN AN ERROR ON READ. /5. IF THE BUFFER OVERLAPS THE BETA REGISTER, / OR WRAPS AROUND 7777. / THIS SHOULD NOT CAUSE A CRAPPY / CHARACTER TO BE DISPLAYED. /6. CTRL/Z SHOULD BE CHECKED FOR AND SIGNIFY / END OF BUFFER. [BRANCH TO 'FULL' WITH / LINK 0] /7. THE DISPLAY ALGORITHM SHOULD BE IMPROVED / SO THAT THERE IS LESS FLICKER. /MORE FEATURES TO BE ADDED /8. THE RESTRICTION THAT THE USER'S BUFFER / START AT AN EVEN ADDRESS IS USELESS / AND SHOULD BE REMOVED. /9. THE STATUS OF THE SPECIAL FUNCTIONS / REGISTER SHOULD BE SAVED AND RESTORED / BEFORE EXITING. /10. WHEN ANOTHER LOCATION IS FOUND, THE HANDLER / SHOULD BE ABLE TO DETECT PARITY ^C /11. SENSE SWITCH 0 SHOULD BE USED TO / SPECIFY SMALL OR LARGE SIZE CHARACTERS. /12. OVERFLOW LINES SHOULD BE INDENTED SOME SMALL / AMOUNT TO SHOW THAT THEY ARE A CONTINUATION / OF THE PREVIOUS LINE / OS/8 BUILD HEADER BLOCK FIELD 0 *0 -1 DEVICE VR12 /DEVICE NAME DEVICE TV /HANDLER NAME 1300 /DCB WORD 4000+SCOPE-200 /2-PAGE FLAG AND RELATIVE ENTRY PT ZBLOCK 2 / TWO PAGE SCOPE DEVICE HANDLER / PAGE INDEPENDENT AND REUSABLE LINC=6141 PDP=2 ESF=4 CLR=11 *200 L26, 26 SAVE, 0 /BETA REG SAVE LOC - MAY BE BETA REG LINKNT, TAD SAVE /COUNT OF # OF LINES YCOORD, AND SCDF /DISPLAY ORDIANTE BETA, DCA . /8-MODE ADDRESS OF BETA REGISTER 1 CBASE, TAD SAVE /POINTS TO CHARACTER DISPLAY TABLE BUFEND, TAD XCIF /END OF BUFFER BPTR, DCA CBASE /POINTS INTO BUFFER BUFFER, TAD X /BEGINNING OF BUFFER T1, DCA BEGIN /TEMPORARY L7410, SKP TVERSION="A&77 SCOPE, TVERSION BEGIN, JMS SAVE /ADDRESS MUST BE EVEN AND L70 /GET DATA FIELD OF BUFFER TAD KCDF DCA SCDF KCC RDF /GET DATA FIELD TAD FULL DCA XCIF X, TAD I SCOPE /GET FUNCTION WORD CLL RAL AND L7700 /GET # OF PAGES ISZ SCOPE SNA JMP OVERX TAD I SCOPE /ADD IN BUFFER START DCA BUFEND /TO GET END OF BUFFER TAD I SCOPE /GET BUFFER START DCA BUFFER /[RESTRICTION: IT MUST BE EVEN] CDF 0 TAD I BETA DCA SAVE /SAVE CONTENTS OF BETA REGISTER /MAIN LOOP - GET CHARACTERS AND CALL DISPLAY ROUTINE NEW, LAS /LINE COUNT FROM SWITCH REGISTER DCA LINKNT DCA I BETA /GO TO LEFT MARGIN TAD BUFFER DCA BPTR /POINT TO BEGIN OF BUFFER TAD YINIT DCA YCOORD /GO TO TOP OF SCREEN ENTRY, JMS DISP /DISPLAY 3D CHAR ( ALSO SETS DF) TAD BPTR CMA CLL TAD BUFEND /COMPARE BUFFER PTR WITH BUFFER END SNL CLA /AT END OF BUFFER? JMP FULL /YES - LINK OFF AT FULL MEANS EXIT ROTT1, RTL /NOTE LINK=1 IF WE FELL INTO HERE! RTL /ROTATE HI ORDER BITS INTO SHIFT REG SPA /TEST FOR SHIFT REGISTER FULL JMP ENTRY /YES - GO DIAPLAY IT DCA T1 /RESAVE SHIFT REGISTER TAD I BPTR /GET NEXT BUFFER WORD JMS DISP /DISPLAY LOW-ORDER TAD I BPTR ISZ BPTR /BUMP PTR / NOP AND L7410 /GET HIGH ORDER - THE 10 IS HARMLESS CLL RAL TAD T1 /ADD HIGH ORDER TO SHIFT REGISTER. JMP ROTT1 /INVOLUTED CODE. /DISPLAY SUBROUTINE - DISPLAYS A CHARACTER DISP, 0 KCDF, CDF 0 YINIT, AND L177 SNA JMP SCDF /IGNORE NULLS TAD L7640 CLL CML TAD L100 /CHECK WHETHER THE CHARACTER SZL /IS OUTSIDE OF THE RANGE [40,137] JMP UGH /YES - SUBSTITUTE SPACE OR L.F. CLL RAL MAGIC, TAD CBASE /ADD IN BASE ADDR DCA RIGHT /GET DISPLAY BIT PATTERN PTR TAD I RIGHT DCA LEFT /GET LEFT HALF OF DISPLAY BITS ISZ RIGHT TAD I RIGHT DCA RIGHT /GET RIGHT HALF TAD YCOORD /PUT ORDINATE IN AC LINC YINC, 1760 /DSC I LEFT, 0 /DISPLAY LEFT HALF 1760 /DSC I RIGHT, 0 /DISPLAY RIGHT HALF CLR ESF /SMALL CHARACTERS! PDP ISZ I BETA /LEAVE A BISSEL SPACE TAD I BETA /GET ABSCISSA TAD LINEND /COMPARE WITH RIGHT MARGIN L7700, SMA CLA /AT RIGHT EDGE OF SCREEN? JMP NEWLIN /YES, GO TO NEXT LINE SCDF, 6001 /NO, SET PROPER DF JMP I DISP /RETURN /DISPLAY ROUTINE CONTINUED UGH, TAD L26 /CHECK FOR LINE FEED LINEND, RTR /OR FORM FEED (LINK=0!) L7640, SZA CLA JMP MAGIC /OTHER CONTROL CHARS PRINT BLNK NEWLIN, DCA I BETA /BACK TO LEFT MARGIN TAD YCOORD TAD YINC DCA YCOORD /MOVE DOWN TO NEXT LINE ISZ LINKNT /AT BOTTOM OF SCREEN? JMP SCDF /NO CLL CLA CMA RAL /TAKE QUOT ON DIV BY 2 AND BPTR /AND LEAVE IN AC FULL, CIF CDF 0 /YES KSF /GO TO NEXT SCOPE PAGE? JMP NEW /NO, REFRESH DCA BUFFER /GET NEW BUFFER 'START' SZL /END OF BUFFER ? JMP NOW /NO, REFRESH TAD SAVE DCA I BETA /RESTORE BETA REGISTER OVERX, CLA STL RAL IAC /ADD 3 TAD SCOPE /TO RET ADDRESS DCA SCOPE XCIF, CHRTBL-BEGIN-1 /RESTORE INST FIELD & DATA FIELD JMP I SCOPE /LEAVE L177, 177 L100, 100 NOW, KRB / AND L177 TAD M3 SZA CLA JMP NEW JMP I .+1 7605 L70, 70 M3, -203 /** TEMP /BETTER STUFF, PRINTS ^C /NOW, TAD L7600 / KRS / TAD M7603 / SZA CLA / JMP NEW / JMP I L7600 /L7600, 7600 /M7603, -7603 PAGE /THE TABLE OF PATTERN WORDS BEGINS HERE CHRTBL, 0000; 0000 /SPACE 7500; 0000 /! 7000; 0070 /" 7714; 1477 /# 5721; 4671 /$ 6661; 4333 /% 5166; 0526 /& 0000; 0070 /' 3600; 0041 /( 4100; 0036 /) 2050; 0050 /* 0404; 0437 /+ 0500; 0006 /, 0404; 0404 /- 0001; 0000 /. 0601; 4030 // 4536; 3651 /0 2101; 0177 /1 4523; 2151 /2 4122; 2651 /3 2414; 0477 /4 5172; 0651 /5 1506; 4225 /6 4443; 6050 /7 5126; 2651 /8 5122; 3651 /9 2200; 0000 /: 4601; 0000 /; 2410; 0042 /< 1212; 1212 /= 4200; 1024 /> 4020; 2055 /? 4136; 3656 /@ 4477; 7744 /A 5177; 2651 /B 4136; 2241 /C 4177; 3641 /D 4577; 4145 /E 4477; 4044 /F 4136; 2645 /G 1077; 7710 /H 7741; 0041 /I 4142; 4076 /J 1077; 4324 /K 0177; 0301 /L 3077; 7730 /M 3077; 7706 /N 4177; 7741 /O 4477; 3044 /P 4276; 0376 /Q 4477; 3146 /R 5121; 4651 /S 4040; 4077 /T 0177; 7701 /U 0176; 7402 /V 0677; 7701 /W 1463; 6314 /X 0770; 7007 /Y 4543; 6151 /Z 4177; 0000 /[ 3040; 0106 /\ 0000; 7741 /] 2000; 2076 /^ 1604; 0404 /_ $ |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 | /EXTENDED MEMORY DEVICE HANDLER / / /PSEUDO DEVICE SIMILAR TO DF32 /BUT IN RAM MEMORY USING FIELDS /10 TO 17 FOR PLATTER 1 /20 TO 27 FOR PLATTER 2 /30 TO 37 FOR PLATTER 3 / / / S.R.,J.R.,J.M. / / / / / / /COPYRIGHT (C) 1978 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / /BUILD DATA *0 / /1 EXTENDED MEMORY HANDLER FOR OS/8 IFNDEF SYS <SYS=0> /SET TO 1 TO GET SYSTEM HANDLER -1 IFZERO SYS <DEVICE VXA0;DEVICE VXA0;4333;MEM&177;ZBLOCK 2> IFNZRO SYS <DEVICE VXA0;DEVICE SYS;4333;2007;0;200> VXVER="A&77 IFNZRO SYS < 7737 /MINUS LENGTH OF BOOT RELOC 0 CLL CLA CMA /CLEAR AC & SET TO 7777 DCA X0 TAD K7600 DCA C1 TAD K7600 DCA C2 TAD K7577 DCA X1 TAD K7577 DCA X2 JMP 20 X0, 0 X1, 0 X2, 0 C1, 0 C2, 0 CDF 4 TAD I X0 CDF 10 DCA I X1 ISZ C1 JMP 20 CDF 4 TAD I X0 CDF 0 DCA I X2 ISZ C2 JMP 26 CDF CIF 0 JMP I .+1 7605 K7600, 7600 K7577, 7577 RELOC > *200 IFNZRO SYS < RELOC 7600 ZBLOCK 7> MEM, VXVER CLA CLL CML RAR /SET AC TO 4000 TAD I MEM /GET ARG 1 -- LINK WILL BE SET IF WRITE AND VX70 /MASK OFF FIELD TAD VCDF /FORM A CDF N DCA FLD /STORE AT INPUT TAD FLD DCA WR /AND AT OUTPUT RAR /GET WRITE BIT MQL /SAVE IN MQ IFZERO SYS < TAD K7000 6200 /SET MEM EXT BITS CLA CLL > TAD I MEM /AGAIN GET ARG 1 RAL /MULT X 2 = PAGESX2=WORDS AND VX7600 /MASK OFF OTHER BITS CIA /MAKE NEGATIVE DCA WDCNT /STORE AT 7753 CLL /CLEAR LINK IF IT WAS WRITE ISZ MEM /INCR POINTER TAD I MEM /GET ARG 2 DCA BUFADR /STORE BUFFER POINTER IN 7750 ISZ MEM /INCR POINTER TAD I MEM /GET ARG 3 -OS/8 BLOCK # DCA BLK /STORE IN 7752 TAD BLK AND VX17 /GET BITS 8 TO 11 TO MAKE INTO START ADDR BSW RTL DCA SA /STORE START ADDR OF EXT MEM IN 7751 TAD BLK RAR AND VX70 TAD VCDF /THIS GET BITS 5 TO 7 FOR EXT MEM BIT CDE DCA RD /TEMP STORE UNTIL BITS A & B ARE EVALUATED RDF /NOW GRAB SENDING FIELD IN AC TAD VXCDI /FORM A CDI N OF SENDING FIELD DCA VXRET /STORE AT RETURN ROUTINE ISZ MEM /NOW RETURN POINTS TO ERROR VXCDI, CDF CIF 0 /PUT INTO CURRENT FIELD ALSO CONSTANT FOR CDI TAD BLK /NOW WE NEED TO KNOW BITS A & B IN EXT MEM TAD M200 /IS OS/8 BLOCK 0-177 SPA JMP DOB /YES SO SET BIT B TAD M200 /IS OS/8 BLOCK 200-377 SPA CLA JMP DOA /YES SO SET BIT A TAD VX4 /NO SO SET BIT B TAD VX100 /AND BIT A GO, TAD RD /PICK UP TEMP CDF DCA RD /STORE IT AT INPUT TAD RD DCA FLD2 /AND AT OUTPUT MQA /NOW GET WRITE BIT (IF ANY) SNA CLA JMP RD /NO WRITE BIT SO GO TO READ ROUTINE WR, HLT /WRITE ROUTINE - THIS BECOMES A CDF N TAD I BUFADR /GET DATA FROM INPUT BUFFER FLD2, HLT /THIS CHANGES TO CDF N (HIGH FIELDS) DCA I SA /DUMP INTO EXTEND MEM JMS VCK /CHECK FOR END OF ROUTINE & RESET FIELDS JMP WR /NOT DONE YET SO CONTINUE RD, HLT /READ ROUTINE - THIS BECOMES A CDF N (HIGH) TAD I SA /GET DATA FROM EXTENDED MEM FLD, HLT /CHANGES TO CDF N (LOW) DCA I BUFADR /PUT INTO BUFFER IN LOWER MEMORY JMS VCK /CHECK FOR END OF ROUTINE & RESET FIELDS JMP RD /NOT DONE SO CONTINUE M200, VX7600, 7600 /K7600 & M200 & CLA ON EXIT ISZ MEM /INCR POINTER TO GOOD EXIT VXRET, HLT /CHANGES TO CDF CIF N OF SENDING FIELD JMP I MEM /RETURN TO CALLING ROUNTINE VCK, 0 /THIS CHECKS READ AND WRITE FOR DONE IFZERO SYS <JMS CTRLC> ISZ WDCNT /AND FOR RESET OF FIELDS SKP /NO OVERFLOW SO SKIP TO CONTINUE JMP VX7600 /OVERFLOW SO DONE - GO TO EXIT ROUTINE ISZ BUFADR /INCR POINTER IF OVERFLOWS THEN WRAP MEMORY VX70, 70 /CONSTANT THAT DOES A NOP HERE IF NO OVERFLOW ISZ SA /INCR START ADDR IN EXT MEM JMP I VCK /NO OVERFLOW SO COONTINUE TAD VX10 /EXTEND MEM NEEDS NEW FIELD TAD RD DCA RD /PUT INCR FIELD AT INPUT TAD RD DCA FLD2 /AND WRITE JMP I VCK /NOW GO BACK AND TRY TO FINISH DOB, CLA /CLEAR AC TAD VX4 /SET BIT A JMP GO /GO TO ROUTINE TO UPDATE TEMP AND STORE DOA, TAD VX100 /SET BIT A JMP GO /GO TO ROUTINE TO UPDATE TEMP AND STORE VCDF, CDF 0 /CONSTANT TO FORM CDF N VX17, 17 VX10, 10 VX100, 100 VX4, 4 IFNZRO SYS < BUFADR=7750 SA=7751 BLK=7752 WDCNT=7753> IFZERO SYS < BUFADR, 0 SA, 0 BLK, 0 WDCNT, 0 K7000, 7000 CTRLC, 0 TAD (200 KRS TAD (-203 SNA CLA KSF JMP I CTRLC CIF CDF 0 JMP I VX7600 > IFNZRO SYS < RELOC > $ $ $ $ $ $ $ $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 | /EXTENDED MEMORY DEVICE HANDLER / / /PSEUDO DEVICE SIMILAR TO DF32 /BUT IN RAM MEMORY USING FIELDS /10 TO 17 FOR PLATTER 1 /20 TO 27 FOR PLATTER 2 /30 TO 37 FOR PLATTER 3 / / / S.R.,J.R.,J.M. / / / / / / /COPYRIGHT (C) 1978 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / /BUILD DATA *0 / /1 EXTENDED MEMORY HANDLER FOR OS/8 SYS=1 IFNDEF SYS <SYS=0> /SET TO 1 TO GET SYSTEM HANDLER -1 IFZERO SYS <DEVICE VXA0;DEVICE VXA0;4333;MEM&177;ZBLOCK 2> IFNZRO SYS <DEVICE VXA0;DEVICE SYS;4333;2007;0;200> VXVER="A&77 IFNZRO SYS < 7737 /MINUS LENGTH OF BOOT RELOC 0 CLL CLA CMA /CLEAR AC & SET TO 7777 DCA X0 TAD K7600 DCA C1 TAD K7600 DCA C2 TAD K7577 DCA X1 TAD K7577 DCA X2 JMP 20 X0, 0 X1, 0 X2, 0 C1, 0 C2, 0 CDF 4 TAD I X0 CDF 10 DCA I X1 ISZ C1 JMP 20 CDF 4 TAD I X0 CDF 0 DCA I X2 ISZ C2 JMP 26 CDF CIF 0 JMP I .+1 7605 K7600, 7600 K7577, 7577 RELOC > *200 IFNZRO SYS < RELOC 7600 ZBLOCK 7> MEM, VXVER CLA CLL CML RAR /SET AC TO 4000 TAD I MEM /GET ARG 1 -- LINK WILL BE SET IF WRITE AND VX70 /MASK OFF FIELD TAD VCDF /FORM A CDF N DCA FLD /STORE AT INPUT TAD FLD DCA WR /AND AT OUTPUT RAR /GET WRITE BIT MQL /SAVE IN MQ IFZERO SYS < TAD K7000 6200 /SET MEM EXT BITS CLA CLL > TAD I MEM /AGAIN GET ARG 1 RAL /MULT X 2 = PAGESX2=WORDS AND VX7600 /MASK OFF OTHER BITS CIA /MAKE NEGATIVE DCA WDCNT /STORE AT 7753 CLL /CLEAR LINK IF IT WAS WRITE ISZ MEM /INCR POINTER TAD I MEM /GET ARG 2 DCA BUFADR /STORE BUFFER POINTER IN 7750 ISZ MEM /INCR POINTER TAD I MEM /GET ARG 3 -OS/8 BLOCK # DCA BLK /STORE IN 7752 TAD BLK AND VX17 /GET BITS 8 TO 11 TO MAKE INTO START ADDR BSW RTL DCA SA /STORE START ADDR OF EXT MEM IN 7751 TAD BLK RAR AND VX70 TAD VCDF /THIS GET BITS 5 TO 7 FOR EXT MEM BIT CDE DCA RD /TEMP STORE UNTIL BITS A & B ARE EVALUATED RDF /NOW GRAB SENDING FIELD IN AC TAD VXCDI /FORM A CDI N OF SENDING FIELD DCA VXRET /STORE AT RETURN ROUTINE ISZ MEM /NOW RETURN POINTS TO ERROR VXCDI, CDF CIF 0 /PUT INTO CURRENT FIELD ALSO CONSTANT FOR CDI TAD BLK /NOW WE NEED TO KNOW BITS A & B IN EXT MEM TAD M200 /IS OS/8 BLOCK 0-177 SPA JMP DOB /YES SO SET BIT B TAD M200 /IS OS/8 BLOCK 200-377 SPA CLA JMP DOA /YES SO SET BIT A TAD VX4 /NO SO SET BIT B TAD VX100 /AND BIT A GO, TAD RD /PICK UP TEMP CDF DCA RD /STORE IT AT INPUT TAD RD DCA FLD2 /AND AT OUTPUT MQA /NOW GET WRITE BIT (IF ANY) SNA CLA JMP RD /NO WRITE BIT SO GO TO READ ROUTINE WR, HLT /WRITE ROUTINE - THIS BECOMES A CDF N TAD I BUFADR /GET DATA FROM INPUT BUFFER FLD2, HLT /THIS CHANGES TO CDF N (HIGH FIELDS) DCA I SA /DUMP INTO EXTEND MEM JMS VCK /CHECK FOR END OF ROUTINE & RESET FIELDS JMP WR /NOT DONE YET SO CONTINUE RD, HLT /READ ROUTINE - THIS BECOMES A CDF N (HIGH) TAD I SA /GET DATA FROM EXTENDED MEM FLD, HLT /CHANGES TO CDF N (LOW) DCA I BUFADR /PUT INTO BUFFER IN LOWER MEMORY JMS VCK /CHECK FOR END OF ROUTINE & RESET FIELDS JMP RD /NOT DONE SO CONTINUE M200, VX7600, 7600 /K7600 & M200 & CLA ON EXIT ISZ MEM /INCR POINTER TO GOOD EXIT VXRET, HLT /CHANGES TO CDF CIF N OF SENDING FIELD JMP I MEM /RETURN TO CALLING ROUNTINE VCK, 0 /THIS CHECKS READ AND WRITE FOR DONE IFZERO SYS <JMS CTRLC> ISZ WDCNT /AND FOR RESET OF FIELDS SKP /NO OVERFLOW SO SKIP TO CONTINUE JMP VX7600 /OVERFLOW SO DONE - GO TO EXIT ROUTINE ISZ BUFADR /INCR POINTER IF OVERFLOWS THEN WRAP MEMORY VX70, 70 /CONSTANT THAT DOES A NOP HERE IF NO OVERFLOW ISZ SA /INCR START ADDR IN EXT MEM JMP I VCK /NO OVERFLOW SO COONTINUE TAD VX10 /EXTEND MEM NEEDS NEW FIELD TAD RD DCA RD /PUT INCR FIELD AT INPUT TAD RD DCA FLD2 /AND WRITE JMP I VCK /NOW GO BACK AND TRY TO FINISH DOB, CLA /CLEAR AC TAD VX4 /SET BIT A JMP GO /GO TO ROUTINE TO UPDATE TEMP AND STORE DOA, TAD VX100 /SET BIT A JMP GO /GO TO ROUTINE TO UPDATE TEMP AND STORE VCDF, CDF 0 /CONSTANT TO FORM CDF N VX17, 17 VX10, 10 VX100, 100 VX4, 4 IFNZRO SYS < BUFADR=7750 SA=7751 BLK=7752 WDCNT=7753> IFZERO SYS < BUFADR, 0 SA, 0 BLK, 0 WDCNT, 0 K7000, 7000 CTRLC, 0 TAD (200 KRS TAD (-203 SNA CLA KSF JMP I CTRLC CIF CDF 0 JMP I VX7600 > IFNZRO SYS < RELOC > $ $ $ $ $ $ $ $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 | /OS8 BASIC EDITOR, V5A / / / / / / / // / / / / /COPYRIGHT (C) 1972, 1973, 1974, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /DEC-S8-LBASA-B-LA / /COPYRIGHT C 1972, 1973, 1974 / /DIGITAL EQUIPMENT CORPORATION /MAYNARD,MASSACHUSETTS 01754 / /AUGUST 19, 1972 / /HANK MAURER, 1972 /LEN ELEKMAN, 1972 /SHAWN SPILMAN, 1973 / / /ASSEMBLE AND LOAD AS FOLLOWS: / / .R PAL8 / *BASIC,BASIC<BASIC.03 / .R ABSLDR / *BASIC$ / .SA SYS BASIC;3211 / /NOTE DIFFERENCES FROM VERSION 1 AS FOLLOWS: / / .R SRCCOM / *LPT:<BASIC.01,BASIC.03 / * / VERSON= 5 /VERSION LOCATED IN CORE AT TAG "VERLOC" /LEFT 6BIT HALF = VERSION NUMBER+21 /RIGHT 6BIT HALF = PATCH LEVEL+41 (A=01) / /FIXES FOR V4 J.K. 1975 / /.LINE TOO LONG ERROR MESSAGE /.CLEAR CD OPTION TABLE AT START UP /.LIST FROM ACROSS FLD BOUNDRIES /.MEMORY OVERFLOW /.INPUT FROM TTY /JR 5-APR-77 ADDED EXTENDED DATE PRINTOUT /JR 13-APR-77 ADDED SCROLLING, SCOPE SUPPORT AND .BASIC COMMAND INTERFACE /JR 30-APR-77 FIX JSW FIELD BUG // 14-DEC-2018 LHN - INSTALLED DSN PATCH 31.12.1 M BCSIZE= 3700 / SIZE OF BCOMP.SV BCBEGN= 7001 / START OF BCOMP INFO= 7604 / INFORMATION AREA (FIELD 1) JSW= 7746 /JOB STATUS WORD IN FIELD 0 OS8RES= 3400 / SWAP AREA FOR OS8 DSKBUF= 4200 / FILE BUFFER HANDLR= 4600 / INPUT OUTPUT HANDLER ADDRESS TXTAREA=5200 / START OF TEXT AREA MDATE= 7666 /ADDR OF OS8 DATE IN FIELD 1 BIPCCL= 7777 /ADDR OF DATE EXTENSION IN FIELD 0 *3 SWAPT1, 0 SWAPT2, 0 SWAPT3, 0 SWAPT4, 0 0 X10, INFO-1 X11, NAMLST-1 X12, 0 X13, 0 X14, 0 X15, 0 X16, 0 X17, 0 *20 RDTMP, 0 /USED BY INPUT ROUTINE RDPTR, 0 SIZE, 0 /USED BY LINE EDITOR STUFF TEMP, 0 TEMP2, 0 TOWARD, 0 PTR, 0 NDIGS, 0 NCHARS, 0 COFLAG, 0 /=0 IF CTRL/O CHNFLAG,0 /=1 IF BACK FROM RUN, 0 IF OLD RUNFLAG,0 /=1 IF RUN, 0 IF SAVE OLDFLAG,0 /=1 IF INPUT COMING FROM FILE EOFADR, TXTAREA CORTMP, 0 CORSIZ, 1 LINENO, 0;0 /HOLDS MOST RECENT LINE NUM EOFLIN, 0;0 /LAST LINE NUMBER NAME, 0;0;0;0 /NAME BUFFER FNAME, FILENAME NONAME.BA /CURRENT FILE NAME DEVHAN, 0 /ADDRESS OF DEVICE HANDLER DEVNUM, 0 /CURRENT DEVICE NUMBER SWPNUM, 0 /SWAPPER FLAG (FOR ^C) O7700, 7700 O200, 200 O201, 201 O7761, 7761 O177, 177 O232, 232 O7201, 7201 O7706, 7706 O32, 32 O7200, 7200 O7600, 7600 O17, 17 O260, 260 O237, 237 O13, 13 O215, 215 O212, 212 O37, 37 O7741, 7741 O7405, 7405 O7701, 7701 O7772, 7772 O6171, 6171 O6211, 6211 O7770, 7770 O6201, 6201 O10, 10 O7774, 7774 O7766, 7766 O7634, 7634 O137, 137 O7746, 7746 O36, 36 O77, 77 O7745, 7745 O12, 12 O7771, 7771 O7400, 7400 O7760, 7760 / O14, 14 CSFLG, 0 PAGE GETLIN, 0 /GET A LINE FROM TTY. TAD I (HEIGHT /RESET SCREEN HEIGHT ON USER INPUT DCA I (LINCNT DCA NDIGS /CLEAR LINE NUMBER. DCA CSFLG /ZERO OUT ^S FLAG WHENEVER WE GET INPUT DCA NCHARS /CLEAR TEXT COUNT. IGNORE, CLA JMS I [GETCH DCA TEMP2 /SAVE CHAR CLL CMA RTL /CHECK FOR CONTROL C TAD TEMP2 SNA JMP I (BYEBYE /ITS ^C EXIT TO OS8 TAD O7766 /CHECK FOR CARRIAGE RETURN SNA JMP CARRET /JUMP IF 015 - CARRET. TAD O7770 /CHECK FOR ^U SNA JMP ALT /TREAT ^U AS ALTMODE TAD O7772 /CHECK FOR ALTMODE SNA JMP ALT /JUMP IF 033 - ALTMODE. TAD O7634 /CHECK FOR RUBOUT SNA JMP ARROW /TREAT LIKE BACK ARROW IAC /CHECK FOR ALTMODE SNA JMP ALT /JUMP IF 176 - ALTMODE. IAC SZA JMP .+4 /PRINT IF 175 - ALTMODE. ALT, JMS I [TYPE MSGALT JMP GETLIN+1 TAD O36 /CHECK FOR BACK ARROW SNA JMP ARROW /JUMP IF 137 - BACKARROW. CLL TAD O77 SNL JMP IGNORE /JUMP IF NOT PRINTABLE. IAC DCA TEMP /SAVE IT(SP=01,^=77,NO 00). TAD OLDFLAG /INPUT FROM FILE ? SZA CLA JMP .+3 /YES, DON'T ECHO TAD TEMP2 JMS I [TTYOUT /PRINT ON TTY TAD NCHARS SZA CLA JMP ISTEXT /NOT LINE NUMBER. TAD TEMP TAD O7745 /SEE IF ITS A DIGIT JMS I [LNDIG /PUT DIGIT INTO LINE NUM JMP IGNORE /GET NEXT CHAR ISTEXT, TAD NCHARS /PUT CHAR IN THE LINE. TAD O7405 SPA CLA JMP .+5 JMS I [CRLF JMS I [TYPE /250 CHARS IS OK TO FIT 1 MORE. MSGTOO JMP GETLIN+1/IF AN EVEN NUMBER TAD NCHARS /OF CHARS SO FAR CLL RAR TAD [LINE+2 DCA PTR SZL JMP RIGHTY TAD TEMP /THEN STORE AS THE LEFT CLL RTL /HALF OF THE WORD. RTL RTL JMP .+4 RIGHTY, TAD I PTR /ELSE AS THE RIGHT. AND O7700 TAD TEMP DCA I PTR ISZ NCHARS JMP IGNORE ARROW, TAD OLDFLAG /INPUT FROM FILE ? SNA CLA JMS I (PRTBSP /NO, GO PRINT BACKSPACE OR BACKARROW CLA CMA TAD NCHARS /IF THERE IS A TEXT CHAR TO ERASE SPA JMP .+3 DCA NCHARS /THEN ERASE IT. JMP IGNORE TAD NDIGS /OTHERWISE, IF THERE IS A LINENO SMA /CHARACTER TO ERASE THEN ERASE DCA NDIGS /THAT. JMP IGNORE /OTHERWISE, NEVER MIND. CARRET, TAD OLDFLAG /INPUT FROM FILE ? SNA CLA JMS I [CRLF /NO, PRINT CR-LF TAD NCHARS SZA JMP .+4 /NOT AN EMPTY LINE TAD NDIGS /ANY CHARS AT ALL ? SNA CLA JMP IGNORE /NO, IGNORE EMPTY LINES CLL RAR TAD [LINE+2 DCA PTR SZL TAD I PTR /STORE 00 (CAR. RET.) LIKE ALL AND O7700 /THE OTHER CHARACTERS. DCA I PTR JMS I [NORM /NORMALIZE LINE NUMBER JMP I GETLIN /CRLF, 0 /PRINT CR-LF / TAD O215 / JMS I [TTYOUT / TAD O212 / JMS I [TTYOUT / JMP I CRLF DUMMY, 0 CLA ISZ DUMMY JMP I DUMMY PATCH4, TAD [NAME+3 DCA TEMP2 CMA DCA SIZE JMP I (NAMLUP PAGE LNDIG, 0 /GET DIGIT INTO LINE NUM CLL TAD O12 SZL JMP .+4 CLA /NOT A DIGIT ISZ LNDIG /RETURN +1 JMP I LNDIG DCA TEMP /SAVE DIGIT ISZ NDIGS TAD NDIGS TAD O7771 SMA JMP I LNDIG /IGNORE MORE THAN 6 DIGITS. TAD .+3 DCA .+1 /PUT IN THE NTH DIGIT IN THE HLT /4 BIT BCD LINE NUMBER: JMP .+7 JMP DIG1 JMP DIG2 JMP DIG3 JMP DIG4 JMP DIG5 DIG6, TAD LINENO+1/WHERE N=6 AND O7760 JMP DIG56 DIG5, TAD TEMP /WHERE N=5 CLL RTL RTL DCA TEMP TAD LINENO+1 AND O7400 DIG56, TAD TEMP JMP DIG456 DIG4, TAD TEMP /WHERE N=4 CLL RAR RTR RTR DIG456, DCA LINENO+1 JMP I LNDIG DIG3, TAD LINENO /WHERE N=3 AND O7760 JMP DIG23 DIG2, TAD TEMP /WHERE N=2 CLL RTL RTL DCA TEMP TAD LINENO AND O7400 DIG23, TAD TEMP JMP DIG123 DIG1, TAD TEMP /WHERE N=1 CLL RAR RTR RTR DIG123, DCA LINENO JMP I LNDIG TYPE, 0 /TYPE A MESSAGE DCA CRSWIT /SAVE CARRIAGE RETURN SWITCH TAD I TYPE /GET ADDR OF MESSAGE ISZ TYPE DCA PASS TLOOP, JMS I [CTRLO /CHECK FOR CTRL/O JMP TCRLF /YES, STOP PRINTING TAD I PASS /GET HIGH CHAR CLL RTR /SHIFT RIGHT RTR RTR AND O77 /SIX BITS SNA JMP TCRLF /END OF MESSAGE TAD O237 /CONVERT TO ASCII JMS I [TTYOUT /PRINT CHAR TAD I PASS /GET LOWER CHAR ISZ PASS AND O77 SNA JMP TCRLF /END OF LINE TAD O237 /CONVERT TO ASCII JMS I [TTYOUT /PRINT JMP TLOOP TCRLF, TAD CRSWIT /RETURN THE CARRIAGE ? SNA CLA JMS I [CRLF /YES JMP I TYPE /DONE /TTYOUT, 0 /PRINT ONE CHAR / TSF /WAIT / JMP .-1 / TLS /PRINT / CLA / JMP I TTYOUT PASS, 0 /SKIP OVER LINE ISZ TEMP SKP JMS FINCR TAD I TEMP AND O77 SZA CLA JMP PASS+1 ISZ TEMP JMP I PASS JMS FINCR JMP I PASS CRSWIT, FDECR, 0 /DECR. POINTER AND FIELD TAD TEMP SZA CLA JMP .+5 RDF TAD O6171 DCA .+1 HLT CLA CMA TAD TEMP DCA TEMP JMP I FDECR FINCR, 0 /INCR. CURRENT DATA FIELD RDF SZA JMP HERE TAD CORSIZ DCA CORTMP HERE, TAD O6211 DCA .+1 HLT ISZ CORTMP JMP I FINCR CDF 0 JMP I [COREOV /FILE TOO BIG PAGE CMDDONE,CDF JMS I [CRLF /TYPE READY MESSAGE JMS I [TYPE MSGRDY MAINLUP,CDF JMS I [GETLIN /GET AN EDITED LINE. SNA CLA JMP NOCOMD /NOT A COMMAND TAD OLDFLAG /IN OLD MODE ? SNA CLA JMP I [COMMAND/NO, MUST BE A COMMAND JMP MAINLUP /OTHERWISE IGNORE NOCOMD, TAD PTR /OR A LINE WITH A LINE CMA /NUMBER ON IT. TAD [LINE DCA SIZE /SET UP SIZE OF LINE. TAD I [LINE+2 /IS LINE EMPTY ?? SNA CLA DCA SIZE /POSSIBLY ZERO. TAD LINENO /IS IT > LAST LINE ? CIA CLL TAD EOFLIN SZA CLA JMP .+4 /HI PART NOT =, FORGET LOW TAD LINENO+1 CIA CLL TAD EOFLIN+1 /COMPARE LOW PARTS SZL CLA JMP NOTLAST /NOT > LAST JMS I [GETEOF /GET EOF TAD TEMP /MAKE IT LOOK LIKE DCA PTR /A CALL TO FINDLN TAD LINENO /SAVE NEW LAST LINE DCA EOFLIN TAD LINENO+1 DCA EOFLIN+1 SKP NOTLAST,JMS I [FINDLN /GENERAL CASE - SEARCH INSERT, TAD TEMP /THERE ARE (TEMP-PTR) WORDS IN CLL CMA /THE OLD LINE WHICH ARE TO BE TAD PTR /REPLACED BY (-SIZE) WORDS IN CLA /NEW LINE. RDF SZL TAD O7770 TAD O6201 DCA PTRFLD /GET FIELD OF START OF OLD LINE TAD PTR CLL CIA TAD TEMP TAD SIZE /WHICH WAY ? SNA JMP MOVE /SAME SIZE, MOVE IN NEW LINE SPA JMP I (EXPAND /MAKE MORE ROOM FOR NEW LINE CIA TAD TEMP /SHRINK THE FILE DCA TOWARD /MOVE FILE DOWN TO HERE RDF TAD O6201 DCA TMPFLD /GET FIELD OF READ POINTER TAD TOWARD CLL CMA TAD TEMP SNL CLA TAD O7770 TAD TMPFLD DCA TWDFLD /GET FIELD OF WRITE POINTER TMPFLD, HLT TAD I TEMP TWDFLD, HLT DCA I TOWARD /MOVE DOWN TAD I TOWARD TAD O7701 /END OF FILE ??? SNA CLA JMP LWREOF /YES, PUT NEW LINE IN AT END ISZ TEMP /INCREMENT POINTERS JMP .+4 TAD TMPFLD /AND FIELDS IF NECESSARY TAD O10 DCA TMPFLD ISZ TOWARD JMP TMPFLD TAD TWDFLD TAD O10 DCA TWDFLD JMP TMPFLD /KEEP SHRINKING LWREOF, TAD TOWARD /SET NEW EOF JMS I [SETEOF MOVE, TAD SIZE SNA CLA JMP MAINLUP /IT WAS A DELETE CDF 00 TAD LINENO /PUT IN LINE NUMBER DCA I [LINE TAD LINENO+1 DCA I [LINE+1 MOVENTR,TAD [LINE DCA TEMP MOVLUP, CDF /MOVE IN NEW LINE TAD I TEMP ISZ TEMP PTRFLD, HLT DCA I PTR ISZ PTR /INCREMENT POINTERS JMP .+4 TAD PTRFLD /WHATCH OUT FOR FIELDS TAD O10 /(W.C. OR E.M. ?) DCA PTRFLD ISZ SIZE JMP MOVLUP JMP MAINLUP SRCHBK, 0 DCA TEM TAD I SRCHBK ISZ SRCHBK CIA TAD TEM CLL CMA TAD I SRCHBK SNL CLA ISZ SRCHBK ISZ SRCHBK TAD TEM JMP I SRCHBK TEM, 0 PAGE EXPAND, CIA /EXTRA ROOM NEEDED DCA TOWARD TAD I TEMP /SAVE THIS PLACE DCA TEMP2 TAD O37 /NOW MARK THIS PLACE DCA I TEMP JMS I [GETEOF /GET EOF RDF TAD O6201 DCA TMP2FLD /GET FIELD OF END OF FILE CLL TAD TEMP /MOVE FILE UP TAD TOWARD /TO DCA TOWARD /HERE SZL JMS I [FINCR /MIGHT BE ACROSS A FIELD RDF TAD O6201 DCA TWD2FLD /SAVE NEW EOF FIELD TAD TOWARD /SAVE NEW EOF JMS I [SETEOF TMP2FLD,HLT TAD I TEMP TWD2FLD,HLT DCA I TOWARD /MOVE UP ONE WORD TAD I TOWARD TAD O7741 /IS THE MARK ? SNA CLA JMP LASTWD /YES, PUT IN LAST WORD CLA CLL CMA TAD TOWARD /BACK UP POINTERS DCA TOWARD SZL JMP .+4 TAD TWD2FLD /AND FIELDS (MAYBE) TAD O7770 DCA TWD2FLD CLA CLL CMA TAD TEMP DCA TEMP SZL JMP TMP2FLD TAD TMP2FLD TAD O7770 DCA TMP2FLD JMP TMP2FLD LASTWD, TAD TEMP2 /PUT IN SAVED WORD DCA I TOWARD JMP I [MOVE /GO MOVE IN NEW LINE COREOV, JMS I [TYPE /FILE TOO BIG MSGBIG BYEBYE, CLA IAC AND SWPNUM /IS OS8 RES IN PLACE ? SZA CLA /YES IF EVEN NUMBER OF SWAPS BYE, JMS I [SWAP /PUT BACK OS8 TSF /WAIT FOR TTY SO OS8 DOESN'T JMP .-1 /TRAMPLE ON MY LINE FEED JMP I (7605 /EXIT TO OS8 MSGBIG, 5646;5660;6372;160;6746;6347;5560;7000 MSGALT, 0145;4655;4665;4645;0 MSGWHAT,7051;4265;4000 MSGTOO, 5552;5746;0165;6060;0155;6057;5000 SCRATCH,TAD [TXTAREA/SCRATCH FILE JMS I [SETEOF DCA EOFLIN /ZERO LAST LINE NUM DCA EOFLIN+1 JMP I [CMDDONE NORM, 0 /LINE NUMBER NORMALIZER TAD NDIGS SZA JMP .+3 /IF THERE ARE NO DIGITS IN THE CLA CMA /LINE NUMBER THEN JMP I NORM /RETURN -1. TAD O7772 SMA CLA JMP I NORM /IF THE LINENO HAS BEEN FILLED TAD O7774 /OUT TO 6 DIGITS(LEADING 0'S) DCA TEMP /THEN RETURN. TAD LINENO /OTHERWISE, SHIFT RIGHT 1 DIGIT CLL RAR DCA LINENO /AND CHECK AGAIN. TAD LINENO+1 RAR DCA LINENO+1 ISZ TEMP JMP .-7 ISZ NDIGS JMP NORM+1 SETEOF, 0 /SET NEW EOF DCA EOFADR /SAVE ADDR RDF /GET FLD TAD O6201 DCA EOFFLD /SAVE IT TAD O77 /STORE EOF DCA I EOFADR JMP I SETEOF / GETEOF, 0 TAD EOFADR /RETRIEVE EOF INFO DCA TEMP /FIRST ADDR EOFFLD, CDF JMP I GETEOF PAGE COMMAND,TAD COMTBL /COMMAND LIST POINTER DCA TEMP COMLUP, ISZ TEMP /GET 2 CHAR COMMAND TAD I TEMP ISZ TEMP SNA JMP WHAT /END OF LIST TAD I [LINE+2 /IS THIS IT ? SZA CLA JMP COMLUP /NO, LOOK AGAIN TAD I TEMP /GET COMMAND ADDR DCA TEMP /AND GO TO IT JMP I TEMP WHAT, JMS I [TYPE /TYPE WHAT? MSGWHAT JMP I [MAINLUP COMTBL, . -5552 LIST -6055 OLD -6442 SAVE -6366 RUN -6444 SCRATCH -4372 BYE -5746 NEW -5742 RENAME 0 WSSAVE, 0145;6454;3343;4264;5244;1770;6400 HEADING,0 /PRINT HEADING JMS I [CRLF /LATER TAD [FNAME /SET UP FOR CONVERSION DCA TEMP /POINTER TO FILE NAME TAD XTITLE /WHERE IT GOES DCA PTR JMS CONV /OUTPUT FIRST TWO CHARS JMS CONV /NEXT TWO JMS CONV /THIRD TWO ISZ PTR /SKIP FOR EXT JMS CONV /OUTPUT EXTENSION JMS I [TYPE /TYPE HEADING XTITLE, TITLE JMS I [CRLF /FOLLOWED BY A CRLF JMP I HEADING CONV, 0 /CONVERT TO SIX BIT ASCII TAD I TEMP /GET NEXT WORD AND O77 /CHECK FOR 0 SNA /SUBSTITUTE BLANKS TAD (40 TAD O7741 /SUBTRACT 37 AND O77 /SIX BITS DCA I PTR TAD I TEMP /DO UPPER CHAR AND O7700 SNA CLL CML RAR TAD (-3700 /SAME WAY TAD I PTR /COMBINE THEM DCA I PTR ISZ TEMP ISZ PTR JMP I CONV TITLE, 0;0;0;0101;0 /FOR THE PROG NAME 0101;0101 /SOME BLANKS VERLOC, VERSON^100+2143 /VERSION NUMBER 0101;0101 /MORE BLANKS DATE, 0;0;0 /DATE TEMPLATE DASH6, 1627 /"-6" FOR BUILDING DATE EODAT, 0 /END OF DATE TEMPLATE GETNC, 0 /GET A CHAR FOR A FILE NAME TAD NCHARS /GET CHAR POINTER ISZ NCHARS /BUMP IT CLL RAR /DIVIDE BY 2 TAD [LINE+2 /ADD BASE DCA TEMP /GIVES ADDR OF WORD TAD I TEMP /GET 2 CHARS SZL /ODD EVEN BIT IS IN LINK JMP TESTCH /GO CHECK THE CHAR RTR RTR RTR TESTCH, AND O77 /ONLY 6 BITS SNA JMP I GETNC /END OF NAME TAD O37 ISZ GETNC JMP I GETNC PATCH3, 0 JMS I [GETNC JMP I PATCH3 AND O77 JMS I (SRCHBK 72 1 JMP EXB ISZ PATCH3 JMS I (SRCHBK 60 12 EXA, JMP I PATCH3 JMP I (PATCH2 EXB, CLA IAC JMP I PATCH3 PAGE LIST, TAD I [LINE+3 /LISTNH ? TAD I [LINE+4 TAD [-4436 /PSEUDO TEST SNA CLA JMP LISTNH /NO HEADING JMS I [HEADING/GIVE HEADING TAD COFLAG /WAS CTRL/O TYPED ? SNA CLA JMP I [CMDDONE/YES, ABORT LISTING LISTNH, DCA NCHARS /SET POINTER DCA NDIGS /AND DIGIT COUNTER JMS I [GETNC /SKIP UNTIL BLANK JMP NUMDUN /DONE TAD (-40 SZA CLA JMP .-4 /NO BLANK YET JMS I [GETNC /GET A CHAR JMP NUMDUN /END OF NUMBER TAD O7706 /SUBTRACT 72 JMS I [LNDIG /GO SEE IF ITS A DIGIT JMP .-4 /IT WAS, CONTINUE NUMDUN, TAD [TXTAREA DCA PTR /SET UP POINTER JMS I [NORM /NORMALIZE THE NUM SPA CLA /ANY NUMBER ? // DSN PATCH 31.12.1 M // // JMP .+3 /NO JMP PAT10 // JMS I [FINDLN /YES, LOCATE IT TAD PTR // IAC // DCA TEMP // JMS I [FDECR CLL CIA // TAD TEMP // JMP MSGRDY+2 // RDF /GET THE FIELD PAT10, TAD O6201 DCA PTR2FLD /SAVE IT DCA TEMP LSTLUP, JMS I [CTRLO /CHECK FOR CTRL/O JMP I [CMDDONE/YES, EXIT JMS CTRLS /CHECK FOR XOFF JMS GETFIL /GET CHARACTER TO LIST JMP I [CMDDONE JMS I [TTYOUT /PRINT IT JMP LSTLUP /LOOP GETFIL, 0 /GET CHARACTER FROM FILE TAD TEMP ISZ TEMP TAD .+3 DCA .+1 HLT JMP I .+1 /SEQUENCE OF OPERATIONS PTR2FLD /GET FIRST WORD FRSTDIG /FIRST DIGIT OF LINE NUMBER DIGIT /SECOND DIGIT DIGIT /THIRD DIGIT PTR2FLD /GET NEXT WORD OF LINE NUMBER DIGIT /FOURTH DIGIT DIGIT /FIFTH DIGIT LASTDIG /SIXTH AND LAST DIGIT PTR2FLD /GET WORD OF TEXT LEFTTXT /LEFT CHARACTER RITETXT /RIGHT CHARACTER LINFTXT /LINE FEED CHARACTER PTR2FLD,HLT /CHECK FOR EOF TAD I PTR CDF TAD O7701 SNA JMP I GETFIL /YES, RETURN UNSKIPPED TAD O77 DCA TEMP2 /NO, SAVE WORD ISZ PTR /BUMP POINTER JMP GETFIL+1 TAD PTR2FLD TAD O10 DCA PTR2FLD JMP GETFIL+1 LASTDIG,CLA IAC /FORCE LAST DIGIT (EVEN IF 0) FRSTDIG,DCA NDIGS /ZERO DIGIT COUNT DIGIT, TAD TEMP2 RTL RTL DCA TEMP2 /SHIFT LEFT ONE DIGIT TAD TEMP2 RAL AND O17 /GET DIGIT SZA JMP NZDIGIT /ITS NOT ZERO TAD NDIGS /IS IT A LEADING ZERO ? SNA CLA JMP GETFIL+1/YES, DON'T PRINT IT NZDIGIT,ISZ NDIGS /NON ZERO OR NON LEADING ZERO TAD O260 /SO PRINT IT JMP GFRET LEFTTXT,TAD TEMP2 /GET LEFT CHAR RTR RTR RTR JMP .+4 RITETXT,TAD O10 /SETUP FOR LEFT CHAR NEXT DCA TEMP TAD TEMP2 AND O77 /SIXBITIZE AC SNA JMP ZEROTXT /0 IS END OF THE LINE TAD O237 /MAKE IT ASCII GFRET, ISZ GETFIL JMP I GETFIL ZEROTXT,TAD O13 /SETUP FOR LF NEXT DCA TEMP TAD O215 /RETURN CR JMP GFRET LINFTXT,DCA TEMP /CLEAR SEQUENCER AND RETURN LF TAD O212 JMP GFRET / CTRLS, 0 TAD CSFLG /XON? SNA CLA JMP I CTRLS /NO JMP LSTLUP /YES / MSGRDY, 6346;4245;7200 // DSN 31.12.1 M // RDF // SNL // TAD O7770 // JMP PAT10 // PAGE GETFN, 0 /GET A FILE NAME (ALSO FETCH ITS HANDLER) DCA SAVFLAG /=1 FOR SAVE, 0 FOR OLD OR NEW TAD CHNFLAG /RETURNING FROM RUN ? SZA CLA JMP NOFUSR /YES, DON'T FETCH USR JMS I [SWAP /GET OS8 RESIDENT TAD SAVFLAG /IS IT OLD OR NEW ?? SNA CLA IAC /YES, DON'T SWAP 10000-11777 DCA I (7746 /DO IF SAVE, SO ALTER JSW CIF 10 /GET THE USR JMS I O7700 10 NOFUSR, DCA NCHARS /RESET CHAR POINTER BSKIP, JMS I [GETNC /GET A CHAR JMP ASKNAM /ASK FOR FILE NAME TAD M40 /BLANK ? SZA CLA JMP BSKIP /NO, LOOP NOSKIP, JMS GETNAM /GET A NAME SNA CLA JMP USEDSK /NO DEVICE SPECIFIED, USE DSK: TAD NAME /PUT IN THE DEVICE NAME DCA DEV /AS SPECIFIED TAD NAME+1 DCA DEV+1 JMS GETNAM /FETCH THE FILE NAME SZA CLA JMP I (IOERR /BAD SYNTAX IN FILE DESCRIPTOR JMP GETHAN /GO FETCH THE HANDLER USEDSK, TAD (0423 /SET DEVICE NAME TO DSK: DCA DEV TAD (1300 DCA DEV+1 GETHAN, TAD [HANDLR+1 DCA DEV+2 /ALSO THE HANDLER ORIGIN CIF 10 JMS I O200 /CALL THE USR 1 /FETCH HANDLER BY NAME DEV, 0;0;0 JMP I (IOERR /BAD DEVICE TAD DEV+1 /SAVE THE DEVICE NUMBER DCA DEVNUM TAD DEV+2 /AND THE HANDLER ENTRY POINT DCA DEVHAN MOVEFN, TAD SAVFLAG /WAS IT A SAVE ? M40, SMA SZA CLA JMP I GETFN /YES, JUST RETURN TAD NAME /NEW OR OLD, ANY NAME GIVEN ? SNA JMP I GETFN /NO, PROBABLY JUST A DEVICE DCA FNAME /YES, SAVE IT TAD NAME+1 DCA FNAME+1 TAD NAME+2 DCA FNAME+2 TAD NAME+3 DCA FNAME+3 JMP I GETFN ASKNAM, TAD SAVFLAG /WAS THIS A SAVE ? SPA SNA CLA JMP ASKNM /NO, GO ASK FOR A NAME TAD FNAME /IT WAS A SAVE, ANY OLD NAME TO USE ? SNA JMP ASKNM /NO, GO ASK FOR ONE DCA NAME /YES, MOVE INTO NAME TAD FNAME+1 DCA NAME+1 TAD FNAME+2 DCA NAME+2 TAD FNAME+3 DCA NAME+3 JMP I GETFN ASKNM, CLA IAC /ASK FOR FILE NAME JMS I [TYPE ASKFN TAD (DUMMY DCA [LNDIG JMS I [GETLIN JMP I (PATCH1 SAVFLAG,0 GETNAM, 0 /GET A FILE OR DEVICE NAME DCA NAME /ZERO THE NAME BUFFER DCA NAME+1 DCA NAME+2 TAD O201 /USE DEFAULT EXT .BA DCA NAME+3 TAD [NAME /SETUP POINTER DCA TEMP2 TAD O7774 /SETUP SIZE (MAX 4 WORDS) DCA SIZE NAMLUP, JMS I (PATCH3 JMP I GETNAM CLL RTL RTL RTL DCA I TEMP2 /SAVE IT JMS I (PATCH3 JMP I GETNAM TAD I TEMP2 /COMBINE THE 2 DCA I TEMP2 ISZ TEMP2 ISZ SIZE /ANY MORE ? JMP NAMLUP JMP I GETNAM RENAME, CLL CML RAR /SAVE USR AREA JMS GETFN /GET FILE NAME CIF 10 JMS I O200 /REMOVE USR 11 /AND RESTORE 10000-11777 JMS I [SWAP /SWAP OS8 RESIDENT JMP I [CMDDONE NEW, TAD [TXTAREA /SCRATCH JMS I [SETEOF DCA EOFLIN /ZERO LAST LINE NUM DCA EOFLIN+1 JMS GETFN /GET THE FILE NAME JMS I [SWAP /REMOVE OS8 JMP I [CMDDONE PAGE PUTFIL, 0 /WRITE THE FILE TAD [TXTAREA DCA PTR /GET POINTER TO TEXT TAD O6201 /GET FIELD OF TEXT DCA I [PTR2FLD DCA TEMP /ZERO LINE SEQUENCER TAD [DSKBUF /GET ADDR OF DISK BUFFER DCA SWAPT1 /BUFFER POINTER TAD O7600 DCA SWAPT2 /DOUBLE WORD COUNTER TAD JMPINS /SET 3 WAY SWITCH DCA PUTJMP PFLOOP, JMS I [GETFIL /GET A CHAR FROM TEXT AREA JMP PFCTLZ /END OF FILE JMS PUTCH /OUTPUT IT JMP PFLOOP /DO NEXT CHAR PFCTLZ, TAD O232 /PUT CTRL-Z JMS PUTCH TAD O7201 /BUFFER DUMP COUNT DCA PFTEMP JMS PUTCH /FILL WITH ZEROES ISZ PFTEMP JMP .-2 JMP I PUTFIL /DONE PFTEMP, 0 PUTCH, 0 /PUT A CHAR ONTO THE OS8 FILE DCA SWAPT4 /SAVE THE CHAR PUTJMP, HLT /JUMP TO CORRECT PLACE JMP PH1 /FIRST CHAR JMP PH2 /SECOND CHAR PH3, TAD JMPINS /RESTORE SWITCH DCA PUTJMP TAD SWAPT4 /GET THE CHAR AND O17 /LOW FOUR BITS CLL RAR RTR /INTO THE HIGH PART OF WORD TWO RTR TAD I SWAPT1 /COMBINE WITH CHAR 2 DCA I SWAPT1 TAD SWAPT4 /GET THE HIGH FOUR BITS RTL RTL /INTO THE HIGH PART OF WORD ONE AND O7400 TAD I SWAPT3 /COMBINE WITH WORD ONE DCA I SWAPT3 ISZ SWAPT1 /BUMP POINTER ISZ SWAPT2 /BUMP DOUBLE WORD COUNT JMP I PUTCH /RETURN JMS I [SWAP /SWAP IN OS8 JMS I DEVHAN /WRITE THIS BUFFER 4200 DSKBUF WRBLOK, 0 JMP I (OUERR ISZ OUSIZE /ANY ROOM LEFT ? SKP JMP I (OUERR /NO, ERROR ISZ WRBLOK /BUMP BLOCK NUMBER ISZ I (OULEN /BUMP ACTUAL SIZE JMS I [SWAP /SWAP BACK TAD [DSKBUF /SET UP BUFFER POINTER DCA SWAPT1 TAD O7600 DCA SWAPT2 /SET UP COUNT JMP I PUTCH PH2, TAD SWAPT1 /SAVE POINTER TO FIRST DCA SWAPT3 ISZ SWAPT1 /BUMP POINTER PH1, TAD SWAPT4 /GET CHAR DCA I SWAPT1 /INTO BUFFER ISZ PUTJMP /BUMP SWITCH JMP I PUTCH JMPINS, JMP PUTJMP+1 OUSIZE, 0 SWAP, 0 /SWAP OS8 RESIDENT ISZ SWPNUM /FLIP BYEBYE SWITCH NOP JMS SWAP2 /WITH OS8RES THROUGH OS8RES+577 OS8RES CDF JMS SWAP2 OS8RES+200 CDF 10 PATCH5, JMS SWAP2 /OVERLAID IF <12K OS8RES+400 CDF 20 JMP I SWAP SWAP2, 0 TAD O7600 DCA SWAPT3 TAD I SWAP2 ISZ SWAP2 DCA SWAPT4 TAD I SWAP2 ISZ SWAP2 DCA SWPFLD JMP .+5 SWPLUP, CDF 00 TAD SWAPT1 DCA I SWAPT4 ISZ SWAPT4 TAD I SWAPT4 DCA SWAPT2 SWPFLD, HLT TAD I SWAPT3 DCA SWAPT1 TAD SWAPT2 DCA I SWAPT3 ISZ SWAPT3 JMP SWPLUP CDF 00 TAD SWAPT1 DCA I SWAPT4 JMP I SWAP2 BADFIL, 4342;4501;4752;5546;0 ASKFN, 4752;5546;0157;4256;4616;1600 PAGE RUN, TAD I [LINE+3 /RUNNH ? TAD I [LINE+4 TAD (-3057 SZA CLA JMS I [HEADING/GIVE A HEADING TAD [LINE+2 /SET UP FAKE LINE DCA TEMP TAD [WSSAVE DCA PTR TAD O7771 DCA TEMP2 TAD I PTR /MOVE FAKE LINE INTO "LINE" ISZ PTR DCA I TEMP ISZ TEMP ISZ TEMP2 JMP .-5 ISZ RUNFLAG /SET RUN FLAG JMP GFN SAVE, DCA RUNFLAG /CLEAR THE RUN FLAG TAD DEVNUM /SAVE CURRENT DEVICE NUM DCA OLDDEV /INCASE WE CHANGE GFN, CLA IAC /SET SAVFLAG JMS I [GETFN /GET THE DEV:NAME.EX TAD XNAME /SET UP ENTER DCA SAVBLK /POINTER TO FILE NAME TAD DEVNUM /GET DEVICE NUMBER CIF 10 JMS I O200 /ENTER FILE 3 SAVBLK, 0 /STARTING BLOCK GOES HERE 0 /SIZE GOES HERE JMP I (IOERR TAD SAVBLK /PUT BLOCK NUMBER DCA I (WRBLOK /INTO WRITE TAD SAVBLK+1/PUT SIZE DCA I (OUSIZE /SOMEWHERE TOO DCA OULEN /ZERO BLOCK COUNT CIF 10 JMS I O200 /DUMP USR 11 JMS I [SWAP /AND NOW OS8 JMS I (PUTFIL /DO THE SAVE JMS I [SWAP /GET OS8 TAD RUNFLAG /SET NO SWAP BIT IF RUN DCA I (7746 CIF 10 /GET THE USR JMS I O7700 10 TAD DEVNUM /GET DEVICE NUMBER CIF 10 JMS I O200 /CLOSE THE FILE 4 XNAME, NAME OULEN, 0 /SIZE JMP I (IOERR TAD RUNFLAG /WAS IT A RUN ? SZA CLA JMP I (DORUN /YES TAD OLDDEV /IS OLD DEVICE CIA /THE SAME AS TAD DEVNUM /THE NEW ONE ?? SNA CLA JMP HNDLOK /YES, THE HANDLER IS OK TAD OLDDEV /RESTORE DEVICE NUMBER DCA DEVNUM TAD [HANDLR+1 DCA DEVN /SET UP HANDLER LOAD ADDR TAD DEVNUM CIF 10 JMS I O200 1 DEVN, 0 JMP I (IOERR TAD DEVN /RESET THE HANDLER ADDRESS DCA DEVHAN HNDLOK, CIF 10 /GET RID OF THE USR JMS I O200 11 JMS I [SWAP /REMOVE OS8 AGAIN JMP I [CMDDONE OLDDEV, 0 FINDLN, 0 /FIND A LINE TAD [TXTAREA DCA TEMP SEARCH, TAD TEMP /COMPARE THE NUMBER OF DCA PTR /THIS LINE WITH THE SPOT TAD I TEMP /IN THE TEXT AREA. TAD O7701 SNA JMP I FINDLN /NEW LINE GOES AT EOF TAD O77 CLL CIA TAD LINENO SNA JMP SAME1ST SNL CLA JMP I FINDLN /INSERT NEW LINE ISZ TEMP SKP JMS I [FINCR CONTIN, JMS I [PASS /IF ITS GREATER KEEP SEARCHING. JMP SEARCH SAME1ST,ISZ TEMP /FIRST HALF OF LINE NUM SAME SKP JMS I [FINCR TAD I TEMP CLL CIA /CHECK SECOND HALF TAD LINENO+1 SNA JMP SAME2ND /REPLACE OLD WITH NEW SZL CLA JMP CONTIN JMS I [FDECR TAD TEMP DCA PTR JMP I FINDLN /INSERT NEW LINE SAME2ND,JMS I [PASS JMP I FINDLN PAGE DORUN, TAD (INFO+11/SET UP SOME OF INFO BLOCK DCA X10 CDF 10 TAD DEVHAN /SAVE DEVICE HANDLER ADDRESS (DSK:) DCA I X10 CLL CML RTL /SAVE DEVICE NUMBER DCA I X10 CDF TAD I (SAVBLK /SAVE STARTING BLOCK CDF 10 DCA I X10 TAD FNAME /SAVE FILE NAME DCA I X10 TAD FNAME+1 DCA I X10 TAD FNAME+2 DCA I X10 TAD FNAME+3 DCA I X10 CDF JMS XMOVE /MOVE THIS PAGE INTO FIELD 1 CDF DORUN CDF 10 -200 CDF CIF 10 /GO TO THE FIELD ONE COPY RUNDO, JMS XMOVE /MOVE THE HANDLER INTO FIELD 1 CDF HANDLR CDF 10 -400 TAD I (INFO+1 /GET START OF BCOMP.SV DCA BCBLOK CIF JMS I (7607 /READ IN THE COMPILER BCSIZE 0 BCBLOK, 0 JMP WHUPS JMS XMOVE /MOVE BACK THE HANDLER CDF 10 HANDLR CDF -400 CLA IAC /OPEN THE TEMP FILE JMS I (200 3 TMPBLK, TMPFIL 0 JMP WHUPS JMS I (200 /RESET SYSTEM TABLES 13 /AND REMOVE TENTATIVE FILES TAD TMPBLK /SAVE ITS START DCA I (INFO+10 TAD TMPBLK+1 DCA I (INFO+11 /AND ITS MAX LENGTH DCA I (7644 /KILL R SWITCH CIF CDF JMP I (BCBEGN /GO START THE COMPILER WHUPS, TAD (123 /PRINT SY ERROR JMS TTYO TAD (131 JMS TTYO TAD (15 JMS TTYO TAD (12 JMS TTYO TSF /WAIT FOR FLAG JMP .-1 CDF CIF JMP I (7605 /RETURN TO OS8 TTYO, 0 TSF JMP .-1 TLS CLA JMP I TTYO XMOVE, 0 RDF /GET CALLING FIELD TAD (6203 /PLUS CIF CDF 0 DCA MOVRTN /FOR RETURN JMS GMOVE /GET FROM FIELD DCA MFFLD JMS GMOVE /GET ADDRESS DCA MFPTR JMS GMOVE /GET TO FIELD DCA MTFLD JMS GMOVE /GET COUNT DCA MCNT MFFLD, HLT TAD I MFPTR /MOVE IT MTFLD, HLT DCA I MFPTR ISZ MFPTR ISZ MCNT JMP MFFLD MOVRTN, HLT JMP I XMOVE MFPTR, 0 MCNT, GMOVE, 0 TAD I XMOVE /GET ARG FOR MOVE ISZ XMOVE JMP I GMOVE TMPFIL, FILENAME BASIC.TM PATCH1, CLA TAD (400 DCA [LNDIG DCA NCHARS JMP I (NOSKIP PAGE GETCH, 0 /GET A CHARACTER FROM THE TTY TAD OLDFLAG /INPUT FROM A FILE ? SZA CLA JMP FILEIN /YES KSF JMP .-1 KRB AND O177 JMP I GETCH FILEIN, ISZ COUNT /ANYTHING IN BUFFER ? JMP NOREAD /YES, NO READ TAD O7200 /SET BUFFER COUNT DCA COUNT TAD [DSKBUF /SET BUFFER POINTER DCA RDPTR TAD RDJMP /RESET JUMP DCA NOREAD JMS I [SWAP /GET OS8 TAD RDSIZE /ANY ROOM LEFT ? SNA JMP INERR /BAD END OF IFILE IAC DCA RDSIZE JMS I DEVHAN /READ NEXT BLOCK 200 DSKBUF RDBLOK, 0 JMP CHKSOF /CHECK FOR SOFT ERROR SOFTOK, ISZ RDBLOK /BUMP BLOCK NUMBER JMS I [SWAP /AWAY WITH OS8 NOREAD, HLT /3W UNPACK JUMP JMP INCHR1 JMP INCHR2 INCHR3, TAD RDJMP /RESET SWITCH DCA NOREAD TAD I RDPTR /GET LOW 4 BITS ISZ RDPTR /BUMP POINTER AND O7400 /MASK IT CLL RTR /SHIFT RIGHT 4 RTR DCA TEMP /SAVE TAD I RDTMP /GET HIGH 4 BITS AND O7400 TAD TEMP /COMBINE THEM CLL RTR /SHIFT RIGHT 4 RTR JMP AND177 /GO FINISH INCHR2, TAD RDPTR /SAVE ADDR OF FIRST WORD DCA RDTMP ISZ RDPTR /BUMP POINTER INCHR1, TAD I RDPTR /GET NEXT CHAR ISZ NOREAD /BUMP SWITCH AND177, AND O177 /MASK 7 BITS TAD O7746 /CHECK FOR ^Z SNA JMP ENDOLD /EOF TAD O32 /RESTORE CHAR JMP I GETCH ENDOLD, DCA OLDFLAG /KILL OLD FLAG TAD CHNFLAG /WAS IT A RETURN FROM RUN ? SNA CLA JMP I [CMDDONE/NO, JUST AN OLD COMMAND DCA CHNFLAG /KILL FLAG TAD (INFO-3764 DCA X10 /PICK UP NAME FROM INFO BLOCK TAD I X10 /(WHICH IS SWAPPED OUT) DCA FNAME TAD I X10 DCA FNAME+1 TAD I X10 DCA FNAME+2 TAD I X10 DCA FNAME+3 JMP I [CMDDONE/DONE WITH RETURN OLDBAD, DCA FNAME+3 /TRY WITHOUT EXT ISZ TEMP /OR HAVE WE ALREADY ? JMP OLDTRY /NO, NOT YET IOERR, INERRX, CIF 10 JMS I O200 /DISMISS USR 11 OUERR, INERR, DCA OLDFLAG /KILL OLD STATUS JMS I [SWAP /OUT WITH OS8 JMS I [TYPE /PRINT MESSAGE BADFIL JMP I [MAINLUP OLD, TAD [TXTAREA/SCRATCH FILE JMS I [SETEOF DCA EOFLIN /ZERO LAST LINE NUM DCA EOFLIN+1 JMS I [GETFN /GET FILE NAME CLL CMA RAL /SET RETRY COUNT DCA TEMP OLDTRY, TAD [FNAME /POINTER TO FILE NAME DCA SB /INTO LOOKUP CALL TAD DEVNUM /GET DEVICE NUMBER CIF 10 JMS I O200 /LOOKUP FILE 2 SB, 0 /START GOES HERE RDSIZE, 0 /SIZE GOES HERE JMP OLDBAD /BAD FILE TAD SB /MOVE BLOCK SNA ISZ RDSIZE /SET COUNT TO 4095 IF NOT D.A. DCA RDBLOK CLA IAC /SET SWITCH DCA OLDFLAG /INPUT COMING FROM FILE CLA CMA /SET COUNT TO INITIALIZE READ DCA COUNT JMS I [SWAP /MOVE OS8 JMP I [MAINLUP/DO OLD RDJMP, JMP NOREAD+1 COUNT, 0 PATCH2, JMS I [SRCHBK 01 32 JMP I (EXA TAD (-56 SZA CLA JMP INERRX JMP I (PATCH4 / CHKSOF, SMA CLA JMP SOFTOK /SOFT ERROR JMP INERR PAGE HEIGHT, -30 /SET TO SCREEN HEIGHT BY SET COMMAND SDELAY, -200 /SET TO HOLD SCREEN DELAY BY SET COMMAND IFNZRO HEIGHT-3000 <__FIX SET COMMAND__> LINCNT, 0 /THIS WORD IS ZERO TO FLAG THE NEW BASIC EDITOR TO "SET" CURPOS, 0 STIMER, 0 SCOPFG, 0 /SET NONZERO IF TERMINAL IS A SCOPE /SKIP IF ^O NOT TYPED AND CLEAR 'COFLG' /RETURN TO CALL+1 IF ^O WAS TYPED AND SET 'COFLG' /SET OR CLEAR 'CLFLG' IF ^S OR ^Q TYPED OTHERWISE ZERO, CTRLO, 0 KSF JMP CTRLOX KRB AND A177 TAD MCC SNA JMP I (BYEBYE TAD MCO SNA JMP CTRLOX+2 TAD MCQ SNA JMP SETFLG+1 TAD MCS SNA JMP SETFLG CTRLOX, ISZ CTRLO CLA IAC DCA COFLAG JMP I CTRLO SETFLG, IAC DCA CSFLG JMP CTRLOX CRLF, 0 TAD O215 JMS I [TTYOUT TAD O212 JMS I [TTYOUT JMP I CRLF /PRINT A CHAR ON TERMINAL /PAUSE IF LF WAS PRINTED AND DELAY REQUESTED /SCREENSIZE ALSO SET BY "SET TTY" COMMAND TTYOUT, 0 TSF /FIRST WAIT JMP .-1 TLS /NOW PRINT THE CHAR AND A177 TAD (-15 /TEST IF LF WILL FOLLOW SZA CLA JMP I TTYOUT /RETURN IF NO ISZ LINCNT /TEST LINE COUNTER FOR SCREENFULL JMP I TTYOUT TAD HEIGHT DCA LINCNT /NOW RESET SCREEN COUNTER TAD SDELAY SNA /SKIP IF DELAY REQUESTED JMP I TTYOUT /OTHERWISE JUST RETURN AT ONCE DCA STIMER /SET HOLD SCREEN TIMER DLOOP, KSF /FIRST TEST IF KEY STRUCK JMP NOKST /JMP IF NO KRS /ELSE READ CHAR AND A177 /MASK TO 7BIT TAD MCC SNA JMP I [BYEBYE /JMP IF ^C SEEN TAD MCO SZA TAD MCQ SZA TAD MCS SNA CLA JMP I TTYOUT /RETURN WITH CHAR STILL IN BUFFER IF ANY OF ABOVE SEEN NOKST, ISZ ZERO JMP .-1 /LOOP 4096 TIMES (USUALLY) ISZ STIMER /TEST DELAY COUNTER JMP DLOOP /REITERATE IF NOT DONE JMP I TTYOUT /ELSE RETURN FOR MORE MCC, -3 MCO, -17+3 MCQ, -21+17 MCS, -23+21 A177, 177 /PRINT A BACKSPACE /IF TERMINAL IS A SCOPE, ECHO BS,SP,BS TO RUBOUT AND REPOSITION /CURSOR. OTHERWWISE ECHO BACKARROW PRTBSP, 0 TAD SCOPFG /TEST SCOPE BIT SNA CLA JMP BKARRW /NOT - ECHO BACKARROW TAD NCHARS /SEE IF AT LEFT MARGIN TAD NDIGS SNA CLA JMP I PRTBSP /DO NOTHING IF YES TAD O10 /ELSE ECHO BS JMS I [TTYOUT TAD (40 JMS I [TTYOUT /SP TAD O10 SKP /BS JUSTSP, TAD (40 /SPACE JMS I [TTYOUT JMP I PRTBSP /DONE BKARRW, TAD ("_ JMS I [TTYOUT JMP I PRTBSP PAGE LINE, /THE TELETYPE LINE BUFFER. WSNAME, 0;0;0145;6454;3343;4264;5244;1770;6400 START, JMP RBASIC /IT WAS RAN CDF 10 /IF CHAINED TO CHECK IF CCL PASSED TAD I (7644 /Q SWITCH IN RESPONSE TO .BASIC COMMAND (OS78) CDF AND O200 /ISOLATE THE BIT SZA CLA JMP RBASIC /TREAT AS .R BASIC IF YES JMS I (CORE CLA IAC DCA I (JSW /NO SWAP CIF 10 JMS I (7700 /FETCH USR 10 CIF 10 JMS I (200 /RESET SYSTEM TABLES 13 TLS /SET TTY FLAG JMS GETDAT /SET UP TITLE ISZ CHNFLAG /TELL ABOUT RETURN FROM RUN JMP I (OLD /READ IN OLD WORK SPACE RBASIC, CDF 10 DCA I (7643 DCA I (7644 CDF 0 TLS JMS I (CORE TAD O77 DCA I [TXTAREA JMS GETDAT /SET UP TITLE FINDSV, TAD I X11 /LOOK UP SOME SAVE FILES SNA JMP LUBUF /GO FIND BASIC.UF DCA XXXXSV /SAVE POINTER TO NAME CLA IAC CIF 10 JMS I (200 2 XXXXSV, 0 0 JMP NG IAC CDF 10 TAD XXXXSV DCA I X10 /SAVE BLOCK PLUS 1 CDF /IN INFO AREA JMP FINDSV LUBUF, CLA IAC /FIND BASIC.UF CIF 10 JMS I (200 2 BUFN 0 JMP .+3 /OK IF MISSING TAD .-3 IAC /SAVE BLOCK +1 CDF 10 DCA I X10 CDF CLA IAC /TYPE WITH NO CARRIAGE RETURN JMS I [TYPE /"OLD OR NEW -- " OLDNEW JMS I [SWAP JMP I (MAINLUP NG, JMS I [TYPE /PART OF SYSTEM MISSING MISING JMP I (7605 /THE FOLLOWING ROUTINE ASSUMES THAT THE YEAR IS ALREADY /SET UP BY A CALL TO "CORE" - JR GETDAT, 0 /PUT OS8 DATE INTO THE TITLE CDF 10 TAD I (MDATE /GET DATE WORD CDF DCA TEMP2 /SAVE IT TAD TEMP2 SNA JMP I GETDAT /NO DATE AND O7400 /GET MONTH CLL RTL /SHIFT SOME RTL RTL TAD (MONTHS-3 DCA X12 TAD (DATE-1 /SET UP POINTER TO DATE DCA X13 TAD TEMP2 /GET DAY RTR RAR AND O37 JMP DAYGO /CONVER TO TEXT DAYLP, TAD (100-12 /REDUCE AND TALLY QUOTIENT TAD TEMP DAYGO, DCA TEMP TAD TEMP /SEE IF OVERFLOW AND O77 TAD O7766 SMA CLA JMP DAYLP /REDUCE MOD 10 IF NOT TAD TEMP TAD (2121 /UNPACK TO HANK'S ASCII DCA I X13 /INTO DATE TAD I X12 /GET MONTH CHARS DCA I X13 TAD I X12 DCA I X13 / TAD TEMP2 /GET YEAR / AND (7 / TAD (21 / CLL RTL / RTL / RTL / ISZ X13 /THE WORD WITH -7 IS THERE / DCA I X13 /STORE LAST DIGIT OF YEAR /ABOVE JOB DONE BY "CORE" DURING INIT TIME JMP I GETDAT PAGE MONTHS, 1653;4257 /-JAN 1647;4643 /-FEB 1656;4263 /-MAR 1642;6163 /-APR 1656;4272 /-MAY 1653;6657 /-JUN 1653;6655 /-JUL 1642;6650 /-AUG 1664;4661 /-SEP 1660;4465 /-OCT 1657;6067 /-NOV 1645;4644 /-DEC NAMLST, BASICN BCOMPN BLOADN BRTSN BAFN BSFN BFFN 0 BASICN, FILENAME BASIC.SV BCOMPN, FILENAME BCOMP.SV BLOADN, FILENAME BLOAD.SV BRTSN, FILENAME BRTS.SV BAFN, FILENAME BASIC.AF BSFN, FILENAME BASIC.SF BFFN, FILENAME BASIC.FF BUFN, FILENAME BASIC.UF MISING, 5257;4460;5661;5546;6546;0164;7264;6546;5600 OLDNEW, 5746;7001;6063;0160;5545;1616;0 PAGE /THIS PAGE GETS WIPED OUT SOON /ROUTINE TO GET CORESIZE, SETUP DATE IN HEADING /AND SET SCOPE / TTY FLAG FOR RUBOUT TREATMENT CORE, 0 /CORE SIZE SUBROUTINE CDF 10 /GET INTO DATE FIELD TAD I (MDATE CDF /RESET FIELD AND (7 /LOOK AT LOW YEAR BITS DCA TEMP /HOLD TAD I (BIPCCL /NOW GET THE EXTENDED BITS AND (600 /FROM THE 600 BITS CLL RTR CLL RTR /SHIFT INTO PLACE TAD TEMP /ADD TO LOW BITS ISZ I (DASH6 /BUMP THE YEAR TENS DIGIT TAD (-12 SMA /SKP IF .LT. 10 OFF OF 1970 JMP .-3 /ELSE DECR AGAIN TAD (12+21 /CONVERT TO "HANKS ASCII" CLL RTL RTL RTL /SWAP TO LEFT HALF BYTE DCA I (EODAT /NOW STORE IN DATE TEMPLATE CDF 10 TAD I (7726 /LOOK AT HLT/CLA HLT SCOPE KLUDGE CDF AND O200 /GET SCOPE BIT DCA I (SCOPFG /AND STORE IT /STANDARD OS/8 CORESIZE ROUTINE TAD I (7777 AND COR70 CLL RAR RTR SNA JMP COR0 IAC DCA CORSIZ JMP COREX COR0, CDF TAD CORSIZ RTL RAL AND COR70 TAD COREX DCA .+1 COR1, CDF TAD I CORLOC COR2, NOP DCA COR1 TAD COR2 DCA I CORLOC COR70, 70 TAD I CORLOC CORX, 7400 TAD CORX TAD CORV SZA CLA JMP COREX TAD COR1 DCA I CORLOC ISZ CORSIZ JMP COR0 COREX, CDF TAD CORSIZ CIA DCA CORSIZ CLL CML CLA RTL /2 TAD CORSIZ SZA CLA JMP I CORE TAD (SWAP&177+5600 DCA I (PATCH5 JMP I CORE CORLOC, CORX CORV, 1400 $$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 | /OS8 BASIC COMPILER, V5 / / / / / / / // / / / / /COPYRIGHT (C) 1972, 1973, 1974, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /DEC-S8-LBASA-B-LA / /COPYRIGHT C 1972, 1973, 1974 / /DIGITAL EQUIPMENT CORPORATION /MAYNARD,MASSACHUSETTS 01754 / /AUGUST 19, 1972 / /HANK MAURER, 1972 /SHAWN SPILMAN, 1973 / / /ASSEMBLE AND LOAD AS FOLLOWS: / / .R PAL8 / *BCOMP,BCOMP<BCOMP.03 / .R ABSLDR / *BCOMP$ / .SA SYS BCOMP;7000 / /NOTE DIFFERENCES FROM VERSION 1 AS FOLLOWS: / / .R SRCCOM / *LPT:<BCOMP.01,BCOMP.03 / * / / VERSON=5 /VERSION LOCATED IN CORE AT TAG "VERLOC" /LEFT HALF OF VERLOC = 60+VERSON /RIGHT HALF OF VERLOC = PATCH LEVEL (01=A) / /CORRECTION & ADDITION MADE FOR V4 J.K. 1975 / / ./V FOR VERSION NUMBER / . ABILITY TO INPUT FROM PTR / .CORRECT TEST FOR BATCH RUNNIG / .IGNORE MORE THAN 10 SIGNIFICANT DIGITS / OF NUMERIC CONSTANTS /JR 30-APR-77 UPDATE VERSION *5 TEMP3, 0 XABORT, ABORT /ADDR OF ABORT ROUTINE 0 X10, INFO-5 /AUTO INDEX REGISTERS X11, NAMLST-1 X12, INFO-5 X13, BOSINFO-1 OSTACK, STACKO-1 /OPERAND STACK POINTER STACK, STACKA-1 /GENERAL STACK POINTER NEXT, FREE-1 /NEXT FREE LOCATION CHRPTR, 0 /INPUT BUFFER POINTER NCHARS, 0 /SIZE OF INPUT LINE TEMP, -4 TEMP2, 0 DECPT, 0 /SET 1 IF . NDIGIT, 0 /NUM DIGITS RIGHT OF . EXPON, 0 /EXPONENT FOR NUM CONV TYPE, 0 /TYPE OF CURRENT OPERAND SYMBOL, 0 /SYMBOL NUMBER OF CUR. OPERAND LEFT, 0 /LEFT SIDE SWITCH OLDOP, 0 /OLD OPERATOR NEWOP, 0 /NEW OPERATOR TMPCNT, 0 /TEMP COUNTER TMPLVL, 3 /TEMP LEVEL STMPCT, 0 /TEMP COUNT (STRINGS) STMPLV, 1 /TEMP LEVEL (STRINGS) STPTR, 0 /POINTER TO S.T. ENTRY VARCNT, -401 /NUMBER OF POSSIBLE NUMERIC /VARIABLES, LITERALS, AND TEMPS SVCNT, -401 /SAME FOR STRING VARS ACNT, -41 /ARRAY COUNTER SACNT, -41 /STRING ARRAY COUNTER LOCTRH, 0 /HIGH ORDER LOCATION COUNTER LOCTRL, 0 /LOW ORDER " " BLOCK, 0 /START BLOCK OF TEMP FILE HIFLD, 0 /HIGHEST CORE FIELD BRTS, 0 /START OF BRTS.SV DLSIZE, 0 /NEG. SIZE OF DATA LIST ABORTX, 0 /START OF EDITOR LINEH, 0 /LINE NUMBER (HIGH) LINEL, 0 /LINE NUMBER (LOW) MODE, 0 /INTERPRETER MODE TYPE1, 0 /TYPE AFTER JMS GETA1 SYMBL1, 0 /SYM # AFTER JMS GETA1 OLDSTK, 0 /STACK SAVER FOR DEF ARGCNT, 0 /ARG COUNTER FOR DEF PCRLF, /CR SWITCH FOR PRINT STMT DACNT, /ARG COUNT FOR UDEF STMT FORJMP, /FOR LOOP JUMP INSTR NOSN, /STMT NUMBER PRESENT SWITCH COLON, /: SWITCH FOR GETFN ROUTINE JAROND, 0 /END OF DEF ADDR GOES HERE (INDIRECTLY) IFNREG, 0 /CONTENTS OF IFN REG SSREG1, 0 /EXECUTION TIME CONTENTS SSREG2, 0 /OF THE SS REGISTORS STKLVL, STACKA-1 /STACK BASE LEVEL FINDEX, 0 /FOR LOOP INDEX SETFLD, 0 /FIELD CHANGE RTNE FOR LUKUP2 LUFLD, CDF 10 /FIELD OF ENTRY FOR LUKUP2 JMP I SETFLD QERMSG, ERMSG /SUBROUTINE POINTERS QLODSN, LODSN QCHKWD, CHKWD QMODSET,MODSET QSNUM, SNUM QOUTWRD,OUTWRD QSAVECP,SAVECP QGETC, GETC QGETCWB,GETCWB QRESTCP,RESTCP QEXPR, EXPR QOUTOPR,OUTOPR QNEWLIN,NEWLIN QREMARK,REMARK QGETA1, GETA1 QLOADSS,LOADSS QCHECKC,CHECKC QGETNAM,GETNAM QCOMARP,COMARP QLOOKUP,LOOKUP QLUKUP2,LUKUP2 QLOAD, LOAD QPUSH, PUSH QPOP, POP QPUSHO, PUSHO QSAVAC, SAVAC QBACK1, BACK1 QNUMBER,NUMBER QSTRING,STRING QLETTER,LETTER QDIGIT, DIGIT QNOREGS,NOREGS Q400, 400 NAME1, /VARIABLE OR FUNCT NAME WORD1, 0 /3 WORD LITERAL BUFFER NAME2, WORD2, 0 NAME3, WORD3, 0 ACO, 0 /FAC OVERFLOW WD OP1, 0 /4 WORD ARG FOR "NUMBER" OP2, 0 OP3, 0 OPO, 0 NUMDIG, -13 SIGDIG, 0 INFO= 7604 /INFORMATION AREA /INFO STARTING BLOCK +1 OF BASIC.SV /INFO+1 STARTING BLOCK +1 OF BCOMP.SV /INFO+2 STARTING BLOCK +1 OF BLOAD.SV /INFO+3 STARTING BLOCK +1 OF BRTS.SV /INFO+4 STARTING BLOCK +1 OF BASIC.AF /INFO+5 STARTING BLOCK +1 OF BASIC.SF /INFO+6 STARTING BLOCK +1 OF BASIC.FF /INFO+7 STARTING BLOCK +1 OF BASIC.UF /INFO+10 STARTING BLOCK OF BASIC.TM /INFO+11 SIZE IN BLOCKS OF BASIC.TM /INFO+12 INPUT HANDLER ENTRY ADDRESS /INFO+13 SIZE AND DEVICE NUMBER OF INPUT FILE /INFO+14 STARTING BLOCK OF INPUT FILE /INFO+15 THROUGH /INFO+20 NAME OF WORKSPACE / / BOSINFO= 7774 /BOS PARAMETER AREA EDTSIZ= 2100 /SIZE OF BASIC.SV EDTBGN= 3212 /RESTART FOR EDITOR ERMSG2= 1712 /POST PROCESSOR ERROR SWITCH EOST= 7570 /UPPER LIMIT FOR SYMBOL TABLE INDEVH= 4600 /INPUT DEVICE HANDLER LINE= 7000 /LINE BUFFER LINMAX= 121 /MAXIMUM BASIC STMT STACKA= 7120 /MAIN STACK STAKSZ= 60 /SIZE OF MAIN STACK /OPERAND STACK DEFINED IN-LINE STRLIM= 120 /MAXIMUM STRING SIZE INBUF= 7200 /INPUT BUFFER / / /FIELD ONE STUFF / / OUBUF= 0 /OUTPUT BUFFER VARST= 400 /VARIABLE SYMBOL TABLE SVARST= VARST+436/STRING VAR SYMBOL TABLE ARAYST= SVARST+1074/ARRAY SYMBOL TABLE SARYST= ARAYST+200/STRING ARRAY SYMBOL TABLE SNUMS= SARYST+200/STMT NUMBER BUCKETS TEMPS= SNUMS+24 /NUMERIC TEMP BUCKET STEMPS= TEMPS+2 /STRING TEMP BUCKET LITRL= STEMPS+2 /NUMERIC LITERAL BUCKET SLITRL= LITRL+2 /STRING LITERAL BUCKET DATLST= SLITRL+2 /DATA LIST FUNCTN= DATLST+2 /FUNCTION LIST FREE= FUNCTN+2 /START OF FREE CORE / INTERPRETER OPCODES / / MEMORY REFERENCE SET FADD= 0000 FSUB= 0400 FMPY= 1000 FDIV= 1400 FLDA= 2000 FSTA= 2400 FISUB= 3000 FIDIV= 3400 LSS1= 4000 LSS2= 4400 JEOF= 5400 LOADSN= 6000 / / JOC CLASS JSUB= 5000 JUMP= 5001 JGE= 5002 JNE= 5003 JGT= 5004 JLT= 5005 JEQ= 5006 JLE= 5007 JFOR= 5010 / / ARRAY CLASS AISUB= 6400 AFADD= 6440 AFSUB= 6500 AFMPY= 6540 AFDIV= 6600 AFLDA= 6640 AFSTA= 6700 AIDIV= 6740 / / STRING CLASS SCON= FADD SCOMP= FSUB SREAD= FMPY SLOAD= FLDA SSTORE= FSTA SACON= AISUB SACOMP= AFADD SAREAD= AFSUB SALOAD= AFLDA SASTOR= AFSTA / / OPERATE CLASS SETJF= 7401 RNDO= 7421 STOP= 7441 SRDL= 7461 CHN= 7414 NRDL= 7521 CLOSEF= 7434 OPENAV= 7474 OPENAF= 7454 OPENNV= 7534 OPENNF= 7514 CLRFN= 7501 FILENO= 7402 FNEG= 7403 RET= 7404 REST= 7405 LSS1AC= 7406 LSS2AC= 7407 FESC= 7410 READ= 7411 WRITE= 7412 SWRITE= 7413 SMODE= 7561 NMODE= 7541 FUNC1= 7416 FUNC2= 7417 FUNC3= 7400 FUNC4= 7415 USE= 7540 / ASSEMBLE LINE *STRLIM%2+1+WORD1 /ORG PAST BIGGEST STRING LIT NEWLIN, JMS I QGETC /ANY CHARS LEFT ? JMP REMARK /NO, LINE ENDED OK JMS I QERMSG /EXTRA CHARACTERS 3003 REMARK, DCA NOSN /CLEAR STMT NUMBER SWITCH TAD TMPLVL /RESET TEMP LEVELS DCA TMPCNT /FOR NUMERIC TAD STMPLV /AND STRING DCA STMPCT /TEMPORARIES TAD (STACKO-1 DCA OSTACK /RESET STACK POINTERS TAD STKLVL /(CHANGED BY FOR LOOPS) DCA STACK TAD (LINE-1 /GET THE NEXT LINE DCA X10 TAD (-LINMAX/MAX SIZE DCA TEMP3 GETLIN, JMS ICHAR /GET NEXT CHAR JMP GOTCR /CR DCA I X10 /PUT INTO LINE BUFFER ISZ TEMP3 /BUMP MAX COUNTER JMP GETLIN JMP GOTCR ERLTL, JMS I QERMSG /LINE TOO LONG 1424 JMS ICHAR /SKIP REST OF LINE JMP NOSNUM+3 CLA JMP .-3 GOTCR, TAD X10 /COMPUTE SIZE CMA TAD (LINE-1 /OF LINE DCA NCHARS TAD (LINE-1 /SETUP LINE POINTER DCA CHRPTR / TAD LOCTRL /PUT LOCATION COUNTER / 7421 /INTO MQ CLA CLL CML RAR /ALLOW DEFINITION JMS I QSNUM /GET THE STATEMENT NUMBER JMP NOSNUM /NO STMT NUMBER ON THIS LINE ISZ NOSN /SET STMT NUMBER PRESENT JMS I QMODSET /IN N MODE AT ALL LABELS JMS I QNOREGS /FORGET REG CONTENTS TAD WORD1 /SAVE NEW LINE NUMBER DCA LINEH TAD WORD2 DCA LINEL JMS SETFLD /GET TO FIELD OF ENTRY TAD I TEMP2 /GET DEFINED/REFNCED BITS TAD LOCTRH /ADD IN HIGH ORDER LOCATION CTR DCA I TEMP2 /PUT IT AWAY ISZ TEMP2 TAD LOCTRL /NOW PUT IN LOW ORDER LOCATION DCA I TEMP2 CDF NOSNUM, TAD TEMP3 SNA CLA JMP ERLTL JMS KBDCHK /CHECK FOR ^C OR ^O TAD (KEYWRD-1 DCA X10 /SET UP FOR KEYWORD SEARCH JMS I QSAVECP /SAVE CHAR POS KWLOOP, TAD I X10 /GET NEXT CHAR OF KEYWORD SMA JMP GOTKW /OK, THIS IS THE KW DCA TEMP JMS I QGETC /GET NEXT CHAR FROM STMT JMP NOGOOD /THIS ISN'T IT TAD TEMP /IS THIS CHAR OK ? SNA CLA JMP KWLOOP /YES, CONTINUE LOOKING NOGOOD, JMS I QRESTCP /BACK TO START OF STMT TAD I X10 /SKIP OVER REST OF KEYWORD SPA CLA JMP .-2 TAD I X10 /IS THIS END OF LIST ? SZA JMP KWLOOP+3/NO, KEEP LOOKING JMP LET /TREAT AS LET STMT GOTKW, DCA TEMP /SAVE ADDR OF ROUTINE JMP I TEMP /GO PROCESS THE STMT / LET STATEMENT PROCESSOR LET, JMS I QLODSN /LOAD THE STMT NUMBER CLL CML RAR /COMPILE LEFT SIDE JMS I QEXPR /GET EXPRESSION JMP REMARK JMS I QCHECKC /LOOK FOR = -75 JMP BADLET /BAD IF MISSING JMS I QEXPR /GET RIGHT SIDE JMP REMARK CLA CMA /GET TYPE OF TAD OSTACK /RIGHT SIDE DCA TEMP /OF EQUAL SIGN TAD I TEMP /SO THAT WE GENERATE SPA CLA CLL CMA RAL /THE CORRECT STORE TAD (ASSIGN-1 JMS I QOUTOPR /GENERATE STORE JMP NEWLIN BADLET, JMS I QERMSG /BAD LET STMT 1423 JMP REMARK END, TAD (STOP /OUTPUT STOP OPCODE JMS I QOUTWRD JMS OUDUMP /DUMP BUFFER JMS I (7607 /READ IN POST PROCESSOR 1300 /ELEVEN PAGES POSTX, 400 /FROM 400 LDRBLK, 0 /FROM THIS BLOCK IFNZRO LDRBLK-357 <__FIX BLOAD__> JMP I XABORT TAD I QERMSG /SET POST PROCESSOR ERROR SWITCH DCA ERMSG2 JMP I POSTX /START IT UP / RESTORE, PRINT, AND INPUT PROCESSORS PAGE INPUT, JMS I QLODSN /OUTPUT STMT NUM JMS GETFN /LOOK FOR #<FILE NUM EXPR>: INPUTL, CLL CML RAR /PROCESS INPUT STMT JMS I QEXPR /GET EXPR JMP I QREMARK JMS I QGETA1 /GET TOP OF STACK TAD TYPE1 /LOOK AT THE TYPE SPA CLA JMP RSTRNG /READ STRING JMS I QMODSET /SET MODE CLL CML RTR /IS IT DIMENSIONED ? AND TYPE1 SZA CLA JMP I (DIMREAD/YES TAD (READ /OUTPUT READ COMMAND JMS I QOUTWRD TAD (FSTA /USE SCALAR STORE FININP, TAD SYMBL1 /PLUS SYMBOL NUMBER JMS I QOUTWRD /OUTPUT INSTR JMS I QCHECKC /LOOK FOR , -54 JMP I QNEWLIN /END OF INPUT JMP INPUTL /YES, LOOP RSTRNG, CLL CML RAR /SET MODE JMS I QMODSET /TO STRING CLL CML RTR /SUBSCRIPTED ? AND TYPE1 SNA CLA JMP .+3 /NO JMS I QLOADSS /LOAD SS REG TAD (SAREAD-SREAD TAD (SREAD /STRING READ JMP FININP /USE SOME COMMON CODE PRINT, JMS I QLODSN /OUTPUT STMT NUM JMS GETFN /GET FILE NUMBER DCA I QEXPR /USE ENTRY AS SWITCH PRINTL, DCA PCRLF /CLEAR THE FLAG JMS I QGETC /LOOK FOR A CHAR JMP PRTEND /NONE LEFT, END PRINT TAD (-73 /; ? SNA JMP NOCR /YES, DON'T SPACE OUTPUT TAD (73-54 /, ? SZA CLA JMP TABPNT /LOOK FOR TAB OR PNT TAD (FUNC3+20 JMS I QOUTWRD /OUTPUT FUNC3+20 (COMMA) NOCR, DCA I QEXPR /CLEAR THE SWITCH CLA IAC /SET NO CRLF FLAG JMP PRINTL TABPNT, TAD I QEXPR /WAS LAST THING AN EXPR ? SZA CLA JMP I QNEWLIN /YES, CAN'T HAVE TWO IN A ROW JMS I QBACK1 /PUT THAT CHAR BACK JMS I QSAVECP /SAVE CHAR POS JMS I QCHKWD /LOOK FOR "TAB(" WTAB JMP TRYPNT /NO TAB TAD (FUNC3+100 PFCALL, DCA PRFUN /SAVE PRINT FUNCTION JMS I QEXPR /GET ARG JMP I QREMARK JMS I QLOAD /LOAD ARG TAD TYPE1 /MUST BE NUMERIC SMA CLA JMP .+4 /OK, IT IS BADPF, JMS I QERMSG /PRINT ERROR 0622 /BAD FUNCTION REFERENCE JMP I QREMARK JMS I QCHECKC /LOOK FOR ) -51 JMP BADPF /BAD FUN REFERENCE TAD PRFUN /OUTPUT FUNCTION CALL JMP PUT1 TRYPNT, JMS I QRESTCP /RESTORE CHAR POS JMS I QCHKWD /LOOK FOR PNT( WPNT JMP PEXP /NO TAD (FUNC3+120 JMP PFCALL /GO DO FUN CALL PEXP, JMS I QRESTCP /RESTORE CHAR POS JMS I QEXPR /GET EXPR TO BE PRINTED JMP I QREMARK JMS I QLOAD /PUT THING INTO FAC (OR SAC) CLL CML RAR AND TYPE1 /GET TYPE BIT CLL RTL /INTO AC 11 TAD (WRITE /SWRITE=WRITE+1 PUT1, JMS I QOUTWRD JMP PRINTL PRTEND, TAD PCRLF /DID PRINT END WITH SZA CLA /, OR ; JMP I QNEWLIN /YES, NO CR LF TAD (FUNC3+40 PUT2, JMS I QOUTWRD /CALL TO CRLF ROUTINE JMP I QNEWLIN /END OF PRINT RESTOR, JMS I QLODSN /OUTPUT LOAD STMT NUMBER CLA IAC /NO COLON NEEDED JMS GETFN /LOAD FILE REG TAD (REST /OUTPUT RESTORE OP JMP PUT2 PRFUN, LODSN, 0 /OUTPUT STMT NUMBER INTO CODE TAD NOSN /ANY STMT NUMBER ? SNA CLA JMP I LODSN /NO, JUST RETURN TAD WORD1 /NOW OUTPUT "LOAD STMT NUM REG" TAD (LOADSN JMS I QOUTWRD TAD WORD2 JMS I QOUTWRD JMP I LODSN XADD, FADD;AFADD / DIM PROCESSOR PAGE DIM, JMS I QGETNAM /GET VAR NAME JMP DIMERR TAD TYPE /CHECK TYPE RTL /MOVE BITS TO BE TESTED SMA CLA /IF FUNC BIT SET THEN ERROR SNL /IF DIM BIT NOT SET THEN ERROR JMP DIMERR /NO DIMENSIONS JMS SMLNUM /GET DIMENSION TAD EXPON /SAVE IT DCA DIM1 JMS I QCOMARP /, OR ) ?? JMP DIMERR /NEITHER IS BAD JMP TWODIM /, THERE'S ANOTHER DIMENSION JMS CHKSDM /CHECK SIZE IF STRING JMP CHKDIM /NUMERIC VECTOR, CHECK PREV REF CLL CML RAR /THIS WAS A STRING SIZE DIM DCA TYPE /PERFORM THE SPECIAL CASE JMS I QLOOKUP CDF 10 /OF NOT CHECKING PREVIOUS REFS JMP FINDIM TWODIM, JMS SMLNUM /GET SECOND JMS I QCHECKC /LOOK FOR ) -51 JMP DIMERR JMS CHKSDM /CHECK SIZE IF STRING ARRAY TAD (7000 /NUMERIC ARRAY CHKDIM, TAD (7000 /GET NUMBER OF DIMS DCA TEMP JMS I QLOOKUP /FIND ST ENTRY CDF 10 TAD I STPTR /LOOK AT DIM BITS AND (7000 /PREVIOUSLY REFERENCED ? SNA JMP UNREFD /NO SMA /IF MINUS, CAUSE ERROR TAD TEMP /COMPARE NUMBER SZA CLA JMP DIMERR /NUMBER OF DIMS DON'T MATCH DCA TEMP /ZERO TEMP UNREFD, CLL CML RAR /PUT IN DIMENSIONED BIT TAD TEMP /AND NUMBER OF DIMENSIONS CIA /NEGATE WHOLE MESS (4000=-4000) TAD I STPTR /TOGETHER WITH SYM NUMBER DCA I STPTR ISZ STPTR TAD DIM1 /NOW FIRST DIMENSION (IF 2) DCA I STPTR FINDIM, ISZ STPTR TAD EXPON /NOW SECOND (IF 2, OTHERWISE FIRST) DCA I STPTR CDF JMS I QCHECKC /LOOK FOR , -54 JMP I QNEWLIN /NONE, ASSUME END OF DIM JMP DIM /GET NEXT ELEMENT CHKSDM, 0 /CHECK SIZE OF STRINGS TAD TYPE /WAS THIS A STRING DIM ? SMA CLA JMP I CHKSDM /NO, RETURN IMMEDIATE ISZ CHKSDM /YES, SKIP ON RETURN TAD EXPON /SIZE MUST BE < 73 CLL TAD (-STRLIM-1 SNL CLA JMP I CHKSDM /OK, SIZE < 73 DIMERR, JMS I QERMSG /GIVE ERROR 0411 JMP I QREMARK /ABORT STMT / NEXT PROCESSOR NEXTX, JMS I QGETNAM /GET INDEX VARIABLE JMP BADNXT JMS I QLOOKUP TAD TYPE /MUST BE NUMERIC SPA CLA JMP BADNXT /IT ISN'T JMS I QMODSET /N MODE NEXTL, TAD (-STACKA-3 TAD STACK /ANY FOR'S LEFT ? SPA CLA /(OK IF STACKA ABOVE 4000) JMP BADNXT /NO JMS I QPOP /GET LABEL ADDR DCA TEMP JMS I QPOP /GET LABEL FIELD DCA LUPFLD JMS I QPOP /GET STEP VAR TAD XLOAD /LOAD IT JMS I QOUTWRD JMS I (PSETJF /PATCH! TAD FINDEX /ADD IT TO STEP (FADD=0) JMS I QOUTWRD TAD LUPFLD /CREATE JUMP TO LOOP AND (70 CLL RTL TAD (JUMP JMS I QOUTWRD CLL CMA RAL /GET LABEL DEFINITION ADDR TAD TEMP JMS I QOUTWRD /OUTPUT IT AS LOW PART OF JUMP DIM1, LUPFLD, HLT CLL CML RAR /SET LABEL DEFINED BIT TAD LOCTRH /DEFINE END OF LOOP LABEL DCA I TEMP ISZ TEMP TAD LOCTRL DCA I TEMP CDF TAD STACK /BACK OFF STACK LEVEL DCA STKLVL JMS I QNOREGS /FORGET REGS TAD SYMBOL /IS THIS THE RIGHT NEXT ? CIA TAD FINDEX SNA CLA JMP I QNEWLIN /YES, FINISHED BADNXT, JMS I QERMSG /NEXT WITHOUT FOR 1606 JMP I QREMARK UMOPR, 40;1;UMRTNE-1 XLOAD, FLDA;AFLDA / UDEF PROCESSOR (DEFINE USER FUNCTION) PAGE UDEF, ISZ NFUNS /ROOM FOR ANOTHER FUN ? JMS I QLETTER /GET FIRST LETTER JMP DEFBAD /ERROR IN DEFINE CLL RTL /PUT INTO HIGH ORDER RTL RTL DCA NAME1 /SAVE CHAR 1 JMS I QLETTER /GET SECOND LETTER JMP DEFBAD /ERROR TAD NAME1 /COMBINE THE TWO CHARS CIA DCA I FUNPTR /SAVE IN FUN TABLE ISZ FUNPTR JMS I QLETTER /GET THIRD LETTER JMP DEFBAD CIA /SAVE NEG OF THIRD LETTER DCA I FUNPTR ISZ FUNPTR /BUMP POINTER TAD M5 /NUMERIC ARG COUNT DCA TEMP / (MAX OF 4 ARGS) CLL CMA RTL /STRING ARG COUNT DCA TEMP2 / (MAX OF 2 ARGS) JMS I QCHECKC /IS IT A STRING FUN ? -44 SKP CLA CLL CML RAR /YES, SET TYPE OF FUNCTION DCA TYPE1 JMS I QCHECKC /LOOK FOR ( -50 JMP DEFBAD /ERROR IF MISSING DALOOP, JMS I QGETNAM /GET AN ARG JMP DEFBAD TAD TYPE /LOOK AT ITS TYPE CLL RAL /SHIFT TYPE BIT INTO LINK SZA CLA JMP DEFBAD /OTHER BITS MUST BE OFF SZL JMP STRARG /STRING ARG TAD TEMP /GET ARG NUMBER ISZ TEMP /INCREMENT IT JMP DAPUSH /GO SAVE IT DEFBAD, JMS I QERMSG /BAD USER DEF 2504 JMP I QREMARK STRARG, TAD TEMP2 /GET ARG NUMBER ISZ TEMP2 /AND INCREMENT IT JMP DAPUSH+1 JMP DEFBAD /TOO MANY STRING ARGS DAPUSH, TAD Q2 /ADJUST ARG NUMBER TAD Q2 /ADD 4 FOR NUM, 2 FOR STRING SPA CLA CLL CML RTR /FIRST ARG STAYS IN AC TAD TYPE /ADD IN TYPE BIT JMS I QPUSH /SAVE IT ON STACK JMS I QCOMARP /LOOK FOR , OR ) JMP DEFBAD /ERROR IF NEITHER JMP DALOOP /, GET NEXT ARG TAD TEMP2 /GET TOTAL NUMBER OF ARGS TAD TEMP TAD Q10 /ADJUST COUNT CIA /NEGATED DCA DACNT TAD I FUNPTR /GET FUNCTION CODE ISZ FUNPTR /BUMP POINTER DCA WORD1 /MAKE IT THE SEARCH OBJECT JMS I XSTCHEK /MAKE SURE THERE'S ROOM EOST-10 JMS I QLUKUP2 /ENTER NEW FUNCTION FUNCTN -1 TAD DACNT /PUT IN ARG COUNT JMS SETFLD /(FIRST SET THE FIELD) DCA I NEXT DAPUT, CDF JMS I QPOP /GET ARG TYPE (LAST TO FIRST) JMS SETFLD /SET THE FIELD DCA I NEXT /SAVE IT ISZ DACNT /ANY MORE ? JMP DAPUT /YES TAD TYPE1 /PUT IN TYPE OF FUNCTION DCA I NEXT CDF JMS I QCHECKC /LOOK FOR A COMMA -54 JMP I QNEWLIN /NO COMMA, END OF LINE JMP UDEF /GET NEXT DEFINITION XSTCHEK,STCHEK FUNPTR, ENDFNS Q2, 2 /THESE FOUR WORDS M5, -5 /PREVENT ERRONEOUS "SAVES" Q10, 10 /BY THE ROUTINE SAVAC NFUNS, -21 /WHEN THE OP STACK IS EMPTY STACKO, /OPERAND STACK STOKSZ=UDEF+200-STACKO / DEF PROCESSOR PAGE DEF, JMS I QNOREGS /FORGET REGS JMS I QGETNAM /GET FUN NAME JMP BADDEF /NO GOOD TAD TYPE /SAVE ITS TYPE DCA TEMP2 DCA ARGCNT /ZERO ARG COUNT TAD TYPE /TYPE MUST BE 3000 OR 7000 RTL /MOVE BITS TO BE TESTED SPA CLA /FUN BIT OFF IS AN ERROR SNL /DIM BIT OFF IS AN ERROR JMP BADDEF JMS I QMODSET /ENTER N MODE TAD SYMBOL /SAVE FUNCTION NAME DCA FUNNAM ARGLUP, JMS I QGETNAM /GET ARG NAME JMP BADDEF CLL CMA RAR /LOOK AT TYPE AND TYPE SZA CLA JMP BADDEF /ARG WAS AN ARRAY OR FUNC JMS I QLOOKUP /ENTER INTO S.T. TAD STPTR /SAVE ST ADDRESS JMS I QPUSH TAD SYMBOL /AND SYMBOL NUMBER JMS I QPUSH TAD TYPE /AND ARG TYPE JMS I QPUSH ISZ ARGCNT /BUMP ARG COUNT JMS I QCOMARP /LOOK FOR , OR ) JMP BADDEF JMP ARGLUP /, GET NEXT ARG TAD FUNNAM /ENTER FUNCTION DCA WORD1 TAD ARGCNT /FIRST GET ENOUGH ROOM CIA TAD (EOST-3 DCA FUNNAM JMS STCHEK /CHECK IT FUNNAM, 0 JMS I QLUKUP2 /LOOK UP FUNCTION FUNCTN -1 JMP OKFUN /OK, NOT MULTIPLY DEFINED BADDEF, JMS I QERMSG /BAD DEFINE 0405 JMP I QREMARK OKFUN, TAD NEXT /SAVE "NEXT" DCA X12 TAD NEXT /INCREMENT NEXT BY TAD ARGCNT /NUMBER OF ARGS TAD (4 /PLUS 4 DCA NEXT JMS SETFLD /GET ROOM FOR LABEL CLL CML RAR /FOR JUMP AROUND DCA I NEXT /SET DEFINED BIT TAD NEXT /SAVE ADDR DCA JAROND /FOR LATER ISZ NEXT CDF TAD LUFLD /SAVE FIELD OF FUN BLOCK DCA FUNFLD TAD LUFLD /ALSO FIELD OF LABEL DCA JARFLD TAD LUFLD /GET FIELD AND (70 /ISOLATE BITS CLL RTL /INTO JUMP INSTR TAD (JUMP JMS I QOUTWRD /OUTPUT IT TAD JAROND /OUTPUT LOW PART JMS I QOUTWRD /OF JUMP ADDR TAD STACK /SAVE STACK DCA OLDSTK TAD ARGCNT /GET COUNT CMA DCA TEMP TAD ARGCNT /TWICE CIA DCA ARGCNT TAD ARGCNT /STORE COUNT FIRST JMP FUNFLD CHGARG, CDF JMS I QPOP /GET ARG TYPE DCA TYPE TAD TYPE JMS GENTMP /GENERATE A TEMPORARY SWTARG, JMS I QPOP /PURGE SYMBOL NUMBER CLA JMS I QPOP /GET ST ADDR OF DCA STPTR /OF DUMMY ARG CDF 10 TAD SYMBOL /PUT IN TEMP SYMBOL NUMBER DCA I STPTR /TO FAKE EXPR TAD TYPE /CREATE ARG DESCRIPTOR TAD SYMBOL /FOR FUNC BLOCK FUNFLD, HLT DCA I X12 /AND PUT IT INTO F.B. ISZ TEMP /MORE ARGS? JMP CHGARG /YUP CLL CML RAR AND TEMP2 /SAVE TYPE OF FUNCTION DCA I X12 CLL CML RAR /SET DEFINED BIT TAD LOCTRH /AND LOCATION COUNTER DCA I X12 /AT START OF FUNCTION TAD LOCTRL DCA I X12 CDF TAD STACK /SAVE BOTTOM OF STACK DCA X13 TAD OLDSTK /RESTORE TO TOP DCA STACK JMS I QCHECKC /FIND = -75 JMP BADDEF JMS I QEXPR /COMPILE FUNCTION JMP I QREMARK JMS I QLOAD /GET IT INTO AC TAD X13 /RESTORE STACK DCA STACK /TO BOTTOM JMP RESARG /FINISH DEF / DEF PROCESSOR (FINALE) PAGE RESARG, TAD I X13 /GET ST ADDR DCA STPTR TAD I X13 /PUT BACK CORRECT SYM # CDF 10 DCA I STPTR CDF ISZ X13 /SKIP OTHER STUFF ISZ ARGCNT JMP RESARG /RESTORE NEXT TAD (RET /OUTPUT RETURN CODE JMS I QOUTWRD JARFLD, HLT CLL CML RAR /SET LABEL DEFINED BIT TAD LOCTRH /STICK IN ADDR DCA I JAROND /OF END OF FUNCT ISZ JAROND /PLUS ONE TAD LOCTRL /STORE LOW ADDR DCA I JAROND CDF TAD TMPCNT /SAVE NEW TEMP LEVELS DCA TMPLVL TAD STMPCT DCA STMPLV JMS I QNOREGS /FORGET REGS JMP I QNEWLIN /END OF DEF / DATA STATEMENT PROCESSOR DATA, JMS I QNUMBER /LOOK FOR NUMBER JMP DSTRNG /MUST BE A STRING JMS DENTRY /MAKE AN ENTRY -3 /3 WORDS LONG MORDAT, JMS I QCHECKC /LOOK FOR , -54 JMP I QNEWLIN /END OF DATA JMP DATA /DO NEXT ELEMENT DSTRNG, JMS I QSTRING /LOOK FOR STRING JMP I QNEWLIN /BAD TAD WORD1 /COMPUTE SIZE IAC CLL CML CMA RAR DCA DSSIZE /INCLUDING CHAR COUNT TAD WORD1 /NEGATE COUNT CIA DCA WORD1 JMS DENTRY /CREATE ENTRY DSSIZE, 0 JMP MORDAT /GO DO MORE DENTRY, 0 /MAKE AN ENTRY IN DATA LIST TAD I DENTRY /GET SIZE DCA TEMP ISZ DENTRY TAD TEMP /INCREMENT SIZE COUNT TAD DLSIZE DCA DLSIZE TAD (EOST /HOW MUCH DO WE NEED ? TAD TEMP DCA .+2 JMS STCHEK /ASK FOR IT 0 TAD FREFLD /GET FIELD OF FREE SPACE DCA LUFLD /SAVE IT IN SETFLD SUBROUTINE DATFLD, CDF 10 TAD NEXT /HOOK IN NEW ENTRY IAC DCA I DATPTR PATCH3, ISZ DATPTR /POINTER THEN FIELD TAD LUFLD DCA I DATPTR JMS SETFLD TAD TEMP /SAVE SIZE OF ENTRY DCA I NEXT TAD (WORD1-1/MAKE READY TO MOVE DCA X10 DELOOP, CDF TAD I X10 /GET WORD JMS SETFLD DCA I NEXT /SAVE IT ISZ TEMP /MORE ? JMP DELOOP DCA I NEXT /SAVE ROOM FOR POINTER&CDF TAD NEXT /THIS IS NOW LAST ENTRY DCA DATPTR PATCH4, TAD LUFLD DCA DATFLD /AND THIS IS ITS FIELD DCA I NEXT CDF JMP I DENTRY DATPTR, DATLST / READ PROCESSOR READX, JMS I QLODSN /OUTPUT STMT NUMBER CLL CML RAR /GET VAR TO READ JMS I QEXPR /SAME AS LEFT SIDE OF LET JMP I QREMARK JMS I QGETA1 /GET VAR INFO FROM STACK TAD TYPE1 /SET MODE JMS I QMODSET TAD TYPE1 /WHAT TYPE ? SPA CLA TAD (SRDL-NRDL TAD (NRDL /STRING OR NUMERIC JMS I QOUTWRD CLL CML RTR /SUBSCRIPTS ? AND TYPE1 SNA CLA JMP .+3 /NO JMS I QLOADSS /YES, LOAD SS REGS TAD (AFSTA-FSTA TAD (FSTA /ARRAY OR SCALAR STORE TAD SYMBL1 JMS I QOUTWRD JMS I QCHECKC /ANY MORE ? -54 /CHECK FOR COMMA JMP I QNEWLIN /NO JMP READX+1 /YUP AMPSND, 40;1;AMPRTN-1;4000;SCONTS;SCONTS SCONTS, FADD;AISUB / FOR PROCESSOR PAGE FOR, JMS I QLODSN /OUTPUT STMT NUMBER JMS I QGETNAM /GET INDEX VARIABLE JMP BADFOR /BAD TAD TYPE /MUST BE NUMBER SZA CLA JMP BADFOR /ITS NOT JMS I QLOOKUP /ST SEARCH TAD SYMBOL /SAVE INDEX VAR DCA FINDEX /FOR LATER JMS I QCHECKC /FIND = -75 JMP BADFOR TAD CHRPTR /SAVE CHAR POSITION DCA FORCP /IN A SPECIAL PLACE TAD NCHARS DCA FORNC SKP FINDTO, JMS I QRESTCP /RESTORE CHAR POS JMS I QGETC /SKIP A CHAR JMP BADFOR CLA JMS I QSAVECP /SAVE THIS POSITION JMS I QCHKWD /LOOK FOR "TO" WTO JMP FINDTO /KEEP GOING JMS FSUB2 /LOAD LIMIT AND SAVE IN TEMP DCA FLIMIT /SAVE LIMIT VAR JMS I QCHKWD /LOOK FOR "STEP" WSTEP JMP STEP1 /USE 1.0 FOR THE STEP JMS FSUB2 /LOAD STEP AND SAVE IN TEMP DCA FSTEP /SAVE STEP VAR TAD (SETJF /OUTPUT SETJF JMS I QOUTWRD TAD (JFOR /STEP IS VARIABLE, USE JFOR SAVEJF, DCA FORJMP /SAVE CORRECT JUMP JMS I QGETC /ANY MORE CHARS ? SKP JMP BADFOR /YES, ERROR TAD FORNC /RESTORE CHAR POSITION DCA NCHARS /FROM SPECIAL PLACE TAD FORCP DCA CHRPTR JMS FSUB1 /COMPILE INITIAL VALUE INTO FAC JMS STCHEK /CHECK FOR ROOM EOST TAD FREFLD /SAVE FIELD OF LABELS DCA FORFLD FORFLD, HLT CLL CML RAR /SET LABEL DEFINED BIT TAD LOCTRH /DEFINE THE LOOP LABEL DCA I NEXT TAD LOCTRL DCA I NEXT CLL CML RAR /SET LABEL DEFINED BIT DCA I NEXT /FOR END OF LOOP LABEL CDF TAD FLIMIT /TEST FOR DONE TAD XSUB /BY SUBTRACTING THE LIMIT JMS I QOUTWRD TAD FORFLD /OUTPUT JUMP TO DONE AND (70 CLL RTL /SHIFT FIELD BITS TAD FORJMP /USE PROPER JUMP INS JMS I QOUTWRD TAD NEXT /OUTPUT LOW PART OF JMP JMS I QOUTWRD TAD FLIMIT /FADD FLIMIT (FADD=0) JMS I QOUTWRD TAD FINDEX /FSTA INDEX TAD (FSTA JMS I QOUTWRD TAD FINDEX /PUT STUFF ONTO STACK JMS I QPUSH TAD FSTEP JMS I QPUSH TAD FORFLD JMS I QPUSH TAD NEXT JMS I QPUSH ISZ NEXT /BUMP NEXT AGAIN TAD TMPCNT /RESERVE THESE TEMPS DCA TMPLVL JMS I QNOREGS /FORGET REGISTORS TAD STACK /SET NEW STACK LEVEL DCA STKLVL JMP I QREMARK STEP1, TAD (3 /1.0 IS SLOT #3 DCA FSTEP TAD (JGT /USE JGT JMP SAVEJF /GO DO THE REST FLIMIT, 0 /FOR LOOP UPPER LIMIT FSTEP, 0 /FOR LOOP STEP FORNC, 0 /FOR STMT CHAR POSITION FORCP, 0 WTHEN, -124;-110;-105;-116 XSUB, FSUB;AFSUB / USE PROCESSOR USEX, TAD (USE /OUTPUT USE OPERATOR JMS I QOUTWRD JMS I QGETNAM /GET ARRAY NAME JMP USEERR /ERROR TAD TYPE /CHECK TYPE SMA CLA /(MUST BE NUMERIC) JMP .+3 /IT WAS USEERR, JMS I QERMSG /ERROR IN USE STMT 2525 CLL CML RTR /SET DIM BIT DCA TYPE JMS I QLOOKUP /LOOKUP SYMBOL TAD SYMBOL /OUTPUT ARRAY NUMBER JMS I QOUTWRD JMP I QREMARK / IF AND IFEND PROCESSORS PAGE IF, JMS I QLODSN /OUTPUT STMT NUMBER JMS I QEXPR /GET LEFT EXPRESSION JMP I QREMARK JMS I QGETC /GET RELATIONAL OPERATOR JMP BADIF /ERROR IF NONE CLL RTL RTL /MOVE TO LEFT HALF RTL DCA TEMP /AND SAVE IT JMS I QGETC /GET 2 CHAR RELATIONALS JMP BADIF TAD TEMP /COMBINE THE 2 DCA TEMP2 TAD (IFOPS-1/SETUP POINTER DCA X10 IFLUP1, TAD I X10 /GET JUMP OPCODE SNA JMP IFLUP2-1/NOT A 2 CHAR RELATIONAL DCA RELOPR /SAVE IT TAD I X10 /COMPARE CHARS TAD TEMP2 SZA CLA JMP IFLUP1 /NOT THIS OOE GOTREL, JMS I QEXPR /GET RIGHT HALF JMP I QREMARK CLA CMA /GET TYPE OF RIGHT SIDE TAD OSTACK DCA TEMP TAD I TEMP SPA CLA JMP STRCMP /STRING, DO STRING COMPARE TAD (MINUS /NUMERIC, DO A SUBTRACT JMS I QOUTOPR NUMCMP, JMS I QSAVECP /SAVE CHAR POSITION JMS I QCHKWD /LOOK FOR "THEN" WTHEN JMP NOTHEN /NOT THEN GETIFN, JMS I QSNUM /GET STATEMENT NUMBER JMP BADGO2 TAD TEMP /OUTPUT JUMP TAD RELOPR JMS I QOUTWRD TAD TEMP2 /TWO WORDS JMS I QOUTWRD JMP I QNEWLIN NOTHEN, JMS I QRESTCP /BACKUP CHAR POS JMS I QCHKWD /LOOK FOR "GOTO" WGOTO SKP JMP GETIFN /OK, GO GET STMT NUMBER BADIF, JMS I QERMSG /BAD IF STMT 1106 JMP I QREMARK STRCMP, TAD (SCOMPR-1 JMS I QOUTOPR /OUTPUT STRING COMPARE JMS I QMODSET /BACK TO N MODE JMP NUMCMP /REST IS LIKE NUMERIC COMPARES JMS I QBACK1 /PUT BACK NON OPERATOR IFLUP2, TAD I X10 /GET CONDITIONAL JUMP SNA JMP BADIF /RELATIONAL INCORRECT DCA RELOPR TAD I X10 /COMPARE OPERATORS TAD TEMP SNA CLA JMP GOTREL /GOTIT JMP IFLUP2 IFEND, JMS I QLODSN /OUTPUT STMT NUMBER CLA IAC /(NO COLON) JMS GETFN /GET FILE NUMBER TAD (JEOF /SETUP CORRECT JUMP DCA RELOPR JMP NUMCMP /GO FIND "THEN" OR "GOTO" RELOPR, GETFN, 0 /GET FILE NUMBER DCA COLON /SAVE COLON SWITCH JMS I QCHECKC /LOOK FOR # -43 JMP TTYFIL /NONE, MUST BE TTY JMS I QEXPR /GET FILE EXPR JMP I QREMARK /ERROR TAD COLON /DO WE NEED A COLON ? SZA CLA JMP .+4 /NO, SKIP THIS TEST JMS I QCHECKC /YES, LOOK FOR IT -72 JMP BADFN /NOT THERE, BAD JMS I QLOAD /LOAD IT TAD TYPE1 /TYPE MUST BE NUMERIC SPA CLA BADFN, JMS I QERMSG /NOPE, IT ISN'T 0616 CLA IAC /SET IFNREG TO "NOT TTY" DCA IFNREG /SAVE NEW IFNREG TAD (FILENO /OUTPUT SET IFN COMMAND JMS I QOUTWRD JMP I GETFN TTYFIL, TAD IFNREG /IS IFNREG 0 ? SNA CLA JMP I GETFN /IF YES, QUIT TAD (CLRFN /OTHERWISE ZERO AC JMS I QOUTWRD DCA IFNREG /SET IFNREG TO TTY JMP I GETFN /RETURN / GOTO AND GOSUB GOTO, JMS I QSNUM /GET NUMBER JMP BADGO2 JMS I QMODSET /ALL GOTO'S IN NMODE CLA IAC /JUMP=JSUB+1 JMP .+5 GOSUB, JMS I QLODSN /OUTPUT STMT NUM LOAD JMS I QSNUM /GET NUMBER JMP BADGO2 JMS I QMODSET /ALL GOTO'S IN NMODE TAD (JSUB /GET GOSUB OPCODE TAD TEMP /PLUS ADDRESS JMS I QOUTWRD /OUTPUT IT TAD TEMP2 /BOTH WORDS JMS I QOUTWRD JMP I QNEWLIN BADGO2, JMS I QERMSG /BAD GOTO OR GOSUB 1615 /NUMBER MISSING JMP I QREMARK / TABLE SEARCH FOR LITERALS, STMT NUMBERS, TEMPS, ETC. PAGE LUKUP2, 0 TAD I LUKUP2 /GET THE BUCKET START DCA OLDN3 /SAVE IT AS THE PREVIOUS ENTRY ISZ LUKUP2 TAD I LUKUP2 /GET THE ENTRY SIZE ISZ LUKUP2 DCA N3SIZE TAD (6211 /PRIME THE FIELD SETTER DCA LUFLD JMS SETFLD /NOW SET THE FIELD LOOK2, TAD I OLDN3 /GET ADDR OF NEXT ENTRY DCA NEWN3 /SAVE IT PATCH1, ISZ OLDN3 /GET TO FIELD OF NEW ENTRY TAD I OLDN3 /GET INTO AC DCA NEWFLD /AND SAVE IT TAD NEWN3 SNA JMP HOOKIN /IF 0 ITS END OF LIST PATCH5, IAC DCA X10 /START OF VALUE INFO TAD (WORD1-1/SETUP POINTER TO VALUE DCA X11 TAD N3SIZE /AND TEMP OF ENTRY SIZE DCA LTEMP CHKVAL, CDF TAD I X11 CIA CLL /COMPARE THIS WORD NEWFLD, CDF 10 /FIELD OF NEW ENTRY TAD I X10 SZA CLA JMP NOTSAM /NOT THIS ONE ISZ LTEMP /INCR SIZE COUNT JMP CHKVAL /MORE STUFF TAD I X10 /GET SYMBOL NUMBER L6201, CDF DCA SYMBOL TAD NEWFLD /MAKE ENTRY ADDRESSABLE DCA LUFLD /THROUGH SETFLD ISZ LUKUP2 /BUMP RETURN JMP I LUKUP2 NOTSAM, SZL JMP HOOKIN /NEW SYMBOL < CURRENT TAD NEWN3 /GO TO NEXT ENTRY DCA OLDN3 /(MOVE POINTER) TAD NEWFLD /(AND FIELD) DCA LUFLD JMP LOOK2 HOOKIN, CLL CMA RAL /HOW MANY WORDS NEEDED ? TAD N3SIZE TAD (EOST DCA .+2 JMS STCHEK /MAKE SURE 0 /WE GOT ENOUGH TAD NEWN3 /HOOK IN NEW ENTRY FREFLD, CDF 10 /CHANGE TO FREE FIELD DCA I NEXT PATCH2, TAD NEWFLD /HOOK IN FIELD DCA I NEXT JMS SETFLD /BACK TO FIELD OF OLD TAD FREFLD /PUT FIELD OF NEW DCA I OLDN3 CLA CMA /BACK UP OLDN3 TAD OLDN3 /SO THAT IT POINTS TO POINTER DCA OLDN3 CLA CMA TAD NEXT /PUT POINTER TO NEW ENTRY DCA I OLDN3 /INTO OLD TAD FREFLD /SAVE ENTRY FIELD DCA LUFLD /FOR POSSIBLE POST PROCESSING TAD (WORD1-1/PREPARE TO STICK IN THE VALUE DCA X11 ENTERV, CDF TAD I X11 /MOVE IN THE VALUE FFLD2, CDF 10 DCA I NEXT ISZ N3SIZE /INCR SIZE COUNT JMP ENTERV CDF JMP I LUKUP2 STCHEK, 0 /CHECK FOR ENOUGH ROOM TAD NEXT /CHECK FOR OVERFLOW CIA CLL CDF TAD I STCHEK /THIS IS LIMIT ISZ STCHEK SZL CLA JMP I STCHEK TAD FREFLD /BUMP FREE FIELD TAD (10 DCA FREFLD TAD FREFLD /PUT IN TWO PLACES DCA FFLD2 DCA NEXT /START POINTER AT 0 ISZ NFLDS /GONE TOO FAR ? JMP I STCHEK /NO STOVER, JMS I QERMSG /S.T. FULL 2324 JMP I XABORT /ABORT COMPILATION OLDN3, 0 /ADDR OF PREVIOUS ENTRY NEWN3, 0 /ADDR OF NEW ENTRY LTEMP, 0 NFLDS, 0 /- COUNT OF AVAILABLE FIELDS N3SIZE, /SIZE OF ENTRY KBDCHK, 0 /CHECK FOR ^C OR ^O KSF JMP I KBDCHK /NO CHAR KRB AND (177 /REMOVE PARITY BIT TAD (-3 /^C ?? SNA JMP I XABORT /YES, EXIT TO OS8 TAD (3-17 /^O ?? SZA CLA JMP I KBDCHK /NO, RETURN DCA TTX+1 /NOP TTY OUTPUT ROUTINE JMP I KBDCHK / WSTEP, -123;-124;-105;-120;0 / SYMBOL TABLE LOOKUP PAGE LOOKUP, 0 /LOOK UP SYMBOL TAD NAME1 /GET NAME1*11+NAME2 CLL RTL TAD NAME1 CLL RAL TAD NAME1 TAD NAME2 DCA NAME1 /THIS IS IT TAD TYPE /WHAT KIND SYMBOL ? CLL RTL /MOVE TYPE BITS RTL /INTO AC 9,10,11 TAD JTABLE DCA .+1 VCPTR, 0 /GO THERE JTABLE, JMP I .+1 LUVAR LURETN LUARAY LURETN LUSTRG LURETN LUSARY LURETN LUVAR, TAD (VARCNT /POINTER TO VAR COUNT DCA VCPTR TAD (VARST-13 DOLU, TAD NAME1 DCA STPTR /ST POINTER CDF 10 /THATS WHERE ST IS TAD I STPTR /IS THIS VAR DEFINED YET ? SMA JMP GOTSYM /YES TAD (4401 /GET 401 INTO AC CHEKST, CDF TAD I VCPTR /PLUS VAR COUNT CDF 10 DCA SYMBOL /THATS THE NEW SYMBOL NUMBER TAD SYMBOL /PUT SYMBOL NUMBER DCA I STPTR /INTO S.T. ENTRY CDF ISZ I VCPTR /BUMP SYMBOL NUMBER LURETN, JMP I LOOKUP JMP STOVER /S.T. OVERFLOW GOTSYM, DCA SYMBOL /PUT NUMBER INTO SYMBOL CDF JMP I LOOKUP LUSTRG, TAD (SVCNT /POINTER TO STRING VAR COUNT DCA VCPTR TAD (SVARST-26 TAD NAME1 /TWO WORDS PER ENTRY JMP DOLU LUARAY, TAD (ACNT /ARRAY VAR COUNT DCA VCPTR TAD (ARAYST /ARRAY SYMBOL TABLE DCA STPTR CDF 10 FINDA, TAD I STPTR /SEARCH TABLE SNA JMP NEWARY /NEW ENTRY CIA TAD NAME1 /IS THIS IT ? ISZ STPTR SNA CLA JMP GOTARY /YES ISZ STPTR ISZ STPTR ISZ STPTR /GO TO NEXT ENTRY JMP FINDA GOTARY, TAD (37 /GET NUMBER AND I STPTR DCA SYMBOL /INTO SYMBOL CDF JMP I LOOKUP NEWARY, TAD NAME1 /PUT IN NEW ENTRY DCA I STPTR ISZ STPTR TAD (41 /PUT IN NUMBER JMP CHEKST /GO DO THE REST LUSARY, TAD (SACNT /STRING ARRAY COUNT DCA VCPTR TAD (SARYST /USE STRING ARRAY TABLE JMP FINDA-2 /GO DO SEARCH / FILE AND CLOSE PROCESSORS FILE, JMS I QLODSN /OUTPUT STMT NUMBER TAD (FOPENS /POINTER TO FILE OPENS DCA FILESW JMS I QCHECKC /LOOK FOR "V" -126 SKP /NOT V ISZ FILESW /YUP, INCR FILESW JMS I QCHECKC /LOOK FOR "N" -116 JMP .+3 ISZ FILESW /INCR FILESW BY TWO IF "N" ISZ FILESW JMS GETFN /GET FILE NUMBER JMS I QEXPR /GET DEVICE/FILE DESCRIPTOR JMP I QREMARK JMS I QLOAD /LOAD INTO SAC TAD TYPE1 /TYPE MUST BE STRING SPA CLA JMP .+3 /IT WERE JMS I QERMSG /IT WEREN'T 0616 TAD I FILESW /GET CORRECT OPEN JMS I QOUTWRD JMP I QNEWLIN FOPENS, OPENAF;OPENAV;OPENNF;OPENNV FILESW, 0 PLUS, 40;0;XADD;XADD / EXPRESSION ANALYZER PAGE EXPR, 0 /POLISHIZE EXPRESSION DCA TEMP /SAVE LEFT TAD LEFT /SO WE CAN PUSH OLD VALUE JMS I QPUSH /OF IT TAD TEMP /NOW SET NEW VALUE DCA LEFT /OF THAT SWITCH TAD EXPR JMS I QPUSH /SAVE RETURN ADDR JMS I QPUSH /MARK STACK TAD LEFT /IS THIS LEFT SIDE ? SPA CLA JMP OPRAND+1/YES, NO UNARY MINUS UNOPR, JMS I QGETC /LOOK FOR UNARY OPERATOR JMP MISARG /THERE HAS TO BE AN OPERAND TAD (-53 /UNARY+(NOP) SNA JMP UNOPR TAD (53-55 /UNARY - SZA JMP NOTMIN /NOT UNARY MINUS TAD (UMOPR /PUSH UNARY MINUS JMS I QPUSH JMP UNOPR NOTMIN, TAD (55-50 /LOOK FOR ( SZA CLA JMP OPRAND /NOT A SUB EXPRESSION JMS I QEXPR /COMPILE SUB EXPRESSION JMP BADEXP /BAD SUB EXPRESSION JMS I QCHECKC /LOOK FOR ) -51 SKP /ERROR JMP OPR8R /GOTIT JMS I QERMSG /PARENTHESIS MIS MATCH 1520 JMP BADEXP OPRAND, JMS I QBACK1 /PUT BACK NON UNARY OP JMS I QGETNAM /LOOK FOR VARIABLE REF JMP NOTVAR /NOPE. JMS I QLOOKUP /SYMBOL TABLE SEARCH TAD SYMBOL /SAVE SYMBOL NUMBER DCA TEMP2 /BECAUSE SAVAC MIGHT KILL IT JMS I QSAVAC /GENERATE FSTA (MAYBE) -3 TAD TYPE /WAS THIS A FUNCTION OR ARRAY ? AND (3000 SZA JMP FUNSS /YES, GO PROCESS IT TAD TYPE /MAKE OPERAND STACK ENTRY JMS I QPUSHO TAD TEMP2 /FIRST TYPE THEN SYMBOL # JMS I QPUSHO OPR8R, TAD LEFT /LEFT SIDE ? SMA CLA /YES, NO OPERATORS LEGAL JMS I QGETC /LOOK FOR OPERATOR JMP ENDEXP /END OF EXPR TAD (-52 /** IS SPECIAL CASE SZA JMP NOSTAR /NOT * JMS I QGETC /LOOK FOR SECOND * JMP NOSTAR TAD (-52 SNA CLA TAD (136-52 /** -> ^ SNA JMS I QBACK1 /PUT IT BACK NOSTAR, TAD (52 /RESTORE CHAR DCA TEMP TAD (OPR8RS-1 DCA X10 /PTR TO LIST OPRLUP, TAD I X10 /GET OPERATOR PTR SNA JMP ENDEXP-3/END OF LIST DCA NEWOP /SAVE IT IN CASE TAD I X10 /COMPARE TAD TEMP SZA CLA JMP OPRLUP /KEEP LOOKING GOTOPR, JMS I QPOP /GET STACK TOP SNA JMP PUSH2 /EMPTY DCA OLDOP TAD I OLDOP /COMPARE PREC. CIA TAD I NEWOP /NEW-OLD SPA SNA CLA JMP OUTOLD /OLD>NEW TAD OLDOP PUSH2, JMS I QPUSH /OLD < NEW TAD NEWOP /GO PUSH BOTH JMS I QPUSH JMP UNOPR /GO LOOK FOR NEXT OPERAND OUTOLD, TAD OLDOP /OUTPUT CODE FOR OLD OPR8R JMS I QOUTOPR JMP GOTOPR /LOOK AT NEXT TOP OF STACK JMS I QBACK1 /PUT BACK NON OPERATOR SKP JMS I QOUTOPR /OUTPUT OPERATOR ENDEXP, JMS I QPOP /LOOK FOR STACK MARK SZA JMP ENDEXP-1/NOT THIS JMS I QPOP /GET RETURN ADDR IAC DCA TEMP JMS I QPOP /GET LEFT SIDE SWITCH DCA LEFT JMP I TEMP /RETURN MISARG, JMS I QERMSG /MISSING OPERAND 1517 JMP BADEXP MINUS, 40;0;XISUB;XSUB SLASH, 50;0;XIDIV;XDIV / EXPRESSION ANALYZER (HANDLE SUBSCRIPTS) PAGE FUNSS, AND (1000 /IS IT FUN CALL ? SNA CLA JMP .+3 /NO JMS I QSAVAC /YES, SAVE AC -1 TAD TYPE /SAVE TYPE JMS I QPUSH TAD TEMP2 /AND SYMBOL NUMBER JMS I QPUSH TAD STPTR /AND SYMBOL TABLE PTR JMS I QPUSH SKP SSLOOP, JMS I QPOP /GET ARG/SS COUNT IAC JMS I QPUSH /INCREMENT IT JMS I QEXPR /GET NEXT ARG/SS JMP BADFSS JMS I QGETA1 /IS THIS ARG(SS) AN ARRAY REF ? CLL CML RTR AND TYPE1 /CHECK THE TYPE SNA CLA JMP NOTSSD /NOT AN ARRAY REFERENCE JMS I QLOADSS /LOAD THE SS REGS JMS I QSAVAC /SAVE AC IF NEEDED -1 TAD TYPE1 /SET THE MODE JMS I QMODSET TAD (AFLDA /LOAD THIS ARG/SS TAD SYMBL1 JMS I QOUTWRD TAD Q400 /SET THE IN-AC BIT TAD MODE /WE JUST CALLED MODSET DCA I OSTACK /CHANGE THIS STACK ENTRY SKP NOTSSD, ISZ OSTACK /FIX UP OSTACK ISZ OSTACK JMS I QCOMARP /LOOK FOR , OR ) JMP BADFSS /NEITHER IS BAD JMP SSLOOP /, MEANS MORE ARGS/SS JMS I QPOP /GET # OF ARG/SS DCA TEMP /GET ARG/SS COUNT JMS I QPOP /RESTORE S.T. ADDR DCA STPTR JMS I QPOP DCA SYMBOL /GET BACK THE SYMBOL # JMS I QPOP DCA TYPE /GET BACK THE TYPE TAD TYPE /IS IT AN ARRAY OR FUN REF ? AND (1000 SZA CLA JMP DOCALL /FUNCTION REFERENCE TAD TEMP /MOVE SS COUNT CLL RTR /INTO THE CORRECT RTR /FIELD DCA TEMP2 /AND SAVE IT CDF 10 TAD I STPTR /ANY PREV REFERENCE ? AND (3000 SZA JMP NOTNEW /YES, GO CHECK NUMBERS TAD TEMP2 /IF NONE, PUT IN NUMBER TAD I STPTR DCA I STPTR JMP NDOK /THATS ALL NOTNEW, CIA /COMPARE NUMBER OF SS TAD TEMP2 /WITH ANY PREVIOUS SZA CLA JMP BADFSS+3/THEY DON'T MATCH NDOK, CDF TAD TYPE /PUT TYPE TAD TEMP /AND DIM COUNT ONSTAK, JMS I QPUSHO /ONTO ARGUMENT STACK TAD SYMBOL JMS I QPUSHO /AND SYMBOL NUMBER JMS I QSAVAC /SAVE FIRST SS IF LEFT IN AC -5 JMP OPR8R /GO GET AN OPERATOR BADFSS, TAD (-4 /PURGE STACK JUNK TAD STACK DCA STACK JMS I QERMSG /PUT ERROR MESSAGE 2323 BADEXP, JMS I QPOP /LOOK FOR STACK MARK SZA CLA JMP BADEXP /NOT YET JMS I QPOP /RETURN ADDR DCA TEMP JMS I QPOP /SS LOAD SWITCH DCA LEFT JMP I TEMP /TAKE ERROR EXIT WTAB, -124;-101;-102;-50 NOTVAR, TAD LEFT /LEFT SIDE ? SPA CLA JMP MISARG /YES, NO LITERALS LEGAL JMS I QNUMBER /LOOK FOR LITERAL JMP NOTNUM /NOT A NUMBER JMS I QLUKUP2 /SEARCH LITERAL TABLE LITRL -3 JMS NEWVAR /IF NEW, GIVE IT NUMBER JMP ONSTAK /GO PUT IT ONTO THE STACK NOTNUM, JMS I QSTRING /LOOK FOR STRING LITERAL JMP MISARG /NO, MISSING ARG TAD WORD1 /GET -NUMBER WORDS - 1 IAC CLL CML CMA RAR DCA .+3 /FOR LOOKUP JMS I QLUKUP2 /LOOK UP LITERAL SLITRL 0 JMS NWSVAR /IF NEW, GIVE IT NUMBER CLL CML RAR /SET TYPE BIT FOR STRING JMP ONSTAK /PUT INFO ONTO STACK UPAROW, 60;1;EXPRTN-1 / EXPRESSION ANALYZER (HANDLE FUNCTION CALLS) PAGE DOCALL, TAD LEFT /IS THIS LEFT SIDE ? SMA CLA /IF YES, FUN ILLEGAL JMS OUTCAL /GENERATE CALL SKP /SKIP IF ERROR JMP OPR8R /GO LOOK FOR OPERATOR JMS I QERMSG /BAD FUNCTION REFERENCE 0622 JMP BADEXP OUTCAL, 0 /GENERATE FUN CALL; TYPE, /SYMBOL AND TEMP ARE INPUTS TAD SYMBOL /SAVE FUNCTION NUMBER AROUND SAVAC DCA FUNNUM JMS I QSAVAC /SAVE SECOND FROM TOP -3 TAD FUNNUM /SETUP FOR FINDING FUNCTION DCA WORD1 /INFO BLOCK JMS I QLUKUP2 /ON THE FUNCTION LIST FUNCTN -1 JMP I OUTCAL /UNDEFINED FUNCTION TAD SYMBOL /CHECK NUMBER OF ARGS TAD TEMP SZA CLA JMP I OUTCAL MOVARG, JMS I QLOAD /GET TOP OF STACK INTO AC JMS SETFLD /GET FIELD OF FORMAL-PARAMS TAD I X10 /GET FIRST ONE CDF DCA TEMP CLL CML RAR /COMPARE TYPE OF ARG AND TYPE1 /WITH THAT OF FORMAL PARAMETER TAD TEMP SPA CLA /THEY MUST MATCH JMP I OUTCAL /(THEY DON'T) CLL CML RTR /SHOULD WE LEAVE IT IN THE AC ? AND TEMP SZA CLA JMP OKINAC /YES, SAVES AN INSTRUCTION TAD TYPE1 /SET MODE JMS I QMODSET /APPROPRIATELY CLL CMA RAR /3777 AND TEMP /GET SYM NUMBER TAD (FSTA /STORE VALUE IN FORM PARAM JMS I QOUTWRD OKINAC, ISZ SYMBOL /MORE ARGS ? JMP MOVARG JMS SETFLD TAD I X10 /GET TYPE OF FUNCTION DCA TYPE1 /(ITS RESULT THAT IS) CDF TAD TYPE /IS TYPE OF FUNCTION TAD TYPE1 /SAME AS TYPE OF CALL SPA CLA JMP I OUTCAL /NO, ERROR JMS I QMODSET /ALL CALLS IN N MODE TAD WORD1 /CHECK FOR USER FUNCTION SMA JMP CALLUF /YES, DO SPECIAL CALL FINCAL, ISZ OUTCAL /FIX RETURN JMS I QOUTWRD /OUTPUT CODE TAD Q400 /SET TOP OF STACK TAD TYPE1 DCA I OSTACK /TO AC DCA I OSTACK /SYMBOL NUMBER IS MEANINGLESS CLL CML RAR AND TYPE1 /INTERPRETER MODE SAME DCA MODE /AS FUNCTION TYPE JMP I OUTCAL /ON RETURN CALLUF, JMS I QNOREGS /FORGET REGS ON USER FUNC TAD LUFLD /OUTPUT JSUB AND (70 /WITH POINTER TO CLL RTL /DOUBLE WORD TAD (JSUB /VALUE OF LOCATION JMS I QOUTWRD /COUNTER FOR THE TAD X10 /START OF THE IAC /USER "DEF"INED FUNC JMP FINCAL FSUB1, 0 /FOR SUBROUTINE #1 JMS I QEXPR /GET AN EXPRESSION JMP BADFOR JMS I QLOAD /LOAD VALUE TAD TYPE1 /MUST BE NUMERIC SMA CLA JMP I FSUB1 /OK BADFOR, JMS I QERMSG /BAD FOR LOOP PARAMETERS 0620 JMP I QREMARK FSUB2, 0 /FOR SUBROUTINE #2 JMS FSUB1 /GET EXPR AND LOAD IT JMS GENTMP /MAKE A TEMP FOR IT TAD SYMBOL /STORE EXPR IN TEMP TAD (FSTA JMS I QOUTWRD TAD SYMBOL /RETURN SLOT # JMP I FSUB2 FUNNUM, NOREGS, 0 /FORGET REGISTORS CLA IAC /FILE NUMBER REG DCA IFNREG / CMA /SUBSCRIPT REG #1 / DCA SSREG1 / CMA /SUBSCRIPT REG #2 / DCA SSREG2 JMP I NOREGS CLOSE, JMS I QLODSN /OUTPUT STMT NUMBER CLA IAC /NO COLON NEEDED AFTER FILE NUM JMS GETFN /GET FILE NUM TAD (CLOSEF /OUTPUT CLOSE JMS I QOUTWRD JMP I QNEWLIN PSETJF, 0 TAD (SETJF JMS I QOUTWRD JMS I QPOP /GET INDEX VAR DCA FINDEX JMP I PSETJF DIMREAD,JMS I QLOADSS /PATCH TO INPUT PROC. SET UP SS REG TAD (READ /OUTPUT INSTR JMS I QOUTWRD TAD (AFSTA JMP I (FININP /RESUME IN LINE / CODE GENERATOR PAGE OUTOPR, 0 /OUTPUT CODE FOR OPERATOR DCA X10 /SAVE POINTER TO SKELETON TAD I X10 /GET CONTROL WORD SMA SZA JMP SPCIAL /TREAT AS SPECIAL CASE DCA TYPE /ITS THE TYPE ALLOWANCE TAD (XLOAD /GET SKEL ADDRS DCA CASEMM /FOR THE THREE CASES TAD I X10 DCA CASEMA TAD I X10 DCA CASEAM TAD TYPE /ENTER CORRECT MODE JMS I QMODSET CLL CMA RAL /GET THE SECOND OPERAND TAD OSTACK DCA OSTACK TAD OSTACK DCA X10 /BY BACKING UP THE STACK TAD I X10 /TYPE DCA TYPE2 TAD I X10 DCA SYMBL2 /SYMBOL NUMBER TAD TYPE2 AND (3 DCA TEMP /SS COUNT TAD TYPE2 /LOOK AT OPERAND 2 AND Q400 SZA CLA JMP MAC /MUST BE CASE M,AC CLL CML RTR /ITS IN MEMORY, IS IT SS'D AND TYPE2 SNA CLA JMP A2OK /NO, ITS SCALAR JMS I QLOADSS /LOAD NECESSARY SS REGS ISZ CASEMM /FIXUP THE SKELETON POINTERS ISZ CASEAM A2OK, JMS GETA1 /GET STUF FOR ARG1 TAD TYPE1 /LOOK AT IT AND Q400 SZA CLA JMP ACM /ITS CASE AC,M MM, TAD I CASEMM /ITS CASE M,M LOAD OPERAND 2 TAD SYMBL2 JMS I QOUTWRD SKP MAC, JMS GETA1 /GET STUF FRO ARG1 CLL CML RTR /IS IT SS'D ? AND TYPE1 SNA CLA JMP A1OK /NO, ITS SCALAR JMS I QLOADSS /LOAD THE SS REGS ISZ CASEMA /BUMP SKELETON ADDR A1OK, TAD I CASEMA /GET CORRECT INSTRUCTION TAD SYMBL1 /PLUS SYMBOL NUMBER TYPCHK, JMS I QOUTWRD /OUTPUT IT CLL CML RAR /TYPES OF OPERANDS MUST MATCH AND TYPE1 TAD TYPE2 SPA CLA JMP MIXED /THEY DON'T TAD TYPE /TYPE OF OPERATOR TAD TYPE1 /MUST MATCH SPA CLA /THAT OF OPERANDS JMP MIXED /THEY DON'T TAD Q400 /GENERATE STACK ENTRY TAD TYPE DCA I OSTACK DCA I OSTACK /THIS IS SAFE JMP I OUTOPR ACM, TAD I CASEAM /ITS CASE AC,M TAD SYMBL2 /GEN OPERATION FOR OPERAND 2 JMP TYPCHK /GO FINISH IT UP MIXED, JMS I QERMSG /MIXED TYPES 1524 JMP I OUTOPR SPCIAL, TAD I X10 /GET ADDR OF SPECIAL RTNE DCA TEMP /(PLUS 1 FROM THE TYPE WORD) JMP I TEMP /HANDLE SPECIAL CASE GETA1, 0 /GET STUFF FOR ARG 1 CLL CMA RAL /BACK UP STACK TAD OSTACK DCA OSTACK TAD OSTACK DCA X11 TAD I X11 /GET TYPE1 DCA TYPE1 TAD I X11 /GET SYMBL1 DCA SYMBL1 TAD TYPE1 /GET SS COUNT AND (3 DCA TEMP JMP I GETA1 UMRTNE, JMS I QSAVAC /SAVE CURRENT AC IF NEEDED -3 JMS I QLOAD /GET ARG IN AC DCA TYPE /TYPE MUST BE NUMERIC DCA TYPE2 TAD (FNEG /DO NEGATE JMP TYPCHK EXPRTN, DCA TYPE /SET FUNC TYPE CLL CML RTL /SET NUMBER OF ARGS DCA TEMP TAD (FUNC1+60 DCA SYMBOL /EXP2 JMS OUTCAL /OUTPUT FUNCTION CALL JMP MIXED /ERROR JMP I OUTOPR /DONE CASEMA, 0 CASEMM, 0 CASEAM, 0 TYPE2, 0 SYMBL2, 0 RETURN, JMS I QLODSN /OUTPUT STMT NUM LOAD JMS I QMODSET /ALWAYS RETURN IN N MODE TAD (RET-RNDO RANDOM, TAD (RNDO-STOP STOPX, TAD (STOP /RETURN, RANDOMIZE, OR STOP JMS I QOUTWRD JMP I QNEWLIN / LETTER AND DIGIT SCANNERS PAGE LETTER, 0 /SKIP ON LETTER JMS I QGETC JMP I LETTER /NO LETTER TAD (-133 /MUST BE .LT. 133 SMA JMP NOLETR TAD (133-100/MUST BE .GT. 100 SPA JMP NOLETR AND (77 /RESTORE 6 BITS ISZ LETTER /BUMP RETURN ADDR JMP I LETTER NOLETR, JMS I QBACK1 /PUT CHAR BACK JMP I LETTER DIGIT, 0 /SKIP ON DIGIT JMS I QGETC JMP I DIGIT /NO DIGIT TAD (-72 /MUST BE .LT. 72 O7100, CLL /(USED AS LITERAL BY "TTY") TAD (72-60 /MUST BE .GE. 60 SNL JMP NODIGT /NOPE ISZ DIGIT /RETURN DIGIT MINUS 60 JMP I DIGIT NODIGT, JMS I QBACK1 /PUT IT BACK JMP I DIGIT / STATEMENT NUMBER GETTER SNUM, 0 /GET A STATEMENT NUMBER DCA TEMP /SAVE DEFINED SWITCH JMS I QDIGIT /GET FIRST DIGIT JMP I SNUM /NO STATEMENT NUMBER DCA WORD2 /THIS WILL BE THE BUCKET TAD WORD2 CLL RAL /TWO WORDS PER BUCKET TAD (SNUMS DCA BUCKET ISZ SNUM /OK, ITS A STMT NUMBER TAD (-4 /FIVE DIGITS MAX DCA TEMP2 DCA WORD1 /CLEAR TOP WORD SNLOOP, JMS I QDIGIT /GET NEXT DIGIT JMP GOTSN /END OF NUMBER DCA WORD3 /SAVE IT TAD (-4 /SET SHIFT COUNT DCA ACO SHIFT, TAD WORD2 /SHIFT LEFT ONE BIT CLL RAL DCA WORD2 TAD WORD1 RAL DCA WORD1 ISZ ACO /BUMP SHIFT COUNTER JMP SHIFT TAD WORD2 /PUT IN NEW DIGIT TAD WORD3 DCA WORD2 ISZ TEMP2 /BUMP DIGIT COUNT JMP SNLOOP GOTSN, JMS I QLUKUP2 /FIND STMT NUMBER BUCKET, 0 -2 JMP NEWSN /ITS A NEW STMT NUM CLL CML RAR /CHECK FOR MULTIPLY DEFINED AND SYMBOL AND TEMP SZA CLA JMP MDLABL /YES, IT IS TAD X10 /GET ADDR OF LABEL VALUE DCA TEMP2 JMS SETFLD /GET TO FIELD OF ENTRY TAD TEMP /OR IN THESE BITS TAD SYMBOL DCA I TEMP2 FINSN, CDF TAD LUFLD /GET FIELD BITS AND (70 CLL RTL DCA TEMP /INTO A CONVIENIENT JMP I SNUM /PLACE NEWSN, JMS SETFLD /GET FIELD TAD TEMP /PUT IN BITS DCA I NEXT TAD NEXT /SAVE N3 ADDR DCA TEMP2 DCA I NEXT /1 EXTRA WORD JMP FINSN MDLABL, JMS I QERMSG /MULTIPLY DEFINED 1504 /LABEL JMP I SNUM TTY, 0 /CONVERT TO ASCII AND PRINT AND (77 /SIX BITS ONLY TAD (-40 /WHAT SIDE OF FORTY ? SPA TAD O7100 /LOW SIDE TAD (240 /HIGH SIDE JMS TTX /PRINT CHAR JMP I TTY /RETURN TTX, 0 /PRINT CHAR ON TTY SKP /(CONTROL O ZEROES THIS WORD) JMP .+4 /(THUS KILLING ERROR REPORTING) TSF JMP .-1 TLS CLA JMP I TTX / CHAIN PROCESSOR CHAIN, JMS I QLODSN /OUTPUT STMT NUMBER JMS I QEXPR /GET CHAIN STRING JMP I QREMARK JMS I QLOAD /INTO SAC TAD TYPE1 /TYPE MUST BE STRING SMA CLA JMS I QERMSG /IT WASN'T 0616 /(OK IF ERROR CODE IS NOP) TAD (CHN /OUTPUT CHAIN OPCODE JMS I QOUTWRD JMP I QNEWLIN XISUB, FISUB;AISUB / SEVERAL SHORT UTILITY ROUTINES PAGE BACK1, 0 /BACK UP ONE CHAR CLA CMA TAD NCHARS DCA NCHARS CLA CMA TAD CHRPTR DCA CHRPTR JMP I BACK1 GETCWB, 0 /GET A CHARACTER (PRESERVE BLANKS) ISZ NCHARS JMP .+4 CLA CMA DCA NCHARS /RESET NCHARS JMP I GETCWB ISZ GETCWB TAD I CHRPTR /GET THE CHAR JMP I GETCWB SAVECP, 0 /SAVE CHAR POSITION TAD NCHARS DCA NCSAVE TAD CHRPTR DCA CPSAVE JMP I SAVECP RESTCP, 0 /RESTORE CHAR POS TAD CPSAVE DCA CHRPTR TAD NCSAVE DCA NCHARS JMP I RESTCP GETC, 0 /GET A CHARACTER (IGNORING BLANKS) ISZ NCHARS JMP .+4 CLA CMA DCA NCHARS JMP I GETC TAD I CHRPTR TAD (-40 /IS IT A BLANK SNA JMP GETC+1 /YES IGNORE IT TAD (40 /FIX CHAR ISZ GETC JMP I GETC POP, 0 /GET TOP OF STACK TAD STACK DCA PUSH CLA CMA TAD STACK DCA STACK /DECREMENT STACK POINTER TAD I PUSH JMP I POP PUSH, 0 /PUT AC ONTO STACK DCA I STACK /STORE TAD (-STACKA-STAKSZ+1 TAD STACK /CHECK FOR OVERFLOW SPA CLA JMP I PUSH /OK, RETURN STKOVR, JMS I QERMSG 2004 JMP I XABORT /ABORT COMPILATION PUSHO, 0 /PUSH OPERAND STACK DCA I OSTACK /PUSHIT TAD (-STACKO-STOKSZ+1 TAD OSTACK /CHECK FOR STACK OVERFLOW SPA CLA JMP I PUSHO JMP STKOVR /TOO FULL COMARP, 0 /SKIP ON COMA OR RITE PAREN JMS I QGETC /GET CHAR JMP I COMARP TAD (-51 SNA ISZ COMARP /RITE PAREN, SKIP 2 SZA TAD (51-54 /CHECK FOR , SNA ISZ COMARP /, SKIP 1 SZA CLA JMS I QBACK1 /NEITHER PUT BACK JMP I COMARP LOAD, 0 /LOAD SAC OR FAC JMS I QGETA1 /GET TOP OF STACK TAD TYPE1 /SET MODE JMS I QMODSET TAD TYPE1 /IS IT IN THE AC? AND Q400 SZA CLA JMP I LOAD /YUP CLL CML RTR /SUBSCRIPTED ? AND TYPE1 SNA CLA JMP .+3 /NO JMS I QLOADSS /FILL SS REGS TAD (AFLDA-FLDA TAD (FLDA /ARRAY OR SCALAR LOAD TAD SYMBL1 /PLUS SYMBOL NUMBER JMS I QOUTWRD JMP I LOAD IFOPS, JNE;-7476 /<> JNE;-7674 />< JGE;-7576 /=> JGE;-7675 />= JLE;-7574 /=< JLE;-7475 /<= 0 JEQ;-7500 /= JGT;-7600 /> JLT;-7400 /< 0 NCSAVE, 0 CPSAVE, 0 / TEMP GENERATORS AND AC SAVING ROUTINES PAGE GENTMP, 0 /GENERATE A TEMP SZA CLA JMP STRTMP /ITS A STRING TEMP TAD TMPCNT ISZ TMPCNT /BUMP COUNT DCA NAME1 JMS I QLUKUP2 /LOOK UP THIS TEMP TEMPS -1 JMS NEWVAR /NEW ONE ON ME JMP I GENTMP STRTMP, TAD STMPCT ISZ STMPCT /BUMP COUNT DCA NAME1 JMS I QLUKUP2 /LOOK UP THIS TEMP STEMPS -1 JMS NWSVAR /NEW STRING TEMP JMP I GENTMP NEWVAR, 0 /MAKE SYM NUM FOR VAR TAD VARCNT /PUT SYM NUM TAD (401 DCA SYMBOL /INTO SYMBOL TAD SYMBOL /AND INTO ST ENTRY JMS SETFLD DCA I NEXT CDF ISZ VARCNT /BUMP COUNT JMP I NEWVAR /RETURN WITH SYM NUM JMP STOVER /S.T. OVERFLOW NWSVAR, 0 /MAKE SYM NUM FOR VAR$ TAD SVCNT /PUT SYM NUM TAD (401 DCA SYMBOL TAD SYMBOL /INTO SYMBOL AND JMS SETFLD DCA I NEXT /S.T. ENTRY CDF ISZ SVCNT /OVERFLOW ? JMP I NWSVAR /NO, WE'RE OK JMP STOVER SAVAC, 0 /SAVE FAC (OR SAC) IF NECESSARY TAD I SAVAC /GET ENTRY POINTER TAD OSTACK ISZ SAVAC DCA SVTEMP /ADDR OF TYPE WORD TAD I SVTEMP /LOOK AT IT AND Q400 SNA CLA JMP I SAVAC /NOT IN AC CLL CML RAR /SAVE STRING BIT ONLY AND I SVTEMP /OF TYPE WORD DCA I SVTEMP TAD I SVTEMP JMS GENTMP /GENERATE TEMP TAD I SVTEMP JMS I QMODSET /SET MODE TAD XSTOR TAD SYMBOL /GENERATE STORE JMS I QOUTWRD TAD SYMBOL /RETURN S.T. NUMBER ISZ SVTEMP /MOVE TO SYMBOL NUM WORD DCA I SVTEMP /SAVE THE TEMP NUM THERE JMP I SAVAC /RETURN WITH SAVE MADE SVTEMP, 0 XSTOR, FSTA;AFSTA / SUBSCRIPT REGISTER LOADING ROUTINE LOADSS, 0 /LOAD SS REGS CLL CMA RAL /LOOK AT NUMBER OF SS TAD TEMP SNA CLA JMP LODSS2 /2 SS SNL JMP TOOMNY /MORE THAN 2 JMS SSLOAD /LOAD SS REG 1 JMP I LOADSS LODSS2, CLA IAC JMS SSLOAD /LOAD SS REG 2 JMS SSLOAD /NOW SS REG 1 JMP I LOADSS SSTYPE, TOOMNY, JMS I QERMSG /SUBSCRIPTING ERROR 2323 JMP I LOADSS SSLOAD, 0 /LOAD A SS REG FROM TOP OF STACK DCA TEMP2 /SS REG 1 OR 2 SWITCH CLL CMA RAL /BACK UP ONE ENTRY TAD OSTACK /ON THE OPERAND STACK DCA OSTACK TAD OSTACK DCA X11 /USE X11 TO GET STUFF TAD I X11 /GET TYPE WORD SPA JMP SSTYPE /SS MUST BE A NUMBER AND Q400 /GET AC BIT SZA CLA JMP SSINAC /ITS IN THE AC TAD TEMP2 SZA CLA TAD (LSS2-LSS1 TAD (LSS1 /LOAD REG 1 OR 2 ?? TAD I X11 /ANYHOW, THIS IS THE SOURCE JMS I QOUTWRD /OUTPUT THE CODE JMP I SSLOAD SSINAC, TAD TEMP2 TAD (LSS1AC /NOTE: LSS2AC=LSS1AC+1 JMS I QOUTWRD /SO OUTPUT ONE OF THEM JMP I SSLOAD / XSCOMP, SCOMP;SACOMP XDIV, FDIV;AFDIV / PATCH6, 0 ISZ SIGDIG JMP I PATCH6 CMA DCA SIGDIG JMP CONVLP / STAR, 50;0;XMUL;XMUL / NUMERIC CONVERSION ROUTINE (PART ONE) PAGE NUMBER, 0 /GENERAL NUMBER CONVERSION ROUTINE DCA DECPT /ZERO DECIMAL POINT SWITCH DCA WORD1 /ZERO FAC DCA WORD2 DCA WORD3 DCA ACO DCA SIGN /CLEAR SIGN SWITCH TAD NUMDIG DCA SIGDIG JMS I QGETC /GET A CHAR JMP I NUMBER /NO CHAR IS NO NUMBER JMS CHKSGN /CHECK FOR SIGN SIGN, 0 /THIS SWITCH GETS SET DCA NDIGIT /ZERO DIGIT COUNT CONVLP, JMS I QDIGIT /GET A DIGIT JMP TRYDEC /IS THERE A DECIMAL POINT ? DCA NXTDGT /SAVE THE DIGIT JMS PATCH6 ISZ NDIGIT /INCR NUMBER OF DIGITS TAD WORD2 /PREPARE TO MULT BY 10 DCA OP2 TAD WORD3 DCA OP3 TAD ACO DCA OPO JMS I (AL1 /DOUBLE FAC JMS I (AL1 /DOUBLE AGAIN JMS I (OADD /TIMES FIVE JMS I (AL1 /ONE MORE DOUBLING IS TIMES 10 DCA OP2 DCA OP3 /PUT NEWEST DIGIT INTO OPERAND TAD NXTDGT DCA OPO JMS I (OADD /ADD IN NEWEST DIGIT JMP CONVLP TRYDEC, TAD DECPT /DECIMAL ALREADY ? SZA CLA JMP TRYE2 /YES, LOOK FOR EXPONENT JMS I QGETC /LOOK FOR . JMP DIGTST /SEE IF THERE WAS ANYTHING TAD (-56 SZA CLA JMP TRYE1 /TRY FOR E ISZ DECPT /SET DECIMAL POINT SW JMP CONVLP-1/LOOP FOR OTHER DIGITS TRYE1, JMS I QBACK1 /PUT BACK NON . DIGTST, TAD NDIGIT /ANY DIGITS YET ? SNA CLA JMP I NUMBER /NO, NO NUMBER TRYE2, JMS I QGETC /LOOK FOR E JMP NOEXP+1 /GO HANDLE EXPONENT TAD WSTEP+2 /USE PART OF "STEP" LITERAL SZA CLA JMP NOEXP /NO EXPONENT GETEXP, DCA ESIGN /ZERO EXPONENT SIGN SWITCH JMS I QGETC /GET A CHAR JMP NOEXP /TREAT AS NO EXPONENT JMS CHKSGN /IS IT A SIGN FPRTNE, ESIGN, 0 /THIS IS THE SWITCH TO SET JMS SMLNUM /GO GET THE EXPONENT FIXEXP, TAD ESIGN /CHECK EXPONENT SIGN SNA CLA JMP NOEXP+2 TAD EXPON /COMPLEMENT EXPONENT CIA SKP NOEXP, JMS I QBACK1 /PUT BACK NON E DCA EXPON /ZERO EXPONENT TAD (43 /NORMALIZE THE NUMBER DCA WORD1 JMS I (ANORM TAD DECPT /WAS THERE A DECIMAL POINT ? SZA CLA TAD NDIGIT /HOW MANY DIGITS TO THE RIGHT ? CIA TAD EXPON /SUBTRACT THAT NUMBER FROM EXP SMA JMP POSEXP /EXPONENT IS POSITIVE CIA DCA EXPON /ONLY NEED ABS VALUE TAD (FPDIV /DO DIVIDES JMP .+3 POSEXP, DCA EXPON TAD (FPMUL /DO MULTIPLIES DCA FPRTNE /MULTIPLY/DIVIDE ROUTINE TAD (PETABL-1 DCA X11 /POWERS OF TEN TABLE EXPMUL, TAD EXPON /LOOK AT THE EXPONENT SNA JMP DOSIGN /IF 0 ITS THRU CLL RAR DCA EXPON /PUT LOWEST BIT INTO LINK SNL JMP SKPEXP /THIS ONE DOESN'T COUNT TAD I X11 /MOVE FACTOR INTO OPERAND DCA OP1 TAD I X11 DCA OP2 TAD I X11 DCA OP3 TAD I X11 DCA OPO JMS I FPRTNE /MULTIPLY OR DIVIDE BY THIS FACTOR JMP EXPMUL /CHECK NEXT BIT SKPEXP, TAD X11 /SKIP OVER THIS FACTOR TAD (4 JMP EXPMUL-1 DOSIGN, TAD SIGN /CHECK THE SIGN SZA CLA JMS I (NEGFAC /NEGATE IF NEGATIVE ISZ NUMBER /BUMP RETURN JMP I NUMBER /RETURN NXTDGT, 0 /INPUT DEVICE HANDLER *INDEVH 0 /INITIALIZATION CODE FOR RUN CASE PAGE RUNNED, CIF 10 /COME HERE IF .R BCOMP JMS I (200 /CALL COMMAND DECODER 5 0201 /ASSUMED EXTENSION "BA" CDF 10 TAD I (7644 /TEST FOR /V CDF AND (4 SZA CLA JMS VERNUM TAD (INFO-1 DCA X10 CDF 10 TAD 7617 CDF SNA CLA /NULL INPUT? JMP RUNNED /YES: NAUGHTY TAD 7777 CLL RAL /BATCH RUNNING SPA CLA JMP SAVBOS /YES CDF 10 JMP FINDSV-2 SAVBOS, TAD (INFO-5 DCA X10 TAD 7777 AND (70 TAD CDFZRO DCA .+1 /CDF TO BATCH FIELD CDF 10 TAD I BOSCTR CDF 10 DCA I X10 /SAVE BOS WRDS IN INFO AREA ISZ BOSCTR JMP .-5 DCA I X10 /ZERO EDITOR BLOCK NUMBER CDF FINDSV, TAD I X11 /LOOKUP SOME SAVE FILES SNA JMP LUBUF /GO LOOK FOR BASIC.UF DCA XXXXSV /SAVE POINTER TO NAME CLA IAC /THEY'RE ON SYS CIF 10 JMS I (200 2 XXXXSV, 0 0 JMP NG /ERROR TAD XXXXSV /GET STARTING BLOCK IAC /PLUS 1 CDF 10 DCA I X10 /INTO INFO AREA CDFZRO, CDF JMP FINDSV /LOOP LUBUF, CLA IAC CIF 10 JMS I (200 /LOOKUP BASIC.UF 2 BUFN /(USER DEFINED FUNCTIONS) 0 JMP .+3 /OK IF NOT THERE TAD .-3 /GET STARTING BLOCK +1 IAC CDF 10 DCA I X10 /INTO INFO BLOCK STRT3, CDF CLA IAC /ENTER TEMPORARY FILE CIF 10 JMS I (200 3 TMPBLK, TMPFIL 0 JMP NG TAD TMPBLK /SAVE START OF TEMP FILE DCA OUBLOK TAD TMPBLK /IN A COUPLE PLACES DCA BLOCK TAD TMPBLK+1/ALSO THE SIZE DCA OUSIZE JMP GETDEV /GO FETCH DEVICE HANDLER BOSCTR, 7774 VERNUM, 0 TAD (VTEXT DCA TEMP TAD (-5 DCA TEMP2 TLS MOREV, TAD I TEMP CLL RTR RTR RTR JMS TTY TAD I TEMP JMS TTY ISZ TEMP ISZ TEMP2 JMP MOREV TAD (215 JMS TTX TAD (212 JMS TTX TSF /WAIT FOR TTY TO GET DONE JMP .-1 /BEFORE RETURNING JMP I VERNUM / VTEXT, TEXT /BCOMP V/ *.-1 VERLOC, VERSON^100+6001 0 / NUMERIC CONVERSION ROUTINE (PART TWO) PAGE FPMUL, 0 /FLOATING MULTIPLY ROUTINE TAD WORD1 /COMPUTE NEW EXPONENT TAD OP1 DCA OP1 TAD WORD2 /SAVE AC MANTISSA DCA TW2 TAD WORD3 DCA TW3 TAD (-30 /SET ITERATION COUNTER DCA ITRCNT DCA WORD2 /ZERO FAC MANTISSA DCA WORD3 DCA ACO MULLUP, JMS I (AR1 /SHIFT FAC RIGHT ONE TAD TW2 /SHIFT MULTIPLIER RIGHT CLL RAR DCA TW2 TAD TW3 RAR DCA TW3 SZL JMS OADD /ADD IF LINK IS ONE ISZ ITRCNT /BUMP COUNT JMP MULLUP /LOOP TAD OP1 /PUT IN CORRECT EXPONENT DCA WORD1 JMS ANORM /NORMALIZE THE RESULT JMP I FPMUL D2, TW2, 0 D3, TW3, 0 NFCNT, ANORM, 0 /NORMALIZE FAC TAD WORD2 /IS MANTISSA 0 ? SNA TAD WORD3 SNA TAD ACO SNA CLA JMP ZEXP /YES, ZERO EXPONENT NORMLP, CLA CLL CML RTR /IS HIGH ORDER MANTISSA = 6000 TAD WORD2 SZA JMP NO6000 /NO, SKIP THIS CRAP TAD WORD3 /YES, IS THE REST 0 ? SNA TAD ACO SZA CLA /SKIP IF 600000 ... 0000 NO6000, SPA CLA JMP I ANORM /NORM IS DONE WHEN BITS DIFFER JMS I (AL1 /SHIFT LEFT ONE CLA CMA /DECREMENT EXPONENT TAD WORD1 DCA WORD1 JMP NORMLP /LOOP ZEXP, DCA WORD1 JMP I ANORM NEGFAC, 0 /NEGATE FAC TAD (ACO /GET POINTER TO OPERAND DCA NFPTR CLL CMA RTL /THREE WORD NEGATE DCA NFCNT CLL NFLOOP, RAL TAD I NFPTR /GET NEXT WORD CLL CML CIA DCA I NFPTR /RESTORE AFTER COMPLEMENTING CML CLA CMA /LINK GETS COMPLEMENTED ONCE HERE TAD NFPTR /AND ONCE AGAIN HERE DCA NFPTR /RESTORE DECREMENTED POINTER ISZ NFCNT JMP NFLOOP JMP I NEGFAC NFPTR, 0 FPDIV, 0 JMS I (AR1 /UNNORMALIZE AC BY ONE TAD OP1 /COMPUTE FINAL EXPONENT CIA TAD WORD1 DCA OP1 /AND SAVE IT TAD (-30 /SET ITERATION COUNTER DCA ITRCNT TAD WORD2 RAL /INITIALIZE LINK FPDVLP, CLA RAR /COMPARE SIGNS TAD OP2 SPA CLA JMP .+3 TAD (OPO-ACO/NEGATE OPERAND JMS NEGFAC JMS OADD /ADD OPERAND AND FAC TAD D3 RAL DCA D3 TAD D2 RAL DCA D2 JMS I (AL1 /LEFT SHIFT FAC ONE ISZ ITRCNT /TEST ITERATION COUNT JMP FPDVLP TAD OP1 /PUT QUOTIENT INTO FAC DCA WORD1 TAD D2 DCA WORD2 TAD D3 DCA WORD3 DCA ACO JMS ANORM /NORMALIZE JMP I FPDIV OADD, 0 /ADD OPERAND TO FAC CLL TAD OPO TAD ACO DCA ACO RAL TAD OP3 TAD WORD3 DCA WORD3 RAL TAD OP2 TAD WORD2 DCA WORD2 JMP I OADD ITRCNT, 0 / NUMERIC CONVERSION ROUTINE (FINALE) PAGE SMLNUM, 0 /INPUT A NUMBER <= 4095 EXPLUP, DCA EXPON /ZERO THE EXPONENT JMS I QDIGIT /GET THE NEXT DIGIT JMP I SMLNUM /NUMBER DONE DCA OPO /SAVE THE DIGIT TAD EXPON /MULT BY 10 CLL RAL CLL RAL TAD EXPON CLL RAL TAD OPO /ADD IN DIGIT JMP EXPLUP /STORE BACK INTO EXPONENT AR1, 0 /SHIFT FAC RIGHT 1 BIT TAD WORD2 CLL RAR DCA WORD2 TAD WORD3 RAR DCA WORD3 TAD ACO RAR DCA ACO ISZ WORD1 JMP I AR1 JMP I AR1 AL1, 0 /SHIFT FAC LEFT ONE TAD ACO CLL RAL DCA ACO TAD WORD3 RAL DCA WORD3 TAD WORD2 RAL DCA WORD2 JMP I AL1 CHKSGN, 0 /CHECK FOR SIGN TAD (-55 /IS IT - ? SNA ISZ I CHKSGN /YES, SET SWITCH SZA TAD (55-53 /IS IT + ? SZA CLA JMS I QBACK1 /RETURN CHAR OTHERWISE JMP I CHKSGN / STRING LITERAL SCANNER STRING, 0 /LOOK FOR A STRING JMS I QCHECKC /LOOK FOR " M42, -42 JMP I STRING /NONE MEANS NO STRING ISZ STRING DCA WORD1 /ZERO CHAR COUNT TAD (WORD2 /SETUP POINTER DCA TEMP TAD (-STRLIM%2 /AND MAX SIZE DCA TEMP2 SLOOP, JMS GCS /GET HIGH ORDER CHAR JMP I STRING /END OF STRING CLL RTL RTL RTL DCA I TEMP /PUT INTO UPPER HALF OF WORD JMS GCS /GET LOWER CHAR JMP PUT40 /FILL LAST WORD WITH BLANK TAD I TEMP /COMBINE THEM DCA I TEMP ISZ TEMP /BUMP POINTER ISZ TEMP2 /TOO BIG YET ? JMP SLOOP /NO, LOOP JMS I QGETC /MAX SIZE STRING, MUST FIND " JMP STRGER /BAD STRING LITERAL TAD M42 SNA CLA JMP I STRING /OK STRGER, JMS I QERMSG /STRING ERROR 2123 JMP I STRING PUT40, TAD I TEMP /GET LAST WORD TAD (40 /PUT BLANK IN LOW CHAR DCA I TEMP /STORE NEW WORD JMP I STRING /RETURN GCS, 0 /GET A CHAR FOR STRING JMS I QGETCWB /GET A CHAR (INCLUDE BLANKS) JMP STRGER /BAD TAD M42 /IS IT " SZA JMP NOTQOT /NO JMS I QGETCWB /IS IT "" JMP I GCS /NO, THAT WAS IT TAD M42 /LOOK FOR SECOND " SNA CLA JMP NOTQOT /"" BECOMES " JMS I QBACK1 /PUT IT BACK JMP I GCS /LITERAL IS DONE NOTQOT, TAD (42 /RECREATE CHAR AND (77 /ELIMINATE EXTRA BITS ISZ WORD1 /BUMP STRING COUNT ISZ GCS /FIX RETURN JMP I GCS MODSET, 0 /SET INTERPRETER MODE TAD MODE /SUM OF DESIRED AND CURRENT SMA CLA JMP I MODSET /THEY WERE THE SAME TAD MODE /OTHERWISE SWITCH MODES SZA CLA TAD (NMODE-SMODE TAD (SMODE /ENTER NMODE OR MAYBE SMODE JMS I QOUTWRD CLL CML RAR TAD MODE /CHANGE THE SWITCH DCA MODE JMP I MODSET /AND RETURN XIDIV, FIDIV;AIDIV WPNT, -120;-116;-124;-50;0 / VARIABLE OR FUNCTION REFERENCE SCANNER PAGE GETNAM, 0 /LOOK FOR VARIABLE OR FUNCT REFNCE DCA TYPE /ZERO TYPE JMS I QLETTER /MUST START WITH LETTER JMP I GETNAM /NO NAME DCA NAME1 JMS I QDIGIT /<LETTER><DIGIT> ? JMP TRYFUN /NO, LOOK FOR FUN REF IAC /INCREMENT DIGIT LFDOLR, DCA NAME2 /STORE AS NAME2 JMS I QGETC /LOOK FOR $ (STRING) JMP GOTNAM+2/NOT THERE TAD (-44 SZA JMP NOSTRG /NO $ MEANS NO STRING CLL CML RAR /SET STRING BIT TAD TYPE DCA TYPE JMS I QGETC /LOOK FOR ( (ARRAY) JMP GOTNAM+2/NAME FINI TAD (-44 /PRIME THE CHAR NOSTRG, TAD (44-50 /LOOK FOR ( (ARRAY) SNA CLA CLL CML RTR /YES, SET ARRAY BIT SNA JMS I QBACK1 /NO, BACKUP 1 CHAR GOTNAM, TAD TYPE /MODIFY TYPE DCA TYPE ISZ GETNAM /BUMP RETURN JMP I GETNAM TRYFUN, JMS I QSAVECP /SAVE CHAR POSITION TAD NAME1 /MOVE FIRST CHAR OVER CLL RTL RTL RTL DCA NAME2 JMS I QLETTER /LOOK FOR SECOND LETTER JMP LFDOLR /NONE THERE, LOOK FOR $ TAD NAME2 /COMBINE WITH FIRST LETTER DCA NAME2 JMS I QLETTER /LOOK FOR THIRD LETTER JMP NOFNAM /NOT A FUNCTION NAME DCA NAME3 /PUT INTO NAME TAD NAME2 /IS IT A USER FUNCT ? TAD (-616 /FN SNA CLA JMP USRFUN /YES TAD (FUNS-1 /NO, CHECK VALIDITY OF NAME DCA X10 FUNSRC, TAD I X10 /GET NEXT FUN NAME SNA JMP NOFNAM /END OF LIST, INVALID NAME TAD NAME2 /COMPARE FIRST 2 CHARS SZA CLA JMP NOMATC /THEY DON'T MATCH TAD I X10 /COMPARE 3RD CHAR TAD NAME3 SZA CLA JMP NOMATC+1/DON'T MATCH TAD I X10 /GET FUNCTION CODE FUNOK, DCA SYMBOL /SAVE IT AS SYMBOL VALU TAD (1000 /SET FUNCTION BIT DCA TYPE JMP LFDOLR /LOOK FOR Q$] Q(] NOMATC, ISZ X10 /SKIP THIRD CHAR ISZ X10 /SKIP FUNCTION NUMBER JMP FUNSRC /KEEP LOOKING NOFNAM, JMS I QRESTCP /RESTORE CHAR POS JMP LFDOLR /LOOK FOR Q$] Q(] USRFUN, TAD NAME3 /GENERATE FUN NUMBER JMP FUNOK / ERROR MESSAGE REPORTER ERMSG, 0 /PRINT ERROR MESSAGE CLA CDF TAD I ERMSG /GET CODE CLL RTR /PRINT FIRST CHAR RTR RTR JMS TTY TAD I ERMSG /PRINT SECOND CHAR JMS TTY ISZ ERMSG /FIX RETURN ADDR TAD SPACE /PRINT SPACE JMS TTY DCA TTY /USE TTY AS A SWITCH TAD LINEH /PRINT HIGH ORDER JMS PSN TAD LINEL /THEN LOW ORDER JMS PSN /(LINE NUMBER NATCH !) TAD (215 /PRINT CARRIAGE RETURN JMS TTX TAD (212 /PRINT LINE FEED JMS TTX JMP I ERMSG /RETURN PSN, 0 /PRINT 3 DIGITS DECIMAL DCA WORD2 CLL CMA RTL /-3 DCA TEMP PRNTSN, TAD WORD2 /GET NEXT DIGIT CLL RTL /INTO THE LOW ORDER RTL /THREE BITS AND THE LINK DCA WORD2 /SAVE SHIFTED NUMBER TAD WORD2 /NOW DO LAST SHIFT RAL AND (17 /ONLY FOUR BITS SPACE, SZA JMP NOZERO /NOT A ZERO TAD TTY /ANY DIGITS YET ? SNA CLA JMP LEAD0 /NO, ITS A LEADING ZERO NOZERO, TAD (60 /MAKE IT ASCII JMS TTY /PRINT DIGIT LEAD0, ISZ TEMP /BUMP COUNT JMP PRNTSN /MORE DIGIT(S) JMP I PSN XMUL, FMPY;AFMPY / EXPONENT TABLE PAGE PETABL, 0004;2400;0000;0000 0007;3100;0000;0000 0016;2342;0000;0000 0033;2765;7020;0000 0066;2160;6744;6770 0153;2356;1326;6501 0325;3023;6017;5120 0652;2235;6443;7114 1523;2523;7565;7735 3245;3430;6320;2565 / OPERATOR TABLE OPR8RS, PLUS;-53 MINUS;-55 STAR;-52 SLASH;-57 UPAROW;-136 AMPSND;-46 0 SASIGN, 4000;XSTOR ASSIGN, 0;XSTOR / FUNCTION NAME TABLE (INTERNAL FUNCTIONS) FUNS, -0102;-23;FUNC3 -0123;-03;FUNC2 -0124;-16;FUNC1 -0310;-22;FUNC2+20 -0317;-23;FUNC1+20 -0401;-24;FUNC2+40 -0530;-20;FUNC1+40 -1116;-24;FUNC1+100 -1405;-16;FUNC2+60 -1417;-07;FUNC1+120 -2017;-23;FUNC2+100 -2216;-04;FUNC1+200 -2305;-07;FUNC2+120 -2307;-16;FUNC1+140 -2311;-16;FUNC1+160 -2321;-22;FUNC1+220 -2324;-22;FUNC2+140 -2601;-14;FUNC2+160 -2422;-03;FUNC2+220 ENDFNS, 0;0;FUNC4 /SPACE FOR NEW FUNCTIONS 0;0;FUNC4+20 0;0;FUNC4+40 0;0;FUNC4+60 0;0;FUNC4+100 0;0;FUNC4+120 0;0;FUNC4+140 0;0;FUNC4+160 0;0;FUNC4+200 0;0;FUNC4+220 0;0;FUNC4+240 0;0;FUNC4+260 0;0;FUNC4+300 0;0;FUNC4+320 0;0;FUNC4+340 0;0;FUNC4+360 /SIXTEEN OF THEM 0 / KEYWORD LIST KEYWRD, -114;-105;-124;LET -111;-106;-105;-116;-104;IFEND -111;-106;IF -106;-117;-122;FOR -116;-105;-130;-124;NEXTX WGOTO, -107;-117 WTO, -124;-117;GOTO -107;-117;-123;-125;-102;GOSUB -111;-116;-120;-125;-124;INPUT -120;-122;-111;-116;-124;PRINT -104;-111;-115;DIM -104;-101;-124;-101;DATA -104;-105;-106;DEF -106;-111;-114;-105;FILE -122;-105;-101;-104;READX -122;-105;-115;REMARK -122;-105;-123;-124;-117;-122;-105;RESTOR -122;-105;-124;-125;-122;-116;RETURN -123;-124;-117;-120;STOPX -122;-101;-116;-104;-117;-115;-111;-132;-105;RANDOM -103;-114;-117;-123;-105;CLOSE -103;-110;-101;-111;-116;CHAIN -125;-104;-105;-106;UDEF -125;-123;-105;USEX -105;-116;-104;END 0 / OS-8 OUTPUT ROUTINE OWTEMP, 0 OUPTR, OUBUF OCOUNT, -401 OUTWRD, 0 /OUTPUT ROUTINE DCA OWTEMP /SAVE WORD ISZ LOCTRL /INCREMENT PSEUDO CODE SKP /LOCATION COUNTER ISZ LOCTRH /BOTH HALVES NOP /IT'LL NEVER HAPPEN ISZ OCOUNT /TEST FOR BUFFER FULL JMP NOWRIT /STILL SOME ROOM JMS OUDUMP /DUMP THE BUFFER TAD OUBLOK-1/RESET BUFFER PARAMETERS DCA OUPTR TAD (-400 DCA OCOUNT NOWRIT, TAD OWTEMP /PUT WORD CDF 10 DCA I OUPTR /INTO BUFFER CDF ISZ OUPTR /MOVE POINTER JMP I OUTWRD OUDUMP, 0 /DUMP OUT BUFFER JMS I (7607 /CALL OUTPUT HANDLER 4210 OUBUF OUBLOK, 0 JMP OUERR ISZ OUBLOK /INCREMENT BLOCK NUMBER ISZ OUSIZE /CHECK FOR HOLE FULL JMP I OUDUMP OUERR, JMS I QERMSG /OUTPUT FILE ERROR 1706 JMP I XABORT /ABORT COMPILATION ODEVH, 0 OUSIZE, 0 AMPRTN, JMS LOD1ST /LOAD OP1$ AMPSND+2 /CONC OP2$ SCRTN, JMS LOD1ST /LOAD OP1$ SCOMPR+1 /COMP OP2$ LOD1ST, 0 /HANDLE ONE WAY INSTRUCTIONS JMS I QSAVAC /STORE 2ND ARG IF IN SAC -1 CLA CMA /GET TYPE OF 2ND ARG TAD OSTACK DCA TEMP CLL CML RTR /IS IT SUBSCRIPTED ? AND I TEMP SNA CLA JMP SKIP2 /NO, ENTRY IS ONLY 2 WORDS TAD I TEMP /GET NUMBER OF DIMS AND SCOMPR /LITERAL 3 CLL RAL /DOUBLE IT CIA SKIP2, TAD (-2 /FIND SIZE OF 2ND ARG DCA OP2SIZ /AND SAVE IT TAD OSTACK /BACK UP STACK TAD OP2SIZ DCA OSTACK TAD OSTACK /AND SAVE THIS ADDR DCA X12 JMS I QLOAD /LOAD ARG 1 CLL CML RAR /GET TYPE BIT AND TYPE1 /PUT BACK ARG1 TAD Q400 DCA I OSTACK DCA I OSTACK TAD I X12 /PUT BACK ARG 2 DCA I OSTACK ISZ OP2SIZ JMP .-3 TAD I LOD1ST /GET OPERATOR FINISH JMP OUTOPR+1/GO FINISH CODE OP2SIZ, 0 /SACRED COUNT WORD CHECKC, 0 /CHAR CHECKER JMS I QGETC /GET A CHARACTER JMP .+6 /FAILED TAD I CHECKC /COMPARE SNA ISZ CHECKC /MATCHES, SKIP TWO SZA CLA JMS I QBACK1 /NO MATCH, REPLACE ISZ CHECKC /ALWAYS SKIP AT LEAST 1 JMP I CHECKC SCOMPR, 3;SCRTN-3;4000;XSCOMP;XSCOMP / OS-8 FILE INPUT ROUTINE PAGE ICHAR, 0 /READ CHAR FROM INPUT FILE ISZ INJMP /BUMP THREE WAY UNPACK SWITCH ISZ INCHCT INJMPP, JMP INJMP TAD INEOF /LAST READ YEILD END OF FILE ? SZA CLA JMP ENDFIL /YES INGBUF, TAD INCTR /BUMP RECORD COUNTER CLL IAC SNL DCA INCTR /RESTORE IF IT HASN'T OVERFLOWED SZL ISZ INEOF /SET END OF FILE SWITCH JMS I INHNDL /DO THE READ 0200 /ONE BLOCK TO FIELD 0 INBUFP, INBUF INREC, 0 JMP INERR /HANDLER ERROR INBREC, ISZ INREC /BUMP RECORD NUMBER TAD (-601 /SET CHAR COUNT DCA INCHCT TAD INJMPP /RESET THREE WAY JUMP SWITCH DCA INJMP TAD INBUFP /RESET BUFFER POINTER DCA INPTR JMP ICHAR+1 /GO AGAIN INERR, SMA CLA JMP INBREC ENDFIL, JMS I QERMSG /INPUT FILE ERROR 1505 ABORT, TAD (4207 /RESTORE ^C LOCZTIONS DCA 7600 TAD (6213 DCA 7605 CDF 10 TAD INFO /GET START OF BASIC.SV CDF SNA JMP 7605 /T'WERE RUNNED DCA EDTBLK /SAVE MAGICAL BLOCK NUMBER JMS 7607 /USE SYS HANDLER EDTSIZ /TO READ IN THIS MUCH 0 /INTO ZERO EDTBLK, 0 /FROM HERE HLT /HALT IF BAD READ JMP EDTBGN /GO RESTART EDITOR INJMP, HLT /3 WAY CHAR UNPACK JUMP JMP ICHAR1 JMP ICHAR2 ICHAR3, TAD INJMPP /RESET JUMP SWITCH DCA INJMP TAD I INPTR AND (7400 /COMBINE THE HIGH ORDER BITS CLL RTR /OF THE TWO WORDS RTR TAD INTMP /TO FORM THE THIRD CHAR RTR RTR ISZ INPTR /BUMP WORD POINTER JMP ICHAR1+1/DO SOME COMMON STUFF ICHAR2, TAD I INPTR /SAVE THE HIGH ORDER BITS AND (7400 DCA INTMP /FOR THE THIRD CHAR ISZ INPTR /GO TO THE SECOND WORD ICHAR1, TAD I INPTR /GET THE LOW 7 BITS AND (177 /AND I MEAN ONLY 7 !! SNA /IGNOR LEADER-TRAILER JMP ICHAR+1 TAD (-134 /CHECK FOR \ (STMT SEPARATOR) SNA JMP I ICHAR /TREAT LIKE CR TAD (134-32 /IS IT ^Z (END OF FILE) SNA JMP ENDFIL /YES, ITS END OF FILE TAD (32-12 SNA JMP ICHAR+1 /IGNORE LINE FEEDS IAC /TABS -> BLANKS SNA TAD (40-11 TAD (11-15 SNA JMP I ICHAR /RETURN ON CARRIAGE RETURN IAC SNA JMP ICHAR+1 /IGNORE FORM FEEDS TAD (14 /FIX CHAR ISZ ICHAR JMP I ICHAR /RETURN TO THE CALLING WORLD INTMP, 0 INEOF, 0 INCHCT, -1 INHNDL, 0 /ENTRY ADDR GOES HERE INCTR, 0 INPTR, 0 CHKWD, 0 /WORD CHECKER TAD I CHKWD /GET POINTER ISZ CHKWD DCA CWTEMP /SAVE POINTER WDLOOP, TAD I CWTEMP /GET NEXT CHAR SMA ISZ CHKWD /IF NON NEG, FIX RETURN SPA CLA JMS I QGETC /GET CHAR JMP I CHKWD /RETURN TAD I CWTEMP /COMPARE ISZ CWTEMP /INCR POINTER SNA CLA JMP WDLOOP /MORE JMP I CHKWD /FAILED CWTEMP, 0 / INITIALIZATION CODE *LINE START, JMP RUNNED /DO LOOKUPS, AND FIND TEMPFILE CHAINED,CDF 10 TAD I (7644 /WAS IT A CHAIN FROM BRTS ? CDF AND (100 SNA CLA JMP CHEDIT /NO, FROM THE EDITOR CIF 10 /CHAIN FROM BRTS, RESET JMS I (200 /TO FORGET DSK: HANDLER 13 JMP STRT3 /NOW GO OPEN TEMP FILE CHEDIT, TAD (INFO+7 /PICK UP SOME STUFF DCA X10 CDF 10 /FROM THE INFO BLOCK TAD I X10 /START OF TEMP FILE SNA JMP I (RUNNED+4 /MUST BE CHAIN FROM CCL DCA BLOCK TAD I X10 /SIZE OF HOLE CDF DCA OUSIZE TAD BLOCK DCA OUBLOK CDF 10 TAD I X10 /ENTRY ADDR OF HANDLER CDF DCA INHNDL JMP STRT2 GETDEV, CDF 10 TAD 7617 /GET DEVICE NUM FOR INPUT FILE CDF CIF 10 JMS I (200 /GO FETCH THE DEVICE 1 INDEVH+1 /2 PAGE HANDLER IS OK JMP NG /ERROR TAD .-2 /GET HANDLER ADDRESS DCA INHNDL /SAVE IT CIF 10 JMS I (200 /RESET SYSTEM TABLES 13 /DELETING TENTATIVE FILES STRT2, CDF 10 TAD 7617 /SET UP INPUT FILE PARAMS CDF AND (7760 /GET SIZE TAD (17 CLL CML RTR RTR DCA INCTR CDF 10 TAD 7620 /GET BLOCK NUMBER CDF DCA INREC CDF 10 TAD INFO+3 /GET START OF BRTS.SV (+1) DCA BRTS TAD INFO /GET START OF BASIC.SV (+1) DCA ABORTX /BOTH FOR BLOAD TAD INFO+2 /GET START OF BLOAD.SV CDF DCA LDRBLK /FOR CHAIN TO BLOAD TLS /SET TTY FLAG ISZ WASTE JMP .-1 ISZ TIME JMP .-1 INITST, TAD (VARST-1/INITIALIZE ST AREA DCA X12 TAD (-436-436-436 DCA X11 /SIZE OF NUM AND STRING TABLES CDF 10 CLL CML RAR /SET TO 4000 DCA I X12 ISZ X11 JMP .-3 TAD (-440 /NOW ARRAY TABLES DCA X11 /AND BUCKETS DCA I X12 ISZ X11 /SET THEM TO ZERO JMP .-2 CDF TAD JABORT /MODIFY ^C LOCATIONS DCA 7600 TAD JABORT DCA 7605 JMP CORE /GET CORE SIZE NG, TLS JMS I QERMSG /SUPER ERROR 2331 TSF JMP .-1 JABORT, JMP I XABORT /ABORT COMPILATION WASTE, 0 TIME, 200 *INBUF CORE, TAD 7777 /MODIFIED CORE SIZE ROUTINE FROM AND (70 SNA JMP COR0 CLL RAR RTR IAC DCA CORSIZ JMP COREX /OS8 SOFTWARE SUPPORT MANUAL COR0, CDF TAD CORSIZ RTL RAL AND COR70 TAD COREX DCA .+1 COR1, CDF TAD I CORLOC COR2, NOP DCA COR1 TAD COR2 DCA I CORLOC COR70, 70 TAD I CORLOC CORX, 7400 TAD CORX TAD CORV SZA CLA JMP COREX TAD COR1 DCA I CORLOC ISZ CORSIZ JMP COR0 COREX, CDF CLA CMA /HI FIELD IS #FIELDS-1 TAD CORSIZ DCA HIFLD TAD HIFLD CIA DCA NFLDS CMA /HOW MANY FIELDS ? TAD HIFLD /MUST THIS BASIC USE ? SZA CLA /(SOUNDS LIKE A LINE BY DYLAN) JMP GENER TAD (PATCH1+3&177+5200 DCA PATCH1 /ONLY 8K, DON'T USE CDF'S TAD (PATCH2+11&177+5200 DCA PATCH2 TAD (PATCH3+4&177+5200 DCA PATCH3 TAD (PATCH4+3&177+5200 DCA PATCH4 TAD (7000 DCA PATCH5 GENER, JMS GENTMP /GENERATE TEMP 0 JMS GENTMP /GENERATE TEMP 1 JMS GENTMP /GENERATE TEMP 2 CLA IAC /GENERATE STRING TEMP 0 JMS GENTMP CLA IAC DCA WORD1 /GENERATE LITERAL 1.0 CLL CML RTR DCA WORD2 JMS I QLUKUP2 /ENTER INTO ST LITRL -3 JMS NEWVAR TAD (FNINIT /SET UP FUNCTIONS DCA FDPTR FDLOOP, TAD (WORD1-1 DCA X12 TAD I FDPTR /GET FIRST WORD ISZ FDPTR SNA JMP I QREMARK /DONE, START COMPILER DCA I X12 /SAVE IN WORD1 CLL CMA RTL /GET LOOKUP COUNT TAD I FDPTR DCA FUNSIZ TAD FUNSIZ /GET SIZE OF MOVE IAC DCA TEMP TAD I FDPTR /GET A WORD ISZ FDPTR DCA I X12 /PUT INTO WORDN ISZ TEMP JMP .-4 JMS I QLUKUP2 /ENTER INTO S.T. FUNCTN FUNSIZ, 0 JMP FDLOOP /LOOP FDPTR, 0 CORLOC, CORX CORV, 1400 CORSIZ, 1 NAMLST, BCOMPN /SAVE FILE NAME-POINTER LIST BLOADN BRTSN BAFN BSFN BFFN 0 PAGE FNINIT, FUNC3;-1;2000;0 /ABS FUNC1;-1;2000;0 /ATN FUNC2;-1;6000;0 /ASC FUNC1+20;-1;2000;0 /COS FUNC2+20;-1;2000;4000 /CHR FUNC1+40;-1;2000;0 /EXP FUNC2+40;-1;2000;4000 /DAT FUNC1+220;-1;2000;0 /SQR FUNC1+60;-2;0;2000;0 /EXP2 FUNC2+60;-1;6000;0 /LEN FUNC1+100;-1;2000;0 /INT FUNC2+100;-3;2000;4000;6000;0 /POS FUNC1+120;-1;2000;0 /LOG FUNC2+120;-3;0;2000;6000;4000 /SEG FUNC1+140;-1;2000;0 /SGN FUNC2+140;-1;2000;4000 /STR FUNC1+160;-1;2000;0 /SIN FUNC2+160;-1;6000;0 /VAL FUNC1+200;-1;2000;0 /RND FUNC2+220;-1;2000;0 /TRC 0 BASICN, FILENAME BASIC.SV /FILE NAMES BCOMPN, FILENAME BCOMP.SV /FOR LOOKUPS BLOADN, FILENAME BLOAD.SV BRTSN, FILENAME BRTS.SV BAFN, FILENAME BASIC.AF BSFN, FILENAME BASIC.SF BFFN, FILENAME BASIC.FF BUFN, FILENAME BASIC.UF TMPFIL, FILENAME BASIC.TM $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 | /1 OS8 BASIC LOADER, V5B / / / / / / // / / / / /COPYRIGHT (C) 1972, 1973, 1974, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /DEC-S8-LBASA-B-LA / /COPYRIGHT C 1972, 1973, 1974 / /DIGITAL EQUIPMENT CORPORATION /MAYNARD,MASSACHUSETTS 01754 / /AUGUST 19, 1972 / /HANK MAURER, 1972 /SHAWN SPILMAN, 1973 / / / / /ASSEMBLE AND LOAD AS FOLLOWS: / / .R PAL8 / *BLOAD,BLOAD<BLOAD.03 / .R ABSLDR / *BLOAD$ / .SA SYS BLOAD;7605 / /NOTE DIFFERENCES FROM VERSION 1 BY TRUNCATING /THE SOURCE AFTER TAG "IMAGE" AND THEN: / / .R SRCCOM / *LPT:<BLOAD.01,BLOAD.03 / * / /ALL CODE FOLLOWING TAG "IMAGE" IS NEW FOR VERSION 3 / VERSON= 5 /VERSION WORD LOCATED AT TAG "VERLOC" /LEFT HALF CONTAINS 60+VERSON /RIGHT HALF CONTAINS PATCH LEVEL (A=01) / /CORRECTIONS MADE FOR V4 J.K 1975 / .MADE SWAP ROUTINE A REAL SWAP / ./V FOR VERSION NUMBER / ./C SO NON-BASIC SAVE FILES CAN CHAIN TO BASIC SAVE FILES / .ADJUST JSW FOR /K / .CORRECTED CCB FOR /K / .CALCULATION OF DEFAULT CORE SIZE FOR PDP-8 / .TEST FOR BATCH RUNNIG / .CHANGE ORDER OF CISTRT SO A CHAIN CAN BE / CAN BE DONE FROM A .SV FILE WITH A / FILE STATEMENT / /JR 30-APR-77 UPDATE VERSION AND FIX ERROR IN MAKECI WHEN BATCH NOT / RUNNING /JR 9-MAY-78 ADD CODE TO HANDLE 2 PAGE SYSTEM HANDLERS (RL01) /OS8 BASIC COMPILER POST PROCESSOR /AUTO INDEX REGISTERS X10=10 X11=11 X13=13 STACK=15 /DUMMY SECTIONS FOR COMPILER/RUNTIME COMMUNICATIONS NOPUNCH /BRTS COMMUNICATIONS REGION *20 STCDF, 0 NSTADR, 0 NASTAD, 0 SSTADR, 0 SASTAD, 0 CODCDF, 0 CODBGN, 0 DATTOP, 0 DATPTR, 0 SWPINF, 0 /BCOMP COMMON REGION *40 VARCNT, 0 SVCNT, 0 ACNT, 0 SACNT, 0 LOCTRH, 0 LOCTRL, 0 BLOCK, 0 HIFLD, 0 BRTS, 0 DLSIZE, 0 ABORTX, 0 /PAGE 0 LOCATIONS USED BY LOADER FREEHI, 0 FREELO, 0 TEMP, 0 TEMP2, 0 TEMP3, 0 WORD1, 0 WORD2, 0 WORD3, 0 NCHARS, 0 SUBHI, 0 SUBLO, 0 CODSZ1, 0 CODSZ2, 0 LOCHI, 0 LOCLO, 0 CODB, 0 CODF, 0 ICOUNT, 0 OCOUNT, 0 AC1, 0 AC2, 0 AC3, 0 SC, 0 LINEH, 0 LINEL, 0 XLABEL, 0 CLRFLD, 0 CLREND, 0 RESADR, 0 /MORE COMPILER DEFINITIONS SVARST= 1036 ARAYST= 2132 SARYST= 2332 STEMPS= 2560 LITRL= STEMPS+2 SLITRL= LITRL+2 DATLST= SLITRL+2 /MISC DEFINES STACKA= 7120 /MAIN STACK OF COMPILER EDTBGN= 3212 /START OF EDITOR EDTSIZ= 2100 /SIZE OF EDITOR BRTBGN= 200 /START OF BRTS BRTSIZ= 3400 /SIZE OF BRTS DCB= 7760 JSW= 7746 /OS/8 JOB STATUS WORD BIPCCL= 7777 /OS/8 SOFTWARE CORE SIZE AND BATCH FLAGS WORD FSTOP1= 7 /ADDR OF BRTS EXIT ROUTINE ENPUNCH /END OF DUMMY SECTIONS AC7775= CLL STA RTL AC7776= CLL STA RAL /LOADER PROPER *400 LOADER, JMS I (IMAGE /CORE IMAGE FILE PATCH TAD (7577 /EXECUTION RESUMES HERE DCA FREELO CIA IAC DCA SWPINF /SET SWAPPER FLAG TO INDICATE 17600 IS IN FIELD 1 DCA LINEH /CLEAR LINE NUMBER DCA LINEL TAD STACK /ANY UNCLOSED FOR'S ? CIA TAD (STACKA-1 SNA CLA JMP .+3 /NO JMS I (ERMSG /YES 2506 CLA CMA TAD HIFLD /NO CDF'S IF ONLY 8K SZA CLA JMP NOPATCH /NO PATCHES TAD (PATLST-1 DCA X10 PATLUP, TAD I X10 SNA JMP I (STSTUF DCA TEMP TAD (SKP /ALWAYS TWO WORDS DCA I TEMP JMP PATLUP NOPATCH,AC7775 /TEST MAGIC LOCATION FOR A 3 TAD I (7612 SZA CLA /SKP IF 2 PAGE SYSTEM HANDLER GOTTD, JMP NOTD8E /NO TD/8E OR ROM TD/8E /PREV INSTR NOP'D OUT TO FORCE TD8E (IMAGE) TAD (7377 /TD8E SYS WASTES 400 WORDS DCA FREELO STL RAR /SET SWAP INFO (17600 OUT NOW) NOTD8E, DCA SWPINF JMS I (FREEF /GET CDF TO HIGHEST FIELD DCA SWPF1 /INTO 2 PLACES TAD SWPF1 DCA SWPF2 TAD SWPF2 /PASS NEW HANDLER FIELD BITS TO SWAPPER (2 PAGE HNDLR) JMS SWAP /MOVE OS8 OUT JMP I (STSTUF /DO SYMBOL TABLE STUFF SWAP, 0 /SWAP OS8 RESIDENT AND (70 /ISOLATE NEW FIELD BITS IN AC DCA AC2 /SAVE THEM CLL CML RAR /4000 AND SWPINF /IS IT A TD8E SYS ? SZA CLA JMP TD8ESYS /YES JMS SWPSUB /SWAP 17600 TO/FROM N7600 CDF 10 7600 JMP I SWAP TD8ESYS,JMS SWPSUB /SWAP 17600 TO/FROM N7400 CDF 10 7400 JMS SWPSUB /SWAP 27600 TO/FROM N7600 L6221, CDF 20 L7600, 7600 TDLIE, AC7775 /TEST FOR GENUINE 2 PAGE HANDLER TAD I (7612 SZA CLA JMP I SWAP /RETURN IF NO TAD (7635 /SET POINTER INTO HANDLER DCA AC1 PATLP, TAD I AC1 /RANGE CHECK WORD FOR CDF 20-70 TAD (-6300 CLL TAD (70 SNL CLA /SKP IF CDF N0 JMP NOPAT /ELSE SKP ADJUSTMENT TAD I AC1 /GET INSTRUCTION AND (7707 /CLEAR FIELD BITS TAD AC2 /INSERT NEW ONES DCA I AC1 /STORE BACK NOPAT, ISZ AC1 /BUMP PTR JMP PATLP /LOOP JMP I SWAP SWPSUB, 0 /SWAPPER TAD I SWPSUB /GET FIELD DCA SWP1 /TWICE TAD SWP1 DCA SWP2 /ONCE FOR EACH DIRECTION ISZ SWPSUB TAD I SWPSUB /GET HI FIELD ADDR DCA TEMP ISZ SWPSUB TAD L7600 /GET COUNT/POITER DCA TEMP2 SWP1, HLT TAD I TEMP2 /GET PART OF RESIDENT DCA TEMP3 SWPF1, JMP SWPRET /RETURN IF 8K ONLY TAD I TEMP SWP2, HLT DCA I TEMP2 TAD TEMP3 SWPF2, HLT DCA I TEMP /INTO HI FIELD ISZ TEMP /BUMP POINTER NOP /JR PROTECT AGAINST WRAP AROUND ISZ TEMP2 /AND PTR/CTR JMP SWP1 /LOOP SWPRET, CDF JMP I SWPSUB PAGE MAXSIZ= 120 /DEFINE MAXIMUM SIZE STRING NODATA, CDF JMS I (FREEF /SAVE FIELD CIA DCA CLRFLD /FOR ARRAY CLEARING TAD FREELO /SAVE THIS ADDR CIA DCA CLREND /FOR END OF ARRAY CLEAR ISZ FREELO /MAKE IT NEXT FREE + 1 TAD (SVARST-1 DCA X10 /ALLOCATE STRING VARS TAD (-436 DCA TEMP ASVLUP, CDF 10 TAD I X10 /LOOK FOR DEFINED STRING VAR DCA TEMP2 /SAVE SYMBOL NUMBER TAD I X10 /GET SIZE SPA TAD (4010 /IF UNDEF USE 16 CHARS DCA TEMP3 TAD TEMP2 /IS IT DEFINED ? CDF SMA CLA JMS SVSTOR /YES, CREATE ENTRY ISZ TEMP /BUMP COUNT JMP ASVLUP /LOOP CDF 10 /ALLOCATE STRING TEMPS P6, TAD I (STEMPS+1 DCA STEMPF /INIT FIELD TAD I (STEMPS /AND POINTER SKP STMLUP, TAD TEMP /LOOK AT NEXT ENTRY SNA JMP I (ALLOCA /DONE GO ALLOCATE ARRAYS TAD (-1 DCA X10 /GET POINTER STEMPF, CDF 10 TAD I X10 /GET ADDR OF NEXT ENTRY DCA TEMP /SAVE IT P7, TAD I X10 /AND ITS FIELD DCA STEMPF ISZ X10 /SKIP TEMP NUMBER TAD I X10 /GET SYM NUMBER DCA TEMP2 CDF TAD (MAXSIZ /GIVE IT MAX SIZE DCA TEMP3 JMS SVSTOR /ALOOCATE IT JMP STMLUP /LOOP SVSTOR, 0 /MAKE ST ENTRY FOR STRING VAR TAD TEMP2 /FIND ST ADDR CLL RAL TAD TEMP2 TAD SSTADR DCA X11 TAD TEMP3 /NUMBER OF CHARS TAD (3 CLL RAR DCA SUBLO /NUMBER OF WORDS DCA SUBHI JMS SUB /FREEHI,LO=FREEHI,LO-SUBHI,LO TAD FREELO /SAVE ADDR DCA I X11 JMS I (FREEF /AND FIELD DCA I X11 TAD TEMP3 /PUT IN MAX LENGTH CIA /(NEGATIVE) DCA I X11 JMP I SVSTOR PSN, 0 /PRINT 3 DIGITS DECIMAL DCA WORD2 CLL CMA RTL /-3 DCA XLABEL PRNTSN, TAD WORD2 /GET NEXT DIGIT CLL RTL /INTO THE LOW ORDER RTL /THREE BITS AND THE LINK DCA WORD2 /SAVE SHIFTED NUMBER TAD WORD2 /NOW DO LAST SHIFT RAL AND (17 /ONLY FOUR BITS SPACE, SZA JMP NOZERO /NOT A ZERO TAD I (TTY /ANY DIGITS YET ? SNA CLA JMP LEAD0 /NO, ITS A LEADING ZERO NOZERO, TAD (60 /MAKE IT ASCII JMS I (TTY /PRINT DIGIT LEAD0, ISZ XLABEL /BUMP COUNT JMP PRNTSN /MORE DIGIT(S) JMP I PSN SUB, 0 /DOUBLE SUBTRACT TAD SUBLO /SUBTRACT LOWER CLL CML CIA TAD FREELO DCA FREELO RAL /GET BORROW TAD SUBHI CIA TAD FREEHI /SUBTRACT UPPER DCA FREEHI /SAVE NEW UPPER TAD FREEHI /DID IT FIT ? SMA SZA CLA JMP I SUB /YUP TOOBIG, DCA LINEH /CLEAR LINE NUMBER DCA LINEL JMS I (ERMSG /WRITE MESSAGE 2402 /TOO BIG JMP I (ABORTL /ABORT RUN TTX, 0 /PRINT CHAR ON TTY TSF /WAIT FOR PREVIOUS CHAR JMP .-1 TLS /PRINT THIS ONE CLA JMP I TTX PAGE / CAUTION !!! / THIS PAGE AND THE NEXT ONE ARE / OVERLAYED BY THE INPUT BUFFER / AS SOON AS THE ROUTINE "INWORD" / IS CALLED. THIS FIRST HAPPENS / AFTER THE TAG "RELCIT" . STSTUF, TAD FREELO /SAVE START OF RESIDENT -1 CIA /NEGATED DCA RESADR /USED TO COMPUTE AMOUNT OF MOVE TAD VARCNT /GET NUMBER OF TAD (401 /VARIABLES CIA DCA VARCNT TAD SVCNT /STRING VARIABLES TAD (401 CIA DCA SVCNT TAD ACNT /ARRAYS TAD (41 CIA DCA ACNT TAD SACNT /AND STRING ARRAYS TAD (41 CIA DCA SACNT JMS I (FREEF /SAVE HIGH FIELD DCA STCDF TAD VARCNT /SUBTRACT SPACE FOR CLL RAL /SCALAR TABLE (3 WORDS A PIECE) TAD VARCNT TAD FREELO /DON'T BOTHER WITH A DCA FREELO /DOUBLE PREC. SUBTRACTION TAD FREELO /SAVE START OF SCALAR TABLE IAC /FOR INTERPRETER DCA NSTADR TAD FREELO /CLEAR ALL VARIABLES DCA X10 /IN THE DCA I X10 /SCALAR TABLE DCA I X10 DCA I X10 ISZ VARCNT JMP .-4 /JUST TO BE NICE CDF 10 /PREPARE TO MOVE P1, TAD I (LITRL+1/THE NUMERIC LITERALS DCA LFLD /INTO THE SCALAR TABLE TAD I (LITRL CDF SKP NLLOOP, TAD TEMP /ADDR OF NEXT LITERAL SNA JMP NONL /NO MORE NUMERIC LITERALS TAD (-1 DCA X10 LFLD, CDF 10 TAD I X10 /GET ADDR OF NEXT LITERAL DCA TEMP P2, TAD I X10 /ALSO ITS FIELD DCA LFLD TAD I X10 /NOW ITS VALUE DCA WORD1 TAD I X10 DCA WORD2 TAD I X10 DCA WORD3 TAD I X10 /NOW THE SYMBOL NUMBER DCA TEMP2 TAD TEMP2 /TIMES THREE CLL RAL TAD TEMP2 TAD FREELO /PLUS START DCA X11 /GIVES STORE ADDR CDF TAD WORD1 /NOW PUT LITERAL INTO TABLE DCA I X11 TAD WORD2 DCA I X11 TAD WORD3 DCA I X11 JMP NLLOOP /DO NEXT LITERAL NONL, TAD ACNT /ALLOCATE ARRAY TABLE CLL RAL CLL RAL /FOUR WORDS PER TAD FREELO /SUBTRACT FROM LOWER END DCA FREELO TAD FREELO /SAVE THIS DCA NASTAD /START OF ARRAY TABLE TAD SVCNT /ALLOCATE CLL RAL /STRING VAR TABLE TAD SVCNT TAD FREELO /3 WORDS EACH DCA FREELO TAD FREELO /AND SAVE IT FOR THE INT DCA SSTADR TAD SACNT /NOW SPACE FOR STRING CLL RAL /ARRAY CLL RAL TAD FREELO /TABLE DCA FREELO TAD FREELO /SAVE FOR INT DCA SASTAD CDF 10 /PREPARE TO MOVE P3, TAD I (SLITRL+1 DCA SLFLD /STRING LITERALS TAD I (SLITRL CDF SKP SLLOOP, TAD TEMP /IS NEXT LIT THERE ? SNA JMP I (NOSL /NO, END OF THE LINE TAD (-1 DCA X10 JMS SFLD /SET THE FIELD TAD I X10 /GET ADDR OF NEXT DCA TEMP P4, TAD I X10 /ALSO FIELD DCA TEMP2 TAD I X10 /THEN CHAR COUNT DCA NCHARS JMP I (SLIT2 /DO REST OF STRING LIT SFLD, 0 SLFLD, CDF 10 JMP I SFLD PAGE SLIT2, TAD NCHARS /COMPUTE WORD COUNT TAD (3 CLL RAR TAD X10 /TO GET ADDR OF SYMBOL NUMBER DCA TEMP3 TAD I TEMP3 CLL RAL /SYM NUMBER TIMES 3 TAD I TEMP3 TAD SSTADR /PLUS BASE DCA X11 /GIVES ST ADDR TAD NCHARS /ALLOCATE SPACE FOR IT IAC CLL CML CMA RAR DCA TEMP3 /(SAVE NUMBER OF WORDS) TAD TEMP3 CLL TAD FREELO DCA FREELO /BELOW THE SYMBOL TABLES SNL JMP TMSLIT /TOO MUCH STRING LITERALS TAD FREELO TAD (-END-10 SZL CLA JMP TMSLIT /DITTO TAD FREELO /STICK THE ADDR IAC CDF DCA I X11 /INTO THE ST ENTRY JMS I (FREEF /ALSO THE FIELD DCA I X11 TAD NCHARS /ALSO THE SIZE CIA DCA I X11 TAD FREELO /THIS IS WHERE IT GOES DCA X11 TAD NCHARS /PUT IN THE LENGTH TOO CIA /(NEGATIVE) JMP .+4 MOVSL, JMS I (SFLD TAD I X10 CDF DCA I X11 /MOVE THE LITERAL TEXT ISZ TEMP3 JMP MOVSL P5, TAD TEMP2 /PUT THE FIELD OF THE NEXT DCA I (SLFLD /ENTRY WHERE IT DOES THE MOST GOOD JMP I (SLLOOP /DO THE NEXT LITERAL NOSL, TAD FREELO /SAVE TOP OF DATA LIST DCA DATTOP TAD DATTOP /IF EMPTY MAKE TOP=BOTTOM DCA DATPTR TAD DLSIZE SNA /IS ANY DATA ? JMP I (NODATA /NO CLL TAD FREELO /GET START OF DATA DCA FREELO SNL JMP TMDATA /TOO MUCH DATA TAD FREELO TAD (-END-10 SZL CLA JMP TMDATA /DITTO TAD FREELO /SAVE IT DCA DATPTR TAD FREELO /USE X13 TO FILL LIST DCA X13 TAD (DATLST-1 DCA X10 CDF 10 DATLUP, TAD I X10 /ANY MORE DATA ELEMENTS ? SNA JMP I (NODATA DCA TEMP /SAVE ADDR P8, TAD I X10 /GET NEW FIELD DCA DATAF1 P9, TAD DATAF1 /TWICE DCA DATAF2 TAD TEMP /START WITH NEW ELEMENT DCA X10 DATAF1, CDF 10 TAD I TEMP /GET COUNT DCA TEMP DATMOV, TAD I X10 /GET NEXT WORD CDF DCA I X13 /MOVE INTO DATA AREA DATAF2, CDF 10 ISZ TEMP JMP DATMOV JMP DATLUP /DO NEXT ELEMENT TMDATA, DCA LINEL /ZERO LINE NUMBER DCA LINEH JMS I (ERMSG /PRINT ERROR MESSAGE 2404 JMP I (ABORTL TMSLIT, DCA LINEH /CLEAR THE LINE NUMBER DCA LINEL JMS I (ERMSG /PRINT MESSAGE 2423 JMP I (ABORTL PATLST, P1;P2;P3;P4;P5;P6;P7;P8;P9;0 PAGE ALLOCA, TAD ACNT /ANY ARRAYS ? SNA CLA JMP ALLOCS /NO TAD (ARAYST /ALLOCATE ARRAYS DCA X10 TAD NASTAD DCA X11 DOARAY, CDF 10 TAD I X10 /GET NEXT ARRAY DCA TEMP TAD I X10 /GET FIRST DIM SNA TAD (12 /USE 10 IF NONE IAC /ALLOCATE 0TH ELEMENT DCA TEMP2 TAD I X10 /GET SECOND DIM SNA TAD (12 IAC DCA TEMP3 TAD TEMP3 /GET READY TO SUBTRACT DCA SUBLO DCA SUBHI CDF CLL CML RTR AND TEMP /HOW MANY DIMS ? SNA CLA JMP ONLY1 /ONE TAD TEMP2 /PRODUCT OF DIMS JMS I (MUL12 JMP TIMES3 /MULT BY 3 ONLY1, DCA TEMP3 /ZERO SECOND DIMENSION TAD TEMP2 DCA SUBLO TIMES3, TAD (3 /MULT SIZE BY 3 JMS I (MUL12 JMS I (SUB /SUBTRACT FROM FREE TAD FREELO DCA I X11 /SAVE ADDR IN S.T. JMS I (FREEF DCA I X11 TAD TEMP2 /ALSO DIMS DCA I X11 TAD TEMP3 DCA I X11 ISZ X10 /SKIP SYMBOL NUMBER ISZ ACNT JMP DOARAY ALLOCS, TAD SACNT /ANY STRING ARRAYS SNA CLA JMP I (RELCIT /NO TAD (SARYST+1 DCA X10 /ALLOCATE STRING ARRAYS TAD SASTAD DCA X11 DOSARY, CDF 10 TAD I X10 SNA TAD (12 /USE 10 FOR DIM IAC DCA TEMP3 TAD I X10 /GET DIM SNA TAD (10 /USE 16 IF NO SIZE SPEC DCA TEMP2 TAD TEMP3 DCA SUBLO /PREPARE FOR MULT DCA SUBHI CDF TAD TEMP2 /GET NUM WORDS PER STRING TAD (3 CLL RAR JMS I (MUL12 /GET ARRAY SIZE JMS I (SUB /DO SUBTRACTION TAD FREELO /SAVE ADDR DCA I X11 JMS I (FREEF DCA I X11 TAD TEMP2 /AND STRING SIZE CIA /(SIZES ARE NEG) DCA I X11 TAD TEMP3 /AND NUMBER OF STRINGS DCA I X11 ISZ X10 /SKIP NEXT NAME ISZ X10 /AND NEXT SYM NUMBER ISZ SACNT JMP DOSARY JMP I (RELCIT INWORD, 0 /READ FROM CODE FILE ISZ ICOUNT /ANYTHING IN BUFFER JMP NOREAD /YASSUH! JMS I (7607 /READ NEXT BLOCK 200 1000 /NOTE: THIS OVERLAYS USED CODE INBLOK, 0 JMP I (IOERR ISZ INBLOK /BUMP BLOCK COUNTER TAD INBLOK-1/RESET BUFFER POINTER DCA INPTR TAD (-400 /AND COUNTER DCA ICOUNT NOREAD, TAD I INPTR /GET WORD ISZ INPTR /BUMP POINTER JMP I INWORD INPTR, 0 CIPAT, 0 /PATCH TO MAKECI TAD (1000 DCA I (JSW /CHANGE JSW COPT, DCA I (CISTRT+1 /& TAKE CARE OF /C JMP I CIPAT PAGE RELCIT, TAD LOCTRL /FIND START OF CODE CLL IAC DCA SUBLO /BY SUBTRACTING RAL TAD LOCTRH /AMOUNT FROM FREE DCA SUBHI JMS I (SUB TAD FREELO /THIS IS THE START OF THE CODE DCA CODBGN /MINUS ONE TAD FREEHI /THIS IS THE FIELD NUMBER DCA CODCDF TAD LOCTRL /SET UP PROG SIZE COUNT CLL CML CIA DCA CODSZ1 /LOWER COUNT RAL TAD LOCTRH CIA DCA CODSZ2 /UPPER COUNT TAD BLOCK /SET UP FOR READ AND WRITE DCA I (OUBLOK TAD BLOCK DCA I (INBLOK TAD (-401 DCA OCOUNT CLA CMA DCA ICOUNT RELOOP, JMS I (INWORD /GET A WORD OF CODE DCA TEMP TAD (3000 TAD TEMP /CHECK FOR OPCODE 5000 (GOTO) AND (7000 SZA CLA JMP NORELC /NO JUMP TAD TEMP /REMOVE FIELD BITS AND (340 CLL RTR TAD CDF0 DCA LBLFLD /FIELD OF LABEL ENTRY TAD TEMP /ZERO FIELD BITS AND (7437 DCA TEMP JMS I (INWORD /GET REST OF ADDR DCA TEMP2 JMS I (CHKLBL /CHECK FOR UNDEFINED LABEL LBLFLD, HLT TAD I TEMP2 AND (7 /GET ADDR TO BE RELOCATED DCA LOCHI ISZ TEMP2 TAD I TEMP2 CLL TAD CODBGN /ADD BASE ADDR CDF0, CDF DCA LOCLO /SAVE LOW PART OF JUMP RAL TAD CODCDF /GET HIGH PART TAD LOCHI CLL RTL /PUT IT INTO CORRECT PLACE RTL RAL TAD TEMP /PLUS INSTRUCTION JMS I (OUTWRD ISZ CODSZ1 /BUMP COUNTER SKP ISZ CODSZ2 /CAN'T BE LAST WORD TAD LOCLO /OUTPUT LOW ORDER ADDR SKP NORELC, TAD TEMP /JUST OUTPUT IT RELOUT, JMS I (OUTWRD ISZ CODSZ1 /DOUBLE WORD ISZ BUMP JMP RELOOP ISZ CODSZ2 JMP RELOOP JMP I (LOADIT /DONE RELOCATING, GO LOAD /PRINT ERROR MESSAGE ERMSG, 0 /PRINT ERROR MESSAGE CDF TAD I ERMSG /GET CODE CLL RTR /PRINT FIRST CHAR RTR RTR JMS TTY TAD I ERMSG /PRINT SECOND CHAR JMS TTY ISZ ERMSG /FIX RETURN ADDR TAD (240 /PRINT SPACE JMS TTY DCA TTY /USE TTY AS A SWITCH TAD LINEH /PRINT HIGH ORDER JMS I (PSN TAD LINEL /THEN LOW ORDER JMS I (PSN /(LINE NUMBER NATCH !) TAD (215 /PRINT CARRIAGE RETURN JMS I (TTX TAD (212 /PRINT LINE FEED JMS I (TTX JMP I ERMSG /RETURN TTY, 0 /CONVERT TO ASCII AND PRINT TAD (240 AND (77 TAD (240 JMS I (TTX /PRINT CHAR JMP I TTY /RETURN PAGE LOADIT, JMS I (OUDUMP /DUMP LAST BLOCK TAD LOCTRL /SET UP COUNTER CIA CLL CML DCA CODSZ1 RAL TAD LOCTRH CIA DCA CODSZ2 TAD CODBGN DCA TEMP /CODE BEGIN -1 TAD BLOCK /SET UP BLOCK NUMBER DCA I (INBLOK CLA CMA DCA ICOUNT TAD CODCDF /SET UP CODE CDF CLL RTL RAL TAD (6201 DCA CODCDF TAD CODCDF DCA CF LODLUP, ISZ TEMP /BUMP POINTER JMP NOFJMP /FIELD IS OK TAD CF /BUMP THE FIELD TAD (10 DCA CF NOFJMP, JMS I (INWORD /GET NEXT WORD CF, HLT DCA I TEMP /SAVE THE WORD CDFZER, CDF ISZ CODSZ1 /MORE CODE ? JMP LODLUP /YES ISZ CODSZ2 JMP LODLUP /YES TAD CF /GET THE FIELD DCA CLEARF /AND SAVE IT CLRLUP, TAD CLREND /IS THIS THE END OF CLEAR ? TAD TEMP SZA CLA JMP MORCLR /NO, KEEP GOING TAD CLRFLD /DO FIELDS MATCH ? TAD CLEARF SNA CLA JMP DONCLR /YES, ARRAYS ARE CLEARED MORCLR, ISZ TEMP /BUMP POINTER JMP CLEARF /DON'T BUMP FIELD TAD CLEARF /DO BUMP FIELD TAD (10 DCA CLEARF CLEARF, HLT DCA I TEMP /CLEAR THE WORD JMP CLRLUP /DO MORE DONCLR, TAD CLEARF /COPY THE FIELD DCA STFLDM TAD TEMP /GET THE COUNT TAD RESADR /OF HOW MUCH SYMBOL TABLE DCA TEMP2 /TO MOVE TAD TEMP /PUT IT INTO AUTO XR'S DCA X13 TAD X13 DCA X11 MOVSTL, CDF TAD I X11 /GET NEXT WORD OF ST STFLDM, HLT DCA I X13 /STORE IT ISZ TEMP2 JMP MOVSTL JMS MOVFIN /MOVE FINI PAGE INTO 7000-7177 JMP I (7000 /GO READ BRTS.SV CHKLBL, 0 /CHECK LABEL FOR UNDEF TAD I CHKLBL /GET FIELD DCA .+1 HLT TAD I TEMP2 /GET FIRST WORD OF LABEL SPA CLA JMP I CHKLBL /SIGN BIT IS DEFINED CLL CMA RAL /GET ADDR OF LINE NUM TAD TEMP2 DCA XLABEL TAD I XLABEL /GET HIGH ORDER LINE DCA LINEH ISZ XLABEL TAD I XLABEL /GET LOW ORDER DCA LINEL CDF JMS I (ERMSG /PRINT MESSAGE 2523 JMP I CHKLBL /RETURN FREEF, 0 /MAKE A CDF FROM FREEHI TAD FREEHI CLL RTL RAL TAD CDFZER JMP I FREEF ABORTL, JMS MOVFIN /PUT FINI PAGE INTO 7000-7177 /AND ABORT THE RUN JMP I (ABORT-FINI+7000 MOVFIN, 0 /FINI PAGE MOVER CDF TAD (FINI-1 /MOVE INT READING CODE DCA X10 TAD (6777 /INTO 7000 DCA X11 TAD (-200 DCA TEMP /PUT CORRECT COUNT HERE TAD I X10 DCA I X11 /MOVE CODE ISZ TEMP JMP .-3 JMP I MOVFIN PAGE FINI, TAD I XERMSG /ANY ERRORS ? SZA CLA JMP ABORT /YES, DON'T RUN IT TAD XINT /MOVE INT STUFF DCA FTEMP TAD M12 /10 KEY LOCATIONS DCA FCNT TAD XSAVE /INTO A SAFE PLACE DCA FTEMP2 TAD I FTEMP ISZ FTEMP DCA I FTEMP2 ISZ FTEMP2 ISZ FCNT JMP .-5 /MOVE LOOP TAD BRTS /READ IN BRTS DCA BRTSB JMS I X7607 BRTSIZ 0 BRTSB, 0 JMP IOERR TAD XSAVE DCA FTEMP TAD XINT /MOVE STUFF BACK DCA FTEMP2 TAD I FTEMP ISZ FTEMP DCA I FTEMP2 ISZ FTEMP2 ISZ M12 JMP .-5 TAD (JMP I FSTOP1 /PATCH ^C LOCATIONS DCA I (7600 TAD (JMP I FSTOP1 DCA I (7605 JMP I (BRTBGN /GO START BRTS M12, -12 XINT, 20 XERMSG, ERMSG X7607, 7607 XSAVE, 7001+XSAVE-FINI MUL12, 0 /MULTIPLY 12BITS AND 24 BITS DCA AC3 /SAVE 12 BIT THING DCA AC2 /CLEAR REST OF AC DCA AC1 TAD (-15 /ONLY TEST 12 BITS DCA SC JMP MULBGN MULLUP, SNL /WAS BIT ON ? JMP NOADD /NO, DON'T ADD TAD SUBLO /ADD TO HIGH ORDER 2/3'S OF AC TAD AC2 DCA AC2 CML RAL TAD SUBHI NOADD, TAD AC1 /SHIFT AC RIGHT CLL RAR DCA AC1 TAD AC2 RAR DCA AC2 MULBGN, TAD AC3 FTEMP, RAR FTEMP2, DCA AC3 FCNT, ISZ SC /BUMP SHIFT COUNTER JMP MULLUP TAD AC2 /ANSWER IS LOWER 2/3'S OF AC DCA SUBHI TAD AC3 DCA SUBLO JMP I MUL12 IOERR, DCA LINEL /ZERO LINE NUMBER JMS I XERMSG /PRINT MESSAGE 1117 ABORT, TAD (20 /PASS NORMAL FIELD BITS TO RESTORE ANY 2 PAGE SYS: JMS I (SWAP /SWAP OS8 BACK JMS I (200 /CHECK OUT W/ CI BUILDER TAD (4207 /RESTORE ^C LOCATIONS DCA I (7600 TAD (6213 DCA I (7605 TAD ABORTX /CALLED VIA CHAIN ?(FROM EDIT) SNA JMP I (7600 /NO, RETURN TO OS8 DCA EDTBLK /YES, SAVE EDITOR START JMS I X7607 /READ IN EDITOR EDTSIZ /THIS MUCH 0 OWTEMP, EDTBLK, 0 JMP I (7605 /ERROR JMP I (EDTBGN /GO START EDITOR OUTWRD, 0 /OUTPUT WORD TO TEMP FILE ISZ OCOUNT /ANY ROOM ? JMP NOWRIT /YES DCA OWTEMP /SAVE WORD JMS OUDUMP /WRITE BLOCK ISZ OUBLOK /BUMP BLOCK NUMBER TAD OUBLOK-1/RESET BUFFET POINTER DCA OUPTR TAD (-400 DCA OCOUNT /AND COUNT TAD OWTEMP /RESTORE AC NOWRIT, CDF 10 DCA I OUPTR /INTO BUFFER CDF ISZ OUPTR JMP I OUTWRD OUPTR, 0 OUDUMP, 0 /WRITE BLOCK JMS I X7607 /WRITE BLOCK 4210 0 OUBLOK, 0 JMP IOERR JMP I OUDUMP END=FINI+200 PAGE BLDCI=200 /PAGE INTO WHICH MAKECI GETS MOVED LOADBL=357 /LOC WHERE BCOMP LEAVES BLOAD BLOCK # IMAGE, 0 TAD I (LOADBL /COME HERE TO CREATE CORE IMAGE TAD (6 /ALREADY HAVE THIS MUCH DCA I (LDRBLK /INIT BLOAD OVRLY READER CDF 10 TAD I (7644 /TEST FOR /V CDF AND (4 SZA CLA JMS I (VERNUM CDF 10 TAD I (7643 /GET OPTION BITS CDF DCA TEMP TAD TEMP RTR SNL CLA /HAVE K OPTION? JMP LSTART /NO: START LOADER TAD TEMP RTL SZL CLA /HAVE B OPTION? DCA I (FLGRTS /YES: FLAG IT TAD TEMP /TEST FOR /C RTL SPA CLA JMP .+3 TAD (NOP DCA I (COPT CDF 10 TAD I (7646 /GET =N CDF AND (7 /WIPE ALT MODE SNA CLL CML RTL /DEFAULT=12K FOR NOW DCA TEMP CLL CMA TAD TEMP /MUST BE >1 HERE SNA CLA ISZ TEMP TAD TEMP CLL CMA TAD HIFLD SNL CLA /WHICH HAS MORE CORE? JMP .+3 /TARGET MACHINE: TOUGH TAD TEMP /HOST MACHINE DCA HIFLD /FAKE OUT LOADER TAD HIFLD CIA DCA I (FLDCNT /INIT CI BUILDER TAD I (FLDCNT DCA I (MYCORE /AND CI STARTER CDF 10 DCA I (7646 /CLEAR =N BITS DCA I (7643 /AND EARLY OPTIONS TAD I (7644 /GET OPTION BITS CDF RTL SZL CLA /HAVE N SWITCH? JMP NOTDSY /NEVER SEES TD8E SYSTEM TAD HIFLD CLL RAR SNA CLA /HAVE OVER 8K CORE? JMP NOTDSY TAD (NOP DCA I (GOTTD /YES: FORCE SYS=TD8E CLA IAC NOTDSY, DCA I (TDFLAG /NOT 0 MEANS HAVE TD8E CMA DCA I (ERMSG /FORCE LOAD ABORT LSTART, TAD (BLDCI-1 /MOVE CI BUILDER DCA X10 /INTO LOW CORE TAD (MAKECI-1 DCA X11 TAD I X11 DCA I X10 ISZ ICTR JMP .-3 TAD HIFLD /START OF BLOAD V1 DCA FREEHI JMP I IMAGE /RETURN TO LOADER ICTR, -200 CCLIST, 0 /1ST 4 WORDS OF CCB 6203 CISTRT 1000 /JOB STATUS WORD PAGE CCB=1000 /LOC TO START BUILDING CCB MAKECI, 0 /THIS PAGE GETS MOVED! TSF JMP .-1 /SEE TAG "ABORT" IN BLOAD V1 ISZ I (ERMSG /WHY ARE WE HERE? JMP BOSFIX /GENUINE ABORTION TAD (CCB-1 DCA X10 TAD (CCLIST-1 DCA X11 TAD I X11 /1ST FOUR WORDS OF CCB DCA I X10 ISZ MKCCNT JMP .-3 CCSEGS, TAD FLDCNT CLL CIA RAL RTL /THIS FIELD DCA TEMP TAD (70 AND CODCDF /LOWEST FIELD USED CLL CIA TAD TEMP SNL /THIS FIELD USED? JMP NOCODE /NO: BYPASS IT SZA CLA /IS IT FULL? JMP ALLCODE /YES TAD CODBGN /PROBABLY NOT AND (7400 DCA TEMP2 TAD TEMP2 CIA CLL RAR TAD TEMP DCA TEMP TAD TEMP2 ALLCODE,DCA I X10 TAD FLDCNT IAC TAD TDFLAG SMA CLA /NEED TOP PAGE? TAD (3700 /NO: 37 PAGES TAD TEMP /YES: 40 PAGES AND K3777 DCA I X10 ISZ I (CCB NOCODE, CLA CLL ISZ FLDCNT /NEXT FIELD ZERO? JMP CCSEGS /NO: LOOP TAD FLGRTS SZA CLA /NEED BRTS? TAD (CISTRT DCA I X10 TAD FLGRTS SZA CLA TAD (300-3700 TAD (3700 DCA I X10 TAD I (CCB CMA DCA I (CCB /NEGATE SEG COUNT JMS I (7607 /READ CI STARTER 300 /FROM END OF BLOAD.SV CISTRT /INTO HI CORE LDRBLK, 0 /INIT BY "IMAGE" BOSPT1, 7600 /CAN'T GET THIS ERROR JMS I JCIP TAD TDFLAG /PASS TD8E FLAG DCA I (FLAGTD TAD FLGRTS DCA I (RTSFLG /AND BRTS FLAG TAD MYCORE DCA I (NOCORE /AND CORE LIMIT TAD (17 /SAVE 10 KEY LOCATIONS DCA X10 TAD (KEYLOC-1 DCA X11 TAD I X10 DCA I X11 ISZ MCICNT JMP .-3 JMS I (7607 /CALL SYS HANDLER 4200 /TO WRITE CCB CCB-200 /(AND PRECEDING PG) 37 /INTO SCRATCH BLOCK K3777, 3777 /CAN'T GET THIS ERROR JMP I (EXEUIT MKCCNT, -4 MCICNT, -12 FLDCNT, -7 TDFLAG, 1 /0 MEANS TD8E IS DEATH AT RT FLGRTS, -1 /0 MEANS INCL BRTS IN CI BOSFIX, TAD I (BIPCCL RAL SMA CLA JMP I MAKECI /BATCH NOT RUNNING TAD I (7777 AND (70 TAD CDFZRO DCA BOSCDF /CDF TO BATCH FIELD BOSLUP, CDF 10 TAD I BOSPT1 /GET BATCH WRDS BOSCDF, CDF 10 DCA I BOSPT2 /BACK INTO POSITION CDFZRO, CDF ISZ BOSPT1 ISZ BOSPT2 JMP BOSLUP JMP I MAKECI BOSPT2, 7774 MYCORE, 0 JCIP, CIPAT PAGE VERNUM, 0 TAD (VTEXT DCA TEMP MOREV, TAD I TEMP SNA JMP VOUT CLL RTR RTR RTR JMS I (TTY TAD I TEMP JMS I (TTY ISZ TEMP JMP MOREV VOUT, TAD (215 JMS I (TTX TAD (212 JMS I (TTX JMP I VERNUM VTEXT, TEXT /BLOAD V/ *.-1 VERLOC, 100^VERSON+6002 0 PAGE *7000 BSTART=200 /START ADDR FOR BRTS CISTRT, SKP /RUNNED JMP CHAIN /CHAINED TAD (7603 DCA X10 TAD (NAMLST-1 DCA X11 CDF 10 DCA I X10 /ZERO EDITOR DCA I X10 /COMPILER DCA I X10 /AND LOADER BLOCK #S CDF CIF 10 JMS I (7700 10 /USRIN FINDSV, TAD I X11 /LOOKUP SOME SAVE FILES SNA JMP LUBUF /GO LOOK FOR BASIC.UF DCA XXXXSV /SAVE POINTER TO NAME CLA IAC /THEY'RE ON SYS CIF 10 JMS I (200 2 XXXXSV, 0 0 JMS I (ERRORX /ERROR TAD XXXXSV /GET STARTING BLOCK IAC /PLUS 1 CDF 10 DCA I X10 /INTO INFO AREA CDF JMP FINDSV /LOOP LUBUF, CLA IAC CIF 10 JMS I (200 /LOOKUP BASIC.UF 2 BUFN /(USER DEFINED FUNCTIONS) 0 JMP .+3 /OK IF NOT THERE TAD .-3 /GET STARTING BLOCK +1 IAC CDF 10 DCA I X10 /INTO INFO BLOCK CDF 0 CIF 10 JMS I (200 11 /USR OUT CHAIN, CDF 10 TAD I (7607 /GET BRTS STARTING BLK CDF DCA I (BRTSST /INTO RTS READER JMP I (BINIT NAMLST, BRTSN BAFN BSFN BFFN 0 BRTSN, FILENAME BRTS.SV BAFN, FILENAME BASIC.AF BSFN, FILENAME BASIC.SF BFFN, FILENAME BASIC.FF BUFN, FILENAME BASIC.UF CORE, 0 TAD I (BIPCCL AND COR70 CLL RAR RTR SZA /IS THERE A SYSTEM VALUE? JMP I CORE /YES: USE IT COR0, CDF TAD CORSIZ RTL RAL AND COR70 TAD COREX DCA .+1 COR1, CDF TAD I CORLOC COR2, NOP DCA COR1 TAD COR2 DCA I CORLOC COR70, 70 TAD I CORLOC CORX, 7400 TAD CORX TAD CORV SZA CLA JMP COREX TAD COR1 DCA I CORLOC ISZ CORSIZ JMP COR0 COREX, CDF CLA CMA /HI FIELD IS #FIELDS-1 TAD CORSIZ JMP I CORE CORLOC, CORX CORV, 1400 CORSIZ, 1 PAGE GETRTS, 0 /READ BRTS INTO 0-6777 TAD BRTS DCA BRTSBB JMS I (7607 BRTSIZ 0 BRTSBB, 0 NOCORE, -1 /CAN'T GET THIS ERROR JMP I GETRTS BINIT, ISZ RTSFLG /NEED BRTS? JMP BRTSIN /GOT IT: START IT JMS I (7607 BRTSIZ 0 BRTSST, 0 SR2, 20 /CAN'T GET THIS ERROR BRTSIN, AC7775 /TEST IF GENUINE 2 PAGE SYSTEM HANDLER TAD I (7612 SZA CLA /SKP IF YES JMP PSADJ /ELSE SKIP CDF ADJUSTMENT TAD FLAGTD SNA CLA /IMAGE OK ON TD8E? JMS ERRORX /NO: DONT RUN IT TAD KEYLOC /GET NEW FIELD BITS AND (70 DCA CDFTOP PTCHLP, TAD I PTCHPT /RANGE CHECK A WORD TAD (-6300 CLL TAD (70 SNL CLA /SKP IF CDF N0 JMP NOPTCH TAD I PTCHPT /ISOLATE CDF INSTR AND (7707 TAD CDFTOP DCA I PTCHPT /STORE IT BACK NOPTCH, ISZ PTCHPT JMP PTCHLP TAD KEYLOC DCA CDFTOP SWPLOOP,CDF 20 TAD I TDCTR DCA GETRTS CDFTOP, CDF 70 TAD I TDCTR DCA ERRORX TAD GETRTS DCA I TDCTR CDF 20 TAD ERRORX DCA I TDCTR ISZ TDCTR JMP SWPLOOP CDF CCHEK, ISZ EKOUNT JMS I (CORE /HOW MUCH CORE DO WE HAVE? TAD NOCORE /HOW MUCH DO WE NEED? SPA CLA JMS ERRORX /INSUFFICIENT CORE TAD I SR1 /RESTORE KEY LOCATIONS DCA I SR2 ISZ SR1 ISZ SR2 ISZ SR3 JMP .-5 TAD (JMP I FSTOP1 /PATCH CTRL/C LOCS DCA I (7600 TAD (JMP I FSTOP1 DCA I (7605 TAD SWPINF /TELL BRTS OS/8 PG 17600 OUT NOW RAR STL RAL DCA SWPINF JMP I (BSTART /START BRTS PTCHPT, 7635 ERRORX, 0 CIF 10 JMS I (7700 7 EKOUNT, 1 JMP I (7605 EXEUIT, TAD RTSFLG SNA CLA /NEED BRTS? JMS GETRTS /YES: READ IT TAD (4207 /RESTORE ^C HOOKS DCA I (7600 TAD (6213 DCA I (7605 JMP I (7600 /BACK TO OS8 KEYLOC, ZBLOCK 12 SR1, KEYLOC SR3, -12 RTSFLG, -1 /0 MEANS BRTS IS IN CORE FLAGTD, 1 /1 IF TD8E IS OK AT RUNTIME PSADJ, TAD (4001 AND KEYLOC+11 TAD (2000 DCA KEYLOC+11 JMP CCHEK TDCTR, 7600 PAGE $$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 | /OS8 BASIC RUNTIME SYSTEM, V5C / / / / / / / / / / / /COPYRIGHT (C) 1972, 1973, 1974, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /AUGUST 19, 1972 / /R.G. BEAN, 1972 /SHAWN SPILMAN, 1973 / J.K.,1975 /JR 21-APR-77 ADDED EXTENDED DATE CODE, CLEANED UP LISTING /JR 26-APR-77 TIGHTENED UP STRING ROUTINES /JR 28-APR-77 ADD SOURCE FIX FOR SEVERAL KNOWN BUGS /JR 4-MAY-77 REWROTE FLOATING POINT OUTPUT ROUTINE TO INCREASE ACCURACY // 15-DEC-2018 LHN - ADDED DSN PATCHES TO SOURCE // - DSN 31.11.1 M // - DSN 21.11.2 M // - INCLUDED BPAT.PA CODE IN SOURCE // / / VERSON= 5 /VERSION OF BRTS /VERSION LOCATED AT TAG "VERLOC" AND VERLOC+1 /VERLOC = 260+VERSON /VERLOC+1 = 300+SUBVER (01 = A) SUBVER= 03 /SUBVERSION OF BRTS SUBVAF= 01 /SUBVERSION OF BASIC.AF OVERLAY SUBVSF= 01 /SUBVERSION OF BASIC.SF OVERLAY SUBVFF= 01 /SUBVERSION OF BASIC.FF OVERLAY /FIRST WORD OF EACH OVERLAY CONTAINS /60+VERSON IN LEFT HALF AND SUBVERSION OF OVERLAY /IN RIGHT HALF. MDATE= 7666 /CONTAINS OS/8 DATE IN FIELD 1 BIPCCL= 7777 /CONTAINS YEAR EXTENSION BITS SCOPWD= 7726 /WORD CONTAINING SCOPE FLAG IN 200 BIT EDBLK= 7604 /CONTAINS BLOCK NUMBER OF EDITOR WIDTH= 120 /WIDTH OF PRINTER COLWID= 16 /WIDTH OF ONE PRINT COLUMN SACLIM= 120 /DEFINE WIDTH OF STRING ACCUMULATOR OVERLAY=3400 /ADDRESS OF START OF 5 PAGE OVERLAY BUFFER /ASSEMBLY INSTRUCTIONS / .R PAL8 / *BRTS<BRTS.PA/W / .R ABSLDR / *BRTS$ (THEN SAVE AS SHOWN BELOW) / /WHEN ASSEMBLED AND LOADED VIA THE ABS. LOADER,THE /CORE LAYOUT IS AS FOLLOWS: / /BRTS IS AT 0-6777 /OVERLAY BASIC.AF IS AT 3400-4577 /OVERLAY BASIC.SF IA AT 12000-13177 /OVERLAY BASIC.FF IS AT 13400-14577 / /TO CREATE SAVE IMAGE FILES PRIOR TO RUNNING BASIC, /ASSEMBLE THIS SOURCE IN A 12K OR MORE MACHINE,THEN /PERFORM THE FOLLOWING SEQUENCE OF OS/8 COMMANDS / /.R ABSLDR /*BRTS$ /.SAVE SYS:BRTS 0-6777 / /.SAVE SYS:BASIC.AF 3400-4577 / /.SAVE SYS:BASIC.SF 12000-13177 / /.SAVE SYS:BASIC.FF 13400-14577 / /THE BASIC RUN-TIME SYSTEM IS CONDITIONALIZED TO TAKE ADVANTAGE /OF THE PDP-8/E KE8/E EAE OPTION. /NORMALLY,THE SYSTEM IS ASSEMBLED SUCH THAT IT WILL RUN ON ANY /PDP-8 OR PDP-12. TO TAKE ADVANTAGE OF THE ADDITIONAL HARDWARE,SET /THE SWITCH EAE=1 IF THE SYSTEM INCLUDES A KE8/E EAE. /YOU MAY DO THIS BY CONCATENATING TTY: ONTO BRTS.PA AS FOLLOWS /.PAL EABRTS<TTY:,SYS:BRTS.PA/W /EAE=1 /^Z /^Z /. BINARY IS CREATED... /NOW EABRTS IS LOADED INSTEAD OF BRTS /TO GET A LISTING, USE THE /J SWITCH TO INHIBIT THE FPP CODE YOU /ARE NOT USING (EAE ON A NON EAE ASSEMBLY FOR EXAMPLE) /EAE=0 /USE STANDARD FLOATING POINT PACKAGE /EAE=1 /USE EAE FLOATING POINT PACKAGE / /V4 FIXES /.EAE ADD FOR NUMS <.00001 TO 0 /.FILE INPUT FROM TTY /.OUTPUT OF NUMS > 80,000 /.STRING FETCH WHEN COUNT IS IN ONE FLD & / TEXT IS IN THE NEXT AC4000= CLA STL RAR AC2000= CLA STL RTR AC0002= CLA STL RTL AC7775= CLL STA RTL AC7776= CLL STA RAL AC3777= CLL STA RAR AC5777= CLL STA RTR IFNDEF EAE <EAE=0> /PAGE 0 LOCATIONS *6 USECON, 0 /USE CONSTANT GENERATED BY "USE" STATEMENT FSTOP1, FSTOPI /POINTER TO RTS EXIT ROUTINE USED /BY ^C HOOKS IN SYSTEM HANDLER. /IF THIS IS MOVED, BLOAD MUST BE ALTERED *10 SACXR, 15 /INDEX REGISTER FOR STRING ROUTINES XR1, VCHECK XR2, 0 XR3, 0 XR4, 4 /INDEX REGISTERS XR5, 0 DATAXR, 0 /POINTER FOR IN-CORE DATA LIST SPINNR, 2713 /AT RUNTIME,THIS LOCATION IS SPUN FOR RND SEED *20 /COMPILER-INTERPRETER CONTROL BLOCK. LOCATIONS MARKED BY /A /* ARE EXPECTED TO CONTAIN VALUES SUPPLIED BY THE COMPILER PRIOR /TO THE BRTS LOAD CDFIO, 6211 /* CDF FOR I/O TABLE AND SYMBOL TABLES SCSTRT, 0 /* POINTER TO START OF SCALAR SYMBOL TABLE ARSTRT, 0 /* POINTER TO START OF ARRAY SYMBOL TABLE-1 STSTRT, 0 /* POINTER TO START OF STRING SYMBOL TABLE-1 SASTRT, 0 /* POINTER TO START OF STRING ARRAY TABLE-1 CDFPS, 0 /* CDF FOR START OF PSEUDO-CODE PSSTRT, 0 /* POINTER TO START OF PSEUDO CODE-1 DLSTOP, 0 /* POINTER TO TOP OF DATA LIST DLSTRT, 0 /* POINTER TO BOTTOM OF INCORE DATA LIST-1 PSFLAG, 0 /* OS/8 SWAPPING FLAGS WORD /BIT 0 SET IF OS/8 SAVED IN N7400 INSTEAD OF N7600 (TD8E) /BIT 1 SET IF ROM TD8E HANDLER NOT NEEDING CDF CHANGES /BIT 11 SET IF 17600 IS IN 17600. BIT 11 TOGGLED BY /PSWAP ROUTINE /SYSTEM REGISTERS SACLEN, 0 /LENGTH OF STRING IN SAC S1, 0 /SUBSCRIPT 1 (MUST BE FOLLOWED BY S2!) S2, 0 /SUBSCRIPT 2 (MUST BE PRECEEDED BY S1!) DMAP, 0 /MAP OF DRIVER PAGES BMAP, 0 /MAP OF FILE BUFFERS *37 /FLOATING POINT PACKAGE LOCATIONS. THE FOLLOWING 21 LOCATIONS ARE USED /FOR VARIOUS PURPOSES BY THE FLOATING POINT PACKAGE. THOSE WITH DOUBLE /LABELS ARE USED BY BRTS AS TEMPORARIES WHEN NOT CALLING THE PACKAGE. /THE SECOND TAG IS THE ONE USED BY THE FLOATING POINT PACKAGE,THE FIRST /IS USED BY BRTS. FF, 0 /SPECIAL MODE FLIP-FLOP TEMP1, AC0, 0 AC1, 0 TEMP3, AC2, 0 TM, TEMP4, 6201 ACX, 0 /FAC-EXPONENT ACH, 0 /FAC-HIGH ORDER MANTISSA ACL, 0 /FAC-MANTISSA LOW TEMP5, OPX, 0 TEMP6, OPH, 0 TEMP7, OPL, 0 DSWIT, 0 /SWITCH USED BY INPUT ROUTINE CHAR, 215 /TERMINATOR OF LAST INPUT TEMP10, 0 /LOC NEEDED BY FPP DECEXP= TEMP10 /SYSTEM REGISTERS USED OFTEN BY INTERPRETER CODE MODESW, 0 /0 FOR ARTHIMETIC MODE,1 FOR STRING MODE INSAV, 0 /CURRENT PSEUDO-INSTRUCTION BEING EXECUTED LINEHI, 0 /HI ORDER BITS OF LINE # CURRENTLY BEING EXECUTED LINELO, 0 /LOW ORDER BITS OF CURRENT LINE NUMBER STRMAX, 0 /MAXIMUM # OF CHARS ALLOWED IN CURRENT STRING STRCNT, 0 /- # OF CHARACTERS IN CURRENT STRING STRPTR, 0 /POINTER TO SIZE WORD OF CURRENT OPERAND STRING TEMP2, 0 /I/O TABLE POINTER AREA-THIS BLOCK HOLDS POINTERS TO THE I/O TABLE /ENTRY FOR THE CURRENT FILE.THE POINTERS ARE CHANGED EVERY TIME AN /SFN IS EXECUTED. A TAD I OFF ONE OF THE POINTERS WILL GET THE INFORMATION /NOTED IN THE COMMENT FOR THE CURRENT I/O DEVICE /THIS BLOCK IS INITIALIZED FOR TTY IOTSIZ= 15 /CURRENT SIZE OF IO TABLE /THE FORMAT OF THE HEADER WORD IS AS FOLLOWS /BITS USAGE /0-3 OS/8 DEVICE NUMBER /4-5 3 FOR 2 CHARACTER UNPACKING COUNT /6 SET IF BUFFER HAS BEEN MODIFIED AND NEEDS TO BE WRITTEN /7 SET IF NOT FILE STRUCTURED DEVICE /8 SET IF HANDLER IS 2 PAGES LONG /9 SET IF VARIABLE LENGTH (OUTPUT) FILE /10 SET IF EOF /11 SET IF ASCII FILE, CLEAR IF NUMERIC IMAGE FILE ENTNO, 0 /ENTRY NUMBER NOW IN AREA IOTHDR, TTYF /HEADER WORD IOTBUF, TTYF+1 /BUFFER ADDRESS IOTBLK, TTYF+2 /CURRENT BLOCK IN BUFFER IOTPTR, TTYF+3 /READ\WRITE POINTER IOTHND, TTYF+4 /HANDLER ENTRY POINT IOTLOC, TTYF+5 /FILE STARTING BLOCK # IOTLEN, TTYF+6 /ACTUAL FILE LENGTH IOTMAX, TTYF+7 / DEVICE / (FILE MAXIMUM LENGTH) IOTPOS, TTYF+10 / NAME / (POSITION OF PRINT HEAD) IOTFIL, TTYF+11 / / TTYF+12 / FILE / TTYF+13 / NAME / TTYF+14 / .EX IOTDEV= IOTMAX *200 /FETCH NEXT PSEUDO WORD PWFECH, JMP START1 /START ONCE ONLY CODE IN TTY BUFFER ISZ INTPC /BUMP PSEUDO-CODE PROGRAM COUNTER JMP CDFPSU /NO-SKIP;JUST GET NEXT PSEUDO-CODE WORD TAD CDFPSU /SKIP MEANS WE HAVE TO INCREMENT PS-CODE FIELD TAD [10 DCA CDFPSU CDFPSU, VCHECK /SET DF TO FIELD OF PSEUDO-CODE TAD I INTPC /GET NEXT WORD OF CODE CDF 0 /SET DATA FIELD BACK TO INTERPRETER FIELD JMP I PWFECH /RETURN O7770, 7770 SSMODE, IAC /SET INTERPRETER TO STRING MODE AMODE, DCA MODESW /SET INTERPRETER TO ARITH MODE /FALL BACK INTO I-LOOP /BRTS I-LOOP ILOOP, CLA CLL /FLUSH DCA FF /PUT FPP IN SI MODE JMS PWFECH /GET NEXT PSEUDO-INSTRUCTION DCA INSAV /SAVE FOR LATER JMS I [XPRINT /CALL TO TTY DRIVER NOP TAD INSAV AND [7400 /STRIP TO OPCODE BITS CLL RTL RTL RAL /OPCODE NOW IN BITS 8-11 TAD O7770 /SUBTRACT 10 SMA /IS OPCODE <10? JMP SCASE /CALL TO INSTRUCTION COMMON TO SMODE AND AMODE DCA TEMP1 /YES-SAVE THE OFFSET TAD MODESW /WHICH MODE? SZA CLA JMP SMODE /STRING MODE TAD TEMP1 /ARITHMETIC MODE-GET OFFSET TAD JMSI /MAKE JMS TO FP PACKAGE ROUTINE DCA .+2 /PUT IN LINE JMS ARGPRE /SET UP ARGUMENT FROM SYMBOL TABLE ILOOPF, . /JMS TO THE FLOATING POINT PACKAGE ROUTINE NOP /FPP SOMETIMES RETURNS TO CALL+2 JMP ILOOP /DONE SCASE, TAD JMPI /JUST DISPATCH TO ROUTINE CALLED FOR DCA .+1 . /JUMP TO APPROPRIATE ROUTINE JMSI, JMS I SEP1 /JMS USED FOR CALLS TO FPP BY AMODE INST JMPI, JMP I SEP1 /JMP USED TO CALL ROUTINES COMMON TO AMODE AND SMODE /JUMP TABLE FOR AMODE INSTRUCTIONS FFADD /FAC_C(A)+FAC OPCODE 0 FFSUB /FAC_FAC-C(A) OPCODE 1 FFMPY /FAC_FAC*C(A) OPCODE 2 FFDIV /FAC_FAC/C(A) OPCODE 3 FFGET /FAC_C(A) OPCODE 4 FFPUT /C(A)_FAC OPCODE 5 FFSUB1 /FAC_C(A)-FAC OPCODE 6 FFDIV1 /FAC_C(A)/FAC OPCODE 7 /ALL INSTRUCTIONS BEYOND THIS POINT ARE COMMON TO AMODE AND SMODE SEP1, LS1I /S1_C(A) OPCODE 10 LS2I /S2_C(A) OPCODE 11 FJOCI /IF TRUE,PC_C(PC,PC+1) OPCODE 12 JEOFI /IF EOF,PC_C(PC,PC+1) OPCODE 13 LINEI /LINE NUMBER OPCODE 14 ARRAYI /ARRAY INST OPCODE 15 ILOOP /NOP OPCODE 16 OPERI /OPERATE INST OPCODE 17 SMODE, TAD TEMP1 /INST OFFSET TAD JMSSI /BUILD JMP OFF STRING TABLE DCA SDIS /PUT IN LINE CLL /STRING SCALAR TABLE JMS I STFINL /SET UP ARGUMENT ADDRESS SDIS, . /CALL STRING ROUTINE REQUESTED /JUMP TABLE FOR SMODE INSTRUCTIONS / A "/*" IN THE COMMENT MEANS THAT THAT OPCODE IS NOT USED,SO WE /USE THE SLOT FOR REGULAR STORAGE SCON1 /SAC_SAC&C(A$) SCOMP /IF SAC .NE. C(A$),PC_PC+2 SREAD /C(A$)_DEVICE INTPC, . /* INTERPRETER PC SLOAD /SAC_C(A$) SSTORE /C(A$)_SAC STFINL, STFIND /* LINK TO STRING FINDING ROUTINE JMSSI, JMP I .+1 /* DISPATCH JUMP FOR SMODE INSTRUCTIONS /ARGPRE-ROUTINE TO TRANSLATE OPERAND FIELD INTO 12 BIT POINTER /INTO SCALAR TABLE FOR USE IN FPP CALLS. ARGPRE, 0 TAD INSAV /GET INSTRUCTION AND [377 /STRIP TO OPERAND FIELD DCA TEMP1 /SAVE TAD TEMP1 CLL RAL /*2 TAD TEMP1 /PTR*3 TAD SCSTRT /MAKE 12 BIT ADDR SCALDF, 1000 /DF TO SCALAR FIELD (CDF INITIALIZED BY LOADER) JMP I ARGPRE /RETURN /ROUTINE TO ZERO FAC FACCLR, -4 L7600, 7600 /CLA DCA ACX /ZERO EXPONENT DCA ACL /ZERO LOW MANTISSA DCA ACH /ZERO HIGH MANTISSA JMP I FACCLR /STRING ACCUMULATOR USED BY STRING OPCODES AND FUNCTIONS /CONTAINS ONE 6BIT CHAR PER WORD START1, SAC, OSR SZA CLA NOP /A HLT PLACED HERE WILL ALLOW YOU TO STOP /MACHINE BEFORE RUNTIME SYSTEM STARTS BY /SETTING SWITCH REGISTER TLS /SET TTY FLAG ISZ SPINNR /SPIN RANDOM NUMBER SEED NOP /WHILE WAITING FOR INITIALIZING TLS TSF /FLAG UP YET? JMP .-3 /NO TAD CDFIO DCA I PS1L /SET UP CDFS IN PSWAP TAD CDFIO DCA I PS2L JMS I PFUDSC /SWAP 17600 IN IF NOT ALREADY IN AND SAVE SCOPE FLAG JMS I CDFPSU TAD SCALDF /SET PROG NOT RESTARTABLE BIT DCA I L7746 /TELL USR TO SAVE 1000-1777 TAD PINFO /POINTER TO INFO TABLE IN 17600 DCA XR1 TAD POVTAB /POINTER TO BLOCK TABLE IN OVERLAY DRIVER DCA XR2 TAD FACCLR /WE HAVE TO GET 4 BLOCK NUMBERS DCA TEMP1 OVML, CDF 10 TAD I XR1 /GET BLOCK NUMBER FOR THIS OVERLAY FROM INFO AREA CDF DCA I XR2 /PUT IN TABLE IN OVERLAY DRIVER ISZ TEMP1 /DONE? JMP OVML /NO JMS I [PSWAP /SWAP 17600 BACK TO HIGH CORE NOW JMP I .+1 START3 /CONTINUE THE INITIALIZING CODE IN INTERMEDIATE BUFFER L7746, 7746 PINFO, 7607 POVTAB, ARITHA-1 PS1L, P1CDF PS2L, P1CDF1 PFUDSC, FUDSC PAGE FUDSC, 0 TAD PSFLAG /TEST WHERE 17600 IS LOCATED SMA CLA TAD [200 /IF NOT TD8E USE 7600 TAD [7400 /IF TD8E USE 7400 DCA I PHICORE /STORE FOR SWAPPER CLA IAC AND PSFLAG SNA CLA /SKP IF PAGE 17600 IS ALREADY IN JMS I [PSWAP /ELSE BRING IT IN CDF 10 TAD I PSCOPW CDF AND [200 /GET SCOPE BIT FROM RES MONITOR DCA I PSCOPF TAD I PHEIGHT DCA I PHCTR /NOW INITIALIZE THE SCREEN HEIGHT COUNTER JMP I FUDSC /RETURN PHEIGHT,HEIGHT PHCTR, HCTR PSCOPW, SCOPWD PSCOPF, SCOPFG PHICOR, HICORE *SAC+SACLIM+1 /ORIGIN PAST SAC+ONE GUARD CHAR /JUMP ON CONDITION FJOCI, TAD INSAV /GET JUMP INSTRUCTION AND [17 /MASK OFF JUMP CONDITION SNA /IS IT GOSUB? JMP I (GOSUB /YES-PUSH PC ON STACK THEN JUMP TAD FSTOPI /BASE TAD FOR BUILD OF TAD INSTRUCTION DCA .+1 /PUT IN LINE . /GET PROPER SKIP DCA .+2 /PUT IN LINE TAD ACH /GET HIGH ORDER FAC . /SKIP INSTRUCTION JMP SUCJMP /CONDITION TRUE-JUMP JFAIL, JMS I [PWFECH /CONDITION FALSE-DON'T JUMP,BUT BUMP PC JMP I [ILOOP /DONE /JUMP ON END OF FILE JEOFI, JMS I [IDLE /SEE IF FILE OPEN TAD I IOTHDR /1ST WORD OF I/O TABLE ENTRY CLL RTR /GET EOF BIT IN LINK SNL CLA /EOF? JMP JFAIL /NO-DON'T JUMP /YES, FALL INTO JUMP ROUTINE SUCJMP, JMS I [PWFECH /GET WORD FOLLOWING JUMP INS. DCA I INTPCL /STORE AS NEW PC TAD INSAV /GET JUMP INSTRUCTION AND [340 /MASK OFF DESTINATION FIELD CLL RTR /SLIDE OVER TAD CDFINL /MAKE A CDF INSTRUCTION DCA I [CDFPSU /AND SET NEW PC INSTRUCTION FIELD JMP I [ILOOP /NEXT INSTUCTION K7554, 7554 /MUST PRECEDE SKIP TABLE /SKIP TABLE USED TO HOLD TESTS FOR VARIOUS CONDITIONS K7600, 7600 /UNCONDITIONAL (CLA) SMA CLA /JPA SZA CLA /JNA SMA SZA CLA /JPA JNA SPA CLA /JMA SNA CLA /JZA SPA SNA CLA /JMA JZA JMP I JFORL /FORLOOP JUMP ROUTINE JFORL, JFOR INTPCL, INTPC 0000;0 /MARK BEGINNING OF GOSUB STACK GSTCK, 6000;0 6000;0 6000;0 6000;0 6000;0 6000;0 6000;0 6000;0 6000;0 0 /MARK THE END OF THE GOSUB STACK /CALL TO DEVICE DRIVER FOR FILE I/O. ASSUMES ARGS HAVE BEEN SET UP DRCALL, 0 DCA DRARG1 /FUNCTION WORD INTO DRIVER CALL CDFINL, CDF /DF TO CURRENT FIELD TAD I IOTBUF /GET BUFFER ADDRE FROM I/O TABLE ENTRY DCA DRARG2 /PUT IN DRIVER CALL TAD I IOTBLK /GET BLOCK NUMBER FROM I/O TABLE DCA DRARG3 /PUT IN DRIVER CALL TAD I IOTHND /GET DRIVER ENTRY DCA DRIVER /SAVE JMS I DRIVER /CALL DRIVER DRARG1, 0 /FUNCTION CONTROL WORD DRARG2, 0 /BUFFER ADDRESS DRARG3, 0 /BLOCK # SMA CLA /DEVICE ERROR-IS IT FATAL? JMP I DRCALL /ALLS WELL DE, JMS I [ERROR /FATAL DRIVER, 0 /CALL TO INTERPRETER EXITING ROUTINE FSTOPN, JMS I [XPRINT /ON NORMAL EXITS,WE MUST EMPTY RING BUFFER JMP .-1 /FIRST FSTOPI, TAD K7554 DCA INSAV /FAKE A CALL TO BASIC.FF FUNCTION 6 JMP I .+1 /CALL OVERLAY FUNC5I /USE FUNCTION-TAKES WORD FOLLOWING CALL AND STUFFS IT IN USECON FOR /USE A BUFFER POINTER FOR USER SUBROUTINE USE, JMS I [PWFECH /GET NEXT WORD FROM PSEUDO-CODE STREAM DCA USECON /STORE IN PAGE 0 SLOT JMP I [ILOOP /RETURN PAGE /ARRAY INSTRUCTIONS /ARRAY INSTRUCTIONS WORK BY FINDING THE ADDRESS OF THE ARGUMENT FROM THE ARRAY SYMBOL /TABLE,THEN CALLING THE APPROPRIATE FLOATING POIN PACKAGE ROUTINE. ARRAYI, TAD MODESW /WHICH MODE? SZA CLA JMP SARRAY /SMODE TAD INSAV /GET ARRAY INSTRUCTION AND K0037 /MASK OFF ARRAY OPERAND CLL RTL /MULTIPLY BY 4 (ENTRY LENGTH) TAD ARSTRT /MAKE POINTER INTO ARRAY TABLE DCA XR1 /POINTS TO ARRAY FOR THIS OPERATION ATABDF, . /CHANGE DF TO ARRAY TABLE FIELD (SET BY START) TAD I XR1 /GET POINTER TO FIRST ARRAY ELEMENT DCA TEMP2 /SAVE FOR LATER TAD I XR1 /GET DF FOR VARIABLE DCA ADFC /PUT IN LINE AT END OF ROUTINE TAD I XR1 /GET ARRAY DIMENSION 1 DCA TEMP3 /SAVE TAD S1 /GET SUBSCRIPT 1 CLL CMA /SET UP 12 BIT COMPARE TAD TEMP3 /DIMENSION 1 +1 SNL CLA /S1 TOO BIG? SU, JMS I [ERROR /YES-SUBSCRIPT OUT OF BOUNDS ERROR DCA TEMP6 /CLEAR TEMPORARY TAD I XR1 /GET DIMENSION 2 SNA /IS SECOND DIMENSION 0?(ARRAY UNIDIMENSIONAL) JMP ADCALC /YES-DON'T CHECK S2 FOR OUT OF BOUNDS DCA ARJMP /SAVE DIM2+1 TAD S2 /GET SUBSCRIPT 2 CLL CMA /SAVE 12 BIT COMPARE TAD ARJMP SNL CLA /S2 BIGGER THAN DIM2? JMP SU /YES TAD S2 /MULTIPLY DIM1+1 BY S2 JMS I [MPY /12 BY 12 MULTIPLY ROUTINE ADCALC, CLL TAD S1 /LORD OF S1+(DIM1+1)*S2 DCA TEMP5 /SAVE RAL /CARRY TO BIT 11 TAD TEMP6 /HORD OF S1+(DIM1+1)*S2 DCA TEMP6 /SAVE TAD TEMP5 /LORD OF S1+(DIM1+1)*S2 CLL RAL /*2 DCA TEMP7 /LORD OF [S1+(DIM1+1)*S2]*2 TAD TEMP6 /HORD OF S1+(DIM1+1)*S2 RAL /*2 DCA TEMP3 /HORD OF [S1+(DIM1+1)*S2]*2 CLL TAD TEMP5 /LORD OF S1+(DIM1+1) TAD TEMP7 /LORD OF [S1+(DIM1+1)*S2] DCA TEMP7 /LORD OF 3*[S1+(DIM1+1)*S2] RAL /CARRY TO BIT 11 TAD TEMP6 /HORD OF [S1+(DIM1+1)*S2)*2 TAD TEMP3 /HORD OF S1+(DIM1+1)*S2 DCA TEMP6 /HORD OF 3*[S1+(DIM1+1)*S2] CLL TAD TEMP7 /INDEX TO ELEMENT TAD TEMP2 /AC POINTS TO CORRECT ARRAY ELEMENT DCA XR1 /SAVE POINTER RAL /CARRY TO BIT 11 TAD TEMP6 /COMBINE TO MAKE TOTAL # OF FIELD OVERLAPS CLL RTL RAL /SLIDE OVERLAPS TO FIELD BITS (6-8) TAD ADFC /ADD ANY CHANGE IN DATA FIELD TO CDF DCA ADFC /PUT ABSOLUTE CDF IN LINE TAD INSAV /GET ARRAY INSTRUCTION AGAIN AND [340 /MASK OFF ARRAY OPCODE CLL RTR RTR RAR /SLIDE TO BITS 9-11 TAD JMPI2 /AND USE AS INDEX INTO JUMP TABLE DCA ARJMP /PUT JUMP IN LINE OF CODE IAC DCA FF /PUT FPP IN "SPECIAL MODE" ADFC, . /CHANGE DF TO DF OF ARRAY ELEMNT TAD XR1 /AC POINTS TO ARRAY ELEMENT ARJMP, . /PERFORM THE REQUIRED OPERATION NOP /FPP SOMETIMES RETURNS TO CALL+2 JMP I [ILOOP /DONE /ARRAY JUMP TABLE AJT, FFSUB1 /FAC=A(S1,S2)-FAC OPCODE 0 FFADD /FAC=FAC+A(S1,S2) OPCODE 1 FFSUB /FAC=FAC-A(S1,S2) OPCODE 2 FFMPY /FAC=FAC*A(S1,S2) OPCODE 3 FFDIV /FAC=FAC/A(S1,S2) OPCODE 4 FFGET /FAC=C(A(S1,S2) OPCODE 5 FPUTLL, FFPUT /C(A(S1,S2)=FAC OPCODE 6 FFDIV1 /FAC=A(S1,S2)/FAC OPCODE 7 /STRING ARRAY DISPATCH SARRAY, TAD INSAV /GET INSTRUCTION AND [340 /ISOLATE ARRAY OPCODE CLL RTR RTR /AND SLIDE IT OVER FOR AN OFFSET RAR TAD JMPISA /BUILD A JUMP TO STRING INSTRCUTION DCA SAD /AND PUT IN LINE STL /TELL SFIND TO USE ARRAY TABLE JMS I STFILK /SET UP ARGUMENT ADDRESS SAD, . /EXECUTE INSTRCUTION /STRING ARRAY JUMP TABLE /USED WHEN ARRAYI CALLED IN SMODE / A "/*" IN THE COMMENT MEANS THAT OPCODE IS UNDEFINED AND THE SLOT /IN THE TABLES IS USED FOR NORMAL STORAGE JMPISA, JMP I .+1 /DISPATCH JUMP FOR STRING ARRAY INSTRUCTIONS SCON1 /SAC_SAC&C(A$(S1)) SCOMP /SKIP IF SAC=C(A$(S1)) SREAD /A$(S1)_DEVICE K0037, 37 /* STFILK, STFIND /* LINK TO STRING FINDING ROUTINE SLOAD /SAC_C(A$(S1)) SSTORE /C(A$(S1))_SAC JMPI2, JMS I AJT /* DISPATCH JUMP FOR ARRAY INST /ROUTINE TO PUT ONE WORD IN FILE BUFFER IN FIELD 1 BCPUT, 0 DCA TEMP6 /SAVE AC JMS I [IDLE /CHECK IF FILE OPEN TAD I IOTPTR /GET READ/WRITE POINTER DCA TEMP7 /SAVE TAD ENTNO /GET FILE # SZA CLA /IF TTY,BUFFER FIELD IS 0 CDF 10 TAD TEMP6 /GET WORD TO STORE AGAIN DCA I TEMP7 /STORE IT IN BUFFER CDF0, CDF TAD I IOTHDR /HEADER WORD AND (7737 /TURN OFF BLOCK WRITTEN BIT TAD (40 /TURN IT ON AGAIN DCA I IOTHDR JMP I BCPUT /RETURN PAGE /TELETYPE DRIVING ROUTINE /2 ENTRY POINTS-XPUTCH PUTS A CHARCTER IN THE RING BUFFER / XPRINT TYPES A CHARACTER IF POSSIBLE / AND RETURNS TO CALL+1 IF THERE / ARE MORE CHARCTERS IN THE BUFFER,CALL+2 / IF THE BUFFER IS EMPTY /THE IDEA IS THE PLACE CALLS TO XPRINT AT VARIOUS POINTS IN THE INTER- /PRETER AND THUS KEEP THE TTY BUSY WITHOUT WASTING THE TIME WAITING FOR /THE TTY FLAG. THE SUCCESS OF THIS SCHEME DEPENDS HEAVILY ON THE NUMBER /AND PLACEMENT OF THE CALLS TO XPRINT. XPUTCH, 0 DCA CHRSAV /SAVE THE CHARACTER XPUT1, ISZ SPINNR /SPIN RANDOM # SEED JMS XPRINT /START A CHAR IF POSSIBLE NOP TAD BCNT /GET THE NUMBER OF AVAILABLE SLOTS SNA CLA /ARE THERE ANY? JMP XPUT1 /NO-TRY TO RPINT 1 AND FREE UP A SPACE PUTCHR, TAD CHRSAV /GET CHARACTER AGAIN DCA I BUFIN /PUT CHARACTER IN RING BUFFER ISZ BUFIN /BUMP BUFEER POINTER OF INPUT CLA CLL CMA /-1 IN AC TAD BCNT /DECREMENT AVAILABLE SLOT COUNT DCA BCNT TAD BUFIN /GET BUFFER INPUT POINTER TAD MBEND /SUBTRACT ADDR OF END OF BUFFER SPA SNA CLA /PAST EDN OF BUFFER? JMP I XPUTCH /NO-RETURN TAD BSTRTA /YES-RESET INPUT POINTER TO BEGINNING OF BUFFER DCA BUFIN JMP I XPUTCH /RETURN BUFIN, BSTRT /POINTER TO NEXT SLOT FOR BUFFER INPUT BUFOUT, BSTRT /POINTER TO NEXT CHARACTER TO BE PRINTED BSTRTA, BSTRT /ADDR OF START OF TTY BUFFER BCNT, 30 /# OF AVAILABLE SLOTS IN BUFFER (40 INITIALLY) CHRSAV=TEMP1 MBEND, -BEND /-ADDR OF END OF RING BUFFER MCTRLC, -3 M50, -30 MXON, -21+3 MXOFF, -23+21 XFLAG, 0 XPRINT, 0 KSF /IS KEYBOARD FLAG UP? JMP NOCC /NO-NO CHANCE FOR A CTRL/C KRB /YES-GET THE CHAR IN KEYBOARD BUFFER AND [177 /GET RID OF PARAITY TAD MCTRLC /IS IT CTRL/C SNA JMP I FSTOP1 /YES-ABORT TO EDITOR TAD MXON SZA JMP .+3 DCA XFLAG JMP NOCC+3 TAD MXOFF SZA CLA JMP NOCC ISZ XFLAG JMP XPRINT+1 NOCC, TAD XFLAG SZA CLA JMP XPRINT+1 TAD BCNT /# OF AVAILABLE SLOTS IN BUFFER TAD M50 /IS BUFFER EMPTY? SNA CLA JMP RECP2 /YES-RETURN TO CALL+2 TSF /NO-TTY FLAG UP YET? JMP I XPRINT /NO-GO ABOUT YOUR BUSINESS TAD I BUFOUT /GET NEXT CHARACTER /*****************************************************************: /N.B. BECAUSE OF THE ABOVE INSTRUCTION,THE DF MUST BE SET TO THE /INTERPRETER FIELD WHENEVER XPRINT IS CALLED. WATCH YOUR HOOK PLACEMENT! /****************************************************************: JMS I (PCH /TYPE THE CHAR ISZ BUFOUT /BUMP BUFFER OUTPUT POINTER TAD BUFOUT /GET OUTPUT POINTER TAD MBEND /SUBTRACT END OF BUFFER SPA SNA CLA /IS OUTPUT POINTER PAST END? JMP BOUTRS /NO-FREE UP A SPOT TAD BSTRTA /YES-RESET POINTER TO BEGINNING DCA BUFOUT BOUTRS, ISZ BCNT /INCREMENT # OF FREE SLOTS (WE JUST PRINTED ONE) JMP I XPRINT /RETURN RECP2, ISZ XPRINT /BUMP RETURN JMP I XPRINT /RETURN TO CALL+2 FOR EMPTY BUFFER /TELETYPE RING BUFFER BSTRT, "B /START OF BUFFER "R "T "S " "V VERLOC, 260+VERSON 300+SUBVER 0215 0212 VEREND, 0212 VCHECK, 0 CDF 10 TAD I N7644 CDF 0 AND XR4 SNA CLA JMP I VCHECK TAD XR1 DCA BUFIN TAD SACXR DCA BCNT JMP I VCHECK BEND, N7644, 7644 /LINE NUMBERS LINEI, TAD INSAV /GET INSTRUCTION DCA LINEHI /SAVE JMS I [PWFECH /GET WORD FOLLOWING LINE # INST DCA LINELO /SAVE AS LOW ORDER LINE # TRHOOK, JMP I [ILOOP /RETURN TO I-LOOP TAD KC240 /IF TRACE IS ON,FAKE CALL DCA INSAV /TO FUNC2,#12 JMP I .+1 FUNC2I /DISPATCH TO TRACE FUNCTION /INTERMEDIATE TTY BUFFER /USED TO BUFFER OUTPUT FROM FPP BEFORE WE PUT IT /IN BASIC FORMAT FOR TRANSPORTATION TO THE TTY RING /BUFFER KC240, 240 /STOPPER TO MARK BEGINNING OF BUFFER INTERB, START3, TAD CDFPS /CDF FOR PSEUDO-CODE DCA I [CDFPSU /PUT IN-LINE TO ILOOP TAD PSSTRT /START OF PSEUDO-CODE DCA I INTPCK /PUT INTO PC JMS I [FACCLR /ZERO FAC TAD CDFIO /CDF FOR SYMBOL TABLE FIELD DCA I STDFL /PUT IN LINE FOR STRING FUNCTIONS FPPTM5, TAD CDFIO /CDF FOR SYMBOL TABLES DCA I ATABDL /PUT IN LINE FOR ARRAY CALCULATIONS TAD CDFIO /CDF FOR SCALAR TABLE FPPTM4, DCA I SCALDL /PUT IN LINE FOR ARGPRE TAD CDFIO DCA I DLCDFL /DATA FIELD FOR DATA LIST FPPTM3, TAD DLSTRT DCA DATAXR /DO A RESTORE IN INCORE DATA LIST JMP I .+1 /CONTINUE INITAILIZATION CODE IN TTY INPUT BUFFER FPPTM2, START4 ATABDL, ATABDF STDFL, STDF FPPTM1, /FLOATING POINT TEMPORARY INTPCK, INTPC DLCDFL, DLCDF SCALDL, SCALDF PAGE /VT52 DELAY PARAMETERS (MUST BE AT BEGINNING OF PAGE) HEIGHT, 0 /NEGATIVE SCREEN HEIGHT DELAY, 0 /NEGATIVE DELAY VALUE IFNZRO HEIGHT-1200 <__FIX SET COMMAND__> HCTR, 0 /HEIGHT COUNTER INITIALIZED BY SET DCTR, 0 /DELAY COUNTER INITIALIZED BY SET /LOW LEVEL ROUTINE TO TYPE A CHAR PCH, 0 TSF /WAIT FOR PREV CHAR JMP .-1 TLS /TYPE THE CURRENT ONE AND [177 /MASK TO 7BIT TAD (-15 /TEST IF LINE FEED WILL BE SENT NEXT SZA CLA JMP I PCH /RETURN IF NOT ISZ HCTR /TEST SCREEN HEIGHT IF LF JMP I PCH /RETURN IF NOT AT BOTTOM OF SCREEN TAD HEIGHT DCA HCTR /RESET HEIGHT COUNTER NOW TAD DELAY SNA /TEST FOR ZERO DELAY JMP I PCH /RETURN IF SO DCA DCTR /ELSE SET DELAY COUNTER DLOOP, ISZ PSWAP /NOW EXEC INNER LOOP 4096 TIMES (USUALLY) JMP .-1 KSF /TEST IF KEY STRUCK SKP JMP I PCH /RETURN AT ONCE IF YES ISZ DCTR /TEST DELAY TIMER JMP DLOOP /REITERATE JMP I PCH /NOW ALLOW PRINTING TO CONTINUE /OPERATE CLASS INSTRUCTIONS OPERI, TAD INSAV /GET OPERATE INSTRUCTION AND [17 /MASK OFF OPERATE OPCODE TAD JMPI3 /BUILD JUMP OFF OPERATE JUMPTABLE DCA .+1 /STORE THE JUMP IN LINE . /DISPATCH TO PROPER OPERATE ROUTINE JMPI3, JMP I .+1 /JUMP TO OPERATE ROUTINE CALLED FOR /OPERATE JUMP TABLE FUNC3I /CALL RESIDENT FUNCTION OPCODE 0 SPFUNC /SPECIAL FUNCTIONS OPCODE 1 SFN /SET FILE NUMBER OPCODE 2 FNEGI /NEGATE FAC OPCODE 3 RETRNI /GOSUB RETURN OPCODE 4 RESTOR /RESTORE DEVICE OPCODE 5 LSUB1I /LOAD S1 FROM FAC OPCODE 6 LSUB2I /LOAD S2 FROM FAC OPCODE 7 MSPACE, 20 /THIS OPCODE NOT DEFINED,SO WE PUT A CONST HERE READI /READ DEVICE OPCODE 11 WRITEI /WRITE DEVICE OPCODE 12 SWRITE /STRING WRITE OPCODE 13 FUNC5I /CALL FILE FUNCTION OPCODE 14 FUNC4I /CALL USER FUNCTION OPCODE 15 FUNC1I /CALL FUNCTIONS 1 OPCODE 16 FUNC2I /CALL FUNCTIONS 2 OPCODE 17 /ROUTINE TO SWAP PG 17600 WITH N7400 OR N7600 (WHICHEVER THE CASE MAY BE) /WHERE N IS THE HIGH CORE FIELD PSWAP, 0 TAD KK7600 /POINTER TO 17600 AND COUNTER DCA TEMP1 TAD PSFLAG /GET SWAPPING FLAGS RAR CML RAL /TOGGLE THE INPLACE BIT DCA PSFLAG /STORE IT BACK TAD HICORE /PICK UP ADDR OF HIGH CORE DCA TEMP2 /POINTER TO HIGH CORE P1CDF, HLT /DF TO HI CORE TAD I TEMP2 /GET WORD FROM HI CORE DCA TEMP4 /SAVE IT P2CDF, CDF 10 TAD I TEMP1 /GET WORD FROM 17600 P1CDF1, HLT /DF TO HI CORE AGAIN DCA I TEMP2 /PUT 17600 WORD IN HI CORE P2CDF1, CDF 10 TAD TEMP4 /GET SAVED HI CORE WORD DCA I TEMP1 /AND PUT IN 17600 ISZ TEMP2 /BUMP HI CORE POINTER KK7600, 7600 /CLA ISZ TEMP1 /BUMP 17600 POINTER AND CHECK FOR DONE JMP P1CDF /NO DONE-MOVE NEXT WORD CDF JMP I PSWAP /DONE-RETURN HICORE, 0 /POINTS TO LOCATION OF 17600 SAVE AREA IFNZRO EAE < /TEMPORARY INCLUSION FOR FFOUT /ADD OP TO FAC OADD, 0 CLL TAD AC2 TAD AC1 DCA AC1 /ADD GUARD BITS RAL TAD OPL TAD ACL DCA ACL /ADD LOW ORDER BITS RAL TAD OPH TAD ACH DCA ACH /ADD HIGH ORDER BITS JMP I OADD /SHIFT FAC LEFT 1 BIT AL1, 0 TAD AC1 CLL RAL DCA AC1 TAD ACL RAL DCA ACL TAD ACH RAL DCA ACH JMP I AL1 > /1 RL01 PATCH FOR BRTS // WAS PART OF THE BPAT.PA FILE *1345 HFIX, 0 CLL STA RTL /AC7775 TAD I H7612 SZA CLA /SKP IF 2 PAGE HANDLER JMP I HFIX /ELSE EXIT NOW FIXLUP, TAD I FIXPTR /GET A WORD FROM HANDLER TAD M6300 CLL /RANGE CHECK FOR CIF/CDF N0 TAD H70 SNL CLA /SKP IF CDF OR CIF JMP NOFIX /ELSE DON'T FIX IT TAD I FIXPTR /GET INSTRUCTION AND H7707 /ZERO FIELD BITS TAD H20 /PUT BACK FIELD 2 DCA I FIXPTR /STORE INSTRUCTION BACK NOFIX, ISZ FIXPTR JMP FIXLUP JMP I HFIX /--RETURN-- FIXPTR, 7635 H20, 20 H70, 70 H7612, 7612 H7707, 7707 M6300, -6300 PAGE /LOAD SUBSCRIPT 1 OR 2 FROM FAC OR MEMORY LSUB2I, ISZ DCASUB JMP LSUB1I LS2I, ISZ DCASUB LS1I, JMS I [FACSAV /PRESERVE FAC JMS I ARGPRL /GET ARG POINTER INTO AC JMS I [FFGET /LOAD ARG INTO FAC (SKIPS NEXT INST ON RETURN) LSUB1I, JMS I [FACSAV /SAVE THE FAC JMS I [UNSFIX /GET INT(FAC) DCASUB, DCA S1 /SET RESULT AS SUBSCRIPT 1 JMS I [FACRES /RESTORE FAC TAD DCAS1 DCA DCASUB /FUDGE INSTR BACK JMP I [ILOOP /NEXT INSTRCUTION DCAS1, DCA S1 ARGPRL, ARGPRE /JMP DISPATCH FOR FUNC1 CALLS JMSI4, JMS I .+1 /CALL FOR CANNED FUNCTION SET 1 /JUMP TABLE FOR FUNCTION CALL 1 ATAN /FUNCTION BITS= 0 COS / 1 EXPON1 / 2 EXPON / 3 INT / 4 LOG / 5 SGN / 6 SIN / 7 RND / 10 FROOT / 11 /JUMP FOR FUNC2 DISPATCH JMSI5, JMP I .+1 /JMP OFF THE SET 2 TABLE /JUMP TABLE FOR FUNCTION SET 2 ASC /FUNCTION BITS= 0 CHR / 1 DATE / 2 LEN / 3 POS / 4 SEG / 5 STR / 6 VAL / 7 ERRORR / 10 /ERRORR MUST BE FUNCTION #10,ELSE "ERROPC" MUST CHANGE TRACE / 11 TPRINT / 12 /TPRINT MUST BE #12 OR TRHOOK+1 MUST CHANGE /DISPATCH FOR FUNC5 CALLS JMPFIL, JMP I .+1 /CALL FORR FILE MANIPULATING FUNCTIONS /JUMP TABLE FOR FILE FUNCTIONS CHAIN /FUNCTION BITS= 0 CLOSE / 1 OPENAF / 2 OPENAV / 3 OPENNF / 4 OPENNV / 5 FSTOP /INT. EXIT 6 /ERROR CALL FOR USER FUNCTIONS-USER FUNCTION SHOULD "JMS I (IA" IA, JMS I [ERROR /FUNCTION OVERLAY DRIVER FUNC4I, JMS I [XPRINT /PURGE TTY RING BUFFER JMP .-1 /BEFORE CALLING USER FUNCTION IAC /LOOK FOR OVERLAY FLAG=3 FUNC5I, IAC /LOOK FOR OVERLAY FLAG=2 FUNC2I, IAC /LOOK FOR OVERLAY FLAG=1 FUNC1I, DCA TEMP1 /LOOK FOR OVERLAY FLAG=0 CDF /DF TO THIS FIELD TAD TEMP1 /GET OVERLAY # AGAIN CIA /NEGATE TAD OVRLAY /COMPARE AGAINST OVERLAY FLAG SNA CLA /IS THE ONE WE WANT ALREADY RESIDENT? JMP OVDNE /YES-JUST JUMP TO FUNCTION TAD TEMP1 /NO-GET NUMBER OF OVERALY DESIRED TAD OATADI /USE AS OFFSET TO BUILD STARTING BLOCK TAD DCA TEMP2 /POINTS TO PROPER STARING BLOCK # TAD I TEMP2 /GET STARTING BLOCK FOR THIS OVERLAY DCA OVADD /PUT IN DRIVER CALL JMS I L7607 /CALL SYSTEM HANDLER 0500 /OVERLAY 3400-4600 3400 OVADD, . /STARTING BLOCK # OF OVERLAY OE, JMS I [ERROR /I/O ERROR TAD TEMP1 DCA OVRLAY /CHANGE RESIDENT FLAG OVDNE, TAD [SAC-1 /ENTER STRING FUNCTIONS WITH SACXR SET UP DCA SACXR TAD TEMP1 /FUNCTION # TAD JMSTAD /BUILD A TAD OF THE PROPER DISPATCH JMS DCA .+2 /PUT IN LINE JMS I [FBITGT /GET # OF FUNCTION DESIRED . /BUILD JUMP OFF JUMP TABLE FUJUMP, DCA .+1 /PUT JUMP IN LINE . /GO TO DESIRED FUNCTION JMP I [ILOOP /DONE OATADI, ARITHA L7607, 7607 OVRLAY, 0 /# OF CURRENTLY RESIDENT OVERLAY /0=ARITHMETIC,1=STRING,2=FILE,3=USER /OVERLAY TABLE-CONTAINS STARTING BLOCK # OF SYSTEM OVERLAYS /INITIALIZED BY LOADER ARITHA, . /STARTING BLOCK OF ARITHMETIC OVERLAY STRNGA, . /STARTING BLOCK OF STRING OVERLAY FILEFA, . /STARTING BLOCK OF FILE OVERLAY USRA, . /STARTING BLOCK OF USER FUNCTIONS JMSTAD, TAD I TADTAB TADTAB, JMSI4 JMSI5 JMPFIL JMSUSR /CALL FOR RESIDENT FUNCTION FUNC3I, JMS I [FBITGT /ISOLATE FUNCTION # TAD JMSI7 /MAKE A JUMP OFF JUMP TABLE JMP FUJUMP /PUT THE JUMP IN LINE AND EXECUTE IT JMSI7, JMP I .+1 /JUMP TABLE FOR RESIDENT FUNCTIONS XABSVL /FUNCTION BITS= 0 COMMA / 1 CRFUNC / 2 ILOOPF / 3 TAB / 4 PNT / 5 USE / 6 *1557 /****N.B.**** /THIS TABLE CANNOT BE MOVED!!!! /JUMP DISPATCH FOR USER ROUTINES JMSUSR, JMS I .+1 /JUMP TABLE FOR USER FUNCTIONS ILOOPF /USER FUNCTION 1 ILOOPF / 2 ILOOPF / 3 ILOOPF / 4 ILOOPF / 5 ILOOPF / 6 ILOOPF / 7 ILOOPF / 8 ILOOPF / 9 ILOOPF / 10 ILOOPF / 11 ILOOPF / 12 ILOOPF / 13 ILOOPF / 14 ILOOPF / 15 ILOOPF / 16 PAGE /SPECIAL FUNCTIONS SPFUNC, JMS I [FBITGT /ISOLATE FUNCTION BITS TAD JMPI6 /MAKE A JUMP OFF SPECIAL FUNCTION TABLE DCA .+1 /PUT IN LINE . JMPI6, JMP I .+1 /JUMP TO SPECIAL FUNCTION ROUTINE /SPECIAL FUNCTION JUMP TABLE SETF /SET FSWITCH 0 FRANDM /RANDOMIZE 1 FSTOPN /LEAVE INTERPRETER 2 SRLIST /STRING READ FROM DATA LIST 3 CSFN /SET FILE # TO TTY 4 RDLIST /READ DATA LIST 5 AMODE /SWITCH TO A MODE 6 SSMODE /SWITCH TO S MODE 7 /SUBROUTINE UNSFIX-UNSIGNED INTEGER FIX ROUTINE. FIXS A POSITIVE 12 BIT /NUMBER OUT OF FAC MANTISSA AND LEAVES RESULT IN AC.RESULT IS AN UNSIGNED, /12 BIT INTEGER UNSFIX, 0 CDF 0 TAD ACL /LOW MANTISSA CLL RAL /HI BIT OF LO MANTISSA TO LINK CLA TAD ACH /HIGH MANTISSA SPA /IS NUMBER POSITIVE? FM, JMS I [ERROR /NO-BOO!!! RAL /SHIFT THE SIGN BIT OUT AND THE MANTISSA OVER, DCA ACH /MAKING 12 BITS OF MANTISSA AND BINARY POINT BEFORE BIT 0 TAD ACX /GET EXPONENT SPA SNA CLA /IS X>1? JMP I UNSFIX /NO-FIX IT TO 0 TAD ACX /YES-GET EXPONENT TAD [-14 /SET BINARY POINT AT 12 SNA /DONE ALREADY? JMP UNSOUT /YES SMA /NO-IS # TOO BIG? FO, JMS I [ERROR /YES DCA ACX /NO-STORE COUNT TAD ACH /HI MANTISSA UNSLP, CLL RAR /SCALE RIGHT ISZ ACX /DONE? JMP UNSLP /NO JMP I UNSFIX /YES-RETURN UNSOUT, TAD ACH /ANSWER IN AC JMP I UNSFIX /RESTORE ROUTINE RESTOR, TAD ENTNO /GET CURRENT FILE # SNA CLA /IS IT 0? JMP RESDLS /YES-RESTORE DATA LIST JMS I (WRBLK /NO-WRITE CURRENT BUFFER STA /-1 TAD I IOTLOC /STARTING BLOCK-1 DCA I IOTBLK /SET CURRENT BLOCK # TAD I IOTBUF /GET BUFFER ADDRESS DCA I IOTPTR /USE IT TO RESET READ\WRITE POINTER TAD I IOTHDR /GET HEADER WORD AND (7435 /CLEAR EOF BIT,BUFFER WRITTEN BIT,AND CHAR # DCA I IOTHDR JMS I [NEXREC /READ FIRST BLOCK INTO BUFFER JMP I [ILOOP /DONE RESDLS, TAD DLSTRT /ADDRESS OF START OF INCORE DATA LIST DCA DATAXR /USE IT TO RESET DATA LIST POINTER JMP I [ILOOP /THATS ALL! /SUBROUTINE STFIND-WHEN CALLED,IF LINK=1 STRING ARRAY TABLE IS /USED,IF LINK=0 STRING SYMBOL TABLE IS USED. RETURNS WITH AC SET /TO CDF OF OPERAND STRING,STRPTR POINTING TO THE FIRST WORD /IN THE STRING, AND THE MAX LENGTH OF THE STRING IS IN STRMAX. ALSO, /THE ACTUAL LENGTH OF THE STRING IS IN STRCNT STFIND, 0 SZL /IS THIS AN ARRAY INST? JMP SAFIND /YES-POINTER IS INTO ARRAY TABLE TAD INSAV /GET INST AGAIN AND [377 /ISOLATE OPERAND POINTER DCA TEMP1 /NO-SAVE OPERAND POINTER TAD TEMP1 /N CLL RAL /2N TAD TEMP1 /3N (3 WORDS/ENTRY) TAD STSTRT /ADD BASE ADR OF STRING TABLE STCOM, DCA XR2 /POINTER TO THIS ENTRY IN STRING TABLE STDF, . /DF TO THAT OF SYMBOL TABLES (SET BY START) TAD I XR2 /GET POINTER TO STRING DCA STRPTR TAD I XR2 /GET CDF FOR OPERAND STRING DCA STRCDF /SAVE TAD I XR2 /GET -(MAX LENGTH OF STRING) DCA STRMAX /SAVE SNL /ARRAY ELEMENT? JMP STRCDF /NO-SKIP THIS SUBSCRIPT CALCULATION TAD S1 /GET SUBSCRIPT CLL CMA /SET UP 12 BIT COMPARE TAD I XR2 /GET DIMENSION SNL CLA /IS S1>DIMENSION? JMP I (SU /YES TAD STRMAX /NO-GET ELEMENT LENGTH CIA /MAKE POSITIVE CLL IAC /ROUND OFF TO NEAREST MULTIPLE OF 2 CLL RAR / DIVIDE BY TWO (COUNT/2=WORD COUNT) CLL IAC /ADD A WORD FOR HEADER DCA TEMP3 /# OF WORDS IN EACH ARRAY ELEMENT TAD S1 /GET SUBSCRIPT JMS I [MPY /S1*ELEMENT LENGTH (ASSUMES LINK UNCHANGED ON RETURN) TAD STRPTR /ARRAY OFFSET+POINTER TO A(0) DCA STRPTR /FINAL STRING POINTER RAL /CARRY TO BIT 11 TAD TEMP6 /ADD TO ACCUMLATED OVERLAPS FROM MULTIPLY CLL RTL RAL /PUT OVERLAP # INTO BITS 6-8 TAD STRCDF /ADD TO CDF IF NECESSARY DCA STRCDF /SAVE AGAIN STRCDF, 0 /DF TO STRING FIELD TAD I STRPTR CDF DCA STRCNT /STORE -(CURRENT LENGTH OF STRING) TAD STRCDF /CDF TO OPERAND IN AC DCA I (SSTEX /SETUP STRING STORE EXIT DF HERE JMS I (BYTSET /ENTER FUNCTIONS WITH BYTE POINTERS SETUP JMP I STFIND /RETURN SAFIND, TAD INSAV /GET INST AND (37 /ISOLATE OPERAND POINTER CLL RTL /4N (4 WORDS/ENTRY) TAD SASTRT /USE STRING ARRAY TABLE STL /SET LINK FOR ARRAY INST JMP STCOM /RETURN TO SUBROUTINE MAINLINE /PNT(X) /SEND 7BIT CHAR TO THE CURRENT FILE PNT, JMS I [UNSFIX /FIX X AND [177 /STRIP TO 7 ASCII BITS // // DSN 31.11.2 M // NOP // // TAD [200 /FORCE CHANNEL 8 JMS I [PUTCH /PUT IN FILE BUFFER JMP I [ILOOP /DONE PAGE /ROUTINE SFN-ROUTINE TO RESET POINTERS IN PAGE ZERO FILE POINTER /AREA TO REFLECT A CHANGE IN THE CURRENT FILE NUMBER SFN, JMS I [UNSFIX /FIX FAC TO GET FILE # CSFN, DCA ENTNO /IF ENTRY IS HERE,FILE #=0 (TTY) TAD ENTNO STL TAD (-4 /IS RESULT A LEGAL FILE #? SNL SZA CLA FN, JMS I [ERROR /NO-ERROR TAD ENTNO /PICK UP FILE NUMBER // // DSN PATCH 31.11.1.M // CLL RAL // TAD ENTNO // RTL // TAD ENTNO // NOP // // CLL RTL // RTL // CIA // TAD ENTNO // CIA /MULTIPLY BY SIZE OF IOTABLE IFNZRO IOTSIZ-15 <__ASSEMBLY ERROR__> TAD (TTYF /ADD TO BASE DCA XR1 /STORE IN TEMP TAD (IOTHDR-1 /NOW POINT AT PAGE 0 AREA DCA XR2 TAD (-IOTSIZ+3 /SETUP ALL BUT LAST 3 DCA TEMP2 TAD XR1 DCA I XR2 ISZ XR1 ISZ TEMP2 JMP .-4 /SET UP THE POINTERS NOW JMP I [ILOOP /--RETURN-- /GOSUB GOSUB, TAD I GSP SMA CLA GS, JMS I [ERROR /ERROR IF STACK OVERFLOW TAD I [CDFPSU /ELSE GET CDF INSTR DCA I GSP ISZ GSP TAD I (INTPC DCA I GSP /STORE INT PC ISZ GSP JMP I (SUCJMP /EXEC AS NORMAL GOTO NOW /GOSUB RETURN RETRNI, STA TAD GSP DCA GSP /POP STACK TAD I GSP /GET PC DCA I (INTPC STA TAD GSP /POP STACK DCA GSP TAD I GSP SMA GR, JMS I [ERROR /FATAL ERROR IF NO RETURN DCA I [CDFPSU JMP I (JFAIL /BUMP PC PAST ADDR WORD AND CONTINUE GSP, GSTCK /GOSUB STACK POINTER /FOR-LOOP JUMP ROUTINE /ENTER WITH AC = HORD JFOR, SNA /IS FAC=0? JMP I (JFAIL /YES-DO NOT JUMP TAD FSWITC /ADD FSWITCH SPA CLA /ARE SIGN BIT=FSWITCH? JMP I (JFAIL /NO-DO NOT JUMP JMP I (SUCJMP /YES-DO JUMP /ROUTINE TO INITIALIZE FSWITCH SETF, AC4000 AND ACH /ISOLATE SIGN OF MANTISSA DCA FSWITC /STORE IN FSWITCH JMP I [ILOOP /DONE FSWITC, 0 /ROUTINE TO RESET CHARACTER NUMBER TO 1 CNOCLR, 0 TAD I IOTHDR AND [7477 /SET CHAR BITS TO 0 DCA I IOTHDR JMP I CNOCLR /RETURN /ROUTINE TO ZERO THE CURRENT I/O BUFFER BLZERO, 0 STA TAD I IOTBUF DCA XR1 /POINT INTO THE BUFFER TAD [7400 DCA CNOBML /SET COUNT TO 400 WORDS TAD (232 /INSERT A ^Z IN THE BUFFER FIRST CDF 10 DCA I XR1 ISZ CNOBML JMP .-2 /LOOP FOR THE REST CDF JMP I BLZERO /--RETURN-- /BUMP 3 FOR 2 CHAR NUMBER FOR CURRENT FILE CNOBML, 0 TAD I IOTHDR /HEADER WORD TAD [100 /ADD 1 TO THE COUNT BITS DCA I IOTHDR JMP I CNOBML /DONE /STRING COMPARE /COMPARE SAC WITH MEMORY, BLANK EXTENDING THE /SHORTER STRING ON THE RIGHT SCOMP, DCA MODESW /SET INTERPRETER TO ARITH MODE NOW JMS I [FACCLR /TENTATIVELY ASSUME EQUAL (FAC = 0) SCOMLP, TAD STRCNT /IS THE MEMORY STRING EMPTY NOW? SNA CLA TAD L40 /PAD WITH SPACE IF YES SNA JMS I (LDB /LOAD NEXT BYTE IF NOT DCA TEMP2 TAD SACLEN /NOW IS THE SAC EMPTY SNA CLA TAD L40 /YES, PAD IT SNA TAD I SACXR /NO GET IT CLL CIA /COMPARE TO MEMORY TAD TEMP2 SZA CLA JMP SNEQ /JMP IF NOT EQUAL, L=SENSE OF COMPARE TAD STRCNT /IS MEMORY STRING DONE SZA CLA ISZ STRCNT /NO, BUMP COUNT L40, 40 /EFFECTIVE NOP TAD SACLEN /IS THE SAC EMPTY SZA CLA ISZ SACLEN /NO BUMP COUNT TAD SACLEN /GET SAC REMAINDER (SKP IF IS JUST ZERO) TAD STRCNT /ADD ARG REMAINDER SZA CLA JMP SCOMLP /LOOP IF BOTH NOT EMPTY JMP I [ILOOP /OTHERWISE EQUAL SNEQ, STA RAR DCA ACH /STORE SIGN BIT JMP I [ILOOP /--RETURN-- PAGE /STRING DATA LIST READ, STRING LOAD AND STRING CONCATENATE SRLIST, JMS I (DLREAD /FIRST READ NEG BYTE COUNT DCA STRCNT /STORE IT STL /SET LINK MEANS USE PHONY DATA LIST BYTE LOAD SKP /SKP INTO STRING LOAD ROUTINE SLOAD, CLL /CLEAR LINK TO USE NORMAL LOAD BYTE ROUTINE DCA SACLEN /CLEAR SAC LENGTH COUNTER SZL TAD (DRGCH-LDB /USE PHONY LOAD BYTE SCON1, TAD (LDB /USE REAL LDB FOR CONCATENATE DCA SCLDB TAD STRCNT SNA CLA JMP I [ILOOP /NOTHING TO DO IF NULL STRING TAD SACLEN /COMPUTE OFFSET INTO SAC CIA TAD [SAC-1 DCA SACXR /TO STORE AFTER END OF PREV STRING SEGCOM, JMS I SCLDB /GET A BYTE DCA I SACXR /STORE IT STA TAD SACLEN /NOW BUMP SIZE OF SAC DCA SACLEN TAD SACLEN /CHECK IF ROOM LEFT TAD (SACLIM SPA CLA SC, JMS I [ERROR /FATAL ERROR IF SAC OVERFLOW ISZ STRCNT JMP SEGCOM /ITERATE IF MORE JMP I [ILOOP /--RETURN-- SCLDB, 0 /ROUTINE TO GET A BYTE FROM THE DATA LIST DRGCH, 0 TAD SACLEN /TEST FOR EVEN OR ODD CLL RAR SZL CLA JMP CHR2 /SECOND CHAR JMS I (DLREAD /FIRST CHAR, READ ANOTHER WORD DCA DRCHR TAD DRCHR CLL RTR RTR RTR /SHIFT RIGHT SKP CHR2, TAD DRCHR /GET SECOND CHAR AND [77 /MASK TO 6BIT JMP I DRGCH /RETURN DRCHR, 0 /ROUTINE TO SET EOF BIT IN I/O ENTRY EOFSET, TAD I IOTHDR /HEADER CLL RTR /EOF BIT TO LINK STL RTL /SET LINK /PUT LINK IN EOF BIT DCA I IOTHDR /STORE IN I/O TABLE ENTRY JMP I [ILOOP /EOF BIT SET-ABORT TO ILOOP /SUBROUTINE MPY- 12 BIT BY 12 BIT MULTIPLY. MULTIPLIES THE CONTENTS /OF TEMP3 BY THE CONTENTS OF THE AC,LEAVING THE HI RESULT IN TEMP6 /AND THE LOW RESULT IN THE AC MPY, 0 DCA TEMP10 DCA TEMP6 TAD [-14 DCA TEMP5 MP12LP, TAD TEMP3 RAR DCA TEMP3 TAD TEMP6 SNL JMP .+3 /12 BIT MULTIPLY USED TO FIND (DIM1+1)*S2 CLL TAD TEMP10 RAR DCA TEMP6 ISZ TEMP5 JMP MP12LP TAD TEMP3 /LORD OF (DIM1+1)*S2 IN AC RAR /HORD OF (DIM1+1)*S2 IN TEMP6 JMP I MPY /RETURN /ROUTINE TO CHECK IF FILE IDLE IDLE, 0 TAD I IOTHND /GET HANDLER ENTRY SNA CLA /IS IT EMPTY? FI, JMS I [ERROR /YES-USER TRIED TO DO SOMETHING TO AN UNOPEN FILE JMP I IDLE /NO-RETURN /ROUTINE TO READ NEXT WORD IN DATALIST INTO AC DLREAD, 0 TAD DATAXR /DATA LIST POINTER CLL CMA /SET UP 12 BIT COMPARE TAD DLSTOP /ADDR OF END OF DATA LIST SNL CLA /POINTER AT END OF LIST? DA, JMS I [ERROR /YES DLCDF, . /NO-DF TO DATA LIST TAD I DATAXR /FETCH WORD FROM DATA LIST CDF JMP I DLREAD /DONE /RANDOMIZE STATEMENT FRANDM, TAD SPINNR /USE SPINNR FOR NEW SEED FOR RND(X) STL RAL /MAKE SURE SEED IS ODD DCA RSEED JMP I [ILOOP /DONE RSEED, 2713 /SUBROUTINE CR,LF CRLFR, 0 TAD [215 JMS I [PUTCH TAD (212 JMS I [PUTCH /PRINT A CR,AND LF DCA I IOTPOS /ZERO NUMBER OF CHARS PRINTED SO FAR JMP I CRLFR /SUBROUTINE FOTYPE /RETURNS TO CALL+1 IF FILE FIXED LENGTH,CALL+2 IF VARIABLE FOTYPE, 0 TAD I IOTHDR /GET HEADER AND (4 /ISOLATE TYPE BIT SZA CLA /IS IT FIXED LENGTH? ISZ FOTYPE /NO-BUMP RETURN JMP I FOTYPE /RETURN /ABS(X) FUNCTION XABSVL, JMS ABSVAL /NEGATE FAC IF NEGATIVE JMP I [ILOOP /--RETURN-- /SUBROUTINE TO TAKE ABS VALUE OF FAC ABSVAL, 0 TAD ACH SPA CLA /IS FAC<0? JMS I [FFNEG /YES-NEGATE IT JMP I ABSVAL /RETURN /ROUTINE TO RESTORE THE FAC FROM FP TEMP FACRES, 0 JMS I [FFGET /GET FAC INTERB JMP I FACRES /RETURN PAGE /STRING STORE SSTORE, TAD SACLEN SNA JMP I (SSTEX /EXIT IF NULL STRING IN SAC DCA TEMP1 /SET COUNT TAD SACLEN /SEE IF WILL FIT CIA TAD STRMAX SMA SZA CLA /SKP IF LEN.LE.MAX LEN SL, JMS I [ERROR /ERROR IF TARGET STRING TOO SMALL TAD I SACXR /PICK UP SAC BYTE JMS I (DPB /STORE IT ISZ TEMP1 JMP .-3 JMP I (SSTEX /--RETURN-- /STRING READ FROM FILE TO MEMORY SREAD, JMS I [GETCH /GET CHAR FROM FILE TAD CHAR TAD [-215 /IS IS CR? SNA JMP I (SSTEX /YES, EXIT TAD (3 /IS IT LF? SNA CLA JMP SREAD /YES, IGNORE IT TAD I (BYTCNT /SEE IF THIS CHAR WILL FIT TAD STRMAX SMA CLA JMP ST /NO, SOFT ERROR TAD CHAR /YES, STORE IT JMS I (DPB JMP SREAD ST, JMS I [ERROR TAD [215 /FAKE OUT INPUT ROUTINE DCA CHAR JMP I (SSTEX /SET STRING SIZE AND EXIT /STRING WRITE FROM SAC TO DEVICE SWRITE, DCA COMMAS TAD SACLEN /SEE IF NULL STRING SNA JMP I [ILOOP /RETURN IF SO CIA TAD I IOTPOS /ADD TO NUMBER OF CHARS PRINTED SO FAR TAD (-WIDTH SMA SZA CLA /SKP IF LE WIDTH OF LINE JMS I [CRLFR /ELSE RESET CARRAIGE TAD SACLEN DCA STRCNT /SET LOOP COUNTER TAD [SAC-1 DCA SACXR /POINT AT SAC SWRLP, TAD I SACXR TAD (240 AND [77 TAD (240 /CONVERT TO 8BIT JMS I (PUTCH ISZ STRCNT JMP SWRLP /ITERATE IF MORE JMP I [ILOOP /--RETURN-- /COMMA FUNCTION (KNOWN ONLY TO COMPILER FOR FORMATTING PRINT /STATEMENTS) COMMA, JMS I [FTYPE /SKP IF FILE IS ASCII JMP I [ILOOP /NO-COMMA FUNCTION IS A NOP TAD COMMAS /GET COMMA SWITCH SNA CLA /WAS LAST THING PRINTED A COMMA? JMP .+3 /NO-WE ARE OK TAD (" /YES-PRINT A SPACE BEFORE DOING COMMA CALCULATION JMS I [PUTCH IAC DCA COMMAS /SET COMMA SWITCH TAD (-4 DCA TEMP2 TAD I IOTPOS /GET NUMBER OF CHARS PRINTED SO FAR COMLOP, TAD (-COLWID SPA /PAST THIS ONE? JMP SLOVER /YES-SLIDE PRINT HEAD TO START OF NEXT SNA /EXACTLY ON A COLUMN? JMP I [ILOOP /YES-DONE ISZ TEMP2 /ALL MARKERS CHECKED YET? JMP COMLOP /NO-DO NEXT CLA /FALL INTO CR ROUTINE TO RESET COL TO 0 /CARRIAGE RETURN FUNCTION (KNOWN ONLY TO COMPILER FOR TERMINATING /PRINT STATEMENTS) CRFUNC, TAD I IOTHDR CLL RTR SNL CLA /SKP IF EOF IS SET JMS I [FTYPE /SKP IF FILE IS ASCII JMP I [ILOOP /WE DON'T WANT TO OUTPUT CLFR JMS I [CRLFR /DO AS WE ARE TOLD JMP I [ILOOP /NEXT INST /TAB FUNCTION TAB, JMS I [UNSFIX /FIX X TO INTEGER CIA /NEGATE TAD I IOTPOS /COMPARE DESIRED COLUMN TO REAL COLUMN IAC /BUMP BY 1 (WORD 7=COL #-1) SMA /IS X>=CURRENT COLUMN? JMP I [ILOOP /YES-THEN DO NOTHING /FALL INTO SPACE OUT ROUTINE SLOVER, DCA COLCNT /-# OF COLUMNS TO NEXT MARKER JMS I [FTYPE /IS FILE NUMERIC? JMP I [ILOOP /YES-THIS IS A NOP TAD (" /GET SPACE JMS I [PUTCH /PRINT IT ISZ COLCNT /THERE YET? JMP .-3 /NO-TYPE ANOTHER SPACE JMP I [ILOOP /YES-DONE COMMAS, 1 /SET TO 1 IF LAST PRINT WAS A COMMA MOVE COLCNT, 0 /ROUTINE TO CALL ERROR ROUTINE BY FAKING A FUNC2 CALL TO FUNCTION #10 ERROR, 0 CLA CLL IAC /ENTRY AC RANDOM AND PSFLAG /TEST IF OS/8 17600 RESIDENT SZA CLA /SKP IF NOT JMS I [PSWAP /ELSE FORCE IT OUT (THESE ERRORS ARE FATAL) TAD (7607 DCA INSAV /FAKE A FUNC CALL TO FUNC2 #10 JMP I (FUNC2I XERRRET,JMP I ERROR /RETURN TO CALLER IF NON FATAL ERROR /FLOATING NEGATE FNEGI, JMS I [FFNEG /CALL NEGATE ROUTINE JMP I [ILOOP /RETURN TO ILOOP NUMBUF, ZBLOCK 6 /6 DIGIT BUFFER USED BY FFOUT PAGE /INCREMENT AND LOAD 6BIT BYTE FROM MEMORY LDB, 0 JMS BUMP /INCREMENT POINTER AND SET DF TAD I BYTPTR /PICK UP BYTE CDF ISZ BYTSWT /TEST HALFWORD SWITCH JMP .+4 CLL RTR RTR RTR AND [77 /MASK TO 6BIT JMP I LDB /RETURN WITH CHAR IN AC /INCREMENT AND DEPOSIT BYTE IN MEMORY DPB, 0 AND [77 /MASK TO 6BIT NOW DCA BYTE JMS BUMP /INCREMENT POINTER AND SET DF TAD [77 /GET MASK ISZ BYTSWT /SKP IF PTR BUMPED CMA CML /ELSE PRESERVE LEFT HALF AND I BYTPTR /ZERO OUT TARGET BYTE DCA I BYTPTR TAD BYTE /GET BYTE SZL JMP .+4 /JMP IF NO SHIFT CLL RTL RTL RTL TAD I BYTPTR DCA I BYTPTR /STORE BYTE CDF ISZ BYTCNT /TALLY NUMBER OF BYTES STORED JMP I DPB /--RETURN-- /BUMP BYTE POINTER BUMP, 0 TAD BYTSWT /BUMP LOW ORDER BIT CLL CMA DCA BYTSWT ISZ BYTSWT /SKP IF NO CARRY ISZ BYTPTR /ELSE BUMP WORD PTR JMP BYTCDF /JMP OUT IF FIELD NOT CROSSED TAD [10 TAD BYTCDF DCA BYTCDF /PROPAGATE CARRY INTO CDF INSTR BYTCDF, 0 /GETS SET BY BYTSET TO TARGET FIELD JMP I BUMP /RETURN WITH A CLEAR LINK /BYTE LOAD/STORE INITIALIZE ROUTINE BYTSET, 0 TAD SSTEX /GET FIELD OF STRING DCA BYTCDF /STORE INLINE TAD STRPTR /NOW GET ADDR OF COUNT WORD DCA BYTPTR /STORE IAC DCA BYTSWT /SET LOW ORDER BIT TO CARRY NEXT TIME DCA BYTCNT /CLEAR DEPOSITED BYTE COUNT TAD [SAC-1 DCA SACXR /ALWAYS RETURN WITH SAC POINTER SET UP JMP I BYTSET /--RETURN-- /STRING STORE EXIT ROUTINE SSTEX, 0 /GETS SET BY STFIND TO DF OF STRING TAD BYTCNT /ENTER WITH POSITIVE LENGTH IN COUNT CIA DCA I STRPTR /STORE IN STRING JMP I [ILOOP /--RETURN-- (ILOOP RESETS DF) BYTCNT, 0 BYTPTR, 0 BYTSWT, 0 BYTE, 0 /SUBROUTINE BUFCHK-CHECKS THE POSITION OF THE BUFFER POINTER FOR /THE DEVICE WHOSE I/O TABLE ENTRY IS IN WORKING AREA. RETURNS TO CALL+1 /IF THE POINTER IS AT THE END AND CHAR NUMBER IS 1 (LAST /AVAILABLE CHAR 3 HAS BEEN USED),CALL+2 IF THE POINTER IS AT THE /END BUT THE CHAR # IS NOT 1 (THERE IS 1 CHAR 3 LEFT), CALL+3 /IF THERE IS 1 WORD LEFT IN BUFFER,CALL+4 IF MORE THAN 1 LEFT. BUFCHK, 0 TAD ENTNO /GET DEVICE # SNA CLA /IS IT TTY? TAD (62-400 /YES-CHECK FOR A BUFFER 60 WORDS LONG TAD [400 /NO-CHECK FOR A BUFFER 400 WORDS LONG TAD I IOTBUF /ADD LENGTH TO BUFFER ADDRESS CIA /-ADDR OF END OF BUFFER TAD I IOTPTR /CHECK AGAINST CURRENT POINTER SNA /IS POINTER AT END OF BUFFER? JMP EBC /AT END-CHECK THE CHAR # ISZ BUFCHK ISZ BUFCHK /NO-BUMP RETURN IAC SNA CLA /WAS POINTER AT LAST WORD? JMP I BUFCHK /YES-RETURN TO CALL+3 ISZ BUFCHK /NO JMP I BUFCHK /RETURN TO CALL+4 EBC, JMS I [CHARNO /GET CHAR # JMP I BUFCHK /IT WAS 1-RETURN TO CALL+1 NOP /IT WAS 3-RETURN TO CALL+2 ISZ BUFCHK /IT WAS 2-RETURN TO CALL+2 JMP I BUFCHK /SUBROUTINE PACKCH-PACKS ASCII CHARS,3 FOR 2, INTO BUFFER FOR THE /DEVICE IN WORK AREA. CALL WITH THE CHARACTER IN THE AC PACKCH, 0 DCA TEMP1 /SAVE JMS I [CHARNO /DETERMINE CHARACTER NUMBER SKP /1 JMP CHAR3P /3 TAD TEMP1 /1 OR 2-GET CHAR AGAIN JMS I [WRITFL /STORE IN BUFFER JMS I (CNOBML /BUMP CHARACTER NUMBER JMP I PACKCH /DONE CHAR3P, AC7776 TAD I IOTPTR /BACK BUFFER POINTER UP TO POINT TO CHAR 1 DCA I IOTPTR TAD TEMP1 /CHAR CLL RTL RTL /SLIDE LEFT HALF INTO BITS 0-3 DCA TEMP1 /SAVE TAD TEMP1 JMS COMBNE /ISOLATE LEFT HALF,COMBINE WITH CHAR1,AND PUT IN FILE TAD TEMP1 /CHAR AGAIN CLL RTL RTL /SLIDE RIGHT HALF INTO BITS 0-3 JMS COMBNE /ISOLATE RIGHT HALF,COMBINE WITH CHAR 2,AND PUT IN FILE JMS I [CNOCLR /CLEAR THE CHARACTER NUMBER (RESET IT TO 1) JMP I PACKCH /DONE COMBNE, 0 AND [7400 /ISOLATE HALF IN QUESTION DCA TEMP2 /SAVE JMS I (BCGET /GET A WORD FROM FILE BUFFER IN FIELD 1 AND [377 /FLUSH ANY SLUSH IN BITS 0-3 TAD TEMP2 /COMBINE JMS I [WRITFL /PUT IN BUFFER JMP I COMBNE /RETURN PAGE /ROUTINE TO READ WORD FROM FILE BUFFER AND BUMP POINTER READFL, 0 JMS I (FOTYPE /IS FILE VARIABLE LENGTH SKP VR, JMS I [ERROR /YES-IT IS AN ERROR TO TRY AND READ IT TAD I IOTHDR /CHECK IF MORE THERE CLL RTR /EOF BIT TO LINK SNL CLA /EOF? JMP .+3 /NO-CONTINUE RE, JMS I [ERROR /YES-ATTEMPT TO READ BEYOND EOF JMP I [ILOOP /NOT FATAL-RETURN TO I LOOP JMS BCGET /GET WORD FROM FILE BUFFER ISZ I IOTPTR /BUMP POINTER JMP I READFL /DONE /ROUTINE TO WRITE AC IN FILE BUFFER AND INCREMENT POINTER WRITFL, 0 JMS I (BCPUT /STORE AC IN FILE BUFFER ISZ I IOTPTR /BUMP POINTER TAD I IOTHDR /GET FILE HEADER WORD CLL RTR /EOF BIT TO LINK SNL CLA /WAS FILE PAST END? JMP I WRITFL /NO-RETURN WE, JMS I [ERROR /YES-ATTEMPT TO WRITE PAST END OF FILE JMP I [ILOOP /NON-FATAL RETURN TO ILOOP /ROUTINE TO GET ONE WORD FROM FILE BUFFER IN FIELD 1 BCGET, 0 JMS I [IDLE /CHECK IF FILE OPEN TAD I IOTPTR /GET READ WRITE POINTER DCA WRITFL /SAVE TAD ENTNO /GET FILE # SZA CLA /IF TTY,BUFFER FIELD IS 0 CDF 10 /DF TO BUFFER FIELD TAD I WRITFL /GET WORD FROM BUFFER CDF JMP I BCGET /RETURN /SUBROUTINE UNPACK-UNPACKS ASCII, 3 FOR 2 ,FROM THE FILE IN THE I/O /WORKING AREA. RETURNS WITH THE CHAR IN CHAR. UNPACK, 0 JMS I [CHARNO /GET CHAR # SKP /1 JMP CHAR3U /3 JMS I (CNOBML /BUMP CHAR NUMBER JMS READFL /GET CHAR AGAIN U123C, AND [177 /STRIP OFF 7 BITS SNA JMP UNPACK+1 /ZERO TAD [200 DCA CHAR /SAVE TAD CHAR TAD (-232 /IS IT CTRL/Z? SNA CLA JMP I [EOFSET /YES-SET EOF BIT JMP I UNPACK /RETURN CHAR3U, JMS I [CNOCLR /RESET CHAR # TO 1 AC7776 TAD I IOTPTR DCA I IOTPTR /BACK BUFFER POINTER UP 2 JMS READFL /GET LEFT HALF OF CHAR AND [7400 DCA XR5 /SAVE JMS READFL /GET NEXT WORD WITH RIGHT HALF AND [7400 /ISOLATE RIGHT HALF CLL RTR RTR /SLIDE RIGHT HALF OVER TAD XR5 /COMBINE WITH LEFT HALF CLL RTR RTR /MOVE TO BITS 4-11 JMP U123C /REJOIN MAINLINE /READ FUNCTION-GETS NUMBERS INTO VARIABLES READI, JMS I [FTYPE /SKP IF FILE IS ASCII JMP RIMAGE /READ NUMERIC IMAGE JMS I (FFIN /READ ASCII INTO NUMBER JMP I [ILOOP /--RETURN-- RIMAGE, JMS I [BUFCHK /YES-CHECK BUFFER POINTER NOP /PAST END-NEXT RECORD NOP /AT END-NEXT RECORD JMS I [NEXREC /ONLY 1 WORD LEFT-IT IS UNUSED IN NUMERIC FMT JMS READFL /GET WORD FROM FILE DCA ACX /STORE AS EXPONENT JMS READFL /GET WORD FROM FILE DCA ACH /STORE AS HIGH MANTISSA JMS READFL /GET WORD FROM FILE DCA ACL /STORE AS LOW MANTISSA JMP I [ILOOP /DONE /ROUTINE TO FETCH ASCII CHARACTERS FROM FILE BUFFER GETCH, 0 JMS I [FTYPE /IS FILE ASCII? SR, JMS I [ERROR /NO-ERROR TAD ENTNO SZA CLA JMP NTTY TAD TCHAR TAD [-215 SNA CLA JMS I [DRCALL NTTY, JMS I [BUFCHK /NO-CHECK STATUS OF BUFFER JMS I [NEXREC /LAST CHAR READ-NEXT RECORD NOP /CHAR 3 NOT USED YET TCHAR, 215 /NOP: CHAR 2 AND 3 LEFT JMS UNPACK /UNPACK CHAR FROM BUFFER TAD ENTNO SZA CLA JMP I GETCH /RETURN TAD CHAR DCA TCHAR JMP I GETCH /SUBROUTINE CHARNO-RETURNS TO CALL+1 IF CHAR #=1,CALL+2 IF 3,CALL+3 /IF 2 CHARNO, 0 TAD I IOTHDR /HEADER AND (300 /ISOLATE CHAR # CLL RTL RTL /CHAR # TO BITS 0,1 SMA SZA /IS IT 2? ISZ CHARNO /YES-BUMP RETURN SZA CLA /IS IT 2 OR 3? ISZ CHARNO /YES-BUMP RETURN JMP I CHARNO /RETURN PAGE /WRITE FUNCTION-PUTS NUMBERS IN FILE BUFFERS WRITEI, JMS I [FTYPE /SKP IF FILE IS ASCII JMP WIMAGE /ELSE DO IMAGE WRITE JMS I (FFOUT /CONVERT INTERNAL TO ASCII TAD XR1 CIA TAD (INTERB-1 /CALCULATE NUMBER OF CHARS STORED IN BUFFER DCA TEMP10 /SAVE TAD (INTERB-1 DCA SACXR /NOW POINT SACXR INTO BUFFER TAD TEMP10 /GET COUNT OF CHARS TO BE PRINTED CIA TAD I IOTPOS /ADD TO PRINT HEAD POSITION TAD (-WIDTH /COMPARE AGAINST "72" SMA SZA CLA /WILL THE NUMBER FIT ON THIS LINE? JMS I [CRLFR /NO-ISSUE A CR,LF CPLOOP, TAD I SACXR /GET CHAR FROM INTERMEDIATE BUFFER JMS PUTCH /PUT ON DEVICE ISZ TEMP10 /BUMP COUNTER JMP CPLOOP /NEXT TAD O240 JMS PUTCH /SEND OUT A SPACE AFTER NUMBER JMP WDONE /TAKE COMMON EXIT WIMAGE, JMS I [BUFCHK /FILE IS NUMERIC-CHECK BUFFER STATUS O240, 240 /PAST END-NEW RECORD (AND INST SERVES AS NOP) O210, 0210 /AT END-NEW RECORD (AND SERVES AS NOP) JMS I [NEXREC /ONE WORD LEFT-DON'T USE IT TAD ACX /EXPONENT JMS I [WRITFL /WRITE IN BUFFER TAD ACH /HIGH MANTISSA JMS I [WRITFL /WRITE IN BUFFER TAD ACL /LOW MANTISSA JMS I [WRITFL /WRITE IN BUFFER WDONE, DCA I (COMMAS /CLEAR COMMA SWITCH JMP I [ILOOP /WRITE IS DONE /ROUTINE TO PUT ASCII CHARS IN FILE BUFFER. IGNORES RUBOUTS. PUTCH, 0 DCA TEMP1 /SAVE CHAR TAD TEMP1 /GET CHAR AGAIN TAD (-377 SNA CLA /IS IT A RUBOUT? JMP I PUTCH /YES-RETURN JMS I [FTYPE /IS FILE NUMERIC? SW, JMS I [ERROR /YES-ERROR ISZ I IOTPOS /BUMP COULMN NUMBER TAD ENTNO /GET ENTRY # SNA CLA /IS IT TTY? JMP TOUT /YES-JUST PUT CHARS IN RING BUFFER JMS I [BUFCHK /NO-IS BUFFER FULL? JMS I [NEXREC /YES-NEXT RECORD O40, 40 /THERE IS A CHAR 3 LEFT (AND IS A NOP) O20, 20 /THERE IS A CHAR 2 AND 3 LEFT (AND IS A NOP) TAD TEMP1 /GET CHAR AGAIN JMS I [PACKCH /PUT IN BUFFER JMP I PUTCH /RETURN TOUT, TAD TEMP1 /GET CHAR JMS I [XPUTCH /PUTCH CHAR IN OUTPUT BUFFER FOR TTY JMP I PUTCH /RETURN /SUBROUTINE NEXREC-WRITES THIS BUFFER IN FILE,THEN READS IN NEXT BUFFER /IF POSSIBLE,ELSE SETS EOF BIT. IF DEVICE IS READ OR WRITE ONLY /IT JUST READS OR WRITES A BLOCK,WHICHEVER IS APPROPRIATE NEXREC, 0 TAD I IOTHDR /GET HEADER AND O20 /GET READ/WRITE ONLY BIT SNA CLA /IS IT ON? JMP FILSTR /NO-DEVICE IS FILE STRUCTURED JMS I (FOTYPE /YES-IS IT INPUT OR OUTPUT FILE? JMP RONLY JMS WRBLK RWONC, ISZ I IOTBLK JMS BLINIT /INIT FILE TABLE ENTRIES JMP I NEXREC /DONE RONLY, JMS BLREAD JMP RWONC FILSTR, JMS WRBLK /WRITE THE CURRENT BLOCK IF IT HAS BEEN CHANGED JMS BLINIT /INIT FILE TABLE ENTRIES ISZ I IOTBLK /BUMP BLOCK # TAD I IOTLOC /STARTING BLOCK CIA /NEGATE TAD I IOTBLK /SUBTRACT FROM CURRENT BLOCK FOR FILE LENGTH CLL CMA /SET UP CURRENT FILE LENGTH FOR 12 BIT COMPARE TAD I IOTLEN /COMPARE TO ACTUAL LENGTH SNL CLA /IS IT > CURRENT LENGTH? JMP LASTB /YES-EXTEND THE FILE IF IT IS OUTPUT JMS BLREAD /READ IN THE NEXT RECORD JMP I NEXREC /RETURN LASTB, JMS I (FOTYPE /IS FILE FIXED LENGTH? JMP I [EOFSET /YES-SET EOF FLAG TAD I IOTLEN /NO-GET ACTUAL LENGTH CLL CMA TAD I IOTMAX /MAXIMUM LENGTH SNL CLA /IS ACTUAL LENGTH >= MAXIMUM LENGTH? JMP I [EOFSET /YES-SET EOF BITS ISZ I IOTLEN /NO-BUMP ACTUAL LENGTH JMP I NEXREC /RETURN WITHOUT READING NEXT RECORD /ROUTINE TO READ 2 PAGES FROM DEVICE BLREAD, 0 JMS I (BLZERO TAD O210 /"READ 2 PAGES" JMS I [DRCALL /HANDLER CALL JMP I BLREAD /ROUTINE TO WRITE 2 PAGES ONTO DEVICE WRBLK, 0 TAD I IOTHDR /GET FILE HEADER AND O40 /GET FILE WRITTEN BIT SNA CLA /HAS THIS BLOCK BEEN CHANGED? JMP I WRBLK /NO-RETURN TAD (4210 /"WRITE 2 PAGES" JMS I [DRCALL /CALL TO DEVICE HANDLER JMS I (BLZERO JMP I WRBLK /ROUTINE TO INITIALIZE I/O TABLE ENTRIES AFTER READ OR WRITE BLINIT, 0 TAD I IOTBUF DCA I IOTPTR /INIT READ/WRITE POINTER TAD I IOTHDR AND (7437 /SET CHAR # TO 1 AND CLEAR BLOCK WRITTEN BIT DCA I IOTHDR JMP I BLINIT /ROUTINE TO SAVE THE FAC IN FP TEMP FACSAV, 0 JMS I [FFPUT /STORE FAC INTERB /USE INTERMEDIATE BUFFER FOR TEMP STORAGE JMP I FACSAV /RETURN PAGE ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// //////////// OVERLAY BUFFER 3400-4600 //////////////////// //////////// CONTAINS FUNCTION OVERLAYS //////////////////// //////////// AT RUN TIME //////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ////////////// OVERLAY 1-ARITHMETIC FUNCTIONS /////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// *OVERLAY /INTEGER FUNCTION /RANGE=ALL X INT, VERSON^100+SUBVAF+6000 /INITIALLY CONTAINS VERSION OF ARITH OVERLAY JMS I [FFPUT /SAVE X FPPTM1 TAD ACX /GET EXPONENT SMA SZA CLA /IS EXP<0? JMP INSC /NO-GO ON TAD ACH /YES SPA CLA /IS X<0? JMP M1R /YES-INT=-1 JMS I [FACCLR /YES-RETURN A 0 JMP I INT INSC, TAD ACH /GET HI MANTISSA SMA CLA /IS IT <0? JMP INTPOS /NO-USE FAC AS IS JMS I [FFNEG /YES-NEGATE FAC (MAKE IT POS) IAC /AND SET FLAG INTPOS, DCA TEMP3 /FLAG FOR NEGATIVE DCA TEMP5 /ZERO LORD MASK CLL CML RAR DCA TEMP4 /INITIALIZE HORD MASK TO 4000 TAD ACX CIA /- COUNT DCA TEMP2 MASKL, TAD TEMP4 CLL CML RAR /ROTATE 1'S THROUGH 3 WORD MASK DCA TEMP4 / TAD TEMP5 /UNTIL THERE IS A COUNT OF ZERO RAR DCA TEMP5 ISZ TEMP2 /DONE? JMP MASKL /NO TAD ACH /YES-MASK HORD AND TEMP4 DCA ACH TAD ACL /MASK LORD AND TEMP5 DCA ACL TAD TEMP3 /NEG FLAG SNA CLA /WAS ORIGINAL NUMER <0? JMP I INT /NO-DONE JMS I [FFPUT /SAVE INT(X) FPPTM2 JMS I (FFADD /-INT(X)+(X) FPPTM1 TAD ACH /SAVE HORD DCA TEMP3 JMS I [FACCLR /FLUSH FAC TAD TEMP3 /WAS INT(X)=X? SNA CLA JMP JUSNEG /YES-JUST NEGATE INT(X) JMS I (FFADD /NO-ADD 1 ONE JUSNEG, JMS I (FFADD /GET INT(X) FPPTM2 JNEG, JMS I [FFNEG /AND NEGATE (INT(5.3)=-6) JMP I INT /DONE M1R, JMS I [FFGET /LOAD FAC WITH 1 ONE JMP JNEG /JUST NEGATE AND RETURN ONE, 1 2000 0 /EXPONENTIATION FUNCTION /IF B=0,A^B=1 /IF A=0 AND B>0,A^B=0 /IF A=0 AND B<0,DIVIDE BY ZERO ERROR MESSAGE RESULTS AND A^B=0 /IF B=INTEGER > 0, A^B=A*A*A*.......*A /IF B=INTEGER < 0, A^B=1/A*A*A*.......*A /IF B=REAL AND A>0, A^B=EXP(B*LOG(A)) /IF B=REAL AND A<0, A FATAL ERROR RESULTS EXPON, 0 JMS I [FFPUT /SAVE A FPPTM5 JMS I [FFPUT /SET UP RUNNING PRODUCT IN CASE OF FPPTM4 /MULTIPLIES TAD ACH /HI ORDER OF A DCA EXPON /SAVE IT DCA INSAV /POINTER TO B IN SYMBOL TABLE JMS I ARGPLL /FIND B JMS I [FFGET /GET B ARGPLL, ARGPRE /LOC SKIPPED BY FPP,SO WE USE IT FOR CONSTANT CDF TAD ACH /HI ORDER OF B SNA /IS B=0? JMP I (RETRN1 /YES A^B=1 SMA CLA /IS B<0? JMP .+4 /NO TAD EXPON /YES-GET HI ORDER A SNA CLA /IS A=0? JMP I (DV /YES-DIVIDE BY ZERO ERROR TAD EXPON /B>0. IS A=0? SNA CLA JMP RET0 /YES A^B=0 JMS I [FFPUT /SAVE B FPPTM3 JMS INT /GET INT(B) JMS I (MULLIM /TEST EXPONENT OF RESULT TO LIMIT LARGE MULTIPLY LOOPS JMS I (FFSUB /INT(B)-B FPPTM3 TAD ACH /IS INT(B)-B=0? SZA CLA JMP I (USELOG /NO-USE LOGS JMS I [FFGET /NO-USE REPETITIVE MULTIPLY FPPTM3 /GET B AGAIN TAD ACH DCA EXPON /SAVE SIGN OF B JMS I (ABSVAL /!B! JMS I [FFPUT /USE ABS(B) AS MULTIPLY COUNT FPPTM3 EMLOOP, JMS I [FFGET /GET B FPPTM3 JMS I (FFSUB /B-1 ONE JMS I [FFPUT /SAVE NEW COUNT FPPTM3 TAD ACH SNA CLA /IS COUNT ZERO YET JMP I (EMDONE /YES-MULTIPLIES ARE DONE JMS I [FFGET /NO-GET RUNNING PRODUCT FPPTM4 JMS I (FFMPY /MULTIPLY BY A FPPTM5 JMS I [FFPUT /SAVE NEW RUNNING PRODUCT FPPTM4 JMP EMLOOP RET0, JMS I [FACCLR /RETURN WITH 0 IN FAC JMP I [ILOOP PAGE EMDONE, JMS I [FFGET /GET RUNNING PRODUCT FPPTM4 TAD I EXPONK /GET SIGN OF B SMA CLA /WAS IT -? JMP I [ILOOP /NO-A^B=A*A*A*...*A JMS I FIDVP /YES-INVERT ONE JMP I [ILOOP /A^B=1/A:A*A*...*A RETRN1, JMS I [FFGET ONE /SET FAC TO 1 JMP I [ILOOP USELOG, TAD I EXPONK /SIGN OF A SPA CLA /A<0? EM, JMS I [ERROR /YES-PRINT A MESSAGE JMS I [FFGET /LOAD A FPPTM5 JMS I FFLOGL /LOG(A) JMS I FMPYLV /B*LOG(A) FPPTM3 JMS I FFEXPL /EXP(B*LOG(A)) JMP I [ILOOP /DONE FFEXPL, EXPON1 FFLOGL, LOG FMPYLV, FFMPY EXPONK, EXPON FIDVP, FFDIV1 /SGN FUNCTION SGN, 0 TAD ACH /GET HIGH MANTISSA SNA /IS X=ZERO? JMP I [ILOOP /YES-THEN LEAVE IT ALONE SPA CLA /IS X>0? JMP .+3 /NO IAC /YES-SET FAC=1 SKP CMA /NO-SET FAC=-1 DCA ACX /SET UP FLOAT JMS I [FFLOAT /FLOAT VALUE OF SGN FUNCTION JMP I [ILOOP /DONE IFZERO EAE < /FLOATING SQUARE ROOT /USES A HARDWARE TYPE ALGORITHM FOR BINARY SQUARE ROOTS /REF: THE LOGIC OF COMPUTER ARITHMETIC-IVAN FLORES-P 409 / FROOT, 0 CLA CLL CML RTR /SET RESULT TO 2000;0000 DCA AN1 DCA AN2 CDF /DF TO PACKAGE FIELD TAD KM22 /SET COUNTER FOR DEVELOPING 22 BITS OF RESULT DCA AC2 /ALREADY HAVE 1 TAD ACH SNA JMP I FROOT /ZERO FAC-NORMALIZED!-RETN. SAME SPA CLA JMS I [FFNEG /TAKE ROOT OF ABSOL VALUE TAD ACX /GET EXPONENT OF FAC SPA /IF NEGATIVE-MUST PROPAGATE SIGN CML RAR /DIVIDE EXP. BY 2 DCA ACX /STORE IT BACK SZL /INCREMENT EXP. IF ORIGINAL EXP ISZ ACX /WAS ODD NOP SNL /DO A PRE-SHIFT FOR EVEN EXPONENTS JMS I AL1K /SO FIRST BIT PAIR IS 10 NOT 01 CLA CLL CMA RAL /SET COUNTER FOR DETECTING A DCA ZCNT /ZERO REMAINDER CLA CLL CML RTR /SET UP POSITION OF TRIAL BIT RTR /FOR FIRST PASS THRU LOOP DCA OPH DCA OPL TAD K6000 /GET A FAST FIRST BIT-WE KNOW TAD ACH /THIS WILL WORK SINCE # IS NORMALIZED DCA ACH /IF # IS A POWER OF TWO, AND A PERFECT TAD ACH /SQUARE-WE ARE DONE HERE! SNA /WELL IS IT? TAD ACL /COULD BE-CHECK LOW ORDER SNA CLA JMP DONE /WHOOPPEE-WE WIN BIG. JMP LOP01 /NOPE-LOOP DON'T SHIFT FIRST TIME SLOOP, TAD OPH /SHIFT TRIAL BIT 1 PLACE CLL RAR /TO THE RIGHT DCA OPH /AND STORE BACK TAD OPL RAR DCA OPL JMS I AL1K /SHIFT FAC LEFT 1 PLACE LOP01, TAD OPL /ADD TRIAL BIT TO`ANSWER TAD AN2 /SO FAR CLL CMA IAC /NEGATE IT TAD ACL /AND ADD TO FAC (REMAINDER SO FAR) SNA /IS RESULT ZERO? ISZ ZCNT /YES-INCREMENT COUNTER DCA TM /STORE RESULT IN TEMPORARY CML RAL /ADD CARRY TO HIGH ORDER FOR SUBTRACT TAD OPH /ADD TRIAL BIT TAD AN1 /ADD RESULT SO FAR (HI ORDER) CLL CMA IAC /AND SUBTRACT FROM HI ORDER FAC TAD ACH SNL /RESULT NEGATIVE? JMP GON /YES-NEXT RESULT BIT IS 0 SZA /NO-IS HI ORDER RESULT=0? JMP LOP02 /NO-GO ON ISZ ZCNT /YES-WAS LOW ORDER =0? JMP .+3 /NO-GO ON CMA /YES-REM.=0-SET COUNTER SO DCA AC2 /LOOKS LIKE WE'RE DONE LOP02, DCA ACH /STORE HIGH ORDER REM. IN FAC TAD TM /STORE LO ORDER REM. IN FAC DCA ACL TAD OPL /TRIAL BIT SHIFTED LEFT 1 IS CLL RAL /RESULT BIT-ADD IT TO ROOT DEVELOPED TAD AN2 /SO FAR DCA AN2 TAD OPH RAL TAD AN1 DCA AN1 GON, CLA CLL CMA RAL /RESET COUNTER FOR ZERO REM. DCA ZCNT ISZ AC2 /DONE ALL 23 RESULT BITS? JMP SLOOP /NO-GO ON DONE, TAD AN1 /YES-STORE ANSWER IN FAC DCA ACH /ITS NORMALIZED ALREADY TAD AN2 DCA ACL JMP I FROOT /AND RETURN K6000, 6000 ZCNT, 0 AL1K, AL1 AN1, 0 AN2, 0 KM22, -26 PAGE > IFNZRO EAE < / /FLOATING SQUARE ROOT /USES MODIFIED HARDWARE ALGORITHM FOR BINARY SQUARE ROOTS /REF: THE LOGIC OF COMPUTER ARITHMETIC-IVAN FLORES; P-409 *SGN+14 FROOT, 0 CLA CLL CML RTR /SET RESLT TO 2000,0000 DCA OPL DCA OPH SWAB /MODE B OF EAE-ALSO DOES MQL CDF DCA RBCNT /CLR. SHIFT COUNTER TAD KM22 DCA AC2 /SET COUNTER FOR 23 BITS OF RESULT TAD ACX /GET EXPONENT OF FAC ASR /DIVIDE BY 2 1 DCA ACX /STORE IT BACK DPSZ /INCREMENT EXP. IF ORIG. EXP ISZ ACX /WAS ODD NOP MQA /DETERMINE WHETHER TO DO A CLL RAL /PRE-SHIFT FOR EVEN EXPONENTS. CML RAL DCA RKNT /STORE BIT-0 OR 1 SHIFT CNT CLL CML RTR /SET UP FIRST TRIAL BIT RTR DCA AC1 DCA AC0 /STORE AWAY DCA ACNT /ZERO COUNTER DLD /GET THE FAC ACH SWP /GET IN RIGHT ORDER SNA /IS IT ZERO? (HI ORD=0) JMP I FROOT /YES-ROOT = 0 SPA /NEGATIVE? DCM /YES-TAKE ABSOL. VALUE SHL /SHIFT # 1 BIT IF EXP WAS EVEN RKNT, 0 /SO FIRST BIT PAIR IS 10 NOT 01 TAD K6000 /SUBTRACT 2000-KNOW FIRST BIT DPSZ /IS 1(NORMALIZED)-DONE?? JMP LOP1 /NO-WE MUST LOOP JMP DONE /YES-AN EASY ONE!!! LOOP, DLD /GET THE FAC ACH SHL /SHIFT FAC APPROPRIATELY 1 LOP1, DST /MUST STOR BACK IN CASE RESLT ACH /BIT IS 0 DLD /GET TRIAL BIT AC0 ASR /SHIFT THE BIT APPROPRIATELY ACNT, 0 ISZ ACNT /SHIFT 1 MORE NEXT TIME DAD /ADD IN RESULT SO FAR OPH DCM /NEGATE IT ISZ RBCNT /BUMP COUNTER FOR RESLT BIT DAD /DO THE SUBTRACT ACH SNL /RESULT NEGATIVE? JMP GON /YES-NEXT RESULT BIT = 0 DPSZ /NO-DID WE GET A ZERO REMAINDER? JMP NOTZRO /NOPE ZREM, CMA /YES-SET SO LOOKS LIKE WE'RE DONE DCA AC2 NOTZRO, DST /GOOD SUBTR.-MODIFY FAC ACH /ITS NOT CHANGED BY BAD SUBTRACT CAM /CLEAR EVERYTHING RTR ASR /SHIFT RESLT BIT TO RIGHT PLACE RBCNT, 0 DAD /ADD IT TO THE RESULT SO FAR OPH /WE APPEND IT TO RIGHT OF LAST DST /BIT OPH /STORE IT BACK GON, ISZ AC2 /DONE 23 BITS? JMP LOOP /NO-GO ON DONE, DLD /YES-GET RESULT-ITS NORMALIZED OPH DCA ACH /STORE HIGH ORDER BACK SWP DCA ACL /STORE LOW ORDER BACK JMP I FROOT /RETURN KM22, -26 K6000, 6000 PAGE > /23-BIT EXTENDED FUNCTIONS /1-31-72 R BEAN /******SINE****** SIN, 0 JMS NHNDLE /IF X<0,NEGATE X AND SET NFLAG JMS I (FFMPY /X*2/PI TOVPI JMS FRACT /SAVE X IN TEMP1,THE INTEGER PART OF X IN NUM,AND GET FRACTIONAL PART IN FAC TAD NUM /GET INTEGER PART OF (2/PI)*X AND (3 /ISOLATE BITS 10,11 TAD JMPISN DCA .+1 /MAKE JUMP TO ARGUMENT REDUCING ROUTINE JMP . /AND ADJUST ARG ACCORDING TO QUADRANT OF X JMPISN, JMP I .+1 POLYSN /X IN QUAD1,SIN(X)=SIN(X) QUAD2 /X IN QUAD2,SIN(X)=SIN(1-X) QUAD3 /X IN QUAD3,SIN(X)=SIN(-X) QUAD4 /X IN QUAD4,SIN(X)=SIN(X-1) QUAD2, JMS I (FFSUB1 /1-X ONE JMP POLYSN /CALCULATE SIN(1-X) QUAD3, JMS I [FFNEG /-X JMP POLYSN /CALCULATE SIN(-X) QUAD4, JMS I (FFSUB /X-1 ONE POLYSN, JMS I [FFPUT /SAVE X FPPTM1 JMS I (FFSQ /U=X**2 JMS I [FFPUT /SAVE U FPPTM2 JMS I (FFMPY /A7*U SINA7 JMS I (FFADD /A5+A7*U SINA5 JMS I (FFMPY /A5*U+A7*U**2 FPPTM2 JMS I (FFADD /A3+A5(U)+A7(U**2) SINA3 JMS I (FFMPY /A3(U)+A5(U**2)+A7(U**3) FPPTM2 JMS I (FFADD /A1+A3(U)+A5(U**2)+A7(U**3) SINA1 JMS I (FFMPY /A1(X)+A3(X**3)+A5(X**5)+A7(X**7) FPPTM1 JMS NCHK /IF NFLAG IS SET,SET SIN(X)=-SIN(X) JMP I SIN /FAC=SIN(X) /******COSINE****** /USES SIN ROUTINE TO CALCULATE COS(X) COS, 0 JMS I (FFADD /COS(X)=SIN(PI/2+X) PIOV2 JMS SIN JMP I COS /RETURN /ROUTINE TO SEPERATE THE INTEGER AND FRACTIONAL PARTS OF FAC /ORIGINAL FAC IS SAVED IN TEMP1,THE INTEGER PORTION OF FAC IS /SAVED AT NUM,AND THE FRACTIONAL FORTION OF THE FAC IS LEFT IN THE FAC FRACT, 0 JMS I [FFPUT /SAVE X FPPTM1 JMS I (FFIX /INTEGER PORTION OF X TAD ACX DCA NUM /SAVE FIXED FORTION OF X JMS I [FFLOAT /FAC=FLOAT(FIX(X)) JMS I (FFSUB1 /FAC=X-INT(X)=FRACTION (X) FPPTM1 JMP I FRACT /RETURN /ROUTINE TO CHECK IF FAC<0; IF IT IS,FAC IS NEGATED AND NFLAG IS /SET TO 1 NHNDLE, 0 TAD ACH /FETCH HIGH ORDER MANTISSA SMA CLA /IS IT <0? JMP NFLGST /NO-CLEAR NFLAG JMS I [FFNEG /YES-NEGATE FAC IAC /AND SET NFLAG NFLGST, DCA NFLAG JMP I NHNDLE /ROUTINE TO NEGATE FAC IF NFLAG IS NOT =0 NCHK, 0 /LOC ALSO USED FOR TEMP STORAGE TAD NFLAG SZA CLA /IS NFLAG=0? JMS I [FFNEG /NO-NEGATE FAC JMP I NCHK /YES-RETURN NUM=NCHK /******EXPONENTIAL****** EXPON1, 0 /LOC USED FOR TEMP STORAGE BY SIN,ARCTAN JMS I (FFMPY /Y=XLOG2(E) LOG2E JMS FRACT /GET FRACTIONAL PART OF Y JMS I (FFMPY /(FRACTION(Y))*(LN2/2) LN2OV2 JMS I [FFPUT /SAVE Y FPPTM1 JMS I (FFSQ /Y**2 JMS I (FFADD /B1+Y**2 EXPB1 JMS I (FFDIV1 /A1/(B1+Y**2) EXPA1 JMS I (FFADD /A0+A1/(B1+Y**2) EXPA0 JMS I (FFSUB /A0-Y+A1/(B1+Y**2) FPPTM1 JMS I [FFPUT /SAVE FPPTM2 JMS I [FFGET /GET Y FPPTM1 ISZ ACX /MULT. BY 2=2Y NOP JMS I (FFDIV /2Y/(A0-Y+A1/(B1+Y**2)) FPPTM2 JMS I (FFADD /1+2Y/(AO-Y+A1/(B1+Y**2)) ONE JMS I (FFSQ /[1+2Y/(A0-Y+A1/(B1+Y**2))]**2=EXP(Y) TAD NUM TAD ACX /EXP(X)=(2**N)(EXPY) DCA ACX JMP I EXPON1 /FAC=EXPON(X) NFLAG=EXPON1 /CONSTANT THAT WOULDN'T FIT ELSEWHERE TOVPI, 0 /.6366198 2427 6302 MULLIM, 0 TAD ACX /CHECK IF NUMBER OF MULTIPLIES IS TOO LARGE SPA CLA /RETURN IF EXPONENT IS NEGATIVE (WE'LL USE LOGS) TAD (-4 /ONLY A ROUGH ROUGH LIMIT ON THE EXPONENT SPA SNA CLA /SKP IF NUMBER GT 15 APPROX JMP I MULLIM /NO, CONTINUE JMP I (USELOG /YES, USE LOG INSTEAD PAGE /******ARC TANGENT****** ATAN, 0 JMS I NHNDLL /IF X<0,SET NFLAG AND NEGATE JMS I [FFPUT /SAVE X FPPTM1 JMS I FSUBM /X-1 ONE TAD ACH /GET HI MANTISSA SPA CLA /WAS X>1? JMP ARGPOL /NO-CLEAR GT1FLG JMS I [FFGET /YES-ATAN(X)=PI/2-ATAN(1/X) ONE JMS I FDIVM /1/X FPPTM1 JMS I [FFPUT FPPTM1 IAC /SET GT1FLG ARGPOL, DCA GT1FLG JMS I [FFGET /GET X OR 1/X FPPTM1 JMS I FSQRM /Y**2 JMS I [FFPUT /SAVE FPPTM2 JMS I FADDM /Y**2+B3 ATANB3 JMS I FDIV1M /A3/(Y**2+B3) ATANA3 JMS I FADDM /B2+A3/(Y**2+B3) ATANB2 JMS I FADDM /Y**2+B2+A3/(Y**2+B3) FPPTM2 JMS I FDIV1M /A2/(Y**2+B2+A3/(Y**2+B3)) ATANA2 JMS I FADDM /B1+A2/(Y**2+B2+A3/(Y**2+B3)) ATANB1 JMS I FADDM /Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3)) FPPTM2 JMS I FDIV1M /A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3))) ATANA1 JMS I FADDM /B0+A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3))) ATANB0 JMS I FMPYM /ATAN(Y)=X*(B0+A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3)))) FPPTM1 TAD GT1FLG /WAS X>1? SNA CLA JMP NGT /NO-TEST IF X<0? JMS I FSUB1M /ATAN(X)=PI/2-ATAN(1/X) PIOV2 NGT, JMS I NCHKL /IF NFLAG SET,NEGATE FAC JMP I ATAN /FAC=ATAN(X) NHNDLL, NHNDLE NCHKL, NCHK /******NAPERIAN LOGARITHM****** GTFLG=ATAN LOG, 0 TAD ACH SPA SNA /X<0 OR X=0? JMP I ARTRAP /YES-TAKE ILLEGAL ARGUMENT TRAP CLL RTL SNA /NO-HORD=2000? TAD ACX /YES-EXP=1? CMA IAC IAC SNA TAD ACL /YES-LORD=0? SZA CLA JMP POLYNL /NO-ARG IS LEGAL AND NOT 1 DCA ACX DCA ACL LTRPRT, DCA ACH JMP I LOG /YES-LOG(1)=0 POLYNL, TAD ACX DCA GTFLG /SAVE EXPONENT FOR LATER DCA ACX /ISOLATE MANTISSA IN FAC JMS I [FFPUT /SAVE F FPPTM1 JMS I FADDM /F+SQR(.5) SQRP5 JMS I [FFPUT /SAVE FPPTM2 JMS I [FFGET FPPTM1 JMS I FSUBM /F-SQR(.5) SQRP5 JMS I FDIVM /Z=F+SQR(.5)/F-SQR(.5) FPPTM2 JMS I [FFPUT FPPTM1 JMS I FSQRM /Z**2 JMS I [FFPUT FPPTM2 JMS I FMPYM /C5(Z**2) LOGC5 JMS I FADDM /C3+C5(Z**2) LOGC3 JMS I FMPYM /C3(Z**2)+C5(Z**4) FPPTM2 JMS I FADDM /C1+C3(Z**2)+C5(Z**4) LOGC1 JMS I FMPYM /C1(Z)+C3(Z**3)+C5(Z**5) FPPTM1 JMS I FSUBM /C1(Z)+C3(Z**3)+C5(Z**5)-1/2=LOG2(F) ONEHAF JMS I [FFPUT /SAVE LOG2(F) FPPTM2 TAD GTFLG /I DCA ACX /SET UP FLOAT JMS I [FFLOAT JMS I FADDM /I+LOG2(F) FPPTM2 JMS I FMPYM /[I+LOG2(F)]*LOGE(2)=LOGE(X) LN2 JMP I LOG /FAC=LN(X) GT1FLG=LOG FMPYM, FFMPY FADDM, FFADD FDIVM, FFDIV FDIV1M, FFDIV1 FSUBM, FFSUB FSUB1M, FFSUB1 FSQRM, FFSQ ARTRAP, LM /CONSTANTS USED BY VARIOUS FUNCTIONS SINA1, 1 /1.5707949 3110 3747 SINA3, 0 /-.64592098 5325 1167 SINA5, 7775 /.07948766 2426 2466 SINA7, 7771 /-.004362476 5610 3164 PIOV2, 1 /1.5707963 3110 3756 LOG2E, 1 /1.442695 2705 2434 LN2OV2, 7777 /.34657359 2613 4415 EXPB1, 6 /60.090191 3602 7054 EXPA1, 12 /-601.80427 5514 3104 EXPA0, 4 /12.015017 3001 7301 ATANB0, 7776 /.17465544 2626 6157 ATANA1, 2 /3.7092563 3553 1071 ATANB1, 3 /6.762139 3303 670 ATANA2, 3 /-7.10676 4344 5267 ATANB2, 2 /3.3163354 3241 7554 ATANA3, 7777 /-.26476862 5703 4040 ATANB3, 1 /1.44863154 2713 3140 SQRP5, 0 /.7071068 2650 1170 LOGC1, 2 /2.8853913 2705 2440 LOGC3, 0 /.9614706 3661 566 LOGC5, 0 /.59897865 2312 5525 ONEHAF, 0 /.5 2000 0 LN2, 0 /.6931472 2613 4415 *4500 /******FIX****** /ROUTINE TO FIX ANY FLOATING NUMBER IN FAC BETWEEN -2047 AND +2047 TO /A TWELVE BIT INTEGER AND LEAVE RESULT IN EXP (LOC 44) FFIX, 0 CLA TAD ACX /FETCH EXPONENT SZA SMA /IS NUMBER <1? JMP .+3 /NO-CONTINUE ON FTRPRT, CLA JMP FIXDNE+1 /YES-FIX IT TO ZERO TAD (-13 /SET BINARY POINT AT 11 SNA /PLACES TO RIGHT OF CURRENT POINT? JMP FIXDNE /NO-NUMBER IS ALREADY FIXED THEN. SMA /YES-IS NUMBER TOO LARGE TO FIX? JMP I (FO /YES-TAKE OVERFLOW TRAP DCA ACX /NO-SET SCALE COUNT FIXLP, CLL /0 IN LINK TAD ACH /GET HIGH MANTISSA SPA /IS IT <0? CML /YES-PUT A 1 IN LINK RAR /SCALE RIGHT DCA ACH /SAVE ISZ ACX /DONE YET? JMP FIXLP /NO FIXDNE, TAD ACH /YES-ANSWER IN AC DCA ACX /RETURN WITH ANSWER IN 44 JMP I FFIX /RETURN /******FLOAT****** /ROUTINE TO FLOAT ANY INTEGER IN EXP (LOC 44) INTO FAC FFLOAT, 0 TAD ACX DCA ACH /PUT NUMBER IN HI MANTISSA DCA ACL /CLEAR LOW MANTISSA TAD (13 /11(10) INTO EXPONENT DCA ACX JMS I [FFNOR /NORMALIZE JMP I FFLOAT /RETURN /RANDOM NUMBER GENERATOR RND, 0 TAD I (RSEED /GET SEED DCA TEMP3 /PUT IN MULTIPLY OPERAND TAD (73 JMS I [MPY /MULTIPLY SEED BY 73 DCA I (RSEED /USE LOW ORDER 12 BITS AS NEW SEED TAD I (RSEED /LOW ORDER OF PRODUCT ALSO SERVES CLL RAR /AS RANDOM NUMBER DCA ACH /SET SIGN TO 0 AND STORE AS HORD DCA ACX RAR DCA ACL /USE 12 BITS AS MANTISSA DCA AC1 /CLEAR FPP OVERFLOW JMS I [FFNOR /AND NORMALIZE JMP I [ILOOP /DONE PAGE /FLOATING POINT OUTPUT ROUTINE /CONVERT INTERNAL NUMBER TO ASCII /EXIT WITH CHAR STRING IN 'INTERB' /XR1 = POINTER TO LAST CHAR STORED FFOUT, 0 TAD (INTERB-1 DCA XR1 /SET POINTER TO ASCII BUFFER TAD ACH /SEE IF FAC NEGATIVE SMA CLA JMP OKPOS /JMP IF POSITIVE JMS I [FFNEG /TAKE ABS VALUE IF NEGATIVE TAD ("- /PRINT MINUS SIGN SKP OKPOS, TAD (240 /PRINT SPACE IF POSITIVE DCA I XR1 TAD ACH /SEE IF NUMBER IS ZERO SNA CLA JMP ZERXIT /SPECIAL CASE IF SO JMS I (CVTNUM /CALL ROUTINE TO UNPACK TO BASE 10 TAD (NUMBUF-1 DCA XR2 /POINT XR2 AT DIGIT BUFFER TAD (5 /TEST FORMAT TO USE TAD DECEXP CLL TAD (-4 SNL JMP SMLFMT /JMP IF .0NNNNNN TO .0000NNNNNN TAD (-7 SZL CLA JMP REGFMT /JMP IF .NNNNNN TO NNNNNN /OTHERWISE USE E FORMAT N.NNNNNE+NNN OR N.NNNNNE-NNN TAD I XR2 /GET DIGIT TO LEFT OF POINT JMS PUTD /PUT IT OUT TAD (". DCA I XR1 /NOW SEND OUT DECIMAL POINT TAD (-5 DCA AC2 /DO 5 MORE DIGITS TAD I XR2 /PICK UP DIGIT JMS PUTD /CONVERT TO ASCII AND STORE ISZ AC2 JMP .-3 /LOOP FOR MORE TAD ("E /PRINT E DCA I XR1 / CLL TAD DECEXP /TAKE ABS(DECEXP) SPA CML CIA DCA DECEXP RTL /CONVERT "+" TO "-" IF NEGATIVE TAD ("+ DCA I XR1 JMS IDIV /PRINT 3 DIGITS OF EXPONENT NOW -144 JMS IDIV -12 TAD DECEXP JMS PUTD JMP I FFOUT /ALL DONE --RETURN-- /HANDLE .0NNNNNN TO .0000NNNNNN SMLFMT, DCA AC0 /STORE NUMBER OF LEADING ZEROES TAD (". /PUT OUT DECIMAL POINT DCA I XR1 JMS PUTD /SEND A 0 ISZ AC0 JMP .-2 /LOOP FOR LEADING 0'S /GENERAL NON E FORMAT .NNNNNN TO NNNNNN REGFMT, TAD (-7 DCA AC1 /INIT COUNT OF NONZERO DIGITS TAD (NUMBUF+6 DCA AC2 /POINT AT END OF DIGIT BUFFER SHRINK, STA /DECREMENT DIGIT POINTER TAD AC2 DCA AC2 ISZ AC1 /REDUCE SIGNIFICANT DIGIT COUNT TAD DECEXP IAC TAD AC1 SMA CLA JMP PRTLP /JMP OUT IF NOT TO RIGHT OF DECIMAL POINT TAD I AC2 /ELSE LOOK AT DIGIT SNA CLA JMP SHRINK /DISCARD IT IF ZERO PRTLP, STA TAD DECEXP DCA DECEXP /SEE IF DIGIT TO BE PRINTED FOLLOWS DP AC0002 TAD DECEXP SZA CLA JMP NODP /NO TAD (". /YES, PRINT DP DCA I XR1 NODP, TAD I XR2 /PICK UP DECIMAL DIGIT JMS PUTD /PUT OUT ISZ AC1 JMP PRTLP /JMP IF MORE DIGITS TO PRINT JMP I FFOUT /--RETURN-- ZERXIT, JMS PUTD JMP I FFOUT /--RETURN-- /DIVIDE DECEXP BY -DIVISOR IN CALL+1 IDIV, 0 DCA AC1 /CLEAR QUOTIENT IDIVLP, TAD DECEXP TAD I IDIV SPA JMP IDVOUT /JMP OUT IF LESS THAN DIVISOR DCA DECEXP /ELSE UPDATE IT ISZ AC1 /TALLY QUOTIENT JMP IDIVLP /ITERATE IDVOUT, CLA TAD AC1 /GET QUOT AS NEXT DIGIT JMS PUTD /PUT OUT ISZ IDIV JMP I IDIV /CONVERT NUMBER IN AC TO ASCII DIGIT /MUST NOT TOUCH THE LINK PUTD, 0 TAD ("0 /ADD IN 0 DCA I XR1 /STORE IN BUFFER JMP I PUTD PAGE /CONVERT NUMBER IN FAC TO FORMAT N.NNNNNE NNN /DECIMAL EXPONENT RETURNED AS SIGNED NUMBER IN DECEXP /6 DIGITS STORED IN NUMBUF AS BINARY 0-9 /FIRST REDUCES MANTISSA TO FORM 0DD DDF FFF FFF... /BY SUCCESSIVE MULTIPLIES OR DIVIDES BY 10. FOLLOWED BY /RENORMALIZATIONS UNTIL INTIGER BITS /DDDD ARE LT 10. /DECIMAL DIGITS ARE ISOLATED BY REPEATED MULTIPLICATION BY 10. CVTNUM, 0 DCA AC1 /CLEAR OVERFLOW WORD SKP /SKP IN AND CLEAR DECIMAL EXPONENT ADJDEC, TAD DECEXP DCA DECEXP /STORE UPDATED DECIMAL EXPONENT NORML, TAD ACH /SEE IF FRACTION IS NORMALIZED RAL SPA CLA JMP NORMED /JMP IF YES JMS I (AL1 /SHIFT AC LEFT 1 BIT STA TAD ACX /COMPENSATE BINARY EXPONENT DCA ACX JMP NORML /TRY AGAIN NORMED, TAD ACX /RANGE CHECK BINARY EXPONENT NOW SMA SZA JMP DIVCHK /JMP IF NUMBER GE 1 TAD O4 DCA ACX /INCREASE BINARY EXP TOWARDS ZERO JMS AR1 /SHIFT 4 BITS RIGHT JMS AR1 /MAX RELATIVE ERROR WILL BE LT 15*2^-34 PER MULTIPLY JMS AR1 JMS AR1 JMS MPY10 /NOW MULTIPLY BY 10. STA /DECREASE DECIMAL EXPONENT JMP ADJDEC /RENORMALIZE AND TRY AGAIN DIVCHK, TAD (-5 /SEE IF EXP GT 4 SPA JMP INRANG /JMP IF NOT, NUMBER MAY BE IN RANGE DIVGO, CLA CLL TAD (-40 /SET 32. STAGE SUBTRACT-SHIFT DIVIDE (SLOW BUT ACCURATE) DCA AC2 /(THE LEN ELEKMAN TECHNIQUE) /MAX RELATIVE ERROR WILL BE LT 9*2^-34. PER DIVIDE DVLOOP, TAD ACH /SEE IF GE 10. TAD (5400 SMA DCA ACH /UPDATE IF YES CML STA RAL DCA AC0 /SAVE LOW ORDER BIT JMS I (AL1 /SHIFT MANTISSA NOW ISZ AC0 /STORE BIT NOW ISZ AC1 ISZ AC2 /BUMP COUNT JMP DVLOOP /ITERATE TAD ACH /NOW ZERO OUT REMAINDER AND [377 DCA ACH IAC /NOW INCREASE DECIMAL EXPONENT JMP ADJDEC INRANG, DCA AC2 /SET SHIFT COUNTER SKP JMS AR1 /SHIFT FAC RIGHT ISZ AC2 JMP .-2 /LEAVE EFFECTIVE BINARY POINT RIGHT OF ACH BIT 4 TAD ACH /ACH = 0DD DDF FFF FFF (D=DECIMAL DIGIT BITS) TAD (5400 /SEE IF DDDD GE 10 SMA CLA JMP DIVGO /DIVIDE AGAIN (NORMALIZATION WILL WORK) CLL TAD AC1 /NOW ROUND BY ADDING 0.000005 TAD (4761 DCA AC1 IAC /ADD 24761 TO LOW BITS RAL TAD ACL DCA ACL SZL ISZ ACH TAD ACH TAD (5400 /SEE IF CARRY INTO 9.XXX... SZA CLA JMP CVT10 /JMP IF NO TAD [200 /ELSE SET TO 1.00000 DCA ACH DCA ACL DCA AC1 ISZ DECEXP /AND BUMP DECIMAL EXPONENT O4, 4 /EFFECTIVE NOP /NOW CONVERT TO DECIMAL DIGITS CVT10, TAD (-6 /DO 6 DIGITS DCA AC0 TAD (NUMBUF-1 DCA XR3 JMP CVTGO /FIRST DIGIT IS ALREADY IN CVTLP, TAD ACH /ZERO OUT PREV DIGIT AND [177 DCA ACH JMS MPY10 /MULTIPLY BY 10. CVTGO, TAD ACH /GET DIGIT FROM 0DD DDF FFF FFF RTL RTL RTL AND [17 DCA I XR3 /STORE IT ISZ AC0 JMP CVTLP /LOOP IF MORE JMP I CVTNUM /--RETURN-- /MULTIPLY ACH,,ACL,,AC1 BY 10. MPY10, 0 TAD ACH DCA OPH /COPY AC TO OP TAD ACL DCA OPL TAD AC1 DCA AC2 JMS I (AL1 /N*2 JMS I (AL1 /N*4 JMS I (OADD /N*5 JMS I (AL1 /N*10. JMP I MPY10 /SHIFT FAC RIGHT 1 BIT AR1, 0 TAD ACH CLL RAR DCA ACH TAD ACL RAR DCA ACL TAD AC1 RAR DCA AC1 JMP I AR1 /DONE PAGE IFZERO EAE < /FLOATING POINT INPUT ROUTINE FFIN, 0 CLA CMA DCA I FDVPT /INITIALIZE PERIOD SWITCH TO -1 CMA /SET SIGN SWITCH TO -1 DCA SIGNF CDF /DF TO PACKAGE FIELD DCA DSWIT /ZERO CONVERSION SWITCH DECONV, DCA ACX /ZERO OUT THE FAC! DCA ACL P200, 200 DCA ACH DECNV, DCA DNUMBR /ZERO # OF DIGITS SINCE DEC. PT. DECON, JMS GCHR /GET A CHAR.FROM TTY. JMP FFIN1 /TERMINATOR- ISZ DSWIT /DIGIT-BUMP CONVERSION SWITCH ISZ DNUMBR /BUMP # OF DIGITS-# IS STORED IN JMS I FMPYLL /"FMPY TEN" TEN JMS I [FFPUT /"FPUT I TM3PT" FPPTM1 JMS I [FFGET /"FGET TP" TP JMS I [FFNOR /"FNOR" JMS I FADDLL /"FADD I TM3PT" FPPTM1 JMP DECON /GO ON FFIN1, ISZ I FDVPT /HAVE WE HAD A PERIOD YET? JMP FIGO2 /YES-GO ON ISZ TP1 /NO-IS THIS A PERIOD? ISZ TP1 SKP CLA JMP DECNV /YES-ZERO DIG. COUNT AFTER DEC. PT. /AND GO CONVERT REST DCA DNUMBR /NO-TERMINATOR-ZERO COUNT OF /DIGITS AFTER DECIMAL POINT. FIGO2, ISZ SIGNF /IS # NEGATIVE?(DID WE GET - SIGN?) JMS I FFNEGP /YES-NEGATE IT CLA CMA /RESET SIGN SWITCH FOR EXP. DCA SIGNF TAD CHAR /NO-WAS THE TERMINATOR AN 'E'? TAD KME SNA CLA GETE, JMS GCHR /YES-GET A CHAR. OF EXPONENT JMP EDON /END OF EXPONENT TAD TM /GOT DIG. OF EXP-STORED IN TP1 CLL RTL /MULT. ACCUMULATED EXP BY 10 TAD TM CLL RAL TAD TP1 /ADD DIGIT JMP GETE /CONTINUE EDON, TAD TM /GET EXPONENT ISZ SIGNF /WAS EXPONENT NEGATIVE? CMA IAC /YES-NEGATE IT CMA IAC /AND CALC. DNUMBR - EXPON. TAD DNUMBR /GET # TIMES TO DIV MANTISSA BY TEN CLL CMA IAC SPA /RESULT POSITIVE? CLL CMA CML IAC /NO-MAKE POS. AND SET LINK CMA /NEGATE FOR COUNTER DCA DNUMBR /AND STORE RAL /LINK=1-DIV;=0-MUL. # BY TEN TAD MDV /FORM CORRECT INSTRUCTION DCA SIGNF /AND STORE FOR EXECUTION FCNT, ISZ DNUMBR /DONE ALL OPERATIONS? JMP SIGNF /NO JMP I FFIN /YES-RETURN SIGNF, 0 /NO- MUL OR DIV. MANTISSA TEN /BY TEN JMP FCNT /GO ON FFNEGP, FFNEG DNUMBR, 0 KME, -305 MDV, JMS I .+1 /THESE 3 WDS. MUST BE IN THIS ORDER FMPYLL, FFMPY FDVPT, FFDIV /!!!!!!!!!!!!!!!!! FADDLL, FFADD KK12, 12 TP, 13 TP1, 0 0 TEN, 4 2400 0 /ROUTINE TO GET A CHAR FROM THE TTY AND SEE IF IT IS DIGIT /OR A TERMINATOR. /RETURN TO CALL + 1 IF TERMINATOR, TO CALL + 2 IF DIGIT /THIS ROUTINE MUST NOT MODIFY THE MQ!! GCHR, 0 DCA TM /STORE ACCUMULATED EXPONENT (MAYBE) JMS INPUT /GET A CHAR FROM TTY. TAD CHAR /PICK IT UP TAD PLUS /WAS IT PLUS SIGN? SNA JMP DECON1 /YES-GET ANOTHER CHAR. TAD MINUS /NO WAS IT MINUS SIGN? SZA CLA JMP .+3 DCA SIGNF /YES-FLIP SWITCH DECON1, JMS INPUT /GET A CHAR. TAD CHAR TAD K7506 /SEE IF ITS A DIGIT CLL TAD KK12 DCA TP1 /STORE FOR LATER SZL /DIGIT? ISZ GCHR /YES-RETN. TO CALL+2 JMP I GCHR /NO-RETN. TO CALL+1 K7506, 7506 / /INPUT ROUTINE-IGNORES LEADING SPACES / INPUT, 0 JMS I IGETCH /USE OUR ROUTINE TO GET CHAR TAD DSWIT /GET TERMINATOR SZA CLA /VALID INPUT YET? JMP IOUT /YES-CONTINUE TAD CHAR /NO-GET CHAR TAD M240 /COMPARE AGAINST SPACE SZA /SKP IF SPACE TAD (240-212 /COMPARE TO LF SNA CLA /IS IT A SPACE OR LF? JMP INPUT+1 /YES-IGNORE IT IOUT, JMP I INPUT /RETURN IGETCH, GETCH /POINTER TO GET CHAR ROUTINE /ALTERED BY "VAL" FUNCTION TO PICK FROM SAC (BE CAREFULL) M240, -240 PLUS, -253 MINUS, 253-255 / /ROUTINE TO DECIDE CALLING MODE IN LIEU OF "SPECIAL MODE" PROBLEMS / PATCHF, 0 SZA /IS AC EMPTY JMP RTN2 /NO-THIS IS ALWAYS SI MODE WITH ADDR IN AC TAD FF /YES-GET SPECIAL MODE FLIP-FLOP SZA CLA /IF ON,THE ZERO AC MEANS ADDRESS OF 0 RTN2, ISZ PATCHF /USE AC AS ADDRESS OF OPERAND JMP I PATCHF /RETURN PAGE / /INVERSE FLOATING SUBTRACT-USES FLOATING ADD /!!FSW1!!-THIS IS OP-FAC / FFSUB1, 0 JMS I [PATCHF /WHICH MODE? TAD I FFSUB1 /CALLED BY USER-GET ADDR. OF OP. JMS I ARGETL /GO PICK UP OPERAND CDF JMS I FFNEGA /NEGATE FAC TAD FFSUB1 /AND GO ADD JMP I SUB0P FFNEGA, FFNEG SUB0P, SUB0 / /INVERSE FLOATING DIVIDE /FSWITCH=1 /THIS IS OP/FAC / FFDIV1, 0 JMS I [PATCHF /WHICH MODE OF CALL? TAD I FFDIV1 /CALLED BY USER-GET ADDR. JMS I ARGETL /PICK UP OPERAND TAD ACL /SWAP THE FAC AND OPERAND DCA OPL /THERE IS A POINTER TO OPL TAD I AC2 /IN AC2 LEFT FROM ARGET SUBR. DCA ACL TAD ACX /MIGHT AS WELL SUBTRACT THE CLL CMA IAC /EXPONENTS HERE (SAVES A WORD) TAD OPX /THEN ZERO OPX SO WILL NOT DCA ACX /MESS UP WHEN ITS DONE AGAIN DCA OPX /LATER (SEE DIV. ROUTINE) TAD ACH DCA AC2 /NOW SWAP HIGH ORDER MANTISSAS TAD OPH DCA ACH TAD AC2 DCA OPH CDF /DF TO PACKAGE FIELD TAD FFDIV1 /NOW KLUDGE UP A SUBROUTINE LINKAGE DCA I FFDP TAD KFD1 DCA I MDSETP JMP I MD1P /GO SET UP AND DIVIDE MD1P, MD1 ARGETL, ARGET MDSETP, MDSET FFDP, FFDIV KFD1, FFD1 /MDSET-SETS UP SIGNS FOR MULTIPLY AND DIVIDE /ALSO SHIFTS OPERAND ONE BIT TO THE LEFT. /EXIT WITH EXPONENT OF OPERAND IN AC FOR EXPONENT /CALCULATION-CALLED WITH ADDRESS OF OPERAND IN AC AND /DATA FIELD SET PROPERLY FOR OPERAND. / MDSET, 0 JMS I ARGETK /GET ARGUMENT MD1, CDF /DF TO PACKAGE FIELD CLA CLL CMA RAL /SET SIGN CHECK TO -2 DCA TM TAD OPH /IS OPERAND NEGATIVE? SMA CLA JMP .+3 /NO JMS I OPNEGP /YES-NEGATE IT ISZ TM /BUMP SIGN CHECK TAD OPL /AND SHIFT OPERAND LEFT ONE BIT CLL RAL DCA OPL TAD OPH RAL DCA OPH DCA AC1 /CLR. OVERFLOW WORF OF FAC TAD ACH /IS FAC NEGATIVE SMA CLA JMP LEV /NO-GO ON JMS I FFNEGK /YES-NEGATE IT ISZ TM /BUMP SIGN CHECK NOP /MAY SKIP LEV, TAD OPX /EXIT WITH OPERAND EXPONENT IN AC JMP I MDSET FFNEGK, FFNEG OPNEGP, OPNEG ARGETK, ARGET / /CONTINUATION OF FLOATING DIVIDE ROUTINE / FD1, TAD AC2 /NEGATE HI ORDER PRODUCT CLL CMA IAC TAD ACH /COMPARE WITH REMAINDER OF FIRST DIV. SNL /WELL? JMP I DVOPSP /GREATER THAN REM.-ADJUST QUOT OF 1ST DIV. CLL /OK-DO (REM-(Q*OPL))/OPH DCA ACH /FIRST STORE ADJUSTED PRODUCT JMS I DV24P /DIVIDE BY OPH (HI ORDER OPERAND) DVL1, TAD AC1 /GET QUOT. OF FIRST DIV. SMA /IF HI ORDER BIT SET-MUST SHIFT 1 RIGHT JMP FD /NO-ITS NORMALIZED-DONE CLL ISZ ACL SKP IAC RAR DCA ACH /STORE IN FAC TAD ACL /P@ LOW ORDER RIGHT RAR DCA ACL /STORE BACK ISZ ACX /BUMP EXPONENT NOP TAD ACH JMP DVL1+1 FD, DCA ACH /STORE HIGH ORDER RESULT JMP I FDDONP /GO LEAVE DIVIDE FDDONP, FDDON /END OF FLTG. DIV. ROUTINE DV24P, DV24 /ROUTINE TO DO A 24X12BIT DIVIDE DVOPSP, DVOPS /ROUTINE TO ADJUST QUOT OF FIRST DIV. / /CONTINUATION OF ROUTINE TO ADJUST QUOT. OF FIRST DIV. /DBAD1 IS ONLY EXECUTED ON DIVIDE OVERFLOW-OTHERWISE THE /ROUTINE STARTS AT DVOP2 / DBAD1, DCA ACX /DIVIDE OVERFLO-ZERO ALL DVOP2, SNA /IS IT ZERO? DCA ACL /YES-MAKE WHOLE THING ZERO DCA ACH JMS I DV24P /DIVIDE EXTENDED REM. BY HI DIVISOR TAD ACL /NEGATE THE RESULT CLL CMA IAC DCA ACL SNL /IF QUOT. IS NON-ZERO, SUBTRACT CMA /ONE FROM HIGH ORDER QUOT. JMP DVL1 /GO TO IT PAGE /FLOATING MULTIPLY-DOES 2 24X12 BIT MULTIPLIES FFMPY, 0 JMS I [PATCHF /WHICH MODE OF CALL? TAD I FFMPY /CALLED BY USER-GET OPERAND ADDR. JMS I MDSETK /SET UP FOR MPY-OPX IN AC ON RETN. TAD ACX /DO EXPONENT ADDITION DCA ACX /STORE FINAL EXPONENT DCA DV24 /ZERO TEM STORAGE FOR MPY ROUTINE DCA AC2 TAD ACH /IS FAC=0? SNA CLA DCA ACX /YES-ZERO EXPONENT JMS MP24 /NO-MULTIPLY FAC BY LOW ORDER OPR. TAD OPH /NOW MULTIPLY FAC BY HI ORDER MULTIPLIER DCA OPL JMS MP24 TAD AC2 /STORE RESULT BACK IN FAC RTZRO, DCA ACL /LOW ORDER TAD DV24 /HIGH ORDER DCA ACH TAD ACH /DO WE NEED TO NORMALIZE? RAL SMA CLA JMP SHLFT /YES-DO IT FAST MDONE, DCA AC1 /NO-ZERO OVERFLOW WD(DO I NEED THIS???) ISZ FFMPY /BUMP RETURN POINTER ISZ TM /SHOULD RESULT BE NEGATIVE? JMP I FFMPY /NOPE-RETN. JMS I FFNEGR /YES-NEGATE IT JMP I FFMPY /RETURN SHLFT, CMA /SUBTRACT 1 FROM EXP. TAD ACX DCA ACX JMS I AL1PTR /SHIFT FAC LEFT 1 BIT JMP MDONE+1 /DONE. AL1PTR, AL1 / /24 BIT BY 12 BIT MULTIPLY. MULTIPLIER IS IN OPL /MULTIPLICAND IS IN ACH AND ACL /RESULT LEFT IN DV24,AC2, AND AC1 MP24, 0 TAD KKM12 /SET UP 12 BIT COUNTER DCA OPX TAD OPL /IS MULTIPLIER=0? SZA JMP MPLP1 /NO-GO ON DCA AC1 /YES-INSURE RESULT=0 JMP I MP24 /RETURN MPLP, TAD OPL /SHIFT A BIT OUT OF LOW ORDER MPLP1, RAR /OF MULTIPLIER AND INTO LINK DCA OPL SNL /WAS IT A 1? JMP MPLP2 /NO-0-JUST SHIFT PARTIAL PRODUCT CLL /YES-ADD MULTIPLICAND TO PARTIAL PRODUCT TAD AC2 TAD ACL /LOW ORDER DCA AC2 RAL /PROPAGATE CARRY TAD ACH /HI ORDER MPLP2, TAD DV24 RAR /NOW SHIFT PARTIAL PROD. RIGHT 1 BIT DCA DV24 TAD AC2 RAR DCA AC2 RAR /1 BIT OF OVERFLOW TO AC1 DCA AC1 ISZ OPX /DONE ALL 12 MULTIPLIER BITS? JMP MPLP /NO-GO ON JMP I MP24 /YES-RETURN / /PART OF DIVIDE ROUTINE-FFDIV MUST BE AT LOC. 6722 MP12L, DCA OPL /STORE BACK MULTIPLIET TAD AC2 /GET PRODUCT SO FAR SNL /WAS MULTIPLIER BIT A 1? JMP .+3 /NO-JUST SHIFT THE PARTIAL PRODUCT CLL /YES-CLEAR LINK AND ADD MULTIPLICAND TAD ACL /TO PARTIAL PRODUCT RAR /SHIFT PARTIAL PRODUCT-THIS IS HI ORDER DCA AC2 /RESULT-STORE BACK DVLP1, TAD OPL /SHIFT A BIT OUT OF MULTIPLIER RAR /AND A BIT OR RESLT. INTO IT (LO ORD. PROD.) ISZ FFMPY /DONE ALL BITS? JMP MP12L /NO-LOOP BACK CLL CMA IAC /YES-LOW ORDER PROD. OF QUOT. X OPL IN AC DCA ACL /NEGATE AND STORE CML RAL /PROPAGATE CARRY JMP I FD1P /GO ON FD1P, FD1 /POINTER TO REST OF DIVIDE ROUTINE / /FLOATING DIVIDE ROUTINE /USES THE METHOD OF TRIAL DIVISION BY HI ORDER FFDIV, 0 /(USED AS A TEM. BY I/O ROUTINES) JMS I [PATCHF /WHICH MODE OF CALL? TAD I FFDIV /CALLED BY USER-GET ARG. ADDR. JMS I MDSETK /GO SET UP FOR DIVIDE-OPX IN AC ON RETN. FFD1, CMA IAC /NEGATE EXP. OF OPERAND TAD ACX /ADD EXP OF FAC DCA ACX /STORE AS FINAL EXPONENT TAD OPH /NEGATE HI ORDER OP. FOR USE CLL CMA IAC /AS DIVISOR DCA OPH JMS DV24 /CALL DIV.--(ACH+ACL)/OPH TAD ACL /SAVE QUOT. FOR LATER DCA AC1 TAD KM13 /SET COUNTER FOR 12 BIT MULTIPLY DCA FFMPY /TO MULTIPLY QUOT. OF DIV. BY JMP DVLP1 /LOW ORDER OF OPERAND (OPL) / /END OF FLOATING DIVIDE-FUDGE SOME /STUFF THEN JUMP INTO MULTIPLY / FDDON, TAD FFDIV /STORE RETN. ADDR. IN MULT ROUTINE DCA FFMPY JMP MDONE /GO CLEAN UP / /DIVIDE ROUTINE--24 BITS IN ACH,ACL ARE DIVIDED BY 12 BITS /IN OPH. OPH IS ASSUMED NEGATIVE AND .GT. ACH IN ABSOLUTE VALUE /ELSE-DIVIDE OVERFLOW--WE RETURN NORMALLY WITH QUOTIENT /IN ACL AND REM. IN ACH. (AC2=0 ON RETN.) / DV24, 0 TAD ACH /CHECK THAT DIVISOR IS .GT. DIVIDEND TAD OPH /DIVISOR IN OPH (NEGATIVE) SZL CLA /IS IT? JMP I DVOVR /NO-DIVIDE OVERFLOW TAD KM13 /YES-SET UP 12 BIT LOOP DCA AC2 JMP DV1 /GO BEGIN DIVIDE DV2, TAD ACH /CONTINUE SHIFT OF FAC LEFT RAL DCA ACH /RESTORE HI ORDER TAD ACH /NOW SUBTRACT DIVISOR FROM HI ORDER TAD OPH /DIVIDEND SZL /GOOD SUBTRACT? DCA ACH /YES-RESTORE HI DIVIDEND CLA /NO-DON'T RESTORE--OPH.GT.ACH DV1, TAD ACL /SHIFT FAC LEFT 1 BIT-ALSO SHIFT RAL /1 BIT OF QUOT. INTO LOW ORD OF ACL DCA ACL ISZ AC2 /DONE 12 BITS OF QUOT? JMP DV2 /NO-GO ON JMP I DV24 /YES-RETN W/AC2=0 FFNEGR, FFNEG MDSETK, MDSET KKM12, -14 KM13, -15 DVOVR, DV PAGE / /FLOATING ADD / FFADD, 0 JMS I [PATCHF /WHICH MODE FO CALL? TAD I FFADD /CALLED BY USER-GET ADDR. OF OPR. JMS I ARGETP /PICK UP OPERAND FAD1, CDF /DF TO PACKAGE FIELD TAD OPH /IS OPERAND = 0 SNA CLA JMP DONA /YES-DONE TAD ACH /NO-IS FAC=0? SNA CLA JMP DOADD /YES-DO ADD TAD ACX /NO-DO EXPONENT CALCULATION CLL CMA IAC TAD OPX SMA SZA /WHICH EXP. GREATER? JMP FACR /OPERANDS-SHIFT FAC CMA IAC /FAC'S-SHIFT OPERAND=DIFFRNCE+1 JMS OPSR JMS ACSR /SHIFT FAC ONE PLACE RIGHT DOADD, TAD OPX /SET EXPONENT OF RESULT DCA ACX JMS OADD /DO THE ADDITION JMS I FNORP /NORMALIZE RESULT DONA, ISZ FFADD /BUMP RETURN JMP I FFADD /RETURN FACR, JMS ACSR /SHIFT FAC = DIFF.+1 JMS OPSR /SHIFT OPR. 1 PLACE JMP DOADD /DO ADDITION / /OPERAND SHIFT RIGHT-ENTER WITH POSITIVE COUNT-1 /IN AC OPSR, 0 CMA /- (COUNT+1) TO SHIFT COUNTER DCA AC0 LOP2, TAD OPH /GET SIGN BIT RAL /TO LINK CLA TAD OPH /GET HI MANTISSA RAR /SHIFT IT RIGHT, PROPAGATING SIGN DCA OPH /STORE BACK TAD OPL RAR DCA OPL /STORE LO ORDER BACK RAR /SAVE 1 BIT OF OVERFLOW DCA AC2 /IN AC2 ISZ OPX /INCREMENT EXPONENT NOP2, NOP ISZ AC0 /DONE ALL SHIFTS? JMP LOP2 /NO-LOOP JMP I OPSR /YES-RETN. / /SHIFT FAC LEFT 1 BIT / AL1, 0 TAD AC1 /GET OVERFLOW BIT CLL RAL /SHIFT LEFT DCA AC1 /STORE BACK TAD ACL /GET LOW ORDER MANTISSA RAL /SHIFT LEFT DCA ACL /STORE BACK TAD ACH /GET HI ORDER RAL DCA ACH /STORE BACK JMP I AL1 /RETN. / /SHIFT FAC RIGHT-ENTER WITH COUNT-1 IN AC (POSITIVE) / ACSR, 0 CMA /AC CONTAINS COUNT-1 DCA AC0 /STORE COUNT LOP1, TAD ACH /GET SIGN BIT OF MANTISSA RAL /SET UP SIGN PROPAGATION CLA TAD ACH /GET HIGH ORDER MANTISSA RAR /SHIFT RIGHT`1, PROPAGATING SIGN DCA ACH /STORE BACK TAD ACL /GET LOW ORDER RAR /SHIFT IT DCA ACL /STORE BACK RAR DCA AC1 /SAVE 1 BIT OF OVERFLOW ISZ ACX /INCREMENT EXPONENT NOP1, NOP ISZ AC0 /DONE? JMP LOP1 /NO-LOOP JMP I ACSR /YES-RETN-AC=L=0 / /DIVIDE OVERFLOW-ZERO ACX,ACH,ACL / DBAD, CLA CLL /NECESSARY SO WE DON'T GET OVRFLO AGAIN JMP I DBAD1P /GO ZERO ALL / /FLOATING SUBTRACT / FFSUB, 0 JMS I [PATCHF /WHICH MODE OF CALL? TAD I FFSUB /CALLED BY USER-GET ADDR. OF OP JMS I ARGETP /PICK UO THE OP. JMS OPNEG /NEGATE OPERAND TAD FFSUB /JMP INTO FLTG. ADD SUB0, DCA FFADD /AFTER SETTING UP RETURN JMP FAD1 ARGETP, ARGET *6135 / /FLOATING NEGATE / FFNEG, 0 /(USED AS A TEM. BY OUTPUT ROUTINE) TAD ACL /GET LOW ORDER FAC CLL CMA IAC /NEGATE IT DCA ACL /STORE BACK CML RAL /ADJUST OVERFLOW BIT AND TAD ACH /PROPAGATE CARRY-GET HI ORD CLL CMA IAC /NEGATE IT DCA ACH /STORE BACK JMP I FFNEG / /NEGATE OPERAND / OPNEG, 0 TAD OPL /GET LOW ORDER CLL CMA IAC /NEGATE AND STORE BACK DCA OPL CML RAL /PROPAGATE CARRY TAD OPH /GET HI ORDER CLL CMA IAC /NEGATE AND STORE BACK DCA OPH JMP I OPNEG / /ADD OPERAND TO FAC / OADD, 0 CLL TAD AC2 /ADD OVERFLOW WORDS TAD AC1 DCA AC1 RAL /ROTATE CARRY TAD OPL /ADD LOW ORDER MANTISSAS TAD ACL DCA ACL RAL TAD OPH /ADD HI ORDER MANTISSAS TAD ACH DCA ACH JMP I OADD /RETN. DBAD1P, DBAD1 FNORP, FFNOR > IFNZRO EAE < /EAE FLOATING POINT PACKAGE /FOR PDP8/E WITH KE8-E EAE / /W.J. CLOGHER / /DEFINITIONS OF EAE INSTRUCTIONS SWP= 7521 CAM= 7621 MQA= 7501 MQL= 7421 SGT= 6006 SWAB= 7431 SWBA= 7447 SCA= 7441 MUY= 7405 DVI= 7407 NMI= 7411 SHL= 7413 ASR= 7415 LSR= 7417 ACS= 7403 SAM= 7457 DAD= 7443 DLD= 7663 DST= 7445 DPIC= 7573 DCM= 7575 DPSZ= 7451 / TM= TEMP4 / /FLOATING POINT INPUT ROUTINE / PAGE FFIN, 0 CLA CMA DCA PRSW /INITIALIZE PERIOD SWITCH TO -1 CMA /SET SIGN SWITCH TO -1 DCA SIGNF CDF /CHANGE TO DF OF PACKAGE DCA DSWIT /ZERO CONVERSION SWITCH DECONV, DCA ACX /ZERO OUT THE FAC! DCA ACL DCA ACH DECNV, DCA DNUMBR /ZERO # OF DIGITS SINCE DEC. PT. DECON, JMS GCHR /GET A CHAR.FROM TTY. JMP FFIN1 /TERMINATOR- ISZ DSWIT /DIGIT-BUMP CONVERSION SWITCH ISZ DNUMBR /BUMP # OF DIGITS DCA TP1 /STORE IT IN FORM EASILY FLOATIBLE JMS I FMPYLL /MULTIPLY # BY 10 TEN JMS I [FFPUT /STORE IT AWAY FPPTM1 JMS I [FFGET /GET NEW DIGIT TP JMS I [FFNOR /FLOAT IT JMS I FADDLL /ADD IT TO THE ACCUMULATED # FPPTM1 JMP DECON /GO ON FFIN1, ISZ PRSW /HAVE WE HAD A PERIOD YET? JMP FIGO2 /YES-GO ON TAD K2 /NO-IS THIS A PERIOD? SNA CLA JMP DECNV /YES-ZERO DIG. COUNT AFTER DEC. PT. /AND GO CONVERT REST DCA DNUMBR /NO-TERMINATOR-ZERO COUNT OF /DIGITS AFTER DECIMAL POINT. FIGO2, CLA MQL /0 TO MQ FOR LATER MULTIPLY ISZ SIGNF /IS # NEGATIVE?(DID WE GET - SIGN?) JMS I FFNEGP /YES-NEGATE IT SWAB CMA /RESET SIGN SWITCH FOR EXP. DCA SIGNF TAD CHAR /NO-WAS THE TERMINATOR AN 'E'? TAD KME SNA CLA GETE, JMS GCHR /YES-GET A CHAR. OF EXPONENT JMP EDON /END OF EXPONENT MUY /GOT DIGIT OF EXP-MULT ACCUMULATED K12 /EXPONENT BY TEN AND ADD DIGIT JMP GETE /CONTINUE EDON, ISZ SIGNF /WAS EXPONENT NEGATIVE? DCM /YES-NEGATE IT CLA CLL /CLEAR AC AND LINK TAD DNUMBR /GET # TIMES TO DIV MANTISSA BY TEN SAM /SUBTRACT FROM EXPONENT CLL SPA /RESULT POSITIVE? CLL CMA CML IAC /NO-MAKE POS. AND SET LINK CMA /NEGATE FOR COUNTER DCA DNUMBR /AND STORE RAL /LINK=1-DIV;=0-MUL. # BY TEN TAD MDV /FORM CORRECT INSTRUCTION DCA FINST /AND STORE FOR EXECUTION FCNT, ISZ DNUMBR /DONE ALL OPERATIONS? JMP FINST /NO JMP I FFIN /YES-RETURN FINST, 0 /NO- MUL OR DIV. MANTISSA TEN /BY TEN JMP FCNT /GO ON FFNEGP, FFNEG PRSW, 0 DNUMBR, 0 SIGNF, 0 K2, 2 KME, -305 MDV, JMS I .+1 /THESE 3 WDS. MUST BE IN THIS ORDER FMPYLL, FFMPY FFDIV /!!!!!!!!!!!!!!!!! FADDLL, FFADD K12, 12 TP, 13 TP1, 0 0 TEN, 4 2400 0 /ROUTINE TO GET A CHAR FROM THE TTY AND SEE IF IT IS DIGIT /OR A TERMINATOR. /RETURN TO CALL + 1 IF TERMINATOR, TO CALL + 2 IF DIGIT /THIS ROUTINE MUST NOT MODIFY THE MQ!! GCHR, 0 JMS INPUT /GET A CHAR FROM TTY. TAD CHAR /PICK IT UP TAD PLUS /WAS IT PLUS SIGN? SNA JMP DECON1 /YES-GET ANOTHER CHAR. TAD MINUS /NO WAS IT MINUS SIGN? SZA CLA JMP .+3 DCA SIGNF /YES-FLIP SWITCH DECON1, JMS INPUT /GET A CHAR. TAD CHAR TAD K7506 /SEE IF ITS A DIGIT CLL TAD K12 SZL /DIGIT? ISZ GCHR /YES-RETN. TO CALL+2 JMP I GCHR /NO-RETN. TO CALL+1 K7506, 7506 PLUS, -253 MINUS, 253-255 / / /INPUT ROUTINE-IGNORES LEADING SPACES / INPUT, 0 JMS I IGETCH /USE OUR ROUTINE TO GET CHAR TAD DSWIT /GET TERMINATOR SZA CLA /VALID INPUT YET? JMP IOUT /YES-CONTINUE TAD CHAR /NO-GET CHAR TAD M240 /COMPARE AGAINST SPACE SZA TAD (240-212 /IS IT AN LF? SNA CLA /IS IT A SPACE OR LF? JMP INPUT+1 /YES-IGNORE IT IOUT, JMP I INPUT /RETURN M240, -240 IGETCH, GETCH /ALTERED BY VAL FUNCITON TO PICK FROM SAC / /ROUTINE TO DECIDE CALLING MODE IN LIEU OF "SPECIAL MODE" PROBLEMS / PATCHF, 0 SZA /IS AC EMPTY JMP RTN2 /NO-THIS IS ALWAYS SI MODE WITH ADDR IN AC TAD FF /YES-GET SPECIAL MODE FLIP-FLOP SZA CLA /IF ON,THE ZERO AC MEANS ADDRESS OF 0 RTN2, ISZ PATCHF /USE AC AS ADDRESS OF OPERAND JMP I PATCHF /RETURN / PAGE / /FLOATING SUBTRACT-USES FLOATING ADD /FSW1!! FFSUB1, 0 JMS I [PATCHF /WHICH MODE? TAD I FFSUB1 /CALLED BY USER-GET ADDR. OF OP JMS I ARGETL /PICK UP ARGUMENT CDF JMS I FFNEGA /NEGATE FAC! TAD FFSUB1 JMP I SUB0P FFNEGA, FFNEG SUB0P, SUB0 / /FLOATING DIVIDE /FSWITCH=1 /THIS IS OP/FAC / FFDIV1, 0 JMS I [PATCHF /WHICH MODE OF CALL? TAD I FFDIV1 /CALLED BY USER-GET ADDR. JMS I ARGETL /(INTERP.)-GET OPRND.-ADDR. IN AC CDF /CDF TO FIELD OF PACKAGE TAD ACH /SWAP FAC AND OPRND-OPH IN MQ! DCA OPH /STORE ACH IN OPH TAD ACX /GET EXP OF FAC SWP /OPH TO AC, ACX TO MQ DCA ACH /STORE OPH IN ACH TAD OPX /STORE OPX IN ACX DCA ACX TAD OPL /OPL TO MQ, ACX TO AC SWP DCA OPX /STORE ACX IN OPX TAD ACL DCA OPL /STORE ACL IN OPL TAD OPH /OPH TO MQ FOR LATER SWP DCA ACL /STORE OPL IN ACL TAD FFDIV1 /SET UP SO WE RETN TO DCA I FFDP /NORMAL DIVIDE ROUTINE TAD FD1 DCA I MDSETP JMP I MD1P /GO ARRANGE OPERANDS MD1P, MD1 ARGETL, ARGET MDSETP, MDSET FFDP, FFDIV FD1, FFD1 /PATCH TO EAE ADD ROUTINE ADDPCH, 0 TAD AC1 TAD RB4000 DPSZ JMP ADDP1 CLL CML RTR ISZ ACX NOP ADDP1, TAD RB4000 JMP I ADDPCH RB4000, 4000 / PTCHAD, CDF TAD OPH SNA CLA /OPERAND ZERO JMP I JADON /YES TAD ACH /FAC ZERO SZA CLA JMP I JFAD1 /NO TAD OPX DCA ACX TAD OPH DCA ACH TAD OPL DCA ACL JMP I JADON JADON, ADON JFAD1, FAD1 / /FLOATING MULTIPLY--DOES 4 SINGLE MULTIPLIES WITH EAE /THIS USES THE FACT THAT IF AC IS NON-ZERO WHEN YOU DO /A MUY INSTR, THE AC IS ADDED TO RESULT OF THE MULTIPLY. /(IN THE LOW ORDER, NATCHERLY) PAGE FFMPY, 0 JMS I [PATCHF /WHICH MODE? TAD I FFMPY /CALLED BY USER-GET ADDRESS JMS MDSET /SET UP FOR MULT CLA MUY /MULTIPLY-LOW ORDER FAC STILL IN MQ OPH /THIS IS PRODUCT OF LOW ORDERS MQL /ZAP LOW ORDER RESULT-INSIGNIFICANT TAD ACH /GET LOW ORDER(!) OF FAC SWP MUY /TO MQ-HIGH ORD. RESLT OF LAST MPY OPL /TO AC-WILL BE ADDED TO RESLT-THIS DST /IS PRODUCT-LOW ORD FAC,HI ORD OP AC0 /STORE RESULT DLD /HIGH ORDER FAC TO MQ, OPX TO AC ACL TAD ACX /ADD FAC EXPONENT-GET SUM OF EXPS. DCA ACX /STORE RESULT MUY /MUL. HIGH ORDER FAC BY LOW ORD OP. OPH /HIGH ORDER FAC WAS IN MQ DAD /ADD IN RESULT OF SECOND MULTIPLY AC0 DCA ACH /STORE HIGH ORDER RESULT TAD ACL /GET HIGH ORDER FAC SWP /SEND IT TO MQ AND LOW ORD. RESULT DCA AC0 /OF ADD TO AC-STORE IT RAL /ROTATE CARRY TO AC DCA ACL /STORE AWAY MUY /NOW DO PRODUCT OF HIGH ORDERS OPL /FAC HIGH IN MQ, OP HIGH IN OPL DAD /ADD IN THE ACCUMULATED # ACH SNA /ZERO? JMP RTZRO /YES-GO ZERO EXPONENT NMI /NO-NORMALIZE (1 SHIFT AT MOST!) DCA ACH /STORE HIGH ORDER RESULT CLA SCA /GET STEP CNTR-DID WE NEED A SHIFT? SNA CLA JMP SNCK /NO-JUST CHECK SIGN CLA CMA /YES-MUST DECREASE EXP. BY 1 TAD ACX RTZRO, DCA ACX /STORE BACK TAD AC0 SPA CLA /IS HIGH ORDER OF OVERFLO WD. 1? DPIC /YES-ADD 1 TO LOW ORDER-STILL IN MQ SNCK, ISZ MSIGN /RESULT NEGATIVE? JMP MPOS /NO-GO ON TAD ACH /YES-GET HIGH ORDER BACK DCM /LOW ORDER STILL IN MQ-NEGATE DCA ACH /STORE HIGH ORDER BACK MPOS, SWP /LOW ORDER TO AC DCA ACL /STORE AWAY ISZ FFMPY /BUMP RETURN JMP I FFMPY /RETIRN MSIGN, 0 ARGETK, ARGET DVOFL, DV / /ROUTINE TO SET UP FOR MULTIPLY AND DIVIDE / MDSET, 0 JMS I ARGETK /GET OPERAND (ADDR. IN AC) CDF /CHANGE TO DATA FIELD OF PACKAGE MD1, CLA CLL CMA RAL /MAKE A MINUS TWO DCA MSIGN /AND STORE IN MSIGN. TAD OPL /GET LOW ORDER MANTISSA OF OP. SWP /GET INTO RIGHT ORDER ( OPH IN MQ) SMA /NEGATIVE? JMP .+3 /NO DCM /YES-NEGATE IT ISZ MSIGN /BUMP SIGN COUNTER SHL /SHIFT OPRND LEFT 1 TO AVOID OVRFLO 1 DST /STORE BACK-OPH CONTAINS LOW ORDER OPH / OPL CONTAINS HIGH ORDER DLD /GET THE MANTISSA OF THE FAC ACH SWP /MAKE IT CORRECT ORDER SMA /NEGATIVE? JMP FPOS /NO DCM /YES-NEGATE IT ISZ MSIGN /BUMP SIGN COUNTER (MAY SKIP) NOP FPOS, DST /STORE BACK-ACH CONTAINS LOW ORDER ACH / ACL CONTAINS HIGH ORDER JMP I MDSET /RETURN / /FLOATING DIVIDE / *5722 FFDIV, 0 JMS I [PATCHF /WHICH MODE? TAD I FFDIV /CALLED BY USER-GET ARG. ADDRESS JMS MDSET /GET ARG. AND SET UP SIGNS FFD1, DVI /DIVIDE-ACH AND ACL IN AC,MQ OPL /THIS IS HI (!) ORDER DIVISOR DST /QUOT TO AC0,REM TO AC1 AC0 SZL CLA /DIVIDE ERROR? JMP I DVOFL /YES-HANDLE IT TAD OPX /DO EXPONENT CALCULATION CMA IAC /EXP. OF FAC - EXP. OF OP TAD ACX DCA ACX DPSZ /IS QUOT = 0? SKP /NO-GO ON DCA ACX /YES-ZERO EXPONENT DVLP, MUY /NO-THIS IS Q*OPL*2**-12 OPH DCM /NEGATE IT TAD AC1 /SEE IF GREATER THAN REMAINDER SNL JMP I DVOPSP /YES-ADJUST FIRST DIVIDE DVI /NO-DO Q*OPL*2**-12/OPH OPL SZL CLA /DIV ERROR? JMP I DVOFL /YES DVLP1, TAD AC0 /NO-GET QUOT OF FIRST DIV. SMA /NEGATIVE? JMP .+5 /NO-REMEMBER-QUOT OF 2ND DIV. IN MQ LSR /YES-MUST SHIFT IT RIGHT 1 1 ISZ ACX /ADJUST EXPONENT NOP ISZ MSIGN /SHOULD SIGN BE MINUS? SKP /NO DCM /YES-DO IT DBAD1, DCA ACH /STORE IT BACK SWP DCA ACL ISZ FFDIV JMP I FFDIV /BUMP RETN. AND RETN. DVOPSP, DVOPS DBAD, CAM DCA ACX /ZERO EXPONENT JMP DBAD1 /GO ZERO MANTISSA /FLOATING ADDITION-IN ORDER NOT TO LOSE BITS, WE DO NOT /SHIFT BOTH NUMBERS RIGHT 1 BIT BEFORE ADD-ONLY SHIFTS DONE /ARE TO ALIGN EXPONENTS. / PAGE FFADD, 0 JMS I [PATCHF /WHICH MODE OF CALLING TAD I FFADD /CALLED DIRECTLY BY USER JMS I ARGETP /PICK UP ARGUMENTS JMP I PATCHK /CHECK FOR ADDITION BY ZERO FAD1, TAD OPX /PICK UP EXPONENT OF OPERAND MQL /SEND IT TO MQ FOR SUBTRACT TAD ACX /GET EXPONENT OF FAC SAM /SUBTRACT-RESULT IN AC SPA /NEGATIVE RESULT? CMA IAC /YES-MAKE IT POSITIVE DCA CNT /STORE IT AS A SHIFT COUNT TAD CNT /COUNT TOO BIG?(CAN'T BE ALIGNED) TAD M27 SPA SNA CLA CMA /NO-OK DCA AC0 /YES-MAKE IT A LOAD OF LARGEST # DLD /GET ADDRESSES TO SEE WHO'S SHIFTED ADDRS SGT /WHICH EXP GREATER(GT FLG SET /BY SUBTR. OF EXPS.) SWP /OPERAND'S-SHIFT THE FAC DCA SHFBG /STORE ADDRESS OF WHO GETS SHIFTED SWP /GET ADDRESS OF OTHER (0 TO MQ) DCA DADR /THIS ONE JUST GETS ADDED SGT /WHICH EXPONENT WAS GREATER? JMP .+3 /FAC'S - DO NOTHING TAD OPX /OPERAND'S-PUT FINAL EXP. IN ACX DCA ACX DLD /GET THE LARGER # TO AC,MQ DADR, 0 SWP /PUT IN THE RIGHT ORDER ISZ AC0 /COULD EXPONENTS BE ALIGNED? JMP LOD /NO-JUST LEAVE LARGER IN AC,MQ DST /YES-STORE THIS TEMPORARILY AC0 /(IF ONLY FAC STORAGE WAS REVERSED) DLD /GET THE SMALLER # SHFBG, 0 SWP /PUT IT IN RIGHT ORDER ASR /DO THE ALIGNMENT SHIFT CNT, 0 DAD /ADD THE LARGER # AC0 DST /STORE RESULT AC0 SZL /OVERFLOW?(L NOT = SIGN BIT) CMA /NOTE-WE DIDN'T SHIFT BOTH RIGHT 1 SMA CLA JMP NOOV /NOPE CLA CLL CML RAR /MAYBE-SEE IF 2 #S HAD SAME SIGN AND ACH TAD OPH SMA CLA /SIGNS ALIKE? JMP OVRFLO /YES-OVERFLOW NOOV, JMS I ADDPCL /JUMP TO PATCH FOR THIS ROUTINE LOD, NMI /NORMALIZE (LOW ORDER STILL IN MQ) DCA ACH /STORE FINAL RESULT SWP /GET AND STORE LOW ORDER DCA ACL SCA /GET SHIFT COUNTER(# OF NMI SHIFTS) CMA IAC /NEGATE IT TAD ACX /AND ADJUST FINAL EXPONENT DCA ACX ADON, ISZ FFADD /BUMP RETURN PAST ADDRESS JMP I FFADD /RETURN OVRFLO, TAD AC1 /OVERFLOW-GET HIGH ORDER RESLT BACK ASR /SHIFT IT RIGHT 1 1 TAD KK4000 /REVERSE SIGN BIT DCA ACH /AND STORE SWP DCA ACL /STORE LOW ORDER ISZ ACX /BUMP EXPONENT NOP JMP ADON /DONE KK4000, 4000 M27, -27 ADDRS, OPH ACH ARGETP, ARGET /FLOATING SUBTRACT-USES FLOATING ADD /FSW0!! FFSUB, 0 JMS I [PATCHF /WHICH MODE? TAD I FFSUB /CALLED BY USER-GET ADDRESS OF OP. JMS I ARGETP CDF TAD OPL /OPH IS IN MQ! SWP /PUT IT IN RIGHT ORDER DCM /NEGATE IT DCA OPH /STORE BACK MQA DCA OPL TAD FFSUB /GO TO ADD SUB0, DCA FFADD JMP FAD1-1 / /FLOATING NEGATE--NEGATE FLOATING AC / FFNEG, 0 SWAB /MUST BE MODE B DLD /GET MANTISSA ACH SWP /CORRECT ORDER PLEASE! DCM /NEGATE IT DCA ACH /RESTORE SWP /SEND 0 TO MQ DCA ACL JMP I FFNEG / /CONTINUATION OF DIVIDE ROUTINE /WE ARE ADJUSTING THE RESULT OF THE /FIRST DIVIDE. / DVOPS, CMA IAC DCA AC1 /ADJUST REMAINDER TAD OPL /WATCH FOR OVERFLOW CLL CMA IAC TAD AC1 SNL JMP DVOP1 /DON'T ADJUST QUOT. DCA AC1 CMA TAD AC0 DCA AC0 /REDUCE QUOT BY 1 DVOP1, CLA CLL TAD AC1 /GET REMAINDER SNA /ZERO? CAM /YES-ZERO EVERYTHING DVI /NO OPL SZL CLA /DIV. OVERFLOW? JMP I DVOVR /YES DCM /NO-ADJUST HI QUOT (MAYBE) JMP I DVLP1P /GO BACK DVLP1P, DVLP1 DVOVR, DV ADDPCL, ADDPCH PATCHK, PTCHAD > PAGE /ARGUMENT PICK UP ROUTINE-ENTER WITH DATA FIELD SET TO EITHER /FLTG. DATA FIELD OR FLTG. INSTR. FIELD. /ADDRESS OF OPERAND IS IN THE AC ON ENTRY. /ON RETURN, THE`AC IS CLEAR / ARGET, 0 DCA AC2 /STORE ADDRESS OF OPERAND TAD I AC2 /PICK UP EXPONENT DCA OPX JMS ISZAC2 /MOVE POINTER TO HORD,WATCH FOR FIELD OVERLAP TAD I AC2 /PICK IT UP IFZERO EAE < NOP NOP > IFNZRO EAE < SWAB /OPH INTO MQ BECAUSE EAE ROUTINES MQA /EXPECT TO FIND IT THERE > DCA OPH /STORE JMS ISZAC2 /MOVE POINTER TO LORD,WATCHING FOR OVERLAP TAD I AC2 /PICK IT UP DCA OPL /STORE IT JMP I ARGET /RETURN IFZERO EAE < / /ROUTINE TO NORMALIZE THE FAC / FFNOR, 0 TAD ACH /GET THE HI ORDER MANTISSA SNA /ZERO? TAD ACL /YES-HOW ABOUT LOW? SNA TAD AC1 /LOW=0, IS OVRFLO BIT ON? SNA CLA JMP ZEXP /#=0-ZERO EXPONENT NORMLP, AC2000 /NOT 0-MAKE A 2000 IN AC TAD ACH /ADD HI ORDER MANTISSA SZA /HI ORDER = 6000 JMP .+3 /NO-CHECK LEFT MOST DIGIT TAD ACL /YES-6000 OK IF LOW=0 SZA CLA SPA CLA /2,3,4,5,ARE LEGAL LEFT MOST DIGS. JMP FFNORR /FOR NORMALIZED #-(+2000=4,5,6,7) JMP FNLP /JUMP SO FFGET AND PUT ARE ORGED RIGHT FFNORR, DCA AC1 /DONE W/NORMALIZE-CLEAR AC1 JMP I FFNOR /RETURN AL1P, AL1 > IFNZRO EAE < / /ROUTINE TO NORMALIZE THE FAC / *6215 FFNOR, 0 CDF /CHANGE D.F. TO FIELD OF PACKAGE SWAB /FORCE MODE B DLD /PICK UP MANTISSA ACH SWP /PUT IT IN CORRECT ORDER NMI /NORMALIZE IT SNA /IS THE # ZERO? DCA ACX /YES-INSURE ZERO EXPONENT DCA ACH /STORE HIGH ORDER BACK SWP /STORE LOW ORDER BACK DCA ACL CLA SCA /STEP COUNTER TO AC CMA IAC /NEGATE IT TAD ACX /AND ADJUST EXPONENT DCA ACX JMP I FFNOR /RETURN > /FLOATING GET *6241 FFGET, 0 JMS I [PATCHF /WHICH MODE OF CALL TAD I FFGET /CALLED BY USER-GET ADDR. OF OP JMS ARGET /PICK UP OPERAND TAD OPX DCA ACX /LOAD THE OPERAND INTO FAC TAD OPL DCA ACL TAD OPH DCA ACH ISZ FFGET CDF JMP I FFGET /RETN. TO CALL +2 / /FLOATING PUT / FFPUT, 0 JMS I [PATCHF /WHICH MODE OF CALL? TAD I FFPUT /CALLED BY USER-GET OPR. ADDR DCA FFGET /STORE IN A TEMP TAD ACX /GET FAC AND STORE IT DCA I FFGET /AT SPECIFIED ADDRESS JMS ISZFGT /BUMP POINTER,WATCHING FOR FIELD OVERLAP TAD ACH DCA I FFGET JMS ISZFGT TAD ACL DCA I FFGET ISZ FFPUT /BUMP RETN. CDF JMP I FFPUT /RETN. TO CALL+2 /ROUTINES TO BUMP ARGET AND FPUT POINTERS AND INCREMENT THE /DATA FIELD IF THE POINTER CROSSES A FIELD BOUNDARY ISZFGT, 0 ISZ FFGET /BUMP POINTER JMP I ISZFGT /NO SKIP MEANS JUST RETURN SKP /SKIP MEANS WE HAVE TO INCREMENT DATA FIELD NEWCDF, DCA ISZFGT /THIS INST EXECUTED ONLY BY ISZAC2 RDF /GET THE DATA FIELD TAD CDF10 /BUMP BY 1 AND MAKE A CDF DCA .+1 /PUT IN LINE . JMP I ISZFGT /RETURN CDF10, CDF 10 ISZAC2, 0 ISZ AC2 /BUMP POINTER JMP I ISZAC2 /NOTHING HAPPENED TAD ISZAC2 /NEED NEW DF. GET RETURN ADDR JMP NEWCDF /AND BUMP DF IFZERO EAE < / /ROUTINE TO ADJUST QUOTINET OF FIRST DIVIDE (MAYBE) WHEN THE /REMAINDER OF THE FIRST`DIVIDE IS LESS THAN QUOT*OPL /USED BY FLTG. DIVIDE ROUTINE / DVOPS, CMA IAC /NEGATE AND STORE REVISED REMAINDER DCA ACH CLL TAD OPH TAD ACH /WATCH FOR OVERFLOW SNL JMP DVOP1 /OVERFLOW-DON'T ADJUST QUOT. OF 1ST DIV. DCA ACH /NO OVERFLOW-STORE NEW REM. CMA /SUBTRACT 1 FROM QUOT OF TAD AC1 /FIRST DIVIDE DCA AC1 DVOP1, CLA CLL TAD ACH /GET HI ORD OF REMAINDER JMP I DVOP2P /GO ON DVOP2P, DVOP2 FNLP, CLL CML CMA /-1 TAD ACX /SUBTR. 1 FROM EXPONENT DCA ACX JMS I AL1P /SHIFT FAC LEFT 1 JMP NORMLP /GO BACK AND SEE IF NORMALIZED ZEXP, DCA ACX JMP FFNORR > / /FSQUARE-SQUARE FAC-CALLS MULTIPLY TO MUL. FAC BY ITSELF / *6347 A, FFSQ, 0 JMS I TMPY /CALL MULTIPLY TO MULTIPLY ACX /FAC BY ITSELF JMP I FFSQ /DONE TMPY, FFMPY / / ERROR TRAPS O0, JMS I [ERROR /OVERFLOW DV, JMS I [ERROR /DIVISION ERROR JMS I [FACCLR /RETURN 0 IN FAC JMP I [ILOOP LM, JMS I [ERROR /ILLEGAL ARGUMENT PAGE *OVERLAY+3000 /TELETYPE "DRIVER"-WHEN CALLED,GRABS CHARACTERS FROM THE /TELETYPE UNTIL A CR IS SENT OR THE BUFFER IS FULL. ASSUMES TTY ENTRY /IS IN I/O WORK AREA. TTYDRI, 0 JMP LFLUSH+1 IO, JMS I [ERROR LFLUSH, JMS I [CRLFR /PRINT A CR,LF TAD K277 /PRINT A ? SIGNIFYING WAIT FOR INPUT JMS I [XPUTCH TAD I IOTBUF /BUFFER ADDRESS DCA I IOTPTR /INITIALIZE POINTER TO START OF BUFFER JMS I [CNOCLR /INITIALIZE CHAR # TO 1 TTYIN, JMS I [XPRINT /EMPTY TTY BUFFER BEFORE AWAITING INPUT JMP .-1 TAD I (HEIGHT /ALWAYS RESET SCREEN HIEGHT ON INPUT DCA I (HCTR TAD K5252 /DESIGN INTO AC KSFA, KSF /CHAR READY? JMP SPIN /NO-DIDDLE WHILE WE WAIT CLA CLL /FLUSH SPINNER OUT OF AC TAD [200 /FORCE PARITY BIT KRS /GET CHAR DCA CHAR /SAVE TAD CHAR JMS I [XPUTCH /ECHO IT KCC /CLEAR KEYBOARD FLAG AND SET READER RUN TAD CHAR TAD MCTRLU /IS IT CTRL/U? SNA CLA JMP LFLUSH /YES-START AGAIN TAD CHAR /NO TAD CRUBOT /IS IT RUBOUT? SNA JMP BACKUP /YES-BACK UP BUFFER POINTER TAD MCR /NO-IS IT CR? SNA CLA JMP CR /YES-DONE TAD CHAR JMS I [PACKCH /PACK CHAR IN BUFFER JMS I [BUFCHK /BUFFER FULL? JMP IO /YES-ERROR NOP /NO-CHAR 3 LEFT NOP /NO-2 AND 3 LEFT JMP TTYIN /NO-NEXT CHAR MCTRLU, -225 MCR, 377-215 CRUBOT, -377 K5252, 5252 K277, 277 BACKUP, TAD I IOTPTR /BUFFER POINTER CIA /NEGATE TAD I IOTBUF /COMPARE AGAINST START OF BUFFER SNA CLA /BUFFER EMPTY? JMP TTYIN /YES-THERE IS NOTHING TO RUBOUT TAD SCOPFG /TEST IF CONSOLE IS A SCOPE SNA CLA JMP NOSCOP /JMP IF NOT TAD (10 JMS I [XPUTCH /PRINT BS,SP,BS TO RUBOUT IF SCOPE TAD (40 JMS I [XPUTCH TAD (10 SKP NOSCOP, TAD K334 JMS I [XPUTCH /ECHO "\" JMS I [CHARNO /GET CHAR # OF NEXT CHAR (LAST #+1) JMP C1B /1 JMP C3B /3 JMS I [CNOCLR /IT WAS 2-MAKE IT 1 PBACK, CLA CMA /-1 TAD I IOTPTR /BACK UP BUFFER POINTER DCA I IOTPTR JMP TTYIN /NEXT CHAR K334, 334 C1B, TAD I IOTHDR AND [7477 TAD [200 /IT WAS 1-MAKE IT 3 DCA I IOTHDR JMP TTYIN /NO NEED TO BACK UP POINTER C3B, TAD I IOTHDR AND [7477 TAD [100 /IT WAS 3,MAKE IT 2 DCA I IOTHDR JMP PBACK /BACK UP POINTER CR, JMS I [CRLFR /ECHO A CR,LF TAD K4 TAD TTYDRI /BUMP DRIVE RETURN TO NORMAL DCA TTYDRI TAD CHAR JMS I [PACKCH /PACK CHAR IN BUFFER TAD I IOTBUF DCA I IOTPTR /INITAILZE BUFFER POINTERS JMS I [CNOCLR JMP I TTYDRI /RETURN K4, 4 SPIN, ISZ SPINNR /SPIN RANDOM # SEED SKP CMA CML RAL /MARCH TO THE LEFT JMP KSFA /CHECK FOR CHAR YET SCOPFG, 0 /GETS SET TO SCOPE FLAG BY STARTUP CODE /SUBROUTINE FBITGT-ROUTINE TO PUT FUNCTION BITS FROM INSTRUCTION INTO AC FBITGT, 0 TAD INSAV CLL RTR RTR /PUT FUNCTION BITS IN BITS 8-11 AND [17 /MASK THEM OFF JMP I FBITGT /RETURN /DATA LIST READ (NUMERIC) RDLIST, JMS I (DLREAD /FETCH WORD FROM LIST DCA ACX /STORE AS EXPONENT JMS I (DLREAD DCA ACH /HIGH MANTISSA JMS I (DLREAD DCA ACL /LOW MANTISSA JMP I [ILOOP /SUBROUTINE FTYPE-RETURNS TO CALL+1 IF FILE NUMERIC,CALL+2 IF ASCII FTYPE, 0 TAD I IOTHDR /GET HEADER CLL RAR /TYPE TO LINK SZL CLA /IS IT NUMERIC? ISZ FTYPE /NO-BUMP RETURN JMP I FTYPE /RETURN PAGE /LAST PAGE OF BRTS-CONTAINS SAC,I/O TABLE, AND SOME MISCELLANEOUS CODE /TELETYPE INPUT BUFFER (74. CHARACTERS LONG) /THIS BUFFER CONTAINS ONCE ONLY START CODE WHEN LOADED TTYBUF, START4, TAD CDFPS /DF FOR BOTTOM OF PSEUDO-CODE TAD MCDF1 /COMPARE TO A CDF 10 SZA CLA /DO THEY MATCH? JMP I [ILOOP /NO-ALL BUFFERS ARE FREE-START INTERPRETER TAD PSSTRT CLL CMA TAD [400 SNL CLA /IS START OF PSEUDO-CODE BELOW 400 JMP CHKB2 /NO-CHECK FOR 1000 TAD [17 /YES-SET ALL BUFFERS BUSY JMP BAS CHKB2, TAD PSSTRT CLL CMA TAD C1000 SNL CLA /IS START OF PSEUDO-CODE BELOW 1000 JMP CHKB3 /NO-CHECK 1400 TAD C16 /YES-ONLY BUFFER 1 IS AVAILABLE JMP BAS CHKB3, TAD PSSTRT CLL CMA TAD C1400 SNL CLA /IS START OF CODE BELOW 1400? JMP CHKB4 /YES-CHECK 2000 TAD C14 /YES-ONLY BUFFER 1 AND 2 AVAILABLE JMP BAS CHKB4, TAD PSSTRT CLL CMA TAD K2000 SNL CLA /IS CODE START BELOW 2000? JMP I [ILOOP /NO-START INTERPRETER-ALL BUFFER FREE TAD [10 /YES-BUFFERS 1,2, AND 3 AVAILABLE BAS, DCA BMAP JMP I [ILOOP /START INTERPRETER 0 MCDF1, -6211 K2000, 2000 C14, 14 C16, 16 C1000, 1000 C1400, 1400 ZBLOCK 10 TTYEND, 0 *OVERLAY+3277 //////////////////////////////////////////////////////////////// /////// I/O TABLE 5 13-WORD ENTRIES //////////////////////////// //////////////////////////////////////////////////////////////// TTYF, 1 /TELETYPE ENTRY-FILE IS ASCII TTYBUF /BUFFER ADDRESS 0 /CURRENT BLOCK IN BUFFER TTYBUF /READ WRITE POINTER TTYDRI /HANDLER ENTRY ZBLOCK 10 FILE1, ZBLOCK 15 /FILE #1 FILE2, ZBLOCK 15 /FILE #2 FILE3, ZBLOCK 15 /FILE #3 FILE4, ZBLOCK 15 /FILE #4 PAGE /CROSS FIELD LITERAL EQUATES PGETCH= [GETCH PILOOP= [ILOOP PPUTCH= [PUTCH PSACM1= [SAC-1 PXPUTCH= [XPUTCH PXPRINT= [XPRINT PFFNOR= [FFNOR PFFGET= [FFGET PFFPUT= [FFPUT PUNSFIX= [UNSFIX PERROR= [ERROR PFACCLR= [FACCLR PIDLE= [IDLE PPSWAP= [PSWAP PFTYPE= [FTYPE USR= [200 O200= [200 O400= [400 O100= [100 O10= [10 O17= [17 O7400= [7400 O77= [77 O215= [215 O7700= [7700 M215= [-215 ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ////////////// OVERLAY 2- STRING FUNCTIONS ///////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// FIELD 1 *2000 RELOC OVERLAY /VERSION NUMBER WORD FOR STRING OVERLAY VERSON^100+SUBVSF+6000 /CHR$ FUNCTION /RETURNS 1 6BIT CHAR STRING FOR THE VALUE OF X CHR, JMS I PUNSFIX /FIX X TO 12 BIT INTEGER AND O77 /MASK TO 6BIT DCA I (SAC /AND PUT INTO SAC CMA DCA SACLEN /SET SAC LENGTH TO 1 JMP I (SSMODE /SET TO SMODE AND RETURN /ASC FUNCTION /RETURNS DECIMAL ASCII FOR 1 CHAR STRING IN FAC ASC, TAD I (SAC /GET FIRST CHAR OF STRING JMP FLOATS /FLOAT RESULT INTO FAC AND RETURN /LEN FUNCTION /RETURNS LENGTH OF SAC IN FAC LEN, TAD SACLEN /LENGTH OF STRING IN SAC CIA /MAKE POSITIVE /ROUTINE TO FLOAT FAC AND RETURN FLOATS, DCA ACH /NUMBER TO BE FLOATED IN HORD DCA ACL /CLEAR LORD DCA TEMP2 /CLEAR FPP OVERFLOW TAD (13 /SET EXP TO 11 DCA ACX JMS I PFFNOR /NORMALIZE JMP I PILOOP /RETURN /STR$ FUNCTION /RETURNS ASCII STRING FOR NUMBER IN FAC STR, JMS I (FFOUT /GET NUMBER INTO INTERMEDIATE BUFFER FIRST TAD XR1 CIA TAD (INTERB-1 DCA SACLEN TAD SACLEN /NOW SAVE COUNTER DCA TEMP2 TAD (INTERB-1 DCA XR1 /POINT AT BUFFER STRLUP, TAD I XR1 /GET A CHAR AND O77 /MASK TO 6BIT TAD (-40 /CROCK TO DELETE BLANKS SZA JMP .+3 ISZ SACLEN /IGNORE THE BLANK JMP .+3 TAD (40 DCA I SACXR /STORE IN SAC ISZ TEMP2 JMP STRLUP /LOOP FOR MORE JMP I (SSMODE /DONE-RETURN IN SMODE /VAL FUNCTION /RETURNS NUMBER IN FAC FOR STRING IN SAC VAL, TAD SACLEN DCA VALCNT /COUNT OF CHARS TO INPUT TAD (VALGET /ADDR OF PHONY INPUT ROUTINE DCA I (IGETCH /PUT IN INPUT ROUTINE IN PLACE OF KRB JMS I (FFIN /CALL FPP INPUT ROUTINE TAD PGETCH /NOW RESTORE REAL INPUT ADDR DCA I (IGETCH /RESTORE IN INPUT ROUTINE JMP I PILOOP /DONE VALGET, 0 TAD VALCNT /TEST NUMBER OF CHARS LEFT SNA CLA JMP EOVAL /NONE ISZ VALCNT /ELSE BUMP NOP TAD I SACXR /GET A BYTE TAD (240 AND O77 TAD (240 /CONVERT TO 8BIT SKP EOVAL, TAD O215 DCA CHAR JMP I VALGET /RETURN WITH CHAR IN 'CHAR' VALCNT, 0 PAGE / DATE FUNCTION / RETURNS STRING OF THE FORM "MM/DD/YY" IN SAC IF DATE IS PRESENT / RETURNS NULL STRING OTHERWISE DATE, TAD CDFIO /COPY CDF TO FIELD 17600 IN LINE DCA .+1 YEAREX, 0 TAD PSFLAG /GET TD8E BIT TO LINK CLL RAL SNL CLA TAD I (MDATE /IF ZERO LOOK AT MDATE IN N7600 SZL TAD I (MDATE-200 /ELSE LOOK AT N7400 DCA DATEWD /STORE (DATE IS NOT A CLOSED SUBROUTINE) CDF /DATE IS IN THE FORM MMM MDD DDD YYY TAD DATEWD /PICK UP DATE SZA CLA TAD (-10 /RETURN 8. BYTES IF NOT NULL DATE DCA SACLEN /SET SAC LENGTH TAD I (BIPCCL /NOW GET YEAR EXTENSION AND (600 /IT'S IN THE 600 BITS CLL RTR RTR /SHIFT INTO PLACE DCA YEAREX /HOLD YEAR EXTENSION TAD DATEWD /NOW ISOLATE MONTH AND O7400 CLL RTL RTL RAL JMS PUTN /PUT "MM/" INTO THE SAC TAD DATEWD /NOW GET DAY OF MONTH AND (370 CLL RTR RAR JMS PUTN /PUT "DD/" IN SAC TAD DATEWD /FINALLY GET YEAR AND (7 TAD YEAREX /ADD TO EXTENSION BITS TAD (106 /ADD 70. FOR BASE YEAR JMS PUTN /PUT OUT "YY/" (EXTRA SLASH WILL BE IGNORED) JMP I (SSMODE /RETURN IN STRING MODE PUTN, 0 ISZ NHIGH /BUMP HIGH ORDER DIGIT TAD (-12 /-10. SMA JMP .-3 /LOOP IF NOT REDUCED YET TAD (12+60 /CONVERT TO DECIMAL DIGIT DCA NLOW /HOLD MOMENTARILY TAD NHIGH /NOW GET HI ORDER DIGIT TAD (57 /MAKE 6BIT DCA I SACXR TAD NLOW /SEND OUT LOW DIGIT DCA I SACXR TAD (57 DCA I SACXR /SEND OUT "/" DCA NHIGH /CLEAR NHIGH FOR NEXT TIME (BE CAREFULL!!) JMP I PUTN NHIGH, 0 NLOW, 0 DATEWD, 0 /TRACE FUNCTION PRINTER. WHEN TRACE IS ENABLED,THIS ROUTINE /PRINTS THE LINE # EACH TIME IT IS STORED TPRINT, JMS I (LMAKE /MAKE LINE # INTO FIVE DIGITS TAD ("% JMS I PXPUTCH /PRINT "%" TAD (" JMS I PXPUTCH /PRINT A SPACE TAD (DIG1-1 /ADDR OF FIRST DIGIT-1 DCA XR5 /IN XR5 IGS, TAD I XR5 /GET DIGIT OF LINE NUMBER DCA TCHR /SAVE IT TAD (-"0 TAD TCHR /COMPARE IT TO 0 SNA CLA /IS IT A 0? JMP IGS /YES-IGNORE LEADING ZEROES PREST, TAD TCHR /NO-GET CHAR AGAIN TAD M215 SNA CLA /IS IT A CR? JMP TDONE /YES-LINE NUMBER IS PRINTED TAD TCHR /NO-GET CHAR A THIRD TIME JMS I PXPUTCH /TYPE IT TAD I XR5 /GET NEXT CHAR DCA TCHR JMP PREST /AND LOOP TDONE, TAD (" JMS I PXPUTCH /FOLLOW LINE # WITH A SPACE TAD ("% JMS I PXPUTCH /TYPE ANOTHER "%" TAD (215 JMS I PXPUTCH /TYPE,CR,LF TAD (212 JMS I PXPUTCH JMS I PXPRINT /EMPTY RING BUFFER OF TRACE NUMBER JMP .-1 JMP I PILOOP /DONE TCHR, 0 PAGE /TRACE FUNCTION-ROUTINE TO TURN TRACE ON AND OFF TRACE, TAD ACH /GET HI MANTISSA OF ARG SNA CLA /SKP TO TURN TRACE ON TAD TRREST /ELSE RESTORE TRACE BYPASS INSTR IN LINE NUMBER ROUTINE DCA I HOOKL /BY NOP ING INSTRUCTION AT TRHOOK TRREST, JMP I PILOOP HOOKL, TRHOOK /ERROR ROUTINE ERRORR, JMS I PXPRINT /PURGE TTY RING BUFFER JMP .-1 /BEFORE PRINTING ERROR TAD ETABA /ADDR OF ERROR TABLE DCA XR4 /POINTS INTO ERROR TABLE FERRLP, TAD I XR4 /GET 2 CHAR ERROR CODE DCA TEMP1 /SAVE TAD TEMP1 CLL RTR RTR RTR AND O77 /STRIP TO 6 BIT TAD K0300 /MAKE 8 BIT (LETTERS ONLY ALLOWED) DCA ESTRNG /PUT IN MESSAGE TAD TEMP1 /2 CHAR CODE AGAIN AND O77 /SECOND CHAR TAD K0300 /MAKE LETTER DCA ESTRNG+1 /PUT IN MESSAGE TAD I XR4 /GET ERROR CODE +1 TAD I PERROR /COMPARE AGAINST RETURN ADDR SZA CLA /MATCH? JMP FERRLP /NO-TRY NEXT ONE JMS LMAKE /MAKE THE LINE # INTO DECIMAL DIGITS TAD ESTRA /ADDR OF MESSAGE DCA XR5 ETLOP, TAD I XR5 /GET MESSAGE CHAR SPA /DONE? (MESSAGE ENDNS WITH - NUMBER JMP FATCHK /YES-DETERMINE ERROR TYPE JMS I PXPUTCH /NO-PUT CHAR IN RING BUFFER JMP ETLOP FATCHK, CLA TAD MFATAL /-ADDR OF FATAL ERRORS TAD XR4 /ADDR OF THIS ERROR SMA CLA /FATAL ERROR? JMP I ERRETN /NO-NEXT INST JMP I STOPI /YES-TERMINATE RUN ERRETN, XERRRET STOPI, FSTOPN MAKED, 0 AND O17 /ISOLATE BCD DIGIT TAD K260 /MAKE ASCII DIGIT JMP I MAKED K260, 260 K0300, 300 /SUBROUTINE LMAKE-MAKES THE CURRENT LINE NUMBER INTO FIVE DIGITS /STARTING AT DIG1 LMAKE, 0 TAD LINEHI /YES:GET HI LINE # JMS MAKED /GET DIGIT 2 DCA DIG2 /PUT IN MESSAGE TAD LINEHI CLL RTR RTR JMS MAKED /GET DIGIT 1 DCA DIG1 /AND PUT IN MESSAGE TAD LINELO /DOGOTS 3,4, AND 5 JMS MAKED /GET DIGIT 5 DCA DIG5 TAD LINELO CLL RTR RTR JMS MAKED /GET DIGIT 4 DCA DIG4 /AND PUT IN MESSAGE TAD LINELO CLL RAL RTL RTL JMS MAKED /GET DIGIT 3 DCA DIG3 /MESSAGE NOW COMPLETE JMP I LMAKE /ERROR MESSAGE EMESS, 215 212 ESTRNG, 0000 0000 " "A "T " "L "I "N "E " DIG1, 0 DIG2, 0 DIG3, 0 DIG4, 0 DIG5, 0 215 212 ESTRA, EMESS-1 /MINUS NUMBER TO END ABOVE MESSAGE /ERROR TABLE /ENTRY FORMAT- 2 CHAR 6-BIT ERROR CODE (LETTERS ONLY) / -(ADDR OF CALL)-1 ETABA, ETAB-1 MFATAL, -EFATAL ETAB, 0602 /FB -FB-1 /ATTEMPT TO OPEN AN ALREADY OPEN FILE 0722 /GR -GR-1 /RETURN WITHOUT A GOSUB 2622 /VR -VR-1 /ATTEMPT TO READ VARIABLE LENGTH FILE 2325 /SU -SU-1 /SUBSCRIPT ERROR 0405 /DE -DE-1 /DEVICE DRIVER ERROR 1705 /OE -OE-1 /DRIVER ERROR WHILE OVERLAYING 0615 /FM -FM-1 /ATTEMPT TO FIX MINUS NUMBER 0617 /FO -FO-1 /ATTEMPT TO FIX NUMBER >4095 0616 /FN -FN-1 /ILLEGAL FILE # 2303 /SC -SC-1 /ATTEMPT TO OVERFLOW SAC ON CONCATENATE 0611 /FI -FI-1 /ATTEMPT TO CLOSE OR USE UNOPENED FILE 0401 /DA -DA-1 /ATTEMPT TO READ PAST END OF DATA LIST 0723 /GS -GS-1 /TOO MANY NESTED GOSUBS 2322 /SR -SR-1 /ATTEMPT TO READ STRING FROM NUMERIC FILE 2327 /SW -SW-1 /ATTEMPT TO WRITE STRING INTO NUMERIC FILE 2001 /PA -PA-1 /ILLEGAL ARG IN POS 0603 /FC -FC-1 /OS/8 ERROR WHILE CLOSING TENTATIVE FILE 0311 /CI -CI-1 /INQUIRE FAILURE IN CHAIN 0314 /CL -CL-1 /LOOKUP FAILURE IN CHAIN 1116 /IN -IN-1 /INQUIRE FAILURE IN OPEN 0417 /DO -DO-1 /NO MORE ROOM FOR DRIVERS 0605 /FE -FE-1 /FETCH ERROR IN OPEN 0217 /BO -BO-1 /NO MORE FILE BUFFERS AVAILABLE 0516 /EN -EN-1 /ENTER ERROR IN OPEN 1106 /IF -IF-1 /ILLEGAL DEV:FILENAME SPECIFICATION 2314 /SL -SL-1 /STRING TOO LONG OR UNDEFINED 1726 /OV -O0-1 /NUMERIC OR INPUT OVERFLOW 1415 /LM -LM-1 /ATTEMPT TO TAKE LOG OF NEG # OR 0 0515 /EM -EM-1 /ATTEMPT TO EXPONENTIATE A NEG NUMBER TO A REAL ROWER 1101 /IA -IA-1 /ILLEGAL ARGUMENT IN USER FUNCTION 0330 /CX -CX-1 /ILLEGAL FILENAME EXTENSION IN A CHAIN STATEMENT /*********************************************************** EFATAL, /ERRORS BEFORE THIS LABEL ARE FATAL /******************************************************* 2205 /RE -RE-1 /ATTEMPT TO READ PAST EOF 2705 /WE -WE-1 /ATTEMPT TO WRITE PAST EOF 0426 /DV -DV-1 /ATTEMPT TO DIVIDE BY 0 2324 /ST -ST-1 /STRING TRUNCATION ON INPUT 1117 /IO -IO-1 /TTY INPUT BUFFER OVERFLOW T= . *ETAB *T /SEG$ FUNCTION /RETURNS SEGMENT OF X$ BETWEEN Y AND Z /IF Y<=0,THEN Y TAKEN AS 1 /IF Y>LEN(X$),NULL STRING RETURNED /IF Z<=0,NULL STRING RETURNED /IF Z>LEN(X$),Z IS SET=LEN(X$) /IF Z<Y,NULL STRING IS RETURNED SEG, CLA IAC DCA MODESW /RETURN IN STRING MODE TAD ACH /IS Y>0? SMA SZA CLA JMS I PUNSFIX /FIX IF POSITIVE SNA IAC /SET Y TO 1 IF Y.LE.0 DCA YARG TAD SACLEN /COMPARE YARG TO SACLEN CIA STL CIA TAD YARG SNL SZA CLA /SKP IF YARG.LOS.LEN(X$) JMP NULLST /NO-RETURN THE NULL STRING DCA INSAV /FAKE POINTER TO SCALAR #0 JMS I ARGPLK /GET ADDR OF Z JMS I PFFGET /LOAD Z INTO FAC ARGPLK, ARGPRE /LOC SKIPPED BY FPP SO WE PUT CONST HERE TAD ACH /HI MANTISSA OF Z SPA SNA CLA /IS Z<0? JMP NULLST /YES-RETURN THE NULL STRING JMS I PUNSFIX /NO-FIX Z STL TAD SACLEN /CALC Z-LEN(SAC) SNL /SKP IF Z.LO.LEN(SAC) CLA /ELSE TAKE LEN(SAC) CMA TAD SACLEN TAD YARG /NUMBER OF BYTES TO USE SMA JMP NULLST /NONE, RETURN NULL STRING DCA STRCNT TAD YARG /INDEX INTO STRING FOR SOURCE BYTES TAD (SAC-2 DCA XR2 /SET SOURCE XR TAD STRCNT DCA SACLEN /SET NEW LENGTH OF SAC NOW TAD I XR2 /NOW MOVE THE BYTES DCA I SACXR ISZ STRCNT JMP .-3 JMP I PILOOP /--RETURN-- NULLST, CLA CLL DCA SACLEN /ZERO SAC JMP I PILOOP /--RETURN-- YARG, 0 PAGE /POS FUNCTION /RETURNS THE POSITION IN X$ OF Y$ STARTING AFTER Z POS, CLA CLL DCA INSAV /FAKE AS STRING CALL TO STRING 0 JMS I (STFIND /FIND Y$ TAD STRCNT /# OF CHARS IN Y$ SNA CLA /IS Y$ THE NULL STRING? JMP ONERET /YES-RETURN 1 AS POSITION TAD SACLEN /NO-# OF CHARS IN X$ SNA CLA /IS X$ THE NULL STRING? JMP ZRORET /YES-RETURN 0 TAD ACH /NO-GET HORD OF Z SPA SNA CLA /IS Z GT 0? PA, JMS I PERROR /NO-ILLEGAL ARGUMENT JMS I PUNSFIX /FIX Z DCA POSITN /USE IT AS POSITION TO START SEARCH TAD POSITN STL TAD SACLEN /COMPARE POSITION TO MAXIMUM LENGTH OF STRING SNL SZA CLA JMP PA /Z IS PAST END OF STRING-ERROR POSSET, TAD STRCNT CMA TAD POSITN /GET POSITION NOW CHECKING+SIZE IF Y$ TAD SACLEN /COMPARE AGAINST LENGTH OF STRING SMA SZA CLA /ANY MORE TO COME? JMP ZRORET /NO-SEARCH FAILS JMS I (BYTSET /SETUP BYTE LOAD ROUTINE TAD POSITN /SEARCH START POSITION IN X$ TAD (SAC-2 /ADD TO BASE OF SAC DCA SACXR TAD STRCNT /# OF CHARS IN Y$ DCA TEMP3 /COUNTER SRCLP, JMS I (LDB CIA TAD I SACXR /COMPARE CHARS SNA CLA /DO THEY MATCH? JMP SCONTU /YES-CONTINUE MATCH TO NEXT CHAR IN X$ AND Y$ ISZ POSITN /BUMP POSITION TO BE CHECKED JMP POSSET /ITERATE SCONTU, ISZ TEMP3 /MORE CHARS IN Y$? JMP SRCLP /YES, ITERATE TAD POSITN /NO FOUND A MATCH JMP I (FLOATS ZRORET, JMS I PFACCLR /SEARCH FAILS-RETURN 0 JMP I PILOOP ONERET, CLA IAC JMP I (FLOATS /RETURN 1 POSITN, 0 PAGE RELOC ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////// OVERLAY 3-FILE MANIPULATING //////////// ///////// FUNCTIONS //////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// *3400 /FILE CLOSING ROUTINE VERSON^100+SUBVFF+6000 /VERSION WORD FOR FILES OVERLAY ANDPTR, ANDLST ANDLST, 7776 /MASKS FOR CLEARING BUFFER AND HANDLER STATUS BITS 7775 7773 7767 CLOSE, TAD ENTNO /GET FILE # SNA CLA /IS IT TTY? JMP I PILOOP /YES-DON'T DO ANYTHING JMS I PIDLE /SEE IF FILE OPEN JMS I PFTYPE /IS FILE NUMERIC? JMP NOCZ /YES-DON'T OUTPUT ^Z JMS I (FOTYPE /NO-IS FILE VARIABLE LENGTH? JMP NOCZ /NO-DON'T OUTPUT ^Z TAD (232 /YES JMS I PPUTCH /WRITE A ^Z IN FILE NOCZ, JMS I (WRBLK /WRITE LAST BLOCK IF IT HAS CHANGED JMS I PPSWAP /RESTORE 17600 JMS I (FOTYPE /IS FILE FIXED LENGTH? JMP CLOSED /YES-NO NEED TO CLOSE THE FILE TAD I IOTLEN /NO-GET FILE LENGTH DCA CLENG /PUT IN CLOSE CALL TAD IOTFIL DCA FNAP /POINTER TO FILE NAME TAD I IOTHDR CLL RTL RTL RAL /GET DEVICE NUMBER INTO BITS 8-11 AND O17 /ISOLATE IT CIF 10 JMS I O7700 /CALL USR 4 /CLOSE FNAP, . /POINTER TO FILE NAME CLENG, . FC, JMS I PERROR /FILE CLOSING ERROR CLOSED, TAD I IOTBUF /GET BUFFER ADDRESS CLL RTL RTL /BUFFER NUMBER INTO AC RAL /BITS 10,11 AND (3 /STRIP TAD ANDPTR /USE AS INDEX INTO MASKS DCA TEMP1 TAD BMAP /BUFFER STATUS MAP AND I TEMP1 /CLEAR THE BIT FOR THIS BUFFER DCA BMAP TAD I IOTHDR /HEADER WORD AND O7400 /STRIP HEADER TO DEVICE # ONLY DCA I IOTHDR TAD MM4 /-4 DCA TEMP3 /USE AS COUNTER CHECKL, TAD TEMP3 /GET 3 OF FILE TO CHECK TAD (W0PTR /MAKE POINTER TO PROPER W0 HEADER DCA TEMP1 /SAVE POINTER TAD TEMP3 /-# OF FILE WERE CHECKING TAD ENTNO /COMPARE TO CURRENT NUMBER SNA CLA /IS IT THIS ONE? JMP PSTCHK /YES-DON'T CHECK DRIVER TAD I TEMP1 /GET HEADER WORD FOR THE FILE OF INTEREST AND O7400 /ISOLATE DEVICE # CIA /NEGATE TAD I IOTHDR /COMPARE TO CURRENT DEVICE # SNA CLA /SAME DEVICE? JMP CRETN /YES-LEAVE DRIVER IN CORE PSTCHK, ISZ TEMP3 /ALL 4 CHECKED? JMP CHECKL /NO-CHECK THE NEXT 1 TAD I IOTHDR AND O10 /GET HANDLER LENGTH BIT SZA CLA /TWO PAGES? JMP TPREL /YES-FREE BOTH PAGES TAD I IOTHND /THIS IS THE ONLY FILE USING HANDLER THEN CLL RTL RTL /SLIDE BITS 4,5 OF HANDLER PAGE TO AC BITS 10,11 RAL AND (3 /ISOLATE HANDLER BUFFER NUMBER TAD ANDPTR /MAKE POINTER TO PROPER AND MASK RELCOM, DCA TEMP1 TAD DMAP /DRIVER PAGE MAP AND I TEMP1 /CLEAR HANDLER PAGE BIT DCA DMAP CRETN, DCA I IOTHND /SET FILE AS IDLE JMS I PPSWAP /GET RID OF 17600 AGAIN JMP I PILOOP /DONE TPREL, TAD I IOTHND /ONLY FILE USING HANDLER CLL RTL RTL /ISOLATE HANDLER BUFFER NUMBER RAL AND (3 TAD (ANDLS2 /USE AS INDEX TO AND MASK JMP RELCOM W0PTR, FILE1 FILE2 /FILE TABLE ENTRIES FILE3 FILE4 MM4, ANDLS2, 7774 7701 /CODE TO READ IN COMPILER AND START IT /THIS CODE GETS MOVED TO FIELD 1 AND EXECUTED FROM /LOC 2001-2013 IN FIELD 1 CREAD, CDF 10 CIF 0 4613 /"JMS I L7607K" 3700 /31 PAGES 0 /0-7577 CBLK, 7617 /STARTING BLOCK OF COMPILER HLT /SYSTEM ERROR,AND SINCE WE ARE PROBABLY CLOBBERED,WE CAN'T REPORT IT CIF 0 5612 /"JMP I .+1"-START THE COMPILER 7001 /STARTING ADDR OF COMPILER K7607K, 7607 /LESS THAN THE DESIRED VALUE EXTCHK, 0 /SKIP RETURN IF CURRENT AC0002 IAC TAD IOTFIL /IS .SV DCA EXTEMP /JUST A TEMP TAD I EXTEMP /GET EXTENSION TAD (-2326 SNA CLA /IS IT .SV? ISZ EXTCHK /YES: SKIP JMP I EXTCHK EXTEMP, 0 PAGE /CHAIN FUNCTION /SETS UP COMMAND DECODER AREA,THEN CHAINS TO BCOMP.SV CHAIN, JMS I PXPRINT /EMPTY TTY RING BUFFER JMP .-1 JMS I PPSWAP /RESTORE PG 17600 JMS I DNA2 /GET FILE NAME IN NAME AREA FROM CURRENT FILE CIF 10 JMS I O7700 /CALL USR 10 /LOCK IN CORE TAD I IOTDEV DCA DNA1 /FIRST TWO CHARS OF DEV NAME TAD I IOTDEV+1 /LAST TWO CHARS DCA DNA2 CIF 10 JMS I USR 12 /INQUIRE DNA1, 0 /DEVICE NAME DNA2, NAMEG CDIN, 0 CI, JMS I PERROR /ERROR TAD CDIN /GET ENTRY POINT OF DRIVER FOR CHAIN FILE SZA CLA /IS IT IN CORE? JMP DISIN /YES-NO NEED TO FETCH IT TAD DNA2 /NO-DEVICE # INTO AC CIF 10 JMS I USR 1 /FETCH HANDLER 7001 /INTO PAGE 7000 JMP CI /MAKE IT LOOK LIKE INQUIRE ERROR DISIN, TAD IOTFIL DCA STB /POINTER TO FILE NAME TAD DNA2 /GET DEVICE # CIF 10 JMS I USR 2 /LOOKUP STB, 0 /POINTER TO FILE NAME FLN, 0 CL, JMS I PERROR /LOOKUP ERROR TAD STB /GET STARTING BLOCK CDF 10 DCA I (7620 /STARTING BLOCK IN CD AREA TAD FLN /FILE LENGTH CLL RTL RTL AND (7760 /PUT IN BITS 0-7 TAD DNA2 /COMBINE WITH DEVICE # DCA I (7617 /PUT IN CD AREA TAD O100 /SET R SWITCH DCA I (7644 TAD I (7605 /STARTING BLOCK OF COMPILER SNA /(IS THIS A CORE IMAGE? JMP CICHAIN /YES: HANDLE SOMEWHAT DIFFERENTLY CDF DCA I (CBLK /INTO COMPILER READ CODE CDF JMS I (EXTCHK /SKP IF EXTENSION .SV SKP JMP CX /ERROR IF IT IS JMS I (PSWAP2 /NOW EXEC DESTRUCTIVE EXIT CODE CDF 10 JMP I (CSMOVE /MOVE THE COMPILER READ TO FIELD 1 AND EXECUTE IT CICHAIN,CDF JMS I (EXTCHK /SKP IF EXTENSION IS .SV CX, JMS I PERROR /ERROR IF NOT JMS I (PSWAP2 /NOW EXEC ONCE ONLY CLEAN UP ROUTINE TAD STB DCA CHNSTB CIF 10 /NOW DO A RESET AND DELETE TENTATIVE FILES JMS I USR 13 /RESET CIF 10 /FLAG TENTATIVE FILE CLEANUP JMS I USR 6 CHNSTB, HLT /FILE LOOKUP FLOOK, AC0002 JMS I (ENTLOK /LOOKUP DCA I IOTLEN /ACTUAL LENGTH TAD I IOTLEN DCA I IOTMAX /ALSO EQUALS MAXIMUM LENGTH CLEANP, DCA I IOTPOS /ZERO COLUMN POINTER CMA /-1 TAD I IOTLOC /STARTING BLOCK-1 DCA I IOTBLK /CURRENT BLOCK #=STARTING BLOCK-1 TAD I IOTBUF DCA I IOTPTR /READ/WRITE POINTER AT BEGINNING OF BUFFER CIF 10 JMS I USR /CALL TO USR 11 /USROUT JMS I PPSWAP /GET RID OF 17600 JMS I (BLZERO JMS I (NEXREC /DO A NEXREC TO READ IN FIRST FILE BLOCK JMP I PILOOP /DONE /ROUTINE FOR INTERPRETER EXIT FSTOP, KSF /IS THE KEYBOARD FLAG SET? JMP NOCTC /NO-THERE IS NO CHANGE ^C SENT US HERE TAD O200 /YES-FORCE PARITY BIT KRB /GET CHARACTER TAD (-203 /COMPARE AGAINST ^C SZA CLA /WAS IT ^C? JMP NOCTC /NO-THIS IS A NORMAL EXIT TSF JMP .-1 TAD ("^ /YES -ECHO ^ TLS CLA TSF JMP .-1 TAD ("C /ECHO "C" TLS NOCTC, TSF JMP .-1 JMP I (MEXIT PAGE /FILE OPENING ROUTINE OPENAV, TAD (4 /ALPHANUMERIC,VARIABLE LENGTH OPENAF, IAC /ALPHANUMERIC,FIXED LENGTH JMP OPENNF OPENNV, TAD (4 /NUMERIC,VARIABLE LENGTH OPENNF, DCA I IOTHDR /SET UP HEADER WORD TAD ENTNO /IS FILE TTY? SNA CLA JMP I PILOOP /YES-DON'T DO ANYTHING TAD I IOTHND /GET HANDLER ENTRY SZA CLA /IS FILE IDLE? FB, JMS I PERROR /ATTEMPT TO OPEN FILE ALREADY OPEN JMS I PPSWAP /RESTORE 17600 JMS I (NAMEG /GET FILE DEVICE NAME AND FILE NAME INTO WORDS 7-14 FROM SAC CIF 10 JMS I O7700 /CALL TO USR 10 /LOCK USR IN CORE TAD I IOTDEV DCA DEVNA1 /DEVICE NAME INTO INQUIRE CALL TAD I IOTDEV+1 DCA DEVNA2 CIF 10 JMS I USR /CALL TO USR 12 /INQUIRE DEVNA1, . /DEVICE NAME DEVNA2, . ENTRYN, 0 /ENTRY POINT IN, JMS I PERROR /INQUIRE ERROR TAD DEVNA2 /GET DEVICE # CLL RAR RTR /PUT INTO BITS 0-3 RTR TAD I IOTHDR DCA I IOTHDR /STORE IN HEADER WORD TAD ENTRYN /GET DRIVER ADDRESS SZA /IS IT IN CORE? JMP I (DRIVRN /YES-NO NEED TO FETCH IT TAD DMAP /NO-GET MAP OF DRIVER PAGES CLL RAR /PAGE 7000 BIT IN LINK SNL /IS PAGE 7000 FREE? JMP FREE70 /YES CLL RAR /NO-7200 BIT TO LINK SNL /IS PAGE 7200 FREE? JMP FREE72 /YES CLL RAR /NO-7400 BIT TO LINK SZL CLA /IS PAGE 7400 FREE? DO, JMS I PERROR /NO-NO MORE ROOM FOR DRIVERS TAD O7400 /YES-LOAD HANDLER INTO 7400 DCA FETPAG /SET UP IN FETCH CALL TAD (4 /SET BIT 9 TO SHOW PAGE 7400 OCCUPIED JMP DFETCH /FETCH DRIVER FREE70, CLL RAR /PAGE 7200 BIT TO LINK SNL CLA /IS 7200 FREE? IAC /YES-THERE IS ROOM FOR A TWO PAGE HANDLER TAD (7000 DCA FETPAG /SET UP FETCH TO USE PAGE 7000 CLL CLA CML RTL /TURN ON BIT 10 DCA TPH /SAVE IN TWO PAGE SET WORD IAC /SET BIT 11 TO SHOW PAGE 7000 OCCUPIED JMP DFETCH /FETCH HANDLER FREE72, CLL RAR /7400 BIT TO LINK SNL CLA /IS 7400 PAGE FREE? IAC /YES-THEN THERE IS ROOM FOR A 2 PAGE HANDLER TAD (7200 DCA FETPAG /SET ADDRESS IN FETCH CALL TAD (4 DCA TPH /IF TWO PAGE LOADED,SET BIT 9 ALSO AC0002 /TURN ON BIT 10 TO SHOW PAGE 7200 OCCUPIED DFETCH, TAD DMAP /TURN ON PAGE BIT FOR WHERE BUFFER WILL BE LOADED DCA DMAP TAD DEVNA2 /DEVICE # IN AC CIF 10 JMS I USR /CALL TO USR 1 /FETCH FETPAG, . /DRIVER ADDRESS FE, JMS I PERROR /FETCH ERROR CDF 10 CLA CMA TAD I (37 /GET ADDR OF HANDLER INFO TABLE TAD DEVNA2 /USE THE DEVICE # AS AN INDEX INTO THAT TABLE DCA TEMP1 /SAVE POINTER TAD I TEMP1 /GET THE INFO WORD FOR THE HANDLER JUST FETCHED CDF SMA CLA /IS HANDLER 2 PAGES LONG? JMP DRAP /NO MAP IS COMPLETE TAD TPH /YES-UPDATE DRIVER MAP TO INCLUDE TAD DMAP /SECOND PAGE OF TWO PAGE HANDLERS DCA DMAP TAD O10 TAD I IOTHDR /SET 2 PAGE BIT IN HEADER WORD DCA I IOTHDR DRAP, TAD FETPAG /HANDLER ENTRY ADDRESS JMP I (DRIVRN /PAGE ESCAPE TPH, 0 /ROUTINE TO MOVE THE COMPILER READER INTO FIELD 1 AND START IT CSMOVE, TAD (CREAD-1 DCA XR1 /POINTES TO COMPILER STARTING CODE TAD (-13 DCA TEMP1 /COUNTER TAD (2000 DCA XR2 /MOVE TO LOC 2001 IN FIELD 1 CDF TAD I XR1 /GET WORD OF CODE CDF 10 DCA I XR2 /MOVE IT ISZ TEMP1 /DONE? JMP .-5 /NO CIF 10 /YES-START IT JMS I (2000 PAGE DRIVRN, DCA I IOTHND /DRIVER ENTRY INTO I/O TABLE TAD BMAP /GET BUFFER MAP CLL RAR /BUFF1 BIT TO LINK SNL /IS IT FREE? JMP B1 /YES-ASSIGN BUFF1 RAR /BUFF2 BIT TO LINK SNL /IS IT FREE? JMP B2 /YES-ASSIGN BUFF2 RAR /BUFF3 BIT TO LINK SNL /IS IT FREE JMP B3 /YES-ASSIGN BUFF3 RAR /NO-BUFF4 BIT TO LINK SZL CLA /IS IT FREE? BO, JMS I PERROR /NO-NO MORE BUFFERS AVAILABLE TAD (1400 DCA I IOTBUF /SET BUFFER ADDRESS TO 1400 TAD O10 /SET BUFF4 BIR IN MAP JMP BUFASS B3, CLA TAD (1000 DCA I IOTBUF /SET BUFFER ADDRESS TO 1000 TAD (4 JMP BUFASS /SET BUFF3 BIT IN MAP B2, CLA TAD O400 DCA I IOTBUF /SET BUFF ADDRESS TO 400 CLL CML CLA RTL /SET BUFF2 BIT IN MAP JMP BUFASS B1, CLA DCA I IOTBUF /SET BUFF ADDRESS TO 0000 CLA IAC /TURN ON BUFF1 BIT IN MAP BUFASS, TAD BMAP DCA BMAP /UPDATE BUFFER ASSIGNMENT MAP TAD I IOTHDR /GET HEADER WORD CLL RTR RAR /FIXED,VARIABLE BIT TO LINK SNL CLA /IS IT FIXED? JMP I (FLOOK /YES-DO A LOOKUP TAD (3 /NO-DO AN ENTER JMS ENTLOK /ENTER DCA I IOTMAX /MAXIMUM LENGTH IN WORD 7 DCA I IOTLEN /ZERO ACTUAL LENGTH JMP I (CLEANP /FINALIZE I/O TABLE ENTRY MEXIT, CLA JMS I PPSWAP JMS I (PSWAP2 /RESTORE PG 27600 CDF 10 TAD I (EDBLK /GET BLOCK # FOR EDITOR CDF SNA /SHALL WE CALL THE EDITOR? JMP I (7600 /NOkJUST CALL OS/8 DCA EBLK /YES-PUT THE BLOCK # IN DRIVER CALL JMS I (7607 /CALL SYS DRIVER 2100 /READ 8 BLOCKS 0 /INTO 0-3377 EBLK, . /BLOCK # OF EDITOR HLT /SYS ERROR,AND SINCE WE ARE PROBABLY CLOBBERED,WE CAN'T REPORT IT JMP I .+1 /START THE EDITOR 3212 ENTLOK, 0 DCA FNOM /FUNCTION NUMBER IN PLACE TAD IOTFIL /POINTER TO FILE NAME DCA STARTB /INTO CALL TAD I (DEVNA2 /DEVICE NUMBER CIF 10 JMS I USR /CALL TO USR FNOM, . /ENTER OR LOOKUP STARTB, . FLEN, . EN, JMS I PERROR /ENTER ERROR TAD STARTB /FILE STARTING BLOCK # SZA CLA /IS IT NON-ZERO? JMP FILSTU /YES-DEVICE IS FILE STRUCTURED TAD FLEN /NO-GET FILE LENGTH SZA CLA /IS IT EMPTY? JMP FILSTU /NO-DEVICE IS FILE STRUCTURED TAD (20 /NO-FILE IS READ/WRITE ONLY TAD I IOTHDR DCA I IOTHDR /SET READ/WRITE ONLY BIT TAD FNOM CLL RAR SNL CLA IAC FILSTU, TAD STARTB /GET STARTING BLOCK # OF FILE DCA I IOTLOC /PUT IN I/O TABLE TAD FLEN /FILE LENGTH CIA /MAKE FILE LENGTH POSITIVE JMP I ENTLOK /RETURN /SUBROUTINE P2SWAP-RESTORE OS/8 RESIDENT MONITOR PRIOR TO EXIT FROM INTERPRETERTER /THIS IS DESTRUCTIVE CODE,AND ONCE THIS ROUTINE HAS BEEN EXECUTED /THERE IS NO PLACE TO GO BUT OUT. /HAS 3 FUNCTIONS: / 1) REMOVES CTRL/C HOOKS FROM SYS DRIVER / 2) RESTORES BATCH CONTROL WORDS TO 27774-27777 / 3) IF SYS=TD/8E,RESTORES PAGE 27600 AND RETURNS CDFS TO PAGE 07600 PSWAP2, 0 TAD (4207 DCA I (7600 /REMOVE CTRL/C HOOKS TAD (6213 DCA I (7605 TAD (7600 DCA I (HICORE /FUDGE POINTER IN SWAP ROUTINE (IN CASE IT WAS TD8E) TAD PSFLAG /GET RESIDENT STATUS FLAG SPA CLA /IS THIS TD8/E SYS? JMS I (PSWP2P /YES-RESTORE PAGE 27600 AND PAGE 07600 TAD CDFIO DCA .+3 /CDF TO HI CORE CDF 10 TAD I BOSPT1 /GET BATCH WORD CDF 10 DCA I BOSPT2 /BACK INTO LOFTY STATE ISZ BOSPT1 ISZ BOSPT2 JMP .-6 CDF JMP I PSWAP2 /YES-WE ARE FINISHED,SO RETURN BOSPT1, 7600 BOSPT2, 7774 PAGE /PARSE A FILENAME OF THE FORM "DEVN:FILENM.EX" IN THE SAC /DSK: AND A NULL EXTENSION ARE THE DEFAULTS /THE END OF THE SAC IS USED AS A WORK AREA /IF SYNTAX IS CORRECT, THE NAME IS PACKED INTO /THE FILENAME FIELD OF THE CURRENT FILE /OTHERWISE A FATAL ERROR IS RETURNED /ENTERED WITH OS/8 SWAPPED IN WKAREA= SAC+16 /DEFINE SCRATCH AREA NAMEG, 0 TAD SACLEN TAD (16 /COMPARE STRING LENGTH TO 16 SPA CLA IF, JMS I PERROR /TOO MANY CHARS IN "DEV:FILENM.EX" TAD SACLEN DCA TEMP2 /STRING LENGTH COUNTER TAD PSACM1 DCA SACXR TAD (DSK-1 /FIRST USE THE DEFAULT DEVICE JMS DEVFUD NCG, TAD I SACXR /GET CHAR FROM SAC DCA TEMP1 /SAVE TAD TEMP1 TAD (-72 /IS IT A COLON? SNA JMP CAD /YES-CHARS SO FAR=DEVICE NAME TAD (14 /NO-IS IT A PERIOD? SNA CLA JMP SSAD /YES-NEXT TWO CHARS=EXTENSION TAD TEMP1 /NO-GET CHAR AGAIN DCA I XR2 /STORE IN WORK AREA ISZ TEMP4 /BUMP COUNT FOR CURRENT SECTION NCGS, ISZ TEMP2 /END OF STRING YET? JMP NCG /NO-NEXT CHAR TAD TEMP4 /YES-GET CHAR COUNT FOR THIS SECTION (NAME) TAD (-6 SMA SZA CLA /IS IT >6? JMP IF /YES-TOO MANY CHARACTERS IN FILE NAME TAD (WKAREA-1 /NO-ADDRESS OF SCRATCH NAME BLOCK DCA XR1 STA /-1 TAD IOTDEV /ADDRESS OF FINAL NAME BLOCK-1 DCA XR2 TAD (-6 /MOVE 6 WORDS DCA TEMP2 MML, TAD I XR1 CLL RTL RTL RTL TAD I XR1 DCA I XR2 /MOVE NAME WORD FROM SCRATCH AREA TO FINAL DEST ISZ TEMP2 /DONE? JMP MML /NO JMP I NAMEG /YES-RETURN CAD, TAD TEMP4 /GET CHAR COUNT FOR THIS SECTION TAD (-4 /COMPARE AGAINST 4 SMA SZA CLA /TOO MANY CHARS? JMP IF /YES-DEVICE NAME TOO LONG TAD (WKAREA-1+4 JMS DEVFUD /CLEAR BUF AND GET NAME FROM FILE FIELD THIS TIME JMP NCGS SSAD, TAD TEMP4 /COUNT FOR THIS SECTION (FILE NAME) TAD (-6 SMA SZA CLA /TOO MANY? JMP IF /YES-FILE NAME TOO LONG DCA TEMP4 /NO-CLEAR COUNT TAD DSK TAD TEMP2 /COMPARE AGAINST # OF CHARS LEFT SPA SNA CLA JMP IF /TOO MANY CHARS IN EXTENSION TAD (WKAREA-1+12 DCA XR2 JMP NCGS DEVFUD, 0 DCA XR1 /POINT AT LOC OF DEV: TAD (WKAREA-1 DCA XR2 /POINT AT START OF WORK AREA TAD (-10 DCA TEMP4 TAD (-4 DCA TEMP3 TAD I XR1 /GET A DEVICE NAME BYTE DCA I XR2 /STORE IN WORK AREA DEVICE FIELD ISZ TEMP3 JMP .-3 /ITERATE DCA I XR2 /NOW CLEAR REST OF FILE NAME ISZ TEMP4 JMP .-2 /ITERATE TAD (WKAREA-1+4 /POINT XR2 AT FILENAME FIELD DCA XR2 JMP I DEVFUD /RETURN WITH TEMP4 CLEAR DSK, 4;23;13;0 /6BIT DEFAULT DEVICE NAME "DSK" /SUBROUTINE TO RESTORE PAGE 27600 OF TD8/E DRIVER /AND READJUST THE CDFS IN FIELD 0 PSWP2P, 0 TAD PSFLAG RTL SNL CLA /BIT 1 SET MEANS PHONEY TD8E JMP .+3 DCA PSFLAG JMP I PSWP2P DCA PSFLAG /CLEAR RESIDENT STATUS FLAG TAD (CDF 20 DCA I (P2CDF /PUT CDF 20 IN SWAP ROUTINE TAD (CDF 20 DCA I (P2CDF1 JMS I PPSWAP /MOVE DOWN PAGE 27600 // // NEXT 3 LINES WERE PART OF BPAT.PA // JMS I PHFIX // JMP I PSWP2P // PHFIX, HFIX // TAD (6223 // DCA I (7642 // TAD (6222 DCA I (7721 TAD (6222 /RESTORE CDFS IN PAGE 07600 DCA I (7727 JMP I PSWP2P /RETURN PAGE FIELD 0 ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// /////////////// END OF OVERLAY AREA ///////////////////////////////// ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// $ <:STTYF, 1+1"E0;' J<SPRINT;R-5DI[XPRINT> J<SSACPTR;R-6DI[SAC-1> J<SPUTCHL;R-6DI[PUTCH> J<SILOOPL;R-6DI[ILOOP> J<SINTL;R-4DI[UNSFIX> J<SCDFPSL;R-6DI[CDFPSU> J<SERROR;R-5DI[ERRDIS> J<SFBITS;R-5DI[FBITGT> J<SPWFECL;R-5DI[PWFECH> J<SMPYLNK;R-6DI[MPY> J<SXPUT;R-4DI[XPUTCH> J<SFIDLE;R-5DI[IDLE> J<SDEVCAL;R-6DI[DRCALL> J<SWRITFW;R-6DI[WRITFL> J<SSTHINL;R-6DI[STHINI> J<SLDHINL;R-6DI[LDHINI> J<SSTH;R-3DI[STHL> J<SLDH;R-3DI[LDHL> J<SFACSAL;R-6DI[FACSAV> J<SFACREL;R-6DI[FACRES> J<SFGETL;R-5DI[FFGET> J<SFPUTL;R-5DI[FFPUT> J<SFNORL;R-5DI[FFNOR> J<SFCLR;R-4DI[FACCLR> J<SFNEGL;R-5DI[FFNEG> J<SFLOATL;R-6DI[FFLOAT> J<SGETCHL;R-6DI[GETCH> J<SEOFSEL;R-6DI[EOFSET> J<SBSWL;R-4DI[BSWP> J<SPACKL;R-5DI[PACKCH> J<SCNOCLL;R-6DI[CNOCLR> J<SBUFCHL;R-6DI[BUFCHK> J<SFTYPL;R-5DI[FTYPE> J<SCHRNOL;R-6DI[CHARNO> J<SNEXREL;R-6DI[NEXREC> J<SCRLF;R-4DI[CRLFR> J<SVALLK;R-5DI[VALGET> J<SPATCHP;R-6DI[PATCHF> J<SP1SWAP;R-6DI[PSWAP> J<SLDHRST;R-6DI[LRESET> J<SSTHRST;R-6DI[SRESET> P> |
> | 1 | EAE=1 |
> > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $JOB TO MAKE OS/8 BASIC ACCEPT LOWERCASE INPUT /ELIMINATES MAP OF UNDERSCORE KEY TO RUBOUT .R FUTIL SET MODE SAVE SET DEVICE SYS FILE BASIC.SV 0.243/ IF C-7450 7540 0.244/ IF C-5320 1372 0.372/ 7740 WRITE END EXIT $END OF JOB TO INSTALL LC PATCH TO BASIC |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | 1000 DIM L$(80),F$(1),C$(1),N$(16) 1010 DIM L2$(80) 1020 DIM N(350) 1030 LET F$=CHR$(28) 1040 PRINT "FILE"; 1050 INPUT N$ 1060 PRINT "START,STEP"; 1070 INPUT S1,S 1080 LET S1=INT(ABS(S1)) 1090 LET S=INT(ABS(S)) 1100 LET T=0 1110 LET N2=0 1120 FILE #1:N$ 1130 LET I=1 1140 INPUT #1:L$ 1150 IFEND #1 THEN 1320 1160 LET L=LEN(L$) 1170 GOSUB 1980 1180 IF N1>0 THEN 1220 1190 PRINT "NO LINE NUMBER" 1200 PRINT L$ 1210 GO TO 1130 1220 IF N1>N2 THEN 1260 1230 PRINT "OUT OF SEQUENCE" 1240 PRINT L$ 1250 GO TO 1130 1260 LET N2=N1 1270 LET T=T+1 1280 LET N(T)=N1 1290 IF T<350 THEN 1130 1300 PRINT "TOO MANY LINES" 1310 STOP 1320 RESTORE #1 1330 FILEV #2:N$ 1340 LET N2=S1 1350 INPUT #1: L$ 1360 IFEND #1 THEN 1730 1370 LET I=1 1380 LET L=LEN(L$) 1390 GOSUB 1980 1400 LET L2$=STR$(N2) 1410 PRINT #2: L2$; 1420 LET L$=SEG$(L$,I,80) 1430 LET N2=N2+S 1440 LET F=0 1450 LET D=POS(L$,F$,1) \ LET P=D 1460 IF D=0 THEN 1490 1470 LET L2$=SEG$(L$,P+1,80) 1480 LET L$=SEG$(L$,1,P-1) 1490 LET I=POS(L$,"GOTO",1)+4 1500 IF I>4 THEN 1750 1510 LET I=POS(L$,"GO TO",1)+5 1520 IF I>5 THEN 1750 1530 LET I=POS(L$,"THEN",1)+4 1540 IF I>4 THEN 1750 1550 LET I=POS(L$,"GOSUB",1)+5 1560 IF I>5 THEN 1750 1570 LET I=POS(L$,"GO SUB",1)+6 1580 IF I>6 THEN 1750 1590 IF F=0 THEN 1610 1600 PRINT #2:F$; 1610 PRINT #2:L$; 1620 LET F=F+1 1630 IF D>0 THEN 1660 1640 PRINT #2: 1650 GO TO 1350 1660 LET D=POS(L2$,F$,1) \ LET P=D 1670 IF D>0 THEN 1700 1680 LET L$=L2$ 1690 GO TO 1490 1700 LET L$=SEG$(L2$,1,P-1) 1710 LET L2$=SEG$(L2$,P+1,80) 1720 GO TO 1490 1730 CLOSE #2 1740 STOP 1750 LET L=LEN(L$) 1760 GOSUB 1920 1770 IF C=32 THEN 1760 1780 IF C<0 THEN 1890 1790 LET I=I-1 1800 LET P=I 1810 GOSUB 1980 1820 IF N1=0 THEN 1890 1830 FOR J=1 TO T 1840 IF N1<>N(J) THEN 1880 1850 LET Q$=STR$(J*S-S+S1) 1860 LET L$=SEG$(L$,1,P-1)&Q$ 1870 GO TO 1590 1880 NEXT J 1890 PRINT "BAD REFERENCE" 1900 PRINT L$ 1910 GO TO 1590 1920 IF I<=L THEN 1950 1930 LET C=-1 1940 RETURN 1950 LET C=ASC(SEG$(L$,I,I)) 1960 LET I=I+1 1970 RETURN 1980 LET N1=0 1990 GOSUB 1920 2000 IF C<48 THEN 2040 2010 IF C>57 THEN 2040 2020 LET N1=N1*10+C-48 2030 GO TO 1990 2040 IF C<0 THEN 2060 2050 LET I=I-1 2060 RETURN 2070 END |
> > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $JOB TO MAKE OS/8 BASIC REJECT LOWERCASE INPUT /RESTORES MAP OF UNDERSCORE KEY TO RUBOUT .R FUTIL SET MODE SAVE SET DEVICE SYS FILE BASIC.SV 0.243/ IF C-7540 7450 0.244/ IF C-1372 5320 WRITE END EXIT $END OF JOB TO INSTALL UC PATCH TO BASIC |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 | /OS8 BASIC USER FUNCTIONS, V5 / / / / / / / / / /COPYRIGHT (C) 1974 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /JR 6-JUN-77 MODIFIED FOR V5 VERSON= 5 /VERSION OF BRTS SUBVUF= 01 /SUBVERSION OF BASIC.UF /FIRST WORD OF THIS OVERLAY CONTAINS /BRTS VERSION IN LEFT HALF AND SUBVERSION IN RIGHT HALF FPP= 4000 FADD= FPP+2000 FSUB= FPP+2117 FMPY= FPP+1600 FDIV= FPP+1722 FFNEG= FPP+2135 FFPUT= FPP+2256 FFGET= FPP+2241 FFNOR= FPP+2215 FACCLR= 0323 UNSFIX= 1615 PSWAP= 1262 ARGPRE= 311 /VC8E POINT PLOTTING DISPLAY CONTROL IOT'S DISD= 6052 /SKIP ON DONE FLAG DILX= 6053 /LOAD AC2-11 INTO X-REGISTER (DOESN'T CLEAR AC) DILY= 6054 /LOAD AC2-11 INTO Y-REGISTER (DOESN'T CLEAR AC) DIXY= 6055 /INTENSIFY /DK8EP PROGRAMMABLE REAL TIME CLOCK IOT'S CLZE= 6130 /CLEAR CLOCK ENABLE BITS PER AC CLSK= 6131 /SKIP ON CLOCK FLAG CLOE= 6132 /SET CLOCK ENABLE BITS PER AC CLAB= 6133 /AC TO CLOCK BUFFER CLSA= 6135 /READ CLOCK STATUS TO AC /BIT 0 SET ON OVERFLOW /BITS 9-11 SET ON RESPECTIVE SCHMITT TRIGGER FIRING /CLOCK ENABLE REGISTER BITS /BIT FUNCTION /0 INTERRUPT ENABLE BIT /1-2 MODE BITS: / 00 RUN COUNTER, INTERRUPTING EACH 4096 TICKS / 01 RUN COUNTER AND RESET WITH CLOCK BUFFER ON OVERFLOW / 10 RUN COUNTER AND READ COUNTER WHEN EVENT OCCURS / 11 RUN COUNTER AND READ AND CLEAR IT ON EVENT /3-5 RATE SELECTION: / 000 STOPPED / 001 EXTERNAL TIME BASE / 010 100 HZ / 011 1 KHZ / 100 10 KHZ / 101 100 KHZ / 110 1 MHZ / 111 STOPPED /6 OVERFLOW STARTS A-D /7 SET TO INHIBIT CLOCK /8 EVENT ON CHAN 1, 2, OR 3 CAUSE INTERRUPT AND OVERFLOW /9-11 ENABLE EVENTS 1 THRU 3 /AD8EA A-D CONVERTER IOT'S ADCL= 6530 /CLEAR A-D ADLM= 6531 /LOAD MULTIPLEXOR FROM AC8-11 AND CLEAR AC ADST= 6532 /START A-D CONVERTER ADRB= 6533 /READ A-D BUFFER INTO AC0-11 AND CLEAR FLAG ADSK= 6534 /SKIP ON A-D DONE FLAG (DOESN'T CLEAR FLAG) ADLE= 6536 /SKIP ON TIMING ERROR ADRS= 6537 /READ STATUS REGISTER /STATUS REGISTER FORMAT: /0 A-D DONE FLAG /1 TIMING ERROR FLAG /2 ENABLE INTERRUPT ON DONE FLAG /3 ENABLE INTERRUPT ON TIMING ERROR /4 ENABLE EXTERNAL START (EG CLOCK) /5 AUTO INCREMENT MODE /6-7 UNUSED /8-11 4 BIT CHANNEL NUMBER /DR8E-A DIGITAL BUFFERED I/O BASE IOT'S /DEVICE CODE CHANGED TO 52 TO AAVOID CONFLICT /WITH LQP-80 WHICH IS DEVICE CODE 50 DBDI= 6520 /DISABLE INTERRUPTS DBEI= 6521 /ENABLE INTERRUPTS DBSK= 6522 /SKIP IF THE IN FLAG IS SET DBCI= 6523 /SET SELECTED BITS IN INPUT REGISTER DBRI= 6524 /READ INPUT REGISTER TO AC DBCO= 6525 /CLEAR SELECTED BITS IN OUTPUT REGISTER DBSO= 6526 /SET SELECTED BITS IN OUTPUT REGISTER DBRO= 6527 /READ OUTPUT REGISTER TO AC ACX= 44 ACH= 45 ACL= 46 MAXPTS= XR0 REFRFL= XR1 BUFXR= XR2 DX= XR3 /XR3,XR4,XR5= TEMP FL PT LOC SPF= 6040 /SET TTY PRINTER FLAG CAF= 6007 /RESET PROCESSOR IA= 1465 /ENTRY POINT FOR USER FUNCTION ERROR MESSAGE NOPUNCH /DUMMY SECTION FOR MISC PAGE 0 REFERENCES *1 /JPG 13-DEC-77 DUMMY PAGE 0 CHANGED SO THAT POINTERS /AND ADDRESSES MATCH UP WITH CURRENT VERSION JMP I .+1 SERVC *6 USECON, 0 /ENTRY #OF USER BUF IN DIM TBL *10 XR0, 0 XR1, 0 XR2, 0 XR3, 0 XR4, 0 XR5, 0 *20 CDFIO, CDF 10 /FLD OF PSEUDO DIM TBL 0 ARSTRT, 0 /ADR-1 OF PSEUDO DIM TBL *56 INSAV, 0 *124 FNORL, FFNOR *126 FPUTL, FFPUT *156 FIXP, UNSFIX FGETL, FFGET *161 FCLR, FACCLR *171 K0017, 17 K0200, 200 P1SWAP, PSWAP *177 K0010, 10 ENPUNCH *3400 /INI(N)-INITIALIZE ROUTN;CALLED BY USER BEFORE 'PLY / OR ADC';INITIALIZE CTRS,FLGS,ETC / N IS A DUMMY ARG / INI, VERSON^100+SUBVUF /VERSION NUMBER OF USER FUNCTIONS JMS BUFCDF TAD BUFBAK /PICK UP ADDR OF DISPLAY BUFFER DCA BUFXR /STORE IN BUFFER XR FOR PUTBUF ROUTINE DCA TOTPTS /BUF IS NOW EMPTY IAC DCA I (STPT /ACCES BUF AT 1ST PT IAC DCA I (NTHY /ACCES EVERY PT IAC DCA I (XFLG /BUF MAYBE DISPLAYED JMP I INI /ROUTINE TO GET FIELD AND ADDRESS OF USER BUFFER /FROM 'USECON' LOCATION BUFCDF, 0 TAD USECON /ENTRY PT OF BUF IN DIM TBL CLL RTL /MULT BY 4 TAD ARSTRT /ADR-1 OF STRT F DIM TBL DCA XR5 /ADR-1 OF ENTRY IN DIM TBL TAD CDFIO /COPY CDF TO BRTS TABLES INLINE DCA .+1 0 CMA TAD I XR5 /ADR-1 OF BUF DCA BUFBAK /NEED FOR DISPLY ROUTN TAD I XR5 /GET CDF OF BUF DCA PUTCDF TAD PUTCDF DCA CDFBAK /NEED FOR DISPLY ROUTN CDF /RESTORE DF JMP I BUFCDF CDFBAK, 0 BUFBAK, 0 TOTPTS, 0 /PUTBUF-ENTER WITH A 12BIT VALUE IN AC;PUT VAL IN / USER BUFFER;CHK TO SEE IF NXT VAL WILL CROSS FLDS / PUTBUF, 0 PUTCDF, 0 DCA I BUFXR IAC TAD BUFXR SZA CLA /ABOUT TO CROSS FLDS? JMP .+4 /NO TAD K0010 /YES TAD PUTCDF DCA PUTCDF /DF=DF+1 CDF /RESTORE DF JMP I PUTBUF /PLY(Y)-ENTER WITH YVAL IN FAC;CHK 0<=VAL<1.; / PUT LEGIT VAL IN USER BUF / PLY, 0 TAD ACH SPA CLA /YVAL>=0? JMP I (IA /NO,ERR TAD ACX SMA SZA CLA /YVAL<1? JMP I (IA /NO, ERR /CONV # IN FAC TO A 10BIT DISPLAYABLE VAL / FAC=FAC*1776+1001 / JMS I (FMPY /YES FL1022 /1776(8) JMS I (FADD FL513 /1001(8) JMS I FIXP JMS PUTBUF ISZ TOTPTS /KEEP CNT OF PTS IN BUF JMP I PLY /DLY(N)-N IS MAX # OF PTS TO BE EVENTUALLY DISPLAYED / CHK IF 1<=N<=1024; SET 'REFRFL' =0 FOR / A ONE SHOT DISPLAY. / DLY, 0 JMS I FIXP SPA SNA /1<=N? JMP I (IA /NO,ERR /CHK IF N IS SAME AS LAST TIME & /IF SO, NO NEED TO GO THE "SETDX" ROUT DCA INI /YES,TEMPORARY SAVE DCA XR1 TAD INI CIA TAD MAXPTS SZA CLA /N IS STILL THE SAME? JMP .+3 /NO JMS I (DISPLY /YES, DISPLY ONCE & JMP I DLY /RETURN TAD INI /GET N BACK DCA MAXPTS /ASSUME N IS VALID FOR MOMENT TAD MAXPTS CIA TAD (2000 SPA CLA /N<=1024? JMP I (IA /NO DCA REFRFL /ONE SHOT DISPLY JMS I (SETDX /SET DX FOR DISPLY JMP I DLY /ADC(N)-SAMPLE ADC NTH CHANNEL; RETN FL PT VAL IN FAC / ADC, 0 JMS I FIXP /GET ARG N CIA TAD K0017 SPA /N<=17(8)? JMP I (IA /NO,ERR CIA /YES TAD K0017 ADLM /LOAD MUX ADST /START CONV ADSK JMP .-1 ADRB /GET VAL DCA ACH JMS I (FFLOT JMP I ADC /CLW(N)-N IS A DUMMY ARG; WAIT UNTIL CLOCK O.F. OR / UNTIL A SCHMITT TRIG FIRES(DEPENDING WHICH WAS / SPECIFIED IN 'CLK') BEFORE RETURNING TO BASIC / CLW, 0 CLSK /STATUS REG IS ALREADY SET? SKP /NO JMP EARLY /YES CLSK JMP .-1 CLSA /READ STATUS CLW1, CLL RAL /CHK ON O.F. SZL /O.F. BIT SET IN SATUS WD? CIA /YES,NEG REST OF STATUS REG /RTN 0 IF O.F. ONLY; 1,2,...,7 IF SCHMITT ONLY; /-1,-2,...,-7 IF BOTH RAR /NO DCA ACH JMS I (FFLOT JMP I CLW /IF CLOCK INTERRUPTED TOO SOON TELL USER; /-8 IF O.F. ONLY; 9 THRU 15 IF SCHMITT ONLY; /-9 THRU -15 IF BOTH EARLY, CLSA TAD K0010 JMP CLW1 PAGE /DIS(S,E,N,X)-DISPLY EVERY NTH PT BEGIN WITH S / & NOT EXCEEDING N; X=1 DISPLY NOW, / X=0 SETUP TO DISPLY FOR A SAM / DIS, 0 JMS I (BUFCDF /SETUP CDF & USER BUF JMS I (ARG123 STPT-1 /FLOAT N TAD NTHY DCA ACH JMS I (FFLOT JMS I FPUTL /IT BETTER NOT =0 DX /HOLD TEMPORARY /CHK 1<=S,0<=E-S TAD STPT SPA SNA JMP I (IA /ERROR CIA TAD ENDPT SPA JMP I (IA /ERROR /FLOAT (E-S) & GET (E-S)/N DCA ACH JMS I (FFLOT JMS I (FDIV DX /CHK (E-S)/N+1<=1024; MAXPTS=(E-S)/N+1 JMS I FIXP IAC DCA MAXPTS /ASSUME OK FOR NOW TAD MAXPTS CIA TAD (2000 /1024(10) SPA CLA JMP I (IA /ERROR /GET X ARG; DISPLY BUF(X=1); ONLY A SETUP FOR SAM (X=0) CLL IAC RAL /4TH ARG DESIGNATED BY AC=2 JMS I (GETARG JMS I FIXP DCA XFLG TAD XFLG SZA CLA /USER WANTS TO DISPLY? TAD MAXPTS /YES,TOTPTS=MAXPTS DPY1, DCA I (TOTPTS /NO,JUST SET UP,TOTPTS=0 IAC /REFRESH TILL ^N(NON INTERRUPT) DCA REFRFL /OR TILL CLK INTERRPT(INT MODE) JMS I (SETDX JMP I DIS STPT, 0 /THESE 3 LOCATIONS ENDPT, 0 /GO TOGETHER & MUST NTHY, 0 /BE IN THIS ORDER XFLG, 0 /DISPLY-SETUP CDF & PTR TO STARTING PT OF USER BUF; / SETUP 'DISCTR' FOR # OF PTS TO DISPLY THIS TIME; / INITIALIZE FL PT 'DXSUM'=-'DX' / DISPLY,0 /IF TOTPTS<=MAXPTS,DISPLY TOTPTS;OTHERWSE MAXPTS D4, TAD I (TOTPTS SNA /SIMPLE WAIT LOOP FOR THAT'1ST' JMP .-1 /ADC TO BE SAMPLED CIA DCA DISCTR TAD DISCTR TAD MAXPTS SMA CLA /TOTPTS<=MAXPTS? JMP .+4 /YES TAD MAXPTS /NO CIA DCA DISCTR /SETUP CDF & PTR TO START PT OF USER BUFFER TAD I (CDFBAK /RE-INIT CDF FOR LAST TIME YOU DISPLY DCA DISCDF /YOU MAY HAVE CROSSED FLDS TAD I (BUFBAK /ADR-1 OF BUF TAD STPT DCA BUFPTR TAD XCRD /INITIALIZE XCOORD DCA XCOORD D3, TAD XCOORD DILX TAD DELTAX DCA XCOORD /UPDATE XCOORD BY DELTAX DISCDF, 0 TAD I BUFPTR CDF DILY CLA CLL TAD NTHY /MOVE PTR TO NXT LOC TO BE TAD BUFPTR /ACCESSED IN BUF DCA BUFPTR SNL /JUST CROSSED FLDS? JMP .+4 /NO TAD K0010 /YES TAD DISCDF DCA DISCDF DISD JMP .-1 DIXY /INTENSIFY /DISPLYED ALL PTS YET? ISZ DISCTR JMP D3 /NO TAD REFRFL /YES,KEEP REFRESHING? SNA CLA JMP I DISPLY /NO /KEYBOARD IS CHK HERE FOR ^N WHEN DSPL & NOT SAMPLING /KEYBOARD INTERRUPTS TO THE INT ROUTN / KSF /YES JMP D4 KRB TLS TAD (-216 SNA CLA /USER HIT ^N? JMP I DISPLY /YES JMP D4 /NO, KEEP REFRESHING DISCTR, 0 BUFPTR, 0 XCRD, 0 XCOORD, 0 DELTAX, 0 /FFLOT-FLOAT ANY INTEGER IN ACH(LOC 45) INTO FAC FFLOT, 0 DCA ACL /CLEAR LOW MANTISSA TAD (13 /11(10) INTO EXPONENT DCA ACX JMS I FNORL /NORMALIZE JMP I FFLOT /RETURN FL513, 12;2002;0 FL1022, 12;3774;0 PAGE /SAM(C,N,P,T)-SETUP PARAMETERS FOR SUBSEQUENT SAMPLING / OF ADC'S OR OR DOING DIGITAL IO / CONST=CLK TSAM=NCTR SAM, 0 JMS I (ARG123 CSAM-1 TAD PSAM SPA SNA /P=0? JMP I (IA /YES,ERR CIA /NO DCA PCTR /PCTR=-P(DONE CTR) CLL IAC RAL /4TH ARG IS DESIGN BY AC=2 JMS GETARG /GET T JMS I FIXP DCA TSAM TAD TSAM SZA CLA /SET UP TO SAMPLE ADC'S? JMP DIG /NO, DO DIGAL IO IAC /YES DCA SAMFLG /SET FLG=1 FOR 'CLK' TAD K0017 /15(10) JMP SAM1 DIG, CMA DCA SAMFLG /SET FLG=-1 FOR 'CLK' CLA CLL IAC RAL /2 SAM1, DCA CONST /CHK IF 0<=C, 1<=N, N+C-1<=2(DIG IO)OR <=17(8)(ADC'S) / CMA TAD NSAM SPA /1<=N? JMP I (IA /NO,ERR TAD CSAM CIA TAD CONST SPA CLA /N+C-1<=2 OR 17? JMP I (IA /NO,ERR TAD TSAM SNA CLA JMP SAM3 /CLEAR ALL DIGIAL INPT REGS JMS I (BUFCDF /SET UP USER BUF TAD NSAM CIA DCA NCTR /-#OF BOARDS TO CLAR TAD CSAM /START BOARD#(0,1,2) CLL RTL RAL /START BOARD# * 10(8) TAD (DBCI A1, DCA .+2 CLA CMA 0 /DBCI IS ISSUED CLA TAD .-2 TAD K0010 ISZ NCTR /MORE BOARDS TO CLEAR? JMP A1 /YES CLA JMP I SAM /DO A CLEAR ALL; AD DONE FLG, ERR FLG, CLR MUX & EN REG. /SET NON-AUTO INCR MODE / SAM3, CAF /CL ALL FLGS-I MAY USE ION'S ADCL TAD K0200 ADLE /ENABLE EXT START OF ADC'S JMP I SAM CSAM, 0 /THESE 3 LOCATIONS MUST NSAM, 0 /BE TOGETHER & IN THIS PSAM, 0 /ORDER PCTR, 0 NCTR, 0 /CLK(R,O,S)-A COMPLEX CLK ROUTN WHICH SETS UP CLOCK / FOR ADC SAMPLING; DIGIAL IO SMPLING; / & SETS UP A SIMPLE CLOCK-WAIT ROUTN / CLK, 0 JMS I (ARG123 R-1 CLSA /CLEAR CLK STATUS REG CLA TAD R SPA SNA /R>0? JMP IAA /NO,ERR TAD (-6 /YES SMA SZA CLA /R<=6? JMP IAA /NO TAD R /R GIVES CORRECT VAL FOR CLL RTL /EXT START, .1,1,10,100,1000 KHZ RATE RTL RTL /RATE GOES INTO BITS 3-5 OF EN REG TAD (5050 /BITS 0,2,6,8 OF EN REG ALWAYS SET DCA SAM /SAVE TEMP TAD O /OVERFLOW CNT CIA CLAB /SET BUF PRESET REG CLA TAD S SZA CLA /ANY SCHMITT TRIGS ASKED FOR? TAD (27 /YES,SET BITS 7,9-11 OF EN REG TAD SAM /FINAL ENABLE VAL CMA CLZE /CLEAR BAD BITS FROM EN REG CMA /ENABLE VAL IS BACK AGAIN CLOE /START CLOCK CLA TAD SAMFLG SNA /JUST SETTING UP FOR A SIMPLE TIMING DEV? JMP DONE /YES,RTN TO BASIC SPA CLA /SAMPLE ADC'S? JMP I (DRESET /NO,DO DIGITAL IO JMP I (SRESET /YES DONE, DCA SAMFLG /CLR FLG SPF /RESET TTY FLG FOR BASIC JMP I CLK /RTN TO BASIC IAA, SPF JMP I (IA R, 0 /THESE 3 LOCATIONS O, 0 /MUST BE TOGETHER IN S, 0 /THIS ORDER SAMFLG, 0 FL4096, 15;2000;0 /GETARG-ENTER WITH SCALER(0=ARG2,1=ARG3,2=ARG4) IN AC; / CALL 'ARGPRE' & ON RTN THE D.F. OF ARG IS SET / & ADR OF ARG IS IN FAC / PUT FL PT ARG IN FAC( 44-46) GETARG, 0 DCA INSAV /ARGPRE USES THIS SCALER LOC 64 JMS I KARG /GET ADR OF ARG JMS I FGETL /PUT ARG IN FAC KARG, ARGPRE /USED TO ADVANTAGE CDF /RESET D.F. JMP I GETARG PAGE /SETDX-SETUP DELTAX; CHK IF DISPL IS TO BE / ACTIVATED; DX IS A FL PT NO / SETUP DELTAX SUCH THAT IT =1,2,3,...,1023; / & XCOORD SO THAT DISPLY IS CENTERED / SETDX, 0 CMA TAD MAXPTS /MAXPTS-1 SNA /IF # OF MAXPTS=1 THEN DISPLY IAC /IS POSITIONED AT X=0 COORD DCA ACH JMS I (FFLOT JMS I FPUTL DX /SAVE FL PT(MAXPTS-1) TEMP TAD (1777 /1023 DCA ACH JMS I (FFLOT JMS I (FDIV DX /FL PT (1023/MAXPTS-1) =DX JMS I FIXP /FIXED 'DX' DCA I (DELTAX TAD I (DELTAX DCA ACH JMS I (FFLOT JMS I (FMPY DX /(MAXPTS-1)*(FIX'DX')=FLOT PROD JMS I FIXP /FIX 'PROD' CIA TAD (1777 CLL RAR /(1023-FIX'PROD')/2 TAD (1001 DCA I (XCRD /XCOORD=[1001+(1023-FIX'DX')/2] /CHK SHOULD DISPLY NOW(XFLG=1) /OR RTN TO BASIC DUE TO SAM SETUP(XFLG=0 TAD I (XFLG SZA CLA JMS I (DISPLY JMP I SETDX /ADSAM-A CLOCK INTERRUPT FOR SAMPLING ADC'S COMES HERE / ADSAM1, ADRS /RD STATUS(GET MUX) IAC ADLM /BMP MUX BY 1 JMP CLUGE ADSAM, CLSA /READ STATUS REG & CLEAR IT SMA CLA /CLK O.F.? JMP TION /NO, SCHMITT TRIG SYNC ADSK /CONV IS DONE? JMP .-1 /NO ADRB /GET VAL FR CONV BUF JMS I (PUTBUF /YES ISZ I (NCTR /SAMPLED ALL CHANS FOR THIS INTERRUPT? JMP ADSAM1 /NO ISZ I (PCTR /YES,JOB IS ALL DONE? JMP SRESET-1 /NO JMP I (DONE /YES,'DONE' IS IN 'CLK' ROUTN /SRESET-USED TO RESET STCHAN & CTR FR ADC SAMPLING / ROUTN SETS MUX TO SAMPLE 1ST OF A SERIES OF CHANS. / A CTR IS SET TO -# OF CONSEC CHANS TO SAMPLE / ISZ I (TOTPTS /#PTS /CHANNEL SRESET, TAD I (NSAM CIA DCA I (NCTR TAD I (CSAM ADLM /LOAD MUX WITH 1ST CHAN TION, ION JMS I (DISPLY /DISPLY UNTIL CLK INTERRUPT /DRI(N) -SAMPLE DIGITAL IO BOARD N; & RTN RESULT / AS FL PT IN FAC DRI, 0 JMS ARGN JMS I (DIGIO /GET DIGITAL VAL JMS NEGCHK JMP I DRI /ARGN - GET N AND MAKE A 'DBSK' INSTRUCTION ARGN, 0 JMS I FIXP /BOARD # /CHK 0<=N<=2 DCA SETDX /SAV N TEMP TAD SETDX CIA TAD (2 SPA CLA JMP I (IA /ERR TAD SETDX /GET N BAK CLL RTL RAL /BOARD # = BITS 6-8 TAD (DBCI JMP I ARGN /DRO(M,N)- M=FL PT VAL TO OUTPUT, N=BOARD # / IF M=0 CLR OUTPUT REG; OTHERWISE LEAVE / THE BITS OF DBSO SET MASK=DIGIO DRO, 0 JMS I FIXP DCA I (MASK /DIGITAL OUTPUT VAL JMS I (GETARG JMS ARGN TAD (2 /65N5='DBCI+2' DCA KDBCO IAC TAD KDBCO DCA KDBSO TAD I (MASK /GET FL PT VAL SZA /CLR OUTPUT REG/ JMP KDBSO /NO CMA /YES,SET ALL BITS OF AC KDBCO, 0 /CLR OUTPUT REG SKP KDBSO, 0 /OUTPUT DIG VAL CLA JMP I DRO FLGNEG=DRO /NEGCHK- THIS ROUTINE CHKS TO SEE IF A VALUE FROM / 'DRI' OR 'GET' IS NEGATIVE. IF IT IS / THE VALUE IS CHANGED TO 4096+NEG VAL. NEGCHK, 0 DCA FLGNEG /VAL IS EITHER + R - TAD FLGNEG DCA ACH JMS I (FFLOT TAD FLGNEG SMA CLA /VAL WAS NEG? JMP I NEGCHK /NO JMS I (FADD /YES FL4096 JMP I NEGCHK CLUGE, ADST /START CONV JMP ADSAM+3 PAGE /GET(M,L)- M=0, GET VAL FROM USER BUF & NO MASKING / M>0, GET VAL FROM USER BUF & MASK WHERE / M IS THE MASKING VALUE. / L IS THE LOCATION OF USER BUF TO ACCESS LHOLD=ARG123 GET, 0 IAC DCA MSKCTR JMS I FIXP /GET M SNA /M=0 CMA /YES,SET M=7777 CLL RAR SZL JMP .+3 ISZ MSKCTR JMP .-4 RAL JMS COMMON /SAME CODE FOR 'GET' & 'PUT' TAD MSKCTR CIA DCA MSKCTR TAD I LHOLD CDF /RESET D.F. CLL RAR ISZ MSKCTR JMP .-2 RAL AND MASK JMS I (NEGCHK JMP I GET MSKCTR, 0 /PUT(M,L)- M IS THE FL PT VALU TO BE FIXED & PUT / IN THE USER BUF; L IS THE LOC OF THE USER / BUF WHERE TO STORE THE FIXED NUMBER. PUT, 0 JMS I FIXP /GET & FIX THE FL PT VAL JMS COMMON TAD MASK DCA I LHOLD CDF JMP I PUT /COMMON- THIS ROUTINE IS USED BY BOTH 'GET' & 'PUT' COMMON, 0 DCA MASK /SAVE M TEMPORARILY JMS I (GETARG JMS I FIXP /GET L CLL TAD I (BUFBAK DCA LHOLD SZL /CROSSED FIELDS? TAD K0010 /YES TAD I (CDFBAK /NO DCA .+1 0 JMP I COMMON /WHEN INTERRUPT OCCURS COME HERE / SERVC, CLA CLSK /CLOCK INTERRUPT? SKP /NO JMP I (ADSAM /YES KSF /TTY INTERRUPT? SKP /NO JMP KKBRD /YES TSF /DUE TO LAST ECHO? HLT /SPURIOUS INTERRUPT TCF /YES JMP I (TION KKBRD, KRB TLS /ECHO CHAR TAD (-203 SZA CLA /^C TYPED? JMP I (TION /NO,IGNORE CHAR JMS I P1SWAP /YES JMP I (7605 /RTN TO MONITOR /ARG123-THIS ROUTINE GETS 3 ARGUMENTS OF A FUNCTION / AND STORES THEIR FL PT VALUES IN / 'ARG1,ARG2,ARG3' & STORES THEIR FIXED VALUES / AT 'ADR,ADR+1,ADR+2' / CALL: JMS ARG123 / ADR-1 ARG123, 0 TAD I ARG123 /GET(ADR-1)FOR THE THREE DCA XR1 /1WD ARGS ISZ ARG123 JMS I FIXP DCA I XR1 /SINGLE PREC ARG1 JMS I (GETARG /ARG2 DESIGN BY AC=0 JMS I FIXP DCA I XR1 /SINGLE PREC ARG2 IAC JMS I (GETARG /ARG3 DESIGN BY AC-3 JMS I FIXP DCA I XR1 /SINGLE PREC ARG3 JMP I ARG123 /DRESET-USED TO RESET STARTING DIGITAL IO BOARD & CTR; / WAIT FOR CLK TO O.F.; SAMPLE EACH BOARD ASKED FOR. / DRESET, TAD I (NSAM CIA DCA I (NCTR TAD I (CSAM /STARTING BOARD # CLL RTL RAL /ST BOARD #*10(8) TAD (DBCI-10 DCA KDBCI /[DBCI-10(8)] FOR 1ST BOARD /WAIT LOOP CLSK JMP .-1 CLSA /READ STATUS & CLR CLA /SAMPLE ALL BOARDS ASKED FOR DIGSAM, TAD K0010 TAD KDBCI JMS DIGIO /SAMPLE BOARD JMS I (PUTBUF /PUT DIG VAL IN BUF ISZ I (NCTR /MORE BOARDS? JMP DIGSAM /YES ISZ I (PCTR /NO, JOB IS ALL DONE? JMP DRESET /NO JMP I (DONE /YES,'DONE' IS IN 'CLK' ROUTN /DIGIO-ENTER WITH 'DBCI' SETUP FOR CORRECT BOARD; THIS RTN / SETS UP THE 'DBRI & DBCI' AND SAMPLES CORRECT BOARD; / EXIT WITH DIGITAL VAL IN AC / DIGIO, 0 DCA KDBCI TAD KDBCI IAC DCA KDBRI KDBRI, 0 KDBCI, 0 JMP I DIGIO $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 | /OS8 FORTRAN II COMPILER V5 / / / / / / / // / / / / /COPYRIGHT (C) 1971,1974,1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / / / SYMBOL TABLE FOR FORTRAN COMPILER (8K- PDP-8) / FOR USE WITH DISK/DECTAPE MONITOR SYSTEM / CHANGE LOCATION 'XFINI' TO A 'JMP I LFINI' THEN /ASSEMBLE AND SAVE / .PAL FORT.PA / .PAL FPATCH.PA / / .LO FORT.BN$FPATCH.BN$ / / .SA SYS FORT / / FIELD 0 *200 INBUF, TEXT /PDP-8 FORTRAN DEC-08-A2B1-5A/ *1000 BEGIN, PLS /INITIALIZATION ROUTINE TLS RFC CDF 00 TAD CM1300 /SET SYMBOL TABLE TO ZEROS (6300-7577 FIELD 1) DCA INDX TAD BSYMP DCA TPTT LP, DCA I TPTT ISZ INDX JMP LP TAD CM60 DCA INDX TAD BTTAB DCA TPTT DCA I TPTT /ZERO OUT TEMPORARY TABLES IN FIELD 0 ISZ INDX JMP .-2 CDF 10 TAD MIN104 /ZERO EVERYTHING FROM ZERO TO 107 DCA INDX TAD CP6 DCA TPTT LPP, DCA I TPTT ISZ INDX JMP LPP TAD TPT /MOVE DATA FROM TABLE TO FIELD 0 DCA TPTT REP, CDF 00 TAD I TPTT SNA /END OF FIELD 0 INITIALIZATION? JMP DN /YES DCA LOC TAD I TPTT CDF 10 DCA I LOC JMP REP DN, TAD I TPTT /MOVE DATA FROM TABLE TO FIELD 1 SNA /END FIELD 1 INITIALIZATION JMP DNN /YES DCA LOC TAD I TPTT DCA I LOC JMP DN DNN, CIF 10 JMP I STRT LOC, 0 INDX, 0 MIN104, L7-ASSIGN CP6, L7-1 CM1300, -1300 CM60, -60 BTTAB, ITTAB-1 BSYMP, BSYM-1 /BOTTOM OF TEMPORARY SYMBOL TABLE STRT, FORST /STARTING POINT AFTER INITIALIZATION TPTT=10 TPT, TABLE-1 TABLE, PUNCH LTTYPE 15 DOEND 45 FTTAB 51 ITTAB 47 TSYM-3 50 TSYM 55 -25 56 BSYM 57 BSYM 71 5777 74 3000 MIKE4 3377 POINTZ 3377 BASE INBUF BASE2 INBUF+100 SCOUNT 0 SCOUNT+1 0 SCOUNT+2 0 QONE 0 QONE+1 0 QONE+2 0 QONE+3 0 QONE+4 0 QONE+5 0 QONE+6 0 0 /THIS TERMINATES FIELD ZERO INITIALIZATION 2375 4000 2376 4000 2377 4000 0 / ERROR MESSAGE TABLE AND TEXT ELIST, -ERR1-1; EMSG1 /ILLEGAL CONTINUATION -ERR2-1; IE /ILLEGAL ARITHMETIC EXPRESSION -ERR3-1; IE -ERR6-1; IE -ERR9-1; EMSG3 -ERR10-1; EMSG4 -ERR12-1; EMSG4 -ERR14-1; EMSG4 -ERR15-1; EMSG3 -ERR16-1; EMSG5 -ERR17-1; EMSG6 -ERR18-1; SE /SYNTAX ERROR -ERR28-1; SE -ERR29-1; SE -ERR30-1; EMSG8 /ILLEGAL VARIABLE -ERR31-1; SE -ERR35-1; SE -ERR36-1; EMSG36 -ERR37-1; CE -ERR38-1; EMSG9 /ILLEGAL DO NESTING -ERR39-1; SE -ERR40-1; IE -ERR41-1; EMSG10 /EXPRESSION TOO BIG -ERR42-1; IE -ERR43-1; EMSG11 /MIXED MODE -ERR44-1; EMSG9 -ERR47-1; SF /SUBR. OR FUNCT. STMT. NOT FIRST -ERR48-1; SE -ERR50-1; SE -ERR51-1; SE -ERR52-1;IE -ERR53-1; EMSG12 /ILLEGAL SUBSCRIPT -ERR54-1; EMSG13 /ILLEGAL EQUIVALENCING -ERR59-1; SE -ERR60-1; EMSG3 0; EMSG14 /COMPILER MALFUNCTION EMSG1, TEXT /ILLEGAL CONTINUATION/ IE, TEXT /ILLEGAL ARITHMETIC EXPRESSION/ EMSG3, TEXT /ILLEGAL STATEMENT/ EMSG4, TEXT /ILLEGAL CONSTANT/ EMSG5, TEXT /ILLEGAL STATEMENT NUMBER/ EMSG6, TEXT /SYMBOL TABLE EXCEEDED/ SE, TEXT /SYNTAX ERROR/ EMSG8, TEXT /ILLEGAL VARIABLE/ EMSG9, TEXT /ILLEGAL OR EXCESSIVE DO NESTING/ EMSG10, TEXT /ARITHMETIC EXPRESSION TOO COMPLEX/ EMSG11, TEXT /MIXED MODE EXPRESSION/ EMSG12, TEXT /EXCESSIVE SUBSCRIPTS/ EMSG13, TEXT /ILLEGAL EQUIVALENCING/ EMSG14, TEXT /COMPILER MALFUNCTION/ CE, TEXT /UNBALANCED QUOTES/ SF, TEXT /SUBR. OR FUNCT. STMT. NOT FIRST/ EMSG36, TEXT /ARRAY TOO LARGE/ ITTAB=710 FTTAB=ITTAB+30 DOEND=2377 BSYM=6300 TSYM=7600 / THE STATEMENT TYPE TABLE FOLLOWS *2600 STYPE, 7361 /-DO 0000 LDO 6672 /-IF 0000 LIF 7061 /-GO 5361 /-TO LGOTO 7477 /-CA 6364 /-LL CAL 5573 /-RE 5353 /-TU LRET 7461 /-CO 6154 /-NT LCONT 5454 /-ST 6060 /-OP LSTOP 5777 /-PA 5255 /-US LPAUSE 5573 /-RE 7674 /-AD LREAD 5056 /-WR 6654 /-IT LWRIT 7161 /-FO 5563 /-RM LFRMAT 7262 /-EN 7400 /-D LLAST 7461 /-CO 6263 /-MM LCOMON 7367 /-DI 6273 /-ME LDIMEN 7257 /-EQ 5267 /-UI EQUI -0611 /-FI -1611 /-NI LFIN XXSUBR, 5453 /-SU 7556 /-BR LSUB 7153 /-FU 6175 /-NC LFUNC 0000 /THIS IS THE END OF LIST AREA1, 0 AREA2, 0 / THE PRECEDENCE TABLE FOLLOWS, NON-ZERO PREC. OPERATORS APPEAR -45 / PREC('%') = 7 NOTE: '%' REPLACES '**' 700 -52 / PREC('*') = 5 500 -57 / PREC('/') = 5 500 -53 / PREC('+') = 4 400 -55 / PREC('-') = 4 400 -75 / PREC('=') = 1 100 -74 / PREC('<') = 1 NOTE: '<' IMPLIES SUBSCRIPTED ASSIGNMENT 100 1 /THIS IS THE END OF THE TABLE THOU, -1750 -144 -12 -1 / THE PERMANENT SYMBOL TABLE BEGINS HERE *6000 1501 /MAIN 1116 0001 0601 /FAD 0400 0001 2324 /STO 1700 0001 0623 /FSB 0200 0001 0615 /FMP 2000 0001 0604 /FDV 2600 0001 1520 /MPY 3100 0001 0411 /DIV 2600 0001 2205 /READ 0104 0001 2722 /WRITE 1124 0501 1117 /IOH 1000 0001 5060 /(0 0000 0001 1215 /JMP 2000 0001 1617 /NOP 2000 0001 0516 /ENTRY 2422 3101 0501 /EAP 2000 0001 2001 /PAUSE 2523 0501 OPTADI, 2401 /TAD I 0440 1101 OPTAD, 2401 /TAD 0400 0001 OPDCA, 0403 /DCA 0100 0001 OPJMPI, 1215 /JMP I 2040 1101 2205 /RETRN 2422 1601 0320 /CPAGE 0107 0501 OPSNA, 2316 /SNA 0100 0001 2320 /SPC 0300 0001 0301 /CALL 1414 0001 0313 /CKIO 1117 0001 1014 /HLT 2400 0001 OPCLA, 0314 /CLA 0100 0001 0614 /FLOT 1724 0001 1106 /IFAD 0104 0001 0311 /CIA 0100 0001 0310 /CHS 2300 0001 0611 /FIX 3000 0001 1123 /ISTO 2417 0001 2001 /PAGE 0705 0001 BLCK, 0214 /BLOCK 1703 1301 0516 /END 0400 0001 1401 /LAP 2000 0001 0317 /COMMN 1515 1601 1123 /ISZ 3200 0001 2325 /SUBSC 0223 0301 DUMMY, 0425 /DUMMY 1515 3101 0122 /ARG 0700 0001 0314 /CLEAR 0501 2201 1111 /IIPOW 2017 2701 0611 /FIPOW 2017 2701 1106 /IFPOW 2017 2701 0606 /FFPOW 2017 2701 0403 /DCA I 0140 1101 0103 /ACH 1000 0001 OPEN, 1720 /OPEN 0516 0001 0522 /ERROR 2217 2201 1116 /INC 0300 0001 FORTR, 0617 /FORTR 2224 2201 OPCMA, 0315 /CMA 0100 0001 OPIAC, 1101 /IAC 0300 0001 EXIT, 0530 /EXIT 1124 0001 FIELD 1 *0 FIRSTF, 1 *7 L7, 0 L10, 0 L11, 0 L12, 0 /LAST LINE'S CONTENTS FOR OPTOMIZATION 0 L14, 0 L15, 2377 /POINTER INTO DOEND LIST L16, 0 L17, 0 L20, 0 /FLAG, NON-ZERO IF '=' SEEN L21, 0 L22, 0 /SUBSCRIPT NESTING LEVEL L23, 0 /USED BY "DUMARG" AND "IOHAR" PATCH L24, 0 /LINE POINTER L25, 0 /HIGHEST SUBSCRIPT TEMP USED L26, 0 /USED FOR DIMENSION INFORMATION 0 /UNUSED L30, 0 /FOLLOWING EIGHT LOCS ARE USED BY ENTITY L31, 0 L32, 0 L33, 0 L34, 0 L35, 0 L36, 0 L37, 0 L40, 0 /CONTAINS THE CURRENT TRIPLE NUMBER L41, 0 /THIS IS THE POINTER INTO THE PUSH DOWN LIST L42, 0 /THESE TWO LOCATIONS ARE USED BY THE TRIPLE PROCESSOR L43, 0 / L44, 0 /CONTAINS ONE FOR RIGHT OF EQUALS, ZERO FOR LEFT L45, FTTAB /CONTAINS LARFEST FLOATING POINT TEMPORARY NUMBER USED L46, 0 /CONTAINS NUMBER OF THE TRIPLE CURRENTLY IN THE AC L47, 7575 /CONTAINS THREE LESS THAN START OF FCON TABLE L50, 7600 /CONTAINS START OF DIMENSION TABLE L51, ITTAB /CONTAINS LARGEST INTEGER TEMPORARY NUMBER USED L52, 0 /CONTAINS ONE IF RETURN FROM GENER IS DESIRED FOR BALANCE L53, 0 /CONTAINS THE LAST CREATED LABEL L54, 0 /CONTAINS THE LABEL FOR THE CURRENT STATEMENT L55, -25 /CONTAINS THE MAXIMUM ALLOWABLE NUMBER OF UNENDED DOS L56, 6300 /CONTAINS BEGINNING OF SYMBOL TABLE L57, 6300 /CONTAINS END OF SYMBOL TABLE L60, 0 /"INDIRECT =" FLAG FOR S.S LEFT OF EQUALS SIGN L61, 0 /NON-ZERO IF LAST STMT READ IS A COMMENT L62, 0 /NEXT FOUR LOCATIONS USED BY GENER AND ENTITY L63, 0 /CONTAINS THE CURRENT OPERATOR L64, 0 /POINTS TO THE LAST OPERATOR IN THE STACK L65, 0 /CONTAINS THE PRECEDENCE OF THE CURRENT OPERATOR BPAREN, 0 /PARENTHESIS COUNTER L67, 0 /ONE FOR FUNCTION AND ZERO FOR SUBROUTINE L70, 0 /CONTAINS POINTER TO SUBPROGRAM NAME L71, 5777 /BEGINNING OF PUSHDOWN LIST L72, 0 /SET TO ONE IF SUBSCRIPT IS ENCOUNTERED L73, 0 / L74, 3000 /BEGINNING OF ERASABLE LOCATIONS USED FOR PARAMETERS L75, 0 /SET TO ONE SUPPRESS /OUTPUT FROM COMPILER L76, 0 / L77, 0 /CONTAINS ADDRESS OF LAST ENTRY INTO FCON OR SYMBOL TABLE /THE FOLLOWING THREE LOCS ARE USED BY THE /LITERAL COLLECTER COUNT2, 0 /NUMBER OF DIGITS TO RIGHT OF DECIMAL POINT ESIGN, 0 /0 MEANS POSITIVE EXPONENT, 1 MEANS NEGATIVE FPSW, 0 /0 MEANS INTEGER CONSTANT, 1 MEANS FLOATING POINT MIKE4,MA, 3377 MIKE8,TOTAL, 0 INTA, 0 INTB,MIKE7, 0 SNUM,MB, 0 POINTZ, 3377 CHK, 0 IMPDO, 0 /"IMPLIED DO-LOOP IN PROGRESS" FLAG KOUNT, 0 ASSIGN, LASIGN /ROUTINE TO PROCESS ASSIGNMENT STATEMENTS PUTCH, LPUTCH /ROUTINE TO PUT A CHARACTER BACK IN THE INPUT BUFFER PROP, LPROP /PRINTS OPCODES PRCRL, LPRCRL /PRINTS CREATED LABELS PRINT, LPRINT /PRINTS ONE ASCII CHAR P2, LP2 /PRINT TWO PACKED ASCII CHARS GETCH, LGETCH /GETS ONE CHARACTER OUT OF THE INPUT BUFFER LUNCH, LLUNCH /PRINTS ERROR COMMENTS MODE, LMODE /DETERMINES THE MODE OF THE ARGUMENT LOOK, LLOOK /CHECKS FOR THE REST OF THE INPUT STATEMENT ZZZ, LZZZ /PRINTS OUT STATEMENT LABELS ENTITY, LENTT /GETS THE NEXT LOGICAL INPUT PARAMETER SYMTAB, LSYMTB /ENTERS SYMBOLS INTO THE SYMBOL TABLE DUMARG, LDMARG /SEES IF PARAMETER IS A DUMMY ARG OR SUBSCRIPT PRSYM, LPRSYM /PRINTS SYMBOLS CREATE, LCREAT /CREATES LABELS PROTAC, LPRTAC /PRINTS CONTENTS OF AC IN OCTAL PLAB, LPLAB /PRINTS LABELS PIFF, LPIFF /PUTS OUT AN IFF FOR THE CONTENTS OF THE AC TRIPL, LTRIPL /PROCESSES THE TRIPLES GENERATED FROM AN EXPRESSION GENER, LGENER /GENERATES THE TRIPLES LCHNG, CHNG /TEST FOR DUMMY ARG AND REPLACE CLAB, LCLAB /HANGS A CREATED LABEL ON THE NEXT LINE STORE, LSTORE /STORES THE CONTENTS OF THE AC FPROP, LFPROP /PUT OUT CALLS TO F.P. ROUTINES ZER, LZER DUM, LDUM /PROCESSES OCCURRANCES OF DUMMY ARGUMENTS IN LISTS DIM, LDIM /LOOKS UP DIMENSION INFORMATION ON VARIABLES PUNCH, LTTYPE /ADDRESS OF CURRENT OUTPUT ROUTINE C2, 2 C3, 3 C40, 40 C7240, 5440 /THIS WAS COLON-SPACE NOW ITS COMMA-SPACE C77, 77 CM40, -40 CM4046, -4046 CM50, -50 CM51, -51 CM54, -54 CM2, -2 CM3, -3 CHECK, LCHECK SMODE, LSMODE BSS, LBSS ARG, LARG C54, 54 BASE, INBUF BASE2, INBUF+100 C4000, 4000 GNB, LGNB *177 START, CLA /COME HERE AT BEGINNING OF EACH STMT DCA FIRSTF START1, TAD IMPDO SZA CLA JMP ERR1 /IF IMPDO<>0 THEN WE MUST HAVE SCREWED UP ON /CONTINUATIONS (I THINK) ISZ CHK /IS THERE A STMT IN THE BUFFER? JMP .+3 JMS I SWAP /YES, SWITCH BUFFER POINTERS JMP .+3 TAD BASE JMS I RCD /NO, READ THE NEXT LINE TEST, TAD L15 TAD CM3 DCA L16 /SET UP XR FOR DO TERMINATION TEST TAD L54 CIA TAD I L16 SZA CLA /ARE WE TERMINATING A DO? JMP ATRY JMS LDNEXT /TERMINATE DO LOOP JMP TEST /SEE IF THERE IS ANY MORE... ATRY, TAD L61 SZA CLA /A COMMENT? JMP CMNT TAD CHK SZA CLA /ILLEGAL CONTINUATION? ERR1, JMS I LUNCH JMS I STMT /GET THE STMT NR... TAD L32 SNA JMP .+4 /NO STMT NUMBER CIA TAD L12 SZA CLA /CAN WE OMIT A TERMINAL JMP? JMS I PRINT DCA L24 FLST, JMS LIST /PUNCH SOURCE STMT JMS I WIPE /ZERO THE SUBSCRIPT TEMP. TABLE TAD L32 DCA L54 TAD CM2 DCA L64 SKP ACA, DCA I BAREA1 JMS I GETCH JMP ALPH NOP JMS I PUTCH /PUT CHARACTER BACK ALPH, RTL CLL RTL RTL DCA L65 JMS I GETCH JMP ALPH2 NOP JMS I PUTCH /PUT CHARACTER BACK ALPH2, TAD L65 ISZ L64 JMP ACA DCA I BAREA2 DCA CHK TAD SSTYP /COMPARE THESE CHARS WITH DISPATCH TABLE DCA L17 TRY, TAD I L17 SNA /END OF THE TABLE? JMP I ASSIGN /YES, MUST BE ARITHMETIC STMT TAD I BAREA1 SZA CLA JMP NOHIT2 TAD I BAREA2 TAD I L17 SZA CLA JMP NOHIT1 TAD I L17 /FOUND A MATCH, GO TO PROPER HANDLER... DCA L30 JMP I L30 NOHIT2, ISZ L17 NOHIT1, ISZ L17 JMP TRY /DOESN'T MATCH, TRY AGAIN LDNEXT, 0 TAD L15 /RESET THE DO END POINTER TAD CM3 DCA L15 TAD L15 IAC DCA L16 CMA TAD L55 DCA L55 JMS I PROP /PUNCH 'JMP <LABEL>' 6044 TAD I L16 JMS I PRCRL JMS I PRINT TAD I L16 /PUNCH '<LABEL>,' JMS I CLAB JMS I PRINT JMP I LDNEXT PTEM, 0 LIST, 0 /PUNCH THE SOURCE STATEMENT TAD BASE /GET THE POINTER DCA PTEM TAD I PTEM /PUNCH A CHARACTER PAIR... JMS I P2 TAD I PTEM ISZ PTEM AND C77 SZA CLA /END OF THE BUFFER? JMP LIST+3 JMS I PRINT /YES, PUNCH A CR-LF AND RETURN JMP I LIST CMNT, JMS I PRINT /WE HAVE A COMMENT DCA L24 JMS LIST JMP START1 /ALLOW COMMENTS BEFORE SUBR. OR FUNCTION STMT. BAREA1, AREA1 BAREA2, AREA2 RCD, LRCD SSTYP, STYPE-1 /POINTER TO STATMENT TABLE IN FIELD 1 WIPE, LWIPE STMT, LSTMT SWAP, LSWAP *400 / THE FOLLOWING ROUTINE IS ENTERED WITH THE BUFFER POINTER IN THE AC / IT PUTS ONE LINE INTO THE BUFFER, / CHECKS FOR COMMENTS AND COUTINUATION LINES, AND IF IT IS A / CONTINUATION IT SETS KOUNT TO THE PROPER COLUMN / LRCD, 0 DCA TEM1 /SAVE THE BUFFER POINTER DCA I TEM1 DCA CHK /ZERO CONTINUATION FLAG DCA L20 /ZERO THE EQUALS FLAG DCA L61 /ZERO THE COMMENT FLAG TAD CM111 /BUFFER LIMIT IS 72 CHARACTERS DCA IX LRCDL, CLA JMS LPTRIN AND D177 SZA /LEADER OR BLANK TAPE? TAD CM177 SNA /RUBOUT? JMP LRCDL TAD (177-15 SNA JMP LCAR TAD (15-11 SNA JMP TAB TAD (11-40 SPA JMP LRCDL TAD (40-75 SNA /AN '=' ? ISZ L20 TAD C75 /CHAR OK... RESTORE IT & PUT IN BUFFER JMS KRONK /PUT IT IN THE BUFFER... JMP LRCDL /AND GET ANOTHER LCAR, TAD IX /PROCESS A CAR RETURN... CIA TAD CM111 SNA CLA /NULL STATEMENT? JMP LRCDL /YES, IGNORE JMS KRONK /PUT A ZERO IN THE BUFFER TAD I TEM1 TAD CM3 SNA JMP COMNT TAD CM20 SZA CLA /TEST FOR "S" IN COLUMN ONE JMP TINUE JMP I (SCODE COMNT, ISZ L61 /SET COMMENT FLAG... TAD C40 JMP STORSL TINUE, TAD TEM1 /CHECK FOR CONTINUATION... TAD C3 DCA P /SET THE POINTER TO COLS. 6 AND 7 TAD I P AND C5700 /NON-ZERO OR NON BLANK IN COL 6 TAD C4000 /MAKES THIS A CONTINUATION... SNA CLA /IS IT? JMP LRCDA /MAYBE... LRCDX, TAD B7 /YES, MAKE IT START IN COL 7 DCA KOUNT ISZ CHK /INCREMENT THE CONTINUATION FLAG TAD I TEM1 STORSL, TAD C5700 /MAKE THIS INTO A COMMENT LINE DCA I TEM1 JMP I LRCD /THEN RETURN LRCDA, TAD I P /NUMERIC AND NON-ZERO IN COL 7 MAKES AND C77 /THIS A CONTINUATION... TAD CM61 SPA CLA /IS IT? JMP LRCDX+3 /NO, RETURN IAC /YES, MAKE IT START IN COL 8 JMP LRCDX TAB, TAD C40 /PROCESS TAB CHARACTERS... JMS KRONK /PUT SOME SPACES IN THE BUFFER TAD IX TAD C3 /MAKE 1ST TAB GO TO COL 7 SMA /ARE WE AT END OF THE BUFFER? CLA /YES, FORCE TERMINATION AND B7 SZA CLA /MODULO 8? JMP TAB /NO, PUNCH SOME MORE SPACES JMP LRCDL /YES, GET ANOTHER CHAR KRONK, 0 /PUT A CHARACTER IN THE BUFFER... DCA CAR CLA IAC TAD IX /FIRST COMPUTE BUFFER ADDRESS... SNA /PAST COL. 72? JMP I KRONK /YES-RETN. TAD C111 /NO CLL RAR TAD TEM1 DCA P TAD CAR /PICK UP THE CHARACTER AND C77 SZL /ZERO LINK SAYS WE WANT THE LEFT HALF JMP .+5 RTL RTL RTL DCA I P TAD I P /ADD IN THE LEFT 6 BITS DCA I P /AND SALT THEM AWAY... ISZ IX /BUFFER OVERFLOW? JMP I KRONK LPTRIN, 0 /PAPER TAPE READER INPUT ROUTINE RSF JMP .-1 RRB RFC JMP I LPTRIN CAR, 0 /TEMPORARY, HOLDS THE CURRENT CHARACTER P, 0 /THIS IS THE BUFFER POINTER TEM1, 0 /THIS CONTAINS THE CURRENT BUFFER ADDRESS IX, 0 /THIS IS THE CHARACTER COUNTER CM111, -111 /MINUS THE BUFFER LIMIT PLUS ONE C111, 111 /THIS IS THE BUFFER LIMIT PLUS ONE D177, 177 CM177, -177 C75, 75 B7, 7 C5700, 5700 CM61, -61 CM20, -20 M1700, -1700 *600 CAL, TAD KOUNT /SUBROUTINE CALL STMT PROCESSOR DCA COUNT3 JMS I ENTITY JMP I ASSIGN JMP ON COUNT3, 0 Q12, 12 JMP I ASSIGN ON, JMS I GNB SNA /ANY ARGUMENTS? JMP CR2 /NO TAD CM50 SZA /MAYBE, IS THIS A '(' ? JMP I ASSIGN JMS I ZZZ /YES, PUNCH STMT NR, IF ANY TAD COUNT3 DCA KOUNT ISZ L44 DCA L46 /AC SWITCH DCA L52 /IF STATEMENT SWITCH JMS I GENER /LET TRIPLE GENERATOR PROCESS IT DCA L46 /ZERO AC AGAIN JMP START /COMPLETE, GET NEXT STATEMENT CR2, ISZ L32 /NO ARGUMENTS JMS I SYMTAB TAD L77 DCA GLU JMS I ZZZ /PUNCH '<LABEL>, CALL 0,<NAME>' JMS I FPROP GLU, 0 JMP START LGNB, 0 JMS LGTC DCA GLU TAD GLU TAD CM40 SNA CLA JMP LGNB+1 TAD GLU JMP I LGNB LGETCH, 0 JMS I GNB SNA /IS IT A END OF CARD JMP PUNC /YES ITS PUNTUATION TAD QM32 SPA SNA /IS IT ALPHABETIC JMP ALPHA //YES TAD CM40 CLL TAD Q12 SZL /IS IT NUMERIC? ISZ LGETCH /NUMERIC PUNC, ISZ LGETCH /PUNCTUATION ALPHA, CLA /ALPHABETIC TAD GLU JMP I LGETCH /RETURN / THIS ROUTINE DETERMINES WHETHER SYMBOL IS FP OR INTEBER / ROUTINE SKIPS IF SYMBOL IS INTEGER LMODE, 0 SMA /IF ITS PLUS WE HAVE AN INTEGER JMP AINT /WE HAVE AN INTEGER RAL /GET NEXT BIT SPA /CHECK THIS BIT JMP FV /ITS EITHER A FCON OR VARIABLE RTL /GET NEXT TWO BITS SNL /IS IT AN OPERATOR ERR2, JMS I LUNCH /YES AFP, SMA CLA /CHECK THIS BIT JMP AINT /ITS AN INTEGER JMP I LMODE /SYMBOL WAS F P MODE FV, RAR /RESTORE AC TO ORIGINAL CONTENTS CIA /SET NEGATIVE TAD L47 /ADD START OF FCON TABLE SPA /IS /SYMBOL FCON JMP AFP /YES CIA /NO /RESTORE AC AGAIN TAD L47 DCA ATEM /SAVE THE RESTORED NUMBER TAD I ATEM /GET THE POINTER TO THE VARIABLE TAD CM1100 /SUBTRACT AN I SPA /IS IT LESS THAN I JMP AFP /YES ITS FLOATING POINT TAD CON1 /NOW SUBTRACT AN N SPA CLA /IS IT LESS THAN N AINT, ISZ LMODE /YES CON1, CLA /CLEAR THE AC FOR THE RETURN JMP I LMODE ATEM, 0 CM1100, -1100 QM32, -32 LGTC, 0 /GET A CHARACTER FROM THE BUFFER TAD KOUNT ISZ KOUNT CLL RAR /LINK TELLS IF LEFT OR RIGHT HALF TAD BASE DCA GLU TAD I GLU SZL /WHICH CHARACTER JMP MMSK RTR RTR RTR MMSK, AND C77 SZA JMP I LGTC TAD CHK SPA CLA /DO WE WANT A NEW LINE YET? JMP I LGTC /NOT YET... TAD BASE2 /YES, USE THE ALTERNATE BUFFER JMS I RLCD TAD CHK SZA CLA /IS IT A CONTINUATION? JMP .+4 CMA /NO, SET FLAG AND RETURN W ZERO AC DCA CHK JMP I LGTC JMS LSWAP /YES, SWITCH BUFFERS AND CONTINUE DCA CHK JMP LGTC+1 RLCD, LRCD LSWAP, 0 /SWITCH THE LINE BUFFER POINTERS TAD BASE DCA ATEM TAD BASE2 DCA BASE TAD ATEM DCA BASE2 JMP I LSWAP *1000 / THE POINTER TO THE CURRENT LOCATION IN THE PUSH LIST IS / IN LOC 41, THE CURRENT TRIPLE NUMBER IS IN LOCATION 40 / LOC 44 MUST BE SET TO 0 IF THERE IS AN '=' , TO 1 IF NOT. PBEGN, AREA2 /START OF THE PRECEDENCE LIST BINTEG, TAD L32 /HERE IF ENTITY SENT AN INTEGER JMP I BPUSH /PUSH IT INTO STACK FLPT, JMS I FCON /HERE IF ENTITY FOUND A FLOATING POINT CON SKP /ENTER IT INTO FPTABLE BLPHA, JMS I SYMTAB /HERE IF ENTITY FOUND A VARIABLE TAD L77 /PICK UP POINTER INTO SYM TAB OR FLPT TAB AN JMP I BPUSH /PUSH IT DOWN LABELX, JMP I LGENER LGENER, 0 /ENTRY POINT TAD C5000 DCA L40 /* DCA L21 /ZERO THE SYMBOL TABLE SWITCH TAD L71 DCA L41 /SET PUSH DOWN POINTER DCA L22 DCA BPAREN /ZERO OUT THE PAREN SWITCH TAD C4000 DCA I L41 /FIRST PUSH DOWN LEFT CLOSURE NAMELY 0 BNEXT, JMS I ENTITY /THIS WILL GET THE NEXT DATUM TO BE PROCESSE JMP HOO /END OF STATEMENT RETURN,TREAT LIKE PUNCTION JMP BLPHA /VARIABLE RETURN JMP BINTEG /INTEGER RETURN JMP FLPT /FLOATING POINT RETURN HOO, TAD CM50 /PUNCTIOATION RETURN, SNA /IS IT ( JMP I BPAR /YES TAD C7753 SZA /IS IT AN '=' ? JMP BRET TAD L44 /WE HAVE AN '=', IS IT LEGAL? SNA CLA JMP BRET /IT IS TAD IMPDO SZA CLA /ARE WE IN AN IMPLIED DO LOOP? JMP I PIOEQL /YES - TERMINATE LOOP CODE ERR3, JMS I LUNCH PIOEQL, IOEQL BRET, TAD C0075 DCA L63 TAD I L41 /CHECK FOR A UNARY OPERATOR TAD C4000 AND C7000 SZA CLA /WAS IT AN OPERAATOR AT ALL JMP PREC /NO, STILL NOT UNARY OPERATOR TAD L63 TAD C7725 SNA /IS IT A '+' JMP BNEXT /YES, IGNORE IT TAD CM2 /NO SZA CLA /IS IT A '-' ? JMP ERR3 TAD C4643 /THIS IS THE UNARY MINUS JMP I BPUSH PREC, TAD PBEGN /HERE IS WHERE WE FIND THE PRECIDENCE DCA L17 DCA L65 SKP RETUR, ISZ L17 /PICK UP NEXT OP CODE IN LIST TAD I L17 /TO GET THE NEXT LIST ITEM SMA SZA /IS THIS THE END OF THE LIST JMP BMORE /NO, THE ASSUMPTION IS THAT THE PRECIDENCE TAD L63 /IS ZERO SZA CLA /IS THIS THE RIGHT TABLE ENTRY JMP RETUR /TRY AGAIN (IT WASN"T) TAD I L17 /TO GET THE PRECEDENCE DCA L65 BMORE, CLA IAC /HERE WE ARE GOING TO SEE IF THERE IS A PREC TAD L41 DCA L64 /L64 NOW POINTS TO THE PREVIOUS OPERATOR TAD I L64 TAD C4000 AND C7000 SZA /IS THERE A VALID OPERATOR ON THE STACK? JMP ERR3 /APPARENTLY NOT... TAD I L64 /IF THE PRECEDENCE OF THE PREVIOUS OPERATOR AND C700 /IS NON-ZERO, AND ITS PRECEDENCE IS GREATER SNA /THAN OR EQUAL TO THE PRECEDENCE OF THE JMP NO /CURRENT OPERATOR, THEN PROCESS THE PREVIOUS CIA /OPERATOR; IF NOT WE WILL PROBABLY PUT TAD L65 /THE CURRENT OPERATOR ON THE STACK AND GET SMA SZA CLA /ANOTHER ITEM FROM THE STATEMENT BUFFER... JMP NO ISZ L40 /YES, INCREMENT THE TRIPLE NUMBER AND.... JMS I TRIPL /PROCESS THE PREVIOUS OPERATOR ISZ L41 /*****NOTE WHAT IF IT WAS UNARY************ TAD I L41 TAD C3135 /THIS IS MINUS UNARY MINUS SZA CLA ISZ L41 /DELETE THE LAST 3 ITEMS AND REPLACE WITH TR TAD L46 DCA I L41 JMP BMORE /TRY FOR ANOTHER TRIPLE NO, TAD L63 SNA /IS IT A END OF STATEMENT MARK JMP I LCDONE /IT WAS--WE ARE ALL FINISHED, EXCEPT CHECKING TAD CM51 SNA /IS IT A ')' ? JMP I LKPAR /YES TAD CM3 SZA /IS IT A ',' ? JMP NCOMMA /NO TAD BPAREN SNA CLA /IS A COMMA LEGAL HERE? JMP I LCDONE /MAYBE... NCOMMA, TAD CM21 SNA CLA /IS IT AN EQUALS SIGN? ISZ L44 /YES - SET EQUALS SWITCH ON TAD L63 /PUT THE OPERATOR ON THE STACK TAD L65 /ADD THE PRECEDENCE TAD C4000 JMP I BPUSH / BPUSH, PUSH C5000, 5000 BPAR, ALPAR C7753, 7753 C0075, 75 C7000, 7000 CM21, -21 C7725, 7725 C4643, 4643 C700, 700 C3135, 3135 LCDONE, CDONE LKPAR, KPAR FCON, LFCON *1200 PUSH, DCA L63 CLA CMA TAD L41 /SPACE THE POINTER UP ONE DCA L41 /* TAD L63 DCA I L41 /* JMP I LBNEXT /BACK TO BEGINING / THIS IS TO PROCESS SUBSCRIPTS OR FUNCTION CALLS--- / IF ARITHMETIC, JUST DELETE BOTH ( AND ) KPAR, TAD I L64 TAD C3730 /MINUS LEFT PAREN SZA /IS IT ( JMP BCON /NO-- CHECK SOME MORE TAD I L41 /DELETE PARENS DCA I L64 ISZ L41 /UPDATE POINTER LAPP, ISZ BPAREN /DO PARENS BALENCE JMP I LBNEXT TAD L52 /YES SNA CLA /SHOULD WE RETURN IF BALANCED JMP I LBNEXT TAD L46 SZA CLA JMP CDONE TAD I L41 DCA L77 JMS I XTAD /GENERATE TAD OR (TAD I) DCA I L41 /ZERO IS INTEGER CDONE, TAD L41 CMA TAD L71 SZA /WELL... ERR6, JMS I LUNCH /HA...YOU GOOFED JMS I XZQ JMP I .+1 LABELX BCON, IAC /IS IT FUNCTION ISZ L40 SNA JMP BFOUT /YES IAC /NO-- NOW IS IT SUBSCRIPT SNA JMP SOUT /YES TAD C7772 /NO SZA /IS IT COMMA JMP ERR6 /NO - BYE BYE CHARLIE ISZ L64 ISZ L64 TAD I L64 TAD C3724 /IS IT A COMMA SNA JMP BFOUT /FOUND TWO COMMAS,MUST BE FUNCTION TAD C5 /NO SNA /IS IT A PRIME JMP BFOUT /GOT A FUNCTION IAC /NO SZA CLA JMP ERR6 /SORRY, IT AIN'T NUTTIN SOUT, JMS I PLSBSC /PROCESS A SUBSCRIPT CMA TAD L22 DCA L22 SKP BFOUT, JMS I FUNCT JMP LAPP FUNCT, LFUNCT / THIS IS WHERE WE FIND OUT WHAT KIND OF LPAR ALPAR, CMA TAD BPAREN DCA BPAREN TAD I L41 TAD C4000 AND B7000 /IS IT AN OPERAND SZA CLA JMP CUNT /NO , TRY SOME MORE IAC JMP PRIME CUNT, TAD I L41 /PICK UP TOP LIST ITEM TAD C2 /ADD TWO TO FIND THE DIMENSION INTO(INFO) DCA L64 TAD I L64 AND C20 /JUST WANT ONLY THIS ONE BIT(DIMENSION) SNA CLA /IS IT DIMENSIONED JMP PRIME /NO ITS GOT TO BE A FUNCTION CALL ISZ L22 CMA PRIME, TAD C4047 JMP PUSH /GO PUSH A PRIME, IT IS THE FUNCTIONS LEFT PAREN XZQ, LXZQ LBNEXT, BNEXT C3730, 3730 C7772, 7772 C3724, 3724 C5, 5 D7, 7 B7000, 7000 C20, 20 C4047, 4047 XTAD, LXTAD LPUTCH, 0 CLA CMA TAD KOUNT DCA KOUNT JMP I LPUTCH LASIGN, TAD L20 /ARITHMETIC STATEMENT PROCESSOR SNA CLA /IS THERE AN '=' IN THE STMT? ERR9, JMS I LUNCH /NO, BETTER COMPLAIN... TAD D7 /SET POINTER TO COL 7 DCA KOUNT JMS I ZZZ /PUNCH THE LABEL, IF ANY DCA L46 DCA L44 DCA L52 JMS I GENER /PROCESS IT... TAD L63 SZA CLA /WAS TERMINATOR A <CR/LF> ? JMP ERR9 /NO, ILLEGAL STATEMENT ERROR ... JMP START PLSBSC, LSUBSC LPRCRL, 0 /SUBROUTINE PRINTS CREATED LABELS DCA LPRCTM TAD C36 /PUNCH '^' JMS I PRINT TAD LPRCTM /PUNCH THE LETTERS JMS I P2 JMP I LPRCRL C36, 36 LPRCTM, 0 *1400 PRET, ISZ LENTT /PUNCTIONATION EXIT POINT FRET, ISZ LENTT /FLOATING POINT EXIT POINT XIRET, ISZ LENTT /INTEGER EXIT POINT XARET, ISZ LENTT /VARIABLE EXIT ERET, JMP I LENTT /CR END OF LINE EXIT LENTT, 0 /ENTRY POINT CLA /WIPE OUT PSEUDO ACCUMULATOR DCA L32 DCA L31 DCA COUNT2 /RESET ALL KINDS OF THINGS TO ZERO DCA L36 DCA L37 DCA L30 DCA FPSW DCA ESIGN TAD CM6 DCA L65 /SET UP FOR MAXIMUM OF 6 CHARS JMS I GETCH /GET THE FIRST INPUT CHARACTER JMP .+3 /ALPHA RETURN JMP PUNCT /PUNCTIONATION RETURN JMP DIG /DIGIT RETURN JMS PACK /STORE THIS CHARACTER JMS I GETCH /GET ANOTHER CHACTER JMP .-2 /ALPHA- IS OK SKP /PUNCTUATION JMP .-4 /DIGIT--IS OK PROCESS IT JMS I PUTCH /PUT THAT PUNCTUATION BACK IN THE BUFFER TAD L32 AND CC7700 /MAKE SURE NAME IS <= 5 CHARACTERS LONG DCA L32 JMP XARET /RETURN WITH VARIABLE PACK, 0 /THIS PACK CHARS INTO L30 L31 AND L32 DCA L64 /SAVE THE CHAR... TAD L65 SNA /DO WE HAVE SIX CHARS ALREADY? JMP I PACK /YES - IGNORE STL; RAR TAD P33 DCA LTEM ISZ L65 C7, 7 TAD L64 CDF 10 SNL /DO WE HAVE LEFT OR RIGHT HALF? JMP .+5 CLL RTL /MUST BE LEFT HALF... RTL RTL SKP TAD I LTEM DCA I LTEM CDF 00 JMP I PACK LTEM, 0 PUNCT, SNA /HERE TO PROCESS PUNCTION---IS IT A CARIAGE RET JMP ERET /YES, GO RIGHT BACKTO THE CALLER....BY-BY TAD C7722 /IS IT A PERIOD SNA JMP CC /YES--WE ASSUME THAT THIS LENTT IS A FLOATING TAD C7 SNA /IS IT A QUOTE? JMP I QUOTE /YES - CHARACTER LITERAL TAD CM3 SZA /IS IT AN ASTERISK JMP NAH /NO JMS I GETCH /YES- PEEK AT NEXT CHAR JMP NOASS /ALPHA-- PUT IT BACK JMP ASSCK /PUNCTUATION-- CHECK FOR AN ASTERISK NOASS, JMS I PUTCH /DIGIT---PUT IT BACK NAH, TAD X52 /RESTORE CHARACTER TO WHAT IT WAS JMP PRET /THATS ALL---IT WAS PUNCTIONATION ASSCK, TAD CM52 /ANOTHER PUNCTUATION--IS IT (*) SZA JMP NOASS /NO---PUT IT BACK TAD C45 /IT WAS-- CHANGE ** TO PERCENT JMP PRET /---ALTERED PUNCTUATION DIG, AND C17 /FIRST CHAR WAS A DIGIT, DONT KNOW IS INTEGER O DCA L32 /AT ANY RATE SAVE IT IN THE PSEUDO ACCUMULATER CA, JMS I GETCH /GET ANOTHER CHACTER JMP I LTESTE /ALPHA--GO SEE IF IT IS AN -E- SKP /PUNCT JMP BONT /DIGIT GO PROCESS IT TAD C7722 /PUNCTUATION HERE, IS IT A PERIOD SZA JMP I LCOP / IT IS . WE HAVE A FLOATING POINT NUMBER CC, TAD FPSW SZA ERR10, JMS I LUNCH /TOO MANY (.) ISZ FPSW DCA COUNT2 JMP CA /GO BACK AND GET ANOTHER CHAR BONT, AND C17 /***COME HERE WITH ANOTHER DIGIT. DCA L36 /SAVE IT ISZ COUNT2 JMS I LMUL10 / AC = AC * 10 + DIGIT JMP CA /GO GET ANOTHER CHAR P33, L30+3 CM6, -6 C7722, 7722 X52, 52 CM52, -52 C17, 17 LTESTE, TESTE C45, 45 LCOP, COP LMUL10, MUL10 QUOTE, LQUOTE DMPLIN, 0 /SUBROUTINE TO DUMP "LAST LINE" BUFFER ISZ L24 TAD I L24 /GET NEXT CHAR JMS I PUNCH /PUNCH IT TAD I L24 TAD CM212 SZA CLA /IS CHAR A LINE FEED? JMP DMPLIN+1 /NO CLA IAC DCA L24 /RESET POINTER DCA L12 /ZERO CONTENTS FLAG JMP I DMPLIN /RETURN CM212, -212 CC7700, 7700 *1600 TESTE, TAD C7773 /IS IT E SZA JMP COP /NO, GO PUT IT BACK AND PROCESS / HERE IF EXPONENT FOLLOWES DCA L37 /IT WAS AN E / THIS ROUTINE IS TO PROCESS THE EXPONENT THAT FOLLOWES THE -E- THAT WE / ISZ FPSW /MAKE SURE THE FLOATING POINT SWITCH WAS KICKED JMS I GETCH /GET ANOTHER CHAR JMP ERR12 /ALPHA , CANT BE-- SO LONG, ITS BEEN NICE SKP /PUNCT JMP CD /DIGIT, GO PROCESS IT TAD X7725 /IS IT PULS SIGN SNA JMP CF /YES, IGNOR IT TAD CM2 SZA /IS IT MINUS JMP COP /NO, GO PROCESS THE FLOATING POINT NUMBER CLA CMA DCA ESIGN /YES- REMEMBER THAT THE EXPONENT WAS MINUS CF, JMS I GETCH /GET ANOTHER CHAR JMP COP /ALPHA, ALL READY TO PROCESS JMP COP /PUNCTUATION, READY TO PROCESS CD, AND X17 /DIGIT DCA L36 /SAVE IT IN 36 AND.. TAD L37 /MULTIPLY THE - EXPONENT TO DATE- BY 10 RAL CLL DCA L37 TAD L37 RAL CLL RAL CLL TAD L37 TAD L36 /AND ADD IN THIS DIGIT I.E. 37C10* DCA L37 / L37 = 10 * L37 + L36 JMP CF /GO DO IT AGAIN COP, JMS I PUTCH CLA CLL /PROCESS THIS NUMBER TAD FPSW /IS IT AN INTEGER SZA CLA JMP CH /NO, MUST BE FLOATING POINT / INTEGER IS IN ACC TAD L30 /YESS SNA /MAKE SURE INTEGER IS VALID TAD L31 SZA CLA JMP ERR12 TAD L32 SPA CLA ERR12, JMS I LUNCH /TOO BIG JMP I .+1 /TAKE INTEGER RETURN WITH INTEGER IN 32 XIRET CH, TAD L37 /WAS THIS AN E-CONVERSION NUMBER ISZ ESIGN /EXPONENT POSITIVE? CIA /YES TAD COUNT2 /ADD POST-DECIMAL COUNTER CLL SNA JMP CM /NOTHING TO DO SMA /DETERMINE WHETHER TO CML CIA /MULTIPLY OR DIVIDE DCA COUNT2 RAL TAD CJ DCA CK JMS XFLOAT /SET UP THE NUMBER CK, HLT /JMP I (MULT OR JMP I (DIVIDE ISZ COUNT2 JMP CK /LOOP ON COUNT JMP I LPOLIS /FINISH UP CM, JMS XFLOAT JMP I LPOLIS CJ, JMS I .+1 MULT DIVIDE / THIS ROUTINE CONVERTS THE NUMBER TO FLOATING POINT XFLOAT, 0 CLA CLL TAD L32 /CHECK IF THE ACCUMULATED NUMBER IS ZERO SNA TAD L31 SNA TAD L30 SNA CLA JMP I LFRET /IT WAS ZERO SEND A FLOATING POINT ZERO BACK-- TAD C2440 /IT IS NOT ZERO--SET THE EXPON TO 36 BASE 10 DCA L37 JMS NORMAL /GO TO THE NORMALIZE ROUTINE JMP I XFLOAT /AT THIS POINT THE MANTISA AND EXPON ARE SEPERA / ALSO NOTICE THAT WE HAVE 36 BINARY DIGITS I E THE WHOLE 3 WORDS ARE U / NORMAL IZATION OF A F P NUMBER NORMAL, 0 DA, TAD L30 /WE MUST SHIFT UNTIL THE HIGH ORDER WORD GOES N SPA CLA JMP I NORMAL /IT IS NEG., ALL DONE JMS I LLSHIF /GO DO A TRIPLE PRECISION LEFT SHIFT TAD L37 /AND SUBTRACT ONE FROM THE EXPONENT TAD C7770 /NOTE-- THE 3 LOW ORDER BITS ARE NOT USED SPA /IF THIS DOESNT SKIP WE HAVE F P OVERFLOW JMP ERR12 /BY-BY NUMBER TOO LARGE FOR THE MACHINE DCA L37 JMP DA / THE FOLLOWING ROUTINE SAVES THE ACC IN THE MQ C7773, 7773 X7725, 7725 X17, 17 C7770, 7770 LPOLIS, POLISH LFRET, FRET C2440, 2440 LLSHIF, LSHIFT SCODE, CDF 10 /SHIFT S-CODE 2 COLS. LEFT TAD I (TEM1 CDF 0 DCA SLOC1 TAD SLOC1 IAC DCA SLOC2 ISZ L61 /SET COMMENT FLAG SCODL, TAD I SLOC2 DCA I SLOC1 TAD I SLOC2 AND C77 SNA CLA /END OF LINE? JMP I (STORSL+2 ISZ SLOC1 ISZ SLOC2 JMP SCODL /AND CONTINUE PROCESS SLOC1, 0 SLOC2, 0 *2000 XSAVE, 0 /-- THE F.P. AC IS IN LOCS 30-32 TAD L30 /-- THE "MQ" IS IN LOCS 33-35 DCA L33 /---THE EXPONENT IS IN LOCS 37 TAD L31 DCA L34 TAD L32 DCA L35 JMP I XSAVE / SHIFTS THE PSEUDO-ACC LEFT ONE PLACE LSHIFT, 0 CLA CLL TAD L32 RAL DCA L32 TAD L31 RAL DCA L31 TAD L30 RAL DCA L30 JMP I LSHIFT / THE FOLLOWING ROUTINE ADDS THE MQ TO THE ACC ADD, 0 CLA CLL TAD L32 TAD L35 DCA L32 RAL TAD L31 TAD L34 DCA L31 RAL TAD L30 TAD L33 DCA L30 JMP I ADD / THE FOLLOWING ROUTINE SHIFTS THE ACC RIGHT ONE PLACE RSHIFT, 0 CLA CLL TAD L30 RAR DCA L30 TAD L31 RAR DCA L31 TAD L32 RAR DCA L32 JMP I RSHIFT / / MULT, 0 /ACCCACC*10 MQ JMS RSHIFT JMS XSAVE JMS RSHIFT JMS RSHIFT JMS ADD /THIS FINISHES THE MULT BY 10 TAD L37 /NOW DIDDLE THE EXPONENT TAD C40 SPA /OVERFLOW TEST ERR14, JMS I LUNCH /FLOATING POINT OVERFLOW DCA L37 JMS I LNRMAL /MAKE SURE THE F P NUMBER IS STILL IN NORMAL FO JMP I MULT DIVIDE, 0 /DIVIDE THE F P NUMBER BY 10 JMS RSHIFT /BASED ON THE FACT THAT .1 BASE 10 C .000110011 JMS XSAVE /THAT IS WE MULTIPLE BY ONE TENTH TAD C7766 /THIS IS A COUNTER********************** DCA ZCTR DB, JMS RSHIFT JMS ADD ISZ ZCTR SKP JMP DC JMS RSHIFT JMS RSHIFT JMS RSHIFT JMS ADD JMP DB DC, TAD L37 TAD C7750 /********INSERT HERE THE CONSTANT************ DCA L37 /WE HAVE JUST DIDDLED THE EXPONENT BY THE PROP JMS I LNRMAL /MAKE SURE IT IS STILL NORMALIZ D JMP I DIVIDE ZCTR, 0 MUL10, 0 /THIS MULTIPLIES THE TRIPLE PREC. INTEGER INT E JMS LSHIFT /BY 10 JMS XSAVE JMS LSHIFT JMS LSHIFT JMS ADD TAD L36 /NOW CRAM THE DIGIT THAT WE WANT TO ADD INTO TH DCA L35 /* DCA L34 DCA L33 JMS ADD /AND ADD IT TO THE ACC JMP I MUL10 /IN OTHER WORDS ACCCACC*10 DIGIT POLISH, CLA CLL /THIS TAKES THE SEPARATE MANTISSA AND EXP--ENT. TAD C400 /AND PUTS THEM INTO 7090 FORM. THIS IS THE R-U DCA L35 /27 DIGITS DCA L34 /ROUND FACTOR IS CRAMED INTO THE MQ DCA L33 JMS ADD /AND ADDED TO THE INTEGER IN THE ACC SNL /IF THE LINK IS ON, WE OVERFLEW ON THE CARRY JMP POLSH /WE DIDNT TAD C4000 /SET THE ACC TO .1000000000 (THE REST OF IT IS DCA L30 TAD L37 /DIDDLE THE EXPONENT BY ONE. THIS IS A FINKIE N TAD J10 SNA JMP ERR14 /EXPONENT OVERFLOW ... DCA L37 POLSH, TAD C7767 /NOW SHIFT THE ENTIRE ACC RIGHT 9 TIMES DCA ZCTR /( THATS SO WE WILL HAVE ROOM TO STICK IN THE E HOOP, JMS RSHIFT ISZ ZCTR JMP HOOP TAD L37 /CRAM THE EXP TAD L30 /INTO THE ACC DCA L30 /AND VOILA, WE ARE DONE. GO TAKE THE FPOINT EX JMP I .+1 FRET LNRMAL, NORMAL C7766, 7766 C7750, 7750 C400, 400 J10, 10 C7767, 7767 *2200 / THE FOLLOWING ROUTINE LOOKS FOR A STATEMENT NUMBER LSTMT, 0 JMS I CLEAR /CLEAR THE PSEUDO ACC AND MQ TAD C7240 /DON'T LET LGTC GET ANOTHER LINE YET(CHK MUST BE NEG., BUT NOT 4000!!) DCA CHK IAC DCA KOUNT LABEL, JMS I GTCL /GET A CHARACTER SNA /IS THIS A CAR RET? ERR15, JMS I LUNCH /YES, INCOMPLETE STATEMENT TAD CM40 SNA /SPACE? JMP SPACE TAD CM32 CLL TAD C12 SNL / 260 <= CHAR < 272 ? ERR16, JMS I LUNCH DCA L36 /SAVE THIS DIGIT... JMS I MULT10 / ACC = 10 * ACC + L36 SPACE, TAD KOUNT TAD DM6 SPA CLA /END OF STMT NR FIELD? JMP LABEL /NOT YET... JMS I GTCL /SKIP OVER COL 6 SNA CLA /IS IT A CAR RET? JMP ERR15 TAD L31 /SEE IF STMT NR IS LEGAL... SZA JMP ERR16 TAD L32 SPA CLA /IS STMT NR < 2048 ? JMP ERR16 /NO, STMT NR TOO BIG JMP I LSTMT CLEAR, LCLEAR GTCL, LGTC MULT10, MUL10 CM32, -32 DM6, -6 C12, 12 / / SUBROUTINEE TO PRINT A SYMBOL / / JMS I PRSYM / LPRSYM, 0 /THIS ROUTINE PRINTS SYMBOLS DCA LCH TAD LCH SMA /IS IT AN INTEGER CONSTANT JMP ICON /YES PROCESS IT RTL /SHIFT THE NEXT BIT INTO THE LINK SNL /IS IT A TEMPORARY JMP TEMPO /ITS A TEMPORARY RTR /RESTORE THE SYMBOL CIA /SET IT NEGATIVE TAD L47 /SUBTRACT THE BEGINNING OF THE XFCON TABLE SPA CLA /DO WE HAVE AN FCON JMP XFCON /YES PROCESS IT TAD LCH TAD C2 /ADD TWO TO THE SYMBOL TABLE POINTER DCA LP2 /AND SAVE IT TAD I LP2 /GET THE CONTROL BITS FOR THE SYMBOL RAR /GET EXTERNAL SUBROUTINE BIT IN LINK SZL CLA /IS THIS AN EXTERNAL SUBROUTINE JMP SKPIT /YES...DONT PUT OUT THE BACK SLASH TAD C34 JMS I PRINT SKPIT, TAD I LCH JMS LP2 /PRINT THEM ISZ LCH TAD I LCH JMS LP2 /AND PRINT THEM ISZ LCH TAD I LCH AND X7700 /MASK SO WE DONT PUT OUT CONTROL BITS JMS LP2 /AND PRINT IT JMP I LPRSYM /NOW RETURN LP2, 0 /THIS IS THE ROUTINE THAT PRINTS TWO CHARACTERS DCA UNCH /SAVE THE CHARS TAD UNCH /GET THEM AGAIN RTR /ROTAT FIRST CHAR INTO POSITION RTR RTR AND C77 /MASK SECOND CHARACTER SZA /IS IT AN ACTUAL CHARACTER JMS I PRINT /YES PRINT IT TAD UNCH /GET THE TWO CHARS AGAIN AND C77 /MASK OUT FIRST CHARACTER SZA /IS IT ACTUALLY A CHARACTER JMS I PRINT /YES PRINT IT JMP I LP2 /AND RETURN ICON, CLA /INTEGER CONSTANT, PUNCH A '(' TAD K50 JMS I PRINT TAD LCH /AND THE NUMBER PROCT, JMS I PROTAC JMP I LPRSYM /RETURN TEMPO, RTL SPA CLA /SUBSCRIPT TEMPORARY? JMP SBSCR RTL TAD D33 /PUNCH '[' FOR INTEGER AND ']' FOR FLOATING PT JMS I PRINT /AND PRINT IT TAD LCH SPA /DO WE STILL HAVE A TEMPORARY JMS I TEMPOR /YES GET THE TEMPORARY NUMBER JMS I PRINT /AND PRINT IT JMP I LPRSYM /RETURN SBSCR, TAD D33 /SUBSCRIPT TEMPORARY, PUNCH A '[' JMS I PRINT TAD LCH JMS I SUBTEM /AND 4 DIGITS JMP PROCT XFCON, TAD C35 /FLOATING POINT CONSTANT... JMS I PRINT /PUNCH A ']' TAD LCH CIA TAD L50 /SUBTRACT FROM END OF TABLE JMP PROCT D33, 33 C35, 35 K50, 50 C34, 34 X7700, 7700 LCH, 0 UNCH, 0 SUBTEM, LSBTEM TEMPOR, LTMPOR *2400 / / SUBROUNTINE TO DO SYMBOL TABLE MANIPULATIONS / C300, 300 C212, 212 C215, 215 SCOUNT, 0 /CURRENT NUMBER OF SYMBOLS XCTR, 0 /COUNTER FCOUNT, 0 /CURRENT NUMBER OF FCONS LSYMTB, 0 CLA /CLEAR THE AC LOOP1, TAD L56 /GET BEGINNING OF SYMBOL TABLE DCA LSYMTM /AND SAVE IN TABLE TAD SCOUNT /GET NUMBER OF SYMBOLS CURRENTLY CMA DCA XCTR /USE AS A COUNTER TAD C7700 /GIVE SEARCH A MASK TO USE ON LAST SYMBOL JMS SEARCH /LOOK FOR OCCURRENCE OF SYMBOL IN TABLE JMP ZCHECK /SYMBOL IS IN TABLE CHECK IT TAD L57 /TELL ENTER WHERE TO PUT THE SYMBOL JMS ENTER /ENTER THE SYMBOL TAD C3 /UPDATE THE POINTER DCA L57 /AND SAVE IT DCA L21 /ZERO SWITCH SINCE SYMBOL JUST LOADED ISZ SCOUNT /UPDATE COUNT OF SYMBOLS JMP LOOP1 /GO BACK AND CHECK IT ZCHECK, TAD L77 /GET POINTER INTO SYMBOL TABLE TAD C2 /MOVE TO LAST WORD DCA LSYMTM /SAVE IT TAD I LSYMTM /GET THE CONTROL BITS AND L21 /AND THE MASK SZA CLA /ARE ANY ILLEGAL BITS ON ERR54, JMS I LUNCH /ERROR 54 ... PROBABLY IN EQUIVALENCING ... TAD L32 /NOW OR IN NEW BITS CMA AND I LSYMTM TAD L32 DCA I LSYMTM JMP I LSYMTB /RETURN / FLOATING CONSTANT IS IN 30 THRU 32 LFCON, 0 CLA MLOOP, TAD L47 /GET BEGINNING OF FCON TABLE TAD C3 /MOVE TO ACTUAL START OF TABLE DCA LSYMTM /AND SAVE TAD FCOUNT /GET NUMBER OF FCONS SO FAR CMA DCA XCTR /AND USE FOR A COUNTER CMA /GIVE SEARCH A MASK FOR THE LAST WORD JMS SEARCH /SEARCH THE TABLE FOR THE CURRENT FCON JMP I LFCON /ITS ALREADY IN THERE JUST RETURN TAD L47 /TELL ENTER WHERE TO PUT THE FCON JMS ENTER /ENTER THE FCON TAD CM3 /AND UPDATE IT DCA L47 /AND SAVE ISZ FCOUNT /UPDATE NUMBER OF FCONS JMP MLOOP /GO BACK AND CHECK / THIS IS THE ROUTINE THAT SEARCHES THE TABLES FOR / OCCURRENCES OF THE CURRENT SYMBOL OR FCON SEARCH, 0 DCA ENTER /SAVE THE MASK MBACK, ISZ XCTR /SEE IF WE HAVE PROCESSED ALL SYMBOLS SKP /NO GO ON JMP QRET /YES TAD I LSYMTM /GET FIRST WORD OF SYMBOL CIA /NEGATE TAD L30 /SUBTRACT FIRST WORD OF CURRENT SYMBOL ISZ LSYMTM /INCREMENT POINTER SZA CLA /DO THEY MATCH JMP I1 /NO GO TO NEXT SYMBOL TAD I LSYMTM /YES GET SECOND WORD OF SYMBOL CIA TAD L31 /SUBTRACT SECOND WORD OF CURRENT SYMBOL ISZ LSYMTM /ADVANCE POINTER SZA CLA /DO THEY MATCH JMP I2 /NO GO TO NEXT SYMBOL TAD I LSYMTM /SEE IF NEXT WORD MATCHES AND ENTER /MASK OUT DESIRED PORTIONS CIA TAD L32 /SUBTRACT THIRD CURRENT WORD AND ENTER /K AGAIN ISZ LSYMTM /ADVANCE POINTER SZA CLA /DO THEY MATCH JMP MBACK /NO GO TO NEXT SYMBOL TAD LSYMTM /YES TAD CM3 /MOVE BACK POINTYER DCA L77 /PUT POINTER IN PAGE ZERO JMP I SEARCH /RETURN QRET, ISZ SEARCH /SET UP RETURN FOR NOT FOUND JMP I SEARCH /RETURN I1, ISZ LSYMTM /ADVANCE POINTER I2, ISZ LSYMTM /ADVANCE PIINTER JMP MBACK /GO TO NEXT SYMBOL / THIS ROUTINE ENTERS THE CURRENT SYMBOL INTO THE TABLE SPECIFIED ENTER, 0 DCA LSYMTM /SAVE ADDRESS TAD L47 /GET BEGINNING OF FCON TABLE CMA TAD L57 /SUBTRACT END OF SYMBOL TABLE C7700, SMA CLA /IS THERE ROOM FOR ANOTHER SYMBOL OR FCON ERR17, JMS I LUNCH /NO TAD L30 /YES GEYT FIRST WORD DCA I LSYMTM /STORE IT TAD LSYMTM DCA L11 /SET UP AUTO - XR TAD L31 DCA I L11 TAD L32 DCA I L11 TAD LSYMTM /GET THE ADDRESS BACK INTO THE AC JMP I ENTER /AND RETURN DUMPLN, DMPLIN LSYMTM=. LPRINT, 0 / CONVERTS FROM TRIMMED TO EIGHT BIT ASCII DCA LFCON /SAVE THE CHARACTER TAD L75 /S GET THE SUPPRESS PRINTING WITCH SZA CLA JMP I LPRINT ISZ L24 /IS THIS A NEW LINE? SKP /NO JMS I DUMPLN /YES - DUMP THE OLD ONE FIRST TAD LFCON /NO...GET THE CHARACTER SNA /IS IT A CR JMP CRLF /YES...PUT OUT CRLF AND C40 /CHECK BIT SIX CLL RAL CIA /AC CONTAINS 0 OR -100 TAD C300 /NOW CONTAINS 300 OR 200 TAD LFCON /NOW ADD THE CHARACTER IN PRIT, DCA I L24 /AND STORE IT IN THE BUFFER JMP I LPRINT CRLF, TAD C215 /GET AN EIGHT BIT CR DCA I L24 /STORE IT IN THE BUFFER ISZ L24 TAD C212 DCA I L24 /STORE A LINE FEED TOO CLA CMA DCA L24 /SET SWITCH TO DUMP LINE ON NEXT CHAR JMP I .+1 PRIT+1 LCOMON, CLA JMS I LOOK /CHECK REST OF STATEMENT NAME -2 /TWO CHARACTERS -17 /O -16 /N GETVAR, JMS I ENTITY /GET A VARIABLE SKP /NOT A VARIZBLE JMP VARI /WE GOT A VARIABLE NOP B20, 20 ERR18, JMS I LUNCH /ERROR VARI, TAD C40 TAD L32 /PUT IN COMMON BIT DCA L32 TAD K37 /GET MASK FOR SYMBOL TABLE SWITCH DCA L21 /PUT IN THE SWITCH JMS I SYMTAB /PUT SYMBOL IN TABLE JMS I ENTITY /LOOK FOR A COMMA JMP START /THAT'S ALL GOT A CR-LF... K37, 37 K27, 27 JMP .+3 /ERROR TAD CM54 /CHECK FOR COMMA SZA CLA /IS IT A COMMA JMP ERR18 /NO...ERROR JMP GETVAR /GET ANOTHER VARIABLE LDIMEN, JMS I LOOK /LOOK FOR REST OF STATEMENT -5 /FIVE CHARS -16 /N -23 /S -11 /I -17 /O -16 /N QAGAIN, CLA CMA /-U DCA REDY /SET SWITH FOR VARIABLE QGET, JMS I ENTITY /GET WHATEVER IS NEXT IN LINE JMP QDONE /IT EAS A CR JMP .+4 /IT WAS A VARIABLE JMP ASUBSC /IT WAS ONE OF THE SUBSCRIPTS JMP ERR18 /WE BETTER NOT GET ANY FP NUMBERS JMP QPUNC /IT WAS A PUNCTION ISZ REDY JMP ERR18 /WE WERENT READY FOR A VAR TAD B20 TAD L32 DCA L32 TAD K27 /GET THE MASK FOR THE SYMBOL TABLE DCA L21 /PUT IN THE SWITCH JMS I SYMTAB /PUT SYMBOL IN TABLE CMA CLA TAD L47 /GET BEGINNING OF TABLE DCA L16 TAD L77 /GET TABLE ADDRESS DCA I L16 CLA CMA DCA V /SET WITCH TO SAY WEVE GOTTEN A VAR JMP QGET /GET NEXT THING QPUNC, TAD CM54 SNA /IS IT A COMMA JMP COMMA /YES TAD C3 SNA JMP QRPAR /RIGHT PAREN IAC SNA /IS IT A LEFT PAREN ISZ V /PRECEDED BY A VAR JMP ERR18 /NO - ERROR CLA CMA DCA XLP /SET SWITCH TO SHOW LPAR JMP QGET ASUBSC, ISZ XLP /DID WE JUST GET LPAR JMP SECOND /NO...BETTER BE SECOND SUBSC TAD L32 /GET INTEGER DCA I L16 /PUT IN DIMTAB CMA CLA DCA QONE /SET SWITCH TO SHOW WE HAVE ONE SUBSC JMP QGET COMMA, ISZ QONE /DOES THIS COMMA SEPARATE SUBSCS JMP RIGHT /NO...LAST CHAR BETTER HAVE BEEN L RPAR CMA CLA DCA SEC /SET SWITCH TO EXPECT SECOND SUBSCRIPT JMP QGET SECOND, ISZ SEC /IS THIS SECOND SUBSCRIPT JMP ERR18 /NO...ERROR TAD 32 /GET INTEGER DCA I L16 CMA CLA DCA R /SET SWITCH FOR RPAR JMP QGET QRPAR, ISZ QONE /HAVE WE GOTTEN ONE SUBSC JMP QTWO /NO...CHECK FOR TWO IAC /ONLY ONE SO USE 1 AS SECOND DCA I L16 QBACK, CMA CLA DCA RIG TAD L47 /GET BEGINNING OF TABLE DCA L50 /SAVE IN LOW CORE TAD L47 TAD CM3 /SUBTRACT THREE FROM ADDRESS DCA L47 /AND SAVE JMP QGET /WE EXPECT COMMA OR CR QTWO, ISZ R /HAVE WE GOTTEN TWO JMP ERR18 /NO...ERROR JMP QBACK RIGHT, ISZ RIG /DID WE JUST GET RPAR JMP ERR18 /NO...ERROR JMP QAGAIN QDONE, ISZ RIG JMP ERR18 JMP START QONE, 0 RIG, 0 R, 0 REDY, 0 V, 0 XLP, 0 SEC, 0 *3000 LGOTO, TAD L74 DCA L16 /USE AUTO INDEXING DCA L76 JMS I ENTITY NOP SKP JMP ALAB /WE HAVE A LABEL JMP I ASSIGN TAD CM50 /IF PUNCT...CHECK FOR LEFT PAREN SZA CLA /IS IT ( JMP I ASSIGN ANEXT, JMS I ENTITY NOP SKP JMP THERE /WE HAVE A LABEL NOP ERR28, JMS I LUNCH THERE, TAD L32 /GET THE LABEL DCA I L16 /PUT IN LIST ISZ L76 JMS I GNB TAD CM54 /CHECK FOR BEING A COMMA SNA /IS IT A COMMA JMP ANEXT /YES GET ANOTHER LABEL TAD C3 /CHECK FOR BEING A RIGHT PAREN SZA CLA /IS IT A ) JMP I ASSIGN JMS I GNB TAD CM54 /CHECK FOR ANOTHER COMMA SZA /IS IT ANOTHER JMS I PUTCH /IGNORE ANYTHING ELSE ... JMS I ENTITY /GET THE CONTROL VARIABLE SKP JMP .+4 /WE GOT IT NOP NOP ERR29, JMS I LUNCH DCA L21 /ZERO THE SYMBOL TABLE SWITCH JMS I SYMTAB /PUT VARIABLE IN SYMBOL TABLE TAD L77 /GET ADD RESS OF SYMBOL JMS I MODE /CHECK THE MODE OF THE VAIABLE ERR30, JMS I LUNCH /ITS FLOATING POINT JMS I ZZZ /PUT OUT STMT LABEL JMS LXTAD /LOAD VARIABLE WITH TAD OR TAD* JMS I PROP /PUT OUT OP CODE Q6066, 6066 /OP CODE IS TAD JMS I CREATE /GET THE NEXT CREATED LABEL JMS I PRCRL /PRINT THE CREATED LABEL JMS I PRINT /PUT OUT CR LF JMS I PROP /PUT OUT OP CODE 6071 /OP CODE IS DCA TAD GO7 JMS I PROTAC JMS I PRINT /PUT OUT CRLF JMS I PROP /PUNCH 'TAD I 7' OPTADI TAD GO7 JMS I PROTAC JMS I PRINT JMS I PROP /PUNCH 'DCA 7' OPDCA TAD GO7 JMS I PROTAC JMS I PRINT JMS I PROP /PUNCH 'JMP I 7' OPJMPI TAD GO7 JMS I PROTAC JMS I PRINT TAD L76 /PUNCH 'CPAGE <N+1>' IAC JMS I PIFF TAD L53 /PUNCH '<CR.LABEL2>, <CR.LABEL2>' JMS I CLAB TAD L53 JMS I PRCRL JMS I PRINT TAD L76 /NOW PUNCH THE LABELS CIA /SET NEGATIVE DCA L76 TAD L74 DCA L16 /USE AUTO INDEXING AGAIN TAD I L16 /GET THE NEXT LABEL JMS I PLAB /PRINT THE LABEL JMS I PRINT /PUT OUT CRLF ISZ L76 JMP .-4 /NO JMP START / THE FOLLOWING SECTION IS TO TREAT REGULAR GOTO S ALAB, JMS I ZZZ TAD L32 JMS PRJUMP /PUT OUT A JUMP TO THE LABEL IN "L32" JMP START LXTAD, 0 TAD L77 /GET ADDRESS AGAIN JMS I DUMARG TAD CM3 TAD Q6066 /TAD OR TAD* DCA OP /USE AS OPERATOR JMS I PROP /PUT OUT OP CODE OP, 0 TAD L77 /GET ADDRESS AGAIN JMS I PRSYM /PRINT THE SYMBOL JMS I PRINT /PUT OUT A CR LF JMP I LXTAD LLEAD, 0 /PUNCH SOME LEADER... DCA L7 JMS I PUNCH ISZ L7 JMP .-2 JMP I LLEAD GO7, 7 PRJUMP, 0 /SUBROUTINE TO PUT OUT A JUMP DCA LLEAD /STORE THE LABEL JMS I PROP 6044 /JMP TAD LLEAD JMS I PLAB /PUT OUT THE LABEL JMS I PRINT /PUT OUT A CRLF TAD LLEAD DCA L12 /SET CONTENTS OF LAST LINE TO LABEL JMP I PRJUMP *3200 / THE FOLLOWING ROUTINE PUNCHES OCTAL NUMBERS LPRTAC, 0 DCA TMP /SAVE THE NUMBER DCA TM TAD CM4 /PUT OUT FOUR CHARACTERS DCA DCTR /CHARACTER COUNTER BK, TAD TMP /GET THE NUMBER RAL /ROTATE IT LEFT ONE RTL /ROTATE TWO LEFT...THAT MAKES ONE OCTAL DIGIT DCA TMP /SAVE THE ROTATED NUMBER TAD TMP /GET IT IN ACCUMULATOR AND C3 RAL /GET THE DIGIT INTO THE LOW-ORDER AC ISZ DCTR /IS THIS THE LAST DIGIT? JMP .+4 /NO, CONTINUE TAD C60 /MAKE IT LOOK LIKE A TRIMMED ASCII DIGIT JMS I PRINT /PRINT THE DIGIT JMP I LPRTAC SZA /DO WE HAVE A ZERO DIGIT? JMP .+4 TAD TM SNA CLA /YES, IS IT A LEADING ZERO? JMP BK /YES, IGNORE IT TAD C60 JMS I PRINT ISZ TM /DON'T SUPPRESS ZEROS ANY MORE JMP BK /NOW...PUT OUT ANOTHER TMP, 0 TM, 0 CM4, -4 C60, 60 LIF, TAD CM4 DCA COUNT1 /SET UP COUNTER JMS I GNB TAD CM50 /CHECK FOR LEFT PAREN SZA CLA /IS IT A ( JMP I ASSIGN JMS I PUTCH /YES...PUT IT BACK FOR GENER JMS I ZZZ ISZ L52 /SET BALANCED PARENS SWITCH FOR GENER ISZ L44 /SET SWITCH FOR RIGHT SIDE OF EQUALS SIGN JMS I GENER /NOW CALL GENER AND PROCESS EXPRESSION TAD I L41 JMS I MODE /WHAT IS ITS MODE JMS I GETHI /GET HI ORDER P.P. AC TAD CDCA41 DCA LIFDCA /SET UP INSTRUCTION TO STORE LABELS LABL, JMS I ENTITY /GET A LABEL D34, 34 SKP JMP INTEG /WE GO A LABEL C46, 46 ERR31, JMS I LUNCH /DIDNT GET A LABEL INTEG, TAD L32 /GET THE LABEL ISZ LIFDCA LIFDCA, .-. /STORE LABELS IN L42 THROUGH L44 DCTR=LIFDCA ISZ COUNT1 /HAVE WE GOTTEN TOO MANY LABELS SKP /NO JMP ERR31 /YES JMS I GNB SNA /SEE IF ITS A CR JMP .+5 /ITS A CR TAD CM54 /CHECK FOR COMMA SZA CLA /IS IT A COMMA JMP ERR31 JMP LABL /YES ISZ COUNT1 /DID WE GET THE RIGHT NUMBER OF LABELS JMP ERR31 /NO TAD L42 CIA TAD L44 SNA CLA /IF THE JUMPS FOR AC<0 AND AC>0 ARE EQUAL JMP ISPECL /WE CAN SAVE SOME CODE TAD L43 CIA TAD L44 SNA CLA /IF THE JUMPS FOR AC=0 AND AC>0 ARE EQUAL JMP SPCONL /WE CAN ALSO SAVE SOME CODE JMS I PROP /PUT OUT OP CODE 6105 /OP CODE IS SNA JMS I PRINT /PUT OUT CRLF TAD L43 JMS I PRJMP /OUTPUT THE ZERO BRANCH SPCONL, JMS I PROP /PUT OUT OP CODE 6110 /OP CODE IS P SPA CLA JMS I PRINT /PUT OUT CRLF TAD L42 /OUTPUT THE NEGATIVE BRANCH IFCOMN, JMS I PRJMP TAD L44 JMS I PRJMP /OUTPUT THE POSITIVE (>0) BRANCH DCA L46 /ZERO AC JMP START /GO GET NEXT STATEMENT ISPECL, JMS I PROP /PUNCH 'SNA CLA' OPSNA JMS I PROP OPCLA JMS I PRINT TAD L43 JMP IFCOMN /OUTPUT THE ZERO AND POSITIVE BRANCHES PRJMP, PRJUMP COUNT1, 0 LCREAT, 0 ISZ L53 /INCREMENT BY ONE... TAD L53 AND C77 TAD CM33 SMA CLA /HAVE WE BEEN HERE 26 TIMES? TAD C46 /YES, BUMP THE HIGH ORDER DIGIT TAD L53 DCA L53 /AND SAVE TAD L53 /NOW RETURN IT IN AC JMP I LCREAT /RETURN LPLAB, 0 /THIS PRINTS REGULAR LABELS DCA TMP /FIRST SAVE LABEL TAD D34 /NOW PUNCH A '\' JMS I PRINT TAD TMP /GET LABEL JMS I DECOUT /AND PRINT IT JMP I LPLAB /RETURN GETHI, LGETHI CDCA41, DCA L41 CM33, -33 DECOUT, LDCOUT /TELETYPE OUTPUT ROUTINE FOR ERROR MESSAGES LTTYPE, 0 TSF JMP .-1 TLS CLA JMP I LTTYPE *3400 DORET, JMP I XDO ISZDO, JMS I PROP 6170 /ISZ TAD L30 JMS I PRSYM JMS I PRINT JMP DOSUBT /GO GENERATE THE LIMIT TEST NUMB, 0 SWIT, 0 DM5, -5 CM24, -24 C5001, 5001 LEQI, EQI LDO, JMS I ZZZ JMS I ENTITY /LOOK FOR THE SCOPE LABEL C55, 55 SKP JMP SLAB /WE GOT THE SCOPE LABEL E53, 53 JMP I ASSIGN SLAB, TAD L32 /GET THE INTEGER JMS XDO /PUT OUT DO-LOOP CODE JMP START /NORMAL EXIT JMP ERR35 /IMPLIED DO EXIT - ERROR XDO, 0 /DO LOOP SUBROUTINE - ENTERED WITH /TARGET LABEL IN AC DCA I L15 /PUT IN DO END PUSH DOWN LIST TAD L74 DCA L16 /SET UP LIST OF DO ENDS DCA L21 /ZERO THE SYMBOL TABLE SWITCH CMA CLA DCA SWIT /SET SWITCH FOR CONTROL VARIABLE TAD DM5 DCA NUMB /SET COUNTER OF NUMBER OF PARAMETERS GETMOR, JMS I ENTITY /LOOK FOR A PARAMETER JMP .+3 /ERR JMP CVAR /GOT A VARIABLE JMP DPAR /GOT AN INTEGER C21, 21 JMP ERR35 CVAR, JMS I SYMTAB /PUT SYMBOL IN TABLE TAD L77 /GET ADDRESS JMS I MODE /DETERMINE MODE OF SYMBOL JMP ERR35 TAD L77 /GET ADDRESS AGAIN DOSTOR, DCA I L16 /SAVE ISZ NUMB /HAVE WE GOTTEN TOO MANY PARAMS SKP /NO ERR35, JMS I LUNCH /YES, DO ERROR ... JMS I GNB SNA /IS IT CR JMP ALLDNE+1 /YES WERE DONE TAD CM51 SNA /IS IT A RIGHT PAREN? JMP ALLDNE /YES-FINISH UP AND TAKE IMPLIED DO EXIT TAD CM24 SZA /IS IT = JMP MCOM /NO ISZ SWIT /IS SWITCH SET FOR IT JMP ERR35 /NO JMP GETMOR /YESS...GO BACK FOR ANOTHER PARAMETER MCOM, TAD C21 /CHECK FOR COMMA ISZ SWIT /IF NO EQUAL SIGN YET SZA /OR IF THIS ISN'T A COMMA JMP ERR35 /THEN ITS AN ERROR JMP GETMOR /GET ANOTHER DPAR, TAD L32 /GET THE INTEGER ISZ SWIT /HAVE WE SEEN AN EQUAL SIGN? JMP DOSTOR /YES - SAVE THE INTEGER AND PROCEED JMP ERR35 /NO ALLDNE, ISZ XDO /BUMP RETURN POINTER IF TERMINATOR WAS RPAR CLA IAC DCA I L16 /STORE A ONE IN THE FOURTH (OR FIFTH) ARGUMENT TAD C2 TAD NUMB SPA CLA /DID WE GET AT LEAST THREE ARGS? JMP ERR35 /NO ISZ L44 TAD L74 /GET ERASABLE LOCATIONS DCA L16 /USE THE AUTO INDEX REGISTERS TAD I L16 /GET CONTROL VARIABLE DCA L30 /AND PUT IN THIRTY TAD I L16 /GET INITIAL VALUE DCA L31 /AND SAVE IT TAD I L16 /GET FINAL VALUE DCA L32 /AND SAVE IT TAD I L16 /GET INCREMENT DCA L33 /AND SAVE IT TAD L74 /GET ADDR OF ERASABLE AGAIN IAC /INCREMENT ONCE DCA L41 /TELL TRIPL WHERE TO FIND THE DUMMY TRIPLES TAD L74 /GET IT AGAIN DCA L16 /USE AUTO INDEX TO STORE TRIPLE DCA L46 /ZERO THE AC TAD C5001 /SET UP INITIAL TRIPLE NUMBER DCA L40 TAD L33 CIA TAD L31 SNA CLA /IF INITIAL VALUE = STEP SIZE JMP STCTLV /NO NEED TO COMPUTE THE DIFFERENCE TAD L33 /GET STEP SIZE DCA I L16 /PUT IN TRIPLE TAD C55 /PUT IN A MINUS SIGN DCA I L16 TAD L31 /GET INITIAL VALUE DCA I L16 JMS I TRIPL /PROCESS THE TRIPLE STCTLV, JMS I LEQI /STORE ANSWER IN CONTROL VARIABLE JMS I CLAB /PUT A CDREATED LABVEL ON THE NEXT STATEMENT TAD L53 /GET THE CREATED LABEL DCA I L15 /AND PUT IN DO END LIST TAD L74 DCA L16 TAD L33 /GET STEP SIZE CLL RAR SNA /IF STEP SIZE=1 THEN JMP ISZDO /WE CAN USE AN ISZ TO INCREMENT RAL DCA I L16 TAD E53 /WERE GOING TO ADD DCA I L16 / L30 IS IN THE THIRD POSITION SINCE WE CALLED "EQI" JMS I TRIPL /ADD STEP SIZE TO CONTROL VARIABLE JMS I LEQI /STORE ANSWER IN CONTROL VARIABLE DOSUBT, TAD L74 DCA L16 TAD L30 /GET THE CONTROL VARIABLE DCA I L16 TAD C55 /WERE GOING TO SUBTRACT DCA I L16 TAD L32 /GET FINAL VALUE DCA I L16 JMS I TRIPL /SUBTRACT CONTROL VARIABLE FROM FINAL VALUE DCA L46 /CLEAR THE AC FLAG JMS I PROP 6110 /SPA CLA JMS I PRINT JMS I PROP 6044 /PUT OUT A JMP JMS I CREATE /TO A CREATED LABEL DCA I L15 /PUT CREATED LABEL IN DO END LIST TAD L53 /GET LABEL JMS I PRCRL /AND PRINT IT JMS I PRINT /CRLF ISZ L55 /INCREMENT UNENDED DO COUNTER SKP ERR38, JMS I LUNCH /TOOO MANY UNENDED DOS JMP I .+1 DORET /RETURN FROM SUBROUTINE "XDO" EQI, 0 TAD L74 DCA L16 TAD L46 /GET RESULT OF PREVIOUS COMPUTATION DCA I L16 TAD E75 /GET EQUALS SIGN DCA I L16 TAD L30 /GET CONTROL VARAIBLE DCA I L16 JMS I TRIPL /PROCESS DCA L46 /WIPE AC SWITCH JMP I EQI /RETURN LFUNCT, 0 DCA ARGCNT TAD L46 /GET AC SZA CLA /IS IT ZERO JMS I STORE /NO...STORE THE AC TAD L53 /GET CURRENT CREATED LABEL DCA L73 /AND SAVE CLA CMA /AC IS MINUS ONE TAD L41 /PUSH LIST POINTER DCA L42 /PUSH LIST POINTER MINUS ONE CKFNCT, ISZ L42 /INCREMENT POINTER ISZ L42 /AGAIN TAD I L42 /GET THE OPERATOR TAD CM4047 /SUBTRACT THE FUNCTION OPERATOR SZA /IS THIS THE FUNCTION OPERATOR JMP CKSBSC /NO CLA IAC /YES...THE FUNCTION NAME IS IN THE NEXT LOCATIO TAD L42 /THIS POINTS TO IT DCA SAVE /AND SAVE TAD I SAVE TAD C2 DCA EQI TAD I EQI AND CM2 IAC DCA I EQI MOR, CLA CMA /NOW EXAM THE ARGUMENTS TAD L42 /WERE POINTING TO THE FIRST ARGUMENT DCA L42 /SAVE THE POINTER ISZ ARGCNT JMS I LCHNG /CHECK L42 FOR ZERO OR DUMMY ARG DCA I L42 /REPLACE IT BY UPDATED VALUE TAD L42 /IT WASNT...SEE IF IT WAS THE LAST ARGUMENT CIA TAD L41 /SUBTRACT THE END OF ARGUMENT LIST SNA CLA /IS IT ZERO JMP OUT /YES...WE'VE COMPLETED THIS PHASE CLA CMA /NO...MOVE THE POINTER BACK ONE TAD L42 DCA L42 /AND SAVE JMP MOR /NOW CHECK THE NEXT ARGUMENT OUT, TAD SAVE /GET THE POINTER TO THE FUMCTION NAME AGAIN DCA L42 /AND PUT IN 42 TAD I L42 /GET THE ARGUMENT DCA FUNOP /USE FPROP TO PUT OUT THE CALL TO THE FUNCTION TAD ARGCNT /GIVE FPROP THE NUMBER OF ARGUMENTS JMS I FPROP /PUT OUT THE CALL TO THE FUNCTION FUNOP, 0 TAD L73 /NOW RESTORE THE CREATED LABEL LOCATION DCA L53 MNEXT, TAD L42 /GET THE POINTER TAD CM2 /MOVE POINTER TO ARGUMENT DCA L42 /AND SAVE TAD I L42 /GET NEXT ARGUMENT JMS I PSYMOT /GENERATE AN "ARG" FOR THE ARGUMENT TAD L42 /GET THE POINTER CIA /SET IT NEGATIVE TAD L41 /ADD SZA CLA /ARE THEY EQUAL JMP MNEXT /NO THERE ARE MORE ARGS TAD I SAVE /YES...GET THE FUNCTION NAME JMS I MODE /WHAT MODE IS IT TAD E400 /ITS FLOATING POINT TAD L40 /ITS INTEGER DCA L46 /PUT THE TRIPLE NUMBER IN THE AC SWITCH TAD SAVE /YES...CHANGE PUSH LIST POINTER DCA L41 /STORE POINTER TO NAME IN PUSH LIST POINTER TAD L46 /GET CURRENT TRIPLE NUMBER DCA I L41 /AND PUT IT IN THE PUSH LIST JMP I LFUNCT /RETURN CKSBSC, IAC SZA CLA /IS IT THE SUBSCRIPT OPERATOR? JMP I CKF /NO - KEEP LOOKING JMP I .+1 ERR39 PSYMOT, SYMOUT SAVE, 0 ARGCNT, 0 E75, 75 CM4047, -4047 E400, 400 TAD C47 JMS I PPACK LQUOTE, JMS I PGTC /GET A CHARACTER SNA ERR37, JMS I LUNCH /CARRIAGE RETURN - ERROR TAD CM47 SZA JMP LQUOTE-2 /IF NOT A QUOTE, STORE IT JMP I .+1 FRET C47, 47 CM47, -47 PGTC, LGTC PPACK, PACK CKF, CKFND *4000 LCONT, JMS I LOOK /CHECK REST OF LINE -4 /LOOK FOR FOUR CHARACTERS -11 /I -16 /N -25 /U -5 /E JMS I ZZZ JMS I PROP /PUNCH 'NOP' 6047 JMS I PRINT /PUT OUT A CRLF JMP START /GO GET NEXT STATEMENT LPAUSE, JMS I LOOK /CHECK REST OF STATEMENT TYPE -1 /JUST ONE CHARACTER -5 /E CLA CMA LSTOP, DCA SW /SET SWITCH FOR STOP OR PAUSE DCA L32 JMS I ENTITY /LOOK FOR THE OPTIONAL INTEGER JMP MCR /WE GOT A CR SKP /ERR JMP .+3 /WE GOT AN INTEGER NOP /ERR JMP I ASSIGN MCR, JMS I ZZZ ISZ SW /PAUSE OR STOP? JMP STOP JMS I FPROP /PUNCH 'CALL 0,CKIO' 6116 JMS I PROP /PRINT OP CODE 6066 /OPCODE IS TAD TAD L32 /GET THE INTEGER JMS I PRSYM /PRINT IT JMS I PRINT /CR JMS I PROP 6121 JMS I PRINT JMS I PROP 6124 JMS I PRINT /PUT OUT CRLF JMP START /GO GET NEXT STATEMENT STOP, JMS OSTOP JMP START OSTOP, 0 /PUNCH 'CALL 0,CKIO' JMS I FPROP 6116 JMS I CLAB /PUNCH '<LAB>, HLT' JMS I PROP 6121 JMS I PRINT JMS I PROP /PUNCH 'JMP <LAB>' 6044 TAD L53 JMS I PRCRL JMS I PRINT JMP I OSTOP SW, 0 LFRMAT, JMS I LOOK /CHECK REST OF STATEMENT TYPE -2 /TWO CHARACTERS -1 /A -24 /T ISZ OSTOP TAD L74 DCA L10 DCA L76 JMS I PROP 6044 JMS I CREATE JMS I PRCRL JMS I PRINT JMS I GNB /READ UNTIL A PAREN IS GOTTEN TAD CM50 /SUBTRACT A ( SZA CLA /IS IT A ( ERR39, JMS I LUNCH /NO...ILLEGAL CHARACTER TAD C50 /GET A LEFT PAREN JMP PAREN /AND GO START COUNTING PARENS AGAIN, JMS I GTC SNA /IS IT A CR JMS I PUTCH PAREN, RTL CLL /SHIF CHAR LEFT RTL RTL DCA L32 /SAVE THE CHAR JMS I GTC SNA /IS IT A CR DCA OSTOP TAD L32 /PACK THE TWO CHARS (SOME DONE AT FRMTCK) JMP I FRMTCK /GO CHECK IF FORMAT STMT. TOO BIG FRMT, TAD OSTOP /GET BALANCED PAREN SWITCH SZA CLA /ARE THEY BALANCED JMP AGAIN /NO GET SOME MORE CHARS TAD L76 JMS I PIFF TAD L74 DCA L10 TAD L76 CIA DCA L76 JMS I ZZZ TAD I L10 JMS I PROTAC JMS I PRINT ISZ L76 JMP .-4 TAD L53 /PUNCH '<LABEL>,' JMS I CLAB JMS I PRINT JMP START GTC, LGTC PXSUBR, XXSUBR C50, 50 LPIFF, 0 /PUNCH 'IFF <N>' DCA LZZZ /ENTER WITH N IN THE AC JMS I PROP 6102 TAD LZZZ JMS I PROTAC JMS I PRINT JMP I LPIFF LZZZ, 0 /PUNCH THE CURRENT LABEL, IF ANY TAD L54 SNA /IS THERE A LABEL? JMP ZZZRET /NO JMS I PLAB /PUNCH '<LABEL>, ' TAD C7240 JMS I P2 ZZZRET, DCA I PXSUBR /MAKE SUBROUTINES AND FUNCTIONS ILLEGAL JMP I LZZZ FRMTCK, CKFRMT *4200 LTRIPL, 0 JMS I XZQL /FIRST CHECK IF A TRIPLE IS LEGAL HERE TAD L41 /GET PUSH LIST POINTER IAC /INCREMENT TO POINT TO OPERATOR DCA L42 /OPERATOR POINTER TAD L42 /GET IT AGAIN IAC /INCREMENT IT DCA L43 /OPERAND TWO POINTER TAD I L42 /GET OPERATOR AND C77 /MASK GARBAGE BITS TAD CM41 /SUBTRACT AN ADD INDIRECT OPERATOR SNA CLA /IS OPERATOR <DOLLAR> JMP I LADDIN /YES PROCESS IT TAD I L43 /NO...GET OPERAND TWO JMS I DUMARG /SEE IF ITS A DUMMY ARGUMENT SKP /YES IT IS JMP CK2 /NO ..CHECK THE OTHER ARGUMENT TAD I L42 /YES GET THE OPERATOR AND C77 /MASK GARBAGE BITS TAD EM75 /IS IT AN EQUALS SIGN SNA /IS OP C JMP LEQUIN /YES USE C* IAC /SEE IF ITS ALREADY EQUALS INDIRECT SZA CLA /IS OP C* JMS I LDUMTW /YES TWO IS DUMMY ARG CK2, CLA TAD I L41 /NO IS OPND ONE A SYMBOL JMS I DUMARG /SEE IF ITS A DUMMY ARGUMENT JMS I LDUMON /IT IS CLA CLL /NOW LETS SEE WHAT THE OPERATOR IS TAD I L42 /GET THE OPERATOR AND C77 /MASK OUT GARBAGE BITS TAD CM53 SNA /IS IT JMP I LAADD /YES IAC SNA /IS IT * JMP I LMUL /YES TAD CM3 SNA /IS IT - JMP I LASUB /YES TAD CM2 SNA /IS IT / JMP I LDIV /YES TAD CM16 SNA /IS IT C JMP I LEQU /YES IAC SNA /IS IT C* JMP I LEIND /YES TAD J27 SNA /IS IT ** JMP I LEXP /YES TAD C2 SNA /IS IT A UNARY MINUS JMP I LUMIN /YES ERR40, JMS I LUNCH /NO BETTER COP OUT LDMARG, 0 SMA /IS HIGH ORDER BIT ON JMP INC /NO...ITS NEITHER A SYMBOL OR A TRIPLE NUMBER RAL /GET NEXT BIT SMA /IS IT ON JMP MAYBE /NO...WE MIGHT HAVE A SUBSCRIPT THOUGH RAR /YES...RESTOR THE PARAMETER CIA /SET IT NEGATIVE TAD L47 /SUBTRACT IT FROMTHE START OF THE FCON TABLE SPA /IS THE RELULT POSITIVE JMP INC /NO...ITS AN FCON NOT A SYMBOL CIA /YESS...RESTORE ORIGINAL PARAMETER TAD L47 TAD C2 /YES MOVE POINTER TO CONTROL BITS DCA L23 /SAVE TAD I L23 /GET THE CONTROL BITS AND C10 /MASK ALL BUT DUMMY ARG BIT OUT INC1, SNA CLA /IS THIS SYMBOL. A DUMMY ARG INC, ISZ LDMARG /NO...INCREMENT THE RETURN CLA /CLEAR THE ACCUMULATOR JMP I LDMARG /AND RETURN MAYBE, AND F400 /MASK THE SUBSCRIPT BIT OF THE TRIPLE NUMBER JMP INC1 /AND CHECK BECAUSE WE TREAT SUBSCS AS DUMMY ARG ARET, JMP I LTRIPL /THIS IS THE RETURN FROM TRIPLE LEQUIN, TAD C74 DCA I L42 /SET OP TO =* JMP CK2 C74, 74 / / THIS ROUTINE CHECKS THE REST OF THE CHARS FOR A STATEMENT LLOOK, 0 JMS GLOOK /GET CHARACTER COUNT DCA LTRIPL ABACK, JMS I GNB JMS GLOOK /ADD IN THE TEST CHAR SZA CLA /WERE THEY EQUAL JMP I ASSIGN /NO...IT MUST BE AN ASSIGNMENT STATEMENT ISZ LTRIPL /THEY MATCH...ARE WE DONE JMP ABACK /NO JMP I LLOOK /RETURN GLOOK, 0 CDF 10 TAD I LLOOK ISZ LLOOK CDF 00 JMP I GLOOK / LAADD, AADD LADDIN, ADDIND LASUB, ASUB LEQU, EQU LEIND, EIND LEXP, EXP LUMIN, UMIN CM41, -41 EM75, -75 LDUMTW, DUMTWO CM16, -16 C10, 10 F400, 400 LDUMON, DUMONE CM53, -53 LMUL, MUL LDIV, DIV XZQL, LXZQ J27, 27 CKFND, TAD L42 /SEE IF POINTER IS INTO SYMB. TABLE TAD K2000 /(IT HAS HAPPENED!) SZA CLA JMP I CKFNCP JMP I .+1 /YES-ERROR ERR39 CKFNCP, CKFNCT K2000, 2000 *4400 / FIGURE OUT WHATS IN AC LCHECK, 0 TAD L46 /GET WHATS IN THE AC CIA /SET NEGATIVE TAD I L41 /SUBTRACT SNA CLA /ARE THEY EQUAL JMP ONE /YES TAD L46 /GET AC AGAIN CIA /SET NEGATIVE TAD I L43 /SUBTRACT TWO SNA CLA /ARE THEY EQUAL JMP TWO /YES TAD L46 /GET THE AC SNA CLA /IS IT ZERO JMP NONE /NO YES YES YES JMP SOME /JUST SIMETHING IN AC ONE, ISZ LCHECK NONE, ISZ LCHECK SOME, ISZ LCHECK TWO, JMP I LCHECK / FINDS TEMPORARY THAT TRIPLE NUMBER IS ASSIGNED TO LTMPOR, 0 DCA LFPROP /SAVE TRIPLE NUMBER TAD LFPROP JMS I MODE /DETERMINE ITS MODE TAD C30 /FLOATING POINT TAD TTAB /INTEGER DCA LCHECK TAD CM30 DCA FOP /SET UP COUNT FOR SEARCH LTLP1, TAD I LCHECK CIA TAD LFPROP SNA CLA /IS THIS THE ONE? JMP ZEROIT /YES - ZERO IT OUT AND RETURN IT ISZ LCHECK ISZ FOP JMP LTLP1 /LOOP OVER ENTIRE TABLE TAD LCHECK /NOT FOUND - WE HAVE TO ASSIGN IT TAD CM30 DCA LCHECK /RESET POINTERS FOR ZERO SEARCH TAD CM30 DCA FOP LTLP2, TAD I LCHECK SNA CLA /IS THIS TEMPORARY FREE? JMP TEMPTY /YES ISZ LCHECK ISZ FOP JMP LTLP2 /CHECK THEM ALL ERR41, JMS I LUNCH /OUT OF TEMPORARIES TEMPTY, TAD LCHECK CIA TAD L45 SNA CLA /ADJUST THE NUMBER OF FLOATING POINT TEMPS ISZ L45 TAD LCHECK CIA TAD L51 SNA CLA /ADJUST THE NUMBER OF INTEGER TEMPS ISZ L51 TAD LFPROP /STORE TRIPLE NUMBER IN THIS TEMPORARY SLOT ZEROIT, DCA I LCHECK TAD FOP TAD C31 /GET POSITIVE NUMBER FROM TABLE COUNTER JMP I LTMPOR /RETURN C31, 31 LFPROP, 0 /THIS ROUTINE PUNCHES SUBROUTINE CALLS DCA FOP /SAVE THE NUMBER OF ARGUMENTS JMS I PROP 6113 /PUT OUT THE CALL TAD FOP /GET THE NUMBER OF ARGUMENTS JMS I PROTAC /PRINT IT TAD C54 /GET A COMMA JMS I PRINT /PRINT IT CDF 10 TAD I LFPROP CDF 00 JMS I PRSYM JMS I PRINT ISZ LFPROP /INCREMENT RETURN JMP I LFPROP /RETURN FOP, 0 / COME HERE IF OP IS - ASUB, JMS I SMODE /MAKE SURE THAT BOTH ARGS ARE OF SAME MODE TAD I L43 /GET OPERAND TWO JMS I MODE JMP FSUB /ITS FLOATING POINT JMS LCHECK /ITS INTEGER...CHECK WHATS IN THE AC JMP STWO /TWO IS IN THE AC JMS I STORE /SMETHING IS IN THE AC JMS I LADDON /NOTHING IS IN THE AC...ADD ONE TO IT ASBCMN, JMS I LCOMP /ONE IS IN AC...COMPLEMENT IT JMS I LADDTW /ADD TWO TO IT JMP I LRETUR /AND RETURN STWO, JMS I LCOMP /TWO IS IN AC...COMPLEMENT IT JMS I LADDON /ADD ONE TO IT JMS I LCOMP /AND COMPLEMENT IT AGAIN JMP I LRETUR /AND RETURN FSUB, JMS LCHECK /FLOATING POINT...CHECK THE AC JMP FS /TWO IS IN AC JMS I STORE /SOMETHING IN AC...STORE IT JMP FAS /NOTHING IN AC JMP ASBCMN /ONE IS IN AC - COMPLEMENT AND ADD TWO FAS, JMS I LADDTW /NOTHING IN AC...ADD TWO IN FS, IAC /WE HAVE ONE ARG JMS I FPROP 6011 JMS I ARG /PUT OUT THE ARG PSEUDO OP TAD I L41 /GET ARGUMENT ONE IRET, JMS I PRSYM /AND PUT IT OUT JMS I PRINT /PUT OUT CRLF JMP I LRETUR TTAB, ITTAB /THIS IS THE STARTING ADDRESS OF THE TEMP TABLE LCOMP, COMP LADDON, ADDONE C30, 30 CM30, -30 LRETUR, RETURN LADDTW, ADDTWO /CHECK SIZE OF FORMAT STMT. / CKFRMT, DCA I L10 /CONTINUE PACK ROUTINE ISZ L76 TAD L76 TAD M174 /IS IT TOO BIG SMA CLA JMP I ILCON /YES-GIVE IT ILLEGAL CONT. MESSAGE JMP I LFRMT /NO-GO BACK LFRMT, FRMT M174, -174 ILCON, ERR1 /ILLEGAL CONTINUATION MESSAGE *4600 / PROCESS * ADDIND, JMS I CHECK /CHECK WHATS IN THE AC NOP /TWO IS IN AC SKP /N SOMETHING IS IN AC SKP /NOTHING IS IN AC JMS I STORE /STORE WHATEVER IS IN AC TAD I L41 /GET OPERAND ONE JMS I MODE /WHAT MODE IS IT JMP FLOT /YES IT FLOATING POINT JMS I PROP /IST INTEGER... 6063 /PUT OUT A TAD* LOOP6, TAD I L41 /GET THE FIRST OPERAND AGAIN JMP I LIRET /GO TO THE RETURN ROUTINE FLOT, IAC /WE ONLY HAVE ONE ARG JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE 6132 /PUT OUT A CALL TO FLOATING INDIRECT ADD JMS I ARG /PUT OUT THE ARG PSEUDO OP JMP LOOP6 /AND JUMP BACK / THIS PUTS OUT OPCODES FOR AN ADD ADDL, 0 CLL RAR SNA /TEST FOR 0 OR 1 JMP ADSPCL RAL /NOT 0 OR 1, TREAT NORMALLY JMS I MODE /WHAT MODE ARE WE IN JMP LOOP7 /YES JMS I PROP /PUT OUT A TAD 6066 JMP I ADDL /RETURN LOOP7, IAC /WE ONLY HAVE ONE ARGUMENT JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE 6003 /PUT OUT A FLOATING ADD JMS I ARG /PUT OUT THE ARG PSEUDO OP JMP I ADDL /AND RETURN ADSPCL, ISZ ADDL ISZ ADDL /BUMP RETURN POINT PAST ARGUMENT TO "TAD" SNL /0? JMP I ADDL /YUP - DON'T PUT OUT NUTTIN JMS I PROP OPIAC /PUT OUT "IAC" JMP I ADDL / STORES CONTENTS OF AC IN TEMPORARY / PUT OUT DCA OR CALL STO / FOLLOWED BY THE TEMPORARY LOC LSTORE, 0 TAD L46 /GET THE AC JMS I MODE /WHAT MODE IS IT JMP FSTO /ITS FLOATING POINT JMS I PROP 6071 /ITS INTEGER...PUT OUT A DCA STORET, TAD L46 /GET THE AC AGAIN JMS I PRSYM /PRINT WHATEVER IS IN IT JMS I PRINT /PUT OUT A CRLF DCA L46 /ZERO THE AC JMP I LSTORE /AND RETURN FSTO, IAC /WE ONLY HAVE ONE ARG JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE 6006 /PUT OUT A CALL TOFLOATING STORE JMS I ARG /PUT OUT THE ARG PSEUDO OP JMP STORET /AND JMP BACK COMP, 0 TAD L46 /GET THE AC JMS I MODE /WHAT MODE IS IT JMP FCOM /ITS FLOATING POINT JMS I PROP /ITS INYTEGER 6135 /PUT OUT A CIA JMS I PRINT /PUT OUT A CRLF JMP I COMP /AND RETURN FCOM, JMS I FPROP 6140 /TO FLOATING CHANGE SIGN JMP I COMP / COME HERE IF OP IS * MUL, JMS I SMODE /CHECK FOR SAME MODE JMS I CHECK /CHECK WHATS IN THE AC JMP TMUL /TWO IS IN THE AC JMS I STORE /SOMETHING IS IN AC...STORE IT JMS I KADDON /NOTHING IS IN AC..GET ONE IN AC AMUL, TAD I L43 /GET OPERND TWO JMS I MODE /WHAT MODE IS IT TAD EM6 TAD C6022 DCA FML /SAVE OPCODE IAC JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE FML, 0 JMS I ARG /PUT OUT THE ARG PSEUDO OP TAD I L43 /GET OPERAND TWO JMP I LIRET /AND GO TO THE RETURN ROUTINE TMUL, TAD I L41 /GET OPERAND ONE AND REPLACE OPERAND TWO DCA I L43 JMP AMUL /AND JUMP BACK KADDON, ADDONE LIRET, IRET EM6, -6 C6022, 6022 LSUB, JMS I LOOK /CHECK REST OF STATEMENT -6 / -17 /O -25 /U -24 /T -11 /I -16 /N -5 /E JMP I .+1 TART LCLEAR, 0 /CLEAR THE PSEUDO ACC AND MQ DCA L30 DCA L31 DCA L32 DCA L33 DCA L34 DCA L35 JMP I LCLEAR *5000 / THIS ROUTINE TAKES CARE OF TWO BEING DUMMY ARG DUMTWO, 0 TAD I L41 /GET OPND ONE DCA FDV /AND SAVE TAD I L43 /GET OPND TWO DCA I L41 /ZERO OPND ONE JMS DUMONE /PROCESS DUMMY ARGUMENT TAD FDV /GET SAVED OPERAND DCA I L41 /AND USE AS OPERAND TAD L46 /GET TRIPLE NUMBER DCA I L43 /AND REPLACE JMP I DUMTWO /RETURN / TAKES CARE OF ONE BIING DUMMY ARG DUMONE, 0 TAD I L42 /GET OPERATOR DCA ASTOP /AND SAVE TAD E41 /GET ADD INDIRECT OPERATOR DCA I L42 /AND REPLACE OPERATOR CDF 10 TAD I TRIPL CDF 00 DCA FEX /AND SAVE RETURN JMS I TRIPL /CALL TRIPL TAD L46 /GET TRIPLE NUMBER DCA I L41 /AND REPLACE OPERAND TAD ASTOP /RESTORE OPERATOR DCA I L42 ISZ L40 /ADVANCE TRIPLE TAD FEX /RESTORE RETURN CDF 10 DCA I TRIPL CDF 00 JMP I DUMONE /RETURN / COME HERE IF OP IS / DIV, JMS I SMODE /CHECK FOR SAME MODE JMS I CHECK /CHECK WHATS IN THE AC JMP DIVE /TWO IS IN AC JMS I STORE /THERES SOMETHING IN THE AC...STORE IT SKP /NOTHING IS IN AC JMS I STORE /THERES SOMETHING IN THE AC...STORE IT JMS I MADDTW /GET TWO INTO THE AC DIVE, TAD I L41 /GET OPERAND ONE JMS I MODE /WHAT MODE IS IT TAD FM6 TAD C6025 DCA FDV /SAVE OERATOR IAC JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE FDV, 0 JMS I ARG /PUT OUT THE ARG PSEUDO OP TAD I L41 /GET OPERAND ONE JMP I MIRET /JUMP TO RETURN ROUTINE / COME HERE IF OP IS ** EXP, JMS I CHECK /CHECK WHATS IN THE AC JMP FEXP /TWO IS IN AC JMS I STORE /THERES SOMETHING IN THE AC...STORE IT SKP /NOW NOTHING IS IN AC JMS I STORE /THERES SOMETHING IN THE AC...STORE IT JMS I MADDTW /GET TWO IN AC FEXP, TAD I L41 JMS I MODE TAD C6 DCA FDV TAD I L43 /GET OPERAND TWO JMS I MODE /WHAT IS ITS MODE TAD C3 /FLOATING POINT TAD C6207 /INTEGER TAD FDV DCA FEX /SAVE REOUTINE POINTER IAC JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE FEX, 0 TAD I L41 /GET OPERAND ONE DCA I L43 /SAVE IN OPERAND TWO TAD FEX /GET THE OP CODE JUST PUT OUT TAD CM6207 /SUBTRACT THE INTEGER TO INTEGER CASE SZA CLA /WAS THIS THE INTEGER INTEGER CASE TAD L50 /NO, GET A FLOATING POINT POINTER DCA I L41 /AND SUBSTITUTE IT FOR OPERAND ONE JMS I ARG /PUT OUT THE PSEUDO OP ARG TAD I L43 /GET THE REAL OPERAND ONE IN THE AC JMP I MIRET /JUMP TO THE RETURN ROUTINE /COMES HERE IF THE VARIABLE TO THE LEFT OF THE '=' IS SUBSCRIPTED EIND, TAD C132 /GET AN ASTERISK DCA L60 /PUT IT IN SIXTY /COMES HERE IF THE OPERATOR IS AN '=' EQU, JMS I CHECK /CHECK WHATS IN THE AC NOP /TWO IS IN THE AC JMS I STORE /THERES SOMETHING IN THE AC...STORE IT JMS I TADDON /NOTHING IS IN AC...ADD ONE TO IT TAD I L43 /GET OPERA ND TWO JMS I MODE /WHAT IS ITS MODE JMP FEQU /ITS FLOATING POINT TAD L46 /GET THE AC JMS I MODE /WHAT MODE IS IT JMP I LFIX /ITS FLOATING POINT EFIX, TAD L60 /GET EQUALS INDIRECT LOCATION TAD C6071 /ADD A DCA DCA ASTOP /AND SAVE OPCODE JMS I PROP /POT OUT THE OPCODE ASTOP, 3 EQRET, DCA L46 /ZERO THE AC TAD I L43 /GET OPERAND TWO JMS I PRSYM /PRINT IT JMS I PRINT /PUT OUT A CRLF DCA L60 /ZERO SIXTY JMP I .+1 /AND RETURN ARET FEQU, TAD L46 /GET THE AC JMS I MODE /WHAT MODE IS IT SKP /ITS FLOATING POINT JMS I LFLOAT /ITS INTEGER...FLOAT IT JMP I .+1 XXX LARG, 0 JMS I PROP 6201 JMP I LARG TADDON, ADDONE E41, 41 MADDTW, ADDTWO FM6, -6 C6025, 6025 MIRET, IRET C6, 6 C6207, 6207 LFIX, FIX C6071, 6071 LFLOAT, FLOAT CM6207, -6207 C132, 132 *5200 XXX, TAD L60 /GET THE INDIRECT EQUALS SWITCH SNA CLA /IS THE SWITCH ON TAD CM140 /NO, FLOATING POINT STORE TAD C6146 /YES...ISTO DCA FSTOP /SAVE OPCODE IAC /WE ONLY HAVE ONE ARG JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE FSTOP, 6146 JMS I ARG /PUT OUT THE ARG PSEUDO OP JMP I .+1 /JUMP BACK EQRET / THIS ADDS OPERAND ONE TO THE AC ADDONE, 0 TAD I L41 /GET OPERAND ONE JMS I LADDL /PUT OUT OPCODES FOR AN ADD TAD I L41 /GET FIRST OPERAND JMS I PRSYM /PUT OUT SYMBOL JMS I PRINT /PUT OUT CR LF TAD I L41 /GET OPERAND ONE DCA L46 /PUTN THE AC JMP I ADDONE /RETURN UMIN, JMS I CHECK /CHECK WHATSN THE AC NOP /TWOSN AC JMS I STORE /THERES SOMETHINGN THE AC...STORET JMS ADDONE /NOTHINGSN AC NOW...PUT ONEN AC JMS I MCOMP /AND COMPLEMENTT JMP RETURN /AND RETURN AADD, JMS I SMODE JMS I CHECK /CHECK WHATSN THE AC JMP AONE /TWOSN AC JMS I STORE /THERES SOMETHINGN THE AC...STORET JMS ADDONE /GET ONEN AC JMS ADDTWO /ONESN AC JMP RETURN /RETURN AONE, JMS ADDONE /ADD ONE TO TWO JMP RETURN /AND RETURN LPROP, 0 CDF 10 TAD I LPROP CDF 00 JMS I PRSYM /AND PRINT THE SYMBOL TAD C40 /GET A SPACE JMS I PRINT /PUT OUT ISZ LPROP /INCREMENT RETURN JMP I LPROP /AND RETURN / THIS ADDS OPERAND TWO TO THE AC ADDTWO, 0 TAD I L43 /GET OPERAND TWO JMS I LADDL /PUT OUT OPCODES FOR AN ADD TAD I L43 /GET SECOND OPERAND JMS I PRSYM /PRINT THE SYMBOL JMS I PRINT /PUT OUT CR LF TAD I L43 /GET OPERAND TWO DCA L46 /AND PUTN AC JMP I ADDTWO /RETURN LXZQ, 0 /CHECK FOR EXPRESSION LEFT OF = CLA TAD L22 /GET SUBSCRIPT NESTING DEPTH TAD L44 /GET EQUALS SIGN SWITCH SNA CLA /ARE THEY BOTH ZERO ERR42, JMS I LUNCH /N YES ...THATS AN ERROR JMP I LXZQ /RETURN RETURN, TAD I L41 /THISS THE RETURN...GET OPERAND ONE JMS I MODE /WHAT MODEST TAD G400 /ITS FLOATING POINT...TURN F.P. BIT ON TAD L40 /ADD CURRENT TRIPLE NUMBER DCA L46 /PUTN AC SW JMP I NARET /AND NOW RETURN FROM THE ROUTINE FLOAT, 0 JMS I FPROP /PUT OUT A CAL TO THE FLOAT ROUTINE 6127 JMP I FLOAT /AND RETURN FIX, JMS I FPROP /PUT OUT A CAL 6143 /TO THE FIX ROUTINE JMP I .+1 /AND JUMP BACKLADDL, ADDL EFIX C6146, 6146 LADDL, ADDL MCOMP, COMP G400, 400 NARET, ARET LSMODE, 0 TAD I L43 /GET FIRST OPERAND JMS I MODE /FIND WHAT ITS MODE IS JMP IBM /ITS FLOATING POINT TAD I L41 /GET OPERAND TWO JMS I MODE /THIS BETTER BE INTEGER TOO JMP .+5 /ITS NOT, LUNCH JMP I LSMODE /GREAT, RETURN IBM, TAD I L41 /GET OPERAND TWO JMS I MODE /THIS BETTER BE F.P. TOO JMP I LSMODE /IT IS RETURN ERR43, JMS I LUNCH /ERROR LPUNCH, 0 PSF /IS PUNCH READY JMP .-1 /NO, TRY AGAIN PLS /YES, PUNCH THE CHARACTER CLA /CLEAR THE ACCUMULATOR JMP I LPUNCH /AND RETURN CM140, -140 LFINI, 0 /FINAL CLEANUP AT END OF COMPILATION JMS I FPROP /PUNCH 'CALL 0,OPEN' OPEN JMS I PROP /PUNCH A 'PAUSE' 6060 JMS I PRINT JMS I PRINT /FORCE LAST LINE OUT TAD CM100 JMS I LEADR /PUNCH SOME LEADER CDF 10 XFINI, HLT /JMP I LFINI, FOR DISK SYSTEM ... CIF 0 JMP I D1000 /BEGIN NEXT COMPILATION D1000, 1000 CM100, -100 LEADR, LLEAD FORST, JMS I PRINT /FORTRAN STARTING POINT JMS I (LIST DCA .-1 TAD (LPUNCH DCA PUNCH TAD CM50 JMS I LEADR JMS I PROP FORTR JMS I PRINT JMP I .+1 START1 PAGE *5400 LLAST, TAD C4000 /END OF COMPILATION, SET CHK SO THAT DCA CHK /LGTC WILL NOT READ ANOTHER LINE... JMS I GNB SZA JMP I ASSIGN JMS I (OSTOP /PUNCH A 'HLT' ETC. TAD L55 TAD C25 SZA CLA /IS DO LIST EMPTY? ERR44, JMS I LUNCH /NO, COMPLAIN... MORDUM, TAD L56 /GET POINTER INTO SYMBOL TABLE TAD C2 /ADD TWO TO IT FOR CONTROL BITS DCA L72 /SAVE ADDRESS OF CONTROL BITS TAD I L72 /GET THE CONTROL BITS AND E10 /MASK ALL BUT THE DUMMY ARG BIT SNA CLA /IS THE DUMMY ARG BIT ON JMP LEDOUT /NO, PUT OUT DUMMY SUBSCRIPT DEFNS JMS I DEFN /YES, PUT OUT THE VARIABLE NAME JMS I PROP /PUT OUT THE OP CODE 6154 /WHICH IS BSS TAD C2 /RESERVE TWO LOCATIONS JMS I PROTAC /PRINT THE TWO JMS I PRINT ISZ L56 /ADVANCE THE POINTER ISZ L56 ISZ L56 JMP MORDUM /GO BACK AND DO THE NEXT ONE LEDOUT, DCA L72 /ZERO LOCATION 72 LEDOT1, TAD L25 /GET THE NUMBER OF SUBSCRIPT TEMPS CMA TAD L72 /SUBTRACT FROM THE NUMBER WEVE DEFINED SNA CLA /HAVE WE DEFINED THEM ALL YET JMP GOOON /YES, NOW PUT OUT THE END TAD K5200 /GET SUBSCRIPT DESIGNATOR TAD L72 /GET WHICH SUBSCRIPT JMS I PRSYM /AND PRINT IT TAD C7240 /GET THE TERMINATOR JMS I P2 /PRINT IT JMS I PROP /PRINT THE OP CODE 6154 /WHICH IS BSS TAD C2 /RESERVE TWO LOCATIONS JMS I PROTAC JMS I PRINT /CRLF ISZ L72 /GO ON TO THE NEXT ONE JMP LEDOT1 GOOON, JMS I PROP 6157 /PUT OUT AN END JMS I PRINT /PUT OUT A CRLF DCA L65 /ZERO THE PSEUDO LOCATION COUNTER TAD START /CLA = -600 JMS I LEAD /PUT OUT LOTS OF LEADER CODE JMS I PROP 6162 /PUT OUT A LAP JMS I PRINT SYM, TAD L57 CIA TAD L56 SZA CLA /ARE THERE ANY SYMBOLS JMP SYM1 TAD MIKE8 SZA CLA /NO, IS THERE ANY EQUIVALENCING? JMP I LPTEMP JMP I .+1 PTEMP SYM1, TAD L56 TAD C2 DCA L72 TAD I L72 /GET THE CONTROL BITS DCA L72 /SAVE THEN TAD L72 /GET THE BITS AND E7 /MASK SZA CLA /ARE THEY FUNCT NAME, JMP UP /YES JMS I DEFN /PUT IT OUT TAD L72 AND E20 /MASK ALL BUT THE DIMEN SNA CLA /IS EITHER ONE ON JMP NORM /NO TAD L56 JMS I DIM DCA L26 TAD I L14 /GET THE SECOND DIMENSION CLL CIA /AND NEGATE DCA L73 /SAVE SZL ERR36, JMS I LUNCH TAD L26 ISZ L73 JMP .-4 ACK, DCA L26 TAD L56 JMS I MODE /DETERMINE MODE OF SYMBOL TAD L26 RAL CLL TAD L26 SZL JMP ERR36 DCA L26 TAD L72 AND C40 SZA CLA JMP COM JMS I BSS UP, ISZ L56 ISZ L56 ISZ L56 JMP SYM NORM, IAC JMP ACK C25, 25 E7, 7 K5200, 5200 DEFN, LDEFN E20, 20 E10, 10 LPTEMP, EEK LEAD, LLEAD COM, JMS I PROP 6165 TAD L26 JMS I PROTAC JMS I PRINT JMP UP *5600 C7600, 7600 C177, 177 LBSS, 0 TAD L65 /GET THE LOCATION COUNTER TAD L26 /ADD THE CURRENT AMOUNT TO IT AND C7600 /MASK ALL BUT THE PAGE BITS DCA L64 /SAVE THE NUMBER OF PAGES TAD L65 /GET THE LOCATION COUNTER AGAIN TAD L26 /ADD THE CURRENT DISPLACEMENT AGAIN AND C177 /NOW GET THE NUMBER OF LOCATIONS OVER A PAGE DCA L65 /AND SAVE L, TAD L64 /GET THE NUMBER OF PAGES TO BE RESERVED SNA /ARE THERE ANY TO BE RESERVED JMP CRAM /NO...JUST PUT OUT STRAIGHT NUMBER OF LOCATIONS TAD C7600 /YES...SUBTRACT ONE FROM THE PAGE COUNT DCA L64 /AND SAVE IT TAD L65 /GET THE NUMBER OF EXTRA LOCATIONS DCA L26 /AND PUT IN THE DISPLACEMENT LOCATION JMS I PROTAC /PUT OUT A ZERO JMS I PRINT /PUT OUT A CRLF JMS I PROP /PUT OUT THE OPCODE 6151 /WHICH IS THE PAGE PSEUDO OP JMS I PRINT /PUT OUT A CRLF JMP L /NOW SEE IF WE HAVE PUT OUT ENOUGH PAGES CRAM, JMS I PROP /NOW PUNCH 'BLOCK <N>' BLCK TAD L26 JMS I PROTAC JMS I PRINT JMP I LBSS LDEFN, 0 TAD L56 /GET THE POINTER TO THE SYMBOL JMS I PRSYM /PRINT THE SYMBOL TAD C7240 /GET THE TERMINATOR JMS I P2 /PRINT IT JMP I LDEFN /AND RETURN AFCON, TAD L47 /GET START OF FCON TABLE TAD C3 /UPDATE IT DCA L56 /SAVE UPDATED ADDRESS FLOOP, TAD L50 /GET END OF FCON TABLE CIA TAD L56 /SUBTRACT FROM CURRENT POINTER SNA CLA /ARE WE DONE JMP ALTHRU /YES TAD CM3 /NO, GET MINUS THREE DCA L63 /TO USE AS A COUNTER JMS LDEFN /DEFINE IT TAD I L56 /GET THE FIRST WORD ISZ L56 /ADVANCE THE POINTER TO THE NEXT WORD JMS I PROTAC /PRINT THE WORD JMS I PRINT /PUT OUT A CRLF ISZ L63 /HAVE WE PUT OUT ALL THREE WORDS JMP .-5 /NO...PUT OUT ANOTHER JMP FLOOP /YES...GET THE NEXT CONSTANT PTEMP, TAD K561 DCA L56 FTLOOP, TAD L45 CMA TAD L56 SNA CLA JMP ITEMP TAD C3 DCA L26 TAD K5400 /GET F.P. DESIGNATOR JMS LDEFN /PRINT THE SYMBOL JMS I BSS /RESERVE THE LOCATIONS FOR IT ISZ L56 /INCREMENT THE POINTER JMP FTLOOP ITEMP, TAD K531 DCA L56 ILOOP, TAD L51 CMA TAD L56 SNA CLA JMP SUBOUT IAC DCA L26 TAD K5000 /GET THE INTEGER TEMP DESIGNATOR JMS LDEFN /PRINT IT JMS I BSS /RESERVE LOCATIONS FOR IT ISZ L56 /INCREMENT THE POINTER JMP ILOOP ALTHRU, TAD D6 /PUNCH AN 'IFF 6' JMS I PIFF /SO THAT ENTRY WILL NOT BE AT END OF THE PAGE JMS I PROP 6055 /PUT OUT AN EAP JMS I PRINT TAD L70 /GET THE SUBROUTINE FUNCTION POINTER SZA CLA /IS IT ZERO JMP THRU /NO...WE MUST BE IN A SUBR OR A FUNC JMS I PROP /YES ...WERE IN A MAIN PROGRAM 6052 /PUT OUT ENT TAD C6000 /POINTER TO THE SYMBOL MAIN JMS I PRSYM /PRINT THE SYMBOL JMS I PRINT /PUT OUT A CRLF TAD C6000 /GET THE POINTER TO MAIN AGAIN JMS I PRSYM /PRINT IT TAD C7240 /GET A COLON JMS I P2 /PRINT THEM JMS I PROP 6047 JMS I PRINT /PUT OUT A CRLF THRU, JMS I FINI 6201 /CDF FIELD 0 JMP I C7600 /AND RETURN TO THE MONITOR ... C6000, 6000 SUBOUT, DCA L56 SUBOT1, TAD L25 CMA TAD L56 SNA CLA JMP AFCON JMS I PROP /PUT OUT THE OP CODE 6176 /WHICH IS DUMMY TAD X5200 /GET SUBSCRIPT DESIGNATOR TAD L56 /GET THE POINTER JMS I PRSYM /PRINT THE SYMBOL JMS I PRINT /CRLF ISZ L56 JMP SUBOT1 K5000, 5000-ITTAB K5400, 5400-FTTAB K531, ITTAB+1 K561, FTTAB+1 X5200, 5200 FINI, LFINI D6, 6 *6000 /FUNCTION AND SUBROUTINE STATEMENT PROCESSOR LFUNC, JMS I LOOK /CHECK REST OF STATEMENT MFOUR, -4 / -24 /T -11 /I -17 /O -16 /N CLA IAC /SET SWITCH TART, DCA L67 /THIS IS THE SWITCH TAD FIRSTF SNA CLA /INSURE SUBR. OR FUNCT. IS FIRST STMT. ERR47, JMS I LUNCH JMS SUBB CLA CMA TAD C6275 /THIS IS THE PLACE TO STORE FUNCTION NAME DCA L11 /USE AUTO INDEXING TO STORE THE NAME TAD L30 /GET THE FIRST WORD DCA I L11 /PUT IT IN THE SYMBOL TABLE TAD L31 /GET THE SECOND WORD DCA I L11 /PUT IT IN THE TABLE TAD L32 /GET THE THIRD WORD IAC /TURN THE EXTERNAL SYMBOL BIT ON DCA I L11 /AND PUT IT IN THE TABLE TAD C6275 /GET THE POINTER DCA L70 /AND PUT IT IN LOC 70 JMS I PROP 6052 /PUT OUT AN ENT TAD L70 /GET THE SUBROUTINE NAME JMS I PRSYM /PRINT IT JMS I PRINT /PUT OUT A CRLF CLA CMA DCA READY /SET SWITCH TAD L70 /GET THE SUB NAME JMS I PRSYM /PUT IT OUT TAD C7240 JMS I P2 /PUT IT OUT JMS I PROP /PUT OUT THE OP CODE 'BLOCK 2' BLCK TAD C2 JMS I PROTAC JMS I PRINT DCA WHICH /ZERO THE SWITCH WHICH TELLS WHICH WORD MORE, JMS I GNB SNA /CHECK FOR END OF CARD JMP CKCR TAD CM50 /CHECK FOR LEFT PAREN SNA /IS IT A LPAR JMP GET1 /YES TAD MFOUR SNA /IS IT A COMMA JMP XGET /YES TAD C3 SNA CLA /IS IT A LPAR JMP START /YES JMP ERR48 /NO GET1, ISZ READY /WERE WE READY FOR LPAR JMP ERR48 /NO, ERROR ... XGET, JMS SUBB TAD L32 TAD TEN DCA L32 TAD C77 /GET MASK FOR SYMBOL TABLE DCA L21 /AND PUT INTO THE SWITCH JMS I SYMTAB /AND PUT IN SYMBOL TABLE JMS I PROP DUMMY TAD L77 JMS I PRSYM JMS I PRINT DLOOP, JMS I PROP 6063 /PUT OUT A TAD* TAD L70 /GET THE FUNCTION NAME JMS I PRSYM /AND PRINT IT JMS I PRINT /PUT OUT A CRLF JMS I PROP 6071 /PUT OUT A DCA TAD L77 /GET ADDRESS OF SYMBOL JMS I PRSYM /PRINT IT TAD WHICH /GET THE WHICH SWITCH RAR /GET THE LOW BIT INTO THE LINK SNL CLA /IS THE WHICH SWITCH BIT SWITCHED JMP NEXT /NO...THAT MEANS WERE ON THE FIRST WORD TAD E43 /YES...WERE ON SECOND WORD...GET A "#" JMS I PRINT /PRINT IT NEXT, JMS I PRINT JMS I PROP /PUT OUT AN INC (ISZ WHICH DOES NOT SKIP) 6237 TAD L70 /GET THE FUNCTION NAME JMS I PRSYM /AND PRINT IT TAD E43 JMS I PRINT JMS I PRINT /PUT OUT A CRLF ISZ WHICH /INCREMENT THE SHICH SWITCH TAD WHICH /GET THE SWITCH RAR /GET LOW BIT IN THE LINK SZL CLA /IS THE LOW BIT ON JMP DLOOP /YES...WORK ON THE SECOND WORD JMP MORE /GO GET SOME MORE READY, 0 SUBB, 0 JMS I ENTITY SKP JMP I SUBB E43, 43 TEN, 10 JMP ERR48 WHICH, 0 C6275, 6275 /SUBROUTINE OR FUNCTION NAME POINTER CKCR, ISZ READY ERR48, JMS I LUNCH JMP START IOEQL, CLA CMA /ROUTINE TO TERMINATE IMPLIED DO LOOPS TAD IMPDO DCA IMPDO /REDUCE THE DEPTH BY 1 JMS I DONEXT /GENERATE END-OF-LOOP CODE JMS I GNB TAD CM51 SZA CLA /SKIP TO A RIGHT PAREN JMP .-3 JMP I .+1 IOH0 DONEXT, LDNEXT *6172 C6030, 6030 LWRIT, JMS I LOOK /LOOK FOR REST OF STATEMENT -1 -5 TAD C3 LREAD, TAD C6030 /GET THE POINTER TO READ AND WRITE DCA IOP /USE AS A PARAMETER WITH FPROP JMS I GNB TAD CM50 SZA CLA /IS THIS A LEFT PAREN? JMP I ASSIGN JMS SUBA JMS I ZZZ TAD C2 JMS I FPROP IOP, 0 JMS I ARG TAD L32 JMS I PRSYM JMS I PRINT JMS I ARG JMS I GNB TAD CM54 /IS IT A COMMA SZA CLA JMP ERR50 /NO, ERROR ... JMS SUBA TAD L32 /GET FORMAT SMA JMS I PLAB SPA JMS I PRSYM JMS I GNB TAD CM51 /CHECK FOR A RIGHT PAREN SZA CLA /IS IT? ERR50, JMS I LUNCH JMS I PRINT IOH0, JMS I GNB SNA JMP IOH2 TAD CM54 SNA CLA /IS IT A COMMA JMP IOH3 /YES ... IOH1, JMS I PUTCH /NO...PUT IT BACK JMS I GNB /THIS STMT IS TRANSFERRED TO! TAD CM50 SNA CLA JMP I IOPEN /OPEN PAREN - MAY BE IMPLIED DO-LOOP IOH1BK, JMS I PUTCH DCA L52 /SET SWITCHES FOR GENER DCA L46 ISZ L44 JMS I GENER /START PROCESSING THE IO LIST TAD L41 DCA L42 TAD L53 DCA L73 /SAVE CREATED LABEL LOC DCA L23 /ZERO TEMPORARY FOR "DUMARG" JMS I LCHNG /TEST FOR 0 OR DUMMY ARG DCA I L41 TAD L23 /GET TEMPORARY FROM "DUMARG" SZA CLA /ZERO MEANS NON-VARIABLE NAME TAD I L23 /NON-ZERO POINTS TO FLAG WORD OF VAR AND Q20 SNA CLA /DO WE HAVE AN ARRAY NAME? JMP NOSYMB /NO JMS I PROP OPCMA /PUT OUT A "CMA" TO DISTINGUISH THIS CALL JMS I PRINT /FROM A REGULAR CALL TO "IOH" TAD C2 JMS I FPROP 6036 /OUTPUT A "CALL 2,IOH" JMS I ARG TAD L23 TAD CM2 JMS I DIM /GET THE DIMENSIONS DCA IOP TAD I L14 CIA DCA L44 TAD L23 TAD CM2 JMS I MODE /GET THE MODE OF THE ARRAY TAD C4000 /FLOATING POINT - ADD 4000 TO AC TAD IOP ISZ L44 JMP .-2 /COMPUTE PRODUCT OF DIMENSIONS PLUS MODE BIT JMS I PROTAC /PRINT IT JMS I PRINT JMP IOHRSM /GO PRINT ARRAY NAME NOSYMB, TAD L46 SZA CLA JMS I STORE IAC /THERE WILL BE ONE ARGUMENT JMS I FPROP /PUT OUT THE CALL TO IOH 6036 IOHRSM, TAD L73 DCA L53 /RESTORE CREATED LABEL LOC TAD I L41 JMS I QSYMOT TAD L63 /GET TERMINATING CHAR SNA CLA /WAS IT A <CR>? JMP IOH2 /YES IOH3, JMS I GNB /GENTLY LOOK AHEAD ... SNA CLA /DO WE HAVE A ',<CR>' ? JMP START /YES, DO NOT TERMINATE YET ... JMP IOH1 /NO, PUSH IT BACK & PROCESS NEXT ITEM IOH2, IAC /THERE WILL BE ONE ARGUMENT JMS I FPROP /PUT OUT A CALL TO IOH 6036 JMS I ARG /PUT OUT THE PSEUDO OP ARG JMS I PROTAC JMS I PRINT JMP START SUBA, 0 JMS I ENTITY JMP ERR51 /ITS A CR JMP ERR51+1 /ITS A VARIABLE JMP I SUBA Q20, 20 ERR51, JMS I LUNCH DCA L21 /ZERO THE SYMBOL TABLE SWITCH JMS I SYMTAB TAD L77 JMS I MODE JMP ERR51 TAD L77 DCA L32 TAD L32 JMS I DUMARG JMP ERR51 JMP I SUBA IOPEN, IOOPEN QSYMOT, SYMOUT *6400 LRET, JMS I LOOK /CHECK REST OF STATEMENT -2 -22 -16 JMS I ZZZ TAD L70 SNA CLA /ARE WE COMPILING MAIN PROGRAM? ERR60, JMS I LUNCH /YES TAD L67 SNA CLA JMP INT /ITS A SUBROUTINE TAD L70 /GET HE NAME OF THE FUNCTION JMS I MODE /IS IT FP OR INTEGER JMP .+4 /ITS FP JMS I PROP 6066 /OPCODE IS TAD JMP .+5 /PUT OUT THE SYMBOL IAC /THERE IS ONE ARGUMENT JMS I FPROP 6003 JMS I ARG TAD F34 /GET A BACK SLASH JMS I PRINT TAD L70 /GET THE NAME OF THE FUNCTION JMS I PRSYM /PRINT THE NAME JMS I PRINT /PUT OUT A CRLF INT, JMS I PROP 6077 /OPCODE IS RTN TAD L70 /GET THE FUNCTION NAME JMS I PRSYM /PRINT IT JMS I PRINT /PUT OUT A CRLF JMP START /WERE DONE LGETHI, 0 /PUNCH 'TAD ACH' JMS I PROP 6066 JMS I PROP /PRINT THE OP CODE 6226 /WHICH IS ACH (HIGH ORDER AC) JMS I PRINT JMS I FPROP /PUNCH 'CALL 0,CLEAR' 6204 JMP I LGETHI LDIM, 0 /GETS THE 1ST DIMENSION OF THIS VARIABLE DCA LGETHI /SYMBOL TABLE ADDRESS IS IN THE AC CMA TAD L50 DCA L14 LK, TAD I L14 /SEARCH THE DIMENSION TABLE CIA TAD LGETHI SNA CLA JMP .+4 ISZ L14 ISZ L14 JMP LK TAD I L14 /EXIT WITH DIMENSION IN THE AC JMP I LDIM / THIS PROCESSES SUBSCRIPTS SUBRET, JMP I LSUBSC /RETURN FROM SUBSC LSBTEM, 0 /THIS ROUTINE MAKES AN ENTRY DCA TRIP /IN SUBSCRIPT TEMPORARY TABLE TAD FBASE DCA POINT TAD CM40 DCA PCTR LOOP, TAD I POINT /LOOK FOR CURRENT TRIPLE NR SNA /OR END OF TABLE... JMP YES CIA TAD TRIP SNA CLA JMP GOT ISZ POINT ISZ PCTR JMP LOOP ERR53, JMS I LUNCH YES, TAD TRIP DCA I POINT GOT, TAD FBASE CIA TAD POINT DCA POINT TAD POINT CIA TAD L25 SPA CLA /IF TEMPORARY NR > L25 ISZ L25 /BUMP L25 TAD POINT JMP I LSBTEM LWIPE, 0 /ZERO THE SUBSCRIPT TEMP. TABLE TAD FBASE DCA POINT TAD CM40 DCA PCTR LOOP2, DCA I POINT ISZ POINT ISZ PCTR JMP LOOP2 JMP I LWIPE LZER, 0 ISZ LZER /INCREMANT JMS I PROTAC /PUT OUT A ZERO JMP I LZER /AND REUTURN LCLAB, 0 SNA /IF NO LABEL IN AC, JMS I CREATE /CREATE A LABEL JMS I PRCRL /AND PRINT IT TAD C7240 /PUT OUT A COLON AND SPACE JMS I P2 JMP I LCLAB /RETURN FBASE, 4600 POINT, 0 PCTR, 0 TRIP, 0 F34, 34 LSUBSC, 0 TAD L46 SZA /IS THERE ANYTHING IN THE AC? CHANGE, SKP CLA /******************************** / TRY CHANGING THIS LOCATION TO A "JMS I MODE" / TO LIMIT THE CHECK TO THE INTEGER AC! / COULD SAVE UP TO 30% IN HEAVILY SUBSCRIPTED F.P. / EXPRESSIONS! (IMPORTANT - TEST WITH F.P. SUBSCRIPTS) SKP /NOTHING IN THE AC JMS I STORE /YES - STORE IT IAC DCA L63 TAD L53 DCA L73 TAD L41 DCA L42 ISZ L41 TAD I L41 TAD CM4046 SNA CLA /WAS IT A PRIME JMP BACK JMS I LCHNG DCA L63 ISZ L41 ISZ L41 ISZ L42 ISZ L42 IAC BACK, ISZ L41 DCA SYMOUT JMS CHNG DCA L65 ISZ L42 ISZ L42 JMS CHNG DCA LDUM /SAVE ARRAY POINTER (OR 0 IF DUMMY) TAD L73 /NOW RESTORE THE CREATED LABEL LOC DCA L53 TAD SYMOUT SNA CLA /HOW MANY SUBSCRIPTS? JMP .+7 /ONE - SKIP OUTPUTTING "TAD" JMS I PROP 6066 TAD I L41 JMS I DIM JMS I PRSYM JMS I PRINT TAD I L41 JMS I MODE JMP FP CASUB, TAD H200 TAD L40 DCA I L41 /STORE TRIPLE NUMBER WITH MODE BITS IN PD STACK TAD SYMOUT /GET NUMBER OF ARGUMENTS (2 OR 3) TAD C2 JMS I FPROP /PUT OUT A CALL TO THE SUBSCRIPTING ROUTINE 6173 /TO THE SUBSCRIPTING ROUTINE TAD SYMOUT SNA CLA /ONLY ONE ARG? JMP .+3 /YES - DON'T OUTPUT FIRST SUBSCRIPT TAD L63 JMS SYMOUT TAD L65 JMS SYMOUT TAD LDUM /GET THE ARRAY NAME JMS SYMOUT /OUTPUT IT AS AN ARGUMENT TAD I L41 JMS I PRSYM /OUTPUT THE DESTINATION TEMPORARY JMS I PRINT TAD I L41 DCA L12 /MARK IT AS THE CONTENTS OF THE LAST LINE JMP I FSUBSC /RETURN FP, JMS I PROP OPCMA /OPCODE IS CMA JMS I PRINT TAD H400 /SET MODE TO FLOATING POINT JMP CASUB SYMOUT, 0 DCA CHNG TAD CHNG SNA CLA JMS I CLAB /CREATE LABEL IF DUMMY ARG JMS I ARG TAD CHNG SNA /IS IT ZERO JMS I ZER /YES PUT OUT A ZERO JMS I PRSYM /OTHERWISE PUT OUT SUBSCRIPT JMS I PRINT /PUT OUT A CRLF JMP I SYMOUT LDSPCL, DCA L24 JMS I CREATE JMS I PRCRL /CHANGE LAST LINE TO STORE IN NEW DESTINATION DCA L12 /MARK LAST LINE USELESS FOR OPTOMIZATION JMP LDMRET LDUM, 0 ISZ LDUM /INCREMENT RETURN TAD I L42 /GET THE THING WHICH IS DUMMY CIA TAD L12 /DID WE JUST PUT THIS OUT AS A SUBSCRIPT SNA CLA /DESTINATION?? JMP LDSPCL /YES - SAVE OODLES OF CODE JMS I PROP 6066 /PUT OUT A TAD TAD I L42 JMS I PRSYM /PUT IT OUT JMS I PRINT /PUT OUT A CRLF JMS I PROP 6071 /PUT OUT A DCA JMS I CREATE /CREATE A LABEL JMS I PRCRL /AND PRINT IT JMS I PRINT /PUT OUT A CRLF JMS I PROP 6066 TAD I L42 JMS I PRSYM TAD H43 JMS I PRINT JMS I PRINT JMS I PROP 6071 TAD L53 JMS I PRCRL TAD H43 JMS I PRINT LDMRET, JMS I PRINT JMP I LDUM /RETURN CHNG, 0 TAD I L42 /NO...THERES TWO SUBSCRIPTS SNA TAD H6041 DCA I L42 TAD I L42 JMS I DUMARG /SEE IF SECOND SUBSC IS A DUMMY ARG JMS I DUM /YES IT IS A DUMMY ARG TAD I L42 /GET THE SECOND SUBSC JMP I CHNG H400, 400 H200, 200 H43, 43 FSUBSC, SUBRET H6041, 6041 *7000 IOHTMP,MCHAR, 0 NPOINT,LLUNCH, 0 CLA DCA L75 DCA L24 /ZERO "BUFFER WAITING TO PRINT" FLAG DCA IMPDO /ZERO IMPLIED DO LOOP FLAG TAD TTYPE /CHANGE TO TTY OUTPUT DCA PUNCH JMS I LLIST /TYPE THE CURRENT LINE CLL CMA RAL TAD KOUNT /USE THE BUFFER POINTER AS AN INDEX SMA CMA DCA L7 TAD C40 /NOW PUT OUT SOME SPACES... JMS I PRINT ISZ L7 JMP .-3 TAD D36 /AND AN '^' JMS I PRINT JMS I PRINT TAD LELIST /NOW TYPE THE ERROR MESSAGE DCA L10 UNCH1, TAD I L10 SZA /END OF TABLE? TAD LLUNCH SNA CLA /IS THIS THE MSG WE WANT? JMP UNCH2 ISZ L10 /NO JMP UNCH1 UNCH2, TAD BASE CIA TAD I L10 JMS I LLIST /FAKE LISTER INTO PRINTING ERROR MESG JMS I PRINT /FORCE BUFFER TAD EPNCH /BACK TO PUNCH OUTPUT DCA PUNCH ISZ L75 /SET THE NON-PRINT SWITCH TAD CHK /IF ERROR OCCURED WHILE PROCESSING END STMT. TAD C4000 /CHK WILL BE 4000-WANT TO ABORT IMMEDIATELY SZA CLA /WAS IT END STMT? JMP START /NO-GO PROCESS NEXT STMT. JMP I (THRU /YES-CLEAN UP AND ABORT LLIST, LIST D36, 36 LELIST, ELIST-1 /ERROR LIST ... TTYPE, LTTYPE EPNCH, LPUNCH CTR, 0 TEM, 0 / THIS ROUTINE PRINTS THE CONTENTS OF THE AC IN DECIMAL PARCT,LDCOUT, 0 DCA TEM /SAVE THE AC TAD CM3 /WE WILL PUT OUT FOUR CHARACTERS DCA CTR TAD ASE /THIS IS THE ASE OF THE CONVERSION TABLE DCA NPOINT /SAVE IT IN THE POINTER DCA FLAG LOP, DCA MCHAR /ZERO OUT THE CHARACTER TAD TEM /GET THE NUMBER AGAIN TAD I NPOINT /TO GET THE ITEM IN THE TABLE SPA /IS THE RESULT POSITIVE JMP LOPRST /NO...RESTORE THE NUMBER DCA TEM /AND SAVE THIS VALUE TAD D60 DCA FLAG /SET FLAG TO SHOW THAT WE HAVE SOMETHING ISZ MCHAR /YES...INCREMENT THE OUTPUT CHARACTER JMP LOP+1 /TRY THE SEQUENCE AGAIN LOPRST, CLA TAD MCHAR TAD FLAG SZA /DO WE HAVE A SIGNIFICANT DIGIT? JMS I PRINT /YES - PRINT IT ISZ NPOINT ISZ CTR JMP LOP /AND GET THE NEXT DIGIT TAD TEM /GET THE CHARACTER TO OUTPUT TAD D60 /PUT IT IN TRIMMED ASCII FORM JMS I PRINT /PRINT IT JMP I LDCOUT /YES...RETURN TO CALLING PROGRAM ASE, THOU FLAG, 0 IOOPEN, TAD KOUNT DCA IOHTMP /SAVE POINTER TO LEFT PAREN +1 CLA CMA DCA PARCT /INITIALIZE PAREN COUNTER TAD KOUNT DCA TEM /TEM POINTS TO ENTITY (OR PREV ONE IF A VAR) IOPENL, JMS I ENTITY /GET SOMETHING ERR52, JMS I LUNCH /END OF STMT - BAD JMP IOPENL /VARIABLE - DON'T UPDATE TEM D60, 60 JMP IOPENL-2 /CONSTANT - UPDATE TEM TAD CM51 /PUNCTUATION - TEST FOR RIGHT PAREN SNA JMP IORPAR /YES IAC SNA /LEFT PAREN? JMP IOLPAR TAD CM25 SNA CLA /IF CHAR IS AN EQUAL SIGL TAD PARCT IAC SZA CLA /AND WE ARE ON THE TOP LEVEL OF PARENTHESES JMP IOPENL-2 TAD TEM /THEN WE HAVE AN IMPLIED DO DCA KOUNT JMS I DO /GENERATE DO LOOP CODE JMP ERR52 /NOT TERMINATED WITH RPAR - ERROR ISZ IMPDO /BUMP IMPLIED DO COUNT TAD IOHTMP DCA KOUNT /RESTORE CHAR PTR TO BEGINNING OF LOOP JMP I .+1 IOH1+1 /COMPILE INNARDS OF LOOP IOLPAR, CLA CMA TAD PARCT JMP IOPENL-3 /BUMP PAREN COUNT UP AND LOOP IORPAR, ISZ PARCT /BUMP PAREN COUNT DOWN JMP IOPENL-2 /LOOP IF NOT BALANCED TAD IOHTMP DCA KOUNT /BALANCED - NOT AN IMPLIED DO JMP I .+1 IOH1BK /COMPILE NORMALLY CM25, -25 DO, XDO *7200 EQUI, JMS I LOOK /CHECK REST OF STATEMENT TYPE -7 /THERE ARE 7 MORE CHARACTERS -26 /V -1 /-A -14 /-L -5 /-E -16 /-N -3 /-C -5 /-E RETA, ISZ SNUM /INCREMENT THE STRING NUMBER JMS CCCC /GET AND CHECK THE NEXT NON-BLANK CHARACTER SKP /ONLY LEGAL CHAR HERE IS A "(" JMP RETB /WE GOT THE "(" NOP JMP ERR59 RETB, JMS I ENTITY /LOOK FOR A VARIABLE SKP JMP LA /GOT IT, ANYTHING ELSE IS AN ERROR NOP NOP JMP ERR59 LA, ISZ L32 /TURN EQUIVALENCE BIT ON ISZ L32 TAD K57 /GET MASK FOR SYMBOL TABLE DCA L21 /PUT IN THE SYMBOL TABLE SWITCH JMS I SYMTAB /PUT IN SYMBOL TABLE TAD L77 /GET THE POINTER ISZ MIKE4 /AND PUT IN EQUIVALENCE TABLE DCA I MIKE4 TAD SNUM /GET THE CURRENT STRING NUMBER ISZ MIKE4 /AND PUT IT IN THE EQUIVALENCE TABLE DCA I MIKE4 ISZ MIKE8 /INCREMENT NUMBER OF ENTRIES JMS CCCC /GET NEXT PUNCTUATION JMP ERR59 /C/R, THAT'S AN ERROR ... JMP .+3 /LEFT PAREN, VARIABLE IS SUBSCRIPTED JMP LB /COMMA, NOT SUBSCRIPTED, STRING CONTINUES JMP LC /RIGHT PAREN, NOT SUBSCRIPTED, END OF STRING JMS I ENTITY /LOOK FOR SUBSCRIPT NOP SKP JMP LD /GOT IT, ANYTHING ELSE IS ERROR NOP JMP ERR59 LD, CLA CMA /SUBTRACT ONE FROM TAD L32 /FIRST SUBSCRIPT DCA INTA /AND SAVE JMS CCCC /GET NEXT PUNCTUATION NOP /CR IS ILLEGAL HERE JMP RETB-1 /SO IS LEFT PAREN SKP /COMMA, DOUBLY SUBSCRIPTED JMP LF /RIGHT PAREN, SINGLY SUBSCRIPTED JMS I ENTITY /GET OTHER SUBSCRIPT NOP SKP JMP LG /GOT IT NOP JMP LD-1 LG, TAD L32 /SET IT NEGATIVE CIA DCA INTB /AND SAVE IT JMS CCCC /GET NEXT PUNCTUATION NOP NOP ERR59, JMS I LUNCH TAD L77 /RIGHT PAREN IS ONLY LEGAL CHARACTER JMS I DIM /GET DIMENSION INFORMATION DCA CCCC /AND SAVE SKP /GO TO TEST PART OF LOOP TAD CCCC /THIS LOOP IS A MAKESHIFT MULTIPLY ISZ INTB /ARE WE DONE JMP .-2 /NO TAD INTA /YES, ADD FIRST SUBSCRIPT DCA INTA /AND SAVE LF, TAD L77 /GET POINTER TO VARIABLE JMS I MODE /WHAT MODE IS IT TAD INTA /F.P., MULTIPLY BY THREE RAL CLL /INTEGER TAD INTA IAC /ADD ONE TO ANSWER ISZ MIKE4 /AND PUT IN EQUIVALENCE TABLE DCA I MIKE4 JMS CCCC /GET NEXT PUNCTUATION NOP JMP RETB-1 /CR AND "(" ARE ILLEGAL HERE JMP RETB /COMMA MEANS STRING NOT FINISHED JMP LI /")" MEANS STRING FINISHED LC, CLA IAC /HERE WE CRAM A ONE INTO EQUIVALENCE ISZ MIKE4 DCA I MIKE4 LI, JMS CCCC /WE FINISHED A STRING, ARE THERE MORE JMP START /NO SKP JMP RETA /YES JMP RETB-1 /"(" AND ")" ARE ILLEGAL HERE LB, CLA IAC /CRAM A ONE INTO TABLE ISZ MIKE4 DCA I MIKE4 JMP RETB /AND GO BACK / / THIS"ROUTINE GETS AND CHECKS THE NEXT NON-BLANK CHAR / CCCC, 0 JMS I GNB SNA /PUNCTUATION IS WHAT WE WANT JMP I CCCC /ITS A CR TAD CM54 SNA /IS IT A COMMA JMP XCOMMA /YES TAD C3 SNA /IS IT A ")" JMP XRPAR /YES IAC SNA /IS IT A "(" JMP XLPAR /YES JMP RETB-1 /NONE OF THE ABOVE XRPAR, ISZ CCCC XCOMMA, ISZ CCCC XLPAR, ISZ CCCC JMP I CCCC K57, 57 LFIN, JMS I GNB SZA CLA JMP I ASSIGN JMS I ZZZ /PRINT LABEL ON "FINI" JMP I .+1 IOH2 /THE FOLLOWING CODE IS TO PROCESS THE EQUIVALENCE TABLE /AT THE END OF A COMPILATION *7376 EEK, ISZ MIKE4 ISZ MIKE4 DCA I MIKE4 /SET END OF LIST JMS INIT /INITIALIZE POINTERS AAB, TAD MA /SET POINTERS TO STRING NUMBERS TAD C3 DCA MB ISZ MA ISZ MA AAC, ISZ MB AA, ISZ MB TAD I MA /GET FIRST STRING NUMBER CIA TAD I MB /SUBTRACT FROM SECOND SZA CLA /ARE THEY THE SAME JMP KICK1 /NO, ADVANCE POINTERS ISZ MA /YES, MOVE TO LINEAR SUBSCRIPT ISZ MB TAD I MA /GET FIRST SUBSC CIA TAD I MB /SUBTRACT FROM SECOND SPA CLA SNA /IS FIRST ONE SMALLER JMP KICK2 /NO, JUST ADVANCE POINTERS TAD MA /YES, SWITCH PLACES TAD CM2 DCA MA TAD MB TAD CM2 DCA MB TAD CM3 DCA INIT RAUCH, TAD I MA DCA L76 TAD I MB DCA I MA TAD L76 DCA I MB ISZ MA ISZ MB ISZ INIT JMP RAUCH TAD MA TAD CM2 DCA MA JMP AA /NOW THEYRE SWITCHED, CHECK AGAIN KICK2, CLA CMA /MOVE BACK FIRST POINTER TAD MA DCA MA JMP AAC KICK1, ISZ MA /MOVE UP FIRST POINTER ISZ MIKE7 /ARE WE OUT OF ENTRIES JMP AAB /NO / / NOW THE SORTING IS DONE / JMS INIT /INITIALIZE POINTERS DCA TOTAL /ZERO OUT TOTAL MIKE2, ISZ MA TAD I MA JMS I PRSYM /PUT OUT THE SYMBOL TAD C7240 JMS I P2 /PUT OUT THE TERMINATOR IAC TAD I MA DCA L14 TAD I L14 /GET CONTROL BITS FROM SYMBOL TABLE AND P20 SNA CLA /IS IT DIMENSIONED JMP MIKE5 /NO TAD I MA /YES, COMPUTE THE TOTAL LENGTH JMS I DIM DCA L26 TAD I L14 CIA DCA L73 TAD L26 ISZ L73 JMP .-2 SKP /GOT IT MIKE5, IAC /IF NOT DIMENSIONED, USE ONE A LENGTH DCA MB /SAVE LENGTH TAD I MA JMS I MODE /WHAT IS THE MODE OF THE SYMBOL TAD MB /FP, MULTIPLY BY THREE RAL CLL TAD MB DCA INIT /SAVE IT TAD TOTAL /GET TOTAL REMAINING LENGTH OF STRING CIA TAD INIT /SUBTRACT CURRENT LENGTH FROM IT SPA CLA /WHICH IS BIGGER JMP .+3 /REMAINING PORTION IS BIGGER TAD INIT /CURRENT PORTION IS BIGGER, REPLACE REMAINING PORTION DCA TOTAL ISZ MA TAD MA TAD C3 DCA MB TAD I MB /GET NEXT ENTRY STRING NUMBER CIA TAD I MA /SUBTRACT CURRENT STRING NUMBER SZA CLA /ARE THEY EQUAL JMP MIKE1 /NO ISZ MA /YES, GET THE DIFFERENCE ISZ MB TAD I MB CIA TAD I MA DCA MB /AND SAVE TAD MB /SUBTRACT DIFFERENCE FROM TOTAL REMAINING CIA TAD TOTAL MIKE6, DCA TOTAL /SAVE TAD MB /GET THE DIFFERENCE DCA L26 JMS I BSS /RESERVE THAT MANY LOCATIONS ISZ MIKE7 /ARE WE DONE JMP MIKE2 /NO JMP I ROGER /YES MIKE1, TAD TOTAL /SWITCH TOTAL TO THE CURRENT LOCATION DCA MB ISZ MA /EQUALIZE POINTERS JMP MIKE6 / INIT, 0 TAD MIKE8 /GET ENTRY COUNT CIA /SET NEGATIVE DCA MIKE7 /SAVE TAD POINTZ /GET TABLE POINTER DCA MA /SAVE JMP I INIT / ROGER, PTEMP P20, 20 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 | /OS8 FORTRAN II COMPILER OVERLAY V5 ***FPATCH.05*** / / / / / / / // / / / / /COPYRIGHT (C) 1974, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / / /FIXES TO FPATCH FOR V4 J.K. 1975 / / .CHANGED USE OF 17645 SO /N CAN BE PASSED TO LOADER / BIT 0 OF 17645 INDICATES THAT SABR WAS CHAINED / TO FORM FORT INSTEAD OF WHOLE WORD / / .VERSION NUMBER VIA /V--OPTION / WILL BE PASSED ONTO SABR / / / FIELD 0 JSBITS=7746 MOFILE=7600 MPARAM=7643 LLUNCH=7001 /TAKE OUT WHEN MERGING WITH COMPILER DO=7173 /" ELIST=1162 /" EMSG1=1270 /" EMSG14=1520 /" FLST=242 /" FORST=5362 /" FPROP=144 /" GOOON=5455 /" KOUNT=113 /" LPTRIN=545 /" LPUNCH=5333 /" LTTYPE=3372 /" L75=75 /" OSTOP=4052 /" XFINI=5354 /" *200 START, CLA CMA DCA FCHFLG CIF 10 JMS I (7700 10 /ESCAPE ISZ FCHFLG JMP .+5 CIF 10 JMS I (200 5 /COMMAND DECODE 0624 /.FT ASSUMED EXTENSION CDF 10 TAD I (MPARAM+1 CDF 0 AND (4 SZA CLA JMS VERNUM CLA IAC CIF 10 JMS I (200 4 /CLOSE OPERATOR USED AS DELETE OUSNAME /DELETE FORTRN.TM IF IT EXISTS 0 CLA /IT DIDN'T EXIST CLA IAC /ENTER A FILE ON "SYS" - MAXIMUM SIZE CIF 10 JMS I (200 3 /ENTER OUSREC, OUSNAME HOLSIZ, 0 JMP I (OUERR /WHATS GOING ON HERE? CLA IAC /DEVICE "SYS" CIF 10 JMS I (200 2 PTSABR, SABR FCHFLG, 0 /USELESS LENGTH WORD JMP I (BIGGIE TAD PTSABR DCA I (CLSABR TAD OUSREC DCA I (OUTREC TAD HOLSIZ DCA I (OURCNT TAD (1000 TAD I (JSBITS DCA I (JSBITS /SET "UNSTARTABLE" STATUS BIT JMS I (FNEWF /INITIALIZE FIRST INPUT FILE WHILE I/O MON IS IN CORE CDF 10 TAD OUSREC DCA I (7620 CLA IAC DCA I (7617 CLA CLL CML RTL AND I (MPARAM TAD I (MOFILE+5 SNA CLA DCA I (FLST TAD I (7600 SNA CLA TAD I (MPARAM AND (41 SNA CLA /DID HE SPECIFY A "L" OR "G" OPTION WITHOUT A JMP FCDF0-3 /RELOCATABLE OUTPUT FILE? FTADNM, TAD BDFALT /YES - GIVE HIM ONE DCA I B7600 /NAMED "FORTRL.TM" ISZ FTADNM ISZ B7600 ISZ B7773 JMP FTADNM CLA CLL CML RAR TAD I (7645 DCA I (7645 /SABR IT WAS CHAINED TO BY FORT FCDF0, CDF 0 JMP I (1003 /START COMPILATION BDFALT, 1 /DEVICE "SYS" TEXT /FORTRLTM/ B7600, 7600 B7773, 7773 / VERNUM, 0 TAD I POINT CDF CIF 10 JMS I VPRINT ISZ POINT ISZ COUNT JMP .-5 JMP I VERNUM / POINT, VERN COUNT, -12 VERN, 306 317 322 324 240 326 265 301 215 212 / VPRINT, VERPRT /ADDITIONS TO FORTRAN ERROR MESSAGES *ELIST+1 NUMSG1 *EMSG1-2 -ERR61-1; EMSG15 -ERR62-1; EMSG16 -ERR63-1; EMSG17 -ERR64-1; EMSG20 0 ; EMSG14 /DUMMY PAGES TO CONSOLIDATE CORE IMAGE *1600 0 *2000 0 *2400 0 *3000 0 *5600 0 *5400 FNEWF, 0 CDF 10 TAD I FILPTR SNA JMP EOFERR /END OF INPUT REACHED BEFORE END STATEMENT DCA INWCNT TAD I FILPTR AND (7760 SZA TAD (17 CLL CML RTR RTR DCA INRCNT ISZ FILPTR TAD I FILPTR DCA INREC ISZ FILPTR TAD (5001 /FORTRAN ALLOWS TWO-PAGE HANDLERS DCA INHNDL TAD INWCNT CDF 0 CIF 10 JMS I (200 1 /ASSIGN AND FETCH HANDLER INHNDL, 5000 /LOCATIONS 5000-5377 ARE FREE JMP IOERR /SOMETHINGS SCREWY CLA CMA DCA INWCNT DCA INEOF JMS MOUCOR JMP I FNEWF FILPTR, 7617 GETCH, 0 KSF JMP .+5 KRS TAD (-203 SNA CLA JMP I (7600 ISZ JMPGET ISZ INWCNT JMPG, JMP JMPGET TAD INEOF SNA CLA JMP JUSTRD GETNXT, CIF 10 JMS I G7700 10 /ESCAPE JMS FNEWF JUSTRD, JMS I INHNDL /INHNDL CONTAINS LOCN OF DEVICE HANDLER 0200 /READ 2 HALF-RECORDS INTO FIELD 0 INBFPT, INBUF INREC, 0 JMP RERROR ISZ INREC ISZ INRCNT SKP ENDFIL, ISZ INEOF TAD (-601 DCA INWCNT TAD JMPG DCA JMPGET TAD INBFPT DCA INPTR JMP GETCH+1 JMPGET, JMP . JMP INCHR1 JMP INCHR2 INCHR3, TAD JMPG DCA JMPGET TAD I INPTR AND (7400 CLL RTR RTR TAD INTMP RTR RTR ISZ INPTR JMP GCHCOM INCHR2, TAD I INPTR AND (7400 DCA INTMP ISZ INPTR INCHR1, TAD I INPTR GCHCOM, AND (377 TAD (-232 SNA JMP GETNXT TAD (232 CIF 10 ISZ GETCH JMP I GETCH RERROR, SMA CLA G7700=RERROR JMP ENDFIL IOERR, JMS I (SFATAL CIF 10 ERR62, JMS I (LLUNCH INPTR, 0 INWCNT, 0 INTMP, 0 INRCNT, 0 INEOF, 0 EOFERR, JMS MOUCOR /KICK MONITOR OUT JMS I (SFATAL CIF 10 ERR61, JMS I (LLUNCH MOUCOR, 0 CDF 0 CIF 10 JMS I (200 11 JMP I MOUCOR *3200 P377, 377 P7400, 7400 /WARNING ***DO NOT MOVE THIS*** PUTCH, 0 DCA PUTMP RAL DCA PUTLNK PUTCHX, ISZ JMPPUT ISZ OUWDCT JMPP, JMP JMPPUT CLA CLL CML RTL TAD OURCNT SZL JMP OUERR+1 DCA OURCNT ISZ CLOSCT ISZ CLOSCT JMS I (7607 4400 OUBFPT, OUBUF OUTREC, 0 JMP I (IOERR ISZ OUTREC ISZ OUTREC TAD (-1401 DCA OUWDCT TAD OUBFPT DCA OUPTR TAD JMPP DCA JMPPUT JMP PUTCHX JMPPUT, JMP . JMP PUTCH1 JMP PUTCH2 PUTCH3, TAD PUTMP RTL RTL DCA PUTMP TAD JMPP DCA JMPPUT TAD PUTMP AND P7400 TAD I OUPOLD DCA I OUPOLD TAD PUTMP RTL RTL P201, AND P7400 TAD I OUPTR DCA I OUPTR ISZ OUPTR JMP PCHCOM PUTCH2, TAD OUPTR DCA OUPOLD ISZ OUPTR PUTCH1, TAD PUTMP P200, AND P377 DCA I OUPTR PCHCOM, CIF 10 TAD PUTLNK CLL RAR JMP I PUTCH EOFORT, SZA CLA /ANY ERRORS? JMP I SF7600 /YES, DO NOT ASSEMBLE DCA PCHCOM TAD (232 JMS PUTCH TAD OUWDCT TAD (1400 SZA CLA JMP .-5 /FILL BUFFER WITH ^Z TAD I (JSBITS RAR CLL CML RAL DCA I (JSBITS /NO NEED TO SAVE CORE ON THIS MONITOR CALL CIF 10 JMS I (7700 10 /ESCAPE CLA IAC /DEVICE "SYS" CIF 10 JMS I P200 4 /CLOSE OUSNAM CLOSCT, 0 /CLOSING LENGTH JMP OUERR-3 CIF 10 JMS I P200 6 /RUN CLSABR, 0 BIGGIE, JMS I (MOUCOR JMS SFATAL CIF 10 ERR63, JMS I (LLUNCH CLA CLL CMA RTL AND I (JSBITS DCA I (JSBITS /WHOOPS - GUESS WE SHOULD RESTORE CORE AFTER ALL OUERR, JMS I (MOUCOR JMS SFATAL CIF 10 ERR64, JMS I (LLUNCH INBUF=1600 OUBUF=3600 OURCNT, 0 OUPTR, OUBUF OUWDCT, -1401 PUTMP, 0 OUPOLD, 0 SFATAL, 0 PUTLNK=SFATAL SF7600, 7600 /CLEAR AC CDF 10 TAD SCDIF0 DCA I (177 TAD (5601 DCA I P200 TAD SF7600 DCA I P201 SCDIF0, CDF CIF 0 JMP I SFATAL *2200 /CANNOT GO PAST 2373 SABR, TEXT /SABR/ TEXT /SV/ OUSNAM, TEXT /FORTRNTM/ NUMSG1, TEXT /ILLEGAL CONTINUATION/ EMSG15, TEXT /NO END STATEMENT/ EMSG16, TEXT #I/O ERROR# EMSG17, TEXT /SABR.SV NOT FOUND/ EMSG20, TEXT /NO ROOM FOR OUTPUT/ FIELD 1 /THESE ARE THE PATCHES OVER THE COMPILER. *FORST /HEADER PRINTER NOP NOP NOP *FORST+5 /LEADER OUTPUT CLA CLL CMA RTL /3 CHARACTERS OF LEADER *LPTRIN+1 /HIGH-SPEED READER ROUTINE CIF 0 JMS I .+1 GETCH *OSTOP+1 JMS I FPROP /PUNCH 'CALL 0,EXIT' 6253 JMP I OSTOP *LPUNCH+1 /PUNCH ROUTINE CIF 0 JMS I .+2 CLA SKP PUTCH *XFINI-3 /TRAILER PRINTER CLA CLL CMA RTL /3 CHARACTERS OF TRAILER *XFINI-1 /ENDING SEQUENCE CDF CIF 0 TAD L75 /PICK UP ERROR FLAG JMP I .+1 EOFORT *GOOON+4 /TRAILER AFTER "END" STATEMENT CLA CLL CMA RTL /3 CHARS ETC. *LTTYPE+1 /REVERSE TTY WAIT MODE TLS TSF JMP .-1 / *4753 VERPRT, 0 JMS I VPUNCH CDF CIF 0 JMP I VERPRT VPUNCH, 3372 / $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | /ARCTANGENT ROUTINE OS8 FORTRAN II LIBRARY / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / VERSION 11A / VERSION NUMBER IS AVAILABLE AT ENTRY POINTS ENTRY ATAN ATAN, BLOCK 1 11 TAD ATAN DCA L4 TAD ATAN# DCA L4# INC ATAN# INC ATAN# CALL 1,IFAD L4, ARG 0 CLL TAD ACH SNA JMP EXIT SPA TAD (4000 DCA ACH /TAKE ABSVAL OF ARGUMENT RAR DCA SIGN /AND REMEMBER SIGN TAD ACH TAD (-2014 SPA CLA JMP LSTN45 /IF ARG>1, JMS INVRS /INVERT ARG - SUBTRACT RESULT FROM PI/2 CLA CMA LSTN45, DCA L4# /L4# IS THE "PI/2-RESULT" SWITCH TAD ACH TAD (-1774 /THIS IS AN APPROXIMATE TEST TO SEE SPA CLA /IF THE NEW ARG IS <2-SQRT(3) JMP LSTN15 /IF IT IS, CALL 1,FAD /PERFORM A "DIFFERENCE OF TANGENTS" ARG SQRT3 /TRANSFORMATION TO SUBTRACT PI/6 TAD (20 JMS INVRS /FROM THE RESULT. THE ARG IS TRANSFORMED CALL 0,CHS /INTO SQRT(3)-4/(ARG+SQRT(3)) CALL 1,FAD SQT3, ARG SQRT3 CLA CMA LSTN15, DCA INVRS /USE INVRS AS A SWITCH TO INDICATE THIS CALL 1,STO /TRANSFORMATION OCCURRED ARG T TAD (-4 DCA L4 TAD SQT3# DCA L3# ATLOOP, INC L3# /NOW PERFORM A STANDARD TAYLOR SERIES INC L3# /EXPANSION (WITH TRUNCATED COEFFICIENTS) INC L3# CALL 1,FAD /CONVERGENCE WILL BE GOOD SINCE WE L3, ARG SQRT3 /HAVE MADE THE ARGUMENT BE <.3 JMS FMPT JMS FMPT ISZ L4 JMP ATLOOP JMS FMPT CALL 1,FAD ARG T /FINISH UP THE SERIES ISZ INVRS JMP NOPI6 CALL 1,FAD /ADD PI/6 IF NECESSARY ARG PIOVR6 NOPI6, ISZ L4# JMP NOPI2 CALL 0,CHS /SUBTRACT FROM PI/2 IF NECESSARY CALL 1,FAD ARG PIOVR2 NOPI2, TAD SIGN TAD ACH /SET SIGN OF RESULT = SIGN OF ARGUMENT DCA ACH EXIT, RETRN ATAN INVRS, 0 /INVERSION SUBROUTINE TAD (2014 /ENTERED WITH AC=0 OR 20 DCA L4 /AC=0 MEANS 1/FAC, AC=20 MEANS 4/FAC CALL 1,STO ARG T TAD L4 DCA ACH /ACM AND ACL WERE CLEARED BY STORE CALL 1,FDV ARG T JMP I INVRS FMPT, 0 /SUBROUTINE TO MULTIPLY BY T CALL 1,FMP /SAVES A FEW MEASLY LOCATIONS ARG T JMP I FMPT SIGN, 0 /CELL FOR HOLDING SIGN OF ARG T, BLOCK 3 /FLOATING TEMPORARY PAGE PIOVR6, 2004;1405;2216 /PI/6 PIOVR2, 2016;2207;7325 SQRT3, 2016;7331;7272 /SQRT(3) /THE NEXT 4 NUMBERS MUST IMMEDIATELY FOLLOW SQRT3 1756;0462;4562 /APPROXIMATELY 1/9 5764;4221;3403 /APPROXIMATELY -1/7 1766;3141;6672 /APPROXIMATELY 1/5 5775;2525;2337 /APPROXIMATELY -1/3 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 | / FLOATING POINT MATH PACKAGE / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / VERSION 5A / APRIL 28, 1977 / VERSION NUMBER IS AVAILABLE AT ENTRY POINTS / ENTRIES / ENTRY FAD ENTRY FSB ENTRY FMP ENTRY FDV ENTRY STO ENTRY FLOT ENTRY FLOAT ENTRY FIX ENTRY IFIX ENTRY IFAD ENTRY ISTO ENTRY ABS ENTRY CHS /THE FOLLOWING DEFINITIONS ENABLE LIBRARY OPTIMIZATIONS /WHERE CRITICAL TIMING CONSIDERATIONS EXIST. /THEY SHOULD BE USED WITH EXTREME CAUTION, AND MUST /REFERENCE CURRENT PAGE AND PAGE ZERO SYMBOLS ONLY. OPDEF TADI 1400 OPDEF DCAI 3400 OPDEF JMSI 4400 OPDEF JMPI 5400 SKPDF JMSKP 4000 / / ABSYM HAC 20 ABSYM MAC 21 ABSYM LAC 22 ABSYM SRH 23 ABSYM SRM 24 ABSYM SRL 25 ABSYM ACS 26 ABSYM ACX 27 ABSYM SRS 30 ABSYM SRX 31 ABSYM MQH 30 ABSYM MQM 31 ABSYM MQL 32 // ADDITION AND SUBTRACTION ROUTINE // LAP /LEAVE AUTO PAGING ADSRAD, ADSRAC /SOME INDIRECTS TO SAVE CORE... ARSAB, ARS GTSPLA, GTSPLT NORMAD, NORMAC COMAD, COM FSB, BLOCK 1 5 /FLOATING POINT SUBTRACT TAD FSB / CALL 1,FSB DCA FAD / ARG <F.P. VARIABLE> TAD FSB# DCA FAD# CLA CLL CML RAR JMP ED1 / ER1, FAD FAD, BLOCK 1 5 /FLOATING POINT ADD SUBROUTINE ED1, DCA FSB / CALL 1,FAD TAD FAD / ARG <VARIABLE> DCA FAD1 FAD1, NOP /CDF TO PICK UP ARGUMENT TADI FAD# INC FAD# DCA 7 CLA CMA TADI FAD# INC FAD# DCA 10 FADENT, TAD ER1 DCA ER0 TAD ACH /EXAMINE THE FLOATING AC SNA CLA JMP FADLD /IT'S ZERO, DO A LOAD... JMSI GTSPLA JMP FADEND TAD SRS TAD FSB DCA SRS TAD ACX SNA JMP SHFAC CIA TAD SRX SMA JMP SHFAC DCA FSB SHFSR, TAD SRH CLL RAR DCA SRH TAD SRM RAR DCA SRM TAD SRL RAR DCA SRL ISZ FSB JMP SHFSR JMP JD1 / SHFAC, CMA DCA FSB TAD SRX DCA ACX JMP ED3A ED3, JMSI ARSAB ED3A, ISZ FSB JMP ED3 / JD1, TAD ACS SMA CLA JMP ED4 CLA CLL CMA RTL / GENERATE -3 JMSI COMAD ED4, TAD SRS SPA CLA JMSI COMAD JMSI ADSRAD TAD HAC SMA CLA JMP ED5 CLA CLL CMA RTL JMSI COMAD CLA CLL CML RAR ED5, DCA ACS DCA RSW FADEND, JMSI NORMAD JMP FADEX FADLD, TAD 7 /FLOATING LOAD WHEN AC=0 DCA FADSB# JMS FADSB SZA /CHECK FOR 0.-0. DON'T GIVE -0. TAD FSB AND ABSSW DCA ACH JMS FADSB DCA ACM JMS FADSB DCA ACL FADEX, CLA CMA DCA ABSSW DCA FSB /FOR IFAD AFTER SUBTRACT CLA STL RTL /=0002 TAD FAD /HIGH SPEED RETURN DCA FAD3 FAD3, NOP JMPI FAD# ABSSW, 7777 /ABSOLUTE VALUE SWITCH FADSB, 0 /TIME SAVING SUBROUTINE NOP /CHANGED TO CDF TADI 10 JMPI FADSB / FLOATING POINT ABSOLUTE VALUE FUNCTION ABS, BLOCK 1 5 / CALL 1,ABS TAD ABS / ARG <F.P. VARIABLE> DCA FAD TAD ABS# DCA FAD# CLL STA RAR /=3777 DCA ABSSW JMP ED1 /GO INTO ADD ROUTINE... PAGE / ROUTINE TO GET OPERAND INTO SR, SEPARATE SIGNS AND / EXPONENTS OF AC AND SR, AND MOVE GLOBAL AC TO LOCAL AC. / GTSPLT, 0 TAD 7 DCA GTS1 GTS1, NOP TADI 10 /PICK UP HIGH ORDER WORD JMS SPLIT /MUST NOT CHANGE DATA FIELD**** DCA SRH TAD ACX SZA INC GTSPLT DCA SRX TAD ACS DCA SRS TADI 10 /PICK UP WORD 2 DCA SRM TADI 10 /PICK UP WORD 3 DCA SRL TAD ACH JMS SPLIT /EXPAND THE FLOATING AC... DCA HAC DCA RSW GTS2, TAD ACM /NEEDS LABEL TO FORCE CDF! DCA MAC TAD ACL DCA LAC JMPI GTSPLT / SPLIT, 0 /BREAK UP SIGN, EXPON, AND HI-ORD BITS DCA TMP /ROUTINE MUST NOT CHANGE DATA FIELD**** TAD TMP RAR RTR AND (377 DCA ACX CLA CLL CML RAR / = 4000 AND TMP DCA ACS TAD TMP AND (7 JMPI SPLIT TMP, 0 / / ALS, 0 /LOCAL AC SHIFT LEFT SUBROUTINE TAD LAC CLL RAL DCA LAC TAD MAC RAL DCA MAC TAD HAC RAL DCA HAC JMPI ALS / / ADD SR TO AC / ADSRAC, 0 /ADD LOCAL SR TO LOCAL AC CLL TAD LAC TAD SRL DCA LAC CLA RAL TAD MAC TAD SRM DCA MAC CLA RAL TAD HAC TAD SRH DCA HAC JMPI ADSRAC / / ROUTINE TO NORMALIZE AND RECOMBINE ACCUMULATOR, / AND PLACE LOCAL ACC. IN GLOBAL ACC. / ARSAD, ARS /SOME CORE SAVING INDIRECTS ERRAD, ERR RSW, 0 /ROUNDING BIT NORMAC, 0 /NORMALIZE AND PACKING SUBROUTINE ED6, TAD HAC TAD (7770 SPA CLA JMP RUND JMSI ARSAD ISZ ACX JMP ED6 / / ROUNDOFF ROUTINE / RUND, TAD RSW SNA CLA JMP LEFTST ISZ LAC JMP LEFTST ISZ MAC JMP LEFTST ISZ HAC DCA RSW JMP ED6 / LEFTST, TAD ACX SNA SPA JMP ZEROUT DCA ACX CLA CLL CMA RTL / = -3 TAD HAC SMA SZA CLA JMP COMBIN JMS ALS CLA CMA JMP LEFTST / COMBIN, TAD ACX CLL RAL RTL SPA JMPI ERRAD TAD HAC TAD ACS ED7, DCA ACH TAD MAC DCA ACM TAD LAC DCA ACL JMPI NORMAC ZEROUT, CLA DCA LAC DCA MAC JMP ED7 PAGE / / INDIRECT STORE / ISTO, BLOCK 1 5 /FLOATING POINT INDIRECT STORE TAD ISTO / CALL 1,ISTO DCA IST1 / ARG <2WORD ADDRESS> IST1, NOP TADI ISTO# INC ISTO# DCA IST2 TADI ISTO# DCA 7 TAD ISTO DCA STO TAD ISTO# DCA STO# IST2, NOP TADI 7 INC 7 DCA ISTO CLA CMA TADI 7 DCA 10 TAD ISTO DCA STOSB# JMP STOX / / / ROUTINE TO STORE CONTENTS OF FL. PT. ACC AND CLEAR IT / STO, BLOCK 1 5 / CALL 1,STO TAD STO / ARG <F.P. VARIABLE> DCA STO1 STO1, NOP /REPLACED BY CDF TADI STO# INC STO# DCA STOSB# CLA CMA TADI STO# DCA 10 STOX, TAD ACH JMS STOSB DCA ACH TAD ACM JMS STOSB DCA ACM TAD ACL JMS STOSB DCA ACL INC STO# CLA STL RTL /=0002 TAD STO /SOME TIME SAVING CODE... DCA STO3 STO3, NOP /REPLACED BY CIF CDF JMPI STO# STOSB, 0 /TIME SAVING SUBROUTINE NOP /CHANGED TO A CDF DESTINATION DCAI 10 JMPI STOSB / / FLOATING POINT TO FIXED POINT CONVERSION / FXER, 4611 3040 /"FIX" ERROR FIX, BLOCK 1 5 FIXX, TAD ACH JMS SPLIT DCA HAC TAD ACM DCA MAC TAD ACX TAD (-214 SMA JMP FIXERR TAD (-3 DCA SRM RSH, JMS ARS ISZ SRM JMP RSH TAD ACS RAL TAD MAC SZL CIA FIXRTN, DCA ACS DCA ACH DCA ACM DCA ACL TAD ACS RETRN FIX / IFIX, BLOCK 1 5 TAD IFIX DCA ADDR TAD IFIX# DCA ADDR# CALL 1,IFAD ADDR, ARG 0 TAD IFIX DCA FIX CLA CLL CML RTL / = 2 TAD IFIX# DCA FIX# JMP FIXX FIXERR, CALL 1,ERROR ARG FXER CLA CLL CMA RAR JMP FIXRTN /RETURN WITH 2047 IN FIXED AC PAGE / / FLOATING POINT MULTIPLICATION / ADSRAE, ADSRAC /SOME TIME SAVING INDIRECTS ARSAE, ARS COMAF, COM GTSPLB, GTSPLT NORMAG, NORMAC ER4, FDV ER01, ER0 ER3, FMP FMP, BLOCK 1 5 TAD ER3 DCAI ER01 TAD FMP DCA FMP1 FMP1, NOP /CDF TO FIELD OF CALLING PROGRAM TADI FMP# INC FMP# DCA 7 CLA CMA TADI FMP# INC FMP# DCA 10 JMSI GTSPLB /WARNING ***THIS INSTRUCTION SKIPS*** JMP MULZRO TAD ACS TAD SRS DCA ACS TAD ACX TAD SRX MULZRO, TAD (-201 DCA ACX TAD HAC DCA MQH TAD MAC DCA MQM TAD LAC DCA MQL DCA HAC TAD (-33 DCA FMP1 / MULT, JMSI ARSAE TAD MQH RAR DCA MQH TAD MQM RAR DCA MQM TAD MQL RAR DCA MQL SZL JMSI ADSRAE ISZ FMP1 JMP MULT JMSI NORMAG RETRN FMP / / / FLOATING POINT DIVISION / DIVZ, 4411 2632 FDV, BLOCK 1 5 TAD ER4 DCAI ER01 TAD FDV DCA FDV0 FDV0, NOP /CDF TO FIELD OF CALLING PROGRAM TADI FDV# INC FDV# DCA 7 CLA CMA TADI FDV# INC FDV# DCA 10 JMSI GTSPLB JMP DIVERR TAD ACS TAD SRS DCA ACS TAD SRX CIA TAD ACX TAD (177 DCA ACX DCA MQL TAD (-35 DCA FDV0 DVID, CLA CLL CML RAR / = 4000 AND SRH TAD HAC SPA CLA JMP FDV1 JMSI COMAF FDV1, JMSI ADSRAE TAD MQL RAL DCA MQL TAD MQM RAL DCA MQM TAD MQH RAL DCA MQH JMS ALS ISZ FDV0 JMP DVID / TAD MQH DCA HAC TAD MQM DCA MAC TAD MQL DCA LAC JMSI NORMAG FDVRET, RETRN FDV DIVERR, CALL 1,ERROR ARG DIVZ CLA CLL CMA RAR DCA ACH JMP FDVRET PAGE / / ROUTINE TO GET TWO'S COMPLEMENT OF TRIPLE WORD NUMBER / IF NO ADDRESS IN AC UPON ENTRY, SR IS ASSUMED. / COM, 0 TAD (25 /ADDRESS OF SRL DCA PTR2 CLA CLL CMA RTL / = -3 DCA CTR2 ED8, TAD I PTR2 CMA SZL CLL IAC DCA I PTR2 CLA CMA CML TAD PTR2 DCA PTR2 ISZ CTR2 JMP ED8 JMP I COM PTR2, 0 CTR2, 0 / / CONVERT FIXED POINT TO FLOATING POINT / CPAGE 14 FLOAT, BLOCK 1 5 /FLOAT FUNCTION TAD FLOAT / CALL 1,FLOAT DCA FLO1 / ARG <INT. VARIABLE> FLO1, NOP TADI FLOAT# INC FLOAT# DCA FLO2 TADI FLOAT# INC FLOAT# DCA 7 TAD FLOAT DCA FLOT TAD FLOAT# DCA FLOT# FLO2, NOP /CDF TO FIELD OF ARGUMENT TADI 7 JMP FLOTX / / INTEGER TO FLOATING POINT CONVERSION / FLOT, BLOCK 1 5 / CALL 0,FLOT FLOTX, CLL /ASSUMES INTEGER VARIABLE IN AC SPA CIA CML DCA MAC DCA HAC DCA LAC RAR DCA ACS TAD (217 DCA ACX DCA RSW JMS NORMAC RETRN FLOT / INDIRECT FLOATING POINT ADD CPAGE 36 IFAD, BLOCK 1 5 / CALL 1,IFAD TAD IFAD / ARG <2WORD ADDRESS> DCA IFA1 IFA1, NOP TADI IFAD# INC IFAD# DCA IFA2 CLA CMA TADI IFAD# INC IFAD# DCA 10 IFA2, NOP TADI 10 DCA 7 CLA CMA TADI 10 DCA 10 TAD IFAD DCA FAD TAD IFAD# DCA FAD# JMP FADENT ARS, 0 /LOCAL AC SHIFT RIGHT SUBROUTINE TAD HAC CLL RAR DCA HAC TAD MAC RAR DCA MAC TAD LAC RAR DCA LAC CLA RAL DCA RSW JMPI ARS FPER, 5726 0614 /"OVFL" ERROR CHS, BLOCK 1 5 /FLOATING POINT NEGATION TAD ACH / CALL 0,CHS SZA TAD (4000 CHSRET, DCA ACH RETRN CHS / / ERROR ROUTINES / ER0, 0 /CONTAINS ADDRESS OF CURRENT ENTRY PT ERR, CLA TAD I ER0 /BANK CALL IS FROM DCA CHS ISZ ER0 /INDEX TO ADDRESS TAD I ER0 /ADDRESS DCA CHS# CALL 1,ERROR ARG FPER CLA CLL CMA RAR JMP CHSRET END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 | / / COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION, / MAYNARD, MASSACHUSETTS 01754 / UTILITY SUBROUTINE PACKAGE / VERSION UTILTY.V7A (OCTOBER 26,1971) / (VERS. CHG. V07 TO V7A 4/25/77 MH) / ENTRY OPEN /INITIALIZING AND FLAG SETTING ROUTINE ENTRY GENIO ENTRY EXIT /EXIT TO DISK MONITOR SYSTEM ENTRY ERROR ENTRY CKIO /USELESS ROUTINE OPDEF KRS 6034 OPDEF KCC 6032 OPDEF RIF 6224 OPDEF TADI 1400 OPDEF DCAI 3400 OPDEF JMSI 4400 OPDEF JMPI 5400 / CARD READER IOT'S OPDEF RCSE 6672 OPDEF RCSP 6671 OPDEF RCSF 6631 OPDEF RCRA 6632 /LINE PRINTER IOT'S OPDEF LLB 6666 OPDEF LSF 6661 LAP U17, 17 /*** MUST BE FIRST LOC IN PAGE *** IOER, 1117 0522 /"IOER" ERROR GENIO, BLOCK 2 /GENERAL INPUT/OUTPUT ROUTINE DCA 7 /SAVE ENTRY AC GENLP, TAD 7 RTL RTL RAL U200, AND U17 TAD JMPITB DCA DSPACH /INDEX JUMP TABLE BY DEVICE NUMBER TAD U200 KRS TAD UM203 SNA CLA KSF /CHECK FOR ^C ON TELETYPE DSPACH, NOP /NO ^C - DISPATCH TO I/O ROUTINE CALL 0,EXIT JMPITB, JMPI DEVTAB DEVTAB, TTYOUT HSPOUT IOERR GENOUT TTYIN HSRIN IOERR GENIN IOERR IOERR IOERR IOERR IOERR IOERR IOERR IOERR HSPOUT, PSF JMP GENLP TAD 7 PLS GENRTN, CLA RETRN GENIO HSRIN, ISZ T1 JMP HSRSF TAD U336 /TIME OUT-PRINT '^' TLS HLP, KSF JMP HLP AND U200 /GET 200 INTO AC KRS /READ THE CHAR. TAD UM203 SZA CLA /IS IT CONTROL C? KCC /NO-CLEAR FLAG RFC /USER TYPED-TICKLE RDR-FALL THRU RFC HSRSF, RSF JMP GENLP DCA T1 RRB RFC JMP GENRTN# U336, 336 T1, 0 UM203, -203 PAGE U377, 377 /MUST BE FIRST LOC IN THIS PAGE GENIN, 6201 TADI IHNDLR SNA CLA /OPEN INPUT FILE? JMP IOERR /NO 6202 JMS I FICHAR /GET A CHAR JMP IOERR /INPUT ERROR UU200, AND U377 GRTN2, RETRN GENIO GENOUT, 6201 TADI OHNDLR SNA CLA /OPEN OUTPUT FILE? JMP IOERR /NO 6202 TAD 7 /GET CHAR TO BE OUTPUT AND U377 JMS I FOCHAR /PUT A CHARACTER JMP IOERR /OUTPUT ERROR JMP GRTN2 IHNDLR, 122 /***ALL THESE LOCATIONS ARE VERY VOLATILE!! *** FICHAR, 606 /******* OHNDLR, 121 /******* FOCHAR, 651 /****************** BATIN, 5400 /************************** BATOUT, 7400 /************************** BATVFY, 5600 /************************** BATVAL, -2214 /************************** / / INITIALIZING SUBROUTINE CALLED BY FORTRAN / CLEARS FLOATING AC AND SETS FLAGS / OPEN, BLOCK 2 PLS RFC CALL 0,CLEAR CDFX, 6201 DCAI IHNDLR DCAI OHNDLR /ZERO DEVICE-INDEPENDENT IO FLAGS DCA TTFLAG /BEGINNING OF LINE TADI (7777 /GET BATCH FIELD AND (70 TAD CDFX /MAKE A CDF DCA CDFB TADI (7777 /GET BATCH RUNNING BIT RAL SMA CLA JMP IOERR /BATCH NOT RUNNING CDFB, HLT TADI BATVFY /CHECK CRUCIAL LOCATION TAD BATVAL /FOR RL'S INITIALS SZA CLA JMP IOERR TAD CDFB IAC /MAKE A CIF DCA CIFB1 TAD CIFB1 DCA CIFB2 RIF /MAKE A CDF TO HERE TAD CDFX DCA CDFH RETRN OPEN TTYIN, CIFB1, 0 /CIF BATCH JMSI BATIN /GET A CHAR JMP TTEOF1 /EOF DCA 7 /SAVE KEYBOARD CHAR TAD 7 TAD (-"$ /IS IT A "$"? SZA CLA JMP TTFUJ1 /NO ISZ TTFLAG /WAS LAST CHAR <CR>? JMP TTYEOF /YES - EOF TTFUJ1, CLA CMA DCA TTFLAG /RESET FLAG FOR NON <CR> TAD 7 TAD (-215 SNA CLA DCA TTFLAG /CLEAR FLAG TO INDICATE <CR> TYRTN, TAD 7 JMP GRTN2 /RETURN WITH CHAR IN AC TTFLAG, 0 /INITIALLY AT BEGINNING OF LINE TTYEOF, 6201 /CDF TADI (7777 /GET WORD FROM FIELD 0 RTR CLL CML RTL /SET BIT 10 DCAI (7777 /REPLACE IT CDFH, 0 /CDF HERE TTEOF1, JMP IOERR /WHAT TO DO? TYPE, 0 TAD 7 CIFB2, 0 /CIF BATCH JMSI BATOUT /SEND A CHAR TO THE BATCH OUTPUT STREAM JMPI TYPE TTYOUT, JMS TYPE JMP GRTN2 IOERR, CALL 1,ERROR ARG IOER PAGE PMESG, MESG MESG, 7777 7777 4005 2222 1722 4001 2440 1417 0340 LIT7, 0007 ERROR, BLOCK 2 /ERROR PROCESSOR U7600, 7600 TAD ERROR DCA TEM1 TEM1, NOP /SET DATA FIELD OF "CALL ERROR" TADI ERROR# DCA TEM3 INC ERROR# E60, CLA CMA CML /CML IS WINDOW DRESSING TADI ERROR# DCA 10 INC ERROR# TEM3, NOP /DATA FIELD OF MESSAGE&ENTRY POINT DCA CKIO /ZERO "FATAL ERROR" FLAG TADI 10 RAL SZL /NON-FATAL BIT ON? ISZ CKIO /YES - SET "FATAL FLAG" TO NON-FATAL CLL RAR /STRIP NON-FATAL BIT FROM MESSAGE DCA MESG TADI 10 /SECOND WORD OF MESSAGE DCA MESG# TADI 10 DCA TEM1 TADI 10 DCA TEM3 /CALLING ADDRESS TAD PMESG DCA TEM2 ERLP, TAD I TEM2 RTR RTR RTR JMS PR6BIT TAD I TEM2 JMS PR6BIT INC TEM2 JMP ERLP PRLOC, TAD TEM1 RTR RTR JMS ERTTY /PRINT CALLING FIELD TAD (-4 DCA TEM2 NUMLP, TAD TEM3 RTL RAL DCA TEM3 TAD TEM3 JMS ERTTY ISZ TEM2 JMP NUMLP TAD (215 DCA 7 JMS TYPE CLA CLL CMA RTL JMS TYPE TAD CKIO /GET THE FATAL ERROR FLAG SNA CLA /WHADDOWEDO?? JMP EXITX RETRN ERROR /HE SAYS ITS NON-FATAL - LET HIM HANDLE IT ERTTY, 0 /DIGIT PRINTING ROUTINE RAL AND LIT7 TAD E60 JMS PR6BIT JMP I ERTTY PR6BIT, 0 /6BIT TO 8BIT CONVERTOR AND (77 SNA JMP PRLOC /MESSAGE OVER TAD (7740 SPA TAD (100 TAD (240 CALL 0,GENIO /LOOK FOR ^C WHILE TYPING JMP I PR6BIT / /EXIT TO DISK MONITOR SYSTEM / EXIT, BLOCK 2 EXITX, CALL 0,CKIO 6203 JMPI U7600 /RETURN TO MONITOR CKIO, 0 TEM2, 0 /DUMMY SUBROUTINE TO WAIT FOR I/O COMPLETE RETRN CKIO END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 | /INTEGER MATH PACKAGE OS8 FORTRAN II LIBRARY / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / VERSION 5A / APRIL 28, 1977 / VERSION NUMBER IS AVAILABLE AT ENTRY POINTS / / ENTRY IREM ENTRY IABS ENTRY DIV ENTRY MPY ENTRY IRDSW ENTRY CLEAR ENTRY SUBSC /THE FOLLOWING DEFINITIONS ARE TO ENABLE LIBRARY /OPTIMIZATIONS WHERE CRITICAL TIMING CONSIDERATIONS /EXIST. THEY SHOULD BE USED WITH EXTREME CAUTION, /AND MUST REFERENCE CURRENT PAGE AND PAGE ZERO SYMBOLS /ONLY. OPDEF TADI 1400 OPDEF DCAI 3400 OPDEF JMSI 4400 OPDEF JMPI 5400 LAP /LV AUTO PAGING FOR PAL-III LIKE CODE AC, 0 /LOCATIONS USED BY MPY & DIV MQ, 0 SIGN, 0 CTR, 0 LOC, 0 SAV, 0 MPY, BLOCK 1 5 /INTEGER MULTIPLY SUBROUTINE DCA MQ / CALL 1,MPY TAD MPY / ARG <NUMBER> DCA MPY1 MPY1, NOP /REPLACED BY CDF TADI MPY# INC MPY# DCA MPY2 TADI MPY# INC MPY# DCA DIV MPY2, NOP /REPLACED BY CDF TADI DIV JMS MPYSB RETRN MPY MPYSB, 0 /INTERNAL MULTIPLICATION SUBR DCA DIV TAD (-14 DCA CTR BACK, CLL RAL DCA AC TAD MQ CLL RAL DCA MQ SZL TAD DIV TAD AC ISZ CTR JMP BACK JMPI MPYSB / CPAGE 4 DIVZA, DIVZ DVERR, 4411 /"DIVZ" ERROR 2632 DIV, BLOCK 1 5 /INTEGER DIVIDE SUBROUTINE SMA / CALL 1,DIV JMP AD1 / ARG <DIVISOR> INC SIGN CIA AD1, DCA MQ DCA CTR TAD DIV DCA DIV1 DIV1, NOP /REPLACED BY CDF TADI DIV# INC DIV# DCA DIV2 TADI DIV# INC DIV# DCA MPY DIV2, NOP TADI MPY SNA JMPI DIVZA /ATTEMPTING TO DIVIDE BY ZERO SMA JMP LOOP1 INC SIGN CIA LOOP1, CLL RAL INC CTR SMA JMP LOOP1 CLL RAR DCA LOC TAD LOC CIA DCA MPY TAD CTR CMA DCA CTR TAD CTR DCA SAV DCA AC TAD MQ LOOP2, TAD MPY LOOP3, ISZ CTR SKP JMP DONE STL SPA CLL DCA MQ TAD AC RAL DCA AC TAD MQ CLL RAL SNL JMP LOOP2 TAD LOC JMP LOOP3 DONE, CLA TAD SIGN RAR CLA DCA SIGN TAD AC SZL CIA RETRN DIV IREM, BLOCK 1 5 /INTEGER REMAINDER SUBROUTINE CLA / CALL 1,IREM INC IREM# / ARG <UNUSED VARIABLE> INC IREM# INC SAV /IREM MUST HAVE AN ARGUMENT TAD MQ /BECAUSE IT IS A FUNCTION. SPA /IREM CAN BE CALLED ONLY ONCE TAD LOC /AFTER EACH DIVISION ... SKP /SUBSEQUENT CALLS WILL RETURN ZERO. LOP, CLL RAR ISZ SAV JMP LOP RETRN IREM / PAGE IABS, BLOCK 1 5 /INTEGER ABS VALUE FUNCTION TAD IABS / CALL 1,IABS DCA IAB1 / ARG <INTEGER VARIABLE> IAB1, NOP TADI IABS# INC IABS# DCA IAB2 TADI IABS# INC IABS# DCA IRDSW IAB2, NOP /CDF TO ARGUMENT FIELD TADI IRDSW SPA CIA RETRN IABS IRDSW, BLOCK 1 5 /READ SWITCH REGISTER FUNCTION CLA OSR INC IRDSW# INC IRDSW# RETRN IRDSW DIVZ, CALL 1,ERROR /ZERO DIVIDE ERROR ARG DVERR CLA CLL CMA RAR RETRN DIV /THE FLOATING POINT CLEAR ROUTINE WAS ADDED TO "INTEGR" /SO THAT PROGRAMS WHICH DO NOT USE FLOATING POINT MATH /CAN RUN WITHOUT LOADING THE F.P. MATH PACKAGE. CLEAR, BLOCK 1 5 /FLOATING POINT CLEAR FUNCTION DCA IRDSW DCA ACH DCA ACM DCA ACL TAD IRDSW RETRN CLEAR / THE FOLLOWING CAN BE USED FOR DOUBLY OR SINGLY / SUBSCRIPTED ARRAYS. ON ENTRY THE AC SHOULD BE / NEGATIVE FOR FLOATING POINT VARIABLES. THIS MAY / BE ANY NEGATIVE NUMBER FOR SINGLY SUBSCRIPTED / VARIABLES, AND MUST BE THE FIRST DIMENSION FOR / DOUBLY SUBSCRIPTED VARIABLES. SOME EXAMPLES / FOLLOW: (TO LOAD THE I,JTH ELEMENT OF AN FP ARRAY) / TAD (-M /DIMENSIONS ARE M BY N / CALL 3,SUBSC / ARG J / ARG I / ARG ARRAY / LOC /MUST BE A DUMMY VARIABLE / CALL 1,IFAD / ARG LOC / TO LOAD THE JTH ELEMENT OF AN INTEGER ARRAY: / CALL 2,SUBSC / ARG J / ARG INTARR / LOC /STILL A DUMMY VARIABLE / TAD I LOC S1, BLOCK 1 /ADDR OF 1ST SUBSC S2, BLOCK 1 /ADDR OF 2ND SUBSC A, BLOCK 2 /ADDR OF ARRAY R, BLOCK 1 /ADDR FOR RESULT TM, 0 FL, 0 /DOUBLE SUBSC FLAG N, 0 /DIMENSION -- NEGATIVE IF FLOATING MQA, MQ /FOR INDIRECT DCA SUBSC, BLOCK 1 5 /FORTRAN SUBSCRIPTING ROUTINE DCA N /SAVE THE DIMENSION TAD N SPA /... ALSO ABS VALUE CMA DCAI MQA /WARNING **THIS ASSUMES DF=CURR FIELD** CLA CLL CMA RAL /HOW MANY ARGS? TAD SUBSC# DCA 10 TAD SUBSC DCA SUB1 SUB1, NOP /REPLACED BY CDF TADI 10 AND (100 SNA CLA /DOUBLE SUBSCRIPTS? JMP SB0 TADI 10 /YES, PICK UP ARGS... DCA SB2 TADI 10 DCA S2 CMA SB0, DCA FL /SET DBL SUBSC FLAG TADI 10 DCA SB1 TADI 10 DCA S1 TADI 10 DCA A TADI 10 DCA A# TAD SUBSC DCA SUB2 TADI 10 DCA R TAD 10 IAC DCA SUBSC# ISZ FL /DBL SUBSCRIPTING? JMP SB1 CLA CMA /GET THE 2ND SUBSC SB2, NOP /CDF TO FIELD OF 2ND SUBSCRIPT TADI S2 SZA /IS IT A 1? JMSI MPYSBA /NO, MULTIPLY BY DIMENSION SB1, NOP /CDF TO FIELD OF 1ST SUBSCRIPT TADI S1 TAD (-1 /MINUS ONE DCA TM SUB2, NOP /REPLACED BY CDF TAD A DCAI R INC R TAD N SPA CLA /FIXED OR FLOATING TAD TM CLL RAL TAD TM TAD A# DCAI R STL CLA RTL /FAST 'RETRN SUBSC' TAD SUBSC DCA SUB3 SUB3, NOP /REPLACED BY 'CDF CIF' JMPI SUBSC# MPYSBA, MPYSB END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 | /IOH SUBROUTINE OS8 FORTRAN II LIBRARY / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / VERSION 10A / APRIL 28,1977 / INPUT OUTPUT CONVERSION SUBROUTINE / FOR 8K ALICS-FORTRAN SYSTEM / VERSION NUMBER IS AVAILABLE AT ENTRY POINTS / ABSYM SACH 23 /SAVE FPAC FOR MANIPULATION OF AC ABSYM SACM 24 ABSYM SACL 25 ABSYM N2 175 /LAST ACCUMULATED NUMBER ABSYM ARGUMT 176 DUMMY ARGUMT DUMMY FPNT ENTRY READ ENTRY WRITE ENTRY IOH / / THE FOLLOWING IS NECESSARY BECAUSE CERTAIN SUBROUTINES SKIP / OPDEF TADI 1400 OPDEF DCAI 3400 OPDEF ANDI 0400 OPDEF JMPI 5400 OPDEF JMSI 4400 OPDEF ISZI 2400 SKPDF JMSKP 4000 LAP / A2, BLOCK 14 / / IOH ERROR ROUTINES / ERRNO, BLOCK 1 ERR2, ISZ WHI /SEE IF THIS WAS I FORMAT OR THE EXPONENT ERR3, ISZ ERRNO /IN E FORMAT ISZ ERRNO SKP ERR1, ISZ DV /ERR1 IS ALWAYS FATAL CLA TAD DV SNA CLA /WAS THIS AN INPUT ERROR FROM THE TELETYPE? CLA CLL CML RAR /YES - NON-FATAL TAD (615 DCA IO TAD ERRNO /IOH ERROR NUMBER TAD (2461 /MAKE INTO BCD DCA SW /TO ERROR COMMENT CALL 1,ERROR ARG IO JMP RETRY /DO ENTIRE READ STATEMENT OVER DV, 0 /SAVE DEVICE CODE CS, A2 /INITIAL PUSH POINTER PARN, 0 NOP /CDF N TADI WRITE# INC WRITE# JMP I PARN CH, 0 TW, 12 READ, BLOCK 1 10 /ENTRY POINT FOR READ RETRY, TAD READ /SNEAK IN DCA WRITE TAD READ# DCA WRITE# /SAVE SECOND RETURN WORD JMP ET CPAGE 4 IO, 0 SW, 0 /LEFT OR RIGHT HALF OF FORMAT WRITE, BLOCK 1 10 /ENTRY POINT CLA IAC /INITIALIZE SWITCH ET, DCA IO DCA CH /CLEAR CHARACTER DCA ERRNO /ZERO ERROR NUMBER IN CASE ERROR RESTART TAD WRITE DCA PARN# JMS PARN DCA DEVNO1 JMS PARN DCA 7 DEVNO1, NOP /CDF N CLA CMA TADI 7 /PICK UP DEVICE NUMBER CLL RTR /ROTATE IT INTO BITS 0-3 RTR RAR DCA DV TAD CS /INITIALIZE PUSH STACK DCA PUSH /- JMS PARN DCA FPNT01 JMS PARN DCA FPNT CLA IAC /SET UP "SW" TO START FORMAT DCA SW /FROM SECOND CHARACTER (FIRST IS LPAREN) DCA BA /ZAP END-OF-LINE SWITCH TAD PENTER /FAKE RE-ENTRY TO SET UP FIRST LPAREN DCA GLST /ON PUSHDOWN STACK RETRN WRITE PENTER, FENTER FPNT, 0 GFRM, 0 TAD SW INC SW CLL RAR TAD FPNT /FORM ADDRESS IN AC AND LEFT/RIGHT DCA 7 /SWITCH IN LINK FPNT01, NOP /CDF N TADI 7 SZL /LEFT OR RIGHT? JMP HR RTR RTR RTR HR, AND (77 JMP I GFRM CPAGE 5 0 /I1000 0 /I100 0 /I10 I1, 0 /I1 4000 SV, BLOCK 3 /FLOATING POINT TEMPORARY CPAGE 3 TN, 2045 /10.0 0 0 PAGE /EXPERIMENTAL RETN, DCA SACH /SET SACH TO 0 RTUR, JMS GFRM /GET NEXT CHAR IN FORMAT CPAGE 24 JMS CHTYPE /CLASSIFY FORMAT CHARACTER DG /DIGIT EXIT -57; SL -56; PER -54; CM -51; RPAR -50; LP -47; QT -40; RTUR 0; SVCHR SVCHR, DCA CH JMS NU /GET THE ACCUMULATED NUMBER CMA /KRONK IT DCA N1 /AND SAVE COUNT FOR ALL CONVERSIONS TAD CH AND (7757 TAD (7770 /THIS TESTS IF CH IS AN ,X, OR ,H, SNA CLA CM, JMS PR /IT WAS , PROCESS IT JMP RETN /NOT X OR H, KILL NUMBER AND TRY AGAIN N1, 0 SL, JMS PR /GO PROCESS THE PREVIOUS ITEM (IF ANY) JMS EJ JMP RETN QT, JMS PR /PROCESS PREVIOUS ITEM, IF ANY QT1, JMS GFRM TAD (-47 SNA /ANOTHER QUOTE? JMP RETN TAD (47 JMS PRINT /PRINT CHAR JMP QT1 DG, JMS DGT /ACCUMULATE DIGIT INTO SACH JMP RTUR /TRY ANOTHER CHARACTER LP, ISZ PUSH /LEFT PAREN CLA CMA /COUNT NESTING DEPTH, NEGATIVE TAD NPAR DCA NPAR TAD SW /PICK UP THE FORMAT POINTER DCA I PUSH /CRAM IT INTO THE LIST ISZ PUSH /KICK AGAIN JMS NU /THERE MAY BE AN ACCUMULATED NUMBER CIA /SAVE NUMBER DCA I PUSH /* CLA CLL CML RTL /HERE WE SEE IF THIS IS A POSSIBLE TAD NPAR /RESTART POINT SPA CLA /IF FIRST SAVE SW IN S1 JMP RETN /NOPE- FORGET IT TAD SW /YES--FIRST CRAM FORMAT--- DCA S1 /---INTO SAVE1 TAD I PUSH /AND THAT STUFF IN THE LIST--- DCA S2 /---GOES INTO SAVE 2 JMP RETN /READY FOR ANYTHING, HERE WE GO PUSH, 0 /PARENTHESIS PUSHDOWN LIST POINTER RPAR, JMS PR /PROCESS PREVIOUS ITEM, IF ANY ISZ I PUSH JMP TR CLA CLL CMA RAL /-2 TAD PUSH /DELETE THIS ITEM FORM THE LIST DCA PUSH /PUSH = PUSH-2 ISZ NPAR /NPAR = NPAR +1 ]-1[ SINCE MINUS COUNT JMP RETN JMS WH /THIS PAREN WAS THE BALANCING PAREN TAD S1 /GET THE FORMAT POINTER OF THE-- DCA SW /RESTART POINT AND CRAM IT TAD S2 /GET SWITCH AND THE COUNT CIA FENTER, DCA SACH CLA CMA TAD SW /TEST TO SEE IF SW IS ORIGINAL POINTER SNA CLA JMP L2 /YES - FAKE A RESTART ISZ PUSH /NO - PUSH ORIGINAL POINTER CLA IAC /SINCE WE ARE RETURNING TO DEPTH 2 DCA I PUSH ISZ PUSH CLA CMA /SET COUNT = 1, SWITCH = 1 DCA I PUSH CMA L2, DCA NPAR /PARNRN = -1 JMP LP TR, CLA CMA /GET OUT THE FORMAT POINTER-- TAD PUSH /* DCA N3 TAD I N3 DCA SW /HAA-- IT IS NOW RESTORED JMP RETN /AWAY WE GO N3, 0 /W FOR E AND F CONVER PER, JMS NU /GOT A PERIOD, MUST BE OR F TYPE DCA N3 JMP RETN S1, 0 S2, 0 /SAVE THE COUNT AND SWITCH NPAR, 0 PAGE /EXPERIMENTAL EX, JMS GLST /THIS IS E FORMAT CONVERSION EE, JMS NR /CHECK IF INPUT - IF NOT, GET NUMBER INTO [.1,1] TAD C DCA GLST /STORE C AWAY IN A SAFE PLACE DCA C CLA CMA DCA EFLG /SET "E FORMAT FAKEOUT" FLAG TAD (-5 JMP FFAKE /FAKE OUT "F" FORMAT TO PRINT DIGITS PRNTE, TAD (5 /PUT OUT THE E JMS PRINT / NOW PRINT 'C' DIGITS UNDER I3 FORMAT TAD GLST SPA SNA CLA CLA CLL CMA RAL TAD (55 JMS PRINT /PRINT A MINUS OR PLUS TAD GLST SPA CIA CALL 1,DIV ARG TW TAD (60 JMS PRINT /PRINT CPAGE 4 CALL 0,IREM /IREM NEEDS AN ARGUMENT TO IGNORE EFLG, 0 CRX, 0 TAD (60 JMS PRINT /PRINT SECOND DIGIT JMP EX /DONE, DO NEXT FX, CLA JMS GLST /THIS IS F FORMAT CONVERSION FF, JMS NR /CHECK IF INPUT - IF NOT, GET NUMBER INTO [.1,1] DCA EFLG TAD C /C CONTAINS NUMBER OF MULTS TO RANGE NUMBER SMA CLA CMA /0 MULTS NEEDED OR ALREADY THERE FFAKE, TAD N3 /NUM3 IS THE FIELD WIDTH CIA /MINUS SPACE FOR DADP+DP TAD N2 JMS SA /PUT OUT REQUIRED BLANKS + SIGN TAD C SMA JMP PRZRO /NO LEADING DIGIT - PRINT A ZERO FOR LOOKS CIA JMS DT PRDCPT, TAD (56 JMS PRINT TAD C /GET MULTIPLY COUNT SPA SNA JMP PAS2 CMA /THEY WERE MULTIPLIES, 0 TO N OF THEM DCA CRX TAD N2 /DIGITS AFTER DEC POINT, DADP CMA DCA NR JMP PASA /TEST FOR 0 MULTIPLIES RETR, TAD (60 /PUT OUT A ZERO JMS PRINT /ALL MULTIPLIES REPRESENTED PASA, ISZ CRX /NO, TRY RUN OFF FIELD SKP JMP PASS /YES ISZ NR /ALL WIDTH ACCOUNTED FOR% JMP RETR /NO, TRY NEXT POSITION PASS, TAD C /YES, GET MULT COUNT CIA /-MULT COUNT SKP PAS2, CLA TAD N2 /N2-MULT COUNT SMA SZA /IS MULT COUNT .GE. N2? JMS DT /NO - PRINT REMAINING DIGITS ISZ EFLG /WERE WE FAKED OUT BY "E" FORMAT? JMP FX /NO JMP PRNTE /YES - GO PRINT EXPONENT PRZRO, CLA TAD (60 JMS PRINT JMP PRDCPT /GO BACK TO PRINT THE DECIMAL POINT SA, 0 TAD SN SMA /THIS IS -(NUM OF BLANKS) JMP AS3 /POSITIVE, NUMBER TOO BIG FOR FIELD DCA CRX SKP CLA RETC, JMS PRINT /HERE WE PUT OUT THAT MANY BLANKS TAD (40 ISZ CRX JMP RETC /YES CLA TAD SN SNA CLA /IS SIGN MINUS? JMP I SA /EVIDENTLY NOT TAD (55 JMS PRINT /PUT OUT A MINUS SIGN JMP I SA PAGE /EXPERIMENTAL FN, TAD N3 /GET WIDTH, INPUT FOR E OR F FORMAT CMA /1'S COMPLEMENT DCA CR /TO COUNTER DCA D1 /0 TO D1 CALL 0,CLEAR CMA DCA D2 /-1 TO DECIMAL POINT SWITCH CMA /-0 TO SGN FLAG RRTSGN, DCA SN RRT, CLA ISZ CR /INDEX TO SEE IF WIDTH EXCEEDED SKP JMP FP /GET AN INPUT CHARACTER AND TEST IT JMS GCHR CPAGE 20 JMS CHTYPE /CLASSIFY INPUT CHAR FDIGIT /DIGIT -56; PUNT -40; RRT -53; RRT -55; RRTSGN -5; EPRO 0 PERR3, ERR3 FDIGIT, DCA IS CALL 1,FMP ARG TN CALL 1,STO /SAVE FLOATING POINT ACCUMULATOR ARG SV TAD IS CALL 0,FLOT /FLOAT NEW DIGIT CALL 1,FAD ARG SV INC D1 /COUNT OF DIGITS JMP RRT PUNT, ISZ D2 /TST DP SWITCH JMPI PERR3 /***** TWO DECIMAL POINTS ***** DCA D1 JMP RRT EPRO, CLA CMA /AN E FP, DCA IS /-1 TO IS IF E, 0 TO IS IF END OF FIELD ISZ D2 /TEST DP SWITCH JMP FA /ONE HAS OCCURRED TAD N2 /ONE HAS NOT OCCURRED, GET NDP SKP FA, TAD D1 /COUNT OF DIGITS AFTER EXPLICIT DP CMA /-COUNT JMS DH /DIVIDE FPAC BY TEN COUNT TIMES TAD ACH /IF ACH=0,DON'T CHK. SIGN SNA JMP ZR /ZERO-DON'T CHECK ISZ SN /TEST SIGN TAD (4000 /SET SIGN BIT DCA ACH ZR, ISZ IS /DID WE GET AN "E"? JMP VZA /NO - STORE RESULT AND GET OUT JMP VQ /YES - FAKE INTEGER ROUTINE TO ACCEPT EXPONENT D1, 0 D2, 0 IS, 0 CR, 0 PRO2, CMA /GOT EXPONENT - MAKE IT NEGATIVE ISZ SN /WHAT WAS ITS ORIGINAL SIGN? JMP VZB /NEGATIVE - DIVIDE BY 10^EXP DCA D1 /SAVE COUNT JMP VZD VZC, CALL 1,FMP ARG TN VZD, ISZ D1 /INDEX COUNT JMP VZC JMP VZA VZB, JMS DH VZA, CALL 1,ISTO /STORE IN PLACE ARG ARGUMT JMP FX PAGE /EXPERIMENTAL XX, JMS MR /TEST FOR MORE TAD IO /TEST FOR INPUT-OUTPUT SNA CLA JMP XX1 /INPUT, PSEUDO-JUMP TAD (40 /OUTPUT A BLANK JMS PRINT JMP XX /CYCLE XX1, JMS GCHR /IGNORE SPACES ON INPUT CLA JMP XX HH, JMS MR /THE H FIELD PROCESSOR JMS GFRM /SAME AS XXX, BUT PRINT NEXT JMS PRINT /----- FORMAT CHARACTER JMP HH /OUTPUT ONLY PRINT, 0 TAD (-40 SPA TAD (100 /CONVERT 6-BIT TO 8-BIT TAD (240 TAD DV /ADD ON DEVICE NUMBER IN BITS 0-3 CALL 0,GENIO JMP I PRINT WH, 0 JMS EJ /END THE RECORD TAD ARGUMT# SNA CLA /TEST PARAMETER FOR 0 JMS GLST /RETURN TO MAIN PROGRAM ON 0 PAR JMP I WH /MORE AGRUMENTS RETURN EJ, 0 /ROUTINE TO END RECORD TAD IO SZA CLA /INPUT OR OUTPUT? JMP E1 /OUTPUT E2, CLA TAD BA SZA CLA JMP BG /CARRIAGE RETURN SEEN - GOODBYE JMS GCHR /GET A CHARACTER JMP E2 /KEEP LOOKING FOR CR BG, DCA BA JMP I EJ E1, TAD (7715 /7715 TRANSLATES TO 215 JMS PRINT TAD (7712 JMS PRINT /PRINT CR-LF JMP I EJ BA, 0 /THIS IS THE END OF LINE SWITCH BH, ISZ BA /ENTRY TO LOOK FOR AN END OF LINE BL, TAD (40 AND (77 /KEEP THIS - BL IS REFERENCED BY GCHR JMP I GCHR GCHR, 0 /GET AN INPUT STRING CHARACTER JD, CLA TAD BA /GET EOR SWITCH SZA CLA JMP BL /IS EOR, RETURN BLANK CLA CLL CML RTR /****** IF # OF DEVICES IS CHANGED, TAD DV /THIS SHOULD BE CHANGED TOO ***** CALL 0,GENIO /CALL GENIO WITH OFFSET DEVICE NUMBER AND (177 /STRIP PARITY TAD (7763 SNA /CARRIAGE RETURN? JMP BH TAD (7655 CLL TAD (100 /IS CHAR IN RANGE 237<CHAR<340? SNL JMP JD /NO - IGNORE JMP BL /CONVERT TO SIXBIT AND RETURN PAGE /EXPERIMENTAL / GET F.P. NUMBER INTO THE RANGE .1 .LE. N .L. 1.0 NR, 0 JMSKP BB /CHECK DIRECTION OF I/O JMP FN /INPUT CALL 1,IFAD /OUTPUT - LOAD NUMBER INTO FLOATING AC ARG ARGUMT DCA SN /CLEAR THESE LOCS DCA C TAD ACH SNA JMP NREX /NUMBER IS ZERO SMA /IS IT A MINUS F P NUMBER JMP RETM TAD (4000 /YES-- MAKE IT POSITIVE ISZ SN /SET SIGN DCA ACH RETM, CLA /MULTIPLY BY 10 UNTIL NR .GT. (1.0) TAD ACH TAD (5764 SMA CLA JMP TB /GOT IT IT IS .GE.1 CALL 1,FMP ARG TN ISZ C /AND COUNT JMP RETM /GO TRY TO DO IT AGAIN TB, JMS SE /NOTE SE ' XR-1 CALL 1,STO ARG SV TAD (2004 DCA ACH /200400000000=.50000 IN AC TAD CH /TEST FORMAT TAD (7772 SNA CLA /IS IT E FORMAT? TAD C /NO - COUNT # OF MULTS NEEDED CIA TAD N2 /< DADP SMA CMA /NUMBER OF THIMES TO DIVIDE .5 BY 10 TO RND JMS DH /DO THE DIVIDES CALL 1,FAD ARG SV JMS SE /REDUCE TO NORMAL RANGE AGAIN GD, TAD ACH RAL SPA CLA JMP ZP /NUMBER IS ? 1/2 TAD ACH CLL RAR /WE ARE GETTING EXP TO 200 DCA ACH TAD ACM RAR DCA ACM TAD ACL RAR DCA ACL TAD ACH AND (7774 TAD ACH TAD (10 DCA ACH JMP GD ZP, TAD ACH AND (7 DCA ACH NREX, JMP I NR SN, 0 C, 0 /COUNTER FOR DEC. EXP. SE, 0 /DIVIDE BY 10 UNTIL N < 1.0 XR, TAD ACH /TEST NUMBER FOR .GE. 1 TAD (5764 SPA CLA JMP I SE /NUMBER IS IN RANGE, RETURN CLA CLL CMA RAL JMS DH CLA CMA /REDUCE COUNT TAD C DCA C JMP XR PAGE /EXPERIMENTAL GLST, 0 /GET NEXT ARGUMENT ROUTINE CALL 0,CLEAR /CLEAR FLOATING AC ISZ IOHCNT /ARE WE IN AN ARRAY I/O LOOP? JMP ARMORE /YES - GET NEXT ELEMENT INC IOH# RETRN IOH /RETURN TO USERS PROGRAM FOR MORE DATA ARMORE, TAD ARGUMT# TAD IOHINC /BUMP ARGUMENT POINTER BY ELEMENT LENGTH JMP IOHBAK /RESUME I/O CONVERSIONS WITH UPDATED ARGUMT CPAGE 33 IOH, BLOCK 1 10 SZA CLA /IS THIS A SCALAR OR AN ARRAY CALL? JMP IOHAR /AN ARRAY CALL CLA CMA IOGTAR, DCA IOHCNT /SET UP ARGUMENT COUNT FOR THIS CALL TAD IOH DCA IOH1 IOH1, NOP /SET DATA FIELD TO ARGUMENT LIST TADI IOH# DCA ARGUMT INC IOH# TADI IOH# IOHBAK, DCA ARGUMT# JMP I GLST /RETURN TO I/O CONVERSION IOHAR, INC IOH# CLA CLL CML RAR AND I IOH /GET TYPE OF ARRAY CLL RTL CML RAL /FORM A 1 OR A 3, DEPENDING ON ARRAY TYPE DCA IOHINC CLA CLL CMA RAR ANDI 7 /GET THE ELEMENT COUNT CIA INC IOH# JMP IOGTAR /SAVE IT AND GET ARRAY POINTER IOHINC, 0 IOHCNT, 0 CHTYPE, 0 /SUBROUTINE TO CLASSIFY CHARACTERS DCA CHCH TAD CHCH TAD (7706 CLL TAD (12 SZL /IS THE CHARACTER NUMERIC? JMP JMPOUT /YES - TAKE FIRST EXIT INC CHTYPE CHLOOP, CLA TAD I CHTYPE INC CHTYPE SNA /CHARACTER LIST EXHAUSTED? JMP JMPOTX /YES - TAKE LAST EXIT WITH CHAR IN AC TAD CHCH SNA CLA /MATCH? JMP JMPOUT /YES - TAKE EXIT WITH AC=0 INC CHTYPE JMP CHLOOP /NO MATCH - GO ON TO NEXT CHAR JMPOUT, DCA CHCH JMPOTX, TAD I CHTYPE DCA CHTYPE TAD CHCH JMP I CHTYPE CHCH, 0 DT, 0 CIA DCA CHCH /STORE COUNT RETT, JMS LS /LEFT SHIFT 1 TAD ACL /SAVE THE FPAC DCA SACL TAD ACM DCA SACM TAD ACH AND (17 DCA SACH TAD SACH DCA ACH /TRIM AC TO 28 BITS JMS LS /LEFT SHIFT 2 JMS LS TAD ACL /ADD THE DSAVE TO THE ACC TAD SACL DCA ACL RAL /* TAD ACM TAD SACM DCA ACM RAL /* TAD ACH TAD SACH DCA ACH TAD ACH CLL RAR /ROTATE 3 RIGHT RTR AND (17 TAD (60 /MAKE DIGIT JMS PRINT /DUMP IT AND SEE IF ANY MORE ISZ CHCH /LOOP ON COUNT JMP RETT /* JMP I DT LS, 0 /LEFT SHIFT THE FPAC 1 TAD ACL CLL RAL DCA ACL TAD ACM RAL DCA ACM TAD ACH RAL DCA ACH JMP I LS /DONE PAGE /EXPERIMENTAL PR, 0 TAD SACH /GET THE LAST NUMBER ACCUMULATED DCA N2 /SAVE IT PR2, TAD CH SNA JMP I PR /NOTHING TO DO CPAGE 22 JMS CHTYPE /CLASSIFY CH ERR1 /DIGIT IS ILLEGAL -30;XX -11;II -10;HH -6;FF -5;EE -1;AA 0;ERR1 MR, 0 /MORE? ISZ N1 /SEE IF IT GOES TO ZERO JMP I MR DCA CH /NO MORE FIELDS, FIRST WIPE CHAR JMP I PR /GO BACK TO FORMAT SCANNER NU, 0 /ROUTINE TO FETCH THE ACCUM NUMB TAD SACH SNA /IF IT IS ZERO, SET IT TO 1 CLA IAC /IT IS AND WE DO JMP I NU /GO HOME BB, 0 JMS MR /MORE? TAD ARGUMT# SNA CLA /IF ARG=0, JMS WH /END RECORD AND RETURN TO USERS PROGRAM TAD IO /TEST IN OUT SWITCH SZA CLA /OUTPUT INC BB /INPUT JMP I BB AX, JMS GLST AA, TAD N2 CIA DCA CX JMSKP BB JMP AR AS, JMS GADR /GET CHARACTER ADDRESS TADI 7 SZL JMP ASNORT RTR RTR RTR ASNORT, AND (77 /MASK 6 BITS JMS PRINT ISZ CX JMP AS /LOOP FOR CHARACTER COUNT JMP AX /GET NEXT ARGUMENT(IF ANY) AR, JMS GCHR DCA DH /GET AND SAVE INPUT CHAR JMS GADR /GET CHARACTER POINTER TAD DH SZL /WHICH HALF? JMP ARNORT /RIGHT HALF IAC RTL RTL RTL SKP ARNORT, TADI 7 TAD (7740 /CANCEL BLANK CHAR ARCOMN, DCAI 7 ISZ CX JMP AR JMP AX GADR, 0 /SUBR TO COMPUTE CHARACTER ADDR FOR "A" FMT TAD ARGUMT DCA AS1 TAD N2 TAD CX CLL RAR TAD ARGUMT# /AC=WORD POINTER, LINK=LEFT/RIGHT FLAG DCA 7 AS1, NOP /SET UP DATA FIELD OF ARGUMENT JMPI GADR CX, 0 DH, 0 DCA CX /DIVIDE FPAC BY TEN CX TIMES JMP DTA DTB, CALL 1,FDV ARG TN DTA, ISZ CX JMP DTB JMP I DH AS3, CLA /PRINT ASTERISKS FOR WHOLE FIELD SIZE TAD N3 /GET FIELD SIZE, E OR F CMA DCA CX /-COUNT JMP QQ QQA, TAD (52 /PRINT CX ASTERISKS JMS PRINT QQ, ISZ CX /INDEX COUNT JMP QQA JMS GLST /TEST FOR MORE JMP PR2 /RETURN TO FORMAT PROCESSOR, SAME TYPE PAGE /EXPERIMENTAL IN, TAD N2 /INTEGER INPUT, GET WIDTH OF FIELD CMA /1,S COMP TO COUNTER, CR DCA CR CMA VQ, DCA WHI /-1 TO NUMBER ACCUMULATED CMA /-1 TO SIGN RRSIGN, DCA SN DCA SACH RRS, ISZ CR /HAS WHOLE NUMBER BEEN ACCUMULATED SKP JMP PRO JMS GCHR CPAGE 14 JMS CHTYPE /CLASSIFY CHARACTER DIGIT /ITS A DIGIT -40; RRS -53; RRS -55; RRSIGN 0; ERR2 DIGIT, JMS DGT /ACCUMULATE DIGIT INTO SACH JMP RRS /GET NEXT DIGIT PRO, TAD SACH /WE HAVE AN INTEGER ... ISZ WHI /WHAT KIND? JMP PRO2 ISZ SN / 'I' FORMAT CIA DCA I ARGUMT IX, CLA JMS GLST /INTEGER CONVERSION II, JMSKP BB /TEST MORE AND NON ZERO CURRENT LIST ITEM JMP IN /INPUT TAD AB DCA SACL /OUTPUT TAD (-4 DCA WHI /-4 DCA SN /0 TAD I ARGUMT SMA /SET SN 0 FOR PLUS, 1 FOR MINUS JMP XZ /PLACE MAGNITUDE IN 20 CIA ISZ SN XZ, CALL 1,DIV ARG TW DCA SACH CPAGE 4 CALL 0,IREM /IREM NEEDS AN ARGUMENT TO IGNORE AB, I1 WHI, 0 DCA I SACL /SAVE REMAINDER CMA TAD SACL /SACL=SACL-1 DCA SACL ISZ WHI /INDEX COUNT TAD SACH /AND CHECK NUM FOR 0 SZA JMP XZ /CYCLE IB, TAD N2 DCA N3 /IN CASE OF OVERFLOW TAD N2 CMA TAD WHI TAD (4 /COMPUTE NUMBER OF LEADING BLANKS JMS SA /PRINT LEADING BLANKS AND SIGN ID, INC SACL /POINT TO DIGIT TO PRINT NEXT TAD I SACL /GET IT SPA /TERMINATOR? JMP IX /YUP TAD (60 JMS PRINT /NOPE - PRINT THE DIGIT JMP ID /GET NEXT DGT, 0 DCA SACM TAD SACH CLL RTL TAD SACH RAL TAD SACM DCA SACH JMP I DGT END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | /IOPEN SUBROUTINE OS8 FORTRAN II LIBRARY / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / VERSION 21A / VERSION NUMBER IS AVAILABLE AT ENTRY POINTS / SUBROUTINES TO MANIPULATE OS/8 FILES / ENTRY IOPEN /OPEN AN INPUT FILE ENTRY OOPEN /OPEN AN OUTPUT FILE ENTRY OCLOS /CLOSE AN OUTPUT FILE ENTRY CHAIN /CHAIN TO A PROGRAM OPDEF TADI 1400 OPDEF ISZI 2400 OPDEF DCAI 3400 OPDEF JMPI 5400 LAP /LEAVE AUTOMATIC PAGING - WE NEED THE 2 LOCATIONS IOER, 1117;0522 /"IOER" ERROR MESSAGE IOPEN, BLOCK 1 21 TAD ASDVM1 JMS SETUP /PUT 2 WORDS OF FIRST ARGUMENT INTO "ASDEV" TADI INHNDL /DATA FIELD IS 0 HERE - GET INPUT HANDLER PAGE SNA JMP IOERR /NO /I GIVEN - ERROR DCAI 10 /STORE IN "ASPAGE" JMS GFILNM /MOVE FILE NAME INTO LOCS 00000-00003 TAD FLUKUP /LOAD POINTER TO "FLUKUP" IN RUN-TIME ROUTINES CALASN, 6202 /CIF 0 JMS I FASIGN /SET DF=CURRENT AND GO LOOKUP FILE RETRN IOPEN /** FASIGN SKIPS BUT SECOND WORD IS SMALL ** IOERR, CALL 1,ERROR /I-O ERROR - GIVE MESSAGE AND QUIT ARG IOER OOPEN, BLOCK 1 21 JMS OOCOMN TAD FENTER JMP CALASN /SEE "IOPEN" FOR COMMENTS OOCOMN, 0 /COMMON SUBR BETWEEN "OOPEN" AND "OCLOS" TAD OOPEN DCA IOPEN TAD OOPEN# DCA IOPEN# /MOVE CALLING ADDRESS TO IOPEN TAD ASDVM1 JMS SETUP /SET UP DEVICE NAME IN FIELD 0 TADI OUHNDL SNA JMP IOERR /NO /O GIVEN - ERROR DCAI 10 /STORE IN "ASPAGE" JMS GFILNM /PUT FILE NAME INTO 00000-3 JMPI OOCOMN OCLOS, BLOCK 1 21 JMS OOCOMN /SET UP DEVICE AND FILE NAME TAD OCLOS DCA IOPEN TAD OCLOS# DCA IOPEN# /SET UP IOPEN FOR RETURN TAD CHAIN /=7177 DCA OOCOMN OCLOOP, TAD CHAIN# /=1632 =^Z ON DEVICE 4 OUTPUT CALL 0,GENIO ISZ OOCOMN JMP OCLOOP /FORCE OUT THE LAST BUFFER TAD FCLOSE JMP CALASN /DO WORK AND LEAVE SETUP, 0 DCA 10 TAD IOPEN DCA SETDF SETDF, 0 /SET CALLING DATA FIELD TADI IOPEN# DCA GETWD# /SAVE FIELD OF ARGUMENT INC IOPEN# TADI IOPEN# DCA SETDF /SAVE ADDRESS OF ARGUMENT INC IOPEN# JMS GETWD /TRANSFER TWO WORDS FROM THE JMS GETWD /ARGUMENT LIST TO WHERE XR 10 POINTS JMPI SETUP /RETURN WITH DATA FIELD =0 GETWD, 0 NOP /SET ARGUMENT FIELD TADI SETDF INC SETDF 6201 /CDF 00 DCAI 10 JMPI GETWD /DO NOT RESTORE DATA FIELD GFILNM, 0 CLA CMA JMS SETUP /MOVE TWO WORDS TO 00000 AND 00001 JMS GETWD /MOVE THE THIRD WORD TAD DA DCAI 10 /SUPPLY AN EXTENSION JMPI GFILNM DA, 0401 /.DA EXTENSION INHNDL, 74 OUHNDL, 75 FASIGN, 541 /***************** ASDVM1, 552 / CAUTION! FLUKUP, 567 /ALL THESE LOCATIONS ARE VERY VOLATILE!! FENTER, 741 /WATCH OUT IF YOU REASSEMBLE THE LOADER! FCLOSE, 757 /***************** CHAIN, 7177 /USE "CHAIN" TO STORE CONSTANTS 1632 /SINCE IT IS ONLY CALLED TERMINALLY TAD CHAIN DCA IOPEN CALL 0,CKIO /WAIT FOR DEVICE TAD CHAIN# DCA IOPEN# JMS GFILNM /GET FILE NAME INTO 00000-00003 ISZI INHNDL /FORCE INHNDL NONZERO SO IOPEN WONT FAIL TAD SV /CHANGE ASSUMED EXTENSION DCA DA /FROM .DA TO .SV TAD (0310 DCA IOER /IF IOPEN FAILS GIVE "CHER" MESSAGE CALOPN, CALL 1,IOPEN ARG SYS /CHAIN WORKS FROM THE SYSTEMS DEVICE ONLY 6201 0 /"ARG 0" POINTING TO 00000! TAD (6 6201 /SET DF TO 0 DCAI K2 /MODIFY "LOOKUP" INTO "CHAIN" DCAI ZRONAM /ALSO KILL LOC WHICH ZEROS FILE NAME PTR JMP CALOPN /GO BACK - THIS TIME IOPEN WILL CHAIN. SYS, 2303 /***** 2303+2326 =4631 = "SYS"! WATCH IT! SV, 2326 K2, 571 /**** SUPER VOLATILE LOCATION **** ZRONAM, 557 /**** DITTO **** END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | /INTEGER POWERS OF NUMBERS ...INTEGER AND FLOATING POINT / /OS8 FORTRAN II LIBRARY / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / VERSION 2A / VERSION NUMBER IS AVAILABLE AT ENTRY POINTS ENTRY IIPOW ENTRY FIPOW OPDEF TADI 1400 LAP FIPOW, BLOCK 1 2 TAD FIPOW DCA IIPOW TAD FIPOW# DCA IIPOW# CALL 1,STO ARG X /SAVE BASE JMP FIFI X, BLOCK 3 RSLT, BLOCK 3 N, 0 FISW, 0 IIPOW, BLOCK 1 2 DCA X /SAVE BASE IAC FIFI, DCA FISW TAD IIPOW DCA II II, NOP TADI IIPOW# DCA NCDF INC IIPOW# TADI IIPOW# DCA N INC IIPOW# NCDF, NOP /GET FIELD OF EXPONENT TADI N /GET EXPONENT CLL SPA CIA CML DCA N /SAVE ABS VALUE TAD X /********* THE FOLLOWING CODE MAY BE REPLACED BY JUST "SNA CLA" /********* IF THE RULES ARE THAT 0**ANYTHING=0 FOR FLOATING /********* POINT TOO. (REMEMBER 0**0 AND 0**-1!) SNA CLA TAD FISW SZA CLA /********* JMP IPRTRN /BASE=0 MEANS RESULT=0 TAD FISW SZA JMP DCARSL ACHONE, TAD (2014 DCA ACH /INITIALIZE FPAC TO 1.0 DCARSL, DCA RSLT /INITIALIZE RSLT TO FISW SNL /THE LINK SHOULD CONTAIN THE EXPONENT SIGN JMP BACK /POSITIVE - ALLS WELL TAD FISW SZA CLA JMP IPRTRN /I**-N = 0 CALL 1,FDV ARG X /THERE'S A 1.0 IN THE AC, REMEMBER? CALL 1,STO ARG X CLL /FAKE A POSITIVE SIGN JMP ACHONE /GO BACK AND RESTORE FPAC TO 1.0 BACK, TAD N /USE STANDARD POWER-OF-2 ALGORITHM FOR POWERS SNA JMP DONE CLL RAR DCA N SNL JMP LOOP TAD RSLT SNA JMP FPMULT /RSLT=0 MEANS FLOATING POINT CALL 1,MPY ARG X STRSLT, DCA RSLT LOOP, TAD N SNA CLA JMP DONE TAD FISW SNA CLA JMP FPSQR TAD X CALL 1,MPY ARG X DCA X JMP BACK FPMULT, CALL 1,FMP /DO THE SAME STUFF IN FLOATING POINT ARG X /THAT WE DID ABOVE IN INTEGERS JMP STRSLT FPSQR, CALL 1,STO ARG RSLT /SAVE FLTG AC CALL 1,FAD ARG X CALL 1,FMP ARG X CALL 1,STO ARG X /SQUARE X CALL 1,FAD ARG RSLT DCA RSLT /KEEP RSLT ZERO! JMP BACK DONE, TAD RSLT IPRTRN, RETRN IIPOW END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 | /POWERS SUBROUTINE OS8 FORTRAN II LIBRARY / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / / VERSION 5A / VERSION NUMBER IS AVAILABLE AT ENTRY POINTS ENTRY IFPOW / INTEGER TO FLOATING POWER ENTRY FFPOW / FLOATING TO FLOATING POWER ENTRY EXP / E TO A POWER ENTRY ALOG / NATURAL LOGARITHM / / DUMMY LXP OPDEF JMSKP 4000 / / INTERNAL SUBROUTINE POL / / COMPUTES N TERMS OF POLYNOMIAL (NO CONSTANT TERM) / N IN AC ... X IN FLOATING AC / COEFFICIENTS START IN LOCATION WHOSE ADDRESS FOLLOWS JMS TO POL / POL2, BLOCK 1 POL, BLOCK 1 CIA DCA POL2 CALL 1,STO ARG X TAD I POL INC POL / DCA ARG1# /THIS CODE PROBABLY EXTRANEOUS / SKP ARG2, DCA ARG1# CALL 1,FAD ARG1, ARG EXS / ADDRESS STORED HERE CALL 1,FMP ARG X ISZ POL2 JMP POL1 JMP I POL POL1, TAD ARG1# TAD (3 JMP ARG2 CPAGE 17 / CANT BREAK UP THIS TABLE EXS, 1464 /7.9608942E-9 CONSTANTS FOR EXP 2142 1421 1545 /6.3578287E-7 2525 2525 1625 /4.0690103E-5 2525 2525 1704 /1.9531250E-3 0000 0000 1754 /6.25E-2 0000 0000 CPAGE 3 ONE, 2014 0000 0000 CPAGE 30 COF, 5716 /-6.4535442E-3 CONSTANTS FOR LOGS 4674 1006 1744 /3.6088494E-2 4750 6073 5756 /-9.5329390E-2 0636 0162 1765 /1.6765407E-1 2726 6023 5767 /-2.4073380E-1 5501 3543 1775 /3.3179902E-1 2360 6176 5777 /-4.9987412E-1 7767 6001 2007 /9.9999643E-1 7777 7041 CPAGE 3 ER16, 2014 /1.0644944 2040 5326 CPAGE 3 LN2, 1755 /8.6643397E-2 4271 0300 X, BLOCK 3 Y, BLOCK 3 / / ALOG - NATURAL LOGARITHM / / ALOG(X)=N*ALOG(2)+ALOG(M) WHERE 1/2 OR EQUAL TO M / ALOG(M)=ALTERNATING SERIES (K**I)/I WHERE K=2M-1 AND M AS ABOVE / CPAGE 4 LGER, 0114 / "ALOG" ERROR AT LOC XXXXX 1707 ALOG, BLOCK 1 5 / ENTRY POINT TAD ALOG DCA TEM TAD ALOG# DCA TEM# CALL 1,IFAD TEM, ARG 0 INC ALOG# INC ALOG# TAD ACH / GET EXPONENT SPA SNA JMP LGERR /LOG OF X<=0 - ERROR AND (3770 TAD (5770 / -2000 DCA TEM / N INTO TEM TAD ACH / GET M WITHOUT SIGN AND (7 TAD (2010 / 2M DCA ACH CALL 1,FSB / 2M-1 ARG ONE TAD (D8 / 8 TERMS OF SERIES JMS POL COF CALL 1,STO / ALOG(M) INTO Y ARG Y TAD TEM / GET N CALL 0,FLOT / FLOAT IT CALL 1,FMP / N *ALOG(2) ARG LN2 CALL 1,FAD / N *ALOG(2) ALOG(M)(ALOG(X) ARG Y RETRN ALOG / EXIT LGERR, CALL 1,ERROR ARG LGER / / EXP - E TO A POWER / / E**X=SERIES (X**I)/(I!) / IF B=E**(1/16) AND X IS BETWEEN -1 AND 1 THEN / B**X=1 SUMA(I)*(X**I) FOR I FROM I=1 TO I=5 / WHERE A(I)(1/((I!)*16**2)) / CPAGE 4 EXPER, 4530 2040 EXP, BLOCK 1 5 / ENTRY POINT TAD EXP DCA XT TAD EXP# DCA XT# INC EXP# INC EXP# CALL 1,IFAD XT, ARG 0 CLA CLL CMA RAR AND ACH TAD (-2075 SMA CLA TAD ACM CLL TAD (-4271 /TEST FOR FLTG. AC <88.2 SZL CLA JMP EXPERR TAD ACH SZA TAD (40 / X*16 DCA ACH CALL 1,STO / Y=16X ARG Y CALL 1,FAD / EXPRESS Y AS INTEGER N AND FRACTION F ARG Y CALL 0,FIX / GET N SMA IAC DCA ALOG / ALOG=N TAD ALOG / GET F CIA CALL 0,FLOT CALL 1,FAD ARG Y TAD (5 / 5 TERMS OF SERIES JMS POL EXS CALL 1,FAD / PLUS 1 ARG ONE CALL 1,STO / GIVES B**F ARG Y CALL 1,FAD / GET B ARG ER16 CALL 1,FIPOW ARG ALOG CALL 1,FMP / B**(N+F)=(B**16X)(E**X) ARG Y RETRN EXP / EXIT EXPERR, CALL 1,ERROR ARG EXPER TAD ACH SMA CLA CLL CMA RAR DCA ACH DCA ACM DCA ACL RETRN EXP / / IFPOW - INTEGER TO FLOATING POWER / / JUST FLOAT BASE AND GO TO FFPOW / IFPOW, BLOCK 1 5 / ENTRY POINT CALL 0,FLOT TAD IFPOW / FROM BANK DCA FFPOW / TO PROPER LOCATION TAD IFPOW# // FROM ADDRESS DCA FFPOW# /TO PROPER LOC JMP ML / SNEAK INTO ROUTINE / / FFPOW- FLOATING TO FLOATING POWER / / IDENTITY USED ... X**Y=EXP(Y*ALOG(X)) / CPAGE 4 FFPER, 4614 2027 FFPOW, BLOCK 1 5 / ENTRY POINT ML, TAD I FFPOW / GET CDF TO EXPONENT DCA LXP INC FFPOW# / INCREMENT TO EXPONENT ADDRESS TAD I FFPOW / GET EXPONENT ADDRESS DCA LXP# INC FFPOW# / INCREMENT FOR EXIT TAD I LXP / HIGH ORDER WORD OF EXPONENT SNA CLA / IS IT ZERO JMP FFP5 / YES ... RESULT=1 TAD ACH / BASE IS IN FLOATING POINT AC SPA JMP FFPERR SZA CLA / IF BASE EQUALS ZERO ... RESULT EQUALS ZERO JMP FFP1 RETRN FFPOW / ZERO RESULT EXIT FFP1, CALL 1,STO / SAVE BASE FFP2, ARG X CALL 1,ALOG ARG X CALL 1,FMP / Y*LOG(X) LXP, ARG 0 / ADDRESS STORED HERE CALL 1,STO ARG X CALL 1,EXP ARG X FFP6, RETRN FFPOW FFP5, CALL 0,CLEAR / ANYTHING TO ZERO POWER IS 1 TAD (2014 DCA ACH JMP FFP6 FFPERR, TAD (4000 DCA ACH CALL 1,ERROR ARG FFPER JMP FFP1 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | /DECTAPE I-O ROUTINES OS8 FORTRAN II LIBRARY / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / VERSION 2A / / CALL 4, RTAPE(WTAPE) / ARG UNIT / ARG +-BLOCK (-MEANS START SEARCH FORWARD) / ARG WORD COUNT / ARG CORE ADDRESS / VERSION NUMBER IS AVAILABLE AT ENTRY POINTS / ENTRY RTAPE ENTRY WTAPE DUMMY WCT DUMMY CAD OPDEF TADI 1400 OPDEF DCAI 3400 LAP /ENABLE FIT INTO 1 PAGE / /DATA / DFUNC, 0 DBLK, 0 DWCT, 0 DFIELD, 0 WCT, 7754 CAD, 7755 DCORE, / /ARG PICKUP ROUTINE / GETARG, 0 TAD I RTAPE DCA AA INC RTAPE# TADI RTAPE# DCA WTAPE# INC RTAPE# AA, NOP /SET DATA FIELD TADI WTAPE# JMP I GETARG / /ERROR / DTERR, CALL 1,ERROR /CK FOR ERROR ARG TAPERR / /DATA / / /START / WTAPE, BLOCK 1 2 TAD WTAPE /MOVE ARG ADDR TO RTAPE DCA RTAPE TAD WTAPE# DCA RTAPE# IAC /WRITE FUNCTION JMP TARGS TAPERR, 2401 /TA 2005 /PE RTAPE, BLOCK 1 2 TARGS, DCA DFUNC /READ=0, WRITE=1 JMS GETARG /GET UNIT # CLL RTR /TO BITS 0-2 RTR TAD DFUNC /COMBINE WITH R-W BIT DCA DFUNC JMS GETARG /GET BLK # SMA JMP RT2 /REV. SRCH. CIA /FORWARD SRCH. DCA DBLK JMP RT3 RT2, DCA DBLK TAD (400 /REV. SRCH. BIT TAD DFUNC DCA DFUNC RT3, JMS GETARG /GET W.C. CIA DCA DWCT JMS GETARG /GET CORE ADDR CLA CMA TAD WTAPE# DCA DCORE TAD AA /GET CORE FIELD DCA DFIELD / /DEFINITIONS / OPDEF DTCA 6762 OPDEF DTXA 6764 OPDEF DTLB 6774 OPDEF DTRB 6772 SKPDF DTSF 6771 OPDEF DTRA 6761 / /START OF DECTAPE I-O / TAD DFUNC /UNIT & DIRECTION AND (7400 TAD (10 /+ SRCH MODE DTCA DTXA /SET STATUS & CLR FLGS DTLB /CLR FIELD BITS TAD WCT /USE 7754 AS ADDR TO 6201 /SET FIELD 0 DCAI CAD /STORE BLK FOUND DTSERR, RTL /REENTRY FOR SRCH ERROR RAL /ENDZONE FLAG TO LINK CLA CML /CHANGE DIRECTION TAD (200 /DTA GO FLAG DTCONT, SNL /CK DIR. DTREV, TAD (400 /CHANGE DIR. DTSRCH, DTXA /GO INTO SEARCH DTSF DTRB /READ CONDITION JMP DTSRCH# SPA JMP DTSERR /ERROR DTRA /GET CUR. DIR. RTL /TO LINK RTL SZL CLA TAD (3 /FOR REV GET BLK-3 6201 TADI WCT /# OF LAST BLK SEEN CMA /CIA MIGHT BLOW THE LINK TAD DBLK CMA SZA CLA JMP DTCONT /CONT. SRCH SZL /FOUND, CK DIR. JMP DTREV /IF REV, SNEAK BACK UP TAD DWCT /SET WORD COUNT DCAI WCT TAD DCORE DCAI CAD LABEL, TAD DFIELD /LOAD FIELD BITS DTLB IAC /GET R-W FUNCTION AND DFUNC CLL RTL RTL TAD (130 /SET UP FUNCTION FOR /THE XOR TO GIVE SRCH /MODE CLEARED & SET CONTINUOUS MODE /READ=3, WRITE=5 DTXA /BEGIN TRANSFER DTWAIT, DTSF /WAIT FOR W.C. OVERFLOW JMP DTWAIT DTRA AND (200 /STOP-GO BIT TAD (2 /SAVE DTA & ERROR FLAGS DTXA /STOP TAPE DTRB /READ ERROR FLAGS SPA CLA /CK FOR ERROR JMP DTERR /YES RETRN RTAPE END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | /SQUARE ROOT SUBROUTINE OS8 FORTRAN II LIBRARY LIBRARY / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / VERSION 4A / VERSION NUMBER IS AVAILABLE AT ENTRY POINTS ENTRY SQRT / / SQUARE ROOT ROUTINE / IF X0 IS AN APPROXIMATION FOR Y**(1/2) / THEN (X0+(Y/X0))/2 IS A BETTER APPROXIMATION / X0, BLOCK 3 Y, BLOCK 3 CNT, BLOCK 1 / / CPAGE 4 SQER, 6321 /"SQRT" ERROR FROM LOC XXXXX 2224 SQRT, BLOCK 1 4 /ENTRY POINT TAD I SQRT DCA IN INC SQRT# TAD I SQRT DCA IN# ISZ SQRT# CALL 1,FAD IN, ARG 0 CALL 1,STO /Y=ARGUMENT ARG Y CALL 1,FAD ARG Y TAD ACH /IF Y NEGATIVE THEN ERROR SMA JMP POS CALL 1,ERROR ARG SQER CLA CLL CMA RAR AND ACH POS, SZA /IF Y=0 THEN ROOT=0 JMP NONZ RETRN SQRT NONZ, RAR CLL /FORM INITIAL APPROXIMATION TAD (1004 DCA ACH TAD ACM RAR DCA ACM TAD ACL RAR DCA ACL TAD ACH AND (4 SNA CLA TAD (2 TAD ACH DCA ACH TAD (-3 /DO 3 ITERATIONS DCA CNT INIT, CALL 1,STO ARG X0 CALL 1,FAD ARG Y CALL 1,FDV /Y/X0 ARG X0 CALL 1,FAD /(Y/X0)+X0 ARG X0 TAD ACH /((Y/X0)+X0)/2 TAD (7770 DCA ACH ISZ CNT JMP INIT RETRN SQRT END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 | /TRIGONOMETRY ROUTINES OS8 FORTRAN II LIBRARY / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / VERSION 5 HAS PATCH FOR IMPROVED ACCURACY AT LARGE ARGS / INSERTED NOP INSTRUCTIONS AT PATCH1 AND PATCH2/C. STOLZ / / / / / / / / / / / VERSION 6A / VERSION NUMBER IS AVAILABLE AT ENTRY POINTS ENTRY SIN ENTRY COS ENTRY TAN QUAD, 0 /CONTAINS ONE LESS THAN THE QUADRANT OF THE ARGUMENT Y, BLOCK 3 /TEMPORARY STORAGE FOR ARG CPAGE 22 COEF, 5476 /-2.39E-8 CONSTANTS FOR SIN 3246 2500 /2.7526E-6 1565 6134 5170 /-1.98409E-4 5646 4006 0026 /8.3333315E-3 1724 2104 2065 /-1.6666667E-1 5765 2525 2525 /1.0 2014 0000 0000 CPAGE 3 HALFPI, 2016 /1.5707963 2207 7324 CPAGE 3 QTRPI, 2006 /7.8539815E-1 2207 7324 CPAGE 25 TOEF, 1724 /9.5168091E-3 6766 1440 /2.9005250E-3 1705 7413 2741 /2.4565090E-2 1736 2236 2720 /5.3374060E-2 1746 6517 3023 /1.3339240E-1 1764 2114 0042 /3.3333140E-1 1775 2525 1517 /1.0 2014 0000 0000 TAN, BLOCK 1 6 DCA QUAD /SET QUADRANT OFFSET SWITCH TAD I TAN /PICK-UP CDF DCA TARG INC TAN# /POINT TO NEXT WORD TAD I TAN /PICK-UP ADDRESS DCA TARG# INC TAN# /POINT TO RETURN CALL 1,FAD /GET ARG IN FP-ACC TARG, ARG 0 BAC, TAD ACH /LOOK AT HIGH ORDER WORD SPA CLA /IF NEGATIVE JMP OVT /GO OM CALL 1,FSB /OTHERWISE SUBTRACT ARG QTRPI /PI/2 ISZ QUAD /AND INCREMENT QUADRANT COUNTER PATCH1, NOP /ALLOW FOR SKIP JMP BAC /UNTIL ARG IS NEGATIVE OVT, CALL 1,FAD /ADD PI/2 TO ARG UNTIL IT IS IN ARG QTRPI /THE FIRST QUADRANT CLA CMA TAD QUAD /BUT KEEP TRACK OF WHICH QUADRANT IT WAS IN DCA QUAD TAD ACH /GET HI ORDER WORD SPA CLA JMP OVT /IF NEGATIVE REPEAT TAD QUAD /FIND OUT WHAT QUAD IT WAS IN RTR SMA CLA JMP OM CALL 0,CHS /SUBTRACT FROM PI/2 IF QUAD 2 OR 4 CALL 1,FAD ARG QTRPI OM, TAD (7 /USE A 7 TERM SERIES CPAGE 3 JMS POL TOEF /ADRESS OF COEFICIENTS FOR THE SERIES CLA CMA TAD QUAD RTR SZL CLA JMP OM3 CALL 1,STO ARG Y TAD (2014 DCA ACH CALL 1,FDV ARG Y OM3, RETRN TAN / INTERNAL SUBROUTINE POL / / COMPUTES N TERMS OF POLYNOMIAL / N IN AC ... X IN FLOATING AC / COEFFICIENTS START IN LOCATION WHOSE ADDRESS FOLLOWS JMS TO POL / POL2, BLOCK 1 POL, BLOCK 1 CIA DCA POL2 CALL 1,STO /STORE ADJUSTED ARGUMENT ARG Y /IN A TEMPORARY CALL 1,FAD ARG Y /RESTORE FP AC CALL 1,FMP ARG Y /SQUARE IT CALL 1,STO ARG X TAD I POL INC POL ARG2, DCA ARG1# CALL 1,FAD ARG1, ARG COEF / ADDRESS STORED HERE ISZ POL2 JMP POL1 CALL 1,FMP /MULTIPLY AGAIN TO COMPLETE SERIES ARG Y TAD QUAD RTR SNL CLA /FIND OUT WHICH QUADRANT JMP POLEX CALL 0,CHS /IF IN QUADRANT 3 OR 4 SET NEGATIVE POLEX, JMP I POL POL1, CALL 1,FMP ARG X TAD ARG1# TAD (3 JMP ARG2 / X, BLOCK 3 /TEMPORARY FOR POL / / / 8K FORTRAN TRIGNOMETRY ROUTINES / / COS, BLOCK 1 6 TAD COS DCA SIN TAD COS# DCA SIN# /IT NOW APPEARS THAT SIN WAS CALLED CLA IAC /WITH QUADRANT OFFSET BY ONE JMP COSE SIN, BLOCK 1 6 COSE, DCA QUAD /SET QUADRANT OFFSET SWITCH TAD I SIN /PICK-UP CDF DCA SARG INC SIN# /POINT TO NEXT WORD TAD I SIN /PICK-UP ADDRESS DCA SARG# INC SIN# /POINT TO RETURN CALL 1,FAD /GET ARG IN FP-ACC SARG, ARG 0 BACK, TAD ACH /LOOK AT HIGH ORDER WORD SPA CLA /IF NEGATIVE JMP OVR /GO ON CALL 1,FSB /OTHERWISE SUBTRACT ARG HALFPI /PI/2 ISZ QUAD /AND INCREMENT QUADRANT COUNTER PATCH2, NOP /ALLOW FOR SKIP JMP BACK /UNTIL ARG IS NEGATIVE OVR, CALL 1,FAD /ADD PI/2 TO ARG UNTIL IT IS IN ARG HALFPI /THE FIRST QUADRANT CLA CMA TAD QUAD /BUT KEEP TRACK OF WHICH QUADRANT IT WAS IN DCA QUAD TAD ACH /GET HI ORDER WORD SPA CLA JMP OVR /IF NEGATIVE REPEAT TAD QUAD /FIND OUT WHAT QUAD IT WAS IN RTR SMA CLA JMP ON CALL 0,CHS /SUBTRACT FROM PI/2 IF QUAD 2 OR 4 CALL 1,FAD ARG HALFPI ON, TAD (6 /USE A 6 TERM SERIES CPAGE 3 JMS POL COEF /ADRESS OF COEFICIENTS FOR THE SERIES RETRN SIN END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 | /UTILITY SUBROUTINE PACKAGE OS8 FORTRAN II LIBRARY / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /UTILITY SUBROUTINE PACKAGE OS8 FORTRAN II LIBRARY / VERSION 10A (APRIL 28, 1977) / VERSION NUMBER IS AVAILABLE AT ENTRY POINTS / ENTRY OPEN /INITIALIZING AND FLAG SETTING ROUTINE ENTRY GENIO ENTRY EXIT /EXIT TO DISK MONITOR SYSTEM ENTRY ERROR ENTRY CKIO /USELESS ROUTINE OPDEF KRS 6034 OPDEF KCC 6032 OPDEF TADI 1400 OPDEF DCAI 3400 OPDEF JMSI 4400 OPDEF JMPI 5400 / CARD READER IOT'S OPDEF RCSE 6672 OPDEF RCSP 6671 OPDEF RCSF 6631 OPDEF RCRA 6632 /LINE PRINTER IOT'S OPDEF LLB 6666 OPDEF LSF 6661 LAP U17, 17 /*** MUST BE FIRST LOC IN PAGE *** IOER, 1117 0522 /"IOER" ERROR GENIO, BLOCK 1 10 /GENERAL INPUT/OUTPUT ROUTINE DCA 7 /SAVE ENTRY AC GENLP, TAD 7 RTL RTL RAL U200, AND U17 TAD JMPITB DCA DSPACH /INDEX JUMP TABLE BY DEVICE NUMBER TAD U200 KRS TAD UM203 SNA CLA KSF /CHECK FOR ^C ON TELETYPE DSPACH, NOP /NO ^C - DISPATCH TO I/O ROUTINE CALL 0,EXIT JMPITB, JMPI DEVTAB DEVTAB, TTYOUT HSPOUT LPTOUT GENOUT TTYIN HSRIN CDRIN GENIN TTYFUJ /FUDGE - SEE TELETYPE INPUT ROUTINE IOERR IOERR IOERR IOERR IOERR IOERR IOERR HSPOUT, PSF JMP GENLP TAD 7 PLS GENRTN, CLA RETRN GENIO TTYIN, KSF JMP GENLP CLA CLL CML RTR /****DEPENDS ON NUMBER OF DEVICES **** JMP GENLP /TEST FOR ^C ONE LAST TIME HSRIN, ISZ T1 JMP HSRSF TAD U336 /TIME OUT-PRINT '^' TLS HLP, KSF JMP HLP AND U200 /GET 200 INTO AC KRS /READ THE CHAR. TAD UM203 SZA CLA /IS IT CONTROL C? KCC /NO-CLEAR FLAG RFC /USER TYPED-TICKLE RDR-FALL THRU RFC HSRSF, RSF JMP GENLP DCA T1 RRB RFC JMP GENRTN# U336, 336 T1, 0 UM203, -203 PCDRGC, CDRGCH /USED TO FORCE DF=CURRENT WHEN NECESSARY CDR215, 215 CDR100, 100 CDR240, 240 PCDRTB, CDRTBL /CONVERSION FROM CARD CODE TO ASCII-240 CDRCT, 0 CDRLEN, 0 CDRIN, TAD CDRCT SNA CLA JMP CDRNXT /NEW CARD NECESSARY ISZ CDRCT /ADVANCE TO NEXT COLUMN JMP CDRGET TAD CDR215 /NO MORE - SEND A CARRIAGE RETURN JMP GENRTN# CDREST, KSF JMP CDRTST KCC CDRNXT, RCSE JMP GENLP /CHECK FOR ^C WHILE WAITING FOR NEXT CARD CDRTST, RCSP JMP CDRCOL /NOT END OF CARD YET TAD CDRCT /END OF CARD - SET UP FOR EXTRACTION OF CHARS CIA DCA CDRLEN CDRGET, TAD CDRCT TAD CDRLEN /FORM CHAR POINTER INTO TABLE AT 10100 CLL RAR TAD CDR100 6211 JMSI PCDRGCH /INDEX TABLE AND PULL OUT CHAR (DF=10) TAD CDR240 /CHANGE TO ASCII JMP GENRTN# /RETURN CDRCOL, RCSF /ANYTHING YET? JMP CDREST /KEEP LOOKING RCRA /READ IT CLL RAR TAD PCDRTB JMS I PCDRGC /GET TABLE ENTRY, FORCING DATA FIELD CURRENT DCA CDRLEN /SAVE IT TEMPORARILY TAD CDRCT CIA CLL RAR TAD CDR100 /INDEX TABLE AT LOC 10100 DCA DSPACH 6211 /CDF 10 TAD CDRLEN SZL /WHICH HALF? JMP CDNORT /RIGHT HALF RTL RTL RTL SKP CDNORT, TADI DSPACH /ADD EXISTING LEFT HALF DCAI DSPACH /SAVE UPDATED ENTRY CLA CMA TAD CDRCT DCA CDRCT /UPDATE COLUMN POINTER JMP CDRCOL PAGE U377, 377 /MUST BE FIRST LOC IN THIS PAGE GENIN, 6201 TADI IHNDLR SNA CLA /OPEN INPUT FILE? JMP IOERR /NO 6202 JMS I FICHAR /GET A CHAR JMP IOERR /INPUT ERROR UU200, AND U377 GRTN2, RETRN GENIO GENOUT, 6201 TADI OHNDLR SNA CLA /OPEN OUTPUT FILE? JMP IOERR /NO 6202 TAD 7 /GET CHAR TO BE OUTPUT AND U377 JMS I FOCHAR /PUT A CHARACTER JMP IOERR /OUTPUT ERROR JMP GRTN2 IHNDLR, 122 /***ALL THESE LOCATIONS ARE VERY VOLATILE!! *** FICHAR, 606 /******* OHNDLR, 121 /******* FOCHAR, 651 /****************** / / INITIALIZING SUBROUTINE CALLED BY FORTRAN / CLEARS FLOATING AC AND SETS FLAGS / OPEN, BLOCK 1 10 TAD (212 TLS /PUT LINE-FEED ON TTY LLB /INITIALIZE LPT KCC /CLEAR KEYBOARD FLAG (AND AC) PLS RFC CALL 0,CLEAR 6201 DCAI IHNDLR DCAI OHNDLR /ZERO DEVICE-INDEPENDENT IO FLAGS RETRN OPEN LPTOUT, LSF JMP GENLP TAD 7 ISZ PFSTCH JMP NOFST TAD (-1262 /LOOK FOR CONTROL CHARS IN PRINT POSITION 1 CLL IAC IAC SNL JMP DCACH CLL RAL TAD (212 NOFST, LLB TAD (-1212 DCACH, SNA CLA /IF LINE FEED CMA /SET "FIRST CHAR" SWITCH ON DCA PFSTCH JMP GRTN2 PFSTCH, -1 TTYFUJ, TAD UU200 KRS DCA 7 /SAVE KEYBOARD CHAR KCC /CLEAR FLAG TAD 7 TAD (-212 SZA CLA JMS TYPE TAD 7 TAD (-215 SZA CLA JMP TYRTN CLA CLL CMA RTL JMS TYPE TYRTN, TAD 7 JMP GRTN2 /RETURN WITH CHAR IN AC TYPE, 0 TAD 7 TYPELP, TSF JMP TYPELP TLS CLA JMPI TYPE TTYOUT, JMS TYPE JMP GRTN2 IOERR, CALL 1,ERROR ARG IOER CDRTBL, 0021;2223;2425;2627 3031;3203;4007;3502 2017;6364;6566;6770 7172;7514;0577;3637 1552;5354;5556;5760 6162;0104;1211;3374 0641;4243;4445;4647 5051;7316;3410;1376 PAGE PMESG, MESG MESG, 7777 7777 4005 2222 1722 4001 2440 1417 0340 LIT7, 0007 ERROR, BLOCK 1 10 /ERROR PROCESSOR U7600, 7600 TAD ERROR DCA TEM1 TEM1, NOP /SET DATA FIELD OF "CALL ERROR" TADI ERROR# DCA TEM3 INC ERROR# E60, CLA CMA CML /CML IS WINDOW DRESSING TADI ERROR# DCA 10 INC ERROR# TEM3, NOP /DATA FIELD OF MESSAGE&ENTRY POINT DCA CKIO /ZERO "FATAL ERROR" FLAG TADI 10 RAL SZL /NON-FATAL BIT ON? ISZ CKIO /YES - SET "FATAL FLAG" TO NON-FATAL CLL RAR /STRIP NON-FATAL BIT FROM MESSAGE DCA MESG TADI 10 /SECOND WORD OF MESSAGE DCA MESG# TADI 10 DCA TEM1 TADI 10 DCA TEM3 /CALLING ADDRESS TAD PMESG DCA TEM2 ERLP, TAD I TEM2 RTR RTR RTR JMS PR6BIT TAD I TEM2 JMS PR6BIT INC TEM2 JMP ERLP PRLOC, TAD TEM1 RTR RTR JMS ERTTY /PRINT CALLING FIELD TAD (-4 DCA TEM2 NUMLP, TAD TEM3 RTL RAL DCA TEM3 TAD TEM3 JMS ERTTY ISZ TEM2 JMP NUMLP TAD (215 DCA 7 JMS TYPE CLA CLL CMA RTL JMS TYPE TAD CKIO /GET THE FATAL ERROR FLAG SNA CLA /WHADDOWEDO?? JMP EXITX RETRN ERROR /HE SAYS ITS NON-FATAL - LET HIM HANDLE IT ERTTY, 0 /DIGIT PRINTING ROUTINE RAL AND LIT7 TAD E60 JMS PR6BIT JMP I ERTTY PR6BIT, 0 /6BIT TO 8BIT CONVERTOR AND (77 SNA JMP PRLOC /MESSAGE OVER TAD (7740 SPA TAD (100 TAD (240 CALL 0,GENIO /LOOK FOR ^C WHILE TYPING JMP I PR6BIT / /EXIT TO DISK MONITOR SYSTEM / EXIT, BLOCK 1 10 EXITX, CALL 0,CKIO 6203 JMPI U7600 /RETURN TO MONITOR CKIO, 0 TEM2, 10 /DUMMY SUBROUTINE TO WAIT FOR I/O COMPLETE CKWAIT, 6041 JMP CKWAIT RETRN CKIO CDRGCH, 0 /GET A CHAR FROM A PACKED TABLE DCA TEM2 /WORD PTR IN AC, LEFT/RIGHT SW IN LINK TADI TEM2 /PRESERVE ENTRY FIELD SZL JMP CDRAND /RIGHT HALF RTR RTR RTR CDRAND, AND CDR77 JMP I CDRGCH /RESTORE CURRENT FIELD AND GET OUT CDR77, 77 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 | /LIBSET - LIBRARY BUILDER PROGRAM / / / / / / / / / /COPYRIGHT (C) 1974,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / FIELD 1 HILOC=20 INFPTR=21 IFPTR=22 TEMP=23 NAMPTR=24 /VERSION=3 /PATCH="A *2600 START, SKP JMP .+4 CALLCD, JMS I (200 5 RL, 2214 0 /DON'T RESET OUTPUT FILES ISZ FIRST JMP NOTFST TAD I (7604 SNA TAD RL DCA I (7604 TAD I (7600 SZA CLA /IS THERE AN OUTPUT FILE? JMP OUTYES /YES CLA IAC DCA I (7600 /NO - MAKE SYS:LIB8.RL THE OUTPUT FILE TAD (1411 DCA I (7601 TAD (0270 DCA I (7602 TAD I (7617 SNA CLA /HOW ABOUT INPUT FILES? TAD I (MPARAM+1 AND (40 /IF NO INPUT FILES, SNA CLA /AND /S OPTION IS ON, JMP OUTYES DCA PTRCOD /USE PTR: FOR INPUT JMS I (200 12 4224 PTRCOD, 0 0 JMP I PERROR /NO PTR - BAD TAD PTRCOD DCA I (7617 OUTYES, JMS I (XOPEN JMS I (OCHAR JMS I (DMPREC /PUT OUT NOTHIN IN FIRST RECORD TAD (7000 DCA NAMPTR TAD (7376 DCA INFPTR NOTFST, TAD (7617 DCA IFPTR FILELP, TAD I IFPTR SNA CLA JMP NEXTCD TAD IFPTR JMS I (IOPEN READLP, CLA CMA TAD I (OUCCNT DCA FLEN DCA HILOC JMS I (IREAD /READ AND COPY A RELOCATABLE PROGRAM SZA CLA /TEST CHECKSUM JMP I PERROR TAD HILOC AND (7600 TAD FLEN DCA I INFPTR JMS I (DMPREC ISZ INFPTR DCA I INFPTR CLA CLL CMA RTL TAD INFPTR DCA INFPTR TAD I (MPARAM+1 AND (40 SZA CLA JMP READLP /IF /S SWITCH ON , CONTINUE READING TAPES UNTIL A ^Z NXFIL, ISZ IFPTR ISZ IFPTR JMP FILELP NEXTCD, TAD I (MPARAM-1 SMA CLA JMP CALLCD DCA I NAMPTR ISZ NAMPTR ISZ NAMPTR ISZ NAMPTR DCA I NAMPTR TAD NAMPTR CMA IAC TAD INFPTR SMA CLA JMP I (FINISH JMP I .+1 TOOBIG FIRST, -1 FLEN, 0 JTABL, DATAWD DATAWD ERROR SYMDEF ORIGIN DATAWD DATAWD PERROR, ERROR ENDTAP ERROR COMMON ERROR ERROR ERROR ERROR TRANVC VERSON, 6301 /VERSION AND PATCH LEVEL *3000 IREAD, 0 TAD (200 DCA LOC ILEADR, JMS I (ICHAR DCA CKSM TAD CKSM AND (177 SNA CLA JMP ILEADR TAD CKSM TAD (-232 SNA CLA JMP I (NXFIL TAD (200 JMS I (OCHAR TAD CKSM JMS I (OCHAR TAD CKSM SKP NXTFRM, JMS RCHAR CLL RTR RTR RAR DCA CHAR1 TAD CHAR1 RAL AND (17 TAD JMPTAB DCA BTMP TAD I BTMP DCA BTMP JMP I BTMP JMPTAB, JTABL RCHAR, 0 JMS I (ICHAR DCA CHAR TAD CKSM TAD CHAR DCA CKSM TAD CHAR JMS I (OCHAR TAD CHAR JMP I RCHAR DATAWD, JMS RCHAR CLA CLL TAD LOC CMA TAD HILOC SZL CLA JMP .+3 TAD LOC DCA HILOC ISZ LOC JMP NXTFRM SYMDEF, JMS RCHAR CLA CLL CMA RTL DCA CHAR1 GTNMLP, JMS RCHAR AND (77 CLL RTL RTL RTL DCA BTMP JMS RCHAR AND (77 TAD BTMP DCA I NAMPTR ISZ NAMPTR ISZ CHAR1 JMP GTNMLP TAD INFPTR AND (377 DCA I NAMPTR ISZ NAMPTR TAD NAMPTR CIA TAD INFPTR SPA SNA CLA JMP I (TOOBIG JMP NXTFRM ORIGIN, JMS RCHAR CLA TAD CHAR1 AND (7400 TAD CHAR DCA LOC JMP NXTFRM COMMON, JMS RCHAR CLA JMP NXTFRM TRANVC, JMS RCHAR CLL RAL TAD CHAR CLL RAL CIA DCA BTMP JMS RCHAR CLA ISZ BTMP JMP .-3 JMP NXTFRM ENDTAP, TAD CKSM CIA TAD CHAR DCA BTMP JMS RCHAR CLA TAD CHAR1 AND (7400 TAD CHAR TAD BTMP JMP I IREAD LOC, 0 CHAR1, 0 CHAR, 0 BTMP, 0 CKSM, 0 *3200 XOPEN, 0 TAD (7577 DCA 10 TAD (FILENM-1 DCA 11 TAD (-5 DCA 12 TAD I 10 DCA I 11 ISZ 12 JMP .-3 JMS I (OOPEN TAD I (OUBLK DCA CTLWRI TAD I (OUHNDL DCA ODVH JMP I XOPEN DMPREC, 0 JMS I (OCHAR JMS I (OCHAR TAD I (OUDWCT TAD (200 SZA CLA JMP .-4 JMP I DMPREC FINISH, JMS I (OCLOSE CIF 0 JMS I ODVH 4210 7000 CTLWRI, 0 JMP OUTERR CDF CIF 0 JMP I (7605 FILENM, ZBLOCK 5 ODVH, 0 TOOBIG, ISZ ERRNO ERROR, ISZ ERRNO OUTERR, ISZ ERRNO INERR, ISZ ERRNO ERR, TAD ERRNO TAD (ERR0 DCA EPCH DCA ERRNO TAD I EPCH DCA ODVH ERRLP, TAD I ODVH RTR RTR RTR JMS EPCH TAD I ODVH JMS EPCH ISZ ODVH JMP ERRLP ERXIT, CDF CIF 0 JMP I .+1 7605 EPCH, 0 AND (77 SNA JMP ERXIT TAD (-40 SPA TAD (100 TAD (240 6046 6041 JMP .-1 CLA JMP I EPCH ERRNO, 0 *3400 /ERROR MESSAGES ERR0, HELP INPER OUPER RELER BIGER HELP, TEXT /HELP!/ /THIS ERROR CANNOT OCCUR INPER, TEXT /INPUT ERROR/ OUPER, TEXT /ERROR WHILE WRITING OUTPUT FILE/ RELER, TEXT /BAD FORMAT OR CHECKSUM - TRY AGAIN./ BIGER, TEXT /LIBRARY DIRECTORY OVERFLOW - TOUGH/ INBUF=0 INCTL=2400 OUBUF=6000 OUCTL=4200 INDEVH=6400 OUDEVH=7000 INRECS=12 MPARAM=7643 DCB=7760 INFLD=INCTL&70 /GET FIELD OF INPUT BUFFER OUFLD=OUCTL&70 /DITTO OUTPUT BUFFER *2000 IN7400, 7400 IOPEN, 0 DCA INXPTR CLA CMA DCA INCHCT /SET INCHCT TO FORCE A READ ISZ INEOF /SET END-OF-FILE FLAG TO FORCE A NEW FILE RDF TAD INCDIF DCA .+1 INPTR, HLT /RESTORE CALLING FIELDS JMP I IOPEN ICHAR, 0 IN7600, 7600 RDF TAD INCDIF DCA INRTRN /SAVE CALLING FIELDS INCHAR, CDF INFLD ISZ INJMP /BUMP THREE-WAY UNPACK SWITCH ISZ INCHCT INJMPP, JMP INJMP TAD INEOF SNA CLA /DID LAST READ YIELD END-OF-FILE? JMP INGBUF /NO - DO ANOTHER GETNEW, JMS INNEWF /OPEN A NEW INPUT FILE JMP I (ERROR INGBUF, TAD INCTR CLL TAD (INRECS SNL DCA INCTR /RESTORE INCTR IF IT HASN'T OVERFLOWED SZL /IS THIS THE LAST READ? ISZ INEOF /YES - SET END-OF-FILE FLAG CLL CML CMA RTR /CONSTRUCT A CONTROL WORD FOR THE READ RTR /FROM THE AMOUNT OF THE OVERFLOW RTR /(IF ANY) AND THE STANDARD CONTROL WORD TAD (INCTL+1 DCA INCTLW INCDIF, CDF CIF 0 CDF 10 JMS I INHNDL /CALL THE DEVICE HANDLER INCTLW, 0 INBUFP, INBUF INREC, 0 JMP INERRX /SOME KIND OF HANDLER ERROR INBREC, TAD INREC TAD (INRECS DCA INREC /UPDATE THE RECORD NUMBER TAD INCTLW AND IN7600 CLL RAL TAD INCTLW AND IN7600 CMA DCA INCHCT /COMPUTE THE NEW CHARACTER COUNT TAD INJMPP DCA INJMP /RESET THE CHARACTER SWITCH TAD INBUFP DCA INPTR /AND THE WORD POINTER JMP INCHAR /GO BACK AND MAKE BELIEVE THIS NEVER HAPPENED INERRX, ISZ INEOF /EITHER AN END-OF-FILE OR A BADDIE SMA CLA /WHICH TYPE WAS IT? JMP INBREC /END OF FILE - RESUME THY PROCESSING JMP I (INERR INJMP, HLT /THIS IS THE THREE - WAY CHARACTER SWITCH JMP ICHAR1 JMP ICHAR2 ICHAR3, TAD INJMPP DCA INJMP TAD I INPTR IN200, AND IN7400 CLL RTR RTR /COMBINE THE HIGH-ORDER FOUR BITS OF TAD INCTLW RTR /THE TWO WORD TO FORM THE THIRD CHARACTER RTR ISZ INPTR JMP INCOMN ICHAR2, TAD I INPTR AND IN7400 DCA INCTLW /SAVE THE HIGH-ORDER BITS FOR THE THIRD CHAR ISZ INPTR /BUMP THE WORD POINTER ICHAR1, TAD I INPTR INCOMN, AND (377 INRTRN, 0 /RESTORE CALLING FIELDS JMP I ICHAR /AND RETURN INXPTR, 0 INEOF, 1 /THESE PARAMETERS ARE SET UP SO THAT /IOPEN IS UNNECESSARY. INNEWF, -1 INCHCT=INNEWF CDF 10 TAD (INDEVH+1 DCA INHNDL /INITIALIZE HANDLER ADDRESS TAD I INXPTR SNA /ANY MORE? JMP I INNEWF /NO - OUT OF INPUT JMS I IN200 1 /ASSIGN, FETCH HANDLER INHNDL, 0 HLT /HUH? TAD I INXPTR AND (7760 /GET LENGTH PART OF WORD SZA /LENGTH OF 0 MEANS LENGTH >=256 TAD (17 /ADD HIGH-ORDER BITS CLL CML RTR RTR DCA INCTR /STORE LENGTH OF FILE ISZ INXPTR TAD I INXPTR DCA INREC /STORE STARTING RECORD NUMBER OF FILE ISZ INXPTR DCA INEOF /ZERO END-OF-FILE FLAG ISZ INNEWF JMP I INNEWF INCTR=IOPEN PTP=20 *2200 OOPEN, 0 OU7600, 7600 RDF TAD OUCDIF DCA OORETN JMS OUASGN OUENTR, TAD I OU7600 JMS I (200 3 /ENTER OUTPUT FILE OUBLK, FILENM+1 OUELEN, 0 /REPLACED WITH LENGTH OF HOLE JMP OEFAIL /FAILED - MAYBE WE ASKED TOO MUCH DCA OUCCNT JMS I (OUSETP OORETN, HLT /RESTORE CALLING FIELDS JMP I OOPEN OEFAIL, TAD I OU7600 AND (7760 /GET REQUESTED LENGTH SNA CLA /WAS IT AN INDEFINITE REQUEST JMP I (OUTERR TAD I OU7600 AND (17 /MAKE THE REQUESTED LENGTH ZERO DCA I OU7600 JMP OUENTR /TRY, TRY AGAIN OUASGN, 0 TAD (OUDEVH+1 DCA OUHNDL CDF 10 TAD I (FILENM AND (17 /STRIP OFF ANY LENGTH INFO SNA /IS THERE AN OUTPUT DEVICE? JMP I (OUTERR JMS I (200 1 /ASSIGN, FETCH HANDLER OUHNDL, 0 /OUTPUT DEVICE HANDLER ENTRY HLT /HUH? JMP I OUASGN OUTDMP, 0 DCA OUCTLW /STORE THE CONTROL WORD TAD OUCCNT SNA ISZ OUCTLW TAD OUBLK DCA OUREC /COMPUTE THE STARTING BLOCK NUMBER OF THIS TRANSFER TAD OUCTLW CLL RTL RTL RTL AND (17 /COMPUTE THE NUMBER OF RECORDS TAD OUCCNT /UPDATE THE NUMBER OF BLOCKS IN THE FILE DCA OUCCNT TAD OUCCNT CLL CML TAD OUELEN SNL SZA CLA /DOES THE LENGTH EXCEED THE GIVEN LENGTH? JMP I (OUTERR OUCDIF, CDF CIF 0 CDF 10 JMS I OUHNDL OUCTLW, 0 OUBUF OUREC, 0 JMP I (OUTERR JMP I OUTDMP OCLOSE, 0 RDF TAD OUCDIF DCA OCRET JMS I (OCHAR JMS I (OCHAR FILLLP, JMS I (OCHAR JMS I (OTYPE /GET TYPE OF OUTPUT DEVICE SPA CLA TAD (100 /IF ITS A DIRECTORY DEVICE FORCE A RECORD TAD (77 /BOUNDARY - OTHERWISE A HALF-RECORD AND I (OUDWCT SZA CLA /UP TO THE BOUNDARY YET? JMP FILLLP /NO - FILL WITH ZEROS TAD I (OUDWCT /GET DOUBLEWORD COUNT LEFT TAD (OUCTL&3700 SNA /A FULL WRITE LEFT? JMP NODUMP /YES - DON'T DO IT - THE ^Z IS ALREADY OUT TAD (4000+OUFLD /PUT IN THE FIELD BITS AND THE WRITE BIT JMS OUTDMP NODUMP, JMS OUASGN /REASSIGN OUTPUT HANDLER TAD I (FILENM JMS I (200 4 /CLOSE THE OUTPUT FILE OU7601, FILENM+1 OUCCNT, 0 JMP I (OUTERR OCRET, HLT /RESTORE CALLING FIELDS JMP I OCLOSE *2400 OUSETP, 0 /ROUTINE TO INITIALIZE CHARACTER POINTERS TAD (OUCTL&3700 /GET SIZE OF BUFFER IN DOUBLEWORDS CIA /NEGATE IT DCA OUDWCT TAD (OUBUF DCA OUPTR /INITIALIZE WORD POINTER TAD OUJMPE DCA OUJMP /INITIALIZE THREE-WAY CHARACTER SWITCH JMP I OUSETP OCHAR, 0 AND (377 DCA OUTEMP RDF TAD (CDF CIF 0 DCA OUCRET OUCHAR, CDF OUFLD /SET DATA FIELD TO BUFFER'S FIELD ISZ OUJMP /BUMP THE CHARACTER SWITCH OUJMP, HLT /THREE WAY CHARACTER SWITCH JMP OCHAR1 JMP OCHAR2 OCHAR3, TAD OUTEMP CLL RTL RTL AND (7400 TAD I OUPOLD DCA I OUPOLD /UPDATE FIRST WORD OF TWO WITH HIGH /ORDER 4 BITS OF THIRD CHAR TAD OUTEMP CLL RTR RTR RAR AND (7400 TAD I OUPTR DCA I OUPTR /UPDATE SECOND WORD FROM LOW ORDER 4 BITS TAD OUJMPE DCA OUJMP /RESET SWITCH ISZ OUPTR ISZ OUDWCT /BUMP DOUBLEWORD COUNTER EVERY 3 CHARS JMP OUCOMN TAD (OUCTL /LOAD CONTROL WORD FOR A FULL WRITE JMS I (OUTDMP /DUMP THE BUFFER JMS OUSETP /RE-INITIALIZE THE POINTERS JMP OUCOMN OCHAR2, TAD OUPTR DCA OUPOLD /SAVE POINTER TO FIRST WORD OF TWO ISZ OUPTR /BUMP WORD POINTER TO SECOND WORD OCHAR1, TAD OUTEMP DCA I OUPTR OUCOMN, OUCRET, HLT /RESTORE CALLING FIELDS JMP I OCHAR OUTEMP, 0 OUPOLD, 0 OUPTR, 0 OUJMPE, JMP OUJMP OUDWCT, 0 OUTINH, 0 OTYPE, 0 RDF TAD (CDF CIF 0 DCA OTRTN CDF 10 TAD I (7600 AND (17 TAD (DCB-1 DCA OUTEMP TAD I OUTEMP OTRTN, HLT JMP I OTYPE CTCTST, 0 KRS TAD (-203 SNA CLA /IS THE TELETYPE BUFFER A ^C KSF /WITH THE TELETYPE FLAG ON? JMP I CTCTST /NO CDF CIF 0 /YES - GO TO MONITOR JMP I (7605 /THROUGH THE "DON'T SAVE CORE" RETURN $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 | /OS8 FORTRAN II RELOCATING LOADER V4 / / / / / / / // / / / / /COPYRIGHT (C) 1973, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /LOADER.07 DECEMBER 5, 1973 / / /CHANGES MADE FOR V4 J.K. 1975 / / .VERSION NUMBER PRINTED ON MAP / .BIT ZERO OF 17645 IS USED INSTEAD OF THE WHOLE / WORD TO INDICATE THAT THE LOADER WAS CHAINED / TO FROM SABR / .CORE ROUTINE STANDARIZED / .CHECK FOR BATCH CORRECTED / / /FIELD 0, PAGE 0 VERSION=6400 /PRINTS ON MAP PATCH=01 JSTFLD= 7744 JSTADR= 7745 JSBITS= 7746 MOFILE= 7600 MIFILE= 7617 MPARAM= 7643 DCB= 7760 MSTCDF= 7772 MSTADR= 7775 SHNDLR= 7607 MGET= 7667 MTEMP= 27 OLDT9= 7 /LOCATION OF HANDLER ENTRY OF DEVICE /WITH DIRECTORY IN CORE *0 ZERO, JMS I XSHNDLR ONE, 2010 3600 MTEMP+11 HLT FIVE, JMP I .+1 7600 XSHNDLR,SHNDLR X1, 0 X2, 0 X3, 0 X4, 0 *16 NOPUNC *100 ENPUNC DFRSTR, CIF 10 JMS I DF200 11 /KICK OUT MONITOR DFSAVE, 0 /RESTORE CALLING FIELD JMP I CDZSKP /AND EXIT SAVEDF, 0 /COMMON SAVE-FIELD PROCESSOR FOR FORTRAN I/O DCA CDZSKP /CALLING ADDRESS RDF TAD .+2 DCA DFSAVE /CALLING FIELD CDF CIF 0 JMP I SAVEDF DF200, 200 /RUN-TIME SYSTEM PAGE 0 - PROPAGATED TROUGH ALL FIELDS *33 BNK=00 / / COMMON SUBROUTINE CALL LINKAGE ROUTINE / LINK, 0 K6201, CDF BNK /SET DATA FIELD TO THIS BANK K6202, CIF 00 /SET INSTRUCTION FIELD TO ZERO JMP I MLINKP /EXIT TO MASTER LINKAGE ROUTINE MLINKP, MLINK / / COMMON SUBROUTINE RETURN LINKAGE ROUTINE / RTN, 0 CDF BNK /SET DATA FIELD TO THIS BANK CIF 00 /SET INSTRUCTION FIELD TO ZERO JMP I MRTNP /EXIT TO MASTER RETURN ROUTINE MRTNP, MRTN / / CHANGE DATA FIELD TO CURRENT AND SKIP / CDFSKP, 0 ISZ CDFSKP /INDEX ADDRESS FOR SKIPPING CDF BNK /CHANGE DATA FIELD TO CURRENT BANK JMP I CDFSKP /EXIT / / CHANGE DATA FIELD TO ZERO AND SKIP / CDZSKP, 0 ISZ CDZSKP /INDEX RETURN ADDRESS FOR SKIPPING CDF 10 /CHANGE DATA FIELD TO ZERO JMP I CDZSKP /EXIT / / OFF BANK INDIRECT SUBROUTINE / OBISUB, 0 CDF BNK /SET DATA FIELD TO THIS BANK CIF 00 /SET INSTRUCTION FIELD TO ZERO JMP I MOBIP /EXIT TO MASTER OFF BANK INDIRECT SUBROUTINE MOBIP, MOBI / / OFF PAGE INDIRECT SUBROUTINE / OPISUB, 0 CDF BNK /SET DATA FIELD TO THIS BANK CIF 00 /SET INSTRUCTION FIELD TO BANK 0 JMP I MOPIP /EXIT TO MASTER OFF PAGE INDIRECT SUBROUTINE MOPIP, MOPI / / ROUTINE TO HANDLE DUMMY ARGUMENTS / DUMSUB, 0 CDF BNK /SET DATA FIELD TO THIS BANK CIF 00 /SET INSTRUCTION FIELD TO BANK 0 JMP I MDUMP /EXIT TO MASTER DUMMY ARGUMENT ROUTINE MDUMP, MDUM / PAGE 0 CELLS FOR FORTRAN EXECUTION TIME I/O / CELLS SET UP BY LINKING LOADER - CANNOT GO PAST 77 INHNDL, 0 /PAGE FOR INPUT HANDLER IF /I SWITCH WAS ON OUHNDL, 0 /PAGE FOR OUTPUT HANDLER IF /O SWITCH WAS ON ELENGT, 0 /"DESIRED LENGTH" FOR FORTRAN OUTPUT FILES - USUALLY 0 *DF200+1 /OTHER PAGE 0 LOCATIONS FOPOLD, 0 FINPTR, 0 FICHCT, 0 /MUST BE INIT. TO -1 AT LOOKUP FINTMP, 0 /MUST BE INIT. TO 10 AT LOOKUP OHNDLR, 0 /SET BY FENTER - CLEARED BY FCLOSE IHNDLR, 0 /SET BY FLUKUP - NEVER CLEARED FOUPTR, 0 FOCHCT, 0 *200 LSTART, JMP I (LDRZZ1 SSTART, CDF 10 TAD I (MPARAM+2 SMA CLA JMP NOTSBR TAD I (MPARAM+2 AND (3777 DCA I (MPARAM+2 TAD I (MOFILE SNA CLA JMP LDRYYY TAD (MOFILE+11 DCA X1 TAD (MOFILE DCA SEVEN TAD (-5 DCA SIX TAD (TEMP-1 DCA X2 MOVLP1, TAD I SEVEN CDF 0 DCA I X2 CDF 10 TAD I X1 DCA I SEVEN ISZ SEVEN ISZ SIX JMP MOVLP1 TAD TEMP+1 /GET BLOCK NUMBER WHICH SABR PLACED HERE DCA I (MIFILE+1 DCA I (MIFILE+2 CLA CLL CMA RAL AND I (MPARAM DCA I (MPARAM /REMOVE /L SWITCH FROM SABR INPUT CDF 0 CIF 10 CLA IAC JMS I (200 4 /DELETE FORTRL /THE FILE "FORTRL.TM" IF IT EXISTS 0 NOP /IT DIDN'T EXIST - BIG DEAL TAD TEMP LDRYYY, CDF 10 DCA I (MIFILE NOTSBR, CIF 10 CDF 0 JMS I (200 12 /GET DEVICE NUMBER WITHOUT HANDLER 2424 /TT TTYNUM, 3100 /Y 1000 /RANDOM NUMBER JMP LWOWIE /WHAT - NO TELETYPE??? CIF 10 CLA IAC /DEVICE "SYS" JMS I (200 2 PTSLIB, SYSLIB 0 /USELESS LENGTH WORD CLA SKP TAD PTSLIB CDF 10 DCA I (PSYSLB TAD TTYNUM DCA I (TTYNO /STORE AWAY TTY DEVICE NUMBER JMS I (BATCK CORO, TAD CORSIZ /GET FLD OF TEST RTL RAL AND COR70 TAD COREX /MASK USEFUL BITS DCA .+1 COR1, CDF TAD I CORLOC /SAVE CURRENT CONTENTS COR2, NOP DCA COR1 TAD COR2 DCA I CORLOC COR70, 70 TAD I CORLOC /TRY TO READ BACK CORX, 7400 TAD CORX TAD CORV /TAD (1400) SZA CLA JMP COREX /NON-EXISTENT FLD EXIT TAD COR1 DCA I CORLOC /RESTORE LOC ISZ CORSIZ JMP CORO COREX, CDF 0 TAD CORSIZ CIA FOUNDX, CDF CIF 10 DCA I (WROVLY /POSTPONE SPREADING FIELD ZERO RESIDENT TAD (TTYOUT / THRU FIELDS UNTIL /I,/O AND /H ARE TESTED DCA I (TYPE JMP I .+1 LDRXXX SIX, 0 SEVEN, 0 LWOWIE, CDF CIF 10 JMP I (SIOERR CORLOC, CORX CORV, 1400 CORSIZ, 1 TEMP, 0;0;0;0 PAGE /FULL LINKAGE ROUTINES FOR RUN-TIME SYSTEM *400 K77A, 0077 /MUST BE FIRST LOC ON PAGE / / MASTER OFF PAGE INDIRECT ROUTINE / MOPI, DCA AC /SAVE AC TAD I OPIP /PICK UP ADDRESS OF PARAMETER DCA DUMSUB TAD I DUMSUB /ACTUAL PARAMETER DCA 7 /TO A TEMP TAD I 7 /PICK UP FINAL DATA DCA I K7 /TO LOCATION 7 IN FROM BANK RDF /FROM BANK ATVX, TAD K6202 /MAKE A CIF FROM INSTRUCTION DCA ATV /SAVE IN THIS SEQUENCE JMP ATV-1 / / MASTER OFF BANK INDIRECT ROUTINE / MOBI, DCA AC /SAVE AC TAD I OBIP /ADDRESS OF PARAMETER DCA DUMSUB TAD I DUMSUB /ACTUAL COMMON ADDRESS DCA 7 /SAVE IT RDF /FROM BANK TAD K6201 /MAKE A CDF FROM INSTRUCTION DCA .+3 /PLACE IN THIS SEQUANCE CDF 10 /CHANGE DATA FIELD TO COMMON TAD I 7 /ACTUAL DATA NOP /BECOMES CDF AND CIF FROM INSTRUCTION DCA I K7 /TO LOCATION 7 IN FROM BANK RDF CDF 10 JMP ATVX / MASTER INDIRECT DUMMY ARGUMENT SUBROUTINE MDUM, DCA AC /SAVE AC TAD I DUMP /PICK UP ADDRESS OF PAR DCA DUMSUB TAD I DUMSUB /PICK UP POINTER TO 2 WORD VECTOR DCA DUMTEM /TO A TEMPORARY TAD I DUMTEM /FIELD DATA IS IN AS A CDF DCA ABCRT /TO THIS SEQUANCE RDF /FROM FIELD TAD K6202 /MAKE A CIF INSTRUCTION DCA ATV /TO THIS SEQUANCE FOR EXIT ISZ DUMTEM /POINT TO LOCATION IN FIELD TAD I DUMTEM /ACTUAL LOCATION IN UNKNOWN FIELD DCA I K7 /TO FROM FIELD LOCATION 7 ABCRT, NOP /BECOMES CDF UNKNOWN ISZ DUMSUB /BUMP RETURN ADDRESS ATV, NOP /BECOMES CIF FROM TAD AC /RESTORE AC JMP I DUMSUB /EXIT AC= CDZSKP DUMTEM= OBISUB OPIP, OPISUB OBIP, OBISUB DUMP, DUMSUB / / MASTER LINKAGE ROUTINE / MLINK, DCA AC /SAVE AC RDF TAD K6201 /MAKE A CDF DCA DUMTEM TAD I LINKP /ADDRESS OF CODE WORD JMS RTS1 TAD DUMTEM /CDF FROM INSTRUCTION DCA I DUMSUB /TO FIRST WORD OF 2 WORD VECTOR ISZ DUMSUB /POINT TO DISPLACEMENT TAD LINK /ADDRESS OF CODE WORD IAC /INCR. TO FIRST ARG DCA I DUMSUB /TO SECOND WORD OF 2 WORD VECTOR JMP ATVX-1 / / MASTER RETURN ROUTINE / MRTN, DCA AC /SAVE AC TAD I RTNP /ADDRESS OF CODE WORD JMS RTS1 TAD I DUMSUB /FIELD TO RETURN TO AS A CDF INSTRUCTION TAD K2 DCA ATV ISZ DUMSUB TAD I DUMSUB DCA DUMSUB JMP ATV /DATA K100A, 100 K7700A, 7700 LINKP, LINK RTNP, RTN / /SUBROUTINE 1 / RTS1, 0 DCA LINK TAD I LINK /CODE WORD K200A, AND K77A /MASK OUT NUMBER OF ARGUMENTS TAD K200A /+DISPLACEMENT DCA ABCRT /GIVES ADDRESS OF BCRT ENTRY TAD ABCRT TAD K100A /+DISPLACEMENT DCA ATV /GIVES ADDRESS OF TV DISPLACEMENT CDF CIF 0 /(TABLES IN FIELD 0!) TAD I ABCRT /TO CDF INSTRUCTION DCA RTSCDF /TO FIRST WORD OF 2 WORD VECTOR TAD I ATV /TO BANK DISPLACEMENT SNA /WAS IT LOADED? JMP NOTIN /NO DCA DUMSUB /TO SECOND WORD OF 2 WORD VECTOR RTSCDF, 0 JMP I RTS1 NOTIN, CIF 10 JMS I K7700A K7, 7 1 /USER ERROR 1 - PROGRAM NOT LOADED FASIGN, 0 /CALLED FROM SABR - DOES ASSIGN AND DCA CDFSKP /EITHER LOOKUP,ENTER OR CLOSE TAD FASIGN JMS SAVEDF CIF 10 JMS I K7700A 10 /CALL USR IN CIF 10 JMS I K200A 1 /ASSIGN HANDLER ASDEV, 0;0 /SET UP BY SABR ASPAGE, 0 /DITTO JMP ASERR /ASSIGN FAILURE ZRONAM, DCA FLUNAM /ZERO FILENAME FOR LOOKUP TAD ASDEV+1 /PUT DEVICE NUMBER IN AC JMP I CDFSKP /JUMP TO APPROPRIATE ROUTINE *567 /MUST CROSS PAGE BOUNDARY JUST SO FLUKUP, CIF 10 JMS I K200A K2, 2 /LOOKUP FILE FLUNAM, 0 /REPLACED BY BLOCK NUMBER FLUCNT, 0 /REPLACED BY LENGTH (UNUSED) ASERR, ISZ CDZSKP /SKIP RETURN IF ERROR TAD ASPAGE DCA IHNDLR /SET UP INPUT HANDLER ENTRY AND FLAG TAD FLUNAM FINRXX, DCA FINREC /***** THIS SHOULD BE AT LOC 600! ***** CLA CMA DCA FICHCT TAD FIN10 DCA FINTMP JMP FRESET /RESET I/O AND RETURN FROM FASIGN IFNZRO FINRXX-600 <FINERR,_ERROR> /GET A CHARACTER ROUTINE. /RETURNS TO .+1 IF ERROR, .+2 IF NORMAL /CHAR IN AC ON OUTPUT /DOES NOT HANDLE END-OF-FILE VERY WELL FICHAR, 0 TAD FICHAR JMS SAVEDF /SAVE RETURN FIELD AND ADDRESS FNXTCH, ISZ FICHCT /BUMP CHAR COUNT JMP FIGET JMS I IHNDLR /IT OVERFLOWED - READ IN A NEW BUFFER FI200, 200 FINBUF, 1200 FINREC, 0 FI7700, SMA CLA SKP /END - OF - FILE ERROR - IGNORE JMP DFSAVE /ERROR RETURN ISZ FINREC CLA CMA TAD FINBUF DCA FINPTR TAD FI7200 DCA FICHCT /INITIALIZE FOR NEW RECORD FIGET, TAD FINTMP /GET HIGH-ORDER-BIT BUFFER SPA /IS IT FULL? JMP FITHRD /YES - OUTPUT COMBINED HIGH-ORDER BITS FI7200, CLA ISZ FINPTR TAD I FINPTR /GET A LOC FROM THE BUFFER AND FI7400 RAL CLL TAD FINTMP /PUT THE HIGH ORDER BITS ONTO THE HOB BUFFER FINXX, RTL RTL DCA FINTMP TAD I FINPTR JMP DFEXIT /RETURN WITH SKIP FITHRD, DCA I FINPTR /FUDGE THIRD CHAR INTO BUFFER CLL CML JMP FINXX /RESET FINTMP TO 10 /PUT A CHARACTER /RETURNS TO .+1 IF ERR, .+2 IF NORMAL /CALLED WITH CHAR IN AC FOCHAR, 0 DCA FOUTMP /SAVE CHAR TAD FOCHAR JMS SAVEDF /SAVE CALLING FIELD AND LOC FOLOOP, ISZ FOUJMP ISZ FOCHCT /BUMP CHAR COUNT FOJMP, JMP FOUJMP /TAKE A BRANCH OF THE THREE-WAY JUMP JMS I OHNDLR 4200 FOUBUF, 1200 FOUREC, 0 JMP DFSAVE /OUTPUT ERROR ISZ FOUREC JMS FOSETP ISZ FOCCNT /BUMP FILE LENGTH ISZ FOOCNT /ALSO ENTER COUNT JMP FOLOOP /NOW GO PUT THE CHAR INTO THE NEW BUFFER JMP DFSAVE /ENTER COUNT OVERFLOWED - ERROR RETURN FOUJMP, JMP . /THREE-WAY SWITCH JMP FOUCH1 JMP FOUCH2 FOUCH3, TAD FOUTMP RTL RTL DCA FOUTMP TAD FOUTMP AND FI7400 TAD I FOPOLD /PUT HIGH ORDER BITS OF CHAR3 DCA I FOPOLD /INTO HIGH ORDER BITS OF CHAR 1 TAD FOUTMP RTL RTL AND FI7400 TAD I FOUPTR /PUT LOW ORDER BITS OF CHAR 3 DCA I FOUPTR /INTO HIGH ORDER BITS OF CHAR 2 TAD FOJMP DCA FOUJMP ISZ FOUPTR JMP DFEXIT /RETURN NORMALLY FOUCH2, TAD FOUPTR DCA FOPOLD /SAVE POINTER TO CHAR 1 ISZ FOUPTR FOUCH1, TAD FOUTMP DCA I FOUPTR /STORE CHAR 1 OR 2 DFEXIT, ISZ CDZSKP /INCREMENT RETURN ADDR JMP DFSAVE /AND GO THERE FOSETP, 0 TAD FO7177 DCA FOCHCT TAD FOUBUF DCA FOUPTR TAD FOJMP DCA FOUJMP JMP I FOSETP FO7177, 7177 FIN10, 10 FENTER, TAD ELENGT /ELENGT=0 UNLESS SOME KLUDGE SETS IT UP CIF 10 /FENTER JUMPED TO BY FASIGN JMS I FI200 3 FOONAM, 0 /FILE NAME IN LOCS 0-3 FOOCNT, 0 ISZ CDZSKP /FOR ENTER, ERROR RETURN IS SKIP RETURN TAD FOONAM DCA FOUREC /INITIALIZE OUTPUT RECORD # JMS FOSETP /SET UP CHARACTER POINTERS DCA FOONAM /SET FOONAM FOR NEXT ENTER TAD I PASPAG JMP STOHND /GO TO COMMON CODE WITH "FCLOSE" PASPAG, ASPAGE FCLOSE, CIF 10 /JUMPED TO BY FASIGN JMS I FI200 /CALL I/O MONITOR 4 FOCNAM, 0 /FILE NAME IN 0-3 FOCCNT, 0 /CLOSING LENGTH ISZ CDZSKP /ERROR - BUMP RETURN STOHND, DCA OHNDLR DCA FOCCNT /INITIALIZE CLOSING COUNT FOR NEXT FILE FRESET, CIF 10 JMS I FI200 13 /RESET ALL DEVICE HANDLER ENTRIES 0 /BUT RETAIN ANY OPEN OUTPUT FILES JMP DFRSTR /RETURN FROM FASIGN AFTER KICKING MONITOR OUT FOUTMP= FICHAR FI7400, 7400 PAGE *1000 PROPGT, 0 /CALLED FROM FIELD 1 LOADER WHEN 1ST CDF 10 /CHECKING FOR I/O SWITCHES. DCA I LTOPCOR /-# OF CORE FIELDS IN AC TAD I LTOPCOR DCA I LFCTR TAD I LTOPCOR CDF 0 CMA /GET # OF HI CORE FIELD PROPLP, DCA FC CLA CMA TAD FC SNA CLA JMP FIELD1 TAD FC JMS CHGBNK JMS STOBNK CLA CMA TAD FC JMP PROPLP FIELD1, CLA IAC JMS CHGBNK JMS I LSHNDLR 4100 0 MTEMP JMP I LLWOWIE JMS I LSHNDLR 4201 400 MTEMP+21 /WRITE OUT RUN-TIME ROUTINES JMP I LLWOWIE JMS CHGBNK TAD L6001 DCA I LJSBITS TAD L6213 DCA I LJSTFLD TAD LLRSTRT DCA I LJSTADR CDF CIF 10 /PROPGT IS CALLED FROM FIELD 1 ONLY JMP I PROPGT FC, 0 CHGBNK, 0 CLL RTL RAL TAD LCDF DCA X1 TAD X1 DCA LINK+1 TAD X1 DCA RTN+1 TAD X1 DCA CDFSKP+2 TAD X1 DCA OBISUB+1 TAD X1 DCA OPISUB+1 TAD X1 DCA DUMSUB+1 JMP I CHGBNK STOBNK, 0 TAD LLINK1 DCA X2 TAD X2 DCA X3 TAD LLINK2 DCA X4 TAD X1 DCA STOCDF STOLUP, CDF 0 TAD I X2 STOCDF, HLT DCA I X3 ISZ X4 JMP STOLUP CDF 0 JMP I STOBNK SYSLIB, TEXT /LIB8/ 2214 /.RL LTOPCOR,TOPCOR LSHNDLR,SHNDLR LFCTR, FCTR LLWOWIE,LWOWIE L6001, 6001 LJSBITS,JSBITS LJSTADR,JSTADR LJSTFLD,JSTFLD L6213, 6213 LCDF, CDF LLINK1, LINK-1 LLINK2, LINK-MDUMP-2 LDRZZ1, CDF 10 /COME HERE IF NOT CHAINED TO DCA I LMOFIL ISZ LMOFIL ISZ LMOCNT JMP .-3 CLA CLL CMA RAL /-2 DCA I LDOPRP CDF 00 JMP I .+1 LDRYYY LMOFIL, 7600 LMOCNT, -47 LLRSTRT,LRSTRT LDOPRP, DOPROP FORTRL, FILENAME FORTRL.TM PAGE *1200 /LINKING LOADER SUBROUTINES FOR /I AND /O OPTIONS INPENB, 0 ISZ INPFLG JMP INRTRN /ALREADY HAVE A /I JMS TWOPAG /HAS USER SPECIFIED 2-PG. HNDLRS? TAD OUPFLG SPA CLA JMP INVRGN TAD K2200 DCA INHNDL TAD (FINBUF DCA I (ST1600 /MARK THE INPUT BUFFER IN PAGE 1600 TAD K2377 JMS SETHLA INRTRN, CDF CIF 10 JMP I INPENB INVRGN, TAD K1000 DCA INHNDL TAD K1577 JMP INRTRN-1 OUPENB, 0 ISZ OUPFLG JMP OURTRN JMS TWOPAG /HAS USER SPECIFIED 2 PG. HNDLRS? TAD INPFLG SPA CLA JMP OUVRGN TAD K2200 DCA OUHNDL TAD (FOUBUF DCA I (ST1600 /MARK OUTPUT BUFFER IN 1600 TAD K2377 JMS SETHLA OURTRN, CDF CIF 10 JMP I OUPENB OUVRGN, TAD K1000 DCA OUHNDL TAD K1577 JMP OURTRN-1 INPFLG, -1 OUPFLG, -1 K1000, 1000 /SET TO 1001 FOR 2 PAGE HANDLERS K2200, 2200 /SET TO 2401 FOR 2 PAGE HANDLERS. K2377, 2377 /SET TO 2577 FOR 2 PAGE HANDLERS. K1577, 1577 /SET TO 1777 FOR 2 PAGE HANDLERS. /SUBROUTINE TO CHECK FOR /H SWITCH MEANING USER /WANTS RUN TIME DEVICE INDEPENDENT I/O TO /BE ABLE TO USE 2 PAGE DEVICE HANDLERS / TWOPAG, 0 CDF 10 TAD I (MPARAM AND (20 /IS /H SWITCH SET? SNA CLA JMP I TWOPAG /NO-RETURN (DATA FLD=1) TAD (1001 /YES-RESET HANDLR FETCH TO ACCEPT DCA K1000 /TWO PAGE HANDLERS TAD (2401 /RESET FETCH FOR SECOND HANDLER DCA K2200 TAD (2777 DCA K2377 /RESET HLA CONSTANT FOR 2 PG HANDLRS TAD (1777 DCA K1577 /RESET 2ND HLA CONSTANT FOR 2 PG TAD (2000 DCA I (K1600 /RESET BUFR. ADDRESS-SEE *LDRXIT* CDF 00 TAD (1400 DCA I (FINBUF /RESET IN AND OUT BUFFER ADDRESSES TAD (1400 /TO MAKE ROOM FOR 2 PG HANDLR DCA I (FOUBUF CDF 10 JMP I TWOPAG /RETN. DATA FLD=1 SETHLA, 0 DCA I (HLAZ TAD I (HLAZ CIA DCA I (HLAIO CDF 0 JMP I SETHLA BATCK, 0 CDF 0 TAD I (7777 AND (70 SNA JMP I BATCK CLL RTR RAR CMA DCA TMPC TAD I (7777 RAL SPA CLA IAC TAD TMPC JMP I (FOUNDX TMPC, 0 PAGE FIELD 1 /FIELD 1 PAGE 0 EQUIVALENCES - FIT INTO USR CRACKS DEVHND=20 BANK=21 TM1=22 TM2=23 RECNO=24 OVLYFG=25 CUR=26 WORD=27 HLAPTR=30 HLA=31 RCON=32 COML=33 /HI COMMON LOC, 0 IF NONE TYPE=34 CSUM=35 NSUB=36 *3600 LRSTRT, DCA I (MIFILE LDRZZZ, JMS I (IONULL LDRXXX, TAD (MIFILE DCA FILPTR DCA OVLYFG DCA I (WRBFSW JMS I (START JMP IOCHEK /GO TEST FOR /I, /O ALD /0-7 LDRLP, DCA BANK TAD I FILPTR SNA JMP GETCD JMS GETHND TAD I FILPTR ISZ FILPTR DCA RECNO TAD I (MPARAM RAR SZL CLA JMP I (LBRY JMS I (LOAD JMP LDRLP GETCD, TAD I (MPARAM+3 SNA JMP LKATMP DCA I (LSTADR TAD I (MPARAM-1 CLL RAL AND (17 CLL RTL TAD (CDF CIF 0 DCA I (LSTFLD /FALL INTO NEXT PAGE LKATMP, JMS I (WRPGBF TAD I (MPARAM AND (40 SZA CLA JMP BUILD TAD I (MPARAM-1 SPA CLA JMP BUILD JMS MAP CDCALL, JMS I (200 5 2214 TAD I (MPARAM+1 AND (100 SZA CLA JMP LDRZZZ IOCHEK, JMS I (IOTEST DCA TM1 TAD (MIFILE DCA FILPTR TAD I (MPARAM+2 AND (1774 SNA JMP LDRLP RAL ISZ TM1 SNL JMP .-3 CLA CMA CLL RTL TAD TM1 JMP LDRLP FILPTR, 0 MAP, 0 TAD I (MPARAM+1 AND (4410 /"M","P" AND "U" OPTIONS SNA MAPRTN, JMP I MAP CLL RTR RTR AND (200 SZA CLA CLL CML IAC CML RAL /FORM 0 IF /U, 1 IF /P AND 2 IF /M DCA TM1 JMP I (MAPIO BUILD, TAD (SHNDLR DCA DEVHND TAD PSYSLB SZA JMS I (LBSRCH JMS MAP JMP I (BUILDX PSYSLB, 0 GETHND, 0 AND (17 DCA I (EASGN TAD (401 DCA LASGN TAD I (EASGN ISZ FILPTR JMS I (200 1 /ASSIGN LASGN, 401 JMP I (HNDERR /BAD HANDLER TAD LASGN DCA DEVHND JMP I GETHND PAGE BUILDX, TAD LSTADR SZA CLA JMP ALREDY TAD (MAIN-1 DCA X1 JMS I (SETS1 JMS I (SEARCH JMP I (ERSTAD TAD (TVEC-1 TAD I (SYMNUM DCA TM1 CDF 0 TAD I TM1 SNA JMP I (ERSTAD DCA LSTADR TAD TM1 TAD (7700 DCA TM1 CLA CLL CML RTL /CHANGE CDF TO CDF CIF TAD I TM1 DCA LSTFLD ALREDY, CDF 10 JMS I (WROVLY TAD (1400 JMS STOINF DCA OLDT9 TAD (HLA7 DCA TM1 TAD (-10 DCA X3 DCA I X1 DCA X4 BLDLP, CLA CLL CML RTL TAD X3 SNA CLA JMP BFLD1 /TREAT FIELD 1 (COMMON AREA) DIFFERENTLY BLDLPX, TAD I TM1 AND (7600 SNA JMP BLDSKP BLDLPY, TAD (170 CLL CML CMA RTR RTR TAD X3 CLL CMA RTL RAL DCA I X1 DCA I X1 ISZ X4 BLDSKP, CLA CMA TAD TM1 DCA TM1 ISZ X3 JMP BLDLP TAD X4 CIA DCA I (1400 CIF 0 JMS I (SHNDLR 4210 1200 MTEMP+10 HLT CDF 0 TAD (JSTFLD-1 JMS STOINF TAD LSTADR DCA I (MSTADR TAD LSTFLD DCA I (MSTCDF JMP I (LDRXIT BFLD1, TAD COML SNA /IS THERE ANY COMMON? JMP BLDLPX /NO CLL CMA TAD I TM1 SNL CLA /IS THERE ANY CODE IN FIELD 1? JMP BLDSKP /NO TAD (110 /SAVE FIELD 1 IN TWO SEGMENTS - PAGE 0 AND DCA I X1 /THE CODE FOLLOWING THE END OF THE COMMON AREA ISZ X4 /(THIS IS TO ENABLE "CHAIN" TO WORK PROPERLY) TAD COML IAC DCA I X1 TAD COML CMA TAD I TM1 AND (7600 JMP BLDLPY CVTREC, 0 TAD CUR CLL RTL RTL RAL AND (7 JMP I CVTREC STOINF, 0 DCA X1 TAD LSTFLD DCA I X1 TAD LSTADR DCA I X1 DCA I X1 JMP I STOINF LSTADR, 0 LSTFLD, 0 PAGE MAPIO, TAD I ML7600 SNA TAD TTYNO /TELETYPE IS DEFAULT LISTING DEVICE JMS I (GETHND TAD I ML7604 /PICK UP EXTENSION WORD. SNA /NON-ZERO? TAD (1520 /NO-SUPPLY '.MP' EXTENSION. DCA I ML7604 /YES-LEAVE ALONE TAD ML7601 DCA MNAME TAD I (EASGN TAD (100 /4 SHIFTED LEFT INTO THE "DESIRED LENGTH" POSITION JMS I (200 3 MNAME, 0 MECNT, 0 JMP I (OUERR TAD MNAME DCA ORECNO JMS OUSETP DCA MCCNT TAD (OCHAR DCA TYPE TAD TM1 CLL CML RAR JMP I (MAPX OCHAR, 0 DCA OUTEMP ISZ OJMP ISZ OCHCNT OJMPE, JMP OJMP CIF 0 JMS I DEVHND 4210 OUBUF, 4600 ORECNO, 0 JMP I (OUERR ISZ ORECNO ISZ MCCNT JMS OUSETP ISZ MECNT JMP OCHAR+2 JMP I (OUERR OUSETP, 0 TAD (-601 DCA OCHCNT TAD OUBUF DCA OUPTR TAD OJMPE DCA OJMP JMP I OUSETP OJMP, HLT /THREE-WAY JUMP FOR CHAR OUTPUT JMP OCHAR1 JMP OCHAR2 OCHAR3, TAD OJMPE DCA OJMP TAD OUTEMP RTL RTL DCA OUTEMP TAD OUTEMP AND OU7400 TAD I OUPOLD DCA I OUPOLD TAD OUTEMP RTL RTL AND OU7400 TAD I OUPTR DCA I OUPTR ISZ OUPTR JMP OUCOM OCHAR2, TAD OUPTR DCA OUPOLD ISZ OUPTR OCHAR1, TAD OUTEMP AND OU377 DCA I OUPTR OUCOM, JMP I OCHAR OCHCNT, 0 OUPOLD=OUSETP OUTEMP, 0 OU7400, 7400 OUPTR, 0 OU377, 377 /CLOSE OUTPUT FILE OCLOS, TAD (232 JMS OCHAR TAD OCHCNT CMA SZA CLA JMP .-4 JMS OCHAR TAD I (EASGN JMS I (200 4 ML7601, 7601 MCCNT, 0 JMP I (OUERR TAD (TTYOUT DCA TYPE JMP I (MAPRTN TTYOUT, 0 6046 6041 JMP .-1 ML7600, 7600 JMP I TTYOUT TTYNO, 0 /SET TO TTY DEVICE NUMBER BY INITIALIZATION IONULL, 0 TAD ML7600 DCA I (HLASZA ML7604, 7604 /POINTER TO FILE EXT. WORD JMP I IONULL PAGE LOAD, 0 DCA LREQUR TAD BANK TAD (HLAZ DCA HLAPTR JMS I (SETRCN /SET UP HLA AND RCON TAD RCON CLL CML TAD LREQUR TAD (400 SNL SZA CLA JMP LFAILD TAD RECNO DCA LRECNO CLA CMA DCA INCHCT JMS ICHAR SNA CLA JMP .-2 JMP I (MORE ICHAR, 0 TAD XX7600 /PARITY TTY HACK KRS TAD (-7603 SNA CLA KSF SKP JMP I (MGET /17667=07605 ISZ IJMP ISZ INCHCT IJMPE, JMP IJMP CIF 0 JMS I DEVHND INCTLW, 0410 INBUF, 4600 LRECNO, 0 JMP INCKEF INISZ, ISZ LRECNO ISZ LRECNO TAD IN6377 DCA INCHCT TAD INBUF DCA INPTR TAD IJMPE DCA IJMP JMP ICHAR+1 IJMP, HLT /THREE-WAY JUMP FOR CHAR INPUT JMP ICHAR1 JMP ICHAR2 ICHAR3, TAD IJMPE DCA IJMP TAD I INPTR ISZ INPTR AND IN7400 CLL RTR RTR TAD INTEMP RTR RTR JMP INCOM ICHAR2, TAD I INPTR ISZ INPTR AND IN7400 DCA INTEMP ICHAR1, TAD I INPTR INCOM, AND IN377 JMP I ICHAR INCKEF, SMA CLA JMP LRECNO+2 JMP I (INERR INPTR, 0 INCHCT, 0 INTEMP, 0 IN7400, 7400 IN377, 377 IN6377, 6377 XX7600, XER2, 7600 TAD EASGN TAD (DCB-1 DCA TM2 TAD I TM2 SPA CLA JMP DIRDEV TAD (2205 JMS I (TTWO TAD (1417 JMS I (TTWO TAD (0104 JMS I (TTWO JMS I (CRLF DIRDEV, TAD I HLAPTR ISZ BANK CMA AND XX7600 JMP LOAD+1 LFAILD, ISZ BANK JMP LOAD+2 EASGN, 0 LREQUR, 0 LOADOK, JMS I (WRPGBF JMP I LOAD SETS1, 0 TAD (S1-1 DCA X2 TAD I X1 DCA I X2 TAD I X1 DCA I X2 TAD I X1 DCA I X2 JMP I SETS1 PAGE / 4600-5177 USED FOR LOADER MAP OUTPUT BUFFER / 5200-5577 USED FOR LIBRARY DIRECTORY BUFFER *5600 /** CAN ONLY USE FIRST HALF OF THIS PAGE - 2ND HALF IS PART OF MST /** NO LITERALS IN THIS PAGE! LBRY, TAD RECNO JMS LBSRCH JMP I .+1 GETCD LBSRCH, 0 /LIBRARY SEARCH ROUTINE DCA LBREC /SAVE START BLK OF LIBRARY CIF 0 JMS I DEVHND /READ LIBRARY DIRECTORY LBCTLW, 0210 L5200, 5200 LBREC, 0 JMP I LIOERR TAD LBCTLW DCA I LINCTL TAD L7177 DCA I LIN6377 DCA I LINISZ TAD L5177 DCA X1 /INITIALIZE FOR SEARCH LBRYLP, JMS I LSETS1 /GET NEXT DIRECTORY ENTRY TAD I X1 SNA JMP I LBSRCH /END OF DIRECTORY TAD L5200 DCA LBFPTR JMS I LSEARCH /IS IT IN SYMTAB? JMP LBRYLP /NO TAD I LSYMNUM TAD LTVEC1 DCA TM1 CDF 0 TAD I TM1 CDF 10 SZA CLA /IS SYMBOL ALREADY DEFINED? JMP LBRYLP /YES LBLDLP, TAD I LBFPTR /GET MODULE TO LOAD SNA JMP LBRYLP-2 /NO MORE MODULES TO LOAD AND L177 IAC TAD LBREC DCA RECNO DCA BANK TAD I LBFPTR AND L7600 JMS I LLOAD /LOAD LIBRARY MODULE ISZ LBFPTR JMP LBLDLP /GET NEXT MODULE LBFPTR, 0 LIOERR, INERR LINCTL, INCTLW L7177, 7177 LIN6377, IN6377 L5177, 5177 LSETS1, SETS1 LSEARCH, SEARCH L177, 177 L7600, 7600 LLOAD, LOAD LSYMNUM, SYMNUM LINISZ, INISZ LTVEC1, TVEC-1 IFZERO .-5700&4000 <LBRERR, _ERROR> /MAIN LOADING CODE /MODIFIED VERSION OF /PAPER-TAPE LINKING LOADER /DEFINITIONS BCRT= 200 TVEC= 300 ORGT= 100 /LOCAL SYMBOL TABLE NOW IN FIELD 0 MST= 6177 /MAIN SYMBOL TABLE *6200 /START OF PROGRAM - INITIALIZATION START, 0 TAD K7600 /SET COUNTER FOR 200 DCA NSUB TAD BCRTA /POINTER TO BANK TABLE DCA X3 CDF 00 DCA I X3 /CLEAR BANK TABLE & TV TABLE ISZ NSUB JMP .-2 /NOT DONE CDF 10 TAD M10 DCA NSUB TAD HLAZA DCA X3 TAD K777 DCA I X3 /BANK0 HIGHEST LOADED ADDR. =777 ISZ NSUB /NSUB INCREMENTS TO ZERO JMP .-2 DCA COML /INIT. OLD COMMON AT 0000 JMP I START /REENTRY FOR NEXT ROUTINE TO BE LOADED MORE, DCA LMTC /CLR LOCAL SYMBOL COUNT DCA CSUM /CLR CHECKSUM TAD MORE1A /SET FOR RETURN TO MORE1 IF LEADER DCA EOF MORE1, JMS RWORD TAD RC10A /RESET EOF TO WATCH FOR TRAILER DCA EOF TAD CODE /CK FOR HIGH COMMON TAD M12 SZA CLA JMP I ER5P /NOT THERE TAD COML CIA CLL CML /IF NO COMMON EXISTS, OR TAD WORD /IF NEW COMMON .LE. OLD IT'S SNL SZA CLA /OK, ELSE ERROR JMP I ER3P TAD COML SNA CLA TAD WORD /IF NO PREVIOUS COMMON AND IF AND K7600 /THIS PROGRAM HAS COMMON ABOVE 177 SNA /THEN SET COMMON LIMIT TO LIMIT OF THIS PROG JMP GETSW AND K7400 TAD K377 /HIGH COMMON MUST BE AT A MULTIPLE OF 400 DCA COML TAD I HLA1P /IF WE HAVE LOADED SZA CLA /ANY CODE INTO FIELD 1 JMP I ER3P /IT'S AN ERROR TAD COML /SET BANK1 HIGHEST LOADED ADDRESS DCA I HLA1P JMS I (SETRCN /SET UP HLA AND RCON AGAIN JUST IN CASE GETSW, TAD BANK /BANK NUMBER TAD TOPCOR /OK FOR NON-EX. MEM. SMA CLA JMP I ER2I /TOO BIG / /MAIN LOADING LOOP / LOOP, JMS RWORD TAD BASE /LOCATE CORRECT FUNCTION TAD CODE /IN TRANSFER TABLE DCA CODE CODE, 0 /TRANSFER TO APPROPRIATE ADDRESS /READ 12-BIT COMPUTER WORD & 4-BIT RELOCATION CODE /FROM 2 INPUT CHARACTERS RWORD, 0 JMS I HSRPA /FIRST FRAME DCA WORD TAD WORD /EXTRACT RELOC. CODE RTR RTR AND K17 DCA CODE TAD CODE /CK FOR LEADER TAD M10 SNA CLA JMP I EOF /YES TAD WORD /ADD TO CHECKSUM TAD CSUM DCA CSUM JMS FORMWD JMS I RCHARP TAD WORD DCA WORD JMP I RWORD FORMWD, 0 TAD WORD RTR RTR RAR AND K7400 /ISOLATE HI 4 BITS DCA WORD /FROM 1ST CHAR JMP I FORMWD /DATA EOF, 0 LMTC, 0 K17, 17 K377, 377 K777, 777 K7400, 7400 K7600, 7600 M10, -10 M12, -12 BASE, JMP I TRTAB BCRTA, BCRT-1 HLAZA, HLAZ-1 HSRPA, ICHAR MORE1A, MORE1 RCHARP, RCHAR TOPCOR, 0 HLA1P, HLA1 ER2I, ER2 /RELOCATION CODE TRANSFER TABLE TRTAB, RC0 /LOAD AS IS RC1 /ADD RELOCATION CONSTANT ER5 RC3 /DEFINE SYMBOL RC4 /ORIGIN RC5 /CDF TO CURRENT BANK RC6 /REPLACE LOCAL # WITH GLOBAL # ER5 RC10A, RC10 /LEADER-TRAILER ER5 ER3P, ER3 /HIGH COMMON ER5P, ER5 ER5 ER5 ER5 RC17 /EXTERNAL SYMBOL SPECIFICATION PAGE /NEW ORIGIN RC4, TAD WORD /NEW ORIGIN CLL TAD RCON /+ RELOCATION CONSTANT DCA CUR /= NEW LOADING ADDRESS SZL JMP I OVERFP /FIELD OVERFLOW JMP I LOOPP1 / /CHANGE CDF TO CURRENT BANK / RC5, TAD BANK /MOVE BANK TO BITS 6-8 CLL RTL RAL TAD WORD /PICK UP CDF JMP RC1+2 / /REPLACE LOCAL EXTERNAL SYMBOL NUMBER WITH GLOBAL EXT. SYM. NO. / RC6, TAD WORD AND K77 /EXTRACT LOCAL NUMBER DCA B1 TAD B1 /CK IF LOCAL # .LE. LOCAL SYM. COUNT CIA TAD I LMTCP1 SPA CLA JMP I ER5I /NO TAD B1 /ADD LOCAL # TO BASE OF TABLE TAD ORGTA DCA B1 TAD WORD /LOAD ARG COUNT AND K7700 KCDF, CDF 0 TAD I B1 /+ GLOBAL # CDF 10 JMP RC1+2 /AT CURRENT LOADING ADDRESS /ADD RELOCATION CONSTANT TO WORD RC1, TAD WORD TAD RCON DCA WORD / /LOAD WORD DIRECTLY AS IT IS / RC0, TAD HLA /CK FOR CURRENT ADDRESS TO LOAD CIA CLL /.GE. HIGHEST ALREADY LOADED TAD CUR SNL CLA JMP .+3 /NO TAD CUR /YES, RESET HIGHEST DCA HLA CLL TAD CUR /CK FOR ATTEMPT TO LOAD TOP PAGE TAD K200 SZL CLA JMP I OVERFP /YES, ROUTINE IS TOO BIG CLA CMA TAD BANK SZA CLA JMP JUSTLD CLL CML CLA RTR TAD CUR SZL SPA CLA JMP GT2000 TAD OVLYFG K7700, SMA CLA JMP OFFSET JMS I (CVTREC TAD (-11 JMP PAGEX2 GT2000, TAD CUR CLL TAD (-3600 SZL CLA JMP PAGEX1 JMS I (WROVLY CLA CMA DCA OVLYFG JMP JUSTLD PAGEX1, TAD K200 JMS I (CVTREC PAGEX2, TAD (MTEMP+11 JMS I (WRPGBF CLA CLL CML RTR TAD CUR SZL SPA CLA TAD K200 TAD CUR AND (377 TAD (1400 JMP JUSTLD+1 OFFSET, CLA IAC DCA OVLYFG TAD (1600 JUSTLD, TAD CUR DCA CURX TAD BANK CLL RTL RAL TAD KCDF DCA .+2 TAD WORD HLT DCA I CURX CDF 10 ISZ CUR JMP I LOOPP1 CURX, 0 / /DATA / K77, 77 K200, 200 ER5I, ER5 LMTCP1, LMTC LOOPP1, LOOP ORGTA, ORGT OVERFP, OVERFL HLAZ, 0 /HLA GROUP MUST REMAIN IN GIVEN ORDER HLA1, 0 HLA2, 0 HLA3, 0 HLA4, 0 HLA5, 0 HLA6, 0 HLA7, 0 B1, HLATST, 0 TAD HLAZ TAD HLAIO HLASZA, SZA CLA /SET TO CLA BY /R AND RESTART JMP I (UIOERR JMP I HLATST HLAIO, -777 PAGE /SYMBOL DEFINITION RC3, JMS I GTSYMP TAD TVM1 /ADJUSTED BASE OF TRANSFER VECTOR TABLE TAD SYMNUM /+ NUM. OF SYMBOL IN MST DCA C1 TAD RCON /LOADING ADDRESS OF THE SYMBOL TAD WORD CDF 00 DCA I C1 /TO THE TRANS. VEC. TABLE TAD C1 /GET POINTER INTO TRANSFER VECTOR TABLE TAD M100A /FORM CORRESPONDING POINTER INTO BANK TABLE DCA C1 /=PTR. TO BANK TABLE STORAGE TAD BANK /GET BANK IN BITS 6-8 CLL RTL RAL DCA I C1 /STORE IN BANK TABLE CDF 10 RC3A, TAD NSUB /CHECK FOR TOO MANY SYMBOLS TAD M100A SPA SNA CLA JMP I LOOPP2 /NO JMP ER1 / /TRANSFER VECTOR / RC17, TAD WORD /COUNTER OF SYMBOLS TO COME CIA DCA C2 RC17A, JMS I GTSYMP ISZ I LMTCP2 /INC. LOCAL SYM. CTR. TAD ORGTA2 /GET PTR TO STORAGE IN ORIG. TABLE TAD I LMTCP2 DCA C1 CMA /SYM. # -1 TO ORIG. TABLE TAD SYMNUM CDF 0 DCA I C1 CDF 10 ISZ C2 /CK CTR. JMP RC17A /NOT DONE JMP RC3A /ERRORS SIOERR, H7600, 7600 DCA ERBACK IAC HNDERR, IAC ERSTAD, IAC INERR, IAC OUERR, IAC ER5, IAC /ILLEGAL INPUT FORMAT ER4, IAC /CHECKSUM ERROR ER3, IAC /HIGHEST COMMON NOT FIRST ER2, IAC /PROGRAM TOO LARGE ER1, IAC /SYMBOL TABLE OVERFLOW UIOERR, DCA C3 JMS CRLF TAD K0522 /"ER" JMS TTWO TAD K2217 /"RO" JMS TTWO TAD K2240 /"R " JMS TTWO TAD C3 /# JMS TOCT JMS I (WRPGBF ERBACK, JMP I (CDCALL CDF CIF 0 JMP I H7600 /RETURN TO MONITOR / /TYPE A CARRIAGE RETURN & LINE FEED / CRLF, 0 TAD K215 JMS I TYPE TAD K212 JMS I TYPE JMP I CRLF / /UNPACK & TYPE 2 6-BIT CHARACTERS / TTWO, 0 DCA C1 CMA /SET FLAG FOR 1ST CHARACTER DCA C2 TAD C1 /MOVE LEFT HALF DOWN RTR RTR RTR SKP TTWO1, TAD C1 /GET RIGHT HALF AND C77 TAD M40 /200 OR 300 GROUP? SPA TAD K100 /300 + 6BIT TAD K2240 /200 + 6BIT JMS I TYPE ISZ C2 /2ND CHARACTER DONE? JMP I TTWO JMP TTWO1 /NO / /TYPE OCTAL CONTENTS OF AC / TOCT, 0 DCA C1 TAD M4B DCA C2 TOCT1, TAD C1 /MOVE NEXT DIGIT INTO BITS 9-11 RTL RAL DCA C1 TAD C1 /GET DIGIT RAL AND KK7 TAD C260 /CONVERT TO ASCII JMS I TYPE ISZ C2 JMP TOCT1 /MORE TO GO JMP I TOCT / /DATA / C1, 0 C2, 0 C3, SYMNUM, 0 KK7, 7 C77, 77 K100, 100 K212, 212 K215, 215 C260, 260 K0522, 0522 K2217, 2217 K2240, 2240 M4B, -4 M40, -40 M100A, -100 GTSYMP, GETSYM LMTCP2, LMTC LOOPP2, LOOP ORGTA2, ORGT TVM1, TVEC-1 PAGE /STORE OR LOOK UP SYMBOL IN SYMBOL TABLE DEFN, 0 /READ A SYMBOL FROM INPUT ASCII - 6 FRAMES CLA CLL CMA RTL DCA D1 TAD S1A /POINTER TO 3 WORD BUFFER DCA X3 RSYM1, JMS RCHAR AND K0077 /EXTRACT 6-BIT CLL RTL RTL RTL DCA D3 /SAVE LEFT HALF JMS RCHAR AND K0077 /GET RIGHT HALF TAD D3 DCA I X3 ISZ D1 JMP RSYM1 /NOT DONE JMP I DEFN / /SEARCH SYMBOL TABLE FOR CURRENT SYMBOL (IN S1-S3) / SEARCH, 0 DCA I SYMNMP /CLR SYMBOL COUNTER TAD MSTA /SET SYMBOL TABLE PTR DCA D4 TAD NSUB /SET CTR FOR NUMBER OF SYMBOLS CMA /+1 (IN CASE NSUB=0) DCA D5 JMP SRCH2 SRCH1, ISZ I SYMNMP /KEEP COUNT TAD D4 /TEST TABLE ENTRY DCA X4 /SYM. TAB. PTR CLA CLL CMA RTL DCA D2 /COUNTER TAD S1A DCA X3 /PTR TO S1/S3 COMP1, TAD I X4 /COMPARE WORDS CIA TAD I X3 SZA CLA JMP NOMACH /NOT ALIKE ISZ D2 JMP COMP1 /TRY NEXT WORD OF TRIPLET ISZ SEARCH JMP I SEARCH NOMACH, CLA CLL CMA RTL TAD D4 DCA D4 SRCH2, ISZ D5 JMP SRCH1 /NOT DONE JMP I SEARCH / /ENTER A SYMBOL IN THE SYMBOL TABLE / INSERT, 0 TAD NSUB /(NUMBER OF SYMBOLS)*3 CLL RAL TAD NSUB CIA /SUBTRACT FROM BASE OF TABLE TAD MSTA DCA X3 /FOR POINTER TAD S1 /1ST WORD DCA I X3 TAD S2 /2ND DCA I X3 TAD S3 /3RD DCA I X3 ISZ NSUB /COMPUTE SYM. TAB. NUMBER TAD NSUB DCA I SYMNMP JMP I INSERT / /CORE OVERFLOW / OVERFL, TAD BCRTA3 DCA D1 TAD TVECA3 DCA D2 TAD M100 DCA D3 CDF 00 OVERF2, TAD I D1 /CK FOR CDF IN BCRT SPA CLA JMP .+3 /YES DCA I D1 /NO, CLEAR IT DCA I D2 /CLEAR TV WORD ISZ D1 ISZ D2 ISZ D3 JMP OVERF2 /MORE TO GO CDF 10 JMP I ER2P GETSYM, 0 /GET SYMBOL AND SEARCH TABLE JMS DEFN JMS SEARCH JMS INSERT JMP I GETSYM /READ 1 FRAME & ADD TO CHECKSUM RCHAR, 0 JMS I HSRPB DCA D4 TAD D4 TAD CSUM DCA CSUM TAD D4 JMP I RCHAR SETRCN, 0 /SUBR TO SET HIGHEST-LOADED ADDRESS (HLA) TAD I HLAPTR /AND RELOCATION CONSTANT (RCON) DCA HLA TAD HLA AND (7600 DCA RCON JMP I SETRCN MAIN, 1501;1116;4040 /"MAIN" / /DATA / D1, 0 D2, 0 D3, 0 D4, 0 D5, 0 S1, 0 S2, 0 S3, 0 K0077, 77 M100, -100 BCRTA3, BCRT ER2P, XER2 HSRPB, ICHAR MSTA, MST-3 S1A, S1-1 SYMNMP, SYMNUM TVECA3, TVEC PAGE /TRAILER CODE EXIT RC10, JMS I (FORMWD JMS I HSRP /GET LOW ORDER PART TAD WORD CIA TAD CSUM /COMPARE WITH ACCUMULATED SUM SZA CLA JMP I ER4P /NOT EQUAL TAD BCRTA4 DCA T1 TAD TVECA DCA X2 TAD M100D DCA T3 K6201A, CDF 00 RC10Z, TAD I X2 /GET TV ENTRY SNA CLA JMP .+5 /NOT DEFINED; IGNORE IT TAD I T1 /GET BCRT WORD AND K70 /EXTRACT BANK TAD K6201A /COMBINE CDF DCA I T1 ISZ T1 ISZ T3 JMP RC10Z /NOT DONE YET CDF 10 TAD HLA /STORE HIGHEST LOADED ADDRESS DCA I HLAPTR /IN PROPER LOC. (HLA0-7) JMP I (LOADOK /LOADER MAP PRINT ROUTINE CONTINUED MAPX, SNL CLA /IF LINK=1 ONLY PRINT PAGE COUNTS, TAD NSUB /OTHERWISE PRINT SYMBOLS CMA DCA T1 /CTR OF ROUTINES TAD MSTA4 /SYMB. TAB. PTR. DCA X1 TAD TVECA /TV PTR DCA X2 TAD BCRTA4 /BCRT PTR DCA T4 TAD (2640 /PRINT V# JMS I TTWOP TAD (VERSION+PATCH JMS I TTWOP JMS I CRLFP JMP PRINT1 PRINT, TAD TM1 RTR CLL CDF 0 TAD I X2 CDF 10 DCA TM2 TAD TM2 SNL SZA CLA JMP PIGNOR TAD I X1 JMS I TTWOP TAD I X1 JMS I TTWOP TAD I X1 JMS I TTWOP TAD K4040 /2 SPACES JMS I TTWOP CDF 00 TAD I T4 /PRINT BANK NUMBER CDF 10 RTR RAR AND K7B TAD K260 JMS I TYPE TAD TM2 /PRINT SYMBOL VALUE JMS I TOCTP TAD TM2 /IF ADDRESS=0,IT IS UNDEFINED SZA CLA JMP .+3 /ITS OK TAD K4025 /TYPE SPACE,U JMS I TTWOP JMS I CRLFP TAD M03 PIGNOR, TAD M03 TAD X1 DCA X1 ISZ T4 PRINT1, ISZ T1 JMP PRINT /JUMP IF MORE SYMBOLS, ELSE FALL INTO NEXT PG PAGES, TAD FCTR /SET CTR FOR CORRECT # OF BANKS DCA T1 TAD (HLAZ-1 /INIT. PTR. TO HLA LIST DCA X1 TAD I X1 /GET HLA OF NEXT BANK CMA RTL /DIVIDE BY 200 AND COMPLEMENT RTL RTL AND K37 /=NUMBER OF PAGES LEFT + 1 SZA TAD (-1 /REDUCE IF NON-ZERO JMS I TOCTP JMS I CRLFP ISZ T1 JMP PAGES+4 /NOT DONE WITH ALL BANKS JMP I (OCLOS / /DATA / FCTR, 0 /# OF HIGHEST MEM. FIELD K37, 37 T1, 0 T3, 0 T4, 0 K7B, 7 K70, 70 K260, 260 K4025, 4025 K4040, 4040 M03, -3 BCRTA4, BCRT CRLFP, CRLF ER4P, ER4 HSRP, ICHAR MSTA4, MST-3 TOCTP, TOCT TTWOP, TTWO TVECA, TVEC-1 M100D, 7700 PAGE /WROVLY IS USED TO STORE THE FIELD COUNT FOR THE PROPGT /ROUTINE- PROPGT IS CALLED THE FIRST TIME THAT IOTEST IS /CALLED-SEE LOC.325 IN FIELD ZERO(APPROX.) BC1000, 1000 WROVLY, 0 TAD OVLYFG SPA SNA CLA JMP I WROVLY CIF 0 JMS I (SHNDLR 0110 1600 MTEMP JMP I (SIOERR CIF 0 JMS I (SHNDLR 5010 1600 MTEMP JMP I (SIOERR DCA OVLYFG JMP I WROVLY WRPGBF, 0 DCA PRECNO TAD WRBFSW SNA JMP PREAD CIA TAD PRECNO SNA CLA JMP I WRPGBF CIF 0 JMS I (SHNDLR 4210 1400 WRBFSW, 0 JMP I (SIOERR PREAD, DCA OLDT9 TAD PRECNO SNA CLA JMP SETBF CIF 0 JMS I (SHNDLR 0210 1400 PRECNO, 0 JMP I (SIOERR SETBF, TAD PRECNO DCA WRBFSW JMP I WRPGBF /LOADER CLEANUP CODE - PREPARES TO RETURN TO OS/8 LDRXIT, CDF 10 TAD I (HLA1 TAD BC200 L7700, SMA CLA /DID WE LOAD OVER THE LOADER? TAD (FIVE /NO DCA WROVLY /WROVLY=0 OR 5 CIF 0 JMS I (SHNDLR 0201 400 MTEMP+21 /READ BACK THE RUN-TIME ROUTINES JMP I (SIOERR /BADDIE TAD K1600 CDF 0 DCA I ST1600 TAD I P4 DCA I P5 ISZ P4 ISZ P5 ISZ P6 JMP .-5 /ALSO MOVE 16-32 INTO LOC 100 CDF 10 JMS I BC200 13 /RESET EVERYTHING TAD I (MPARAM AND (40 /GET "/G" SWITCH SNA CLA JMP CALMON /GO SWITCH NOT ON JMS I BC200 11 /KICK MONITOR OUT CDF CIF 0 TAD (MSTCDF DCA I (FIVE+1 /GO TO PROGRAM START ADR INSTEAD OF 7600 ISZ I (ONE /OPTOMIZE READ A LITTLE ON DECTAPE JMP I WROVLY CALMON, CLA CMA DCA I L7700 /INDICATE I/O MONITOR IS IN CORE CDF CIF 0 JMP I WROVLY /GET OUT ST1600, 177 /THIS IS SET TO "FINBUF" OR "FOUBUF" BY /I AND /O P4, 16 P5, 100 P6, -15 /ROUTINE TO TEST FOR /I AND /O SWITCHES IOTEST, 0 TAD I (MPARAM AND (10 SNA CLA //I? JMP .+4 JMS I (HLATST CDF CIF 0 JMS I (INPENB TAD I (MPARAM+1 BC200, AND BC1000 SNA CLA //O? JMP .+4 JMS I (HLATST CDF CIF 0 JMS I (OUPENB ISZ DOPROP /SHOULD WE PROPAGATE RESIDENT(AND WRITE OUT JMP .+4 /THE RUN-TIME ROUTINES?)--NO TAD WROVLY /YES-FIELD COUNT IS IN WROVLY CDF CIF 0 JMS I (PROPGT /DO IT JMP I IOTEST K1600, 1600 /RESET TO 2000 IF TWO PG.DEV.HNDLRS AT RUN TIME DOPROP, 7777 /ONCE-ONLY FLAG FOR PROPAGATING FIELD ZERO /RESIDENT AND WRITING OUT RUNTIME ROUTINES /NOT RESET AFTER /R!!!! /SET TO -2 IF CALLED BY ".R LOADER" /BECAUSE OF USELESS INIT CALL TO IOTEST PAGE $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 | /SABR ASSEMBLER, V17 / / / / / / / / / /COPYRIGHT (C) 1974 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / / /NOTE: WHENEVER ABOVE VERSION NUMBER IS CHANGED /BE SURE TO ALSO CHANGE VERSION NUMBER FOR TYPEOUT. /THIS IS AT VERSN+13 (ABOUT P. 83) / /THERE ARE TWO BASIC PHASES OF OPERATION WITHIN /SABR:(A) COLLECTION AND (B) ASSEMBLY. IN PASS 1 /SABR COLLECTS A FULL PAGE OF DATA AND THEN /ASSEMBLES THE FULL PAGE. IN PASS2 COLLECTION /AND ASSEMBLY ARE CARRIED OUT ON A LINE- /BY-LINE BASIS RATHER THAN PAGE-BY- /PAGE. FOLLOWING IS A DESCRIPTIVE FLOW CHART OF /THE PRINCIPAL METHODS OF OPERATION USED IN /THE PROGRAM DURING PASS1. /(1) BEGINNING AT START THERE ARE TWO ROUTINES NECESSARY /TO INTIALIZE THE ENTIRE PROGRAM. IOINIT CARRIES /OUT THE DIALOG WITH THE USER TO DETERMINE WHICH /I/O DEVICES WILL BE USED. INITA INTIALIZES ALL /THE FLAGS AND TABLES WHICH ARE USED CONTINOUSLY /THROUGHOUT THE PROGRAM. /(2) THE DRIVER FOR THE FULL PAGE-BY-PAGE ASSEMBLER /IS CONTAINED IN THE LOOP THAT RUNS FROM RSTRT /TO RSTRT6-1. THIS LOOP OPERATES AS FOLLOWS. /FIRST IT CALLS INILPT WHICH INITIALIZES ALL /THOSE FLAGS AND TABLES WHICH MUST BE /REFRESHED OR REBUILT FOR EACH PAGE OF CODE. /THEN IT CALLS THE MAIN LINE-BY-LINE /COLLECTION LOOP (WHICH IS DESCRIBED IN ITEM 3). /WHEN A FULL PAGE OF CODE HAS BEEN COLLECTED /THE DRIVER THEN CALLS L55 TO ASSEMBLE THE /PAGE (SEE ITEM 8). /(3) THE COLLECTION LOOP RUNS FROM RSTRT1 THROUGH /THE CODE AT RSTRT6. THIS LOOP FIRST CALLS /INCPT WHICH PREPARES FLAGS AND INCREMENTS /TABLE POINTERS FOR EACH LINE OF CODE. IT /THEN CALLS THE LINE DECODER DCIL (SEE /ITEM 4) FOLLOWED BY SETCT, THE ROUTINE WHICH /INCREMENTS THE PAGE COUNTERS AS REQUIRED /FOR THE GIVEN LINE (SEE ITEM 6). THEN /THE COLLECTIONS LOOP PROCEEDS TO INTERPRET /THE DATA LEFT BY DCIL AND STORE IT, PROPERLY /CODED, ON THE PAGE TABLE. IF THERE WAS /A TAG ("LFS" FOR "LOCATION FIELD SYMBOL") IT /IS NECESSARY TO CALL RECT FOR A PAGE RECOUNT. /(SEE ITEM 7). THEN THE SIZE OF THE PAGE SO /FAR COLLECTED IS TALLYED UP BY CPGES. IF /IT IS STILL .LE. 200. EVERYTHING IS FINE AND WE /RUN THROUGH THE LOOP AGAIN. IF NOT WE /FIRST SAVE (USING PUSHIN) /ALL THE KEY INFORMATION ABOUT THE LINE WHICH /CAUSED THE OVERFLOW AND THEN EXIT FROM THE /COLLECTION LOOP TO ASSEMBLE THE PAGE. /(4) CERTAIN NOTES ABOUT DCIL MAY BE HELPFUL. THIS /ROUTINE CONTROLS INPUT OF THE SOURCE. INDEV /(SET BY IOINIT) POINTS TO THE PROPER INPUT /ROUTINE, HSR OR ASR. THESE ROUTINES /READ ONE CHARACTER AT A /TIME FROM THE INPUT DEVICE. THE ROUTINE CALLED /R DRAWS CHARACTERS ONE AT A TIME FROM THE /INPUT BUFFER (DATA). WHEN THIS BUFFER IS /EMPTY R REFILLS IT USING @INDEV. FETCH /USES R TO EXTRACT ONE CHARACTER AT A TIME FROM /THE INPUT BUFFER AND DOES SOME PRELIMINARY /SCREENING. RLN USES FETCH TO READ A /FULL LINE OF CODE INTO THE LINE BUFFER. /L65 READS ONE CHARACTER AT A TIME FROM /THE LINE BUFFER. GTSYM READS THE LINE /ITEM-BY-ITEM. IF THE ITEM IS A SYMBOL, GTSYM /CALLS SRSYM TO LOOK UP THE ITEM IN THE /MAIN SYMBOL TABLE OR ENTER IT IF IT IS NOT /ALREADY THERE(SEE ITEM 5). /**IMPORTANT** /WHEN A SYMBOL HAS BEEN PLACED ON THE SYMBOL /TABLE THE ADDRESS OF THE FIRST WORD OF THE /ENTRY IS RETURNED AT "SYMBOL." THIS ADDRESS /IS UNIQUE FOR EACH SYMBOL AND IN THE /RANGE 2000-7575. THIS NUMBER IS USED /THROUGHOUT THE PROGRAM AS THE IDENTIFIER FOR /THIS SYMBOL. ** DCIL CONSIDERS EACH ITEM /OF THE LINE AND ACTS APPROPRIATELY. FOR /STANDARD INSTRUCTIONS A STRING OF KEY DATA ABOUT /THE LINE IS LEFT. IF THE LINE IS A PSUEDO-OP /DCIL WILL IMMEDIATELY CALL THE APPROPRIATE PSUEDO-OP /HANDLER TO TAKE ALL NECESSARY ACTION. MOST /OF THE PSUEDO-OP HANDLERS RETURN TO THE /BEGINNING OF DCIL WHERE THE NEXT LINE CAN BE /PROCESSED AS IF NOTHING UNUSUAL HAPPENED. THE /EXCEPTIONS TO THIS ARE THOSE PSUEDO-OPS WHICH /CAUSE A PREMATURE PAGE ASSEMBLY. /THE ROUTINE SKIPL IS ACTUALLY A SMALL PART OF /DCIL. IT HAS TWO PURPOSES. ONE, IT WATCHES /FOR LINES WHICH SHOULD BE IGNORED BECAUSE THE /FORTR PSUEDO-OP IS IN EFFECT. SECONDLY IT /MUST WATCH FOR SEMI-COLONS SO THAT /IF ONE IS ENCOUNTERED(OUTSIDE A COMMENT) /THE REMAINDER OF THE LINE CAN BE SAVED FOR /PROCESSING AS THE "NEXT" LINE. /(5)ONLY TWO MAIN ROUTINES SRSYM AND /OBSYM, TOGETHER WITH THEIR SUBSIDIARYS RUSVL AND SUSVL /MAY DIRECTLY CONTACT THE MAIN SYMBOL TABLE. /THESE ROUTINES COMMUNICATE WITH THE REST OF /THE PROGRAM THROUGH FOUR IMPORTANT /CELLS IN PAGE 0: /USE CONTAINS THE CODE WORD FOR THE SYMBOL ENTRY. /VAL CONTAINS THE VALUE OF THE SYMBOL. /SYMBOL CONTAINS THE ADDRESS OF THE FIRST WORD OF THE /ENTRY(NAMELY THE CODE WORD). /VALPTR CONTAINS THE ADDRESS OF THE VALUE WORD /OF THE ENTRY. /SRSYM, AFTER LOCATING A GIVEN SYMBOL IN THE TABLE /(OR ENTERING IT IF NECESSARY) /CALLS SUSVL TO FILL THE FOUR CELLS WITH THE /PROPER INFORMATION ABOUT THE SYMBOL. /OBSYM USES A SYMBOL IDENTIFIER TO GET /THE FOUR ESSENTIAL BITS OF INFORMATION, AGAIN /CALLING SUSVL TO DO THE WORK. HOWEVER /BEFORE EITHER SRSYM OR OBSYM DO ANYTHING /THEY BOTH MAKE USE OF RUSVL. RUSVL IS A /VERY IMPORTANT ROUTINE. HERE IS HOW IT WORKS. /LET US SUPPOSE THAT THE PROGRAM HAS OBTAINED /USE, VAL, SYMBOL AND VALPTR FOR A GIVEN /SYMBOL(USING SRSYM OR OBSYM). FURTHER, LET /US SUPPOSE THAT THE PROGRAM WISHES TO /MODIFY BOTH OR EITHER OF THE CODE AND VALUE /WORDS FOR THIS SYMBOL IN THE SYMBOL TABLE. /THE PROGRAM DOES NOT DIRECTLY ACCESS THESE /WORDS IN THE SYMBOL TABLE. INSTEAD THE /PROGRAM MERELY MAKES THE DESIRED MODIFICATIONS /TO USE AND VAL. NOW SYMBOL AND VALPTR /ARE THE POINTERS FOR STORING THIS NEW INFORMATION /BACK IN THE TABLE. IT IS VERY IMPORTANT THAT /NO PART OF THE PROGRAM EXCEPT SRSYM AND OBSYM /EVER MODIFY SYMBOL OR VALPTR, AND BEFORE /EITHER OF THESE MODIFY THEM THEY ALWAYS CALL /RUSVL. RUSVL TAKES USE AND VAL /INCLUDING ANY MODIFICATIONS THAT HAVE BEEN /MADE TO THEM AND STORE THESE WORDS BACK /IN THE TABLE USING THE STILL UNCHANGED POINTERS /SYMBOL AND VALPTR. IN THIS WAY MODIFICATIONS /TO THE SYMBOL TABLE ARE MADE IN TWO STAGES. /THE FIRST STAGE CONSISTS OF A SIMPLE REFERENCE /TO ONE OF TWO PAGE 0 LOCATIONS, AND THE /SECOND STAGE IS TAKEN CARE OF AUTOMATICALLY /DURING FURTHER OPERATION OF THE PROGRAM. /(6)SETCT AND CPGES DEAL WITH FIVE SEPARATE PAGE /COUNTERS. THE SUM OF THESE IS THE NUMBER /OF WORDS OF CORE NECESSARY TO ASSEMBLE THE CURRENT /COLLECTED DATA. PTSZE (PAGE TABLE SIZE) IS THE /NUMBER OF ITEMS - CONSTANTS,ADDRESS PARAMETERS /AND INSTRUCTIONS - WHICH HAVE BEEN SO FAR /COLLECTED. LTSZE IS THE NUMBER OF DISTINCT LITERALS /WHEN ARE REQUIRED ON THE CURRENT PAGE. PGEESC /WILL BE EITHER 2 OR 4. IT IS /2 IF THE LAST COLLECTED INSTRUCTION WAS NOT A /SKIP INSTRUCTION, 4 OTHERWISE. THESE ARE THE /NUMBER OF WORDS REQUIRED FOR THE PAGE /ESCAPE. THIS ITEM IS IGNORED WHEN THE AUTO- /MATIC PAGING SWITCH IS NON-ZERO. OPSCTR /IS THE NUMBER OF POINTERS TO OFF-PAGE SYMBOLS /WHICH ARE REQUIRED ON THE CURRENT PAGE. /THIS ITEM IS DETERMINED BY USE OF THE /PAGE SYMBOL TABLE. TWO TYPES OF SYMBOLS /ARE STORED ON THIS TABLE: TAGS(LFS'S) ON THE /CURRENT PAGE AND SYMBOLS WHICH ARE REFERENCED /BY MEMORY REFERENCE INSTRUCTIONS(AFS'S) ON THE /CURRENT PAGE. IN THIS TABLE SABR KEEPS TRACK OF /WHETHER THE SYMBOL IS ON-PAGE(I.E. IF IT OCCURS AS /A TAG ON THE PAGE) AND WHETHER IT HAS BEEN /REFERENCED EITHER SIMPLY OR WITH A NUMBER SIGN /(MEANING <SYM>+1). IF THE SYMBOL IS OFF-PAGE /AND HAS BEEN REFERENCED ON THE PAGE, ONE POINTER /IS REQUIRED ON THE ASSEMBLED PAGE FOR /EACH TYPE OF REFERENCE USED (SIMPLE OR #). /IN ADDITION CERTAIN INFORMATION REGARDING OBACTR /IS KEPT IN THE P.S.T. OBACTR KEEPS COUNT OF /THE NUMBER OF EXTRA INSTRUCTIONS WHICH MUST /BE GENERATED ON THE CURRENT PAGE. THESE /INCLUDE CDF'S TO CURRENT BANK (CODE05 6201'S), /CDF 00'S FOR REFERENCE TO COMMON, /(*) /JMS CDFSK/SKP PAIRS FOR CDF CUR'S FOLLOWING /SKIP INSTRUCTIONS, AND JMS CDZSK/SKP PAIRS FOR /CDF 00'S FOLLOWING SKIP INSTRUCTIONS. SUCH /CDF'S ARE NEEDED FOR OFF-PAGE REFERENCES WHENEVER /THE BANK REFERENCED IS NOT THE SAME AS PREVIOUSLY /(0 INSTEAD OF CURRENT=1 OR VICE-VERSA) OR WHEN /THE BANK IS UNKNOWN (=-1) AS AFTER A TAG, /AT THE START OF A PAGE, OR FOR ALL JMS'S. /OBACTR ALSO KEEPS COUNT OF EXTRA INSTRUCTIONS /NEEDED TO GENERATE OFF-PAGE INDIRECT REFERENCES. /FOR THESE EITHER 2 OR 4 EXTRA INSTRUCTIONS /ARE NEEDED DEPENDING ON WHETHER OR NOT THE /PREVIOUS INSTRUCTION WAS A SKIP INSTRUCTION. /IN THE PST AN UP-TO-DATE RECORD IS KEPT OF THE /NUMBER OF INCREMENTS TO OBACTR SPECIFICALLY /DUE TO EACH OFF-PAGE SYMBOL. IN VIEW /OF THE RECOUNT PROCEDURE DESCRIBED IN ITEM 7 /IT WOULD SEEM THAT THIS INFORMATION IS REDUNDANT /AND UNNECESSARY. HOWEVER, DURING THE DEBUGGING /STAGE OF THE PROGRAM WITH PASS 2 INCLUDED /I ENCOUNTERED SEVERAL SITUATIONS, WHICH I FIND /VERY DIFFICULT TO DESCRIBE, WHERE MORE IMMEDIATE /INFORMATION ABOUT OBACTR WAS NEEDED. I /AM NOT EVEN COMPLETELY SURE I UNDERSTAND WHY. /OBACTR MUST BE WATCHED CLOSELY. AT 6652 IN THE /PROGRAM THERE IS SOME CODE TO ASSIST IN /DEBUGGING THE PROGRAM IF PROBLEMS ARISE WITH /THE PAGE COUNT. /WHENEVER A NEW TAG IS ENCOUNTERED ON A /PAGE, SETCT USES CPLFS TO REDUCE /BOTH OPSCTR AND OBACTR APPROPRIATELY /SINCE WHAT PREVIOUSLY WERE OFF-PAGE REFERENCES /MAY NOW HAVE BECOME ON-PAGE REFERENCES. /(7) WHENEVER A TAG IS ENCOUNTERED ON A GIVEN /PAGE RECT IS CALLED TO GO THROUGH THE /ENTIRE CURRENT PAGE TABLE AND RECOUNT /THE PAGE. IT DOES THIS BY CALLING SETCT /AGAIN, ONCE FOR EACH ITEM ON THE PAGE TABLE. /THE ONLY THING REALLY ACCOMPLISHED HERE /IS THAT OBACTR IS RESET. OPSCTR IS /UNCHANGED AS WELL AS THE OTHER PAGE COUNTERS. /THE NEED TO RECOUNT OBACTR IS SHOWN /BY THE FOLLOWING EXAMPLE: / A, TAD B / TAD C / B, 0 / <PAGE FILLS UP> / C, 0 /NOW BECAUSE BANK IS UNKNOWN AFTER "A," /AND B IS UNDEFINED AS YET, "TAD B" /REQUIRES A CDF CUR. HENCE INCREMENT OBACTR. /"TAD C" IS OFF PAGE TOO, BUT REQUIRES NO /CDF SINCE IT IS IN THE SAME BANK. /HOWEVER WHEN B IS DEFINED ON PAGE, THE /CDF IT CAUSED IS NO LONGER NECESSARY, /BUT NOW THE "TAD C" REQUIRES A CDF. /(8) THE ROUTINE L55 CAUSES EACH PAGE TO BE ASSEMBLED. /DURING PASS 1 THERE ARE TWO SUB-PHASES TO THE ASSEMBLY. /FOR THE MOST PART BOTH PHASES RUN THROUGH THE /ENTIRE PAGE OF COLLECTED CODE USING THE /SAME ASSEMBLY ROUTINES. THE DIFFERENCE IS /THAT DURING PHASE 1 (ACTR=0) /ACTUAL OUTPUT IS SUPPRESSED. THE KEY /PURPOSE OF PHASE 1 IS TO DEFINE ALL THE /TAGS THAT OCCUR ON THE PAGE. CLEARLY THE /TAGS COULD NOT BE DEFINED DURING COLLECTION /BECAUSE AT THAT POINT WE WERE NOT SURE /WHAT SYMBOLS EVEN WERE ON PAGE, AND THUS /NOT SURE HOW MANY EXTRA INSTRUCTIONS /WOULD BE NECESSARY. THUS SUB-PHASE 1 OF THE /ASSEMBLY IS REQUIRED SO THAT IN THE /SECOND PHASE OF THE ASSEMBLY ON-PAGE /FORWARD REFERENCES CAN BE RESOLVED. HENCE /L55 CALLS THE ASSEMBLY ROUTINE ASMBL /TWICE FOR EACH PAGE OF CODE. /(9)AFTER INITIALIZING THE VARIOUS PAGE TABLE POINTERS /ASMBL GOES INTO A LOOP WHEREIN THE /LINE-BY-LINE ASSEMBLY ROUTINE ASM02 IS /CALLED ONCE FOR EACH ITEM ON THE PAGE TABLE. /ASM02 IS A HUGE ROUTINE OCCUPYING ABOUT /THREE FULL PAGES OF CODE. ASM02 FIRST /EXAMINES THE CODED DATA PERTAINING TO THE GIVEN /ITEM ON THE PAGE TABLE TO DETERMINE WHAT /TYPE OF INSTRUCTION IS TO BE ASSEMBLED AND /WHAT THE CURRENT BANK AND SKIP SETTINGS /ARE. THEN DEPENDING ON THIS ANALYSIS THE ROUTINE /TRANFERS TO THE PROPER SUBSECTION OF ITSELF /FOR HANDLING THIS TYPE OF INSTRUCTION. THERE /ARE A DOZEN OR MORE CASES WHICH MUST /BE DEALT WITH. THEN THE ROUTINE MOVES /TO ONE OF ITS VARIOUS EXIT STRINGS /TO COMPLETE THE ACTION AND SET THE BANK AND /SKIP CONDITIONS FOR THE NEXT LINE. AFTER ALL /ITEMS ON THE PAGE TABLE HAVE BEEN ASSEMBLED /IN THIS WAY ASMBL THEN CALLS THE ROUTINE /A2. A2 PRODUCES (IN PHASE 2) THE PAGE ESCAPE AND /THEN OUTPUTS THE ENTIRE LITERAL TABLE WITH /ALL THE OFF-PAGE POINTERS INTERMINGLED. /(10) SPECIAL CONSIDERATION SHOULD BE GIVEN TO OFF- /PAGE FORWARD REFERENCES SINCE THEY WILL REMAIN /UNRESOLVED WHEN THE CURRENT PAGE HAS BEEN /ASSEMBLED. DURING ASSEMBLY WHEN /A REFERENCE TO AN OFF-PAGE, OR AN AS YET /UNDEFINED SYMBOL IS ENCOUNTERED THE SYMBOL'S /IDENTIFIER IS STORED ON THE LITERAL/OFF-PAGE POINTER /TABLE. THEN WHEN A2 IS OUTPUTTING THE /LITERAL TABLE ANY STILL UNDEFINED SYMBOLS ARE /DEALT WITH AS FOLLOWS. THE SYMBOL'S INDENTIFIER /TOGETHER WITH THE LOCATION RESERVED IN THE CURRENT /PAGE FOR ITS VALUE ARE STORED ON THE OCCURRENCE /TABLE. THE LOCATION WHERE THE POINTER MUST BE /STORED IN THE CURRENT PAGE IS MERELY LEFT /BLANK AT THIS TIME. THEN LATER ON WHEN THIS SYMBOL IS /ENCOUNTERED AS A TAG THE ROUTINE LFSCK /WHICH PROCESSES TAGS DURING ASSEMBLY WILL /REMOVE THE ITEM FROM THE OCCURRENCE TABLE AND /OUTPUT IT PRECEEDING THE POINTER BY AN ORIGIN /TO THE CORRECT LOCATION. /(11) DURING PASS2 (THE LISTING PASS) MOST OF /THE SAME CODE IS USED TO PRODUCE THE /ASSEMBLY LISTING. HOWEVER THE TIMING IS /DIFFERENT. NOW THE COLLECTION-ASSEMBLY /ALTERATION IS CARRIED OUT ON A LINE-BY-LINE /BASIS RATHER THAN ON A PAGE-BY-PAGE BASIS. /(HOWEVER ALL THE PAGE TABLES AND COUNTERS MUST /STILL BE MAINTAINED JUST AS IN PASS1.) THE /PASS2 OPERATION DIFFERS FROM PASS1 IN THE /FOLLOWING RESPECTS. EACH TIME A LINE HAS /BEEN COLLECTED AND ITS DATA ENTERED INTO THE /PAGE TABLE IN THE NORMAL FIRST PASS WAY, /A CALL IS ISSUED TO THE LINE-BY-LINE /ASSEMBLY ROUTINE ASM02. SINCE ALL SYMBOLS /ARE NOW DEFINED THERE WILL BE NO UNRESOLVED /FORWARD REFERENCES ON OR OFF-PAGE. ASM02 ACTS /DURING PASS2 EXACTLY AS IT DOES DURING PASS1 /WITH ONE BIG EXCEPTION: THE BINARY OUTPUT ROUTINE /OUTBN IN SUPPRESSED AND IN ITS PLACE IS /SUBSTITUTED THE LISTING ROUTINE WRITE. /WHEN THE PAGE COUNTERS INDICATE THAT THE PAGE /IS FULL THE DRIVER ROUTINE WILL CALL L55 AS /USUAL. HOWEVER IN PASS2 THE TWO CALLS /TO ASMBL ARE BY-PASSED AND INSTEAD A SINGLE /CALL TO A2 IS ISSUED SO AS TO GET THE /LISTING TO THE PAGE ESCAPE, THE LITERALS AND /THE OFF-PAGE POINTERS. /(12) THE REASON FOR HAVING SEPARATE LITERAL TABLES FOR THE /COLLECTION AND THE ASSEMBLY PHASES OF /THE PROGRAM IS THAT DURING PASS2 BOTH /PHASES OF THE PROGRAM ARE OPERATING SIMUTANEOUSLY /AND BOTH ARE BUILDING LITERAL TABLES IN A /DIFFERENT WAY. /(13) THE PAGE ESCAPE TABLE, PEBSE, IS NECESSARY /IS THAT DURING PASS2 LOCATIONS /CANNOT BE ASSIGNED FOR LITERALS AND OFF-PAGE /POINTERS UNLESS THE FINAL PAGE ESCAPE /FOR THE PAGE IS KNOWN. HENCE THESE NUMBERS /ARE SAVED DURING PASS1. /(14) THE PAGE OP TABLE IS ACTUALLY A PART OF /THE PAGE TABLE. /(15) EXTERNAL SYMBOLS ARISE IN TWO WAYS: /FROM ENTRY STATEMENTS AND FROM CALL STATEMENTS. /THEY ARE ENTERED IN THE E.S.T. IN ORDER OF /APPEARANCE IN THE PROGRAM AND NUMBERED /ACCORDINGLY. THESE ARE THE NUMBERS WHICH THE /LOADER REFERS TO AS "LOCAL EXTERNAL NUMBERS." /(16) EQUIVALENCING OF TAGS /IS TREATED AS A PSEUDO-OP AND IS /HANDLED BY THE ROUTINE PBSS2. (INCIDENTALLY /SOME OF THE ODD NAMES IN THE SOURCE WERE /PASSED ON TO ME FROM THE ORIGINAL ICS /PROGRAM. I DID NOT CHANGE THEM MERELY BECAUSE /THEY MADE NO SENSE.) THE OPERATION IS THIS: /ALL EXTRA TAGS TO BE DEFINED AT A GIVEN LOCATION ARE /ENTERED AS A GROUP IN THE EQUIVALENCE TABLE, /AND A CODE BIT IS SET ON THE PAGE TABLE TO /INDICATE THAT SUCH A GROUP IS TO BE DEFINED /WHEN THE LOCATION HAS BEEN DETERMINED DURING /ASSEMBLY. ANUMCK DOES THE WORK OF DEFINITION. /(*) /V03 CHANGE NOTICE: / AS OF V03 THE SABR SYSTEM HAS / BEEN CHANGED SUCH THAT COMMON / WILL RESIDE IN FIELD 1 INSTEAD / OF FIELD 0. / THE ONLY CHANGES REQUIRED TO SABR / ITSELF ARE AS FOLLOWS / (1) HICOM=177 INSTEAD OF 777; / (2) PARG & ASMBL MUST NOW OUTPUT 6211'S / INSTEAD OF 6201'S FOR CDF'S TO COMMON. / NOTE: / THE COMMENTS HAVE NOT BEEN CHANGED TO / REFLECT THIS CHANGE. / ALSO, BANK = 0 IS STILL THE CONDITION / FOR REFERENCES TO COMMON. (BANK=1 / STILL MEANS BANK KNOWN TO BE CURRENT / AND BANK = -1 STILL MEANS BANK UNKNOWN.) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 | /SABR ASSEMBLER V18 / / / / / / / // / / / / /COPYRIGHT (C) 1971,1974,1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / / VERSION SABR.17 / OCTOBER 26, 1971 / C. MCCOMAS / R. LARY / B. CLOGHER /SABR.V17 DEC-08-A2D2-17 / OCTOBER 26,1971 /COPYRIGHT 1971, DIGITAL EQUIPMENT CORPORATION, MAYNARD MASSACHUSETTS 01754 / C. MCCOMAS/R. LARY/B. CLOGHER // / /FIXES TO SABR FOR V18 J.K 1975 / / .LITERAL POOL OVERFLOW / .INCORRECT LINE NUMBER WITH ERROR MESSAGE / / /ASSEMBLY, LOAD AND SAVE INSTRUCTIONS / / .PAL SABR.PA / .PAL SPATCH.PA / / .LO SABR$SPATCH$ / / .SA SYS SABR / / FIELD 1 / / / DEFINE LOCATIONS OF MONITOR SUBROUTINES / DISPL=10 CDFSK=35+DISPL CDZSK=41+DISPL DUMS=57+DISPL LINK=23+DISPL OBIS=45+DISPL OPIS=52+DISPL RTN=30+DISPL *1 USE, 0 VAL, 0 SYMBOL, 0 /PTR TO CURRENT USE WORD IN MST M7, -7 AS0, S0 OTP, CORE1-1 /OCC. TAB. PTR (NEXT FREE WORD BELOW) STT, STTP /PTR TO 1ST FREE WORD OF SYM. TAB. /(KEEP STT AFTER OTP FOR INITA) X0, 0 /LINE BUFFER INDEX X1, 0 /TEMP AUTOS X2, 0 X3, 0 /HSR BUFFER INDEX K2, 2 K4, 4 K3, 3 K130, 130 K30, 30 / INDIRRECT REFERENCES / ICPLFS, CPLFS /CHECK FOR AND PROCESS COLLECTION LFS CPGESI, CPGES CTYPE, L61 /CHARACTER TYPEOUT ROUTINE CRLF, L73 DUMMY, DUM /DUMMY ROUTINE GETCHR, L65 /ROUTINE TO READ NEXT CHAR GETSYM, GTSYM /ROUTINE TO INPUT AND DECODE NEXT SYMBOL INI, INILPT LFSCHK, LFSCK /CHECK FOR A LFS OBSYM, OBNSYM /OBTAIN SYMBOL FROM MST DCIL1, RDL1 NULLP, NULL OTYPE, L62 /OCTAL TYPEOUT ROUTINE OUTBIN, OUTBN /ROUTINE TO OUTPUT COMP WORD AND REL BITS OUTSKP, OUTSK /ROUTINE TO OUTPUT A SKIP INSTRUCTION POPEXP, POPEX PRSYMP, PRSYM PUNCH, L63 /BINARY PUNCH ROUTINE RDIL, DCIL /READ AND DECODE ONE INPUT LINE RECTI, RECT L55I, L55 SKIPL, L72 /SKIPS UNTIL A RETURN OR SEMICOLON SLITAB, SLTAB /SEARCH LITERAL TABLE SPSTAB, SPSTB /SEARCH PAGE SYMBOL TABLE SREST, L66 /ROUTINE TO SEARCH EXTERNAL SYMBOL TABLE STCE, SETCT TEST, TSCHR /ROUTINE TO TEST CHARACTERS FOR EQUALITY TYPE, L64 /TTY TYPE ROUTINE WLNP, WLN WRITEP, WRITE / / IMPORTANT VARIABLES / ACTR, 0 /ASSEMBLY COUNTER BSSSW, 0 /BSS 0 IN PROCESS SWITCH CHR, 0 /LOC TO HOLD CURRENT CHARACTER CSUM, 0 /BINARY CHECK SUM EQVOPR, EQUTB /EQUIVALENCE TABLE OUTPUT POINTER EQVIPR, EQUTB /EQ. TB. INPUT PTR. ILC, 0 /CURRENT LOCATION LFSPTR, 0 /POINTER TO LFS TABLE ENTRY LINE, 0 /NO OF LINES SINCE LAST LFS LITSZE, 0 /SIZE OF LIT TAB (ASM PHASE) LTSZE, 0 /SAME FOR COLL. PHASE LSTSKP, 0 /LAST INSTRUCTION SKIP INDICATOR LSTBNK, 0 /LAST INSTRUCTION BANK INDICATOR OBACTR, 0 /OFF BANK INSTRUCTION ADDITION COUNTER OPSCTR, 0 /OFF PAGE SYMBOL COUNTER /***** KEEP ITEMS SO INCLOSED IN THE GIVEN ORDER FOR INITA HICOM, 0177 PAG, 0200 /CURRENT PAGE BITS ESTSIZ, 0 /HOLDS SIZE OF EXTERNAL SYMBOL TABLE EQVBIT, 0 APMSW, 0 /AUTOMATIC PAGING MODE SWITCH TEM7, 1 /SPECIAL VARIABLE USED BY ASME5 CPSW, 1 DSW, 0 FORFLG, 0 /FORTR PSUEDO-OP FLAG /POS NON-0 MEANS IGNORE DATA SCOLON, 0 /***** PASS, 0 PGEESC, 0 /HOLDS SIZE OF PAGE ESCAPE REQUIRED FOR CUR PAGE PUPGE, 0 PHASE, 0 /PHASE SWITCH PSTCPR, 0 /PAGE SYMBOL TABLE CODE POINTER PSTSPR, 0 /PAGE SYMBOL TABLE SYMBOL POINTER PSTSZE, 0 /SIZE OF PST PTCPR, 0 /PAGE TABLE CODE POINTER PTOPR, 0 /PAGE TABLE OP CODE POINTER PTSPR, 0 /PAGE TABLE SYMBOL POINTER PTSZE, 0 /SIZE OF PT TEM1, 0 TEM2, 0 TEM3, 0 TEM4, 0 TEM5, 0 PTSIZ=PTSZE /KEYPUNCHING ERROR LITSIZ=LITSZE /KEYPUNCHING ERROR / /LISTING VARIABLES LFLG, 0 /0 IF NULL LINE EFLG, 0 /ERROR FLAG, 6BIT CHAR. IN LEFT HALF VFLG, 0 /0 IF NO VALUE TO OUTPUT AFLG, 0 /DITTO FOR ADDRESS CODE, 0 /RELOCATION CODE ADDRES, 0 /INSTR. ADDRESS VALUE, 0 /INSTR. VALUE /LINE INFO LFS, 0 /KEEP THIS LIST ORDERED AS GIVEN OP, 0 /TO AGREE WITH TLFS LIST IB, 0 AFS, 0 UMIC, 0 NSGN, 0 EXP, 0 SK, 0 CURSKP=SK BANK, 0 S0, 0 S1, 0 S2, 0 S3, 0 / FREQUENTLY USED CONSTANTS / K5, 5 K7, 0007 K10, 0010 K20, 0020 K40, 0040 K77, 0077 K100, 100 K177, 0177 K200, 0200 K240, 240 K400=L55I K600=GETSYM K3000=LFSCHK K1000=INI K4000=PRSYMP K7600, 7600 M200=K7600 M254, -254 LINAX, LINBUF-1 M2, -2 M3, -3 K2000=RDIL M3000=STCE M7600=K200 / / CORE LAYOUT POINTERS / PTOPTB=K200 /PAGE OP CODE TABLE 1 IN BANK 1 BSEEST=K100 /BASE OF EXTERNAL SYMBOL TABLE IN BANK 1 MST=K2000 /BASE MAIN SYM. TAB IN BANK1 LFSBSE=K600 /BASE OF LOCATION FIELD SYMBOL TABLE IN BANK 1 LITBSE=L55I /BASE OF ASSEMBLY PHASE LITERAL TABLE IN BANK 1 PSTBSE, PSTB /BASE OF PAGE SYMBOL TABLE IN BANK 0 PTBSE, PTB /BASE OF PAGE TABLE IN BANK 0 LTBSE=K1000 /BASE OF COLL. PHASE LIT. TABLE IN BANK 1 PTB=7176 PSTB=6776 IERROR=JMP I . /ERROR MESSAGES ERRI CERROR=JMP I . ERRC SERROR=JMP I . ERRS *0200 / / MAIN CONTROL LOGIC / START, CLA JMS I INITIO DCA PASS DCA I ICALSW JMS I INITAP RSTRT, JMS I INI /INITIALIZE PAGE TABLE POINTERS SKP RSTRT1, JMS I INCPTI /INCREMENT PAGE TABLE POINTERS JMS I RDIL /INPUT AND DECODE ONE LINE JMS I CKCSWP /CK FOR MISSING ARG DCA BSSSW /ALSO CLR BSS IS PROGRESS SW JMS I STCE /SET COUNTERS FOR CURRENT LINE TAD OP /OP CODE CDF 00 DCA I PTOPR /TO PT OP CODE WORD CDF 10 TAD SK /OR IN SKIP BIT SZA CLA TAD K40 /SKIP INST TAD I PTCPR /IN CASE LFS BIT IN ALREADY DCA TEM1 TAD IB /OR IN INDIRECT BIT SZA CLA TAD K400 /YES TAD TEM1 DCA TEM1 /FOR NEW PT CODE WORD TAD EXP /DO WE HAVE A PAR? SZA CLA JMP RSTRT5 /YES TAD UMIC /A MICRO INST? SNA CLA JMP RSTRT4 /NO AN MRI TAD K4 /OR IN OPERATE BIT JMP COMP /EXIT TO COMPUTE PAGE SIZE / / PAR FOR AN OP CODE / RSTRT5, TAD K10 /PLACE PAR BIT ON PAGE TABLE TAD TEM1 DCA TEM1 RSTRT4, TAD M2 TAD AFS /IS AFS A CONSTANT SZA JMP .+6 /NO TAD K20 /YES ... CONSTANT BIT RSTRT2, TAD TEM1 /+PT CODE WORD DCA TEM1 /FOR NEW PT CODE WORD TAD S0 /ACTUAL BINARY CONSTANT JMP COMPGO /EXIT TO COMPUTE PAGE SIZE IAC SZA CLA /IS AFS A LITERAL JMP .+3 /NO TAD K2 /YES ... LITERAL BIT JMP RSTRT2 /SAVE AS CONSTANT FROM THIS POINT TAD AFS /PLACE AFS ON PST COMPGO, DCA I PTSPR TAD NSGN /CK FOR # REF SZA CLA TAD K2000 /YES COMP, TAD TEM1 /GET ALL THE BITS DCA I PTCPR /TO THE CODE WORD / / NOW COMPUTE THE CURRENT PAGE SIZE / TAD LFS /IS THERE AN LFS SZA CLA JMS I RECTI /YES ... EXIT TO RECOUNT PAGE JMS I CPGESI /COMPUTE ACTUAL PAGE SIZE TAD M200 /SUBTRACT PHYSICAL PAGE SIZE SPA SNA CLA /IS SIZE .GT. PHYSICAL SIZE JMP RSTRT6 /NO ... GET NEXT JMS I PSHINI /YES ... PUSH CURRENT INPUT LINE TAD PUPGE /RESTORE LAST PAGE ESCAPE DCA PGEESC CLA CMA /DECREMENT PAGE TABLE SIZE TAD PTSZE DCA PTSZE / / ASSEMBLE THE CURRENT PAGE / JMS I L55I /ASSEMBLE CURRENT PAGE JMS I UDPG JMS I FIXI /FIX ILC IF PASS 2 JMS I POPINI /POP LAST INPUT LINE JMS I INI /INITIALIZE PT POINTERS DCA I RECTI /CLR RECOUNT FLAG FOR CPLFS JMP RSTRT1+2 /EXIT TO PROCESS POPPED LINE / RSTRT6, TAD PGEESC /SAVE CURRENT PAGE ESCAPE DCA PUPGE /IN CASE NEXT LINE OVERFLOWS PAGE TAD PASS SZA CLA JMS I LASMP JMP RSTRT1 LASMP, ASM02 INITAP, INITA ICALSW, CALLSW INCPTI, INCPT POPINI, POPIN PSHINI, PUSHIN FIXI, FIXILC CKCSWP, CKCSW / PAGE PSEUDO OPERATION / PPAGE, JMS I SKIPL CLA CMA /DECREMENT PAGE TABLE SIZE TAD PTSZE SNA /WATCH FOR ZERO JMP .+3 DCA PTSZE /FOR NEW PAGE TABLE SIZE JMS I L55I /ASSEMBLE CURRENT PAGE JMS I UDPG JMP RORGX /INITIALIZE AND INPUT ANOTHER LINE / / REORG PSEUDO OPERATOIN / PRORG, JMS I GETSYM /GET NEXT INPUT ITEM NOP /NOTHING THERE SKP /SYMBOL SKP CLA /CONSTANT IERROR /LITERAL JMS I SKIPL TAD S0 /NEW RELOCATABLE ORIGIN AND K7600 /MASK OFF PAGE DISPLACEMENT BITS SNA /ARE WE TRYING TO REORIGIN BELOW 200 IERROR /YES ... NOT ALLOWED DCA RORG1 /SAVE NEW ORIGIN CLA CMA /DECREMENT PAGE TABLE SIZE TAD PTSZE SNA /IS THIS THE BEGINNING OF A PAGE JMP .+3 /YES DCA PTSZE JMS I L55I TAD RORG1 /NEW ORIGIN DCA PAG /TO PROPER LOCATION RORGX, JMS I FIXI TAD RSTRTX /RETURN AT RSTRT INSTEAD OF RDL1 DCA DCIL1 JMP I NULLP /RE-INITIALIZE AND GO RORG1, 0 RSTRTX, RSTRT UDPG, UDPAGE INITIO, IOINIT *0400 / / ROUTINE TO CAUSE CURRENT PAGE TO BE ASSEMBLED /THIS ROUTINE ACTS AS THE DRIVER FOR THE ASSEMBLY /PROCESS. MOST OF THE ACTUAL ASSEMBLY WORK /IS DONE BY ASMBL,A1,A2,& ASM02. /FUNCTION:(PASS1) / CALL ASMBL TWICE. THE FIRST TIME / (ACTR=0) PROHIBIT OUTPUT BY CONVERTING / "JMS OUTBIN" TO "JMS DUMMY". BUT / ALSO CONVERT "JMS DUMMY" TO "JMS OUTBN" / SO THAT OUTPUTTING OF OCCURANCES / WILL OCCUR IN FIRST CALL TO ASMBL. / IN GENERAL, IN THE FIRST RUN THRU ASMBL / NOTHING HAPPENS EXCEPT THAT TAGS ARE / DEFINED (BY LFSCK). AS THE TAGS ARE / DEFINED LFSCK ALSO CAUSES THE / OCC.TAB. TO BE SEARCHED FOR PREVIOUSLY / UNRESOLVED FORWARD REFERENCES TO THIS / TAG. IF FOUND, RELOCATABLE POINTERS TO / THE TAG ARE OUTPUT AT ALL REQUIRED / ADDRESSES DURING PHASE1 OF ASMBL. / AFTER THE 1ST ASMBL, OUTBIN & DUMMY ARE / SWITCHED BACK TO NORMAL & ASMBL / IS CALLED AGAIN. DURING 2ND ASMBL / THE TAG DEFN. SECTION OF LFSCK IS / BY-PASSED & ALL CODE EXCEPT OCCURANCES / IS OUTPUT. / (PASS2) / DURING THE LISTING PASS MOST OF THE / ASSEMBLY IS DONE ON A LINE-BY-LINE / BASIS BY ASM02 SO L55 HAS LITTLE / TO DO. IT JUST CALLS A2 TO / OUTPUT THE LITERAL POOL & THEN / A1 TO INIT. ASSEMBLY OF THE NEXT / PAGE. / L55, 0 JMP I L55B /CHANGED FROM V16 TO FIX LISTING BUG L55C, TAD PASS SZA CLA JMP L55L JMS I L55A /CHECK COMMON PUNCHED TAD L56 /SET DUMMY ROUTINE TO OUTPUT DCA DUMMY TAD L56+1 /SET OUTPUT ROUTINE TO DUMMY DCA OUTBIN DCA ACTR /CLEAR ASSEMBLY COUNTER TAD EQVOPR /SAVE FOR 2ND ASSEMBL DCA TEM55 JMS I ASSMBL /ASSEMBLE PAGE FIRST TIME TAD L56 /RESTORE OUTPUT ROUTINE DCA OUTBIN TAD L56+1 /RESTORE DUMMY ROUTINE DCA DUMMY ISZ ACTR /SET ASSEMBLY COUNTER TAD TEM55 /RESTORE AS BEFORE 1ST ASSEMBL DCA EQVOPR JMS I ASSMBL /ASSEMBLE AND OUTPUT THIS TIME JMP I L55 /RETURN L56, OUTBN DUM ASSMBL, ASMBL L55A, HCBPS L55B, EQVFIX TEM55, 0 L55L, JMS I A2P JMS I A1P /INITIALIZE NEXT PAGE JMP I L55 A2P, A2 A1P, A1 / /COLLECTION PHASE ROUTINE /RECOUNT THE CURRENT PAGE BECAUSE OF AN LFS /CALL WITH AC=0, LEAVES AC=0 /FUNCTION:WHEN A NEW TAG IS DEFINED ON PAGE / OPSCTR & OBACTR MAY NEED TO BE / REDUCED. CPLFS TAKES CARE OF OPSCTR / BUT OBACTR REQUIRES REVIEWING THE / ENTIRE PAGE. /OPERATION: (1) CALL CLNPST TO CLEAR BITS 1-9 / OF ALL PST CODE WORDS-WIPES OUT / SHARE OF OBACTR DUE TO EACH SYM. / (2) RE-INIT PAGE & CLR OBACTR / (3) FETCH ITEM FROM PAGE TABLE / (4) SET ALL INSTR.TYPE FLAGS ACCORDINGLY / (5) CALL SETC / (6) INC PAGE TABLE PTRS TO NEXT ITEM / & LOOP BACK TO (3) / CONTINUE THRU ENTIRE TABLE. / RECT, 0 TAD PSTSZE /ANYTHING ON PST? SZA JMP I CLENUP /YES, CLEAN PST CODES RECRET, JMS I INISS /DO INITS. DCA OBACTR /ZERO OFF BANK ADDITION COUNTER TAD PTSZE /SIZE OF PT CIA DCA RECT1 /TO INDEX LOCATION / / THIS IS THE RECOUNT LOOP / RECT2, CDF 00 TAD I PTOPR /OP CODE FROM PT CDF 10 DCA OP TAD I PTCPR /CK FOR SKIP INST AND K40 DCA SK TAD I PTCPR /CK FOR # REF AND K2000 DCA NSGN TAD I PTCPR /PT CODE WORD AND K4 /IS IT AN OPERATE INSTRUCTION DCA UMIC TAD I PTCPR /CK FOR PAR EXP AND K10 DCA EXP TAD I PTCPR /PAGE TABLE CODE WORD AND K400 /MASK OFF INDIRECT BIT DCA IB /PLACE IT IN PROPER LOCATION TAD I PTCPR /PT CODE WORD AND K20 /IS AFS A CONSTANT CLL RTR SZA JMP .+3 /YES TAD I PTCPR /PT CODE WORD AND K2 /IS AFS A LITERAL CLL RAR SNA TAD I PTSPR /ADDRESS FIELD SYMBOL DCA AFS TAD I PTSPR /ACTUAL LITERAL DCA S0 /TO LITERAL LOCATION / / AREA WHICH CALLS COUNT ROUTINE / RECT3, TAD I PTCPR /PT CODE WORD AND K201 /IS THERE A TAG OR AN EQUIVALENCED TAG? SNA CLA JMP .+3 /NO CLA CMA /YES ... SET BANK UNKNOWN DCA BANK JMS I STCE /CALL COUNT ROUTINE ISZ RECT1 /OVER YET SKP /NO JMP I RECT /EXIT JMS I ISZPT1 JMP RECT2 /GO GET NEXT LINE RECT1=L55 INISS, INISUB CLENUP, CLNPST K201, 201 ISZPT1, ISZPT PAUS1, PPAUS1 / / END PSEUDO OPERATION / PEND, TAD FORFLG /IF FLAG ON, TURN OFF & SMA SZA CLA /GO TO RDL1 JMP I PAUS1 /GO TURN OFF FORTR P-OP CLA CMA /DECREMENT PT SIZE TAD PTSZE SNA /ARE WE AT THE BEGINNING OF A PAGE JMP PCSM /YES DCA PTSZE /NO ... NEW PAGE TABLE SIZE TAD PAG /CHECK FOR OVERFLOW INTO 7600 PAGE TAD K200 SNA CLA SERROR /OVERFLOW-ERROR S ISZ APMSW /LEAVE AUTO PAGING MODE FOR LAST PAGE JMS L55 /ASSEMBLE CURRENT PAGE PCSM, JMS I OUTBIN /OUTPUT CKSUM CSUM 10 TAD PASS SZA CLA JMP ENDEND JMS I LEAD /OUTPUT TRAILER CODE JMS I PRSYMP /TYPE OUT SYMBOL TABLE ISZ PASS JMS I INITAI JMS I A1P HLT JMP I REE ENDEND, JMS I WLNP /LIST THE "END" STATMT HLT CLA JMP I K200 /RESTART AT 200 REE, RSTRT INITAI, INITA LEAD, LEADER *600 /READ INPUT ITEM / IGNORES SPACES & TABS TO 1ST CHAR OF ITEM /ASSUMES AC=0 /CALLING SEQ: JMS I GETSYM / NULL RETURN (IF NO ITEM FOUND BEFORE CR ; / * / SYMBOL RET. (WITH SYM PACKED IN S1-S3 / AND S0=SYMBOL LENGTH) / CONST. RET. (WITH VALUE IN S0) / LITERAL RET. (WITH VALUE IN S0) /SYNTAX: LITERALS: (000 NUMERIC LIT. / (-000 NEG. / (K000 OCTAL / (D000 DECIMAL / ("A ASCII LIT. / (-"A NEGATIVE ASCII / CONSTANTS: 000,-000,"A,OR -"A / NOTE: AFTER A VALID QUOTE ANY ASCII CHAR MAY APPEAR / AND WILL BE STORED AS THE CONST OR LIT VALUE. / THIS INCLUDES CR ; / * SO THESE DO NOT / TERMINATE A LINE AFTER A QUOTE. /ALL EXITS LEAVE AC=0 /NOTE: TO PROVIDE A CHECK OF THE PUNCTUATION /CHAR. FOLLOWING PREVIOUSLY READ SYMBOL, GTSYM /DECREMENTS THE LINE PTR BEFORE STARTING /THE READ. IF THIS IS NOT WANTED /CALL TO GTSYM MUST BE PRECEDED /BY "ISZ X0" GTSYM, 0 CMA /DECREMENT CHARACTER PTR TAD X0 DCA X0 TAD DSW /SAVE NUMERIC MODE DCA TEM4 CMA /SIGN=-1 FOR POSITIVE ITM4, DCA SIGN /SIGN=0 TO FORCE NEGATION ITM2, JMS I RC /READ 1ST CHAR JMP ITM5 /DIGIT: GET NUMERIC CONST JMP ITM3 /ALPHA: GET SYMBOL JMS I TEST /SORT LEADING PUNCT. SL2-1 BL2-SL2 CERROR /ILLEGAL CHAR / /READ IN A SYMBOL /ASSUMES 1ST CHAR ALREADY READ IN & SAVED IN CHR /LEAVES SYMBOL PACKED IN 6BIT CHAR PAIRS IN S1-S3 / S0=NUMBER OF CHAR PAIRS ACTUALLY USED ITM3, ISZ SIGN /CK FOR -SYMBOL CERROR /YES DCA S0 /CLR FOR SYM LENGTH COUNT DCA TEM1 /CLR FOR CHAR COUNT DCA TEM3 /SET PTR FOR LEFT BYTE TAD AS0 /AUTO-INDEX STORAGE IN S1-S3 DCA X2 RSM2, ISZ TEM1 /COUNT CHAR TAD TEM1 /ARE MORE THAN 6 CHARS IN? TAD M7 SMA CLA JMP RSM1 /YES, IGNORE TAD CHR /NO, GET ASCII AND K77 /MASK TO 6BIT ISZ TEM3 /WHICH BYTE? JMP RSM3 /LEFT TAD TEM2 /ADD ON LEFT HALF DCA I X2 /STORE CHAR PAIR IN S1-S3 JMP RSM1 RSM3, RTL CLL /MOVE 6BIT TO LEFT BYTE RTL RTL DCA TEM2 /SAVE WHILE WAITING ON RT BYTE CMA /SET PTR FOR RT BYTE DCA TEM3 ISZ S0 /COUNT 1 SYMBOL WORD RSM1, JMS I RC /READ NEXT CHAR JMP RSM2 /DIGIT JMP RSM2 /ALPHA ISZ TEM3 /PUNCT=END OF SYM: CHECK BYTE PTR JMP .+3 /NOTHING IN TEM2 TAD TEM2 /SAVE THE ODD CHAR DCA I X2 TAD I IFCTP /SKIP SYM TAB IF IF-COUNT NOT UP SMA CLA JMS I SRS /LOOK IT UP IN SYM TAB. & ENTER IF NEC. JMP ITM14 /EXIT /READ DIGIT STRING /ASSUMES 1ST DIGIT ALREADY READ AND ASCII SAVED IN CHR / SGN=-1 IF NUM. IS TO BE NEGATED / DSW=0 FOR OCTAL CONVERSION, 1 FOR DECIMAL /LEAVES AC=OCTAL VALUE OF DIGIT STRING (NEG IF SGN=-1) / CHR=ASCII FOR TERMINAL PUNCTUATION ITM5, DCA TEM1 /CLEAR FOR ACCUMULATION RDS1, TAD CHR /REDUCE CHR TO OCTAL VALUE TAD M260A DCA TEM2 TAD DSW /OCTAL OR DECIMAL CONVERSION? SZA CLA /OCTAL, CK FOR 8 OR 9 JMP MUL1 /DECIMAL, 8 OR 9 IS OK TAD TEM2 /VALUE = 8 OR 9? TAD M7 SMA SZA CLA /NO, GO ON CERROR /YES /MULT. PREV. VAL. BY CONV. FACTOR TAD TEM1 CLL RTL /ARG *4 JMP MUL1+3 MUL1, TAD TEM1 CLL RTL /ARG * 4 TAD TEM1 /PLUS ARG=ARG*5 RAL /*2 TAD TEM2 /ADD NEW DIGIT DCA TEM1 /SAVE ACCUMULATED VALUE JMS I RC /READ NEXT CHAR. JMP RDS1 /DIGIT CERROR /ALPHA TAD TEM1 /PUNCT.; GET TOTAL ITM6, ISZ SIGN /IS NEGATE SW. SET? CIA /YES DCA S0 /STORE CONST VALUE TAD TEM4 /RESTORE NUMERIC MODE DCA DSW JMP ITM13 /EXIT ITM7, JMS I GETCHR /READ ALPHA CONST. SNA IERROR /NOTHING THERE DCA TEM1 JMS I GETCHR /READ NEXT CHAR FOR BENEFIT OF SKIPL CLA TAD TEM1 JMP ITM6 ITM8, JMS I CKIFP /MOVE PTR TO LITERAL EXIT ITM9, JMS I RC /READ 1ST CHAR OF LIT. JMP ITM5 /DIGIT: NUMERIC LIT. NOP /ALPHA: MUST BE K OR D JMS I TEST /LOOK FOR K,D,",- SL3-1 BL3-SL3 CERROR /ILLEGAL CHAR ITM10, DCA SIGN /SET FLAG FOR NEG. LIT. JMP ITM9 ITM11, IAC /FORCE DECIMAL LIT. ITM12, DCA DSW /FORCE OCTAL LIT. JMP ITM9 ITM13, JMS I CKIFP /CONST. EXIT ITM14, JMS I CKIFP /SYMBOL EXIT ITM15, JMP I GTSYM /NULL EXIT M260A, -260 SRS, SRSYM RC, RCH SIGN, 0 IFCTP, IFCTR CKIFP, CKIF AERROR=JMP I . ERRA CALLSP, CALLSW / /CHECK FOR TOO FEW ARGS /AERROR IF CALLSW MINUS / CKCSW, 0 TAD I CALLSP /CK SMA CLA JMP I CKCSW /OK ISZ I CALLSP /COUNT MISSING ARG NOP AERROR /FLAG / /CHECK FOR TOO MANY ARGS /AERROR IF CALLSW POSITIVE / CKCLS, 0 TAD I CALLSP /DO WE WANT THIS ARG? SMA CLA AERROR /NO, ARG COUNT OVERFLOW ISZ I CALLSP /YES, COUNT THIS ARG NOP JMP I CKCLS *1000 / / ROUTINE TO INITIALIZE POINTERS FOR THE COLLECTION OF A PAGE / INILPT, 0 CLA IAC DCA PTSZE /SET PAGE TABLE SIZE DCA PSTSZE /ZERO PAGE SYMBOL TABLE SIZE DCA LTSZE /ZERO LITERAL TABLE SIZE (COLL. PHASE) DCA LITSZE /& ASMBLY PHASE LIT TABL DCA OPSCTR /ZERO OFF PAGE SYMBOL COUNTER DCA PHASE /SET PHASE SWITCH TO COLLECTION JMS INISUB CLA CMA DCA I BNKSV CLA IAC DCA I LSTSKK TAD EQVBIT /ANY EQUIV. LEFT FROM LAST PAGE? SZA JMP EQSAV /YES, SKIP TABLE REINIT & SAVE BIT DCA EQVIPR /NO, RE-INIT EQ. TAB. PTRS DCA EQVOPR EQSAV, DCA I PTCPR /INITIALIZE PAGE TABLE CODE WORD DCA I PTSPR /INITIALIZE PAGE TABLE SYMBOL WORD CDF 00 DCA I PTOPR /INITIALIZE PT OP CODE WORD CDF 10 TAD LFSBSE /INITIALIZE LFS TABLE POINTER DCA LFSPTR DCA OBACTR /ZERO OFF BANK ADDITION COUNTER TAD RDL1X /RESTORE IN CASE OF REORG OR PAGE PSUEDO DCA DCIL1 JMP I INILPT /RETURN RDL1X, RDL1 BNKSV, BNKSAV LSTSKK, SKPSAV M211, -211 / /GENERAL PAGE TABLE INITALIZATION /DOES PARTS OF INITALIZ. COMMON TO SEVERAL /ROUTINES / INISUB, 0 TAD PTBSE /INITIALIZE PAGE TABLE CODE POINTER DCA PTCPR TAD PTBSE /INITIALIZE PAGE TABLE SYMBOL POINTER IAC DCA PTSPR TAD PTOPTB /INITIALIZE PT OP CODE POINTER DCA PTOPR CLA CMA /SET LAST BANK UNKNOWN DCA LSTBNK CLA IAC /SET LAST INSTRUCTION SKIP INDICATOR ON DCA LSTSKP CLA CMA /SET CURRENT BANK UNKNOWN DCA BANK JMP I INISUB / /SUBR. TO WRITE A LINE /MAY BE USED ONLY DURING PASS 2 (LISTING) /FUNCTION:TYPES (OR PUNCHES) EACH LINE OF SOURCE / WITH PROPER ASSEMBLY ADDR. & CODES / AT BEGINNING OF LINE (OR SPACES IF / THESE ARE OMITTED). /LINE FORMAT: /ADDR VALU RC CONTENTS OF LINE BUFFER /ERROR FLAGS TYPED BETWEEN ADDR & VALU /COLUMNS. RC=RELOCATION CODE. THE LINE /BUFFER IS IN FIELD 1 AT "LINBUF." / WLN, 0 TAD LFLG /NULL LINE? SNA CLA JMP WLN3 /YES TAD AFLG SZA CLA JMP .+4 JMS I CTYPE /IF AFLG=0 TYPE 4 SPACES JMS I CTYPE JMP .+3 TAD ADDRES /OTHERWISE TYPE 4 DIGITS JMS I OTYPE TAD EFLG /TYPE ERR. FLAG & SPACE JMS I CTYPE TAD VFLG /SAME TREATMENT FOR VALUE SZA CLA /AS FOR ADDRES JMP .+4 JMS I CTYPE JMS I CTYPE JMP .+3 TAD VALUE JMS I OTYPE TAD K240 /SPACE JMS I TYPE TAD CODE /2 DIGITS OR 2 SPACES JMS I CTYPE CDF 00 TAD I LINEB /IS THERE ANY LINE TO TYPE? CDF 10 SNA CLA JMP WLN3 /NO, EXIT JMS I CTYPE /2 SPACES TAD K240 /3RD SPACE JMS I TYPE TAD LINAX /INDEX LINE BUFFER DCA X1 DCA CHARCT /CLR COUNTER WLN1, CDF 00 TAD I X1 /GET CHAR CDF 10 SNA JMP WLN3 /END OF LINE DCA CHR TAD CHR /CK FOR TAB TAD M211 SNA CLA JMP WLN2 /YES ISZ CHARCT /COUNT 1 CHAR TAD CHR /OUTPUT IT JMS I TYPE JMP WLN1 WLN2, TAD K240 /SIMULATE TAB ISZ CHARCT JMS I TYPE TAD CHARCT AND K7 SZA CLA JMP WLN2 /CONTINUE TAB JMP WLN1 WLN3, JMS I CRLF DCA VFLG DCA EFLG DCA AFLG DCA CODE CDF 00 DCA I LINEB CDF 10 JMP I WLN LINEB, LINBUF CHARCT=TEM5 / /PATCH FOR SETCT /NOT USED BY ANY OTHER PART OF PROGRAM /(ADDED AT V15) / /FUNCTION: SET BANK=1 AFTER A "CALL" /(MUST BE DONE FOR BENEFIT OF RECT ROUTINE) / SETCAL, 0 TAD I PTCPR /CK FOR CALL CONST. AND K100 SNA CLA JMP .+3 /NO IAC /YES, BANK TO CURRENT DCA BANK TAD EXP /DO 2 INSTRUCTIONS THAT TAD UMIC /WERE KNOCKED OUT OF SETCT JMP I SETCAL *1200 / / ASSEMBLY PHASE PAR / /PPAR1 IS ACTUALLY A PART OF THE BASIC ASSEMBLY /ROUTINE ASM02. /IT ASSEMBLES ALL PARAMETERS /TYPES ARE: RC=00 ABSOLUTE CONSTANT / RC=01 RELOCATABLE ADDRESS / RC=05 CDF TO CURRENT FIELD / RC=06 CALL CONSTANT (#ARGS+EXT.SYM.#) / ALSO LITERALS USED IN ARG STATEMENTS / SUCH LITS. ARE PUT IN LIT. POOL / AND RC=01 ADDRESS OF LIT. PUT WHERE / THE ARG STATEMT OCCURS. /ADDRESS PARAMETERS ARE ACUALLY TAKEN /CAR OF BY SUBR. PPAR3S. / / PPAR1, DCA PPARY /CLR OUTPUT CODE TAD I PTCPR /CK FOR LITERAL ARG OR PARAM. AND K2 SZA CLA JMP PARLIT /YES TAD I PTCPR /PT CODE WORD AND K20 /IS IT PAR CONSTANT SNA CLA JMP PPAR3 /NO TAD I PTSPR /YES ... ACTUAL CONSTANT DCA TEM1 /TO DIRECTLY ADDRESSABLE LOC TAD I PTCPR /IS THIS A SPECIAL CONSTANT USED BY CALL AND K100 SNA CLA JMP .+5 IAC /YES, SET BANK TO CURRENT (NEW IN V15) DCA BANK IAC /& FORCE CODE=06 JMP .+5 TAD I PTCPR /IS THIS A CDF INSTRUCTION TO THIS BANK AND K1000 SNA CLA JMP .+3 TAD K5 DCA PPARY JMS I WRITEP JMS I OUTBIN /OUTPUT IT TEM1 /NO RELOCATION PPARY, 0 SKP PPAR3, JMS PPAR3S /DO ALL WORK JMP I PPAR5-1 SERALI, SRALT PARLIT, TAD I PTSPR /PUT LIT ON TAB. DCA S1 IAC DCA S0 JMS I SERALI AND K177 /GET PAGE ADDRESS TAD PAG /+ PAGE BITS DCA TEM1 ISZ PPARY /CODE FOR RELOCATABLE ADDR. JMP PPARY-3 / / SUBROUTINE TO ASSEMBLE PAR SYMBOL / /ASSEMBLE ADDRESS PARAMETER /SYMBOL MAY BE ABSOLUTE OR RELOCATABLE /NORMAL OR # REF. /IF SYMBOL IS YET UNDEFINED, AN ENTRY IS /MADE FOR IT & THE CURRENT ADDRESS IN THE /OCCURANCE TABLE. / / PPAR3S, 0 DCA PPARX /CLR OUTPUT CODE TAD ACTR /WHCH TIME ARE WE ASSEMBLING THIS PAGE /NOTE: ACTR REMAINS 1 DURING PASS 2 SNA CLA JMP I PPAR3S /FIRST TIME JUST RETURN TAD I PTSPR /SYMBOL DCA AFS /TO DIRRECTLY ADDRESSABLE LOCATION JMS I OBSYM /GET IT FROM MST AFS TAD USE /MST USE WORD AND K400 /IS IT DEFINED YET SNA CLA JMP PPAR4 /NO ... OCCURANCE TAD USE /MST USE WORD AND K3000 /IS SYMBOL ABSOLUTE SZA CLA ISZ PPARX /OUTPUT RELOCATABLE JMS I NSCHKI TAD VAL /INCREMENT IF # REF. PPAR6, DCA TEM1 JMS I WRITEP JMS I OUTBIN TEM1 PPARX, 0 JMP I PPAR3S /RETURN PPAR4, TAD AFS /SYMBOL DCA I PPAR5 /TO SUBROUTINE LOCATION TAD ILC /CUR LOC DCA I PPAR5+1 /TO SUBROUTINE LOC JMS I NSCHKI CLL RTL DCA I PPAR5+3 /SET ATEM2 FOR NORMAL OR # REFERENCE JMS I PPAR5+2 /CREATE AN OCCURANCE JMP PPAR6 /OUTPUT ZERO WORD FOR LOADER ASM01 PPAR5, ATEM3 ATEM4 L53B ATEM2 NSCHKI, NSCHK / /TWO CHARACTER TYPEOUT /FROM PACKED ASCII PAIR /CALL WITH 6-BIT PAIR IN AC /L61A ACTS AS SUBR FOR L61 / L61, 0 DCA TEM1 /SAVE CHARACTERS TAD TEM1 RTR /SHIFT HIGH 6 BITS TO LOW RTR RTR JMS L61A /MASK AND TYPE FIRST CHARACTER TAD TEM1 JMS L61A /MASK AND TYPE SECOND CHARACTER JMP I L61 /RETURN L61A, 0 AND K77 /MASK CHAR TO 6 BITS SNA /ZERO MEANS SPACE JMP L61B JMP I L61CP /HAVE DO SOME OF THIS WORK ON ANOTHER PAGE L61D, JMS I TYPE /TYPE CHAR JMP I L61A /RETURN L61B, TAD K240 /SPACE JMP L61D L61CP, L61C / / ROUTINE TO TEST CHARACTERS AND TAKE SELECTIVE EXITS / / CALL IS / JMS I TEST / SORT LIST ADDR -1 / BRANCH LIST ADDR - SORT LIST ADDR / RETURN IF ALL TESTS UNSUCCESSFUL / ASSUMES AC=0 & CHAR TO LOOK FOR IS IN CHR /SORT ENDS UNSUCCESSFULLY AT /NEGATIVE NUMBER FOLLOWING SORT LIST /IF SORT IS SUCCESSFUL, A BRANCH IS /TAKEN VIA BR. LIST ITEM CORRESPONDING /TO MATCHING SORT LIST ITEM. / TSCHR, 0 CLA TAD I TSCHR /GET SORT LIST ADDR -1 DCA X1 /AUTO-INDEX SORT LIST ISZ TSCHR /MOVE ARG PTR CDF 00 TSCHR2, TAD I X1 /GET SORT LIST ITEM SPA JMP TSCHR3 /NEG = END OF SORT LIST CIA /COMPARE ITEM WITH CHR TAD CHR SZA CLA /0 = MATCH FOUND JMP TSCHR2 /NO MATCH, TRY NEXT ITEM TAD X1 /GET ADDR. OF MATCH CDF 10 TAD I TSCHR /+BR. LIST ADDR - SORT LIST ADDR DCA TSCHR /= PTR TO BR. LIST ITEM CDF 00 TAD I TSCHR /GET BR. LIST ITEM DCA TSCHR /= BRANCH PTR FOR THE MATCH SKP TSCHR3, ISZ TSCHR /NO MATCH ON LIST CLA CLL CDF 10 JMP I TSCHR / RETURN UNSUCCESSFUL *1400 / / CALL PSEUDO OPERATION / PCALL, JMS I GETSYM /GET NEXT INPUT ITEM NOP /NOTHING THERE SKP /SYMBOL TAD CHR /CONSTANT TAD M254 /LITERAL SZA CLA /IS BREAK CHARACTER A COMMA JMP CALERR /NO ... ERROR TAD S0 /SAVE ARG COUNT DCA ARGCT ISZ X0 /PROHIBIT FLAGGING THE COMMA JMS I GETSYM /GET SUBROUTINE NAME SKP /NONE THERE JMP .+3 /SYMBOL NOP /CONSTANT CALERR, IERROR /LITERAL JMS I SKIPL JMS I SREST /SEARCH EXTERNAL SYMBOL TABLE AND OUTPUT TV DEF DCA PCALL1 /SAVE EXTERNAL SYMBOL NUMBER TAD LFS DCA I CALLFS TAD ARGCT /SET ARG COUNT IN DYNAMIC LOCATION CIA DCA CALLSW /SET CALL - ARG IN PROCESS SWITCH & COUNTER TAD ARGCT /COUNT OF ARGS RAL CLL /*2 TAD ARGCT /*3 IN CASE USING LITERAL ARGS TAD K2 /+2 JMS I PARG2 /CAN THE CURRENT PAGE HOLD IT SKP /YES JMS I INI /NO ... INITIALIZE PT PTRS ... HAD TO ASSEMBLE PAG TAD I CALLFS DCA LFS JMS I ICPLFS /PROCESS COLLECTION LFS TAD I PTCPR /PT CODE WORD TAD K30 /ADD CONSTANT BIT & PAR BIT DCA I PTCPR /TO PT CODE WORD TAD PARG6 /PLACE JMS LINK INSTRUCTION DCA I PTSPR /AS CONSTANT JMS PARG5 /INC PT PTRS & ASSMBL IF PASS 2 TAD K130 /CORRECT BIT PATTERN FOR CALL DCA I PTCPR /TO PT CODE WORD IAC /A CALL FORCES BANK TO CURRENT DCA LSTBNK /(NEW IN V15) IAC DCA BANK TAD ARGCT /COUNT OF ARGS CLL RTL /TO HIGH ORDER AC RTL RTL TAD PCALL1 /OR IN EXTERNAL SYMBOL NUMBER DCA I PTSPR /PLACE IN PT SYMBOL WORD JMP ARGPP0 /COMMON EXIT / / ARG PSEUDO OPERATION / PARG, JMS I GETSYM /GET NEXT INPUT ITEM IERROR /NOTHING THERE JMP PARGSM /SYMBOL JMP PARGCN /CONSTANT CODE IS 2 JMS I SKIPL /FIXES BUG IN V16 JMS I SLITAB /PUT LIT ON TABLE CMA /LIT CODE IS 1 PARGCN, TAD K2 SKP PARGSM, TAD SYMBOL /PAR ADDRESS DCA AFS JMS I SKIPL JMS I CKCLSP /CK FOR TOO MANY ARGS / / ROUTINE TO PUT A CDF IN THE PAGE TABLE / TAD K30 /PT CODE WORD DCA I PTCPR /TO PT JMS I ICPLFS /PROCESS ANY LFS TAD K6201 /CDF DCA I PTSPR /TO PT SYMBOL WORD TAD M2 TAD AFS /IS AFS A CONSTANT SNA JMP ARGPP4 /YES IAC /IS AFS A LITERAL SNA CLA JMP ARGPP5 /YES JMS I OBSYM /NO ... SYMBOL ... GET ITS POINTERS TO MST AFS TAD USE /AFS MST USE WORD AND K40 /IS IT A COMMON SYMBOL SNA CLA JMS CDFCHG /NO JMS ARGPP2 /INCREMENT PT PTRS AND PUT OUT A PAR TAD AFS DCA I PTSPR /PLACE SYMBOL IN PT SYMBOL WORD ARGPP0, JMS PARG5 /INC PT PTRS &ASSMBL IF PASS 2 JMP I POPEXP /EXIT TO GET NEXT LINE / ARGPP5, JMS CDFCHG JMS ARGPP2 /INCREMENT PTRS AND PUT OUT A PAR TAD K2 /SET LITERAL BIT JMP .+3 /SAVE AS CONSTANT FROM HERE / ARGPP4, JMS ARGPP2 /INCREMENT PTRS AND PUT OUT A PAR TAD K20 /SET CONSTANT BIT TAD I PTCPR /PT CODE WORD DCA I PTCPR /FOR PROPER WORD TAD S0 /PLACE CONSTANT IN PROPER LOCATION DCA I PTSPR JMP ARGPP0 / / ROUTINE TO INCREMENT POINTERS AND SET UP FOR A PAR IN THE PAGE TABLE / ARGPP2, 0 JMS PARG5 /INC PT PTRS & ASSMBL IF PASS 2 TAD K10 DCA I PTCPR JMP I ARGPP2 /RETURN K6201, CDF 10 ASMIF1, 0 TAD PASS SZA CLA JMS I ASM02S /ASSMBL NOW IF LISTING PASS JMS I INC JMP I ASMIF1 ASM02S, ASM02 INC, INCPT ARGCT, 0 CALLFS=PRSYMP /TEMP CALLSW, 0 PARG2, IFFSUB CKCLSP, CKCLS PARG5=ASMIF1 PARG6, JMS LINK M10, -10 /ROUTINE TO CHANGE CDF 10 TO CDF * CDFCHG, 0 TAD I PTCPR TAD K1000 /SET CDF * BIT IN P.T. DCA I PTCPR TAD I PTSPR /CHANGE 6211 TAD M10 /TO 6201 DCA I PTSPR JMP I CDFCHG PCALL1=CDFCHG /TEMP *1600 / / COMMN PSEUDO OPERATION / PCOMMN, JMS I GETSYM /GET ADDRESS FIELD SYMBOL NOP /NOTHING THERE SKP /SYMBOL THERE SKP CLA /CONSTANT IERROR /LITERAL JMS I SKIPL TAD LFS SNA CLA /IS THERE AN LFS JMP COMMN2 /NO ... JUST INCREMENT COUNTERS JMS I OBSYM /GET POINTERS TO LFS LFS TAD USE /MST USE WORD AND K3 /SAVE SYMBOL LENGTH TAD K440 /ADD CORRECT BITS DCA USE /FOR NEW MST USE WORD TAD S0 /NO OF COMMON LOCATIONS SNA CLA /ARE THERE ZERO JMP COMMN1 /YES ... EQUIVALENCE OUTPUT TAD HICOM /NO ... HIGHEST COMMON LOCATION USED TAD S0 /+SIZE OF THIS BLOCK DCA TEM1 /FOR TENTATIVE NEW HIGHEST TAD TEM1 /ACTUAL ADDRESS AND K7600 /ARE WE OVERFLOWING ONTO THE LAST PAGE TAD M7600 SZL CLA SERROR /YES ... ERROR TAD HICOM /LAST COMMON ASSIGNMENT IAC /+1 DCA VAL /GIVES NEW ADDRESS TAD TEM1 /NEW HIGHEST COMMON LOCATION DCA HICOM /TO PROPER LOC COMMN0, TAD VAL JMP I NULLP /GO GET NEXT LINE / / EQUIVALENCE GENERATED COMMON OUTPUT / COMMN1, TAD HICOM /PLACE LAST COMMON ASSIGNMENT IAC /+1 DCA VAL /IN MST AS ADDRESS JMP COMMN0 /EXIT / / NON LOCATION FIELD SYMBOL COMMON ASSIGNMENT / COMMN2, TAD HICOM /LAST HIGHEST TAD S0 /+CUR ASSIGNMENT DCA HICOM /FOR NEW HIGHEST TAD HICOM /NEW HIGHEST AND K7600 /ARE WE OVERFLOWING ONTO THE LAST PAGE TAD M7600 SZL CLA SERROR /YES ... ERROR JMP COMMN0 /NO ... EXIT K440, 0440 /TEXT PSUEDO-OP PTEXT, TAD FORFLG SMA SZA CLA JMP I DCIL1 JMS I GETCHR /LOOK FOR STRING START JMS I TEST SL1-1 BL1-SL1 TAD CHR /SAVE OPENING DELINEATOR CIA DCA DELIN DCA TEXCTR /CLR CHAR CTR TAD X0 /SAVE AUTO-INDEX TO START OF STR DCA TEXSUB TEX1, JMS I GETCHR /LOOK FOR END OF STRING SNA TEXERR, IERROR /TOO SOON END OF LINE TAD DELIN SNA CLA JMP TEX2 /THE END OF THE LINE ISZ TEXCTR /KEEP STRING TALLY JMP TEX1 TEX2, JMS I GETCHR /MOVE LINE PTR TO CHAR. AFTER DELINEATOR CLA JMS I SKIPL JMS I PUSH /SAVE INFO FOR A MINUTE TAD TEXCTR IAC CLL RAR /DIV BY 2 JMS I IFFS /SEE IF STR WILL FIT ON PAGE SKP CLA JMS I INI /HAD TO ASSMBL: RE-INIT PT JMS I POP /POP LINE INFO JMS I ICPLFS /PROCESS LFS TAD TEXCTR CIA DCA TEXCTR TAD TEXSUB /RE-INIT STRING INDEX DCA X0 DCA BYTE /SET FOR LEFT BYTE TEX5, JMS I GETCHR AND K77 /EXTRACT 6 BIT ISZ BYTE SKP JMP TEX4 /RIGHT BYTE CLL RTL RTL /MOVE LEFT RTL DCA TXSV CMA /SET PTR TO RT BYTE DCA BYTE SKP TEX4, JMS TEXSUB ISZ TEXCTR JMP TEX5 /NOT DONE ISZ BYTE /CK FOR ODD CHAR LEFT OVER SKP /NO JMS TEXSUB /YES JMP I POPEXP TEXSUB, 0 TAD TXSV /COMBINE LEFT & RT BYTES DCA I PTSPR TAD K30 /PAR CONST BITS TAD I PTCPR DCA I PTCPR TAD X0 /SAVE INDEX DCA TXSV JMS I ASIF /INC PTRS & ASSMBL IF PASS 2 TAD TXSV /RESTOR INDEX DCA X0 JMP I TEXSUB PUSH, PUSHIN POP, POPIN ASIF, ASMIF1 IFFS, IFFSUB DELIN, 0 TEXCTR, 0 TXSV=S3 BYTE=DELIN / /WRITE LINE IF IN PASS 2 / WLNIF1, 0 TAD PASS /WHICH PASS? SZA CLA JMS I WLNP /LISTING JMP I WLNIF1 / *2000 /READ & DECODE 1 LINE /IGNORES NULL LINES & COMMENT LINES / EXP=NON-0 IF NO OPERATION ON LINE (CONST, LIT, / OR ADDRESS ONLY) / SK=NON-0 IF SKIP INSTR. / UMIC=NON-0 IF OP CODE IS 6 OR 7 / IB=NON-0 IF INSTR IS INDIRECT / NSGN=NON-0 IF AFS IS # SYMBOL / OP=OP CODE / LFS=PTR TO LFS IN SYM. TAB., IF ANY /*** AFS=2 IF CONSTANT PARAMETER OR CONST. AFS*** /*** AFS=1 IF LITERAL PARAMETER OR LIT. AFS*** / AFS=SYM. TAB. PTR. TO ADDRESS PARAMETER OR AFS / DCIL, 0 RDL1, JMS I RLNP /READ IN A LINE DCA LFS /CLR STORAGE FOR LINE INFO DCA EXP DCA OP DCA SK DCA IB DCA NSGN DCA UMIC DCA I RECTI /CLR RECOUNT FLAG FOR CPLFS ISZ LINE /INC LINE COUNT ISZ X0 /DO NOT BACK UP X0 JMS I GETSYM /READ 1ST ITEM JMP RDL11 /NULL LINE OR COMMENT JMP RDL7 /SYMBOL - POSSIBLE LFS JMP .+3 /SET AFS=2 FOR CONSTANT RDL3, JMS I SLITAB /PUT LIT ON TAB CMA /AFS=1 FOR LITERAL RDL2, TAD K2 ISZ EXP /SET PARAMETER EXPRESSION FLAG RDL5, DCA AFS JMS I SKIPL /SKIP TO END OF LINE JMP I DCIL /RETURN RDL7, TAD CHR /CK FOR COMMA TAD M254 SZA CLA JMP RDL9 /NO, SHOULD BE SPACE,TAB,CR,OR ; JMS I WHATPP SKP IERROR /OP SYMBOL AS TAG TAD SYMBOL /NO, ENTER PTR TO LFS DCA LFS ISZ X0 /PROHIBIT FLAGGING COMMA JMS I GETSYM /GET ITEM AFTER LFS JMP I PB0 /NULL AFTER LFS IS BSS0 JMP RDL9 /SYMBOL-OP OR PARAMETER JMP RDL2 /CONSTANT JMP RDL3 /LITERAL RDL9, JMS I WHATPP JMP RDL4 /NO-MUST BE ADDRESS PARAMETER TAD USE /IS SYMBOLE A PSUEDO-OP AND K40 SZA CLA /NO JMP RDL18 /YES TAD USE /IS SYMBOL AN MRI? AND K400 SNA CLA JMP RDL14 /NO-OPR OR I/O INSTR. TAD USE /MRI-PUT OP SKIP BIT AND K20 /INTO SKIP FLAG DCA SK TAD VAL DCA OP SKP RDL10, ISZ IB / SET INDIRECT FLAG JMS I GETSYM /READ SYMBOL AFTER MRI IERROR /NOTHING THERE JMP RDL12 /SYMBOL IAC /AFS=2 FOR CONST. AFS IAC /AFS=1 FOR LIT.AFS JMP RDL5 /SKIP TO END OF LINE RDL12, TAD SYMBOL /CK FOR I CIA TAD IBTI /SYM. ADDR-I ADDR SNA CLA /NOT I JMP RDL10 /IT IS I JMS I WHATPP JMP .+3 IERROR /AFS NOT USER SYMBOL RDL4, ISZ EXP /ENTER HERE ON ADDRESS PAR. TAD CHR /CK FOR # TAD M243 SZA CLA JMP .+4 ISZ NSGN /YES JMS I GETCHR /PREVENT FLAGGING # CLA TAD SYMBOL /SET PTR TO AFS JMP RDL5 RDL13, JMS I WHATPP IERROR /ELIM USER SYM TAD USE /CK FOR OPR OR I/O INST. AND K4440 /ELIM. MRI, PSUEDO SZA CLA /OK IERROR /ILLEGAL SYMBOL RDL14, TAD USE /COMPARE NEW MICRO-GRP AND K300 /WITH OLD, IF ANY SNA JMP RDL16 /GRP0 OK WITH ANYTHING DCA TEM1 /NEW IS NOT 0 TAD MGRP /CK OLD MGP, IF ANY SNA /THERE IS ONE JMP RDL15 /0 OK WITH ANY NEW CIA /COMPARE OLD TAD TEM1 /WITH NEW SZA CLA /SAME-OK IERROR /ILLEGAL COMBINATION RDL15, TAD TEM1 /MICRO-GRP=NEW DCA MGRP RDL16, TAD VAL /OR NEW VALUE INTO OLD OP CMA /NOT A AND OP /AND B TAD VAL /+A DCA OP /=A OR B TAD USE /GET NEW SKIP BIT AND K20 SZA CLA /NON-SKIP ISZ SK /SET SKIP FLAG JMS I GETSYM /GET NEXT INSTR OF STRING JMP RDL17 /NONE THERE - END OF SRTING JMP RDL13 /SYMBOL (AS EXPECTED) NOP /CONST, ILLEGAL IERROR /LIT ILLEGAL RDL17, ISZ UMIC /SET MICRO INST FLAG JMP RDL5 /SKIP TO END OF LINE IBTI, II MGRP=UMIC RLNP, RLN PB0, PBSS2 K4440, 440 K300, 300 WHATPP, WHATYP M243, -243 /NULL LINE OR COMMENT RDL11, JMS I SKIPL JMP I NULLP /PSUEDO-OP RDL18, TAD VAL /GET PSUEDO-OP ADDRESS DCA TEM1 /STORE PTR JMP I TEM1 /TO PROPER PSUEDO-OP HANDLER *2200 / /END OF LINE PROCESSOR FOR COLLECTION PHASE /LOOKS FOR SEMI-COLON BEFORE A SLASH /STAR OR SLASH OR 000 (CR) MEANS NORMAL /END OF LINE. SEMI-COLON MEANS WE MUST /SAVE CURRENT ADDRESS IN LINE BUFFER FOR /START OF "NEXT" LINE. /THIS ROUTINE ALSO HAS THE IMPORTANT /FUNCTION OF WATCHING THE FORTR PSUEDO-OP /FLAG. IF FLAG IS ON L72 CAUSES LINE /TO BE TREATED AS NON-EXISTENT. L72 MUST /BE CALLED FOR EVER INSTR. LINE OR PSUEDO-OP /LINE (EXCEPT END, PAUSE, FORTR) BEFORE /ACTUAL PROCESSING OF THAT LINE BEGINS. / L72, 0 SKP JMS I GETCHR JMS I TEST SL6-1 BL7-SL6 IERROR L72S, TAD X0 DCA SCOLON L72X, TAD FORFLG /IF FLG=1 WE ARE SKIPPING SMA SZA CLA /1ST HALF OF FORTRAN OUTPUT JMP I DCIL1 JMP I L72 /KLUDGE TO RESET ILC BECAUSE A1 COMES BEFORE UDPAGE IN PASS 2 FIXILC, 0 TAD PASS SNA CLA JMP I FIXILC TAD PAG DCA ILC JMP I FIXILC / /COLLECTION PHASE ROUTINE /SEARCH PAGE SYMBOL TABLE FOR SYMBOL /CALLING SEQUENCE: (ASSUMES SYM.ID.IS IN "SYMBOL") / JMS SPSTB / RETURN IF NOT FOUND (HAD TO ENTER IT) / RETURN IF FOUND /THE SEARCH IS AT L31; ENTERING DONE BY L32. / SPSTB, 0 TAD PSTSZE /SIZE OF PST SZA /IS IT EMPTY JMP L31 /NO L32, TAD PSTSZE /IS PST FULL? TAD PSTMAX SMA CLA SERROR /YES TAD PSTSZE /SIZE OF PST*2 RAL CLL TAD PSTBSE /+BASE DCA PSTSPR /GIVES POINTER TO SYMBOL ISZ PSTSZE / INCREMENT COUNTER TAD SYMBOL /PHYSICALLY MOVE SYMBOL DCA I PSTSPR TAD PSTSPR IAC /ADD 1 DCA PSTCPR /FOR CODE WORD POINTER TAD PASS SNA CLA JMP L32A /ASSEMBLY: JUST ZERO CODE WORD JMS I OBSYM /LISTING SYMBOL TAD VAL /CK IF SYM IS ON PAGE FORWARD REF. AND K7600 /EXTRACT PAGE BITS CIA TAD PAG SZA CLA JMP L32A /NOT ON PAGE TAD K4000 /ON PAGE: SET DEFINED BIT ISZ SPSTB /& SET FOR "FOUND" RETURN L32A, DCA I PSTCPR JMP I SPSTB /NOT FOUND / L31, CIA /PLACE - COUNT OF TABLE DCA TEM1 /IN INDEX LOC TAD PSTBSE /PLACE TABLE BASE DCA TEM2 /IN ADDRESS LOC L31B, TAD I TEM2 /-SYMBOL CIA TAD SYMBOL /+ REQUESTED SYMBOL SNA CLA JMP L31A /FOUND ISZ TEM2 /NOT FOUNE ... INCREMENT ADDRESS ISZ TEM2 ISZ TEM1 /OVER JMP L31B /NO ... TRY AGAIN JMP L32 /YES ... PLACE ON TABLE L31A, ISZ SPSTB /FOUND ... INDEX FOR EXIT TAD TEM2 /POINTER TO SYMBOL DCA PSTSPR /TO PROPER LOC TAD PSTSPR /SYMBOL POINTER IAC /+1 DCA PSTCPR /GIVES CODE POINTER JMP I SPSTB /EXIT / PSTMAX, -100 /MUST BE (PSTB-PTB)/2 / /OUTPUT 6 CHARACTER ASCII NAME /TO BINARY TAPE /FOR EXTERNAL SYMBOL DEFN. /USED BY LFSCK (FOR RC=03) & 666 (FOR RC=17) /OUTPUT GOES VIA TYPE PTR, BUT PTR IS /CHANGED TO L66E SO CHAR CAN BE PUNCHED /& ADDED TO CK.SUM INSTEAD OF TYPED. /668 IS USED ONLY IN PAS1- /ASSEMBLY PHASE1 / L68, 0 TAD PASS SZA CLA JMP I L68 /EXIT IF LISTING TAD L66B /FOOL OUTPUT ROUTINE DCA TYPE /SO IT THINKS PUNCH IS TTY DCA S1 DCA S2 DCA S3 TAD AS0 DCA X1 TAD SYMBOL /MST SYMBOL ADDRESS - 1 DCA X2 /TO AUTO X2 TAD USE /MST USE WORD AND K3 /SYMBOL LENGTH CIA DCA TEM4 /-WORDS TO LOC CDF 00 TAD I X2 /OBTAIN SYMBOL CDF 10 DCA I X1 ISZ TEM4 JMP .-5 TAD AS0 DCA X2 TAD M3 DCA TEM4 TAD I X2 JMS I CTYPE /PUNCH IT EXPANDED ISZ TEM4 /MORE JMP .-3 /YES TAD L66D /RESTORE TYPE ROUTINE DCA TYPE JMP I L68 / / DUMMY TYPE ROUTINE FOR EST TV DEFINITION / T8=SPSTB /SCRATCH LOC L66E, 0 DCA T8 /SAVE CHAR TAD T8 TAD CSUM /ADD CHAR TO BINARY CHECK SUM DCA CSUM TAD T8 JMS I PUNCH /OUTPUT CHAR ON BINARY TAPE JMP I L66E /RETURN L66B, L66E L66D, L64 / /INITIALIZATION THAT WONT FIT IN "INITA" / INITMR, 0 DCA I VALPTP DCA I LLFSP DCA LINE JMP I INITMR VALPTP, VALPTR LLFSP, LLFS *2400 / /COLLECTION PHASE ROUTINE. /SEARCH LITERAL TABLE FOR VALUE IN S0. /PLACES LITERAL ON TABLE IS NOT THERE. /OTHERWISE DOES NOTHING. / SLTAB, 0 CLA TAD LTSZE /SIZE OF TABLE SZA /IS TABLE EMPTY JMP SLITB1 /NO ... SEARCH IT TAD LTBSE /BASE COLL. PHASE LIT. TABLE) TAD LTSZE /+DISPLACEMENT DCA TEM1 /GIVES ADDRESS POINTER TAD S0 /PHYSICALLY MOVE LITERAL CDF 00 DCA I TEM1 ISZ LTSZE /INCREMENT COUNT CDF 10 JMP I SLTAB /RETURN SLITB1, CIA /PLACE - COUNT DCA TEM1 CMA TAD LTBSE /LTBSE-1 DCA X1 /TO AUTO X1 SLITB2, CDF 00 TAD I X1 /-TABLE CDF 10 CIA TAD S0 /+REQUESTED LITERAL SNA CLA /SAME JMP I SLTAB /YES, RETURN ISZ TEM1 /MORE SYMBOLS TO TEST JMP SLITB2 /YES JMP SLTAB+5 /NO / /COLLECTION PHASE EQUIVALENCE PROCESSOR /(FORMERLY CALLED BSS0 PROCESSOR) /ENTERS SYMBOL ID. IN EQ. TAB / PBSS2, JMS I SKIPL TAD LFS /LOCATION FIELD SYMBOL SNA CLA /IS THERE ANY JMP I NULLP /NO CDF 00 TAD BSSSW /ARE WE PROCESSING A BSS 0 SEQUENCE SZA CLA JMP .+5 /YES ... SKIP INITIALIZING TAD EQVIPR /NO ... INITIALIZE DCA CTPTR /SET INPUT POINTER TO COUNT LOCATION DCA I CTPTR /ZERO COUNT ISZ EQVIPR /INCREMENT INPUT POINTER TAD LFS /LOCATION FIELD SYMBOL DCA I EQVIPR /PLACE LFS ON EQUIVALENCE TABLE ISZ I CTPTR /INCREMENT COUNT CDF 10 JMS I ICPLFS /PROCESS IT FOR COLLECTION CLA CMA /REMOVE LFS FROM LFS TABLE TAD LFSPTR DCA LFSPTR ISZ BSSSW /SET BSS 0 IN PROGRSS SWITCH CMA /REMOVE EXTRA LFS BIT TAD I PTCPR AND K7577X /REMOVE EXTRA BSS0 BIT TAD K200 /PLACE BSS0 BIT ON PT DCA I PTCPR TAD PSTCPR /SAVE PST ADDRESS IN CASE NEXT LINE OVERFLOWS DCA EQVBIT ISZ EQVIPR /INCREMENT POINTER JMP I NULLP /EXIT FOR NEXT LINE CTPTR, EQUTB LFSBSI, LFSBSS K7577X, 7577 / /ASSEMBLY PHASE EQUIVALENCE PROCESSOR /EXTRACTS ENTIRE GROUP OF TAGS EQUIVALENCED /TO SAME ADDRESS FROM TABLE & DEFINES /THEM BY USING LFSCK FROM LFSBSS ON. / ANUMCK, 0 TAD I PTCPR /PT CODE WORD AND K200 /MASK OUT BSS 0 BIT SNA CLA /IS IT A BSS 0 SYMBOL JMP I ANUMCK /NO ... EXIT CMA DCA BANK /BANK UNKNOWN TAD AANUM7 /CHEAT RETURN ADDRESS DCA I LFSCHK /SO IT LOOKS LIKE A JMS FROM SOMEWHERE ELSE JMS GNEQ /GET COUNT CIA /NEGATE DCA OPICTR /SAVE IN INDEX LOC JMS GNEQ /GET SYMBOL JMP I LFSBSI /PROCESS SYMBOL ANUM7, JMS I SPSTAB /SET DEFINED BIT ON PST IN CASE NOP /THIS WAS CARRIED OVER JMS I PSTD /THE LAST PAGE ISZ OPICTR /ANY MORE ? JMP ANUM7-2 /YES JMP I ANUMCK /EXIT PSTD, PSTDEF AANUM7, ANUM7 / / ROUTINE TO GET NEXT ITEM OFF EQUIVALENCE TABLE / GNEQ, 0 CDF 00 TAD I EQVOPR ISZ EQVOPR CDF 10 JMP I GNEQ / /SUBR. TO LIST A LINE IF IN PASS 2 / /CALLING SEQUENCE: JMS I WRITEP / JMS I OUTBIN / LOCATION OF WORD TO OUTPUT / CONSTANT=RELOC. CODE / RETURN /(CALL TO OUTBN MUST ALWAYS FOLLOW CALL /TO WRITE.) /ASSUMES CURRENT PC IS IN "ILC" /SETS FLAGS FOR PROPER LISTING /& CALLS WLN TO DO THE DRUDGE WORK. / WRITE, 0 TAD PASS SNA CLA JMP I WRITE /PASS 1 ISZ WRITE TAD I WRITE /ADDRESS OF VALUE DCA VALUE TAD I VALUE /GET VALUE DCA VALUE ISZ VFLG ISZ WRITE TAD I WRITE /GET RELOC. CODE DCA CODE TAD CODE SNA JMP WRITE2 RTR /CONVERT TO 6BIT RAR AND K7 TAD K60 CLL RTL RTL RTL DCA ADDRES /TEM SAVE TAD CODE AND K7 TAD K60 TAD ADDRES DCA CODE WRITE2, TAD ILC /CURRENT ADDRESS DCA ADDRES ISZ AFLG ISZ LFLG JMS I WLNP /LIST ISZ WRITE JMP I WRITE K60, 60 OPICTR=WRITE CDZSKP, JMS CDZSK *2600 / / BLOCK PSEUDO OPERATOR / PBSS, JMS I GETSYM /GET NEXT INPUT ITEM JMP I PBSS2I /NOTHING THERE (BSS 0) SKP /SYMBOL SKP CLA /CONSTANT IERROR /LITERAL JMS I SKIPL JMS I IPSHIN /SAVE ALL CURRENT INFO JMP I PBSS4I /CHECK BLOCK SIZE PBSS5, JMS IFFSUB /CAN THIS FIT IN CORE SKP CLA /YES JMS I INI /NO ... INITIALIZE PT POINTERS JMS I IPOPIN /POP CURRENT INFORMATION DCA BSSSW /CLEAR BSS0 SWITCH JMS I ICPLFS /PROCESS CURRENT LFS TAD S0 /-BLOCK CONSTANT CIA DCA TEM12 /TO INDEX LOCATION PBSS1, TAD K30 /PAR CONSTANT PT BIT STRUCTURE TAD I PTCPR /DONT LOSE LFS AND BSS 0 INFORMATION DCA I PTCPR JMS I ASMIF /DO THEM INDIVIDUALLY IF PASS 2 ISZ TEM12 /MORE JMP PBSS1 /YES JMP I POPEXP /EXIT TO GET NEXT LINE PBSS2I, PBSS2 TEM12, 0 /RESRV STORAGE CTR PBSS4I, PBSS4 / / CPAGE PSEUDO OPERATION / PIFF, JMS I GETSYM /GET NEXT INPUT ITEM NOP /NONE THERE SKP /SYMBOL SKP CLA /CONSTANT IERROR /LITERAL JMS I SKIPL JMS I WLNIF /LIST IF PASS 2 TAD S0 /BINARY CONSTANT JMS IFFSUB /USE GLOBAL IFF SUBROUTINE JMP I DCIL1 /DIDNT HAVE TO ASSEMBLE PAGE JMP I RSTRTI /GO INITIALIZE / / IFF SUBROUTINE / CALL IS TAD PAGE INCREMENT / JMS IFFSUB / OK RETURN / HAD TO ASSEMBLE PAGE RETURN /FUNCTION: TO SEE IF GIVEN NO. OF WORDS /WILL FIT ON CUR. PAGE; IF SO, RETURN /AT OK RET.; OTHERWISE ASSEMBLE PAGE WE /HAVE NOW & INIT A NEW PAGE & RET. AT /SECOND RET. LOC. /IFFSUB IS USED BY CPAGE,BLOCK & /SEVERAL OTHER P-OPS / / IFFSUB, 0 DCA TEM1 /SAVE INCREMENT JMS I ICPGES /COMPUTE PAGE SIZE TAD TEM1 /ADD INCREMENT TAD M201 /IS TOTAL .GT. PAGE SIZE (1 EXTRA BECAUSE SPA SNA CLA /PTSZE INCREMENTED BEFORE PSUEDO-OP JMP I IFFSUB /NO ... RETURN CLA CMA /YES ... DECREMENT PAGE TABLE SIZE TAD PTSIZ SNA /WATCH FOR AN EMPTY PAGE JMP .+4 /LEAVE THINGS ALONE IF PAGE EMPTY DCA PTSIZ JMS I L55I /ASSEMBLE THE PAGE JMS I UPDATE JMS I FIXIL ISZ IFFSUB /INCREMENT FOR EXIT JMP I IFFSUB /RETURN IPSHIN, PUSHIN IPOPIN, POPIN WLNIF, WLNIF1 ASMIF, ASMIF1 RSTRTI, RSTRT UPDATE, UDPAGE ICPGES=CPGESI M201, -201 FIXIL, FIXILC / ERROR ROUTINE / K6200, 6200 FATAL, 0 ERRE, TAD K6200 /0500 ERRS, ISZ FATAL /SET FATAL ERROR SWITCH TAD K600 /2300 JMP .+3 ERRM, TAD LFS DCA I LLFSI TAD K400 /1500 ERRI, TAD K600 /1100 ERRC, TAD K200 /0300 ERRA, TAD K100 /0100 DCA EFLG TAD PASS SZA CLA JMP ERREX /LISTING PASS JMS I CRLF /TYPE CRLF TAD EFLG /TYPE E# JMS I CTYPE TAD AT JMS I CTYPE JMS I CTYPE /TYPE 2 SPACES TAD I LLFSI DCA INDEX CDF 00 TAD I INDEX ISZ INDEX AND K3 CMA DCA COUNT TAD M3 /SET 6 CHAR PRINT CTR DCA MSCTR ISZ COUNT SKP /NOT DONE YET WITH SYMBOL JMP ERR1 /DONE : SEE IF SPACES NEEDED CDF 00 TAD I INDEX CDF 10 ISZ INDEX JMS I CTYPE /TYPE THE LETTERS OR SPACES ISZ MSCTR JMP .-11 ERR11, TAD SPPLUS /TYPE SPACE + JMS I TYPE TAD LINE /TYPE LINS FROM LAST LFS JMS I OTYPE JMS I CRLF ERREX, TAD FATAL /FATAL ERROR? SNA CLA JMP .+3 /NO HLT JMP I K200 /IF YES GO TO START AFTER HALT TAD PHASE /WHAT PHASE ARE WE IN SZA CLA JMP I ERR2 /ASSEMBLY JMP I NULLP /COLLECTION ERR2, ASM02R LLFSI, LLFS INDEX=S1 COUNT=S2 MSCTR=S3 AT, 0124 SPPLUS, 253 ERR1, JMS I CTYPE /FILL OUT THE REST WITH SPACES ISZ MSCTR JMP .-2 JMP ERR11 *3000 / /ASSEMBLY PHASE ROUTINE TO CHECK FOR A /LOC. TAG (LFS) & PROCESS IF FOUND. /FUNCTION: (ASMBLY PHASE 1 - ACTR=0) / (1) DEFINE TAG / (2) OUTPUT VALUE AT PAST OCCURANCES OF / FORWARD REF. TO THIS TAG / (3) CONDENSE OCC. TAB IF POSSIBLE. / / (ASMBLY PHASE 2 - ACTR=1 / (THIS INCLUDES ALL OF PASS 2 AS / ACTR STAYS=1 IN PASS 2) / (1) OUTPUT EXT. SYM. DEFN. ON REL-TAPE / LFSCK, 0 TAD I PTCPR /PT CODE WORD RAR SNL CLA /IS THERE A LFS JMP I LFSCK /NO ... RETURN CMA DCA BANK /BANK UNKNOWN TAD PASS /MOVE BACK PTR IF IN LISTING PASS CIA TAD LFSPTR DCA LFSPTR CDF 00 TAD I LFSPTR /ACTUAL LFS CDF 10 ISZ LFSPTR LFSBSS, DCA LFS JMS I OBSYM /OBTAIN LFS FROM MST LFS TAD ACTR /WHICH TIME ARE WE ASSEMBLING THIS PAGE /ACTR REMAINS 1 DURING PASS2 SZA CLA JMP L67 /SECOND TIME: NO TEST TAD USE /CK FOR MULTI DEF. AND K400 SZA CLA MERROR /YES JMP LFSCK1 L67, TAD USE /MST USE WORD AND K200 /(L67 HAS NO EFFECT IN PASS 2) SNA CLA /IS IT AN ENTRY JMP LFSCK1 /NO / / EXTERNAL SYMBOL DEFINITION / JMS I OUTBIN /OUTPUT BINARY DEFINITION ILC 3 JMS I L68I /PUNCH SYMBOL ON TAPE LFSCK1, TAD ILC /CUR ILC DCA VAL /PLACE ON MST AS DEFINITION TAD USE /SYMBOL TABLE USE WORD AND K7377 /MASK OUT DEFINED BIT TAD K400 /ADD IN DEFINED BIT DCA USE /SYMBOL IS NOW DEFINED IN MST / / NOW LETS SEARCH OCCURANCE TABLE TO SEE IF WE / CAN CLEAR OFF A FEW / TAD OTP /SIZE OF OCCURANCE TABLE CMA TAD TOPCOR SNA JMP I LFSCK /RETURN IF EMPTY CIA DCA TEM1 /PLACE - SIZE IN INDEX LOC TAD OTP /PLACE TABLE BASE IN TEM2 DCA TEM2 /TEM2=PTR TO SYMBOL CDF 00 L51, DCA L51FLG /CLR # SWITCH ISZ TEM2 CMA /CK 1ST WORD FOR # FLAG TAD I TEM2 SZA CLA JMP .+4 /NO ISZ L51FLG /YES, SET SWITCH ISZ TEM2 /MOVE PTR & CTR ISZ TEM1 /PAST EXTRA WORD TAD I TEM2 /- OCCURRING SYMBOL CIA TAD SYMBOL /+SYMBOL JUST DEFINED SNA CLA /ARE THEY EQUAL JMP .+7 ISZ TEM2 L51E, ISZ TEM1 /NO ... ARE THERE MORE ISZ TEM1 /(2 WORDS PER OCCURRANCE) JMP L51 /YES CDF 10 JMP I LFSCK /NO ... RETURN / / AN OCCURANCE FOUND ... OUTPUT IT / ISZ TEM2 TAD I TEM2 /ACTUAL ADDRESS CDF 10 DCA TEM4 JMS I DUMMY /OUTPUT ADDRESS AS ORIGIN TEM4 4 TAD VAL TAD L51FLG /ADD 1 IF # REF DCA TEM4 JMS I DUMMY /OUTPUT SYMBOL VALUE AS RELOCATABLE DEF TEM4 1 CDF 00 / / NOW MOVE OCCURANCE TABLE UP 2 / L51G, TAD OTP DCA TEM4 /SAVE TAD TEM2 DCA OTP /RESET TAD L51FLG TAD K2 CIA TAD TEM2 CIA TAD TEM4 SNA JMP L51E /NOTHING TO MOVE DCA TEM3 /CTR FOR MOVE UP TAD TEM3 CIA TAD TEM4 DCA TEM4 /TO PTR L51J, TAD I TEM4 DCA I OTP CMA TAD TEM4 DCA TEM4 CMA TAD OTP DCA OTP ISZ TEM3 JMP L51J JMP L51E L68I, L68 K7377, 7377 TOPCOR, CORE1 MERROR=JMP I . ERRM / / PUNCH ROUTINE / L63, 0 PLS /SELECT IT PSF /WAIT FOR PUNCH JMP .-1 CLA /EXIT WITH CLEAR AC JMP I L63 / /UPDATE "PAGE" TO NEXT CORE PAGE /I.E., PAGE =PAGE+200 / UDPAGE, 0 CLA TAD PAG /OLD PAGE SETTING TAD K200 /+SIZE OF ONE PAGE DCA PAG /FOR NEW PAGE SETTING JMP I UDPAGE /EXIT L51FLG=UDPAGE *3200 / / SUBROUTINE TO OUTPUT ASSEMBLY PHASE LITERAL / TABLE AND REMEMBER OCCURANCES / OAPLT, 0 TAD ACTR /SKIP IT THE 1ST TIME SNA CLA JMP I OAPLT JMS I SAVLNI /PREVENT ANY LINE TYPEOUT TAD LITSIZ /SIZE OF TABLE SNA JMP I OAPLT /RETURN IF NONE CIA DCA ATEM1 /PLACE - SIZE IN LOC CLA CMA TAD LITBSE /BASE - 1 DCA X2 /TO AUTO 12 TAD APMSW /ARE WE IN AUTO PAGING MODE SZA CLA JMP .+3 /NO ... OK TAD PGEESC /YES ... SUBRTACT SIZE OF PAGE ESCAPE RAR CLL /DIVIDED BY 2 TAD LITSIZ /& SUBTR. LITSIZ CIA DCA LITPTR /TEM SAVE TAD LITPTR TAD PAG /INITIALIZE PAGE ADDRESS TAD K200 DCA ILC TAD LITSIZ /INIT LIT TBL PTR CLL RAL /(MULT BY 2) TAD LITBSE DCA LITPTR IAC SKP / L52, ISZ ILC /INC PAGE LOC TAD M3 /DECREMENT LIT TBL PTR TAD LITPTR DCA LITPTR CDF 00 TAD I LITPTR /CODE DCA ATEM2 ISZ LITPTR TAD I LITPTR /SYMBOL OR LITERAL DCA ATEM3 CDF 10 CLA CMA TAD ATEM2 /IS CODE 1 ... LITERAL SZA CLA JMP L53 /NO ... SYMBOL JMS I ILC4P /YES ... OUTPUT PAGE ADDRESS AS ORIGIN JMS I WRITEP JMS I OUTBIN /OUTPUT LITERAL WITH NO RELOCATION ATEM3 0 L52A, ISZ ATEM1 /MORE JMP L52 /YES ISZ ILC /SET FOR ESCAPE JMP I OAPLT /NO ... RETURN L53, JMS I OBSYM /OBTAIN SYMBOL FROM MST ATEM3 TAD USE /MST USE WORD AND K400 /IS SYMBOL DEFINED SNA CLA JMP L53A /NO ... OCCURANCE JMS I ILC4P /YES ... OUTPUT ORIGIN TAD ATEM2 AND K4 SZA CLA IAC /ITS A # TAD VAL /ACTUAL VALUE DCA ATEM3 /TO DIRRECTLY ADDRESSABLE LOC JMS I WRITEP JMS I OUTBIN /OUTPUT VALUE ATEM3 1 /RELOCATABLE JMP L52A /TRY MORE L53A, TAD ILC DCA ATEM4 JMS L53B /PLACE ON OCCURANCE TALBE JMP L52A /TRY MORE / / SUBROUTINE TO CREATE AN OCCURANCE IN OCCURANCE TABLE / L53B, 0 TAD OTP CIA CLL IAC /ALLOW FOR # FLAG TAD STT /+TOP OF MST SZL CLA /OVERFLOW? SERROR /YES ... OUT OF CORE TAD M2 TAD OTP /OT SIZE - 2 DCA OTP /GIVES ADDRESS ON OCCUR TABLE TAD OTP DCA X1 CDF 00 TAD ATEM3 /SYMBOL DCA I X1 /TO OCCUR TABLE TAD ATEM4 /PAGE ADDRESS DCA I X1 /TO OCCUR TABLE TAD ATEM2 /CK FOR # AND K4 SNA CLA JMP .+6 /NO IAC /SET FLAG WORD DCA I OTP CMA /MOVE DOWN PTR TAD OTP /PAST EXTRA WORD DCA OTP CDF 10 JMP I L53B /TRY MORE / ATEM1, 0 ATEM2, 0 ATEM3, 0 ATEM4, 0 SAVLNI, SAVLIN LITPTR, 0 PFORT, ISZ FORFLG /SET TO 1 FOR 1ST PASS THRU FORTRAN CODE NOP /END PSUEDO SETS IT TO -1 TO NULLIFY JMS I SKIPL /SO BACK TO 0 FOR 2ND PASS JMP I NULLP / /DO SOME WORK FOR L61A / L61C, DCA TEM2 /SAVE 6-BIT CODE TAD TEM2 AND K40 SNA CLA TAD K100 /ADD CORRECT LEADING BITS TAD K200 TAD TEM2 /ADD CHAR BITS JMP I L61DP L61DP, L61D ILC4P, ILC4 *3400 / / ROUTINE TO PUNCH WORD AND RELOCATION BITS ON TAPE / CALL IS / JMS OUTBN / ADDRESS OF WORD / BITS / OUTBN, 0 CLA CLL TAD I OUTBN /ADDRESS OF WORD DCA OUT1 ISZ OUTBN TAD I OUTBN /RELOCATION BITS RTL /SHIFT LEFT 4 RTL DCA OUT2 /SAVE TAD PASS SZA CLA JMP OUTEX TAD I OUT1 /ACTUAL WORD DCA OUT1 /MUST DO THIS SINCE WE DO A JMS OUTBN;CSUM;10 TAD OUT1 /AT LOC. PCSM, AND OTHERWISE CSUM WOULD CHANGE AFTER CALL TO SUM. RTL /ROTATE HIGH 4 BITS TO LOW RTL RAL AND K17 /MASK TAD OUT2 /ADD REL BITS JMS SUM /ADD TO CHECK SUM JMS I PUNCH /PUNCH IT TAD OUT1 /REMAINDER OF WORD AND K377 /MASK TO 8 BITS JMS SUM /ADD TO CHECK SUM JMS I PUNCH /PUNCH IT OUTEX, ISZ OUTBN /INDEX FOR EXIT JMP I OUTBN /RETURN SUM, 0 DCA TSUM TAD CSUM TAD TSUM DCA CSUM TAD TSUM JMP I SUM TSUM=NSGN OUT1=IB OUT2=TEM5 K377, 377 K17, 17 / / ROUTINE TO SEARCH ASSEMBLY PHASE LITERAL TABLE / FOR 2 WORD ENTRY IN S0-S1 / PLACES ON TABLE IF NOT THERE / RETURNS PAGE ADDRESS IN AC / SRALT, 0 CLA DCA TEM2 /ZERO SEARCH COUNTER CDF 00 TAD LITSIZ /NO OF ENTRYS SZA JMP L40 /NON ZERO ... SEARCH L39, TAD LITSIZ /NO OF ENTRYS - 1 RAL CLL /MULTIPLY BY 2 TAD LITBSE /ADD BASE OF TABLE DCA TEM1 /GIVES ADDRESS OF NEW ENTRY ISZ LITSIZ /INCREMENT COUNT TAD S0 /FIRST WORD DCA I TEM1 /TO TABLE ISZ TEM1 /INCREMENT ADDRESS TAD S1 /SECOND WORD DCA I TEM1 /TO TABLE TAD LITSIZ /ENTRY NO / COMPUTE PAGE ADDRESS FROM DISPLACEMENT IN TABLE / AND STATUS OF AUTOMATIC PAGING MODE SWITCH AND SIZE OF PAGE / ESCAPE REQUIRED / L40A, DCA TEM1 /SAVE LOCATION IN TABLE TAD PASS SZA CLA JMP L40C /LISTING TAD APMSW /ARE WE IN AUTOMATIC PAGING MODE? SNA CLA TAD PGEESC /YES - COUNT ESCAPE WORDS L40DR, CLL RAR /(OVER 2) L40D, TAD TEM1 /NO ... COMPUTE PAGE ADDRESS CIA /BY STRAIGNT COMPLEMENTATION METHOD AND K377 /MASK CDF 10 JMP I SRALT /EXIT /FOR AUTO PAGING MODE L40, CIA DCA TEM1 /- NO OF ENTRYS TO LOC CLA CMA TAD LITBSE /BASE OF TABLE - 1 DCA X1 /TO AUTO 10 L41, ISZ TEM2 /INCREMENT SEARCH COUNTER TAD I X1 /- FIRST WORD FROM TABLE CIA TAD S0 /+FIRST COMP WORD SZA CLA JMP L40B /NO MATCH TAD I X1 /-SECOND TABLE WORD CIA TAD S1 SZA CLA JMP .+4 /NO MATCH TAD TEM2 /MATCH ... CTR TO AC JMP L40A /RETURN L40B, ISZ X1 /INCREMENT FOR NO SECOND COMPARISON ISZ TEM1 /OVER JMP L41 /NO ... TRY MORE JMP L39 /YES ... PLACE ON TABLE L40C, CDF 10 TAD I REDUCP /GET PAGE ESC COMPUTED BY A1 JMP L40DR REDUCP, REDUCE / / HAS COMMON BEEN PUNCHED YET SUBROUTINE /IF IT HAS ALREADY BEEN PUNCHED, EXIT /IF NOT, PUNCH IT & SET FLAG /THIS ROUTINE IS CALLED ONLY ONCE PER PROGRAM /BUT IT COULD BE CALLED FROM ANY OF SEVERAL PLACES / HCBPS, 0 TAD CPSW /COMMON PUNCHED SWITCH SNA CLA /HAS IT BEEN PUNCHED JMP I HCBPS /YES ... RETURN DCA CPSW /NO ... CLEAR SWITCH JMS I OUTBIN /AND PUNCH HIGHEST COMMON ASSIGNED HICOM 12 JMP I HCBPS /EXIT DUMSUB, JMS DUMS / /INCREMENT PAGE TABLE PTRS /TO PREPARE FOR NEXT INSTRUCTION (OR PARAMETER) / INCPT, 0 ISZ PTSZE /INCREMENT PAGE TABLE SIZE JMS I ISZPT2 DCA EQVBIT /CLR DCA I PTCPR /INITIALIZE PAGE TABLE CODE WORD DCA I PTSPR /INITIALIZE PAGE TABLE SYMBOL WORD CDF 00 DCA I PTOPR /INITIALIZE PT OP CODE POINTER CDF 10 TAD CURSKP /MOVE CURRENT SKIP INSTRUCTION INDICATOR DCA LSTSKP /TO LAST INSTRUCTION SKIP INDICATOR TAD BANK /MOVE CURRENT BANK DCA LSTBNK /TO LAST BANK JMP I INCPT /RETURN ISZPT2, ISZPT // //FOLLOWING CODE MOVED HERE TO MAKE ROOM FOR V03 IN ASME3 ASMEXT, JMS I OUTSKP /YES, OUTPUT SKP TAD ILC /GET PG.LOC.PTR. AND K177 TAD K5204 /OUTPUT JMP .+4 DCA TEM1 JMP I .+1 REEASM K5204, 5204 *3600 / ABSYM PSEUDO OPERATOR / PABSYM, TAD K400 JMS DEFSUB CLA JMP DEF1 /SKPDF & OPDEF PSUEDO-OPS SKPDEX, TAD K20 /PUT IN SKIP BIT OPDEX, TAD K3010 /STANDARD OP BITS JMS DEFSUB CLL AND K7000 /CK TYPE OF INST TAD K2000 SNA CLA JMP DEF1 /IOT SNL JMP DEF3 /MRI TAD S0 /OPR, BUT WHICH GRP? AND K401 CLL RAR SNA CLA JMP DEF2 /GRP1 SZL TAD K100 /GRP3 TAD K200 /GRP2 DEF1, TAD TEM5 DCA USE TAD S0 DCA VAL TAD VAL JMP I NULLP DEF2, TAD K100 JMP DEF1 DEF3, TAD K400 JMP DEF1 K401, 401 K3010, 3010 / /UTILITY FOR PABSYM & OPDEX /CALL WITH MST CODE WORD EXCEPT BITS 10-11 /IN AC. EXITS WITH SYMBOL VALUE /AS DEF. BY SOURCE TAPE IN S0 & IN AC. / DEFSUB, 0 DCA TEM5 JMS I GETSYM /GET THE SYMBOL NAME JMP DEFERR /NULL JMP .+3 /SYMBOL K7000, NOP JMP DEFERR /CONST. OR LIT. TAD S0 /ADD IN SYM LENGTH TAD TEM5 DCA TEM5 JMS I GETSYM /GET VALUE NOP /NULL SKP /SYMBOL K7410, SKP /CONST DEFERR, IERROR /LIT. JMS I SKIPL TAD S0 /VALUE JMP I DEFSUB / /OCTAL TYPEOUT /CALLING SEQUENCE: TAD (OCTAL#) / JMS L62 / RET. AC=0 / L62, 0 CLL RAL /PUSH THRU LINK DCA TEM1 TAD M4 /SET CTR DCA TEM2 L62A, TAD TEM1 RTL RAL DCA TEM1 TAD TEM1 AND K7 TAD K260 JMS I TYPE ISZ TEM2 JMP L62A JMP I L62 M4, -4 K260, 0260 / /DUMMY OUTPUT ROUTINE /REPLACES OUTBN DURING ASMBLY PHASE 1 /CALLING SEQUENCE: JMS DUMMY / ADDR. OF ARG / RELOC. CONST. / RETURN /NOTE: SAME CALLING SEQ. AS OUTBN / DUM, 0 CLA CLL ISZ DUM /INDEX FOR PROPER EXIT ISZ DUM /INDEX FOR PROPER EXIT JMP I DUM / / ROUTINE TO SEARCH EXTERNAL SYMBOL TABLE / FOR CUR SYMBOL - RETURNS EXTERNAL SYMBOL / NUMBER IN AC - PLACES SYMBOL ON TABLE / AND OUTPUTS BIN CODE FOR TV IF NOT ON TABLE / L66, 0 TAD ESTSIZ /IS TABLE FULL? TAD M100 M100, SMA CLA SERROR /YES TAD ESTSIZ /SIZE OF EST SZA /IS TABLE EMPTY JMP L66A1 /NO ... SEARCH IT L66A3, CLA CMA /YES ... PLACE SYMBOL ON IT ISZ ESTSIZ /INCREMENT TABLE SIZE TAD BSEEST /BASE TAD ESTSIZ /+SIZE DCA TEM1 /GIVES ADDRESS OF NEW ENTRY TAD SYMBOL /PHYSICALLY PLACE ON TABLE CDF 00 DCA I TEM1 CDF 10 TAD USE /MST CODE WORD AND K403A /SAVE LENGTH AND DEFINITION BIT TAD K2000 /ADD EXTERNAL BITS DCA USE JMP L66A /GO TO PUNCH TV DEF L66A1, CIA DCA TEM2 /PLACE -SIZE IN INDEX LOC DCA TEM3 /ZERO COUNT CLA CMA TAD BSEEST /BASE OF EST - 1 DCA X1 /TO AUTO X1 L66A2, ISZ TEM3 /INCREMENT COUNT LOC CDF 00 TAD I X1 /-TABLE SYMBOL CDF 10 CIA TAD SYMBOL /+ CUR SYMBOL SNA CLA /COMPARE JMP .+4 /SAVE ISZ TEM2 /NOT SAME ... ANY MORE JMP L66A2 /YES ... KEEP TRYING JMP L66A3 /NO ... PLACE ON TABLE TAD TEM3 /PLACE COUNT IN AC JMP I L66 /RETURN / / OUTPUT BINARY EXTERNAL SYMBOL / HCBPS L66A, JMS I .-1 /CHECK TO SEE IF COMMON HAS BEEN PUNCHED JMS I OUTBIN /TV DEF FOR 1 SYMBOL K1 17 JMS I L62A1 /PUNCH ASCII CHARS TAD ESTSIZ /EST NO TO AC JMP I L66 /RETURN L62A1, L68 K403A, 403 K1, 1 *4000 / /SYMBOL TABLE LISTING ROUTINE /TYPES TABLE FROM "STTP" UP /WITH NAME-VALUE-FLAG /POSSIBLE FLAGS ARE: EXT, COM, UNDF, ABS, OP /FLAGS TYPED BY "STFT" /TABLE LISTED ALPHABETICALLY WITH NUMERIC /CHARACTERS .GT. ALPHABETIC / PRSYM, 0 DCA PFLG /CLR PRSYM-PASS FLAG TAD I LSTDEP SNA CLA JMP .+3 TAD PUNCH /LIST ON H.S. PUNCH DCA TYPE JMS I CRLF PRS1, TAD PST /INIT SPTR AT TOP OF PERM. S.T. DCA SPTR TAD M3 /FILL S1,S2,S3 WITH 7777'S (MAX) DCA ALEN TAD APTR DCA X1 CMA DCA I X1 ISZ ALEN JMP .-3 TAD K3 /AND LENGTH=3 DCA ALEN DCA FOUND /CLR EXIT FLAG PRS2, TAD STT /HAS SEARCH HIT END OF TABLE? CIA TAD SPTR SNA CLA JMP PRS7 /YES, USE THE A-SYM WE HAVE JMS I OBSYM /NO, GET NEXT MST ENTRY SPTR TAD BCODE /EXTRACT LENGTH AND K3 DCA BLEN TAD BPTR /INDEX NEW ENTRY DCA X2 TAD BLEN /SET ENTRY CTR CIA DCA BCTR TAD ALEN /SET A-SYM CTR CIA DCA AACTR TAD APTR /INDEX A-SYM DCA X1 TAD PFLG /IS THIS THE FIRST TIME THRU THE TABLE? SZA CLA JMP PRS3 /NO TAD BCODE /YES, CLR ENTRY BIT 0 AND K3777 /(THE HAS-BEEN-PRINTED FLAG) DCA BCODE PRS3, TAD BCODE /HAS THIS SYMBOL BEEN PRINTED ALREADY? SPA CLA JMP PRS6 /YES, IGNORE IT PRS4, TAD I X1 /NO, COMRARE A-SYM WORD CIA CLL CDF 00 TAD I X2 /WITH B-SYM WORD CDF 10 SNA JMP .+4 /MATCH SO FAR SNL CLA JMP PRS5 /A-SYM WORD IS BIGGER-- USE B-SYM JMP PRS6 /VICE-VERSA ISZ AACTR /IS A-SYM DONE? SKP /NO JMP PRS6 /YES, STICK WITH A-SYM ISZ BCTR /IS B-SYM DONE JMP PRS4 /NO, TRY NEXT WORD PRS5, ISZ FOUND /YES, B-SYM IS NEW A-SYM /SET CONTINUE FLAG TAD BPTR /INDEX B-SYM DCA X2 TAD APTR /CLR STORAGE FOR NEW A-SYM DCA X1 DCA I X1 DCA I X1 DCA I X1 TAD APTR /RESET A-SYM INDEX DCA X1 TAD BLEN /CTR FOR TRANSFER CIA DCA ALEN CDF 00 TAD I X2 /MOVE B-SYM TO A-SYM CDF 10 DCA I X1 ISZ ALEN JMP .-5 TAD BLEN /NEW LENGTH DCA ALEN TAD BVAL /NEW VALUE DCA AVAL TAD BPTR /NEW PTR DCA ASAV PRS6, TAD BPTR /MOVE SPTR TO NEXT MST ENTRY TAD BLEN TAD K2 DCA SPTR JMP PRS2 /CONTINUE SEARCH PRS7, TAD FOUND /HAS ANOTHER SYMBOL BEEN FOUND? SNA CLA JMP PRS8 /NO, EXIT JMS I OBSYM /YES ASAV TAD USE TAD K4000 DCA USE /SET HAS-BEEN-PRINTED BIT ISZ PFLG /SET PASS FLAG JMS I CRLF /POSITION PRINT TAD APTR /INDEX SYMBOL DCA X1 TAD M3 /SET CTR DCA ALEN TAD I X1 /PRINT SYMBOL JMS I CTYPE ISZ ALEN JMP .-3 JMS I CTYPE /PRINT 2 SPACES TAD AVAL /PRINT VALUE JMS I OTYPE TAD USE /MOVE TYPE BITS TO LOW AC RTL /& DEF. BIT TO LINK RTL JMS I STFTI /TYPE FLAGS IF ANY JMP PRS1 /LOOK FOR ANOTHER SYMBOL TO PRINT PRS8, JMS I CRLF JMS I CRLF JMP I PRSYM STFTI, STFT ASAV=UMIC PFLG=TEM3 PST, STTP /TOP OF PERMANENT SYMBOL TABLE ALEN=S0 APTR=AS0 BPTR=SYMBOL BVAL=VAL BCODE=USE FOUND=TEM4 SPTR=TEM5 BLEN=LFS BCTR=OP AACTR=IB AVAL=AFS K3777, 3777 LSTDEP, LSTDEV *4200 / /ROUTINE TO PUSH DOWN CUR.LINE FOR NEXT PAGE. /SAVES ENTIRE LIST OF VITAL INFO /(LFS, OP, IB,...,BANK, S0) IN TEMP.LOCS /(TLFS, TOP, TIB,..., TS0) /BOTH LISTS MUST BE KEPT IN SPECIFIED /ORDER. /IF THERE IS AN LFS ON LINE MUST MARK IT /NO-LONGER-DEFINED-ON-PAGE IN PST. / PUSHIN, 0 TAD LFS /IS THERE AN LFS SNA CLA JMP PSHIN2 /NO JMS I OBSYM LFS JMS I SPSTAB /GET ITS POINTERS TO THE PAGE SYMBOL TABLE NOP TAD I PSTCPR /KILL THE DEFINED BIT AND K3777A DCA I PSTCPR /SET PAGE SYMBOL TABLE CODE WORD OFF PAGE PSHIN2, JMS PUSHER LFS-1 TLFS-1 JMP I PUSHIN /RETURN / / ROUTINE TO POP UP A PUSHED DOWN INSTRUCTION / POPIN, 0 CLA JMS PUSHER TLFS-1 LFS-1 JMP I POPIN /RETURN TLFS, 0 /KEEP THIS LIST ORDERED AS GIVEN TOP, 0 TIB, 0 TAFS, 0 TUMIC, 0 TNSGN, 0 TEXP, 0 TSKZ, 0 TBANK, 0 TS0, 0 / /TRANSFER ANY LIST OF 10 (12 OCTAL) ITEMS /FROM ONE LIST TO ANOTHER /CALL SEQ.: JMS PUSHER / ADDR-1 OF FROM-LIST / ADDR-1 OF TO-LIST / RET. / PUSHER, 0 TAD M12A DCA TEM1 /CTR TAD I PUSHER DCA X1 /INDEX FROM LIST ISZ PUSHER TAD I PUSHER DCA X2 /INDEX TO LIST TAD I X1 DCA I X2 ISZ TEM1 JMP .-3 ISZ PUSHER JMP I PUSHER M12A, -12 K3777A, 3777 /RETRN PSUEDO-OP / PRTN, JMS I GETSYM /GET NEXT INPUT ITEM SKP /NOTHING JMP .+3 /SYMBOL NOP /CONSTANT IERROR /LITERAL JMS I SKIPL JMS I SREST /PLACE SYMBOL ON EXTERNAL SYMBOL TABLE DCA PRTN0 /SAVE SYMBOL ID JMS PUSHIN /PUSH LFS INFO IN CASE OF PAGE ASSEMBLY TAD K2 /SET AC TO 2 JMS I PRTN1 /ARE THERE 2 LOCATIONS ON THIS PAGE SKP CLA /YES JMS I INI /NO ... HAD TO ASSEMBLE PAGE ... INITIALIZE PT JMS POPIN /POP LFS INFO FROM PAGE PUSH LIST JMS I ICPLFS /PROCESS ANY LFS TAD I PTCPR /PT CODE WORD WITH POSSIBLE LFS BIT TAD K30 /ADD SPECIAL RELOCATION BIT DCA I PTCPR /PLACE PROPER CODE WORD ON PT TAD DOTRTN DCA I PTSPR /PLACE JMS .RTN INSTRUCTION IN PT SYMBOL WORD JMS I PRTN3 /INCREMENT PT POINTERS TAD K130 /PROPER BIT PATTERN DCA I PTCPR /TO PT CODE WORD TAD PRTN0 /PLACE EXTERNAL SYMBOL NUMBER ON PT DCA I PTSPR /AS SYMBOL WORD JMS I PRTN3 /INCREMENT PT POINTERS JMP I POPEXP /EXIT FOR NEXT LINE DOTRTN, JMS RTN PRTN0, 0 PRTN1, IFFSUB PRTN3, ASMIF1 / / @PAUSE@ PSEUDO OPERATION / PPAUSE, JMS I WLNIFI /LIST IF PASS 2 CLA HLT /WAIT FOR OPERATOR ACTION RFC /SELECT READER JMS I INITRP JMS I SKIPL PPAUS1, CMA /WE REACH THIS ONLY IF FORFLG. LE. 0(ALSO COME FROM *PEND*) DCA FORFLG /SHUT OFF FORTR IN CASE GUY /HAS STARTED HIS TAPE IN /THE MIDDLE JMP I DCIL1 /RETURN FOR NEXT LINE WLNIFI, WLNIF1 / /OVERAL ASSEMBLY INITIALIZATION / INITA, 0 CDF 10 DCA I FATALP JMS I CRLF JMS I CRLF TAD PEB DCA I PEPTRP JMS PUSHER /INIT HICOM, PAGE, ESTSIZ, EQVBIT & APMSW ETC K777-1 HICOM-1 JMS I INITRP TAD PASS SZA CLA JMP I INITA DCA SYMBOL /PROTECT FROM RUSVL JMS I INITMP DCA CSUM TAD K10 /SET PUSH CTR=-2 JMS PUSHER /INIT OTP & STP OTPR-1 OTP-1 JMS I LEADI JMP I INITA OTPR, CORE1-1 /KEEP STTR IMMEDIATELY AFTER OTPR STTR, STTP /***** KEEP ITEMS SO INCLOSED IN GIVEN ORDER K777, 177 200 0 0 0 1 1 0 0 0 /****************** INITRP, INITR FATALP, FATAL PEPTRP, PEPTR LEADI, LEADER PEB, PEBSE INITMP, INITMR *4400 / / ROUTINE TO SEARCH SYMBOL TABLE FOR SYMBOL IN S0-S3 / PLACES SYMBOL ON TABLE IF NOT THERE / CALL IS / JMS SRSYM / NOT FOUND EXIT / FOUND EXIT /RETURNS WITH SYMBOL CODE BITS IN "USE" /SYMBOL VALUE (0 IF NOT DEFINED) /IN "VAL" /& PTR TO SYM.TAB. ENTRY IN "SYMBOL" /THE LATTER ADDRESS IS REFERRED TO HERE IN /AS THE SYMBOL "ID" /SRSYM CALL RUSVL TO STORE USE & VAL /OF LAST REFERENCED SYMBOL IN MST /IN CASE THEY HAVE BEEN CHANGED /IN THE MEANWHILE. / SRSYM, 0 JMS RUSVL TAD MST /START AT SYM. TAB. BASE SRS1, DCA SYMBOL /SET PTR. TO NEXT ENTRY TAD STT /COMPARE PTR. WITH SYM. TAB. TOP CIA TAD SYMBOL SNA CLA /CONTINUE SEARCH JMP SRS2 /NAME NOT IN TABLE ENTER IT CDF 00 TAD I SYMBOL /GET ENTRY CODE WORD CDF 10 AND K3 /EXTRACT SYMBOL LENGTH DCA TEM2 TAD TEM2 CIA /NEGATE FOR COMPARE & CTR. DCA TEM1 TAD TEM1 /COMPARE ENTRY & LOOK-UP SYMBOL LENGTHS TAD S0 SZA CLA /SAME LENGTH; COMPARE LETTERS JMP SRS5 /NOT SAME; GO TO NEXT ENTRY TAD AS0 /AUTO-INDEX LOOP-UP SYMBOL DCA X1 TAD SYMBOL /AUTO-INDEX TABLE ENTRY DCA X2 SRS3, CDF 00 TAD I X2 /GET TABLE ENTRY CHAR. PAIR CIA CDF 10 TAD I X1 /COMPARE LOOK-UP SYMBOL CHAR. PAIR SZA CLA /SAME JMP SRS5 /NO MATCH ISZ TEM1 /CK SYM. LEN. CTR. JMP SRS3 /NOT DONE, TRY NEXT CHAR. PAIR SRS4, JMS SUSVL /GET USE & VAL WORDS JMP I SRSYM SRS5, TAD SYMBOL /PTR TO LAST ENTRY TAD K2 /+2 FOR USE & VAL WORDS TAD TEM2 /+ENTRY SYMBOL LENGTH JMP SRS1 /=PTR TO NEXT ENTRY / /CURRENT SYMBOL NOT ON TABLE ... PLACE IT THERE / SRS2, TAD OTP /WILL NEW ENTRY FIT BELOW CIA CLL /OCCURANCE TABLE? TAD SYMBOL TAD S0 SZL CLA /0 LINK=YES SERROR /NO, SYMBOL TABLE OVERFLOW TAD S0 /ENTRY CODE WORD = SYM. LEN. TAD K1000 /+REL BIT CDF 00 DCA I STT /PUT CODE IN 1ST WORD OF NEW ENTRY TAD STT /AUTO-INDEX ENTRY DCA X2 TAD AS0 /AUTO-INDEX SYMBOL TO BE STORED DCA X1 TAD S0 /SET SYM. LEN. CTR. CIA DCA TEM1 ERS1, CDF 10 TAD I X1 /MOVE SYMBOL CHAR. PAIR TO TABLE CDF 00 DCA I X2 ISZ TEM1 /CK. CTR. JMP ERS1 /NOT DONE DCA I X2 /CLR VALUE WORD TAD STT /SAVE PTR TO NEW ENTRY DCA SYMBOL TAD X2 /RESET PTR. TO SYM. TAB. TOP IAC DCA STT CDF 10 JMP SRS4 / /OBTAIN GIVEN SYMBOL'S VITAL INFO FROM MST /CALL SEQ: JMS OBNSYM / ADDRESS OF SYMBOL ID / RET. /OBNSYM LEAVES SYMBOL ID IN "SYMBOL", / SYMBOL CODE WORD IN USE, / SYMBOL VALUE IN VAL. /OBNSYM CALLS RUSVL BEFORE ACTION /FOR SAME REASON AS SRSYM DOES. / OBNSYM, 0 JMS RUSVL TAD I OBNSYM /ADDRESS OF SYMBOL DCA TEM1 TAD I TEM1 /ACTUAL SYMBOL DCA SYMBOL ISZ OBNSYM /INDEX FOR EXIT JMS SUSVL /SET UP USE AND VALUE WORDS JMP I OBNSYM /RETURN WHEN FOUND / / ROUTINE TO SET UP USE AND VALUE WORDS / SUSVL, 0 CDF 00 /OFF TO BANK 1 TAD I SYMBOL /MST USE WORD FROM BANK 1 DCA USE /TO BANK 0 USE LOCATION TAD USE AND K3 IAC TAD SYMBOL DCA VALPTR TAD I VALPTR /MST VALUE WORD FROM BANK 1 DCA VAL /TO BANK 0 VALUE LOCATION CDF 10 /RESTORE DATA FIELD JMP I SUSVL /RETURN RUSVL, 0 CDF 00 TAD USE DCA I SYMBOL TAD VAL DCA I VALPTR CDF 10 JMP I RUSVL VALPTR, 0 /PTR TO CURRENT VAL WORD IN MST / /READ A CHARACTER / IGNORES LF, FF, RO, LEADER / ALSO CHECKS CHAR AS TO TYPE /CALLING SEQ: JMS RCH / RETURN IF CHAR IS A DIGIT / RETURN IF CHAR IS ALPHABETIC / RETURN FOR ALL OTHER (PUNCT,ETC) /LEAVES AC==0 / CHR=ASCII VALUE OF INPUT CHARACTER /CALLS SRT RCH, 0 JMS I GETCHR /GET 1 CHAR SNA JMP RCH3 /0=END OF LINE TAD M260 SPA JMP RCH3 /TAKE PUNCT.EXIT (200-257) TAD M12 SPA JMP RCH4 /TAKE DIGIT EXIT (260-271) TAD M7 SPA JMP RCH3 /TAKE PUNCT, EXIT (272-300) TAD M37A SMA RCH3, ISZ RCH /PUNCT, EXIT (337-376) ISZ RCH /ALPHA EXIT (301-336) RCH4, CLA /DIGIT EXIT JMP I RCH M260, -260 M12, -12 M37A, -36 /FORCE BUFFER FILL ON FIRST READ INITR, 0 TAD MBE DCA X3 JMP I INITR MBE=LINAX /=LAST WORD OF DATA BUFFER *4600 /SUBR TO READ 1 LINE INTO LINE BUFFER RLN, 0 DCA LFLG /CLR NON-NULL LINE FLAG TAD SCOLON /IF LAST LINE ENDED WITH ; SZA /NO NEED TO READ ANOTHER JMP RLN4 TAD LINAX /INIT STORAGE AUTO-INDEX DCA X2 RLN2, JMS FETCH /GET A CHARACTER JMS I TEST /IS IT A CR,TAB,SP,FF,LF? SL7-1 /IF SO GO TO RLN15,3,3,2,2 BL6-SL7 ISZ LFLG /OTHERWISE A NON-NULL LINE RLN3, JMS I STOREP /OTHERWISE PUT IT IN THE BUFFER TAD X2 /IS BUFFER FULL? TAD LINEND SZA CLA JMP RLN2 /NO CMA TAD X2 DCA X2 /IF SO MOVE BACK PTR JMP RLN2 RLN15, DCA CHR /TERMINATE LINE WITH 0 JMS I STOREP DCA AFLG DCA EFLG DCA VFLG DCA CODE TAD LINAX /INIT LINE INDEX RLN4, DCA X0 DCA SCOLON /CLR JMP I RLN STOREP, STORE LINEND, -LINBUF-107 /SUBROUTINE TO READ 1 CHARACTER VIA INPUT DEVICE /IGNORES 200'S & 377'S FETCH, 0 JMS R AND K177 TAD K200 /FORCE FULL 8BIT ASCII DCA CHR TAD CHR TAD M200 SZA TAD M177 SNA CLA JMP FETCH+1 JMP I FETCH M177, -177 /SUBR TO GET NEXT CHAR FROM HSR BUFFER /REFILL BUFFER WHEN X3 REACHES END OF BUFFER R, 0 CDF 00 TAD X3 TAD BUFEND /CK FOR END OF BUFFER SNA CLA JMP RG /REFILL R1, TAD I X3 /GET NEXT CHAR CDF 10 JMP I R RG, TAD BUF /INDEX THE BUFFER DCA X3 RG1, JMS I INDEV DCA I X3 TAD X3 /CK FOR FULL TAD BUFEND SZA CLA JMP RG1 /NOT FULL RG3, TAD BUF /RESET PTR DCA X3 JMP R1 INDEV, HSR BUF, DATA-1 BUFEND, 1-LINBUF /GET 1 CHAR FROM LINE BUFFER L65, 0 CDF 00 TAD I X0 CDF 10 DCA CHR TAD CHR JMP I L65 / / ROUTINE TO PUNCH LEADER TRAILER CODE / LEADER, 0 TAD K7600 DCA TEM1 TAD K200 JMS I PUNCH ISZ TEM1 JMP .-3 JMP I LEADER / / ROUTINE TO TYPE RETURN-LINE FEED / 0215 0212 L73, 0 CLA TAD L73-2 JMS I TYPE TAD L73-1 JMS I TYPE JMP I L73 /DECIM & OCTAL PSUEDO-OPS PDEC, JMS I SKIPL IAC /SET ARITHMETIC CONVERSION TO DECIMAL SKP POCT, JMS I SKIPL DCA DSW /SET ARITHMETIC CONVERSION TO OCTAL JMP I NULLP /GO GET NEXT INPUT LINE / /ROUTINE TO STOP NEXT LINE FROM BEING LISTED /THO IT IS ALREADY IN THE BUFR. /E.G., STOP LISTING OF PUSHED DOWN LINE /WHILE ASSEMBLING LIT. POOL / SAVLIN, 0 CDF 00 TAD I LINEB2 /SAVE 1ST CHAR OF LINE SNA /IF ANY JMP .+3 /THERE ISNT ANY DCA SAVEIT DCA I LINEB2 /CLR TO PREVENT TYPEOUT CDF 10 JMP I SAVLIN / /REENABLE LISTING OF LINE WHICH SAVLIN /PREVENTED / RELINE, 0 CDF 00 TAD SAVEIT /RESTORE 1ST CHAR OF LINE DCA I LINEB2 CDF 10 JMP I RELINE SAVEIT, 0 LINEB2, LINBUF /ROUTINE TO LIST NULL, COMMENT OR PSUEDO-OP LINE NULL, DCA VALUE /IF ANY GIVEN TAD VALUE /SET TYPEOUT FLAG IF NON-0 DCA VFLG JMS I WLIF /LIST IF PASS 2 JMP I DCIL1 /GO BACK TO RDL1 FOR NEXT LINE WLIF, WLNIF1 / / TYPE ROUTINE / L64, 0 TLS /SELECT IT TSF /WAIT FOR TTY JMP .-1 CLA /EXIT WITH CLEAR AC JMP I L64 *5000 / / ROUTINE TO SET THE CORRECT COUNTERS FOR THE CURRENT / OP CODE AND ADDRESS FIELD SYMBOL / /THIS IS A MAJOR ROUTINE. IT IS CALLED ONCE /FOR EVERY NORMAL (MRI,OPR,IOT) INSTR. COLLECTED. /IT IS ALSO CALLED DURING PAGE /RECOUNTING, ONCE FOR EVERY ITEM ON THE /PAGE TABLE. /CALLING SEQ: AC=0,JMS,RET WITH AC=0 /FUNCTION: DETERMINE THE TYPE OF LINE BEING /READ AND SET THE VARIOUS PAGE COUNTERS /AND FLAGS ACCORDINGLY. /A FLOW CHART OF TYPES & FLAG SETTINGS IS GIVEN BELOW. /CONSIDERABLE OVERLAPPING IS USED TO ACHIEVE /THE MIN. CORE USAGE. THIS IS SOMETIMES AT THE /EXPENSE OF LOGICAL CLARITY. /ALL POSSIBLE CONDITIONS EXIT VIA SETC00 /SETC00:(1) IF LAST INSTR. WAS A SKIP & LAST BANK / IS NOT= CUR.BANK, BANK=-1. / (2) IF CUR. INSTR. IS A SKIP, PGEESC=4 / OTHERWISE PGEESC=2. / (3) LASTSKIP CONDITION= CUR. SKIP CONDITION / (4) LAST BANK= CUR. BANK / /FLOW OF INSTR. TYPES /SETCT: IF (PARAMETER OR MICRO-INSTR.) SETC00 / IF (LITERAL AFS) SETC02 / IF(CONSTANT AFS) SETC01 / CALL OBNSYM(AFS) / IF (INSTR. IS INDIRECT) SETC07 / IF (AFS IS IN COMMON) SETCO4 / IF (ABSOLUTE AFS) SETC05 / CALL SPSTB (AFS) /SEARCH PST FOR AFS / CALL SETSUB / IF (AFS NOT BEFORE ON PST) SETC06 / IF (AFS WAS IN PST BUT NOT DEF. ON PAGE)SETC12 / IF (OP CODE=JMS) BANK=1 / GO TO SETC00 /ON PAGE MR1 /SETC01:IF (CONST.AFS ON PG.0)J2 / IF (INSTR. IS INDIRECT) ERROR / CALL SLTAB(CONST. AFS) /PUT CONST. IN LIT.TAB. /J1: IF (BANK NOT=1) SETC13 / GO TO SETC00 / J2* IF( INSTR.INDIR.) J1 /PG.0 INDIRECT / GO TO SETC00 /PG.0 DIRECT /SETC04:IF(BANK NOT 0) CALL INCOBA /INC OBACTR / CALL NUMSGN / S0=RESULT+COMMON ADDR. /SETC02:CALL SLTAB(S0) /LIT.OR. COMMN. ADDR. TO LIT. TAB. / GO TO SETC00 / IF (AFS NOT PREV. ON PST) SETC11 / IF (AFS WAS ON PST BUT NOT DEF. ON PAGE) SETC11 / GO TO J3 /SETC10:CALL NUMSGN / IF (ABS.AFS ON PAGE 0) J3 /SETC11:AC=1 /FORCE BANK=1 /SETC09:AC=AC+1 /FORCE BANK=0 /SETC08:AC=AC-2 /FORCE BANK=-1 / CALL INCOBA /INC OBACTR / AC=BANK /(BANK OFFSET BY -1) / GO TO SETC13 /(TAKEN CARE OF AT SETC13) /SETC12:IF (NEW PST CODE BITS 10-11=OLD SAME (IN TEM 3)) J3 /SETC06:INC OPSCTR /OFF PAGE SYMBOL /J3: IF (BANK=1) SETC00 / INC AC / CALL INCOBA /J4: IF (THERE HAS NOT BEEN A PST SEARCH) SETC00 / ADD CHANGE IN OBACTR (OBACTR-OLDOBA) TO PST CODE BITS 3-9 / GO TO SETC00 / /NOTE: CONDITION AT J4 IS TESTED BY SETSUB HEADER /WORD (OBFLG). THIS IS ALWAYS CLEARED /WHEN SETCT STARTS AND WILL NOT CHANGE /UNLESS THERE IS A CALL TO SPSTB BECAUSE /A CALL TO SETSUB ALWAYS FOLLOWS CALL TO /SPSTB IN SETCT. / SETCT, 0 JMS I ICPLFS /CHECK FOR AND PROCESS ANY LFS DCA OBFLG /CLR /NEXT 2 LINES MOVED TO /SETCAL (AS OF V15) TO MAKE ROOM FOR FOLLOWING INSTR. & PTR / TAD EXP /IS IT PAR OR A MICRO INST? / TAD UMIC JMS I SETCAP SZA CLA JMP I SET00I /YES CLA CLL CMA RAL TAD AFS SNA /IS AFS A CONSTANT JMP SETC01 /YES IAC SNA CLA /IS AFS A LITERAL JMP I SET02I /YES JMS I OBSYM /NO ... GET POINTERS TO AFS AFS TAD IB /INDIRECT BIT SZA CLA /IS IT SET JMP SETC07 /YES JMS USETST /TEST FOR OFF BANK OR ABSOLUTE SETC04 /OFF BANK SETC05 /ABSOLUTE JMS I SPSTAB /IS AFS ON PST CMA /NOT FOUND JMS SETSUB JMP I SET06I /NO ... MUST BE OFF PAGE TAD I PSTCPR /YES ... PST CODE WORD SMA CLA /IS AFS ON PAGE JMP I SET12I /NO JMP I SET00I / / INDIRECT MEMORY REFERANCE INSTRUCTION SETC07, TAD USE /AFS MST USE WORD AND K20 /IS AFS DUMMY SZA CLA JMP I SET08I /YES JMS USETST /TEST OFF BANK OR ABSOLUTE SETC09 /OFF BANK SETC10 /ABSOLUTE JMS I SPSTAB /IS AFS ON PST CMA /NOT FOUND JMS SETSUB JMP I SET11I /NO TAD I PSTCPR /YES ... PST CODE WORD SMA CLA /IS AFS ON PAGE JMP I SET11I /NO JMP I SET6P1 /YES / / CONSTANT FOR AN ADDRESS FIELD SYMBOL / SETC01, TAD S0 /ACTUAL BINARY CONSTANT AND K7600 /IS CONSTANT ON PAGE ZERO SNA CLA JMP SET01A /YES TAD IB /NO ... IS IT INDIRECT SZA CLA IERROR /YES ... ERROR JMS I SLITAB /IS CONSTANT ON LITERAL TABLE /IF NOT SUBROUTINE PUTS IT THERE TAD OP SPA CLA /IF OPCODE IS JMS OR JMP THEN BANK IS IRRELEVANT JMP I SET00I SET01B, CLA CMA TAD BANK /BANK SETTING SNA CLA /IS IT SET TO THE CURRENT BANK JMP I SET00I /YES ... NO PROBLEMS JMP I SET00J /EXIT TO; COMMON AREA / SET01A, TAD IB /IS INDIRECT BIT SET SZA CLA JMP SET01B /YES JMP I SET00I /NO SET00I, SETC00 SET02I, SETC02 SET00J, SETC13 SET00B, JMP I SETCT /OFF PAGE RETURN SET06I, SETC06 SET08I, SETC08 SET11I, SETC11 SET12I, SETC12 SET6P1, SETC6A SETCAP, SETCAL /ROUTINE TO TEST MST USE WORD TO DETERMINE WHETHER A SYMBOL IS /OFF-BANK OR ABSOLUTE USETST, 0 TAD USE AND K40 SZA CLA /IS IT OFF BANK? JMP USESUC /YES- RETURN INDIRECT THROUGH FIRST ARG TAD USE AND K3000 ISZ USETST SNA CLA /IS IT ABSOLUTE? JMP USESUC /YES- RETURN INDIRECT THROUGH SECOND ARG ISZ USETST JMP I USETST /NEITHER - RETURN TO CALL+3 USESUC, TAD I USETST DCA USETST JMP I USETST /TAKE PROPER BRANCH / /SETSUB IS A UTILITY USED BY SETCT ONLY. /USED ONLY IMMEDIATELY AFTER A PST SEARCH. /CALLING SEQUENCE: JMS SPSTB / CMA /SPSTB MAY SKIP / JMS SETSUB / RETURN IF SPSTB SKIPPED OVER CMA / RETURN IF SPSTB DID NOT SKIP /HAS SEVERAL FUNCTIONS: /(1) SAVE COPY OF OLD VALUE OF OBACTR BEFORE /CHANGING STARTS- SO IT MAY BE USED AT SETC13. /(2) IF INSTR IS INDIRECT, THAT'S IT- EXIT /(3) OTHERWISE SAVE OLD VALUE OF PST CODE BITS 10-11 /FOR LATER USE AT SETC12. WARNING: THIS /IS SAVED IN TEM3, SO TEM3 IS NOT /TEMPORARY FOR A FEW MINUTES. /(4) SET PST CODE BIT 10 IF THIS IS A #REF, /OR BIT 11 IF IT IS A NORMAL REF. /ALGORITHM IS A.OR.B=(.NOT.A.AND.B)+A / SETSUB, 0 DCA TEM1 /0=FOUND, -1=NOT TAD OBACTR /SAVE FOR SETC11,12,6,13 DCA I OLDOBP TAD IB /OMIT CHANGING PST BITS IF INDIRECT SZA CLA JMP SETSX TAD I PSTCPR /SAVE OLD CODE AND K3 DCA TEM3 TAD NSGN SZA CLA IAC /# IAC DCA TEM2 TAD TEM2 /OR INTO CODE CMA AND I PSTCPR TAD TEM2 DCA I PSTCPR SETSX, ISZ TEM1 /FOUND? ISZ SETSUB /YES JMP I SETSUB OLDOBP, OLDOBA OBFLG=SETSUB /SUBR TO STORE CHARACTER IN LINE BUFFER /ASSUMES X1 SET /CHAR MAY BE IN AC OR IN CHR STORE, 0 SNA TAD CHR CDF 00 DCA I X2 CDF 10 JMP I STORE / /ROUTINE TO CHECK NSGN FOR SETCT /USED ONLY BY SETCT ROUTINE. /CALLING SEQUENCE: AC=0 / JMS NUMSGN / RETURN WITH AC=0 IF / NSGN=0,AC=1 IF NSGN / NOT=0. /NOTE:NSGN MAY BE NON-0 AND NOT=1. THIS /IS THE REASON FOR NUMSGN. / NUMSGN, 0 TAD NSGN SZA CLA IAC JMP I NUMSGN *5200 / / AFS ABSOLUTE / SETC05, JMS I NUMSGP TAD VAL /ABSOLUTE SYMBOL VALUE AND K7600 /MASK OUT PAGE BITS SNA CLA /IS ABSOLUTE SYMBOL ON PAGE ZERO JMP SETC00 /YES ... EXIT JMS I NUMSGP TAD VAL /NO ... ABSOLUTE SYMBOL VALUE DCA S0 /TO LITERAL TABLE SEARCH LOCATION JMS I SLITAB /SEARCH LITERAL TABLE FOR VALUE /IF NOT THERE ROUTINE PLACES IT THERE JMP SETC06+1 /EXIT / / INDIRECT ABSOLUTE / SETC10, JMS I NUMSGP TAD VAL /ACTUAL AFS VALUE AND K7600 SNA CLA /IS ADDRESS FIELD SYMBOL ON PAGE ZERO JMP SETC6A /YES / / INDIRECT DUMMY ADDRESS FIELD SYMBOL / SETC08, TAD M2 /SET BANK UNKNOWN / / OFF PAGE INDIRECT / SETC11, IAC /SET BANK TO CURRENT / / OFF BANK INDIRECT - SET BANK TO 0 / SETC09, JMS INCOBA /SET BANK & INCR. OBACTR TAD BANK JMP SETC13+1 /EXIT TO COMMON AREA / / ADDRESS FIELD SYMBOL NOT ON PAGE SYMBOL TABLE. / SETC12, TAD I PSTCPR /HAS NEW TYPE REF BEEN ADDED? AND K3 CIA TAD TEM3 SZA CLA /YES SETC06, ISZ OPSCTR /INCREMENT OFF PAGE SYMBOL COUNTER TAD OP SPA CLA /DON'T WORRY ABOUT BANK FOR JMS'S AND JMP'S JMP SETC00 /WHICH ARE NOT EXPLICITLY INDIRECT SETC6A, TAD BANK SMA SZA CLA JMP SETC00 /YES ... EXIT TO COMMON AREA SETC13, IAC JMS INCOBA /SET BANK TO CUR. & INC OBACTR TAD I OBFLGP /WAS THERE A PST SEARCH? SNA CLA JMP SETC00 /NO TAD OLDOBA /YES GET CHANGE IN OBACTR CIA TAD OBACTR CLL RTL /IN BITS 1-9 TAD I PSTCPR /ADD TO PST CODE DCA I PSTCPR / / COMMON AREA / SETC00, JMS CMNSET /SET BANK=1 AFTER JMS JMS I SETCMN /UPDATE BANK AND LSTSKP SZA CLA /IS CURRENT INSTRUCTION A SKIP? TAD K2 /YES ... PAGE ESCAPE = 4 TAD K2 /NO ... PAGE ESCAPE = 2 DCA PGEESC JMP I .+1 /RETURN SET00B SETCMN, ASMCMN /ROUTINE TO SET BANK TO CURRENT AFTER A JMS CMNSET, 0 TAD OP TAD K4000 SZA CLA /WAS OP A JMS? JMP I CMNSET /NO IAC DCA BANK JMP I CMNSET OLDOBA, 0 OBFLGP, OBFLG / / DIRECT OFF BANK REFERANCE / SETC04, TAD BANK /BANK INDICATOR SZA CLA /IS BANK SET TO OFF JMS INCOBA /NO, SET BANK TO COMMN & INC OBACTR JMS I NUMSGP TAD VAL /YES ... ACTUAL BANK 0 ADDRESS DCA S0 /TO CONSTANT - LITERAL LOCATION / / LITERAL FOR AN AFS / SETC02, JMS I SLITAB /PLACE LITERAL ON LITERAL TABLE JMP I SET1AP / / COLLECTION ROUTINE TO CHECK FOR AND PROCESS AN LFS / /CALLING SEQUENCE: AC=0 / JMS CPLFS / RETURN WITH AC=0 /FUNCTION: USED DURING COLLECTION PHASE / EXCEPT WHEN RECOUNTING A PAGE. / IF TAG OCCURS ON CURRENT LINE, CPLFS / LOCATES (OR ENTERS) IT IN PAGE SYM.TAB. / AND SETS THE DEFINED-ON-PAGE BIT IN / THE PST CODE WORD. / ALSO SETS BANK CONDITION TO UNKNOWN / SINCE USER CODE CAN JUMP TO TAG / FROM ANYWHERE. ALSO SAVE / TAG IN LLFS & RESET LINE COUNT / IN CASE WE GET A MULT.DEF. ERROR / IN PASS1 WE MUST ALSO DO THE / FOLLOWING IF THE SYMBOL IS ALREADY / IN THE PST WHEN WE GO LOOK FOR / IT: (1) REDUCE THE OFF-PAGE SYM. / CTR. BECAUSE OFF-PAGE POINTER (FOR / EITHER NORMAL OR # REFERENCES) ARE / NO LONGER NEEDED. (2) REDUCE / OBACTR BY THE NO. OF EXTRA WORDS / OF CODE DUE TO THIS SYMBOL. /SUBRS. CALLED: OBNSYM(LFS),SPSTB,PSTDEF / CPLFS, 0 TAD I RECTI /ARE WE RECOUNTING? SZA CLA JMP I CPLFS /YES ... RETURN TAD LFS SNA JMP I CPLFS /NONE THERE CDF 00 DCA I LFSPTR /PLACE ON LFS TABLE ISZ LFSPTR /INCREMENT LFS TABLE POINTER CDF 10 ISZ I PTCPR /SET LFS BIT ON PAGE TABLE JMS I OBSYM LFS JMS I SPSTAB /IS IT ON THE PAGE SYMBOL TABLE JMP CPLFS3 /NO ... SKIP DECREMENTING DCA TEM1 /CLR TAD PASS /SKIP DECREMENTING IF PASS 2 SNA CLA TAD I PSTCPR /CK USE AND K3 CLL RAR SZL ISZ TEM1 /NORMAL SZA CLA ISZ TEM1 /# TAD TEM1 /SUBTRACT CIA TAD OPSCTR DCA OPSCTR TAD I PSTCPR /EXTRACT SHARE OF OBACTR DUE AND C3774 /TO THIS SYMBOL CLL RTR /MOVE TO LOW ORDER CIA /SUB. FROM OBACTR TAD OBACTR DCA OBACTR CPLFS3, JMS I PSTDEP CLA CMA CLL /SET BANK UNKNOWN (THE CLL IS USED ELSEWHERE) DCA BANK TAD LFS /SAVE IN CASE OF ERROR DCA LLFS DCA LINE /ZERO LINE COUNT FROM LAST LFS JMP I CPLFS C3774, 3774 NUMSGP, NUMSGN PSTDEP, PSTDEF LLFS, 0 / /UTILITY FOR SETC04,SETC08,SETC13 /NOT USED ELSEWHERE /CALLING SEQUENCE: DESIRED BANK SETTING IN AC / JMS INCOBA / RETURN WITH AC=0 /FUNCTION:(1) SET BANK AS SPECIFIED / (2) INCREMENT OFF-BANK ADDITION CTR / BY 1 OR 2: 2 IF PREVIOUS INSTR. / WAS A SKIP-TYPE, 1 OTHERWISE. / INCOBA, 0 DCA BANK TAD LSTSKP /LAST INSTRUCTION SKIP INDICATOR SZA CLA /WAS LAST INSTRUCTION A SKIP INSTRUCTION ISZ OBACTR /+ OLD VALUE OF OFF BANK ADDITION COUNTER ISZ OBACTR /FOR NEW VALUE OF OFF BANK ADDITION COUNTER JMP I INCOBA SET1AP, SET01A *5400 / / ROUTINE TO ASSEMBLE THE PAGE HELD IN THE CURRENT SET OF TABLES /THIS IS THE MAIN PASS1 ASSEMBLY ROUTINE /(NOT USED BY PASS2) /ASMBL GOES THRU ENTIRE PAGE TABLE /FLOW: (1) CALL A1 TO INIT. PAGE ASSEMBLY / (2) GET ITEM OFF P.T. / (3) CALL ASM02 TO ASSEMBLE ITEM / (4) LOOP BACK TO (2) TIL DONE WITH PAGE / (5) CALL A2 TO ASM. LITERALS /ASMBL IS CALLED TWICE BY L55 FOR /EACH PAGE OF CODE. / ASMBL, 0 JMS A1 JMS I ILC4PT /OUTPUT PAGE ORIGIN JMS I INIS /DO INITS. TAD PTSZE /PLACE - SIZE OF PAGE TABLE CIA DCA INDX1 /IN AN INDEX LOCATION TAD LFSBSE /SET UP LFS TABLE POINTER DCA LFSPTR CLA CMA DCA PHASE /SET PHASE SWITCH TO ASSEMBLY JMS I ASM02I /SKIP INCREMENTING POINTERS THE FIRST TIME JMS I ISSI /INCREMENT PAGE TABLE POINTERS ISZ INDX1 /OVER YET JMP .-3 JMS A2 JMP I ASMBL ISSI, ISZPT / /ASSEMBLY ROUTINE TO FINISH OFF A PAGE /(1) PUTS OUT PAGE ESCAPE /(2) LITERAL POOL (BY CALLING OAPLT) /(3) GET READY FOR NEXT PAGE / A2, 0 JMS I SAVLNP /STOP NEXT LINE LISTING TAD APMSW /ARE WE IN AUTOMATIC PAGING MODE SZA CLA JMP A2NONA /NO ... DONT SEND PAGE ESCAPE TAD PGEESC /SIZE OF PAGE ESCAPE REQUIRED RTR /2 BIT TO LINK SZL CLA JMP ASM01A /2 INSTRUCTION PAGE ESCAPE /4 INSTRUCTION PAGE ESCAPE JMS I WRITEP JMS I OUTBIN /JMP NEXT TO LAST LOC ON THIS PAGE K5376 0 ISZ ILC /FOR BENEFIT OF "WRITE" CLA CMA JMS A2SUBR /OUTPUT JMP AND LITERAL TABLE JMS I OUTSKP /OUTPUT 2 SKIP INSTRUCTIONS JMS I OUTSKP JMP ASM01B /RETURN / ASM01A, JMS A2SUBR /OUTPUT JMP AND LITERAL TABLE JMS I WRITEP JMS I OUTBIN /PLACE A NOP IN THE LAST LOCATION K7000 0 ASM01B, JMS I RELNP /RESTORE NEXT LINE FOR LISTING TAD ACTR /REMAINS 1 DURING PASS 2 SZA CLA JMP I A2 /EXIT IF LISTING OR 2ND ASSEMBLY TAD PUPGE /SAVE ESCAPE ON PUSH DOWN LIST CDF 00 DCA I PEPTR CDF 10 ISZ PEPTR /MOVE STACK PTR JMP I A2 /RETURN A2NONA, JMS I OUAPLT DCA PUPGE /CLR JMP ASM01B /SUBROUTINE TO ELIMINATE SOME COMMON CODE / A2SUBR, 0 TAD K177 TAD PAG DCA A2TEMP /SET ILC IN CASE NO LITERALS JMS I WRITEP JMS I OUTBIN K5377 0 JMS I OUAPLT /OUTPUT LITERAL TABLE TAD A2TEMP DCA ILC /SET ILC TO 176 OR 177 IN PAGE JMS I ILC4PT JMP I A2SUBR /RETURN A2TEMP, 0 ILC4PT, ILC4 ASM02I, ASM02 INDX1, 0 INIS, INISUB OUAPLT, OAPLT SAVLNP, SAVLIN RELNP, RELINE PEPTR, PEBSE REDUCE, 0 CDFSKP, JMS CDFSK / /INITIALIZE A PAGE ASSEMBLY / A1, 0 TAD PAG /MOVE PAGE TO ILC DCA ILC DCA LITSIZ /ZERO LITERAL TABLE SIZE TAD PASS SNA CLA JMP I A1 /EXIT IF PASS 1 CDF 00 TAD I PEPTR /GET NEXT PAGE ESC FROM STACK CDF 10 ISZ PEPTR /MOVE PTR DCA REDUCE JMP I A1 / / DUMMY PSEUDO OP / PDUMMY, JMS I GETSYM /GET NEXT INPUT ITEM SKP /NOTHING THERE JMP .+3 /SYMTOL NOP /CONSTANT IERROR /LITERAL JMS I SKIPL TAD USE /MST USE WORD AND K3403 /SAVE SYMBOL LENGTH, TYPE BITS, AND DEF BIT TAD K20 /ADD CORRECT MST BIT FOR DUMMY DCA USE /FOR CORRECT CODE WORD JMP I NULLP /EXIT TO GET NEXT LINE K3403, 3403 / /COMPUTE CURRENT PAGE SIZE /ENTER WITH AC=0 /EXIT WITH PAGE SIZE IN AC / CPGES, 0 TAD APMSW /OMIT PGEESC IF NON-AUTO PAGING SNA CLA TAD PGEESC /+SIZE OF ESCAPE REQUIRED TAD PTSZE /SIZE OF PAGE TABLE TAD LTSZE /+SIZE OF LITERAL TABLE TAD OPSCTR /+OFF PAGE SYMBOL COUNTER TAD OBACTR /+OFF BANK ADDITION COUNTER DCA PSTDEF /STORE IN TEM. TAD PSTDEF /GET IT BACK TAD PAG /AND CHECK FOR 7600 PAGE OVERFLOW AND K7600 TAD K200 SNA CLA SERROR /OVERFLOW-ERROR S TAD PSTDEF /O.K. GET PAGE SIZE, WHICH JMP I CPGES /IS DESIRED RESULT /ROUTINE TO SET DEFINED BIT ON PST /USED BY CPLFS & ANUMCK PSTDEF, 0 TAD I PSTCPR /PROTECT CODES SMA TAD K4000 /SET DEFINED BIT ON PST DCA I PSTCPR JMP I PSTDEF *5600 / / CONSTANT FOR AN ADDRESS FIELD SYMBOL / ASM05, TAD I PTSPR /ACTUAL BINARY CONSTANT AND K7600 /IS IT ON PAGE ZERO SZA CLA JMP I ASM5CI /NO TAD I PTSPR /ADD IN PAGE ZERO ADDRESS DCA TEMP6 TAD I PTCPR /YES ... IS IT INDIRECT AND K400 SNA CLA JMP ASM00 /EXIT TO COMMON AREA TAD TEMP6 JMP I ASM5AI ASM5AI, ASM12E ASM5CI, ASM05C / / OFF BANK DIRECT (COMMON DIRECT) / ASM08, JMS I NSCHKP TAD VAL /ACTUAL ADDRESS IN BANK ZERO DCA S1 /TO 2 WORD LITERAL TABLE SEARCH LOCATION CLA IAC DCA S0 /ABSOLUTE SEARCH JMS I SERALP /GET A PAGE ADDRESS TAD K400 /ADD INDIRECT BIT DCA TEMP6 TAD BANK /BANK INDICATOR SNA CLA /IS IT SET JMP ASM00 DCA I ASMX5I TAD KCDF1A DCA I ASMX4I TAD CDZSKI DCA I ASMX6I DCA TEM7 JMP I ASME7I ASMX5I, ASMX5 ASMX4I, ASMX4 KCDF1A, KCDF10 ASMX6I, ASMX6 ASME7I, ASME7 CDZSKI, CDZSKP SERALP, SRALT NSCHKP, NSCHK / /ASM02 IS THE HEART OF ASSEMBLY /IT IS CALLED ONCE FOR EACH ITEM ON /THE PAGE TABLE. /IT CONSISTS OF MANY PARTS, ONE FOR /EACH BASIC TYPE OF INSTR. TO BE /ASSEMBLED PLUS VARIOUS COMMON EXITS / ASM02, 0 DCA LFS /ZERO LFS INDICATOR TAD PASS SZA CLA JMS I GETBAP /RESTORE BANK & LSTSKP IF PASS2 JMS I LFSCHK /PROCESS LFS IF ANY JMS I ANCHK /PROCESS BSS 0 IF ANY KCDF00, CDF 00 TAD I PTOPR KCDF10, CDF 10 DCA OP TAD I PTCPR AND K40 /IS IT A SKIP INSTRUCTION DCA CURSKP /YES ... SET SKIP INDICATOR TAD I PTCPR AND K10 /IS IT A PSEUDO OP (PAR) SZA CLA JMP I ASM03I /YES ... EXIT TAD I PTCPR AND K4 /IS IT A MEMORY REFERANCE INSTRUCTION SZA CLA JMP ASME1 /NO TAD I PTCPR /PT CODE WORD AND K20 /IS AFS A CONSTANT SZA CLA JMP ASM05 /YES TAD I PTCPR /PT CODE WORD AND K2 /IS AFS A LITERAL SZA CLA JMP I ASM06I /YES TAD I PTSPR /AFS ID WORD FOR SYMBOL TABLE DCA AFS /TO DIRECTLY ADDRESSABLE LOCATION JMS I OBSYM /GET ITS POINTERS TO MST AFS TAD I PTCPR /PT CODE WORD AND K400 /IS OP INDIRECT SZA CLA JMP I ASM2AI /YES JMS I UZTST /TEST FOR OFF BANK OR ABSOLUTE ASM08 /OFF BANK ASM09 /ABSOLUTE JMP I ASM07I /NO ASM2AI, ASM02A ASM03I, PPAR1 ASM06I, ASM06 ASM07I, ASM07 ANCHK, ANUMCK UZTST, USETST / / END OF LINE NECESSITIES / ASM00, TAD TEMP6 ASME1, TAD OP ASME2, DCA TEM1 JMS I WRITEP JMS I OUTBIN TEM1 ASME1X, 0 ASM01, JMS I CMNASM /SET BANK=1 AFTER A JMS JMS ASMCMN /SET BANK AND LSTSKP DCA SKPSAV /SAVE CURSKP IN SKPSAV TAD BANK /SAVE FOR PROTECTION DURING LISTING DCA BNKSAV ISZ ILC /INCREMENT ILC ASM02R, JMP I ASM02 /USED AS OFF-PAGE RETURN SERROR /ILC OVERFLOWED 7777 - PROGRAM TOO BIG CMNASM, CMNSET GETBAP, GETBAS BNKSAV, 0 SKPSAV, 0 OPISUB, JMS OPIS OBISUB, JMS OBIS /SUBROUTINE TO UPDATE BANK,LSTSKP,LSTBNK / ASMCMN, 0 TAD LSTSKP /IS LAST INSTRUCTION A SKIP INSTRUCTION SNA CLA JMP .+10 /NO TAD LSTBNK /YES ... LAST BANK CIA TAD BANK /+CURRENT BANK SNA CLA /ARE THEY THE SAME JMP .+3 /YES CLA CMA /NO ... SET BANK UNKNOWN DCA BANK TAD CURSKP /PLACE CUR SKIP INDICATOR DCA LSTSKP /AS LAST SKIP INDICATOR TAD BANK /PLACE CURRENT BANK DCA LSTBNK /IN LAST BANK INDICATOR TAD LSTSKP JMP I ASMCMN *6000 / / / INDIRECT DUMMY ARGUMENT / DUMSUB ASM10, TAD I .-1 DCA TEMP6 CLA CMA /SET BANK UNKNOWN JMP ASME3 /EXIT FOR SKIP CHECK / / OFF BANK INDIRECT (INDIRECT COMMON) / OBISUB ASM11, TAD I .-1 DCA TEMP6 / TEMP6=EXP ASME3, DCA BANK /SET C(AC) IN BANK TAD LSTSKP /WAS LAST A SKIP? SNA CLA JMP ASME4 /NO //FOLLOWING 6 LINES HAVE BEEN //MOVED TO 6600 TO MAKE ROOM FOR V03 JMP I .+1 ASMEXT // JMS I OUTSKP /YES, OUTPUT SKP // TAD ILC /GET PG.LOC.PTR. // TAD K4 /+4 // AND K177 // TAD K5200A /OUTPUT JMP .+4 // DCA TEM1 REEASM, JMS I WRITEP JMS I OUTBIN TEM1 0 ISZ ILC /INCREMENT PG.LOC.PTR. ASME4, JMS I WRITEP JMS I OUTBIN /OUTPUT JMS TO TEMP6 /OBISUB,OPISUB, OR DUMSUB 0 ISZ ILC JMS I ASM10B /PPAR3S ISZ ILC TAD OP TAD K407 JMP I ASME2P ASME2P, ASME2 ASM02A, TAD USE /AFS MST USE WORD AND K20 /IS AFS A DUMMY ARGUMENT SZA CLA JMP ASM10 /YES JMS I UZETST /TEST FOR OFF-BANK OR ABSOLUTE ASM11 /OFF-BANK ASM12 /ABSOLUTE JMP I ASM13I /NO ASM10B, PPAR3S ASM13I, ASM13 K407, 0407 ASME5A, TAD OP SPA CLA /BANK NEED NOT BE CURRENT FOR A JMP OR JMS JMP ASME6+2 /WHICH IS NOT EXPLICITLY INDIRECT ASME5, TAD BANK SMA SZA CLA JMP ASME6+2 ASME7, TAD LSTSKP SZA CLA JMP .+7 JMS I WRITEP JMS I OUTBIN ASMX4, KCDF00 ASMX5, 5 ISZ ILC JMP ASME6 JMS I WRITEP JMS I OUTBIN ASMX6, CDFSKP 0 ISZ ILC JMS I OUTSKP ASME6, TAD TEM7 DCA BANK TAD K5 DCA ASMX5 TAD KCDFA DCA ASMX4 TAD CDFSKI DCA ASMX6 IAC DCA TEM7 JMP I .+1 ASM00 CDFSKI, CDFSKP ASME1I, ASME1 KCDFA, KCDF00 UZETST, USETST / / SYMBOL TABLE TYPEOUT FLAG TYPEOUT ROUTINE /CALL SEQ.: TAD USE /GET TYPE BITS / RTL / RTL / JMS STFT / RETURN /USED ONLY BY PRSYM / STFT, 0 AND K3 /MASK OUT TYPE BITS SNA JMP STFT3 /ABSOLUTE SYM. TAD M3 /CK FOR NEW OPDEF SNA JMP STFT2 /YES IAC SNA JMP STFT5 /EXTERNAL SZL CLA JMP STFT1 /DEFINED TAD K2516 /"UN" JMS I CTYPE TAD K0406 /"DF" STFT0, JMS I CTYPE /TYPE FLAG STFT1, CLA /WE MUST HAVE A CLEAR AC JMP I STFT /RETURN K2560, 2560 K1720, 1720 STFT2, TAD K1720 /TYPE "OP" JMP STFT0 STFT3, TAD USE AND K40 SZA CLA JMP STFT4 /COMMON TAD K0102 /"AB" JMS I CTYPE TAD K2300 /"S " JMP STFT0 STFT4, TAD K0317 /"CO" JMS I CTYPE TAD K1500 /"M " JMP STFT0 K0102, 102 K0317, 317 K2300, 2300 K1500, 1500 K2516, 2516 K0406, 406 K0530, 530 K2400=SLITAB STFT5, TAD K0530 /"EX" JMS I CTYPE TAD K2400 JMP STFT0 *6200 / / LOCAL DIRECT REFERANCE / ASM07, JMS I SPSTAB /IS AFS ON PST JMP ASM07A /NO ... ROUTINE PLACES IT THERE TAD I PSTCPR /PST CODE WORD SMA CLA /IS SYMBOL ON PAGE JMP ASM07A /NO JMS NSCHK TAD VAL /AFS MST VALUE AND K177 /SAVE PAGE ADDRESS TAD K200 /ADD PAGE BIT JMP I AS00I4 / ASM07A, TAD I PTSPR /ACTUAL SYMBOL DCA S1 /TO 2 WORD LITERAL TABLE SEARCH LOCATION JMS NSCHK CLL RTL TAD K2 /RELOCATABLE SEARCH JMP ASM05C+3 ASM09B, JMS NSCHK TAD VAL /DIRECT NON-PAGE 0 ABSOLUTE SKP / / / NON PAGE ZERO CONSTANT ADDRESS / ASM05C, TAD I PTSPR /ACTUAL BINARY CONSTANT DCA S1 /TO 2 WORD LITERAL TABLE SEARCH LOCATION CLA IAC DCA S0 /ABSOLUTE SEARCH JMS I SERALT /GET A PAGE ADDRESS TAD K400 /ADD INDIRECT BIT DCA TEMP6 JMP I .+1 ASME5A /EXIT FOR SKIP CHECK IF OP IS NOT JMP OR JMS / / DIRECT ABSOLUTE OR EXTERNAL / ASM09, JMS NSCHK TAD VAL /ABSOLUTE SYMBOL VALUE AND K7600 /IS SYMBOL ON PAGE ZERO SZA CLA JMP ASM09B /NO JMS NSCHK TAD VAL /ADD IN PAGE ZERO ADDRESS JMP I AS00I4 / AS00II, ASME5 / / LITERAL FOR AN ADDRESS FIELD SYMBOL / ASM06, TAD I PTSPR /ACTUAL LITERAL DCA S1 /TO 2 WORD LITERAL TABLE SEARCH LOCATION CLA IAC DCA S0 /ABSOLUTE SEARCH JMS I SERALT /GET A PAGE ADDRESS JMP I AS00I4 /EXIT FOR SKIP CHECK AS00I4, ASM05+5 OUTSK, 0 JMS I WRITEP JMS I OUTBIN K7410 0 ISZ ILC JMP I OUTSK SERALT, SRALT / / INDIRECT ABSOLUTE / ASM12, TAD VAL /AFS MST USE WORD AND K7600 /IS IT ON PAGE ZERO SZA CLA JMP ASM12F /NO / / INDIRECT PAGE ZERO ABSOLUTE SYMBOL / JMS NSCHK TAD VAL /SAVE PAGE ZERO ADDRESS ASM12E, TAD K400 /ADD INDIRECT BIT DCA TEMP6 JMP I AS00II / / INDIRECT NON PAGE ZERO ABSOLUTE SYMBOL / OPISUB ASM12F, TAD I .-1 DCA TEMP6 TAD BANK JMP I AS00I3 /EXIT FOR SKIP CHECK AS00I3, ASME3 K5377, 5377 / / LOCAL INDIRECT REFERANCE / ASM13, JMS I SPSTAB /IS AFS ON PST JMP ASM14 /NO ... MUST BE OFF PAGE TAD I PSTCPR /YES ... PST CODE WORD SMA CLA /IS AFS ON PAGE JMP ASM14 /NO JMS NSCHK TAD VAL /AFS VALUE FROM MST AND K177 /SAVE PAGE DISPLACEMENT TAD K600 /ADD PAGE AND INDIRECT BIT DCA TEMP6 /SAVE JMP I AS00II /GO OUTPUT INSTRUCTION / / OFF PAGE INDIRECT / OPISUB ASM14, TAD I .-1 DCA TEMP6 CLA IAC /SET BANK TO CURRENT JMP I AS00I3 /EXIT FOR SKIP CHECK NSCHK, 0 TAD I PTCPR AND K2000 SZA CLA IAC /ITS A # JMP I NSCHK /"IF" - CONDITIONAL ASSEMBLY PSUEDO-OP PIF, JMS I GETSYM JMP PIFERR /NOTHING THERE JMP .+3 /SYM NOP /CON JMP PIFERR /LIT TAD CHR /CK FOR COMMA TAD M254 SZA CLA IERROR /NOT A COMMA ISZ X0 /PREVENT FLAGGING COMMA JMS I GETSYM /YES, SET CTR TO SKIP N LINES NOP SKP SKP /I WANT A NUMBER PIFERR, IERROR TAD USE /IS SYMBOL DEFINED? AND K400 SZA CLA DCA S0 /YES, CONTINUE NORMAL ASSMBLY JMS I SKIPL TAD S0 /GET THE NUM. CIA DCA IFCTR JMP I NULLP IFCTR, 0 ILC4, 0 JMS I OUTBIN ILC 4 JMP I ILC4 /LAP & EAP PSUEDO-OPS *6372 /MUST BE AT 6372 OR AT PAGE BOUND. +172 FOR K5376 TO WORK AS SKIP PLAP, JMS I SKIPL IAC /LEAVE AUTO-PAGING MODE K5376, 5376 /THIS REPLACES A SKIP.*******DO NOT MOVE******** PEAP, JMS I SKIPL DCA APMSW /ENTER AUTO-PAGING MODE JMP I NULLP *6400 LISTON, 1411 2324 1116 0700 1716 0000 HISP, 1011 0710 0023 2005 0504 0020 2516 0310 7700 RDER, 0022 0501 0405 2277 0000 / PART OF MAIN PROGRAM / RECOUNT ROUTINE /FOLLOWING CODE CLEANS UP PST CODES BEFORE RECOUNTING CLNPST, CIA DCA IOINIT /SET COUNTER TAD PSTBSE IAC DCA PSTCPR /CODE POINTER TAD I PSTCPR /LOOP AND K4003K /KILL OBAC DUE TO THIS SYM. DCA I PSTCPR ISZ PSTCPR /MOVE PTR ISZ PSTCPR ISZ IOINIT JMP .-6 /NOT DONE JMP I .+1 RECRET K4003K, 4003 / / /COMMON EXIT FOR DATA-GENERATING PSUEDO-OPS / POPEX, DCA BSSSW TAD LFS /CK FOR TAG SNA CLA JMP I DCIL1 /NO TAG CMA /DECREMENT PTSZE TAD PTSZE DCA PTSZE JMS I RECTI /YES RECOUNT THE PAGE ISZ PTSZE /RESTORE PTSZE JMS I ISZPTX /RESTORE PT PTRS JMP I DCIL1 /RETURN FOR NEXT LINE ISZPTX, ISZPT /ROUTINE T0 INITIALIZE I/O DEVICES C2=JMS I CTYPE IOINIT, 0 CDF 10 TAD JL64 DCA TYPE VN, JMP I VERSI IOI, JMS I CRLF TAD JHISP DCA X1 TAD M5 JMS QUERY JMP RGO TAD JRDER DCA X1 TAD M5 JMS QUERY JMP RGO RGO, JMS KSR TAD JHSR TAD JASR DCA I INDEVP JMS I CRLF TAD JHISP DCA X1 TAD M11 JMS QUERY NOP JMS KSR JMP .+4 TAD TYPE DCA PUNCH JMP IOX TAD JL63 DCA PUNCH JMS I CRLF TAD JLIST DCA X1 TAD M17 JMS QUERY NOP JMS KSR IAC /1 = PUNCH, 0 = TYPE IOX, DCA LSTDEV JMP I IOINIT QUERY, 0 DCA JCOUNT TAD I X1 C2 KSF SKP JMP I QUERY ISZ JCOUNT JMP .-6 ISZ QUERY JMP I QUERY KSR, 0 KSF JMP .-1 KRB DCA TEM1 TAD TEM1 JMS I TYPE TAD TEM1 TAD M331 SZA CLA /0="YES" ISZ KSR /NOT "YES" JMP I KSR LSTDEV=QUERY M331, -331 JHSR, HSR-ASR JASR, ASR INDEVP, INDEV JL63, L63 JL64, L64 JCOUNT=TEM3 JHISP, HISP-1 JLIST, LISTON-1 JRDER, RDER-1 VERSI, VERNUM M5, -5 M11, -11 M17, -17 *6600 // //PART OF MAIN PROGRAM MOVED FOR V03 // /ROUTINE TO RESTORE BANK AND LSTSKP FOR PASS2 /WILL NOT FIT INTO ASM02 WHERE IT BELONGS GETBAS, 0 TAD I BNKSAP DCA BANK TAD I SKPSAP DCA LSTSKP JMP I GETBAS BNKSAP, BNKSAV SKPSAP, SKPSAV /INPUT ROUTINES HSR, 0 DCA TEM10 /CLR TIMER RFC HSR1, RSF JMP HSR2 RRB JMP I HSR HSR2, DCA ASR /WASTE SOME TIME ISZ TEM10 /CK TIMER JMP HSR1 /KEEP TRYING REXIT, TAD X3 /CK FOR EMPTY BUFFER TAD BUFBEG SZA CLA JMP .+4 /NO, WE HAVE A PARTIAL BUFFER CDF 10 JMP I .+1 /YES TAPE HAS ENDED WITH NO END STATMT ERRE DCA I X3 /FILL END OF BUFFER WITH 0'S TAD X3 TAD BUFEN SZA CLA JMP .-4 JMP I RG3P /NOW RET. FOR PROCESSING ASR, 0 TAD M50 DCA TEM11 DCA TEM10 ASR1, KSF JMP ASR2 KRB JMP I ASR ASR2, ISZ TEM10 JMP ASR1 ISZ TEM11 JMP ASR1-1 JMP REXIT M50, -50 TEM10, 0 TEM11, 0 BUFBEG, 1-DATA RG3P, RG3 BUFEN, 1-LINBUF / / ENTRY PSEUDO OPERATION / PENTRY, JMS I GETSYM /GET NEXT INPUT ITEM SKP /NOTHING THERE JMP .+3 /SYMBOL NOP /CONSTANT IERROR /LITERAL JMS I SKIPL JMS I SREST /PLACE SYMBOL ON EXTERNAL SYMBOL TABLE CLA TAD USE /AFS MST USE WORD AND K403 /SAVE SYMBOL LENGTH (& DEF. BIT FOR PASS 2) TAD K2220 /ADD IN PROPER BITS DCA USE /FOR NEW MST USE WORD JMP I NULLP /EXIT FOR NEXT LINE K2220, 2220 K403, 403 / / / /INCREMENT PAGE TABLE POINTERS / ISZPT, 0 ISZ PTCPR /INCREMENT PAGE TABLE CODE POINTER BY 2 ISZ PTCPR ISZ PTSPR /INCREMENT PAGE TABLE SYMBOL POINTER BY 2 ISZ PTSPR ISZ PTOPR /INCREMENT PT OP CODE POINTER JMP I ISZPT / /CK CONSTANT FOR BLOCK PSEUDO-OP / PBSS4, TAD APMSW /AUTOMATIC PAGING? SNA CLA TAD K2 /YES, 176 IS MAXIMUM TAD M200 /NO, 200 IS MAX TAD S0 /CHECK CONSTANT SMA SZA CLA IERROR /TOO BIG TAD S0 /IS CONSTANT 0? SNA JMP I PBSS2J /YES, EQUIVALENCE TAG JMP I PBSS5I /NO, CREATE BLOCK OF THIS SIZE PBSS2J, PBSS2 PBSS5I, PBSS5 / /PATCH TO DELETE DEFINED BIT IN PST FOR A TAG /EQUIVALENCED TO A LINE THAT OVERFLOWED THE PAGE / EQVFIX, TAD EQVBIT /WAS THERE SUCH A TAG? SNA CLA JMP I L55CP /NO TAD I EQVBIT /YES, GET PST CODE FOR THIS TAG TAD K4000 /CANCEL DEFINED BIT DCA I EQVBIT TAD K200 /SET EQUIVALENCE BIT FOR NEXT LINE DCA EQVBIT /WHEN NEXT PAGE GETS GOING JMP I L55CP /RETURN TO ASSEMBLE THE PAGE WE HAVE L55CP, L55C / /CK FOR TYPE OF SYMBOL /CALL SEQ: JMS WHATYP / RET. IF USER SYMBOL / RET. IF OP SYMBOL / WHATYP, 0 TAD USE AND K3000 TAD M3000 SNA CLA ISZ WHATYP JMP I WHATYP / /EXECUTE ISZ GTSYM (MOVE RETURN POINTER) ONLY IF IFCTR .GE. 0 /OTHERWISE MOVE LINE PTR TO NEXT SLASH, SEMI-COLON OR CAR.RET. /& ISZ IFCTR & TREAT AS A NULL LINE. / CKIF, 0 TAD I IFCT /IS CONDITIONAL NON-ASM IN EFFECT? SPA CLA JMP .+3 /YES: DO NOT ASMBL LINE ISZ I GETSYM /NO, MOVE RETRN PTR & CONT. AS USUAL JMP I CKIF ISZ I IFCT /COUNT IGNORED LINE NOP TAD CHR /MOVE LINE PTR TO END OF LINE CKIF2, SNA JMP CKIF3 /FOUND A CR TAD M257 SNA JMP CKIF3 /SLASH TAD M14 SNA CLA JMP CKIF3 /SEMI-COLON JMS I GETCHR /TRY NEXT JMP CKIF2 CKIF3, JMP I .+1 ITM15 M257, -257 M14, -14 IFCT, IFCTR *6776 /PAGE SYMBOL TABLE (200 WORDS) /DOUBLE WORD ENTRIES /REBUILT FOR EACH CORE PAGE OF CODE /EVERY SYMBOL DEFINED OR REFERENCED ON /GIVEN PAGE IS ENTERED /TYPICAL ENTRY*: WD1=SYMBOL ID / WD2=CODE BITS /SYMBOL ID=ADDRESS OF SYMBOL ENTRY IN MAIN SYM. TAB /CODE: BIT0=1 IF SYM. DEF. ON CUR. PAGE / BIT11=1 IF SYM REFERENCED NORMALLY BY A MR1 ON THE PG. / BIT10=1 IF SYM. REF'D. WITH A # / BITS 1-9 USED FOR COUNTING AMOUNT OF OBACTR / WHICH IS DUE TO THIS SYMBOL /SYMBOLS ARE ENTERED ON PST IN ORDER OF APPEARENCE /IN SOURCE /NO MORE THAN 64 (DEC) SYMBOLS MAY BE REF'D. /ON ANY PAGE. /NOTE: THE SIZE OF THIS TABLE SHOULD NOT BE /INCREASED UNLESS LFS TABLE IS ALSO INCREASED. *7176 /PAGE TABLE (402 WORDS) /DOUBLE WORD ENTRIES /ONE ENTRY FOR EACH INSTRUCTION TO BE ASSEMBLED /ROOM FOR 1 EXTRA ENTRY TO COVER PAGE OVERFLOW /A NEW TABLE FOR EACH PAGE OF CODE /TYPICAL ENTRY: WD1=CODE BITS / WD2=SYMBOL WORD /CODE: BIT1=1 IF # REF / BIT2=1 IF CDF TO CUR BANK / BIT3=1 IF INDIRECT / BIT4=1 IF BLOCK 0 (FOR EQUIVALENCED TAGS) / BIT5=1 IF SPECIAL CALL CONST / BIT6=1 IF SKIP INST. / BIT7=1 IF AFS IS CONST / BIT8=1 IF PARAMETER / BIT9=1 IF OPR OR IOT INST. / BIT10=1 IF AFS IS LITERAL / BIT11=1 IF LFS OCCURS / BIT0 UNUSED /THE SYMBOL WORD=0 IF CODE BIT9=1 / =THE ACTUAL CONST OR LITERAL IF BITS2,5,7 OR 10=1 / =THE SYMBOL ID (MST ENTRY ADDR.) FOR AN ADDR. PARAMETER / OR FOR THE AFS OF AN MRI / /TYPE VERSION NUMBER /(THIS IS ONCE ONLY CODE) /(OVERWRITTEN BY P.S.T.) / *7000 / VERNUM, JMS I CRLF TAD JVERS DCA X1 TAD M26 JMS I MTYPE NOP TAD K7000X DCA I VNOP JMP I .+1 IOI JVERS, VERSN-1 MTYPE, QUERY M26, -15 VNOP, VN K7000X, NOP VERSN, 2004 /PDP-8 SABR DEC-08-A2C2-V# 2055 7040 2301 0222 4004 0503 5560 7055 0162 0462 5561 /- VERSION # (1ST DIGIT) 7001 /2ND DIGIT AND PATCH LEVEL /SABR BANK 1 SECTION /TABLES FIELD 0 *0 EQUTB, 0 /EQUIVALENCE TABLE /100 WORDS /TABLE IS REINITIALIZED BEFORE EACH PAGE BEGINS /COLLECTION, IF NO EQUIV. IS LEFT FROM PREVIOUS PAGE /MULTIPLE WORD ENTRIES /ONE ENTRY IS MADE FOR /EACH LOC. TAG WHICH HAS /EQUIVALENTS /1ST WORD OF EACH ENTRY /CONTAINS NO. OF OTHER WORDS /IN THE ENTRY /OTHER WORDS ARE SYMBOL ID'S /(MST ADDRESSES) OF SYMBOLS /EQUIVALENT TO THE PARTICULAR /LOCATION TAG *100 /BSEEST, 0 /EXTERNAL SYMBOL TABLE /100 WORDS /SINGLE WORD ENTRIES /CONSISTING OF THE SYMBOL ID (MST ADDRESS) /EACH EXT. SYM. IS ENTRED IN /THE TABLE WHEN IT FIRST /OCCURS IN THE SOURCE AND /ASSIGNED A LOCAL EXT. NUMBER /ACCORDING TO ITS PLACE IN THE /TABLE. *200 /PTOPTB, 0 /PAGE OP CODE TABLE /200 WORDS /SINGLE WORD ENTRIES /ONE FOR EACH ENTRY IN PAGE TABLE /ENTRY=ACTUAL OP CODE FOR /ALL MRI, OPR OR IOT'S /OR 0 FOR ALL PARAMETERS /NEW TABLE FOR EACH PAGE OF CODE /NOTE: THIS TABLE MAY OVERFLOW BY 1 WORD DURING COLLECTION /OVERFLOW CAUSED BY PUTTING INFO ON TABLE BEFORE CK FOR OVERFLOW /NO HARM IF ASSEM. PHASE LIT. TAB FOLLOWS CDF CIF 10 /CODE FOR START AT 200 JMP I .+1 START *400 /LITBSE, 0 /ASSEMBLY PHASE LITERAL TABLE /200 WORDS /DOUBLE WORD ENTRIES /MUST BE SEPARATE FROM COLL. /PHASE LIT. TAB. BECAUSE BOTH /GOING AT ONCE IN PASS 2. /THIS TABLE CONTAINS NOT /ONLY LITERALS BUT ALSO /OFF PAGE POINTERS /1ST WORD OF ENTRY = 1 OR 2 OR 6 /1 MEANS LITERAL & /2ND WORD CONTAINS ACTUAL VALUE /2 MEANS OFF PAGE SYMBOL PTR /& 2ND WORD CONTAINS SYMBOL ID. /6 MEANS OFF PAGE SYM. PTR /WHERE SYMBOL REFERENCED BY A # /2ND WORD AS FOR 2 /TABLE BUILT ANEW FOR EACH /PAGE OF CODE. *600 /LFSBSE, 0 /LOC FIELD SYMBOL TABLE /100 WORDS /SINGLE WORD ENTRIES /EACH=SYMBOL ID (MST ADDRESS) /OF THE GIVEN LFS /LFS'S ARE ENTERED IN ORDER /OF THEIR APPEARENCE IN SOURCE /TABLE REBUILT FOR EACH PAGE OF CODE /NOTE: THIS TABLE MUST BE AT LEAST AS LONG /AS THE PST TO PREVENT LFS OVERFLOW *700 PEBSE, 0 /PAGE ESCAPE PUSH DOWN LIST /40 WORDS /SINGLE WORD ENTRIES /EACH ENTRY IS 0,2, OR 4 /BEING THE VALUE OF THE /PAGE ESCAPE (0,2,OR 4 WORDS) /OF EACH PAGE ASSEMBLED /THESE NOS. ARE SAVED DURING /PASS 1 & USED DURING /PASS 2 *740 /SORT LISTS /SORT LIST FOR INITIAL CHAR. OF LITERAL SL3, 242 /QUOTE 255 /MINUS 304 /D 313 /K -1 /SORT LIST MUST BE FOLLOWED BY A NEGATIVE /BRANCH LISTS BL6, RLN15 RLN2 RLN2 RLN3 RLN3 /SORT LIST FOR BEGINNING OF INPUT ITEM SL2, 255 /MINUS 250 /LEFT PARIN 242 /QUOTE SL6, 273 /SEMI-COLON 257 /SLASH SL1, 240 /SPACE 211 /TAB 000 /CR -1 /SORT LIST MUST BE FOLLOWED BY A NEGATIVE /BRANCH LIST FOR BEGINNING OF INPUT ITEM BL2, ITM4 /NEGATIVE ITM8 /LITERAL ITM7 /ALPHA CONSTANT ITM15 /NULL ITEM ITM15 /NULL ITEM ITM2 /IGNORE SPACE ITM2 /IGNORE TAB ITM15 /NULL ITEM /BRANCH LIST FOR INITIAL CHAR. OF LITERL BL3, ITM7 /GET ASCII VALUE FOR LITERAL ITM10 /SET NEG. SW. ITM11 /SET MODE TO DECIMAL ITM12 /SET MODE TO OCTAL *1000 /LTBSE, 0 /COLLECTION PHASE LITERAL TABLE /100 WORDS /SINGLE WORD ENTRIES /CONTAINING ACTUAL VALUES /TABLE CONTAINS NOT ONLY /LITERALS BUT ALSO /POINTERS TO CONSTANT /AND ABSOLUTE ADDRESSES. /TABLE BUILT ANEW FOR /EACH PAGE OF CODE. /INPUT DATA BUFFER /546 (OCTAL) WORDS /ALL DATA CHARACTERS READ DIRECTLY INTO THIS BUFFER /1 CHAR. PER WORD /THE ACTUAL SIZE OF THE BUFFER IS ARBITRARY. *1100 DATA, 0 /LINE BUFFER (73 WORDS) /CONTAINS ASCII CHARACTERS, 1 PER WORD /NULLS & RUBOUTS DONT MAKE IT /END OF LINE MARKED BY A 0000 /CR,LF,FF DON'T GO INTO THE BUFFER /BUFFER IS LAID OUT AS FOLLOWS: *1646 LINBUF, 0 /110(OCTAL) WORDS FOR LINE CHARACTERS *1756 /LINEND, 0 /1 EXTRA WORD TO PREVENT OVERFLOW /(GETS THE 0 WHEN LINE IS TOO LONG) *1757 SL7, 215 214 212 240 211 /SORT LIST MUST BE FOLLOWED BY A NEGATIVE -1 BL1, PTEXT /SPACE PTEXT /TAB TEXERR /000 BL7, L72S L72X L72+2 L72+2 L72X /MAIN SYMBOL TABLE *2000 /ENTRIES ARE COMPOSED OF THE FOLLOWING: / FIRST A 1 WORD HEADER CODE / THEN THE SYMBOL ITSELF IN PACKED 6BIT ASCII (1-3 WORDS) / FINALLY THE 1 WORD BINARY VALUE OF THE SYMBOL /THE HEADER CODE IS LAID OUT AS FOLLOWS: /(A) FOR OP CODE SYMBOLS: / BIT0=1 AFTER THE SYMBOL HAS BEEN PRINTED BY PRSYM / BITS1&2=3 (THESE ARE THE SYMBOL TYPE BITS) / BIT3=1 FOR MEMORY REFERENCE INSTRUCTIONS / BITS4&5=THE MICRO-GROUP FOR OPR INSTRUCTIONS (0 FOR MRI AND IOT INSTS.) / (NOTE: MICRO-GROUP IS SET TO 0 FOR CLA) / BIT6=1 IF THE SYMBOL IS A PSUEDO-OP / BIT7=1 IF THE INST. IS A SKIP TYPE INST. / BIT8=1 / BIT9=0 / BITS10&11=THE NUMBER OF PACKED ASCII SYMBOL WORDS IN THE ENTRY /(B) FOR OTHER SYMBOL TYPES: / BIT0 AS ABOVE / BITS1&2=0 FOR ABSOLUTE AND COMMON SYMBOLS / =1 FOR RELOCATABLE SYMBOLS / =2 FOR EXTERNAL SYMBOLS / BIT3=1 AFTER THE SYMBOL HAS BEEN DEFINED / BIT4=1 FOR ENTRY SYMBOLS / BIT5=1 IF THE SYMBOL IS EVER REFERENCED BY A # / BIT6=1 IF THE SYMBOL IS IN COMMON / BIT7=1 IF THE SYMBOL IS A DUMMY SYMBOL / BITS8-11 AS ABOVE /MST=. 3053 /ABSYM 0102 2331 1500 PABSYM 3052 /ARG 0122 0700 PARG 3412 /AND 0116 0400 AND 0 3053 /BLOCK 0214 1703 1300 PBSS 3052 /CALL 0301 1414 PCALL 3053 /COMMN 0317 1515 1600 PCOMMN 3112 /CIA 0311 0100 CIA 3012 /CLA 0314 0100 CLA 3112 /CLL 0314 1400 CLL 3112 /CMA 0315 0100 CMA 3112 /CML 0315 1400 CML 3053 /DECIM 0405 0311 1500 PDEC 3053 /DUMMY 0425 1515 3100 PDUMMY 3412 /DCA 0403 0100 DCA 0 3052 /EAP 0501 2000 PEAP 3052 /END 0516 0400 PEND 3053 /ENTRY 0516 2422 3100 PENTRY 3053 /FORTR 0617 2224 2200 PFORT 3212 /HLT 1014 2400 HLT 3051 /IF 1106 PIF 3053 /CPAGE 0320 0107 0500 PIFF 3432 /ISZ 1123 3200 ISZ 0 3412 /INC (NON-SKIP ISZ) 1116 0300 ISZ 0 3112 /IAC 1101 0300 IAC 3012 /IOF 1117 0600 IOF 3012 /ION 1117 1600 ION 3412 /JMP 1215 2000 JMP 0 3412 /JMS 1215 2300 JMS 0 3012 /KRB 1322 0200 KRB 3032 /KSF 1323 0600 KSF 3052 /LAP 1401 2000 PLAP 3112 /NOP 1617 2000 NOP 3053 /OCTAL 1703 2401 1400 POCT 3053 /OPDEF 1720 0405 0600 OPDEX 3212 /OSR 1723 2200 OSR 3052 /PAGE 2001 0705 PPAGE 3053 /PAUSE 2001 2523 0500 PPAUSE 3012 /PLS 2014 2300 PLS 3032 /PSF 2023 0600 PSF 3053 /REORG 2205 1722 0700 PRORG 3053 /RETRN 2205 2422 1600 PRTN 3112 /RAL 2201 1400 RAL 3112 /RAR 2201 2200 RAR 3012 /RFC 2206 0300 RFC 3012 /RRB 2222 0200 RRB 3032 /RSF 2223 0600 RSF 3112 /RTL 2224 1400 RTL 3112 /RTR 2224 2200 RTR 3232 /SKP 2313 2000 SKP 3053 /SKPDF 2313 2004 0600 SKPDEX 3232 /SMA 2315 0100 SMA 3232 /SNA 2316 0100 SNA 3232 /SNL 2316 1400 SNL 3232 /SPA 2320 0100 SPA 3112 /STA 2324 0100 STA 3112 /STL 2324 1400 STL 3232 /SZA 2332 0100 SZA 3232 /SZL 2332 1400 SZL 3232 /SPC=SPA+CLA (USED BY COMPILER) 2320 0300 SPA CLA 3412 /TAD 2401 0400 TAD 0 3052 /TEXT 2405 3024 PTEXT 3012 /TLS 2414 2300 TLS 3032 /TSF 2423 0600 TSF ACH=20 ACM=21 ACL=22 0452 /ACH 0103 1000 ACH 0452 /ACM 0103 1500 ACM 0452 /ACL 0103 1400 ACL II, 0451 /I 1100 0400 STTP=. CORE1=7600 *CORE1-1 /THE OCCURRENCE TABLE EXTENDS DOWNWARD FROM HERE /TOWARD THE MAIN SYMBOL TABLE /& SHARING THE SAME SPACE WITH IT. /THIS TABLE IS VARIABLE, BEING COLLAPSED /AS MUCH AS POSIBLE DURING USE. THE ONLY /THING LEFT ON IT AT THE END ARE UNDEFINED /SYMBOLS. /THE OCC. TAB. CONTAINS AN ENTRY FOR EVERY /REF. TO AN AS YET UNDF. SYMBOL. EACH /TIME A SYMBOL IS DEFINED THE TABLE IS SEARCHED /TO SEE IF FORWARD REFERENCES TO IT EXIST. /IF SO THEY ARE OUTPUT & THE TABLE /CONDENSED. /ENTRIES CONSIST OF 2 OR 3 WORDS /STRUCTURED AS BELOW: /HIGH WORD: LOCATION OF REFERENCE /LOW WORD: SYMBOL I.D. /OPTIONAL WORD: # FLAG /THE LOC. WORD CONTAINS THE PROG. ADDR. WHERE /THE VALUE OF THE SYM. MUST BE ASSEMBLED /THE # FLAG=1 IF IT EXISTS. IT WILL /EXIST ONLY FOR THOSE ENTRIES WHERE THE /SYM. WAS REF'D. BY A #. /THE TABLE IS ALWAYS SEARCHED IN REVERSE /FROM LOW CORE UPWARD /THE O.T. PTR (OTP) ALWAYS PTS. TO THE NEXT FREE /LOCATION BELOW THE TABLE /THE TABLE HAS NO IMPORTANCE DURING PASS 2. /MEMORY IS NOT USED $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 | /OS8 SABR ASSEMBLER OVERLAY ***SPATCH.07*** / / / / / / / // / / / / /COPYRIGHT (C) 1974,1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / / /FIXES TO SPATCH FOR V18 J.K. 1975 / / .CHANGED USE OF 17645 SO /N CAN BE PASSED TO LOADER / BIT 0 OF 17645 INDICATES THAT SABR WAS CHAINED / TO FROM FORT / .ALLOW TWO PAGE OUTPUT HANDLER / / /SABR ASSEMBLER, LIKE 8K FORTRAN UNDER OS/8, RUNS /IN FIELD 1 WITH ITS TABLES IN FIELD 0. / OCTOBER 26,1971 / /MODIFIED SO THAT SABR WILL, AT RUN TIME, DETERMINE IF THE USER /SPECIFIED I/O DEVICES REQUIRE TWO PAGE HANDLERS, AND IF SO /SABR WILL ALLOCATE SPACE FOR THEM. ALSO IF ALL I/O IS DONE VIA THE /SYSTEM DEVICE, SABR WILL NOT RESERVE ANY SPACE FOR I/O HANDLERS /SPACE FOR TWO PAGE HANDLERS IS MADE BY SHRINKING THE INPUT /BUFFERS-CURRENTLY 4 PAGES-TO 2 PAGES. B.CLOGHER 10/71 / FIELD 0 SDVHND=772 MPARAM=7643 DVHNDL=7647 JSBITS=7746 MOFILE=7600 CORE1=6200 /UPPER CORE LIMIT OF OCCURRENCE TABLE(VARIES WITH I/O HANDLERS NEEDED!!) SABR=201 /SABR V17 FIRST LOC AFTER "JMS I IOINIT" PASS=110 /SABR V17 SERROR=JMS I 177/SABR V17 ERRE=2701 /SABR V17 PRSYMP=41 /SABR V17 TEM1=123 /SABR V17 TEM2=124 /" M4=3704 /" CLOC1=6 /" CLOC2=3162 /" CLOC3=4356 /" CTYPE=23 /" CRLF=24 CHR=61 /" SYMBOL=3 /" LLFS=5364 /" LINE=67 /" L64=4772 /" TYPE=54 /" PUNCH=42 /" INBUF=6200 /6200-7177 OR 6600-7177 PRJ5=4051 PRNOP=4136 PRJ2=4170 PRS2=4025 PRS5=4101 *30 /CCL PATCH; GOES HERE AS A HACK CCLKLG, TAD [SKP DCA I [CCLSKP CDF 10 TAD I [7645 SMA CLA JMP I [NOTFRT TAD I [7645 AND P3777 DCA I [7645 CDF JMP I [SETCOR P3777, 3777 *200 /INITIALIZATION - GETS DESTROYED DURING SABR EXECUTION START, ISZ I [FSWITC /SKIPS SINCE FSWITC=-1. ENTRY FROM "R SABR" FSTART, JMP CCLKLG /ENTRY FROM 8K FORTRAN VIA "RUN SABR" MONITOR CALL CLA CMA /USED AS TEM. BY SUBR. DNUM DCA I [FSWITC /USED AS TEM. BY SUBR. DNUM PTEM1, CIF 10 JMS I [7700 /CALL I/O MONITOR 10 /AND ASK IT TO STICK AROUND CIF 10 JMS I [200 5 /COMMAND DECODE 2302 /.SB ASSUMED EXTENSION NOTFRT, CDF 10 TAD I [MPARAM AND [100 CDF 0 SNA CLA /IS /F SWITCH ON? DCA I [FSWITC /NO - ZERO OUT FSWITC TAD I [JSBITS TAD [1000 DCA I [JSBITS CCLSKP, JMP .+5 SETCOR, ISZ I [FDSW /SET DELETE SWITCH CIF 10 JMS I [7700 /CALL I/O MONITOR--LOCK IT IN 10 CDF 10 TAD I [MOFILE /CHECK FIRST TWO OUT DEV. SPECS.--NEED 2 PAGE HNDLR? OUTL, JMS DNUM JMP OSYS /NO OUTPUT OR SYS DEV. JMP TWOPAG /NEED TWO-PAGE HANDLER DONE, TAD I [MOFILE+5 /1 PAGE HNDLR-LOOK AT 2ND OUT DEV. ISZ CNT /DONE BOTH? JMP OUTL /NO-GO ON CLA /YES- TAD PTEM2 /ARE BOTH OUT DEVS. SYS: OR NOT THERE? SZA CLA /IF SO-ALLOT 0 PAGES FOR OUTPUT HANDLER TAD [-200 /NO-ALLOT 1 PAGE FOR HANDLER DONE1, DCA OPGES /-SIZE OF OUT HANDLER NEEDED INLP, TAD I TEM /NOW LOOP THRU 9 POSSIBLE INPUT SPECS. JMS DNUM JMP ISYS /INPUT NOT THERE OR SYS DEV. JMP TWOPG /TWO PAGE HANDLER NEEDED ILP1, ISZ TEM /ONE-MOVE PTR TO NEXT ISZ TEM ISZ CNT1 /DONE ALL 9? JMP INLP /NO TAD TEM3 /YES-ARE ALL INPUTS FROM SYS OR NOT THERE? SZA CLA /IF SO-DON'T SAVE ROOM FOR INPUT HANDLER TAD [-200 /NO-NEED ONE PAGE FOR HANDLER IDONE, DCA IPGES /STORE AS SIZE OF INPUT HANDLER TAD IPGES TAD OPGES TAD [400 /NEED MORE THAN A TOTAL OF 2 PAGES FOR HANDLERS? CDF 00 /BACK TO DF 0 SMA CLA JMP NOTWO /NO-GO ON DCA I [INREC1 /YES-ADJUST INPUT ROUTINE FOR ONLY 2 PAGE BUFFERS TAD [200 DCA I [INBFPT-1 DCA I [INRD1 DCA I [INRD1+1 TAD [6600 /RESET ADDRESS OF INPUT BUFFER DCA I [INBFPT TAD [400 NOTWO, TAD [6200 /RESET UPPER CORE LIM. OF OCCURRANCE TABLE TAD IPGES TAD OPGES DCA [CORE1 TAD OPGES TAD [200 SPA CLA /MORE THAN ONE PAGE OUT HNDLR NEEDED? IAC /YES TAD OPGES TAD I [INBFPT /ADJUST HANDLER FETCH FOR TWO PAGE HANDLER CDF 10 /BACK TO DATA FIELD 1 DCA I [OUHND CMA /PROPAGATE CHANGES INTO MAIN PART OF SABR TAD [CORE1 DCA I [CLOC1 TAD I [CLOC1 DCA I [CLOC3 TAD [CORE1 DCA I [CLOC2 TAD IPGES TAD [200 SPA CLA /MORE THAN ONE PAGE FOR INPUT HNDLR? IAC /YES-ADJUST IN HNDLR FETCH ROUTINE TAD I [CLOC2 /(CONTAINS START ADDRESS OF CORE FOR IN HNDLR.) CDF 00 DCA I [ADEVN /STORE FOR HNDLR FETCH ROUTINE CDF 10 JMP I [LCHK ISYS, ISZ TEM3 IPGES, 0 JMP ILP1 /INPUT SPEC. NOT THERE OR SYS DEV. TWOPG, TAD [-200 /INPUT SPEC-NEEDS TWO PAGES JMP IDONE-1 TWOPAG, TAD [-200 /OUT HNDLR NEEDS TWO PAGES JMP DONE1-1 OSYS, ISZ PTEM2 /OUT HNDLR NOT NEEDED OR SYS. DEVICE OPGES, 0 JMP DONE / /ROUTINE TO CHECK DEVICE SPECS. LEFT BY COMMAND DECODER AND SEE /IF WE NEED ANY TWO PAGE HANDLERS. ALSO CHECK IF ALL I/O IS FROM /SYS DEVICE IN WHICH WE DON'T HAVE TO SAVE ROOM FOR ANY HANDLERS /RETN. TO CALL + 1 IF DON'T NEED ROOM FOR ANY HANDLER /RETN. TO CALL + 2 IF NEED 2 PAGES FOR HANDLER /RETN. TO CALL + 3 IF NEED 1 PAGE FOR HANDLER / DNUM, 0 AND [17 /MASK DEV. # DCA FSTART+1 /STORE TAD FSTART+1 CLL SNA /ANYTHING THERE? JMP I DNUM /NO-TREAT LIKE SYS. DEV TAD [DVHNDL-1 /CHECK IF THIS HANDLER CO-RESIDENT WITH SYS.(TD8/E--UNIT 1) DCA FSTART+2 TAD I FSTART+2 TAD [200 SZL CLA /IS ENTRY PT. ABOVE 7600?? JMP I DNUM /YES-JUST LIKE SYS DEV. TAD FSTART+1 TAD [SDVHND-1 /NO-PICK UP TABLE WD WHICH TELLS IF 2 PAGE HNDLR. DCA FSTART+2 TAD I FSTART+2 ISZ DNUM /BUMP RETN. SMA CLA /BIT 0=1? I.E. DOES IT NEED TWO PAGES? ISZ DNUM /NO-NORMAL RETN. TO CALL+3--NEED 1 PAGE JMP I DNUM /YES-RETN. TO CALL+2--NEED 2 PAGES TEM3, -11 CNT, -2 CNT1, -11 PTEM2, -2 TEM, MOFILE+17 *400 LCHK, TAD I [MPARAM+1 AND (4 SNA CLA ISZ STSABR TAD I [MPARAM+1 AND [40 SNA CLA /IF /S IS ON TAD I [MOFILE+5 SZA CLA /OR IF THERE IS NO LISTING OUTPUT FILE JMP NSPEED TAD [PRS5&177+5200 /SPEED UP SYMBOL TABLE SORT DCA I [PRJ5 DCA I [PRNOP DCA I [SYMXX /AND PRINT "U" MESSAGE FOR UNDEFINEDS TAD [PRS2-1&177+5200 DCA I [PRJ2 NSPEED, CDF 10 TAD I [MOFILE+4 /GET EXTENSION OF BINARY OUTPUT SNA /IS IT THERE? TAD [2214 /NO - SET TO .RL DCA I [MOFILE+4 TAD I [MOFILE+11 SNA TAD [1423 /SIMILIARLY SET LISTING EXTENSION TO .LS DCA I [MOFILE+11 DCA I [OUTINH TAD I [MOFILE SNA CLA /BINARY OUTPUT? JMP NOBNOT /NO CDF CIF 10 JMS I [TSTNTR /YES - OPEN IT CDF 10 JMP YESBOT NOBNOT, TAD [MOFILE+1 DCA I [PFILE ISZ I [OUTINH /INHIBIT OUTPUT YESBOT, TAD I [MOFILE+5 CDF 0 SZA CLA DCA I [LSTFLG CDF 10 TAD I [MPARAM AND [41 /"L" OR "G" FLAGS ON? CDF 0 SNA CLA JMP NOLOAD JMS I [MINCOR CLA IAC /DEVICE "SYS" CIF 10 JMS I [200 2 /LOOKUP ALOAD, LOADER 0 /LENGTH GOES HERE AND IS IGNORED JMP NOLODR /COULDN'T FIND IT TAD ALOAD DCA I [LDRBLK CDF 10 TAD I [OUTREC CDF 0 DCA I [REMEMB NOLOAD, JMS I [OPENFL /OPEN FIRST INPUT FILE WHILE MONITOR STILL IN CORE CDF CIF 10 JMP I .+1 STSABR, SABR /FIRST LOC IN SABR AFTER "INITIAL DIALOGUE" NOLODR, TAD [1200 JMP I [ERROR LOADER, TEXT /LOADERSV/ *1100 /FILE OPENER - RESIDES IN PART OF THE OLD SABR INPUT BUFFER O7760, 7760 OPENFL, 0 CDF 10 TAD I FILPTR SNA /IS THERE ANOTHER INPUT FILE? JMP I (ERROR+1 /ERROR - NO END STATEMENT IN PROGRAM DCA OTEMP TAD OTEMP AND (17 /EXTRACT DEVICE NUMBER TAD (DVHNDL-1 DCA OTEMP2 TAD I OTEMP2 DCA OTEMP2 ISZ FILPTR TAD I FILPTR /GET STARTING BLOCK # CDF 0 DCA I (INREC /STORE IT AWAY ISZ FILPTR TAD OTEMP AND (7760 /EXTRACT LENGTH SZA /LENGTH OF 256 IMPLIES MAY BE LARGER TAD (17 CLL CML RTR RTR /GET LENGTH AS A NORMAL NEGATIVE NUMBER DCA I (INCNT /STORE THAT AWAY TOO TAD OTEMP2 SZA JMP GOTIT JMS I (MINCOR /GET MONITOR TAD ADEVN /THIS LOC. SET UP BY INITIALIZATION ROUTINE DCA ADEVNO TAD OTEMP CIF 10 JMS I O200 1 /ASSIGN ADEVNO, 5600 /FORCE HANDLER INTO PAGE 5600 JMP I (DELERR /GIVE S ERROR TAD ADEVNO GOTIT, DCA I (INDEV JMS I (MOUCOR /GET MONITOR OUT CLA CMA DCA I (INCHCT /FORCE BUFFER LOAD ON FIRST READ JMP I OPENFL OTEMP, 0 OTEMP2, 0 FILPTR, 7617 O200, 200 ADEVN, 0 /SET UP BY INIT. ROUTINE-PAGE ADDR. OF IN HNDLR *1600 MINCOR, 0 RDF TAD MINCIF DCA MINXIT MINCIF, CDF CIF 0 CIF 10 JMS I SYSTEM 10 /ESCAPE TAD MIN200 DCA SYSTEM MINXIT, 0 /RESTORE CALLING FIELDS JMP I MINCOR MOUCOR, 0 CDF 0 TAD SYSTEM E7500, SMA CIF 10 MN7700, SMA CLA JMS I SYSTEM 11 /GET OUT TAD MN7700 DCA SYSTEM JMP I MOUCOR SYSTEM, 200 MIN200, 200 ERROR, TAD E7500 /MAKE SABR ERROR "B" DCA MINCOR JMS MOUCOR /KICK MONITOR OUT CDF CIF 10 DCA I EPASS /SET PASS=0 SO ERROR WILL PRINT TAD EL64 DCA I ETYPE TAD MINCOR JMP I .+1 ERRE EPASS, PASS EL64, L64 ETYPE, TYPE *7200 SPAUSE, 0 /"PAUSE" STATEMENT PATCH TAD FSWITC CLL RAL TAD I (FILPTR DCA I (FILPTR /RESET FILE POINTER IF CALLED FROM FORTRAN JMS I (OPENFL /OPEN NEXT FILE CDF CIF 10 JMP I SPAUSE FSWITC, -1 /AS ADVERTISED DELETE, TAD I (MPARAM RTR /PUT "K" SWITCH IN LINK D7600, 7600 CDF 0 TAD I (JSBITS RAR CLL CML RAL DCA I (JSBITS /MARK "DON'T CARE IF MONITOR AREA DESTROYED" BITS TAD FDSW SZL SNA CLA /DELETE ONLY IF CALLED FROM FORTRAN WITH JMP NODLET /"K" SWITCH(IN LINK) ZERO JMS I (MINCOR CLA IAC /DEVICE "SYS" CIF 10 JMS I (200 4 /CLOSE - USED AS DELETE NAME /NAME FOR CLOSE PROCESSOR 0 /NO BLOCKS - WILL BE DELETED JMP DELERR /ERROR NODLET, TAD LDRBLK SNA CLA /WAS A LOADER BLOCK STORED JMP GETOUT CDF 10 TAD I (L64 CDF 0 SZA CLA /IF WE USED THE TELETYPE ROUTINE, JMP GETOUT /THEN THERE WAS AN ERROR TAD REMEMB CDF 10 DCA I (MOFILE+1 CLL CML CLA RAR TAD I (MPARAM+2 DCA I (MPARAM+2 CDF 0 JMS I (MINCOR CIF 10 JMS I (200 6 /RUN LDRBLK, 0 REMEMB, 0 FDSW, 0 GETOUT, TAD I (SYSTEM CDF 10 D7700, SMA CLA CMA DCA I D7700 CDF 0 JMP I .+1 7605 DELERR, TAD (1700 /GIVE A "S" ERROR DELER2, TAD (200 CDF CIF 0 JMP I (ERROR NAME, 0617;2224;2216;2415 INREAD, 0 AND D7700 SNA CLA JMS I POPNFL JMS I INDEV 400 /OR 200 IF NEED TWO PAGE HANDLERS-REDUCE BUFFER SIZE TO MAKE ROOM INBFPT, INBUF INREC, 0 JMP INERR ISZ INREAD ISZ INREC INREC1, ISZ INREC /OR 0000 IF TWO PAGE HANDLERS-SINCE IN BUFFER IS 1/2 SIZE JMP I INREAD INDEV, 0 INERR, SPA CLA JMP DELER2 JMP INREC+3 POPNFL, OPENFL CLSMBE, 0 /SUBR TO CLOSE OUTPUT FILE IF ONE EXISTS CDF CIF 10 TAD I (OUTINH SNA CLA JMS I (OUCLOS CIF 0 /IN CASE WE DIDN'T CLOSE IT JMP I CLSMBE *7400 /END OF PASS CRAP AND INPUT ROUTINE P40, 40 PASEND, ISZ I (PASS /BUMP PASS COUNTER LSTFLG, JMP SBSYMT /ZERO IF LISTING FILE EXISTS JMS I (CLSMBE /CLOSE BINARY FILE CDF CIF 10 JMS I (TSTNTR /ENTER LISTING FILE TAD I (FSWITC SZA CLA JMP .+4 TAD (7617 DCA I (FILPTR /RESET FILE POINTER TO BEGINNING JMS I (OPENFL /AND OPEN FIRST FILE /IF CALLED FROM FORTRAN WE DONT HAVE TO DO THIS /BECAUSE OF THE PECULIAR NATURE OF FORTRAN OUTPUT JMS I (MOUCOR /KICK MONITOR OUT CDF CIF 10 TAD I (MPARAM+1 P200, AND P40 /MASK OUT "S" SWITCH DCA I (OUTINH /INTO "OUTPUT INHIBIT" FLAG JMS I (SYMPRT /PRINT SYMBOL TABLE UNDER CONTROL OF /S DCA I (OUTINH /ZERO FLAG FOR LISTING TAD I (MPARAM+1 /SYMPRT RETURNS WITH DATA FIELD=10 RTL CIF 10 SNL CLA /"N" FLAG IS IN THE LINK JMP I (ENDRSM /HE WANTS A LISTING - GO GET IT SBREND, CIF 0 JMS I (CLSMBE /CLOSE OUTPUT FILE JMP I (DELETE /DELETE FORTRN.TM AND CHAIN OR RETURN SBSYMT, TAD (TDUMMY CDF CIF 10 DCA I (PUNCH /INHIBIT ALL FUTURE OUTPUT JMS I (SYMPRT /CHECK SYMTAB FOR UNDEFINEDS CDF 0 ISZ I (JSBITS /SET "DON'T CARE ABOUT USR CORE" FLAG JMP SBREND /NOW GO CLOSE BINARY OUTPUT FILE AND RETURN INCHAR, 0 ISZ INJMP KSF JMP .+5 KRS TAD (-203 SNA CLA JMP I (7600 /EXIT TO MONITOR IF ^C TYPED ISZ INCHCT INJMPP, INJMPE TAD INCNT INRD, JMS I (INREAD DCA INCNT /RETURN HERE ON EOF INRD1, ISZ INCNT /SET TO 0000 IF 2 PAGE HANDLERS FORCE INPT. BUFF. TO 1/2 SIZE SKP / " " " TAD (600 ISZ INCNT IN7400, 7400 TAD (-1401 DCA INCHCT TAD INJMPP DCA INJMP TAD I (INBFPT DCA INPTR JMP INCHAR+1 INJMPE=JMP . INJMP, INJMPE JMP INCHA1 JMP INCHA2 INCHA3, TAD INJMPP DCA INJMP TAD I INPTR AND IN7400 CLL RTR RTR TAD INTEMP RTR RTR ISZ INPTR JMP INCOM INCHA2, TAD I INPTR AND IN7400 DCA INTEMP ISZ INPTR INCHA1, TAD I INPTR INCOM, AND (177 SZA TAD (-177 SNA JMP INCHAR+1 TAD (145 /CHECK FOR ^Z SNA JMP INRD /^Z ON INPUT MEANS GO TO NEXT FILE TAD (232 CDF CIF 10 DCA I (CHR JMP I INCHAR INPTR, 0 INCHCT, 0 INTEMP, 0 INCNT, 0 FIELD 1 *6400 /OUTPUT ROUTINE INTERFACE - CANT GO PAST 6423 OUCHAR, 0 DCA I POUTEM TAD OUTINH SZA CLA OUCRET, JMP I OUCHAR /DOUBLES AS OFF-PAGE RETURN ISZ I POUJMP ISZ OUCHCT JMP I POUJMX JMS OUTDMP JMP OUCHAR+2 POUJMP, OUJMP POUJMX, OUJMX POUTEM, OUTEMP OUTINH, 0 F3ERR, TAD O2100 F2ERR, TAD O2100 F1ERR, CDF CIF 0 JMP I .+1 ERROR O2100, 2100 *6457 /LOADS OVER OLD SABR INITIALIZATION ROUTINE TSTNTR, 0 /CALLED FROM FIELD 0 TAD PFILE TAD C4 DCA PFILE TAD I PFILE ISZ PFILE DCA ODEVNO TAD OUHND /THIS LOC. IS SET UP AT INIT. TIME DCA OUHNDL CIF 0 JMS I (MINCOR JMS I (200 13 /RESET OUTPUT DEVICE TAD ODEVNO /LOAD OUTPUT DEVICE JMS I (200 1 OUHNDL, 7400 JMP F2ERR TAD PFILE DCA ENAME /POINTS TO FILE NAME DCA OULNGT /ZERO CLOSING LENGTH TAD ODEVNO /LOAD DEVICE NUMBER AND REQUESTED LENGTH JMS I (200 3 /ENTER ENAME, 0 /POINTER INTO COMMAND DECODER AREA GOES HERE OUCHCT=ENAME ELENGT, 0 /"0 LENGTH" MEANS AS LARGE A SPACE AS POSSIBLE JMP F2ERR /COULDN'T ENTER FILE - MAYBE BAD DIRECTORY TAD ENAME /GET STARTING BLOCK # DCA OUTREC /STORE IT AWAY JMS OUSPTR /INITIALIZE OUTPUT ROUTINE ENTRTN, CDF CIF 0 JMP I TSTNTR OUSPTR, 0 TAD POUBUF DCA I (OUPTR TAD (-601 DCA OUCHCT TAD (OUJMPE DCA I POUJMP JMP I OUSPTR OUTDMP, 0 CIF 0 JMS I OUHNDL 4200 POUBUF, 1200 /REMAINDER OF OLD SABR INPUT BUFFER OUTREC, 0 JMP F3ERR ISZ OUTREC JMS OUSPTR ISZ OULNGT ISZ ELENGT JMP I OUTDMP JMP F2ERR OUCLOS, 0 TAD OUT232 /PUT A ^Z IN THE OUTPUT FILE JMS OUCHAR TAD OUCHCT CMA SZA CLA JMP .-4 /FILL REMAINDER OF BUFFER WITH ZEROS JMS OUTDMP CIF 0 JMS I (MINCOR TAD ODEVNO JMS I (200 C4, 4 /CLOSE PFILE, 7574 OULNGT, 0 JMP F2ERR /ERROR ON CLOSE DCA OULNGT CIF 0 JMP I OUCLOS OUT232, 232 ODEVNO, 0 OUHND, 0 /SET UP AT INIT. TIME TO ALLOW 2 PAGE HNDLR /IF NEEDED *6610 /OUTPUT ROUTINE - CANT GO PAST 6661 OUJMX, CDF 0 OUJMPE=JMP . OUJMP, OUJMPE JMP OUCHA1 JMP OUCHA2 OUCHA3, TAD OUTEMP RTL RTL DCA OUTEMP TAD OUJMPP DCA OUJMP TAD OUTEMP AND OU7400 TAD I OUPOLD DCA I OUPOLD TAD OUTEMP RTL RTL AND OU7400 TAD I OUPTR DCA I OUPTR ISZ OUPTR JMP OUCOM OUCHA2, TAD OUPTR DCA OUPOLD ISZ OUPTR OUCHA1, TAD OUTEMP AND OU377 DCA I OUPTR OUCOM, CDF 10 JMP I .+1 OUCRET OUPTR, 0 OUJMPP, OUJMPE OUPOLD, 0 OUTEMP, 0 OU7400, 7400 OU377, 377 /PATCHES TO SABR TO HOOK INTO THESE WONDERFUL ROUTINES *4574 /OLD "INITR" ROUTINE AREA - 4 LOCATIONS LONG SYMPRT, 0 /INTERMEDIATE ROUTINE TO PRINT SYMBOL TABLE JMS I PRSYMP /CALL SABR'S ROUTINE CIF 0 JMP I SYMPRT /BUT RETURN TO FIELD 0 *4641 /CODE IN THIS SECTION CAN'T GO PAST 4704 FETCH, 0 /REPLACES ROUTINE IN SABR OF SAME NAME CDF CIF 0 JMS I .+2 JMP I FETCH INCHAR LDRCT, 7700 /FOR LEADER-TRAILER ROUTINE ON SAME PAGE USYMFG, 0 /ROUTINE TO GIVE UNDEFINED SYMBOL MESSAGES WHEN JMS I CTYPE /NO SYMBOL TABLE IS REQUESTED SYMXX, JMP I USYMFG /ZEROED IF CHECKING FOR UNDEFINEDS TAD SYMBOL DCA I PLLFS /SET UP SABR CELLS SO THAT ERROR ROUTINE WILL DCA LINE /PRINT THE NAME OF THE UNDEFINED SYMBOL TAD U2300 /FUDGE FOR "U" ERROR MESSAGE - UNFORTUNATELY, JMP I .+1 /THIS MESSAGE IS INSTANTLY FATAL - SERVES HIM RIGHT F1ERR PLLFS, LLFS /RANDOM LOCATION IN SABR U2300, 2300 TDUMMY, 0 /DUMMY OUTPUT ROUTINE CLA JMP I TDUMMY /AS DUMMY AS YOU CAN GET *6133 /PATCH TO SYMBOL TABLE PRINTER TO USE ABOVE JMS I 6177 /THIS REPLACES A "JMS I CTYPE" *6177 USYMFG /LUCKILY THERE WAS A LOCATION FREE *3665 /REWRITE OF OCTAL TYPEOUT ROUTINE TO DCA TEM1 /NOT KEEP INFORMATION IN THE LINK ACROSS TAD M4 /A CALL TO THE OUTPUT ROUTINE DCA TEM2 L62A, TAD TEM1 RTL RAL DCA TEM1 TAD TEM1 RAL *3702 JMP L62A *4317 /"PAUSE" PROCESSOR CLA /REPLACES CLA HLT CDF CIF 0 *4332 /PATCHES TO INITIALIZATION ROUTINE NOP /DON'T GIVE NOP /TWO USELESS CARRIAGE RETURN - LINE FEED PAIRS *4341 NOP /DON'T JMS I 4372 'CAUSE WE HAVE CHANGED 4372! *4372 /MORE "PAUSE" FUDGE SPAUSE *4715 /ALTER COUNT ON LEADER-TRAILER TAD LDRCT *561 /"END" STMT PROCESSOR CIF 0 JMP I PEND /END OF PASS 1 ENDRSM=. *565 /MORE ON "END" NOP /ELIMINATE HALT AT END OF PASS 1 *570 /STILL MORE ON "END" CDF CIF 0 JMP I SEND /END OF PASS 2 *576 /THERE ARE (WERE) TWO WHOLE FREE LOCATIONS IN THIS PAGE! SEND, SBREND PEND, PASEND *2761 /FATAL ERROR HALT IN ERROR ROUTINE CDF CIF 0 JMP I 166 /166 = LITERAL 7600 *4003 /LISTING ROUTINE SKP CLA /ALWAYS PUT LISTING ON "PUNCH" *PUNCH /POINTER TO PUNCH ROUTINE OUCHAR /POINTER TO MY PUNCH ROUTINE / *200 VERNUM JMS I .-1 / *7000 VERNUM, 0 JMS I CRLF TAD I POINT JMS I CTYPE ISZ POINT ISZ COUNT JMP .-4 JMS I CRLF DCA I TYPE JMP I VERNUM / POINT, TITLE COUNT, -5 TITLE, TEXT /SABR V18A / $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 | /4 OS/8 FORTRAN (PASS ONE) / / VERSION 4A PT 16-MAY-77 / / OS/8 FORTRAN COMPILER - PASS 1 / / BY: HANK MAURER / UPDATED BY: R.LARY + M. HURLEY / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / VERSON=4 /CHANGES FOR MAINTENANCE RELEASE (S.R.): /1. BUMPED VERSION NUMBER TO 304 /2. INCLUDED PATCH SEQ #4 (OCT DSN) FOR SF ERROR FIX /3. INCLUDED PATCH SEQ #6 (TEMP VARS IN ASF) /4. FIXED PROBLEM IN DATA STATEMENT /5. STOPPED HALT AFTER OT ERROR BY CONVERTING LOGICAL / VARS TO INTEGER IN ARITHMETIC IF STATEMENT /6. FIXED BUG RE /A AND .RA EXTENSION /LAST MINUTE CHANGES: /7. ALLOWED PARITY INPUT /8. IGNORE NULLS ON INPUT /9. FIXED BUG RE IGNORING LAST LINE IF IN ERROR / OR IN FACT IGNORING ANY LAST LINE IF NO END STATEMENT /10. ALLOW MULTIPLE INPUT FILES / / /CHANGES FOR OS/8 V3D AND OS/78 BY P.T. / .PATCH LEVEL NOW CONTAINED IN LOCATION 1130 // // 20-DEC-2018 LHN - edited DSN patches inot this source // - DSN seq 2 M // - DSN 51.3.1 M // - Changes version to 4C // *7 LINENO, 1 /2.01/ LINE NUMBER X10, 0 /AUTO INDEX REGISTERS X11, 0 X12, 0 NEXT, FREE-1 /FREE SPACE POINTER STACK, STACKS-1 /STACK POINTER CHRPTR, 0 /INPUT BUFFER POINTER X16, 0 X17, 0 STKLVL, STACKS-1 /STACK BASE LEVEL BUCKET, 0 /FIRST CHAR OF NAME WORD1, 0 /SIX WORD LITERAL BUFFER WORD2, 0 WORD3, 0 WORD4, 0 WORD5, 0 WORD6, 0 ACO, 0 /FLOATING AC OVERFLOW WORD OP1, 0 /SEVEN WORD OPERAND FOR "NUMBER" OP2, 0 OP3, 0 OP4, 0 OP5, 0 OP6, 0 OPO, 0 CHAR, 0 /ICHAR PUTS CHARACTER HERE NOCODE, 0 /IS 1 IF CODE GENERATION OFF NCHARS, 0 /SIZE OF INPUT LINE NUMELM, 0 /NUMBER OF VARS IN TYPED LIST TEMP, 0 TEMP2, 0 DECPT, 0 /SET 1 IF NUMBER CONTAINED . ESWIT, 0 /1 FOR E 0 FOR D NDIGIT, 0 /NUMBER OF DIGITS TO RIGHT OF . HCHAR, HCOUNT /HOLLERITH GETTER ROUTINE SNUM, 0 /POINTER TO ST ENTRY FOR STMT NUMBER IFSWIT, 0 /=1 IF INSIDE LOGICAL IF EXPON, 0 /HOLDS EXPONENT FOR CONVERSION TMPFIL, 0617;2224;2216;2415 /PASS1 OUTPUT FILE 0;0;0;0 /PASS2 OUTPUT FILE DOEND, 0 /SET 1 IF THIS STMT WAS A IF, /GOTO, RETURN, PAUSE, OR STOP THSNUM, 0 /CURRENT STATEMENT NUMBER DIMNUM, 0 /LINEARIZED SS FOR EQ DPRDCT, 0 /HOLDS DIMENSION PRODUCT EQTEMP, 0 /TEMP FOR EQUIVALENCE MQ, 0 /MQ FOR 12 BIT MULTIPLY MASTER, 0 /POINTER TO MASTER IN EQUIV GROUP MNUM, 0 /LINEARIZED SS FOR MASTER NSLAVE, 0 /NUMBER OF SLAVES IN GROUP PASS2O, 0 /START OF PASS 2 OVERLAY SECTION OUFILE, 0 /START OF PASS1 OUTPUT FILE DSERES, 0 /MAGIC NUMBER PROGNM, MAIN /POINTER TO PROG NAME ARGLST, 0 /POINTER TO ARG LIST FUNCTN, 0 /0=MAIN, 1=FUNCTION, -2=SUBROUTINE SETBIT, 0 /TEMPS FOR DECLARATION SCANNER BADBIT, 0 DOINDX, 0 /POINTER TO DO INDEX FOR DO LOOPS TLTEMP, 0 /TEMP FOR TYPE ROUTINE OWTEMP, 0 /TEMP FOR OUTWRD CNT72, -102 /72 COLUMN COUNTER DPUSED, 0 /=1 IF DOUBLE HARDWARE USED VERS, VERSON /VERSION NUMBER M211, -211 P211, 211 P240, 240 IXLNP5, LINE+5 /** IXLINE, LINE IXLINM, LINE-1 STMJMP, 0 /FOR DEFINE FILE / OPCODES AND EQUS MAXHOL=100 /MAXIMUM HOLLERITH LITERAL COMREG=4600 /INTER-PASS COMMUNICATION REGION STACKS=4700 /STACK AREA NAME1=6200 /NAME AND HOLLERITH BUFFER (WAS 6400)** LINE=6300 /LINE BUFFER (WAS 6500)** INBUF=6600 /INPUT BUFFER (FIELD 1) OUBUF=7200 /OUTPUT BUFFER (DITTO) INDEVH=7200 /INPUT DEVICE HANDLER (WAS 7400)** PAUSOP=22 DPUSH=PAUSOP+1 BINRD1=DPUSH+1 /OPCODE DEFINITIONS FMTRD1=BINRD1+1 RCLOSE=FMTRD1+1 DARD1=RCLOSE+1 BINWR1=DARD1+1 FMTWR1=BINWR1+1 WCLOSE=FMTWR1+1 DAWR1=WCLOSE+1 DEFFIL=DAWR1+1 ASFDEF=DEFFIL+1 ARGSOP=ASFDEF+1 EOLCOD=ARGSOP+1 ERRCOD=EOLCOD+1 RETOPR=ERRCOD+1 REWOPR=RETOPR+1 STOROP=REWOPR+1 ENDOPR=STOROP+1 DEFLBL=ENDOPR+1 DOFINI=DEFLBL+1 ARTHIF=DOFINI+1 LIFBGN=ARTHIF+1 DOBEGN=LIFBGN+1 ENDFOP=DOBEGN+1 STOPOP=ENDFOP+1 ASNOPR=STOPOP+1 BAKOPR=ASNOPR+1 FMTOPR=BAKOPR+1 GO2OPR=FMTOPR+1 CGO2OP=GO2OPR+1 AGO2OP=CGO2OP+1 IOLMNT=AGO2OP+1 DATELM=IOLMNT+1 DREPTC=DATELM+1 DATAST=DREPTC+1 ENDELM=DATAST+1 PRGSTK=ENDELM+1 DOSTOR=PRGSTK+1 / ASSEMBLE STATEMENT PAGE RDLOOP, CIF 10 /FOR OS/8 2 PG HANDLERS** JMS I [ICHAR /GET CHAR FROM INPUT FILE JMP ENDLIN /END LINE OR CR TAD M211 /CHECK FOR TAB** SNA TAD (240-211 /CONVERT TO BLANK TAD P211 /** DCA I CHRPTR /SAVE CHAR ISZ CNT72 /PAST COLUMN 72 ? SKP JMP SKPLIN /SKIP 73 TO 80 TAD CHRPTR CIA CLL TAD (LINE+670 SZL CLA /TEST FOR TOO MANY CONTINUATIONS JMP RDLOOP JMS I [ERMSG /LINE TOO LONG 1424 SKPCOM, TAD X16 /RESTORE CHRPTR DCA CHRPTR SKPLIN, CIF 10 /** JMS I [ICHAR /SKIP REST OF LINE JMP ENDLIN CLA JMP SKPLIN ENDLIN, TAD CHRPTR /SAVE CHAR POSITION DCA X16 TAD CHRPTR DCA X10 /SAVE POSITION FOR COMMENT CHECK TAD (-102 /SET COLUMN COUNT DCA CNT72 TAD M6 DCA NCHARS GET6, CIF 10 /** JMS I [ICHAR /GET FIRST 6 CHARS JMP SHORTL /IGNORE SHORT LINES TAD M211 /IS CHAR A TAB ? ** SZA CLA JMP NOTAB /NO TAD P240 /TREAT FIRST TAB AS SIX BLANKS DCA I CHRPTR ISZ NCHARS JMP .-3 TAD P240 /FAKE CONTINUATION CHECK DCA CHAR JMP CCHECK /GO TO COMMENT CHECK SHORTL, TAD X16 /RESET CHAR POINTER DCA CHRPTR /TO IGNORE SHORT LINES JMP ENDLIN NOTAB, TAD CHAR DCA I CHRPTR ISZ NCHARS JMP GET6 /LOOP CCHECK, TAD I X10 /IS IT A COMMENT ? TAD (-303 SNA CLA JMP SKPCOM /COMMENT, SKIP REST NOCMNT, TAD CHAR /WAS SIXTH CHAR A BLANK ? TAD MMM240 SNA CLA JMP GOTLIN /YES, NO MORE CONTINUATIONS CCARD, TAD X16 /IGNORE THESE SIX CHARACTERS DCA CHRPTR JMP RDLOOP /CONTINUE WITH THIS LINE GOTLIN, TAD CHRPTR /COMPUTE -NCHARS-1 CIA TAD (LINE+4 DCA NCHARS TAD [LINE-1 /RESET CHAR POINTER DCA CHRPTR JMS I [CKCTLC /CHECK FOR CONTROL C LINE1, DCA THSNUM /ZERO CURRENT STMT NUMBER CLL CML RAR /SET LABEL DEFINE BIT JMS I [STMNUM /GO LOOK FOR LABEL JMP COMPIL /NONE THERE TAD SNUM /SAVE STATEMENT NUMBER DCA THSNUM TAD (DEFLBL /OUTPUT DEFINITION FOR THIS LABEL JMS I [OUTWRD TAD SNUM JMS I [OUTWRD /FOLLOWED BY THE LABEL ADDRESS COMPIL, JMS I [SAVECP ISZ LINENO /2.01/ PUT LINE NUMBER TAD LINENO /2.01/ INTO MQ 7421 /2.01/ CLA IAC DCA NOCODE /SET NOCODE SWITCH JMS I [ERMSG /SET UP DEFAULT ERROR MESSAGE 1513 JMS I [LEXPR /IS IT ARITHMETIC ? JMP NOTAR /NO JMS I [GETC /LOOK FOR = JMP NOTAR /NOT ARITHMETIC TAD MMM275 /= SNA CLA JMS I [EXPR /SCAN LEFT PART JMP NOTAR JMS I [ERMSG /SET MESSAGE TO ILLEGAL OPERATOR 1720 ISZ NCHARS /SHOULD BE NOTHING LEFT JMP NOTAR /IF THERE IS, ITS NOT ARITHMETIC ITSAR, JMS I [RESTCP /RESTORE TO START OF LINE DCA NOCODE /ALLON CODE JMS I [LEXPR /GET LEFT SIDE M6, -6 /V3C MUST BE HERE JMS I [GETC /SKIP = MMM240, -240 /SHOULD NEVER GET HERE CLA JMS I [EXPR /GET RIGHT SIDE MMM275, -275 /SHOULD NEVER GET HERE TAD (STOROP /OUTPUT STORE JMS I [OUTWRD JMP I [NEXTST /DO NEXT LINE NOTAR, JMS I [RESTCP /RESTART LINE DCA NOCODE JMS I [SAVECP /RESAVE CHAR POSITION TAD (CMDLST-1 DCA X10 JMP I (CMDLUP /GO SEARCH FOR KEYWORD / KEYWORD SEARCH PAGE CMDLUP, CDF 10 /TABLE IN FIELD ONE TAD I X10 /GET NEXT 2 CHARS OF KEYWORD SZA JMP CMDLP2 /NOT DONE YET CLL CMA RAL /REMOVE CHAR POS FROM STACK TAD STACK DCA STACK TAD I X10 /GET ROUTINE ADDRESS CDF DCA STMJMP JMP I STMJMP /JUMP TO THE ROUTINE CMDLP2, DCA TEMP /SAVE THE TWO CHARS CDF JMS I [GET2C /GET TWO CHARS FROM THE INPUT JMP .+4 /NOT ENOUGH CHARS, CAN'T BE THIS ONE TAD TEMP /COMPARE SNA CLA JMP CMDLUP /MATCHES, KEEP GOING JMS I [RESTCP /RESTORE CHAR POS ISZ STACK ISZ STACK /AND SAVE IT AGAIN CDF 10 TAD I X10 /FIND END OF THIS COMMAND SZA CLA JMP .-2 ISZ X10 /SKIP ROUTINE ADDRESS TAD I X10 /IS THE LIST EXHAUSTED ? SZA JMP CMDLP2 /NO, GO AGAIN BADCMD, JMS I [ERMSG /TREAT AS BAD ARITHMETIC STMT ERCODE, 0 / END OF STMT PROC NEXTLN, NEXTST, DOENDR, TAD STKLVL /RESET STACK POINTER DCA STACK JMS I [POP /LOOK FOR DO END CIA TAD THSNUM /DOES THIS LINE END A DO LOOP ? SZA CLA JMP NODOND /NO, REPLACE STACK AND COMPILE STMT TAD (DOFINI JMS I [OUTWRD /OUTPUT DO END COMMAND JMS I [POP /GET INDEX VARIABLE JMS I [OUTWRD TAD STACK /RESET STACK BASE LEVEL DCA STKLVL TAD DOEND /WAS THIS A LEGAL ENDING STMT ? SZA CLA JMS I [ERMSG 0504 /DO END ERROR DCA DOEND /KILL SWITCH JMP DOENDR NODOND, ISZ STACK /REPLACE STACK ENTRY DCA DOEND /KILL SWITCH TAD (EOLCOD /OUTPUT EOL CODE JMS I [OUTWRD DCA ERCODE /RESET ERROR CODE DCA IFSWIT /KILL IF SWITCH TAD (-6 /MOVE FIRST 6 CHARS DCA NCHARS TAD [LINE-1 /INTO START OF BUFFER DCA CHRPTR TAD I X16 DCA I CHRPTR ISZ NCHARS JMP .-3 JMP I (RDLOOP / GOTO'S GOTO, ISZ DOEND /DO END ILLEGAL JMS I [STMNUM /IS IT A SIMPLE GOTO ? JMP CMPGO2 /NO, SEE IF ITS A COMPUTED ONE TAD (GO2OPR /OUTPUT GOTO OPERATOR JMS I [OUTWRD TAD SNUM /FOLLOWED BY STMT NUMBER JMS I [OUTWRD JMP I [NEXTST CMPGO2, JMS I [GETC /LOOK FOR ( JMP BADGO2 /BAD GOTO TAD (-250 SZA CLA JMP ASNGO2 /NOT ( , MAYBE ITS AN ASSIGNED GOTO TAD STACK /SAVE STACK POSITION DCA X12 DCA TEMP /ZERO BRANCH COUNTER GO2LUP, JMS I [STMNUM /GET NEXT STMT NUMBER JMP BADGO2 /MUST BE THERE TAD SNUM JMS I [PUSH /SAVE IT TEMPORARILY ISZ TEMP /BUMP BRANCH COUNT JMS I [COMARP /LOOK FOR COMMA OR RIGHT PAREN JMP BADGO2 /NEITHER JMP GO2LUP /COMMA, GO GET NEXT LABEL JMS I [GETC /SKIP NEXT CHAR (ITS A COMMA) JMP BADGO2 CLA TAD TEMP /SAVE COUNT JMS I [PUSH /ON STACK JMS I [EXPR /COMPILE INDEX EXPR JMP I [NEXTST TAD (CGO2OP /OUTPUT COMPUTED GOTO OPERATOR JMS I [OUTWRD JMS I [POP /GET COUNT CIA DCA TEMP /SAVE COMPLEMENT TAD TEMP CIA JMS I [OUTWRD /OUTPUT COUNT TAD X12 /RESTORE STACK POINTER DCA STACK TAD I X12 /MOVE STMT NUMBERS TO OUTPUT JMS I [OUTWRD ISZ TEMP JMP .-3 JMP I [NEXTST ASNGO2, JMS I [BACK1 /PUT BACK NON ( JMS I [LEXPR /GET ASSIGN VAR JMP BADGO2 TAD (AGO2OP /OUTPUT GOTO OPERATOR JMS I [OUTWRD JMP I [NEXTST BADGO2, JMS I [ERMSG 0724 JMP I [NEXTST / I/O STATEMENTS PAGE RDWR, 0 /SUBR FOR IO STATEMENTS JMS I [CHECKC /LOOK FOR ( M250, -250 JMP BADRD JMS I [EXPR /COMPILE UNIT JMP I [BADCMD JMS I [COMARP JMP DAQUOT /LOOK FOR ' (DIRECT ACCESS I/O) JMP RDFMT /, TAD (BINRD1 /FORMATLESS READ/WRITE IOSTRT, TAD I RDWR /ADD ADJUSTOR JMS I [OUTWRD /OUTPUT BINARY READ IOLIST, JMS I [PUSH /MARK STACK JMS I [GETC /IS IT AN IMPLIED DO ? JMP ENDIOL /NO, END OF LIST TAD M250 SZA CLA JMP TRYIOE /NO, LOOK FOR IO ELEMENT JMS I [SAVECP /SAVE CHAR POS AT START OF IDO DCA IDOPAR /ZERO PAREN COUNTER FINDND, JMS I [GETNAM /GET A NAME IF THERE IS ONE XPURGE, PRGSTK /DON'T WORRY ITS A NOP JMS I [GETC /GET A CHAR JMP ENDIOL TAD M251 /IS IT A ) ? SNA JMP RPIOL /YES IAC /IS IT ( ? SNA JMP LPIOL /YES TAD (250-275 /IS IT = ? SZA CLA JMP FINDND /NONE OF THESE TAD IDOPAR /IS PAREN COUNT 0 ? SZA CLA JMP FINDND /NO, ITS FROM AN INNER LOOP JMS I [LOOKUP /THIS ELEMENT IS THE DO INDEX DCA DOINDX JMS I (DOSTUF /COMPILE THE LOOP JMP BADIOL /ERROR IN DO PARMS JMS I [CHECKC /MUST HAVE ) -251 JMP BADIOL TAD CHRPTR /SAVE CHAR POSITION DCA TEMP TAD NCHARS DCA TEMP2 JMS I [RESTCP /RESTORE TO START OF IMPLIED LOOP TAD TEMP2 /NOW SAVE POS AFTER LOOP JMS I [PUSH TAD TEMP JMS I [PUSH TAD DOINDX /AND DO INDEX JMP IOLIST LPIOL, ISZ IDOPAR /( INCREASES COUNT JMP FINDND RPIOL, CMA /) DECREASES COUNT TAD IDOPAR SMA JMP FINDND-1 CLA BADIOL, BADRD, JMS I [ERMSG /BAD IO STMT 2227 JMP I [NEXTST TRYIOE, JMS I [BACK1 /PUT BACK NON ( JMS I [LEXPR /GET IOLIST ELEMENT JMP BADRD /NOT THERE, ERROR JMS I [GETC /LOOK FOR A COMMA JMP .+4 /EOL TAD (-254 SZA JMP NOTIOL /NOT AN ELEMENT TAD (IOLMNT /OUTPUT OPCODE JMS I [OUTWRD JMP IOLIST+1 NOTIOL, TAD (254-275 /IS IT AN = (END OF IDO) SZA CLA JMP BADIOL /NO, BAD JMS I [POP /GET STUFF FROM THE STACK SNA JMP BADIOL /ZERO IS BAD DCA DOINDX /THIS IS THE INDEX JMS I [RESTCP /GET THE CHAR POSITION TAD XPURGE /OUTPUT PURGE OPERATOR JMS I [OUTWRD /BECAUSE AN EXTRA IS ON THE STK TAD (DOFINI /END LOOP JMS I [OUTWRD TAD DOINDX JMS I [OUTWRD JMS I [GETC /END OF LIST ? JMP ENDIOL TAD (-254 SZA CLA JMP BADIOL /MUST BE A COMMA JMP IOLIST+1 IDOPAR, 0 ENDIOL, JMS I [POP /IS THE MARK THERE ? SZA CLA JMP BADRD /NO, ERROR TAD I RDWR TAD (RCLOSE /END OF IO OPERATION JMS I [OUTWRD JMP I [NEXTST RDFMT, JMS I [STMNUM /LOOK FOR FMT LINE NUMBER JMP RTFMT JMS I [OUTWRD /OUTPUT PUSH COMMAND TAD SNUM /OUTPUT STMT NUMBER OF FORMAT JMS I [OUTWRD RDLIST, TAD (FMTRD1 /START OF FORMATTED READ TAD I RDWR /ADD ADJUSTOR JMS I [OUTWRD JMS I [CHECKC /LOOK FOR ) M251, -251 JMP BADRD JMP IOLIST /GO GET IO LIST RTFMT, JMS I [LEXPR /GET R.T. FORMAT JMP BADRD JMP RDLIST /GET LIST /DIRECT ACCESS I/O PAGE DAQUOT, JMS I [BACK1 JMS I [CHECKC /LOOK FOR ' -247 JMP BADRD /SYNTAX IS NO GOOD JMS I [EXPR /GET RECORD NUMBER EXPR JMP BADRD JMS I [CHECKC /LOOK FOR ) -251 JMP BADRD TAD (DARD1 /DIRECT ACCESS OPEN JMP IOSTRT FIND, JMP I [NEXTST /COOL ISN'T IT ? DFINFL, JMS I [EXPR /COMPILE UNIT JMP BADDEF /BAD DEFINE STMT DCA STMJMP /PERMIT VARIABLE FOR LOG UNIT JMS I [CHECKC /( -250 JMP BADDEF JMS I [EXPR /NUMBER OF RECORDS JMP BADDEF JMS I [CHECKC /, -254 JMP BADDEF JMS I [EXPR /RECORD SIZE JMP BADDEF JMS I [CHECKC /, -254 JMP BADDEF JMS I [CHECKC /U -325 JMP BADDEF JMS I [CHECKC /, MCOMA, -254 JMP BADDEF JMS I [GETNAM /GET INDEX VARIABLE JMP BADDEF JMS I [OUTWRD JMS I [LOOKUP JMS I [OUTWRD /OUTPUT INDEX VAR TAD (DEFFIL /OUTPUT DEFINE OPERATOR JMS I [OUTWRD JMS I [CHECKC /) -251 JMP BADDEF JMS I [GETC /ANOTHER DEFINE ? JMP I [NEXTST TAD MCOMA /, ? SNA CLA JMP DFINFL /YES, ANOTHER FILE BADDEF, JMS I [ERMSG /BAD DEFINE FILE STMT 0406 JMP I [NEXTST RESTCP, 0 /RESTORE CHAR POSITION FROM STACK JMS I [POP DCA CHRPTR JMS I [POP DCA NCHARS JMP I RESTCP INTEGE, JMS I [CHECKC /INTEGER STMT -322 JMP I [BADCMD JMS I [TYPLST 0101 0100 NOP JMP I [NEXTST PAUZE, JMS I [CHECKC /LOOK FOR E -305 JMP I [BADCMD JMS I [GETC /ANY EXPR ? JMP NOARGP /MAKE IT PAUSE 1 JMS I [BACK1 /PUT IT BACK JMS I [EXPR /GET PAUSE NUMBER XPAUZ, PAUSOP OPAUZ, TAD XPAUZ /OUTPUT PAUSE OPERATOR JMS I [OUTWRD JMP I [NEXTST NOARGP, JMS I [OUTWRD /PUSH 1.0 TAD [ONE JMS I [OUTWRD JMP OPAUZ /GO PUT OPERATOR READ, JMS I (RDWR /COMPILE READ STMT 0 WRITE, JMS I [CHECKC /LOOK FOR E -305 JMP I [BADCMD JMS I (RDWR /COMPILE WRITE BINWR1-BINRD1 CKCTLC, 6403 /CHECK FOR CONTROL C TAD (7600 KRS TAD (-7603 /^C SNA CLA KSF JMP I CKCTLC JMP I (7600 XOCTAL, DCA WORD1 /** DCA WORD2 DCA WORD3 /STATEMENT NUM LEFT THERE** DCA WORD5 DCA WORD6 XCTAL1, DCA WORD4 JMS I [DIGIT /GET NEXT DIGIT JMP ENDOXT /NO DIGITS LEFT AND [7 /THROW AWAY SOME BITS DCA TEMP JMS I (AL1 /MOVE WORD LEFT THREE JMS I (AL1 JMS I (AL1 TAD WORD4 /ADD DIGIT TO WORD4 TAD TEMP JMP XCTAL1 /LOOP ENDOXT, TAD WORD2 /PUT WORDS INTO THE LEFT PLACE DCA WORD1 TAD WORD3 DCA WORD2 TAD WORD4 DCA WORD3 JMP DATAFP /GO STUFF IT AWAY / DIMENSION, COMMON, REAL PAGE DIMENS, JMS I [IFCHEK JMS I [CHECKC /CHECK FOR "N" -316 JMP I [BADCMD /NO GOOD JMS I [TYPLST /PROCESS LIST 0000 /DIMENSION IS THE SIMPLEST CASE 0000 NOP /ERROR RETURN JMP I [NEXTST REAL, JMS I [IFCHEK /CHECK FOR INSIDE IF JMS I [TYPLST /PROCESS LIST 0102 /TYPE-REAL 0100 NOP JMP I [NEXTST COMPLE, JMS I [CHECKC /CHECK FOR "X" -330 JMP I [BADCMD JMS I [IFCHEK JMS I [TYPLST /PROCESS COMPLEX LIST 0103 0100 NOP CLA IAC /SET DP SWITCH DCA DPUSED JMP I [NEXTST COMMON, JMS I [IFCHEK /BAD INSIDE LOGICAL IF JMS I [GETC /CHECK FOR SLASH JMP I [BADCMD TAD M257 SZA CLA JMP BLANKC /MUST BE BLANK COMMON JMS I [GETNAM /GET NAME OF COMMON JMP DBLSLS /MIGHT BE // JMS I [CHECKC /LOOK FOR / M257, -257 JMP BADCOM JMS I [LOOKUP /LOOKUP COMMON NAME IAC DCA COMNAM /SAVE ADDR OF TYPE WORD CDF 10 TAD I COMNAM /LOOK AT TYPE SZA TAD (-111 /MUST BE COMMON OR UNDEF. SZA CLA JMP BADCOM TAD (111 /SET CORRECT BITS DCA I COMNAM CDF DOCOMN, JMS I [TYPLST /HANDLE LIST 4000 5460 JMP I [NEXTST TAD X12 DCA STACK /RESET STACK CDF 10 ISZ COMNAM /POINTER TO COMMON INFO DCA I NEXT /ZERO NEXT PTR WORD TAD I COMNAM /LOOK FOR END OF LIST SNA JMP EOCL /THIS IS IT DCA COMNAM /PROCEED DOWN LIST JMP .-4 EOCL, TAD NEXT /HOOK IN NEXT PART DCA I COMNAM TAD NUMELM DCA I NEXT /NUMBER IN THIS PART TAD NUMELM CIA DCA NUMELM CDF TAD I X12 /MOVE VARIABLE PTRS CDF 10 DCA I NEXT ISZ NUMELM JMP .-5 CDF JMS I [GETC /ANOTHER BLOCK ? JMP I [NEXTST /NO JMP COMMON+3 /MAYBE DBLSLS, JMS I [CHECKC /LOOK FOR SECOND SLASH -257 JMP BADCOM SKP BLANKC, JMS I [BACK1 /PUT BACK NON SLASH TAD (BLNKCN /USE BLANK COMMON DCA COMNAM JMP DOCOMN BADCOM, JMS I [ERMSG /ERROR IN COMMON STMT 0317 JMP I [NEXTST COMNAM, 0 / EXTERNAL, FORMAT, BACKSPACE EXTERN, JMS I [TYPLST /PROCESS LIST 1000 6660 NOP JMP I [NEXTST FORMAT, TAD (FMTOPR /OUTPUT FORMAT OPERATOR JMS I [OUTWRD TAD NCHARS /GET NUMBER OF WORDS CIA CLL RAR /NWORDS=(NCHARS+1)/2 FMTLUP, JMS I [OUTWRD /OUTPUT IT JMS I [GETCWB /GET THE CHARS JMP I [NEXTST /NO MORE AND [77 CLL RTL /SHIFT LEFT 6 RTL RTL DCA TEMP JMS I [GETCWB /GET OTHER HALF NOP /IGNORE END OF LINE AND [77 TAD TEMP /PUT THEM TOGETHER JMP FMTLUP /LOOP /NOTE : THE ENTIRE FORMAT INCLUDING PARENTHESIS () / IS PASSED TO THE CODE BACKSP, JMS I [CHECKC /CHECK FOR "E" -305 JMP I [BADCMD JMS I [EXPR /COMPILE UNIT EXPR JMP I [BADCMD TAD (BAKOPR /OUTPUT BACKSPACE OPERATOR JMS I [OUTWRD JMP I [NEXTST / OUTPUT ROUTINE PAGE OUPTR, OUBUF OCOUNT, -401 OUTWRD, 0 /OUTPUT ROUTINE DCA OWTEMP /SAVE WORD TAD NOCODE SZA CLA JMP I OUTWRD /COOL IT IF NOCODE ISZ OCOUNT /TEST FOR BUFFER FULL JMP NOWRIT /STILL SOME ROOM JMS OUDUMP /DUMP THE BUFFER TAD OUBLOK-1 /RESET BUFFER PARAMETERS DCA OUPTR TAD (-400 DCA OCOUNT NOWRIT, TAD OWTEMP /PUT WORD CDF 10 DCA I OUPTR /INTO BUFFER CDF ISZ OUPTR /MOVE POINTER JMP I OUTWRD OULEN, 0 /NUMBER OF BLOCKS LEFT IN HOLE OUDUMP, 0 /DUMP OUT BUFFER TAD OULEN /ANY ROOM LEFT ? SNA JMP OUERR IAC DCA OULEN JMS I (7607 /CALL SYSTEM HANDLER 4210 OUBUF OUBLOK, 0 JMP OUERR ISZ OUBLOK /INCREMENT BLOCK NUMBER ISZ FILSIZ /ALSO SIZE OF FILE JMP I OUDUMP OUERR, JMS I [MESSAG /ERROR IN WRITING OR OPENING FILE 317 306 / END PASS ONE XEND, JMS I [CHECKC /LOOK FOR "D" -304 JMP I [BADCMD JMS I [GETC /END MUST BE ALL JMP ENDX L7700, SMA CLA /NEVER SKIPS JMP I [BADCMD ENDX, CDF 0 TAD (ENDOPR /OUTPUT END OF FILE JMS I [OUTWRD JMS OUDUMP /DUMP BUFFER CIF 10 JMS I L7700 /LOCK MONITOR IN 10 CIF 10 CLA IAC JMS I L200 /CLOSE TEMP FILE 4 TMPFIL FILSIZ, 0 JMP OUERR CIF 10 CLA IAC JMS I L200 /OPEN PASS 2 OUTPUT FILE L3, 3 OBLK, TMPFIL+4 /STARTING BLOCK 0 /SIZE JMP OUERR /ERROR TAD (COMREG-1 /SAVE IMPORTANT STUFF DCA X10 TAD NEXT /ADDR OF FREE SPACE DCA I X10 TAD STKLVL /STACK LEVEL DCA I X10 TAD OUFILE /START OF PASS1 OUTPUT FILE DCA I X10 TAD FILSIZ /ALSO THE SIZE DCA I X10 TAD PASS2O /START OF PASS2 OVERLAY DCA I X10 TAD OBLK /START OF PASS2 OUTPUT FILE DCA I X10 TAD OBLK+1 /AND MAX SIZE DCA I X10 TAD PROGNM /POINTER TO PROG NAME DCA I X10 TAD ARGLST /AND ARG LIST DCA I X10 TAD FUNCTN /AND PROG SWITCH DCA I X10 TAD DPUSED /STORE THE DP SWITCH DCA I X10 TAD VERS /AND THE VERSION NUMBER DCA I X10 CIF 10 JMS I L200 /CHAIN TO PASS TWO 6 PASS2B, 0 /FILLED BY ONCE ONLY CODE FOR PASS 1 RETURN, TAD (RETOPR /OUTPUT RETURN CODE JMS I [OUTWRD ISZ DOEND /DO END ILLEGAL HERE JMP I [NEXTST COMARP, 0 /LOOK FOR COMMA OR RIGHT PAREN JMS I [GETC JMP I COMARP TAD [-254 /COMMA ? SNA JMP .+5 TAD L3 /RIGHT PAREN ? SZA CLA JMP I COMARP ISZ COMARP ISZ COMARP /COMMA INCR ONCE JMP I COMARP LOGICA, JMS I [CHECKC /LOOK FOR L -314 JMP I [BADCMD /NO GOOD JMS I [TYPLST /PROCESS LIST 0105 0100 L200, 0200 /NOP JMP I [NEXTST / EQUIVALENCE (UGH!) PAGE EQUIV, JMS I [IFCHEK /BAD WITH IF JMS I [CHECKC /LOOK FOR "E" -305 JMP I [BADCMD EQVLUP, JMS I [CHECKC /LOOK FOR ( -250 JMP BADEQU TAD STACK /SAVE STACK POS DCA X17 DCA NSLAVE /NUMBER OF SLAVES = 0 JMS I [GETSS /GET THE MASTER JMP BADEQU SVMSTR, CDF 10 /1.03/ CHECK FOR ALREADY EQUIVALENCED TAD I TEMP2 /1.03/ CDF /1.03/ AND (200 /1.03/ (AS A SLAVE) SZA CLA /1.03/ JMP DOFUNY /3.01/BACK UP TO ITS MASTER TAD TEMP2 /SAVE THE MASTER TYPE ADDRESS DCA MASTER DCA SFUDGE /3.01/CLEAR OFFSET FUDGE TAD DIMNUM /SAVE THE MASTER SUBSCRIPT DCA MNUM GETSLV, JMS I [COMARP /LOOK FOR , OR ) JMP BADEQU JMP DOSLAV /, TAD NSLAVE /COMPLEMENT THE NUMBER OF SLAVES SNA JMP ENDGRP /NO SLAVES CIA DCA NSLAVE TAD X17 /RESTACK THE STORE DCA STACK EQLOOP, TAD I X17 /GET NEXT SUBSCRIPT NUMBER DCA TEMP TAD I X17 /AND NEXT TYPE WORD ADDRESS DCA TEMP2 CDF 10 TAD I TEMP2 /LOOK AT TYPE WORD TAD (200 /SET EQUIVALENCE BIT DCA I TEMP2 ISZ TEMP2 /MOVE TO EQUIVALENCE/DIMENSION PTR TAD I TEMP2 /PROPAGATE DIMENSION POINTER DCA I NEXT /TO EQUIVALENCE INFO BLOCK TAD NEXT /NOW STORE EQ INFO BLK ADDRESS DCA I TEMP2 /INTO EQ-DIM POINTER WORD CLA CMA TAD MASTER /STORE S.T. ADDR OF MASTER DCA I NEXT /INTO THE EQUIVALENCE BLOCK TAD MNUM /OUTPUT NUMBERS DCA I NEXT TAD TEMP DCA I NEXT CDF ISZ NSLAVE /ANY MORE SLAVES ? JMP EQLOOP /YES, EQUIVALENCE NOT YET ATTAINED ENDGRP, JMS I [GETC /FINI, ALL VARIABLES ARE CREATED JMP I [NEXTST /EQUIVALENCED TAD (-254 /IS NEXT CHAR A COMMA ? SNA CLA JMP EQVLUP /IF YES, DO NEXT GROUP BADEQU, JMS I [ERMSG /SYNTAX ERROR IN EQUIVALENCE 2123 JMP I [NEXTST EQUCOM, JMS I [ERMSG /MULTIPLE LEVELS OF EQUIVALENCE OR 2114 /MORE THAN ONE COMMON VARIABLE JMP I [NEXTST DOSLAV, ISZ NSLAVE /ANOTHER SLAVE VARIABLE JMS I [GETSS /GET THE GOODS JMP BADEQU CDF 10 TAD I TEMP2 /LOOK AT THE TYPE SMA CLA JMP SVSLAV /IT ISN'T IN COMMON TAD I MASTER /LOOK AT THE MASTERS TYPE SPA CLA JMP EQUCOM /MASTER IS IN COMMON TOO .. BAD CDF TAD MNUM /SAVE THE MAGIC NUMBER JMS I [PUSH TAD MASTER JMS I [PUSH /AND THE S.T. ADDRESS JMP SVMSTR /NOW GO MAKE THE NEW ONE MASTER SVSLAV, TAD I TEMP2 /1.03/ PREVIOUSLY EQUIVALENCED ? AND (200 /1.03/ SZA CLA /1.03/ JMP EQUCOM /1.03/ YES, ERROR TAD DIMNUM /SAVE THE NEW SLAVE TAD SFUDGE /3.01/ADD OFFSET FUDGE CDF JMS I [PUSH TAD TEMP2 JMS I [PUSH JMP GETSLV /AND GO GET THE NEXT SLAVE SFUDGE, 0 /ROUTINE TO HANDLE TRIVIAL CASES OF EQUIVALENCE CHAINING /THIS WHOLE PAGE IS 3.01 DOFUNY, CLA IAC TAD TEMP2 DCA MASTER /GET POINTER TO EQUIVALENCE BLOCK CDF 10 TAD I MASTER DCA X12 CLA IAC TAD I X12 /GET ADDRESS OF "REAL" MASTER'S DCA MASTER /TYPE WORD TAD I X12 TAD DIMNUM DCA MNUM /OFFSETS ARE ADDITIVE TAD I X12 DCA SFUDGE /SAVE OTHER HALF OF OFFSET TO ADD CDF /TO SLAVES JMP GETSLV / (PRAY) PAGE / EQUIVALENCE (UGH!) O1420, 1420 /1.03/ MUST BE FIRST ON PAGE GETSS, 0 /GET THE LINEARIZED SUBSCRIPT DCA DIMNUM JMS I [GETNAM /GET THE VARIABLE JMP I GETSS JMS I [LOOKUP IAC /ADDRESS OF TYPE WORD DCA TEMP2 CDF 10 TAD I TEMP2 CDF O200, AND O1420 /1.03/ EXT, STMTFUN, SUBARG ? SZA CLA JMP I GETSS TAD STACK DCA X12 /SAVE STACK POSITION DCA TEMP /ZERO NUMBER OF DIMENSIONS TAD TEMP2 IAC DCA EQTEMP /ADDRESS OF EQ-DIM POINTER JMS I [GETC JMP I GETSS TAD (-250 /LOOK FOR ( SNA CLA JMP DIMGET-1 /OK JMS I [BACK1 JMP RGETSS DCA DIMNUM /DATA CALLS GETSS WITH AC = 7777 DIMGET, JMS I (SMLNUM /GET A SUBSCRIPT CLA CMA TAD EXPON /SS-1 JMS I [PUSH /SAVE SS ISZ TEMP /BUMP COUNT OF SS JMS I [COMARP /LOOK FOR , OR ) JMP I GETSS JMP DIMGET /, CLA IAC /) DCA DPRDCT /SET DIMENSION PRODUCT TO 1 TAD X12 /RESTORE STACK POSITION DCA STACK TAD TEMP /COMPLEMENT NUMBER OF SS CIA DCA TEMP CDF 10 CLL CML RTR /2000 AND I TEMP2 /HAS VARIABLE BEEN DIMENSIONED ? SNA CLA JMP I GETSS /NO, THATS BAD TAD I EQTEMP /GET ADDRESS OF DIMENSION BLOCK DCA EQTEMP TAD I EQTEMP /IS NUMBER OF DIMENSIONS TAD TEMP /EQUAL TO NUMBER OF SUBSCRIPTS ? SZA CLA JMP TRY1SS /1.03/ SEE IF ITS ONE SUBSCRIPT CLA CLL IAC /+1 V3C // // TAD I EQTEMP /+ NUMBER OF DIMENSIONS // TAD EQTEMP /+ ADDRESS OF COUNT WORD // TAD PAT11 //DSN SEQ. 2 M JMP PAT10 // // DCA EQTEMP /GIVES ADDRESS OF NEXT TO LAST DIMENSION LINEAR, CDF TAD I X12 /GET NEXT SS - 1 DCA MQ TAD DPRDCT /MULTIPLY BY THE DIMENSION PRODUCT JMS MUL12 /WHERE D.P. = 1,D1,D1D2,D1D2D3,... TAD DIMNUM /ACCUMULATE THE SUM DCA DIMNUM CDF 10 TAD I EQTEMP /ADDR OF LITERAL IAC DCA X11 /WORKING POINTER TO VALUE TAD I X11 /GET DIMENSION INTO FAC DCA WORD1 TAD I X11 DCA WORD2 TAD I X11 DCA WORD3 CDF JMS I [FIXNUM /GO FIX IT DCA MQ TAD DPRDCT /OF THE D.P. SERIES (ABOVE) JMS MUL12 DCA DPRDCT CLA IAC /V3C BUMP POSITION POINTER TAD EQTEMP DCA EQTEMP ISZ TEMP /ANY MORE SS ? JMP LINEAR /YES RGETSS, ISZ GETSS JMP I GETSS TRY1SS, CLA IAC /1.03/ TAD TEMP /1.03/ ONLY ONE SS ? SZA CLA /1.03/ JMP I GETSS /1.03/ MORE, THATS NO GOOD CDF /1.03/ TAD I X12 /1.03/ GET THE SUBSCRIPT DCA DIMNUM /1.03/ AND RETURN IT JMP RGETSS /1.03/ MUL12, 0 /12 BIT UNSIGNED MULTIPLY DCA OP2 /SAVE OPERAND TAD (-15 /SET SHIFT COUNT DCA SC JMP STMUL M12LUP, TAD AC SNL JMP .+3 CLL TAD OP2 RAR STMUL, DCA AC TAD MQ RAR DCA MQ ISZ SC JMP M12LUP TAD MQ /RETURN VALUE JMP I MUL12 AC=OP3 SC=OP4 // // DSN seq. 2 M // PAT10, ISZ EQTEMP // NOP // TAD EQTEMP // JMP LINEAR-1 // PAT11, 2 // // / IF STATEMENTS PAGE IF, JMS I [EXPR /COMPILE CONDITION EXPRESSION JMP I [BADCMD JMS I [STMNUM /IS IT ARITHMETIC IF ? JMP LOGIF TAD (ARTHIF /START IF COMMAND JMS I [OUTWRD CLL CMA RTL DCA TEMP ISZ DOEND /DO END ILLEGAL HERE JMP IFLABL /GET IF LABELS IFLOOP, JMS I [CHECKC /LOOK FOR , -254 JMP I [NEXTST JMS I [STMNUM /GET NEXT STMT NUMBER JMP BADIF IFLABL, TAD SNUM /OUTPUT LABEL JMS I [OUTWRD ISZ TEMP JMP IFLOOP JMP I [NEXTST LOGIF, JMS IFCHEK /IF()IF()... NOT LEGAL ISZ IFSWIT /CLEAR IF SWITCH TAD (LIFBGN /START LOGICAL IF JMS I [OUTWRD JMP I (COMPIL /COMPILE THE STATEMENT DOSWT, IFCHEK, 0 /CHECK IF SWITCH TAD IFSWIT SNA CLA JMP I IFCHEK BADIF, JMS I [ERMSG 1111 JMP I [NEXTST / CALL STMT CALL, JMS I [SAVECP /SAVE CHAR POS JMS I [GETNAM /GET SUBROUTINE NAME JMP BADCAL /NO NAME HERE IS BAD JMS I [LOOKUP /GET ADDRESS OF TYPE WORD IAC DCA TEMP CDF 10 TAD I TEMP /LOOK AT TYPE AND (6640 /ANYTHING BUT EXT OR ARG ? SZA CLA JMP BADCAL /YES, BAD TAD I TEMP /SET EXT BIT AND (137 /LEAVE TYPE AND ARG BITS TAD (1000 DCA I TEMP CDF JMS I [RESTCP /RESTORE CHAR POS CLA IAC /SIGNAL THAT THIS IS A CALL JMS I [LEXPR /COMPILE IT XSTORE, DOSTOR /DON'T WORRY VIRGINIA, ITS A NOP TAD OWTEMP /WHAT WAS THE LAST THING OUT ? CLL TAD (-63 /IF LESS THAN 63 SNL CLA JMP I [NEXTST /IT WAS AN ARG COUNT TAD [ARGSOP /OTHERWISE IT WAS AN ARG LESS CALL JMS I [OUTWRD /SO TELL PASS 2 ABOUT IT JMS I [OUTWRD JMP I [NEXTST BADCAL, JMS I [ERMSG 2316 JMP I [NEXTST / DO DAH, DO DAH DO, JMS I [IFCHEK /IF(...)DO IS ILLEGAL JMS I [STMNUM /LOOK FOR ENDING STMT NUMBER JMP I [BADCMD JMS I [GETNAM /LOOKUP INDEX VARIABLE JMP I [BADCMD JMS I [LOOKUP DCA DOINDX JMS I [CHECKC /LOOK FOR = -275 JMP I [BADCMD ISZ DOEND /CAN'T END DO LOOP ON A DO JMS DOSTUF /GET DO PARAMETERS JMP BADDO TAD DOINDX /PUSH DO INDEX JMS I [PUSH TAD SNUM /PUSH ENDING STMT NUMBER JMS I [PUSH TAD STACK DCA STKLVL /SAVE NEW STACK BASE JMP I [NEXTST DOSTUF, 0 /SUBR FOR DO LOOP STUFF JMS I [OUTWRD /OUTPUT DO INDEX TAD DOINDX JMS I [OUTWRD JMS I [EXPR /GET EXPR FOR INITIAL VALUE JMP I DOSTUF TAD XSTORE /YES JMS I [OUTWRD JMS I [CHECKC /LOOK FOR COMMA N254, -254 JMP I DOSTUF JMS I [EXPR /GET EXPR FOR FINAL VALUE JMP I DOSTUF JMS I [GETC /LOOK FOR A COMMA JMP STEP1 /USE STEP OF 1 TAD N254 SZA CLA JMP STEP1-1 JMS I [EXPR /GET EXPR FOR STEP JMP I DOSTUF DORET, ISZ DOSTUF TAD (DOBEGN /DO BEGIN OPERATOR JMS I [OUTWRD JMP I DOSTUF JMS I [BACK1 /PUT BACK NON , (OFFICER BELOW LT.) STEP1, JMS I [OUTWRD /OUTPUT A PUSH 1.0 TAD (ONE JMS I [OUTWRD JMP DORET /FINISH DO STUFF BADDO, JMS I [ERMSG /BAD DO COMMAND 0417 JMP I [NEXTST BDERR, JMS I [ERMSG /ILLEGAL IN BLOCK DATA 0223 JMP I [NEXTST / TYPE STATEMENT SUBROUTINE PAGE TYPLST, 0 /HANDLE LIST FOR TYPE DELL TAD STACK DCA X12 /SAVE STACK POINTER DCA NUMELM TAD I TYPLST /GET SET BITS DCA SETBIT ISZ TYPLST TAD I TYPLST /AND ILLEGAL BITS DCA BADBIT ISZ TYPLST LSTLUP, JMS I [GETNAM /GET VARIABLE JMP BADLST JMS I [LOOKUP /S.T. SEARCH DCA TLTEMP /SAVE VAR ADDRESS TAD TLTEMP /PUT IT ON THE STACK ISZ TLTEMP /NOW POINT TO TYPE WORD JMS I [PUSH /INCREMENT NUMBER ISZ NUMELM /INCREMENT NUMBER CDF 10 TAD I TLTEMP /COMPARE TYPES AND BADBIT /CHECK FOR ILLEGAL BITS SZA CLA JMP TYPAGN /ATTEMPT TO RE-TYPE TAD SETBIT /GET SET BITS CMA /GENERATE MASK AND I TLTEMP TAD SETBIT /DO THE SET DCA I TLTEMP /BUT NOT DIMENSION BIT CDF GETDIM, JMS I [GETC JMP EOL TAD (-250 /LOOK FOR ( SZA JMP NOTDIM /NOT DIMENSIONED CLA IAC /INITIALIZE MAGIC NUMBER DCA DSERES CLA IAC DCA DPRDCT /AND DIMENSION PRODUCT TAD STACK DCA X17 /SAVE STACK POINTER DCA TEMP2 /DIMENSION COUNT=0 JMP I (DIMLUP /GET DIMENSIONS PUTDIM, TAD X17 DCA STACK /RESTORE STACK CDF 10 TAD (3400 /DIM, EXT, SF ? AND I TLTEMP SZA CLA JMP DIMAGN /ATTEMPT TP RE-DIMENSION CLL CML RTR TAD I TLTEMP /SET DIMENSION BIT DCA I TLTEMP ISZ TLTEMP TAD TEMP2 /NUMBER OF DIMS. DCA I NEXT TAD I TLTEMP /GET EQUIVALENCE POINTER SZA DCA TLTEMP TAD NEXT /STORE POINTER TO DCA I TLTEMP /DIMENSION INFORMATION TAD DPRDCT /SAVE DIM PRODUCT DCA I NEXT TAD DSERES /AND MAGIC NUMBER DCA I NEXT DCA I NEXT /ZERO MAGIC LITERAL POINTER TAD TEMP2 CIA DCA TEMP2 /LEAVE LAST DIM CDF MOVDIM, TAD I X17 /1.03/ GET THE DIMENSION CDF 10 /1.03/ DCA I NEXT /1.03/ INTO THE DIMENSION INFO BLOCK CDF /1.03/ ISZ TEMP2 /1.03/ JMP MOVDIM /1.03/ NEXTEL, JMS I [GETC /LOOK FOR , JMP TLRETN TAD (-254 SNA CLA JMP LSTLUP /OK, GET NEXT MEMBER ENDLST, JMS I [BACK1 ISZ TYPLST JMP I TYPLST BADDIM, JMS I [ERMSG /DIMENSION ERROR 0204 JMP I TYPLST BADLST, JMS I [ERMSG /ERROR IN LIST 2404 JMP I TYPLST TYPAGN, JMS I [ERMSG 2224 /RE-TYPE JMP GETDIM DIMAGN, JMS I [ERMSG /ATTEMPT TO RE DIMENSION 2204 JMP NEXTEL NOTDIM, TAD (250-254 /IS IT A COMMA? SZA CLA JMP ENDLST JMP LSTLUP /GET NEXT ELEMENT EOL, TLRETN, ISZ TYPLST JMP I TYPLST /TAKE OK EXIT ENDFIL, JMS I [CHECKC /LOOK FOR "E" -305 JMP I [BADCMD JMS I [EXPR /COMPILE UNIT JMP I [BADCMD TAD (ENDFOP /OUTPUT ENDFILE OPERATOR JMS I [OUTWRD JMP I [NEXTST DOUBLE, JMS I [CHECKC /LOOK FOR N -316 JMP I [BADCMD JMS I [IFCHEK /NOT ON AN IF JMS I [TYPLST /PROCESS LIST 0104 0100 NOP CLA IAC /SET THE DP SWITCH DCA DPUSED JMP I [NEXTST / SYMBOL TABLE LOOKERUPPER PAGE LOOKUP, 0 /SYMBOL TABLE LOOKUP FOR VARIABLE ENTRY TAD NOCODE /IS THIS IN NOCODE MODE ? SZA CLA JMP I LOOKUP /YES, DO NOTHING TAD BUCKET TAD (ALIST-1 /GET START OF CORRECT BUCKET CDF 10 LOOK, DCA OLDN3 /SAVE ADDR OF PREVIOUS ENTRY TAD I OLDN3 /GET ADDR OF NEXT ENTRY SNA JMP HOOKIN /NO NEXT ENTRY, ATTACH NEW ENTRY TAD (2 /SKIP OVER TYPE AND DIM POINTER DCA X10 TAD (NAME1 DCA PNAME /SETUP POINTER TO NAME CDF CHKNAM, TAD I PNAME /GET WORD NAME CIA CLL CDF 10 TAD I X10 /COMPARE WITH THIS ENTRY SZA CLA JMP NOTSAM /DIFFERENT CDF TAD I PNAME AND [77 /WAS THIS THE END OF NAME? ISZ PNAME SZA CLA JMP CHKNAM /NO, KEEP COMPARING CDF 10 RLOOKU, TAD I OLDN3 /GET ADDR OF START OF ENTRY CDF /AND RETURN IT IN THE AC JMP I LOOKUP /RETURN ADDR OF SYMBOL NOTSAM, SZL JMP HOOKIN /NEW SYMBOL <CURRENT ONE TAD I OLDN3 JMP LOOK /CONTINUE SEARCH HOOKIN, TAD I OLDN3 /HOOK NEW ENTRY INTO LIST DCA I NEXT TAD NEXT DCA I OLDN3 DCA I NEXT /ZERO TYPE WORD DCA I NEXT /ZERO EQUIVALENCE/DIMENSION POINTER TAD (NAME1 /PREPARE TO STICK IN THE NAME DCA PNAME CDF ENTERN, TAD I PNAME /MOVE NAME INTO S.T. CDF 10 DCA I NEXT CDF TAD I PNAME ISZ PNAME /END OF NAME? AND [77 SZA CLA JMP ENTERN /NO, KEEP GOING CDF 10 STCHEK, TAD NEXT /CHECK FOR S.T. OVERFLOW CIA CLL TAD (4740 /5000 STARTS PASS2 SKELETON TABLES SZL CLA JMP RLOOKU CDF JMS I [ERMSG /S.T. FULL 2324 JMP I (ENDX /TREAT AS END OF INPUT OLDN3, 0 /ADDR OF PREVIOUS ENTRY N3SIZE, 0 /SIZE OF ENTRY LTEMP, PNAME, /POINTER TO NAME BUFFER LUKUP2, 0 /LOOKUP FOR FIXED LENGTH SYMBOLS TAD I LUKUP2 /GET THE BUCKET START DCA OLDN3 /SAVE IT AS THE PREVIOUS ENTRY ISZ LUKUP2 TAD I LUKUP2 /GET THE ENTRY SIZE ISZ LUKUP2 DCA N3SIZE TAD LUKUP2 /SAVE RETURN ADDR DCA LOOKUP TAD NOCODE /IS CODE GENERATION OFF ? SZA CLA JMP I LOOKUP /YES, JUST RETURN CDF 10 LOOK2, TAD I OLDN3 /GET ADDR OF NEXT ENTRY SNA JMP HOKIN2 /IF 0 ITS END OF LIST IAC DCA X10 /START OF VALUE INFO TAD (WORD1-1 /SETUP POINTER TO PROTOTYPE DCA X11 TAD N3SIZE /AND TEMP OF ENTRY SIZE DCA LTEMP CHKVAL, CDF TAD I X11 CIA CLL /COMPARE THIS WORD OF THE VALUE CDF 10 TAD I X10 SZA CLA JMP NOTSM2 /NOT THIS ONE ISZ LTEMP /INCR SIZE COUNT JMP CHKVAL /MORE STUFF JMP RLOOKU /RETURN WITH THE GOODS NOTSM2, SZL JMP HOKIN2 /NEW SYMBOL < CURRENT ONE TAD I OLDN3 /CONTINUE SEARCH DCA OLDN3 JMP LOOK2 HOKIN2, TAD I OLDN3 /HOOK NEW ENTRY INTO LIST DCA I NEXT TAD NEXT DCA I OLDN3 TAD (WORD1-1 /PREPARE TO STICK IN THE VALUE DCA X11 DCA I NEXT /ZERO TYPE WORD CDF ENTERV, TAD I X11 /MOVE VALUE INTO S.T. CDF 10 DCA I NEXT ISZ N3SIZE /INCR SIZE COUNT JMP ENTERV-1 JMP STCHEK /STORE TYPE AND CHECK FOR OVERFLOW STOP, TAD (STOPOP /OUTPUT STOP OPERATOR JMS I [OUTWRD ISZ DOEND /DO ILLEGAL ON STOP JMP I [NEXTST / EXPRESSION ANALYZER PAGE EXPR, 0 /POLISHIZE EXPRESSION TAD EXPR JMS I [PUSH /SAVE RETURN ADDR JMS I [PUSH /MARK STACK UNOPR, JMS I [GETC /LOOK FOR UNARY OPERATOR JMP MISARG /THERE HAS TO BE AN OPERAND TAD (-253 /UNARY+(NOP) SNA JMP UNOPR TAD (253-255 /UNARY- SNA JMP UMINUS TAD (255-256 /.NOT. SZA CLA JMP OPRAND DCA BUCKET /FOR CKNOT JMS I (TRUFAL /.TRUE. OR .FALSE. ? JMP CKNOT /NEITHER, IS IT >.NOT. JMP .+3 /.TRUE. TAD (NOTOPR /FALSE=.NOT.TRUE JMS I [PUSH JMS I [OUTWRD TAD (TRUE JMS I [OUTWRD JMP I (NOSS CKNOT, TAD BUCKET TAD (-16 SZA CLA JMP OPRAND /MIGHT BE LITERAL .XXXXXX TAD (NOTOPR /PUSH .NOT. OPERATOR JMS I [PUSH JMP UNOPR UMINUS, TAD (UMOPR /PUSH UNARY MINUS JMS I [PUSH JMP UNOPR OPRAND, JMS I [BACK1 /PUT BACK NON UNARY OPERATOR JMS I [GETNAM /LOOK FOR VARIABLE REFERENCE JMP NOTVAR /NOPE. JMS I [LOOKUP /SYMBOL TABLE SEARCH JMP I [OPR8R /GO OUTPUT PUSH-VAR NOTVAR, JMS I [NUMBER /LOOK FOR A LITERAL JMP NOTNUM /NO KIND OF NUMBER JMP HOLCHK /INTEGER JMP DPLIT /DOUBLE PRECISION FPLIT, JMS I [LUKUP2 /FLOATING, ENTER INTO TABLE FPLIST -3 JMP I [OPR8RL /PUSH VARIABLE, NO SUBSCRIPTS DPLIT, JMS I [LUKUP2 /DOUBLE-PREC., ENTER IN TABLE DPLIST -6 JMP I [OPR8RL HOLCHK, JMS I [GETC /IS THIS HOLLERITH? JMP .+5 TAD (-310 SNA CLA JMP I (HFIELD /YES JMS I [BACK1 JMS I [LUKUP2 /FIND THE ENTRY INTLST -3 JMP I [OPR8RL NOTNUM, JMS I [GETC /LOOK FOR COMPLEX LITERAL JMP MISARG /MISSING OPERAND TAD (-250 /OPEN PAREN? SZA JMP QUOTE /GO LOOK FOR A STRING JMS I [SAVECP /SAVE CHAR POSITION JMS I [NUMBER /GET REAL PART JMP I (NCMPLX /NO NUMBER SKP /INTEGER-OK JMP I (NCMPLX /DOUBLE-NOT LEGAL FOR COMPLEX JMS I [CHECKC /LOOK FOR , -254 JMP I (NCMPLX /NO, CAN'T BE COMPLEX LIT. TAD WORD1 /SAVE REAL PART DCA TEMP TAD WORD2 DCA TEMP2 TAD WORD3 DCA CHAR JMS I [NUMBER /GET IMAGINARY PART JMP BADCL /NOT THERE, BAD SKP /I JMP BADCL /D-BAD JMS I [CHECKC /LOOK FOR ) -251 JMP BADCL /NO ) BAD TAD WORD1 /PUT IMAGINARY PART DCA WORD4 TAD WORD2 /INTO SECOND AHLF DCA WORD5 TAD WORD3 /OF COMPLEX LITERAL DCA WORD6 TAD TEMP /NOW RESTORE REAL PART DCA WORD1 TAD TEMP2 DCA WORD2 TAD CHAR DCA WORD3 CLL CMA RAL /REMOVE CHAR POS FROM STACK TAD STACK /SINCE OTHERWISE IT GOES OUT DCA STACK /AS CODE JMS I [LUKUP2 /WHICH WE WILL NOW SEARCH CMPLST /USE COMPLEX LIST -6 JMP I [OPR8RL BADCL, JMS I [ERMSG /BAD COMPLEX LITERAL 0314 JMP I [BADEXP MISARG, JMS I [ERMSG /MISSING OPERAND 1517 JMP I [BADEXP / EXPRESSION ANALYZER PAGE HQUOTE, 0 /SUBR FOR QUOTE STRINGS JMS I [GETCWB /GET CHAR JMP BADH TAD [-247 /IS IT ' SZA JMP NOTQ2 /NO JMS I [GETCWB JMP LUHOL TAD [-247 /LOOK FOR '' SNA CLA JMP NOTQ2 /REPLACE '' BY ' JMS I [BACK1 /ITS END OF STRING JMP LUHOL NOTQ2, TAD [247 /RESTORE CHAR AND [77 JMP I HQUOTE HFIELD, JMS I [FIXNUM /INTEGERIZE NUMBER SNA JMP BADH /ZERO IS BAD CMA CLL DCA TEMP TAD (HCOUNT /SET SUBR POINTER DOHOL, DCA HCHAR TAD (-MAXHOL /SET COUNTER FOR MAX DCA HOLCTR TAD (NAME1 /SET UP NAME POINTER DCA TEMP2 PAKHOL, DCA I TEMP2 /PACK HOLLERITH STRING JMS I HCHAR CLL RTL RTL RTL DCA I TEMP2 JMS I HCHAR TAD I TEMP2 DCA I TEMP2 ISZ TEMP2 ISZ HOLCTR /CHECK FOR TOO MANY JMP PAKHOL BADH, JMS I [ERMSG /BAD OR TOO BIG HOLLERITH FIELD 1017 JMP I [BADEXP LUHOL, TAD (33 /LOOK UP THIS LITERAL DCA BUCKET JMS I [LOOKUP JMP I [OPR8RL HCOUNT, 0 ISZ TEMP /CHECK COUNT SKP JMP LUHOL /EXPIRED JMS I [GETCWB /GET CHAR JMP BADH AND [77 /6-BIT IZE IT JMP I HCOUNT HOLCTR, 0 /COUNTER FOR HOLLERITH FIELDS NCMPLX, JMS I [RESTCP /NOT COMPLEX LITERAL JMS I [EXPR /MUST BE SUB EXPRESSION JMP BADEXP JMS I [GETC /LOOK FOR ) JMP PARMM TAD (-251 SNA CLA JMP I (NOSS /NO SUBSCRIPT LEGAL AFTER SUB EXPR PARMM, JMS I [ERMSG /MISSING ) 1515 BADEXP, JMS I [POP /BAD EXPRESSION, SZA CLA JMP BADEXP /LOOK FOR STACK MARKER JMS I [POP DCA TEMP /RETURN ADDR. JMP I TEMP JMS I [BACK1 /PUT BACK TEMINAL CHAR ENDEXP, JMS I [POP /GET NEXT THING FROM STACK SNA JMP EXPDUN /IF ZERO, FINISH IAC /GET ADDR OF OPERATION NUMBER DCA TEMP TAD I TEMP /GET OPERATOR VALUE JMS I [OUTWRD /OUTPUT OPERATOR XXXXXX JMP ENDEXP /LOOP EXPDUN, JMS I [POP /GET RETURN ADDR IAC DCA TEMP JMP I TEMP LETTER, 0 /GET A LETTER JMS I [GETC JMP I LETTER TAD (-301 SPA JMP NLETR TAD (301-333 SMA JMP NLETR TAD (33 ISZ LETTER JMP I LETTER NLETR, JMS I [BACK1 JMP I LETTER QUOTE, TAD (250-247 /IS IT ' SZA CLA //was SZA DSN 51.3.1 M JMP MISARG /NO, OPERAND IS MISSING TAD (HQUOTE /SET SUBR POINTER JMP DOHOL CHECKC, 0 /CHECK FOR A SINGLE CHAR TAD I CHECKC /GET THE CHAR DCA CCTEMP ISZ CHECKC /SKIP PAST THE CHAR JMS I [GETC /GET CHAR FROM INPUT JMP I CHECKC /DIDN'T MAKE IT TAD CCTEMP /IS THIS IT ? SNA CLA ISZ CHECKC /YES JMP I CHECKC CCTEMP, 0 / EXPRESSION ANALYZER PAGE BADFSS, JMS I [ERMSG 2323 JMP I [BADEXP OPR8R, DCA TEMP JMS I [OUTWRD /PUSH TAD TEMP JMS I [OUTWRD /OUTPUT OPERAND PTR JMS I [GETC JMP I [ENDEXP TAD (-250 /IS IT S.S. OR FUNCTION SZA JMP NOTFSS TAD STMJMP TAD (-DFINFL SNA CLA /FOR D.F.,PERMIT VARPARENS JMP NOTFSS ISZ TEMP /LOOK AT TYPE CDF 10 TAD (3420 /DIM, EXT, SF, OR ARG ? AND I TEMP SZA CLA JMP NOTFUN /NOT A FUNCTION REFERENCE TAD I TEMP TAD (1000 /SET EXT BIT DCA I TEMP NOTFUN, CDF SKP JMS I [POP /PUT COUNT INTO AC SSFUN, IAC /INCREMENT ARG COUNT JMS I [PUSH /SAVE IT ON THE STACK JMS I [EXPR /GET ARG (OR S.S.) JMP I [BADEXP JMS I [COMARP /LOOK FOR , OR ) JMP BADFSS /NEITHER JMP SSFUN-1 /, GET NEXT ARG (SUBSCRIPT?) TAD (ARGSOP /YES, OUTPUT ARGLIST OPER JMS I [OUTWRD JMS I [POP /AND THE COUNT JMS I [OUTWRD NOSS, JMS I [GETC /GET NEXT CHAR JMP I [ENDEXP TAD (-253 /PREPARE IT JMP NOTFSS+1 OPR8RL, DCA TEMP /SAVE ADDR OF LITERAL JMS I [OUTWRD TAD TEMP JMS I [OUTWRD JMP NOSS / TYPLST PART TWO DIMLUP, JMS I [NUMBER /GET DIMENSION JMP VARDIM /MAYBE ITS VAR DIM ? JMP .+3 /OK, INTEGER JMP BADDIM JMP BADDIM /DP AND FP ARE BAD JMS I [FIXNUM /FIX IT FOR SOME STUFF DCA MQ TAD DPRDCT /GET NEW DIMENSION PRODUCT JMS I [MUL12 DCA DPRDCT ISZ TEMP2 /INCREMENT DIM COUNT TAD WORD2 /IF WORD2 OR AC NON ZERO TAD AC /DIM IS TOO BIG SZA CLA /1.03/ JMP BADDIM /1.03/ JMS I (ANORM /1.03/ RENORMALIZE THE NUMBER JMS I [LUKUP2 /1.03/ ENTER IT INTO LITERAL LIST INTLST /1.03/ -3 /1.03/ PSHDIM, JMS I [PUSH /1.03/ AND SAVE ON THE STACK JMS I [COMARP /LOOK FOR , OR ) JMP BADDIM SKP /COMMA MEANS ANOTHER DIM FOLLOWS JMP PUTDIM /) MEANS END OF DIMS TAD DSERES /FORM NEXT VALUE OF MAGIC NUMBER TAD DPRDCT DCA DSERES JMP DIMLUP /NOW LOOP FOR NEXT DIM VDTEMP, 0 VARDIM, CDF 10 /IS ARRAY AN ARG ? TAD I TLTEMP CDF AND (20 SNA CLA JMP BADDIM /NO, BAD DIMENSION JMS I [GETNAM /OK, GET DIMENSION JMP BADDIM JMS I [LOOKUP IAC DCA VDTEMP /ADDR OF TYPE WORD CDF 10 /IS THA VARIABLE AN ARG ? TAD I VDTEMP AND (20 CDF SNA CLA JMP BADDIM /NO, THATS BAD DCA DPRDCT /3.02 ZERO DIM PRODUCT ISZ TEMP2 /INCREMENT DIM COUNT CMA /1.03/ TAD VDTEMP /1.03/ SAVE DIMENSION VARIABLE JMP PSHDIM /3.02 SAVE DIM ON STACK MESSAG, 0 /PRINT PASS1 IMMEDIATE ERROR TAD I MESSAG /GET CHAR ONE ISZ MESSAG JMS I (TTYOUT TAD I MESSAG /GET CHAR TWO JMS I (TTYOUT TAD (215 /CR JMS I (TTYOUT TAD (212 /LF JMS I (TTYOUT JMP I (7605 /EXIT TO MONITOR / EXPRESSION ANALYZER REVISITED PAGE NOTFSS, TAD (250-253 /IS IT + SZA JMP .+3 TAD (ADDOPR /YES JMP GOTOPR TAD (253-255 /IS IT - SZA JMP .+3 TAD (SUBOPR /YES JMP GOTOPR TAD (255-252 /IS IT * SZA JMP NOTMUL /NO JMS I [GETC JMP NOTEXP TAD (-252 /IS IT ** SZA CLA JMP .+3 TAD (EXPOPR /YES JMP GOTOPR JMS I [BACK1 NOTEXP, TAD (MULOPR /IT WAS * JMP GOTOPR NOTMUL, TAD (252-257 /IS IT / SZA JMP .+3 TAD (DIVOPR /YES JMP GOTOPR IAC /IS IT . SZA CLA JMP I (ENDEXP-1 /NO, END OF EXPR JMS CKEOPR /LOOK FOR EXTENDED OPERATOR JMP BADOPR /NONE THERE JMS I [CHECKC /CHECK FOR CLOSING . -256 JMP BADOPR /NOT THERE CDF 10 /3.01/ TAD I X10 /GET OPERATOR POINTER CDF JMP GOTOPR CKEOPR, 0 /CHECK FOR EXTENDED OPERATOR JMS I [GETNAM /GET NAME JMP I CKEOPR /NONE TAD (OPRLST-1 /PTR TO LIST DCA X10 OPRLUP, CDF 10 /3.01/ TAD I X10 /COMPARE FIRST CHAR CDF 0 SNA JMP I CKEOPR /END OF LIST TAD BUCKET SZA CLA JMP NOTHIS /NOT THIS ONE CDF 10 /3.01/ TAD I X10 CDF TAD I (NAME1 /COMPARE 2ND AND 3RD SZA CLA JMP NOTHIS+1 /NOT THIS ONE ISZ CKEOPR /BUMP RETURN JMP I CKEOPR NOTHIS, ISZ X10 /BUMP LIST PTR ISZ X10 /AGAIN JMP OPRLUP /KEEP GOING BADOPR, JMS I [ERMSG /NOT LEGAL EXT. OPER. 1720 JMP I [BADEXP GOTOPR, DCA NEWOP /SAVE NEWEST OPER. JMS I [POP /GET STACK TOP SNA JMP PUSH2 /EMPTY DCA OLDOP TAD I OLDOP /COMPARE PREC. CIA TAD I NEWOP /NEW-OLD SPA SNA CLA JMP OUTOLD /OLD>NEW TAD OLDOP PUSH2, JMS I [PUSH /OLD < NEW TAD NEWOP /GO PUSH BOTH JMS I [PUSH JMP I (UNOPR /GO LOOK FOR NEXT OPERAND OUTOLD, ISZ OLDOP /OUTPUT OPERATOR TAD I OLDOP JMS I [OUTWRD JMP GOTOPR+1 /TRY NEXT STACK ELEMENT NEWOP=WORD1 OLDOP=WORD2 / UTILITIES GETCWB, 0 /GET A CHARACTER (PRESERVE BLANKS) ISZ NCHARS JMP .+4 CLA CMA DCA NCHARS /RESET NCHARS JMP I GETCWB ISZ GETCWB TAD I CHRPTR /GET THE CHAR JMP I GETCWB SAVECP, 0 /SAVE CHAR POSITION TAD NCHARS JMS I [PUSH TAD CHRPTR JMS I [PUSH JMP I SAVECP FIXNUM, 0 /FIX FAC (I'M MOVING IT AGAIN) TAD WORD1 /IS IT FIXED ? TAD (-27 SNA JMP RETFN /YES, EXPONENT IS 23 SMA CLA JMP I FIXNUM /BAD IF EXP IS >23 JMS I (AR1 /RIGHT SHIFT ONE JMP FIXNUM+1 /TEST AGAIN RETFN, TAD WORD3 /RETURN LOWEST 12 BITS JMP I FIXNUM / UTILITIES PAGE GETC, 0 /GET A CHARACTER (IGNORING BLANKS) ISZ NCHARS JMP .+4 CLA CMA DCA NCHARS JMP I GETC TAD I CHRPTR TAD (-240 /IS IT A BLANK SNA JMP GETC+1 /YES IGNORE IT TAD (240 /FIX CHAR ISZ GETC JMP I GETC ERMSG, 0 /ERROR MESSAGE HANDLER CDF TAD NOCODE /IS CODE GENERATION ON ? SZA CLA JMP NOTOUT /NO TAD (ERRCOD /ERROR CODE TO OUTPUT FILE JMS I [OUTWRD TAD I ERMSG ISZ ERMSG JMS I [OUTWRD JMP I ERMSG /RETURN NOTOUT, TAD I ERMSG /SAVE THE ERROR CODE ISZ ERMSG DCA ERCODE JMP I ERMSG POP, 0 /PUT TOP OF STACK INTO AC TAD STACK DCA ERMSG CLA CMA TAD STACK DCA STACK /DECREMENT STACK POINTER TAD I ERMSG JMP I POP TRUFAL, 0 /CHECK FOR LOGICAL LITERALS JMS I [GETNAM JMP I TRUFAL JMS I [CHECKC /LOOK FOR TERMINAL . -256 JMP I TRUFAL TAD BUCKET /LOOK AT FIRST CHAR TAD (-24 SNA JMP .+5 /ITS "T" TAD (24-6 SZA CLA JMP I TRUFAL /ITS NEITHER ISZ TRUFAL /ITS "F" ISZ TRUFAL JMP I TRUFAL / LEFT HALF EXPRESSION ANALYZER LEXPR, 0 /GET LEFT HAND EXPRESSION DCA LETEMP /SAVE CALL SWITCH JMS I [GETNAM /LOOK FOR VAR NAME JMP MSNGOP /MUST BE THERE JMS I [OUTWRD /OUTPUT A ZERO (PUSH) JMS I [LOOKUP /SEEK OUT ENTRY FOR THIS VAR DCA TEMP TAD TEMP JMS I [OUTWRD JMS I [GETC /LOOK FOR DIMENSIONS JMP LEXPOK /NO ( TAD (-250 SZA CLA JMP LEXPOK-1 /NO ( ISZ TEMP /LOOK AT TYPE CDF 10 CLL CML RTR /DIMENSIONED ? AND I TEMP TAD LETEMP /OR A CALL ? TAD NOCODE /OR CODE OFF ? SZA CLA JMP NOTSF /YES, NOT AN ARITHMETIC S.F. TAD I TEMP AND (1420 /EXT, SF, OR ARG ? SNA CLA /V3C TAD [-M6 /SEE IF CALLED FROM SPECIAL PLACE TAD LEXPR /V3C COMPARE WITH ENTRY PT SZA CLA JMP ASFERR /THIS IS BAD IF SO TAD I TEMP TAD (400 DCA I TEMP /SET A.S.F. BIT CDF TAD (ASFDEF /DEFINE ASF JMS I [OUTWRD NOTSF, CDF SKP JMS I [POP /ARG COUNT TO AC SSLOOP, IAC /INCREMENT SS COUNT JMS I [PUSH /SAVE ON THE STACK JMS I [EXPR /COMPILE SUBSCRIPT JMP FSSBAD+2 /ERROR WITHIN SS JMS I [COMARP /LOOK FOR , OR ) JMP FSSBAD /NEITHER (THERE WAS A BUG HERE) JMP SSLOOP-1 /, GET NEXT ARG/SS TAD (ARGSOP /OUTPUT SS OPERATOR JMS I [OUTWRD JMS I [POP /THEN COUNT JMS I [OUTWRD SKP JMS I [BACK1 /PUT BACK A CHARACTER LEXPOK, ISZ LEXPR JMP I LEXPR /RETURN MSNGOP, JMS I [ERMSG /MISSING OPERAND 1517 JMP I LEXPR FSSBAD, JMS I [ERMSG /MISSING COMMA OR CLOSE PARENTHESIS 2323 JMS I [POP /GET ARG COUNT OFF STACK CLA JMP I LEXPR ASFERR, JMS I [ERMSG /BAD ARITHMETIC STMT FUNCTION 2306 JMP NOTSF /DO THE REST OF THE ASF DEF LETEMP, 0 /UTILITIES PAGE G2CTMP, PUSH, 0 /PUT AC ONTO STACK DCA I STACK /STORE TAD (STACKS+100 /CHECK FOR STACK OVERFLOW CIA CLL TAD STACK SNL CLA JMP I PUSH /OK, RETURN DCA NOCODE /SET CODE GENERATION ON JMS I [ERMSG 2004 JMP I [NEXTST GET2C, 0 /GET 2 SIX BIT CHARS INTO ONE WPRD JMS I [GETC /GET FIRST CHAR JMP I GET2C AND [77 CLL RTL RTL RTL DCA G2CTMP JMS I [GETC /GET SECOND CHAR JMP I GET2C ISZ GET2C /FIX RETURN ADDR AND [77 TAD G2CTMP JMP I GET2C STMNUM, 0 /PICK UP STATEMENT NUMBER DCA WORD4 /SAVE DEFINED BIT (IF ANY) DCA WORD2 /ZERO SOME STUFF DCA WORD3 JMS DIGIT /GET A DIGIT JMP I STMNUM /NONE THERE, NO STMT NUMBER TAD (-60 /IS IT A LEADING 0 ? SNA JMP .-4 /YES, IGNORE IT TAD (60 CLL RTL RTL RTL DCA WORD1 JMS DIGIT /GET SECOND DIGIT JMP ENDNUM /END OF NUMBER TAD WORD1 DCA WORD1 /COMBINE FIRST AND SECOND JMS DIGIT JMP ENDNUM CLL RTL RTL RTL DCA WORD2 JMS DIGIT JMP ENDNUM /COMBINE THIRD AND FOURTH TAD WORD2 DCA WORD2 JMS DIGIT /GET FIFTH DIGIT JMP ENDNUM CLL RTL RTL RTL DCA WORD3 ENDNUM, JMS I [LUKUP2 /LOOK UP IN S.T. SNLIST /STMT NUMBER LIST -3 ISZ STMNUM DCA SNUM /SAVE S.T. ADDRESS OF LABEL CDF 10 /SET TYPE WORD TAD SNUM /GET ADDR OF TYPE IAC DCA SNTEMP TAD I SNTEMP /GET TYPE WORD CLL TAD WORD4 /PUT IN THE DEFINITION BIT SNL DCA I SNTEMP /RESTORE IT IF NOT MULTIPLE DEFN CDF SNL CLA JMP I STMNUM JMS I [ERMSG 1514 JMP I STMNUM SNTEMP, DIGIT, 0 /GET A DIGIT JMS I [GETC /GET A CHAR JMP I DIGIT TAD (-272 /IS IT > 271 (9) SMA JMP NODIGT /YES, ITS GREATER TAD (272-260 /IS IT < 260 (0) SPA JMP NODIGT /YES, ITS LESS TAD (60 ISZ DIGIT JMP I DIGIT /TAKE SUCCESSFUL RETURN NODIGT, JMS I [BACK1 /RESTORE NON DIGIT JMP I DIGIT ASSIGN, JMS I [STMNUM /GET STMT NUMBER JMP BADASN JMS I [GET2C /LOOK FOR "TO" JMP BADASN TAD (-2417 SNA CLA JMS I [LEXPR /GET ASSIGN VARIABLE JMP BADASN TAD (ASNOPR /OUTPUT ASSIGN OPERATOR JMS I [OUTWRD TAD SNUM /NOW STMT NUMBER JMS I [OUTWRD JMP I [NEXTST BADASN, JMS I [ERMSG 0123 JMP I [NEXTST TTYOUT, 0 /TTY OUTPUT ROUTINE TLS TSF JMP .-1 CLA JMP I TTYOUT / PRECEDENCE TABLE PAGE ADDOPR, 100 1 SUBOPR, 100 2 MULOPR, 200 3 DIVOPR, 200 4 EXPOPR, 500 5 NOTOPR, 30 6 UMOPR, 400 7 EQOPR, 40 16 NEOPR, 40 17 GEOPR, 40 10 GTOPR, 40 11 LEOPR, 40 12 LTOPR, 40 13 ANDOPR, 20 14 OROPR, 10 15 XOROPR, 7 20 EQVOPR, 7 21 / UTILITY ROUTINES BACK1, 0 /BACK UP ONE CHAR CLA CMA TAD NCHARS DCA NCHARS CLA CMA TAD CHRPTR DCA CHRPTR JMP I BACK1 OADD, 0 /ADD OPERAND TO FAC CLL TAD OPO TAD ACO DCA ACO RAL TAD OP6 TAD WORD6 DCA WORD6 RAL TAD OP5 TAD WORD5 DCA WORD5 RAL TAD OP4 TAD WORD4 DCA WORD4 RAL TAD OP3 TAD WORD3 DCA WORD3 RAL TAD OP2 TAD WORD2 DCA WORD2 JMP I OADD / FLOATING POINT DIVIDE ROUTINE PAGE FPDIV, 0 JMS I DAR1 /UNNORMALIZE AC BY ONE TAD OP1 /COMPUTE FINAL EXPONENT CIA TAD WORD1 DCA OP1 /AND SAVE IT TAD DM74 /SET ITERATION COUNTER DCA DITCNT TAD WORD2 RAL /INITIALIZE LINK FPDVLP, CLA RAR /COMPARE SIGNS TAD OP2 SPA CLA JMP .+3 TAD OPMAC /NEGATE OPERAND JMS I DFNEG JMS I DOADD /ADD OPERAND AND FAC TAD D6 /RIGHT SHIFT QUOTIENT RAL /PRESERVING ADD OVERFLOW BIT DCA D6 TAD D5 RAL DCA D5 TAD D4 RAL DCA D4 TAD D3 RAL DCA D3 TAD D2 RAL DCA D2 JMS I DAL1 /LEFT SHIFT FAC ONE ISZ DITCNT /TEST ITERATION COUNT JMP FPDVLP TAD OP1 /PUT QUOTIENT INTO FAC DCA WORD1 TAD D2 DCA WORD2 TAD D3 DCA WORD3 TAD D4 DCA WORD4 TAD D5 DCA WORD5 TAD D6 DCA WORD6 DCA ACO JMS I DNORM /NORMALIZE JMP I FPDIV D2, 0 D3, 0 D4, 0 D5, 0 D6, 0 DITCNT, 0 DAR1, AR1 DAL1, AL1 DM74, -74 OPMAC, OPO-ACO DFNEG, NEGFAC DOADD, OADD DNORM, ANORM *STACKS-1 -1 /TO PREVENT SPURIOUS DO ENDS / NUMERIC CONVERSION ROUTINE PAGE NUMBER, 0 /GENERAL NUMBER CONVERSION ROUTINE DCA ESWIT /ZERO E/D SWITCH DCA DECPT /ZERO DECIMAL POINT SWITCH DCA WORD1 /ZERO FAC DCA WORD2 DCA WORD3 DCA WORD4 DCA WORD5 DCA WORD6 DCA ACO DCA SIGN /CLEAR SIGN SWITCH JMS I [GETC /GET A CHAR JMP I NUMBER /NO CHAR IS NO NUMBER JMS CHKSGN /CHECK FOR SIGN SIGN, 0 /THIS SWITCH GETS SET DCA NDIGIT /ZERO DIGIT COUNT CONVLP, JMS I [DIGIT /GET A DIGIT JMP TRYDEC /IS THERE A DECIMAL POINT ? AND [17 DCA NXTDGT /SAVE THE DIGIT ISZ NDIGIT /INCR NUMBER OF DIGITS TAD WORD2 /PREPARE TO MULT BY 10 DCA OP2 TAD WORD3 DCA OP3 TAD WORD4 DCA OP4 TAD WORD5 DCA OP5 TAD WORD6 DCA OP6 TAD ACO DCA OPO JMS I (AL1 /DOUBLE FAC JMS I (AL1 /DOUBLE AGAIN JMS I (OADD /TIMES FIVE JMS I (AL1 /ONE MORE DOUBLING IS TIMES 10 DCA OP2 DCA OP3 /PUT NEWEST DIGIT INTO OPERAND DCA OP4 DCA OP5 DCA OP6 TAD NXTDGT DCA OPO JMS I (OADD /ADD IN NEWEST DIGIT JMP CONVLP TRYDEC, TAD DECPT /DECIMAL ALREADY ? SZA CLA JMP TRYE2 /YES, LOOK FOR EXPONENT JMS I [GETC /LOOK FOR . JMP DIGTST /SEE IF THERE WAS ANYTHING TAD (-256 SZA JMP TRYE1 /TRY FOR E JMS I [SAVECP /SAVE CHAR POS JMS I (CKEOPR /CHECK FOR SPECIAL CASE OF LIT.RE. JMP NOLDRE /NOT LIT.RE. JMS I [RESTCP JMS I [BACK1 /PUT BACK . IT BELONGS TO RELATIONAL DIGTST, TAD NDIGIT /ANY DIGITS ? SNA CLA JMP I NUMBER /NO, NO NUMBER JMP INTEGR /TAKE INTEGER EXIT NOLDRE, ISZ DECPT /SET DECIMAL POINT SW JMS I [RESTCP /RESTORE CHAR POS JMP CONVLP-1 /LOOP FOR OTHER DIGITS TRYE1, JMS I [BACK1 /PUT BACK NON . TAD NDIGIT /ANY DIGITS YET ? SNA CLA JMP I NUMBER /NO, NO NUMBER JMS EORD /LOOK OR E OR D JMP INTEGR TRYE2, JMS EORD /LOOK FOR E OR D FPNUM, ISZ NUMBER ISZ NUMBER DCA EXPON /ZERO EXPONENT JMS I (DODEC /HANDLE DIGITS RIGHT OF . JMP DOSIGN-1 /GO DO SIGN INTEGR, TAD (107 /PUT IN EXPONNT DCA WORD1 JMS I (ANORM /NORMALIZE ISZ NUMBER /BUMP RETURN DOSIGN, TAD SIGN /CHECK THE SIGN SZA CLA JMS I (NEGFAC /NEGATE IF NEGATIVE JMP I NUMBER /RETURN CHKSGN, 0 /CHECK FOR SIGN TAD (-255 /IS IT - ? SNA ISZ I CHKSGN /YES, SET SWITCH SZA TAD (255-253 /IS IT + ? SZA CLA JMS I [BACK1 /RETURN CHAR OTHERWISE JMP I CHKSGN EORD, 0 /LOOK FOR E OR D JMS I [GETC /LOOK FOR E OR D JMP I EORD TAD (-304 CLL RAR SZA CLA /E OR D? JMP NOEORD /NO SZL ISZ ESWIT /SET SWITCH IF E SNL ISZ DPUSED /SET D.P. SWITCH IF D JMP I (GETEXP /OK, GET EXPONENT NOEORD, JMS I [BACK1 /PUT IT BACK CAUSE ITS NOT OURS JMP I EORD NXTDGT, 0 REWIND, JMS I [EXPR /COMPILE UNIT JMP I [NEXTST TAD (REWOPR /OUTPUT REWIND OPERATOR JMS I [OUTWRD JMP I [NEXTST / NUMERIC CONVERSION ROUTINE PAGE SMLNUM, 0 /INPUT A NUMBER <= 4095 EXPLUP, DCA EXPON /ZERO THE EXPONENT JMS I [DIGIT /GET THE NEXT DIGIT JMP I SMLNUM /NUMBER DONE AND [17 DCA OPO /SAVE THE DIGIT TAD EXPON /MULT BY 10 CLL RAL CLL RAL TAD EXPON CLL RAL TAD OPO /ADD IN DIGIT JMP EXPLUP /STORE BACK INTO EXPONENT GETEXP, DCA ESIGN /ZERO EXPONENT SIGN SWITCH JMS I [GETC /GET A CHAR JMP I (FPNUM+1 JMS I (CHKSGN /IS IT A SIGN FPRTNE, ESIGN, 0 /THIS IS THE SWITCH TO SET JMS SMLNUM /GO GET THE EXPONENT FIXEXP, TAD ESIGN /CHECK EXPONENT SIGN SNA CLA JMP .+4 TAD EXPON /COMPLEMENT EXPONENT CIA DCA EXPON JMS DODEC /GO HANLE EXPONENT CLL CML RTL /BUMP RETURN BY TWO (DP) OR 3 (FP) TAD ESWIT /DEPENDING ON E/D SWITCH TAD I [NUMBER DCA I [NUMBER JMP I (DOSIGN /CHECK THE SIGN DODEC, 0 TAD DO107 /NORMALIZE THE NUMBER DCA WORD1 JMS I (ANORM TAD DECPT /WAS THERE A DECIMAL POINT ? SZA CLA TAD NDIGIT /HOW MANY DIGITS TO THE RIGHT ? CIA TAD EXPON /SUBTRACT THAT NUMBER FROM EXP SMA JMP POSEXP /EXPONENT IS POSITIVE CIA DCA EXPON /ONLY NEED ABS VALUE TAD (FPDIV /DO DIVIDES JMP .+3 POSEXP, DCA EXPON TAD (FPMUL /DO MULTIPLIES DCA FPRTNE /MULTIPLY/DIVIDE ROUTINE TAD (PETABL-1 /POWERS OF TEN TABLE DCA X17 EXPMUL, TAD EXPON /LOOK AT THE EXPONENT SNA JMP I DODEC /IF 0 ITS THRU CLL RAR DCA EXPON /PUT LOWEST BIT INTO LINK SNL JMP SKPEXP /THIS ONE DOESN'T COUNT CDF 10 /3.01/ TAD I X17 /MOVE FACTOR INTO OPERAND DCA OP1 TAD I X17 DCA OP2 TAD I X17 DCA OP3 TAD I X17 DCA OP4 TAD I X17 DCA OP5 TAD I X17 DCA OP6 DCA OPO CDF JMS I FPRTNE /MULTIPLY OR DIVIDE BY THIS FACTOR JMP EXPMUL /CHECK NEXT BIT SKPEXP, TAD X17 /SKIP OVER THIS FACTOR TAD (6 JMP EXPMUL-1 AR1, 0 /SHIFT FAC RIGHT ONE TAD WORD2 CLL RAR DCA WORD2 TAD WORD3 RAR DCA WORD3 TAD WORD4 RAR DCA WORD4 TAD WORD5 RAR DCA WORD5 TAD WORD6 RAR DCA WORD6 TAD ACO RAR DCA ACO ISZ WORD1 DO107, 107 JMP I AR1 AL1, 0 /SHIFT FAC LEFT ONE TAD ACO CLL RAL DCA ACO TAD WORD6 RAL DCA WORD6 TAD WORD5 RAL DCA WORD5 TAD WORD4 RAL DCA WORD4 TAD WORD3 RAL DCA WORD3 TAD WORD2 RAL DCA WORD2 JMP I AL1 / NUMERIC CONVERSION ROUTINE PAGE FPMUL, 0 /FLOATING MULTIPLY ROUTINE TAD WORD1 /COMPUTE NEW EXPONENT TAD OP1 DCA OP1 TAD WORD2 /SAVE AC MANTISSA DCA TW2 TAD WORD3 DCA TW3 TAD WORD4 DCA TW4 TAD WORD5 DCA TW5 TAD WORD6 DCA TW6 TAD (-74 /SET ITERATION COUNTER DCA ITRCNT DCA WORD2 /ZERO FAC MANTISSA DCA WORD3 DCA WORD4 DCA WORD5 DCA WORD6 DCA ACO MULLUP, JMS I (AR1 /SHIFT FAC RIGHT ONE TAD TW2 /SHIFT MULTIPLIER RIGHT CLL RAR DCA TW2 TAD TW3 RAR DCA TW3 TAD TW4 RAR DCA TW4 TAD TW5 RAR DCA TW5 TAD TW6 RAR DCA TW6 SZL JMS I (OADD /ADD IF LINK IS ONE ISZ ITRCNT /BUMP COUNT JMP MULLUP /LOOP TAD OP1 /PUT IN CORRECT EXPONENT DCA WORD1 JMS I (ANORM /NORMALIZE THE RESULT JMP I FPMUL TW2, 0 TW3, 0 TW4, 0 TW5, 0 TW6, 0 ANORM, 0 /NORMALIZE FAC TAD WORD2 /IS MANTISSA 0 ? SNA TAD WORD3 SNA TAD WORD4 SNA TAD WORD5 SNA TAD WORD6 SNA TAD ACO SNA CLA JMP ZEXP /YES, ZERO EXPONENT NORMLP, CLA CLL CML RTR /IS HIGH ORDER MANTISSA = 6000 TAD WORD2 SZA JMP NO6000 /NO, SKIP THIS STUFF TAD WORD3 /YES, IS THE REST 0 ? SNA TAD WORD4 SNA TAD WORD5 SNA TAD WORD6 SNA TAD ACO SZA CLA /SKIP IF 600000 ... 0000 NO6000, SPA CLA JMP I ANORM /NORM IS DONE WHEN BITS DIFFER JMS I (AL1 /SHIFT LEFT ONE CLA CMA /DECREMENT EXPONENT TAD WORD1 DCA WORD1 JMP NORMLP /LOOP ZEXP, DCA WORD1 JMP I ANORM NEGFAC, 0 /NEGATE FAC TAD (ACO /GET POINTER TO OPERAND DCA NFPTR TAD (-6 /SIX WORD NEGATE DCA NFCNT CLL NFLOOP, RAL TAD I NFPTR /GET NEXT WORD CLL CML CIA DCA I NFPTR /RESTORE AFTER COMPLEMENTING CML CLA CMA /LINK GETS COMPLEMENTED ONCE HERE TAD NFPTR /AND ONCE AGAIN HERE DCA NFPTR /RESTORE DECREMENTED POINTER ISZ NFCNT JMP NFLOOP JMP I NEGFAC NFPTR, 0 NFCNT, 0 ITRCNT, DHLRTH, 0 /HOLLERITH IN DATA SUBR ISZ TEMP SKP JMP I DHLRTH ISZ DHLRTH JMS I [GETCWB JMP DHOLER JMP I DHLRTH / VARIABLE SCANNER PAGE GETNAM, 0 /GET VARIABLE NAME JMS LETTER /FIRST CHAR MUST BE ALPHABETIC JMP I GETNAM /NO VARIABLE DCA BUCKET /FIRST ONE IS THE BUCKET TAD (NAME1 DCA NPTR /POINTER TO NAME BUFFER CLL CMA RTL /SIX CHARS MAX (3 WORDS) DCA NCNT PAKLUP, JMS LETTER /GET A LETTER SKP JMP .+3 /WE GOT IT JMS I [DIGIT /NO LETTER, IS IT A DIGIT ? JMP NDONE /NO, NAMES OVER CLL RTL RTL RTL /MOVE CHAR TO A HIGHER PLACE DCA I NPTR /STORE IT ISZ NCNT /BUMP COUNTER JMP MORNAM /MORE TO COME SKP NDONE, DCA I NPTR /ZERO NEXT WORD ISZ GETNAM /FIX RETURN ADDR JMP I GETNAM MORNAM, JMS LETTER /GET NEXT CHAR SKP JMP .+3 /ITS A LETTER JMS I [DIGIT JMP NDONE+1 /NO GOOD, NAMES OVER TAD I NPTR DCA I NPTR /COMBINE TWO CHARS ISZ NPTR JMP PAKLUP NPTR, 0 NCNT=OADD / DATA STATEMENT DATA, JMS I [IFCHEK /IF(..)DATA ???? TAD (DATAST /START DATA STATEMENT JMS I [OUTWRD DATLUP, CLA CMA /SET DIMNUM = -1 IF NO SUBSCRIPTS JMS I [GETSS /GET LIST ELEMENT JMP DATAER TAD (DPUSH /OUTPUT DPUSH OPERATOR JMS I [OUTWRD CMA TAD TEMP2 /FOLLOWED BY POINTER JMS I [OUTWRD TAD DIMNUM /FOLLOWED BY NUMBER JMS I [OUTWRD CDF 10 TAD I TEMP2 /LOOK AT TYE TYPE AND (20 /IS IT AN ARG ? CDF SZA CLA JMP DATAER /YES, THATS BAD JMS I [GETC /, ? JMP DATAER TAD (-254 SNA JMP DATLUP /LOOK FOR MORE TAD (254-257 // ? SZA CLA JMP DATAER JMP DLOOP2 /GO LOOK FOR ELEMENT DATA3, TAD (WORD1-1 DCA X10 /POINTER TO THE GOODS TAD I X10 /THEN STUFF JMS I [OUTWRD ISZ TEMP JMP .-3 NXTDE, TAD (ENDELM /OUTPUT END OF ELEMENT JMS I [OUTWRD JMS I [GETC /LOOK FOR COMMA JMP DATAER TAD (-254 SNA JMP DLOOP2 /YES, GET MORE DATA TAD (254-257 /SLASH ? SZA CLA JMP DATAER /NO, ERROR JMS I [GETC /ANOTHER DATA GROUP ? JMP I [NEXTST /NO TAD (-254 /COMMA ? SNA CLA JMP DATA+1 /START A NEW DATA STMT DATAER, JMS I [ERMSG 0401 /OK WHEN THIS IS AN AND JMP I [NEXTST DHOLER, JMS I [ERMSG 0410 /HOLLERITH DATA ERROR JMP I [NEXTST DQUOTE, 0 /GET CHAR FOR QUOTED DATA JMS I [GETCWB JMP DHOLER TAD [-247 SZA JMP DNOTQ2 JMS I [GETCWB JMP I DQUOTE TAD [-247 SNA CLA JMP DNOTQ2 /REPLACE '' BY ' JMS I [BACK1 JMP I DQUOTE DNOTQ2, TAD [247 /FIX CHAR ISZ DQUOTE JMP I DQUOTE OUT3WD, 0 /2.02/ OUTPUT 3 WORDS TAD [DATELM /2.02/ OUTPUT ELEMENT HEAD JMS I [OUTWRD /2.02/ TAD (3 /2.02/ AND SIZE JMS I [OUTWRD /2.02/ TAD WORD1 /2.02/ NOW THREE WORDS JMS I [OUTWRD /2.02/ TAD WORD2 /2.02/ JMS I [OUTWRD /2.02/ TAD WORD3 /2.02/ JMS I [OUTWRD /2.02/ JMP I OUT3WD /2.02/ / DATA STATEMENT PAGE DLOOP2, JMS I [GETC JMP DATAER TAD (-250 /IS CHAR ( ? SZA JMP NOCMPD /NO, NOT COMPLEX DATA JMS I [NUMBER /GET REAL PART JMP DATAER SKP JMP DATAER /DP IS NG WITH COMPLEX JMS OUT3WD /2.02/ OUTPUT 3 WORDS JMS I [CHECKC /LOOK FOR COMMA -254 JMP DATAER /BAD IF NOT THERE JMS I [NUMBER /GET IMAGINARY PART JMP DATAER SKP JMP DATAER JMS I [CHECKC /LOOK FOR ) -251 JMP DATAER /NOT THERE JMP DATAFP /GO MOVE IMAGINARY PART NOCMPD, IAC /IS IT QUOTED STRING ? SZA JMP NQUOTD /NO TAD (DQUOTE /GET SUBR ADDRESS JMP HOLDAT /GO HANDLE IT NQUOTD, TAD (247-317 /IS IT AN O (OCTAL) SNA JMP I (XOCTAL /YES TAD (317-256 /IS IT . SNA CLA JMS I (TRUFAL /CHECK FOR TRUE OR FALSE JMP NOTF /NO TRUE-FALSE, TRY NUMBER CLL CML RTR /2000 DCA WORD2 TAD WORD2 SZA CLA IAC DCA WORD1 /TRUE=1.0 FALSE=0.0 DCA WORD3 JMP DATAFP /GO PUT IT NOTF, JMS I [BACK1 /PUT BACK CHAR JMS I [NUMBER /TRY FOR A NUMBER JMP DATAER /ELEMENT MISSING JMP TRYHOS /IF INTEGER, TRY FOR H OR * TAD (-3 DATAFP, TAD (-3 /FP DATA DCA TEMP /SIZE OF ITEM TAD [DATELM /DATA ELEMENT SIGNAL JMS I [OUTWRD TAD TEMP /THEN SIZE CIA /ALWAYS POSITIVE JMS I [OUTWRD JMP DATA3 /GO OUTPUT THE DATA TRYHOS, JMS I [GETC /LOOK FOR H JMP DATAER TAD (-310 SZA JMP TRYSTR /NOT H, MAYBE ITS * JMS I [FIXNUM /INTEGERIZE IT SNA JMP DHOLER /HOLLERITH DATA ERROR CMA DCA TEMP /SAVE COUNT TAD (DHLRTH /GET SUBR POINTER HOLDAT, DCA HCHAR CLL CMA RTL /2.02/ COUNT DCA TEMP2 /2.02/ BY THREES TAD (WORD1-1 /2.02/ DCA X10 /2.02/ POINTER HDLOOP, JMS I HCHAR /GET A CHAR JMP EOHD /2.02/ AND [77 /6 BITIZE IT CLL RTL RTL RTL /UPPER-PART-OF-WORDIZE DCA WORD3 /2.02/ STORAGIZE IT JMS I HCHAR /GET ANOTHER JMP LASTHD /LAST HALF WORD MUST GO OUT AND [77 TAD WORD3 /2.02/ COMBINIZE THE TWO HALVES DCA I X10 /2.02/ STORE IT ISZ TEMP2 /2.02/ THREE AT A TIME JMP HDLOOP /2.02/ JMS OUT3WD /2.02/ OUTPUT THREE JMP HOLDAT+1 /2.02/ GO DO NEXT THREE WDS EOHD, CLL CML RTL /2.02/ ANY CHARS IN THIS SET ? TAD TEMP2 /2.02/ SPA CLA /2.02/ JMP NXTDE /2.02/ NO, DO NEXT ELEMENT JMP .+4 /2.02/ YES, FILL IT OUT LASTHD, TAD WORD3 /2.02/ FILL OUT LOWER CHAR TAD (40 /2.02/ WITH A BLANK DCA I X10 /2.02/ TAD (4040 /2.02/ THEN FILL REST DCA I X10 /2.02/ WITH BLANKS TAD (4040 /2.02/ DCA I X10 /2.02/ JMP DATAFP /2.02/ GO OUTPUT IT TRYSTR, TAD (310-252 /* SNA CLA JMP .+3 JMS I [BACK1 /PUT BACK THAT CHAR JMP DATAFP /ITS JUST AN INTEGER TAD (DREPTC /REPETITION COUNT JMS I [OUTWRD JMS I [FIXNUM JMS I [OUTWRD /OUTPUT COUNT JMP DLOOP2 /LOOP / INITIALIZE READ IN *6400 INITLN, TAD IX7772 /READ FIRST SIX CHARS DCA TEMP TAD IXLINM DCA CHRPTR INITLP, CIF 10 JMS I [ICHAR /READ A CHAR JMP INITLN TAD IXM211 /TAB ? SZA CLA JMP NIXTAB /NO THIS ONE TAD IX0240 DCA I CHRPTR ISZ TEMP JMP .-3 JMP CHKCOM /DO COMMENT CHECK NIXTAB, TAD CHAR DCA I CHRPTR /STORE THE CHAR ISZ TEMP JMP INITLP CHKCOM, TAD I IXLINE /COMMENT ? TAD IXM303 SNA CLA JMP IGNORE /IGNORE IT TAD I IXLNP5 /CONTINUATION ? TAD IXM240 SZA CLA JMP IGNORE TAD IX7700 /FIX CALL CDF 10 /SEE WHAT HAPPENS WHEN YOU MOVE A ROUTINE** DCA I IXINCL CDF /** CIF 10 JMS I IX200 /REMOVE MONITOR 11 CDF 10 /FIX FIELD ONE STUFF TAD I MOV1 DCA I MOV2 ISZ MOV1 ISZ MOV2 ISZ MOVCNT JMP .-5 CDF JMP I IXRDFS /LOOK FOR PROG HEADER MOV1, 2020 MOV2, 20 MOVCNT, -160 IGNORE, CIF 10 /** JMS I [ICHAR /SKIP TILL CARRIAGE RETURN JMP INITLN CLA JMP IGNORE IXRDFS, RDFRST IXINCL, INCALL IXM240, -240 IXM303, -303 IX0240, 0240 IX200, 200 IX7600, 7600 IX7772, 7772 IXM211, -211 IX7700, 7700 /V3C / SEARCH FOR PROGRAM HEADER PAGE RDFRST, CIF 10 /** JMS I [ICHAR /THIS IS A DUPLICATE OF THE CODE JMP ENDLNF /AT LABEL 'RDLOOP' , ONLY THE TAD (-211 SNA TAD (240-211 TAD (211 DCA I CHRPTR /NAMES HAVE BEEN CHANGED TO ISZ CNT72 SKP JMP SKPFL2 TAD CHRPTR /PROTECT THE ASSEMBLY CIA CLL /(IT GETS THE FIRST LINE TAD (LINE+270 /WHICH MAY BE SUBROUTINE OR /FUNCTION. 1ST LINE SHORTER THAN REST BEC OF BUFFER OVERWRITES** SZL CLA /OR SOMETHING ELSE, IN WHICH CASE JMP RDFRST /ITS THE MAIN PROGRAM) JMS I [ERMSG /LINE TOO LONG 1424 JMP SKPFL /SKIP REST SKPFL2, CIF 10 /** JMS I [ICHAR JMP ENDLNF CLA JMP SKPFL2 SKPCMF, TAD X16 /BY ORDER OF THE EMPEROR DCA CHRPTR /MARIO DE NOBILI ENDLNF, TAD CHRPTR DCA X16 TAD CHRPTR DCA X10 TAD (-102 DCA CNT72 TAD (-6 DCA NCHARS GET6F, CIF 10 /** JMS I [ICHAR JMP SKPCMF TAD (-211 SZA CLA JMP NOTABF TAD (240 DCA I CHRPTR ISZ NCHARS JMP .-3 TAD (240 DCA CHAR JMP CCHEKF NOTABF, TAD CHAR DCA I CHRPTR ISZ NCHARS JMP GET6F CCHEKF, TAD I X10 TAD (-303 SZA CLA JMP NOCMTF SKPFL, CIF 10 /** JMS I [ICHAR JMP SKPCMF CLA JMP SKPFL NOCMTF, TAD CHAR TAD (-240 SNA CLA JMP GOTFST CCARDF, TAD X16 DCA CHRPTR JMP RDFRST GOTFST, TAD CHRPTR CIA TAD (LINE+4 DCA NCHARS TAD [LINE-1 DCA CHRPTR JMS I [SAVECP TAD (HDRLST-1 DCA X10 /PREPARE TO SEARCH THE LIST CLOOP1, CDF 10 /(FNC NAMES UP IN FLD 1)** TAD I X10 /OF LEGAL HEADER LINES CDF SZA /CODE IS AS UNDER 'CMDLUP' JMP CLOOP2 CLA CMA RAL TAD STACK DCA STACK CDF 10 /** TAD I X10 CDF DCA TEMP JMP I TEMP CLOOP2, DCA TEMP JMS I [GET2C JMP BADCMF CIA TAD TEMP SNA CLA JMP CLOOP1 SEARCH, CDF 10 /** TAD I X10 CDF SZA CLA JMP SEARCH ISZ X10 JMS I [RESTCP ISZ STACK ISZ STACK CDF 10 /** TAD I X10 CDF SZA JMP CLOOP2 BADCMF, JMS I [RESTCP /NOT A FUNCTION OR SUBROUTINE JMP I (LINE1 /SO GO TO MAIN PART OF COMPILER BADDIE, JMS I [MESSAG /SOMETHING MISSING FROM SYS 323 /S 331 /Y / ANALYZE PROGRAM HEADER PAGE SUBRTN, CLA CMA /SET TO -1 FOR SUBR JMP XXXFUN+1 REAFUN, TAD (102 /SET TYPE TO REAL DCA TYPE JMP XXXFUN LOGFUN, IAC /SET TYPE OF FUN DBLFUN, IAC /WITH DOUBLEMINT GUM ! CMPFUN, IAC IAC INTFUN, TAD (101 DCA TYPE JMS I [CHECKC /LOOK FOR 'N' -316 JMP BADBGN XXXFUN, CLA IAC DCA FUNCTN /SET SWITCH CDF 10 /1.05/ KILL ENTRY FOR 'MAIN' DCA I (ALIST+14 /1.05/ BUT DO IT BEFORE THE M BUCKET CDF /1.05/ CONTAINS ANYTHING USEFULL JMS I [GETNAM /GET FUNC/SUBR NAME JMP BADBGN JMS I [LOOKUP /PUT INTO SYMBOL TABLE DCA PROGNM TAD PROGNM /SET UP TYPE IAC DCA TEMP TAD STACK DCA X12 /SAVE POINTER DCA TEMP2 /ZERO ARG COUNTER CDF 10 TAD TYPE /PUT IN THE TYPE BITS TAD (1000 DCA I TEMP CDF JMS I [CHECKC /LOOK OFR ( -250 JMP ISITFN /IS IT A FUNCTION ? ARGLUP, JMS I [GETNAM /GET THE ARG JMP BADBGN JMS I [LOOKUP IAC DCA TEMP /ADDR OF TYPE WORD CDF 10 TAD I TEMP SZA CLA JMP BADBGN /ALREADY AN ARG TAD (20 DCA I TEMP CDF CMA TAD TEMP /OUTPUT ADDR OF ARG JMS I [PUSH ISZ TEMP2 /KEEP COUNT JMS I [COMARP /LOOK FOR , OR ) JMP BADBGN /NEITHER JMP ARGLUP /, TAD TEMP2 /) HOW MANY ARGS ? CDF 10 DCA I NEXT /INTO ARG LIST TAD TEMP2 CIA DCA TEMP2 TAD NEXT /SAVE ADDR OF ARG LIST DCA ARGLST CDF TAD X12 /RESTORE THE STACK DCA STACK MOVARG, TAD I X12 /PUT ARGS INTO ARG LIST CDF 10 DCA I NEXT CDF ISZ TEMP2 JMP MOVARG JMP I [NEXTST /DO NEXT LINE TYPE=WORD6 ISITFN, TAD FUNCTN /IS IT A FUNCTION SPA SNA CLA /WITH NO ARGS ? JMP I [NEXTST /NO, WE'RE OK BADBGN, JMS I [ERMSG 2010 JMP I [NEXTST BDATA, JMS I [CHECKC /LOOK FOR A -301 JMP BADBGN CLL CMA RAL /SET FUNCTION SWITCH DCA FUNCTN /2.02/ STORE IT DUMMY!! TAD (BDLIST-1 /POINTER TO LIST OF PATCHES DCA X10 BDLOOP, CDF 10 TAD I X10 /GET PATCH LOCATION CDF SNA JMP I [NEXTST /NO MORE PATCHES DCA TEMP /SAVE PATCH ADDRESS TAD BADJMP /GET ERROR JUMP DCA I TEMP /STORE IT JMP BDLOOP /LOOP BADJMP, JMP I [BDERR / INITIAL SYMBOL TABLE FIELD 1 *2020 NOPUNC *20 ENPUNC 0 BLNKCN, 111;0 /BLANK COMMON SLOT ALIST, 0;0;0;0;0;0;0;0;0;0;0;0;MAIN;0;0;0;0;0;0;0;0;0;0;0;0;0 HOLIST, 0 FPLIST, 0 DPLIST, 0 INTLST, ONE CMPLST, 0 SNLIST, 0 ONE, THREE;0;1;2000;0 THREE, SIX;0;2;3000;0 SIX, 0;0;3;3000;0 TRUE, 0;0145;0 MAIN, 0;1000;0;0111;1600 FREE, 0 / BLOCK DATA PATCH LIST BDLIST, IF /BLOCK DATA PATCH LIST DOUBLE DO GOTO CALL READ REWIND ENDFIL FORMAT WRITE BACKSP ASSIGN STOP PAUZE DFINFL FIND ITSAR 0 / INITIALIZATION *2200 START, SKP /NON-CHAINED ENTRY POINT JMP .+5 /CCL ENTRY CIF CDF 10 /START HERE JMS I (200 /COMMAND DECODE 5 0624 /DEFAULT EXT IS .FT TAD I L7600 /IS AN OUTPUT FILE GIVEN ? SNA CLA JMP MYFILE /NO, USE FORTRN.TM MOVOFN, TAD I OFNAME /MOVE NAME INTO PAGE 0 CDF DCA I NAMEOF CDF 10 ISZ NAMEOF ISZ OFNAME ISZ OFNSIZ JMP MOVOFN EXTEST, TAD I (7604 /SET DEFAULT EXTENSIONS SZA JMP EXTSET TAD I (7643 SPA JMP GETRA /A WAS SET.USE RA AND L41 /CHECK FOR L+G SNA CLA TAD (0610 /USE RL TAD (1404 /USE LD EXTSET, DCA I (7604 TAD I (7604 CDF 0 DCA I NAMF CDF 10 TAD I (7611 SNA TAD (1423 /.LS FOR LISTING DCA I (7611 TAD I (7616 SNA TAD (1520 /.MP FOR LOAD MAP DCA I (7616 EFILE, CLA IAC /OPEN PASS1 OUTPUT FILE JMS I (200 3 OBLOK, TMPFL2 OSIZE, 0 JMP OBAD /BADDIE CDF TAD OBLOK /SAVE STARTING BLOCK DCA OUBLOK TAD OBLOK DCA I (OUFILE TAD OSIZE DCA OULEN CDF 10 CLA IAC JMS I (200 /GET PASS2 2 SPASS2, PASS2N 0 JMP OBAD CLA IAC JMS I (200 2 SP2O, PAS2ON /GET PASS2 OVERLAY 0 JMP OBAD CDF /SAVE PASS2 AND PASS2O BLOCKS TAD SPASS2 DCA PASS2B TAD SP2O /SKIP FIRST BLOCK IAC /ITS THE CORE TABLE DCA I (PASS2O CIF JMP INITLN /GO START COMPILE MYFILE, CDF /PUT DEFAULT INTO 17600 TAD I NAMOF DCA I NAMEOF TAD I NAMOF /ALSO INTO PAGE 0 CDF 10 DCA I OFNAME ISZ NAMOF ISZ NAMEOF ISZ OFNAME ISZ OFNSIZ JMP MYFILE CLA IAC /SET DEV TO SYS DCA I L7600 JMP EXTEST /GO OPEN FILE OBAD, CIF CDF JMP BADDIE OFNAME, 7601 /IGNORE DEVICE (ALWAYS USE SYS) NAMEOF, TMPFIL+4 NAMOF, TMPFIL OFNSIZ, -3 TMPFL2, 0617;2224;2216;2415 /FORTRN.TM PASS2N, 2001;2323;6200;2326 /PASS2.SV PAS2ON, 2001;2323;6217;2326 /PASS2O.SV NAMF, TMPFIL+7 L7600, GETRA, 7600 /CLA TAD (2201 /V3C USE RA JMP EXTSET L41, 41 PAGE / PROGRAM HEADER LIST HDRLST, TEXT 'INTEGERFUNCTIO' INTFUN TEXT 'REALFUNCTION' REAFUN TEXT 'COMPLEXFUNCTIO' CMPFUN TEXT 'DOUBLEPRECISIONFUNCTIO' DBLFUN TEXT 'LOGICALFUNCTIO' LOGFUN TEXT 'FUNCTION' XXXFUN TEXT 'SUBROUTINE' SUBRTN TEXT 'BLOCKDAT' BDATA 0 / PS-8 FILE INPUT ROUTINES /NEED TWO PAGES BEC. MOVING ICHAR OUT OF FIELD 1 REQUIRES /ALOT OF FIELD DIDDLING. *5400 MORCHR, TAD (214 /FIX CHAR CDF 0 /** DCA I QCHAR CDF 10 TAD I (ICHAR IAC /UPDATE ADDR DCA TCHAR CIF CDF 0 TAD I QCHAR /RETURN VALUE IN AC JMP I TCHAR TCHAR, 0 QCHAR, CHAR / EXTENDED OPERATOR LIST OPRLST, -01;-1604;ANDOPR -17;-2200;OROPR -05;-2100;EQOPR -16;-0500;NEOPR -07;-0500;GEOPR -07;-2400;GTOPR -14;-0500;LEOPR -14;-2400;LTOPR -30;-1722;XOROPR -05;-2126;EQVOPR 0 / EXPONENT TABLE PETABL, 0004;2400;0000 /1E1 0000;0000;0000 0007;3100;0000 /1E2 0000;0000;0000 0016;2342;0000 /1E4 0000;0000;0000 0033;2765;7020 /1E8 0000;0000;0000 0066;2160;6744 /1E16 6770;1000;0 0153;2356;1326 /1E32 6501;2670;2655 0325;3023;6017 /1E64 5117;7747;6466 0652;2235;6443 /1E128 7114;0164;6145 1523;2523;7565 /1E256 7734;7374;7357 3245;3430;6320 /1E512 2565;1407;2176 ENDSTM, 211;"E;"N;"D;215;211;215;232 /V3C /FAKE END STATEMENT USED IF PROGRAM HAS NONE PAGE /MAIN PART OF OS/8 INPUT ROUTINES ICHAR, 0 /READ CHAR FROM INPUT FILE CDF 10 ISZ INJMP /BUMP THREE WAY UNPACK SWITCH ISZ INCHCT INJMPP, JMP INJMP / CDF ** TAD INEOF /DID LAST READ YEILD END OF FILE ? SNA CLA JMP INGBUF /NO, DO ANOTHER READ GETNEW, JMS INNEWF /OPEN A NEW INPUT FILE JMP ENDIN /END OF INPUT INGBUF, TAD INCTR /BUMP RECORD COUNTER CLL IAC SNL DCA INCTR /RESTORE IF IT HASN'T OVERFLOWED SZL ISZ INEOF /SET END OF FILE SWITCH CDF 10 /** CIF 0 /** JMS I INHNDL /DO THE READ 0210 /ONE BLOCK TO FIELD 1 INBUFP, INBUF INREC, 0 JMP INERR /HANDLER ERROR INBREC, ISZ INREC /BUMP RECORD NUMBER TAD INBUFP /RESET BUFFER POINTER SVIBPT, DCA INPTR /V3C TAD (-601 /SET CHAR COUNT DCA INCHCT TAD INJMPP /RESET THREE WAY JUMP SWITCH DCA INJMP JMP ICHAR+1 /GO AGAIN INERR, ISZ INEOF /EITHER EOF OR BADDIE SMA CLA JMP INBREC /END OF FILE, DO NEXT FILE JMP TERR /INPUT ERROR, GIVE I F AND EXIT ENDIN, TAD (ENDSTM /V3C IF NO END STATEMENT, FORCE ONE JMP SVIBPT /ENDIN, TAD INCALL /END OF INPUT IS USR IN CORE ? / TAD (-200 / CIF 0 /** / SZA CLA / JMP I (ENDX /NO, ITS END OF PROG TERR, JMS I (MESSAG /YES, BAD INPUT. WAS SQ.BRCK** 311 306 INJMP, HLT /3 WAY CHAR UNPACK BRANCH JMP ICHAR1 JMP ICHAR2 ICHAR3, TAD INJMPP /RESET JUMP SWITCH DCA INJMP TAD I INPTR AND (7400 /COMBINE THE HIGH ORDER BITS CLL RTR /OF THE TWO WORDS RTR TAD INTMP /TO FORM THE THIRD CHAR RTR RTR ISZ INPTR /BUMP WORD POINTER JMP ICHAR1+1 /DO SOME COMMON STUFF ICHAR2, TAD I INPTR /SAVE THE HIGH ORDER BITS AND (7400 DCA INTMP /FOR THE THIRD CHAR ISZ INPTR /GO TO THE SECOND WORD ICHAR1, TAD I INPTR /GET THE LOW 8 BITS / CDF AND (177 /AND I MEAN ONLY 8 !! SNA /V3C YOU WERE WRONG - YOU MEANT ONLY 7 JMP ICHAR+1 TAD (-32 /IS IT ^Z (END OF FILE) SNA JMP GETNEW /YES, LOOK FOR THE NEXT FILE TAD (232-212 SNA JMP ICHAR+1 /IGNORE LINE FEEDS TAD (212-215 SNA JMP ICHARN /RETURN ON CARRIAGE RETURN ** IAC SNA JMP ICHAR+1 /IGNORE FORM FEEDS JMP I (MORCHR /** ICHARN, CIF CDF 0 JMP I ICHAR INTMP, 0 INFPTR, 7617 /POINTER TO INPUT FILE LIST INEOF, 1 INCHCT, INNEWF, -1 /FETCH HANDLER FOR NEXT FILE CDF 0 /** TAD (INDEVH+1 /THIS IS WHERE IT GOES ** DCA INHNDL CDF 10 TAD I INFPTR /GET NEXT INPUT FILE INFO SNA JMP I INNEWF /NO MORE FILES CDF 10 /WAS CIF 10** JMS I INCALL /CALL MONITOR 1 /FETCH HANDLER INHNDL, 0 /ENTRY ADDR GOES HERE JMP INERR+3 /THIS CAN'T HAPPEN HERE TAD I INFPTR /GET LENGTH AND (7760 SZA /A ZERO HERE MEANS >=256 BLOCKS TAD (17 /PUT IN SOME MORE BITS CLL CML RTR RTR DCA INCTR /STORE LENGTH OF FILE ISZ INFPTR TAD I INFPTR /GET STARTING RECORD NUMBER DCA INREC ISZ INFPTR DCA INEOF /CLEAR EOF FLAG ISZ INNEWF JMP I INNEWF INCTR, 0 INCALL, 200 /CHANGED TO 7700 AFTER FIRST TIME INPTR, 0 PAGE / KEYWORD LIST CMDLST, -1106;0;IF /IF -0417 -2502 -1405 -2022 -0503 -1123 -1117;0;DOUBLE /DOUBLE PRECISION -0417;0;DO /DO -0717 -2417;0;GOTO /GOTO -0317 -1515 -1716;0;COMMON /COMMON -0317 -1520 -1405;0;COMPLE /COMPLEX -0317 -1624 -1116 -2505;0;NEXTST /CONTINUE -0301 -1414;0;CALL /CALL -2205 -0114;0;REAL /REAL -2205 -0104;0;READ /READ -2205 -2711 -1604;0;REWIND /REWIND -2205 -2425 -2216;0;RETURN /RETURN -0516 -0406 -1114;0;ENDFIL /ENDFILE -0516;0;XEND /END -0411 -1505 -1623 -1117;0;DIMENS /DIMENSION -0401 -2401;0;DATA /DATA -0617 -2215 -0124;0;FORMAT /FORMAT -2722 -1124;0;WRITE /WRITE -0521 -2511 -2601 -1405 -1603;0;EQUIV /EQUIVALENCE -0405 -0611 -1605 -0611 -1405;0;DFINFL /DEFINEFILE -1116 -2405 -0705;0;INTEGE /INTEGER -1417 -0711 -0301;0;LOGICA /LOGICAL -0530 -2405 -2216 -0114;0;EXTERN /EXTERNAL -0201 -0313 -2320 -0103;0;BACKSP /BACKSPACE -0123 -2311 -0716;0;ASSIGN /ASSIGN -2001 -2523;0;PAUZE /PAUSE -2324 -1720;0;STOP /STOP -0611 -1604;0;FIND /FIND 0 /END OF LIST $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | $JOB FORGEN.BI ASSEMBLE OS8 FORTRAN IV. /SCRE: is the input device and must be assigned here, / replace "C" with the input device name. /}ASSIGN C SRCE }PAL F4<SRCE:F4 }LOAD F4 }SA SYS F4.SV;12200=100 }PAL PASS2<SRCE:PASS2 }LOAD PASS2 }SA SYS PASS2.SV;5000=100 }PAL PASS2O<SRCE:PASS2O,PASS2 }LOAD PASS2O }SA SYS PASS2O.SV;7605=100 }PAL PASS3<SRCE:PASS3 }LOAD PASS3 }SA SYS PASS3.SV;400=100 }PAL LOAD<SRCE:LOAD }LOAD LOAD }SA SYS LOAD.SV;200=100 }PAL FRTS<SRCE:RTS,RTL/W/K }LOAD FRTS }SA SYS FRTS.SV;200=100 }PAL RALF<SRCE:RALF/W }LOAD RALF }SA SYS RALF.SV;200=100 }PAL LIBRA<LIBRA }LOAD LIBRA }SAVE SYS:LIBRA.SV;200=100 $END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | $JOB (FORLIB.BI) Assemble and link the FORTRAN library /.ASSIGN XXX SRCE where XXX is the device containing the source files /.ASSIGN YYY TARG where YYY is the output device for the .SV files / NOTE: XXX and YYY must be different devices. .R RALF *ABS.RL<SRCE:ABS.RA .R RALF *ASIN.RL<SRCE:ASIN.RA .R RALF *ATAN.RL<SRCE:ATAN.RA .R RALF *EXP.RL<SRCE:EXP.RA .R RALF *IFIX.RL<SRCE:IFIX.RA .R RALF *SINH.RL<SRCE:SINH.RA .R RALF *AMOD.RL<SRCE:AMOD.RA .R RALF *COSH.RL<SRCE:COSH.RA .R RALF *ACOS.RL<SRCE:ACOS.RA .R RALF *ONQIB.RL<SRCE:ONQIB.RA .R RALF *SIGN.RL<SRCE:SIGN.RA .R RALF *TANH.RL<SRCE:TANH.RA .R RALF *EXPII.RL<SRCE:EXPII.RA .R RALF *LTR.RL<SRCE:LTR.RA .R RALF *SIN.RL<SRCE:SIN.RA .R RALF *TAN.RL<SRCE:TAN.RA .R RALF *ALOG.RL<SRCE:ALOG.RA .R RALF *AMIN.RL<SRCE:AMIN.RA .R RALF *EXP3.RL<SRCE:EXP3.RA .R RALF *COS.RL<SRCE:COS.RA .R RALF *CHKEOF.RL<SRCE:CHKEOF.RA .R RALF *RFDV.RL<SRCE:RFDV.RA .R RALF *RFCV.RL<SRCE:RFCV.RA .R RALF *PAUSE.RL<SRCE:PAUSE.RA .R RALF *CLK8A.RL<SRCE:CLK8A.RA .R RALF *AMAX.RL<SRCE:AMAX.RA .R RALF *ATAN2.RL<SRCE:ATAN2.RA .R RALF *SQRT.RL<SRCE:SQRT.RA .R RALF *XFIX.RL<SRCE:XFIX.RA .R RALF *ALOG10.RL<SRCE:ALOG10.RA .R RALF *DIM.RL<SRCE:DIM.RA .R RALF *EXPIR.RL<SRCE:EXPIR.RA .R RALF *CHARS.RL<SRCE:CHARS.RA .R RALF *DATE.RL<SRCE:DATE.RA .R RALF *FLOAT.RL<SRCE:FLOAT.RA / /LINK THE LIBRARY: / .R LIBRA *TARG:FORLIB.RL</Z/C *ABS,SIGN,AMIN,AMAX,DIM,EXP,EXP3,SIN,COS/C *TAN,TANH,SQRT,ASIN,ACOS,ATAN,FLOAT,CHARS,CHKEOF/C *ALOG10,DATE,ATAN2,IFIX,SINH,ALOG,COSH,AMOD,LTR/C *EXPII,RFCV,RFDV,PAUSE,EXPIR,XFIX,CLK8A,ONQIB/C *,LIBRA.LS< / /cleanup sys / .DELETE ABS.RL,SIGN.RL,AMIN.RL,AMAX.RL,DIM.RL .DELETE EXP.RL,EXP3.RL,SIN.RL,COS.RL .DELETE TAN.RL,TANH.RL,SQRT.RL,ASIN.RL,ACOS.RL .DELETE ATAN.RL,FLOAT.RL,CHARS.RL,CHKEOF.RL .DELETE ALOG10.RL,DATE.RL,ATAN2.RL,IFIX.RL,SINH.RL .DELETE ALOG.RL,COSH.RL,AMOD.RL,LTR.RL .DELETE EXPII.RL,RFCV.RL,RFDV.RL,PAUSE.RL,EXPIR.RL .DELETE XFIX.RL,CLK8A.RL,ONQIB.RL $END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | (REMARK Image File Created by PDP-8) (REMARK File Date: 21-Apr-1973) (FILE FORLIB.RL) <0081814G08I114O00010896000000J4HPO0000H5693JG0000J94TG00082D4JM400039> <4TG00000D4JM4000004Q1CC00020J85HH0000Q1CC00000385HH0000044J800000H489> <6G00002M20000008AO8CO00014P4S00000437KO00000IG2E000002A09OG000096H950> <00010ACIE0000411JQC0000G581700002331S2K0008680KIC0010P02I0000033HAG00> <000D0LA000001I1CAF30082C7HU700110585000041A09R4000H4C9C000020I9P80000> <0IEA0000004P4S800004163OS0000GCUJ4000020J9S800008QF20000008PH8I000053> <2K8000004CS5000000HHOK0000026C2G000008OT80000013650000004CAO829402HKG> <O6M000A6N30QO0008Q8C4B0005380AL6500KCAO82A802HHH5G000096P70O0001GPGU3> <5G00131J14SK002GID2G00007JI4I00008UE8GG0000FVS00X0006X000000O3400000I> <114O00020600I0GIC0000041GX0007X00FA40O00001084001HG7K001OO36001042SG4> <C1P080A60J0CG803GGA01G0000000040000401X00F200O3400001693JG00020602A4K> <P4EE00041G0AO0000000000000000G0401X00F740O000030CGO0AP0600018839I8ST0> <G20C00041060002CG30001C81G001660P1G06H0K0000000030H0O3Q002I40GG0O34G0> <04C1I900D2284200CG0E8P08SHI100KC260P2G12104C160P2G13J0CGO0A8G260J0CH8> <0A8G201J0CGO0A80000G0401X00DG00O34000002D4JM00020602B0J94TH00041G001K> <IEO000010C03QD4JM400008300UG0000X0004X00EU40O000030CI00GOGC11G0406106> <822430F800AOG460KG0O3A003G45G84010280608G88003K68202HG4O3Q003KC1K901D> <60OG00T30D0O0APG68K04S8202008C1I301B210060400G0360P1G0LH0G063K68202J0> <C800EGG2M0J0CGG06PG68C0308500004000000060P4011H0823001G68C00G88X0009X> <00CO00O34000002D0M600020602B0J85HH00041G001K2OO000010C03QD0M640000830> <0UG0000X0004X00EU40O000030CI00GOGC11G0406106822430F800AOG460KG0O3A003> <G45G84010280608G88003K68202HG4O3Q003KC1K901D60OG00T30D0O0APG68K04S820> <2008C1I301B210060400G0360P1G0LH0G063K68202J0C800EGG2M0J0CG806PG68C030> <8500004000000060P4011H0823001G68C00G88X0009X00CO00O3400000896G0000206> <01B4H14Q000041G04O0000000000000000G0401X00F740O000030CGO04P0600018G30> <000Q81G000G40O0009H0806121G7K005481101G690008O34I00K4508400P00SHI0HP3> <42018O2M130CG80A8G20130CGO0A80000G0401X00E900O3400000AO80000020603VHG> <A8E5900820X0007X00FA40O000030CGO0F0G80000000001G900000832M2210G30CI00> <4HG69401S8OX000I00A000000900001060004S81081G68C01C81001G68C05C8H012FK> <C1FVH3FKRO0LCM0SC07ATLE200LOL8T01G8GC1T001B20880C1I800I60P4G07H142100> <E8064CG00530041VVJ0CG80KOGA01G8000H3M84C1I700625G0HI200G0350M8521CGCK> <DP188OQ2KG8KAP188N21QGK42D1C8EA330F8000OG4030GGO3M000440G0KO38007M40G> <GOO3E0006C1I301B60OG001J0CGO0AO0000G0401X00AO00O3400000AO8CO00020602M> <HGA8E59008200004OF3G00020K0005C4000000G600000000X0004X00EU40O000030CG> <O0A9G900000832M2370G30CI003HG69401C8F080000000000X000700A000020C0008O> <G20G30CGO01OG20030CGO09OG4030H0O3Q002E40GG0O34G00SC1I900B2284200SG0C8> <P0GSHI1G0KC260P000JH0B4230PG6800AC82P0O84C1I50026195G0030CGO0IPG68C02> <482H0U84C32B00060P1G0JJ0CGO048G22230CGO09O0000G0401X00CB00O3400001697> <00000206047HGA8E5900820X0007X00FA40O000030CGO0E1G900000839I9Q10G30CI0> <03HG69401C8OX000C00A0000005I8FR804P47TK03CI3UQ81G001320820C1I30072080> <0C1I301724FV8L0U1NVPMD5KRVUL36NI005DA46FV1000000C2430F8009OG22030CI00> <3HG69401C890G803I01H340018O010FVSO34C052C1I001720O0610000O34E00444MGV> <420200801IGA47P0Q8CC1I503321U860C00D4404086I2J0CH80QGGA234GF4310Q8SC1> <I603K20886C1K001720806C1I301723G86Q2SGE43P0K8KA5OG8KCH0H8R212GM4360Q0> <00JH040360P1G0JG0001X00AF00O34000006F9G000020601V9I9O00000820X0007X00> <FA40O000030CGO09OG637KS21060P400630CI8028GO0G00000X000600B4GVMI0C0008> <8G20G30CGO018G20030CGO098G4030H0O3Q002A40GG0O34G00OC1I90092284200SG0C> <8P000A602GF426115G0030CGO099G68C01S00X00DK00O34000018170000020602EHGA> <8E5900820000CUJ0000020K000J4JG00000G600000000X0004X00EU40O000030CGO0A> <9G90000083A09Q10G30CI003HG69401C8C080000000000X000740O000HH041060P1G0> <3H040060P1G0JH0806121G7K004S81101G69001OO34I00M43G8401P00OHI000KC060P> <000JH07426195G0030CGO0GHG68C024O34000440SGCO64M000C1I302B60P1G08H05K3> <60P1G0JG0001X00CQ00O3400001817200002060281JQCG0000820002CIE4000020K00> <00000000X0003X00F440O000030CGO09OG6K0JH21060P400630CI8028GO0G00000X00> <0940O000GH041060P1G02H040060P1G0IH0806121G7K004K81101G69001GO34I00I44> <08401P00OHI000KC0P0HG89C000O34603SC1I300F20E86C2IB00060P1G12J0CGO03OG> <2Q1J0CGO0980000G0401X00D200O34000016H95000020604HHGA8E5900820X0007X00> <FA40O000030CGO0F0GE0000000X000302PG900000839KA990G30CI0059G6940288LX0> <00F00A000000900001060005881081G68C01O81001G68C05O8E003800000150007VUJ> <BVVBVVDG000030H0O3Q002S40GG0O34G01AC1I900I21O4200SG0C8P000A6030CG00BH> <G68K014O3Q000AC1H000660UG00130C80010G20430CG0130GG024GLK6P0G0G024GA46> <60P0G1J10G0304A8A0430F8000OG6210134260OG002H074360SGG0O30CO80DGGJI20G> <DK45138DI20GDK4511G7K000K8201G04C1T000320884C1R00042080AC1H000560P1G0> <N10D45P0G06C1I30360000200G0401X009Q00O34000002J4JG000206033HGA8E59008> <20002D2IA000020K0001A09O0000G600000000X0004X00EU40O000030CGO0B9G64003> <OO3I001AC1I301B20O5697840O34G014C1I900F24G200000000X000800A0000005I8F> <R9060004S81081G68C01C81001G68C05C8201G8GC1T001B20880C1I800I60P4G07H0S> <2100E8064CG005301G7K002KO3420444100D4460P1014J0I00001G68C05CO32001A40> <G0CO3I001A40IGGO34000440SGCO54M000C1I302O60P1G0C1074360OG00AH09K3P0PG> <C9C000O34602MC1I300O0000200G0401X00BH00O3400000237KO000206033HGA8E590> <0820002D2IA000020K0001A09O0000G600000000X0004X00EU40O000030CGO09OG611> <JQE1060P400630CI8028HA0G00000X000900B4GVMG050000004P47TKG30002240G40O> <34600A40G00O34602A4100O4860UG00IH044060P400630CI8028GG10G07403268002H> <G34260P001G10820VVPG684084840G00001KGKO34404GC28000060P1G0IH0K42H0G06> <A2SGCO54M000C1I302J60P1G09109K2P0PGC9C000O34605MC1I300I60Q000IH04K660> <P1G0IH044460P1G0IG0001X00BL00O34000002K0JG00020604LX0006X00FG40O00003> <0CGO0I0G61A09Q1060P400630CI8028HA0000000X000F00A000020C00088G20G30CGO> <018G20030CGO098I7VPK0000003VVO0FVT29GK802RMPTG008C2KJVUM2CKNVVLNDQ8FV> <PJ63O7VVALAM801CI3UQ01S000001G8GC1T001520880C1I800C60P4G04H142100E806> <4CG00530041VVJ0CG80NOGC1000003P0M86I530CGG13OG2I5J0CGG0QGGE236GB4200M> <88214HGO34A07G4CGHMK215384A6SG84EP108521CGK4FH199122II64554K8AA38G8K4> <P0G86I330CGG13OG429KG8O34609040GG8O38002A40G0CO34602A0000401X00A700O3> <400000CC7GAG0020600FX0006X00FG40O00001084001HG7K001CO36000Q44SG4C1P08> <0A60G0000000040000401X00F700O3400000680KIC0020602G1I0540000S300UGCE5A> <000010C03U385AG000083013G0000X0004X00EU40O000010C680KIC0C1I800A60P4G0> <3H1G00X000B40O000FH041060P1G01H040060P1G0HJ0CGO098G4030H0O3Q002640GG0> <O34G00KC1I90072104200SG0C861MG00FH0SE8P0OSHI100KC3041G68C04KO34K02AC3> <8000020G1HM130CGO08PG69804K8330G120130Q00089G68C04CG6000004E0026D5N38> <KBD6IOM5D2000EF001NK5TF0HU8AJBI05T70LO5E187F003V7I1RG0NKL59GC00000AKX> <0004HJ9FE3OU0RG45S3AUBE6M4MSDDHCAQQ000VO000EURQ000SU003AUBQU13SGLIF40> <ANGTTLF5T70DO3E0OLF003PTI1RK4LF1U9F9B2G00KS1SF0DO22U1MS5SGF3O2E0ONGDM> <G00FPG01NL5TF0HS82URI05839TUCE07I057OF3O2E0ONGDHDSQ0VSGC0760O000510C0> <0007VUC1G000B20FS00000401X008L00O3400000685H9SC0206018HH9SCJBG0820X00> <07X00FA40O000030CGO02OGM342OKU6X000601G8GC1T001620880C1I900560P400410> <N400G80264CG0O34602081G000T20820C1I300520880C2D000020O0A01DG0O34602C0> <000401X00E300O34000002C7HU7002060210J1SE0000820X0007X00FA40O000030CGO> <09OG6163OV3G60P400630CI8028GO0G00000X0006VVRF5NM20C00088G20G30CGO018G> <20030CGO098G4030H0O3Q002A40GG0O34G00OC1I90092204200SG0C8P000A60CG8O44> <M000C1I301U60P1G07H064360P1G0IG0001X00DF00O340000081A180003G603RHH058> <5000820X0007X00FA40O000030CGO0DH06000188320AGB0G20C00041060002CG30001> <C81G000P40O000E104006111VVVI0C00098G20G30CGO038G20030CGO0A8GQ00CG4TK1> <DF4LO56UR43NAVVU6000O4860UG00KH044060P400130CI8038GO10G03403I68274CG8> <E8P0OOBI2008O3Q001I45G84081100I08G8BVS1100LI2008O3Q001I45GGG2201O0K09> <0GG23VUO0NI2008O3Q001I42GGG230280M09J0E000AOGM02G37C106MO415NM82B0001> <NM1J0CGO0A80000G0401X00BF00O34000002K0JM8002060390L04S0000820X0007X00> <FA40O000030CGO09OG61A09R5060P400630CI8028H40G00000X000900J4GVMG05I8FQ> <P060004481081G68C00K81001G68C04K8201G8GC1T001520880C1I800C60P4G04H1G2> <100E8064CG8E8P0O0A61CG822009G6800C0O34C044420880030U86C1I002Q20O84Q1S> <G8O44M000C1I302F60P1G07H074260P0G1A108K4P0HG6G804K8210I88C1I30152088A> <C1K202U20806C1I3015208O6C1I503620804C1I301520888C1I30150000200G0401X0> <0BB00O3400000I64M000020600R0I9P8000041G0014SK0000010C0000000000X0003X> <00F440O00001084001HG7K002SO36001I42SG4C1P080A60J0CHO05PG68K02C8202008> <C1I300N210060400G0360P1G0BH080000G0000G0401X00EJ00O340000169720000206> <0402M2000000820X0007X00FA40O000030CGO0DGG6J4JH21060P400630CI8028HA0G0> <0000X000C00A000000900001060004481081G68C00K81001G68C04K8H002ON45FVLJ6> <CPG0ELVDQ803C000003NG00001G8GC1T001520880C1I800C60P4G04H102100E8064CG> <00530688C1I102A20O07I1KHCO34407640KHGO34205UC22B00060P1G1BJ0CGO058GDI> <1GGLK300P86Q330CGO098G621KHB436115G0030CGO0Q1G68C02882P0O88C1I103G20G> <8601J0CGO098G221J0CGO098GM228GJ43H1685Q1MHMK410R8SA230CGO0980000G0401> <X00AK00O34000002C7HO00020604VHGA8E5900820X0007X00FA40O000030CGO0J8GQ0> <000000X000400I0000005I8FR9G900000O34603CC28000060P1G0R13C2C7HS2000000> <00X000900A00000000002O00VVVS800B2SGO81G001I20820C1I300Q20800C1I301M25> <VVV00883VVAJOCHVV89FK9VVILQR0VVMF63UFVOIF8OJVPIP1TQ030H0O3Q003C40GG0O> <34G01QC1I900Q21O4200SG0C8P000A6030CG003PG68K02C840G7VVI14GGO34003CC1I> <103G21888Q1CG820001G68C0E48110HG6S0014O3Q000A40GGKO3Q0004C1T000660OG0> <0210G04H1U862130F80019G640018O3Q0006C1H000524I89I18I0KFH0H8T212HM4253> <484A5OG8KAH0H8D212GCO38003C40G0CO34603C0000401X009G00O34000006F9I0000> <206036HGA8E5900820000LGG0000020K0000000000X0003X00F440O000030CGO0D1G6> <4005OO4G000041GPT68G81G690020O34I00Q4904000X000A00A000000900001060004> <K81081G68C01481001G68C0548B002ON457VTVVVVO0EM07DG06121G7K005481101G69> <0020O34I00Q4408401P00OHI000KC0P0PG6840908300U84I630CG80M9GA9C000O3460> <54C1I300M21E84226G8K2D19G68C0548192HG68O0088253686C2IB00060P1G1I30CGO> <05HG68C05400X00BP00O34000002D7H000020602OHGA8E590082G001KU40000010C02> <O0000000X0003X00F440O000030CGO0B0G616JOI1060P400630CI8028GI0000000X00> <0640O000GH041060P1G02H040060P1G0IJ0M00000G20130CGO098G4030H0O3Q002A40> <GG0O34G00OC1I90092284200SG0C8P0GSHI000KC060P000JJ0CHG0GOG601SG0C260P3> <01510K030G801I16G0O34E02E42G1004H0006A130D080LGG201J0CGO0980000G0401X> <00CH00O34000026CA4G000206021HHA40000041G00SCS50000010C00L33H800000830> <0B8PGA0000020O04267A000000G601AHJ2G0000041G0D00000000000000000G0401X0> <0E940O000030C800EOG202J0CGO00PG6800008100HG68C008O34600KC1I000G60OG00> <TH040560P1G0530C800EOG202J0CGO05HG68402C8100HG68C02KO32003M40G0KO3460> <20C1I200T20804C1I300V60OG00TH040560P1G0L30CHG09OG20130CGO0A9G64007C81> <019G68C06GO34A03240G08O3460364300500X0005X00CN00O340000265C414I020602> <EX0006X00FG40O000030CGO001G7K008KO34200E41G0F41069G7K009C820GFUIC1H00> <1S60UG0111044160P000J30DO00FOG40400GO3Q004GC1P001V20A82C1I501N20G81Q0> <30C800I0G3I0J0D2804HG64009C81049G64008KO34A032C1H002260P1G0030C800F1G> <6S0088O34600040GG0O3U0044C1I301024G02G000002800000000000X000AX00CD00O> <35000026I30QO0020602BHKGP6M00082G004DE69LG0020O0013BHGDC0008300T00000> <X0004X00EU40O000030CGO0A8GB31I9U1008020C1I900B60P1G0611400X000840O000> <HH040060P1G02H040060P1G0JH0806121G7K004S81019G69401CO54M00040SG4O54M0> <0041SG818109G68C04SO3Q000S4100O4860UG00JJ0CI802OG402GG4O64M00040GG8O6> <4M000C1I30170000200G0401X00CU00O34000026I312O0020600VHKIDCF000820X000> <7X00FA40O00001041860UG00CH0806101G7K002S81019G640034O4C0000C1T000P60O> <G00E30HG0001G7K003G810A1G640034O34601E4300000X0005X00EE00O34000026G0L> <ACA03G601KHLQ8IK7G0820004D4JB3O0020K0013919O8F00G600000000X0004X00EU4> <0O000030F8009OG4030G0O3Q001A40G0KO4C0000C1I301A60P1G0MJ0C8009PGAO0000> <O6C0000C1O000N60P1G0AH3K00X30059AL9HG1C36L0O7N81G0SGESNX0006K9S101AKO> <ME9RBT400000401X00DP00O340000265C4154020600N2M2360000820X0007X00FA40O> <000030CGO001G7K002G81101G7K0024O44M000C1I300F60P1G08J0CGO051G68C00086> <X0007X00ER00O3400002664M000020600EX0006X00FG40O000030CGO001G68K010820> <2008C1I3000210060400G0360P1G0000001X00F700O3400002644KQ000106000HL733> <I000820001SSH4G00020K000JCJGC0002860430PGU35G0021G0AE63629P800GC07NA2> <9KA00004301U80000000000000000G0401X00E941G000030OIG0EPGD000O882066O2C> <32301421O000000000000000BJ0O0009GGJVTL3QS5X00031J1S6BG20O00080G20G30O> <GO06GG20030OGO090HI02K000003A0000025GQG000SJH0000AFK00003M800000A0000> <0000001G8GC3D001420880C32807E61H4G0410N4136E806GSG4O42000042024053001> <0C32301R61H500TH08C092HGC840EK8230A86C32203C20H86I5J0OHG0R0GE12VVG220> <08T4U0KHCO64406SC34D03521844002HF44059GD000GGO64602841G8806309GC8C0DS> <8O3F8C000G60020300801G40800065TQ02UGNFDQHD0Q52TVI45EBDR7LSBSO6000D053> <2U3IAS21EVO43TBOOL9N0LO4E42L6SI3ETS8AKSVA54J94JL4T8NE1R7M1AG6HLKED3PF> <7OGUG0KI1RF80RLMT8NFSI195SC0LFK1ONF81I1RGG005RV4GBNF33H1109FCQ23GHNEF> <1687F1AIJ2U5TJ93RC6DSJFUI2ENS41217ALOQ93P46HJG4U83P2A60TNP0LN1FFUG9V2> <UG618000010S0F1VO00000000100HGC000F8O60008O410000061H500TH084201HGC40> <0T88501809227IBC061H1G0I00001X00E700O3400000UE8I80004G603QHI9P8000082> <0004CI46180020O000F748800008301400000X0004X00EU40O000015000L6A80ILS09> <TB5BQAMULKG15B70280UMILK5G5CBQMIMS055EN019AQ0RG0KBD0E83G12LTT99A9AMUK> <KL4L6FAE03I5QG4O400000C1G001K60O0011H6VVRU207V60CGETK005B5APAMALIXLCG> <AX0006LM1SGJ47T8NA9QGB0AOKT1V89QTSGBA6P6U85IRCJI0ILTV65Q2ECVJ4SOL6FPM> <8NB4J0O00001G6000DOO30007A47VVF43NRG01BMATINCXLR03X0006X00BPZ43MAVVVV> <VVVV> (END FORLIB.RL) (REMARK End of File) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 | /LIBRA: F4 LIBRARIAN, V24A / / / / / / / // / / / / /COPYRIGHT (C) 1974, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /LIBRA: FORTRAN IV LIBRARIAN / / / BORN OF JUD LEONARD, UNDER THE / SIGN FOR WHICH IT IS NAMED. / / / CHANGES FOR V23 / .PRINT VERSION NUMBER / .ACCEPT INPUT FROM CONSOLES WITHOUT PARITY / / / CHANGES FOR OS/8 V3D BY PAULA TIRAK / .CHANGED VERSION NUMBER TO 24A / .PUT IN NEW DATE ALGORITHM / .NO LONGER MISNAMES THE SECOND OUTPUT FILE / / / OS/8 CONSTANTS: VERS=24 PATCH="A / FETCH=1 LOOKUP=2 ENTER=3 CLOSE=4 DECODE=5 CHAIN=6 ERROR=7 USRIN=10 USROUT=11 / OUTF1=7600 /LIBRARY OUTF2=7605 /CATALOG LISTING OUTF3=7612 /UNUSED INF=7617 / EQHI=7642 SWATOL=7643 SWMTOX=7644 SWYTO9=7645 EQLO=7646 DHRES=7647 /HANDLER RESIDENCY TABLE SYSDAT=7666 /SYSTEM DATE DCTLW=7760 /DEVICE CONTROL WORD TABLE / DEVICE CONTROL WORDS HAVE THE FORM: / BIT 0 FILE STRUCTURED / BIT 1 READ ONLY / BIT 2 WRITE ONLY / BITS 3-8 DEVICE TYPE / BITS 9-11 DIR BLOCK OF CURRENT TENTATIVE FILE / / INTERNAL DEFINITIONS: F0=00 F1=10 CATBUF=2000 /IN FIELD 1 CBUFS=1 /NUMBER OF BUFFERS FOR CATALOG MODBUF=2400 /LIKEWISE MBUFS=12 /BUFFERS FOR MODULE ODEVH=7200 /OUTPUT DEVICE HANDLER (ROOM FOR 2-PAGE) IDEVH=6600 /INPUT DEVICE HANDLER / / PAGE 0 FOR LIBRA / *1 TMP1, 0 TMP2, 0 /SOME TEMPS TMP3, 0 TMP4, 0 TMP5, 0 TMP6, 0 TMP7, 0 X0, 0 /AUTO-INDEX X1, 0 X2, 0 X3, 0 X4, 0 X5, 0 X6, 0 X7, 0 USR, 200 /CURRENT USR CALL ADDRESS /LIBRA ASSUMES USR ALWAYS PRESENT LIBDVH, ODEVH /ADDRESS OF LIBRARY DEVICE HANDLER LIBU, 1 /UNIT CONTAINING LIBRARY; INITIALLY SYS: CATLEN, 0 /LENGTH OF CATALOG CATBLK, 0 /CURRENT CATALOG BLOCK IN CORE LAVAIL, 0 /NEXT AVAILABLE LIBRARY BLOCK LIBNAM, TEXT "FORLIBRL" *.-1 INFP, INF /CURRENT PLACE IN INPUT FILE LIST MODU, 0 /UNIT CONTAINING CURRENT MODULE MODDVH, IDEVH /INPUT DEVICE HANDLER ADDRESS MODLEN, 0 /LENGTH OF THIS MODULE MODBLK, 0 /FIRST BLOCK OF MODULE INLSW, 0 /NON-ZERO IF IN LIBRARY INPUT INFST, 0 /FIRST BLOCK OF INPUT FILE INBLK, 0 /NEXT INPUT BLOCK NUMBER THSBLK, 0 /READIN CONTROL FULFLG, 0 /-1 IF CAT FULL ENAM1, 0 ENAM2, 0 /HOLDER FOR ESD NAMES ENAM3, 0 0 /TEXT STOPPER FOR ENAME ESDCTR, 0 PCAT, CATBUF /POINTER TO CURRENT CATALOG BLOCK INCLUD, -1 /SW FOR NAME INCLUDED IN CATALOG CHANGD, 1 /0 IF CAT BLOCK MODIFIED PMOD, MODBUF /POINTER TO CURRENT MODULE BLOCK / TTFLAG, 0 /NON-ZERO WHEN TTY HAS INITIALIZED PCHR, TTO /OUTPUT ROUTINE TTPOS, 0 /TTY POSITION COUNTER CATCNT, 0 IOERR, 0 7421 /ERROR CODE TO MQ JMP I .+1 IOMES /LOG THE ERROR / LIBRA MAIN CONTROL / *177 /MAKES IT EASY TO CALL START START, CDF F0 JMS TTWAIT /ALLOW TTY TO COMPLETE CIF F1 JMS I USR DECODE TXTRL, 2214 /RL DEFAULT EXT TAD (INF /RESET INPUT FILE POINTER DCA INFP TAD (TTO /AND IO DEVICE DCA PCHR DCA FULFLG CDF F1 TAD I (OUTF1 SNA /NEW LIBRARY SPECIFIED? JMP LASTLB /NO, USE LAST ONE DCA LIBU /GET LIBRARY UNIT TAD (OUTF1 DCA X0 TAD I X0 DCA LIBNAM /MOVE TAD I X0 /IN DCA LIBNAM+1 /NEW TAD I X0 /NAME DCA LIBNAM+2 TAD I X0 SNA TAD TXTRL /IF NO EXT, FORCE .RL DCA LIBNAM+3 LASTLB, TAD LIBU /REGET UNIT AND (17 TAD (DCTLW-1 /ADDRESS DEV CTL TABLE DCA TMP1 TAD I TMP1 CDF F0 SMA CLA /IS DEVICE FILE-STRUCTURED? JMP NOTFS /NO, BOMB TAD (ODEVH!1 DCA OHADDR /ALLOW 2-PAGE HANDLER TAD LIBU AND (17 CIF F1 JMS I USR /GET THE HANDLER FETCH OHADDR, ODEVH!1 JMS IOERR /YOU'RE KIDDING TAD OHADDR /NOW THE REAL ADDRESS DCA LIBDVH JMP ZTEST NOTFS, JMS TTOTXT FLSTR-1 JMS CRLF JMP START / IOMES, CLA TAD (TTO DCA PCHR /ENSURE IT COMES OUT ON TTY JMS TTOTXT IOMSG-1 JMS CRLF JMP START PAGE ZTEST, CDF F1 /FIND OR CREATE LIB. TAD I (SWYTO9 /GET SWITCH WORD AND (2000 /TEST FOR /Z CDF F0 SZA CLA JMP NEWLIB /YES, ENTER NEW ONE OLDLIB, JMS FNDLIB /LOOKUP THE LIBRARY LOOKUP JMP NEWLIB /COULDN'T FIND IT / TAD LIBBLK /FIRST BLOCK OF LIBRARY DCA ZCATB TAD (CBUFS+MBUFS^200!F1 DCA ZCATC /READ ALL YOU CAN JMS ZCAT /DO THE READ CDF F1 TAD I (CATBUF /LOOK AT CONTROL WORD CLL RAR SZA CLA /IS IT A LIBRARY? JMP NOTLIB /NO, ERROR TAD I (CATBUF+3 CDF F0 DCA CATLEN /LENGTH IN BLOCKS TAD LIBBLK DCA LAVAIL /WILL BE UPDATED DURING SCAN TAD LAVAIL DCA CATBLK /CURRENT BLOCK IN BUFFER TAD CATLEN CIA DCA TMP2 /COUNTER CSLOOP, TAD (CBUFS+MBUFS TAD TMP2 SMA /WILL THE REST FIT IN BUFFER? JMP CSLAST /YES DCA TMP2 TAD (-CBUFS-MBUFS^100 DCA TMP1 /ENTRIES NOW IN CORE JMS SCAT /SCAN CATALOG TAD ZCATB /NEXT BLOCK WE'LL READ DCA CATBLK JMS ZCAT /READ SOME JMP CSLOOP CSLAST, CIA /NO OF BLOCKS WE DON'T NEED TAD (CBUFS+MBUFS JMS R6L /NO OF ENTRIES WE CAN LOOK AT CIA DCA TMP1 JMS SCAT /LOOK FOR END FULCAT, JMS TTOTXT /RAN OFF THE END CATFUL-1 JMS CRLF /** JMP LCLOSE / SCAT, 0 TAD (CATBUF-1 DCA X0 SCLOOP, CDF F1 TAD I X0 CMA /TEST FOR END SNA CLA JMP GETINF /THAT'S IT ISZ X0 ISZ X0 /IGNORE REST OF NAME TAD I X0 /GET LENGTH TAD LAVAIL /ADD TO ST BLOCK OF FREE AREA DCA LAVAIL ISZ TMP1 JMP SCLOOP CDF F0 JMP I SCAT /GO FOR NEXT BUFFER LOAD / NOTLIB, JMS PRLBNM /PRINT LIBRARY NAME JMS TTOTXT UNLIB-1 JMS CRLF JMP START PAGE NEWLIB, JMS FNDLIB ENTER JMS IOERR TAD LIBU AND (7760 CLL RTR RTR SNA /DID HE GIVE A LENGTH? STL RTL /NO, USE 2 DCA CATLEN CDF F1 TAD I (EQLO /HOW MANY EXTRA BLOCKS WANTED CDF F0 TAD CATLEN /PLUS CATALOG REQUIREMENT CLL TAD LIBLEN /MINUS AVAILABLE LENGTH SZL CLA /CHECK FOR ENUF ROOM JMP LSZERR /NO ROOM, GIVE MESSAGE / / WRITE EMPTY CATALOG / TAD (CATBUF-1 DCA X0 TAD (-MBUFS-CBUFS^400 DCA TMP1 CDF F1 DCA I X0 ISZ TMP1 JMP .-2 TAD (CATBUF-1 /RESET FOR LATER USE DCA X0 CLA CMA TAD CATLEN SPA SNA /MORE THAN ONE? JMP CATB0 /JUST ONE CIA ISZ ZCATB /START WITH SECOND CAT BLOCK ZCLOOP, CLL TAD (MBUFS+CBUFS DCA TMP1 SZL /FULL WRITE? TAD TMP1 /NO CIA TAD (MBUFS+CBUFS JMS R6R TAD (4000!F1 DCA ZCATC /SET CONTROL JMS ZCAT TAD TMP1 SPA JMP ZCLOOP /MORE TO GO CATB0, CDF F1 CLA IAC /1 IS LIBRARY CODE DCA I X0 TAD (VERS DCA I X0 /MARK LIBRA VERSION # TAD LIBLEN /JUST A GUESS CIA DCA I X0 TAD CATLEN DCA I X0 CLA CMA /END OF CAT INDICATOR DCA I X0 /MARKS FIRST AVAIL SLOT CDF F0 DCA CHANGD /FORCE A WRITE ON THIS ONE TAD ZCATB DCA LAVAIL TAD LIBBLK /LIBRARY START BLOCK DCA CATBLK /IS CURRENTLY IN BUFFER JMP GETINF /BEGIN / ZCAT, 0 CDF F0 JMS CCHK /LOOKOUT FOR CONTROL C JMS I LIBDVH ZCATC, F1 CATBUF ZCATB, 0 JMS IOERR TAD ZCATC JMS R6L AND (17 TAD ZCATB DCA ZCATB ISZ CHANGD /SET UNMODIFIED SW JMP I ZCAT JMP .-2 / FNDLIB, 0 TAD I FNDLIB DCA USRCOD ISZ FNDLIB TAD (LIBNAM DCA LIBBLK TAD LIBU AND (17 CIF F1 JMS I USR USRCOD, 0 LIBBLK, LIBNAM LIBLEN, 0 /NEG, REMEMBER JMP I FNDLIB /COULD'T DO IT TAD LIBBLK /FIRST BLOCK DCA ZCATB /OF CATALOG ISZ FNDLIB JMP I FNDLIB LSZERR, JMS TTOTXT SMALL-1 JMS CRLF JMP START /GO FOR MORE PAGE / / SETUP POINTERS AND THINGS FOR NEXT INPUT MODULE / GETINF, CLA CMA DCA INCLUD /SET NO-NAME-INCLUDED SW TAD INLSW /ARE WE GETTING INPUT FROM A LIBR? SZA CLA JMP INLIB /YES-GET NEXT MODULE THEREIN NXTINF, CDF F1 TAD I INFP /UNIT AND LEN OF NEXT IN FILE SZA /IS THERE ONE? JMP FTCHIN /YES TAD I (SWATOL AND (1000 /TEST FOR /C CDF F0 SNA CLA JMP LCLOSE /NO MORE JMS SAVRES /PRESERVE DEV HANDLER RESIDENCY JMS TTWAIT /FINISH ANY TYPING CIF F1 JMS I USR /NEW LINE CONTINUES OLD DECODE 2214 /RL DEFAULT EXT 0 /DO NOT DELETE TENTATIVE FILES JMS RSTRES /RESTORE RESIDENCY TABLE TAD (INF DCA INFP /RESET INPUT FILE POINTER JMP NXTINF /TRY AGAIN FTCHIN, DCA MODU /UNIT CONTAINING INPUT MOD ISZ INFP TAD I INFP DCA INFST /START OF INPUT FILE ISZ INFP TAD INFST DCA MODBLK /IN THIS CASE, FILE=MODULE TAD MODU AND (7760 CIA CLL RTR RTR DCA MODLEN TAD (IDEVH!1 DCA INDVH /TENTATIVE HANDLER ADDR CDF F0 TAD MODU AND (17 CIF F1 JMS I USR FETCH INDVH, IDEVH!1 /TENTATIVE INPUT HANDLER ADDR JMS IOERR /DON'T GIVE ME THAT TAD INDVH DCA MODDVH /DEVICE HANDLER ADDRESS DCA THSBLK /FORCE READIN TO READ LUKMOD, TAD MODBLK /FIRST BLOCK OF MODULE DCA INBLK /INITIALIZE READIN JMS READIN /GET FIRST BLOCK CDF F1 CLA CMA /-1 TAD I PMOD /LOOK AT IDENTIFIER CDF F0 SNA JMP GOTLIB /ITS A LIBRARY CLL RTR SZA CLA /IS IT A MODULE JMP BADINF /BAD INPUT TAD LIBBLK /MAKE SURE CIA TAD LIBLEN /THAT MODULE TAD LAVAIL /FITS IN LIBRARY CLL SNA /CHECK FOR TOO LONG HERE TOO** JMP OVFLO /IT IS TOO LONG TAD MODLEN SNL CLA JMP NXTEBK /GO GETTUM OVFLO, JMS TTOTXT TOOBIG-1 JMS CRLF JMP GETINF BADINF, JMS TTOTXT NOTMOD-1 JMS CRLF JMP GETINF / GOTLIB, TAD MODLEN SNA CLA JMP LB2BIG /CAN'T DO A LOOKUP IF G. T. 255 ISZ INLSW /SET IN-LIBRARY SWITCH JMP INLIB LB2BIG, JMS TTOTXT L2BMSG-1 JMS CRLF JMP START PAGE / GET NEXT MODULE FROM LIBRARY / INLIB, TAD INFST /START OF INPUT FILE DCA INBLK /IS WHAT WE WANT JMS READIN /BRING CATALOG INTO MODULE BUFFER TAD (3 TAD PMOD DCA TMP1 CDF F1 TAD I TMP1 /GET CATALOG LEN CIA DCA TMP1 /HOLD COUNTER IN CASE OF FULL CATALOG TAD INFST DCA INBLK /WE WANT THE SAME ONE AGAIN TAD INFST DCA TMP3 /INIT ACCUMULATED MODULE START BLOCK DCA MODLEN /INITAIL MOD LEN IS ZERO INLSC1, JMS READIN /GET CATALOG BLOCK TAD (-100 DCA TMP2 /COUNT ENTRIES IN CAT BLOCK INLSC2, CDF F1 TAD I PMOD /LOOK FOR END-OF-CATALOG WORD CMA SNA CLA JMP NDLSC /END OF SCAN TAD (3 TAD PMOD /POINT TO LENGTH DCA TMP5 TAD I TMP5 SNA CLA /FIRST ENTRY FOR A MODULE? JMP NOLEN /NO, DO NOT UPDATE TAD MODLEN TAD TMP3 /UPDATE MODULE STARTING BLOCK DCA TMP3 TAD I TMP5 /GET THIS LENGTH DCA MODLEN /FOR THIS MODULE NOLEN, TAD MODBLK /COMPARE LAST MODULE STARTING BLOCK CMA CLL TAD TMP3 /TO ACCUMULATED START BLOCK SNL CLA /INTERESTING? JMP NOTYET /NO TAD I PMOD /YES; WAS NAME DELETED? SZA CLA JMP GLMOD /NO, WE'VE GOT A GOOD MODULE NOTYET, TAD (4 TAD PMOD /POINT TO NEXT NAME DCA PMOD ISZ TMP2 /END OF CAT BLOCK? JMP INLSC2 /NO ISZ TMP1 /YES; END OF CATALOG? JMP INLSC1 /NO, GET NEW BLOCK NDLSC, DCA INLSW /YES, NO LONGER IN A LIBRARY JMP NXTINF /GET ANOTHER FILE GLMOD, TAD TMP3 /GET STARTING BLOCK DCA MODBLK /OF MODULE JMP LUKMOD /AND GO GET THE MODULE L2BMSG, TEXT "INPUT LIBRARY TOO BIG";0 PAGE / PROCESS LOOP FOR ONE MODULE / NXTEBK, TAD (3 TAD PMOD /ADDR OF FIRST ESD-1 DCA X0 /RESET POINTER TO NAMES TAD (-52 /PER BLOCK COUNT DCA ESDCTR ESDLUP, CDF F1 TAD I X0 DCA ENAM1 TAD I X0 DCA ENAM2 TAD I X0 DCA ENAM3 TAD I X0 /TYPE CODE CDF F0 TAD (ESDTAB /DISPATCH FROM TBL DCA TMP1 JMP I TMP1 ESDTAB, JMP ESDEND /0=END OF ESD TABLE JMP DUPLUK /1=ENTRY=LOOK FOR /DUPLICATE NAME JMP ESDLND /2=EXTERN=IGNORE NAME JMP ESDLND /3=FORT COMMON=IGNORE JMP DUPLUK /4=PROG SECTION HLT /5=MUL ENTRY=DOESN'T /EXIST HLT /6=MUL SECTION=DITTO JMP DUPLUK /7=SECT8 JMP ESDLND /10=COMMZ JMP DUPLUK /11=FIELD1 / / LOOK FOR DUPLICATION OF THIS ESD SYMBOL / DUPLUK, TAD CATLEN CIA DCA TMP1 /COUNT LENGTH OF CAT TAD CATBLK CIA TAD LIBBLK /ARE WE AT FIRST BLOCK? SZA CLA JMS CHGCHK /CHECK FOR BLOCK MODIFIED TAD LIBBLK DCA NXTCAT /SETUP FOR FIRST BLOCK OF CAT TAD CATLEN CIA DCA CATCNT GETCB, JMS GCATB /GET IT TAD (CATBUF-1 DCA X1 TAD (-100 /COUNT ENTRIES/BLOCK DCA TMP2 CDF F1 CBSRCH, TAD I X1 /LOOK AT NAME CMA SNA JMP CHKI /END OF CATALOG-LOOK FOR /I IAC /COMPLETE THE CIA TAD ENAM1 /COMPARE SZA CLA JMP NOMTCH TAD I X1 CIA TAD ENAM2 SZA CLA JMP NOMTCH TAD I X1 /LAST CHANCE CIA TAD ENAM3 SNA CLA JMP GOTMAT /EQUAL! NOMTCH, TAD X1 AND (-4 TAD (3 /BUMP TO NEXT DCA X1 ISZ TMP2 JMP CBSRCH JMS CHGCHK /CHECK FOR MODIFIED BLOCK ISZ TMP1 /END OF CATALOG? JMP GETCB /NO, GET NEXT JMS TTOTXT CATFUL-1 JMS CRLF CLA CMA DCA FULFLG JMP ESDEND /PUT THAT, IF POSSIBLE GOTMAT, CDF F0 JMS TTOTXT ENAM1-1 /PRINT THE NAME JMS TTOTXT NDUP-1 /WHICH TO KEEP? CDF F1 TAD I (SWATOL CDF F0 AND (10 /TEST /I SNA CLA JMP CHKR /NO, LOOK FOR /R GMASK, JMS TTOTXT KEEP-1 JMS WAITOP JMP ESDLND /DEFAULT TO THE OLD ONE TAD (-"O SNA JMP ESDLND /KEEP OLD IAC /IS IT "N"? SZA CLA JMP GMASK /TRY AGAIN JMP DELTO /DELETE THE OLD PAGE CHKR, JMS CRLF CDF F1 TAD I (SWMTOX AND (100 /TEST /R SNA CLA JMP ESDLND /DEFAULT:KEEP THE OLD ONE DELTO, CDF F1 TAD X1 AND (-4 CIA CMA /BACK UP POINTER DCA X1 DCA I X1 /CLEAR DCA I X1 /OLD DCA I X1 /NAME ISZ X1 /SKIP OVER LENGTH DCA CHANGD /BLOCK HAS BEEN MODIFIED JMP NXTE /ENTER AT END OF LOOP NDSCN, CDF F1 TAD I X1 /LOOK AT NEXT CMA SNA CLA JMP ENDCAT /NOW WE'RE THERE TAD X1 TAD (3 /BUMP TO NEXT NAME DCA X1 NXTE, ISZ TMP2 JMP NDSCN JMS CHGCHK /LOOK OUT FOR CHANGES ISZ CATCNT /END OF CAT ? SKP JMP FULCAT /NO MORE PUSSY JMS GCATB TAD (CATBUF-1 DCA X1 TAD (-100 DCA TMP2 JMP NDSCN CHKI, TAD I (SWATOL /LOOK AT /I SW AND (10 SNA CLA JMP ENDCAT /NOT SET JMS TTOTXT ENAM1-1 /TYPE ESD NAME JMS TTOTXT NCLUD-1 /INCLUDE IT? IANS, JMS WAITOP JMP ENDCAT /DEFAULT TO INCLUDE TAD (-"Y SNA JMP ENDCAT /YES, INCLUDE TAD ("Y-"N SZA CLA /IS IT "N"? JMP IANS /NO, TRY AGAIN JMP ESDLND ENDCAT, TAD X1 /POINT TO EMPTY SLOT AND (-4 CIA CMA DCA X1 JMP INSERT PAGE / THIS ESD GOES IN THE CATALOG / INSERT, CDF F1 TAD ENAM1 /MOVE DCA I X1 /NAME TAD ENAM2 /TO DCA I X1 /LIBRARY TAD ENAM3 /CATALOG DCA I X1 ISZ INCLUD /IS THIS THE FIRST? SKP TAD MODLEN /YES, GET THE LENGTH DCA I X1 /AND STORE 4TH WORD DCA CHANGD /SET CAT MODIFIED SW CLA IAC TAD X1 /CHECK FOR END OF BLOCK AND (377 SZA CLA JMP MARKND /NO, MARK END OF CAT JMS CHGCHK /WRITE THIS BLOCK CDF F1 TAD (-400 DCA TMP1 /SET COUNT FOR BLOCK LEN TAD (CATBUF-1 DCA X1 /SET POINTER CLA CMA DCA I X1 ISZ TMP1 JMP .-2 /CLEAR THE BLOCK DCA CHANGD ISZ CATBLK JMP ESDLND MARKND, CLA CMA DCA I X1 /MARK NEW END OF CAT ESDLND, CDF F0 CLA STL RTL /TWO TO SKIP VALUE TAD X0 DCA X0 ISZ ESDCTR /DONE WITH BLOCK? JMP ESDLUP /NO, GET NEXT JMS READIN /GET NEXT BLOK JMP NXTEBK /RESET POINTERS AND CONTINUE ESDEND, ISZ INCLUD /CHECK FOR ANY NAMES OUT JMP CPYMOD /YES, COPY MODULE INTO LIBRARY JMS TTOTXT /SORRY, DIDN'T MAKE IT NONEIN-1 JMS CRLF ISZ FULFLG JMP GETINF /TRY NEXT JMP LCLOSE CPYMOD, TAD MODBLK /GET IN FILE STRT BLOCK DCA INBLK TAD MODLEN CIA DCA TMP1 TAD LAVAIL /FIRST AVAILABLE BLOCK DCA NXTOBK CPYLUP, JMS READIN /READ BLOCK OF INPUT TAD PMOD DCA PNXTOB JMS I LIBDVH /CALL OUTPUT HANDLER 4200!F1 PNXTOB, MODBUF NXTOBK, 0 /NEXT OUTPUT BLOCK NUMBER JMS IOERR ISZ NXTOBK /BUMP BLOCK NUMBER ISZ TMP1 /CHECK LENGH JMP CPYLUP TAD NXTOBK DCA LAVAIL /UPDATE AVAILABLE POINTER JMP GETINF /GO FOR NEXT PAGE CHGCHK, 0 CDF F0 /PRECAUTION TAD CHANGD /HAS BLOCK BEEN MODIFIED? SZA CLA JMP I CHGCHK /NO, NOTHING TO DO TAD CATBLK DCA ZCATB /WRITE THE BLOCK TAD (4200!F1 DCA ZCATC JMS ZCAT JMP I CHGCHK /OK / / GCATB, 0 CDF F0 TAD NXTCAT CIA TAD CATBLK /IS IT IN CORE? SNA CLA JMP SOEZ /YES, ITS EZ TAD NXTCAT CIA TAD LIBBLK TAD CATLEN SPA SNA CLA /CHECK FOR INTERNAL ERROR JMP FULCAT /** TAD NXTCAT DCA ZCATB TAD (200!F1 /SET FOR READ DCA ZCATC JMS ZCAT TAD NXTCAT /NEXT BLOCK DCA CATBLK /IS IN CORE SOEZ, ISZ NXTCAT JMP I GCATB NXTCAT, 0 PAGE LCLOSE, JMS CHGCHK TAD USRCOD TAD (-ENTER /DID WE ENTER A NEW FILE? SZA CLA JMP CATLST /NO, GO LIST CATALOG TAD LIBBLK /GET LEN CIA CDF F1 TAD I (EQLO /GET USER EXTENSION REQUEST CDF F0 TAD LAVAIL /PLUS CURRENT END DCA TMP1 TAD TMP1 CLL TAD LIBLEN /CHECK FOR POSSIBLE SNL CLA JMP .+4 TAD LIBLEN /CAN'T GIVE ALL HE WANTS CIA SKP TAD TMP1 DCA LCLEN /SET CLOSE LENGTH TAD CATLEN CMA TAD LCLEN /COMPARE CAT LEN TO LIB LEN SPA SNA CLA JMP NOLIB /THERE'S NO POINT TAD LIBBLK /GET FIRST BLOCK DCA NXTCAT JMS GCATB CDF F1 TAD LCLEN /ACTUAL LIBRARY LENGTH DCA I (CATBUF+2 CDF F0 DCA CHANGD JMS CHGCHK /WRITE IT TAD LIBU AND (17 CIF F1 JMS I USR CLOSE LIBNAM LCLEN, 0 JMS IOERR JMP CATLST /GO LIST THE CATALOG / NOLIB, JMS TTOTXT WHYCLS-1 JMS CRLF JMP START PAGE / LIST THE CATALOG / CATLST, JMS OOPEN /OPEN LISTING FILE JMP START /NONE DESIRED TAD (OCHAR /SETUP FOR DEVICE-INDEPENDENT DCA PCHR /OUTPUT TAD (214 /AT TOP OF PAGE JMS I PCHR JMS CRLF JMS TTOTXT LBV-1 JMS TTOTXT CATOF-1 JMS PRLBNM /PRINT THE NAME CDF F1 TAD I (SYSDAT CDF F0 SNA JMP NODATE /DON'T KNOW THE DATE DCA TMP1 JMS TTOTXT ON-1 CLA /THE FOLLOWING CODE GETS THE DAY DCA TMP2 TAD TMP1 /GET THE DATE RTR /ROTATE THREE RIGHT AND MASK RAR /TO GET THE DAY IN OCTAL AND (37 JMS MAK8BT /MAKE IT 8-BIT AND PRINT DCA TMP2 TAD TMP1 /GET THE DATE BACK AND (7400 /MASK TO GET THE MONTH BITS JMS R6R /MONTH*4 (IN OCTAL) DCA TMP2 /PUT IN TEMP. VARIABLE TO SAVE IT TAD TMP2 /GET IT BACK RTR /MONTH TAD TMP2 TAD (MONTHS-6 DCA .+2 /ADDRESS OF MONTH FROM TABLE JMS TTOTXT /PUT IT IN THE TEXT LINE 0 TAD TMP1 /GET THE DATE---TO FIND THE YEAR AND (7 /MASK TO GET THE YEAR OFFSET BITS DCA TMP4 /SAVE THEM DCA TMP2 TAD I (7777 /GET THE DATE EXTENSION BITS AND (600 CLL RTR /ROTATE TO GET THEM INTO BIT RTR /POSITIONS 7 AND 8 TAD (106 /ADD 70(ORIGINAL BASE YEAR) TAD TMP4 /ADD IN THE YEAR OFFSET BITS JMS MAK8BT /MAKE 8-BIT AND PRINT NODATE, JMS CRLF JMP PRCAT /TITLE IS DONE, PRINT CAT MAK8BT, 0 /ROUTINE TO CONVERT TO 8-BIT AND PRINT CLL /FIRST CONVERT TO DECIMAL CONVYR, TAD (-12 /KEEP SUBTRACTING 12 SPA /HAVE THE YEAR JMP GETDG1 ISZ TMP2 /HOLDS THE FIRST DIGIT OF YEAR JMP CONVYR GETDG1, TAD (12 /GET THE SECOND DIGIT DCA TMP3 /SAVE IT TAD TMP2 /GET THE FIRST DIGIT SNA /FIRST DIGIT IS A ZERO JMP PRDIG2 /PRINT THE SECOND DIGIT TAD (260 /MAKE FIRST DIGIT OF YEAR 8-BIT JMS I PCHR /PRINT IT PRDIG2, TAD TMP3 /GET THE SECOND DIGIT TAD (260 /MAKE SECOND DIGIT OF YEAR 8-BIT JMS I PCHR /PRINT IT JMP I MAK8BT /RETURN PAGE / LIST ALL ENTRIES IN THE CATALOG / PRCAT, TAD CATLEN CIA DCA TMP1 TAD LIBBLK DCA NXTCAT CLA CMA DCA TMP3 /SET LINE COUNTER CATLUP, JMS GCATB TAD (CATBUF-1 DCA X0 TAD (-100 DCA TMP2 CATLP2, CDF F1 TAD I X0 /GET FIRST WORD OF NAME SNA JMP EMPTY /NOT AN ESD NAME CMA SNA JMP NDCATL /END OF CATALOG CMA /RESTORE FIRST WORD JMS TTO2 /PRINT JMP NDNAM /A SHORT NAME CDF F1 TAD I X0 JMS TTO2 JMP NDNAM CDF F1 TAD I X0 JMS TTO2 NOP NDNAM, ISZ TMP3 /MORE ROOM ON THIS LINE? JMP SAMLIN /SURE JMS CRLF TAD (-10 /SETUP FOR 8 PER LINE DCA TMP3 JMP EMPTY SAMLIN, JMS TAB /SPACE OVER TO NEXT NAME EMPTY, TAD X0 AND (-4 TAD (3 DCA X0 /POINT TO NEXT ISZ TMP2 JMP CATLP2 /GO FOR NEXT ISZ TMP1 /MORE BLOCKS? JMP CATLUP /YES JMS CRLF JMS TTOTXT CATFUL-1 NDCATL, JMS CRLF TAD (214 /EJECT PAGE JMS I PCHR JMS OCLOSE /CLOSE THE FILE JMP START PAGE / USEFUL OUTPUT THINGS / TTO, 0 DCA TTOCHR JMS TTWAIT TAD (200 KRS TAD (-217 /CRTL/O CHECK SNA CLA KSF SKP JMP I TTO TAD TTOCHR TLS DCA TTFLAG JMP I TTO TTOCHR, 0 TTWAIT, 0 TAD TTFLAG SNA CLA JMP I TTWAIT JMS CCHK /BEWARE OF CTRL/C TSF JMP .-2 /WAIT TILL DONE DCA TTFLAG /CLEAR BUSY FLAG JMP I TTWAIT CCHK, 0 KSF JMP I CCHK /NOTHING TO WORRY ABOUT TAD (200 KRS TAD (-203 SNA CLA /WAS IT CONTROL C? JMP I (7600 /YES JMP I CCHK TTO2, 0 DCA TMP7 TAD TMP7 JMS R6R JMS TTO2A TAD TMP7 JMS TTO2A ISZ TTO2 JMP I TTO2 TTO2A, 0 AND (77 SNA JMP I TTO2 TAD (-40 SPA TAD (100 TAD (240 JMS I PCHR ISZ TTPOS /BUMP POSITION COUNT JMP I TTO2A R6R, 0 CLL RTR RTR RTR JMP I R6R R6L, 0 CLL RTL RTL RTL JMP I R6L TTOTXT, 0 CDF F0 TAD I TTOTXT DCA X7 ISZ TTOTXT /BUMP PAST POINTER TAD I X7 JMS TTO2 JMP I TTOTXT JMP .-3 CRLF, 0 DCA TTPOS /RESET POSITION TAD (215 JMS I PCHR TAD (212 JMS I PCHR JMP I CRLF TAB, 0 /PSEUDO-TAB GENERATOR TAD (240 JMS I PCHR ISZ TTPOS TAD TTPOS AND (7 SNA CLA /IS POSITION A MULTIPLE OF 8 JMP I TAB JMP TAB+1 /NO, TRY MORE PAGE WAITOP, 0 TAD (277 /QUESTION JMS TTO DCA RETCHR WREP, JMS TTI /WAIT FOR REPLY TAD (-215 SNA JMP DFALT TAD (215-240 /PRINTING? SPA JMP WREP /NO, TRY AGIAN TAD (240 DCA RETCHR TAD RETCHR ECHO, JMS TTO JMS TTI TAD (-215 SNA JMP GOTREP TAD (215-377 /LOOKOUT FOR RUBOUT! SNA JMP RUBOUT TAD (377 JMP ECHO RUBOUT, JMS CRLF JMP WAITOP+1 GOTREP, ISZ WAITOP /GOT A REAL ANSWER DFALT, JMS CRLF TAD RETCHR JMP I WAITOP RETCHR, 0 / TTI, 0 KSF /WAIT FOR A KEY JMP .-1 KRB AND (177 /TAKE CARE OF PARITY TAD (-3 /CTRL C? SNA JMP I (7600 /YES TAD (203 /GET ORGINIAL CHAR BACK JMP I TTI PAGE / / INPUT BUFFERRER AND STUFF / READIN, 0 CDF F0 TAD INBLK TAD THSBLK /-FIRST BLOCK FOLLOWING BUFFER CONTENTS CLL TAD (MBUFS SNL /IS IT IN CORE? JMP MUSTRD /NO, WE HAVE TO DO A READ CLL RTR RTR RAR /TIMES 400 SETP, TAD (MODBUF /PLUSS BUFFER ADDR DCA PMOD /POINTS TO BLOCK ISZ INBLK /READY FOR NEXT JMP I READIN MUSTRD, CLA /THIS ONE'S HARDER TAD INBLK DCA RDBLK TAD INBLK TAD (MBUFS CIA DCA THSBLK JMS I MODDVH MBUFS^200!F1 MODBUF RDBLK, 0 JMS IOERR JMP SETP /OK / ROUTINES TO SAVE AND RESTORE / DEVICE HANDLER RESIDENCY TABLE / SAVRES, 0 TAD (DHRES-1 DCA X0 TAD (SVRES-1 DCA X1 JMS MOVRES JMP I SAVRES RSTRES, 0 TAD (SVRES-1 DCA X0 TAD (DHRES-1 DCA X1 JMS MOVRES JMP I RSTRES MOVRES, 0 TAD (-17 DCA TMP1 CDF F1 TAD I X0 DCA I X1 ISZ TMP1 JMP .-3 CDF F0 JMP I MOVRES SVRES=7400 / PRINT THE LIBRARY NAME / PRLBNM, 0 TAD LIBNAM JMS TTO2 /FIRST 2 CHARS JMP PREXT TAD LIBNAM+1 JMS TTO2 JMP PREXT TAD LIBNAM+2 JMS TTO2 NOP PREXT, TAD (". JMS I PCHR TAD LIBNAM+3 JMS TTO2 JMP I PRLBNM JMP I PRLBNM PAGE / OUTPUT HANDLERS STOLEN FROM PIP OUFLD=F1 OUCTL=MBUFS^200!4000!F1 OUBUF=MODBUF / / INITIALIZE FOR OUTPUT / OUSETP, 0 TAD (OUCTL&3700 /BUFFER SIZE IN DBL WORDS CIA /NEGATE IT (PAL10 BLOWS) DCA OUDWCT TAD (OUBUF DCA OUPTR /INITIALIZE WORD POINTER TAD OUJMPE DCA OUJMP /INITIALIZE 3-WAY CHARACTER SWITCH JMP I OUSETP / / STORE CHARACTERS IN OUTPUT BUFFER / IN PS8 FORMAT (YOU KNOW, 3 CHARS / IN 2 WORDS THE WRONG WAY) / OCHAR, 0 AND (377 DCA OUTEMP CDF OUFLD /SET DATA FIELD TO BUFFER'S FIELD ISZ OUJMP /BUMP THE CHARACTER SWITCH OUJMP, HLT /THREE WAY CHARACTER SWITCH JMP OCHAR1 JMP OCHAR2 TAD OUTEMP CLL RTL RTL AND (7400 TAD I OUPOLD DCA I OUPOLD /UPDATE FIRST WORD OF TWO WITH HIGH /ORDER 4 BITS OF THIRD CHAR TAD OUTEMP CLL RTR RTR RAR AND (7400 TAD I OUPTR DCA I OUPTR /UPDATE 2ND WORD FROM LO 4 BITS TAD OUJMPE DCA OUJMP /RESET SWITCH ISZ OUPTR ISZ OUDWCT /BUMP COUNTER EVERY 3 CHARS JMP OUCOMN TAD (OUCTL /LOAD CONTROL WORD FOR A FULL WRITE JMS I (OUTDMP /DUMP THE BUFFER JMS OUSETP /RE-INITIALIZE THE POINTERS JMP OUCOMN OCHAR2, TAD OUPTR DCA OUPOLD /SAVE POINTER TO FIRST WORD OF TWO ISZ OUPTR /BUMP WORD POINTER TO SECOND WORD OCHAR1, TAD OUTEMP DCA I OUPTR OUCOMN, CDF F0 JMP I OCHAR OUTEMP, 0 OUPOLD, 0 OUPTR, 0 OUJMPE, JMP OUJMP OUDWCT, 0 / / MOVE OUTPUT FILE NAME TO FIELD 0 / OFNAME, 0 TAD (OUTF2 DCA X0 /NAME OF CAT LIST FILE CDF F1 TAD I X0 DCA OUFNAM /FIRST 2 CHARS TAD I X0 DCA OUFNAM+1 TAD I X0 DCA OUFNAM+2 TAD I X0 SNA TAD TXTCA /DEFAULT CAT EXT DCA OUFNAM+3 CDF F0 /RESTORE FIELD JMP I OFNAME OUFNAM, ZBLOCK 4 TXTCA, 301 PAGE OOPEN, 0 CDF F1 TAD I (OUTF2 /GET DEVICE CODE, LEN DCA OUELEN /HOLD IT A MO JMS I (OFNAME /GET FILE NAME INTO FIELD 0 TAD OUELEN /CHECK FOR NULL FILE SNA CLA JMP I OOPEN /NOTHING TO OPEN TAD OUNAME /RESET ENTER CALL DCA OUBLK TAD (IDEVH!1 DCA OUHNDL TAD OUELEN /THE UNIT CIF F1 JMS I USR FETCH /ASSIGN, FETCH HANDLER OUHNDL, 0 /OUTPUT DEVICE HANDLER ENTRY JMS IOERR /HUH? TAD OUELEN /UNIT AGAIN CIF F1 JMS I USR ENTER /ENTER OUTPUT FILE OUBLK, OUFNAM /REPLACED WITH STARTING BLOCK OUELEN, 0 /REPLACED WITH LENGTH OF HOLE JMS IOERR /YOU BLEW IT!!! DCA OUCCNT JMS I (OUSETP ISZ OOPEN JMP I OOPEN OUTDMP, 0 DCA OUCTLW /STORE THE CONTROL WORD TAD OUCCNT SNA ISZ OUCTLW TAD OUBLK DCA OUREC /COMPUTE STARTING BLOCK TAD OUCTLW JMS R6L AND (17 /COMPUTE THE NUMBER OF RECORDS TAD OUCCNT /UPDATE SIZE OF FILE DCA OUCCNT TAD OUCCNT CLL CML TAD OUELEN SNL SZA CLA /EXCEED GIVEN LENGTH ? JMS IOERR /YES - ERROR CDF F0 JMS I OUHNDL OUCTLW, 0 OUBUF OUREC, 0 JMS IOERR JMP I OUTDMP OCLOSE, 0 TAD (232 /OUTPUT A CTRL/Z JMS I PCHR FILLLP, JMS I PCHR TAD (77 AND I (OUDWCT SZA CLA /UP TO THE BOUNDARY YET? JMP FILLLP /NO - FILL WITH ZEROS TAD I (OUDWCT /GET DOUBLEWORD COUNT LEFT TAD (OUCTL&3700 SNA /A FULL WRITE LEFT? JMP NODUMP /YES DON'T DO IT TAD (4000!OUFLD /PUT IN FIELD AND WRITE BITS JMS OUTDMP NODUMP, CIF CDF F1 TAD I (OUTF2 CDF F0 JMS I USR CLOSE /CLOSE THE OUTPUT FILE OUNAME, OUFNAM /POINTER TO OUTPUT FILE NAME OUCCNT, 0 JMS IOERR /ERROR WHILE CLOSING - BAD!! JMP I OCLOSE /ALL DONE PAGE / MESSAGES / LBV, TEXT "LIBRA V " *.-1 VMESG, VERS&70^7+VERS+6060 PATCH&77^100+40 4000 NONEIN, TEXT "MODULE NOT INCLUDED";0 FLSTR, TEXT "LIBRARY MUST BE ON A FILE-STRUCTURED DEVICE";0 SMALL, TEXT "INSUFFICIENT SPACE FOR LIBRARY";0 NOTMOD, TEXT "INPUT NOT A MODULE";0 TOOBIG, TEXT "INPUT TOO BIG FOR LIBRARY";0 UNLIB, TEXT " IS NOT A LIBRARY";0 NDUP, TEXT " IS DUPLICATE NAME";0 KEEP, TEXT "; KEEP OLD OR NEW";0 CATFUL, TEXT "CATALOG IS FULL";0 NCLUD, TEXT ": INCLUDE";0 WHYCLS, TEXT "LIBRARY TOO SMALL FOR USE; START OVER";0 IOMSG, TEXT "I/O ERROR";0 CATOF, TEXT "CATALOG OF ";0 ON, TEXT " ON ";0 CS197, TEXT ", 197";0 MONTHS, TEXT "-JAN-@@@@@-FEB-@@@@@-MAR-@@@@" TEXT "-APR-@@@@@-MAY-@@@@@-JUN-@@@@" TEXT "-JUL-@@@@@-AUG-@@@@@-SEP-@@@@" TEXT "-OCT-@@@@@-NOV-@@@@@-DEC-@@@@" $ |
> > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | / / VERSION 5A 4-27-77 PT / SECT IABS ENTRY ABS BASE 0 ABS, FLDA 0 /GET RETURN ADDRESS STARTD FSTA RETRN FADD TWO /GET ADDRESS OF ARG POINTER FSTA 3 FLDA% 3 /GET ARG ADDRESS FSTA 3 STARTF FLDA% 3 /GET ARG JGE RETRN /POSITIVE, SKIP NEGATE FNEG RETRN, 0;0 TWO, 0;2 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | / / / A C O S / - - - - / /SUBROUTINE ACOS(X) / / VERSION 5A 4-27-77 PT / SECT ACOS JA #ACOS TEXT +ACOS + ACOSXR, SETX XRACOS SETB BPACOS BPACOS, FNOP 0 0 XRACOS, F 0.0 ACOS8, F 0.0 ACOS7, F 0.0 FPI2AC, 1 /PI OVER 2 3110 3755 F1ACOS, F 1. FPIACS, 2 /PI 3110 3755 ORG 10*3+BPACOS FNOP JA ACOSXR 0 ACSRTN, JA . BASE 0 #ACOS, STARTD FLDA 10*3 FSTA ACSRTN FLDA 0 SETX XRACOS SETB BPACOS BASE BPACOS LDX 1,1 FSTA BPACOS FLDA% BPACOS,1 /ADDR OF X FSTA BPACOS STARTF FLDA% BPACOS /GET X FSTA ACOS8 /SAVE IT JEQ ACOSEQ /IF 0 RTN PI OVER 2 LDX -1,0 /JUMP TIME JGE .+5 LDX 0,0 FNEG FSUB F1ACOS /1-!X! JLE ACOSOK /IS IT <1.? EXTERN #ARGER TRAP4 #ARGER JA ACSRTN /AND RETURN ACOSOK, FLDA ACOS8 /X FMUL ACOS8 /X^2 FNEG /-X^2 FADD F1ACOS /1-X^2 FSTA ACOS7 EXTERN SQRT JSR SQRT /CALL SQRT JA .+4 /SQRT (1-X^2) JA ACOS7 FDIV ACOS8 /SQRT (1-X^2)/X FSTA ACOS7 EXTERN ATAN JSR ATAN /CALL ATAN JA .+4 /ATAN (SQRT(1-X^2)/X) JA ACOS7 JXN ACSRTN,0 /NO SIGN CHG NECESSARY FADD FPIACS /ADD PI IF MINUE JA ACSRTN ACOSEQ, FLDA FPI2AC /RTN PI OVER 2 IF 0 JA ACSRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | / / VERSION 5A 4-27-77 PT / ADSK=6534 ADRB=6533 ADST=6532 ADLM=6531 ADCL=6530 SAM=100 LINC=6141 ESF=4 PDP=2 SECT8 ADC /AD SAMPLER (UNBUFFERED, UNCOLCKED) BASE 0 STARTD FLDA 0 /GET RETURN ADDRESS FSTA ADCRET FADD L2 /GET ADDR OF ARG POINTER FSTA 0 FLDA% 0 /GET ADDR OF CHANNEL NUMBER FSTA 0 STARTF FLDA% 0 /GET THE CHANNEL NUMBER ALN 0 /FIX IT FSTA CHANEL /STORE IT FOR ADC8 TRAP4 ADC8 /GO TO PDP8 CODE TO DO THE SAMPLING FLDA SAMPLE FNORM /GET THE SAMPLE AND NORMALIZE IT FDIV L511 /SCALE BETWEEN -1 AND +1 ADCRET, JA . L2, 0;2 L511, F 511. SAMPLE, 13;0;0 CHANEL, 0;0;0 ADC8, 0 /PDP8 MODE END OF ADC IFSW 8 < ADCL /CLEAR AD LOGIC TAD CHANEL+2 /SET MULTIPLEXOR CHANNEL ADLM ADST /START CONVERSION ADSK /WAIT FOR IT JMP .-1 ADRB /READ CONVERTOR BUFFER> IFNSW 8 < TAD CHANEL+2 /CREATE FIRST SAM TAD SAM0 DCA DOSAM IOF LINC /ENTER LINC MODE WITHOUT INTERRUPTS ESF /DISABLE FAST SAM DOSAM, 0 PDP ION /BACK IN 8 MODE, TURN ON INTERRUPTS> DCA SAMPLE+1 /SAVE SAMPLE CIF CDF JMP% ADC8 IFNSW 8 < SAM0, SAM 0> |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | / / / A L O G / - - - - / /SUBROUTINE ALOG(X) / / VERSION 5A 4-26-77 (MH) / SECT ALOG JA #ALOG 0 /WORKING SPACE FOR EXPONENT DIDDLE. 0 0 ALOGTM, 0 0 0 0 F2ALOG, F 2. FPI2, 1 3110 3755 / EXTERN #ARGER ALOG0, TRAP4 #ARGER JA ALGRTN /RETURN NOW. / EXTERN #ARGER ALOGM1, TRAP4 #ARGER JA ALGRTN TEXT +ALOG + ALOGXR, BPALOG, F 0.0 XRALOG, F 0.0 ALOG1, F 0.0 ALOG2, F 0.0 F1ALOG, F 1. / ALOGMG, 0 0 13 /CORRECT EXPONENT DIDDLER. / / / / ALOGL1, 0 3777 7742 / ALOGE2, 0 2613 4414 / ORG 10*3+BPALOG FNOP JA ALOGXR 0 ALGRTN, JA . ALOGL2, 7777 4000 4100 / ALOGL3, 7777 2517 0310 / ALOGL4, 7776 4113 7211 / ALOGL5, 7776 2535 3301 / ALOGL6, 7775 4746 0771 / ALOGL7, 7774 2236 4304 / ALOGL8, 7771 4544 1735 BASE 0 #ALOG, STARTD FLDA 10*3 FSTA ALGRTN FLDA 0 SETX XRALOG SETB BPALOG BASE BPALOG LDX 1,1 FSTA BPALOG FLDA% BPALOG,1 /ADDR OF X FSTA BPALOG STARTF FLDA% BPALOG /GET X JEQ ALOG0 /IF =0 THEN ERROR JLT ALOGM1 /IF<0 THEN ERROR LDX -1,0 /IF >0 THEN START DOING FSTA ALOG1 /SAVE IN A TEMP. FSUB F1ALOG /KNOCK OFF ONE. JEQ ALGRTN /IF ZERO EXIT. LOG(1)=0 JGE ALOGST /IF POSITIVE LOG>0 FLDA F1ALOG /NEGITE. INVERT IT. FDIV ALOG1 /BY DIVIDING INTO ONE. FSTA ALOG1 LDX 0,0 /RESET SIGN TO NEGATIVE. JA .+3 /AVOID USELESS LOAD INSTRUCTION. / ALOGST, FLDA ALOG1 /RECALL NUMBER. FDIV F2ALOG /CUT IN HALF. FSTA ALOGTM /PREPARE FOR EXPONENT DIDDLE. FLDA ALOGMG /SET THE EXPONENT OF THE EXPONENT TO 13. FSTA ALOGTM-3 /SO THAT NORMALIZE WILL DO JOB. FSTA ALOGTM+1 /AND ALSO ZERO OUT LOW ORDER POART OF EX. MANT. FLDA ALOGTM-1 /RECALL THE NUMBER FNORM /NORMALIZE IT. FMUL ALOGE2 /NOW MULITPLY EXPONENT BY LOG E 2 FSTA ALOG2 /AND SAVE IT FOR A SECOND. FLDA ALOG1 /RECALL THE NUMBER AGAIN. FSTA ALOGTM /STORE IN THE TEMPORARY WORKER. FLDA FPI2-2 /RECALL WORD WITH LOW ORDER ONE. FSTA ALOGTM-2 /STORE AWAY. FLDA ALOGTM /RECALL NUMBER WITH AN EXPONENT OF 1 FSUB F1ALOG /SUBTRACT AWAY. FSTA ALOG1 /AND STORE FMUL ALOGL8 /MULTIPLY BY THE CONSTANT. FADD ALOGL7 /ADD IN FMUL ALOG1 /MULT. FADD ALOGL6 /AND SO ON DOWN THE LINE. FMUL ALOG1 FADD ALOGL5 FMUL ALOG1 FADD ALOGL4 FMUL ALOG1 FADD ALOGL3 FMUL ALOG1 FADD ALOGL2 FMUL ALOG1 FADD ALOGL1 FMUL ALOG1 FADD ALOG2 /CORRECT NOW.ADD IN EXPONENT. JXN ALGRTN,0 /EXIT IF SIGN IS OK. FNEG /ELSE NEGATE IT. JA ALGRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | / / / A L O G 1 0 / - - - - - - / / VERSION 5A 4-27-77 PT / /SUBROUTINE ALOG10(X) SECT ALOG10 JA #ALOG TEXT +ALOG10+ LOGXR, SETX XRLOG SETB BPLOG BPLOG, FNOP 0 0 XRLOG, F 0.0 LOG1, F 0.0 ALOG1C, 7777 /FUDGE CONSTANT 3362 6754 ORG 10*3+BPLOG FNOP JA LOGXR 0 LOGRTN, JA . BASE 0 #ALOG, STARTD FLDA 10*3 FSTA LOGRTN FLDA 0 SETX XRLOG SETB BPLOG BASE BPLOG LDX 1,1 FSTA BPLOG FLDA% BPLOG,1 /ADDR OF X FSTA BPLOG STARTF FLDA% BPLOG /GET X FSTA LOG1 EXTERN ALOG JSR ALOG /CALL ALOG JA .+4 JA LOG1 FMUL ALOG1C /CORRECT FOR THE LOG BASE E. JA LOGRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | / / VERSION 5A 4/27/77 MH / SECT AMAX0 ENTRY AMAX1 ENTRY MAX0 ENTRY MAX1 BASE 0 AMAX1, SETX XR LDX 1,3 /DON'T INTEGERIZE RESULT MAXCOM, STARTD FLDA 0 /ADDRESS OF JA .+2+2*N FSTA 3 FLDA 30 /RETURN ADDRESS FSTA RETN FLDA% 3 / JA .+2+2*N FSUB 0 /-JA . FSUB TWO /- 2 LDX 1,1 ALN 1 /DIVIDE BY TWO FNEG /-N ATX 1 LDX 0,2 /FOR ARG PICKUP FLDA% 0,2+ /ADDRESS OF FIRST ARG FSTA 3 STARTF NEW, FLDA% 3 /SAVE NEW MAX FSTA MAX SAME, JXN MORMAX,1+ /ANY MORE ARGS ? FLDA MAX /GET RESULT JXN RETN,3 /DON'T FIX JLT NEGFIX /NEGATIVE FIX ALN 0 FNORM JA RETN NEGFIX, FNEG ALN 0 FNORM FNEG RETN, JA . MORMAX, STARTD /NEXT ARG ADDRESS FLDA% 0,2+ FSTA 3 STARTF FLDA MAX /COMPARE FSUB% 3 JGE SAME /SAME MAX JA NEW /NEW MAX TWO, 0;2 MAX, 0;0;0 MAX0, MAX1, SETX XR LDX 0,3 /INTEGERIZE RESULT JA MAXCOM /GO DO IT XR, 0;0;0;0;0;0;0;0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | / / VERSION 5A 4/27/77 MH / SECT AMIN0 ENTRY AMIN1 ENTRY MIN0 ENTRY MIN1 BASE 0 AMIN1, SETX XR LDX 1,3 /DON'T INTEGERIZE RESULT MINCOM, STARTD FLDA 0 /ADDRESS OF JA .+2+2*N FSTA 3 FLDA 30 /RETURN ADDRESS FSTA RETN FLDA% 3 / JA .+2+2*N FSUB 0 /-JA . FSUB TWO /- 2 LDX 1,1 ALN 1 /DIVIDE BY TWO FNEG /-N ATX 1 LDX 0,2 /FOR ARG PICKUP FLDA% 0,2+ /ADDRESS OF FIRST ARG FSTA 3 STARTF NEW, FLDA% 3 /SAVE NEW MIN FSTA MIN SAME, JXN MORMIN,1+ /ANY MORE ARGS ? FLDA MIN /GET RESULT JXN RETN,3 /DON'T FIX JLT NEGFIX /NEGATIVE FIX ALN 0 FNORM JA RETN NEGFIX, FNEG ALN 0 FNORM FNEG RETN, JA . MORMIN, STARTD /NEXT ARG ADDRESS FLDA% 0,2+ FSTA 3 STARTF FLDA MIN /COMPARE FSUB% 3 JLE SAME /SAME MIN JA NEW /NEW MIN TWO, 0;2 MIN, 0;0;0 MIN0, MIN1, SETX XR LDX 0,3 /INTEGERIZE RESULT JA MINCOM /GO DO IT XR, 0;0;0;0;0;0;0;0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | / / / / A M O D / - - - - / /SUBROUTINE AMOD(X,Y) / / VERSION 5A 4-27-77 PT / SECT AMOD ENTRY MOD JA #AMOD TEXT +AMOD + AMODXR, SETX XRAMOD SETB BPAMOD BPAMOD, F 0.0 XRAMOD, F 0.0 AMODX, F 0.0 ORG 10*3+BPAMOD FNOP JA AMODXR 0 AMDRTN, JA . EXTERN #ARGER AMODER, TRAP4 #ARGER FCLA JA AMDRTN BASE 0 MOD, #AMOD, STARTD FLDA 10*3 FSTA AMDRTN FLDA 0 SETX XRAMOD SETB BPAMOD BASE BPAMOD LDX 1,1 FSTA BPAMOD FLDA% BPAMOD,1 /ADDR OF X FSTA AMODX FLDA% BPAMOD,1+ /ADDR OF Y FSTA BPAMOD STARTF FLDA% BPAMOD /GET Y JEQ AMODER /Y=0 IS ERROR JGT .+3 FNEG /ABS VALUE FSTA BPAMOD FLDA% AMODX /GET X JGT .+5 FNEG /ABS VALUE LDX 0,1 /NOTE SIGN FSTA AMODX /SAV IN A TEMPORARY FDIV BPAMOD /DIVIDE BY Y JAL AMODER /TOO BIG. ALN 0 /FIX IT UP NOW. FNORM FMUL BPAMOD /MULITPLY IT. FNEG /NEGATE IT. FADD AMODX /AND ADD IN X. JXN AM,1 /CHECK SIGN FNEG AM, JA AMDRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | / / / A S I N / - - - - / /SUBROUTINE ASIN(X) / / VERSION 5A 4-27-77 PT / SECT ASIN JA #ASIN ASINEQ, FLDA FPI2AS /RETURN PI OVER TWO. FMUL ASIN8 /TIMES ARG. JA ASNRTN TEXT +ASIN + ASINXR, SETX XRASIN SETB BPASIN BPASIN, FNOP 0 0 XRASIN, F 0.0 ASIN8, F 0.0 ASIN7, F 0.0 F1ASIN, F 1. FPI2AS, 1 /PI OVER 2 3110 3755 ORG 10*3+BPASIN FNOP JA ASINXR 0 ASNRTN, JA . BASE 0 #ASIN, STARTD FLDA 10*3 FSTA ASNRTN FLDA 0 SETX XRASIN SETB BPASIN BASE BPASIN LDX 1,1 FSTA BPASIN FLDA% BPASIN,1 /ADDR OF X FSTA BPASIN STARTF FLDA% BPASIN /GET X FSTA ASIN8 /STORE ARG AWAY. JGE .+3 /TAKE ABSOLUTE VALUE. FNEG FSUB F1ASIN /SEE IF >1 JLE ASINOK /CONTINUE PROCESS. EXTERN #ARGER TRAP4 #ARGER /TRAP OUT. JA ASNRTN /RETURN. ASINOK, FLDA ASIN8 /X USES STRAIGHT TRIG RELATION. FNEG FMUL ASIN8 /-X^2 FADD F1ASIN /1.-X^2 JEQ ASINEQ /IF 0,FAC=PI OVER 2 FSTA ASIN7 EXTERN SQRT JSR SQRT JA .+4 JA ASIN7 FSTA ASIN7 /SQRT(1.-X^2) FLDA ASIN8 FDIV ASIN7 /X/SQRT(1.X^2) FSTA ASIN7 EXTERN ATAN JSR ATAN /TAKE THE ARCTANGENT. JA ASNRTN JA ASIN7 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | / / / A T A N / - - - - / /SUBROUTINE ATAN(X) / / VERSION 5A 4-27-77 PT / SECT ATAN JA #ATAN TEXT +ATAN + ATANXR, SETX XRATAN SETB BPATAN BPATAN, F 0.0 XRATAN, F 0.0 ATAN1, F 0.0 ATAN22, F 0.0 ATAN3, F 0.0 ATAN4, F 0.0 F1ATAN, F 1. ORG 10*3+BPATAN FNOP JA ATANXR 0 ATNRTN, JA . / ATANC1, -15 /LOWER LIMIT TEST. 2000 0000 / ATANC2, 0 /UPPER LIMIT TEST. 3777 7000 / ATANC3, -1 2111 4121 / ATANC4, 1 3355 4754 / ATANC5, 0 2060 2511 / ATANC6, -3 3023 1227 / ATANC7, -2 5566 7220 / ATANC8, -2 3146 0740 / ATANC9, -1 5252 5262 / ATANCH, 1 3110 3755 / ATANCJ, F -4. BASE 0 #ATAN, STARTD FLDA 10*3 FSTA ATNRTN FLDA 0 SETX XRATAN SETB BPATAN BASE BPATAN LDX 1,1 FSTA BPATAN FLDA% BPATAN,1 /ADDR OF X FSTA BPATAN STARTF FLDA% BPATAN /GET X LDX -1,0 /REMEMBER SIGN JGE .+5 LDX 0,0 /SAVE THE SIGN. FNEG /NEGATE THE FAC [ABS] FSTA ATAN1 /AND STORE AWAY. FSTA ATAN22 FSUB ATANC1 /TEST TO SEE IF TOO SMALL. JLE ATANBG /IT IS. ATAN(X)=X FSUB ATANC2 /TEST TO SEE IF TOO BIG. JLE ATANLW /IT ISNT. FLDA F1ATAN /TO BIG. INVERT IT. FDIV ATAN1 FSTA ATAN1 / ATANLW, FCLA /CLEAR OUT TEMP. FSTA ATAN3 FLDA ATAN1 /RECALL NUMBER. FSUB ATANC3 /START THE KNOCKING OFF PROCESS. JLT ATANNT /WRONG SECTOR. FLDA ATANC4 /BOP UP ORIGINAL. FADDM ATAN1 FLDA ATANCJ /GET MAGIC NUMBER. FDIV ATAN1 FADD ATANC4 FSTA ATAN1 FLDA ATANC5 FSTA ATAN3 / ATANNT, FLDA ATAN1 /RECALL AND SQUARE IT. FMUL ATAN1 FSTA ATAN4 /YET ANOTHER TEMP. FLDA ATANC6 FMUL ATAN4 FADD ATANC7 FMUL ATAN4 FADD ATANC8 FMUL ATAN4 FADD ATANC9 FMUL ATAN4 FADD F1ATAN FMUL ATAN1 FADD ATAN3 FSTA ATAN1 FLDA ATAN22 FSUB F1ATAN JLE ATANBG FLDA ATANCH FSUB ATAN1 JA .+3 / ATANBG, FLDA ATAN1 JXN ATNRTN,0 FNEG JA ATNRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | / / / / A T A N 2 / - - - - - / /SUBROUTINE ATAN2(Y,X) / / VERSION 5A 4-27-77 PT / SECT ATAN2 JA #ATAN2 TEXT +ATAN2 + ATN2XR, SETX XRATN2 SETB BPATN2 BPATN2, FNOP 0 0 XRATN2, F 0.0 YCOR, F 0.0 XCOR, F 0.0 FPIAT2, 2 /PI 3110 3755 ATPI, F 1.570796 /PI/2 ORG 10*3+BPATN2 FNOP JA ATN2XR 0 AT2RTN, JA . BASE 0 #ATAN2, STARTD FLDA 10*3 FSTA AT2RTN FLDA 0 SETX XRATN2 SETB BPATN2 BASE BPATN2 LDX 1,1 FSTA BPATN2 FLDA% BPATN2,1 /ADDR OF Y FSTA YCOR FLDA% BPATN2,1+ /ADDR OF X FSTA XCOR STARTF FLDA% YCOR /GET Y - THE TAN FSTA YCOR /SAV FOR A SECOND LDX 1,2 /POSITIVE X JEQ ATN0 JGT ATN1 LDX 0,2 ATN1, FLDA% XCOR /GET X - THE QUADRAND FSTA XCOR /+MOVE IT TO A SAFE PLACE JEQ ATASP FLDA YCOR /Y/X FDIV XCOR FSTA YCOR EXTERN ATAN JSR ATAN /CALL ATAN JA .+4 /TAKE ARCTAN OF Y/X JA YCOR FSTA YCOR /SAVE IT AWAY JGE A2 /SKIP IF 1 OR 3 Q FADD FPIAT2 /ADD PI FOR 4TH Q FSTA YCOR A2, JXN AT2RTN,2 FLDA YCOR FSUB FPIAT2 /SUB PI FOR 2ND+3RD QUADS JA AT2RTN ATASP, FLDA ATPI /X=0 MEANS +-PI/2 JXN ATNG,2 FNEG ATNG, JA AT2RTN ATN0, FLDA% XCOR JLT POSX /IF X POS,ANS IS 0 FCLA JA AT2RTN POSX, FLDA FPIAT2 /OTHERWISE,ANS IS PI JA AT2RTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | / / C A B S / - - - - / / VERSION 5A 4-27-77 PT / /ENTER IN COMPLEX, EXIT IN REAL / /Z=X+IY / /CABS(Z)=SQRT(X^2+Y^2) / DPCHK SECT CABS JA #CABS TEXT +CABS + CABSXR, SETX XRCABS SETB BPCABS JA .+3 BPCABS, F 0.0 XRCABS, F 0.0 ARG, F 0.0 F 0.0 ORG 10*3+BPCABS FNOP JA CABSXR 0 CABSRT, JA . BASE 0 #CABS, STARTD FLDA 10*3 FSTA CABSRT FLDA 0 SETB BPCABS SETX XRCABS BASE BPCABS LDX 1,1 FSTA BPCABS FLDA% BPCABS,1 FSTA BPCABS STARTE FLDA% BPCABS FSTA ARG STARTF FLDA ARG FMULM ARG /X^2 FLDA ARG+3 /Y FMUL ARG+3 /Y^2 FADD ARG /X^2+Y^2 FSTA ARG EXTERN SQRT JSR SQRT JA RT1 JA ARG RT1, JA CABSRT EXTERN #CAC |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | /COMPLEX ARITHMETIC ROUTINES / (A+BI)+-*/(C+DI) / / VERSION 5A 4-26-77 MH / DPCHK SECT #CAD JA . FSTA #CARG /SAVE SECOND ARG STARTF FLDA #CARG /STARTF ROUNDS FADDM #CAC /A+C FLDA #CARG+3 FADDM #CAC+3 /B+D STARTE JA #CAD ENTRY #CSB #CSB, JA . FSTA #CARG STARTF FLDA #CARG /STARTF ROUNDS FNEG FADDM #CAC /A-C FLDA #CAC+3 FSUB #CARG+3 /B-D FSTA #CAC+3 STARTE JA #CSB ENTRY #CNG #CNG, JA . STARTF FLDA #CAC FNEG FSTA #CAC FLDA #CAC+3 FNEG FSTA #CAC+3 STARTE JA #CNG ENTRY #CEQ #CEQ, JA . JSA #CSB STARTF FLDA #CAC JNE NOTEQ FLDA #CAC+3 JNE NOTEQ FLDA ONE JA #CEQ NOTEQ, FCLA JA #CEQ ONE, F 1.0 ENTRY #CML #CML, JA . FSTA #CARG STARTF FLDA #CARG /STARTF ROUNDS FMUL #CAC /A*C FSTA TEMP FLDA #CARG+3 FMUL #CAC+3 /B*D FSTA TEMP2 FLDA #CARG FMULM #CAC+3 /B*C FLDA #CAC FMUL #CARG+3 /A*D FADDM #CAC+3 /A*D+B*C FLDA TEMP FSUB TEMP2 /A*C-B*D FSTA #CAC STARTE JA #CML ENTRY #CDV #CDV, JA . FSTA #CARG STARTF FLDA #CARG /STARTF ROUNDS FMUL #CAC+3 /B*C FSTA TEMP FLDA #CARG+3 FMUL #CAC /A*D FSTA TEMP2 FLDA #CARG FMULM #CAC /A*C FLDA #CAC+3 FMUL #CARG+3 /B*D FADDM #CAC /A*C+B*D FLDA #CARG FMULM #CARG /C*C FLDA #CARG+3 FMUL #CARG+3 /D*D FADDM #CARG /C*C+D*D FLDA TEMP FSUB TEMP2 /B*C-A*D FDIV #CARG /(B*C-A*D)/(C*C+D*D) FSTA #CAC+3 FLDA #CAC FDIV #CARG /(A*C+B*D)/(C*C+D*D) FSTA #CAC STARTE JA #CDV TEMP, 0;0;0 TEMP2, 0;0;0 #CARG, 0;0;0 0;0;0 ENTRY #CAC #CAC, 0;0;0 0;0;0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | / / C E X P / - - - - / / COMPLEX EXPONENT ROUTINE /Z=X+IY / / VERSION 5A 4-25-77 MH / / /CEXP(Z)=EXP(X)*(COS(Y)+I*SIN(Y)) /ENTER+EXIT IN COMPLEX /EXTERNAL EXP,SIN,COS / SECT CEXP JA #CEXP DPCHK TEXT +CEXP + CEXPXR, SETX XR SETB BP JA .+3 BP, F 0.0 XR, F 0.0 ARG, F 0.0 F 0.0 ORG 10*3+BP FNOP JA CEXPXR 0 RT, JA . BASE 0 #CEXP, STARTD FLDA 10*3 FSTA RT FLDA 0 SETB BP SETX XR BASE BP LDX 1,1 FSTA BP FLDA% BP,1 FSTA BP STARTE FLDA% BP FSTA ARG STARTF EXTERN EXP JSR EXP /EXP(X) JA CEX1 JA ARG CEX1, FSTA ETEMP EXTERN COS JSR COS /COS(Y) JA CEX2 JA ARG+3 CEX2, FSTA ARG EXTERN SIN JSR SIN /SIN(Y) JA CEX3 JA ARG+3 CEX3, FSTA ARG+3 FLDA ETEMP FMULM ARG FMULM ARG+3 STARTE FLDA ARG FSTA #CAC JA RT EXTERN #CAC ETEMP, F 0.0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | / / VERSION 5A 4-27-77 PT / SECT CHARS ENTRY CGET ENTRY CPUT TEXT +CHARS+ CHARXR, SETX XRCHAR SETB BPCHAR BPCHAR, F 0. XRCHAR, F 0. FROM, F 0. NCHAR, F 0. ORG 10*3+BPCHAR FNOP JA CHARXR 0 CHARTN, JA . BASE 0 START, JA . STARTD FLDA 10*3 FSTA CHARTN FLDA 0 SETX XRCHAR SETB BPCHAR BASE BPCHAR LDX 1,1 FSTA BPCHAR /STR SAVED IN BPCHAR FLDA% BPCHAR,1 FSTA STR FLDA% BPCHAR,1+ FSTA NCHAR FLDA% BPCHAR,1+ FSTA FROM /ADDR OF F STARTF FLDA% NCHAR ATX 0 JA START / CGET, JSA START TRAP4 CGETIT XTA 0 FSTA% FROM /TO 3 WORDS JA CHARTN / CPUT, JSA START FLDA% FROM ATX 1 FCLA TRAP4 CPUTIT JA CHARTN / SECT8 CHAR /ALL IN 1 PAGE CGETIT, 0 JMS FLDRTN TAD O2FLD DCA ORGFLD TAD XFLD DCA XR2FLD TAD PFLD DCA GFLD GFLD, 0 /STR FIELD TAD% STR-1 ORGFLD, 0 /THIS ROUTINE DCA LOC TAD XR /N RAR SNL CLA JMP RIGHT CLL TAD LOC RTR RTR RTR BOTH, AND P77 XR2FLD, 0 DCA% QXR+1 /PASS TO FPP CDF CIF 0 JMP% CGETIT RIGHT, TAD LOC JMP BOTH CADD, ADDR CGETIT 0 STR, 0 0 / CPUTIT, 0 JMS FLDRTN TAD QXR1 AND P7 RTL RAL TAD CDFINS DCA XR1FLD TAD O2FLD DCA O1FLD TAD O2FLD DCA O3FLD TAD PFLD DCA P1FLD XR1FLD, 0 TAD% QXR1+1 /F VALUE O1FLD, 0 AND P77 DCA LOC P1FLD, 0 TAD% STR-1 O3FLD, 0 DCA XR1FLD /USE AS A TMP TAD XR RAR SNL CLA JMP PRIGHT CLL TAD XR1FLD AND P77 /SAVE RIGHT HALF DCA XR1FLD TAD LOC RTL RTL RTL TAD XR1FLD PFLD, 0 DCA% STR-1 CIF CDF 0 JMP% CPUTIT PRIGHT, TAD XR1FLD AND P7700 TAD LOC JMP PFLD / FLDRTN, 0 TAD CADD AND P7 RTL RAL TAD CDFINS DCA O2FLD TAD QXR AND P7 RAL RTL TAD CDFINS DCA XFLD XFLD, 0 TAD% QXR+1 O2FLD, 0 DCA XR TAD XR RAR SNL TAD M1 CLL TAD STR+1 DCA STR-1 SZL CLA IAC CLL TAD STR AND P7 RAL RTL TAD CDFINS DCA PFLD /STR FLD JMP% FLDRTN P77, 77 CDFINS, 6203 P7, 7 QXR, ADDR XRCHAR LOC, 0 XR, 0 M1, -1 QXR1, ADDR XRCHAR+1 P7700, 7700 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | / / VERSION 5A 4-26-77 MH / SECT CHKEOF /CHECKS END OF FILE CONDITION. /ZEROS PASSED VARIABLE + PASSES ITS ADDRESS TO #EOFSW /FRTS DOES REST EXTERN #EOFSW BASE CHKBAS JA CODE NAME, TEXT +CHKEOF+ CHKBAS, F 0. CHKXR, F 0. BASE 0 CODE, STARTD FLDA 30 FSTA CHKRTN /RETURN ADDR FLDA 0 /GET PTR TO VARIABLE LIST BASE CHKBAS SETB CHKBAS SETX CHKXR FSTA CHKBAS LDX 1,1 FLDA% CHKBAS,1 /HERES PTR TO VAR ADDR FSTA CHKBAS JA PART2 ORG 10*3+CHKBAS FNOP JA NAME+3 PART2, FLDA CHKBAS FSTA #EOFSW /PASS ADDR TO SYS STARTF FCLA FSTA% CHKBAS /ZERO VAR CHKRTN, JA . |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 | /PDP-8A OPTION 1 (100 HZ) CLOCK ROUTINE................CLK8A / / / / / / / / / / / / /COPYRIGHT (C) 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE,OR ANY OTHER /COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH A SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMENT CORPORATION. / / /DEC ASSUMES NO RESPONSIBILITY FOR THE USEOR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / / / / / / / / /E.P. 11/6/75 / VERSION 5A 4/26/77 MH / / EXTERN #DISP /SYSTEM PAGE 0,NEEDED TO /PUT CLOCK STATUS ON PG0 /(CSTAT) FOR USE BY GEN /USER CLOCK SERVICE ROUTS EXTERN #T812 /RTS CPTYP EXTERN ONQI /INTERRUPT QUEUER CLLE= 6135 /AC11=1 INTRRUPTS ON. CLCL= 6136 /CLEAR CLOCK FLAG CLSK= 6137 /SKIP ON CLOCK FLAG. CSTAT=157 /IDOCLK PUTS CLSA BITS /IN HERE BASE FTMP0 INDEX FCNWD FIELD1 SYNC JSA SETUP /HERE TO READ A STRIG /INITIALIZE ARGS TRAP4 DOSYNC /FCNWD (XR) HOLDS STRIG /TO READ XTA FCNWD /=ANS=0,1 FSTA% FTMP1 /GIVE ANS TO CALLER JA GOBAK FTMP0, F 0.0 /BASE PAGE FTMP1, F 0.0 RPTR, 27;ADDR RTBL /PTR TO RATE TBL, ALSO /USED TO FLT OVRCNT (NOTE /THAT THE EXPONENT=27) MINRAT, F .02 /MIN ALLOWABLE RATE TOVR, F 0.0 NAME, TEXT +CLOCK + ORG 10*3+FTMP0 FNOP JA NAME+3 0 GOBAK, JA . RTBL, F 16.0 /CONSTANT USED TO CHK FOR /EXT CLK BIT IN FCNWD /THIS CONST MUST BE NE 0 MAXRAT, F4096, F 4096.0 /USED TO GET OVRFLO COUNT F 100000.0 /FASTEST RATE IN HERTZ F 10000.0 /NEXT FASTEST RATE F 1000.0 F 100.0 /SLOWEST RATE F 1.0 /USED BY TIME FOR EXT CLK BASE 0 SETUP, 0;0 /HERE TO INIT ALL FPP SUBS STARTD FLDA 30 /PICK UP RTN TO CALLER FSTA GOBAK FLDA 0 /GET PTR TO CALLERS ARGS SETX FCNWD /CLOCK XR AND BASE SETB FTMP0 BASE FTMP0 FSTA FTMP1 FLDA% FTMP1,P1 FSTA FTMP0 /PTR TO 1ST ARG FLDA% FTMP1,P2 FSTA FTMP1 /PTR TO 2ND ARG FLDA #T812 /TELLS PDP8,PDP12 ATX CPTYP /0=8=DK8ES,1=12=KW12A STARTF FLDA% FTMP0 /=1ST ARG ATX FCNWD /ALWAYS IN FCNWD JA SETUP ENTRY CLOCK CLOCK, JSA SETUP /HERE FOR CLOCK START FLDA% FTMP0 FSUB RTBL /FCNWD IS IN FAC,IF GE 16 JGE ITSEXT /(RTBL=16.0) THEN USER IS /REQUESTING AN EXTERNAL /CLOCK I.E. B8 OF FCNWD /IS SET. FLDA% FTMP1 /=REQUESTED RATE IN HERTZ FSUB MINRAT /.LE. MINUMUM RATE JLE GOTR-2 /MEANS STOP CLOCK. FADD MINRAT FSUB MAXRAT /CHK FOR TOO FAST JGT GOTR-2 LDX -4,OVRFLO /THERE ARE 4 BASIC RATES LDX 1,RATE /=INDEX INTO RTBL; UPON /TRAP(CLOCK) RATE=(0, /2,3,4,5,6) 0=STOP, /6=EXTERNAL /2-5=PROGRAMMABLE RATES LOP0, FLDA% RPTR,RATE+ /GET NEXT SLOWEST RATE FDIV% FTMP1 /=REQUESTED RATE IN HZ. /FAC=OVRFLO COUNT; FSUB F4096 /MUST BE MODULO 12 BITS. JLE GOTR /FOUND IT JXN LOP0,OVRFLO+ LDX 0,RATE /RATE IS TOO SLOW, STOP /CLOCK. GOTR, FADD F4096 /RESTORE FSTA TOVR ATX OVRFLO /OVER FLOW COUNT TRAP4 SETCLK /GO START CLOCK JA GOBAK /RTN TO CALLER ITSEXT, LDX 6,RATE /=RATE FOR EXT CLK FLDA% FTMP1 /REQUESTED RATE IS /INTERPRETED AS OVRFLO JA GOTR+1 /WHEN RATE IS EXTERNAL /MAGIC TABLE USED BY SETCLK TO SET CLOCK ENABLE /BITS. EVEN NUMBERED ENTRIES ARE FOR THE DK8ES; /ODD NUMBERED ONES ARE FOR THE KW12A. CLKTBL, 0675 /"STANDARD" DK BITS 300 /STND KW BITS 1 /DK STRIG1 BIT 60 /KW STRIG1 BITS 2 /DK S2 14 /KW S2 4 /S3 P3, 3 /S3 40 /DK ADC ON OVR BIT 400 /KW ADC ON OVR BIT /IF NOT NEXT PAGE DO ORG IFNEG .-200 < ORG .-SYNC&7600+200+SYNC > SETCLK, 0 /TRAP HERE TO START CLK /THIS ROUT HANDLES BOTH /DK8ES AND KW12A. CLCL /TRY AND CLEAR IT HERE???? / CLLR /STOP KW AND SET MODE 0; /NOP FOR DK. / CLEN /CLR KW12 ENABLE OR /READ DK ENABLE. / CLA / TAD P7540 /TOGGLE KW MODE 0 TO 1 TO / CLLR /CLR CLK COUNTER, OR SET /DK ENABLE BITS, RATE FOR / CLA CMA /BOTH NOW=7=STOP. / CLZE /CLR ALL DK ENABLE BITS, / CLSA /CLR STATUS OF BOTH, ALL CLA /IS NOW CLEAR. TAD FCNTBL+1 /SET PTR TO CLKTBL FOR /SETTING OF ENABLE REGS. TAD CPTYP /=0 IF PDP8 =1 IF PDP12 DCA FCNPTR /TBL ENTRIES ALTERNATE /FOR 8 AND 12. CPTYP SETS /PTR TO 1ST 8 OR 1ST 12 /ENTRY TAD IDOCLK /(AC=JMP AROUND). THE /FOLLOWING IS ONCE ONLY /CODE. THESE LOCS ARE /SUBSEQUENTLY USED AS /OPERANDS DCA .-1 /THE TAG "ISVBIT" MUST BE /IN FRONT OF THE STRIG /FLAGS (STFLG) TO COVER /THE ILLEGAL CASE OF /STRIG 0 IN A FORT CALL /TO SYNC. ISVBIT, TAD CPTYP /(AC=0,1) MAKE THE INST /RAR CLL (FOR DK) OR THE /INST RTR CLL FOR IDOCLK; STFLG, RAL CLL /BECAUSE STATUS BITS FOR TAD RARCLL /STRIGS DIFFER ON DK,KW. DCA LOP2+1 /SEE SUB IDOCLK. /THE ABOVE 3 LOCS ARE /SCHMITT TRIGGER FLAGS. /THE ORDER IS S1,S2,S3 /FOR PDP8 AND S3,S2,S1 /FOR PDP12. (CHK THE STATUS /BITS FOR DK AND KW). JMS% KONQI+1 /PUT CLOCK ON THE ITMP0, CLSK /INTERRUPT QUE /VIA ONQI. CLENAB, ADDR IDOCLK /THIS LOC WILL HOLD THE /ENABLE BITS FOR DK,KW AROUND, TAD RATE /(AC=0,2,3,4,5,6) RATE IS /SET BY FPP RTR CLL /START TO POSITION RATE RAR /BITS. B3-B5 FOR DK /B0-B2 FOR KW TAD CPTYP /(THIS IS TRICKY) NEED RAR /CPTYP IN LNK BECAUSE /POSITION OF RATE BITS /DIFFER FOR DK KW. TAD% FCNPTR /AC="STANDARD" /ENABLE BITS FOR DK,KW. SZL /IF ITS A KW THE RATE AND /AND STND BITS ARE ALREADY /POSITIONED AS FOLLOWS: /RRR011000000 /B0-B3 AND B5 WILL GO TO /KW CONTROL. B4,B5 WILL /GO TO ENABLE. B3 IS ADC /ON OVRFLO AND MAY BE SET /BELOW. B5 ON CONTROL IS /MODE 1. B4 AND B5 ON /ENABLE ARE BUFF PRESET TO /CLOCK COUNTER AND INTRUPT /ON OVRFLO RESPECTIVELY. JMP NOBIT-1 /ITS KW GO PUT IN CLENAB. RTR /ITS DK; POSITION RATE TO RAR /B3-B5. NOTE THAT THE LNK /(CPTYP=0) IS BEING USED. CMA /NOTE ALSO THAT THE RATE /AND STND BITS ARE THE 1S /COMP. OF WHAT THEY SHOULD /BE, IE CPTYP=LNK=0 /BECOMES /B2=1 OF ENABLE=BUFF /PRESET TO CLK CNTR ON /OVERFLO. LOOK AT THE RATE /BITS IN THE HANDBOOK FOR /BOTH DK,KW. R2,R5 /FOR DK IS 100HZ, 100KHZ /RESPECTIVELY. R2,R5 FOR /KW IS 100KHZ,100HZ. /1S COMP.OF 2=5 ETC. /SMARTEN UP STEVE! /THE FINAL VALUE OF THE /STND DK ENABLE BITS (1ST /ENTRY IN CLKTBL) IS LEFT /AS AN EXERCISE FOR THE /PROGRAMMER. JMP NOBIT-1 /GO PUT IN CLENAB LOP1, RAR CLL /ROT 1 FCN BIT INTO LNK. /B7=EXT CLK AND IS /IGNORED HERE. B8=ADC ON /OVRFLO, B9-B11 ARE STRIG3 /-STRIG1 RESP. BX=1=ENABLE /FCN. 0=DISABLE DCA FCNWD /PUT IT BACK (FCNWD IS /SET BY FPP) SNL /ENABLE FCN ? JMP NOBIT /NO TAD% FCNPTR /GET BITS FROM THE MAGIC TAD CLENAB /TABLE. DCA CLENAB /UPDATE ENABLE WORD. NOBIT, ISZ FCNPTR /ADV TO NEXT ISZ FCNPTR /TBL ENTRY. TAD FCNWD /WHEN FCNWD GOES TO 0 AND P17 /WE ARE ALL DONE. /THE "AND" IS DONE TO /PROTECT AGAINST A BAD /ARG FROM THE FORT CALL. P7540, SMA SZA /SMA IS SUPERFLOUS TO /THE ROUT; BUT IT /CREATES A NICE CONST. JMP LOP1 /MORE TO DO DCA STFLG /CLR THE SCHMITT DCA STFLG+1 /TRIGGER FLAGS. DCA STFLG+2 TAD OVRFLO /SET BUFF PRESET CIA /(FPP SET THIS ARG) / CLAB CLA TAD CLENAB /THIS IS FOR KW ONLY. AND P377 /AC=3XX. 3= OR BUFF PRE /INTO CLK CNTR AND ENAB /INT ON OVRFLO. /XX ARE THE STRIGS. / CLEN /SET KW ENABLE OR CLA /READ DK ENABLE. DCA OVRCNT+1 /CLR NUM OF CLK OVRFLOS DCA OVRCNT /SINCE TIME 0. TAD CPTYP /NEED TYPE IN ORDER TO RARCLL, RAR CLL /ISOLATE CONTROL TAD CLENAB /BITS FOR SZL /KW ? AND P7540 /YES, B0-B2 IS RATE, /B3 IS ADC, B5 IS BUFF /PRE TO CLK CNTR ON /OVRFLO, B6 IS MOX NIX. /IF DK ALL BITS MAY HAVE /MEANING CLA IAC /SET BIT 11 CLLE /ENABLE THE CLOCK INTERRUPTS / CLLR /START THE CLOCK CLA CIF CDF JMP% SETCLK /RTN TO RTS DOSYNC, 0 /HERE TO DISPOSITION A /A SCHMITT TRIGGER. TAD CPTYP /DK AND KW FLAGS ARE IN RAR CLL /REVERSE ORDER. IF DK /ARG IS OK; IF KW THEN /MUST SET 1=3, 2=2, 3=1 /TO GET INDEX TO /CORRECT FLAG. TAD FCNWD /=REQUESTED STRIG=1,2,3 /(SET BY FPP) SZL /DK ? CIA /NO KW AND P3 /IE 1 GOES TO -1 GOES /TO 3 ETC. "AND" ALSO /INSURES RANGE IS 0-3. /IF ARG IS 0 RESULT IS /ALWAYS 0. TAD KSTFLG+1 /GET PTR TO FLAG DCA SETCLK TAD% SETCLK /FLAG=0 IF TRIG HAS NOT /TRIPPED SINCE THE LAST /CALL TO SYNC; =1 /OTHERWISE IE RTN 0=FALSE DCA FCNWD /,1=TRUE (FPP WILL PICK / UP FCNWD) DCA% SETCLK /CLR FLAG ANYWAY CIF CDF JMP% DOSYNC /RTN TO RTS IDOCLK, JMP AROUND /HERE ON CLOCK INTERRUPT /(JMP AROUND IS A ONCE /ONLY CONSTANT). CLCL /JUST TO MAKE SURE! TAD KSTFLG+1 /SET PTR TO STRIG FLAGS. DCA ITMP0 / CLSA /GET CLOCK BITS. CLA CLL CML RAR /SIMULATE TICK DCAZ CSTAT /SAVE THEM FOR SOME TADZ CSTAT /BODY ELSE. SPA /OVER FLOW ? ISZ OVRCNT+1 /YES BUMP LO ORD CNTR SKP ISZ OVRCNT /BUMP HI ORD JMP DOTRIG /(HI ORD ISZ SKP IS /HARMLESS) LOP2, ISZ ITMP0 /ADV STRIG FLAG PTR. RAR CLL /(OR RTR CLL IF KW) /IE PUT STRIG BIT IN LNK. /IF DK THE ORDER OF /INTERROGATION IS S1,S2,S3 /IF KW THE ORDER IS S3, /S2,S1. THE STATUS BITS /FOR DK ARE ADJACENT IE / B9(S3),B10(S2),B11(S1) /FOR KW ITS EVERY OTHER, /B6(S1),B8(S2),B10(S3). DCA ISVBIT /SAVE WHATS LEFT. RAL /COPY LNK INTO FLAG IF=1 SZA /IE DONT CLR FLAG WHEN DCA% ITMP0 /ITS SET. TAD ISVBIT DOTRIG, AND P377 /THE "AND" INSURES THAT /THE HI ORD BITS ARE /CLRED SO THAT ISVBIT /GOES TO 0 WHEN ALL /STRIGS HAVE BEEN /DISPOSITIONED. IE /CLR OVRFLO BIT FOR DK,KW /AND CLR PRE-EVENT BIT /ON KW IF IT IS SET SZA /DONE ? JMP LOP2 /NO TAD #CLINT /CALL USER EXTENDED SZA CLA /CLOCK ROUT ? JMS% #CLINT+1 /YES JMP% IDOCLK /RTN TO IHANDL FCNPTR, OVRCNT, KONQI, ADDR ONQI P17, 17 P377, 377 FCNWD, 0 /FPP XRS CPTYP, 0 RATE, 0 P1, 1 P2, 2 OVRFLO, FCNTBL, ADDR CLKTBL KSTFLG, ADDR STFLG-1 ENTRY #CLINT #CLINT, 0;0 ENTRY TIME /FIGURE WHAT TIME IT IS TIME, JSA SETUP FLDA RPTR /=27;X;X IS USED TO FLOAT STARTD FLDA# OVRCNT /NUM OF CLK OVRFLOS SINCE STARTF /TIME 0 FNORM FMUL TOVR /=NUM OF BASIC TICKS PER /CLOCK OVER FLOW. /FAC=NUM OF TICKS SINCE /TIME 0. FDIV% RPTR,RATE /DIV BY BASIC RATE IN HZ /OR 1 IF EXTERNAL CLK. FSTA% FTMP0 /GIVE ANS TO CALLER, ALSO /LEAVE ANS IN FAC IN /CASE TIME WAS A FCN /CALL. ANS=ELAPSED TIME IN /SECONDS SINCE TIME 0 OR /NUM OF EXTERNAL UNIT JA GOBAK /TICKS |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 | / / VERSION 5A 4/26/77 MH / EXTERN #DISP /SYSTEM PAGE 0,NEEDED TO /PUT CLOCK STATUS ON PG0 /(CSTAT) FOR USE BY GEN /USER CLOCK SERVICE ROUTS EXTERN #T812 /RTS CPTYP EXTERN ONQI /INTERRUPT QUEUER CLZE=6130 /CLOCK IOTS CLSK=6131 CLLR=6132 /ALSO CLOE CLAB=6133 CLEN=6134 CLSA=6135 CSTAT=157 /IDOCLK PUTS CLSA BITS /IN HERE BASE FTMP0 INDEX FCNWD FIELD1 SYNC JSA SETUP /HERE TO READ A STRIG /INITIALIZE ARGS TRAP4 DOSYNC /FCNWD (XR) HOLDS STRIG /TO READ XTA FCNWD /=ANS=0,1 FSTA% FTMP1 /GIVE ANS TO CALLER JA GOBAK FTMP0, F 0.0 /BASE PAGE FTMP1, F 0.0 RPTR, 27;ADDR RTBL /PTR TO RATE TBL, ALSO /USED TO FLT OVRCNT (NOTE /THAT THE EXPONENT=27) MINRAT, F .02 /MIN ALLOWABLE RATE TOVR, F 0.0 NAME, TEXT +CLOCK + ORG 10*3+FTMP0 FNOP JA NAME+3 0 GOBAK, JA . RTBL, F 16.0 /CONSTANT USED TO CHK FOR /EXT CLK BIT IN FCNWD /THIS CONST MUST BE NE 0 MAXRAT, F4096, F 4096.0 /USED TO GET OVRFLO COUNT F 100000.0 /FASTEST RATE IN HERTZ F 10000.0 /NEXT FASTEST RATE F 1000.0 F 100.0 /SLOWEST RATE F 1.0 /USED BY TIME FOR EXT CLK BASE 0 SETUP, 0;0 /HERE TO INIT ALL FPP SUBS STARTD FLDA 30 /PICK UP RTN TO CALLER FSTA GOBAK FLDA 0 /GET PTR TO CALLERS ARGS SETX FCNWD /CLOCK XR AND BASE SETB FTMP0 BASE FTMP0 FSTA FTMP1 FLDA% FTMP1,P1 FSTA FTMP0 /PTR TO 1ST ARG FLDA% FTMP1,P2 FSTA FTMP1 /PTR TO 2ND ARG FLDA #T812 /TELLS PDP8,PDP12 ATX CPTYP /0=8=DK8ES,1=12=KW12A STARTF FLDA% FTMP0 /=1ST ARG ATX FCNWD /ALWAYS IN FCNWD JA SETUP ENTRY CLOCK CLOCK, JSA SETUP /HERE FOR CLOCK START FLDA% FTMP0 FSUB RTBL /FCNWD IS IN FAC,IF GE 16 JGE ITSEXT /(RTBL=16.0) THEN USER IS /REQUESTING AN EXTERNAL /CLOCK I.E. B8 OF FCNWD /IS SET. FLDA% FTMP1 /=REQUESTED RATE IN HERTZ FSUB MINRAT /.LE. MINUMUM RATE JLE GOTR-2 /MEANS STOP CLOCK. FADD MINRAT FSUB MAXRAT /CHK FOR TOO FAST JGT GOTR-2 LDX -4,OVRFLO /THERE ARE 4 BASIC RATES LDX 1,RATE /=INDEX INTO RTBL; UPON /TRAP(CLOCK) RATE=(0, /2,3,4,5,6) 0=STOP, /6=EXTERNAL /2-5=PROGRAMMABLE RATES LOP0, FLDA% RPTR,RATE+ /GET NEXT SLOWEST RATE FDIV% FTMP1 /=REQUESTED RATE IN HZ. /FAC=OVRFLO COUNT; FSUB F4096 /MUST BE MODULO 12 BITS. JLE GOTR /FOUND IT JXN LOP0,OVRFLO+ LDX 0,RATE /RATE IS TOO SLOW, STOP /CLOCK. GOTR, FADD F4096 /RESTORE FSTA TOVR ATX OVRFLO /OVER FLOW COUNT TRAP4 SETCLK /GO START CLOCK JA GOBAK /RTN TO CALLER ITSEXT, LDX 6,RATE /=RATE FOR EXT CLK FLDA% FTMP1 /REQUESTED RATE IS /INTERPRETED AS OVRFLO JA GOTR+1 /WHEN RATE IS EXTERNAL /MAGIC TABLE USED BY SETCLK TO SET CLOCK ENABLE /BITS. EVEN NUMBERED ENTRIES ARE FOR THE DK8ES; /ODD NUMBERED ONES ARE FOR THE KW12A. CLKTBL, 0675 /"STANDARD" DK BITS 300 /STND KW BITS 1 /DK STRIG1 BIT 60 /KW STRIG1 BITS 2 /DK S2 14 /KW S2 4 /S3 P3, 3 /S3 40 /DK ADC ON OVR BIT 400 /KW ADC ON OVR BIT /IF NOT NEXT PAGE DO ORG IFNEG .-200 < ORG .-SYNC&7600+200+SYNC > SETCLK, 0 /TRAP HERE TO START CLK /THIS ROUT HANDLES BOTH /DK8ES AND KW12A. CLLR /STOP KW AND SET MODE 0; /NOP FOR DK. CLEN /CLR KW12 ENABLE OR /READ DK ENABLE. CLA TAD P7540 /TOGGLE KW MODE 0 TO 1 TO CLLR /CLR CLK COUNTER, OR SET /DK ENABLE BITS, RATE FOR CLA CMA /BOTH NOW=7=STOP. CLZE /CLR ALL DK ENABLE BITS, CLSA /CLR STATUS OF BOTH, ALL CLA /IS NOW CLEAR. TAD FCNTBL+1 /SET PTR TO CLKTBL FOR /SETTING OF ENABLE REGS. TAD CPTYP /=0 IF PDP8 =1 IF PDP12 DCA FCNPTR /TBL ENTRIES ALTERNATE /FOR 8 AND 12. CPTYP SETS /PTR TO 1ST 8 OR 1ST 12 /ENTRY TAD IDOCLK /(AC=JMP AROUND). THE /FOLLOWING IS ONCE ONLY /CODE. THESE LOCS ARE /SUBSEQUENTLY USED AS /OPERANDS DCA .-1 /THE TAG "ISVBIT" MUST BE /IN FRONT OF THE STRIG /FLAGS (STFLG) TO COVER /THE ILLEGAL CASE OF /STRIG 0 IN A FORT CALL /TO SYNC. ISVBIT, TAD CPTYP /(AC=0,1) MAKE THE INST /RAR CLL (FOR DK) OR THE /INST RTR CLL FOR IDOCLK; STFLG, RAL CLL /BECAUSE STATUS BITS FOR TAD RARCLL /STRIGS DIFFER ON DK,KW. DCA LOP2+1 /SEE SUB IDOCLK. /THE ABOVE 3 LOCS ARE /SCHMITT TRIGGER FLAGS. /THE ORDER IS S1,S2,S3 /FOR PDP8 AND S3,S2,S1 /FOR PDP12. THE MAIN /REASON FOR REVERSING /THE ORDER IS BECAUSE /ENGINEERS NEVER CONSULT /PROGRAMMERS WHEN THEY /ARE BUILDING NEW /HARDWARE (CHK THE STATUS /BITS FOR DK AND KW). JMS% KONQI+1 /PUT CLOCK ON THE ITMP0, CLSK /INTERRUPT QUE /VIA ONQI. CLENAB, ADDR IDOCLK /THIS LOC WILL HOLD THE /ENABLE BITS FOR DK,KW AROUND, TAD RATE /(AC=0,2,3,4,5,6) RATE IS /SET BY FPP RTR CLL /START TO POSITION RATE RAR /BITS. B3-B5 FOR DK /B0-B2 FOR KW TAD CPTYP /(THIS IS TRICKY) NEED RAR /CPTYP IN LNK BECAUSE /POSITION OF RATE BITS /DIFFER FOR DK KW. TAD% FCNPTR /AC="STANDARD" /ENABLE BITS FOR DK,KW. SZL /IF ITS A KW THE RATE AND /AND STND BITS ARE ALREADY /POSITIONED AS FOLLOWS: /RRR011000000 /B0-B3 AND B5 WILL GO TO /KW CONTROL. B4,B5 WILL /GO TO ENABLE. B3 IS ADC /ON OVRFLO AND MAY BE SET /BELOW. B5 ON CONTROL IS /MODE 1. B4 AND B5 ON /ENABLE ARE BUFF PRESET TO /CLOCK COUNTER AND INTRUPT /ON OVRFLO RESPECTIVELY. JMP NOBIT-1 /ITS KW GO PUT IN CLENAB. RTR /ITS DK; POSITION RATE TO RAR /B3-B5. NOTE THAT THE LNK /(CPTYP=0) IS BEING USED. CMA /NOTE ALSO THAT THE RATE /AND STND BITS ARE THE 1S /COMP. OF WHAT THEY SHOULD /BE, IE CPTYP=LNK=0 /BECOMES /B2=1 OF ENABLE=BUFF /PRESET TO CLK CNTR ON /OVERFLO. LOOK AT THE RATE /BITS IN THE HANDBOOK FOR /BOTH DK,KW. R2,R5 /FOR DK IS 100HZ, 100KHZ /RESPECTIVELY. R2,R5 FOR /KW IS 100KHZ,100HZ. /1S COMP.OF 2=5 ETC. /SMARTEN UP STEVE! /THE FINAL VALUE OF THE /STND DK ENABLE BITS (1ST /ENTRY IN CLKTBL) IS LEFT /AS AN EXERCISE FOR THE /PROGRAMMER. JMP NOBIT-1 /GO PUT IN CLENAB LOP1, RAR CLL /ROT 1 FCN BIT INTO LNK. /B7=EXT CLK AND IS /IGNORED HERE. B8=ADC ON /OVRFLO, B9-B11 ARE STRIG3 /-STRIG1 RESP. BX=1=ENABLE /FCN. 0=DISABLE DCA FCNWD /PUT IT BACK (FCNWD IS /SET BY FPP) SNL /ENABLE FCN ? JMP NOBIT /NO TAD% FCNPTR /GET BITS FROM THE MAGIC TAD CLENAB /TABLE. DCA CLENAB /UPDATE ENABLE WORD. NOBIT, ISZ FCNPTR /ADV TO NEXT ISZ FCNPTR /TBL ENTRY. TAD FCNWD /WHEN FCNWD GOES TO 0 AND P17 /WE ARE ALL DONE. /THE "AND" IS DONE TO /PROTECT AGAINST A BAD /ARG FROM THE FORT CALL. /IN A FRIENDLY ENIVORN, /ITS NOT NECESSARY. /NEVER TRUST A FORTRAN /"PROGRAMMER". P7540, SMA SZA /SMA IS SUPERFLOUS TO /THE ROUT; BUT IT /CREATES A NICE CONST. JMP LOP1 /MORE TO DO DCA STFLG /CLR THE SCHMITT DCA STFLG+1 /TRIGGER FLAGS. DCA STFLG+2 TAD OVRFLO /SET BUFF PRESET CIA /(FPP SET THIS ARG) CLAB CLA TAD CLENAB /THIS IS FOR KW ONLY. AND P377 /AC=3XX. 3= OR BUFF PRE /INTO CLK CNTR AND ENAB /INT ON OVRFLO. /XX ARE THE STRIGS. CLEN /SET KW ENABLE OR CLA /READ DK ENABLE. DCA OVRCNT+1 /CLR NUM OF CLK OVRFLOS DCA OVRCNT /SINCE TIME 0. TAD CPTYP /NEED TYPE IN ORDER TO RARCLL, RAR CLL /ISOLATE CONTROL TAD CLENAB /BITS FOR SZL /KW ? AND P7540 /YES, B0-B2 IS RATE, /B3 IS ADC, B5 IS BUFF /PRE TO CLK CNTR ON /OVRFLO, B6 IS MOX NIX. /IF DK ALL BITS MAY HAVE /MEANING CLLR /START THE CLOCK CLA CIF CDF JMP% SETCLK /RTN TO RTS DOSYNC, 0 /HERE TO DISPOSITION A /A SCHMITT TRIGGER. TAD CPTYP /DK AND KW FLAGS ARE IN RAR CLL /REVERSE ORDER. IF DK /ARG IS OK; IF KW THEN /MUST SET 1=3, 2=2, 3=1 /TO GET INDEX TO /CORRECT FLAG. TAD FCNWD /=REQUESTED STRIG=1,2,3 /(SET BY FPP) SZL /DK ? CIA /NO KW AND P3 /IE 1 GOES TO -1 GOES /TO 3 ETC. "AND" ALSO /INSURES RANGE IS 0-3. /IF ARG IS 0 RESULT IS /ALWAYS 0. TAD KSTFLG+1 /GET PTR TO FLAG DCA SETCLK TAD% SETCLK /FLAG=0 IF TRIG HAS NOT /TRIPPED SINCE THE LAST /CALL TO SYNC; =1 /OTHERWISE IE RTN 0=FALSE DCA FCNWD /,1=TRUE (FPP WILL PICK / UP FCNWD) DCA% SETCLK /CLR FLAG ANYWAY CIF CDF JMP% DOSYNC /RTN TO RTS IDOCLK, JMP AROUND /HERE ON CLOCK INTERRUPT /(JMP AROUND IS A ONCE /ONLY CONSTANT). TAD KSTFLG+1 /SET PTR TO STRIG FLAGS. DCA ITMP0 CLSA /GET CLOCK BITS. DCAZ CSTAT /SAVE THEM FOR SOME TADZ CSTAT /BODY ELSE. SPA /OVER FLOW ? ISZ OVRCNT+1 /YES BUMP LO ORD CNTR SKP ISZ OVRCNT /BUMP HI ORD JMP DOTRIG /(HI ORD ISZ SKP IS /HARMLESS) LOP2, ISZ ITMP0 /ADV STRIG FLAG PTR. RAR CLL /(OR RTR CLL IF KW) /IE PUT STRIG BIT IN LNK. /IF DK THE ORDER OF /INTERROGATION IS S1,S2,S3 /IF KW THE ORDER IS S3, /S2,S1. THE STATUS BITS /FOR DK ARE ADJACENT IE / B9(S3),B10(S2),B11(S1) /FOR KW ITS EVERY OTHER, /B6(S1),B8(S2),B10(S3). DCA ISVBIT /SAVE WHATS LEFT. RAL /COPY LNK INTO FLAG IF=1 SZA /IE DONT CLR FLAG WHEN DCA% ITMP0 /ITS SET. TAD ISVBIT DOTRIG, AND P377 /THE "AND" INSURES THAT /THE HI ORD BITS ARE /CLRED SO THAT ISVBIT /GOES TO 0 WHEN ALL /STRIGS HAVE BEEN /DISPOSITIONED. IE /CLR OVRFLO BIT FOR DK,KW /AND CLR PRE-EVENT BIT /ON KW IF IT IS SET SZA /DONE ? JMP LOP2 /NO TAD #CLINT /CALL USER EXTENDED SZA CLA /CLOCK ROUT ? JMS% #CLINT+1 /YES JMP% IDOCLK /RTN TO IHANDL FCNPTR, OVRCNT, KONQI, ADDR ONQI P17, 17 P377, 377 FCNWD, 0 /FPP XRS CPTYP, 0 RATE, 0 P1, 1 P2, 2 OVRFLO, FCNTBL, ADDR CLKTBL KSTFLG, ADDR STFLG-1 ENTRY #CLINT #CLINT, 0;0 ENTRY TIME /FIGURE WHAT TIME IT IS TIME, JSA SETUP FLDA RPTR /=27;X;X IS USED TO FLOAT STARTD FLDA# OVRCNT /NUM OF CLK OVRFLOS SINCE STARTF /TIME 0 FNORM FMUL TOVR /=NUM OF BASIC TICKS PER /CLOCK OVER FLOW. /FAC=NUM OF TICKS SINCE /TIME 0. FDIV% RPTR,RATE /DIV BY BASIC RATE IN HZ /OR 1 IF EXTERNAL CLK. FSTA% FTMP0 /GIVE ANS TO CALLER, ALSO /LEAVE ANS IN FAC IN /CASE TIME WAS A FCN /CALL. ANS=ELAPSED TIME IN /SECONDS SINCE TIME 0 OR /NUM OF EXTERNAL UNIT JA GOBAK /TICKS |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | / / C L O G / - - - - / / VERSION 5A 4-27-77 PT / /COMPLEX LOG ROUTINE / /ENTER + EXIT IN COMPLEX / /Z=X+IY /LOG(Z)=LOG(ABS(Z))+I*THETA /ABS(Z)=SQRT(X*X+Y*Y) /THETA=ATAN(Y/X) / /CALLS REAL SQRT,LOG,ATAN2 / SECT CLOG JA #CLOG DPCHK TEXT +CLOG + CLOGXR, SETX XR SETB BP JA .+3 BP, F 0.0 XR, F 0.0 F 0.0 ARG, F 0.0 F 0.0 ORG 10*3+BP FNOP JA CLOGXR 0 RT, JA . BASE 0 #CLOG, STARTD FLDA 10*3 FSTA RT FLDA 0 SETB BP SETX XR BASE BP LDX 1,1 FSTA BP FLDA% BP,1 FSTA BP STARTE FLDA% BP FSTA ARG STARTF EXTERN ATAN2 JSR ATAN2 JA CL1 JA ARG+3 /ATAN(Y/X) JA ARG CL1, FSTA ETEMP FLDA ARG FMULM ARG FLDA ARG+3 FMUL ARG+3 /X*X+Y*Y FADD ARG FSTA ARG EXTERN SQRT JSR SQRT /TAKE SQRT JA CL2 JA ARG CL2, FSTA ARG EXTERN ALOG /ALOG(ABS(Z)) JSR ALOG JA CL3 JA ARG CL3, FSTA ARG /REAL PART FLDA ETEMP /IMAGINARY PART FSTA ARG+3 STARTE FLDA ARG FSTA #CAC JA RT EXTERN #CAC ETEMP, F 0.0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | / / C M P L X / - - - - - / / VERSION 5A 4-27-77 PT / /ENTER IN REAL,EXIT IN COMPLEX /CMPLX(X,Y) /Z=X+IY / SECT CMPLX JA #CMPLX DPCHK TEXT +CMPLX + CMPXR, SETX XR SETB BP BP, F 0.0 XR, F 0.0 PTR1, F 0.0 ARG, F 0.0 F 0.0 ORG 10*3+BP FNOP JA CMPXR 0 RT, JA . BASE 0 #CMPLX, STARTD FLDA 10*3 FSTA RT FLDA 0 SETB BP SETX XR BASE BP LDX 1,1 FSTA BP FLDA% BP,1 FSTA PTR1 /ADDR OF X FLDA% BP,1+ FSTA BP /ADDR OF Y STARTF FLDA% PTR1 FSTA ARG /X FLDA% BP FSTA ARG+3 /Y STARTE FLDA ARG /X+IY FSTA #CAC /SAVE IN CMPLX AC JA RT EXTERN #CAC |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | / / / C O S / - - - / /SUBROUTINE COS(X) / / VERSION 5A 4-27-77 PT / SECT COS JA #COS TEXT +COS + COSXR, SETX XRCOS SETB BPCOS BPCOS, FNOP 0 0 XRCOS, F 0.0 COS1, F 0.0 FPI2CS, 1 /PI DIVIDED BY 2 3110 3755 ORG 10*3+BPCOS FNOP JA COSXR 0 COSRTN, JA . BASE 0 #COS, STARTD FLDA 10*3 FSTA COSRTN FLDA 0 SETX XRCOS SETB BPCOS BASE BPCOS LDX 1,1 FSTA BPCOS FLDA% BPCOS,1 /ADDR OF X FSTA BPCOS STARTF FLDA% BPCOS /GET X FADD FPI2CS /ADD IN PI OVER 2 FSTA COS1 EXTERN SIN JSR SIN /AND CALL THE SIN JA COSRTN JA COS1 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | / / / / C O S D / - - - - / /SUBROUTINE COSD(X) / / VERSION 5A 4-27-77 PT / SECT COSD JA #COSD TEXT +COSD + COSDXR, SETX XRCOSD SETB BPCOSD BPCOSD, FNOP 0 0 XRCOSD, F 0.0 COSD90, F 90. COSD91, 6 3451 3560 COSD1, F 0.0 ORG 10*3+BPCOSD FNOP JA COSDXR 0 CSDRTN, JA . BASE 0 #COSD, STARTD FLDA 10*3 FSTA CSDRTN FLDA 0 SETX XRCOSD SETB BPCOSD BASE BPCOSD LDX 1,1 FSTA BPCOSD FLDA% BPCOSD,1 /ADDR OF X FSTA BPCOSD STARTF FLDA% BPCOSD /GET X IN DEGREES FADD COSD90 /ADD IN 90 FDIV COSD91 /CONVERT TO REDIANS FSTA COSD1 EXTERN SIN JSR SIN /CALL THE SINE JA CSDRTN JA COSD1 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | / / VERSION 5A 4-27-77 PT / / C O S H / - - - - / /SUBROUTINE COSH(X) / / VERSION 5A 4-27-77 PT SECT COSH JA #COSH COSHE, FLDA COSHB /GIVE INFINITY IN CASE OF NO REC EXTERN #ARGER TRAP4 #ARGER TEXT +COSH + COSHXR, SETX XRCOSH SETB BPCOSH BPCOSH, FNOP 0 0 XRCOSH, F 0.0 COSH7, F 0.0 COSH8, F 0.0 F1COSH, F 1. F2COSH, F 2. ORG 10*3+BPCOSH FNOP JA COSHXR 0 CSHRTN, JA . / COSHLG, 0 2613 4412 / COSHB, 3777 3777 7777 / / COSH1, F 88.029 /LIMIT FACTOR. BASE 0 #COSH, STARTD FLDA 10*3 FSTA CSHRTN FLDA 0 SETX XRCOSH SETB BPCOSH BASE BPCOSH LDX 1,1 FSTA BPCOSH FLDA% BPCOSH,1 /ADDR OF X FSTA BPCOSH STARTF FLDA% BPCOSH /GET X FSTA COSH8 /SAVE ARGUMENT JGE .+3 /ABS(X) FNEG FSTA COSH7 FSUB COSH1 /TEST FOR LIMITS. JGE COSHBG EXTERN EXP JSR EXP /EXP(X) JA .+4 JA COSH8 FSTA COSH7 FLDA F1COSH /1. FDIV COSH7 / 1./EXP(X) FADD COSH7 / EXP(X)+1./EXP(X) FDIV F2COSH / (EXP(X)+1./EXP(X))2. JA CSHRTN /AND THAT IS THE DEFINITION OF COSH. / / COSHBG, FSUB COSHLG /SEE IF TOO BIG JGT COSHE /YEP. ERROR FADD COSH1 /READD IN SUBTRACTION FACTOR. FSTA COSH8 / EXP(ABS(X)-LN(2)) EXTERN EXP JSR EXP JA .+4 JA COSH8 JA CSHRTN / A VERY GOOD APPROXIMATION. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | / / C S I N / - - - - / / VERSION 5A 4-27-77 PT / /COMPLEX SIN AND COS ROUTINE / /CCOS(X+I*Y)=COS(X)*COSH(Y)-SIN(X)*SINH(Y) / /CSIN(X+I*Y)=SIN(X)*COSH(Y)+COS(X)*SINH(Y) / /CALLS SIN,COS,COSH,SINH / SECT CSIN JA #CSIN DPCHK TEXT +CSIN + CSINXR, SETX XR SETB BP JA .+3 BP, F 0.0 XR, F 0.0 ARG, F 0.0 F 0.0 C, F 0.0 CH, F 0.0 S, F 0.0 ORG 10*3+BP FNOP JA CSINXR 0 RT, JA . SH, F 0.0 BASE 0 #CSIN, SETX XR LDX 0,0 COM, STARTD FLDA 10*3 FSTA RT FLDA 0 SETB BP BASE BP LDX 1,1 FSTA BP FLDA% BP,1 FSTA BP STARTE FLDA% BP FSTA ARG STARTF EXTERN COS JSR COS JA CSA JA ARG /COS(X) CSA, FSTA C EXTERN SIN JSR SIN JA CSB JA ARG CSB, FSTA S /SIN(X) EXTERN SINH JSR SINH JA CSC JA ARG+3 CSC, FSTA SH /SINH(Y) EXTERN COSH JSR COSH JA CSD JA ARG+3 CSD, FSTA CH /COSH(Y) /XR0 IS 0 FOR CSIN AND 1 FOR CCOS JXN CALCOS,0 FLDA S FMUL CH FSTA ARG /SIN*COSH FLDA C CSE, FMUL SH FSTA ARG+3 /COS*SINH STARTE FLDA ARG FSTA #CAC JA RT EXTERN #CAC /DO COS / CALCOS, FLDA C FMUL CH FSTA ARG FLDA S FNEG JA CSE ENTRY CCOS CCOS, SETX XR LDX 1,0 JA COM |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | / / C S Q R T / - - - - - / / VERSION 5A 4-27-77 PT / /COMPLEX SQUARE ROOT ROUTINE /ENTER+ EXIT IN COMPLEX /Z=X+IX / /SQRT(Z)=SQRT(R)*COS(THETA)+SIN(THETA)) / /R=SQRT(X*X+Y*Y) /THETA=ATAN2(Y/X)/2 / /CALLS SQRT,ATAN2,SIN,COS / SECT CSQRT JA #CSQRT DPCHK TEXT +CSQRT + CSQRTX, SETX XR SETB BP JA .+3 BP, F 0.0 XR, F 0.0 ARG, F 0.0 F 0.0 THETA, F 0.0 FP2, F 2.0 ORG 10*3+BP FNOP JA CSQRTX 0 RT, JA . BASE 0 #CSQRT, STARTD FLDA 10*3 FSTA RT FLDA 0 SETB BP SETX XR BASE BP LDX 1,1 FSTA BP FLDA% BP,1 FSTA BP STARTE FLDA% BP FSTA ARG STARTF EXTERN ATAN2 JSR ATAN2 /ATAN(Y/X) JA CSA JA ARG+3 JA ARG CSA, FDIV FP2 /ATAN/2 FSTA THETA FLDA ARG FMULM ARG /X*X FLDA ARG+3 FMUL ARG+3 /Y*Y FADD ARG /X*X+Y*Y FSTA ARG EXTERN SQRT /SQRT(X*X+Y*Y) JSR SQRT JA CSB JA ARG CSB, FSTA ARG /R EXTERN SQRT JSR SQRT JA CSC JA ARG /SQRT(R) CSC, FSTA ARG /SQRT(R) EXTERN SIN JSR SIN /SIN(THETA/2) JA CSD JA THETA CSD, FMUL ARG /*SQRT(X) FSTA ARG+3 EXTERN COS JSR COS /COS(THETA/2)*SQRT(R) JA CSE JA THETA CSE, FMUL ARG FSTA ARG STARTE FLDA ARG FSTA #CAC JA RT EXTERN #CAC |
> > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | / / VERSION 5A 4-27-77 PT / SECT DABS BASE 0 DPCHK DPABS, FLDA 0 /GET RETURN ADDRESS STARTD FSTA RETRN FADD TWO /GET ADDRESS OF ARG P7S FSTA 3 FLDA% 3 FSTA 3 STARTE FLDA% 3 JGE RETRN /POSITIVE, SKIP NEGATE FNEG RETRN, 0;0 TWO, 0;2 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 | / / / SUBROUTINE DATAN(X) / / VERSION 5A 4-26-77 (MH) / /X,THE ARGUMENT, IS REDUCED TO /0<X<1/2 /BY THE IDENTITIES: /ATAN(-X)=-ATAN(X) /IF X>1.0 THEN ATAN(X)=PI/2 - ATAN(1/X) /IF .5<X<1.0 THEN ATAN(X)=ATAN(1/2)+ATAN(2*X-(1/(X+2))) /ATAN(X)=X FOR X<2^(-15) / / / SECT DATAN JA #DATAN DPCHK / TEXT +DATAN + DATNXR, SETX XRDATN SETB BPDATN BPDATN, F 0.0 XRDATN, F 0.0 DATFP1, F 1.0 F 0.0 DATLOW, -15 2000 0000 0000 0000 0000 / ORG 10*3+BPDATN FNOP JA DATNXR 0 DATRTN, JA . / LAMBDA, 0004 3057 7537 4017 0276 4536 DATB0, 0005 3221 3522 3121 3352 5066 DATA1, 0007 5372 4104 3437 1766 6167 DATB1, 0003 3135 1757 0565 4141 4270 DATA2, 0001 5473 7524 1112 4701 2723 DATB2, 0002 2065 4070 1015 2710 3176 DATA3, 7775 5374 4326 3317 1675 3124 DATB3, 0001 2410 5255 0370 2076 6374 PIS2, 0001 3110 3755 2421 0264 3013 ATN1S2, 7777 3553 0634 0530 3443 6406 DATP5, 7777 3777 7777 7777 7777 7776 X, F 0.0 F 0.0 C0, F 0.0 F 0.0 DT1, F 0.0 F 0.0 DATFP2, F 2.0 F 0.0 Z, F 0.0 F 0.0 / /PICK UP RETURN AND ARGUMENT BASE 0 #DATAN, STARTD FLDA 10*3 FSTA DATRTN FLDA 0 SETX XRDATN SETB BPDATN BASE BPDATN LDX 1,1 FSTA BPDATN FLDA% BPDATN,1 FSTA BPDATN STARTE FLDA% BPDATN /GET X LDX -1,0 /SIGN JGE .+5 LDX 0,0 /SAVE SIGN FNEG FSTA X /SAVE ARG / /CHECK ARGAINST LOWER LIMIT FLDA X FSUB DATLOW /TOO SMALL? JLE DATGO /YES ATAN(X)=X LDX -1,1 FCLA FSTA C0 / /REDUCE X TO RANGE 0<X<.5 DATA, FLDA X FSUB DATFP1 JLE DATB />1? FLDA DATFP1 /YES FDIV X /X=1/X LDX 0,1 /SET FLAG FSTA X DATB, FLDA X FSUB DATP5 />= .5 JLT DATC FLDA X /X=(2X-1)/(X+2) FADD DATFP2 FSTA DT1 /TEMP FLDA X FMUL DATFP2 FSUB DATFP1 FDIV DT1 FSTA X FLDA ATN1S2 /C0=ATAN(1/2) FSTA C0 /COMPUTE ATAN USING ALGORITHM DATC, FLDA X FMUL X FSTA Z /Z=X*X FLDA Z FADD DATB3 /Z+B3 FSTA DT1 FLDA DATA3 FDIV DT1 /A3/(Z+B3) FADD DATB2 FADD Z /ADD Z+B2 FSTA DT1 /TEMP FLDA DATA2 /A2/TEMP FDIV DT1 FADD DATB1 FADD Z /ADD Z +B1 FSTA DT1 /TEMP FLDA DATA1 /A1/TEMP FDIV DT1 FADD DATB0 /ADD Z+B0 FADD Z FSTA DT1 FLDA LAMBDA /LAMBDA*X FMUL X FDIV DT1 /DIV BY THE REST FADD C0 FSTA X JXN DATD,1 /WAS X>1 ORIGINALLY? FLDA PIS2 /Y ATAN(X)=PI/2-ATAN(X) FSUB X DATD, JXN DATRTN,0 /WAS X<0? FNEG /Y JA DATRTN DATGO, FLDA X JA DATD |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | / / / / D A T A N 2 / - - - - - - / /SUBROUTINE DATAN2(Y,X) / / VERSION 5A 4-27-77 PT / SECT DATAN2 JA #DATN2 DPCHK TEXT +DATAN2+ ATN2XR, SETX XRATN2 SETB BPATN2 BPATN2, FNOP 0 0 XRATN2, F 0.0 YCOR, F 0.0 0;0;0 XCOR, F 0.0 0;0;0 ORG 10*3+BPATN2 FNOP JA ATN2XR 0 AT2RTN, JA . FPIAT2, 2 3110 /PI 3755 2421 0264 3016 ATPI, 0001 3110 /PI/2 3755 2421 0264 3016 BASE 0 #DATN2, STARTD FLDA 10*3 FSTA AT2RTN FLDA 0 SETX XRATN2 SETB BPATN2 BASE BPATN2 LDX 1,1 FSTA BPATN2 FLDA% BPATN2,1 /ADDR OF Y FSTA YCOR FLDA% BPATN2,1+ /ADDR OF X FSTA XCOR STARTE FLDA% YCOR FSTA YCOR /SAVE FOR A SECOND LDX 1,2 /POSITIVE Y JEQ ATN0 JGT ATN1 LDX 0,2 ATN1, FLDA% XCOR /GET X - THE QUADRAND FSTA XCOR /+MOVE IT TO A SAFE PLACE JEQ ATASP FLDA YCOR /Y/X FDIV XCOR FSTA YCOR EXTERN DATAN JSR DATAN /CALL ATAN JA .+4 /TAKE ARCTAN OF Y/X JA YCOR FSTA YCOR /SAVE IT AWAY JGE A2 /SKIP IF 1ST OR 3RD QUADS FADD FPIAT2 /ADD PI FOR 4TH QUAD FSTA YCOR A2, JXN AT2RTN,2 /DONE IF 1 OR 4 Q FLDA YCOR FSUB FPIAT2 /2ND OR 3RD Q JA AT2RTN ATASP, FLDA ATPI /PI/2 JXN ATNG,2 FNEG ATNG, JA AT2RTN ATN0, FLDA% XCOR JLT POSX FCLA /X POS, ANS =0 JA AT2RTN POSX, FLDA FPIAT2 /X LT 0, ANS = PI JA AT2RTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | / / VERSION 5A 4/28/77 PT / SECT8 DATE JA #ST EXTERN #DATE #XR, ORG .+10 TEXT +DATE + #RET, #BASE, ORG .+3 MONTH, ORG .+3 DAY, ORG .+3 YEAR, ORG .+3 TEMP, ORG .+3 DATADR, 0 JA #DATE-1 /ADDRESS OF PS8 DATE WORD ORG 10*3+#BASE FNOP JA #RET 0 DRTN, JA . BASE 0 NEWDAT, 0 CDF 0 TAD% BIPCCL AND BITMSK CLL RTR RTR DCA DATEMP CDF CIF 0 JMP% NEWDAT BIPCCL, 7777 BITMSK, 600 #ST, STARTD 0210 FSTA DRTN 0200 BASE #BASE SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA MONTH FLDA% #BASE,1+ FSTA DAY FLDA% #BASE,1+ FSTA YEAR FLDA% DATADR /GET THE PS-8 DATE WORD FSTA TEMP /SAVE IT FCLA FSTA TEMP,0 /ZERO EXPONENT AND HIGH HALF OF MANTISSA LDX 10,1 /SHIFT COUNT FLDA TEMP /GET IT BACK ALN 1 /ISOLATE THE MONTH ATX 1 /SAVE THE MONTH LDX -4,2 /DAY SHIFT COUNT FLDA TEMP /GET BACK THE DATE ALN 2 /SHIFT MONTH BITS INTO /HIGH HALF OF MANTISSA FSTA TEMP /SAVE THIS FCLA FSTA TEMP,0 /ISOLATING DAY/YEAR BITS FLDA TEMP /GET THEM BACK LDX 7,2 /NOW ISOLATE DAY ALN 2 ATX 2 /AND SAVE IT IN 2 FLDA TEMP /GET DAY/YEAR BITS LDX -5,3 /PREPARE TO REMOVE DAY BITS ALN 3 /BY SHIFTING THEM INTO HIGH HALF OF MANTISSA FSTA TEMP /SAVE THEM FCLA FSTA TEMP,0 /ZERO DAY BITS FLDA TEMP /RESTORE YEAR BITS LDX 11,3 /SHIFT BACK ALN 3 ATX 3 /PUT THEM INTO XR 3 TRAP4 NEWDAT STARTF /RE-ENTER F MODE XTA 1 /GET MONTH FSTA% MONTH /RETURN IN ARG XTA 2 /NOW DAY FSTA% DAY ADDX 3662,3 /MAKE IT + 1970 ADDX 0,3 DATEMP=.-1 XTA 3 /NOW YEAR FSTA% YEAR JA DRTN /RETURN END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | / SUBROUTINE DBLE - REAL TO DBL PREC / / VERSION 5A 4-27-77 PT / SECT DBLE BASE 0 DPCHK FLDA 0 STARTD FSTA RETRN /SAVE RETURN FADD TWO /ADDR OF ARG POINTER FSTA 3 FLDA% 3 /ADDR OF ARG FSTA 3 STARTF FLDA% 3 /GET ARG FSTA DTEMP FCLA FSTA DTEMP+3 /0 FOR LAST 3 WORDS STARTE FLDA DTEMP RETRN, 0;0 /FLOAT IS A NOP TWO, 0;2 DTEMP, F 0.0 F 0.0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | / / / D C O S / - - - - / /SUBROUTINE DCOS(X) / / VERSION 5A 4-27-77 PT / SECT DCOS JA #DCOS DPCHK TEXT +DCOS + COSXR, SETX XRCOS SETB BPCOS BPCOS, FNOP 0 0 0 0 0 XRCOS, F 0.0 F 0.0 COS1, F 0.0 F 0.0 FPI2CS, 1 /PI DIVIDED BY 2 3110 3755 2421 0264 3016 ORG 10*3+BPCOS FNOP JA COSXR 0 COSRTN, JA . BASE 0 #DCOS, STARTD FLDA 10*3 FSTA COSRTN FLDA 0 SETX XRCOS SETB BPCOS BASE BPCOS LDX 1,1 FSTA BPCOS FLDA% BPCOS,1 /ADDR OF X FSTA BPCOS STARTE FLDA% BPCOS /GET X FADD FPI2CS /ADD IN PI OVER 2 FSTA COS1 EXTERN DSIN JSR DSIN /AND CALL THE SIN JA COSRTN JA COS1 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 | / / / SUBROUTINE DEXP / / VERSION 5A 4-26-77 MH / /E^X=2^(X*LOG2(E)) /E^X=2^(M+F) /M=INTEGER; F=FRACTION / /2^(M+F)=2^(M+N+R) /WHERE 0<R<1/8 /AND M+N+R=M+F=X*LOG2(E) / /(2^M)*(2^N)*(2^R)=E^X / /2^M IS CALCULATED BY SUCCESSIVE MULTIPLIES /2^N IS CALCULATED BY LOOK UP /2^R=1+<A4/((B4/R)-C4+(D4*R)+(H4/(R+(B4/R))))> / /RESTRICTIONS: /X=0 IMPLIES E^X=1 / /X>88.028 IMPLIES E^X=3377/3377/3777/7777/777/7777 / /X<-88.028 IMPLIES E^X=0 / / / SECT DEXP JA #DEXP DPCHK TEXT +DEXP + / DEXPXR, SETX XRDEXP SETB BPDEXP / /BEGINNING OF BASE PAGE / BPDEXP, F 0.0 XRDEXP, F 0.0 X, F 0.0 F 0.0 / ORG 10*3+BPDEXP FNOP JA DEXPXR 0 DEXRTN, JA . / TOPLIM, 3377 3377 3777 7777 7777 7777 M, F 0.0 F 0.0 N, F 0.0 F 0.0 R, F 0.0 F 0.0 LOG2E, 0001 /1.4426950408889634 2705 2435 4512 7013 7603 DFP125, 7775 /.125 3777 7777 7777 7777 7776 DEXFP1, F 1.0 F 0.0 / DFR1S8, 0001 /2^1/8 2134 5340 7437 2505 7302 DFP2S8, 0001 /2^2/8 2301 5770 1214 3334 2524 DFP3S8, 0001 /2^3/8 2457 7553 2515 4250 4720 DFP4S8, 0001 /2^4/8 2650 1171 4637 6357 1425 DFP5S8, 0001 /2^5/8 3053 1625 0212 5174 3070 DFP6S8, 0001 /2^6/8 3272 1176 3126 5516 5532 DFP7S8, 0001 /2^7/8 3526 0143 3476 7222 0722 / / DEXA4, 0006 /60.593191717336463 3622 7666 6462 2157 5534 DEXB4, 0007 /87.417497202235527 2566 5341 0613 6705 7214 DEXC4, 0005 /30.296595858668232 3622 7666 6462 2157 5546 DEXD4, 0001 /1.0500 2063 1463 1463 1463 1462 DEXH4, 0010 /214.17286814547704 3261 3040 4261 5654 0240 DTEMP1, F 0.0 F 0.0 DFP2, F 2.0 F 0.0 / BASE 0 #DEXP, STARTD FLDA 10*3 FSTA DEXRTN FLDA 0 SETX XRDEXP SETB BPDEXP BASE BPDEXP LDX 1,1 LDX 73,2 /FOR ALIGNING FSTA BPDEXP FLDA% BPDEXP,1 /ADDRESS OF X FSTA BPDEXP STARTE FLDA% BPDEXP /GET X LDX 0,0 JGT DEX1 /CHECK SIGN FNEG LDX -1,0 /SET FLAG DEX1, JNE DEX2 /X=0 FLDA DEXFP1 /E^0=1 JA DEXRTN DEX2, FSTA X JA DEX4 DEX3, FCLA JA DEXRTN /RETURN 0 FOR TOO SMALL / /SET UP M+N+R=X*LOG2(E) DEX4, FLDA LOG2E FMULM X FLDA X ALN 2 /FIX FNORM /FLOAT FSTA M /INTEGER PART FLDA X FSUB M FSTA N /FRACTION JNE DEX50 /0 IS SPECIAL CASE FLDA DEXFP1 /1.0 FSTA N /N FSTA R /R JA DEX20 /SKIP / /CALCULATE N+R DEX50, LDX 0,1 FLDA N FSTA R /IF < .125 ALREADY DEX5, FSUB DFP125 /-.125 JLT DEX6 /DONE IF .LT. FSTA R /STORE REMAINDER ADDX 1,1 /NEXT POWER OF 2 JA DEX5 /AND AGAIN / /GET N FROM TABLE DEX6, FLDA DEXFP1,1 FSTA N / /NOW CALCULATE R FLDA R /IF R=0 JNE DEX7 FLDA DEXFP1 /2^R=1 FSTA R JA DEX20 /NO CALCULATION / / DEX7, FLDA DEXB4 FDIV R /(B4/R) FSTA X FLDA DEXD4 /D4*R FMUL R FADD X /+(B4/R) FSUB DEXC4 /-C4 FSTA DTEMP1 FLDA R FADD X /R+(B4/R) FSTA R FLDA DEXH4 FDIV R /H4/(R+B4/R) FADD DTEMP1 FSTA DTEMP1 FLDA DEXA4 FDIV DTEMP1 FADD DEXFP1 FSTA R / /CALCULATE 2^M / DEX20, FLDA M JNE DEX21 FLDA DEXFP1 FSTA M JA DEX30 DEX21, FNEG ATX 1 FLDA DEXFP1 FSTA M FLDA DFP2 DEX22, FMULM M /M*2 JXN DEX22,1+ /CALCULATE M*N*R DEX30, FLDA M FMUL N FMUL R FSTA X JXN DEX31,0 /WAS X MINUS JA DEXRTN DEX31, FLDA DEXFP1 /.1/X IF -X FDIV X JA DEXRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | / / / / D E X P 3 / - - - - - / /SUBROUTINE DEXP3(B,E) FOR DOUBLE TO DOUBLE / / VERSION 5A 4-26-77 MH / SECT DEXP3 JA #DEXP3 DPCHK EXTERN #ARGER EXP3ER, TRAP4 #ARGER TEXT +DEXP3 + EXP3XR, SETX XREXP3 SETB BPEXP3 JA .+3 BPEXP3, FNOP 0 0 XREXP3, F 0.0 EXP31, F 0.0 F 0.0 EXP32, F 0.0 F 0.0 ORG 10*3+BPEXP3 FNOP JA EXP3XR 0 XP3RTN, JA . FP1XP3, F 1. F 0.0 BASE 0 #DEXP3, STARTD FLDA 10*3 FSTA XP3RTN FLDA 0 SETX XREXP3 SETB BPEXP3 BASE BPEXP3 LDX 1,1 FSTA BPEXP3 FLDA% BPEXP3,1 /ADDR OF B FSTA EXP31 FLDA% BPEXP3,1+ /ADDR OF E FSTA EXP32 STARTE FLDA% EXP31 /GET B JEQ XP3RTN /0 ^ X = 0 FSTA EXP31 /SAVE BASE FLDA% EXP32 /GET E JEQ EXP3ON /X ^ 0 = 1 FSTA EXP32 /SAVE EXPONENT FLDA EXP31 JLT EXP3ER /ALL IS NOT WELL EXTERN DLOG JSR DLOG /CALL LOG JA .+4 /TAKE LOG (B) JA EXP31 FMUL EXP32 /MULT BY EXPONENT-E FSTA EXP31 EXTERN DEXP JSR DEXP /CALL EXP. JA XP3RTN JA EXP31 EXP3ON, FLDA FP1XP3 JA XP3RTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | / / VERSION 5A 4-27-77 PT / SECT DIM ENTRY IDIM JA #ST #XR, ORG .+10 #BASE, ORG .+3 A, ORG .+3 B, ORG .+3 BASE #BASE IDIM, #ST, STARTD 0210 FSTA #RTN,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA A FLDA% #BASE,1+ FSTA B STARTF FLDA% A FSUB% B JGE #RTN FCLA #RTN, JA . END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | / / / D L O G / - - - - / / VERSION 5A 4-27-77 PT / /LOGE(X) / /X=2^N*F / /LOGE(X) /= N*LOGE(2)+LOGE(F) / / SECT DLOG JA #DALOG DPCHK / /IF X<=0 - IT IS AN ERROR EXTERN #ARGER DALERR, TRAP4 #ARGER / TEXT +DLOG + DALXR, SETX XRDAL SETB BPDAL BPDAL, F 0.0 XRDAL, F 0.0 F 0.0 ORG 10*3+BPDAL FNOP JA DALXR 0 DALRTN, JA . N, F 0.0 F 0.0 F, F 0.0 F 0.0 DAL1, F 1.0 F 0.0 / DT7, 7776 /1/7 2222 2222 2222 2222 2221 DT6, 7776 /-1/6 5252 5252 5252 5252 5252 DT5, 7776 /1/5 3146 3146 3146 3146 3146 DT4, 7776 /-1/4 4000 0 0 0 0 DT3, 7777 /1/3 2525 2525 2525 2525 2524 DT2, 7777 /-1/2 4000 0 0 0 0 / A0, F 1.84375 F 0.0 A1, F 1.65625 F 0.0 A2, F 1.500 F 0.0 A3, F 1.375 F 0.0 A4, F 1.250 F 0.0 A5, F 1.1875 F 0.0 A6, F 1.09375 F 0.0 A7, F 1.03125 F 0.0 LA0, 0 /.6118015411059928976 2344 7603 2325 4250 3144 LA1, 0 /.5045560107523952859 2011 2512 4551 3503 7657 LA2, 7777 /.4054651081081643810 3174 6217 5457 7141 1370 LA3, 7777 /.3184537311185346147 2430 3057 0207 0573 0232 LA4, 7776 /.2231435513142097553 3443 7737 0746 5150 4146 LA5, 7776 /.1718502569266592214 2577 6301 6051 7117 2356 LA6, 7775 /.08961215868968712374 2674 1512 1271 2655 1272 LA7, 7773 /.030771658666753687 3740 5154 1636 0313 7764 D16, F 16.0 F 0.0 D8, F 8.0 F 0.0 CUM, F 0.0 F 0.0 DLOGE2, 0 2613 4413 7676 4347 5715 / /PICK UP X BASE 0 #DALOG, STARTD FLDA 10*3 FSTA DALRTN FLDA 0 SETX XRDAL SETB BPDAL BASE BPDAL LDX 1,1 FSTA BPDAL FLDA% BPDAL,1 /ADDRESS FSTA BPDAL STARTE FLDA% BPDAL /AND X JLE DALERR /X <= 0 IS ERROR FSUB DAL1 /SUB 1.0 JNE DALA FCLA /LOG(1)=0 JA DALRTN / DALA, FADD DAL1 /ADD BACK FSTA XRDAL /STORE AT X /EXPONENT STORED IN XR0 /MANTISSA STORED IN XR1-5 /PICK UP EXP + MULTIPLY BY LOGE(2) / XTA 0 FMUL DLOGE2 FSTA N /N*LOGE(2) /XRDAL IS NOW FRACTION IN RANGE .5<=F<1.0 /COMPUTE LOG(F) BY /LOG(F)=LOG(A(K1)*A(K2)...(F))-(LOG(A(K1))+ / LOG(A(K2))...) /FIT F IN A 1/16 RANGE /I.E. 1/2-9/16,9/16-10/16,ETC. /MULTIPLY F BY APPROPRIATE A(K) MULTIPLIER /KEEP RUNNING SUM OF LOG(A(K)) /CONTINUE UNTIL F>1 / LDX 0,0 FLDA XRDAL FSTA F FCLA FSTA CUM DALB, FLDA F FMUL D16 /16 REAL PARTS FSUB D8 /NEED JUST 8 ATX 1 FLDA A0,1 /GET MULTIPLIER FMULM F FLDA LA0,1 /ADD LOG(A(K)) TO SUM FADDM CUM FLDA F FSUB DAL1 JLT DALB /NOW F>1. USE TAYLOR SERIES /LOG(T)=Z-(Z^2)/2+(Z^3)/3+... WHERE Z=T-1 FLDA F FSUB DAL1 /F-1.0 FSTA F FMUL DT7 FADD DT6 FMUL F FADD DT5 FMUL F FADD DT4 FMUL F FADD DT3 FMUL F FADD DT2 FMUL F FADD DAL1 FMUL F FSUB CUM FADD N JA DALRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | / / / D L O G 1 0 / - - - - - - / /SUBROUTINE DPLOG10(X) / / VERSION 5A 4-26-77 (MH) / SECT DLOG10 JA #DLOG10 DPCHK TEXT +DLOG10+ LOGXR, SETX XRLOG SETB BPLOG JA .+3 BPLOG, FNOP 0 0 0;0;0 XRLOG, F 0.0 LOG1, F 0.0 0;0;0 ORG 10*3+BPLOG FNOP JA LOGXR 0 LOGRTN, JA . ALOG1C, 7777 /DP .4342944819032518276 3362 6754 2511 5624 1612 BASE 0 #DLOG10, STARTD FLDA 10*3 FSTA LOGRTN FLDA 0 SETX XRLOG SETB BPLOG BASE BPLOG LDX 1,1 FSTA BPLOG FLDA% BPLOG,1 /ADDR OF X FSTA BPLOG STARTE FLDA% BPLOG /GET X FSTA LOG1 EXTERN DLOG JSR DLOG /CALL ALOG JA .+4 JA LOG1 FMUL ALOG1C /CORRECT FOR THE LOG BASE E. JA LOGRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | / / VERSION 5A 4-27-77 PT / SECT DMAX1 BASE 0 DPCHK DPMAX, SETX XR MAXCOM, STARTD FLDA 0 /ADDRESS OF JA .+2+2*N FSTA 3 FLDA 30 /RETURN ADDRESS FSTA RETN FLDA% 3 / JA .+2+2*N FSUB 0 /-JA . FSUB TWO /- 2 LDX 1,1 ALN 1 /DIVIDE BY TWO FNEG /-N ATX 1 LDX 0,2 /FOR ARG PICKUP FLDA% 0,2+ /ADDRESS OF FIRST ARG FSTA 3 STARTE NEW, FLDA% 3 /SAVE NEW MAX FSTA MAX SAME, JXN MORMAX,1+ /ANY MORE ARGS ? FLDA MAX /GET RESULT RETN, JA . MORMAX, STARTD /NEXT ARG ADDRESS FLDA% 0,2+ FSTA 3 STARTE FLDA MAX /COMPARE FSUB% 3 JGE SAME /SAME MAX JA NEW /NEW MAX TWO, 0;2 MAX, 0;0;0 0;0;0 XR, 0;0;0;0;0;0;0;0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | / / VERSION 5A 4/26/77 MH / SECT DMIN1 BASE 0 DPCHK DPMIN, SETX XR MINCOM, STARTD FLDA 0 /ADDRESS OF JA .+2+2*N FSTA 3 FLDA 30 /RETURN ADDRESS FSTA RETN FLDA% 3 / JA .+2+2*N FSUB 0 /-JA . FSUB TWO /- 2 LDX 1,1 ALN 1 /DIVIDE BY TWO FNEG /-N ATX 1 LDX 0,2 /FOR ARG PICKUP FLDA% 0,2+ /ADDRESS OF FIRST ARG FSTA 3 STARTE NEW, FLDA% 3 /SAVE NEW MIN FSTA MIN SAME, JXN MORMIN,1+ FLDA MIN RETN, JA . MORMIN, STARTD /NEXT ARG ADDRESS FLDA% 0,2+ FSTA 3 STARTE FLDA MIN /COMPARE FSUB% 3 JLE SAME /SAME MIN JA NEW /NEW MIN TWO, 0;2 MIN, 0;0;0 0;0;0 XR, 0;0;0;0;0;0;0;0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | / / / / D M O D / - - - - / /SUBROUTINE DMOD(X,Y) / / VERSION 5A 4-27-77 PT / SECT DMOD JA #DMOD DPCHK TEXT +DMOD + AMODXR, SETX XRAMOD SETB BPAMOD STHREE, 0007 /73 2217 7777 7777 7777 7777 BPAMOD, F 0.0 F 0.0 XRAMOD, 0;1;73 /73 FOR ALIGNING ON 59 XSTOR, F 0.0 F 0.0 AMODX, F 0.0 F 0.0 ORG 10*3+BPAMOD FNOP JA AMODXR 0 AMDRTN, JA . EXTERN #ARGER AMODER, TRAP4 #ARGER FCLA JA AMDRTN BASE 0 #DMOD, STARTD FLDA 10*3 FSTA AMDRTN FLDA 0 SETX XRAMOD SETB BPAMOD BASE BPAMOD FSTA BPAMOD LDX 1,1 FLDA% BPAMOD,1 /ADDR OF X FSTA AMODX FLDA% BPAMOD,1+ /ADDR OF Y FSTA BPAMOD STARTE FLDA% BPAMOD /GET Y JEQ AMODER /Y=0 IS ERROR FLDA% BPAMOD JGT .+3 /GET ABS VALUE FNEG FSTA BPAMOD FLDA% AMODX /GET X JGT .+5 FNEG /GET ABS VALUE OF X LDX 0,1 /NOTE THE SIGN FSTA AMODX /SAV IN A TEMPORARY FDIV BPAMOD /DIVIDE BY Y FSTA XSTOR /SAVE X/Y XTA 3 /GET EXPONENT FSUB STHREE /CHECK SIZE JGE AMODER /TOO BIG FLDA XSTOR /ABS VALUE X/Y ALN 2 /FIX IT UP NOW. FNORM FMUL BPAMOD /MULITPLY IT. FNEG /NEGATE IT. FADD AMODX /AND ADD IN X. JXN AMR,1 FNEG /RESTORE SIGN AMR, JA AMDRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | / / VERSION 5A 4-27-77 PT / SECT DSIGN JA #ST #XR, ORG .+10 TEXT 'DSIGN ' #BASE, ORG .+6 A, ORG .+6 B, ORG .+6 ORG #BASE+31 JA #BASE GOBACK, 0;0;0 BASE #BASE DPCHK #ST, STARTD 0210 /FLDA 10 FSTA GOBACK+1,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA A FLDA% #BASE,1+ FSTA B STARTE FLDA% B /NEG? JLT #50 /B POS FLDA% A JLT #100 JA GOBACK+1 /A+,B+ #50, FLDA% A JLT GOBACK+1 /A-,B- #100, FNEG /OPP. SIGNS JA GOBACK+1 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 | / / / D S I N / - - - / /SUBROUTINE DSIN(X) / / VERSION 5A 4-27-77 PT / SECT DSIN JA #DSIN DPCHK TEXT +DSIN + SINXR, SETX XRSIN SETB BPSIN FPI2SN, 1 /PI DIVIDED BY 2 3110 3755 2421 0264 3016 FPISIN, 2 /PI 3110 3755 2421 0264 3016 F2PISN, 3 /TWO PI 3110 3755 2421 0264 3016 BPSIN, F 0.0 XRSIN, F 0.0 X, F 0.0 F 0.0 ORG 10*3+BPSIN FNOP JA SINXR 0 SINRTN, JA . SIN1, F 0.0 F 0.0 F3PIB2, 0003 /4.71238898038468986 2266 2761 7714 6207 2212 F1SIN, F 1.0 F 0.0 / SINC17, 7720 /1/17! 3124 5435 6014 1265 1236 SINC15, 7730 /-1/15! 4506 0060 3063 0437 4133 SINC13, 7740 /1/13! 2604 4430 2352 0664 1151 SINC11, 7747 /-1/11! 4506 3352 3002 5354 3710 SINC9, 7756 /1/9! 2707 3616 4525 5434 6350 / SINC7, 7764 /-1/7! 4577 4577 4577 4577 4636 / SINC5, 7772 /1/5! 2104 2104 2104 2104 2104 / SINC3, 7776 /-1/3! 5252 5252 5252 5252 5244 / SINTST, 7770 2000 0000 0000 0000 0000 SEVTHR, 0007 2217 7777 7777 7777 7777 BASE 0 #DSIN, STARTD FLDA 10*3 FSTA SINRTN FLDA 0 SETX XRSIN SETB BPSIN BASE BPSIN LDX 1,1 LDX 73,2 FSTA BPSIN FLDA% BPSIN,1 /ADDR OF X FSTA BPSIN STARTE FLDA% BPSIN /GET X LDX -1,0 /SET SIGN TO POSITIVE. JGT SINMOD /IF POSITIVE BYPASS FUDGE. JEQ SINRTN /IF ZERO EXIT. FNEG /NEGATIVE. NEGATE AC. SIN(-X)=-SIN(X) LDX 0,0 /SET SIGN TO MINUS. SINMOD, FSTA X FDIV F2PISN /X/2PI ALN 2 FNORM FMUL F2PISN /*2PI FSTA SIN1 FLDA X FSUB SIN1 FSTA SIN1 FSTA X /CHECK FOR QUADRANT /1 0-PI/2 SIN(PI/2)=1 /2 PI/2-PI SIN(PI)=0 /3 PI-3PI/2 SIN(3PI/2)=-1 /4 3PI/2-2PI SIN(2PI)=0 / FLDA FPI2SN /PI/2 FSUB SIN1 JGT TAYLOR JEQ SPIB2 /=PI/2 FLDA FPISIN /PI FSUB SIN1 JLT S1 JEQ SPI /=PI FLDA FPISIN FSUB SIN1 /SIN(X)=SIN(PI-X) FSTA X JA TAYLOR S1, FLDA F3PIB2 /3PI/2 FSUB SIN1 JLT S2 JEQ S3PIB2 /=3PI/2 FLDA SIN1 FSUB FPISIN FNEG FSTA X /SIN(X)=-SIN(X-PI) JA TAYLOR S2, FLDA F2PISN /2PI FSUB SIN1 JLT DSNER /ERROR JEQ SPI FNEG FSTA X /CALCULATE SIN VIA TAYLOR SERIES TAYLOR, FLDA X /RECALL NUMBER TO BE WORKED ON. FMUL X /MULTIPLY OUT. FSTA SIN1 FMUL SINC17 /NOW DO THE STANDARD ITERATION. FADD SINC15 FMUL SIN1 FADD SINC13 FMUL SIN1 FADD SINC11 FMUL SIN1 FADD SINC9 FMUL SIN1 FADD SINC7 FMUL SIN1 FADD SINC5 FMUL SIN1 FADD SINC3 FMUL SIN1 FADD F1SIN /ADD IN 1 FOR SERIES FMUL X /DO THE FINAL MULTIPLY. SING, JXN SINRTN,0 /SHALL WE NEGATE FNEG /YEP JA SINRTN /AND RETURN. SPIB2, FLDA F1SIN JA SING SPI, FCLA JA SINRTN S3PIB2, FLDA F1SIN FNEG JA SING EXTERN #ARGER DSNER, TRAP4 #ARGER |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | / / / D S Q R T / / VERSION 5A 4-27-77 PT / SECT DSQRT JA #DSQRT DPCHK TEXT +DSQRT + / DSQXR, SETX XRDSQ SETB BPDSQ JA .+3 BPDSQ, F 0.0 XRDSQ, F 0.0 DARSAV, F 0.0 F 0.0 DSQ2, F 2.0 F 0.0 SNGL, F 0.0 F 0.0 ORG 10*3+BPDSQ FNOP JA DSQXR / 0 DSQRTN, JA . DSQ1, F 0.0 F 0.0 /PICK UP ARGUMENTS BASE 0 #DSQRT, STARTD FLDA 10*3 FSTA DSQRTN FLDA 0 SETX XRDSQ SETB BPDSQ BASE BPDSQ LDX 1,1 FSTA BPDSQ FLDA% BPDSQ,1 /ADDR OF X FSTA BPDSQ / /DO GENERAL TESTS ON THE ARGUMENT / STARTE FLDA% BPDSQ JEQ DSQRTN /RETURN IF 0 JLT DSQER /<0 ERROR FSTA DARSAV /SAVE DOUBLE STARTF /F MODE + ROUND FSTA SNGL /SAVE / /GET INITIAL APPROXIMATION BY CALLING /SINGLE PRECISION ROUTINE / EXTERN SQRT JSR SQRT JA .+4 JA SNGL FSTA SNGL /FIRST APPROX STARTE /BACK TO E / /TAKE N ITERATIONS OF /X(K+1)=1/2(X(K)+X/X(K)) / LDX -3,0 /3 TIMES DSIT, FLDA DARSAV /GET X FDIV SNGL /X(K) FADD SNGL /X(K) FDIV DSQ2 /DIVIDE BY 2 FSTA SNGL /X(K+1) JXN DSIT,0+ /ITERATE FLDA SNGL /GET ANSWER JA DSQRTN /RETURN EXTERN #ARGER DSQER, TRAP4 #ARGER |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | / / / E X P / - - - / /SUBROUTINE EXP(X) / / VERSION 5A 4-27-77 PT / SECT EXP JA #EXP 0 EXPFUD, 0 0 0 / EXTERN #ARGER EXPER, TRAP4 #ARGER TEXT +EXP + EXPXR, SETX XREXP SETB BPEXP BPEXP, F 0.0 XREXP, F 0.0 EXP1, F 0.0 EXP2, F 0.0 EXP33, F 0.0 EXP4, F 0.0 F1EXP, F 1. F2EXP, F 2. ORG 10*3+BPEXP FNOP JA EXPXR 0 EXPRTN, JA . / EXPAF, 4 2372 1402 / EXPBF, 7774 2157 5157 / EXPCF, 12 5454 343 / EXPDF, 7 2566 5341 / EXP2E, 1 2705 2435 BASE 0 #EXP, STARTD FLDA 10*3 FSTA EXPRTN FLDA 0 SETX XREXP SETB BPEXP BASE BPEXP LDX 1,1 FSTA BPEXP FLDA% BPEXP,1 /ADDR OF X FSTA BPEXP STARTF FLDA% BPEXP /GET X LDX -1,0 /PRESERVE SIGN. JGE .+5 FNEG /IF NEGATIVE NEGATE IT. LDX 0,0 /AND REMEMBER IT,BUBBY. FMUL EXP2E /MULTIPLY TO BINARY TYPE. FSTA EXP1 /AND SAVE IT AWAY. JAL EXPER /CAN T FIX IT, ERROR. ALN 0 /FIX IT UP. FSTA EXP33 /AND SAVE IT. FNORM /NOW NORMALIZE FOR OUR COMPUTATIONS. FNEG /NEGATE THE FAC FADD EXP1 /ADD IN BEFORE NORMAL. FSTA EXP1 /AND STORE BACK. NO FADDM FMUL EXP1 /NOW SQUARE IT. FSTA EXP2 /AND SAVE IT. FADD EXPDF /START THE ITERATION. FSTA EXP4 /SAVE IN ANOTHER TEMP. FLDA EXPCF /NEXT CONSTANT. FDIV EXP4 /AND DIVIDE INTO IT. FSUB EXP1 /SUBTRACT BACK NOW. FADD EXPAF /NEXT CONSTANT. FSTA EXP4 /AND SAVE AGAIN. KEEP THIS UP. FLDA EXPBF FMUL EXP2 FADDM EXP4 FLDA EXP1 FDIV EXP4 FMUL F2EXP FADD F1EXP FSTA EXPFUD /NOW FIDDLE THE EXPONENT. STARTD FLDA EXP33 FADDM EXPFUD-1 /EXPONENT UPDATE. STARTF JXN EXPP,0 /NO INVERSION NECESSARY. RETURN. FLDA F1EXP /INVERT IT FDIV EXPFUD JA EXPRTN EXPP, FLDA EXPFUD /AN EXIT. JA EXPRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | / / / / E X P 3 / - - - - / /SUBROUTINE EXP3(B,E) / / VERSION 5A 4-26-77 MH / SECT EXP3 JA #EXP3 EXTERN #ARGER EXP3ER, TRAP4 #ARGER TEXT +EXP3 + EXP3XR, SETX XREXP3 SETB BPEXP3 BPEXP3, FNOP 0 0 XREXP3, F 0.0 EXP31, F 0.0 EXP32, F 0.0 FP1XP3, F 1. ORG 10*3+BPEXP3 FNOP JA EXP3XR 0 XP3RTN, JA . BASE 0 #EXP3, STARTD FLDA 10*3 FSTA XP3RTN FLDA 0 SETX XREXP3 SETB BPEXP3 BASE BPEXP3 LDX 1,1 FSTA BPEXP3 FLDA% BPEXP3,1 /ADDR OF B FSTA EXP31 FLDA% BPEXP3,1+ /ADDR OF E FSTA EXP32 STARTF FLDA% EXP31 /GET B JEQ XP3RTN /0 ^ X = 0 FSTA EXP31 /SAVE BASE FLDA% EXP32 /GET E JEQ EXP3ON /X ^ 0 = 1 FSTA EXP32 /SAVE EXPONENT FLDA EXP31 JLT EXP3ER /ALL IS NOT WELL EXTERN ALOG JSR ALOG /CALL LOG JA .+4 /TAKE LOG (B) JA EXP31 FMUL EXP32 /MULT BY EXPONENT-E FSTA EXP31 EXTERN EXP JSR EXP /CALL EXP. JA XP3RTN JA EXP31 EXP3ON, FLDA FP1XP3 JA XP3RTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | / /EXPCC /COMPLEX RAISED TO COMPLEX / / VERSION 5A 4-26-77 MH / /(A+I*B)^(C+I*D) /A+B=0 YIELDS 0 /B+D=0 MEANS USE EXP3 TO CALCULATTE A^C /A+B=0,C+D=0 YIELDS 1.0 /ENTER + EXIT IN STARTE SECT #EXPCC DPCHK EXTERN #CAC EXTERN EXP EXTERN COS EXTERN SIN EXTERN ALOG EXTERN EXP3 EXTERN ATAN2 EXTERN SQRT BASE 0 EXPCC, JA . FSTA C,0 FLDA 0 FSTA A,0 STARTF BASE .+2000 XTA 0 FSTA T1 /SAVE XR 0 FLDA A JNE EX1 /A NOT 0 FLDA B JNE EX1 STARTE /A=B=0 FCLA EX, FSTA #CAC /RESULT = 0 JA EXPCC EX1, FLDA C /C+D=0? JNE EX2 FLDA D JNE EX2 STARTE FLDA FP1 /RESULT = 1 IF C=D=0 JA EX EX2, FLDA B JNE EX3 /USE EXP3 IF B=D=0 FLDA D JNE EX3 STARTF JSR EXP3 JA .+6 JA A JA C FSTA A STARTE FLDA A /RETURN AS REAL PART JA EX EX3, STARTF /TH=ATAN(B/A) JSR ATAN2 JA .+6 JA B JA A FSTA TH / /LOGR=ALOG(SQRT(A*A+B*B)) FLDA A FMUL A FSTA LOGR FLDA B FMUL B FADDM LOGR JSR SQRT JA .+4 JA LOGR FSTA LOGR JSR ALOG JA .+4 JA LOGR FSTA LOGR /ARG=C*TH+D*LOGR FLDA C FMUL TH FSTA ARG FLDA D FMUL LOGR FADDM ARG / /CALCULATE IN AND COS OF ARG. SAVE SIGN OF EACH JSR SIN JA .+4 JA ARG FSTA SINE JSR COS JA .+4 JA ARG FSTA CSINE /CALL C*LOGR-D*TH FLDA D FMUL TH FSTA REST FLDA C FMUL LOGR FSUB REST FSTA REST /REAL = EXP(REST+ALOG(CSINE)) FLDA CSINE /REAL JLT .+6 LDX 0,1 /=1 IF POSITIVE JA .+3 FNEG JSA DO JXN .+3,0 /SKIP IF POS FNEG FSTA A FLDA SINE /IMAG JLT .+6 LDX 0,1 JA .+5 LDX 0,0 FNEG JSA DO JXN .+3,0 FNEG /RESTORE SIGN FSTA B FLDA T1 /RESTORE XR0 ATX 0 STARTE FLDA A FSTA #CAC JA EXPCC / DO, JA . FSTA TH JSR ALOG JA .+4 JA TH FADD REST FSTA ARG JSR EXP JA .+4 JA ARG FSTA ARG FLDA TH /CHECK SIGN JGE DOX FLDA ARG FNEG FSTA ARG DOX, FLDA ARG JA DO A, F 0.0 B, F 0.0 C, F 0.0 D, F 0.0 LOGR, F 0.0 TH, F 0.0 ARG, F 0.0 SINE, F 0.0 CSINE, F 0.0 REST, F 0.0 FP1, F 1.0 F 0.0 T1, F 0.0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | / /EXPCI /COMPLEX RAISED TO INTEGER OR REAL / / VERSION 5A 4-26-77 MH / / /C=A+I*B /C^D=R^D*EXP(D*I*THETA) / /C IS IN #BASE /D IS IN AC / /ENTER IN STARTF,EXIT IN STARTE / SECT #EXPCI ENTRY #EXPCR DPCHK EXTERN SQRT EXTERN ATAN2 EXTERN SIN EXTERN COS EXTERN EXP3 EXTERN #CAC BASE 0 #EXPCR, JA . FSTA EXPON,0 FLDA 0 /REAL FSTA A,0 FLDA 3 /IMAG FSTA B,0 /SET DUMMY BASE PAGE BASE .+2000 / /R=SQRT(A*A+B*B) FLDA A FMUL A FSTA R FLDA B FMUL B FADDM R JSR SQRT JA .+4 JA R FSTA R /R^EXPON JSR EXP3 JA .+6 JA R JA EXPON FSTA R /THETA=ATAN(B/A) JSR ATAN2 JA .+6 JA B JA A /THETA*EXPON FMUL EXPON FSTA A /PHASE ANGLE /IMAG=R*SIN(PHASE) JSR SIN JA .+4 JA A FMUL R FSTA B /REAL=R*COS(PHASE) JSR COS JA .+4 JA A FMUL R FSTA A JGE .+3 /SKIP IF RESULT IS POS FNEG /IF NOT,MAKE IT POS FSUB LOWLIM /TEST FOR ZERO JGE .+5 /JUMP IF NOT 0 FCLA /ASSUME RESULT SHOULD BE 0 FSTA A /AND STORE A 0 /RETURN RESULT IN #CAC AND STARTE STARTE FLDA A FSTA #CAC JA #EXPCR A, F 0.0 B, F 0.0 EXPON, F 0.0 R, F 0.0 LOWLIM, F 0.000009 /NUMBERS >= 1.E-5 OK |
> > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | / / VERSION 5A 4-25-77 MH / SECT #EXPDD DPCHK BASE 0 EXTERN DEXP3 JA . FSTA EXPON,0 /EXPONENT FLDA 0 /BASE FSTA BASE,0 JSR DEXP3 /EXP3(BASE,EXPON) JA .+6 JA BASE JA EXPON JA #EXPDD BASE, F 0.0 F 0.0 EXPON, F 0.0 F 0.0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | SECT #EXPDI / B**E / WHERE E IS INTEGER / AND B IS DOUBLE PRECISION / / VERSION 5A 4-26-77 MH / DPCHK BASE 0 EXPDI, JA . FSTA SIGN /SAVE SIGN OF EXPONENT JGE POSINT /ITS POSITIVE FNEG POSINT, FSTA EXP XTA 1 /SAVE XR 1 FSTA XR1 LDX -27,1 /BIT COUNT STARTE FLDA ONE /START WITH ONE FSTA PROD STARTF FLDA EXP LOOP, JEQ YES /DONE IF ITS ZERO FDIV TWO /DIVIDE BY TWO ALN 0 /INTEGERIZE FNORM FSTA TEMP /SAVE AT FMUL TWO /IS EXPONENT ODD ? FSUB EXP STARTE JLT ODD /YES, JUMP FLDA 0 /SQUARE BASE SQUARE, FMULM 0 STARTF FLDA TEMP /EXPONENT OVER 2 FSTA EXP JXN LOOP,1+ /LOOP IF MORE BITS YES, FLDA XR1 /DONE, RESTORE XR 1 ATX 1 FLDA SIGN /CHECK SIGN OF EXPONENT JLT INVERT /IT WS NEGATIVE, INVERT RESULT STARTE FLDA PROD /RETURN ANSWER JA EXPDI INVERT, STARTE FLDA ONE /RETURN WITH 1/PROD FDIV PROD JA EXPDI ODD, FLDA 0 FMULM PROD JA SQUARE /GO SQUARE THE BASE ONE, F 1.0 F 0.0 TWO, F 2.0 PROD, F 0.0 F 0.0 SIGN, F 0.0 TEMP, F 0.0 XR1, F 0.0 EXP, F 0.0 F 0.0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | / / VERSION 5A 4-26-77 MH / SECT #EXPDR DPCHK BASE 0 EXTERN DEXP3 JA . FSTA EXPON,0 /EXPONENT FCLA FSTA EXPON+3 /MUST BE 6 WDS STARTE FLDA 0 /BASE FSTA BASE,0 JSR DEXP3 /EXP3(BASE,EXPON) JA .+6 JA BASE JA EXPON JA #EXPDR BASE, F 0.0 F 0.0 EXPON, F 0.0 F 0.0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | / /EXPIC /INTEGER OR REAL RAISED TO COMPLEX / / VERSION 5A 4-26-77 MH / /(A)^(C+I*D) /A=0 YIELDS 0 /D=0 MEANS USE EXP3 TO CALCULATE A^C /C+D=0 YIELDS 1.0 /ENTER + EXIT IN STARTE SECT #EXPIC DPCHK EXTERN #CAC EXTERN EXP EXTERN COS EXTERN SIN EXTERN ALOG EXTERN EXP3 EXTERN SQRT BASE 0 EXPIC, JA . FSTA C,0 STARTF FLDA 0 /BASE FSTA A,0 BASE .+2000 XTA 0 FSTA T1 /SAVE XR 0 FLDA A JNE EX1 /A NOT 0 STARTE /A=B=0 FCLA EX, FSTA #CAC /RESULT = 0 JA EXPIC EX1, FLDA C /C+D=0? JNE EX2 FLDA D JNE EX2 STARTE FLDA FP1 /RESULT = 1 IF C=D=0 JA EX EX2, FLDA D JNE EX3 /USE EXP3 IF D=0 JSR EXP3 JA .+6 JA A JA C FSTA A STARTE FLDA A /RETURN AS REAL PART JA EX / /LOGR=ALOG(SQRT(A*A)) EX3, FLDA A FMUL A FSTA LOGR JSR SQRT JA .+4 JA LOGR FSTA LOGR JSR ALOG JA .+4 JA LOGR FSTA LOGR /ARG=C+D*LOGR FLDA D FMUL LOGR FADD C FSTA ARG / /CALCULATE SIN AND COS OF ARG. SAVE SIGN OF EACH JSR SIN JA .+4 JA ARG FSTA SINE JSR COS JA .+4 JA ARG FSTA CSINE /CALL C*LOGR-D FLDA C FMUL LOGR FSUB D FSTA REST /REAL = EXP(REST+ALOG(CSINE)) FLDA CSINE /REAL JLT .+6 LDX 0,1 /=1 IF POSITIVE JA .+3 FNEG JSA DO JXN .+3,0 /SKIP IF POS FNEG FSTA C FLDA SINE /IMAG JLT .+6 LDX 0,1 JA .+5 LDX 0,0 FNEG JSA DO JXN .+3,0 FNEG /RESTORE SIGN FSTA D FLDA T1 /RESTORE XR0 ATX 0 STARTE FLDA C FSTA #CAC JA EXPIC / DO, JA . FSTA LOGR JSR ALOG JA .+4 JA LOGR FADD REST FSTA ARG JSR EXP JA .+4 JA ARG FSTA ARG FLDA LOGR /CHECK SIGN JGE DOX FLDA ARG FNEG FSTA ARG DOX, FLDA ARG JA DO A, F 0.0 C, F 0.0 D, F 0.0 LOGR, F 0.0 ARG, F 0.0 SINE, F 0.0 CSINE, F 0.0 REST, F 0.0 FP1, F 1.0 F 0.0 T1, F 0.0 |
> > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | / / VERSION 5A 4-26-77 MH / SECT #EXPID DPCHK BASE 0 EXTERN EXPID2 EXPID, JA . FSTA EXPON,0 /EXPONENT STARTF FLDA 0 /BASE FSTA BASE,0 JSR EXPID2 JA .+6 JA BASE JA EXPON JA EXPID BASE, F 0.0 EXPON, F 0.0 F 0.0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | / / / / E X P I D 2 / - - - - - - / /SUBROUTINE EXPID2(B,E) /WHERE B IS INTEGER AND E IS DOUBLE / / VERSION 5A 4-26-77 MH / SECT EXPID2 JA #EXID2 EXTERN #ARGER EXP3ER, TRAP4 #ARGER TEXT +EXPID2+ EXP3XR, SETX XREXP3 SETB BPEXP3 BPEXP3, FNOP 0 0 XREXP3, F 0.0 EXP31, F 0.0 F 0.0 EXP32, F 0.0 FP1XP3, F 1. F 0.0 ORG 10*3+BPEXP3 FNOP JA EXP3XR 0 XP3RTN, JA . BASE 0 #EXID2, STARTD FLDA 10*3 FSTA XP3RTN FLDA 0 SETX XREXP3 SETB BPEXP3 BASE BPEXP3 LDX 1,1 FSTA BPEXP3 FLDA% BPEXP3,1 /ADDR OF B FSTA EXP31 FLDA% BPEXP3,1+ /ADDR OF E FSTA EXP32 STARTF FLDA% EXP31 /GET B JEQ XP3RTN /0 ^ X = 0 JLT EXP3ER FSTA EXP31 /SAVE BASE FCLA FSTA EXP31+3 STARTE LDX 73,1 EXTERN DLOG JSR DLOG /CALL LOG JA .+4 /TAKE LOG (B) JA EXP31 FSTA EXP31 FLDA% EXP32 /GET EXPONENT JEQ EXP3ON /X^0=1 FMULM EXP31 EXTERN DEXP JSR DEXP /CALL EXP. JA XP3RTN JA EXP31 EXP3ON, STARTE FLDA FP1XP3 JA XP3RTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | SECT #EXPII / B**E / WHERE E IS INTEGER / AND B IS REAL OR INTEGER / / VERSION 5A 4/26/77 MH / BASE 0 JA . FSTA SIGN /SAVE SIGN OF EXPONENT JGE POSINT /ITS POSITIVE FNEG POSINT, FSTA 3 /PUT IT INTO 3 XTA 1 /SAVE XR 1 FSTA XR1 LDX -27,1 /BIT COUNT FLDA ONE /START WITH ONE FSTA PROD FLDA 3 /GET EXPONENT LOOP, JEQ YES /DONE IF ITS ZERO FDIV TWO /DIVIDE BY TWO ALN 0 /INTEGERIZE FNORM FSTA TEMP /SAVE AT FMUL TWO /IS EXPONENT ODD ? FSUB 3 JLT ODD /YES, JUMP FLDA 0 /SQUARE BASE SQUARE, FMULM 0 FLDA TEMP /EXPONENT OVER 2 FSTA 3 JXN LOOP,1+ /LOOP IF MORE BITS YES, FLDA XR1 /DONE, RESTORE XR 1 ATX 1 FLDA SIGN /CHECK SIGN OF EXPONENT JLT INVERT /IT WS NEGATIVE, INVERT RESULT FLDA PROD /RETURN ANSWER JA #EXPII INVERT, FLDA ONE /RETURN 1/PROD FDIV PROD JA #EXPII ODD, FLDA 0 /MULT PROD BY BASE FMULM PROD JA SQUARE /GO SQUARE THE BASE ONE, F 1.0 TWO, F 2.0 PROD, F 0.0 SIGN, F 0.0 TEMP, F 0.0 XR1, F 0.0 END |
> > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | / / VERSION 5A 4-26-77 MH / SECT #EXPIR BASE 0 EXTERN EXP3 JA . FSTA EXPON,0 /EXPONENT FLDA 0 /BASE FSTA BASE,0 JSR EXP3 /EXP3(BASE,EXPON) JA .+6 JA BASE JA EXPON JA #EXPIR BASE, F 0.0 EXPON, F 0.0 END |
> > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | / / VERSION 5A 4-27-77 PT / SECT FLOAT BASE 0 FLDA 0 STARTD FSTA RETRN /SAVE RETURN FADD TWO /ADDR OF ARG POINTER FSTA 3 FLDA% 3 /ADDR OF ARG FSTA 3 STARTF FLDA% 3 /GET ARG RETRN, 0;0 /FLOAT IS A NOP TWO, 0;2 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | / VERSION 5A 4-27-77 PT / SECT IDINT JA #DINT DPCHK TEXT +DINT + DINTXR, SETX XRDINT SETB BPDINT BPDINT, F 0.0 F 0.0 XRDINT, 0;73;1 F 0.0 ORG 10*3+BPDINT FNOP JA DINTXR 0 #GOBAK, JA . BASE 0 #DINT, STARTD SETX XRDINT FLDA 10*3 FSTA #GOBAK,0 FLDA% 0,2 SETB BPDINT BASE BPDINT FSTA BPDINT STARTE FLDA% BPDINT JLT NEGFIX /NEGATIVE ARG ALN 1 /FIX POSITIVE ARG FNORM JA #GOBAK /RETURN NEGFIX, FNEG /FIRST MAKE POSITIVE ALN 1 /THEN FIX FNORM FNEG /THEN RE-NEGATE JA #GOBAK END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | / / VERSION 5A 4-27-77 PT / SECT IFIX ENTRY AINT ENTRY INT BASE 0 AINT, INT, FLDA 0 /ADDRESS OF CALL STARTD FSTA RETRN /SAVE RERN FADD TWO /INCR BY TWO FSTA 3 /GIVES ADDRESS OF ARG POINTER FLDA% 3 /GET ADDR OF ARG FSTA 3 STARTF FLDA% 3 /GET ARG JAL RETRN /LEAVE BIGGIES ALONE JLT NEGFIX /NEGATIVE ARG ALN 0 /FIX POSITIVE ARG FNORM JA RETRN /RETURN NEGFIX, FNEG /FIRST MAKE POSITIVE ALN 0 /THEN FIX FNORM FNEG /THEN RE-NEGATE RETRN, JA . TWO, 0;2 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | / LTR (LOAD TRUTH) EMULATION ROUTINES / / VERSION 5A 4-26-77 MH / SECT #LTR ENTRY #EQ FLDA TRUE STARTF #EQ, JA . JEQ #EQ-3 FCLA JA #EQ-1 ENTRY #NE #NE, JA . JEQ .+4 FLDA TRUE STARTF JA #NE ENTRY #GE FLDA TRUE STARTF #GE, JA . JGE #GE-3 FCLA JA #GE-1 ENTRY #LE FLDA TRUE STARTF #LE, JA . JLE #LE-3 FCLA JA #LE-1 ENTRY #GT FLDA TRUE STARTF #GT, JA . JGT #GT-3 FCLA JA #GT-1 ENTRY #LT FLDA TRUE STARTF #LT, JA . JLT #LT-3 FCLA JA #LT-1 TRUE, F 1.0 F 0.0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | / / VERSION 5A 4/28/77 PT / FIELD1 ONQI 0 JMP SETINT /SET UP #INT INITIALLY ISZ ONQI /BUMP ARG POINTER ISZ INTQ+1 /BUMP INTERRUPT Q POINTER IOF /** DCA% INTQ+1 /STICK IOT ONTO INT Q TAD XSKP /FOLLOWED BY A SKIP ISZ INTQ+1 DCA% INTQ+1 /ONTO INT Q ISZ ONQI /SKIP FIRST WORD OF ADDR ISZ INTQ+1 ONQISW, TAD% ONQI /GET INT HANDLER ADDRESS ISZ ONQI DCA% INTADR+1 /ONTO ADDRESS STACK TAD INTADR+1 /NOW MAKE JMS% AND L177 TAD L4600 DCA% INTQ+1 /ONTO INT Q ISZ INTADR+1 ION /:: ISZ IQSIZE /ROOM FOR MORE ? JMP% ONQI /YES TAD .-1 /NO, CLOSE OUT THESUBR DCA ONQI+1 JMP% ONQI SETINT, TAD ONQISW /DO THIS PART ONLY ONCE DCA ONQI+1 CDF IOF /** TAD XSKP /FIX UP #INT DCA% XINT+1 ISZ XINT+1 TAD INTQ+1 DCA% XINT+1 ISZ XINT+1 TAD CIFCDF DCA% XINT+1 ION /** CIFCDF, CDF CIF 10 JMP ONQI+1 /BACK TO ONQI EXTERN #INT XINT, ADDR #INT INTQ, ADDR IHANDL INTADR, ADDR IHADRS IQSIZE, -5 XSKP, SKP L177, 177 L4600, 4600 CDF CIF JMP% IHANDL IHANDL, 0 REPEAT 16 JMP IHANDL-2 IHADRS, 0;0;0;0;0 ENTRY ONQB ONQB, 0 JMP SETBAK /SETUP #IDLE TAD% ONQB /GET ADDRESS OF IDLE JOB ONQBSW, ISZ ONQB DCA% BAKADR+1 /STORE ONTO BACKROUND JOB Q TAD BAKADR+1 /MAKE A JMS% ISZ BAKADR+1 AND L177 TAD L4600 ISZ BAKQ+1 DCA% BAKQ+1 ISZ BQSIZE /MORE ROOM ? JMP% ONQB /YES TAD .-1 /NO, CLOSE THE DOOR DCA ONQB+1 JMP% ONQB SETBAK, TAD ONQBSW /CLOSE OFF #IDLE INITIALIZATION DCA ONQB+1 CDF TAD XSKP /FIX UP #IDLE DCA% XIDLE+1 TAD BAKQ+1 ISZ XIDLE+1 DCA% XIDLE+1 ISZ XIDLE+1 TAD CIFCDF DCA% XIDLE+1 CIF CDF 10 JMP ONQB+1 EXTERN #IDLE XIDLE, ADDR #IDLE BAKQ, ADDR BAKRND BAKADR, ADDR BHADRS BQSIZE, -5 CDF CIF JMP% BAKRND BAKRND, 0 REPEAT 6 JMP BAKRND-2 BHADRS, 0;0;0;0;0 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | / / VERSION 5A 4-26-77 MH / SECT8 #PAUSE /FORTRAN PAUSE HANDLER EXTERN #WRITO EXTERN #RSVO EXTERN #RENDO BASE 0 FSTA PNUM /SAVE ARGUMENT STARTD FLDA 0 /GET RETURN ADDRESS FSTA PAURET STARTF TRAP3 #WRITO JA ZERO JA PAUFMT FLDA PNUM /PRINT A MESSAGE "PAUSE N" TRAP3 #RSVO TRAP3 #RENDO TRAP4 OPAUSE /DO ACTUAL PAUSE PAURET, JA . /RETURN OPAUSE, 0 AND% 0 AND% 0 /WASTE SOME TIME SO THAT THE LAST AND% 0 /TWO CHARS OF THE MESSAGE WILL PRINT. AND% 0 AND% 0 ISZ ZERO JMP OPAUSE+1 DPAUSE, IOF KSF JMP .-1 KRB CLA ION CDF CIF 0 JMP% OPAUSE PNUM, F 0.0 ZERO, F 0.0 PAUFMT, TEXT %(' PAUSE'I6/)% END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 | / / VERSION 5A 4-27-77 PT / LINC=6141 PDP=2 DIS=140 COMMZ #PAGE0 /STANDARD PAGE 0 ORG 17 0 /ALPHA REG FOR PDP-12 ENTRY #DISP /THIS IS SO #PAGE0 CAN BE LOADED #DISP, DISPLY, 0 TAD BUFADR+2 /GET BUFFER ADDRESS DCA BUFADR TAD DBFLD /SET UP CHANGABLE CDF DCA FLDDB DBFLD, HLT /GO TO FIRST FIELD OF BUFFER TAD PLTXR+4 /NUMBER OF POINTS CMA DCA NPTS /NEGATED JMP ENDDL /BEGIN DISPLAY DSPLUP, /START OF DISPLAY LOOP IFSW 8 < TAD% BUFADR /GET X VALUE 6053 /LOAD X DISPLACEMENT CLA ISZ BUFADR /BUMP ADDRESS SKP CLA JMS BUMPF /BUMP FIELD TAD% BUFADR 6054 /LOAD Y DISPLACEMENT CLA ISZ BUFADR /INCR ADDRESS SKP CLA JMS BUMPF /INCR FIELD 6052 /SKIP ON BEAM POSITIONED JMP .-1 6055 /INTENSIFY POINT > IFNSW 8 < TAD% BUFADR /GET X DISPLACEMENT DCAZ 17 /INTO ALPHA REG ISZ BUFADR /INCREMENT ADDRESS SKP CLA JMS BUMPF /INCREMENT DATA FIELD TAD% BUFADR /GET Y DISPLACEMENT CIF 10 LINC DIS 17 PDP CLA ISZ BUFADR /INCR BUFFER POINTER SKP CLA JMS BUMPF > ENDDL, ISZ NPTS /INCREMENT COUNTER JMP DSPLUP /LOOP CDF 10 JMP% DISPLY /RETURN TO IDLE Q BUMPF, 0 /FIELD CHANGER TAD FLDDB /BUMP FIELD TAD L10 DCA FLDDB FLDDB, HLT /CHANGE IT NOW JMP% BUMPF PUTONQ, 0 /PUT DISPLY ONTO BACKROUND Q TAD BUFADR+1 /CREATE CDF FOR DISPLAY LOOP AND L7 CLL RAL RTL TAD FLD0 DCA DBFLD IFSW 8 < 6050 /CLEAR DISPLAY LOGIC > CDF CIF SKP JMP% PUTONQ DCA .-2 /ONCE ONLY CIF CDF 10 JMS% ONQBX+1 ADDR DISPLY CIF CDF JMP% PUTONQ /CALLED VIA TRAP4 EXTERN ONQB ONQBX, ADDR ONQB BUFADR, 0 0 PLTXR, 0;0;0;-1;0;0 FLD0, CDF L7, 7 L10, 10 NPTS, 0 SECT PLOT JA #PLOT NAME, TEXT +PLOT + PLTBAS, 0;0;0 XLO, X, 0;0;0 YLO, Y, 0;0;0 XHI, N, 0;0;0 YHI, 0;0;0 ADRBUF, 0;0;0 IFSW 8 < YSCALE, F 1022. YZERO, F 511. ORG 10*3+PLTBAS FNOP JA NAME+3 0 PLTRET, JA . XSCALE, F 786. XZERO, F 511. RANGE, F 1022. BASE, F 511.> IFNSW 8 < YSCALE, F 510. YZERO, F 255. ORG 10*3+PLTBAS FNOP JA NAME+3 0 PLTRET, JA . XSCALE, F 392. XZERO, F 0. RANGE, F 510. BASE, F 255.> L1P5, F 1.5 XYPAIR, 0;0;0 #PLOT, BASE PLTBAS JSA SETUP LDX 1,1 FLDA% PLTBAS,1 /GET ARG ADDRESSES FSTA N FLDA% PLTBAS,1+ FSTA X FLDA% PLTBAS,1+ FSTA Y STARTF FLDA% N /NUMBER OF POINTS TO PLOT FNEG ATX 1 /INTO XR 1 LDX -1,2 /XR 2 IS THE INDEXER PLTLUP, JXN PLOOP,3+ /ANY MORE ROOM IN PLOT BUFFER ? LDX -1,3 /NO, FIX COUNT JA PLTRET PLOOP, FLDA% Y,2+ /GET Y VALUE FMUL YSCALE /SCALE IT FSUB YZERO /SUBTRACT LOWER LIMIT ALN 0 FSTA XYPAIR FLDA% X,2 /GET X VALUE OF PAIR FMUL XSCALE /SCALE IT FSUB XZERO /SUBTRACT LOWER LIMIT ALN 0 STARTD FSTA XYPAIR,0 /XYPAIR+1,+2 CONTAINS THE POINT FLDA XYPAIR /STORE THIS DOUBLE WORD INTO PLOT BUFFER FSTA% ADRBUF,4 ADDX 1,4 /TROUBLE IS, WE WANT POST INCREMENT STARTF JXN PLTLUP,1+ /LOOP IF MORE POINTS JA PLTRET BASE 0 SETUP, JA . STARTD FLDA 30 /GET RETURN ADDRESS FSTA PLTRET FLDA 0 /GET ARG POINTER BASE PLTBAS SETB PLTBAS SETX PLTXR FSTA PLTBAS JA SETUP SECT PLOTR BASE PLTBAS JSA SETUP LDX 1,1 FLDA% PLTBAS,1 /GET ARG ADDRESSES FSTA N FLDA% PLTBAS,1+ FSTA X FLDA% PLTBAS,1+ FSTA Y FLDA% PLTBAS,1+ FSTA YHI STARTF FLDA% YHI ATX 5 FLDA% N /NUMBER OF POINTS TO PLOT FNEG ATX 1 /INTO XR 1 LDX -1,2 /XR 2 IS THE INDEXER PLOTRL, FLDA% Y,2+ /GET Y VALUE FMUL YSCALE /SCALE IT FSUB YZERO /SUBTRACT LOWER LIMIT ALN 0 FSTA XYPAIR FLDA% X,2 /GET X VALUE OF PAIR FMUL XSCALE /SCALE IT FSUB XZERO /SUBTRACT LOWER LIMIT ALN 0 STARTD FSTA XYPAIR,0 /XYPAIR+1,+2 CONTAINS THE POINT FLDA XYPAIR /STORE THIS DOUBLE WORD INTO PLOT BUFFER FSTA% ADRBUF,5 ADDX 1,5 /TROUBLE IS, WE WANT POST INCREMENT STARTF JXN PLOTRL,1+ /LOOP IF MORE POINTS JA PLTRET SECT CLRPLT BASE PLTBAS JSA SETUP LDX 0,4 /DISABLE DISPLAY LOOP LDX 1,1 FLDA% PLTBAS,1 /GET ARG POINTERS FSTA N FLDA% PLTBAS,1+ FSTA ADRBUF FSTA BUFADR+1 STARTF FLDA% N /SIZE OF BUFFER FMUL L1P5 /NUMBER OF 2 WORD PAIRS FNEG ATX 3 /INTO SOME CHOICE XRS TRAP4 PUTONQ /PUTISPLY ONTO IDLE Q CLRRET, JA PLTRET SECT SCALE /SET SCALING FACTORS BASE PLTBAS JSA SETUP LDX 1,1 FLDA% PLTBAS,1 /GET ARGS FSTA XLO FLDA% PLTBAS,1+ FSTA YLO FLDA% PLTBAS,1+ FSTA XHI FLDA% PLTBAS,1+ FSTA YHI STARTF FLDA% XHI /COMPUTE X RANGE FSUB% XLO FSTA XHI FLDA% YHI /NOW Y RANGE FSUB% YLO FSTA YHI FLDA RANGE /COMPUTE XSCALE FDIV XHI FSTA XSCALE FLDA RANGE /NOW Y SCALE FDIV YHI FSTA YSCALE FLDA% XLO /COMPUTE XZERO FMUL RANGE FDIV XHI IFSW 8 < FADD BASE> FSTA XZERO FLDA% YLO /NOW YZERO FMUL RANGE FDIV YHI FADD BASE FSTA YZERO SCLRET, JA PLTRET END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | / / R E A L / - - - - / / A I M A G / - - - - - / / C O N J G / - - - - - / / VERSION 5A 4-27-77 PT / /REAL,AIMAG - ENTER IN COMPLEX,EXIT IN REAL /CONJG - ENTER + EXIT IN COMPLEX / SECT REAL JA #REAL DPCHK TEXT +REAL + REALXR, SETX XRREAL SETB BPREAL BPREAL, F 0.0 XRREAL, F 0.0 ARG, F 0.0 F 0.0 ORG 10*3+BPREAL FNOP JA REALXR 0 REALRT, JA . BASE 0 #REAL, SETX XRREAL LDX 0,2 LDX 1,0 COMM, STARTD FLDA 10*3 FSTA REALRT FLDA 0 SETB BPREAL BASE BPREAL LDX 1,1 FSTA BPREAL FLDA% BPREAL,1 FSTA BPREAL STARTE FLDA% BPREAL /GET ARG FSTA ARG JXN REAM,0 STARTF FLDA ARG+3 FNEG FSTA ARG+3 STARTE FLDA ARG FSTA #CAC JA REALRT REAM, STARTF CON, FLDA ARG,2 JA REALRT EXTERN #CAC / ENTRY AIMAG AIMAG, SETX XRREAL LDX 1,2 LDX 1,0 JA COMM / ENTRY CONJG CONJG, SETX XRREAL LDX 0,2 LDX 0,0 JA COMM |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 | / A-D CLOCKED, BUFFERED SAMPLING ROUTINE / / VERSION 5A 4-27-77 PT / ADSK=6534 ADRB=6533 ADST=6532 ADLM=6531 ADLE=6536 ADCL=6530 CLZE=6130 ESF=4 LINC=6141 PDP=2 SAM=100 CLEN=6134 FIELD1 SAMPLE 0 /INTERRUPT TIME AD SAMPLER IFNSW 8 < JMS LNCSAM /INITIATE SAMPLE NEXTCH, ISZ SAMINS /UPDATE SAM INST FOR NEXT CHAN JMS LNCSAM /SAM AND INITIATE NEXT CHANNEL > TAD SAMPTR /SAVE THE OLD SAM BUFFER POINTER DCA OLDPTR TAD BUFFLD /AND THE FIELD DCA OLDFLD ISZ SAMPTR /BUMP BUFFER POINTER JMP FLDOK /FIELD IS OK TAD BUFFLD /BUMP FIELD TAD L10 DCA BUFFLD FLDOK, ISZ SAMCNT /BUMP BUFFER COUNT JMP BUFFLD /NOT END OF BUFFER TAD ARRAY+2 /RESET POINTER TO START OF BUFFER DCA SAMPTR TAD FLDBUF /RESET BUFFER FIELD DCA BUFFLD TAD BUFSIZ /RESET COUNT DCA SAMCNT BUFFLD, HLT /GET FIELD OF NEW ADB STOP CODE TAD% SAMPTR /IS THIS THE SAM STOP CODE ? TAD M3776 /(ILLEGAL AS A SAMPLE) SZA CLA JMP NOERR ISZ TOOFAS /SET TOO FAST SWITCH SAMPLD, CDF 10 DCA% XCLINT+1 /STOP SAMPLING JMP% SAMPLE NOERR, CLL CMA RAR /SET ADB STOP CODE DCA% SAMPTR OLDFLD, HLT /GET TO FIELD OF SAMPLE IFSW 8 < ADRB /READ SAMPLE > IFNSW 8 < TAD SAMTMP /GET PREVIOUSLY READ SAMPLE > DCA% OLDPTR /INTO BUFFER ISZ NPOINT+2 /ANY MORE SAMPLES SKP /YES ISZ NPOINT+1 /MORE THAN 7777 ? SKP /YES JMP SAMPLD /NO ISZ NCHANL+1 /ANY MORE CHANNELS TO SAMPLE ? JMP NEXTCH /YES GO START SAMPLING TAD CSTART+2 /STARTING CHANNEL IFSW 8 < ADLM > IFNSW 8 < DCA SAMINS JMS LNCSAM /SET CHANNEL TO START /IN CASE CLOCK INITIATED > TAD NCHANL+2 /NUMBER OF CHANNELS DCA NCHANL+1 /INTO COUNTER CDF 10 JMP% SAMPLE IFSW 8 < NEXTCH, ADST /SAMPLE NEXT CHANNEL ADSK /WAIT FOR SAMPLE JMP .-1 JMP SAMPLE+1 > IFNSW 8 < LNCSAM, 0 /LINC SAM SUBROUTINE LINC SAMINS, SAM 0 /SAMPLE AND SELECT NEXT CHANNEL PDP DCA SAMTMP /SAVE IT JMP% LNCSAM > ADSETU, 0 /SET UP ROUTINE DCA TOOFAS /CLEAR TOO FAST SWITCH TAD ARRAY+1 /GET FIELD OF BUFFER AND L7 CLL RTL RAL TAD CDF0 DCA FLDBUF TAD FLDBUF DCA BUFFLD /SAVE IN SAMPLER CODE TAD ARRAY+2 /SET SAMPLER BUFFER POINTER IAC DCA SAMPTR TAD LENGTH+2 /SIZE OF BUFFER CLL RAL TAD LENGTH+2 /TIMES THREE DCA BUFSIZ /SAVE IT TAD BUFSIZ /SET INITIAL COUNT IAC DCA SAMCNT TAD NCHANL+2 /SET CHANNEL COUNT DCA NCHANL+1 IFSW 8 < CLA CMA /STOP THE CLOCK CLZE CLA ADCL /CLEAR AD LOGIC JUST IN CASE TAD L300 /SET AD ENABLE BITS ADLE TAD CSTART+2 /STARTING CHANNEL NUMBER ADLM > IFNSW 8 < CLEN /STOP THE CLOCK TAD CSTART+2 /SET UP INITIAL SAM INSTRUCTION TAD L100 DCA CSTART+2 TAD CSTART+2 DCA SAMST /STARTING SAM TAD SAMST /ALSO INTERRUPT TIME SAM DCA SAMINS TAD L100 /SET FAST SAM BIT IOF /TURN OFF INTERRUPTS IN LINC MODE LINC /ENTER LINC MODE ESF SAMST, SAM 0 /SET INITIAL SAM CHANNEL PDP ION CLA > CIF CDF JMP% ADSETU BASEX, FNOP M3776, -3776 L10, 10 SAMPTR, ARRAY, 0;0;0 LENGTH, 0;0 BUFSIZ, 0 SAMCNT, CSTART, 0 OLDPTR, 0;0 SAMTMP, NCHANL, 0;0;0 NPOINT, 0;0;0 FLDBUF, XCLINT, ADDR #CLINT IFSW 8 < L300, 300 > IFNSW 8 < L100, 100 > SAMXR, 0;0 TOOFAS, 0 ORG 10*3+BASEX 0 JA NAME+3 0 SAMRTN, JA . CDF0, CDF L7, 7 SECT REALTM BASE 0 STARTD FLDA 30 /GET RETURN ADDR FSTA SAMRTN FLDA 0 /GET ARG POINTER BASE BASEX SETB BASEX SETX SAMXR FSTA NPOINT /SAVE ARG POINTER FCLA EXTERN #CLINT FSTA #CLINT /STOP ANY SAMPLING NOW! LDX 1,1 FLDA% NPOINT,1 /GET BUFFER ADDRESS FSTA ARRAY FLDA% NPOINT,1+ /GET ADDR OF LENGTH FSTA LENGTH FLDA% NPOINT,1+ /ADDR OFHANNEL START FSTA CSTART FLDA% NPOINT,1+ /ADDR OF # CHANNELS FSTA NCHANL FLDA% NPOINT,1+ /ADDR OF NUMBER OF POINTS FSTA NPOINT FLDA ARRAY /CREATE SETX INS FADD STXMJA FSTA BUFSTX FSTA ADBSTX /AND SAVE IT IN TWO PLACES STARTF FLDA% LENGTH /INTEGERIZE AND NEGATE SOME ARGS FNEG ALN 0 FSTA LENGTH FNORM ATX 1 /SET BUFFER COUNT FLDA% CSTART /GET STARTING CHANNEL ALN 0 FSTA CSTART FLDA% NCHANL FNEG ALN 0 FSTA NCHANL FLDA% NPOINT FNEG ALN 0 FSTA NPOINT LDX -1,2 /SET UP FOR BUFFER CLEAR FCLA CLRBUF, FSTA% ARRAY,2+ JXN CLRBUF,1+ TRAP4 ADSETU /SET UP AD STUFF FLDA LENGTH /RE-GET BUFFER SIZE FNORM ATX 1 /BUT NOW ITS TIMES THREE FLDA STPCOD /STORE STOP CODES FSTA% ARRAY /INTO FIRST 3 WORD STARTD FLDA SAMADR /SET UP SAMPLER INTERRUPT HANDLER FSTA #CLINT STARTF JA SAMRTN /RETURN NAME, TEXT +RTMADB+ SAMADR, ADDR SAMPLE STPCOD, 3776;3777;0 STXMJA, 1100-1030;0 L2047, F 2047. L511, F 511. ENTRY ADB ADB, BASE 0 /FETCH SAMPLE FROM BUFFER STARTD FLDA 30 /SAVE REUTRN FSTA SAMRTN SETB BASEX SETX SAMXR BASE BASEX JXN SPEEDK,2 /CLOCK TOO FAST FLDA ADBSTX /SAVE OLD SETX FSTA OLDSTX FADD L1 /ADD ONE TO IT FSTA ADBSTX /AND SAVE IT BACK JXN NORINQ,1+ /END OF BUFFER ? FLDA BUFSTX /YES, RESTART FSTA ADBSTX FLDA LENGTH /RESET COUNT ATX 1 NORINQ, STARTF ADBSTX, SETX 0 /SET XR0 TO NEXT SAMPLE WAIT, XTA 0 /GET THE NEXT SAMPLE FSUB L2047 /IS IT THE STOP CODE JEQ WAIT /YES XTA 0 /NO, FETCH THE SAMPLE LDX 3776,0 /SET SAMPLE STOP CODE OLDSTX, SETX 0 /SET XR0 TO PREVIOUS STOP CODE LDX 0,0 /NOW ZERO IT JA SAMRTN /RETURN SPEEDK, EXTERN #WRITO /USE FORTRAN I/O TRAP3 #WRITO /TO WRITE A MESSAGE JA TTYUNT /ON THE TTY JA MESSAG EXTERN #RENDO TRAP3 #RENDO /CLOSE THE RECORD LDX 0,2 /KILL TOO FAST SWITCH JA SAMRTN /RETURN FROM ADB TTYUNT, F 0. MESSAG, TEXT '(" SAMPLING TOO FAST")' BUFSTX, SETX 0 L1, 0;1 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | / / VERSION 5A 4/26/77 MH / SECT #RFCV /READ FORMATTED COMPLEX VARIABLE ENTRY #WFCV EXTERN #RFSV EXTERN #WFSV JA START DPCHK TEXT "#CIO " RETN, FNOP FNOP SETB BP JA .+3 BP, 0;0;0 CVAL, 0;0;0;0;0;0 ORG BP+30 0;JA RETN 0 GOBAK, JA . START, BASE 0 STARTD 0210 FSTA GOBAK,0 STARTF SETB BP BASE BP JSR #RFSV FSTA CVAL JSR #RFSV FSTA CVAL+3 STARTE FLDA CVAL JA GOBAK BASE 0 #WFCV, FSTA CVAL,0 STARTD 0210 FSTA GOBAK,0 SETB BP BASE BP STARTF FLDA CVAL JSR #WFSV FLDA CVAL+3 JSR #WFSV JA GOBAK END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /DOUBLE PRECISION BINARY AND DIRECT ACCESS I/O /FOR OS/8 FORTRAN / / VERSION 5A 4-26-77 MH / /I/O CALLS ARE: / TRAP3 #RSVO ALL SINGLE PRECISION I/O / TRAP3 #RSVO ALL DOUBLE PRECISION FORMATTED I/O / JSR #RFDV DOUBLE PRECISION BINARY + DIRECT ACCESS I/O / TREATED AS 2 SINGLE PRECISION FORMATTED JOBS SECT #RFDV EXTERN #RSVO BASE 0 STARTE FSTA FTEMP3 /SAVE 6 WDS FOR A WRITE STARTD FLDA 0 /RETURN ADDRESS FSTA RFDVRT /SAVE FOR EXIT STARTF FLDA FTEMP3 /PASS 1ST 3 WDS FOR A WRITE TRAP3 #RSVO /DO THE READ OR WRITE FSTA FTEMP3 /SAVE 1ST 3 WDS FROM A READ FLDA FTEMP3+3 /GET 2ND 3 WDS FOR A WRITE TRAP3 #RSVO /DO THE READ OR WRITE FSTA FTEMP3+3 /SAVE 2ND 3 WDS FROM A READ STARTE FLDA FTEMP3 /GET ALL 6 WORDS FOR A READ RFDVRT, JA . FTEMP3, E 0.0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | / / VERSION 5A 4-26-77 MH / /THE FOLLOWING IS A SET OF 8 MODE (RALF TYPE) /ROUTINES THAT ENABLE PDP 12(8) HARDWARE OPTIONS /THESE ROUTINES ARE CALLABLE AT THE FORTRAN LEVEL /THE FOLLOWING OPTIONS ARE SUPPORTED: / / 1 READ A BIT IN THE RIGHT SWITCHES / 2 READ A BIT IN THE LEFT SWITCHES / 3 READ A SENSE SWITCH / 4 READ AN EXTERNAL LEVEL / 5 OPEN OR CLOSE A RELAY / /IF THE REQUESTED BIT OR SWITCH IS SET THE /SUBROUTINE RETURNS WITH THE CALLERS ARG SET TO /A 1,OTHERWISE IT IS SET TO A 0 / / SECT8 RSW INDEX P17 BASE 0 JSA SETUP /CHECK ONE RSW BIT TRAP4 DORITE /CALL 8 MODE ROUT USER /ARG IS IN FPP XR3 CONT, STARTD /ANSWER IS IN XR3 FLDA% 0,XR2 /GET PTR TO CALLER ANS FSTA 3 STARTF XTA XR3 FSTA% 3 /GIVE ANS TO CALLER GOBAK, FLDA 30 /RTN TO CALLER JAC ENTRY LSW LSW, JSA SETUP /READ 1 LSW BIT TRAP4 DOLEFT /CALL 8MODE ROUT JA CONT ENTRY SSW SSW, STARTD /READ A SENSE SWITCH FLDA ANSNSI JA ESSW ENTRY ROPEN ROPEN, STARTD /OPEN A RELAY FLDA ABCLI ERCLOS, FSTA MASK /PLANT A BCLI OR BSEI IN /8 MODE ROUTINE JSA SETUP TRAP4 RELAY FLDA 30 JAC ENTRY EXTLVL EXTLVL, STARTD /READ AN EXTERNAL LEVEL FLDA ANSXL ESSW, FSTA LSKP /PLANT SXLI OR SNS IN JSA SETUP /8 MODE ROUTINE TRAP4 DOSXL JA CONT ENTRY RCLOSE RCLOSE, STARTD /CLOSE A RELAY FLDA ABSEI JA ERCLOS SETUP, 0;0 /GET ARGS AND SETUP RTN STARTD SETX P17 FLDA% 0,XR1 /GET PTR TO 1ST USER ARG FSTA 3 STARTF FLDA% 3 /USER ARG TO FAC ATX XR3 /PUT IN XR FOR 8 MODE JA SETUP DORITE, 0 /READ RIGHT SWITCHES LAS DCA MASK JMS SETBIT /GET REQUESTED BIT AND MASK /MASK RSW SZA CLA /IF BIT IS SET,SET XR3=1 ISZ XR3 CIF CDF /RTN TO RTS JMP% DORITE DOLEFT, 0 /READ LEFT SWITCHES TAD DOLEFT DCA DORITE IOF 6141 /LINC 517 /LSW 2 /PDP ION JMP DORITE+2 DOSXL, 0 /READ SENSE SWITCH /OR EXTERNAL LEVEL TAD XR3 /=SSW OR LVL TO DO AND P17 TAD LSKP DCA LSKP CLL CML /SET LNK=COND MET IOF 6141 LSKP, 0 /=SNS I N OR SXL N 261 /IF SKP FAILS THEN COND /IS MET SO ROTATE LNK /INTO AC(11) (261=ROL I 1) 2 /PDP ION DCA XR3 /SAVE ANSWER CIF CDF JMP% DOSXL /RTN TO RTS RELAY, 0 /OPEN A RELAY TAD CONT /=6 JMS SETBIT /GO SET RELAY BIT DCA MASK+1 IOF 6141 15 /GET RELAYS MASK, 0 /BCL I OR BSE I 0 /SET OR CLR 1 RELAY BIT 14 /ATR PUT RELAYS BACK 2 ION CLA CIF CDF JMP% RELAY SETBIT, 0 /COME HERE TO POSITION TAD XR3 /BIT IN AC ACCORDING TO /C(AC)+XR3 CMA CLL CML /ROTATE BIT INTO POSITION DCA XR3 /XR3 MUST=0 UPON EXIT RAR /ROTATE LINK UNTIL ISZ XR3 /XR3=0 JMP .-2 JMP% SETBIT /RTN WITH AC SET ABCLI, 1560 /BCL I ABSEI, 1620 /BSE I P17, 17 /FPP XR0 XR1, 1 XR2, 2 XR3, 0 ANSXL, 400 /SXL 261 /ROL I 1 ANSNSI, 460 /SNS I 261 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | / / VERSION 5A 4-27-77 PT / SECT SIGN ENTRY ISIGN JA #ST #XR, ORG .+10 TEXT 'SIGN ' #BASE, ORG .+3 A, ORG .+3 B, ORG .+3 ORG #BASE+31 JA #BASE GOBACK, 0;0;0 BASE #BASE ISIGN, #ST, STARTD 0210 FSTA GOBACK+1,0 0200 SETX #XR SETB #BASE LDX 0,1 FSTA #BASE FLDA% #BASE,1+ FSTA A FLDA% #BASE,1+ FSTA B STARTF FLDA% B JLT #50 FLDA% A JLT #100 JA GOBACK+1 #50, FLDA% A JLT GOBACK+1 #100, FNEG JA GOBACK+1 END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | / / / S I N / - - - / /SUBROUTINE SIN(X) / / VERSION 5A 4-27-77 PT / SECT SIN JA #SIN EXTERN #ARGER SINER, TRAP4 #ARGER TEXT +SIN + SINXR, SETX XRSIN SETB BPSIN BPSIN, F 0.0 XRSIN, F 0.0 SIN1, F 0.0 SIN2, F 0.0 F1SIN, F 1. FPI2SN, 1 /PI DIVIDED BY 2 3110 3755 FPISIN, 2 /PI 3110 3755 F2PISN, 3 /TWO PI 3110 3755 ORG 10*3+BPSIN FNOP JA SINXR 0 SINRTN, JA . / SINC9, 7764 2501 7015 / SINC7, 7771 5464 5515 / SINC5, 7775 2431 5362 / SINC3, 0000 5325 0414 / SINTST, 7770 2000 0000 BASE 0 #SIN, STARTD FLDA 10*3 FSTA SINRTN FLDA 0 SETX XRSIN SETB BPSIN BASE BPSIN LDX 1,1 FSTA BPSIN FLDA% BPSIN,1 /ADDR OF X FSTA BPSIN STARTF FLDA% BPSIN /GET X LDX -1,0 /SET SIGN TO POSITIVE. JGT SINMOD /IF POSITIVE BYPASS FUDGE. JEQ SINRTN /IF ZERO EXIT. FNEG /NEGATIVE. NEGATE AC. SIN(-X)=-SIN(X) LDX 0,0 /SET SIGN TO MINUS. SINMOD, JAL SINER /IF SIGN CAN T INT, THEN ERROR. FDIV F2PISN /REDUCE TO BELOW TWO PI. FSTA SIN1 /SAVE IN A TEMP. ALN 0 FNORM /INTERGIZE IT. FNEG FADD SIN1 /RECALL NUMBER. AC NOW <0 FMUL F2PISN /NOW MULTIPLY BACK. FSTA SIN2 /AND SAVE AWAY. FSUB FPISIN /SUBTRACT OFF PI. JLT SINP /LESS THEN PI. FSTA SIN2 /RESTORE AS 2. XTA 0 /INVERT THE SIGN. FNEG FSUB F1SIN /SIN(X-PI)=-SIN(X) ATX 0 /AND PUT BACK. / SINP, FLDA SIN2 /RECALL MAGIC GOODY. FSUB FPI2SN /TEST TO SEE IF X<PI/2 JLT SINPP /YEP. / FLDA FPISIN /SIN(X)=SIN(PI-X) FSUB SIN2 FSTA SIN2 /AND STORE IT BACK. / SINPP, FLDA SIN2 /GET THE MAGIC NUMBER. FSUB SINTST /SEE IF ITS CLOSE TO AN EDGE JGT SINPPP /IT IS NOT FLDA SIN2 /RECALL NUMBER IF TOO SMALE JXN SINRTN,0 /EXIT IF SAME SIGN. FNEG /ELSE NEGATE IT. JA SINRTN SINPPP, FLDA SIN2 /RECALL NUMBER TO BE WORKED ON. FDIV FPI2SN /DIVIDE BY PI OVER TWO. FSTA SIN2 /AND STORE BACK. FMUL SIN2 /MULTIPLY OUT. FSTA SIN1 FMUL SINC9 /NOW DO THE STANDARD ITERATION. FADD SINC7 FMUL SIN1 FADD SINC5 FMUL SIN1 FADD SINC3 FMUL SIN1 FADD FPI2SN /ADD IN PI OVER 2 FMUL SIN2 /DO THE FINAL MULTIPLY. JXN SINRTN,0 /SHALL WE NEGATE FNEG /YEP JA SINRTN /AND RETURN. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | / / / S I N D / - - - - / /SUBROUTINE SIND(X) / / VERSION 5A 4-27-77 PT / SECT SIND JA #SIND TEXT +SIND + SINDXR, SETX XRSIND SETB BPSIND BPSIND, FNOP 0 0 XRSIND, F 0.0 SIND91, 6 3451 3560 SIND1, F 0.0 ORG 10*3+BPSIND FNOP JA SINDXR 0 SNDRTN, JA . BASE 0 #SIND, STARTD FLDA 10*3 FSTA SNDRTN FLDA 0 SETX XRSIND SETB BPSIND BASE BPSIND LDX 1,1 FSTA BPSIND FLDA% BPSIND,1 /ADDR OF X FSTA BPSIND STARTF FLDA% BPSIND /GET X IN DEGREES FDIV SIND91 /CONVERT TO RADIANS FSTA SIND1 EXTERN SIN JSR SIN /CALL THE SINE JA SNDRTN JA SIND1 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | / / / S I N H / - - - - / /SUBROUTINE SINH(X) / / VERSION 5A 4-27-77 PT / SECT SINH JA #SINH TEXT +SINH + SINHXR, SETX XRSINH SETB BPSINH BPSINH, FNOP 0 0 XRSINH, F 0.0 SINH6, F 0.0 SINH7, F 0.0 SINH8, F 0.0 F1SINH, F 1. F2SINH, F 2. ORG 10*3+BPSINH FNOP JA SINHXR 0 SNHRTN, JA . / SINHLG, 0 2613 4412 / SINH1, F .1 / SINH2, F 87.929 / SINH3, F 6. / SINH4, F 120. BASE 0 #SINH, STARTD FLDA 10*3 FSTA SNHRTN FLDA 0 SETX XRSINH SETB BPSINH BASE BPSINH LDX 1,1 FSTA BPSINH FLDA% BPSINH,1 /ADDR OF X FSTA BPSINH STARTF FLDA% BPSINH /GET X FSTA SINH8 /SAVE THE ARGUMENT. JGE .+3 /MAKE IT POSITIVE. FNEG FSTA SINH7 /AND SAVE ABS VALUE IN CASE WE NEED IT. FSUB SINH1 /IS IT LESS THEN .1? JLE SINHSR /YES. USE SERIES APPROXIMATION. FSUB SINH2 /IS IT GREATER THEN 88.029? JGE SINHAP /YES. USE LOG(2) APPROXIMATION. EXTERN EXP JSR EXP /EXP(X) JA .+4 JA SINH8 FSTA SINH7 FLDA F1SINH FDIV SINH7 /1/EXP(X) FNEG /-1/EXP(X) FADD SINH7 /EXP(X)-1/EXP(X) FDIV F2SINH / 1/2(EXP(X)-1/EXP(X)) JA SNHRTN /AND RETURN NOW. / / SINHAP, FLDA SINH7 /RECALL ABSOULTE VALUE. FSUB SINHLG /ABS(X)-LN(2) FSTA SINH7 /EXP(ABS(X)-LN(2)) EXTERN EXP JSR EXP JA .+4 JA SINH7 FSTA SINH7 FLDA SINH8 /GET SIGN OF ARGUMENT. JGE SPLR /LOAD POSITIVE IF ARG WAS POSITIVE. FLDA SINH7 FNEG /ELSE NEGATE IT. JA SNHRTN /AND RETURN. SPLR, FLDA SINH7 JA SNHRTN / / SINHSR, FLDA SINH8 /X SERIES IF X<.1 FMUL SINH8 /X^2 FSTA SINH7 /X^2 FMUL SINH8 /X^3 FSTA SINH6 /X^3 FMULM SINH7 /X^5 FDIV SINH3 /X^3/6 FADDM SINH8 /X+X^3/6 FLDA SINH7 /X^5 FDIV SINH4 /X^5/120 FADD SINH8 /X+X^3/6+X^5/120 JA SNHRTN /VOILA. WE ARE DONE. |
> > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | / SUBROUTINE SNGL - DBL PREC TO REAL / / VERSION 5A 4-26-77 MH / SECT SNGL DPCHK BASE 0 FLDA 0 STARTD FSTA RETRN FADD TWO FSTA 3 FLDA% 3 FSTA 3 STARTE FLDA% 3 STARTF JA RETRN RETRN, 0;0 TWO, 0;2 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | / / / S Q R T / - - - - / /SUBROUTINE SQRT(X) / / VERSION 5A 4-27-77 PT / SECT SQRT JA #SQRT 0 /THE MANTISSA ND EXPOENT DIDDLE AREAS. 0 SQRTEX, 0 0 SQRT13, 0 0 13 /PHONEY EXPONENT PATCH. / EXTERN #ARGER SQRTM1, TRAP4 #ARGER TEXT +SQRT + SQRTXR, SETX XRSQRT SETB BPSQRT BPSQRT, F 0.0 XRSQRT, F 0.0 SQRT1, F 0.0 SQRT2, F 0.0 SQRT3, F 0.0 F1SQRT, F 1. F2SQRT, F 2. ORG 10*3+BPSQRT FNOP JA SQRTXR 0 SQTRTN, JA . SQRTS1, 0 /IF BETWEEN 1/4 & 1/2 3200 0 0 /IF BETWEEN 1/2 & 1 2240 0 / SQRTS2, 7777 /IF BETWEEN 1/4 & 1/2 2327 7772 7777 /IF BETWEEN 1/2 & 1 3300 0 BASE 0 #SQRT, STARTD FLDA 10*3 FSTA SQTRTN FLDA 0 SETX XRSQRT SETB BPSQRT BASE BPSQRT LDX 1,1 FSTA BPSQRT FLDA% BPSQRT,1 /ADDR OF X FSTA BPSQRT STARTF FLDA% BPSQRT /GET X JEQ SQTRTN /IF =0 JUST RTN JLT SQRTM1 /IF <0 THEN ERROR FSTA SQRTEX+1 /SAVE NUMBER AWAY FOR A SECOND. FLDA SQRT13 /GET A RIGHT ADJUSTED 13 IN THE FAC. FSTA SQRTEX-2 /STORE AWAY RIGHT AHEAD OF THE EXPONENT. FLDA SQRTEX /NOW RETREIVE THE EXPONENT AS HIGH ORDER WORD. ALN 0 /CHOP OFF CRAP. JEQ SQRTSC /IS IT EXACTLY ZERO? IF SO, SPECIAL CASE. FNORM /NORMALIZE IT. FSUB F1SQRT /NOW SUBTRACT ONE FROM IT. FDIV F2SQRT /CHOP IT IN HALF NOW. FSTA SQRT1 /AND SAVE 1/2 EXP IN A TEMP. ALN 0 /NOW FIX THE EXPONENT. FNORM /AND NORMALIZE IT TO REMOVE UNDESIRABLE BITS. FSUB SQRT1 /NOW SUBTRACT OFF EXTRANEOUS BITS. FMUL F2SQRT /EXPAND IT AGAIN [FAC =0 OR -1], OR 0 TO +1 JGE .+3 /MAKE SURE ITS POSITIVE. FNEG /NOW MAKE IT 0 IF NO BIT OR +1 IF BIT SQRTBK, ATX 1 /SAVE IN AN INDEX. FSUB F1SQRT /SUBTRACT ONE TO MAKE IT -1 IF NO BIT OR 0 IF BIT. ALN 0 /AND NOW SHIFT IT RIGHT. FSTA SQRTEX-1 /AND SAVE IT OVER THE OLD EXPONENT. FLDA SQRT1 /RECALL OLD PART ALN 0 /FIX IT UP, NOW. FSTA SQRT1 /AND STORE IT BACK FOR LATER USE / / SQRTEX IS NOW 1/4 <X< 1 / FLDA SQRTEX+1 /RECALL NUMBER. FSTA SQRT2 /SAVE IN A TEMP. / FMUL SQRTS1,1 /MULTIPLY BY CORRECT CONSTANT. FADD SQRTS2,1 /AND NOW ADD IN CORRECT CONSTANT. / / NOTE: INITIAL APPROXIMATION DEPENDS ON WHETHER X IS 1/4<X<1/2 OR / 1/2<X<1 / FSTA SQRT3 /SAVE IN A SECOND TEMP. FLDA SQRT2 /RECALL INITIAL. FDIV SQRT3 /CALCULATE X(0)/X(1) FADD SQRT3 /X(1)+X(0)/X(1) FDIV F2SQRT /1/2(X(1)+X(0)/X(1)) FSTA SQRT3 /SAVE AGAIN. NOW X(2) FLDA SQRT2 /RECALL ORIGINAL. FDIV SQRT3 /X(0)/X(2) FADD SQRT3 /X(2)+X(0)/X(2) FSTA SQRTEX+1 /NOW STORE AWAY FOR FINAL EXPONENT DIDDLING. / STARTD / FCLA /ZERO HIGH ORDER EXPONENT PART. FSTA SQRTEX-1 FLDA SQRT1 /RECALL MODIFIED EXPONENT. FADDM SQRTEX /UPDATE FRACTIONAL EXPONENT. / STARTF /RETRUN TO FLOATING MODE. / FLDA SQRTEX+1 /PICK UP THE ANSWER. JA SQTRTN /AND RTN / SQRTSC, FSUB F1SQRT /SPECIAL CASE FUDGE. FSTA SQRT1 /SET EXPONENT ADD ON TO -1. FNEG /AND SET ODD BIT ON. JA SQRTBK /AND GO BACK UP. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | / / / T A N / - - - / /SUBROUTINE TAN(X) / / VERSION 5A 4-27-77 PT / SECT TAN JA #TAN EXTERN #ARGER TANER, TRAP4 #ARGER TEXT +TAN + TANXR, SETX XRTAN SETB BPTAN BPTAN, FNOP 0 0 XRTAN, F 0.0 TAN1, F 0.0 TAN2, F 0.0 ORG 10*3+BPTAN FNOP JA TANXR 0 TANRTN, JA . BASE 0 #TAN, STARTD FLDA 10*3 FSTA TANRTN FLDA 0 SETX XRTAN SETB BPTAN BASE BPTAN LDX 1,1 FSTA BPTAN FLDA% BPTAN,1 /ADDR OF X FSTA BPTAN STARTF FLDA% BPTAN /GET X JEQ TANRTN /IF 0 RTN NOW FSTA TAN1 /SAVE FOR A SECOND EXTERN COS JSR COS /TAKE COS(X) JA .+4 JA TAN1 JEQ TANER /COS=0. A NO-NO FSTA TAN2 /SAV IT EXTERN SIN JSR SIN /NOW TAKE SIN(X) JA .+4 JA TAN1 FDIV TAN2 /DIV BY COS(X) JA TANRTN |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | / / / T A N D / - - - - / /SUBROUTINE TAND(X) / / VERSION 5A 4-27-77 PT / SECT TAND JA #TAND TEXT +TAND + TANDXR, SETX XRTAND SETB BPTAND BPTAND, FNOP 0 0 XRTAND, F 0.0 TAND91, 6 3451 3560 TAND1, F 0.0 ORG 10*3+BPTAND FNOP JA TANDXR 0 TNDRTN, JA . BASE 0 #TAND, STARTD FLDA 10*3 FSTA TNDRTN FLDA 0 SETX XRTAND SETB BPTAND BASE BPTAND LDX 1,1 FSTA BPTAND FLDA% BPTAND,1 /ADDR OF X FSTA BPTAND STARTF FLDA% BPTAND /GT X IN DEGREES FDIV TAND91 /CONVERT TO RADIANS FSTA TAND1 EXTERN TAN JSR TAN /CALL THE TANGENT JA TNDRTN JA TAND1 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | / / / T A N H / - - - - / /SUBROUTINE TANH(X) / / VERSION 5A 4-27-77 PT / SECT TANH JA #TANH TEXT +TANH + TANHXR, SETX XRTANH SETB BPTANH BPTANH, FNOP 0 0 XRTANH, F 0.0 TANH1, F 0.0 TANH2, F 0.0 ORG 10*3+BPTANH FNOP JA TANHXR 0 TNHRTN, JA . BASE 0 #TANH, STARTD FLDA 10*3 FSTA TNHRTN FLDA 0 SETX XRTANH SETB BPTANH BASE BPTANH LDX 1,1 FSTA BPTANH FLDA% BPTANH,1 /ADDR OF X FSTA BPTANH STARTF FLDA% BPTANH /GET X FSTA TANH1 /SAV IT EXTERN COSH JSR COSH /CALL COSH JA .+4 JA TANH1 FSTA TANH2 /SAVE COSH(X) EXTERN SINH JSR SINH /CALL SINH JA .+4 JA TANH1 FDIV TANH2 /SINH/COSH=TANH JA TNHRTN |
> > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | / / VERSION 5A 4-26-77 MH / SECT #FIX JA . JLT NEGFIX ALN 0 FNORM JA #FIX NEGFIX, FNEG ALN 0 FNORM FNEG JA #FIX END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 | / OS/8 F4 LOADER, V24A / / / / / / / // / / / / /COPYRIGHT (C) 1974, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / / / FIXES FOR V23 J.K. 1975 / / .CORE ROUTINE- RECONIZE CORE RESTRICTION / / / / CHAMGES FOR OS/8 V3D AND OS/78 BY P.T. / .CHANGED VERSION NUMBER TO 24A / .PUT IN NEW DATE ALGORITHM / / VERNUM=24 PATCH="A ESDPG= 7400 /START OF ESD REFERENCE PG IN FIELD 1 LHDR= 7200 /WD0 IN CORE OF LDR HDR IN FIELD 1 OS8SWS= 7643 OSJSWD= 7746 OS8DCB= 7760 OSDATE= 7666 AC7776= CLL STA RAL AC7775= CLL STA RTL AC4000= CLA STL RAR AC2000= CLA STL RTR AC0002= CLA STL RTL / PASS0 DEFINITIONS / ----- ----------- MCTTBL= 6000 /MODULE COUNT TABLE BASE OVTLEN= 2^20^7+2+1 /2 WORDS/OVERLAY, 2 FOR MAIN & 1 FGL OVLTBL= MCTTBL-OVTLEN /(FGL = FOR GOOD LUCK) MODTBL= 21^7+MCTTBL+3 /START OF MODULE TABLE NUMMOD= 7200-MODTBL%3 /NUMBER OF ENTRIES IN MODULE TABLE PTRIO= NDX6 /FLD1;INIT SET TO 7617-1 RALFBF= 7000 /FLD1;BLK TO READ"ESD"FOR FILE CHK /LOADER IMAGE HEADER BLOCK DUMMY SECTION NOPUNCH *LHDR 2 /LOADER IMAGE FILE ID QRTSWP, ZBLOCK 2 /SWAPPER ARGS TO LOAD AND START USER MAIN QHGHAD, ZBLOCK 2 /HIGHEST ADDRESS USED BY THIS PROGRAM QVERNO, 0 /LOADER VERSION NUMBER QDPFLG, 0 /"D.P. HARDWARE REQUIRED" FLAG QUSRLV, ZBLOCK 40 /USER OVERLAY LEVEL DSRN INFO LDBUFS, ZBLOCK 50 /PASS2 BUFFER POINTERS ENPUNCH /RTS ENTRY POINTS /** SOME OF THESE MAY CHANGE IN FUTURE VERSIONS OF RTS ** /** (I HOPE NOT) JARGER= 204 JBAK= 210 JDATE= 203 JDEF= 213 JDISMS= 412 JENDF= 211 JEOFSW= 16 JEXIT= 223 JHANG= 524 JIDLE= 227 JINT= 403 JRDAO= 217 JREADO= 221 JRENDO= 206 JRETRN= 235 JREW= 212 JRSVO= 207 JRUO= 215 JSWAP= 222 JT812= 225 JUERR= 204 JWDAO= 216 JWRITO= 220 JWUO= 214 *0 TMP0, 0 /TMP0-TMP4 FOR GEN. USE TMP1, 0 TMP2, 0 TMP3, 0 *10 /INDEX REGISTERS NDX0, 0 NDX1, 0 NDX2, 0 NDX3, 0 NDX4, 0 NDX5, 0 NDX6, 0 NDX7, OVLTBL-1 /POINTER INTO OVERLAY LENGTH TABLE USR, 200 /USR CALL: COULD BE 200 OR 7700 PPACK, PACK /CHANGED TO TTYO BY ERROR ROUTINE IOFLG, 0 SYMTM3, SYMTBL-3 ORGFLG, 0 RFPTR1, 0 GPTR, 0 LBPTR, 0 TRPCNT, 0 P2FLG, 0 CZFLG, 0 F1FLG, 0 S8FLG, 0 OVRFLO, -1 SWITZ, -1 SVMAIN, -4 /0 IF /S SPECIFIED DPFLG, 0 /MORE PAGE ZERO LOCATIONS GTYP, 0 EPTR, 0 EPT2, 0 ETYP, 0 BPTR, 0 BPT2, 0 REFPTR, 0 RLEN, 0 FTMP0, 0;0 RBLK, 0 FATAL, 0 BP, LDBUFS /POINTER INTO PASS2 BUFFER ARRAY A1, 1;0 /CURRENT ADDRESS IN FIELDS 1-7 LNONUM, 0 LBCNT, 0 BLKCNT, 0 TRAPV, 0;0 BLKSIZ, 0 BSECTP, 0 /POINTER INTO BINARY SECTION TABLE (PASS 2) OUTINH, 0 BLKBEG, 0 NEWBLK, 0 NEWLEN, 0 MCNT, 0 MBGCNT, 0 TMP4, 0 TMP5, 0 PAGE /LOADER STARTS AT 200 ISZ .+2 /NON-CHAIN ENTRY JMP I .+1 /CHAIN ENTRY START /COME HERE TO READ/WRITE THE LOADER IMAGE. LDRIO, 0 /AC=4000 FOR WRITE, 0 FOR READ DCA LDRIOC /STORE READ/WRITE JMS I (NEWBUF TAD BP DCA LDRIOA ISZ LDRIOA TAD I LDRIOA DCA LDRIOB /BLOCK # ISZ LDRIOA TAD I LDRIOA /NUMBER OF BLOCKS LEFT IN SECTION SPA SNA JMP LDRIOR /NULL BUFFER - JUST IN CASE TAD [-4 SMA CLA /IF >4 BLOCKS LEFT ONLY DO 4 TAD [4 CLL RTR RTR RTR TAD LDRIOC /ADD READ/WRITE CDF 0 TAD I (OUTFLD TAD (-CDF DCA LDRIOC /STORE R/W + BLOCK COUNT + FLD BITS TAD BLKBEG DCA LDRIOA JMS I [IOHAN /DF MUST BE 0 HERE! LIMGU /LOADER IMAGE FILE LDRIOC, 0 LDRIOA, 0 LDRIOB, 0 CDF 10 LDRIOR, CLA JMP I LDRIO SETBGX, 0 CLA IAC TAD GPTR JMS SETBPT /EXTREMELY COMMON SEQUENCE JMP I SETBGX SETBPT, 0 DCA BPTR /STORE BPTR CLA IAC TAD BPTR DCA BPT2 /AND PTR TO NEXT WD JMP I SETBPT ORGMSG, TEXT /ILLEGAL ORIGIN/ SYMMSG, TEXT /OVER SYMB/ IOMSG, TEXT %LOADER I/O ERROR% ENTMSG, TEXT %OS/8 ENTER ERROR% PAGE /TTYHAN- TTY HANDLER FOR OUTPUT OF ANY MESSAGE IN ANY FIELD. / MESSAGE MUST BE FIELD CONTAINED & TERMINATE WITH 0 / HANDLER CAN BE CALLED ACROSS FLDS WITH AC CLR. / RTN WITH"IF & DF" SET TO CALLING FLD. / / CALL CDF X /X=FLD OF CALLER*10 / CIF Y /Y=FLD OF TTYHAN*10 / JMS TTYHAN / CDF Z /Z=FLD OF MESS.BUF / BUFADR /MESS BUF. ADDR. / TTYHAN, 0 TAD (6203 /SETUP MICRO INSTR RDF /CDF & CIF FOR RTN DCA CRLFF+1 TAD I TTYHAN /SET UP FLD OF DCA TTYCDF /MESS BUF ISZ TTYHAN CMA TAD I TTYHAN /SET UP MESS BUFF ADDR-1 DCA MESADR ISZ TTYHAN DCA MESADR+1 TTYCDF, 0 JMS CRLF TTYLP, ISZ MESADR+1 JMP .+3 TAD I MESADR JMP HAF ISZ MESADR CLA CMA DCA MESADR+1 TAD I MESADR RTR RTR RTR HAF, AND [77 SNA JMP CRLFF TAD [240 AND [77 TAD [240 JMS TTYO JMP TTYLP CRLFF, JMS CRLF 0 JMP I TTYHAN MESADR, 0 0 RTNOS8, 0 /HERE ON PASS1 FATAL ERROR STA CDF 10 DCA I (OVLTBL /PRINT SYMBOL MAP W/O OVERLAY LENGTH TABLE DOMAP, JMS I (SYMMAP CDF TAD I RTNOS8 /ADDR OF TTY DCA .+3 /MSG JMS I [TTYHAN CDF 0 TAD (TTYO DCA PPACK /FAKE OUT SYMBOL PRINTER TAD LNONUM DCA GTYP /PUT LEVEL AND OVERLAY IN GTYP JMS I (CVLOVL /OUTPUT LEVEL AND OVERLAY AC7775 DCA TMP5 /PRINT 3 DIGIT FILE-WITHIN-OVERLAY TAD MCNT TAD MBGCNT IAC CLL RTL RAL JMS I (CVRT JMS CRLF /OUTPUT CRLF AFTERWARDS JMP I .+1 /RTN TO 7605 /OS8 LDRNAM, 1;0617;2224;2216;1404 /SYS:FORTRN.LD ZBLOCK 5 /NO DEFAULT SYMBOL MAP DEVICE TTYO, 0 TLS TSF JMP .-1 CLA JMP I TTYO / CRLF, 0 TAD (215 JMS TTYO TAD (212 JMS TTYO JMP I CRLF /OS8ER- USED WHEN AN OS/8 ERROR OCCURS WHICH IS FATAL OS8ER, 0 CDF 0 JMS I [TTYHAN CDF 0 /FLD OF MESS BUF SYSERR /ADR OFMESS BUF JMP I [7605 /RTN TO OS8 SYSERR, TEXT /SYSTEM ERROR/ TYTBL, 4040 /CHARS FOR SMAP 0530 /EX (EXTERN) 4040 /GOOD TYPES ARE 4040 /SPACES 1505 /ME (MUL ENTRY) 1523 /MS (MUL SECTN) 4040 /GEN 8MOD SECT 4040 /8MOD COM SECT 4040 /8MOD F1 SECT PAGE /IOHAN- I/O HANDLER 1)FETCHES A OS8 DEVICE HANDLER; / 2)CHKS FOR E.O.FILE;3)ISSUES CALL TO THE HANDLER. / RTN TO CALLER WITH "IOFLG" SET IF / NUM OF BLKS TRANSF LESS THAN REQ AMT. / CAN BE CALLED FROM ANY FLD / IF AC=0,DO ALL OF THE ABOVE. / IF AC=DEV NUM,DO ONLY "FETCH"PART / / CALL CDF X / CIF Y / JMS IOHAN / ADDR /PTR TO UNIT,LEN,STBLK OF FILE IN FLD 1 / ARG(1)/OS8 ARG: FCN CTRL WD / ARG(2)/ " : TRNASF BUF ADR / ARG(3)/ " : REL STBLK OF TRANSF / IOHAN, 0 DCA UNITSV /SAV DEV NUM IF ONE DCA IOFLG /CLR FLG RDF TAD P6201 DCA GETCDF+1 TAD P6203 /SETUP CIF & CDF FOR RDF /RTN JMP DCA RTNIO /FETCH A DEV HANDLER OR LOOKUP ENTRY PT /IF DESIRED HANDLER IS IN CORE TAD UNITSV /GET DEV NUM IF ONE SNA CLA /JUST A FETCH? JMP .+3 /NO JMS INQIRE /YES JMP RTNIO TAD I IOHAN /GET PTR TO UNIT(DEV NUM) DCA ULSADR CDF 10 TAD I ULSADR /GET DEV NUM AND [17 SNA JMS I [OS8ER DCA UNITSV JMS INQIRE /CHK FOR E.O.FILE ISZ IOHAN JMS GETCDF TAD I IOHAN /GET FCN CTRL WD CLL RTL /NUM OF PAGES IS CONVRTED RTL /TO NUM BLKS & PUT RTL /IN BITS 8-11 AND [17 DCA TMP0 /NUM BLKS TO TRANSF /SETUP FCN CTRL WD; TRANSF BUF ADR; & ABS STBLK OF TRANSF /FOR OS8 CALL TO HANDLER TAD I IOHAN /FCN CTRL WD DCA FCNWD ISZ IOHAN TAD I IOHAN /TRANSF BUF ADR DCA FCNWD+1 ISZ IOHAN TAD I IOHAN /GET REL STBLK & BUILD TAD TMP0 /ABS STBLK CIA CLL ISZ ULSADR CDF 10 TAD I ULSADR /FILE LEN-(REL STB+NUM BLKS) SNL SZA /E.O.FILE CONDITION? JMP .+3 /YES CLA /NO JMP SETSBN TAD TMP0 SMA SZA /ANY BLKS TO TRANSF? JMP IOH /YES CLA /NO /CHK IF FILE LEN=0; IF SO DO SEQ STUFF TAD I ULSADR SNA CLA /SEQ DEV? JMP IOH+1 /YES CMA /NO,=-1 IF NUM BLKS TRANSF L.T. REQ DCA IOFLG JMP RTNIO IOH, DCA TMP0 /THIS NUM OF BLKS /UPDATE FCN CTRL WD IN OS8 CALL TAD FCNWD AND (4077 /REMOVE REQ NUM OF PGS DCA FCNWD /& PUT IN THE TAD TMP0 /ALTERED NUM CLL RTR RTR RTR TAD FCNWD DCA FCNWD CMA /=-1 IF NUM BLKS TRANSF L.T. REQ DCA IOFLG /SETUP STARTING BLK NUMBER / SETSBN, ISZ ULSADR CDF 10 TAD I ULSADR /GET ABS STBLK JMS GETCDF /GET DF TAD I IOHAN /ADD REL STBLK DCA FCNWD+2 TAD I IOHAN /UPDATE REL STBLK TAD TMP0 /BY NUM BLKS OF TRANSF DCA I IOHAN /CALL TO THE HANDLER P6203, CIF CDF 0 /IOHAN & OS8 DEV HAN IN FLD 0 KSF /CHK FOR CTRLC JMP .+5 KRS TAD (-203 SNA CLA JMP I [7605 JMS I IOENT FCNWD, 0 0 0 JMP HNDERR /ERROR RETURN OF CALL ISZ IOHAN RTNIO, 0 /CIF INSTR JMP I IOHAN IOENT, 0 ULSADR, 0 UNITSV, 0 / GETCDF, 0 0 JMP I GETCDF HNDERR, JMS I [RTNOS8 IOMSG /INQIRE- DETERMINE IF DESIRED DEV HANDLER IS IN CORE / & IF SO,GET ITS ENTRY PT DVTBL=7647 INQIRE, 0 CDF 10 TAD UNITSV TAD (DVTBL-1 DCA IOENT /ADR OF ENRTY PT IN RESID. TBL TAD I IOENT /GET ENTRY PT IF ONE DCA IOENT TAD IOENT SZA CLA /DEV HAN WAS IN CORE? JMP I INQIRE /YES TAD (7201 /NO DCA P6201+4 TAD UNITSV /GET DEV NUM BK P6201, CDF 0 CIF 10 JMS I USR 1 0 JMS I [OS8ER TAD .-2 DCA IOENT JMP I INQIRE PAGE NXTESD, 0 ISZ EPTR /ADV PTR TO ISZ EPTR /WD 0 OF TAD EPTR /NEXT ENTRY AND [377 /IF AT BLK SNA CLA /BOUNDARY TAD [4 /BUMP IT FOUR TAD EPTR JMS I [SETEPT TAD [3 /CHECK FOR TAD EPTR /END OF DCA TMP0 /ESD TAD I TMP0 /TYPE WD AND [17 /TO AC B8-B11 SZA /LAST ESD? ISZ NXTESD /NO DCA ETYP /SAVE TYPE JMP I NXTESD ADVOVR, 0 /UPDATE PASS1 PASS2 ARGS ISZ MCNT /MORE MODS IN THIS OVR? JMP SAMOVR /YES JMS NXTOVR /SET ARGS FOR NEXT OVER JMP EOLVL /RTN HERE= END OF LEVEL TAD P2FLG /DOING PASS2 ? SMA CLA JMP BY10 /NO TAD (2 /GET NEW LDR TAD BSECTP /IMAGE REL BLK DCA TMP0 /FOR NEXT OVR TAD TMP0 DCA NDX0 TAD I NDX0 /LENGTH OF OVERLAY TAD I TMP0 /PLUS OLD RELATIVE BLOCK DCA I TMP0 /EQUALS NEW RELATIVE BLOCK BY10, TAD LNONUM /ADD 1 TO BITS TAD (20 /4-7 OF LEVEL DCA LNONUM /AND OVR LAY NUM JMP SAMOVR EOLVL, JMS NXTOVR /GET NXT OVR NEW LEVEL JMP SAMOV4 /HERE=END OF ALL LEVELS TAD LNONUM /ADD 1 TO AND [3400 /THE LEVEL TAD (400 /BITS (1-3) DCA LNONUM /AND CLEAR THE OVR BITS TAD P2FLG SMA CLA /DOING PASS2 ? JMP BY7 /NO TAD [4 TAD BSECTP /UPDATE BIN SECTION PTR DCA BSECTP JMP SAMOVR BY7, ISZ I (LEVSYM+2 /SET THE INTERNAL LEVEL SYMBOL TO LEVLN+1 TAD (LEVSYM /ENTER NEW JMS I [LOOK /LEVEL SYMBOL INTO GST TAD [4 TAD LNONUM /SET TYPE DCA I GPTR /TO PROG SECTION IAC /SET PTR TO TAD GPTR /NEW LEVEL DCA I [LVPTR LEVRND, TAD I BPT2 CLL TAD [377 /ROUND UP OLD LEVEL AND [7400 /TO A BLOCK BOUNDARY SZL ISZ I BPTR /MIND THE CARRIES! DCA I BPT2 SAMOVR, TAD [3 /ADV PTR TO TAD RFPTR1 /NXT RALF DCA RFPTR1 /MODULE JMP I ADVOVR SAMOV4, ISZ ADVOVR /BUMP RETURN TAD P2FLG SPA CLA JMP SAMOVR /SKIP ROUNDUP IF PASS 2 JMS I (LEVLUP /MERGE OVERLAY SIZE INTO LEVEL SIZE JMP LEVRND /AND RND UP LAST LEVEL NXTOVR, 0 /HERE AT END OF OVERLAY ISZ MTBL /GET NUM OF TAD I MTBL /MOD IN NXT SNA /OVR JMP I NXTOVR /=END OF LEVEL DCA MBGCNT TAD MBGCNT CIA DCA MCNT TAD P2FLG SMA CLA JMS I (LEVLUP /SET CUR. LEVL =MAX (CUR LEVL, CURNT OVR) ISZ NXTOVR /RTN P+1 IF JMP I NXTOVR /NOT END OF LEVEL SETCNT, 0 TAD (MCTTBL+1 /PTR TO MOD DCA MTBL /COUNT TBL TAD I MTBL /-NUM IN DCA MBGCNT TAD MBGCNT CIA /MAIN DCA MCNT TAD (MODTBL+3 /PTR TO TOP DCA RFPTR1 /OF MOD TBL DCA I (OVRSIZ DCA I (OVRSIZ+1 JMP I SETCNT MTBL, 0 PAGE /LOOKUP OR ENTER A SYMBOL INTO /GLOBAL SYMBOL TABLE (GST). PTR /TO SYMBOL IN FIELD 1 IS IN /AC. USUALLY ITS AN ESD. /RTN P+1=NO MATCH /RTN P+2=MATCH LOOK, 0 DCA TMP0 /PTR TO SYM CDF 10 TAD I TMP0 /SELECT RTR /BUCKET RTR /A-Z, SPACE RTR /OR POUND AND [77 TAD (BUCKET-1 /PTR TO BUCKET LOP5, DCA TMP1 /PTR TO PREV ENTRY TAD I TMP1 /PTR TO NEXT ENTRY SNA /0=BUCKET BOTTOM JMP HOOKIN /NO MATCH IAC /APPEND SYMBOL DCA GPTR /LOOK FOR AC7775 /3 WORD MATCH DCA TMP2 TAD TMP0 DCA EPTR YUCCH, TAD I EPTR CIA CLL TAD I GPTR SZA CLA JMP YECCH /SYMBOLS DIFFER ISZ EPTR ISZ GPTR ISZ TMP2 /ALL MATCH? JMP YUCCH /NO ISZ LOOK /BUMP RTN SETTYP, TAD I EPTR /GET ESD TYPE AND [17 DCA ETYP CLA IAC TAD EPTR JMS I [SETEPT /BUMP EPTR AND SET EPT2 TAD I EPTR /GET ESD NUM RTR /IN B1-B7 RTR /AND SET AND (177 /REFERENCE TAD (ESDPG /POINTER DCA REFPTR TAD I GPTR /SET GST AND [17 /TYPE DCA GTYP /FIELD BITS OF TAD I EPTR /VALUE WORDS AND [7 /CLR DCA I EPTR /HI 9 JMP I LOOK YECCH, SZL /IS NEW GUY LESS THAN GST ENTRY? JMP HOOKIN /YES HOOK-IN HERE TAD I TMP1 JMP LOP5 /TRY NEXT HOOKIN, TAD I TMP1 /GET FWD LINK DCA I NDX4 /TO NEXT INTO TAD NDX4 /NEW. PUT FWD DCA I TMP1 /LINK TO NEW INTO PREV. TAD TMP0 /3 SYM DCA EPTR /INTO GST AC7775 DCA TMP2 TAD I EPTR DCA I NDX4 ISZ EPTR ISZ TMP2 JMP .-4 ISZ NDX4 /SET PTR TO TAD NDX4 /WORD 4 (TYPE) DCA GPTR /OF GST ISZ NDX4 /SET PTR TO NEXT ISZ NDX4 /FREE ENTRY TAD [7 /SEE IF TAD NDX4 /GST IS FULL TAD ENDSYM /END OF GST SPA SNA CLA JMP SETTYP /ITS OK JMS I [RTNOS8 /SYMBOL TABLE SYMMSG /OVER FLOW ENDSYM, 1-OVLTBL SETEPT, 0 DCA EPTR CLA IAC TAD EPTR DCA EPT2 /SET PTR TO BOTH WDS OF DBLWD JMP I SETEPT GETTYP, 0 /ADV GST PTR TAD [7 /TO WD 4 OF TAD GPTR /ENTRY DCA GPTR /CHECK FOR TAD GPTR TAD ENDSYM SMA CLA JMP I GETTYP TAD I GPTR /END OF GST. SZA CLA /IF NOT END, ISZ GETTYP /ISZ RETURN. JMP I GETTYP OLINE, 0 /OUTPUT A LINE OF TEXT TO THE SYMBOL MAP DCA TMP5 OLINLP, TAD I TMP5 JMS I (HAFWD TAD I TMP5 ISZ TMP5 AND [77 SZA CLA JMP OLINLP JMS I [PCRLF /DOUBLE SPACE AFTERWARDS JMS I [PCRLF JMP I OLINE PAGE /HERE TO OUTPUT SYMBOL MAP /EACH SYMBOL IN GST IS 7 WORDS LONG /THE FORMAT IS: /WD0 PTR TO NEXT ALPHABETICAL SYMBOL /WD1 SYMBOL NAME IN PACKED SIX BIT /WD2 ASCII. 00 IS INTERPRETED AS SPACE /WD3 SIX CHARS MAX PER SYMBOL /WD4 B0=1=TRAP VECT SYMBOL ON PASS1 OR / B0=1=PASS2 ERROR, B1-B3=LEVEL NUM / (0-7) B4-B7=OVERLAY NUM (0-17) / B8-B11=TYPE. TYPE FORMAT IS: / 0=END OF ESD TBL (NA TO LDR) / 1=ENTRY POINT / 2=EXTERN / 3=COMMON SECTION / 4=PROGRAM SECTION / 5=MULTIPLE ENTRY POINT / 6=MULTIPLE SECTION / 7=GENERAL 8-MODE SECTION / 10=FIELD1 8-M0DE SECTION / 11=COMMON PG0 8-MODE SECTION / 12-17=UNDEFINED / /WD5 B0-B8=PTR TO PARENT SYMBOL (0R 0) / ON PASS1 =TRAP VECTOR DISPLACEMENT / ON PASS2 / B9-B11=FIELD BITS OF SYMBOL /WD6 ADDR BITS OF SYMBOL /OUTPUT FORMAT OF MAP IS: / /SYMBOL VALUE LEVEL OVRNUM TYPE(*) / /THE TYPE COLUMN IS EITHER 2 BLANKS OR /EX=EXTERN /ME=MULTIPLE ENTRY POINT /MS=MULTIPLE SECTION /ASTERISK MEANS SOME TYPE OF ILLEGAL /REFERENCE TO A SYMBOL AND USUALLY /MEANS A LOADER ORIGINATED TRAP HAS /BEEN GENERATED SOMEWHERE IN THE BINARY /E.G. SUBR GROG AT LEVEL 2 CALLS SUBR /COLUMBO AT LEVEL 1. A USER 7 TRAP /WOULD BE GENERATED IN SUBR GROG, AND /THE SYMBOL COLUMBO WOULD HAVE AN /ASTERISK ASIDE OF IT IN THE TYPE /COLUMN SYMMAP, 0 CDF TAD I (LDRNAM+5 /MAP UNIT SNA /IS IT 0 ? JMP NOMAP /YES, NO MAP TO OUTPUT JMS I [IOHAN /FETCH HANDLER TAD I (LDRNAM+5 /ENTER OUTPUT CIF 10 JMS I USR 3 MPBLK, LDRNAM+6 0 JMP ENTERR /WHOOPS WE HAVE AN ENTER ERROR TAD I (LDRNAM+5 AND [17 CDF 10 DCA I (SMAPU /STORE SYMBOL MAP UNIT TAD (SMAPU /SYMMAP ARGS DCA NDX0 /FOR I/O TAD MPBLK+1 /LENGTH CIA DCA I NDX0 TAD MPBLK DCA I NDX0 TAD (BUCKET /START AT 1ST DCA RLEN /BUCKET (A) TAD (-42 /DO UP UNTIL BUT NOT INCL. DCA RBLK /POUND SIGN AC7775 /INIT PACK ARGS DCA FATAL TAD (RALFBF DCA TMP4 TAD SM600 DCA BLKCNT JMS I [PCRLF TAD (TLINE JMS I (OLINE TAD (STLINE JMS I (OLINE /OUTPUT TITLE AND SUBTITLE TAD I RLEN /1ST SYM LOP10, DCA GPTR TAD GPTR /ANY MORE IN SZA /THIS BUCKET ? JMP JOUSYM /YES ISZ RLEN /NXT BUCKET ISZ RBLK /DONE ALL JMP LOP10-1 /NO ISZ SWITZ /BEEN HERE BEF? JMP DUNMP /YES ALL DONE CLA CMA /SET FOR JUST DCA RBLK /POUND SYMS TAD SVMAIN SNA /DO ONLY #MAIN? JMP LOP10-1 /NO - DO ALL # SYMBOLS PRMAIN, CLA /** REPLACED WITH JMS I (OUTSYM ** DUNMP, TAD [-4 /OUT PUT DCA TMP5 /THE HIGHEST LOCATION TAD A1 /USED BY THE PROGRAM TAD (4060 /FLD BITS JMS HAFWD TAD A1+1 JMS I (CVRT TAD (HLINE JMS I (OLINE /PRINT " = HIGHEST LOC USED" JMS I (PROVLY /PRINT OVERLAY TABLE SM600, CLA /** AC NOT 0 ON RETURN** TAD (214 JMS I PPACK TAD (232 /CTRL Z OUFILP, JMS I PPACK TAD BLKCNT /HAVE WE FILLED TAD [600 /A BLOCK UP COMPLETELY? SZA CLA JMP OUFILP /NO CDF /CLOSE SYMMAP TAD I (SYLST /AC=LENGTH DCA SMPCLN TAD I (LDRNAM+5 /MAP UNIT CIF 10 JMS I USR 4 LDRNAM+6 SMPCLN, 0 JMS I [OS8ER NOMAP, CDF 10 JMP I SYMMAP JOUSYM, JMS I (OUTSYM TAD I GPTR /NEXT SYM TO DO JMP LOP10 HAFWD, 0 /OUTPUT THE 2 6 BIT ASCII CHARS IN AC DCA TMP3 TAD TMP3 /LEFT HALF 1ST RTR RTR RTR JMS SIXTO8 TAD TMP3 JMS SIXTO8 JMP I HAFWD SIXTO8, 0 /CVRT AC FROM AND [77 /6 TO 8 BIT ASCII SZA TAD [240 /TURN ZEROS TO BLANKS AND [77 TAD [240 JMS I PPACK /PUT IN BUFF IN PS/8 FORMAT JMP I SIXTO8 ENTERR, DCA I (DOMAP /CANCEL SYMBOL MAP FROM RTNOS8 JMS I [RTNOS8 /AS WE MASY HAVE COME FROM SYMMAP ENTMSG PAGE /PACK ASCII IN AC INTO OUTPUT BUFF IN /OS/8 3 WORD FORMAT TO 2 12 BIT WORDS PACK, 0 ISZ FATAL /3RD WORD ? JMP ONEOR2 /NO DCA TMP0 /SAVE CHAR AC7776 /BU BUFF PTR TAD TMP4 DCA TMP4 AC7775 DCA FATAL /RESET CNTR JMS ROL /POSITION HI DCA I TMP4 ISZ TMP4 JMS ROL /POSITION LO ONEOR2, DCA I TMP4 ISZ TMP4 ISZ BLKCNT /BLOCK FULL ? JMP I PACK /NO JMS WRBUF TAD SBPTR DCA TMP4 /RESET ARGS TAD (-600 DCA BLKCNT JMP I PACK ROL, 0 TAD TMP0 /3RD CHAR RTL /POSITION RTL /BITS DCA TMP0 /SAV FOR NXT CALL ON LO TAD TMP0 AND [7400 TAD I TMP4 /ADD IN OLDY JMP I ROL WRBUF, 0 /WRITE OUT CDF /SYM MAP JMS I [IOHAN /BUFFER SMAPU /ADDR OF SYM U 200^1!4000!10 /1 BLK OF FLD 1 SBPTR, 7000 /1ST ADDR SYLST, 0 /REL BLK CDF 10 JMP I WRBUF CVRT, 0 /CONVERT AC TO DCA CVRTMP /ASCII NUM TAD TMP5 /-NUM OF DIGITS DCA TMP1 /TO CONVERT LOP7, TAD CVRTMP /CVRT LEFT TO RTL /RIGHT RAL /3 BITS PER DCA CVRTMP /DIGIT TAD CVRTMP RAL AND [7 TAD (260 JMS I PPACK ISZ TMP1 /ENOUGH ? JMP LOP7 /NO JMS I (HAFWD /OUTPUT A PAIR JMP I CVRT /OF SPACES OUTSYM, 0 /DO ONE SYMBOL DCA NDX1 /ADDRESS IN AC ON ENTRY AC7775 DCA TMP2 TAD I NDX1 /SYMBOL IS 1ST JMS I (HAFWD ISZ TMP2 JMP .-3 TAD I NDX1 /SAVE DCA GTYP /TYPE TAD I NDX1 /FLD OF SYMBOL JMS PR15 JMS CVLOVL /CONVERT ADDR, LEVEL, OVERLAY TAD GTYP /NOW DO TYPE AND (17 /ITS B8-B11 TAD (TYTBL-1 /PTR TO TBL OF DCA TMP0 /CHAR PAIRS FOR CDF 0 TAD I TMP0 /TYPE EG EX FOR CDF 10 JMS I (HAFWD /EXTERN TAD GTYP /IF ERROR WAS SPA CLA /FOUND DURING PASS2 B0 OF TYPE=1 EG ILLEGAL SUBR CALL. * ON MAP INDICATES TAD (12 /PASS2 ERROR TAD [240 JMS I PPACK JMS PCRLF JMP I OUTSYM CVRTMP, 0 CVLOVL, 0 CLA CMA DCA TMP5 /DO LEVEL NUM TAD GTYP /ITS B1-B3 OF RAL /OF TYPE WORD JMS CVRT AC7776 /DO OVER NUM DCA TMP5 /ITS B4-B7 OF TAD GTYP /TYPE WORD RTL /POSITION INTO AND (1700 /HI 2 DIGITS JMS CVRT JMP I CVLOVL PCRLF, 0 TAD (215 /EOL JMS I PPACK TAD (212 JMS I PPACK JMP I PCRLF PR15, 0 AND [7 TAD (4060 JMS I (HAFWD TAD [-4 /NOW DO ADDR OF DCA TMP5 /SYMBOL TAD I NDX1 JMS CVRT JMP I PR15 PAGE /PASS 2 OF LOADER - TRANSFORMS BINARIES INTO LOADER IMAGE FILE PASS2, DCA LNONUM /SET FOR MAIN JMS I (BLDTV /BUILD TRAP VECTOR TAD LBCNT /PROCESS LIBR CIA /MODULES 1ST SNA /ANY TO DO? JMP BY12 /NO DCA LBCNT /=-NUM TO DO TAD LBPTR /PTR TO 1ST DCA RFPTR1 /LIBR MOD JMS SETREF /INIT RELOC ARGS AND PROCESS TXT TAD [3 /ADV TO NXT TAD RFPTR1 /LIBR MOD. DCA RFPTR1 ISZ LBCNT /DONE LIBR? JMP .-5 /NO BY12, JMS I (SETCNT /SET ARGS TO PROCESS USER MODS. JMS SETREF /DO 1 MOD JMS I (ADVOVR /ADVANCE ARGS JMP .-2 /RTN HERE IF MORE TO DO JMS I (WRALL /WRITE OUT ALL THE RESIDENT BIN BLOCKS /END OF PASS 2 - RETURN TO OS8 OR CHAIN TO RSYS TAD (7616 DCA NDX0 TAD I (LIMGU /SAVE UNIT AND BLOCK OF LOADER IMAGE DCA I NDX0 /FILE IN CD AREA IN CASE WE CHAIN TAD I (LIMGU+2 DCA I NDX0 /TO THE RUN-TIME-SYSTEM DCA I NDX0 /A PRECAUTION CDF 0 CIF 10 JMS I USR 10 /LOCK USR IN TAD (200 DCA USR TAD I (LDRNAM CIF 10 JMS I USR 4 LDRNAM+1 /CLOSE LOADER IMAGE FILE LDCLEN, 0 JMS I [OS8ER /OOPS! JMS I (SYMMAP /PRINT SYMBOL TABLE IF REQUESTED TAD I (OS8SWS CDF 0 AND (40 /TEST /G SWITCH SNA CLA JMP I [7605 /NOT ON - RETURN TO OS8 CLA IAC CHAIN, CIF 10 JMS I USR CHCODE, 2 RTSNAM /LOOKUP RTS 0 JMP NORTS TAD (6 DCA CHCODE /CHANGE LOOKUP TO CHAIN JMP CHAIN NORTS, DCA I (LDRNAM+5 /KILL SECOND STORAGE MAP JMS I [RTNOS8 RTSMSG RTSNAM, 0622;2423;0000;2326 /FRTS.SV SETREF, 0 JMS I (RDRLES /GET MODULE ESD TABLE AC7776 DCA EPTR LOP12, JMS I .+4 /GET NXTESD JMP BY11 /ALL DONE TAD EPTR /LOOK UP JMS I [LOOK /SYMBOL NXTESD CLA CMA /IGNORE ESD IF TAD ETYP /ITS AN ENTRY SNA CLA /POINT JMP LOP12 /IGNORE TAD GPTR /PUT ADDR OF DCA I REFPTR /GST SYM IN JMP LOP12 /ESD REF. PAGE BY11, CDF 0 /COMPUTE 1ST TAD EPTR /TEXT BLK AND [7400 CLL RTL RTL RAL IAC DCA I (TXTBLK CLA CMA /SET CNT TO -1 DCA BLKCNT /TO KICK OFF 1ST TXT READ TAD RFPTR1 /PTR TO DCA I (TXTBLK-3 /RALF MOD CDF 10 JMS I (TXTSCN /RELOCATE JMP I SETREF /TEXT PAGE BLDTV, 0 /BUILD UP TAD TRPCNT /TRAP VECTOR SNA CLA /ANY TO DO? JMP I BLDTV /NO TAD .+2 /GET BASE JMS I [LOOK /ADDR OF TRPSYM /TRAP VECT ISZ GPTR TAD I GPTR DCA TMP0 ISZ GPTR TAD I GPTR DCA TMP1 TAD TMP0 /FOR SUBR DCA TRAPV /TRPVEC TAD TMP1 DCA TRAPV+1 JMS NEWORG /PROCESS NEW ORIGIN DCA TRPCNT /WILL BE USED TO MARK GST SYMS TAD .+2 /THAT HAVE A VECTOR ENTRY JMS I [LOOK /GET SWAPPER SWPSYM /ADDR ISZ GPTR ISZ GPTR TAD I GPTR DCA RFPTR1 TAD SYMTM3 /SCAN GST LOP11, DCA GPTR /FOR ALL JMS I [GETTYP /TRAP SYMS JMP I BLDTV /ALL DONE TAD I GPTR /IF TYPE WD SMA CLA /B0=1, THEN SYMBOL NEEDS A VECTOR ENTRY JMP LOP11+1 /TRY NEXT 1ST WD OF ENTRY IS TAD (3000 /TRAP3 JMS I [PUTBIN TAD RFPTR1 /NXT IS JMS I [PUTBIN /SWAP ADDR CLL CML CLA RAR /CLR B0 TAD I GPTR /OF TYPE WD DCA I GPTR TAD I GPTR ISZ GPTR RTL RTL DCA TMP0 /HAVE TO MUSH SOME BITS AROUND: TAD TMP0 /OVERLAY NUMBER MOVES FROM B4-7 TO B0-3 AND [7400 DCA TMP1 /LEVEL NUMBER MOVES FROM B1-3 TO B6-8 TAD TMP0 RTL RTL AND (70 TAD TMP1 TAD I GPTR /ADD FLD BITS TO MESS JMS I [PUTBIN TAD TRPCNT /ADV VECT TAD (10 /ENTRY NUM DCA TRPCNT /COUNTER TAD I GPTR /TAG HI 9 TAD TRPCNT /OF GST SYM DCA I GPTR /WD5 WITH TV ENTRY NUMBER ISZ GPTR TAD I GPTR /ENTER JMS I [PUTBIN /ADDR AC7776 TAD GPTR JMP LOP11 /FOR THIS SYM NEWORG, 0 TAD BSECTP JMS I [SETEPT /SET PTR TO CURRENT SECTION TAD I EPT2 CIA CLL TAD TMP1 DCA TMP3 TAD TMP3 AND (6000 DCA TMP2 /DO A DOUBLE PRECISION SUBTRACT CML RAL TAD I EPTR CIA CLL TAD TMP0 SPA JMP BADORG /OUT OF RANGE CLL RAR TAD TMP2 /COMBINE AND SHIFT RIGHT 8 RAL RTL RTL /(I.E. LEFT 5) DCA TMP2 TAD TMP2 ISZ EPT2 TAD I EPT2 /ADD TO RELATIVE BLOCK OF SECTION DCA NEWBLK ISZ EPT2 TAD TMP2 CIA TAD I EPT2 SPA JMP BADORG /ORIGIN OUT OF RANGE DCA NEWLEN JMS I (NEWBB /GET BUFFER USING NEWBLK AND NEWLEN TAD TMP3 AND (1777 TAD BLKBEG DCA BLKSIZ /FORM POINTER INTO PROPER BUFFER JMP I NEWORG BADORG, JMS I [RTNOS8 ORGMSG /ORIGIN OUT OF CURRENT FILE LIMITS JMP I NEWORG PAGE PROVLY, 0 /ROUTINE TO PRINT OVERLAY INFO IN SYMBOL MAP JMS I [PCRLF TAD (OTLINE JMS I (OLINE TAD (OVLTBL-1 DCA NDX1 PROVLP, TAD I NDX1 /GET ENTRY SPA /TEBLE ENDS WITH -1 JMP I PROVLY DCA GTYP TAD [240 JMS I PPACK JMS I (CVLOVL /PRINT LEVEL AND OVERLAY TAD GTYP JMS I (PR15 /PRINT 15-BIT LENGTH JMS I [PCRLF JMP PROVLP RDRLES, 0 /READ A TAD RFPTR1 /PTR TO RALF DCA RLARG-1 /MOD DCA RLARG+2 /STRT AT BLK 0 CDF /AND READ JMS I [IOHAN /3 BLKS INTO 0 /10000-11400 RLARG, 200^3!10 0 0 CDF 10 JMP I RDRLES /STARTING WITH THE LATEST, /WRITE OUT ALL CORE RESIDENT /BINARY BUFFERS WRALL, 0 TAD BP IAC /PTR TO DCA TMP0 /CURNT BLK TAD I TMP0 SNA CLA /ALL DONE ? JMP I WRALL /YES AC4000 JMS I (LDRIO /WRITE IT TAD I BP SNA JMP I WRALL DCA BP JMP WRALL+1 NOTREL, JMS I [RTNOS8 RELMSG RELMSG, TEXT /BAD INPUT FILE/ RTSMSG, TEXT /NO FRTS/ MERGE, 0 JMS I (GETTXT /COMBINE TXT DCA FTMP0 /PAIR WITH JMS I (GETTXT /PAIR WHOSE DCA FTMP0+1 /ADDR IS IN BPTR CLL TAD I BPT2 TAD FTMP0+1 DCA TMP1 RAL TAD I BPTR TAD FTMP0 AND [7 DCA TMP0 TAD FTMP0 /GET THE OPCODE OR WHATEVER AND [7770 /IS IN THE HIGH 9 BITS TAD TMP0 /AND COMBINE THEM WITH THE RELOCATED ADDRESS JMS I [PUTBIN /AND OUTPUT THE MESS TAD TMP1 JMS I [PUTBIN /DON'T FORGET WORD 2 JMP I MERGE GETCTL, 0 /GET TEXT JMS I (GETTXT /CTRL WORD DCA TMP0 /B4-B11 TAD TMP0 /IS TYPE AND [377 /INDICATOR DCA REFPTR /SOMETIMES TAD REFPTR /ITS AN ESD. TAD (ESDPG /WHEN IT IS, DCA GPTR /GPTR PNTS TAD I GPTR /TO THE DCA GPTR /CORRESPONDING GST SYM (WORD 4) JMS I [SETBGX /AND BPTR POINTS TO THE VALUE TAD TMP0 /TEXT TYPE RTL /IS IN RTL /B0-B3 RAL /PUT IN AND [17 /AC8-AC11 TAD GETCTL DCA GETCTL /USE IT TO BUMP RETURN ADDRESS JMP I GETCTL PAGE /COME HERE ON ORIGIN OR WHEN CROSSING /AN AREA BOUNDARY TO SELECT A BINARY /CORE BUFFER FOR A NEW LOADER IMAGE /AREA. THE BINARY BUFFER TABLE /ASSOCIATES CORE BUFFERS TO LOADER /IMAGE AREAS. /EACH ENTRY HAS FOUR WORDS - THEY CONTAIN: /WORD 1 POINTER TO BUFFER OF NEXT EARLIEST REFERENCE /WORD 2 RELATIVE BLOCK NUMBER (0 IF UNUSED) /WORD 3 NUMBER OF BLOCKS LEFT UNTIL END OF SECTION /WORD 4 BUFFER ADDRESS AND FIELD /EACH ENTRY MAPS FROM 1 TO 4 BLOCKS (400 TO 2000 OCTAL WORDS) FROM THE /ADDRESSES GENERATED BY THE LOADER ONTO THE LOADER IMAGE FILE. /THE RELATIVE BLOCK NUMBERS ARE ALWAYS OF THE FORM S+4N, WHERE /S IS THE RELATIVE BLOCK NUMBER OF THE NEAREST BINARY SECTION / (A BINARY SECTION IS AN OVERLAY OR "MAIN"). /THE BUFFERS ARE ORGANIZED AS A CHAIN IN ORDER OF REFERENCE, /WITH WORD 1 BEING THE LINK TO THE NEXT EARLIEST BUFFER. IN CASE /A BUFFER NEEDS TO BE WRITTEN THE CHAIN IS TRAVERSED AND THE LAST BUFFER /WRITTEN OUT, SINCE IT WAS THE LEAST RECENTLY ACCESSED. NEWBB, 0 /ENTER WITH NEW TAD BP DCA NDX5 /SAVE CURRENT "MOST RECENT" BUFFER TAD I NDX5 CIA TAD NEWBLK /CHECK WHETHER THE BUFFER WE WANT SNA CLA /IS THE CURRENT BUFFER JMP QUIKIE /YES - SAVE GRIEF NEWBB4, TAD BP /MAKE THE CURNT DCA BPPREV /BUFFER THE PREVIOUS BUFF TAD I BP /MAK THE BUF OF DCA BP /NEXT EARLIEST REFERENCE THE NEW CURNT BUFF TAD BP /GET THE PTR TO IAC /LDR IMAGE BLK DCA CURBLK /IN THIS BUFF TAD I CURBLK /HAVE WE SCANNED CIA /IS NEWBLK TAD NEWBLK /IN CORE SNA CLA /? JMP GOTBLK /YES TAD I BP /ARE WE AT THE SZA CLA /BUFFER OF EARLIEST REF? JMP NEWBB4 /NO DO NEXT STL /INITIALIZE LINK AS FLAG TAD I CURBLK /IS THERE A SNA CLA /BLK TO WRITE? JMP VIRGIN /NO - NONE TO READ, EITHER AC4000 JMS I (LDRIO /YES WRITE IT CLL /SET FLAG THAT BUFFER WAS WRITTEN VIRGIN, TAD NEWBLK DCA I CURBLK ISZ CURBLK TAD NEWLEN /STORE NEW BLOCK # AND LENGTH DCA I CURBLK /IN BUFFER CONTROL WORD RAR /GET "VIRGIN FLAG" DCA NEWBUF TAD MAXBLK CMA CLL TAD NEWBLK /CHECK IF THE BLOCK WE'RE MAPPING SNL CLA /IS LARGER THAN ANY OTHER SO FAR - JMP .+3 /IF SO WE DON'T HAVE TO READ IT TAD NEWBLK DCA MAXBLK /UPDATE MAXBLK TAD NEWBUF /LINK = MAX FLAG, SIGN = VIRGIN FLAG SNL SMA CLA /IF NEITHER IS ON, JMS I (LDRIO /READ THE BLOCKS INTO THE BUFFER GOTBLK, TAD I BP DCA I BPPREV /BREAK NEW BUFFER OUT OF THE CHAIN STA TAD NDX5 /NDX5 CONTAINS PTR TO OLD "MOST RECENT" + 1 DCA I BP /MAKE NEW BUFFER THE BUFFER OF LATEST REFERENCE QUIKIE, JMS NEWBUF /SET UP FOR PUTBIN JMP I NEWBB /AND RETURN /COME HERE TO CUMPUTE A 15 BIT /BUFFER ADDRESS FROM AN ENTRY /IN THE BINARY BUFFER TABLE. NEWBUF, 0 TAD [3 TAD BP DCA OUTFLD TAD I OUTFLD /LOAD ADRESS AND FIELD AND (7600 DCA BLKBEG TAD I OUTFLD AND (70 TAD (CDF DCA OUTFLD /DECOMPOSE INTO ADDRESS AND CDF JMP I NEWBUF BPPREV, 0 MAXBLK, 0 /COME HERE TO STORE 1 WORD /IN SOME BINARY OUTPUT BUFFER PUTBIN, 0 DCA TMP2 /SAVE DATA TAD ORGFLG /N.E. 0 MEANS SZA CLA /INHIBIT JMP I PUTBIN /BINARY OUTPUT BECAUSE OF NEW ORIGIN TAD OUTINH /N.E. 0 MEANS SNA CLA /INHIBIT BIN OUT BECAUSE OF BAD ORIGIN JMP OUTFLD /ITS OK TAD I OUTINH /SET B0 OF RAL /OFFENDING GST CLL CML RAR /SYMBOL DCA I OUTINH /SEE SUBR REORG JMP I PUTBIN /FOR DEFINITION OF C(OUTINH) OUTFLD, 0 /CDF X TAD TMP2 /STORE IT DCA I BLKSIZ /AWAY CDF 10 /RESTORE FLD ISZ BLKSIZ /BUMP PTR TAD BLKBEG CIA TAD BLKSIZ /HAVE WE AND (1777 /CROSSED A SZA CLA /BLK BOUND? JMP I PUTBIN /NO TAD NEWBLK TAD [4 DCA NEWBLK TAD NEWLEN TAD [-4 DCA NEWLEN /BUMP BLOCK NUMBER AND REMAINING BLOCKS JMS NEWBB /SELECT A NEW BUFFER TAD BLKBEG DCA BLKSIZ /RE-INITIALIZE WORD POINTER JMP I PUTBIN CURBLK, 0 PAGE /COME HERE TO SCAN AND RELOCATE /THE TEXT OF AN ENTIRE MODULE TXTSCN, 0 /SET CTRL WD JMS I (GETCTL /ARGS. RTN TO .+1,2,3, OR 4 JMP RELC2 /SPECIAL TYPE JMP RELC6 /DIRECT COPY JMP REORG /NEW ORIGIN TAD I GPTR /RELOCATE FPP AND [17 /PAIR DCA TMP0 /GST SYM TYPE AC7776 /IS RELOCATION TAD TMP0 /WITH RESPECT SZA CLA /TO GST EXTERN? JMP BY2 /NO SETTRP, JMS GETTXT /BAD TEXT. CLA JMS GETTXT /IGNORE RELOCATION AND MAKE AN ERROR TRAP CLA TAD (3000 /=TRAP3 JMS I [PUTBIN TAD (JUERR /RTS ERROR JMS I [PUTBIN /TRAP SUBR BY2M5, TAD I GPTR /SET ILLEGAL RAL /REFERENCE CLL CML RAR /BIT IN DCA I GPTR /GST TYPE WD JMP TXTSCN+1 /DO NEXT BY2, TAD (-5 /RELOCATE TO TAD TMP0 /A MULTIPLE SNA CLA /ENTRY? JMP SETTRP /YES TAD I GPTR /CHECK FOR LEGALITY OF REFERENCE AND (0360 /WITH RESPECT TO LEVEL AND OVERLAY NUMBER DCA TMP1 / = GST OVER NUM TAD LNONUM /=CURNT MOD AND [3400 /LEVEL NUM DCA TMP2 TAD I GPTR AND [3400 SNA /RELOCATE TO MAIN? JMP RELC /YES, ITS OK CIA /IS RELOCATION TAD TMP2 /ACROSS LEVELS SZA /? JMP TSTTRP /YES TAD LNONUM /=CURRENT MOD AND (0360 /OVER NUM CIA TAD TMP1 /WITHIN LEVL CALL IS LEGAL ONLY SNA CLA /IF WITHIN OVR ALSO. JMP RELC /ITS OK /** TSTTRP REPLACED BY "SKP CLA" IF /U SPECIFIED TSTTRP, SMA CLA /NOT OK - IS X LEVL LO TO HI? JMP SETTRP /NO TAD I BPTR /TRAP VECT TAD [7770 /SUBTRACT 1 FROM ENTRY NUM AND [7770 /IN HIGH 9 BITS OF GST WD 5 CLL RAR /DIV BY 2 TO GET ENTRY NUM * 4 TAD TRAPV+1 /LINK IS 0 DCA I (SYMX+1 /STORE VECTOR ENTRY ADDRESS RAL TAD TRAPV /IN SYMX AS A DOUBLEWORD DCA I (SYMX TAD (SYMX JMS I [SETBPT /COMBINE IT WITH TXT PAIR JMS I (MERGE /I.E. RELOCATE TO TRAP VECT TAD FTMP0 AND [7 SNA TAD FTMP0+1 SNA CLA /WERE LOW ORDER 15 BITS OF TXT=0? JMP TXTSCN+1 /YES, ITS OK JMP BY2M5 /SET ILL REF BIT. NOTE TRAP IS NOT GENERATED RELC, JMS I (MERGE /MAKE FPP PAIR AND STORE IN BIN BUFFER JMP TXTSCN+1 /DO NEXT RELC2, TAD REFPTR /CHK IND. SNA CLA /FOR SPECIAL TYPE JMP I TXTSCN /0=END OF TEXT JMP TXTSCN+1 /1=IGNORE 1 WORD OF TEXT RELC6, TAD REFPTR /IND HOLDS CIA /NUM OF WDS DCA REFPTR /TO COPY JMS GETTXT JMS I [PUTBIN ISZ REFPTR JMP .-3 JMP TXTSCN+1 REORG, ISZ ORGFLG /SET INHIBIT BIN OUT FLG JMS I (MERGE /GET NEW ORIGIN TAD I GPTR /SEE IF AND (3760 /ORIGIN IS CIA /TO A DIFFERENT TAD LNONUM /BINARY SECTION SZA CLA /? TAD GPTR /YES - SET INHIBIT/ERROR FLAG SNA JMS I (NEWORG /NO - SET UP NEW ORIGIN DCA OUTINH DCA ORGFLG JMP TXTSCN+1 GETTXT, 0 /GET ONE WORD OF TEXT FROM THE BUFFER ISZ BLKCNT JMP RDTCDF CDF /TO READ IN JMS I [IOHAN /RALF TEXT 0 /PTR TO UNIT 200^4!10 /OR 200^17!20 0 TXTBLK, 2 TAD .-2 /SET TXT DCA RBLK /BUF PTR TAD TXTWDS /-NUM OF DCA BLKCNT /WDS-1 IN RDTCDF, CDF 10 /OR CDF 20 TAD I RBLK CDF 10 ISZ RBLK JMP I GETTXT /RETURN TXTWDS, -2000 /OR -7400 PAGE /ENTER A SYMBOL INTO GST. PTR TO ESD /SYMBOL IS IN AC JMP I PUTSYM /FOR XPAGE RTN PUTSYM, 0 JMS I [LOOK /LOOKUP SYMBOL JMP I (NOMAT /NEW SYMBOL DISPOSITION /TYPE OF MATCH 2 EXTERNS, 2 COMMONS, ETC. /ETYP HOLDS SYM TYPE FOR ESD GTYP HOLDS GST TYPE TAD (5 DCA TMP0 /FOR ME,MS TAD ETYP TAD (-7 SPA TAD (2 TAD [4 RAR CLL CMA DCA TMP2 CML CMA /GET -1 TAD GTYP /RESTR LNK, GET GST TYP-1 RAL TAD (MYSTIC /GET ADDR OF 4 CODES DCA TMP1 CDF 0 TAD I TMP1 /GET 4 CODES CDF 10 CTST, ISZ TMP2 /WHICH CODE ? JMP SHFT3 /NOT THIS 1 AND [7 TAD T2J /PICK UP JMP I DCA .+1 0 T2J, JMP I .+1 ISCOM3 /FORT COMM N FLD1 SECTION PUTSYM-1 /ESD IS EXT JUST EXIT REP /GST IS EXT GO REPLACE MULENT /MULTIPLE ENTS ISCOM /2 F COMMS OR 2 COMMZS OR 2 FLD1S BADDY /MULTIPLE SECTS BADDY /UNDEF TYPES BADDY BADDY SHFT3, RAR RTR JMP CTST BADDY, TAD MCNT TAD MBGCNT DCA MTMCNT /SAVE PARAMS FOR ERROR MESSAGE LATER CLA IAC TAD LNONUM /MULTIPLE SECTION DCA FATAL ISZ TMP0 /IS FATAL MULENT, TAD I GPTR /SET TYPE TO AND (7760 /5 FOR MUL ENT TAD TMP0 /OR 6 FOR DCA I GPTR /MUL. SECTION JMP I PUTSYM ISCOM3, TAD (11 /F COMM N FLD1 (RITE9=11) DCA I GPTR /SET TYP TO F1 ISZ F1FLG ISCOM, JMS I [SETBGX TAD BPTR /UPDATE DCA I REFPTR /ESD REFERENCE PTR JMS I (MAXCOM /PUT LARGER OF 2 COMMONS INTO JMP I PUTSYM /GST WORDS 5 AND 6 MTMCNT, 0 /THE FOLOWING TABLE IS USED TO /DISPOSITION SYMBOL MATCHES BETWEEN /A RALF ESD AND A GST SYMBOL /EACH DIGIT IN THE TABLE IS AN INDEX /INTO A TABLE THAT IS USED TO CALL /ROUTINES TO HANDLE THE VARIOUS TYPES /OF MATCHES: / 0=FORT COMMON AND FLD1 SECTION / 1=ANY MATCH WITH ESD EXTERN / 2=ANY MATCH WITH GST EXTERN / 3=MULTIPLE ENTRY POINTS / 4=2 FORT COMMONS OR 2 FIELD1 / SECTIONS OR 2 COMMZ SECTS / 5=MULTIPLE SECTIONS / 6-7=UNDEFINED AND HALT / /THE FIRST 2 WORDS COVER ALL POSSIBLE /MATCHES WITH GST TYPE 1, THE SECOND /TWO WORDS ARE FOR GST TYPE 2 ETC /THE 4 DIGITS IN THE FIRST WORD OF /ANY PAIR CORRESPOND TO ESD TYPES /11,7,3,1 RESPECTIVELY /ESD CORRESPONDENCE FOR THE 2ND WORD /IS 12,10,4,2 /ESD TYPE 12 IS UNDEFINED MYSTIC, 5553 /G1 E(11,7,3,1) 7551 /E(12,10,4,2) 2222 /G2 E(11,7,3,1) 7221 /E(12,10,4,2) 0545 /G3 7551 5555 /G4 7551 5553 /G5 7551 5555 /G6 7551 5555 /G7 7551 5555 /G10 7451 4505 /G11 7551 ESDSCN, 0 CLL STA RTL /-3 TAD I (0 SZA CLA JMP I (NOTREL /NOT RALF MODULES - NASTY! TAD I (2 /CHK FOR DP SPA CLA /HARDWARE REQUIRED ISZ DPFLG /ISZ=YES AC7776 /ENTER ESD OF MODULE DCA EPTR /INTO GST. ESD STARTS AT 10000 JMS I (NXTESD /GET NXT 1 JMP I ESDSCN /NO MORE TAD EPTR JMS PUTSYM /ENTER IT JMP .-4 /DO ANOTHER MSMSG, TEXT /MULT SECT/ CORMSG, TEXT /OVER CORE/ LIMSG, TEXT /OVER IMAG/ MNMSG, TEXT /NO MAIN/ PAGE /CONTINUATION OF SUB PUTSYM REP, DCA GTYP AC7775 /REPLACE GST TAD ETYP /EXTERN SNA /IS IT A REF TO COMMON? JMP MNSECN /YES TAD M4 /IS IT A REF SMA CLA /8 MODE SECN ? JMP NOMAT TAD I GPTR /NO CHK FOR AND [3400 /CROSS LEVEL CIA /REFERENCE DCA TMP0 /COMPARE WITH TAD LNONUM /CURNT LEVEL AND [3400 SNA /DOING MAIN ? JMP NOMAT /YES DONT CHK FOR TRAP ENTRY TAD TMP0 SNA CLA /X LEVEL? JMP NOMAT ISZ TRPCNT /YES BUMP TRAP VECTOR COUNTER AC4000 /SET B0=1, GST SYM WILL GO IN TRAP VECTOR NOMAT, DCA GTYP TAD ETYP /ENTER GST TAD (.+3-1 /WORDS 4,5,6. DCA TMP0 /DISPATCH ESD JMP I TMP0 /TYPE 1,2,3,4 JMP ENTMN2 /ENTRY POINT JMP ENTMN /EXTERN JMP MNSECN /COMMON SECN JMP PRGSCN /PROGRAM SECN M4, -4 M7, -7 JMP MNS8 /GEN 8 MODE SCT JMP MNCZ /COMM 8 MODE JMP MNF1 /FLD1 8 MODE PRGSCN, TAD LNONUM AND [3400 /IS IT A MAIN SNA CLA /? JMP MNSECN /YES TAD I [OVRSIZ DCA TMP0 TAD I [OVRSIZ+1 DCA TMP1 /SAVE OLD OVERLAY SIZE CLL TAD I EPT2 TAD TMP1 DCA I [OVRSIZ+1 RAL TAD I EPTR TAD TMP0 DCA I [OVRSIZ /SET OVLY SIZE = OVLY SIZE + SECTION SIZE TAD TMP0 DCA I EPTR TAD TMP1 DCA I EPT2 /SET SECTION SIZE = OLD OVERLAY SIZE TAD GPTR /PUT ADDR OF IAC /GST WD5 OF DCA I REFPTR /SECTION SYM INTO ESD REFERENCE PAGE ENTM2, TAD [LVPTR /SET REFERENCE DCA REFPTR /TO PARENT SYM =WD5 OF #YLVLN ENTMN, TAD LNONUM /=CURNT OVRLAY AND CURNT LEVEL NUM JMP MNSEC5 ENTMN2, TAD LNONUM /SEE IF ENTRY AND [3400 /POINT IS IN SNA CLA /MAIN? JMP ENTMN /YES TAD I REFPTR /IS PARENT JMS I [SETBPT /REFERENCE TO CLA CMA /COMMON? TAD REFPTR /LOOK FOR DCA TMP0 /TYPE CODE 3 AC7775 TAD I TMP0 SNA JMP ENTMN /YES, HANDLE LIKE A MAIN ENTRY POINT TAD M4 /IS IT A REF SNA CLA /TO AN 8 SECT? JMP MNSEC5 /YES HANDLE LIKE MAIN CLL TAD I BPT2 TAD I EPT2 DCA I EPT2 /SET OVR ENT = OVR ENT + OVR RAL TAD I BPTR AND [7 /WATCH HIGH-ORDER BITS TAD I EPTR DCA I EPTR JMP ENTM2 /SIZE OF SECTION MNF1, ISZ F1FLG /SET FOR NE TO JMP MNSECN /0 SO DO8S WILL MNCZ, ISZ CZFLG /KNOW THESE JMP MNSECN /TYPES OF SECTS MNS8, ISZ S8FLG /EXIST AND WILL FIT THEM INTO CORE MNSECN, TAD GPTR /PUT ADDR OF IAC /GST WD5 OF DCA I REFPTR /SECTION SYM INTO ESD REFERENCE PAGE TAD (SYMX+1 /THIS VALUE DCA REFPTR /YIELDS 0 IN HI 9 WD 5 OF GST SYM MNSEC5, TAD ETYP /SYM TYPE TO AC8-11. AC MAY HAVE TAD GTYP /LEVEL AND OVR BITS (AC1-7) ALREADY SET DCA I GPTR /GST WD4 HOLDS SYMBOL TYPE JMS I [SETBGX /SET BPTR TO GST WORD DCA TMP0 /PREPARE FOR DIVISION BY 7 TAD I REFPTR TAD (2-SYMTBL /GET OFFSET FROM SYMTBL TAD M7 ISZ TMP0 SMA JMP .-3 /DIVIDE BY REPEATED SUBTRACTION STA /AC IS NOT NECESSARILY ZERO! TAD TMP0 CLL RTL /ROTATE SYMBOL NUMBER INTO AC BITS 0-8 RAL TAD I EPTR /AND INSERT IT INTO THE ADDRESS DCA I BPTR /DOUBLEWORD TO FORM THE GST TAD I EPT2 /ADDRESS DOUBLEWORD DCA I BPT2 JMP I .+1 PUTSYM-1 PAGE STPAS1, DCA I NDX0 /ZERO OUT GST ISZ STCNT /NDX0 SET UP BY PASS0 JMP STPAS1 JMS I (SETCNT /SET MOD CNTS JMS I (RDRLES /READ A RALF ESD JMS I (ESDSCN /PROCESS IT JMS I (ADVOVR /UPDATE COUNTS JMP .-3 /DO NEXT TAD LIBRSW SNA CLA /LIBRARY SEARCH POSSIBLE? JMP I (DOCORE /NO - SKIP IT TAD SYMTM3 /TOP OF DCA GPTR /GST TAD RFPTR1 /1ST FREE DCA LBPTR /ENTRY IN MODULE TBL THIS IS WHERE LIBR MODULES WILL GO JMS I (GETEXT /GET AN JMP .+3 /EXTERN LOP4, JMS I (GETEXT TAD RESFLG /=1 IF DCA IOFLG /LIBR CAT IS ENTIRELY CORE RES DCA LBREC /SET I/O FOR DCA LSTBLK /BLK 0 OF LIBRARY DCA RBLK /SET REL BLK DCA RLEN /AND LENGTH JMP BY3 /TO 0 NXTENT, TAD NDX1 /ADV TO AND [-4 /NXT ENTRY TAD (2 /BUT GET DCA NDX1 /LENGTH OF JMS I (GETLEN /PREV ONE 1ST ISZ NUMENT /MORE IN CORE? JMP BY3+1 /YES TAD IOFLG /END OF SZA CLA /CATALOGUE? JMP LOP4 /YES, NO MATCH ON THIS EXTERN BY3, JMS RDLBR /GET NEXT TAD [-4 /CAT. BLKS TAD GPTR /LOOK FOR DCA NDX0 /LIBR MATCH AC7775 DCA TMP0 LBFLD, CDF 0 /CDF 20 IF GREATER THAN 8K CORE TAD I NDX1 CDF 10 CMA /IS IT THE END SNA /OF CAT ? JMP LOP4 /YES IAC TAD I NDX0 SZA CLA /MATCH 1? JMP NXTENT /NO TRY NXT LIBR ENTRY ISZ TMP0 /ALL MATCH? JMP LBFLD /NO JMS I (GETLEN /UPDATE RBLK, CLA CMA /RLEN TAD RFPTR1 /ENTER MOD DCA NDX0 /INTO TBL TAD I (MODTBL /LIBR UNIT DCA I NDX0 TAD RLEN /LENGTH OF DCA I NDX0 /MODULE TAD I (MODTBL+2 /STARTING BLOCK OF LIBRARY, + TAD RBLK / RELATIVE BLOCK OF MODULE = DCA I NDX0 / ABSOLUTE BLK OF MOD ISZ LBCNT /=NUM OF LIBR MOD IN MAIN TAD GPTR /SAVE GST DCA LSTBLK /PTR JMS I (RDRLES /READ IN ESD DCA LNONUM /SET FOR MAIN JMS I (ESDSCN /PROCESS ESD TAD [3 /ADV MODULE TAD RFPTR1 /TBL PTR DCA RFPTR1 TAD LSTBLK DCA GPTR ISZ MLEFT /MOD TBL FULL? JMP LOP4 /NO DO SOME MORE JMP I (DOCORE LIBRSW, 0 /NON-ZERO IF LIBRARY SEARCH POSSIBLE STCNT, SYMTBL-OVLTBL RDLBR, 0 TAD IOFLG /IS THIS SZA CLA /THE END JMP ENDLB /OF CAT.? CDF /NO JMS I [IOHAN /READ SOME MODTBL /MORE LBARG, 200^5 /OR 200^17!20 LB0BUF /OR 0 LBREC, 0 /REL CAT BLK TAD LBREC /GET -NUM OF CIA /BLKS READ, TAD LSTBLK /AND COMPUTE DCA TMP0 /THE NUM OF TAD (-100 /ENTRIES IN ISZ TMP0 /CORE. THERE JMP .-2 /ARE 100 PER DCA OLDCNT /BLOCK TAD LBREC /UPDATE DCA LSTBLK /LSTBLK ENDLB, TAD OLDCNT DCA NUMENT CLA CMA /SET PTR TO TAD LBARG+1 /1ST ENTRY DCA NDX1 CDF 10 JMP I RDLBR LSTBLK, 0 MLEFT, 0 RESFLG, 1 NUMENT, 0 OLDCNT, 0 PAGE /END OF PASS 1 - FIT EVERYTHING INTO CORE DOCORE, TAD TRPCNT SNA CLA JMP LOP3-3 /NO OVRS TAD (TRPSYM /ENTER TRAP JMS I [LOOK /VECT. SYM TAD [4 /ITS A DCA I GPTR /MAIN SECN ISZ GPTR /GST WD6 ISZ GPTR /HOLDS LENGTH TAD TRPCNT /GET SIZE OF RTL CLL /TRAP VECTOR DCA I GPTR /= NUMBER OF ENTRIES * 4 JMS I (DO8S /GO DO ALL 8 MODE SECTIONS TAD SYMTM3 /ALLOCATE DCA GPTR /CORE FOR LOP3, JMS I [GETTYP /ALL MAIN NON 8 MODE JMP DUNMN /SECTIONS AC7775 /4=PROG TAD I GPTR /SECN, 3=COMMON RAR CLL SNA CLA JMS I (FIT /GO FIT SECN JMP LOP3 DUNMN, STA DCA I NDX7 /TERMINATE OVERLAY LENGTH LIST TAD A1 DCA I (OVLTBL /STORE ENTRY FOR LEVEL 0 TAD A1+1 DCA I (OVLTBL+1 TAD A1+1 CLL TAD [377 AND [7400 SZL ISZ A1 /(WATCH CARRY!) DCA A1+1 /DITTO FOR NON-FIELD 0 CLA IAC /WILL HOLD DCA BLKCNT /SIZE OF LOADER IMAGE TAD (1460 /RESET INT. DCA I (LEVSYM+2 /#YLVLN SYM TAD (QUSRLV-1 /WHERE OVRLAY DCA NDX3 /DSRN INFO GOES IN LHDR CLA IAC DCA I NDX3 /USER MAIN IS LEVEL 0 TAD (10 DCA I NDX3 /SET UP LOADING INFORMATION FOR USER MAIN STA /IN THE USRLV TABLE JUST LIKE TAD A1 /ANY OTHER OVERLAY LEVEL CLL RAR TAD A1+1 /LENGTH HAS TO BE COMPUTED FROM RAL /CORE LENGTH RTL RTL DCA TMP0 CLA IAC DCA I NDX3 /USER MAIN FIRST THING IN LDR IMAGE TAD TMP0 DCA I NDX3 TAD TMP0 LOP6, TAD BLKCNT /UPDATE LENGTH DCA BLKCNT /OF LDR IMAGE ISZ I (LEVSYM+2 /NEXT LEVEL TAD (LEVSYM /LOOKUP ISZ NLVL JMS I [LOOK /#YLVLN JMP DUNLVL /DONE ALL OVR LEVELS JMS I (FIT /FIT LEVEL ISZ GPTR /IN CORE TAD I NDX3 /NUMBER OF OVERLAYS ON THIS LEVEL - ALSO CIA /SERVES AS AN INDICATOR TO THE RUN-TIME DCA TMP0 /SYSTEM THAT THIS LEVEL IS INITIALLY TAD I GPTR /UNINHABITED. AND [7 /GET FIELD BITS CLL RTL RAL ISZ GPTR TAD I GPTR /AND ADDRESS BITS DCA I NDX3 /PUT-EM OUT TAD BLKCNT /STARTING BLOCK OF LEVEL DCA I NDX3 TAD BLKSIZ DCA I NDX3 /LENGTH OF A SINGLE OVERLAY IN THE LEVEL TAD BLKSIZ /(NUM OF OVRS)* ISZ TMP0 /NUM OF BLKS JMP .-2 /AC=LENGTH OF LEVEL JMP LOP6 /DO NEXT LEVEL NLVL, 0 DUNLVL, CLA /AC NOT ZERO! TAD SYMTM3 /NOW RESOLVE DCA GPTR /ALL OTHER SYMBOLS LP1, JMS I [GETTYP JMP I (ALLDN1 /ALL DONE JMS I [SETBGX /SET BPTR TO GST WD5 TAD I BPTR AND [7770 SNA JMP LP1 /NO RELATIVE SYMBOL - DON'T RELOCATE DCA EPTR TAD EPTR /FIGURE OUT THE SYMBOL TABLE ADDRESS CLL RTR /OF THE RELATIVE SYMBOL BY STL CMA RAR /TAKING 7 * THE RELATIVE SYMBOL NUMBER TAD EPTR /IN BITS 0-8 AND ADDING IN THE BASE TAD (SYMTBL-1 /ADDRESS OF THE SYMBOL TABLE JMS I [SETEPT TAD I EPT2 CLL TAD I BPT2 DCA I BPT2 RAL TAD I BPTR AND [7 /THROW AWAY THE OLD RELATIVE SYMBOL # TAD I EPTR DCA I BPTR /AND PERFORM THE RELOCATION JMP LP1 /DO AGAIN PAGE ALLDN1, TAD A1 DCA I (QHGHAD /SAVE HIGHEST PROGRAM ADDRESS TAD A1+1 /SO THAT RTS WILL KNOW HOW MUCH ROOM DCA I (QHGHAD+1 /IT HAS FOR BUFFERS & THINGS TAD FATAL /ANY MULTIPLE SNA /SECTIONS? JMP NOMSCT /NO DCA LNONUM CDF 0 TAD I (MTMCNT DCA MBGCNT /RESTORE ERROR PARAMETERS CDF 10 JMS I [RTNOS8 MSMSG NOMSCT, TAD (SASYM /GET STRT JMS I [LOOK /ADDR MAIN SKP /NO MAIN JMP .+3 JMS I [RTNOS8 MNMSG TAD SVMAIN /IF .NE. SET TO SZA /POINT TO GST TAD GPTR /FOR PND MAIN DCA SVMAIN /FOR /S THINGS IN SYMMAP RT. CDF 0 TAD I (JOUSYM DCA I (PRMAIN /ENABLING PRINTING OF #MAIN ON ERRORS CDF 10 ISZ GPTR TAD I GPTR /MAKE SWAPPER CONTROL WORD DCA I (QRTSWP /LEVEL 0, OVERLAY 0 IS MAIN ISZ GPTR TAD I GPTR /12 BIT ADDR DCA I (QRTSWP+1 TAD DPFLG /N.E. MEANS LDR IMAGE NEEDS DP HRDWRE DCA I (QDPFLG /RETAIN INFO IN LHDR FOR PASS3 CDF 0 /FETCH LDR TAD I (LDRNAM /IMAGE JMS I [IOHAN /HANDLER TAD BLKCNT CLL RTL /SINCE WE KNOW THE LENGTH OF THE SZL SPA /LDR IMAGE FILE, TELL IT TO THE USR CLA /(UNLESS ITS >255) RTL SZL CLA TAD I (LDRNAM /OPEN LDR CIF 10 /IMAGE JMS I USR 3 LDRBLK, LDRNAM+1 LDRLEN, 0 JMP I (ENTERR TAD BLKCNT /SEE IF LDR STL /IMAGE WILL TAD LDRLEN /FIT ON SZL SNA CLA /TENTATIVE FILE JMP .+3 /IT FITS JMS I [RTNOS8 /OUTPUT FILE LIMSG /TOO SMALL TAD BLKCNT /CLOSE LDR DCA I (LDCLEN /IMAGE FILE TAD (LIMGU-1 /PASS2 DCA NDX0 TAD I (LDRNAM CDF 10 AND [17 DCA I NDX0 /UNIT TAD BLKCNT DCA I NDX0 /LENGTH TAD LDRBLK DCA I NDX0 /STRT BLK CDF 0 JMS I [IOHAN LIMGU /WRITE OUT LOADER IMAGE HEADER BLOCK 4210 LHDR 0 /IN RELATIVE BLOCK 0 OF LOADER IMAGE FILE CDF 10 /SET UP TABLE THAT RELATES /BINARY SECTINS TO LDR /IMAGE RELATIVE BLOCK NUMS. /1 DBL WD AND 2 SINGLE-WD ARGUMENTS PER /SECTION (15 BIT ADDR, RELATIVE /BLOCK, AND LENGTH). THERE ARE /8 SECTIONS /(MAIN, LEVL1,....,LEVL7) /TABLE STARTS AT LHDR AND /IS USED BY SUBR NEWORG TAD (LHDR-1 DCA NDX1 TAD (QUSRLV /NOW DO THE DCA NDX0 /8 LEVELS TAD [-10 DCA TMP0 SETSLP, TAD I NDX0 DCA BSECTP TAD BSECTP CLL RTR RAR AND [7 DCA I NDX1 /FIRST COMES 15-BIT ADDRESS TAD BSECTP AND [7400 DCA I NDX1 TAD I NDX0 DCA I NDX1 /THEN RELATIVE BLOCK NUMBER TAD I NDX0 DCA I NDX1 /THEN LENGTH ISZ NDX0 /SKIP OVER NEXT OVERLAY COUNT ISZ TMP0 JMP SETSLP TAD (LHDR /PTR TO TOP DCA BSECTP /OF TABLE CLA CMA /SET FLG DCA P2FLG /FOR SUBR ADVOVR JMP I .+1 PASS2 PAGE DO8S, 0 /DO 8 SECTIONS TAD CZFLG /ANY 8 MODE SZA CLA /COMMONS ? JMS FIT8S /GO FIT IT TAD F1FLG /ANY 8 MODE SNA CLA /FIELD 1 ? JMP .+3 /NO STA JMS FIT8S TAD S8FLG /ANY GEN 8 MODE SNA CLA /SECTIONS ? JMP I DO8S /NO ALL DONE TAD [7770 /THIS WILL DCA OVRFLO /INHIBIT FLD1 OVER FLOW ERR CLA IAC JMS FIT8S JMP I DO8S /FIT 8 MODE SECTIONS FIT8S, 0 TAD [7770 DCA STYPE /-8M0DE SECT TYPE (7-11) TAD SYMTM3 /SEARCH GST FOR DCA GPTR /8 MODE SECTNS F8SECT, JMS I [GETTYP JMP I FIT8S /ALL DONE TAD STYPE TAD I GPTR SZA CLA /8 SECTION ? JMP F8SECT /NO JMS I [SETBGX TAD I BPT2 TAD (177 /ROUND SECTION LENGTH AND (7600 /TO A PAGE BOUNDARY DCA I BPT2 JMS I (FIT /NOW FIT IT TAD OVRFLO /SEE IF FLD1 TAD A1 /IS OVR FLOWED **** SPA SNA CLA /? JMP F8SECT /DO ANOTHER TOOBIG, JMS I [RTNOS8 CORMSG /PRINT ERROR & GO AWAY STYPE, 0 FIT, 0 /FIT SECTION JMS I [SETBGX /SET BPTR TO POINT TO GST WD5 TAD I BPT2 AND [7400 CLL RAL TAD I BPTR RTL RTL /GET LENGTH OF SEGMENT IN BLOCKS DCA BLKSIZ TAD I BPT2 CLL TAD A1+1 DCA TMP5 TAD A1+1 DCA I BPT2 TAD TMP5 DCA A1+1 /SET BPTR = A1 RAL /WHILE SETTING A1 = A1 + BPTR TAD I BPTR TAD A1 DCA TMP5 TAD TMP5 AND [7770 SZA CLA /IF NEW ADDRESS IS > 77777, JMP TOOBIG /THE THING WILL NEVER FIT TAD A1 DCA I BPTR TAD TMP5 DCA A1 JMP I FIT /RETURN LEVLUP, 0 /LEVEL = MAX (LEVEL, OVRSIZ); OVRSIZ=0 TAD I [OVRSIZ TAD LNONUM DCA I NDX7 /RECORD THE SIZE OF THIS OVERLAY TAD I [OVRSIZ+1 /FOR THE SYMBOL MAP PRINTOUT DCA I NDX7 TAD [OVRSIZ JMS I [SETEPT TAD I [LVPTR JMS I [SETBPT JMS MAXCOM DCA I EPT2 DCA I EPTR JMP I LEVLUP MAXCOM, 0 /BPTR = MAX (EPTR, BPTR) TAD I EPTR CIA CLL TAD I BPTR SZA CLA /CHECK HIGH-ORDER WORDS FIRST JMP .+4 /THEY DIFFER TAD I EPT2 CIA CLL TAD I BPT2 /USE LOW ORDER WORDS IF HIGH ORDERS ARE = SZL CLA /IS EPTR > BPTR? JMP I MAXCOM /NO - EXIT TAD I EPTR DCA I BPTR TAD I EPT2 DCA I BPT2 /YES - BPTR=EPTR JMP I MAXCOM GETLEN, 0 CDF 0 /OR CDF 20 TAD I NDX1 /LEN OF ENTRY CDF 10 SNA /=0 MEANS LENGTH HAS ALREADY JMP I GETLEN /BEEN COMPUTED. NE 0 MEANS DCA TMP0 /ENTRY POINT IS THE 1ST IN A NEW MODULE TAD RLEN /UPDATE REL TAD RBLK /BLOCK AND DCA RBLK /LENGTH OF TAD TMP0 /NEW MODULE DCA RLEN JMP I GETLEN GETEXT, 0 /LOOK FOR GST JMS I [GETTYP /EXTERN JMP I (DOCORE /END OF GST TAD I GPTR /TYPE WD TO AC AND [17 /B8-B11 RTR CLL /2=EXTERN SZA CLA /GOT ONE? JMP .-6 /NO, RETRY JMP I GETEXT PAGE LB0BUF= . /START OF PROGRAM START, ISZ XSTRT /IF CHAINED TO CIF CDF 10 CLL STA RAL AND I (7643 /AND OUT THE /L SWITCH DCA I (7643 JMP I .+1 XSTRT, PASS0 /THIS SUBROUTINE SHOULD RESIDE IN THE /FIELD 0 I/O BUFFER SINCE IT /EXECUTES ONLY ONCE /SUBROUTINE TO DETERMINE CORE SIZE / /THIS WORKS ON ANY PDP-8 FAMILY COMPUTER. /THE VALUE,FROM 1 TO 10(OCTAL) OF THE 1ST NON-EXISTENT /MEMORY FLD IS RETURNED IN THE AC. / /NOTE--THIS ROUTN MUST BE PLACED IN FLD 0 / CORE, 0 TAD (6203 RDF DCA CORTN CDF 0 TAD I (7777 AND COR70 SNA JMP CORELP CLL RTR RAR JMP CORTN CORELP, CDF 0 /NEEDED FOR PDP-8L TAD TRYFLD /GET FLD TO TST CLL RTL RAL AND COR70 /MASK USEFUL BITS TAD CORELP DCA .+1 /SET UP CDF TO FLD 0 TAD I CORLOC /SAV CURRENT CONTENTS NOP /HACK FOR PDP-8 DCA .-3 TAD .-2 /7000 IS A GOOD PATTERN DCA I CORLOC COR70, 70 /HACK FOR PDP-8.,NO-OP TAD I CORLOC /TRY TO READ BK 7000 7400 /HACK FOR PDP-8,.NO-OP TAD .-1 /GUARD AGAINST WRAP AROUND TAD CORLOC+1 /TAD 1400 SZA CLA JMP .+5 /NON EXISTENT FLD EXIT TAD COR70-6 /RESTORE CONTENS DESTROYED DCA I CORLOC ISZ TRYFLD /TRY NXT HIGHER FLD JMP CORELP TAD TRYFLD TAD (-1 CORTN, 0 JMP I CORE CORLOC, COR70+2 /ADR TO TST IN EACH FLD 1400 /7000+7400+1400=0 TRYFLD, 1 /CURRENT FLD TO TST PAGE *6600 DATCHG, 0 /FIND THE MONTH/YEAR CLL RTR /THIS CODE FINDS THE MONTH RAR /BY CALCULATING THE ADDRESS AND (777 /OF THE CORRECT MONTH CLL RTR /IN THE TABLE OF MONTHS RTR AND (36 TAD (MONTHS-3 /HAVE THE ADDRESS OF MONTH-1 DCA NDX2 /SAVE IT IN FIELD 0, PAGE 0 CDF 0 /CHANGE DATA FIELD TO 0 TAD I NDX2 /GET FIRST 2 CHARS. OF MONTH CDF 10 /CHANGE DATA FIELD TO 1 DCA I (LDATE+2 /INSERT INTO THE TEXT LINE CDF 0 /CHANGE DATA FIELD TO 0 TAD I NDX2 /GET LAST 2 CHARS. OF MONTH CDF 10 /CHANGE DATA FIELD TO 1 DCA I (LDATE+3 /INSERT INTO THE TEXT LINE TAD I (OSDATE /GET THE DATE--FIND THE YEAR AND (7 /GET THE YEAR OFFSET BITS DCA I (YRTEMP /STORE THEM AWAY CDF 0 /CHANGE DATA FIELD TO 0 TAD I (7777 /GET THE DATE EXTENSION BITS CDF 10 /CHANGE DATA FIELD TO 1 AND (600 /MASK TO GET BITS 3 AND 4 CLL RTR /ROTATE TO GET THEM INTO RTR /BIT POSITIONS 7 AND 8 TAD (106 /GET THE NEW BASE YEAR TAD I (YRTEMP /ADD THE YEAR OFFSET BITS CIF 10 /CHANGE THE DATA FIELD TO 1 JMP I DATCHG /HAVE THE YEAR GETDAT, 0 TAD I (YRTEMP /GET THE YEAR AND (7700 /MASK AND ROTATE CLL RTR /TO GET THE FIRST RTR /DIGIT (IN SIXBIT) RTR TAD (5500 /STICK A HYPHEN IN FRONT DCA I (LDATE+4 /PUT IN THE TEXT LINE TAD I (YRTEMP /GET THE YEAR AGAIN AND (77 /MASK AND ROTATE TO CLL RTL /GET THE SECOND DIGIT RTL /(IN SIXBIT) RTL TAD (40 /STICK A SPACE AFTER IT CIF 10 /CHANGE INSTRUCTION FIELD TO 1 JMP I GETDAT MONTHS, 5512;0116 /-JAN 5506;0502 /-FEB 5515;0122 /-MAR 5501;2022 /-APR 5515;0131 /-MAY 5512;2516 /-JUN 5512;2514 /-JUL 5501;2507 /-AUG 5523;0520 /-SEP 5517;0324 /-OCT 5516;1726 /-NOV 5504;0503 /-DEC PAGE FIELD 1 /PAGE 0 FLD1 TAGS FOR PASS0 /(PASS 0 LIVES WITH THE USR RESIDENT) NMCTS= 20 MODCNT= 21 LVLCNT= 22 OVRCNT= 23 PTRULS= 24 MXFLD= 25 *2000 /START OF GLOBAL SYMBOL TABLE /BUCKET COMES FIRST, INTERNAL /SYMBOLS AND FIELD 1 CONSTANTS ARE /HERE ALSO. GST RUNS FROM /SYMTBL TO OVLTBL-1 BUCKET, AAAAAA;0;0;0;EEEEEE;0 /A,B,C,D,E,F 0;0;0;0;0;0 /G-L 0;0;0;0;0;0 /M-R 0;0;0;0;0;0 /S-X 0;0 /Y,Z 0;0;0;0;0 /UNUSED BUCKETS MUST BE 0 0 /SPACE (FOR BLANK COMMON) 0;0 POUND /POUND SIGN FOR INTERNAL SYMBOLS, ALL ARE OF THE FORM (POUND XXXXX) TRPSYM, TEXT '#YTRAP' 0 /TRAP VECTOR LEVSYM, TEXT '#YLVL0' 0 /OVERLAY LEVEL SWPSYM, TEXT '#SWAP' 0;0 SASYM, TEXT '#MAIN' 0;0 /STARTING ADDRESS /TITLE LINE FOR LOADER MAP TLINE, TEXT 'LOADER V' *.-1 LXX, VERNUM&70^7+VERNUM+6060 /VERNUM IN SIXBIT PATCH&77^100+40 /PATCH LEVEL LDATE, TEXT ' NO-DA -TE ' STLINE, TEXT 'SYMBOL VALUE LVL OVLY' HLINE, TEXT '= 1ST FREE LOCATION' OTLINE, TEXT 'LVL OVLY LENGTH' SMAPU, ZBLOCK 3 /SYMMAP UNIT, LENGTH, ST BLK # LIMGU, ZBLOCK 3 /LDR IMG " OVRSIZ, 0;0 LVPTR, OVRSIZ SYMX, 1;SYMTBL-2 /SYSTEM SYMBOL TABLE AAAAAA, 0 TEXT /ARGERR/ *.-1 1;0 JARGER EEEEEE, 0 TEXT /EXIT/ 1;0 JEXIT POUND, .+7 TEXT /#ARGER/ *.-1 1;0 JARGER .+7 TEXT /#BAK/ 1;0 JBAK .+7 TEXT /#DATE/ 1;0 JDATE .+7 TEXT /#DEF/ 1;0 JDEF .+7 TEXT /#DISMS/ *.-1 1;0 JDISMS .+7 TEXT /#ENDF/ 1;0 JENDF .+7 TEXT /#EOFSW/ *.-1 1;0 JEOFSW .+7 TEXT /#EXIT/ 1;0 JEXIT .+7 TEXT /#HANG/ 1;0 JHANG .+7 TEXT /#IDLE/ 1;0 JIDLE .+7 TEXT /#INT/ 1;0 JINT .+7 TEXT /#RDAO/ 1;0 JRDAO .+7 TEXT /#READO/ *.-1 1;0 JREADO .+7 TEXT /#RENDO/ *.-1 1;0 JRENDO .+7 TEXT /#RETRN/ *.-1 1;0 JRETRN .+7 TEXT /#REW/ 1;0 JREW .+7 TEXT /#RSVO/ 1;0 JRSVO .+7 TEXT /#RUO/ 1;0 JRUO .+7 TEXT /#SWAP/ 1;0 JSWAP .+7 TEXT /#T812/ 1;0 JT812 .+7 TEXT /#UE/ 0 1;0 JUERR .+7 TEXT /#WDAO/ 1;0 JWDAO .+7 TEXT /#WRITO/ *.-1 1;0 JWRITO 0 /LAST ONE TEXT /#WUO/ 1;0 JWUO SYMTBL, 0 /START OF GST /PASS0- THIS IS THE BEGINNING OF PASS0 PASS0, JMP .+4 /NORMAL ENTRY PT DCA CDSW /CHAINED TO ENTRY PT - NO DECODE 1ST TIME TAD (7616 DCA PTRIO TAD (-10 DCA LVLCNT /SET LEVEL AND OVERLAY COUNTERS DCA OVRCNT CIF 0 JMS I (CORE /DETERMINE CORE SIZE DCA MXFLD JMS I (CORMOV CDF 0 0-1 CDF 0 LB0BUF-1 /MOVE LOWER FIELD 0 TO A SAFE PLACE -2000 CDF 0 TAD I (OSJSWD /GET JOB STATUS WORD AND (376 /CLEAR DESIRED FLAGS TAD (3403 /SET NO RESTART, USR AND CD AREAS CLEAR DCA I (OSJSWD /AS WELL AS BATCH FLAG CDF 10 TAD I (OSDATE SNA JMP NODATE CLL RTR /ROTATE AND MASK TO GET THE DAY RAR AND (37 JMS MAKSXB /CONVERT TO SIXBIT DCA I (LDATE+1 /PUT THE DAY INTO THE TEXT LINE TAD I (OSDATE /GET THE DATE---FIND MONTH CIF 0 /CHANGE DATA FIELD TO 0 JMS I (DATCHG /FIND THE MONTH/YEAR JMS MAKSXB /CONVERT THE YEAR TO SIXBIT DCA YRTEMP /STORE IT AWAY CIF 0 /CHANGE INSTRUC. FIELD TO 0 JMS I (GETDAT /PRINT THE YEAR DCA I (LDATE+5 /PUT REST OF YEAR IN TEXT LINE /SET UP OTHER POINTERS TO MODULE TABLES NODATE, TAD (-NUMMOD DCA I (MCTTBL TAD (MCTTBL+1 DCA NMCTS /INITIALIZE MODULE CT TBL PTR TAD (MODTBL+2 DCA PTRULS /INITIALIZE MODULE TBL PTR DCA MODCNT DCA I (MODTBL /CLEAR LIBRARY UNIT DCA I NMCTS /CLEAR FOR 1ST LEVEL MODULE COUNTS CDSW, JMP I (RALFLP /ZEROED IF CHAINED TO JMP I (DECO MAKSXB, 0 DCA TMP0 DCA TMP1 TAD TMP0 TAD (-12 ISZ TMP1 SMA JMP .-3 /SUBTRACT 10 IN A LOOP TAD (5772 /AS GOOD A NUMBER AS ANY DCA TMP0 TAD TMP1 CLL RTL RTL RTL /GET THE TENS DIGIT INTO POSITION TAD TMP0 JMP I MAKSXB YRTEMP, 0 PAGE /DECODE COMMAND DECODER INPUT RALFLP, JMS I (200 5 /COMMAND DECODE 2214 /.RL DEFAULT EXTENSION TAD (7616 DCA PTRIO TAD I (OS8SWS+1 AND (40 CDF 0 SZA CLA /IS /S SWITCH ON? DCA I (SVMAIN+LB0BUF /CLEAR (RELOCATED) SVMAIN DECO, CDF 10 /FOR FULL SYMBOL MAP LISTING TAD I (7600 /CHK FOR LOADER IMAGE FILE SNA /OUTPUT FILE? JMP SM /NO AND (0017 /MUST BE AN "MS" DEV TAD (OS8DCB-1 DCA TMP0 TAD I TMP0 SPA CLA /IS IT? JMP .+4 /YES SM1, TAD (DEVERR /NO,ERR JMS I (ERORR JMP RALFLP TAD I P7604 SNA TAD (1404 /.LD DCA I P7604 /INTO EXTENSION IF NONE SPECIFIED JMS I (CORMOV /MOVE LOADER IMAGE FILE NAME CDF 10 7600-1 CDF 0 /INTO FIELD 0 LDRNAM+LB0BUF-1 -5 SM, TAD I (7605 /CHK FOR SYM MAP FILE SNA JMP SM2 /NONE AND (17 TAD (OS8DCB-1 DCA TMP0 TAD I TMP0 RAL /LOOK AT "READ ONLY" BIT IN DCB SPA CLA JMP SM1 /ERROR - NO GOOD FOR OUTPUT TAD I (7611 SNA TAD (1423 /.LS DEFAULT MAP EXTENSION DCA I (7611 JMS I (CORMOV /MOVE SYMMAP FILE NAME INTO FIELD 0 CDF 10 P7604, 7605-1 CDF 0 LDRNAM+LB0BUF+4 -5 /COLLECT INPUT FILES SM2, TAD I (OS8SWS CLL RAR SZL CLA / IS /L SWITCH ON? JMP LIBRAR /YES - THIS IS A LIBRARY FILE FILELP, TAD I PTRIO SNA JMP FINLIN /NO MORE INPUT FILES DCA TMP0 TAD TMP0 AND (17 ISZ PTRULS DCA I PTRULS /STORE UNIT NUMBER TAD TMP0 AND (7760 CLL RTR RTR TAD (7400 CIA ISZ PTRULS DCA I PTRULS /STORE LENGTH TAD I PTRIO ISZ PTRULS DCA I PTRULS /STORE STARTING BLOCK NUMBER ISZ MODCNT JMP FILELP /CONTINUE FINLIN, JMS I (CORDSW /CHECK C AND O SWITCHES TAD I (OS8SWS AND (40 SZA CLA /IF THE /G SWITCH IS ON JMP I (EOPAS0 /ITS THE END TAD I (OS8SWS-1 SPA CLA /IF AN ALTMODE TERMINATED THE LINE, JMP I (EOPAS0 /DITTO TAD (-MCTTBL-1 TAD NMCTS SZA CLA /ARE WE STILL IN THE MAIN SECTION? JMS I (UPDMOD /NO - UPDATE OVERLAY & MODULE COUNTS JMP RALFLP LIBRAR, TAD I PTRIO AND (17 DCA I (MODTBL /STORE LIBRARY PARAMETERS TAD I PTRIO /NEGLECTING LENGTH, WHICH WILL DCA I (MODTBL+2 /BE FILLED IN LATER TAD I PTRIO SNA CLA JMP FINLIN /ONLY ONE FILE ALLOWED ON THE LINE TAD (MIERR JMP SM1+1 /OTHERWISE ITS MIXED INPUT PAGE /UPDMOD- UPDATE MODULE COUNT TBL UPDMOD,0 CLL TAD MODCNT /UPDATE -NUM OF TAD I (MCTTBL /UNUSED MODULES DCA I (MCTTBL SZL JMP MAXRLF /MAX NUMBER EXCEEDED ISZ OVRCNT /BUMP OVERLAY NUMBER SKPCLA, SKP CLA JMP MAXOVL /MORE THAN 16 OVERLAYS IN A LEVEL TAD MODCNT /UPDATE +NUM OF TAD I NMCTS /MODULES IN LAST LEVEL SNA /**** JMP I UPDMOD DCA I NMCTS ISZ NMCTS /ADV PTR TO NXT LOC DCA I NMCTS /ZERO THE NXT LOC IN PREPARATION DCA MODCNT /CLR CNT FOR NXT LEVEL JMP I UPDMOD /CORDSW- LOOK FOR SWS C AND O CORDSW, 0 TAD I (OS8SWS+1 AND (10 SNA CLA /CHECK FOR /U SWITCH JMP CHKCSW CDF 0 TAD SKPCLA /INHIBIT LEVEL CHECKING DCA I (TSTTRP CDF 10 CHKCSW, TAD I (OS8SWS RTL SPA CLA JMP I (RALFLP TAD I (OS8SWS+1 RTL SMA CLA JMP I CORDSW /O-SWITCH JMS UPDMOD ISZ NMCTS /ADV PTR FOR NXT GUY DCA I NMCTS /CLR FOR NXT LEVEL MOD CNT TAD (-21 DCA OVRCNT ISZ LVLCNT /BUMP LEVEL COUNTER JMP I (RALFLP TAD (MXLERR JMP MAXRLF+1 /TOO MANY LEVELS MAXRLF, TAD (MXRERR JMS ERORR CDF CIF 0 JMP I (7605 MAXOVL, TAD (MXOERR JMP MAXRLF+1 /ERORR- PRINTS OUT ERROR MESSAGES OF A / BUFR LOCATED IN FLD1 / ENTER WITN ADR OF BUFR IN AC / ERORR, 0 DCA BFADR CDF 10 /CALL TTYHAN JMS I (CORMOV CDF 0 LB0BUF-1 /MOVE LOWER FIELD 0 BACK CDF 0 /SO WE CAN USE THE MESSAGE HANDLER 0-1 -2000 CIF 0 JMS I (TTYHAN CDF 10 BFADR, 0 JMP I ERORR MIERR, TEXT /MIXED INPUT/ DEVERR, TEXT /BAD OUTPUT DEVICE/ MXRERR, TEXT /TOO MANY RALF FILES/ MXLERR, TEXT /TOO MANY LEVELS/ MXOERR, TEXT /TOO MANY OVERLAYS/ PAGE /PASS1, PASS2 INITIALIZATION EOPAS0, JMS I (UPDMOD /BUMP COUNTS FOR LAST LINE OF INPUT ISZ NMCTS DCA I NMCTS /PUT IN A DOUBLE ZERO AT THE END JMS I (CORMOV CDF 0 LB0BUF-1 CDF 0 0-1 /MOVE LOWER FIELD 0 BACK INTO PLACE -2000 TAD I (MODTBL SZA CLA /USER-SPECIFIED LIBRARY? JMP RDLIBH /YES CLA IAC JMS I (200 2 /LOOKUP LIBRY 0 JMP NOLIB /FORLIB.RL NOT FOUND TAD .-3 /GET STARTING BLOCK DCA I (MODTBL+2 CLA IAC DCA I (MODTBL /STORE UNIT AND BLOCK # RDLIBH, STL RTR DCA I (MODTBL+1 /JUST TO BE CAREFUL CIF 0 JMS I (IOHAN /READ BLOCK 0 OF THE LIBRARY CATALOG MODTBL 0210 PLB, RALFBF 0 STA TAD I PLB SNA CLA /IS IT AN HONEST - TO - GOD LIBRARY? JMP .+4 /YES NOLIB, DCA I (MODTBL DCA I (MODTBL+2 DCA I (RALFBF+3 /ZERO COUNT WORD IN BUFFER TAD I (RALFBF+3 DCA I (MODTBL+1 /STORE LENGTH OF CATALOGUE TAD (LHDR-1 DCA NDX0 TAD (-400 DCA TMP0 DCA I NDX0 /0 OUT ISZ TMP0 /LDR HDR JMP .-2 /GET PAGE 0 /PASS1 INITIALIZATION CONTINUED TAD I (MCTTBL /UNUSED DCA TMP2 /MODULES TAD (MCTTBL+2 /GET NUMBER OF OVERLAYS DCA NDX0 / IN EACH LEVEL TAD (QUSRLV+4 /WHERE THE DCA TMP0 /CNTS GO IN JMP BY0 /LDR HDR BLK LOP0, ISZ I TMP0 /INCREMENT NUMBER OF OVERLAYS IN THIS LEVEL TAD I NDX0 SZA CLA /END OF LEVEL? JMP LOP0 /NO TAD (4 /THIS LEVEL TAD TMP0 DCA TMP0 BY0, DCA I TMP0 /RESET CNT TAD I NDX0 /0,0 ENDS SZA CLA /MOD CNT TBL JMP LOP0 /DO MORE PTR TO TAD I (MODTBL+1 /GET LENGTH OF LIBRARY CATALOG DCA TMP4 /BLOCKS TAD TMP2 /CHK FOR MAX SZA CLA /NUM OF RALFS 0=MOD TBL IS FULL TAD I (MODTBL /CHK FOR NO CDF DCA I (LIBRSW /LIBRARY AND SET SWITCH ACCORDINGLY TAD TMP2 /-NUM LEFT DCA I (MLEFT /OF RALF MODS TAD (SYMTBL-1 /PTR TO TOP DCA I (NDX4 /OF GST TAD I (OSJSWD AND (7377 /KILL "BATCH PROTECTED" FLAG DCA I (OSJSWD AC7776 /IS THERE TAD MXFLD /GREATER THAN 12K OF CORE SPA SNA CLA /? JMP LS16K /NO TAD (200^12!30 /SET TXT I/O DCA I (TXTBLK-2 /BUFFS UP IN FLD 3 TAD (-5000 /-WDCNT (12 DCA I (TXTWDS /BLKS) TAD (6231 /CDF 30 DCA I (RDTCDF LS16K, TAD (7700 /USR IS NOT DCA I (USR /IN CORE CDF 10 JMP I (INIBFS LIBRY, 0617;2214;1102;2214 /FORLIB.RL PAGE /THIS IS THE INITIAL BINARY BUFFER TABLE R= LDBUFS-BUFTAB BUFTAB, .+4+R; 0; 0; 3200 /03200-05177 B8KPT, .+4+R; 0; 0; 5200 /05200-07177 .+4+R; 0; 0; 0020 /20000-21777 B12KPT, .+4+R; 0; 0; 2020 /22000-23777 B16KPT, .+4+R; 0; 0; 4020 /24000-25777 .+4+R; 0; 0; 0040 /40000-41777 B20KPT, .+4+R; 0; 0; 2040 /42000-43777 .+4+R; 0; 0; 4040 /44000-45777 .+4+R; 0; 0; 0050 /5000-51777 0; 0; 0; 2050 /52000-53777 INIBFS, TAD MXFLD TAD (JMP STBPTR-1 DCA .+1 HLT /DISPATCH ON NUMBER OF FIELDS STBPTR, DCA B8KPT DCA B12KPT DCA B16KPT DCA B20KPT NOP NOP /NOT SET UP TO USE MORE THAN 24K NOP JMS I (CORMOV CDF 10 BUFTAB-1 /MOVE THE BINARY BUFFER TABLE CDF 10 LDBUFS-1 /INTO A SAFE PLACE -50 CDF 0 TAD LVLCNT /SET -NUM OF TAD (11 /LEVELS CIA DCA I (NLVL TAD (-5 /NUM OF LIBR DCA TMP2 /BLKS FOR 8K CLA CMA TAD MXFLD SNA CLA /GREATER THAN 8K CORE? JMP TO8K /NO SET LIBR ARGS DCA I (LBARG+1 TAD (200^12!20 /12 BLKS FLD2 DCA I (LBARG TAD (6221 /CDF 20 DCA I (LBFLD TAD (6221 DCA I (GETLEN+1 TAD (-12 DCA TMP2 TO8K, TAD TMP2 /WILL LIBR TAD TMP4 /BE CORE SMA SZA CLA /RESIDENT? DCA I (RESFLG /NO TAD (SYMTBL-1 DCA I (NDX0 CDF 10 TAD (ESDPG-1 /ENTER DEFAULT DCA NDX0 /VALUES FOR TAD (-200 /ESD REF PAGE DCA TMP0 /IT SAVES TAD (SYMTBL+5 /PROBLEMS WITH DCA I NDX0 /EXTERNS ISZ TMP0 JMP .-3 CLA STL RTL DCA I (LHDR /STORE LOADER IMAGE CODE IN HEADER TAD (VERNUM DCA I (QVERNO /STORE LOADER VERSION NUMBER CIF 0 JMP I (STPAS1 PAGE /CORMOV- A CORE MOVE FOR A CHUNK OF CORE IN / ANY FLD TO ANY FLD. / / CALL JMS CORMOV / CDF Z1 /Z1=FROM FLD / ADDR1 /ADDR OF (1ST LOC-1) / CDF Z2 /Z2=TO FLD / ADDR2 /ADDR OF (1ST LOC-1) / -N /-OCT NUM OF WDS TO MOV / CORMOV, 0 CLA CMA TAD CORMOV DCA NDX0 TAD I NDX0 DCA TOCDF-2 TAD I NDX0 DCA NDX1 TAD I NDX0 DCA TOCDF TAD I NDX0 DCA NDX2 TAD I NDX0 DCA TMP0 0 TAD I NDX1 TOCDF, 0 DCA I NDX2 ISZ TMP0 JMP TOCDF-2 CDF 10 JMP I NDX0 /RTN $$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 | /3 OS/8 FORTRAN (PASS TWO) / / VERSION 4A PT 16-MAY-77 / / OS/8 FORTRAN COMPILER - PASS 2 / / BY: HANK MAURER / UPDATED BY: R. LARY + M. HURLEY / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / VERSON=4 /SEE F4.PA FOR LIST OF MAINTENANCE RELEASE CHANGES -S.R. /ALSO, ADDED SAFETY CDF 0 TO BUMP ROUTINE TO FIX BUG /MASSAGED LINK IN THAT AREA TO GET ROOM /ALSO, / FIXED BUG RE DN ERROR PRINTING WRONG LINE NUMBER / / /CHANGES FOR OS/8 V3D AND OS/78 BY P.T. /.PATCH LEVEL FOR PASS2 IS IN LOCATION 327 IFNDEF OVERLY <OVERLY=0> IFNZRO OVERLY <NOPUNCH> *2 /V3C TEM, 1 /V3C LINENO, 1 /LINE NUMBER VERS, -VERSON /VERSION NUMBER ERRPTR, 5001 /POINTER TO THE ERROR LIST FILDEV, 0 /THIS IS THE FILE DESCRIPTOR FILBLK, 0 /FOR RALF X10, COMREG-1 /INTER PASS COM REGION X11, 0 X12, 0 X13, 0 X14, 0 X15, 0 X16, 0 X17, 0 /AUTO INDEX REGISTERS ENTRY, 0 /THINGS USED BY SYMBOL /TABLE FIDDLER OENTRY, 0 BUCKET, 0 TYPE, 0 TEMP, 0 /GENERAL TEMPS TEMP2, 0 ARG1, 0 /ARGS AND TYPES BASE1, 0 TYPE1, 0 ARG2, 0 BASE2, 0 TYPE2, 0 TMPCNT, 1 /TEMP COUNT TMPMAX, 0 /MAX TEMP COUNT LITNUM, 0 /LITERAL DISPLACEMENT TMPBLK=2 OUBUF=4400 COMREG=4600 STACK1=4700 OVRLAY=5000 NPOVLY=700 XRBUFR=6600 STACK=7000 /STACK-5 CAN'T BE 0 INBUF=7200 NPPAS3=1600 ARG, 0 /TEMP FOR CODE AC, 0 /AC FOR MULTIPLY ROUTINE XR, 0 /XR CHAR FOR OADDR MQ, 0 /MQ FOR MULTIPLY ROUTINE XRNUM, 0 /TEMP USED IN XR STUFF WHATAC, 0 /POINTER TO VAR WHATBS, 0 /JUST STORED FREEXR, 0 /NUMBER OF FREE /INDEX REG DIMPTR, 0 /POINTER TO DIM INFO /AFTER GETSS NARGS, 0 /ARG COUNT FOR SS VAR /COMPILE GLABEL, 1 /GENERATED LABEL COUNTER STKLVL, STACK /STACK LEVEL (CHANGED /BY DO) COMMA, 254 /, PLUS, 253 /+ IFLABL, 0 /HOLDS LABEL FOR LOG IF DOTEMP, 7000 /DO LOOP TEMP COUNTER BINARY, 0 /BINARY IO=1, FORMATTED=0 INPUT, 0 /INPUT=1 OUTPUT=0 FOR IO STMTS PROGNM, 0 /POINTER TO PROG/FUNC NAME FUNCTN, 0 /0=MAIN, 1=FUNC, -2=SUBR ARGLST, 0 /POINTER TO ARG LIST DATASW, 0 /=1 IF THIS IS A DATA STMT GCTEMP, 0 /TEMP USED BY GENCAL EXTLIT, 0 /EXTERNAL LITERALS LIST ELCNT, 0 /AND COUNT IOLOOP, 0 /IO LOOP SWITCH ARGIO, 0 /ARG IO SWITCH F1LNAM, 0617;2224;2216;2415 /FILE NAME FORTRN.TM DEVH, 7607 /DEVICE HANDLER ADDRESS ACSWIT, 0 /IS NON ZERO IF CALLING AN ARG IOSTMT, 0 /SET 1 IF IN IO STMT /(FOR IMPLIED LOOPS) FMODE, 1 /1 IF IN F OR D MODE (0 IF E) ASFSWT, 0 /1 IF ASF PROLOG, -1 IF /ASF END, 0 OTHER JSRLBL, 0 /LABEL NUMBER FOR CALLS TO ARGS DPUSED, 0 /=1 IF DP HARDWARE USED QM4, -4 Q260, 260 QTTYOU, TTYOUT QERMSG, ERMSG QNEXT, NEXT QNEXTM, NEXT-2 QUCODE, UCODE QCODE, CODE QINWOR, INWORD QONUMB, ONUMBR QSAVEA, SAVEAC Q6M3, Q5, 5 QGENCO, GENCOD QM6, -6 QOPCOD, OPCOD QOPCDE, OPCODE QOADDR, OADDR Q17, 17 QTTYMS, TTYMSG QXRTBL, XRTABL QCHKXR, CHEKXR QGENSF, GENSTF QGENSE, GENSTE QOSNUM, OSNUM QCRLF, CRLF QOTAB, OTAB QOUTSY, OUTSYM QGARG, GARG Q20, 20 Q40, 40 QOUTNA, OUTNAM QLITRL, LITRL Q200, 200 Q255, 255 Q3, 3 QOLABE, OLABEL QGETSS, GETSS Q256, 256 QSAVAC, SAVACT QSKPIR, SKPIRL QGENCA, GENCAL QLOADA, LOADA QMUL12, MUL12 QGARGS, GARGS QOINS, OINS QOCHAR, OCHAR QNUMBR, NUMBRO QXRBUF, XRBUFR QTTYP2, TTYP2C QTTCRL, TTCRLF QM63, -63 Q7605, 7605 RELCD, 0 QLABEL, NLABEL P0F1, 5274 /101-2605 P0F2, VERROR / OUTPUT UTILTIY ROUTINES PAGE OCNT, CRLF, 0 /OUTPUT CR LF TAD (215 JMS I QOCHAR TAD (212 JMS I QOCHAR TAD (200 KRS TAD (-203 SNA CLA KSF /CHECK FOR ^C JMP I CRLF JMP I (7605 NCHAR, OSNUM, 0 /PRINT STMT NUMBER IAC /SKIP POINTER WORD DCA NAMPTR TAD (6211 /ALWAYS IN FIELD 1 DCA NAMCDF TAD OSNUM /SAVE ENTRY POINT DCA OUTNAM TAD (243 /GET FIRST CHAR (ALWAYS #) JMP L6201 /GO PRINT NAME TTCHAR, OUTSYM, 0 /PRINT OPCODE DCA NAMPTR /SAVE POINTER TO STUFF TAD L6201 /ALWAYS FIELD 0 DCA NAMCDF TAD OUTSYM /SAVE ENTRY DCA OUTNAM JMP NAMCDF /PRINT REST ONUMT, OUTNAM, 0 /OUTPUT NAME DCA NAMPTR /SAVE ADDRESS OF NAME RDF /GET FIELD OF NAME TAD L6201 DCA NAMCDF /SAVE AS CDF TAD I NAMPTR /GET FIRST CHAR (ALREADY ASCII) ISZ NAMPTR /SKIP OVER TYPE AND DIM PTR ISZ NAMPTR L6201, CDF JMS I QOCHAR /OUTPUT CHAR ISZ NAMPTR NAMCDF, 0 TAD I NAMPTR /GET NEXT TWO CHARS CDF SNA /IS NAME DONE ? JMP I OUTNAM /YES DCA NCHAR /SAVE TWO CHARS TAD NCHAR RTR /GET UPPER CHAR RTR RTR TAD (240 AND (77 TAD (240 JMS I QOCHAR /OUTPUT IT TAD NCHAR /NOW DO LOWER AND (77 SNA JMP I OUTNAM /NAME DONE TAD (240 AND (77 TAD (240 JMP L6201+1 /GO AND OUTPUT IT ONUMBR, 0 /OUTPUT OCTAL NUMBER DCA ONUMT /SAVE TEMPORARILY TAD QM4 /4 DIGITS DCA OCNT OLOOP, TAD ONUMT CLL RTL RAL DCA ONUMT TAD ONUMT RAL AND (7 TAD Q260 JMS I QOCHAR ISZ OCNT JMP OLOOP JMP I ONUMBR TTYP2C, 0 /PRINT 2 CHARS ON THE TTY DCA TTCHAR TAD TTCHAR RTR RTR RTR JMS CONVRT TAD TTCHAR JMS CONVRT JMP I TTYP2C NAMPTR, CONVRT, 6401 /CONVERT TO ASCII AND (77 SZA TAD (240 AND (77 TAD (240 JMS I QTTYOUT JMP I CONVRT TTCRLF, 0 TAD (215 JMS I QTTYOUT TAD (212 JMS I QTTYOUT JMP I TTCRLF TTYMSG, 0 /PRINT 2 CHAR ERROR MESSAGE CDF TAD I TTYMSG ISZ TTYMSG /PRINT ERROR MESSAGE JMS I QERMSG FATAL, JMP I QNEXT /FATAL ERROR MESSAGE TAD I FATAL JMS I QERMSG JMP I Q7605 /RETURN TO PS8 DP2C1, TEXT '.+2,1' NEG, JMS I QUCODE /NEGATE CODE NEGTBL-1 JMP I QNEXT PAGE / OPCODE JUMP TABLE TAD TEMP2 SKP /CODE ALREADY READ NEXT, JMS I QINWORD /GET NEXT INPUT WORD TAD (XPUSH /INDEX INTO JUMP TABLE DCA TEMP2 CDF 10 TAD I TEMP2 CDF 0 DCA TEMP2 /GET JUMP ADDRESS JMP I TEMP2 /GO THERE /OPTIMIZING RELATIONAL CODE FOR OS/8 F4 /COMPLIMENTS OF R.L. LE, STL RTL /2 LT, TAD QM4 /GENERATE -4 FOR LT, -2 FOR LE JMP GE+1 /GO TO COMMON RELATIONAL CODE GT, STL RTL GE, IAC /GENERATE 1 FOR GE, 3 FOR GT DCA RELCD /ALL THIS FUNNY STUFF IS BECAUSE SOME JMS I QCODE /OF THE RELATIONAL SKELETONS OPTIMIZE BY LETABL-6;5 /PERFORMING THE RELATIONAL ON THE NEGATIVE TAD RELCD /OF THE FAC - WHEN THIS HAPPENS SPECIAL SPA /CODE IN THE SKELETON DOES AN "ISZ RELCD", CIA /CHANGING ABS(RELCD) TO ITS OPPOSITE RELATIONAL JMP RELGEN /E.G. GE(1) TO LE(2), LE(-2) TO GE(-1) EQ, CLA IAC /SINCE EQ AND NE ARE SIGN-INDEPENDENT, NE, DCA RELCD /WE DON'T NEED THAT KLUDGE BUT FOR COMPATIBILITY JMS I QCODE /WITH RTPS THE OS/8 FORTRAN SYSTEM FUNCTION EQTABL-6;5 /"#CEQ" WORKS THE WRONG WAY - IT PRODUCES CLA IAC /A 1.0 IF THE COMPLEX AC WAS (0.,0.) AND RELCD /AND A 0.0 OTHERWISE - SO WE HAVE TO REVERSE SZA CLA /THE SENSE OF COMPLEX .EQ. AND .NE. RELATIONS. RELGM1, TAD Q5 RELGEN, DCA RELCD /STORE "FINAL" RELCD JMS I QINWORD /GENTLY PROBE AHEAD IN THE INPUT DCA TEMP2 TAD TEMP2 TAD (XPUSH-XLOGIF SNA CLA /IF THIS WAS THE TOP RELATION OF A LOGICAL IF, JMP LIFOPT /WE'RE IN A POSITION TO OPTIMIZE TAD RELCD /OTHERWISE OUTPUT A CALL TO THE CLL RAL /ROUTINE CORRESPONDING TO THE RELATIONAL TAD (LTRNE DCA .+3 CLA IAC JMS I (OJSR /GENERATE A JSA #XX 0 JMP I QNEXTM2 /PROCESS THE WHATCHIMACALLIT LIFOPT, TAD TYPE1 /SEE IF WE SHOULD GENERATE A "STARTF" FIRST AND Q17 /ONLY WORRY ABOUT D.P. TAD QM4 /SINCE THE ROUTINE #CEQ DOES A STARTF DCA FMODE /FMODE=0 ONLY IF ARGS WERE D.P. JMS I QGENSF /GENERATE STARTF IF NECESSARY JMP I .+1 LIFBGN+1 /GO TO LOGICAL IF PROCESSOR EQV, JMS I QCODE /.EQV. LOGICAL OPERATOR EQVTBL-6;0 JMP RELGM1 / PASS TWO OUTPUT ROUTINE OCHAR, 0 /OUTPUT A CHAR TO THE /RALF INPUT FILE AND (377 DCA OUTEMP /SAVE CHAR ISZ OUJUMP /BUMP THREE WAY SWITCH OUJUMP, JMP . JMP CHAR1 JMP CHAR2 TAD OUTEMP /HIGH FOUR BITS GO INTO CLL RTL /THE HIGH ORDER BITS OF THE RTL /FIRST WORD OF THE TWO WORD PAIR AND (7400 /SEE NOTE * BELOW TAD I OUPOLD /COMBINE WITH OTHER BITS DCA I OUPOLD TAD OUTEMP /THE OTHER FOUR BITS OF THIS CHAR CLL RTR /GO INTO THE HIGH ORDER FOUR RTR /BITS OF THE SECOND /WORD OF THE PAIR RAR AND (7400 TAD I OUPTR DCA I OUPTR TAD OUJMP /RESET 3 WAY BRANCH DCA OUJUMP ISZ OUPTR /BUMP BUFFER POINTER ISZ OUWDCT /AND DOUBLE WORD COUNTER JMP I OCHAR /BUFFER NOT FULL JMS OUDUMP /DUMP IT JMP I OCHAR CHAR2, TAD OUPTR /SAVE FIRST WORD POINTER DCA OUPOLD ISZ OUPTR /GO TO SECOND WORD CHAR1, TAD OUTEMP /STORE CHAR 1 OR 2 DCA I OUPTR JMP I OCHAR OUTEMP, OUDUMP, 0 /BUMP THE DUFFER TAD OSIZE /ANY ROOM LEFT ? SNA JMP OUERR IAC DCA OSIZE /YES, ITS OK JMS I DEVH /WRITE 4200 /CONTROL WORD OUBUF /BUFFER POINTER OBLOCK, 0 /BLOCK NUMBER JMP OUERR /ERROR ISZ OBLOCK /INCREMENT BLOCK NUMBER ISZ FILSIZ /AND FILE SIZE TAD OBLOCK-1 /SET BUFFER POINTER DCA OUPTR TAD (-200 /SET DOUBLE WORD COUNT DCA OUWDCT JMP I OUDUMP OUERR, JMS I (FATAL /FATAL OUTPUT ERROR 1706 / * THE PONY EXPRESS STARTED IN 1860 AND ONLY RAN / FOR 19 MONTHS WHILE LOSING $200,000. OUPOLD, 0 OUPTR, OUBUF OUJMP, JMP OUJUMP OUWDCT, -200 OSIZE, 0 DD1, TEXT '1' PAGE / READ FROM FORTRN.TM INWORD, 0 /READ A WORD FROM INPUT FILE ISZ INBCNT /ANYTHING LEFT IN BUFFER ? JMP NOREAD /YES ISZ INRCNT /ANYTHING LEFT IN FILE? SKP JMP I (END /NO, END OF PROG JMS I DEVH /READ NEXT BLOCK X200, 0200 INBUF INBLOK, 0 JMP INERR /INPUT ERROR ISZ INBLOK /BUMP BLOCK NUMBER TAD (-400 /RESET COUNTER DCA INBCNT TAD INBLOK-1 /RESET POINTER DCA INBPTR NOREAD, TAD I INBPTR /GET WORD FROM BUFFER ISZ INBPTR /BUMP BUFFER POINTER JMP I INWORD INERR, JMS I (FATAL /FATAL INPUT ERROR 1105 INBCNT, -1 /FORCE READ FIRST TIME INBPTR, 0 INRCNT, 0 / CODE UTILITIES GETSS, 0 /GET POINTER TO DIM INFO CDF 10 IAC DCA DIMPTR /ADDR OF TYPE WORD TAD I DIMPTR ISZ DIMPTR /MOVE TO DIM/EQUIV POINTER AND X200 /EQUIV INFO ? SNA CLA JMP .+3 /NONE TAD I DIMPTR /SKIP EQUIV INFO DCA DIMPTR TAD I DIMPTR /ADDRESS OF DIM INFO JMP I GETSS NUMBRO, 0 /OUTPUT 15 BIT OCTAL NUMBER TAD AC /IS HIGH DIGIT 0 ? SNA JMP .+3 /YES, PRINT 4 DIGITS ONLY TAD Q260 /MAKE IT ASCII JMS I QOCHAR /PUT IT TAD MQ /NOW LOW FOUR DIGITS JMS I QONUMBR JMP I NUMBRO UCODE, 0 /GEN CODE FOR UNARY OPERATORS JMS I QSAVEAC /SAVE AC IF NEEDED JMS GARG JMP OTERR /OPERATOR/TYPE ERROR TAD ARG1 /IS ARG IN AC ? SNA CLA TAD Q5 /YES, USE SECOND HALF OF TABLE TAD TYPE1 TAD I UCODE /PLUS TABLE ADDRESS DCA USKEL CDF 10 TAD I USKEL /ADDR OF SKELETON SNA JMP OTERR /0 MEANS BAD /OPERATOR/TYPE COMBO DCA USKEL /SAVE SKELETON ADDR JMS I QGENCOD /GO DO THE CODE USKEL, 0 DCA I X16 /RESULT IN AC ISZ X16 /BUMP STACK POINTER ISZ X16 /TYPE IS ALREADY THERE ISZ UCODE /FIX RET ADDR JMP I UCODE GARG, 0 /GET ONE ARG CLL CMA RTL /BACK UP ONE ENTRY TAD X16 DCA X16 TAD X16 /USABLE POINTER DCA X15 TAD I X15 /GET OPERAND DCA ARG1 TAD I X15 DCA TYPE1 TAD I X15 DCA BASE1 TAD TYPE1 /CHECK TYPE TAD QM6 SMA CLA JMP I GARG /TAKE ERROR EXIT ISZ ARG2 /MAKE SURE ARG2 ISN'T ZERO JMS I (MPTRA1 /MOVE THE POINTER IF /THERE IS ONE ISZ GARG JMP I GARG TTYOUT, 0 /OUTPUT TO THE TTY TLS TSF JMP .-1 CLA KSF JMP I TTYOUT /NO KEYBOARD FLAG KRB AND (177 /ACCEPT PARITY ASCII TAD (-3 /^C ? SNA JMP I Q7605 /YES, BACK TO PS8 TAD (3-17 /^O ? SZA CLA JMP I TTYOUT /NO, RETURN DCA TTYOUT+1 /KILL OUTPUT STUFF DCA TTYOUT+2 DCA TTYOUT+3 JMP I TTYOUT /RETURN LTRNE, TEXT '#NE' TEXT '#GE' TEXT '#LE' TEXT '#GT' TEXT '#LT' TEXT '#EQ' PAGE / SOME TEXT P2, TEXT '+2' XVAL, TEXT '#VAL' DP4, TEXT '.+4' FADD, TEXT 'FADD' FLDA, TEXT 'FLDA' FSUB, TEXT 'FSUB' / SAVE AC ROUTINES SAVACT, 0 /SAVE TOP OF STACK IF /NECESSARY TAD SAVACT /SAVE RETURN ADDR DCA SAVEAC CLL CMA RAL JMP SAVEAC+2 /BACK UP ONLY ONE ENTRY SAVEAC, 0 /STORE AC IF NEEDED TAD (-5 /LOOK AT STACK TWO DOWN TAD X16 DCA SATEMP TAD I SATEMP /IF 0, RESULT WAS LEFT IN AC SZA CLA JMP I SAVEAC /NO, NO STORE NEEDED TAD TMPCNT /STORE TEMP NUMBER DCA I SATEMP ISZ SATEMP /MOVE TO TYPE WORD TAD I SATEMP /GET TYPE JMS SAVE /GO DO ACTUAL STORE JMP I SAVEAC SAVE, 0 /SAVE AC DCA ACSTOR /THIS IS THE TYPE TAD ACSTOR /IS IT COMPLEX OR DOUBLE? TAD QM4 SNA JMP NOC /ITS DOUBLE IAC SZA CLA JMP NOCORD /NO JMS I QGENCOD /STARTE; FLDA #CAC SEGCAC-1 NOC, JMS ACSTOR /%FSTA #TMP+XXXX JMS TMPBMP /THIS USE TWO TEMPS JMP I SAVE NOCORD, JMS ACSTOR /%FSTA #TMP+XXXX JMP I SAVE SATEMP, ACSTOR, 0 /GENERATES FSTA TEMP+XXXX JMS I QOPCOD /OUTPUT %FSTA %TEMP+XXXX FSTA JMS I QOADDR TMPCNT /TMPCNT CONTAINS THE /ARG NUMBER JMS TMPBMP /BUMP TEMPORARY NUMBER JMP I ACSTOR TMPBMP, 0 /ROUTINE TO BUMP TEMPORARIES TAD TMPCNT /BIGGER THAN MAX? CIA CLL TAD TMPMAX SZL CLA JMP .+3 /GO BUMP TEMP CNT TAD TMPCNT /NEW TEMP MAX DCA TMPMAX ISZ TMPCNT /INCR TEMP COUNT JMP I TMPBMP / PUSH ARG ONTO STACK PUSH, JMS SAVEAC /GO SAVE AC IF NEEDED JMS I QINWORD /GET ADDR OF NEW VAR DCA TEMP /SAVE IT TAD TEMP /PUSH IT DCA I X16 ISZ TEMP /GO TO TYPE CDF 10 TAD I TEMP /GET TYPE CDF AND Q17 /PUSH TYPE DCA I X16 /ONTO STACK CKPDL, DCA I X16 /ZERO BASE WORD TAD X16 /IS STACK FULL ? CIA CLL TAD (STACK+177 SZL CLA JMP I QNEXT /NO, OK TAD STKLVL /RESET STACK LEVEL DCA X16 JMS I QTTYMSG /PRINT MESSAGE 2004 DPUSH, JMS I QINWORD /GET THE VAR NAME PTR DCA I X16 /PUSH IT JMS I QINWORD /NOW GET THE DISPLACEMENT JMP CKPDL-1 /GO CHECK FOR OVERFLOW STARTF, TEXT 'STARTF' / ARITHMETIC IF ARTHIF, JMS I QUCODE /GET ARG INTO AC AIFTBL-1 JMS I QGENSF /DO ALL TRANSFERS IN FMODE TAD (JLT /FIRST OPCODE DCA AJUMP AIFLUP, JMS I QINWORD /GET NEXT INPUT DCA TEMP2 /SAVE IT IN CASE ITS NOT LABEL TAD TEMP2 CLL TAD (XPUSH-XLAST /IS IT A LABEL ? SNL CLA JMP I QNEXTM2 /NO, PROCEED JMS I QOPCDE AJUMP, 0 /OUTPUT CORRECT JUMP TAD TEMP2 CDF 10 JMS I QOSNUM /NOW THE LABEL JMS I QCRLF ISZ AJUMP /MOVE TO NEXT OPCODE ISZ AJUMP JMP AIFLUP DOT, TEXT '.' DP8, TEXT '.+10' PAGE / PICK UP TOP TWO ARGS GARGS, 0 /GET TOP 2 ARGS FROM STACK TAD X16 TAD QM6 /BACK TWO OPERANDS DCA X15 TAD X15 DCA X16 /AND OFFICIALLY POP THE STACK TAD I X15 /GET FIRST ARG DCA ARG1 TAD I X15 /AND TYPE DCA TYPE1 TAD I X15 DCA BASE1 /AND FIRST BASE (IN /CASE OF SS) TAD I X15 /NOW SECOND ARG DCA ARG2 TAD I X15 DCA TYPE2 TAD I X15 DCA BASE2 TAD TYPE1 /TYPES MUST BE LT 6 TAD QM6 SMA CLA JMP I GARGS /RETURN BAD TAD TYPE2 TAD QM6 SPA CLA ISZ GARGS /FIX RETURN JMS MPTRA1 /GET ARG1 POINTER IF NEEDED TAD ARG2 /IS ARG2 A POINTER TAD (-61 SZA CLA JMP I GARGS /NO, RETURN TAD ARG1 /IS ARG1 IN THE AC ? SZA CLA JMP .+5 /NO TAD TMPCNT /YES, STORE THE AC DCA ARG1 TAD TYPE1 /GET TYPE JMS I (SAVE TAD BASE2 /MOVE POINTER FROM TEMP /TO BASE+3 DCA ARG2 JMS I QGENCOD MPTR3-1 TAD (62 /ARG IS NOW POINTED TO /BY BASE+3 DCA ARG2 JMP I GARGS MPTRA1, 0 /MOVE ARG1 POINTER TO BASE TAD ARG1 TAD (-61 SZA CLA JMP I MPTRA1 TAD ARG2 SZA CLA JMP .+5 TAD TMPCNT DCA ARG2 TAD TYPE2 /GET THE TYPE JMS I (SAVE TAD BASE1 DCA ARG1 JMS I QGENCOD MPTR0-1 TAD (61 DCA ARG1 /SET ARG1 TO IND0 JMP I MPTRA1 / BINARY OPERATORS CODE, 0 /GENERATE CODE FOR /BINARY OPERATORS JMS GARGS /GET OPERANDS JMP OTERR /BAD TYPE OPERATOR COMBO TAD TYPE1 /INDEX INTO TYPE CHECK TABLE CLL RTL TAD TYPE1 TAD TYPE2 CLL RAL TAD (TYPMIX-14 /POINTER TO CORRECT ENTRY DCA SKEL CDF 10 TAD I SKEL /RESULTING TYPE SNA JMP TYPERR /THIS MIX IS ILLEGAL DCA TYPE1 /SAVE RESULT TYPE ISZ SKEL /GET INDEX INTO /SKELETON TABLE TAD I SKEL CDF TAD I CODE /PLUS BASE GIVES ADDR /OF M,AC CASE DCA SKEL CDF 10 TAD I SKEL /IS THIS TYPE OPER /COMBO LEGAL ? SNA CLA JMP OTERR /NO ISZ CODE /POINTS TO RESULTING TYPE TAD ARG2 SZA CLA ISZ SKEL /SECOND ARG IS IN MEMORY TAD ARG1 SNA CLA /SKIP ON M,M CASE ISZ SKEL /MOVE TO AC,M CASE TAD I SKEL /PICK UP POINTER TO SKELETON DCA SKEL JMS I QGENCOD /GO DO THE CODE SKEL, 0 DCA I X16 /RESULT IS IN THE AC TAD I CODE SNA /IS TYPE SAME AS ARGS ? TAD TYPE1 /YES DCA I X16 /STORE IT DCA I X16 /ZERO BASE WORD TAD I CODE /IS TYPE SAME AS ARGS ? SZA DCA FMODE /NO, WE'RE NOW IN FMODE JMP I CODE TYPERR, JMS BUMP /PUT FALSE VALUE ONTO STACK JMS I QTTYMSG /OUTPUT ERROR 1524 OTERR, JMS BUMP /PUT FALSE VALUE ONTO STACK JMS I QTTYMSG 1724 XDPP6, TEXT '#DPT+6' XFIX, TEXT '#FIX' PAGE / CODE GENERATOR (FROM SKELETONS) GENCOD, 0 /CODE GENERATOR ROUTINE CDF TAD X14 DCA TEMP14 /FIX COMPLEX FUNCTION BUG TAD I GENCOD /GET SKELETON ADDRESS ISZ GENCOD MPOPUP, DCA X14 /HERE ON MACRO END DCA MRETN CODLUP, CDF 10 /STUFF IS IN FIELD 1 TAD I X14 /GET OPCODE CDF SNA JMP ENDM /IS IT END OF A MACRO ? SPA JMP MACRO /ITS A MACRO REFERENCE DCA .+2 /SAVE OPCODE JMS I QOPCOD /OUTPUT IT 0 CDF 10 TAD I X14 /ADDRESS ? CDF SNA JMP NOADDR /NO OPERAND FOR THIS INSTR SPA JMP DOADDR /ADDRESS IS AN OPERAND DCA TEMP JMS I QOTAB /ADDRESS IS A SPECIFIC TAD TEMP JMS I QOUTSYM NOADDR, JMS I QCRLF JMP CODLUP /DO NEXT LINE DOADDR, IAC /IS IT ARG1 ? SZA CLA JMP ITSA2 /NO, ITS ARG2 JMS I QOADDR /OUTPUT ARG1 ADDRESS FIELD ARG1 JMP CODLUP ITSA2, JMS I QOADDR /OUTPUT ARG2 ADDRESS ARG2 /FIELD JMP CODLUP MACRO, TAD Q5 /CODES BETWEEN -1 AND -5 ARE SPECIAL SPA JMP .+4 /NOT ONE OF THEM TAD (JMP MJTBL DCA .+1 HLT /GO TO PROPER ROUTINE DCA MSTART /SAVE START OF MACRO TAD X14 /SAVE RETURN ADDRESS DCA MRETN TAD MSTART /GO DO MACRO DCA X14 JMP CODLUP ENDM, TAD MRETN /WAS THIS A MACRO ? SZA JMP MPOPUP /YES - GET OUT OF IT TAD TEMP14 DCA X14 /RESTORE X14 FOR FUNCAL JMP I GENCOD /AND EXIT LOADA1, JMS I (LOADA /GENERATE LOAD ARG1 /IF NECESSARY JMP CODLUP LOADA2, JMS I (LOADA /GENERATE LOAD ARG2 /IF NECESSARY JMP CODLUP DOSTE, JMS I QGENSE /STARTE IF IN F MODE JMP CODLUP SGNNEG, ISZ RELCD /CHANGE SIGN OF RELATIONAL OPERATOR JMP CODLUP MSTART=TEMP MRETN, 0 /MACRO RETURN ADDRESS TEMP14, 0 MJTBL, JMP SGNNEG /-5 - NEGATE RELATIONAL SIGN JMP LOADA2 /-4 - LOAD ARG 2 JMP LOADA1 /-3 - LOAD ARG 1 JMP DOSTE /-2 - START E MODE JMS I QGENSF /-1 - START F MODE JMP CODLUP XSET, TEXT 'SETX' ZEROC1, TEXT '0,1' / GOTO'S AND ASSIGN CGOTO, JMS GTSTUF /LOOK AT INDEX JMS I QGENCOD /OUTPUT COMPUTED GOTO CODE CGTCOD-1 JMS I QINWORD /GET COUNT CIA DCA TEMP2 CGTLUP, JMS JAGEN ISZ TEMP2 JMP CGTLUP JMP I QNEXT GOTO, JMS I QGENSF /ALL TRANSFERS IN F MODE JMS JAGEN JMP I QNEXT JAGEN, 0 JMS I QOPCDE /OUTPUT JA'S JA JMS I QINWORD /GET THE LABEL CDF 10 JMS I QOSNUM /OUTPUT IT AS THE ADDRESS JMS I QCRLF JMP I JAGEN GTSTUF, 0 JMS I QGARG /GET THE ARG JMP GTTYPE CLL CMA RTL /CHECK THE TYPE TAD TYPE1 SMA CLA JMP GTTYPE /NOT INTEGER OR REAL TAD ARG1 /IS IT IN THE AC ? SNA CLA JMP I GTSTUF /YES ALREADY JMS I QGENCOD GI-1 /LOAD THE INDEX JMP I GTSTUF GTTYPE, JMS I QTTYMSG /GOTO TYPE ERROR 0726 JAC, TEXT 'JAC' FSTA, TEXT 'FSTA' FNEG, TEXT 'FNEG' PAGE / ADDRESS FIELD OUTPUT OADDR, 0 /OUTPUT ADDRESS FIELD TAD I OADDR /GET ADDRESS OF PARAMETERS DCA ARG ISZ OADDR TAD I ARG /GET VALUE OF ARG CLL TAD (-52 /IS IT A TEMP REFNCE SNL JMP TMPREF /YES, 1-51 TAD (52-61 /IS IT AN ARRAY REFERENCE ? SZL JMP SSREF /YES, 52-60 IS XR1-XR7 SNA JMP IND0 /INDIRECT THROUGH 0 TAD (61-7000 /CHECK FOR DO TEMP SZL JMP DOTMP TAD (7000-62 SNA JMP IND3 /INDIRECT THROUGH 3 TAD (63 DCA TEMP CDF 10 TAD I TEMP /IS THIS AN ARG ? AND Q20 CDF SZA CLA JMP INDARG /YES, REF IT INDIRECTLY JMS I QOTAB CDF 10 TAD I TEMP /LOOK AT TYPE WORD AND (50 /IS IT LIT OR STMT NO.? SNA JMP OUTA /NO, JUST OUTPUT ADDRESS AND Q40 SNA CLA JMP OUTSN /OUTPUT STMT NUMBER JMP OUTLIT /OUTPUT LITERAL OUTA, TAD PROGNM /IS THIS THE FUNCTION NAME ? CIA TAD TEMP SNA CLA JMP FUNNAM /YES, REFERENCE #VAL INSTEAD OUTA2, CLA CMA /SIMPLE LOCAL VARIABLE REFNCE TAD TEMP /ADDRESS OF VAR JMS I QOUTNAM /INTO ADDR FIELD JMS I QCRLF JMP I OADDR /END OF ADDRESS OUTLIT, ISZ TEMP /MOVE TO LITERAL NUMBER TAD I TEMP DCA TEMP /DISPLACEMENT FROM %LITRL CDF TAD QLITRL /OUTPUT #LIT+ JMS I QOUTSYM TAD TEMP /DISPLACEMENT JMS I QONUMBR JMP OADRET-1 FUNNAM, TAD (XVAL /#VAL JMS I QOUTSYM JMP OADRET-1 SSREF, TAD (270 /MAKE IT AN ASCII DIGIT DCA XR ISZ ARG /POINT TO THE BASE WORD TAD I ARG /GET THE ADDR OF THE BASE DCA ARG CDF 10 TAD ARG IAC /GO TO TYPE OF BASE VAR DCA TEMP2 TAD I TEMP2 /IS IT AN ARG TO THE SUBR ? AND Q20 SNA CLA JMP NOTARG /NO, NO INDIRECT STUFF CDF JMS SIT TAD ARG /VAR NAME CDF 10 JMS I QOUTNAM TAD COMMA JMS I QOCHAR TAD XR /XR NUMBER JMS I QOCHAR JMS I QCRLF OADRET, JMP I OADDR IND3, TAD (XBASP3-XBASE /INDIRECT THRU #BASE+3 IND0, TAD (XBASE /INDIRECT THRU #BASE DCA TEMP JMS SIT TAD TEMP JMP FUNNAM+1 OUTSN, CLA CMA /OUTPUT STMT NUMBER TAD TEMP JMS I QOSNUM /OUTPUT THE NUMBER TAD (P2 /+2 (HACK FOR FORMAT) JMP FUNNAM+1 INDARG, JMS SIT /INDIRECT INDICATOR CDF 10 JMP OUTA2 /OUTPUT ARG NAME SIT, 0 TAD (245 /% (INDIRECT) JMS I QOCHAR JMS I QOTAB JMP I SIT CEQ, TEXT '#CEQ' XBAC1P, TEXT '#BASE,1+' XUE, TEXT '#UE' PAGE / ADDRESS FIELD OUTPUT NOTARG, TAD I TEMP2 /GET TYPE WORD DCA TEMP /SAVE IT TAD TEMP ISZ TEMP2 AND Q200 /EQUIVALENCED ? SNA CLA JMP .+3 TAD I TEMP2 /SKIP EQUIV INFO BLOCK DCA TEMP2 CLL CML RTL TAD I TEMP2 /ADDRESS OF MAGIC NUMBER DCA TEMP2 TAD I TEMP2 /MAGIC NUMBER ITSELF DCA TEMP2 CDF JMS I QOTAB /TAB TAD ARG /OUTPUT VARIABLE MINUS CONST JMS VMC TAD COMMA JMS I QOCHAR TAD XR /N JMS I QOCHAR JMS I QCRLF /END OF LINE JMP OADRET DOTMP, DCA TEMP /ADDRESS RELATIVE TO %DOTMP JMS I QOTAB TAD (DOTMPN /OUTPUT #DOTMP JMS I QOUTSYM JMP PLUSN /GO OUTPUT +XXXX TMPREF, CLA TAD I ARG /BUMP TEMPS BACK CORRECTLY (?) DCA TMPCNT JMS I QOTAB /TAB CLA CMA TAD I ARG /GET NUMBER DCA TEMP /INTO TEMP IFNZRO TMPBLK-2 <XXXXXX> CLL STA RAL /V3C -2 (-TMPBLK) /V3C LINK SET TAD TEMP /V3C (SAVES A LITERAL) SNL /V3C DCA TEMP /YES, SAVE ALTERED DISPLACEMENT SNL CLA /V3C TAD (TEMPN2-TEMPN /USE %TEMPX TAD (TEMPN /USE %TEMP JMS I QOUTSYM PLUSN, TAD PLUS /PLUS CONSTANT JMS I QOCHAR TAD TEMP /DISPLACEMENT TIMES THREE CLL RAL TAD TEMP JMS I QONUMBR /OUT IT JMS I QCRLF JMP OADRET / UTILITIES VMC, 0 /OUTPUT VARIABLE MINUS CONST CDF 10 JMS I QOUTNAM /PUT VAR NAME TAD Q255 /- JMS I QOCHAR TAD TEMP /THIS CONTAINS THE TYPE JMS SKPIRL /SKIP ON I,R OR L TAD Q3 /USE SIX WORDS PER ENTRY TAD Q3 /REAL, INTEGER, OR /LOGICAL 3 WORDS DCA MQ TAD TEMP2 JMS MUL12 /DO MULTIPLY JMS I QNUMBRO /OUTPUT 15 BIT NUMBER JMP I VMC SC, SKPIRL, 0 /SKIP ON TYPE I R OR L AND Q17 /ISOLATE TYPE CODE TAD QM4 /IS IT DOUBLE ? SZA IAC /NO, IS IT COMPLEX ? SZA CLA ISZ SKPIRL /NEITHER, SKIP JMP I SKPIRL /RETURN MUL12, 0 /12 BIT MULTIPLY DCA OPRND TAD (-15 DCA SC JMP STMUL M12LUP, TAD AC SNL JMP .+3 CLL TAD OPRND RAR STMUL, DCA AC TAD MQ RAR DCA MQ ISZ SC JMP M12LUP JMP I MUL12 OPRND, BUMP, 0 /PUT FALSE ENTRY ONTO STACK CDF 0 /V3C IMPORTANT PROTECTION DCA I X16 ISZ X16 ISZ X16 /THIS PREVENTS UNDER /FLOWING THE STACK JMP I BUMP /AFTER SOME ERRORS EXTERN, TEXT 'EXTERN' CADD, TEXT '#CAD' CNEG, TEXT '#CNG' CMUL, TEXT '#CML' JLE, TEXT 'JLE' ORG, TEXT 'ORG' STARTE, TEXT 'STARTE' XDPTMP, TEXT '#DPT' PAGE / RANDOM CODE GENERATORS ERROR, JMS I QINWORD /GET ERROR CODE JMS I QERMSG /PRINT IT JMP I QNEXT EOSTMT, TAD DATASW /WAS THIS A DATA STMT ? SNA CLA JMP OPTMYZ /NO DCA DATASW /KILL SWITCH JMS I QOPCDE ORG /ORIGIN BACK TO THE PROGRAM TAD GLABEL JMS I QOLABEL JMS I QCRLF ISZ GLABEL /BUMP LABEL GENERATOR OPTMYZ, CLA /CHANGED TO CLA IAC IF /O JMS I QXRTBL /CLEAR TABLE OR RESET FLAGS ISZ LINENO /BUMP LINE NUM TAD LINENO /DISPLAY IN MQ 7421 /FOR COOLNESS CLA /FOR NON-EAE FOLKS TAD STKLVL /RESET STACK LEVEL DCA X16 JMS IFEND /LOOK FOR END OF LOGICAL IF JMS I (ASFEND /END OF A.S.F. DEFINITION ? DEBUG, JMP I QNEXT /OVERLAYED IF NO /N SWITCH JMS I QOPCDE /OUTPUT LDX NNNN,0 LDX TAD LINENO /THIS IS THE CURRENT ISN JMS I QONUMBR TAD COMMA JMS I QOCHAR TAD Q260 JMS I QOCHAR JMS I QCRLF JMP I QNEXT IFEND, 0 /OUTPUT IF END LABEL IF TAD IFLABL /WAS THIS END OF LOG IF SNA JMP I IFEND /OUTPUT DEBUG STUFF JMS I QLABEL /OUPTUT THE LABEL JMS I QGENSF /ALL LOGICAL IFS MUST /END IN FMODE DCA WHATAC /CAN'T DEPEND ON /AC HERE JMS I QXRTBL /OR XR'S EITHER DCA IFLABL /KILL THE SWITCH JMP I IFEND OPCOD, 0 /TAB OPCODE DCA WHATAC /AC HAS JUST BEEN /MODIFIED JMS I QOTAB TAD I OPCOD ISZ OPCOD JMS I QOUTSYM JMP I OPCOD DIV, JMS I QSAVACT /IF SECOND OPERAND IN AC, SAVE IT JMS I QCODE /DIVIDE DIVTBL-6;0 CLA CMA /WERE BOTH VARS INTEGER? TAD TYPE1 SZA CLA JMP I QNEXT /NO JMS I QGENCOD A0FN-1 /ALN 0;FNORM JMP I QNEXT LIFBGN, DCA RELCD /ENTER HERE IF LAST OPCODE NOT A RELATIONAL JMS I QGARG /ENTER HERE FROM RELATIONAL OPTIMIZER JMP NOTLOG TAD TYPE1 /MUST BE LOGICAL TAD (-5 SZA CLA JMP NOTLOG TAD ARG1 /IS IT IN AC ? SNA CLA JMP .+3 JMS I QGENCOD GI-1 JMS I QINWORD /IS IT IF(...)GOTO XX ? DCA TEMP2 TAD TEMP2 TAD (XPUSH-XGOTO SNA CLA JMP IFGOTO /YES, TREAT AS SPECIAL CASE TAD GLABEL /SET IF LABEL DCA IFLABL TAD RELCD CIA TAD Q5 /GENERATE THE OPPOSITE JUMP JMS RELJMP /AROUND THE TARGET OF THE IF TAD GLABEL JMS I QOLABEL ISZ GLABEL /INCREMENT LABEL GENERATOR JMS I QCRLF JMP I QNEXTM2 IFGOTO, TAD RELCD JMS RELJMP /GENERATE TRUE RELATIONAL JUMP IF "IF()GOTO" JMS I QINWORD /GET THE LABEL CDF 10 JMS I QOSNUM JMS I QCRLF JMP I QNEXT NOTLOG, JMS I QTTYMSG 1411 RELJMP, 0 CLL RAL TAD (JNE DCA .+2 JMS I QOPCDE 0 JMP I RELJMP FMUL, TEXT 'FMUL' FDIV, TEXT 'FDIV' CAC, TEXT '#CAC' LITRL, TEXT '#LIT+' TEMPN, TEXT '#TMP' PAGE / DO LOOP COMPILER DOBEGN, JMS I QSAVACT /FOR EXPR IN LOOP PARAMS TAD X16 /SET NEW STACK LEVEL DCA STKLVL JMS I QGARGS /GET LIMIT AND STEP JMP DPERR /ERROR IN DO PARMS JMS DOPARM /DO PARAMETER STUF FOR LIMIT ARG1 JMS DOPARM ARG2 /AND THEN FOR STEP TAD ARG1 /REPLACE ALTERRED STACK /ENTRIES DCA I X16 ISZ X16 /REST OF ARG1 OK TAD GLABEL /SAVE LOOP LABEL DCA I X16 TAD ARG2 DCA I X16 ISZ X16 ISZ X16 JMS I QCRLF /CRLF BEFORE LABL TAD GLABEL JMS I QLABEL /OUPTUT LOOP LABEL ISZ GLABEL /INCR LABEL GENERATOR DCA WHATAC /FORGET AC AND JMS I QXRTBL /XR'S AT DO BEGIN JMP I QNEXT DOSTOR, JMS I QGARGS /LOOK AT INDEX AND JMP DPERR /INITIAL VALUE CLL CMA RTL /MUST BE INTEGER OR TAD TYPE1 /REAL (L=1 AC=-3) SZL CLA /SKIP IF >2 CLL CMA RTL /L=1 AC=-3 TAD TYPE2 SZL CLA /L=0 IS BAD JMP I (STORE+2 /DO STORE IF OK DPERR, JMS I QTTYMSG /ERROR IN LIMITS 0420 /DP DOFINI, JMS I QXRTBL /DON'T OPTIMIZE XR USAGE /IN SUCCESSIVE IMPLIED DO LOOPS TAD IOSTMT /INSIDE IO STMT ? SNA CLA JMS IFEND /IF NOT, END IF FIRST JMS I QINWORD /GET THE INDEX DCA ARG1 TAD ARG1 /GET THE TYPE WORD ADR IAC DCA TYPE1 CDF 10 TAD I TYPE1 CDF AND Q17 DCA TYPE1 /TYPE OF INDEX VAR TAD QM6 TAD STKLVL /BACK UP THE STACK DCA X16 TAD X16 /RESET THE STACK LEVEL DCA STKLVL TAD I X16 /GET THE FINAL VALUE DCA DOARG ISZ X16 TAD I X16 /GET THE LOOP LABEL DCA DARG TAD I X16 /GET THE STEP DCA ARG2 TAD I X16 /WHICH DO FIN CODE ? CLL CML RAL TAD TYPE1 TAD QM6 SNA CLA TAD (DOFIN1-DOFIN0 /INDEX=I, STEP=R TAD (DOFIN0-1 /ALL OTHER CASES DCA .+2 JMS I QGENCOD /DO FINISH CODE 0 JMS I QOPCOD /SUBTRACT UPPER LIMIT FSUB JMS I QOADDR DOARG JMS I QOPCDE /NOW THE JLT %%LOOP JLE TAD DARG /OUTPUT LABEL JMS I QOLABEL JMS I QCRLF TAD STKLVL /FIX X16 INCASE MULTIPLE DO ENDER DCA X16 JMP I QNEXT DOARG, DOPARM, 0 /SUBR FOR DO PARAMETERS TAD I DOPARM ISZ DOPARM /GET THE PARM POINTER DCA DARG CLL CML RTL /GET ADDR OF TYPE WORD TAD DARG DCA TYPE CLL CMA RTL /CHECK TYPE TAD I TYPE SMA CLA JMP DPERR /NOT I OR R TAD I DARG SNA JMP STRTMP /ARG ALREADY IN AC TAD QM63 /IS IT ARRAY REF? SPA CLA JMP SVLIMT /YES, SAVE LIMIT TAD I DARG /REGET SYM ADDR DCA X10 /ADR OF TYPE WORD CDF 10 TAD I X10 /MAYBE ITS A LIT? CDF AND Q40 SZA CLA JMP I DOPARM /YES, ITS LITERAL /WE'RE ALWAYS IN F MODE HERE /SINCE THE LAST THING /WAS A DO STORE SVLIMT, JMS I QOPCOD /OTHERWISE LOAD IT FLDA JMS I QOADDR DARG, 0 STRTMP, TAD DOTEMP /SET ARG TO NEXT DO TEMP DCA I DARG JMS I QOPCOD /GENERATE STORE FSTA ISZ DOTEMP /BUMP DO TEMP TAD DARG DCA .+2 JMS I QOADDR /DO TEMP ADDRESS FIELD 0 JMP I DOPARM PAGE / SUBSCRIPT REFERENCE COMPILER ARGS, JMS I QINWORD /COMPILE ARGUMENT LIST CMA DCA NARGS /NUMBER OF ARGS TAD NARGS /GET ADDRESS OF SUBSCRIPTED VAR CLL RAL TAD NARGS /ENTRY ON THE STACK TAD X16 DCA X15 TAD X15 /SAVE POINTER TO START /OF THIS ENTRY DCA X14 /FOR POSSIBLE FUTURE USE ISZ NARGS /NOW ITS THE 2'S COMPLEMENT NOP TAD I X15 /FETCH SS VARIABLE DCA BASE1 TAD I X15 /ITS TYPE DCA TYPE1 TAD BASE1 /STORE BASE WORD DCA I X15 TAD BASE1 /GET ADDR OF TYPE WORD IAC DCA TEMP CDF 10 /GET TYPE WORD CLL CML RTR /TEST DIM BIT AND I TEMP SNA CLA JMP TRYCAL /SOME KIND OF CALL TAD BASE1 /NOW GET ADDRESS OF DIM INFO JMS I QGETSS DCA ARG1 /RETURNS WITH FIELD SET TAD I ARG1 /CORRECT NUMBER OF DIMENSIONS? TAD NARGS CDF SZA CLA JMP DIMERR /NO ISZ ARG1 /SKIP TOTAL SIZE ISZ ARG1 /SKIP MAGIC NUMBER ISZ ARG1 /AND ASSOCIATED LITERAL DCA XRNUM /START WITH XR 1 TAD (-10 /SEVEN XRS DCA XRCNT /COUNT FOR SEARCH DCA FREEXR /ZERO FREE XR INDICATOR XRCHEK, CDF ISZ XRCNT /ANY MORE XR EXPRS TO TEST ? SKP /YES, GO CHECK THEM JMP COMPSS /NO, MUST COMPILE /XR ERPRESSION ISZ XRNUM /BUMP XR NUMBER TAD XRNUM CLL RTL /TIMES 16 CLL RTL TAD (XRBUFR-1 /PLUS BASE (-1) DCA X13 TAD I X13 /LOOK AT THE SPA /INDICATOR JMP .+3 /-1=USED BY THIS STMT SZA CLA /IF ZERO GO TO /MTXR (EVENTUALLY) TAD FREEXR /ANY FREE BEFORE THIS ONE ? SZA CLA JMP NOTMT /YES, ALREADY FOUND ONE TAD XRNUM /THIS WILL BE DCA FREEXR /THE XR WE USE JMP XRCHEK /GO LOOK AT NEXT NOTMT, TAD X13 /SAVE FLAG ADDRESS DCA XRFLAG /IN CASE WE NEED IT LATER TAD I X13 /POINTER TO THE DIM INFO DCA TEMP2 CDF 10 TAD I TEMP2 /SAME NUMBER OF DIMS ? TAD NARGS SZA CLA JMP XRCHEK /NO, THIS XR WONT DO TAD NARGS /SET COUNTER DCA DCNT TAD ARG1 /POINTER TO DIM FACTORS DCA X12 ISZ TEMP2 /SKIP THREE WORDS ISZ TEMP2 ISZ TEMP2 DCHEK, ISZ DCNT /ANY MORE ? SKP JMP SSCHEK /DIMS OK, CHECK SS ISZ TEMP2 /GET TO NEXT DIM TAD I TEMP2 /ARE THEY EQUAL ? CIA TAD I X12 SZA CLA JMP XRCHEK /NO, GO TRY NEXT ONE JMP DCHEK SSCHEK, TAD NARGS /COUNT AGAIN CDF DCA DCNT CLL CMA RAL /-2 TAD X16 /ADDR OF START OF TOP /SS ON STACK JMP .+3 SSC2, CLL CMA RTL /-3 TAD XTMP /BACK UP TO NEXT LOWER SS DCA XTMP /LINK IS ALWAYS ZERO HERE TAD I XTMP /GET NEXT SS (WORKING /RIGHT TO LEFT) TAD (-61 /IS IT A VAR OR LITERAL? SNL CLA JMP XRCHEK /WE'RE JUST /LOOKING FOR AN EMPTY TAD I XTMP /RE GET SS POINTER CIA TAD I X13 /ARE THEY THE SAME ? SZA CLA JMP XRCHEK /NO ISZ DCNT JMP SSC2 /KEEP CHECKING TAD XRNUM /THEY MATCH, STICK IN /THE XR NUMBER TAD (51 DCA I X14 CLL CML RTL TAD X14 /PURGE SS FROM STACK DCA X16 CLA CMA /SET FLAG TO /'USED BY THIS STMT' DCA I XRFLAG JMP I QNEXT DCNT, 0 XRFLAG, 0 XTMP, 0 PAGE / SUBSCRIPT REFERENCE COMPILER COMPSS, TAD FREEXR /GET XR EXPR AREA CLL RTL /BY MULTIPLYING /THE NUMBER CLL RTL /BY 16 TAD (XRBUFR /AND ADDING THE /BASE ADDRESS DCA XREPTR /THIS IS IT CLA CMA /SET USED BY THIS /STMT FLAG DCA I XREPTR ISZ XREPTR CLL CMA RTL /STORE THE DIB POINTER TAD ARG1 DCA I XREPTR TAD NARGS /GET ADDR OF POINTER TO LAST CMA /DIMENSION FACTOR TAD ARG1 DCA ARG1 /SINCE WE USE THEM IN /REVERSE ORDER JMS I QSAVEAC /STORE AC IF NEEDED /FOLLOWING INSTRUCTION REMOVED FOR OPTOMIZATION / JMS I QGENSF /ALL SUBSCRIPTS AR I OR R TAD (FLDA /LOAD FIRST SS SKP CSSLUP, TAD (FADD /ADD ALL SUBSEQUENT ONES DCA OPC CLL CMA RTL /BACK UP STACK BY ONE ENTRY TAD X16 DCA X16 TAD X16 /GET A WORKING POINTER DCA X15 TAD I X15 /GET THE NEXT SUBSCRIPT DCA ARG2 CLL CMA RAL /MUST BE INTEGER TAD I X15 SMA CLA JMP DIMERR TAD I X15 DCA BASE2 TAD ARG2 /STORE THE SS INTO THE /XR EXPR ISZ XREPTR /INCREMENT FIRST DCA I XREPTR TAD ARG2 /IS ARG2 THE AC (ONLY /POSSIBLE IF SNA CLA /ITS THE RIGHTMOST /SUBSCRIPT) JMP NLODSS /YES, DON'T LOAD IT JMS I QOPCOD /OUTPUT LOAD OR ADD OPC, 0 /THIS LOCATION TELLS /THE STORY JMS I QOADDR /FOLLOWED BY THE OPERAND ARG2 /POINTED TO BY ARG2 NLODSS, ISZ NARGS /ANY MORE SUBSCRIPTS ? JMP MORESS /YES, GO COMPILE THEM TAD FREEXR /ANY FREE INDEX REG? SZA CLA JMP ASGNXR /YES, GO USE IT TAD (61 /ITS A SPECIAL POINTER ENTRY DCA I X14 ISZ X14 TAD TMPCNT /SAVE TEMP NUMBER DCA I X14 /BEFORE WE BLOW X14 JMS I (GENPTR /GENERATE POINTER TO THE ARG JMS I QGENCOD /BACK TO FMODE SF-1 JMS I (ACSTOR /GENERATE STORE AC JMP I QNEXT DIMERR, JMS I QTTYMSG /SS NOT OF CORRECT NUMBER 2323 XRCNT, 0 TRYCAL, TAD ASFSWT /ASF DEFINITION SMA SZA CLA JMP DEFASF /YES, GO OUTPUT PROLOG TAD I TEMP /IS IT A FUNCTION OR AN ARG? CDF AND (1420 SNA JMP DIMERR /NO, SOME KIND OF ERROR AND Q20 DCA ACSWIT /SAVE THE AC SWITCH JMP FUNCAL /STANDARD FUNCTION CALL MORESS, JMS I QGENSF /MUST USE SINGLE PRECISION FOR MULTIPLY JMS I QOPCOD /MULTIPLY BY DIM FACTOR FMUL CDF 10 TAD I ARG1 /PICK UP FACTOR ADDRESS CDF DCA ARG2 CLA CMA TAD ARG1 /MOVE BACK ONE DCA ARG1 JMS I QOADDR /OUTPUT MULTIPLY ADDRESS ARG2 JMP CSSLUP /LOOP ON NEXT SS ASGNXR, JMS I QOPCDE /OUTPUT ATX N ATX TAD FREEXR /GET NUMBER OF FREE XR TAD Q260 JMS I QOCHAR JMS I QCRLF TAD FREEXR TAD (51 /COMPUTE PROPER NUMBER DCA I X14 /PUT IT INTO TOP OF STACK JMP I QNEXT XREPTR, 0 / RANDOM TEXT OTAB, 0 TAD (211 JMS I QOCHAR JMP I OTAB FCLA, TEXT 'FCLA' STARTD, TEXT 'STARTD' TEMPN2, TEXT '#TMPX' CSUB, TEXT '#CSB' CDIV, TEXT '#CDV' PAGE / GENERAL CALL GENERATOR GENCAL, 0 /GENERATE A CALL; ALL ARGS ON STACK /X15 POINTS TO START OF STACK INFO /NARGS IS NEG NUMBER OF ARGS /FUNCTION NAME IS FIRST ON STACK TAD I GENCAL /GET FUN NAME SWITCH DCA FNSWIT TAD X15 /NEW STACK VALUE DCA X16 TAD X15 /WORKING POINTER DCA ARG2 TAD NARGS /WORKING COUNTER SNA JMP OUTJSR /NO ARGS, PUT JSR DCA TYPE2 CHKPTR, ISZ ARG2 /MOVE TO NUMBER TAD ARG2 IAC /ADDR OF TYPE WORD DCA BASE2 TAD I BASE2 /GET TYPE DCA TYPE1 /TYPE OF ARG FOR GENPTR ISZ BASE2 /POINT TO BASE WORD TAD I BASE2 DCA BASE1 /FOR GENPTR TAD I ARG2 /GET ARG NUMBER CLL TAD (-52 /IS IT INDEXED ? SNL JMP NOTINX /NO, ITS A TEMP TAD (52-61 /IS IT INDIRECT ? SZL JMP INXR /NO, ITS IN AN XR SNA JMP INTMP /POINTER IN A TEMP TAD (62 /GET TO TYPE WORD DCA GCTEMP CDF 10 TAD I GCTEMP /IS IT AN ARG CDF AND (1020 /ARG OR EXTERNAL ? SNA JMP NOTINX+1 /NEITHER AND Q20 SZA CLA JMP ARGARG /ARG SQUARED JMP EXTARG /EXTERNAL ARG NOTINX, CLA ISZ ARG2 /BUMP POINTER ISZ ARG2 ISZ TYPE2 /INCR COUNT JMP CHKPTR OUTJSR, TAD JSRLBL /DOES IT GET A LABEL ? SNA JMP .+3 /NO JMS I QLABEL /OUPTUT THE LABEL+COMMA DCA JSRLBL /KILL SWITCH TAD X16 /ADDR OF POINTER TO FUN NAME DCA TEMP FNSWIT, 0 /REAARANGED** JMP I (IOFUN /IO FUNCTION CALL JMS I QOPCDE /OUTPUT THE JSR JSR TAD I TEMP /NOW THE SUBR NAME CDF 10 JMS I QOUTNAM JMS I QCRLF TAD NARGS /ANY ARGS ? SNA CLA JMP I GENCAL /NO, END OF CALL JMS I QOPCDE /JUMP AROUND THE ARGS JA TAD Q256 JMS I QOCHAR /. TAD PLUS JMS I QOCHAR /+ CLL CLA CMA RAL /-2 TAD NARGS /-N-2 CLL CMA RAL /2*N+2 JMS I QONUMBR IOONLY, JMS I QCRLF TAD X16 /WORKING POINTER DCA X15 PTRLST, TAD I X15 /GET NEXT ARG SZA JMP SARG /SIMPLE ARG CLL CML RTL TAD X15 /ADDR OF GENERATED /LABEL NUMBER DCA TEMP TAD I TEMP /OUTPUT #GXXXX (THE /GENERATED LABEL) JMS I QLABEL /OUPTUT THE LABEL JMS I QGENCOD JADP2-1 /GENERATE A DUMMY JA JMP BARGLP SARG, DCA ARG2 /STORE THE ARG NUMBER JMS I QOPCOD /OUTPUT JA ARG JA JMS I QOADDR /NOW ADDRESS FIELD ARG2 BARGLP, ISZ X15 /BUMP POINTER ISZ X15 ISZ NARGS /BUMP COUNT JMP PTRLST JMP I GENCAL INTMP, TAD I BASE2 /GET TEMP NUMBER DCA ARG1 /THAT PTR IS STORED IN JMS I QGENCOD /PICK UP POINTER LDASTD-1 STRPTR, JMS I QOPCDE /NOW STORE THE POINTER FSTA TAD GLABEL /OUTPUT THE LABEL JMS I QOLABEL JMS I QCRLF TAD GLABEL /SAVE THE LABEL NUMBER DCA I BASE2 DCA I ARG2 /ZERO ARG NUMBER ISZ GLABEL /INCREMENT LABEL NUMBER JMS I QGENCOD /BACK TO F MODE SF-1 JMP NOTINX /CONTINUE LOOP NLABEL, 0 JMS I QOLABEL TAD COMMA JMS I QOCHAR JMP I NLABEL PAGE / GENERATE SUBROUTINE CALL FUNCAL, JMS I QSAVEAC /SAVE NEXT TO LAST IF NEEDED JMS I QSAVACT /SAVE LAST IF NEEDED JMS I QGENSF /ALL CALLS DONE IN F MODE DCA I X14 /RESULT RETURNED IN AC TAD ACSWIT /IS THE SUBR AN ARG ? SNA CLA JMP MAKCAL /NO, ITS EASIER JMS I QOPCOD /GET THE JSR TO THE SUBR FLDA JMS I QOADDR BASE1 /BY GETTING THE VALUE /OF THE ARG JMS I QGENCOD /STARTD SD-1 JMS I QOPCDE /STORE IT AHEAD FSTA TAD GLABEL /INTO THE JSR ISZ GLABEL DCA JSRLBL /SET THE SWITCH TAD JSRLBL JMS I QOLABEL JMS I QCRLF JMS I QGENCOD /STARTF SF-1 MAKCAL, ISZ BASE1 /MOVE TO TYPE WORD CDF 10 TAD I BASE1 /GET TYPE OF FUNCTION CDF JMS I QSKPIRL /WHAT MODE WILL WE LEAVE IN? DCA FMODE /PROBABLY E JMS I QGENCAL /GO GENERATE THE CALL SKP 0 /THIS IS A FREE LOCATION JMP I QNEXT ARGARG, JMS I QOPCDE /%FLDA FLDA TAD I ARG2 /POINTER CDF 10 JMS I QOUTNAM JMS I QCRLF JMS I QGENCOD /%SD SD-1 CDF 10 CLL CML RTR /IS IT AN ARRAY ? AND I GCTEMP CDF SNA CLA JMP STRPTR /GO STORE THE POINTER TAD I ARG2 /GET THE LITERAL NUMBER JMS I QGETSS TAD Q3 DCA GCTEMP TAD I GCTEMP DCA OLABEL /SAVE IT CDF JMS I QOPCDE /%FADD LITERAL FADD TAD QLITRL JMS I QOUTSYM TAD OLABEL /XXXX JMS I QONUMBR JMS I QCRLF JMP STRPTR /GO STORE THE POINTER INXR, TAD (270 /MAKE AN ASCII CHAR DCA XR JMS I QOPCDE /XTA XTA TAD XR JMS I QOCHAR /N JMS I QCRLF TAD BASE1 /FIND ADDR OF MAGIC /NUMBER LITERAL JMS I QGETSS CDF TAD Q3 DCA ARG1 JMS I (GENPTR /GENERATE THE POINTER JMP STRPTR /GO STORE THE POINTER EXTARG, TAD I ARG2 /MAKE AN ENTRY IN THE EXT CDF 10 /LITERAL LIST DCA I X17 TAD DOTEMP /USE DO TEMPS FOR THIS DCA I X17 CDF TAD DOTEMP /SINCE OADDR CAN HANDLE THEM DCA I ARG2 ISZ DOTEMP /BUMP COUNT ISZ ELCNT /ALSO EXT LIT COUNT JMP NOTINX /BACK TO PROCESSING ARGS / UTILITY ROUTINES OLABEL, 0 /OUTPUT #GXXXX FOR GEN'D LABELS DCA TEMP TAD (243 JMS I QOCHAR TAD (307 JMS I QOCHAR TAD TEMP JMS I QONUMBR JMP I OLABEL OPCODE, 0 /TAD OPCODE TAB DCA WHATAC /THIS INSTRUCTION ZAPS AC JMS I QOTAB TAD I OPCODE ISZ OPCODE JMS I QOUTSYM JMS I QOTAB JMP I OPCODE M1C2, TEXT '-1,2' GENSTE, 0 /GENERATE STARTE IF IN /F MODE TAD FMODE /LOOK AT THE SWITCH SNA CLA JMP I GENSTE /ALREADY IN E MODE DCA FMODE /CLEAR THE SWITCH JMS I QOPCOD /GENERATE THE STARTE STARTE JMS I QCRLF /CAN'T USE GENCOD FOR THAT JMP I GENSTE D0, TEXT '0' DOTMPN, TEXT '#DOTMP' PAGE / OPCODES AND OTHER TEXT XBASE, TEXT '#BASE' XBASP3, TEXT '#BASE+3' DP3C0, TEXT '.+3,0' JXN, TEXT 'JXN' ALN, TEXT 'ALN' ATX, TEXT 'ATX' XTA, TEXT 'XTA' LDX, TEXT 'LDX' XREW, TEXT '#REW' XENDF, TEXT '#ENDF' XBAK, TEXT '#BAK' XEXIT, TEXT '#EXIT' XRTN, TEXT '#RTN' JNE, TEXT 'JNE' TEXT 'JGE' TEXT 'JLE' TEXT 'JGT' JLT, TEXT 'JLT' /MUST BE IN THIS ORDER!! TEXT 'JEQ' JA, TEXT 'JA' JSR, TEXT 'JSR' JSA, TEXT 'JSA' /MUST BE IN THIS ORDER! TRAP3, TEXT 'TRAP3' / POINTER GENERATOR GENPTR, 0 /GENERATE A POINTER JMS I QOPCOD /MULTIPLY BY 3. OR 6. FMUL TAD TYPE1 /D OR C ? JMS I QSKPIRL /SKIP ON I, R, OR L TAD Q6M3 TAD (THREE DCA TEMP /POINTER TO CORRECT LITERAL JMS I QOADDR TEMP JMS I QGENCOD /ALN 0; STARTD A0SD-1 JMS I QOPCDE /FADD THE BASE LITERAL FADD ISZ BASE1 /GET ADDR OF TYPE WORD CDF 10 TAD I BASE1 /GET TYPE WORD AND Q20 SNA CLA JMP NIARG /NOT AN ARG CMA TAD BASE1 JMS I QOUTNAM /IF AN ARG, THE LITERAL /IS THE ARG JMP OSF NIARG, CDF TAD QLITRL /OTHERWISE ITS IN THE /LITERAL BLOCK JMS I QOUTSYM CDF 10 TAD I ARG1 /LITERAL NUMBER CDF JMS I QONUMBR OSF, JMS I QCRLF JMP I GENPTR / MORE RANDOM CODE GENERATORS STOP, JMS I QGENCOD /CALL EXIT STPCOD-1 JMP I QNEXT FORMAT, JMS I QINWORD /NUMBER OF WORDS OF TEXT CMA DCA TEMP JMS I QOPCDE /JA AROUND THE STUFF JA TAD Q256 JMS I QOCHAR /. TAD PLUS JMS I QOCHAR CLL CMA RAL /.+2+NWORDS TAD TEMP CMA JMP .+3 FMTLUP, JMS I QOTAB /TA JMS I QINWORD /GET NEXT WORD JMS I QONUMBR /OUTPUT IT JMS I QCRLF ISZ TEMP JMP FMTLUP JMP I QNEXT DFRTTM, 0 /ROUTINE TO DELETE "SYS:FORTRN.TM" CLA IAC CIF 10 JMS I Q200 4 FTRNTM 0 NOP JMP I DFRTTM EQUDOT, TEXT '=.' XPAUSE, TEXT '#PAUSE' PAGE /REWIND, ENDFILE, BACKSPACE REWIND, TAD (XREW-XENDF ENDFIL, TAD (XENDF-XBAK BAKSPC, TAD (XBAK DCA REBSUB JMS I QUCODE AIFTBL-1 /GET UNIT INTO FAC JMS I QGENSF /FORCE F MODE CLA STL RTL JMS I (OJSR REBSUB, 0 JMP I QNEXT / DATA STATEMENT STUFF DATAST, TAD X16 /SAVE STACK DCA DSTACK TAD DATASW /MULTIPLE DATA STMT ? SZA CLA JMP FIXDAT-2 /YES, DON'T OUTPUT LABEL ISZ DATASW /SET DATA SWITCH JMS I QOTAB /DEFINE ORIGIN SYMBOL TAD GLABEL JMS I QOLABEL TAD (EQUDOT /#GXXXX=. JMS I QOUTSYM JMS I QCRLF CLA CMA /SET VAR TO NONE LEFT DCA NUMELM FIXDAT, TAD QXRBUFR /USE XR BUFFER FOR DATA BUFFER DCA DATPTR CMA DCA RCOUNT /SET REPETITION COUNT TO 1 JMP I QNEXT DREPTC, JMS I QINWORD /GET REPETITION COUNT CIA DCA RCOUNT JMP I QNEXT DATELM, JMS I QINWORD /GET SIZE OF ELEMENT CIA DCA TEMP JMS I QINWORD /GET ELEMENT DCA I DATPTR ISZ DATPTR /INTO DATA BUFFER ISZ TEMP JMP .-4 JMP I QNEXT ENDELM, TAD QXRBUFR /SETUP POINTER DCA TEMP MORELM, ISZ NUMELM /ANY MORE FOR THIS VAR? JMP SAMVAR /YES TAD DSTACK /CHECK FOR MISMATCH CIA TAD X16 SNA CLA JMP DLERR /OOOPS ISZ DSTACK /GET TO NEXT VAR JMS I QOPCDE /%ORG VAR ORG TAD I DSTACK /GET VAR DCA TEMP2 TAD TEMP2 ISZ DSTACK /MOVE TO THE DISPLACEMENT CDF 10 /OUTPUT VAR JMS I QOUTNAM CMA DCA NUMELM /ASSUME UNDIMENSIONED CDF 10 ISZ TEMP2 /MOVE TO TYPE WORD TAD I TEMP2 /GET TYPE JMS I QSKPIRL /SKIP ON I R L CLL CMA RTL /YES TAD (-3 DCA ELMSIZ /NUMBER OF WORDS PER ELEMENT CLL CML RTR AND I TEMP2 CDF SNA CLA JMP GOTSIZ /NOT DIMENSIONED CLA IAC /IF DISP = 7777 , WHOLE ARRAY TAD I DSTACK /LOOK AT DISPLACEMENT SZA CLA JMP GOTSIZ+1 /ONLY ONE ELEMENT OF THE ARRAY CMA TAD TEMP2 /GET TOTAL SIZE JMS I QGETSS IAC DCA TEMP2 TAD I TEMP2 CIA /THIS IS THE NUMBER OF ELEMENTS DCA NUMELM CDF GOTSIZ, DCA I DSTACK /ZERO DISPLACEMENT TAD PLUS /OUTPUT +XXXX JMS I QOCHAR TAD ELMSIZ /MULTIPLY DISP BY 3 OR 6 CIA DCA MQ TAD I DSTACK /GET DISP JMS I QMUL12 JMS I QNUMBRO /OUTPUT THE ORG ALTERATION JMS I QCRLF ISZ DSTACK /MOVE TO NEXT ENTRY SAMVAR, TAD ELMSIZ /GET SET TO PICK UP AN ELEMENT DCA NARGS JMS I QOTAB JMP .+3 /SKIP ; FIRST TIME ELMLUP, TAD (273 /SEMICOLON JMS I QOCHAR TAD I TEMP /GET A WORD FROM THE BUFFER ISZ TEMP JMS I QONUMBR ISZ NARGS /ONE DATA LIST ELEMENT MUST FILL JMP ELMLUP /ONE VARIABLE LIST ELEMENT JMS I QCRLF /I.E. ONE ARRAY ELEMENT TAD DATPTR /IS THIS DATA ELEMENT EXHAUSTED? CIA CLL TAD TEMP SNL CLA JMP MORELM /MORE LEFT ISZ RCOUNT /REPEAT ? JMP ENDELM /YES JMP FIXDAT /NO, BACK FOR MORE DATA DLERR, JMS I QTTYMSG /DATA LIST ERROR 0414 ELMSIZ=ARG1 NUMELM=TYPE1 DSTACK=BASE1 DATPTR=ARG2 RCOUNT=TYPE2 PAGE / END STATEMENT PROCESSING END, TAD FUNCTN /WHAT WAS IT ? SZA CLA JMP .+3 /SUBR, RETURN TAD (STPCOD-1 /MAIN PROG, CALL EXIT DCA .+2 JMS I QGENCOD RTNCOD-1 TAD DOTEMP /ANY DO TEMPS ? TAD M7000 SPA SNA JMP .+3 /NO JMS OTMPS /OUTPUT THEM XDOTMP, DOTMPN CLA TAD TMPMAX /ANY EXTRA TEMPS ? TAD (-TMPBLK SPA SNA JMP .+4 IAC /OUTPUT THEM + 1 JMS OTMPS TEMPN2 CLA TAD ELCNT /ANY EXTERNAL LITERALS? SNA JMP END2 /NO CIA DCA ELCNT TAD EXTLIT /PICK UP THE POINTER DCA X17 ELLOOP, CDF 10 TAD I X17 /GET SYMBOL NAME DCA TEMP TAD I X17 /AND DO TEMP NUMBER CDF TAD (-7000 /MINUS BASE DCA TEMP2 JMS I QOPCDE /ORIGIN ORG TAD XDOTMP /OUTPUT #DOTMP JMS I QOUTSYM TAD PLUS /+ JMS I QOCHAR TAD TEMP2 /DISP CLL CML RAL /*2+1 TAD TEMP2 /*3+1 JMS I QONUMBR JMS I QCRLF JMS I QOPCDE /NOW OUTPUT JSR NAME JSR TAD TEMP CDF 10 JMS I QOUTNAM JMS I QCRLF ISZ ELCNT JMP ELLOOP END2, TAD (232 /^Z JMS I QOCHAR JMS I (OUDUMP /DUMP BUFFER CIF 10 JMS I (7700 /GET USR 10 CIF 10 CLA IAC JMS I Q200 /CLOSE OUTPUT FILE 4 F1LNAM FILSIZ, 0 JMP OUERR /BADDDDIE TAD FILSIZ /FIX INPUT LIST CLL RTL RTL JMP FINAL ERMSG, 0 /PRINT ERROR MESSAGE ON THE TTY DCA TEMP /SAVE THE CODE TAD QM4 /BACK UP THE ERROR TAD ERRPTR /POINTER DCA X10 CDF 10 DCA I X10 /ZERO END OF LIST TAD TEMP /NOW STICK IN THE CODE DCA I X10 TAD X10 /SAVE THE NEW POINTER DCA ERRPTR TAD LINENO /NOW THE LINE NUMBER DCA I X10 CDF TAD TEMP /PRINT ERROR CODE JMS I QTTYP2C JMS I QTTYP2C /NOW SOME SPACES TAD QTTYOUT /FUDGE THE OUTPUT /ROUTINE POINTER DCA QOCHAR /SO THAT ONUMBR GOES TO /THE TTY TAD LINENO /PRINT THE LINE NUMBER JMS I QONUMBR TAD (OCHAR /FIXUP OUTPUT POINTER DCA QOCHAR JMS I QTTCRLF JMS I QGENCOD /TRAP IF ERROR EXECUTED ERCODE-1 JMP I ERMSG M7000, OTMPS, -7000 /OUTPUT TEMP BLOCK DCA TEMP /SAVE SIZE TAD I OTMPS ISZ OTMPS JMS I QOUTSYM /OUTPUT NAME TAD COMMA JMS I QOCHAR JMS I QOPCDE /ORG ORG TAD Q256 /. JMS I QOCHAR TAD PLUS JMS I QOCHAR TAD TEMP CLL RAL TAD TEMP /SIZE TIMES THREE JMS I QONUMBR JMS I QCRLF JMP I OTMPS PAGE / CHAIN TO RALF / PASS2O VERSION 4A PT 16-MAY-77 /CHANGES FOR OS/8 V3D AND OS/78 BY P.T. /FIXED THE Q OPTION /PATCH LEVEL IS IN LOCATION 26131 IFZERO OVERLY < /ANOTHER SCORE FOR PAL8 *OVRLAY NOPUNCH> IFNZRO OVERLY < /TO TAKE THE LEAD FIELD 2 ENPUNCH *OVRLAY> /LATE IN THE FINAL QUARTER GORALF, TAD FILDEV /GET SIZE AND DEVICE WORD DCA I (7617 /PUT IT AWAY ISZ (7617 /BUMP POINTER TAD FILBLK /GET ORIGIN OF FIE DCA I (7617 /STORE IT ISZ (7617 DCA I (7617 /ZERO END OF LIST TAD I RALFSV CDF 0 SPA CLA /WAS /A SPECIFIED? JMP I (7605 /YES - GET OUT CLA IAC CHNLKP, CIF 10 JMS I Q200 2 /LOOKUP RALF.SV RALFNM RALFSV, 7643 JMP I (7605 TAD (6 /** DCA CHNLKP+2 JMP CHNLKP RALFNM, 2201;1406;0000;2326 /RALF.SV PASS3N, 2001;2323;6300;2326 /PASS3.SV ADD, JMS I QCODE /GENERATE CODE FOR ADD ADDTBL-6;0 JMP I QNEXT / EXP OPERATOR ETYPE, 0 EXP, JMS I QSAVACT /SAVE AC IF ITS SECOND ARG JMS I QGARGS /GET THE TWO ARGS JMP I (OTERR /TYPE/OPERATOR ERROR TAD TYPE1 /GET PLACE IN TABLE CLL RTL TAD TYPE1 /TYPE1 TIMES TEN TAD TYPE2 /** CLL RAL TAD (EXPTBL-15 /POINTER TO ENTRY MINUS ONE DCA X10 CDF 10 TAD I X10 /GET RESULTING TYPE SNA JMP I (OTERR /BAD IF THIS WORD IS ZERO DCA ETYPE /SAVE THE TYPE TAD I X10 /GET THE SUBR NAME CDF DCA I (ESUBR+2 /PUT IT INTO ITS PLACE TAD TYPE1 /GET INTO CORRECT MODE JMS SETMOD TAD ARG1 /IS ARG 1 ALREADY IN THE AC SNA CLA JMP .+5 /YES, SKIP THE LOAD JMS I QOPCOD /OTHERWISE LOAD IT FLDA JMS I QOADDR ARG1 JMS I QOINS /FSTA #BASE FSTA;XBASE TAD TYPE2 /SET MODE FOR ARG 2 JMS SETMOD JMS I QOPCOD /NOW LOAD IT FLDA JMS I QOADDR ARG2 JMS I QOINS /EXTERN FOR THE SUBR EXTERN;ESUBR JMS I QOINS /JSA TO THE SUBR JSA;ESUBR DCA I X16 /RESULT IS THE AC TAD ETYPE /WITH THIS AS THE TYPE DCA I X16 DCA I X16 TAD ETYPE /SET FMODE CORRECTLY JMS I QSKPIRL SKP CLA IAC /RETURNED IN F MODE DCA FMODE JMP I QNEXT SETMOD, /SET MODE TO CORRESPOND /TO THE ARG VOVER, VERSON /VERSION NUMBER FOR OVERLAY JMS I QSKPIRL /SKIP IF WE WANT F MODE JMP .+3 /SET TO E MODE JMS I QGENSF /SET TO F MODE JMP I SETMOD JMS I QGENSE JMP I SETMOD FINAL, CIA IAC DCA FILDEV /SAVE RALF INPUT SPEC CMA DCA I X7746 /DON'T SAVE CORE ARROUND CHAIN JMS I (DFRTTM /DELETE FORTRN.TM CDF 10 TAD I Q7605 /IS THERE A LISTING FILE? SNA CLA JMP GORALF /NO, JUST CHAIN TO RALF CIF 10 CDF CLA IAC JMS I Q200 /FIND PASS 3 2 PASS3N PAS3SV, 0 JMP I Q7605 TAD PAS3SV-1 /MOVE BLOCK TO CHAIN COMMAND IAC /SKIP OVER CORE CONTROL BLOCK DCA X7746 JMS I DEVH /READ IN PASS 3 NPPAS3 SPASS3, 400 X7746, 7746 JMP I Q7605 JMP I SPASS3 /GO DO PASS 3 PAGE / I/O OPEN AND CLOSE STRTIO, 0 /ROUTINE FOR STARTING IO STMT ISZ IOSTMT /SET IOSTMT SWITCH /(INCASE OF IMPLIED LOOPS) JMS I QSAVEAC /SAVE AC JMS I QSAVACT /IF NECESSARY TAD I STRTIO /GET NUMBER OF ARGS DCA NARGS /SAVE IT ISZ STRTIO /MOVE TOHE NME TAD NARGS /BACKUP STACK BY THIS MUCH TAD NARGS /THREE OR SIX TAD NARGS TAD X16 DCA X15 TAD X15 DCA TEMP /FUNCTION NAME GOES HERE JMS I QOPCDE /EXTERN FOR SUBR EXTERN TAD I STRTIO /GET SUBROUTINE NAME JMS I QOUTSYM /OUTPUT IT JMS I QCRLF TAD I STRTIO /PUT NAME DCA I TEMP /ONTO STACK JMS I QGENSF /ALL CALLS IN F MODE JMS I QGENCAL /GENERATE THE CALL NOP JMP I QNEXT /NOTHING FOR R CLOSE FMTRD1, IAC /START FORMATTED READ DCA INPUT /SET INPUT = 1 DCA BINARY /AND BINARY = 0 JMS STRTIO /GO MAKE THE CALL -2;XREADO FMTWR1, DCA INPUT /SET SWITCHES DCA BINARY JMS STRTIO -2;XWRITO BINRD1, CLA IAC DCA BINARY CLA IAC DCA INPUT JMS STRTIO -1;XRUO BINWR1, DCA INPUT CLA IAC DCA BINARY JMS STRTIO -1;XWUO WCLOSE, CLA STL RTL /TRAP3 HERE TOO** JMS OJSR /OUTPUT TRAP3 #WUC XWUC DCA IOSTMT /KILL IO SWITCH JMP I QNEXT OJSR, 0 /OUTPUT EXTERN THEN JSR OR TRAP3 CLL RAL /AC ON ENTRY IS 0 (JSR), 1 (JSA) OR 2 (TRAP3). TAD (JSR DCA OJSROP JMS I QOPCDE /FIRST EXTERN EXTERN TAD I OJSR JMS I QOUTSYM JMS I QCRLF JMS I QOPCDE /THEN JSR OJSROP, 0 TAD I OJSR ISZ OJSR JMS I QOUTSYM JMS I QCRLF JMP I OJSR XWUC, TEXT '#RENDO' /** XREADO, TEXT '#READO' XWRITO, TEXT '#WRITO' XRUO, TEXT '#RUO' XWUO, TEXT '#WUO' RDRTNE, TEXT /#RSVO/ RDDRTN, TEXT /#RFDV/ FTRNTM, 0617;2224;2216;2415 /FORTRN.TM DNA, JMS I QCODE /AND CODE ANDTBL-6;0 JMP I QNEXT PURGE, JMS I QGARG /LOOK AT THE TOP OF STACK JMP I (IOTYPE /BAD TYPE TAD ARG1 /IT MUST BE A SCALAR REFNCE CLL TAD QM63 SNL CLA JMP I (IOTYPE /BAD TYPE JMP I QNEXT PAUZE, JMS I QUCODE /GET ARG INTO FAC AIFTBL-1 JMS I QGENCOD /OUTPUT JSR PAZCOD-1 JMP I QNEXT PAGE /DIRECT ACCESS I/O DARD1, CLA IAC /SET SWITCHES DCA INPUT CLA IAC DCA BINARY /SAME AS UNFORMATTED JMS I (STRTIO /GENERATE CALL -2;XRDAO DAWR1, DCA INPUT /SAME AS UNFORMATTED WRITE OPEN CLA IAC DCA BINARY JMS I (STRTIO /CALL -2;XWDAO DEFFIL, TAD XDFARG /FAKE A CALL DCA I (STRTIO /TO SKIP THE ISZ IOSTMT JMP I (STRTIO+2 XDFARG, .+1 -4;XDEF XDEF, TEXT '#DEF' XRDAO, TEXT '#RDAO' XWDAO, TEXT '#WDAO' / RANDOM UNFITTING STUFF RETURN, JMS I QGENCOD /JA #RTN RTNCOD-1 JMP I QNEXT GENSTF, 0 /GENERATE STARTF IF IN E MODE TAD FMODE /LOOK AT THE SWITCH SZA CLA JMP I GENSTF /ALREADY THERE ISZ FMODE /SET SWITCH JMS I QOPCOD /OUTPUT STARTF STARTF JMS I QCRLF JMP I GENSTF /RETURN NOT, JMS I QUCODE /.NOT. NOTTBL-1 JMP I (RELGM1 SUB, JMS I QCODE /SUBTRACT SUBTBL-6;0 JMP I QNEXT MUL, JMS I QCODE /MULTIPLY MULTBL-6;0 JMP I QNEXT ASFDEF, CLA IAC /SET SWITCH FOR ASF PROLOG DCA ASFSWT JMP I QNEXT OINS, 0 /OUTPUT TAB OPCODE TAB /ADDRESS CRLF DCA WHATAC /ZAPS AC JMS I QOTAB TAD I OINS /GET OPCODE ISZ OINS JMS I QOUTSYM JMS I QOTAB TAD I OINS /GET ADDRESS SZA JMS I QOUTSYM JMS I QCRLF /END LINE ISZ OINS JMP I OINS / CODE GENERATOR FOR STORE STORE, JMS I QGARGS /GET ARGS FOR STORE JMP I (OTERR TAD ARG1 /KILL ANY XR /EXPRS. INVOLVING JMS I QCHKXR /THE VARIABLE BEING STORED TAD ARG2 /IS SECOND ARG IN AC ? SNA CLA TAD Q5 /YES, ADD 5 TO TYPE2 TAD TYPE2 DCA TYPE2 TAD TYPE1 /TYPE1 TIMES TEN CLL RTL TAD TYPE1 CLL RAL TAD TYPE2 /PLUS TYPE2 TAD (STRTBL-13 /PLUS TABLE BASE DCA SSKEL /GIVES ENTRY ADDRESS CDF 10 TAD I SSKEL /POINTER TO SKELETON DCA SSKEL JMS I QGENCOD /GENERATE CODE SSKEL, 0 TAD ASFSWT /IS THIS END OF ASF ? SZA CLA JMP I QNEXT /YES, DON'T DO A STORE TAD TYPE1 /MODE IS THE SAME JMS I QSKPIRL /AS THE VARIABLE STORED IN SKP CLA IAC DCA FMODE JMS I QOPCOD /OUTPUT STORE FSTA JMS I QOADDR /ADDRESS FIELD ARG1 TAD ARG1 /REMEMBER THE AC CIA DCA WHATAC /(REMEMBER THE TAD BASE1 /ALAMO ?) CIA /(WOULD YOU DCA WHATBS /BELIEVE THE MAINE ???) ISZ ARG1 /GO TO TYPE WORD CDF 10 CLL /IF ARG1 IS TAD ARG1 /A SS'D REFNCE TAD QM63 /DON'T SZL CLA /BOTHER CHECKING TAD I ARG1 /LOOK AT SOME BITS CDF AND (3400 /DIM,EXT, OR ASF ? SNA CLA JMP I QNEXT JMS I QTTYMSG /ATTEMPT TO STORE IN 1720 /EXTERNAL OR ASF FLDAP, TEXT 'FLDA%' PAGE /ARITHEMTIC STATEMENT FUNCTIONS (BLAH!) DEFASF, CDF /A.S.F. PROLOG TAD FMODE /SAVE CPU MODE DCA ASFMOD /SINCE WE JUMP ARROUND TAD X14 /SET STACK POINTER TAD (3 /SO THAT ASF NAME STAYS DCA X16 CLA CMA /SET ASF SWITCH DCA ASFSWT TAD TMPMAX /USE UNIQUE TEMPS IAC DCA TMPCNT /FOR ALL ASF'S JMS I QXRTBL /AND FORGET XR'S JMS I QOPCDE /JA AROUND JA TAD GLABEL /SAVE ARROUND LABEL DCA ASFSKP ISZ GLABEL /BUMP LABEL GENERATOR TAD ASFSKP /PUT LABEL AS ADDRESS OF JA JMS I QOLABEL JMS I QCRLF TAD GLABEL /FUNCTIONS XR'S O HERE JMS I QLABEL /OUPTUT THE LABEL JMS I QOINS /#GXXXX, ORG .+10 ORG;DP8 TAD BASE1 /NOW OUTPUT FUNCTION NAME CDF 10 JMS I QOUTNAM TAD COMMA /AS TAG JMS I QOCHAR /OF START OF FUNCTION JMS I QOPCDE /SETX XSET TAD GLABEL /TO THE GENERATED LABEL ISZ GLABEL JMS I QOLABEL JMS I QCRLF JMS I QOINS /LDX 0,1 LDX;ZEROC1 JMS I QGENCOD /STARTD SD-1 /JUST LIKE A SUBROUTINE /ISN'T IT ? JMS I QOINS /FLDA #BASE FLDA;XBASE /GET RETURN JUMP JMS I QOPCDE /STORE IT AHEAD FSTA TAD GLABEL /USING GENERATED LABEL JMS I QOLABEL JMS I QCRLF ASFARG, JMS I QOINS /FLDA% #BASE,1+ FLDAP;XBAC1P /GET ARG POINTER JMS I QOINS /FSTA #BASE+3 FSTA;XBASP3 /SAVE IT TAD I X15 /GET PARAMETER DCA ARG2 TAD I X15 DCA TYPE2 ISZ X15 TAD TYPE2 /IS IT SINGLE OR DOUBLE? JMS I QSKPIRL JMP ASFASE /DOUBLE JMS I QGENCOD /STARTF SF-1 CLA IAC ARGSV, DCA FMODE /SET FMODE APPROPRIATELY JMS I QOINS /FLDA% #BASE+3 FLDAP;XBASP3 /GET THE VALUE JMS I QOPCOD FSTA /AND SAVE IT JMS I QOADDR ARG2 ISZ NARGS /ANY MORE ARGS ? SKP JMP I QNEXT /NO, END OF ASF PROLOG JMS I QGENCOD /STARTD SD-1 JMP ASFARG /NEXT ARG ASFASE, JMS I QGENCOD /STARTE SE-1 JMP ARGSV ASFEND, 0 /HANDLE END OF A.S.F. TAD ASFSWT /IS THIS END OF ASF ? SNA CLA JMP PTCH /V3C NO DCA ASFSWT /CLEAR SWITCH JMS I QOINS /RESET XR'S XSET;ZXR TAD GLABEL /OUTPUT SPACE FOR RETURN ADDR ISZ GLABEL JMS I QLABEL /OUPTUT THE LABEL JMS I QOINS /ORG .+2 ORG;DOTP2 TAD ASFSKP /OUTPUT SKIP ARROUND LABEL JMS I QLABEL /OUPTUT THE LABEL JMS I QCRLF TAD ASFMOD /RESET MODE SWITCH DCA FMODE TAD TMPMAX /UNIQUE TEMPS IAC DCA TEM /V3C MUST BE USED JMS I QXRTBL /AND XR'S LOST PTCH, TAD TEM /V3C DCA TMPCNT /V3C JMP I ASFEND /RETURN ASFMOD, 0 ASFSKP, 0 IOFUN, JMS I QOPCDE /CALLED BY TRAP3,NOT JSR** TRAP3 TAD I TEMP JMS I QOUTSYM /OUTPUT THE IO FUNCTION NAME JMP I (IOONLY /DO SOME OTHER STUFF ESUBR, TEXT '#EXPXX' /THIS WILL BE THE CORRECT NAME PAGE / I/O LIST ELEMENT IOLMNT, JMS I QGARG /GET THE ARG JMP IOTYPE /TYPE ERROR DCA IOLOOP /CLEAR LOOP SWITCH CLL STA RTL /-3 TAD TYPE1 DCA TYPE1 /TYPE1 = 0 IF COMPLEX, 1 IF D.P. TAD ARG1 /ADDR OF TYPE WD CLL IAC DCA ARG2 TAD ARG1 /LOOK AT ARG TAD QM63 SNL CLA JMP NOLOOP /NOT ARRAY OUTPUT CDF 10 CLL CML RTR /IS IT DIMENSIONED ? AND I ARG2 CDF SNA CLA JMP NOLOOP /NO, NO LOOP ISZ IOLOOP /SET SWITCH TAD ARG1 /GET TO SS JMS I QGETSS IAC /TOTAL SIZE WORD DCA BASE1 TAD I ARG2 /IS THIS ARRAY AN ARG ? AND Q20 DCA ARGIO /SET SWITCH TAD I BASE1 /IS IT VARIABLY DIMENSIONED ? SNA JMP I (VDAIO /YES, MUST COMPUTE SIZE DCA BASE2 /SAVE SIZE CDF JMS I QOPCDE /PUT SIZE IN XR 1 LDX TAD Q255 JMS I QOCHAR /- TAD BASE2 JMS I QONUMBR TAD COMMA JMS I QOCHAR TAD (261 JMS I QOCHAR JMS I QCRLF TAD ARGIO /IS IT AN ARG ? SZA CLA JMP I (ARGIOA /YES OLLABL, TAD GLABEL /OUTPUT LABEL JMS I QOLABEL DCA I (XRBUFR+20 /KILL XR1 ENTRY TAD COMMA JMS I QOCHAR NOLOOP, TAD INPUT /INPUT OR OUTPUT ? SNA CLA JMP OUTV /OUTPUT JMS FIXCAL /SET PTR FOR OJSR** JMS I (DUMSUB /NOW THE STORE FSTA TAD ARG1 /KILL ASSOCIATED JMS I QCHKXR /XR EXPRESSIONS CDSFLP, TAD TYPE1 /IS IT C OR D ? CLL RAR SZA CLA JMP ENDLUP /NO, NO STARTE JMS I QGENCOD SF-1 ENDLUP, TAD IOLOOP /IS THERE A LOOP ? SNA CLA JMP I QNEXT /NO, DO NEXT LIST ELEMENT JMS I QOPCDE /YES, OUTPUT JXN JXN TAD GLABEL ISZ GLABEL /OUTPUT LABEL JMS I QLABEL /OUPTUT THE LABEL TAD (261 JMS I QOCHAR TAD PLUS /OUTPUT PLUS (FOR /INCREMENT DUMMY) JMS I QOCHAR JMS I QCRLF JMP I QNEXT /DO NEXT LIST ELEMENT OUTV, TAD TYPE1 /D OR C ? CLL RAR SZA CLA JMP .+3 /NO, NO STARTF NECCESSARY JMS I QGENCOD SE-1 JMS I (DUMSUB /OUTPUT FLDA FLDA JMS FIXCAL JMP CDSFLP /THEN STARTF AND JXN IF ANY FIXCAL, 6401 TAD TYPE1 /IF VARIABLE IS COMPLEX, CIA /OR IF VARIABLE IS DOUBLE AND SZA /I/O IS BINARY, TAD BINARY /GENERATE A JSR #RFDV SNA CLA /ELSE GENERATE A TRAP3 #RSVO JMP BINDIO CLA STL RTL /SET PTR JMS I (OJSR /NOW GO DO IT RDRTNE /HERE'S THE NAME JMP I FIXCAL BINDIO, JMS I (OJSR RDDRTN JMP I FIXCAL IOTYPE, JMS I QTTYMSG /IO TYPE ERROR 1124 DEFLBL, JMS I QCRLF /CRLF BEFORE LABL JMS I QGENSF /ENTER F MODE BEFORE ALL LABELS JMS I QINWORD /GET THE LABEL CDF 10 JMS I QOSNUM /OUTPUT IT TAD COMMA JMS I QOCHAR JMS I QXRTBL /KILL XR TABLE DCA WHATAC /AND AC AT LABEL JMP I QNEXT PAGE / I/O LIST ELEMENT VDAIO, CLL CMA RAL /GET ADDR OF NUMBER OF DIMS TAD BASE1 DCA X10 TAD I X10 /GET DIM COUNT CIA DCA NARGS ISZ X10 /SKIP SIZE ISZ X10 /AND MAGIC NUMBER ISZ X10 /AND LITERAL NUMBER TAD (FLDA /LOAD FIRST DIM SKP GSIZLP, TAD (FMUL /MULTIPLY THE REST DCA OPCIO CDF 10 TAD I X10 /GET THE NEXT DIMENSION DCA TYPE2 CDF JMS I QOPCOD /OUTPUT OPCODE OPCIO, 0 JMS I QOADDR /NOW THE DIMENSION TYPE2 ISZ NARGS JMP GSIZLP /KEEP GOING JMS I QOPCOD /NEGATE THE FAC FNEG JMS I QCRLF JMS I QGENCOD /PUT THE COUNT INTO XR1 ATX1-1 ARGIOA, JMS I QGENCOD /PUT -1 INTO XR 2 LXM1C2-1 JMS I QOPCDE /LOAD THE ARG POINTER - FLDA /CONST DCA I (XRBUFR+40 /KILL XR 2 ENTRY TAD ARG1 CDF 10 JMS I QOUTNAM JMS I QCRLF JMS I QOPCDE /NOW ADD THE MAGIC NUMBER FADD TAD QLITRL /OUTPUT #LIT+XXXX JMS I QOUTSYM CDF 10 ISZ BASE1 ISZ BASE1 TAD I BASE1 CDF JMS I QONUMBR JMS I QCRLF JMS I QOPCDE FSTA /NOW STORE IN #BASE+3 TAD (XBASP3 JMS I QOUTSYM JMS I QCRLF JMS I QGENCOD /STARTF SF-1 JMP I (OLLABL /NOW THE INSIDE OF THE LOOP DUMSUB, 0 /OUTPUT FLDA OR FSTA /WITH SE IF NEEDED TAD I DUMSUB /GET THE OPCODE DCA LDASTA ISZ DUMSUB TAD TYPE1 /MUST WE SE ? CLL RAR /TYPE1 IS 0 IF C, 1 IF D SNA CLA TAD Q3 /MULTIPLIER IS 6 TAD Q3 /OR 3 DCA MQ JMS I QOPCOD /FLDA OR FSTA LDASTA, 0 TAD IOLOOP /IS IT A LOOP ? SNA CLA JMP EZVAR /NO TAD ARGIO /IS IT AN ARG ? SZA CLA JMP IBASP3 /YES, INDIRECT THROUGH #BASE+3 JMS I QOTAB TAD ARG1 CDF 10 /OUTPUT NAME JMS I QOUTNAM TAD (255 /- JMS I QOCHAR TAD BASE2 /NEGATIVE OF SIZE CIA JMS I QMUL12 /TIMES 6 OR 3 JMS I QNUMBRO TAD COMMA /COMMA SEVEN JMS I QOCHAR TAD (261 JMS I QOCHAR JMS I QCRLF JMP I DUMSUB /RETURN EZVAR, JMS I QOADDR /ITS A SCALAR ARG1 JMP I DUMSUB IBASP3, TAD (245 /INDIRECT THROUGH #BASE+3 JMS I QOCHAR JMS I QOTAB TAD (XBPC2P /FLDA% #BASE+3,2+ JMS I QOUTSYM JMS I QCRLF JMP I DUMSUB XBPC2P, TEXT '#BASE+3,2+' OR, JMS I QCODE ORTABL-6;0 JMP I (RELGEN XOR, JMS I QCODE EQVTBL-6;0 JMP I (RELGEN DOTP2, TEXT '.+2' ZXR, TEXT '#XR' PAGE / ASSIGNED GOTO AND ASSIGN AGOTO, JMS GTSTUF /LOOK AT THE ASSIGNED VAR JMS I QGENCOD /GENERATE A JAC AGTCOD-1 JMP I QNEXT ASSIGN, JMS I QGARG /GET THE ASSIGN VAR JMP GTTYPE CLL CMA RTL /MUST BE I OR R TAD TYPE1 SMA CLA JMP GTTYPE /GOTO TYPE ERROR JMS I QGENCOD /GENERATE THE ASSIGN CODE ASNCOD-1 JMS I (JAGEN JMS I QGENCOD /NOW STORE IT ASTOR-1 JMP I QNEXT / OPTIMIZER SUBROUTINES CHEKXR, 0 /KILL XR EXPRS CIA /ASSOCIATED WITH THIS VAR DCA KILVAR /SINCE IT HAS /JUST BEEN CHANGED TAD (-7 /LOOK AT XR 1 THRU 7 DCA TEMP /COUNT TAD (XRBUFR+20 /POINTER DCA TEMP2 KILLUP, TAD I TEMP2 /GET NEXT XR /EXPR. INDICATOR SNA CLA JMP EOKL /NOTHING HERE TAD TEMP2 /GET POINTER DCA X13 /INTO AN XR TAD I X13 /GET ADDR OF DIB DCA DIMPTR /SAVE IT CDF 10 /FIELD OF SYMBOL TABLE TAD I DIMPTR /GET NUMBER OF /DIMENSIONS CMA /COMPLIMENTED DCA NARGS /SAVE IT CDF /BACK TO FIELD OF XRBUFR CHKKIL, ISZ NARGS /CHECK 1 LESS /THAN THE NUMBER SKP /OF DIMENSIONS JMP EOKL TAD I X13 /LOOK AT NEXT /ELEMENT OF EXPR TAD KILVAR /IS IT THE VAR /JUST CHANGED ? SNA CLA DCA I TEMP2 /YES, KILL THIS EXPRESSION JMP CHKKIL /LOOP EOKL, TAD TEMP2 /DO NEXT XR TAD Q20 DCA TEMP2 /BUMP POINTER BY 16 ISZ TEMP JMP KILLUP JMP I CHEKXR /RETURN KILVAR, XRTABL, 0 /CLEAR OR RESET /XR TABLE FLAGS DCA TYPE /0=CLEAR 1=RESET TAD (-7 /DO XR1 THRU 7 DCA TEMP /COUNT TAD (XRBUFR+20 /POINTER DCA TEMP2 XRTLUP, TAD I TEMP2 /GET INDICATOR SNA CLA JMP .+3 /DON'T CHANGE IF ZERO TAD TYPE /OTHERWISE SET TO DCA I TEMP2 /'USED BY /PREVIOUS STMT' TAD TEMP2 /GET TO NEXT ONE TAD Q20 DCA TEMP2 /BUMPING BY 16 ISZ TEMP JMP XRTLUP /LOOP JMP I XRTABL /DONE LOADA, 0 /GENERATE AN FLDA TAD I LOADA /IF NECESSARY DCA LODARG /GET ARG POINTER ISZ LOADA /BUMP RETURN TAD I LODARG /DOES AC MATCH ? TAD WHATAC SZA CLA JMP DOLOAD /NO, MUST LOAD TAD LODARG /GET ADDRESS IAC /OF BASE DCA ARG /IN CASE SS'D TAD I ARG /DOES BASE MATCH? TAD WHATBS SNA CLA JMP I LOADA /OK, DON'T LOAD DOLOAD, JMS I QOPCOD /GENERATE FLDA FLDA JMS I QOADDR /ADDRESS LODARG, 0 JMP I LOADA PAGE / INTER PASS EQUATES BLNKCN=21 ALIST=23 INTLST=60 FPLIST=56 DPLIST=57 CMPLST=61 HOLIST=55 SNLIST=62 ONEI=63 THREE=70 SIX=75 TRUE=102 / START PASS 2 (INTER PASS COMMUNICATION) IFNZRO OVERLY < FIELD 0 NOPUNCH *OVRLAY> IFZERO OVERLY < FIELD 0 ENPUNCH *OVRLAY> START2, JMP I Q7605 /RETURN BUT DON'T SAVE CORE TAD I X10 /PICK UP NEXT FROM PASS 1 DCA X17 TAD X17 /SAVE POINTER TO /EXTERNAL LITERALS DCA EXTLIT TAD I X10 /PASS ONE STACK LEVEL DCA X11 TAD I X10 /TEMP FILE START DCA INBLOK TAD I X10 /AND SIZE CMA DCA INRCNT TAD I X10 /START OF PASS2O.SV DCA PASS2O TAD I X10 /START OF OUTPUT FILE DCA FILBLK /SAVE IT FOR CHAINING TO RALF TAD FILBLK DCA OBLOCK TAD I X10 DCA OSIZE /ALSO MAX SIZE TAD I X10 /PICK UP PROG NAME DCA PROGNM TAD I X10 DCA ARGLST /AND ARG LIST ADDR TAD I X10 /AND /FUNCTION/SUBROUTINE/MAIN SWITCH DCA FUNCTN TAD I X10 /GET DP HARDWARE SWITCH DCA DPUSED TAD I X10 /CHECK FOR CROSSED VERSIONS TAD VERS SZA CLA JMP VERROR /VERSION ERROR STA STL /V3C DCLOOP, TAD X11 /V3C THIS ADD CLEARS THE LINK DCA X11 /V3C TAD X11 TAD (-STACK1 SNL CLA JMP PSN /GO DO STMT NUMBERS TAD I X11 /GET DO LOOP ENDING STMT NUMBER IAC DCA X10 CDF 10 TAD (0416 /DN DO END MISSING JMS NPRNT /GO PRINT THE MESSAGE /AND THE NUMBER CDF CLL CMA RTL JMP DCLOOP /V3C BACK UP 2 PSN, TAD (SNLIST /PROCESS STMT NUMBERS CDF 10 SNCLUP, DCA ENTRY /SAVE NEW ENTRY ADDR TAD I ENTRY /GET ADDR OF NEXT ENTRY SNA JMP SNDONE /NO MORE STMT NUMBERS IAC DCA TEMP /ADDR OF TYPE WORD TAD I TEMP /WAS STMT NUMBER DEFINED? SPA CLA JMP SNDEFN /YES TAD TEMP DCA X10 TAD (2523 /PRINT US MESSAGE JMS NPRNT SNDEFN, TAD (0110 /SET TYPE WORD DCA I TEMP TAD I ENTRY /PROCEED JMP SNCLUP SNDONE, CDF FIXELP, JMS I (TYPRTN NEGSLV /FIX UP NEGATIVE EQUIVALENCE OFFSETS CLL CML RTL /CHECK FOR BLOCK DATA TAD FUNCTN /(FUNCTN=-2) SNA CLA JMP BDSTUF /IT IS JMS I (TYPRTN /DO IMPLICIT TYPING IMPLCT JMS I (TYPRTN /REMOVE SUB ARGS FROM LIST SUBARG JMS I (TYPRTN /EXTERNALS EXTRNL JMP I (PROLG1 /MORE PROLOG BDSTUF, TAD I (BDSWIT /SET UP SWITCH DCA I (PROLG2 TAD (END2 /ALTER END CODE CDF 10 DCA I (XEND CDF 0 DCA NODBUG /NO ISN'S JMP I (HOLDUN /DO SOME STUFF SUBARG, 0 /REMOVE ARGS FROM ST TAD I TYPE AND Q20 /CHECK ARG BIT SNA CLA JMP I SUBARG JMS UNHOOK JMP TFUDGE UNHOOK, 0 TAD I ENTRY DCA I OENTRY TAD BUCKET DCA I ENTRY JMP I UNHOOK VERROR, TAD (2605 /PRINT VE (VERSION ERROR) JMS I QTTYP2C JMS I QTTCRLF JMP I Q7605 PAGE / GENERATE ARGUMENT STORAGE PROLG1, JMS I (INS2 / %JA #ST JA;XST JMS I (INS /#XR, %ORG .+10 XXR;ORG;DP8 JMS I QOPCDE / %TEXT #NAMEXX# TEXTX TAD PLUS JMS I QOCHAR CDF 10 TAD PROGNM JMS I QOUTNAM JMS I (FILL /FILL WITH BLANKS TAD PLUS JMS I QOCHAR ISZ PROGNM JMS I QCRLF JMS I (INS /#RET, %SETX #XR XRET;SETX;XXR JMS I (INS2 / %SETB #BASE SETB;XBASE JMS I (INS2 / %JA .+3 JA XDP3, DP3 JMS I (INS /#BASE, %ORG .+6 XBASE;ORG;DP6 TAD ARGLST /ANY ARGS ? SNA JMP NOARGS /NO, SKIP THIS STUFF DCA X10 /SAVE POINTER TO ARG LIST CDF 10 /HOW MANY ? TAD I ARGLST CIA DCA NARGS /THIS MANY DCA TEMP2 /ARRAY ARG COUNTER ARGLP1, JMS PLSUB1 /OUTPUT DEFS FOR ARRAY /ARGS FIRST SNA CLA /SINCE THEY MUST BE /INDIRECTABLY JMP NOARAY /REFERENCABLE ISZ TEMP2 NOARAY, ISZ NARGS JMP ARGLP1 /PROCESS ENTIRE ARG LIST CDF 10 TAD I ARGLST /GO THRU ARGS AGAIN CIA CLL DCA NARGS TAD ARGLST DCA X10 TAD TEMP2 /HOW MANY ARRAY ARGS ? TAD QM6 SNA JMP NISA /NO INDIRECT LOCS LEFT /FOR SCALARS DCA TEMP2 SZL CLA JMP TOOMNY /TOO MANY ARRAY ARGS (>6) ARGLP2, JMS PLSUB1 /NOW OUTPUT AS MANY INDIRECT SZA CLA /SCALAR ARGS AS POSSIBLE JMP NOSCLR /TO REDUCE THE PROLOG ISZ TEMP2 /ROOM FOR ANY MORE SKP JMP NISA2 /NO, THE REST MUST MOVE VALUES NOSCLR, ISZ NARGS /LOOP SOME MORE JMP ARGLP2 JMS I (PLSUB2 /OUTPUT SOME TRACEBACK STUFF JMP I (MORE /GENERATE SCALAR, /LITERAL AND TEMP STORAGE NISA2, JMS I (PLSUB2 JMP NDLP3 /OUTPUT TRACEBACK /STUFF,THEN REST NISA, JMS I (PLSUB2 /GET PAST THE TRACEBACK STUFF ARGLP3, TAD XM3 /GENERATE ORG .+6 FOR D OR C DCA XNOP JMS PLSUB1 /OUTPUT REMAINING /SCALAR ARG SPACE SZA CLA JMP NDLP3 CDF 10 TAD I TEMP /TURN OFF SUBARG BIT AND (7757 /(THATS THE /SECOND TIME I FIXED THIS) DCA I TEMP NDLP3, ISZ NARGS JMP ARGLP3 CDF JMP I (MORE /GENERATE SCALAR, /LITERAL AND TEMP STORAGE NOARGS, JMS I (PLSUB2 /NO ARGS, OUTPUT TRACEBACK STUFF JMP I (MORE /GENERATE SCALAR, /LITERAL AND TEMP STORAGE PLSUB1, 0 CDF TAD I PLSUB1 /GET THE SKIP DCA PLSKIP ISZ PLSUB1 CDF 10 TAD I X10 /GET THE NEXT ARG IAC DCA TEMP /TYP WORD ADDR CLL CML RTR /2000=DIM BIT AND I TEMP PLSKIP, 0 /ARRAYS OR SCALARS ? JMP I PLSUB1 ISZ PLSUB1 CLA CMA TAD TEMP /DEFINE THIS VAR JMS I QOUTNAM TAD COMMA JMS I QOCHAR CDF 10 TAD I TEMP /LOOK AT THE TYPE CDF JMS I QSKPIRL /SKIP IF NOT C OR D XNOP, NOP /THIS IS CHANGED LATER (MAYBE) TAD XDP3 /.+3 OR .+6 DCA .+3 JMS I (INS2 /ORG FOR THE VALUE ORG;0 JMP I PLSUB1 TOOMNY, TAD P0F1 /TOO MANY ARRAY ARGS JMP I P0F2 XM3, CLL CML RTL PAGE / SCALARS, LITERALS & TEMPS HOLLIT, MORE, JMS I (TYPRTN /OUTPUT SCALARS SCALAR TAD (TEMPS /OUTPUT FIRST FIVE TEMPS JMS I (OUTVAR TAD (LITRL2 JMS I QOUTSYM TAD COMMA /OUTPUT %LITRL, JMS I QOCHAR JMS I (DOLIST INTLST O141, 0141;-3 /OUTPUT INTEGER LITERALS JMS I (DOLIST FPLIST 0142;-3 /OUTPUT FP LITERALS JMS I (DOLIST DPLIST 0144;-6 /DOUBLE LITERALS JMS I (DOLIST CMPLST 0143;-6 /COMPLEX LITERALS JMS I (TYPRTN /OUTPUT DIMENSION FACTORS DFLIT JMS I (ADFLIT /OUTPUT ARG DIM FACTOR LITERALS TAD (HOLIST /OUTPUT HOLLERITH LITERALS DCA ENTRY HOLLUP, CDF 10 TAD I ENTRY SNA JMP HOLDUN DCA ENTRY /SAVE NEW ENTYR TAD ENTRY DCA X10 TAD O141 /SET TYPE INFO DCA I X10 TAD LITNUM DCA I X10 /SAVE LIT DISP CLL CMA RTL /SET UP COUNTER DCA HOLLIT /BY THREES HOLOOP, CDF 10 /OUTPUT LITERAL AS OCTALS TAD I X10 CDF SNA JMP HOFILL /FILL OUT REST DCA ARG TAD ARG AND (77 /IS THIS LAST WORD? SZA CLA JMP .+4 /NO TAD ARG /YES, STICK IN TAD Q40 /BLANK JMP HOFILL+1 /AND OUTPUT IT TAD ARG /OUTPUT CHAR PAIR JMS ONUM ISZ HOLLIT JMP HOLOOP JMP HOLOOP-2 HOFILL, TAD (4040 /FILL WITH BLANKS JMS ONUM ISZ HOLLIT JMP HOFILL JMP HOLLUP /DO NEXT HOLLERITH LITERAL HOLDUN, CDF JMS I (TYPRTN /DO ARRAYS ARRAYS JMS I (TYPRTN /REMOVE COMMON VARS FROM S.T. COMVAR JMS I QOTAB TAD (XLBLE /#LBL=. JMS I QOUTSYM JMS I QCRLF CDF 10 /LOOK AT THE BLANK COMMON LIST TAD I (ONEI+2 /MAKE TRUE=INTEGER ONE DCA I (TRUE+2 TAD I (BLNKCN+1 CDF SNA JMP NOBC /NO BLANK COMMON DCA TYPE /POINTER TO VARIABLE LIST JMS I QOPCOD COMMON JMS I QCRLF CDF 10 BCLOOP, TAD TYPE /PROCESS THIS HUNK OF /BLANK COMMON DCA X10 TAD I X10 SNA JMP NXTBC /EMPTY HUNK CIA /SIZE OF HUNK DCA TEMP TAD I X10 /OUTPUT HUNK JMS I (OUTVAR CDF 10 ISZ TEMP JMP .-4 NXTBC, TAD I TYPE /ADDR OF NEXT HUNK SNA JMP NOBC /THAT WAS THE LAST HUNK DCA TYPE JMP BCLOOP /DO NEXT HUNK NOBC, CDF JMS I (TYPRTN /DO NAMED COMMONS COMNAM JMS I (TYPRTN /NOW EQUIVALENCES EQUIVS JMS INS2 ORG;XLBL /%ORG #LBL JMP I (PROLG2 /COMPLETE PROLOG PAGE / ARGUMENT PICKUP GENERATOR PROLG2, TAD FUNCTN /SECOND PART OF PROLOG SZA CLA JMP DORETN /NOT A MAIN PROG JMS I (INS /#ST, BASE #BASE XST;BASE;XBASE JMS I (INS2 / SETB #BASE SETB;XBASE JMS I (INS2 / SETX #XR SETX;XXR BDSWIT, JMP I (FINIST /GO GET OVERLAY DORETN, JMS I (INS /#RTN, BASE #BASE XRTN;BASE;XBASE TAD ARGLST /ANY ARGS ? SNA JMP JAGOBK /NO DCA X10 /POINTER TO THE LIST CDF 10 TAD I ARGLST /NUMBER OF ARGS CIA DCA NARGS DCA TEMP2 /ZERO ARG COUNTER CDF TAD NARGS /WILL WE RESTORE ANY ? TAD (6 SMA CLA JMP JAGOBK /NO JMS I (INS2 / FLDA #ARGS FLDA;XARGS JMS I (INS2 / FSTA #BASE FSTA;XBASE RSLOOP, CDF 10 TAD I X10 /GET NEXT ARG IAC DCA TEMP /ADDR OF TYPE WORD ISZ TEMP2 /INCR COUNT TAD I TEMP /IS IT A VALUE TRANSMISSION ? AND Q20 CDF SZA CLA JMP NOREST /NO, DON'T RESTORE IT JMS I QOPCDE / %LDX XXXX,1 LDX TAD TEMP2 JMS I QONUMBR TAD (C1 JMS I QOUTSYM JMS I QCRLF JMS I QGENCOD /STARTD SD-1 JMS I (INS2 /GET POINTER TO ARG FLDAI;XBASC1 JMS I (INS2 /AND SAVE IN #BASE+3 FSTA;XBASP3 JMS STFORE /INTO CORRECT MODE JMS I QOPCDE /FLDA VAR FLDA CMA TAD TEMP CDF 10 JMS I QOUTNAM JMS I QCRLF JMS I (INS2 / FSTA% #BASE+3 FSTAI;XBASP3 NOREST, ISZ NARGS JMP RSLOOP JMS I QGENCOD /MAKE SURE WE'RE IN F MODE QSFM1, SF-1 JAGOBK, TAD FUNCTN /WHAT WAS THIS ? SPA CLA JMP NOFVAL /NOT A FUNCTION CDF 10 /GET TYPE TAD I PROGNM AND Q17 TAD (FVAL-1 /PLUS TABLE ADDRESS DCA GVSKEL /GIVES POINTER TO /SKELETON ADDRESS TAD I GVSKEL /GET SKELETON ADDRESS DCA GVSKEL JMS I QGENCOD /PICK UP FUNCTION VALUE GVSKEL, 0 NOFVAL, JMS I (INS2 / JA #GOBAK JA;XGOBAK JMS I (INS /#ST, %STARTD XST;STARTD;0 JMS I QOTAB TAD (210 / %FLDA' 10 JMS I QONUMBR JMS I QCRLF JMS I (INS2 / %FSTA #GOBAK,0 FSTA;XGOBC0 JMP I (MORPLG STFORE, 0 /START F OR E CDF 10 TAD I TEMP /GET TYPE CDF JMS I QSKPIRL /SKIP ON I R OR L TAD (SE-SF /SE TAD QSFM1 /SF DCA .+2 JMS I QGENCOD 0 JMP I STFORE /DON'T FORGET TO /RETURN DUMMY XARGS, TEXT '#ARGS' PAGE / ENTRY AND EXIT CODE MORPLG, JMS I QOTAB TAD Q200 / FLDA' 0 JMS I QONUMBR JMS I QCRLF JMS I (INS2 / %SETX #XR SETX;XXR JMS I (INS2 / %SETB #BASE SETB;XBASE TAD ARGLST /ANY ARGS ? SNA JMP I (ENDPLG /NO, JUST STARTF DCA ARG /SAVE POINTER TO THEM JMS I (INS2 / %LDX 0,1 LDX;ZC1 JMS I (INS2 / %FSTA #BASE FSTA;XBASE JMS I (INS2 / %FSTA #ARGS FSTA;XARGS CDF 10 TAD I ARGLST /NUMBER OF ARGS CIA DCA NARGS GALOOP, CDF JMS I (INS2 / %FLDA I #BASE,1+ FLDAI;XBAC1P DCA TYPE /CLEAR THE SD SWITCH CDF 10 ISZ ARG /GET TO NEXT ARG TAD I ARG /LOOK AT ITS TYPE WORD IAC DCA TEMP CLL CML RTR AND I TEMP /WAS IT DIMENSIONED ? SNA CLA JMP I (TSTABT /NO, SEE IF ITS VALUE CMA TAD TEMP /GET ADDR OF DIM INFO JMS I QGETSS IAC /ADDR OF SIZE DCA TEMP2 TAD I TEMP2 ISZ TEMP2 ISZ TEMP2 SNA CLA JMP OUFSTA+1 /IT HAS A VARIABLE DIMENSION TAD I TEMP2 /GET MAGIC NUMBER LIT DISP DCA TEMP2 CDF JMS I QOPCDE / %FSUB #LIT+XXXX FSUB TAD QLITRL JMS I QOUTSYM TAD TEMP2 JMS I QONUMBR JMS I QCRLF CDF 10 OUFSTA, DCA I ARG /IT ISN'T VARIABLY DIMENSIONED CDF JMS I QOPCDE / %FSTA ARGN FSTA CDF 10 CMA TAD TEMP JMS I QOUTNAM JMS I QCRLF ISZ NARGS SKP JMP I (ENDPLG /END OF PROLOG TAD TYPE /DID WE LEAVE D MODE SNA CLA JMP GALOOP /NO JMS I QGENCOD /YES, OUTPUT AN %SD SD-1 JMP GALOOP FINIST, CDF 10 TAD FUNCTN /WAS THIS A FUNCTION ? SPA SNA CLA JMP .+4 /NO, SKIP THIS TAD I PROGNM /YES, TURN OFF EXT BIT AND (6777 /ALLOWING STORING IN FUN NAME DCA I PROGNM TAD (2200 /CHECK /N /Q AND I (7644 CDF SNA CLA NODBUG, DCA I (DEBUG /IF NOT SET, PUT ISN'S CDF 10 /INTO CODE TAD I (7644 /IS /Q SET ? CDF AND (0200 SZA CLA ISZ I (OPTMYZ /MAKE A CLA IAC FROM A CLA GFNAME, CDF 10 TAD I FNAME /MOVE FILE NAME CDF DCA I NAMEF /INTO PAGE ISZ FNAME ISZ NAMEF ISZ NFCNT JMP GFNAME JMP I (RDOVLY /GO WHERE ? /CALIFORNIA OF COURSE!!!! FNAME, 7601 NAMEF, F1LNAM NFCNT, -4 ONUM, 0 ISZ LITNUM /BUMP LITERAL COUNTER DCA ARG JMS I QOTAB TAD ARG JMS I QONUMBR JMS I QCRLF JMP I ONUM PAGE / ENTRY AND EXIT CODE TSTABT, TAD I TEMP /VALUE TRANSMISSION ? AND Q20 SZA CLA JMP I (OUFSTA /NO CDF JMS I (INS2 / %FSTA #BASE+3 FSTA;XBASP3 JMS I (STFORE /ENTER CORRECT MODE JMS I (INS2 / %FLDA% #BASE+3 FLDAI;XBASP3 ISZ TYPE /SET SWITCH JMP I (OUFSTA-1 ENDPLG, JMS I QGENCOD /%SF SF-1 TAD ARGLST /ANY VARIABLY /DIMENSIONED ARRAYS ? SNA JMP I (FINIST /NO ARGS AT ALL DCA X10 CDF 10 TAD I ARGLST /NUMBER OF ARGS CIA DCA NSARGS VDIMLP, CDF 10 TAD I X10 /GET NEXT ARG SNA JMP NDVDIM /NOT A VARIABLY /DIMENSIONED ARRAY DCA VDTEMP TAD VDTEMP /GET ADDR OF DIMENSION INFO JMS I QGETSS DCA VDTMP2 TAD I VDTMP2 /NUMBER OF DIMENSIONS CIA DCA NARGS ISZ VDTMP2 /MOVE TO MAGIC NUMBER LITERAL ISZ VDTMP2 ISZ VDTMP2 TAD I VDTMP2 /GET IT CDF DCA MNL /SAVE MAGIC NUMBER LITERAL TAD (FLDA /JUST LOAD FIRST DIM DCA MNOPC TAD NARGS /GET ADDRESS CIA /OF THE LAST TAD VDTMP2 /DIMENSION DCA VDTMP2 /FOR THE SIZE GETTER JMP CMPMN3 /SKIP MULTIPLY FIRST TIME CMPMN1, TAD (FMUL /NEXT TIME USE A MULTIPLY DCA MNOPC JMS I QOPCOD /NEXT SUBSCRIPT (ALWAYS (1.0) FADD JMS I QOADDR /NOW ADDRESS (ONEI CMPMN3, ISZ NARGS /ANY MORE SS ? JMP CMPMN2 /YES ISZ VDTEMP /GET TO TYPE CDF 10 TAD I VDTEMP CDF JMS I QSKPIRL /SKIP ON I R L TAD Q6M3 /YES TAD (THREE JMS LDAMUL /3.02 JMS I (INS2 /ALN 0 ALN;D0 JMS I QOPCDE FSTA TAD QLITRL /SAVE IN THE MAGIC /NUMBER LITERAL JMS I QOUTSYM CLA CMA TAD MNL JMS I QONUMBR JMS I QCRLF JMS I (INS2 /FNEG FNEG;0 JMS I (INS2 /ENTER D MODE STARTD;0 JMS I QOPCDE FADDM /NOW MODIFY THE POINTER CMA TAD VDTEMP CDF 10 JMS I QOUTNAM JMS I QCRLF JMS I (INS2 /RETURN TO F MODE STARTF;0 NDVDIM, ISZ NSARGS /ANY MORE ARGS TO CHECK? JMP VDIMLP /YES CDF JMP I (FINIST CMPMN2, CLA CMA /BACK UP THE POINTER TAD VDTMP2 /BY ONE DCA VDTMP2 CDF 10 TAD I VDTMP2 /GET IT CDF JMS LDAMUL /3.02 JMP CMPMN1 /LOOP VDTEMP, 0 VDTMP2, 0 NSARGS, 0 MNL, 0 DP12, TEXT '.+14' LDAMUL, 0 /3.02 DCA MNADR JMS I QOPCOD MNOPC, 0 JMS I QOADDR MNADR JMP I LDAMUL MNADR, 0 PAGE / RANDOM PROLOG STUFF ARRAYS, 0 /OUTPUT ARRAYS TAD I TYPE AND (6220 /IS IT AN ARRAY SNA JMP I ARRAYS AND (4220 /NOT COMMON, EQUIV OR ARG SZA CLA JMP I ARRAYS JMS I (UNHOOK /REMOVE FROM BUCKET TAD ENTRY /OUTPUT VARIABLE JMS I (OUTVAR JMP TFUDGE-1 FILL, 0 /FILL SUB NAME WITH BLANKS CLL CML RTL TAD PROGNM /PROGNM+2 CIA /-PROGNM-2 TAD I XNAMP /1,2,3 TAD QM4 /-3,-2,-1 DCA TEMP JMP .+5 TAD (240 /TWO BLANKS FOR EACH WORD JMS I QOCHAR TAD (240 JMS I QOCHAR ISZ TEMP /MORE ? JMP .-5 /YES JMP I FILL XNAMP, NAMPTR NPRNT, 0 JMS I QTTYP2C JMS I QTTYP2C TAD I X10 /NOW NUMBER JMS I QTTYP2C TAD I X10 JMS I QTTYP2C TAD I X10 JMS I QTTYP2C JMS I QTTCRLF JMP I NPRNT /ROUTINE TO FIX UP NEGATIVE EQUIVALENCE OFFSETS NEGSLV, 0 TAD I TYPE AND Q200 SNA CLA /IS VARIABLE A SLAVE? JMP I NEGSLV /NO TAD TYPE DCA X10 TAD I X10 /GET POINTER TO EQUIV BLOCK DCA X10 CLA IAC TAD I X10 /GET POINTER TO MASTER DCA OLDM /TYPE WORD TAD I X10 /OFFSET FROM MASTER CMA STL TAD I X10 /SUBTRACT FROM SLAVE OFFSET DCA SFUDGE /SAVE IN CASE WE NEED IT TAD I OLDM /IF MASTER IS IN COMMON FORGET THE NEXT TEST: SZL SPA CLA /IF MASTER OFFSET < SLAVE OFFSET THEN JMP I NEGSLV /SLAVE WILL ORIGIN BEFORE MASTER - TAD I TYPE /THEREFORE THE SLAVE MUST BECOME THE MASTER AND (7577 /UNSLAVE THE SLAVE DCA I TYPE ISZ TYPE TAD I TYPE DCA TYPE1 /TYPE1 POINTS TO EQUIV BLOCK CLA IAC TAD TYPE1 DCA X10 /USE AUTO-XR TO CLEAR OFFSETS TAD ENTRY DCA NEWM TAD I OLDM /GET OLD MASTER'S TYPE WD TAD Q200 DCA I OLDM /MAKE IT A SLAVE ISZ OLDM TAD I TYPE1 /GET POINTER TO SLAVE DIMENSION BLOCK DCA I TYPE /PUT IT IN SYMTAB AS BEFITTING A NEW MASTER TAD I OLDM /GET OLD MASTERS DIM PTR DCA I TYPE1 /PUT IT IN EQUIV BLOCK AS BEFITTING A NEW SLAVE TAD TYPE1 /NOW ASSOCIATE THE EQUIV BLOCK DCA I OLDM /WITH THE NEW SLAVE DCA I X10 /AND MAKE BOTH OFFSETS 0 DCA I X10 /("FIXSLV" WILL ADJUST IT - NOTE THE "MASTER" CDF 0 /WD OF THE BLOCK STILL POINTS TO THE OLD MASTER) JMS I (TYPRTN /** RECURSIVE CALL ** - ACTUALLY WE DON'T CARE FIXSLV /SINCE WE AREN'T RETURNING ANYWAY JMP I (FIXELP /TRY AGAIN FROM SCRATCH /ROUTINE TO ADJUST ALL SLAVES OF THE OLD MASTER /TO BE SLAVES OF THE NEW MASTER FIXSLV, 0 /THROUGHOUT TAD I TYPE AND Q200 SNA CLA /IS IT A SLAVE? JMP I FIXSLV /NO ISZ TYPE CLA IAC TAD I TYPE DCA TYPE /TYPE NOW POINTS TO THE EQUIV BLOCK CLA IAC TAD I TYPE /GET PTR TO THIS SLAVES MASTER (+1) CMA TAD OLDM /COMPARE MASTERS SZA CLA JMP I FIXSLV /NOT UNDER SAME MASTER - LEAVE TAD NEWM DCA I TYPE /"MEET THE NEW BOSS..... ISZ TYPE / SAME AS THE OLD BOSS...." TAD I TYPE / (THE WHO) TAD SFUDGE /ADD IN THE DIFFERENCE BETWEEN OLD AND NEW IAC /MASTERS TO THE MASTER OFFSET DCA I TYPE JMP I FIXSLV /THE SLAVE IS NOW -- A SLAVE! OLDM, 0 NEWM, 0 SFUDGE, 0 PAGE / ENTRY AND EXIT CODE PLSUB2, 0 /DUMB SUBR FOR PROLOG CDF JMS INS2 / %ORG #BASE+30 ORG;XBAP30 JMS INS2 / %FNOP FNOP;0 JMS INS2 / %JA #RET JA;XRET JMS INS2 / FNOP FNOP;0 JMS INS /#GOBAK,ORG .+2 XGOBAK;DBLZRO;0 /**TO INSURE IT'S 0 TAD DPUSED /WAS DOUBLE PRECISSION USED ? SNA CLA JMP NDPUSD /NO, NO NEED FOR TEMP JMS INS XDPTMP;ORG;DP12 /#DPT, ORG .+12 JMS INS2 DPCHK;0 NDPUSD, TAD FUNCTN /FUNCTION OR SUBR ? SNA JMP I PLSUB2 /ITS #MAIN, NO #VAL OR #ARGS SPA CLA JMP .+5 /ITS A SUBROUTINE, NO #VAL JMS INS /#VAL, %ORG .+6 XVAL;ORG;DP6 JMS INS /#ARGS, %ORG .+3 XARGS;ORG;DP3 JMP I PLSUB2 INS2, 0 / %OPCOD ADDR TAD INS2 /COMMONIZE RETURNS DCA INS JMP INS3 INS, 0 /TAG, %OPCOD ADDR TAD I INS /GET TAG FIELD ISZ INS JMS I QOUTSYM /OUTPUT IT TAD COMMA JMS I QOCHAR INS3, JMS I QOTAB TAD I INS /GET OPCODE ISZ INS JMS I QOUTSYM TAD I INS /GET ADDR SNA CLA JMP .+4 /NO ADDRESS JMS I QOTAB TAD I INS JMS I QOUTSYM ISZ INS JMS I QCRLF JMP I INS SECT, TEXT 'SECT' XRET, TEXT '#RET' XXR, TEXT '#XR' XGOBAK, TEXT '#GOBAK' XST, TEXT '#ST' XGOBC0, TEXT '#GOBAK,0' XBAP30, TEXT '#BASE+30' FNOP, TEXT 'FNOP' SETX, TEXT 'SETX' SETB, TEXT 'SETB' TEXTX, TEXT 'TEXT' XBASC1, TEXT '#BASE,1' DP3, TEXT '.+3' DP6, TEXT '.+6' ZC1, TEXT '0,1' FLDAI, TEXT 'FLDA%' FSTAI, TEXT 'FSTA%' XLBLE, TEXT '#LBL=.' C1, TEXT ',1' XLBL, TEXT '#LBL' /STACK-5 CAN'T BE 0 DBLZRO, TEXT '0;0' PAGE / SYMBOL TABLE PROCESSING ROUTINES IMPLCT, 0 /DO IMPLICIT TYPING TAD I TYPE AND O100 /WAS IT EXPLICITLY TYPED SZA CLA JMP I IMPLCT /YES TAD BUCKET /IS IT INTEGER ? TAD M317 CLL TAD M006 SNL CLA ISZ I TYPE /TYPE IT REAL ISZ I TYPE /TYP IT INTEGER JMP I IMPLCT O100, DFLIT, 100 /GENERATE FACTORS FOR CALLS CLL CML RTR /DIMENSIONED ? AND I TYPE SNA CLA JMP I DFLIT /NO TAD I TYPE DCA TEMP /SET PROPER WDS/ENTRY FOR VMC TAD ENTRY /GET ADDR OF MAGIC NUMBER JMS I QGETSS TAD (2 DCA TYPE TAD I ENTRY /SAVE LINK DCA DFTEMP TAD BUCKET /FIX NAME DCA I ENTRY TAD I TYPE /GET MAGIC NUMBER DCA TEMP2 ISZ TYPE CDF JMS I (ONUM /OUTPUT A ZERO WORD JMS I QOPCDE JA TAD ENTRY /OUTPUT VAR MINUS CONST JMS I (VMC JMS I QCRLF /END LITERAL CDF 10 TAD LITNUM /SAVE NUMBER IN DIM INFO DCA I TYPE ISZ LITNUM /THEN BY 2 MORE ISZ LITNUM TAD DFTEMP /RESTORE ENTRY DCA I ENTRY JMP I DFLIT M006, DFTEMP, EXTRNL, 6 /DO EXTERNALS TAD I TYPE AND O1000 /IS IT EXT ? SNA CLA JMP I EXTRNL JMS I (UNHOOK /REMOVE THIS SYMBOL TAD PROGNM /IS IT THE PROG NAME ? CIA TAD ENTRY SZA CLA JMP .+5 /NO, OUTPUT EXTERN TAD FUNCTN /IS IT A MAIN PROG ? SNA CLA JMP TFUDGE-1 /YES, NO SECT TAD (SECT-EXTERN /NOT MAIN, OUTPUT SECT TAD XTRN DCA M317 CDF JMS I QOPCDE M317, -317 TAD ENTRY /NOW VAR NAME CDF 10 JMS I QOUTNAM JMS I QCRLF JMP TFUDGE-1 O1000, EQUIVS, 1000 /OUTPUT EQUIVALENCES TAD I TYPE AND Q200 /IS THIS A SLAVE ? SNA CLA JMP I EQUIVS /NO JMS I (UNHOOK /UNHOOK THE ENTRY TAD I TYPE /SAVE THE TYPE WORD DCA TYPE1 ISZ TYPE /POINT TO EQUIVALENCE BLOCK TAD I TYPE DCA X10 CDF JMS I QOPCDE /OUTPUT ORG ORG CDF 10 TAD I X10 /MASTER NAME DCA X11 /SAVE IT TAD X11 JMS I QOUTNAM /OUTPUT IT TAD PLUS /+ JMS I QOCHAR CDF 10 TAD I X11 /MASTER SS JMS SUBRX TAD Q255 /MINUS JMS I QOCHAR CDF 10 TAD TYPE1 /SLAVE SS JMS SUBRX JMS I QCRLF /EOL CDF 10 TAD ENTRY /NOW OUTPUT SLAVE JMS I (OUTVAR JMP TFUDGE-1 XTRN, SUBRX, EXTERN JMS I QSKPIRL /SIZE OF THING TAD Q3 TAD Q3 /TIMES 3 OR 6 DCA MQ TAD I X10 CDF JMS I QMUL12 /MAKE THE PRODUCT JMS I QNUMBRO /OUT WITH IT JMP I SUBRX DPCHK, TEXT 'DPCHK' FADDM, TEXT 'FADDM' PAGE / SYMBOL TABLE PROCESSING ROUTINES BASE, TEXT 'BASE' OUTVAR, 0 /ALLOCATE STORAGE FOR A VARIABLE DCA VARADR RDF /GET FIELD OF VAR TAD X6201 DCA OVFLD1 TAD OVFLD1 DCA OVFLD2 TAD VARADR /OUTPUT NAME, JMS I QOUTNAM TAD COMMA JMS I QOCHAR JMS I QOPCDE /OUTPUT ORG ORG ISZ VARADR /POINT TO TYPE WROD OVFLD1, 0 TAD I VARADR /GET TYPE X6201, CDF JMS I QSKPIRL TAD Q3 /PER ENTRY TAD Q3 /INTEGER, REAL, AND /LOGICAL 3WORDS DCA MQ DCA AC OVFLD2, 0 CLL CML RTR /CHECK DIM BIT AND I VARADR SNA CLA JMP PLSDOT /NOT DIMENSIONED TAD I VARADR /LOOK AT TYPE ISZ VARADR /MOVE TO EQ DIM POINTER AND Q200 /EQUIVALENCED ? SNA CLA JMP .+3 /NO TAD I VARADR /YES, SKIP EQUIV INFO DCA VARADR TAD I VARADR /ADDRESS OF DIM INFO IAC DCA VARADR /ADDRESS OF SIZE TAD I VARADR /GET TOTAL SIZE CDF JMS I QMUL12 PLSDOT, CDF TAD Q256 JMS I QOCHAR TAD PLUS JMS I QOCHAR JMS I QNUMBRO JMS I QCRLF JMP I OUTVAR SCALAR, 0 /OUTPUT SCALARS TAD I TYPE /IS IT A SCALAR ? AND (7630 /COM, DIM, EXT, ASF, /EQV, ARG, COMMONNAME SZA CLA JMP I SCALAR /NO JMS I (UNHOOK /DELETE THIS FROM THE LIST TAD ENTRY /OUTPUT THIS VARIABLE JMS OUTVAR JMP TFUDGE-1 VARADR, DOLIST, 0 /PROCESS A LITERAL LIST TAD I DOLIST /GET LIST START DCA ENTRY ISZ DOLIST TAD I DOLIST DCA TYPE /GET TYPE BITS ISZ DOLIST TAD I DOLIST ISZ DOLIST DCA LSIZE /GET LITERAL SIZE CDF 10 DLLOOP, TAD I ENTRY /GET NEXT ENTRY SNA JMP DLRETN /NO MORE DCA ENTRY TAD ENTRY DCA X10 /ADDRESS OF TYPE WORD TAD TYPE /PUT IN TYPE DCA I X10 TAD X10 /SAVE THIS ADDR DCA X11 TAD LSIZE /SIZE OF LITERAL DCA TEMP LITLUP, CDF JMS I QOTAB CDF 10 TAD I X10 CDF JMS I QONUMBR JMS I QCRLF ISZ TEMP JMP LITLUP CDF 10 TAD LITNUM /SAVE LITERAL NUMBER DCA I X11 TAD LSIZE /INCREMENT LITERAL NUMBER CIA TAD LITNUM DCA LITNUM JMP DLLOOP DLRETN, CDF JMP I DOLIST TEMPS, 243;2000;TMPSIZ;2415;2000 TMPSIZ, 1;TMPBLK+1 LSIZE, COMVAR, 0 /REMOVE COMMON VARS FROM ST TAD I TYPE AND (4400 /ALSO ASF NAMES SNA CLA JMP I COMVAR JMS I (UNHOOK JMP TFUDGE-1 LITRL2, TEXT '#LIT' COMMON, TEXT 'COMMON' PAGE / SYMBOL TABLE PROCESSING ROUTINES TYPRTN, 0 /PROCESS ENTIRE SYMBOL TABLE TAD I TYPRTN /GET ROUTINE ADDRESS DCA ROUTNE ISZ TYPRTN TAD O301 /START WITH 'A' DCA BUCKET TAD M32 /BUCKET COUNT DCA BCNT TYPLP2, TAD BUCKET /GET START OF NEXT LIST TAD ALM301 TYPLUP, DCA OENTRY /SAVE OLD ENTRY ADDRESS CDF 10 TFUDGE, TAD I OENTRY /GET ADDR OF NEXT ENTRY SNA JMP EOL /0 MEANS END OF LIST DCA ENTRY IAC TAD ENTRY /ADDR OF TYPE WORD DCA TYPE JMS I ROUTNE /CALL ROUTINE TAD I OENTRY /CONTINUE DOWN THE LIST JMP TYPLUP EOL, ISZ BUCKET /DO NEXT LETTER ISZ BCNT JMP TYPLP2 CDF JMP I TYPRTN /END OF PASS BCNT=ARG1 COMNAM, 0 /OUTPUT A COMMON BLOCK TAD I TYPE /IS THIS A COMMON BLOCK NAME TAD M111 SZA CLA JMP I COMNAM /NO CDF JMS I QOPCDE COMMON CDF 10 JMS I (UNHOOK /REMOVE THE COMMON /BLOCK FROM S.T. TAD ENTRY JMS I QOUTNAM /OUTPUT NAME JMS I QCRLF ISZ TYPE /GET TO COMMON STUFF POINTER CNLOOP, CDF 10 TAD I TYPE /GET ADDR OF NEXT HUNK /OF COMMON SNA JMP TFUDGE /END OF IT DCA TYPE TAD TYPE /GET A WORKING POINTER DCA X10 TAD I X10 /GET COUNT SNA JMP CNLOOP /NONE IN THIS HUNK CIA DCA TEMP2 TAD I X10 /GET VARIABLE ADDRESS JMS I (OUTVAR /OUTPUT IT CDF 10 ISZ TEMP2 JMP .-4 /DO NEXT ONE FROM THIS HUNK JMP CNLOOP /DO NEXT HUNK O301, 301 M32, -32 ALM301, ALIST-301 M111, -111 ROUTNE, ADFLIT, 0 /OUTPUT ARG DF LITS TAD ARGLST /ANY ARGS SNA JMP I ADFLIT DCA X10 CDF 10 TAD I ARGLST /NUMBER OF ARGS CIA DCA NARGS ADFLUP, CDF 10 TAD I X10 /GET ARG ADDR IAC DCA TEMP /TYPE WORD ADDR TAD I TEMP /GET TYPE INFO DCA TEMP2 CLL CML RTR AND I TEMP /DIMENSIONED ? SNA CLA JMP NDADFL /NO ISZ TEMP /ADDR OF DIM INFO CLL CML RTL TAD I TEMP /ADDR OF MAGIC NUMBER DCA TEMP TAD I TEMP /MAGIC NUMBER DCA MQ /PREPARE TO MULTIPLY ISZ TEMP /ADDR OF LITERAL GOES HERE TAD LITNUM /STICK IN THE ADDRESS IAC DCA I TEMP CDF JMS I (ONUM /OUTPUT A ZERO TAD TEMP2 /LOOK AT TYPE JMS I QSKPIRL /SKIP ON I R L TAD (3 /DOUBLE OR COMPLEX TAD (3 JMS I QMUL12 TAD AC /OUTPUT 2 WORD LITERAL JMS I (ONUM TAD MQ JMS I (ONUM NDADFL, ISZ NARGS JMP ADFLUP JMP I ADFLIT RDOVLY, JMS I (7607 /READ IN OVERLAY NPOVLY OVRLAY PASS2O, 0 JMP I (INERR TAD I (VOVER /CHECK VERSION OF OVERLAY TAD VERS SZA CLA JMP I (VERROR /ERROR, MIXED VERSIONS JMP I (EOSTMT /START PASS2 PROPER PAGE FIELD 1 *5000 0 /THIS IS THE START OF /THE ERROR MESSAGE LIST /WHICH WORKS BACKWARDS /OS/8 F4 COMPILER CODE SKELETONS MAC=-6 NEGSGN=-5 FLDAA2=-4 FLDAA1=-3 ENTERE=-2 ENTERF=-1 CGTCOD, ATX;DD1;STARTD;0;FLDA;DP2C1;STARTF;0 AGTCOD, JAC;0;0 ASNCOD, ENTERF;FLDA;DP3C0;JA;DP4;0 ERCODE, EXTERN;XUE;TRAP3;XUE;0 A0FN, EXTERN;XFIX;JSA;XFIX;0 A0SD, ALN;D0 SD, STARTD;0;0 SE, STARTE;0;0 SF, STARTF;0;0 MPTR0, ENTERF;FLDAA1;FSTA;XBASE;0 MPTR3, ENTERF;FLDAA2;FSTA;XBASP3;0 JADP2, JA;DOT;0 DOFIN0, ENTERF;FLDAA1;FADD;-2 ASTOR, FSTA;-1;0 DOFIN1, ENTERF;FLDAA1;FADD;-2;MAC+A0FN;FSTA;-1;0 LDASTD, FLDAA1;STARTD;0;0 /CHALK UP ONE FOR PAL8 ATX1, ATX;DD1;0 LXM1C2, LDX;M1C2;STARTD;0;0 FVAL, FVI-1;FVI-1;FVC-1;FVD-1;FVI-1 FVI, FLDA;XVAL;0 FVC, STARTE;0;FLDA;XVAL;MAC+PCAC;0 FVD, STARTE;0;FLDA;XVAL;0 RTNCOD, RTNX+MAC;JA;XRTN;0 PAZCOD, ENTERF;EXTERN;XPAUSE;JSR;XPAUSE;0 STPCOD, RTNX+MAC;EXTERN;XEXIT;JSR;XEXIT;0 GIRL1, ENTERF;FLDAA1;ENTERE;0 GIRL2, ENTERF;FLDAA2;ENTERE;0 SEGCAC, GCAC, ENTERE;EXTERN;CAC;FLDA;CAC;0 PCAC, EXTERN;CAC;FSTA;CAC;0 GC1C2, ENTERE;FLDAA1;EXTERN;CAC;FSTA;CAC;FLDAA2;0 GC1, ENTERE;FLDAA1;0 GC2, ENTERE;FLDAA2;0 JSACEQ, EXTERN;CEQ;JSA;CEQ;NEGSGN;0 JSACNG, EXTERN;CNEG;JSA;CNEG;0 JSACAD, EXTERN;CADD;JSA;CADD;0 JSACSB, EXTERN;CSUB;JSA;CSUB;0 JSACML, EXTERN;CMUL;JSA;CMUL;0 JSACDV, EXTERN;CDIV;JSA;CDIV;0 / ADD, SUBTRACT, MULTIPLY, AND DIVIDE SKELETONS ADDTBL, AS-1;AS+2;AS+4 AX-1;AX+2;AX+5 AS-1;AD-1;AS+4 ASC-1;ASC+2;ASC+3 ASD-1;ASD+7;ASD+10 ACS-1;ACS+4;ACS+6 ADS-1;ADS+3;ADS+7 0 FNEG;0 AS, FADD;-1;0 ENTERF;FLDAA1 FADD;-2;0 JSACNG+MAC AX, GC1+MAC;JSACAD+MAC;0 GC1C2+MAC;JSACAD+MAC;0 GC2+MAC;JSACAD+MAC;0 AD, ENTERE;FLDAA1;FADD;-2;0 JSACNG+MAC ASC, GIRL1+MAC;JSACAD+MAC;0 GIRL1+MAC ENTERE;PCAC+MAC;GC2+MAC;JSACAD+MAC;0 FNEG;0 ASD, FSTA;XDPTMP;ENTERF;FLDAA1;ENTERE;FADD;XDPTMP;0 GIRL1+MAC ENTERE;FADD;-2;0 JSACNG+MAC ACS, ENTERE;PCAC+MAC;GC1+MAC;JSACAD+MAC;0 GC1+MAC;PCAC+MAC GIRL2+MAC;JSACAD+MAC;0 FNEG;0 ADS, ENTERE;FADD;-1;0 GIRL2+MAC;FADD;-1;0 FSTA;XDPTMP;GIRL2+MAC;FADD;XDPTMP;0 SUBTBL, AS-3;SS-1;SS+1 AX-2;SX-1;SX+2 AS-3;SDBL-1;SS+1 ASC-2;SSX-1;SSX ASD-3;SSD-1;SSD ACS-2;SCS-1;SCS+1 ADS-3;SDS-1;SDS5-1 0 SS, ENTERF;FLDAA1 FSUB;-2;0 SX, GC1C2+MAC;JSACSB+MAC;0 GC2+MAC;JSACSB+MAC;0 SDBL, ENTERE;FLDAA1;FSUB;-2;0 SSX, GIRL1+MAC ENTERE;PCAC+MAC;GC2+MAC;JSACSB+MAC;0 SSD, GIRL1+MAC ENTERE;FSUB;-2;0 SCS, GC1+MAC;PCAC+MAC GIRL2+MAC;JSACSB+MAC;0 SDS, GIRL2+MAC;FNEG;0;FADD;-1;0 SDS5, FSTA;XDPTMP;GIRL2+MAC;FNEG;0;FADD;XDPTMP;0 MULTBL, M1-1;M1+3-1;M1+5-1 M4-1;M4+3-1;M4+6-1 M1-1;M7-1;M7+2-1 M8-1;M8+3-1;M8+4-1 M11-1;M11+6-1;M11+7-1 M14-1;M14+5-1;M14+7-1 M18+1-1;M18-1;M18+5-1 0 M1, FMUL;-1;0 ENTERF;FLDAA1 FMUL;-2;0 M4, GC1+MAC;JSACML+MAC;0 GC1C2+MAC;JSACML+MAC;0 GC2+MAC;JSACML+MAC;0 M7, ENTERE;FLDAA1;FMUL;-2;0 M8, GIRL1+MAC;JSACML+MAC;0 GIRL1+MAC ENTERE;PCAC+MAC;GC2+MAC;JSACML+MAC;0 M11, FSTA;XDPTMP;GIRL1+MAC;FMUL;XDPTMP;0 GIRL1+MAC ENTERE;FMUL;-2;0 M14, ENTERE;PCAC+MAC;GC1+MAC;JSACML+MAC;0 GC1+MAC;PCAC+MAC GIRL2+MAC;JSACML+MAC;0 M18, GIRL2+MAC ENTERE;FMUL;-1;0 FSTA;XDPTMP;GIRL2+MAC;FMUL;XDPTMP;0 DIVTBL, 1;D2-1;D2+2-1 1;D5-1;D5+3-1 1;D7-1;D7+2-1 1;D9-1;D10-1 1;D12-1;D13-1 1;D14-1;D15-1 1;D16-1;D17-1 0 D2, ENTERF;FLDAA1 FDIV;-2;0 D5, GC1C2+MAC;JSACDV+MAC;0 GC2+MAC;JSACDV+MAC;0 D7, ENTERE;FLDAA1;FDIV;-2;0 D9, GIRL1+MAC D10, ENTERE;PCAC+MAC;GC2+MAC;JSACDV+MAC;0 D12, GIRL1+MAC D13, ENTERE;FDIV;-2;0 D14, GC1+MAC;PCAC+MAC D15, GIRL2+MAC;JSACDV+MAC;0 D16, GIRL2+MAC;FSTA;XDPTMP;FLDAA1;FDIV;XDPTMP;0 D17, FSTA;XDPP6;GIRL2+MAC;FSTA;XDPTMP;FLDA;XDPP6;FDIV;XDPTMP;0 / RELATIONALS AND LOGICALS SKELETON TABLES EQTABL, EQ1-1;EQ2-1;EQ3-1 EQ4-1;EQ5-1;EQ6-1 EQ1-1;EQ7-1;EQ3-1 EQ8-1;EQ9-1;EQ10-1 EQ11-1;EQ12-1;EQ13-1 EQ14-1;EQ15-1;EQ16-1 EQ17-1;EQ18-1;EQ19-1 EQ1-1;EQ2-1;EQ3-1 EQ1, FSUB;-1;0 EQ2, ENTERF;FLDAA1 EQ3, FSUB;-2;0 EQ4, GC1+MAC;JSACEQ+MAC;0 EQ5, GC1C2+MAC;JSACEQ+MAC;0 EQ6, GC2+MAC;JSACEQ+MAC;0 EQ7, ENTERE;MAC+EQ2+1;0 EQ8, GIRL1+MAC;JSACEQ+MAC;0 EQ9, GIRL1+MAC EQ10, ENTERE;PCAC+MAC;GC2+MAC;JSACEQ+MAC;0 EQ11, MAC+ASD-2;0 EQ12, GIRL1+MAC EQ13, MAC+SSD+1;0 EQ15, GIRL2+MAC EQ14, ENTERE;PCAC+MAC;GC1+MAC;JSACEQ+MAC;0 EQ16, GIRL2+MAC;JSACEQ+MAC;0 EQ18, GIRL2+MAC EQ17, MAC+ADS-2;0 EQ19, MAC+SDS5;0 LETABL, LE1-1;LE2-1;LE3-1 0;0;0 LE1-1;LE4-1;LE3-1 0;0;0 LE11-1;LE12-1;LE13-1 0;0;0 LE17-1;LE18-1;LE19-1 0 LE1, FSUB;-1;NEGSGN;0 LE2, ENTERF;FLDAA1 LE3, FSUB;-2;0 LE4, ENTERE;MAC+LE2+1;0 LE11, MAC+ASD-2;0 LE12, GIRL1+MAC LE13, MAC+SSD+1;0 LE18, GIRL2+MAC LE17, MAC+ADS-2;0 LE19, MAC+SDS5;0 ANDTBL, 0;0;0 0;0;0 0;0;0 0;0;0 0;0;0 0;0;0 0;0;0 M1-1;M1+3-1;M1+5-1 ORTABL, 0;0;0 0;0;0 0;0;0 0;0;0 0;0;0 0;0;0 0;0;0 AS-1;AS+2;AS+4 EQVTBL, 0;0;0 0;0;0 0;0;0 0;0;0 0;0;0 0;0;0 0;0;0 EQ1-1;EQ2-1;EQ3-1 /CONVERSION-FOR-STORE-OPERATOR SKELETONS STRTBL, SIIM-1;SIRM-1;SICM-1;SIDM-1;SIIM-1 SIIA-1;SIRA-1;SICA-1;SIDA-1;SIIA-1 SIIM-1;SIIM-1;SRCM-1;SRDM-1;SIIM-1 SIIA-1;SIIA-1;SRCA-1;SRDA-1;SIIA-1 SCIM-1;SCIM-1;SCCM-1;SCDM-1;SCIM-1 SCIA-1;SCIA-1;SCCA-1;SCDA-1;SCIA-1 SDIM-1;SDIM-1;SDCM-1;SDDM-1;SDIM-1 SDIA-1;SDIA-1;SDCA-1;SDDA-1;SDIA-1 SLIM-1;SLIM-1;SLCM-1;SLDM-1;SIIM-1 SLIA-1;SLIA-1;SLCA-1;SLDA-1;SIIA-1 SIIM, ENTERF;FLDAA2 SIIA, 0 SIRM, ENTERF;FLDAA2 SIRA, A0FN+MAC;0 SICM, GC2+MAC;PCAC+MAC SICA, ENTERF;GCAC+1+MAC;A0FN+MAC;0 SRCM, GC2+MAC;PCAC+MAC SRCA, ENTERF;GCAC+1+MAC;0 SCCM=GC2 SCIM, ENTERF;FLDAA2 SCIA, ENTERE;0 SCCA=GCAC SLIM, ENTERF;FLDAA2 SLIA, JSA;LTRNE;0 SLCM, GC2+MAC;ENTERF;SLIA+MAC;0 SLCA, ENTERF;GCAC+1+MAC;SLIA+MAC;0 SIDM, ENTERE;FLDAA2 SIDA, ENTERF;SIRA+MAC;0 SRDM, ENTERE;FLDAA2 SRDA, ENTERF;0 SCDM, ENTERE;FLDAA2 SCDA, FSTA;TEMPN;ENTERF;FLDA;TEMPN;ENTERE;0 SDIM, ENTERF;FLDAA2 SDIA, ENTERE;0 SDCM, ENTERE;FLDAA2;PCAC+MAC SDCA, ENTERF;GCAC+1+MAC;ENTERE;0 SDDM, ENTERE;FLDAA2 SDDA, 0 SLDM, ENTERE;FLDAA2 SLDA, JSA;LTRNE;0 / UNARY MINUS AND .NOT. SKELETONS NEGTBL, NIM-1;NIM-1;NCM-1;NDM-1;0 NIA-1;NIA-1;NCA-1;NIA-1;0 NIM, ENTERF;FLDAA1 NIA, FNEG;0;0 NCM, GC1+MAC;PCAC+MAC;JSACNG+MAC;0 NCA=JSACNG NDM, ENTERE;NIM+1+MAC;0 NOTTBL, 0;0;0;0;NOTM-1 0;0;0;0;NOTA-1 NOTM, ENTERF;FLDAA1 NOTA, 0 / ARITHMETIC IF SKELETONS AIFTBL, GI-1;GI-1;GC-1;GD-1;GI-1 /V3C GI+1;GI+1;GC+1;GD+1;GI+1 /V3C GI, ENTERF;FLDAA1;0 GC, GC1+MAC;0 GD, ENTERE;FLDAA1;0 /OPERATOR DISPATCH TABLE XPUSH, PUSH ADD SUB MUL DIV EXP NOT NEG GE GT LE LT DNA OR EQ NE XOR EQV PAUZE DPUSH BINRD1 FMTRD1 WCLOSE /** DARD1 BINWR1 FMTWR1 WCLOSE DAWR1 DEFFIL ASFDEF ARGS EOSTMT ERROR RETURN REWIND STORE XEND, END DEFLBL DOFINI ARTHIF XLOGIF, LIFBGN DOBEGN ENDFIL STOP ASSIGN BAKSPC FORMAT XGOTO, GOTO CGOTO AGOTO IOLMNT DATELM DREPTC DATAST ENDELM PURGE XLAST, DOSTOR / EXPONENTIATION TABLE (NOT A STANDARD SKELETON TABLE) EXPTBL, 1;1111;2;1122;3;1103;4;1104;0;0 /I**D=D 2;1111;2;1122;3;1103;4;1104;0;0 /R**D=D 3;0311;3;0322;3;0303;0;0;0;0 4;0411;4;0422;0;0;4;0404;0;0 0;0;0;0;0;0;0;0;0 / TYPE MIXING TABLE TYPMIX, 1;6;2;6;3;17;4;22;0;0 2;6;2;6;3;17;4;22;0;0 3;25;3;25;3;11;0;0;0;0 4;30;4;30;0;0;4;14;0;0 0;0;0;0;0;0;0;0;5;33 RTNX, ENTERF;EXTERN;LTRNE;0 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | / OS/8 FORTRAN (PASS TWO OVERLAY) / / VERSION 4A PT 16-MAY-77 / / OS/8 FORTRAN COMPILER - PASS 2 OVERLAY / / BY: HANK MAURER / UPDATED BY: R. LARY + M. HURLEY / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / /THIS FILE IS REQUIRED FOR THE CONDITIONAL ASSEMBLY OF "PASS2.PA" /TO CREATE "PASS2O" / / / Assembly info: / / .PAL PASS2O<PASS2O.PA,PASS2.PA/L / .SAVE SYS:PASS2O.SV;7605=100 / / OVERLY=1 /CONDITIONAL FOR PASS2O ASSEMBLY |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 | /3 OS/8 FORTRAN (PASS THREE) / / VERSION 4A PT 16-MAY-77 / / OS/8 FORTRAN IV COMPILER-PASS 3 / / BY: HANK MAURER / UPDATED BY: R. LARY + M. HURLEY / / /COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / VERSON=4 / PAGE ZERO STUFF OUDEVH=7000 /PUT OUDEVH AND OUBUF IN DIFFERENT INDEVH=6400 INBUF=6000 OUBUF=5400 /SEGMENTS, STAN KNOWS WHY X10=10 X11=11 X12=12 NCHARS=20 CHAR=21 TEMP=22 FILDEV=6 FILBLK=7 DEV1CE=173 /THROUGH 177 DEVH=23 LINENO=24 SEVCHR=25 /THROUGH 33 / OS/8 V3C MAINTENANCE RELEASE FIXES: /1. EXTENDED RANGE OF PAGE NUMBERS TO 99 /2 INTERCHANGED CR/LF FOR HASSINGER /3 CHANGED VERSION NO. TO 305 /5. ADDED 'I' TO JMP (OFOO3 / / / CHANGES FOR OS/8 V3D AND OS/78 BY P.T. / .CHANGED VERSION NUMBER TO 4A / .PUT IN NEW DATE ALGORITHM / / / In the heading of the pass 3 listing of a Fortran IV / program, four characters are printed after the version / number. The first character is the F4 patch level; the / second character is the Pass 2 patch level; the third / character is the Pass 20 patch level; the forth character / is the Pass 3 patch level. These characters are initially / set to "A" and are updated when a patch is issued to any / to the above programs. This text string is at the label / "header". / /START OF PASS 3 *400 /DON'T LOAD INTO 0-377 SPASS3, CDF 10 TAD I (7666 /GET DATE DCA TEMP TAD I LSTFIL /COPY FILE NAME CDF DCA I FILLST ISZ LSTFIL ISZ FILLST ISZ OFSIZE JMP SPASS3 TAD DEV1CE /FETCH HANDLER FOR OUTPUT FILE CIF 10 JMS I (200 /USR IS IN CORE 1 OH, OUDEVH+1 /TWO PAGE HANDLER IS OK JMP I (OFOO3 CIF 10 TAD DEV1CE /OPEN THE LISTING FILE JMS I (200 3 OB, DEV1CE+1 OS, 0 JMP I (OFOO3 TAD OB /SAVE BLOCK NUMBER DCA OBLOCK TAD OS DCA OSIZE /AND SIZE OF HOLE TAD OH /SAVE HANDLER ADDRESS DCA DEVH TAD (NUMS-1 /SET UP NUMBER POINTER DCA I (NUM TAD TEMP /GET THE DATE--FOR YEAR ROUTINE SNA JMP I (PAJE /NO DATE AND (7 /MASK OUT ALL BUT YEAR OFFSET BITS DCA YRTEMP /INCREMENT FROM THE BASE YEAR DCA TEMP1 /HOLDS THE FIRST DIGIT OF THE YEAR TAD I (7777 /GET THE DATE EXTENSION BITS AND (600 /MASK TO GET THE EXTENSION BITS CLL RTR /ROTATE THEM INTO BIT RTR /POSITIONS 7 AND 8 TAD (106 /ADD IN 70---OLD BASE YEAR TAD YRTEMP /ADD IN THE YEAR OFFSET BITS /TO FIND THE NEW BASE YEAR CONVYR, CLL /FIND THE YEAR IN DECIMAL TAD (-12 /KEEP SUBTRACTING 12 SNL /ALMOST DONE JMP SECDIG /FIND THE SECOND DIGIT OF THE YEAR ISZ TEMP1 /FIND THE FIRST DIGIT OF THE YEAR JMP CONVYR /TRY AGAIN SECDIG, TAD (72 /GET THE SECOND DIGIT OF THE YEAR RTL /AND MAKE IT SIXBIT RTL RTL DCA I (YEAR+1 /PUT IT IN THE PRINT LINE TAD TEMP1 /GET THE FIRST DIGIT TAD (5560 /MAKE IT SIXBIT DCA I (YEAR /PRINT IT TAD TEMP /GET THE DATE--NOW FIND THE MONTH/DAY CLL RTR RAR AND (777 DCA TEMP SIMPLE, TAD TEMP /GET THE DAY AND (37 TAD (DAYS-1 /THIS IS THE LAZY WAY DCA NCHARS TAD I NCHARS DCA I (DAY TAD TEMP /GET THE MONTH CLL RTR RTR AND (36 TAD (MONTHS-3 DCA X10 TAD I X10 DCA I (MONTH TAD I X10 DCA I (MONTH+1 JMP I (PAJE /WE GOT THE DATE LSTFIL, 7605 FILLST, DEV1CE OFSIZE, -5 YRTEMP, 0 TEMP1, 0 PAGE PAJE, JMP I (PRHDR /PRINT THE FIRST HEADING CLL CML RTL /INITIALIZE LINE NUMBER DCA LINENO DCA TABCNT /** RDLUPE, TAD (SEVCHR-1 /SEVEN CHAR BUFFER DCA X10 TAD (-6 DCA NCHARS RDLOOP, JMS I (ICHAR JMP RDACHO /ECHO & IGNORE SHORT LINES TAD (-211 /IS IT A TAB ? SZA CLA JMP NOTAB /NO TAD (-2 DCA TABCNT /SET POINTER TO DO EXTRA SPACES LATER** TAD (240 DCA I X10 /DO A TAB ISZ NCHARS JMP .-3 JMP WHAT /GO LOOK AT THE LINE NOTAB, TAD CHAR DCA I X10 /SAVE THE CHAR ISZ NCHARS JMP RDLOOP WHAT, TAD SEVCHR /IS IT A COMMNET TAD (-303 SNA CLA JMP NOISN /YES, NO INTERNAL STMT NUMBER TAD SEVCHR+5 /IS IT A CONTINUATION ? TAD (-240 SZA CLA JMP NOISN /YES, NO ISN TAD LINENO /NEITHER OF THESE JMS I (ONUMBR /PRINT ISN TAD LINENO /2.01/ PUT LINE NUM 7421 /2.01/ INTO MQ CLA /2.01/ CLA IF NO EAE ISZ LINENO /BUMP LINE NUMBER NOISN, TAD (211 /TAB JMS I (OCHAR TAD (SEVCHR-1 /PRINT FIRST SEVEN DCA X10 TAD (-6 DCA NCHARS TAD I X10 JMS I (OCHAR ISZ NCHARS JMP .-3 TAD TABCNT /SEE IF A TAB WAS 1ST SMA CLA /IF YES,NEED 2 MORE SPACES JMP NOTTAB DCA TABCNT /WAS A TAB TAD (240 JMS I (OCHAR TAD (240 JMS I (OCHAR NOTTAB, JMS I (ICHAR /PRINT REST OF LINE JMP ENDLIN JMS I (OCHAR JMP .-3 ENDLIN, JMS I (CRLF /END LINE JMS I (ERRCHK /CHECK ERROR LIST JMP RDLUPE /DO NEXT LINE TABCNT, 0 HEADER, TEXT ' FORTRAN IV 4CAAA ' *.-1 DAY, 4040 MONTH, 4040;4040 YEAR, TEXT ' PAGE ' *.-1 PAGENO, TEXT 'ONE' ZBLOCK 7 /V3C ROOM FOR LARGE PAGE NUMBERS RDACHO, TAD (211 JMS I (OCHAR JMP I (RDECHO PAGE TEXT " " LOS, TEXT "ONE " NUMS,/ 2427;1740;4040 / 2410;2205;0540 / 0617;2522;4040 / 0611;2605;4040 / 2311;3040;4040 / 2305;2605;1640 / 0511;0710;2440 / 1611;1605;4040 / 2405;1640;4040 / 0514;0526;0516 / 2427;0514;2605 TEXT "TWO@@@@@" TEXT "THREE@@@" TEXT "FOUR@@@@" TEXT "FIVE@@@@" TEXT "SIX@@@@@" TEXT "SEVEN@@@" TEXT "EIGHT@@@" TEXT "NINE@@@@" TEXT "TEN@@@@@" TEXT "ELEVEN@@" TEXT "TWELVE@@" TEXT "THIRTEEN" TEXT "FOURTEEN" TEXT "FIFTEEN@" TEXT "SIXTEEN@" TEXT "SEVENTEEN" TEXT "EIGHTEEN" TEXT "NINETEEN" HIS, TEXT " TWENTY " *.-1 TEXT " THIRTY " *.-1 TEXT " FORTY " *.-1 TEXT " FIFTY " *.-1 TEXT " SIXTY " *.-1 TEXT "SEVENTY " *.-1 TEXT " EIGHTY " *.-1 TEXT " NINETY " *.-1 TEXT "HUNDRED " *.-1 DAYS, 4061;4062;4063;4064;4065;4066;4067;4070;4071 6160;6161;6162;6163;6164;6165;6166;6167;6170;6171 6260;6261;6262;6263;6264;6265;6266;6267;6270;6271 6360;6361 MONTHS, 5512;0116 /-JAN 5506;0502 /-FEB 5515;0122 /-MAR 5501;2022 /-APR 5515;0131 /-MAY 5512;2516 /-JUN 5512;2514 /-JUL 5501;2507 /-AUG 5523;0520 /-SEP 5517;0324 /-OCT 5516;1726 /-NOV 5504;0503 /-DEC IFZERO .&100 <PAGE> ENDX, TAD (-601 /2.02/ CLEAR END OF BUFFER DCA LINENO /2.01/ FOR TV: REASONS TAD X232 /2.01/ OUTPUT ^Z JMS I (OCHAR /2.01/ ISZ LINENO /2.01/ JMP .-3 /2.01/ CIF 10 /CLOSE THE OUTPUT FILE TAD DEV1CE JMS I (200 4 DEV1CE+1 FILSIZ, 0 JMP (OFOO3 CDF 10 /LOOK AT OPTIONS TAD I X7643 CDF M70, SPA CLA JMP I (7605 //A MEANS DON'T CHAIN TO RALF CIF CDF 10 TAD FILDEV /SET UP RALF INPUT LIST DCA I (7617 /FILE SIZE AND DEVICE CODE ISZ (7617 TAD FILBLK /FILE START DCA I (7617 ISZ (7617 /ZERO END OF LIST DCA I (7617 TAD I X7643 /IS IT /F (FULL LIST) ? AND (100 CIF 0 SZA CLA /** JMP LISTIT CIF 10 TAD I (7644 AND (20 /LET /T SWITCH THRU ALSO SNA CLA DCA I (7605 /NO, INHIBIT RALF LISTING LISTIT, CIF 10 CLA IAC CDF JMS I (200 /LOOKUP RALF.SV 2 RALFNM X7643, 7643 JMP (OFOO3 TAD .-3 DCA .+4 CIF 10 /CHAIN TO RALF JMS I (200 6 X232, 232 NCNT, 0 ONUMBR, 0 DCA TEMP /OUTPUT ISN IN OCTAL TAD (-4 DCA NCNT OLOOP, TAD TEMP CLL RTL /ANYONE WHO CAN'T FOLLOW THIS RAL /SHOULDN'T BE A PROGRAMMER DCA TEMP TAD TEMP RAL AND (7 TAD (260 JMS I (OCHAR ISZ NCNT JMP OLOOP JMP I ONUMBR CONVRT, 0 /CONVERT TO ASCII AND PRINT AND (77 SZA TAD (-40 SPA TAD (100 TAD (240 JMS I (OCHAR JMP I CONVRT LINECT, -1 /EJECT FIRST TIME CRLF, PAJE+1 TAD (215 /CR LF JMS I (OCHAR TAD (212 JMS I (OCHAR ISZ LINECT JMP I CRLF TAD (214 JMS I (OCHAR PRHDR, TAD M70 /RESET COUNT DCA LINECT TAD (HEADER /COPY HEADER OUT DCA TEMP OHDR, TAD I TEMP CLL RTR CLL RTR CLL RTR JMS CONVRT TAD I TEMP JMS CONVRT TAD I TEMP /END YET ? ISZ TEMP AND (77 SZA CLA JMP OHDR TAD (215 /V3C SKIP EXTRA LINE AFTER TITLE JMS I (OCHAR TAD (212 /V3C JMS I (OCHAR /FOR CENTRONICS JMP PUTNUM /GET NEW PAGE NUMBER / OS/8 FILE INPUT ROUTINES PAGE ICHAR, 0 /READ CHAR FROM INPUT FILE ISZ INJMP /BUMP THREE WAY UNPACK SWITCH ISZ INCHCT INJMPP, JMP INJMP TAD INEOF /DID LAST READ YEILD END OF FILE ? SNA CLA JMP INGBUF /NO, DO ANOTHER READ GETNEW, JMS INNEWF /OPEN A NEW INPUT FILE JMP I (ENDX /NO FILE TO OPEN INGBUF, TAD INCTR /BUMP RECORD COUNTER CLL IAC SNL DCA INCTR /RESTORE IF IT HASN'T OVERFLOWED SZL ISZ INEOF /SET END OF FILE SWITCH JMS I INHNDL /DO THE READ INCALL, 200 INBUFP, INBUF INREC, 0 JMP INERR /HANDLER ERROR INBREC, ISZ INREC /BUMP RECORD NUMBER TAD (-601 /SET CHAR COUNT DCA INCHCT TAD INJMPP /RESET THREE WAY JUMP SWITCH DCA INJMP TAD INBUFP /RESET BUFFER POINTER DCA INPTR JMP ICHAR+1 /GO AGAIN INERR, ISZ INEOF /EITHER EOF OR BADDIE SMA CLA JMP INBREC /END OF FILE, DO NEXT FILE JMP OFOO3 INJMP, HLT /3 WAY CHARACTER UUPACK SWITCH JMP ICHAR1 JMP ICHAR2 ICHAR3, TAD INJMPP /RESET JUMP SWITCH DCA INJMP TAD I INPTR AND (7400 /COMBINE THE HIGH ORDER BITS CLL RTR /OF THE TWO WORDS RTR TAD INTMP /TO FORM THE THIRD CHAR RTR RTR ISZ INPTR /BUMP WORD POINTER JMP ICHAR1+1 /DO SOME COMMON STUFF ICHAR2, TAD I INPTR /SAVE THE HIGH ORDER BITS AND (7400 DCA INTMP /FOR THE THIRD CHAR ISZ INPTR /GO TO THE SECOND WORD ICHAR1, TAD I INPTR /GET THE LOW 8 BITS AND (377 /AND I MEAN ONLY 8 !! DCA CHAR TAD CHAR TAD (-232 /IS IT ^Z (END OF FILE) SNA JMP GETNEW /YES, LOOK FOR THE NEXT FILE TAD (232-212 SNA JMP ICHAR+1 /IGNORE LINE FEEDS TAD (212-215 SNA JMP I ICHAR /RETURN ON CARRIAGE RETURN IAC SNA CLA JMP ICHAR+1 /IGNORE FORM FEEDS TAD CHAR ISZ ICHAR JMP I ICHAR /RETURN TO THE CALLING WORLD INTMP, 0 INFPTR, 7617 /POINTER TO INPUT FILE LIST INEOF, 1 INCHCT, INNEWF, -1 /FETCH HANDLER FOR NEXT FILE TAD (INDEVH+1 /THIS IS WHERE IT GOES DCA INHNDL CDF 10 TAD I INFPTR /GET NEXT INPUT FILE INFO CDF SNA JMP I INNEWF /NO MORE FILES CIF 10 JMS I INCALL /CALL MONITOR 1 /FETCH HANDLER INHNDL, 0 /ENTRY ADDR GOES HERE JMP OFOO3 CDF 10 TAD I INFPTR /GET LENGTH AND (7760 SZA /A ZERO HERE MEANS >=256 BLOCKS TAD (17 /PUT IN SOME MORE BITS CLL CML RTR RTR DCA INCTR /STORE LENGTH OF FILE ISZ INFPTR TAD I INFPTR /GET STARTING RECORD NUMBER DCA INREC ISZ INFPTR DCA INEOF /CLEAR EOF FLAG ISZ INNEWF CDF JMP I INNEWF INCTR, 0 INPTR, 0 /PUTNUM, TAD (PAGENO-1 /COPY THE NEW NUMBER / DCA X10 / TAD I NUM / ISZ NUM / DCA I X10 / TAD I NUM / ISZ NUM / DCA I X10 / TAD I NUM / ISZ NUM / DCA I X10 / JMP CRLF+1 RDECHO, /KEEP LINES WITH L.T. 6 CHARS OUT OF ISN COLUMN TAD (SEVCHR-1 DCA X12 RDECLP, TAD X12 CIA TAD X10 SNA CLA JMP ENDLIN /ONLY ECHO WHAT YOU READ TAD I X12 JMS I (OCHAR JMP RDECLP PAGE OUDUMP, 0 /BUMP THE DUFFER TAD OSIZE /ANY ROOM LEFT ? IAC SNA JMP OFOO3 DCA OSIZE /YES, ITS OK JMS I DEVH /WRITE 4200 /CONTROL WORD OUBUF /BUFFER POINTER OBLOCK, 0 /BLOCK NUMBER JMP OFOO3 ISZ OBLOCK /INCREMENT BLOCK NUMBER ISZ FILSIZ /AND FILE SIZE TAD OBLOCK-1 /SET BUFFER POINTER DCA OUPTR TAD (-200 /SET DOUBLE WORD COUNT DCA OUWDCT JMP I OUDUMP OCHAR, 0 /OUTPUT A CHAR TO THE RALF INPUT FILE AND (377 DCA OUTEMP /SAVE CHAR KSF /^C TEST JMP NOSTOP KRB AND (177 TAD (-3 SNA CLA JMP I (7605 /YES NOSTOP, ISZ OUJUMP /BUMP 3 WAY SWITCH OUJUMP, JMP . JMP CHAR1 JMP CHAR2 TAD OUTEMP /HIGH FOUR BITS GO INTO CLL RTL /THE HIGH ORDER BITS OF THE RTL /FIRST WORD OF THE TWO WORD PAIR AND (7400 /SEE NOTE * BELOW TAD I OUPOLD /COMBINE WITH OTHER BITS DCA I OUPOLD TAD OUTEMP /THE OTHER FOUR BITS OF THIS CHAR CLL RTR /GO INTO THE HIGH ORDER FOUR RTR /BITS OF THE SECOND WORD OF THE PAIR RAR AND (7400 TAD I OUPTR DCA I OUPTR TAD OUJMP /RESET 3 WAY BRANCH DCA OUJUMP ISZ OUPTR /BUMP BUFFER POINTER ISZ OUWDCT /AND DOUBLE WORD COUNTER JMP I OCHAR /BUFFER NOT FULL JMS OUDUMP /DUMP IT JMP I OCHAR CHAR2, TAD OUPTR /SAVE FIRST WORD POINTER DCA OUPOLD ISZ OUPTR /GO TO SECOND WORD CHAR1, TAD OUTEMP /STORE CHAR 1 OR 2 DCA I OUPTR JMP I OCHAR OUTEMP, 0 OUPOLD, 0 OUPTR, OUBUF OUJMP, JMP OUJUMP OUWDCT, -200 OSIZE, 0 ERRPTR, 5000 ERRCHK, 0 CDF 10 TAD I ERRPTR /ANY ERRORS FOR THIS LINE CDF CMA TAD LINENO SZA CLA JMP I ERRCHK /NO CLL CMA RAL /BACK UP POINTER TAD ERRPTR DCA ERRPTR TAD ERRPTR IAC DCA TEMP CDF 10 TAD I TEMP /GET CODE CDF CIA DCA TEMP /SAVE NEGATIVE TAD (ERRLST-1 DCA X10 FIND, TAD I X10 /LOOK FOR ERROR MESSAGE SZA TAD TEMP SNA CLA JMP .+3 ISZ X10 JMP FIND /SKIP POINTER WORD CLA CMA TAD I X10 DCA X10 /POINTER TO MESSAGE PMLOOP, TAD I X10 /GET TWO CHARS DCA TEMP TAD TEMP RTR RTR RTR JMS CONVRT /PRINT FIRST TAD TEMP JMS CONVRT /PRINT SECOND TAD TEMP AND (77 /END OF MESSAGE ? SZA CLA JMP PMLOOP /NO, LOOP JMS I (CRLF JMP ERRCHK+1 /SEE IF ANY MORE FOR THIS LINE RALFNM, FILENAME RALF.SV PAGE X304, 304 X305, 305 X7605, 7605 OFOO3, TAD X304 /FATAL ERROR IN PASS 3 JMS TTY TAD X305 JMS TTY JMP I X7605 TTY, 0 /PRINT ON TTY TLS TSF JMP .-1 CLA JMP I TTY /ERROR MESSAGES ERRLST, 0724;GT 1124;IT 0504;ED 2227;RW 0317;CO 0530;EX 2123;QS 2114;QL 1106;IF 0417;DO 2316;SN 2404;TD 0204;BD 2224;RT 2204;RD 2324;ST 0314;CL 1517;MO 1017;HO 1515;MM 2323;SS 1720;OP 0123;AS 0401;DA 0410;DH 1514;ML 0405;DE 0223;BS 1424;LT 1105;IE 2010;PH 1513;MK 1724;OT 2004;PD 1524;MT 0726;GV 1411;LI 0420;DP 0414;DL 0101;AA 2306;SF 0406;DF 1111;II 0;SYSERR SYSERR, TEXT 'UNDEFINED ERROR' II, TEXT 'ILLEGAL USE OF IF' GT, TEXT 'BAD GOTO STATEMENT' RW, TEXT 'BAD READ OR WRITE STATEMENT' CO, TEXT 'ARGS IN COMMON OR VAR IN TWO COMMONS OR SYNTAX BAD' IT, TEXT 'BAD IO LIST ELEMENT' EX, TEXT 'BAD EXTERNAL STMT' QS, TEXT 'SYNTAX ERROR IN EQUIVALENCE' QL, TEXT 'VARIABLE IS EQUIVALENCED MORE THAN ONCE' IF, TEXT 'THIS KIND OF STATEMENT NOT LEGAL AFTER LOGICAL IF' DO, TEXT 'BAD SYNTAX IN DO OR IMPLIED DO' SN, TEXT 'NOT LEGAL AS SUBROUTINE NAME' TD, TEXT 'SYNTAX ERROR IN TYPE STATEMENT' BD, TEXT 'DIMENSIONS TOO BIG, OR SYNTAX ERROR IN DIMENSION LIST' ED, TEXT 'ILLEGAL AS DO ENDING STATEMENT' RT, TEXT 'ATTEMPT TO RE-TYPE A VARIABLE' RD, TEXT 'ATTEMPT TO RE-DIMENSION A VARIABLE' ST, TEXT 'INTERNAL COMPILER ABORT NUMBER ONE' CL, TEXT 'ERROR IN COMPLEX LITERAL' MO, TEXT 'OPERAND EXPECTED, NONE PRESENT' HO, TEXT 'HOLLERITH COUNT WRONG, OR MISSING QUOTES' MM, TEXT 'MISMATCHED PARENTHESIS' SS, TEXT 'SUBSCRIPT OR ARGUMENT LIST ERROR' OP, TEXT 'ILLEGAL OPERATOR' AS, TEXT 'ASSIGN ???' DA, TEXT 'DATA STATEMENT ?' DH, TEXT 'HOLLERITH COUNT OR QUOTE ERROR IN DATA STATEMENT' ML, TEXT 'THIS LINE NUMBER IS ALREADY DEFINED' DE, TEXT "WRONG WAY TO END A DO LOOP" BS, TEXT 'ILLEGAL IN BLOCK DATA' LT, TEXT 'LINE TOO BIG' IE, TEXT 'INPUT FILE ERROR, TAKEN AS END STATEMENT' PH, TEXT 'THIS FUNCTION / SUBROUTINE STATEMENT IS UNACCEPTABLE' MK, TEXT 'YOU MISPELED A KEYWURD' OT, TEXT 'ILLEGAL OPERAND TYPE FOR THIS OPERATOR' PD, TEXT 'INTERNAL COMPILER ABORT NUMBER TWO' MT, TEXT "ILLEGAL VARIABLE TYPE MIXING" GV, TEXT 'VARIABLE IN ASSIGNED OR COMPUTED GOTO MUST BE INTEGER OR REAL' LI, TEXT 'EXPRESSION IN LOGICAL IF IS NOT TYPED LOGICAL' DP, TEXT 'DO PARAMETERS MUST BE INTEGER OR REAL' DL, TEXT "YOUR DATA AND VARIABLE LISTS ARE OF DIFFERENT LENGTHS" AA, TEXT 'SUBROUTINES MAY ONLY HAVE SIX ARGUMENTS THAT ARE DIMENSIONED' SF, TEXT 'BAD STATEMENT FUNCTION' DF, TEXT 'BAD DEFINE FILE' PAGEN, 1 PUTNUM, ISZ PAGEN /BUMP PAGE NUMBER TAD PAGEN TAD (-24 /LT 20? SMA CLA JMP OVER19 /YES TAD (-5 /NO JMS MOVE /MOVE IN NUMBER NUM, 0 PAGENO-1 TAD NUM TAD (5 DCA NUM /PT TO NEXT ONE JMP I (CRLF+1 TENS, 0 ONES, 0 KNT, 0 OVER19, DCA TENS /CONVERT TAD PAGEN /PAGE NUMBER TO ONES AND TENS O1, TAD (-12 /DIVIDE BY TEN SPA JMP .+3 ISZ TENS JMP O1 TAD (12 DCA ONES TAD TENS CLL RTL TAD (HIS-10-1 DCA HIP /POINT TO HIGH PART TAD ONES CLL RTL TAD ONES TAD (LOS-5-1 DCA LOP TAD (-4 JMS MOVE HIP, 0 PAGENO-1 TAD (-5 JMS MOVE LOP, 0 PAGENO+4-1 JMP I (CRLF+1 MOVE, 0 DCA KNT TAD I MOVE DCA X11 ISZ MOVE TAD I MOVE DCA X12 ISZ MOVE TAD I X11 DCA I X12 ISZ KNT JMP .-3 JMP I MOVE $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 | / RALF, V62A / / / / / / / // / / / / /COPYRIGHT (C) 1974, 1975, 1977 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / / RELOCATABLE ASSEMBLER FOR OS/8 FORTRAN IV / / / FPPASM BY HANK MAURER / RALF MODS BY JUD LEONARD / OS/8 FORTRAN MODS BY RICHIE LARY + MARTY HURLEY / NEW DATE ALGORITHUM PUT IN BY ED STEINBERGER / / THE FOLLOWING FORMULA GIVES THE NUM / OF USER SYMBOLS: / -(FREE+200[BASE8])/6[BASE10] / WHERE THE VALUE OF FREE IS FROM THE / RALF SYMBOL MAP / / IFNDEF RALF <RALF=1 /GO RELOCATABLE THEN> / / ASSEMBLE WITH PAL8-V9 WITH W SWITCH / SAVE AS: / .SAVE SYS RALF.SV ;200=2000 / / CHANGES FOR OS/78 AND OS/8 V3D BY P.T. / .CHANGED VERSION NUMBER TO 62 / .RALF NO LONGER GENERATES FAULTY RELOCATABLE IF: / 1.) THE ESD IS LONGER THAN ONE BLOCK, AND / 2.)LIST OUTPUT IS DIRECTED TO A 2-PAGE NON-SYSTEM HANDLER / / FLD0=0 FLD1=10 VNUM=62 PATCH="A /PATCH LEVEL A *3 VERS, VNUM /VERSION NUMBER OLDN3, 0 /TEMP FOR LOOKUP OTEMP, 0 /A COUPLE OF TEMPS THAT OCNT, 0 /DIDNT FIT INTO THEIR PAGE 0 X10, 0 X11, 0 X12, 0 X13, 0 X14, 0 OUTPTR, OUBUF-1 NEXT, FREE-1 CHRPTR, LINE-1 NCHARS, -1 /CHARACTER INPUT STUFF CPTMP, 0 NCTMP, 0 /USED TO SAVE CHAR POSITION LINSIZ, 0 /SIZE OF LINE FOR PRINTING STYPE, /SYMBOL TYPE CODE CHKSUM, 0 /FOR BINARY OUTPUT IFZERO RALF < LOCTR1, 0 /INITIAL LOCN CNTR FOR ABSOLUTE ASM LOCTR2, 200 > IFNZRO RALF < ESDNO, 2 /LAST ESD #. (#MAIN & BLANK COMMON DEFAULT) LOCTR1, 20 /HIGH LOCN CNTR WITH ESD (STARTS IN #MAIN) LOCTR2, 0 DPFLG, 0 > BASER, 4000 /BASE REGISTER SETTING 0 INDXR, 0 /INDEX LOCS: MUST FOLLOW BASER 0 EXPVAL, 0 /EXPRESSION VALUE 0 0 EXPDEF, 0 /=0 IF EXPR IS UNDEFINED EXPSW, 0 /FLAG=1 IF NO EXPR WORD1, 0 /TEMPORARY 2 WORD OPERAND WORD2, 0 FPPADR, 0 /ADDRESS FIELD FOR FPP INDEX INSTR 0 OPCODE, 0 /OPCODE OR PSEUDO-OP POINTER XFLAG, 0 /INDEX FLAG = 1 IF INDEX PRESENT XINCR, 1 /FLAG = 0 IF + LEGAL IN INDEX EXPR BUCKET, 0 /FIRST CHAR OF NAME NAME1, 0 /CHARS 2 AND 3 OF NAME NAME2, 0 /CHARS 4 AND 5 OF NAME NAME3, 0 /CHAR 6 OF NAME AND TYPE LASTOP, 0 /LAST OPERATOR ENCOUNTERRED IN EXPR PASSNO, -1 /PASS NUMBER ASMOF, 0 /SET NEGATIVE WHEN ASSEMBLY OFF PNCHOF, 0 /NON-ZERO TO SUPPRESS BINARY OUTPUT LISTSW, 1 /LIST SWITCH (1 ENABLES LISTING) OUTSWT, 0 /OUT SWITCH, =1 IF LINE ALREADY LISTED REPCNT, 0 /REPEAT COUNTER SCSWT, 0 /SEMICOLON SWITCH RADIX, 0 /RADIX FOR INTEGERS (0 IS OCTAL) LTEMP, -177 /TEMP USED BY LOOKUP EXTMP, 0 /TEMPS USED BY EXPR AND OTHERS EXTMP2, 0 EQUN, 0;0;0;0 /NAME ON LEFT OF EQUAL SIGN /NEXT TWO LOCS USED WITH EQUN BY DMPESD FPPSWT, 0 /1 WHHEN FINDING FPP ADR EXPR FPP2WD, 0 /SET BY EXPR TO FORCE 2 WD FMT FPPWD2, 0 /SET BY FPP2WD.OR.EXPTYP.EQ.0 LITRL, 0 /SET = 1 FOR LITERAL P0LIT, 177 CPLIT, 177 PAGEN, 0 ERRORS, 0 /ERROR COUNT PC, TTYOUT /OUTPUT ROUTINE OUFILE, 7573 /OUTPUT FILE LIST POINTER BFILE, 1 LPAGE1, 1 /INPUT FORMFEED COUNT LPAGE2, 0 /OUTPUT PAGE WITH RESPECT TO ABOVE LINPAG, -1 /LINES/PAGE COUNTER LINKSW, 0 /1 IF LINK GENERATED ON THIS LINE LINKS, /NO OF LINKS GENERATED ABREFS, 0 /NO OF ABSOLUTE REFERENCES ABSOP, 0 /POINTER-SWITCH FOR BINARY OUTPUT USR, 200 /CURRENT CALL ADDRESS FOR USR SYONLY, 0 /=0=LIST ONLY SMAP WHEN LIST FILE /IS SPECIFIED. ITS SET VIA SLASH S /=1=REGULAR NP17, 17 /** NP7700, 7700 OPX, 0 OP, ZBLOCK 6 ACX, 0 AC, ZBLOCK 6 M3, -3 BLINE, LINE-1 / PAGE / / CORE ALLOCATION IN HIGH FIELD 0 / CPLBUF=5100 /ACTUALLY AT 5200 P0LBUF=5200 /AND 5300, 1/2 PAGE EACH IFZERO RALF < INBUF=5400 > IFNZRO RALF < INBUF=6000 /AFTER PASS 1, MOVES TO 5400> OUBUF=6400 LINE=7000 /CURRENT INPUT LINE IN ASCII INDEVH=7200 /TENTATIVE INPUT DEVICE HANDLR ADDR OUDEVH=7400 /TENTATIVE OUTPUT HANDLER ADDR INRECS=2 INCTL=400 OUCTL=4200 / / COLLECT THE NEXT STATEMENT / ISZ .+2 REPLEN, JMP I .+1 REPLST, BEGIN /START AT 6000 IF CHAINED ELSE 6001 NEXTST, CDF FLD0 /JUST PRECAUTION TAD OUTSWT /IF NO OUTPUT FROM THIS LINE, SNA CLA TAD PASSNO /AND LISTING PASS SMA SZA CLA TAD LISTSW /AND LISTING ENABLED SNA CLA /PRINT THIS LINE NOW JMP START /ELSE GET NEXT JMS I [CRLF /PRINT CR/LF TAD (-6 DCA LTEMP /SPACE OVER JMS I [PRINT2 /12 SPACES ISZ LTEMP JMP .-2 JMS I (PRNTLN /THEN PRINT LINE START, JMS I [GETCHR /ANY MORE CHARS ? JMP NOTEG JMS I [ERMSG /EXTRA GARBAGE ON LAST LINE 0507 /*EG* NOTEG, TAD SCSWT /DID LAST LINE END WITH SEMICOLON ? SNA CLA JMP .+5 /NO DCA SCSWT /KILL SC SWITCH ISZ CHRPTR /SKIP OVER SEMICOLON ISZ NCHARS JMP ASMBL /DON'T READ A NEW LINE TAD REPCNT /IS THIS LINE TO BE REPEATED? SPA CLA JMP AGAIN /DO IT NEWLIN, TAD BLINE /RESET POINTER DCA CHRPTR TAD [-200 /LIMIT LINE SIZE DCA MAXLIN DCA OUTSWT /CLEAR OUTPUT SWITCH RDLOOP, JMS I (ICHAR /READ A CHAR TAD (-212 SNA JMP RDLOOP /IGNORE LINE FEEDS TAD (212-215 /END ON CR SNA JMP ENDLIN IAC SNA /FORM FEED? JMP FORMFD TAD (214 /FIX CHAR DCA I CHRPTR /SAVE IT ISZ MAXLIN /TEST FOR LINE TOO LONG JMP RDLOOP /PUT CHAR AWAY AND GET NEXT 1 JMS I (ICHAR /IGNORE ANOTHER CHAR TAD (-215 /UNLESS CR SZA CLA JMP .-3 JMS I [ERMSG /EXCESS LENGTH LINE 1424 /*LT* ENDLIN, TAD CHRPTR /FIND - NUMBER OF CHARS - 1 CMA TAD BLINE DCA NCHARS TAD REPCNT /0 BECOMES 0, CIA /BUT POS REP COUNT DCA REPCNT /ENABLES REPEAT TAD NCHARS /SAVE LENGTH DCA REPLEN TAD LISTSW /SAVE LISTING SWITCH DURING REPEAT DCA REPLST REASM, TAD NCHARS /SAVE SIZE OF LINE FOR PRINT DCA LINSIZ TAD BLINE DCA CHRPTR /SET POINTER ASMBL, TAD ASMOF /ARE WE INSIDE A CONDITIONAL SZA CLA JMP OFFIT /YES, AND THE COND WAS FALSE JMS I [GETCHR /LOOK FOR A CHARACTER JMP NEXTST TAD (-257 /IS IT SLASH ? SNA JMP NOASM /YES, COOL IT TAD [257-240 /IS IT BLANK OR TAB ? SZA CLA /YES, IGNORE JMS I [BACK1 /NO, PUT IT BACK JMP I (LUNAME /ASSEMBLE STMT FORMFD, ISZ LPAGE1 /BUMP FORM FEED COUNT DCA LPAGE2 /CLEAR SUB-PAGE COUNT CLA CMA DCA LINPAG /FORCE EJECT ON CRLF JMP RDLOOP OPENIT, CLA CMA /DECR COUNT, ANOTHER OPEN ANGLE TAD ASMOF DCA ASMOF OFFIT, ISZ NCHARS /MORE TO GO? JMP GETIT /YES NOASM, CLA CMA DCA NCHARS /DONT ASSEMBLE THIS LINE JMP NEXTST /(PREVENTING *EG* MESSAGE) GETIT, TAD I CHRPTR /PICK UP THE CHARACTER TAD (-274 /OPEN ANGLE BRACKET? SNA JMP OPENIT /YES, PUSH ONE LEVEL DOWN CLL RTR SNA CLA ISZ ASMOF /IF CLOSE, CHECK LEVEL JMP OFFIT /TRY FOR NEXT JMP ASMBL /RESUME WORK AGAIN, TAD REPLEN /WE NOW REPEAT THE SAME LINE DCA NCHARS DCA LISTSW /NO LISTING DURRING REPEAT ISZ REPCNT JMP REASM /ASSUMING COUNT STILL OK TAD REPLST /RESTORE LISTING DCA LISTSW JMP NEWLIN /GET NEXT LINE MAXLIN=LTEMP / TXERR, TEXT " ERRORS" TXELN= .-TXERR PAGE / / DIVIDE AC BY 3 / USEFUL IN FPP REFERENCES TO BASE / OVER3, 0 /DIVIDE AC BY THREE DCA EXTMP2 /MQ TAD (-15 /SET SHIFT COUNT DCA LTEMP DIVLUP, CLL /ZERO LINK TAD (-3 /SUBTRACT DIVISOR FROM AC SZL /IF AC>=3 SET LINK TO 1 JMP .+3 /OK, DONT RESTORE TAD (3 /TOO SMALL, RESTORE AC CLL /SET LINK BACK TO 0 DCA EXTMP /SAVE AC TAD EXTMP2 /ROTATE MQ-AC LEFT, PUT LINK IN MQ RAL DCA EXTMP2 /SAVE MQ TAD EXTMP /GET BACK AC RAL /COMPLETE SHIFT ISZ LTEMP /TEST COUNT JMP DIVLUP /KEEP GOING DCA EXTMP /THIS IS REMAINDER TAD EXTMP2 /RETURN QUOTIENT JMP I OVER3 / / INITIALIZE FOR OUTPUT / OUSETP, 0 TAD (OUCTL&3700 /BUFFER SIZE IN DBL WORDS CIA /NEGATE IT (PAL10 BLOWS) DCA OUDWCT TAD NOUBUF DCA OUPTR /INITIALIZE WORD POINTER TAD OUJMPE DCA OUJMP /INITIALIZE 3-WAY CHARACTER SWITCH JMP I OUSETP NOUBUF, OUBUF / / STORE CHARACTERS IN OUTPUT BUFFER / IN PS8 FORMAT (YOU KNOW, 3 CHARS / IN 2 WORDS THE WRONG WAY) / OCHAR, 0 AND (377 DCA OUTEMP TAD OUTINH SZA CLA /IS THERE AN OUTPUT FILE? JMP I OCHAR /NO - EXIT CDF OUFLD /SET DATA FIELD TO BUFFER'S FIELD ISZ OUJMP /BUMP THE CHARACTER SWITCH OUJMP, HLT /THREE WAY CHARACTER SWITCH JMP OCHAR1 JMP OCHAR2 TAD OUTEMP CLL RTL RTL AND (7400 TAD I OUPOLD DCA I OUPOLD /UPDATE FIRST WORD OF TWO WITH HIGH /ORDER 4 BITS OF THIRD CHAR TAD OUTEMP CLL RTR RTR RAR AND (7400 TAD I OUPTR DCA I OUPTR /UPDATE 2ND WORD FROM LO 4 BITS TAD OUJMPE DCA OUJMP /RESET SWITCH ISZ OUPTR ISZ OUDWCT /BUMP COUNTER EVERY 3 CHARS JMP OUCOMN TAD (OUCTL /LOAD CONTROL WORD FOR A FULL WRITE JMS I (OUTDMP /DUMP THE BUFFER JMS OUSETP /RE-INITIALIZE THE POINTERS JMP OUCOMN OCHAR2, TAD OUPTR DCA OUPOLD /SAVE POINTER TO FIRST WORD OF TWO ISZ OUPTR /BUMP WORD POINTER TO SECOND WORD OCHAR1, TAD OUTEMP DCA I OUPTR OUCOMN, CDF JMP I OCHAR OUTEMP, 0 OUPOLD, 0 OUPTR, 0 OUJMPE, JMP OUJMP OUDWCT, 0 OUTINH, 0 / / MOVE OUTPUT FILE NAME TO FIELD 0 / OFNAME, 0 TAD OUFILE DCA X10 TAD (OUFNAM-1 DCA X11 TAD (-4 DCA LTEMP CDF 10 TAD I X10 CDF 0 DCA I X11 ISZ LTEMP JMP .-5 JMP I OFNAME / / GET OUTPUT DEVICE CHARISTICS / OTYPE, 0 CDF 10 TAD I (7600 AND [17 TAD (DCB-1 DCA OTYPP TAD I OTYPP CDF 0 JMP I OTYPE OTYPP= OFNAME / / BASIC TITLE INFO / TITBUF, IFZERO RALF < TEXT "FLAP V" > IFNZRO RALF < TEXT "RALF V" > *.-1 VMTXT, 0;0;0 TITDAT, ZBLOCK 6 TEXT " PAGE" TITLEN= .-TITBUF PAGE / / PROCESS A STATEMENT / LUNAME, TAD CHRPTR /SAVE CHAR STUFF DCA CPTMP TAD NCHARS DCA NCTMP DCA LINKSW /CLEAR SWITCH JMS I [GETNAM /LOOK FOR NAME IFZERO RALF < JMP I (TRYSTR /COULD BE AN ORG> IFNZRO RALF < JMP I (GETEXP /NOT ONE OF OURS, I GUESS> JMS I [GETCHR /LOOK FOR COMMA JMP JSTONE /ITS JUST ONE SYMBOL TAD (-254 /COMMA TEST SZA JMP TRYEQU /NO COMMA, CHECK FOR EQUAL JMS I [LOOKUP /LOOK UP SYMBOL JMP DEFLBL /ITS UNDEFINED CLL RAR /VERIFY ADDR TYPE SZA CLA JMP MDERR /THAT'S A NO-NO TAD I X10 /CHECK LOCCTR AGAINST OLD DEFINITION CIA TAD LOCTR1 /FIRST UPPERR HALF SZA CLA JMP .+6 TAD I X10 CIA TAD LOCTR2 /THEN LOWER HALF SNA CLA JMP DEFIND MDERR, JMS I [ERMSG /MULTIPLY DEFINED 1504 /*MD* JMP I (ASMBL /FIELD IS OK DEFLBL, ISZ I LTEMP /SET TYPE TO 1 (USER ADDR) TAD LOCTR1 /PUT LOCATION COUNTER DCA I X10 /INTO VALUE TAD LOCTR2 DCA I X10 DEFIND, CDF FLD0 /GO LOOK FOR ANOTHER TAG JMP I (ASMBL TRYEQU, TAD (-21 /CHECK FOR EQUAL SIGN SZA JMP TRYBLK /NO, TRY BLANK TAD NAME1 DCA EQUN /SAVE 6 CHARACTER NAME TAD NAME2 DCA EQUN+1 TAD NAME3 DCA EQUN+2 TAD BUCKET DCA EQUN+3 JMS I [GETCHR /ALLOW BLANK AFTER = JMP EQUERR TAD [-240 SZA CLA JMS I [BACK1 /ANYTHING ELSE GOES BACK JMS I [EXPR /GET VALUE RIGHT OF EQUALS JMP EQUERR /BAD EQU TAD EQUN /RESTORE NAME DCA NAME1 TAD EQUN+1 DCA NAME2 TAD EQUN+2 DCA NAME3 TAD EQUN+3 DCA BUCKET JMS I [LOOKUP /LOOKUP SYMBOL JMP PUTVAL /A NEW SYMBOL CLL RAR SZA CLA JMP EQUERR /TYPE CONFLICT PUTVAL, TAD EXPVAL+1 /SAVE ADDRESS TYPE DCA I X10 TAD EXPVAL+2 DCA I X10 TAD I LTEMP /NOW GET TYPE WORD AND (7740 /ZERO OLD TYPE, PRESERVING FORCE BIT TAD EXPDEF /DEFINED BY RIGHT HAND SIDE DCA I LTEMP /RESTORE WORD CDF FLD0 JMP I [NEXTST /GO GET NEXT STMT EQUERR, JMS I [ERMSG /BAD EQU 0205 /*BE* JMP I [NEXTST TRYBLK, TAD (35 /CHECK FOR BLANK SNA /MATCH BLANK? JMP JSTONE /YES AND [77 JMS I [R6L DCA NAME3 /MAKE MODIFIED NAME OF IT JMS I [GETCHR /MODIFIER MUST BE FOLLOWED BY BLANK JMP I (GETEXP /LOOKS BAD TAD [-240 /GOT IT? SZA CLA JMP I (GETEXP /LET EXPR TELL HIM IF ITS WRONG JSTONE, TAD (33 /USE OUR INTERNAL SYMBOL TABLE JMS I [FIND /IS IT THERE? JMP I (GETEXP /NO, LOOK IN USER'S TAD OPCTBL /CREATE JUMP THRU TABLE DCA OPCJMP /SAVE IT TAD I X10 /PICK UP FIRST WORD OF VALUE DCA OPCODE /ITS AN OPCODE-MAYBE? CDF FLD0 OPCJMP, 0 /JUMP SOMEWHERE OPCTBL, JMP I .-4 PSEUDO /PSEUDO OPS PDP8MR /PDP8 MRI FPPMR /FPPMR FPPS1 /OTHER FPP OPCODES FPPS2 FPPS3 FPPS4 FPPS5 FPMRI /INDIRECT FPP MEM REF FPMRS /SHORT DIRECT MEM REF FPMRL /LONG DIRECT REF PDPOPR /8-MODE OPERATES REPETX, JMS I (ADRGET /EVALUATE REPEAT EXPR CLL CMA RAR /3777 AND EXPVAL+2 DCA REPCNT JMP I [NEXTST PAGE / GETEXP, CDF FLD0 TAD CPTMP /RESTORE CHARACTER POINTER DCA CHRPTR TAD NCTMP /TO JUST AFTER TAG (IF ANY) DCA NCHARS SX, DCA OPCODE JMS I [EXPR /TRY FOR AN EXPRESSION JMP BADEXP /IF NONE, ERROR IFNZRO RALF < JMS RELERR /BOMB IF NOT ABSOLUTE EXP> TAD EXPVAL+2 JMS I [OUTWRD JMP I [NEXTST /GO DO NEXT STMT IFNZRO RALF </IF EXPVAL IS RELOCATABLE, RELERR, 0 /GIVE ERROR MESSAGE TAD EXPVAL+1 /CAUTION: THIS ROUTINE IS /SOMETIMES CALLED WITH NON-ZERO AC AND [7770 /JUST ESD BITS SNA CLA JMP I RELERR /ITS ABSOLUTELY FINE TAD EXPVAL+1 AND [7 /REMOVE ESD DCA EXPVAL+1 JMS I [ERMSG 2205 /*RE* JMP I RELERR > / FPPMR, ISZ FPPSWT /SET FORCE ENABLE JMS FPADR TAD WORD1 /IF WAY OFF BASE, SNA TAD FPPWD2 /OR IF FORCED SNA TAD XFLAG /OR IF INDEXED SZA CLA JMP FORMT1 /USE LONG FORM TAD WORD2 CLL TAD (-600 /COMPLETE OFF-BASE CHECK SZL CLA JMP FORMT1 /USE LONG JMP FORMT2 FPPS2, JMS I (GETADR /COLLECT ADDRESS EXPR JMS IXMES /BUT DISALLOW INDEX JMP F2WD /PUT TWO WORDS OUT / IXMES, 0 TAD XFLAG /NO INDEX ALLOWED SNA CLA JMP I IXMES /HE'S COOL JMS I [ERMSG 1130 /*IX* JMP I IXMES FPMRL, JMS FPADR FORMT1, JMS I (FIXOPC F2WD, TAD FPPADR AND [7 /FIELD BITS TAD OPCODE /IN FIRST WORD FPDMP, IFZERO RALF < JMS I [OUTWRD TAD FPPADR+1 /LOW ADDRESS JMS I [OUTWRD JMP I [NEXTST /NEXT!> IFNZRO RALF < JMP I (OUTREL /DUMP TWO RELOCATABLE> FPMRS, JMS FPADR /COLLECT OPERAND JMS IXMES /ERROR IF INDEX GIVEN TAD WORD1 SZA CLA JMP BADEXP TAD WORD2 CLL TAD (-600 /DOES IT FIT? SNL CLA JMP FORMT2 BADEXP, JMS I [ERMSG 0230 /*BX* TAD OPCODE /BEST GUESS OF THE DESIRED OUTPUT JMS I [OUTWRD JMP I [NEXTST FPMRI, JMS FPADR TAD WORD1 SZA CLA JMP BADEXP /NOT EVEN CLOSE TAD WORD2 CLL TAD (-30 SZL CLA JMP BADEXP /GOTTA BE IN THE FIRST 10 FORMT3, JMS I (FIXOPC FORMT2, TAD WORD2 JMS I (OVER3 /BY 3 FOR BASE ADDRESS TAD [200 FPPS3, TAD OPCODE JMS I [OUTWRD /WHEW! JMP I [NEXTST FPPS1, JMS I (GETADR /GET ADDR, AND INDEX JMS I (FIXOPC /PUT OPCODE TOGETHER TAD FPPADR /GET ADDR EXTENSION AND [7 TAD OPCODE /WITH TOGETHER OPCODE AND (7377 /WITHDRAW ONE BIT JMP FPDMP /PUT IT OUT FPPS5, CLA IAC /DISALLOW INDEX INCR JMS I (GETADR /COLLECT ADDRESS AND INDEX IFNZRO RALF < TAD FPPADR AND [7770 /MUST BE ABSOLUTE SNA CLA JMP .+3 /OK JMS I [ERMSG 2205 /*RE*> TAD XFLAG SZA CLA /ANY INDEX? TAD EXPVAL+2 AND [7 /STRIP OFF ESD BITS TAD OPCODE JMS I [OUTWRD /DUMP THAT TAD FPPADR+1 JMS I [OUTWRD /NOW LOW 12 BITS JMP I [NEXTST / FPADR, 0 JMS I (GETADR /COLLECT ADDRESS AND INDEX TAD BASER+1 CIA STL TAD FPPADR+1 DCA WORD2 /GET ADDRESS RELATIVE TO BASE RAL TAD BASER CIA TAD FPPADR DCA WORD1 JMP I FPADR PAGE / PSEUDO, JMP I OPCODE /DISPATCH TO APPROPRIATE HNDLR / IFZERO RALF < / / ASSEMBLE VARIOUS INSTRUCTION TYPES / PDP8MR, TAD CHRPTR /SAVE POSITION DCA CPTMP TAD NCHARS DCA NCTMP /SAVE COUNT JMS I [GETCHR /LOOK FOR SPACE "I" JMP GETMR /WILL GIVE BX ERROR TAD (-"I /IS IT I? SNA CLA /IF NOT, FORGET IT JMS I [GETCHR /MUST BE FOLLOWED BY SPACE JMP NOTIND TAD [-240 SZA CLA JMP NOTIND /SOMETHING ELSE TAD OPCODE /PUT INDIRECT INTO OPCODE TAD (400 DCA OPCODE GETMR, JMS ADRGET /PICK UP ADDRESS FIELD TAD EXPVAL+2 /CHECK PAGE OF ADDRESS AND [7600 SNA JMP PAGEZ /ITS IN PAGE 0 CIA TAD LOCTR2 /COMPARE WITH CURRENT PAGE AND [7600 SNA CLA JMP THSPAG /OK, ITS THIS PAGE TAD OPCODE /CAN WE USE A LINK ? AND (400 /IS INDIRECT BIT OFF ? SNA CLA JMP I (MAKLNK /YES, GO MAKE LINK JMS I [ERMSG /NOPE, ITS AN ILLEGAL REFERENCE 1122 /*IR* THSPAG, TAD EXPVAL+2 /GET ADDRESS AND [177 /LOWER 7 BITS TAD [200 /PUT IN PAGE BIT SKP PAGEZ, TAD EXPVAL+2 /GET ADDRESS (UPPER 5 BITS ZERO) TAD OPCODE /PLUS OPCODE JMS I [OUTWRD /OUTPUT WORD JMP I [NEXTST NOTIND, TAD CPTMP /RESTORE CHAR POINTER DCA CHRPTR TAD NCTMP DCA NCHARS JMP GETMR /NOT AN INDIRECT> FPPS4, JMS ADRGET /GET INDEX REG EXPRESSION IFZERO RALF < JMS LITERR /CAN'T ALLOW LITERAL> JMS SUBX /GET RELATIVE INDEX VALUE TAD EXPVAL+2 /GET LOWER 3 BITS AND [7 /OF INDEX REG EXPR TAD OPCODE /WITH OPCODE JMS I [OUTWRD /OUT JMP I [NEXTST ADRGET, 0 /GET ADDRESS EXPR AND CHECK TYPE JMS I [EXPR /GET EXPR JMS I [ERMSG /BAD ADDR EXPR 0230 /*BX* JMP I ADRGET IFZERO RALF < LITERR, 0 /GIVE ERROR IF LITERAL TAD LITRL SNA CLA JMP I LITERR JMS I [ERMSG 1114 /*IL* JMP I LITERR > IFNZRO RALF < PDP8MR, JMS ADRGET JMP I (CHCKMR /V.56 > GETADR, 0 /GET ADDR, INDEX DCA XITEMP /SAVE INDEX INCREMENT SWITCH JMS ADRGET /GET ADDR DCA FPPSWT /KILL FPP SWITCH IFZERO RALF < JMS LITERR /DISALLOW LITERALS> TAD EXPDEF /IF EXPR WAS UNDEFINED SNA CLA IAC /OR FORCE BIT WAS SET TAD FPP2WD DCA FPPWD2 /FORCE 2 WORD FORMAT DCA XFLAG /ZERO INDEX SWT TAD EXPVAL+1 /SAVE ADDRESS VALUE DCA FPPADR TAD EXPVAL+2 DCA FPPADR+1 JMS I [GETCHR /LOOK FOR COMMA JMP I GETADR /NO INDEX TAD (-254 SZA CLA JMS I [BACK1 /WILL CAUSE A BX ERROR ISZ XFLAG /SET INDEX SWITCH TAD XITEMP /SET INDEX INCREMENT SWITCH DCA XINCR JMS ADRGET ISZ XINCR /CLEAR INDEX INCREMENT SWITCH IFZERO RALF < JMS LITERR > JMS SUBX /CALCULATE INDEX NO JMP I GETADR XITEMP, SUBX, 0 TAD INDXR+1 /CHECK FOR INDEX IN RANGE STL CIA TAD EXPVAL+2 DCA EXPVAL+2 RAL TAD INDXR CIA TAD EXPVAL+1 SZA CLA JMP BIERR TAD EXPVAL+2 CLL TAD [-10 SZL CLA BIERR, JMS I [ERMSG 0211 /*BI* JMP I SUBX IFNZRO RALF < / / AT END OF PASS, / CLEAR LENGTHS OF ALL SECTIONS / CLRSCT, 0 TAD (PNDL+3 DCA LTEMP /POINT TO USER SYMBOL SPACE CDF FLD1 CSLOOP, TAD I LTEMP /GET TYPE AND [37 /STRIP TO TYPE ONLY TAD (-3 SPA CLA /IS IT COMMON OR SECTION? JMP NOTSCT /NO, PASS IT ISZ LTEMP /BUMP POINTER TO VALUE TAD I LTEMP AND [7770 /SAVE ESD NUMBER DCA I LTEMP ISZ LTEMP DCA I LTEMP /CLEAR LOW ORDER CLA CLL CMA RAL /-2 NOTSCT, TAD (6 /BUMP POINTER TAD LTEMP /TO NEXT SYMBOL DCA LTEMP TAD NEXT /COMPARE END OF SYMBOL TABLE CIA CLL TAD LTEMP SNL CLA JMP CSLOOP /MORE TO GO CDF FLD0 JMP I CLRSCT /THAS ALL> / / IFNZRO RALF < / / ENSURE BOTH SYMBOL AND SUB-EXPR ARE ABSOLUTE / NOREL, 0 TAD WORD1 /IS SYMBOL RELOCATABLE? AND [7770 /TEST ESD BITS SZA CLA STL RAR /IF SO, FORCE ERROR JMS I (RELERR /TEST SUB EXPR JMP I NOREL DPCHKX, CLA CLL CML RAR /SET DPFLG, MODULE NEEDS DCA DPFLG /DP HARDWARE JMP I [NEXTST / SET BASE AND INDEX LOCS INDXX, CLA STL RTL /INDXR MUST JUST FOLLOW BASER BASEX, TAD (BASER-1 /POINT TO VALUE TO BE SET DCA X12 /HOPEFULLY UNUSED XR JMS I (ADRGET /COLLECT EXPRESSION TAD EXPVAL+1 DCA I X12 /HIGH ORDER AND ESD TAD EXPVAL+2 DCA I X12 /LOW ORDER JMP I [NEXTST >/THIS CONDITIONAL SASSEMBLY WAS /EXPANDED TO INCLUDE INDXX ON THIS PAGE. IT IS ALSO /COND. ASSEMBLED ON ANOTHER PAGE FOR FLAP. DELFIL, 0 TAD [7600 DCA OUFILE JMS I [OFNAME CLA IAC CIF 10 JMS I USR 4 OUFNAM 0 NOP JMP I DELFIL PAGE / / PRINT THE CURRENT LINE IF NOT ALREADY DONE / PRNTLN, 0 /PRINT THE LINE TAD OUTSWT /HAS THE LINE BEEN PRINTED YET? SZA CLA JMP I PRNTLN /YES, COOL IT ISZ OUTSWT /SET SWITCH TAD BLINE /POINTER TO LINE DCA X13 DCA CRLF /CLEAR POSITION COUNT JMP PRLTST /IN CASE OF EMPTY LINE PRLNXT, TAD I X13 /GET A CHAR TAD (-211 /WATCH OUT FOR TAB SNA JMP TABIT /CONVERT TO BLANKS TAD (211 /RESTORE ISZ CRLF /BUMP POSITION COUNT JMS I PC /PRINT IT PRLTST, ISZ LINSIZ /CHECK COUNT JMP PRLNXT JMP I PRNTLN TABIT, TAD [240 /REPLACE TAB WITH BLANKS ISZ CRLF JMS I PC TAD CRLF AND [7 SZA CLA JMP TABIT JMP PRLTST / / GO TO NEXT LINE / CRLF, 0 CLA TAD (215 JMS I PC /PRINT A CHAR TAD (212 JMS I PC ISZ LINPAG /FULL PAGE? JMP I CRLF /NO CLA CMA DCA LINPAG / / NEW PAGE, WITH HEADING AND PAGE NO / TAD PASSNO /IF NOT LISTING PASS SMA SZA CLA TAD LISTSW /OR IF NOT LISTING, SNA CLA JMP I CRLF /DO NOT EJECT TAD RFORMF SZA /DON'T F.F. FIRST TIME JMS I PC /TOP OF PAGE TAD (214 DCA RFORMF JMS I (PRTXT /PRINT HEADING TITBUF-1 -TITLEN TAD LPAGE1 /FORM FEED COUNT JMS I (DECOUT TAD LPAGE2 SNA CLA JMP .+5 /NO SUB PAGE IF 0 TAD (255 JMS I PC TAD LPAGE2 JMS I (DECOUT ISZ LPAGE2 TAD (215 /FOR BH JMS I PC TAD (212 JMS I PC TAD (-71 /RESET LINE COUNTER DCA LINPAG JMP CRLF+1 /GIVE ANOTHER CRLF RFORMF, 0 / / PRINT TEXT / PRTXT, 0 TAD I PRTXT DCA X13 ISZ PRTXT TAD I PRTXT DCA PRTTMP ISZ PRTXT TAD I X13 JMS PRINT2 ISZ PRTTMP JMP .-3 JMP I PRTXT PRTTMP= PRNTLN / PRINT2, 0 DCA P2 TAD P2 JMS I [R6R JMS P1 TAD P2 JMS P1 JMP I PRINT2 / P1, 0 AND [77 SNA JMP .+4 /PRINT ZERO AS BLANK TAD (-40 /TEST ABOVE OR BELOW 300 SPA TAD [100 /ABOVE, MAKE 301 TO 337 TAD [240 /IF BELOW, MAKE 240 TO 277 JMS I PC /PRINT IT, WHATEVER IT IS JMP I P1 / TTYOUT, 0 TLS TSF JMP .-1 TTYCLA, JMS I (CKCTC /CHECK FOR ^C - AC CONTAINS DIFFERENCE TAD (-14 /CTRL/O SZA CLA JMP I TTYOUT TAD .+2 DCA TTYOUT+1 JMP I TTYOUT / P2, 0 / IFZERO RALF < TXLNK, TEXT " LINKS" TXLLN= .-TXLNK > IFNZRO RALF < TXABR, TEXT " ABS REFS" TXALN= .-TXABR > PAGE / / GET AND EVALUATE AN EXPRESSION / EXPR, 0 /GET EXPRESSION DCA EXPVAL /ZERO EXPR VALUE DCA EXPVAL+1 DCA EXPVAL+2 CLA IAC DCA EXPDEF /AND TYPE CLA IAC /SET EXPR SWITCH TO NO EXPR DCA EXPSW DCA FPP2WD /SET FORCE SWITCH OFF CLA IAC /SET LASTOP TO + DCA LASTOP IFZERO RALF < JMS I (CHKLIT /GO CHECK FOR LITERAL> JMS I (GETSGN /IGNORE +, BUMP LASTOP IF - SYMBOL, JMS I [GETNAM /NOW PICK UP NAME JMP NOSYM /NONE, TRY OTHER JMS I [LOOKUP /LOOK IT UP JMP UNDEF /A NEW ONE IFZERO RALF < JMP ADR /YES > IFNZRO RALF < CLL RAR SNA JMP ADR SCTN, TAD I LTEMP /GET TYPE AND (40 /FORCE BIT SZA CLA ISZ FPP2WD /SET FORCE EXPR SW TAD I X10 /GET ESD FROM SYMBOL AND [7770 /ESD ONLY DCA WORD1 /INTERNALLY, SYMBOL VAL IS ZERO JMP CLR2 /SO CLEAR WORD 2> NOTDOT, TAD (256-242 /IS IT DBL QUOTE? SZA CLA JMP ENDEXP ISZ NCHARS /IS THERE ANOTHER CHAR? JMP ISQUOT /YES, USE IT ENDEXP, JMS I [BACK1 /PUT IT BACK TAD EXPSW /WAS THERE ANY EXPRESSION AT ALL? SZA CLA JMP BAD /NO, DON'T SKIP IFZERO RALF < TAD LITRL /WAS IT A LITERAL REF? SZA CLA JMS I (CRLIT /YES, STICK IT IN THE POOL> TAD LASTOP /TRAILING OPERATOR? SNA JMP OKEXP /NO, ALL IS FINE CLL RAR /IF PLUS OPERATOR TAD XINCR /AND THATS LEGAL SNA CLA OKEXP, ISZ EXPR /GOOD EXPR, BUMP RETURN BAD, JMS CKCTC CLA JMP I EXPR /AND RETURN / NOSYM, JMS I (NUMBER /LOOK FOR A NUMBER JMP ADREXP /USE NUMBER JMS I [GETCHR /NOT A NUMBER, GET A CHAR JMP ENDEXP+1 /NONE LEFT, END TAD (-256 /IS IT "." ? SZA JMP NOTDOT /NO, TRY FOR QUOTE TAD LOCTR1 /THIS WAS LOC SYMBOL DCA WORD1 /PUT VALUE INTO WORD1,2 TAD LOCTR2 JMP CLR2 /AND USE VALUE ISQUOT, DCA WORD1 TAD I CHRPTR JMP CLR2 CKCTC, 0 CLA KSF /IF NOTHING AT THE KEYBOARD, JMP I CKCTC /RETURN TAD [200 KRS /ELSE, LOOK AT IT TAD (-203 /IS IT CTRL/C? SNA JMP I [7600 /GO TO MOMMA JMP I CKCTC ADR, TAD I LTEMP /CHECK FORCE BIT FOR THIS SYMBOL AND (40 SZA CLA ISZ FPP2WD /AND SET SWITCH IF BIT ON TAD I X10 /GET FIRST WORD OF VALUE ONE, DCA WORD1 /SINGLE WORD SYMBOL, HIGH=0 TAD I X10 /GET REST OF SYMBOL CLR2, DCA WORD2 CDF FLD0 /FIX FIELD ADREXP, DCA EXPSW /KILL FIRST TIME SWITCH TAD LASTOP /PICK UP LAST OPERATOR TAD ADROP /MAKE A JMP I DCA .+1 0 /DO IT ADROP, JMP I . ADRADD ADRSUB ADRMUL ADRDIV ADRAND ADROR ADROR UNDEF, TAD FPPSWT /IS THIS AN FPP ADDR ? SNA CLA JMP .+5 /NO, SKIP AROUND TAD I LTEMP /TURN ON FORCE BIT AND (7737 /FOR THIS SYMBOL TAD (40 DCA I LTEMP DCA EXPDEF /SET TYPE TO UNDEFINED CDF FLD0 /FIX FIELD DCA EXPSW /KILL FIRST TIME SWITCH JMS I [ERMSG 2523 /*US* OPR8R, TAD (OPR8RS-1 /SET POINTER DCA X11 /TO OPERATOR TABLE DCA LASTOP /ZERO LASTOP JMS I [GETCHR /GET CHAR JMP ENDEXP+1 /NONE, DONE DCA EXTMP /SAVE IT FINDOP, ISZ LASTOP TAD I X11 /GET NEXT LIST ENTRY SNA JMP NOOPR /ZERO IS END OF LIST TAD EXTMP /COMPARE SZA CLA JMP FINDOP /LOOP JMP SYMBOL /LOOK FOR OPERAND NOOPR, DCA LASTOP /NO MATCH FOUND JMP ENDEXP /PUT IT BACK PAGE ADRADD, IFNZRO RALF < TAD WORD1 AND [7770 /IF THIS SYMBOL IS RELOCATABLE, SZA CLA /CHECK FOR EXPR VALIDITY JMS I (RELERR > TAD EXPVAL+2 /ADD FOR 15 BIT ADDRESS CLL /ZERO LINK TAD WORD2 /ADD LOW WORDS DCA EXPVAL+2 /SAVE RESULT RAL /PUT CARRY INTO BIT 11 TAD WORD1 /ORDER WORDS JMP ADRASX /LOOK FOR OPERATOR ADRSUB, IFNZRO RALF < TAD WORD1 /IF SYMBOL IS RELOCATABLE AND [7770 /WE MUST COMPARE SECTIONS CIA /IF EQUAL, EXPR BECOMES ABSOLUTE SNA /ELSE, EXPR IS ILLEGAL JMP .+5 /OK, USE EXPVAL ESD JMS I (RELERR /COMPARE: AC DELIBERATELY NON-ZERO TAD EXPVAL+1 AND [7 /IF WORD RELOCATABLE, EXP IS ABS DCA EXPVAL+1 > TAD WORD2 /SUBTR LOW 12 BITS CLL CML CIA TAD EXPVAL+2 DCA EXPVAL+2 /SAVE LOW HALF RAL TAD WORD1 /SUBTRACT HIGH HALF CIA AND [7 /DO NOT SUBTR ESD'S ADRASX, TAD EXPVAL+1 AND (7767 /PREVENT CARRY INTO BIT 8 ADRASY, DCA EXPVAL+1 /SAVE HIGH HALF JMP I (OPR8R /GET OPERATOR /INDXX HERE FOR FLAP IFZERO RALF < / SET BASE AND INDEX LOCS INDXX, CLA STL RTL /INDXR MUST JUST FOLLOW BASER BASEX, TAD (BASER-1 /POINT TO VALUE TO BE SET DCA X12 /HOPEFULLY UNUSED XR JMS I (ADRGET /COLLECT EXPRESSION TAD EXPVAL+1 DCA I X12 /HIGH ORDER AND ESD TAD EXPVAL+2 DCA I X12 /LOW ORDER JMP I [NEXTST > ADRAND, TAD WORD1 /AND AND EXPVAL+1 /HIGH AND [7 /3 BITS DCA EXPVAL+1 /HALF TAD WORD2 /THEN AND EXPVAL+2 /LOW JMP ADRAOX ADROR, TAD WORD1 /OR IS PERFORMED BY CMA /SETTING THE BITS AND EXPVAL+1 /THAT ARE ON IN B AND NOT ON IN A TAD WORD1 /AND THEN SETTING THE BITS AND [7 DCA EXPVAL+1 /THAT ARE ON IN A TAD WORD2 CMA AND EXPVAL+2 TAD WORD2 ADRAOX, DCA EXPVAL+2 IFNZRO RALF < JMS I (NOREL /**> JMP I (OPR8R /GET NEXT OPERATOR / ADRMUL, TAD WORD2 /**RL CODE CIA DCA EXPVAL+1 /MULT BY TAD EXPVAL+2 /REPEATED ADDITIONS ISZ EXPVAL+1 JMP .-2 JMP ADRAOX ADRDIV, DCA WORD1 DCA EXPVAL+1 TAD WORD2 SNA CLA JMP DIVERR TAD EXPVAL+2 CIA CLL TAD WORD2 SZL JMP .+3 /DIVIDE BY ISZ WORD1 /COUNTING SUBTRACTIONS JMP .-4 CLA TAD WORD1 JMP ADRAOX DIVERR, JMS I [ERMSG 0626 /*DV* JMP I (OPR8R /CONTINUE PDPOPR, TAD CHRPTR DCA CPTMP TAD NCHARS DCA NCTMP JMS I [GETNAM /LOOK FOR ANOTHER MICRO-INST JMP TRYEXP /NONE TAD (33 /USE INTERNAL TABLE JMS I [FIND /IS IT THERE ? JMP TRYEXP /NO TAD (-PDPOP /IS IT AN OPERATE ? SZA CLA JMP TRYEXP /NO TAD I X10 /GET VALUE CDF FLD0 DCA EXPVAL+2 PDPOR, TAD EXPVAL+2 CMA /OR THEM TOGETHER AND OPCODE TAD EXPVAL+2 DCA OPCODE JMS I [GETCHR /MORE CHARS ? JMP I (FPPS3 /NO-DONE TAD [-240 /BLANK ? SNA CLA JMP PDPOPR /YES-PROCESS NEXT JMP I (BADEXP TRYEXP, CDF FLD0 TAD CPTMP DCA CHRPTR TAD NCTMP DCA NCHARS ISZ NCTMP SKP JMP I (FPPS3 JMS I [EXPR JMP I (BADEXP JMP PDPOR TXSYM, TEXT " SYMBOLS," TXSLN=.-TXSYM PAGE IFZERO RALF < / / LITERAL THINGS / CHKLIT, 0 /CHECK FOR LITERAL DCA PAGENO /ZERO PAGE NUMBER DCA LITRL JMS I [GETCHR /GET CHARACTER JMP I CHKLIT /NO LITERAL TAD (-250 /CHECK FOR ( SNA ISZ PAGENO /CURRENT PAGE LITERAL SZA /SKIP IF ALREADY ZERO TAD (-63 /CHECK FOR [ SNA ISZ LITRL /SET SWITCH SZA CLA JMS I [BACK1 /PUT BACK NON ([ JMP I CHKLIT / / CREATE A LINK FOR OFF-PAGE REFERENCE / MAKLNK, TAD (THSPAG /PROPER RETURN ADDR DCA CRLIT TAD OPCODE /SET INDIRECT BIT TAD (400 DCA OPCODE CLA IAC DCA PAGENO /SET INDICATOR ISZ LINKS /COUNT ANOTHER LINK GENERATED ISZ LINKSW /SET SWITCH FOR APOSTROPHE OUTPUT JMP NOTP0 CRLIT, 0 /CREATE LITERAL /VALUE:EXPVAL, IN PAGE:PAGENO TAD PAGENO /CHECK FOR PAGE 0 SNA CLA JMP ISP0 /PAGE 0 LITERAL NOTP0, TAD (CPLBUF /SET PTR TO LITERAL BUFFER DCA LITBAS TAD LOCTR2 /CHECK FOR LIT BUFFER FULL AND [100 SNA CLA JMP DOLIT-1 /USE 77 AS LIMIT TAD LOCTR2 AND [177 JMP DOLIT /USE CURRENT ADDR AS LIMIT ISP0, TAD (P0LBUF /USE PAGE 0 LIT BUFFER DCA LITBAS TAD [77 /ASSUME FIRST 64 WORDS USED DOLIT, DCA NWUSED TAD PAGENO /GET POINTER TO TAD [P0LIT /LITERAL BOUNDARY DCA XPAGE TAD I XPAGE /DISPLACEMENT OF LIT BUFR - 1 DCA LITPTR /INTO LITPTR NOTIT, TAD LITPTR /POINTER+SIZE TAD (-177 /SHOULD BE LESS THAN 177 SMA CLA JMP NEWLIT /ENTER NEW LITERAL TAD LITPTR /NOW GET POINTER TAD LITBAS /TO TABLE DCA X11 /FOR COMPARISON ISZ LITPTR /INCREMENT POINTER TAD I X11 /GET WORD OF LITERAL CIA TAD EXPVAL+2 /COMPARE PROTOTYPE SZA CLA JMP NOTIT /NOT IT, SLIDE POINTER AND RETRY LITADR, TAD PAGENO /PAGE 0 ? SZA CLA TAD LOCTR2 /NO, CURRENT PAGE, GET ADDRESS AND [7600 TAD LITPTR /PLUS PAGE DISPLACEMENT DCA EXPVAL+2 /INTO VALUE TAD LOCTR1 RETLIT, DCA EXPVAL+1 JMP I CRLIT NEWLIT, CLA CMA TAD I XPAGE /MOVE LITERAL BOUNDARY DOWN DCA X10 /ADDRESS OF NEW LITERAL TAD NWUSED /CHECK FOR PAGE OVERFULL CIA TAD X10 SMA CLA JMP .+5 /NOT FULL JMS I [ERMSG /*PO* 2017 DCA EXPVAL+2 /ZERO ADDRESS JMP RETLIT TAD X10 DCA I XPAGE TAD I XPAGE /SET UP POINTER FOR MOVE TAD LITBAS DCA X10 TAD EXPVAL+2 /MOVE LITERAL IN DCA I X10 TAD I XPAGE /SET UP LITERAL ADDRESS IAC DCA LITPTR JMP LITADR /RETURN LITERAL ADDRESS LITBAS, 0 NWUSED, 0 LITPTR, 0 PAGENO, 0 XPAGE, 0 PAGE /> / / FIND SYMBOL TABLE ENTRY / FOR THE SYMBOL IN BUCKET AND NAME 1, 2, 3 / SKIP IF FOUND WITH TYPE IN AC / FIND, 0 /SYMBOL TABLE LOOKUP TAD BUCKET /GET BUCKET ADDRESS CDF FLD1 /GO TO FIELD 1 LOOK, DCA OLDN3 /THIS IS PTR OF PREV ENTRY TAD I OLDN3 /THIS IS ADR OF NEXT ENTRY SNA /IF ZERO, THEN JMP I FIND /IT AIN'T HERE DCA X10 /SAVE NEXT NAME PTR TAD NAME1 /COMPARE NAMES CIA CLL TAD I X10 /WORD 1 SZA CLA JMP NOTSAM TAD NAME2 CIA CLL TAD I X10 /WORD2 SZA CLA JMP NOTSAM TAD NAME3 CIA CLL TAD I X10 /COMPARE LAST CHAR AND [7700 /HIGH HALF ONLY SZA CLA JMP NOTSAM ISZ FIND /IF FOUND BUMP RETURN TAD X10 DCA LTEMP /ADDR OF TYPE WORD TAD I LTEMP /GET TYPE INTO AC AND [37 /WITHOUT FORCE BIT JMP I FIND /RETURN NOTSAM, SZL CLA /IS NAME 1,2,3 .LT. ENTRY JMP I FIND /YES, IT ISN'T HERE TAD I OLDN3 /GET ADDR OF LINK INTO AC JMP LOOK /LOOP / / FIND SYMBOL, OR IF NOT THERE, CREATE ENTRY FOR IT / LOOKUP, 0 JMS FIND JMP .+4 SZA ISZ LOOKUP /SKIP RETURN IF DEFINED JMP I LOOKUP /RETURN TYPE CODE TAD I OLDN3 /GET FORWARD LINK TO DCA I NEXT /NEXT ENTRY INTO NEW ENTRY TAD NEXT /PUT FORWARD LINK TO NEW DCA I OLDN3 /ENTRY INTO PREVIOUS ENTRY TAD NAME1 /PUT IN NAME DCA I NEXT TAD NAME2 DCA I NEXT TAD NAME3 DCA I NEXT TAD NEXT /X10=NEXT DCA X10 TAD NEXT /LTEMP=NEXT DCA LTEMP DCA I NEXT /INITIAL VALUE IS ZERO DCA I NEXT TAD NEXT /CHECK FOR TABLE FULL CLL TAD [200 /GONNA OVERFLO PS8? SNL CLA JMP I LOOKUP /NO PROBLEMS, RETURN (NO SKIP) JMS I [ERMSG1 2324 /*ST* / / COLLECT AN INTEGER IN THE CURRENT RADIX / NUMBER, 0 /GET INTEGER NUMBER (NO SIGN) DCA NSWTCH /CLEAR SWITCH DCA NOFLO /CLEAR OVRFLO SW DCA WORD1 /CLEAR 24 BIT NUMBER DCA WORD2 NUMLUP, JMS I (DIGIT JMP NODGT /TOO BAD DCA NUM /YES, SAVE IT TAD WORD1 /SAVE CURRENT VALUE DCA NUM1 /OF NUMBER TAD WORD2 DCA NUM2 JMS SHIFT /SHIFT WORD1,2, LEFT 1 (MULT BY 2) JMS SHIFT /DO IT AGAIN (MULT BY 4) TAD RADIX /LOOK AT RADIX (1=DECIMAL) SNA CLA JMP OCTNUM /ITS OCTAL CLL /DECIMAL, ADD IN NUMBER TAD NUM2 TAD WORD2 /THUS MULTIPLYING BY 5 DCA WORD2 RAL TAD NUM1 TAD WORD1 DCA WORD1 JMP ADDDGT OCTNUM, TAD NUM AND [7770 /CHECK FOR 8 OR 9 SZA CLA ISZ NOFLO /SET ERROR FLAG ADDDGT, JMS SHIFT /SHIFT LEFT 1 AGAIN, THUS TAD WORD2 /MULTIPLYING BY 8 OR 10 CLL /THEN ADD IN NEW DIGIT TAD NUM DCA WORD2 RAL TAD WORD1 DCA WORD1 SZL /BEWARE OF OVERFLO ISZ NOFLO JMP NUMLUP /LOOP NODGT, TAD NSWTCH /WAS THERE A NUMBER SNA CLA ISZ NUMBER /NO, SKIP TAD WORD1 AND [7770 /CHECK FOR MORE THAN 15 BITS SNA TAD NOFLO /OR GROSS OVERFLOW SNA CLA JMP I NUMBER /ALL GREEN JMS I [ERMSG 1605 /*NE* JMP I NUMBER /RETURN NOFLO= LOOKUP /ZERO IF NO ERRORS NUM= FIND NUM1= EXTMP NUM2= EXTMP2 NSWTCH, /ZERO IF NO DIGITS SHIFT, 0 /SHIFT DOUBLE WORD LEFT 1 TAD WORD2 CLL RAL DCA WORD2 TAD WORD1 RAL DCA WORD1 SZL /IF BIT SHIFTED FROM HI WORD, ISZ NOFLO /SET ERROR FLAG JMP I SHIFT PAGE / / BACK UP GETCHR POINTERS, / WE DON'T WANT THIS ONE / BACK1, 0 CLA CMA /BACKUP COUNT TAD NCHARS DCA NCHARS CLA CMA /AND POINTER TAD CHRPTR DCA CHRPTR JMP I BACK1 / / GET NEXT CHAR FROM LINE BUFFER / FOR ASSEMBLY PURPOSES ONLY / SKIP UNLESS END OF LINE (CR, ;, OR /) / GETCHR, 0 JMS GETAC GETSKP, ISZ GETCHR /SKIP RETURN JMP I GETCHR BLANK, JMS GETAC /COME HERE IF BALNK OR TAB TAD (-257 /END OF LINE ON SLASH AFTER BLANK SNA CLA JMP GETCND JMS BACK1 /PUT IT BACK TAD [240 /AND RETURN A SINGLE BLANK JMP GETSKP /SKIP OUT SEMICL, ISZ SCSWT JMS BACK1 /PUT BACK SEMI COLON JMP I GETCHR GETAC, 0 ISZ NCHARS /END OF LINE? JMP .+4 /NO, GET IT GETCND, CLA CMA /YES, RESET IN CASE OF DCA NCHARS /ANOTHER CALL JMP I GETCHR /RETURN END OF LINE TAD I CHRPTR /PICK UP NEXT TAD [-240 /CHECK FOR BLANK SZA TAD (240-211 /OR TAB SNA JMP BLANK /THEY GET SPECIAL HANDLING TAD (211-273 /LOOKOUT FOR SEMICOLON SNA JMP SEMICL /ALSO SPECIAL TAD (273-276 /IGNORE CLOSE ANGLE BRACKET SNA JMP GETAC+1 /GET ANOTHER TAD (276 /ELSE, RESTORE CHAR JMP I GETAC /AND PASS IT BACK / / COLLECT A SYMBOL IN BUCKET, NAME 1,2, & 3 / NO SKIP ON RETURN IF NO SYMBOL / GETNAM, 0 DCA NAME1 /CLEAR SYMBOL SPACE DCA NAME2 DCA NAME3 JMS LETTER /GET A LETTER JMP ISSYM JMS GETCHR /CHECK FOR # JMP I GETNAM /NOPE TAD (-"# SNA CLA JMP ISSYM JMS BACK1 JMP I GETNAM ISSYM, DCA BUCKET ISZ GETNAM /ONE LETTER DOTH A SYMBOL MAKE JMS GNC /FRIENDLY LOCAL SUBR JMS R6L DCA NAME1 JMS GNC TAD NAME1 DCA NAME1 JMS GNC JMS R6L DCA NAME2 JMS GNC TAD NAME2 DCA NAME2 JMS GNC JMS R6L DCA NAME3 JMS GNC /AFTER 6, WE IGNORE SKP CLA GNC, 0 JMS LETTER JMP I GNC /RETTURN LETTER JMS DIGIT JMP I GETNAM /EMPTY HANDED, RETURN TO CALLER TAD (60 JMP I GNC / / IF NEXT CHAR IS A LETTER, RETURN 6 BITS / IF NOT, REPLACE CHAR AND SKIP. / LETTER, 0 JMS GETCHR JMP NLETR /NO LETTER, SKIP TAD (-333 CLL CML TAD (33 SZA SNL /DON'T ALLOW 300 JMP I LETTER JMS BACK1 NLETR, ISZ LETTER JMP I LETTER / / IF NEXT CHAR IS A DIGIT (0-9) RETURN VALUE AND SKIP / DIGIT, 0 JMS GETCHR JMP I DIGIT TAD (-272 CLL TAD (12 SNL JMP NDIGT ISZ DIGIT JMP I DIGIT NDIGT, JMS BACK1 JMP I DIGIT / R6L, 0 CLL RTL RTL RTL JMP I R6L / R6R, 0 RTR RTR RTR AND [77 JMP I R6R PAGE / / BUILD AN INSTRUCTION / FIXOPC, 0 /COMBINE OPCODE PARTS TAD XFLAG /CHECK INDEX SWITCH SNA CLA JMP ZRONDX /IF ZERO, NO INDEX REG CLA CMA TAD LASTOP /IF INDEX, CHECK FOR INCR SNA CLA TAD [100 /YES, PUT + BIT ON TAD OPCODE /COMBINE WITH OPCODE DCA OPCODE TAD EXPVAL+2 /GET INDEX REG. EXPR AND [7 /ONLY 3 BITS CLL RTL /SHIFT INTO POSITION RAL ZRONDX, TAD OPCODE /ADD OPCODE TAD (400 /TURN ON TYPE BIT DCA OPCODE /SAVE OPCODE JMP I FIXOPC /RETURN / OPR8RS, -253 /PLUS -255 /MINUS -252 /STAR (MULTIPLY) ** -257 /SLASH (DIVIDE) -246 /AMPERSAND (AND) -240 /SPACE (OR) -241 /EXCLAMATION (OR) 0 /END OF LIST / / FATAL ERRORS / ERMSG1, 0 /PASS 1 (FATAL) MESSAGES CDF TAD I ERMSG1 /GET CODE DCA .+3 DCA PASSNO JMS ERMSG /DO THE MSG THING 0 IFZERO RALF < RETSYS, > TSF /FINISH TYPING JMP .-1 JMP I [7600 /EXIT TO PS8 / / GENERAL GARBAGE TYPE ERRORS / ERMSG, 0 CDF FLD0 /FIX FIELD CLA /NO MESSAGE ON PASS 1 TAD PASSNO SMA SZA /IF PASS 3, OUTPUT LEADING CRLF JMS I [CRLF SPA CLA JMP MSGDUN TAD (5555 /MINUSES JMS I [PRINT2 TAD I ERMSG /2-CHAR CODE JMS I [PRINT2 /PRINT THE MESSAGE TAD (5555 JMS I [PRINT2 TAD PASSNO SZA CLA JMP .+4 JMS I [PRINT2 PLINE, JMS I (PRNTLN JMS I [CRLF ISZ ERRORS /BUMP COUNT MSGDUN, ISZ ERMSG JMP I ERMSG / / OUTPUT DECIMAL / SUPPRESS LEADING ZEROS / PRINT "NO" INSTEAD OF "0" / DECOUT, 0 SNA /ZERO IS SPECIAL JMP DECNO /NO INSTEAD OF 0 DCA OTEMP DCA OCNT JMS DEC2 /GET THOUSANDS -1750 JMS DEC2 /HUNDREDS -144 JMS DEC2 /TENS -12 TAD OTEMP /UNITS (NO ZERO SUPPRESS HERE) JMS PDIG /PRINT LAST DIGIT JMP I DECOUT /EASY, WHEN YOU KNOW HOW / DECNO, TAD (1617 /NO JMS I [PRINT2 JMP I DECOUT / / LAZY MAN'S DIVISION / DEC2, 0 CDF FLD0 /JUST TO MAKE SURE DEC3, CLA CLL TAD OTEMP SNA JMP DEC4 TAD I DEC2 /SUBTRACT DIVISOR SNL /TOO MUCH? JMP DEC4 /YES, STOP NOW DCA OTEMP /NO, SAVE NEW REMAIN ISZ OCNT /BUMP QUOTIENT JMP DEC3 /DO IT AGAIN DEC4, CLA ISZ DEC2 /SKIP RETURN TAD OCNT /CHECK FOR SIGNIFICANCE SNA JMP I DEC2 /NONE JMS PDIG CLA STL RAR /FORCE SIGNIFICANCE DCA OCNT JMP I DEC2 / TENTH, -111 1463;1463;1463 1463;1463;1463 TEN, 1 PDIG, 0 TAD P260 JMS I PC JMP I PDIG P260, 260 5 / / OCTAL CONVERSION, THE HARD WAY / OCTOUT, 0 DCA OTEMP STL RAR /NO ZERO SUPPRESS DCA OCNT JMS DEC2 -1000 JMS DEC2 -100 JMS DEC2 -10 TAD OTEMP JMS PDIG JMP I OCTOUT PAGE / / OUTPUT ONE WORD / IFNZRO RALF < / / TEXT TYPE CODES: TTABS= 0400 TTORG= 1000 TTREL= 1400 / OUTREL, DCA WRD /HOLD FIRST WORD DCA LINKSW /CLEAR ABSOLUTE REF INDICATOR TAD FPPADR /GET ESD CODE RTR RTR /RIGHT IN AC AND [177 /STRIP TO ESD ONLY SNA /CHECK FOR ABSOLUTE JMP PUTABS DCA FPPADR /SAVE ESD TAD PASSNO /CHECK FOR PASS 2 SZA CLA JMP PRNTRL /IF NOT, TREAT NORMALLY DCA ABSOP CLA STL RTL JMS I (FULCHK /ENSURE 3 WORDS LEFT TAD FPPADR /GET ESD AGAIN TAD (TTREL /INSERT CONTROL CODE DCA I OUTPTR TAD WRD /FIRST DATUM DCA I OUTPTR TAD FPPADR+1 DCA I OUTPTR JMS I (FULCHK /IS IT FULL? JMS BMPLOC /TWO WORDS OUT JMS BMPLOC /SO LOCCTR +2 JMP I [NEXTST PUTABS, ISZ ABREFS /COUNT IT ISZ LINKSW /SET FLAG PRNTRL, TAD WRD /GET FIRST WORD JMS OUTWRD TAD FPPADR+1 JMS OUTWRD JMP I [NEXTST > / OUTWRD, 0 /OUTPUT ROUTINE DCA WRD /SAVE WORD IFZERO RALF < TAD LOCTR2 /GET LOW 12 BITS OF LOCATION JMS I [R6L AND [37 /GET PAGE NUMBER (WITHIN FIELD) DCA OTEMP /SAVE PAGE NUMBER TAD OTEMP SZA CLA /POINTER TO LITERAL POINTER IAC TAD [P0LIT DCA OWTEMP TAD LOCTR2 /GET CURRENT ADDRESS DISPLACEMENT AND [177 CIA /COMPARE WITH LITERAL BOUNDARY TAD I OWTEMP SMA CLA JMP .+3 /NO PAGE OVER FLOW JMS I [ERMSG 2017 /*PO*> TAD PASSNO /CHECK PASS SZA JMP PRNTST /ITS NOT PASS 2 IFZERO RALF < TAD WRD /NOW OUTPUT WORD JMS I [R6R JMS OOCHAR TAD WRD AND [77 JMS OOCHAR > IFNZRO RALF < TAD ABSOP /CHECK FOR ALREADY IN ABS OUTPUT SZA CLA JMP INABS /NO PROBLEM CLA IAC JMS I (FULCHK TAD (TTABS /SET ABS CONTROL CODE DCA I OUTPTR TAD OUTPTR /SAVE POINTER FOR FUTRUE REF DCA ABSOP INABS, ISZ I ABSOP /BUMP COUNT TAD WRD DCA I OUTPTR JMS I (FULCHK /GOOD!> PRNTST, SMA SZA CLA TAD LISTSW /IS LIST ON ? SNA CLA JMP ENDOUT /NO, DONT PRINT JMS I [CRLF /NEW LINE TAD LOCTR1 /PRINT LOCATION COUNTER AND [7 JMS I (PDIG TAD LOCTR2 /NEXT FOUR DIGITS JMS I [OCTOUT TAD [240 JMS I PC TAD WRD /NOW WORD JMS I [OCTOUT TAD LINKSW /LINK GENERATED ON THIS LINE? SZA CLA TAD (4700 /IF SO, GIVE APOSTROPHE SPACE JMS I [PRINT2 DCA LINKSW /CLEAR SW JMS I (PRNTLN /PRINT LINE IF NECESSARY ENDOUT, JMS BMPLOC /BUMP LOC CNTR JMP I OUTWRD /RETURN / WRD, BMPLOC, 0 ISZ LOCTR2 /BUMP LOW ORDER JMP I BMPLOC CLA IAC TAD LOCTR1 AND (7767 /STOP CARRY INTO BIT 8 DCA LOCTR1 JMP I BMPLOC IFZERO RALF < / / PUNCH CONTROL / NOPNCX, CLA IAC ENPNCX, DCA PNCHOF JMP I [NEXTST / / OUTPUT AN ORIGIN / PUTORG, 0 TAD PASSNO /CHECK FOR PASS 2 SZA CLA JMP I PUTORG /ELSE FORGET IT TAD LOCTR2 /OUTPUT FIRST CHAR JMS I [R6R TAD [100 JMS OOCHAR /OUTPUT CHAR TAD LOCTR2 /NOW LOWER HALF OF ORIGIN AND [77 JMS OOCHAR JMP I PUTORG OWTEMP, CHAROO, 0 OOCHAR, 0 /OUTPUT CHAR AND COMPUTE CHKSUM DCA CHAROO TAD PNCHOF /PUNCHING? SZA CLA JMP I OOCHAR /NOPE TAD CHAROO TAD CHKSUM DCA CHKSUM TAD CHAROO JMS I [OCHAR JMP I OOCHAR > / / BEGIN NEXT PASS / WITH APPROPRIATE THINGS RESET / TO DEFAULT VALUES / RESET, JMS I (IOPEN /RE-SELECT FIRST INPUT FILE TAD USR /EITHER 200 OR 7700 SPA CLA /IS USR IN CORE? JMP .+6 /NO CIF 10 /YES, DISMISS IT JMS I USR 11 /USROUT TAD [7700 DCA USR /ITS GONE IFNZRO RALF < CLA STL RTL /COUNTING FROM 2, DCA ESDNO /RESET ESD COUNT JMS I (CLRSCT /ZERO ALL SECTION LENGTHS> DCA ASMOF /ZERO CONDITIONAL SWITCH DCA SCSWT /ZERO SEMICOLON SWITCH TAD SYONLY /IF NOT SYM MAP ONLY DCA LISTSW /FORCE LIST ENABLE CLA IAC DCA LPAGE1 DCA LPAGE2 CLA CMA DCA LINPAG IFZERO RALF < TAD [177 DCA P0LIT /RESET LITERAL BUFFER POINTERS TAD [177 DCA CPLIT TAD [200 > DCA LOCTR2 /LOCATION COUNTER IFNZRO RALF < TAD (20 > DCA LOCTR1 CLL CML RAR /4000 DCA BASER /SET BASE BEYOND BELIEF DCA INDXR DCA INDXR+1 DCA RADIX /RESET DEFAULT OCTAL DCA ERRORS /ZERO ERROR COUNT DCA LINKS ISZ PASSNO /BUMP PASS NUMBER JMP I (NEWLIN JMP I (NEWLIN /DO NEXT PASS PAGE / / END OF A PASS / ENDX, IFZERO RALF < DCA PNCHOF /RE-ENABLE PUNCH> IFNZRO RALF < JMS I (BORG /SET MAX LEN OF CURRENT SECT> TAD PASSNO SMA CLA /WHAT PASS WAS THIS? JMP EOP2 /NOT THE FIRST IFNZRO RALF < TAD (INBUF-400 DCA I (INBUFP /MOVE INPUT BUFFER OVER DMPESD> TAD BFILE SNA CLA JMP START3 /NO BINARY, START PASS 3 IFZERO RALF < TAD [200 /START BIN OUT WITH L/T JMS I [OCHAR JMP I (RESET > IFNZRO RALF < JMP I (DMPESD /OUTPUT EXT SYM TABLE> / EOP2, IFZERO RALF < CLA IAC /DUMP CURRENT PAGE LITERALS JMS I (DMPLIT JMS I (DMPLIT /THEN DUMP PAGE 0 LITERALS> TAD PASSNO SMA SZA CLA JMP EOP3 /YES, PRINT SYMBOL TABLE IFZERO RALF < TAD CHKSUM /OUTPUT CHECKSUM JMS I [R6R JMS I [OCHAR TAD CHKSUM AND [77 JMS I [OCHAR /LOWER HALF TAD [200 /TRAILER CHAR JMS I [OCHAR > IFNZRO RALF < DCA I OUTPTR /SET OUTPUT END INDICATOR> JMS I (OCLOSE /CLOSE THE BINARY FILE START3, DCA PASSNO /SKIP PASS TWO JMS I (OOPEN /OPEN LISTING FILE IFZERO RALF < JMP NOP3 /NO LISTING, GIVE INFO ON TTY> IFNZRO RALF < JMP I (RETSYS > TAD [OCHAR /CHANGE PRINT ROUTINE DCA PC JMP I (RESET /NO,RESET EVERYTHING / / END OF LAST PASS / GIVE SOME STATISTICS / EOP3, CLA CMA DCA LINPAG JMS I [CRLF NOP3, JMS I (7607 /READ IN OVERLAY 0100 OVERLY, OVBUFR 40 /USE SYS SCRATCH BLK JMP I (7605 JMP I OVERLY CHCKMR, 0 TAD OPCODE /BE SURE ALL REFS ARE AND [200 /ARE ON SAME PG SZA CLA TAD LOCTR2 AND [7600 CIA TAD EXPVAL+2 AND [7600 SZA CLA ADRERR, JMS I [ERMSG 0201 /**BA** TAD EXPVAL+2 AND [177 TAD OPCODE JMS I [OUTWRD JMP I [NEXTST IOERR, TAD INOP /REMOVE JMS PRNTLN DCA PLINE JMS I [ERMSG1 1117 /**IO** INOP, NOP PAGE IFZERO RALF < / ORG THINGS FOR ABSOLUTE ASSEMBLIES / TRYSTR, JMS I [GETCHR JMP I [NEXTST /WHAT CAN YOU DO? TAD (-252 /IS IT AN ORG SZA CLA JMP I (GETEXP /NO, SOME FUNNY EXPR, MAYBE ORGX, JMS I (ADRGET TAD LOCTR1 /CHECK FOR NEW FIELD CIA TAD EXPVAL+1 SNA CLA JMP SAMFLD /NOT A DIFFERENT FIELD CLA IAC JMS DMPLIT /DUMP CURRENT PAGE LITERALS JMS DMPLIT /DUMP PAGE 0 LITERALS TAD EXPVAL+1 AND [7 DCA LOCTR1 TAD PNCHOF /PUNCHING ENABLED? SNA TAD PASSNO /PASS 2? SZA CLA JMP SAMPAG /NO, DON'T OUTPUT CHANGE FIELD TAD LOCTR1 /NEW FIELD BITS RTL CLL RAL TAD (300 /TURN ON THE LEFT TWO BITS JMS I [OCHAR /PUT IT OUT (NOT IN CHECK SUM) JMP SAMPAG /DO THE SAME FOR CURRENT PAGE SAMFLD, TAD LOCTR2 AND [7600 /CHECK FOR SAME PAGE DCA LTEMP TAD EXPVAL+2 AND [7600 CIA TAD LTEMP SNA CLA JMP SAMPAG /PAGE IS THE SAME CLA IAC JMS DMPLIT /DUMP CURRENT PAGE LITERALS SAMPAG, TAD EXPVAL+2 DCA LOCTR2 JMS I (PUTORG JMP I [NEXTST /DONE PAGEX, TAD LOCTR2 /ADVANCE TO NEXT PAGE CLL TAD [177 AND [7600 DCA EXPVAL+2 RAL TAD LOCTR1 DCA EXPVAL+1 JMP ORGX+1 /DO ORG THINGS DMPLIT, 0 DCA PAGEN /SAVE PAGE INDICATOR TAD OUTSWT /SAVE OUTPUT SWITCH DCA SWTOUT ISZ OUTSWT /DONT PRINT LINE WITH LITERALS TAD PAGEN TAD [P0LIT /GET BOUNDARY POINTER DCA LTEMP TAD PAGEN /WHICH LITERAL BUFFER ? SNA CLA TAD (P0LBUF-CPLBUF /PAGE 0 BUFFER TAD (CPLBUF /CURRENT PAGE BUFFER TAD I LTEMP /PLUS PAGE ADDRESS DCA X10 /GIVES START OF LITERALS -1 TAD PAGEN SZA CLA TAD LOCTR2 /UPPER FIVE BITS OF ADDRESS AND [7600 TAD I LTEMP /PLUS LOWER SEVEN IAC /PLUS ONE DCA LOCTR2 /GIVES LOCATION COUNTER TAD LOCTR2 AND [177 /ANYTHING TO DUMP? SNA CLA JMP DMPFIN /NO TAD PASSNO SMA SZA CLA JMS I [CRLF /ONLY IF PASS 3 JMS I (PUTORG TAD [177 /STORE SPURIOUS LITERAL BOUNDARY DCA I LTEMP /TO PREVENT FALLACIOUS *PO* MESSAGES LITLUP, TAD I X10 /NO, GET NEXT LITERAL JMS I [OUTWRD /OUTPUT WORD AND BUMP LC TAD X10 /DONE? IAC AND [77 SZA CLA JMP LITLUP /LOOP DMPFIN, TAD SWTOUT /RESTORE OUTPUT SWITCH DCA OUTSWT JMP I DMPLIT /ALL DONE SWTOUT, 0 > EXPON, TAD LASTOP DCA TMP DCA LASTOP JMS I (GETSGN /GET SIGN OF EXPONENT TAD RADIX DCA OTEMP ISZ RADIX /SET RADIX TO DECIMAL JMS I (NUMBER /GET EXPONENT NOP TAD OTEMP DCA RADIX /RESTORE RADIX TAD TMP CLL RAR TAD LASTOP RAR /LASTOP TO LINK, DCA LASTOP /TMP TO SIGN OF LASTOP TAD WORD2 SZL CIA /PUT SIGN ON EXP JMP I (OVER TMP, 0 IFZERO RALF < PAGE / > IFNZRO RALF < / / IF ALL CONDITIONS ARE RIGHT, CALL THE LOADER / RETSYS, JMS I (DELFIL /THIS LOCATION USED BY INIT CODE /MAY BE ZEROED BY IT. USED TO DELETE F4 OUTPUT FILE WHEN CHAINING /FROM COMPILER + OUTPUT DEV IS NOT SYS CDF 10 TAD (7604 /POINT TO 2ND OUT FILE THING DCA X11 TAD (7611 /POINTER TO 3RD DCA X10 TAD (-5 /LENGTH OF SUCH THINGS DCA LTEMP TAD I X10 /MOVE 3RD TO 2ND DCA I X11 /FOR LOADER MAP FILE ISZ LTEMP JMP .-3 TAD I [7600 /WAS THERE A FIRST OUT FILE AND NP17 /(BINARY OUT)* DCA LTEMP TAD OUTBLK /GET FILE LENGTH AND (377 CLL RTL RTL CIA TAD LTEMP /COMBINE UNIT AND LEN DCA I X10 /FOR FIRST INPUT FILE TO LOADER TAD PASBLK /STARTING BLOCK DCA I X10 DCA I X10 /THAT'S THE END OF INPUT CDF 0 TAD ERRORS /IF NO ERRORS SNA CLA ISZ CHNSW /SHOULD WE CHAIN? JMP I (7605 /NO!!! ISZ I (7746 /** CIF 10 JMS I USR 6 /CHAIN LDRBLK, 0 /FIRST BLOCK OF LOADER / PASBLK, 0 /FIRST BLOCK OF FILE PASSED CHNSW, 0 /-1 TO ENABLE CHAIN LOADER / / OUTPUT A BLOCK OF BINARY / OUTBLK, 0 /AT END OF PASS2, BECOMES /LENGTH OF BINARY FILE TAD (OUCTL /DEV HNDLR CONTROL WORD JMS I (OUTDMP /CALL THE HANDLER TAD MOUBUF DCA OUTPTR /RESET BUFFER POINTER DCA ABSOP /FORCE NEW ABS OUTPUT CONTROL JMP I OUTBLK MOUBUF, OUBUF-1 / TYPCOD, 2500 /UNDEFINED 0000 /ADDRESS 3000 /XTERNAL 0300 /COMMON 2300 /SECTION -1 /? -1 /? 7000 /8-M0DE SECTION 3200 /8-MODE PAGE0 COMMON SECTION 0600 /8-MODE FIELD1 SECTION BORG, 0 CDF FLD0 TAD LOCTR1 RTR RTR AND [177 TAD (ESDBUF-1 /POINT INTO ESD TABLE DCA LTEMP TAD I LTEMP TAD (4 /ADDRESS VALUE DCA LTEMP CDF FLD1 TAD LOCTR1 AND [7 /GET ADDR BITS ONLY DCA BOTMP /SAVE EM TAD I LTEMP /OLD HIGH VALUE BITS AND [7 CIA TAD BOTMP /COMPARE THEM SPA JMP BOXIT /NO UPDATE REQUIRED SNA CLA JMP BOCHKL /NO DIFFERENCE YET TAD LOCTR1 DCA I LTEMP /RESET TO NEW HIGH ISZ LTEMP JMP BOSETL /SKIP OVER TEST BOCHKL, ISZ LTEMP /POINT TO LO-ORDER TAD I LTEMP CIA CLL TAD LOCTR2 /COMPARE LOW ORDERS SNL CLA JMP BOXIT /NO REPLACE BOSETL, TAD LOCTR2 DCA I LTEMP BOXIT, CLA CDF FLD0 JMP I BORG /WHEW! BOTMP= EXTMP PAGE NEWESD, 0 TAD ESDNO TAD (-177 /CHECK LIMIT SPA CLA JMP .+3 JMS I [ERMSG1 /TOO MANY 3023 /*XS* ISZ ESDNO /BUMP COUNT TAD PASSNO /DON'T CHANGE TABLE AFTER PASS 1 SMA CLA JMP I NEWESD TAD ESDNO TAD (ESDBUF-1 /INDEX BUFFER DCA ESDTMP CDF FLD1 TAD I OLDN3 /GET POINTER TO THIS SYMBOL CDF FLD0 DCA I ESDTMP TAD ESDTMP TAD [200 DCA ESDTMP /NOW ADDRESS CHAR TABLE TAD BUCKET DCA I ESDTMP JMP I NEWESD ESDTMP= EXTMP / / RELOCATION CONTROL PSEUDO-OPS / ENTRX, JMS I [GETNAM /NAME OF ENTRY POINT JMP ESDERR JMS I [LOOKUP /FIND IT JMP QENT /UNDEFINED CLL RAR /MUST BE USER ADDR TYPE SNA CLA TAD I X10 /LOOK AT ESD AND [7770 SZA CLA /IS IT RELOCATABLE? JMP OKENT /YES QENT, JMS I [ERMSG /NO MESSAGE ON PASS 1 1105 /*IE* OKENT, JMS NEWESD /CREATE AN ENTRY FOR IT JMP I [NEXTST / EXTRNX, CLA STL RTL DCA STYPE /EXTERNS ARE TYPE 2 JMS I [GETNAM JMP ESDERR JMS I [LOOKUP JMS CRESD /IF UNDEFINED, DEFINE IT CLL RTR /IF DEFINED, CHECK LEGALITY SZA CLA ESDERR, JMS I [ERMSG 0523 /*ES* JMP I [NEXTST / CLA IAC /FIELD1 SECT=11 IAC /COMMZ SECT=10 SECT8X, TAD [7 JMP COMMX+1 SECTX, CLA IAC COMMX, TAD (COMMN /GET DESIRED CODE DCA STYPE /FOR SECTION TYPE JMS I [GETNAM DCA BUCKET /IF NO NAME, BLANK COMMON JMS I [LOOKUP JMP NEWSCT /UNDEFINED CIA /OLD FRIEND TAD STYPE /SAME? SNA CLA JMP SETSCT /YUP, DO IT JMP ESDERR / CRESD, 0 JMS NEWESD /CREATE NEW ESD ENTRY CDF FLD1 TAD I LTEMP /SET TYPE CODE AND [7700 TAD STYPE DCA I LTEMP ISZ LTEMP TAD ESDNO CLL RTL /ESD NO TO SYMBOL VLAUE RTL DCA I LTEMP CDF FLD0 JMP I CRESD / NEWSCT, JMS CRESD /CREATE AN ESD SETSCT, JMS I (BORG /ADJUST LOC CTR'S CDF FLD1 TAD I X10 /GET NEW LOC CTR VALUE DCA LOCTR1 TAD I X10 DCA LOCTR2 /LOW LOC CTR CDF FLD0 JMP PUTORG / ORGX, JMS I (ADRGET /GET ORG EXPR JMS I (BORG TAD EXPVAL+1 AND [7770 /DOES IT HAVE AN ESD? SNA CLA TAD LOCTR1 /IF NOT, KEEP CURRENT ESD AND [7770 TAD EXPVAL+1 DCA LOCTR1 /RESET PC TAD EXPVAL+2 DCA LOCTR2 PUTORG, TAD PASSNO /OUTPUT ON PASS 2 ONLY SZA CLA JMP I [NEXTST DCA ABSOP /CLEAR ABS OUTPUT SW CLA STL RTL JMS I (FULCHK /ROOM FOR MORE? TAD LOCTR1 RTR RTR /GET ESD AND [177 TAD (TTORG DCA I OUTPTR TAD LOCTR1 AND [7 /FIELD BITS DCA I OUTPTR TAD LOCTR2 /ADDRESS DCA I OUTPTR JMS I (FULCHK JMP I [NEXTST PAGE /> / / VARIOUS PSEUDO-OP HANDLERS / LSTONX, TAD SYONLY /ENABLE LISTING UNLESS SYM MAP ONLY LSTOFX, DCA LISTSW JMP I [NEXTST / DECX, CLA IAC OCTALX, DCA RADIX JMP I [NEXTST / TEXTX, JMS I [GETCHR /GET DELIMITER JMP I [NEXTST /NULL STMT CIA DCA EXTMP /SAVE - DELIM LOOP6B, JMS GETCHT /GET HIG ORDER CHAR JMP I [NEXTST JMS I [R6L /SHIFT IT UP DCA LTEMP /SAVE HALF JMS GETCHT /GET LOWER CHAR JMP OUTTXT /GO PUT LAST TAD LTEMP /PUT 2 CHARS TOGETHER JMS I [OUTWRD /OUTPUT WORD JMP LOOP6B /LOOP OUTTXT, TAD LTEMP /PUT OUT HALF WORD JMS I [OUTWRD /OR ZERO WORD JMP I [NEXTST GETCHT, 0 /GET CHAR FOR TEXT STMT ISZ NCHARS /BUMP COUNT SKP JMP I GETCHT /END OF TEXT TAD I CHRPTR /GET CHAR DCA BUCKET /SAVE IT TAD BUCKET /IS IT THE DELIM ? TAD EXTMP SNA CLA JMP I GETCHT /YES, RETURN NO SKIP ISZ GETCHT /BUMP RETURN TAD BUCKET /GET CHAR AND [77 /LOW 6 BITS JMP I GETCHT /RETURN / / CONDITIONAL ASSEMBLY HANDLERS / IFNZRX, CLA CMA IFZROX, JMS GETCON /GET CONDITION EXPR TAD EXPVAL+1 /HIGH ORDER AND [7 SNA TAD EXPVAL+2 /LOW ORDER SWTCH, SNA CLA JMP TRUE /PRESENT CONDITION OF ASMOF IS OK FALSE, TAD ASMOF /GOTTA REVERSE IT CMA DCA ASMOF /THAT DOES IT TRUE, CDF FLD0 JMS I [GETCHR JMP BADCND /FORGOT THE ANGLE TAD [-240 /IGNORE BLANK, IF ANY SNA JMP TRUE /TRY AGAIN TAD (240-274 SNA CLA JMP I (ASMBL /GO FROM HERE JMS I [BACK1 /LET SOMEONE ELSE WORRY ABOUT IT JMP BADCND / GETCON, 0 DCA ASMOF /SET INITIAL TRUTH JMS I [EXPR /COLLECT EXPR JMP OKCND /BAD MAY MEAN GOOD BADCND, JMS I [ERMSG /BUT GOOD MEANS BAD 1103 /*IC* DCA ASMOF /ENABLE ASSEMBLY JMP I (ASMBL OKCND, TAD EXPSW /WAS THERE AN EXPR, AT LEAST? SNA CLA JMP I GETCON /YES JMP BADCND / IFNEGX, CLA CMA IFPOSX, JMS GETCON CLA CLL IAC RTL /4 AND EXPVAL+1 /SIGN OF EXPR JMP SWTCH /GO FROM THERE / IFNDFX, CLA CMA IFREFX, DCA ASMOF JMS I [GETNAM /GET SYMBOL NAME JMP BADCND /GOTTA GIVE SOMETHING JMS I [FIND /IS IT KNOWN TO US? JMP FALSE /NOT REFERENCED YET SNA CLA /SKIP IF DEFINED DCA ASMOF /ELSE ASSEMBLE JMP TRUE IFSWX, CLA CMA IFNSWX, DCA ASMOF TAD (7642 /ADDRESS OF OPTION WORDS DCA WORD2 /A TEMP JMS I (LETTER /ALLOW LETTER JMP .+4 /AC BETWEEN 1 AND 32 JMS I (DIGIT /OR NUMBER JMP BADCND /ALL ELSE IS BAD TAD (33 /MAKE 0 = Z+1 ISZ WORD2 /BUMP POINTER TAD (-14 /IS IT IN THIS WORD? SMA SZA JMP .-3 /NO, POINT TO NEXT CIA CMA STL /BIT COUNT AWAY FROM LINK DCA WORD1 RAL /SHIFT ISZ WORD1 /COUNT JMP .-2 CDF 10 /OPTIONS FIELD AND I WORD2 /GET SELECTED BIT JMP SWTCH /AND TEST IT / ZBLKX, JMS I (ADRGET /EVALUATE EXPR TAD EXPVAL+2 CIA DCA ZBCNT /HOLD COUNT TAD LISTSW /SAVE LISTSWITCH DCA ZBTMP JMS I [OUTWRD /PUT A WORD DCA LISTSW /NO LIST AFTER FIRST ISZ ZBCNT /COUNT THEM JMP .-3 /MORE TAD ZBTMP /RESTORE DCA LISTSW /LISTING JMP I [NEXTST ZBCNT= EXTMP ZBTMP= EXTMP2 PAGE PTP=20 DCB=7760 INFLD=INCTL&70 /GET FIELD OF INPUT BUFFER OUFLD=OUCTL&70 /DITTO OUTPUT BUFFER IN7400, 7400 NINCTL, INCTL+1 NINREC, INRECS IOPEN, 0 TAD (7617 DCA INFPTR /RESET FILE POINTER JMS INNEWF /FETCH NEW HNDLR, ETC /WHILE USR IS STILL IN CORE CLA CMA DCA INCHCT /FORCE A READ ON NEXT CHAR JMP I IOPEN ICHAR, 0 IN7600, 7600 INCHAR, CDF INFLD ISZ INJMP /BUMP THREE-WAY UNPACK SWITCH ISZ INCHCT INJMPP, JMP INJMP TAD INEOF SZA CLA /DID LAST READ GIVE EOF ? GETNEW, JMS INNEWF /OPEN A NEW INPUT FILE TAD INCTR CLL TAD NINREC SNL DCA INCTR /RESTORE INCR IF NOT OVERFLOWED SZL /IS THIS THE LAST READ? ISZ INEOF /YES - SET END-OF-FILE FLAG CLL CML CMA RTR /MAKE CONTROL WORD RTR /FROM THE AMOUNT OF THE OVERFLOW RTR /(IF ANY) AND THE STANDARD CNTRL WD TAD NINCTL DCA INCTLW CDF JMS I INHNDL /CALL THE DEVICE HANDLER INCTLW, 0 INBUFP, INBUF INREC, 0 JMP INERRX /SOME KIND OF HANDLER ERROR INBREC, TAD INREC TAD NINREC DCA INREC /UPDATE THE RECORD NUMBER TAD INCTLW AND IN7600 CLL RAL TAD INCTLW AND IN7600 CMA DCA INCHCT /COMPUTE THE NEW CHARACTER COUNT TAD INJMPP DCA INJMP /RESET THE CHARACTER SWITCH TAD INBUFP DCA INPTR /AND THE WORD POINTER JMP INCHAR /MAKE BELIEVE THIS NEVER HAPPENED INERRX, ISZ INEOF /EITHER AN END-OF-FILE OR A BADDIE SMA CLA /WHICH TYPE WAS IT ? JMP INBREC /END OF FILE - RESUME PROCESSING JMP I [IOERR /BADDIE, GIVE ERROR MESSAGE INJMP, HLT /THIS IS THE 3 WAY CHARACTER SWITCH JMP ICHAR1 JMP ICHAR2 TAD INJMPP DCA INJMP TAD I INPTR AND IN7400 CLL RTR RTR /COMBINE HIGH-ORDER FOUR BITS OF TAD INCTLW RTR /THE 2 WORD TO FORM THE 3RD CHAR RTR ISZ INPTR JMP INCOMN ICHAR2, TAD I INPTR AND IN7400 DCA INCTLW /SAVE THE HI ORDER BITS FOR THE 3RD ISZ INPTR /BUMP THE WORD POINTER ICHAR1, TAD I INPTR INCOMN, AND (377 TAD (-232 SNA /IS THE CHARACTER A ^Z? JMP GETNEW /YES - GET A NEW FILE TAD (232 /RESTORE THE CHARACTER CDF JMP I ICHAR /AND RETURN INFPTR, 7617 INEOF, 1 /PARAMETERS ARE SET UP SO THAT INCHCT, /IOPEN IS UNNECESSARY. INNEWF, -1 TAD NINDEV DCA INHNDL /INITIALIZE HANDLER ADDRESS CDF 10 TAD I INFPTR /GET NEXT CD INPUT FILE ENTRY CDF SNA /ANY MORE? JMP I (ENDX /NO MORE INPUT CIF 10 JMS I USR 1 /ASSIGN, FETCH HANDLER INHNDL, 0 JMP I [IOERR /HUH? CDF 10 TAD I INFPTR AND (7760 /GET LENGTH PART OF WORD SZA /LENGTH OF 0 MEANS LENGTH GE 256 TAD [17 /ADD HIGH ORDER BITS CLL CML RTR RTR DCA INCTR /STORE LENGTH OF FILE ISZ INFPTR TAD I INFPTR CDF DCA INREC /STARTING RECORD NUMBER OF FILE ISZ INFPTR DCA INEOF /ZERO END-OF-FILE FLAG JMP I INNEWF INCTR, 0 INPTR, 0 OUFNAM, 0;0;0;0 /OUTPUT FILE NAME NINDEV, INDEVH PAGE OOPEN, 0 TAD OUFILE /INCR OUTPUT FILE POINTER TAD (5 DCA OUFILE CDF 10 TAD I OUFILE /GET DEVICE CODE, LEN DCA OUELEN /HOLD IT A MO JMS I (OFNAME /GET FILE NAME INTO FIELD 0 TAD OUELEN /CHECK FOR NULL FILE SNA CLA JMP ONOFIL /INHIBIT OUTPUT JMS GETUSR /LOAD USR IF NOT ALREADY IN TAD OUNAME /RESET ENTER CALL DCA OUBLK TAD NOUDEV DCA OUHNDL TAD OUELEN /THE UNIT CIF 10 JMS I USR 1 /ASSIGN, FETCH HANDLER OUHNDL, 0 /OUTPUT DEVICE HANDLER ENTRY JMP I [IOERR /HUH? TAD OUELEN /UNIT AGAIN CIF 10 JMS I USR 3 /ENTER OUTPUT FILE OUBLK, OUFNAM /REPLACED WITH STARTING BLOCK OUELEN, 0 /REPLACED WITH LENGTH OF HOLE JMP I [IOERR /YOU BLEW IT!!! DCA OUCCNT DCA I (OUTINH /ZERO OUTPUT INHIBIT FLAG JMS I (OUSETP ISZ OOPEN JMP I OOPEN ONOFIL, ISZ I (OUTINH JMP I OOPEN OUTDMP, 0 DCA OUCTLW /STORE THE CONTROL WORD TAD OUCCNT SNA ISZ OUCTLW TAD OUBLK DCA OUREC /COMPUTE STARTING BLOCK TAD OUCTLW JMS I [R6L AND [17 /COMPUTE THE NUMBER OF RECORDS TAD OUCCNT /UPDATE SIZE OF FILE DCA OUCCNT TAD OUCCNT CLL CML TAD OUELEN SNL SZA CLA /EXCEED GIVEN LENGTH ? JMP I [IOERR /YES - ERROR CDF JMS I OUHNDL OUCTLW, 0 LOUBUF, OUBUF OUREC, 0 JMP I [IOERR JMP I OUTDMP OCLOSE, 0 JMS GETUSR /ENSURE USR IN CORE IFNZRO RALF < TAD PASSNO SZA CLA JMP .+6 TAD (377 JMS I (FULCHK /DUMP LAST BLOCK TAD OUCCNT /SAVE FILE LENGTH DCA I (OUTBLK /FOR CHAIN JMP NODUMP > JMS I (OTYPE AND (770 TAD (-PTP /CHECK FOR PAPER TAPE PUNCH OUTPUT SZA CLA /AND SKIP ^Z OUTPUT IF TRUE TAD (232 /OUTPUT A ^Z JMS I [OCHAR FILLLP, JMS I [OCHAR JMS I (OTYPE /GET TYPE OF OUTPUT DEVICE SPA CLA TAD [100 TAD [77 AND I (OUDWCT SZA CLA /UP TO THE BOUNDARY YET? JMP FILLLP /NO - FILL WITH ZEROS TAD I (OUDWCT /GET DOUBLEWORD COUNT LEFT TAD (OUCTL&3700 SNA /A FULL WRITE LEFT? JMP NODUMP /YES DON'T DO IT TAD (4000+OUFLD /PUT IN FIELD AND WRITE BITS JMS OUTDMP NODUMP, CIF CDF 10 TAD I OUFILE CDF JMS I USR 4 /CLOSE THE OUTPUT FILE OUNAME, OUFNAM /POINTER TO OUTPUT FILE NAME OUCCNT, 0 JMP I [IOERR /ERROR WHILE CLOSING - BAD!! JMP I OCLOSE /ALL DONE NOUDEV, OUDEVH / / LOAD USR IF NOT IN CORE ALREADY / GETUSR, 0 TAD USR /CURRENT CALL ADDR SMA CLA JMP I GETUSR /WE GOT IT CIF 10 JMS I USR /THE ANSWERING SERVICE 10 /CALLS THE SR TAD [200 DCA USR /RESET THE CALL ADDRESS JMP I GETUSR /JES FINE PAGE FULCHK, 0 IFNZRO RALF < / / IF THE RELOCATABLE BINARY OUTPUT / BLOCK IS FULL (WITHIN THE CONTENTS OF THE AC) / FILL THE REST WITH NOP CODES AND OUTPUT THE / BLOCK. / TAD OUTPTR TAD KOUBUF SPA CLA JMP I FULCHK FULLUP, TAD OUTPTR TAD KOUBUF SMA CLA JMP .+4 CLA IAC DCA I OUTPTR JMP FULLUP JMS I (OUTBLK JMP I FULCHK KOUBUF, -OUBUF-377 > / / / GET SIGN CHARACTER IF ANY / BUMP LASTOP IF MINUS / GETSGN, 0 JMS I [GETCHR JMP I GETSGN TAD (-255 /MINUS? SNA ISZ LASTOP SZA CLL CMA RAR /IF IT WAS PLUS, BECOMES 0 SZA CLA /SKIP IF PLUS OR MINUS JMS I [BACK1 /OTHERWISE PUT IT BACK JMP I GETSGN / AS PER RICHIE LARY / / SINGLE AND DOUBLE PRECISION / FLOATING POINT INPUT / / EX, TAD M3 FX, TAD M3 DCA DESW /STORE LENGTH TAD (-7 JMS CLEAR /CLEAR FAC+OP DCA LASTOP JMS GETSGN /GET SIGN STA /CLA CMA DCA DPSW /SET NO DP GETD, DCA DCNT JMS I (DIGIT /GET A DIGIT JMP LOOKP /NO DCA OTEMP /SAVE IT JMS I (FMPTEN /MULT FAC*10 JMS CLEAR TAD OTEMP SZA JMS I (FAD /ADD DIGIT TO FAC IF NOT= 0 TAD DPSW CMA TAD DCNT /BUMP IF FP SEEN JMP GETD LOOKP, JMS I [GETCHR JMP OVER /DONE TAD (-256 SNA JMP DECPT TAD (256-304 CLL RAR SNA CLA JMP I (EXPON /E OR D DEXERR, JMS I [ERMSG 0620 /FP JMP NOTNEG DECPT, ISZ DPSW JMP DEXERR /2 PERIODS JMP GETD / OVER, TAD DCNT /EXPON COMES HERE W EXP IN AC SNA JMP NOSCAL /NO SCALING NEEDE CLL SMA CIA CML /SIGN IN LINK,MAGNITUDE IN AC DCA DCNT /AS A COUNT SNL TAD (TENTH-TEN /OFFSET KLUDGE DCA OTEMP SCALUP, TAD OTEMP JMS I (FMPTEN /MULT BY 10.0 OR 0.1 ISZ DCNT JMP SCALUP NOSCAL, JMS CLEAR STL RAR DCA OP+5 /ROUNDING CONSTANT JMS I (ADD TAD AC SZA CLA JMS I (NORM /WATCH IT! DCA AC+5 TAD LASTOP SNA CLA /SIGN -? JMP NOTNEG /NO TAD (AC+5 JMS I (SETUP ACNGLP, RAL TAD I P /NEGATE FAC CLL CIA DCA I P STA TAD P DCA P ISZ CT JMP ACNGLP NOTNEG, JMS CLEAR /SET UP X10 TAD I X10 JMS I [OUTWRD ISZ DESW /OUTPUT # JMP .-3 JMP I [NEXTST CLEAR, 0 /AC MAY NOT BE 0 TAD (-7 DCA CT TAD (OPX-1 DCA X10 DCA I X10 ISZ CT JMP .-2 JMP I CLEAR DCNT=FULCHK DPSW=NCTMP DESW=OPCODE PAGE OVBUFR=. FAD, 0 /FLOATING ADD DIGIT IN AC DCA OP TAD (13 DCA OPX ALNLP, TAD OPX CIA TAD ACX SNA /ALIGNED? JMP GOADD /YES SMA CLA TAD (OPX-ACX JMS RSHFT /NO-SHIFT 1 OF THEM RIGHT 1 JMP ALNLP /TRY AGAIN GOADD, JMS ADD /ADD FRACTIONS JMS NORM /NORMALIZE RESULT JMP I FAD /RETURN / RSHFT, 0 /SHIFT RIGHT TAD (ACX /DEFAULT IS FAC JMS SETUP ISZ I P /BUMP EXPONENT RSLP, ISZ P TAD I P RAR DCA I P ISZ CT JMP RSLP JMP I RSHFT / ADD, 0 /ADD TO FAC TAD (OP+5 DCA PP2 TAD (AC+5 JMS SETUP ADDLP, RAL /CARRY TAD I PP2 TAD I P DCA I P /ADD ONE WORD STA TAD P /COMPLEMENT LINK DCA P STA TAD PP2 /COMPLEMENT LINK DCA PP2 ISZ CT JMP ADDLP JMP I ADD NORM, 0 /NORMALIZE FAC TAD AC SPA CLA /CHECK FOR OVERNORMALIZATION JMS RSHFT /AND CORRECT NORMLP, STL RTR AND AC SZA CLA /NORMALIZED? JMP I NORM /YES TAD (AC+5 JMS SETUP LSLP, TAD I P RAL /LEFT SHIFT DCA I P /FAC 1 BIT STA CML /COMPLEMENT LINK TAD P DCA P ISZ CT JMP LSLP STA TAD ACX /BUMP EXP DCA ACX /DOWN 1 JMP NORMLP FMPTEN, 0 /FLTG MULTIPLY BY 10.0 OR .1 TAD (TEN JMS SETUP TAD AC SNA CLA /AC=0 MEANS RESULT=0 JMP I FMPTEN TAD I P TAD ACX /FUDGE FAC DCA ACX /EXPONENT TAD (MUX DCA X11 TAD (ACX DCA SETUP TAD (OPX DCA X10 DCA MUX /CLEAR MULT TEMP EXP MPLP1, ISZ SETUP TAD I SETUP /MOVE FAC DCA I X10 /TO OP DCA I SETUP /CLEAR FAC ISZ P TAD I P /MOVE MULTIPLIER DCA I X11 /TO MULT TEMP ISZ CT JMP MPLP1 / MPLP2, TAD (MUX-ACX JMS RSHFT /SHIFT MULT TEMP RIGHT 1 SZL JMS ADD /ADD IF LOW ORDER BIT WAS 1 JMS RSHFT /SHIFT FAC RIGHT TAD MU+5 SZA CLA /12 SUCCESSIVE 0 BITS JMP MPLP2 /IN MULTIPLIER MEANS DONE JMS NORM JMP I FMPTEN / SETUP, 0 /COMMON CODE DCA P TAD (-6 DCA CT CLL JMP I SETUP / MUX, 0 /MULT TEMP MU, ZBLOCK 6 CT=CPTMP P=EXTMP PP2=PAGEN PAGE IFNZRO RALF < ESDBUF, PNDL+6 /ESD ENTRY FOR SECTION #MAIN PNDL /DITTO FOR BLANK COMMON ZBLOCK 376 /FILL TO 400 LOCS / / BEGIN OF PASS 2: / DUMP EXTERNAL SYMBOL DICTIONARY / DURING PASSES 2 AND 3, THIS IS INPUT BUFFER / DMPESD, CLA CLL CMA RAL /-2 DCA EXTMP2 /PASS CONTROL TAD (3 /RALF OUTPUT IDENTIFIER DCA I OUTPTR TAD VERS DCA I OUTPTR /THIS MAKES 6-WORD ENTRIES TAD DPFLG /4000=NEED DP HARDWARE DCA I OUTPTR /EXACTLY FILL A BLOCK DCA I OUTPTR ESDSCN, TAD (ESDBUF-1 DCA X10 /POINT TO POINTERS TAD (ESDBUF+177 DCA X12 /POINT TO INITAIL CHARS TAD ESDNO CIA DCA EXTMP ESDLUP, TAD (-3 DCA LTEMP /NAME LENGTH COUNT TAD (EQUN-1 /WHERE WE'LL KEEP THE NAME DCA X13 TAD I X10 /GET POINTER DCA X11 TAD I X12 /GET FIRST CHAR SNA /BLANK BECOMES # TAD (43 ESDNLP, JMS I [R6L DCA EQUN+2 CDF FLD1 TAD I X11 /GET NEXT PAIR FROM SYMBOL TABLE DCA EQUN+3 /HOLD IT CDF FLD0 TAD EQUN+3 JMS I [R6R /GET LEFT CHAR TAD EQUN+2 /COMBINE THEM DCA I X13 TAD EQUN+3 /GET RIGHT HALF OF PAIR AND [77 ISZ LTEMP JMP ESDNLP AND [37 /DROP FORCE BIT FROM TYPE DCA EQUN+3 CDF FLD1 TAD I X11 /HIGH VALUE DCA EQUN+4 TAD I X11 /LOW VALUE DCA EQUN+5 CDF FLD0 TAD EXTMP2 /WHAT PASS IS THIS? RAR /LINK 0 IF FIRST, 1 IF SECOND SNL CLA JMP NOENTS /FIRST, ENTRYS NOT OUTPUT TAD EQUN+3 /OUTPUT ENTRIES ONLY ON 2ND CLL RAR SNA CLA SNL JMP ESDLND /NO GO JMP ESDOUT /YES, PUT IT NOENTS, TAD EQUN+3 /EXT, COMM, OR SCTN CLL RAR SNA /SKIP IF OK JMP ESDLND /UNDEFINED OR ENTRY RAR SNA CLA JMP ESDOUT /IF EXTERN, DO IT TAD EQUN+4 /IF SECTION, CHECK AND [7 /THAT LENGTH SNA /IS NON-ZERO TAD EQUN+5 SNA CLA JMP ESDLND /ZERO LEN JUST GETS IN THE WAY ESDOUT, TAD (EQUN-1 DCA X13 TAD (-6 DCA LTEMP TAD I X13 /GET OUTPUT WORD DCA I OUTPTR ISZ LTEMP JMP .-3 /6-WORD ENTRIES TAD OUTPTR TAD OUTBUF SPA CLA JMP ESDLND /NOT END OF BLOCK YET JMS I (OUTBLK TAD (3 DCA I OUTPTR DCA I OUTPTR DCA I OUTPTR DCA I OUTPTR ESDLND, ISZ EXTMP /GO THRU ESD LIST JMP ESDLUP ISZ EXTMP2 /WHOLE LIST TWO PASSES JMP ESDSCN TAD (-6 /THEN STORE END-OF-ESD DCA LTEMP DCA I OUTPTR ISZ LTEMP JMP .-2 TAD (377 /FORCE BLOCK OUTPUT JMS I (FULCHK CDF FLD1 /THEN DEFAULT ORG TAD I (LMAIN /IF MAIN LEN .NE. 0 AND [7 SNA TAD I (LMAIN+1 CDF FLD0 SNA CLA JMP I (RESET /FIRST SECTION WILL GET IT TAD (TTORG+1 /ORG TO ZERO OF MAIN DCA I OUTPTR DCA I OUTPTR DCA I OUTPTR JMP I (RESET OUTBUF, 1001 PAGE /> / / INITIALIZATION CODE / BEGIN, JMP CHNIN /IF ENTERED BY CHAIN GCMND, CIF 10 /IF ENTERED BY .R, ETC JMS I USR /USR IS LEFT OVER 5 /DECODE IFZERO RALF < 620 /DEFAULT EXT = .FP> IFNZRO RALF < 2201 /DEFAULT EXT = .RA> DCA I (RETSYS /NO NEED FOR IT IF NOT CHAINED CHNIN, JMS I (7607 4100 /TEMP WRITE OUT OVERLAY 6600 /NOW AT 6600 40 /TO SYS SCRATCH BLK 40 JMP I (7605 /ERROR CDF 10 IFNZRO RALF < TAD I [7600 /BIN FILE UNIT AND NP17 SNA /IS THERE ONE? JMP DEFBIN /NO, SET DEFAULT TAD (7757 /POINT TO DEV CTRL WORD DCA WORD1 TAD I WORD1 SPA CLA JMP OKBIN /FILE-STRUCTURED, OK CDF 0 JMS I (PRTXT /TYPE MESSAGE TXBBIN-1 -TXBLN JMS I [CRLF JMP GCMND /TRY AGAIN / DEFBIN, CLA IAC /DEFAULT BIN UNIT IS SYS DCA I [7600 /SET UNIT TAD [7600 DCA X10 /SET POINTER TAD (0617 /FO DCA I X10 TAD (2224 /RT DCA I X10 TAD (2216 /RN DCA I X10 /FORTRN. DCA I X10 CDF 0 JMP I (NOEXT /NOW, OPEN THE FILE> OKBIN, CDF 0 /HAVE TO GO TO ANOTHER PAGE JMP I (NOKBIN /ONLY SO MANY PATCHES TO A PAGE GBIN, CDF 10 TAD I (7644 AND (20 SNA CLA ISZ SYONLY /=NO SLASH T CDF 0 JMS I (NEW /**SEE IF NEED 2 PG HANDLER 7600 JMS I (OOPEN DCA BFILE IFNZRO RALF < TAD R41 /L OR G SWITCH** CDF 10 AND I (7643 /TEST /L OR /G SWITCH CDF 0 SNA CLA /** JMP KCHN /KILL CHAIN, IT'S SET CIF 10 CLA IAC /UNIT IS SYS JMS I USR 2 /LOOKUP LBLK, LDRNAM /LOADER.SV R41, 41 /** JMP KCHN /NO FIND, NO CALL TAD LBLK /STARTING BLOCK DCA I (LDRBLK /FOR CHAIN TAD I (OUBLK /OUTPUT STARTING BLOCK DCA I (PASBLK /SAVED FOR CHAIN TO LOADER CLA CMA /ENABLE CHAIN KCHN, DCA I (CHNSW /OR KILL IT, WHATEVER> JMS I (INCHK /NOW CHECK INPUT DEVICES FOR 2 PG HANDLERS JMS I (INNEWF /GET INPUT HANDLER CLA CMA DCA I (INCHCT /SET INITIAL COUNT TAD NP7700 DCA USR /FROM NOW ON, USE THE HIGH CALL JMS I (NEW 7605 /CHECK LIST DEV TOO** CDF 10 TAD I (7611 /LST FILE EXT SNA TAD (1423 /LS DEFAULT DCA I (7611 TAD I (7666 /GET DATE DCA WORD1 / / MOVE SYMBOL TABLE TO ITS PROPER LOCATION / TAD (1777 DCA X10 /LOADED ADDRESS OF SYMBOL TABLE CLA CMA DCA X11 /WE MOVE IT TO ASSEMBLED ADDRESS TAD (-FREE /LENGTH OF SYMBOL TABLE DCA WORD2 /SET COUNT TAD I X10 DCA I X11 /THIS SAVES SWAPS OF USR ISZ WORD2 JMP .-3 CDF 0 JMP I (GDATE /CHECK FOR FPP PRESENCE** PAGE / / PUT THE DATE INTO THE PAGE HEADING / GDATE, TAD (1000 DCA I (7746 /SET NO-RESTART BIT /PUT VERNUM IN TITLE LINE TAD VMSG DCA I (VMTXT TAD VMSG+1 /PATCH LEVEL DCA I (VMTXT+1 DCA OCNT /CLEAR OCNT TAD WORD1 /RE-GET DATE SNA JMP I (NEWLIN /GOLLY, AND ALL THIS CODE WASTED AND (370 CLL RTR RAR TAD (-12 SPA JMP .+3 ISZ OCNT JMP .-4 TAD (72 /60+12 DCA OTEMP TAD (TITDAT-1 DCA X11 TAD OCNT JMS I (R6L SZA TAD (6000 TAD OTEMP DCA I X11 TAD WORD1 AND (7400 /MONTH JMS I (R6L TAD (MONTHS-3 DCA X10 TAD I X10 DCA I X11 TAD I X10 DCA I X11 DCA OCNT TAD WORD1 AND [7 DCA OTEMP TAD I (7777 AND (600 RTR CLL RTR TAD OTEMP TAD (106 TAD (-12 SPA JMP .+3 ISZ OCNT JMP .-4 TAD (72 DCA OTEMP TAD (5560 TAD OCNT DCA I 11 TAD OTEMP JMS I (R6L TAD (40 DCA I X11 JMP I (NEWLIN VMSG, VNUM&70^10+VNUM&707+6060 PATCH&77^100+40 IFNZRO RALF < LDRNAM, TEXT "LOAD@@SV" TXBBIN, TEXT "BIN OUT DEV NOT FILE-STRUCTURED" TXBLN= .-TXBBIN > MONTHS, TEXT "-JAN-FEB-MAR-APR-MAY-JUN-JUL-AUG-SEP-OCT-NOV-DEC" PAGE /PAGE FOR NEW CODE REQUIRED FOR OS/8 FORTRAN NEW, 0 TAD NT2 /CHECK IF ALREADY CHECKED SZA CLA JMP NEWDON TAD I NEW /NO. GET THE DEV TO CHECK DCA NTEMP CDF 10 TAD I NTEMP /GET DEV.NUM AND [17 DCA NT1 /INCHK NEEDS TO KNOW TOO TAD NT1 SNA /IF 0,THEN NO DEVICE JMP NEWDON DCA NTEMP CLA CMA TAD I (37 /GET PTR TO DEV TBL TAD NTEMP DCA NTEMP /PTS TO ENTRY IN DEV TBL TAD I NTEMP CDF 0 SMA CLA JMP FIX /NOT A 2 PG HANDLER TAD (6377 /FIX ALL LOCATIONS THAT REFER TO /THE BUFFER VARIABLES. /THE CHANGES ARE: /OUBUF=6000,LINE=6400,INDEVH=6600,OUDEVH=7200 /INRECS=1,INCTL=200 DCA I (BLINE TAD (6000 DCA I (NOUBUF IFNZRO RALF < TAD (5777 DCA I (MOUBUF > /FLAP DOESN'T USE ALL THE RALF LOCNS TAD (6601 DCA I (NINDEV TAD (201 DCA I (NINCTL JMS TPNSH /TWO-PAGE NON-SYSTEM HANDLER DCA I (NINREC TAD (6000 DCA I (LOUBUF TAD (7201 DCA I (NOUDEV TAD (5777 DCA I (OUTPTR TAD (6377 DCA I (CHRPTR IFNZRO RALF < TAD (1401 DCA I (KOUBUF > TAD (7201 FIX, DCA NT2 /SET SO IF DID 2 PGS., DONT DO IT AGAIN NEWDON, ISZ NEW /GET CORRECT ADDR JMP I NEW NTEMP, 0 NT1, 0 /DEV. NUM. NT2, 0 /0 IF NO 2PG HANDLERS YET INCHK, 0 /CHECK THE INPUT DEVICES JMS NEW INLOC, 7617 TAD INLOC DCA NEXTIN ANOTH, TAD NT1 SNA CLA /SKIP IF FILE USED JMP I INCHK TAD NT2 SZA CLA /SKIP IF STILL 1 PAGE HANDLERS JMP I INCHK TAD NP2 TAD NEXTIN DCA NEXTIN /INCREMENT TO PT TO NEXT INPUT FILR JMS NEW NEXTIN, 0 JMP ANOTH NP2, 2 NOKBIN, CDF 10 /BELONGS WITH INIT CODE TAD I [7600 AND NP17 TAD (7646 DCA WORD1 /CREATE POINTER INTO DEV TBL TAD I WORD1 CDF 0 TAD (-7607 SNA CLA /IF ITS SYS, NO PROBLEMS DCA I (RETSYS /SO CAN ZERO CALL TO DELETE ROUTINE CDF 10 TAD I (7604 SZA JMP FEND /AN EXT WAS SPECIFIED IFZERO RALF < TAD (0216 /.BN DEFAULT FOR FLAP JMP FEND > IFNZRO RALF < NOEXT, CDF 10 TAD I (7643 /CHECK IF L OR G SPEC AND L41 SNA CLA TAD (0610 /NO-NEEDS RL EXT TAD (1404 > /YES-NEEDS LD FEND, DCA I (7604 CDF 0 JMP I (GBIN L41, 41 TPNSH, 0 TAD (1401 /CHANGE OUTPUT BUFFER DCA I (OUTBUF IAC JMP I TPNSH / PAGE LDADR, RELOC OVBUFR TAD ERRORS /ERROR COUNT JMS I (DECOUT JMS I (PRTXT /"ERRORS" TXERR-1 -TXELN JMS I [CRLF IFZERO RALF < TAD PASSNO /IF NOT LISTING PASS SPA SNA CLA /ERROR COUNT IS ENUF JMP I (RETSYS > TAD NEXT TAD (-FREE+1 /DON'T COUNT BASIC SYMBOLS CLL RAR /DIVIDE JMS I (OVER3 /BY 6 JMS I (DECOUT JMS I (PRTXT /"SYMBOLS, " TXSYM-1 -TXSLN IFZERO RALF < TAD LINKS JMS I (DECOUT JMS I (PRTXT /"LINKS" TXLNK-1 -TXLLN > IFNZRO RALF < TAD ABREFS JMS I (DECOUT JMS I (PRTXT /"ABS REFS" TXABR-1 -TXALN > JMS I [CRLF TAD (-33 /27 BUCKETS DCA LTEMP DCA BUCKET CLA CMA DCA OPCODE /SYMBOLS PER LINE COUNTER STPRNT, TAD BUCKET DCA EXTMP /BUCKET START ADDRESS LUPBKT, CDF FLD1 TAD I EXTMP /WAS THAT LAST SYMBOL ? SNA JMP NXTBKT /YES, GO GET NEXT BUCKET DCA EXTMP /SAVE LINK ADDR TAD EXTMP DCA X14 /SET UP POINTER FOR NAME ISZ OPCODE /IS LINE FULL? JMP .+4 /NO TAD (-4 DCA OPCODE JMS I [CRLF TAD BUCKET SNA /WATCH FOR # TAD (43 JMS I [PRINT2 /PRINT BUCKET (FIRST) CHAR CDF FLD1 TAD I X14 /SYMBOL JMS I [PRINT2 /PRINT 2 AND 3 CDF FLD1 TAD I X14 JMS I [PRINT2 /PRINT 4 AND 5 CDF FLD1 TAD I X14 IFNZRO RALF < DCA OTEMP /HOLD TAD OTEMP > AND [7700 /PRINT 6 AND BLANK JMS I [PRINT2 IFNZRO RALF < TAD OTEMP /GET TYPE AND [17 TAD (TYPCOD /POINT TO TABLE DCA OTEMP TAD I OTEMP /GET TYPE INDICATOR JMS I [PRINT2 > CDF FLD1 TAD I X14 /PRINT FIRST DIGIT AND [7 JMS I (PDIG /FIELD DIGIT CDF FLD1 TAD I X14 /LOW 12 BITS JMS I [OCTOUT JMS I [PRINT2 /TWO BLANKS JMP LUPBKT NXTBKT, ISZ BUCKET /NEXT BUCKET CHAR CDF FLD0 ISZ LTEMP /INCREMENT COUNT JMP STPRNT JMS I [CRLF /DO FINAL CRLF** TAD (214 /DO NOT PAGEJ JMS I PC /THAT WOULD GIVE A HEADING JMS I (OCLOSE JMP I (RETSYS /FINISH IT OFF PAGE RELOC / PAGE 0 LITERALS FIELD 1 *10000 / / SYMBOL TABLE IS IN FIELD ONE. / EACH ENTRY HAS THE FOLLOWING FORMAT / / 0: POINTER TO NEXT ENTRY IN BUCKET, 0 IF LAST / 1: 2ND AND 3RD CHARS OF SYMBOL / 2: 4TH AND 5TH / 3: 6TH AND TYPE CODE / 4: ESD # AND HIGH-ORDER VALUE / 5: LOW-ORDER VALUE / USER=1 XTERN=2 COMMN=3 SECTN=4 PSUDO=5 PDPMR=6 FPPMRF=7 FPPSF1=10 /JXN, TRAP FPPSF2=11 /JA, SETB, SETX FPPSF3=12 /CLA, EXIT, NEG, NOP, NORM, /PAUS, JAC, STARTD, STARTF FPPSF4=13 /ALN, ATX, XTA FPPSF5=14 /ADDX, LDX FPPMRI=15 /% FPPMRS=16 /' FPPMRL=17 /# PDPOP=20 / / THE FOLLOWING CODE TRICKS THE LOADER INTO PUTTING / THE SYMBOL TABLE AT 2000, WHERE THE USR IS NOT, / THUS SAVING SOME SWAPPING AT LOAD AND INITIALIZE. / IT IS MOVED TO THE ASSEMBLED ADDRESS AFTER WE'RE / DONE WITH THE USR, AND BEFORE THE FIRST PASS BEGINS / *12000 NOPUNCH *10000 ENPUNCH / / BUCKETS FOR USER-DEFINED SYMBOLS / AND PDP8 OPERATES AND IOTS / PNDL ZBLOCK 33 / / BUCKETS FOR INTERNALLY DEFINED SYMBOLS / AL BL CL DL EL FL GL HL IL JL KL LL ML NL OL PL QL RL SL TL UL VL WL XL YL ZL AL, .+5 /ADDR 0404;2200 FPPSF2 0 .+5 /ADDX 0404;3000 FPPSF5 0110 .+5 /ALN 1416;0 FPPSF4 0010 IFZERO RALF < .+5 /AND 1604;0 PDPMR AND 0 > IFNZRO RALF < .+5 /AND . 1604;0 PDPMR 200 .+5 /AND% 1604;0 PDPMR+500 600 .+5 /ANDZ 1604;3200 PDPMR 0 .+5 /ANDZ% 1604;3200 PDPMR+500 400 > 0 /ATX 2430;0 FPPSF4 0020 BL, 0 /BASE 0123;0500 PSUDO BASEX CL, .+5 /CDF 0406;0 PDPOP CDF .+5 /CIA 1101;0 PDPOP CIA .+5 /CIF 1106;0 PDPOP CIF .+5 /CLA 1401;0 PDPOP CLA .+5 /CLL 1414;0 PDPOP CLL .+5 /CMA 1501;0 PDPOP CMA IFZERO RALF < 0 > IFNZRO RALF < .+5 > 1514;0 /CML PDPOP CML IFNZRO RALF < .+5 /COMMON 1715;1517 PSUDO+1600 COMMX 0 /COMMZ (8-MODE COMM SECT) 1715;1532 PSUDO SECT8X-1 > DL, IFZERO RALF < .+5 /DCA 0301;0 PDPMR DCA 0 > IFNZRO RALF < .+5 /DCA . 0301;0 PDPMR 3200 .+5 /DCA% 0301;0 PDPMR+500 3600 .+5 /DCAZ 0301;3200 PDPMR DCA 0 .+5 /DCAZ% 0301;3200 PDPMR+500 DCA I 0 > IFZERO RALF < 0 > /DECIMAL IFNZRO RALF < .+5 > 0503;1115 PSUDO+0100 DECX IFNZRO RALF < 0 /DPCHK 2003;1013 PSUDO DPCHKX > EL, .+5 /E 0;0 PSUDO EX .+5 /END 1604;0 PSUDO ENDX IFZERO RALF < 0 /ENPUNCH 1620;2516 PSUDO+0300 ENPNCX > IFNZRO RALF < .+5 /ENTRY 1624;2231 PSUDO ENTRX 0 /EXTERN 3024;0522 PSUDO+1600 EXTRNX > FL, .+5 /F 0;0 PSUDO FX .+5 /FADD 0104;0400 FPPMRF 1000 .+5 /FADD# 0104;0400 FPPMRL+300 1000 .+5 /FADD% 0104;0400 FPPMRI+500 1000 .+5 /FADD' 0104;0400 FPPMRS+700 1000 .+5 /FADDM 0104;0415 FPPMRF 5000 .+5 /FADDM# 0104;0415 FPPMRL+300 5000 .+5 /FADDM% 0104;0415 FPPMRI+500 5000 .+5 /FADDM' 0104;0415 FPPMRS+700 5000 .+5 /FCLA 0314;0100 FPPSF3 0002 .+5 /FDIV 0411;2600 FPPMRF 3000 .+5 /FDIV# 0411;2600 FPPMRL+300 3000 .+5 /FDIV% 0411;2600 FPPMRI+500 3000 .+5 /FDIV' 0411;2600 FPPMRI+700 3000 .+5 /FEXIT 0530;1124 FPPSF3 0 IFNZRO RALF < .+5 /FIELD1 (8-MODE FIELD1 SECT) 1105;1404 PSUDO+6100 SECT8X-2 > .+5 /FLDA 1404;0100 FPPMRF 0000 .+5 /FLDA# 1404;0100 FPPMRL+300 0000 .+5 /FLDA% 1404;0100 FPPMRI+500 0000 .+5 /FLDA' 1404;0100 FPPMRS+700 0000 .+5 /FMUL 1525;1400 FPPMRF 4000 .+5 /FMUL# 1525;1400 FPPMRL+300 4000 .+5 /FMUL% 1525;1400 FPPMRI+500 4000 .+5 /FMUL' 1525;1400 FPPMRS+700 4000 .+5 /FMULM 1525;1415 FPPMRF 7000 .+5 /FMULM# 1525;1415 FPPMRL+300 7000 .+5 /FMULM% 1525;1415 FPPMRI+500 7000 .+5 /FMULM' 1525;1415 FPPMRS+700 7000 .+5 /FNEG 1605;0700 FPPSF3 0003 .+5 /FNOP 1617;2000 FPPSF3 0040 .+5 /FNORM 1617;2215 FPPSF3 0004 .+5 /FPAUSE 2001;2523 FPPSF3+0500 0001 .+5 /FPCOM 2003;1715 PDPOP 6553 .+5 /FPHLT 2010;1424 PDPOP 6554 .+5 /FPICL 2011;0314 PDPOP 6552 .+5 /FPINT 2011;1624 PDPOP 6551 .+5 /FPIST 2011;2324 PDPOP 6557 .+5 /FPRST 2022;2324 PDPOP 6556 .+5 /FPST 2023;2400 PDPOP 6555 .+5 /FSTA 2324;0100 FPPMRF 6000 .+5 /FSTA# 2324;0100 FPPMRL+300 6000 .+5 /FSTA% 2324;0100 FPPMRI+500 6000 .+5 /FSTA' 2324;0100 FPPMRS+700 6000 .+5 /FSUB 2325;0200 FPPMRF 2000 .+5 /FSUB# 2325;0200 FPPMRL+300 2000 .+5 /FSUB% 2325;0200 FPPMRI+500 2000 0 /FSUB' 2325;0200 FPPMRS+700 2000 GL= 0 /AINT NONE HL, 0 /HLT 1424;0 PDPOP HLT IL, .+5 /IAC 0103;0 PDPOP IAC .+5 /IFFLAP 0606;1401 PSUDO+2000 IFZERO RALF <TRUE> IFNZRO RALF <FALSE> .+5 /IFNDEF 0616;0405 PSUDO+0600 IFNDFX .+5 /IFNEG 0616;0507 PSUDO IFNEGX .+5 /IFNSW 0616;2327 PSUDO IFNSWX .+5 /IFNZRO 0616;3222 PSUDO+1700 IFNZRX .+5 /IFPOS 0620;1723 PSUDO IFPOSX .+5 /IFRALF 0622;0114 PSUDO+0600 IFNZRO RALF <TRUE> IFZERO RALF <FALSE> .+5 /IFREF 0622;0506 PSUDO IFREFX .+5 /IFSW 0623;2700 PSUDO IFSWX .+5 /IFZERO 0632;0522 PSUDO+1700 IFZROX .+5 1604;0530 PSUDO INDXX .+5 /IOF 1706;0 PDPOP IOF .+5 /ION 1716;0 PDPOP ION IFZERO RALF < 0 /ISZ 2332;0 PDPMR ISZ 0 > IFNZRO RALF < .+5 /ISZ . 2332;0 PDPMR ISZ .&7600 .+5 /ISZ% 2332;0 PDPMR+500 ISZ I .&7600 .+5 /ISZZ 2332;3200 PDPMR ISZ 0 0 /ISZZ% 2332;3200 PDPMR+500 ISZ I 0 > JL, .+5 /JA 0100;0 FPPSF2 1030 .+5 /JAC 0103;0 FPPSF3 0007 .+5 /JAL 0114;0 FPPSF2 1070 .+5 /JEQ 0521;0 FPPSF2 1000 .+5 /JGE 0705;0 FPPSF2 1010 .+5 /JGT 0724;0 FPPSF2 1060 .+5 /JLE 1405;0 FPPSF2 1020 .+5 /JLT 1424;0 FPPSF2 1050 IFZERO RALF < .+5 /JMP 1520;0 PDPMR JMP 0 .+5 /JMS 1523;0 PDPMR JMS 0 > IFNZRO RALF < .+5 /JMP . 1520;0 PDPMR JMP .&7600 .+5 /JMP% 1520;0 PDPMR+500 JMP I .&7600 .+5 /JMPZ 1520;3200 PDPMR JMP 0 .+5 /JMPZ% 1520;3200 PDPMR+500 JMP I 0 .+5 /JMS . 1523;0 PDPMR JMS .&7600 .+5 /JMS% 1523;0 PDPMR+500 JMS I .&7600 .+5 /JMSZ 1523;3200 PDPMR JMS 0 .+5 /JMSZ% 1523;3200 PDPMR+500 JMS I 0 > .+5 /JNE 1605;0 FPPSF2 1040 .+5 /JSA 2301;0 FPPSF2 1120 .+5 /JSR 2322;0 FPPSF2 1130 0 /JXN 3016;0 FPPSF1 2000 KL, .+5 /KCC 0303;0 PDPOP KCC .+5 /KRB 2202;0 PDPOP KRB .+5 /KRS 2223;0 PDPOP KRS 0 /KSF 2306;0 PDPOP KSF LL, .+5 /LAS 0123;0 PDPOP LAS .+5 /LDX 0430;0 FPPSF5 0100 .+5 /LISTOFF 1123;2417 PSUDO+0600 LSTOFX 0 /LISTON 1123;2417 PSUDO+1600 LSTONX ML= 0 /NO LIST NL, IFZERO RALF < .+5 > IFNZRO RALF < 0 > 1720;0 /NOP PDPOP NOP IFZERO RALF < 0 /NOPUNCH 1720;2516 PSUDO+0300 NOPNCX > OL, .+5 /OCTAL 0324;0114 PSUDO OCTALX .+5 /ORG 2207;0 PSUDO ORGX 0 /OSR 2322;0 PDPOP OSR IFZERO RALF < PL, 0 /PAGE 0107;0500 PSUDO PAGEX > IFNZRO RALF <PL=0 > QL= 0 /WHAT DID YOU EXPECT? RL, .+5 /RAL 0114;0 PDPOP RAL .+5 /RAR 0122;0 PDPOP RAR .+5 /RDF 0406;0 PDPOP RDF .+5 /REPEAT 0520;0501 PSUDO+2400 REPETX .+5 /RIB 1102;0 PDPOP RIB .+5 /RIF 1106;0 PDPOP RIF .+5 /RMF 1506;0 PDPOP RMF .+5 /RTL 2414;0 PDPOP RTL 0 /RTR 2422;0 PDPOP RTR SL, .+5 /S 0;0 PSUDO SX IFNZRO RALF < .+5 /SECT 0503;2400 PSUDO SECTX .+5 /8 MODE SECT 0503;2470 PSUDO SECT8X > .+5 /SETB 0524;0200 FPPSF2 1110 .+5 /SETX 0524;3000 FPPSF2 1100 .+5 /SKP 1320;0 PDPOP SKP .+5 /SMA 1501;0 PDPOP SMA .+5 /SNA 1601;0 PDPOP SNA .+5 /SNL 1614;0 PDPOP SNL .+5 /SPA 2001;0 PDPOP SPA .+5 /STARTD 2401;2224 FPPSF3+0400 0006 .+5 /STARTE 2401;2224 FPPSF3+0500 0050 .+5 /STARTF 2401;2224 FPPSF3+0600 0005 .+5 /STL 2414;0 PDPOP STL .+5 /SZA 3201;0 PDPOP SZA 0 /SZL 3214;0 PDPOP SZL TL, IFZERO RALF < .+5 /TAD 0104;0 PDPMR TAD 0 > IFNZRO RALF < .+5 /TAD . 0104;0 PDPMR TAD .&7600 .+5 /TAD% 0104;0 PDPMR+500 TAD I .&7600 .+5 /TADZ 0104;3200 PDPMR TAD 0 .+5 /TADZ% 0104;3200 PDPMR+500 TAD I 0 > .+5 /TCF 0306;0 PDPOP TCF .+5 /TEXT 0530;2400 PSUDO TEXTX .+5 /TLS 1423;0 PDPOP TLS .+5 /TPC 2003;0 PDPOP TPC .+5 /TRAP3 2201;2063 FPPSF1 3000 .+5 /TRAP4 2201;2064 FPPSF1 4000 .+5 /TRAP5 2201;2065 FPPSF1 5000 .+5 /TRAP6 2201;2066 FPPSF1 6000 .+5 /TRAP7 2201;2067 FPPSF1 7000 0 /TSF 2306;0 PDPOP TSF UL= 0 VL= 0 WL= 0 XL, 0 /XTA 2401;0 FPPSF4 0030 YL= 0 ZL, 0 /ZBLOCK 0214;1703 PSUDO+1300 ZBLKX IFZERO RALF < PNDL=0 > IFNZRO RALF < PNDL, .+6 /BLANK COMMON 0;0 3 /CODE FOR COMMON 40;0 /ESD #2, LEN=0 0 /#MAIN 1501;1116 4 /CODE FOR SECTION LMAIN, 20;0 /ESD #1, LEN=0> FREE, END, END /NICE WHEN FLAP ASSEMBLES $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 | /FORTRN 4 RTS LOADER / / VERSION 5A PT 16-MAY-77 / / / / / // / / / / /COPYRIGHT (C) 1974, 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /FORTRAN 4 RTS LOADER - RL /WITH DOUBLE PRECSION - MKH /AND RTS-8 SUPPORT - R. LARY /LAST EDITED 5/21/74 / / CHANGES FOR OS/78 AND OS/8 V3D BY P.T. 5/1/77 / .FIXED THE D AND B FORMAT (FPP) BUG / .FIXED FIELD OVERFLOW BUG(NO. OF ASTERISKS PRINTED) // // 18-DEC-2018 LHN - edited the changes in FPAT.PA into // this source file. This didn't change // the version number. // /PAGE 0 LOCATIONS FOR RTS LOADER X0= 10 X1= 11 X2= 12 X3= 13 HADR= 20 UNIT= 21 HCWORD= 22 MXFLD= 23 HLDADR= 24 HGHFLD= 25 HGHADR= 26 RLTMP= 27 HDIFF= 30 CFLAG= 31 /DURING MOST OF THE LOAD OPERATION A SECTION OF FIELD 0 RTS /IS MOVED UP INTO FIELD 1 AND THE VACATED AREA OF FIELD 0 IS USED /TO RUN THE COMMAND DECODER AND TO ACCUMULATE DEVICE HANDLERS. /*K* THEREFORE, IF THE RTS LOADER IS TO MODIFY ANY CODE BETWEEN /"F0HBEG" AND "F0HEND" IT MUST MODIFY IT IN FIELD 1 IN THE "F0TO" AREA. F0HBEG= 0 F0HEND= 3000 F0HSAV= 7000 /400 WORDS WHERE DEVICE HANDLERS ARE TEMPORARILY SAVED /SO THAT THEY WON'T INITIALIZE THEMSELVES WRONG /RTS LOADER TABLES *2000 IONTBL, ZBLOCK 100 /INTERRUPT ENABLE TABLE - LOW BIT ONLY HCWTBL, ZBLOCK 14 /HANDLER CONTROL WORD - ONE PER PAGE (LOTSA WASTE) TFTABL, ZBLOCK 45 /TENTATIVE FILE SAVE TABLE DVTEMP, ZBLOCK 17 /HANDLER ENTRY TABLE SAVE AREA *IONTBL+5 /RK8 / RK8E 1 *IONTBL+16 /DTA 1 *IONTBL+6 /RF08 IN 4 FLAVORS 1;1;1;1 *IONTBL+0 /TTY 2 /FORMS CONTROL ON TTY *IONTBL+4 /LPT 2 /FORMS CONTROL ON LPT *IONTBL+23 1 *IONTBL+25 1 PAGE /RTS LOADER RTSLDR, JMS I (RTINIT JMS I (RTINIT /INITIALIZE WHETHER CHAINED TO OR NOT JMP NOCD LICD, JMS I (200 5 1404 /.LD DEFAULT EXTENSION NOCD, JMS I (TSTSWS /TEST /E,/P,/V AND /H SWITCHES TAD I (7617 SNA JMP LICD AND (17 JMS I (GETHAN /GET HANDLER TO LOAD WITH 0 /DON'T PUT IT ANYWHERE TAD I (7620 DCA LIBLK JMS I (SVHND /COPY HANDLER TO AVOID BAD INITIALIZATION CIF 0 JMS I HLDADR 0100 LHDR, QLHDR LIBLK, 0 JMP LDIOER JMS I (RSTHND /RESTORE VIRGIN COPY OF HANDLER CDF 0 TAD HADR DCA I (OVHND TAD HCWORD DCA I (OVHCDW TAD (QUSRLV-1 DCA X0 AC7776 TAD I LHDR SZA CLA /VERIFY LOADER IMAGE INPUT JMP NOTLI /GOOD THING WE CHECKED! TAD DPFPP TAD I (QDPFLG /CHECK IF TRYING TO USE D.P. WITHOUT OPTION SMA CLA JMP .+3 JMS I (RLERR /YES - PRINT WARNING MESSAGE NODPMS /BUT LET THE FOOL GO ON /SET UP RTS TABLES FROM LOADER IMAGE CDF 0 TAD (OVLYTB-1 DCA X1 TAD (-10 DCA RLTMP OVRELP, TAD I X0 DCA I X1 /MOVE USER OVERLAY INFO INTO SWAP TABLE, TAD I X0 DCA I X1 TAD I X0 TAD LIBLK /RELOCATING THE BLOCK NUMBERS DCA I X1 TAD I X0 DCA I X1 ISZ RLTMP JMP OVRELP TAD I (QRTSWP AND (7770 /TURN THE LOADER INITIAL SWAP WORD DCA I (STSWAP+2 TAD I (QRTSWP /INTO A DUMMY SWAP WORD AND A JUMP WORD AND (7 /SO THAT WE CAN HALT BETWEEN TAD (JA /LOADING AND STARTING USERS PROGRAM. DCA I (STJUMP TAD I (QRTSWP+1 DCA I (STJUMP+1 TAD I (QHGHAD DCA HGHFLD CLA IAC TAD HGHFLD CMA DCA I (FCNT TAD I (QHGHAD+1 DCA HGHADR JMS I (GETFIL /GET USER I/O FILES IF ANY TAD I (OS8DAT /SALT AWAY OS/8 DATE WORD DCA I (VDATE-F0HBEG+F0TO STL CLA 6141 /TEST IF WE ARE ON A PDP-12 0261 /ROL I 1 - PUTS LINK IN AC11 0002 /PDP DCA I (V8OR12+1-F0HBEG+F0TO JMS I (MOVE CDF 10 SPSTRT-1 /MOVE SPECIAL /P START CODE TO LOC 200 CDF 10 200-F0HBEG+F0TO-1 /(RELOCATED 200, THAT IS) -3 JMP I (MOVCOR DPFPP, 3777 /0 IF D.P. FPP AVAILABLE NOTLI, JMS I (RLERR NOLI JMP LICD LDIOER, JMS I (RLERR LIOEMS CDF CIF 0 JMP I (7605 PAGE /FIGURE OUT CORE LIMITS AND WRITE OUT PG 17600 MOVCOR, TAD I (HTOP TAD HDIFF /GET BOTTOM OF HANDLER AREA CIA CLL /LENGTH OF HANDLER AREA IN AC TAD HGHADR SZL /TRICKY CODE - IF (L,AC)=0, AC GETS -1 STA /IF (L,AC) =0XXXX, AC GETS 0 SNA CLA /IF (L,AC) =1XXXX, AC GETS 1 STL STA /THERE OUGHTA BE A SHORTER WAY - RAL /I'D APPRECIATE HEARING ONE. TAD HGHFLD /USE MAGIC NUMBER TO ADJUST HGHFLD CIA /BEFORE WE COMPARE IT TO TOP-OF-CORE TAD MXFLD SPA CLA JMP TOOBIG /ALL THAT WORK FOR NOTHING! TAD MXFLD CLL RTL RAL TAD (CDF DCA HCDF /PREPARE TO TRANSFER THE HANDLERS JMS I (MOVE /BEFORE WE MOVE THE HANDLERS WE SHOULD WRITE CDF 10 /OUT PAGE 17600 AND THE RTS CLEANUP CODE TFTABL-1 /SINCE THE HANDLERS MAY OVERLAY THEM. CDF 10 /SO FIRST MOVE THE TENTATIVE FILE TABLE 7600-1 /INTO PAGE 17600 WHERE IT'S SAFE. -45 CIF 0 JMS I (7607 4210 7400 37 /SUITABLE SCRATCH BLOCK JMP SYSERR TAD HDIFF TAD (F0HEND /CHANGE HDIFF FROM AN OFFSET DCA HDIFF /TO THE FIRST LOC ABOVE THE HANDLERS. /SHUFFLE CORE AROUND AND START UP RTS HLOOP, STA TAD HDIFF /WE HAVE TO MOVE THE HANDLERS IN A COCKEYED DCA HDIFF /WAY SINCE WE MIGHT BE PARTIALLY SWAPPING CDF 0 /CORE BETWEEN FIELD 0 (THE HANDLERS) AND STA /FIELD 1 (WHERE WE SAVED FIELD 0) IN 8K SYSTEMS. TAD HPTR1 DCA HPTR1 STA TAD HPTR2 DCA HPTR2 TAD I HPTR1 HCDF, HLT /MOVE A HANDLER WORD FROM FIELD 0 DCA I HDIFF /TO FIELD N CDF 10 TAD I HPTR2 /MEANWHILE RESTORE FIELD 0 CDF 0 DCA I HPTR1 /FROM FIELD 1 ISZ HMCT JMP HLOOP /DO MORE THAN WE HAVE TO - IT CAN'T HURT CDF CIF 0 TAD (5606 DCA I (7605 /SET UP OS/8 RETURN SEQUENCE TO TRAP TO RTS TAD (PDPXIT DCA I (7606 /AS RANDOM RESTARTS COULD BE FATAL. FPICL /RE-INITIALIZE FPP (IF ANY) FPCOM /CLEAR APT POINTER FIELD BITS (IF FPP) CLA IAC 6654 /LOAD PRINTER BUFFER ON ANALEX PRINTER SZA CLA /IS ANALEX PRESENT? JMP I (FPSTRT /NO - START UP DCA I (LPTEST /IF ANALEX TAKE OUT LPT INTERNAL HANDLER LP6652, 6652 /ALSO CLEAR ALL ANALEX FLAGS DCA I (LPTSNA 6662 /CLEAR BUFFER ON ANALEX TAD (6651 DCA I (LPTERR /REPLACE LP08 ERROR CODE BY ANALEX TAD LP6652 /TO AVOID HANGING ON ANALEX POWER OFF. DCA I (LPTERR+2 JMP I (FPSTRT TOOBIG, JMS I (RLERR TOOMCH OS8RTN, CDF CIF 0 JMP I (7605 SYSERR, JMS I (RLERR SYSMSG JMP OS8RTN HPTR1, F0HEND HPTR2, F0TO+F0HEND-F0HBEG HMCT, F0HBEG-F0HEND /MOVE ROUTINE MOVE, 0 /GENERAL MOVE SUBROUTINE CDF 10 CLA TAD MOVE DCA X2 TAD I MOVE DCA FRMFLD TAD I X2 DCA X3 TAD I X2 DCA TOFLD TAD I X2 DCA X1 TAD I X2 DCA MVC FRMFLD, HLT TAD I X3 TOFLD, HLT DCA I X1 ISZ MVC JMP FRMFLD CDF 10 JMP I X2 MVC, 0 HNDERR, JMS I (RLERR TOMNYH JMP OS8RTN PAGE /INITIALIZATION RTINIT, 0 ISZ RTINIT /SKIP RETURN JMS I (BAKTST /SEE IF WE'RE RUNNING IN BACKGROUND UNDER RTS-8 CIF 0 JMS I (CORE DCA MXFLD CLA IAC JMS I (GETION /GET ION BIT FOR SYS HANDLER DCA I (HCWTBL+13 /SAVE IT SWAB /SET EAE MODE TO B (IF 8/E) CLA IAC EAEKIL, SHL /ZERO THIS LOCATION TO INHIBIT EAE CLA IAC /LOW ORDER BITS 01 TAD (-2 SNA CLA /TEST FOR 8/E EAE JMS I (MOVEAE /YES - SUBSTITUTE PACKAGES TAD (APT FPST /START FPP ON "STARTE;FEXIT" JMP NOFPP /DIDN'T START JMS I (MOVE CDF 10 FPPINT-1 /THE FPP HANDLER AND D.P. I/O PKG IS IN THE CDF 0 /SAME LOCATIONS IN FIELD 1 AS THE FPPINT-1 /FPP INTERPRETER IN FIELD 0. -1000 /COUNT FOR DBL PREC SPACE FPRST /FPP HAD BETTER BE DONE BY NOW!! AND (4 /GET D.P. STATUS BIT SNA CLA JMP NOFPP /NO DOUBLE PRECISION DCA I (DPFPP /SET FLAG TO INDICATE D.P. AVAILABLE CDF 0 TAD (DFMT DCA I (DF /ENABLE D FORMAT TAD (BFMT DCA I (BF /AND B FORMAT CDF 10 NOFPP, JMS I (MOVE RICDF0, CDF 0 F0HBEG-1 CDF 10 F0TO-1 /MOVE LOWER F0 INTO F1 FOR SAFEKEEPING F0HBEG-F0HEND CDF 0 TAD I (OSJSWD /GET OS/8 STATUS WORD AND (6374 /FORCE BITS ON INDICATING NON-RESTARTABLE JOB TAD (1003 /AND DESTRUCTIVE CALLS TO CD AND USR DCA I (OSJSWD /MEANWHILE FORCING "BATCH SAVED" BIT OFF TAD I (7612 TAD (-3 /CHECK FOR IN-CORE TD8E'S SZA CLA JMP NOTDSY TAD MXFLD CLL RTL RAL TAD RICDF0 DCA TD8EFG /SET TD8E FLAG WHICH IS ALSO CDF TAD I (7642 AND (70 TAD RICDF0 /GET THE FIELD WE'RE COMING FROM DCA TD8EFL TAD TD8EFG // // FPAT patch // // IAC AND FPAT1 // // JMS I (TDSET /REDO THE CDF'S IN F0 JMS I (MOVE TD8EFL, CDF 20 7577 TD8EFG, 0 7577 -174 /SPARE BATCH PARAMETERS IN TOP FIELD TAD MXFLD /SET FLAG IN CLEANUP ROUTINE DCA I (TDEXFG /TO RESTORE TD8E HANDLER TO FIELD 2 NOTDSY, CDF 10 TAD MXFLD TAD (-7 SNA /32K? JMP TAKCAR /YES - UNIQUE PROBLEMS TAD (6 SNA CLA /8K? JMP ONLY8K /YES - IGNORE BATCH & TD8E CRAP JMS I (GBFLG /GET BATCH FLAG TAD TD8EFG SNA CLA /IF NO BATCH OR TD8E'S, ONLY8K, TAD (200 /USE ALL OF THE LAST FIELD. STOHDF, TAD (-F0HEND-200 DCA HDIFF /OTHERWISE USE ONLY UP TO 7600 JMP I RTINIT TAKCAR, JMS I (GBFLG /GET BATCH FLAG SNA CLA JMP NO32KB /NO BATCH - USE UP TO 77400 (TD8E ROM) TAD (6 /BATCH - USE UP TO 67600 DCA MXFLD JMP STOHDF NO32KB, TAD TD8EFG SNA CLA /IF IN-CORE TD8E'S TAD (7600 /LIMIT IS 77600 ELSE 77400 JMP STOHDF // // FPAT patch // *2742 FPAT1, 7770 // PAGE GETHAN, 0 /GET HANDLER SUBROUTINE AND (17 DCA UNIT DCA H1 TAD UNIT JMS I (200 12 /INQUIRE H1, 0 NOP /ERROR RETURN ALWAYS SKIPPED TAD H1 SNA JMP NOTLDD /NOT IN CORE - MUST LOAD JMS HCWTBA /IN CORE GHEXIT, TAD I HCWPTR /GET CONTROL WORD FOR HANDLER PAGE DCA HCWORD TAD HLDADR DCA HADR /ASSUME HANDLER PERMENANTLY RESIDENT TAD (-4 AND HCWORD SNA CLA /WERE WE RASH? JMP RESHAN /NO TAD HADR AND (177 TAD (HPLACE /YES - I APOLOGIZE DCA HADR RESHAN, TAD I GETHAN /GET DSRN NUMBER SNA JMP I GETHAN /NO DSRN NUMBER CLL RTL RAL TAD I GETHAN TAD (DSRN-12 DCA X0 /XR POINTS TO DSRN ENTRY CDF 0 TAD HADR DCA I X0 /SEE PG 0, FLD 0 FOR DSRN FORMAT TAD HCWORD TAD CFLAG /THE C BIT REVERSES THE FORMS CTL BIT ON THIS FILE AND (7773 /KILL ANY OVERFLOW DCA I X0 TAD HGHFLD CLL RTL RAL TAD HGHADR DCA I X0 /SAVE BUFFER ADDRESS, FIELD TAD HGHADR DCA I X0 /INITIALIZE WORD POINTER TAD HGHADR TAD (400 SNA ISZ HGHFLD /BUMP DOUBLEWORD BUFFER ADDRESS DCA HGHADR AC7775 DCA I X0 /INITIALIZE CHAR CTR CDF 10 JMP I GETHAN /RETURN /LOAD A NON-RESIDENT HANDLER NOTLDD, JMS GH CLA IAC JMS GH /TRY 1-PAGE AND THEN 2-PAGE ASSIGN HLT /ARRRGHHHH!!! GH, 0 DCA TPFLG TAD HTOP TAD (7600 /BUMP HANDLER CEILING DOWN SNA JMP I (HNDERR /CAN'T PUT HANDLER IN PAGE 0 DCA HTOP TAD TPFLG TAD HTOP DCA GHADR TAD UNIT JMS I (200 1 /FETCH HANDLER GHADR, 0 JMP I GH /FAILED! TAD GHADR /SAVE ACTUAL LOAD ADDRESS JMS HCWTBA /INDEX INTO HCW TABLE TAD GHADR AND (7600 TAD HDIFF DCA GHADR /SAVE RELOCATED HANDLER PAGE ADDRESS TAD MXFLD /PUT ADDR IN BITS 0-3 AND FIELD IN BITS 6-8 CLL RTL RAL TAD GHADR DCA GHADR TAD UNIT JMS I (GETION /ION BIT INTO BIT 11, FORMS CTL BIT INTO BIT 10 TAD GHADR DCA I HCWPTR /STORE POINTER FOR THIS PAGE JMP GHEXIT HCWTBA, 0 DCA HLDADR TAD HLDADR AND (7600 CLL RTL RTL RTL /GET PAGE NUMBER TAD (HCWTBL-24 DCA HCWPTR /SAVE POINTER INTO TABLE JMP I HCWTBA HTOP, F0HEND HCWPTR, 0 TPFLG, 0 SPSTRT, RELOC 200 / /P STARTUP CODE SWAB /MAKE SURE EAE IS IN MODE B JMP I .+1 /EXECUTES AT 200 FPSTRT /START UP IN FLAG CLEARING CODE RELOC PAGE /ROUTINE TO ACCEPT FILE SPECIFICATIONS GETFIL, 0 CDF 10 TAD I (OS8SWS-1 SPA CLA /ALTMODE MEANS NO MORE SPECS JMP I GETFIL GETFCD, JMS I (SPMDCD /CALL CD IN SPECIAL MODE TAD I (7600 STL CIA SNA /OUTPUT FILE? TAD I (7605 SNA /IN OR OUT FILE? TAD I (OS8SWS+3 /NEITHER - HOW ABOUT INTERNAL HANDLER? SNA CLA JMP GETFIL+1 /NONE OF THE ABOVE RAR /LINK MAGICALLY TELLS DIRECTION DCA DIR DCA DSRNUM TAD I (OS8SWS+2 AND (777 /SWITCHES 1-9 SNA JMP NONUM CLL RTL DNUMLP, ISZ DSRNUM RAL SMA JMP DNUMLP /TRANSLATE SWITCH INTO NUMBER TAD DIR /** AC IS NEGATIVE ** SPA CLA TAD (5 TAD (7600 DCA FPTR /POINT TO FILE UNIT TAD I FPTR SNA JMP INTHND /NO FILE - GET HANDLER FROM INTERNAL LIST JMS I (GETHAN /GET HANDLER - XR10 POINTS INTO DSRN DSRNUM, 0 /DSRN ENTRY NUMBER TAD DIR STL RTL /GENERATE 2 OR 3 (LOOKUP OR ENTER) DCA LKPNTR TAD I FPTR /GET UNIT AND REQUESTED BLOCK COUNT (IF ENTER) ISZ FPTR /BUMP POINTER SO IT POINTS TO THE FILE NAME DCA FUNIT /SAVE UNIT NUMBER A SEC TAD I FPTR /WATCH OUT FOR NULL FILE NAMES SNA CLA /AS THEY WILL FAIL ON LOOKUPS JMP NONAME /ON OUTPUT-ONLY NON-DIRECTORY DEVICES JMS I (SVHND /SAVE HANDLER TAD FUNIT JMS I (200 LKPNTR, 0 /LOOKUP OR ENTER FPTR, 0 /FILE NAME FUNIT, 0 /GETS LENGTH JMP FILERR /SOMETHING NOT KOSHER JMS I (RSTHND /RESTORE VIRGIN COPY OF HANDLER STDSRN, TAD FPTR CDF 0 DCA I X0 /SAVE STARTING BLOCK DCA I X0 /RELATIVE BLOCK TAD FUNIT SNA IAC /FUDGE NON-DIRECTORY DEVICES VERY LARGE CIA /TURN NEGATIVE COUNT TO POSITIVE DCA I X0 /LENGTH TAD X0 DCA FPTR /SAVE PTR TO LENGTH WORD CDF 10 TAD DIR SMA CLA /TENTATIVE FILE? JMP GETFIL+1 TAD FPTR /YES - STORE POINTER TO LENGTH WORD OF DSRN DCA I TFPTR /IN TENTATIVE FILE TABLE ENTRY JMS I (MOVE CDF 10 7600-1 CDF 10 TFPTR, TFTABL /SAVE FILE NAME AND UNIT IN -5 /TENTATIVE FILE TABLE TAD TFPTR TAD (6 DCA TFPTR /BUMP PTR TO NEXT 6-WORD ENTRY JMP GETFIL+1 NONUM, JMS I (RLERR NONMSG JMP GETFCD FILERR, JMS I (RLERR FILMSG JMP GETFCD DIR, 0 NONAME, DCA FPTR DCA FUNIT /ZERO BLOCK # AND LENGTH JMP STDSRN /USE ENTIRE DEVICE AS FILE INTHND, STA TAD I (OS8SWS+3 AND (3 /ONLY USE LOW ORDER 2 BITS OF NUMBER TAD (IHTBL DCA HADR /SAVE PTR INTO TABLE OF INTL HANDLERS TAD DSRNUM CLL RTL RAL TAD DSRNUM /MULTIPLY DSRN NUMBER BY 9 TAD (DSRN-11 /ADD TABLE BASE DCA DSRNUM TAD I HADR CDF 0 DCA I DSRNUM ISZ DSRNUM AC7776 TAD CFLAG /DEPENDING ON THE C FLAG, CIA DCA I DSRNUM /DISABLE OR ENABLE FORMS CONTROL JMP GETFIL+1 PAGE TSTSWS, 0 /ROUTINE TO TEST CD SWITCHES E AND H TAD I (OS8SWS AND (20 CDF 0 SNA CLA /TEST FOR /H SWITCH JMP .+3 TAD (HLT DCA I (HLTNOP /SET TO HALT BEFORE STARTING PROGRAM CDF 10 TAD I (OS8SWS+1 AND (4 SNA CLA /TEST FOR /V SWITCH JMP .+3 /NO JMS I (RLERR /YES - PRINT VERSION NUMBER MESSAGE XVERMS TAD I (OS8SWS AND (200 CDF 0 SZA CLA /TEST FOR /E SWITCH ISZ I (ERRFLG /MAKE USER ERRORS NON-FATAL CDF 10 /(USER ERROR = MISSING SUBROUTINE, ETC) TAD I (OS8SWS+1 AND (400 CDF 0 SNA CLA /TEST FOR /P SWITCH JMP .+3 /NO, PRAISE BE! TAD (SKP /GIVE THE DUMMY WHAT HE WANTS DCA I (HLTNOP CDF 10 TAD I (OS8SWS RTL SMA CLA AC0002 DCA CFLAG /SAVE C FLAG IN PAGE0 JMP I TSTSWS MOVEAE, 0 TAD (EFFNOR /SUBSTITUTE A POINTER TO THE EAE NORMALIZE CDF 0 /ROUTINE FOR THE POINTER TO THE NON-EAE DCA I (NORMX /NORMALIZE ROUTINE JMS I (MOVE CDF 10 FPPKG-1 /THE EAE PKG IS IN THE SAME PAGE IN FIELD 1 CDF 0 FPPKG-1 /AS THE NON-EAE PKG IN FIELD 0 -600 JMS I (MOVE CDF 0 /SUBSTITUTE FAST FIX AND FLOAT EFXFLT-1 CDF 0 EAEFIX-1 -FXFLTC JMP I MOVEAE SPMDCD, 0 /SUBR TO DO A SPECIAL MODE COMMAND DECODE JMS I (MOVE CDF 10 OS8DVT-1 CDF 10 DVTEMP-1 /MOVE OS/8 DEVICE HANDLER TABLE -17 /SINCE C.D. CLEARS IT AND WE ARE USING IT TAD I (HTOP /GET LOWEST HANDLER LOADED RAL SZL SPA CLA /DID WE LOAD ANY BELOW 02000? JMP .+4 /NO CDF 0 ISZ I (OSJSWD /YES - MAKE CD CALLS DESTRUCTIVE ISZ I (OSJSWD CDF 10 JMS I (200 5 /COMMAND DECODE 5200 /SPECIAL MODE - WROUGHT WITH PERIL 0 /DON'T CLEAR TENTATIVE FILES JMS I (MOVE CDF 10 DVTEMP-1 CDF 10 OS8DVT-1 -17 /MOVE DEVICE HANDLER TABLE BACK JMS TSTSWS /CHECK FOR /E, /H, /P JMP I SPMDCD IHTBL, PTR;PTP;LPT;TTY /INTERNAL HANDLER TABLE PAGE GETION, 0 TAD (OS8DCB-1 DCA GMADR TAD I GMADR /GET DCB WORD CLL RTR RAR AND (77 /INDEX INTO TABLE TAD (IONTBL /WHICH INDICATES IF HANDLER CAN EXECUTE DCA GMADR /WITH INTERRUPTS ON TAD I GMADR /ION BIT INTO BIT 11, FORMS CONTROL INTO BIT 10 JMP I GETION GBFLG, 0 CDF 0 TAD I (7777 /SPECIAL FLAGS LOC CDF 10 RTL CLA RAL JMP I GBFLG SVHND, 0 /ROUTINE TO SAVE HANDLER IN F1 JMS GMADR /GET MOVE FROM ADDRESS JMP I SVHND /NO HANDLER TO MOVE DCA SVMOVE JMS I (MOVE CDF 0 SVMOVE, 0 CDF 10 F0HSAV-1 -400 JMP I SVHND RSTHND, 0 /ROUTINE TO RESTORE HANDLER FROM F1 JMS GMADR JMP I RSTHND /HANDLER IS SYS: DCA RSTMOV JMS I (MOVE CDF 10 F0HSAV-1 CDF 0 RSTMOV, 0 -400 JMP I RSTHND GMADR, 0 TAD HLDADR SPA /CHECK THAT WE'RE NOT TRYING JMP RESHND /TO SAVE A RESIDENT HANDLER - AND RESHND /THAT COULD BE TRICKY TAD (-1 /ECCH ISZ GMADR JMP I GMADR RESHND, 7600 JMP I GMADR /RTS LOADER ERROR MESSAGE ROUTINE & MESSAGES RLERR, 0 /ERROR MESSAGES ARE IN FIELD 0 CLA CDF 10 TAD I RLERR CDF 0 DCA RLTMP RELP, TAD I RLTMP RTR RTR RTR AND (77 JMS LTTY TAD I RLTMP AND (77 JMS LTTY ISZ RLTMP JMP RELP EOMSG, TAD (7515 JMS LTTY TAD (7512 JMS LTTY ISZ RLERR CDF 10 JMP I RLERR /SOME MESSAGES ARE NOT FATAL LTTY, 0 SNA JMP EOMSG TAD (240 SMA AND (77 /CONVERT SIXBIT TO EIGHTBIT TAD (240 TLS CLA TSF JMP .-1 JMP I LTTY /ROUTINE TO DETERMINE WHETHER WE ARE RUNNING IN THE /BACKGROUND UNDER RTS-8, AND MODIFY THE RUN-TIME SYSTEM IF WE ARE. /RUNS AT INITIALIZATION TIME, BEFORE LOWER FIELD 0 IS MOVED BAKTST, 0 FPICL /FIRST INITIALIZE FPP (IF ANY) FPCOM /INCLUDING CLEARING EXTENDED APT POINTER TCF /TEST FOR RTS-8 BACKGROUND BY CLEARING THE TSF /TTY FLAG AND THEN TESTING IT - IF IT IS JMP I BAKTST /STILL SET, WE ARE RUNNING UNDER SRT-8. CDF 0 /MODIFY LIST AND MODIFICATIONS ARE IN FIELD 0 BAKLP, TAD I BKRPTR /GET POINTER TO BLOCK TO BE MODIFIED SNA JMP BAKRTN /ZERO - WE'RE DONE DCA X0 /STORE IN AUTO-XR ISZ BKRPTR BAKWLP, TAD I BKRPTR /GET NEXT WORD TO STORE ISZ BKRPTR SNA JMP BAKLP /ZERO MEANS END OF GROUP DCA I X0 JMP BAKWLP BAKRTN, CDF 10 /RESET DATA FIELD TO 10 DCA I (EAEKIL /EAE USES SGT WHICH IS NOT EMULATED, SO KILL IT JMP I BAKTST /AND RETURN BKRPTR, BKRLST PAGE F0TO= . /FLOATING POINT PROCESSOR HANDLER *FPPINT RETURN, JMP FPPRTN /MUST BE AT 0 IN PAGE FPGO, 0 /FPP STARTUP ROUTINE - MUST BE AT 1 IN PAGE CDF 0 DCA STEFLG TAD PC DCA FSAVPC /SAVE OLD PC FOR ONE LEVEL TAD APT DCA SAVAPT /OF RE-ENTRANTNESS TAD I FPGO DCA PC TAD APT AND (7770 DCA APT /SET UP ADDRESS IN APT FPREST, TAD (400 /ENABLE FPP INTERRUPTS FPCOM /LOAD AND STORE ENTIRE APT CLA /NECESSARY? TAD STEFLG /0 OR 4000?(STARTF OR STARTE) SZA 6567 /A MNEMONIC? CLA TAD (APT IOF FPST /START UP FPP JMP .-1 /I HAVE NO IDEA WHY IT DIDN'T START CLA /NECESSARY? JMS I (HANG /EXECUTE BACKGROUND FPUHNG FPRST /READ FPP STATUS FPICL /RESET FPP ION RTL SZL /TEST TRAP BIT JMP TRAP /YUP - GO EXECUTE IT AND (7400 SZA /ANY ERRORS? JMP FPPER TAD FSAVPC DCA PC /RESTORE OLD PC TAD SAVAPT DCA APT ISZ FPGO JMP I FPGO /FLOATING POINT TRAP PROCESSOR TRAP, AC7775 TAD PC DCA PC /BACK UP PC TO BEFORE THE TRAP SZL STA TAD APT /INCLUDING THE FIELD BITS DCA APT TAD APT /SET UP "FETPC" TO FETCH POSSIBLE TRAP ARGS JMS I MCDF DCA I (PCCDF JMS I (FETPC DCA T TAD T /GET TRAP WORD JMS I MCDF IAC /MAKE A "CDF CIF N" IAC DCA TRPCIF JMS I (FETPC DCA ADR /STORE PDP8-CODE ROUTINE ADDRESS TAD T TRPCIF, HLT /SET DATA AND INSTRUCTION FIELDS SMA CLA /TRAP3 OR TRAP4? JMP I ADR /TRAP3 - GO TO ADR JMS I ADR /TRAP4 - CALL ADR FPPRTN, DCA STEFLG ISZ PC /RESTORE PC FROM BEFORE TRAP SKP ISZ APT /INCLUDING FIELD CDF 0 JMP FPREST /RESTART FPP FPPER, SPA JMP I (FPPERR /FPHALT - FATAL ERROR RTL ISZ FATAL /DIVIDE BY 0 AND OVERFLOW ARE NON-FATAL SZL JMP FPDVER FPOVER, JMS I ERR SKP FPDVER, JMS I ERR TAD . /I ALWAYS WANTED TO INCLUDE ONE OF THESE! DCA ACX AC2000 DCA ACH JMP FPREST FSAVPC, 0 SAVAPT, 0 STEFLG, 0 /RANDOM FPP CODE FOR D.P. I/O DFSTM2, FSTA+LONG DFTMP2 FEXIT PAGE /THIS IS DOUBLE PRECISION FORMATTED OUTPUT. /ITS A LOT LIKE SINGLE PRECISION,WITHOUT ALL THE G + I STUFF /AND, OH JOY!, NO PAGE 0 LITERALS. DNXT, TAD RWFLAG /READ OR WRITE? SMA CLA AC4000 /ITS INPUT SO LEAVE IN STARTE MODE JMS I (GETLMN JMP .+3 DFMT, STA BFMT, DCA EFLG TAD D DCA OD /SAVE COUNT OF DIGITS AFTER DEC PT TAD PFACT DCA PFACTX DCA SCALE JMS I (SKPOUT /DONE? JMP I (DPIN /ITS INPUT STA /ITS OUTPUT DCA I (FFNEG /USE THIS LOCN AS SIGN FLAG TAD EFLG CLL RAL CLL RAL TAD W /GIVE ROOM FOR EXP FIELD (IF ANY) CLL /NECESSARY? DCA I (OW TAD ACH SNA JMP SKPZRO /IF AC 0,SKIP ALOT OF THIS SMA CLA JMP DSCLUP JMS I (DFNEG /AC<0-NEGATE IT DCA I (FFNEG / 0 <> 7777 DSCLUP, DCA SCALE TAD ACX SMA SZA CLA /AC<1.0? JMP DGT1 /NO AC4000 /STARTE JMS I (FPGO /Y-MULT BY 10. FMUL10 STA TAD SCALE /BUMP POWER OF TEN JMP DSCLUP DGT1, JMS I (DSCLDN /NUMBER IS >=1.;NOW DECREASE IT TO (0,1) AC4000 JMS I (FPGO /SAVE IT FSTTMP TAD (22 JMS I (OSCALE AC4000 JMS I (FPGO FADTMP JMS I (DSCLDN SKPZRO, JMS I (DIGCNT /NO NEED FOR ALL THE G STUFF TO BE /INCLUDED IN THE SINGLE PREC ROUTINE /MAKE NOTG ROUTINE A SUBROUTINE SMA /EQUIV TO OUTNUM IN SINGLE PREC JMP DASTRS JMS I (OBLNKS AC7775 ISZ I (FFNEG /IF SIGN IS NEG, JMS I (DIGIT /PRINT A MINUS CLA TAD ACX SNA /ALIGN FAC MANTISSA INTO A JMS I (DAL1 /FRACTION (.1,1) IAC SPA JMS I (DACSR CLA TAD EAC3 DCA AC1 /MOVE FAC DOWN SO OVERFLOW FROM TAD EAC2 /MULT BY 10 IN HIGH ORDER WORD DCA EAC3 TAD EAC1 DCA EAC2 TAD ACL DCA EAC1 TAD ACH DCA ACL TAD SCALE SPA SNA /ANY DIGITS TO LEFT OF DEC PT? JMP I (DPRZRO /N-PRINT A 0 /JUST AS CHEAP TO DUPLICATE CODE JMS I (DBLDIG /Y- PRINT THEM DRDCPT, AC7776 JMS I (DIGIT /PRINT A DEC PT TAD SCALE SMA CLA /NEED LEADING ZEROS? JMP DNOLZR /NO TAD SCALE DCA T DLZERO, STA CLL TAD OD /DECREASE D VALUE SNL JMP DNOMAC /NO MORE FIELD WIDTH AVAILABLE DCA OD JMS I (DIGIT /PRINT A 0 ISZ T /CONT UNTIL COUNT OR WIDTH RUNS OUT JMP DLZERO DNOLZR, TAD OD SZA JMS I (DBLDIG /PRINT REMAINING DIGITS DNOMAC, CLA TAD EFLG SZA /IF EFLG IS NOT ZERO IT IS -1, JMS I (EXPFLD /SO WE WILL PRINT A D INSTEAD OF AN E JMP I (DNXT DASTRS, CLA TAD W JMS I (ASTRSK JMP I (DNXT PAGE DBLDIG, 0 /OUTPUT DIGITS CIA DCA T DBDLOP, DCA ACH /0 THE HI WORD FOR OVERFLO TAD AC1 DCA AC2 /START TO COPY THE FAC.THIS IS TAD ACL /EAC3 SHIFTED DOWN 1 WORD DCA OPL TAD EAC1 DCA L1 /ACL TAD EAC2 DCA DACSR /EAC1 TAD EAC3 DCA DSCLDN /EAC2 JMS DAL1 JMS DAL1 CLL TAD AC2 TAD AC1 DCA AC1 /THIS IS FAC*5 COMING UP RAL TAD DSCLDN TAD EAC3 DCA EAC3 RAL TAD DACSR TAD EAC2 DCA EAC2 RAL TAD L1 TAD EAC1 DCA EAC1 RAL TAD OPL TAD ACL DCA ACL RAL TAD ACH DCA ACH JMS DAL1 TAD ACH JMS I (DIGIT ISZ T JMP DBDLOP JMP I DBLDIG DSCLDN, 0 /USED AS A TEMP TOO TAD ACX SPA SNA CLA JMP I DSCLDN /DONE IF FAC<1. AC4000 JMS I (FPGO FDIV10 ISZ SCALE 0 /A FREE LOCN! JMP DSCLDN+1 DPRZRO, CLA JMS I (DIGIT JMP I (DRDCPT /6 WORD FAC LEFT SHIFT DAL1, 0 TAD AC1 /GET OVERFLO BIT CLL RAL /SHIFT LEFT DCA AC1 TAD EAC3 /CONTINUE WORKING WAY UP THRU MANTISSA RAL DCA EAC3 TAD EAC2 RAL DCA EAC2 TAD EAC1 RAL DCA EAC1 TAD ACL RAL DCA ACL TAD ACH RAL DCA ACH JMP I DAL1 DFLTM2, FLDA+LONG DFTMP2 FEXIT DFTMP2, 0;0;0;0;0;0 /6 WORD FAC RIGHT SHIFT. ENTER WITH COUNT-1 IN AC / DACSR, 0 /USED AS A TEMP BY DBDLOP DCA AC0 /STORE COUNT DLOP1, TAD ACH CLL SPA /PROPOGATE SIGN CML RAR DCA ACH /SHIFT RIGHT 1,PROPOGATE SIGN TAD ACL /DO SHIFTING FOR EACH WORD OF MANTISSA RAR DCA ACL TAD EAC1 RAR DCA EAC1 TAD EAC2 RAR DCA EAC2 TAD EAC3 RAR DCA EAC3 ISZ ACX /INCREMENT EXPONENT NOP ISZ AC0 /DONE? JMP DLOP1 /NOPE RAR /YUP DCA AC1 /SAVE 1 BIT OF OVERFLOW JMP I DACSR L1, 0 PAGE /THIS IS DOUBLE PRECISION INPUT (WITH FPP ONLY) /IT IS A LOT LIKE SINGLE PRECISION INPUT, BUT USES /ITS OWN FPP ROUTINES. DPIN, STA DCA DDPSW /INITIALIZE DEC. PT. SWITCH STA DCA DINESW /AND EXPONENT SWITCH TAD W CMA DCA FMTNUM /CHAR COUNT DINESM, DCA ACX /CLEAR FLOATING AC DCA ACH DCA ACL DCA EAC1 DCA EAC2 DCA EAC3 STA DINMIN, DCA DFNEG DINLOP, ISZ FMTNUM JMP DINGCH /LOOP UNTIL WIDTH EXHAUSTED DINENM, ISZ I (DFNEG /IS SIGN NEGATIVE? JMS I (DFNEG /YES-NEGATE ISZ DINESW /SEEN A D YET? JMP DFIXUP /YES-THIS IS EXP,NOT NUMBER TAD PFACTX /NO D- SCALE WITH P FACTOR DSCLIN, TAD OD /GET SCALING FACTOR STL SNA JMP I (DNXT /NO SCALING NEEDED SMA CIA CLL /AC CONTAINS MAGNITUDE,LINK CONTAINS SIGN DCA OD RTL RAL TAD (FDIV10 DCA DIGFOP AC4000 JMS I (FPGO /MULT OR DIVIDE BY 10 DIGFOP, 0 ISZ OD JMP DIGFOP-2 /MULT OR DIV CORRECT NUMBER OF TIMES JMP I (DNXT /GET MORE DIND, ISZ DINESW /IS THERE A 2ND D? JMP DINER /Y-A NO-NO ISZ DDPSW /FORCE DEC. PT. SWITCH ON TAD OD /USE SCALE FACTOR IF SEEN DEC. PT DCA SCALE /SAVE SCALE FACTOR ISZ DFNEG JMS DFNEG /GET SIGN OF NUMBER AC4000 JMS I (FPGO /SAVE IT TEMPORARILY DFSTM2 JMP DINESM /GO COLLECT EXP DFIXUP, JMS I (FFIX /IS THIS OK FOR DBL PREC??? TAD ACI CIA TAD SCALE /ADD EXP TO DEC PT SCALE FACTOR DCA OD AC4000 JMS I (FPGO DFLTM2 /GET NUMBER BACK IN FAC JMP DSCLIN DINGCH, JMS I (FMTIN /GET A CHAR JMS I (CHTYPE /CLASSIFY IT 1234; DDIGIT -56; DIDCPT /. -53; DINLOP /+ -55; DINMIN /- -4; DIND /D -5; DIND /E - BE FORGIVING -40; DINLOP /BLANK -54; DINENM /, 0 DINER, JMP I (INER DIDCPT, DCA OD /ZERO COUNT OF DIGITS AFTER DEC PT ISZ DDPSW /TEST + SET DEC PT SWITCH JMP DINER /2 DEC. PT. IS NO GOOD JMP DINLOP DDIGIT, TAD CHCH DCA I (DGT+1 /SAVE DIGIT AC4000 JMS I (FPGO ACMDGT TAD DDPSW SNA CLA ISZ OD /BUMP DIGIT IF DEC PT SEEN JMP DINLOP DDPSW, 0 /6 WORD FLOATING NEGATE DFNEG, 0 TAD EAC3 CLL CMA IAC /NEGATE LOW ORDER WORD OF MANTISSA DCA EAC3 /STORE IT BACK CML RAL /ADJUST OVERFLOW+CARRY TAD EAC2 /CONTINUE WITH REST OF MANTISSA CMA IAC DCA EAC2 CML RAL TAD EAC1 CMA IAC DCA EAC1 CML RAL TAD ACL CMA IAC DCA ACL CML RAL TAD ACH CLL CMA IAC DCA ACH JMP I DFNEG DINESW, 0 PAGE *FPPKG /EAE PKG LOADS OVER REGULAR PKG LPBUF2, ZBLOCK 16 LPBUF5 AL1BMP, 0 /*K* MUST BE AT SAME LOC AS NON-EAE VERSION STA TAD ACX DCA ACX JMS I (AL1 JMP I AL1BMP /EAE FLOATING POINT INTERPRETER /FOR PDP8/E WITH KE8-E EAE /W.J. CLOGHER, MODIFIED BY R.LARY FOR FORTRAN /FLOATING MULTIPLY--DOES 4 SINGLE MULTIPLIES WITH EAE /THIS USES THE FACT THAT IF AC IS NON-ZERO WHEN YOU DO /A MUY INSTR, THE AC IS ADDED TO RESULT OF THE MULTIPLY. /(IN THE LOW ORDER, NATCHERLY) DDMPY, JMS I (DARGET SKP FFMPY, JMS I (ARGET JMS EMDSET /SET UP FOR MULT CLA MUY /MULTIPLY-LOW ORDER FAC STILL IN MQ OPH /THIS IS PRODUCT OF LOW ORDERS MQL /ZAP LOW ORDER RESULT-INSIGNIFICANT TAD ACH /GET LOW ORDER(!) OF FAC SWP MUY /TO MQ-HIGH ORD. RESLT OF LAST MPY OPL /TO AC-WILL BE ADDED TO RESLT-THIS DST /IS PRODUCT-LOW ORD FAC,HI ORD OP AC0 /STORE RESULT CLA TAD ACL /HIGH ORDER FAC TO MQ MQL TAD OPX /GET OPERAND EXPONENT TAD ACX /ADD FAC EXPONENT-GET SUM OF EXPS. DCA ACX /STORE RESULT MUY /MUL. HIGH ORDER FAC BY LOW ORD OP. OPH /HIGH ORDER FAC WAS IN MQ DAD /ADD IN RESULT OF SECOND MULTIPLY AC0 DCA ACH /STORE HIGH ORDER RESULT TAD ACL /GET HIGH ORDER FAC SWP /SEND IT TO MQ AND LOW ORD. RESULT DCA AC0 /OF ADD TO AC-STORE IT RAL /ROTATE CARRY TO AC DCA ACL /STORE AWAY MUY /NOW DO PRODUCT OF HIGH ORDERS OPL /FAC HIGH IN MQ, OP HIGH IN OPL DAD /ADD IN THE ACCUMULATED # ACH /MULTIPLIES DONE - MASSAGE RESULT SNA /ZERO? JMP RTZRO /YES-GO ZERO EXPONENT NMI /NO-NORMALIZE (1 SHIFT AT MOST!) DCA ACH /STORE HIGH ORDER RESULT CLA SCA /GET STEP CNTR-DID WE NEED A SHIFT? SNA CLA JMP SNCK /NO-JUST CHECK SIGN TAD AC0 /YES - WATCH OUT FOR LOST ACCURACY! RAL DCA AC0 SZL /IF HIGH ORDER BIT OF OVERFLOW WORD WAS ON, DPIC /TURN MQ11 ON (IT WAS 0 FROM THE NMI) CLA CMA /MUST DECREASE EXP. BY 1 TAD ACX RTZRO, DCA ACX /STORE BACK SNCK, TAD AC0 SPA CLA /IS HIGH ORDER OF OVERFLO WD. 1? DPIC /YES-ADD 1 TO LOW ORDER-STILL IN MQ TAD ACH SMA JMP EMDONE /WE DIDN'T OVERROUND - GOODY LSR 1 /BUT OVERROUNDING IS EASILY CORRECTED! ISZ ACX / (OVERCORRECTED??) NOP /COMMON CLEANUP ROUTINE FOR MULTIPLY AND DIVIDE EMDONE, ISZ EMSIGN /SHOULD SIGN BE MINUS? SKP /NO DCM /YES-DO IT SNA DCA ACX /FORCE EXPONENT 0 IF MANTISSA = 0 DCA ACH /STORE IT BACK SWP DCA ACL TAD DFLG SMA SZA CLA TAD ACX /IF D.P. INTEGER MODE AND ACX LESS THAN 0, SNA /GO TO UNNORMALIZE RESULT JMP I FPNXT /OTHERWISE BUMP RETN. AND RETN. CMA JMS I (ACSR JMP I FPNXT EMSIGN, 0 /ROUTINE TO SET UP FOR MULTIPLY AND DIVIDE EMDSET, 0 CLA CLL CMA RAL /MAKE A MINUS TWO DCA EMSIGN /AND STORE IN EMSIGN. DLD /GET HIGH ORDER MANTISSA OF OP. OPH SWP SMA /NEGATIVE? JMP .+3 /NO DCM /YES-NEGATE IT ISZ EMSIGN /BUMP SIGN COUNTER SHL /SHIFT OPRND LEFT 1 TO AVOID OVRFLO 1 DST /STORE BACK-OPH CONTAINS LOW ORDER OPH / OPL CONTAINS HIGH ORDER DLD ACH SWP SMA /FAC LESS THAN 0? JMP .+4 /NO DCM ISZ EMSIGN NOP /EMSIGN MAY BUMP TO 0 DST /STORE BACK - ACH CONTAINS LOW ORDER ACH / ACL CONTAINS HIGH ORDER JMP I EMDSET PAGE /FLOATING DIVIDE-BY-0 ROUTINE - MUST BE AT 0 IN PAGE DBAD, ISZ FATAL /DIVIDE BY 0 NON-FATAL JMS I ERR TAD DBAD DCA ACX /SET AC TO A LARGE POSITIVE NUMBER AC2000 JMP I (EMDONE /FLOATING DIVIDE DDDIV, JMS I (DARGET SKP FFDIV, JMS I (ARGET JMS I (EMDSET /GET ARG. AND SET UP SIGNS DVI /DIVIDE-ACH AND ACL IN AC,MQ OPL /THIS IS HI (!) ORDER DIVISOR DST /QUOT TO AC0,REM TO AC1 AC0 SZL CLA /DIVIDE ERROR? JMP DBAD /YES - HANDLE IT TAD OPX /DO EXPONENT CALCULATION CMA IAC /EXP. OF FAC - EXP. OF OP TAD ACX DCA ACX DPSZ /IS QUOT = 0? SKP /NO-GO ON DCA ACX /YES-ZERO EXPONENT DVLP, MUY /NO-THIS IS Q*OPL*2**-12 OPH DCM /NEGATE IT TAD AC1 /SEE IF GREATER THAN REMAINDER SNL JMP EDVOPS /YES-ADJUST FIRST DIVIDE DVI /NO-DO Q*OPL*2**-12/OPH OPL SZL CLA /DIV ERROR? JMP DBAD /YES EDVLP1, TAD AC0 /NO-GET QUOT OF FIRST DIV. SMA /NEGATIVE? JMP I (EMDONE /NO-REMEMBER-QUOT OF 2ND DIV. IN MQ LSR /YES-MUST SHIFT IT RIGHT 1 1 ISZ ACX /ADJUST EXPONENT NOP SGT /TEST SHIFTED OUT BIT JMP I (EMDONE /ZERO - NO ROUND DPIC /BUMP AC FRACTION JMP EDVLP1+1 /MAYBE SHIFT AGAIN /CONTINUATION OF DIVIDE ROUTINE /WE ARE ADJUSTING THE RESULT OF THE /FIRST DIVIDE. EDVOPS, CMA IAC DCA AC1 /ADJUST REMAINDER TAD OPL /WATCH FOR OVERFLOW CLL CMA IAC TAD AC1 SNL JMP EDVOP1 /DON'T ADJUST QUOT. DCA AC1 CMA TAD AC0 DCA AC0 /REDUCE QUOT BY 1 EDVOP1, CLA CLL TAD AC1 /GET REMAINDER SNA /ZERO? CAM /YES-ZERO EVERYTHING DVI /NO OPL SZL CLA /DIV. OVERFLOW? JMP DBAD /YES DCM /NO-ADJUST HI QUOT (MAYBE) JMP EDVLP1 /GO BACK /ROUTINE TO NORMALIZE THE FAC EFFNOR, 0 CDF 0 DLD /PICK UP MANTISSA ACH SWP /PUT IT IN CORRECT ORDER NMI /NORMALIZE IT SNA /IS THE # ZERO? DCA ACX /YES-INSURE ZERO EXPONENT DCA ACH /STORE HIGH ORDER BACK SWP /STORE LOW ORDER BACK DCA ACL CLA SCA /STEP COUNTER TO AC CMA IAC /NEGATE IT TAD ACX /AND ADJUST EXPONENT DCA ACX JMP I EFFNOR /RETURN ADDRS, OPH ACH LPBUF5, ZBLOCK 50 LPBUF7 PAGE /"OPNEG" MUST BE AT 0 IN PAGE OPNEG, 0 /ROUTINE TO NEGATE OPERAND DLD OPH SWP DCM DCA OPH MQA DCA OPL JMP I OPNEG /FLOATING ADD AND SUBTRACT-IN ORDER NOT TO LOSE BITS, /WE DO NOT SHIFT BOTH NUMBERS RIGHT 1 BIT BEFORE ADD- /ONLY SHIFTS DONE ARE TO ALIGN EXPONENTS. FFSUB, JMS I (ARGET JMS OPNEG /NEGATE OPERAND SKP FFADD, JMS I (ARGET /PICK UP ARGUMENTS TAD OPH SNA CLA /IF OPERAND IS 0, JMP I FPNXT /RESULT IS ALREADY IN AC. TAD ACH SZA CLA /CHECK FOR AC=0 JMP BOTHN0 /NO DLD OPH /YES - ANSWER IS OPERAND SWP DCA ACH JMP FADND /JUMP INTO CLEANUP CODE BOTHN0, TAD OPX /PICK UP EXPONENT OF OPERAND MQL /SEND IT TO MQ FOR SUBTRACT TAD ACX /GET EXPONENT OF FAC SAM /SUBTRACT-RESULT IN AC SPA /NEGATIVE RESULT? CMA IAC /YES-MAKE IT POSITIVE DCA CNT /STORE IT AS A SHIFT COUNT TAD CNT /COUNT TOO BIG?(CAN'T BE ALIGNED) TAD (-27 SPA SNA CLA CMA /NO-OK DCA AC0 /YES-MAKE IT A LOAD OF LARGEST # DLD /GET ADDRESSES TO SEE WHO'S SHIFTED ADDRS SGT /WHICH EXP GREATER(GT FLG SET /BY SUBTR. OF EXPS.) SWP /OPERAND'S-SHIFT THE FAC DCA SHFBG /STORE ADDRESS OF WHO GETS SHIFTED SWP /GET ADDRESS OF OTHER (0 TO MQ) DCA DADR /THIS ONE JUST GETS ADDED TAD ACX /GET FAC EXP.INTO AC SGT /WHICH EXPONENT WAS GREATER? DCA OPX /FAC'S-STORE FINAL EXP. IN OPX DLD /GET THE LARGER # TO AC,MQ DADR, 0 SWP /PUT IN THE RIGHT ORDER ISZ AC0 /COULD EXPONENTS BE ALIGNED? JMP LOD /NO-JUST LEAVE LARGER IN AC,MQ DST /YES-STORE THIS TEMPORARILY AC0 /(IF ONLY FAC STORAGE WAS REVERSED) DLD /GET THE SMALLER # SHFBG, 0 SWP /PUT IT IN RIGHT ORDER ASR /DO THE ALIGNMENT SHIFT CNT, 0 DAD /ADD THE LARGER # AC0 DST /STORE RESULT AC0 SZL /OVERFLOW?(L NOT = SIGN BIT) CMA /NOTE-WE DIDN'T SHIFT BOTH RIGHT 1 SMA CLA JMP NOOV /NOPE CLA CLL CML RAR /MAYBE-SEE IF 2 #S HAD SAME SIGN AND ACH TAD OPH SMA CLA /SIGNS ALIKE? JMP OVRFLO /YES-OVERFLOW NOOV, AC4000 /NO-GET HIGH ORDER RESULT BACK TAD AC1 /CHECK FOR 4000 0000 MANTISSA DPSZ /IT WILL BE SET TO 0 BY NMI JMP .+3 /OK-RESTORE NUMBER AC2000 /GOT A 4000 0000-SET TO 6000 0000 JMP DOIT /AND INCREMENT EXPONENT TAD (4000 /RESTORE NUMBER LOD, NMI /NORMALIZE (LOW ORDER STILL IN MQ) DCA ACH /STORE FINAL RESULT SCA /GET SHIFT COUNTER(# OF NMI SHIFTS) CMA /NEGATE IT ADON, IAC FADND, TAD OPX /AND ADJUST FINAL EXPONENT DCA ACX SWP /GET AND STORE LOW ORDER DCA ACL JMP I FPNXT /RETURN OVRFLO, TAD AC1 /OVERFLOW-GET HIGH ORDER RESLT BACK ASR /SHIFT IT RIGHT 1 1 DOIT, TAD (4000 /REVERSE SIGN BIT DCA ACH /AND STORE JMP ADON /DONE LPBUF7, ZBLOCK 34 LPBUFE PAGE *7400 /RTS CLEANUP ROUTINE - SAVED WITH PG 17600 CLNUP, DCA I CFPTR /ENTER HERE ON ^C OR ERROR TDEXFG, JMP CTMP /ENTER HERE ON "STOP" OR "CALL EXIT" TAD TDEXFG /TDEXFG CONTAINS TOP MEM FIELD CLL RTL /IF WE ARE ON AN IN-CORE TD8E CONFIGURATION RAL TAD (CDF DCA TDGTDF TDGTDF, HLT TAD I TDPTR /MOVE THE TD8E ROUTINE CDF 20 DCA I TDPTR /DOWN TO FIELD 2 ISZ TDPTR JMP TDGTDF CDF 0 TAD (6220 // CIF 20-2 FPAT patch so TDSET works. JMS TDSET /RESET THE F0 CDF'S TO POINT TO FIELD 2 CTMP, CDF 0 TAD (6213 DCA I (7605 TAD (5267 DCA I (7606 /RESTORE PAGE 7600 AC7776 AND I (OSJSWD IAC DCA I (OSJSWD /MARK 10000-11777 AS USELESS AND I 0 AND I 0 /DELAY A WHILE IN CASE ITS AN LA30 AND I 0 AND I 0 AND I 0 TSF SKP JMP WTOVR ISZ ZERO TAD I (TOCHR /IF TTY IS NOT IDLE, SZA CLA /DELAY LONG ENOUGH TO AVOID GARBLE. JMP CTMP WTOVR, TAD I (7777 CLL RAL SMA CLA /IS BATCH EXECUTING? JMP NOBTCH /NO - RELAX TAD (212 /TO PREVENT OVERPRINTING, POP UP A LINE TLS /ON THE TELETYPE LLS /AND ON THE LINE PRINTER TSF JMP .-1 /WAIT FOR THE SLOWER ONE (I HOPE) CLA NOBTCH, CDF 10 CLOSLP, TAD I CFPTR SNA /ANY MORE ENTRIES IN THE TENTATIVE JMP GOAWAY /FILE TABLE? DCA CTMP /YES - SAVE FILE LENGTH PTR CDF 0 TAD I CTMP CDF 10 SNA JMP IGNORC /UNWRITTEN FILES AREN'T CLOSED DCA FLEN JMS I USR 10 /BRING USR IN TAD (200 DCA USR /KEEP IT IN TAD (HPLACE+1 DCA CHAND JMS I USR 13 /RESET DEVICE HANDLER TABLE 0 /BUT NOT TENTATIVE FILES! ISZ CFPTR TAD I CFPTR /GET UNIT NUMBER JMS I USR 1 CHAND, 0 /FETCH HANDLER JMP CLSERR TAD I CFPTR /GET UNIT AGAIN ISZ CFPTR /BUMP PTR TO NAME JMS I USR C4, 4 CFPTR, 7600 /CLOSE THE FILE FLEN, 0 JMP CLSERR SKP IGNORC, AC0002 TAD CFPTR TAD C4 DCA CFPTR JMP CLOSLP /LOOK FOR MORE // // FPAT patch // //TDSET, 0 // DCA I (7721 // TAD I (7721 // DCA I (7727 // TAD I (7721 // IAC // DCA I (7642 // JMP I TDSET // TEM=CHAND // L7=CLSERR+1 // TDSET, 0 //SUBROUTINE TO RELOCATE ALL CIF/CDF'S DCA TEM //TO FIELDS 1-7 IN SYSTEM HANDLER 1ST TAD L7635 //PAGE 07635 AND ABOVE. DCA P1 // JMP LOOP // L7635, 7635 // L1570, 1570 // L7710, 7710 // // GOAWAY, CDF CIF 0 JMP I (7605 /RETURN TO OS/8 AQAP CLSERR, JMS I USR /"IMPOSSIBLE" ERROR - GIVE "USER ERROR 2" 7 2 /IT'S BETTER THAN HALTING TDPTR, 7600 ZERO, 0 USR, 7700 // // FPAT patch // // *7546 // LOOP, TAD I P1 // TAD L1570 // CLL // TAD L7710 // SZL CLA // JMP NOFIX //NOT A CIF/CDF TO FIELD>0 TAD I P1 //OK: RELOCATE FIELD AND L7 // TAD TEM //EITHER UP INITIALLY, OR BACK //DOWN FINALLY DCA I P1 // NOFIX, ISZ P1 //ON TO NEXT LOCATION JMP LOOP // JMP I TDSET //DONE P1, 0 //POINTER TO SYS HANDLER // // *7576 // 6220 // $$$-$$$-$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 | /FORTRAN IV RUNTIME SYSTEM, V5A / / / / / / / // / / / / /COPYRIGHT (C) 1974,1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL /EQUIPMRNT COROPATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. / / / / / / /FORTRAN 4 RUNTIME SYSTEM - R.LARY /AND NOW WITH DOUBLE PRECISION! - MKH /RTS-8 SUPPORT ADDED 5/20/74 - RL /LAST EDITED 5/19/74 XVERSN=5 /UPDATE WITH EVERY RELEASE! XPATCH="A /PATCH LEVEL A /NOTES TO MAINTAINERS: /THIS PROGRAM IS DESIGNED TO SUPPORT MANY DIFFERENT HARDWARE /CONFIGURATIONS IN A MINIMAL AMOUNT OF SPACE. IT ACHIEVES THIS GOAL /BY "TAILORING" ITSELF AT INITIALIZATION TIME /BASED ON A SURVEY OF ITS HARDWARE/SOFTWARE ENVIRONMENT. THIS MAKES /THIS PROGRAM DIFFICULT TO MODIFY UNLESS THE MODIFYING PROGRAMMER /KNOWS WHAT IS GOING ON. IT IS THEREFORE SUGGESTED THAT YOU READ THIS /LISTING THOROUGHLY AND UNDERSTAND THE MAJOR ROUTINES BEFORE /MAKING EVEN "TRIVIAL" CHANGES. /ALL SYMBOLS BEGINNING WITH THE LETTER "Q" ARE ENTRIES IN THE /HEADER BLOCK OF THE LOADER-IMAGE (.LD) FILE. /ALL SYMBOLS BEGINNING WITH THE LETTER "Y" DENOTE THE BEGINNING OF /A BLOCK OF CODE WHICH WILL BE REPLACED BY DIFFERENT CODE IF FRTS /IS RUNNING IN THE BACKGROUND UNDER RTS-8. THE REPLACEMENT CODE /CAN BE FOUND IN THE TABLE "BKRLST". /ALL SYMBOLS BEGINNING WITH THE LETTER "V" ARE DEFINED IN THE LOADER /SYMBOL TABLE AND CANNOT BE MOVED WITHOUT CHANGING THE LOADER. ONLY /A VERY FEW OF THESE SYMBOLS OCCUR IN PLACES OTHER THAN /PAGE 200 OR THE FIRST LOCATION OF OTHER PAGES. /CODE WHICH CONTAINS THE CHARACTER SEQUENCE "*K*" IN THE COMMENT FIELD /IS PARTICULARLY SUBTLE/OBSCURE (THE "K" IS FOR "KLUDGE"). THE REST OF THE /COMMENT SHOULD INDICATE WHAT IS GOING ON. / / / FIXES FOR V4 J.K. 1975 / / .SCALE FACTOR PRINTED BY P FORMAT OPERATOR / .FRTS /P / .RK8E HANDLER TO RUN WITH INTERRUPTS ON / .SLASH AT END OF FORMAT STATEMENT / / / CHANGES FOR OS/78 AND OS/8 V3D BY P.T. / .CHANGED THE VERSION NUMBER TO 5A / .FIXED THE FIELD OVERFLOW PROBLEM / .FIXED THE "K=K+1" PROBLEM /DEFINITIONS: AC7775= STA CLL RTL AC7776= STA CLL RAL AC4000= CLA STL RAR AC3777= STA CLL RAR AC2000= CLA STL RTR AC0002= CLA STL RTL /DEFINITIONS OF KE-8/E INSTRUCTIONS MQL= 7421 MQA= 7501 CAM= CLA MQL SWP= MQA MQL SWAB= 7431 SCA= 7441 MUY= 7405 DVI= 7407 NMI= 7411 SHL= 7413 ASR= 7415 LSR= 7417 ACS= 7403 SAM= 7457 DAD= 7443 DLD= 7663 DST= 7445 DPIC= 7573 DCM= 7575 DPSZ= 7451 SGT= 6006 /DEFINITIONS OF FPP IOT'S FPINT= 6551 FPICL= 6552 FPCOM= 6553 FPHLT= 6554 FPST= 6555 FPRST= 6556 /FPP OPCODES: FLDA= 0000 FADD= 1000 FSUB= 2000 FDIV= 3000 FMUL= 4000 FADDM= 5000 FSTA= 6000 FMULM= 7000 LONG= 400 /TWO-WORD ADDRESSING BASE= 200 /BASEPAGE ADDRESSING IND= 600 /INDIRECT ADDRESSING FEXIT= 0000 FNORM= 0004 STARTF= 0005 STARTD= 0006 JAC= 0007 XTA= 0030 STARTE= 0050 LDX= 0100 JA= 1030 JNE= 1040 TRAP3= 3000 /OS8 EQUIVALENCES: OS8SWS= 7643 OSJSWD= 7746 OS8DVT= 7647 OS8DCB= 7760 OS8DAT= 7666 /VARIOUS OTHER IOT'S: LSF= 6661 LCF= 6662 LSE= 6663 LIE= 6665 LLS= 6666 LIF= 6667 /PAGE ZERO FOR FORTRAN IV RTS *0 /INTERRUPT STUFF 0 JMP I .+1 INTRPT LPGET, LPBUFR /LINE PRINTER RING BUFFER FETCH POINTER TOCHR, 0 /TELETYPE STATUS WORD KBDCHR, 0 /KEYBOARD INPUT CHARACTER POCHR, 0 /P.T. PUNCH COMPLETION FLAG RDRCHR, 0 /P.T. READER STATUS FMTPXR, 0 /XR USED TO INDEX FORMAT PARENTHESIS ARRAY INXR, INBUFR-1 /XR USED TO GET CHARS FROM INPUT LINE XR, 0 XR1, 0 *16 VEOFSW, 0 /USED BY "EOFCHK" TO STORE VARIABLE ADDRESS 0 /*K* MUST BE IN AUTO - XR T, 0 /TEMPORARY DFLG, 0 /0 = F.P., 1 = D.P. INST, 0 /CURRENT INSTRUCTION WORD /IOH PAGE ZERO LOCATIONS RWFLAG, 0 /READ/WRITE FLAG FMTTYP, 0 /TYPE OF CONVERSION BEING DONE EOLSW, 0 /EOL SW ON INPUT - CHAR POS ON OUTPUT N, 0 /REPEAT FACTOR W, 0 /FIELD WIDTH D, 0 /NUMBER OF PLACES AFTER DECIMAL POINT DATCDF, 0 /SUBROUTINE TO CHANGE DATA FIELD DATAF, 0 /CONTAINS VARIOUS CDF'S JMP I DATCDF /RETURN ERR, ERROR /POINTER TO ERROR ROUTINE FATAL, 0 /FATAL ERROR FLAG - 0=FATAL MCDF, MAKCDF /FPP PARAMETER TABLE LOCATIONS: APT, 0 /VARIOUS FIELD BITS FOR FPP PC, DPTEST /FPP PROGRAM COUNTER XRBASE, 0 /FPP INDEX REGISTER ARRAY ADDRESS BASADR, 0 /FPP BASE PAGE ADDRESS ADR, 0 /ADDRESS TEMPORARY ACX, 0 ACH, 0 /*** FLOATING ACCUMULATOR *** ACL, 0 EAC1, 0 EAC2, 0 /** FOR EXTENDED PRECISION OPTION ** EAC3, 0 /FLOATING POINT PACKAGE LOCATIONS AC0, 0 AC1, 0 /FLOATING AC OVERFLOW WORD AC2, 0 /OPERAND OVFLOW WORD OPX, 0 OPH, 0 /*** FLOATING OPERAND REGISTER *** OPL, 0 /RTS I/O CONVERSION SYSTEM LOCATIONS FMTBYT, 0 /FORMAT BYTE POINTER IFLG, 0 /I FOEMAT FLAG GFLG, 0 /G FORMAT FLAG EFLG, 0 /E FORMAT FLAG - SOMETIMES ON FOR G FMT OD, 0 SCALE, 0 PFACT, 0 /P-SCALE FACTOR PFACTX, 0 /TEMP FOR PFACT ACI, 0 /INTEGERIZED FAC FROM "FFIX" SUBR CHCH, 0 FMTNUM, 0 /CONTAINS ACCUMULATED NUMERIC VALUE CTCINH, 0 /^C INHIBIT FLAG LOGUNT, 0 /DSRN POINTER - ONLY USED FROM ONE PAGE! PTTY, TTY /POINTER TO TTY HANDLER - USED BY LDDSRN 0 / SO FORMS CONTROL WILL WORK ON UNIT 0 FPNXT, ICYCLE /USED AS INTERPRETER ADDRESS IF NO FPP /DSRN IMAGE HAND, 0 /HANDLER ENTRY POINT HCODEW, 0 /HANDLER LOAD ADDR & FIELD + IOFFLG + FORMS CTL FLG BADFLD, 0 /BUFFER ADDRESS AND FIELD CHRPTR, 0 /ACTUALLY A WORD POINTER CHRCTR, 0 /COUNTER - RANGES FROM -3 TO -1 STBLK, 0 /STARTING BLOCK OF FILE RELBLK, 0 /CURRENT RELATIVE BLOCK NUMBER TOTBLK, 0 /LENGTH OF FILE FFLAGS, 0 /FILE FLAGS: /BIT 0 - "HAS BEEN WRITTEN" FLAG /BITS 1-2 - FORMATTED/UNFORMATTED FLAGS /BIT 11 - "END-FILED" FLAG BUFFLD, 0 /ROUTINE TO SET DF TO BUFFER FIELD BUFCDF, HLT JMP I BUFFLD FADD1, FADD+LONG /FPP CODE TO ADD 1.0 TO FAC ONE /AND FALL INTO STORE CODE FGPBF, 0 /THESE THREE WORDS ARE USED BIOPTR, 0 /TO FETCH AND STORE FLOATING POINT NUMBERS FEXIT /FROM RANDOM MEMORY PAGE /STARTUP CODE FTEMP2, ISZ .+3 /ALSO USED AS I/O F.P. TEMPORARY CDF CIF 10 JMP I .+1 VDATE, RTSLDR /USED TO STORE OS/8 DATE /RTS ENTRY POINTS - "VERSION INDEPENDENT" VUERR, JMP I (USRERR /USER ERROR /** LOADER MUST DEFINE #ARGER AS VARGER-1 ** VARGER, JMS I ERR /LIBRARY ARGUMENT ERROR VRENDO, ISZ RWFLAG /END OF I/O LIST VRFSV, JMP I GETLMN /I/O LIST ARG ENTRY - COROUTINE WITH GETLMN VBAK, JMP I (BKSPC /"BACKSPACE" ROUTINE VENDF, JMP I (ENDFL /"END FILE" ROUTINE VREW, JMP I (RWIND /"REWIND" ROUTINE VDEF, JMP I (DFINE /"DEFINE FILE" ROUTINE VWUO, AC4000 /UNFORMATTED WRITE VRUO, JMP I (RWUNF /UNFORMATTED READ VWDAO, AC4000 /DIRECT ACCESS WRITE VRDAO, JMP I (RWDACC /DIRECT ACCESS READ VWRITO, AC4000 /FORMATTED (ASCII) WRITE VREADO, JMP I (RWASCI /FORMATTED (ASCII) READ VSWAP, JMP I (SWAP /OVERLAY PROCESSOR VEXIT, TRAP3; CALXIT /"STOP" ROUTINE - ENTERED IN FPP MODE V8OR12, 0;0 /0;1 IF CPU IS A PDP-12 VBACKG, JMP I (NULLJB /BACKGROUND JOB DISPATCHER 0 CDF CIF 0 /USED BY ROUTINE "ONQB" IN LIBRARY JMS I .-2 JMP VBACKG /IOH GET VARIABLE ROUTINE. /THIS ROUTINE MAKES THE FORMATTED I/O PROCESSOR AND THE USER'S /PROGRAM CO-ROUTINES (DEF(COROUTINE)= 2 ROUTINES EACH THINKING THE OTHER / IS A SUBROUTINE). ON ENTRY FAC=INPUT NUMBER /IF I/O IS A READ, ON RETURN FAC=OUTPUT NUMBER IF I/O IS A WRITE. GETLMN, 0 VRETRN, JMP I [RETURN /SHORT ROUTINE FOR ALL THOSE COMMENTS, NO? /INTERRUPT DRIVEN I/O HANDLERS LPT, 0 /RING-BUFFERED - LP08 OR LS8E AND [377 /JUST IN CASE LPTSNA, SNA JMP I (IOERR /CANNOT BE USED FOR INPUT YLPT, IOF DCA I LPPUT TAD LPGET CIA TAD LPPUT SZA CLA /IS LPT QUIET? JMP .+3 /NO TAD I LPPUT LLS /YES - START 'ER UP CLA IAC LIE /ENABLE LPT INTERRUPTS TAD LPPUT /1 IN AC, REMEMBER? DCA LPPUT TAD I LPPUT SPA JMP .-3 /NEGATIVE NUMBERS ARE BUFFER LINKS SZA CLA /ANY ROOM LEFT IN BUFFER? JMS I (HANG LPUHNG /WAIT FOR LINE PRINTER ION /TURN INTERRUPTS BACK ON JMP I LPT /RETURN LPPUT, LPBUFR PTP, 0 /PAPER TAPE PUNCH HANDLER YPTP, SNA JMP I (IOERR /INPUT IS ERROR DCA LPT /SAVE CHAR IOF TAD POCHR /IF PUNCH IS NOT IDLE, SZA CLA /WE DISMISS JOB JMS I (HANG PPUHNG /WAIT FOR PUNCH INTERRUPT TAD LPT PLS /OUTPUT CHAR DCA POCHR /SET FLAG NON-ZERO ION JMP I PTP /*K* THE FOLLOWING ADDRESSES GET FALLEN INTO & MUST BE SMALL IFNZRO PPUHNG&7000 <__ERROR__> IFNZRO TTUHNG&7000 <__ERROR__> IFNZRO KBUHNG&7000 <__ERROR__> IFNZRO RDUHNG&7000 <__ERROR__> IFNZRO LPUHNG&7000 <__ERROR__> /INTERRUPT-DRIVEN PTR AND TELETYPE HANDLER PTR, 0 /CRUDE READER HANDLER YPTR, SZA CLA JMP I (IOERR /OUTPUT ILLEGAL TO PTR IOF RFC /START READER JMS I (HANG RDUHNG /HANG UNTIL COMPLETE TAD RDRCHR /GET CHARACTER ION JMP I PTR /RETURN TTY, 0 /BUFFERS 2 CHARS ON OUTPUT, 1 ON INPUT YTTY, IOF /DELICATE CODE AHEAD SNA /INPUT OR OUTPUT? JMP KBD /INPUT DCA LPT /OUTPUT - SAVE CHAR TAD TOCHR /GET TTY STATUS SMA SZA CLA /G.T. 0 MEANS A CHAR IS BACKED UP JMS I (HANG TTUHNG /WAIT FOR LOG JAM TO CLEAR TAD TOCHR /NO CHAR BACKED UP - SEE IF TTY BUSY CLL RAL /"BUSY" FLAG IN LINK - INTERRUPTS ARE OFF! CLA CML RAR /COMPLEMENT OF BUSY IN SIGN TAD LPT /GET CHAR SPA /IF TTY NOT BUSY, TLS /OUTPUT CHAR DCA TOCHR /STORE POS OR NEG, BACKED UP OR BUSY TTYRET, ION /TURN INTERRUPTS BACK ON JMP I TTY /AND LEAVE KBD, TAD KBDCHR /HAS A CHARACTER BEEN INPUT? SNA CLA JMS I (HANG KBUHNG /NO - RUN BACKGROUND UNTIL ONE IS TAD KBDCHR /GET CHARACTER DCA LPT DCA KBDCHR /CHEAR CHARACTER BUFFER TAD LPT JMP TTYRET /RETURN WITH INTERRUPTS ON KILFPP, FPHLT /BRING FPP TO A SCREECHING HALT ISZ .-1 JMP .-1 /WAIT FOR IT TO STOP FPICL /CLEAN UP MESS HALT HAS MADE IN FPP BEEORC, SZL /^C OR ^B? JMP I (7600 /^C - HIYO SILVER, AWAY! KCC /CLEAR KBD FLAG ON ^B CTLBER, JMS I ERR /*** THIS MAY BE DANGEROUS! ** PAGE /INTERRUPT SERVICE ROUTINES INTRPT, DCA INTAC RAR DCA INTLNK VINT, JMP .+4 /** MUST BE AT 403 ** IFNZRO VINT-403 <___ CHANGE LOADER!!!> 0 CDF CIF 0 /USER INTERRUPT ROUTINE GOES HERE JMS I .-2 FPINT /CHECK FOR FPP DONE JMP LPTEST FPUHNG, JMP DISMIS /ALWAYS GOES TO RESTRT VDISMS, JMP DISMIS /FOR USE BY USERS JMP DISMIS JMP DISMIS LPTEST, LSF JMP NOTLPT LPTLCF, LCF /CLEAR FLAG TAD I LPGET SNA CLA /CHECK FOR SPURIOUS INTERRUPT JMPDIS, JMP DISMIS /GO AWAY IF SO DCA I LPGET /ZERO CHAR JUST OUTPUT ISZ LPGET TAD I LPGET SPA DCA LPGET /TAKE CARE OF BUFFER LINKS SNA TAD I LPGET /MAKE SURE CHAR IS IN AC SZA /IS THERE A CHARACTER? LLS /YES - PRINT IT CLA LSF /CHECK FOR IMMEDIATE FLAG LPUHNG, JMP DISMIS /NO - MAYBE RESTART PROGRAM JMP LPTLCF /YES - LOOP NOTLPT, TSF /CHECK TTY JMP NOTTTY TCF /CLEAR FLAG TAD TOCHR /GET TTY STATUS SMA SZA /IF THERE IS A CHARACTER WAITING, TLS /OUTPUT IT. SMA SZA CLA /CHANGE "WAITING" TO "BUSY", STL RAR /"BUSY" TO "IDLE". DCA TOCHR TTUHNG, JMP DISMIS /KBD AND PTP INTERRUPTS NOTTTY, KSF JMP NOTKBD TAD [200 KRS /USE KRS TO FORCE PARITY BIT DCA KBDCHR /AND ALSO SO THAT ^C WILL STILL BE IN BUFFER IN OS/8 TAD KBDCHR TAD (-202 /CHECK FOR ^C OR ^B CLL RAR SNA CLA JMP CTCCTB /YUP - TAKE SOME DRASTIC ACTION KCC /DATA CHARACTER - CLEAR FLAG KBUHNG, JMP DISMIS CTCCTB, TAD CTCINH SNA CLA /ARE WE IN A HANDLER? JMP NOTINH /NO TAD INTLNK CLL RAL /YES - RETURN WITH INTERRUPTS OFF TAD INTAC /TRUST IN GOD AND RTS RMF JMP I 0 NOTKBD, PSF JMP NOTPTP PCF /P.T. PUNCH INTERRUPT - CLEAR FLAG DCA POCHR /CLEAR SOFTWARE FLAG PPUHNG, JMP DISMIS NOTPTP, RSF JMP LPTERR TAD [200 RRB /GET RDR CHAR DCA RDRCHR RDUHNG, JMP DISMIS LPTERR, LSE /TEST FOR LP08 ERROR FLAG SKP LIF /DISABLE LP08 INTERRUPTS IF ERROR FLAG ON DISMIS, TAD INTLNK CLL RAL TAD INTAC /RESTORE AC AND LINK RMF ION JMP I 0 /RETURN FROM THE INTERRUPT INTAC, 0 INTLNK, 0 /BACKGROUND INITIATE/TERMINATE ROUTINE HANG, 0 /ALWAYS CALLED WITH INTERRUPTS OFF! TAD I HANG /GET POINTER TO UNHANGING LOCATION DCA UNHANG RDF /GET FIELD CALLED FROM TAD HCIDF0 DCA HNGCDF /SAVE FOR RETURN HCIDF0, CDF CIF 0 TAD (JMP RESTRT /CHANGE THE "JMP DISMIS" AT THAT LOC DCA I UNHANG /TO A "JMP RESTRT" TAD BACKLK CLL RAL TAD BACKAC /SET UP BACKGROUND AC AND LINK BAKCIF, CIF 0 BAKCDF, CDF 0 ION JMP I BACKPC /INITIATE BACKGROUND / COME HERE WHEN THE HANG CONDITION HAS GONE AWAY RESTRT, TAD JMPDIS /RESTORE THE UNHANG LOCATION DCA I UNHANG TAD INTAC /SUSPEND THE BACKGROUND DCA BACKAC TAD INTLNK DCA BACKLK TAD 0 DCA BACKPC RIB AND [70 TAD HCIDF0 DCA BAKCIF RIB JMS I MCDF /*K* OK SINCE BACKGROUND DOESN'T USE MAKCDF DCA BAKCDF ISZ HANG HNGCDF, HLT JMP I HANG /INTERRUPTS ARE OFF - RETURN NOTINH, TAD JMPDIS /IN CASE WE WERE HUNG, WE DON'T WANT DCA I UNHANG /TO GET "UNHUNG" OUT OF THE ERROR ROUTINE! JMP I (KILFPP /KILL FPP AND GO TO EXIT OR ERROR UNHANG, 0 BACKAC, 0 BACKLK, 0 BACKPC, VBACKG VHANG= HANG IFNZRO VHANG-0524 <__ CHANGE LOADER!> PAGE /I-O CONVERSION ROUTINES - STARTUP CODE RWASCI, JMS I [RWINIT /"READ(N,FMT)" OR "WRITE(N,FMT)" 2000 /"FORMATTED" BIT JMS I [FETPC /GET ADDRESS OF FORMAT STMT DCA FMTDF JMS I [FETPC DCA FMTADR DCA FMTTYP DCA PFACT /CLEAR SCALE FACTOR JMS I [GETLMN /EXIT TO MAIN PROGRAM TO GET 1ST VARIABLE TAD (FMTPDL-1 FMTSET, DCA FMTPXR /STORE NEW FORMAT PUSHDOWN POINTER TAD I FMTPXR DCA FMTBYT /GET NEW BYTE POINTER (NOTE-FMTPDL CONTAINS A 0) /MAIN FORMAT DECODING LOOP FMTFLP, TAD FMTBYT DCA FMPBYT /SAVE CURRENT BYTE PTR FOR PARENTHESES HACK FMTDLP, DCA FMTNUM /ZERO ACCUMULATED NUMBER FMTCLP, JMS FMTGCH /GET A CHARACTER ISZ FMTBYT /BUMP BYTE POINTER JMS I [CHTYPE /CLASSIFY CHAR 1234; FMTDIG /DIGIT -42; DBLQOT /" -44; ABORTO /$ -55; FMINUS /- -56; FMTPER /. -57; SLASH // -54; COMMA /, -50; LPAREN /( -51; RPAREN /) -47; KWOTE /' -40; FMTCLP /SPACE 0 /ANYTHING ELSE TAD FMTTYP SZA CLA /CHECK THAT WE DO NOT HAVE A FIELD OUTSTANDING JMP I (FMTERR /IF WE DO - ERROR TAD CHCH /GET FIELD CHARACTER DCA FMTTYP TAD FMTNUM SNA /IF REPEAT COUNT WAS MISSING OR ZERO IAC /MAKE IT ONE CMA DCA N /STORE -(REPEAT COUNT +1) DCA W /CLEAR WIDTH INITIALLY ISZ FMTNUM /PRECLUDE "FORMAT ERROR" ON X,P, OR H FORMATS TAD FMTTYP AND [7 /IS THE CHARACTER P, X, OR H? SNA CLA /IF SO, DON'T WAIT COMMA, JMS I (DOFMT /EXECUTE THE STORED FIELD SPECIFICATION JMP FMTFLP /BACK FOR MORE FMTADR, 0 /ADDRESS OF FORMAT FMTGCH, 0 /GET CHARACTER FROM FORMAT JMS FMTGAD /GET WORD CONTAINING CHAR AND L/R SWITCH CDF 0 JMS I (FMTGLR /EXTRACT CHARACTER JMP I FMTGCH FMTGAD, 0 /SUBR TO GET A WORD FROM A CHARACTER OFFSET TAD FMTBYT /GET OFFSET CLL RAR CLL TAD FMTADR /COMPUTE BASE ADDR + [OFFSET/2] DCA D RAL TAD FMTDF JMS I MCDF /SET UP PROPER DATA FIELD DCA .+1 HLT TAD FMTBYT RAR CLA /LEAVE L/R SWITCH IN LINK TAD I D JMP I FMTGAD /RETURN WITH WORD IN AC FMTDF, 0 /FIELD OF 1ST CHAR OF FORMAT IN BITS 9-11 FMTDIG, TAD FMTNUM /DIGIT PROCESSOR CLL RTL TAD FMTNUM CLL RAL /MULTIPLY FMTNUM BY 10 TAD CHCH /ADD IN THE DIGIT JMP FMTDLP /STORE IT BACK AND CONTINUE /PARENTHESIS AND DIGIT ROUTINES LPAREN, TAD FMTPXR TAD (2-FMTPDL SZA /ARE WE AT PARENTHESIS LEVEL 1? JMP .+3 /NO TAD FMPBYT /YES - STORE A POINTER TO THE FIRST DIGIT OF THE DCA I (FMTPDL-2 /GROUP COUNT PRECEDING THIS PAREN /AS THE LOOP POINTER FOR LEVEL 1 TAD [7 SPA CLA /PUSHDOWN OVERFLOW? FPOERR, JMS I ERR /YES AC7775 TAD FMTPXR DCA FMTPXR /BUMP PARENTHESIS PUSHDOWN POINTER TAD FMTBYT DCA I FMTPXR /SAVE BYTE POINTER TAD FMTNUM SNA IAC /NO GROUP COUNT MEANS COUNT = 1 CIA DCA I FMTPXR /SAVE LOOP COUNT DCA I (FMTPDL-1 /INITIAL GROUP COUNT IS INFINITE! RPLOOP, AC7776 /COME HERE ON RIGHT PAREN ALSO TAD FMTPXR /BACK UP FORMAT PDL POINTER JMP FMTSET /RESTORE FMTBYT FROM TOP OF LIST FMPBYT, 0 RPAREN, JMS I (DOFMT /EXECUTE PREVIOUS SPEC IF ANY TAD FMTPXR TAD (2-FMTPDL /IS THIS THE FINAL RIGHT PAREN? SNA CLA JMS I [ENDREC /YES - CHECK FOR END OF FORMAT ISZ I FMTPXR /BUMP COUNT JMP RPLOOP /DIDN'T OVERFLOW - LOOP TO BYTE AFTER ( ISZ FMTPXR /POP UP PARENTHESES STACK JMP FMTFLP /CONTINUE PAST RIGHT PAREN PAGE /QUOTE AND HOLLERITH FORMAT PROCESSORS KWOTE, TAD MINUS5 /APOSTROPHE PROCESSOR DBLQOT, TAD (-42 /QUOTE PROCESSOR DCA KWODEL /SAVE TERMINATOR JMS DOFMT /PROCESS PRECEDING FIELD , IF ANY SKP KWOTLP, JMS FMTHCV /PROCESS ONE CHARACTER JMS I [FMTGCH /GET THE NEXT FORMAT CHAR TAD KWODEL SZA CLA /IS IT THE TERMINATOR? JMP KWOTLP /NO - PROCESS IT AND CONTINUE ISZ FMTBYT /BUMP OVER TERMINATOR JMS I [FMTGCH TAD KWODEL SNA CLA /IS THIS ANOTHER TERMINATOR? JMP KWOTLP /TWO TERMINATORS PRINT AS ONE JMP I (FMTFLP /OTHERWISE GO BACK TO FORMAT LOOP HFMT, JMS MORE /MORE CHARACTERS? JMS FMTHCV /YES - PROCESS ONE JMP HFMT /AND LOOP FMTHCV, 0 /ROUTINE COMMON TO H AND QUOTED FORMATS TAD RWFLAG /PROCESSES ONE CHAR IN OR OUT OF THE FORMAT H7700, SMA CLA /IN OR OUT? JMP FMTHIN /IN JMS I [FMTGCH /OUT - GET THE CHAR JMS I [FMTOUT /PRINT IT JMP FMTHCR /RETURN FMTHIN, JMS I [FMTIN /INPUT - GET THE CHAR FROM THE INPUT LINE DCA W /SAVE IT JMS I (FMTGAD SZL /WHICH SIDE? JMP FHRGHT /RIGHT SIDE AND [77 /LEFT - KEEP RIGHT CHAR DCA MORE TAD W CLL RTL RTL RTL TAD MORE /ADD NEW CHAR IN ON THE LEFT JMP .+3 FHRGHT, AND H7700 /KEEP THE CHAR ON THE LEFT TAD W /ADD NEW CHAR IN ON THE RIGHT DCA I D /RESTORE ALTERED WORD CDF 0 FMTHCR, ISZ FMTBYT /BUMP BYTE POINTER JMP I FMTHCV KWODEL, 0 /MUST BE UNIQUE! MORE, 0 /SUBR TO BUMP REPEAT COUNT AND EXIT ON OVFLO ISZ N JMP I MORE DOFRTN, DCA FMTTYP /INDICATE NO SPECIFICATION COLLECTED JMP I DOFMT /RETURN FROM "DOFMT" DOFMT, 0 /ROUTINE TO PROCESS A FORMAT SPECIFICATION TAD FMTNUM /GET THE CURRENT NUMBER DCA D /STORE IT AS DECIMAL POINT SPEC DCA IFLG DCA EFLG DCA GFLG /ZERO CONVERSION FLAGS TAD FMTTYP SNA CLA /ANY SPECIFICATION WAITING? JMP I DOFMT /NO - JUST RETURN TAD W TAD D /IF THERE WAS NO W OR D SPECIFICATION, SNA CLA JMP FMTERR /ITS AN ERROR TAD FMTTYP JMS I [CHTYPE /YES - WHICH ONE? -30; XFMT /X -24; TFMT /T -20; PFMT /P -14; LFMT /L -11; IFMT /I -10; HFMT /H -7; GFMT /G -6; FFMT /F MINUS5, -5; EFMT /E -4;DF, EFMT /D - EQUIVALENT TO E IF NO D.P. FPP -2;BF, FFMT /B - EQUIVALENT TO F IF NO D.P. FPP -1; AFMT /A 0 /NONE OF THE ABOVE - ERROR FMTERR, JMS I ERR ENDREC, 0 /ROUTINE TO END A LINE AND MAYBE THE I/O JMS I [EOLINE CLA IAC AND RWFLAG /LO BIT OF RWFLAG IS "I/O LIST EXHAUSTED" FLAG SNA CLA /SKIP IF NO MORE ELEMENTS IN I/O LIST JMP I ENDREC JMP I [ENDIO /NOW FINISH UP AND LEAVE SLASH, JMS DOFMT /EXECUTE THE FIELD SPEC IF ANY JMS I [EOLINE /TERMINATE CURRENT LINE JMP I (FMTFLP PFMT, CLA CMA TAD FMTNUM ISZ MINFLG /P FORMAT - CHECK FOR NEGATIVE SCALE CIA DCA PFACT STA /FALL INTO CODE TO CLEAR MINFLG DCA MINFLG /SET FLAG ON MINUS JMP DOFRTN FMINUS, JMS DOFMT /EXECUTE PRECEDING SPEC DCA MINFLG /CLEAR MINUS FLAG JMP I (FMTFLP MINFLG, -1 FMTPER, TAD FMTNUM /PERIOD PROCESSOR DCA W /STORE WIDTH JMP I (FMTFLP ABORTO, JMS DOFMT /$ - SPECIAL HACK TO ALLOW PROMPTS DCA EOLSW /FAKE BEGINNING OF LINE DCA I (TTYLF /INHIBIT LF BEFORE NEXT TTY INPUT JMP I [ENDIO /GO AWAY PAGE CHTYPE, 0 /ROUTINE TO CLASSIFY CHARACTERS DCA CHCH /SAVE CHAR JMP CHLOOP+1 CDIGIT, TAD CHCH /CHECK FOR DIGIT TAD (-72 CLL TAD [12 SZL /IS CHAR A DIGIT? JMP JMPOUT /YES CHLOOP, ISZ CHTYPE /SKIP OVER ADDRESS CLA TAD I CHTYPE ISZ CHTYPE SMA /END OF LIST? JMP JMPOTX /MAYBE - JUMP WITH CODE IN AC TAD CHCH SZA CLA /DOES CHAR MATCH CHAR ON LIST? JMP CHLOOP /NO - KEEP LOOKING JMPOUT, DCA CHCH /ZERO CHAR TAD I CHTYPE DCA CHTYPE /SET UP TO RETURN INDIRECTLY JMPOTX, SZA CLA /IS THIS THE END? JMP CDIGIT /NO - GO CHECK FOR DIGIT JMP I CHTYPE /GO TO SPECIFIED ADDRESS SKPOUT, 0 /ROUTINE USED BY DATA-HANDLING SPECIFICATIONS JMS I [MORE /CHECK FOR REPEAT COUNT EXHAUSTED TAD RWFLAG CLL RAR SZA CLA /IF OUTPUT, ISZ SKPOUT /SKIP RETURN SZL CLA /IF END OF I/O LIST, JMS I [ENDREC /DON'T RETURN AT ALL - GO AWAY JMP I SKPOUT /A FORMAT PROCESSOR AINPUT, TAD (4040 DCA ACH TAD (4040 DCA ACL /INITIALIZE LOW-ORDER WORDS TO BLANKS AINPTL, JMS GADR SZL /LEFT OR RIGHT? JMP AINPTR /RIGHT JMS I [FMTIN STL RTL /INPUT CHAR GOES IN HIGH-ORDER RTL /WITH BLANK IN LOW-ORDER RTL JMP AINPTC AINPTR, JMS I [FMTIN TAD I FMTGLR /COMBINE INPUT CHAR AND OLD LEFT HALF TAD [-40 /DELETE PREVIOUS RIGHT-HALF SPACE AINPTC, DCA I FMTGLR /STORE WORD ISZ W JMP AINPTL /LOOP AROUND WIDTH ANXT, JMS I [GETLMN /GET NEXT ELEMENT AFMT, TAD D CIA DCA W /SAVE FIELD WODTH AS A COUNT JMS I [SKPOUT /CHECK FOR REPEAT COUNT OVFLO AND I/O DIR JMP AINPUT AOTPUT, JMS GADR /OUTPUT - GET ADDRESS OF BYTE TAD I FMTGLR JMS FMTGLR /GET BYTE JMS I [FMTOUT /PRINT IT ISZ W JMP AOTPUT /LOOP ON WIDTH JMP ANXT FMTGLR, 0 /SUBR TO EXTRACT A CHAR FROM A WORD SZL JMP .+4 /RIGHT HALF RTR RTR RTR /LEFT HALF - ROTATE INTO RIGHT HALF AND [77 JMP I FMTGLR GADR, 0 /BYTE ADDRESS ROUTINE FOR A FORMAT PROCESSOR TAD D TAD W /FORM BYTE OFFSET IN THE RANGE 0 THRU D-1 CLL RAR TAD (ACX DCA FMTGLR JMP I GADR /LEAVE WITH L/R FLAG IN LINK /"STOP" ROUTINE - TERMINATES JOB CALXIT, TAD EXDVNO CIA DCA ACI /GO THROUGH THE FORTRAN UNIT NUMBERS. DCA I (ENDFLS /*K* TURN "ENDFL" INTO A SUBROUTINE JMS I (LDDSRN /IF WE FIND A UNIT WHICH IS BEING USED SNA CLA /AND HAS NOT BEEN ENDFILED, JMP XITISZ /WE WILL DUMP THE CURRENT BUFFER (IF IT CLA IAC /IS A FORMATTED OUTPUT FILE) AND AND FFLAGS /END-FILE IT SNA CLA JMS I (ENDFL XITISZ, ISZ EXDVNO JMP CALXIT LPTTWT, TAD I LPGET /WAIT FOR LINE PRINTER AND TELETYPE TO TAD TOCHR /GO QUIET. SZA CLA JMP LPTTWT ISZ CLNADR /SET UP TO CLOSE OUTPUT FILES PDPXIT, IOF /ENTER HERE FROM 7605 CDF 0 /TO PROTECT CLODS WITH PDP 8/E'S JMS I (7607 0210 7400 /READ IN CLEANUP ROUTINE 37 /AND OS/8 PAGE 17600 JMP .-5 /AYEEEE!! SYSTEM DEVICE GONZO! CDF CIF 10 JMP I CLNADR /CLOSE TENTATIVE FILES AND EXIT CLNADR, CLNUP EXDVNO, -11 ARGLD, 0 /ROUTINE TO GET VALUE OF AN ARG JMS I [FETPC AND [7 /THROW AWAY OPCODE (JA) TAD FLDTM2 DCA FGPBF JMS I [FETPC /CONSTRUCT AN FPP INSTRUCTION DCA BIOPTR JMS I [FPGO FGPBF JMP I ARGLD FLDTM2, FLDA+LONG FTEMP2 FEXIT PAGE /SUBROUTINE TO OPEN A UNIT FOR I/O RWINIT, 0 DCA RWFLAG /DIRECTION IN AC ON ENTRY AC7776 AND I RWINIT /IF CALLED FROM BACKSPACE, REWIND OR ENDFILE SZA CLA /UNIT NUMBER IS IN FAC JMS I [ARGLD /OTHERWISE, GET UNIT NUMBER JMS I [FFIX TAD ACI CLL CMA TAD [12 SZL CLA /CHECK DEVICE NUMBER IN RANGE 0-9 JMS LDDSRN /LOAD DSRN ENTRY INTO PAGE 0 SNA CLA /IS UNIT INITIALIZED? UNTERR, JMS I ERR /NO - ERROR TAD RWFLAG SPA /IF WE ARE WRITEING FOR THE FIRST TIME TAD FFLAGS /ON A UNIT WHICH WAS BEING READ, CMA RAL /WE MUST BUMP THE RELATIVE BLOCK NUMBER DOWN SNL SMA CLA /ONE BECAUSE OF A PHILOSOPHICAL DIFFERENCE JMS I (RD2WR /BETWEEN READ AND WRITE TAD I RWINIT TAD RWFLAG /OR THE I/O TYPE AND CMA AND FFLAGS /DIRECTION BITS INTO THE FLAG WORD TAD I RWINIT TAD RWFLAG DCA FFLAGS TAD FFLAGS CMA RTL SNL SMA CLA /IT IS ILLEGAL TO ACCESS A FILE IN JMP UNTERR /FORMATTED AND UNFORMATTED MODES ISZ RWINIT TAD ACI CLL RAL TAD ACI TAD (DATABL-4 DCA XR /STORE POINTER INTO DIRECT-ACCESS TABLE JMP I RWINIT /REWIND AND END FILE RWIND, JMS RWINIT /GET THE DSRN ENTRY 0 /DON'T PLAY WITH MODES AC2000 TAD FFLAGS SNA CLA /IF FORMATTED OUTPUT FILE AND NOT EOF'D JMS DMPBUF /DUMP LAST BUFFER AS A FAVOR ATLDMK, CLA IAC AND FFLAGS /KILL ALL FLAG BITS DCA FFLAGS /EXCEPT "END-FILED" BIT TAD BADFLD AND [7400 DCA CHRPTR AC7775 DCA CHRCTR /INITIALIZE BUFFER POINTERS DCA RELBLK /AND RELATIVE BLOCK # JMP I [ENDIO /RESTORE DSRN AND EXIT ENDFL, JMS RWINIT /*K* USED AS A SUBROUTINE BY CALXIT 1 /GET DSRN, SET "END FILE" FLAG TAD FFLAGS /IF THE FILE IS UNFORMATTED, CMA RAL /OR WAS NOT OUTPUT ONTO, SNL SMA CLA /THEN ENDFILE DOES NOTHING. JMS DMPBUF /ELSE DUMP THE FINAL BUFFER AC3777 AND FFLAGS /CLEAR WRITE BIT SO WE WILL NOT TRY SETTOT, DCA FFLAGS /ANYTHING ON A SUBSEQUENT ENDFILE TAD RELBLK /SET NEW LENGTH OF FILE IN CASE ITS TENTATIVE, DCA TOTBLK /AND SO WE WON'T READ PAST EOF. ENDIO, JMS INITMV /SET UP DSRN POINTERS TAD I XR1 DCA I XR /STORE BACK THE DSRN ENTRY ISZ T /FOR THIS LOGICAL UNIT JMP .-3 DCA VEOFSW /CLEAR EOFSW AT END OF EVERY READ ENDFLS, JMP I [RETURN /RETURN TO THE CALLING PROGRAM JMP I ENDFL /*K* OR RETURN TO CALXIT INITMV, 0 /ROUTINE TO SET UP STUFF ICDF0, CDF 0 TAD LOGUNT DCA XR TAD (HAND-1 DCA XR1 TAD (-11 DCA T JMP I INITMV /ROUTINE TO DUMP CURRENT OUTPUT BUFFER WITH ^Z AT THE END DMPBUF, 0 ISZ EOLSW /FORCE COLUMN 1 SWITCH OFF TAD (7712 /OUTPUT A LINE FEED JMS I [FMTOUT TAD HAND /IF THE FILE IS BEING OUTPUT VIA SMA CLA /AN OS/8 HANDLER, JMP CLREOL /WE MUST TERMINATE THE BUFFER PROPERLY. TAD (32 CTZLP, TAD Z7700 /OUTPUT A ^Z AND FILL BUFFER WITH ZEROES. JMS I [FMTOUT /NEGATIVE NUMBERS TURN INTO CONTROL CHARS TAD CHRPTR AND [377 TAD CHRCTR /FILL THE BUFFER UNTIL CHRPTR POINTS TO IAC /A BLOCK BOUNDARY AND CHRCTR = -3 Z7700, SMA CLA /WE ARE THEN AT BUFFER-END JMP CTZLP CLREOL, DCA EOLSW /RESET TO BEGINNING OF LINE JMP I DMPBUF /RETURN /ROUTINE TO MOVE THE PROPER DSRN ENTRY INTO PAGE 0 LDDSRN, 0 TAD ACI / READ/WRITE INIT SINGS THIS SONG, CLL RTL / (DOO DAH, DOO DAH,) RAL / DSRN ENTRIES 9 WORDS LONG TAD ACI / (OH, DEE DOO DAH DAY). SNA /DEVICE NUMBER 0 IS SPECIAL - TAD (PTTY+11-DSRN /IT'S ALWAYS THE TELETYPE TAD (DSRN-12 DCA LOGUNT JMS INITMV /SET UP FOR MOVE TAD I XR DCA I XR1 /PUT DSRN ENTRY IN PAGE 0 ISZ T JMP .-3 TAD BADFLD AND [70 TAD ICDF0 DCA BUFCDF /SAVE BUFFER FIELD AS A CDF TAD HAND JMP I LDDSRN PAGE /BACKSPACE ROUTINE - WORKS ON BINARY OR ASCII FILES BKSPC, JMS I [RWINIT 0 /GET THE DSRN ENTRY WITHOUT ALTERING MODE TAD HAND SMA CLA JMP I [UNTERR /UNIT MUST BE BLOCK ORIENTED AC2000 AND FFLAGS SZA CLA /IS FILE FORMATTED? JMP BKASCI /YES - PAIN IN NECK JMS BMPBLK /UNFORMATTED FILE - REREAD LAST BLOCK TAD CHRPTR TAD [377 DCA T JMS BUFFLD /SET DATA FIELD TO FIELD OF BUFFER TAD I T /LOOK AT LAST WORD IN BUFFER CIA /REGARD IT AS THE NUMBER OF BLOCKS/RECORD TAD RELBLK DCA RELBLK /RELBLK POINTS TO FIRST BLOCK OF PREV. REC JMP I [ENDIO BMPBLK, 0 /SUBR TO BUMP BLOCK # BACK AND READ CMA CLL /AC MAY NOT BE 0 ON ENTRY TAD RELBLK DCA RELBLK /BUMP BLOCK BACK SNL JMP I (ATLDMK /BACKSPACED TOO FAR - CALL IT QUITS DCA CHRPTR /ZERO CHRPTR TO FORCE A READ FROM MASSIO JMS I [MASSIO /READ A BLOCK JMP I BMPBLK /**** NULL JOB GOES HERE FOR LACK OF A BETTER PLACE **** NULLJB, TAD N2525 NULLLP, ISZ N2525 /PUT THE FAMOUS "POLY BASIC PATTERN" JMP NULLLP /IN THE AC LIGHTS ISZ NUMISZ JMP NULLLP CML CMA RAR DCA N2525 TAD [-4 DCA NUMISZ JMP I (VBACKG /GOT SOMETHING MORE USEFUL TO DO? N2525, 2525 NUMISZ, -4 /BACKSPACE FOR FORMATTED FILES BKLORD, TAD I CHRPTR ISZ CHRPTR NOP AND [177 /GET 7 BITS TAD (-15 /COMPARE WITH C.R. - SINCE WE SKIPPED SNA CLA /THE FIRST ONE THIS WILL BELONG TO THE PREVIOUS JMP I [ENDIO /LINE AND WE WILL BE DONE (HAH!) BKASCI, JMS I (MASBMP /A COMPLICATED MESS - FIRST BUMP THE SKP /CHARACTER POINTER BACK TWO PLACES JMP BKGTCH /AND THEN FETCH A CHARACTER. THIS WILL IGNORE TAD BADFLD /THE LAST CHAR READ/WRITTEN (WHICH SHOULD AND [7400 /BE A CARRIAGE RETURN). CIA TAD CHRPTR CLL RAR SZA CLA /TEST WHETHER WE HAVE TO READ AN OLD BUFFER JMP BKNORD /NO TAD CHRCTR /SAVE POSITION IN CURRENT DOUBLEWORD DCA GETCH3 DCA CHRPTR AC4000 /IF WE ARE BACKSPACING AN OUTPUT FILE, TAD FFLAGS /WE MUST SAVE THE INFORMATION IN THE SPA /CURRENT BUFFER BY WRITING IT OUT. JMP .+4 DCA FFLAGS /ALSO CHANGE THE UNIT TO AN INPUT FILE AC4000 /(RWINIT TAKES CARE OF SWITCHING BACK TO OUTPUT) JMS I [MASSIO CLA IAC /WE DON'T WANT THE LAST BLOCK READ/WRITTEN, JMS BMPBLK /THAT'S IN CORE - WE WANT THE ONE TAD GETCH3 /BEFORE THAT. DCA CHRCTR TAD CHRCTR TAD (401 SKP /COMPUTE WORD POINTER FROM CHAR POINTER BKNORD, STA TAD CHRPTR DCA CHRPTR /BUMP WD PTR BACK 1 BKGTCH, JMS I (MASBMP /NOW GET A CHARACTER - THIS LOOKS A LOT JMP BKLORD /LIKE THE INPUT ROUTINE JMS GETCH3 JMP BKLORD+1 GETCH3, 0 /COMMON CODE BETWEEN BACKSPACE AND INPUT TAD I CHRPTR AND [7400 DCA BMPBLK /HANDY TEMPORARY ISZ CHRPTR TAD I CHRPTR AND [7400 CLL RTR RTR /COMBINE TWO 4-BIT QUANTITIES TAD BMPBLK /INTO A CHARACTER CLL RTR RTR JMP I GETCH3 DATABL, ZBLOCK 33 /DIRECT ACCESS TABLE PAGE /I,E,F,AND G FORMAT CONVERSIONS IFMT, TAD D DCA W /SET WIDTH PROPERLY DCA D /FOR SCALING PURPOSES STA DCA IFLG JMP FFMT GFMT, STA DCA GFLG /SET G AND E FLAGS EFMT, STA DCA EFLG /SET E FLAG JMP FFMT IGEF, JMS I [GETLMN /MAIN LOOP FOR CONVERSIONS - SKIPPED 1ST TIME FFMT, TAD D DCA OD /SAVE COUNT OF POST-D.P. DIGITS TAD IFLG SNA CLA /APPLY THE P-SCALE FACTOR TAD PFACT /ONLY IF THE FORMAT IS NOT I DCA PFACTX DCA SCALE /DON'T LOOK FOR TROUBLE JMS I [SKPOUT /CHECK IF MORE AND TEST DIRECTION JMP I (IGEFIN /INPUT STA DCA I [FFNEG /USE NEGATE ROUTINE HEADER AS SIGN FLAG TAD EFLG CLL RAL CLL RAL /0 IF NOT E, -4 IF E TAD W /THIS PROVIDES FOR THE EXP. FIELD (IF E FMT) DCA OW /OR THE 4 TRAILING SPACES (IF G FMT) TAD ACH SNA JMP SKPSHT /AC IS ZERO - SKP A LOT OF SHT SPA CLA JMS I [FFNEG /AC<0 - NEGATE IT AND SET FLAG (CLEVER) SCALUP, DCA SCALE TAD ACX SMA SZA CLA /AC<1.0? JMP GT1 /NO JMS I [FPGO /YES - MULTIPLY BY 10.0 FMUL10 STA TAD SCALE /BUMP POWER OF TEN JMP SCALUP /I,G,E,F, OUTPUT CONVERSIONS - NUMBER IS NOW =>1.0 GT1, JMS I (SCALDN /NOW DECREASE IT TO THE INTERVAL [0,1) JMS I [FPGO /SAVE IT AWAY FSTTMP TAD [7 JMS OSCALE JMS I [FPGO /USE IT TO ROUND THE NUMBER TO BE OUTPUT FADTMP JMS I (SCALDN /WE COULD HAVE ROUNDED FROM .999... TO 1.000... SKPSHT, TAD GFLG /ENTER HERE IF NUM WAS 0 - SCALE=0 SNA CLA JMP NOTG /NOT G FORMAT TAD SCALE /G FORMAT - TEST FOR OUT OF F FORMAT RANGE TAD PFACTX CIA CLL /F FORMAT RANGE IS [.1,10**(D VALUE)) TAD OD SNL JMP USEE /IF OUT OF BOUNDS USE E FORMAT (FLAG IS SET) DCA OD /REDUCE D VALUE BY SCALE FACTOR DCA EFLG /TO RETAIN CORRECT # OF SIG. DIGITS USEE, CLA JMP NOTG /SET UP TO PRINT DIGITS DIGCNT, 0 TAD PFACTX /COMPUTE EXPONENT JUST IN CASE E FORMAT CIA TAD SCALE DCA FMTNUM TAD EFLG SNA CLA /NOW COMPUTE THE NUMBER OF DIGITS BEFORE THE D.P. TAD SCALE /TAKE SCALE FACTOR INTO ACCOUNT IF NOT E FORMAT TAD PFACTX /TAKE P FACTOR INTO ACCOUNT IF NOT I OR F/G DCA SCALE /STORE THE NUMBER OF DIGITS BEFORE THE D.P. TAD I [FFNEG /INCREASE NUMBER OF LEADING BLANKS BY 1 SPA CLA /IF THE NUMBER IS POSITIVE. THIS DEPENDS ON ISZ OW /THIS LOCATION BEING BELOW 4000. TAD SCALE /GET THE NUMBER OF PRE-D.P. DIGITS (AS NEGATIVE #) SPA SNA CLA IAC /IF NONE, PRINT A 0 SO COUNT AS 1 TAD OD /REDUCE THE WIDTH BY THIS NUMBER CMA TAD OW /REDUCE IT AGAIN BY THE POST-D.P. DIGIT COUNT CIA TAD IFLG /AND AGAIN BY 1 FOR THE D.P. (IF NOT I FORMAT) JMP I DIGCNT OW, 0 /I,G,E,F FORMAT - ROUTINE TO SCALE ROUNDING FACTOR OSCALE, 0 /SUBR TO SCALE .5 THE CORRECT # OF TIMES DCA NPLCS /MAX IN AC ON ENTRY DCA ACX AC2000 /FORM A FLOATING 0.5 IN ORDER DCA ACH /TO ROUND THE NUMBER BEFORE PRINTING. DCA ACL TAD EFLG /FIGURE OUT HOW TO SCALE IT - SNA CLA /THE THEORY IS THAT IT SHOULD BE SCALED TAD SCALE /DOWN BY THE NUMBER OF SIGNIFICANT DCA T /PRINTING DIGITS. THIS CAN BE TAD SCALE /EXPRESSED AS: CIA CLL /(P FACTOR) * (NOT (G FMT PRINTING AS F)) TAD OD / + (SCALE FACTOR) * (NOT E FMT) + (D VALUE). SZL CLA /THE SCALE FACTOR IS < 0 FOR TAD GFLG /NUMBERS < .1, WHICH REDUCES SNA CLA /THE # OF SIG. DIGITS VIA LEADING ZEROS. TAD PFACTX /IF THERE ARE < 0 SIG. DIGITS TAD T /IT DOESN'T MATTER WHAT WE DO TAD OD /SINCE THE NUMBER WILL PRINT AS SMA /0.00000 ANYWAY. CMA /IF THERE ARE >NPLCS SIG. PRINTING DIGITS TAD NPLCS /THE ROUNDING GETS MEANINGLESS SO MAKE SPA /THE EXCESS DIVISIONS DIVIDES BY 2 INSTEAD DCA ACX / OF BY 10. THIS FUDGE WORKS QUITE WELL CIA /FOR NUMBERS OF UP TO NPLCS+2 TAD NPLCS /SIGNIFICANT DIGITS. CIA DCA T JMP .+3 FDIVLP, JMS I [FPGO /SCALE THE .5 DOWN THE CORRECT NUMBER OF TIMES FDIV10 ISZ T JMP FDIVLP JMP I OSCALE NPLCS, 0 ONE, 1;2000;0 PAGE /I,G,E,F OUTPUT CONVERSION - ACTUAL OUTPUT SECTION OUTNUM, SMA /CHECK FOR FIELD OVERFLOW JMP ASTSK1 /YES - PRINT ******* JMS OBLNKS /PRINT LEADING BLANKS - AC IS NOT 0! /***IMPORTANT - OBLNKS CLEARS AC1 *** AC7775 ISZ I [FFNEG /IF SIGN IS NEGATIVE, JMS DIGIT /OUTPUT A MINUS SIGN CLA /OTHERWISE OUTPUT NOTHING TAD ACX SNA /ALIGN THE FAC MANTISSA INTO A DOUBLEWORD JMS I [AL1 /FRACTION IN THE RANGE [.1,1) IAC /THIS INVOLVES SHIFTING THE MANTISSA CMA /RIGHT BY (-ACX-1) PLACES SMA /WHERE A NEGATIVE NUMBER MEANS A LEFT SHIFT. JMS I [ACSR CLA TAD ACL /NOW MOVE THE FAC DOWN A WORD SO THAT DCA AC1 /WHEN WE MULTIPLY BY 10 THE OVERFLOW APPEARS TAD ACH /IN THE HIGH-ORDER WORD DCA ACL TAD SCALE SPA SNA /DO WE HAVE DIGITS TO THE LEFT OF THE D.P.? JMP PRZERO /NO - PRINT A ZERO THERE JMS DIGITS /YES - PRINT THEM PRDCPT, TAD IFLG SZA CLA JMP I (IGEF /IF I FORMAT, WE'RE DONE NOW AC7776 JMS DIGIT /OTHERWISE PRINT DECIMAL POINT TAD SCALE SMA CLA /CHECK WHETHER WE NEED TO PRINT LEADING ZEROS JMP NOLZRO /NO TAD SCALE DCA T LZLOOP, STA CLL TAD OD /BUMP D VALUE DOWN BY ONE SNL /IF IT GOES NEGATIVE, JMP NOMOAC /WE'VE RUN OUT OF FIELD WIDTH DCA OD JMS DIGIT /PRINT A ZERO ISZ T /UNTIL THE COUNT (OR THE WIDTH) RUNS OUT JMP LZLOOP NOLZRO, TAD OD SZA /IF THERE ARE ANY DIGITS YET TO BE PRINTED, JMS DIGITS /PRINT THEM /I,G,E,F OUTPUT CONVERSION - FINISH UP NOMOAC, CLA TAD EFLG SNA CLA /E FORMAT? JMP CHKG /NO - CHECK FOR G FORMAT OUTPUT AS F JMS EXPFLD JMP I (IGEF EXPFLD, 0 TAD (5 JMS I [FMTOUT /OUTPUT "E" TAD FMTNUM /GET EXPONENT CLL SPA CML CIA /SEPARATE INTO MAGNITUDE AND SIGN DCA FMTNUM /SAVE MAGNITUDE RTL TAD (-5 /PRINT + OR - JMS DIGIT DCA T /INITIALIZE QUOTIENT OF DIVISION DVELP, TAD FMTNUM /SUBTRACT 10 FROM EXPONENT TAD [-12 SPA /DID IT GO NEGATIVE? JMP PRNTXP /YES - DONE DCA FMTNUM /NO - STORE IT BACK ISZ T /BUMP QUOTIENT JMP DVELP /LOOP PRNTXP, CLA TAD T TAD [-12 SMA CLA JMP ASTSK3 TAD T JMS DIGIT TAD FMTNUM JMS DIGIT /PRINT TWO DIGITS OF EXPONENT JMP I EXPFLD CHKG, TAD GFLG SNA /WAS IT G FORMAT? JMP I (IGEF /NO - F OR I - DONE DCA EFLG /RE-SET EFLG SINCE WE ZEROED IT BEFORE TAD (-5 JMS OBLNKS /OUTPUT 4 BLANKS JMP I (IGEF /DONE WITH G FORMAT OUTPUT PRZERO, CLA /COME HERE IF NO SIG. DIGITS LEFT OF D.P. JMS DIGIT /PRINT A ZERO JMP PRDCPT /CONTINUE ASTSK3, AC0002 JMP .+3 ASTSK1, CLA /CLEAR THE AC TAD W /GET THE FIELD WIDTH JMS I [ASTRSK JMP I (IGEF /I,G,E,F OUTPUT CONVERSION - OUTPUT SUBROUTINES OBLNKS, 0 /SUBROUTINE TO PRINT A STRING OF BLANKS DCA AC1 /MUST LEAVE AC1 ZERO ON EXIT SO THAT JMP .+3 /FAC LEFT SHIFT WON'T SHIFT IN GARBAGE LATER ON TAD [40 JMS I [FMTOUT /OUTPUT A BLANK ISZ AC1 JMP .-3 /LOOP JMP I OBLNKS /RETURN DIGITS, 0 /ROUTINE TO OUTPUT A STRING OF DECIMAL DIGITS CIA DCA T DGLOOP, TAD AC1 DCA AC2 /COPY AC INTO OPERAND FOR ADDITION LATER ON TAD ACL DCA OPL DCA ACH /CLEAR "OVERFLOW WORD" JMS I [AL1 JMS I [AL1 /FAC=FAC*4 DCA OPH JMS I [OADD JMS I [AL1 /FAC=ORIGINAL FAC*10 TAD ACH /GET OVERFLOW JMS DIGIT /PRINT IT ISZ T /LOOP FOR SPECIFIED NUMBER JMP DGLOOP JMP I DIGITS /RETURN DIGIT, 0 /ROUTINE TO OUTPUT A DIGIT TAD [60 JMS I [FMTOUT /TRIVIAL, ISN'T IT? JMP I DIGIT PAGE /I,G,E,F INPUT CONVERSION IGEFIN, STA /OD CONTAINS SCALING IF NO D.P. IN INPUT DCA DPSW /INITIALIZE D.P. SW STA DCA INESW /DITTO EXPONENT SWITCH TAD W CMA DCA FMTNUM /GET CHAR COUNT INERSM, DCA ACX /RE-ENTER HERE AFTER SEEING "E" DCA ACH /CLEAR FLOATING AC DCA ACL STA JMP INMINS /SET SIGN PLUS INGCH, JMS I [FMTIN /GET A CHAR JMS I [CHTYPE /CLASSIFY IT 1234; IDIGIT /DIGIT -56; INDCPT /. -53; INLOOP /+ -55; INMINS /- -5; INE /E -40; IBLDIG /BLANK - TREAT LIKE 0 IN FORTRAN STANDARD -54; INEONM /, 0 /OTHER - ERROR INER, JMS I ERR INDCPT, DCA OD /ZERO COUNT OF DIGITS AFTER D.P. ISZ DPSW /TEST AND SET D.P. SWITCH JMP INER /WHOOPS - TWO D.P.S IN A NUMBER JMP INLOOP /KEEP GOING IBLDIG, TAD EOLSW /SINCE THE BLEEPING STANDARD DOESN'T COVER SZA CLA /TELETYPE I/O, WE KEEP SOME COOL BY IGNORING JMP INLOOP /BLANKS CREATED BY EARLY LINE TERMINATION. IDIGIT, TAD CHCH DCA DGT+1 /SAVE THE DIGIT JMS I [FPGO /FORM 10*FAC + DIGIT IN FAC ACMDGT TAD DPSW SNA CLA ISZ OD /BUMP DIGIT COUNT IF D.P. SEEN JMP INLOOP INMINS, DCA I [FFNEG /SET SIGN NEGATIVE INLOOP, ISZ FMTNUM JMP INGCH /LOOP UNTIL WIDTH EXHAUSTED INEONM, ISZ I [FFNEG /CHECK IF SIGN NEGATIVE JMS I [FFNEG /YES - NEGATE ISZ INESW /SEE IF "E" SEEN JMP FIXUPE /YES - WE HAVE EXPONENT, NOT NUMBER TAD PFACTX /NO "E" SEEN - SCALE USING P FACTOR SCALIN, TAD OD /GET SCALING FACTOR STL SNA JMP I (IGEF /NO SCALING NECESSARY SMA CIA CLL /AC CONTAINS MAGNITUDE, LINK CONTAINS SIGN DCA OD RTL RAL /AC CONTAINS 0 IF DIVIDE, 4 IF MULTIPLY TAD (FDIV10 DCA IGEFOP JMS I [FPGO /MULTIPLY OR DIVIDE BY 10.0 IGEFOP, 0 ISZ OD JMP IGEFOP-1/MULT OR DIV APPROPRIATE NUMBER OF TIMES JMP I (IGEF /RETURN FOR MORE INE, ISZ INESW /SEE IF THIS IS THE SECOND "E" JMP INER /YES - ERROR ISZ DPSW /FORCE DP SW ON (TO INHIBIT D.P. AFTER E) TAD OD /USE SCALE FACTOR ONLY IF D.P. SEEN DCA SCALE /SAVE SCALE FACTOR ISZ I [FFNEG JMS I [FFNEG /GET SIGN OF NUMBER CORRECT JMS I [FPGO /SAVE IT TEMPORARILY FSTTM2 JMP INERSM /GO COLLECT EXPONENT FIXUPE, JMS I [FFIX TAD ACI /GET EXPONENT CIA TAD SCALE /ADD IN EXPONENT TO D.P. SCALE FACTOR DCA OD JMS I [FPGO /GET NUMBER BACK IN FAC FLDTM2 JMP SCALIN DPSW, 0 DGT, 13;0;0;0;0;0 NOTG, JMS I (DIGCNT DCA SCALDN TAD IFLG SNA CLA JMP NOTI TAD SCALE TAD (-7 SPA CLA NOTI, TAD SCALDN JMP I (OUTNUM SCALDN, 0 /SUBROUTINE TO SCALE THE FAC LESS THAN 1.0 TAD ACX SPA SNA CLA /IS THE FAC => 1.0? JMP I SCALDN /NO - WE'RE DONE JMS I [FPGO /DIVIDE BY TEN FDIV10 ISZ SCALE /BUMP POWER OF TEN 0 /BACKUP FOR WIDTH JMP SCALDN+1 /LOOP ASTRSK, 0 CIA DCA T TAD (52 JMS I [FMTOUT ISZ T JMP .-3 JMP I ASTRSK /GET NEXT ELEMENT INESW, 0 /"E SEEN" SWITCH ON INPUT PAGE /L AND X FORMATS , T FORMAT INPUT TFMTIN, JMS I [FMTIN /FORCE INPUT BUFFER NON-EMPTY CLA /BY FETCHING AND WASTING A CHARACTER TAD (INBUFR DCA INXR DCA EOLSW /SET TO BEGINNING OF LINE JMP XFMT XFMTIN, JMS I [FMTIN H7600, 7600 /WASTE AN INPUT CHAR XFMT, JMS I [MORE /ANY MORE CHARS? TAD RWFLAG /YES - IN OR OUT? SMA CLA JMP XFMTIN /IN TPPLBL, TAD [40 /HERE WITH AC=13 TO OVERPRINT ON T OUTPUT JMS I [FMTOUT /OUT JMP XFMT LINGCH, JMS I [FMTIN JMS I [CHTYPE /GET AND CLASSIFY CHARACTER -40; LINLP /BLANK -24; LINTRU /T -6; LINFLS /F 0 /OTHER - ERROR JMP I (INER LINTRU, TAD (4001 LINFLS, CLL RAR /PUT EITHER 0.0 OR 1.0 IN THE FAC DCA ACH DCA ACL RAL DCA ACX LINLP, ISZ W JMP LINGCH /LOOP ON FIELD WIDTH LNXT, JMS I [GETLMN /GET NEXT ELEMENT FOR I/O LFMT, TAD D CMA DCA W /SAVE WIDTH AS A COUNT JMS I [SKPOUT /IN OR OUT? JMP LINFLS /IN CLA IAC TAD W JMS I (OBLNKS /OUTPUT W-1 BLANKS TAD ACH SZA CLA TAD (16 TAD (6 /NON-ZERO IS TRUE, ZERO FALSE JMS I [FMTOUT /OUTPUT T OR F JMP LNXT /NEXT VICTIM /T FORMAT OUTPUT AND RANDOM SUBROUTINES TFMT, TAD D CIA DCA N /USE N TO FAKE OUT "X" FMT ROUTINE TAD RWFLAG SMA CLA JMP TFMTIN /INPUT TAD N TAD EOLSW /COMPARE DESIRED POSITION WITH CURRENT ONE SPA JMP TPBLNK /AFTER - SPACE TO IT JMS EOLINE /OUTPUT CR AND ZERO EOLSW JMS I [MORE /KLUDGE FOR "T1" FORMAT TAD (13 /FAKE X FORMAT INTO PRINTING JMP TPPLBL /A + AND (N-1) SPACES TPBLNK, DCA N /SAVE DIFFERENCE BETWEEN POSITIONS JMP XFMT /GO SPACE OUT EOLINE, 0 /SUBROUTINE TO TERMINATE I/O LINE TAD RWFLAG /CAUTION - AC LO-ORDER BITS MAY NOT BE 0 SPA CLA /INPUT OR OUTPUT? JMP EOOUTL /OUTPUT JMS I [FMTIN /FORCE INPUT BUFFER NON-EMPTY CLA TAD (INBUFR-1 DCA INXR /SET XR TO NEGATIVE WORD AT THE JMP .+3 /BEGINNING OF THE INPUT BUFFER EOOUTL, TAD (7715 JMS I [FMTOUT /OUTPUT A CARRIAGE RETURN DCA EOLSW /CLEAR EOLSW FOR INPUT AND OUTPUT JMP I EOLINE /ROUTINE TO MOVE A HANDLER INTO FIELD 0 GETHND, 0 /HANDLER CODE WORD IN AC ON ENTRY DCA HCW /SAVE HANDLER CODE WORD TAD [7774 AND HCW /KNOCK OUT ION AND FORMS CTL BITS CIA SZA /IF HANDLER IS NOT RESIDENT, TAD HKEY /SEE IF THE HANDLER IS ALREADY SNA CLA /IN THE HANDLER AREA IN FIELD 0 JMP HINF0 /YES TAD HCW /NO - PUT IT THERE AND [70 TAD HCDF0 DCA HNDCDF /GET CDF TO FIELD IN WHICH HANDLER RESIDES TAD HCW AND H7600 TAD (-1 /GET POINTER TO HANDLER ADDRESS DCA XR1 /IN THAT FIELD TAD (HPLACE-1 DCA XR /ALSO TO HANDLER AREA IN FIELD 0 TAD [7400 /SET UP COUNT OF 7400 DCA HKEY /INDEPENDENT OF HANDLER SIZE HNDCDF, HLT TAD I XR1 HCDF0, CDF 0 DCA I XR /MOVE HANDLER INTO HANDLER AREA ISZ HKEY JMP HNDCDF TAD [7774 AND HCW DCA HKEY /SET NEW KEY CODE WORD HINF0, CLA IAC AND HCW SNA CLA /INTERRUPTS ALLOWED? YHIOF, IOF /NO - TOO BAD ISZ CTCINH /INHIBIT ^C DURING HANDLER CALL JMP I GETHND HKEY, 0 HCW, 0 PAGE /CHARACTER INPUT ROUTINE - LINE AT A TIME FMTIN, 0 TAD EOLSW SNA /END OF LINE ALREADY FOUND? TAD I INXR /NO - GET CHAR FROM LINE BUFFER SPA /TIME TO READ A NEW LINE? JMP READLN /YES SNA /END OF LINE? JMP INEOL /YES - SET INDICATOR AND [77 /CONVERT TO SIXBIT JMP I FMTIN /RETURN WITH IT INEOL, TAD [40 UNPKLN, DCA EOLSW /SET EOL INDICATOR TO A BLANK JMP FMTIN+1 /AND RETURN BLANKS FROM HERE ON IN READLN, DCA EOLSW /USE EOLSW AS A COUNT SO IT WINDS UP 0 TAD HAND TAD (-TTY SNA CLA /IS IT TELETYPE INPUT? STA /YES - SET TTY FLAG DCA TTYFLG JMS ECHO TTYLF, 12 /ECHO LF IF TTY INPUT TAD [12 /TTYLF IS ZEROED BY ABORTO DCA TTYLF READLP, CLA TAD HAND SPA CLA /CHARACTER ORIENTED DEVICE? JMP MASSIN /NO - UNPACK CHAR FROM BUFFER JMS I HAND /GET A CHARACTER GOTCHR, AND [177 /STRIP OFF PARITY JMS I [CHTYPE /CLASSIFY IT -15; INCRET /CARRIAGE RETURN -177; RUBOUT /RUBOUT -11; INTAB /TAB -25; CTRLU /^U -32; INEOF /^Z 0 /ANYTHING ELSE TAD CHCH TAD [-40 SMA /IF CHARACTER IS >37, JMS INPUTC /STORE IT AND ECHO IT IF TTY JMP READLP /CHARACTER INPUT ROUTINE - SPECIAL CHARACTER HANDLERS INTAB, JMS INPUTC /TAB - INSERT (AND ECHO) BLANKS TAD INXR AND [7 SZA CLA /UNTIL A COLUMN MULTIPLE OF 8 IS REACHED JMP INTAB JMP READLP RUBOUT, TAD EOLSW CIA TAD I (INBUFR /IGNORE RUBOUTS IF LINE EMPTY AND TTYFLG SNA CLA JMP READLP /OR IF NON-TTY INPUT JMS ECHO 134 /ECHO A BACKSLASH IBAKUP, STA TAD INXR DCA INXR /BACK UP LINE POINTER STA TAD EOLSW DCA EOLSW /AND CHAR COUNTER JMP READLP INEOF, TAD VEOFSW /CHECK SWITCH SET BY "CHKEOF" LIBRARY ROUTINE SNA /WAS HE EXPECTING AN EOF? EOFERR, JMS I ERR /NO JMS I MCDF DCA .+1 HLT /CDF TO FIELD OF INDICATOR VARIABLE AC2000 DCA I VEOFSW+1 /SET VARIABLE TO .5 CDF 0 /FALL INTO CARRIAGE RETURN CODE INCRET, DCA I INXR /CARRIAGE RETURN - ZERO OUT REST OF LINE SKP CTRLU, STA /SNEAKY, SNEAKY! TAD (INBUFR DCA INXR /RESET XR TO FETCH LINE CHARS JMS ECHO 15 /ECHO THE C.R. JMP UNPKLN /BACK TO FETCH FIRST CHAR INPUTC, 0 /ROUTINE TO STORE AND ECHO A CHAR TAD [40 DCA INTMP JMS ECHO INTMP, 0 /ECHO CHAR IF TTY INPUT TAD INTMP DCA I INXR /STORE CHAR IN LINE BUFFER ISZ EOLSW JMP I INPUTC /RETURN IF NO OVERFLOW JMP IBAKUP /IGNORE CHAR IF OVERFLOW ECHO, 0 /ROUTINE TO ECHO CHAR IF TTY INPUT TAD I ECHO /GET CHAR AND TTYFLG SZA /SHOULD WE ECHO? JMS I HAND /YES JMP I ECHO /RETURN TO CHARACTER - ITS SMALL TTYFLG, 0 /CHARACTER INPUT ROUTINE - MASS STORAGE SECTION MASSIN, JMS MASBMP /GET BUFFER FIELD AND CHAR NUMBER JMP INLORD /CHAR 1 OR 2 - STRAIGHTFORWARD JMS I (GETCH3 /USE COMMON SUBROUTINE JMP MASICM /GO TO COMMON CODE INLORD, JMS I [MASSIO /CHECK IF WE SHOULD READ IN A BUFFERLOAD JMS BUFFLD /SET FIELD OF BUFFER TAD I CHRPTR MASICM, ISZ CHRPTR /GET THE CHAR (IN LOW 8 BITS) AND BUMP PTR NOP /WATCH END OF FIELD FUNNYBUSINESS! CDF 0 /RESET DATA FIELD JMP GOTCHR /GO EXTRACT SEVEN BIT CHARACTER MASBMP, 0 JMS BUFFLD /SET TO BUFFER'S DATA FIELD ISZ CHRCTR /BUMP CHAR COUNTER JMP I MASBMP /CHAR 1 OR 2 - NO SWEAT AC7775 DCA CHRCTR /CHAR 3 - RESET CHAR CTR AC7776 TAD CHRPTR /BUMP BACK CHAR PTR DCA CHRPTR ISZ MASBMP JMP I MASBMP /SKIP RETURN PAGE /CHARACTER OUTPUT ROUTINE FMTOUT, 0 TAD [40 /FIRST CONVERT SIXBIT TO ASCII SMA /CTL CHARS COME IN NEGATIVE AND [77 TAD (240 DCA OCHAR /SAVE ASCII CHAR (WITHOUT PARITY BIT) TAD EOLSW SZA CLA JMP NOT1ST /FIRST CHAR IS DECODED FOR FORMS CONTROL AC0002 /CHECK TO SEE IF THIS UNIT AND HCODEW /SHOULD RECEIVE FORMS CONTROL SZA CLA JMP LFPLCH /NO - JUST PRINT A LINE FEED AND THE CHAR TAD OCHAR JMS I [CHTYPE /CLASSIFY CONTROL CHAR -261; OUTFFX /1 - TOP OF FORM -260; OUT2LF /0 - DOUBLE SPACE -253; NOLF /+ - OVERPRINT 0 /ANYTHING ELSE - SINGLE SPACE JMP OUTLF OUTFFX, TAD HAND TAD (-TTY /IF HANDLER IS TTY OUTPUT TWO LINE FEEDS SZA CLA /INSTEAD OF A FORM FEED JMP OUTFF OUT2LF, TAD [12 DCA OCHAR /SET 2ND CHAR TO LINE FEED LFPLCH, STA DCA EOLSW /SET SWITCH FOR 2ND CHAR TAD OCHAR DCA CHCH /SAVE CHARACTER AWAY OUTLF, AC7776 OUTFF, TAD F214 /SUBSTITUTE THE APPROPRIATE FORM CONTROL DCA OCHAR /FOR THE CHARACTER NOT1ST, TAD HAND SPA CLA /CHARACTER ORIENTED DEVICE? JMP MASOUT /NO - PACK CHAR INTO BUFFER TAD OCHAR JMS I HAND /OUTPUT CHAR NOLF, ISZ EOLSW /BUMP CHAR CTR JMP I FMTOUT /NO - RETURN TAD CHCH /AHA - ANOTHER CHARACTER SHOULD BE OUTPUT JMP OUTFF+1 /GO TO IT /CHARACTER OUTPUT - MASS STORAGE OUTPUT MASOUT, JMS I (MASBMP /GET BUFFER FIELD AND CHAR NUMBER JMP OULORD /CHAR 1 OR 2 - STRAIGHTFORWARD JMS OSUBR /CHAR 3 - PACK FIRST HALFBYTE JMS OSUBR /PACK SECOND HALFBYTE AC4000 JMS MASSIO /CHECK IF WE SHOULD DUMP THE BUFFER MASOCM, CDF 0 JMP NOLF /GO RETURN OR REENTER OULORD, TAD OCHAR DCA I CHRPTR /STORE CHAR, ZAPPING HIGH-ORDER BITS ISZ CHRPTR /BUMP CHAR PTR F214, 214 /GUARD AGAINST OVFLO JMP MASOCM /RETURN OSUBR, 0 /ROUTINE TO PACK A HALFBYTE TAD OCHAR CLL RTL RTL /SHIFT CHAR 4 LEFT DCA OCHAR TAD I CHRPTR /CLEAR OUT ANY RESIDUE AND [377 /FROM HIGH-ORDER OF BUFFER WORD DCA I CHRPTR /IN CASE WE ARE WRITING AFTER A BACKSPACE. TAD OCHAR AND [7400 /GET 4 BITS TAD I CHRPTR DCA I CHRPTR /ADD INTO HIGH-ORDER OF BUFFER WORD ISZ CHRPTR /BUMP POINTER 200 /OVERFLOW! JMP I OSUBR MASSIO, 0 /SUBROUTINE TO READ/WRITE BUFFER IF NECESSARY CDF 0 TAD BUFCDF /ADD BUFFER CDF TO R/W BIT IN AC TAD (-6001 /TAKE AWAY CDF, LEAVE BIT 4 ON DCA IOCTL /STORE I/O CONTROL WORD TAD CHRPTR AND [377 SZA CLA /SEE IF POINTER IS AT BUFFER BOUNDARY JMP I MASSIO /YES - RETURN DOING NOTHING TAD RELBLK TAD STBLK /STORE BLOCK # IN HANDLER CALL DCA BLOCK TAD BADFLD AND [7400 DCA BUFFER /STORE BUFFER ADDRESS IN HANDLER CALL /CHARACTER OUTPUT - BUFFER I/O ROUTINE CONTINUED TAD TOTBLK CIA CLL TAD RELBLK SZL CLA /CHECK FOR FILE OVERFLOW IOVFLO, JMS I ERR /YES - ERROR TAD HCODEW JMS I (GETHND /GET HANDLER INTO FIELD 0 JMS I HAND /CALL HANDLER IOCTL, 0 BUFFER, 0 BLOCK, 0 SMA CLA /HANDLER ERROR - ABORT SKP /IF NOT EOF IOERR, JMS I ERR JMS I (RECOVR /CLEAR ANY FLAGS SET BY OS8 HANDLER ISZ RELBLK /BUMP RELATIVE BLOCK NUMBER TAD BUFFER DCA CHRPTR /RESET CHAR PTR JMP I MASSIO /RETURN /FPP CODE FOR I/O CONVERSION FDIV10, FDIV+LONG TEN FEXIT OCHAR, 0 /*** NEEDED FOR PADDING *** FMUL10, FMUL+LONG /FMUL10 MUST BE AT FDIV10+4 TEN FEXIT FWTOBL, FSUB+LONG ONE FDIV+LONG FLTG85 FEXIT PAGE /UNFORMATTED (BINARY) INPUT-OUTPUT RWUNF, JMS I [RWINIT /"READ(N)" OR "WRITE(N)" 1000 /"UNFORMATTED" BIT TAD SZLCLA /ENABLE SEQUENCE CHECKING UNFIO, DCA SEQCHK /*** SET SEQCHK TO "SZL CLA" OR "CLA" DCA RECCTR /ENTER HERE FROM DIRECT ACCESS TAD HAND SMA CLA /CHECK FOR MASS-STORAGE HANDLER JMP I [UNTERR /NO - ERROR JMS I [GETLMN /GET FIRST VARIABLE TAD RWFLAG SPA CLA RSETBP, TAD (125 /INITIALIZE COUNT TO -86 FOR WRITE, CMA /-1 FOR READ DCA CHRCTR TAD BADFLD AND [7400 DCA BIOPTR /INITIALIZE BUFFER POINTER TAD BADFLD AND [70 IAC CLL RTR /AC BIT 0 NOW ON TAD RWFLAG /AC BIT 0 CONTAINS COMP. OF R/W FLAG CLL RAR /AC=(.NOT.RW)*2000+BUFFER FIELD TAD (FSTA+LONG /AC=(FSTA OR FLDA) + BUFFLD DCA FGPBF JMP UIOVLP /SKIP FIRST VARIABLE FETCH/STORE BFINCR, JMS I [FPGO FGPBF /LOAD OR STORE A BUFFER ENTRY ISZ BIOPTR ISZ BIOPTR /INCREASE BUFFER POINTER ISZ BIOPTR JMS I [GETLMN /GET A VARIABLE FROM THE CALLING PROGRAM UIOVLP, TAD RWFLAG CLL RAR /LOWORDER BIT OF RWFLAG = END LIST FLAG SZL CLA JMP ENDUIO /NO MORE VARIABLES - TERMINATE ISZ CHRCTR /BUMP COUNTER JMP BFINCR /ROOM IN BUFFER - MOVE VARIABLE JMS UDOIO /GET A NEW BUFFER JMP RSETBP /RESET BUFFER POINTERS AND COUNTERS ENDUIO, TAD RWFLAG /COME HERE WHEN I/O LIST EXHAUSTED SPA CLA /WRITE? JMS UDOIO /YES - WRITE OUT THE LAST BUFFER JMP I [ENDIO /RESTORE DSRN ENTRY AND QUIT RECCTR, 0 /DIRECT-ACCESS I/O RWDACC, JMS I [RWINIT /"READ(N'R)" OR "WRITE(N'R)" 1000 /DIRECT ACCESS IS UNFORMATTED I/O TAD I XR DCA T /GET BLOCKS/RECORD FACTOR FROM D.A. TABLE JMS I [ARGLD /GET RECORD NUMBER JMS I [FFIX /CONVERT TO INTEGER TAD T TAD ACI ISZ T /MULTIPLY RECORD NUMBER BY BLOCKS/RECORD JMP .-2 /TO GET RELATIVE BLOCK NUMBER DCA RELBLK TAD I XR SNA /THIS LOC SHOULD NOT BE ZERO! DAERR, JMS I ERR DCA FGPBF /IT SHOULD BE AN FSTA + THE FIELD TAD I XR /IN WHICH THE CONTROL VARIABLE IS DCA BIOPTR /STORED. THE NEXT WORD IS THE ADDRESS JMS I [FPGO /OF THE CONTROL VARIABLE IN THAT FIELD FADD1 /ADD 1 TO RECORD # AND STORE IN CONTROL VAR TAD DUMPIT /*K* "DCA T" SAME AS "CLA" HERE JMP UNFIO /NOW GO DO A REGULAR BINARY READ/WRITE UDOIO, 0 ISZ RECCTR /BUMP NUMBER OF RECORDS TRANSFERRED TAD BADFLD AND [7400 TAD [377 /FORM POINTER TO LAST WORD IN BUFFER DCA BIOPTR TAD RECCTR JMS BUFFLD DCA I BIOPTR /FOR WRITE, PUT RECORD NUMBER IN 256TH WORD UDOIOL, DCA CHRPTR AC4000 AND RWFLAG JMS I [MASSIO /DO I/O (CHRPTR=0 TO FORCE I/O) JMS BUFFLD TAD RECCTR CMA STL /FOR READ, CHECK THE INPUT TAD I BIOPTR /SEQUENCE NUMBER TO MAKE SURE IT IS CDF 0 /NO LARGER THAN THE ONE WE EXPECT. SEQCHK, SZL CLA /*K* IF IT IS LARGER THIS IMPLIES THAT WE JMP I UDOIO /ARE STILL IN THE MIDDLE OF THE LAST JMP UDOIOL /RECORD AND SO WE READ AGAIN. /DEFINE FILE PROCESSOR DFINE, JMS I [RWINIT /SET UP A POINTER INTO THE D.A. TABLE 1000 /DIRECT ACCESS I/O IS UNFORMATTED JMS I [ARGLD /GET NUMBER OF RECORDS JMS I [FFIX TAD ACI CIA DUMPIT, DCA T /SAVE IT FOR MULTIPLY JMS I [ARGLD /GET THE NUMBER OF WORDS/RECORD JMS I [FPGO /CONVERT WORDS TO BLOCKS FWTOBL JMS I [FFIX /CONVERT TO INTEGER ISZ ACI TAD ACI /MULTIPLY THE NUMBER OF BLOCKS/RECORD ISZ T /BY THE NUMBER OF RECORDS JMP .-2 DCA RELBLK /TO GET THE FILE LENGTH IN BLOCKS TAD ACI CIA DCA I XR /STORE NUMBER OF BLOCKS/RECORD JMS I [ARGLD /GET POINTER TO CONTROL VARIABLE TAD FGPBF TAD (FSTA-FLDA /CHANGE A LOAD TO A STORE DCA I XR /SAVE "FSTA CONTROL-VARIABLE" TAD BIOPTR DCA I XR TAD TOTBLK CMA CLL TAD RELBLK /MAKE SURE WE HAVE ROOM FOR THE FILE SZLCLA, SZL CLA DFERR, JMS I ERR /WE DON'T AC7776 AND FFLAGS IAC /FORCE "END-FILED" BIT FOR CLOSE JMP I (SETTOT /SET LENGTH AND EXIT PAGE /SWAPPER AND ERROR ROUTINE SWAP, JMS I [FETPC /SWAPPER CALLING SEQUENCE: DCA T / TRAP3 SWAP TAD T / ADDR OVLY*4000000+LVL*100000+ENTRYADR AND [7 TAD (JA DCA STRTUP /STORE JA TO ENTRY POINT JMS I [FETPC DCA STRTUP+1 TAD T AND [70 CLL RAR /FORM 4*LVL TAD (OVLYTB /INDEX INTO LEVEL TABLE DCA ADR TAD T AND [7400 DCA T /T CONTAINS OVERLAY NUMBER IN BITS 0-3 CDF 0 /WATCH D.F.! TAD I ADR TAD T /SEE IF THIS OVERLAY IS IN CORE SNA CLA JMP ITSIN /YES - DON'T LOAD TAD T CIA DCA I ADR /MARK THIS OVERLAY IN CORE (OPTIMIST) ISZ ADR TAD I ADR AND [7400 DCA OVADR /SAVE INITIAL OVERLAY LOAD ADDRESS TAD I ADR AND [70 DCA OVIOW /AND FIELD ISZ ADR TAD I ADR /GET STARTING BLOCK OF THIS LEVEL DCA OVBLK ISZ ADR TAD I ADR DCA OVLEN /STORE LENGTH OF OVERLAY IN BLOCKS OVADLP, TAD T /LEVEL STARTING BLOCK + SNA /(OVERLAY #) * (OVERLAY LENGTH) JMP LOADOV /= OVERLAY STARTING BLOCK TAD [7400 DCA T TAD OVBLK TAD OVLEN DCA OVBLK JMP OVADLP /SWAPPER - CONTINUED LOADLP, DCA OVLEN /STORE UPDATED OVERLAY LENGTH TAD OVIOW /GET LAST READ CONTROL WORD RAL AND [7400 /CONVERT BLOCK COUNT TO WORD COUNT TAD OVADR /INCREMENT OVERLAY LOAD ADDRESS (LINK = 0) DCA OVADR RTL RTL /USE THE CARRY TAD OVIOW /TO INCREMENT THE LOAD FIELD IF NECESSARY AND [70 DCA OVIOW /OVIOW CONTAINS ONLY THE LOAD FIELD NOW LOADOV, TAD OVADR CIA /LOTSA CALCULATIONS HERE - OS/8 HANDLERS SNA /CAN'T READ MORE THAN 15 BLOCKS AT A TIME TAD [7400 /AND CANNOT READ OVER FIELD BOUNDARIES CLL RTL RTL /SO WE MUST BREAK UP THE OVERLAY READ CMA CML RAL /INTO SEVERAL SMALL READS OF MAXIMAL LENGTH. TAD OVLEN /THE NUMBER OF BLOCKS TO READ IS GIVEN BY: CMA /MINIMUM(B,L,15) SMA /WHERE B IS THE # OF BLOCKS LEFT IN THIS FIELD CLA /AND L IS THE # OF BLOCKS LEFT IN THE OVERLAY TAD OVLEN /AND 15 IS THE # OF BLOCKS A HANDLER CAN READ DCA T / ANSWER IN T TAD T CLL RTR RTR RTR /TURN NUMBER OF BLOCKS INTO 0S/8 BLOCK COUNT TAD OVIOW DCA OVIOW /ADD FIELD BITS AND STORE AS I/O CONTROL WD TAD OVHCDW /GET OVERLAY HANDLER CODE WORD JMS I (GETHND /LOAD HANDLER INTO FIELD 0 JMS I OVHND OVIOW, 0 OVADR, 0 OVBLK, 0 OVERR, JMS I ERR /WHOOPS - OVERLAY READ ERROR JMS RECOVR /CLEAR ANY NASTY FLAGS LEFT BY HANDLER TAD T TAD OVBLK DCA OVBLK /UPDATE BLOCK NUMBER TAD T CIA TAD OVLEN /BUMP DOWN RECORD COUNT SZA /SEE IF WE ARE DONE JMP LOADLP /NO - PREPARE FOR NEXT READ /OVERLAY IN CORE - EXECUTE IT ITSIN, JMS I [FPGO /START UP FPP STRTUP /AND JA TO ENTRY POINT TRAP5I, TRAP6I, TRAP7I, FPAUSE, FPPERR, JMS I ERR /SHOULD NEVER GET HERE STRTUP, 0;0 /JA ENTRY OVLEN, 0 OVHND, 0 /SET BY LOADER OVHCDW, 0 /SET BY LOADER RECOVR, 0 /ROUTINE TO CLEAN UP ANY FLAGS DCA CTCINH /LEFT ON BY SLOPPY OS/8 HANDLERS. YRCOVR, NOP NOP NOP NOP /RIGHT NOW I DON'T KNOW OF ANY. NOP NOP NOP NOP ION JMP I RECOVR FSTTMP, FSTA+LONG FTEMP FEXIT TEN, 4;2400;0;0;0;0 /10.0D0 FLTG85, 7;2520;0 /85.0 PAGE /INPUT BUFFER - CONTAINS STARTUP CODE INBUFR, -206 /LENGTH 0 /INPUT LINE BUFFER - FIRST A LITTLE PADDING, /RTS EXECUTION INITIALIZATION - IN INPUT BUFFER FPSTRT, 6601 /CLEAR DF32 FLAG PCF /HSP FLAG RRB /HSR FLAG PP7600, 7600 /CLEAR READER CHAR 6135 /CLEAR KW12 OR DK8-EP EVENT FLAGS CLA 6132 /STOP KW12 CLOCKS 6134 /DISABLE KW12 INTERRUPTS 6530 /CLEAR AD8-EA FLAGS 6050 /CLEAR VC8/E FLAG 6500 /DISABLE XY8/E INTERRUPTS STA 6130 /DISABLE DK8-EP INTERRUPTS CLA /LEAVE SPACE FOR ADDITIONAL CLEARS NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DCA EOLSW LDPROG, JMS I [FPGO /START UP FPP OR PSEUDO-FPP STSWAP HLTNOP, NOP /SET TO HLT IF /H SPECIFIED, JMP PRTCR /SKP IF /P SPECIFIED TAD .-1 DCA LDPROG /BYPASS LOADING ON STARTUP TAD PCHWD /HLT DCA I (PDPXIT+1 /ROUTINE TO PUNCH RTS+PROGRAM ON FORTRAN UNIT 9 (UNCOMMENTED) PPTR, TAD P11 PCKSUM, DCA ACI JMS I (LDDSRN SMA CLA JMP I [UNTERR JMP LDRTLR FLDLP, DCA PPTR DCA PCKSUM TAD (100 JMS SIXOUT JMS SIXOUT TAD FLD AND [70 JFMOUT, JMS I [FMTOUT /*K* ONLY WORKS FOR FIELD 0-3 TAD (100 JMS SIXOUT JMS SIXOUT FLD, CDF 0 TAD I PPTR CDF 0 JMS PCHWD ISZ PPTR P11, 11 ISZ PCTR JMP FLD TAD PCKSUM JMS PCHWD TAD FLD TAD (10 DCA FLD LDRTLR, TAD PP7600 DCA ACH TAD [200 JMS SIXOUT ISZ ACH JMP .-3 ISZ FCNT JMP FLDLP TAD (6000 DCA FFLAGS DCA I (ENDFLS /*K* SAME KLUDGE AS CALXIT JMS I (ENDFL DCA I (PDPXIT+1 /WIPE HALT SO WE CAN RETURN TO OS/8 JMP I (PDPXIT-1 PCHWD, HLT DCA ACH TAD ACH RTR RTR RTR AND [77 JMS SIXOUT TAD ACH AND [77 JMS SIXOUT JMP I PCHWD SIXOUT, 0 DCA T CLA IAC DCA EOLSW TAD PCKSUM TAD T DCA PCKSUM TAD T TAD (-300 JMS I [FMTOUT JMP I SIXOUT PCTR, 200 /DON'T PUNCH 07600! FCNT, 0 PRTCR, TAD (215 JMS I PTTY /PRINT CARRIAGE RETURN TAD JFMOUT DCA I (ERRENB /ENABLE ERROR TRACEBACK JMS I [FPGO STJUMP /NOW JUMP TO THE NEWLY-LOADED CODE STSWAP, TRAP3 /TRAP3 SWAP 0 .+1 TRAP3 HLTNOP PAGE STJUMP, 0 0 ZBLOCK INBUFR+210-. /PAD OUT TO END OF BUFFER /OVERLAY AND DSRN TABLES *.-4 /FIRST ENTRY IN OVLYTB ONLY NEEDED TO LOAD MAIN PGM OVLYTB, ZBLOCK 40 /OVERLAY TABLE DSRN, PTR; ZBLOCK 10 PTP; ZBLOCK 10 LPT; ZBLOCK 10 TTY; 0;0 1234 /*K* PREVENT PROBLEM IN ZBLOCK 5 /RWINIT INVOLVING WRITE /AFTER READ ON TELETYPE ZBLOCK 55 ZBLOCK 12 /FORMAT PARENTHESIS PUSHDOWN LIST FMTPDL, 0 /GUARD WORD PAGE /SOFTWARE FLOATING POINT ROUTINES WHICH ARE USED /EVEN IF FLOATING HARDWARE IS PRESENT /** MUST NOT DESTROY FAC! ** FFIX, 0 /ROUTINE TO FIX FAC STA /ANSWER IS RETURNED IN ACI TADACX, TAD ACX /ABS(FAC) MUST BE LESS THAN 2048 CLL /DETERMINE IF FAC EXPONENT IS TAD (-13 /BETWEEN 1 AND 14 SNA JMP FIXBIG /14 IS A SPECIAL CASE EAEFIX, DCA ACI SZL JMP FIXDNE /EXP GT 14 OR LT 1 - RETURN 0 TAD ACH JMP FIXISZ FIXLP, CLL /0 IN LINK SPA /IS IT LESS THAN 0? CML /YES-PUT A 1 IN LINK RAR /SCALE RIGHT FIXISZ, ISZ ACI /DONE YET? JMP FIXLP /NO FIXDNE, DCA ACI /RETURN WITH ANSWER IN ACI JMP I FFIX /RETURN FIXBIG, TAD ACL /IF EXP IS 14 WE MUST SHIFT AC FRACTION RAL /LEFT ONE PLACE TO INTEGERIZE IT. CLA TAD ACH RAL JMP FIXDNE /STORE ANSWER AND RETURN SETB, TAD DATAF DCA I (BASCDF /SET BASE PAGE LOCATION TAD ADR DCA BASADR JMP I FPNXT / /SHIFT FAC LEFT 1 BIT / AL1, 0 TAD AC1 /GET OVERFLOW BIT CLL RAL /SHIFT LEFT DCA AC1 /STORE BACK TAD ACL /GET LOW ORDER MANTISSA RAL /SHIFT LEFT DCA ACL /STORE BACK TAD ACH /GET HI ORDER RAL DCA ACH /STORE BACK JMP I AL1 /RETN. / /SHIFT FAC RIGHT-ENTER WITH COUNT-1 IN AC (POSITIVE) / ACSR, 0 CMA /AC CONTAINS COUNT-1 DCA AC0 /STORE COUNT LOP1, TAD ACH /GET HIGH ORDER MANTISSA CLL SPA /PROPAGATE SIGN CML RAR /SHIFT RIGHT 1, PROPAGATING SIGN DCA ACH /STORE BACK TAD ACL /GET LOW ORDER RAR /SHIFT IT DCA ACL /STORE BACK ISZ ACX /INCREMENT EXPONENT NOP ISZ AC0 /DONE? JMP LOP1 /NO-LOOP RAR DCA AC1 /SAVE 1 BIT OF OVERFLOW JMP I ACSR /YES-RETN-AC=L=0 / /FLOATING NEGATE / FFNEG, 0 /(USED AS A TEM. BY OUTPUT ROUTINE) TAD ACL /GET LOW ORDER FAC CLL CMA IAC /NEGATE IT DCA ACL /STORE BACK CML RAL /ADJUST OVERFLOW BIT AND TAD ACH /PROPAGATE CARRY-GET HI ORD CLL CMA IAC /NEGATE IT DCA ACH /STORE BACK JMP I FFNEG OADD, 0 /ADD OPERAND TO FAC CLL TAD AC2 /ADD OVERFLOW WORDS TAD AC1 DCA AC1 RAL /ROTATE CARRY TAD OPL /ADD LOW ORDER MANTISSAS TAD ACL DCA ACL RAL TAD OPH /ADD HI ORDER MANTISSAS TAD ACH DCA ACH JMP I OADD /RETN. FETPC, 0 ISZ PC JMP PCCDF /NO FIELD BUMP ISZ APT /BUMP FIELD FOR FPP RESTART (IN CASE FPP EXISTS) FPC10, 10 /PROTECTION FOR ISZ TAD PCCDF TAD FPC10 DCA PCCDF PCCDF, HLT TAD I PC JMP I FETPC EEPUT, STL /EXTENDED PRECISION STORE EEGET, DCA ADR /EXTENDED PRCISION FETCH TAD [-6 DCA DATCDF SNL AC2000 /SET UP "TAD ACX" OR "DCA ACX" TAD TADACX DCA EEINST EELOOP, SNL /LINK=1 MEANS STORE TAD I ADR EEINST, HLT SZL DCA I ADR ISZ ADR SKP JMS I (DFBUMP ISZ EEINST ISZ DATCDF JMP EELOOP JMP I FPNXT FSTTM2, FSTA+LONG FTEMP2 FEXIT / FTEMP, ZBLOCK 6 / PAGE /RUN-TIME SYSTEM ERROR LIST ERRLST, VARGER; ARGMSG UERR; UMSG FPOERR; FPOMSG FMTERR; FMTMSG UNTERR; UNTMSG CTLBER; CTLBMS INER; INMSG IOVFLO; IOVMSG IOERR; IOMSG DAERR; DAMSG FPPERR; FPPMSG OVERR; OVMSG EOFERR; INEMSG FPOVER; OFLMSG DFERR; DFMSG -1; DV0MSG /BY ELIMINATION /RTS ERROR MESSAGES ARGMSG, TEXT /BAD ARG/ UMSG, TEXT /USER ERROR/ FPOMSG, TEXT /PARENS TOO DEEP/ FMTMSG, TEXT /FORMAT ERROR/ UNTMSG, TEXT /UNIT ERROR/ INMSG, TEXT /INPUT ERROR/ OVMSG, TEXT /OVERLAY / *.-1 IOMSG, TEXT %I/O ERROR% DAMSG, TEXT /NO DEFINE FILE/ FPPMSG, TEXT /FPP ERROR/ INEMSG, TEXT /EOF ERROR/ DV0MSG, TEXT /DIVIDE BY 0/ DFMSG, TEXT /D.F. TOO BIG/ IOVMSG, TEXT /FILE / *.-1 OFLMSG, TEXT /OVERFLOW/ CTLBMS, TEXT /^B/ USRERR, TAD ERRFLG /USER ERROR - OPTIONALLY NON-FATAL DCA FATAL UERR, JMS I ERR /PRINT MESSAGE JMP I [RETURN /IF NON-FATAL, CONTINUE PROCESSING ERRFLG, 0 /SET TO NON-ZERO IF /E SWITCH SPECIFIED TRPPRT, TRAP3 /CODE WHICH IS LOADED INTO PROGRAM PROLOGUES PRTNAM /BY THE ERROR TRACEBACK ROUTINE PAGE MAKCDF, 0 /ROUTINE TO MAKE A CDF FROM AC9-11 RTL RAL AND [70 TAD ERCDF /STRAIGHTFORWARD ENOUGH, ISN'T IT? JMP I MAKCDF RD2WR, 0 /ROUTINE CALLED WHEN SWITCHING STA /FROM READ TO WRITE. (CALLED ONLY ONCE!) TAD RELBLK /BUMP BLOCK # BACK FROM "NEXT BUFFER'S BLOCK #" DCA RELBLK /TO "THIS BUFFER'S BLOCK #". TAD CHRCTR /HOWEVER, IF WE ARE AT THE VERY END OF A IAC /BUFFER, WRITE ROUTINE EXPECTS US TO SZA CLA /BE AT THE BEGINNING OF THE NEXT BUFFER, JMS I [MASSIO /SO RE-READ THIS BUFFER AND SET POINTERS JMP I RD2WR /RUN-TIME-SYSTEM ERROR ROUTINE ERROR, 0 ERCDF, CDF 0 CLA TAD (ERRLST-2 DCA XR ERRLP, ISZ XR /SEARCH ERROR LIST FOR CALLING ADDRESS TAD I XR /ERROR LIST CONTAINS CMA SZA /CALLING ADDRESSES AND TAD ERROR /CORRESPONDING MESSAGES SZA CLA JMP ERRLP TAD I XR DCA I (FMTADR DCA I (FMTDF TAD PTTY DCA HAND /QUICK FUDGE FOR TTY OUTPUT DCA HCODEW /TO SET CARRIAGE CONTROL AC4000 DCA RWFLAG JMS I [EOLINE /TYPE CARRET AND SET EOLSW DCA FMTBYT /INITIALIZE MESSAGE PTR ERPTLP, JMS I [FMTOUT /OUTPUTS LF FIRST TIME JMS I [FMTGCH /GET CHAR USING FORMAT ROUTINES ISZ FMTBYT SZA JMP ERPTLP /LOOP UNTIL 0 CHAR /PRINT ROUTINE NAME AND LINE NUMBER PRTNAM, TAD [40 ERRENB, JMP I E7605 /*K* IN CASE INITIALIZATION OR /P GET ERRORS / PREVIOUS LINE REPLACED WITH: / JMS I [FMTOUT /OUTPUT A BLANK(LF ON EXTRA LINES) JMS I [FPGO /START UP FPP GTNMPT /GET POINTER TO NAME IN FAC TAD ACH DCA I (FMTDF /SET UP FORMAT GET CHARACTER ROUTINE TAD ACL /TO GET CHARACTERS OF ROUTINE NAME DCA I (FMTADR DCA FMTBYT TAD [-6 DCA ISN /6 CHARACTER NAME PRTNML, JMS I [FMTGCH SNA TAD [40 /AVOID PRINTING RANDOM @S JMS I [FMTOUT /GET AND PRINT A CHARACTER ISZ FMTBYT ISZ ISN JMP PRTNML TAD [40 JMS I [FMTOUT /SEPARATE THE NAME BY A SPACE TAD [-4 /FROM THE LINE NUMBER. DCA ISN PTLNLP, TAD ISN+1 CLL RTL RAL DCA ISN+1 /PRINT LINE NUMBER IN OCTAL TAD ISN+1 /BECAUSE THAT IS THE WAY IT APPEARS RAL /IN THE FORTRAN PROGRAM LISTING AND [7 JMS I (DIGIT ISZ ISN JMP PTLNLP JMS I [EOLINE /OUTPUT FINAL CR TAD FATAL SNA CLA /FATAL ERROR? JMP TRCBAK /YES - GIVE FULL TRACEBACK DCA FATAL /"NON-FATAL" FLAG MUST BE SET EACH TIME JMP I ERROR TRCBAK, JMS I [FPGO /START UP FPP UP1LEV /MOVE UP TO CALLING ROUTINE /FPP CODE DOES A "TRAP3 PRTNAM" ISN, 0;0 /FPP CODE FOR ERROR ROUTINE GTNMPT, STARTD XTA 0 /LOAD LINE NUMBER FROM XR 0 FSTA+LONG ISN /STORE AWAY FLDA+BASE 10 /LOAD POINTER TO PROLOGUE FSUB+LONG THREE /NAME IS 3 LOCATIONS BEFORE PROLOGUE STARTF /FOR NON-FPP VERSION THREE, FEXIT;3 /*K* DEPENDS ON FACT THAT FEXIT=0 UP1LEV, STARTD FLDA+BASE 11 /GET THE UPWARD POINTER JNE NOTMN /ZERO MEANS MAIN PROGRAM TRAP3 E7605, 7605 /GO AWAY IF MAIN PROGRAM NOTMN, FSTA+BASE 0 LDX 1 2 /WE WILL STORE A "TRAP3 PRTNAM" FLDA+LONG /IN THE FIFTH LOCATION OF THE PROLOGUE, TRPPRT FSTA+IND 0+10 /WHERE THE FIRST 4 LOCS WERE A SETX AND SETB. FLDA+BASE 0 /GET THE PROLOGUE ADDRESS AGAIN JAC /JUMP TO IT. ACMDGT, FMUL+LONG TEN FSTA+LONG FTEMP FLDA+LONG DGT /GET UNNORMALIZED DIGIT INTO AC FNORM /NORMALIZE IT FADTMP, FADD+LONG FTEMP FEXIT LPBUFR, ZBLOCK 4 LPBUF2 PAGE HPLACE, /ZBLOCK 400 /HANDLER SWAP AREA /VARIOUS INITIALIZATION STUFF OVERLAYING THE RTS HANDLER AREA QLHDR, 0 /SHOULD BE A 2 FOR A LOADER IMAGE QRTSWP, ZBLOCK 2 /INITIAL SWAP ARGS TO LOAD USER MAIN QHGHAD, ZBLOCK 2 /HIGHEST ADDRESS USED QVERNO, 0 /LOADER VERSION # QDPFLG, 0 /"PROGRAM USES D.P." FLAG QUSRLV, ZBLOCK 40 /USER OVERLAY INFO /EAE OVERLAY TO FIX AND FLOAT EFXFLT, RELOC EAEFIX FIXEAE, CMA DCA FIXSH /SHIFT COUNT BETWEEN 0 AND 12 SZL JMP FIX0 /NOT INTEGERIZABLE TAD ACH ASR FIXSH, 0 FIX0, DCA ACI JMP I FFIX FXFLTC= .-FIXEAE RELOC /SUBR TO DETERMINE MACHINE SIZE - RETURNS NUMBER OF /BANKS IN AC. /MUST RUN IN FIELD 0. CORE, 0 TAD C6203 RDF DCA CORRET CORELP, CDF 0 /NEEDED FOR PDP-8L TAD I C7777 AND COR70 /IF BITS 6-8 OF LOCATION 7777 ARE NOT ZERO, CLL RTR /THEY SPECIFY THE LAST FIELD OF CORE RAR /WHICH WE SHOULD USE. SZA JMP CORRET /SO RETURN THAT AMOUNT TAD TRYFLD /GET FLD TO TST CLL RTL RAL AND COR70 /MASK USEFUL BITS TAD CORELP DCA COR706 /SET UP CDF TO FLD COR706, 0 TAD I CORLOC /SAV CURRENT CONTENTS NOP /HACK FOR PDP-8 DCA .-3 TAD .-2 /7000 IS A GOOD PATTERN DCA I CORLOC COR70, 70 /HACK FOR PDP-8.,NO-OP TAD I CORLOC /TRY TO READ BK 7000 CO7400, 7400 /HACK FOR PDP-8,.NO-OP TAD CO7400 /GUARD AGAINST WRAP AROUND TAD CORLOC+1 /TAD 1400 SZA CLA JMP .+5 /NON EXISTENT FLD EXIT TAD COR706 /RESTORE CONTENS DESTROYED DCA I CORLOC ISZ TRYFLD /TRY NXT HIGHER FLD JMP CORELP STA TAD TRYFLD CORRET, 0 JMP I CORE CORLOC, CO7400 /ADR TO TST IN EACH FLD 1400 /7000+7400+1400=0 TRYFLD, 1 /CURRENT FLD TO TST C6203, 6203 C7777, 7777 DPTEST, STARTE /EXECUTED BY FPP DURING INITIALIZATION FEXIT /CHECK WHETHER DOUBLE PRECISION ENABLED /TABLE OF MODIFICATIONS TO MAKE TO FRTS FOR BACKGROUND OPERATION /UNDER RTS-8. FORMAT OF TABLE IS: POINTER TO FIRST WORD OF BLOCK - 1 / (0 TERMINATES) FOLLOWED BY LIST OF REPLACEMENT WORDS (0 TERMINATES). BKRLST, YLPT-1 /LINE PRINTER OUTPUT ROUTINE RELOC YLPT LLS CLA /DON'T DO RING-BUFFERING - JUST "OUTPUT" CHAR. JMS CTCBCK /CHECK FOR ^C OR ^B JMP I LPT FJCTCT, JMS CTCBCK /COME HERE FROM INTERPRETED FPP JUMPS JMP I FPNXT /CHECK FOR ^C,^B AND RETURN TO INTERPRETER RELOC 0 YPTP-1 /PAPER-TAPE PUNCH ROUTINE CLA /ALL PAPER-TAPE I/O ILLEGAL 0 YPTR-1 /PAPER TAPE READER ROUTINE CLA /ALL PAPER-TAPE I/O ILLEGAL 0 YTTY-1 /TELETYPE INPUT/OUTPUT ROUTINE RELOC YTTY SNA JMP KBDRTS /AC=0 MEANS INPUT TSF JMP .-1 /HANG UNTIL OUTPUT BUFFER NOT FULL TLS CLA JMS CTCBCK /CHECK FOR ^C OR ^B TYPED JMP I TTY KBDRTS, KSF JMP .-1 /HANG UNTIL CHAR RECEIVED JMS CTCBCK /CHECK FOR ^C OR ^B KRB AND KB177 /STRIP PARITY TAD KB177 IAC /NOW FORCE PARITY BIT ON (177+1=200) JMP I TTY CTCBCK, . /*K* CAN'T BE 0! KRS /PEEK AT NEXT CHAR IN BUFFER AND KB177 TAD KBM2 CLL RAR SNA CLA /IS IT ^C OR ^B? KSF /AND IS IT REALLY PENDING? JMP I CTCBCK /NO - JUST RETURN WITH AC=0 JMP BEEORC /TERMINATE JOB - LINK HAS ^C/^B FLAG KB177, 177 KBM2, -2 RELOC 0 /CONTINUATION OF TABLE OF RTS-8 OVERLAYS TO FRTS YHIOF-1 /"GET OS/8 HANDLER" ROUTINE NOP /ELIMINATE "IOF" INSTRUCTION 0 YRCOVR-1 /"RECOVER FROM OS/8 HANDLER" ROUTINE RELOC YRCOVR JMP I RECOVR /SHORT-CIRCUIT PORTION OF ROUTINE WHICH DOES RELOC /AN "ION" 0 YFJMP-1 /FPP INTERPRETER - SUCCESSFUL JUMP SECTION FJCTCT /TEST FOR ^C OR ^B TYPED BEFORE 0 /RETURNING TO THE INTERPRETER 0 /** LIST TERMINATOR ** /ERROR MESSAGES FOR RUN-TIME LOADER - IN HANDLER BUFFER /*K* CANNOT LOAD BELOW HPLACE+200 AS HPLACE-HPLACE+177 ARE DESTROYED BY HEADER! IFNZRO .-HPLACE-200&4000 <__ERROR__> NOLI, TEXT /NOT A LOADER IMAGE/ NONMSG, TEXT /NO NUMERIC SWITCH/ FILMSG, TEXT /FILE ERROR/ SYSMSG, TEXT /SYSTEM DEVICE ERROR/ TOOMCH, TEXT /MORE CORE REQUIRED/ TOMNYH, TEXT /TOO MANY HANDLERS/ LIOEMS, TEXT /CAN'T READ IT!/ NODPMS, TEXT /CAUTION - NO DP/ XVERMS, TEXT /FRTS V/ *.-1 XVERSN&70^7+XVERSN+4060 /VERSION NUMBER IN SIXBIT XPATCH&77^100+40 /PATCH LEVEL TEXT / / PAGE /FPP INTERPRETER STARTUP ROUTINE FPPINT= . /FOR FPP OVERLAY RETURN, JMP I FPNXT /RETURN DOES SOMETHING DIFFERENT IF FPP PRESENT FPGO, 0 FPGCDF, CDF 0 /NECESSARY? CLA TAD PC DCA SAVPC /ALLOW ONE LEVEL OF RECURSIVENESS TAD I (PCCDF DCA SPCCDF STA TAD I FPGO DCA PC ISZ FPGO TAD FPGCDF /FPGO STARTS UP THE FPP FROM FIELD 0 ONLY DCA I (PCCDF JMP I FPNXT EXIT, TAD SAVPC DCA PC TAD SPCCDF DCA I (PCCDF /RESTORE OLD PC JMP I FPGO /RETURN TO PDP-8 CODE SAVPC, 0 SPCCDF, 0 FPXTA, TAD [27 /XR TO AC - NORMALIZE IF FLOATING MODE DCA ACX JMS DATCDF TAD I ADR CLFAC, DCA ACL TAD ACL SPA CLA /SIGN-EXTEND 12-BIT WORD STA /INTO FAC FRACTION DCA ACH NRMFAC, DCA AC1 /CLEAR OVERFLOW WORD TAD DFLG SPA SNA CLA /UNLESS WE ARE IN D.P.I. MODE, JMS I NORMX /NORMALIZE THE FAC JMP I FPNXT /MISCELLANEOUS JUMP CLASS INSTRUCTIONS JSA, TAD ADR DCA PUTM TAD DATAF DCA JSCDF /SET UP LOC TO SAVE PC IN AC0002 TAD ADR DCA ADR /BUMP ADDRESS BY 2 RTL RTL TAD DATAF DCA DATAF /INCLUDING DATA FIELD JSAR, TAD I (PCCDF /JSA/JSR COMMON CODE CLL RTR RAR ISZ PC /BUMP PC BEFORE STORING SKP IAC /INCLUDING FIELD BITS TAD (JA-2620 /FORM "JA" INSTRUCTION JSCDF, HLT DCA I PUTM ISZ PUTM SKP JMS I (DFBUMP /BUMP TARGET ADDRESS TAD PC DCA I PUTM JMP I (DOJMP /NOW JUMP TO DESTINATION JSR, CLA CLL IAC TAD BASADR DCA PUTM RTL RTL TAD I (BASCDF /SET JSCDF&PUTM TO BASE PAGE LOC +1 DCA JSCDF JMP JSAR FPJAC, TAD ACL DCA ADR TAD ACH JMS I MCDF DCA DATAF JMP I (DOJMP SPCATX, TAD ACL SKP FPLDX, JMS I [FETPC JMS DATCDF DCA I ADR /SET XR TO NEXT INST WD JMP I FPNXT /MORE INDEX REGISTER & AC-TO-MEMORY INSTRUCTIONS ADDX, JMS I [FETPC JMS DATCDF TAD I ADR /ADD NEXT INST WD TO XR JMP FPLDX+1 ATX, TAD DFLG /ATX WORKS DIFFERENTLY IN D.P.I. MODE SMA SZA CLA JMP SPCATX JMS I NORMX /FAC MAY NOT BE NORMALIZED JMS I [FFIX TAD ACI JMP FPLDX+1 OPMEM, DCA AD1 /GENERAL AC-TO-MEMORY INTERPRETER TAD AD1 DCA AD2 RDF CLL RTR RAR TAD KLUDGM /FORM FSTA X INSTRUCTION DCA PUTM AC2000 AND INST /TURN OP 5 TO OP 1, SZA CLA TAD [3000 / OP 7 TO OP 4. TAD [3000 TAD PUTM /STICK IN FIELD BITS DCA OPM JMS I [FPGO KLUDGM JMP I FPNXT KLUDGM, FSTA+LONG FTEMP /SAVE AC OPM, 0 AD1, 0 /PERFORM OP PUTM, 0 AD2, 0 /STORE RESULT FLDA+LONG FTEMP /RESTORE AC FEXIT NORMX, FFNOR /*K* CHANGED TO EFFNOR IF EAE PAGE /MAIN INTERPRETER LOOP NEGFAC, JMS I [FFNEG ICYCLE, CLA JMS I [FETPC /GET INST DCA INST TAD INST CLL RTL RTL SMA /SKIP IF BASEPAGE ADDRESSING JMP LONGI AND [7 TAD BASJMP DCA OPJMP /SAVE OPCODE CALL ADDRESS TAD INST /DATA FIELD IS STILL SET UP SZL /SO IS LINK (WITH INSTRUCTION BIT 3) JMP BPAGEI /INDIRECT ADDRESSING CLL RAL TAD INST /MULTIPLY BASE OFFSET BY 3 TAD [200 /ELIMINATE ANY AND (777 /HIGH ORDER BITS IMFUDJ, CLL /CLL IAC IF D.P. INTEGER MODE TAD BASADR /ADD IN BASE PAGE ORIGIN BASCDF, HLT /CDF TO BASE PAGE FIELD SZL JMS DFBUMP /BUMP DF IF ADDITION OVERFLOWED OPJCLL, CLL OPJMP, HLT /JMP I EXECUTIONROUTINE BPAGEI, AND [7 DCA ADR TAD ADR CLL CML RAL TAD ADR /FORM 3*OFFSET+1 TAD BASADR DCA ADR RTL RTL TAD BASCDF /FORM PROPER CDF DCA ADDRLO ADDRLO, HLT /EXECUTE IT TAD I ADR /GET FIELD BITS OF REAL ADDRESS DCA ADDRHI /FROM 2D WORD OF BASE PAGE LOC ISZ ADR SKP JMS DFBUMP /WATCH FOR FIELD OVERFLOW TAD I ADR /GET LOW-ORDER ADDRESS FROM 3D WORD JMP INDEX /NOW GO DO INDEXING (IF ANY) /COME HERE IF BIT 4 OF INSTRUCTION IS OFF LONGI, AND [7 SNL /TEST BIT 3 OF INSTRUCTION JMP I (SPECAL /SPECIAL INSTRUCTION TAD BASJMP DCA OPJMP TAD INST DCA ADDRHI /HIGH-ORDER ADDRESS BITS IN INST WD JMS I [FETPC /NEXT INST WORD CONTAINS LOW-ORDER ADDRESS INDEX, DCA ADDRLO TAD INST AND [70 SNA /IS XR NUMBER 0? JMP NOINDX /YES - NO INDEXING JMS DCDIDX /GET XR VALUE (MAYBE INCREMENTED) AC7775 TAD DFLG /GET -3 IF F, -2 IF D, -6 IF E MODE DCA DCDIDX TAD ADDRLO XRADLP, CLL TAD I T SZL ISZ ADDRHI ISZ DCDIDX /ADD THE XR IN THE PROPER NUMBER OF TIMES JMP XRADLP DCA ADDRLO NOINDX, TAD ADDRHI JMS I MCDF DCA ADDRHI /TURN HIGH-ORDER ADDRESS INTO A CDF ADDRHI, HLT /AND EXECUTE IT TAD ADDRLO JMP OPJCLL /GO EXECUTE THE INSTRUCTION DFBUMP, 0 /BUMP DATA FIELD DCA DFTMP /SAVE AC RDF TAD (CDF 10 DCA .+1 HLT TAD DFTMP /RESTORE AC JMP I DFBUMP DFTMP, 0 DCDIDX, 0 CLL RTR RAR TAD XRBASE /ADD IN BASE ADDRESS OF XR ARRAY XRCDF, HLT /CDF TO XR ARRAY FIELD SZL JMS DFBUMP /OR MAYBE NEXT FIELD DCA T /SAVE POINTER TO XR TAD INST AND DCD100 SZA CLA /INCREMENT BIT ON? ISZ I T /YES - BUMP XR DCD100, 100 /** PROTECTION JMP I DCDIDX BASJMP, JMP I JMPTB1 /JMP I JMPTB2 FOR D.P. MODE JMPTB1, FFGET / F MODE (FLOATING POINT) FFADD FFSUB FFDIV FFMPY OPMEM /FADDM FFPUT OPMEM /FMULM DDGET / D MODE ( DOUBLE PRECISION INTEGER) DDADD DDSUB DDDIV DDMPY OPMEM /DADDM DDPUT OPMEM /DMULM EEGET / E MODE ( 6 WD FLOATING POINT) FFADD FFSUB FFDIV FFMPY OPMEM EEPUT OPMEM PAGE /MORE I CYCLE SPECAL, SNA JMP XRINST /OPCODE 0 HAS MANY MANSIONS TAD SPECOP DCA SPCJMP /GET OPCODE JUMP ADDRESS JMS I [FETPC DCA ADR TAD INST /ALL OF THESE ARE TWO-WORD INSTRUCTIONS JMS I MCDF /SO FORM THE ADDRESS NOW DCA DATAF CDF 0 TAD INST SPCJMP, HLT XRINST, TAD INST AND (7770 CDF 0 SNA CLA /IF SUB-OPCODE IS ZERO, JMP OPERAT /DECODE SUB-SUB-OPCODE TAD INST AND [7 CLL TAD XRBASE DCA ADR /COMPUTE INDEX REGISTER ADDRESS RTL RTL TAD I (XRCDF DCA DATAF XJCOMN, TAD INST CLL RTR RAR AND [77 /GET OPCODE - HIGH ORDER 2 BITS ARE 0 OXCOMN, TAD (JMP I SP2 DCA .+1 /EXECUTE APPROPRIATE JUMP HLT OPERAT, TAD INST CIA JMP OXCOMN SETX, TAD DATAF /SET XR0 LOC DCA I (XRCDF TAD ADR DCA XRBASE JMP I FPNXT /JUMP DECODER JUMPS, AND (100 /INSTRUCTION IN AC CLL RTR /20 IN AC IF NOT COND. JUMP SZA /IF NOT COND. JUMP, DECODE FURTHER JMP XJCOMN TAD INST AND [70 CLL RTR RAR TAD (CNDSKT DCA T /INDEX INTO CONDITIONAL SKIP TABLE TAD I T DCA CNDSKP TAD ACH SZA JMP CNDSKP TAD ACL SZA CLA /IF HIGH ORDER ZERO, AC MIGHT BE UNNORMALIZED. IAC /USE LOW ORDER ON 0/NOT 0 BASIS CNDSKP, HLT /TEST AC JMP I FPNXT /FAILED - DON'T JUMP DOJMP, STA CLL TAD ADR DCA PC SNL TAD (-10 TAD DATAF CDF 0 DCA I (PCCDF /ADDRESS-1 TO PC JMP I .+1 YFJMP, ICYCLE /** CHANGED IF RUNNING UNDER RTS-8 JXN, AND [70 /GET XR FIELD JMS I (DCDIDX /GET XR VALUE WITH INCREMENTING TAD I T SNA CLA /ZERO? JMP I FPNXT /YES JMP DOJMP /JUMP ON INDEX NON-ZERO, RIGHT? CNDSKT, SZA CLA /JEQ SPA CLA /JGE SMA SZA CLA /JLE SKP CLA /JA SNA CLA /JNE SMA CLA /JLT SPA SNA CLA /JGT JMP TSTALN /JAL TSTALN, CLA TAD ACX TAD (-27 SPA SNA CLA JMP I FPNXT JMP DOJMP /OPCODE TABLES SPECOP, JMP I SPECOP /SPECIAL OPCODE TABLE JUMPS JXN TRAP3I TRAP4I TRAP5I TRAP6I TRAP7I FPJAC STRTD STRTF NRMFAC NEGFAC CLFAC FPAUSE SP2, EXIT ALN ATX FPXTA ICYCLE /NOP STRTE ICYCLE /UNDEF OP ICYCLE /" FPLDX ADDX SETX SETB JSA JSR PAGE /MISCELLANEOUS OPCODE ROUTINES TRAP3I, TRAP4I, AC0002 TAD DATAF DCA .+1 /FORM CDF CIF N HLT /EXECUTE IT TAD INST SMA CLA /TRAP4 JMS'S TO ITS TARGET ADDRESS, JMP I ADR /TRAP3 JMP'S TO IT JMS I ADR JMP I FPNXT ALN, TAD ACX /ALIGN SIMULATOR DCA OPX /SAVE EXPONENT IN CASE WE'RE IN D.I. MODE TAD DFLG SMA SZA CLA DCA ACX /ZERO EXP IF D.I. MODE JMS DATCDF /SET TO XR FIELD TAD INST AND [7 TAD DFLG /IF WE'RE IN FLOATING POINT MODE, SNA CLA /AND DOING AN "ALN 0", TAD [27 /ALIGN UNTIL EXPONENT = 23 SNA TAD I ADR /OTHERWISE ALIGN UNTIL EXPONENT = XR VALUE CDF 0 CIA TAD ACX CMA /FORM DIFFERENCE - 1 SPA /IF EXPONENT IS LARGER THEN DESIRED EXPONENT, JMP ALNSHL /SHIFT LEFT JMS I [ACSR /OTHERWISE SHIFT RIGHT ALNXIT, TAD DFLG SPA SNA CLA /IF DOUBLE INTEGER MODE, JMP I FPNXT TAD OPX /ALIGNMENT LEAVES THE EXPONENT UNCHANGED DCA ACX JMP I FPNXT ALNSHL, DCA T /STORE SHIFT COUNT SKP /SHIFT LEFT ONE LESS THAN COUNT JMS I [AL1BMP ISZ T JMP .-2 JMP ALNXIT /GO TO COMMON CODE /ARG FETCH SUBROUTINES AND MODE CHANGE OPERATORS DARGET, 0 DCA ADR TAD DARGET DCA ARGET DCA ACX JMP ARGET2 /FAKE OUT FLOATING POINT ROUTINE ARGET, 0 /SUBROUTINE TO FETCH ARG FOR ADD, SUBT, ETC. DCA ADR /STORE ADDRESS OF OPERAND TAD I ADR /PICK UP EXPONENT ISZ ADR /MOVE POINTER TO HI MANTISSA WD SKP JMS I (DFBUMP ARGET2, DCA OPX TAD I ADR /PICK IT UP DCA OPH /STORE ISZ ADR /MOVE PTR. TO LO MANTISSA WD. SKP JMS I (DFBUMP /WATCH THOSE FIELD TRANSITIONS! TAD I ADR /PICK IT UP DCA OPL /STORE IT CDF 0 JMP I ARGET /RETURN STRTE, TAD DFLG /START EXTENDED PRECISION MODE SPA CLA JMP .+4 /CLEAR EXTENDED FAC DCA EAC1 /IF NOT ALREADY IN E MODE DCA EAC2 DCA EAC3 AC7775 DCA DFLG JMP DFECMN STRTD, CLA IAC /START DOUBLE PRECISION INTEGER MODE STRTF, DCA DFLG /START FLOATING POINT MODE TAD DFLG DFECMN, TAD (CLL DCA I (IMFUDJ /SET D.P.I FUDGE TO "CLL" OR "CLL IAC" TAD DFLG SPA CMA /CHANGE -3 FOR E MODE TO +2 CLL RTL RAL TAD (JMPTB1&177+5600 DCA I (BASJMP JMP I FPNXT /DOUBLE PRECISION INTEGER OPERATORS DDSUB, JMS DARGET JMS I (OPNEG SKP DDADD, JMS DARGET DCA AC1 /CLEAR OVERFLOW JUSTINCASE JMS I [OADD JMP I FPNXT FFGET, DCA ADR /GET A FLOATING POINT NUMBER TAD I ADR DCA ACX /SAVE EXPONENT ISZ ADR JMP .+3 /NO FIELD OVERFLOW JMS I (DFBUMP /BUMP DATA FIELD DDGET, DCA ADR /SUAVE - ENTRY POINT FOR D.P. INTEGER GET TAD I ADR DCA ACH ISZ ADR SKP JMS I (DFBUMP TAD I ADR DCA ACL JMP I FPNXT FFPUT, DCA ADR /STORE A FLOATING POINT NUMBER TAD ACX /GET FAC AND STORE IT DCA I ADR /AT SPECIFIED ADDRESS ISZ ADR JMP .+3 JMS I (DFBUMP DDPUT, DCA ADR /ENTRY FOR D.P. INTEGER PUT TAD ACH DCA I ADR ISZ ADR SKP JMS I (DFBUMP TAD ACL DCA I ADR JMP I FPNXT PAGE FPPKG= . /FOR EAE OVERLAY /23-BIT FLOATING PT INTERPRETER /W.J. CLOGHER, MODIFIED BY R.LARY FOR FORTRAN LPBUF2, ZBLOCK 16 LPBUF3 AL1BMP, 0 /*K* UTILITY SUBROUTINE - USED BY INTERPRETER STA TAD ACX DCA ACX JMS I [AL1 JMP I AL1BMP /FLOATING MULTIPLY-DOES 2 24X12 BIT MULTIPLIES DDMPY, JMS I (DARGET SKP FFMPY, JMS I (ARGET /GET OPERAND JMS MDSET /SET UP FOR MPY-OPX IN AC ON RETN. TAD ACX /DO EXPONENT ADDITION DCA ACX /STORE FINAL EXPONENT DCA MDSET /ZERO TEM STORAGE FOR MPY ROUTINE DCA AC2 TAD ACH /IS FAC=0? SNA CLA DCA ACX /YES-ZERO EXPONENT JMS MP24 /NO-MULTIPLY FAC BY LOW ORDER OPR. TAD OPH /NOW MULTIPLY FAC BY HI ORDER MULTIPLIER DCA OPL JMS MP24 TAD AC2 /STORE RESULT BACK IN FAC DCA ACL /LOW ORDER TAD MDSET /HIGH ORDER DCA ACH TAD ACH /DO WE NEED TO NORMALIZE? RAL SMA CLA JMS AL1BMP /YES-DO IT FAST TAD AC1 SPA CLA /CHECK OVERFLOW WORD ISZ ACL /HIGH BIT ON - ROUND RESULT JMP MDONE ISZ ACH /LOW ORDER OVERFLOWED - INCREMENT HIGH ORDER TAD ACH SPA /CHECK FOR OVERFLOW TO 4000 0000 JMP I (SHR1 /WE HANDLE A SIMILIAR CASE IN FLOATING DIVIDE CLA MDONE, DCA AC1 /ZERO OVERFLOW WD(DO I NEED THIS???) ISZ MSIGN /SHOULD RESULT BE NEGATIVE? SKP /NO JMS I [FFNEG /YES-NEGATE IT TAD ACH SNA CLA /A ZERO AC MEANS A ZERO EXPONENT DCA ACX TAD DFLG SMA SZA CLA /D.P. INTEGER MODE? TAD ACX /WITH ACX LESS THAN 0? SNA JMP I FPNXT /NO - RETURN CMA JMS I [ACSR /UN-NORMALIZE RESULT JMP I FPNXT /RETURN /MDSET-SETS UP SIGNS FOR MULTIPLY AND DIVIDE /ALSO SHIFTS OPERAND ONE BIT TO THE LEFT. /EXIT WITH EXPONENT OF OPERAND IN AC FOR EXPONENT /CALCULATION-CALLED WITH ADDRESS OF OPERAND IN AC AND /DATA FIELD SET PROPERLY FOR OPERAND. MDSET, 0 CLA CLL CMA RAL /SET SIGN CHECK TO -2 DCA MSIGN TAD OPH /IS OPERAND NEGATIVE? SMA CLA JMP .+3 /NO JMS I (OPNEG /YES-NEGATE IT ISZ MSIGN /BUMP SIGN CHECK TAD OPL /AND SHIFT OPERAND LEFT ONE BIT CLL RAL DCA OPL TAD OPH RAL DCA OPH DCA AC1 /CLR. OVERFLOW WORF OF FAC TAD ACH /IS FAC NEGATIVE SMA CLA JMP LEV /NO-GO ON JMS I [FFNEG /YES-NEGATE IT ISZ MSIGN /BUMP SIGN CHECK NOP /MAY SKIP LEV, TAD OPX /EXIT WITH OPERAND EXPONENT IN AC JMP I MDSET MSIGN, 0 /24 BIT BY 12 BIT MULTIPLY. MULTIPLIER IS IN OPL /MULTIPLICAND IS IN ACH AND ACL /RESULT LEFT IN MDSET,AC2, AND AC1 MP24, 0 TAD (-14 /SET UP 12 BIT COUNTER DCA OPX TAD OPL /IS MULTIPLIER=0? SZA JMP MPLP1 /NO-GO ON DCA AC1 /YES-INSURE RESULT=0 JMP I MP24 /RETURN MPLP, TAD OPL /SHIFT A BIT OUT OF LOW ORDER MPLP1, RAR /OF MULTIPLIER AND INTO LINK DCA OPL SNL /WAS IT A 1? JMP MPLP2 /NO - 0 - JUST SHIFT PARTIAL PRODUCT TAD AC2 /YES-ADD MULTIPLICAND TO PARTIAL PRODUCT TAD ACL /LOW ORDER DCA AC2 CML RAL /*K* NOTE THE "SNL" 5 WORDS BACK! TAD ACH /HI ORDER MPLP2, TAD MDSET RAR /NOW SHIFT PARTIAL PROD. RIGHT 1 BIT DCA MDSET TAD AC2 RAR DCA AC2 TAD AC1 RAR /OVERFLOW TO AC1 DCA AC1 ISZ OPX /DONE ALL 12 MULTIPLIER BITS? JMP MPLP /NO-GO ON JMP I MP24 /YES-RETURN PAGE /DIVIDE-BY-ZERO ROUTINE - MUST BE AT BEGINNING OF PAGE DBAD, ISZ FATAL /DIVIDE BY 0 NON-FATAL JMS I ERR /GIVE ERROR MSG TAD DBAD DCA ACX /RETURN A VERY LARGE POSITIVE NUMBER AC2000 JMP FD /FLOATING DIVIDE - USES DIVIDE-AND-CORRECT METHOD DDDIV, JMS I (DARGET SKP FFDIV, JMS I (ARGET /GET OPERAND JMS I (MDSET /GO SET UP FOR DIVIDE-OPX IN AC ON RETN. CMA IAC /NEGATE EXP. OF OPERAND TAD ACX /ADD EXP OF FAC DCA ACX /STORE AS FINAL EXPONENT TAD OPH /NEGATE HI ORDER OP. FOR USE CLL CMA IAC /AS DIVISOR DCA OPH JMS DV24 /CALL DIV.--(ACH+ACL)/OPH TAD ACL /SAVE QUOT. FOR LATER DCA AC1 TAD OPL SNA CLA JMP DVL2 /AVOID MULTIPLYING BY 0 TAD (-15 /SET COUNTER FOR 12 BIT MULTIPLY DCA DV24 /TO MULTIPLY QUOT. OF DIV. BY JMP DVLP1 /LOW ORDER OF OPERAND (OPL) /DIVIDE ROUTINE - (ACH,ACL)/OPH = ACL REMAINDER REM (AC2=0) DV24, 0 TAD ACH /CHECK THAT DIVISOR IS .GT. DIVIDEND TAD OPH /DIVISOR IN OPH (NEGATIVE) SZL CLA /IS IT? JMP DBAD /NO-DIVIDE OVERFLOW TAD (-15 /YES-SET UP 12 BIT LOOP DCA AC2 JMP DV1 /GO BEGIN DIVIDE DV2, TAD ACH /CONTINUE SHIFT OF FAC LEFT RAL DCA ACH /RESTORE HI ORDER TAD ACH /NOW SUBTRACT DIVISOR FROM HI ORDER TAD OPH /DIVIDEND SZL /GOOD SUBTRACT? DCA ACH /YES-RESTORE HI DIVIDEND CLA /NO-DON'T RESTORE--OPH.GT.ACH DV1, TAD ACL /SHIFT FAC LEFT 1 BIT-ALSO SHIFT RAL /1 BIT OF QUOT. INTO LOW ORD OF ACL DCA ACL ISZ AC2 /DONE 12 BITS OF QUOT? JMP DV2 /NO-GO ON JMP I DV24 /YES-RETN W/AC2=0 /DIVIDE ROUTINE CONTINUED MP12L, DCA OPL /STORE BACK MULTIPLIET TAD AC2 /GET PRODUCT SO FAR SNL /WAS MULTIPLIER BIT A 1? JMP .+3 /NO-JUST SHIFT THE PARTIAL PRODUCT CLL /YES-CLEAR LINK AND ADD MULTIPLICAND TAD ACL /TO PARTIAL PRODUCT RAR /SHIFT PARTIAL PRODUCT-THIS IS HI ORDER DCA AC2 /RESULT-STORE BACK DVLP1, TAD OPL /SHIFT A BIT OUT OF MULTIPLIER RAR /AND A BIT OR RESLT. INTO IT (LO ORD. PROD.) ISZ DV24 /DONE ALL BITS? JMP MP12L /NO-LOOP BACK CLL CIA /YES-LOW ORDER PROD. OF QUOT. X OPL IN AC DCA ACL /NEGATE AND STORE CML RAL /PROPAGATE CARRY TAD AC2 /NEGATE HI ORDER PRODUCT STL CIA TAD ACH /COMPARE WITH REMAINDER OF FIRST DIV. SZL /WELL? JMP DVOPS /GREATER THAN REM.-ADJUST QUOT OF 1ST DIV. DCA ACH /OK - DO (REM - (Q*OPL)) / OPH DVL3, JMS DV24 /DIVIDE BY OPH (HI ORDER OPERAND) DVL1, TAD AC1 /GET QUOT. OF FIRST DIV. SMA /IF HI ORDER BIT SET-MUST SHIFT 1 RIGHT JMP FD /NO-ITS NORMALIZED-DONE SHR1, CLL ISZ ACL /ROUND AND SHIFT RIGHT ONE SKP IAC /DOUBLE PRECISION INCREMENT RAR DCA ACH /STORE IN FAC TAD ACL /SHIFT LOW ORDER RIGHT RAR DCA ACL /STORE BACK ISZ ACX /BUMP EXPONENT NOP TAD ACH JMP DVL1+1 /IF FRACT WAS 77777777 WE MUST SHIFT AGAIN FD, DCA ACH /STORE HIGH ORDER RESULT JMP I (MDONE /GO LEAVE DIVIDE DVL2, DCA ACL /COME HERE IF LOW-ORDER QUO=0 JMP DVL3 /SAVE SOME TIME /ROUTINE TO ADJUST QUOTINET OF FIRST DIVIDE (MAYBE) WHEN THE /REMAINDER OF THE FIRST DIVIDE IS LESS THAN QUOT*OPL DVOPS, CMA IAC /NEGATE AND STORE REVISED REMAINDER DCA ACH CLL TAD OPH TAD ACH /WATCH FOR OVERFLOW SNL JMP DVOP1 /OVERFLOW-DON'T ADJUST QUOT. OF 1ST DIV. DCA ACH /NO OVERFLOW-STORE NEW REM. CMA /SUBTRACT 1 FROM QUOT OF TAD AC1 /FIRST DIVIDE DCA AC1 DVOP1, CLA CLL TAD ACH /GET HI ORD OF REMAINDER SNA /IS IT ZERO? DVOP2, DCA ACL /YES-MAKE WHOLE THING ZERO DCA ACH JMS DV24 /DIVIDE EXTENDED REM. BY HI DIVISOR TAD ACL /NEGATE THE RESULT CLL CMA IAC DCA ACL SNL /IF QUOT. IS NON-ZERO, SUBTRACT CMA /ONE FROM HIGH ORDER QUOT. JMP DVL1 /GO TO IT LPBUF3, ZBLOCK 12 LPBUF4 PAGE /"OPNEG" MUST BE AT 0 ON PAGE OPNEG, 0 /ROUTINE TO NEGATE OPERAND TAD OPL /GET LOW ORDER CLL CIA /NEGATE AND STORE BACK DCA OPL CML RAL /PROPAGATE CARRY TAD OPH /GET HI ORDER CLL CIA /NEGATE AND STORE BACK DCA OPH JMP I OPNEG / /FLOATING SUBTRACT AND ADD / FFSUB, JMS I (ARGET /PICK UO THE OP. JMS OPNEG /NEGATE OPERAND SKP FFADD, JMS I (ARGET /PICK UP OPERAND TAD OPH /IS OPERAND = 0 SNA CLA JMP I FPNXT /YES-DONE TAD ACH /NO-IS FAC=0? SNA CLA JMP CLROFL /CLEAR OUT THE OVERFLOW BITS TAD ACX /NO-DO EXPONENT CALCULATION CLL CIA TAD OPX SMA SZA /WHICH EXP. GREATER? JMP FACR /OPERANDS-SHIFT FAC CIA /FAC'S-SHIFT OPERAND=DIFFRNCE+1 TAD (-30 SMA /TEST FOR INSIGNIFICANCE JMP OPINSG /YES - ANSWER IS FAC TAD (30 JMS OPSR JMS I [ACSR /SHIFT FAC ONE PLACE RIGHT DOADD, TAD OPX /SET EXPONENT OF RESULT DCA ACX JMS I [OADD /DO THE ADDITION JMS FFNOR /NORMALIZE RESULT JMP I FPNXT /RETURN FACR, TAD (-30 SMA /TEST FOR INSIGNIFICANCE JMP ACINSG /YES - ANSWER IS OPR TAD (30 JMS I [ACSR /SHIFT FAC = DIFF.+1 JMS OPSR /SHIFT OPR. 1 PLACE JMP DOADD /DO ADDITION OPINSG, CLA JMP I FPNXT /OPERAND SHIFT RIGHT-ENTER WITH POSITIVE COUNT-1 IN AC OPSR, 0 CMA /- (COUNT+1) TO SHIFT COUNTER DCA AC0 LOP2, TAD OPH /GET SIGN BIT CLL /TO LINK SPA CML /WITH HI MANTISSA IN AC RAR /SHIFT IT RIGHT, PROPAGATING SIGN DCA OPH /STORE BACK TAD OPL RAR DCA OPL /STORE LO ORDER BACK ISZ OPX /INCREMENT EXPONENT NOP ISZ AC0 /DONE ALL SHIFTS? JMP LOP2 /NO-LOOP RAR /SAVE 1 BIT OF OVERFLOW DCA AC2 /IN AC2 JMP I OPSR /YES-RETN. FFNOR, 0 /ROUTINE TO NORMALIZE THE FAC TAD ACH /GET THE HI ORDER MANTISSA SNA /ZERO? TAD ACL /YES-HOW ABOUT LOW? SNA TAD AC1 /LOW=0, IS OVRFLO BIT ON? SNA CLA JMP ZEXP /#=0-ZERO EXPONENT NORMLP, CLA CLL CML RTR /NOT 0-MAKE A 2000 IN AC TAD ACH /ADD HI ORDER MANTISSA SZA /HI ORDER = 6000 JMP .+3 /NO-CHECK LEFT MOST DIGIT TAD ACL /YES-6000 OK IF LOW=0 SZA CLA SPA CLA /2,3,4,5,ARE LEGAL LEFT MOST DIGS. JMP FFNORR /FOR NORMALIZED #-(+2000=4,5,6,7) JMS I [AL1BMP /SHIFT AC LEFT AND BUMP ACX DOWN JMP NORMLP /GO BACK AND SEE IF NORMALIZED ZEXP, DCA ACX FFNORR, DCA AC1 /DONE W/NORMALIZE - CLEAR AC1 JMP I FFNOR /RETURN ACINSG, CLA /COME HERE IF AC IS INSIGNIFICANT ON ADDITION DCA ACH DCA ACL JMP DOADD-1 /FAKE AN ADD WITH OPR=0 LPBUF4, ZBLOCK 40 LPBUFE CLROFL, DCA AC1 /CLEAR THE FLOATING AC OVERFLOW WORD DCA AC2 /CLEAR THE OPERAND OVERFLOW WORD JMP DOADD /FAC=0; DO THE ADD PAGE /PAGE 7400 UNUSED RIGHT NOW LPBUFE, ZBLOCK 177 LPBUFR FIELD 1 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | # OS/8 Combined (Unified) Kit This subtree builds the OS/8 Combined Kit from source into a variety of distribution media images. It is signifcant because it is the latest, greatest, official distribution of OS/8. The kit is described in Software Product Description (S.P.D. 4.4.5) which can be found starting at page 21 of the October-November 1980 PDP-8 Digital Software News AA-K629A-BA. The SPD defines the minimum hardware requirement as: PDP-8/a, /e, or /m with 12K words of memory or DECStation 88/80, /90, /92, or /97, with RK8J or RL8A disk. That said, we believe this system will run on a single TD8E DECtape system, it should run fine on PDP-8/I hardware, and with a little fiddling with old device drivers, it should support an RF08 disk. The OS/8 Combined Kit Information Guide (order number AA-J016B-TA) describes the kit in an overview section as follows: As the name implies, the kit is a combination of OS/8 software products. It includes the software and documentation contained in the following kits: o OS/8, Version 3D, Operating System (described in Software Product Description (S.P.D. 4.1.11) o OS/8, Version 3D, Extension (S.P.D. 4.5.8) o OS/8, Version 3D, Device Extensions for RL01, RX02, and KT8A (S.P.D. 4.12.0) o OS/8, Version 3D, FORTRAN IV (S.P.D. 4.10.7) In addition, the kit's modules have been updated with the binary patches described in the OS/8 Device Extensions User's Guide and in the issues of the Digital Software News (through June 1979). It details documentation appropriate to the kit as follows: OS/8 COMBINED KIT INFORMATION GUIDE - AA-J016B-TA Describes the kit's contents and how to get the system on line. OS/8 COMBINED KIT - V3D SPD 4.4.2 Describes the OS/8 Combined Kit, its options, licenses, support category and other pertinent information. OS/8 DEVICE EXTENSION RELEASE NOTES - AA-H565A-TA Contains supplemental information on the features of the OS/8 Device Extensions Kit not discussed in the DEVICE EXTENSIONS USER'S GUIDE. OS/8 DEVICE EXTENSIONS USER'S GUIDE - AA-D319A-TA Describes the RL01 and RX02 disks, their bootstrap procedures, and the software support for the KT8A (128K) Memory Management option. OS/8 ERROR MESSAGES - AA-H610A-TA Describes the error messages generated by the OS/8 Monitor and its system programs. OS/8 FORTRAN IV SOFTWARE SUPPORT MANUAL - DEC-S8-LFSSA-A-D Describes internal features of OS/8 FORTRAN IV that may be useful to the advanced user. OS/8 LANGUAGE REFERENCE MANUAL - AA-H609A-TA Describes the languages supported by OS/8: BASIC, FORTRAN IV, PAL8, FORTRAN II, FLAP/RALF, and SABR. OS/8 MARK SENSE BATCH USER'S MANUAL - DEC-S8-OBUGA-A-D Describes the use and operation of the Mark Sense Batch (MSBATCH) OS/8 system program. It includes step-by-step procedures for preparing programs for submission to MSBATCH. OS/8 SOFTWARE SUPPORT MANUAL - DEC-S8-OSSMB-A-D Describes internal system features that may be useful to the advanced user. OS/8 SYSTEM GENERATION NOTES - AA-H606A-TA Describes PDP-8/E bootstrap procedures for LINCtape, DECtape (TC08 and TD8E), and disk (DF32, RF08, RK08, RK8E, and RX01), as well as procedures for building the system from paper tape and DECassette (TA8E). OS/8 SYSTEM REFERENCE MANUAL - AA-H607A-TA Describes the OS/8 system conventions, keyboard commands and utility programs. OS/8 TECO REFERENCE MANUAL - AA-H608A-TA Describes the Text Editing and Correcting program for OS/8 users. OS/8 V3D SYSTEM RELEASE NOTES - DEC-S8-OSRNA-B-D Describes the differences between version V3D of OS/8 and previous versions, as well as corrections to known software problems. TECO POCKET GUIDE - AV-D530A-TK Contains a guick-reference summary of OS/8 TECO commands. ### <a id="license"></a>License Copyright © 2020 by Bill Cattey. Licensed under the terms of [the SIMH license][sl]. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 | /7 CONCISE OS8 BATCH PROCESSOR 7-JUN-1978 / / / / / / / / / /COPYRIGHT (C) 1975,1977,1978 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /EF,RL,SR /ABSTRACT--- /BATCH IS THE INITIALIZING PROGRAM FOR THE OS/8 BATCH /PROCESSING MONITOR. TO SET UP A BATCH RUN, TYPE / .R BATCH /BATCH WILL CALL THE COMMAND DECODER TO OBTAIN ITS /PARAMETERS AND INPUT FILE LOCATION. VERSON= 10 / BATCH SWITCHES: /C BATCH FROM CARDS /E IGNORE KMON, CD, AND CCL ERRORS /H HUSH (SUPPRESSES $JOB, #END, AND ECHOING) /P BATCH FROM PAPER TAPE /Q QUIET - NO BATCH LOG /T FORCE BATCH LOG TO TELETYPE /U UNATTENDED /6 USE 026 CARD CODES (ONLY IF /C) /MAINTENANCE RELEASE CHANGES BY S.R. ON 1-AUG-75: /1. CHANGED VERSION NUMBER TO 6 /2. INCORPORATED V5A PATCH SEQ # 1 APR-75 DSN / ALLOWS BATCH TO PASS ALTMODE TO KBM /3. INCORPORATED V5B PATCH SEQ #2 17-JULY-75 WSN / SLOWS BATCH DOWN WHEN READING FROM CARDS /4. ALLOW BATCH TO IGNORE NULLS FROM BATCH STREAM / (PATCH TO BE PUBLISHED IN DSN.) /5. SET BATCH SO THAT IT RESTORES OLD SOFTWARE CORESIZE / UPON NORMAL TERMINATION. /CHANGES BY S.R. ON 3-FEB-77: /1. ADDED HUSH SWITCH (/H) /2. SAVED REST OF 7777 AROUND BATCH /3. FIXED BUG CONCERNING MANUAL HELP NEEDED /4. ALLOWED CORE IMAGE TO BE PRESERVED AFTER BATCH TERMINATION /8-DEC-77 CHANGES: /1. PUT IN SYMBIONT SUPPORT /2. LENGTHENED LPT WAIT LOOP (FOR LA180'S) /3. MADE /T MUCHO OVERRIDE LPT TEST /4. BATCH LPT LOG CONVERTS L.C. TO U.C. / TO INHIBIT CONVERSION, PATCH LOC 6400 FROM A -40 TO A 0 /5. DON''T RESTORE EXTENDED DATE BITS IN 07777 /6. MORE FIXES TO MANUAL INTERVENTION REQUIRED MESSAGE BUG /7. BATCH OUTPUT ROUTINE IGNORES NULLS /SYSTEM DEPENDENT PARAMETERS AMFLAG=17 /ALTMODE FLAG FOR KBM CDREC=51 /COMMAND DECODER KMREC=7 /KEYBOARD MONITOR BUFFER=3000 JSW=7746 /JOB STATUS WORD DCB=7760 /DEVICE CONTROL BLOCK MTWO=CLA CLL CMA RAL MTHREE=CLA CLL CMA RTL SYSTEM=7607 MPARAM=7643 /******************************************** KEYMON=403 BEGLN=1000 PRINT=200 XGLINE=1200 BATCH=35 /REFERS TO KEYBOARD MONITOR!!!!!!! BCHGO=46 /THEY MUST!!!!! BE CORRECT!!!!!! CBATCH=4571 /CONTENTS OF LOC "BATCH" IN KEYBOARD MONITOR /******************************************* CDOVER=326 CDBEGLN=1200 /CD BUFFER AREA ANALYZ=202 /CD ANALYSIS TYPE=1367 /ERROR OUTPUT ROUTINE CGLINE=1002 TT=21 /THESE REFER TO CD ASSEMBLY***VOLATILE*** DVICE=43 /IF CD OR MAIN OS/8 ASSEMBLY CHANGES, DEFALT=42 /V3D NOT NEEDED LKUPSW=245 /V3D IF CONTENTS=0, IN SPECIAL MODE OUTSW=41 /THESE VALUES MUST BE ALTERED ALSO. NAMECT=31 DEV1=33 RESTRT=676 /******************************************** ORIGIN=5400 PSKF=6661 /LE8 IOT'S PCLS=6666 RCRA=6632 /CARD READER IOT'S RCSE=6672 RCSD=6671 RCSF=6631 RCRD=6674 /***************************** BOSCCL=07777 /BATCH USES CERTAIN SYSTEM WORDS AS FLAGS AND STATUS /INDICATORS. THEY ARE: /LOC. 07777. THIS IS USED AS THE BATCH IN PROGRESS FLAG. /BIT 1 IS BATCH IN PROGRESS. (BIP) =1 MEANS BATCH IS ON /BITS 6-8 HOLD THE FIELD WHERE BATCH IS SITTING /BIT 10 IS USED BY BAT: TO SIGNAL IT HAS READ A DOLLAR SIGN /BIT 11 IS USED BY THE COMMAND DECODER TO SIGNAL BATCH NOT THERE /THE JOB STATUS WORD USES BIT 3 AS AN INDICATOR AS TO /WHETHER THE BATCH MONITOR IS CURRENTLY IN CORE. =1 MEANS /THAT THE BATCH SYSTEM NEED NOT BE RE-READ. /BOSSW IS A FLAG WORD INTERNAL TO THE BATCH MONITOR. /IT IS SET UP DURING BATCH INITIALIZATION. /BIT 0: 1 IF USE OF PTR IS PROHOBITED DURING RUN /BIT 1: 1 IF LPT OR TTY LISTINGS ARE TO BE SPOOLED /BIT 2: 1 IF KMON AND CD ERRORS ARE NON-FATAL /BIT 10: 1 IF LP08 IS OUTPUT DEVICE /BIT 11: 1 IF OPERATOR IS NOT PRESENT /IF SYS IS INPUT, LOCATIONS 7774 AND 7775 IN THE TOP FIELD /ARE USED AS POINTERS TO THE CORRECT DATA BLOCK ON THE /SYSTEM DEVICE. THE BUFFER IS RE-READ WHENEVER THE /BATCH MONITOR MUST BE RE-READ. SPLNUM= 7776 /SPOOL SEQUENCE NUMBER SYCNT= 7775 /CHARACTER COUNT IN BUFFER SYBLKN= 7774 /SYSTEM DEVICE BLOCK NUMBER /IF SPOOLING IS USED, LOC. N7776 IS USED TO HOLD THE /XX IN 'BTCHXX.TM'. /BATCH INITIALIZER PAGE 0 *0 VERSON CIF 30 JMP .-1 *16 XR1, 0 XR2, 0 TEMP, 0 TEMP2, 0 COUNT, 0 BOSCTL, 1101 /CONTROL WORD TO READ/WRITE BOS CDFTOP, 0 TOPCDF, HLT /CDF TO TOP FIELD JMP I CDFTOP T1, 0 T2, 0 PAGE START, SKP JMP BCHAIN /IF CHAINED TO JMS I (GETCOR /DETERMINE CORE SIZE; PUT IN 7777 BATASK, CIF 10 JMS I [200 5 0211 /.BI ASSUMED EXT SKP BCHAIN, JMS I (GETCOR DCA I [BOSSW CDF 10 TAD I [MPARAM+1 AND (4 /GET /V SWITCH SNA CLA /IS IT ON? JMP .+3 /NO JMS I [MESSG VERMSG /PRINT BATCH VERSION NUMBER CDF 10 TAD I (7620 DCA T1 /GET STARTING BLOCK TAD I (7617 SNA JMP NOTSYS /NO FILE - BATCH FROM PTR OR CDR AND [17 TAD (MPARAM+3 /POINT INTO HANDLER TABLE DCA T2 TAD I T2 CLL TAD [200 /IS THE DEVICE SYS OR CORESIDENT WITH SYS? SNL CLA JMP I (INDERR /NO TAD I T2 /GET DEVICE HANDLER ENTRY POINT CDF 0 DCA I (SYSINH /STORE AS BATCH INPUT HANDLER JMS CDFTOP TAD T1 DCA I (SYBLKN TAD (-601 DCA I (SYCNT /SET UP PARAMETERS FOR INPUT FILE CDF 0 TAD (SYSIN-1 JMP STODEV /INPUT DEV = SYS NOTSYS, TAD I (MPARAM RTL /GET C FLAG IN SIGN BIT SMA CLA JMP NOTCDR JMS I (CHANGE /SET 026/029 CARD CODE TAD (CDR-1 JMP STODEV /INPUT DEV = CDR NOTCDR, TAD I [MPARAM+1 AND (400 CDF 0 SNA CLA JMP BATASK /NO INPUT SPECIFIED STL RAR DCA I [BOSSW /PTR INPUT FLAG TAD (PTR-1 STODEV, JMS I (MVINSB /MOVE THE PROPER ROUTINE INTO THE BATCH MONITOR CDF 10 TAD I [MPARAM+1 CDF 0 AND (210 /GET /Q AND /U SWITCHES CLL RTL RTL RAL / /Q INTO LINK SZA CLA ISZ I [BOSSW /SET UNATTENDED BIT IF /U SPECIFIED SNL JMP .+3 /NO /Q TAD (NULOUT-TTYOUT /EIGHTY-SIX THE BATCH LOG JMP NOLPT/SET LPT MODE SO $MSG WILL ECHO CDF 10 TAD I [MPARAM+1 CDF 0 AND (20 /CHECK /T SWITCH CLL CIA SZL CLA JMS I (LPTTST /OTHERWISE, CHECK OUT FOR LINE PRINTER NOLPT, TAD (TTYOUT-BOSLPT /NO LPT TAD (BOSLPT /HE HAS A LPT DCA I (OUTPUT /SET OUTPUT DEVICE TO TTY OR LPT OR NULOUT TAD I (OUTPUT TAD (-BOSLPT SNA CLA STL RTL TAD I [BOSSW DCA I [BOSSW /AND SET FLAG CDF 10 TAD I [7600 CDF 0 SNA JMP I (CONT /NO SPOOLING AND [17 DCA T1 TAD T1 TAD (DCB-1 DCA T2 CDF 10 TAD I T2 CDF 0 JMP I (SPCONT PAGE SPCONT, SMA CLA JMP BADSPL TAD T1 DCA I (SPLDEV STL RTR TAD I [BOSSW DCA I [BOSSW CONT, JMS I (EOPTN /CHECK FOR /E SWITCH TAD (BATPTR /SET POINTER TO BATCH.SV DCA FILPTR CLA IAC /DO LOOKUP ON SYS CIF 10 JMS I [200 K2, 2 FILPTR, BATPTR 0 /WHO CARES ABOUT THE LENGTH? JMP NOBACH /BATCH FILE NOT FOUND TAD I K7777 /PUT IN FIELD OF BOS AND (70 TAD (CDF 0 DCA CDFBOS TAD (201 JMS I [SYS /READ AND ALTER KEYBOARD MON. BUFFER KMREC /GET RECORD # OF BOS JMS I [VERTST /GET VERSION OF MONITOR TAD (EOINIT AND (7400 CLL RTL RTL RAL TAD K2 TAD FILPTR DCA BOSREC /WE WILL RE-WRITE BOS LATER TAD BOSREC /ALTER KEYBOARD MONITOR DCA I (BUFFER+BATCH+3 /RECORD # TAD CDFBOS AND (70 /ALTER CONTROL WORD TAD BOSCTL DCA I (BUFFER+BATCH+1 TAD BOSREC-1 DCA I (BUFFER+BATCH+2 CLA CLL CML RTL TAD CDFBOS DCA I (BCHGO+BUFFER /JMP TO CORRECT FIELD TAD (BOS /START ADD. OF MONITOR DCA I (BCHGO+BUFFER+2 /ENTRY POINT TAD (4200 /RE-WRITE KEYBD. MON. JMS I [SYS BUFFER KMREC TAD (201 /READ IN COMMAND DECODER JMS I [SYS BUFFER /AND INSERT BOS RECORD CDREC TAD CDFBOS /NOW FILL IN THE COMMAND DECODER DCA I (TT+BUFFER TAD (CDBOS DCA I (DVICE+BUFFER /ALLOW CD TO CHECK BATCH VALIDITY TAD I (CDBOS CIA /STORE COMPLEMENT ALSO DCA I (OUTSW+BUFFER CLL CML RTL /CREATE CIF CDF BATCH TAD CDFBOS DCA I (NAMECT+BUFFER TAD (CDBOS DCA I (DEV1+BUFFER TAD (4200 JMS I [SYS /RE WRITE CD. BUFFER CDREC JMS I (SETH /SET HUSH IF /H SPECIFIED CLA CLL CML RAR TAD BOSCTL JMS I [SYS /INPUT POINTERS SET UP. ORIGIN&7400 BOSREC, HLT CLA CLL CML RTR /BATCH IN PROGRESS JMS I [INCOR K7777, 7777 CLA STL RAR /4000 DCA I (DOLFLG /SET FOR INITIAL $JOB JMS I (MOVE /PUT IMAGE OF BOS INTO HIGH CORE ORIGIN-7600 ORIGIN CDFBOS, HLT ORIGIN TAD (0160 /SET SPOOL FILENAME TO BTCHA0 JMS CDFTOP DCA I (SPLNUM BATRET, CIF CDF 0 JMP I [7605 NOBACH, JMS I [MESSG /BATCH.SV NOT THERE NBATCH JMP BATRET BADSPL, JMS I [MESSG SPLERR JMP I (BATASK INDERR, JMS I [MESSG NODEV JMP I (BATASK PAGE MESSG, 0 /MESSAGE PRINTING ROUTINE CLA CDF 0 JMS I [CRLF /GENERATE CARRIAGE RET., LINE FEED TAD I MESSG /ADDRESS OF ERROR MESSAGE ISZ MESSG /POINT TO RETURN DCA TEMP MCONT, TAD I TEMP /GET TEXT CHARACTERS IN AC CLL RTR RTR RTR JMS PCHAR /PUNCH IT TAD I TEMP JMS PCHAR /SECOND OF TWO. ISZ TEMP /NEXT TEXT WORD JMP MCONT /CONTINUE PCHAR, 0 /ROUTINE TO UNPACK AND PRINT TEXT AND [77 SNA /0 TERMINATES THE LIST JMP MSGXIT /UNCLEAN RETURN, BUT WHO CARES? TAD (-37 /SEPARATE DIGITS FROM ALPHAS SNA JMP PCRLF /_ IS SPECIAL CHAR SPA TAD (100 /MAKE IT ALPHABETIC TAD (237 JMS I (TTYOUT JMP I PCHAR MSGXIT, TSF JMP MSGXIT JMP I MESSG PCRLF, JMS I [CRLF JMP I PCHAR LZERO=0 GETCOR, 0 /ONCE ONLY ROUTINE TO DETERMINE CORE SIZE TAD I (BOSCCL /GET CORE-SIZE WORD RTL /PUT BATCH IN-PROGRESS BIT IN LINK SZL CLA /ARE WE RUNNING BATCH FROM A BATCH JOB? JMP AAA /YES, DON'T TOUCH ORIGINAL CORE SIZE TAD I (BOSCCL /NO, GET OLD SOFTWARE CORE SIZE AND (7177 /BUT DON'T SAVE EXTENDED DATE BITS DCA I (OLDCOR /SAVE CURRENT SOFTWARE CORE SIZE AAA, TAD I (BOSCCL /GET BATCH CTL WD AND (70 /IT MIGHT ALREADY CONTAIN THE ANSWER SZA JMP STOCOR TAD [7607 DCA LZERO CHUG, CDF 10 TAD K DCA I (LZERO K10, 10 TAD LZERO CIA TAD [7607 SZA CLA JMP DUN TAD I (LZERO NOP CIA TAD K SZA CLA JMP DUN TAD [10 TAD CHUG DCA CHUG ISZ K JMP CHUG-2 CLA CMA DUN, CIF CDF 0 TAD K TAD K10 CLL RTL /STORE HIGHEST FIELD # INTO 7777 RAL STOCOR, DCA INCOR TAD INCOR TAD (-10 /TEST FOR AT LEAST 12 K SPA SNA JMP NOCORE TAD (-60 /LIMIT TO FIELD 6, SO AS NOT SNA CLA /TO DISTURB ROM IN F. 7 TAD (-10 TAD INCOR DCA INCOR TAD INCOR TAD (CDF DCA TOPCDF TAD I (BOSCCL AND (7707 /V3D TAD INCOR DCA I (BOSCCL TAD INCOR TAD (201 DCA I (SYCNTL TAD TOPCDF DCA I (BOSCDF JMP I GETCOR NOCORE, CLA JMS I [MESSG COR8 JMP I [7600 K, -10 INCOR, 0 /INCLUSIVE OR ROUTINE. USE THE DCA TEMP /FOLLOWING: TAD I INCOR /A .OR. B= .NOT. A .AND. B +A DCA TEMP2 TAD TEMP CMA AND I TEMP2 TAD TEMP DCA I TEMP2 ISZ INCOR JMP I INCOR PAGE PTR, 0 /HI SPEED READER HANDLER RDF /** MOVED TO 5400 IN BATCH FIELD ** TAD PCDIF0 DCA PTRRET JMS I PTRDOL /CHECK FOR $ INSERTION JMP PTRISZ /YES DCA PTIMER JMS I TCTRLC RFC PTM2, RSF JMP PTMER TAD PTR200 /FORCE PARITY ON RRB PTRISZ, ISZ PTR PTRRET, HLT JMP I PTR PCDIF0, CDF CIF 0 TCTRLC, CTRLC PTMER, AND I 0 AND I 0 ISZ PTIMER JMP PTM2 /TIMES OUT IN 16 MS. JMP PTRRET PTIMER, 0 PTR200, 200 PTRDOL, GETDOL /SYS PERFORMS I/O TO SYSTEM DEVICE. THE CALLING SEQUENCE /CONFORMS TO THAT OF THE STANDARD OS/8 CALL SEQUENCE, EXCEPT /THAT WE HAVE ONE ERROR RETURN FROM THE ROUTINE, NOT A LOT /OF SEPARATE ERROR RETURNS. SYS, 0 DCA SYCTL /AC HAD CONTROL WORD TAD I SYS DCA SYBUFF /BUFFER FOR TRANSFER ISZ SYS TAD I SYS DCA SYREC /RECORD OF TRANSFER ISZ SYS CIF 0 JMS I (SYSTEM SYCTL, HLT SYBUFF, HLT SYREC, HLT SKP CLA JMP I SYS JMS I (PRMESG SERMSG JMP I (BATRET BATPTR, FILENAME BATCH.SV CHANGE, 0 /ROUTINE TO ALTER CARD TABLE CDF 10 TAD I (MPARAM+2 CDF 0 AND (10 /GET /6 SWITCH SZA CLA /IF IT IS SPECIFIED, TAD (C026-C029 /USE DEC 026 CARD CODES, TAD (C029 /OTHERWISE USE DEC 029 CODES DCA XR1 /ADDDRESS OF CORRECT LIST TAD (CLST-1 DCA XR2 /THE LOCS. THAT GET ALTERED TAD [-15 DCA COUNT /13 ENTRIES. TAD I XR2 DCA CHPTR TAD I XR1 DCA I CHPTR /ALTER TABLE IN MONITOR. ISZ COUNT JMP .-5 JMP I CHANGE CHPTR, 0 CLST, CDT+5 /ADDRESSES OF CARD CONVERSION LOCS. CDT+6 CDT+7 CDT+15 CDT+16 CDT+17 CDT+25 CDT+26 CDT+27 CDT+30 CDT+35 CDT+36 CDT+37 C026=.-1 7735 /CODES FOR 026 CARDS 4076 0774;3314;1002;0305;3204;1273;3606;1341;3716;1175 3401 C029=.-1 3203;4007;3502;7514;0577;3637;0104;1211;3374;0641;7316;3410 1376 SETH, 0 /SET HUSH CDF 10 TAD I (MPARAM /LOOK AT A-L SWITCHES AND (20 /IN PARTICULAR, LOOK AT /H BIT CDF 0 DCA I (HUSH /SAVE THIS BIT JMP I SETH PAGE BILEN= 0 /INITIALIZE MAX INPUT ROUTINE LENGTH SYSIN, 0 /INPUT FROM SYSTEM DEVICE RDF /** MOVED INTO 5400 IN BATCH FIELD ** TAD SYCDIF DCA SYSRET SYSIN4, JMS I SYSDOL /CHECK FOR $ INSERTION JMP SYSISZ /YES TAD BLOK /RE-READ BUFFER? SZA CLA JMP SYGETC /NO. STILL THERE TAD I PSYBLKN DCA BLOK TAD I PSYCNT IOSYS, DCA SYCHCN /RESTORE CHARACTER COUNT CIF 0 JMS I SYSINH /READ THE BLOCK SYCNTL, 0 BTBUF, ORIGIN-400 BLOK, 0 JMP I PSYIERR TAD BTBUF /SET BUFFER POINTER. DCA WPTR /NOW DETERMINE FROM COUNT WHICH WORD TAD SYS601 /WAS INTERRUPTED. WHEN AC GOES NEG., TAD SYCHCN /WE ARE AT PROPER 2 WORD GROUP. GWDLP, TAD SYSM3 /THEN WE FORM A JMP TO CORRECT WORD SPA JMP GEWD ISZ WPTR /SKIP 2 WORDS ISZ WPTR JMP GWDLP GEWD, TAD SYS3 /FORM A JMP CHARX, X=1,2,3 TAD JMPDOT DCA JMPCH /SET UNPACK SWITCH SYGETC, ISZ JMPCH /NORMAL CHAR. FETCH ISZ SYCHCN /NEED NEW BLOCK? JMPDOT, JMP JMPCH /NO ISZ BLOK /YES. NEXT BLOCK TAD SYM601 JMP IOSYS /READ IT. JMPCH, JMP JMPCH /3 WAY SWITCH JMP ICHAR1 /FIRST OF 3 JMP ICHAR2 /SECOND TAD JMPDOT DCA JMPCH /RESET 3 WAY SWITCH JMS I PCTRLC TAD I WPTR /NOTE THAT WE CAN'T DESTROY WPTR BY AND SY7400 /BY DOING ISZ'S UNTIL THE 3RD CHAR. CLL RTR /THAT IS BECAUSE IF WE ARE BROKEN RTR /UP, WE CAN ONLY POINT TO THE 2 WORD DCA SYTEMP /GROUP AS A WHOLE. ISZ WPTR TAD I WPTR AND SY7400 CLL RTL RTL RAL TAD SYTEMP ISZ WPTR /BUMP TO NEXT GROUP JMP CHCOM ICHAR2, CLA IAC ICHAR1, TAD WPTR DCA SYTEMP /THIRD CHAR NEEDS WPTR! TAD I SYTEMP CHCOM, AND SYS177 DCA SYTEMP TAD SYCHCN DCA I PSYCNT TAD BLOK DCA I PSYBLKN TAD SYTEMP /CHECK FOR ^Z / SNA /V3C / JMP SYSISZ /RETURN NULL AS NULL TAD SYSM32 SZA JMP CHOUT /NOPE. OK TAD SYEXT /^Z. DISABLE INPUT DCA SYSIN4 SYEXT, JMP SYSRET CHOUT, TAD SYS232 SYSISZ, ISZ SYSIN SYSRET, HLT /CDF CIF RETURN FIELD JMP I SYSIN SYCHCN, 0 WPTR, 0 SYSCHR, SYTEMP, 0 PSYBLK, SYBLKN PSYCNT, SYCNT SYSINH, 0 /GETS ADDRESS OF INPUT HANDLER (7607 OR CO-RES) PSYIER, SYIERR SYS601, 601 SYM601, -601 SYSM3, -3 SYS3, 3 PCTRLC, CTRLC SY7400, 7400 SYS177, 177 SYSM32, -32 SYS232, 232 SYCDIF, CDF CIF 0 SYSDOL, GETDOL IFZERO .-SYSIN-BILEN&4000 <BILEN=.+1-SYSIN> PAGE /CARD READER HANDLER. BUFFERS AN ENTIRE CARD IN THE LINE BUFFER. /ON END OF CARD, WE CAST OUT EXTRANEOUS SPACES IN THE BUFFER CDR, 0 RDF TAD CCDIF0 DCA CDRRET JMS I CDRDOL /CHECK FOR $ INSERTION JMP CDRISZ /YES ISZ CHCNT /STILL CHARACTERS IN BUFFER? JMP GETCH /YES. NEWCRD, TAD PLNBUF DCA CDRPTR /NO. READ A NEW CARD CSLCT, JMS I CCTRLC RCSE /SELECT A CARD JMP CSLCT RDNEXC, DCA CTIMER RDCOLM, RCSF /WAIT FOR DATA JMP EOC /AND CHECK FOR END OF CARD RCRA CLL RAR /TRANSLATE INTERNAL INTO ASCII TAD PCDT DCA CTEMP TAD I CTEMP SZL /LEFT OR RIGHT? JMP .+4 RTR;RTR;RTR AND CDR77 TAD CDR240 ISZ CDRPTR DCA I CDRPTR ISZ CHCNT /CAN'T SKIP EOC, RCSD /CARD DONE? JMP TIME /NO - CHECK TIMEOUT TAD CHCNT /GET REAL NUMBER OF CHARACTERS CMA DCA CHCNT CHKSPC, TAD I CDRPTR TAD CDM240 SNA CLA JMP SPCIG ISZ CDRPTR CDCR, TAD CDR215 /INSERT END OF LINE MARKER DCA I CDRPTR TAD PLNBUF DCA CDRPTR GETCH, ISZ CDRPTR TAD I CDRPTR CDRISZ, ISZ CDR CDXIT, RCRD /CLEAR CARD DONE FLAG CDRRET, HLT JMP I CDR SPCIG, CLA CMA /BACK UP ONE CHAR TAD CDRPTR DCA CDRPTR ISZ CHCNT /IF SKIP, IT'S A BLANK LINE JMP CHKSPC JMP CDCR TIME, AND I 0 /CHECK TIME OUT - FIRST DELAY A WHILE TAD CDM240 /V3C DCA TIME /TIME OUT A LOT ISZ TIME JMP .-1 ISZ CTIMER JMP RDCOLM DCA CHCNT JMP NEWCRD /CARD HUNG - WAIT FOR READER READY CCDIF0, CDF CIF 0 CHCNT, -1 PLNBUF, LINBUF-1 CCTRLC, CTRLC PCDT, CDT CDR77, 77 CDR240, 240 CDM240, -240 CDR215, 215 CDRPTR, 0 CTEMP, 0 CTIMER, 0 CDRDOL, GETDOL IFZERO .-CDR-BILEN&4000 <BILEN=.+1-CDR> LPTTST, 0 /SKIP IF BATCH-TYPE LINE PRINTER AVAILABLE TAD (240 PCLS /PRINT AN INNOCUOUS BLANK CLA / AND I 0 / AND I 0 /FLAG COMES UP IN UNDER 10 MICROSECONDS / AND I 0 / AND I 0 / AND I 0 / AND I 0 /(ACTUALLY, FOR AN LA180 IT TAKES A BIT LONGER) / AND I 0 ISZ WAIT JMP .-1 /WAIT A LOT PSKF /WELL? JMP I LPTTST /NO WAY! CLA IAC /DON'T BE FOOLED - COULD STILL BE AN ANALEX 6654 /LOAD ANALEX BUFFER SNA CLA JMP ANALEX /IF IOT CLEARED AC, ITS AN ANALEX TAD (215 PCLS /CLEAR LINE BUFFER BY PRINTING CR PSKF JMP .-1 CLA ISZ LPTTST JMP I LPTTST /TAKE SKIP RETURN ANALEX, 6652 /CLEAR FLAGS 6662 /CLEAR BUFFER JMP I LPTTST /TAKE NO LPT RETURN WAIT, 0 PAGE NBATCH, TEXT /BATCH.SV NOT FOUND ON SYS:/ COR8, TEXT /INSUFFICIENT MEMORY FOR BATCH RUN/ BADMON, TEXT /WRONG OS8 MONITOR/ NODEV, TEXT /DEV NOT IMPLEMENTED_/ SPLERR, TEXT /ILLEGAL SPOOL DEVICE_/ VERMSG, TEXT /BATCH / *.-1 VERSON+2660 /"VN" TEXT /B_/ VERTST, 0 TAD I (BUFFER+BATCH /SHOULD BE 4562 IN V3 TAD (-CBATCH SNA CLA JMP I VERTST JMS I [MESSG BADMON JMP I [7600 MVINSB, 0 DCA XR1 /ADDR OF INPUT ROUTINE TAD (BATIN-1 /ADDR OF PLACE IN BATCH MONITOR DCA XR2 TAD (-BILEN DCA BMVCNT TAD I XR1 DCA I XR2 ISZ BMVCNT JMP .-3 /MOVE ROUTINE UP JMP I MVINSB BMVCNT, 0 EOPTN, 0 /CHECK FOR /E OPTION CDF 10 TAD I (MPARAM CDF 0 AND (200 /ISOLATE E SWITCH SNA CLA JMP I EOPTN /NOT ON TAD (1000 JMS I (INCOR /OR 1000 INTO BOSSW BOSSW JMP I EOPTN EOINIT=. PAGE FIELD 0 /DUMP PAGE 0 LITERALS HERE *ORIGIN /THIS CODE ACTUALLY EXECUTES IN TOP FIELD! BATIN, ZBLOCK BILEN /BATCH INPUT ROUTINE GOES HERE END, TAD I (HUSH SZA CLA JMP BKILL /SUPPRESS #END WHEN HUSHED JMS I (PRMESG EOBMSG BKILL, CDF 10 STA TAD I (7700 /V3D DCA I (7700 /ALLOWS CORE IMAGE TO BE PRESERVED ACROSS BATCH JMP I (MORKIL SETJSW, 0 /ROUTINE TO SET JOB TAD (7377 /STATUS WORD TO INDICATE THAT CDF 0 /BATCH IS STILL IN CORE AND I (JSW TAD (400 DCA I (JSW JMS I (CDFRST /RESTORE TRUE DATA FIELD JMP I SETJSW PAGE /THIS IS THE ACTUAL BATCH MONITOR. THIS ENTRY IS FOR THE /INTERFACE WITH THE KEYBOARD MONITOR. BATVFY, 2214 /** THIS LOCATION IS VERIFIED BY BAT: ** BOS, CDF 0 /SEE IF CD FOUND AN ERROR TAD I (BOSCCL /IF BIT 11 SET, IT DID. CLL RAR CLA TAD I (BOSCCL /RESTORE IT. AND M2 /ERASE IT DCA I (BOSCCL JMS I (CDFRST /RESTORE DATA FIELD SZL CLA JMP CDERR JMS I (KMLINK /LINK I/O OF BOS AND K.M. BOSSB, TAD OUTPUT DCA BOUTDV /SET MESSAGES JMS I (GLINE /READ LINE OF INPUT TAD HUSH SZA CLA JMP BOSRE /DON'T ECHO LINES WHEN HUSHED TAD I (LINBUF TAD (-"$ SNA CLA TAD I (LINBUF+1 TAD (-"J /DON'T ECHO $JOB CARD HERE SNA CLA TAD I (LINBUF+2 TAD (-"O SZA CLA JMS I (ECHO /BUT ECHO ANY OTHER LINE BOSRE, TAD I (LINBUF /ENTER HERE FROM CD IF KM COMMAND SEEN DCA I (BNAM /GET THE FIRST CHAR ON THE LINE TAD DOLFLG /DO WE NEED $? SMA CLA JMP I (NXPRG /NO. LOOK FOR . OR / TAD I (BNAM /SEE IF WE HAVE IT TAD (-"$ SZA CLA JMP BOSSB /NOT YET. JMP I (KMDOLR /SEE IF IT'S $JOB CDERR, JMS I (PRMESG CDEMSG JMP BOS /HERE TO ECHO $JOB CARD DOLECH, TAD HUSH SZA CLA JMP HUSH2 /DON'T ECHO $JOB WHEN HUSHED TAD (214 JMS OUTCHR TAD I (BOSSW CLL RTR /ECHO A PAGE OF $JOBS TO LPT ONLY SNL CLA /IS LPT OUTPUT? JMP DOLEC2 TAD (-36 /YES DCA DOLFLG TAD (212 JMS OUTCHR /SPACE DOWN TO MIDDLE OF PAGE ISZ DOLFLG JMP .-3 /REPLACE NEXT THREE LOCS IF CENTRONIX PRINTER: JMS I (ECHO /216 JMS I (ECHO /TAD .-1 JMS I (ECHO /JMS OUTCHR /PRINT LARGE CHARS JMS I (ECHO DOLEC2, TAD (214 JMS OUTCHR JMS I (ECHOT /PUT $JOB TO TTY IF NEEDED JMS I (CRLF HUSH2, DCA DOLFLG JMP BOSSB GETDOL, 0 /ROUTINE TO PUT BACK ANY $ READ BY BAT: CDF 0 TAD I (BOSCCL /GET BATCH CONTROL WORD CLL RTR SZL CLA /TEST BIT 10 JMP GOTDOL /ITS ON - MUST PUT IN A $ JMS I (CDFRST /NO - SET DF TO THIS FIELD ISZ GETDOL JMP I GETDOL /TAKE SKIP RETURJ GOTDOL, CLL STA RTL /7775 AND I (BOSCCL DCA I (BOSCCL /REMOVE THE BIT TAD ("$ JMP I GETDOL /TAKE NON-SKIP RETURN WITH $ IN AC GETCOM, JMS I (MOVE -112 /PUT BUFFER INTO KEYBOARD MON. LINBUF+1 CDF 0 BEGLN TAD I (AMODE /V3C GET BATCH ALTMODE FLAG SZA CLA STL RAL /SET KBM ALTMODE FLAG IF NECESSARY CIF CDF 0 DCA I (AMFLAG /IT'S IN FIELD 0 JMP I .+1 /AND GO PROCESS IT KEYMON+1 M2, -2 OUTCHR, 0 JMS I BOUTDV JMP I OUTCHR BOUTDV, TTYOUT OUTPUT, 0 DOLFLG, 0 /$ SLEW FLAG - NEGATIVE IF SLEW HUSH, 0 /NON-0 MEANS HUSHED (/H) PAGE BOSSW, 0 /BATCH STATUS FLAG. MSG, 0 TAD I (DOLFLG /IF $JOB SLEW SET, DON'T PAUSE SPA CLA JMP I MSG TAD BOSSW /NO ECHO IF TTY IS OUTPUT CLL RTR SZL CLA JMS I (ECHOT TAD BOSSW /IS OPERATOR AVAILABLE? CLL RAR SZL CLA JMP I MSG /NO. CONTINUE TAD (207 JMS I (TTYOUT KCC /WAIT A WHILE JMS I (TTY JMP I MSG TESTB, 0 /TEST ROUTINE. TEST LIST AGAINST BNAM TAD I TESTB DCA PRMESG /# ELEMENTS IN LIST TSTB2, ISZ TESTB /POINT TO ELEMENT TAD I TESTB ISZ TESTB TAD I (BNAM /TEST IT SNA CLA JMP TSBOVR /A MATCH ISZ PRMESG JMP TSTB2 ISZ TESTB JMP I TESTB /NO MATCH TSBOVR, TAD I TESTB DCA TESTB JMP I TESTB OLDCOR, 0 /V3C HOLDS OLD SOFTWARE CORE SIZE WORD /MUST HAVE ADDRESS .GT. 6000 PRMESG, 0 /MESSAGE PRINTER DCA TESTB /SET FOR NO SKIP ON ISZ TAD I PRMESG /INDEX INTO MESSAGE LIST DCA PRTEMP JMS I (CRLF TAD ("# /BATCH ERROR SIGNAL JMS I (OUTCHR PRMSG2, TAD I PRTEMP CLL RTR;RTR;RTR JMS PNCH TAD I PRTEMP JMS PNCH ISZ PRTEMP JMP PRMSG2 /CYCLE UNTIL A 0 PNCH, 0 AND (77 SNA JMP PRTTY /COULD BE OPTIMIZED TAD (240 AND (77 TAD (240 JMS I (OUTCHR JMP I PNCH PRTTY, JMS I (CRLF ISZ TESTB /PUT IT ON TTY, TOO CLA CLL CML RTL /+2 SKIPPED IF SECOND TIME THROUGH AND BOSSW /SEE IF LP08 IS OUTPUT SNA JMP PRMOUT /ALREADY ON TTY AND TESTB /CALL WITH AC=1 MEANS NO TTY OUTPUT SZA CLA JMP PRMOUT TAD (TTYOUT DCA I (BOUTDV /SET TTY CLA CMA /SET TESTB TO SKIP JMP PRMESG+1 PRMOUT, TAD I (OUTPUT /RESTORE OUTPUT DCA I (BOUTDV ISZ PRMESG /SKIP ARGUMENT JMP I PRMESG KMLINK, 0 /LINK BATCH AND KEYBOARD I/O. RIF TAD BCDIF0 /SETUP A JUMP IN KEYBOARD. DCA KMLST TAD KMLST /AND ANOTHER FOR PRINT ROUTINE DCA KMLST2 JMS I (MOVE /PUT NEW CODE INTO KEYBOARD -3 KMLST CDF 0 PRINT+1 /THIS IS OUTPUT LINK JMS I (MOVE /NOW INPUT LINK. -3 KMLST2 CDF 0 XGLINE+1 JMP I KMLINK /** NEXT 3 WORDS LOAD INTO "PRINT+1" IN KEYBOARD MONITOR ** KMLST, CIF CDF 0 /ALTERED AT RUN-TIME PRINT+3&177+5600 /ALLOWS TALKING THRU BATCH BOSPRT /** NEXT 3 WORDS LOAD INTO "XGLINE+1" IN KEYBOARD MONITOR ** KMLST2, CIF CDF 0 XGLINE+3&177+5600 /"JMP I .+1" BOS BCDIF0, CIF CDF 0 PRTEMP, 0 NXPRG, JMS TESTB /SEE IF WE HAVE . OR / -4 -".;GETCOM -"/;BOSSB -"$;KMDOLR -"*;BOSSB /ERRONEOUS CD CARD. JMP I (KJOB PAGE GLINE, 0 /LINE COLLECTION ROUTINE TAD (LINBUF-1 DCA GLPTR GET, JMS I (BATIN /GO TO SPECIFIED INPUT DEVICE JMP EOF /TIME-OUT OR FATAL DCA BNAM JMS I (TESTB /TEST FOR SPECIAL CHARS. -5 -215;CARROT -212;GET /IGNORE LINE FEEDS. -214;GET /IGNORE FORM FEEDS -337;BKAROW /CD DOESN'T LIKE _, ONLY < -200;GET /IGNORE BLANKS (NULLS) V3C TAD BNAM SKP BKAROW, TAD ("< ISZ GLPTR DCA I GLPTR TAD GLPTR TAD (-LINBUF-110 /OVERFLOW BUFFER? SPA CLA JMP GET /NOT YET. CARROT, TAD I GLPTR /GET LAST CHAR INPUT TAD (-244 /$? SZA CLA JMP NALTMD /NO TAD I GLPTR /GET $ SKP NALTMD, ISZ GLPTR /BUMP TO NEXT CHAR IF NO ALTMODE DCA AMODE /STORE ALTMODE FLAG DCA I GLPTR /CLEAR END CHAR IN BUFFER TAD I (LINBUF SNA CLA /WAS LINE NULL? JMP GLINE+1 /YES - IGNORE JMP I GLINE EOF, KCC /HANG ON INPUT ACTION JMS I (PRMESG /INDICATE FAILURE INPMSG JMS I (TTY /WAIT FOR INPUT JMP GET /AND RETURN AMODE, 0 GLPTR, 0 /DOLRD INTERPRETS $ CARDS DOLRD, 0 TAD (LINBUF /GET THE NAME OF THE $ COMMAND DCA BLPTR DCA BNAM GWRD2, ISZ BLPTR TAD I BLPTR SNA JMP NOCMD /FUNNY..NOTHING THERE! TAD (-240 /IGNORE LEADING SPACES SNA JMP GWRD2 TAD (-240 /NOT A SPACE. TAKE WHATEVER IT IS. AND (77 CLL RTL;RTL;RTL DCA BNAM /KEYBOARD MON. WILL EXAMINE IT. ISZ BLPTR TAD I BLPTR AND (77 TAD BNAM DCA BNAM NOCMD, TAD BNAM SNA CLA JMP I (KJOB JMS I (TESTB /TEST IT -3 -0516;END /$END CARD -1523;MSGST /$MSG CARD IMAGE -1217;JOB /$JOB CARD DLCRUD, ISZ DOLRD /$CRUD JOB, TAD I DOLRD DCA DOLRD JMP I DOLRD MSGST, JMS I (MSG /PRINT MESSAGE JMP DLCRUD /TREAT LIKE CRUD CDOLLR, JMS DOLRD CDKBD /$JOB CDGET /$OTHER KMDOLR, JMS DOLRD DOLECH /$JOB BOSSB /$OTHER BLPTR, 0 BNAM, 0 /HERE FROM CD WHEN DONE TO ANALYZE CD AREA CDRENT, CDF 0 TAD I (LKUPSW /GET THE DEFAULT EXTENSION JMS I (CDFRST /SET CURRENT DF JMS I (CDSCN /SCAN CD LINE KCC TCF /CLEAR FLAGS JUST LIKE CD WOULD CDF CIF 0 JMP I (CDOVER+3 /RESUME CD AT TERMINATION CODE PAGE LCONV, -40 /PATCH TO 0 TO ALLOW OUTPUTTING LC TO LPT CDT, 0021;2223;2425;2627;3031;3203;4007;3502 2017;6364;6566;6770;7172;7514;0577;3637 1552;5354;5556;5760;6162;0104;1211;3374 0641;4243;4445;4647;5051;7316;3410;1376 TTYOUT, 0 /TESTS AC FOR FORM FEED TAD (-214 SNA JMP TFORM /GENERATE LINE FEEDS TAD (214 JMS TTYPE JMP I TTYOUT TFORM, TAD (-4 DCA TCOUNT TAD (212 JMS TTYPE ISZ TCOUNT JMP .-3 JMP I TTYOUT TCOUNT, 0 NULOUT, 0 CLA /DEEP-SIX THE CHARACTER JMS I (CTRLC JMP I NULOUT TTYPE, 0 /TELETYPE OUTPUT STUFF TLS TSF JMP .-1 X200, CLA JMS I (CTRLC JMP I TTYPE BOSPRT, JMS ERHDR /PRINT MESSAGE CIF CDF 0 JMP I (PRINT+10 CDFRST, 0 BOSCDF, HLT JMP I CDFRST ERHDR, 0 /ERROR HEADER ROUTINE DCA CDFRST /SAVE CHARACTER TAD I (DOLFLG /FIRST ENTRY? SZA CLA JMP .+3 /NO. TAD ("# /ERROR PROMPT JMS I (OUTCHR TAD I (BOSSW /GET BATCH FLAGS WORD CMA AND (1000 /SET $ SLEW FLAG NEGATIVE IF NO /E, STL RTL /NON-ZERO IN ANY CASE DCA I (DOLFLG TAD CDFRST JMS I (OUTCHR JMP I ERHDR CRLF, 0 TAD (215 JMS I (OUTCHR TAD (212 JMS I (OUTCHR JMP I CRLF BOSLPT, 0 /BATCH LINE PRINTER ROUTINE DCA BOSTMP TAD BOSTMP AND (177 TAD (40 AND X200 SZA CLA TAD LCONV /CONVERT LOWER CASE TO UPPER CASE TAD BOSTMP PCLS CLA JMS I (CTRLC PSKF JMP .-2 JMP I BOSLPT MORKIL, CDF 0 TAD I (BOSCCL AND (600 /GET (POSSIBLY NEW) EXTENDED DATE BITS JMS CDFRST TAD I (OLDCOR CIF CDF 0 DCA I (BOSCCL /RESTORE WORD JMP I (7605 BOSTMP, 0 PAGE /ERROR MESSAGES CDEMSG, TEXT /MONITOR OVERLAYED/ INPMSG, TEXT /INPUT FAILURE/ BADMSG, TEXT /BAD LINE. JOB ABORTED/ SERMSG, TEXT /SYS ERROR/ LINBUF, ZBLOCK 113 PAGE BATABT, JMS I (CDFRST /THIS CODE IS HERE FOR CCL! TAD I (BOSSW /GET BATCH SWITCHES CMA AND (1000 /IF /E FLAG IS UP CCL ERRORS ARE NON-FATAL, CLL RTL JMP CDKILX /OTHERWISE WE SHOULD ABORT BATCH ON THEM CDGET, JMS I (GLINE /READ INPUT TAD I (HUSH SNA CLA /DON'T ECHO CD LINES IF HUSHED JMS I (ECHO TAD (LINBUF-1 DCA CDGPTR TAD I (DOLFLG /$JOB FLAG UP? SPA CLA JMP CDKBD /SLEW UNTIL $JOB ISZ CDGPTR TAD I CDGPTR DCA I (BNAM JMS I (TESTB /TEST PROMPT CHAR. -4 -"*;CDLINE /* IS OK -"/;CDGET /REMARK -"$;CDOLLR -".;CDKBD /RECALL KEYBOARD MON. KJOB, JMS I (PRMESG BADMSG /ILLEGAL CHARACTER CDKILL, STL CLA RAR /4000 CDKILX, DCA I (DOLFLG /ABORT TO NEXT $JOB JMS I (SETJSW /MARK BATCH IN CORE CIF CDF 0 JMP I .+1 7605 /RESTART. CDKBD, CIF 0 JMS I (SYSTEM 1000 0 KMREC SYIERR, SKP CLA JMP .+4 JMS I (PRMESG SERMSG HLT JMS I (SETJSW /MARK BATCH IN CORE JMS I (KMLINK /LINK TO NEW KEYBOARD TAD (BOSRE /WE WANT TO RETAIN OLD LINE CIF CDF 0 DCA I (BCHGO+2 JMP I (BEGLN+1 CDGPTR, 0 CDLINE, JMS I (MOVE /PUT LINE INTO CD -112 LINBUF+1 CDF 0 CDBEGLN TAD I (AMODE CDF 10 SZA CLA /CHECK WHETHER ALTMODE TERMINATED LINE STL RAR /IT DID - SET CD ALTMODE FLAG DCA I (MPARAM-1 CIF CDF 0 JMP I .+1 ANALYZ DEVKIL, JMS I (PRMESG PTRMSG JMP CDKILL HLPMSG, TEXT /MANUAL HELP NEEDED/ PTRMSG, TEXT /ILLEGAL INPUT DEVICE/ EOBMSG, TEXT /END BATCH/ SPLMSG, TEXT /SPOOL TO FILE / *.-1 BCHFIL, TEXT /BTCHA0/ PAGE /SUBROUTINE TO ANALYZE CD AREA - ENTER FROM ANY FIELD /WITH DEFAULT EXTENSION IN AC CDSCN, 0 TAD (-5200 SZA TAD (5200 /THIS MAY INTRODUCE A BUG WHILE FIXING ONE - STAN - DCA EXT /SAVE EXTENSION RDF TAD (CDF CIF 0 DCA CDSCRT /SAVE RETURN FIELD TAD (7600 DCA CDTEMP /LOOK AT CD AREA MTHREE DCA CDCNT CDSCAN, JMS I (CDFRST TAD I (BOSSW CLL RTL CDF 10 SZL CLA /IS SPOOLING ENABLED TAD I CDTEMP /AND IS THERE AN OUTPUT? AND (17 SNA JMP NCKSPL /NO - DON'T LOOK TAD (DCB-1 /CHECK FILE OR NON-FILE STATUS DCA CDTMP2 TAD I CDTMP2 /SPOOL NON-FILE DEVICES SPA CLA JMP NCKSPL /FILE STRUCTURED OUTPUT TAD I CDTEMP AND (7760 TAD SPLDEV /RESET CD AREA DCA I CDTEMP ISZ CDTEMP /POINT TO FILENAME AREA JMS I (CDFRST TAD I (SPLNUM AND (11 CIA TAD (11 SNA CLA TAD (66 IAC TAD I (SPLNUM DCA I (BCHFIL+2 JMS I (MOVE -4 BCHFIL CDF 10 CDTEMP, 0 /76XX JMS I (PRMESG /PRINT FILENAME SPLMSG TAD I (BCHFIL+2 /SET NEW FILENAME DCA I (SPLNUM CLA CMA NCKSPL, TAD CDTEMP TAD (5 DCA CDTEMP TAD EXT SNA CLA JMP CDSCRT /YES - LOOK NO MORE ISZ CDCNT JMP CDSCAN /KEEP LOOKING CDX1, TAD (-11 /SCAN INPUT AREA DCA CDCNT TAD (7617 DCA CDPTR /PICK UP MANUAL INPUTS. INPSCN, CDF 10 TAD I CDPTR SNA /ANY INPUTS? JMP CDSCRT /3 GUESSES! AND (17 TAD (DCB-1 /GET DEVICE IDENTIFIER DCA CDTMP2 TAD I CDTMP2 AND (770 JMS I (CDFRST SNA JMP RBELL /TELETYPE INPUT - CHECK OPERATOR TAD (-10 SZA CLA JMP CDX3 /OK INPUT DEVICE TAD I (BOSSW SPA CLA /PTR: INPUT - IS BATCH FROM PTR? JMP I (DEVKIL /YES - ILLEGAL RBELL, TAD I (BOSSW /OPERATOR AVAILABLE? CLL RAR SZL CLA JMP I (DEVKIL /NO. ABORT THE JOB TAD (207 JMS I (TTYOUT JMS I (PRMESG HLPMSG /MANUAL INTERVENTION REQUIRED. JMS I (CRLF JMP CDSCRT CDX3, CLA CLL CML RTL TAD CDPTR DCA CDPTR ISZ CDCNT JMP INPSCN CDSCRT, HLT JMP I CDSCN /RETURN TO CALLER SPLDEV, 0 /GETS SPOOL DEVICE # EXT, 0 CDPTR, 0 CDCNT, 0 CDTMP2, 0 PAGE /THIS ROUTINE IS NOT REFERENCED FROM BATCH- /IT PROVIDES A WAY FOR A USER TO OUTPUT MESSAGES /TO THE BATCH LOG DEVICE BATOUT, 0 /CALLABLE FROM ANY FIELD DCA CTRLC /WITH CHARACTER IN AC RDF TAD CDCF0 /GET CDF CIF TO CALLING FIELD DCA BATORT JMS I (CDFRST /CDF TO CURRENT FIELD TAD CTRLC SZA JMS I (OUTCHR /OUTPUT THE CHARACTER BATORT, HLT JMP I BATOUT /ENTER HERE FROM COMMAND DECODER WHEN CD CALLED CDBOS, RIF /FILL IN CIF CDF N TAD CDCF0 /TO LINK CD AND BOS DCA CDLST1 TAD CDLST1 DCA CDLST2 TAD CDLST2 DCA CDLST3 JMS MOVE CM3, -3 CDLST1 CDF 0 TYPE+1 /LINK ERROR PRINTOUT TO BOS JMS MOVE -3 CDLST2 MCDF0, CDF 0 CGLINE /LINK INPUT TO BOS JMS MOVE -3 CDLST3 CDF 0 CDOVER /EXIT FROM LINE ANALYSIS CDCF0, CIF CDF 0 JMP I .+1 RESTRT+1 /START UP CD /** THESE 3 WORDS LOAD INTO "TYPE+1" IN THE COMMAND DECODER ** CDLST1, CIF CDF 0 TYPE+3&177+5600 /"JMP I .+1" CDPRT /** THESE 3 WORDS LOAD INTO "CGLINE" IN THE COMMAND DECODER ** CDLST2, CIF CDF 0 CGLINE+2&177+5600 /"JMP I .+1" CDGET /RETURN TO CDGET AFTER ZEROING CD AREA /** THESE 3 WORDS LOAD INTO "CDOVER" IN THE COMMAND DECODER ** CDLST3, CIF CDF 0 CDOVER+2&177+5600 /"JMP I .+1" CDRENT CTRLC, 0 /CHECK FOR ^C KRS AND (177 TAD CM3 SNA CLA KSF JMP I CTRLC JMP I .+1 BKILL ECHOT, 0 /ECHOES LINE ON TTY TAD (TTYOUT /SET TTY AS OUTPUT DCA I (BOUTDV JMS ECHO /ECHO IT JMS I (CRLF TAD I (OUTPUT DCA I (BOUTDV /RESET OUTPUT JMP I ECHOT TTY, 0 KSF JMP .-1 JMS CTRLC KCC JMP I TTY ECHO, 0 /ECHO INPUT LINE TAD (LINBUF-1 DCA EPTR ECHO2, ISZ EPTR TAD I EPTR SNA JMP ECO3 JMS I (OUTCHR JMP ECHO2 ECO3, TAD I (AMODE /NEED $ PRINTED? SZA JMS I (OUTCHR /YES JMS I (CRLF JMP I ECHO MOVE, 0 RDF TAD MCDF0 DCA MVIPUT TAD I MOVE DCA MVTMP /COUNT ISZ MOVE CLA CMA TAD I MOVE DCA MVPT1 /INPUT STUFF ISZ MOVE TAD I MOVE DCA MVOPUT /OUTPUT FIELD ISZ MOVE CLA CMA TAD I MOVE DCA MVPT2 ISZ MOVE MVIPUT, HLT ISZ MVPT1 TAD I MVPT1 MVOPUT, HLT ISZ MVPT2 DCA I MVPT2 ISZ MVTMP JMP MVIPUT JMS I (CDFRST JMP I MOVE MVTMP= CTRLC MVPT1, 0 MVPT2, 0 EPTR, 0 CDPRT, JMS I (ERHDR CIF CDF 0 /LINK BACK TO CD JMP I .+1 TYPE+10 PAGE FIELD 0 *200 $$$$$$$$$$ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 | /33 OS/8 V3D BUILD / / / / / / / / / /COPYRIGHT (C) 1971,1972,1973,1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /ABSTRACT-- /BUILD IS THE SYSTEM CONFIGURATOR FOR THE OS/8 PROGRAMMING /SYSTEM. WITH BUILD, THE DEVICES WITHIN A PARTICULAR /SYSTEM CAN BE RAPIDLY AND EASILY CHANGED. BUILD ALSO /PROVIDES THE FACILITY FOR CREATING AN INITIAL OS/8 SYSTEM /FROM BINARY PAPER TAPES OR CASSETTES. /V3 CHANGES /0. MADE BUILD SUPPORTABLE /1. ADDED VE COMMAND (CURRENT VERSION # IS 3X WHERE X IS PATCH LEVEL) /2. FIXED PROBLEM WITH Z'S AND 9'S IN FILENAMES /3. CHANGED LENGTH OF DF32 /4. FIXED PROBLEM WITH RK8 BOOTSTRAP RECORD. /5. ON LOAD, NULL EXTENSION FIRST SEARCHES FOR .BN /6. CR TO $ DOESN'T GIVE ERROR /7. FIXED BUG WITH BUILDING ROM SYS /8. RUBOUTS TO BOL GIVE $ /9. ^U RETYPES $ /10. ASSUME DSK: IF NO DEV GIVEN WITH LOAD /11. NO DOT IS PRINTED IF NO EXTENSION /12. ^O STUFF NEW /13. ALLOW PARITY ^C /14. ADDED EXAMINE COMMAND /15. FIXED BUG RE ACCESSING USR TABLE VIA POINTER /16. CLEANED UP MOVE ROUTINE /17. CLEANED UP NUMBER TOO BIG CHECKER /18. OVERFLOW ERROR MESSAGE CHANGED TO 'BAD ORIGIN' /19. DON'T ALLOW NAMES OVER 6 CHARS TO SPILL INTO EXTENSION; / DON'T ALLOW MULTIPLE EXTENSIONS /20. INCREASED NUMBER OF ALLOWABLE ENTRY PTS/HANDLER TO 16 (DEC) /21. CLEANED UP SYMBOL PRINT ROUTINE /22. GOT NAMES IN TABLE TO LINE UP. /23. INSERT GRPNAME <CR> INSERTS FIRST HANDLER /24. INSERT GRP,DEV1,DEV2,DEV3,... /25. INSERT GRP,DEV1-5,... /26. SAME FOR DELETE AND REPLACE /27. COUNT DEVICES AND SLOTS ONLY ON BOOT /28. FIXED BUG RE SYS RF08=4023 /29. GENERAL SUPPORT OF 2-PAGE SYS HANDLERS /30. ADDED QL COMMAND /31. SETS SA=00200, JSW=0 /32. UNLOAD UNLOADS AND DELETES /33. ADDED DSK COMMAND /34. BUILD COMMAND /35. PRINT TELLS YOU ABOUT DSK /36. TOOK OUT LOC DEPENDENT CHECK FOR SYSTEM HANDLERS /37. INSERT ALLOWS SETTING # OF PLATTERS /38. HANDLER HEADER LOADS DIRECTLY INTO DESCRIPTOR TABLE /39. USES EXTRA CORE IF AVAILABLE (ALSO CHECKS SOFTWARE CORE SIZE) /40. STOPS ECHOING ON INPUT LINE OVERFLOW /41. *'S SYSTEM DEVICE /42. REMEMBERS SYS ACROSS A BOOT /43. 'Y' INSTEAD OF 'YE' /44. BO CHECKS DCB IN CORE TO SEE IF NEED REWRITE MONITOR /45. ALLOW UNLOADING ENTRY POINT NAMES /46. CTL COMMAND /47. EACH COMMAND HAS ITS OWN MAXIMUM INPUT LINE SIZE /48. ADDED CORE COMMAND /49. FIXED ^U TO WRITE ZERO DIRECT MSG BUG /50. HIT CONTINUE AFTER 'SYS ERR' TO RETRY /51. PRESERVED DATE ACROSS BOOT /52. MULTIPLE LOADS AND UNLOADS /53. LOAD FROM SCRATCH USES INTERNAL ACTIVE HANDLERS /54. CASSETTE SUPPORT /55. SETS CORE CONTROL BLOCK /CHANGES SINCE FIELD RELEASE /A 'NO ROOM' DOESN'T PRINT 'BAD LOAD' /B NO. OF ENTRY POINTS NOW CORRECTLY CHECKED FOR /C FIXED BUG RE BUILDING TD8E FROM TD8E /D BOOT CMD DISABLES BUILD CMD /E JSW SET TO 1 BEFORE CHAINING TO ABSLDR /F P CMD BUG FIXED /G ALTER BUG FIXED /H LENGTH OF INPUT LINE SYMBOLIC /I SOFCOR STUFF OPTIMIZED /J QL DOESN'T PRINT SPACE BETWEEN SYS'S GRP:NAME /K FIXED BUG IN 32K /L PAPER TAPE PUTS HLT IN 7600 /THINGS TO DO: /? DIES IF DATA OCCURS BEFORE *0 /? BOOT.ZE, .NZ CMD? /? GET 2-PAGE BIT OF CURRENT SYSTEM /CHANGES FOR MAINTENANCE RELEASE V3C: / 7-AUG-75 /1. CHANGED VERSION NUMBER TO V5 /2. INCORPORATED PATCH SEQ #1 (DSN APRIL 1975) / ZERO LOCATION SOFSET WHILE BUILDING /3. INCORPORATED PATCH SEQ #2 (DSN NOV. 1974) / DISMISS USR AFTER ?NAME ERROR /4. INCORPORATED PATCH SEQ #3 (DSN MARCH 1975) / DECREASE SYSTEM SIZE BY 5 (FOR ABSLDR) WHEN BUILDING FROM PAPER TAPE /5. INCORPORATED PATCH SEQ #4 (DSN APRIL 1975) / ADDED 'SIZE' COMMAND TO BUILD /6. FIXED BUG WHICH CAUSES SYSXY.RS NOT FOUND TO BE PRINTED / ON BOOTXY.RS COMMAND /CHANGES FOR V3D: / 1-MAY-77 /1. FIXED PROBLEM WITH CASSETTE BUILD (JSW WAS SET WRONG) /2. ALLOWED SAVING OF HIGH-ORDER DATE BITS /BUILD PAGE 0 *1 HLT /SAFETY HALT AND PATCH SPACE SAV1, 0 SAV2, 0 /SAVES GROUP NAME /POINTER TO BATCH ROUTINE (GROSS BUT NEEDED THE ROOM) BATT, BATTST /AGAIN GROSS BUT WHAT CAN I SAY? *10 /AUTO INDEX REGISTERS XR1, 0 /GENERAL PURPOSE REGISTERS XR2, 0 XR3, 0 XR4, 0 /USED TO BUILD IMAGE TABLES XR5, 0 LXR, 0 GNMXR, 0 L600, 600 *20 COUNT, 0 /GENERAL COUNTER LOCATION CHAR, 0 /CHARACTER BUFFER TEMP, 0 /TEMPORARIES TMP1, 0 BUFFER=5400 BINARY=6000 DEVBUF=0400 /FIRST HANDLER AT 10400 /FOR REASONS TOO LONG TO GO INTO HERE, /BUT WHICH HAVE TO DO WITH CURIOUS /PROPERTIES OF THE NUMBER 0, /HANDLERS CAN'T START AT 0. /THEY COULD HAVE STARTED AT 200. SOFSET=7747 /SYSTEM OFFSET. (CURRENTLY =0) PG7600=BUFFER /RECORD 0 (IMAGES OF BOTH 7600'S) LDRCTL=4113 /CHECK OS/8 ASSEMBLY NAME1, 0 /NAME1-4 HOLDS FILE AND DEVICE NAMES NAME2, 0 NAME3, 0 NAME4, 0 TABLMT, DSCTAB /HIGH CORE END OF DESCRIPTORS /FIRST FREE LOCATION SIZE, 0 HNDPTR, DEVBUF /POINTS TO FIRST FREE LOCATION IN HANDLER TABLE BLDSAV=76 /**** WILL DESTROY PREVIOUS FILES /START OF 40 BLOCK TO SAVE BUILD IN HDRSIZ=10 /NUMBER OF ITEMS IN A DESCRIPTOR DSCPTR, DSCTAB /ALWAYS POINTS TO BEGIN OF CURRENT DESCRIPTOR SLOT, 0 DSKG1, 0 /NAME OF 'DSK' DSKG2, 0 DSKP1, 0 DSKP2, 0 NEWPAG, 0 OLDPAG, 0 NEWCOR, 0 /NEW CORE MAX SAVDAT, 0 /REMEMBERS DATE ACROSS A BOOT DATEWD=7666 FLAG2, 1 /0 IF PREVIOUS SYSTEM HAD A 2-PAGE HANDLER /SAMSYS, 1 /0 IF DIDN'T SPECIFY NEW SYS BLOK66=0 SYSDCB, 0 SA=7744 JSW=7746 /BOOTDV, 0 /HANDLER ADDRESS OF DEVICE WE'RE BOOTSTRAPPING TO SAVHID, 0 /HIGH-ORDER DATE (BITS 3-4) /BEGLIN: 72 CHAR LINE BUFFER /NEW BUILD CORE ALLOCATION: /0000-5177 BUILD (ABSLD MUST BE ABOVE 4177) /5400-5777 DEVICE HANDLER FOR LOAD /5200-5377 PAPER TAPE/INIT/LINE BUFFER /6000-6377 INPUT BUFFER FOR LOAD (TEMP LOC OF USR) /6400-7577 DESCRIPTOR TABLE (DSCTAB) /BINARY MUST FOLLOW BUFFER /FIELD 1: HANDLERS (0400-7577) /10000-10377 BLOK66 BUFFER *200 SKP CLA /ENTRY FROM 'R BUILD' HLT /CHAIN ENTRY ADDRESS TAD I [7600 /SEE IF SYSTEM ALREADY EXISTS CIA TAD [4207 SZA CLA /IF NOT, BUILD SYSTEM FROM PAPER TAPE CLA IAC /NOTE FACT THAT OS/8 AINT AROUND DCA I [RETSW JMS I (CORE DCA I (AMTCOR /FIGURE OUT HOW MUCH CORE WE HAVE JMS I (GOOD /DO SOME INITIALIZATION; IT'LL DO YA GOOD TAD (BATLS-1 /SET POINTER FOR BATCH OVERLAY JMS I (BATTST /GO CHECK FOR CALL FROM BATCH CONFIG, CDF 0 DCA I (ECHOFLG /ALLOW TYPING JMS I [CRLF DOLR, TAD ["$ /OUTPUT A $ BECAUSE I'M JEWISH JMS I [TTYOUT DCA I [SWAPER /USE CURRENT HANDLER, NO SWAP ON ^C. TAD [-LNLNGT JMS I [GTEXT /READ TTY LINE JMP DOLR JMS I [GNAME /INTERPRET THE COMMAND TAD NAME1 SNA JMP CONFIG DCA CHAR /ENABLE TEST TO WORK JMS I [TEST /LOOK FOR THE COMMAND IN LIST -1417;LOAD /LOAD DEVICE HANDLER BINARY -2205;REPLACE /REPLACE IN SYSTEM -1601;NAME /ALTER PERMANENT NAME -0114;ALTER /CHANGE DEVICE HANDLER LOCATION -2022;PRINT /SYSTEM STATUS -2331;SYSTEM /SPECIFY SYSTEM DEVICE -0217;BOOT /BOOTSTRAP THE NEW SYSTEM -2516;UNLOAD /DELETE INACTIVE HANDLER -0405;DELETE /DELETE ACTIVE HANDLER -1116;INSERT /INSERT HANDLER IN SYSTEM -2605;VERS /TYPE VERSION # -0530;EXAMINE /EXAMINE LOCATION -2114;QLIST /QUICK LIST -0423;DSK /DSK -0317;KORE /CORE -0403;DCBCM /DCB -0324;CTLCM /CTL -2311;SIZCM /SIZE -0516;END /END COMMAND FOR BATCH BD, -0225;BUILD /BUILD 0 /MUST TERMINATE LIST WITH 0 JMP I [WHAT /DIDN'T FIND COMMAND /NEW HEADER BLOCK: / DEVICE GROUPNAME / DEVICE PERMANENT NAME / DCB (R/W,TYPE,MAX # OF PLATTERS) / 1/2 PAGE, SYSTEM BIT, CORES BIT, REL ENTRY PT / MUST BE 0 / SIZE OF 1 PLATTER CORSIZ, GETCHA, 0 TAD DSCPTR TAD I GETCHA ISZ GETCHA DCA GETEM TAD I GETEM JMP I GETCHA /GOTCHA SUBROUTINE MOVED FOR ROOM PUT=JMS I [GOTCHA GET=JMS I [GETCHA BATTST, 0 /SUBROUTINE TO SEE IF CALLED FROM BATCH DCA XR1 /POINTER TO OVERLAY CODE IN FIELD 2 TAD I [7777 /GET THE BATCH SWITCH (JMP BATBK IF IN BATCH) RAL /BIT 1 SMA CLA /IF NO BATCH MAY NOT HAVE FIELD 2 JMP I BATTST /NOT CALLED FROM BATCH BATBK, CIF 20 /NOW TO FIELD 2 JMS I (BATSET /GO DO SOME OVERLAYS JMP I BATTST /RETURN TO CALLER GETEM, /POINTS INTO DSCTAB RELCOR, 0 CLA IAC DCA CORSIZ /MAKE RE-USABLE TAD [7400 DCA CORX /MAKE ROUTINE REUSABLE ON 32K MACHINE COR0, CDF 0 TAD CORSIZ RTL RAL AND COR70 TAD COREX DCA .+1 COR1, CDF /N TAD I CORLOC COR2, NOP DCA COR1 TAD COR2 DCA I CORLOC COR70, 70 TAD I CORLOC CORX, 7400 TAD CORX TAD CORV SZA CLA JMP COREX TAD COR1 DCA I CORLOC ISZ CORSIZ JMP COR0 COREX, CDF 0 STA TAD CORSIZ JMP I RELCOR /LEAVE WITH HIGHEST EXISTENT BANK CORLOC, CORX CORV, 1400 PAGE /GET GETS DESCRIPTOR ITEM FROM CURRENT DESCRIPTOR /OP /PUT PUTS DESCRIPTOR ITEM IN AC BACK IN SPECIFIED ITEM /OP IN CURRENT DESCRIPTOR /ITEMS: /ACTIVE BIT 0=1 MEANS ENTRY POINT HAS BEEN INSERTED (IS ACTIVE) /PERM1 PERMANENT NAME (FIRST 2 CHARS) /PERM2 2ND 2 CHARS /TWOPAG BIT 0=1 MEANS 2-PAGE HANDLER, BIT 4 IGNORED, BITS 5-11 RELATIVE ENTRY POINT /PAGRES BITS 7-11 GIVE PAGE OF START OF HANDLER WHEN ROTATED 6 RT /GRPNM1 GROUP NAME (DEVICE NAME) FIRST 2 CHARS /GRPNM2 2ND 2 CHARS /DEVSIZ GIVES SIZE OF 1 PLATTER /PLATNUM # OF PLATTERS IN BITS 2-4 /DSKBIT BIT 1 IS FLAG FOR 'DSK' (USED TEMPORARILY BY BUILD) /MAXPLT MAXIMUM NUMBER OF PLATTERS ALLOWED (IN BITS 9-11) /DCB D.C.B. BIT 0: FILESTRUCTURED, BITS 3-8 DEVICE TYPE / BITS 9-11 MAX NO. OF PLATTERS /CORES BIT 2 MEANS ENTRY PT IS CORESIDENT WITH SYS HANDLER /SYSBIT BIT 1 IS A 1 IF THE DEVICE HAS NAME 'SYS' AND IS A SYS DEVICE /IF FIRST ENTRY OF A DESCRIPTOR IS GE 7600, THEN THIS /ENTRY IS A BOOTSTRAP ENTRY. /IT STARTS WITH THE NEGATIVE OF THE NUMBER OF WORDS IN THE /BOOTSTRAP (FOR THE PRECEDING DEVICE), FOLLOWED BY THAT MANY WORDS GRPNM1=0 GRPNM2=1 PRMNM1=2 PRMNM2=3 DCB=4 MAXPLT=4 DVTYPE=4 TWOPAG=5 /BIT 0 SYSBIT=5 /BIT 1 ACTIVE=6 ENTPT=5 PAGRES=6 PLATNUM=6 DEVSIZ=7 DSKBIT=6 /BIT 1 CORES=5 /BIT 2 /READ A LINE OF TEXT RETURN 1 IS ^U RETURN GTEXT, 0 /ROUTINE TO COLLECT TTY INPUT TAD (-BEGLIN /AC IS NON-ZERO DCA ENDLIN DCA I (RUBFLG /INITIALIZE RUBOUT TO \ TAD (BEGLIN-1 RDTX, DCA LXR /BUFFER ADD. TO INDEX RDTXT, JMS I [TTYIN /READ BLOODY TELETYPE TAD CHAR DCA NAME1 /SETUP FOR TEST AGAIN JMS I [TEST -377;RBOUT /RUBOUT LFMOD, -212;LFEED /LINE FEED..ECHO CURRENT COMMAND -215;CARRET /LINE TERMINATOR -233;ALTMOD /ALT MODE IN SEVERAL FLAVORS -375;ALTMOD -376;ALTMOD -200;RDTXT /IGNORE BLANKS -217;RDTXT /AS WELL AS ^O -203;CTRLC /BACK TO CURRENT SYSTEM -225;CTRLU /CTRLU 0 /IF NOT ONE OF THESE, PUT IN BUFFER TAD LXR TAD ENDLIN SNA CLA JMP RDTXT /LINE OVERFLOW, STOP ECHOING JMS I [PRNT /PRINT THE CHARACTER TAD CHAR DCA I LXR /AND PUT IN LINE BUFFER JMP RDTXT /NO PROBLEMS YET RBOUT, TAD LXR /IS THERE TEXT TO RUB OUT? TAD [1-BEGLIN SNA CLA JMP RBCR /NO..SO DON'T DO ANYTHING TAD ["\ /YES..ECHO BACKSLASH? ISZ I (RUBFLG /IF = -1, NO JMS I [TTYOUT CLA CMA /IGNORE CONSECUTIVE RUBOUTS DCA I (RUBFLG TAD LXR DCA TMP1 TAD I TMP1 JMS I [TTYOUT /ECHO LAST CHAR XRBACK, CLA CMA TAD LXR /MOVE INDEX BACK ONE JMP RDTX CARRET, JMS I [CRLF /GENERATE 215,212 CAR1, DCA I LXR DCA I LXR /GUARD AGAINS CMD <CR> TAD [BEGLIN-1 DCA GNMXR /SETUP FOR GNAME ROUTINE ISZ GTEXT /TAKE NORMAL RETURN JMP I GTEXT LFEED, DCA I LXR /A 0 TO MARK END TAD [BEGLIN-1 DCA LXR JMS I [CRLF TAD ["$ JMS I [TTYOUT ECHO, TAD I LXR SNA /DONE ECHOING? JMP XRBACK /YES..REPOSITION LXR JMS I [TTYOUT JMP ECHO ALTMOD, TAD ["$ /ALT MODE ECHOES AS $ JMS I [TTYOUT JMP CAR1 CTRLU, TAD ["^ JMS I [TTYOUT /GENERATE ^U TAD NAME1 TAD [100 JMS I [TTYOUT RBCR, JMS I [CRLF JMP I GTEXT /TAKE ERROR RETURN GETCHR=JMS I [GETC BAKCHR=JMS I [BAKC ENDLIN, GETNUM, 0 /PICKS UP NUMBER FROM LINE BUFF /DELIM CHAR PUT IN 'CHAR' /PRINTS ERROR MESSAGE IF GT 4095 /IF NO NUMBER, TAKES RETURN 1 /IF NUMBER, TAKES RET 2 WITH # IN 'SIZE' DCA SIZE DCA GOTSW /HAVEN'T FOUND ANY DIGITS YET JMP NCHAR ROT, DCA TMP1 ISZ GOTSW /FOUND A DIGIT TAD SIZE AND [7000 SZA CLA JMP I [BADARG /NUMBER .GT. 4095 TAD SIZE CLL RTL RAL /BUILD UP THE DIGIT TAD TMP1 DCA SIZE NCHAR, GETCHR SNA /0 ENDS THE LINE JMP NUMOUT TAD [-240 /IGNORE SPACES SNA JMP NCHAR TAD (-30 /TEST LIMITS CLL TAD [10 /MUST BE BETWEEN 0 AND 7 SZL JMP ROT TAD (260 /RESTORE CHAR NUMOUT, DCA CHAR /SAVE AWAY THIS DELIMETER TAD GOTSW /DID WE GET ANY DIGITS? SZA CLA /? ISZ GETNUM /YES JMP I GETNUM /NO, RETURN GETC, 0 /GET THE NEXT CHARACTER, ADVANCE SCAN PAST IT TAD I GNMXR JMP I GETC GOTSW, /1 MEANS GOT A DIGIT BAKC, 0 /BACK UP SCAN TO THE CHARACTER JUST LOOKED AT STA TAD GNMXR DCA GNMXR JMP I BAKC PAGE INIT=JMS I [INI ADVDSC=JMS I [DSCADV ADVBOT=JMS I [BOTADV / JMS PRMNAM /SEARCH TABLE FOR A PERMANENT NAME /GIVEN IN NAME1-NAME2 /POINT TO DESCRIPTOR FOR THIS NAME / JMS ACTNAM /SAME BUT PERMANENT NAME MUST BE ACTIVE / JMS BIGNAM /SEARCHES FOR PERM & GRP NAME (GRP NAME IN SAV1,SAV2) / JMS GRPNAM /SAME BUT SEARCH FOR GROUP NAME CHKNAM, 0 INIT CHKLUP, ADVDSC /ADVANCE TO NEXT DESCRIPTOR ADVBOT /ADVANCE OVER ANY BOOTSTRAP JMP NFOUND /NO MORE- ERROR GET NM1, GRPNM1 /GET GROUP OR PERMANENT NAME CIA TAD NAME1 SZA CLA /DO FIRST WORDS MATCH? JMP CHKLUP /NO, TRY AGAIN GET NM2, GRPNM2 /GET 2ND WORD CIA TAD NAME2 SZA CLA /2ND WORD MATCH? JMP CHKLUP /NO TAD BIGFLG SNA CLA /WANT BOTH GROUP AND PERM NAME? JMP NOBIG /NO GET /YES GRPNM1 CIA TAD SAV1 SZA CLA JMP CHKLUP GET GRPNM2 CIA TAD SAV2 SZA CLA JMP CHKLUP NOBIG, TAD ACTSW /FOUND MATCH SNA CLA /MUST HANDLER BE ACTIVE? JMP I CHKNAM /NO, RETURN GET /YES ACTIVE SMA CLA /IS IT ACTIVE? JMP CHKLUP /NO, TRY AGAIN JMP I CHKNAM /YES, RETURN GRPNAM, 0 TAD (GRPNM1 /WANT TO SEARCH FOR GROUP NAME DCA NM1 TAD (GRPNM2 DCA NM2 DCA ACTSW /NEED NOT BE ACTIVE DCA BIGFLG JMS CHKNAM /GO SEARCH JMP I GRPNAM ACTSW, 0 /1 MEANS HANDLER MUST BE ACTIVE PRMNAM, 0 DCA ACTSW /AC MAY BE NON ZERO (TO MEAN ACTIVE ONLY) TAD (PRMNM1 /WANT TO SEARCH FOR PERMANENT NAME DCA NM1 TAD (PRMNM2 DCA NM2 DCA BIGFLG JMS CHKNAM /GO SEARCH JMP I PRMNAM BADLOD, JMS I [CRLF JMS I [PRWD TEXT /?BAD LOAD/ DCA I TABLMT /RESTORE SENTINEL 0 JMP I [CONFIG BIGNAM, 0 DCA ACTSW TAD (PRMNM1 DCA NM1 TAD (PRMNM2 DCA NM2 CLA IAC DCA BIGFLG JMS CHKNAM JMP I BIGNAM /SOMETIMES CHKNAM CAME FROM DSKASK INSTEAD OF GETSYS **** BIGFLG, 0 /SET TO 1 TO CHECK GROUP & PERMANENT NAME NFOUND, JMS I [PRNAME JMS I [PRWD TEXT / NOT FOUND/ JMP I [CONFIG NOROOM, JMS I [PRWD TEXT /?NO ROOM/ DCA I TABLMT /RESTORE SENTINEL 0 JMP I [CONFIG VERS, JMS I [PRWD TEXT /BUILD V7A/ JMP I [CONFIG /BUILD CORE CONTROL BLOCK / ***** CAUTION IF BUILD GROWS FROM FIELD 2 BLDCCB, -3 /3 SEGMENTS 6203 /FIELD 0 0200 /200 IS S.A. 0000 /JSW 0000 1020 /20000-21777 0000 /10000-17577 3710 0000 /00000-07577 3700 /GOES INTO WORDS 200-377 OF BLOCK 37 PAGE /LOAD A 1- OR 2-PAGE HANDLER INTO BUFFER /USE IT TO ABSLD SETUP, 0 TAD [NAME1 DCA FILPTR /POINT TO FILENAME AREA TAD (BUFFER+1 /LOAD 2 PAGE HANDLER INTO 'BUFFER' DCA DRIVER /SET UP ASSIGN DEVICE HANDLER JMS I [GNAME /GET DEVICE NAME TAD NAME1 SNA CLA JMP I SETUP /NO ARG ISZ SETUP TAD I (RETSW SZA CLA JMP I (BLDLOD /WHEN LOADING STANDALONE, USE INTERNAL HANDLERS TAD CHAR TAD [-": SZA CLA JMP I (SETDSK /USE 'DSK ' IF NO DEVICE GIVEN TAD NAME1 DCA DVNM1 TAD NAME2 DCA DVNM1+1 /LOOKUP DEVICE NAME GETU, JMS I (GETUSR CIF 10 JMS I [200 /FETCH HANDLER 1 SUBLUP, DVNM1, 0 LODTMP, DVNUM, 0 /NAME GOES IN HERE DRIVER, 0 JMP I (KICKM /NO DEVICE. RELEASE MONITOR TAD CHAR SZA CLA JMS I [GNAME /PICK UP FILE NAME TAD DVNM1+1 /DEVICE NUMBER JMS I (DTYPE /SEE IF FILE STRUCTURED TAD NAME1 /IF FILE STRUCTURED WITH NO NAME SNA CLA /IT IS AN ERROR JMP I (NMER /V3C TAD NAME4 /SAVE ORIGINAL EXTENSION DCA TEMP TAD NAME4 SNA /IF NULL TAD (0216 /TRY .BN FIRST TRYAGN, DCA NAME4 TAD DVNUM /GET DEVICE NUMBER CIF 10 JMS I [200 /DO LOOKUP OF FILENAME 2 FILPTR, NAME1 0 JMP LDEXT /DIDN'T FIND FILE. DO SOMETHING CIF 10 JMS I [200 /KICK OUT MONITOR 11 TAD DRIVER LOADIN, DCA I [DVICE /ENTRY POINT OF HANDLER JMS I (IOPEN /IF HERE, IT WILL FIT JMP I SETUP LOAD, JMS SETUP /SET UP FOR INPUT JMP I [NODEV /NO LOAD DEVICE STA CLL RAL /-2 DO A HANDLER LOAD CIF CDF 20 /OFF TO FIELD 2 JMS I (LDABS JMP I [BADLOD /BAD TAD I TABLMT /SEE IF HEADER INFORMATION IS OK SMA JMP I [BADLOD TAD (20 /ALLOW 16 HANDLERS/BINARY SPA CLA JMP I [BADINP /TOO MANY TAD I TABLMT DCA LODTMP /# OF LOOPS TO EXECUTE TAD TABLMT TAD [PAGRES+1 /POINT TO FIRST 'PAGRES' WORD DCA HDPTR /GO THERE FOR DESCRIPTORS TAD HNDPTR JMS I [ROTL DCA TEMP /PAGE OF RESIDENCE PGLUP, TAD TEMP DCA I HDPTR /INSERT PAGE OF RESIDENCE TAD HDPTR TAD [HDRSIZ DCA HDPTR ISZ LODTMP JMP PGLUP TAD [2-HDRSIZ TAD HDPTR DCA HDPTR /POINT TO AFTER DESCRIPTORS TAD HDPTR CIA TAD I (NEWLIM SNA CLA /AT END? JMP I (OK /YES TAD I HDPTR /NO, MAYBE A BOOTSTRAP RECORD CLL TAD [200 SNL CLA JMP I [BADLOD /NO TAD I HDPTR /MAYBE CIA IAC /OVER COUNT TAD HDPTR CIA TAD I (NEWLIM SZA CLA JMP I [BADLOD /NO JMP I (OK HDPTR, 0 /POINTS INTO NEW HEADER /DESCRIPTOR TABLE DESCRIPTION: /'TABLMT' ALWAYS POINTS TO FIRST FREE LOCATION /'DSCPTR' ALWAYS POINTS TO BEGIN OF CURRENT HEADER BLOCK /ITEMS ARE OF 3 FORMS: /(A) GROUP COUNT: IN RANGE -1 TO -20 (IGNORED AND HAS NO MEANING) / IT IS THERE FOR COMPATIBILITY WITH OLD BUILD /(B) HEADER BLOCK STARTS WITH NUMBER IN RANGE 0-7577 / CONSISTS OF 'HDRSIZ' CONSECUTIVE WORDS / DESCRIBED ELSEWHERE /(C) BOOTSTRAP BLOCK: STARTS WITH NUMBER IN RANGE 7600-7757 / THIS IS THE NEGATIVE OF THE NUMBER OF WORDS TO FOLLOW /NON-SYSTEM HEADER INFO: / - NUMBER OF ENTRY POINTS /FOR EACH ENTRY POINT: /0,1 GROUP NAME /2,3 ENTRY POINT NAME (PERMANENT NAME) /4 R/W FILE-STR, DEVICE TYPE, MAX # OF PLATTERS /5 1/2 PAGE, REL ENTRY PT, SYSBIT, CORES /6* PAGE OF HANDLER, ACTIVE BIT, # OF PLATS, DSKBIT /7 SIZE OF DEVICE /* SUPPLIED BY BUILD LDEXT, TAD TEMP /DIDN'T FIND FILE SZA CLA JMP I (KICKM /NO RESORT ISZ TEMP JMP TRYAGN /TRY NULL EXTENSION PAGE REPLACE,JMS I (DEL /DELETE PERMANENT NAME SPECIFIED NEXT TAD CHAR TAD MEQ SZA CLA /AFTER ALL DELETIONS, MUST FIND A "=" JMP I [SYNTAX /IF NOT, WARN THE GUY JMS INS /IF FOUND IT, NOW PERFORM INSERTIONS JMP I [CONFIG /THE GUY HAS BEEN HUMORED INSERT, JMS INS TSTEOL, TAD CHAR /THERE SHOULDN'T BE ANYTHING AFTER EOC SNA CLA JMP I [CONFIG /THERE WASN'T JMP I [SYNTAX /WARN BLOKE ABOUT EXTRA STUFF DELETE, JMS I (DEL /DELETE PERMANENT NAMES SPECIFIED JMP TSTEOL SYSTEM, JMS INS /SYS IS SAME AS INSERT GET SYSBIT RTL SPA SZL CLA /BUT SYSBIT OR CORES SHOULD BE ON JMP TSTEOL /JUST TO HUMOR IT'S NAME TWOSYS, JMS I [PRWD /AND FOR COMPATIBILITY REASONS TEXT /?SYS/ JMP I [CONFIG INS, 0 TAD (STL RAR DCA I (ACTION /SET 'ACTION' FOR INSERTIONS JMS I [TSTNAM /LOOK FOR A NAME JMS I [GRPNAM /GET GROUP NAME JMS SAVNAM JMS I [TEST MEQ, -"=;ACT -",;INSNAM -":;INSNAM 4000;ACT 0 INSNAM, JMS I [TSTNAM /GRAB A NAME INSGN, JMS I [BIGNAM /GET PERMANENT NAME WITH SPECIFIED GROUP NAME GET GRPNM1 CIA TAD SAV1 SZA CLA JMP I [NFOUND /MAKE SURE PERMANENT NAME FOUND GET /HAS GROUP NAME PREVIOUSLY SPECIFIED GRPNM2 CIA TAD SAV2 SZA CLA JMP I [NFOUND ACT, JMS I (SETACT /SET ACTIVE BIT COM, JMS I [TEST -"-;HYPH -",;INSNAM -"=;INPLAT 0 JMP I INS INPLAT, JMS I [GETNUM /AN "=" JMP I [SYNTAX TAD SIZE SNA CLA JMP I [BADARG /=0 ILLEGAL GET MAXPLT AND [7 /GET MAXIMUM # OF PLATTERS ALLOWED SNA IAC /0 MEANT 1 CMA CLL TAD SIZE /COMPARE WITH USER'S REQUEST SZL CLA /IS HIS REQUEST OKAY? JMP BADPLT /REQUEST-SHMEST. TOO MANY PLATTERS TAD SIZE JMS I [ROTR DCA SIZE GET PLATNUM AND (6177 TAD SIZE /STORE AWAY HIS STATED NUMBER OF PLATTERS PUT /FOR FUTURE USE BY 'BOOT' PLATNUM JMP COM /REJOIN PROCESSING BADPLT, JMS I [PRWD TEXT /?PLAT/ JMP I [CONFIG SAVNAM, 0 TAD NAME1 DCA SAV1 /SAVE GROUP NAME TAD NAME2 DCA SAV2 JMP I SAVNAM HYPH, TAD NAME2 AND [77 CIA DCA DETEM GETCHR AND [77 TAD DETEM /GET CHAR AFTER HYPEN SNA CLA /REACHED IT YET? JMP IGET /YES, WELL TRY FOR MORE STUFF BAKCHR /NO, PUT IT BACK FOR FUTURE USE ISZ NAME2 /FORM NEXT SEQUENTIAL NAME JMP INSGN /GO INSERT IT /DO WE REALLY HAVE TO START SEARCH AT CURRENT DESCR? DETEM, 0 IGET, GETCHR DCA CHAR JMP COM NODEV, JMS I [PRWD TEXT /?DEVICE/ JMP I [CONFIG PAGE INTEM, SETACT, 0 GET ACTIVE /GET ACTIVATION BIT RAL ACTION, STL RAR /ACTIVATE IT (SET TO 'CLL RAR' TO DEACT) PUT ACTIVE /RESTORE JMP I SETACT DEL, 0 TAD (CLL RAR DCA ACTION DELNAM, JMS I [TSTNAM /PARSE OFF A NAME DELGN, JMS I [ACTNAM /FIND IT AS AN ACTIVE PERMANENT NAME JMS SETACT /DEACTIVATE IT GET PLATNUM AND [6177 /SET # OF PLATTERS TO 0 PUT PLATNUM DCOM, JMS I [TEST -"-;DHYPH -",;DELNAM 0 JMP I DEL DHYPH, TAD NAME2 AND [77 CIA DCA INTEM GETCHR AND [77 TAD INTEM SNA CLA /REACHED FINAL NAME? JMP DGET /YES BAKCHR /NO, PUT FINAL LETTER BACK ISZ NAME2 /YES, BUMP TO NEXT NAME L0423, 423 JMP DELGN /DELETE NEXT ONE IN SUCCESSION DGET, GETCHR DCA CHAR JMP DCOM TTYIN, 0 /TTY INPUT ROUTINE KSF JMP .-1 KRB SNA /LOW LEVEL BLANK IGNORE JMP TTYIN+1 AND [177 /HANDLE PARITY TAD [200 DCA CHAR JMP I TTYIN /DSK=ACTIVE PERMANENT NAME /DSK=GROUPNAME:PERMANENT NAME /DSK=<CR> MEANS NO DSK SPECIFIED, USE 'SYS' /JUST REMEMBERS NAME (NOTHING ELSE) DSK, JMS I [GNAME /GET A NAME TAD NAME1 SNA CLA JMP NODSK TAD CHAR SNA JMP NOCOL TAD [-": SZA CLA /IS IT FOLLOWED BY A ":"? JMP I [SYNTAX /NO, ASSUME HE'S GIVING AN ACTIVE PERMANENT NAME /THIS IS FOR COMPATIBILITY WITH OLD BUILD / JMS I [GRPNAM /YES, ITS A GROUP NAME TAD NAME1 /SAVE IT DCA DSKG1 TAD NAME2 DCA DSKG2 JMS I [TSTNAM /GET PERMANENT NAME PN, TAD NAME1 DCA DSKP1 /DON'T WORRY NOW IF IT'S AROUND TAD NAME2 DCA DSKP2 TAD CHAR SZA CLA JMP I [SYNTAX JMP I [CONFIG NODSK, DCA DSKG1 /FIRST WORD 0 MEANS NONE SPECIFIED JMP I [CONFIG NOCOL, JMS I [ACTNAM /IT MUST BE AN ACTIVE HANDLER GET GRPNM1 DCA DSKG1 GET GRPNM2 DCA DSKG2 JMP PN SETDSK, TAD L0423 /DS DCA I (DVNM1 TAD (1300 /K DCA I (DVNM1+1 JMP I (GETU KICKM, CIF 10 /RELEASE MONITOR AND RELOAD JMS I [200 /OUR DEVICES 11 JMP I [NFOUND GETUSR, 0 CIF 10 JMS I [7700 /LOCK IN MONITOR 10 CIF 10 /RESET RESIDENT HANDLER TABLE JMS I [200 13 JMP I GETUSR / CODE FOR USING INTERNAL HANDLERS ON STANDALONE LOAD: BLDLOD, DCA I (FILPTR /LOAD DEV JMS I [ACTNAM /MUST BE ACTIVE JMS I [GETPG DCA HNDLOK /LOCATION OF HANDLER TAD [-400 JMS I [MOVE CDF 10 HNDLOK, HLT CDF 0 PBUFFER,BUFFER GET DCB DCA BLDCB GET ENTPT AND [177 TAD PBUFFER /GET ENTRY POINT OF HANDLER JMP I (LOADIN BLDCB, 0 /CONTAINS DCB OF CURRENT LOAD HANDLER PAGE GETPG, 0 GET PAGRES JMS I [ROTR AND [7600 JMP I GETPG /FORMAT: NAME OLDNAME=NEWNAME NAME, JMS TSTNAM /SEE IF ARGUMENT SUPPLIED /SEARCH PERMANENT TABLES JMS I [ACTNAM /GET ACTIVE PERMANENT NAME DESCRIPTOR TAD CHAR TAD MEQL /CHECK FOR = SZA CLA JMP I [BADARG JMS TSTNAM /GET NEW DEVICE NAME TAD NAME1 /REPLACE THE NAME PUT PRMNM1 TAD NAME2 PUT PRMNM2 JMP I [CONFIG EXAMINE,CLA IAC ALTER, DCA XSWTCH JMS I [TSTNAM /ALTER ALLOWS MODS TO A PARTICULAR JMS I [GRPNAM /HANDLER'S ACTUAL CODE. /LOOK AT DEVICE TYPE ENTRY JMS GETPG /GET PAGE OF RESIDENCE DCA PAGAD /SAVE IT. JMS I [GETNUM /GET RELATIVE LOC TO ALTER JMP I [SYNTAX /NO NUMBER GET P2PAG, TWOPAG /IS THIS A 2-PAGE HANDLER? SPA CLA TAD [7600 TAD [7600 /ALLOW 200 OR 400 MAXIMUM CLL TAD SIZE /IS THE # TO ALTER TOO LARGE? SZL CLA JMP I [BADARG /I GUESS IT IS TAD SIZE TAD PAGAD /GET ABSOLUTE LOCATION DCA PAGAD TAD XSWTCH SZA CLA /EXAMINE OR ALTER? JMP EXAM /EXAMINE TAD CHAR /ALTER SZA CLA /CR? JMP GETVAL /NO JMS EXAMSB /YES, GIVE GUY OLD VALUE FIRST ODTL, TAD ["/ /ODT LIKE JMS I [TTYOUT TAD [-100 JMS I [GTEXT JMP ODTL GETVAL, JMS I [GETNUM /GET NEW CONTENTS JMP I (TSTEOL /NO NUMBER TAD SIZE CDF 10 DCA I PAGAD /REPLACE THAT LOC. JMP I [CONFIG /AND GET OUT PAGAD, 0 /ALTER GROUPNAME,LOC=NEWVALUE /ALTER GROUPNAME,LOC /EXAMINE GROUPNAME,LOC /SIZE ACTNAM /SIZE ACTNAM=VALUE /DCB ACTNAM /DCB ACTNAM=VALUE /CTL ACTNAM /CTL ACTNAM=VALUE SIZCM, TAD (3 /SIZE COMMAND V3C DCBCM, TAD [-1 /EXAMINE DCB WORD CTLCM, TAD P2PAG /EXAMINE CONTROL WORD DCA PUTAT TAD PUTAT DCA LOOKAT JMS I [TSTNAM /GET A NAME JMS I [ACTNAM /IT MUST BE ACTIVE JMS I [TEST MEQL, -"=;INPDCB 4000;EXAMDCB 0 JMP I [SYNTAX INPDCB, JMS I [GETNUM JMP I [CONFIG /IGNORE = NOTHING TAD SIZE PUT XSWTCH, /0 MEANS ALTER, 1 MEANS EXAMINE PUTAT, DCB JMP I [CONFIG /THE USER LIVES DANGEROUSLY EXAMDCB,GET LOOKAT, DCB JMS PUTNUM TAD ["/ JMS I [TTYOUT TAD [-100 JMS I [GTEXT JMP EXAMDCB JMP INPDCB /NOW PARSE OFF THE REPLY EXAM, JMS EXAMSB JMP I [CONFIG EXAMSB, 0 CDF 10 TAD I PAGAD /GET CURRENT CONTENTS CDF 0 JMS PUTNUM /PRINT IT JMP I EXAMSB PUTNUM, 0 /PRINT AN OCTAL NUMBER DCA PTM TAD [-4 /4 DIGITS DCA PKNT PLOOP, TAD PTM RTL RTL AND [7 TAD (60 JMS I [TTYOUT TAD PTM RTL RAL DCA PTM ISZ PKNT JMP PLOOP JMP I PUTNUM PTM, 0 PKNT, TSTNAM, 0 JMS I [GNAME /COLLECT NAME TAD NAME1 /IF NO NAME FOUND, GIVE ERROR SZA CLA JMP I TSTNAM NAMERR, JMS I [PRWD TEXT /?NAME/ JMP I [CONFIG PAGE /PRINT FUNCTION TYPES OUT THE STATUS OF BUILD ON COMMAND /AN * BESIDE A DEVICE INDICATES THAT IT IS CURRENTLY MARKED /FOR INSERTION IN THE SYSTEM BEING BUILT. TTY240, PRINT, STA DCA OLDPAG /SET ILLEGAL OLD PAGE INIT ISZ I (LINEUP /MAKE THINGS LINE UP PRLUP, ADVDSC /ADVANCE TO NEXT DESCRIPTOR ADVBOT /ADVANCE PAST A BOOTSTRAP (IF ANY) JMP DONE /ALL DONE JMS I [GETPG /GET PAGE OF NEW HANDLER DCA NEWPAG TAD NEWPAG CIA TAD OLDPAG /COMPARE WITH LAST HANDLER'S PAGE SNA CLA /SAME? JMP PRTPER /YES JMS I [CRLF /NO, GO TO NEXT LINE TAD NEWPAG DCA OLDPAG JMS PGNAME TAD TTY240 JMS I [TTYOUT PRTPER, GET /GET ACTIVE BIT ACTIVE SPA CLA /IS IT ACTIVE? TAD ("*-STA /YES, PRINT * TAD TTY240 /NO, PRINT SPACE JMS I [TTYOUT JMS PNAME /PRINT PERMANENT NAME JMP PRLUP PGNAME, 0 GET GRPNM1 JMS I (PRINTE /PRINT GROUP NAME GET GRPNM2 JMS I (PRINTE TAD (": JMS I [TTYOUT JMP I PGNAME DONE, DCA I (LINEUP /NO MORE LINE-UP TAD DSKG1 SNA CLA JMP TELCOR JMS I [CRLF /TELL GUY ABOUT 'DSK' JMS I [CRLF JMS I [PRWD TEXT /DSK=/ TAD DSKG1 JMS I (PRINTE TAD DSKG2 JMS I (PRINTE TAD (": JMS I [TTYOUT TAD DSKP1 JMS I (PRINTE TAD DSKP2 JMS I (PRINTE TELCOR, TAD NEWCOR SNA JMP I [CONFIG /NO SPECIFIED CORE LIMIT JMS I [ROTL TAD (6000 DCA CORMSG+3 JMS I [CRLF JMS I [PRWD CORMSG, TEXT /CORE= / JMP I [CONFIG /QUICK PRINT QLIST, INIT QLUP, ADVDSC /ADVANCE TO NEXT DESCRIPTOR ADVBOT /ADVANCE OVER ANY BOOTSTRAP IF NECESSARY JMP DONE /GO AWAY WHEN NO MORE GET ACTIVE /GET ACTIVE BIT SMA CLA /IS IT ACTIVE? JMP QLUP /NO, IGNORE IT GET /YES SYSBIT RAL SPA CLA /IS IT 'SYS'? JMS PGNAME /YES, PRINT GROUP NAME TOO JMS PNAME /NO, PRINT PERMANENT NAME ONLY JMP QLUP DT, PNAME, 0 GET PRMNM1 JMS I (PRINTE GET PRMNM2 JMS I (PRINTE TAD TTY240 JMS I [TTYOUT JMP I PNAME DCBTBL=7760 WHAT, JMS I [PRNAME JMS I [PRWD TEXT /?/ /FOR WHEN A COMMAND ERROR OCCURS JMP I [CONFIG DTYPE, 0 /RETURNS TYPE OF OUTPUT TAD (DCBTBL-1 DCA DT /ENTRY AC HAD DEVICE # CDF 10 TAD I DT /IF FILE DEVICE, LINK=0 CDF 0 CMA RAL /ALSO, IF FILE AC=0 ON EXIT CLA RAL JMP I DTYPE WRITCC, 0 TAD [-6 /PUT IN DATA BREAK FILLERS JMS I [MOVE CDF 0 K7750 CDF 0 PG7600+200+150 TAD (4200 JMS I [SYS /WRITE NEW CCB BLDCCB-200 37 JMP I WRITCC PAGE TOOMANY,JMS I [PRWD TEXT /?HANDLERS/ JMP I [CONFIG GOTCHA, 0 DCA I (GOTEM TAD I GOTCHA TAD DSCPTR ISZ GOTCHA DCA GETEMP TAD I (GOTEM DCA I GETEMP JMP I GOTCHA GETEMP, 0 /TEMP FOR GOTCHA TEST, 0 /TEST CHAR AGAINST ARGUMENTS TAD I TEST /PICK UP ARGUMENT FROM LIST SNA /0 TERMINATES JMP I TEST TAD CHAR /SEE IF THEY COMPARE = AND (3777 /COMPARE ONLY LOW ORDER, THUS ALLOWING '4000' TO MEAN '0' SNA CLA JMP TSTOVR /THEY DO..DISPATCH TO TABLE ISZ TEST ISZ TEST JMP TEST+1 /THEY DON'T. KEEP GOING TSTOVR, ISZ TEST TAD I TEST DCA TEMP JMP I TEMP K7750, 7750 /DATA BREAK FILLERS 7751 7752 7753 7754 7755 SYS, 0 /SAVES A FEW WORDS IN SYSTEM CALLS DCA SYCTL /SAVE FUNCTION WORD TAD I SYS DCA SYBUF /BUFFER BEING USED ISZ SYS TAD I SYS DCA SYREC /RECORD # ISZ SYS /THERE IS NO ERROR RETURN /IF SWAPER SET AND BOOTDV SET, USE SPECIAL BOOT HANDLER HERE GO, JMS I SYSENT SYCTL, 0 SYBUF, 0 SYREC, 0 SKP CLA JMP I SYS JMS I [PRWD TEXT /SYS ERR/ HLT /IF USER IS DARING, HIT CONTINUE TO RETRY JMP GO SYSENT, 7607 /***************** / / SYS HANDLER IS 2-PAGES LONG IF LOCATION 7612 IS A 3 / /****************** CLRTBL, 0 TAD [BEGLIN DCA XR1 TAD [-200 /ZERO OUT 5200-5377 DCA TMP1 DCA I XR1 ISZ TMP1 JMP .-2 JMP I CLRTBL /FOR HANDLER ONLY ORGLIM, 0 /THIS ROUTINE MAKES CERTAIN THAT DCA CLRTBL /THE ORIGIN FOR LDABS IS WITHIN TAD CLRTBL /THE BOUNDS SPECIFIED BY SIZE TAD [7600 /AND THE CONTENTS OF HNDPTR SPA JMP BADORG /ORIGIN BELOW 200 CIA TAD [400 /IS ORIGIN WITHIN UPPER BOUND? SPA CLA JMP BADORG TAD CLRTBL TAD [7600 /NOW GIVE BACK RELATIVE BUFFER TAD HNDPTR /ADDRESS IN FIELD 1 DCA CLRTBL TAD CLRTBL AND [7600 TAD [200 SNA CLA JMP I (NOROOM /CAN'T 'ORIGIN' INTO PAGE 7600 TAD CLRTBL CIF CDF 20 /CALLED FROM FIELD 2 JMP I ORGLIM BADORG, JMS I [PRWD TEXT /?ORIGIN/ JMP I (OVROUT /SOMEWHERE TEST IF HE GAVE US A 2-PAGE BUT REQ A 1-PAGE / PG7600_0 / BLOK66_66 / IF OLD SYS WAS 1 PAGE, BLOK66/L_PG7600/L RECZRO, 0 /READS FIELD 1 CODE, EVEN FOR 12K TD8E TAD [200 JMS I [SYS /READ RECORD 0 PG7600 0 /THAT NORMALLY CONTAINS FIELD 1 TAD (210 JMS I [SYS /READ RECORD 66 BLOK66 66 TAD FLAG2 /DID PREVIOUS SYSTEM HAVE A 2-PAGE HANDLER? SZA CLA TAD [-200 /NO JMS I [MOVE /YES CDF 0 PG7600 CDF 10 BLOK66 JMP I RECZRO NOTNUF, JMS I [PRWD TEXT /?CORE/ JMP I [CONFIG PAGE UNLOAD, JMS I [TSTNAM /PULL OFF A NAME JMS I [GRPNAM /IT HAD BETTER BE A GROUP NAME JMS I [TEST -":;UNLPRM 4000;UNLGRP 0 JMP I [SYNTAX UNLPRM, JMS I (SAVNAM /UNLOAD PARTICULAR HANDLER UNLNAM, JMS I [TSTNAM JMS I [BIGNAM TAD DSCPTR /DELETE A SINGLE DESCRIPTOR DCA SAVPTR /DON(T DELETE HANDLER TAD DSCPTR /OR BOOTSTRAP TAD [HDRSIZ /NO RELOCATION NECESSARY DCA LSTPTR TAD TABLMT JMP NOMOR UNLGRP, JMS I [GETPG /GET PAGE OF RESIDENCE DCA TOMOV /START OF HANDLER GET TWOPAG /IS IT A 1- OR 2- PAGE HANDLER? SPA CLA TAD [200 /2 PAGE TAD [200 /1 PAGE DCA UNSIZE TAD TOMOV /DELETE HANDLER AND MOVE ALL FOLLOWING DOWN TAD UNSIZE DCA FROMOV /GET FIRST LOCATION AFTER HANDLER TAD HNDPTR /GET NEXT FREE LOCATION FOR HANDLER CIA TAD FROMOV /GET NUMBER OF LOCS TO MOVE JMS I [MOVE CDF 10 FROMOV, 0 CDF 10 TOMOV, 0 /UPDATE POINTERS; SEARCH DESCRIPTORS TAD UNSIZE /FOR REFS TO MOVED HANDLERS AND DECREASE CIA /THOSE REFS BY -UNSIZE TAD HNDPTR DCA HNDPTR /FREES SOME BUFFER SPACE TAD TABLMT DCA OLDTOP /REMEMBER ORIGINAL TOP OF STACK STA /BACK UP OVER GROUP COUNT TAD DSCPTR DCA SAVPTR /REMEMBER THIS LOCATION TAD UNSIZE JMS I [ROTL CIA DCA UNSIZE TAD DSCPTR TAD [HDRSIZ DCA LSTPTR /'LSTPTR' POINTS TO FIRST DESCRIPTOR BEING MOVED /COMPRESS THE DESCRIPTORS ABOVE THIS ONE ADV, ADVDSC /ADVANCE TO NEXT DESCRIPTOR JMP BADV /ENCOUNTERED A BOOTSTRAP RECORD JMP NOMORE /NO MORE, THROUGH GT, JMS I [GETPG /GET PAGE OF THIS DESCRIPTOR CLL CIA TAD TOMOV /COMPARE WITH PAGE OF DELETED HANDLER SNA CLA JMP SAMPAG /THEY'RE THE SAME SZL /THEY'RE NOT THE SAME. WHICH IS HIGHER? JMP ADV /IT WAS BELOW HANDLER. NO SWEAT. GET /IT WAS ABOVE HANDLER, HAVE TO ACCOUNT FOR THIS PAGRES /POINT TO NEW HANDLER LOCATION TAD UNSIZE PUT PAGRES JMP ADV /CONTINUE SAMPAG, TAD [HDRSIZ TAD DSCPTR DCA LSTPTR /NOTE LOCATION OF NEXT DESCRIPTOR JMP ADV /ADVANCE PAST BOOTSTRAP OR DELETE IT AS NECESSARY BADV, TAD DSCPTR CIA TAD LSTPTR SZA CLA /IS THIS BOOT PART OF GROUP BEING UNLOADED? JMP BDV /NO TAD I DSCPTR /YES CIA IAC TAD DSCPTR DCA LSTPTR /SET 'LSTPTR' TO BEGIN OF NEXT DESCRIPTOR BDV, ADVBOT /ADVANCE OVER BOOTSTRAP JMP NOMORE /DONE JMP GT /GO ON TO NEXT DESCRIPTOR /ALL DESCRIPTORS FOR THE SAME HANDLER ARE CONSECUTIVE /MOVE DOWN DESCRIPTORS NOMORE, TAD OLDTOP NOMOR, CIA TAD LSTPTR /MINUS # OF WORDS TO MOVE JMS I [MOVE CDF 0 LSTPTR, 0 /FIRST DESCRIPTOR NOT CONSIDERED CDF 0 SAVPTR, 0 /POINTS TO INITIAL DESCRIPTOR BEING DELETED TAD LSTPTR CIA TAD SAVPTR /GET NUMBER OF WORDS DELETED TAD TABLMT DCA TABLMT /UPDATE TABLMT DCA I TABLMT /MUST HAVE 0 AT TABLE END SO DON'T THINK IT'S A BOOTSTRAP JMS I [COMMA JMP UNLNAM OLDTOP, /ORIGINAL TOP OF DESCRIPTORS INI, 0 TAD (DSCTAB-HDRSIZ DCA DSCPTR JMP I INI INIT=JMS I [INI /RETURN TO CONFIG IF EOL, OR BACK IN-LINE IF COMMA UNSIZE, COMMA, 0 TAD CHAR SNA JMP I [CONFIG TAD (-", SNA CLA JMP I COMMA JMP I [SYNTAX BOOTQ, SZA CLA /MAY BE OVERLAID JMP SAMEE DCA I (DRECT /DON'T TOUCH DIRECTORY IF DIDN'T COPY SYS SAMF, JMS I [SYSWP JMP I (BOOT4 SAMEE, JMS I (SYSCPY /OR IF OLD DEV=NEW DEV JMP SAMF PAGE LOCSYS, 0 TAD (2331 /"SY" DCA NAME1 TAD (2300 /"S " DCA NAME2 DCA NAME3 /V3C DCA NAME4 JMS I [ACTNAM /LOOK UP 'SYS' JMP I LOCSYS NOSLOT, JMS I [PRWD TEXT /?SLOTS/ JMP I [CONFIG GOOD, 0 TAD [4207 /RESTORE 7600 TO NORMAL DCA I [7600 TAD [5000 DCA I [7601 TAD (CDF CIF DCA I [SA /SET SA=00200 TAD [200 DCA I (SA+1 DCA I (JSW /SET JOB STATUS WORD=0 STA DCA I (DRECT CLL STA RTL /-3 TAD I [7612 /FUDGE FOR 12K TD8E DCA FLAG2 /SET FLAG2=0 IF PREV SYSTEM WAS 2 PAGE JMP I GOOD PACK, ISZ PROTECT /OK TO PACK IT? JMP PACKOK /YES STA DCA PROTECT /INHIBIT OTHER PACKS ALSO JMP GNAME2 PACKOK, ISZ SWIT /PACK LEFT OR RIGHT JMP RIGHT TAD CHAR AND [77 JMS I [ROTL /ROTATE 6 LEFT DCA I TEMP /STORE THE CHARACTER JMP GNAME2 RIGHT, CLA CMA /RESET FLIP FLOP DCA SWIT TAD CHAR AND [77 TAD I TEMP DCA I TEMP ISZ TEMP /POINT TO NEXT WORD JMP GNAME2 PROTECT,0 /-1 MEANS DON'T ACCEPT CHAR, IGNORE IT SWIT, 0 ACTNAM, 0 /THEY MUST BE ACTIVE CLA IAC JMS I (PRMNAM JMP I ACTNAM DOT, CLA CMA DCA SWIT TAD (-3 /NOW ALLOW ONLY A 2-CHAR EXTENSION DCA PROTECT TAD (NAME4 DCA TEMP ISZ DOTCNT /HAD WE SEEN A DOT BEFORE? JMP SYNTAX /YES JMP GNAME2 /NO DOTCNT, -1 /-1 MEANS HAVEN'T SEEN A DOT EOL, DCA CHAR JMP I GNAME GNAME, 0 /COLLECT A WORD IN NAME1-NAME4 /LEAVE DELIMITING CHAR IN 'CHAR' CDF 0 TAD [-7 /MAX 6 CHARACTERS DCA PROTECT DCA NAME1 /FIRST CLEAR OUT COLLECTION AREA DCA NAME2 DCA NAME3 DCA NAME4 CLA CMA DCA SWIT /L-R PACKING SWITCH STA DCA DOTCNT /ALLOW ONLY ONE DOT PER NAME TAD (NAME1 DCA TEMP GNAME2, GETCHR SNA /A 0 ENDS THE SEARCH JMP EOL DCA CHAR TAD CHAR TAD (-"A /GET ONLY A-Z OR 0-9 CLL TAD ("A-"Z-1 SNL CLA /IS IT A-Z? JMP PACK /YES..PACK IT AWAY TAD CHAR TAD (-"0 CLL TAD ("0-"9-1 SNL CLA JMP PACK /FOUND 0-9 JMS I [TEST /TEST FOR DELIMITING CHARS -".;DOT /ADVANCE POINTERS 0 JMP I GNAME SYNTAX, JMS I [PRWD TEXT /?SYNTAX/ JMP I [CONFIG DSKBAD, JMS I [PRWD TEXT /?DSK/ JMP I [CONFIG SRES=BEGLIN+60 /RESIDENCY TABLE SDCB=BEGLIN+100 /DCB SHND=BEGLIN+120 /SLOT ASSSIGNED? SNAME=BEGLIN+140/NAME SBUFF=BEGLIN+160/ADDRESS OF HANDLER / SYSTEM TABLES: /THOSE IN USR: /PDNT PERMANENT DEVICE NAME TABLE (SNAME) / POINTED TO BY LOCATION 10036 IN USR / CONTAIN HASH CODE OF DEVICE NAME / ADD TWO WORDS OF NAME TOGETHER AND TURN ON BIT 0 / IF SECOND WORD WAS NON-ZERO / AN ENTRY OF 0 MEANS THERE IS NO DEVICE FOR THAT ENTRY /DHIT DEVICE HANDLER INFORMATION TABLE (SHND) / POINTED TO BY LOCATION 10037 IN USR / BIT 0 =1 IF THIS IS A TWO-PAGE HANDLER / BITS 1-4 RELATIVE BLOCK LOCATION OF HANDLER ON SYSTEM DEVICE / (BLOCK SLOT). ADD 15 TO GET ACTUAL BLOCK #. / BITS 5-11 RELATIVE ENTRY POINT OF HANDLER /DHRT DEVICE HANDLER RESIDENCY TABLE (SRES) / IN LOCATIONS 17647-17665 / ACTUAL ENTRY POINT OF HANDLER / WE ONLY CARE ABOUT IT IF THE HANDLER IS RESIDENT. / OTHERWISE IT'S ZERO. / THE SYSTEM HANDLER AND ALL HANDLERS CORESIDENT WITH / IT ARE ALWAYS RESIDENT IN CORE AND HAVE THIS ENTRY NON-0. /DCWT DEVICE CONTROL WORD TABLE (SDCB) / RESIDES IN LOCATIONS 17760-17776 / BIT 0 1 IF DEVICE IS FILE STRUCTURED / BIT 1 1 IF THE DEVICE IS READ ONLY / BIT 2 1 IF THE DEVICE IS WRITE-ONLY / BITS 3-8 PHYSICAL DEVICE TYPE / BITS 9-11 DIRECTORY BLOCK # (WE SET TO 0) /PRE-ASSIGNED DEVICE TYPES /0 TELETYPE /1 HIGH SPEED PAPER TAPE READER /2 HIGH SPEED PAPER TAPE PUNCH /3 CARD READER /4 LINE PRINTER (ANY TYPE) /5 RK8 DISK /6 RF08 (1 PLATTER) /7 RF08 (2 PLATTERS) /10 RF08 (3 PLATTERS) /11 RF08 (4 PLATTERS) /12 DF32 (1 PLATTER) /13 DF32 (2 PLATTERS) /14 DF32 (3 PLATTERS) /15 DF32 (4 PLATTERS) /16 TC08 DECTAPE /17 LINCTAPE /20 TM8E MAGTAPE /21 TD8E DECTAPE (12K OR ROM) /22 BAT: /23 RK8E DISK /27 TU60 CASSETTES /30 VR12 (PDP-12 SCOPE) PAGE BOOT2A, TAD (15 DCA SLOT /START ASSIGNING AT BLOCK SLOT 16 (16-25) TAD (-17 /ALLOW 16 ACTIVE HANDLERS NOT COUNTING DSK DCA COUNT JMS I (CLRTBL /CLEAR OUT IN-CORE TABLES TAD (SHND+1 /ASSIGN SLOTS, COUNT ACTIVE HANDLERS DCA XR1 /XR1 POINTS TO SLOT TABLE (DHIT) TAD (SDCB+1 DCA XR2 /XR2 POINTS TO DCB TABLE TAD (SNAME+1 DCA XR3 /XR3 POINTS TO PERMANENT DEVICE NAME TABLE TAD (SBUFF+1 DCA XR4 /XR4 POINTS TO HANDLER BUFFER ADDRESSES TAD (SRES+1 DCA XR5 /XR5 POINTS TO RESIDENCY TABLE CLA IAC /?? DCA OLDPAG /SET 'OLDPAG' TO A RIDICULOUS VALUE INIT SLTLUP, ADVDSC /GO TO NEXT DESCRIPTOR ADVBOT /ADVANCING OVER ANY BOOTSTRAPS JMP BOOT2X /ALL DONE CREATING INTERNAL COPIES OF TABLES GET ACTIVE SMA CLA /IS IT ACTIVE? JMP INACT /NO ISZ COUNT /YES, UPDATE COUNT JMP ACTIV JMP I (TOOMANY /TOO MANY ACTIVE HANDLERS BOOT2X,/ TAD I (SNAME /SEE IF SYS WAS SPECIFIED / DCA SAMSYS /0 IF DIDN'T SPECIFY NEW SYS / TAD SAMSYS / SZA CLA / JMP CHKDSK / CDF 10 / TAD I (7760 /DIDN'T SPECIFY SYS SO USE CURRENT SYS / CDF 0 / DCA I (SDCB / TAD (7607 / DCA I (SRES /CHKDSK, TAD DSKG1 /WAS DSK SPECIFIED? / SZA CLA / JMP I (BOOT3 /YES, ALREADY SET UP / TAD I (SDCB / DCA I (SDCB+1 / TAD (7607 / DCA I (SRES+1 / DCA I (SBUFF+1 JMP I (BOOT3 CHKRES, 0 JMS I [GETPG /GET PAGE OF RESIDENCE DCA NEWPAG TAD NEWPAG TAD OLDPAG SNA CLA /SAME OR PREVIOUS PAGE? JMP I CHKRES /YES, SAME PAGE ISZ CHKRES GET /NO, A NEW PAGE, NEEDS NEW SLOT, ETC. CORES RTL /GET CORES BIT SPA CLA /IS THIS ALLOWED TO START A NEW GROUP? JMP I (TWOSYS /NO, IT MAY ONLY BE CORESIDENT WITH SOMETHING EARLIER TAD NEWPAG /YES CIA DCA OLDPAG /GOT NEW 'OLDPAG' JMP I CHKRES ACTIV, JMS CHKRES JMP SAMPG GET SYSBIT RAL SPA CLA /IS IT A 'SYS' HANDLER? JMP I (SETSY /YES JMS I (GETSLOT /NO JMS I (SETSLT /SET BLOCK SLOT DCA I XR1 TAD NEWPAG HNDLOC, DCA I XR4 /STORE AWAY ADDRESS OF HANDLER (OR 0 IF PREVIOUSLY USED) JMS I (GETDCB DCA I XR2 /SET DCB GET /HASH CODE NAME PRMNM2 DCA TEMP /SAVE 2ND WORD GET PRMNM1 TAD TEMP /ADD 2 WORDS DCA TMP1 /SAVE SUM TAD TEMP SNA CLA /WAS 2ND WORD 0? JMP NO4C /YES TAD TMP1 /NO, FORCE BIT 0 ON RAL STL RAR DCA TMP1 NO4C, TAD TMP1 /TAKE CODED NAME DCA I XR3 /SET PERMANENT NAME TABLE GET CORES RTL /GET CORESIDENT BIT SMA CLA /IS IT RESIDENT? JMP NORE /NO GET /YES ENTPT /GET RELATIVE ENTRY POINT AND [177 TAD [7600 /CORESIDENT ENTRY POINTS TO SYS MUST BE ON PAGE 7600 NORE, DCA I XR5 /SET RESIDENCY TABLE INACT, GET /BUT MAYBE IT'S 'DSK' DSKBIT RTL SNL CLA /IS IT DSK? JMP SLTLUP /NO, IT'S TO BE IGNORED JMS I (SLOTDSK /YES ASSIGN 'DSK''S LOCATION SLOT GET /GET RID OF DSK BIT DSKBIT RTL CLL RTR PUT DSKBIT JMP SLTLUP /REITERATE SAMPG, TAD SLOT /ALREADY HAVE SLOT JMS I (SETSLT DCA I XR1 JMP HNDLOC GOTEM, CORE, 0 TAD I [7777 AND [70 CLL RTR RAR SNA JMS I (RELCOR JMP I CORE PAGE / STEPS IN BOOTSTRAPPING: /1. ASSIGN DSK, IF SPECIFIED, MAKE SURE NFS [BOOT2] /2. ASSIGN SLOTS [BOOT2A] /3. GIVE ERROR IF TOO MANY ACTIVE OR TOO MANY SLOTS [BOOT2A] /4. BUILD INTERNAL COPIES OF DCB, SLOT, NAME, RES [BOOT2A] /5. ALSO BUILD HANDLER ADDRESS TABLE, CONTAINS [BOOT2A] / HANDLER ADDRESS IF NOT PREVIOUSLY WRITTEN OUT /6. COMPARE DCB'S OF NEW AND OLD SYSTEM, IF DIFF, [BOOT3] / COPY SYSTEM OVER. LEAVE NEW SYSTEM HANDLER / IN CORE /7. ASK GUY ABOUT NEW DIRECTORY [BOOT4] /8. READ IN USR, UPDATE ITS TABLES, WRITE OUT USR [BOOTC] / NAME TABLE, DHIT (SLOT, 2-PAGE,ENTPT) /9. READ IN CURRENT PAGE 7600 IMAGES [BOOT5] / SET UP AS FOLLOWS: / PG7600/L: BOOT / PG7600/H: 07600 IMAGE / BLOK66/L: 17600 IMAGE / BLOK66/U: 27600 IMAGE / THIS IS ACCOMPLISHED VIA: / PG7600_0 / BLOK66_66 / IF OLD SYS WAS 1 PAGE, BLOK66/L_PG7600/L /10. MOVE DCB AND RESIDENCY TABLES INTO 17600 IMAGE [BOOT6] /11. MOVE BOOTSTRAP INTO PAGE 7600 IMAGES (2 PLACES) [BOOT7] /12. WRITE OUT HANDLERS [BOOT8] /13. ZERO DIRECTORY IF REQUESTED [BOOTD] /14. PUT SYS, DATA BREAK, CORE LIM IN 07600 IMAGE [BOOTE] /15. WRITE 7600 IMAGES BACK OUT ONTO TAPE [BOOTF] / IF NEW SYS IS 1-PAGE, PG7600/L_BLOK66/L / 0_PG7600 / 66_BLOK66 /16. READ BACK PAGE 7600 IMAGES. MOVE IN FIELD 1 STUFF / EXCEPT FOR CD AREA, RESTORE TODAY'S DATE, / BRANCH TO 7600 GETSLOT,0 ISZ SLOT /USE NEXT SLOT TAD SLOT TAD (-26 SNA CLA JMP I (NOSLOT TAD SLOT JMP I GETSLOT BOOT, ISZ I (RETSW /***? CLA IAC DCA I (BD /DISABLE 'BUILD' CMD /SEE IF ARGUMENT WAS GIVEN; TREAT IT AS BOOT DEVICE, /SAVE HANDLER ADDRESS (MUST BE AN ACTIVE HANDLER) JMS I (LOCSYS /IN CASE DSK=SYS / JMS I [GETNUM / NOP / TAD SIZE / DCA BOOTDV /CHECK THAT # IS GT 7600 BOOT2, TAD DSKG1 /FIND OUT ABOUT 'DSK' SNA JMP GOTD /DSK=SYS DCA SAV1 TAD DSKG2 DCA SAV2 TAD DSKP1 DCA NAME1 TAD DSKP2 DCA NAME2 JMS I [BIGNAM /FIND IT IN TABLES GOTD, GET DCB SMA CLA /IS IT FILE-STRUCTURED? JMP I (DSKBAD /NO GET /YES DSKBIT RTL STL RTR /TURN ON BIT 1 PUT DSKBIT JMP I (BOOT2A GETDCB, 0 GET PLATNUM JMS I [ROTL AND [7 /GET # OF PLATTERS SNA IAC /0 MEANS 1 TAD [-1 /SUBTRACT 1 CLL RTL RAL /TIMES 10 DCA TMP1 GET DCB AND [7770 /MASK OFF USEFUL INFO TAD TMP1 JMP I GETDCB SLOTDSK,0 JMS I (CHKRES JMP SMPG TAD NEWPAG DCA I (SBUFF+1 JMS GETSLOT JMS SETSLT B, DCA I (SHND+1 JMS GETDCB DCA I (SDCB+1 TAD (5723 /'DSK' HASHED DCA I (SNAME+1 GET SYSBIT RTL /SYSBIT TO L, CORES BIT TO AC0 SNL SMA CLA /IS IT EITHER SYS OR CORESIDENT WITH SYS? JMP NORE2 /NO, SO IT'S NOT CORE-RESIDENT GET /YES, RESIDENT AT ALL TIMES IN 07600 ENTPT AND [177 TAD [7600 NORE2, DCA I (SRES+1 JMP I SLOTDSK SETSY, TAD NEWPAG DCA I (SBUFF / JMS SETSLT /NO BLOCK SLOT DCA I (SHND JMS GETDCB DCA I (SDCB /SET DCB TAD I (SNAME SZA CLA JMP I (TWOSYS TAD (4631 /HASH CODING FOR 'SYS' DCA I (SNAME /CHECK THAT NAME IS 'SYS' TAD [7607 DCA I (SRES /CHECK REL ENTRY PT IS 7 JMP I (INACT SMPG, TAD SLOT JMS SETSLT JMP B SETSLT, 0 SNA JMP .+3 TAD [-15 JMS I [ROTR DCA TMP1 GET / CORES / RTL / SPA SZL CLA / JMP I SETSLT /SYS &CORES HANDLERS GET 0 ENTRY (UNFORTUNATELY) GET ENTPT AND (4177 TAD TMP1 JMP I SETSLT PAGE USRBLK=13 /BLOCK OF USR ON SYSTEM DEVICE USRNPT=36 /POINTS TO USR PTR TO PERMANENT DEVICE NAME TABLE USRHPT=37 /POINTS TO USR PTR TO DEVICE HANDLER INFORMATION TABLE BOOTC, TAD [200 /READ FIRST BLOCK OF USR JMS I [SYS BUFFER /INTO BUFFER USRBLK TAD I [BUFFER+USRNPT /GET POINTER TO NAME TABLE TAD [BUFFER-400 /ADD IN OFFSET FOR RELOCATION DCA T1AD /ASSUME BOTH TABLES OCCUR IN THE SECOND TAD I [BUFFER+USRHPT /BLOCK OF THE USR TAD [BUFFER-400 DCA T2AD /GET POINTER TO DHIT TAD [400 /READ BLOCKS 2 AND 3 OF USR JMS I [SYS /INTO BUFFER,BINARY BUFFER USRBLK+1 TAD [-17 JMS I [MOVE /MOVE IN PERMANENT DEVICE NAME TABLE CDF 0 SNAME CDF 0 T1AD, HLT / TAD SAMSYS /WAS SYS SPECIFIED? / SZA CLA / JMP CHKD2 /YES / TAD I T2AD /NO, USE CURRENT SYS INFO / DCA I (SHND /CHKD2, TAD DSKG1 / SZA CLA /WAS DSK SPECIFIED? / JMP MVSHND /YES / TAD I T2AD /MAKE SAME AS SYS / DCA I (SHND+1 MVSHND, TAD [-17 /NOW PUT IN SLOT WORDS (DHIT) JMS I [MOVE CDF 0 SHND CDF 0 TMP2, T2AD, HLT TAD [4400 /RE-WRITE USR JMS I [SYS L5400, BUFFER USRBLK+1 JMP I [BOOT5 IFNZRO BUFFER-5400 <ERRRR,XX> BOOTD, TAD DRECT /WANT NEW DIRECTORY? SNACLA, SNA CLA JMP BOOTE TAD L5400 /YEP. WRITE ONE JMS I [SYS DPROPR 1 BOOTE, TAD NEWCOR CLL RAL RTL TAD SAVHID /V3D SET NEW H.O. DATE WORD DCA I [7777 /SET UP NEW CORE LIMIT TAD SYSLOC /MOVE IN FRESH COPY OF SYS HANDLER TAD [7 DCA SYSL2 TAD [7607-7743-1 JMS I [MOVE CDF 10 SYSL2, HLT CDF 0 7607 TAD [-200 /PUT SYS HANDLER INTO REC 0 BUFF. ??? JMS I [MOVE CDF 0 7600 CDF 0 PG7600+200 /RESIDENT F0 CODE JMS I (WRITCC /WRITE CCB AND DATA BREAK FILLERS TAD [200 TAD SYSLOC /MOVE IN COPY OF 27600 AGAIN DCA SYSL3 TAD [-200 JMS I [MOVE CDF 10 SYSL3, HLT CDF 10 BLOK66+200 JMP I (BOOTF DRECT, -1 /1 MEANS WRITE A ZERO DIRECTORY /0 MEANS DON'T TOUCH DIRECTORY /-1 MEANS ASK GUY FOR OPTION /SEE IF NEW SYSTEM HAS SAME DCB AS CURRENT SYSTEM /THIS MAY WELL CAUSE EXTRA I/O WHEN GOING FROM RF08=K TO RF08=M BOOT3, CDF 10 TAD I (DATEWD DCA SAVDAT /SAVE TODAY'S DATE FOR FUTURE REFERENCE TAD I (DCBTBL /GET DCB OF CURRENT SYSTEM CDF 0 AND [7770 DCA TMP2 JMS I (PATCH /V3D TAD SAVLOC /DON'T COPY IF DID 'BUILD' SNA CLA /WAS THE 'BU' COMMAND USED? TAD [-10 /NO, USE 'SZA CLA' TAD SNACLA /YES, USE 'SNA CLA' DCA I (BOOTQ JMS SETUPSYS TAD SYSDCB CIA TAD TMP2 JMP I (BOOTQ /NOTE: THIS PROCEDURE DOESN'T COPY BOOTSTRAP IF NEW DEV=OLD DEV. / THEREFORE YOU CAN'T CHANGE BOOTSTRAPS / CHECK ON AFFECT FOR TD8E/ROM INTERACTION SETUPSYS,0 DCA SAVLOC TAD SAVLOC DCA I (SAVLC JMS I (LOCSYS JMS I [GETPG /GET PAGE OF SYS HANDLER DCA SYSLOC /PAGE OF START OF NEW SYSTEM HANDLER JMS I (GETDCB DCA SYSDCB JMS I (GETLEN GET TWOPAG DCA I (SYSSIZ TAD I (SYSSIZ SMA CLA /IS IT 1- OR 2-PAGES? JMP ONEPG /GUESS WHAT THIS MEANS [HINT LOOK AT LABEL] STA TAD I (AMTCOR SNA CLA JMP I (NOTNUF /WE CAN'T RUN IN 8 K ONEPG, TAD [-400 JMS I [MOVE CDF 10 SYSLOC, HLT /MOVE SYSTEM HANDLER CDF 10 SAVLOC, 0 /TO 10000-10377 JMP I SETUPSYS PAGE FIRST, 0 /SUBROUTINE FOR LDABS IN FIELD 2 TAD KLUD DCA NEWLIM CIF CDF 20 JMP I FIRST /0: LOADING OS/8 /-2: LOADING HEADER OF HANDLER /-1: LOADING HANDLER HND, CDF 20 /DATA FIELD 2 TAD I (ORIGIN DCA KLUD TAD TABLMT CIF CDF 20 /BACK TO FIELD 2 JMP I (ORI KLUD, 0 NEWLIM, 0 /NEW END OF DESCRIPTORS OK, STA /NOW USE ORIGIN TO TELL US HOW BIG A CDF 20 TAD I (ORIGIN /HANDLER WAS LOADED CDF 00 /BACK TO OUR FIELD AND [7600 TAD [200 /REMEMBER THAT ORIGIN IS ONE GREATER DCA HNDPTR /THAN ACTUAL LAST LOCATION. /BETTER TO USE 2-PAGE BIT TAD NEWLIM DCA TABLMT /SET NEW TABLE TOP DCA I TABLMT /NEED 0 AT END JMS I [COMMA JMP I (LOAD NMER, CIF 10 /V3C JMS I [200 /DISMISS USR FROM CORE 11 JMP I (NAMERR IOPEN, 0 /PREPARE TO READ INPUT CLA CMA DCA I (CHCNT TAD I (JMPX /RESTORE SWITCH DCA I (JMPGET TAD I (FILPTR /RESULTS OF LOOKUP DCA I (RECNO DCA I (REOF TAD (CDF 0 CDF 20 /OFF TO FIELD 2 DCA I (XFIELD /SETUP LDABS FOR FIELD 0 CDF 00 /BACK TO FIELD 0 JMP I IOPEN PAGE /BLOCK 0 OF DEVICE CONTAINS INITIAL IMAGE /OF 17600 FOLLOWED BY 07600 /17600-17646 CD AREA INITIALLY CONTAINS BOOTSTRAP /17647-17665 RESIDENCY TABLE /17666 DATE /17667-17677 PART OF OS/8 KBM /17700-17740 PART OF OS/8 USR /17741-17757 USER DEVICE NAME TABLE/ODT /17760-17776 CONTROL WORD TABLE (DCB) /17777 UNUSED /07600-07606 PART OF OS/8 CODE /07607-07743 SYSTEM HANDLER /07744-07745 STARTING ADDRESS /07746 JOB STATUS WORD (JSW) /07747 MUST BE 0 (SOFSET) /07750-07755 DATA BREAK LOCATIONS RESERVED FOR HARDWARE /07756-07775 KBM AND ODT /07776 MUST BE 0 (SBLOCK) /07777 SOFTWARE CORE SIZE, BATCH FLAGS /IF SYSTEM HANDLER IS TWO PAGES LONG, THEN WE HAVE INSTEAD: /BLOCK 66 (LOWER) CONTAINS 17600 IMAGE /BLOCK 66 (UPPER) CONTAINS 27600 IMAGE (MUST END WITH 4 ZERO'S) /BLOCK 0 (LOWER) CONTAINS BOOTSTRAP /BLOCK 0 (UPPER) CONTAINS 07600 IMAGE *4000 DSCADV, 0 /ADVANCE TO NEXT DESCRIPTOR /RETURN 2 MEANS NO MORE /RETURN 1 MEANS NOW AT BOOTSTRAP BLOCK /RETURN 3 OTHERWISE TAD DSCPTR TAD [HDRSIZ DCA DSCPTR JMS I (SKPCRD /SKIP A POSSIBLE GROUP COUNT TAD I DSCPTR CLL TAD [200 SZL CLA JMP I DSCADV /TAKE RETURN1 UPON REACHING BOOTSTRAP RECORD ISZ DSCADV TAD I DSCPTR SZA CLA ISZ DSCADV /TAKE RETURN 2 IF ADVANCED TO END JMP I DSCADV /RETURN 1 MEANS NO MORE DESCRIPTORS BOTADV, 0 TAD I DSCPTR CIA IAC /COUNT IS ONE MORE TAD DSCPTR DCA DSCPTR /POINT TO BEGIN OF NEXT DESCRIPTOR JMS I (SKPCRD TAD I DSCPTR CLL TAD [200 SZL CLA JMP BOTADV+1 /WIERD CASE OF CONSECUTIVE BOOTSTRAPS TAD I DSCPTR SZA CLA ISZ BOTADV /TAKE RETURN1 IF ADVANCED TO END JMP I BOTADV /WIERD CASES CAN OCCUR IF GUY DELETES ALL ENTRY POINTS IN A GROUP SEPARATELY /DESCRIPTOR ENTRIES: /FIRST WORD: / 0 MEANS END OF TABLE / -1 TO -20 MEANS GROUP COUNT (NOT NECESSARILY ACCURATE) / -21 TO -400 APPROX MEANS BOOTSTRAP RECORD COUNT / OTHER MEANS DESCRIPTOR SYSCPY, 0 /COPY OS/8 SYSTEM STA TAD I (AMTCOR SZA CLA TAD [10 /GT 8K DCA CORBIT TAD CORBIT SZA CLA JMP COP2 JMS I [SYSWP /SWAP IN NEW SYS HANDLER TAD (7410 JMS I [SYS /SAVE PART OF BUILD TO MAKE A BIG BUFFER 400 /SAVE 400- 27 /SAVE IN BLOCK 27 JMS I [SYSWP /GET BACK ORIGINAL HANDLER COP2, TAD [4210 JMS COPY /COPY BLOCK 0 0 TAD (5610 JMS COPY /COPY 7-15 7 TAD [4210 JMS COPY /COPY 26 26 TAD (7410 JMS COPY /COPY 51-66 51 TAD [4210 JMS COPY /COPY 67 67 TAD CORBIT SZA CLA JMP COP3 JMS I [SYSWP /GET BACK NEW HANDLER FOR A MOMENT TAD (3410 /RESTORE CORE WE SAVED JMS I [SYS 400 27 JMS I [SYSWP /RESTORE ORIGINAL SYS HANDLER COP3, JMP I SYSCPY COPY, 0 TAD CORBIT DCA TMP1 TAD I COPY DCA COPREC /ARG 1 CONTAINS FIRST BLOCK TO COPY TAD COPREC DCA CPREC2 /MAKE TWO COPIES STL RAR /CONVERT 'WRITE' TO READ TAD TMP1 JMS I [SYS /READ FROM ORIGINAL DEVICE 400 COPREC, HLT JMS I [SYSWP TAD TMP1 JMS I [SYS /WRITE ON NEW DEVICE 400 CPREC2, HLT JMS I [SYSWP /LEAVE WITH ORIGINAL SYSTEM HANDLER STILL IN SYSTEM JMP I COPY /FALL THROUGH RECORD NUMBER CORBIT, GETLEN, 0 GET /GET LENGTH OF DEVICE PLATNUM JMS I [ROTL /GET NUMBER OF PLATTERS AND [7 SNA IAC /0 MEANS 1 CIA DCA COUNT GET DEVSIZ DCA TMP1 SIZLUP, TAD TMP1 SNA STA /4096 BECOMES 4095 ISZ COUNT JMP SIZLUP CIA TAD [70 /LEAVE ROOM FOR OS/8 DCA DLENGTH JMP I GETLEN DPROPR, -1 /INITIAL EMPTY DIRECTORY MFREE 0 0 -1 0 /1 EMPTY FILE DLENGT, 0 BADARG, JMS I [PRWD TEXT /?ARG/ JMP I [CONFIG PAGE /WANT TO COPY /SYS 0 /KBM 7-12 /USR 13-15 /ENTER 26 /CD 51-53 /SAVE,DATE 54-55 /ERR 56 /CHAIN 57 /ODT 60-63 /CCL 64,65,67 /SYS 66 /EXTRA (DON'T WANT TO COPY): /HANDLERS 16-25 /SCRATCH 27-50 /NEW ALGORITHM: /SET FIELD 2 IF 12K OR MORE AND SKIP *'ED ITEMS /1. MOVE NEW SYS HANDLER TO 0,200 /2.* SAVE 34 PAGES STARTING AT 10400 IN BLOCK 27 OF NEW DEVICE /3. COPY BLOCKS 7-15 /4. COPY BLOCK 26 /5. COPY BLOCKS 51-66 /6. COPY BLOCK 67 /7.* RESTORE 34 PAGES /THE FOLLOWING ROUTINES AND VARIABLES MUST BE ABOVE THE LOCATIONS /IN WHICH OS/8 AND CD LOAD INTO, BECAUSE THEY ARE CALLED BY LDABS. /FURTHERMORE, NONE OF THESE ROUTINES MAY USE PAGE 0 LITERALS /OR MAY USE ANY PAGE 0 TEMPORARIES, EXCEPT THAT SOME MAY USE /PAGE ZERO TEMPORARIES IF THE STORE INTO THEM FIRST /(EXCEPT THOSE COMMENTED OTHERWISE, WHICH MUST PRESERVE /THE NEW PAGE 0 AT ALL COSTS, UNTIL IT IS WRITTEN OUT /LDABS /ICHAR /BADINP /OVER /ASSEMB /CTCTST /PRWD /CTRLC /OVROUT /ROTL /PRINTE /TTYOUT /ROTR /PWORD /ECHOFL /LINEUP /CRLF /PRNT /RUBFLG /MOVE /SYSWP /AMTCOR SYDCB=7760 /LOCATION OF SYS,DSK DCB WORDS BOOT5, JMS I (RECZRO BOOT6, TAD [-17 JMS I [MOVE /PUT RESIDENT FIELD 1 TABLES INTO CDF 0 SDCB /FIXED SPOTS CDF 10 BLOK66+160 TAD [-17 JMS I [MOVE CDF 0 SRES CDF 10 BLOK66+47 /COULD SET USER DEVICE NAMES HERE IF DESIRED BOOT7, JMS I (LOCSYS / TAD SAMSYS / SZA CLA /SAME SYSTEM? / JMP BOOT8 /YES BLOOK, ADVDSC /SEARCH FOR BOOTSTRAP JMP FNDBOT /FOUND BOOTSTRAP RECORD AMONGST DESCRIPTORS HLT /IT WASN'T THERE! JMP BLOOK /KEEP LOOKING FNDBOT, TAD DSCPTR IAC /POINT TO BOOTSTRAP DCA FROMBO TAD I DSCPTR /LENGTH OF BOOTSTRAP /CHECK THAT'S IT'S LE 47 LOCS IF 1-PAGE SYSTEM JMS I [MOVE CDF 0 FROMBO, HLT CDF 0 PG7600 TAD [-47 /MOVE FIRST 47 LOCS INTO CD AREA IN 17600 IMAGE JMS I [MOVE CDF 0 PG7600 CDF 10 BLOK66 BOOT8, TAD (-16 DCA COUNT TAD (SBUFF DCA XR1 TAD (SHND DCA XR2 DVLOOP, TAD I XR1 SNA JMP NOHN DCA DVBUF /LOCATION OF HANDLER TAD I XR2 JMS I [ROTL AND [17 SNA JMP CN /NO BLOCK SLOT TAD L15 /CONVERT TO ACTUAL BLOCK # DCA DVREC TAD [4210 JMS I [SYS DVBUF, HLT DVREC, HLT CN, ISZ COUNT JMP DVLOOP JMP I (BOOTD NOHN, ISZ XR2 JMP CN SYSSIZ, 0 /MINUS MEANS 2-PAGE SYS HANDLER CTRLC, KCC /CLEAR ^C FLAG TAD I (SWAPER /DO WE HAVE TO SWITCH? SZA CLA JMS I (SYSWP /YES. INSERT OLD HANDLER JMP END /GO CHECK BATCH BEFORE RETURNING KORE, JMS I [GETNUM L15, 15 /NOTHING MEANS 0 TAD SIZE AND [7770 SZA CLA JMP I [BADARG /MUST BE BETWEEN 0 AND 7 JMS I (RELCOR /FIND REAL AMOUNT OF CORE CMA TAD SIZE SMA CLA JMP I (NOTNUF /MUST BE .LE. REAL AMT OF CORE TAD CHAR SZA CLA JMP I [SYNTAX TAD SIZE DCA NEWCOR JMP I [CONFIG / IF NEW SYS IS 1-PAGE, PG7600/L_BLOK66/L / 0_PG7600 / 66_BLOK66 BOOTF, TAD SYSSIZ SMA CLA /IS NEW SYS TWO PAGES? TAD [-200 /NO JMS I [MOVE /YES, NULL MOVE CDF 10 BLOK66 CDF 0 PG7600 TAD [4200 JMS I [SYS PG7600 0 TAD [4210 JMS I [SYS BLOK66 66 BOOTG, NOP / JMS I (RECZRO /SIMULATE BOOTSTRAP TAD [-131 /MOVE UP FIELD 1 CODE JMS I [MOVE CDF 10 BLOK66+47 CDF 10 7600+47 TAD SAVDAT CDF 10 DCA I (DATEWD CDF 0 JMS I [PRWD TEXT /SYS BUILT/ /MUST DO SOME CLEAN UP IF BATCH IS RUNNING /ALL OVERLAYED CODE MUST BE RESET IN CASE USER WANTS /TO REUSE THIS COPY OF BUILD. END, JMS I BATT /JUMP TO BATCH TEST ROUTINE FOR CLEAN UP JMP I [7600 /OTHERWISE GO HOME WITH NEW SYSTEM /THIS IS FROM BATCH PAGE /MOVE MOVES CORE AROUND (CALLABLE FROM ANY FIELD) / TAD (-# OF LOCS TO MOVE / JMS MOVE / CDF FROM FIELD / FROM BUFFER LOCATION START / CDF 'TO' FILED / TO BUFFER /MUSTN'T DESTROY OS/8 LOCS, NO PAGE 0 TEMPS! MOVE, 0 DCA MVCT RDF TAD (CIF CDF DCA MOVRET TAD I MOVE /GET CDF FROM-FLD DCA MVCDF2 ISZ MOVE /POINT TO FROM-BUF TAD I MOVE /GET LOC TO MOVE DCA MVTM1 ISZ MOVE /POINT TO TO-CDF TAD I MOVE DCA MVDF /GET CDF TO FIELD OF DESTINATION ISZ MOVE /POINT TO TARGET AREA TAD I MOVE DCA MVTM2 ISZ MOVE /POINT TO RETURN TAD MVCT SNA CLA JMP MOVRET /NOTHING TO MOVE MVCDF2, CDF 0 /GETS ALTERED TO PICK UP F1 TAD I MVTM1 MVDF, HLT DCA I MVTM2 ISZ MVTM1 /BUMP POINTERS TO AREAS ISZ MVTM2 MV20, 20 ISZ MVCT JMP MVCDF2 MOVRET, HLT /RETURN TO CALLING FIELD JMP I MOVE CTCTST, 0 TAD MV7600 /ALLOW FOR PARITY KRS TAD (-7603 SNA CLA KSF JMP I CTCTST JMP I (CTRLC MVCT, 0 ASSEMB, 0 /ASSEMBLE TWO 6 BIT WORDS CDF 20 TAD I LWD1 JMS I PROTL TAD I LWD2 CDF 00 JMP I ASSEMB LWD1, WD1 LWD2, WD2 PROTL, ROTL BOOT4, TAD I (DRECT SMA CLA JMP I (BOOTC /HE'S SPECIFIED ABOUT DIRECTORY ZERO JMS I [PRWD /YES, NO NEED TO COPY SYSTEM TEXT /WRITE ZERO DIRECT?/ TAD [-10 /DON'T WANT TO DESTROY PRECIOUS TABLES JMS I [GTEXT /GET REPLY JMP BOOT4 JMS I [GNAME TAD NAME1 AND [7700 TAD (-3100 SNA CLA CLA IAC /Y DCA I (DRECT /NO; COULD HAVE SAVED LOCATION BUT I FEEL SAFER THIS WAY JMP I (BOOTC MVTM1, ROTL, 0 CLL RTL RTL RTL JMP I ROTL MVTM2, ROTR, 0 CLL RTR RTR RTR JMP I ROTR TTYOUT, 0 /YOU GUESSED IT DCA TM TAD ECHOFL SZA CLA /ARE WE ECHOING? JMP I TTYOUT /NO TAD TM /YES TLS TSF JMP .-1 MV7600, 7600 /CLA JMS I (CTCTST /TEST FOR ^C. JMP I TTYOUT TM, SKPCRD, 0 TAD I DSCPTR CLL TAD MV20 /A GROUP COUNT MUST BE IN THE RANGE -1 TO -20 SNL CLA JMP I SKPCRD ISZ DSCPTR /IT'S A DARN GROUP COUNT, GO PAST IT JMP SKPCRD+1 /WIERD CASE OF CONSECUTIVE GROUP COUNTS ECHOFL, 0 /1 MEANS NOT ECHOING, SAW ^O PATCH, 0 TAD I [7777 /V3D AND L600 DCA SAVHID /SAVE HIGH ORDER DATE BITS JMP I PATCH PAGE PRNAME, 0 /ROUTINE TO PRINT NAME1-NAME4 TAD (NAME1 DCA TEMP CLL STA RTL /-3 DCA COUNT PRNM2, TAD I TEMP JMS PRINTE /TYPE OUT CHARS ISZ TEMP ISZ COUNT /EXHAUSTED ALL? JMP PRNM2 TAD I TEMP SNA CLA JMP I PRNAME /NO . IF NO EXTENSION TAD (". /PRINT '.' JMS I (TTYOUT TAD I TEMP JMS PRINTE JMP I PRNAME PRINTE, 0 DCA CHTMP2 TAD CHTMP2 /EXTRACT LEFT HAND SIDE JMS I (ROTR JMS PWORD TAD CHTMP2 JMS PWORD JMP I PRINTE PWORD, 0 AND (77 SNA /IF NULL, GET OUT JMP NULL DCA PRTM TAD (200 KRS TAD (-217 /^O SNA CLA /STOP ECHOING? KSF /MAYBE SKP /NO JMP CTO /YES TAD PRTM TAD (240 AND (77 PRSPAC, TAD (240 JMS I (TTYOUT JMP I PWORD NULL, TAD LINEUP SNA CLA /PRINT SPACE? JMP I PRINTE /NO JMP PRSPAC /YES PRWD, 0 CLA PRWD2, TAD I PRWD JMS PRINTE TAD I PRWD ISZ PRWD AND (77 SZA CLA JMP PRWD2 JMP I PRWD /LEAVE IF LAST WORD ENDED WITH 00 CHTMP2, 0 CTO, KCC TAD ("^ JMS I (TTYOUT TAD ("O JMS I (TTYOUT JMS CRLF CLA IAC DCA I (ECHOFL JMP I PWORD LINEUP, 0 /NON-ZERO MEANS PRINT NULLS AS SPACES OVER, JMS I (ASSEMB /EXTENSION OF LDABS. CIA CDF 20 /OFF TO FIELD 2 TAD I LCKSUM /CHECKSUM OK? CDF 00 /BACK TO OUR FIELD SZA CLA JMP BADINP /SOORY ABOUT THAT CLA IAC JMP OVROUT /SKIP ERROR EXIT BADINP, JMS PRWD TEXT /?BAD INPUT/ JMS CRLF OVROUT, CDF 20 TAD I (LDABS CDF 00 DCA OTEMP JMP I OTEMP OTEMP, 0 LCKSUM, CKSUM PRTM, 0 CRLF, 0 TAD (215 DCA NAME1 JMS PRNT TAD (212 JMS I (TTYOUT JMP I CRLF PRNT, 0 /CHARACTER PRINT ROUTINE TAD ("\ /IF NOT RUBOUT, AND IF RUBOUT WAS ISZ RUBFLG /LAST, ECHO \. SKP CLA JMS I (TTYOUT TAD NAME1 JMS I (TTYOUT JMP I PRNT RUBFLG, 0 /RUBOUT FLAG PAGE /ASSUMES NEW PROPOSED SYSTEM HANDLER IS IN 10000-10377 /CAN'T DESTROY OS/8, IE. CAN'T USE PG 0 TEMPS SYSWP, 0 /ROUTINE TO MOVE SYS HANDLER AROUND ISZ SWAPER /DIDDLE SWAP INDICATOR CLA CMA /-1 MEANS NEW HANDLER IS IN DCA SWAPER STA TAD AMTCOR SNA CLA /DO WE HAVE 8K? JMP SWAPLW /YES, DON'T SWAP WITH FIELD 2 TAD L7600 /NO, CAN'T HURT TO SWAP FIELD 2 DCA OUT TAD SAVLC TAD P200 DCA IN TAD (4-200 DCA STEMP /SWAP ENTIRE PAGE (EXCEPT LAST 4 LOCATIONS) SWAP3, CDF 10 /SWAP 27600 & 2ND PAGE OF HANDLER TAD I IN DCA SYSQ CDF 20 TAD I OUT CDF 10 DCA I IN TAD SYSQ CDF 20 DCA I OUT ISZ IN L7400, 7400 /NOP ISZ OUT L7600, 7600 ISZ STEMP JMP SWAP3 SWAPLW, CDF 0 TAD (7607 DCA OUT /7607 ALWAYS TARGET DESTINATION TAD SAVLC TAD (7 DCA IN TAD (7607-7743-1/ONLY 7607-7743 GETS MOVED DCA STEMP SWAP2, CDF 10 TAD I IN DCA SYSQ /TEMP STORE CDF 0 TAD I OUT CDF 10 DCA I IN TAD SYSQ CDF 0 DCA I OUT ISZ IN ISZ OUT ISZ STEMP JMP SWAP2 DCA I (SOFSET /V3C JMP I SYSWP AMTCOR, 1 /HIGHEST CORE BANK SAVLC, 0 /MUST BE ABOVE 3577 CHTMP, IN, 0 /POINTS TO HANDLER AREA AT ONE NAMED SYS OUT, 0 /POINTS TO 7607 HANDLER SWAPER, 0 /-1 MEANS NEW HANDLER IN /MUST BE ABOVE OS/8, NO PAGE 0 LITERALS STEMP, ICHAR, 0 JMS I (CTCTST ISZ JMPGET /POINT TO CORRECT CHAR ISZ CHCNT /NEED WE READ? JMPX, JMP JMPGET /NOT YET TAD REOF /YES. DID LAST YIELD EOF? SZA CLA JMP I (BADINP /SOMETHING IS WRONG. RDIN, JMS I DVICE P200, 0200 /READ INTO FIELD 0 BINBUF, BINARY RECNO, 0 JMP RERROR /READ ERROR RECNO2, ISZ RECNO /POINT TO NEXT RECORD TAD (-601 DCA CHCNT /NEW CHARACTER COUNT TAD BINBUF DCA CHPTR TAD JMPX DCA JMPGET /RESET JUMP SWITCH JMP ICHAR+1 SYSQ, JMPGET, JMP . /IF WE GET CAUGHT HERE, WE KNOW IT JMP CHAR1 /ASSEMBLE FIRST CHAR JMP CHAR2 /SECOND CHAR TAD JMPX /THIRD CHAR HERE DCA JMPGET /RESET SWITCH TAD I CHPTR AND L7400 CLL RTR RTR TAD CHTMP /ADD IN THE LAST TEMP STORE RTR RTR ISZ CHPTR /TO NEXT CHAR JMP GCHCOM CHAR2, TAD I CHPTR AND L7400 DCA CHTMP /SAVE FOR THIRD CHAR ISZ CHPTR CHAR1, TAD I CHPTR GCHCOM, AND (377 ISZ ICHAR /PASS UP ERROR RET JMP TO20 /RETURN RERROR, SPA CLA /FATAL, OR EOF? JMP IOERR /FATAL ISZ REOF /END OF FILE JMP RECNO2 /BACK TO MAINSTREAM IOERR, JMS I (PRWD TEXT \?I/O\ TO20, CIF CDF 20 /BACK TO FIELD 2 JMP I ICHAR REOF, 0 CHCNT, 0 CHPTR, 0 DVICE, 0 RETSW, 0 /0 MEANS RAN FROM 0S/8, 1 MEANS RNA STANDALONE PAGE LNLNGT=103 BEGLIN, ZBLOCK LNLNGT SBLOCK=7776 /?? /CTCFAK, .+1 /^C MUST NOT RETURN TO ANY SYSTEM. / JMP I CTCFAK /CTCFAK MARKS OUR PLACE DURING / /SYSGEN, AND ^C WILL RETURN TO THAT PLACE. /*** THIS STUFF GOES AWAY ON A BOOT BUILD, CDF 10 TAD I [7200 /HAS SPECIAL CODE BEEN OVERLAID BY HANDLERS? CDF 0 TAD [-1234 SZA CLA JMP I (NOROOM /YES, TOO BAD / TAD (5601 / DCA I [7600 / TAD (CTCFAK+1 / DCA I (7601 TAD [6600 /SAVE OLD SYSTEM HANDLER IN 16600 JMS I (SETUPSYS / JMS CTCFAK RDOS8, JMS I [PRWD TEXT \LOAD OS/8: \ JMS RD JMP RDOS8 CIF CDF 10 JMS I (WROS8 JMS I (SYSWP / JMS CTCFAK RDCD, JMS I [CRLF JMS I [PRWD TEXT /LOAD CD: / DCA DVER JMS RD JMP RDCD CIF CDF 10 JMS I (WRCD TAD I (RETSW SNA CLA /NOT IF FROM SCRATCH JMS I (SYSWP /GET OLD HANDLER IF ANY BACK IN JMP I [CONFIG RD, 0 TAD [-40 JMS I [GTEXT JMP I RD JMS I (SETUP DVER, JMP I (NODEV JMS I (SYSWP /PUT IN NEW HANDLER CIF CDF 10 JMS I (SAVE JMS I (SYSWP CIF CDF 20 /OFF TO PAGE 2 JMS I [LDABS /PAST HERE PAGE 0 IS GONE JMP I RD JMS I (SYSWP ISZ RD JMP I RD PAGE *6400 DSCTAB, ZBLOCK 1200 /RELIC: *7600 0 /ONLY LOADED FROM PAPER TAPE. *7777 0 /SET SOFTWARE CORE SIZE TO 'UNKNOWN' FIELD 1 *0 0 /FORCE ABSLDR TO LOAD THIS PAGE *400 / ZBLOCK 5400 0 *6600 RELOC BINARY BINPUN, CDF 10 CLA TAD (-400 CIF 0 JMS I (MOVE CDF 10 6600 CDF 0 BINARY /MOVE ONESELF DOWN CIF CDF 0 JMP I (LDR /EXECUTE IN FIELD 0 LDR, JMS LEDER /PUNCH 72 FRAMES OF 200 DCA CHECK /0 CHECKSUM TAD (102 JMS CKSUMM JMS PNCH STARTB, JMS I (CRLF TAD ("* JMS I (TTYOUT TAD (-100 JMS I (GTEXT JMP STARTB JMS I (GETNUM JMP I (OVERB TAD SIZE AND (7770 SZA CLA JMP STARTB TAD SIZE CLL RTL RAL DCA FLD JMS I (GETNUM /GET LOWER LIMIT JMP STARTB TAD SIZE DCA LIM1 JMS I (GETNUM /GET UPPER LIMIT JMP STARTB TAD SIZE DCA LIM2 TAD LIM2 CMA TAD LIM1 DCA COUNT2 TAD FLD TAD (300 JMS PNCH TAD FLD TAD (CDF 0 DCA BUFLD TAD LIM1 JMS I (ROTR AND (77 TAD (100 JMS CKSUMM TAD LIM1 AND (77 JMS CKSUMM BUFLD, HLT TAD I LIM1 JMS I (ROTR AND (77 JMS CKSUMM TAD I LIM1 AND (77 JMS CKSUMM ISZ LIM1 ISZ COUNT2 JMP BUFLD CIF CDF 0 JMP STARTB LEDER, 0 /PUNCH LEADER/TRAILER TAD (-200 DCA COUNT2 TAD (200 JMS PNCH ISZ COUNT2 JMP .-3 JMP I LEDER PNCH, 0 PLS PSF JMP .-1 CLA JMP I PNCH FLD, 0 LIM1, 0 LIM2, 0 COUNT2, 0 CHECK, 0 CKSUMM, 0 DCA CK1 TAD CK1 TAD CHECK DCA CHECK TAD CK1 JMS PNCH JMP I CKSUMM CK1, 0 PAGE OVERB, TAD Q300 JMS I QPNCH /FIELD 0 TAD Q176 JMS I QCKSUM JMS I QCKSUM /*7600 TAD Q74 JMS I QCKSUM STL CLA RTL JMS I QCKSUM /HALT TAD Q177 TAD Q77 JMS I QCKSUM /*7777 JMS I QCKSUM JMS I QCKSUM /*0000 TAD Q102 JMS I QCKSUM JMS I QCKSUM TAD I QCHECK JMS I QROTR AND Q77 JMS I QPNCH TAD I QCHECK AND Q77 JMS I QPNCH JMS I QLEDER HLT JMP .-1 /ALL DONE Q300, 300 QPNCH, PNCH Q176, 176 QCKSUM, CKSUMM Q74, 74 Q177, 177 Q77, 77 Q102, 102 QCHECK, CHECK QROTR, ROTR QLEDER, LEDER PAGE RELOC DIRLOC=1400 /FROM OS/8 ASSEMBLY READ=JMS I (7607 WRITE=READ MFREE=70 ERR=JMS I (WRERR *7200 1234 /MAGIC NUMBER WHICH IF NOT HERE, MEANS HANDLERS OVERLAID WROS8, 0 CIF 0 TAD Z7600 JMS I (MOVE /SAVE CURRENT 7600 CDF 0 7600 CDF 0 7000 /IN 07000 TAD (-7 /MOVE 6600 TO 7600 CIF 0 JMS I (MOVE CDF 0 6600 CDF 0 7600 TAD (-34 /FINISH MOVING FIELD 0 CIF 0 JMS I (MOVE CDF 0 6744 CDF 0 7744 CDF 0 TAD (6 /V3D DEV EXT LENGTH OF ABSLDR TAD I (DLENGTH /FILL IN INITIAL LENGTH CDF 10 DCA I (DIRLOC+14 /OS8 HAS INITIAL DIRECTORY CIF 0;WRITE;4200;7400;0;ERR /INITIAL REC.0 CIF 0;WRITE;4200;7400;66;ERR /ALSO WRITE RECORD 66 CIF 0;WRITE;4210;DIRLOC;1;ERR /INITIAL DIRECTORY CIF 0;WRITE;5000;0;7;ERR /KBM CIF 0;WRITE;4610;0;13;ERR /USR CIF CDF 20 /OFF IN FIELD 2 JMP I (BAK WHER, CDF 0 /RETURN FROM RELOCATED ROUTINES. TAD I (RETSW CDF 10 SNA CLA /SCRATCH BUILD? JMP I (RES76 /NO TAD Z7600 /YES /MOVE 17600 UP THERE CIF 0 JMS I (MOVE CDF 0 7400 CDF 10 Z7600, 7600 JMS I (RESTORE CIF CDF 0 JMP I WROS8 /RELATIONSHIP BEWTWEEN OS/8 CORE IMAGE AND BLOCKS ON SYSTEM DEVICE: /ITEM CORE LOC BLOCKS /KBM 0000-1777 7-12 /OVERLAYS 2000-3577 54-57 /INIT DIR DIRLOC- 1 /ABSLDR CCB LDRCTL- 70 /INIT BLOCK 0 7400-7777 0 /USR 10000-11377 13-15 /ABSLDR 12000-14377 71-75 /ENTER 13400-13577 26 /EXT MEM SAVE & ODT 64 /SYS 06600-06606 PART OF 07600 /SYS 06744-06777 " WRCD, 0 CIF 0;WRITE;4600;0;51;ERR /CD CIF 0;WRITE;5011;0;60;ERR /ODT /THE NEXT ROUTINE IS TO FINISH LOADING BLOCK 64 OF THE /SYSTEM DEVICE THAT HAD BEEN RESERVED. THE FIRST PART /WAS WRITTEN WITH OS8 AND NOW THE OTHER PART MUST BE /WRITTEN ON THAT SAME BLOCK FROM CD. CIF 0;READ;210;0;64;ERR /GET PART OF ODT WRITTEN /MOVE LOCATIONS 11600-11663 TO 10000-10063 CIF 0 TAD (-64 JMS I (MOVE CDF 10 1600 CDF 10 0000 CIF 0;WRITE;4210;0;64;ERR /END OF ROUTINE TO LOAD BLOCK 64 JMS I (RESTORE JMS I (CASIT CIF CDF 0 JMP I WRCD PAGE READ=JMS I (7607 ERR=JMS WRERR /SPECIAL CODE TO CHAIN TO ABSLDR, TO READ IN MCPIP JMS I (7700 10 /LOCK USR IN CORE TAD R7600 /ZERO CD AREA DCA CDPTR TAD (-47 DCA CDKNT DCA I CDPTR ISZ CDPTR ISZ CDKNT JMP .-3 STL CLA RAR /ALTMODE DCA I (7642 JMS I (200 12 /INQUIRE 4503 /ENCODE CSA0 CDN, 0 0 HLT TAD CDN /TAKE DEVICE NUMBER DCA I (7617 /STORE DEVICE NUMBER OF CASSETTE ISZ I (7620 /V3C FORCE BLOCK 1 CLA IAC CDF 0 /V3D DCA I (7746 /SET JSW SO CHAIN DOESN'T DO USROUT CDF 10 JMS I (200 /CHAIN TO ABSLDR 6 70 RESTORE,0 CIF 0;READ;3701;0;BLDSAV;ERR CIF 0;READ;3510;0;BLDSAV+20;ERR /RESTORE BUILD JMP I RESTORE WRITE=JMS I (7607 ERR=JMS WRERR SAVE, 0 CDF 0 DCA I (SOFSET DCA I (SBLOCK DCA I (DRECT /HAVE TO KEEP DIRECTORY LATER CDF 10 CIF 0;WRITE;7701;0;BLDSAV;ERR CIF 0;WRITE;7510;0;BLDSAV+20;ERR JMS CASIT CIF CDF 0 JMP I SAVE RES76, TAD I (Z7600 CIF 0 JMS I (MOVE CDF 0 7000 /RESTORE OLD PAGE 7600 CDF 0 7600 JMP I (Z7600 WRERR, 0 /WRITE ERROR HLT CLA /HIT CONTINUE TO RETRY TAD WRERR TAD (-6 DCA WRERR /POINT BACK TO CIF OF CALL JMP I WRERR /RETRY /RELATIONSHIP BETWEEN CD CORE IMAGE AND BLOCKS ON SYSTEM DEVICE: /ITEM CORE LOC BLOCKS /CD 00000-01377 51-63 /ODT 10000-11777 60-63 CSA, 0 /CASSETTE HANDLER ENTRY PT CDPTR, 0 CDKNT, CASIT, 0 CDF 0 TAD I (RECNO SNA CLA IAC /IF BLOCK 0, CHANGE TO 1 DCA I (RECNO TAD I PRETSW SNA CLA /BUILDING FROM SCRATCH? JMP I CASIT /NO TAD I (BLDCB /YES, GET DCB OF LOAD HANDLER AND L770 TAD M270 /CASSETTE DEVICE CODE=27 SZA CLA JMP I CASIT /NOT A CASSETTE TAD I (DVICE DCA CSA /GET HANDLER ENTRY POINT CDF 10 CIF 0 JMS I CSA 3 /SKIP TO NEXT FILE L770, 770 M270, -270 R7600, 7600 /IGNORE ERRORS CIF 0 JMS I CSA 100 /DUMMY READ A PAGE BINARY /TO SKIP HEADER PRETSW, RETSW SKP CLA /WANT AN ERROR HLT /A GOOD READ IS BAD! JMP I CASIT /INITIALIZATION CODE FOR BATCH OPERATION FIELD 2 *10 BATXR1, 0 /INDEX REG. 1 FOR BATCH BATXR2, 0 /INDEX REG. 2 FOR BATCH *200 BATSET, 0 TAD I (XR1 /GET THE OVERLAY POINTER SZA /IF ZERO USE OLD VALUE /THIS SAVES ME SOME FIELD 0 SPACE DCA BATXR1 /SAVE THE POINTER TAD I [7777 /NOW GET THE BATCH FIELD CDF 20 /TO FIELD 2 AND (0070 /NOW GET THE FIELD BITS TAD (CIF /MAKE A CIF FOR OVERLAY DCA CBATI /SAVE IN INPUT ROUTINE TAD CBATI /ALSO OUTPUT DCA CBATO /OVERLAY BATMOV, TAD I BATXR1 /GET NEXT STORAGE ADDRESS SNA /IF ZERO ALL DONE (SECOND TIME THRU) JMP BATDON /RETURN TO CALLER DCA BATXR2 /OTHERWISE SAVE POINTER TO TARGET CODE BATLUP, TAD I BATXR1 /GET A PATCH WORD SNA /ZERO MEANS END OF THIS PATCH JMP BATMOV /GO GET ANOTHER POINTER OR MAYBE ALL DONE CDF 0 /BACK TO FIELD ZERO DCA I BATXR2 /NOW CODE IS BATCHABLE CDF 20 /BACK TO FIELD 2 JMP BATLUP /DO IT ALL AGAIN BATDON, CIF CDF 0 /RETURN TO CALLER JMP I BATSET /BYE BATLS, TTYIN /POINTER TO MOVE DATA CBATI=. /SET CIF BATCH RELOC TTYIN+1 /RELOCATABLE CODE CIF JMS I BATINI /JUMP TO GET INPUT FROM BATCH HLT /BAD ERROR SKP /SKIP OVER POINTER BATINI, 5400 /POINTER TO BATCH INPUT ROUTINE 0 /TERMINATOR TTYOUT+5 /NOW FOR OUTPUT RELOC CBATO=. /SET FOR CIF BATCH RELOC TTYOUT+6 /POINTER TO MOVE DATA CIF /CIF BATCH JMS I .+1 /GO SEND DATA TO BATCH 7400 /POINTER TO BATCH OUTPUT PROCESSOR 0 /TERMINATOR LFMOD /POINTER TO LINE FEED MOD RELOC LFMOD+1 /RLOCATE THE CODE RDTXT /IGNORE LINE FEEDS 0 /TERMINATOR BATTST+1 /POINTER TO MODIFY BATCH TEST RELOC BATTST+2 /RELOCATE THE CODE JMP BATBK /JUMP AROUND THE BATCH SWITCH TEST /WITH A NEW SYSTEM THE TEST IS ILLOGICAL /WHICH IS THE CASE IF A BOOT IS REQUESTED 0 /TERMINATOR RELOC 0 /FINAL OVERLAY TERMINATOR /NOW COMES THE RESET CODE TO PUT THINGS BACK / THE WAY THEY WERE TO BEGIN WITH. TTYIN /POINTER TO MOVE DATA RELOC TTYIN+1 /RELOCATABLE CODE KSF /SKIP ON FLAG JMP .-1 KRB /READ A CHAR SNA /LOW LEVEL BLANK IGNORE JMP TTYIN+1 /GO GET ANOTHER 0 /OVERLAY TERMINATOR TTYOUT+5 /NOW FOR OUTPUT RELOC TTYOUT+6 /RELOCATE AGAIN TLS /PRINT THE CHAR TSF /DONE? JMP .-1 /NO. 0 /OVERLAY TERMINATOR LFMOD /POINTER TO LINE FEED MOD RELOC LFMOD+1 /RELOCATE ONE MORE TIME LFEED /LINE FEED..ECHO CURRENT COMMAND 0 /TERMINATOR BATTST+1 /POINTER TO BATCH TEST RELOC BATTST+2 /RELOCATE THE CODE TAD I [7777 /RESET THE CODE TO ORIGINAL STATE 0 /OVERLAY TERMINATOR RELOC 0 /FINAL OVERLAY TERMINATOR PAGE /LDABS DOES A REAL LIVE ABSLOAD IF AC=0 /IF AC=-2 THEN IT IS LOADING A HANDLER, THIS IS DONE AS FOLLOWS: /SEARCH FOR *0 /THEN LOAD CONSEC WORDS INTO DESCRIPTOR TABLE /AT NEXT ORIGIN, LOAD WORDS INTO HANDLER AREA (ALLOW ORIGINS) /CAN'T USE PAGE 0 LITERALS IN CASE LOADING OS/8 LDABS, 0 DCA LODTST /-2 IF HANDLER, 0 IF OS8 LDABS2, TAD JMPNXT DCA TSTO0 DCA CKSUM /CLEAR CHECKSUM JMS I (ICHA /GET A BUFFER CHAR JMP LDAB /NO INPUT FOUND SNA JMP .-3 /IGNORE BLANKS TAD (-200 SZA CLA /IS IT LEADER? JMP BADIN /WASN'T 200..PROBABLY NOT BINARY LEADER, JMS I (ICHA JMP LDAB /STRANGE....ALL LEADER!!! SNA JMP LDABS2 /START OVER.BLANKS AFTER LEADER TAD (-200 /IS IT STILL LEADER? SNA JMP LEADER /YES NEWWD, SMA /IS IT < 200? JMP FIELDW /NO.TEST FOR FIELD SEETING TAD (200 /RESTORE CHARACTER DCA WD1 JMS I (ICHA JMP BADIN /EOF BETWEEN WORDS. HOW NICE! DCA WD2 JMS I (ICHA JMP BADIN TAD (-200 /200 FINISHES US UP SNA JMP OVE DCA WD JMS I (ASSEM /ASSEMBLE LAST WORD READ SZL /IS IT AN ORIGIN? JMP ORGTST /YES XFIELD, HLT /GETS CDF N DCA I ORIGIN /STORE THIS WORD CDF20, CDF 20 ISZ ORIGIN /SHOULD NEVER SKIP, BUT... LD7, 7 TAD ORIGIN TAD (200 /GIVE ERROR IF ORIGIN ADVANCES TO 7600 SZA CLA JMP .+3 /SKIP AROUND ERROR CIF CDF 0 /ERROR IN FIELD 0 JMP I (NOROOM NEXT, TAD WD1 TAD WD2 /MAKE UP CHECKSUM TAD CKSUM DCA CKSUM TAD WD JMP NEWWD ORGTST, DCA ORGX /TEST FOR ORIGIN TAD LODTST /GET POINTER TO PROPER ORIGIN SNA CLA JMP .+3 CIF CDF 0 /JUMP TO HANDLER TEST JMP I (HND TAD ORGX /OS/8 - USE REAL ORIGIN ORI, DCA ORIGIN /BUFFER AREA TAD LODTST /HANDLER LOAD? SNA CLA JMP NEXT /NOPE TAD ORGX /DON'T START LOAD UNTIL *0 IS FOUND SZA CLA TSTO0, JMP NEXT DCA .-1 /FOUND *0..DO THE LOAD ISZ LODTST /YES. BUMP LODTST TO LOAD HANDLER NEXT JMP NEXT TAD XFIELD TAD (-CDF 0 SZA CLA JMP .+3 /JUMP AROUND IF NOT FIRST TIME CIF CDF 0 /SUBROUTINE IN FIELD 0 JMS I [FIRST /FIRST TIME THROUGH /DO THIS BETTER; ALSO MAKE SURE HANDLER DOESN(T HAVE A FILED PSEUDO TAD (CDF 10 DCA XFIELD /AT THIS POINT, WE START CLA CMA /LOADING THE HANDLER INTO THE DCA LODTST /AREA SPECIFIED BY HNDORG+1 /CHECK 'ORIGIN' TO SEE IF HEADER WAS RIGHT SIZE /ALSO ELSEWHERE, CAN CHECK ORIGIN WHEN BUMPING TO SEE /IF WE HIT ANY MAGIC LOCATIONS TAD ORGX /SEE IF LEGAL RE ORIGIN CIF CDF 0 /OFF ON FIELD 0 JMS I (ORGLIM DCA ORIGIN /ACTUAL FIELD 1 ORIGIN / TAD SNACLA /LOADING FIELD 1..TEST ORIGINS / DCA JMPRE JMPNXT, JMP NEXT FIELDW, TAD (-100 /LESS THAN 300 FAILS SPA JMP BADIN DCA WD1 TAD WD1 AND LD7 SZA CLA JMP BADIN /DISECT WORD TO CATCH GARBAGE TAD LODTST /IF LOADING HANDLER, IGNORE FIELD SZA CLA JMP FIELD2 TAD WD1 AND (70 /EXTRACT FIELD SETTING TAD [CDF 0 DCA XFIELD FIELD2, JMS I (ICHA JMP BADIN TAD (7600 SZA JMP NEWWD OVE, CIF CDF 0 /ROUTINE IN FIELD 0 JMP I [OVER LDAB, CIF CDF 0 /BACK TO FIELD 0 JMP I LDABS /RETURN FROM SUBROUTINE BADIN, CIF CDF 0 /BACK TO FIELD 0 JMP I [BADINP /BAD INPUT ORGX, 0 ORIGIN, 0 WD1, 0 WD2, 0 WD, 0 CKSUM, 0 LODTST, 0 PAGE ICHA, 0 /ICHAR CALL ROUTINE FOR FIELD 0 CIF CDF 0 /OFF TO FIELD 0 JMS I (ICHAR /JUMP TO ICHAR JMP I ICHA /ERROR RETURN ISZ ICHA /GOOD RETURN JMP I ICHA /RETURN TO CALLER ASSEM, 0 /ASSEMBLE A WORD /THIS CODE APPEARS IN FIELD 0 ALSO TAD I (WD1 /GET WORD 1 CLL RTL /NOW DO THE ROTATE RTL;RTL TAD I (WD2 /NOW FOR THE SECOND PART JMP I ASSEM /BACK TO CALLER PAGE WRITEX=JMS I (7607 /OFF TO WRITE TO DEV. ERROR=JMS ERRX /ERROR SUBROUTINE BAK, CIF 0;WRITEX;4111;3400;26;ERROR /ENTER OVERLAY CIF 0;WRITEX;4701;2000;54;ERROR /SAVE, DATE, MON ERROR, CHAIN OVERLAYS TAD Q200 CDF 0 TAD I QLD DCA I QLD CDF 20 CIF 0;WRITEX;4101;LDRCTL;70;ERROR /ABSLDR CORE CONTROL BLOCK TAD (-114 CIF 0 JMS I (MOVE CDF 0 4264 CDF 0 3464 CIF 0;WRITEX;4200;3400;64;ERROR CIF 0;WRITEX;5210;2000;71;ERROR /ABSLDR CIF CDF 10 /BACK TO FIELD 1 JMP I (WHER QLD, LDRCTL+5 Q200, 200 ERRX, 0 /WRITE ERROR HLT CLA /HIT CONTINUE TO RETRY TAD ERRX TAD (-6 /BACK TO TRY AGAIN DCA ERRX /AGAIN JMP I ERRX /RETRY FIELD 0 *200 $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | $JOB ASSEMBLE AND LINK CCL.MA .MAC OUT:CCLPS<IN:CCLPS.MA .MAC OUT:CCLTBL<IN:CCLTBL.MA .MAC OUT:CCLCDX<IN:CCLCDX.MA .MAC OUT:CCLSIZ<IN:CCLSIZ.MA .MAC OUT:CCLCOR<IN:CCLCOR.MA .MAC OUT:CCLCD<IN:CCLCD.MA .MAC OUT:CCLTAB<IN:CCLTAB.MA .MAC OUT:CCLDRV<IN:CCLDRV.MA .MAC OUT:CCLAT<IN:CCLAT.MA .MAC OUT:CCLSEM<IN:CCLSEM.MA .MAC OUT:CCLDAT<IN:CCLDAT.MA .MAC OUT:CCLSB2<IN:CCLSB2.MA .MAC OUT:CCLREM<IN:CCLREM.MA .MAC OUT:CCLMSG<IN:CCLMSG.MA .MAC OUT:CCLRUN<IN:CCLRUN.MA .MAC OUT:CCLSUB<IN:CCLSUB.MA .MAC OUT:CCL<IN:CCL.MA .LINK OUT:CCL<OUT:CCL,OUT:CCLTBL,OUT:CCLAT,OUT:CCLMSG$ *OUT:CCLTAB,OUT:CCLDRV,OUT:CCLPS,OUT:CCLSIZ/F /*OUT:CCLSEM *=0/N/9 *=1000/N *=1400/N *=2000/N *=2400/N *=3000/N *=3400/N *=4000/N *=4400/N/O *OUT:CCLDAT,OUT:CCLCOR/C *OUT:CCLSUB/C *OUT:CCLSB2/C *OUT:CCLCDX */O *OUT:CCLCD/C *OUT:CCLRUN,OUT:CCLREM *$ .DEL OUT:CCL???.RB .COPY OUT:CCL.SV<DSK:CCL.SV .DEL CCL.SV /CHAIN TO RESORC COMPILE AND LINK .SUB RESORC.BI $END |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 | /5 MACREL VERSION OF CCL FOR OS/8 V3D / / / / / / / / / /COPYRIGHT (C) 1974,1975,1976,1977,1978 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / MIFILE=7617 .GLOBAL OUTLIM,OUTSW,COLSET,FNAME1 .GLOBAL LPTDEV,TTYDEV,DMPDEV,NULDEV,PTPDEV,TVDEV .GLOBAL EXSUB,BLK,IOERR .GLOBAL LOOK .GLOBAL SETLPT,SETPTP,SETTTY,YFORT,YF4,YLOAD,YLOADER .GLOBAL DEFILE .GLOBAL YAT,ZOW,BATCH,FLAG,RDMON,REGO,REMD,CHAIN .GLOBAL DECODE,SCAN,LBEGIN .GLOBAL DEFALT,MOVE,TWAIT,NAMPTR BEGLN==1000 XFERV==70 /LOCATION INSIDE USR WHICH IS FREE .EXTERNAL SWAPER / .EXTERNAL SEMI .EXTERNAL MONFIX .EXTERNAL TABLES .EXTERNAL AT,CCLBLC,PTBL,SAVL,LEAVE,VERTN,NOCCL .EXTERNAL SETDEV,RECALL .EXTERNAL CD,CCER1,REMEM,ARLOC .EXTERNAL PRMESG,PRINT,CCSUB .GLOBAL YCCL XR2=15 XR=16 AMFLAG=17 T=20 DELIM=32 DEFALT=33 /POINTS TO DEFAULT EXTENSION LIST PTR=36 BATSPL=7200 /JMS HERE TO PERFORM SPOOLING WITH DEFAULT EXT IN AC SOFSET=7747 /CCL STARTING ADDRESS: 12000 /STARTING ADDRESS: 12001 /CHAIN STARTING ADDRESS:12002 / JOB STATUS WORD = 2003 /************************************************** / / SAVING CCL / / .LOAD CCL / .SAVE SYS CCL;12001=2103 / .R CCL / /************************************************** OV=1375 MSOVL2=55 CCLTAB="H /MUST BE UPDATED IF TABLES CHANGE CCLNUM="3 CCLVER="A /CCL VERSION # /*** NOTE: VERSION E OF CCL WAS FOR IN-HOUSE USE ONLY. /USE OF SEMICOLONS WITH CCL VERSION I OR LATER /REQUIRES BATCH VERSION 7 OR LATER. /USE OF BASIC COMMAND REQUIRES V3D BASIC OR LATER /MEMORY ALLOCATION: /0 0000-0777 KBM /0 1000-1777 COMMAND LINE [EACH @ FILE RESTRICTED TO 1 BLOCK] /0 2000-2777 LINE BUFFER EXTENSION /0 3000-3177 PRE-EXTENSION @ BUFFER /0 3200-3577 @ BUFFER /0 4000-4377 REM-LINES /0 4400-4777 INPUT HANDLER FOR CD / ALSO, SEMICOLON BUFFER /0 5000-5777 LONGWORD TABLE /0 6000-7277 MORE TABLES /0 7300-7577 SWITCH POINTER TABLE / CHANGES SINCE FIELD RELEASE VERSION: /1. RECURSIVE 'U' BUG FIXED /2. INTERNAL STRUCTURE OF CCL KEYWORD TABLE CHANGED /3. BUG RE REWRITING BLOCK CONTAINING PTR TO CORRECT FORTRAN FIXED /4. .SV PARTS OF FILENAMES REMOVED FROM TABLE TO SAVE SPACE /5. COMPARE PASSES ALTMODE /6. TTY BECAME DEFAULT FOR COMPAR, DIRECT, AND MAP /7. BUG RE PASSING DEFAULT * FIXED /8. .LS FORM OF .CREF COMMAND REMOVED /9. BUG CONCERNING PROCESSOR SWITCHES FIXED /10. CCL SWITCH ALLOWED AFTER =N OPTION /11. BUG RE 'BAD SWITCH OPTION' MESSAGE FIXED /12. EXTRA SPACES NOW ALLOWED BEFORE CCL ARGUMENT /13. 'DOES NOT EXIST' MESSAGE NOW SPELLED CORRECTLY /14. 'BAD CCL SWITCH' MESSAGE ADDED /15. CCL EDIT # CHANGED TO CCL VERSION # /16. .EX CHAINS TO BCOMP NOT BASIC FOR .BA FILES /17. MUNG PTR: NOW WORKS /18. FIXED BUG RE MUNG <CR> /19. FIXED BUG RE CD FOR FILE > 2047 BLKS /20. FIXED BUG RE MAKE PTR: /VERSION B FIXES: /21. ALLOWED 'EDIT' TO COPY FILE EXTENSION /22. FIXED BUG RE .CCL ON WRITE-LOCKED DEVICE /23. FIXED DATE PROBLEM /24. ALLOWED FF AND VT IN AN INDIRECT FILE TO BE IGNORED /VERSION C FIXES: /25. FIXED BUG RE SPACES AND SLASHES IN MUNG TEXT ARGUMENT /26. ALLOWED EDIT COMMAND TO USE SAME OUT DEVICE / AS IN DEVICE (IF NONE SPECIFIED) /27. ADDED MORE SYNTAX CHECKING TO ZERO COMMAND /VERSION D CHANGES: /28. ALLOWED EDIT A<B COMMAND TO REMEMBER ONLY UP TO '<' . /VERSION E CHANGES: (IN-HOUSE ONLY VERSION) /29. WARNING MSG IF SQUISH SYS: UNDER BATCH /30. ADDED SOME NOTES ON HOW TO ALLOW = AS WELL AS < /31. ADDED HOOKS FOR ; TO BE READY FOR V4 /32. FIX BUG RE CMD STARTING WITH SPACES /CHANGES FOR MAINTENANCE RELEASE (OS/8 V3C): /33. FIXED BUG ABOUT @ NOT FOLLOWED BY FILESPEC /34. INCORPORATED ALL PREVIOUS EDITS /35. ALLOWED ' TO TERMINATE AN INDIRECT REQUEST (AND BE IGNORED) /36. FIXED BUG ABOUT EDIT DEV1:_DEV2:FOO LOSING DEV1: /37. CORRECTED SPELLING OF SUPERSEDING /38. ADDED .LD EXTENSION TO EXECUTE TABLES [USES FRTS] /VERSION G CHANGES: /39. FIXED BUG WITH HELP COMMAND /40. FIXED BUG CONCERNING EDIT DEV:_FILE /VERSION H CHANGES: /41. ADDED MAC AND LINK COMMANDS /42. ADDED MACREL AND LINKER INTO COMPILE/LOAD/EXECUTE COMMANDS /43. ALLOWED UX COMMANDS TO CONTAIN KBM COMMANDS /44. ALLOWED PASSING A KBM COMMAND TO CCL ON CHAINING /45. ALLOWED @ AT BEGINNING OF LINE /46. MOVED MOST OF 'DETCOR' TO FIELD 0 /47. WAIT ROUTINE NOW GIVES UP IF TTY FLAG ISN'T UP WITHIN 0.1 SEC /48. ALLOWED EXEC .BI TO USE BATCH /49. TENTATIVELY ADDED SEMICOLON STUFF /50. PUT BACK WARNING MESSAGE IF TRY TO SQUISH UNDER BATCH /VERSION I CHANGES: /51. FIRMED UP SEMICOLON STUFF /VERSION J CHANGES: /52. DEFAULT DEVICE FOR COMPIL, PAL, ETC. IS NOW LOGICAL DSK: NOT SYS: /53. -L, -S, AND -P SWITCHES NOW SET OUTPUT NAME TO CURRENT INPUT NAME /VERSION K CHANGES: /54. DATE NOW HANDLES DATE/78 ALGORITHM /55. TOOK OUT 'TCF' WHICH WAS CAUSING BATCH TO HANG /VERSION 1A CHANGES: /56. FIXED BUG RE NULL INDIRECT CMD FILE /57. FIXED BUG TO NOW ALLOW DATE WITH ARGS IN INIT.CM /58. PRINT "OS78" FOR VERSION NAME IF APPLICABLE /59. ADDED -N AND -D AND REWROTE LOGIC A BIT /60. HELP COMMAND NOW USES HELP.SV /61. SET COMMAND NOW USES SET.SV /62. 'CORE' BECOMES 'MEMORY' IN 3 MSGS AND 1 CMD /63. ADDED BASIC COMMAND (CHAINS TO BASIC.SV WITH Q SWITCH) /64. ALLOWED FOR TERMINATE COMMAND (OS78 REPLACES BACKSPACE) /65. ADDED DUPLICATE COMMAND (USES RXCOPY) /V1B CHANGES: /66. MODIFIED FORMAT OF MAIN TABLE /67. GIVE ERROR MESSAGE IF NO FILENAME IS GIVEN WITH INDIRECT / FILE (EVEN IF NON-FS) /68. PRINT KBM VERSION # /69. ADDED TERMINATE COMMAND /V1F CHANGE: /70. DUPL CALLS RXCOPY IN SPECIAL MODE /V1G CHANGES: /71. SOURCE CODE IS NOW MACREL /72 LINKER OVERLAYS ADDED /73. = ALLOWED IN ADDITION TO _ AND < (IF NOT FOLLOWED BY A DIGIT) /74. /C:NNNN ALLOWED FOR NUMERIC ARGUMENT IN ADDITION TO = /75. HOOKS FOR MULTIPLE CHARACTER SWITCHES ADDED /76. SWITCHES MAY NO LONGER BE EMBEDDED IN A FILENAME /77. KNOWN BUG IF SAY MAKE # /78 A+B IS IDENTICAL TO A-NB,B /79. KNOWN BUG THAT /A-L USES A /80. TEMPORARILY REMOVED SEMICOLON STUFF / FORMAT OF CCL TABLE /ENTRY PURPOSE / TABLE WIDTH=7 (BUT VARIES) /0 FLAG WORD /BIT MEANING IF ON /0 PERFORM CD (IF 0, OMIT ENTRIES 1-6) /1 DON'T PERMIT SPOOLING /2 ALLOW .LS, .NB, .MP SWITCHES /3 ADD _ TO END OF COMMAND STRING /4 SET OUTPUT EXTENSION = INPUT EXTENSION (IF BIT 2 ON) /6-8 SPECIFIES AUTOMATIC INPUT REMEMBERING (REM LINE MINUS 1) / 0 MEANS NONE. 7 RESERVED FOR SPECIAL USE. /10 CAUSE -L, ETC. TO GO TO 2ND OUTPUT FILE & COPIES NAME /11 WANT DEFAULT ALTMODE (COMPL IF AMFLAG=1) /1 PTR TO DEFAULT EXTENSION LIST FOR INPUT FILES. / IF PTS TO 0, NONE. IF PTS TO 5200, USE SPECIAL MODE. /2-4 DEFAULT SWITCHES TO BE OR'ED INTO THOSE / EXPLICITLY GIVEN. /5 ADDRESS OF SUBROUTINE TO BE CALLED / AFTER C.D. HAS BEEN DONE. 0 IF NONE. /6 PTR TO FILENAME OF PROGRAM / TO BE CHAINED TO. 0 IF NONE. / FIELD 0 /1000-1777 LINE BUFFER /2000-2777 LINE BUFFER EXTENSION /4000-4377 REM-LINES /4400-4777 HANDLER /5000-5577 BUFFER /6000-7577 MORE CCL (7 PAGES) REST=5000 .ASECT CCL *2000 .JSW 2103 .VERSION CCLNUM&77^100+<CCLVER&77> FIELD 1 FAKBM=404 /PLACE TO FAKE OUT KBM START, JMP .+3 /START FROM MONITOR JMP MONF /START FROM .RUN COMMAND JMP MONCHN /START WHEN CHAINED TO CLA CDF 0 /READ IN REST OF CCL TAD I (CCLBLC /GET BLOCK OF START DCA I (SOFSET /ALLOW LINKER OVERLAY DRIVER TO WORK TAD (7607 DCA I (7756 TAD I (SOFSET CDF 10 TAD CCLREM DCA CCLREM /GET BLOCK OF REST CIF 0 JMS I (7607 1300 /READ 11 MORE PAGES REST WFL, CCLREM, 1+5+1 /SKIP CCB AND *400 STUFF JMP I (ERR2 JMS FIXX JMS TWAIT CDF 0 TAD I LVNO CDF 10 TAD (-CCLTAB /DO VERSION #'S AGREE? SZA CLA JMP I (BADVNO JMS I (AT TAD (BEGLN-1 DCA XR L$: CDF 0 TAD I XR CDF 10 SNA JMP 2$ TAD (-"; SZA CLA JMP L$ / JMS I (SEMI NOP 2$: STA DCA I (REMD /ALLOW RECURSIVE U'S CDF 0 TAD I KENTRY /GET ENTRY # CIF CDF 10 TAD (PTBL /GET ADDRESS OF PTR TO START OF ENTRY DCA PTR CDF TABLES TAD I PTR /GET PTR TO START OF ENTRY CDF 10 DCA PTR TAD PTR BASPTR, DCA BASPTR JMP I (GO FIXX, 0 DCA I (XFERV /SET UP STUFF FOR OVERLAY DRIVER TAD (SWAPER DCA I (XFERV+1 JMP I FIXX MONF, JMS FIXX JMP I (MONFIX MONCHN, CIF 0 JMS I (7607 /READ IN KBM 1000 /4 BLOCKS 0 /0-1777 7 /BLOCK 7 ON SYS: HLT /NO WAY TO RECOVER (EVEN 7605 DOES THIS) TAD (-44 JMS I (MOVE /ASSUME COMMAND LINE IS IN CDF 10 /17600-17643 7600 CDF 0 1000 /MOVE TO OS/8 LINE BUFFER CIF CDF 0 YAT, JMP I KFAKBM /@ DESTROYS THIS CODE (MUST BE ONE BEFORE 'REGO') TAD I (SAVL /'YAT' IS JMS'ED TO SNA CLA /BY INITIAL @ COMMAND JMP I (LEAVE /DO NOTHING IF NO @ GOT EXPANDED (NULL LINE) REGO, CIF 0 JMS I (7607 200 /READ ONE BLOCK 400 /400-777 10 /RESTORE PART OF KBM WHICH WAS DESTROYED BY OVERLAY HLT JMP I (FAKE /REGO, TAD KCIDF / CDF 0 / DCA I (RETCIF /ALLOW 'FINDIT' TO RETURN TO FIELD 1 / CIF CDF 0 / STA / DCA I (HALF / DCA I (ENTRY / TAD (KEYWRD / DCA I (KPTR / JMS I (FINDIT /LOOK UP KEYWORD / SMA CLA / JMP PREGO /FOUND IT /CMDERR, JMS I (PRMESG /NOT A LEGAL KEYWORD / ERRCMD .START START+1,1 TWAIT, 0 DCA WFL JMS I (BATCH JMP TW /BATCH NOT RUNNING CLA /WE'RE RUNNING UNDER BATCH JMP I TWAIT TW, TSF SKP /WAIT FOR THINGS TO QUIET DOWN JMP I TWAIT LVNO, AND I 0 /WASTE SOME TIME KFAKBM, AND I 4 KENTRY, 600 ISZ WFL JMP TW JMP I TWAIT /CAN'T WAIT TOO LONG FILDMY, FILENAME DUMMY.SV 0 /EXTRA EXTENSION WORD PAGE BADVNO, JMS I (PRINT BADVMS JMS I (VERTN JMP I (LEAVE /GO AWAY /THIS ROUTINE DETERMINES IF THE CHARACTER IN THE AC IS A LETTER OR DIGIT /IF LETTER, RETURNS TO RET+1 WITH LETTER-"A IN AC AND LINK=0 /IF DIGIT, RETURNS TO RET+1 WITH DIGIT-"0 IN AC AND LINK=1 /IF NEITHER, RETURNS TO RET WITH CHAR-"A IN AC. DECODE, 0 TAD (-"9-1 /MIGHT BE CALLED WITH ANY DF CLL TAD ("9+1-"0 SZL JMP YES$ TAD ("0-"Z-1 CLL CML TAD ("Z-"A+1 SNL YES$: ISZ DECODE JMP I DECODE LBEGIN, 0 /PTS TO 1 CHAR BEFORE COMMAND KEYWORD ARGUMENT SCAN, 0 TAD (BEGLN DCA T CDF 0 JMS BLSCAN /IGNORE INITIAL SPACES JMP 2$ 1$: CLA ISZ T TAD I T 2$: SNA JMP 3$ JMS I (DECODE SKP CLA JMP 1$ JMS BLSCAN 3$: DCA DELIM STA TAD T CDF 10 DCA I (LBEGIN JMP I SCAN BLSCAN, 0 TAD I T TAD (-240 SZA JMP 1$ ISZ T JMP BLSCAN+1 1$: TAD (240 JMP I BLSCAN /LEAVE CHAR IN AC SETLPT, 0 /COULD BE ONCE ONLY TAD (LPTDEV JMS I (SETDEV JMP I SETLPT SETTTY, 0 TAD (TTYDEV JMS I (SETDEV JMP I SETTTY SETPTP, 0 TAD (PTPDEV JMS I (SETDEV JMP I SETPTP FAKE, CIF CDF 0 TAD (MSOVL2 DCA I (OV /RESTORE LOC SO DATE CMD W ARGS WILL WORK JMP I (FAKBM SYSER, TEXT \#I/O ERROR ON SYS:\ GO, JMS I (SCAN /ADVANCE SCAN UNTIL AFTER SPACES GO2, CDF TABLES TAD I PTR /GET FLAG CDF 10 DCA FLAG /SAVE IT TAD DELIM SNA CLA /IS TYPED LINE EMPTY AFTER KEYWORD? TAD FLAG /AND IS SPECIAL REMEMBERING BITS ON? CLL RTR RAR /AND HAS GOD WILLED US TO REMEMBER? AND (7 /AND ARE THE ZODIAK SIGNS FAVORABLE? SNA JMP I (NORM /NO TAD REMD /YES, GET REM-LINE (SUBTRACT 1) DCA REMD CDF 0 TAD I (BEGLN CDF 10 DCA I (NMPTR JMS I (RECALL /RECALL LINE REMD, -1 /-1 MEANS DIDN'T RETRIEVE A REMEMBER LINE DCA DEPN /SAVE DEPENDENT INFO TAD I (NMPTR SZA CLA /EG COMMAND? JMP I (NORM /NO ISZ DELIM /YES TAD DEPN DCA PTR /RESET PTR FROM CMD DEPENDENT WORD JMP GO2 DEPN, 0 /REM LINE DEPENDENT INFORMATION PAGE COLWRD /NEEDED FOR SET TTY COL NORM, TAD FLAG L7700, SMA CLA JMP CHAINN /SKIP ENTRIES IF NO CD ISZ PTR /POINT TO DEFAULT INPUT EXTENSION CDF TABLES TAD I PTR /GET DEFAULT INPUT EXTENSION PTR CDF 10 DCA DEFALT /SAVE IT TAD (7641 DCA XR TAD FLAG CDF 0 TAD I PAMFLAG /COMBINE ALTMODE BITS CDF 10 RAR /IN POSITION 11 CLA RAR /PUT NEW ALTMODE BIT ALONE IN BIT 0 DCA I XR /STORE AWAY IN C.D. OPTION TABLE DCA I XR /V3D ZERO OPTION WORDS DCA I XR DCA I XR DCA I XR /ZERO L.O. = L$: ISZ PTR CDF TABLES TAD I PTR SNA JMP 2$ DCA NTEMP ISZ PTR TAD I PTR /GET VALUE CDF 10 TAD I NTEMP DCA I NTEMP /STORE IN SPECIFIED LOCATION JMP L$ 2$: CDF 10 TAD FLAG AND (400 SZA CLA JMS I (INSARR /INSERT BACK ARROW IF FLAG BIT SET JMS I (CD /PERFORM COMMAND DECODE IF FLAG BIT /0 SET TAD FLAG RAL SMA CLA /IS SPOOLING PROHIBITED? JMS I (SPOOLIT /NO CHAINN, ISZ PTR /POINT TO AFTER CD SUBR CDF TABLES TAD I PTR /GET SUBR ADDRESS CDF 10 JMS I (JMSUB TAD I (DEFILE SZA /IS THERE A FILENAME SET TO CHAIN TO? JMP ZOW /YES ISZ PTR /NO, POINT TO FILENAME CDF TABLES TAD I PTR CDF 10 SNA JMP I (LEAVE /NO FILE TO CHAIN TO ZOW, DCA NMPTR JMS LOOK /LOOKUP FILE NMPTR, 0 JMP I (CCER1 /NOT FOUND CHAIN, JMS I (200 /CHAIN TO IT 6 /CHAIN BLK, 0 / ----- PAMFLAG,AMFLAG /LOOK, LOOKS UP FILE ON DEVICE . POINTER IS IN ARG1 / ARG2 IS ERROR RETURN IF NOT FOUND /DEVICE NUMBER IS IN AC. IF 0, USE SYS: LOOK, 0 SNA IAC DCA DEV TAD I LOOK /GET PTR TO FILE NAME IN FIELD 0 DCA HISFIL TAD HISFIL AND L7700 SNA CLA JMP FLD1 /PTR LT 100 MEANS IN FIELD 1 TAD (-3 JMS I (MOVE /MOVE IT UP CDF 0 BWORD, HISFIL, 0 CDF 10 PFILDMY,FILDMY TAD PFILDMY SETN, DCA NAMPTR /STORE AWAY PTR TO FILENAME ISZ LOOK /POINT TO ERROR RETURN TAD DEV /GET DEVICE NUMBER JMS I (200 2 /LOOKUP NTEMP, NAMPTR, 0 0 JMP I LOOK /TAKE ERROR RETURN IF NOT FOUND TAD NAMPTR /STORE STARTING BLOCK # IN 'BLK' DCA BLK ISZ LOOK /POINT TO NORMAL RETURN JMP I LOOK /RETURN FLAG, 0 DEV, 0 FLD1, TAD HISFIL JMP SETN /SKIP IF BATCH IS RUNNING AND PUT CIF BATCH FIELD IN AC BATCH, 0 CDF 0 TAD I (7777 CDF 10 DCA BWORD TAD BWORD RTL SNL CLA /IS BATCH RUNNING? JMP I BATCH /NO TAD BWORD /YES AND (70 /ISOLATE FIELD OF BATCH TAD (CIF /FORM CIF TO THE HIGHEST FIELD ISZ BATCH /AND TAKE SKIP RETURN WITH IT IN AC JMP I BATCH PAGE DEFILE, 0 /PTR TO FILENAME TO CHAIN TO TEMP, RDMON, 0 CDF 10 CIF 0 CLA JMS I (7607 0400 /READ 2 RECORD 2000 /LOCATION 2000 FIELD 0 7 /BLOCK 7,10 JMP IOERR JMP I RDMON ERR2, CIF CDF 0 JMP I (NOCCL EXSUB, 0 TAD BASPTR /PUSH PTR BACK TO BEGIN OF ENTRIES JMS I (REMEM /REMEMBER THIS IN DEPENDENT WORD 2 JMP I EXSUB JMSUB, 0 SNA JMP I JMSUB DCA TEMP JMS I (CCSUB /LOAD OVERLAY JMS I TEMP JMP I JMSUB SPOOLIT,0 JMS I (BATCH /IS BATCH RUNNING? JMP I SPOOLIT /NO DCA CB /YES CDF 0 TAD I DEFALT TAD (-5200 SNA CLA TAD I DEFALT /LEAVE 5200 IN AC IF SPECIAL MODE CDF 10 CB, HLT /CIF TO FIELD OF BATCH JMS I (BATSPL /ALLOW BATCH TO SPOOL STUFF JMP I SPOOLIT INSARR, 0 TAD (BEGLN DCA XR CDF 0 TAD I XR SZA CLA JMP .-2 STA TAD XR DCA XR TAD ("< DCA I XR DCA I XR CDF 10 STA TAD XR DCA I (ARLOC /REMEMBER WHERE WE INSERTED A "_" JMP I INSARR / TAD (-# OF LOCS TO MOVE / JMS MOVE / FROM CDF / FROM LOC / TO CDF / TO LOC MOVE, 0 DCA T TAD I MOVE /GET FROM CDF DCA FRCDF ISZ MOVE STA TAD I MOVE /GET FROM LOC-1 DCA XR ISZ MOVE TAD I MOVE /GET TO CDF DCA TOCDF ISZ MOVE STA TAD I MOVE /GET TO LOC-1 DCA XR2 ISZ MOVE /POINT TO RETURN TAD T SNA CLA JMP I MOVE /V1A IGNORE 0 MOVE FRCDF, HLT TAD I XR TOCDF, HLT DCA I XR2 ISZ T JMP FRCDF CDF 10 JMP I MOVE OUTSW, -1 /-1 MEANS ON OUTPUT SIDE, 0 ON INPUT SIDE OUTLIM, 1-MIFILE IOERR, JMS I (PRMESG SYSER BADVMS, TEXT /#CCL 3X OVERLAY AND CCL INCOMPATIBLE/ AAAA=. *BADVMS+3 CCLTAB&77^100+40 *AAAA COLWRD, 1 COLSET, 0 / JMS I (CCSUB JMS I (SETTTY TAD I (7646 SNA TAD COLWRD DCA I (7646 JMP I COLSET PAGE .ASECT CCLMOR FIELD 0 *6740 YCCL, FILENAME CCL.SV *.-1 YFORT, FILENAME FORT.SV *.-1 YF4, FILENAME F4.SV *.-1 YLOADER,FILENAME LOADER.SV *.-1 YLOAD, FILENAME LOAD.SV *.-1 LPTDEV, DEVICE LPT TVDEV, DEVICE TV TTYDEV, DEVICE TTY PTPDEV, DEVICE PTP DMPDEV, DEVICE DUMP NULDEV, DEVICE NULL FNAME1, ZBLOCK 5 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /2 CCL INDIRECT COMMAND FILE PROCESSOR .GLOBAL AT,FUDG,DONB .EXTERNAL BEGLN,GETSPC,ASSIGN,SETEXT,EXTCM .GLOBAL SAVL .EXTERNAL DEFALT,LOOKUP,ASADR,LNAME .EXTERNAL PRMESG,MOVE .EXTERNAL OUTSW,OUTLIM XR=16 CLXR=35 T=20 LXR=34 BFR=3000 .RSECT AT1 FIELD 1 AT, 0 ATMORE, TAD (BEGLN-1 DCA LXR ATLOOP, JMS I (GLXR SNA JMP I AT TAD (-300 SZA CLA JMP ATLOOP TAD LXR DCA I (SAVL JMS FUDG JMS I (GETSPC JMS I (ASSIGN DCA I (SETEXT TAD (EXTCM DCA I (DEFALT JMS I (LOOKUP SZA CLA /V3C TAD I (ASADR SNA JMP I (ATERR /IF NO FILESPEC AFTER @, ERROR DCA T TAD I (LNAME /GET BLOCK NUMBER DCA BLN CIF 0 JMS I T 200 /READ 2 PAGES NWB, BFR+200 /INTO BUFFER COUNT, BLN, 0 /FROM THIS BLOCK JMP I (ATERR / I/O ERROR TAD (-200 DCA COUNT TAD (BFR-1 DCA XR TAD NWB DCA T CDF 0 L$: TAD I T JMS I (P CLL RTR RTR DCA TEMP$ ISZ T TAD I T JMS I (P CLL RTL RTL RAL TAD TEMP$ JMS I (P CLA ISZ T ISZ COUNT JMP L$ JMP I (ATOVER TEMP$: 0 /ATFIN, TAD LXR / TAD (-BEGLN / SZA CLA / JMP I AT /LEAVE / JMP I (LEAVE /LEAVE BECAUSE LINE NOW EMPTY FUDG, 0 DCA I (OUTSW /LOAD HANDLER TAD I (OUTLIM CIA DCA CLXR JMP I FUDG GLXR, 0 CDF 0 ISZ LXR TAD I LXR CDF 10 JMP I GLXR DONB, 0 /USED AS A FLAG JMP I DONB PAGE P, 0 AND (177 SNA JMP CTZ /END AT 0 OR ^Z TAD (-32 SNA JMP CTZ TAD (32-16 /IGNORE CR,LF,FF,VT CLL TAD (16-12 SZL JMP 1$ TAD (212 /FORCE 8-BIT DCA I XR 1$: CLA TAD I T AND (7400 JMP I P CTZ, CDF 10 TAD LXR DCA ATEND STA TAD LXR DCA LXR /INCASE @ GOES TO EOL JMS I (GLXR /SEARCH FOR EOL SZA CLA JMP .-2 TAD LXR CMA TAD ATEND DCA ENDLEN TAD XR CMA TAD (BFR /GET LENGTH OF INSERTED STUFF DCA NEWLEN CDF 0 TAD I ATEND /GET NEXT CHAR AFTER FILESPEC CDF 10 /V3C TAD (-"' SZA CLA /IS IT AN APOSTROPHE? JMP .+3 /NO ISZ ENDLEN /YES ISZ ATEND /MAKE IT GO AWAY TAD ENDLEN JMS I (MOVE /MOVE REST OF LINE UP CDF 0 ATEND, 0 /FIRST CHAR POSITION AFTER @ SPEC CDF 0 BEGLN+1000 TAD NEWLEN /IF 0, 'MOVE' WILL IGNORE IT JMS I (MOVE /MOVE IN NEW STUFF CDF 0 BFR CDF 0 SAVL, 0 /POINTS TO @ TAD NEWLEN CIA TAD SAVL DCA NEWEND CLL TAD NEWEND TAD MB SZL CLA JMP ATOVER TAD ENDLEN JMS I (MOVE /MOVE BACK END CDF 0 BEGLN+1000 CDF 0 NEWEND, 0 /FIRST POSITION AFTER NEW STUFF JMP I (ATMORE /LOOK FOR MORE MB, -BEGLN-1000 ATOVER, JMS I (PRMESG OVFLOW ENDLEN, 0 /- NO. OF CHARS AT END INCLUDING 0 NEWLEN, 0 /- NO. OF CHARS BEING INSERTED ATERR, CDF 10 CLA JMS I (PRMESG ATIO ATIO, TEXT /#BAD FILENAME OR ERROR READING INDIRECT FILE/ OVFLOW, TEXT /#COMMAND LINE OVERFLOW/ PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /4 CCL'S COMMAND DECODER .EXTERNAL TABLES,FNAME1 .EXTERNAL SWTCHS .ENTRY GETSPC /THE FOLLOWING DON'T HAVE TO BE ENTRY'S BECAUSE THEY ARE LINKED TO /FROM THE EXTENSION MODULE (CCLCDX) THAT KNOWS CCLCD IS IN MEMORY .GLOBAL LV .EXTERNAL EQLPRM,POUND,DNUMB MULTI=1 /SET TO 0 TO GET RID OF MULTIPLE CHARACTER SWITCHES PTR=36 .GLOBAL BADEV,CDER2,DVICE /****** .GLOBAL ASADR,LNAME /***** .ENTRY CCER1 .RSECT CCLCD .GLOBAL UNKN .EXTERNAL FLAG,MOVE,PRMESG .EXTERNAL PRNAME,PRWD .EXTERNAL LBEGIN,DECODE .EXTERNAL ARLOC .EXTERNAL DEFILE .ENTRY CD,ASSIGN,LOOKUP,ZEROCD,GLXR .EXTERNAL OUTSW,OUTLIM .ENTRY GCH,SETDEV,SETEXT .ENTRY NMOVE .EXTERNAL DONB .EXTERNAL NAMPTR FIELD 1 MOFILE=7600 MIFILE=7617 MPARAM=7643 XR2=15 XR=16 T=20 TT=21 DEF=22 NAME1=23 NAME2=24 NAME3=25 NAME4=26 NAME5=27 NMBASE=37 DEV1=30 DEV2=31 DELIM=32 DEFALT=33 /POINTS TO DEFAULT EXTENSION LIST LXR=34 CLXR=35 BEGLN=1000 HNDLR=4400 CD, 0 JMS I (CDINIT BEGGRP, TAD I (OUTSW SNA CLA TAD I (BEGDIF /DIFF BETWEEN INPUT & OUTPUT AREAS TAD (MOFILE-1 DCA CLXR JMS I (GETSPC /FAKE-OUT TO GETSPC CAN CAUSE EFFECTIVE BRANCH HERE JMS I (ASSIGN TAD I (OUTSW SNA CLA TAD I (LIMDIF /DIFF BETWEEN END OF OUTPUT & INPUT AREAS TAD I (OUTLIM /END OF OUTPUT AREA TAD CLXR SMA CLA JMP I (CDER1 TAD I (OUTSW SNA CLA LKUPSW, JMP IN$ /ZEROED IF IN "SPECIAL DECODE" MODE TAD I (DVICE JMS PCLXR TAD NAME1 JMS PCLXR TAD NAME2 JMS PCLXR TAD NAME3 JMS PCLXR TAD NAME4 JMP 2$ IN$: JMS I (LOOKUP JMS PCLXR /STORE LENGTH AND DEV NUMBER TAD I (LNAME /GET BLOCK 2$: JMS PCLXR JMS I (CCLSWT TAD I (OUTSW SNA CLA TAD I (FLAG CLL RTL SPA CLA /FEATURE ENABLED? TAD LKUPSW SNA CLA JMP DLOOK /IN SPECIAL MODE OR ON OUTPUT SIDE TAD DELIM TAD (-"+ SNA CLA JMP NBS TAD DONB SZA CLA JMP NBS TAD (7600 /V1A NOW TAKES ARG IN AC JMS I (NMOVE /MOVE NAME TO OUTPUT FILE NAMES JMP DLOOK NBS, JMS I (ZERR DLOOK, STA DCA I (DVFLAG TAD DELIM SNA JMP I CD TAD (-"[ SNA JMP I (OLENGT TAD ("[-"+ SZA TAD ("+-", SNA JMP I (FILLP /**** JUMPING INTO ROUTINE (IS THIS A BUG?) TAD (",-"< SZA TAD ("<-"_ SNA JMP 5$ /BACK-ARROW (UNDERSCORE) MEANS SAME AS "<" TAD ("_-"= SZA CLA /SKIP ON AN EQUAL SIGN (=) JMP I (CDER2 /BAD CHAR JMS I (GLXR JMS I (DECODE CLL STA /LINK=0 MEANS LETTER TAD LXR /NOW LINK=1 MEANS LETTER DCA LXR SZL JMP 5$ /= MEANS "<" JMS I (EQLPRM /= MEANS = (NUMERIC PARAMETER) DL2: JMS I (CCLSWT JMP DLOOK 5$: ISZ I (OUTSW /FOUND BACK-ARROW (<) JMP I (CDER2 /TWO BACK-ARROWS TAD LXR /GET PTR TO ARROW DCA I (ARLOC /SAVE IT ('EDIT' MIGHT NEED IT) JMP BEGGRP PCLXR, 0 ISZ CLXR DCA I CLXR JMP I PCLXR PAGE ZERR, 0 DCA I (DONB /ZERO 1ST OUTPUT FILE TAD (7577 DCA XR2 DCA I XR2 DCA I XR2 DCA I XR2 DCA I XR2 DCA I XR2 JMP I ZERR ASSIGN, 0 TAD CLXR AND I (DVFLAG TAD I (OUTLIM SMA SZA CLA /CHECK FOR OUTPUT OR FIRST INPUT JMP ASNORM /IF DEVICE WAS SPECIFIC, /OR IF WE ARE ON THE INPUT SIDE, /PROCEED NORMALLY TAD NAME1 SNA CLA JMP ASGNST TAD DFLTNM+1 DCA DEV2 TAD DFLTNM DCA DEV1 ASNORM, TAD DEV1 DCA AS+1 TAD DEV2 DCA AS+2 TAD I (OUTSW SNA CLA /DON'T LOAD HANDLER /IF WE ARE ON OUTPUT SIDE OF "_" TAD NAME1 SPKLG1, SNA CLA /OR THERE IS NO FILE NAME TO LOOK UP TAD GETHND /GETHND=11 NORMALLY, /0 IF IN "SPECIAL DECODE" MODE IAC DCA AS TAD (HNDLR+1 /ALLOW TWO PAGE HANDLERS DCA ASADR CIF 10 JMS I (200 AS, 0 0 0 ASADR, HNDLR+1 JMP I (CDER0 TAD AS+2 ASGNST, DCA I (DVICE JMP I ASSIGN DFLTNM, DEVICE DSK GETHND, 11 /1+11=12 (1=FETCH, 12=INQUIRE) GETL, 0 JMS I (GCH DCA DELIM TAD DELIM JMS I (DECODE JMP I GETL /NON-ALPHANUM IN CCL SWITCH CLA TAD DELIM AND (77 ISZ GETL JMP I GETL CCLSWT, 0 TAD DELIM TAD (-"/ SNA JMP I (SLASH TAD ("/-"- SZA CLA JMP I CCLSWT TAD I (OUTSW SZA CLA JMP I (CDER4 /CCL EXT ON OUTPUT FILE TAD (SWTCHS DCA DEF JMS GETL JMP I (CDER44 /NON-ALPHANUMERIC CCL SWITCH JMS I (ROTL DCA TN$ JMS GETL JMP 1$ /ONE CHAR CCL SWITCH TAD TN$ DCA TN$ JMS GETL 1$: SKP CLA /2 CHAR CCL SWITCH JMP I (CDER44 /3 CHAR CCL-SWITCH TAD TN$ JMS I (EXTLUK CLA ISZ DEF CDF 0 TAD I DEF DCA G$ /GET PTR TO ARGUMENT PAIR TAD I G$ /GET SUBROUTINE DCA H$ ISZ G$ TAD I G$ /GET ARGUMENT CDF 10 JMS I H$ /CALL SUBR, ARG IN AC JMP CCLSWT+1 G$: 0 H$: 0 TN$: 0 PAGE /GETS A NAME FROM FIELD ZERO BUFFER VIA LXR /RETURNS WITH DELIMETER IN AC /GIVES ERROR MESSAGE IF NAME IS BAD GNAME, 0 DCA NAME1 DCA NAME2 DCA NAME3 DCA NAME4 DCA NAME5 TAD (NAME1 DCA NMBASE CLA CMA DCA PERDSW DCA NAMECT JMS I (GCH TAD (-"# SNA JMS I (NUMC /BUG IF MAKE COMMAND USES A # (OVERLAYS LOOP) TAD ("# SKP GTNMLP, JMS I (GCH P2, DCA DELIM TAD DELIM TAD (-"% SNA JMP PER TAD ("%-"? SZA TAD ("?-"* SNA STARSW, JMP I (CDER6 /"JMP STARNM" /IF "SPECIAL DECODE" MODE TAD ("*-". SNA CLA JMP PERIOD TAD DELIM JMS I (DECODE JMP LV STARNM, CLA /THIS CODE HANDLES *'S AND ?'S CORRECTLY TAD DELIM AND (77 DCA DELIM TAD NAMECT TAD (-6 SMA CLA JMP GTNMLP TAD NAMECT CLL RAR TAD NMBASE DCA TT TAD DELIM SNL JMS I (ROTL TAD I TT DCA I TT ISZ NAMECT JMP GTNMLP PERIOD, TAD NAME1 SZA CLA ISZ PERDSW JMP I (CDER7 /NULL NAME OR DOUBLE EXTENSION ISZ NMBASE ISZ NMBASE STL CLA RTL /2 (ALLOW 4 CHARACTER EXTENSION) DCA NAMECT JMP GTNMLP LV, CLA TAD DELIM JMP I GNAME PER, TAD ("? JMP P2 PERDSW, 0 NAMECT, 0 SOFSET=7747 CDER6, CDF 0 TAD I (7777 CDF 10 RAL SPA CLA JMP CD6E /ERROR IF BATCH IS RUNNING TAD I (FLAG RTL SMA CLA JMP CD6E /ONLY IF -LS WORKS TAD (-12 JMS I (MOVE CDF 10 MUNGC CDF 10 7600 TAD (-34 JMS I (MOVE CDF 0 1000 CDF 10 7612 DCA I (7646 /SAFETY CDF 0 TAD I (SOFSET CDF 10 DCA BLK JMS I (200 6 /CHAIN TO CCL.SV BLK, 0 CD6E, JMS I (PRMESG BADSTR PAGE LOOKUP, 0 DCA LNAME TAD NAME1 SNA CLA JMP LKUPST TAD I (PERDSW TAD NAME4 SNA CLA CLA IAC /FORCE NAMERM NON-0 IF . AND NO EXT TAD NAME4 DCA NAMERM /REMEMBER TYPED EXTENSION TAD DEFALT DCA DEF TAD I (SETEXT SNA /HAS AN EXTENSION BEEN SET? TAD NAMERM /NO SNA /DOES FILE HAVE EXTENSION? JMP EXT2 /NO EXTENSION TYPED OR SET, DO SUCCESSIVE LOOK-UPS JMS EXTLUK /LOOK FOR EXTENSION SNA CLA /DID WE FIND IT? JMP EXT3 /NO, FORCE NULL EXTENSION TO MATCH EXT2, CDF 0 TAD I DEF IAC SNA CLA JMP NEXTEXT /IGNORE -1'S TAD NAMERM SZA CLA JMP EXT3 TAD I DEF DCA NAME4 /SET NEW EXTENSION EXT3, CDF 10 TAD (NAME1 DCA LNAME TAD I (AS+2 JMS I (200 2 LNAME, 0 /NAME1 LENGTH, 0 JMP LFAILD TAD NAME4 DCA I (SETEXT ISZ DEF /POINT TO ASSOCIATED CUSP NAME CDF 0 TAD I DEF CDF 10 DCA I (DEFILE /SAVE IT AWAY TAD LENGTH CLL TAD (400 SNL CLACON, 7600 /CLA CLL RTL RTL AND (7760 LKUPST, TAD DVICE JMP I LOOKUP LFAILD, TAD NAMERM CDF 0 SNA CLA /WAS THERE AN EXPLICIT EXTENSION? TAD I DEF /NO - WAS THERE A DEFAULT EXTENSION? SNA CLA JMP XYZ NEXTEXT,CDF 10 ISZ DEF /NO EXPLICIT EXT AND YES DEFAULT EXT ISZ DEF /POINT TO NEXT POSSIBLE DEFAULT EXTENSION JMP EXT2 /AND TRY FOR IT NAMERM, 0 DVICE, 0 EXTLUK, 0 CIA DCA T 1$: CDF 0 TAD I DEF CDF 10 SNA /AT NULL? JMP I EXTLUK /YES TAD T /NO SNA CLA /MATCH? JMP 2$ /YES ISZ DEF /NO ISZ DEF /POINT TO NEXT ENTRY JMP 1$ /TRY AGAIN 2$: TAD T /RETURN WITH IT IN AC CIA JMP I EXTLUK XYZ, CDF 10 JMP I (CDER3 /NO DEFALT EXTENSION OR YES EXPLICIT EXTENSION BADSYN, TEXT /#ILLEGAL SYNTAX/ TOOMAN, TEXT /#TOO MANY FILES/ /AMBIGY, TEXT /#AMBIGUOUS SWITCH/ CDER1, JMS I (PRMESG TOOMAN NFOU, TAD NAME1 AND (77 SNA CLA JMP I (ONE /ONE-CHARACTER SWITCH JMS I (PRNAME JMS I (PRMESG SWNF PAGE /TAKES A LETTER OR A DIGIT IN AC /AND TURNS ON APPROPRIATE BIT IN OPTION TABLE SLSHCH, 0 DCA DELIM TAD (MPARAM-1 DCA T TAD DELIM JMS I (DECODE JMP CDER8 SZL TAD (32 CMA STL /THE FOLLOWING TURNS /ON THE CORRECT OPTION BIT DCA TT L$: SZL ISZ T RAR SNL ISZ TT JMP L$ DCA TT TAD TT CMA AND I T TAD TT DCA I T JMP I SLSHCH CDER8, CLA JMS I (PRMESG BADOPT ZEROCD, 0 TAD (-42 /AC MAY BE NON-0 DCA T TAD (MOFILE-1 DCA XR DCA I XR /ZERO THE COMMAND DECODER OUTPUT AREA ISZ T JMP .-2 JMP I ZEROCD GCH, 0 JMS GLXR TAD (-240 SNA JMP GCH+1 /IGNORE SPACES TAD (240-"( SNA JMP OPENP$ TAD ("( JMP I GCH JMP GCH+1 OPENP$: JMS GLXR TAD (-") SNA JMP GCH+1 TAD (") JMS SLSHCH JMP OPENP$ GLXR, 0 CDF 0 ISZ LXR TAD I LXR CDF 10 JMP I GLXR IFZERO MULTI < SLASH, JMS GLXR JMS SLSHCH JMS GLXR DCA DELIM JMP I (CCLSWT+1 > IFNZRO MULTI < SLASH, CDF TABLES /POINT TO SWITCH TABLE POINTER TAD I PTR /GET PTR TO SWITCH TABLE CDF 10 JMS I (TRANSL JMP I (CCLSWT+1 > OLENGT, TAD I (OUTSW AND NAME1 /[N] IS ONLY LEGAL /ON THE OUTPUT SIDE OF THE "_" SNA CLA /AND ONLY AFTER A FILE NAME JMP I (CDER2 TAD (-4 TAD CLXR DCA NMBASE JMS I (DNUMB CLL RTL RTL AND (7760 TAD I NMBASE DCA I NMBASE CDF 0 TAD DELIM TAD (-"] /IS THERE A CLOSING BRACKET? SNA /IF NOT, /"DLOOK" ROUTINE WILL DETECT IT JMS GCH DCA DELIM JMP I (DL2 SETDSK, 0 TAD DSKDEV SZA JMP I SETDSK JMS I (200 12 /INQUIRE 5723 /PACKED ENCODING FOR 'DSK:' DSKDEV, 0 /SET TO DEVICE NUMBER 0 HLT /NO 'DSK' ! TAD DSKDEV JMP I SETDSK .ENABLE ASCII .DISABLE FILL MUNGC, TEXT /MUNG WILD,/ .ENABLE SIXBIT .ENABLE FILL PAGE CCER1, TAD I (NAMPTR DCA X$ TAD (-5 JMS I (MOVE CDF 10 X$: 0 CDF 10 NAME1 CDER3, TAD (4300 JMS I (PRWD /# JMS I (PRNAME JMS I (PRMESG NF CCER2, TAD I (DVNM1 DCA DEV1 TAD I (DVNM2 DCA DEV2 CDER0, TAD DEV1 SNA CLA JMP I (CDER2 /B DOES NOT EXIST TAD (4300 /# JMS I (PRWD TAD DEV1 JMS I (PRWD TAD DEV2 JMS I (PRWD JMS I (PRMESG DNE NF, TEXT / NOT FOUND/ DNE, TEXT / DOES NOT EXIST/ BADSW, TEXT /#SWITCH NOT ALLOWED HERE/ BADSW2, TEXT /#BAD CCL SWITCH/ CONTRA, TEXT /#CONTRADICTORY SWITCHES/ BKA, 0 TAD I (LBEGIN DCA CLXR 1$: CDF 0 ISZ CLXR TAD I CLXR CDF 10 SNA JMP NOBKR$ TAD (-"< SNA JMP I BKA TAD ("<-"_ SNA JMP I BKA TAD ("_-"= SZA CLA JMP 1$ ISZ CLXR /= MEANS _ IF NOT FOLLOWED BY A DIGIT CDF 0 TAD I CLXR CDF 10 JMS I (DECODE SKP CLA /NOT A DIGIT SNL CLA /MAYBE A DIGIT JMP I BKA /= FOLLOWED BY A NON-DIGIT MEANS _ JMP 1$ /IT'S AN =NNNN NOBKR$: ISZ BKA JMP I BKA BADEV, TEXT /#BAD DEVICE/ PAGE CDINIT, 0 ISZ PTR /POINT TO SWITCH TABLE JMS I (200 13 /RESET ALL HANDLERS CDF 0 TAD I DEFALT CDF 10 TAD (-5200 SZA CLA /IS THIS A REQUEST FOR A /"SPECIAL DECODE"? JMP CDCONT /NO TAD ALTLIM DCA I (OUTLIM /YES, SET UP THE PROPER LOCATIONS TAD ALTDF1 DCA LIMDIF /TO GET 1 OUTPUT AND 5 INPUT FILES TAD ALTDF2 DCA BEGDIF /ALL OF WHICH ARE /5-WORD <DEVICE,NAME> ENTRIES DCA I PLKUPS TAD STARJM DCA I PSTARS /AND ALLOW * /AS A FILE OR EXTENSION NAME TAD L7600 /STOPS FETCHES IN SPECIAL MODE DCA I PSPKG1 /NO HANDLER FETCHES NECESSARY EITHER /SINCE NO LOOKUPS CDCONT, JMS I (BKA /SCAN AHEAD FOR < STA /SKIP RETURN IF NOT FOUND DCA I (OUTSW JMS I (ZEROCD TAD I (LBEGIN DCA LXR JMP I CDINIT /CONSTANTS NECESSARY TO SUPPORT "SPECIAL DECODE" MODE ALTLIM, 1-MOFILE-5 ALTDF1, MOFILE+5-MPARAM+5 ALTDF2, 5 PLKUPS, LKUPSW PSTARS, STARSW PSPKG1, SPKLG1 BEGDIF, MIFILE-MOFILE LIMDIF, MIFILE-MPARAM+2 /STARJM, RELOC STARNM /DUMP LITERALS AT LAST POSSIBLE MOMENT / JMP STARNM / RELOC STARJM, 5200+<STARNM&177> SETDEV, 0 /V1A ARG NOW IN AC DCA 1$ CLL STA RAL /-2 JMS I (MOVE CDF 0 1$: 0 /PTS TO DEVICE NAME CDF 10 DVNM1 JMS I (SETOUT JMP I SETDEV UNKN, 0 TAD SETEXT SZA TAD T /NEG OF SWITCH REQUEST SZA CLA JMP CCERA /CAN'T HAVE 2ND DEFAULT EXTENSION TAD T CIA DCA SETEXT /SET DEFAULT EXTENSION TAD DEFALT /SEE IF IT'S IN COMMAND'S SEARCH LIST DCA DEF TAD SETEXT JMS I (EXTLUK SNA CLA /DID WE FIND IT? JMP CDER4 /NO ISZ DEF /YES / TAD I (JMSUB /ALLOW RECURSIVE CALL / DCA HOLD CDF 0 TAD I DEF CDF 10 JMS I (JMSUB /CALL ITS SUBR / TAD HOLD /V1A RECURSIVE CALL NO LONGER THREATENS / DCA I (JMSUB JMP I UNKN SETEXT, 0 /EXT WHICH HAS BEEN SET BY A CCL SWITCH CCERA, JMS I (PRMESG CONTRA CDER2, JMS PRMESG BADSYN L7600, CCERB, CDER4, 7600 /CLA JMS I (PRMESG BADSW CDER44, CLA JMS I (PRMESG BADSW2 CDER7, JMS I (PRMESG BADX BADSTR, TEXT /#ILLEGAL * OR ?/ SWNF, TEXT / OPTION UNKNOWN/ BADOPT, TEXT /#BAD SWITCH OPTION/ PAGE BADX, TEXT /#BAD EXTENSION/ /THIS GETS A DEV:NAME.EXT SPECIFICATION (USING LXR) /PUTTING RESULT IN DEV1,DEV2, NAME1-4. /IT GIVES A FATAL ERROR MESSAGE IF BAD. GETSPC, 0 STA DCA DVFLAG DCA DEV1 FILLP1, DCA DEV2 FILLP, JMS I (GNAME TAD (-": /AC CONTAINED DELIM SNA CLA JMP 3$ /IT'S A DEVICE NAME DCA NUMC TAD (-4 JMS I (MOVE CDF 10 NAME1 CDF 0 FNAME1 /SAVE AWAY FILE NAME JMP I GETSPC 3$: CLA IAC /PARSE FILENAME AFTER DEV: TAD I (PERDSW TAD NUMC SZA CLA JMP CDERA /. OR # IN DEVICE NAME TAD NAME1 DCA DEV1 ISZ DVFLAG JMP CDERA /CATCHES A:B: TAD NAME2 JMP FILLP1 DVFLAG, 0 CDERA, JMS I (PRMESG BADEV NUMC, 0 /USED AS FLAG INDICATING SAW # JMS I (POUND JMP I NUMC NMOVE, 0 DCA 2$ /V1A ARG IN AC TAD I (FLAG RTL SMA CLA /FEATURE ENABLED? JMP I (CCERB /NO TAD I (OUTSW SZA CLA JMP I (CCERB /ON OUTPUT SIDE TAD I (MOFILE /V3C SNA CLA /DON'T CHANGE OUT DEV IF SPECIFIED TAD I (FLAG /LOOK AT 'COPY EXT' BIT AND (200 SNA CLA JMP 1$ /IT WASN'T SET TAD I (MIFILE /GET FIRST INPUT DEVICE AND (17 /ISOLATE DEVICE BITS DCA I (MOFILE /FORCE THIS TO BE FIRST OUTPUT DEVICE 1$: TAD I 2$ SNA JMS I (SETDSK /CHANGE TO 'IAC' TO ALWAYS USE SYS: DCA I 2$ /SET DEVICE TO SYS IF NONE ISZ 2$ TAD I 2$ /WAS THERE A SPECIFICATION THERE? SZA CLA JMP I NMOVE /YES, DO NOTHING TAD I (FLAG AND (200 /GET 'COPY EXTENSION' BIT SMA SZA CLA /'SMA' IS UNNECESSARY STA /COPY 4 WORDS IF BIT 4 WAS ON TAD (-3 /OTHERWISE ONLY COPY 3 WORDS JMS I (MOVE CDF 0 FNAME1 CDF 10 2$: 0 JMP I NMOVE ROTL, 0 CLL RTL RTL RTL JMP I ROTL JMSUB, 0 SNA JMP I JMSUB DCA T$ JMS I T$ JMP I JMSUB T$: 0 AMBIG, TAD NAME1 AND (77 SNA CLA JMP I (ONE JMS I (PRNAME JMS I (PRMESG AMBIGY AMBIGY, TEXT / OPTION AMBIGUOUS/ PAGE SETOUT, 0 TAD I (FLAG RTR SZL CLA TAD (5 TAD (7600 DCA OLOC TAD I OLOC SZA CLA JMP I SETOUT /HE'S SPECIFIED SOMETHING JMS I (200 12 /INQUIRE DVNM1, 0 DVNM2, 0 0 JMP I (CCER2 /NO SUCH DEVICE TAD DVNM2 DCA I OLOC TAD OLOC AND (5 SNA CLA /USING 2ND OUT DEV? JMP I SETOUT /NO ISZ OLOC /YES TAD (-4 JMS I (MOVE CDF 0 FNAME1 CDF 10 OLOC, 7600 /INITIALLY 7600 OR 7605 JMP I SETOUT / TAD (PTR TO SWITCH TABLE ENTRY (IN FIELD 0) / JMS TRANSL / IT PARSES SWITCH, SETS BIT / PARSES :VALUE, SETS = OPTION / LEAVES DELIMETER IN DELIM TRANSL, 0 DCA SPTR /POINT INTO A SWITCH TABLE JMS I (GNAME /GET A NAME DCA DEL / TAD NAME4 / SZA CLA / HLT /EXTENSION ON A SWITCH JMS SRCH JMP I (NFOU /SWITCH NOT FOUND STA TAD SRPTR DCA SSPTR /SAVE PTR INTO LONG NAME JMS SRCH /SEARCH SOME MORE SKP /SHOULDN'T FIND ANYTHING JMP I (AMBIG /AMBIGUOUS SWITCH CDF 0 L$: TAD I SSPTR /SCAN PAST END OF LONG NAME ISZ SSPTR AND (77 X240: SZA CLA JMP L$ TAD I SSPTR CDF 10 SL, AND (377 /ISOLATE CORRESPONDING ONE-CHARACTER SWITCH SZA JMS I (SLSHCH /SET APPROPRIATE BIT TAD DEL DCA DELIM TAD DELIM TAD (-": SNA CLA JMS I (EQLPRM JMP I TRANSL ONE, TAD NAME1 CLL RTR RTR RTR TAD X240 AND (77 TAD X240 JMP SL SPTR, 0 SSPTR, 0 DEL, 0 /RETURN 1 IF NAME NOT FOUND /RETURN 2 IF NAME FOUND SRCH, 0 1$: TAD (NAME1 DCA NPTR CLL STA RTL /-3 DCA NCNT CDF 0 TAD I SPTR CDF 10 ISZ SPTR SNA JMP I SRCH /NOT FOUND DCA SRPTR 2$: TAD I NPTR SNA JMP 3$ AND (77 SZA CLA TAD (77 /MUST MATCH BOTH BYTES TAD (7700 /NEED ONLY MATCH LEFT BYTE CDF 0 AND I SRPTR CDF 10 CIA TAD I NPTR SZA CLA JMP 1$ /THIS SWITCH AIN'T IT ISZ SRPTR ISZ NPTR ISZ NCNT JMP 2$ 3$: ISZ SRCH JMP I SRCH SRPTR, 0 /POINTS INTO LONG NAME TABLE NCNT, 0 NPTR, 0 /POINTS INTO NAME1-3 PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /1 CCL CD EXTENSION .ENTRY POUND,NUMBER,EQLPRM,DNUMB .EXTERNAL GCH .EXTERNAL LV MPARAM=7643 T=20 DELIM=32 NAME1=23 NAME2=24 NAME3=25 NAME4=26 LXR=34 .EXTERNAL PRMESG .RSECT CCLCDX FIELD 1 BADNUM, TEXT /#BAD NUMBER/ EQLPRM, 0 DCA NUMFUJ JMS NUMBER DCA I (MPARAM+3 CLA CLL CML RAR AND I (MPARAM-1 /PRESERVE ALTMODE TAD HIORD DCA I (MPARAM-1 JMP I EQLPRM NUMBER, 0 SZA CLA TAD (<TAD NUM>-SKP TAD (SKP DCA NUMADD /SET NUMADD TO EITHER "SKP" OR "TAD NUM" DCA HIORD NUMLP, DCA NUM JMS I (GCH ISZ NUMKNT SKP JMP EONUM2 CMA TAD NUMFUJ TAD ("8 /TEST INPUT CHARACTER FOR RANGE CLL CMA /0-7 IF NUMFUJ=0 TAD (10 /0-9 IF NUMFUJ=2 TAD NUMFUJ SNL JMP EONUM DCA T CLA CLL CMA RTL DCA DELIM TAD NUM ROTLP, CLL RAL DCA NUMX TAD HIORD RAL NUMSKP, SPA /MODIFIED BY # JMP CDER5 DCA HIORD TAD NUMX ISZ DELIM JMP ROTLP NUMADD, TAD NUM /SKP IF OCTAL TAD NUM TAD T JMP NUMLP EONUM, TAD ("0 EONUM2, DCA DELIM TAD NUMKNT SPA CLA JMP CDER5 /FEWER THAN CORRECT NUMBER OF DIGITS TAD NUM JMP I NUMBER NUM, 0 NUMFUJ, 0 NUMKNT, 0 /SET TO -N-1 TO FORCE N DIGITS HIORD, 0 NUMX, 0 DNUMB, 0 CLA CLL CML RTL DCA NUMFUJ /SET "NUMBER" TO ACCEPT /DIGITS 8 AND 9 STA /ALLOW DECIMAL JMS NUMBER JMP I DNUMB CDER5, JMS I (PRMESG BADNUM POUND, 0 /USED AS FLAG INDICATING SAW # TAD (SKP DCA NUMSKP TAD (-11 DCA NUMKNT JMS NUMBER DCA NAME2 TAD HIORD DCA NAME1 STA TAD LXR DCA LXR TAD (-11 DCA NUMKNT JMS NUMBER DCA NAME4 TAD HIORD DCA NAME3 TAD (SPA DCA NUMSKP JMP I (LV PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /1 CCL CORE (MEMORY) ROUTINES .ENTRY DETCOR,OTOD .EXTERNAL CORE,CORSIZ .EXTERNAL PRINT,LBEGIN,PRWD,CMDERR BATCCL=7777 .RSECT CORF1 FIELD 1 HISIZ, 0 /HIGHEST MEMORY BANK NEWCOR, 0 /PROPOSED NEW MEMORY BANK DETCOR, 0 CIF 0 JMS I (CORE SNA JMS K8 TAD (-30 SMA JMS I (K32 TAD (40 JMS I (OTOD DCA CORMES+1 TAD I (LBEGIN DCA XRL CDF 0 STA TAD I (CORSIZ DCA HISIZ ISZ XRL TAD I XRL /GET NEXT CHAR SNA JMP COREQ /NOT SETTING CORE SIZE TAD (-260 DCA NEWCOR TAD NEWCOR AND (7770 SZA CLA JMP DETER /TRIED TO SET CORE SIZE GT 7 ISZ XRL /SHOULD ONLY BE ONE FIELD NUMBER TAD I XRL /IF MORE, THEN ERROR RETURN SZA CLA JMP DETER TAD NEWCOR CIA TAD HISIZ SPA CLA JMP BADCOR /TRIED TO SET SOFTWARE CORE SIZE GT REAL CORE SIZE TAD I (BATCCL RTL /BATCH BIT TO LINK SZL CLA JMP WRSCOR /CAN'T CHANGE CORE SIZE UNDER BATCH TAD NEWCOR CLL RTL RAL DCA NEWCOR TAD I (BATCCL AND (7707 TAD NEWCOR DCA I (BATCCL COREQ, CDF 0 TAD I (BATCCL AND (70 SNA JMP ABSCOR TAD (10 CLL RAR JMS I (OTOD CDF 10 DCA SCRMES TAD SCRMES CIA TAD CORMES+1 SNA CLA JMP ABSCOR /DON'T PRINT SOFT IF = REAL JMP I (SCRM DETER, CDF 10 JMP I (CMDERR JMP I DETCOR XRL, 0 BADCOR, CDF 10 JMS I (PRINT NOCORE JMP COREQ ABSCOR, CDF 10 JMS I (PRINT CORMES JMP I DETCOR WRSCOR, CDF 10 JMS I (PRINT BATCOR JMP COREQ K8, 0 TAD (1716 JMS I (PRWD TAD (1431 JMS I (PRWD CIF CDF 0 JMP I K8 SCRMES, TEXT \00K OF\ *.-1 CORMES, TEXT / 00K MEMORY/ K32, 0 DCA TMP TAD (4100 DCA I (CORMES+6 TAD TMP JMP I K32 TMP, 0 PAGE OTOD, 0 DCA 2$ DCA 1$ TAD 2$ TAD (-12 ISZ 1$ SMA JMP .-3 TAD (72 DCA 3$ TAD 1$ /IS THE 'TENS' DIGIT > 9? TAD (-13 SPA CLA /IF IT IS 9 OR LESS JMP .+4 /JMP OVER ADJUSTMENT TAD (4061 /OTHERWISE SET 'HUNDREDS' INDICATOR BIT DCA I (CORMES TAD (-12 /ADJUST 'TENS' BIT TAD (-1 TAD 1$ SNA TAD (40-60 TAD (60 CLL RTL RTL RTL TAD 3$ JMP I OTOD 1$: 0 2$: 0 3$: 0 SCRM, CDF 10 JMS I (PRINT SCRMES JMP I (DETER+2 NOCORE, TEXT /# NOT ENOUGH MEMORY/ BATCOR, TEXT /#CANNOT CHANGE MEMORY LIMIT WHILE RUNNING BATCH/ PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /3 CCL DATE COMMAND .ENTRY DATE .EXTERNAL PRINT,OTOD,PRWD,PRMESG .EXTERNAL CRLF,LOOK,CHAIN .EXTERNAL YDATE DATWD=7666 BATCCL=7777 .RSECT CCLDAT FIELD 1 DATE, 0 TAD I (DATWD SNA JMP NODATE DCA DATEM TAD DATEM CLL RTL RTL RAL AND (17 DCA TM1 TAD TM1 TAD (MONLST-1 DCA TM2 TAD I TM2 DCA 4$ TAD DATEM AND (7 DCA T$ CDF 0 TAD I (BATCCL CDF 10 CLL RTR RTR AND (30 TAD T$ DCA TM2 TAD TM2 TAD (70. JMS I (OTOD DCA YEAR TAD DATEM CLL RTR RAR AND (37 DCA DATEM TAD DATEM JMS I (OTOD DCA DAY STL CLA RTL /2 TAD TM2 CLL RTR SNL SMA JMP 1$ ISZ I (JAN ISZ I (FEB 1$: AND (37 TAD TM2 TAD (3 TAD DATEM DCA DATEM TAD TM1 TAD (JAN-1 DCA TM1 TAD I TM1 TAD DATEM 2$: CLL TAD (-7 SZL JMP 2$ TAD (7 TAD (WEEKLST DCA TM2 TAD I TM2 DCA 3$ STA /DON'T CRLF AND PRINT IN LOWER CASE JMS I (PRINT 3$: 0 STA JMS I (PRINT DAYDAY CLA IAC JMS I (PRINT 4$: 0 STL CLA RAR JMS I (PRWD /SPACE TAD DAY JMS I (PRWD CLA IAC JMS I (PRINT COM19 TAD YEAR JMS I (PRWD JMS I (CRLF JMS I (LOOK /LOOKUP SYS:DATE.SV YDATE JMP I DATE /DO NOTHING IF IT'S NOT THERE JMP I (CHAIN /CHAIN TO IT, IF IT'S THERE T$: 0 NODATE, JMS I (PRMESG NONE TM1, 0 TM2, 0 DATEM, 0 DAY, 0 YEAR, 0 NONE, TEXT /NONE/ PAGE MONLST, MON1 MON2 MON3 MON4 MON5 MON6 MON7 MON8 MON9 MON10 MON11 MON12 MON1, TEXT /JANUARY/ MON2, TEXT /FEBRUARY/ MON3, TEXT /MARCH/ MON4, TEXT /APRIL/ MON5, TEXT /MAY/ MON6, TEXT /JUNE/ MON7, TEXT /JULY/ MON8, TEXT /AUGUST/ MON9, TEXT /SEPTEMBER/ MON10, TEXT /OCTOBER/ MON11, TEXT /NOVEMBER/ MON12, TEXT /DECEMBER/ COM19, TEXT /, 19/ WEEKLST,DAY1 DAY2 DAY3 DAY4 DAY5 DAY6 DAY7 .ENABLE ASCII DAY1, TEXT /Satur/ DAY2, TEXT /Sun/ DAY3, TEXT /Mon/ DAY4, TEXT /Tues/ DAY5, TEXT /Wednes/ DAY6, TEXT /Thurs/ DAY7, TEXT /Fri/ DAYDAY, TEXT /day / .ENABLE SIXBIT JAN, 0 FEB, 3 4;0;2;5;0;3;6;1;4;6 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | /OVRDRV - OVERLAY DRIVER FOR CCL / / / / / / / / / /COPYRIGHT (C) 1977,1978 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /OVERLAY DRIVER /FOR LINKER PROGRAM MODULES /VERSION=V3A /THIS SECT IS TWO LOCATIONS AND CONTAINS THE TRANSFER VECTOR TO SWAPER /AND A FLAG THAT INDICATES WHETHER A JMP (1) OR JMS (0) WAS PERFORMED /TO THE TRANSFER VECTOR / .SECT XFERV,Z / 0 /FLAG, 1=JMP, 0=JMS / SWAPER /TRANSFER VECTOR TO SWAP ROUTINE /THIS IS THE MAIN DRIVER SECTION .SECT SWAPER,R .GLOBAL SWPTAB,TRANVC .ZTERNAL XFERV FIELD 1 SWAP, 6102 /VERSION NUMBER DCA AC /SAVE CALLING AC RAL DCA LINK /AND LINK RDF /GET CALLING DF TAD (CDF /FORM CDF SWAP0, JMP ONCE /DO ONCE ONLY CODE - REPLACED BY DCA EXIT CDF . /CHANGE TO THIS DATA FIELD TAD I SWAP /GET OVERLAY,LEVEL,FIELD DCA BINDAT /SAVE ISZ SWAP /BUMP POINTER TAD I SWAP /GET SUBROUTINE ADDRESS DCA XITLOC /SAVE TAD BINDAT /FORM CDF TO CALLED SUBROUTINE AND (7 RAL CLL RTL TAD (CDF DCA SWAP1A /SAVE TAD SWAP1A /FORM CIF TO CALLED SUBROUTINE IAC DCA EXIT+1 /SAVE FOR EXIT /LOAD OVERLAY OF CALLED SUBROUTINE LOAD, TAD BINDAT AND (1600 /EXTRACT LEVEL OF CALLED SUBROUTINE RTR CLL /5 RIGHT RTR RAR DCA PNTR /SAVE TAD PNTR TAD (SWPTAB /COMPUTE ENTRY INTO SWAP TABLE DCA FLD /POINTS TO FIELD OF OVERLAY TAD PNTR /COMPUTE ENTRY INTO CURRENT OVERLAY TABLE RTR CLL TAD (CURTAB DCA PNTR TAD BINDAT /EXTRACT DESIRED OVERLAY NUMBER AND (170 RTR CLL /RIGHT 3 RAR CIA /NEGATE DCA TEMP TAD TEMP TAD I PNTR /COMPARE WITH CURRENT OVERLAY NUMBER FOR LEVEL SNA CLA /SAME? JMP SWAP1 /YES, NO READING NEEDED LOAD1, TAD TEMP /NO, SET TO NEW CIA DCA I PNTR /OVERLAY NUMBER TAD FLD /SET UP POINTERS TO IAC DCA ADDRES /ADDRESS TAD ADDRES IAC DCA RELBLK /RELATIVE BLOCK NUMBER TAD RELBLK IAC DCA LENGTH /LENGTH OF OVERLAY TAD TEMP /TEST OVERLAY NUMBER SNA CLA /0? JMP LOAD2 /YES, NO MULTIPLICATION NEEDED TAD I LENGTH /BLOCK NUMBER = (LENGTH OF OVERLAY) JMP I .+1 /TIMES (THE NUMBER OF THE OVERLAY) PATCH LOAD2, TAD I RELBLK /PLUS (RELATIVE BLOCK OF LEVEL) TAD STRBLK /PLUS (STARTING BLOCK OF PROGRAM) DCA REDBLK /SAVE IN CALL LOCATION TAD I ADDRES /GET ADDRESS TO LOAD DCA REDADD /SAVE IN CALL LOCATION TAD I FLD /GET FIELD AND (7 /MASK RTR CLL RAR /POSITION TAD I LENGTH /GET LENGTH RTL RTL RTL DCA REDCNT /FORM CONTROL WORD CIF 0 JMS I (7607 /CALL SYSTEM HANDLER TO READ IN OVERLAY REDCNT, 7756 /FUNCTION CONTROL WORD (POINTS TO MREAD-1 FOR "ONCE" REDADD, -7607 /BUFFER ADDRESS (CONTAINS SYS: ENTRY POINT FOR "ONCE" REDBLK, 0 /STARTING BLOCK NUMBER HLT /ERROR RETURN ADDRESS SWAP1, TAD XFERV /GET JMP-JMS FLAG SZA CLA /SET? JMP SWAP2 /YES, EXECUTE A JMP CLA CLL CMA RTL /-3 TAD SWAP /BACK UP TO CALLER'S PC DCA SWAP TAD I SWAP SWAP1A, 0 /CDF TO CALLED SUBROUTINE DCA I XITLOC /SAVE IN CALLED SUBROUTINE ISZ XITLOC /BUMP TRANSFER ADDRESS CDF . TAD (ISZ XFERV DCA I SWAP /SET BACK UP ENTRY IN XFER VECTOR TABLE SWAP2, DCA XFERV /CLEAR FLAG TAD LINK /RESTORE LINK AND AC RAR CLL TAD AC EXIT, 0 /SET DF TO CALLING FIELD 0 /SET IF TO CALLED FIELD JMP I XITLOC /GO TO CALLED SUBROUTINE /VARIABLE LOCATIONS /SOME OF THE FOLLOWING LOCATIONS CONTAIN /ONCE ONLY CODE TO SET UP STARTING BLOCK /AND CHECK THAT FILE CAME FROM SYS: CURTAB=. /CURRENT OVERLAY IN LEVEL TABLE (8 ENTRIES) STRBLK=. /ENTRY 0 IS USED TO HOLD STARTING BLOCK OF FILE ONCE, DCA EXIT /SAVE CALLING FIELD /ALSO ENTRY 0 TAD .-1 /SET UP SO WON'T BE EXECUTED AGAIN /ALSO ENTRY 1 DCA SWAP0 /ALSO ENTRY 2 CDF 0 /ALSO ENTRY 3 TAD I FLD /GET STARTING BLOCK FROM "SOFSET" /ALSO ENTRY 4 SNA /ALSO ENTRY 5 HLT /ERROR, K.M. PATCHES NOT IN /ALSO ENTRY 6 DCA STRBLK /SAVE /ALSO ENTRY 7 TAD I REDCNT /CHECK FILE CAME FROM SYS: TAD REDADD BINDAT, /CONTAINS OVERLAY,LEVEL,FIELD OF DESIRED SUBROUTINE SNA CLA /FROM SYS: ? XITLOC, /CONTAINS LOCATION TO GO TO IN DESIRED SUBROUTINE JMP SWAP0+1 /YES, OK PNTR, /POINTS INTO CURTAB HLT /NO, ERROR TEMP, /TEMP STORAGE JMP .-1 /DON'T ALLOW CONTINUE FLD, /POINTS TO FIELD WORD IN SWPTAB 7747 /POINTER TO "SOFSET" ADDRES=REDADD /POINTS TO ADDRESS WORD IN SWPTAB RELBLK=REDBLK /POINTS TO RELATIVE BLOCK WORD IN SWPTAB LENGTH=REDCNT /POINTS TO LENGTH WORD IN SWPTAB AC, 0 /SAVED AC LINK, 0 /SAVED LINK PAGE /PATCH TO FIX BLOCK POSITION CALCULATION PATCH, IAC /CONVERT PAGES TO BLOCKS CLL RAR DCA PTEMP TAD PTEMP /MULTIPLY BLOCK LENGTH ISZ I PPNT /BY OVERLAY NUMBER JMP .-2 JMP I .+1 LOAD2 PPNT, TEMP PTEMP, 0 /THIS AREA CONTAINS OVERLAY DATA FOR MAIN AND THE 7 LEVELS /THE FORMAT OF EACH ENTRY IS: /WORD1: FIELD OF LEVEL /WORD2: ADDRESS OF LEVEL /WORD3: RELATIVE BLOCK OF 1ST OVERLAY IN LEVEL /WORD4: LENGTH OF THE LEVEL (ANY AND ALL OVERLAYS-EACH) / (ALL OVERLAYS IN A LEVEL ARE THE SAME LENGTH) SWPTAB, *.+40 /THIS AREA CONTAINS THE TRANSFER VECTORS FOR EACH ENTRY POINT /IN ALL THE OVERLAYS IN ALL THE LEVELS /ITS SIZE SHOULD BE MODIFIED BY THE USER /TO FIT THE MAXIMUM NUMBER OF TRANSFER VECTORS NEEDED /EACH TRANSFER VECTOR OCCUPIES 4 LOCATIONS /THE TABLE IS INITIALLY SET UP FOR 24(DEC) (30(OCT)) VECTORS /THE MAXIMUM SIZE THIS TABLE CAN BE IS 3774 (OCT) LOCATIONS FOR /511 (DEC) (777 (OCT)) VECTORS /THE FORMAT OF EACH VECTOR ENTRY IS: /WORD1: ISZ XFERV /WORD2: JMS I XFERV+1 /WORD3: LEVEL/OVERLAY/FIELD /WORD4: ADDRESS TRANVC, SIZE=53. /MODIFY THIS LINE TO CHANGE THE SIZE OF THE TABLE /SET FOR 24(DEC) *SIZE^4+. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /2 CCL MESSAGE PRINTER .EXTERNAL TWAIT,BATCH T=20 BATOUT=7400 /JMS HERE TO PRINT ON BATCH LOG BATERR=7000 /JMP HERE TO ABORT BATCH NAME1=23 NAME2=24 NAME3=25 NAME4=26 NAME5=27 .GLOBAL PRMESG,PRWD,PRNAME,PRINT,CRLF .GLOBAL LEAVE .RSECT CCLMSG FIELD 1 PRMESG, 0 CLA TAD I PRMESG DCA TE2 JMS PRINT TE2, HLT LEAVE, JMS I (TWAIT /V3D TCF CIF CDF 0 TAD FATALFLG SNA CLA JMP I (7605 FATALFLG,0 /CIF CDF BATCH FIELD IF WANT TO ABORT JMP I (BATERR PRWD, 0 DCA T TAD T TTY212, RTR RTR RTR JMS PCHAR TAD T JMS PCHAR JMP I PRWD PCHAR, 0 AND (77 TNOP, SNA JMP I PCHAR /IGNORE NULLS TAD (240 AND (77 TAD (240 /CAN'T USE 'TTY240' JMS TYPE JMP I PCHAR TE, PRNAME, 0 TAD NAME1 JMS PRWD TAD NAME2 JMS PRWD TAD NAME3 JMS PRWD TAD NAME4 SNA CLA JMP I PRNAME TAD (256 JMS PCHAR TAD NAME4 JMS PRWD / TAD NAME5 / SZA / JMS PRWD JMP I PRNAME TYPE, 0 / SNA / JMP I TYPE /CAN REMOVE IF NEED ROOM DCA TE2 JMS I (BATCH JMP TTYOUT DCA CIFB CIFB, HLT /REPLACED BY CIF BATCH FIELD TAD TE2 JMS I (BATOUT TAD TE2 TAD (-"# SZA CLA JMP I TYPE TAD CIFB IAC /CONVERT CIF TO CIF CDF DCA FATALFLG JMP I TYPE TTYOUT, TAD TE2 TAD (-"# /DON'T TYPE #'S SNA CLA JMP I TYPE TAD T7600 KRS TAD (-7603 SNA JMP LEAVE TAD (203-217 SNA CLA JMP I TYPE TAD TE2 TJUMP, JMP .+3 TSF JMP .-1 TLS T7600, 7600 TAD TNOP DCA TJUMP JMP I TYPE PRINT, 0 DCA CRLF /AC NON-0 MEANS DON'T CRLF TAD I PRINT ISZ PRINT DCA TE TAD CRLF SPA CLA TAD (TYPE-PRWD TAD (PRWD DCA PROUT 1$: TAD I TE JMS I PROUT TAD I TE ISZ TE AND (77 SZA CLA JMP 1$ CLA IAC AND CRLF SNA CLA JMS CRLF JMP I PRINT PROUT, PRWD CRLF, 0 TAD (215 JMS TYPE TAD TTY212 JMS TYPE JMP I CRLF PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /1 .ASECT MORTBL FIELD 0 *7130 .EXTERNAL NMOVE,DONB,UNKN .EXTERNAL SETDEV,LPTDEV,TTYDEV,TVDEV,PTPDEV,DMPDEV,NULDEV .GLOBAL SWTCHS SWTCHS, 1423; P1 /LS 1602; P2 /NB 1520; P3 /MP 1400; P4 /L 2400; P5 /T 2300; P6 /S 2000; P7 /P 0400; P8 /D 1600; P9 /N 0000; P10 /UNKNOWN P1, NMOVE 7605 P2, DONB 0 P3, NMOVE 7612 P4, SETDEV LPTDEV P5, SETDEV TTYDEV P6, SETDEV TVDEV P7, SETDEV PTPDEV P8, SETDEV DMPDEV P9, SETDEV NULDEV P10, UNKN 0 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /1 CCL RECOLLECTION ROUTINES .EXTERNAL REMD,SCAN,LBEGIN,BEGLN,PRMESG,PRINT DATWD=7666 CLXR=35 XR=16 .ENTRY REMEM,FOREVER,RECALL .RSECT CCLREM FIELD 1 /CCL REMEMBERS UP TO 8 COMMAND LINES (EACH UP TO 55 DECIMAL /SIXBIT CHARACTERS LONG) IN BLOCK 65 ON THE SYSTEM DEVICE. /THIS BLOCK WHEN READ INTO 04000-04377 HAS THE FOLLOWING FORMAT: /4000-4037 REM-LINE 0 /4040-4177 REM-LINE 1 /4100-4137 REM-LINE 2 /4140-4177 REM-LINE 3 /4200-4237 REM-LINE 4 /4240-4277 REM-LINE 5 /4300-4337 REM-LINE 6 /4340-4377 REM-LINE 7 /EACH REM-LINE HAS THE FOLLOWING FORMAT: /WORD 0: IN-USE FLAG, MUST BE '1234' TO INDICATE LINE WAS REMEMBERED HERE /WORD 1: DATE LINE WAS REMEMBERED /WORD 2: COMMAND DEPENDENT INFORMATION /WORD 3: RESERVED FOR FUTURE EXPANSION /WORDS 4-37 COMMAND LINE NOT INCLUDING KEYWORD OR FOLLOWING SPACES / PACKED IN 6-BIT AND TERMINATED BY A 6-BIT 0. /ROUTINES: / TAD (DEP / JMS REMEM / N /REMEMBERS CURRENT LINE IN REM-LINE N. AC IS LINE DEPENDENT INFORMATION. /IF LINE IS TOO BIG, THIS PRINTS A WARNING MESSAGE AND RETURNS AS IF OK. / JMS RECALL / N /RECALLS REM-LINE N INTO BUFFER /IF NOTHING THERE, PRINTS A BAD SYNTAX MESSAGE AND RETURNS TO OS/8. /UPON RETURN, LINE-DEPENDENT INFO IS IN AC. /IF DATES DON'T MATCH, IT'S NOT THERE UNLESS DATE = -1 /0 USED BY TECO, MAKE COMMANDS /1 USED BY EDIT, CREATE COMMANDS /2 USED BY COMPILE, EXECUTE COMMANDS & PAL. / DEPENDENT WORD IS PTR TO FIRST ENTRY IN MAIN TABLE /3 USED BY 'UA' COMMAND /4 USED BY UB /5 USED BY UC / JMS FOREVER /CAUSES NEXT CALL TO REMEM TO INSERT -1 AS DATE REMSPACE=4000 REMBLOCK=65 REMEM, 0 DCA DEP TAD I (REMD SMA CLA JMP I REMEM /DON'T REMEMBER IF JUST RECALLED JMS I (RDREM JMP I (MEMBIG TAD I REMEM ISZ REMEM CLL RTL RTL RAL /MULTIPLY BY 40 TAD (REMSPACE DCA LPTR TAD (1234 CDF 0 DCA I LPTR CDF 10 ISZ LPTR FORVR, TAD I (DATWD /REPLACED BY CMA IF WANT NO DATE JMS LPUT /STORE DATE TAD DEP JMS LPUT /STORE DEPENDENT INFO JMS LPUT /RESERVED JMS I (SCAN /GO PAST KEYWORD AND BLANKS TAD I (LBEGIN DCA XR L$: JMS I (GETF JMP 3$ JMS I (ROTL DCA TML JMS I (GETF JMP 2$ TAD TML JMS LPUT JMP L$ 2$: TAD TML 3$: JMS LPUT JMS I (WRREM JMP I (MEMBIG REMGO, JMP I REMEM DEP, 0 LPTR, 0 /PTS TO REM-LINE TML, 0 /TEMP /PUT INTO REM-LINE LPUT, 0 DCA TML TAD LPTR AND (37 SNA CLA JMP I (MEMBIG TAD TML CDF 0 DCA I LPTR CDF 10 ISZ LPTR JMP I LPUT FOREVER,0 TAD LCMA DCA FORVR JMP I FOREVER /NON-ZERO MEANS SET DATE TO -1 RECALL, 0 JMS I (RDREM JMP I (REMERR TAD I RECALL ISZ RECALL JMS I (ROTL RAR TAD (REMSPACE DCA LPTR JMS LGET TAD (-1234 SZA CLA JMP I (REMER2 JMS LGET SNA JMP I (REMER2 LCMA, CMA SNA JMP 1$ IAC TAD I (DATWD /SAME DAY? SZA CLA JMP I (REMER2 1$: JMS LGET DCA DEP JMS LGET /IGNORE RESERVED WORD CLA TAD (BEGLN-1 DCA XR TAD (BEGLN-1 DCA I (LBEGIN L$: JMS LGET DCA TML TAD TML JMS I (ROTL RAL JMS I (PUTF JMP LV$ TAD TML JMS I (PUTF JMP LV$ JMP L$ LV$: TAD DEP JMP I RECALL LGET, 0 CDF 0 TAD I LPTR CDF 10 ISZ LPTR JMP I LGET PAGE PUTF, 0 AND (77 SNA JMP PUTZ ISZ PUTF TAD (240 AND (77 TAD (240 PUTZ, CDF 0 DCA I XR CDF 10 JMP I PUTF REMERR, JMS I (PRMESG REMBAD REMER2, JMS I (PRMESG BADREM MEMBIG, CLA JMS I (PRINT MEMWARN JMP I (REMGO RDREM, 0 CIF 0 JMS I (7607 200 /READ 2 PAGES INTO FIELD 0 4000 /LOCATION 4000 REMBLOCK SKP CLA ISZ RDREM JMP I RDREM WRREM, 0 CIF 0 JMS I (7607 4200 /WRITE 2 PAGES FROM FIELD 0 4000 /LOCATION 4000 REMBLOCK SKP CLA ISZ WRREM JMP I WRREM /GET FROM INPUT LINE VIA XR GETF, 0 CDF 0 TAD I XR CDF 10 SZA ISZ GETF AND (77 JMP I GETF ROTL, 0 CLL RTL RTL RTL JMP I ROTL MEMWARN,TEXT /%CAN'T REMEMBER/ REMBAD, TEXT \#I/O ERROR TRYING TO RECALL\ BADREM, TEXT /#BAD RECOLLECTION/ PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /1 CCL RUN COMMAND .RSECT CCLRUN FIELD 1 .ENTRY MONFIX,MONRES .EXTERNAL RDMON,PRMESG .EXTERNAL F1,F2,LO1,LO2 .EXTERNAL YLOAD,YLOADER,YF4,YFORT .EXTERNAL LOOK .EXTERNAL BLK,IOERR PRQMRK==1357 CCLBLK=67 DEASADR=427 CCLSW=435 GETCCL=1362 .EXTERNAL YCCL OS78BIT=7771 MONFIX, JMS I (RDMON CDF 0 TAD I ZERO TAD (-7607 SNA CLA JMP I (CCER3 /ALWAYS WRITE OUT CCL BLOCK CDF 10 CIF 0 JMS I L7607 4200 /WRITE 1 RECORD FROM FIELD 0 400 /LOCATIONS 400-777 CCLBLK /INTO THE SYSTEM'S CCL BLOCK JMP I (IOERR CDF 0 TAD I (2000+CCLSW TAD XXX SNA JMP OK$ TAD XXX2 SZA CLA JMP I (CCER3 / CIF CDF 0 / JMP I L7605 OK$: TAD (GETCCL DCA I (2000+CCLSW STA DCA I (2000+DEASADR /DELETE DEASSIGN JMS WRMON IFZERO 1 < JMS I (LOOK YFORT /LOOK FOR FORT.SV TAD XXX3 /NOT FOUND, USE F4 TAD (YFORT /FOUND USE IT DCA I (F1 TAD I (F1 DCA I (F2 TAD I (F1 TAD MYFORT SZA CLA TAD XXX4 TAD (YLOADER DCA I (LO1 TAD I (LO1 DCA I (LO2 JMS I (LOOK YCCL JMP I (IOERR /CCL.SV NOT FOUND TAD I (BLK TAD (4 /*3400 IS 4TH BLOCK OF CCL NOT COUNTING CCB DCA B$ CDF 10 CIF 0 JMS I (7607 4210 /WRITE 1 RECORD FROM FIELD 1 3400 /LOCS 3400-3777 B$: 0 JMP I (IOERR > CIF CDF 0 JMP I (7605 XXX, -PRQMRK XXX2, PRQMRK-GETCCL IFZERO 1 < MYFORT, -YFORT XXX3, YF4-YFORT XXX4, YLOAD-YLOADER > WRMON, 0 CDF 10 CIF 0 JMS I L7607 4200 2400 10 JMP I (IOERR JMP I WRMON ZERO, 0 L7607, 7607 MONRES, 0 CDF 0 TAD I (OS78BIT CDF 10 AND (200 SZA CLA JMP ERR JMS I (RDMON CDF 0 TAD (PRQMRK DCA I (2000+CCLSW TAD (-405 DCA I (2000+DEASADR JMS WRMON JMP I MONRES ERR, JMS I (PRMESG .+1 TEXT "#CCL IS THE CONCISE COMMAND LANGUAGE FOR OS/78" CCER3, CDF 10 JMS I (PRMESG BADMON BADMON, TEXT /#BAD MONITOR/ PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /2 CCL SUBROUTINES PART 2 .ENTRY TRMSUB,REQSUB,CANSUB OS78BIT=7771 .EXTERNAL PRMESG,LOOK,CHAIN,YTERMIN,PRINT,LEAVE .RSECT CCLSB2 FIELD 1 .SBTTL TERMINATE COMMAND TRMSUB, 0 CDF 0 TAD I (OS78BIT CDF 10 AND (200 SNA CLA JMP I TRMSUB /BACKSPACE, NOT TERMINATE JMS I (LOOK /LOOKUP TERMIN.SV YTERMIN SKP CLA JMP I (CHAIN 6073 6002 CLA STL RAR /JUST IN CASE WE'RE NOT ON A VT-78 JMS I (PRINT BADEV JMP I (LEAVE CANSUB, 0 TAD I (7726 AND (4 SNA CLA JMP FOO4 TAD I (7726 AND (7773 DCA I (7726 /TURN OFF SYMBIONT BIT CDF 0 TAD I (7777 RTL SZL CLA JMP 3$ TAD I (7777 AND (7707 DCA I (7777 3$: CDF 10 STL CLA RAR JMS I (PRINT OFFMSG STL CLA RAR JMS I (PRINT ME2MSG CIF CDF 30 JMP I (3 /GO TO MAGIC SPOT IN SYMBIONT LAND FOO3, STL CLA RAR JMS I (PRINT ALRACT JMP I (LEAVE FOO4, STL CLA RAR JMS I (PRINT NOTACT JMP I (LEAVE PAGE .SBTTL REQUEST COMMAND REQSUB, 0 TAD I (7617 AND (17 TAD (7647-1 DCA T TAD I T TAD (-7607 SZA CLA JMP FOO /*** FILE NOT ON SYS: TAD I (7620 DCA BLK CDF 0 TAD I (7777 AND (70 TAD (-20 SNA CLA JMP 1$ RTL SZL CLA JMP FOO2 TAD I (7777 AND (7707 TAD (20 DCA I (7777 1$: CDF 10 TAD I (7726 AND (4 SZA CLA JMP FOO3 TAD I (7726 AND (7773 TAD (4 DCA I (7726 STL CLA RAR JMS I (PRINT ONMSG STL CLA RAR JMS I (PRINT MEMMSG JMS I (200 /CHAIN TO IT 6 BLK, 0 T, 0 FOO, STL CLA RAR JMS I (PRINT SYSMSG JMP I (LEAVE FOO2, CDF 10 STL CLA RAR JMS I (PRINT BATMSG JMP I (LEAVE PAGE .ENABLE ASCII SYSMSG, TEXT "#Symbiont must be on SYS:" BATMSG, TEXT "#Cannot start symbiont from BATCH" ONMSG, TEXT "[Starting symbiont]" BADEV, TEXT "#Illegal OS/8 command" OFFMSG, TEXT "[Shutting down symbiont]" NOTACT, TEXT "%No symbiont is active" ALRACT, TEXT "#Request denied - symbiont already running" MEMMSG, TEXT "[12K Memory]" ME2MSG, TEXT "[16K Memory] .ENABLE SIXBIT |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /1 CCL SEMICOLON CODE .ENTRY SEMI .EXTERNAL PRMESG,YBATCH,ZOW,BEGLN MOFILE=7600 XR=16 .RSECT SEM1 FIELD 1 ENGOA, TAD (-5 JMS I (ZEROCD TAD I (BLKNO DCA I (7620 CLA IAC DCA I (7617 /'CCBTCH' IS ON SYS: TAD (20 / /T OPTION DCA I (7644 TAD (20 / ALSO /H (HUSH) OPTION DCA I (7643 TAD (YBATCH JMP I (ZOW /CHAIN TO BATCH ZEROCD, 0 TAD (-42 /AC MAY BE NON-0 DCA T$ TAD (MOFILE-1 DCA XR DCA I XR /ZERO THE COMMAND DECODER OUTPUT AREA ISZ T$ JMP .-2 JMP I ZEROCD T$: 0 SEMSG1, TEXT /? ENTER ERROR/ SEMSG2, TEXT \?I/O ERROR\ SEMSG3, TEXT /?DEVICE FULL/ SEMSG4, TEXT /?CLOSE ERROR/ PAGE BATBUF=4400 /LOCATION OF ONE BLOCK BATCH TEMP BUFFER USR=200 GLINE=1200 /LOCATION FROM KBM CTRLCK=1241 /LOC FROM KBM, PTS TO PLACE TO BRANCH ON ^C BATPTR, BATBUF-1 LCHAR, 0 SEMGO, CIF CDF 10 JMP I SEMI SEMI, 0 CLA IAC /SYS JMS I (USR 3 /ENTER BLKNO, TEMNAM BLKLEN, 0 /NEG OF LENGTH JMP SEMER1 /ENTER ERROR TAD BLKNO DCA BATBLK TAD (BEGLN-1 DCA XR TAD (7600 DCA I (CTRLCK /FORCE ^C TO GLINE TO GO TO 7600 JMS BATLST BATHED S2, CDF 0 TAD I XR CDF 10 SNA JMP LINEND DCA LCHAR /SAVE CHAR TAD LCHAR TAD (-"; SNA CLA JMP GOTSEM TAD LCHAR S3, JMS BATPUT JMP S2 LINEND, TAD LCHAR TAD (-"; /LOOK AT LAST CHAR SZA CLA /WAS IT SEMICOLON? JMP BATEND /NO, END OF TEMP BATCH STREAM CIF CDF 0 JMS I (GLIN /YES, READ NEW LINE FROM KEYBOARD /**** WHAT IF WE'RE RUNNING UNDER BATCH **** TAD (BEGLN-1 DCA XR JMP S2 GOTSEM, JMS KRLF TAD (". JMP S3 KRLF, 0 TAD (215 JMS BATPUT TAD (212 JMS BATPUT JMP I KRLF BATPUT, 0 ISZ BATPTR CDF BATBUF DCA I BATPTR CDF 10 TAD BATPTR TAD (-BATBUF-377 SNA CLA JMS BATWRIT /WRITE OUT BUFFER IF FULL JMP I BATPUT BATWRIT,0 CIF 0 JMS I (7607 4200 /WRITE 1 BLOCK BATBUF BATBLK, 0 JMP SEMER2 / I/O ERROR ISZ BATBLK /POINT TO NEXT BLOCK ISZ BATLEN /BUMP LENGTH ISZ BLKLEN SKP JMP SEMER3 /DEVICE FULL TAD (BATBUF-1 DCA BATPTR JMP I BATWRIT BATEND, JMS KRLF JMS BATLST BATAIL JMS BATWRIT CLA IAC /SYS JMS I (USR 4 /CLOSE TEMNAM BATLEN, 0 /LENGTH OF TEMPORARY FILE JMP SEMER4 /CLOSE ERROR JMP I (ENGOA BATLST, 0 TAD I BATLST DCA T$ ISZ BATLST L$: TAD I T$ SNA JMP I BATLST JMS BATPUT ISZ T$ JMP L$ T$: 0 SEMER1, JMS I (PRMESG SEMSG1 SEMER2, JMS I (PRMESG SEMSG2 SEMER3, JMS I (PRMESG SEMSG3 SEMER4, JMS I (PRMESG SEMSG4 PAGE .FSECT GLYN FIELD 0 GLIN, 0 JMS I PGLINE CIF CDF 10 JMP I GLIN PGLINE, GLINE .ASECT SEMSGS .ENABLE ASCII FIELD 0 *7400 BATHED, TEXT "$JOB"<215><212>"." BATAIL, TEXT ".R FOTP"<215><212>"*SYS:CCBTCH.TM/D$"<215><212>"$END"<215><212><32> TEMNAM, FILENAME CCBTCH.TM |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /1 .GLOBAL CORE,CORSIZ .ASECT CORF0 LXM=6200 FIELD 0 *7200 CORLOC, CORX CORV, 1400 CORSIZ, 1 CORE, 0 TAD T7000 /SETS KT8A IF PRESENT LXM /LXM INSTRUCTION CLA /LXM ACTS AS NOP IF NO KT8A CORE2, CDF 0 TAD CORSIZ /ADJUST FIELDS FOR CDF CLL RTR RTR BSW SZL TAD T4 AND COR174 TAD COREX DCA .+1 COR1, CDF TAD I CORLOC COR2, NOP DCA COR1 TAD COR2 DCA I CORLOC COR174, 174 TAD I CORLOC CORX, 7400 TAD CORX TAD CORV SZA CLA JMP COREX TAD COR1 DCA I CORLOC ISZ CORSIZ JMP CORE2 COREX, CDF 0 LXM /NEUTRALIZES KT8A TAD CORSIZ CLL RTL TAD M10 CIF CDF 10 JMP I CORE /RETURN M10, -10 T4, 4 T7000, 7000 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /3 CCL SIMPLE COMMAND SUBROUTINES .EXTERNAL REMD,REGO,FLAG,FOREVER,REMEM,PRMESG .EXTERNAL RDMON,BATCH .GLOBAL USRSUB,BASUB,DEASSIGN .EXTERNAL ASSIGN,FUDG,DVICE,LOOK,PRINT .ENTRY VERTN /CALLED INDEPENDENTLY BY CCL .GLOBAL CRSUB,EDSUB,ZERSUB .GLOBAL TECSUB,MAKSUB,MNGSUB .GLOBAL SQSUB,KILRT,RENRT,MOVRT .EXTERNAL CDER2,GETSPC,GCH,ZEROCD,LBEGIN .ENTRY CMDERR .ENTRY CCSUB .GLOBAL ARLOC /**** MOFILE=7600 MPARAM=7643 XR2=15 XR=16 NAME1=23 NAME2=24 NAME3=25 NAME4=26 DELIM=32 LXR=34 OS78BIT=7771 CCLNUM="3 CCLVER="A .SBTTL UA,UB,UC COMMANDS .RSECT CCLSUB FIELD 1 /TEST END OF TABLE USRSUB, 0 TAD I (REMD SMA CLA JMP I (REGO /REMEMBERED A NEW LINE TAD I (FLAG /WANT TO AND (70 CLL RTR RAR TAD (-1 /IN THIS REM-LINE DCA U$ JMS I (FOREVER /NO DATE JMS I (REMEM U$: 0 JMP I USRSUB .SBTTL BASIC COMMAND BASUB, 0 TAD (200 /SET /Q SWITCH DCA I (MPARAM+1 JMP I BASUB .SBTTL VERSION COMMAND VERTN, 0 JMS I (RDMON /READ MONITOR CDF 0 TAD I (2031 /GET PATCH LEVEL SNA TAD ("! AND (77 DCA TEM$ TAD I (2000 /GET VERSION # CDF 10 SPA KK7600: 7600 /"0" MEANS OLD TAD (60 CLL RTL RTL RTL TAD TEM$ DCA I (VLOC CDF 0 TAD I (OS78BIT AND (200 / 78 SZA CLA / OR TAD (1000 / /8 TAD (5770 CDF 10 DCA I (LOC78 JMS I (PRMESG VMES TEM$: 0 .SBTTL DEASSIGN COMMAND /ALLOW DEASSIGN FOO ? DEASSIGN,0 TAD (7740 DCA XR TAD (-17 DCA T$ DCA I XR ISZ T$ JMP .-2 CDF 0 TAD I (7746 AND (6777 TAD (1000 DCA I (7746 CDF 10 JMP I DEASSIGN T$: 0 CHKSUP, 0 JMS I (FUDG JMS I (ASSIGN TAD NAME1 SNA CLA JMP I CHKSUP /CAN'T SUP IF NO FILENAME TAD I (DVICE JMS I (LOOK /LOOK UP FILE NAME1 JMP I CHKSUP /NOT FOUND (GOOD) JMS I (PRINT SUP JMP I CHKSUP .SBTTL ZERO COMMAND ZERSUB, 0 TAD I (7601 SNA CLA /WAS FILENAME SPECIFIED ON ZERO CMD? TAD I KK7600 /OR WAS NO OUT DEVICE SPECIFIED? SNA CLA JMP I (CDER2 /YES... ERROR JMP I ZERSUB /NO, OKAY. CMDERR, JMS I (PRMESG /NOT A LEGAL KEYWORD ERRCMD RENMES, TEXT /FILES RENAMED:/ PAGE .SBTTL PUT MACRO .NOLIST ME .MACRO PUT TXT JMS TECPUT .IF IDN TXT[1],$< .ENABLE ASCII ;TEXT <ALTMODE>"TXT[2:0]" .ENABLE SIXBIT > .IF DIF TXT[1],$< .ENABLE ASCII ;TEXT /TXT/ .ENABLE SIXBIT > .ENDM .SBTTL MAKE COMMAND ALTMODE=233 SETPA, 0 JMS I (SETX "P;"A /KEEP HERE TO MAKE EASY TO PATCH JMP I SETPA MAKSUB, 0 TAD DELIM SNA CLA JMP I (CMDERR /DON'T ALLOW MAKE <CR> JMS SETLXR JMS I (GETSPC JMS I (LOVE PUT "EW" JMS TECMOV JMS SETPA PUT "$" JMS I (CHKSUP JMS I (REMEM 0 JMP I MAKSUB SETLXR, 0 TAD I (LBEGIN DCA LXR TAD (MOFILE-1 DCA I (TYR TAD (-5 /ZERO OPTION TABLE TOO JMS I (ZEROCD TAD LXR DCA SAVLXR JMP I SETLXR /PUT FOLLOWING CHARS INTO TECO BUFFER VIA TXR TECPUT, 0 / TAD NAME1 / SNA CLA / JMP I (CDER2 TAD I TECPUT ISZ TECPUT SNA JMP I TECPUT JMS I (TPUT JMP TECPUT+1 /MOVE CHARS FROM FIELD 0 LINE BUFFER /FROM SAVLXR+1 TO LXR-1 INCLUSIVE /INTO TECO LINE BUFFER AT 17600 TECMOV, 0 TAD SAVLXR DCA XR2 TAD SAVLXR CMA TAD LXR SNA CLA JMP I (CDER2 /NO FILE SPEC L$: CDF 0 TAD I XR2 CDF 10 JMS I (TPUT TAD XR2 CMA TAD LXR SNA CLA JMP I TECMOV JMP L$ .SBTTL TECO COMMAND TECSUB, 0 JMS SETLXR JMS I (GETSPC TAD DELIM SNA JMP TECNORM TAD (-"< /ALLOW "_" AS WELL AS "<" SZA TAD ("<-"= SZA TAD ("=-"_ SZA CLA JMP I (CDER2 1$: CDF 0 DCA I LXR /CHANGE < TO 0 CDF 10 PUT "EW" JMS TECMOV JMS SETPA TAD LXR DCA SAVLXR JMS I (CHKSUP JMS I (GETSPC PUT "$ER" JMS TECMOV JMS SETPA PUT "$Y" JMP TECLV TECNORM,PUT "EB" JMS TECMOV JMS SETPA PUT "$Y" TECLV, JMS I (REMEM 0 JMP I TECSUB SAVLXR, 0 PAGE .SBTTL MUNG COMMAND TPUT, 0 AND (177 /TECO LIKES 7-BIT ISZ TYR DCA I TYR TAD TYR TAD (-7646 /CHECK FOR OVERFLOW OF CD AREA SZA CLA JMP I TPUT JMS I (PRMESG TOOLNG MNGSUB, 0 JMS I (SETLXR JMS I (GETSPC PUT "ER" JMS I (TECMOV JMS SETX "T;"E PUT "$YHXYHKI" TAD DELIM SNA JMP F$ TAD (-", SZA CLA JMP I (CDER2 L$: STL CLA RAR /PREVENT 'GCH' FROM HANDLING SPACE AND / JMS I (GCH AND (177 /GET RID OF HIGH ORDER BIT SNA JMP F$ JMS TPUT JMP L$ F$: PUT "$MY" /MACRO GETS CALLED WITH POINTER PAST CHARS JMP I MNGSUB TYR, 0 /SET DEFAULT EXTENSION SETX, 0 TAD I SETX DCA 1$ ISZ SETX TAD I SETX DCA 2$ /FALL THRU 2ND EXT TAD NAME4 SNA CLA TAD NAME1 SNA CLA JMP I SETX TAD I TYR /GET LAST CHAR (NO EXT) TAD (-56 /WAS IT A DOT? SNA CLA JMP I SETX /YES JMS I (TECPUT /NO, USE DEFAULT EXTENSION ". 1$: 0 2$: 0 0 TAD 1$ AND (77 CLL RTL RTL RTL DCA 1$ TAD 2$ AND (77 TAD 1$ DCA NAME4 JMP I SETX LOVE, 0 TAD NAME1 TAD (-'LO SZA CLA JMP I LOVE TAD NAME2 TAD (-'VE SZA CLA JMP I LOVE TAD NAME3 TAD NAME4 SZA CLA JMP I LOVE JMS I (PRINT LOVMES JMP I LOVE TOOLNG, TEXT /#COMMAND TOO LONG/ CCSUB, 0 /USED TO FORCE THIS OVERLAY IN JMP I CCSUB PAGE .SBTTL CREATE COMMAND CRSUB, 0 TAD I (7617 SNA CLA /BETTER BE NO INPUT TAD I K7600 /ANYTHING THERE? SNA CLA JMP I (CDER2 /NO OUTPUT OR YES INPUT JMS EDSUB /REMOVE BACK-ARROW AND REMEMBER CREATE LINE JMP I CRSUB .SBTTL EDIT COMMAND EDSUB, 0 CDF 0 DCA I ARLOC /REPLACE ARROW BY NULL CDF 10 JMS I (REMEM /REMEMBER NEW COMMAND LINE 1 JMP I EDSUB ARLOC, . /LOCATION OF BACK-ARROW IN COMMAND LINE /'.' IS HARMLESS POINTER IN CASE NO ARROW .SBTTL SQUISH COMMAND SQSUB, 0 TAD I K7600 SZA CLA JMP I SQSUB TAD I (7617 DCA I K7600 JMS I (BATCH /IS BATCH RUNNING? JMP I SQSUB /NO K7600, 7600 /YES (CLEAR AC) TAD I K7600 TAD (7647-1 /POINT INTO DEVICE HANDLER RESIDENCY TABLE DCA T$ TAD I T$ /GET HANDLER STARTING ADDRESS TAD (-7607 SZA CLA /IS SQUISHED DEVICE SYS:? JMP I SQSUB /NO JMS I (PRINT SQWARN /YES, WARN USER JMP I SQSUB T$: 0 .SBTTL COPY, MOVE, AND DELETE COMMANDS KILRT, 0 STL CLA RAR /4000 MEANS NOT PACKED JMS I (PRINT KILMES JMP I KILRT RENRT, 0 JMS I (PRINT RENMES JMP I RENRT MOVRT, 0 JMS I (PRINT MOVMES JMP I MOVRT VMES, TEXT \OS/8 - KBM V3A - CCL V1A\ LOC78=VMES+1 VLOC=VMES+6 *.-2 CCLNUM&77^100+<CCLVER&77> *.+2 LOVMES, TEXT /NOT WAR?/ SUP, TEXT /%SUPERSEDING/ ERRCMD, TEXT /#ERROR IN COMMAND/ SQWARN, TEXT /%BATCH SQUISHING SYS:!/ MOVMES, TEXT /FILES COPIED:/ .ENABLE ASCII KILMES, TEXT /Files deleted:/ .ENABLE SIXBIT PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /1 CCL OVERLAY TABLE .EXTERNAL BEGLN,PRQMRK .GLOBAL CCLBLC,NOCCL CCLTAB="H /CCL.SV (THE IMPORTANT PART) MUST BE A SINGLE CORE-LOAD /CONTIGUOUS LOAD, BECAUSE OF THE WAY THE MONITOR LOADS IT. /FORTUNATELY, FIELD 0 STUFF OCCURS AFTER FIELD 1 STUFF IN THE /OS/8 CORE-IMAGE FORMAT. /FOR VERSION OF THE MONITOR BEFORE LEVEL A, /THE TOTAL LENGTH OF CCL.SV MUST BE LESS THAN14 BLOCKS /OR IT READS OVER 7600. /BUT NOW CCL COMES IN AND READS THE REMAINDER OF ITSELF /INTO FIELD 0. 400-777 IS IGNORED BY SKIPPING A BLOCK, /THEN THER REST OF CCL (7 PAGES) IS READ IN. .ASECT TABLE0 FIELD 0 *400 /IT LOADS OVER THE SAVE, DATE OVERLAY /AND STARTS AT LOCATION 600 /KEYWORD TABLE IN 400- /CONSISTS OF COMMANDS 2 CHARS PER LOCATION /IN 5-BIT ASCII (ONLY LETTERS ARE LEGAL) /SEPARATED FROM EACH OTHER BY 6-BIT 00'S. /EACH ENTRY STARTS ON A WORD BOUNDARY, BUT IF YOU /NEED THE ROOM, THEY NEED NOT WITH A SIMPLE FIX /BIT 40 ON MEANS THAT THE CHARACTER ISN'T REQUIRED /BUT IF THE USER DOES TYPE A LETTER, IT MUST MATCH. VNO, CCLTAB KEYWRD, 0530 /EX ECUT 4543 6564 0002 /BA CKSP OR TER MIN 0143 5363 6000 0201 /BAS IC 2351 4300 0425 /DU PLICATE 6054 5143 4164 4500 0217 /BO OT 5764 0003 /CCL 0314 0003 /COMPA R 1715 2001 6200 0317 /COM PIL 1560 5154 0003 /COP Y 1720 7100 1505 /MEM ORY 1557 6271 0003 /CREA TE 2205 0164 4500 0322 /CREF 0506 0004 /DA TE 0164 4500 0405 /DEL ETE 1445 6445 0004 /DE A 0541 0004 /DIR ECT 1122 4543 6400 0504 /ED IT 5164 /0005 /EO F /1746 0010 /HE LP 0554 6000 1411 /LIN K 1653 0015 /MAC R 0103 6200 1411 /LI ST 6364 0014 /LO AD 1741 4400 1501 /MAK E 1345 0015 /MAP 0120 0015 /MUNG 2516 0700 2001 /PAL 1400 2022 /PRI NT 1156 6400 2025 /PU NCH 5643 5000 2205 /REN AME 1641 5545 0022 /RES 0523 /0022 /REW IND /0527 /5156 /4400 0003 /CA NCEL 0156 4345 5400 2305 /SET 2400 2313 /SK IP 5160 0023 /SQ UISH 2165 5163 5000 2325 /SU BMIT 4255 5164 0024 /TE CO 0543 5700 2431 /TY PE 6045 /0025 /UN LOAD /1654 /5741 /4400 0022 /REQ U 0521 6500 2165 /Q UEUE 4565 4500 2501 /UA 0025 /UB 0200 2503 /UC 0026 /VE R 0562 0032 /ZERO 0522 1700 4000 /@ ZBLOCK 600-. IFDEF XYZMCR < THIS IS THE TECO MACRO WHICH WAS USED TO CREATE THE ABOVE TABLE: HKGYJ2SR0,.KHXAHKMA TYPE COMMANDS, SPACE SEPARATES MANDATORY PART FROM OPTIONAL PART, CR TERMINATES COMMANDS, ^Z TERMINATES ALL. ** NO EDITING ** HKHXYHXN0UO0UB0UN !CHLP!^TULQL-32"EOBLANK'QL-13"EOCR'QL-26"EOEND' !CHLP0!QL&63+QBUT QT/8UXQX+48IQT-(8*QX)+48I QL"NZJ.UZGNQLIQZJXNK%N' %O&1"NOCHLP' QN-3"LZUH'I OCHLP !BLANK! 32UBZJ.UZGNQLIQZJXNK%NOCHLP !CR! QHJ /GNZJXN0UN0UB0ULOCHLP0 !END!I00 > *600 JSBITS=7746 SYSTEM=22 PRMES=330 ERRET=33 /THESE ARE LOCATIONS FROM OS/8 MONITOR /RUNS IN FIELD 0 ONLY. ENTRY, 0 /INITIALLY 0 MEANS 'EX' COMMAND LINPTR, JMP ENTREE /OS/8 JUMPS HERE (ACTUALLY TO 600) TEMM, TEKLDG, ISZ CCLNHR /TECO 'EG' JUMPS HERE DCA I (BEGLN /ZERO COMMAND LINE JMP TEGO /FIRST WE DISABLE CALLS TO MONITOR ENTREE, TAD (7605 DCA ERRET TAD SYSTEM DCA MYSYS JMS FINDIT SPA CLA /WAS IT A LEGAL COMMAND? JMP I (PRQMRK /NO TEGO, TAD (6003 /YES DCA I (JSBITS CIF 10 JMS I MYSYS /CALL USR AND LOCK IN CORE 10 CLA IAC CIF 10 JMS I (200 2 CCLBLC, CCLSV CCLEN, 0 CCLNHR, JMP NOCCL /ISZ'ED IF KBM NOT IN MEMORY CLA IAC TAD CCLBLC DCA CCLRDB JMS I (7607 CCLCCW, 2711 /READ 27 PAGES OF CCL.SV CCLSTR, 2000 MYSYS, CCLRDB, 7700 /INITIALLY POINTS TO USR JMP NOCCL CIF CDF 10 JMP I CCLSTR CCLSV, FILENAME CCL.SV NOCCL, CLA SKP JMP I (7605 /GO BACK TO MON IF CCL NOT FOUND ON TECO EG COMMAND JMS I (PRMES /PRINT ERROR MESSAGE OTHERWISE TEXT /NO CCL!/ 0 /FINDS IF INPUT LINE STARTS WITH A COMMAND /LEAVES ENTRY # IN AC, -1 IF NOT FOUND /ENTRIES START AT ENTRY 0. /CALLABLE FROM ANY FIELD FINDIT, 0 MORE, TAD (BEGLN-1 DCA LINPTR ISZ LINPTR TAD I LINPTR TAD (-240 SNA CLA JMP .-4 JMS GETKAR JMP ENDOFT /NO MATCH JMP INTO FNLUP, TAD I LINPTR TAD (-301 STL TAD (-32 SNL CLA JMP NOLET /NOT A LETTER JMS GETKAR JMP MATCH INTO, CIA TAD I LINPTR AND (37 /5-BIT ASCII ISZ LINPTR SNA CLA /DO THEY MATCH? JMP FNLUP /YES NOMT, JMS GETKAR SKP JMP .-2 /SCAN TO NEXT ENTRY ISZ ENTRY JMP MORE NOLET, JMS GETKAR JMP MATCH CLA ISZ SIGNIF JMP NOMT MATCH, TAD ENTRY SKP ENDOFT, STA RETCIF, CDF 0 /RETURN TO CALLING FIELD (MAY BE OVERLAID) JMP I FINDIT KPTR, KEYWRD HALF, -1 /0 MEANS LEFT HALF SIGNIF, 0 /1 MEANS 40 BIT ON WHICH MEANS CHAR IS SIGNIF ONLY IF PRESENT /GETKAR GETS NEXT 5-BIT CHAR, LEAVES IT IN AC /SETS SIGNIF TO -1 IF 40 BIT WAS PRESENT /TAKES RETURN 1 IF CHAR IS 0 /TAKES RETURN 2 OTHERWISE GETKAR, 0 ISZ HALF JMP RTHALF TAD I KPTR RTR RTR RTR JMP INSIDE RTHALF, STA DCA HALF TAD I KPTR ISZ KPTR INSIDE, AND (77 DCA TEMM TAD TEMM AND X40 X40, SZA CLA STA DCA SIGNIF TAD TEMM SZA ISZ GETKAR AND (37 JMP I GETKAR PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 | / / / /COPYRIGHT (C) 1979 BY DIGITAL EQUIPMENT CORPORATION / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / /VERSION=V3A (D.H.) /10 CCL INTERNAL TABLES FOR OS/78 .NOLIST ME .GLOBAL EXTCM .GLOBAL YBATCH,YDATE,YTERMIN .GLOBAL F1,F2,LO1,LO2 .EXTERNAL SETLPT,SETTTY,SETPTP,COLSET .EXTERNAL TECSUB,MAKSUB,MNGSUB .EXTERNAL YF4,YLOAD .EXTERNAL USRSUB,REQSUB,CANSUB .EXTERNAL MOVRT,KILRT,RENRT .EXTERNAL EXSUB .EXTERNAL TRMSUB,BASUB,MONRES,DETCOR,DATE,DEASSIGN,SQSUB,VERTN,ZERSUB .EXTERNAL YAT .EXTERNAL CRSUB,EDSUB .DSECT PTBL FIELD 0 .ASECT SWS *7300 .ASECT LONGS *5000 .MACRO .BOX COM,SPACES,STARS LEN=.NCHARS COM .PUSH .LISTWD L1=LEN+4 L2=LEN+2 ;.LIST ME / STARS[1:L1] / *SPACES[1:L2]* / * COM * / *SPACES[1:L2]* / STARS[1:L1] .POP .LISTWD EJECT CCL COMMANDS .ENDM .BOX .MACRO .EXT .ENDM .MACRO .CMD COMAND,ABBREV,CODE,EXTEN,SWITCH,SUBR,PROGRM,LABEL .BOX COMAND," ","****************" .SBTTL COMAND ..=. .DSECT PTBL ;.. .SECT * X'ABBREV, CODE IFNZRO CODE&4000 < ;EXTEN .IF NBL SWITCH[1]< XX="SWITCH[1]&77;YY=<XX-1>%12.;7643+YY;ZZ=XX-<YY^12.> QQ=1 .REPT 12.-ZZ&17 QQ=QQ^2 .ENDR ;QQ> .IF NBL SWITCH[2]< XX="SWITCH[2]&77;YY=<XX-1>%12.;7643+YY;ZZ=XX-<YY^12.> QQ=1 .REPT 12.-ZZ&17 QQ=QQ^2 .ENDR ;QQ> ;0 .ASECT SWS ..=. .SECT * .IF BL LABEL <;.. > /REMOVE IF DON'T WANT MULTIPLE CHARACTER SWITCHES .IF NB LABEL <;LABEL> ;SUBR .IF NB PROGRM< ;Y'PROGRM> .IF BL PROGRM< ;0> > IFZERO CODE&4000 < ;EXTEN .IF NB SWITCH< ;Y'SWITCH> .IF BL SWITCH< ;0> > .ENDM .MACRO .QUAL LONG,SHORT,NAME .ASECT LONGS ..=. ;TEXT "LONG[1:6]";"SHORT .SECT * .ASECT SWS .IF NB NAME <NAME=.> ;.. .SECT * .ENDM .MACRO .ENDQ .ASECT SWS ;0 .SECT * EJECT CCL COMMANDS .ENDM .ASECT TABLES FIELD 0 *6200 .CMD EXECUTE,EX,5033, EXTEXE, G, EXSUB, PAL8 /MUST BE FIRST FOR TECO EG .ENDQ .CMD BACKSPACE,BA,0, TRMSUB, CAMP .ENDQ .CMD BASIC,BAS,0, BASUB, BASIC .ENDQ .CMD DUPLIC,DU,4001, STAR, , 0, RXCOP .QUAL NOCOPY,M .QUAL NOMATCH,N .QUAL PAUSE,P .QUAL READONLY,R .QUAL VERSION,V .ENDQ .CMD BOOT,BO,0, 0, BOOT .ENDQ .CMD CCL,CCL,0, MONRES, .ENDQ .CMD COMPARE,COMPA,4001, EXTNUL, , SETTTY, SRCCOM .QUAL NOCOMMENTS,C .QUAL NOSPACES,S .QUAL TABS,T .QUAL BLANKS,B .QUAL NOPRINTCOMMENTS,X .ENDQ .CMD COM,COM,5033, EXTCOM, , EXSUB, PAL8 .QUAL NOISN,N .QUAL OPTIMIZE,Q .QUAL GO,G .ENDQ .CMD COPY,COP,4001, STAR, L, MOVRT, FOTP .QUAL NOCOPY,D .QUAL NOPREDELETE,N .QUAL RENAME,R .QUAL FAILSAFE,F .QUAL CURRENT,C,LSTOPT .QUAL LOG,L .QUAL OTHER,O .QUAL QUERY,Q .QUAL INQUIRE,Q .QUAL INSPECT,Q .QUAL TODAY,T .QUAL UGLY,U .QUAL INDEPENDENTLY,U .QUAL INVERT,V .QUAL EXCEPT,V .QUAL VERSION,W .QUAL V,V .ENDQ .CMD MEMORY,MEM,0, DETCOR, .ENDQ .CMD CREATE,CREA,4400, EXTNUL, , CRSUB, EDIT .QUAL SPACES,B .ENDQ .CMD CREF,CREF,4002, EXTCF, C, 0, PAL8 .QUAL NOLIST,P .QUAL NOSYMTAB,U .QUAL RALF,R .QUAL SABR,S .QUAL NOLITERALS,X .QUAL KEEP,E .QUAL MAMMOTH,M .QUAL MOBY,M .ENDQ .CMD DATE,DA,0, DATE, .ENDQ .CMD DELETE,DEL,4001, STAR, LD, KILRT, FOTP,LSTOPT .CMD DEASSIGN,DE,0, DEASSIG, .ENDQ .CMD DIRECT,DIR,4001, STAR, ,COLSET, DIRECT .QUAL BLOCKS,B .QUAL CURRENT,C .QUAL EXTENDED,E .QUAL FAST,F .QUAL BRIEF,F .QUAL ADDITIONAL,I .QUAL EMPTIES,M .QUAL FREE,M / .QUAL INDEPENDENTLY,U .QUAL OTHER,O .QUAL REMAINDER,R .QUAL UGLY,U .QUAL INVERT,V .QUAL EXCEPT,V .QUAL VERSION,W .QUAL V,V .QUAL COLUMNS,Z /DUMMY .ENDQ .CMD EDIT,ED,5220, EXTNUL, , EDSUB, EDIT .QUAL SPACES,B .QUAL PREDELETE,D .QUAL DELETE,D .ENDQ / .CMD EOF,EO,0, 0, CAMP / .ENDQ .CMD HELP,HE,4001, STAR, T, SETTTY, HELP .ENDQ .CMD LINK,LIN,5033, EXTLI, , EXSUB, LINK .QUAL GO,G .QUAL HALTS,H .QUAL JUMPS,J .QUAL JMPS,J .QUAL CORE,K .QUAL MEMORY,K .QUAL VERSION,V .QUAL START,S .QUAL JSW,W .QUAL M,M .ENDQ .CMD MAC,MAC,5033, EXTMA, , EXSUB, MACREL .QUAL BLOCK,B .QUAL HEADING,B .QUAL HDR,B .QUAL CREF,C .QUAL KREF,C .QUAL GO,G .QUAL NOCONDITIONALS,J .QUAL LINK,L .QUAL PERM,M .QUAL NOLIST,N .QUAL OMIT,O .QUAL NOMACROS,O .QUAL RESET,P .QUAL EAE,Q .QUAL REMOVE,R .QUAL REDUNDANT,R .QUAL DESTROY,Z .QUAL NOBATCH,Z .QUAL EXTENDED,X .QUAL K,K .QUAL P,P .ENDQ .CMD LIST,LI,4001, STAR, U, SETLPT, FOTP,LSTOPT .CMD LOAD,LO,5031, EXTLO, , EXSUB, ABSLDR .QUAL IMAGE,I .QUAL MULTIPLE,S .QUAL SLURP,S .QUAL GO,G / /8 /9 /START:N /FIELD:F /P .ENDQ .CMD MAKE,MAK,0, MAKSUB, TECO .ENDQ .CMD MAP,MAP,4001, EXTBN, , SETTTY, BITMAP .QUAL MULTIPLE,S .QUAL SLURP,S .QUAL INVERT,T / FIELD:N .ENDQ .CMD MUNG,MUNG,0, MNGSUB, TECO .ENDQ .CMD PAL,PAL,5033, EXTPA, , EXSUB, PAL8 .QUAL SHIFT,B .QUAL CREF,C .QUAL DDT,D .QUAL NOLINKS,E .QUAL NOFILL,F .QUAL GO,G .QUAL NONPAGINATED,H .QUAL NOCONDITIONALS,J .QUAL LOAD,L .QUAL NOLIST,N .QUAL NOORIG,O .QUAL NOSYMTAB,S .QUAL NOREMEMBERLITERALS,W .QUAL WIDE,7 .QUAL W,W .ENDQ / /K /T .CMD PRINT,PRI,4000, STAR, , SETLPT, LPTSPL .ENDQ .CMD PUNCH,PU,4001, EXTNUL, , SETPTP, PIP / .QUAL ASCII,A / .QUAL BINARY,B / .QUAL ELIMINATE,C / .QUAL PREDELETE,D / .QUAL DELETE,D / .QUAL IGNORE,G / .QUAL IMAGE,I / .QUAL TABS,T / .QUAL VERSION,V / .QUAL V,V .ENDQ .CMD RENAME,REN,4001, STAR, LR,RENRT,FOTP,LSTOPT .CMD RESOURCES,RES,4001, EXTSY, , SETTTY, RESORC .QUAL DETAILED,E .QUAL EXTENDED,E .QUAL BRIEF,F .QUAL FAST,F .ENDQ / .CMD REWIND,REW,0, 0, CAMP / .ENDQ .CMD CANCEL,CA,0,CANSUB, .ENDQ .CMD SET,SET,0, 0, SET .ENDQ .CMD SKIP,SK,0, 0, CAMP .ENDQ .CMD SQUISH,SQ,4001, EXTNUL, S, SQSUB, PIP .QUAL OK,O .QUAL NOCONFIRM,O .ENDQ .CMD SUBMIT,SU,4000, EXTBI, , 0, BATCH .QUAL CARDS,C .QUAL NONFATAL,E .QUAL PAPERTAPE,P .QUAL QUIET,Q .QUAL HUSH,H .QUAL TERMINAL,T .QUAL TTY,T .QUAL UNATTENDED,U .QUAL VERSION,V .QUAL 026,6 .ENDQ .CMD TECO,TE,10, TECSUB, TECO .ENDQ .CMD TYPE,TY,4001, STAR, U, SETTTY, FOTP,LSTOPT / .CMD UNLOAD,UN,0, 0, CAMP / .ENDQ .CMD REQUEST,REQ,4000,EXTSV,,REQSUB, .ENDQ .CMD QUEUE,Q,4000,STAR,,0,QUEUE .QUAL LIST,L .QUAL KILL,K .QUAL STOP,S .QUAL GO,G .QUAL START,G .QUAL NOH,H .QUAL DELETE,D .QUAL COPIES,C .ENDQ .CMD UA,UA,40, USRSUB, .ENDQ .CMD UB,UB,50, USRSUB, .ENDQ .CMD UC,UC,60, USRSUB, .ENDQ .CMD VERSION,VE,0, VERTN, .ENDQ .CMD ZERO,ZERO,4401, EXTNUL, Z, ZERSUB, PIP .ENDQ / .CMD @,@,0, YAT, / .ENDQ ..=. 0;YAT;0 .DSECT PTBL .. 0;0 /PTBL, XEXE / XBAC / XBAS / XDUPL / XBOO / XCCL / XCOMPA / XCOMPI / XCOP / XCOR / XCREA / XCREF / XDAT / XDEL / XDEA / XDIR / XEDI / XEOF / XHEL / XLINK / XMAC / XLIS / XLOA / XMAK / XMAP / XMUN / XPAL / XPRI / XPUN / XREN / XRES / XREW / XSET / XSKI / XSQU / XSUB / XTEC / XTYP / XUNL / XUA / XUB / XUC / XVER / XZER / XAT .EXT ALG=AL .EXT BAK=BK .EXT BAS=BA .EXT BIN=BN .EXT BUG=BG .EXT CMD=CM .EXT COM=CM .EXT CRF=CF .EXT CTL=CM .EXT DAT=DA .EXT DIR=DI .EXT DOC=DC .EXT HLP=HL .EXT INI=IN .EXT LOG=LG .EXT LPT=LP .EXT LST=LS .EXT MAC=MA .EXT MAN=MN .EXT MAP=MP .EXT MEM=ME .EXT OLD=OL .EXT PAL=PA .EXT REL=RL .EXT RIM=RM .EXT RNO=RO .EXT SAV=SV .EXT EXE=SV .EXT SNO=SN .EXT SRC=SR .EXT SYS=SY .EXT TEC=TE .EXT TEM=TM .EXT TMP=TM .EXT TXT=TX .EXT BAT=BI .EXT FOR=FT .EXT RLF=RA .EXT OBJ=RB .EXT SBR=SB .EXT FTN=FT .ASECT EXTNS FIELD 0 *6600 STAR, 5200; 0 0; 0 EXTSY, 'SY; 0 0; 0 EXTBI, 'BI; 0 0; 0 EXTCF, 'PA; YPAL8 0; YPAL8 EXTMA, 'MA; YMACREL 0; YMACREL EXTPA, 'PA; YPAL8 0; YPAL8 EXTBN, 'BN; 0 0; YABSLDR EXTNUL, 0; 0 EXTLO, 'BN; YABSLDR 'RL; LO1,YLOAD /**** EXTLI, 'RB; YLINK 0; 0 EXTCM, 'CM; 0 0; 0 EXTSV, 'SM; 0 'SV; 0 0; 0 EXTEXE, 'PA; YPAL8 'FT; F1,YF4 /**** 'BA; YBCOMP 'MA; YMACREL 'BN; YABSLDR 'RL; LO2,YLOAD /**** 'RA; YRALF 'SB; YSABR 'RB; YLINK 'LD; YFRTS 'BI; YBATCH 0; 0 ZBLOCK 4 EXTCOM, 'PA; YPAL8 'FT; F2,YF4 /**** 'MA; YMACREL 'BA; YBCOMP 'RA; YRALF 'SB; YSABR 0; 0 ZBLOCK 4 .ASECT FNAMES FIELD 0 *7000 YEDIT, FILENAME EDIT.SV *.-1 YBOOT, FILENAME BOOT.SV *.-1 YBITMAP,FILENAME BITMAP.SV *.-1 YSRCCOM,FILENAME SRCCOM.SV *.-1 YBCOMP, FILENAME BCOMP.SV *.-1 YPAL8, FILENAME PAL8.SV *.-1 YFOTP, FILENAME FOTP.SV *.-1 YDIRECT,FILENAME DIRECT.SV *.-1 YPIP, FILENAME PIP.SV *.-1 YABSLDR,FILENAME ABSLDR.SV *.-1 YTECO, FILENAME TECO.SV *.-1 YLPTSPL,FILENAME LPTSPL.SV *.-1 YCAMP, FILENAME CAMP.SV *.-1 YSET, FILENAME SET.SV *.-1 YBASIC, FILENAME BASIC.SV *.-1 YRXCOP, FILENAME RXCOPY.SV *.-1 YRESORC,FILENAME RESORC.SV *.-1 YBATCH, FILENAME BATCH.SV *.-1 YRALF, FILENAME RALF.SV *.-1 YSABR, FILENAME SABR.SV *.-1 YFRTS, FILENAME FRTS.SV *.-1 YHELP, FILENAME HELP.SV *.-1 YMACREL,FILENAME MACREL.SV *.-1 YLINK, FILENAME LINK.SV *.-1 YDATE, FILENAME DATE.SV *.-1 YTERMIN,FILENAME TERMIN.SV *.-1 YQUEUE, FILENAME QUEUE.SV *.-1 YCANCEL,FILENAME CANCEL.SV *.-1 |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 | XLIST /8 COMMAND DECODER FOR OS/8 MONITOR / / / / / / / / / /COPYRIGHT (C) 1974, 1975, 1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /APRIL 1977 RL/EF/HJ/SR /ABSTRACT-- /COMMAND DECODER (CD) ACCEPTS TTY INPUT AND INTERPRETS /THAT INPUT AS A LIST OF OPTIONS AND FILE SPECIFICATIONS /FOR OS/8 CUSPS. TABLES ARE SETUP INDICATING THE SPECIFIED /FILES AND OPTIONS. /THIS VERSION OF CD IS CAPABLE OF RUNNING OS/8 BATCH. /MODIFICATIONS TO INITIALIZATION CODE HAVE BEEN MADE TO /ALLOW THIS. DCB=7760 SHNDLR=7607 USERFG=40 /LOCATION IN MAIN OS/8 ASSEMBLY - VOLATILE T1=41 /DITTO MCDREC=51 /ALSO PRETTY VOLATILE MOFILE=7600 MIFILE=7617 MPARAM=7643 FIELD 0 /JUSTINCASE CDVERSION=6501 /5A ODTVERSION=6601 /6A /V3 CHANGES TO CD: /1. FIXED LOTS OF BUGS / A:B:C IS ILLEGAL / 15-BIT = OPTION DOESN'T DESTROY ALTMODE BIT /2. ADDED ? SUPPORT IN SPECIAL MODE /3. ALLOWED SPECIAL MODE UNDER BATCH /4. REMOVED DCC CODE /5. ^U, RO TO BOL, AND LF ALL REPRINT * /6. VERSION # AT LOC ZERO /7. DON'T LOAD HANDLERS FOR OUTPUT DEVICE /8. CHANGED _ TO < STANDARD /V3 CHANGES TO ODT /1. REMOVED DCC CODE /2. FIXED CORE SIZE ROUTINE /3. ALLOWED SOFTWARE CORE SIZE /4. MODIFIED 'GO' COMMAND SO THAT IT DOESN'T RESTORE TRAP / LOCATION TO UNMODIFIED VALUE /5. FIXED BUG RE: JMS'S OUT OF FIELD WITH MAGIC LOCATION SET /6. TURN OFF INTERRUPTS ON BREAKPOINT /CHANGES AFTER FIELD TEST RELEASE: /1. FIXED BUG RE FILE LENGTHS GT 2047 BLOCKS /MAINTENANCE RELEASE: / NO CHANGES /V3D CHANGES: /CHANGED FORMAT OF VERSION NUMBERS *200 CD, JMP I NUMBER /EXECUTED IN SYSGEN NUM, JMP I T ANALYZ, TAD [BEGLN-1 DCA XR TAD I XR SNA JMP NOBKAR TAD [-"< SZA CLA JMP .-5 CLA CMA NOBKAR, DCA OUTSW TAD [BEGLN-1 DCA LXR BEGGRP, TAD OUTSW SNA CLA TAD BEGDIF /DIFF BETWEEN INPUT & OUTPUT AREAS TAD [MOFILE-1 DCA CLXR STA DCA DVFLAG DCA DEV1 FILLP1, DCA DEV2 FILLP, JMS I [GNAME TAD ["A-": /AC CONTAINED DELIM - "A SNA CLA JMP DEVNAM JMS I [ASSIGN TAD OUTSW SNA CLA TAD LIMDIF /DIFF BETWWEN END OF OUTPUT & INPUT AREAS TAD OUTLIM /END OF OUTPUT AREA TAD CLXR SMA CLA JMP CDER1 TAD OUTSW SNA CLA LKUPSW, JMP INFILE /ZEROED IF IN "SPECIAL DECODE" MODE CDF 10 TAD DVICE DCA I CLXR TAD NAME1 DCA I CLXR TAD NAME2 DCA I CLXR TAD NAME3 DCA I CLXR TAD NAME4 CDSKP, SKP INFILE, JMS I [LOOKUP DCA I CLXR DLOOK, CDF 0 STA DCA DVFLAG TAD DELIM SNA JMP CDOVER TAD [-"[ SNA JMP I [OLENGT TAD ["[-", SNA JMP FILLP TAD [",-"< SNA JMP BKAROW TAD ["<-"= SZA CLA JMP I [CDER2 EQUAL, DCA NUMFUJ JMS NUMBER DCA I [MPARAM+3 CLA CLL CML RAR AND I [MPARAM-1 /PRESERVE ALTMODE TAD HIORD DCA I [MPARAM-1 JMP DLOOK BKAROW, ISZ OUTSW JMP I [CDER2 JMP BEGGRP DEVNAM, TAD NAME1 DCA DEV1 ISZ DVFLAG JMP I [CDER2 /CATCHES A:B: TAD NAME2 JMP FILLP1 CDOVER, TSF JMP .-1 /LET PRINTER QUIET DOWN TCF /AND CLEAR FLAG CDF CIF 10 TAD TMONIT DCA I [200 /RESTORE "MONITO" TAD TUSRFG DCA I [USERFG /RESTORE "USER FLAG" TAD TFPUTX /LOAD "USER CALLING FIELD" INTO AC JMP I CD /RETURN - MONITOR RESTORES CORE IF NECESSARY NUMBER, 4000 /USED BY SYSGEN TAD CDSKP DCA NUMADD /SET NUMADD TO EITHER "SKP" OR "TAD NUM" DCA HIORD NUMLP, DCA NUM JMS NUMTST /INTO PAGE 0 FOR RANGE TEST SNL JMP EONUM DCA T CLA CLL CMA RTL DCA DELIM TAD NUM ROTLP, CLL RAL DCA NUMX TAD HIORD RAL SPA JMP I [CDER2 DCA HIORD TAD NUMX ISZ DELIM JMP ROTLP NUMADD, TAD NUM /SKP IF OCTAL TAD NUM TAD T JMP NUMLP EONUM, TAD ["0 DCA DELIM TAD NUM CDF 10 JMP I NUMBER CDER1, JMS I [PRMESG TEXT /TOO MANY FILES/ IFZERO .&400 <*400> ASSIGN, 0 TAD CLXR AND DVFLAG TAD OUTLIM SMA SZA CLA /CHECK FOR OUTPUT OR FIRST INPUT JMP ASNORM /IF DEVICE WAS SPECIFIC, OR IF WE ARE ON THE INPUT SIDE, /PROCEED NORMALLY TAD NAME1 SNA CLA JMP ASGNST TAD DFLTNM+1 DCA DEV2 TAD DFLTNM DCA DEV1 ASNORM, TAD DEV1 DCA AS+1 TAD DEV2 DCA AS+2 TAD OUTSW SNA CLA /DON'T LOAD HANDLER IF WE ARE ON OUTPUT SIDE OF "_" TAD NAME1 SPKLG1, SNA CLA /OR IF THERE IS NO FILE NAME TO LOOK UP TAD GETHND /GETHND=11 NORMALLY, 0 IF IN "SPECIAL DECODE" MODE IAC DCA AS TAD [1401 /ALLOW TWO PAGE HANDLERS DCA ASADR CIF 10 JMS I [200 AS, 0 0 0 ASADR, 1401 JMP I [CDER0 TAD AS+2 ASGNST, DCA DVICE JMP I ASSIGN GNAME, 0 DCA NAME1 DCA NAME2 DCA NAME3 DCA NAME4 TAD [NAME1 DCA NMBASE CLA CMA DCA PERDSW DCA NAMECT GTNMLP, JMS I [GCH DCA DELIM TAD DELIM TAD [-"? SZA TAD ["?-"* SNA STARSW, JMP I [CDER2 /"JMP STARNM" IF "SPECIAL DECODE" MODE TAD ["*-". SNA CLA JMP PERIOD JMS I [DECODE JMP I GNAME STARNM, CLA /THIS CODE HANDLES *'S AND ?'S CORRECTLY TAD DELIM AND [77 DCA DELIM TAD NAMECT TAD [-6 SMA CLA JMP GTNMLP TAD NAMECT CLL RAR TAD NMBASE DCA TT TAD DELIM SZL JMP .+4 RTL RTL RTL TAD I TT DCA I TT ISZ NAMECT JMP GTNMLP PERIOD, TAD NAME1 SZA CLA ISZ PERDSW JMP I [CDER2 ISZ NMBASE TAD [4 JMP GTNMLP-1 LOOKUP, 0 DCA LNAME TAD NAME1 SNA CLA JMP LKUPST JMP EXT1 LKUPLP, DCA LNAME TAD AS+2 CIF 10 JMS I [200 2 LNAME, 0 /NAME1 LENGTH, 0 JMP LFAILD TAD LENGTH CLL TAD [400 SNL CLA CLL RTL RTL AND [7760 LKUPST, CDF 10 TAD DVICE DCA I CLXR TAD LNAME JMP I LOOKUP LFAILD, TAD NAMECT SNA CLA /WAS THERE AN EXPLICIT EXTENSION? TAD DEFALT /NO - WAS THERE A DEFAULT EXTENSION? SNA CLA JMP I [CDER3 /YES OR NO - FILE NOT FOUND ISZ NAMECT /NO AND YES - SET FLAG TO FAIL NEXT TIME JMP EXT2 /ZERO OUT THE EXTENSION AND TRY AGAIN CDER3, JMS I [PRNAME JMS I [PRMESG TEXT / NOT FOUND/ IFZERO .+200&1000 <*600> 0 /V3 [FREE LOC] SLSHCH, 0 /V3 SNA /V3 JMP I [CDER2 DCA DELIM TAD [MPARAM-1 DCA T JMS I [DECODE JMP I [CDER2 SZL TAD [32 CMA STL /THE FOLLOWING TURNS ON THE CORRECT OPTION BIT DCA TT SLSHLP, SZL ISZ T RAR SNL ISZ TT JMP SLSHLP DCA TT CDF 10 TAD TT CMA AND I T TAD TT DCA I T CDF 0 JMP I SLSHCH DECODE, 0 TAD DELIM TAD [-"9-1 CLL TAD ["9+1-"0 SZL JMP DCDYES TAD ["0-"Z-1 CLL CML TAD ["Z-"A+1 SNL DCDYES, ISZ DECODE JMP I DECODE CDER0, TAD DEV1 JMS I [PRWD TAD DEV2 JMS I [PRWD JMS I [PRMESG TEXT / DOES NOT EXIST/ RESTRT, JMS I [CRLF CDF 10 TAD [MOFILE-1 DCA XR TAD [-47 DCA T DCA I XR /ZERO OUT THE COMMAND DECODER OUTPUT AREA ISZ T JMP .-2 CDF 0 JMP I [GLINE GCH, 0 TAD I LXR TAD [-240 SNA JMP GCH+1 TAD [240-"/ SNA JMP SLASH TAD ["/-"( SNA JMP OPENP TAD ["( JMP I GCH SLASH, TAD I LXR JMS I [SLSHCH JMP GCH+1 OPENP, TAD I LXR TAD [-") SNA JMP GCH+1 TAD [") JMS I [SLSHCH JMP OPENP OLENGT, TAD OUTSW AND NAME1 /[N] IS ONLY LEGAL ON THE OUTPUT SIDE OF THE "_" SNA CLA /AND ONLY AFTER A FILE NAME JMP I [CDER2 TAD [-4 TAD CLXR DCA NMBASE CLA CLL CML RTL DCA NUMFUJ /SET "NUMBER" TO ACCEPT DIGITS 8 AND 9 TAD OLFUDJ /LOAD FUDGE SO THAT "NUMBER" WILL BE DECIMAL JMS I [NUMBER CLL RTL RTL AND [7760 TAD I NMBASE DCA I NMBASE CDF 0 TAD DELIM TAD [-"] /IS THERE A CLOSING BRACKET? SNA /IF NOT, "DLOOK" ROUTINE WILL DETECT IT JMS I [GCH DCA DELIM JMP I [DLOOK OLFUDJ, NUM&177+1570 CDER2, CLA JMS I [PRMESG TEXT /ILLEGAL SYNTAX/ IFZERO .&1000 <*1000> /TELETYPE INPUT ROUTINE FOR COMMAND DECODER GLINE, TAD (252 /SETS 1177=252 FOR * IN MESSAGE JMS I PRINT DCA RBFLAG TAD [BEGLN-1 DCA LXR CHLOOP, 6031 /KSF JMP CHLOOP TAD [200 6034 /KRS DCA NAME1 6032 /KCC TAD [SPADR-1 DCA XR DSPCHL, TAD I XR SZA TAD NAME1 SNA CLA JMP I XR JMP DSPCHL SPADR, -225;JMP CTRLU -215;JMP CARRET -377;JMP RUBOUT -375;JMP ALTMOD /V3D MODIFIED BY SET -376;JMP ALTMOD /V3D MODIFIED BY SET -233;JMP ALTMOD -200;JMP CHLOOP -217;JMP CHLOOP /^O -"_;JMP LESSTN -212;JMP LFEED -203;JMP CTRLC /MUST BE LAST - SEE CLRLIN CODE 0 JMS PRNT CINSRT, TAD NAME1 DCA I LXR TAD LXR TAD [-EOBUFR+2 SPA CLA JMP CHLOOP JMS CRLF JMP I [CDER2 CARRET, JMS CRLF CLFINI, DCA I LXR JMP I [ANALYZ LESSTN, JMS PRNT TAD ["< JMP CINSRT+1 CTRLC, CTRLU, TAD [336 JMS I PRINT TAD NAME1 TAD [100 CLRLIN, JMS I PRINT JMS CRLF TAD I XR SZA CLA JMP GLINE CDF 10 CLA CMA DCA I [7700 TSF JMP .-1 JMP I [7605 /7605=CDF CIF 10 CRLF, 0 TAD [215 DCA NAME1 JMS PRNT TAD [212 JMS I PRINT JMP I CRLF ALTMOD, TAD [244 DCA NAME1 CLA CLL CML RAR CDF 10 DCA I [MPARAM-1 CDF 0 JMS PRNT JMP CLFINI /*** LOCATIONS ON THIS PAGE ARE MODIFIED BY SET /SEE SET FOR DETAILS. DO NOT CHANGE. RUBOUT, TAD LXR TAD [1-BEGLN SNA CLA JMP RBSPCL TAD [334 ISZ RBFLAG JMS I PRINT CLA CMA DCA RBFLAG TAD LXR DCA T TAD I T JMS I PRINT LBCKUP, CLA CMA TAD LXR JMP CHLOOP-1 RBSPCL, ISZ RBFLAG JMP CLRLIN+1 TAD [334 JMP CLRLIN PRNT, 0 ISZ RBFLAG JMP .+3 TAD [334 JMS I PRINT DCA RBFLAG TAD NAME1 JMS I PRINT JMP I PRNT LFEED, JMS CRLF DCA I LXR TAD [BEGLN-2 DCA XR TAD I XR SNA JMP LBCKUP JMS I PRINT JMP .-4 IFNZRO RUBOUT-1131 <_ERROR_> *1200 /INITIALIZATION - STORED OVER BY LINE BUFFER BEGLN=. /LINE BUFFER CDINIT, DCA TFPUTX CDF 10 CLA IAC TAD I [200 DCA TMONIT /SAVE AWAY MONITOR CALL ADDRESS SINCE WE CALL TAD I [USERFG /THE MONITOR RECURSIVELY, LIKEWISE SAVE DCA TUSRFG /THE "USER FLAG" AND THE FIELD WE WERE CALLED FROM TAD I [T1 /FETCH THE USERS ARGUMENT DCA DEFALT /STORE IN THE DEFAULT EXTENSION WORD DCA I [7 /ZERO "DIRECTORY SEGMENT IN CORE" KEY CDF 0 CIF 10 JMS I [200 13 /RESET ALL HANDLERS 0 /BUT NOT OUTPUT FILES TAD DEFALT TAD M5200 SZA CLA /IS THIS A REQUEST FOR A "SPECIAL DECODE"? JMP CDCONT /NO TAD ALTLIM DCA OUTLIM /YES - SET UP ALL THE PROPER LOCATIONS TAD ALTDF1 DCA LIMDIF /TO YIELD 1 OUTPUT FILE AND 5 INPUT FILES TAD ALTDF2 DCA BEGDIF /ALL OF WHICH ARE 5-WORD <DEVICE,NAME> ENTRIES DCA I PLKUPS TAD STARJM DCA I PSTARS /AND ALLOW * AS A FILE OR EXTENSION NAME DCA DEFALT /NO DEFAULT EXTENSION IN "SPECIAL" MODE TAD CCLA /STOPS FETCHES IN SPECIAL MODE DCA I PSPKG1 /NO HANDLER FETCHES NECESSARY EITHER SINCE NO LOOKUPS CDCONT, TAD I PRWD /SEE IF BATCH FLAG IS UP RAL SPA CLA /IF YES, GO TO PAGE0 CODE JMP TT /TT ETC. IS ONCE-ONLY CODE JMP I CDRST CDRST, RESTRT+1 /CONSTANTS NECESSARY TO SUPPORT "SPECIAL DECODE" MODE M5200, -5200 ALTLIM, 1-MOFILE-5 ALTDF1, MOFILE+5-MPARAM+5 ALTDF2, 5 PLKUPS, LKUPSW STARJM, STARNM&177+5200 /"JMP STARNM" PSTARS, STARSW CCLA, CLA PSPKG1, SPKLG1 *1314 EOBUFR=. PRMESG, 0 TAD I PRMESG JMS PRWD TAD I PRMESG ISZ PRMESG AND [77 SZA CLA JMP PRMESG+1 JMP I [RESTRT PRWD, 7777 DCA T TAD T RTR RTR RTR JMS PCHAR TAD T JMS PCHAR JMP I PRWD PCHAR, 0 AND [77 SNA JMP I PCHAR /IGNORE NULLS TAD [240 AND [77 TAD [240 JMS TYPE JMP I PCHAR PRNAME, 0 TAD NAME1 / SNA /WOULD LIKE TO FIND ROOM FOR THESE 2 LOCS / JMP I [CDER2 JMS PRWD TAD NAME2 JMS PRWD TAD NAME3 JMS PRWD TAD NAME4 SNA CLA JMP I PRNAME TAD [256 JMS PCHAR TAD NAME4 JMS PRWD JMP I PRNAME TYPE, 0 JMP .+3 TSF JMP .-1 TLS CLA TAD [7000 DCA TYPE+1 TYPRET, JMP I TYPE IFNZRO TYPRET-1377 <BATCHX,ZQWE> *4001 /PROG TO WRITE CD AND ODT ONTO NEW SYSTEM DEVICE /4000=JMS SYSSWP TO SWAP PGS 6600 AND 7600 TAD I (7777 /SET TO PROPER RECORD FOR FIELD 1 STUFF DCA F1STUF JMS I SYSHND 4600 0 MCDREC JMP CERR JMS I SYSHND 5011 0 ODTREC JMP CERR JMS I SYSHND 0110 /READ IN UPPER PG 7600 7600 F1STUF, 0 JMP CERR JMP I .+1 7605 /START HER UP CERR, TAD .+3 DCA 4001 JMP 4000 /RESWAP AND HALT HLT SYSHND, 7607 PAGE *0 CDVERSION HLT /POWER FAIL RESTART PROTECTION NUMTST, 7777 JMS I [GCH CMA TAD NUMFUJ TAD ["8 /TEST INPUT CHARACTER FOR RANGE CLL CMA /0-7 IF NUMFUJ=0 TAD [10 /0-9 IF NUMFUJ=2 TAD NUMFUJ JMP I NUMTST *15 LXR, 0 XR, 0 CLXR, 0 T, CDINIT TT, CDF 0 /***GETS SET TO CDF BATCH HIORD, TAD I DVICE /CHECK TO SEE IF BOS IS REALLY THERE NUMX, TAD OUTSW /IF NOT, SIGNAL ERROR RBFLAG, SNA CLA NAME1, JMP NAMECT /IT'S O.K.....PROBABLY! NAME2, CDF 0 /BAD. SIGNAL ERROR TO MONITOR NAME3, ISZ I NUMTST NAME4, JMP I [7605 /AND RESTART BATCH MONITOR NAMECT, CIF CDF 0 /*****GETS ALTERED****** NMBASE, JMP I .+1 /START UP IN CD AREA OF BATCH DEV1, RESTRT+1 /***GETS ADDRESS OF CD AREA DEV2, 0 PERDSW, 0 NUMFUJ, 0 DVFLAG, 0 DELIM, 0 OUTSW, 0 DEFALT, 0 DVICE, 0 DFLTNM, 0423;1300 /DSK BEGDIF, MIFILE-MOFILE LIMDIF, MIFILE-MPARAM+2 OUTLIM, 1-MIFILE GETHND, 11 TMONIT, 0 TUSRFG, 0 TFPUTX, 0 EXT1, TAD NAME4 DCA NAMECT /REMEMBER TYPED EXTENSION TAD NAMECT SNA TAD DEFALT /SUBSTITUTE DEFAULT IF ZERO EXT2, DCA NAME4 TAD [NAME1 JMP I .+1 LKUPLP PRINT, TYPE FIELD 1 XLIST EJECT INVISIBLE ODT /INVISIBLE ODT FOR OS/8 MONITOR /LOADS INTO FIELD 1 NOW, BUT LOADS & EXECUTES IN FIELD 0 /DEFINITIONS OF MONITOR SYMBOLS - VOLATILE! ODTREC=60 UDNAME=7741 MREAD=7757 MGET=7667 KMREC=7 MTEMP=27 MARG1=7740 JSBITS=7746 LXM=6200 /EXTENDED MEMORY REGISTER LOAD RXM=6230 /EXTENDED MEMORY REGISTER READ RACA=6175 /EXTENDED MEMORY BIT MANIPULATION RACB=6176 /" " RACC=6177 /" " *200 READ, JMS I [OCRLF READ5, DCA WORD DCA WORD+1 TAD [-7 / SET CHARACTER LIMIT DCA TOTE REA, KSF /CHARACTER INPUT JMP .-1 JMS I [CTCTST /CONTROL 'C' TEST JMP CTRC TAD (203 DCA TEMP /STORE CHARACTERS KCC TAD TEMP JMS I [TYPN /ECHO INPUT CHARACTERS TAD TABL1A /SET UP COMMAND TABLE SEARCH DCA 10 CHFLP, TAD I 10 /CHARACTER I.D. SPA JMP SEX /NO COMMAND -NUMERIC INPUT CIA TAD TEMP SZA CLA JMP CHFLP /NOT THIS ONE-TRY NEXT ONE TAD 10 /THIS IS THE COMMAND TAD TABL2A /SET UP JUMP TO COMMAND SUBROUTINE DCA TEMP TAD I TEMP DCA TEMP TAD WORD JMS I [XLODE /BANK AND FIELD ADJUSTMENT DCA WORD JMP FLDTST /SEE IF FIELD SETTING IS LEGAL CTRC, JMS I [DUMP /CONTROL 'C' LXM /DISABLE KT8A JMP I [7605 TABL1=. /COMMAND TABLE 240 /SPACE 212 /LINE FEED 215 /CR 257 /SLASH 302 /B 307 /G 273 /; 303 /C 327 /W 336 /^ 315 /M 301 /A 314 /L 304 /D 337 /<-ARROW 306 /F 377 /RUBOUT 253 /+ 255 /- -270 /USED - SEE "SEX" EXAM, JMS TOTTST /SLASH SUBROUTINE-LOCATION EXAMINATION JMP EX2 TAD WORD /FIELD DCA CAD TAD WORD+1 /ADDRESS DCA CAD+1 EX2, JMS LOAD /GET LOCATION CONTENTS CAD JMS I [PNUM /ECHO CONTENTS DCA SHUT JMP READ5 SEX, TAD TEMP /ADDRESS & FIELD ADJUSTMENT CLL TAD [10 /TEST FOR NUMBER SNL JMP NO DCA TEMP CLA CLL CMA RTL DCA CRL SROT, TAD WORD+1 /FIELD & ADDRESS PROCESSING CLL RAL DCA WORD+1 TAD WORD RAL DCA WORD /FIELD AND BANK STORAGE ISZ CRL JMP SROT TAD WORD+1 TAD TEMP DCA WORD+1 /ADDRESS STORAGE ISZ TOTE /TEST FOR TOO MANY CHARACTERS JMP REA NO, CLA /UNACCEPTABLE INPUT ECHOS ? TAD [277 JMS I [TYPN JMP READ CRL, 0 JMS TOTTST JMP I CRL TAD WORD+1 ISZ SHUT JMS I [STORE CAD CLA JMP I CRL CRL1, JMS CRL /CARRAIGE RETURN JMP READ CRL2, TAD [215 /LINE FEED JMS I [TYPN JMS CRL JMS I [TYPN ISZ CAD+1 TABL1A, TABL1-1 UPAR3, JMS I [TYPD CAD TAD [257 JMS I [TYPN JMP EX2 OPIN, JMS CRL /BKARROW/UNDERLINE JMS LOAD CAD DCA CAD+1 TAD INDFLD JMS I [XLODE DCA CAD UPAR2, JMS I [OCRLF JMP UPAR3 SEMI, JMS CRL /SEMI COLON ISZ CAD+1 TABL2A, TABL2-TABL1 JMP READ5 *400 /NOTE THAT LOCATIONS BURP,BURP+1 GET ALTERED AFTER BRKTST /IS EXECUTED. THEY BECOME: CDF 10; TAD I [MARG1 BURP, JMP I .+1 /RETURN FROM BREAKPOINT -GO REDETERMINE CORE SIZE BRKTST /TO MAKE ILLEGAL FIELD GIVE ? DCA SAC /IOF /COMMENTED OUT FOR HIGH GROUND SUPPORT TAD I [MTRAD /RESTABLISH ADDRESS,FIELD,ETC. DCA TRAD TAD I [MTRAD1 /THESE ARE ALL DCA TRAD+1 TAD I [MKEEP /BREAKPOINT PARAMETERS DCA KEEP TAD I [MPUNN / DCA PUNN CLA IAC AND I (7700 DCA LINK TAD I (7700 CDF 0 JMS I [T174 /BANK AND FIELD MANIPULATION TAD DATFLD DCA INDFLD TAD [KMREC CDF 10 DCA I (MGET+4 CLA CLL CMA RAL AND I [MGET+2 DCA I [MGET+2 /REMOVE LOW-ORDER BIT FROM CONTROL WORD CDF 0 TAD KEEP JMS I [STORE TRAD TAD TRAD+1 IAC DCA GAME+1 /ESTABLISH CONTINUE PARAMETERS TAD TRAD DCA GAME TAD KEEP DCA INST JMS IOTTST SKP JMP JMPLIP TAD TRAD DCA CAD /ESTABLISH EXAM PARAMETERS TAD TRAD+1 DCA CAD+1 JMS I [EFFADR TAD CAD DCA FROG TAD CAD+1 DCA FROG+1 JMPLIP, JMS I [CTCTST JMP I [7605 CLA JMP I (LIP CTCTST, 0 /CONTROL 'C' TEST TAD [200 KSF STA KRS TAD (-203 SZA ISZ CTCTST JMP I CTCTST OCRLF, 0 /CARRAIGE RETURN-LINE FEED TAD [215 JMS I [TYPN TAD [212 JMS I [TYPN CLA CMA DCA SHUT JMP I OCRLF TRAP, JMS TOTTST /ESTABLISHES BREAKPOINT TAD [SHNDLR TAD WORD+1 DCA TRAD+1 /ADDRESS TAD WORD DCA TRAD /FIELD TAD [7000 DCA I [SHNDLR TAD [4 DCA WORD+1 TAD [UDNAME-MPUNN-1 DCA TEMP TAD [BRKCOD-1 /MOVE UP RETURN CODE DCA 10 TAD [UDNAME-1 DCA 11 TAD I 10 CDF 10 DCA I 11 CDF 0 ISZ TEMP JMP .-5 TAD I [JSBITS RTR SZL CLA TAD [5 CDF 10 TAD I [J7600 DCA I [J7600 /CHANGE JMP 7600 TO JMP 7605 IF ODT AREA NOT USED CDF 0 TAD I [JSBITS DCA JSTEMP /SAVE JSBITS BEFORE SETTING BRKPT TAD [CIF 10 JMS I [STORE WORD ISZ WORD+1 TAD [JMP I 6 /STORE RETURN JMP JMS I [STORE WORD ISZ WORD+1 TAD DNAME JMS I [STORE WORD TAD JSTEMP DCA I [JSBITS /RESTORE JSBITS JMP I [READ SUBT, CML ADD, TAD WORD+1 /MODIFY CURRENT LOCATION POINTER SNA IAC /1 IS DEFAULT VALUE SZL /+ OR -? CIA /- TAD CAD+1 DCA CAD+1 JMP I [UPAR2 /AND DISPLAY LOC AND CONTENTS *600 /MONITOR ENTERS ODT HERE LIP, HLT /ERROR. AT INIT, THE CODE AT 600 JMP I .+1 /IS CHANGED TO: ISZ PUNN; TTYTST, INIT /JMP XCONT; TSF JMP TTYOFF LIPTYP, JMS I [TYPD TRAD TAD P250 JMS I [TYPN TAD LINK TAD [260 JMS I [TYPN TAD [273 JMS I [TYPN TAD SAC JMS I [PNUM JMP I [READ JUMP, JMS TOTTST /TEST FOR 'G' WITH NO ADDRESS JMP I PNO TAD WORD DCA GAME TAD WORD+1 DCA GAME+1 TAD WORD JMS I [T174 /FIELD ADJUSTMENT -STORED IN DATFLD TAD [7000 DCA INST DCA SAC DCA LINK JMP CONTX CONTIN, TAD WORD+1 / 'C'-CONTINUE COMMAND CIA SNA CONTX, CMA DCA PUNN DCA I [7607 /IN CASE THERE WAS NO BREAKPOINT JMS LOAD /V3 TRAD /V3 DCA KEEP /V3 JMS I [OCRLF XCONT, TAD [JMP 4 JMS I [STORE TRAD CDF 10 TAD TRAD DCA I [MTRAD TAD TRAD+1 DCA I [MTRAD1 TAD KEEP DCA I [MKEEP TAD PUNN DCA I [MPUNN CDF 0 TAD EXTEMP LXM JMS I [SIM /SIMULATE THE BRKPOINTED INST HERE TAD LINK /SAVE LINK DCA I [MLINK /ESTABLISH RETURN CODE---MXXXX'S TAD SAC /SAVE AC DCA I [MAC TAD GAME /ESTABLISH START CDF TAD [CIF 0 DCA I [MSTCDF TAD DATFLD /ESTABLISH 'B' CDF JMS I [XLODE TAD [CDF 0 DCA I [MCDF TAD GAME+1 /ESTABLISH START ADDRESS DCA I [MSTADR JMS I [DUMP TAD I [JSBITS RTR SZL CLA JMP I [MSWITC JMP I [MREAD /EXECUTION TIME UPAR1, JMS I [CRL /UP-ARROW COMMAND- CLOSE LOCATION JMS I [EFFADR JMP I [UPAR2 /PRINT REFERENCED LOCATION CONTENTS EFFADR, 0 /USE CONTENTS AS MRI JMS LOAD CAD AND [177 /ISOLATE LOCATION REFERENCED DCA TEMP JMS LOAD CAD AND [200 /IS IT 'THIS PAGE'? P250, SNA CLA JMP .+3 TAD CAD+1 AND [7600 TAD TEMP DCA TEMP JMS LOAD CAD AND T400 /IS IT INDIRECT-TEST '400' BIT SNA CLA JMP NOIND TAD TEMP DCA CAD+1 JMS LOAD CAD DCA TEMP TAD CAD+1 AND P7770 /IS IT AUTO-INDEXED? TAD P7770 SZA CLA JMP NOAUTO ISZ TEMP P7770, 7770 /COVERS ISZ.... TAD TEMP JMS I [STORE CAD NOAUTO, TAD INDFLD /NO INDEXING JMS I [XLODE DCA CAD NOIND, TAD TEMP /NOT INDIRECT DCA CAD+1 JMP I EFFADR TTYOFF, /WASTE SOME TIME JMS IOTTST T400, AND I 0 ISZ NOUGHT JMP TTYTST JMP LIPTYP /IF THE TTY FLAG ISN'T UP NOW, IT'LL NEVER GO UP TABL2=. /COMMAND TABLE SUBROUTINE INFO REA /IGNORE BLANKS CRL2 CRL1 EXAM TRAP JUMP SEMI CONTIN WSER UPAR1 MASKX ACX LINKX DATF OPIN INDF RBOUT ADD SUBT IFZERO 1000&. <*1000> PNUM, 0 /PRINTS CONTENTS OF ADDRESS LOCATION DCA PUNN /OR ADDRESS...ITSELF TAD [-4 DCA TEMP PN2, TAD PUNN RTL RAL DCA PUNN TAD PUNN RAL AND [7 TAD [260 JMS I [TYPN ISZ TEMP JMP PN2 TAD [240 JMS I [TYPN JMP I PNUM TYPD, 0 /PRINTS BANK AND FIELD OF ACCESSED LOC. TAD I TYPD DCA TEMP TAD I TEMP JMS I TYPDXX JMS I [TYPN /TYPE BANK TAD NWD JMS I [TYPN /TYPE FIELD TAD I TEMP JMS I [PNUM /PRINT ADDRESS ISZ TYPD JMP I TYPD TYPDXX, TYPDX TYPN, 0 /PRINTS CHARACTERS PREPARED BY TYPD;PNUM,ETC. TLS TSF JMP .-1 CLA JMS I [CTCTST JMP I [CTRC TAD [-14 /^O? SZA CLA JMP I TYPN /NO KCC /YES JMP I [READ WSER, JMS I [OCRLF / 'W'---WORD SEARCH TAD LIMLO DCA CKT+1 /ESTABLISH LOWER LIMIT TAD INDFLD JMS I [XLODE /ADJUST WORD SEARCH BANK AND FIELD DCA CKT WSER1, JMS LOAD CKT AND MASK /SEARCH MASK CIA TAD WORD+1 SZA CLA JMP WSER2 JMS I [TYPD /WORD FOUND GO TYPE IT CKT TAD [257 JMS I [TYPN JMS LOAD CKT JMS I [PNUM JMS I [OCRLF WSER2, TAD CKT+1 /TEST NEXT LOCATION CIA TAD LIMHI /IF IT ISN'T ABOVE THE LIMIT SNA CLA JMP I [READ /OVER LIMIT GO GET NEXT COMMAND ISZ CKT+1 JMP WSER1 /SEARCH NEXT LOCATION ACX, TAD [SAC-LINK / 'A' COMMAND LINKX, TAD [LINK-MASK / 'L' COMMAND MASKX, TAD [MASK-INDFLD / 'M' COMMAND INDF, TAD [INDFLD-DATFLD /'F' COMMAND DATF, TAD [DATFLD / 'D' COMMAND DCA WORD+1 CLA CMA DCA WORD DCA TOTE TAD [257 JMS I [TYPN JMP I [EXAM BRKCOD=. /RETURN CODE --- FROM 'G','C' COMMANDS NOPUNC *UDNAME /STORED IN UPPER FIELD ZERO ENPUNC DCA MARG1 RAL RDF DCA 7700 TAD PODT DCA MGET+4 ISZ MGET+2 /DON'T REVERSE TAPE MOTION TO PICK UP ODT CDF CIF 0 J7600, JMP 7600 PODT, ODTREC P7603, 7603 MTRAD, 0 MTRAD1, 0 MKEEP, 0 MPUNN, 0 NOPUNC *BRKCOD+MPUNN-UDNAME+1 ENPUNC DUMP, 0 /SUBROUTINE TO STORE ADJUSTED CODE TAD STOFLG /LT SNA CLA JMP I DUMP JMS I [SHNDLR 4200 1400 GREC, 0 /SET BY GETADR HLT DCA STOFLG JMP I DUMP RBOUT, TAD [277 /RUBOUT COMMAND JMS I [TYPN TAD [240 JMS I [TYPN JMP I REDE5 IFNZRO .-1200&4000 <*1200> SIM, 0 /SIMULATES BREAKPOINTED INST JMS IOTTST JMS LOAD FROG DCA TEMP JMS I [DUMP DCA I [GREC JMS I [SHNDLR /DUE TO 128K CODE -SIM IS LOADED INTO 1600 0100 SIMXT, 1600 64 HLT JMS I SIMXT JMS I [STORE FROG JMP I SIM XLODE, 0 /TRANSFORMS 'ABCDE' TO 'ACDEB0' FOR CDF DCA NWD TAD TEMP /TEST FOR GO COMMAND CIA /A 'GO' ABOVE 32K REQUIRES SETTING EXTEMP TAD TJUMP /FOR LXM ENABLE SNA CLA TAD (30 AND NWD SNA CLA JMP LT32K TAD [7000 DCA EXTEMP LT32K, TAD NWD /TRANFORMATION IS HERE AND (17 TAD (7770 SPA TAD (17 TAD [7771 TAD NWD CLL RTL JMP I XLODE T174, 0 /TRANSFORMS 174 TO 37 CLL RTR RAR AND (17 TAD [10 AND [7767 /... 0027 ARE THE RELEVANT BITS IN 7767 SZL TAD [10 DCA DATFLD JMP I T174 TYPDX, 0 /PROCESSES BANK & FIELD FOR PRINTING SPA /ADJUSTMENT FOR LINE FEED AFTER CLA /REFERENCE TO M,D,F,ETC. COMMANDS CLL RTR RAR DCA T174 TAD T174 AND [7 TAD [260 DCA NWD TAD T174 AND [10 SZL TAD [4 CLL RTR TAD [260 ISZ TEMP JMP I TYPDX STORE, 0 /SUBROUTINE TO ADJUST CODE DCA LOAD TAD I STORE JMS I [GETADR ISZ STOFLG /INDICATE THAT WE'RE CHANGING THIS RECORD TAD LOAD DCA I ADR CDF 0 ISZ STORE JMP I STORE GETADR, 0 /GETS ADDRESS.... DCA ADR TAD I ADR DCA FADR ISZ ADR TAD I ADR DCA ADR TAD FADR SNA /ONLY NEED TO FOOL WITH ADDRESS IF IT'S IN FIELD 0 JMP CKADR SPA CLA TAD [CDF 0 DCA .+1 FADR, 0 ISZ GETADR JMP I GETADR CKADR, TAD ADR /MANIPULATES FIELD 0 OF ODT'D PROGRAM RAL /ACCESSES IT IN LOCS 1400-1777 SZL SPA CLA / JMP FADR+1 CLA CLL CMA RTL AND I [JSBITS DCA I [JSBITS /MODIFY THE JSW TO INDICATE ODT AREA VIOLATION TAD ADR CLL RTL RTL RAL AND [7 /CALCULATE BLOCK OF STORAGE TAD [MTEMP+4 DCA GIREC TAD I [GREC /MAYBE IT'S ALREADY IN CORE CIA TAD GIREC SNA CLA JMP NOREAD /IT IS!! JMS I [DUMP /MAYBE... ...IT ISN'T JMS I [SHNDLR /LOADS RELEVANT PROGRAM CODE 0200 G1400, 1400 GIREC, 0 HLT TAD GIREC DCA I [GREC NOREAD, TAD ADR /ADJUST THE ADDRESS FOR PROPER ACCESS AND (377 TAD G1400 DCA ADR JMP I GETADR *1400 /INITIALIZATION CODE TO SET UP THE "MREAD" AREA IN FIELD 0 /WITH THE ODT CODE TO START UP A PROGRAM INIT, TAD I 10 DCA I 11 ISZ TEMP JMP .-3 JMS CORE /DETERMINE CORE FIELD SIZE TSF JMP .-1 JMP I [READ BRKTST, JMS CORE /GET CORE SIZE NOW THAT WE WERE TAD KLIP DCA I PLIP /SETUP LOCATIONS AT 600 TAD KLIP+1 DCA I PLIP+1 TAD KLIP+2 DCA I PLIP+2 TAD KCDF10 /JUST BREAKPOINTED IN. THEN RESTORE DCA I BURPO /LOCS AT BURP SO WE NEVER COME BACK TAD KCDF10+1 /HERE AGAIN UNTIL WE'RE SWAPPED DCA I BURP2 JMP I BURPO KCDF10, CDF 10 TAD I [MARG1 /SIMULATE LOCS AT BURP BURPO, BURP BURP2, BURP+1 RSTCOD=. /RESTORES ODT AFTER 'C','G' COMMANDS NOPUNC *MREAD-1 ENPUNC SHNDLR JMS I .-1 1000 0 MTEMP+4 HLT MSWITC, TAD MLINK CLL RAR TAD MAC MCDF, CDF 0 /CDF OF PREVIOUS BRKPOINTED INST JMP MSTCDF MAC, 0 /SAVED AC MLINK, 0 /LIKEWISE LINK MSTCDF, CIF 0 /START CDF JMP I .+1 MSTADR, 0 /START ADDRESS NOPUNC *RSTCOD+MSTADR-MREAD+2 ENPUNC CORE, 0 /DETERMINES AVAILABLE CORE RXM /READ AND STORE EXT MEM INFO DCA EXTEMP TAD [7000 LXM /SETS LXM FOR ODT PURPOSES CLA CDF 0 TAD I M1 /FIELD INFO STORED IN 7777(IF AVAILABLE) AND COR70 CLL RTR RAR SZA /HAS CORE SIZE BEEN SET? JMP USERCR /VERILY COR0, CDF 0 TAD CORSIZ /GET FIELD TO TEST JMS I [XLODE /EXTENDED MEMORY BANK&FIELD ADJUSTMENT TAD COREX DCA .+1 /SET UP CDF TO FIELD COR1, CDF TAD I CORLOC /SAVE CURRENT CONTENTS COR2, NOP DCA COR1 TAD COR2 DCA I CORLOC COR70, 70 /ACTS AS NOP TAD I CORLOC /TRY TO READ BACK 7000 CORX, 7400 TAD CORX TAD CORV SZA CLA JMP COREX /NON-EXISTENT FIELD EXIT TAD COR1 /RESTORES CONTENTS DESTROYED DCA I CORLOC ISZ CORSIZ /TRY NEXT HIGHER FIELD JMP COR0 COREX, CDF 0 /STORE AWAY LAST REAL FIELD IN 'ZERO' TAD CORSIZ TAD M1 USERCR, CIA DCA ZERO JMP I CORE CORLOC, CORX CORV, 1400 M1, -1 CORSIZ, 1 KLIP, ISZ PUNN XCONT&177+5200 TSF PLIP, LIP LIP+1 LIP+2 *1600 SIMX, 0 /SIMULATES BREAKPOINTED INST TAD TEMP DCA 0 JMS IOTTST /IS IT AN IOT? TAD T777 CMA AND INST RAL CML SNL SMA /IS IT A JMS OR A JMP? JMP JMSJMP CML RAR DCA SOPR /STORE INST IN SOPR TAD DATFLD /PREPARE CDF JMS I [XLODE TAD [CDF 0 DCA .+1 HLT TAD LINK /AND LINK CLL RAR TAD SAC /AND AC SOPR, HLT /EXECUTE INSTRUCTION SKP ISZ GAME+1 DCA SAC /RESAVE AC,LINK,DATFLD RAL DCA LINK RDF JMS I [T174 CDF CIF 0 EOSIM, TAD 0 /PREPARE TO RETURN CIA /HAS LOC 0 BEEN CHANGED?BY A TAD...DCA...ISZ... TAD TEMP EOTST, SNA CLA /IF SO,THEN... JMP .+3 TAD 0 /...DO A STORE(ON RETURN TO SIM) JMP I SIMX ISZ SIMX JMP I SIMX JMSJMP, RTL /PROCESS JMP,JMS SZL CLA JMP JMPX TAD TRAD DCA FROG TAD GAME+1 DCA 0 CLA IAC CLL JMPX, TAD FROG+1 DCA GAME+1 CML RAL /PUT -LINK IN AC (0 IF JMP, 1 IF JMS) JMP EOTST T777, 777 *0 ZERO, ODTVERSION /HLT /IN CASE BKPT WITH INTER ON CIF 30 /SYMBIONT CODE JMP .-1 PUNN, 0 *4 /PAGE 0 LITERALS AND CELLS CIF 10 /PROTOTYPE BREAKPOINT JMP I 6 /USED BY PROGRAMS WITH JSBITS(10)=1 DNAME, UDNAME /WHEN ODT IS RELOADED ON A BREAKPOINT *7 EXTEMP, 0 RSTCOD-1 MREAD-2 *12 TOTE, 0 KEEP, 0 INST, 0 SHUT, -1 TRAD, 0;SHNDLR WORD, 0;0 LINK, 0 SAC, 0 CAD, 0;0 CKT, 0;0 GAME, 0;0 FROG, 0;0 TEMP, MREAD-MSTADR-2 JSTEMP, 0 DATFLD, 0 INDFLD, 0 MASK, 7777 LIMLO, 0 LIMHI, 7577 ADR, 0 FLDTST, TAD ZERO /LOC. 0 HAS LAST REAL CORE FIELD TAD NWD /IF USER TRIES TO ADDRESS NON- SMA SZA CLA /EXISTENT CORE, A ? RETURNS JMP I PNO JMP I TEMP /HE'S OK. PNO, NO TOTTST, 0 /TEST FOR COMMAND WITHOUT ADDRESS TAD TOTE TAD [7 SZA CLA ISZ TOTTST JMP I TOTTST STOFLG, 0 NWD, 0 TJUMP, JUMP NOUGHT, 0 LOAD, 0 /SUBROUTINE TO LOAD PROGRAM CODE TAD I LOAD JMS I [GETADR REDE5, READ5 TAD I ADR /RETURNS ADDRESS CONTENTS IN AC CDF 0 ISZ LOAD JMP I LOAD IOTTST, 0 /TEST FOR ISOLATING I/O CLA CLL CML RTR TAD INST SZL CLA ISZ IOTTST JMP I IOTTST $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | $JOB TO MAKE OS/8 ACCEPT LOWERCASE INPUT /REPLACES THE 'LINEFEED ECHO' OPTION, SO /SHOULD ONLY BE USED ON VIDEO TERMINALS. .R FUTIL 11.233/ IF C-1344 1207 11.263/ IF C-2020 1034 11.264/ IF C-5267 5344 11.344/ IF C-4565 1354 11.345/ IF C-3413 7500 11.346/ IF C-1103 1353 11.347/ IF C-4423 1352 11.350/ IF C-1164 3034 11.351/ IF C-3017 5270 11.352/ IF C-1417 0340 11.353/ IF C-7450 7740 11.354/ IF C-5324 7440 COMMENT: END OF KBM PATCH 53.50/ IF C-5366 5207 53.156/ IF C-2024 1025 53.157/ IF C-5362 1220 53.160/ IF C-1102 7500 53.161/ IF C-4466 1367 53.162/ IF C-3024 1370 53.163/ IF C-1025 3025 53.164/ IF C-4466 1025 53.165/ IF C-5755 4466 53.166/ IF C-4312 5755 53.167/ IF C-3415 7740 53.170/ IF C-1101 0340 COMMENT: END OF CD PATCH WRITE END EXIT $END OF JOB TO INSTALL LC PATCH |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 | /12 OS8 MONITOR SYSTEM OS8 VERS. 3F / / / / / / / / / /COPYRIGHT (C) 1970,1971,1972,1973,1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /13-APRIL-1977 RL/EF/HJ/SR /THIS VERSION OF OS/8 IS THE BATCH OPERATING SYSTEM /AS WELL AS THE STANDARD KEYBOARD SYSTEM. THIS SYSTEM /IS EXTERNALLY COMPATIBLE WITH ALL PREVIOUS OS/8-PS/8 /USER PROGRAMS. HOWEVER, INTERNALLY THE SYSTEMS ARE /QUITE DIFFERENT. THE MARCH 1972 OS/8 WILL NOT RUN BATCH. /THIS VERSION IS COMPATIBLE WITH CCL. / SYMBOLIC REFERENCES TO VARIOUS OVERLAYS: MEOVLY=26 /DIRECTORY OVERFLOW OVERLAY FOR "ENTER" MCDREC=51 /COMMAND DECODER MSOVLY=54 /"SAVE W. ARGS" OVERLAY MSOVL2=55 /SECOND PART OF SAVE W. ARGS MERRTN=56 /MONITOR ERROR ROUTINE MRUNRC=57 /"CHAIN" OVERLAY ODTREC=60 /SYSTEM ODT MFREE=70 /BEGINNING OF FILE STORAGE CCB=7400 CSOVLY=400 RSOVL1=1400 RSOVL2=2000 EXOVLY=64 /EXTENDED MEMORY OVERLAY LXM=6200 /EXTENDED MEMORY LOAD INSTRUCTION VERSNO=3 PATCHLEV="T /V3 CHANGES: /1. CCL SUPPORT /2. FIXED KILLER CLOSE BUG /3. ADDED VERSION NUMBER /4. ^U, RO TO BOL, AND LF ALL PRINT '.' AGAIN /5. CALL TO USR WITH CODE OF 0 GIVES ERROR /6. MONITOR ERROR MESSAGES NOW GIVE EXPLANATION /7. ENTER NOW MOVES 7 FILES TO MAKE ROOM INSTEAD OF HALF SEGMENT /8. DIRECTORY VERIFICATION HAS IMPROVED /V3 FIXES TO ABSLDR: /1. ALLOWED PARITY ^C /2. PUT IN SELF-STARTING STUFF /3. FIXED CCB BUG FOR 17600 /FIXES TO FIELD RELEASE /1. ABSLDR CHECKS PAGE 0 LITERALS /2. FIXED BUG RE MONITOR ERROR MESSAGES /3. ADDITIONAL INFO FIX /4. BATCH FIX /FIXES FOR MAINTENANCE RELEASE: /1. CHANGED VERSION NUMBER OF MONITOR TO V3M /2. INCORPORATED PATCH RE LOC 13121 AFTER MONITOR ERROR / [SEQ #1, DSN APRIL 1975] /3. ALLOW CHAIN TO WORK ON FULL FIELD SAVES / [SEQ #2, DSN JUNE 1975] /4. ALLOW ABSLDR/I TO WORK ON FULL FIELD CORE IMAGES / [SEQ #1, DSN OCTOBER 1975] /5. ADDED INTERNAL VERSION NUMBER TO ABSLDR AT LOCATION 2200 / MAINT. RELEASE VERSION # IS V4 /6. SET INITIAL ABSLDR DATE TO 1-NOVEMBER-1975 /V3D AND OS/78 CHANGES: /1. ACCEPT DEC STANDARD DATE FORMAT FOR INPUT (DD-MMM-YY) /2. CHANGED VERSION NUMBER TO V3Q /3. ADDED DATE/78 CHANGES /4. FIXED BUG ABOUT WAITING FOR TTY FLAG & BATCH /5. ADDED STUFF FOR LINKER [USES SOFSET] /6. CHANGED ABSLDR DATE TO 1-JUNE-77 /7. DISALLOW RUN OF PROGRAM WITH BIT 4 OF JSW ON [OS/78 ONLY] /8. ASSIGNED RESIDENT BITS FOR SCOPE AND OS/78 /9. ALLOW @ IN KBM COMMAND /10. COULD RUN INIT.CM ON SYSTEM START-UP /11. CHANGED BAD CORE IMAGE MSG TO CORE IMAGE ERR /12. CHANGED ABSLDR/I SO THAT IT SETS UP JSW AND SA /V3F CHANGES: /1. ADDED MONITOR SUPPORT FOR KT8A / A. R,RUN, GET COMMANDS NOW LOAD 128K / B. SAVE COMMAND CAN SAVE UP TO 128K /2. ADDED HIGROUND SUPPORT /3. ABSLDR ALSO UPDATED TO SUPPORT 128K /11-Nov-2018 LHN - edited OS8 for patch 35.2.1 in DSN April-May 1979 / This converts version "S" to version "T" / - Changed absldr write code to write 5 blocks, was 4 / /KEYBOARD MONITOR FOR OS/8 SYSTEM - UNCOMMENTED AT PRESENT FIELD 0 MTHREE=CLA CLL CMA RTL *200 PRINT, JMP I HNDL /MUST BE AT 200 FOR BATCH JMP .+3 /****GETS CIF CDF N FOR BATCH***** TSF /****GETS JMP I .+1****** JMP .-1 /*GETS BOSPRT***** TLS CLA TAD [7000 DCA PRINT+1 JMP I PRINT GETNAM, 0 /ROUTINE TO ACESS TTY INPUT DCA NM1 /FIRST OFF,INITIALIZE DCA NM2 /SET UP SYMBOLS FOR STORING NAME DCA NM3 DCA NM4 TAD TNM1 DCA PN CLA CMA DCA PRDSW GTNMX, DCA NMCT TAD I LXR /LOCATE FIRST CHARACTER TAD M240 /IS IT A SPACE? SNA /IF SO TEST NEXT CHARACTER JMP .-3 TAD [240 /WE'VE GOT FIRST CHARACTER SKP GTNMLP, TAD I LXR /GET ANOTHER CHARACTER DCA TMP TAD TMP TAD M256 /IS IT A PERIOD? SNA JMP PERIOD /IF SO, PROCESS IT TAD [-2 CLL TAD M12 SNL CLA /IS IT GT ASCII CHARACTER (#9)? JMP NINSRT /IF NO, INSERT IN NAME TAD M301 TAD TMP CLL CML TAD [-32 SNL CLA /IS IT GT ASCII(Z),IF SO JMP EONAME /END OF NAME NINSRT, TAD NMCT /CHECK FOR MAXIMUM CHARS TAD [-6 SMA CLA JMP GTNMLP /IF MAXIMUM SAVE NO MORE TAD NMCT /SET UP POINTER TO STORE CHARACTER CLL RAR TAD PN DCA TEMP1 /HERE IS POINTER TO NM1,NM2,ETC. TAD TMP AND [77 /ISOLATE SIX BITS FOR STORAGE SZL JMP .+4 /NO MORE ROOM RTL RTL RTL TAD I TEMP1 /OR IT IN AND STORE DCA I TEMP1 ISZ NMCT JMP GTNMLP PERIOD, ISZ PRDSW JMP EONAME ISZ PN TAD N4 JMP GTNMX EONAME, TAD NMCT SZA CLA ISZ GETNAM JMP I GETNAM HNDL, 4000 /ROUTINE TO RELOAD NON-SYS HANDLER FOR SAVE ROUTINE JMS I [SHNDLR 0200 /READ TWO PAGES 1000 /INTO 1000 LDBLK, 0 /SET UP BY SAVE ROUTINE JMP KMONER JMP I HNDL PRINTQ, JMS PRMESG TEXT /?/ 0 KMER3, JMS I [PRMESG TEXT /NO/ TNM1, NM1 M240, -240 *325 PRINLP, JMS PRWD ISZ PRMESG SKP IFNZRO .-330 <CCLTRB,ERRR> PRMESG, 0 /ERROR MESSAGE PRINTING ROUTINE CLA TAD I PRMESG SZA JMP PRINLP TSF JMP .-1 JMP I ERRET /RETURN TO MONITOR PRWD, 0 DCA TMP TAD TMP RTR RTR RTR JMS PCHAR TAD TMP JMS PCHAR JMP I PRWD PCHAR, 0 AND [77 SNA JMP I PCHAR TAD [240 AND [77 TAD [240 JMS I PCH JMP I PCHAR M12, -12 M256, -256 M301, -301 N4, 4 *367 SAVE12, JMS I [SHNDLR /RELOAD AND RETURN TO MONITOR FROM SAVE 0610 0 MONTOR JMP KMONER CLA CMA CDF 10 DCA I [7700 JMP I [7605 *400 KMNTRY, JMP I GDEVNO /V3 0 /FREE LOCATION ! PCRLF, JMS I [CRLF IFNZRO .-403 <BTCHER,XXXX> KEYMON, JMS I GLINE TAD [BEGLN-1 /ADDRESS REFERENCED BY INIT DCA LXR JMS I GNAME /V3D JMP I [PRINTQ XXX=[PRINTQ /NEED LITERAL IN SAME PLACE NOP /V3D ALLOW @ IN NAME JMS I [SRCH -123; ASSIGN -2301; SAVE -2225; RUN -705; GET -2200; R -2324; START -1704; ODT -0405; DEAS IFNZRO .-431 <SEECCL,ZZZ> -0401; DATE 0 JMP I .+1 CCLSW, PRQMRK /MODIFIED FOR CCL TO 'GETCCL' IFNZRO CCLSW-435 <SEECCL,ZZ> ASSIGN, TAD [12 JMS GDEVNO TAD [UDNAME-1 DCA TM1 JMS I GNAME JMP ASGN2+1 /NO USER DEV. DO A DEASSIGN TAD NM2 /SEE IF WE HASH IT SNA JMP ASGN2 /DON'T HASH..ONLY 1 OR 2 CHARS TAD NM1 RAL /LINK BECOMES 4000 IF NECESSARY CLA CML RAR TAD NM2 ASGN2, TAD NM1 JMP I [ASDONE R, DCA I [GETSW TAD P6203 JMS I [RESET ISZ RUNSW TAD [SHNDLR DCA HANDAD CLA IAC JMP RGETPG GDEVNO, KMINIT DCA ASNM1-1 JMS I [MINCOR JMS I GNAME JMP I [KMER4 TAD NM1 DCA ASNM1 TAD NM2 DCA ASNM1+1 TAD HNDLAD DCA HANDAD CIF 10 JMS I SYSTEM 1 ASNM1, 0;0 HANDAD, KMINIT JMP I [KMER1 TAD ASNM1+1 JMP I GDEVNO GET, TAD [SKP RUN, DCA I [GETSW TAD P6203 JMS I [RESET DCA RUNSW CLA IAC JMS GDEVNO RGETPG, JMS RSCOMN JMS I [MINCOR TAD SENTER CIF 10 JMS I SYSTEM 2 PGNAME, NM1 MOVBUF /USED AS POINTER TO FIELD 1 SR JMP I [KMER2 JMP I [RLOADR RSCOMN, 0 DCA SENTER TAD HANDAD DCA DEVHND JMS I GNAME JMP I [KMER4 TAD NM4 SNA TAD [2326 DCA NM4 JMP I RSCOMN SAVE, TAD [SAVE12 /CHANGE ERROR RETURN ADDRESS AS WE WILL DESTROY CORE DCA ERRET TAD I [JSBITS JMS I [RESET CIF 10 /MOVE THE LINE BUFFER TO 1600 DURING JMS I PGNAME+1 /A SAVE, AS HANDLER WIPES IT OUT TAD LXR /LET'S MOVE THE REGISTER AROUND TAD [SVLNBF-BEGLN DCA LXR TAD [1001 DCA HNDLAD CLA IAC JMS GDEVNO JMS RSCOMN JMP I [SAVE2 HNDLAD, /REPLACED WITH 1001 BY SAVE WRCTLB, 7001 /WRITE OVERLAY AND CCB JMS I [SHNDLR 4600 6200 MTEMP+6 JMP KMONER JMP I WRCTLB *573 /LOADS SYSTEM ODT OVER THE MONITOR ODT, JMS I PGTOUT JMS I [SHNDLR 1001 0 ODTREC /LOCATION 600 IN ODT IS A HLT (ERROR RETURN) *600 START, DCA TEMP1 DCA TEMP2 TAD I LXR /V3 SZA /V3 JMP I [STRTX /V3 TAD I [JFIELD DCA I [MSTCDF TAD I [JSBITS AND [1000 SZA CLA JMP I [KMER3 TAD I [JSBITS JMS I [RESET /RESET ONLY IF NO START ADR SPECIFIED TAD I [JSTART STCOMN, DCA I [MSTADR TSF JMP .-1 /WAIT FOR PRINTER TO FINISH JMS I PGTOUT TAD I [JSBITS SPA CLA JMP I [MSTCDF TAD [SHNDLR DCA I [MREAD-1 TAD [1000 DCA I [MREAD+1 DCA I [MREAD+2 TAD [MTEMP+4 DCA I [MREAD+3 TAD FUDJMP DCA I [MSWITC JMP I [MREAD MINCOR, 0 CIF 10 JMS I SYSTEM 10 CDF 10 DCA I [OLDT9 /ZERO OUT "DIRECTORY IN CORE" KEY CDF 0 TAD [200 DCA SYSTEM JMP I MINCOR RLOADR, RUN1, TAD I [PGNAME DCA FILE JMS I DEVHND 0101 CCB FILE, 0 /READ IN THE HEADER BLOCK JMP KMONER /ERROR WHILE READING HEADER BLOCK TAD I [CCB JMS I [CCBTST /TEST FOR VALID CORE CONTROL TAD I [CCB+3 /V3D RAL /V3D JMS I KRCHK /V3D CAN'T RUN SYSTEM CUSP UNDER OS78 or OS278 TAD I [CCB+1 DCA I [MSTCDF TAD I [CCB+2 DCA I [MSTADR /MOVE THE STARTING ADDRESS INTO UPPER CORE TAD I [CCB+1 DCA I [JFIELD TAD I [CCB+2 DCA I [JSTART TAD I [CCB+3 /SET UP THE JOB INFORMATION AREA JMS I [RESET /AND CLEAR INFORMATION ABOUT "RUN" HANDLER TAD FUDJMP DCA I [MSWITC /SET MSWITC TO INHIBIT LOADING 7400 GETSW, SKP /SKP FOR GET, NOP FOR RUN JMP RUN2 TAD P6203 DCA I [MSTCDF TAD [7600 DCA I [MSTADR /IF A GET, SET STARTING ADDRESS TO RETURN /TO MONITOR RUN2, TAD I RUNVI //TAD EXTMP LHN patch 35.2.1 CLL CMA RAL /POINT TO LAST DOUBLEWORD IN CCB TAD TCCB4 /CCB4=CCB+4 DCA TM1 /TM1 POINTS TO SEG. ADDRESS TAD I TM1 /STORE ADDRES TO READ POSSIBLE OVERLAY DCA I [MREAD+2 ISZ TM1 /POINT TO SEGMENT CONTROL WORD TAD DEVHND /IF THE HANDLER IS IN 7600, OR TAD [200 /IF THE SEGMENT DOES NOT LOAD OVER CLA RAL /7000, NO OVERLAY IS NEEDED. ALSO IF TAD I TM1 /THE SEGMENT IS IN FIELDS 1-7. AND [77 RUN5A, SZA CLA JMP I [RUN6 //JMP I RUNVI /NO PROBLEMS.. READ STUFF IN //LHN patch 35.2.1 TAD I [MREAD+2 /SEE IF WE OVERLAY 7000 CLL CML RAR TAD I TM1 /ADD IN CONTROL WORD TAD [300 SPA /IF NEGATIVE, 7000 IS NOT OVERLAYED JMP RUN5A TAD [7600 /GETS 0, 100, 200, OR 300 SMA /IF POSITIVE READ 3 PAGE OVERLAY ISZ I [PGNAME+1 /POINT TO NEXT TO LAST RECORD TAD [300 DCA RDCNT TAD I [PGNAME+1 CMA /GET RECORD TO READ OVERLAY FROM TAD FILE DCA R7000 JMS I DEVHND /READ OVERLAY FROM THE FILE INTO PAGES RDCNT, 0 /BEFORE CCB 6200 /THEN WRITE THE WHOLE MESS OUT R7000, 0 JMP KMER1 /NOT AVAILABLE JMS I [WRCTLB /WRITE OUT THE OVERLAY+CCB DCA .-1 /BUT ONLY ONCE!! ISZ RUNSW DCA I [MSWITC /ENABLE READ OF OVERLAY TAD RDCNT /SEE IF THIS SEG IS EXHAUSTED CIA TAD I TM1 SPA SNA ISZ I RUNVI //ISZ EXTMP /ARE WE DONE ALL SEGMENTS? //LHN patch 35.2.1 SKP /NOT YET. LOOP UNTIL DONE JMP I [MSWITC RUN5, DCA I TM1 /SAVE ALTERED CONTROL WORD JMP RUN2 /ASDONE, CDF 10 / DCA I TM1 /THIS COULD BE OPTIMIZED / CDF 0 / JMP I [KEYMON KMER1, JMS I [PRNAME /DEVICE NOT AVAILABLE JMS I [PRMESG TEXT / NOT AVAIL/ TCCB4, 7404 /CCB+4 RUNVI, R7400 //RUN6 LHN patch 35.2.1 *1000 /MUST BE AT 1000 FOR BATCH BEGLN, 0 /LINE BUFFER COULD BECOME "@ "I "N "I "T KMINIT, CDF 10 /INITIALIZATION - DESTROYED BY LINE BUFFER ISZ I [7700 /LOC 17700=7777 IF I/O MONITOR IS KNOWN JMP .+3 /TO BE IN CORE, SO SET UP TAD [200 /THE INITIAL POINTER FOR CALLS TO THE MONITOR DCA SYSTEM /ACCORDINGLY CDF 0 TAD I LXR DCA I X1 ISZ TEMP2 JMP .-3 CDF 10 TAD MVFROM DCA I PDBUF ISZ .-2 ISZ PDBUF ISZ MVCNT JMP .-5 CDF 0 TAD I PDBUF+1 /SEE IF BATCH IS SET RAL /IF YES, GO TO PAGE 0 TO CONTINUE SMA CLA /IF IT ISN'T, CONTINUE NORMALLY JMP INTGO /NORMAL KEYBOARD SYSTEM DCA I RTWTPT /DON'T WAIT ON TTY FLAG IF BATCH IS RUNNING TAD I [JSBITS /IS BOS IN PLACE? AND DCBF SNA CLA JMP BATCH /NO. GO READ IT IN. JMP BCHGO /YES. START IT UP. INTGO, TAD [200 KRS TAD M203 SNA CLA /IS THERE A ^C IN THE READER BUFFER KSF /WITH THE FLAG ON? JMP I ERRET /NO - PRINT CRLF AND PERIOD JMP CLR /V3D /CCLADR, GETCCL /V3D DIDN'T SEEM TO BE USED RTWTPT, RUNTWT DCBF, 400 /START PMSRST, SHNDLR&177+4200 /JMS SHNDLR 0300 7000 MTEMP+6 HLT /CONTAINS SECOND COPY OF OS/78 BIT CDF CIF 0 TCF /END MVCNT, MOVBUF-MVT3-1 PDBUF, MOVBUF MVFROM, NOPUNCH *7626 ENPUNCH MOVBUF, 7777 /USED IN BATCH SETUP TAD I MVT1 /MOVE THE LINE BUFFER FROM 1000 DCA I MVT2 /TO 1655 ISZ MVT1 ISZ MVT2 ISZ MVT3 JMP .-5 CIF CDF 0 JMP I MOVBUF MVT1, BEGLN MVT2, SVLNBF MVT3, -111 *1077 /V3D INIT, CDF 10 /V3D (INITIALIZATION) TAD DCBF DCA I ROT /RESTORE LOC 7677 TO '400' CDF 0 DCA KMINIT /END LINE WITH 0 TLS JMP I CRLF /FAKE OUT KBM AS IF USER TYPED @INIT CLR, KCC JMP I .+1 CTRLC TX212, 212 *1112 ENPUNCH DIGTLP, TAD I LXR STRTX, TAD (-270 CLL TAD [10 DCA TMP1 /V3 SNL JMP EONUM /V3 ISZ DIGFLG JMS ROT JMS ROT JMS ROT TAD TEMP2 TAD TMP1 DCA TEMP2 JMP DIGTLP EONUM, TAD TEMP1 AND [7 CLL RTL RAL TAD KM6203 DCA I [MSTCDF TAD TEMP2 JMP I .+1 STCOMN ROT, 7677 /V3D NEEDED FOR INIT TAD TEMP2 CLL RAL DCA TEMP2 TAD TEMP1 RAL DCA TEMP1 JMP I ROT DEAS, TAD [UDNAME-1 DCA X1 TAD [-17 DCA TM1 CDF 10 DCA I X1 ISZ TM1 JMP .-2 KM6203, CDF CIF 0 JMP I [KEYMON ASDONE, CDF 10 /V3 DCA I TM1 /V3 JMP KM6203 /V3 CRLF, KEYMON+1 /V3D NEEDED FOR INIT TAD [215 DCA NM1 JMS I (PRNT TAD TX212 JMS I PCH JMP I CRLF M203, -203 PAGE /NOTE: XR=AMFLAG ! *1200 /TELETYPE INPUT ROUTINE XGLINE, KEYMON+1 /MUST BE AT 1200 FOR BATCH & CCL TAD [". JMS I PCH DCA RBFLAG TAD [BEGLN-1 CHLM1, DCA LXR DCA AMFLAG /ZERO ALTMODE FLAG CHLOOP, KSF JMP CHLOOP TAD [200 KRS DCA NM1 KCC JMS SRCH -225;CTRLU -215;CARRET -377;RUBOUT -375;ALTMOD /THIS AREA GETS MODIFIED BY SET -376;ALTMOD -233;ALTMOD -212;LFEED -200;CHLOOP -217;CHLOOP /IGNORE ^O -203;CTRLC /MUST BE JUST BEFORE 0 /MUST BE HERE FOR CCL 0 JMS PRNT CINSRT, TAD NM1 DCA I LXR TAD LXR TAD [-BEGLN-110 SPA CLA JMP CHLOOP CARRET, JMS I [CRLF TAD LXR TAD [1-BEGLN SNA CLA JMP XGLINE+1 DCA I LXR DCA I LXR JMP I XGLINE /THIS PAGE GETS MODIFIED BY SET COMMANDS (FOR REAL SCOPE RUBOUTS) /**** BEWARE! *** PRNT, 0 ISZ RBFLAG JMP .+3 TAD ["\ JMS I PCH DCA RBFLAG TAD NM1 JMS I PCH JMP I PRNT CTRLC, CTRLU, TAD ["^ JMS I PCH TAD NM1 TAD [100 CLRLIN, JMS I PCH RBSPCL, JMS I [CRLF JMP XGLINE+1 ALTMOD, TAD ["$ DCA NM1 JMS PRNT ISZ AMFLAG /NOTE ALTMODE JMP CARRET+1 RUBOUT, TAD LXR TAD [1-BEGLN SNA CLA JMP RBSPCL TAD ["\ /MUST BE HERE ISZ RBFLAG JMS I PCH CLA CMA DCA RBFLAG TAD LXR DCA TEMP1 TAD I TEMP1 JMS I PCH LBCKUP, CLA CMA TAD LXR JMP CHLM1 SRCH, 0 TAD I SRCH ISZ SRCH SNA JMP I SRCH TAD NM1 SNA CLA JMP SFND ISZ SRCH JMP SRCH+1 SFND, TAD I SRCH DCA TEMP1 JMP I TEMP1 LFEED, JMS I [CRLF DCA I LXR TAD [". JMS I PCH TAD [BEGLN-1 DCA XR TAD I XR SNA JMP LBCKUP JMS I PCH JMP .-4 PRQMRK, JMS I [PRNAME JMP I [PRINTQ IFNZRO PRQMRK-1357 <SEECCL,ZZXX> ZBLOCK 1 /A FREE LOCATION! IFNZRO .-1362 <FIXCCL,ERRRR> GETCCL, TAD [6003 JMS I [RESET TAD [67 /CCL OVERLAY BLOCK IS BLOCK 67 *** DCA OV JMP DATE2 DATE, TAD TMP SNA CLA JMP I [CCLSW-1 /USED TO BE JMP GETCCL DATE2, JMS I [SHNDLR /READ IN DATE OVERLAY 0201 0400 OV, MSOVL2 JMP KMONER JMP I [600 PAGE *1400 SAVE2, TAD I LXR SNA /ARE THERE ANY ARGS? JMP SAVE2A /NO ... USE CCB JMS I [SHNDLR /READ IN ARG OVERLAY 0201 CSOVLY MSOVLY JMP KMONER JMP I CCBTST /GO TO IT SAVE2A, JMS I [SHNDLR 0201 400 MTEMP+10 JMP KMONER SAVE3, TAD [603 DCA XR DCA LXR /INITIALIZE FOR GT32K I.D. TAD I [600 JMS I [CCBTST JMS I [SHNDLR 0101 400 MSOVL2 JMP KMONER JMP I GETOUT SAV2X, JMS I PGTOUT TAD I [600 /UPDATE THE SEGMENT COUNT BY CLL RAL /FIRST,MAKING SURE 4000 BIT IS SET STL RAR CIA TAD MERTST /SUBTRACT # OF GT32K SEGS THIS ALLOW US TO BYPASS... DCA EXTMP /SAVE COUNT FOR GT32K TAD EXTMP CLL RAL /WE WANT TO BUMP COUNTER TWICE FOR EVERY SEG TAD [603 /ADD POINTER TO INITIAL SEGMENT DCA XR TAD EXTMP CIA DCA EXTMP JMP I RCHK KMER4, JMS I [PRMESG TEXT /TOO FEW ARGS/ CCBTST, SAVE1A&177+400 /EXAMINE COUNT WORD OF CCB FOR VALIDITY /ASCII AND BINARY FILES USUALLY FAIL THIS TEST CLL RAL /INSURES 4000 BIT IS SET--128K INDICATOR STL RAR DCA EXTMP LXM /INITIALIZE EXTENDED MEMORY TAD EXTMP CMA AND [7740 SNA CLA JMP I CCBTST /IT WAS VALID CIERR, TAD [7605 DCA ERRET /RELOAD MONITOR ON THIS ERROR JMS I [PRMESG /IT WASN'T - TELL THE USER TEXT /CORE IMAGE ERR/ GETOUT, SAVE3A&177+400 /SUBROUTINE TO KICK MONITOR OUT IF NECESSARY TAD I [JSBITS RAR CLA TAD SYSTEM SZL SPA CLA /IS THE SYSTEM IN CORE AND SHOULD IT BE? JMP I GETOUT CIF 10 /YES AND NO - KICK IT OUT JMS I SYSTEM 11 /BYE BYE TAD [7700 DCA SYSTEM JMP I GETOUT KMER2, JMS PRNAME JMS I [PRMESG TEXT / NOT FOUND/ PRNAME, 4000 TAD NM1 JMS I [PRWD TAD NM2 JMS I [PRWD TAD NM3 JMS I [PRWD TAD NM4 SNA CLA JMP I PRNAME TAD [256 JMS I [PCHAR TAD NM4 JMS I [PRWD JMP I PRNAME RESET, 0 DCA I [JSBITS /MARK AREAS FOR I/O OPTOMIZATION JMS I [MINCOR CIF 10 JMS I SYSTEM 13 /RESET DEVICE HANDLERS AND OUTPUT FILES JMP I RESET RCHK, XLOD&177+400 AND I XTADR /V3D AND [200 /CAN'T ALLOW BOTH OS78 BIT AND SYSTEM CUSP BIT SZA CLA JMP CIERR /V3D CAN'T FALL INTO KMER3 /BECAUSE HAVE TO RELOAD KBM TO RESET 'PGNAME' TAD EXTMP DCA I RR7400 /SET UP SEGMENT COUNT FOR RUN LOAD JMP I RCHK RR7400, R7400 SVXER, JMS I [PRMESG TEXT /SAVE ERR/ XTADR, OS78 PAGE *1600 RUN6, TAD I TM1 /STORE CONTROL WORD FOR LAST SEG. DCA I [MREAD+1 TAD RUNSW /IS THIS R OR RUN? SNA CLA JMS I [WRCTLB /RUN TAD I RFILE /V3D FOR LINKER DCA I RCTL /V3D SAVE BLOCK NUMBER IN 'SOFSET' TAD I RFILE RUN7, IAC DCA RUNFIL /STORE STARTING BLOCK NUMBER RUN7A, TAD DEVHND DCA I [MREAD-1 TAD DEVHND DCA RUNHND /STORE DEVICE HANDLER ENTRY IN THIS PAGE TAD I ADR1 DCA I ADR2 ISZ ADCNT JMP .-3 JMP I .+1 RUN8&177+7400 ADCNT, RUN8&177+7600 RFILE, FILE CHK32, 0 /PROTECTS MONITOR FROM GREATER THAN 32K FIELD 0 LOAD TAD I RCTL1 AND T76A /ISOLATE CDEB BITS FOR FUTURE USE DCA CDE TAD I RCTL1 AND [7700 /LOAD EVERY FIELD INTO FIELD 1 TAD [10 /WE'LL BUMP IT UP FROM THERE---LATER DCA I RCTL1 JMP I CHK32 T76A, 76 RCTL1, RCTL&177+7400 MOVUP, 0 /SUBROUTINE TO MOVE UP PROGRAM CODE AND T3700 /CALCULATE THE NUMBER OF LOCS RAL TAD T177 CIA DCA COUNT /STORE IT HERE TAD CDE /PREPARE FOR CDF TO PROPER BANK & FIELD CLL RTR SZL SVLNBF, / /NEXT 111 LOCATIONS DESTROYED BY THE LINE BUFFER DURING A SAVE / TAD TX20 CLL RTL TAD T6201 /STORE IT IN EXTEND DCA EXTEND TAD I RADR1 /INITIALIZE THE INDEX REGS TAD SPTST DCA ADR1 TAD ADR1 DCA ADR2 TAD [7000 /SET EXTENDED MEMORY0 LXM BACK, CDF 10 /MAKE THE MOVE TAD I ADR1 EXTEND, 0 DCA I ADR2 ISZ COUNT JMP BACK CDF 0 TAD SPTST DCA I HF2 TAD I RCTL1 JMP I MOVUP T177, 177 T3700, 3700 T6201, 6201 CDE, 0 TX20, 20 HF2, HF3&177+7400 COUNT, 0 RADR1, RADR&177+7400 PAGE *1710 RUN8, ISZ R7400 /IS THIS THE LAST PARAMETER PAIR? JMP RUN9 /NO - KEEP LOADING TAD RUNFIL DCA I RMRD3 /MOVE THE RECORD NUMBER INTO THE FINAL READ TSF RUNTWT, JMP .-1 /WAIT FOR THE TELETYPE TO DIE DOWN (RF08 IS FAST!) JMP I .+1 MREAD /READ THE LAST SEGMENT AND START UP RUN9, TAD I RUNADR DCA RADR /SET UP THE LOADING ADDRESS OF THE CURRENT SEGMENT ISZ RUNADR TAD I RUNADR DCA RCTL /AND THE READ CONTROL WORD TAD RCTL AND TS7 /TEST FOR GREATER THAN 32K SNA DCA HF3 SZA CLA JMS I CH32 JMS I RUNHND RCTL, SOFSET /V3D THESE ARE STORED INTO ONLY AFTER MOVING RADR, OS78 /V3D RUNFIL, 0 JMP RERR /INPUT ERROR READING THE PROGRAM TAD RCTL ISZ HF3 /IF GREATER THAN 32K JMP .+2 JMS I MOVUPT /LOAD HIGHER FIELDS JMS ROTAT /GET THE BLOCK LENGTH OF THIS SEGMENT TAD RUNFIL DCA RUNFIL /UPDATE THE BLOCK NUMBER FROM IT ISZ RUNADR JMP RUN8 /BACK FOR ANOTHER ONE HF3, -1 CH32, CHK32 MOVUPT, MOVUP RERR, CIF 10 JMS I RU7700 TS7, 7 0 /TOTALLY MEANINGLESS RUNADR, CCB+4 R7400, 7400 RMRD3, MREAD+3 RU7700, 7700 RUNHND, 0 IFNZRO ROTAT-SVLNBF-111&4000 <ERROR> *1765 /MUST BE AT TOP OF PAGE ROTAT, 0 CLL RTR RTR RTR AND RU37 SNA TAD RU37 IAC CLL RAR JMP I ROTAT RU37, 37 PAGE /OVERLAY TO KEYBOARD MONITOR FOR "SAVE" WITH ARGUMENTS *2000 /GOES INTO 400 SAVE1A, TAD [1603 DCA X1 DCA TM1 CDF 10 DCA I [OLDT9 S6203, CIF CDF 0 TAD (SGETOUT-RSOVL2 /POINTER TO NEW GETOUT DCA PGTOUT /LIKEWISE "GETOUT" JMS I [SHNDLR 0210 1400 MTEMP+10 /READ IN CONTROL BLOCK JMP KMONER JMS I (LXRBAK-RSOVL1 /RESET LXR TO LOOK AT FIRST CHAR JMS I (LXRBAK-RSOVL1 DCA DASHFG SNUMLP, JMS SGTNUM JMP SDLOOK /NO NUMBER - GET DELIMETER TAD I LXR TAD (-"- SNA CLA JMP SVDASH JMS I (LXRBAK-RSOVL1 TAD DASHFG SNA CLA /WAS THERE A LOWER LIMIT? JMS DASHSB /NO - SET LOWER LIMIT TO UPPER LIMIT TAD TEMP1 CIA CLL CML TAD OLD1 SZA CLA /ARE THE FIELDS THE SAME? JMP KMER5 /NO - ERROR TAD TEMP2 AND [7600 TAD [200 DCA TEMP2 TAD TEMP2 CIA TAD OLD2 SZL CLA /IS UPPER LIMIT > LOWER LIMIT? JMP KMER5 /NO - ERROR CDF 10 TAD OLD1 DCA I X1 TAD OLD2 DCA I X1 TAD TEMP2 DCA I X1 /CREATE A TRIPLET(FIELD, LOW LIMIT, HIGH LIMIT) /IN THE TABLE IN FIELD 1 ISZ TM1 /BUMP ENTRY COUNT SDLOOK, CDF 0 TAD I LXR SNA JMP I (SVEND-RSOVL1 TAD (-", SNA JMP SNUMLP-1 TAD [",-"; SNA JMP SSTADR TAD [";-"= SNA CLA JMP I (SSBITS-RSOVL1 KMER5, JMS I [PRMESG TEXT /BAD ARGS/ SVDASH, TAD DASHFG SZA CLA JMP KMER5 ISZ DASHFG JMS DASHSB JMP SNUMLP SSTADR, JMS SGTNUM JMP KMER5 /NULL STARTING ADR - ERROR TAD TEMP1 /TRANSFORM FOR CDF --"37" TO "174"-128K AND [7757 /ISOLATE '17' BITS TAD (-10 SMA TAD [-17 TAD (10 TAD TEMP1 CLL RTL TAD S6203 CDF 10 DCA I (1601 /STORE AWAY STARTING FIELD TAD TEMP2 DCA I (1602 /AND STARTING ADDRESS JMP SDLOOK DASHSB, 0 TAD TEMP1 AND (37 /ISOLATE FIELD( & BANK) DCA OLD1 TAD TEMP2 AND [7600 DCA OLD2 JMP I DASHSB DASHFG, 0 OLD1, 0 OLD2, 0 SGTNUM, 0 /GET A NUMBER ROUTINE DCA DIGFLG /CLEAR DIGIT COLLECTED FLAG DCA TEMP1 DCA TEMP2 JMS I (STARTX-RSOVL1 JMP .+4 TAD (20 SNA CLA JMP .-4 JMS I (LXRBAK-RSOVL1 /SHOVE INDEX BACK TAD DIGFLG /IS DIGIT PRESENT? SZA CLA ISZ SGTNUM JMP I SGTNUM PAGE *2200 /LOADS INTO 600 SSBITS, JMS I (SGTNUM-RSOVL1 JMP I (KMER5-RSOVL1 TAD TEMP2 CDF 10 DCA I [1603 JMP I (SDLOOK-RSOVL1 SVEND, JMS I [SHNDLR 0101 0400 MSOVL2 /READ IN SECOND PART OF OVERLAY JMP KMONER TAD TM1 SNA JMP I (MOVECB-RSOVL2 CIA CDF 10 DCA I [1600 /NOW SORT THE ENTRIES IN THE SEGMENT TABLE ON /DECREASING FIELD AND INCREASING ADDRESS /WITHIN THE FIELD. TAD [1603 DCA P1 CLA IAC TAD I [1600 SNA JMP SORTED /RIDICULOUS TO SORT ONE ITEM DCA TEMP1 OUTRLP, TAD (3 TAD P1 DCA P2 TAD TEMP1 DCA TEMP2 INERLP, TAD P1 DCA LXR TAD P2 DCA X1 TAD I LXR CIA CLL TAD I X1 SNA CLA JMP TIE /FIELDS ARE EQUAL - SORT ON ADDRESS IN FIELD SZL JMP SWITCH /WRONG ORDER - SWITCH 'EM TIENTY, TAD P2 TAD (3 DCA P2 /INDEX TO NEXT ENTRY SWNTRY, ISZ TEMP2 JMP INERLP TAD P1 TAD (3 DCA P1 /ELEMENT IS IN PLACE - GO TO NEXT POSITION ISZ TEMP1 JMP OUTRLP JMP SORTED /SORT COMPLETE - CHECK FOR CONSISTENCY TIE, TAD I LXR CIA CLL TAD I X1 SZL CLA /TEST FOR ADRESSES IN ASCENDING ORDER JMP TIENTY /YES - DONT HAVE TO SWAP SWITCH, JMS SWSUBR JMS SWSUBR JMS SWSUBR CLA CLL CMA RTL TAD P1 DCA P1 /RESET FIRST POINTER JMP SWNTRY /AND DONT BUMP 2D POINTER, AS WE HAVE JUST BUMPED IT SWSUBR, 0 ISZ P1 ISZ P2 TAD I P1 DCA TM1 TAD I P2 DCA I P1 TAD TM1 DCA I P2 JMP I SWSUBR P1, 0 P2, 0 STARTX, 0 TAD I LXR /ANYTHING LEFT? SNA JMP I STARTX /NO.. TAKE EMPTY RETURN SKP ADGTLP, TAD I LXR TAD (-270 CLL /SEE IF THIS IS A DIGIT TAD [10 SNL JMP AONUM /NO.. GET OUT DCA TMP1 ISZ DIGFLG JMS ROT2 JMS ROT2 JMS ROT2 TAD TEMP2 TAD TMP1 DCA TEMP2 JMP ADGTLP /KEEP LOOKING AONUM, ISZ STARTX JMP I STARTX ROT2, 0 TAD TEMP2 CLL RAL /WE NEED THIS BECAUSE THE HANDLER DCA TEMP2 /WIPED THE FIRST COPY (MAYBE!!!) TAD TEMP1 RAL DCA TEMP1 JMP I ROT2 LXRBAK, 0 CLA CMA TAD LXR DCA LXR JMP I LXRBAK SORTED, TAD I [1600 IAC SNA JMP I (MERGED-RSOVL2 DCA TEMP1 TAD [1603 DCA X1 TAD (1606 DCA LXR JMP I [MRGLP-RSOVL2 PAGE *2400 /LOADS INTO 400 ON TOP OF SAVE1A /NOW CHECK THE SORTED FILE FOR CONSISTENCY /OVERLAPPING SEGMENTS ARE ERRORS, /ABUTTING SEGMENTS ARE TO BE CONDENSED IN /THE INTERESTS OF SPEED MRGLP, TAD I LXR CIA TAD I X1 SZA CLA JMP NOCMPR /DIFFERENT FIELDS - INCOMPARABLE ISZ X1 TAD I X1 CIA CLL TAD I LXR SNA CLA JMP BUTTNG /UPPER LIMIT(2)=LOWER LIMIT(1) - ABUTTING SEGMENTS SZL CLA JMP NXTONE /UPPER LIM(2)<LOWER LIM(1) - NORMAL CASE CDF 0 /UPPER LIM(2) > LOWER LIM(1) - ERROR JMS I [PRMESG TEXT /BAD ARGS/ BUTTNG, CLA CMA TAD X1 DCA X1 TAD I LXR DCA I X1 /SET UPPER LIM(2) = UPPER LIM(1) TAD X1 TAD (-1777 SZA CLA JMP .-5 /AND COMPRESS OUT THE LOWER ENTRY ISZ I [1600 /DECREMENT THE ENTRY COUNT (CAN'T OVERFLOW) JMP I (SORTED-RSOVL1 /START OVER FROM BEGINNING NOCMPR, ISZ X1 ISZ X1 ISZ LXR NXTONE, ISZ LXR ISZ TEMP1 JMP MRGLP /NOW ALL THAT REMAINS IS TO TRANSFORM OUR TRIPLETS /INTO THE FORMAT WHICH THE RUN LOADER EXPECTS; I.E. /DEVICE-HANDLER ARGUMENTS MERGED, CDF 0 /LOAD IN MERGED OVERLAY JMS I [SHNDLR 0100 0600 64 JMP KMONER JMP I (MERGEX MOVECB, TAD (-1777 DCA MERTST JMP MERGED CBMOVE, CDF 10 /FINAL CODE TO MOVE NEW CONTROL BLOCK TAD I LXR /INTO PAGE 600 OF FIELD 0 CDF 0 DCA I X1 ISZ TEMP1 JMP CBMOVE JMP I (SAVE3 /EXIT TO SAVE PROCESSOR SAVE3A, ISZ XR TAD I XR /GET THE I/O CONTROL WORD OF THIS SEGMENT DCA ADR2 /CAUTION AUTO-INDEX TEST FOR GREATER THAN 32K TAD ADR2 AND [7 /ARE THERE ANY BANK BITS? SZA CLA JMP XTAT /NO- PROCEED AS NORMAL TAD SPTST /ONLY WANT TO ISOLATE FIRST FIELD SNA CLA /BELOW 32K JMP XTAT TAD CLENGT /SET UP FIRST FIELD I.D. DCA LXR /CAUTION AUTO-INDEX-SAVE BLOCK OFFSET TAD EXTMP /SAVE NUMBER OF SEGS LEFT DCA MERTST /... NEGATIVE OF # LEFT DCA SPTST /SET I.D. "SET" FLAG XTAT, TAD ADR2 JMS I PROTAT /EXTRACT THE LENGTH FROM IT TAD CLENGT DCA CLENGT /UPDATE THE LENGTH OF THE FILE ISZ EXTMP JMP SAVE3A /LOOP FOR ALL SEGMENTS OF THE FILE TAD CLENGT /USE THIS LENGTH WHEN ENTERING THE FILE CLL RTL RTL TAD SENTER CIF 10 JMS I SYSTEM 3 /ENTER SFILE, NM1 0 /LENGHT UNIMPORTANT JMP I (SVXER /SAVERR CODE REPEATED CIF CDF 10 TAD I [DVHREC CDF 0 DCA I [LDBLK TAD SENTER JMS I SYSTEM 4 /CLOSE NM1 /NAME FOR "CLOSE" CLENGT, 1 /CLOSING LENGTH JMP I (SVXER JMP I (SAV2X XLOD, JMS I [SHNDLR 0201 1200 64 JMP KMONER JMP I (SAVXX /JMP T0 1400 SGETOUT,0 /REPLACES "GETOUT" WHICH WE'VE STORED OVER TAD I [JSBITS RAL /ONLY PERFORMS THOSE FUNCTIONS THAT "SAVE" NEEDS SPA CLA JMP I SGETOUT CIF 10 JMS I SYSTEM 11 DECIMB, JMP I SGETOUT /DECIMB ONLY CALLED BY NEXT PAGE /PART OF NEXT PAGE'S ROUTINE: TAD NM2 /ALL NEW FOR V3D TAD NM4 /ONLY ALLOW 2 CHARS FOR MM SNA CLA ISZ DECIMB TAD NM1 RTR RTR JMP I DECIMB PROTAT, ROTAT *2600 /DATE PROCESSOR - LOADS IN 400, RUNS IN 600 DATEXX, JMS DECIM NUM2, DCA NUM2 TAD NUM2 TAD M40 SMA CLA JMP BADNUM /DAY > 31 JMS I GNAME L30, 30 /NOTHING FOUND WILL GIVE ERROR LATER / DCA NUM1 /NUM1 IS INITIALLY 0 NEWLUP, ISZ MONPTR ISZ NUM1 TAD I MONPTR ISZ MONPTR SMA JMP BADNUM /SYMBOLIC MONTH NOT FOUND TAD NM1 SNA CLA /SKIP IF FIRST 2 LETTERS DON'T MATCH TAD NM2 TAD I MONPTR SZA CLA JMP NEWLUP /SECOND 2 LETTERS DON'T MATCH /*** TEST DELIMETER HERE TAD NUM1 CLL RTL RTL RAL TAD NUM2 RTL RAL DCA NUM2 DCA DDELIM /MAKE END-OF-LINE THE DELIMITER JMS DECIM TAD (-106 /SCALE DOWN TO RANGE 1970-1999 SPA JMP BADNUM /DIDN'T MAKE THE RANGE DCA NUM1 TAD NUM1 AND L30 /ISOLATE EXTENSION DATE BITS CLL RTL RTL DCA TM1 TAD I (BIPCCL AND L7177 /STORE THEM INTO BITS RESERVED FOR THIS PURPOSE TAD TM1 TSLUP, DCA I (BIPCCL TAD NUM1 AND [7 TAD NUM2 /COMBINE WITH MONTH AND DAY CDF 10 DCA I (MDATE /STORE IN SYSTEM DATE CELL TSF /7605 SETS THE DF JMS L7177 /TIME OUT A BIT JMP I [7605 /IN CASE RUNNING UNDER BATCH L7177, 7177 /JMS IS LONGER THAN JMP ISZ DDELIM /DDELIM IS 0 AT END JMS TSLUP /WAIT FOR TELETYPE TO DIE DOWN (RF08) JMP I [7605 /RETURN TO MONITOR DDELIM, -"- /WOULD LIKE TO BRANCH TO CCLSW-1 IF DATE ENDED WITH ALTMODE CNV, 0 AND [77 SNA JMP NUL TAD (-60 SPA JMP BADNUM JMP I CNV NUL, TAD TM1 JMP GODE DECIM, 0 JMS I GNAME M40, -40 /NOTHING THERE (LOGIC WILL CAUSE ERROR LATER) TAD TMP TAD DDELIM /COMPARE AGAINST DESIRED DELIMETER SNA CLA /DASH OR NULL JMS I (DECIMB-2400+400 JMP BADNUM /DELIMETER BAD RTR JMS CNV DCA TM1 TAD TM1 CLL RTL TAD TM1 RAL DCA TEMP2 TAD NM1 JMS CNV TAD TEMP2 GODE, SZA JMP I DECIM BADNUM, CLA /CRAP IN AC TAD [7605 DCA ERRET JMS I [PRMESG TEXT /BAD DATE/ NUM1, 0 /MONTH NUMBER (MUST BE 0 INITIALLY) MONS, -1201 /JAN -1600 -0605 /FEB -0200 -1501 /MAR -2200 -0120 /APR -2200 -1501 /MAY -3100 -1225 /JUN -1600 -1225 /JUL -1400 -0125 /AUG -0700 -2305 /SEP -2000 -1703 /OCT -2400 -1617 /NOV -2600 -0405 /DEC -0300 MONPTR, MONS-2600+600-1 /RELOCATES TO PAGE 600 /MUST BE POSITIVE PAGE *3000 /MONITOR ERROR PROCESSOR - LOADS INTO 11400 DLYLPX, AND I 0 D7600, 7600 TAD MERRNO CLL RAL ISZ I (ZERO-1400 ISZ I (ZERO-1400 /V3C ISZ I (ZERO-1400 JMP DLYLPX /WAIT FOR TELEPRINTER (WITHOUT CDF'S) SNA JMP USRERR CLL RAL RTL RTL TAD (6040 DCA I (MERTYP-1400 MERCMN, TAD (MERRXR-1400 JMS EPRINT TAD I (FPUTX RTR RAR AND (7 TAD (60 JMS MERPCH CLA CLL CMA RAL TAD I (MONITO RAL DCA T1 TAD (-4 DCA T2 MEROLP, TAD T1 RTL RAL DCA T1 TAD T1 AND (7 TAD (60 JMS MERPCH ISZ T2 JMP MEROLP TAD MERRNO CLL RAL SNA JMP NOEXPL /NO EXPLANATION FOR USER ERRORS CLL RAR TAD (EXPLTBL-1401 /PRINT EXPLANATION DCA T1 /GET ADDRESS INTO MESSAGE TABLE TAD (240 JMS MERPCH TAD ("( JMS MERPCH TAD I T1 /GET ADDRESS OF MESSAGE JMS EPRINT TAD (") JMS MERPCH TAD MERRNO NOEXPL, TAD (3773 SPA CLA CLA CMA DCA I (7700 DCA OLDT9 CLA CLL CML RAR DCA MERRNO CDF 0 TAD I (JSBITS AND (6777 TAD (1000 DCA I (JSBITS /SET THE CURRENT JOB UNSTARTABLE CDF CIF 0 JMP I D7600 USRERR, CLA CLL JMS I (FGET TAD (4060 DCA I (UERTYP-1400 TAD (UERRXR-MERRXR JMP MERCMN MERPCH, 0 TLS TSF JMP .-1 CLA JMP I MERPCH ZERO, 0 EPRINT, 0 DCA T2 EPRLUP, TAD I T2 RTR RTR RTR JMS EPR TAD I T2 JMS EPR ISZ T2 JMP EPRLUP EPR, 0 AND (77 SNA JMP I EPRINT TAD (240 AND (77 TAD (240 JMS MERPCH JMP I EPR PAGE *3200 /LOADS INTO 1600 MERRXR, TEXT \MONITOR ERROR 0 AT \ MERTYP=MERRXR+7 UERRXR, TEXT \USER ERROR 0 AT \ UERTYP=UERRXR+5 EXPLTBL,MON1-1400 MON2-1400 MON3-1400 MON4-1400 MON5-1400 MON6-1400 MON7-1400 MON1, TEXT \CLOSE ERROR\ MON2, TEXT \DIRECTORY I/O ERROR\ MON3, TEXT \DEVICE HANDLER NOT IN CORE\ MON4, TEXT \ILLEGAL USR CALL\ MON5, TEXT \I/O ERROR ON SYS:\ MON6, TEXT \DIRECTORY OVERFLOW\ MON7, TEXT \RESERVED\ /EXECUTION TIME LOADER FOR MONITOR "CHAIN" COMMAND *3400 /EXECUTES IN FIELD 0 IN PAGE 7400 MCHNX, DCA MCHREC /STORE STARTING RECORD # TAD MCHREC DCA I (SOFSET /V3D SAVE STARTING ADDRESS CIF 10 JMS I (200 13 /RESET ALL DEVICE ASSIGNMENTS 0 /BUT DON'T CLEAR OUTPUT FILES CIF 10 JMS I (200 11 /KICK MONITOR OUT AND RESTORE CORE IF NECESSARY JMS MCHRD /PARAMETERS PRESET TO READ CONTROL BLOCK INT0 7200 TAD I (7200 /TEST FOR SAVE FILE! CMA /TEST FOR VALID CCB AND (7740 SZA CLA JMP CHERR TAD I (7201 DCA I (MSTCDF /TRANSFER INFORMATION FROM CONTROL BLOCK CLA IAC TAD I (7202 DCA I (MSTADR /TO PAGE 7600 TAD I (7203 TAD (1000 DCA I (JSBITS TAD (7204 DCA MCHT1 TAD MCHFJM DCA I (MSWITC TAD (TCF DCA I (MSTCDF+1 MCHN1, ISZ I (7200 JMP MCHN2 TAD I MCHT1 DCA I (MREAD+2 ISZ MCHT1 TAD I MCHT1 DCA I (MREAD+1 TAD MCHREC DCA I (MREAD+3 TAD (SHNDLR DCA I (MREAD-1 JMP I (MREAD MCHN2, TAD I MCHT1 DCA MCHADR /SET UP COMMAND TO READ NEXT SEGMENT ISZ MCHT1 TAD I MCHT1 DCA MCHCTL JMS MCHRD /READ IT ISZ MCHT1 JMP MCHN1 /LOOP ON NUMBER OF SEGMENTS MCHRD, 0 JMS I (SHNDLR MCHCTL, 0101 /1 RECORD INTO FIELD 0 STARTING FORWARDS MCHADR, 7200 MCHREC, 0 JMP CHERR /CHAIN ERROR TAD MCHCTL MCHBMP, CLL RTR RTR RTR AND (37 SNA /V3C TAD (40 /0 MEANS FULL 4K READ IAC CLL RAR TAD MCHREC DCA MCHREC JMP I MCHRD MCHT1, 0 MCHFJM, MSTCDF&177+5200 /"JMP MSTCDF" CHERR, ISZ CHERR1 JMP CHERR /LET TTY DIE DOWN ISZ CHERR2 JMP CHERR CHTADC, TAD CHARS SNA JMP I (7600 /DONE..BACK TO MONITOR TLS TSF JMP .-1 CLA ISZ CHTADC /NEXT LETTER JMP CHTADC CHERR1, 0 CHERR2, -6 CHARS, "C;"H;"A;"I;"N;" ;"E;"R;"R;215;212;0 PAGE *3600 RELOC 1400 SAVXX, TAD I SXFLE /STORES SFILE DCA SWFILE JMS I PHNDL /LOAD IN NON SYS HANDLER JMS SWRITE /WRITE OUT CCB TAD MERTST /MINUS THE # OF SEGS OF LT32K CODE DCA I [600 TAD LXR /# OF BLOCKS OF GT 32K SEGS SNA /LXR IS ZERO IF ALL SEGS ARE ABOVE 32K JMP OVR32 TAD I SXFLE /LXR--- COMPENSATES FOR CCB DCA SWFILE SAVE4, TAD I XR DCA SADR CLA CLL CML RAR TAD I XR DCA SCTL SAVE5, TAD SADR RAL SZL SPA CLA /DOES THIS SEGMENT START BELOW 2000? JMP SAVE8 /NO - NOTHING TO WORRY ABOUT TAD SCTL AND T76 SZA CLA /FIELD 0? JMP SAVE8 /NO - SAVE AS IS SAVE6, JMS LOADF0 /LOAD THE FIELD 0 SAVE AREA OVER THE I/O MONITOR SAVE7, CLA CMA TAD SCTL CLL RAL TAD SADR RAL SZL SPA CLA /CHECK WHETHER UPPER LIMIT IS ABOVE 2000 JMP SAVE7A /IT IS - MUST MAKE 2 WRITES TAD SCTL /TOTALLY CONTAINED IN 0-1777 TAD [10 /CHANGE FIELD 0 TO FIELD 1 AND CONTINUE JMP SAVE8A SAVE7A, TAD SCTL /WRITE IN 2 PARTS - DCA TM1 TAD SADR CIA /FIRST PART FROM FIELD 1, EVERYTHING BELOW 2000 TAD [2020 CLL CML RAR DCA SCTL JMS SWRITE CLA CLL CML RTR DCA SADR TAD SCTL /SECOND PART FROM FIELD 0, EVERYTHING ABOVE 2000 AND [3700 CIA TAD TM1 SMA /FULL FIELD SAVE IN F0 MAKES THIS + TAD [4000 /COMPENSATE FOR THAT CASE SAVE8A, DCA SCTL SAVE8, JMS SWRITE ISZ I [600 JMP SAVE4 STA /LXR BECOMES ONE BECAUSE OF CCB TAD LXR /NUMBER OF BLOCKS OF GT32K SEGS SNA CLA JMP I [SAVE12 OVR32, TAD I SXFLE /RESET FILE TO INITIAL BLOCK IAC /COMPENSATE FOR CCB DCA SWFILE TAD [603 /RESET CCB POINTER DCA ADR1 TAD [7000 LXM SAVE4B, TAD I ADR1 /IDENTICAL TO SAVE4 CODE DCA SADR CLA CLL CML RAR TAD I ADR1 DCA SCTL DCA ADR2 /SET UP TO MOVE GREATER THAN 32K CODE DOWN DCA X1 /DITTO DCA SXFLE /INTIALIZE FOR COUNTER TAD SCTL /SET UP CDF FOR MOVE AND T76 /ISOLATE BANK AND FIELD CLL RTR /ADJUST MENT SZL TAD T20 CLL RTL TAD FDC0 DCA .+1 XFSP, 0 /START OF MOVE LOOP TAD I ADR2 CDF 70 /PUT THEM IN FIELD SEVEN DCA I X1 /IT SEEMS LIKE A GOOD FIELD ISZ SXFLE JMP .-5 FDC0, CDF 0 /LOOP IS OFFICIALLY OVER TAD SCTL /ADJUST SWRITE CONTROL WORD AND [7700 TAD [70 /TO FIELD SEVEN DCA SCTL JMS SWRITE ISZ EXTMP /IS THAT ALL THE SEGMENTS?? JMP SAVE4B /NO ---CONTINUE JMP I [SAVE12 /TIME TO EXIT LOADF0, 0 /ISZ F0OVLY /HAS THE FIELD 0 OVERLAY BEEN LOADED BEFORE? /JMP I LOADF0 /EVIDENTLY JMS I [SHNDLR 1010 F0OVLY, 0 /WILL BE 0 IF WE EXECUTE THIS CODE, OF COURSE MTEMP+4 JMP KMONER JMP I LOADF0 SWRITE, 0 JMS I DEVHND SCTL, 4101 SADR, 600 SWFILE, 0 JMP KMONER TAD SCTL CLL RTR RTR RTR AND RO37 SNA TAD RO37 IAC CLL RAR TAD SWFILE DCA SWFILE /BUMP RECORD NUMBER JMP I SWRITE RO37, 37 T76, 76 T20, 20 PHNDL, HNDL SXFLE, SFILE&177+400 RELOC PAGE *4000 /SYSTEM GENERATOR - WRITES STUFF OUT USING SHNDLR WRITE=JMS I SYSHND JMS SYSSWP /SWAP SYSTEM DEVICE HANDLER INTO 7600 WRITE; 4200; 7400; 0; JMP BERR /BOOTSTRAP TAD RBFLAG SZA CLA JMP .+6 WRITE; 4210; DCOUNT; 01; JMP BERR /DIRECTORY WRITE; 5001; 0000; 07; JMP BERR /KEYBOARD MONITOR WRITE; 4610; 0000; MONTOR; JMP BERR /USR WRITE; 4111; 3400; MEOVLY; JMP BERR /"ENTER" OVERLAY WRITE; 4701; 2000; MSOVLY; JMP BERR /SAVE OVERLAY, /ERROR ROUTINE AND "CHAIN" TAD RBFLAG SZA CLA JMP .+13 WRITE; 4101; LDRCTL; MFREE; JMP BERR /ABSLDR CONTROL BLOCK WRITE; 5210; 2000;MFREE+1; JMP BERR /ABSLDR JMS I (4200 /OUTPUT THE DEVICE HANDLERS JMP BERR JMS SYSSWP /SWAP BACK PAGE 7600 CLA CMA HLT CLA JMP I .+1 BERR, 7600 JMS SYSSWP HLT JMP .-1 W6600, 6600 W7600, 7600 SYSSWP, 0 TAD W6600 DCA SYTM1 TAD W7600 DCA SYTM2 SWAPLP, TAD I SYTM1 DCA TMSY TAD I SYTM2 DCA I SYTM1 TAD TMSY DCA I SYTM2 ISZ SYTM1 ISZ SYTM2 JMP SWAPLP JMP I SYSSWP /CONTROL BLOCK FOR ABSOLUTE LOADER LDRCTL, 7777 /ONE CONTIGUOUS LOAD 6213 /STARTING ADDRESS IN FIELD 1 2000 /STARTING LOCATION=12000 6003 /DOES NOT LOAD OVER EITHER MONITOR AREA /ALSO DOES NOT USE THESE AREAS AT COMMAND TIME - TRUE /ONLY FOR FIRST CALL TO COMMAND DECODER 2000 /FIRST(AND ONLY) SEGMENT STARTS AT 2000 1210 /IN FIELD 1 AND IS 10 PAGES LONG IFNZRO LDRCTL-4113 <BLDER,XQX> SYTM1, 0 SYTM2, 0 TMSY, 0 SYSHND, 7607 PAGE *4264 RELOC 664 MERGEX, CDF 10 TAD MERTST SZA CLA JMP MOVEC TAD [1603 /LOADS INTO 600--MERGED--CODE DCA LXR TAD [1603 DCA X1 TAD I [1603 AND T1777 TAD T6000 DCA I [1603 /INITIALIZE STATUS BITS TO NO OVERLOADS TAD I [1600 DCA TEMP1 MERGLP, TAD I LXR AND TX37 CLL RTR /TRANSFORM 'ABCDE' TO 'CDEBA0' RTR SZL /TEST FOR 'B' BANK TAD [400 CLL RAR SZL /TEST FOR 'A' BANK TAD [100 CLL RTR RTR RAR DCA TEMP2 TAD I LXR AND [7400 DCA TMP1 TAD TMP1 DCA I X1 /STORE ADDRESS TAD TMP1 CIA TAD I LXR /FORM UPPER LIM - LOWER LIM CLL RAR TAD TEMP2 /ADD IN FIELD DCA I X1 TAD TMP1 CLL RAL SZL SPA CLA /IS THE LOWER LIMIT < 2000? JMP NXTSEG /NO TAD TEMP2 RAR SZA CLA /YES- IS THE FIELD 0 OR 1? JMP NXTSEG /NO SNL IAC CMA CML RTR AND I [1603 /AND OUT THE PROPER OVERLOAD BIT DCA I [1603 NXTSEG, ISZ TEMP1 JMP MERGLP TAD I T1605 /TEST FIRST SEGMENT FOR GREATER THAN 32K AND [7 SNA CLA /IF GREATER THAN 32K SET JMP MOVEC TAD I [1600 /THE 4000 BIT OF THE FIRST WORD OF THE CCB TO ZERO RAL CLL RAR DCA I [1600 /REMOVED LXM PUT IT IN MOVE UP CODE MOVEC, TAD T1577 DCA LXR TAD T577 DCA X1 TAD [7600 DCA TEMP1 DCA MERTST /SET MOVE I.D. TO ZERO JMP I MVECB /RETURN TIME MVECB, CBMOVE&177+400 T1605, 1605 T1777, 1777 T6000, 6000 T1577, 1577 T577, 577 TX37, 37 RELOC PAGE *7400 NOPUNCH *7600 ENPUNCH /UPPER PAGE OF FIELD 1 - CHOCK FULL OF GOODIES /LIKE THOUSANDS OF TABLES AND THE MONITOR CALL LOCATION MOFILE, ZBLOCK 17 /OUTPUT FILE TABLE - 7600-7616 (3 ENTRIES MAX) /5 WORDS PER ENTRY - DEVICE # AND FILE NAME MIFILE, ZBLOCK 24 /INPUT FILE TABLE - 7617-7642 (10 ENTRIES MAX) /2 WORDS PER ENTRY - DEVICE # AND RECORD # /LAST WORD IN TABLE CONTAINS TERMINATION INDICATOR /(0 FOR CR, 1 FOR ALTMODE) AND HIGH ORDER /PART OF NUMERICAL ARGUMENT MPARAM, ZBLOCK 4 /PARAMETER TABLE - 7643-7646 /FIRST 3 WORDS - MASK OF SWITCHES(A-Z,0-9). /FOURTH WORD - CONTAINS THE LOW ORDER BITS OF /THE NUMERICAL ARGUMENT /TABLE OF DEVICE HANDLERS PRESENTLY IN CORE DVHNDL, 7607;7607;0;0;0;0;0 0;0;0;0;0;0;0;0 MDATE, 0 /HOLDS THE CURRENT DATE- 4 BIT MONTH, /5 BIT DAY, 3 BIT YEAR FROM 1970 MGET, CIF 0 JMS SHNDLR /INST FIELD IS 0 1000 /READ 4 RECORDS INTO FIELD 0 0 /LOCATIONS 0-1777 7 /KEYBOARD MONITOR FOLLOWS DIRECTORY PJSBTS, JSBITS /SERVES AS A HALT (WATCH IT!) SCDCIF, CDF CIF 0 JMP I .+1 KMNTRY /V3D GETS CHANGED TO INIT MCALL1, 0 DCA MARG1 /SAVE AC AS IT MAY CONTAIN AN ARGUMENT RDF /GET CALLING FIELD TAD SCDCIF DCA SMCIF CDF 0 TAD I PJSBTS RAR CDF 10 SZL CLA /DOES JOB USE LOCS 10000-11777? JMP MONRD /NO - DONT SAVE THEM CIF 0 JMS SHNDLR 5010 0 MTEMP HLT MONRD, CIF 0 JMS SHNDLR 610 0 MONTOR SCOPE, HLT /BIT 4 IS A 1 IF CONSOLE IS A SCOPE JMP MSTART /START THE MONITOR UP IN PAGE 0 MRETRN, CIF 0 JMS SHNDLR 1010 /READ 10 RECS INTO FIELD 1 0 MTEMP /TEMP REGION ON SYS HLT /SYS HAS PROBLEMS SMCIF, 0 JMP I MCALL1 MARG1, 0 /TABLE OF USER DEVICE NAMES /ALSO USED BY SYSTEM ODT UDNAME, 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 DCB, ZBLOCK 17 /DEVICE CONTROL BLOCK - SET IN "CONFIG" /******************************************************** / MAP OF SYSTEM DEVICE AS OF 2/21/73 /******************************************************** / * 256 WORD RECORDS * /******************************************************** / RECORDS CONTENTS / ------- -------- / 0 MONITOR BOOTSTRAP / 1- 6 SYSTEM DIRECTORIES / 7-12 KEYBOARD MONITOR / 13-15 I/O MONITOR(CALLABLE MONITOR) / 16-25 DEVICE HANDLER RECORDS / 26 MONITOR "ENTER" OVERLAY / 27-50 MONITOR SCRATCH AREA FOR SAVING CORE / 51-53 COMMAND DECODER / 54-55 "SAVE WITH ARGUMENTS" AND "DATE" OVERLAYS / 56 MONITOR ERROR ROUTINE / 57 "CHAIN" PROCESSOR / 60-63 SYSTEM ODT / 64 RESERVED FOR EXPANSION /65 CCL REMINISCENSES / 66 USED BY TWO-PAGE SYS HANDLER / 67 USED BY CCL (CCL OVERLAY) / 70-END FILE STORAGE SHNDLR=7607 /ENTRY POINT TO SYSTEMS HANDLER *6600 NOPUNCH *7600 ENPUNCH /SYSTEM HANDLER AND FIELD 0 UPPER PAGE /INCLUDES BOOTSTRAP AND PART OF MONITOR CALL ROUTINE DVHORG=16 /DEVICE HANDLER RECORDS MTEMP=27 MONTOR=13 JMS SHNDLR 5000 /SAVE MONITOR CORE - WRITE 5 RECORDS FROM FIELD 0 0 /(LOCATIONS 0-1777) MTEMP+4 7602 /TROUBLE WITH SYSTEM DEVICE CDF CIF 10 JMP MGET /NOW GO READ IN THE KEYBOARD MONITOR *6744 /INFORMATION ABOUT CURRENT JOB NOPUNCH *7744 ENPUNCH JFIELD, 6203 /A CDF CIF N INSTRUCTION TO START THE JOB JSTART, 7600 /THE STARTING ADDRESS JSBITS, 1000 /VARIOUS STATUS BITS - USED FOR OPTIMIZATION /BIT 4000 - JOB DID NOT LOAD INTO 00000-01777 /BIT 2000 - JOB DID NOT LOAD INTO 10000-11777 /BIT 1000 - JOB IS NOT RESTARTABLE /BIT 400 - DOESN'T DESTROY BATCH MONITOR /BIT 2 - JOB DOES NOT USE LOCS 00000-01777 /BIT 1 - JOB DOES NOT USE LOCS 10000-11777 SOFSET, 0 /FOR FUTURE(AND MAYBE PRESENT) USE /DATA BREAK FILLERS FOR SYSTEM BOOTSTRAP 7750 7751 7752 7753 7754 7755 /MONITOR PATCH TO HELP BLEEP LOADER 0 /ADDRESS OF HANDLER FOR DEVICE USED MREAD, HLT 0 0 0 HLT MSWITC, JMP .+6 /ZEROED IF PG 7000 (HANDLER) MUST BE READ OVER JMS SHNDLR 0300 7000 /THIS AREA MODIFIED BY ODT MTEMP+6 OS78, HLT /BIT 4 IS A 1 IF OS/78 IS RUNNING MSTCDF, CDF CIF 0 TCF /EXIT WITH A CLEAR CONSCIENCE(ALSO A CLEAR FLAG) JMP I .+1 MSTADR, 0 SBLOCK, 0 BIPCCL, 0 /MORE STATUS BITS. /BIT 1: 1=> BATCH IS IN PROGRESS /BITS 6-8: FIELD OF BATCH MONITOR /HIGHEST CORE FIELD USED BY OS/8 /OR 0 TO MEAN OS/8 MAY USE ALL OF CORE *0 VERSNO /OS/8 VERSION NUMBER CIF 30 JMP .-1 /HIGROUND SUPPORT KMONER, CLA TAD [7605 DCA ERRET JMS I [PRMESG TEXT /?ERROR/ /THE FOLLOWING REGISTERS ARE SET TO VITAL INITIAL VALUES. TO ALTER /THESE VALUES IS TO BRING DISASTER DOWN UPON YOUR HEAD! LXR, PMSRST-1 X1, MSWITC /THESE TWO ARE USED AT INITIALIZATION. ADR1, RUN8-1 ADR2, RUN8&177+7377 /USED DURING R, AND RUN COMMANDS XR, AMFLAG, 0 /1 MEANS SAW ALTMODE /MUST NOT MOVE FOR CCL AND BATCH *20 RBFLAG, 0 /MUST BE AT LOCATION 20 TEMP2, -7 SYSTEM, 7700 PCH, PRINT GLINE, XGLINE GNAME, GETNAM DEVHND, 7607 FUDJMP, MSTCDF&177+5200 P6203, 6203 TMP, PATCHLEV /MONITOR PATCH LEVEL MUST BE AT LOC 31 FOR CCL PGTOUT, GETOUT ERRET, PCRLF /MUST BE AT 33 FOR CCL /THE FOLLOWING LOCS. ARE TEMPORARIES. HOWEVER, THERE IS NOW /VITAL ONCE ONLY CODE TO HELP THE BATCH PROCESSOR. THIS CODE IS /READ IN EVERY TIME THE KEYBOARD MONITOR IS RE-READ. NM1, 203 /THIS MUST BE A 203! BATCH, /ENTRY TO READ NEW BATCH MONITOR NM2, JMS I [7607 /THE BATCH INITIALIZER ALTERS SOME VALUES NM3, 610 /IN THIS LIST...THIS ONE********** NM4, 0 /THIS ONE*****GETS ADDRESS OF BOS. TEMP1, 13 /******GETS RECORD OF BOS***** TM1, SKP CLA /ERROR. DON'T RUN BATCH TMP1, JMP BCHGO NMCT, DCA I KM1 /CLEAR BATCH FLAG. PN, JMP KMONER PRDSW, KM1, 7777 BCHGO, RUNSW, CIF CDF 0 DIGFLG, JMP I .+1 SENTER, KMINIT /GETS ENTRY POINT (BOS) KRCHK, RCHK EXTMP, 0 MERTST, 0 SPTST, -1 /-1 USED IN RUN CODE FIELD 1 /FIELD 1 /OS/8 MONITOR - MONITOR ROUTINES /THIS MONITOR IS CALLED INTO CORE BY A JMS 7700 IN FIELD 1 /IT REPLACES CORE FROM 200-1777 /AND INTERPRETS THE WORDS AFTER THE JMS AS A MONITOR FUNCTION /MONITOR FUNCTIONS ARE ASSIGN,LOOKUP,ENTER,ETC. MAXCMD=13 *200 MONITO, 0 /MONITOR SUBROUTINE DCA MACARG /STORE AC ARG DCA USERFG /SET FLAG TO INDICATE WE WERE CALLED DIRECTLY RDF /GET CALLING FIELD TAD [CDF CIF 0 DCA FGETX MRENTR, TAD FGETX DCA FPUTX /FOR LOADING AND STORING CALLING SEQUENCE JMS FGET /GET FIRST ARGUMENT[AND SET DATA FIELD 1) ISZ MONITO CLL TAD [-MAXCMD-1 SZL JMP MERROR TAD JMPMAX DCA .+1 /BRANCH TO APPROPRIATE ROUTINE WITH LINK ON FGET, 0 /MUST PRESERVE LINK TAD MONITO JMS FGETW JMP I FGET /MONITOR COMMAND DISPATCH TABLE MUST BE JAMMED BEFORE 'FPUT' MERROR MASSIGN MLOOKUP MENTER MCLOSE MCD MCHAIN MERR MESCAP MESCPR MASGN MRSETP, MRESET FPUT, 0 /MUST FOLLOW LAST ADDRESS IN JUMP TABLE FPUTX, 0 DCA I MONITO CDF CIF 10 JMPMAX, JMP I FPUT MEOERR, ISZ MERRNO MIOERR, ISZ MERRNO MERROR, ISZ MERRNO ISZ MERRNO ISZ MERRNO ISZ MERRNO MERR, CLA CIF 0 JMS I [SHNDLR 0210 1400 MERRTN HLT JMP I .-3 MCD, CLA CLL CML RAR JMS CDSWAP /SWAP OUT CORE IF NECESSARY JMS FGET DCA T1 CIF 0 JMS I [SHNDLR 0601 0 MCDREC JMP MIOERR TAD FPUTX CDF CIF 0 JMS I [200 DCA FPUTX TAD FPUTX DCA FGETX JMS CDSWAP /RESTORE THE SWAPPED CORE IF NECESSARY STL /LINK MUST BE ON AT MRESET JMP I MRSETP /AFTER CD, RESET DEVICE AREA MCHAIN, JMS FGET DCA T1 /BUFFER THE ARGUMENT CIF 0 JMS I [SHNDLR 0101 7400 MRUNRC JMP MIOERR TAD T1 /LOAD THE BUFFERED ARGUMENT CDF CIF 0 JMP I .-5 MLNOTF, CLA ISZ MONITO MNEXT, TAD USERFG MESCAP, CLL RAR TAD MONITO DCA I [7700 TAD FPUTX DCA I [SMCIF CLA IAC CML CDF 0 AND I [JSBITS CDF 10 RAR SZL SPA CLA /RESTORE CORE IF USERFG=1 AND JSW[11]=0 JMP I [SMCIF JMP I [MRETRN MESCPR, CLL CML JMP MESCAP+1 FGETW, 0 DCA FPUT FGETX, HLT TAD I FPUT CDF CIF 10 JMP I FGETW CDSWAP, 0 TAD ME1000 /FORM READ OR WRITE OPERATION DCA MCDCTL CDF 0 TAD I [JSBITS CDF 10 RTR SZL CLA /IS IT NECESSARY TO SAVE CORE? JMP I CDSWAP /NO CIF 0 JMS I [SHNDLR MCDCTL, 0 0 MTEMP+4 JMP MIOERR JMP I CDSWAP EOVFLO, CIF 0 JMS I [SHNDLR 0111 ME1000, 1000 /ENTER OVERLAY LOADS OVER ENTER (NATCH) MEOVLY JMP MIOERR JMP I ME1000 *400 /ASSIGN PROCESSOR - TRANSLATE DEVICE NAME INTO DEVICE NUMBER /(IF NECESSARY),GET DEVICE HANDLER INTO CORE(IF NECESSARY) /AND ADJUST TABLES(IF NECESSARY). IS THIS REALLY NECESSARY? MASGN, CLA IAC MASSIGN, DCA ASFLAG TAD MACARG SZA /IS DEVICE NUMERIC OR SYMBOLIC? JMP DFOUND /NUMERIC JMS I [FGET /GET HIGH ORDER 2 CHARS OF NAME ISZ I [MONITO SNA JMP I [MRTRN+1 /FIRST WORD OF NAME MUST BE NON-ZERO DCA NAME JMS I [FGET SNA /IS NAME >2 CHARACTERS LONG? JMP NOHASH /NO - DON'T HASH TAD NAME RAL CLL CML RAR /FORCE SIGN BIT OF HASH NAME ON DCA NAME NOHASH, TAD [UDNAME-1 /SEARCH USER NAME TABLE FIRST DSRCH, DCA XR TAD [-17 DCA T2 DSRCLP, TAD I XR CIA TAD NAME SNA CLA JMP DSFND ISZ T2 JMP DSRCLP TAD XR SMA CLA /WHICH TABLE DID WE JUST SEARCH? JMP I [MRTRN+1 /SYSTEM TABLE - ERROR TAD [SDNAME-1 JMP DSRCH /GO SEARCH SYSTEM TABLE DSFND, TAD T2 TAD [20 JMS I [FPUT /PUT NUMBER INTO CALLING SEQUENCE JMS I [FGET /GET IT BACK IN AC, BUMPING POINTER ISZ I [MONITO DFOUND, JMS I [MCKDEV /DETERMINE ITS VALIDITY (NON-ZERONESS) /AND FORM POINTERS SNA /IS THE DEVICE HANDLER IN CORE? TAD I T2 SNA /DOES A HANDLER EXIST FOR THE DEVICE? JMP I [MLNOTF /NO - SAME AS THE DEVICE NOT EXISTING CMA RAL /GET THE COMPLEMENT OF THE HIGH ORDER BIT INTO THE LINK SNL CLA /TWO PAGE HANDLER?(IF HANDLER IS IN CORE, /THIS TEST IS RANDOM BUT WE DON'T CARE) TAD [100 /YES - FORCE A TWO-PAGE READ TAD [100 DCA DVHCTL TAD T1 DCA T7 /SAVE T1 AS WE WILL DESTROY IT LATER TAD I T1 TAD ASFLAG SZA CLA /DOES HE ACTUALLY WANT US TO LOAD THE SILLY THING? JMP AFINIS /NO - HE MUST HAVE TASTE. JMS I [FGET /FETCH PAGE IN WHICH HANDLER IS TO BE LOADED RAR /GET THE LINK, WHICH HAS BEEN UNTOUCHED SINCE WE /PUT THE "TWO PAGE HANDLER" FLAG INTO IT SNL SMA /IF THIS HANDLER IS TWO-PAGE, IS HE ALLOWING IT TO BE? JMP I [MLNOTF /NO - GIVE AN ERROR RETURN RAL /YES - ROTATE BACK AND [7600 /MAKE IT LEGAL DCA DVHLOC JMS GETREC DCA DVHREC CIF 0 JMS I [SHNDLR DVHCTL, 0 /READ ONE OR TWO PAGES INTO FIELD 0 DVHLOC, 0 DVHREC, 0 JMP I [MIOERR /SYSTEM DEVICE ERROR /NOW GO THROUGH THE TABLE OF AVAILABE HANDLERS TAD [-17 /AND MARK OFF THOSE WHICH ARE NOW IN CORE DCA T4 DVHCLP, TAD T4 JMS I [MCKDEV /LOW ORDER BITS OF T4 GO THROUGH 1-17 CMA TAD DVHLOC CLL CML RAR TAD DVHCTL /IF A HANDLER ENTRY POINT IS WITHIN 200 WORDS OF THE SMA CLA /LOADING ADDRESS (400 FOR A TWO-PAGE HANDLER) DCA I T1 /MARK IT AS WIPED JMS GETREC CIA TAD DVHREC SZA CLA JMP NOTINC TAD I T2 AND [177 TAD DVHLOC DCA I T1 NOTINC, ISZ T4 JMP DVHCLP AFINIS, TAD I T7 JMP I [MRTRN /STORE HANDLER ADDRESS AND EXIT GETREC, 0 TAD I T2 /GET RECORD OF DEVICE HANDLER CLL RTL RTL RTL /EXTRACT THE RECORD NUMBER AND [17 TAD [DVHORG-1 /ADD THE BASE OF DEVICE HANDLER STORAGE JMP I GETREC MCKDEV, 0 /MUST PRESERVE LINK AND [17 SNA JMP I [MERROR /DEVICE 0 IS ILLEGAL DCA NAME TAD NAME TAD [SDVHND-1 /FORM POINTER INTO HANDLER IMAGE TABLE DCA T2 TAD NAME TAD [DVHNDL-1 DCA T1 TAD NAME TAD [DCB-1 DCA T8 /FORM POINTER TO DCB ENTRY FOR DEVICE TAD I T1 JMP I MCKDEV IFNZRO .-564 <REASSEMBLE CONFIG> SDNAME, ZBLOCK 17 /SYSTEM DNAME TABLE - SET UP BY "CONFIG" IFZERO .+200&1000 <*600> /LOOKUP PROCESSOR - GETS THE STARTING BLOCK OF AN INPUT FILE /ON A SPECIFIED DEVICE.SKIPS IF FILE WAS FOUND OR DEVICE /IS NOT FILE ORIENTED MLOOKUP,CLL /SET RDCAT MODE TO INPUT JMS MRDCAT JMP ERETRN /NON-FILE STRUCTURED DEVICE JMS MDSRCH /SEARCH THE DIRECTORY FOR THE FILE JMP MRTRN+1 /NOT FOUND - TAKE ERROR RETURN LRETRN, TAD T5 CIA TAD I [DORG /CONVERT T5 TO A RECORD NUMBER ERETRN, JMS I [FPUT ISZ I [MONITO TAD T6 CIA /STORE FILE LENGTH AS A NEGATIVE NUMBER MRTRN, JMS I [FPUT /THIS CODE IS JUMPED TO BY SEVERAL ROUTINES MRTRN2, ISZ I [MONITO JMP I [MLNOTF MRDCAT, 0 SZA JMP MRDREN /NOT THE FIRST SEGMENT - DON'T SET UP POINTERS DCA T5 /ZERO STARTING BLOCK NUMBER DCA T6 /ZERO FILE LENGTH TAD MACARG /GET DEVICE NUMBER FROM AC JMS I [MCKDEV /CHECK LEGALITY AND FORM POINTERS SNA JMP I [MERROR+1 /DEVICE HANDLER IS NOT IN CORE - ERROR DCA T9 /ADDRESS OF DEVICE HANDLER JMS I [FGET DCA T4 /STORE THE POINTER TO THE FILE NAME IN T4 SNL CML RAR RTR /FORM A MASK OF 2000 OR 1000 DEPENDING ON LINK AND I T8 SZA CLA /TEST FOR READ-ONLY(L=1) OR WRITE-ONLY(L=0) JMP MRTRN+1 /FAILED THE TEST - ERROR RETURN TAD I T8 SMA CLA JMP I MRDCAT /DEVICE IS NOT FILE-ORIENTED ISZ MRDCAT CLA IAC MRDREN, DCA MCATRC /STORE SEGMENT NUMBER TAD T9 /USE LOW ORDER BITS AND [177 /OF DEVICE HANDLER ENTRY POINT CLL RTL /AND THE REQUESTED SEGMENT NUMBER RAL /TO FORM A "UNIQUE" KEY TAD MCATRC /FOR THIS SEGMENT OF THIS DIRECTORY /(THE UNIQUENESS DEPENDS ON EACH HANDLER HAVING A DIFFERENT /STARTING OFFSET IN ITS PAGE) CIA TAD OLDT9 /COMPARE KEY AGAINST KEY OF CURRENT SEGMENT SNA /ARE THEY THE SAME? JMP INLRDY /YES - DON'T READ SEGMENT, ITS IN CORE CIA TAD OLDT9 DCA OLDT9 /STORE THE KEY OF THE NEW IN-CORE SEGMENT CLA CLL CML RAR /CHANGE WRITE TO READ JMS MWRCAT INLRDY, TAD I [DCOUNT CML CMA RAL SZL SPA JMP JMPME2 CMA CML RAR /NEW V3 DIRECTORY VERIFYER DCA NFILES /FIRST WORD IN CATALOG = -# OF FILES IN CATALOG TAD [DPROPR-1 DCA XR /SET XR TO POINT TO FIRST FILE ENTRY JMP I MRDCAT /RETURN TO BUMPED ADDRESS MDSRCH, 0 FSRCLP, TAD I XR SNA CLA /EMPTY SPACES HAVE A ONE WORD ZERO DIRECTORY ENTRY JMP SKPMTF /SO SKIP THE 4 WORD COMPARE ON THEM CLA CMA TAD XR DCA XR TAD [-4 DCA T6 TAD T4 DCA T7 SRCWDL, TAD T7 JMS I [FGETW CIA TAD I XR SZA CLA /COMPARE ENTRY AGAINST ARGUMENT(8 CHARACTERS) JMP NXTFIL ISZ T7 ISZ T6 JMP SRCWDL JMS BUMPXR /SKIP GARBAGE WORDS TAD I XR SNA JMP SKPMTF+1 /UNCLOSED OUTPUT FILES DONT COUNT CIA DCA T6 /STORE FILE LENGTH ISZ MDSRCH JMP I MDSRCH NXTFIL, TAD T6 IAC JMS BUMPXR /SKIP REST OF NAME AND GARBAGE WORDS SKPMTF, TAD I XR /GET LENGTH OF THIS ENTRY TAD T5 DCA T5 /ADD TO BLOCK STARTING ADDRESS ISZ NFILES JMP FSRCLP DCA T5 /RE-INITIALIZE BLOCK NUMBER FOR NEXT SEGMENT TAD I [DLINK /DIRECTORY EXHAUSTED - ANY MORE? SZA JMP MRDREN JMP I MDSRCH BUMPXR, 0 /ROUTINE TO SKIP (DWASTE+AC) WORDS TAD I [DWASTE CIA /DWASTE IS NEGATIVE AND SO IS AC TAD XR DCA XR JMP I BUMPXR MWRCAT, 0 TAD [4210 DCA CATCTL CIF 0 JMS I T9 CATCTL, 4210 /WRITE 2 RECORDS FROM FIELD 1 1400 MCATRC, 1 JMPME2, JMP I [MERROR+2 /CANNOT REWRITE CATALOG JMP I MWRCAT IFNZRO .-772 <REASSEMBLE CONFIG> /USED TO BE 766 SDVHND, ZBLOCK 17 /DEVICE HANDLER INFORMATION TABLE - SET BY CONFIG IFZERO 1000&. <*1000> /ENTER PROCESSOR FOR MONITOR /FIND A HOLE IN THE DIRECTORY LARGE ENOUGH TO ACCOMODATE THE FILE /AND STICK IT IN. MAKE A NOTE THAT WE DID SO FOR THE /"CLOSE" PROCESSOR. MENTER, DCA EPASS /SET UP FOR PASS 1 JMS I [MRDCAT /READ CATALOG AND SET UP NFILES AND XR JMP I [ERETRN /NON-FILE-STRUCTURED DEVICE JMS I [CONSOL DCA T2 /INTIIALIZE STARTING BLOCK NUMBER COUNTER TAD [DPROPR-1 DCA XR /RESTORE XR (CONSOLIDATOR DESTROYED IT) TAD MACARG CLL RTR RTR AND [377 /GET REQUESTED LENGTH FROM AC BITS 0-7 CIA DCA T3 /T3=REQUESTED LENGTH. IF T3=0, MEANS RETURN /LARGEST EMPTY SPACE ON TAPE. IF T3<>0, MEANS RETURN /SMALLEST BLOCK OF LENGTH =>T3. TAD I T8 /GET FCB ENTRY AND [7 SZA CLA /ANY ACTIVE TENTATIVE FILES ON THIS DEVICE? JMP I [MRTRN+1 /YES - TAKE ERROR RETURN MELOOP, TAD I XR SNA CLA JMP MEMPTY /EMPTY SPACE - LOOK AT LENGTH MTHREE /OCCUPIED - IGNORE JMS I [BUMPXR TAD I XR MELEND, TAD T2 DCA T2 /UPDATE T2 TO STARTING BLOCK # OF NEXT ENTRY ISZ NFILES JMP MELOOP /GO TO NEXT ENTRY /DIRECTORY BLOCK EXHAUSTED TAD EPASS SZA CLA /WHAT PASS ARE WE IN? JMP EFINUP /SECOND PASS - THIS IS FOR KEEPS TAD I [DLINK /FIRST PASS SZA /ANY MORE SEGMENTS? JMP I [MRDREN /YES - CONTINUE /DONE - SEE IF OUR BEST IS GOOD ENOUGH. TAD T4 JMS I [FGETW SZA CLA /CHECK THAT FIRST WORD OF NAME IS NON-ZERO TAD T6 SNA CLA /AND THAT WE FOUND WHAT WE WANTED JMP I [MRTRN2 /OTHERWISE GIVE ERROR RETURN TAD ASFLAG /GET NUMBER OF BEST SEGMENT ISZ EPASS /AND RESTART THE ALGORITHM IN PASS 2 JMP I [MRDREN /(TAKES LESS SPACE THAN SAVING XR AND NAME) /EVERYTHING IS SET UP - PERFORM THE ACTUAL ENTRY OPERATION EFINUP, TAD XR DCA T1 TAD [-4 JMS I [BUMPXR TAD I [DWASTE CIA TAD XR /CATALOG MUST HAVE ROOM FOR ONE MORE FILE TAD [-1772 /AFTER THIS FILE IS ENTERED SMA CLA /WILL NEW ADDITION OVERFLOW CATALOG? JMP I [EOVFLO /YUP - CALL OVERLAY TO EXTEND DIRECTORY MELP2, TAD I T1 /MOVE REST OF CATALOG UP DCA I XR /TO CREATE SPACE FOR NEW ENTRY CLA CMA TAD T1 DCA T1 CLA CMA CLL RAL TAD XR DCA XR TAD T1 CIA CLL CML TAD NAME SZA CLA /HAVE WE PUSHED UP EVERYTHING? JMP MELP2 /NO, KEEP PUSHING TAD [-4 DCA T1 /NOW MOVE THE USERS FILE NAME TAD NAME DCA XR TAD T4 JMS I [FGETW /[IN THE USERS FIELD, OF COURSE) DCA I XR ISZ T4 ISZ T1 /INTO THE EMPTY SPACE JUST CREATED JMP .-5 TAD I [MDATE /PUT DATE OF CREATION INTO FILE NAME DCA I XR /THIS WILL BE DESTROYED IF DWASTE=0 IAC /ADJUST XR BUMP BECAUSE OF DATE STORE JMS I [BUMPXR DCA I XR /GIVE THE NEWLY ENTERED FILE A LENGTH OF 0 TAD XR /PUT A POINTER TO THE LENGTH WORD OF THE DCA I [DFLAG /NEW ENTRY INTO THE DIRECTORY HEADER CLA CMA TAD I [DCOUNT DCA I [DCOUNT /INCREASE THE FILE COUNT BY 1 TAD I T8 TAD ASFLAG DCA I T8 /SIGNAL AN OPEN OUTPUT FILE ON THIS DEVICE JMS I [MWRCAT /WRITE THE ALTERED CATALOG BACK OUT JMP I [LRETRN /STORE ARGS BACK JUST LIKE "LOOKUP" MEMPTY, TAD I XR CIA CLL DCA T1 /SAVE LENGTH OF CURRENT ENTRY TAD T3 TAD T6 CLA /LINK NOW EQUALS BEST LENGTH>=DESIRED LENGTH TAD T3 SNA CML /IF DESIRED LENGTH=0 WE ALWAYS WANT MAXIMUM TAD T1 CLA CML /LINK IS NOW ON IF DESIRED LENGTH IS NOT IN BETWEEN /BEST LENGTH AND CURRENT LENGTH TAD T1 CIA TAD T6 SZL SNA CLA /TAKE EITHER MIN OR MAX OF BEST AND CURRENT LENGTHS, /DEPENDING ON WHETHER LINK IS ON OR OFF JMP MNOCHG /MIN(MAX)=BEST - NOTHING TO DO TAD T1 DCA T6 /MAKE CURRENT ENTRY NEW "BEST" CLA CLL CMA RAL TAD XR DCA NAME /REMEMBER CATALOG LOCATION TAD I [MCATRC DCA ASFLAG /ALSO DIRECTORY SEGMENT NUMBER TAD T2 DCA T5 /AND STARTING BLOCK NUMBER MNOCHG, TAD T1 CIA JMP MELEND /GO UPDATE THE BLOCK NUMBER /CLOSE PROCESSOR - CLOSES AN OUTPUT FILE WHICH WAS OPENED /BY THE "ENTER" CALL -- ARGUMENTS ARE THE DEVICE NUMBER AND THE /CLOSING LENGTH OF THE FILE. PERFORMS A DIRECTORY CLEANUP AFTER /CLOSING THE FILE. IF AN ENTRY ALREADY EXISTS WITH THE NEW FILE'S /NAME IT IS DELETED. (CLOSE MAY BE USED AS A "DELETE" COMMAND /ONLY IF NO OUTPUT FILE WAS ENTERED). AN ERROR RETURN IS /GIVEN IF THE CLOSING LENGTH IS TOO BIG OR IF THERE WAS NEITHER /AN ACTIVE TENTATIVE FILE OR AN OLD FILE TO DELETE. MCLOSE, JMS I [MRDCAT /GET THE CATALOG JMP CRETRN /NON-FILE STRUCTURED DEVICE - RETURN NORMALLY CLA IAC /GET THE NEXT WORD IN THE CALLING SEQUENCE JMS I [FGET DCA T1 /GET CLOSING LENGTH AND STORE IT AWAY JMS I [MDSRCH /SEARCH FOR THE OLD COPY JMP NODLET /NO OLD COPY MTHREE TAD I [DWASTE JMS SQUISH /SQUISH OUT 3+#WASTE WORDS OF THE OLD COPY DCA I XR2 /AND MAKE THE OTHER TWO INTO AN EMPTY TAD T6 /FILE ENTRY WITH THE SAME LENGTH CIA DCA I XR2 /AS THE OLD COPY TAD I T8 AND [7 SNA /IS THERE AN OPEN OUTPUT FILE ON THIS DEVICE JMP EOCLOS /NO - FINISH UP AND GET OUT CIA /GET THE SEGMENT NUMBER WE WANT TAD I [MCATRC SNA CLA JMP .+3 JMS CONSOL JMS I [MWRCAT /NO - WRITE OUT THE ONE WE SQUISHED TAD I [DFLAG /GET LOCATION OF TENTATIVE FILE CIA CLL TAD XR2 SZL CLA /IS THE ENTRY TO BE CLOSED ABOVE THE ONE JMP .+3 /WE JUST DELETED? MTHREE /YES - MOVE THE POINTER DOWN TAD I [DWASTE /TO COMPENSATE FOR THE SQUISHING TAD I [DFLAG /THE POINTER WILL NOW POINT DCA I [DFLAG /TO THE LENGTH WORD. /(THIS WAS WASTED WORK UNLESS THE CORRECT SEGMENT IS IN CORE) NODLET, TAD I T8 AND [7 SNA /IS THERE AN OPEN OUTPUT FILE ON THIS DEVICE? JMP I [MRTRN+1 /WHAT DID HE CALL US FOR? - ERROR JMS I [MRDCAT /YES - READ IN THE CORRECT SEGMENT TAD I [DFLAG DCA T4 /T4 POINTS TO THE LENGTH OF THE TENTATIVE ENTRY TAD T1 CIA /IF T1=0, NEW ENTRY WILL BE DELETED AUTOMATICALLY DCA I T4 /DURING CONSOLIDATION ISZ T4 ISZ T4 CLL CML TAD T1 TAD I T4 /SUBTRACT CLOSING LENGTH FROM FREE BLOCK ADJACENT TO ENTRY SNL SZA JMP I [MERROR+3 /THIS CREEP HAS GONE AND DESTROYED HIS TAPE DCA I T4 EOCLOS, JMS CONSOL /CONSOLIDATE THE DIRECTORY TAD [7770 AND I T8 DCA I T8 SKP CRETRN, TAD [7600 /DO A WRITE OF 0 PAGES. (MAGTAPE) JMS I [MWRCAT ISZ I [MONITO JMP I [MRTRN2 /CONSOLIDATOR - CHECKS FOR ENTRIES OF LENGTH 0 AND DELETES THEM. /ALSO CHECKS FOR ADJACENT FREE AREAS AND COMBINES THEM. CONSOL, 0 TAD [DPROPR-1 DCA XR TAD I [DCOUNT DCA T7 /T7 = FILE COUNT CONLP, TAD I XR SNA CLA /EMPTY FILE? JMP CONMTF /YES - GO CHECK FOR NULL AND 2 IN A ROW MTHREE JMS I [BUMPXR /GET PAST THE GARBAGE WORDS TAD I XR /GET COUNT SZA CLA /WOULD THIS HAPPEN TO BE A NULL FILE? JMP CONLPT /NAH, GO TO NEXT ONE TAD [-5 /YEAH, REMOVE IT ENTIRELY TAD I [DWASTE /INCLUDING THE WASTE WORDS SQCOMN, JMS SQUISH ISZ I [DCOUNT /BUMP DOWN FILE COUNT IN DIRECTORY ISZ NFILES /AS WELL AS THE TEMPORARY ONE IN PAGE 0 NOP /V3 RL INSISTS JMP CONSOL+1 /REPEAT ENTIRE CONSOLIDATION - THIS DELETION MAY /HAVE BROUGHT TWO FREE ENTRIES TOGEHER / THE ABOVE NOP FIXES THE KILLER CLOSE BUG CONLPT, ISZ T7 JMP CONLP /MORE FILES - KEEP PLUGGING JMP I CONSOL /RETURN FROM CONSOLIDATOR CONMTF, TAD I XR /IS THIS FREE ENTRY NULL? SNA JMP SQTRIV /YES - SQUASHITLIKEABUG DCA T2 /NO - SAVE LENGTH TAD XR DCA SQUISH /SAVE POSITION OF LENGTH WORD ISZ T7 /WAS IT THE LAST FILE? SKP /NO, THEN THERE IS ONE AFTER IT(GOOD THINKING!) JMP I CONSOL /YES - RETURN FROM CONSOLIDATOR TAD I XR SZA CLA /TWO EMPTIES IN A ROW? JMP CONLP+3 /NO - SLIP BACK INTO LOOP TAD I XR TAD T2 /YES - COMBINE LENGTHS DCA I SQUISH /STORE BACK IN FIRST LENGTH WORD AND SQUISH SECOND ENTRY SQTRIV, CLA CMA CLL RAL JMP SQCOMN /SQUISH OUT 2 WORDS MRESET, TAD [-17 DCA T3 MRSETL, TAD T3 JMS I [MCKDEV /LINK MUST BE ON AT THIS POINT TAD [200 SZL CLA /ZERO ALL DEVICE HANDLER SLOTS THAT AREN'T RESIDENT DCA I T1 JMS I [FGET SZA CLA TAD [7 CMA STL AND I T8 DCA I T8 /DELETE THE "FILE CURRENTLY OPEN" FLAG IF ASKED ISZ T3 JMP MRSETL JMP I [MNEXT /SUBR TO COLLAPSE DIRECTORY AFTER A POINT SQUISH, 0 TAD XR DCA XR1 CLA CLL CMA RAL TAD XR1 DCA XR2 /SET UP XR2 FOR CHANGING SQUISHED ENTRY SQLOOP, TAD I XR DCA I XR1 /MOVE DOWN ONE WORD TAD XR TAD [-1777 SZA CLA /AT END YET? JMP SQLOOP /NO, KEEP GOING JMP I SQUISH *1400 /INITIAL DIRECTORY FOR MONITOR /DEFINES OS/8 ABSOLUTE LOADER (ABSLDR.SV) DCOUNT, -2 /TWO ENTRIES DORG, MFREE /FILE STORAGE STARTS AT BLOCK "MFREE" DLINK, 0 /THIS IS THE ONLY DIRECTORY RECORD DFLAG, 0 /THERE ARE NO OPEN OUTPUT FILES ON THIS DEVICE DWASTE, -1 /# OF WASTED WORDS PER ENTRY DPROPR, 0102 /AB 2314 /SL 0422 /DR 2326 /.SV 3017 /V3D ENCODING FOR 1-JUN-77 -6 /SIX BLOCKS LONG( 1 BLOCK = 256 WORDS) 0 /EMPTY SPACE -1 /OVERLAYED BY DEVICE DEPENDENT PART WITH LENGTH IFNZRO .-1415 <CNFER,QQQ> *3400 /"ENTER" OVERLAY TO USR - RUNS IN 11000 JMP .+3 MSEGLM, -7 /# DIRECT. SEGS NEWLEN, -10 MEOVLP, TAD I [DLINK SNA CLA JMP MELAST /LAST SEGMENT - MUST CREATE A NEW ONE ISZ I [DCOUNT /BUMP ENTRY COUNT DOWN JMS I [MWRCAT /WRITE OUT THIS SEGMENT JMS MSKIPF /FIND END OF SHORTENED DIRECTORY DCA MEFCNT /PREPARE TO TRANSFER LAST ENTRY TAD (MEOVLS-1 DCA XR1 /INTO NEXT DIRECTORY SEGMENT TAD I XR DCA I XR1 ISZ MEFCNT /THROUGH A BUFFER AT LOC 11200 TAD XR CIA TAD T1 /T1 WAS SET UP BY "ENTER" SZA CLA JMP .-7 TAD I T1 /GET LENGTH OF MOVED ENTRY DCA MEOCNT TAD I [DLINK JMS I [MRDCAT /READ NEXT SEGMENT JMS I [CONSOL /MAKE SURE IT IS AT ITS SMALLEST TAD I [DORG TAD MEOCNT DCA I [DORG /BUMP FILE ORIGIN DOWN JMS MSKIPF /FIND LAST LOC IN NEW SEGMENT MELP3, TAD XR DCA METMP1 TAD XR TAD MEFCNT DCA METMP2 /PREPARE TO PUSH ALL ENTRIES UP TAD I METMP1 DCA I METMP2 /DO THE PUSHING STA TAD XR DCA XR TAD XR TAD (-DWASTE SZA CLA /ARE WE THROUGH? JMP MELP3 /NO TAD (MEOVLS-1 DCA XR /PREPARE TO MOVE THE SAVED ENTRY INTO THE CLA CMA /NEW SEGMENT TAD I [DCOUNT DCA I [DCOUNT /INCREASE ENTRY COUNT OF NEW SEGMENT TAD MEFCNT CIA MECOMN, DCA MEFCNT /STORE NUMBER OF WORDS TO MOVE TAD [DWASTE DCA XR1 TAD I XR DCA I XR1 ISZ MEFCNT JMP .-3 /MOVE THE ENTRY IN JMS MSKIPF TAD XR DCA T1 /T1=LAST LOC IN SEGMENT TAD I [DWASTE CIA TAD XR TAD [-1772 SMA CLA /HAVE WE MADE THIS SEGMENT TOO BIG? JMP MEOVLP /YES - LOOP UNTIL WE GET IT RIGHT JMS I [MWRCAT /WRITE OUT NEW SEGMENT JMP MEOXIT /READ IN ENTER AND CONTINUE MWRONG, IAC MELAST, TAD NEWLEN DCA METMP1 /LENGTH OF NEW SEGMENT TAD METMP1 CIA TAD I [DCOUNT SMA /WERE THERE "NEWLEN+1" JMP MWRONG /NO - SET OUR SIGHTS LOWER DCA I [DCOUNT /ADJUST LENGTH OF OLD SEGMENT JMS MSKIPF /FIND BOUNDARY LOC BETWEEN SEGMENTS TAD I [MCATRC IAC DCA I [DLINK /LINK THE OLD LAST SEGMENT TO TAD I [DLINK /THE NEWLY CREATED ONE TAD MSEGLM SMA CLA JMP I (MEOERR /PROVIDED THAT THERE IS ROOM FOR ANOTHER JMS I [MWRCAT /WRITE OUT THE NEXT-TO-LAST SEGMENT ISZ I [MCATRC /BUMP RECORD NUMBER FOR NEXT WRITE ISZ OLDT9 /LIKEWISE BUMP DIRECTORY KEY TAD METMP1 DCA I [DCOUNT TAD MEOCNT CIA TAD I [DORG DCA I [DORG /SET UP PARAMETERS OF THE NEW SEGMENT DCA I [DLINK /MARK IT AS THE NEW LAST SEGMENT TAD XR TAD [-1777 /SET UP COUNT OF WORDS TO SLIDE DOWN JMP MECOMN /USE COMMON CODE TO SLIDE WORDS AND EXIT MSKIPF, 0 /SUBR TO FIND LAST LOC USED IN A SEGMENT /ALSO FINDS NUMBER OF BLOCKS USED BY SEGMENT TAD I [DCOUNT DCA MNOFIL TAD [DWASTE DCA XR DCA MEOCNT /INITIALIZE POINTER(XR) AND COUNT(MEOCNT) MSKPLP, TAD I XR SNA CLA JMP MEOMTY MTHREE TAD I [DWASTE /BUMP POINTER TO LENGTH WORD OF FILE ENTRY CIA TAD XR DCA XR MEOMTY, TAD I XR TAD MEOCNT DCA MEOCNT ISZ MNOFIL JMP MSKPLP JMP I MSKIPF MEOCNT, 0 MEFCNT, 0 METMP1, 0 METMP2, 0 MNOFIL, 0 MEOVLS=1200 /DESTROYS PART OF "CLOSE" OP FOR BUFFER PAGE EJECT ABSLDR /ABSOLUTE LOADER FOR OS/8 - VERSION 4A *2000 CTLBLK=3400 BUFFER=CTLBLK RXM=6230 /KT8A INSTRUCTION LXM=6200 /KT8A INSTRUCTION XVALU=70 /XCODE XFIELD=20 ORIGIN=21 B1=22 B2=23 B3=24 C1=25 C2=26 C3=27 WD=30 WD1=31 WD2=32 FILPTR=33 PG7400=34 LSTFLD=35 LOADXR=11 ABSLDR, JMS I (CTINIT JMS I (CTINIT JMP CALLCD JMP NOCD NEXTCD, JMS I (NEXFIL CALLCD, JMS I [200 5 /COMMAND DECODE 0216 /ASSUMED EXTENSION IS .BN NOCD, TAD [6001 CDF 0 DCA I [JSBITS /SET JSBITS TO SAVE CD AREA NEXT TIME CDF 10 TAD I [MPARAM+1 AND [100 SZA CLA /IS /R SWITCH ON? JMS I (CTINIT /YES - RE-INITIALIZE LOADER TABLES LD7400, 7400 TAD (MIFILE DCA FILPTR JMS I (SETADR /GET THE STARTING ADDRESS IF IT APPEARS ON THE LINE NEWFIL, TAD (7001 DCA HANDLR TAD I FILPTR AND [7760 SZA /LENGTH OF 256 BLOCKS IMPLIES AT LEAST 256 TAD [17 CLL CML RTR RTR DCA RCDCNT TAD I FILPTR ISZ FILPTR SNA JMP NEXTCD /FILE POINTER = 0 MEANS NO MORE INPUT FILES JMS I [200 1 /ASSIGN HANDLR, 7001 /LOAD INTO 7000 IF NOT ALREADY LOADED JMP I (IOERR TAD I FILPTR DCA RECNO ISZ FILPTR CLA CMA DCA CHCNT DCA REOF TAD I [MPARAM /TEST FOR /I AND (10 SNA CLA JMP I (LOADER /I IS NOT ON ISZ OFLG /IS /I ALLOWED? JMP I (OERR /NO! JMP I (SLASHO GETCH, 0 /GET-NEXT-INPUT-CHARACTER ROUTINE TAD [200 KRS TAD (-203 SNA CLA KSF SKP JMP I (MGET ISZ JMPGET ISZ CHCNT JMPX, JMP JMPGET TAD REOF SZA CLA JMP I GETCH /EOF REACHED BEFORE LOGICAL END - ERROR CIF 0 JMS I HANDLR 0210 /READ 2 RECORDS INTO FIELD 1 PBUFFR, BUFFER RECNO, 0 JMP RERROR ISZ RECNO ISZ RCDCNT SKP ISZ REOF TAD (-601 DCA CHCNT TAD PBUFFR DCA CHPTR TAD JMPX DCA JMPGET JMP GETCH+1 JMPGET, JMP . JMP CHAR1 JMP CHAR2 CHAR3, TAD JMPX DCA JMPGET TAD I CHPTR AND LD7400 CLL RTR RTR TAD CHTMP RTR RTR ISZ CHPTR JMP GCHCOM CHAR2, TAD I CHPTR AND LD7400 DCA CHTMP ISZ CHPTR CHAR1, TAD I CHPTR GCHCOM, AND (377 ISZ GETCH JMP I GETCH RERROR, SPA CLA JMP I (IOERR /AN ACTUAL READ ERROR - AMAZING! ISZ REOF JMP RECNO+2 REOF, 0 CHCNT, 0 CHPTR, 0 CHTMP, 0 RCDCNT, 0 OFLG, -1 /SWITCH FOR /O OPTION PAGE *2200 PUTWD, 6602 /ABSLDR VERSION NUMBER CMA AND I B2 /AND OUT THE PAGE SLOT IN THE PAGE TABLE DCA I B2 TAD ORIGIN DCA ORGX TAD XVALU CLL RAR SZA CLA /TEST FOR FIELDS 0 OR 1 JMP PUTIT /NEITHER - STORE AS IS SNL JMP FLD0 TAD ORIGIN SPA TAD [-400 SPA CLA JMP FLD1 CLA CLL CML RTR TAD ORIGIN SMA CLA JMP .+3 ISZ I (OVLYFG /SET FLAG THAT LOADER IS BEING OVERLAYED TAD (2400 /LOADER OVERLAYS GO IN MTEMP+11 - MTEMP+14 LCOMPR, TAD ORIGIN RTL RTL RAL AND [17 TAD (MTEMP RLCOMN, DCA PGTMP TAD BUFREC CIA TAD PGTMP SNA CLA JMP DONTWR JMS WRBUF WRIBUF, CLA /MODIFIED..IF NOT /O GETS SZA CLA JMP DONTWR CIF 0 JMS I [SHNDLR 0210 1400 /USE CATALOG SPACE PGTMP, 0 JMP I (LIOERR DONTWR, DCA OLDT9 /MARK THE CATALOG DESTROYED TAD PGTMP DCA BUFREC TAD ORIGIN AND [377 TAD PTRBFR DCA ORGX CDF 10 JMP PUTIT2 FLD1, CLL TAD ORIGIN /IGNORE LOCATIONS ABOVE 17600 TAD [200 SZL CLA JMP I PUTWD PUTIT, TAD XFIELD TAD (6201 DCA .+1 M7, -7 PUTIT2, TAD C3 DCA I ORGX CDF10, CDF 10 JMP I PUTWD FLD0, TAD ORIGIN /CHECK FOR STUFF IN PAGE 7000 TAD (1000 SNL CLA /IF NON ZERO,OVERLAY JMP PUTIT ISZ PG7400 /SET OVERLAY FLAG JMP LCOMPR /FORM RECORD NO. WRBUF, CALONC TAD BUFREC SNA JMP I WRBUF CIF 0 JMS I [SHNDLR 4210 PTRBFR, 1400 BUFREC, 0 JMP I (LIOERR DCA BUFREC /BAD I/O ON SYSTEM DEVICE JMP I WRBUF ORGX, NEXFIL, ERTRN JMS WRBUF /WRITE WHATEVER TAD I [MPARAM-1 SPA CLA JMP I (BUILD TAD I [MPARAM AND (40 SZA CLA JMP I (BUILD JMP I NEXFIL CORTB, ZBLOCK 30 /ONCE-ONLY CODE INSERTED HERE KATER ZBLOCK 2 /EXTRA NEEDED BY ONCE-ONLY CODE /NOT USED BY CORE TABLE PAGE *2400 ITSOVR, JMS ASSEMB /END OF FILE CIA TAD LCKSUM SZAIN, SZA CLA /TEST CHECKSUM JMP I (BADCKS TAD I [MPARAM+1 /TEST FOR S OPTION AND L40 SNA CLA JMP I (NEWFIL /TIME FOR ANOTHER FILE LOADER, DCA LCKSUM / DCA I (OFLG /CANCEL FURTHER /I'S TAD SZAIN DCA I (WRIBUF JMS GETFLD /FIELD SETTING /DCA XFIELD TAD [200 DCA ORIGIN /ORIGIN SETTING JMS I (GETCH JMP I (NEWFIL SNA /IGNORE ZEROES JMP .-3 TAD [-200 /LOOKING FOR LEADER CODE SZA CLA JMP LOADER+1 LEADER, JMS I (GETCH JMP I (NEWFIL SNA JMP LOADER+1 TAD [-200 SNA /IS IT LEADER CODE? JMP LEADER NEWWD, SMA /IS IT POSSIBLY AFIELD PSEUDO-OP? JMP FIELDW TAD [200 /IF NOT STORE FOR ASSEMBLING DCA WD1 NEWD1, DCA I (HT JMS I (GETCH JMP I (BADINP DCA WD2 /STORE SECOND WORD FOR ASSEMBLING JMS I (GETCH JMP I (BADINP TAD [-200 SNA /TEST FOR TRAILER CODE JMP ITSOVR DCA WD /STORE THIRD WORD JMS ASSEMB SNL JMP DATAWD DCA ORIGIN DCA I (LOADWD /ZERO 'DATA LOADED' FLAG V3 JMP GETNXT DATAWD, JMS I (LOADWD ISZ ORIGIN L40, 40 GETNXT, TAD WD1 TAD WD2 TAD LCKSUM DCA LCKSUM TAD WD JMP NEWWD ASSEMB, 0 /ASSEMBLING WORDS... TAD WD1 CLL RTL RTL RTL TAD WD2 JMP I ASSEMB FIELDW, TAD (-32 /TESTING TO ISOLATE FIELD PSEUDO-OP SNA /IS IT A CONTROL/Z? JMP CTLZ TAD (-46 SPA /IS IT GREATER THAN 300? JMP NOTXP DCA WD1 TAD WD1 AND [7 SZA CLA JMP NOTXP TAD WD1 AND (70 ISZ I (HT /I.D. DISTINGUISHES BETWEEN GETFLD & FIELDW CALL JMS I (XTEND /GO SEARCH FOR GREATER THAN 32K FIELD SETTING /DCA XFIELD JMS I (GETCH JMP I (BADINP TAD [-200 SZA JMP NEWWD NOTXP, CLA TAD LCKSUM SNA CLA JMP LOADER JMP I (BADINP LCKSUM, 0 CTLZ, TAD LCKSUM SZA CLA JMP I (BADINP JMP I (NEWFIL GETFLD, 0 /TEST FOR SPECIFIED FIELD SETTING DCA C1 DCA XVALU /INITIALIZE XVALU TAD I (MPARAM+2 /COMMAND DECODER INPUT AND (1774 SNA /WAS FIELD SPECIFIED? JMP I GETFLD RTL /IF SO, WHAT WAS IT? RAL ISZ C1 SNL JMP .-3 CLA CMA TAD C1 /FIELD...IS HERE JMS I (XTEND /MAKE NECESSARY ADJUSTMENTS(KT8A) JMP I GETFLD PAGE *2600 /BUILD CORE CONTROL BLOCK /FIELDS AND PAGES TO BE SAVED HAVE BEEN ISOLATED /BY LOADWD.SEE CORTAB FOR MORE INFO ON TABLE. BUILD, TAD (CORTAB+135 /ROUTINE TO SEARCH SAVE TABLE DCA B1 TAD I (CORTAB+3 CLL CMA AND [7760 SNA CLA CML TAD I (CORTAB CMA AND [7760 SNA CLA IAC RTR DCA I (CTLBLK+3 TAD (CTLBLK+3 DCA LOADXR TAD [-40 DCA C1 TAD [70 CLA TAD (37 DCA FIELDB DCA I (CTLBLK FLDLP, TAD FIELDB TAD (-2 SMA CLA /IGNORE 07600 AND 17600 IN CCB /V3 CMA /IN THE CORE MAP TAD [-37 DCA C2 DCA LOWERA MTLOOP, JMS I (SHFT SNL CLA JMP INUSE TAD LOWERA MTRSME, TAD [200 DCA LOWERA ISZ C2 JMP MTLOOP JMP FLDOVR INUSE, TAD LOWERA TAD [200 DCA UPPERA ISZ C2 SKP JMP ENDRGN-2 JMS I (SHFT SZL CLA JMP ENDRGN TAD UPPERA JMP INUSE+1 CLA CMA DCA C2 ENDRGN, TAD LOWERA AND [7400 DCA I LOADXR ISZ I (CTLBLK TAD LOWERA AND [7400 CIA TAD UPPERA CLL RAR TAD XFB DCA I LOADXR TAD UPPERA JMP MTRSME XFB, 0 FLDOVR, JMS I (EXTST TAD I [MPARAM+1 /CLOBBER BATCH? AND [400 TAD I (MPARAM+2 /AH ED, BUG IF YOU SPEC /P/1 TO LOADER AND (403 TAD I (CTLBLK+3 DCA I (CTLBLK+3 TAD LSTFLD AND (37 JMS I (BANKSW /ADJUST FOR CDF TAD [CDF CIF 0 DCA I (CTLBLK+1 SKP ORG200, TAD [200 TAD LSTADR SZA /V3 JMP NOORG /V3 ALLOW EXPLICIT START ADDR TO OVERRIDE DEFAULT TAD I (LOADWD /V3 NO EXPLICIT START ADDR CLA /REPLACE BY 'SZA CLA' TO ALLOW SELF-STARTING STUFF /* SZA CLA /V3 IS IT SELF STARTING BIN FORMAT? JMP ORG200 /V3 NO TAD XFIELD /V3 YES TAD [CIF CDF 0 /V3 DCA I (CTLBLK+1 /V3 TAD I (ORIGIN /V3 NOORG, DCA I (CTLBLK+2 JMP I (LGTOUT /WRITE CONTROL BLOCK AND EXIT FIELDB, 0 UPPERA, SETADR, 0 TAD I (MPARAM+3 SNA /IS THERE A STARTING ADDRESS SPECIFIED? JMP I SETADR /NO DCA LSTADR TAD I [MPARAM-1 DCA LSTFLD JMP I SETADR LOWERA, 0 LSTADR, 0 PAGE *3000 ZOFILE, MOFILE ZOUCNT, -47 LGTOUT, TAD PG7400 SNA CLA JMP .+7 CIF 0 JMS I [SHNDLR 0300 7000 MTEMP+16 JMP I (LIOERR CIF 0 JMS I [SHNDLR 4210 CTLBLK-200 MTEMP+10 JMP I (LIOERR TAD I (CTLBLK+2 DCA CTL2 /MOVE THINGS INTO THIS PAGE TAD I (CTLBLK+3 DCA CTL3 /SO WE CAN REFERENCE THEM WITH DF=0 TAD I [MPARAM AND (40 SNA CLA JMP LNOGO TAD CTL3 RAL SPA CLA /ARE WE OVERLAYING THE I/O MONITOR? JMP LKICKM /NO CDF 0 DCA I [JSBITS /YES - SET JSBITS TO FORCE A READ CDF 10 JMS I [200 13 /RESET I/O DEVICES AND FILES LKICKM, JMS I [200 11 /KICK MONITOR OUT /******************************************** /NO PAGE ZERO REFERENCES AFTER THIS POINT /PAGE ZERO MAY CONTAIN USER CODE /******************************************** DCA I ZOFILE /ZERO OUT COMMAND DECODER AREA ISZ ZOFILE ISZ ZOUCNT JMP .-3 TAD I (CTLBLK+1 CDF 0 DCA I (MSTCDF TAD CTL2 DCA I (MSTADR /SET UP STARTING ADDRESS IN FIELD 0 JMP LMOVRD LNOGO, TAD CTL3 /ABOVE COMMENT DOESN'T APPLY TO NEXT 9 LINES SPA CLA /ARE WE OVERLAYING THE KEYBOARD MONITOR? TAD (5 /NO - RETURN TO NON-SAVING ENTRY TAD [7600 CDF 0 DCA I (MSTADR TAD ZCDIF0 DCA I (MSTCDF CLA CMA LMOVRD, CDF 10 DCA I (7700 /SET 7700 TO -1 IF NO GO TAD I (CTLBLK+1 CDF 0 DCA I (JFIELD /SET UP PARAMETERS IN FIELD 0 TAD CTL2 DCA I (JSTART TAD CTL3 DCA I (JSBITS LMOVLP, TAD COMBO DCA I COMBPT ISZ LMOVLP ISZ COMBPT ISZ COMBCT JMP LMOVLP /MOVE THE READ OF THE LOADER OVERLAY INTO FIELD 0 ZCDIF0, CDF CIF 0 TAD OVLYFG SZA CLA JMP I (MREAD /LOADER OVERLAYED - GO READ OVERLAY JMP I (MSTCDF /LOADER NOT OVERLAYED - WHY READ? COMBPT, MREAD-1 COMBCT, -7 COMBO, 7607 MREAD-1&177+4600 /JMS I .-1 1210 2000 MTEMP+11 /LOCATION OF SCRATCH BLOCKS FOR LOADER OVERLAY HLT MSTCDF&177+5200 /JMP MSTCDF CTL2, 0 CTL3, 0 OVLYFG, 0 /LOADWD CALCULATES AN INDEX INTO CORTAB /IT SETS APPROPRIATE BITS FOR IDENTIFYING MEMORY AREA /TO BE SAVED BY CCB.SEE CORTAB FOR MORE INFO LOADWD, 0 /ROUTINE TO IDENTIFY FIELDS AND PAGES DCA C3 /TO BE SAVED. TAD XVALU /FIELD VALUE-INDEX INTO CORTAB(SEE CORTAB) CLL RAL TAD XVALU TAD (CORTAB-1 DCA B2 TAD ORIGIN AND [7600 CLL RTL RTL RTL ISZ B2 TAD (-14 SMA JMP .-3 DCA CTL2 CLL CML RAL ISZ CTL2 JMP .-2 JMS I (PUTWD JMP I LOADWD PAGE *3200 ERPCH, 0 AND (77 /GET LOW ORDER 6 BITS SZA JMP NZCHAR JMS ERR FILMSG, TEXT /, FILE 0/ NZCHAR, TAD (240 AND (77 TAD (240 /CONVERT TO ASCII JMS LDRPCH /PRINT JMP I ERPCH /AND RETURN LDRPCH, 0 TLS TSF JMP .-1 CLA JMP I LDRPCH SHFT, 0 CLA CLL CMA RTL DCA C3 CLA CLL CML RTL TAD B1 SHFTLP, DCA B3 TAD I B3 RAL DCA I B3 CLA CMA CML TAD B3 ISZ C3 JMP SHFTLP JMP I SHFT /NOTE: SHFT LEAVES AC NON-ZERO ERR, ONCE /CAN'T USE PAGE 0 LITERALS CLA CDF 10 TAD I (FILPTR /ZERO CHAR GETS REPLACED BY "FILE #" TAD (322 /MAGIC NUMBER CLL CML RAR /AC NOW CONTAINS " #" DCA FILMSG+3 ERRLUP, TAD I ERR SNA JMP EOMESG /MESSAGE MUST BE EVEN NUMBER OF CHARS LONG RTR RTR RTR JMS ERPCH TAD I ERR JMS ERPCH ISZ ERR JMP ERRLUP EOMESG, TAD (215 /TERMINATE MESSAGE WITH CR-LF JMS LDRPCH TAD T212 JMS LDRPCH ERTRN, JMP I (ABSLDR /RETURN TO LOADER STARTING ADDRESS IOERR, JMS ERR TEXT %I/O ERROR% BADINP, JMS ERR TEXT /BAD INPUT/ BADCKS, JMS ERR TEXT / BAD CHECKSUM/ NULERR, JMS CTINIT T212, 212 JMS ERR TEXT /NO INPUT/ LIOERR, JMS ERR TEXT /SYSTEM I-O ERROR/ OERR, JMS ERR TEXT %NO /I!% CTINIT, 0 CALONC, JMS I ERR /CALL ONCE-ONLY CODE TAD (-140 DCA C1 DCA XFIELD /INITIALIZE XFIELD TAD (CORTAB-1 DCA LOADXR CLA CMA DCA I LOADXR ISZ C1 JMP .-3 DCA LSTFLD DCA I (LSTADR /V3 SET INITIAL STARTING ADDRESS TO 0 DCA I (OVLYFG DCA PG7400 ISZ CTINIT JMP I CTINIT PAGE *CTLBLK+200 /CODE FOR OVERLAY OPTION IS HERE.IF /I IS NOT /USED IMMEDIATELY, THIS CODE WILL PROBABLY BE DESTROYED, /AS IT IS USED FOR A BUFFER SLASHO, CLA CMA DCA I (OFLG /RE ENABLE /I TAD I (HANDLR DCA GLONK /ENTRY POINT TO HANDLER TAD I (RECNO DCA CCBLOK CIF 0 JMS I GLONK /READ IN CORE CONTROL BLOCK 0110 CCBPTR, CTLBLK CCBLOK, 0 JMP I (OERR /DATA FAILURE TAD I CCBPTR /NO. SEGMENTS CMA /TEST FOR BAD CORE IMAGE AND L7740 SZA CLA JMP I (BADINP /NOT CORE IMAGE TAD I CCBPTR DCA SEGCNT TAD I SGSTAD /THIS CODE IS NEW FOR V3D / AND [70 /GET FIELD CLL RTR RAR DCA I (LSTFLD ISZ SGSTAD TAD I SGSTAD DCA I (LSTADR ISZ SGSTAD TAD I SGSTAD /GET JSW FROM SAVE FILE AND [400 DCA TEMP /PRESERVE /P TAD I [MPARAM+1 AND (7377 TAD TEMP DCA I [MPARAM+1 TAD I SGSTAD AND (3 /PRESERVE LAST 2 BITS DCA TEMP TAD I (MPARAM+2 AND [7774 TAD TEMP DCA I (MPARAM+2 ISZ SGSTAD NEWSEG, TAD I SGSTAD /SEGMENT START ADDRESS DCA ORIGIN TAD I SGFDLT /FIELD AND LENGTH AND L77 DCA XFIELD TAD I SGFDLT AND [7700 SNA /V3C STL CLA RAR /AC4000 DCA SEGLTH TAD SEGLTH TWOPG, TAD [7600 SMA CLA /NO.. IS TWO PAGE SEGMENT LEFT? TAD [7600 /YES..-400 TO WORD COUNT TAD [7600 /NO.. -200 TO WORD COUNT DCA WDCT TAD SEGLTH TAD [7600 /BUMP DOWN LENGTH LEFT DCA SEGLTH ISZ CCBLOK /POINT TO NEXT DATA RECORD TAD CCBLOK DCA DATRC DCA OLDT9 /MARK DIRECTORY DESTROYED CIF 0 JMS I GLONK /READ THE DATA RECORD IN 0210 1400 /INTO 11400 TEMP, DATRC, 0 JMP I (IOERR /DATA FAILURE CLA CMA TAD ORIGIN AND [177 TAD (1200 /SET UP INPUT POINTER CHARPT=10 DCA CHARPT LOOPI, TAD I CHARPT JMS I (LOADWD /MOST OF THE WORK ISZ ORIGIN L7400, 7400 /NOP ISZ WDCT /FINISHED THIS BLOCK? JMP LOOPI JMS I (WRBUF /YES.. WRITE THE STUFF OUT DCA I (BUFREC /SO THAT WRBUF DOESN'T SCREW US UP TAD SEGLTH /V3C (REARRANGED) SMA SZA /ALL PAGES DONE? JMP TWOPG /NO, NEXT! (IF DONE, FALL INTO 'GTSEG') ISZ SEGCNT /YES, ANY MORE SEGMENTS SKP JMP RENEW /RESET CCB POINTER FOR NEXT /I CLA CLL CML RTL TAD SGSTAD DCA SGSTAD CLA CLL CML RTL TAD SGFDLT DCA SGFDLT /POINT TO NEXT CCB ENTRIES JMP NEWSEG GLONK, 0 /HANDLER ENTRY POINT HERE WDCT, 0 SEGCNT, 0 SEGLTH, 0 CTLBLK=3400 SGFDLT, CTLBLK+5 /FIELD AND LENGTH WORD SGSTAD, CTLBLK+1 /SEGMENT START ADDRESS L7740, RENEW, 7740 /USED TO CLEAR AC L77, 77 /MIGHT OR MIGHT NOT SKIP TAD (CTLBLK+1 DCA SGSTAD TAD (CTLBLK+5 DCA SGFDLT JMP I (NEWFIL PAGE *4000 XTEND, 0 /CODE TO HANDLE EXTENDED MEMORY BANK MANIPULATIONS DCA XVALU /STORE INFO TO BE PROCESSED TAD HT /IS IT A GETFLD OR A FIELDW CALL? SZA CLA /IF GETFLD CALL ALL WE WANT TO DO IS TRANSFORM JMP XFLDT XNDT, TAD XVALU / TRANSFORM FROM ABCDE TO ACDEB00 JMS BANKSW DCA XFIELD JMP I XTEND XFLDT, JMS I (GETCH /FIELDW CODE TEST FOR SECOND FIELD WORD JMP I (BADINP TAD [-200 SNA JMP I (NOTXP SMA JMP XTD TAD [200 /REPEATED NEWWD CODE DCA WD1 /REPEATED NEWWD CODE TAD XVALU /IF NO SECOND FIELD WORD WE PROCEED AS NORMALLY DCA XFIELD TAD XVALU CLL RTR RAR DCA XVALU JMP I (NEWD1 /BY PASS NEWWD CODE -- ALREADY RAN IT XTD, TAD (-32 /REPITITION OF FIELDW CODE SNA /IS IT CONTROL/Z? JMP I (CTLZ TAD (-46 SPA /IS IT ABOVE 300? JMP I (NOTXP CLL RTR RAR AND [7 TAD WD1 DCA XVALU TAD (7000 LXM JMP XNDT HT, 0 EXTST, 0 /BUILD CCB CODE TO HANDLE EXTENDED MEMORY TAD I (FIELDB /PREVIOUSLY KNOWN AS FLDOVR CODE TAD (-1 /TRANSFORM THE BITS FROM DCA I (FIELDB /ABCDE FORM TO CDEBA FORM TAD I (FIELDB CLL RTR RTR SZL TAD (400 CLL RAR SZL TAD (100 CLL RTR RTR RAR DCA I (XFB CLA CLL CMA RTL TAD I (B1 DCA I (B1 ISZ I (C1 JMP I (FLDLP TAD I (CTLBLK SNA JMP I (NULERR CIA DCA I (CTLBLK RXM SNA CLA JMP I EXTST TAD I (CTLBLK RAL CLL RAR DCA I (CTLBLK JMP I EXTST BANKSW, 0 CLL RTR /ISOLATE BANK AND FIELD BITS RTR SZL /ADJUST FOR PROPER CDF CIF TAD [400 /WAS THERE AN "A" BIT? CLL RAR SZL /WAS THERE A "B" BIT? TAD (4000 CLL RTR RTR RAR JMP I BANKSW PAGE *4200 /CORTAB IS A TABLE FOR STORING SAVE INFO /FOR EACH OF THE 0-37 FIELDS, THERE ARE THREE /IDENTIFYING WORDS...THE BITS IN THESE WORDS /CORRESPOND TO PAGES IN THE RESPECTIVE FIELD /E.G. CORTAB+130 REFERS TO 130%3=35TH FIELD /--- FIRST WORD,I.E. PAGES 0-14... /LOADWD BUILDS THE TABLE... /BUILD REFERENCES IT FOR CONSTRUCTING THE CCB CORTAB, ZBLOCK 140 PAGE *CORTB /ONCE-ONLY CODE ONCE, 0 /ONCE-ONLY CODE TO CHECK FOR CORRECT MONITOR DCA I WRBUF /DON'T CALL AGAIN TAD [400 TAD K7400 SZA CLA JMP OLDMON TAD [7 TAD M7 SNA CLA JMP I ONCE /THEY AGREE OLDMON, TAD KERR DCA I NEXFIL JMS I PERR /THEY DON'T TEXT /INCOMPATIBLE/ /MUST BE AN EVEN # OF CHARS LONG CIF CDF 0 JMP I K7605 K7400, 7400 PERR, ERR K7605, 7605 KERR, ERR&177+5600 /PAGE 0 - TEMPORARIES AND LITERALS. /LOCATIONS 0-3 ARE RESERVED FOR POINTERS TO KEY LOCATIONS /IN THE MONITOR (SO THE CUSPS CAN GET AT THESE LOCATIONS) /LOCATIONS 4-6 ARE RESERVED FOR SYSTEM ODT FIELD 1 BREAKPOINTS *7 OLDT9, 0 /POINTER TO DEVICE HANDLER OF DIRECTORY IN CORE *15 XR1, 0 XR2, 0 XR, 0 *20 /ENTRY TO MONITOR FROM A CALL TO 17700 - /CAN BE DESTROYED AFTER IT IS EXECUTED MSTART, TAD I T1 DCA MACARG TAD I [7700 DCA I [MONITO TAD I [SMCIF DCA I T2 /FAKE A CALL TO "MONITO" TAD I [MONITO RAL SNL SMA CLA TAD I [SMCIF TAD T3 SNA CLA /CHECK FOR A CALL FROM 10000-11777 JMP I [MERROR /YES - GIVE ERROR IMMEDIATELY JMP I T4 /NO - SLIDE INTO MONITOR CODE *36 /POINTERS TO INTERNAL MONITOR LOCATIONS FOR "BUILD" SDNAME /SYSTEM DEVICE NAME TABLE SDVHND /DEVICE HANDLER ENTRY TABLE *40 /LOCATIONS 20-37 RESERVED FOR CUSP SCRATCH SPACE USERFG, 1 /MUST BE IN 40 - SEE CD LISTING T1, MARG1 /MUST BE AT 41 T2, FGETX T3, -6213 T4, MRENTR T5, 0 T6, 0 T7, 0 T8, 0 T9, 0 NAME, 0 NFILES, 0 ASFLAG, 0 MACARG, 0 EPASS, 0 MERRNO, 4000 MEOXIT, CIF 0 /RETURN FROM ENTER OVERLAY JMS I [SHNDLR 0210 1000 MONTOR+2 /RESTORE LOCS 1000-1377 OF USR HLT /HELP! JMP I .+1 MENTER /RESTART ENTER OPERATION COMPLETELY $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | $JOB TO MAKE OS/8 REJECT LOWERCASE INPUT /RE-INSTALLS THE 'LINEFEED ECHO' OPTION. .R FUTIL 11.233/ IF C-1207 1344 11.263/ IF C-1034 2020 11.264/ IF C-5344 5267 11.344/ IF C-1354 4565 11.345/ IF C-7500 3413 11.346/ IF C-1353 1103 11.347/ IF C-1352 4423 11.350/ IF C-3034 1164 11.351/ IF C-5270 3017 11.352/ IF C-0340 1417 11.353/ IF C-7740 7450 11.354/ IF C-7440 5324 COMMENT: END OF KBM PATCH 53.50/ IF C-5207 5366 53.156/ IF C-1025 2024 53.157/ IF C-1220 5362 53.160/ IF C-7500 1102 53.161/ IF C-1367 4466 53.162/ IF C-1370 3024 53.163/ IF C-3025 1025 53.164/ IF C-1025 4466 53.165/ IF C-4466 5755 53.166/ IF C-5755 4312 53.167/ IF C-7740 3415 53.170/ IF C-0340 1101 COMMENT: END OF CD PATCH WRITE END EXIT $END OF JOB TO INSTALL UC PATCH |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # OCOMP: Octal Compare and Dump Originally submitted as DECUS 8-609. Owing to loss over the years, the source has gotten disconnected from the help file. Upstream for OCOMP.HL comes from [Dave Gesswein's Archive][dgw-ocomp-hl] Ideally Vince Slyngstad's DECUS archive would have it, but that contains only the DECUS writeup. The source comes from [John Wilson's dbit FTP site][dbit-ocomp] ## Original DECUS writeup: **OCOMP: Octal Compare and Dump** 8-609 **Author:** Dennis McGhie and Jim Crapuchettes, Frelan Associates, Menlo Park, CA **Operating System:** OS/8 **Source Language:** PAL-8 **Abstract:** An OS/8 utility program to compare or dump OS/8 files. Masking for compares and searching for dumps are included. The output file contains the contents in octal from the first input file, of all (dump) or part of the words (compare, search) from the file. This program is useful for comparing two versions of a ... SV" file. **Media Price Code:** (Order DECUS 8-608) **Catalog:** August 1978 [dgw-ocomp-hl]: http://www.pdp8online.com/pdp8cgi/os8_html/OCOMP.HL?act=file;fn=images/misc_floppy/dvf.rx02;blk=92,5,0;to=auto [dbit-ocomp]: http://ftp.dbit.com/pub/pdp8/nickel/utils/ocomp/ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | OCOMP - COMPARE & DUMP FILES UNDER A MASK 1978 APRIL 3 DEFAULT OUTPUT IS TO TTY: DEFAULT OUTPUT EXTENSION IS .LS. THE MASK IS SPECIFIED AS THE LEAST SIGNIFICANT 12 BITS OF =. 1) COMPARE: TWO INPUT FILES ARE COMPARED UNDER A MASK. IF SECOND INPUT DEVICE IS SPECIFIED WITH NO FILENAME, THE FIRST INPUT FILENAME IS USED. IF MASK=0, USE 7777. 2) DUMP: ONE INPUT FILE. DUMP ALL WORDS WITH NO MASK BITS OFF. IF MASK=0, USE 7777. 3) SEARCH: ONE INPUT FILE WITH /S. DUMP ALL WORDS EQUAL TO THE MASK. AFTER SPECIFIED OPERATIONS ARE COMPLETED, THE COMMAND DECODER IS RECALLED, UNLESS INPUT WAS TERMINATED BY AN ALT MODE CHARACTER. OTHER COMMAND DECODER OPTIONS: /I IMAGE MODE INPUT FILE IS CORE IMAGE (SAVE) FILE. ADDRESSING IS BY MEMORY ADDRESS, RATHER THAN FILE ADDRESS. DEFAULT INPUT EXTENSION IS .SV. /C CCB OUTPUT WHEN COMBINED WITH /I, CCB IS PRINTED AS PART OF THE RUN TITLE. /D DIFFERENCE MODE ONLY OUTPUT IS A MESSAGE TELLING THAT COMPARED FILES ARE SAME OR DIFFERENT. /F FORM FEED ALL BLOCKS WHICH CAUSE OUTPUT HAVE THEIR OUTPUT PRECEEDED BY A FORM FEED CHARACTER. /T TELETYPE OUTPUT FORMAT IS NARROWED FOR OUTPUT TO 72 COLUMN TELETYPES. THIS IS ALSO USEFUL FOR SCOPES. /H HEADER OUTPUT HEADER LINE EVEN IF OUTPUT DEVICE IS TTY:. ERRORS ARE SIGNALED BY "USER ERROR ..." MESSAGES ERROR CONDITION 1 MORE THAN TWO INPUT FILES. 2 OUTPUT FILE TOO SMALL. 3 OUTPUT HANDLER FETCH OR ENTER FAILED. 4 INPUT HANDLER FETCH OR LOOKUP FAILED. 5 INPUT FILE #1 ERROR. 6 INPUT FILE #2 ERROR. 7 OUTPUT FILE ERROR. 8 OUTPUT FILE CLOSE FAILED. 9 CCB DECODE ERROR. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 | /OCOMP--OCTAL COMPARE AND DUMP /BY: / DENNIS MCGHIE / DIVISION OF CARDIOVASCULAR SURGERY / STANFORD MEDICAL CENTER / STANFORD, CALIF. 94305 /MODIFIED BY: / / JIM CRAPUCHETTES / FRELAN ASSOCIATES / P.O. BOX 298 / MENLO PARK, CALIF. 94025 / OCOMP IS AN OS/8 UTILITY PROGRAM USED TO / COMPARE OR DUMP OS/8 FILES. BOTH MASKING AND / SEARCHING ARE ALLOWED. THE MASK IS ENTERED BY / THE "=" OPTION (ONLY THE LEAST SIGNIFICANT 12 / BITS ARE USED). THE SEARCH FEATURE IS SPECIFIED / BY THE "/S" OPTION. ALL OUTPUT IS IN OCTAL. / / THE THREE MODES OF OPERATION ARE: / / 1. COMPARE: TWO INPUT FILES SPECIFIED AND ARE / COMPARED WORD-FOR-WORD UNDER THE MASK IF / ANY IS SPECIFIED (IF NONE IS SPECIFIED, ALL / BITS ARE COMPARED). ANY DIFFERENCES CAUSE / THE WORD FROM FILE #1 (IN OCTAL) TO BE PUT / IN THE OUTPUT FILE. / / 2. DUMP: ONLY ONE INPUT FILE IS SPECIFIED AND / IT IS DUMPED (IN OCTAL) ON THE OUTPUT FILE. / IF A MASK IS SPECIFIED, ONLY THOSE WORDS / WITH ALL MASKED BITS IN THE 1 STATE ARE / OUTPUT. / / 3. SEARCH: ONLY ONE INPUT FILE IS SPECIFIED, / ALONG WITH "/S". ONLY THOSE WORDS EQUAL TO / THE MASK ARE DUMPED ON THE OUTPUT FILE. EJECT /OTHER PROGRAM ACTIONS: / / A. SPECIFYING NO INPUT AND/OR OUTPUT FILES / WILL CAUSE A RETURN TO THE COMMAND DECODER. / / B. "USER ERROR ..." MESSAGES WILL BE OUTPUT / UNDER THE FOLLOWING CONDITIONS: / / ERROR CONDITION / 1 MORE THAN TWO INPUT FILES. / 2 OUTPUT FILE TOO SMALL. / 3 OUTPUT HANDLER FETCH OR OUTPUT FILE / ENTER FAILED. / 4 INPUT HANDLER FETCH FAILED. / 5 INPUT FILE #1 ERROR. / 6 INPUT FILE #2 ERROR. / 7 OUTPUT FILE ERROR. / 8 OUTPUT FILE CLOSE FAILED. / / C. "FILE 2 IS LONGER THAN FILE 1" WILL BE OUTPUT / IN THE OUTPUT FILE IF THIS IS TRUE. IF FILE / #1 IS LONGER THAN FILE #2, THE REMAINDER OF / FILE #1 WILL BE DUMPED TO THE OUTPUT FILE. / / D. "NOTHING OUTPUT" WILL BE PUT IN THE OUTPUT / FILE IF NOTHING ELSE IS OUTPUT. / / E. THE PROGRAM LEAVES THE USR IN CORE AFTER IT / IS CALLED IN. / / F. THE DEFAULT INPUT EXTENSION IS ".SV". / / G. THE PROGRAM IS NOT RESTARTABLE. /COMMAND DECODER USAGE: / / .R OCOMP / *OFILE<IFILE1[,IFILE2] [/S] [=NNNN] / / ITEMS IN [...] ARE OPTIONAL. /ASSEMBLY INFORMATION: / / .R PAL8 / *OCOMP<OCOMP/L/8/9=12000$ / .SAVE ... OCOMP /(OCOMP) OCTAL COMPARE AND DUMP /PAGE 0 DEFINITIONS: IWD1= 1 IWD2= 2 MASK= 3 XR11= 11 TMP= 12 XR13= 13 BLEFT1= 16 BLEFT2= 17 DUMPSW= 20 OWD= 21 OCNT= 22 RELBLK= 23 LNCNT= 24 IBUF1= 2000 /2000-3777 IN FIELD 0 IBUF2= 4000 /4000-5777 IN FIELD 0 OBUF= 4000 /4000-5777 IN FIELD 1 LBUF= 6000 /LINE BUFFER--IN FIELD 1 / THE OUTPUT AND TWO INPUT HANDLERS CAN ALL / BE 2 PAGE HANDLERS. ALLOCATION AS FOLLOWS: / / OUTPUT 06200-06577 / INPUT #1 06600-07177 / INPUT #1 07200-07577 FIELD 1 *2000 A7600= . START, 7600 /(OPR2 CLA) JMS I (7700 /CALL USR 10 /USRIN STAR1, JMS I (200 /CALL USR 5 /DECODE 2326 /"SV" TAD I A7600 SZA CLA TAD I A7617 SNA CLA JMP STAR1 /NO OUTPUT &/OR INPUT FILE JMS SETUP /SET NO-RESTART BIT, ETC. TAD I A7600 JMS I (200 1 /FETCH OHANA, 6201 /BECOMES ENTRY POINT JMP ERROR3 /FETCH FAILED TAD I A7600 JMS I (200 3 /ENTER STBLK, 7601 /NAME POINTER(BECOMES ST BLK) MLEN, 0 /BECOMES -LENGTH OF FILE JMP ERROR3 /ENTER FAILED TAD STBLK DCA OBLK TAD I A7617 JMS I (200 1 /FETCH INHAN1, 6601 /BECOMES ENTRY POINT JMP ERROR4 /FETCH FAILED TAD (LBUF-1 DCA XR13 /LINE BUFFER POINTER JMS BLGET A7617, 7617 DCA BLEFT1 TAD I (7620 DCA INBLK1 TAD I A7621 SNA JMP DUMP /NO 2ND, JUST DUMP JMS I (200 1 /FETCH INHAN2, 7201 /BECOMES ENTRY POINT JMP ERROR4 /FETCH FAILED JMS BLGET A7621, 7621 DCA BLEFT2 TAD I (7622 DCA INBLK2 JMP DOIT READ, 0 CIF 0 JMS I INHAN1 1000 /FUNCTION (INPUT, 10 PAGES, FIELD 0) IBUFA1, IBUF1 INBLK1, 0 JMP ERROR5 /INPUT #1 ERROR TAD IBUFA1 DCA IWD1 TAD IBUFA2 DCA IWD2 TAD (4 TAD INBLK1 DCA INBLK1 TAD DUMPSW SZA CLA JMP I READ /ONLY ONE INPUT CIF 0 JMS I INHAN2 1000 IBUFA2, IBUF2 INBLK2, 0 JMP ERROR6 /INPUT #2 ERROR TAD (4 TAD INBLK2 DCA INBLK2 JMP I READ WRITE, 0 CLA CLL TAD (4 TAD MLEN DCA MLEN SZL JMP ERROR2 /NO MORE ROOM CIF 0 JMS I OHANA 5010 /FUNCT. (OUTPUT,10 PAGES,FIELD 1) OBUFA, OBUF /BUFFER ADDRESS OBLK, 0 JMP ERROR7 /OUTPUT ERROR TAD (4 TAD OBLK DCA OBLK JMS OINIT JMP I WRITE PAGE /IF CURRENT LINE IS NON-BLANK (NONBL NOT 0) / OR PREVIOUS LINE WAS NON-BLANK (PREBL NOT 0) / THEN PACK CURRENT LINE BUFFER INTO OUTPUT BUFFER CRLF2, 0 TAD NONBL SNA CLA JMP CR5 /BLANK LINE TAD HOUT SNA CLA JMS HEADER TAD NONBL CMA TAD (LBUF-1 /BUFFER STARTS AT 6000 DCA CHCNT TAD (LBUF-1 DCA XR13 JMP CR2 CR1, TAD I XR13 JMS PACK CR2, ISZ CHCNT JMP CR1 JMS CRLF CR5, TAD (LBUF-1 DCA XR13 /RESET POINTER DCA NONBL JMP I CRLF2 HOUT, 0 NONBL, 0 /NON-BLANK LINE SW CHCNT, 0 OCTOUT, 0 DCA TEMP TAD I OCTOUT DCA WPAK TAD (-4 DCA DIGCNT Q6, TAD TEMP RTL RAL DCA TEMP TAD TEMP RAL AND (7 TAD (260 JMS I WPAK ISZ DIGCNT JMP Q6 ISZ OCTOUT JMP I OCTOUT WPAK, 0 TEMP, 0 DIGCNT, 0 MESOUT, 0 TAD I MESOUT ISZ MESOUT DCA XR11 MESO1, TAD I XR11 SNA JMP I MESOUT JMS PACK JMP MESO1 PACK, 0 /OS/8 OUTPUT PACKING ROUTINE AND (377 JMP I PSW PSW, .+2 JMP I PACK DCA I OWD /1ST OF TRIP JMS PSW DCA PSAV /2ND OF TRIP JMS PSW DCA PSW /3RD OF TRIP TAD PSW CLL RTL RTL AND (7400 TAD I OWD DCA I OWD /PACK 1ST HALF OF PAIR ISZ OWD TAD PSW CLL RTR RTR RAR AND (7400 TAD PSAV DCA I OWD /PACK 2ND HALF ISZ OWD ISZ OCNT JMP PBACK JMS WRITE /BUFFER FULL PBACK, JMS PSW JMP PSW+2 PSAV, 0 LINOUT, 0 TAD (-3 DCA BUNCH TAD IWD1 AND (377 JMS OCTOUT LPACK LIN5, TAD (-4 DCA GROUP TAD (240 DCA I XR13 /LPACK LIN6, TAD (240 DCA I XR13 /LPACK JMS COMPAR ISZ GROUP JMP LIN6 ISZ BUNCH JMP LIN5 JMP I LINOUT BUNCH, 0 GROUP, 0 PAGE DUMP, ISZ DUMPSW TAD I (7646 DCA MASK TAD I (7644 /CHECK FOR /S AND (40 SNA CLA JMP DOIT ISZ CDMP+1 /MAKE THE "CMA" A "CIA" TAD (TAD MASK / & CHANGE THE "AND" TO A DCA CDMP+2 / "TAD". DOIT, TAD RELBLK /IS IT A MULTIPLE OF 4? AND (3 SNA CLA /NO, SKIP THE READ JMS READ /YES, REFILL BUFFERS DO1, DCA HOUT /=0 HEADER NOT YET OUT TAD (-25 DCA LNCNT DO2, JMS LINOUT JMS CRLF2 ISZ LNCNT JMP DO2 CLA STL RTL JMS LINOUT JMS CRLF2 ISZ BLEFT2 JMP DO3 ISZ DUMPSW /2ND FILE EMPTY TAD I (7646 DCA MASK DO3, ISZ RELBLK /BUMP RELATIVE BLK # ISZ BLEFT1 JMP DOIT TAD DUMPSW /1ST FILE EMPTY SZA CLA JMP DONE JMS MESOUT /2ND LONGER THAN 1ST MESE-1 JMS CRLF DONE, TAD ANYOUT SZA CLA JMP DONE1-1 JMS MESOUT MESN-1 /'NOTHING OUTPUT' JMS CRLF TAD (232 /^Z DONE1, JMS PACK TAD OWD CIA TAD OBUFA SZA CLA /DUMPED BUFFER YET? JMP DONE1 /NO--FILL WITH 0'S TAD STBLK CIA TAD OBLK DCA NOUT TAD I (7600 JMS I (200 4 /CLOSE 7601 /NAME PTR NOUT, 0 /# BLKS IN OUTPUT JMP ERROR8 /CLOSE FAILED!! GIVEUP, CDF CIF 0 JMP I (7600 /RETN TO OS/8 COMPAR, 0 CDF 0 TAD DUMPSW SZA CLA JMP CDMP TAD I IWD1 AND MASK DCA TMP TAD I IWD2 AND MASK CIA TAD TMP SZA CLA JMP COMB /DIDN'T MATCH, DUMP IT / COMC, CDF 10 TAD (240 DCA I XR13 /LPACK TAD (240 DCA I XR13 TAD (240 DCA I XR13 TAD (240 DCA I XR13 COMA, ISZ IWD1 ISZ IWD2 JMP I COMPAR / /IN SEARCH ("/S" SPECIFIED), THE "CMA" IS CHANGED / TO "CIA", THE "AND" IS CHANGED TO A "TAD", AND / THE WORD MUST BE EQUAL TO THE MASK TO MATCH. / CDMP, TAD I IWD1 /IN DUMP, MASK BITS MUST BE CMA AND MASK / ON IN DATA. SZA CLA /SAME, DUMP IT JMP COMC /DIFF, SPACE IT COMB, TAD I IWD1 CDF 10 JMS OCTOUT LPACK TAD XR13 /NOT 0 IF NON-BLANK OUTPUT DCA NONBL / ON THIS LINE. JMP COMA PAGE CRLF, 0 TAD (215 JMS PACK TAD (212 JMS PACK ISZ LINES JMP I CRLF TAD (214 /FORM FEED JMS PACK TAD (-70 DCA LINES JMP I CRLF LINES, -70 LPACK, 0 DCA I 13 JMP I LPACK OINIT, 0 TAD OBUFA DCA OWD TAD (-1000 DCA OCNT JMP I OINIT BLGET, 0 TAD I BLGET /GET ADDR ISZ BLGET DCA OINIT TAD I OINIT /GET DATA FROM ADDR RTR RTR AND (377 SZA TAD (7400 JMP I BLGET /ROUTINE TO SET NO-RESTART BIT IN JSW AND SET UP / THE MASK. SETUP, 0 TAD I (7623 /A 3RD INPUT SPECIFIED? SZA CLA JMP ERROR1 /YES, BAD! JMS OINIT /OK, SET UP POINTERS CDF 0 TAD I (7746 CMA AND (6777 CMA DCA I (7746 CDF 10 /RESET D.F. TAD I (7646 /GET 1ST "=" WORD SNA /USE AS IS IF NON-0 CMA / OTHERWISE USE ALL 1'S. DCA MASK /SET UP THE MASK DCA RELBLK /SET THESE TO 0 DCA DUMPSW JMP I SETUP HEADER, 0 JMS CRLF JMS CRLF JMS MESOUT MESB-1 /'RELATIVE BLOCK ' TAD RELBLK JMS OCTOUT PACK JMS MESOUT MESL-1 /' ( ABSOLUTE BLOCK ' TAD RELBLK /ABS. BLK= REL. BLK TAD I (7620 / + START BLK. JMS OCTOUT PACK TAD DUMPSW SZA CLA JMP HE1 /ONLY ONE FILE JMS MESOUT MESS-1 /' AND ' TAD RELBLK TAD I (7622 /AS ABOVE JMS OCTOUT PACK HE1, JMS MESOUT MESR-1 /' )' JMS CRLF ISZ HOUT /NOT 0, HEADER OUTPUT ISZ ANYOUT /0, NOTHING OUTPUT JMP I HEADER ANYOUT, 0 PAGE ERROR8, ISZ ERROR ERROR7, ISZ ERROR ERROR6, ISZ ERROR ERROR5, ISZ ERROR ERROR4, ISZ ERROR ERROR3, ISZ ERROR ERROR2, ISZ ERROR ERROR1, ISZ ERROR ERROR0, JMS I (200 7 /ERROR ERROR, 0 /ERROR NUMBER CDF CIF 0 JMP I (7600 /ALWAYS RETURN TO SYSTEM. MESB, 322 /'RELATIVE BLOCK ' 305 314 301 324 311 326 305 240 302 314 317 303 313 240 0 MESE, 306 /'FILE 2 IS LONGER THAN FILE 1!' 311 314 305 240 262 240 311 323 240 314 317 316 307 305 322 240 324 310 301 316 240 306 311 314 305 240 261 241 0 MESL, 240 /' ( ABSOLUTE BLOCK ' 240 240 250 240 301 302 323 317 314 325 324 305 240 302 314 317 303 313 240 0 MESN, 316 /'NOTHING OUTPUT' 317 324 310 311 316 307 240 317 325 324 320 325 324 0 MESR, 240 /' )' 251 0 MESS, 240 /' AND ' 301 316 304 240 0 $$$$$ |
> > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $JOB TO MAKE OS/8 BASIC ACCEPT LOWERCASE INPUT /ELIMINATES MAP OF UNDERSCORE KEY TO RUBOUT .R FUTIL SET MODE SAVE SET DEVICE SYS FILE BASIC.SV 0.243/ IF C-7450 7540 0.244/ IF C-5320 1372 0.372/ 7740 WRITE END EXIT $END OF JOB TO INSTALL LC PATCH TO BASIC |
> > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $JOB TO MAKE OS/8 BASIC REJECT LOWERCASE INPUT /RESTORES MAP OF UNDERSCORE KEY TO RUBOUT .R FUTIL SET MODE SAVE SET DEVICE SYS FILE BASIC.SV 0.243/ IF C-7540 7450 0.244/ IF C-1372 5320 WRITE END EXIT $END OF JOB TO INSTALL UC PATCH TO BASIC |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | / / / D L O G / - - - - / / VERSION 5A 4-27-77 PT / /LOGE(X) / /X=2^N*F / /LOGE(X) /= N*LOGE(2)+LOGE(F) / / SECT DLOG JA #DALOG DPCHK / /IF X<=0 - IT IS AN ERROR EXTERN #ARGER DALERR, TRAP4 #ARGER / TEXT +DLOG + DALXR, SETX XRDAL SETB BPDAL BPDAL, F 0.0 XRDAL, F 0.0 F 0.0 ORG 10*3+BPDAL FNOP JA DALXR 0 DALRTN, JA . N, F 0.0 F 0.0 F, F 0.0 F 0.0 DAL1, F 1.0 F 0.0 / DT7, 7776 /1/7 2222 2222 2222 2222 2221 DT6, 7776 /-1/6 5252 5252 5252 5252 5252 DT5, 7776 /1/5 3146 3146 3146 3146 3146 DT4, 7776 /-1/4 4000 0 0 0 0 DT3, 7777 /1/3 2525 2525 2525 2525 2524 DT2, 7777 /-1/2 4000 0 0 0 0 / A0, F 1.84375 F 0.0 A1, F 1.65625 F 0.0 A2, F 1.500 F 0.0 A3, F 1.375 F 0.0 A4, F 1.250 F 0.0 A5, F 1.1875 F 0.0 A6, F 1.09375 F 0.0 A7, F 1.03125 F 0.0 LA0, 0 /.6118015411059928976 2344 7603 2325 4250 3144 LA1, 0 /.5045560107523952859 2011 2512 4551 3503 7657 LA2, 7777 /.4054651081081643810 3174 6217 5457 7141 1370 LA3, 7777 /.3184537311185346147 2430 3057 0207 0573 0232 LA4, 7776 /.2231435513142097553 3443 7737 0746 5150 4146 LA5, 7776 /.1718502569266592214 2577 6301 6051 7117 2356 LA6, 7775 /.08961215868968712374 2674 1512 1271 2655 1272 LA7, 7773 /.030771658666753687 3740 5154 1636 0313 7764 D16, F 16.0 F 0.0 D8, F 8.0 F 0.0 CUM, F 0.0 F 0.0 DLOGE2, 0 2613 4413 7676 4347 5715 / /PICK UP X BASE 0 #DALOG, STARTD FLDA 10*3 FSTA DALRTN FLDA 0 SETX XRDAL SETB BPDAL BASE BPDAL LDX 1,1 FSTA BPDAL FLDA% BPDAL,1 /ADDRESS FSTA BPDAL STARTE FLDA% BPDAL /AND X JLE DALERR /X <= 0 IS ERROR FSUB DAL1 /SUB 1.0 JNE DALA FCLA /LOG(1)=0 JA DALRTN / DALA, FLDA% BPDAL /GET ARGUMENT BACK FSTA XRDAL /STORE AT X /EXPONENT STORED IN XR0 /MANTISSA STORED IN XR1-5 /PICK UP EXP + MULTIPLY BY LOGE(2) / XTA 0 FMUL DLOGE2 FSTA N /N*LOGE(2) /XRDAL IS NOW FRACTION IN RANGE .5<=F<1.0 /COMPUTE LOG(F) BY /LOG(F)=LOG(A(K1)*A(K2)...(F))-(LOG(A(K1))+ / LOG(A(K2))...) /FIT F IN A 1/16 RANGE /I.E. 1/2-9/16,9/16-10/16,ETC. /MULTIPLY F BY APPROPRIATE A(K) MULTIPLIER /KEEP RUNNING SUM OF LOG(A(K)) /CONTINUE UNTIL F>1 / LDX 0,0 FLDA XRDAL FSTA F FCLA FSTA CUM DALB, FLDA F FMUL D16 /16 REAL PARTS FSUB D8 /NEED JUST 8 ATX 1 FLDA A0,1 /GET MULTIPLIER FMULM F FLDA LA0,1 /ADD LOG(A(K)) TO SUM FADDM CUM FLDA F FSUB DAL1 JLT DALB /NOW F>1. USE TAYLOR SERIES /LOG(T)=Z-(Z^2)/2+(Z^3)/3+... WHERE Z=T-1 FLDA F FSUB DAL1 /F-1.0 FSTA F FMUL DT7 FADD DT6 FMUL F FADD DT5 FMUL F FADD DT4 FMUL F FADD DT3 FMUL F FADD DT2 FMUL F FADD DAL1 FMUL F FSUB CUM FADD N JA DALRTN |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | $JOB TO MAKE OS/8 ACCEPT LOWERCASE INPUT /REPLACES THE 'LINEFEED ECHO' OPTION, SO /SHOULD ONLY BE USED ON VIDEO TERMINALS. .R FUTIL 11.233/ IF C-1344 1207 11.263/ IF C-2020 1034 11.264/ IF C-5267 5344 11.344/ IF C-4561 1354 11.345/ IF C-3413 7500 11.346/ IF C-1163 1353 11.347/ IF C-4423 1352 11.350/ IF C-1160 3034 11.351/ IF C-3017 5270 11.352/ IF C-1417 0340 11.353/ IF C-7450 7740 11.354/ IF C-5324 7440 COMMENT: END OF KBM PATCH 53.50/ IF C-5366 5207 53.156/ IF C-2024 1025 53.157/ IF C-5362 1220 53.160/ IF C-1102 7500 53.161/ IF C-4466 1367 53.162/ IF C-3024 1370 53.163/ IF C-1025 3025 53.164/ IF C-4466 1025 53.165/ IF C-5755 4466 53.166/ IF C-4312 5755 53.167/ IF C-3415 7740 53.170/ IF C-1101 0340 COMMENT: END OF CD PATCH WRITE END EXIT $END OF JOB TO INSTALL LC PATCH |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | $JOB TO MAKE OS/8 REJECT LOWERCASE INPUT /RE-INSTALLS THE 'LINEFEED ECHO' OPTION. .R FUTIL 11.233/ IF C-1207 1344 11.263/ IF C-1034 2020 11.264/ IF C-5344 5267 11.344/ IF C-1354 4561 11.345/ IF C-7500 3413 11.346/ IF C-1353 1163 11.347/ IF C-1352 4423 11.350/ IF C-3034 1160 11.351/ IF C-5270 3017 11.352/ IF C-0340 1417 11.353/ IF C-7740 7450 11.354/ IF C-7440 5324 COMMENT: END OF KBM PATCH 53.50/ IF C-5207 5366 53.156/ IF C-1025 2024 53.157/ IF C-1220 5362 53.160/ IF C-7500 1102 53.161/ IF C-1367 4466 53.162/ IF C-1370 3024 53.163/ IF C-3025 1025 53.164/ IF C-1025 4466 53.165/ IF C-4466 5755 53.166/ IF C-5755 4312 53.167/ IF C-7740 3415 53.170/ IF C-0340 1101 COMMENT: END OF CD PATCH WRITE END EXIT $END OF JOB TO INSTALL UC PATCH |
︙ | ︙ | |||
8 9 10 11 12 13 14 | 11.264/ IF C-5344 5267 11.344/ IF C-1354 4565 11.345/ IF C-7500 3413 11.346/ IF C-1353 | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 11.264/ IF C-5344 5267 11.344/ IF C-1354 4565 11.345/ IF C-7500 3413 11.346/ IF C-1353 1104 11.347/ IF C-1352 4423 11.350/ IF C-3034 1164 11.351/ IF C-5270 3017 11.352/ IF C-0340 |
︙ | ︙ |
︙ | ︙ | |||
33 34 35 36 37 38 39 40 41 42 43 44 45 46 | * All of this module's other external interfaces are only called * by the other gpio-* modules, from the GPIO thread. */ #include "pidp8i.h" #include <config.h> #include <pthread.h> #include <sys/file.h> #include <sys/time.h> #include <ctype.h> #include <errno.h> | > > > > | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | * All of this module's other external interfaces are only called * by the other gpio-* modules, from the GPIO thread. */ #include "pidp8i.h" #include <config.h> #if defined(HAVE_BCM_HOST_H) # include <bcm_host.h> #endif #include <pthread.h> #include <sys/file.h> #include <sys/time.h> #include <ctype.h> #include <errno.h> |
︙ | ︙ | |||
231 232 233 234 235 236 237 | } pidp8i_gpio_present = 0; } } //// bcm_host_get_peripheral_address /////////////////////////////////// | < < < < < < | < | < < < < < < < < < < < < | | < < | < < < | 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | } pidp8i_gpio_present = 0; } } //// bcm_host_get_peripheral_address /////////////////////////////////// // Provide fallback for non-Pi case to avoid a link error. #if !defined(HAVE_BCM_HOST_H) static unsigned bcm_host_get_peripheral_address(void) { return 0; } #endif //// DOUBLE BUFFERED DISPLAY MANIPULATION FUNCTIONS //////////////////// //// swap_displays //////////////////////////////////////////////////// // Clear the current "paint-from" display, then exchange the double- // buffered display pointers atomically, saving the current update-to |
︙ | ︙ |
︙ | ︙ | |||
135 136 137 138 139 140 141 | printf ("Relaunching %s with %s...\r\n", self_path, script_path); detach_all (0, TRUE); printf ("All devices detached...\r\n"); if (use_pidp8i_extensions) { stop_pidp8i_gpio_thread (); printf ("GPIO thread topped...\r\n"); } | | | 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | printf ("Relaunching %s with %s...\r\n", self_path, script_path); detach_all (0, TRUE); printf ("All devices detached...\r\n"); if (use_pidp8i_extensions) { stop_pidp8i_gpio_thread (); printf ("GPIO thread topped...\r\n"); } execlp (self_path, self_path, script_path, NULL); return 0; } else { // That boot script doesn't exist or isn't readable. // // Fall through to the "exit" command builder below because // we don't want to keep coming back in here at host CPU |
︙ | ︙ |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 | / FUNCTION PACKAGE FOR 12K U/W-FOCAL: -JVZ- / 12KFNS.PA /REVISIONS: / TAD TXTEND CHANGED TO TAD BUFEND AT 14447 1/3/79 / FCOM AND FRA: RANDOM ACCESS FUNCTIONS /THE 'FCOM' FUNCTION PROVIDES ACCESS TO DATA ARRAYS IN FIELD /2 (OR 4) USING EITHER OF 2 STORAGE MODES: SIGNED DOUBLE PRE- /CISION OR 4-WORD FLOATING-POINT. THE STORAGE MODE IS DETER- /MINED BY THE SIGN OF THE 'FCOM' INDEX. POSITIVE INDICES /(0-1023) ACCESS FLOATING-POINT NUMBERS WHILE NEGATIVE VALUES /REFERENCE DOUBLE PRECISION INTEGERS IN THE SAME WAY THAT THE /KE-8E EAE DOES IT. STORAGE BEGINS AT THE TOP OF THE FIELD & /EXTENDS DOWNWARD TOWARD THE TEXT AREA. THIS PROVIDES A REA- /SONABLE TRADEOFF BETWEEN LARGE DATA ARRAYS AND LONG PROGRAMS. /THE VALUE OF THE 'FCOM' FUNCTION IS JUST THE VALUE OF THE /VARIABLE AT THE LOCATION REFERENCED. TO STORE A NEW VALUE /AT THAT LOCATION, SIMPLY INCLUDE A SECOND PARAMETER IN THE /FUNCTION CALL; THE VALUE OF THIS EXPRESSION WILL THEN BE /PLACED IN THE ARRAY AT THE SPECIFIED LOCATION. DATA CON- /VERSION BETWEEN INTEGER AND FLOATING-POINT MODES IS AUTO- /MATIC. EXAMPLES: SET X(I)=FCOM(I+100); X FCOM(J,FSIN(J)) /THE 'FRA' FUNCTION PROVIDES 'FCOM-LIKE' ACCESS TO DATA ARRAYS /STORED IN BINARY FORM ON ANY MASS-STORAGE DEVICE. SEVERAL /DATA MODES ARE AVAILABLE: SINGLE WORD (SIGNED OR UNSIGNED), /DOUBLE PRECISION AND 4-WORD FLOATING POINT. A DIFFERENT /INDEXING SCHEME IS EMPLOYED TO HANDLE ALL THESE MODES. /THE FILE USED BY FRA MUST FIRST BE LOOKED UP USING THE /'OPEN INPUT' COMMAND. FOLLOWING THIS 'FRA' MUST BE INITIAL- /IZED SO THAT THE NECESSARY POINTERS CAN BE TRANSFERRED AND /THE DATA FORMAT SELECTED. THE FOLLOWING TYPES OF CALLS ARE /PERMITTED: (I IS NON-NEGATIVE, V IS ANY EXPRESSION) / FRA(I) READ THE I-TH VALUE / FRA(I,V) STORE V IN THIS LOCATION / FRA(-1) UPDATE THE LAST BLOCK / FRA(-1,M) INITIALIZE AND SET THE DATA MODE /THE VALUE OF 'M' DETERMINES THE DATA MODE: / M=0 UNSIGNED INTEGERS / M=1 SIGNED INTEGERS / M=2 DOUBLE PRECISION / M=4 4-WORD FLOATING-POINT /'FRA' RETURNS 0 WHEN CALLED WITH A NEGATIVE INDEX. /'FRA' USES ITS OWN ROUTINES FOR MODES 0-1, AND THE 'FCOM' /ROUTINES FOR MODES 2 & 4. BOTH FUNCTIONS ARE COMPLETELY /RECURSIVE, I.E. THEY MAY BE USED AS ARGUMENTS OF THEMSELVES. PAGE 21 /PRECEEDING THE 8K FUNCTIONS FRA, TAD HORD /CHECK SIGN OF THE INDEX SPA CLA /INITIALIZATION? JMP INITL /YES, OR UPDATE FIXIT R3, CLA CLL RTL /=7306 PUSHF /SAVE THE INDEX FLAC TSTCMA /READ OR WRITE? JMP .+4 /READ PUSHJ /WRITE EVAL /EVALUATE THE EXPRESSION TAD P13 /ALTER THE INSTRUCTION DCA REED POPF /RECALL THE INDEX FLOP TAD SHIFTS DCA LAST1 JMS I R3 /SHIFT RIGHT ONE BIT ISZ LAST1 JMP .-2 TAD (BLKNO&0 /FIRST BLOCK OF THIS FILE SNA ERROR2 /FILE NOT AVAILABLE TAD AC1L /THIS IS NOW THE RELATIVE BLOCK # CIA TAD ARG3 /IS IT THE SAME AS THE LAST ONE? SNA CLA JMP CORE /YES, DATA IS IN CORE JMS LAST1 /CHECK FOR ANY UPDATES TAD (FLNGTH /FILE SIZE STL CIA TAD AC1L SNL CLA /IS THIS A LEGAL INDEX? ERROR2 /NO, IT'S TOO LARGE TAD AC1L TAD (BLKNO&0 DCA ARG3 /SET THE NEW BLOCK NUMBER JMS DISK /AND READ IT IN CORE, TAD REED /R OR W? SZA CLA DCA DISK /SET THE 'CHANGE' FLAG TAD REED TAD WRIT /SET UP THE PROPER EXIT DCA REED TAD OVR1 /DEVELOP THE BUFFER ADDRESS CLL RTR CLL RTR TAD (3200-1 /BUFFER ADDRESS CDF DCA XRT REED, JMP W0 /NOW FOR THE EASY PART! WRIT, JMP R0 /OR ELSEWHERE... INITL, TSTCMA /UPDATE OR INITIALIZE? JMP FINAL /UPDATE PUSHJ EVAL FIXIT /GET THE DATA MODE TAD M4 SNA CLL IAC SZL /0-4? (EXCLUDING 3) ERROR2 /MODE ERROR TAD (-15 STL RAR /DETERMINE THE SHIFT COUNT DCA SHIFTS TAD LORD STL RAL TAD JMPR0 /AND THE PROPER R/W ROUTINE DCA WRIT CDF /NOW GET THE POINTERS TAD I ATSW /=BLKNO DCA (BLKNO&0 TAD I (ILNGTH DCA (FLNGTH TAD I W0+1 /=INHND DCA (HANDLR CDF P FINAL, JMS LAST1 /UPDATE THE LAST BLOCK DCA ARG3 FLOATR DISK, NOP /READ/WRITE SUBROUTINE TAD C200 /= 1 BLOCK IN FIELD 0 DCA ARG1 CIF /GO BELOW I0F /OR 'NOP' JMS I (HANDLR /CALL THE (INPUT) HANDLER ARG1, 200 3200 ARG3, 0 JMP W3 /DEVICE ERROR I0N JMP I DISK LAST1, 0 /CHECK FOR CHANGES & UPDATE TAD DISK /HAVE WE WRITTEN ANYTHING? SZA CLA JMPR0, JMP .+3 /NO SM0 /YES JMS DISK /RESET THE FLAG JMP I LAST1 /AND REALLY DO IT /HERE ARE ALL THE READ AND WRITE ROUTINES: R0, TAD I XRT /UNSIGNED INTEGERS FL0ATR R1, TAD I XRT /SIGNED INTEGERS FLOATR R2, TAD W0 /DOUBLE PRECISION DCA EXP JMP I .+1 GET+6 R4, JMP I .+1 /FLOATING POINT GET+2 SHIFTS, 0 /SEPARATES THE LISTS BY 13 W0, 27 /SINGLE PRECISION INHND /<1000(8) W1, FIXIT /SIGNED OR UNSIGNED JMP I (GET-2 W2, JMP I .+1 PUT+6 W3, CIF /GENERATE ?29.70 JMP I R3 W4, JMP I .+1 PUT PAGE /FCOM: STORAGE FUNCTION FOR DATA ARRAYS FCOM, FIXIT /FIX INDEX AND SET EXP, OVER PUSHA /SAVE INDEX ON THE STACK TSTCMA /CHECK FOR A SECOND ARGUMENT JMP GET PUSHJ /GET THE ARGUMENT EVAL JMS INDEX /COMPUTE THE INDEX JMP .+7 /IT WAS NEGATIVE PUT, TAD EXP /FLOATING STORAGE DCA I XRT TAD OVER DCA I XRT TAD LORD SKP FIXIT /INTEGER STORAGE DCA I XRT TAD HORD DCA I XRT RETURN /FUNCTION RETURN GET, JMS INDEX /FIGURE IT OUT JMP .+5 /NOTE: EXP=27, OVER=0 TAD I XRT /FLOATING RETRIEVAL DCA EXP TAD I XRT DCA OVER TAD I XRT /INTEGER RETRIEVAL DCA LORD TAD I XRT DCA HORD RETURN /'RETURN' FLOATS INTEGERS NOP INDEX, 0 /COMPUTE INDEX AND BRANCH POPA /EXAMINE THE ARGUMENT SPA /FLOATING JMP .+3 /INTEGER ISZ INDEX /SET POSITIVE RETURN CMA CLL RAL /-(I+1)*4 FOR FLOATING CLL RAL /*2 FOR INTEGER STORAGE STL CMA TAD BUFEND /'IAC' IF LAST PAGE FREE TAD BUFR /'NOP' FOR 20K SYSTEM SNL SZA /CHECK TEXT LIMIT ERROR2 /FCOM INDEX EXCEEDED RANGE CMA /SUBTRACT ONE TAD BUFR /'NOP' FOR 20K SYSTEM DCA XRT /LOAD INDEX REGISTER CDF T /'CDF 40' FOR 20K JMP I INDEX /NOTE: 'INDEX' IS EASILY CHANGED TO STORE IN FIELDS 4-7. /THIS PATCH MODIFIES THE 'INDEX' ROUTINE SO THAT POSITIVE /INDICES FROM 0-2047 MAY BE USED TO ADDRESS ALL LOCATIONS /IN FIELDS 4 & 5. THE 'NEGATIVE INDEX' FEATURE HAS BEEN /ELIMINATED: ONLY FLOATING-POINT STORAGE IS AVAILABLE. NOPUNCH *PUT-1 NOP /ELIMINATE THE 'NEG.' RETURN *GET CDF 40 /USE THIS LOC. FOR A CONSTANT JMS INDEX /AND MOVE THIS DOWN ONE *INDEX+2 SPA /CHECK STORAGE LIMIT JMP .+10 /KEEP THE SAME ERROR CODE CLL RTL /MULTIPLY THE INDEX BY 4 SZA /LEAVING THE FIELD INFO CIA /IN THE LINK CMA /SUBTRACT ONE DCA XRT /AND SAVE THE INDEX RTL /SHIFT THE FIELD BIT OVER SKP ERROR2 /INDEX GREATER THAN 2047(10) RTL TAD GET /ADD THE 'CDF' INSTRUCTION DCA .+1 /THIS PATCH MODIFIES THE 'INDEX' ROUTINE SO THAT POSITIVE /INDICES FROM 0-4095 MAY BE USED TO ADDRESS ALL LOCATIONS /IN FIELDS 4-7. THE 'NEGATIVE INDEX' FEATURE HAS BEEN /ELIMINATED: ONLY FLOATING-POINT STORAGE IS AVAILABLE. *PUT-1 NOP /ELIMINATE THE 'NEG.' RETURN *GET CDF 40 /USE THIS LOC. FOR A CONSTANT JMS INDEX /AND MOVE THIS DOWN ONE *INDEX+2 CLL RTL /MULTIPLY THE INDEX BY 4 DCA XRT /LEAVING THE FIELD INFO IAC /IN BIT 11 AND THE LINK AND XRT RTL /SHIFT THE FIELD BITS OVER RTL TAD GET /ADD THE 'CDF' INSTRUCTION DCA .+6 /AND SAVE FOR LATER SM2 /=7776 AND XRT /CLEAN UP THE INDEX CIA CMA /SUBTRACT ONE ENPUNCH;*.+3 /THE CHANGES ARE CONSTRUCTED SO THAT THEY DO NOT INTER- /FERE WITH 'FRA' WHICH USES SOME OF THE 'FCOM' ROUTINES. /THE 'HESITATE' COMMAND PROVIDES A PROGRAMMABLE PAUSE TO /BE USED WHENEVER IT IS NECESSARY TO SYNCHRONIZE THE PRO- /GRAM WITH AN EXTERNAL DEVICE. THE TIMING IS PROVIDED BY /A SOFTWARE LOOP WHICH MUST BE ADJUSTED FOR DIFFERENT MA- /CHINES. ASSEMBLY OPTIONS ARE PROVIDED FOR THE 8/E AND /8/I AND OTHERS ARE EASILY PATCHED. TIMES ARE EXPRESSED /IN MILLISECONDS, SO 'H 1000' PROVIDES A 1 SECOND DELAY. HESI, PUSHJ /PARAMETER = DELAY TIME EVAL / (IN MILLISECONDS) NEGATE SZL /ZERO OR MISSING ARGUMENT? CONTINUE /AVOID A 4HR 40MIN DELAY ! FIXIT /CONVERT TO DOUBLE PRECISION SNA /1ST CYCLE MAY BE A BIT OFF TAD TATE /GET LOOP CONSTANT IAC /COUNT DOWN SNA /DONE? ISZ LORD /1.003 MS PER MAJOR CYCLE JMP .-5 /TIMES THE NUMBER OF CYCLES ISZ HORD JMP .-6 CONTINUE /RETURN TO MAINLINE TATE, IFDEF TFLI <-320> /1.2 USEC (8/E) IFNDEF TFLI <-234> /1.6 USEC (8/I) ///// / FUNCTION PACKAGE FOR 8K U/W-FOCAL: -JVZ- /THESE FUNCTIONS ARE BASED ON THE SERIES APPROXIMATIONS DE- /VELOPED BY D.A. DALBY AND D.E. WELLS OF THE BEDFORD INSTI- /TUTE OF OCEANOGRAPHY, DARTMOUTH, NOVA SCOTIA (DECUS 8-103) /WHILE EXHAUSTIVE TESTING HAS NOT BEEN CARRIED OUT, TYPI- /CALLY THE RESULTS ARE CORRECT TO CA. 3 IN THE TENTH DIGIT. *4600-12 /EXPONENTIAL CONSTANTS: E1, +0;4000;0000;0275 E2, -1;3777;7775;1652 E3, -2;5252;5353;1521 E4, -4;2524;7613;5106 E5, -6;5700;2131;0200 E6, -11;2560;3573;7333 E7, -14;5542;5227;4775 /BASE E EXPONENTIAL FUNCTION: FEXP, CHKSGN /TAKE THE ABSOLUTE VALUE 1 FENT FDIV LN2 /FORM N+F FPUT I FLARGP FEXT NEGATE FIXIT /FORM -N DCA T2 NORMALIZE ///// FENT FADD I FLARGP /FORM F FMUL LN2 FPUT I FLARGP FMUL E7 FADD E6 FMUL I FLARGP FADD E5 FMUL I FLARGP FADD E4 FMUL I FLARGP FADD I X3 FMUL I FLARGP FADD I X2 FMUL I FLARGP FADD I X1 FMUL I FLARGP FADD I X0 FEXT ///// TAD T2 /DIVIDE THE SUM BY 2^N TAD EXP DCA EXP TAD FINISH /POINT TO 'RETURN' DCA CHKARG TAD T3 JMP EXPX /FEXP(X)=1/FEXP(-X) ///// X3, E3 X2, E2 X1, E1 X0, E0 CHKARG, 0 /ARGUMENT CHECK FOR 'FLOG', 'FATN' DCA T2 /SET THE FLIP-FLOP CHKSGN /LOOK AT THE SIGN FIRST JMP I CHKARG /ZERO ISZ CHKARG /NON-ZERO CLA CMA /COMPARE WITH UNITY TAD EXP TAD T2 /.LT. OR .GT. ONE? EXPX, SPA CLA JMP I CHKARG /YOUR CHOICE FENT FPWR FEXP+1 /= -1.7427... FPUT I FLARGP /SAVE THE RECIPROCAL FEXT TAD .-2 JMP I CHKARG /T3=SIGN FLAG, AC=INVERSION FLAG ///// /LOGARITHM CONSTANTS: LN2, +0;2613;4413;7676 L12, -12;4132;5467;5141 L11, -7;3467;0413;5110 L10, -5;4633;3721;5500 L9, -4;3470;0312;3507 L8, -3;4770;3123;3611 L7, -2;2050;7523;5173 /NAPERIAN LOGARITHM FLOG, SM0 /CHECK OUT THE ARGUMENT JMS CHKARG ERROR2 /CAN'T TAKE THE LN OF ZERO DCA T3 CMA TAD EXP FLOAT /FLOAT THE EXPONENT IAC DCA I FLARGP /REPLACE IT WITH 1 NORMALIZE ///// FENT /DO THE SERIES FMUL LN2 FPUT I BUFFPT FGET I FLARGP /JUST THE MANTISSA NOW FSUB I FP1 FPUT I FLARGP /BACK AGAIN! FMUL L12 FADD L11 FMUL I FLARGP FADD L10 FMUL I FLARGP FADD L9 FMUL I FLARGP FADD L8 FMUL I FLARGP FADD L7 / PAGE BOUNDARY FMUL I FLARGP FADD L6 FMUL I FLARGP FADD L5 FMUL I FLARGP FADD L4 FMUL I FLARGP FADD L3 FMUL I FLARGP FADD L2 FMUL I FLARGP FADD L1 FMUL I FLARGP FADD I BUFFPT /ADD N*LN2 FEXT JMP I (EXIT2 /NEGATE RESULT IF NECESSARY /ARCTANGENT FUNCTION FOR ANGLES IN RADIANS FATN, JMS I (CHKARG RETURN /ATN(0)=0 DCA INVRS /SET THE EXIT FENT FMUL FLAC FPUT I BUFFPT /SAVE THE SQUARE FMUL A23 FADD A21 FMUL I BUFFPT FADD A19 FMUL I BUFFPT FADD A17 FMUL I BUFFPT FADD A15 FMUL I BUFFPT FADD A13 FMUL I BUFFPT FADD A11 FMUL I BUFFPT FADD A9 FMUL I BUFFPT FADD A7 FMUL I BUFFPT FADD A5 FMUL I BUFFPT FADD A3 FMUL I BUFFPT FADD A1 FMUL I FLARGP /CONVERT TO ODD POWERS INVRS, FPUT I FLARGP /OR 'FEXT' FGET I (PIOV2 FSUB I FLARGP /ATN(X)=PI/2-ATN(1/X) FEXT JMP I (EXIT2 /TAKE CARE OF THE SIGN ///// /ARCTANGENT CONSTANTS A23, -12;5457;4432;1701 A21, -7;2145;4241;4605 A19, -6;4166;3357;4120 A17, -4;2040;1626;5457 A15, -4;4507;1221;3170 A13, -3;2222;2557;0167 A11, -3;5107;0475;7567 E0, +0;3777;7777/7775 A9, -3;3427;7472;2175 A7, -2;5555;7621;6402 A5, -2;3146;3041;1767 A3, -1;5252;5253;5611 A1, +0;3777;7777;7755 /LOGARITHM CONSTANTS L6, -2;5312;1653;0406 L5, -2;3137;6765;6402 L4, -2;4000;7041;0031 L3, -1;2525;2301;7431 L2, -1;4000;0006;2241 L1, +0;3777;7777;7445 PAGE /EXTENDED PRECISION SIN & COS - TAKEN FROM DEC'S FLOATING- /POINT PACKAGE (R. BEAN) & FOCAL8-231 (DR. H.B. THOMPSON). /THE COEFFICIENTS HAVE BEEN OPTIMIZED FOR U/W-FOCAL (JVZ). FCOS, SM0 /ONLY NEGATE IF POSITIVE JMS I ABSOL /(SUGGESTED BY G. CHASE) FENT FADD PIOV2 /COS(X)=SIN(PI/2-X) FEXT FSIN, CHKSGN /CHECK THE SIGN JMP QUAD1 /ARGUMENT WAS 0 FENT FDIV PIOV2 /CONVERT TO QUADRANTS FPUT I FLARGP FEXT FIXIT /GET THE INTEGER PART AND SC3 /MODULO 4 TAD FSIN+1 DCA QUAD0 /SET UP THE BRANCH JMS FRCT /GET THE FRACTION QUAD0, 0 /AND PROCESS IT FENT FSUB I FP1 /SUBTRACT 1.0 FEXT JMP I QUAD0 NEGATE QUAD1, JMP QUAD5 /USE X QUAD2, JMS QUAD0 /USE 1-X QUAD3, JMP QUAD1-1 /USE -X QUAD4, JMS QUAD0 /USE X-1 QUAD5, FENT /SIX TERM POLYNOMIAL FPUT I FLARGP /SAVE THE ARGUMENT FMUL FLAC FPUT I BUFFPT /SAVE THE SQUARE FMUL C11 FADD C9 FMUL I BUFFPT FADD C7 FMUL I BUFFPT FADD C5 FMUL I BUFFPT FADD C3 FMUL I BUFFPT FADD PIOV2 FMUL I FLARGP /CONVERT TO ODD POWERS FEXT /COMMON EXIT ROUTINE FOR EXTENDED FUNCTIONS EXIT2, TAD T3 /CHECK SIGN JMP FABS+1 /SINE AND COSINE CONSTANTS SC3, 3 C11, -22;4313;2133 C9, -14;2500;3207 C7, -7;5464;5650;4204 C5, -3;2431;5360;3221 C3, +0;5325;0414;3240 PIOV2, +1;3110;3755;2421 /COMMON ROUTINES FOR EXTENDED FUNCTIONS SGNCHK, 0 /ALSO CALLED BY 'GETLN' JMS I ABSOL /TAKE THE ABSOLUTE VALUE FENT FPUT I FLARGP /AND PUT IT BACK AGAIN FEXT TAD SIGN /'FPUT' LEAVES L=1 SZA ISZ SGNCHK /FIRST RETURN = ZERO DCA T3 TAD T3 JMP I SGNCHK /AC,T3 = SIGN OF THE ARGUMENT FRCT, 0 /CALLED BY 'FSIN', 'FRAC' FENT FIXER /='FNOR' FSUB I FLARGP FEXT NEGATE JMP I FRCT /REVISED SQUARE ROOT FUNCTION FSR, LAS SKP /READ THE SWITCH REGISTER FSQT, CHKSGN /BETTER CHECK THE SIGN FLOATR /0 OR SWITCHES SPA CLA /WAS THE ARGUMENT NEGATIVE? ERROR2 /CAN'T TAKE IMAGINARY ROOTS TAD EXP /'CHKSGN' SETS L=1 SMA CLL /USE AN ARITHMETIC SHIFT RAR /DIVIDE EXPONENT BY TWO SZL /TEST IF IT WAS ODD OR EVEN IAC /ODD - ADD ONE DCA EXP TAD M5 /INITIALIZE ITERATION COUNTER DCA T3 SQRT, FENT /NEWTON'S METHOD IS USED FPUT I BUFFPT /SAVE APPROXIMATION FGET I FLARGP /GET BACK THE ARGUMENT FDIV I BUFFPT FADD I BUFFPT FMUL I (FLP5 /DIVIDE BY 2 FEXT ISZ T3 /5 ITERATIONS ARE SUFFICIENT JMP SQRT RETURN FRAC, FIXIT /FIND THE FRACTIONAL PART JMS FRCT RETURN FOUT, FIXIT /SINGLE-CHARACTER OUTPUT SNA SM0 /IN CASE IT'S ZERO PRINTC FSGN, TAD HORD /REAL SIGNUM FUNCTION SZA CLA IAC FLOAT /PREPARE 1.0 FITR, TAD P43 /IMPROVED INTEGER FUNCTION JMS I FRCT+2 /REPLACES 'FIXIT;CLA' (6D) FABS, TAD I (FLARG+1 /CHECK THE ORIGINAL SIGN SPA CLA NEGATE RETURN /ALSO USED BY OTHER FUNCTIONS PAGE 36 /MORE AFTER THE F.P. PACKAGE /THE 'Y' COMMAND ADDS OR SUBTRACTS ONE TO A LIST OF VARI- /ABLES DEPENDING UPON WHETHER THE NAME IS PRECEEDED BY A /MINUS SIGN OR NOT. THUS 'Y I' IS THE SAME AS 'S I=I+1', /WHILE 'Y -I' IS LIKE 'S I=I-1'. SPACES, COMMAS OR MINUS /SIGNS MAY BE USED TO SEPARATE THE NAMES: 'Y N-O,P Q- R' /WILL ADD ONE TO 'N,P,Q' AND SUBTRACT ONE FROM 'O,R'. DECR, GETC /PASS THE MINUS SIGN TAD YNCR+2 /MODIFY THE INSTRUCTION DCA YNCR-3 /'FADD/FSUB I FP1' SPNOR SORTJ /CHECK ON WHAT TO DO YLST-1 YGO-YLST PUSHJ /ERRORS WILL BE TRAPPED HERE GETARG TSTCMA /REMOVE SEPARATORS FADD I FP1 /NOP FENT FGETIPT1 /LOAD THE VARIABLE FADD I FP1 /ADD OR SUBTRACT ONE FPUTIPT1 /STORE IT AWAY AGAIN FEXT YNCR, TAD .-6 /'Y' DO WE HAVE THIS COMMAND? JMP DECR+2 /REPEAT? FSUB I FP1 /BECAUSE THE USERS DEMAND IT! / 'FMIN' & 'FMAX' COMPARE TWO ARGUMENTS, RETURNING THE /LARGER OR SMALLER OF THE TWO. THANKS TO R. MAZUR OF /THE HOCHSHULE DER BUNDESWEHR IN MUENCHEN FOR THE IDEA. FMIN, SM0 /AC=4000 FMAX, PUSHA /REMEMBER THE ENTRY POINT PUSHF /SAVE THE FIRST ARGUMENT FLAC PUSHJ /GET THE SECOND ARGUMENT EVAL-3 POPF /RECALL ARGUMENT NO. 1 BUFFER FENT FSUB I BUFFPT /MAKE THE COMPARISON FEXT POPA /GET THE SWITCH TAD HORD /CHECK THE SIGN SPA CLA TAD .+2 JMP FSFX /GET THE RIGHT ONE & RETURN BUFFPT-FLARGP ///// FIN, READC /SINGLE CHARACTER INPUT TAD CHAR FLOAT /'FLOATR' RETURN ///// /FOCAL STATEMENT FUNCTIONS: F(N,ARG1,ARG2,...) /N IS A LINE OR GROUP NO. (USE A CONVENIENT VARIABLE TO /LABEL THE FUNCTION) AND THE ARGUMENTS REPLACE THE VALUE /OF THE SECRET VARIABLES, BEGINNING WITH '#'. FSF'S ARE /NOT FULLY RECURSIVE SINCE THEY ALL USE THE SAME SECRET /VARIABLES. THE VALUE RETURNED BY THE FUNCTION IS JUST /THE LAST EXPRESSION EVALUATED. *SNA FSF, PUSHJ /EVALUATE THE LINE NUMBER MODEPT /(ARG. IS ALREADY IN FLAC) PUSHF /SAVE LINENO, NAGSW, AND LASTC LINENO TAD FSFP ARG, DCA LASTC TSTCMA /MORE ARGUMENTS? JMP DOF /NO PUSHJ EVAL /GET THE NEXT ONE TAD LASTC DCA PT1 /MUST USE THE VAR. PTR. FENT FPUTIPT1 FEXT TAD GINC TAD LASTC /POINT TO THE NEXT JMP ARG DOF, POPA /RESTORE LINENO & NAGSW DCA LINENO POPA DCA NAGSW PUSHJ /EXECUTE A 'DO' CALL DO+2 POPA /RECALL PREVIOUS POINTER DCA LASTC ISZ PDLXR /DUMP 'FISW' FSFX, TAD (FGET I FLARGP DCA .+2 FENT FGET I FLARGP /GET THE RESULT AGAIN IN CASE FEXT /A 'FOR' COMMAND WIPED IT OUT RETURN ///// FSFP, WORDS^3+STVAR+10/# GETL, GETLN /READ LINE NUMBER FOR 'GTNAME' CDI L JMP NAMEND+2 ///// /IMPROVED RANDOM NUMBER FUNCTION (OMSI) USES A TTY WAIT /LOOP TO INITIALLY SET A RANDOM VALUE. AFTER THE FIRST /INPUT SUCCESSIVE NUMBERS ARE GENERATED FROM THE POWER /RESIDUE ALGORITHM DUE TO P.T. BRADY (DECUS 5-25). SEE /THE DISCUSSION BY G.A. GRIFFITH IN DECUS FOCAL8-1. FRAN, FENT / X(1)=(2^17+3)*X(0) MOD 2^35 FNOR I LEVEL0 / GET PREVIOUS VALUE FGET I (RANDOM+1/ SHIFT LEFT TWELVE FEXT DCA EXP / ZERO THE EXPONENT SHIFTL SHIFTL / SHIFT LEFT FOUR MORE SHIFTL SHIFTL JMS I (DUBLAD / PLUS 3 TIMES ORIGINAL SHIFTL JMS I (DUBLAD FENT FPUT I LEVEL0 / SAVE FOR THE NEXT CALL FEXT CMA CLL RAR /=3777 AND HORD DCA HORD /BE POSITIVE IT'S POSITIVE RETURN ///// VFN, TAD LORD /+HORD /GENERATE A NUMERIC FILE NAME SZA CLA /IS THE ARGUMENT ZERO? SM0 /ROUND UP DCA OVER NORMALIZE SM1 PRINTN /CONVERT TO ASCII CIF L JMP VFR /RETURN WITH STRING ADDRESS ///// LGETC, SNL /'GETC' FOR THE LIBRARY ROUTINES GETC TAD CHAR CDI L JMP MGETC+3 /SAME PAGE, DOWN BELOW ///// GETA, PUSHJ /CALLED BY 'GTNAME', 'O A' & 'O C' EVAL /EVALUATE AN EXPRESSION FIXIT CIF L JMP MGETA-1 /DF=P, L=0 ///// PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 | / U/W-FOCAL VERSION 4E FOR 16K / 16KCPR.PA / REVISIONS: / NEW FLAGS CLEARED AT 13112 - 13126 / COPYRIGHT (C) 1978 - ALL RIGHTS RESERVED BY / LAB DATA SYSTEMS - SEATTLE, WASHINGTON 98125 / **CORE MAP** / (16K VERSION) /FIELD 0: USER AREA, STACK, OS/8 ROUTINES, & I/O BUFFERS /FIELD 1: INTERPRETER, FUNCTIONS, FLOATING POINT PACKAGE /FIELD 2: PROGRAM TEXT ASCENDING - FCOM AREA COMING DOWN /FIELD 3: VARIABLES / ADDITIONAL INSTRUCTION CODES: FENT=JMS I 7 FIXMRI FGET=0000 FIXMRI FADD=1000 FIXMRI FSUB=2000 FIXMRI FDIV=3000 FIXMRI FMUL=4000 FIXMRI FPWR=5000 FIXMRI FPUT=6000 FIXMRI FNOR=7000 FEXT=0000 CDI=CDF CIF FIXTAB / SPECIAL PSEUDO-OPS FOR CROSS-FIELD CALLS: FGETIPT1=FGET I 0 FADDIPT1=FADD I 0 FMULIPT1=FMUL I 0 FPUTIPT1=FPUT I 0 / ASSEMBLY INSTRUCTIONS USING PAL8-V10: / UWF.BN<16KCPR,12KFNS,8KFIO,8KFPP,16KLIB/L/K=100 / EAE VERSION: 8XFIO,8XFPP / FIELD 1 /PROCESSOR FIELD PAGE 0 P134, "\&177 /SCOPE INPUT LIST BELL, "G&277 /MODIFY " " P337, "_ /COMMAND " " CFF, FF CLF, LF CCR, CR TRACE, RO /SEARCH CHAR & TRACE SWITCH FPNT /ADDRESS OF F.P. INTERPRETER /AUTO-INDEX REGISTERS SAVMQ, 0 /INTERRUPT REGISTERS SAVAC, 0 SAVLK, 0 PDLXR, PCHK-1 /PUSHDOWN LIST INDEX REGISTER XRT, 0 /FOR POPF, GETARG, DELETE, FINDLN XRT2, 0 /FOR SORTJ, DELETE, FLOATING PT. AXIN, 0 /INPUT (PACKING) POINTER TEXTP=. AXOUT, 0 /OUTPUT (UNPACKING) REG. GTEM, 0 /UNPACKING TEMP. STORAGE XCT, RANDOM+1 /UNPACKING SWITCH PC, 100 /PROGRAM (LINE) POINTER /PACKING AND STORAGE CONSTANTS BOTTOM, PCHK-1 /BEGINNING OF PDL LEVEL0, RANDOM /BEGINNING OF 'FOR' STACK FORLVL, RANDOM /'FOR' LOOP STACK POINTER HEADER, LINE0 /BEGINNING OF TEXT BUFFER BUFEND, -7557 /LAST PROGRAM LOCATION TXTEND, -7577 /LAST LOCATION FOR INPUT FIRSTV, STVAR /**MASTER LOCATION** SECRTV, STVAR-1 /BEGINNING OF VARIABLES TABEND, -3 /END OF THE SYMBOL TABLE /'E1' FOR 8K, '2200' FOR 12K IFNDEF STVAR <STVAR=0> /'3200' FOR 8K, '2200' FOR 12K /MISCELLANEOUS THINGS CONTINUE=JMP I . /COMMAND RETURN CONT NORMALIZE=JMS I . /NORMALIZE C(FLAC) NORM ABSOL, ABSOLV /TAKE THE ABSOLUTE VALUE RESOL, RESOLV /RESTORE THE PROPER SIGN /FLOATING POINT REGISTERS (LOC *40) SIGN, 0 /FOR ABS VALUE & MUL/DIV T1, 0 /FOR INSTRUCTIONS & F.P.P. T2, 0 /FOR FUNCTIONS & I/O T3, 0 /ARGUMENT SIGN & DEC. EXP. FLAC=. EXP, 0 /FLOATING ACCUMULATOR HORD, 0 LORD, 0 OVER, 0 FLOP=. EX1, 0 /FLOATING OPERAND AC1H, 0 AC1L, 0 OVR1, 0 TELSW, 0 /OUTPUT DONE FLAG INBUF, 0 /INPUT BUFFER (*LOC 55) INDEV, XI33 /POINTER TO INPUT DEVICE OUTDEV, XOUTL /AND OUTPUT DEVICE (TTY) BUFR, LINE1 /NEXT LOCATION IN TEXT BUFFER LASTV, STVAR /NEXT LOCATION IN SYMBOL TABLE PT1, 0 /VARIABLE POINTER THISOP, 0 /CURRENT OP, FN OR VARIABLE NAME LASTOP, 0 /PREVIOUS ARITHEMETIC OPERATION SORTCN, 0 /RELATIVE POSITION IN A LIST CHAR, 0 /THE MOST IMPORTANT REGISTER LINENO, 0 /SET BY 'GETLN' NAGSW, 0 /'NOT ALL' AND/OR 'GROUP' SWITCH LASTC, 0 /FOR 'NEXT', 'ASK', 'ON' & FSF'S FISW, 0 /CODED OUTPUT FORMAT THISLN= THISOP /NOT USED SIMULTANEOUSLY LASTLN= LASTOP /CONSTANTS USEFUL THROUGHOUT FOCAL: P7, 7 /FOR 'FPOW' AND DIGIT MASK P13, 13 /FOR FLOAT AND PDLXR POINTER P177, 177 /STEP MASK & POINTER P43, 43 /35 BITS P77, 77 /RIGHT MASK C100, 100 /CHARACTER TESTS & PC0 P17, 17 /BCD MASK AND CONSTANT C200, 200 /TEST CONSTANT & POINTER C240, 240 /SPACE P7600, 7600 /GROUP MASK & FLARG POINTER FLARGP= P7600 /TEMPORARY STORAGE FOR 'EVAL' M4, -4 /FOR 'GETARG', 'FPOW', & 'FRAN' M5, -5 /FOR 'PRINTN', 'QUIT', ' 'FSQT' M14, -14 /FOR 'LPRTST', 'TESTN' MCR, -CR /FOR 'WRITE','IF','DELETE','PRINTC' FP1, FLTONE /FOR 'FLOG', 'FSIN', 'Y' & 'DBLSUB' GINC, WORDS+2 /FOR 'GETARG', 'TDUMP' & 'FSF'S *.+5 /FOR USER CONSTANTS /TEMPORARY STORAGE HAS ALL BEEN PLACED ON THE LAST /PAGE USING THE COMMAND DECODER AREA FROM 7600-7646. FLARG= 7600 /TEMPORARY FOR 'EVAL' NEXTP= 7604 /TEXT POINTERS FOR 'NEXT' & 'BREAK' BUFFER= 7610 /TEMPORARY FOR FUNCTIONS & OUTPUT RANDOM= 7642 /UPPER LIMIT FOR STACK POINTERS /SYMBOLS USEFUL THROUGHOUT FOCAL: WORDS=4 /HURRAY! DIGITS=12 L=00 /DATA FIELD FOR LIBRARY V=30 /DATA FIELD FOR VARIABLES S=00 /DATA FIELD FOR THE STACK P=10 /DATA FIELD FOR PROCESSOR T=20 /DATA FIELD FOR THE TEXT LF=212 FF=214 CR=215 SP=240 RO=377 /NEW INSTRUCTIONS: PUSHA= JMS I . /SAVE THE AC ON THE STACK XPUSHA POPA= JMS I . /UNLOAD THE STACK XPOPA PUSHJ= JMS I . /CALL A SUBROUTINE XPUSHJ POPJ= JMP I . /RETURN FROM A SUBROUTINE XPOPJ PUSHF= JMS I . /SAVE 4 WORDS XPUSHF POPF= JMS I . /RESTORE THEM XPOPF SORTJ= JMS I . /SORT AND BRANCH ON AC OR CHAR SORTB SORTX= JMS I . /LOOK FOR SP, COMMA, SEMI, CR XSORT TESTC= JMS I . /TEST FOR TERM, FN, NO., OR VAR. CTEST TESTX= JMS I . /TEST FOR TERM AND SET SORTCN XTEST TESTN= JMS I . /TEST FOR PERIOD, NUMBER NTEST READC= JMS I . /READ & ECHO A CHARACTER (AC=0) ECHOC= JMS I . /PRINT C(AC) WHEN ECHO IS ENABLED CHIN PRINTC= JMS I . /PRINT C(AC) OR 'CHAR' (IF AC = 0) CHOUT PRINTD= JMS I . /PRINT A SINGLE DIGIT FROM THE AC OUTDG READN= JMS I . /USE 'FETCH' TO INPUT A NUMBER FLINTP PRINTN= JMS I . /CONVERT BINARY TO ASCII & PRINT ATSW, FLOUTP /FOR 'ASK', 'TYPE', 'FBLK' & 'FRA' PACKC= JMS I . /PACK A CHARACTER PACBUF GETC= JMS I . /UNPACK A CHARACTER BKSW, UTRA /'BREAK' SWITCH SPNOR= JMS I . /IGNORE LEADING SPACES XSPNOR TSTCMA= JMS I . /SKIP IF CHAR=COMMA & MOVE PAST IT CMATST TESTCR= JMS I . /SKIP IF CHAR = CR CRTEST GETLN= JMS I . /COMPUTE A LINE NUMBER (RECURSIVE) XGETLN FINDLN= JMS I . /SEARCH TEXT FOR A GIVEN LINE XFIND PRNTLN= JMS I . /PRINT LINE NUMBER DMPSW, XPRNT /TRACE DISABLE SWITCH DELETE= JMS I . /REMOVE A LINE AND PACEND, XDELETE /RECOVER THE SPACE DCAIAXIN=JMS I . /'DCA I AXIN' IN FIELD T AXIND /FLOATING POINT PSEUDO INSTRUCTIONS: FLOAT= JMS I . /FLOAT THE AC FIGO6 FLOATR= JMP I . /FLOAT THE AC AND RETURN FIN+2 FL0ATR= JMP I . /UNSIGNED FLOAT & RETURN FL0AT RETURN= JMP I . /REGULAR FUNCTION RETURNS FINISH, EFUN3 SHIFTL= JMS I . /MULTIPLY FLAC BY 2 MULT2 NEGATE= JMS I . /COMPLEMENT AND INCREMENT FLAC INVERT FIXIT= JMS I . /CONVERT FLAC TO A 24-BIT INTEGER INTEGER MULT10= JMS I . /MULTIPLY FLAC BY TEN & ADD THE AC XTEN CHKSGN= JMS I . /TAKE ABSOLUTE VALUE + CHECK FOR 0 SGNCHK RTL6= JMS I . /ROTATE THE AC LEFT 6 BETA, XRTL6 /FOR THE PDP12 OVERLAY *.+4 /PATCH AREA PRODUCT=. /FOR SOFTWARE MULTIPLY *176 ERROR2= JMS I . /FIELD 1 ERROR TABCNT, ERROR /ENTRY POINT IS THE TAB COUNTER /DEFINE SOME MICROCODED INSTRUCTIONS: SP1= CLA STL RAL SP2= CLA STL RTL SM0= CLA STL RAR SM1= CMA STL RAL /NO CLA SM2= STA CLL RAL SM3= STA CLL RTL I0N= ION /MAKE THESE EASY TO CHANGE I0F= IOF /OR 'NOP' / COMMAND PROCESSOR FOR VERSION 4 *177 START=. /PROGRAM SELF-START (=7610) BUFFPT, SKP CLA /OUTPUT BUFFER IS AT 17610. JMP I "* /CONSOLE START (FROM 10200) TAD .-1 /ANNOUNCE PRESENCE ECHOC /(DON'T PRINT IF THE ECHO IS OFF) TAD BOTTOM DCA PDLXR /RESET THE STACK POINTERS TAD LEVEL0 DCA FORLVL TAD TXTEND /SET THE INPUT LIMIT DCA I PACEND TAD C100 /SET PC FOR COMMAND MODE DCA PC IBAR, DCA T3 /RESET THE PACKING SWITCH *FF /RETURN FROM LINEFEED TAD BUFR /INITIALIZE THE BUFFER POINTER DCA AXIN /=*CR DCA TRACE /TURN OFF THE TRACE DCA I DMPSW /BUT ENABLE THE TRAP IGNOR, READC /READ THE COMMAND STRING SORTJ P337-1 INLIST-P337 PACKC /SAVE EACH LITTLE CHARACTER JMP IGNOR ///// INLIST, IBAR /B.A. = RESTART IGNOR /F.F. = IGNORE LNFEED /L.F. = RETYPE IRETN /C.R. = TERMINATE ///// IRETN, PACKC /PACK THE CR PACKC /BE SURE ITS ALL THERE TAD BUFEND DCA I PACEND /SET REPACKING LIMIT TAD BUFR /INITIALIZE 'TEXTP' ///// /TEXT BUFFER FORMAT: /#1 : POINTER OR ZERO IN LAST /#2 : LINENO /#3 - #N-1 : TEXT /#N : CR (=7715) /IMMEDIATE AND SEQUENTIAL COMMAND EXECUTION: NEXTLN, DCA AXOUT /SET LINE POINTERS DCA XCT GETC /READ FIRST CHARACTER SPNOR /IGNORE LEADING BLANKS TESTN /DOES THE LINE BEGIN WITH 0-9? SKP /PERIOD: ALLOW GROUP ZERO JMP INPUTX /NO, ITS A DIRECT COMMAND ISZ I DMPSW /YES, KILL TRACE TO PROTECT '?' GETLN /READ THE LINE NUMBER JMS I MODIFY+2 /INITIALIZE THE NEW LINE JMP SRETN /REPACK THE FIRST CHARACTER *"* /FOR 'LINEFEED' M20-1 /MANUAL RESTART ECHOFF, PRINTC /ECHO FF TO CLEAR THE SCREEN JMP IGNOR /(FOR THE SCOPE VERSIONS) GETC /GET THE NEXT CHARACTER SRETN, PACKC /REPACK TESTCR /TEST FOR THE END OF LINE JMP .-3 PACKC /FINISH THE CR DELETE /REMOVE THE OLD LINE, IF ANY CDF T TAD I LASTLN /INSERT NEW ONE DCA I BUFR TAD BUFR DCA I LASTLN TAD T3 /-1 IF CR NEEDED 2ND WORD CIA TAD AXIN /COMPUTE NEW END-OF-BUFFER DCA BUFR CDI L DCA I P77 /SET 'PROGRAM MODIFIED' FLAG JMP 100 /TURN ON INTERRUPTS & RESTART ///// *"? /FOR 'QUIT' VIA 'PACLST' TAD M5 /CREATES 'PUSHJ;GOTO+1' INPUTX, PUSHJ /PROCESS THE IMMEDIATE COMMAND PROC CDF T TAD I PC SNA /END OF THE PROGRAM? JMP START /YES DCA PC /SAVE THE NEW LINE POINTER TAD PC IAC /ADVANCE TO THE LINENO JMP NEXTLN /AND CONTINUE PROCESSING /LINE NUMBER EVALUATION: 'GETLN' XGETLN, 0 /NOW HANDLES NEGATIVE NUMBERS TAD .-1 / AND PERMITS RECURSIVE CALLS PUSHA PUSHJ /EVALUATE THE ARGUMENT EVAL MODEPT, TAD EXP /MODIFY AND FSF ENTRY POINT TAD M5 SMA SZA CLA /.GT. 31? ERROR2 TAD PC /POINT TO THE CURRENT LINE DCA XRT TYPEPT, SM1 /TFRMT ENTRY POINT DCA NAGSW /SET NAGSW FOR 'ALL' CHKSGN /TAKE THE ABSOLUTE VALUE JMP ALL /ZERO=ALL, L=1 FROM 'FPUT' SMA SZA CLA /CHECK THE ORIGINAL SIGN DCA NAGSW /CLEAR SWITCH IF POSITIVE FIXIT /GET THE GROUP NUMBER RTL6 /SHIFT INTO PLACE ('BSW') CLL RAL CDF T /SHIFT TO TEXT BUFFER SNA /RELATIVE ADDRESSING? TAD I XRT /YES, USE CURRENT GROUP AND P7600 DCA LINENO /SAVE GROUP NUMBER NEGATE FENT /RESETS D.F. FADD I FLARGP /SUBTRACT THE GROUP NUMBER FMUL FL100 /SHIFT THE DECIMAL POINT FADD FLP5 /ROUND OFF THE RESULT FEXT FIXIT /LEAVES L=0 ISZ NAGSW /FORCE ZERO FOR NEG LINENO DCA NAGSW /SET 'NOT-ALL/GROUP SWITCH' TAD NAGSW /AC = LINENO IF WE SKIPPED TAD LINENO /COMBINE LINE & GROUP NUMBERS ALL, DCA LINENO POPJ /LINK=1 IF ALL (SET BY CHKSGN) FL100, 7;3100;0 /CONSTANTS FOR 'GETLN' FLP5, 0;2000;ZBLOCK 2 / ALSO USED BY 'FSQT' /LINE NUMBERS MAY RANGE FROM 0 TO +- 31.99 /NEGATIVE NUMBERS FORCE THE 'GROUP' SWITCH. / NAGSW: /ALL= 7777(1) /GROUP= 0000(0) /LINE= 0XXX(0) /'MODIFY' AND 'MOVE' COMMANDS DIFFER ONLY IN THAT 'MOVE' /HAS A SECOND LINE NUMBER (SEPARATED BY A COMMA) WHICH /BECOMES THE LINENO OF THE CORRECTED LINE. THE OLD LINE /REMAINS UNCHANGED IN THIS CASE. MODIFY, GETLN /READ THE FIRST LINENO TSTCMA /PASS THE COMMA IF THERE IS ONE INITLN /'NOP' PUSHJ /OTHERWISE 'EVAL' GIVES ZERO EVAL FINDLN /LOOK UP THE OLD LINE ERROR2 /NOT THERE TAD HORD /TEST SECOND ARGUMENT SZA CLA /NEW LINENO? PUSHJ /YES: 'MOVE' AS WELL AS 'MODIFY' MODEPT /.LT. 1000 SO WE CAN DO THIS MODLN, PRNTLN /'NOP' TO OMIT THE NUMBER ///// JMS INITLN /SAVE LINENO SCONT, JMS I INDEV /GET SEARCH CHARACTER (SILENTLY) DCA TRACE SCHAR, GETC /PLAYBACK TEXT TAD CHAR ECHOC /ALLOW SILENT EDITING SORTJ /LOOK FOR A MATCH CCR-1 LISTGO-CCR PACKC /SAVE THE NEW LINE JMP SCHAR ///// SBAR, JMS INITLN /RESTART AFTER A '_' SFOUND, READC /READ FROM KEYBOARD SORTJ /AND TEST BELL-1 SRNLST-BELL SGOT, SP1 /PROTECT LINENO FROM RUBOUTS PACKC /PACK CHAR JMP SFOUND /MORE ///// SRNLST, SCONT /BELL = CHANGE SEARCH CHARACTER SBAR /B.A. = DELETE LINE TO THE LEFT SCHAR /F.F. = LOOK FOR NEXT OCCURANCE SCONT+1 /L.F. = FINISH THE LINE AS BEFORE LISTGO, SRETN /C.R. = END THE LINE RIGHT HERE SGOT /CHAR = STOP ON SEARCH CHARACTER ///// INITLN, ZBLOCK 2 /INITIALIZE A NEW LINE DCA T3 TAD BUFR /RESET INPUT POINTERS DCA AXIN TAD LINENO /PACK LINENO DCAIAXIN ISZ I DMPSW /KILL THE TRACE JMP I INITLN /USED BY MODIFY, ERASE AND INPUT /OUTPUT THE INDIRECT PROGRAM WEND, POPA /RESTORE TEXT POINTERS DCA CHAR POPF TEXTP DCA I DMPSW /RESTORE TRACE TSTCMA /CHECK FOR MULTIPLE LISTING CONTINUE TAD CCR PRINTC /SEPARATE MULTIPLE CALLS ///// WRITE, GETLN /SET LINENO PUSHF /SAVE TEXT POSITION TEXTP TAD CHAR PUSHA WCONT, FINDLN /SEARCH FOR LINE NUMBER JMP WTESTG /NOT THERE OR GROUP PRNTLN /ALSO DISABLES THE TRACE GETC PRINTC /PRINT A LINE OF TEXT TESTCR /SKIP AT THE END JMP .-3 TAD THISLN /POINT TO THE NEXT LINE WTESTG, JMS GRPCHK /CHECK ITS VALIDITY JMP WEND /LAST ONE OR ONLY ONE TAD LASTLN /STILL IN THE GROUP? SZA CLA PRINTC /SEPARATE GROUPS JMP WCONT /RETURN TO LOOP /DELETE SINGLE LINES, GROUPS OR EVERYTHING ERASE, GETLN /WHICH SHALL IT BE? SZL /ALL? JMP ERA /YES JMS INITLN /SET MEMORY PROTECTION ERG, DELETE /REMOVE A SINGLE LINE TAD LASTLN /WATCH OUT FOR THE END JMS GRPCHK /CHECK IF NEXT LINE IS OK JMP ERX /DONE: CLEAR PROGRAM FLAG JMP ERG /DELETE SOME MORE ///// LINE1 ERA, TAD .-1 /RESET THE COMMAND BUFFER DCA BUFR CDF T /PUT ZERO IN THE FIRST LINE DCA I HEADER ERX, CDI L /AND REMOVE THE PROGRAM NAME JMP NONAME /CLEAR THE SYMBOL TABLE AND/OR SELECTED VARIABLES ZERO, TESTC /CHECK FOR AN ARGUMENT JMP ZALL /NO ARG = ALL VARIABLES GETC /F (SLIGHT FUDGE) SPNOR /N (ALSO ILLEGAL) SORTJ /L VARIABLE NAME ZLIST-1 ZGO-ZLIST PUSHJ /NOT A TERMINATOR GETARG /SO IT MUST BE A NAME ISZ XRT2 /ADVANCE DATA POINTER PUSHJ ZFOUND /THEN ZAP IT JMP ZERO+3 ZALL, TAD FIRSTV /RESET THE TABLE DCA LASTV JMP ZERO+4 /E.G. Z,A,B,C... ///// GRPCHK, 0 /FOR REPEATED OPERATIONS CDF T /TEXT BUFFER SNA /AC = POINTER TO NEXT JMP .+6 /FIRST LINE IN A GROUP DCA INITLN /SAVE POINTER TAD I INITLN /'THISLN', 'LASTLN', 'PC' SNA /END OF TEXT BUFFER? JMP GRPXIT+1 /YES DCA THISLN /SAVE NEW POINTER TAD NAGSW /CHECK THE TYPE OF OPERATION SMA SZA /FIRST EXIT = SINGLE OR E.O.G. JMP GRPXIT /ALSO SERVES FOR END-OF-TEXT DCA LASTLN /SAVE A COPY OF NAGSW ISZ THISLN /POINT TO LINE NUMBER TAD I THISLN AND P7600 CIA TAD LINENO /COMPARE WITH CURRENT AND P7600 ISZ LASTLN /FORCE 2ND EXIT FOR 'ALL' SNA CLA ISZ GRPCHK /SECOND EXIT = KEEP GOING DCA LASTLN /NON-ZERO = 'ALL' BUT N.I.G. TAD I THISLN GRPXIT, DCA LINENO /UPDATE THE LINE NUMBER CDF P JMP I GRPCHK ///// / THE IMPROVED 'RETURN' COMMAND PERMITS AN OPTIONAL LINE /NUMBER WHICH WILL TRANSFER TO THAT LINE RATHER THAN RE- /TURNING TO THE CALL. A VERY USEFUL FEATURE! RETRN, PUSHF /SAVE FSF RESULTS FLARG GETLN /CHECK FOR A LINENO TAD LINENO /SAVE IT DCA THISLN TAD C100 /POINT TO PC0 DCA PC CML CMA RAR / 3777 OR 7777 DCA LASTLN /SET RETURN FLAG POPF /RESTORE FSF FLARG /'CLA' POPJ /GO BACK A LEVEL /PRIMARY CONTROL AND TRANSFER GOTO, GETLN /READ THE LINE NUMBER REQUESTED FINDLN /LOCATE IT AND RESET TEXTP ERROR2 /NOT THERE - 'NOP' TO USE NEXT! TAD THISLN /SET THE PC DCA PC GETC /TEST FOR THE END OF THE LINE PROC, TAD CHAR AND P337 /EXECUTE LOWER CASE TOO! DCA LASTC /SAVE COMMAND & CLEAR A FLAG SORTX /CHECK FOR SP, COMMA, SEMI, CR JMP PC1+1 /NONE OF THE ABOVE JMS CRTEST /CR? JMP PROC-1 /IGNORE SPACES, COMMAS, SEMIS PC1, JMP I COMGO-1 /EXIT AT THE END OF A LINE GETC /SKIP TO END OF THE COMMAND SORTX JMP .-2 TAD LASTC /RECALL COMMAND LETTER TAD (-"Z-1 STL IAC TAD ("Z-"? SZL SNA /IS IT @-Z? CERR, ERROR2 /ILLEGAL COMMAND TAD PC1 DCA .+1 /EXECUTE AN INDIRECT JUMP ///// CRTEST, 0 /SKIP IF CHAR IS A CR: 'TESTCR' TAD CHAR TAD MCR SNA CLA ISZ CRTEST JMP I CRTEST /RECURSIVE OPERATE, EXECUTE, OR CALL LGOSUB, TAD P7600 /GET RETURN FLAG JMP DO+1 /EXECUTE THE SUBROUTINE LCMNDS, SPNOR /'L' COMMAND ENTRY POINT CIF L JMP I FENT&177 /SAME ADDRESS AS THE FPP ///// DOXIT, SZA /CHECK FOR 'DO' OR 'GOSUB' JMP LCMNDS+1 /RETURN TO CALLING PROGRAM TSTCMA /CHECK FOR ADDITIONAL CALLS CONTINUE /NONE: PROCESS NEXT COMMAND ///// DO, GETLN /EXECUTE A LINE, GROUP, OR ALL DCA SORTCN /ENTRY POINT FOR GOSUB PUSHF /ENTRY POINT FOR FSF'S TEXTP /SAVE TEXT POINTERS ///// DOGRP, PUSHF /SAVE SORTCN, CHAR, LINENO, NAGSW SORTCN FINDLN /FIND THE OBJECT LINE JMP DOERR /NOT THERE: DO WE CARE? PUSHJ /EXECUTE A SINGLE LINE GOTO+3 POPF /RESTORE THE DATA SORTCN TAD PC /CHECK THE NEXT LINE JMS I (GRPCHK /SHOULD WE EXECUTE IT? JMP DORTN /ALL DONE JMP DOGRP /CONTINUE SUBROUTINE ///// DORTN, POPF /RESTORE TEXT POINTERS TEXTP TAD SORTCN /CHECK RETURN FLAG SMA SZA JMP GOTO-2 /FSF RETURN ('CLA;POPJ') ISZ LASTLN /CHECK RETURN OPTION JMP DOXIT /NONE, RETURN TO CALL SZA CLA /GOSUB? POPF /YES, DUMP PROGRAM INFO FLOP /OTHERWISE 'NOP' TAD THISLN DCA LINENO /GET THE LINE NUMBER JMP GOTO+1 /AND GO SOMEWHERE ELSE ///// ERROR /PATCHED BY PROGRAM INTERRUPT DOERR, JMS I (GRPCHK /TEST FOR A GOOD LINE OR GROUP JMS I .-2 /SORRY JMP DOGRP+2 /OK- GET THE FIRST LINE ///// /COMMAND BRANCH TABLE: NINE NEW COMMANDS ARE AVAILABLE XPOPJ /STARTS THE TABLE COMGO, CERR /@ INDIRECT ASK /A BREAK /B PC1 /C DO /D ERASE /E FOR /F GOTO /G HESI /H HESITATE IF /I JUMP /J CERR /K KONTROL LCMNDS /L MODIFY /M NEXT /N ON /O CERR /P PLOT QUIT /Q RETRN /R SET /S TYPE /T CERR /U USER CERR /V VIEW WRITE /W SET /X XECUTE YNCR /Y YNCREMENT ZERO /Z ///// CONT, SKP CLA /COMMAND RETURN - 'CONTINUE' GETC SORTJ /SEARCH FOR A ';' OR A C.R. ILIST-1 IGO-ILIST JMP CONT+1 ///// CMATST, 0 /TEST FOR A COMMA: 'TSTCMA' CLA TAD CHAR TAD (-", SZA CLA JMP I CMATST /FIRST RETURN IF IT'S NOT GETC ISZ CMATST JMP I CMATST /REMOVE IT AND TAKE 2ND RTN ///// PAGE 4 FOR, PUSHJ /LOOP CONTROL BEGINS WITH 'SET' EVAL SORTJ /TEST LAST CHAR FROM 'EVAL' TLIST-1 FGO-TLIST JMP FOR /ALLOW SPACES BUT DON'T ADVERTISE MEQ, -"= /'EVAL' FOUND A REPLACEMENT OPERATOR (=): STACK THE / LAST OPERATION AND LOCK THE VARIABLE IN POSITION. *TAD FENT&177 /WIERD! EQLS, 0 /PLACED HERE TO SAVE A WORD TAD CHAR TAD MEQ SZA CLA JMP I EQLS CDF V /SOLVE THE 'ZVR' PROBLEM! TAD I XRT2 SNA CLA CMA /PROTECT ZERO VARIABLES TAD I PT1 DCA I PT1 TAD LASTOP /STACK CURRENT OPERATOR PUSHA TAD PT1 PUSHA /SAVE POINTER TO VARIABLE SP1 JMP I FCONT-1 /SET 'LASTOP' TO 1 FOR '=' ///// FINCR, GETC /SKIP THE COMMA THAT GOT US HERE TAD LASTC /IS IT 'SET' OR 'FOR' ? SNA CLA JMP FOR /'SET I=1,N=2' TAD PT1 /'FOR I=1,N' PUSHA /RESAVE THE VARIABLE POINTER PUSHJ /EVALUATE THE INCREMENT EVAL SORTJ /TEST THE NEW TERMINATOR ILIST-1 FLIST-ILIST ERROR2 /ILLEGAL TERMINATOR IN 'FOR' ///// FINFIN, PUSHF /STANDARD INCREMENT FLTONE JMP FCONT FLIMIT, PUSHF /SAVE THE INCREMENT; GET THE LIMIT FLAC PUSHJ /(NO ERROR DETECTION AFTER LIMIT) EVAL-3 FCONT, PUSHF /SAVE THE LIMIT FLAC /THE POINTER TO THE TOP OF THE STACK IS SAVED EACH TIME. /THIS PERMITS 'BREAKS' WHICH CUT THROUGH ALL INTERVENING /SUBROUTINE CALLS. THE LEVEL POINTERS ARE STACKED FROM /'RANDOM' DOWNWARDS, PERMITTING 15 OR MORE NESTED LOOPS. /NO CHECKING IS PERFORMED SINCE THE PROBABILITY OF AN /OVERFLOW OCCURING IS VANISHINGLY SMALL. PUSHF /SAVE THE CURRENT TEXT POSITION TEXTP CMA TAD FORLVL /ADJUST LEVEL COUNTER DCA FORLVL CMA TAD PDLXR /SAVE RETURN POINTER DCA I FORLVL PUSHJ /EXECUTE TO THE END FPROC, PROC-1 /RETURN FROM OBJECT STATEMENTS POPF /RESET THE TEXT POINTERS TEXTP POPF /RECOVER THE LIMIT BUFFER POPF /LOAD THE INCREMENT FLAC POPA /RESTORE THE VARIABLE POINTER DCA PT1 ISZ I BKSW /TEST FOR A 'BREAK' JMP FTEST /NONE FEXIT, ISZ FORLVL /REMOVE ONE LEVEL ISZ LASTC /CHECK FOR CONTINUATION POPJ /NONE, END THIS LINE PUSHF NEXTP POPF /MOVE TO NEW TEXT POSITION TEXTP JMP I MCR /CHECK FOR A LINENO (CF. 'IF') FTEST, SM0 AND HORD DCA SIGN /SAVE SIGN OF THE INCREMENT FENT FADDIPT1 /INCREMENT LOOP INDEX FPUTIPT1 /AND SAVE IT AGAIN FSUB I BUFFPT /COMPARE WITH LIMIT FEXT TAD SIGN TAD HORD /TEST RESULT SMA SZA CLA JMP FEXIT /EXIT FROM 'FOR' TAD I FORLVL /EFFECTIVE PUSHDOWN FOR DCA PDLXR /PT1, INCREMENT, LIMIT JMP I FPROC /TEXTP, & PUSHJ(PROC-1) /THE 'NEXT' AND 'BREAK' COMMANDS ADD A NEW DIMENSION TO /FOCAL'S LOOPS BY PERMITTING NESTED OPERATIONS AND EARLY /TERMINATION. THEY ARE PATTERNED AFTER SIMILAR COMMANDS /IN 'COLPAC' & 'FOCLF'. SPECIAL THANKS TO THESE AUTHORS! /BOTH COMMANDS MAY INCLUDE A LINENO TO SPECIFY A BRANCH. /WHEN NO LOOPS ARE IN PROGRESS THESE COMMANDS ARE SIMPLY /'NOPS' UNLESS A BRANCH IS SPECIFIED, IN WHICH CASE IT /WILL BE TAKEN. THUS A LINE CONTAINING AN 'N' OR A 'B' /COMMAND CAN BE EXECUTED BY ANY PART OF THE PROGRAM. BREAK, SM1 /SET THE 'BREAK' FLAG DCA I BKSW / (RESET BY 'GETC') NEXT, TAD I FORLVL /IS THERE A MATCHING 'FOR'? SNA JMP I MCR /NO, TREAT LIKE A SPECIAL 'GOTO' DCA PDLXR /YES, DROP THE STACK TO THIS LEVEL SM1 /SET THE 'NEXT' SWITCH DCA LASTC PUSHF TEXTP POPF /AND SAVE THE CURRENT POSITION NEXTP POPJ /THEN RETURN TO THE 'FOR' LOOP ///// /SEARCH FOR A GIVEN LINE NUMBER: 1ST RETURN IF MISSING, / 2ND IF FOUND. 'THISLN'= TARGET LINE OR NEXT LARGER - /'LASTLN'=LESSER AND OR LAST. 'GETC' POINTERS ARE SET, /BUT NOT THE PC SO ERRORS SHOW THE CORRECT LINE NUMBER. XFIND, 0 /FIND A LINE OF TEXT - 'FINDLN' CDF T TAD HEADER DCA LASTLN /INITIALIZE TO THE HEADER LINE TAD LASTLN FINDN, DCA THISLN /SAVE NEW LINE POINTER TAD THISLN DCA AXOUT /INITIALIZE UNPACKING REG. TAD LINENO STL CIA TAD I AXOUT /ADVANCE AND COMPARE SNA CLA ISZ XFIND /FOUND IT - TAKE 2ND EXIT SNL JMP FINDX /FOUND IT OR PAST IT TAD THISLN DCA LASTLN /SAVE POINTER TAD I THISLN SZA /END OF TEXT? JMP FINDN /NOT YET FINDX, DCA XCT /CLEAR UNPACKING SWITCH CDF P JMP I XFIND /1ST RETURN = NOT FOUND /INPUT-OUTPUT COMMANDS: -ASK- AND -TYPE- /'SET' TURNS INTO 'TYPE' WHEN THE TRACE SWITCH IS ON *.!177-3 /PUT 'SET' JUST BEFORE 'TYPE' SET, DCA LASTC /THE MOST IMPORTANT COMMAND ! TAD TRACE /CHECK THE TRACE SWITCH SMA CLA /SKIP IF ITS ON JMP FOR /OFF: USE THE 'FOR' ROUTINE ///// TYPSET, PUSHJ /EVALUATE THE EXPRESSION EVAL PRINTN /OUTPUT IT & RESET 'ATSW' TASK, SPNOR /MOVE TO NEXT ARGUMENT SORTJ /!,",#,$,%,: ? ALIST-1 AGO-ALIST ISZ I ATSW /'ASK' OR 'TYPE'? JMP TYPSET ///// PUSHJ /LOOKUP THE VARIABLE GETARG TAD CHAR /SAVE THE CHARACTER DCA LASTC TAD PROMPT NOP /'ECHOC' READ, SP1 READN /GET THE NUMBER YLST, "; CR /SORT LIST FOR 'YNCR' "- /IS THE INPUT SWITCH FENT FPUTIPT1 /SAVE THE VALUE FEXT ENDFI, TAD CHAR /'ALTMODE' RETURN DCA I ASK /SAVE THE TERMINATOR TAD LASTC DCA CHAR /RESTORE TEXT CHARACTER ASK, CLA SM1 /POINTS TO 'TERM' TYPE, DCA I ATSW /SET THE SWITCH JMP TASK ///// TBACK, TAD CCR /'#' = CR ONLY JMS I OUTDEV DCA I TABCNT TAD (200-CR /CREATE A NULL FOR DELAY TCRLF, TAD CCR /'!' = CR AND LF PRINTC TASK4, GETC /MOVE ALONG JMP TASK ///// /DISPATCH TABLE FOR 'ASK' 'TYPE' 'ZERO' 'FOR' 'SET' 'IF' AGO, TQUOT+1 /" - PRINT CHAR STRING TASK4 /, - END OF EXPRESSION TCRLF /! - CR AND LF TFRMT /% - SET OUTPUT FORMAT TBACK /# - CARRIAGE RETURN ONLY TDUMP /$ - DUMP THE SYMBOL TABLE TABX /: - TABULATE OR SKIP ZGO, ZERO+2 /, - MULTIPLE ZERO COMMAND FGO, FINCR /, - MULTIPLE SETS OR FOR IGO, THEN /, - UNUSED 'IF' BRANCHES YGO, PROC-1 /; - END OF COMMAND PROC+2 /CR END OF LINE DECR /- - DECREMENT A VARIABLE ///// ALIST, "" /'SORTJ' CONTROL TABLE ", "! "% "# "$ PROMPT, ": /FOR 'ASK' ZLIST, ", /FOR 'ZERO' TLIST, ", /FOR 'SET' ILIST, ", /FOR 'IF/ON' "; CR /'PUSHJ' ENDS THE LIST ///// TFRMT, PUSHJ /MOVE PAST THE '%' EVAL-3 TAD C100 /POINT TO PC0 DCA XRT PUSHJ /READ FORMAT TYPEPT TAD LINENO DCA FISW /SAVE FOR LATER JMP TASK ///// TQUOT, PRINTC /ECHO ISZ I DMPSW /DISABLE TRACE GETC /PASS QUOTE - READ NEXT DCA I DMPSW /RESTORE THE TRACE SORTJ TLIST2-1 /QUOTE OR CR TLIST3-TLIST2 JMP TQUOT ///// AXIND, 0 /'DCAIAXIN' CDF T DCA I AXIN CDF P JMP I AXIND /PUSHDOWN LIST SUBROUTINES - STACK IS IN FIELD 0 XPUSHJ, 0 /RECURSIVE SUBROUTINE CALL TAD I XPUSHJ /GET THE TARGET ADDRESS DCA XPUSHA /SAVE FOR THE INDIRECT JUMP TAD XPUSHJ /GET THE RETURN ADDRESS IAC /BUMP IT SKP /AND PUSH IT ON THE STACK XPUSHA, 0 /PUSH THE AC ONTO THE STACK CDI L JMP I (APUSHX JMP I XPUSHA XPOPJ, CDF S TAD I PDLXR /GET THE RETURN ADDRESS DCA XPOPA JMP XPOPA+3 /RESTORE D.F. AND BRANCH XPOPA, 0 /PULL SOMETHING OFF THE STACK CDF S TAD I PDLXR CDF P JMP I XPOPA XPUSHF, 0 /SAVE A FLOATING-POINT NUMBER TAD XPUSHF CDI L /USE LOWER FIELD ROUTINE FOR THIS DCA I (MPUSHF CDF P /RESET THE CALLING FIELD JMP I (MPUSHF+2 /UPPER FIELD ENTRY POINT XPOPF, 0 /RESTORE A FLOATING-POINT NUMBER CLA CMA TAD I XPOPF /BACKUP DATA POINTER ISZ XPOPF /AND ADVANCE THE RETURN DCA XRT JMS XPOPA /DUMP FOUR WORDS DCA I XRT JMS XPOPA DCA I XRT JMS XPOPA DCA I XRT JMS XPOPA DCA I XRT JMP I XPOPF PAGE /FIND OR ENTER A VARIABLE IN THE SYMBOL TABLE GETARG, TESTC /GET FIRST LETTER OF NAME LPRTST /FUNCTIONS AND NUMBERS XINC, WORDS+1 /ARE NOT GOOD VARIABLES ERROR2 /BAD ARG IN ASK, YNCR OR ZERO GETVAR, SM1 /ENTRY POINT FOR 'EVAL' FLOAT /SET COUNTER & CLEAR SUBSCRIPT TAD CHAR AND P77 /USE 6-BIT CODES RTL6 /MOVE TO THE LEFT - 'BSW' DCA THISOP /SAVE WHERE WE CAN PUSH IT GETLP, GETC /GET NEXT CHARACTER TESTX /END OF THE NAME? JMP GSERCH /YES ISZ HORD /IS THIS THE SECOND CHAR? JMP GETLP /IGNORE ADDITIONAL CHARS TAD CHAR AND P77 /MASK IT OFF TAD THISOP /MERGE THE OTHER HALF JMP GETLP-1 ///// GSERCH, JMS I GETARG+1 /CHECK FOR A SUBSCRIPT JMP GS1 /NONE JMS I (ECALL /PICK IT UP JMS I (DBLSUB /CHECK FOR DOUBLE SUBSCRIPTS POPA /GET VARIABLE NAME FROM PDL JMS I (PARTEST /CHECK FOR PROPER RIGHT PAREN. GETC /MOVE PAST CLOSING PARENS FIXIT /CONVERT ALL THIS TO AN INTEGER CIA /INVERT FOR FAST CHECKING GS1, DCA T3 /SAVE SUBSCRIPT TAD THISOP CIA /INVERT NAME FOR THE SAME REASON DCA T1 CDF V DCA I LASTV /DEFINE THE END OF THE TABLE TAD SECRTV /BEGIN WITH SECRET VARIABLES JMP GLOOP+2 ///// CMA /BACKUP TO NAME GLOOP, TAD XINC /ADVANCE ONE TAD XRT2 DCA XRT2 TAD I XRT2 /CHECK NAME SNA /END OF THE TABLE? JMP MAKVAR /YES TAD T1 /'SAM' SZA CLA /MATCH? JMP GLOOP /TRY AGAIN TAD T3 TAD I XRT2 /CHECK SUBSCRIPT SZA CLA JMP GLOOP-1 /NOT THIS ONE STL /L=1 IF FOUND ISZ XRT2 /POINT TO DATA GEXIT, TAD XRT2 DCA PT1 POPJ /RESETS D.F. ///// MAKVAR, TAD TABEND /SYMBOL TABLE LIMIT STL CIA TAD LASTV TAD GINC /COMPARE WITH NEW END POINT SNL JMP ZSERCH /FULL: TRY TO REPLACE A ZERO TAD TABEND DCA LASTV /UPDATE STORAGE POINTER STL CMA JMP ZFOUND+2 /INSERT NAME & CLEAR DATA ///// ZSERCH, CLA STL IAC /INITIATE SEARCH FOR ZERO TAD FIRSTV JMP ZINITL ZLOOP, TAD LASTV /CHECK PROGRESS CLL CMA TAD XINC /ADVANCE TO NEXT ONE TAD XRT2 SZL /ALL DONE? ERROR2 /YES: SYMBOL TABLE IS FULL TAD LASTV /SETS THE LINK ZINITL, DCA XRT2 /XRT2=XRT2+XINC-1 TAD I XRT2 /EXPONENT + TAD I XRT2 /HIGH ORDER SNA CLA /CHECK THAT BOTH ARE ZERO SNL /AND NOT ADDITIVE INVERSES JMP ZLOOP ///// ZFOUND, CDF V /ALSO USED BY 'ZERO' TAD M4 /POINT TO THE NAME TAD XRT2 /CLEAR THE LINK DCA XRT2 TAD THISOP /REPLACE IT DCA I XRT2 TAD LORD /AND THE SUBSCRIPT TOO DCA I XRT2 DCA I XRT2 /ZERO THE DATA TAD XRT2 DCA XRT /SWITCH INDEX REGISTERS DCA I XRT DCA I XRT DCA I XRT /'NOP' FOR 3-WORD VERSION JMP GEXIT /L=0 ///// TLIST3, TASK4 /SORT LIST FOR QUOTED STRINGS XPOPJ /AUTOMATIC RIGHT QUOTE MARK /CONDITIONAL TRANSFER PROCESSES: 'IF', 'ON' AND 'JUMP' /'IF' TRANSFERS WITH A 'GOTO' BRANCH WHILE 'ON' USES A /'DO' CALL AND RETURNS TO THE CALLING POINT AFTERWARDS. /'JUMP' USES THE VALUE OF THE EXPRESSION TO SELECT CALL ON, TESTC /THIS IS ALSO THE 'O' COMMAND SM1 /T R-PAR MEANS ITS 'ON' DCA LASTC /F ILLEGAL - WILL BE TRAPPED JMP IF+1 /N CONTINUE WITH 'IF' CIF L /L DOUBLE-WORD 'O' COMMAND JMP I .+1 /CONTINUE WITH LOWER-FIELD CHECKS OCMND JM, JMS I (ECALL /'JUMP (...) S1,S2,S3,S4,S5,...' SM1 /SET THE 'DO' FLAG DCA LASTC FIXIT /GET SUBROUTINE CALL CIA JMP IF+3 /THEN USE 'IF' TO FINISH UP IF, TESTC /IGNORE SPACES AND TEST JMS I (ECALL /T SM2 /F ISZ PDLXR /N DUMP 'THISOP' JMS I (PARTEST /L CHECK FOR PAREN MATCH TAD HORD /TEST -,0,+ SPA ISZ THISOP SPA SNA CLA THEN, ISZ THISOP /COUNT COMMAS JMP I (CONT+1 /KEEP LOOKING GETC /MOVE PAST IT JMP I MCR /CHECK WHETHER ITS 'IF' OR 'ON' ///// *-CR /VIA MCR ! GETLN /PATCH TO CHECK FOR MISSING LINENO SZL /AND TO CHOOSE BETWEEN 'IF' & 'ON' CONTINUE /NO NUMBER = CONT. WITH SAME LINE ISZ LASTC /TEST FLAG JMP I (GOTO+1 /IF (ALSO 'NEXT' OR 'BREAK') TSTCMA /ON (ALSO 'JUMP') JMP I (DO+1 /CALL THE SUBROUTINE JMP .-2 /PREVENT MULTIPLE 'DO' CALLS PAGE 7 /EVALUTE AN EXPRESSION ENDING WITH A TERMINATOR AND LEAVE /THE RESULT IN 'FLAC' AND 'FLARG'. 'JMS ECALL' EVALUATES /SUB-EXPRESSIONS, 'PUSHJ;EVAL' SCANS THE CURRENT ONE. NOW /HANDLES MULTIPLE REPLACEMENT OPERATORS AND CHAR VALUE OP /ALA FOCAL65. THANKS TO WAYNE WALL FOR SOME SUPER IDEAS! ECALL, 0 /RECURSIVE CALL TO 'EVAL' TAD .-1 DCA PT1 PUSHF /= 'PT1, THISOP, LASTOP, SORTCN' PT1 ARGNXT, DCA LASTOP /SET OR CLEAR THE OP CODE GETC /SKIP THE TERMINATOR SKP /CONTINUE 'EVAL' ///// EVAL, DCA LASTOP /EVALUATION CONTROLLER TESTC /TEST CHARACTER & IGNORE SPACES JMP ETERM1 /TERMINATOR JMP EFUN /FUNCTION JMP ENUM /NUMBER PUSHJ /LETTER OF VARIABLE GETVAR /LOOKUP THE NAME SPNOR /SKIP TO THE OPERATOR JMS I EQLSPT /IS IT AN 'EQUAL SIGN'? FENT FGETIPT1 /NO, MOVE VALUE TO FLAC FEXT ///// OPNEXT, TESTC /CHECK NEXT OPERATOR JMP ETERMN /T TLIST2, "" /F - ERROR IN FORMAT CR /N JMP EMINUS+1 /L - MISSING OPERATOR ///// ETERM1, SM2 /DO SPECIAL CHAR CHECK TAD LASTOP SMA CLA /INITIALLY OR AFTER AN '=' JMP ELPAR FLOAT /SET UP DEFAULT VALUE DCA FLAC TAD SORTCN /CHECK FOR '-', '+', PARENS TAD M4 SNA JMP EMINUS /CREATE DUMMY FOR UNARY MINUS SPA CLA JMP EVAL-2 /IGNORE UNARY PLUS, EXTRA '=' TAD SORTCN /TEST FOR NULL PARENTHESES TAD M14 SPA CLA JMP ELPAR /MIGHT BE A LEFT PARENTHESIS ETERMN, JMS LPRTST /ETERM1 FALLS THROUGH 'LPRTST' TAD SORTCN SNA /PARENS OR AN '=' OUT OF PLACE ERROR2 /MISSING OPERATOR OR ILLEGAL '=' TAD M14 SPA CLA /CHECK FOR END OF THE EXPRESSION EMINUS, TAD SORTCN DCA THISOP /ZERO = **THE END** ETERM2, TAD THISOP /COMPARE PRIORITIES CIA TAD LASTOP SPA CLA JMP ESTACK /STACK AND CONTINUE FENT BASE, FPUT I FLARGP /MOVE THE OPERAND FEXT SM1 TAD LASTOP /FIND OPERATION SNA JMP EQUALS /PROCESS AN '=' M10, SPA SNA SZL CLA POPJ /NONE, EXIT 'EVAL' POPF FLAC /GET THE PREVIOUS RESULT TAD LASTOP CLL RTR /SHIFT OP CODE INTO PLACE RTR TAD BASE /COMPENSATES FOR OP CODE DCA OPER FENT OPER, 0000 /'FXXX I FLARGP' FEXT POPA /GET NEXT OPERATION DCA LASTOP JMP ETERM2 ///// EQUALS, POPA /GET VARIABLE POINTER DCA PT1 EQLSPT, TAD FENT&177 /DOUBLE KLUDGE = 'FPUTIPT1' JMP OPER-2 ///// ESTACK, JMS LPRTST /TEST FOR SUB-EXPRESSION SKP JMP EPAR2 /GO EVALUATE EXPRESSION TAD LASTOP /STACK CURRENT OPERATOR PUSHA PUSHF /SAVE THE RESULT TOO FLAC TAD THISOP /ADVANCE THE OPERATOR JMP ARGNXT ///// EFUN, DCA THISOP /CLEAR THE FUNCTION NAME GETC TESTX /LOOK FOR A TERMINATOR JMP EFUN2 /FOUND ONE TAD THISOP CLL RTL /GENERATE THE HASH CODE TAD CHAR TAD P7600 JMP EFUN ///// EFUN2, JMS LPRTST /MUST BE FOLLOWED BY PARENS ERROR2 /VARIABLE NAME BEGINS WITH 'F' JMS ECALL /CALL 'EVAL' TO READ THE ARGUMENT POPA SNA /IS IT A FSF? JMP I .-1 SORTJ /BRANCH ON FUNCTION CODE FNTABL-1 FNTABF-FNTABL ELPAR, JMS LPRTST /LEFT PAREN OR FELL THROUGH TABLE ERROR3, ERROR2 /DOUBLE OPERATORS OR UNKNOWN FUNC EPAR2, JMS ECALL /EVALUATE NESTED EXPRESSION ISZ PDLXR /DUMP THE EXTRA ARGUMENT RETURN /COMPLETE THE FUNCTION CALL ///// LPRTST, 0 /SKIP IF CHAR IS A LEFT PAREN TAD SORTCN TAD M10 SNA /AND CATCH SINGLE QUOTES TOO JMP ECHR AND M4 /=7774 SNA CLA ISZ LPRTST /1-3 ARE PARENS JMP I LPRTST ///// ENUM, READN /READ A NUMBER FROM TEXT JMP OPNEXT /'JMP' IS NEGATIVE ///// *.!177-4 /PUT THIS RIGHT AT THE END ECHR, ISZ I DMPSW GETC /GET THE NEXT CHARACTER DCA I DMPSW TAD CHAR /FLOAT IT FLOAT JMP EFUN3+1 /ALMOST LIKE A 'RETURN' ///// /FUNCTION RETURNS AND CHARACTER TESTING: *2001 PARTEST,0 /TEST THE PAREN MATCHING DCA THISOP /SAVE THE AC IN 'THISOP' POPA /RESTORE LAST OPERATION DCA LASTOP SP2 /GET OPENING PAREN + TWO POPA CMA /NEGATE AND SUBTRACT ONE TAD SORTCN /(PARENS DIFFER BY THREE) SZA CLA /DO THEY MATCH? ERROR2 /NO THEY DON'T - TOO BAD! JMP I PARTEST /ENTRY POINT IS A BETA REGISTER ///// XRTL6, 0 /ROTATE THE AC LEFT SIX - 'RTL6' CLL RTL RTL RTL JMP I XRTL6 /'XRTL6' IS ALSO A BETA REGISTER ///// FL0AT, CLL RAR /UNSIGNED INTEGER FLOAT ROUTINE FLOAT RAR DCA LORD /JUST SHIFT EVERYTHING RIGHT ONE ISZ EXP EFUN3, JMS PARTEST /'RETURN' - CLEARS AC & RESETS DF NORMALIZE GETC /SKIP THE TERMINATOR JMP I .+1 OPNEXT /CONTINUE WITH 'EVAL' ///// MF, -"F /'FN' CHECK FOR 'TESTC' C232, 232 /'EOF' CHECK FOR 'FIND' ///// CTEST, 0 /TEST THE NEXT CHARACTER - 'TESTC' SPNOR /IGNORE SPACES JMS XTEST /CHECK ALL THE TERMINATORS JMP I CTEST /IT WAS A TERM - 'SORTCN' IS SET TAD CHAR TAD MF SNA CLA JMP XT3 /FUNCTION JMS NTEST SKP /PERIOD ISZ CTEST /OTHER ISZ CTEST /NUMBER XT3, ISZ CTEST JMP I CTEST /RETURNS: T;F;N;L ///// /NEW ROUTINE TO TEST IF 'CHAR' IS A TERMINATOR - 'TESTX' /THIS ROUTINE WAS DEVISED BY JIM CRAPUCHETTES (FOCAL8-269) /TO SHORTEN THE TIME REQUIRED FOR THIS TEST BY A FACTOR OF /3-5. THIS RESULTS IN A NET IMPROVEMENT OF ABOUT 12%. XTEST, 0 /TERMINATOR TEST - SETS 'SORTCN' TAD CHAR TAD M336 SMA SZA /IS IT > 336? JMP NO /NOT A TERMINATOR TAD P4 SMA SZA /IS IT > 332? JMP YES RANK, TAD P34 SMA SZA /IS IT > 276? JMP NO /IT'S A LETTER TAD P3 SMA /IS IT > 272? JMP YES+2 TAD P14 SMA SZA /IS IT > 257? JMP NO /IT'S A NUMBER TAD P11 SMA SZA /IS IT > 247? JMP YES+1 TAD P6 SZA /IS IT A SPACE? TAD P23 NO, SNA CLA /IS IT A CR? JMP YES+2 ISZ XTEST /NOT A TERMINATOR JMP I XTEST YES, TAD P11 / [ \ ] ^ TAD P3 / ' ( ) * + , - . / TAD RANK / ; < = > CR DCA .+1 TAD RANK /GET PRIORITY NO. SPA JMP NO /OMIT PERIOD & \ DCA SORTCN JMP I XTEST ///// NTEST, 0 /TEST FOR PERIOD, NUMBER - 'TESTN' TAD CHAR TAD MPER SZA ISZ NTEST TAD M14 /TEST FOR 0-9 CLL TAD P12 DCA SORTCN /SAVE RESULT SZL ISZ NTEST /IF A NUMBER JMP I NTEST ///// / PRIORITY TABLE FOR 'EVAL' P34, 34 /; 01 = = 13 /< 03 = + 0 /= 04 = - 16 /> 05 = / 10 /' 06 = * P11, 11 /( 07 = ^ P14, 14 /) 10 = ' P6, 6 /* 11 = ( P3, 3 /+ 12 = [ P23, 23 /, 13 = < P4, 4 /- 14 = ) MPER, -". /. 15 = ] 5 // 16 = > P12, 12 /[ 23 = , M336, -"^ /\ 34 = ; 15 /] 34 = CR 7 /^ 34 = SPACE ///// /TRANSFER LIST FOR 'SET' AND 'FOR' FLIST, FLIMIT /, FINFIN /; FINFIN-1 /CR ///// /LIST OF CODED FUNCTION NAMES (LOCATIONS IN 'FNTABF') F2=200^4+200 F3=200^4+200^4+200 FNTABL=. "C^4+"O^4+"M-F3 /COM "I^4+"T^4+"R-F3 /ITR "R^4+"A^4+"C-F3 /RAC "S^4+"G^4+"N-F3 /SGN "A^4+"B^4+"S-F3 /ABS "S^4+"Q^4+"T-F3 /SQT "R^4+"A^4+"N-F3 /RAN "S^4+"I^4+"N-F3 /SIN "C^4+"O^4+"S-F3 /COS "A^4+"T^4+"N-F3 /ATN "L^4+"O^4+"G-F3 /LOG "E^4+"X^4+"P-F3 /EXP "R^4+"A-F2 /RA "L^4+"S-F2 /LS "S^4+"R-F2 /SR "M^4+"Q-F2 /MQ "I^4+"N-F2 /IN "O^4+"U^4+"T-F3 /OUT "I^4+"N^4+"D-F3 /IND "M^4+"I^4+"N-F3 /MIN "M^4+"A^4+"X-F3 /MAX "B^4+"L^4+"K-F3 /BLK "L^4+"E^4+"N-F3 /LEN "T^4+"R^4+"M-F3 /TRM "D^4+"A^4+"C-F3 /DAC "A^4+"D^4+"C-F3 /ADC "T^4+"R^4+"G-F3 /TRG "B^4+"U^4+"F-F3 /BUF "T^4+"I^4+"M-F3 /TIM "D^4+"I^4+"N-F3 /DIN "R^4+"E^4+"Q-F3 /REQ "C^4+"T^4+"R-F3 /CTR "D^4+"V^4+"M-F3 /DVM "X^4+"T^4+"R-F3 /XTR "N^4+"E^4+"W-F3 /NEW "D^4+"A^4+"Y-F3 /DAY /THE HASH CODE HAS BEEN CHANGED TO IMPROVE UNIQUENESS. /CHARACTERS ARE SHIFTED 2 BITS AT A TIME AFTER MASKING /THE LEADING BIT. THE TABLE IS ENDED BY 'EXTR' /UNPACK A CHARACTER FROM THE TEXT BUFFER: 'GETC' EXTR, JMS GET1 /EXTENDED CHARACTER SNA /300? JMP UTE-1 /RESTORE '@' TAD M40 SMA /REVERSE THE TEST JMP UTE+1 /340-376 JMP UTE+2 /201-237 ///// TOGL, ISZ TRACE /TOGGLE THE TRACE FLOP SM1 DCA TRACE M40, SMA SZA CLA /GET THE NEXT CHARACTER UTRA, 0 /UNPACK A CHARACTER JMS GET1 SZA /TURN NULLS INTO SPACES TAD M40 /SUBTRACT 40 UTE, SPA /WHICH SET? TAD C100 /300-337 TAD M77 /240-276, 200 SZA /IS IT A QUESTION MARK? JMP UTX /NO, RESTORE THE CHAR TAD XPRNT /YES SNA CLA /DOES IT GET SPECIAL ATTN? JMP TOGL /YES, TOGGLE THE TRACE FLOP TAD M40 /NO, TREAT IT NORMALLY UTX, TAD P337 DCA CHAR TAD XPRNT /IF XPRNT=0, TRAP '?' MARKS TAD TRACE / >0, IGNORE '?' MARKS SPA CLA /IF TRACE=0, THE TRACE IS OFF PRINTC / -1, THE TRACE IS ON JMP I UTRA /PRINT ONLY IF SUM IS NEGATIVE ///// GET1, 0 /UNPACK 6 BITS ISZ XCT /STARTS WITH 0 JMP GET3 TAD GTEM GEND, AND P77 TAD M77 SNA JMP EXTR /EXTENDED TAD P77 JMP I GET1 M77, -77 ///// XSPNOR, 0 /IGNORE INTERVENING SPACES: 'SPNOR' TAD CHAR TAD M240 SZA CLA JMP I XSPNOR JMS UTRA JMP XSPNOR+1 GET3, CLA CMA /RESET THE FLIP-FLOP DCA XCT CDF T TAD I AXOUT /GET 12-BITS CDF P DCA GTEM TAD GTEM RTR RTR /BSW RTR JMP GEND /RETURN WITH THE FIRST CHARACTER ///// XPRNT, 0 /PRINT A LINE NO. - 'PRNTLN' TAD C240 /SET UP A SPACE DCA CHAR TAD LINENO /THE ENTRY POINT IS 'DMPSW' SNA JMP I XPRNT /NO NUMBER FOR THE HEADER RTL6 AND P77 JMS I PRNTX /TWO-DIGIT 'GROUP' NUMBER SM2 /TO GENERATE A '.' PRINTD TAD LINENO JMS I PRNTX /TWO-DIGIT 'STEP' NUMBER PRINTC JMP I XPRNT PRNTX, PRNT ///// / NEW ROUTINE TO TEST IF 'CHAR' IS A SPACE, SEMICOLON, /COMMA OR CARRIAGE RETURN; SKIPS IF IT IS ANY OF THESE. XSORT, 0 /COMMAND WORD SORT - 'SORTX' TESTCR TAD M240 /-SPACE SZA TAD CHAR /NOT CR M240, SMA SZA TAD MSC /SEMICOLON SPA TAD P17 /COMMA SNA CLA ISZ XSORT /ONE OF THE ABOVE JMP I XSORT MSC, SP-"; ///// /'PACKC' LIST - ALLOWS ROOM FOR 'FNTABF' TO GROW PACGO, PQST /? PCAT /@ RUB1 /RO /LIST OF FUNCTION ADDRESSES (NAMES ARE IN 'FNTABL') FNTABF=. FCOM /COM -COMMON STORAGE FITR /ITR -NEW INTEGER FN FRAC /RAC -FRACTIONAL PART FSGN /SGN -SIGN= -1, 0, +1 FABS /ABS -ABSOLUTE VALUE FSQT /SQT -SQUARE ROOT FRAN /RAN -RANDOM NUMBER FSIN /SIN -TRIG FUNCTIONS FOR FCOS /COS -ANGLES IN RADIANS FATN /ATN -USE PI TO CONVERT FLOG /LOG -NAPERIAN LOGARITHM FEXP /EXP -EXPONENTIAL (BASE E) /END OF BASIC NUMERICAL FUNCTIONS - REMAINDER DO I/O FRA /RA -RANDOM ACCESS STORAGE ERROR3 /LS -READ THE LEFT SWITCHES FSR /SR -SW. REG. OR R. SWITCHES FMQ /MQ -DISPLAY A NO. IN THE MQ FIN /IN -SINGLE CHARACTER INPUT FOUT /OUT -SINGLE CHARACTER OUTPUT FIND /IND -CHARACTER SEARCH FMIN /MIN -MINIMUM VALUE FMAX /MAX -MAXIMUM VALUE FBLK /BLK -STARTING BLOCK FLEN /LEN -FILE LENGTH FTRM /TRM -INPUT TERMINATOR /ADDITIONAL LABORATORY-TYPE FUNCTIONS ERROR3 /DAC -ANALOG OUTPUT ERROR3 /ADC -ANALOG INPUT ERROR3 /TRG -SCHMITT TRIGGERS ERROR3 /BUF -DISPLAY BUFFER STORAGE ERROR3 /TIM -ELAPSED TIME INTERVAL ERROR3 /DIN -DIGITAL INPUT REGISTER ERROR3 /REQ -PROGRAMABLE OSCILLATOR ERROR3 /CTR -FREQUENCY COUNTER ERROR3 /DVM -DIGITAL VOLTMETER ERROR3 /XTR -EXTRA FUNCTION SLOT ERROR3 /NEW -UNDEFINED FUNCTION FDAY /DAY -SET THE OS/8 DATE /INSERT A CHAR IN THE TEXT BUFFER - 'PACKC' PACBUF, 0 /ALSO HANDLES DELETIONS DCA PCK1 /SAVE LINENO PROTECTION SORTJ PACLST-1 /CHECK FOR '?', '@', 'RO' PACGO-PACLST TAD CHAR TAD C240 /DECODE AND C100 SZA CLA /EXTENDED? JMP .+3 PCAT, TAD P77 /201-237, 300, 340-376 JMS PCK1 TAD CHAR /200, 240-276, 301-336 JMS PCK1 PACX, CDF P DCA RUB3 /RESET ERROR TRAP JMP I PACBUF ///// PCK1, 0 AND P77 ISZ T3 /=0 TO START JMP PCK2 TAD LASTC DCAIAXIN JMP I PCK1 ///// PCK2, RTL6 /'BSW' DCA LASTC STL CMA DCA T3 TAD AXIN TAD I PACEND /CHECK TEXT LIMIT SNL CLA ERROR2 /TEXT BUFFER FULL JMP I PCK1 ///// PQST, TAD P337 /REPLACE 277 WITH 337 JMP PACX-1 ///// /A NOTE OF APPRECIATION TO EDWARD TAFT III /FOR HELPING WITH THIS APPROACH TO 'PACKC'. /REFERENCE: DECUS FOCAL8-52 (FOCAL 5/69) RUB1, TAD T3 /RUBOUT ONE LETTER SMA CLA /HALF-WORD? JMS RUB3 /CHECK POSITION TAD P134 /'TAD START' JMP .+4 /'ECHOC' PRODUCES TAD SPAC /'BS', 'SP', 'BS' ECHOC /FOR VIDEO TERMINALS TAD START ECHOC /7-BIT '\' OTHERWISE TAD AXIN DCA PT1 CDF T ISZ T3 /WHICH HALF? JMP RUB2 TAD I PT1 /'T3' HAS BEEN RESET! CMA AND P77 /TEST FOR EXTENDED CHAR SPAC, SZA CLA JMP PACX JMS RUB3 /LOOK OUT FOR LINE NUMBERS! RUB2, CLL CMA /REMOVE 2ND HALF OF STORED WORD TAD AXIN DCA AXIN /RESET STORAGE POINTER TAD I PT1 AND RUB1+1 /=7700 DCA LASTC TAD LASTC TAD C100 /CHECK FOR EXTENDED CLA CMA RAR /L=1 IF NOT " DCA T3 /RESET BYTE COUNTER JMP PACX ///// RUB3, 0 /WATCH OUT FOR THE BEGINNING TAD AXIN STL CIA TAD BUFR TAD PCK1 /PROTECT THE LINENO SNL CLA JMP PACX /DON'T DO ANYTHING! JMP I RUB3 ///// /THE QUIT COMMAND NOW HAS A 'RESTART' OPTION: 'QUIT 5.1' /WILL STOP THE PROGRAM, AND THEN RESTART IT AT LINE 5.1. /'QUIT 0' (OR JUST 'Q') WORKS AS BEFORE. THE RESTART CAN /BE DEFERRED UNTIL THE OCCURRENCE OF ANY ERROR BY SPECI- /FYING A NEGATIVE LINE NUMBER: 'QUIT -5.1' WILL SAVE THE /LINE NUMBER UNTIL YOU ACTUALLY GET AN ERROR. QUIT, GETLN /GET THE LINE NUMBER SZL JMP START /ZERO: (OR NO ARGUMENT) TAD T3 SMA CLA /CHECK THE SIGN JMP ERTRAP+1 /POSITIVE: AUTO-RESTART TAD LINENO DCA RUB3 /NEGATIVE: SAVE FOR LATER CONTINUE ///// ERTRAP, DCA LINENO /MOVE THE LINE NUMBER TAD BOTTOM DCA PDLXR TAD LEVEL0 /CLEAR THE STACKS DCA FORLVL JMP I PACLST /THEN RESTART THE PROG. /ERROR RECOVERY ROUTINE: MODIFIED FOR THE ERROR TRAP ERROR, 0 /TAB COUNTER TOO ! I0N CLA TAD TELSW /WAIT FOR TTY TO FINISH SZA CLA JMP .-3 CDF P TAD RUB3 /SHOULD WE TRAP THIS ONE? SZA JMP ERTRAP /YES TAD ERROR /PROCESS ERROR CODE TO AND C100 /ELIMINATE NON-NUMERICS CMA STL RAR /7777 OR 7737 JMP I .+1 /NO - REPORT IT M20+1 /THE EXPANDED 'JUMP' COMMAND PROVIDES KEYBOARD CHECKING JM JUMP, TESTC /CHECK WHICH FORM WE'VE GOT JMP I JUMP-1 /T = 'JUMP (...) *, *, *, *, ' PACLST, "? /N 'PACKC' LIST FITS IN HERE TO "@ /F SERVE AS 'NOPS' FOR 'TESTC' RO /L TAD INBUF / IF NOT A TERMINATOR, ASSUME A SZA CLA / LINE NUMBER & CHECK THE INPUT CONTINUE / BUFFER. NOTHING THERE: BRANCH JMP I MCR / OTHERWISE CONTINUE WITH PROG. SORTB, 0 /SORT AND BRANCH ROUTINE - 'SORTJ' SNA TAD CHAR /ASSUME CHAR IF AC=0 CIA DCA DCAT2 TAD I SORTB /FIRST ARGUMENT IS LIST-1 ISZ SORTB DCA XRT TAD I XRT SPA /LISTS ARE ENDED BY NEGATIVE NOS.! JMP SEX /NOT THERE! TAD DCAT2 SZA CLA /MATCH? JMP .-5 /NOT REALLY TAD XRT TAD I SORTB /COMPUTE ADDRESS DCA SORTB TAD I SORTB /DEBUG: AC = ADDRESS DCA SORTB SEX, SZA CLA /CLEAR AC IF NO MATCH ISZ SORTB /TAKE THE SECOND EXIT JMP I SORTB ///// /IMPROVED SYMBOL TABLE DUMP /THE NUMBER OF VARIABLES PER LINE IS DETERMINED BY THE EX- /PRESSION FOLLOWING THE '$'. THUS 'TYPE $4' WILL PRINT 4 /VARIABLES PER LINE. IF NO VALUE IS SPECIFIED (OR 0) THE /PREVIOUS VALUE WILL BE USED. THE DEFAULT IS INITIALLY 3. TDUMP, PUSHJ /GET NUMBER OF VARIABLES PER LINE EVAL-3 FIXIT CIA SZA DCA DMPNO /CHANGE DEFAULT VALUE TAD TRACE DCA LASTC /SAVE THE TRACE SWITCH TAD FIRSTV DCA PT1 /START AT THE BEGINNING TAD DMPNO DCA TRACE /INITIALIZE THE COUNTER JMP DUMPT+4 /(THESE THREE COULD GO) ///// DUMPT, TAD DMPNO /SET COUNTER AND TURN ON TRACE DCA TRACE TAD CCR PRINTC /RESETS THE DF TAD GINC CIA DCA XCT /INITIALIZE LOOP TAD DCAT1 DCA DCAT2 CDF V DCA I LASTV /CLEAR THE LAST NAME TAD I PT1 /MOVE VAR. TO THIS FIELD ISZ PT1 /NO HARM IF IT SKIPS ISZ .+1 DCAT2, DCA T1 /T2, T3, ETC. ISZ XCT /RESETS THE SWITCH TOO! JMP .-5 TAD T2 /LAST ONE? SNA JMP DUMPX /YES CDF T DCA I C200 /SAVE THE NAME TAD P177 DCA AXOUT /SET 'TEXTP' GETC /RESETS THE DF GETC GETC /PRINT 'XX(' JMS I (FGO6 /PRINT SUBSCRIPT GETC /PRINT ')' PRINTN /PRINT VALUE CDF V ISZ TRACE /FINISHED THIS LINE? TAD I PT1 /NO, LAST ENTRY? SNA CLA /NEITHER JMP DUMPT /START A NEW LINE TAD C240 JMP DUMPT+3 /SEPARATE THE VARIABLES ///// DMPNO, -3 /DEFAULT = 3 DUMPX, TAD LASTC /RESET THE TRACE SWITCH DCA TRACE POPJ /RESET DF AND END THE LINE ///// /REMOVE A LINE OF TEXT AND RECOVER THE SPACE - 'DELETE' XDELETE,0 /ENTRY POINT IS PACKING LIMIT TAD LINENO /TRYING TO DELETE LINE 0? SNA CLA JMP START /JUST IGNORE SUCH COMMANDS FINDLN /SETS THISLN, LASTLN, AND TEXTP JMP I XDELETE /ALREADY GONE ///// I0F /PROTECT TEXT POINTERS GETC /MEASURE LENGTH TESTCR JMP .-2 TAD AXOUT /GET LAST ADDRESS CMA TAD THISLN /SUBTRACT FROM FIRST DCAT1, DCA T1 TAD T1 /CORRECT BUFFER POINTER TAD BUFR DCA BUFR CDF T TAD I THISLN /DISCONNECT DCA I LASTLN TAD HEADER /START AT THE BEGINNING XLOOP, DCA LASTLN /CORRECT LINE POINTERS TAD I LASTLN /GET THE NEXT ADDR DCA GTEM /SAVE TAD GTEM /COMPARE LINE POSITIONS CLL CIA TAD THISLN SNL CLA /SKIP IF THISLN > X TAD T1 /CHANGE (X) TO ACCOUNT TAD GTEM /FOR GARBAGE COLLECTION DCA I LASTLN TAD GTEM /GET NEXT SZA /TEST FOR END JMP XLOOP ///// TAD AXIN /COMPUTE COUNT CIA TAD AXOUT DCA XCT CMA TAD THISLN /RESET AXIN DCA AXIN TAD I AXOUT DCA I AXIN /SHIFT REMAINDER OF BUFFER DOWN ISZ XCT JMP .-3 JMP XDELETE+4 /RESET 'LASTLN', 'THISLN' AND D.F. PAGE /TTY INTERUPT I/O HANDLERS: /OUTPUT BUFFER HAS BEEN MOVED AND THE INPUT MODIFIED /TO INCREMENT A RANDOM NO. OR CALL A DISPLAY ROUTINE KEYCK, XI33+1 /PATCHED BY DISPLAY ROUTINE XOUTN, TAD XI33 TLS /TYPE FIRST CHARACTER DCA TELSW /SET IN-PROGRESS FLAG CDF P JMP I XOUTL P7757, 7757 /LOC = PAGE+6 XI33, (REKOVR /VIA (INDEV) ISZ I XCT /BUMP RANDOM NUMBER TAD INBUF /ANY INPUT? SNA /YES AND NON-ZERO RNDM NO. JMP I KEYCK /NO OR ZERO RANDOM NUMBER DCA XI33+1 /SAVE AND KILL 'ISZ' DCA INBUF /CLEAR INPUT BUFFER TAD XI33+1 /PLACE CHARACTER IN AC JMP I XI33 MCP, "C-"P /OINK, OINK XOUTL, 0 /VIA (OUTDEV) DCA XI33 /SAVE CURRENT CHARACTER CDF L I0N /BE SURE INTERRUPT IS ON TAD I OPTRI /ANY ROOM? SZA CLA /A CHARACTER IS NON-ZERO JMP .-3 /NO = WAIT CIF P /INHIBIT POINTER CHANGES TAD TELSW /IN PROGRESS? SNA CLA JMP XOUTN /NO TAD XI33 /PUT DATA IN EXTRA DCA I OPTRI /BUFFER SPACE TAD OPTRI /ADVANCE POINTER IAC /MODULO 20 AND P7757 /(CIRCULAR STORE) DCA OPTRI /NEW VALUE JMP XOUTN+3 /RE-ENABLE INTERRUPTS MINT, CDI /CTRL/C EXIT JMP I P7600 /MONITOR = 07600 SM8=6254 DCMA=6601 PCLF=6662 RCTF=6677 /INTERRUPT PROCESSOR: CHANGES FOR ^C AND ^F OR ^P INTRPT, DCA SAVAC /SAVE WORKING REGISTERS RAR DCA SAVLK TINT, TSF /CHECK OUTPUT FIRST WHILE DF=0 JMP KINT TCF DCA TELSW /TURN OFF THE IN-PROGRESS FLAG TAD I OPTRO /I/O BUFFER IS IN FIELD 0 NOW SNA JMP KINT /DONE TLS /TYPE NEXT CHARACTER DCA TELSW /CLEAR AC & TURN ON THE FLAG DCA I OPTRO /ZERO OUT THE DATA JUST USED TAD OPTRO /GET POINTER AND IAC /ADVANCE MODULO 20 CTRLF, AND P7757 /(CIRCULAR BUFFER) DCA OPTRO /NEW POINTER KINT, KSF /NOW CHECK THE KEYBOARD JMP UINT KRS /READ BUFFER AND P177 /IGNORE PARITY TAD (-3 SNA /TEST FOR CTRL C JMP MINT TAD (-3 /'TAD MCP' -> ^P SNA CLA /TEST FOR CTRL F JMP M20+2 TAD INBUF /CHECK BUFFER CLL CIA KRB /RE-READ CHAR AND P177 SNA /LEADER/TRAILER? JMP UINT TAD C200 SNL /OVERFLOW? ERROR2 /'NOP' IF YOU DON'T CARE DCA INBUF UINT, NOP /RESERVED FOR PLOTTER OVERLAY NOP / " NOP / " 6302 /NOW CLEAR SOME ANNOYING FLAGS 6312 6322 6332 6342 6076 6402 JMP XINT /CDI 0 /USE THS PATCH FOR ADDITIONAL NOP /JMP I .+1 /INTERRUPT SERVICE NOP /DDRESS /IN ANY FIELD XINT, NOP /16KXII.PA OVERLAYS HERE NOP / " RCTF DCMA PCLF /LPT8I.PA OVERLAYS HERE PCF TAD SAVLK CLL RAL TAD SAVAC CDI JMP PRNTC /RETURN FROM THE INTERRUPT OPTRI, TBUF /OUTPUT BUFFER POINTERS OPTRO, TBUF /'I'= 'IN', 'O'= 'OUT' /PRINT THE ERROR MESSAGE DCA TELSW /CLEAR THE BUSY FLAG M20, SMA SZA SNL CLA /SKIP ERROR CODE TAD I TABCNT /AC= -1 OR -41 DCA LINENO DCA INBUF TAD OPTRI /RESET POINTER DCA OPTRO CDI L JMS REKOVR /CLEAR OUTPUT BUFFER ///// TAD ("?-"_ /RETURN VIA 'EOF' PRINTC /PRINT A "?" PRNTLN /FOLLOWED BY ERROR CODE ISZ PC CDF T TAD I PC /GET PROGRAM STEP SNA JMP .+6 /DIRECT COMMAND ERROR DCA LINENO TAD C100 /ATSIGN PRINTC /RESETS DF PRINTC /SPACE PRNTLN /LINE NO. TAD CCR PRINTC BATXIT, JMP START /OR RETURN TO BATCH ///// PAGE /END OF COMMAND PROCESSOR /IN THE 8K VERSION THE VARIABLES COME NEXT AND EXTEND TO /THE BEGINNING OF THE FUNCTIONS. IN THE 12K VERSION THIS /SPACE IS AVAILABLE FOR USER ADDITIONS - HELP FOCAL GROW! |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 | /LIBRARY AND FILE COMMAND PROCESSOR: /****** STORAGE ALLOCATION MAP ****** /***** ***** /* 1200 2ND INPUT BUFFER /* 1600 THE OUTPUT BUFFER /* 2200 STACK LIVES HERE /* 3000 PUSHDOWN ROUTINES /* 3200 MAIN INPUT BUFFER /* 3600 MAIN INPUT HANDLER /* 4200 THE LIBRARY HANDLER /* 4600 THE OUTPUT HANDLER /* 5200 2ND INPUT HANDLER /* /* 5600 FILE OUTPUT, CLOSE & ABORT /* 6000 OPEN, RESTORE & FILE INPUT /* 6200 TABULATE, HANDLER & SETDHT /* 6400 DECODER, DATER, SAVER, GOSUB /* 6600 RUN,CALL,BRANCH,RETURN,LJUMP /* 7000 LIBRARIAN, IOWAIT /* 7200 OPEN, DISMISS & COMPARE /* 7400 GTNAME /***** ***** /************************************ / INITIAL TEXT FOR U/W-FOCAL FIELD 2 PAGE 1 0 /PROGRAM LENGTH 5051 /'()' FOR TDUMP LINE0, 0 /POINTER TO NEXT 0 /LINE NO. ZERO TEXT "C U/W-FOCAL:" TITLE, TEXT "VER-4E" /'?M'=CODED CR DATE, TEXT "15.10.78?M" LINE1= DATE+5 /NULLS BECOME SPACES *100 ZBLOCK 2 /PC0 FOR COMMAND MODE /PAGE ZERO STORAGE HAS BEEN CAREFULLY ARRANGED ! FIELD 0 PAGE 0 INITLZ /INTERRUPT SERVICE ROUTINE CIF P JMP I [INTRPT /PATCH 177 FOR POWER FAIL PRNTC, RMF /RETURN FROM THE INTERRUPT I0N CL0SE, 5600 /'JMP I 0' USR, 7700 //POINTER TO MONITOR (200 IF IN CORE) K77, 77 //LOCATION 7 FOR PLOTTER ROUTINES AUTO, ZBLOCK 4 /AUTO-INDEX REGISTERS ICHARX, ICHAR0 /USE THE REMAINING ONES OFFSET, ICHAR-XI33 /FOR THE EXTRA FEATURES SCHARX, SCHAR0-ICHAR0 *20 NONAME, LPUSHF /INSERT VERSION NO. AFTER 'ERASE' H0RD, VERSION LPOPF XCHAR, NAMLOC-1 /STRATEGICALLY LOCATED! IOWAIT, SP1 /POINTER TOO! DCA GOSW /SET RETURN POINTER JMS TEMP /THEN UPDATE HEADER DCA LIBFLG /ZAP 'PROGRAM SAVED' FLAG TAD GOSW /RETURN FOR LOAD CALLS EXIT, TAD GOJUMP /NORMAL RETURNS='JMP I (PROC' DCA GOSW DISMISS /REMOVE THE USR CDI P I0N GOSW, [DERR /LOWER FIELD ERROR ROUTINE DISMISS /CLEARS AC (JMP 135) TAD GOSW /(RELOCATE FOR LINC INTERRUPTS) CDI P DCA I [ERROR /SIMULATE A 'JMS' JMP I [ERROR+1 GOJUMP, JMP I K177-1 /PLUS (GOSW) *HORD VERSION,TEXT "16K-V4" LGOSUB /-1 CONT / 0 K177, START /+1 GOTO+1 /+2 NEWDEV, ZBLOCK 4 /'NEWDEV-1'='TELSW' FLNGTH= .-2 STBLK= .-1 /'LIBBLK-1'='BUFR' LIBBLK, ZBLOCK 2 /FOR DEVICE NAME 4201 /LOAD POINT DEVNO, 0 /FOR DEVICE # LIBHND, ERTRAP /HANDLER ENTRY CHAR, [7200 /LOWER FIELD COPY NAMLOC, ZBLOCK 4 /(MUST BE 'CHAR+1') EXTENSION=.-1 DSK, 5723 /HASH CODE FOR DEFAULT DEVICE LIBDEV, ZBLOCK 4 LIBFLG= .-1 /REFERENCE VIA P77 *100 PC0, 0 /ENTRY AND RESTART POINT JMP I 0 /INITIALIZE (ONCE ONLY) SWAP, CLA CLL IAC /POINTER TO SWAP ROUTINE JMP EXIT *.+2 /FOR COMPATIBILITY TEMP, [7400 /UPDATE THE HEADER CIF T JMP NUHEAD+1 SINBLK, ZBLOCK 2 5201 /4201 PATCHED BY PLOT 0 SINHND, 0 SPOINT, 0 D, DATE-1 XNAME, NAMLOC INBLK, ZBLOCK 2 3601 0 INHND, GOSW /REREAD TRAP OUTBLK, ZBLOCK 2 4601 FILDEV, 0 OUTHND, 0 OUTFLG, 0 *PRINTC&177 ERROR0= JMS I . /='PRINTC' TRAP ERROR1= JMS GOSW /SECONDARY INPUT ROUTINES: THE 'O S' AND 'O R S' COMMANDS /IN THE ABSENCE OF THE PLOTTER ROUTINES THERE ARE NO RE- /STRICTIONS ON THE SECOND INPUT FILE, BUT THE ADDITION OF /THESE ROUTINES LIMITS THE 'L' COMMANDS TO THE USE OF THE /<SAME> DEVICE - OR ANY HANDLER CO-RESIDENT WITH THE SYS- /TEM DEVICE, SUCH AS 'RKB0', OR 'DTA1' IN A 'TD8E' SYSTEM. *200 SINPUT, CLL CMA /USE THE REGULAR LOOKUP ROUTINE JMS I [OPEN SINBLK-1 ERROR0 /FILE MISSING JMP I CRT /PATCHED BY SCOPE OVERLAY TAD STBLK DCA SBLK SM1 DCA SINFLG SRST, TAD SINFLG SNA CLA ERROR0 /NOTHING LEFT TAD SCHARX *CR TAD ICHARX /ENTRY POINT FOR 'O I', 'O R I' CDF P DCA I INP /CHANGE THE FILE INPUT POINTER JMP I TTY INP, FILIN TTY, TTYIN-1 CRT, TTYIN /OR 'OSCOPE' END, ENDCHK SEND, 0 /POINTS TO NEXT STEP JMS I END /CHECK FOR THE EOF SINFLG, 0 /'FILE OPEN' FLAG SCHAR0, ISZ SINFLG /BUFFER EMPTY? JMP I SEND /NO, GET THE NEXT CHARACTER I0F JMS I SINHND /READ ANOTHER BLOCK 0200 1200 /2200 PATCHED BY PLOT SBLK, 0 SMA CLA /FATAL ERROR? SKP CLA JMP I [DERR TAD [-600 DCA SINFLG /RESET THE WORD COUNTER ISZ SBLK /ADVANCE THE BLOCK NO. TAD SBLK-1 DCA SPOINT /AND RESTART FROM THE TOP I0N SCHAR1, TAD I SPOINT /UNPACK THE BUFFER JMS SEND TAD I SPOINT /SAVE UPPER 4 BITS AND [7400 DCA I SBLK-1 ISZ SPOINT /POINT TO THE NEXT TAD I SPOINT JMS SEND TAD I SPOINT /NOW TO PUT THE PIECES ISZ SPOINT /ALL TOGETHER AGAIN AND [7400 CLL RTR RTR TAD I SBLK-1 RTR RTR JMS SEND JMP SCHAR1 /ROUND & ROUND & ROUND WE GO ///// LPTDEV, XOUTL; ZBLOCK 2 /CHANGE THESE 3 LOCATIONS TO THE /DEVICE LPT /ENTRY POINT AND THE DEVICE NAME LPTCHK, [PDLXR /CHECK FOR CALLS TO 'LPT:' SM2 COMPAR /NOW CHECK IT LPTDEV NEWDEV-1 JMP I LPTCHK /NOT WHAT WE'RE LOOKING FOR ISZ LPTCHK /RETURN WITH THE ENTRY POINT TAD LPTDEV /(INSERT OTHER CODE HERE - FOR EX: JMP I LPTCHK /A CHECK FOR THE ',E' OPTION,ETC.) /THE STACK, TTY BUFFER & ERROR TRAP ALL LIVE HERE *3024 /BEGINNING OF THE STACK PCHK, ["0 /STACK OVERFLOW CHECK CDF P TAD I [PDLXR /ADJUST FIELD 1 X-REGISTER DCA PDLXR /BACKUP & COPY TAD PDLXR DCA I [PDLXR TAD PDLXR /CHECK FOR OVERFLOW STL CIA TAD (2200 /2600 PATCHED BY PLOT CDI L SPA SNA SZL CLA /-10 = L-P JMP I PCHK PDERR, TAD .-3 /TOO BAD! JMP EXIT+1 /USE 'CDI L' AS THE ERROR CODE MPUSHF, 0 /PUSH 4 WORDS ON THE STACK TAD PDERR-2 /LOWER FIELD ENTRY TAD PCHK+1 /UPPER FIELD ENTRY DCA FCDF CLL CMA TAD I MPUSHF /BACKUP POINTER ISZ MPUSHF DCA AUTO TAD [-4 JMS PCHK TAD [-4 DCA PCHK FCDF, CDF L P /CHANGE TO CALLING FIELD TAD I AUTO CDF S DCA I PDLXR /LOAD STACK ISZ PCHK JMP FCDF /WITH FOUR WORDS SP2 TAD FCDF /CHANGE 'CDF' TO 'CDI' DCA .+1 CDI L P JMP I MPUSHF APUSHX, DCA MPOPF /PUSH THE AC ON THE STACK SM1 JMS PCHK TAD MPOPF DCA I PDLXR CDI P JMP I (XPUSHA+3 /ONLY USED BY FIELD 1 *.&7757 TBUF, ZBLOCK 20 /TELETYPE OUTPUT BUFFER MPOPF, 0 /POP 4 WORDS TAD I MPOPF DCA AUTO JMS PCHK /COPY THE PDLXR TAD [-4 DCA PCHK TAD I PDLXR DCA I AUTO CDF P ISZ I [PDLXR /FAKE A FIELD 1 USE CDF L ISZ PCHK JMP .-6 ISZ MPOPF JMP I MPOPF TRAP, 0 /RECOVER FROM SELETED ERRORS DISMISS TAD TRAP DCA GOSW /ASSUME NORMAL ERROR EXIT SP2 CDF P ISZ I (NAGSW /WAS A LINE NUMBER GIVEN? JMP EXIT /YES, FALL INTO THE TRAP JMP GOSW+1 /NO, DO THE USUAL STUFF REKOVR, 0 /CONTINUATION OF ERROR ROUTINE KCC TAD (-17 DCA TBUF TAD (TBUF DCA PDLXR DCA I PDLXR /CLEAR OUT THE TTY BUFFER ISZ TBUF JMP .-2 TAD I SWAP /CHECK CORE-SWAP FLAG SNA CLA JMS I SWAP /RESTORE THE SCRATCH AREA TAD [CR /PRINT A CR AHEAD OF ERROR MESSAGE CLA /OR 'JMS I PRNTC' TAD REKOVR /LET 'EOF' RESTORE THE TTY CDI P DCA I [EOF JMP I (EOF+1 /THEN GO PRINT THE ERROR MESSAGE PAGE 26 /INITIALIZE THE VARIABLES AND THE DATE INITLZ, ZBLOCK 20 /CLEAR ANNOYING FLAGS SM8 /PATCH FOR MULTI-8 JMP .+4 6770 /GET THE TIME-OF-DAY JMS I MV1 /REVERSE HRS, MINUTES DCA MV1-4 /INITIALIZE RANDOM NO. TAD .+3 JMS MOVE /LOAD COMMAND DECODER AREA .+1-MV1 RELOC RANDOM-16 PUTV, .-1 /SUBROUTINE TO LOCATE VARIABLES DCA THISOP /SAVE THE NAME DCA LORD /CLEAR SUBSCRIPT PUSHJ GS1 /DO THE LOOKUP POPF FLAC /GET THE VALUE FENT FPUTIPT1 /STORE IT FEXT TAD LASTV /ADVANCE THE POINTER DCA FIRSTV CIF L JMP I PUTV /RETURN RANDOM, 0;4421;3040;1;0 /RANDOM ENOUGH? RELOC MV1, SM1 /SET THE ADDRESS POINTERS TAD I (FIRSTV /USING THE VALUE HERE DCA I (SECRTV TAD I (FIRSTV DCA I (LASTV JMS SETV /CALL OUR FIELD 1 ROUTINE PI;2011 SP2 TAD I (LASTV DCA I (DIMEN /FOR DOUBLE SUBSCRIPTING JMS SETV FPZ;4100 /! JMS SETV FPZ;4200 /" SP2 TAD I (LASTV DCA I (FSFP /FOR FSF'S JMS SETV FPZ;4300 /# JMS SETV FPZ;4400 /$ JMS SETV FPZ;4500 /% JMP FINALZ /'NOP' FOR MORE JMS SETV FPZ;4600 /& JMS SETV FPZ;7200 /: JMS SETV FPZ;3400 /\ JMP .+3 /SINGLE QUOTE IS OUT FPZ;4700 /' FINALZ, CIF T JMS I (DATA /SET THE DATE WORDS JMS I (ENVIR /CHECK THE ENVIRONMENT KSF /KEYBOARD INPUT? JMP NONAME /NO JMP SWAP /YES: LEAVE VERSION ID FPZ= TBUF /FLOATING POINT ZERO PI, 2;3110;3755;2421 SETV, 0 /CROSS-FIELD CALL CDF L TAD I SETV /GET THE DATA VALUE ISZ SETV DCA .+2 LPUSHF /SAVE IT ON THE STACK 0 TAD I SETV /NOW GET THE NAME ISZ SETV CDI P JMS I (PUTV /AND INSERT IT JMP I SETV /DF=P MOVE, 0 /CLEVER LITTLE ROUTINE DCA AUTO TAD I MOVE DCA PC0+1 ISZ MOVE CDF L TAD I MOVE /WHERE ITS AT CDF P DCA I AUTO /WHERE ITS GOING ISZ PC0+1 /COVER OUR TRACKS JMP MOVE+4 ISZ MOVE JMP I MOVE /DF=P PAGE 15 /CHECK THE RUN-TIME ENVIRONMENT: 7777 /BIPCCL POINTER XI33+1 /RELOCATION POINTER ENVIR, 0 TAD I ENVIR-2 /ARE WE RUNNING UNDER SOMETHING? RTL /2000=BATCH, 1000=RTS8 SNL SMA CLA /EITHER BATCH OR RTS8? JMP VIDEO /NO, CHECK SCOPE MODE TAD ENVIR-1 /GET RELOCATION POINTER JMS I .+12 /CHANGE TO NON-INTERRUPT I/O .+1-MV2 RELOC XI33+2 /XI33, 0 / KSF /ANY INPUT? JMP .-1 /WAIT UNTIL THERE IS JMS KCHK TAD INBUF /HERE IT IS DCA XOUTL KCC DCA INBUF /CLEAR INPUT FLAG TAD XOUTL JMP I XI33 XOUTL, MOVE TLS /THIS IS ALL WE NEED! 7600 /'CLA' = MONITOR EXIT JMS KCHK /CHECK FOR INPUT TSF /BUFFER FULL? JMP .-1 JMP I XOUTL BYEBYE, CDI /RETURN TO OS/8 JMP I XOUTL+2 /OR TO BATCH... "P-"C POPX, JMS KCHK /CHECK INPUT AFTER A 'POPJ' JMP I .+1 XPOPJ "C&277 KCHK, POPX /KEYBOARD CHECK KSF JMP I KCHK /NOTHING WAITING KRS AND P177 SNA JMP I KCHK /IGNORE NULLS TAD M20 SNA /CTRL P? JMP M20+2 TAD POPX-1 SNA /CTRL C? JMP BYEBYE TAD KCHK-1 /SET PARITY DCA INBUF /SAVE THE INPUT JMP I KCHK RELOC MV2, TAD .-20 /PATCH 'POPJ' DCA I (POPJ&177 TAD .-21 /MOVE 'KSF' DCA I ENVIR-1 /INTO PLACE / DISABLE ALL THE 'IONS' DCA I [ERROR+1 DCA I (4333 /FRA CDF L DCA GOSW-1 DCA I (247 /SINPUT DCA I (OECHO-1 DCA I (ICHAR1-1 TAD MV3-5 /NOP DCA I (TAB+10 DCA I (IOWATE+2 / CHECK FOR BATCH TAD I ENVIR-2 /IS BATCH RUNNING? RAL SMA CLA JMP VIDEO /NO, CHECK SCOPE MODE TAD I ENVIR-2 AND .+16 /GET THE BATCH FIELD TAD .+16 /ADD 'CIF' DCA .+15 /SET UP THE INSTRUCTION TAD ENVIR-1 /CHANGE TTY TO BATCH I/O JMS I ENVIR+20 /=MOVE .+1-MV3 RELOC XI33+2 /XI33, 0 / CIF BF /CHANGE TO THE BATCH FIELD JMS I BATIN /READ FROM THE BATCH STREAM ERROR2 /NOTHING LEFT! TAD XOUTL-1 /CAST OUT LINEFEEDS SNA JMP XI33+1 TAD CLF JMP I XI33 -LF XOUTL, 70 /OUTPUT TO THE BATCH LOG CIF /'PATCHED FOR BATCH' 7000 /'NOP' = BATCH EXIT JMS I BATOUT JMP I XOUTL BATIN, 5400 BATOUT, 7400 RELOC MEMSIZ= CDI T V /SELECT THE HIGHEST FIELD MV3, TAD .-6 /MOVE THE 'CDI' INSTR DCA I ENVIR-1 /TO 'XI33+1' TAD .-10 /AND THEN TO 'BYEBYE' DCA I (BYEBYE /TO CATCH CTRL/C'S TAD MV2-4 DCA I (BATXIT /FIX UP THE ERROR ROUTINE TAD .-14 TAD (-MEMSIZ /CHECK MEMORY SIZE SPA SNA CLA ERROR1 /NOT ENOUGH MEMORY! VIDEO, CDF 10 TAD I (17726 /DO WE HAVE A VIDEO TERMINAL? AND [200 SNA CLA JMP .+6 /NO, LEAVE RUBOUT ALONE TAD (TAD START DCA I (RUB1+3 TAD (ECHOC /YES, USE 'BS', 'SP', 'BS' DCA I (RUB1+4 SKP DCA I (MODLN /REMOVE LINENO PRINTOUT CDF L JMP I ENVIR PAGE / FILE CLOSING AND OUTPUT ROUTINES PAGE 27 /'JMP I 0' CLOSER, 0 /CLOSE OR REMOVE THE FILE DCA TEMP /SET THE 'CALL' FLAG TAD OUTFLG /IS THERE AN OPEN FILE? SNA CLA JMP I CLOSER /NO, IGNORE THE COMMAND TAD O2 /WHICH COMMAND? SNA CLA JMP REMOVE /'ABORT' TAD [232 /'CLOSE' JMS NOCHAR /INSERT A 'CTRL/Z' GETSIZ, SNL SMA /POINTS TO 'MGETA' JMP .-2 /AND PAD WITH ZEROS ISZ TEMP /CHECK CALLING FLAG JMP NOSIZE REMOVE, JMS I GETSIZ /GET THE CLOSING LENGTH, IF ANY STL /ONLY 'O A' & 'O C' HAVE SIZES TAD OLNGTH /COMPARE WITH THAT AVAILABLE SNL SZA CLA ERROR1 /BETTER LUCK NEXT TIME TAD I [LORD /GET THE SIZE BACK SZA /ZERO MEANS 'AS IS' DCA BLKCNT /ENTRY POINT FOR OVERFLOW ERROR NOSIZE, CDF P /RESTORE OUTPUT TO THE ECHO DEVICE TAD I [ECODEV DCA I [OUTDEV /THE USR MUST NOT BE IN CORE! JMS I IOWAIT /WAIT FOR TELETYPE (RESETS DF) JMS I [SETDHT /SET THE ENTRY POINT FOR 'CLOSE' FILDEV-1 / POINTER TO DEVICE # AND ENTRY CIF 10 TAD FILDEV /SAVED DEVICE NO. JMS I USR 4 ONMTMP /FILE NAME POINTER BLKCNT, 0 /CURRENT FILE LENGTH OLNGTH, 0 /MAXIMUM " " TAD OUTFLG SNA CLA ERROR1 /FILE WAS TOO LONG DCA OUTFLG /CLEAR THE 'FILE OPEN' FLAG JMP I CLOSER /ALSO CALLED BY 'SAVE' & 'DELETE' ABORT, DCA O2 /'OUTPUT ABORT' COMMAND DCA BLKCNT CLOSE, SM1 /'OUTPUT CLOSE' COMMAND JMS CLOSER /L=1 JMP EXIT /SIMPLE - ONCE YOU KNOW HOW! NOCHAR, 0 /OS/8 3/2 BUFFERED CHARACTER OUTPUT AND (377 /MASK OUT GARBAGE ISZ O2 /WHICH CHAR OF THREE? JMP O1 /STRAIGHT PACKING JMS O2 /HALF WORD PACKING - PACK 1ST HALF TAD O3 /GET SAVED ARG JMS O2 /PACK SECOND HALF SM3 /RESET 3-WAY SWITCH DCA O2 /BUFFER CAN ONLY BE FILLED WITH ISZ OUTFLG /THE 3RD CHARACTER OF 3 JMP O1+2 /NOT FULL YET TAD OLNGTH /CHECK THE FILE SIZE TAD BLKCNT /AMOUNT USED SO FAR SNL CLA /HAVE WE GONE TOO FAR? JMP NOSIZE-1 /YES, DELETE THE FILE I0F JMS I OUTHND /WRITE ONE BLOCK BUFFER 4200 1600 /5200 PATCHED BY PLOT OBLK, 0 JMP I [DERR /DEVICE ERROR ISZ OBLK /BUMP OUTPUT BLOCK ISZ BLKCNT /AND COUNT OF BLOCKS SO FAR JMS O3 /RESET POINTERS FOR NEXT BUFFER JMP I NOCHAR /L=1 O1, DCA I OPTR1 /NORMAL PACKING IS EASY! ISZ OPTR1 /BUMP POINTER CLL JMP I NOCHAR /L=0 O2, 0 /HALF-WORD PACK ROUTINE CLL RTL RTL DCA O3 /SAVE FOR SECOND HALF TAD O3 AND [7400 TAD I OPTR2 /ADD IN CHARACTER IN RIGHT HALF DCA I OPTR2 /PACK IT ISZ OPTR2 /BUMP POINTER AGAIN JMP I O2 O3, 0 /RESET THE OUTPUT POINTERS SM3 DCA O2 TAD OBLK-1 DCA OPTR1 TAD OPTR1 DCA OPTR2 TAD [-200 /X3 = 384 CHARACTERS/BUFFER DCA OUTFLG JMP I O3 /'SM3' SETS THE LINK OPTR1, 0 /PACKING POINTERS OPTR2, 0 JMS NOCHAR /'OUTPUT BUFFER' COMMAND DUMPER, TAD OUTFLG /DUMPS THE OUTPUT BUFFER SNL SZA CLA /L=0 INITIALLY JMP DUMPER-1 JMP EXIT /PAD WITH ZEROS AND EXIT ILNGTH XLEN, TAD OLNGTH /FUNCTION TO CHECK FILE LENGTH TAD BLKCNT /(MINUS THE AMOUNT USED SO FAR) CIA SKP TAD I XLEN-1 /FUNCTION TO CHECK INPUT SIZE CDI P JMP I .+1 FL0AT /THIS IS THE 'OPEN OUTPUT' COMMAND: TTYOUT OUTPUT, STL CMA /SET ECHO FLAG AND CALL=3 JMS I [OPEN /CALL USR, HANDLER; ENTER FILE OUTBLK-1 /OUTPUT HANDLER BLOCK ERROR0 /ENTER ERROR: CLOSE FILE & RETRY? JMP I OUTPUT-1 /'OPEN OUTPUT TTY:' (OR JUST 'O O') TAD FLNGTH /MAXIMUM ALLOWABLE LENGTH CIA DCA OLNGTH TAD STBLK /STARTING BLOCK DCA OBLK JMS O3 /SET UP PACKING POINTERS DCA BLKCNT LPUSHF /SAVE THE FILE NAME FOR CLOSING NAMLOC LPOPF ONMTMP-1 /CODE SPILLS ACROSS THE PAGE *FLOUTP-1 /FUDGE TO SAVE A WORD OR TWO JMP ORST BLKNO, 0 ILNGTH, 0 ORST, TAD OUTFLG /'OPEN RESTORE OUTPUT' COMMAND SNA CLA /FLAG IS CHARACTER COUNT ERROR0 /NO OUTPUT FILE TO RESTORE TAD OFFSET /POINTER TO FILE OUTPUT ROUTINE TTYOUT, TAD [XOUTL /SWITCH OUTPUT TO THE TELETYPE CDF P /ENTRY POINT FOR INTERNAL HANDLERS DCA I [OUTDEV ISZ GOSW /SKIP IF NO ECHO TAD OCHAR0+2 /'TAD ENDCHK' DCA OECHO /SET OUTPUT ROUTINE JMP EXIT /FINISH THE LINE TTYP, XI33 /TTY INPUT INDEV /THE 'OPEN' AND 'RESTORE' COMMANDS AND FILE INPUT/OUTPUT SCANER OCMND, JMS I .-1 /'O' COMMAND ENTRY - SKIP TO NEXT TAD DOTDA DCA EXTENSION /SET '.DA' CMA DCA GOSW /INITIALIZE THE ECHO SWITCH LJUMP /GO DO COMMAND FILIST-1 FILEGO-FILIST ERROR1 /OOPS - BAD 'O' COMMAND RESTOR, CDF P /'O R' COMMANDS - GET NEXT LETTER TAD I XCHAR DCA TEMP /SAVE COMMAND LETTER GTNAME /CHECK FOR ECHO AND LINE NUMBER TAD TEMP DCA CHAR LJUMP /SORT OUT "I", "O", OR "R" ORLIST-1 ORGO-ORLIST ERROR1 /BAD 'RESTORE' COMMAND DOTDA, 401 /WAS 604 FOR '.FD' /THE 'OPEN INPUT' COMMAND: INPUT, CLL CMA /INITIALIZE ECHO AND SET 'CALL'=2 JMS I [OPEN /CALL THAT AMAZING INBLK-1 /GENERAL-PURPOSE SUBROUTINE ERROR0 /WHOOPS - FILE NOT FOUND JMP TTYIN /'OPEN INPUT TTY:' (OR JUST 'O I') TAD FLNGTH DCA ILNGTH /FOR 'FLEN' AND 'FRA' TAD STBLK DCA BLKNO RERD, TAD BLKNO /'OPEN RE READ' COMMAND DCA IBLK /FIRST BLOCK NO. SM1 /RESET FILE POINTERS DCA INFLG /CHARACTER COUNTER IRST, TAD INFLG /'OPEN RESTORE INPUT' COMMAND SNA CLA /CHECK CHARACTER COUNT ERROR0 /NO INPUT FILE TO RESTORE JMP I [CR /SET POINTER TO 'ICHAR0' (12K) TAD OFFSET /=ICHAR-XI33 TTYIN, TAD TTYP /'OPEN INPUT TTY:' CDF P DCA I TTYP+1 /= 'INDEV' ISZ GOSW /CHECK ECHO MODE TAD IRST+2 /= 'PRINTC' DCA I ECHOP JMP EXIT /RETURN /OFFSET,OCHAR-XOUTL /8K CONSTANT OCHAR0, 0 /FILE OUTPUT VIA 'PRINTC' DCA ENDCHK /SAVE CHARACTER FOR ECHO TAD ENDCHK JMS I FILOUT /WRITE IT I0N OECHO, TAD ENDCHK /=0000 IF NO ECHO SNA ISZ OCHAR0 /SET NO ECHO RETURN CDI P JMP I OCHAR0 FILOUT, NOCHAR RDPTR, 0 /THIS IS A COROUTINE ! JMS ENDCHK /ISN'T THAT AMAZING ? INFLG, 0 ICHAR0, ISZ INFLG /DO WE NEED ANOTHER BUFFER? JMP I RDPTR /NO, UNPACK THE CHARACTER I0F JMS I INHND /YES, GO GET IT 0200 3200 IBLK, 0 SMA CLA /ONLY BOTHER WITH FATAL ERRORS SKP CLA JMP I [DERR /WE'VE GOT ONE TAD [-600 /=384 CHARACTERS/BUFFER DCA INFLG ISZ IBLK /BUMP TO NEXT BLOCK TAD IBLK-1 /AND RESTORE POINTERS DCA IPNTR I0N ICHAR1, TAD I IPNTR /STRAIGHT-FORWARD UNPACK ROUTINE JMS RDPTR /DO COMMON STUFF TAD I IPNTR /SAVE LEFT HALF FOR LATER AND [7400 DCA I IBLK-1 ISZ IPNTR /INCREMENT TO NEXT WORD TAD I IPNTR /ANOTHER EASY ONE JMS RDPTR TAD I IPNTR /THIS IS THE TRICKY ONE! ISZ IPNTR /GET LOW-ORDER HALF AND [7400 CLL RTR /SHIFT RIGHT RTR TAD I IBLK-1 /GET HIGH-ORDER HALF (REMEMBER?) RTR /SHIFT SOME MORE RTR JMS RDPTR /GOT IT! JMP ICHAR1 /1-2-3-1-2-3-1-2-3 ... IPNTR, 0 ECHOP, IECHO /PROCESS THE CHARACTERS FROM EITHER INPUT FILE: ENDCHK, 0 /CALLED BY 'RDPTR' AND 'SEND' AND K177 /IGNORE PARITY SZA /NULL? JMP .+4 /NO ISZ ENDCHK /YES, TAKE THE 2ND EXIT AND JMP I ENDCHK /RETURN TO THE INPUT ROUTINE -32 TAD .-1 /END OF FILE? (^Z) SZA JMP .+5 /NO DCA I ENDCHK /YES, CLEAR 'FILE OPEN' FLAG CDF P /AND SET UP A CLEVER RETURN TAD [EOF /TO RESTORE THE KEYBOARD FOR DCA I TTYP+1 /INPUT AND FLAG THE ERROR AT TAD [232 /THE SAME TIME! THIS -ALSO- CDI P /REMOVES THE ^Z SO YOU DON'T JMP ICHAR+3 /GET A SECOND ERROR MESSAGE! *CDF L PLTDEV, XOUTL; ZBLOCK 2 /COULD BE USEFUL! /TABULATE ROUTINES: CALLED FROM THE UPPER FIELD CR-SP TAB, CDI P /'PRINTC' TAB COUNTER SNA /TEST FOR CR DCA I [ERROR /RESET COUNTER SNA JMP CROUT TAD TAB-1 /CR-SP SMA /NON-PRINTING CHARACTERS ISZ I [ERROR /ADD 1 TO TAB COUNT (FIELD 1) I0N /TURN ON AFTER AN ERROR TAD [SP JMP CROUT+3 ZER, TASK SMA CLA /INITIAL ENTRY POINT JMP POS TAD I XCHAR /SAVE THE CURRENT CHARACTER DCA CHAR NEG, CDI P JMP SKPX /SKIP OVER ONE (OR MORE) ISZ I [LORD JMP NEG TAD CHAR DCA I XCHAR /RESTORE THE ORIGINAL ONE POS, CDI P TAD I [LORD /FIND OUT WHERE WE'RE GOING STL CIA TAD I [ERROR /SUBTRACT FROM WHERE WE ARE SNL CLA JMP I ZER /FORGET IT... TAD [SP JMS CPRNT /PRINT SPACES JMP POS *RMF 0 /'PRINTC' FOR LISTING AND DATE CDI P JMS CPRNT JMP I RMF /LOAD A HANDLER INTO THE PROPER SLOT: (ENTRY AT 'HANDLR') NOTEQ, ISZ SLOT /BUMP POINTER TO SAVE NAME TAD NEWDEV /MOVE NEW DEVICE NAME TO TABLE DCA I SLOT ISZ SLOT TAD NEWDEV+1 DCA I SLOT ISZ SLOT GETMON /NEED USR, MIGHT AS WELL LOCK IT IN RETRY, TAD NEWDEV /MOVE DEVICE NAME FOR MONITOR CALL DCA DEVC TAD NEWDEV+1 DCA DEVC+1 TAD I SLOT /MOVE LOAD POINT DCA DLOAD CIF 10 JMS I USR /CALL MONITOR (ALREADY IN CORE) 1 DEVC, 0 0 /DEVICE NO. DLOAD, 0 /ENTRY POINT ERROR0 /DEVICE NOT AVAILABLE TAD DLOAD /CHECK IF THE HANDLER HAS BEEN AND [7600 /LOADED INTO THE PROPER PAGE CMA /'CIA' FOR 1-PAGE HANDLERS TAD I SLOT /DESIRED PAGE SZA CLA TAD DLOAD /WRONG PAGE! TAD [200 /IS IT THE SYSTEM HANDLER? SPA CLA /IF .GT. 7600 WE'RE OK JMP NOGOOD /SORRY, TRY IT AGAIN ISZ SLOT /BUMP POINTER TO DEVICE # TAD DEVC+1 /SAVE IT DCA I SLOT ISZ SLOT /MOVE TO ENTRY POINT TAD DLOAD DCA I SLOT /SAVE ENTRY TAD DEVC+1 HANDX, DCA TEMP /DEVICE NO. JMP I HANDLR NOGOOD, DCA DLOAD /CLEAR ENTRY POINT JMS SETDHT /TELL USR THE HANDLER DLOAD-2 /IS NOT IN CORE ANYMORE JMP RETRY /LOAD IT THIS TIME *ECODEV HANDLR, 0 /AC = BLOCK POINTER DCA SLOT SM2 /IF THE HANDLER HAS THE SAME NAME, COMPARE /DON'T LOAD IT AGAIN SLOT, 0 NEWDEV-1 JMP NOTEQ /DIFFERENT NAMES, LOAD NEW HANDLER ISZ AUTO 2 /BUMP PAST LOAD POINT TAD AUTO 2 /(SET BY 'COMPARE') DCA .+2 JMS SETDHT /IN CASE USR RESET THE TABLE 0 TAD I AUTO 2 JMP HANDX /SAVE THE DEVICE NO. TTYDEV, DEVICE TTY /FOR COMPARISON PURPOSES *EOF SETDHT, 0 /SET THE DEVICE HANDLER TABLE TAD I SETDHT / (TO FAKE OUT THE USR) DCA PDLXR /POINTER TO DEVICE # AND ENTRY TAD (17646 /TABLE LOCATION TAD I PDLXR /PLUS DEVICE NUMBER DCA DEVC /POINTS TO 'HANDLER-IN-CORE' FLAG TAD I PDLXR CDF 10 DCA I DEVC /FLAG IS SIMPLY HANDLER ENTRY CDF L ISZ SETDHT JMP I SETDHT /ALSO CALLED BY 'CLOSER' /CHARACTER TABLE FOR LOWER-FIELD COMMANDS: KOMLST, CR-200 /RETURN ";-200 /DITTO "Z /ZERO "N /NAME "G /GOSUB "P /P??? FILIST, "L /LIST "A /ALL OR ABORT "C /CALL OR CLOSE "D /DATE OR DELETE "B /BR. OR BUFFER "E /EXIT OR EVERY ORLIST, "S /SAVE OR SECOND "R /RUN OR RESTORE "I /INPUT OR INITIAL "O /OUTPUT OR ONLY PAGE 32 /LIBRARY COMMANDS: SAVER, DELETR, CALLER, RUNNER, GOSUB *FPNT /ENTER VIA 'JMP I 7' LCMND, JMS SCANER /SAVE CHAR AND MOVE TO THE NEXT TAD (603 /SET '.FC' DCA EXTENSION DCA GOSW /POINT TO 'PROC' LJUMP /BRANCH TO THE APPROPRIATE ROUTINE KOMLST-1 KOMGO-KOMLST ERROR1 /SORRY, TRY AGAIN SCANER, (CALL /COMMAND WORD SCANNER CDI P TAD I XCHAR /SAVE CURRENT CHARACTER DCA CHAR JMS LSORT /SCAN TO THE END JMP I SCANER SAVER, GTNAME /'LIBRARY SAVE' COMMAND JMS TEMP /FILL IN THE HEADER JMS SAVE /DO IT JMP EXIT /DONE DELETR, JMS I CL0SE /'LIBRARY DELETE' COMMAND GTNAME TAD LBUFR /'LIBBLK-1' GETHND JMS LCLOSE JMP EXIT-2 LCLOSE, (OPENUP /SAVE OR DELETE A FILE DCA SAVBLK TAD DEVNO CIF 10 JMS I USR 4 NAMLOC SAVBLK, (20 ERROR0 /NOT THERE JMP I LCLOSE FOCLTM, FILENAME FOCAL.TM GOSUB, LPUSHF /'LIBRARY GOSUB' COMMAND FOCLTM LPOPF /MOVE 'FOCAL.TM' TO NAME AREA NAMLOC-1 TAD DSK /IN CASE WE NEED TO SAVE IT DCA NEWDEV DCA NEWDEV+1 TAD LIBFLG /ARE WE ALREADY SAVED? SNA CLA JMS SAVE /NO TAD (603 DCA EXTENSION /RESET EXTENSION TO 'FC' /LOOKUP AND LOAD ROUTINES: SUBBER, SM3 /THESE ALL DO THE SAME THING AND RUNNER, CLL IAC /THEN BRANCH TO DIFFERENT PLACES CALLER, CLL IAC /LOAD HAS 5 POSSIBLE EXITS ! JMS I [OPEN /CALL THE HANDLER AND LOCATE FILE LBUFR, LIBBLK-1 /= 'BUFR' TOO LIB3, 3 /NOT THERE, NO NAME, OR ERROR1 /SOMETHING JUST AS STUPID JMS I (DEVCHK /FILE STRUCTURED? TAD GOSW /CHECK FOR GOSUB SPA CLA LPUSHF /SAVE CURRENT PROGRAM INFO. LIBDEV JMP LOADGO /'JMP I (LCHECK+2' FOR 8K GOBACK, LPOPF /RESTORE CALLING PROGRAM POINTERS NEWDEV-1 TAD LBUFR GETHND /GET THE HANDLER BACK LOADGO, JMS LOADER /READ THE PROGRAM CDF T /'CDI T' FOR INITIAL DIALOG TAD I D /CHECK PROGRAM I.D. SZA CLA / JMP I D /ENTER SPECIAL PROGRAM INITIAL,ERROR1 /(NONE RIGHT NOW) TAD I [200 /MOVE PROGRAM LENGTH CDF P DCA I LBUFR CDI L /RETURN TO: JMP EXIT-1 /PROC, START, GOTO, OR DO SAVE, 0 /CALLED BY 'SAVER' AND 'GOSUB' JMS I CL0SE /AVOID TROUBLE CDF P TAD I LBUFR /GET PROGRAM LENGTH CDF T DCA I [200 /SAVE IT WITH THE PROGRAM LSHFT, SM1 TAD I [200 /COMPUTE FILE SIZE CDF L AND [7600 /MASK PAGE COUNT JMS I LSHFT /SHIFT IT IAC /ROUND UP TO BLOCKS CLL RAR DCA FLNGTH /SAVE GETMON /CALL THE MONITOR TAD LBUFR GETHND /GET THE HANDLER JMS I (DEVCHK /CHECK FOR STUPIDITY TAD LIB3 DCA I (CALL /SET UP OUR SUBROUTINE JMS I (OPENUP ERROR1 /NO ROOM OR WRITE-LOCKED TAD FLNGTH JMS LCLOSE /UPDATE DIRECTORY IN ADVANCE! TAD (20 /SET THE 'WRITE' BIT JMS LOADER /SAVE THE PROGRAM JMP I SAVE ///// LOADER, 0 /READ (OR WRITE) A PROGRAM TAD FLNGTH /COMPUTE FUNCTION WORD JMS I LSHFT /'SHFTL6' STL RAL /SET TO SEARCH FORWARD IFNZRO T < TAD (T > /ADD FIELD BITS (12K) DCA .+4 TAD STBLK DCA .+4 JMS I LIBHND /GET THE PROGRAM 0 200 /LOADS FROM 200 UP 0 /STARTING BLOCK NO. JMP I [DERR DISMISS /SO WE CAN USE THE STACK LPUSHF NEWDEV /SAVE NEW POINTERS LPOPF LIBDEV-1 /IN CASE WE 'GOSUB' JMP I LOADER PAGE /THE 'OUTPUT DATE' COMMAND DATER, TAD [NODATE-1 DCA AUTO TAD [-4 DCA GOSW CDF T TAD I AUTO /GET DATE JMS I ZEROER-1 /OUTPUT IT ISZ GOSW JMP .-4 JMP EXIT /RETURN ///// DEVCHK, 0 /CHECK THE DEVICE TYPE TAD DEVNO TAD P17757 DCA JUMPER CDF 10 TAD I JUMPER CDF L SMA CLA ERROR1 /DEVICE IS NOT FILE STRUCTURED JMP I DEVCHK P17757, 17757 /DEVICE CONTROL WORD TABLE ///// JUMPER, 0 /SORT AND BRANCH SUBROUTINE JMS I IOWAIT /CLEAR AC, RESET DF, TURN IOF TAD I JUMPER /GET LIST ADDRESS ISZ JUMPER DCA AUTO TAD I AUTO SPA /END OF LIST ? JMP ERR STL CIA TAD CHAR SZA CLA /FOUND IT ? JMP .-6 /NO TAD AUTO TAD I JUMPER /ADD OFFSET DCA JUMPER TAD I JUMPER /POINT TO ENTRY DCA JUMPER ERR, CLA CLL /FALL THROUGH OFFSET JMP I JUMPER /L=0 ///// /LIBRARY COMMAND LIST: KOMGO, GOBACK /CR GOBACK /; ZEROER /Z NAMER /N GOSUB /G SCANER-1 /P LLIST /L LISTAL /A CALLER /C DELETR /D BRANCH /B 7600 /E SAVER /S RUNNER /R INITIAL /I /FILE COMMAND LIST FILEGO, LIST1 /O,L ABORT /A CLOSE /C DATER /D DUMPER /B ECOSET /E SINPUT /S RESTOR /R INPUT /I OUTPUT /O /RESTORE COMMAND LIST ORGO, SRST /S RERD /R IRST /I ORST /O /THE 'LOGICAL BRANCH' COMMAND ALLOWS PROGRAMS TO TEST THE /TELETYPE WITHOUT READING A CHARACTER. THE BRANCH OCCURS /IF THERE IS -NO- INPUT: 1.1 T PI;L B .1;C A KEY WAS HIT /'FIN()' MAY THEN BE USED TO READ AND TEST THE CHARACTER. /THIS HAS NOW BEEN REPLACED BY THE 'JUMP' COMMAND (V4D). BRANCH, CDI P /'LOGICAL BRANCH' COMMAND I0N JMP I .+1 /USES THE 'JUMP' COMMAND! PACLST+3 ///// ONMTMP, ZBLOCK 4 /SAVED FILE NAME /THE 'OUTPUT EVERYTHING' COMMAND SWITCHES TO A DIFFERENT /INTERNAL HANDLER FOR ALL OUTPUT, INCLUDING THE ECHO AND /ERRORS; THIS DEVICE IS RESTORED FOLLOWING AN 'O C' OR /'O A' COMMAND. THE HANDLER MAY ALSO BE CALLED BY 'O O' ECOSET, GTNAME /THE 'O E' COMMAND JMS I INTCHK /WAS IT 'O E LPT:'? TAD [XOUTL /NO, EVERYTHING ELSE = 'TTY:' JMP OSCOPE+1 /SAVE ENTRY POINT ZBLOCK 1 /PATCHED BY LAB OVERLAY OSCOPE, TAD .-1 /THE 'O S' COMMAND CDF P DCA I [ECODEV /AFFECTS BOTH 'OCHAR' AND 'EOF' TAD I [ECODEV JMP I .+1 /INSERT ENTRY PT. INTO 'OUTDEV' TTYOUT+1 ///// INTCHK, LPTCHK /CHECK FOR INTERNAL HANDLERS INTRNL+1 /RETURN POINT JMS I INTCHK /CHECK FOR 'LPT:' SKP /TRY AGAIN JMP I INTCHK-1 /PUT ENTRY POINT INTO 'OUTDEV' SM2 COMPARE /CHECK FOR 'PLTR' PLTDEV NEWDEV-1 JMP I INTCHK+1 /NEITHER OF THESE TAD I .-3 JMP I INTCHK-1 /MOVE THE ENTRY POINT ////// LZERO, HANDLR-3 /THE 'LIBRARY ZERO' COMMAND SM1 /DANGEROUS - BUT USEFUL! DCA I FILCNT /RESET THE FILE COUNT DCA I [HANDLR-2 /CLEAR THE LINK WORD DCA I AUTO /CREATE AN 'EMPTY' WITH TAD FLNGTH / THE SPECIFIED LENGTH SNA /IF NO LENGTH, PROBABLY ERROR1 /DIDN'T WANT TO DO THIS! LZXIT, CIA TAD I LZERO /SUBTRACT SYSTEM BLOCKS DCA I AUTO JMS I LIBHND /PUT IT BACK 4200 FILCNT, HANDLR-4 1 JMP I [DERR /OH DEAR! JMP I LZXIT /RESTORE THINGS AND EXIT ///// /THE 'LIBRARY LIST' COMMAND SHOWS ONLY FILES WITH ONE EX- /TENSION. 'LIST ALL' SHOWS EVERYTHING, 'LIST ONLY' JUST 1. LIBBLK-1 LLIST, CMA CLL RTR /'LIBRARY LIST' COMMAND LIST1, CMA STL RAL /'LIST ONLY' / 'ONLY LIST' LISTAL, DCA I [OPEN /'LIST ALL' COMMAND SM3 /CLEAR THE 'L Z' SWITCH ZEROER, DCA 0 /'LIBRARY ZERO' COMMAND DCA GOSW /= NO EMPTIES GTNAME /GET DEVICE TO LIST TAD LLIST-1 GETHND /GET THE HANDLER JMS DEVCHK /CHECK DEVICE TYPE DISMISS /REMOVE THE USR JMS I [7607 /SWAP OUT CORE TO MAKE ROOM 4200 /FOR DIRECTORY HANDLR-4 40 /SYSTEM SCRATCH AREA JMP I [DERR /WHOOPS! DCA I SWAP /SET THE FLAG TO SWAP BACK IN IAC /DIRECTORY BEGINS WITH BLOCK 1 BLOKLP, DCA LBLOCK JMS I LIBHND 0200 HANDLR-4 /POSITIONED FOR OUR CONVENIENCE! LBLOCK, 1 JMP I [DERR TAD [HANDLR /FIRST 5 WORDS ARE INFORMATION DCA AUTO TAD 0 /CHECK FOR 'L Z' SNA CLA JMP I (LZERO+1 /OR 'EMPTY-2' TO DISABLE 'L Z' LOOP2, TAD AUTO /SAVE NAME POINTER FOR PRINTING DCA LIBX TAD I AUTO SNA CLA JMP EMPTY /CHECK IF WE SHOULD LIST EMPTIES ISZ AUTO ISZ AUTO TAD I AUTO /PICK UP EXTENSION DCA LBLOCK TAD I [HANDLR /WASTE WORDS (NEGATIVE) CIA TAD AUTO /SKIP TO LENGTH DCA AUTO TAD I AUTO /ZERO LENGTH MEANS TEMPORARY FILE *CIA SNA /LZERO RETURN JMP LOOP3 /IGNORE SUCH THINGS DCA FLNGTH TAD NAMLOC /WAS A NAME GIVEN ? SNA CLA JMP CKEXTN /NO TAD EXTENSION /CHECK THIS TOO? SNA CLA IAC /NO, ONLY CHECK THE NAME TAD [-4 COMPARE /COMPARE THIS NAME WITH ARG LIBX, AUTO-1 NAMLOC-1 JMP LOOP3 /NON-MATCHING ISZ I [OPEN /TEST FOR ONLY ONE TAD EXTENSION /OR A NULL EXTENSION SZA CLA DCA NAMLOC /DON'T CHECK ANY MORE JMP DIRLST CKEXTN, TAD EXTENSION /DO WE WANT THIS ONE? CIA TAD LBLOCK SZA CLA TAD I [OPEN /TEST FOR 'ALL' SPA CLA JMP LOOP3 /GUESS NOT DIRLST, SM3 /PRINT 3 WORDS DCA TEMP ISZ LIBX TAD I LIBX JMS I DIRLST /PRINT 2 CHARS ISZ TEMP JMP .-4 TAD DOT JMS I PRNTC TAD LBLOCK /PRINT EXTENSION JMS I DIRLST TAD NPRNT+2 /SET UP FOR DECIMAL LENGTH PRINT DCA NEWDEV NLOOP, DCA NEWDEV+1 /INITIALIZE LEADING-ZERO FLAG DCA SHFTL6 /CLEAR QUOTIENT TAD I NEWDEV /FINISHED ALL POWERS OF 10? SNA JMP LOOP3-2 /YES, ALL DONE TAD FLNGTH /NO, ADD THIS POWER SMA SZA /OVERFLOW? JMP DIDJET /YES, PRINT THIS DIGIT DCA FLNGTH /NO, GO THROUGH THE LOOP AGAIN ISZ SHFTL6 /ADD ONE TO THIS DIGIT JMP NLOOP+2 /ANOTHER DIVIDE CYCLE TAD [CR /DONE WITH THIS LINE (WHEW!) JMS I PRNTC LOOP3, ISZ I LBLOCK-1 /DONE WITH THIS BLOCK? JMP LOOP2 /NO, KEEP GOING JMS I IOWAIT /WAIT FOR I/O TAD I [HANDLR-2 /LINK TO NEXT BLOCK SZA /LAST BLOCK? JMP BLOKLP /NO, GET THE NEXT JMS I SWAP /YES, RESTORE SWAPPED CORE JMP EXIT /(JMS RESETS THE FLAG) /MANY THANKS TO STEVE L. GILLETT FOR FIGURING OUT /HOW TO MAKE ROOM FOR THE 'LIST EMPTIES' OPTION!! EMPTY, TAD I AUTO /LIST THE EMPTIES! DCA FLNGTH /GET THE LENGTH TAD GOSW /ARE WE SUPPOSED TO? SMA SZA CLA /',E' TESTED BY 'GTNAME' JMP NLOOP-3 /YES, INDENT SLIGHTLY JMP LOOP3 /FORGET IT DIDJET, CLA CLL /CLEAN UP THE AC ISZ NEWDEV /NEXT POWER OF TEN TAD SHFTL6 /IF THIS DIGIT IS ZERO, AND NO ISZ NEWDEV+1 /OTHER DIGITS HAVE BEEN NON-ZERO, SZA /PRINT A SPACE INSTEAD JMP NPRNT TAD [SP JMS I PRNTC JMP NLOOP NPRNT, TAD ["0 /CHANGE TO ASCII JMS I PRNTC CMA STL /SET ZERO SWITCH JMP NLOOP DECIMAL;*CMA STL /TRICKY, HUH? 1000 100 10 1 OCTAL; *SM1 /MORE TRICKS! SHFTL6, 0 /CLEVER USE TERMINATES TABLE CLL RTL RTL RTL JMP I SHFTL6 /CONSIDER 'BSW' FOR THE 8/E NAMLST, "< /BLOCK ": /DEVICE "( /VARIABLE DATA DOT, ". /EXTENSION "[ /SIZE ", /ECHO PAGE 35 /ROUTINE TO ENTER OR FIND A FILE FOR 'O O', 'O I' & 'LIB' OPEN, 0 /LOOKUP AND ENTER ROUTINE DCA GOSW /SET ECHO/LOAD SWITCH IAC RAL /SET CALL CODE (2 OR 3) DCA CALL GTNAME /GET DEVICE AND FILENAME TAD MDSK /CALLING SEQUENCE: TAD NEWDEV / AC=GOSW, L=1 FOR ENTER SNA / JMS I [OPEN TAD NAMLOC / HANDLER BLOCK (-1) SNA CLA / ERROR RETURN JMP SHUT+1 / 'TTY' RETURN SM2 / REGULAR RETURN COMPAR /CHECK FOR CALLS TO 'TTY:' TTYDEV-1 /'TTY:' IS ALSO THE DEFAULT TLSW, NEWDEV-1 /WHEN NO OTHER NAME IS FOUND JMP I INTRNL /CHECK FOR OTHER INTERNAL DEV. JMP SHUT+1 /'TTY:' INTRNL, INTCHK+2 /'.+1' FOR 8K TAD I OPEN /GET HANDLER BLOCK TO USE GETHND /LOAD THE HANDLER TAD NAMLOC /CHECK FOR A DIRECT ACCESS CALL SHFT, CMA STL RAL /POINTS TO 'SHFTL6' TAD CALL /'NAMLOC'=1, 'CALL'=2 (ONLY) SNA ERROR1 /CANNOT USE '<>' WITH 'OPEN OUTPUT' IAC SNA CLA JMP SHUT-1 /OK: 'STBLK' & 'FLNGTH' ARE SET JMS OPENUP /DO WHAT WE CAME FOR JMP SHUT+2 /ERROR RETURN TAD CALL+2 CIA DCA FLNGTH /SAVE POSITIVE LENGTH ISZ OPEN SHUT, DISMISS /REMOVE THE USR ISZ OPEN ISZ OPEN JMP I OPEN /NORMAL RETURN ///// USRIN, 0 /LOCK THE USR IN CORE - 'GETMON' I0F CIF 10 JMS I USR 10 TAD [200 DCA USR JMP I USRIN OPENUP, 0 /CALLED BY 'SAVE' AND 'OPEN' TAD XNAME DCA CALL+1 /INITIALIZE USR CALL TAD FLNGTH /REQUESTED SIZE FROM 'GTNAME' CLL RTL RTL AND O7760 /SIZE TAD TEMP /DEVICE NO. CIF 10 JMS I USR /'ENTER' OR 'FETCH' CALL, 0 NAMLOC /BECOMES THE BLOCK NO. 0 / AND THE FILE LENGTH O7760, SNL SMA SZA CLA /ERROR RETURN ISZ OPENUP TAD CALL+1 /SAVE STARTING BLOCK DCA STBLK JMP I OPENUP *CLA CLL IAC SWAPIN, NOP /RESTORE CORE AFTER DIRECTORY LIST JMS I [7607 /SYSTEM HANDLER 200 HANDLR-4 40 DERR, ERROR1 /DEVICE ERROR = 'CLA CLL RTL' JMP I SWAPIN USROUT, 0 /REMOVE THE USR - 'DISMISS' SM0 TAD USR /CHECK POINTER TO FIND OUT SMA CLA JMP I USROUT /ALREADY GONE TAD .-2 /RESET THE POINTER DCA USR I0F CIF 10 JMS I [200 11 JMP I USROUT *SP1 IOWATE, 0 /WAIT FOR TELETYPE TO FINISH CDF P I0N TAD I TLSW SZA CLA JMP .-3 I0F CDF L JMP I IOWATE /THEN TURN THE INTERRUPT OFF MDSK, -5723 XFORM, 0 AND K77 SMA SZA TAD [240 AND K77 TAD [240 JMS I PRNTC JMP I XFORM *SM3 NPACK, 0 /STANDARD 6-BIT UNPACK ROUTINE DCA CMPR TAD CMPR JMS I SHFT /'BSW' RAL JMS XFORM TAD CMPR JMS XFORM JMP I NPACK /CALLED BY 'DIRLST' & 'DATER' CMPR, 0 /COMPARE TWO BLOCKS OF ANY LENGTH DCA XFORM /CALLING SEQUENCE: TAD I CMPR / AC= -# OF WORDS ISZ CMPR / COMPARE DCA AUTO 2 / FIRST-1 TAD I CMPR / SECOND-1 ISZ CMPR / RETURN IF NO MATCH DCA AUTO 3 / RETURN IF MATCH TAD I AUTO 2 /COMPARE TWO WORDS CIA TAD I AUTO 3 SZA CLA JMP I CMPR /NO MATCH ISZ XFORM /DONE ? JMP .-6 /NO, CHECK TWO MORE ISZ CMPR /YES, BUMP RETURN POINTER JMP I CMPR ///// PAGE 36 /READ A DEV:FILENAME.EX STRING INTO 'NAMLOC' & 'NEWDEV' NAME, 0 SM1 /POINTER TO 'SHFTL6' DCA AUTO 1 /PERIOD COUNTER DCA MGETA /DIGIT COUNTER TAD DSK DCA NEWDEV DEVNAM, DCA NEWDEV+1 DCA NAMLOC /CLEAR NAME AREA DCA NAMLOC+1 DCA NAMLOC+2 /BUT NOT THE EXTENSION! TAD XNAME DCA STBLK DCA AUTO 2 /CHAR. COUNTER DCA FLNGTH NAMLUP, JMS MGETC /'SM1' SETS L=1 LJUMP /'LJUMP' CLEARS IT NAMLST-1 /TRAP '< : ( . [ ,' NAMGO-NAMLST PLUS10, "9-"0+1 /'NOP' TAD CHAR /CHECK FOR A-Z, 0-9 TAD MINUS9 CLL TAD PLUS10 SZL JMP .+4 /OK TAD K7760 /"0-"@ = -20 STL TAD ("@-"Z-1 SNL CLA JMP NAMEND /ILLEGAL CHARACTER TAD AUTO 2 TAD (-5 K7760, SNL SMA SZA CLA /TOO MANY? JMP IGNORE TAD AUTO 2 CLL RAR TAD STBLK DCA MGETC /NAME POINTER ISZ AUTO 2 TAD CHAR AND K77 SNL JMS I NAME+1 /'SHFTL6' CDF L TAD I MGETC DCA I MGETC NXTNUM, CDF P TAD I PDLXR /MAY BE GARBAGE TAD ["0 DCA CHAR IGNORE, ISZ MGETA TAD MGETA SPA SNA CLA /END OF THE STRING? JMP NAMLUP+1 TAD I XCHAR /YES, IS THERE MORE? TAD MCOMMA CLL SZA CLA /CHECK FOR A COMMA JMP NAMLUP *-"E VARBL, JMS MGETA /PROCESS A VARIABLE FILE NAME CLL CIA DCA CHAR /ASSUME ITS A LETTER TAD I H0RD /NOW CHECK THE SIGN SPA JMP VLETR /IT WAS, USE -1 AS THE COUNT CDI P JMP VFN /CONVERT POS. NUM. TO ASCII BLKNUM, JMS MGETA /READ THE BLOCK NUMBER ISZ NAMLOC /SET THE BLOCK FLAG JMP NAMLUP-3 *-"9-1 COLON, TAD NAMLOC /MOVE NAME TO 'NEWDEV' DCA NEWDEV TAD NAMLOC+1 JMP DEVNAM MGETC, 0 /CROSS-FIELD CALL CDI P JMP LGETC /L=1 TO SKIP 'GETC' DCA CHAR JMP I MGETC *SNL SMA-1 JMP I .+1 /TRY TO FIGURE THIS OUT! MGETA, 0 /EVALUATE AN EXPRESSION JMS MGETC /SKIP THE DELIMITER CDI P JMP GETA /CALL 'EVAL' *-", PERIOD, ISZ AUTO 1 /DOUBLE PERIODS? JMP NAMEND /APPARENTLY DCA EXTENSION /CLEAR OUT THE ASSUMED ONE ISZ STBLK /ADVANCE STORAGE POINTER TAD (4 /ALLOW FOR TWO MORE CHARACTERS JMP NAMLUP-2 NAMGO, BLKNUM /BLOCK MINUS9, COLON /DEVICE MINUSE, VARBL /LETTERS & NUMBERS MCOMMA, PERIOD /EXTENSION SQBRKT /SIZE ECHCHK /ECHO *SMA SZA SQBRKT, JMS MGETA /READ REQUESTED FILE SIZE JMP NAMLUP-1 VFR, DCA PDLXR /SAVE STARTING ADDRESS TAD I (T3 SPA SNA /CHECK DECIMAL EXPONENT CLA IAC /FORCE 1 IF .LE. ZERO STL CIA VLETR, DCA MGETA /EXPONENT=NUMBER OF DIGITS SNL JMP IGNORE /LETTERS JMP NXTNUM /NUMBERS ECHCHK, TAD [SP /REPLACE THE COMMA WITH A SPACE SKP ISZ GOSW /CLEAR THE SWITCH & REMOVE THE 'E' CDF P DCA I XCHAR JMS I (SCANER /SKIP TO THE 'ECHO' OR LINE NO. TAD I XCHAR TAD MINUSE /DOES IT BEGIN WITH AN 'E'? SNA CLA JMP ECHCHK+2 /YES, MARK IT AND CONTINUE NAMEND, CDI P /EVALUATE THE LINE NUMBER JMP GETL JMS I IOWAIT /AND WAIT FOR THE TERMINAL JMP I NAME /***RETURN*** NAMER, GTNAME /'LIBRARY NAME' COMMAND JMP IOWAIT+1 /JUST UPDATES THE HEADER PAGE 37 /PAGE ZERO (FIELD 0) LITERALS: LPUSHF= JMS I [MPUSHF LPOPF= JMS I [MPOPF LJUMP= JMS I [JUMPER COMPAR= JMS I [CMPR GTNAME= JMS I [NAME GETHND= JMS I [HANDLR GETMON= JMS I [USRIN DISMIS= JMS I [USROUT FIELD 0 /READ AND STORE THE OS/8 DATE WORD: FIELD 2 *14 NODATE, TEXT "NO/DA/TE" /BECOMES THE CURRENT DATE *20 NUHEAD, 0 /MOVE THE NAME UP FROM FIELD L TAD I .+2 DCA NUHEAD TEMP TAD .+2 DCA PDLXR NAMLOC-1 TAD .+2 DCA AUTO TITLE-1 SM3 DCA DATUM CDF L TAD I PDLXR CDF T DCA I AUTO ISZ DATUM JMP .-5 DCA I AUTO /CLEAR THE I.D. TAD NODATE+0 /MOVE THE DATE INTO PLACE DCA I AUTO TAD NODATE+1 DCA I AUTO TAD NODATE+2 DCA I AUTO TAD NODATE+3 DCA I AUTO CDI L JMP I NUHEAD DAY, SZA /ZERO = READ CURRENT DATE JMP NIGHT /NON-ZERO = SET NEW DATE TAD I (17666 JMP NIGHT+2 NIGHT, DCA I (17666 JMS DATUM CDI P JMP I .+1 /'FL0ATR' FL0AT PACK1, 0 /HALF-WORD PACK ROUTINE TAD (60 /ADD OFFSET AND (77 ISZ (-1 /TEST THE SWITCH JMP PACK0 CLL RTL RTL RTL DCA PDLXR /SAVE LEFT HALF JMP I PACK1 *0 PACK0, TAD PDLXR /MERGE THE PIECES CDF T DCA I AUTO CDF 10 SM1 DCA (-1 /RESET THE SWITCH JMP I PACK1 *7 600 /EXTENDED DATE MASK ZBLOCK 4 /INDICATE USAGE *104 /LEAVE ROOM FOR 'PC0' PACK2, 0 DCA AUTO 2 /SAVE DIGITS DCA AUTO 1 /CLEAR QUOT. JMP .+3 ISZ AUTO 1 /DIVIDE BY TEN DCA AUTO 2 TAD AUTO 2 TAD (-12 SMA JMP .-5 CLA /CLEAR OVERDRAW TAD AUTO 1 /FIRST DIGIT JMS PACK1 TAD AUTO 2 /SECOND DIGIT JMS PACK1 SM2 /"0"-2="." JMS PACK1 JMP I PACK2 /ROUTINE TO UNPACK THE DATE - USED BY 'FDAY' DATA, 0 /CALLED FROM 'INITLZ' JMS DATUM CDI L JMP I DATA DATUM, 0 /UNPACK THE DATE WORD SM1 DCA (-1 /INITIALIZE TAD (NODATE-1 DCA AUTO CDF 10 TAD I (17666 SNA JMP I DATUM /SKIP NULL DATE RTR AND (77 CLL RAR JMS PACK2 /DAY TAD I (17666 RTL RTL AND K7 RAL JMS PACK2 /MONTH TAD I (17666 AND K7 DCA PDLXR CDF 0 TAD I (7777 /WILL BE -1! K7, AND 7 CLL RTR RTR TAD (106 /1970 TAD PDLXR JMS PACK2 /YEAR JMP I DATUM FIELD 2 $ |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 | / PDP12 OVERLAY FOR 16K U/W-FOCAL(V-4E) -JVZ- / 16KXII.PA /REVISIONS: / I/O PRESET ADDED AT 5400 / /THIS OVERLAY ADDS THE SCOPE HANDLER, THE 'OUTPUT SCOPE', /'VIEW', 'HESITATE', AND 'KONTROL' COMMANDS, AND 8 NEW /FUNCTIONS: 'FLS', 'FRS' 'FSS', 'FXL', 'FADC' AND 'FTIM' /'FBUF' AND 'FTRG' FOR 16K PDP12 USERS. /THE FUNCTIONS 'FLS', 'FRS', 'FSS' AND 'FXL' PROVIDE AC- /CESS TO THE LEFT AND RIGHT SWITCHES, THE SENSE SWITCHES, /AND THE 'EXTERNAL LEVELS'. 'FADC' HAS BEEN MODIFIED TO /READ ANY OF THE 16 ANALOG CHANNELS WHILE 'FTIM' CAN BE /USED TO KEEP TRACK OF THE CLOCK AND 'FBUF' PROVIDES AC- /CESS TO THE POINT-PLOT DISPLAY BUFFER. 'FTRG' MONITORS /THE OCCURANCE OF ANY SIGNALS DETECTED BY THE SCHMITTS. /'FLS' RETURNS AN UNSIGNED VALUE FROM THE LEFT SWITCHES /'FRS' (THE SAME AS 'FSR') RETURNS A SIGNED VALUE /'FSS(N)' RETURNS -1 IF SWITCH N IS OFF, +1 IF IT IS ON /'FXL(N)' RETURNS -1 IF THE LINE IS OPEN, +1 IF LOW /'FADC(N)' READS CHANNEL N (RANGE -512 TO +511) /'FTIM()' RETURNS THE NUMBER OF CLOCK OVERFLOWS /'FTIM(-1)' ZEROS THE COUNTER AND 'FTIM(N)' PRESETS IT /'FBUF(I)' RETURNS THE VALUE AT RELATIVE LOCATION 'I' /'FUBF(I,J)' STORES VALUE OF EXPRESSION J AT LOC. 'I' /'FTRG()' WILL RETURN THE WEIGHTED SUM OF ALL EVENTS. /'FTRG(2)' WILL ONLY CHECK (AND CLEAR) INPUT 3, ETC. /THE 'KONTROL' COMMAND LOADS THE RELAY REGISTER AND THE /'HESITATE' COMMAND RUNS THE CLOCK. THE LATTER IS SOME- /WHAT COMPLICATED: BOTH THE OSCILLATOR FREQUENCY AND THE /NUMBER OF CLOCK PULSES TO COUNT BEFORE GENERATING AN /OVERFLOW CAN BE SET. THE OSCILLATOR FREQUENCY IS PRO- /GRAMMED BY A -NEGATIVE- ARGUMENT WHILE THE NUMBER OF /PULSES IS SPECIFIED AS A -POSITIVE- NUMBER; BOTH MAY BE /INCLUDED IN A SINGLE 'HESITATE' COMMAND. IN ADDITION, /CALLING 'HESITATE' WITHOUT ANY ARGUMENT (OR WITH ZERO) /CAUSES THE PROGRAM TO DELAY UNTIL THE CLOCK OVERFLOWS. /SPECIFYING TOO HIGH A CLOCK RATE MAY CAUSE THE PROGRAM /TO 'HANG' WITH NO TIME FOR PROCESSING. TO GET OUT OF /THIS CONDITION, HIT 'STOP', 'I/O PRESET' IN '8' MODE, /AND RESTART AT LOCATION 100. /PRELIMINARY TESTING INDICATES THAT IT IS MORE OR LESS /POSSIBLE TO MAINTAIN A 30 MILLISECOND SAMPLE LOOP IF /THE NUMBER OF OPERATIONS WITHIN THE LOOP IS LIMITED TO /ONLY 1 OR 2 COMMANDS. THIS DOES NOT INCLUDE I/O TIME. /THE 'HESITATE' COMMAND MUST BE USED TO INITIALIZE THE /CLOCK BEFORE THE 'FTRG' FUNCTION WILL RESPOND TO ANY /INPUT. AN INNOCUOUS CALL (WHICH LEAVES THE CLOCK OFF) /IS: 'H -8,1'. /THE 'O S' COMMAND WILL SWITCH OUTPUT TO THE SCOPE ('O S' /IS ASSUMED WHEN FOCAL IS LOADED) WHILE THE COMMAND 'O E' /WILL RETURN TO THE TERMINAL. THE 'VIEW' COMMAND MAY BE /USED TO CONTROL THE DISPLAY: 'V +1' TURNS IT ON WHILE /'V 0' (OR JUST 'V') TURNS IT OFF. THE DISPLAY IS ACTIVE /WHILE WAITING FOR KEYBOARD INPUT AND ALSO DURING A 'HESI- /TATE' OR 'LOGICAL BRANCH' COMMAND. IT IS ALSO REFRESHED /WHENEVER A RUNNING PROGRAM COMES TO THE END OF A LINE. /THIS LATTER FEATURE CREATES A 'LIVE' DISPLAY, BUT IT DOES /SLOW THINGS DOWN QUITE A BIT. YOU MAY PREFER TO DISABLE /THE DISPLAY AND USE AN 'ASK :-1' COMMAND TO PAUSE FOR IN- /TERMEDIATE RESULTS. OR YOU CAN PUT IN A 'HESITATE' TO /'FLASH' THE ANSWERS SO THE PROGRAM CAN RUN UNATTENDED. /UP TO 85 CHARACTERS CAN BE DISPLAYED ON A SINGLE LINE, /WITH AUTOMATIC 'WRAP-AROUND' IF NECESSARY. THE DISPLAY /'SCROLLS' (LINES AT THE TOP OF THE SCREEN ARE REMOVED) /IF MORE CHARACTERS OR MORE LINES THAN CAN BE ACCOMODATED /ARE OUTPUT. A 'FORMFEED' (CTRL/L) IS USED TO ERASE THE /SCREEN. THIS MAY DONE AT ANY TIME WHILE ENTERING TEXT /OR NUMERICAL VALUES WITHOUT AFFECTING THE RESULT. THE /SCREEN IS NOT CLEARED BY 'CTRL/L' DURING A 'MODIFY' OR /'MOVE' COMMAND, HOWEVER. THE '#' OPERATOR IN 'ASK' AND /'TYPE' COMMANDS IS THE EASIEST WAY TO CLEAR THE SCREEN /IN A PROGRAM, BUT ONE COULD ALSO USE 'FOUT(140)' TO DO /THE SAME THING. TYPING 'RUBOUT' OR 'DELETE' WHILE EDIT- /ING WILL REMOVE THE PREVIOUS CHARACTER FROM THE SCREEN! /THIS MAY ALSO BE DONE BY EXECUTING A 'FOUT(92)'. /THE 'VIEW X,Y' COMMAND FOR DISPLAYING DATA IS ALSO IN- /CLUDED. THIS COMMAND WILL CREATE AN ENTRY IN THE VIEW /BUFFER WHICH WILL BE INTENSIFIED DURING EACH REFRESH /CYCLE. 'VIEW -1' WILL CLEAR ALL POINTS FROM THE BUFFER /WHILE 'VIEW 0' (OR JUST 'V') WILL DISABLE THE REFRESH. /'VIEW 1' OR ANY INPUT FROM THE KEYBOARD MAY BE USED TO /TURN IT ON AGAIN. SEPARATE CHANNELS ARE USED FOR THE /PLOT (CHANNEL 1) AND THE TEXT (CHANNEL 2). /THE DISPLAY ROUTINES OCCUPY 4000-4177 IN FIELD 1. THIS /ALLOWS THEM TO USE 2 CONVENIENT BETA REGISTERS LOCATED /ON THIS PAGE. THE DISPLAY CODES AND THE DISPLAY BUFFER /ARE STORED IN THE UPPER FIELD FROM 6200 TO 7777, REDUC- /ING THE MAXIMUM PROGRAM SIZE BY 3 BLOCKS. THE 'VIEW' /BUFFER USES HALF OF THE SYMBOL TABLE: 33776-37775. /ACKNOWLEDGMENTS: THE DISPLAY ALGORITHM WAS ADAPTED FROM /ONE WRITTEN BY DOUGLAS E. WREGE OF THE GEORGIA INSTITUTE /OF TECHNOLOGY FOR USE WITH THE OS/8 EDITOR. THE COMPACT /CHARACTER DISPLAY WAS INVENTED BY TIM CLARK, OF FRELAN /ASSOCIATES (MENLO PARK, CA.), AND THE CHARACTER PATTERNS /(AND SOME OF THE DISPLAY LOGIC) COME FROM THE -SCROLL- /EDITOR WRITTEN BY CLYDE G. ROBY JR. (WEST VIRGINIA UNIV. /MEDICAL CENTER). PAUL C. DIEGENBACH AT THE UNIVERSITY /OF AMSTERDAM CONTRIBUTED THE ORIGINAL FORMS OF SEVERAL /OF THE FUNCTIONS. /DEFINITIONS FOR VERSION 4E (OCTOBER 1978) P134=0 P337=2 XRT=14 BUFEND=27 TXTEND=30 TABEND=33 EXP=44 HORD=45 DAY=55 OUTDEV=57 P7=73 P77=77 C100=100 P17=101 M14=107 BETA=163 CRT=223 INLIST=226 ECHOFF=253 GOTO=610 COMGO=722 EVAL=1610 FNTABL=2157 FNTABF=2357 RUB1=2466 KEYCK=3000 XI33=3007 XINT=3127 ACCEPT=5521 FINALZ=5525 ECODEV=6323 FMQ=6563 ACTION=6571 OSCOPE=6722 PUSHA=4520 POPA=4521 PUSHJ=4522 POPJ=5523 SORTJ=4526 TSTCMA=4543 NEGATE=4557 FIXIT=4560 ERROR2=4576 FLOAT=4552 FLOATR=5553 FL0ATR=5554 RETURN=5555 CONTINUE=5434 FENT=4407 FIXMRI FGET=0000 FEXT=0000 P=10 T=20 B=30 FIELD 0 *CRT OSCOPE /IMPLEMENT 'O S' *OSCOPE-1 SCOPE *5400 IOF 6141 /L MODE 1020 /LDA I 20 4 /ESF - ISSUE I/O PRESET 2 /PDP MODE *FINALZ+2 NOP /CAN'T RUN UNDER ANYTHING FIELD 1 *BUFEND -6177 /LAST TEXT LOCATION *TXTEND -6221 /INPUT LIMIT *OUTDEV SCOPE /START UP THE DISPLAY! *113 E27, 27 /CLOCK REGISTERS HCNT, 0 LCNT, 0 OFLO, 0 FLAGS, 0 *164 DSW, XI33+1 /DISPLAY SWITCH *INLIST+1 ECHOFF /SO WE CAN ERASE THE SCREEN *1241 CMA /LET '#' CLEAR THE SCREEN *COMGO-1 REFRSH /ADD REFRESH AT END OF LINE *COMGO+"H-"@ TATE *COMGO+"K-"@ KONTRL *COMGO+"V-"@ VIEW *FNTABF+15 FLS *FNTABF+31 FADC FTRG FBUF FTIM FXL FSS *FNTABF+43 FDA *FNTABL+16 "R-200^4+"S-200 /RS *FNTABL+35 "X-200^4+"L-200 /XL "S-200^4+"S-200 /SS *KEYCK KDISPL /PATCH THE INPUT LOOP *ECODEV SCOPE /MAKE THIS THE DEFAULT *ACTION+3 ACCEPT-1 /ACTIVATE FF DURING ASK *7577 BDISPL /DISPLAY ON A BRANCH *4000 /THE DISPLAY PROCESSOR YVAL, 0 /THE VERTICAL COORDINATE XVAL, 0 /THE HORIZONTAL COORDINATE SCOPE, 0 /FILL THE OUTPUT BUFFER DCA YVAL /SAVE THE CHARACTER CODE TAD YVAL SORTJ /CHECK FOR LF,FF,CR,BA,BELL,RUB M1, P134-1 SCOPGO-P134 SBA, TAD YVAL /NOTHING SPECIAL AND P77 /ONLY USE 6 BITS CLL RAL /MULTIPLY BY TWO TAD TBS /ADD START OF THE TABLE SCR, DCA YVAL /SAVE PATTERN POINTER TAD CHRCNT /OK NOW, BUILD POINTER TAD BUF /TO THE NEXT LOCATION DCA XRT /-> AUTO INDEX REG. TAD YVAL /GET THE PATTERN ADDRESS CDF T /DISPLAY BUFFER LOCATION DCA I XRT /SAVE IT STL RTL /ADD ONE TO THE COUNT SRO, TAD CHRCNT /RUBOUT = ERASE ONE CHARACTER SZA /WATCH OUT FOR MISTAKES HERE TAD M1 SFF, DCA CHRCNT /FF = ERASE THE ENTIRE SCREEN TAD CHRCNT /DO A LITTLE CHECKING TAD (SBUFR-7600 /YE OLDE BUFFER SIZE! SMA CLA JMS SCROLL /TIME TO REMOVE A LINE BEL, CDF P /BELL: DON'T DISPLAY 'G' SLF, JMP I SCOPE /IGNORE LF'S COMPLETELY BUF= BEL CHRCNT, 0 SCOPGO, SRO BEL SBA SFF SLF SCR SBA /RELEVANT LINC-MODE INSTRUCTIONS LDAI=1020 DSCI=1760 DSC=1740 STC=4000 ADD=2000 LDF=0640 BDISPL, TAD (GOTO-XI33 /DO A DISPLAY CYCLE ON A BRANCH KDISPL, TAD DSW /WHILE WAITING FOR KEYBOARD INPUT PUSHA /SAVE THE RETURN ADDRESS REFRSH, TAD I DSW /CHECK THE 'DISPLAY SWITCH' SPA SNA CLA POPJ /NOTHING DOING TAD CHRCNT CMA DCA SCROLL /SAVE NUMBER OF CHARACTERS TAD BUF DCA XRT /INITIALIZE THE INDEX REGISTER CDF T TAD P337 /START DISPLAY AT THE TOP NULINE, DCA YVAL /INITIALIZE FOR A NEW LINE TAD (7002 /=2 + UNSEEN SIGN BITS DCA XVAL /AND ALSO SETS CHANNEL 2 RFEND, ISZ SCROLL /DONE? JMP RFLUP /NOT YET SM20, SNL SMA SZA CLA /THINK IT WILL SKIP? JMS SCROLL /SCREEN FULL, REMOVE A LINE JMP I (PTPLOT /REFRESH THE VIEW BUFFER RFLUP, TAD I XRT /GET THE NEXT CHARACTER SNA /CR? JMP RFEOL /YES DCA SCOPE /PUT ADDRESS IN LINC REG. 2 TAD YVAL CIF P /INHIBIT INTERRUPTS BRIEFLY LINC LDF 13 /POINT TO THE PATTERN TABLE DSC 2 /DISPLAY COLUMNS 1 & 3 LDAI;-4 /-3 IN ONE'S COMPLEMENT ADD 1 /BACKUP THE X-COORDINATE STC 1 /AND SAVE IT AGAIN ESF /SET SMALL LETTERS YVAL&1777 ADD /RELOAD THE Y-COORDINATE DSCI 2 /DISPLAY COLUMNS 2 & 4 PDP /BACK TO THE REAL WORLD CLA /GET RID OF THE Y VALUE ISZ XVAL /SPACE AND CHECK FOR OVERFLOW JMP RFEND /CONTINUE WITH THE NEXT ONE RFEOL, TAD P337 /START A NEW LINE TAD YVAL SPA CLA /FILLED THE SCREEN? JMP SM20+1 /YES TAD SM20 TAD YVAL JMP NULINE /DO A LINEFEED SCROLL, 0 /REMOVE A LINE FROM THE TOP TAD BUF DCA XRT TAD CHRCNT /REDUCE THE CHAR COUNT SNA JMP I SCROLL /NO CR'S IN THE BUFFER! TAD M1 DCA CHRCNT TAD I XRT /LOOK FOR A CR SZA CLA JMP SCROLL+3 TAD BUF /SET THE SECOND POINTER DCA YVAL TAD CHRCNT /NEW VALUE CIA DCA XVAL /HANDY REGISTER TAD I XRT /SHUFFLE THINGS DOWN ISZ YVAL TBS, DCA I YVAL ISZ XVAL /COUNT JMP .-4 JMP I SCROLL / 'FTRG' TESTS FOR THE OCCURANCE OF ANY SCHMITT TRIGGER / THE ARGUMENT (2,8,32) SERVES AS A MASK; '0'=ALL FLAGS / THE VALUE RETURNED IS THE WEIGHTED SUM OF THE EVENTS. FTRG, FIXIT /GET THE MASK SNA CMA CLL RAR /'0' = ALL AND FLAGS /COMPARE FLOAT /SAVE TAD HORD /RECALL CMA AND FLAGS /REMOVE THE BITS WE TESTED DCA FLAGS RETURN FLS, CIF P /READ THE LEFT SWITCHES LINC LSW PDP FL0ATR /AS AN UNSIGNED NUMBER PAGE /THE 'VIEW X,Y' POINT-PLOT COMMAND FOR THE PDP12: /'VIEW X,Y' WILL BRIGHTEN THE POINT (X,Y) DURING EACH RE- /FRESH CYCLE. 0<X<1023 AND -512<Y<511. 'VIEW' WITH ONLY /A SINGLE ARGUMENT IS USED TO TURN THE DISPLAY ON AND OFF /OR TO CLEAR THE POINT-DISPLAY BUFFER USING 'V -1'. *3400 /START A NEW PAGE DISB, 4000-1 /THE STARTING LOCATION PNTR, 4000-1 /THE CURRENT LOCATION VIEW, PUSHJ /GET THE FIRST PARAMETER EVAL TSTCMA /IS THERE ANOTHER ONE? JMP ONLY1 /NO JMS STORE /PUT 'X' IN THE BUFFER PUSHJ EVAL JMS STORE /PUT 'Y' IN THE BUFFER CONTINUE STORE, 0 /LOOKS SIMPLE ENOUGH STL IAC RAL /= -(BEND-1) TAD PNTR /WATCH OUT FOR OVERFLOW SZL CLA ERROR2 /TOO MANY! ISZ PNTR FIXIT CDF B /B=T FOR 12K, B=V FOR 16K DCA I PNTR CDF P TAD DISB DCA TABEND /REDUCE THE NO. OF VARIABLES JMP I STORE ONLY1, FIXIT /SPECIAL CASE AND P17 /BE CAREFUL ISZ HORD /TEST FOR -ANYTHING DCA I DSW /SET THE DISPLAY SWITCH SNA CLA /TEST FOR -1 CONTINUE /SOMETHING ELSE CMA CLL RTL /-3 (16K LIMIT) DCA TABEND /RESET SYMBOL LIMIT TAD DISB DCA PNTR /CLEAR THE SCREEN BUT DON'T CONTINUE /MESS UP THE DISPLAY SWITCH ///// BEND= -1 /PROVIDE THE PROGRAM WITH ACCESS TO THE VIEW BUFFER FBUF, FIXIT /ACCESS TO THE VIEW BUFFER TAD DISB PUSHA /SAVE THE INDEX VALUE TSTCMA /READ OR WRITE? JMP RBUF /READ PUSHJ /WRITE EVAL TAD PNTR /SAVE THE 'VIEW' POINTER DCA XRT POPA DCA PNTR JMS STORE TAD XRT DCA PNTR RETURN RBUF, POPA /READ FROM THE BUFFER DCA XRT CDF B TAD I XRT /NO LIMIT CHECKING FLOATR /EXTEND THE REFRESH CYCLE TO INCLUDE THE VIEW BUFFER PTPLOT, TAD DISB /SETUP THE ADDRESS REGISTER DCA XRT CDF B PTLOOP, TAD XRT /CURRENT STL CMA TAD PNTR /THE END SZL CLA POPJ /END REFRESH TAD I XRT /GET X CLL RAR /ASSUME 10 BITS, BUT ONLY USE 9 CDI P /INHIBIT LINC-MODE INTERRUPTS DCA I BETA /THIS POINTS TO BETA 14 CDF B TAD I XRT /GET THE Y VALUE IN THE AC CLL RAR /SO WE CAN DISPLAY A/D READINGS LINC DIS 14 /PLOT IT ON CHANNEL 1 PDP CLA JMP PTLOOP /THE 'FSS', 'FXL' AND 'FADC' FUNCTIONS *3514 /SET THE ERROR CODES N6, -6 P446, SNS+6 P414, SXL+14 FSS, FIXIT /CLEARS THE LINK TAD N6 /TEST ARGUMENT SZL ERROR2 /NEGATIVE OR .GT. 5 TAD P446 JMP TST-3 FXL, FIXIT /TEST EXTERNAL LEVELS TAD M14 SZL ERROR2 /ARGUMENT NOT IN RANGE 0<N<12 TAD P414 DCA TST CIF P /PREVENT INTERRUPTS LINC TST, 0 /THIS IS A LINC-MODE SKIP COM /SET -1 IF OPEN PDP STL RAL /0 BECOMES +1, -1 IS UNCHANGED! FLOATR /RETURNS: +1 IF SET, -1 IF NOT FADC, FIXIT /GET THE CHANNEL NUMBER CIF P AND P17 TAD C100 /COMPUTE THE INSTRUCTION DCA .+2 LINC SAM /'SAM' = '100' PDP FLOATR ///// /THE RELAYS ARE TREATED AS A 6-BIT NUMBER SO THEY CAN BE /SET OR CLEARED SIMULTANEOUSLY. THE TABLE BELOW EXPLAINS: / RELAY DECIMAL / 0 32 / 1 16 / 2 8 / 3 4 / 4 2 / 5 1 /THUS DECIMAL 25 WILL CLOSE RELAYS 1,2 & 5, OPEN THE OTHERS KONTRL, PUSHJ /'K 1' CLOSES RELAY 5, ETC. EVAL FIXIT CIF P /INHIBIT INTERRUPTS LINC ATR PDP CONTINUE /COULD CHECK FOR MORE ARGUMENTS ///// *FMQ FMQ, FIXIT /LOAD THE MQ WITH A LINC SHIFT CIF P LINC ROR 14 /WITH EAE THIS IS UNNECESSARY- PDP RETURN /JUST USE THE STANDARD VERSION ///// *RUB1+5 FDA, FIXIT /MOVE THIS OUT OF THE WAY CIF 20 JMP DAY ///// /LINC-MODE INSTRUCTIONS: LSW=0517 SNS=0440 SXL=0400 ROR=0300 DIS=0140 SAM=0100 COM=0017 ATR=0014 ESF=0004 PDP=0002 /CLOCK ROUTINE FOR THE KW12A - THE 'HESITATE' COMMAND /START WITH 'H -5,Q' WHERE Q IS THE TIME IN UNITS OF 0.01 /SECONDS. THUS Q=100 IS A 1 SECOND COUNTING PERIOD. TO /CHOOSE OTHER UNITS, CHANGE THE FIRST PARAMETER (WHICH MUST /BE NEGATIVE) TO SELECT A DIFFERENT TIME BASE. THUS -4 = /0.001 SECONDS (MILLISECONDS) AND -6 = RATE DETERMINED BY /INPUT #1. (SEE THE LABORATORY COMPUTER HANDBOOK.) /IT IS NOT NECESSARY TO SET THE UNITS UNLESS YOU WISH TO /CHANGE IT FROM 0.001 SECONDS, BUT IF YOU DO YOU MUST GIVE /A NEW DELAY COUNT TOO. (DELAY MUST BE LESS THAN 4096.) /'H' THEN WAITS UNTIL THE END OF THE NEXT COUNTING CYCLE. /TO RING THE BELL OF THE TTY EVERY 4 SECONDS: / 1.1 H 4000;C OR: H -5,400 / 1.2 H FOUT(135);L B 1.2;R /FOR ANOTHER APPROACH SEE DECUSCOPE 14 #2 P.27 (1975) *4460 /AFTER 'FCOM' WATE, PUSHJ /REFRESH WHILE WE'RE WAITING REFRSH TAD OFLO /CHECK FOR OVERFLOW SNA CLA JMP WATE DCA OFLO /CLEAR FOR THE NEXT TIME HESI, TSTCMA /ANY MORE ARGUMENTS? CONTINUE /NO TATE, PUSHJ /'HESITATE' ENTRY POINT EVAL NEGATE /AND CHECK FOR ZERO SZL /ZERO ARGUMENT? JMP WATE+2 /YES, WAIT FOR TIMEOUT FIXIT /CONVERT TO INTEGER FORMAT ISZ HORD /RATE OR DELAY? JMP RATE /SET THE NEW RATE CLAB /LOAD THE CLOCK BUFFER CLA CLLR /SET MODE 0, STOP THE CLOCK TAD TIME CLLR STA /ENABLE ALL INPUTS, INTERRUPTS CLEN JMP WATE+3 RATE, AND P7 /BE PRUDENT RTR /SHIFT RATE BITS INTO PLACE RTR TAD C100 /MODE 1 DCA TIME JMP HESI /MORE? TIME, 4100 /MILLISECONDS /THE 'FTIM' FUNCTION COUNTS CLOCK OVERFLOWS FTIM, TAD HORD /READ OR SET THE ELAPSED TIME SZA JMP CLEAR FENT / ARG < 0 -> CLEAR FGET E27 / ARG = 0 -> READ FEXT / ARG > 0 -> PRESET CLEAR, SPA CLA /CLEAR OR PRESET? DCA EXP /CLEAR FIXIT DCA LCNT TAD HORD DCA HCNT RETURN /ALWAYS RETURNS THE COUNTER! /THIS IS THE CLOCK INTERRUPT HANDLER: CINT, CLSK /ANY ACTIVITY? JMP I LINT /NO CMA CLL RAR /=3777 AND FLAGS /REMOVE THE CLOCK FLAG CLSA /MERGE THE EVENT FLAGS DCA FLAGS /SAVE EVERYTHING TAD FLAGS SMA CLA /CLOCK OVERFLOW? JMP I LINT /NO ISZ LCNT /ADD ONE SKP ISZ HCNT /ADD 4096 ISZ OFLO /TELL 'HESITATE' ABOUT IT TAD HCNT SPA CLA /KEEP IT DOWN TO 23 BITS DCA HCNT JMP I LINT /LEAVE ROOM FOR THE INTERNAL LPT: HANDLER... *4565 LINT, XINT+2 *XINT JMP I .+1 /REPLACE TWO 'NOP'S CINT / '8-MODE' IOT CODES: CLSK=6131 CLLR=6132 CLAB=6133 CLEN=6134 CLSA=6135 LINC=6141 CDI=6203 /PATTERN TABLE FOR THE DSC INSTRUCTION FIELD 2 SBUFR= CIF P /'SBUFR-1' = 'CDF P' *7600 /AFTER THE SCOPE BUFFER STABL, 5536;3541 4477;7744 5177;2651 4136;2241 4177;3641 4577;4145 4477;4044 4536;2641 1077;7710 4141;0077 7642;4041 2477;4310 0177;0301 3077;7730 0677;7730 4177;7741 4477;3044 4336;3745 4677;3144 5121;4651 7740;4040 0177;7701 0276;7401 0177;7706 1463;6314 0770;7007 5143;6145 0077;0041 0640;0130 4100;7700 3700;1010 1010;1034 0000;0000 0000;0075 7070;0000 7714;1477 7121;4657 3361;4366 2626;0551 7000;0000 4100;0036 3600;0041 2424;0010 3704;0404 0600;0005 0404;0404 0300;0003 3001;4006 5136;3645 7701;0121 5123;2145 5122;2641 7714;0424 5172;0651 2506;4215 5043;6044 5126;2651 5122;3651 6600;0066 6600;0065 4210;0024 1212;1212 2400;1042 5520;2040 $$$$;$$$$ /END OF THE PATTERN TABLE |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 | /INCREMENTAL PLOT ROUTINES FOR UWF-V4E -JVZ- / 16MPLT.PA / THIS REVISION CONTAINS THE LOWER CASE SYMBOLS AND THE /'BACKSPACE' COMMAND SUGGESTED BY STEVE L. GILLETTE. I / HAVE ALSO IMPLEMENTED 'HALFSIZE' CHARACTERS. / RUNS .01 INCH PLOTTER AS IS / DEFINE 'FIVMIL' TO ASSEMBLE FOR THE '5 MIL' PLOTTER. / DEFINE 'METRIC' TO ASSEMBLE FOR A 'METRIC' PLOTTER. / BSLASH.PA OVRLAYS THIS PGM TO PLOT LOWERCASE CHARS / FROM AN UPPER CASE KEYBOARD / /MULTIPLY ROUTINE FOR EAE HARDWARE (SEE PAGE 12) / /MULT, 0 / AND N7 /MASK LOW ORDER DIGIT / MQL MUY /MULTIPLY BY SIZE /S1ZE, 0 / SWP /PUT RESULT IN AC / CLL RAR / JMP I MULT / ZBLOCK 4 /FOR STANDARD ROUTINE /SYSTEM SYMBOLS: CDI=6203 PLSF=6501 PLCF=6502 PLPU=6504 PLPR=6511 PLDU=6512 PLDD=6514 PLPL=6521 PLUD=6522 PLPD=6524 FIXMRI FMUL=4000 FIXTAB /FOCAL SYMBOLS: AXIN=16 C=00 COMGO=722 EVAL=1610 EXIT=31 EXP=44 FENT=4407 FGETIPT1=0400 FMULIPT1=4400 FPUTIPT1=6400 FEXT=0000 FIXIT=4560 FLOAT=4552 GS1=1434 K77=7 M4=105 OBLK=5700 P=10 PT1=62 P177=75 PUSHJ=4522 SBLK=236 SINBLK=111 THISOP=63 TSTCMA=4543 UINT=3112 /THIS TRAPS THE 'OPEN OUTPUT PLOT:' COMMAND: FIELD 0 *SINBLK+2 4201 /MOVE THE 'SIN' HANDLER *SBLK-1 2200 /AND THE BUFFER, TOO *3177 /RESET THE STACK LIMIT 2600 *OBLK-1 5200 /MOVE THE OUTPUT BUFFER *CDF LABEL /ADD THE ENTRY POINT DEVICE PLTR /AND THE NAME FIELD 1 *COMGO+"P-"@ PLOTXY /ADD THE 'PLOT' ENTRY POINT *UINT CIF C /ADD PLOTTER TO THE SKIP CHAIN JMP I .+1 PINT PAGE 15 LABEL, 0 /OUTPUT TO THE PLOTTER AND P177 /IGNORE PARITY SNA JMP I LABEL /AND NULL CHARS CDI C TAD (-15 SNA JMP I (PCR /RETURN THE PEN TAD (3 SZA JMP I (PLC /CHECK FOR OTHERS JMP I (PLF /DROP DOWN A LINE /PARAMETER PASSING & ROTATION CHECKS FOR THE 'PLOT' COMMAND PLOTXY, TAD LABEL /ARE WE WHERE WE THINK WE ARE? SNA CLA JMP .+3 /NO NEED TO RETURN THE PEN CDI C JMS I (LTAD /RETURN TO THE LAST PLOT POSITION TAD M4 /INITIALIZE ARGUMENT LOOP DCA LABEL /CLEAR THE FLAG TAD (X-1 DCA AXIN IAC FLOAT /SET UP 1.00 TAD (4406 /'$F' JMS LOOKUP TAD PT1 DCA LOOKUP /SAVE POINTER JMP .+4 PLOOP, CDF P TSTCMA /STILL ANOTHER ARGUMENT? JMP NOSCAL+1 /NO PUSHJ /EVALUATE IT EVAL STL RTL TAD LABEL SMA CLA /X OR Y? JMP NOSCAL /DON'T SCALE L OR M TAD LOOKUP DCA PT1 /RESET VARIABLE POINTER FENT FMULIPT1 /TIMES USER FACTOR FMUL SCALE /SCALE UP TO INCHES FEXT NOSCAL, FIXIT /CONVERT TO AN INTEGER CDF C DCA I AXIN /STORE IT AWAY ISZ LABEL /GOT ALL FOUR? JMP PLOOP /NO, GO BACK FOR MORE TAD (SYMTAB-1 /INITIALIZE INDEX REGISTER AGAIN DCA AXIN STL RTL /$R=2 JMS GETR /BRING IN THE ROTATION PARAMETERS DCA I LOOKUP STL RTL /$S=2 JMS GETR RAL DCA I LOOKUP STL RTL /$D=2 JMS GETR TAD M2 /NEED TO OFFSET THE DIRECTION BY 2 DCA I LOOKUP /SINCE THE LETTERS ARE CODED FOR D=2 CIF C JMP I (XPLT GETR, 0 /BRING IN THE ROTATION PARAMETERS CDF P FLOAT /SET UP THE DEFAULT VALUE TAD I AXIN /WHICH VARIABLE? JMS LOOKUP TAD I AXIN /WHICH LOCATION? DCA LOOKUP FENT FGETIPT1 /CROSS-FIELD VARIABLE FETCH FEXT ISZ EXP /X2 FIXIT RAR //2 CDF C /PREPARE TO STORE INTEGER VALUE JMP I GETR LOOKUP, 0 /FIND A VARIABLE IN THE TABLE DCA THISOP /SAVE THE NAME PUSHJ /THE SUBSCRIPT WILL BE ZERO GS1 SZL /ALREADY THERE? JMP I LOOKUP /YES FENT /NO M2, -2 /= NORMALIZE FLAC & FPUTIPT1 /SAVE DEFAULT VALUE FEXT JMP I LOOKUP SYMTAB, 4422 /$R PDIR 4423 /$S S1ZE 4404 /$D LDIR SCALE, IFDEF METRIC <6;2400;0;0> / 40.0 CONVERTS TO CM IFNDEF METRIC <7;3100;0;0> /100.0 CONVERTS TO IN PAGE /PDP 8 PLOTTING ROUTINE USING THE OLD STYLE INTERRUPT (JVZ) /CALLING SEQUENCE: / PLOT = JMS I (PL0T) / X X COORDINATE / Y Y COORDINATE /THIS VERSION SKIPS THE NEXT TWO WORDS /C(AC) DETERMINES POSITION OF THE PEN: / C(AC)= -1 PEN UP; POSITION AT END OF MOTION SET TO 0,0 / C(AC)= 0 PEN UP (ZERO MEANS "NO LINE") / C(AC)= 1 PEN DOWN / C(AC)= 2... RESERVED FOR DOTTED AND DASHED LINES, ETC. /COORDINATES ARE EXPRESSED IN TERMS OF PLOTTER UNITS: 0.01" /THUS MAXIMUM MOTION IS +20.47" AND -20.47" FROM THE ORIGIN /IN FACT THE MAXIMUM DIFFERENCE BETWEEN TWO POINTS IS ALSO /RESTRICTED TO +20.47" OR -20.47" SO THAT IN SOME CASES TWO /CALLS MAY BE REQUIRED TO REACH A POINT. /THIS VERSION PERMITS ROTATING THE AXES IN 45 DEGREE INCRE- /MENTS. THIS FEATURE IS USEFUL FOR PLACING THE X AXIS ALONG /THE CARRIAGE (ROTATION BY 2) AND IS ALSO USED BY THE LABEL /ROUTINE. PLOTTING DONE WITH A ROTATION OF AN ODD MULTIPLE /OF 45 DEGREES WILL BE "STRETCHED" UNIFORMLY BY THE SQRT(2) /DUE TO THE NATURE OF THE PLOTTER MOTIONS. FIELD 0 PAGE 5 PDIR, 0 /PLOT ROTATION LDIR, 0 /LABEL DIRECTION TDIR, 0 PL07, 7 /MASK PLOP, PLD0 PLD0, PLPL /PLOTTER OPERATION TABLE PLD1, JMS I PLD8 PLD2, PLDD PLD3, PLPR PLDD PLD4, PLPR PLD5, PLPR PLDU PLD6, PLDU PLD7, PLPL PLUD PLD8, PLD9 /FOR MARK'S CONVENIENCE PLPO, PEN /PEN CONTROL ROUTINE PWGT, WAIT /QUEUE CONTROL ROTATE, 0 /ROTATE IN 45 DEGREE STEPS TAD PDIR /ADD PLOT ROTATION (0-7) TAD TDIR /AND LABEL ROTATION (IF ANY) AND PL07 /MODULO EIGHT TAD PLOP /ADD CODE FOR PLD0 DCA PLD9 /SAVE TABLE ADDRESS TAD I PLD9 /GET INSTRUCTION JMP I ROTATE /AND RETURN PL0T, 0 JMS I PWGT /WAIT FOR PREVIOUS MOTION SPA /TEST FOR NEGATIVE LINE VALUE DCA DIAG /CLEAR AC AND SAVE -1 JMS I PLPO /CHECK & SET PEN POSITION JMS DXY /GET X, COMPARE WITH OLD VALUE LX, 0 /LAST X VALUE DCA DX /STORE ABSOLUTE X MOTION JMS DXY /GET Y, COMPARE WITH OLD VALUE LY, 0 /LAST Y VALUE STL CIA /NEGATE DY TAD DX /AC=DX-DY SZL CLA /LINK=0 IF DX>DY JMP DYGTDX DXGTDY, TAD DX /EXCHANGE DY AND DX DCA DXY TAD DY DCA DX TAD DXY DCA DY IAC /SET BIT 10 (SIGN OF X) DYGTDX, IAC /SET BIT 11 (SIGN OF Y) AND DIAG /CHECK FOR NEGATIVE VALUES SNL /SKIP IF DY>DX RAR /SIGN OF X -> BIT 11; LINK=0 CML RTL /BIT 11 + LINK = DIRECTION/4 JMS ROTATE /ADD ROTATION DCA AXIS /STORE IN AXIS INSTRUCTION TAD DIAG /CHECK ON SIGNS AGAIN RTR SZL /MODIFY SIGNS TO REFLECT CMA /PLOTTER DIRECTIONS RTL STL RAL /2*RESULT+1 = DIRECTION JMS ROTATE /ADD ROTATION DCA DIAG /STORE IN DIAGONAL INSTRUCTION STRCH, IAC /FIND OUT IF ROTATION AND PLD9 /IS EVEN OR ODD SNA CLA /TABLE AT ODD ADDRESS JMP SETUP /EVEN: CONTINUE TAD DX /ODD: ADJUST RATIO TAD DY DCA DY TAD DX /DOUBLE DIAGONAL STEPS SETUP, TAD DX /DX IS MINOR MOTION CIA /NEGATE FOR EASY SUBTRACTION DCA DX TAD DY /DY IS MAJOR MOTION IFDEF FIVMIL <CMA STL RAL> IFNDEF FIVMIL <CMA> /TIMES TWO FOR 5 MIL MODEL DCA DXY /SAVE THE STEP COUNTER TAD DY CLL RAR /OFFSET QUOTIENT BY HALF DCA ROTATE ION /INTERRUPTS ARE OK NOW ISZ PL0T ISZ PL0T JMP I PL0T /SKIP TWO WORDS AND RETURN PLD9, 0 /PLACED HERE TO RESERVE SPACE PLPL /FOR THE XY8E VERSION PLDD JMP I PLD9 LOOP, TAD ROTATE /GET THE RUNNING SUM TAD DX /SUBTRACT DIAGONAL INCREMENT SMA /TEST IF DIAG MOTION REQUIRED JMP AXIS /NO TAD DY /YES: RESTORE AXIS INCREMENT DIAG, 0 /COMBINED MOTION (X + Y) SKP AXIS, 0 /SINGLE MOTION (X OR Y) DCA ROTATE /SAVE THE RUNNING SUM PINT, PLSF /IS IT THE PLOTTER? JMP PXIT /NO PLCF TAD DXY /CHECK COUNTER SNA CLA JMP PXIT /FALSE ALARM ISZ DXY /COUNT THE STEPS JMP LOOP PXIT, CIF P /RETURN TO SKIP CHAIN JMP I .+1 UINT+3 DX, 0 /ABSOLUTE VALUE OF X MOTION DY, 0 /ABSOLUTE VALUE OF Y MOTION DXY, 0 TAD I DXY /GET LAST X OR LAST Y CIA /NEGATE TAD I PL0T /AC=NEW-OLD CLL /SET LINK FOR POSITIVE SIGN SPA /TEST FOR SIGN CML CIA /REMEMBER SIGN & NEGATE DCA DY /STORE ABSOLUTE Y MOTION TAD DIAG RAL /SAVE MINUS SIGN DCA DIAG SNL /CHECK FOR NEW ORIGIN TAD I PL0T /GET NEW VALUE DCA I DXY /REPLACE PREVIOUS ONE TAD DY /SET AC FOR NEXT OPERATION ISZ PL0T /SET NEXT ADDRESS ISZ DXY /SET RETURN ADDRESS JMP I DXY /RETURN /THIS ROUTINE DRAWS ANY ASCII SYMBOL ON THE PLOTTER. /IN ADDITION TO THE 96 ASCII SYMBOLS, THE CODES FOR /CR, LF AND BS ARE RECOGNIZED AND USED TO SIMULATE /THOSE FUNCTIONS. SYMBOLS ARE BASED ON A 6 X 7 GRID /OF WHICH ONLY 4 X 6 IS USED. SIZE 2 CHARACTERS ARE /THUS .08" X .12" WITH .04" BETWEEN THEM. LF MOVES /0.1" X SIZE BELOW THE PRESENT LINE, BUT ONLY WORKS /UNTIL THE NEXT 'PLOT' COMMAND MOVES THE PEN. F1NAL, TAD LDIR /GET LABEL DIRECTION DCA TDIR TAD LX /SAVE CURRENT POSITION / PAGE BOUNDARY DCA SX TAD SX /"S" MEANS STARTING DCA RX /"R" MEANS RUNNING TAD I YL DCA SY TAD SY DCA RY JMP EXIT /RETURN FROM 'PLOT' COMMAND R6, R6R YL, LY M0VE, 0 /ROUTINE TO CALL PLOT TAD RY /ADD STARTING VALUE TO AC DCA IY /TO GET NEXT Y POSITION TAD RX /GET START OF THIS LETTER TAD IX /ADD IN X INCREMENT DCA IX /TO GET NEXT X POSITION TAD I LN /GET THE LINE VALUE PLOT /CALL PLOT TO MOVE THE PEN IX, 0 /X COORDINATE IY, 0 /Y COORDINATE RX, 0 /THESE TWO ARE SKIPPED RY, 0 JMP I M0VE LTAD, 0 PLOT /RETURN TO THE BEGINNING SX, 0 SY, 0 N26, 212-240 /CHANGE THESE VALUES IF YOU TBAD, SPACE /EXPAND THE CHARACTER TABLE CDI P JMP I LTAD /AND RETURN TO FOCAL ZER0, TAD I LTAD /LOOK AT THIS WORD ISZ LTAD /POINT TO NEXT ONE CMA N7, AND K77 SNA CLA /DOES IT END IN 77 ? HALF, ISZ I LN /YES: FOUND IT ? JMP ZER0 /NO: KEEP GOING ONE, TAD I LTAD /GET FIRST MOVE JMS I R6 /'BSW' JMS TWO TAD I LTAD /GET SECOND MOVE JMS TWO ISZ LTAD /ADVANCE TO NEXT WORD JMP ONE /CONTINUE TWO, 0 AND K77 /GET RID OF THE OTHER PIECE DCA M0VE /AND SAVE MOVE STL RTL /=2 - TRICKY WAY TO GET -76 TAD THREE /THIS INSTRUCTION ADDS 7700 TAD M0VE /ADD -76 TO MOVE SMA SZA /TEST FOR 77 = END JMP SIX /MOVE TO POSITION (5,0) SNA /CHECK FOR PEN UP JMP FOUR /76 MEANS RAISE THE PEN IAC THREE, SMA CLA /TEST FOR 75 (INST=7700) JMP FIVE /75 MEANS REVERSE NEXT Y TAD M0VE /GET X MOTION RAR RTR JMS MULT /MULTIPLY BY SIZE DCA IX /"I" MEANS "INCREMENTAL" TAD M0VE /GET Y MOTION JMS MULT ISZ I NY /CHECK DESCENDER SWITCH SKP /NOTE: 'PLOT' RESETS IT CIA JMS M0VE /"IY" IS IN AC IAC FOUR, DCA I LN /SET THE PEN DOWN JMP I TWO /GET NEXT BYTE FIVE, CMA /SET THE DESCENDER SWITCH DCA I NY JMP I TWO SIX, STA CLL RAL /-2 EQUALS WIDTH OF LETTER JMS MULT /TIMES SIZE DCA IX /STORE MOTION AND SET IY=0 DCA I LN /MOVE WITH THE PEN UP JMS M0VE /"IY"=0 TAD IX DCA RX /UPDATE CURRENT X VALUE JMP SEVEN /END OF THIS LETTER PBS, STA CLL RAL /-2 IS THE SAME AS 6 JMS MULT /TIMES SIZE CIA /MOVE BACK A LETTER JMP SIX+2 /CLEAR IX,IY(=AC), AND LN PCR, TAD SX /GET STARTING VALUE DCA RX /AND RESET RX JMP SIX+2 PLF, DCA IX /SET IX TO ZERO CMA CLL RTL /-3=5 JMS MULT /5*SIZE RAL /TIMES 2 CIA /AND NEGATE JMS M0VE /TO (RX,-10*SIZE) TAD IY DCA RY /UPDATE RY PLC, SPA /ASCII-LF IN THE AC JMP PBS /ANYTHING < LF = BS CLL TAD N26 /TEST FOR CONTROL CODES CMA DCA I LN /SAVE THE LETTER COUNT TAD TBAD /LOAD STARTING ADDRESS DCA LTAD /INTO SEARCH ADDRESS SZL /CHECK FOR CONTROL CHARS JMP HALF /AND GO SEARCH SEVEN, CDI P /EXIT FROM 'LABEL' JMP I .+1 LABEL+3 MULT, 0 AND N7 /MASK LOW ORDER DIGIT CMA /EQUALS -(MOVE+1) DCA IY /STORE IN STEP COUNTER SKP /IN CASE MLPR=0 TAD S1ZE /ADD MCND UNTIL ISZ IY /MLPR RUNS OUT JMP .-2 CLL RAR JMP I MULT S1ZE, 0 /THIS IS 2X THE LETTER SIZE PLOT= JMS I . /THIS RESETS THE NY, PL0T /DESCENDER SWITCH TD, TDIR /FOR XPLT LN, M-1 /PEN POSITION /PDP 8 CALCOMP ROUTINE: MARK /THIS ROUTINE DRAWS A SPECIFIED MARK CENTERED AT THE /CURRENT PLOTTER POSITION. MARK 0 IS A NULL AND NO /ACTION OCCURS. SPECIFYING A NON-EXISTENT MARK WILL /CAUSE A SIMILAR EXIT. /MARKS ARE CODED AT THE END OF THE PROGRAM ACCORDING /TO THE FOLLOWING PLAN: RDRD,RDRD,... WHERE R = /REPETITION NUMBER (0-7) AND D = PLOTTER DIRECTION /(0-7). DIRECTIONS ARE COMPUTED RELATIVE TO ANY RO- /TATION SPECIFIED BY PLOT. THIS PERMITS MARKS WITHOUT /C/8 SYMMETRY TO FOLLOW ROTATIONS OF THE AXES. /RD = 00/01 SPECIFIES PEN UP/DOWN AND RD = 07 OR 0707 /SIGNIFIES THE END OF A MARK. THE CODE 0706 FOLLOWS /THE LAST MARK. THE TABLE MAY BE CHANGED AS DESIRED. XPLT, DCA I TD /ENTRY FROM PLOT CALL TAD I LN /CLEAR TDIR & GET L PLOT X, 0 /CALLING PARAMETERS Y, 0 /ARE STORED HERE IN 0 /SEQUENCE M, 0 MARK, TAD M /GET MARK NUMBER SPA SNA /TEST FOR MARK >0 JMP I D0NE /ZERO = NONE CIA /NEGATE DCA ZWEI /STORE IN MARK COUNTER TAD TABL /GET START OF MARK TABLE DCA MKAD JMP HALB D0NE, F1NAL MRK1, PLD9 /FOR DIRECTION 1 TABL, D0T /FIRST MARK M7, -7 NULL, IAC /TEST FOR END OF TABLE SNA CLA JMP I D0NE /NON-EXISTENT MARK TAD I MKAD /LOOK AT THIS WORD ISZ MKAD /AND POINT TO NEXT AND K77 /ONLY KEEP LOWER BYTE TAD M7 SNA /END OF THIS MARK ? HALB, ISZ ZWEI /HAVE WE FOUND IT ? JMP NULL /NO JMS WAIT /PROTECT PLOT ORIGIN EINS, TAD I MKAD /GET FIRST MOTION JMS R6R /'BSW' ON AN 8/E JMS ZWEI TAD I MKAD /GET SECOND MOTION JMS ZWEI ISZ MKAD /ADVANCE JMP EINS /CONTINUE MKAD= M ZWEI, 0 AND K77 /GET RID OF THE OTHER PIECE DCA X /TEMPORARY STORAGE TAD M7 TAD X /NOW LOOK AT CODE SNA /TEST FOR END OF MARK JMP I D0NE /RETURN WITH AC=0 SMA CLA /TEST FOR PEN MOTION JMP DREI /EXECUTE XY MOTION TAD X /GET PEN CODE JMS PEN /MOVE PEN IF NECESSARY JMP I ZWEI /DO NEXT OPERATION DREI, STL RTL /COMPENSATE FOR OFFSET TAD X /GET DIRECTION TAD I MDIR /ADD ROTATION JMS I PLTR /FORMULATE AND DCA VIER+3 /SAVE INSTRUCTION TAD I MRK1 /CHECK ROTATION AND X /FOR ODDNESS CMA RAR /SAVE -(BIT 11) CLA CMA AND X /GET REPETITION AND .+1 /STRIP BITS 6-8 SZL SNA /SAME AS SZL BUT CODE XX70 CLL RAR /SKIP = EFFECTIVE X2 IFDEF FIVMIL <RAR> /ANOTHER FACTOR OF 2 IFNDEF FIVMIL <RTR> /FOR THE 5 MIL MODEL CIA /NEGATE DCA X VIER, PLSF /WAIT FOR THE PLOTTER JMP .-1 PLCF 0 /PLOTTER INSTRUCTION CLA /FOR 'XY8E' ISZ X /TEST LOOP COUNT JMP VIER /KEEP GOING JMP I ZWEI /GET NEXT BYTE MDIR, LDIR /MARK ROTATION PLTR, ROTATE PEN, 0 /CHECK PEN POSITION CLL RTL /AC=0->PEN UP; AC=1->DOWN STL RTL /SHIFT BIT INTO PLACE TAD PNOP-1 /ADD CODE FOR PEN UP STL CIA /NEGATE TAD PNOP /OLD - NEW SZA /OLD = NEW ? CIA /NEW - OLD TAD PNOP /NEW DCA PNOP TAD I MOTN /IS THE FLAG ACTIVE? SNA CLA JMP PNOP /NO, MOVE THE PEN TO SET IT SNL /NEW PEN POSITION? JMP I PEN /NO PLSF /ALLOW PLOTTER TO FINISH JMP .-1 PLCF PNOP, PLPD /PUT PEN UP INITIALLY JMP I PEN WAIT, 0 /QUEUE CONTROL DCA PEN /SAVE THE AC ION TAD I MOTN /MOTION COUNTER SZA /ARE WE DONE? IAC SZA CLA /OR ALMOST DONE? JMP .-5 /NO IOF DCA I PSGN /CLEAR THE SIGN REGISTER TAD PEN /RESTORE THE AC JMP I WAIT MOTN, DXY /MOTION COUNTER PSGN, DIAG R6R, 0 /IMPLEMENT 'BSW' RTR RTR RTR JMP I R6R /NEXT COME THE MARKS: D0T, 0110 /MARK NUMBER 1 1315 1016 2216 1015 1310 0007 BAR, 0152 /MARK NUMBER 2 5656 5207 TICK, 0150 /MARK NUMBER 3 5054 5407 PMARK, 0142 /MARK NUMBER 4 4646 4244 4040 4407 XMARK, 0131 /MARK NUMBER 5 6531 3367 3307 CIRCLE, 0025 /MARK NUMBER 6 0117 2021 2223 2425 2617 0021 0707 SCIRCL, 0125 /MARK NUMBER 7 1720 2122 2324 2526 1730 1122 1324 1526 3022 2416 1007 TRIANG, 0021 /MARK NUMBER 8 0113 1413 1413 5656 1021 1011 1011 1011 1423 1400 2507 STRIAN, 0121 /MARK NUMBER 9 1314 1314 1356 5610 2110 1110 1110 1114 2334 1314 7621 1011 1011 1412 3413 4611 1011 2407 SQUARE, 0035 /MARK NUMBER 10 0160 6264 6600 3107 SSQUAR, 0137 /MARK NUMBER 11 6264 6650 5244 4630 3224 2610 1207 DIAMND, 0023 /MARK NUMBER 12 0125 4741 4325 0027 0707 SDIAMN, 0123 /MARK NUMBER 13 2547 4143 2516 1537 3133 1516 1527 2123 1615 1711 1407 ASTRSK, 0152 /MARK NUMBER 14 5656 5244 4040 4431 6531 3367 3307 STAR, 0024 /MARK NUMBER 15 0125 1615 1011 2011 2011 2011 1413 1413 2413 2413 1417 1627 1627 1627 6262 2516 2516 0020 0707 CROSS, 0032 /MARK NUMBER 16 1001 2721 6623 2527 6421 2325 6227 2123 6025 0014 3607 LAST, 0706 /END OF THE MARK TABLE PAGE /ROOM FOR ADDITIONS *PDIR-630 /FOLLOWING THE LPT CHECK SPACE, 7777 /'CONTROL' CODES COME BEFORE THIS EXCLPT, 2622 /CHARACTER TABLE FOR CALCOMP PLOTTER 7621 2077 QUOTE, 1614 7636 3477 NUMSGN, 1026 /CHARACTERS ARE CODED USING A 4X6 MATRIX 7614 /ASSUMING $D=2. EACH BYTE IS AN XY PAIR. 4476 /CODE '75' SIGNALS A MOVE BELOW THE LINE 4630 /CODE '76' IS USED TO RAISE THE PEN. 7612 /CODE '77' MARKS THE END-OF-CHARACTER. 4277 / DOLLAR, 0110 /EXAMPLE: THE LETTER 'A' 3041 / 4233 / 6 . ----- . 1304 / 0004 5 ./. . .\. 0516 / 1636 4 / . . . \ 3645 / 4443 3 !-------! 3626 / 0343 2 ! . . . ! 2077 / 4077 1 ! . . . ! PERCNT, 0046 / 0 ! . . . ! 7614 / 0 1 2 3 4 0516 / 2514 /THE PEN IS RAISED AT THE BEGINNING AND 7630 /LOWERED AFTER THE FIRST (OR NEXT) MOVE. 2132 4130 7777 AMPER, 4220 0001 2516 0540 7777 APOST, 2624 7777 LPAREN, 2012 1426 7777 RPAREN, 2032 3426 7777 ASTER, 0145 2320 2623 0541 7777 PLUS, 2125 2303 4377 COMMA, 7511 2021 1110 2077 MINUS, 0343 7777 PERI0D, 2021 1110 2077 SLASH, 0046 7777 NMBR0, 4230 1002 0416 3644 4277 NMBR1, 0040 2026 1577 NMBR2, 0516 3645 4401 0040 7777 NMBR3, 0110 3041 4233 1333 4445 3616 0577 NMBR4, 3036 0242 7777 NMBR5, 0110 3041 4233 0306 4677 NMBR6, 2602 0110 3041 4233 2377 NMBR7, 2046 0677 NMBR8, 1333 4241 3010 0102 1304 0516 3645 4433 7777 NMBR9, 2044 4536 1605 0413 3377 C0L0N, 1121 2212 1176 1424 2515 1477 SCOLON, 1021 2212 1121 7624 2515 1424 7777 LSTHAN, 3513 3177 EQUAL, 4404 7602 4277 GTTHAN, 1133 1577 QUESTN, 1426 3645 4433 3077 ATSIGN, 0526 3644 4230 1001 0314 2320 7777 LTRA, 0004 1636 4443 0343 4077 LTRB, 0333 4241 3000 0636 4544 3377 LTRC, 4536 1605 0110 3041 7777 LTRD, 3000 0636 4541 3077 LTRE, 4606 0333 0300 4077 LTRF, 4606 0333 0300 7777 LTRG, 4536 1605 0110 3041 4323 7777 LTRH, 0006 0343 4640 7777 LTRI, 0040 2026 0646 7777 LTRJ, 0201 1030 4146 7777 LTRK, 0600 0246 2440 7777 LTRL, 0600 4077 LTRM, 0006 2346 4077 LTRN, 0006 4046 7777 LTRO, 4130 1001 0516 3645 4177 LTRP, 0006 3645 4433 0377 LTRQ, 2240 1001 0516 3645 4130 7777 LTRR, 0006 3645 4433 0323 4077 LTRS, 0110 3041 4233 1304 0516 3645 7777 LTRT, 2026 0646 7777 LTRU, 0601 1030 4146 7777 LTRV, 0620 4677 LTRW, 0610 2330 4677 LTRX, 0046 2306 4077 LTRY, 2023 0623 4677 LTRZ, 0646 0040 7777 LBRAKT, 3616 1030 7777 BSLASH, 0640 7777 RBRAKT, 1636 3010 7777 UPAROW, 2026 0426 4477 UNDRLN, 7503 7543 7777 ACCENT, 1634 /BEGINNING OF LOWER CASE 7777 LTLA, 3120 1001 0314 2433 3430 4077 LTLB, 0600 0110 3041 4334 1403 7777 LTLC, 4334 1403 0110 3041 7777 LTLD, 3646 4041 3010 0103 1434 4377 LTLE, 1242 4334 1403 0110 4077 LTLF, 3526 1510 7603 2377 LTLG, 7502 7513 7533 7542 4334 1403 0110 3041 7777 LTLH, 0600 0314 3443 4077 LTLI, 2625 7614 2420 7777 LTLJ, 2625 7614 2475 2175 1275 0177 LTLK, 0600 0244 2340 7777 LTLL, 1626 2010 3077 LTLM, 0004 0314 2320 2334 4340 7777 LTLN, 0004 0314 3443 4077 LTLO, 0103 1434 4341 3010 0177 LTLP, 7503 0403 1434 4341 3010 0177 LTLQ, 7543 4443 3414 0301 1030 4177 LTLR, 0400 0224 3443 7777 LTLS, 0110 3041 0314 3443 7777 LTLT, 2524 1434 2420 3077 LTLU, 0401 1030 4144 4077 LTLV, 0420 4477 LTLW, 0410 2430 4477 LTLX, 0044 2204 4077 LTLY, 0401 1030 4144 7542 7533 7513 7502 7777 LTLZ, 0444 0040 7777 LBRACE, 3626 2413 2220 3077 VBAR, 2620 7777 RBRACE, 1626 2433 2220 1077 TILDE, 0516 3546 7777 PILLOW, 0112 1405 1434 4534 3212 3241 7777 $$$$ /END OF THE CHARACTER TABLE |
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 | / PDP12 OVERLAY FOR 32K U/W-FOCAL(V4E) -JVZ- / 32KXII.PA /REVISIONS: / I/O-PRESET ADDED AT 5400 / /THIS OVERLAY ADDS THE SCOPE HANDLER, THE 'OUTPUT SCOPE', /'VIEW', 'HESITATE', AND 'KONTROL' COMMANDS, AND 8 NEW /FUNCTIONS: 'FLS', 'FRS' 'FSS', 'FXL', 'FADC' AND 'FTIM' /'FBUF' AND 'FTRG' FOR 32K PDP12 USERS. /THE FUNCTIONS 'FLS', 'FRS', 'FSS' AND 'FXL' PROVIDE AC- /CESS TO THE LEFT AND RIGHT SWITCHES, THE SENSE SWITCHES, /AND THE 'EXTERNAL LEVELS'. 'FADC' HAS BEEN MODIFIED TO /READ ANY OF THE 16 ANALOG CHANNELS WHILE 'FTIM' CAN BE /USED TO KEEP TRACK OF THE CLOCK AND 'FBUF' PROVIDES AC- /CESS TO THE POINT-PLOT DISPLAY BUFFER. 'FTRG' MONITORS /THE OCCURANCE OF ANY SIGNALS DETECTED BY THE SCHMITTS. /'FLS' RETURNS AN UNSIGNED VALUE FROM THE LEFT SWITCHES /'FRS' (THE SAME AS 'FSR') RETURNS A SIGNED VALUE /'FSS(N)' RETURNS -1 IF SWITCH N IS OFF, +1 IF IT IS ON /'FXL(N)' RETURNS -1 IF THE LINE IS OPEN, +1 IF LOW /'FADC(N)' READS CHANNEL N (RANGE -512 TO +511) /'FTIM()' RETURNS THE NUMBER OF CLOCK OVERFLOWS /'FTIM(-1)' ZEROS THE COUNTER AND 'FTIM(N)' PRESETS IT /'FBUF(I)' RETURNS THE VALUE AT RELATIVE LOCATION 'I' /'FUBF(I,J)' STORES VALUE OF EXPRESSION J AT LOC. 'I' /'FTRG()' WILL RETURN THE WEIGHTED SUM OF ALL EVENTS. /'FTRG(2)' WILL ONLY CHECK (AND CLEAR) INPUT 3, ETC. /THE 'KONTROL' COMMAND LOADS THE RELAY REGISTER AND THE /'HESITATE' COMMAND RUNS THE CLOCK. THE LATTER IS SOME- /WHAT COMPLICATED: BOTH THE OSCILLATOR FREQUENCY AND THE /NUMBER OF CLOCK PULSES TO COUNT BEFORE GENERATING AN /OVERFLOW CAN BE SET. THE OSCILLATOR FREQUENCY IS PRO- /GRAMMED BY A -NEGATIVE- ARGUMENT WHILE THE NUMBER OF /PULSES IS SPECIFIED AS A -POSITIVE- NUMBER; BOTH MAY BE /INCLUDED IN A SINGLE 'HESITATE' COMMAND. IN ADDITION, /CALLING 'HESITATE' WITHOUT ANY ARGUMENT (OR WITH ZERO) /CAUSES THE PROGRAM TO DELAY UNTIL THE CLOCK OVERFLOWS. /SPECIFYING TOO HIGH A CLOCK RATE MAY CAUSE THE PROGRAM /TO 'HANG' WITH NO TIME FOR PROCESSING. TO GET OUT OF /THIS CONDITION, HIT 'STOP', 'I/O PRESET' IN '8' MODE, /AND RESTART AT LOCATION 100. /PRELIMINARY TESTING INDICATES THAT IT IS MORE OR LESS /POSSIBLE TO MAINTAIN A 30 MILLISECOND SAMPLE LOOP IF /THE NUMBER OF OPERATIONS WITHIN THE LOOP IS LIMITED TO /ONLY 1 OR 2 COMMANDS. THIS DOES NOT INCLUDE I/O TIME. /THE 'HESITATE' COMMAND MUST BE USED TO INITIALIZE THE /CLOCK BEFORE THE 'FTRG' FUNCTION WILL RESPOND TO ANY /INPUT. AN INNOCUOUS CALL (WHICH LEAVES THE CLOCK OFF) /IS: 'H -8,1'. /THE 'O S' COMMAND WILL SWITCH OUTPUT TO THE SCOPE ('O S' /IS ASSUMED WHEN FOCAL IS LOADED) WHILE THE COMMAND 'O E' /WILL RETURN TO THE TERMINAL. THE 'VIEW' COMMAND MAY BE /USED TO CONTROL THE DISPLAY: 'V +1' TURNS IT ON WHILE /'V 0' (OR JUST 'V') TURNS IT OFF. THE DISPLAY IS ACTIVE /WHILE WAITING FOR KEYBOARD INPUT AND ALSO DURING A 'HESI- /TATE' OR 'LOGICAL BRANCH' COMMAND. IT IS ALSO REFRESHED /WHENEVER A RUNNING PROGRAM COMES TO THE END OF A LINE. /THIS LATTER FEATURE CREATES A 'LIVE' DISPLAY, BUT IT DOES /SLOW THINGS DOWN QUITE A BIT. YOU MAY PREFER TO DISABLE /THE DISPLAY AND USE AN 'ASK :-1' COMMAND TO PAUSE FOR IN- /TERMEDIATE RESULTS. OR YOU CAN PUT IN A 'HESITATE' TO /'FLASH' THE ANSWERS SO THE PROGRAM CAN RUN UNATTENDED. /UP TO 85 CHARACTERS CAN BE DISPLAYED ON A SINGLE LINE, /WITH AUTOMATIC 'WRAP-AROUND' IF NECESSARY. THE DISPLAY /'SCROLLS' (LINES AT THE TOP OF THE SCREEN ARE REMOVED) /IF MORE CHARACTERS OR MORE LINES THAN CAN BE ACCOMODATED /ARE OUTPUT. A 'FORMFEED' (CTRL/L) IS USED TO ERASE THE /SCREEN. THIS MAY DONE AT ANY TIME WHILE ENTERING TEXT /OR NUMERICAL VALUES WITHOUT AFFECTING THE RESULT. THE /SCREEN IS NOT CLEARED BY 'CTRL/L' DURING A 'MODIFY' OR /'MOVE' COMMAND, HOWEVER. THE '#' OPERATOR IN 'ASK' AND /'TYPE' COMMANDS IS THE EASIEST WAY TO CLEAR THE SCREEN /IN A PROGRAM, BUT ONE COULD ALSO USE 'FOUT(140)' TO DO /THE SAME THING. TYPING 'RUBOUT' OR 'DELETE' WHILE EDIT- /ING WILL REMOVE THE PREVIOUS CHARACTER FROM THE SCREEN! /THIS MAY ALSO BE DONE BY EXECUTING A 'FOUT(92)'. /THE 'VIEW X,Y' COMMAND FOR DISPLAYING DATA IS ALSO IN- /CLUDED. THIS COMMAND WILL CREATE AN ENTRY IN THE VIEW /BUFFER WHICH WILL BE INTENSIFIED DURING EACH REFRESH /CYCLE. 'VIEW -1' WILL CLEAR ALL POINTS FROM THE BUFFER /WHILE 'VIEW 0' (OR JUST 'V') WILL DISABLE THE REFRESH. /'VIEW 1' OR ANY INPUT FROM THE KEYBOARD MAY BE USED TO /TURN IT ON AGAIN. SEPARATE CHANNELS ARE USED FOR THE /PLOT (CHANNEL 1) AND THE TEXT (CHANNEL 2). /THE DISPLAY ROUTINES OCCUPY 4000-4177 IN FIELD 1. THIS /ALLOWS THEM TO USE 2 CONVENIENT BETA REGISTERS LOCATED /ON THIS PAGE. THE DISPLAY CODES AND THE DISPLAY BUFFER /ARE STORED IN THE HIGHEST FIELD FROM 0 TO 1777 WITH THE /REMAINDER OF THE SPACE USED BY THE VIEW COMMAND. /ACKNOWLEDGMENTS: THE DISPLAY ALGORITHM WAS ADAPTED FROM /ONE WRITTEN BY DOUGLAS E. WREGE OF THE GEORGIA INSTITUTE /OF TECHNOLOGY FOR USE WITH THE OS/8 EDITOR. THE COMPACT /CHARACTER DISPLAY WAS INVENTED BY TIM CLARK, OF FRELAN /ASSOCIATES (MENLO PARK, CA.), AND THE CHARACTER PATTERNS /(AND SOME OF THE DISPLAY LOGIC) COME FROM THE -SCROLL- /EDITOR WRITTEN BY CLYDE G. ROBY JR. (WEST VIRGINIA UNIV. /MEDICAL CENTER). PAUL C. DIEGENBACH AT THE UNIVERSITY /OF AMSTERDAM CONTRIBUTED THE ORIGINAL FORMS OF SEVERAL /OF THE FUNCTIONS. /DEFINITIONS FOR VERSION 4E (OCTOBER 1978) P134=0 P337=2 XRT=14 EXP=44 HORD=45 DAY=55 OUTDEV=57 P7=73 P177=75 C100=100 P17=101 M14=107 BETA=163 CRT=223 INLIST=226 ECHOFF=253 GOTO=610 COMGO=722 EVAL=1610 FNTABL=2157 FNTABF=2357 RUB1=2466 KEYCK=3000 XI33=3007 XINT=3127 ACCEPT=5521 FINALZ=5525 ECODEV=6323 FMQ=6563 ACTION=6571 OSCOPE=6722 PUSHA=4520 POPA=4521 PUSHJ=4522 POPJ=5523 SORTJ=4526 TSTCMA=4543 NEGATE=4557 FIXIT=4560 ERROR2=4576 FLOAT=4552 FLOATR=5553 FL0ATR=5554 RETURN=5555 CONTINUE=5434 FENT=4407 FIXMRI FGET=0000 FEXT=0000 P=10 T=20 B=70 FIELD 0 *HORD 6362 /SHOW '32K' *CRT OSCOPE /IMPLEMENT 'O S' *OSCOPE-1 SCOPE *5400 IOF 6141 /L MODE 1020 /LDA I 20 4 /ESF - ISSUE I/O PRESET 2 /PDP - MODE *FINALZ+2 NOP /CAN'T RUN UNDER ANYTHING FIELD 1 *OUTDEV SCOPE /START UP THE DISPLAY! *113 E27, 27 /CLOCK REGISTERS HCNT, 0 LCNT, 0 OFLO, 0 FLAGS, 0 *164 DSW, XI33+1 /DISPLAY SWITCH *INLIST+1 ECHOFF /SO WE CAN ERASE THE SCREEN *1241 CMA /LET '#' CLEAR THE SCREEN *COMGO-1 REFRSH /ADD REFRESH AT END OF LINE *COMGO+"H-"@ TATE *COMGO+"K-"@ KONTRL *COMGO+"V-"@ VIEW *FNTABF+15 FLS *FNTABF+31 FADC FTRG FBUF FTIM FXL FSS *FNTABF+43 FDA *FNTABL+16 "R-200^4+"S-200 /RS *FNTABL+35 "X-200^4+"L-200 /XL "S-200^4+"S-200 /SS *KEYCK KDISPL /PATCH THE INPUT LOOP *ECODEV SCOPE /MAKE THIS THE DEFAULT *ACTION+3 ACCEPT-1 /ACTIVATE FF DURING ASK *7577 BDISPL /DISPLAY ON A BRANCH *4000 /THE DISPLAY PROCESSOR YVAL, 0 /THE VERTICAL COORDINATE XVAL, 0 /THE HORIZONTAL COORDINATE SCOPE, 0 /FILL THE OUTPUT BUFFER DCA YVAL /SAVE THE CHARACTER CODE TAD YVAL SORTJ /CHECK FOR LF,FF,CR,BA,BELL,RUB M1, P134-1 SCOPGO-P134 SBA, TAD YVAL /NOTHING SPECIAL AND P177 /ONLY USE 7 BITS CLL RAL /MULTIPLY BY TWO TAD TBS /ADD START OF THE TABLE SCR, DCA YVAL /SAVE PATTERN POINTER TAD CHRCNT /OK NOW, BUILD POINTER TAD BUF /TO THE NEXT LOCATION DCA XRT /-> AUTO INDEX REG. TAD YVAL /GET THE PATTERN ADDRESS CDF B /DISPLAY BUFFER LOCATION DCA I XRT /SAVE IT STL RTL /ADD ONE TO THE COUNT SRO, TAD CHRCNT /RUBOUT = ERASE ONE CHARACTER SZA /WATCH OUT FOR MISTAKES HERE TAD M1 SFF, DCA CHRCNT /FF = ERASE THE ENTIRE SCREEN TAD CHRCNT /DO A LITTLE CHECKING TAD (SBUFR-2000 /YE OLDE BUFFER SIZE! SMA CLA JMS SCROLL /TIME TO REMOVE A LINE BEL, CDF P /BELL: DON'T DISPLAY 'G' SLF, JMP I SCOPE /IGNORE LF'S COMPLETELY BUF, SBUFR-1 CHRCNT, 0 SCOPGO, SRO BEL SBA SFF SLF SCR SBA /RELEVANT LINC-MODE INSTRUCTIONS LDAI=1020 DSCI=1760 DSC=1740 STC=4000 ADD=2000 LDF=0640 BDISPL, TAD (GOTO-XI33 /DO A DISPLAY CYCLE ON A BRANCH KDISPL, TAD DSW /WHILE WAITING FOR KEYBOARD INPUT PUSHA /SAVE THE RETURN ADDRESS REFRSH, TAD I DSW /CHECK THE 'DISPLAY SWITCH' SPA SNA CLA POPJ /NOTHING DOING TAD CHRCNT CMA DCA SCROLL /SAVE NUMBER OF CHARACTERS TAD BUF DCA XRT /INITIALIZE THE INDEX REGISTER CDF B TAD P337 /START DISPLAY AT THE TOP NULINE, DCA YVAL /INITIALIZE FOR A NEW LINE TAD (7002 /=2 + UNSEEN SIGN BITS DCA XVAL /AND ALSO SETS CHANNEL 2 RFEND, ISZ SCROLL /DONE? JMP RFLUP /NOT YET SM20, SNL SMA SZA CLA /THINK IT WILL SKIP? JMS SCROLL /SCREEN FULL, REMOVE A LINE JMP I (PTPLOT /REFRESH THE VIEW BUFFER RFLUP, TAD I XRT /GET THE NEXT CHARACTER SNA /CR? JMP RFEOL /YES DCA SCOPE /PUT ADDRESS IN LINC REG. 2 TAD YVAL CIF P /INHIBIT INTERRUPTS BRIEFLY LINC LDF 34 /POINT TO THE PATTERN TABLE DSC 2 /DISPLAY COLUMNS 1 & 3 LDAI;-4 /-3 IN ONE'S COMPLEMENT ADD 1 /BACKUP THE X-COORDINATE STC 1 /AND SAVE IT AGAIN ESF /SET SMALL LETTERS TBS, YVAL&1777 ADD /RELOAD THE Y-COORDINATE DSCI 2 /DISPLAY COLUMNS 2 & 4 PDP /BACK TO THE REAL WORLD CLA /GET RID OF THE Y VALUE ISZ XVAL /SPACE AND CHECK FOR OVERFLOW JMP RFEND /CONTINUE WITH THE NEXT ONE RFEOL, TAD P337 /START A NEW LINE TAD YVAL SPA CLA /FILLED THE SCREEN? JMP SM20+1 /YES TAD SM20 TAD YVAL JMP NULINE /DO A LINEFEED SCROLL, 0 /REMOVE A LINE FROM THE TOP TAD BUF DCA XRT TAD CHRCNT /REDUCE THE CHAR COUNT SNA JMP I SCROLL /NO CR'S IN THE BUFFER! TAD M1 DCA CHRCNT TAD I XRT /LOOK FOR A CR SZA CLA JMP SCROLL+3 TAD BUF /SET THE SECOND POINTER DCA YVAL TAD CHRCNT /NEW VALUE CIA DCA XVAL /HANDY REGISTER TAD I XRT /SHUFFLE THINGS DOWN ISZ YVAL DCA I YVAL ISZ XVAL /COUNT JMP .-4 JMP I SCROLL / 'FTRG' TESTS FOR THE OCCURANCE OF ANY SCHMITT TRIGGER / THE ARGUMENT (2,8,32) SERVES AS A MASK; '0'=ALL FLAGS / THE VALUE RETURNED IS THE WEIGHTED SUM OF THE EVENTS. FTRG, FIXIT /GET THE MASK SNA CMA CLL RAR /'0' = ALL AND FLAGS /COMPARE FLOAT /SAVE TAD HORD /RECALL CMA AND FLAGS /REMOVE THE BITS WE TESTED DCA FLAGS RETURN FLS, CIF P /READ THE LEFT SWITCHES LINC LSW PDP FL0ATR /AS AN UNSIGNED NUMBER PAGE /THE 'VIEW X,Y' POINT-PLOT COMMAND FOR THE PDP12: /'VIEW X,Y' WILL BRIGHTEN THE POINT (X,Y) DURING EACH RE- /FRESH CYCLE. 0<X<1023 AND -512<Y<511. 'VIEW' WITH ONLY /A SINGLE ARGUMENT IS USED TO TURN THE DISPLAY ON AND OFF /OR TO CLEAR THE POINT-DISPLAY BUFFER USING 'V -1'. *3400 /START A NEW PAGE DISB, 2000-1 /THE STARTING LOCATION PNTR, 2000-1 /THE CURRENT LOCATION VIEW, PUSHJ /GET THE FIRST PARAMETER EVAL TSTCMA /IS THERE ANOTHER ONE? JMP ONLY1 /NO JMS STORE /PUT 'X' IN THE BUFFER PUSHJ EVAL JMS STORE /PUT 'Y' IN THE BUFFER CONTINUE STORE, 0 /LOOKS SIMPLE ENOUGH STL IAC RAL /= -(BEND-1) TAD PNTR /WATCH OUT FOR OVERFLOW SZL CLA ERROR2 /TOO MANY! ISZ PNTR FIXIT CDF B /B=T FOR 12K, B=V FOR 16K DCA I PNTR CDF P JMP I STORE ONLY1, FIXIT /SPECIAL CASE AND P17 /BE CAREFUL ISZ HORD /TEST FOR -ANYTHING DCA I DSW /SET THE DISPLAY SWITCH SNA CLA /TEST FOR -1 CONTINUE /SOMETHING ELSE TAD DISB DCA PNTR /CLEAR THE SCREEN BUT DON'T CONTINUE /MESS UP THE DISPLAY SWITCH ///// BEND= -2 /PROVIDE THE PROGRAM WITH ACCESS TO THE VIEW BUFFER FBUF, FIXIT /ACCESS TO THE VIEW BUFFER TAD DISB PUSHA /SAVE THE INDEX VALUE TSTCMA /READ OR WRITE? JMP RBUF /READ PUSHJ /WRITE EVAL TAD PNTR /SAVE THE 'VIEW' POINTER DCA XRT POPA DCA PNTR JMS STORE TAD XRT DCA PNTR RETURN RBUF, POPA /READ FROM THE BUFFER DCA XRT CDF B TAD I XRT /NO LIMIT CHECKING FLOATR /EXTEND THE REFRESH CYCLE TO INCLUDE THE VIEW BUFFER PTPLOT, TAD DISB /SETUP THE ADDRESS REGISTER DCA XRT CDF B PTLOOP, TAD XRT /CURRENT STL CMA TAD PNTR /THE END SZL CLA POPJ /END REFRESH TAD I XRT /GET X CLL RAR /ASSUME 10 BITS, BUT ONLY USE 9 CDI P /INHIBIT LINC-MODE INTERRUPTS DCA I BETA /THIS POINTS TO BETA 14 CDF B TAD I XRT /GET THE Y VALUE IN THE AC CLL RAR /SO WE CAN DISPLAY A/D READINGS LINC DIS 14 /PLOT IT ON CHANNEL 1 PDP CLA JMP PTLOOP /THE RELAYS ARE TREATED AS A 6-BIT NUMBER SO THEY CAN BE /SET OR CLEARED SIMULTANEOUSLY. THE TABLE BELOW EXPLAINS: / RELAY DECIMAL / 0 32 / 1 16 / 2 8 / 3 4 / 4 2 / 5 1 /THUS DECIMAL 25 WILL CLOSE RELAYS 1,2 & 5, OPEN THE OTHERS KONTRL, PUSHJ /'K 1' CLOSES RELAY 5, ETC. EVAL FIXIT CIF P /INHIBIT INTERRUPTS LINC ATR PDP CONTINUE /COULD CHECK FOR MORE ARGUMENTS ///// /THE 'FSS', 'FXL' AND 'FADC' FUNCTIONS *3517 /FIX THE ERROR CODES FSS, FIXIT /CLEARS THE LINK TAD N6 /TEST ARGUMENT SZL ERROR2 /NEGATIVE OR .GT. 5 TAD P446 JMP TST-3 FXL, FIXIT /TEST EXTERNAL LEVELS TAD M14 SZL ERROR2 /ARGUMENT NOT IN RANGE 0<N<12 TAD P414 DCA TST CIF P /PREVENT INTERRUPTS LINC TST, 0 /THIS IS A LINC-MODE SKIP COM /SET -1 IF OPEN PDP STL RAL /0 BECOMES +1, -1 IS UNCHANGED! FLOATR /RETURNS: +1 IF SET, -1 IF NOT ///// N6, -6 P446, SNS+6 P414, SXL+14 FADC, FIXIT /GET THE CHANNEL NUMBER CIF P AND P17 TAD C100 /COMPUTE THE INSTRUCTION DCA .+2 LINC SAM /'SAM' = '100' PDP FLOATR ///// *FMQ FMQ, FIXIT /LOAD THE MQ WITH A LINC SHIFT CIF P LINC ROR 14 /WITH EAE THIS IS UNNECESSARY- PDP RETURN /JUST USE THE STANDARD VERSION ///// *RUB1+5 FDA, FIXIT /MOVE THIS OUT OF THE WAY CIF 20 JMP DAY ///// /LINC-MODE INSTRUCTIONS: LSW=0517 SNS=0440 SXL=0400 ROR=0300 DIS=0140 SAM=0100 COM=0017 ATR=0014 ESF=0004 PDP=0002 /CLOCK ROUTINE FOR THE KW12A - THE 'HESITATE' COMMAND /START WITH 'H -5,Q' WHERE Q IS THE TIME IN UNITS OF 0.01 /SECONDS. THUS Q=100 IS A 1 SECOND COUNTING PERIOD. TO /CHOOSE OTHER UNITS, CHANGE THE FIRST PARAMETER (WHICH MUST /BE NEGATIVE) TO SELECT A DIFFERENT TIME BASE. THUS -4 = /0.001 SECONDS (MILLISECONDS) AND -6 = RATE DETERMINED BY /INPUT #1. (SEE THE LABORATORY COMPUTER HANDBOOK.) /IT IS NOT NECESSARY TO SET THE UNITS UNLESS YOU WISH TO /CHANGE IT FROM 0.001 SECONDS, BUT IF YOU DO YOU MUST GIVE /A NEW DELAY COUNT TOO. (DELAY MUST BE LESS THAN 4096.) /'H' THEN WAITS UNTIL THE END OF THE NEXT COUNTING CYCLE. /TO RING THE BELL OF THE TTY EVERY 4 SECONDS: / 1.1 H 4000;C OR: H -5,400 / 1.2 H FOUT(135);L B 1.2;R /FOR ANOTHER APPROACH SEE DECUSCOPE 14 #2 P.27 (1975) *4460 /AFTER 'FCOM' WATE, PUSHJ /REFRESH WHILE WE'RE WAITING REFRSH TAD OFLO /CHECK FOR OVERFLOW SNA CLA JMP WATE DCA OFLO /CLEAR FOR THE NEXT TIME HESI, TSTCMA /ANY MORE ARGUMENTS? CONTINUE /NO TATE, PUSHJ /'HESITATE' ENTRY POINT EVAL NEGATE /AND CHECK FOR ZERO SZL /ZERO ARGUMENT? JMP WATE+2 /YES, WAIT FOR TIMEOUT FIXIT /CONVERT TO INTEGER FORMAT ISZ HORD /RATE OR DELAY? JMP RATE /SET THE NEW RATE CLAB /LOAD THE CLOCK BUFFER CLA CLLR /SET MODE 0, STOP THE CLOCK TAD TIME CLLR STA /ENABLE ALL INPUTS, INTERRUPTS CLEN JMP WATE+3 RATE, AND P7 /BE PRUDENT RTR /SHIFT RATE BITS INTO PLACE RTR TAD C100 /MODE 1 DCA TIME JMP HESI /MORE? TIME, 4100 /MILLISECONDS /THE 'FTIM' FUNCTION COUNTS CLOCK OVERFLOWS FTIM, TAD HORD /READ OR SET THE ELAPSED TIME SZA JMP CLEAR FENT / ARG < 0 -> CLEAR FGET E27 / ARG = 0 -> READ FEXT / ARG > 0 -> PRESET CLEAR, SPA CLA /CLEAR OR PRESET? DCA EXP /CLEAR FIXIT DCA LCNT TAD HORD DCA HCNT RETURN /ALWAYS RETURNS THE COUNTER! /THIS IS THE CLOCK INTERRUPT HANDLER: CINT, CLSK /ANY ACTIVITY? JMP I LINT /NO CMA CLL RAR /=3777 AND FLAGS /REMOVE THE CLOCK FLAG CLSA /MERGE THE EVENT FLAGS DCA FLAGS /SAVE EVERYTHING TAD FLAGS SMA CLA /CLOCK OVERFLOW? JMP I LINT /NO ISZ LCNT /ADD ONE SKP ISZ HCNT /ADD 4096 ISZ OFLO /TELL 'HESITATE' ABOUT IT TAD HCNT SPA CLA /KEEP IT DOWN TO 23 BITS DCA HCNT JMP I LINT /LEAVE ROOM FOR THE INTERNAL LPT: HANDLER... *4565 LINT, XINT+2 *XINT JMP I .+1 /REPLACE TWO 'NOP'S CINT / '8-MODE' IOT CODES: CLSK=6131 CLLR=6132 CLAB=6133 CLEN=6134 CLSA=6135 LINC=6141 CDI=6203 /PATTERN TABLE FOR THE DSC INSTRUCTION FIELD 7 SBUFR= 400 /AFTER THE PATTERN TABLE *0 /RIGHT AT THE BEGINNING STABL, 3400;1076 4040;6760 4740;6060 4740;6760 4040;6067 4040;6767 4040;6067 4740;6767 4047;6060 0103;0301 4747;6060 4747;6760 0330;0745 4507;3003 4747;6067 4747;6767 0101;0303 0101;7303 7101;0303 7101;7303 0101;0373 0101;7373 7101;0373 7101;7373 0171;0303 0171;7303 7171;0303 1604;0416 0171;0373 0171;7373 7171;0373 7171;7373 0000;0000 0000;0075 7070;0000 7714;1477 7121;4657 3361;4366 2626;0551 7000;0000 4100;0036 3600;0041 2424;0010 3704;0404 0600;0005 0404;0404 0300;0003 3001;4006 5136;3645 7701;0121 5123;2145 5122;2641 7714;0424 5172;0651 2506;4215 5043;6044 5126;2651 5122;3651 6600;0066 6600;0065 4210;0024 1212;1212 2400;1042 5520;2040 5536;3541 4477;7744 5177;2651 4136;2241 4177;3641 4577;4145 4477;4044 4536;2641 1077;7710 4141;0077 7642;4041 2477;4310 0177;0301 3077;7730 0677;7730 4177;7741 4477;3044 4336;3745 4677;3144 5121;4651 7740;4040 0177;7701 0276;7401 0177;7706 1463;6314 0770;7007 5143;6145 0077;0041 0640;0130 4100;7700 3700;1010 1010;1034 1040;0020 1106;1711 1177;0611 1106;1111 1106;7711 1506;1415 4404;2077 1306;0311 1077;0710 5700;0000 5702;0001 0677;1102 7700;0101 0417;1704 1017;1704 1106;0611 1217;0412 1317;1711 1017;1004 1505;1215 1010;0077 0216;1701 0114;1602 0217;1702 0413;1304 0314;1403 1511;1113 4210;0066 0000;0077 6600;1042 0404;1010 3636;3636 $$$$;$$$$ /END OF THE PATTERN TABLE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 | /FLOATING POINT INPUT/OUTPUT ROUTINES: / 8XFPP.PA / FOR PDP8I OR PDP12 WITH EAE / REVISIONS: / PRINTC CHANGED TO CLA AT 15666 TO DELETE LEADING SPACE / /NOTE: THESE ROUTINES HAVE BEEN EXTENSIVELY REVISED! *5400 /AFTER THE FUNCTIONS FLINTP, 0 /CONVERT ASCII TO BINARY - 'READN' JMS FIGO5 /CHECK LEADING CHARACTERS JMS FIGO4 /READ FIRST DIGIT GROUP SNL /ENDED BY A PERIOD? JMS FETCH /SKIP IT & READ 2ND GROUP JMS FIGO7 /AND SET NEW DIGIT COUNT JMS I RESOL /FIX UP THE SIGN TAD CHAR TAD (-"E /DID WE READ AN 'E'? SZA CLA JMP FIGO2 /NO FIGO1, JMS FETCH /YES, PASS THE 'E' FENT FPUT I FLARGP /SAVE THE MANTISSA & DEC. PT. FEXT JMS FIGO4 /READ THE DECIMAL EXPONENT TAD OVER ISZ SIGN /CHECK THE SIGN CIA DCA FIGO4 /SAVE THE RESULT FENT FGET I FLARGP /RESTORE WHAT WE HAD FEXT TAD FIGO4 /COMBINE THE SCALE FACTORS FIGO2, TAD EXP /SET UP THE LOOP COUNTER CLL SPA STL CIA /WITH -(ABS. VALUE+1) CMA DCA FIGO4 SZL /TEST DIRECTION TAD FL10 TAD (FMUL FLP1 /OR 'FMUL FL10' DCA FIGO3+1 TAD P43 /INSERT THE PROPER EXPONENT DCA EXP NORMALIZE JMP FIGO3+3 FIGO3, FENT /SCALE LEFT OR RIGHT FMUL FL10 FEXT ISZ FIGO4 JMP FIGO3 JMP I FLINTP /***RETURN*** FIGO4, 0 /READ A GROUP OF DIGITS JMS FIGO6 /START WITH ZERO SM1 DCA SIGN /INITIALIZE SIGN TAD CHAR TAD (-"- SZA ISZ SIGN /RESET IF POSITIVE CMA CLL RAL /SET CODE FOR "+" CMA CLL RAR /"+" -> 0000(1) SNA CLA /NOT "+" OR "-" IAC /SKIP THE SIGN JMS FIGO5 /AND IGNORE SPACES JMS FIGO7 /DO ALL THE WORK JMP I FIGO4 ///// FIGO5, 0 /PROCESS LEADING CHARACTERS SMA SZA /-240, ONLY 'SZA' OCCURS JMS FETCH /GET FIRST OR NEXT TAD CHAR TAD .-3 /IS IT A SPACE? SNA CLA JMP .-4 /IGNORE LEADING SPACES JMP I FIGO5 ///// FIGO6, 0 /'FLOAT' DCA HORD DCA LORD DCA OVER TAD P13 DCA EXP JMP I FIGO6 ///// /READ A CHARACTER FROM TEXT OR THE INPUT DEVICE: FETCH, 0 TAD I FLINTP /CHECK THE NEXT INSTRUCTION SMA CLA JMP ACCEPT GETC /READ FROM THE TEXT BUFFER JMP I FETCH ///// PRINTC /IN CASE WE WANT TO ECHO FF ACCEPT, READC /READ FROM THE INPUT DEVICE SORTJ /TEST FOR SPECIAL ACTION SPECIAL-1 ACTION-SPECIAL JMP I FETCH ///// FIGO7, 0 /DECIMAL-TO-BINARY CONVERSION DCA EXP /CLEAR DIGIT COUNTER TESTN JMP I FIGO7 /PERIOD, L=0 JMP FIGO9 /OTHER, L=0 TAD SORTCN /GET THE NUMBER FIGO8, MULT10 /ADD IT IN SZA CLA JMP .+3 TAD HORD /CHECK FOR OVERFLOW SPA CLA ERROR2 /INPUT OVERFLOW ERROR ISZ EXP /COUNT THE DIGITS JMS FETCH /GET ANOTHER ONE JMP FIGO7+2 ///// FIGO9, TAD CHAR /ALLOW A-Z TAD (-"E SNA JMP I FIGO7 /'E' IS SPECIAL AND L=1 TAD ("E-"Z-1 STL IAC TAD ("Z-"A+1 SNL SZA JMP FIGO8 /TREAT A-Z LIKE NUMBERS STL CLA JMP I FIGO7 /L=1 ///// /THESE TWO CONSTANTS MUST NOT BE SEPARATED FLP1, -3;3146;3146;3147 FL10, +4;2400;0000;0000 ECHOGO=. /BRANCH LIST FOR 'READC' IECHO-2 /FF IECHO+1 /LF IECHO+1 /RO *PRODUCT SPECIAL,233 /ESCAPE 375 /ALTMODE "_ /RESTART ECHOLST,FF /IGNORE (KEYBOARD ONLY) LF /IGNORE RO /IGNORE /THIS ROUTINE EXTENDS THE FORMAT SPECIFICATIONS (%W.DD) TO /ALLOW THE NUMBER OF DIGITS PRINTED IN SCIENTIFIC NOTATION /TO BE CONTROLLED. A FORMAT OF '0' MEANS 'ALL SIGNIFICANT /DIGITS' WHILE '.05' MEANS 'JUST PRINT 5' WITH APPROPRIATE /ROUNDING. THIS FORMAT PRINTS A LEADING DIGIT FOLLOWED BY /A DECIMAL POINT, MORE DIGITS AND THEN THE EXPONENT. /ANOTHER IMPROVEMENT IS THAT THE MINUS SIGN IS ALWAYS OUT- /PUT JUST AHEAD OF THE FIRST SIGNIFICANT DIGIT. *5600 /A RATHER SPECIAL LOCATION! PD, DIGITS /DEFAULT TGO, 0 /CALLED BY 'PRINTN' DCA XRT2 /SAVE BUFFER ADDRESS TAD FISW /GET FORMAT SAVED BY % TRAP AND P7600 /ISOLATE THE FIELD LENGTH RTL6 STL CIA /NEGATE AND TEST FOR ZERO DCA FLAC /SAVE MINUS FIELD LENGTH TAD FISW /GET NO. OF DECIMAL PLACES SNA TAD PD /USE DEFAULT IF NONE SPEC. ESGN, AND P177 /A REASONABLE LIMIT! SNL /SCIENTIFIC? JMP SPM0+1 /YES, ROUND TO D PLACES TAD FLAC /COMPARE FIELD SIZE SNL / D-F < 0 ? STA STL /NO, TAKE D = F-1 TAD T3 /COMPARE DECIMAL EXPONENT SNL SMA SZA / E > F-D ? SPM0, SNL SMA SZA CLA /ROUND OFF TO F PLACES CIA /ENTER HERE FOR SCI. NOT. DCA T2 /SAVE F-D-E (OR 0 OR -D) TAD T2 /THIS IS TRICKY BUSINESS! STL /EXTEND THE SIGN TAD FLAC / -(E+D), -F OR -D (-D-F) TAD PD /COMPARE WITH LIMIT SZL /SKIPS FOR 0 < AC < PD+1 CLA /LIMIT ROUNDOFF TO DIGITS+1 TAD EX1 /ADD -PD-1 (MDM1) TO RESTORE STL CIA /(E+D), F, D, DIGITS (+1) BUMP, TAD XRT2 /SET UP BUFFER ADDRESS DCA OUTA ISZ I OUTA /INCREMENT THIS DIGIT TAD I OUTA /NOW TEST IT SNL /LITTLE EXTRA THE FIRST TIME TAD M4 TAD M5 SPA SNA CLA /CARRY REQUIRED? JMP RNDC+4 /NO: GO TO OUTPUT DCA I OUTA /YES: MAKE CURRENT DIGIT ZERO STL IAC /SET UP LINK FOR NEXT CYCLE & DCA I START /ANTICIPATE CARRY FROM 999... TAD OUTA /DECR AND CHECK THE POINTER TAD RNDC /-(START OF BUFFER) SZA /BEGINNING OF BUFFER REACHED? JMP BUMP /NO: BUMP THE NEXT DIGIT ISZ T3 /YES: INCR. DECIMAL EXPONENT RNDC, -BUFFER-1 /'NOP' CMA /AND SET THE MANTISSA TO 0.1 TAD XRT2 /BY DECREMENTING THE POINTER JMP TGO+1 /RECOMPUTE THE DECIMAL POINT SM1 /SET SIGN COUNTER DCA T1 TAD C240 /'TAD ESGN' IF YOU WISH CLA /PRINTC TO PRINT A LEADING SPACE BEFORE # TAD FLAC /GET FIELD SIZE SNA /FLOATING OUTPUT ? JMP FLOUT /YES TAD T3 /COMPARE WITH EXPONENT SMA SZA CLA / E > F ? JMP FLOUT+2 /YES: USE FLOATING FORMAT TAD T2 / F-D-E (OR 0 IF E > F-D) TAD T3 / F-D OR E CIA /CALCULATE -NO. OF POSITIONS DCA T2 /TO PRINT BEFORE DECIMAL PT. BACK, TAD T2 /PRINT DD.DDD TAD T3 SNA CLA / P = E ? JMP DIG /YES: PRINT DIGIT IAC /NO ('376' TO SUPPRESS 1ST ZERO) TAD T2 SPA CLA / P < 1 ? TAD SPM0 /YES: PRINT SPACE AGAIN, JMS OUTA /PRINT CHARACTER ISZ T2 /P CHARACTERS PRINTED? JMP BACK /NO SM2 /YES ('TAD 376') PRINTD /PRINT DECIMAL POINT JMP BACK FLOUT, TAD T2 /SET FIELD SIZE DCA FLAC / -D SM1 /SET FLAG DCA OUTA ISZ TGO /SET SECOND RETURN DIG, CLA SM1 /POINTS TO 'TERM' TAD T3 /REDUCE E BY 1 DCA T3 JMS GETD /GET NEXT DIGIT ISZ OUTA /TEST FLAG JMP AGAIN /NORMAL RETURN PRINTD /PRINT FIRST FLOATING DIGIT SM2 /CREATE A PERIOD (256-260) SKP /DON'T FETCH & DON'T COUNT JMS GETD /FETCH NEXT DIGIT JMS OUTA /PRINT IT JMP .-2 /AND REPEAT OUTA, 0 PRINTD /PRINT CHARACTER ISZ FLAC /F CHARACTERS PRINTED? JMP I OUTA /NO: RETURN JMP I TGO /YES: NUMBER FINISHED ///// GETD, 0 /ROUTINE TO UNLOAD BUFFER TAD I XRT2 /AUTO-INDEX REG. SETUP UPON ENTRY ISZ EX1 /TEST FOR END OF SIGNIFICANT FIG. JMP I GETD CLA CMA /FORCE -1 IN ORDER TO DCA EX1 /OUTPUT EXTRA ZEROS JMP I GETD /LEAVE C(AC)=0 ///// FTRM, TAD I DIG /GET THE INPUT TERMINATOR FLOATR ///// DBLSUB, 0 /CHECK FOR A SECOND SUBSCRIPT TSTCMA JMP I DBLSUB /ONLY ONE PUSHF FLAC /SAVE THE FIRST ONE PUSHJ EVAL /GET THE SECOND ONE POPF FLARG /TEMPORARY STORAGE TAD DIMEN DCA PT1 /SET THE VARIABLE POINTER FENT FSUB I FP1 /THE SECOND MINUS ONE FMULIPT1 /TIMES THE DIMENSION FADD I FLARGP /PLUS OFFSET OF FIRST FEXT JMP I DBLSUB /CALLED BY 'GETARG' DIMEN, STVAR+2+WORDS+2 /DATA POINTER FOR (!) PAGE LNFEED= (0&(1&(2 /RESERVE 3 LOCATIONS XLIST; NOPUNCH; PAGE 30; ENPUNCH; XLIST /FLOATING POINT OUTPUT CONVERSION: 'PRINTN' /REWRITTEN TO PROVIDE THREE NEW FEATURES: (1) A 'FLOATING' /MINUS SIGN WHICH APPEARS BEFORE THE FIRST DIGIT; (2) A /MEANS FOR 'TDUMP' TO OUTPUT 3-DIGIT SUBSCRIPTS (+/-999); /(3) A PROVISION FOR NON-PRINTING CALLS WHICH JUST SET UP /THE OUTPUT BUFFER BUT DO NOT DO ANY PRINTING. /THANKS TO JIM CRAPUCHETTES FOR TWELVE LOCATIONS! MDM1, -DIGITS-1 /START FLOUTP AT PAGE+1 FLOUTP, 0 /CONVERT BINARY TO ASCII DCA T2 /SET THE NON-PRINT FLAG STL IAC DCA T3 /INITIALIZE THE EXPONENT JMS I ABSOL /TAKE THE ABSOLUTE VALUE CMA RAR /LINK WILL BE ZERO IF NEGATIVE DCA FGO6 /SET THE SIGN FLAG TAD SIGN SNA CLA /ZERO? JMP FGO3 FGO1, FENT /NUMBER TOO LARGE FMUL I (FLP1 /MULTIPLY BY .1 FEXT ISZ T3 /INCREASE DECIMAL EXPONENT TAD EXP SMA SZA CLA /CHECK THE BINARY EXPONENT JMP FGO1 FGO2, FENT /NUMBER TOO SMALL FMUL I (FL10 /MULTIPLY BY 10 FEXT CMA /DECREASE DECIMAL EXPONENT TAD T3 DCA T3 TAD EXP /CHECK THE BINARY EXPONENT SPA SNA JMP FGO2 FGO3, CMA /NEGATE THE BIT COUNT DCA EXP TAD MDM1 /INITIALIZE DIGIT COUNT DCA OUTDG TAD START /INITIALIZE BUFFER POINTER DCA XRT2 FGO4, DCA EX1 /SHIFT OUT THE FIRST DIGIT SHIFTL TAD EX1 RAL ISZ EXP JMP FGO4 SKP FGO5, MULT10 /IE. 0.672 X 10 = 6 + 0.72.. ETC. DCA I XRT2 ISZ OUTDG /ALL DIGITS OUTPUT? JMP FGO5 /NO: CONTINUE TAD MDM1 DCA EX1 /SAVE NO. OF DIGITS TAD START /GET BUFFER POINTER ISZ T2 /TEST PRINT FLAG JMS I .+1 /OUTPUT MANTISSA JMP I FLOUTP /FIXED POINT DONE TAD ("E /PRINT 'E' PRINTC JMS FGO6 /OUTPUT THE EXPONENT JMP I FLOUTP /FLOATING POINT DONE ///// OUTDG, 0 /MULTI-PURPOSE ROUTINE - 'PRINTD' SMA /IGNORE SPACES AND THE LIKE OR ISZ T1 /DIGITS OTHER THAN THE FIRST ! JMP DGOUT DCA T1 /SAVE THE FIRST DIGIT ISZ FGO6 /CHECK THE SIGN FLAG TAD C255 /MAKE A '-' TAD C240 /'SZA' TO OMIT THIS SPACE PRINTC TAD T1 /RESTORE AC DGOUT, TAD ("0 /FORM ASCII PRINTC JMP I OUTDG C255, 15 /'255' ///// FGO6, 0 /ALSO CALLED BY 'TDUMP' TAD T3 /GET EXPONENT SPA CLA /TEST SIGN SP2 /+2 -> -3 TAD M5 JMS OUTDG /PRINT SIGN TAD T3 SPA CIA MQL DVI /DIVIDE BY ONE HUNDRED 144 DCA T2 SWP /PRINT QUOTIENT SZA /UNLESS IT'S ZERO JMS OUTDG TAD T2 /NOW PRINT REMAINDER JMS PRNT JMP I FGO6 PRNT, 0 /PRINT TWO DECIMAL DIGITS AND P177 MQL DVI /DIVIDE BY TEN 12 DCA T2 SWP /GET QUOTIENT JMS OUTDG TAD T2 /GET REMAINDER JMS OUTDG DCA T1 /RESET SWITCH JMP I PRNT /CALLED BY 'FGO6' & 'PRNTLN' ///// MPLY, 0 /CONTINUATION OF EAE MULTIPLY TAD LORD DCA .+3 TAD AC1L /B*E SWP MUY 0 TAD EX1 MQL /DISCARD FOUR RAL DCA EX1 /INITIALIZE TWO TAD HORD DCA .+3 TAD AC1L /A*E SWP MUY 0 TAD EX1 /ADD TO TWO DCA EX1 TAD LORD DCA .+3 TAD AC1H /B*D SWP MUY 0 TAD EX1 /BUILD UP TWO JMP I MPLY /FINISH ONE & TWO FIELD 1 /FORGET LITERALS *LNFEED TAD I TABCNT /WHERE ARE WE? SNA CLA JMP I CFF /IGNORE THE LF AFTER A CR TAD LASTC DCAIAXIN /SAVE THE LAST CHARACTER JMP I .+1 LFCONT-7 /RETYPE THE INPUT LINE /THIS IS A VERY HANDY ROUTINE FOR CONVERTING BCD DATA TO /BINARY FLOATING POINT FORM. JUST SET EXP=43 AT THE END. *6204 XTEN, 0 /MULTIPLY THE FLAC BY 10 (DECIMAL) SWP /AND ADD IN C(AC) DCA CPRNT /SAVE THE MQ TAD OVER SWP MUY /THANKS TO REV. GEOFFREY CHASE 12 /FOR SUGGESTING AN EAE VERSION SWP DCA OVER TAD LORD SWP MUY 12 SWP DCA LORD TAD HORD SWP MUY 12 SWP DCA HORD TAD CPRNT /RESTORE MQ SWP /AC=OVERFLOW JMP I XTEN /EXECUTION TIME = 60 MICROSECONDS ///// MULT2, 0 /MULTIPLY FLAC BY 2 - 'SHIFTL' TAD OVER CLL RAL DCA OVER TAD LORD RAL DCA LORD TAD HORD RAL DCA HORD JMP I MULT2 /DOES NOT CHANGE 'EXP' ///// DUBLAD, 0 /TRIPLE PRECISION ADDITION CLL TAD OVR1 TAD OVER DCA OVER RAL TAD AC1L TAD LORD DCA LORD RAL TAD AC1H TAD HORD DCA HORD JMP I DUBLAD /CHARACTER INPUT/OUTPUT ROUTINES: 'READC' AND 'PRINTC' /THE INPUT ROUTINE MAY ALSO BE USED TO ECHO A CHARACTER. CHIN, 0 /INPUT A CHARACTER CDF P SNA /'ECHOC' IF AC#0 JMS I INDEV /'READC' IF AC=0 DCA CHAR SORTJ /TAKE CARE OF SPECIAL CHARACTERS ECHOLST-1 ECHOGO-ECHOLST JMP IECHO TAD INDEV /ONLY ECHO FF TO A FILE SPA CLA IECHO, PRINTC /'ZERO' IF NOT ECHOING JMP I CHIN ///// CHOUT, 0 /OUTPUT A CHARACTER - 'PRINTC' SNA /USE AC IF NON-ZERO TAD CHAR /OTHERWISE USE CHAR TAD MCR CIF L JMP TAB /ADJUST TAB COUNTER CROUT, TAD CCR JMS I OUTDEV /CARRIAGE RETURNS TAD CLF JMS I OUTDEV /NORMAL RETURNS JMP I CHOUT ///// /CALLS TO AND FROM THE TAB ROUTINES IN FIELD 0: TABX, PUSHJ /EVALUATE THE COLUMN NO. EVAL-3 FIXIT CIF L JMP ZER+1 /SAME PAGE, FIELD 0 SKPX, JMS CHIN /NEGATIVE COL. NO. CIF L JMP NEG+2 /RETURN TO LOWER FIELD ///// FILIN, ICHAR0 /FILE INPUT ECODEV, XOUTL /DEFAULT OUTPUT /FILE INPUT/OUTPUT ROUTINES: ICHAR, 0 /FILE INPUT VIA (INDEV) CDI L JMP I FILIN /CALL LOWER FIELD JMP I ICHAR FLEN, CLA IAC /CHECK THE FILE LENGTH AND EXP /0=OUTPUT, 1=INPUT CLL RTL /*4 TAD (XLEN DCA CPRNT JMP CPRNT+2 /OFF TO THE LOWER FIELD OCHAR, 0 /FILE OUTPUT VIA (OUTDEV) CDI L JMS I (OCHAR0 JMS I ECODEV /ECHO RETURN JMP I OCHAR /NO-ECHO RETURN EOF, 0 /TRAPS ATTEMPT TO READ BEYOND TAD (XI33 /THE 'END-OF-FILE' CHARACTER DCA INDEV /RESETS POINTERS TO THE TTY: TAD ECODEV DCA OUTDEV TAD CPRNT+1 /AND TURNS ON THE ECHO, TOO DCA IECHO TAD P337 /RETURN A '_' TO CLEAR THE '^Z' JMP I EOF /'EOF' IS ALSO USED BY 'RECOVR' CPRNT, 0 /'PRINTC' FOR DOWN BELOW PRINTC CDI L JMP I CPRNT FBLK, CDF L /READ THE INPUT BLOCK NUMBER TAD I ATSW /SAME PLACE! FL0ATR FIND, FIXIT /CHARACTER SEARCH FUNCTION DCA I TESTC&177 /SAVE IN 'CTEST' JMS I INDEV /READ A CHARACTER DCA CHAR SORTJ /CHECK FOR EOF, MATCH C232-1 FINISH-CTEST TAD CHAR /AND ECHO AS DIRECTED ECHOC JMP FIND+2 /EOF->0, MATCH->CHAR PAGE |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 | /FLOATING POINT PACKAGE FOR U/W-FOCAL *FPUTIPT1 FPNT, 0 /VIA 'FENT' CLA /= PAGE 35 CDF P /RESET DATA FIELD TAD I FPNT SNA JMP I FPNT /EXIT CLL RTL /SHIFT PAGE BITS OVER AND RTL /PUT OPERATION CODE IN 9-11 DCA LSORT TAD LSORT /PAGE 0? SPA CLA TAD FPNT /GET CURRENT PAGE AND P7600 DCA T1 /SAVE PAGE, GET RELATIVE TAD I FPNT AND P177 TAD T1 /MERGE SNL /IS IT INDIRECT? JMP NOTID /NO SNA /IS IT OUT-OF-FIELD? JMP CDFV /YES DCA T1 TAD I T1 /GET THE INDIRECT ADDRESS NOTID, CIA CMA CLL /BACKUP ONE DCA XRT2 /LOAD THE INDEX REGISTER ISZ FPNT /ADVANCE PROGRAM COUNTER TAD LSORT /GET BACK THE INSTRUCTION AND P7 /MASK THE OP CODE SNA JMP FLGT TAD M6 /TEST IT SNA JMP FLPT TAD JUMPX /SOMETHING ELSE DCA LSORT TAD I XRT2 /LOAD THE OPERAND DCA EX1 TAD I XRT2 DCA AC1H TAD I XRT2 DCA AC1L TAD I XRT2 /'DCA OVER' FOR 3-WORD VERSION DCA OVR1 CDF P LSORT, 0 /BRANCH TO THE PROPER ROUTINE SKP CLA /LOWER FIELD COMMAND SCANNER GETC SORTX /SEARCH FOR END OF THE 2ND WORD JMP .-2 SPNOR /SKIP TO THE START OF THE THIRD CIF L JMP I LSORT /NOTE: 'CHAR' PRESERVED BELOW ! CDFV, CDF V /CHANGE TO THE VARIABLES FIELD TAD PT1 /GET THE DATA POINTER JMP NOTID JUMPX, JMP I M6 /BRANCH TABLE FOR 'FPNT' FLAD FLSB FLDV FMPY FLEX M6, -6 FLNR /HERE ARE THE FLOATING POINT OPERATIONS: FLGT, TAD I XRT2 /FGET=0 DCA EXP TAD I XRT2 DCA HORD TAD I XRT2 DCA LORD TAD I XRT2 /'NOP' FOR 3-WORD VERSION DCA OVER JMP FPNT+2 /L=0 FLPT, TAD EXP /FPUT=6 DCA I XRT2 TAD HORD DCA I XRT2 TAD LORD DCA I XRT2 TAD OVER /'JMP FPNT+2' FOR 3-WORD VERSION DCA I XRT2 JMP FPNT+2 /L=1 ///// FLTONE, 1;2000;0;0 /USED BY 'FOR' 'Y' 'FLOG' & 'FSIN' FLEX, PUSHF /FPWR=5 FLAC JMS I FPNT+1 /SAVE FLAC AND MOVE EXPONENT FIXIT /ONLY HANDLES INTEGER POWERS SMA CMA /BUT THEY MAY BE EITHER DCA LSORT /POSITIVE -OR- NEGATIVE! TAD HORD DCA SIGN /SAVE SIGN OF EXPONENT IAC FLOAT /START WITH UNITY NORMALIZE IBLE, POPF /RECALL THE ARGUMENT FLOP TAD (.+4-FPNT-3 /LOAD THE RETURN ADDRESS ISZ SIGN /CHECK THE DIRECTION JMP .+5 JMP I M6-3 /TAKE THE INVERSE (ONCE) PUSHF /SAVE THE RECIPROCAL FLAC JMP IBLE TAD P7 /ADVANCE THE RETURN ISZ LSORT /CHECK THE LOOP COUNT JMP I M6-2 /ACCUMULATE THE PRODUCT JMP FPNT+1 /DONE TAD M4 TAD PDLXR /REUSE THE SAME DATA DCA PDLXR JMP IBLE ///// FMQ, FIXIT /DISPLAY A NUMBER IN THE MQ MQL RETURN /LINC-MODE VERSION IS LONGER ///// IFZERO T-20 < FDAY, FIXIT /READ OR CHANGE THE SYSTEM DATE CIF T JMP DAY > *.!177-6 /BRANCH LIST FOR 'FETCH' ACTION, ENDFI /ESCAPE = RETAIN CURRENT ENDFI /ALTMODE = DITTO READ /BA = RESTART INPUT ACCEPT /FF = IGNORE IT ACCEPT /LF = IGNORE IT ACCEPT /RO = IGNORE IT PAGE /THIS ROUTINE COMBINES THE EXPONENTS FOR MULTIPLY AND /DIVIDE AND DETERMINES THE SIGN OF THE RESULT; IF THE /RESULT IS ZERO IT EXITS IMMEDIATELY. SGNTST, 0 /TEST AND SAVE SIGN OF THE RESULT IAC /ADD ONE TO EXPONENT TAD EXP DCA EXP JMS ABSOLV /TAKE THE ABSOLUTE VALUE TAD SIGN SNA JMP MDXIT+6 /QUICK RETURN AND P4000 /STRIP THE SIGN BIT TAD AC1H /DO AN EXCLUSIVE OR DCA SIGN /AND SAVE THE RESULT SWP DCA ABSOLV /CLEAR & SAVE THE MQ TAD AC1H SZA ISZ SGNTST SPA CLA /TEST SIGN OF OPERAND JMS REVERS /FOR BOTH MULTIPLY AND DIVIDE JMP I SGNTST ///// /THREE-WORD BY THREE-WORD MULTIPLICATION: /THE ANSWER IS ROUNDED OFF TO THREE WORDS / (A+B+C)*(D+E+F) = NINE PARTIAL PRODUCTS FMPY, DCA T1 /SAVE THE RETURN ADDRESS TAD EX1 /ADD THE EXPONENTS (PLUS 1) JMS SGNTST /AND DETERMINE THE SIGN OF RESULT JMP MDONE /THE RESULT IS ZERO! TAD OVER /C*F DCA .+3 TAD OVR1 MQL MUY 0 MQL /SAVE HIGH ORDER & ERASE SIX TAD LORD /B*F DCA .+3 TAD OVR1 SWP MUY /USE PREVIOUS HIGH ORDER AS 0 /REMAINDER IN THIS POSITION TAD P4000 /ROUND UP DCA SGNTST /SAVE FOUR RAL DCA EX1 /SAVE CARRY TAD OVER /C*E DCA .+3 TAD AC1L SWP MUY /ADD IN PREVIOUS 0 /PARTIAL PRODUCT TAD SGNTST /SUM HIGH ORDER PARTS MQL /DISCARD FIVE SZL ISZ EX1 /ACCUMULATE CARRIES TAD HORD /A*F DCA .+3 TAD OVR1 SWP MUY 0 TAD EX1 /BUILD UP THREE DCA EX1 TAD OVER /C*D DCA .+3 TAD AC1H SWP MUY 0 TAD EX1 DCA EX1 /ADD TO THREE JMS I MEND /DO 'B*E', 'A*E', AND 'B*D' SWP MDONE, DCA OVER /SAVE THREE TAD HORD /A*D DCA .+3 TAD AC1H SWP MUY 0 MDXIT, DCA HORD /SAVE ONE SWP DCA LORD /SAVE TWO DVXIT, TAD ABSOLV MQL TAD T1 TAD FPNTP3 /COMPUTE THE RETURN POINT DCA RESOLV NORMALIZE JMP RESOLV+1 /EXIT FROM MULTIPLY / DIVIDE ///// MEND, MPLY /SOFTWARE MULTIPLY AREA P4000, 4000 FPNTP3, FPNT+3 ///// ABSOLV, 0 /TAKE THE ABSOLUTE VALUE TAD HORD DCA SIGN /BUT REMEMBER WHAT IT WAS JMS RESOLV JMP I ABSOLV RESOLV, 0 /RESTORE THE PROPER SIGN TAD SIGN SPA CLA JMS INVERT JMP I RESOLV INVERT, 0 /COMPLEMENT FLAC - 'NEGATE' TAD OVER CLL CIA DCA OVER CML RAL TAD LORD CIA DCA LORD CML RAL TAD HORD CIA DCA HORD JMP I INVERT REVERS, 0 /NEGATE THE OPERAND TAD OVR1 CLL CIA DCA OVR1 CML RAL TAD AC1L CIA DCA AC1L CML RAL TAD AC1H CIA DCA AC1H JMP I REVERS /EAE INSTRUCTIONS: MUY=7405 DVI=7407 NMI=7411 SHL=7413 MQL=7421 SCA=7441 CAM=7621 /THREE-WORD BY THREE-WORD EAE DIVIDE ROUTINE *6766 FLDV, DCA T1 /SAVE THE RETURN POINT TAD EX1 /SUBTRACT THE EXPONENTS CMA /COMPENSATE FOR SHIFT JMS SGNTST ERROR2 /THE DIVISOR IS ZERO! SM3 DCA RESOLV /SET THE COUNTER TAD P13 /'XRT-1' DCA XRT2 /INITIALIZE QUOTIENT POINTER TAD OVR1 CLL RAL DCA OVR1 /SHIFT THE OPERAND TO THE LEFT TAD AC1L RAL DCA AC1L TAD AC1H RAL DCA DVSR /SAVE THE TRIAL DIVISOR JMP DVLP+1 ///// DADJ, DCA LORD /RESTORE THE OVERDRAUGHT STA STL RTL /POINTS TO 'AND EX1' TAD QUOT /REDUCE THE QUOTIENT DCA QUOT TAD OVR1 /NOW ADD IN THE DIVISOR TAD EX1 DCA EX1 /THE LEAST-SIGNIFICANT WORD RAL TAD AC1L TAD OVER DCA OVER RAL TAD DVSR JMP DVCK /CHECK FOR SUCCESS AGAIN ///// DVSB, 0 /MULTIPLY QUOTIENT*DIVISOR SWP /AND SUBTRACT FROM DIVIDEND SNL IAC /ADD IN THE PREVIOUS CARRY MUY QUOT, 0 SWP /GET BITS FOR THIS POSITION CLL CIA TAD I NORM /SUBTRACT FROM THE DIVIDEND DCA I NORM CMA CML TAD NORM /BACKUP AND REVERSE THE LINK DCA NORM JMP I DVSB /CALLED TWELVE TIMES /THIS NORMALIZE ROUTINE WORKS FOR BOTH POSITIVE & NEGATIVE /NUMBERS, PRESERVING THE VALUE OF 'SIGN' FOR USE LATER ON. NORM, 0 /NORMALIZE THE FLAC - 'NORMALIZE' SM0 /=4000 AND HORD DCA XRT2 /SIGN BIT TAD HORD SNA TAD LORD SNA TAD OVER SZA CLA /MANTISSA=0 ? JMP NORGO DCA EXP JMP I NORM /YES NORML, SHIFTL /ONE BIT AT A TIME CMA TAD EXP DCA EXP NORGO, TAD HORD RAL TAD XRT2 /COMPARE SIGN & BIT 1 SMA CLA /ARE THEY DIFFERENT ? JMP NORML /NOT YET SM0 /CHECK FOR 4000 ..... TAD HORD / SNA / TAD OVER SNA CLA JMS I NORM+1 /SHIFT IT BACK A BIT JMP I NORM ///// TAD BUFR DCA AXOUT /SET 'TEXTP' DCA XCT /CONTINUE LINEFEED TAD CCR /START WITH A CR PRINTC TAD I C200 /THEN PRINT A STAR ISZ I DMPSW /PREVENT STUTTERING LFCONT, PRINTC /RETYPE THE INPUT LINE GETC TAD AXIN CIA /THROUGH THE CURRENT POSITION TAD AXOUT SPA CLA JMP LFCONT TAD T3 /CHECK FOR AN EXTRA CHARACTER SPA CLA PRINTC CMA TAD AXIN JMP I CCR /RESET PACKING POINTERS DVLP, DCA I XRT2 /ONLY 2 TIMES: XRT, THEN XRT2!! TAD LORD MQL /LOAD 24 BITS OF THE DIVIDEND TAD HORD DVI /CALLED THREE TIMES DVSR, 0 /THE TRIAL DIVISOR STA /SET TO THE MAXIMUM SNL /DIVIDE CHECK? SWP /GET THE ANSWER DCA QUOT /SAVE THE PARTIAL QUOTIENT DCA EX1 /CLEAR THE GUARD WORD TAD I DADJ+1 /INITIALIZE THE WORD POINTER DCA NORM TAD OVR1 /FORM: DIVIDEND-QUOT*DIVISOR JMS DVSB TAD AC1L JMS DVSB TAD DVSR JMS DVSB JMS DVSB /FINISH PROCESSING DVSR DVCK, TAD LORD /CHECK FOR SUCCESS SNL JMP DADJ /TOO BIG, CORRECT QUOTIENT DCA HORD /SHIFT THE REMAINDER LEFT TAD OVER DCA LORD TAD EX1 /THE 'GUARD WORD' DCA OVER TAD QUOT ISZ I RESOL /CHECK THE LOOP COUNTER JMP DVLP DCA OVER /SAVE THE FULL QUOTIENT TAD XRT2 DCA LORD TAD XRT SMA /CHECK THE 'SIGN' BIT JMP .+5 /OK, SAVE HORD DCA HORD JMS I .+1 /SHIFT RIGHT A BIT SM0 /POINTS TO 'DIV2' TAD HORD /CLEAR THE SIGN BIT DCA HORD JMP I (DVXIT /CONCLUDE EAE DIVIDE PAGE *CLA / FOR 'FLEX' 0 / FLOP -> FLAC TAD EX1 DCA EXP TAD AC1H DCA HORD TAD AC1L DCA LORD TAD OVR1 DCA OVER JMP I CLA ///// ALIGN, 0 /SUBROUTINE TO LINE THINGS UP TAD AC1H /IS THE OPERAND ZERO? SNA CLA JMP I ALIGN /DON'T WASTE ANY TIME TAD HORD /IS FLAC ZERO ? SNA TAD LORD SNA CLA JMP OSHFT /YES, FLOP -> FLAC TAD EX1 /ARE THE EXPONENTS EQUAL? CIA TAD EXP SNA JMP AOK /YES, SO THERE'S NOTHING TO DO DCA CLA TAD CLA /SAVE AND CHECK THE DIFFERENCE SMA CIA /NEGATE FOR LOOPING DCA T1 TAD T1 /CAN THEY BE ALIGNED? ALC, TAD P43 /'P27' FOR 3-WORD VERSION SPA CLA JMP NOWAY /NO, USE THE BIGGEST ONE TAD CLA /YES, WHICH ONE IS BIGGER? SMA JMS DIV1 /FLAC SPA JMS DIV2 /FLOP ISZ T1 JMP .-6 /REPEAT AOK, ISZ ALIGN JMP I ALIGN ///// JMS DIV2 /OPERANDS HAVE THE SAME SIGN JMS DIV1 /SO SHIFT THEM RIGHT ONCE AND RAR TAD DIV2 /ADD THE LEAST-SIGNIFICANT BITS CLA RAL JMP FLNR-1 /THEN ADD THE REST /TURN THE FLOATING ACCUMULATOR INTO A 24-BIT INTEGER WITH /THE LEAST MOST SIGNIFICANT 12 BITS IN THE AC UPON RETURN INTEGER,0 /'FIXIT' TAD P27 JMS FIXER /CONVERT TO A 24-BIT INTEGER DCA OVER /CLEAR THE FRACTION JMS I RESOL CLL /VERY USEFUL! TAD LORD JMP I INTEGER ///// FIXER, 0 /FIX UP A FLOATING POINT NUMBER DCA EX1 /SAVE THE DESIRED BINARY POINT TAD EXP SPA SNA CLA /IS IT GREATER THAN ONE? JMP NOFIX /NO, RETURN ZERO JMS I ABSOL /NECESSARY FOR NEG. VALUES DCA AC1H TAD HORD /IGNORE UNNORMALIZED NUMBERS JMS ALIGN /DO IT... P27, 27 JMP I FIXER /DONE NOFIX, FLOAT /STUFF WITH ZEROS DCA EXP JMP I FIXER ///// *CLA CLL RTL /FOR 'FRA' DIV1, 0 /SHIFT FLOP RIGHT CLA RAR DCA DIV2 TAD AC1H SPA CML RAR DCA AC1H TAD AC1L RAR DCA AC1L TAD OVR1 RAR DCA OVR1 ISZ EX1 JMP I DIV1 JMP I DIV1 ///// FP3, FPNT+3 *SM0 /FOR NORMALIZE, DIVIDE DIV2, 0 /SHIFT FLAC RIGHT CLA CLL TAD HORD SPA CML RAR DCA HORD TAD LORD RAR DCA LORD TAD OVER RAR DCA OVER ISZ EXP JMP I DIV2 JMP I DIV2 ///// REVERS FLSB, JMS I .-1 /FSUB=2 - NEGATE THE OPERAND FLAD, JMS ALIGN /FADD=1 - ALIGN EXPONENTS JMP I FP3 /NOT POSSIBLE SM0 AND HORD /COMPARE SIGNS TAD AC1H SMA CLA JMP AOK+2 /SIMILAR: SHIFT RIGHT ONCE JMS I (DUBLAD FLNR, NORMALIZE /FNOR=7 - CALL NORMALIZE JMP I FP3 ///// *CLA SM1 /FOR 'ASK' AND EAE DIVIDE TERM, 0 /INPUT TERMINATOR NOWAY, SM0 /MISSION IMPOSSIBLE AND EX1 /POINTER FOR EAE DIVIDE TAD EXP /FIND OUT WHO'S BIGGEST SPA CLA TAD EXP /SIGNS DIFFER: TEST 'EXP' SNA TAD CLA /SIGNS EQUAL: CHECK DIFF. SPA CLA OSHFT, JMS CLA /EX1 > EXP JMP I ALIGN /EXP > EX1 PAGE |
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | /UPPER\LOWER CASE SHIFT FOR THE TYPE "" COMMAND -JVZ- / THIS PATCH PROVIDES A WAY FOR UPPER CASE DEVICES TO PRODUCE /LOWER CASE OUTPUT BY USING A 'SHIFT' CHARACTER (A BACKSLASH) /TO TOGGLE BETWEEN UPPER/LOWER CASE. EXAMPLE: T "A\B\C" = AbC /THIS IS USEFUL FOR INSTALLATIONS WITH AN UPPER CASE TERMINAL /WHO WISH TO MAKE FULL USE OF THE PLOTTER ANNOTATION ROUTINES, /OR WHO, PERHAPS, HAVE AN UPPER / LOWER CASE LINEPRINTER. IT /SACRIFICES THE CR QUOTE MATCH, SO ALL QUOTED STRINGS MUST BE /TERMINATED PROPERLY. FIELD 1 CHAR=66 START=177 AGO=1246 TQUOT=1310 TLIST2=1626 TLIST3=1540 PRINTC=4534 *TLIST2+1 "\ /CHOOSE ANYTHING YOU LIKE *TLIST3+1 TSHIFT /TOGGLE THE SHIFT SWITCH *AGO TSTART /CLEAR THE SHIFT SWITCH *TQUOT SHIFT /CHECK FOR A CASE SHIFT *TQUOT+7 JMP I TQUOT /BEFORE PRINTING THE CHAR *3343 /AFTER THE PLOT ROUTINES TSHIFT, TAD TSKIP /TOGGLE THE SHIFT SWITCH AND T10 TSTART, TAD START /= SKP CLA DCA TSKIP JMP I QUOTP T10, SNL-SKP /ISOLATE 'SNL' BIT T40, "`-"@ M340, -"` /= 'SZA' SHIFT, TAD CHAR /GET THE TEXT CHARACTER TAD M340 /SEE IF IT IS SHIFTABLE STL /( ONLY SHIFT 300-337 ) TAD T40 TSKIP, SKP CLA /OR 'SNL CLA' AFTER '\' TAD T40 /CONVERT TO LOWER CASE TAD CHAR PRINTC /PRINT IT JMP I QUOTP QUOTP, TQUOT+1 /LOOP UNTIL CLOSING '"' $ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | U U // W W FFFF OO CCCC AA L U U // W W W = FF O O C AAAA L UUU // WWW F OO CCCC A A LLLL S_ I_ N_ G_ L_ E_ L_ E_ T_ T_ E_ R_ C_ O_ M_ M_ A_ N_ D_ S_ A Ask ["QUERY",X,:,!] . . . . . .Accepts value of X from input device B Break [L1]% . . . . . . . . Exits from a FOR loop, continuing at L1 C Comment . . . . . . . . . . . . . . . .Ignores the rest of the line D Do [G1,G2,G3,etc.]. . . . . Calls a line or a group as a subroutine E Erase [G1]. . . . . . . . . . . .Deletes all or part of the program F For X=E1,[E2,] E3;(commands). . . .Executes line 1+(E3-E1)/E2 times G Goto [L1] . . . . . . . . . . . . . . . . . . . Branches to line L1 H Hesitate [E1]*. . . . . . . . .Delays (or synchronizes) the program I If (E1) [L1,L2,L3]% . . . . . . Transfers to L1,L2,L3 on sign of E1 J Jump (E1) [G1,G2,G3,G4...]% . . Calls the subroutine selected by E1 K Kontrol [E1,E2,etc]*. . . . Controls relays or other digital output L Library/List. . . . . . . . .Two-letter commands, see the next page M Modify [L1,L2]. . . . . . . .Edits and/or Moves line L1 - see below N Next [L1]%. . . . . . Ends a FOR loop, branches to L1 when finished O On (E1) [G1,G2,G3]% . . . . Calls subroutine selected by sign of E1 P Plot [X,Y,L,M]* . . . . . . . Controls an analog or digital plotter Q Quit [L1]%. . . . . . . . . . . Stops program, allows restart at L1 R Return [L1]%. . . . .Exits from a subroutine call, continuing at L1 S Set [E1,E2,E3,etc.] . . . . . . . .Evaluates arithmetic expressions T Type [E1,"TEXT",!,#,:,%,$]. . . . . . Generates alphanumeric output U User. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V View [X,Y,Z]* . . . . . . . . . . Generates graphic output on a CRT W Write [G1,G2,G3,etc.] . . . . . . . .Lists all or part of a program X Xecute. . . . . . . . . . . . . . . . . . . . . . Equivalent to SET Y Yncrement [X,Y-Z] . . . . . . . .Increments or decrements variables Z Zero [X,Y,...]. . . . . . Sets some or all of the variables to zero * Indicates a non-standard (installation dependent) feature % If the line number is omitted (or=0/) no branch will occur En are Arithmetic Expressions - - [] Enclose optional items Ln are Line Numbers from 0/.0/1 to 31.99 - excluding integers Gn are Line or Group Numbers from 0/ to +_31 (0/= next or all) Line numbers .0/1 to .99 refer to lines in the current group Negative or Integer line numbers denote a 'Group' operation Arithmetic expressions may be used as Line or Group numbers A_ R_ I_ T_ H_ M_ E_ T_ I_ C_ O_ P_ E_ R_ A_ T_ O_ R_ S_ ( ) [ ] < > . . . . . . . . . Three equivalent sets of enclosures ' Character value . . . . . . . . ('A) is the value of the letter 'A' ^ Exponentiation. . . . . . . . . Positive or negative integer powers * Multiplication. . . . . . . . . Note especially that multiplication / Division. . . . . . . . . . . . has a higher priority than division - Subtraction or Negation . . . . Example: (to illustrate priorities) + Addition. . . . . . . . . . . . -5^4/3*A=2+1 is 0/-<5^4>/[3*(A=2+1)] = Replacement . . . . . . . . . . May be used anywhere in expressions A_ S_ K_ / T_ Y_ P_ E_ O_ P_ E_ R_ A_ T_ O_ R_ S_ , COMMA or SPACE. . . . . . . .Separates variables and/or expressions ! Carriage return/linefeed. . . Starts a new line for input or output " String delimiter. . . . . . Case shift option uses '\': "A\B\C"=AbC # Return or Clear Screen. . . . . . Used for plotting or overprinting $ Symbol table listing. . . . . . TYPE $4 prints 4 variables per line : Tabulation. . . . . . . ASK :-15 skips over the next 15 characters (:0/ is ignored) TYPE :15 spaces to column 15 if not beyond % Format control. . . . . %3 Produces 3 Digits in an integer format (for output only) %0/.0/4 = 4 Digits using scientific notation (input is unformatted) %5.0/2 = 5 Digits, 2 decimal places maximum Letters (but only one E) are legal numeric input: YES=25E19 ALTMODE or ESCAPE aborts input, with the variable unchanged -< or _ deletes all digits during input -- RUBOUT is ignored M_ O_ D_ I_ F_ Y_ / M_ O_ V_ E_ O_ P_ E_ R_ A_ T_ O_ R_ S_ CTRL/F . . . . . . . . . Aborts the command leaving the line unchanged CTRL/G (bell). . . . . . . . . . . . . .Selects a new search character CTRL/L (does not echo) . . . Searches for next occurrence of character <- or _ (backarrow or underline). . .Deletes all characters to the left RETURN . . . . . . . . . . Terminates the line at the current position LINEFEED . . . . . . . . . .Copies the remainder of the line unchanged RUBOUT/DELETE. . . . . . . Removes the previous character, echos a '\' RUBOUT or DELETE and <- or _ also work during command input LINEFEED retypes the corrected input line for verification |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | M_ I_ S_ C_ E_ L_ L_ A_ N_ E_ O_ U_ S_ C_ O_ M_ M_ A_ N_ D_ S_ O D Output Date. . . . . . .Prints system date in the form DD.MM.YY L E Logical Exit . . . . . . . Returns to the OS/8 keyboard monitor L B Logical Branch L1. . . . .Branches to L1 if -no- input from TTY J Jump L1. . . . . . . . Equivalent to the Logical Branch command D_ I_ R_ E_ C_ T_ O_ R_ Y_ C_ O_ M_ M_ A_ N_ D_ S_ L A,E List All [name][,E]. . .Lists all files after the one specified L O List Only [name]*. . . . .Verifies the existence of one FC file O L Only List [name]*. . . . .Verifies the existence of one DA file L L Library List [name]% . . . .Shows files with the same extension L D Library Delete name [ L1]. . .Removes a name from the directory L Z Library Zero dev:[length]. . Zeros directory using length given E Adding the phrase ',E' will list all of the 'empties' too * Omitting the name lists all files with the same extension % A null extension will list all files having the same name P_ R_ O_ G_ R_ A_ M_ C_ O_ M_ M_ A_ N_ D_ S_ L C Library Call name. . . . . . . . . .Loads a program, then Quits L G Library Gosub name [ G1] . . . .Calls a program as a subroutine L R Library Run name [ L1] . . . . Loads a program and starts at L1 L N Library Name [name]. . . . . . . . . Changes the program header L S Library Save name [ L1]. . . . . . . .Saves the current program [ G1] indicates which line or group will be called by 'L G' [ L1] specifies an error return, except for the L R command I_ N_ P_ U_ T_ / O_ U_ T_ P_ U_ T_ C_ O_ M_ M_ A_ N_ D_ S_ O A Output Abort [E1]. . . . .Terminates output file with length E1 O B Output Buffer. . . . . . .Dumps buffer without closing the file O C Output Close [E1]. . . . Ends output, saves file with length E1 O I,E Open Input [,Echo] . . . . . . . Selects the terminal for input O O Open Output. . . . . . . . . . .Selects the terminal for output O S Output Scope . . . . . . .Selects CRT for output (if available) O I - Open Input name [,E] [ L1] . . Switches input to an OS/8 device O S - Open Second name [,Echo] [ L1] . . .Selects a second input file O O - Open Output name [,Echo] [ L1] . . Initiates OS/8 (file) output O E - Output Everything device [,Echo] . . .Changes error/echo device O R R Open Restart Read [,Echo]. . . . . .Restarts from the beginning O R I Open Resume Input [,Echo] [ L1]. . . . . .Returns to file input O R O Open Resume Output [,Echo] [ L1] . . . . Returns to file output O R S Open Resume Second [,Echo] [ L1] . Returns to second input file The INPUT ECHO sends characters to the current OUTPUT device The OUTPUT ECHO sends characters to the current 'O E' device F_ I_ L_ E_ N_ A_ M_ E_ E_ X_ P_ R_ E_ S_ S_ I_ O_ N_ S_ Device and filenames may be written explicitly: RXA1:, MYSTUF, 0/123.45 Numeric parts can be computed from (expressions): DTA(N):PROG(X).(A+B) Negative values specify single characters: F(-20/1)L(-197,.5,PI)=FILE0/3 An <OS/8 block number> can be substituted for the name: LTA1:<20/*BN+7> Expressions in square brackets indicate the size: TINY[1], <LOC>[SIZE] V_ A_ R_ I_ A_ B_ L_ E_ S_ Variable names may be any length but only the first two characters are stored; the first character may not be an 'F'. Both single and double subscripts are allowed - a subscript of 0/ is assumed if none is given. The variables !,",#,$,% and PI are protected from the ZERO command and do not appear in table dumps. '!' is used for double subscripting and should be set to the number of rows in the array. '#,$,%' are used by FOCAL Statement Functions. The ZVR feature permits non-zero variables to replace any which are zero. This includes FOR loop indices, so use a protected variable if the index runs through zero. Undefined or re- placed variables are automatically set to zero before their first use. F_ O_ C_ A_ L_ S_ T_ A_ T_ E_ M_ E_ N_ T_ F_ U_ N_ C_ T_ I_ O_ N_ S_ F(G1,E1,E2,E3) executes line or group G1 after first setting the vari- bles '#,$,%' to the values of E1,E2,E3 (if any). The function returns with the value of the last arithmetic expression processed by the sub- routine, including line number & subscript evaluations. For example: 8.1 S FSIN(#)/FCOS(#) is the TANGENT function = F(TAN,A) if 'TA' = 8.1 9.1 S FEXP($*FLOG(#)) computes X^Y for any value of Y using F(9.1,X,Y) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | I_ N_ T_ E_ R_ N_ A_ L_ F_ U_ N_ C_ T_ I_ O_ N_ S_ FABS(E1). . . . . . . . Returns the absolute value of the argument FADC(N)*. . . . . .Reads A/D converter channel N (LAB/8e or PDP12) FATN(A) . . . . . .Computes the arctangent of A, result in radians FBLK(). . . . . . . . .OS/8 block number of the current input file FBUF(I,V)*. . . . . . . .Display buffer storage (single-precision) FCOM(I,V) . . . . . . . .Extended data storage in Fields 2 and 4-7 FCOS(A) . . . . . . . . Computes the cosine of A (A is in radians) FCTR(N)*. . . . . . . . Reads a frequency counter using timebase N FDAC(N,V)*. . . . . . .Sets D/A converter channel N to the value V FDAY(MONTH*256+DAY*8+YEAR-78) . . .Reads/Sets the OS/8 system date FDIN(B1,B2,...,Bn)*. . Reads selected bits from the input register FDVM(N,R)*. . . . . .Reads a digital voltmeter, channel N, range R FEXP(E1). . . . . . . . . Base 'e' exponential function |E1|<1420/ FIN() . . . . . .Reads a single character, returns the ASCII value FIND(C) . . . .Searches for code C, returning C if found, 0/ if EOF FITR(E1). . . . . . . . . Returns the integer part of the argument FJOY(I)*. . . . .Places the cursor (joystick) coordinates in XJ,YJ FLEN(I) . . . . File length: I='0/' for 'O'utput, I='1' for 'I'nput FLOG(E1). . . . . . .Natural logarithm of the absolute value of E1 FLS()*. . . . .Returns unsigned value of the Left Switches (PDP12) FMIN(A,B)/FMAX(A,B) . . . .Returns the minimum or maximum argument FMQ(N). . . . . Displays the lower 12 bits of N in the MQ register FOUT(C) . . . . . . .Outputs character code C, returns the value 0/ FRA(I,V). . . . . . Reads or writes in a binary file at location I FRAC(E1). . . . . . . .Returns the fractional part of the argument FRAN(). . . . . . . . . . Pseudo-random number function, range 0/-1 FSAM(N) . . . . . .Samples N channels and stores results in buffer FSGN(E1). . . . . .Returns -1,0/,+1 for E1 negative, zero, positive FSIN(A) . . . . . . . . . Computes the sine of A (A is in radians) FSQT(E1). . . . . . . .Finds the square root using Newton's method FSR()/FRS() . . . .Reads the Switch Register or the Right Switches FSS(N)* . . . . . . . . . .Tests Sense Switch N: -1 = OFF, +1 = ON FTIM(N)*. . . . . . Reads, sets or clears the elapsed time counter FTRG(N)*. . . . . . . .Returns status and clears Schmitt trigger N FTRM() . . . . . . . . . . . . . Returns the last input terminator FXL(N)* . . . . .Tests external level N (PDP12) returning -1 or +1 And others. . . . .There are a total of 36 possible function names Functions indicated by a * are not available in all versions The functions FBLK & FLEN are useful in filename expressions FIN, FOUT, FIND and FTRM use decimal ASCII codes - see below D_ E_ C_ I_ M_ A_ L_ A_ S_ C_ I_ I_ C_ H_ A_ R_ A_ C_ T_ E_ R_ C_ O_ D_ E_ S_ Code Character Code Char Code Char Code Char 128 Ctrl/@ (leader/ 152 Ctrl/X 176 0/ 20/1 I trailer-ignored) 153 Ctrl/Y 177 1 20/2 J 129 Ctrl/A 154 Ctrl/Z (EOF) 178 2 20/3 K 130/ Ctrl/B 155 ESCAPE or 179 3 20/4 L 131 Ctrl/C (OS/8) Ctrl/[ 180 4 20/5 M 132 Ctrl/D 156 Ctrl/\ 181 5 20/6 N 133 Ctrl/E 157 Ctrl/] 182 6 20/7 O 134 Ctrl/F (break) 158 Ctrl/^ 183 7 20/8 P 135 Ctrl/G (BELL) 159 Ctrl/<- 184 8 20/9 Q 136 Ctrl/H (backsp) 160/ SPACE 185 9 210/ R 137 Ctrl/I (TAB) 161 ! 186 : 211 S 138 LINEFEED 162 " 187 ; 212 T 139 Ctrl/K (lineup) 163 # 188 < 213 U 140/ FORMFEED 164 $ 189 = 214 V 141 RETURN 165 % 190/ > 215 W 142 Ctrl/N 166 & 191 ? 216 X 143 Ctrl/O 167 ' (apost) 192 @ 217 Y 144 Ctrl/P 168 ( 193 A 218 Z 145 Ctrl/Q (X-ON) 169 ) 194 B 219 [ 146 Ctrl/R 170/ * 195 C 220/ \ 147 Ctrl/S (X-OFF) 171 + 196 D 221 ] 148 Ctrl/T 172 , (comma) 197 E 222 ^ or ^ 149 Ctrl/U 173 - (minus) 198 F 223 <- or _ 150/ Ctrl/V 174 . (period) 199 G 253 ALTMODE 151 Ctrl/W 175 / 20/0/ H 255 RUBOUT Codes 224-250/ are lower case letters. Codes 0/0/0/-127 are similar to codes 128-255 except that the parity bit has been eliminated. Many keyboards use 'Shift/K/L/M/N/O' for '[','\',']','^' and '<-' A single quote before a character indicates the-value-of: 'A=193 Use 'Ctrl/@' to page the TV display to avoid getting error 12.40 To erase the screen on a Tektronix terminal: S FOUT(27) FOUT(12) To make a copy: S FOUT(27) FOUT(23). Note: FOUT(27) = 'ESCAPE' To make bold letters on a Centronics printer: T :FOUT(14) "text" To set 'Hold Screen' mode (VT50/ terminals): S FOUT(27) FOUT(91) To rubout the last character on the PDP12/LAB8e display FOUT(92) |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | E_ R_ R_ O_ R_ C_ O_ D_ E_ S_ F_ O_ R_ U_ /_ W_ - F_ O_ C_ A_ L_ V_ E_ R_ S_ I_ O_ N_ 4_ / E_ - O_ C_ T_ O_ B_ E_ R_ 1_ 9_ 7_ 8_ CTRL/C returns to OS/8 CTRL/F/P interrupts the program CTRL/S suspends output to the terminal CTRL/Q restarts terminal output (8/A,e only) ? . . . . . . Keyboard interrupt or restart from location 10200 ?0/1.0/3* . . . . . . . . . . . . . . . . .Secondary input file missing ?0/1.11* . . . . . . . . . . . . . . No secondary input file to resume ?0/1.50/ . . . . . . . . . . . . . . . . .Group number greater than 31 ?0/1.93 . . . . .Non-existent line number in a MODIFY or MOVE command ?0/3.10/ . . . .Line called by GO, IF, J, R, Q, L B, or L R is missing ?0/3.30/ . . . . . . . . . . . . . . . . . . . . . . . Illegal command ?0/3.47 . . . Line or group missing in DO, ON, JUMP, L GOSUB or a FSF ?0/4.35 . . . . . . .Bad syntax in a FOR command (missing semicolon?) ?0/6.0/3 . . Illegal use of a function or number: ASK, YNCREMENT, ZERO ?0/6.41 . . . . . . . . . .Too many variables (ZERO unnecessary ones) ?0/7.44 . . . . . . .Operator missing or illegal use of an equal sign ?0/7.67 . . . Variable name begins with 'F' or improper function call ?0/7.76 . . . . . . . . . . . Double operators or an unknown function ?0/8.10/ . . . . . . . . . . . . . . . . . . . Parentheses don't match ?10/.50/ . . . . . . . . . . . . . . . . . . . . . . Program too large ?12.10/ . . . . . . . . . . . .Error detected in the BATCH input file ?12.40/ . . . . Keyboard buffer overflow (eliminated in 8/e versions) ?13.65 . . . . . . . . . . . Insufficient memory for BATCH operation ?14.15 . . . . . . . . . . . . . . . . . . . Display buffer overflow ?14.50/ . . . . . . Bad Sense Switch number on a PDP12 (range is 0/-5) ?14.56 . . . . . . Illegal external sense line (PDP12 range is 0/-11) ?17.22 . . . . . . . . . . . . . . . . . . . . . FRA not initialized ?17.33 . . . . . . . . . . . FRA index too large (exceeds file area) ?17.62 . . . . . . . . . .FRA mode error: only modes 0/,1,2,4 allowed ?18.42 . . . . . . . . . . FCOM index too large: reduce program size ?19.72 . . . . . . . . . . . . . . . . . . . . . . Logarithm of zero ?21.57 . . . . . . . . . . . . . . .Square root of a negative number ?22.65 . . . . . . . . Numeric overflow: too many digits in a string ?23.18 . . . . . . . .OUTPUT ABORT or CLOSE requested too much space ?23.37 . . . Output file overflow: recover with: O O name;O A FLEN() ?23.82* . . . Cannot open output file (file open, too big or no name) ?24.0/5* . . . . . . . . . . . . . . . . . . .No output file to resume ?24.25 . . . . . . . . . . . . . . . . . . . . .Illegal OPEN command ?24.35 . . . . . . . . . . . . . . . . . . . .Illegal RESUME command ?24.40/* . . . . . . .Input file not found (wrong name? wrong device?) ?24.47 . . . . . . . . . . . . . . . . . . .No input file to restart ?24.52* . . . . . . . . . . . . . . . . . . . No input file to resume ?25.0/2 . . Stack overflow: reduce nested subroutines and expressions ?25.60/* . . . . . . . Device does not exist or illegal 2-page handler ?26.0/7 . . . . . . . . . . . . . . . . . . . Illegal LIBRARY command ?26.32 . . . . .File specified is already deleted (wrong extension?) ?26.39 . . . File loaded is not a FOCAL program - better reload UWF! ?26.56 . . . . . . . . .Program requested is missing (wrong device?) ?26.66 . . LIBRARY SAVE error: no name, device full, or no directory ?27.18 . Attempted LIBRARY operation on a device without a directory ?27.75 . . . . . . . . No length specified in a LIBRARY ZERO command ?27.90/ . . . . . . . . . . . . . . . . . . . . . . . . .Zero divisor ?29.25 . . . . . . Cannot use the '<>' construction with OPEN OUTPUT ?29.38 . .Device error (write-lock, bad checksum or illegal request) * Denotes an error from a command with an optional error return -< or _ Indicates EOF detected in input - I/O continues from terminal ?....? TRACE feature: Text enclosed by '?' marks (not inside quotes) is typed during execution to help find the source of an error The value of each expression in a SET command is also printed ?_____ ______________________________________________________ extra ?_____ ______________________________________________________ error ?_____ ______________________________________________________ codes To restart after a MONITOR ERROR 2 (output to a write-locked device): Write-enable it, type .ST 10/0/(CR), then 'L D DEV:' before continuing. * * * * * FOCAL and OS/8 are trademarks of Digital Equipment Corp. Maynard MASS |
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | ERROR CODES FOR U/W-FOCAL VERSION 4E - OCTOBER 1978 ? KEYBOARD INTERRUPT (CTRL/F), OR START FROM LOC 10200 ?01.03* SECONDARY INPUT FILE MISSING ?01.11* NO SECONDARY INPUT FILE TO RESUME ?01.50 GROUP NUMBER GREATER THAN 31 ?01.93 BAD LINE NUMBER IN A 'MODIFY' OR 'MOVE' COMMAND ?03.10 LINE IS MISSING: 'GO','IF','J','R','Q','L B' OR 'L R' ?03.30 ILLEGAL COMMAND ?03.47 MISSING LINE OR GROUP: 'DO','ON','JUMP','L G' OR 'FSF' ?04.35 BAD SYNTAX IN A 'FOR' COMMAND (MISSING SEMICOLON?) ?06.03 ILLEGAL USE OF A FUNCTION OR NUMBER: 'ASK','YNCR','ZERO' ?06.41 TOO MANY VARIABLES ('ZERO' UNNECESSARY ONES) ?07.44 OPERATOR MISSING OR ILLEGAL USE OF AN EQUAL SIGN ?07.67 VARIABLE NAME STARTS WITH 'F', OR IMPROPER FUNCTION CALL ?07.76 DOUBLE OPERATORS OR AN UNKNOWN FUNCTION ?08.10 PARENTHESES DON'T MATCH ?10.50 PROGRAM TOO LARGE ?12.10 ERROR DETECTED IN THE BATCH INPUT FILE ?12.40 KEYBOARD BUFFER OVERFLOW (ELIMINATED IN 8/E VERSIONS) ?13.65 INSUFFICIENT MEMORY FOR BATCH OPERATION ?14.15 DISPLAY BUFFER OVERFLOW ?14.50 BAD SENSE SWITCH NUMBER ON A PDP12 (RANGE IS 0-5) ?14.56 ILLEGAL EXTERNAL SENSE LINE (PDP12 RANGE IS 0-11) ?17.22 'FRA' NOT INITIALIZED ?17.33 'FRA' INDEX TOO LARGE (EXCEEDS FILE AREA) ?17.62 'FRA' MODE ERROR: ONLY MODES 0,1,2,4 ALLOWED ?18.42 'FCOM' INDEX TOO LARGE: REDUCE PROGRAM SIZE ?19.72 LOGARITHM OF ZERO ?21.57 SQUARE ROOT OF A NEGATIVE NUMBER ?22.65 NUMERIC OVERFLOW: TOO MANY DIGITS IN A STRING ?23.18 'OUTPUT ABORT' OR 'CLOSE' REQUESTED TOO MUCH SPACE ?23.37 OUTPUT FILE TOO BIG: RECOVER WITH 'O O ... ;O A FLEN()' ?23.82* CANNOT OPEN OUTPUT FILE (FILE OPEN, TOO BIG OR NO NAME) ?24.05* NO OUTPUT FILE TO RESUME ?24.25 ILLEGAL 'OPEN' COMMAND ?24.35 ILLEGAL 'RESUME' COMMAND ?24.40* INPUT FILE NOT FOUND (WRONG NAME? WRONG DEVICE?) ?24.47 NO INPUT FILE TO RESTART ?24.52* NO INPUT FILE TO RESUME ?25.02 STACK OVERFLOW: REDUCE NESTED SUBROUTINES AND EXPRESSIONS ?25.60* DEVICE DOES NOT EXIST OR ILLEGAL 2-PAGE HANDLER ?26.07 ILLEGAL 'LIBRARY' COMMAND ?26.32* FILE SPECIFIED IS ALREADY DELETED (WRONG EXTENSION?) ?26.39 FILE LOADED IS NOT A FOCAL PROGRAM - BETTER RELOAD UWF! ?26.56 PROGRAM REQUESTED IS MISSING (WRONG DEVICE?) ?26.66 'SAVE' ERROR: NO NAME OR DEVICE FULL ?27.18 'LIBRARY' OPERATION ON A DEVICE WITHOUT A DIRECTORY ?27.75 NO LENGTH SPECIFIED IN A 'LIBRARY ZERO' COMMAND ?27.90 ZERO DIVISOR ?29.25 CANNOT USE THE '<>' CONSTRUCTION WITH 'OPEN OUTPUT' ?29.38 DEVICE ERROR (WRITE-LOCK, BAD CHECKSUM OR ILLEGAL CALL) _ INPUT FILE IS EXHAUSTED - I/O CONTINUES FROM TERMINAL * ERROR OCCURS IN A COMMAND WITH AN OPTIONAL ERROR RETURN |
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | / PATCH TO 'FCOM' TO ADDRESS FIELDS 4,5 -JVZ- /THIS PATCH MODIFIES THE 'INDEX' ROUTINE SO THAT POSITIVE /INDICES FROM 0-2047 MAY BE USED TO ADDRESS ALL LOCATIONS /IN FIELDS 4 & 5. THE 'NEGATIVE INDEX' FEATURE HAS BEEN /ELIMINATED: ONLY FLOATING-POINT STORAGE IS AVAILABLE. /THE CHANGES ARE CONSTRUCTED SO THAT THEY DO NOT INTER- /FERE WITH 'FRA' WHICH ALSO USES SOME 'FCOM' ROUTINES. XRT=14 PUT=4410 GET=4423 INDEX=4437 POPA=4521 ERROR2=4576 FIELD 0 *45 6264 /'24K' FIELD 1 *PUT-1 NOP /ELIMINATE THE 'NEG.' RETURN *GET CDF 40 /USE THIS LOC. FOR A CONSTANT JMS INDEX /AND MOVE THIS DOWN ONE *INDEX+1 POPA /EXAMINE THE ARGUMENT SPA /CHECK FOR STORAGE LIMIT JMP .+10 /KEEP THE SAME ERROR CODE CLL RTL /MULTIPLY THE INDEX BY 4 SZA /LEAVING THE FIELD INFO CIA /IN THE LINK CMA /SUBTRACT ONE DCA XRT /AND SAVE THE INDEX RTL /SHIFT THE FIELD BIT OVER SKP ERROR2 /INDEX GREATER THAN 2047(10) RTL TAD GET /ADD THE 'CDF' INSTRUCTION DCA .+1 CDF 40-50 JMP I INDEX /DF AND XRT ARE BOTH SET $ |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | / PATCH TO 'FCOM' TO ADDRESS FIELDS 4-7 -JVZ- /THIS PATCH MODIFIES THE 'INDEX' ROUTINE SO THAT POSITIVE /INDICES FROM 0-4095 MAY BE USED TO ADDRESS ALL LOCATIONS /IN FIELDS 4-7. THE 'NEGATIVE INDEX' FEATURE HAS BEEN /ELIMINATED: ONLY FLOATING-POINT STORAGE IS AVAILABLE. /THE CHANGES ARE CONSTRUCTED SO THAT THEY DO NOT INTER- /FERE WITH 'FRA' WHICH ALSO USES SOME 'FCOM' ROUTINES. XRT=14 PUT=4410 GET=4423 INDEX=4437 POPA=4521 ERROR2=4576 FIELD 0 *45 6362 /'32K' FIELD 1 *PUT-1 NOP /ELIMINATE THE 'NEG.' RETURN *GET CDF 40 /USE THIS LOC. FOR A CONSTANT JMS INDEX /AND MOVE THIS DOWN ONE *INDEX+1 POPA /EXAMINE THE ARGUMENT CLL RTL /MULTIPLY THE INDEX BY 4 DCA XRT /LEAVING THE FIELD INFO IAC /IN BIT 11 AND THE LINK AND XRT RTL /SHIFT THE FIELD BITS OVER RTL TAD GET /ADD THE 'CDF' INSTRUCTION DCA .+6 /AND SAVE FOR LATER CMA CLL RAL /=7776 AND XRT /CLEAN UP THE INDEX CIA CMA /SUBTRACT ONE DCA XRT /AND PUT IT RIGHT BACK CDF 40-70 JMP I INDEX /DF AND XRT ARE BOTH SET $ |
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | .R UWF *L R HEADER DEVICE NAME? SYS or SYS: or DSK or RKB1 or RXA1: etc. DEVICE LENGTH? 737 or 3248 or 494 or (incl. directory blocks) if the device contains a system area the following applies: SYSTEM ID? OS/8, OS/12, OS/78, DS/8, PS/8, ETOS/8, MULTI/8,. VERSION NO.? 3 or whatever RELEASE CODE? C or D or ...... if there is no system area the questions above are skipped LOGICAL DEVICE NAME? CHEM or BOB: or UWF or ?? (1-4 letters) VOLUME NO.? 1 or any number up to 4095; 0 = none DESCRIPTIVE LABEL? Here you may enter any identifying information - up to 128 characters, including CR/LF, Upper/lower case, etc. Use CTRL/Z to terminate. The MQ displays the character count +128. Rubbout and linefeed work after a fashion. (^Z) *L E .R DIRECT or DIR DEV:/H *DEV:/H$ This will list the header information you have just written. |
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /INTERNAL LP08 LPT: HANDLER FOR UWF-4E -JVZ- / THIS HANDLER ALLOWS OUTPUT ON A LINEPRINTER WITHOUT /SACRIFICING THE OS/8 FILE OUTPUT CAPABILITY FOR THIS /PURPOSE. THIS VERSION WILL NOT WORK WITH THE LATER /KL8E-STYLE INTERFACE SINCE IT TAKES ADVANTAGE OF THE /'6667' INSTRUCTION TO PREVENT INTERRUPTS. THE ECHO /OPTION MAY BE SPECIFIED IN THE USUAL WAY TO CREATE A /COPY OF THE OUTPUT ON THE TERMINAL. IT IS ALSO POS- /SIBLE TO MAKE THE LPT: THE DEFAULT OUTPUT DEVICE SO /THAT ERROR MESSAGES, ECHOING FROM AN OS/8 FILE, ETC. /WILL APPEAR ON THE LINEPRINTER RATHER THAN ON THE /TERMINAL. THIS IS SPECIFIED BY THE 'O E' ('OUTPUT /EVERYTHING'!) COMMAND: 'O E LPT:'. IF YOU SPECIFY /THE ECHO OPTION IN -THIS- COMMAND YOU WILL GET -3- /COPIES OF THE OUTPUT! 1) ORIGINAL TO THE OS/8 FILE; /2) A COPY ON THE LPT: AND 3) A COPY ON THE TERMINAL! FIELD 1 *14555 /BEFORE 'FEXP' LPT, 0 /ENTRY POINT 6666 6661 /DONE? JMP .-1 ECKO /OR '0000' CLA CLL JMP I LPT ECKO= JMS I . XOUTL *13133 6667 /OR 6665 /BANISH INTERRUPTS IFDEF V <IFZERO V <*31;314>> /12K PATCH TO 'FIRSTV' FIELD 0 *272 LPTDEV, LPT /THE ENTRY POINT DEVICE LPT /THE DEVICE NAME LPTCHK=. *304 CDF 10 / NOW ADD THE ECHO CHECK: ISZ GOSW /'GOSW' IS SET BY 'GTNAME' TAD .+4 /'ECHO' WAS SPECIFIED DCA I .+4 / NO ECHO = 0000 TAD LPTDEV /RETURN WITH THE ENTRY POINT JMP I LPTCHK ECKO /='JMS I (XOUTL' LPT+4 /'LPT:' ECHO LOCATION / DEFINITIONS: GOSW=36 XOUTL=3021 $ = $ = $ |
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | NOTE1.TX INSTRUCTIONS FOR PGMS ON THIS TAPE U/W-FOCAL VERSION 4-E FOR 16-32K PDP8I OR PDP12 REQUIRES AT LEAST 16K AND EAE FPP IS NOT REQUIRED TO COMPILE UWF16K.BN, RUN PAL8.SV AND: *UWF.BN<16KCPR.PA,12KFNS.PA,8XFIO.PA,8XFPP.PA,16KLIB.PA/K/L=100$ ALL OTHER .PA FILES GET ASSEMBLED INDIVIDUALLY AND ARE USED AS OVERLAYS FOR UWF16K.BN LPT8I.PA PROVIDES AN INTERNAL LINE PRINTER HANDLER AT LEAST IN THE 32K CONFIGURATION FCOM45.PA MAKES FCOM USE FIELDS 4-5 FCOM47.PA MAKES FCOM USE FIELDS 4-7 BSLASH.PA MODIFIES THE OPERATION OF 16MPLT.PA 16MPLT.PA RUNS THE INCREMENTAL PLOTTER F32K4E.SV IS AN .SV FILE FOR THE PDP12 32KXII OVERLAYS UWF16K.BN FOR A 32K PDP12 16KXII OVERLAYS UWF16K.BN FOR A 16K PDP12 IF UWF.BN IS LOADED WITHOUT EITHER OVERLAY, IT RUNS IN THE PDP8I STARTING ADDRESS = 100 IN FIELD 0 IN 16KXII AND 32KXII, AN I/O-PRESET HAS BEEN ADDED AT LOC 5400 ALSO THE FLAG CLEAR INSTRUCTIONS AT LOCATIONS 13111-13126 HAVE BEEN CHANGED AND MAY HAVE TO BE MODIFIED TO CLEAR RECURRENT FLAGS THAT GET SET IN YOUR SYSTEM NOTE THAT THE JMP INSTRUCTION IS ALTERED IN VERSION 4E IT NOW WORKS AS A SUBROUTINE CALL (DO COMMAND) PREVIOUSLY IT WORKED AS A JUMP (OR GO TO) COMMAND HENCE ALL PGMS USING THE JMP COMMAND MUST BE ALTERED BEFORE USE OF FOCAL VERSION 4E SEE VERSION 4E RELEASE NOTES FOR A FURTHER DISCUSSION OF CHANGES IN THE JMP COMMAND / /YOUR USE OF U/W-FOCAL MAY CONSTITUTE A VIOLAION OF /VANZEE'S PATENT RIGHTS /THEREFORE DO NOT CONTACT HIM FOR ASSISTANCE /IN USING U/W-FOCAL |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | NOTE2.TX INSTRUCTION BOOKS FOR U/W-FOCAL THERE IS NO INSTRUCTION BOOK FOR OS/8-U/W-FOCAL VERSION 4-E 'U/W-FOCAL' IS A 10-PAGE INTRODUCTION TO FOCAL'S CAPABILITIES 'INTRODUCTION TO U/W FOCAL FOR THE PDP/8' IS A 77 PAGE MANUAL FOR STAND ALONE (PAPER TAPE) U/W-FOCAL VERSION 4-E. IT PROVIDES THE THE BEST AVAILABLE DESCRIPTION OF MANY FOCAL MATH OPERATIONS 'INTRODUCTION TO U/W-FOCAL' IS A 44-PAGE MANUAL FOR STAND ALONE PAPER TAPE) FOCAL VERSION 4-C. IT IS MOSTLY REDUNDANT WITH THE VERSION 4-E MANUAL 'U/W-FOCAL' IS A 98-PAGE MANUAL COMPLETELY DESCRIBING OS/8 U/W-FOCAL VERSION 4-C. IT DESCRIBES ALL FEATURES OF OS/8 FOCAL VERSION 4-C. SOME OF THESE DESCRIPTIONS DO NOT APPLY TO VERSION 4-E 'VERSION 4-E RELEASE NOTES' AMEND THE OS/8 FOCAL MANUAL. XXXXXX.FC PROGRAMS DEMONSTRATE THE USE OF FOCAL .FC PGMS DATED 9/15/70 ARE FOR U/W-FOCAL VERSION 4C .FC PGMS DATED 10/15/70 ARE FOR U/W-FOCAL VERSION 4E IF ALL ELSE FAILS, CONSULT PGM LISTINGS TO DETERMINE WHICH FUNCTIONS ARE IMPLEMENTED IN THE VERSION THAT YOU ARE USING |
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | # U/W FOCAL FOCAL, the FORmula CALculator was an early interpreted language, pioneered on the PDP-8. We have a historically accurate FOCAL69 package elsewhere. The University of Washington extended FOCAL significantly. This package is the latest version found of that work, U/W FOCAL. Upstream is a [linctape image on Dave Gesswein's Archive Site][uwf-linc] Unfortunately the archive is incomplete. Assembly instructions found in 16KCPR.PA, say: / UWF.BN<16KCPR,12KFNS,8KFIO,8KFPP,16KLIB/L/K=100 / EAE VERSION: 8XFIO,8XFPP The non-EAE versions of FIO and FPP have been lost. The assembly, load, and save lines used are: UWF16K.BN<16KCPR.PA,12KFNS.PA,8XFIO.PA,8XFPP.PA,16KLIB.PA/K LOAD RKA1:UWF16K.BN SAVE RKA1:UWF16K.SV;100 ## Documentation `CARD1.DA`, `CARD2.DA`, `CARD3.DA`, and `CARD4.DA` are reference card text files suitable for display under OS/8. They have been unpacked and reformatted into this tree as `doc/uwfocal-refcards.md`. The Latest version of the U/W FOCAL V4E manual was found on [archive.org][archive], unpacked, and reformatted into this tree as `doc/uwfocalmanual.md`. Additional explanations of how to use U/W FOCAL under SIMH have been crafted into `doc/uwfocal-manual-supp.md`. ## Notes As of this date, every version of FOCAL I've tried can't accept paste-in from other windows. The characters come in too fast and overrun the input buffer. I do not like U/W FOCAL's approach to program load and save. However this archive should build, run, and allow overlays following instructions in NOTE1.TX, NOTE2.TX. [uwf-linc]: http://www.pdp8online.com/pdp8cgi/os8_html?act=dir;fn=linctape-images/os8l/uw_focal_4e.linc;sort=name [archive]: https://archive.org/details/bitsavers_decpdp8focct78_4144912/mode/2up |
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
cannot compute difference between binary files
> > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # This patch is called from inside the script that build U/W FOCAL. # So it modifies the UWF16K.SV file on RKA1 where it is built. # The following patch fixes a problem if U/W FOCAL is started # after another program has left the EAE in Mode B. # For example, the FORTRAN IV runtime system ALWAYS does this! # At location 5400 is a block of 20 Zeroes that apparently # get populated with code to "CLEAR ANNOYING FLAGS". # This seems a fit for that need. # I expect device overlays would fill that in. # The U/W FOCAL build we have at the moment has no such overlays. # So we grab the first location and put in the following contents: # 7447 SWBA /SET MODE B # 7000 NOP /PREVIOUS INSTRUCTION IS DVI ON 8/I # 7621 CAM /CLEAR AC MQ AFTER DVI. .GET RKA1 UWF16K.SV .ODT 05400/0000 7447 05401/0000 7000 05402/0000 7621 \c .SAVE RKA1 UWF16K.SV |
> > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 | 0UI GZ J 1A-^^R"N ET&512"N :ERSYS:VTEDIT.TECUXQX"S YHXI HK YHK ^UXMI 1UI ' QX"F[SYS:VTEDIT.TEC not found] ' '' HK 0UX QI |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | # Introduction to Using TECO / VTEDIT on OS/8 ## by Rick Murphy (ed. by Warren Young) To edit a file with TECO or VTEDIT, just use the ".TECO file" command. If you have a date set, even an incorrect one due to OS/8's inability to handle post-Y2K dates, then the CCL will remember the last file edited so you can just type "TECO" to re-edit. VTEDIT for OS/8 uses the following keypad layout: +-------+-------+-------+-------+ | "PF1" | "PF2" | "PF3" | "PF4" | | Save | TECO* | Paste | | ^D Kill rest of line* | Text+*|command| text | | +-------+-------+-------+-------+ All (*) | "7" | "8" | "9" | "-" | commands | Open | Page* | Mark/ | Search| ^K Kill line+* take opt | line* | | quote*| arg * | arg as: +-------+-------+-------+-------+ ESC [-] | "4" | "5" | "6" | "," | <digits> | Up | Delete|Delete/| End of| ^U Kill start of line <key(s)> | Line* | char* |restore| line *| +-------+-------+-------+-------+ All (+) | "1" | "2" | "3" |"Enter"| commands | Top of|Bottom | Start | | operate | page+*|of page|of line| Search| from Dot +-------+-------+-------| arg * | BK SP Go to end of line* to Mark | "0" | "." | | DELETE Delete previous* if Mark | Down line* |Search | | ESC ESC Repeat RED cmd* is set | |again *| | +-------+-------+-------+-------+ To Exit: ^C [or] ^Z Return to TECO ESC ^Z Exit from TECO ESC - ^Z Kill output, exit You may note differences if you compare this to other flavors of VTEDIT, owing to the fact that OS/8 VTEDIT is not derived from the lastest version of VTEDIT. The next section comes from the authors of the VT52 version of VTEDIT. The keypad colors it talks about refer to the VT52 keyboard. # Video Terminal Editor for TECO-8 ## Originally written by Herb Jacobs & Mark Bramhall, modified by Jim Roth & Stan Rabinowitz This macro provides immediate mode support for the VT52 and VT100 video terminals (updates occur as they are entered). This macro makes editing with the VT52 extremely easy and accurate, but will initially take some editing to get used to. This macro is very complete and allows for almost any editing situation. VTEDIT.TEC resides in q-register I. It may be loaded by ERVTEDIT.TEC$YHXIHK$$. Whenever TECO will accept a command, MI$$ is used to enter VTEDIT. A user can automatically cause VTEDIT to be loaded into Q-register I by putting the appropriate commands into his initialization file, TECO.INI. Any characters typed to VTEDIT are immediately put into the text buffer at the current position of the text pointer, except for the single character commands described below. Because the typed text is immediately displayed in the text buffer VTEDIT stops terminal echo. VTEDIT uses all of the numeric Q-registers. Because of this, users must not use Q-registers 0-9 while editing with VTEDIT. The commands for VTEDIT.TEC are: (named character commands are not on the keypad) Keypad Teco Character equivalent Description -> C Move text pointer forward 1 character <- R Move text pointer backward 1 character 0 L Move text pointer down 1 line 1 0J Move text pointer to begining of text 2 ZJ Move text pointer to end of text 3 0L Move text pointer to begining of current line 4 -L Move text pointer up 1 line 5 D Delete 1 character following the text pointer 6 Deletes string most recently found via a search, search again, cut, or paste operation 7 Insert 1 blank line and position before it; esthetically pleasing for inserting text lines 8 P Perform 1 page command 9 Read the next input character literally, not as a command Delete -D Delete 1 previous character Backspace L2R Position text pointer at the end of the line Control-U 0K Delete the text from the begining of the line to the text pointer Control-K K Delete the text from the text pointer to the end of the line. Control-D Removes the text from the text pointer to the end of the line. Control-C Exit from this macro to normal TECO mode The macro is started again by MI$$ Control-Z Same as Control-C ENTER Accept a new search argument to be used in conjunction with the keypad '.' key. This argument may be edited with DELETE and Ctrl-U and is terminated with the keypad '.' key (or $$) which performs the search. The search string may not end with an altmode, but may have embedded altmodes. . Search for next occurence of ENTERed argument If search fails, text pointer is moved to top of page ^(uparrow) Move the text pointer up 1 line to the same column v(downarrow) Move the text pointer down 1 line to the same column blue key Save 1 line of text for moving, each successive key strike adds another line to the movable portion; the first line saved is from the cursor to the end of line grey key Retrieve saved text (from blue key) at current text pointer position red key Enter extended command mode Extended command mode allows any TECO command to be executed directly while remaining in VTEDIT. The text buffer is not affected except as the possible result of the executed TECO command. The TECO command to be executed is displayed at the top of the VTEDIT screen and allowed to be edited with the following commands: Control-U Abort extended command mode, return to normal insert mode. Nothing is executed. Delete Delete previous character entered. Escape Escape Execute the command just typed and then return to normal insert mode. Commands are executed with the text pointer at its last position in normal insert mode. If the command causes an error, VTEDIT has to be continued by executing MI$$ . Executing another macro is O.K. as long as it doesn't destroy any of the numeric Q-registers. A numeric argument (of the form ESC number) may precede the following commands: Paste, open line, page, quote, up, down, left, right, up line, down line, delete char, search. This argument makes the obvious modification to the command. The "up line" and "down line" keys (keypad keys 4 and 0 respectively) are much faster than the "up in column" and "down in column" keys (up-arrow and down-arrow keys). Consequently, when scanning through a portion of a file, the "up line" and "down line" functions are preferred. Note that TECO maintains a type-ahead buffer. It is possible for you to type faster than VTEDIT can update the screen. In such a case, VTEDIT will not lose your type-in, however, it will stop updating the screen (to save time) until it has finished processing all the commands that you have typed in. |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | !VTEDIT - V00.00-8! @^U0/32,0ET U7 0,32ET/ 128,0ETETU0 0,2048+32+8ET @^U5/U9283Q9"G[|-Q9U9'Q9/!Hack! @^U6/.U8 ZU4 -3U6 HM5 13 KM5 10 KM5 13 :G4 < M0 !F! Q7-127"NQ7' ZJ Q7I Q7-13"E 10I 10U7 Q7' Q7-10"E 13 KM5 -1%6' Q7-21"E Q6W 0U7 0;' Q7-127"E -D Z-Q4"N -1AU9 -D Q9-27"E 32U9' Q9-31"G DM5 KM5 1+' 0"E 13 -Q6-2< KM5 AM5 > 10 13 :G4 Q4,ZT' '' Q7-27"E M0 Q7-27"E !F0! 27I Q4,ZX4 HM5 13 -1U7 0;' Q7-["E OU7' Q7-O"E M0 OF0' OF' > Q4,ZK Q8J Q7/ 0,0X7 0,0X9 0U2 HM5 13 -=M5 <!A! 0U4 0U6 !B! 1U5 U7 Q7"L -1W M0 ' !V! Q7-127"E .-Q5"L .U5' -Q5D OA' Q7-31"G Q7I 0U2 OA' Q7-26"E 0;' Q7-21"E 0K OA' Q7-11"E Q5K OA' Q7-8"E Q5L .-1"G 2R' OA' Q7-4"E Q5K 13I 10I 2R OA' Q7-3"E 0;' Q7-27"N Q7I Q7-13"E10I' OA' M0 Q7-["E OU7' Q7-O"E M0 Q7-1"E 0J M0 OA' Q7-4"E L2R M0 OA' Q7-5"E -20L M0 OA' Q7-6"E 20L M0 OA' Q7-C"E Z-.-Q5"L Z-.U5' Q5C OA' Q7-D"E .-Q5"L .U5' Q5R OA' Q7-p"E Q5L OA' Q7-q"E Q5-1"E 0U5' Q5J OA' Q7-r"E ZJ OA' Q7-s"E 0L OA' Q7-t"E -Q5L OA' Q7-u"E Z-.-Q5"L Z-.U5' Q5D OA' Q7-v"E .-Q2"L0,.X30,.K OA' .-Q2,.X3 .-Q2,.K OA' Q7-w"E Q5< 13I 10I 2R > OA' Q7-x"E Q5P OA' Q7-y"E Q5-1"E M0Q7U5' Q5I OA' Q7-M"E ISearch: .-8,.X4-8D M6"F OA'.U3 I@:S 0I.U2 G4-2D .-Q2U1 0I Q3,.X8 Q3,.K OS' Q7-n"E 0U6 !S!Q1U2 Q5M8"F0U2' Q6"N Q6W' OA' 0U8 Q7-A"E -1U8' Q7-B"E 1U8' Q8"N Q8"L -Q5U5' Q6"E 0U7 .U8 0L Q8-.%6< 0A-32"L 0A-27"N 0A-9"E 6-(Q7&7)%6 -2U7' %7 1%6'' C %7 >' Q5L -Q6U9 0U7 Q6< .-Z; 0A-32"L 0A-13"E 0;' 0A-27"N 0A-9"E 6-(Q7&7)%9 -2U7' %7 1%9'' C %7 1%9"G R' Q9; > 0U4 OB' Q7-Q"EICommand: .-9,.X4-9DM6"F OA' .U3 G4 Q3,.X9Q3,.K Working...OC' Q7-R"E .U4 G7 .-Q4U2 OA' Q7-P"E Q4 "E .+1U4' Q5L Q4-1,.X7 .-Q4+1U2 0U6 OB' OA ' Q7"D0U5<!X!Q5*10+Q7-48U5 M0 Q7"D OX ' 0;>OV' Q7-27"E 0U6 !C! M9 -1EU Q6"N Q6W' OA' > ->M5 2M5 4;1H KM5 13 Q0ET !Z! !Q-reg Text Numeric 0 read char holds initial ET setting 1 length of last search string 2 length of last string gotten 3 deleted string temp 4 arg to M6 cut buffer start 5 prints esc seq repeat count 6 mini editor # of lines destroyed at top 7 cut buffer current char 8 search command temp 9 arg to M5 Hacks: ESCAPE is sent literally to the terminal via the 27+256^T command which fakes out TECO into sending the character literally. This avoids the necessity of doing a 0,1ET command which will swap in an overlay on 16K machines. Macro M0 is used to read a character and wait until it is available even though read with no wait is enabled. To temporarily turn off read with no wait via the 32,0ET command would require swapping in an overlay on 16K machines. Note that the current algorithm is terribly inefficient on systems where OS/8 is running under timesharing. In such a case, OS/8 should be run in a 20K partition and macro 0 should be initialized to 32,0ET ^TU7 0,32ET ! |
1 2 3 | #!/bin/bash srcdir=`pwd` ( cd ~/src/autosetup/master && git pull > /dev/null && ./autosetup --install=$srcdir ) || exit 1 | > | | | 1 2 3 4 5 6 7 | #!/bin/bash srcdir=`pwd` rm -f autosetup/* ( cd ~/src/autosetup/master && git pull > /dev/null && ./autosetup --install=$srcdir ) || exit 1 chmod -x $(fossil changes --meta autosetup) auto.def fossil rm --hard $(fossil changes --missing autosetup) fossil add autosetup/* |
1 2 3 | #!/bin/bash # bosi - The Binary OS Image creation/update script # | | | 1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash # bosi - The Binary OS Image creation/update script # # Copyright © 2016-2021 by Warren Young # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to |
︙ | ︙ | |||
29 30 31 32 33 34 35 | # Display the usage message function usage() { cat <<USAGE usage: $0 <verb> [tag] | | | | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | # Display the usage message function usage() { cat <<USAGE usage: $0 <verb> [tag] The available verbs are init, build, prepare, image, and finish. You may include a tag parameter with the 'image' and 'finish' verbs to override the default tag ('ils') used in image and zip file outputs. See RELEASE-PROCESS.md for more info. USAGE exit 1 } verb="$1" tag="$2" test -n "$verb" || usage test -z "$tag" && tag=ils nu=pidp8i nh=/home/$nu repo=pidp8i dldir="$HOME/tangentsoft.com/dl" os=buster-lite img=$dldir/pidp8i-$(date +%Y.%m.%d)-$tag-$os.img greadlink=$(type -p greadlink || type -p readlink) this=$($greadlink -f $0) topdir="$($greadlink -f "$(dirname "$this")"/..)" # Give user a few seconds to read the final messages before rebooting or |
︙ | ︙ | |||
84 85 86 87 88 89 90 | echo exit 1 fi set -x apt-get update && apt-get -y upgrade || true | < | < < < < < < < < < < | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | echo exit 1 fi set -x apt-get update && apt-get -y upgrade || true apt-get -y install fossil python3-pip python3-pexpect python3-yaml || true test -f /usr/include/curses.h || apt-get -y install libncurses-dev if [ ! -e "$nh" ] then # First pass on a clean SD card: rename 'pi' user and group to # 'pidp8i' and rename its home directory to match. pkill -u pi usermod -l $nu -d $nh -m pi groupmod -n $nu pi |
︙ | ︙ | |||
126 127 128 129 130 131 132 | fi set -x if [ ! -d museum ] then mkdir -p museum $repo | | > > > > > > > > > > > > > > > | 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | fi set -x if [ ! -d museum ] then mkdir -p museum $repo fossil clone -u https://tangentsoft.com/$repo museum/$repo.fossil fi cd $repo if [ -r ChangeLog.md ] then fossil revert # just in case fossil update release else fossil open ~/museum/$repo.fossil release fossil set autosync pullonly ./configure fi # The NLS build can reuse the ILS build's OS/8 images, saving a huge # amount of build time. if [ "$tag" = "nls" ] then for f in '' '-dist' '-patched' do for g in ock v3d do src="${g}${f}.rk05" dst="bin/${g}${f}.rk05" test -r bin/v3d.rk05 || fossil uv export "$src" "$dst" done done fi tools/mmake bin/teco-pi-demo -b # test and benchmark simulator sudo make install || true # don't care about return code do_wait "Rebooting" sudo reboot } |
︙ | ︙ | |||
163 164 165 166 167 168 169 | fi set -x history -c ; rm -f ~/.bash_history pidp8i stop || true # avoid sim hogging CPU | < > > < < < < < | < | | < < | < < < < < < < < < < | < | < < | < < < < < < < < < < < < < < < < < | | 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | fi set -x history -c ; rm -f ~/.bash_history pidp8i stop || true # avoid sim hogging CPU sudo shred -u /etc/ssh/*key* || true # allow multiple passes sudo touch /boot/ssh # enable sshd on 1st boot... # & regen keys just nuked sudo dphys-swapfile uninstall || true sudo dd if=/dev/zero of=/junk bs=1M || true # it *will* error-out! sudo rm -f /junk cl=/boot/cmdline.txt if ! grep -Fq ' init=' $cl then sudo sed -i -e 's#$# init=/usr/lib/raspi-config/init_resize.sh#' $cl fi # Schedule an automatic shutdown using the existing sudo creds so # the next step can invalidate them without requiring a re-reset. /usr/sbin/shutdown -h +1 # Must be last, else later "sudo" will fail on the expired password echo 'pidp8i:edsonDeCastro1968' | sudo chpasswd && sudo passwd -e pidp8i } # This script images the OS SD card in a USB reader on a macOS box. function do_image() { dev=UNKNOWN ps=UNKNOWN hb=no rp=UNKNOWN while read line |
︙ | ︙ | |||
282 283 284 285 286 287 288 | echo "-------------------------------------------------------" diskutil info "$dev" echo "-------------------------------------------------------" echo read -p "Is that the OS SD card? [y/N]: " answer case $answer in [Yy]*) ;; | | | | > | | < | 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 | echo "-------------------------------------------------------" diskutil info "$dev" echo "-------------------------------------------------------" echo read -p "Is that the OS SD card? [y/N]: " answer case $answer in [Yy]*) ;; *) exit 1 ;; esac rdev=${dev/disk/rdisk} # speeds zeroing and re-imaging mf=/tmp/MANIFEST.txt readme=/tmp/README.md cp "$topdir/doc/OS-images.md" $readme set -x sudo diskutil unmountDisk $dev # it auto-mounted time sudo dd if=$rdev bs=1m of=$img sum=($(shasum -a 256 "$img")) bytes=($(wc -c $img)) cat > $mf <<MF SHA-256 hash and size of ${sum[1]}: Hash: ${sum[0]} Size: ${bytes[0]} MF imgdir="$(dirname "$img")" sed -i '' -e "s_$imgdir/__" "$mf" # nix local paths in manifest unix2dos $mf # might be opened on Windows time zip -9j $img.zip $img $mf $readme rm -f $mf $readme # Now re-image the card, starting with a zeroed card to ensure a # clean test. Ignore the end-of-device error from the zero step. sudo echo -n # avoid counting sudo blocking time in next cmd time sudo dd if=/dev/zero of=$rdev bs=1m || true time sudo dd if=$img of=$rdev bs=1m diskutil unmountDisk $dev || true # Paragon ExtFS might be installed } # Clean up after the above function do_finish() { set -x trash $img cd $dldir/.. make synch } # Main routine set -e case "$verb" in in*) do_init ;; bu*) do_build ;; pr*) do_prepare ;; im*) do_image ;; fi*) do_finish ;; *) usage ;; esac |
︙ | ︙ | |||
13 14 15 16 17 18 19 | echo "fail.rklz not found." exit -1 fi lz4 -dq last.rklz last.rk05 lz4 -dq fail.rklz fail.rk05 | < | < < < < < < < < | | | 13 14 15 16 17 18 19 20 21 22 23 | echo "fail.rklz not found." exit -1 fi lz4 -dq last.rklz last.rk05 lz4 -dq fail.rklz fail.rk05 ../../tools/os8xplode --rk fail.rk05 --rk last.rk05 diff -q last.0 fail.0 diff -q last.1 fail.1 |
> > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash -e d=e8-update test -d src/e8 # fail if this isn't run from @topsrcdir@ mkdir -p $d cd $d rm -rf * # safe: we're under -e, so mkdir & cd succeded curl https://tangentsoft.com/e8/tarball | tar -xf - mv doc/manual.md ../doc/e8-manual.md mv doc/manual-pdf.css ../doc/e8-manual-pdf.css mv doc/graphics/e8-buffer.svg ../doc/graphics mv tools/* ../tools rm ../tools/splitpal # we don't use this rm COPYING.md # duplicate: SIMH-LICENSE.md mv *.{md,pa} ../src/e8 |
> > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/bin/bash BASE="$1" IN="${BASE}.md" OUT="${BASE}.pdf" CSS="${BASE}-pdf.css" if [ ! -r "$IN" ] then echo <<USAGE usage: $0 <basename> ...where basename is something like doc/manual such that a manual.md file exists where the caller says it should be. USAGE fi /Applications/calibre.app/Contents/MacOS/ebook-convert \ "$IN" "$OUT" \ --pdf-mono-family 'Source Code Pro' \ --pdf-sans-family 'Myriad Pro' \ --pdf-serif-family 'Adobe Garamond Pro' \ --page-breaks-before / \ --extra-css "$CSS" && fossil uv add "$OUT" && fossil uv sync |
1 2 | #!/bin/bash ######################################################################## | | > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/bin/bash ######################################################################## # mmake - Runs make -jN where N is 1.5x the number of CPU cores. Use # with GNU or BSD make. # # Copyright © 2017-2020 Warren Young # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to |
︙ | ︙ | |||
25 26 27 28 29 30 31 | # # Except as contained in this notice, the names of the authors above # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## | < | > | | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | # # Except as contained in this notice, the names of the authors above # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## MAKE=$(which gmake bsdmake make 2> /dev/null | head -1) test -z "$MAKE" && echo "Cannot find a 'make' command!" && exit 1 BDIR="$(dirname "$0")" if [ -z "$BDIR" ] ; then BDIR="$(dirname "$(which "$0")")" ; fi $MAKE -j$(($("$BDIR"/corecount) * 15 / 10)) "$@" |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 | #!/usr/bin/env @PYCMD@ # -*- coding: utf-8 -*- ######################################################################## # Compare the files on two OS/8 media images by extracting # their contents and running diff -q. # Based on code from os8-cp # # See USAGE message below for details. # # Copyright © 2018-2020 by Bill Cattey and Warren Young # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS LISTED ABOVE BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT # OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the names of the authors above # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## # Bring in just the basics so we can bring in our local modules import os import sys sys.path.insert (0, os.path.dirname (__file__) + '/../lib') sys.path.insert (0, os.getcwd () + '/lib') # Our local modules from pidp8i import * from simh import * # Other global Python modules import glob import subprocess import string import re #### GLOBALS AND CONSTANTS ############################################# progmsg = True DEBUG = False VERBOSE = False QUIET = False SYSTEM = False FORCE = False # Default RK05 system image to attach if no sys specified. _default_sys_image = "@OS8_TOOLTIME@" _default_sys_path = dirs.os8mo + _default_sys_image _default_att_spec = {"simh_name": "rk", "unit": "0", "image": _default_sys_path} # _default_att_spec = ["rk", "0", _default_sys_path] # Regex for parsing an argument string into a sys device _dev_arg_regex_str = "-(rk|td|dt|rx)(\d?)(s)?" _dev_arg_re = re.compile(_dev_arg_regex_str) # Regex for parsing an action file att string into a sys device. Note # reuse of regex string from above. _dev_actfile_regex_str = _dev_arg_regex_str[1:] # strip - _dev_actfile_re = re.compile (_dev_actfile_regex_str) # Map of SIMH device names to OS/8 device name prefixes. _os8_from_simh_dev = {"rk" : "RK", "td" : "DTA", "dt" : "DTA", "rx" : "RX"} _os8_partitions = {"RK": ["A", "B"]} # OS/8 file name matching regex _os8_file_re = re.compile("(\S+):(\S+)?") # PIP option flags we support and pass thru. PIP has other options we # do not try to map to our program functionality. The key bit is the # _pip_option_info dict. The various transforms below it prevent both # redundant code up here and repeated recomputation below. _pip_option_info = { 'a': 'ASCII', 'b': 'binary', 'i': 'image', 'y': 'yank system head', 'z': 'zero device' } _valid_pip_options = sorted(_pip_option_info.keys()) _arg_to_option = dict(zip( [ '-' + opt for opt in _valid_pip_options ], _valid_pip_options )) _option_to_pip = dict(zip( _valid_pip_options, [ '/' + opt.upper() for opt in _valid_pip_options ] )) # Matches if the string begins with a dollar sign, and has at least # one slash, returning the string between the dollar sign and the # first slash in group 1 and the rest in group 2. # No whitespace in the string. _expandable_re = re.compile ("^\$([^/\s]+)/(\S*)$") #### abort_prog ######################################################## # Print err_string and exit with -1 return status. def abort_prog (err_str): print("Abort: " + err_str) sys.exit(-1) #### parse_attach ###################################################### # Parser for OS/8 attach spec. def parse_attach (action_plan, match, imagename): if match.group(2) == None or match.group(2) == "": abort_prog ("Need unit number for: " + match.group(1) + ".") image_spec = {} image_spec["simh_name"] = match.group(1) image_spec["unit"] = match.group(2) image_spec["image"] = imagename if image_spec["simh_name"] not in _os8_from_simh_dev: print ("Unsupported device: " + image_spec["simh_name"]) return image_spec["os8_name"] = _os8_from_simh_dev[image_spec["simh_name"]] image_spec["devices"] = [] if image_spec["os8_name"] in _os8_partitions: image_spec["part_count"] = len (_os8_partitions[image_spec["os8_name"]]) for partition in _os8_partitions[image_spec["os8_name"]]: image_spec["devices"].append(image_spec["os8_name"] + partition + image_spec["unit"] + ":") else: image_spec["part_count"] = 1 image_spec["devices"].append(image_spec["os8_name"] + image_spec["unit"] + ":") # image_spec = [match.group(1), match.group(2), imagename] if match.group(3) == 's': if action_plan ["sys"] != None: print("Already specified system device. Ignoring sys mount of: " + imagename) else: action_plan["sys"] = image_spec else: action_plan["mount"].append(image_spec) #### path_expand ####################################################### # Originally developed in os8script.py, but useful here too. # # Simple minded variable substitution in a path. # A path beginning with a dollar sign parses the characters between # the dollar sign and the first slash seen becomes a name to # expand with a couple local names: $home and the anchor directories # defined in lib/pidp8i/dirs.py. # We abort if the path expansion fails. def path_expand (path): m = re.match(_expandable_re, path) if m == None: return path var = m.group(1) val = getattr (dirs, var, None) if val != None: return os.path.join(val,m.group(2)) else: abort_prog ("{$" + var + "} is not a valid path expansion in " + path) #### is_directory ###################################################### # # Returns True if the passed path looks like a directory. # # This is used at a level where we may still be unsure whether the given # path refers to something on the OS/8 or the host side, so we first # determine whether the path looks like an OS/8 or host-side path. If # it looks like an OS/8 path, we consider it a "directory" if it names a # device name, lacking a file name part after it. Otherwise, we use the # local OS's "is a directory" path check. def is_directory(path): if DEBUG: "is_directory (" + path + ")" m = re.match(_os8_file_re, path) if m != None: if DEBUG: print("OS/8 Match: DEV: " + m.group(1) + ", File: " + str(m.group(2))) if m.group(2) == None or m.group(2) == "": return True # Just a device so yes it's a directory. else: return False if has_os8_wildcards(path): if DEBUG: print("Has wildcards.") return False return os.path.isdir(path) #### file_list_from_expect ############################################# # Given a block of text output by the Python Expect module used by class # simh, parse it with the assumption that it contains OS/8 DIR output. def file_list_from_expect(before): file_list = [] lines = before.split("\r") for line in lines[1:]: # First line is our command. Skip it. line = line.strip() if line == "": continue m = re.match("(\S+)\s*\.(\S+)", line) if m == None: continue # if DEBUG: print("file_list_from_expect: group 1: " + m.group(1) + ", group 2: " + m.group(2)) fname = m.group(1) + "." + m.group(2) file_list.append(fname) return file_list #### parse_args ######################################################## # # The source and destination file specifications are interpreted as in # the USAGE message below. (Look for "colon".) TERSE_USAGE = 'usage: ' + os.path.basename (__file__) + \ " [-dhvqyf] [-<dev><unit>[s] image1] [-<dev><unit>[s] image2] [[-y]\n" + \ """ <dev> is one of rk, td, dt, rx, corresponding to SIMH PDP-8 devices <unit> must be a valid unit number for the device in both SIMH and the booted OS/8 system. A unit number is required. Following the unit with an "s" names the system device to boot. The system image file must exist, and contain a working boot image. Only one designated system device is allowed. Example: """ + \ os.path.basename (__file__) + " -rk0s os8v3d-patched.rk05 -dt0 master.tu56 " USAGE = TERSE_USAGE + """ To see more detailed documentation specify -v -h """ VERBOSE_USAGE = TERSE_USAGE + """ This program compares two OS/8 media image files by attaching them to the SIMH PDP-8 simulater, and booting OS/8. The s suffix on one image spec. selects that image as the boot device. If no s suffix is present, the default v3d-patched.rk05 image is booted. A directory listing for each image is obtained, and the files are extracted into a POSIX directory. If the image has multiple partitions, each partition is extracted into a subdirectory. FIXME: Some sensible approach to trying to compare a .tu56 and a .rk05 image. Normally an existing extraction will not be overwritten. Give -f to force overwrite of existing extraction. The -y option indicates the system area should also be extracted into a file named SYSTEM.SY. Give -d to run in debug mode. Give -h -v to print this message. Give -v to enable verbose status reporting. """ ##### parse_args ################################################################ # Determine which images to mount and where. # Set any bit-wise arguments seen. def parse_args (): global DEBUG global VERBOSE global QUIET global SYSTEM global FORCE action_plan = {} action_plan["sys"] = None action_plan["mount"] = [] action_plan["copy"] = [] idx = 1 numargs = len(sys.argv) filespec_seen = 0 mode_opt = "i" # start of with default of binary. first_mode = mode_opt source = "" destination = "" # Keep file_list and mode_list in sync. file_and_mode_list = [] while idx < numargs: image_idx = 1 arg = sys.argv[idx] # First the simple bit set options if arg == "-d": DEBUG = True elif arg == "-h": if VERBOSE: print(VERBOSE_USAGE) else: print(USAGE) sys.exit(0) elif arg == "-q": QUIET = True elif arg == "-v": VERBOSE = 1 elif arg == "-f": FORCE = True elif arg == "-y": SYSTEM = True # Not a simple bit set option. else: # Parser for OS/8 attach spec. m = re.match(_dev_arg_re, arg) if m != None: if idx + 1 == numargs: # Need filename, but no args left. abort_prog ("No image file name.") idx +=1 parse_attach (action_plan, m, sys.argv[idx]) idx +=1 # Bottom of the while loop. Increment. return action_plan #### find_or_mkdir ##################################################### # If the dirname doesn't exist, make it and return False # If it does, return True def find_or_mkdir (dirname): if os.path.isdir (dirname): return True if VERBOSE or DEBUG: print("Creating directory " + dirname) # Make the directory here. os.mkdir (dirname) return False #### extract ########################################################## # Extract all files from given device to the given directory # using SIMH object, s. def extract (s, device, directory): pip_option = "/I" if VERBOSE or DEBUG: print("Extracting " + device + " into " + directory) # This will be a "from" type of copy with a source of *.*. # Use DIRECT to create list of files. # We attach destination to ptp. We've already done POSIX globing. # Use OS/8 Direct to enumerate our input files. if DEBUG: print("Calling OS/8 DIRECT on : " + device) s.os8_cmd ("DIR " + device + "/F=1", "\d+\s+FREE BLOCKS", debug=DEBUG) # Now harvest direct output. One file per line. Ignore blank lines. # Maybe parse the FREE BLOCKS Output. # Done when we see a dot. files = file_list_from_expect(s._child.before.decode()) # Confirm return to monitor after call to DIR command. s.os8_cfm_monitor ("os8_cmp=: extract: Return to monitor after DIR failed.") for filename in files: if VERBOSE or DEBUG: print("Calling os8_pip_from: copy from: " + \ "{" + device + "}{" + filename + "}" + \ " to: " + directory + ", mode: " + pip_option) s.os8_pip_from(device + filename, directory, "/I", debug=DEBUG) # System head extract goes here. #### compare ########################################################### # Call diff -q on the leftdir and rightdir def compare (left, right): compare_args = ["diff", "-q", left, right] compare_str = "diff -q " + left + " " + right if VERBOSE or DEBUG: print ("Calling compare: " + str(compare_args)) subprocess.call (compare_args, cwd = ".") #### main ############################################################## def main (): action_plan = parse_args() if action_plan == None: abort_prog ("No action plan was parsed.") if DEBUG: print(str(action_plan)) # Create the SIMH child instance and tell it where to send log output try: s = simh (dirs.build, True) except (RuntimeError) as e: print("Could not start simulator: " + e.message + '!') exit (1) # s.set_logfile (os.fdopen (sys.stdout.fileno (), 'wb', 0)) s.set_logfile (open ("logfile.txt", 'wb')) if VERBOSE: s.verbose = True # Perform sys attach att_spec = action_plan["sys"] if att_spec == None: att_spec = _default_att_spec simh_boot_dev = att_spec["simh_name"] + att_spec["unit"] # Compose simh dev from name and unit. imagename = att_spec["image"] if not os.path.exists (imagename): abort_prog ("Requested boot image file: " + imagename + " not found.") if VERBOSE or DEBUG: print("Attaching " + simh_boot_dev + " to " + imagename) s.simh_cmd ("att " + simh_boot_dev + " " + imagename, debug=DEBUG) # Attach other mounts # Create the directories that will catch the extraction. # If the directory already exists abort. for att_spec in action_plan["mount"]: simh_dev = att_spec["simh_name"] + att_spec["unit"] # Compose simh dev from name and unit. imagename = att_spec["image"] if os.path.exists (imagename) == False: abort_prog ("Required image " + imagename + " not found.") if VERBOSE or DEBUG: print("Attaching " + simh_dev + " to " + imagename) s.simh_cmd ("att " + simh_dev + " " + imagename, debug=DEBUG) # From here on in, if we only had one mount spec, # Compare against the system device, by adding it as a "mount" in action plan. if len(action_plan["mount"]) < 2: action_plan["mount"].insert(0, action_plan["sys"]) # Boot. if VERBOSE or DEBUG: print("Booting " + simh_boot_dev + "...") # Confirm successful boot into OS/8. Note we call simh_cmd with _os8_replies! reply = s.simh_cmd ("boot " + simh_boot_dev, s._os8_replies_rex, debug=DEBUG) s.os8_test_result (reply, "Monitor Prompt", "os8-cp") # Perform file extraction from all partitions of all attached images. for att_spec in action_plan["mount"]: for i in range(att_spec["part_count"]): os8dev = att_spec["devices"][i] suffix = os8dev[:-1] att_dir = os.path.basename(att_spec["image"]) + "_" + suffix found = find_or_mkdir (att_dir) if found: print ("Existing extraction found: " + att_dir) if FORCE: if VERBOSE: print ("Overwrite forced.") extract (s, os8dev, att_dir) else: print ("Existing dir not found.") extract (s, os8dev, att_dir) # Detach all mounts and then sys. s.esc_to_simh() for att_spec in action_plan["mount"]: simh_dev = att_spec["simh_name"] + att_spec["unit"] # Compose simh dev from name and unit. if VERBOSE or DEBUG: print("Detaching " + simh_dev) s.simh_cmd ("det " + simh_dev, debug=DEBUG) if VERBOSE or DEBUG: print("Detaching " + simh_boot_dev) s.simh_cmd ("det " + simh_boot_dev, debug=DEBUG) # Perform compare # Currently hard coded to work only first 2 Attached filesystems. left_spec = action_plan["mount"][0] right_spec = action_plan["mount"][1] # For now, we can't cope with comparing different devices # To fix this: # Confirm that the two devices have comparable partition names/counts. # Decide on a mapping between partitions of different counts. if left_spec["part_count"] != right_spec["part_count"]: abort_prog ("Can only compare devices with same number of partitions.\n\t" \ + left_dev + " with " + str (left_partcount) + " != " \ + right_dev + " with " + str (right_partcount)) # From here, be guided by left partition count. for i in range(left_spec["part_count"]): left_suffix = left_spec["devices"][i][:-1] left_dir = os.path.basename(left_spec["image"]) + "_" + left_suffix right_suffix = right_spec["devices"][i][:-1] right_dir = os.path.basename(right_spec["image"]) + "_" + right_suffix if VERBOSE: print ("Compare: " + left_dir + " and " + right_dir) compare (left_dir, right_dir) # And shut down the simulator. # Shutting down the simulator exits the program. # So we do it last. if VERBOSE or DEBUG: print("Quitting simh.") s._child.sendline("quit") if __name__ == "__main__": main() |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 | #!/usr/bin/env @PYCMD@ # -*- coding: utf-8 -*- ######################################################################## # Perform a test run of a program under OS/8 # Uses os8pkg as a foundation. # # See USAGE message below for details. # # Copyright © 2020 by Bill Cattey and Warren Young # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS LISTED ABOVE BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT # OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the names of the authors above # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## # Bring in just the basics so we can bring in our local modules import os import sys sys.path.insert (0, os.path.dirname (__file__) + '/../lib') sys.path.insert (0, os.getcwd () + '/lib') # Our local modules from pidp8i import * from simh import * from os8script import * # Other global Python modules import glob import subprocess import string import re import argparse import yaml from time import sleep #### GLOBALS AND CONSTANTS ############################################# progmsg = True DEBUG = False VERBOSE = False QUIET = False # Default RK05 system image to attach if no sys specified. _default_sys_image = "@OS8_TOOLTIME@" _default_sys_path = dirs.os8mo + _default_sys_image _default_att_spec = ["rk", "0", _default_sys_path] _default_tests_dir = os.path.join (dirs.src, "scripts/os8-progtest") _target_dir = dirs.os8mo # Some tricks to getting correct operation: # 0. Quoting matters! Use these: # Surround state names with single quotes. # Surround send and reply strings with double quotes. # 1. Command lines end with a carriage return '\r' or an Escape. # 2. Control characters have funky values: # Escape: \e # ^C: \x03 # 3. TTY output you see from running the simulator gets # upcased, so make all test strings upper case. # 4. When in doubt of what formatting happens use '\s+` # 5. REMEMBER to escape characters that normally have regex meaining: # . + * $ ( ) \ # prefix each one with TWO backslashes! '?' becomes '\\?' # 6. Explicitly call out end of string '$' when you can. # 7. The monitor prompt match is "\n\\.$" # 8. The command decoder prompt match is "\n\\*$" #### abort_prog ######################################################## # Print err_string and exit with -1 return status. def abort_prog (err_str): print("Abort: " + err_str) sys.exit(-1) #### dest_expand ######################################################## # Return a full path based either on the --destdir option or # the default _pkg_obj_dir def dest_expand (args, fname, default): if args.destdir: return os.path.join(args.destdir, fname) else: return os.path.join(default, fname) #### src_expand ######################################################### # Return a full path based either on the --srcdir option or # the default test .yml directory def src_expand (args, fname, default): if args.destdir: return os.path.join(args.srcdir, fname) else: return os.path.join(default, fname) #### start_os8 ######################################################### # Create and start up an os8 script runner # Find the default boot image and boot it. # Return the running os8 object handle. # If we can't start os8, it's a fatal error. Quit here! def start_os8(targ_path, args): try: s = simh (dirs.build, True) except (RuntimeError) as e: print("Could not start simulator: " + e.message + '!') sys.exit (1) if VERBOSE: s.verbose = True s.set_logfile (os.fdopen (sys.stdout.fileno (), 'wb', 0)) os8 = os8script (s, [], [], verbose=VERBOSE, debug=args.debug>0) # We mount our destination in scratch mode. This lets us do many # tests in parallel all independent, none conflicting. os8.mount_command ("rk0 " + targ_path + " required scratch", None) os8.boot_command ("rk0", None) return os8 #### clean_quit ######################################################## # Cleanup any state in os8 and any scratch files in POSIX and exit # with provided status. def clean_quit (os8, status, args): # After all scripts are done, we remove any scratch files, # detach any mounted devices, and shut down simh gracefully. # Handle dry run case: if os8 == None: sys.exit (status) os8.exit_command(str(status), "") #### parse_todos ####################################################### # Parse a series of comma separated tests. def parse_todos (line, args): if line == None: print ("No tests specified. Doing All") return ["all"] parts = line.split(",") return parts #### main ############################################################## def main (): parser = argparse.ArgumentParser( description = """ Test a program under PDP-8 OS/8.""", usage = "%(prog)s [options]") parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true") parser.add_argument("-d", dest="debug", metavar="DEBUG", type=int, help="set debug level", default=0) parser.add_argument("--destdir", help="Destination directory for output files") parser.add_argument("--srcdir", help="Source directory for test .yml files") parser.add_argument ("--target", help="target image file", default="v3d.rk05") parser.add_argument ("--dry-run", "-n", action="store_true", help="Dry Run. Print output. Generate no files.") parser.add_argument ("--exitfirst", "-x", action="store_true", help="Exit on first failure.", default=False) parser.add_argument ('programs', nargs=argparse.REMAINDER, metavar="programs to test, and optional subset of tests") args = parser.parse_args() targ_path = dest_expand (args, args.target, _target_dir) if args.dry_run: os8 = None print ("Dry run: would boot: " + targ_path) else: # Start OS/8, confirm we're booted and in OS/8 context. os8 = start_os8(targ_path, args) if not os8.booted: print("Cannot run " + _test_name + ". OS/8 has not been booted.") clean_quit (os8, -1, args) if os8.simh._context == "simh": os8.restart_command(os8_comm, script_file) if args.programs == None or args.programs == []: print ("Nothing to test") clean_quit (os8, 0, args) do_all = True for prog_spec in args.programs: m = re.match("(\S+):(\S+)", prog_spec) if m == None: program = prog_spec else: program = m.group(1) do_all = False test_list = parse_todos (m.group(2), args) if args.debug > 0: print ("Test list: " + str(test_list)) try: test_path = src_expand(args, program + ".yml", _default_tests_dir) if args.debug > 0: print("Testing: " + program + " with script: " + test_path) testfile = open(test_path) except IOError: print ("Tesfile " + test_path + " not found.") continue tests = yaml.safe_load(testfile) if do_all: test_list = [] for key in tests.keys(): # Things in the test file that are not tests if key in ["config"]: continue test_list.append(key) for test in test_list: if test not in tests: print (program + " test " + test + " not found.") continue states = tests[test] if args.debug >14 : print ("All states:") print (str (states)) # Walk the state machine # Recommended: Run the state machine in dry_run mode to make sure it terminates. next_state = "start" while next_state not in ("success", "fail"): if next_state not in states: print ("State machine for program " + tests["program"] + " has no state: " + next_state) clean_quit(os8, -1, args) current = states[next_state] send_str = current[0] replies = [] for item in current[1]: replies.append (item[0]) if args.debug >9: print ("Replies: " + str(replies)) if args.dry_run: next_state = current[1][0][1] else: if args.debug > 0: print ("Sent: " + send_str) if "config" in tests and "slow" in tests["config"]: for char in send_str: for i in range(0, len(send_str)): sleep (.05) os8.simh._child.send (send_str[i]) else: os8.simh.os8_send_str(send_str) if args.debug == 88: replies = [".+"] try: # os8.simh._child.expect(re.compile(reply_str.encode()), timeout=5) reply = os8.simh._child.expect(replies, timeout=5) if args.debug > 4: print("\tgot: {" + os8.simh._child.after.decode() + "}") except pexpect.exceptions.TIMEOUT: print (program + ": Test Failed.") print ("\tExpecting: {" + str(replies) + "}") print("\tGot: {" + os8.simh._child.before.decode() + "}") next_state = "fail" continue next_state = current[1][reply][1] if args.debug > 0: print ("Next state: " + next_state) if next_state == "success": print (program + ":" + test + " Test Passes.") else: print (program + ":" + test + " Test Fails.") if args.exitfirst: clean_quit(os8, -1, args) # sleep(1) # Give OS/8 a second to catch up to testing. clean_quit(os8, 0, args) if __name__ == "__main__": main() |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 | #!/usr/bin/perl # # Copyright © 2015-2020 by Vincent Slyngstad and William Cattey # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS LISTED ABOVE BE LIABLE # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF # CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the names of the authors above # shall not be used in advertising or otherwise to promote the sale, use # or other dealings in this Software without prior written authorization # from those authors. # # Every pair of 8 bit bytes forms a 12 bit word. # There are 0400 words in each OS/8 block. $bsize = 0400 * 2; # # The original date algorithm was 3 bits, added to 1970. # Later, two more bits were added, so years go thru 1999. # Dates in the future are interpreted as dates in the # previous 8 years. # First, get the right epoch. ($_, $_, $_, $dy, $mo, $i) = localtime(time); #$i = ($i + 1900) & 037; $i = ($i - 70) & 037; $cyear = $i & 07; $epoch = 1970 + ($i&030); $i += 1970; @month = ("0", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", "13", "14", "15"); print "y2k: pretending today is $dy-$month[$mo+1]-$i\n"; # # Convert OS/8 date word to time_t. # 05370 => 1010 11111 000 => 10/31/70. # Should we try to also set the time of day? # Would it be more efficient to know the # seconds in a (short) year and the number # of seconds in each month since the epoch? sub cvtdate { local($os8) = @_; local($mo, $dy, $yr); local($tm, $td, $ty, $days); local($t) = time; $os8 = 0410 if $os8 == 0; # Aim for Jan 1, $epoch ($mo, $dy, $yr) = (($os8>>8)-1, ($os8>>3)&037, $os8&7); $yr += $epoch - 1900; # Some OS/8 dates are nonsense. Make a close guess. if ($mo < 0) { $mo += 12; $yr -= 1; } elsif ($mo > 11) { $mo -= 12; $yr += 1; } $dy = 1 unless $dy; while (1) { # Convert the estimate, $t, to local time. ($_, $_, $_, $td, $tm, $ty) = localtime($t); # Estimate the difference in days. $days = ($ty-$yr)*365 + ($tm-$mo)*30 + $td-$dy; # Return if on the right day. return $t unless $days; # Kludge prevents cycling on the missing leap day # Dates like 2/29/93, 2/30/93, 2/31/93, etc. # Also dates like 4/31/xx, etc. return $t + 24*60*60 if $days == -1; return $t + 48*60*60 if $days == -2; return $t + 72*60*60 if $days == -3; # Adjust $t. $t -= $days * 22*60*60; } } # # Convert sixbit to 7 bit ASCII. sub sixbit { local($word) = @_; local($byte1, $byte2) = ($word >> 6, $word & 077); $byte1 += 0140 if $byte1 < 040; $byte2 += 0140 if $byte2 < 040; return ($byte1, $byte2); } sub ofile { local($f, $first, $last, $total, $ctime) = @_; local($mask, $eof, $chr1, $chr2, $chr3); local(@buf); open(OUTPUT, ">$f") || die "$f: $!"; binmode(OUTPUT); $mask = 0377; $chr1 = "binary"; $mask = 0177 if $f =~ /[.]BI$/i; # BATCH Input $mask = 0177 if $f =~ /[.]FC$/i; # FOCAL Source $mask = 0177 if $f =~ /[.]FT$/i; # FORTRAN Source $mask = 0177 if $f =~ /[.]HL$/i; # HELP $mask = 0177 if $f =~ /[.]LS$/i; # Listing $mask = 0177 if $f =~ /[.]MA$/i; # MACRO Source $mask = 0177 if $f =~ /[.]PA$/i; # PAL Source $mask = 0177 if $f =~ /[.]PS$/i; # Pascal Source? $mask = 0177 if $f =~ /[.]RA$/i; # RALF Source $mask = 0177 if $f =~ /[.]SB$/i; # SABR Source $mask = 0177 if $f =~ /[.]TE$/i; # TECO File $mask = 0177 if $f =~ /[.]TX$/i; # Text File $mask = 0177 if $f =~ /[.]WU$/i; # Write Up $chr1 = "text" if $mask != 0377; printf XML "<file name='$f' start=0%o end=0%o mode=$chr1>", $first, $last; seek(INPUT, $bsize*($fsbase+$first), 0) || die "seek($dsk): $!"; $eof = 0; for ($i = $first; $i <= $last; $i++) { # Read a block last if $first >= $total || $last >= $total; # Don't read past EOF. read(INPUT, $buf, $bsize) || die "read($dsk $f), $i, $total, $last: $!"; @buf = unpack("S512", $buf); # Repack the bits amd write the block. while (@buf && !$eof) { $chr1 = shift @buf; $chr2 = shift @buf; $chr3 = (($chr2 >> 8) & 017) | (($chr1 >> 4) & 0360); if ((($chr1 & $mask) == 032) && ($mask == 0177)) { $eof = 1; next; } print OUTPUT pack("C", $chr1 & $mask); if ((($chr2 & $mask) == 032) && ($mask == 0177)) { $eof = 1; next; } print OUTPUT pack("C", $chr2 & $mask); if ((($chr3 & $mask) == 032) && ($mask == 0177)) { $eof = 1; next; } print OUTPUT pack("C", $chr3 & $mask); } # Mark the block used die "Block $i was used for both $blocks[$i] and $f\n" if defined $blocks[$i]; $blocks[$i] = $f; } close(OUTPUT) || die "close($f): $!"; # Set the creation time on the output file. utime($ctime, $ctime, $f) || die "utime($f): $!"; # Now update the XML print XML "</file>\n"; } # # An OS/8 filesystem contains a boot block, a directory, # an optional system head, and a file data area. sub os8fs { local($fs, $fsbase, $fslen, $total) = @_; # Note the start of a new file system. printf XML "<os8fs name='$fs' base=0%o size=0%o>\n", $fsbase, $fslen; @blocks = (); # Keep things tidier by creating a directory to contain our files. mkdir($fs) unless -d $fs; die "mkdir($fs): $!" unless -d $fs; $fs .= "/"; # Walk the directory, in blocks 1-6. Note whether it # is a system # device image, or not. print XML "<directory>\n"; $sys = $cos = 1; # Have not ruled out a system device. for ($link = 1; $link; ) { # Read a directory segment seek(INPUT, $bsize*($fsbase+$link), 0) || die "seek($dsk): $!"; read(INPUT, $buf, $bsize) || die "read($dsk): $!"; @blk = unpack("S512", $buf); $nent = shift @blk; $sblk = shift @blk; # If it has files in the system area, it's not a system device. $sys = 0 if $sblk < 070; # Not a system image $cos = 0 if $sblk < 0140; # Not a COS image $nent = 010000 - $nent; $link = shift @blk; $tent = shift @blk; $aiw = shift @blk; $aiw = 010000 - $aiw unless $aiw == 0; for (; $nent; $nent--) { # Examine a directory entry. $chr1 = shift @blk; if ($chr1 != 0) { $chr3 = shift @blk; $chr5 = shift @blk; $ext1 = shift @blk; if ($aiw) { # BUGBUG: If more than one additional word, which is date? for ($i = 0; $i < $aiw; $i++) { $datew = shift @blk; } } else { $datew = 0; } $flen = shift @blk; $flen = 010000 - $flen if $flen; # Create the file. ($chr1, $chr2) = sixbit($chr1); ($chr3, $chr4) = sixbit($chr3); ($chr5, $chr6) = sixbit($chr5); ($ext1, $ext2) = sixbit($ext1); $fname = pack("C6", $chr1, $chr2, $chr3, $chr4, $chr5, $chr6); $fname =~ s/[\@\`]*$//; $ext = pack("C2", $ext1, $ext2); $ext =~ s/[\@\`]*$//; $fname =~ s/ *$//g; $ext =~ s/ *$//g; if ($flen == 0) { # Tentative file $ext .= ".tent" if $flen == 0; $i = shift @blk; die "$dsk: Tentative file not followed by empty space!" if $i; $flen = 010000 - shift @blk; $nent--; } $fname =~ s/$/./ unless $ext eq ""; } else { $flen = shift @blk; $flen = 010000 - $flen if $flen; $fname = "."; $ext = "$sblk"; } &ofile("$fs$fname$ext", $sblk, $sblk+$flen-1, $total, &cvtdate($datew)); $sblk += $flen; } } print XML "</directory>\n"; # N.B. Avoid the use of two character extensions # for non-directory file names, as they may clash # with actual file names. # Emit the boot loader. &ofile("$fs.boot", 0, 0, $ctime); # Emit the directory. &ofile("$fs.dir", 1, 6+$cos, $ctime); # We are done unless it is the image of a system device. return unless $sys; # BUGBUG: It's a system device, either COS or OS/8. if ($cos) { # Emit the Keyboard Monitor, blocks 010-013. &ofile("$fs.kmon", 010, 013, $ctime); # Emit the Editor Overlay, blocks 010-013. &ofile("$fs.eovr", 014, 017, $ctime); # Emit the Editor, blocks 010-013. &ofile("$fs.edit", 020, 033, $ctime); # Emit the Run Time System Loader, blocks 010-013. &ofile("$fs.rtsl", 034, 037, $ctime); # Emit the Edit Buffer, blocks 010-013. &ofile("$fs.ebuf", 040, 057, $ctime); # Emit the Run Time System, blocks 010-013. &ofile("$fs.rts", 060, 067, $ctime); # Emit the Compiler Overlays, blocks 010-013. &ofile("$fs.covr", 070, 077, $ctime); # Emit the Binary Scratch area, blocks 010-013. &ofile("$fs.bscr", 0100, 0137, $ctime); } else { # Emit the Keyboard Monitor, blocks 07-012. &ofile("$fs.kmon", 007, 012, $ctime); # Emit the User Service Routine, blocks 013-015. &ofile("$fs.usr", 013, 015, $ctime); # Emit the Device Handlers, blocks 016-025. &ofile("$fs.dhand", 016, 025, $ctime); # Emit the Enter Processor, block 026. &ofile("$fs.ent", 026, 026, $ctime); # Emit the Scratch Blocks, blocks 027-050. &ofile("$fs.sblks", 027, 050, $ctime); # Emit the Command Decoder, blocks 051-053. &ofile("$fs.cdec", 051, 053, $ctime); # Emit the Save and Date Overlays, blocks 054-055. &ofile("$fs.sdate", 054, 055, $ctime); # Emit the Monitor Error Routine, block 056. &ofile("$fs.merr", 056, 056, $ctime); # Emit the USE CHAIN Processor, block 057. &ofile("$fs.chain", 057, 057, $ctime); # Emit the System ODT Routine, blocks 060-063. &ofile("$fs.sodt", 060, 063, $ctime); # Emit the reserved block, blocks 064. &ofile("$fs.rsvd", 064, 064, $ctime); # Emit the CCL Reminiscences, block 065. &ofile("$fs.cclr", 065, 065, $ctime); # Emit the 12K TD8E code, block 066. &ofile("$fs.td8e", 066, 066, $ctime); # Emit the CCL Overlay, block 067. &ofile("$fs.cclo", 067, 067, $ctime); } # Check all the blocks were accounted for. for ($i = 0; $i < $fslen; $i++) { warn "$dsk: Block $i not accounted for!\n" unless defined $blocks[$i]; } printf XML "</os8fs>\n"; } # # Most large devices have more than one file-system. How # can we detect this and infer the correct size of each # file-system? Inspection of the PIP DEVLEN table suggests # That all the devices are chopped up into equal size segments. # # For example, the disk image I'm debugging with is 014540 # blocks long, and contains two file systems, each 06260 # blocks long. # # Top level. Iterate over the arguments, which are supposed to be # disk images. $type = "dsk"; foreach $f (@ARGV) { if ($f eq "--rk") { $type = "rk05"; next; } open(INPUT, $f) || die "$f: $!"; binmode(INPUT); $dsk = $f; $f =~ s/.${type}$//; # We found an image, let's start the XML. open(XML, ">$f.xml") || die "$f.xml: $!"; # Verify an integral number of blocks. ($_, $_, $_, $_, $_, $_, $_, $b, $_, $_, $ctime) = stat(INPUT); die "$dsk: Not an integral number of blocks!\n" if $b % $bsize; $blocks = $b / $bsize; @b = (); printf XML "<image name='$dsk' size=0%o>\n", $blocks; # Later this should be table driven, and do more conversions. if ($type eq "rk05") { $fslen = 3248; } else { $fslen = $blocks; } $total = $blocks; $part = 0; for ($fsbase = 0; $fsbase < $blocks; $fsbase += $fslen) { &os8fs("$f.$part", $fsbase, $fslen, $total); $total -= $fslen; $part++; } $type = "dsk"; # Reset to dsk device default. printf XML "</image>\n", $blocks; } |
1 2 3 | #!/bin/bash # # restyle - A wrapper around indent(1) to produce the code style | | | 1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash # # restyle - A wrapper around indent(1) to produce the code style # documented in the CONTRIBUTING.md file. # # Copyright © 2017 Warren Young # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, |
︙ | ︙ |
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | #!/bin/bash ######################################################################## # simh-bisect - Given a partially-applied simh-update setup, pass this # script's command line args to "git bisect" then merge that new # version into our PiDP-8/I variant to try the combination. # # Copyright © 2021 Warren Young # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS LISTED ABOVE BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT # OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the names of the authors above # shall not be used in advertising or otherwise to promote the sale, # use or other dealings in this Software without prior written # authorization from those authors. ######################################################################## SRCDIR="@srcdir@" SRCSUBDIR="$SRCDIR/src/SIMH" WORKDIR="@builddir@/simh-update-temp" OUR_SIMH_DIR="$WORKDIR/simh/ours" CURR_SIMH_DIR="$WORKDIR/simh/curr" LOGFILE="$WORKDIR/output.log" PATCHFILE="$WORKDIR/pidp8i.patch" OLD_SGCID=$(grep ^SGCID "@srcdir@"/Makefile.in | cut -f2 -d=) # Ensure we have a working directory if [ ! -d "$CURR_SIMH_DIR" ] then cat <<ERROR Need $CURR_SIMH_DIR set up. Try running simh-update up to the point where it tries building things, then retry with this script. ERROR exit 1 fi # From here on, send all output to the log file. # Code based on http://stackoverflow.com/a/20564208/142454 exec 1<&- exec 2<&- exec 1<>"$LOGFILE" exec 2>&1 function say() { echo "$@" >> /dev/tty } # Bail on errors so we don't have to test everything. Ideally, nothing # from here on will fail. If it does, the log file will explain it. # Code based on http://stackoverflow.com/a/185900/142454 function error() { lineno="$1" message="$2" code="${3:-1}" if [ -n "$message" ] ; then message=": $message" ; fi read -r -d '%' errmsg <<ERROR Error on or near line $lineno, code ${code}$message! (See log file for more info: $LOGFILE) % ERROR say say "$errmsg" say exit $code } trap 'error ${LINENO}' ERR # Deal with uncommitted changes in $SRCSUBDIR cd "$SRCSUBDIR/.." # we need the SIMH/ prefix to do this test properly! say "Tossing uncommitted changes in $SRCSUBDIR..." fossil revert . cd "@builddir@" # Throw away changes made by prior run in "ours" worktree pushd "$OUR_SIMH_DIR" say "Resetting 'ours' dir..." git checkout -f "$OLD_SGCID" popd # Pass args to "git bisect" to retreive next version or whatever else # the user wants done. pushd "$CURR_SIMH_DIR" if git bisect log 2>&1 | grep -q 'not bisecting' ; then git bisect start ; fi say "Bisecting..." git bisect "$@" popd # Rename upstream Git paths to match our *.in files so that our produced # patches are made against those higher-level versions. If we didn't do # this, we'd have to manually resubstitute variables for absolute paths. # # Filter out Makefile.in because we don't want to try and patch the # upstream plain Makefile to work with autosetup. It complicates the # resulting patch file to no purpose. say Renaming upstream files to match our \*.in variants... find "$SRCSUBDIR" -name \*.in -print | grep -v Makefile.in | while read f do inf="${f#$SRCSUBDIR/}" # make path fully relative genf="${inf%.in}" # remove .in from the end test -f "$OUR_SIMH_DIR/$genf" && mv "$OUR_SIMH_DIR/$genf" "$OUR_SIMH_DIR/$inf" test -f "$CURR_SIMH_DIR/$genf" && mv "$CURR_SIMH_DIR/$genf" "$CURR_SIMH_DIR/$inf" done # Produce a patch file for modifying the upstream $OLD_SGCID version to # merge in our local changes. # # For some reason, diff(1) returns an error when we do this, at least on # OS X. Perhaps it is not happy about the fact that the file set in # each tree is different? Regardless of reason, we must check for a # non-empty patch file to determine whether an actual error occurred. say Producing clean patch file from upstream ${OLD_SGCID:0:8} version say to our local PiDP-8/I version... if ! diff -ru "$OUR_SIMH_DIR" "$SRCSUBDIR" | grep -v '^Only in' > "$PATCHFILE" && [ ! -s "$PATCHFILE" ] then error $LINENO "patch generation failed" 2 fi # For each file in src/SIMH that is also present in the current upstream # version of SIMH, overwrite our version. find "$SRCSUBDIR" -type f -print | while read f do base="${f#$SRCSUBDIR}" upstream="$CURR_SIMH_DIR/$base" test -e "$upstream" && cp "$upstream" "$f" done # Now try to apply the patch we made above to the upstream files. patch -p0 < "$PATCHFILE" # No error, so save the new tip-of-master Git commit ID and rebuild. # Force at least SCP to rebuild, else new values won't be added. # # The reconfig step is sidesteps a dependency bug in the current # Makefile.in which allows make(1) to rebuild scp.o before the automatic # reconfig occurs, so the old timestamp gets baked into the simulator. # It'd be better to fix the bug, but I failed to diagnose it. exec 1<&- exec 1<>/dev/tty echo "Patch appears to have applied cleanly. Attempting a rebuild..." make reconfig touch src/SIMH/scp.c exec tools/mmake bin/pidp8i-sim |
︙ | ︙ | |||
204 205 206 207 208 209 210 211 212 213 214 215 216 217 | then mv "$OUR_SIMH_DIR/$genf" "$OUR_SIMH_DIR/$inf" mv "$CURR_SIMH_DIR/$genf" "$CURR_SIMH_DIR/$inf" fi # else, it's a *.in file specific to our code base, not a # parameterized version of an upstream file done # Produce a patch file for modifying the upstream $OLD_SGCID version to # merge in our local changes. # # For some reason, diff(1) returns an error when we do this, at least on # OS X. Perhaps it is not happy about the fact that the file set in # each tree is different? Regardless of reason, we must check for a | > > > > > > | 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 | then mv "$OUR_SIMH_DIR/$genf" "$OUR_SIMH_DIR/$inf" mv "$CURR_SIMH_DIR/$genf" "$CURR_SIMH_DIR/$inf" fi # else, it's a *.in file specific to our code base, not a # parameterized version of an upstream file done # Remove untracked files: we don't want them appearing in the diff. fossil extra | grep src/SIMH | while read doomed do rm -f "$doomed" done # Produce a patch file for modifying the upstream $OLD_SGCID version to # merge in our local changes. # # For some reason, diff(1) returns an error when we do this, at least on # OS X. Perhaps it is not happy about the fact that the file set in # each tree is different? Regardless of reason, we must check for a |
︙ | ︙ |
︙ | ︙ | |||
169 170 171 172 173 174 175 | no warnings 'uninitialized'; # some captures are optional s{ (att\ |attach\ ) # SIMH command (-r\ )? # optional flag ([a-z0-9]+\ ) # SIMH device name ([\w./-]+) # path characters we use /([\w.-]+) # attached file's parent dir | | > > > > | | > > | | 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | no warnings 'uninitialized'; # some captures are optional s{ (att\ |attach\ ) # SIMH command (-r\ )? # optional flag ([a-z0-9]+\ ) # SIMH device name ([\w./-]+) # path characters we use /([\w.-]+) # attached file's parent dir /([\w.-]*?) # attached file's basename ((-temp-)([\w./-]+) # optional temp component (\.[\w./-]+) # stuff after temp component |(([\w./-]+)-(\d+) # optional pt_temp component (\.pt_temp)))? # (\s) # pattern end anchor }{$1$2$3.../$5/$6$8$10$12$14$15}x; s{ (attached\ to\ ) # response from SIMH to att cmd ([\w./-]+) # path characters we use /([\w.-]+) # attached file's parent dir /([\w.-]*?) # attached file's basename ((-temp-)([\w./-]+) # optional temp component (\.[\w./-]+))? ([\s,]) # pattern end anchor }{$1.../$3/$4$6$8$9}x; # Add cleaned line to ofile print $of $_; } close $if; close $of; |
︙ | ︙ |
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |